feat: time-based credits, JUGADORES leaderboard, fix footer visibility

- Credits system: 1€/day, 5€/week, 15€/month time-based access via Redsys
  - credits table with token, tier, expires_at, status lifecycle
  - /api/credito/iniciar, /api/credito/estado, /api/pregunta/enviar endpoints
  - Polling-based token delivery to browser after Redsys URLOK redirect
  - localStorage token storage with expiry check on load
- JUGADORES leaderboard: top 7 players by questions used, polled every 60s
  - /api/jugadores endpoint, PlayerLeaderboard component in Standings sidebar
- Footer: moved into Standings sidebar (.standings__footer) so it's always visible
- pregunta.tsx: complete redesign with tier cards, credit badge, spinner, success state
- pregunta.css: new styles for tier cards, input, badge, spinner, success, link-btn

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 14:43:25 +01:00
parent 2fac92356d
commit e772fb5cc0
6 changed files with 857 additions and 117 deletions

View File

@@ -736,28 +736,38 @@ body {
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
/* ── Site Footer ──────────────────────────────────────────────── */
/* ── Standings footer & branding ─────────────────────────────── */
.site-footer {
flex-shrink: 0;
padding: 14px 20px;
.standings__footer {
padding-top: 14px;
border-top: 1px solid var(--border);
text-align: center;
font-size: 12px;
font-size: 11px;
color: var(--text-muted);
line-height: 1.7;
line-height: 1.8;
margin-top: auto;
}
.site-footer__link {
.standings__footer a {
color: var(--text-dim);
text-decoration: none;
}
.site-footer__link:hover {
.standings__footer a:hover {
color: var(--text);
text-decoration: underline;
}
/* ── Player leaderboard name ─────────────────────────────────── */
.lb-entry__name {
font-size: 12px;
font-weight: 500;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ── Desktop (1024px+) ───────────────────────────────────────── */
@media (min-width: 1024px) {
@@ -814,5 +824,4 @@ body {
gap: 24px;
}
.site-footer { display: none; }
}