Phase 4: scoreboard page, public API and realtime refresh

- buildScoreboardPayload is the single place deciding what the public may
  see: visible, frozen (snapshot scores, live current game), hidden (no
  scores, alphabetical) and reveal (unrevealed teams carry no score/order).
- GET /api/public/scoreboard/[token] validates the token, then loads the
  event with the service client in one parallel round trip.
- notify() pings sb/admin/game channels over Realtime's REST endpoint with
  no data; useRefreshChannel refetches immediately on a ping, throttles
  bursts, and falls back to a 10s poll, focus and reconnect.
- /s/[token]: FLIP rank animation, count-up totals, reduced motion,
  fullscreen, cursor hide and a connection indicator.
- Admin setup actions now notify, so renames and reorders show up live.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 14:19:03 +02:00
co-authored by Claude Opus 5.5
parent b60c9db4f4
commit 17eb76d036
18 changed files with 977 additions and 8 deletions
+4 -4
View File
@@ -66,15 +66,15 @@ This is the screen used during the night. Must be fast and hard to mess up.
### 4.3 Scoreboard (`/s/[token]`)
- Projector-first, 16:9, readable from the back of a hall.
- Shows: event name, current game title, team standings (rank, name, colour, total points),
optionally per-game points columns for completed games.
- Shows: event name, current game title, team standings (rank, name, colour, total points).
v1 shows totals only; per-game points columns are a later option.
- Updates live (< 1s) when admin changes anything. Rank changes animate.
- **Visible** — live totals.
- **Frozen** — shows totals as they were the moment it was frozen, with a subtle "scores frozen" note.
Server stores the snapshot; live scores are not sent.
Server stores the snapshot; live scores are not sent. The current game title still updates live.
- **Hidden** — no scores sent at all. Shows team names (no order implied — alphabetical) and the current game, with a "scores are hidden" state.
- **Reveal mode** (admin-triggered): scoreboard reveals final standings last place → first,
one team per admin click ("Reveal next"), then sets visibility to Visible.
one team per admin click ("Reveal next") — tied teams too, each showing the shared rank — then sets visibility to Visible.
- Auto-reconnects; also polls every 10s as a fallback. Shows a small offline dot if disconnected.
- Fullscreen button; hides cursor after inactivity.