Scale the Plinko scoreboard for a 1080p TV #1

Merged
eddie merged 2 commits from tv-1080p-scoreboard into main 2026-09-04 23:04:36 -07:00
Owner

Retunes the scoreboard page for the display it actually runs on (1920x1080, 16:9) and fixes two rendering bugs found along the way. The input page is untouched.

Layout

  • The board only used the middle 1200px of a 1920px screen. The max-width cap is gone and the seven rows per column share the column height, so it fills the screen exactly and never scrolls.
  • Names 29px to 46px, scores 40px to 58px. A 46px name is roughly 0.8in tall on a 55in panel, the threshold for comfortable reading at 10ft.
  • Rank badges are blue, so red means "score" and nothing else.
  • Scores and ranks use a plain heavy face with tabular figures. Pricedown stays on the title and names; its digits are too narrow at distance, where the zero reads as a one.
  • cursor: none, and the dead :hover rules are removed.

Fixes

  • Every SSE tick rebuilt all 14 rows, so the entry animation re-fired across the whole board about once a second. Rows update in place now, and only a score that actually changed animates.
  • Ranks are computed once in get_players_by_score() so the template and the SSE stream agree. Ties share a rank, and nobody is crowned leader while everyone is still on zero.
  • The leader highlight renders on first paint instead of only after the first tick.
  • The 5s reload loop on SSE errors is now a 60s dead-connection fallback. EventSource reconnects on its own, which matters because the deploy restarts Flask on every auto-pull.

Testing

Rendered at 1920x1080 against the live player data, and drove a stubbed SSE update (Eddie 1 to 10) to confirm he takes row 1 with the leader highlight while untouched zero-score rows do not animate.

Retunes the scoreboard page for the display it actually runs on (1920x1080, 16:9) and fixes two rendering bugs found along the way. The input page is untouched. ## Layout - The board only used the middle 1200px of a 1920px screen. The `max-width` cap is gone and the seven rows per column share the column height, so it fills the screen exactly and never scrolls. - Names 29px to 46px, scores 40px to 58px. A 46px name is roughly 0.8in tall on a 55in panel, the threshold for comfortable reading at 10ft. - Rank badges are blue, so red means "score" and nothing else. - Scores and ranks use a plain heavy face with tabular figures. Pricedown stays on the title and names; its digits are too narrow at distance, where the zero reads as a one. - `cursor: none`, and the dead `:hover` rules are removed. ## Fixes - Every SSE tick rebuilt all 14 rows, so the entry animation re-fired across the whole board about once a second. Rows update in place now, and only a score that actually changed animates. - Ranks are computed once in `get_players_by_score()` so the template and the SSE stream agree. Ties share a rank, and nobody is crowned leader while everyone is still on zero. - The leader highlight renders on first paint instead of only after the first tick. - The 5s reload loop on SSE errors is now a 60s dead-connection fallback. EventSource reconnects on its own, which matters because the deploy restarts Flask on every auto-pull. ## Testing Rendered at 1920x1080 against the live player data, and drove a stubbed SSE update (Eddie 1 to 10) to confirm he takes row 1 with the leader highlight while untouched zero-score rows do not animate.
The board used only the middle 1200px of a 1920px screen with monitor-sized type, so names were about half the height needed to read them from the couch. It now fills the width, the seven rows share the column height so it always fits the screen exactly, and names and scores are roughly 1.5x bigger.

Red is reserved for scores now, and the digits use a plain heavy face because Pricedown's zero reads as a one at that distance.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every SSE tick rebuilt all 14 rows, so the entry animation re-fired across the whole board about once a second. Rows are updated in place now and only a score that actually changed animates.

Ranks are computed once in get_players_by_score so the page and the live stream agree, ties share a rank, and the leader is highlighted on first paint instead of only after the first tick - which also stops someone being crowned leader on zero points before the game starts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
eddie merged commit c9eb387147 into main 2026-09-04 23:04:36 -07:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eddie/FigFamFamilyPlinkoScoreboard!1
No description provided.