-
v0.11.0 — card themes, HUD overhaul, UX feel polish
released this
2026-05-02 00:42:21 +00:00 | 510 commits to master since this releaseThe biggest release since v0.10.0. Eleven commits cover three
threads: the runtime card-theme system, an HUD restructure that
reclaims the play surface, and four UX feel wins surfaced by smoke
testing. The font-fallback fix in here was a real-world second-
machine reproduction.Card-theme system (CARD_PLAN.md phases 1–7)
- Bundled default theme ships in the binary via embedded:// — 52
hayeah/playing-cards-assets SVGs (MIT) plus a midnight-purple
back.svg as original work. - User themes live under themes:// rooted at user_theme_dir(). Drop a
directory containing theme.ron + 53 SVGs and the registry picks it
up on next launch. - Importer at solitaire_engine::theme::import_theme(zip) validates
archives (20 MB cap, zip-slip rejection, manifest validation, every
SVG round-tripped through the rasteriser) and atomically unpacks. - Picker UI in Settings → Cosmetic; selection persists to settings
as selected_theme_id.
HUD overhaul
- Top band reserved as a 64 px horizontal strip; cards no longer
crowd the score readout or action buttons. - Action button bar auto-fades when the cursor leaves the band so
it can't compete with the play surface during gameplay.
UX feel polish
- Foundations are unlocked: PileType::Foundation(Suit) →
Foundation(u8) (slot 0..3), claim derived from the bottom card.
Any Ace lands in any empty slot, and the slot then claims that
suit. Save-format invalidation: GameState.schema_version 1 → 2;
pre-v2 game_state.json files silently fall through to "fresh game
on launch." Stats / progress / achievements / settings unaffected. - Drop-target overlay drawn ABOVE stacked cards during drag so legal
destinations are unmistakably highlighted (was previously a hidden
pile-marker tint). Reuses the STATE_SUCCESS hue. - Each card casts a neutral drop shadow against the felt; the
shadow lifts (40 % alpha, larger offset, bigger halo) for cards
in the active drag set. - Stock pile shows a "·N" remaining-count chip at the top-right
corner. Hides when the stock empties so it never co-renders with
the existing ↺ recycle indicator.
Bug fixes
- shared_fontdb now include_bytes!()s the bundled FiraMono and pins
the CSS generics to it. Fixes "card font didn't carry over" on
second machines where fontconfig had no usable sans-serif fallback
for the named families (Bitstream Vera Sans, Arial) that the
hayeah SVGs request.
By the numbers: 982 passing tests (was 819 at v0.10.0), zero clippy
warnings under --workspace --all-targets -- -D warnings.Downloads
- Bundled default theme ships in the binary via embedded:// — 52