- 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.