docs: mark UX overhaul Phase 3 complete in SESSION_HANDOFF
All 10 steps landed; commit list, smoke-test checklist, and open follow-ups updated for the next session.
This commit is contained in:
+45
-62
@@ -1,10 +1,10 @@
|
|||||||
# Solitaire Quest — UX Overhaul Session Handoff
|
# 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
|
## 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)
|
### 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`).
|
- **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.
|
- 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.
|
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)
|
## 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_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`.
|
- **`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 (Phase 3, latest first)
|
||||||
|
|
||||||
## Commits this session
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
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
|
3b619b8 feat(engine): convert HomeScreen to modal scaffold + Done button
|
||||||
37681cf feat(engine): convert LeaderboardScreen 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
|
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
|
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 |
|
The whole overhaul is on disk. Worth running through once end-to-end:
|
||||||
|---|---|---|
|
|
||||||
| 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(<literal>)`/font-size literal and migrate. Clippy gates this — anything left over surfaces during the build. |
|
|
||||||
|
|
||||||
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.
|
## Resume prompt for the next session
|
||||||
- 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 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:
|
819 tests pass / 0 fail / 8 ignored. Clippy clean.
|
||||||
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
|
|
||||||
|
|
||||||
The foundation (ui_theme.rs, ui_modal.rs), the HUD restructure, and
|
Next likely directions:
|
||||||
all 8 read-only overlay conversions are committed. Steps 6 → 10 are
|
1. Smoke-test the build end-to-end and report regressions (see the
|
||||||
documented in SESSION_HANDOFF.md and listed in
|
checklist in SESSION_HANDOFF.md).
|
||||||
.claude/projects/.../memory/MEMORY.md.
|
2. Decide what to do with the Home modal (kbd ref vs mode launcher
|
||||||
|
vs delete).
|
||||||
Pick up at step 6 (Pause modal + folded-in Forfeit modal). Same
|
3. Phase 4 — feature work, sound design, or accessibility, depending
|
||||||
shape as the existing modal conversions: spawn_modal scaffold, real
|
on user priority.
|
||||||
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 <root@vscode.infinity> 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.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user