37681cf33e
Phase 3 step 5e of the UX overhaul. Wraps the leaderboard list inside the standard ui_modal scaffold; converts the Opt In / Opt Out buttons to use spawn_modal_button (so they pick up the shared hover / press paint system); replaces "Press L to close" prose with a primary Done button. Changes: - spawn_leaderboard_screen now goes through spawn_modal(LeaderboardScreen, Z_MODAL_PANEL, ...). The bespoke 0.82-alpha scrim and hand-rolled card surface are gone — same visual contract as every other overlay. - Opt In becomes a Secondary modal button; Opt Out becomes Tertiary. Both fire the same fetch tasks they did before. - Header / data cells switch to ui_theme tokens. The top-3 podium effect now uses ACCENT_PRIMARY (yellow) for #1 and TEXT_PRIMARY for #2/#3 instead of metallic-coloured srgb literals; #4+ use TEXT_SECONDARY. - Header-cell and data-cell helpers now take a `&TextFont` so all three sizes (HEADLINE / BODY_LG / BODY / CAPTION) come from the shared scale instead of inline 13px / 15px sizes. - "Fetching\u{2026}" loading state uses STATE_INFO; empty-state copy uses TEXT_SECONDARY. - handle_leaderboard_close_button is the click counterpart to L; it also sets ClosedThisFrame so update_leaderboard_panel doesn't immediately respawn the modal when a fetch completes in the same frame. The sort-by-score code is replaced with `sort_by_key(Reverse(...))` to satisfy clippy's unnecessary_sort_by lint that surfaced once the file was otherwise warning-free. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>