diff --git a/SESSION_HANDOFF.md b/SESSION_HANDOFF.md index b950cfb..1e1bf2c 100644 --- a/SESSION_HANDOFF.md +++ b/SESSION_HANDOFF.md @@ -1,10 +1,10 @@ # Solitaire Quest — UX Overhaul Session Handoff -**Last updated:** 2026-04-30 — paused mid-overhaul to push and let the user smoke-test before resuming. +**Last updated:** 2026-04-30 — Phase 3 complete. All 10 steps landed; ready for full smoke-test. ## Where we are -Phase 3 of the UX overhaul brief in `docs/UX_OVERHAUL_BRIEF.md` (or the inline brief used to kick off the work). 11 commits landed this session — the foundation, the HUD, and every read-only overlay have been migrated to the new design system. Pause / Settings / Onboarding modals, animation upgrades, and the final literal sweep are still pending. +Phase 3 of the UX overhaul brief is **done**. The whole engine has been migrated to the `ui_theme` design-token system + `ui_modal` scaffold. Animation system upgraded. Final literal sweep landed. The work spans 17 commits this session, from the foundation (`e14852c`) through to the final sweep (`54e024c`). ### Design direction (already saved as project memory) @@ -12,21 +12,27 @@ Phase 3 of the UX overhaul brief in `docs/UX_OVERHAUL_BRIEF.md` (or the inline b - **Palette:** Midnight Purple base (`BG_BASE` `#1A0F2E` → `BG_ELEVATED` `#2D1B69` → `BG_ELEVATED_HI` `#3A2580` → `BG_ELEVATED_TOP` `#482F97`) + Balatro yellow primary accent (`ACCENT_PRIMARY` `#FFD23F`) + warm magenta secondary (`ACCENT_SECONDARY` `#FF6B9D`). - See [memory/project_ux_overhaul_2026-04.md](.claude/projects/-home-manage-Rusty-Solitare/memory/project_ux_overhaul_2026-04.md) for the full direction. -### Top complaints from the original smoke test +### Top complaints from the original smoke test — all closed 1. **HUD too cluttered.** ✅ Closed by `73cad7e` — readouts now sit in a 4-tier vertical stack with progressive disclosure of penalty/bonus tiers. -2. **Y/N keyboard prompts feel like debug panels.** ✅ Closed for the Confirm + GameOver modals (`3f922ed`, `242b5fe`); still open for the Forfeit toast countdown (folded into step 6 below). +2. **Y/N keyboard prompts feel like debug panels.** ✅ Closed across Confirm, GameOver, Pause, Forfeit, and Settings modals — every prompt now has real Primary/Secondary/Tertiary buttons with hover/press feedback. ## Foundation (done) - **`solitaire_engine/src/ui_theme.rs`** — every design token: colours, 5-rung typography scale, 4-multiple spacing scale, three radius rungs, monotonically-ordered z-index hierarchy, motion durations with `scaled_duration(speed)` helper. - **`solitaire_engine/src/ui_modal.rs`** — `spawn_modal` scaffold + `spawn_modal_header` / `spawn_modal_body_text` / `spawn_modal_actions` / `spawn_modal_button` helpers + `ButtonVariant` enum (Primary / Secondary / Tertiary) + `paint_modal_buttons` system. `UiModalPlugin` registered in `solitaire_app/src/main.rs`. -Every overlay conversion follows the same pattern: drop the bespoke scrim/card, call `spawn_modal(MarkerComponent, Z_MODAL_PANEL, |card| { ... })`, swap inline colours for tokens, replace "Press X to close" prose with a primary `Done` button + matching click-handler system. - -## Commits this session +## Commits this session (Phase 3, latest first) ``` +54e024c chore(engine): final literal-to-token sweep +3a01318 feat(engine): upgrade animations — curves, scoped settle, deal jitter, cascade rotation +79d3917 chore(data): derive Copy on AnimSpeed +ba019c0 feat(engine): convert SettingsPanel to modal scaffold + Done button +18d7c12 feat(engine): convert OnboardingPlugin to 3-slide modal flow +cb93bd9 fix(engine): pin modals via GlobalZIndex and surface forfeit-no-op toast +6723416 feat(engine): convert PauseScreen to modal + add ForfeitConfirmScreen +afb0879 docs: add SESSION_HANDOFF.md mid-overhaul checkpoint 3b619b8 feat(engine): convert HomeScreen to modal scaffold + Done button 37681cf feat(engine): convert LeaderboardScreen to modal scaffold + Done button 99064ce feat(engine): convert ProfileScreen to modal scaffold + Done button @@ -40,69 +46,46 @@ deb034c feat(engine): convert HelpScreen to real-button modal with kbd-chip rows e14852c feat(engine): add ui_theme.rs design-token module ``` -**Test status across every commit:** `cargo build --workspace` clean, `cargo clippy --workspace -- -D warnings` clean, **797 tests pass / 0 failed / 8 ignored**. +**Test status:** `cargo build --workspace` clean, `cargo clippy --workspace -- -D warnings` clean, **819 tests pass / 0 failed / 8 ignored**. -## What's still on disk in pre-overhaul style +## Smoke-test checklist -| Step | Area | What it'll touch | -|---|---|---| -| 6 | Pause overlay + Forfeit modal | `pause_plugin.rs` (replace bespoke spawn with modal scaffold); fold Forfeit toast countdown into a real Cancel/Forfeit modal — Forfeit then becomes a button inside Pause. Tests around `forfeit_countdown` will need updating. | -| 7 | Settings panel | `settings_plugin.rs` — replaces the side-panel pattern with the modal scaffold. Sections: Audio / Gameplay / Cosmetic / Sync. The existing per-button click handlers stay; only the spawn structure and styling change. | -| 8 | Onboarding | `onboarding_plugin.rs` — multi-slide flow (Welcome → Drag-drop demo → Hotkeys), navigated by a primary `Next` button + arrow-key accelerators. Final slide `Start playing` writes `first_run_complete` like today. | -| 9 | Animation upgrades | `animation_plugin.rs`, `feedback_anim_plugin.rs`, `card_animation/`, `win_summary_plugin.rs` — promote `card_animation::MotionCurve` to default for slide; settle bounce only on the moved card; deal stagger ±10% jitter; win cascade with `Expressive` curve + per-card rotation; align all durations through `ui_theme::scaled_duration`. | -| 10 | Literal-to-token sweep | Grep the engine for any remaining `Color::srgb`/`Val::Px()`/font-size literal and migrate. Clippy gates this — anything left over surfaces during the build. | +The whole overhaul is on disk. Worth running through once end-to-end: -ETA for the rest: roughly 5–7 more focused commits, each independently passing `build` / `clippy` / `test`. +1. **Run the game.** `cargo run -p solitaire_app --features bevy/dynamic_linking`. +2. **HUD layout** reads as 4 stacked tiers (Score / Mode / Penalty / Selection) with the new midnight-purple palette. +3. **Open every overlay** — `S` (Stats), `A` (Achievements), `P` (Profile), `O` (Settings), `L` (Leaderboard), `M` (Home), `F1` (Help). Each is a centred card on a uniform scrim with a yellow `Done` / `Close` primary button. Hover/press states on every button. +4. **Settings.** Four sections (Audio / Gameplay / Cosmetic / Sync). Body scrolls within the modal on small windows; `Done` button stays fixed at the bottom regardless of scroll. Card-back / Background pickers tint the selected swatch with `STATE_SUCCESS`. +5. **Confirm flow.** Click `New Game` while a game is in progress — the abandon-current-game modal has real Cancel/Confirm buttons. `Y/Enter` and the yellow primary button start a new game; `N/Esc` and the secondary button cancel. +6. **Pause + Forfeit.** Press `Esc` — pause modal shows real Resume / Forfeit buttons. Forfeit button opens a Cancel/Forfeit confirmation modal stacked above the pause modal (z-index ordered correctly via `GlobalZIndex`). +7. **First-run onboarding.** Delete `settings.json` (or set `first_run_complete = false`) — three-slide flow shows: Welcome → How to play → Keyboard shortcuts. Navigate with `Next` / `Back` buttons or `→` / `←` accelerators. `Esc` skips on slide 0. +8. **Animations.** + - Slide a card to a pile — motion curves through `SmoothSnap` (slight overshoot + settle), not linear lerp. + - Drop a card on a valid destination — only the moved cards bounce; the rest of the table stays still. + - Start a new game — deal stagger is no longer mechanically uniform; cards land with subtle ±10% timing variation. + - Win a game — cascade now uses `Expressive` curve with per-card ±15° Z-rotation, screen shake driven by the new `MOTION_WIN_SHAKE_*` tokens. +9. **Resize the window** — cards still snap, no "snap-back-and-forth" jitter. +10. **Win modal** — restyled with the design tokens: midnight-purple card, yellow `Play Again` button. -## Smoke-test checklist before resuming +## Open follow-ups (not blockers) -The user smoke-tested at the action-bar checkpoint and reported "nothing looks off". Worth re-running once these 11 commits are pushed so the next session starts from a verified baseline: +- **Home / Help redundancy.** Home is still a kbd-reference modal that mostly duplicates Help. Three options: (1) keep as-is, (2) convert into a true mode launcher (Classic / Daily / Zen / Challenge / Time Attack cards, locked options visibly disabled below level 5), (3) drop entirely now that the action bar covers everything Home does. Worth asking the user which direction they want. +- **Forfeit countdown toast** is now superseded by the Forfeit modal (`6723416`). Confirm the toast path is no longer reachable when smoke-testing. +- **Sub-rung pixel sizes** (1 px borders, 64/80/110/150/160 px fixed widths, 28/36/50 px specific spacings) were intentionally left as literals during the step-10 sweep — they're below the smallest `SPACE_*` rung. If the design system grows a "fine" spacing tier in the future, those become candidates for migration. -- HUD layout reads as 4 stacked tiers (Score / Mode / Penalty / Selection) with the new midnight-purple palette. -- Open every overlay (S, A, P, O, L, M, F1) — each should now be a centred card on a uniform scrim, with a `Done` primary button. -- Click `New Game` while a game is in progress — the abandon-current-game modal should be a real-button card; both `Y/Enter` and the yellow primary button start a new game; both `N/Esc` and the secondary button cancel. -- Force a stuck state — the Game Over modal should show real Undo / New Game buttons. -- Resize the window — cards still snap, no "snap-back-and-forth" jitter (covered by previous fixes `366fd6d` / `b10e1a5`). -- Press G to forfeit — still uses the toast countdown (step 6 will replace this with a modal). - -## Kickoff prompt for the next session - -Paste this at the start of a fresh chat to resume: +## Resume prompt for the next session ``` -Resume the UX overhaul of Solitaire Quest at /home/manage/Rusty_Solitare/. +The Solitaire Quest UX overhaul Phase 3 is complete (HEAD=54e024c). +Read SESSION_HANDOFF.md and CLAUDE.md before doing anything new. -Read these in order before doing anything: - 1. SESSION_HANDOFF.md (this file) - 2. CLAUDE.md (project conventions; UI-first principle) - 3. The "Design direction" section of - ~/.claude/projects/-home-manage-Rusty-Solitare/memory/project_ux_overhaul_2026-04.md +819 tests pass / 0 fail / 8 ignored. Clippy clean. -The foundation (ui_theme.rs, ui_modal.rs), the HUD restructure, and -all 8 read-only overlay conversions are committed. Steps 6 → 10 are -documented in SESSION_HANDOFF.md and listed in -.claude/projects/.../memory/MEMORY.md. - -Pick up at step 6 (Pause modal + folded-in Forfeit modal). Same -shape as the existing modal conversions: spawn_modal scaffold, real -buttons, hotkey-hint chips, ui_theme tokens for every colour / -spacing / typography decision. Update or replace any test that -asserted the prior bespoke layout. - -Each commit must pass `cargo build --workspace`, -`cargo clippy --workspace -- -D warnings`, and `cargo test --workspace` -clean. Use commits authored by funman300 via -the -c flag (per the user's convention; never write to git config). - -Stop after step 6 and ask the user to smoke-test before continuing to -step 7. They prefer pause-and-verify over running through the -remaining 4 steps in one push. +Next likely directions: +1. Smoke-test the build end-to-end and report regressions (see the + checklist in SESSION_HANDOFF.md). +2. Decide what to do with the Home modal (kbd ref vs mode launcher + vs delete). +3. Phase 4 — feature work, sound design, or accessibility, depending + on user priority. ``` - -## Open question - -When the next session resumes, ask whether the user wants to: - -1. **Keep Home as a kbd-reference modal** (current state — duplicates Help). -2. **Convert Home into a true mode launcher** (Classic / Daily / Zen / Challenge / Time Attack cards, locked options visibly disabled below level 5) per the original Phase 2 proposal. The action-bar `Modes` popover already covers this path; pivoting Home buys discoverability for first-time players who hit `M`. -3. **Drop Home entirely.** With the action bar covering every action and Help covering every shortcut, Home may be redundant.