Leader cards (Best attack/defense, Most clean sheets) now rotate through every
team tied on the headline metric instead of showing only the top one, and three
new cards are added: Most wins, Most goals conceded, Best goal difference.
- group by the metric value alone; order within the group by existing tiebreakers
- auto-advance (3.5s), pause on hover/focus, off under prefers-reduced-motion
- discrete edge arrows with a full-height side click strip; wrap-around
- dots indicator up to 8 tied teams, else an i/n counter; single team = plain card
- bump APP_VERSION to v1.0.2
- Single source of truth: assets/js/i18n.js line 9
- Document when to bump (after notable changes/deploys)
- Document how to bump (one-liner, semantic commit)
- Explain rationale (explicit versioning, audit trail)
- Add APP_VERSION constant for easy version bumping
- Update EN/PT footer to show version instead of JSON reference
- Simplifies footer maintenance: bump one line in i18n.js
- Edge fades like the header tabs: chips moved into an inner scroll track so
the fade mask only affects the chips, leaving the pill background/rounded
ends crisp. updateSubnavFades toggles fade-left/right from the track's
overflow (on track scroll, resize, setActiveChip, init).
- Scrollspy no longer jumps when a chip is clicked: the page-scroll spy is
suppressed for the duration of the programmatic smooth-scroll (700ms; 0 under
reduced-motion), so the clicked chip stays active instead of flipping back to
the old section mid-animation and forward again.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Brings the post-Cup Stats screen to master: degradation engine + fault-tolerant
loadData, sticky scrollspy sub-nav, verdict hero + goals-by-round chart, final
ranking 1-48, favorite-row highlight, team/match record cards, format-48 debuts
band, and the team comparator. Stage E (in-tab archive) skipped; data layers
G/H/I + a 2nd polish remain (see .agents/TODO.md).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
a11y/responsive/i18n audit over A-F passed clean (no code fixes); added a
Stats section to the README; restructured TODO so G/H/I + a second polish
(J round 2) are queued for the future.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New Comparator sub-nav section (available once >=1 match played). Two team
selects (all 48, alphabetical), defaulting to the top-2 ranked teams; the
choice survives langchange (module-level cmpA/cmpB).
- Diverging mirrored bars: A grows left from the centre metric label, B right;
each row scales to max(a,b) so the longer bar is the higher value, and the
higher side's number is gold. Metrics P/W/GF/GA/CS/Pts (all non-negative).
cmp-grow scaleX animation from the centre edge; off under reduced-motion.
- On select change only the bars panel re-renders (keeps focus, replays the
animation).
- Players side intentionally NOT shipped: a disabled toggle would be a dead
control (violates the graceful-degradation rule). The Teams/Players toggle
arrives in Stage H with players.json.
- i18n comparatorTitle/cmpTeamA/cmpTeamB (EN/PT); CSS for the comparator.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
User chose to keep the 'See all matches -> Matches' link instead of building
an in-tab results archive; the Matches tab already covers browsing. No code
change; the archive SECTIONS slot stays dormant (available: false).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New Records sub-nav section (always available): match-record cards plus the
format-48 debuts band. Sub-nav now Overview / Teams / Records.
- Moved the biggest-win card out of Teams into Records (it is a match record);
Teams keeps team-level cards (win streak, champion path). Records shows
biggest win + highest-scoring match (both -> openMatchModal), with the
high-score card deduped when it is the same match as the biggest win.
- computeRecords gains highestScoringMatch. New recordsSectionHTML /
highScoreCardHTML / formatDebutsHTML.
- Format debuts band: 48 teams, 104 matches, 12 groups, Round of 32, 8 best
thirds, and (post-final) first champion of the 48-team era. Counts derived
from data, champion from the verdict.
- i18n recordsTitle/highScoreMatch/formatDebutsTitle/debut* (EN/PT); CSS for
.stats-subhead and the .debut-band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Canonical final ranking: each team carries a .rank from the stage-reached
chain (champion>runner-up>3rd>4th>QF>R16>R32>group, then pts>GD>GF>id),
computed from REAL knockout results only (simulation never moves it). The #
column shows this rank and is the default sort; it stays canonical when
sorting other columns, and clicking # returns to it.
- Favorite-team row highlight (gold inset border + tint); re-renders on
favchange. No stars in the table (highlight-only, like the bracket).
- Team record cards: biggest win (-> openMatchModal), longest win streak
(>=2, else hidden), and champion's path (R32->Final route, gated on the
verdict, rows -> openMatchModal). Each degrades away when its data is null.
- stats.js imports getFavorites (storage) + openMatchModal (modal). i18n
tip.rank/stats.rankCol/biggestWin/winStreak/championPath (EN/PT); CSS for
.row-fav, record cards, champion path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>