feat(frontend): v1.13.0 "Vantage" - HighContrast/Colorblind themes#96
Conversation
Adds AppTheme::HighContrast (WCAG AA/AAA dark theme) and AppTheme::Colorblind (Okabe-Ito accent palette), both additive after the original Light/Dark/System trio. Regression-tested against the stock dark theme so a builder that forgot to override a Visuals field can't silently ship an indistinguishable theme. Also investigates the two other originally-planned v1.13.0 items and honestly re-scopes both rather than forcing code that doesn't fit: - Save-state "versioned migration": found the plan's premise was stale. System::load_state was always designed to fail loudly on an older-format blob (never to migrate one), and a regression fixture proving exactly that has existed since v0.7.0. Closed as verified-non-issue, documented in docs/frontend.md. - Keyboard-only-navigation audit: found to be a manual-walkthrough task, not a discrete code fix (egui's default Tab order is used everywhere, untested but not known-broken). Documented as an open item rather than converted into a hollow "audit passed" claim. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request introduces two new accessibility-oriented theme variants to the desktop UI shell: AppTheme::HighContrast (a high-contrast dark theme meeting WCAG 2.1 AA/AAA standards) and AppTheme::Colorblind (using the Okabe-Ito palette for interactive accents). It also adds corresponding regression tests, updates the documentation, and documents the deferral of a keyboard-only navigation audit. The reviewer suggests setting v.widgets.active.weak_bg_fill in the colorblind theme to ensure visual consistency for all active interactive elements.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
Pull request overview
This PR extends the rustysnes-frontend egui shell with two new accessibility-focused themes (HighContrast and Colorblind) and documents the corresponding release notes and re-scoped v1.13.0 planning items.
Changes:
- Adds
AppTheme::HighContrastandAppTheme::Colorblindto frontend config, including UI labels and serialization names. - Implements new egui
Visualsbuilders for both themes and wires them intoui_shell::apply_theme. - Adds regression tests ensuring the new themes diverge from stock dark visuals and that
apply_themehandles all variants; updatesdocs/frontend.mdandCHANGELOG.md.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| docs/frontend.md | Updates theme documentation and clarifies save-state/version-plan findings (but currently contains broken inline-code formatting that should be fixed). |
| crates/rustysnes-frontend/src/ui_shell.rs | Adds the two theme Visuals builders, dispatches them in apply_theme, and adds regression tests. |
| crates/rustysnes-frontend/src/config.rs | Adds the new AppTheme variants, display names, and expands the all() list (with an API-stability concern for the fixed-size-array return type). |
| CHANGELOG.md | Adds Unreleased entries describing the new themes and the re-scoped/deferred items. |
Addresses gemini/copilot findings on PR #96: - colorblind_visuals() now also sets widgets.active.weak_bg_fill -- egui reads that (not bg_fill) for many active states (tabs, selected menu items), so it was silently exempt from the colorblind-safe palette. - Three docs/frontend.md inline-code spans that were split across a line wrap, breaking the rendered Markdown. - AppTheme's doc comment corrected: variant APPEND ORDER doesn't preserve config.toml compatibility, the serde string rename does (order was never load-bearing here). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Summary
AppTheme::HighContrast(near-black/near-white theme pushing every foreground/background pair past WCAG 2.1 AA, most past AAA) andAppTheme::Colorblind(interactive accents drawn from the Okabe-Ito palette, mutually distinguishable under the most common red-green color-vision deficiencies). Both additive after the originalLight/Dark/Systemtrio; both regression-tested against the stock dark theme so a builder that forgot to override aVisualsfield can't silently ship an indistinguishable theme.v1.13.0items and honestly re-scoped both rather than forcing code that doesn't fit the actual gap:System::load_statewas always designed to fail loudly on an older-format blob (never to migrate one), by deliberate choice recorded since theFORMAT_VERSION2/3 bumps — and a regression fixture proving exactly that behavior has existed sincev0.7.0(save_state_backward_compat.rs). Closed as verified-non-issue; no code change needed. Documented indocs/frontend.md's "Save-states, rewind, run-ahead" section.docs/frontend.md's Theme section rather than converted into a hollow "audit passed" claim.Test plan
cargo fmt --checkcargo clippy --workspace --all-targets -- -D warningscargo clippy -p rustysnes-frontend --all-targets --features full -- -D warningscargo clippy -p rustysnes-frontend --all-targets --features emu-thread,hd-pack -- -D warningscargo test --workspace(all green, including 3 new theme tests)RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-depsmarkdownlint-cli2on both touched docs — +2 findings vs. baseline, bothMD024(duplicate-heading) from reusing the CHANGELOG's own established### Added/### Deferredsection pattern, not new problems🤖 Generated with Claude Code