From 61d891fb760042407aca6aa790a433ce378e6cd1 Mon Sep 17 00:00:00 2001 From: funman300 Date: Sat, 2 May 2026 03:08:46 +0000 Subject: [PATCH] docs: CHANGELOG + SESSION_HANDOFF refresh for v0.12.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CHANGELOG gains a [0.12.0] section covering the second UX iteration round on top of v0.11.0: - Foundation completion flourish - Drag-cancel return tween - Focus ring breathing - First-win achievement onboarding toast - Mode Launcher digit shortcuts - Card aspect-ratio fix (1.4 → 1.4523) - Plus the README and CHANGELOG-add docs that rode along The bottom-of-file compare links thread the new tag into the existing chain (Unreleased → 0.12.0 → 0.11.0 → ...). Test count updated to 1007. SESSION_HANDOFF now distinguishes session 7 round 1 (v0.11.0, morning) from round 2 (v0.12.0, afternoon) — keeping the audit trail readable instead of conflating them. The release-prep punch list collapses to the three tag/push/packaging items; the UX iteration list opens with six fresh candidates for whoever picks the next round. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 65 ++++++++++++++++++++++++++- SESSION_HANDOFF.md | 109 +++++++++++++++++++++++++-------------------- 2 files changed, 125 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b62950..e58736a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,68 @@ project follows [Semantic Versioning](https://semver.org/). _Nothing yet._ +## [0.12.0] — 2026-05-02 + +UX feel polish round on top of v0.11.0. Six small-but-tangible +improvements that make the play surface feel more responsive, +forgiving, and discoverable, plus the doc refresh that should have +ridden along with v0.11.0. + +### Added + +- **Foundation completion flourish.** When a King lands on a + foundation (Ace-through-King for that suit), a brief celebration + fires: King card scale-pulses 1.0 → 1.15 → 1.0 over 0.4 s, the + foundation marker tints `STATE_SUCCESS` for the first half then + fades, and a synthesised C6→E6→G6 bell ping plays (~240 ms, + octave above `win_fanfare`'s root so the fourth completion + win + cascade layer cleanly). New `FoundationCompletedEvent { slot, + suit }` carries the trigger so future systems can hook in. +- **Drag-cancel return tween.** Illegal drops glide each dragged + card back to its origin slot over 150 ms with a quintic ease-out + curve (`MotionCurve::Responsive`, zero overshoot — reads forgiving + rather than jittery). The audio cue (`card_invalid.wav`) still + fires for negative feedback. Right-click and double-click invalid + paths still use `ShakeAnim` since there's no motion to interpolate. +- **Focus ring breathing.** The keyboard focus ring's alpha modulates + with a 1.4 s sin curve over [0.65, 1.0] of its native value so the + indicator catches the eye on focus changes without competing with + gameplay. Honours `AnimSpeed::Instant` by reverting to the static + outline for reduced-motion users. +- **First-win achievement onboarding toast.** After the player's + very first win, a one-shot info toast surfaces "First win! Press + A to see your achievements." `Settings.shown_achievement_onboarding` + persists the seen state so the cue never re-fires (legacy + `settings.json` files load to `false` via `#[serde(default)]`). +- **Mode Launcher digit shortcuts.** Pressing M opens the Home modal + (the Mode Launcher); inside it, pressing 1–5 launches each mode + directly without needing Tab + Enter. Locked modes (Zen, Challenge, + Time Attack at level < 5) are silent no-ops. Modal-scoped — digit + keys outside the launcher fire nothing. + +### Fixed + +- **Card aspect ratio matches hayeah SVGs.** `CARD_ASPECT` 1.4 → + 1.4523 to match the bundled artwork's natural 167.087 × 242.667 + dimensions. Cards previously rendered ~3.6 % vertically squashed. + The vertical-budget math in `compute_layout` uses `CARD_ASPECT` + algebraically so the worst-case-tableau-fits-on-screen guarantee + adapts automatically. + +### Documentation + +- **README refresh** with v0.11.0+ features (card themes, HUD + overhaul, drag feel, unlocked foundations) and a corrected controls + table — the previous table inverted Z/U for undo and listed H for + help when F1 is the binding. +- **CHANGELOG.md** added (this file), covering v0.9.0–v0.12.0 with + Keep a Changelog 1.1.0 conventions. + +### Stats + +- 1007 passing tests (was 982 at v0.11.0). +- Zero clippy warnings under `--workspace --all-targets -- -D warnings`. + ## [0.11.0] — 2026-05-02 The biggest release since 0.10.0. Headline threads: a runtime card-theme @@ -162,7 +224,8 @@ with no PNG artwork yet. CREDITS.md, persistent window geometry, mode-launcher Home repurpose, client-side sync round-trip integration tests. -[Unreleased]: https://github.com/funman300/Rusty_Solitaire/compare/v0.11.0...HEAD +[Unreleased]: https://github.com/funman300/Rusty_Solitaire/compare/v0.12.0...HEAD +[0.12.0]: https://github.com/funman300/Rusty_Solitaire/compare/v0.11.0...v0.12.0 [0.11.0]: https://github.com/funman300/Rusty_Solitaire/compare/v0.10.0...v0.11.0 [0.10.0]: https://github.com/funman300/Rusty_Solitaire/compare/v0.9.0...v0.10.0 [0.9.0]: https://github.com/funman300/Rusty_Solitaire/releases/tag/v0.9.0 diff --git a/SESSION_HANDOFF.md b/SESSION_HANDOFF.md index 2164d29..42e9844 100644 --- a/SESSION_HANDOFF.md +++ b/SESSION_HANDOFF.md @@ -1,20 +1,20 @@ # Solitaire Quest — UX Overhaul Session Handoff -**Last updated:** 2026-05-02 (session 7) — UX iteration round complete: every item from session 6's UX punch list has shipped, plus a font-fallback fix surfaced by a second-machine smoke test. Six commits on top of session 6's `c4970b1`. Direction now opens for the next round — release prep or another UX pass, the player's call. +**Last updated:** 2026-05-02 (session 7, late) — Second UX iteration round complete. Six small UX feel items shipped on top of v0.11.0 and the README/CHANGELOG refresh that should have ridden along. Ready to tag v0.12.0. ## Status at pause -- **HEAD:** `655dfde`. Local master is **3 commits ahead** of `origin/master` (`f6c9166`, `f712b89`, `655dfde` unpushed; `fdb6c2e` and `95df542` already pushed). -- **Working tree:** clean. (`CARD_PLAN.md` is untracked but intentionally so — it's a plan doc, not source.) +- **HEAD:** `7dba772` plus the impending CHANGELOG/handoff doc commits. Local master is **3 commits ahead** of `origin/master` (`9887343`, `ca5788f`, `7dba772` unpushed); doc commits to follow. +- **Working tree:** clean apart from this doc + CHANGELOG, both intentional. - **Build:** `cargo clippy --workspace --all-targets -- -D warnings` clean. -- **Tests:** **982 passed / 0 failed** across the workspace (+20 from session 6's 962 baseline). -- **Tags on origin:** `v0.9.0`, `v0.10.0`. Stale local-only `v0.1.0` is still safe to `git tag -d v0.1.0`. +- **Tests:** **1007 passed / 0 failed** across the workspace (+25 from session 7 morning's 982 baseline). +- **Tags on origin:** `v0.9.0`, `v0.10.0`, `v0.11.0`. Local has `v0.11.0` too. v0.12.0 is the next tag. ## Where we are -Session 6's UX punch list was four items. All four shipped today, plus an unrelated font-fallback fix from a second-machine smoke test. +v0.11.0 shipped the headline structural changes (card themes, HUD overhaul, four UX feel wins, font fallback). The second UX round — six smaller items — is also done now. v0.12.0 is the right slice for them; together with the README refresh and CHANGELOG add it makes a clean release. -The card-theme system, HUD restructure, modal scaffold, and the four big UX feel items (foundations, drop shadows, drop highlights, stock badge) are all in. Direction is open — the deferred release-prep items (`v0.11.0` cut, README/CHANGELOG refresh, desktop packaging) are still on the table, and a fresh round of UX iteration is also available. +The post-v0.11.0 UX candidate list is exhausted. Direction is open again. ### Design direction (unchanged) @@ -24,43 +24,59 @@ The card-theme system, HUD restructure, modal scaffold, and the four big UX feel ### Canonical remote -`github.com/funman300/Rusty_Solitaire` is the canonical repo. Always push there. (Earlier sessions used `Rusty_Solitare` — single-i typo — as the repo name; the rename to `Rusty_Solitaire` happened in session 7. Local clone directories may still be named `Rusty_Solitare`; that's just a directory name and works fine.) +`github.com/funman300/Rusty_Solitaire` is the canonical repo. Always push there. (Local clone directories may still be named `Rusty_Solitare`; that's just a directory name and works fine.) -## Session 7 (shipped 2026-05-02) +## Session 7 round 1 (shipped 2026-05-02 morning) — v0.11.0 | Area | Commit | What landed | |---|---|---| -| Font fallback | `fdb6c2e` | `shared_fontdb` now `include_bytes!()`s `assets/fonts/main.ttf` (FiraMono) and pins every CSS generic to `"Fira Mono"` so unmatched named families on minimal Linux installs / fresh Wayland sessions / chroots don't drop card rank/suit text. Surfaced when a second-machine pull rendered cards without glyphs. | -| Unlock foundations | `95df542` | `PileType::Foundation(Suit)` → `Foundation(u8)` (slot 0..3). `Pile::claimed_suit()` derives the claim from the bottom card — no separate field, no claim-stuck-after-undo class of bugs. `can_place_on_foundation` drops its suit parameter. `next_auto_complete_move` prefers a slot whose claimed suit matches the candidate before falling back to the first empty slot for an Ace. Empty foundation markers render as plain placeholders (no "C/D/H/S"). HUD selection label and hint toast read `claimed_suit()` and fall through to "Foundation N" / "move to foundation" when the slot is empty. Save-format invalidation: `GameState.schema_version` bumped 1 → 2; old `game_state.json` files silently fall through to "fresh game on launch." Stats / progress / achievements / settings live in separate files and are unaffected. 9 new tests. | -| Drop overlay | `f6c9166` | The pre-existing `update_drop_highlights` system tinted `PileMarker` sprites green for valid drops, but markers were occluded by stacked cards — invisible during real play. New `update_drop_target_overlays` spawns a soft-fill + 3 px outlined box ABOVE cards for every legal target (full fanned column for tableaux, card-sized for foundations / empty tableaux). `Z_DROP_OVERLAY = 50` sits above static cards but below `DRAG_Z = 500` so the dragged card never gets occluded. Reuses `STATE_SUCCESS` hue. The original marker-tint system is untouched. 3 new tests. | -| Drop shadows | `f712b89` | Each `CardEntity` spawns a `CardShadow` child sprite — neutral black at 25 % alpha, sized `card_size + 4 px`, offset `(2, -3)`, local z `-0.05`. `update_card_shadows_on_drag` snaps shadows in `DragState.cards` to a lifted state (40 % alpha, `(4, -6)` offset, `(8, 8)` padding). `resize_cards_in_place` extended to keep shadows cheap on window resize. `update_card_entity`'s `despawn_related` is followed by a fresh `add_card_shadow_child` so flips / theme swaps re-attach shadows. Pure `card_shadow_params(is_dragged)` helper unit-tested. 4 new tests. | -| Stock badge | `655dfde` | A small `·N` chip at the top-right corner of the stock pile shows the remaining count. `update_stock_count_badge` spawns a top-level world entity whose `Transform.translation` is recomputed each tick from `LayoutResource`, so window resize / theme swap don't strand it. Hides via `Visibility::Hidden` when the stock empties — the existing `↺` `StockEmptyLabel` takes over and they never co-render. `Z_STOCK_BADGE = 30` sits between cards and `Z_DROP_OVERLAY`. 4 new tests. | +| Font fallback | `fdb6c2e` | FiraMono bundled into the SVG fontdb so cards render rank/suit text on machines without Bitstream Vera Sans / Arial. Surfaced when a second-machine pull lost glyphs. | +| Unlock foundations | `95df542` | `PileType::Foundation(Suit)` → `Foundation(u8)` with claim derived from the bottom card. Save schema 1 → 2; pre-v2 saves silently fall through to fresh game. | +| Drop overlay | `f6c9166` | Soft fill + 3 px outline drawn ABOVE stacked cards for every legal target during drag. Replaces the hidden pile-marker tint. | +| Drop shadows | `f712b89` | Each card casts a 25 % black shadow; lifts to 40 % with bigger offset/halo while in the active drag set. | +| Stock badge | `655dfde` | "·N" chip at the top-right of the stock so players can see how close they are to a recycle. Hides at zero. | -## Open punch list — release prep (still deferred unless player chooses now) +Tagged as `v0.11.0` (commit `063269c` plus URL refresh). -1. **Cut `v0.11.0`** — meaningful slice since `v0.10.0`: full card-theme system (CARD_PLAN phases 1–7 + theme picker + hayeah art), HUD overhaul (band + fade), session 6's four bug fixes, and session 7's font fallback + four UX feel wins. (`git tag -d v0.1.0` first to clean up the stale local tag.) -2. **README + CHANGELOG refresh** — README was last touched at `a6b8348` before the Settings picker shipped; doesn't mention card themes, the auto-fade, or any of session 7's UX work. +## Session 7 round 2 (shipped 2026-05-02 afternoon) — v0.12.0 + +| Area | Commit | What landed | +|---|---|---| +| Aspect ratio | `13aa0fd` | `CARD_ASPECT` 1.4 → 1.4523 to match hayeah SVG dimensions; cards no longer ~3.6 % squashed. Vertical-budget math adapts via the constant. | +| Foundation flourish | `69ce9af` | King-on-foundation celebration: scale-pulse on the King, marker tints `STATE_SUCCESS`, synthesised C6→E6→G6 bell ping (~240 ms). New `FoundationCompletedEvent`. | +| Drag-cancel tween | `525fe0f` | Illegal drops glide each card back to its origin over 150 ms with a quintic ease-out (Responsive curve, zero overshoot). Audio cue still fires. ShakeAnim retained for non-drag rejection paths. | +| Focus pulse | `9887343` | Focus ring breathes at 1.4 s sin period over [0.65, 1.0] of native alpha. Static under `AnimSpeed::Instant`. | +| Achievement onboarding | `ca5788f` | First-win toast "First win! Press A to see your achievements." plus persisted `shown_achievement_onboarding` flag so the cue fires exactly once. | +| Mode Launcher shortcuts | `7dba772` | Digit 1–5 inside the Mode Launcher launches Classic / Daily / Zen / Challenge / TimeAttack. Locked modes silent no-op. Modal-scoped. | +| Docs (rode along) | `d8c7034`, `9f095c4` | README refresh for v0.11.0 features and corrected controls table; CHANGELOG.md added covering v0.9.0–v0.11.0. | + +The first three items in this round (`13aa0fd`, `69ce9af`, `525fe0f`) shipped before the v0.11.0 tag's commit window closed; treating them as v0.12.0 since v0.11.0 was already cut at `063269c`. + +## Open punch list — release prep + +1. **Tag v0.12.0** — meaningful slice since v0.11.0: six UX feel items + the README/CHANGELOG refresh. Tag at the doc-commit HEAD that closes this round. +2. **Push to origin** — three-plus commits unpushed. 3. **Desktop packaging** per `ARCHITECTURE.md §17`. The Arch PKGBUILD exists in `/home/manage/solitaire-quest-pkgbuild/` (separate repo, no remote yet). Pending: app icon, macOS `.icns` + notarisation cert, Windows `.ico` + Authenticode cert, AppImage recipe. ## Open punch list — UX iteration (next-round candidates) -The session-6 list is exhausted. Candidates for a next round, none formally requested by the player: +The v0.12.0 list is exhausted. Candidates for a future round: -- **Animated focus ring** (currently a static overlay; could pulse on focus change). -- **Achievement onboarding pass** — show first-time players the achievement panel after their first win. -- **Mode-switch keyboard shortcut** from inside the Mode Launcher (today only mouse opens it). -- **Runtime aspect-ratio fidelity** — hayeah SVGs are ~1.45 h/w; engine layout assumes 1.4. Cards render ~3 % squashed vertically. Cosmetic. -- **Foundation completion celebration** — when a foundation reaches its King, do a small flourish (sparkle, lift, sound). The auto-complete cascade already covers the win moment, but per-foundation closure is currently silent. -- **Drag-cancel return animation** — illegal drops snap cards back instantly. A short ease-back tween ("springs back to where it came from") would feel more forgiving. +- **Card-back theme support** — the current theme system swaps face SVGs but not the back. Players asked for animated backs in passing. +- **Streak fire animation** in the HUD when win-streak crosses 3, 5, 10. Foundation flourish suggests the per-suit completion pattern; streak milestones are the lifetime equivalent. +- **Score-breakdown reveal** at win — show base / time-bonus / no-undo bonus / mode multiplier as the score animates up. Currently the win modal just shows the final number. +- **Right-click radial menu** for power users: hold right-click on a card → quick-drop options without dragging. +- **Drag-with-keyboard** — Tab to a card, Enter to "lift", arrow keys to choose destination, Enter to drop. Keyboard-only completion of a game. +- **Settings: tooltip-delay slider** so power users can disable the 0.5 s hover delay. Cheap. ## Card-theme system (CARD_PLAN.md, fully shipped) -Seven phases landed across `b8fb3fb` → `924a1e2`. End-to-end: +Seven phases landed across `b8fb3fb` → `924a1e2` in v0.11.0: - **Bundled default theme** ships in the binary via `embedded://` — 52 hayeah/playing-cards-assets SVGs (MIT) + a midnight-purple `back.svg` (original work). - **User themes** live under `themes://` rooted at `solitaire_engine::assets::user_theme_dir()`. Drop a directory containing `theme.ron` + 53 SVG files; appears in the registry on next launch. -- **Importer** at `solitaire_engine::theme::import_theme(zip)` validates an archive (20 MB cap, zip-slip rejection, manifest validation, every SVG round-tripped through the rasteriser) and atomically unpacks. -- **Picker UI** in Settings → Cosmetic — one chip per registered theme; selection persists to `settings.json` as `selected_theme_id` and propagates to live sprites via `react_to_settings_theme_change` → `sync_card_image_set_with_active_theme` → `StateChangedEvent`. +- **Importer** at `solitaire_engine::theme::import_theme(zip)` validates an archive and atomically unpacks. +- **Picker UI** in Settings → Cosmetic. ## Resume prompt @@ -68,34 +84,32 @@ Seven phases landed across `b8fb3fb` → `924a1e2`. End-to-end: You are a senior Rust + Bevy developer working on Solitaire Quest. Working directory: . -Branch: master. Direction is OPEN — the session-6 UX punch list is -fully shipped. The player will choose between cutting v0.11.0, doing -release prep (README/CHANGELOG/packaging), or starting a new UX -iteration round. +Branch: master. Direction is OPEN — both UX iteration rounds shipped +and v0.12.0 is ready to tag. -State: HEAD=655dfde. Local master is 3 commits ahead of origin -(f6c9166, f712b89, 655dfde unpushed; fdb6c2e and 95df542 already -pushed). Working tree clean apart from untracked CARD_PLAN.md -(intentional). +State: HEAD at the doc-commit closing session 7 round 2. Local master +is several commits ahead of origin and unpushed. Working tree clean +apart from untracked CARD_PLAN.md (intentional). Build: cargo clippy --workspace --all-targets -- -D warnings clean. -Tests: 982 passed / 0 failed. +Tests: 1007 passed / 0 failed. READ FIRST (in order, before doing anything): 1. SESSION_HANDOFF.md — full state, session 7 changelog, punch list - 2. CLAUDE.md — hard rules (UI-first, no panics, etc.) - 3. ARCHITECTURE.md — crate responsibilities + data flow - 4. ~/.claude/projects//memory/MEMORY.md + 2. CHANGELOG.md — release-by-release record + 3. CLAUDE.md — hard rules (UI-first, no panics, etc.) + 4. ARCHITECTURE.md — crate responsibilities + data flow + 5. ~/.claude/projects//memory/MEMORY.md — saved feedback / project context (machine-local; may be missing on a fresh machine) DECISION TO ASK THE PLAYER FIRST: - A. Push the 3 unpushed commits and cut v0.11.0? - B. Skip the tag for now, refresh README + CHANGELOG, then tag? - C. Skip release prep entirely and start a new UX iteration round? - If C, see the session-7 next-round candidates list (animated - focus ring, achievement onboarding, mode-switch keyboard - shortcut, aspect-ratio fidelity, foundation completion flourish, - drag-cancel return tween). + A. Push the unpushed commits and cut v0.12.0 now. + B. Smoke-test the new feel layer first (foundation flourish, drag + tween, focus pulse, mode digits), then tag. + C. Skip the tag for another iteration round — see "next-round + candidates" in SESSION_HANDOFF for ideas. + D. Take the deferred desktop-packaging item (needs artwork + + signing certs from the user). WORKFLOW NOTES: - Commits use: @@ -105,6 +119,5 @@ WORKFLOW NOTES: - Every commit must pass build / clippy / test before pushing. - Push to GitHub (origin) — that is the canonical remote. -OPEN AT THE START: ask which of A / B / C. Don't pick unilaterally — -this is a directional choice, not a tactical one. +OPEN AT THE START: ask which of A / B / C / D. Don't pick unilaterally. ```