- 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>
- Verdict hero: champion (trophy + flag + name) and a 2/3/4 podium
(runner-up/3rd/4th) above the shared count-up tiles. Gated on the REAL
final via computeVerdict() — getBracketTree()'s FINAL node must be a real
finished result (!simulated), so a user's simulated champion never leaks
into the verdict. Third/fourth from the third-place match, independently.
Falls back to the existing aggregate 'in progress' hero until the final is
in, so an early merge stays correct.
- Goals-by-round chart beside goals-by-stage: group stage split into its 3
matchdays (derived per group; no matchday field exists) plus each knockout
round. Hidden until >=2 rounds have data so it never duplicates the
goals-by-stage Group bar early on.
- stats.js imports getBracketTree from bracket.js (4th circular import with
app.js, render-time only). i18n stats.goalsByRound/matchday/verditTitle/
runnerUp/thirdPlace/fourthPlace (EN/PT); verdict-hero CSS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Scaffold the post-Cup stats screen (.agents/stats-screen-plan.md) on the
feature/stats-final-screen branch.
- loadData(): fault-tolerant optional data layers (players, player-events,
awards, keeper-stats, curiosities, all-time-baselines) via loadOptional() —
an absent/404 file defaults to empty SILENTLY (graceful degradation, keeps
the console clean), warning only on a present-but-malformed file. The 6 core
files still throw on failure.
- stats.js SECTIONS registry: a section and its sub-nav chip render only when
available(model) holds, else they are omitted from the DOM entirely (no
placeholder / no coming-soon). Overview/Teams live; the 4 future sections
stay dark until later stages.
- Sticky scrollspy sub-nav: hash-safe anchor chips (preventDefault +
scrollIntoView, never touch location.hash so the tab router does not bounce
to Home); position-based scrollspy with an explicit page-bottom -> last
section rule (robust on short pages). --header-h kept live via a
ResizeObserver so the nav sticks correctly under the variable-height header.
- flagImg() monogram fallback: a broken flag SVG becomes a 3-letter code span,
never a broken-image icon.
- i18n stats.nav* keys (EN/PT); stats.css for sub-nav / section / fallback.
No DATA_VERSION bump (no deployed data changed). No index.html change.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
findFeaturedMatch → findFeaturedMatches: returns all matches sharing the
earliest kickoff, enabling the hero to show 2+ simultaneous group-final games
(same phase, shared time/countdown). renderHero splits single-match (unchanged
DOM) vs multi-match (stacked with dividers). heroMatchupHTML extracted for
reusable matchup layout.
CSS: .hero-matchups/match/divider/time for vertical stacking and shared time.
i18n: hero.nextMatches (EN/PT) for multi-match label.
- Remove card chrome (background rect, text duplicates, accent bars) from all 17 stadium SVGs
- Crop viewBox tightly to illustration (~10px padding) and remove fixed width/height attributes
- Update .stadium-img aspect ratio from 16/9 to 4/3 to match cropped SVG ratios and prevent aggressive object-fit clipping
Replace flag SVGs for 10 fictional teams with 10 new qualifiers (BIH, CZE, RSA,
CUW, CPV, HAI, IRQ, NOR, SWE, COD). Remove 14 unused stadium SVGs for venues not
in the 16-stadium tournament roster.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>