Description
TUI scoreboard — new page (key '4') in dashboard.py showing all live/today/upcoming games in a dense, Bloomberg-terminal-style monospace grid. Rows sorted live→today→upcoming, color-coded by state (live=yellow/bold, final=dim, upcoming=default). Polls /api/sources for sports payload on the same 30s interval as other pages.
Clicking (or pressing Enter on) a game opens a full-screen GameDetailScreen (Textual ModalScreen or push_screen). Detail view: box score, current period/inning/quarter, scoring plays/timeline, player stats table (passing/rushing/shooting/batting etc depending on sport), updates on a shorter interval (15s or configurable). ESC or Q to exit detail and return to scoreboard.
Navigation: up/down arrow keys or j/k to move between games, Enter to open detail, Esc to go back. The game list should be a Textual DataTable or custom OptionList so cursor/selection works naturally.
Reference: existing render_sports() at line 423 in tui/dashboard.py for current game bucketing and color logic — detail view extends this.
Acceptance Criteria
- #1 Page renders at /scoreboard with live scores in terminal-grid layout; match states visually distinct; auto-refreshes; mobile-readable monospace font
- #2 Page 4 shows live scoreboard; games navigable with arrow keys; Enter opens full-screen detail with box score + player stats; auto-refreshes; Esc closes detail