3f922ede28
Phase 3 step 4a of the UX overhaul. Closes the player's #2 smoke-test complaint head-on: the abandon-current-game prompt previously rendered "Yes (Y)" and "No (N)" as plain `Text` entities — not real `Button`s. Clicks did nothing, hover/press feedback was absent, and the only path through the modal was the keyboard. Replace the bespoke 60-line spawn function with a 30-line call to the ui_modal primitive: - spawn_modal(ConfirmNewGameScreen, Z_MODAL_PANEL, ...) — uniform scrim + centred card with header / body / actions slots. - Header: "Abandon current game?" (TYPE_HEADLINE, TEXT_PRIMARY). - Body: "Your progress will be lost." (TYPE_BODY_LG, TEXT_SECONDARY). - Actions row: Cancel (Secondary variant, hotkey "Esc") — left Yes, abandon (Primary yellow CTA, hotkey "Y") — right The ConfirmNewGameScreen marker rides on the scrim entity per ui_modal's contract; OriginalNewGameRequest is attached to the same entity after spawn so handle_confirm_input / handle_confirm_button_input can read it. A new handle_confirm_button_input system mirrors the keyboard handler for clicks: it queries `Changed<Interaction>` on `ConfirmYesButton` / `ConfirmNoButton` and dispatches the same despawn + new-game-fire logic. Keyboard accelerators (Y/Enter, N/Esc) still work; both paths reach the same code through the existing `confirmed: true` flag on NewGameRequestEvent (62cd1cf). UiModalPlugin's paint_modal_buttons system (8da62bd) handles hover/press recolouring automatically; no per-modal paint logic needed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>