• v0.11.0 — card themes, HUD overhaul, UX feel polish

    funman300 released this 2026-05-02 00:42:21 +00:00 | 510 commits to master since this release

    The 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