-
v0.16.0 — modal-feel polish round
released this
2026-05-06 00:52:08 +00:00 | 460 commits to master since this releaseFive small polish items that together meaningfully tighten how
every overlay screen feels. Originated from a smoke-test report
that the Achievements list didn't scroll; the sweep that followed
found four other modals with the same problem plus three smaller
modal-feel gaps.Added
- Pointer cursor on hover for every interactive Button entity
(modal buttons, HUD action bar, mode-launcher cards, settings
toggles, Stats selectors). update_cursor_icon's branch order
is Grabbing → Pointer → Grab → Default. - Click-outside-to-dismiss for the six read-only modals: Stats,
Achievements, Help, Profile, Leaderboard, Home. New
ScrimDismissible marker on ModalScrim opts a modal in;
dismiss_modal_on_scrim_click despawns the topmost dismissible
scrim on a scrim-click outside every card. Settings, Onboarding,
Pause, Forfeit confirm, ConfirmNewGame intentionally don't opt
in — they carry unsaved or destructive state.
Fixed
- Achievements / Help / Stats / Profile / Leaderboard now scroll
when their content overflows the 800x600 minimum window. Each
body Node carries Overflow::scroll_y() + a max_height +
per-plugin marker; sibling scroll_*_panel systems route
MouseWheel into ScrollPosition. Mirrors the existing
SettingsPanelScrollable pattern. - Modal focus arrives on the same frame the modal opens.
attach_focusable_to_modal_buttons + auto_focus_on_modal_open
moved from Update to PostUpdate so the schedule boundary
supplies the sync point — every modal spawned anywhere in
Update is materialised before attach runs, FocusedButton is
populated before app.update() returns, and the very first
Tab/Enter press lands on a populated resource instead of wasting
itself moving focus from None to the primary.
By the numbers: 1196 passing tests (was 1178 at v0.15.0), zero
clippy warnings.Downloads
- Pointer cursor on hover for every interactive Button entity