- Add src/game/scoring.ts with computeRunningTotals and isGameOver
- Build ScoreSheet grid: player columns, per-round scores, running totals after round 2+
- Small red "New Game" button in header top-right with full-screen confirmation overlay
- Extend PageFrame with headerAction and overlay props
- Move press animation/shadow from .pressable class to global button selector
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extract the rounded-card shell and button press animation into a shared
CSS module composed by PageFrame, TitleScreen, and all buttons, add color
tokens for repeated values, and load the saved game once on mount.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Dynamic name fields (3–6 players) with add/remove controls
- Start button disabled until all names are non-blank and unique;
uniqueness check normalizes internal whitespace so "Bob Smith"
and "Bob Smith" are treated as the same name
- Names passed to game state are edge-trimmed only, preserving
internal spacing as the user typed it
- Failing fields highlighted with red border and light red background
- PrimaryButton gains disabled prop with faded/flat appearance;
active press state suppressed when disabled
- All round buttons now use consistent shadow and translateY values
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PageFrame: parchment-background frame with title, diamond-rule divider,
scrollable content area, and optional bottom-pinned footer slot
- PrimaryButton: shared full-width button (light blue, drop shadow, pressed
state via translateY + shadow reduction) — used by TitleScreen and PlayerSetup
- Global button base in index.css ensures touch-friendly sizing everywhere
- TitleScreen consolidated to use PrimaryButton instead of its own button style
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>