A ✎ button next to each round label opens the score entry form
pre-populated with that round's scores. Submitting replaces the round
in place instead of appending a new one.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Highlights the winning player's column in green when the game ends,
changes the footer button to "New Game" (reusing the existing confirm
dialog), and pre-populates player names from the previous game when
starting a new one.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each player gets a number input; scores are validated individually
(divisible by 5, ≤ 110) and as a round (must sum to −110). Submit
stays disabled until all constraints pass. A running sum indicator
turns green when the round is valid. Submitting appends the round
to game state and persists it to localStorage.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
Four screens (Title, Player Setup, Score Sheet, Enter Scores) wired together
via a simple useState state machine. Auto-resumes to Score Sheet if a game
exists in localStorage under the key 'currentGame'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sets up Vite + React + TypeScript with vite-plugin-pwa for offline support.
Adds app icon (line-drawn 7 on black) in all required sizes with a generation script.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>