From a0fe50075cecb11f7d8e425e0e015ef81863a296 Mon Sep 17 00:00:00 2001 From: Lucas Kalil Date: Mon, 15 Jun 2026 02:07:37 -0300 Subject: [PATCH] docs: log smart hero countdown in project memory Co-Authored-By: Claude Opus 4.8 --- .agents/TODO.md | 1 + .agents/project-map.md | 5 +++-- .agents/project-memory.md | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.agents/TODO.md b/.agents/TODO.md index 00e47be..78ef464 100644 --- a/.agents/TODO.md +++ b/.agents/TODO.md @@ -64,6 +64,7 @@ Use checkboxes to track progress. Items marked **🔴 BLOCKER** prevent release; - [ ] Fill `thirdPlaceAssignment` in `bracket-config.json` after group stage ends (~2026-06-27; slot → allowed-groups table in project-memory) - [ ] Update `results.json` as the tournament progresses (results updated through match id 11 on 2026-06-14) - [ ] Real stadium photos + team flag SVGs in `assets/images/` (10 new-team flags created 2026-06-12 in placeholder style) +- [ ] **Pós-Copa: estado final da home.** Quando a Final encerrar, o hero fica vazio (por design atual). Criar um estado pós-torneio (campeão/epílogo) na home — ver entrada "Hero cronômetro inteligente (2026-06-15)" em project-memory; provavelmente converge com a aba Stats (`stats-screen-plan.md`). --- diff --git a/.agents/project-map.md b/.agents/project-map.md index fbf4c59..74196ed 100644 --- a/.agents/project-map.md +++ b/.agents/project-map.md @@ -36,8 +36,9 @@ worldcup2026/ │ │ (hover-scale/glow, pulse, line-draw) │ ├── js/ │ │ ├── app.js ★ Entry point: loadData() (Promise.all over data/), -│ │ │ tab routing + lastTab, formatMatchTime(), hero, -│ │ │ dashboard, countdown +│ │ │ tab routing + lastTab, formatMatchTime(), dashboard, +│ │ │ clock-driven hero (matchState/findFeaturedMatch + +│ │ │ 1s heroTick: hybrid JSON+clock, 2h/3h match window) │ │ ├── schedule.js Match list, filters, search, sort, "My Matches" │ │ ├── groups.js Standings computation (3/1/0, GD, GF) + group tables │ │ ├── stadiums.js Stadium cards + "view matches" cross-link diff --git a/.agents/project-memory.md b/.agents/project-memory.md index 23ed3f3..9cf2fe6 100644 --- a/.agents/project-memory.md +++ b/.agents/project-memory.md @@ -185,6 +185,18 @@ Static web app showing the FIFA World Cup 2026 (Mexico/USA/Canada, 48 teams) — - **`modal.js` renderiza stats reais quando `result.stats` existe**; senão mantém o placeholder com `—` + nota `modal.statsSoon` (backward-compatível, verificado nos jogos 6 com stats e 4 sem). `statRow(home, label, away)` agora recebe valores; antes só o label. - Reusa as chaves i18n já existentes: `modal.possession` / `modal.shots` / `modal.cards`. Adicionar stats a mais jogos = só editar `results.json`, nenhum código muda. +### Hero cronômetro inteligente — regra híbrida relógio+JSON (2026-06-15) +- **O hero da home (`assets/js/app.js`) deixou de depender só do JSON pra trocar de estado.** Antes: cronômetro zerava → mostrava `hero.kickoff` ("Bola rolando!") congelado **até** o `results.json` mudar. Agora o estado avança pelo **relógio** mesmo sem update do JSON. +- **`matchState(match, result, now)`** (função pura) é a fonte do estado: `over` se `status==='finished'` **OU** `now >= kickoff + janela`; `live` se `status==='live'` **OU** `now >= kickoff`; senão `upcoming`. O JSON sempre vence (finished/live forçam); o relógio só "chuta" o avanço quando o JSON está atrasado. +- **Janela variável** (`matchWindowMs`): `GROUP_WINDOW_MS = 2h` se `match.phase.startsWith('Group')`, senão `KO_WINDOW_MS = 3h` (mata-mata pode ir a prorrogação+pênaltis). Constantes no topo da seção hero. +- **`findFeaturedMatch(now)`** agora pega o jogo **não-`over`** de kickoff mais cedo, desempate por `id` (igual `schedule.js`). Substituiu o "pega o `live` do JSON, senão o `scheduled` mais cedo". +- **Motor de 1 interval persistente** (`heroTimer`/`startHeroClock`/`heroTick`): a cada tick computa `heroSignature` = `"${id}:${estado}"`; **mudou** → `renderHero()` completo (cobre as transições kickoff e fim-de-janela sem reload/JSON); **igual** → só `updateCountdown()` (dígitos, sem flicker). `renderHero` é idempotente e re-chama `startHeroClock` (guard `if (heroTimer) return`), então langchange/timemodechange não duplicam o timer. `setupCountdown`/`updateCountdown` substituíram `startCountdown` (refs dos dígitos em `countdownEls`/`countdownTarget` módulo-level). +- **Placar no estado live:** só renderiza se `result.homeScore`/`awayScore` **não forem null** (`hasScore`); senão cai pro "vs" (jogo em progresso pelo relógio, JSON ainda sem placar). Decidido com o usuário (opção C) — **sem** tempo decorrido tipo "45'" (seria impreciso num site estático). +- **Badge "Bola rolando!" preservado:** o texto que o usuário via NÃO era `hero.live` ("Ao vivo") — era `hero.kickoff` ("Bola rolando!"). A chave foi **renomeada `hero.kickoff` → `hero.inProgress`** (EN passou de "Kickoff!" → "In progress"; PT continua "Bola rolando!") e o badge do hero usa ela. `hero.live` ficou intacta (ainda usada por `schedule.js:209` e `modal.js:58`). CSS órfão `.hero-kickoff` removido do `style.css`. +- **Escopo: só o hero.** Os badges live de Matches/Modal/Bracket continuam guiados 100% pelo `status` do JSON → pode haver pequena inconsistência transitória (hero diz "em progresso" pelo relógio enquanto o card diz "agendado"). Aceito pelo usuário; "tornar badges time-aware" fica como tarefa futura se incomodar. +- **Fim do torneio:** quando a Final vira `over`, `findFeaturedMatch` retorna `null` → hero vazio (comportamento mantido). TODO registrado: estado pós-Copa da home (campeão/epílogo) quando a Final encerrar. +- **Verificado (preview, relógio fakeado via `Date.now` override + dispatch `langchange`):** 01:00Z→m12 upcoming (countdown 01:00:00); 02:30Z→m12 "Bola rolando!"+vs sem placar/sem cronômetro; 04:30Z→avança pro m13 (m12 ainda `scheduled` no JSON!); 18:30Z→avança pro m14; EN mostra "In progress"; console limpo. Screenshots de upcoming e in-progress conferidos. + ### How to update real-world data (scores, schedule) Follow `how-refresh-data.md` (project root). In short: 1. Edit `data/results.json` (scores/status) or `data/matches.json` (schedule, rare).