docs(handoff): record ESC accelerator; B's next step is HC polish

Post-v0.21.4 fourth carve-out: 90e24d9 wires ESC for replay-stop
with a cross-plugin gate in pause_plugin to defer when replay is
playing. Footer extended in lockstep to
[SPACE] pause/resume · [ESC] stop. Update Since-cut log,
visual-identity bullet, B option in the Resume menu, status
(1240 → 1243 tests), and HEAD hint.

B option's next-step menu now has three branches: HC polish
(smallest), ← / → wiring (medium, needs backwards-step path),
and the multi-session move-log/preview arcs that close B-2.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-08 16:07:33 -07:00
parent 90e24d9711
commit 3cc8eacafa
+71 -39
View File
@@ -35,11 +35,12 @@ resume.
- **`artwork/` directory:** still untracked. Intentional. - **`artwork/` directory:** still untracked. Intentional.
- **Build:** `cargo clippy --workspace --all-targets -- -D warnings` - **Build:** `cargo clippy --workspace --all-targets -- -D warnings`
clean. clean.
- **Tests:** **1240 passing / 0 failing** across the workspace - **Tests:** **1243 passing / 0 failing** across the workspace
(1228 in v0.21.4 + 4 from `fe68861`'s scrub-notch tests + 4 (1228 in v0.21.4 + 4 from `fe68861`'s scrub-notch tests + 4
from `d322abf`'s notch-label tests + 4 from `1873b3f`'s from `d322abf`'s notch-label tests + 4 from `1873b3f`'s
keybind-footer tests). Detail in `CHANGELOG.md` § [0.21.4] keybind-footer tests + 3 from `90e24d9`'s ESC-accelerator
§ Stats; post-cut delta tracked here. tests). Detail in `CHANGELOG.md` § [0.21.4] § Stats; post-cut
delta tracked here.
- **Tags on origin:** `v0.9.0` through `v0.21.4`. v0.21.4 is on - **Tags on origin:** `v0.9.0` through `v0.21.4`. v0.21.4 is on
`23ff62c`; v0.21.3 stays on `3d92a91`; v0.21.2 stays on `23ff62c`; v0.21.3 stays on `3d92a91`; v0.21.2 stays on
`f23df3b`; v0.21.1 stays on `daa655a`; v0.21.0 stays on `f23df3b`; v0.21.1 stays on `daa655a`; v0.21.0 stays on
@@ -96,6 +97,19 @@ resume.
footer text spawns. 1px top border in `BORDER_SUBTLE` footer text spawns. 1px top border in `BORDER_SUBTLE`
separates the footer from the labels row. 4 new tests; separates the footer from the labels row. 4 new tests;
1236 → 1240. 1236 → 1240.
- **`90e24d9` — `feat(replay): wire ESC accelerator for stop,
gate pause modal`.** ESC during an active replay now stops it
(mirrors the Stop button click). New `handle_stop_keyboard`
system in `replay_overlay.rs` parallels `handle_pause_keyboard`
in shape. Cross-plugin coordination via `pause_plugin::toggle_pause`:
added a fourth defer-if check
(`replay_state.is_some_and(|s| s.is_playing())`) right after
`other_modal_scrims` and before `selection`. Symmetric to the
existing modal-stack defer pattern. Footer hint extended from
`[SPACE] pause/resume` → `[SPACE] pause/resume · [ESC] stop`
in lockstep with the wiring; the only-wired-keybinds
discipline holds. 3 new tests + 1 updated helper-pin test;
1240 → 1243.
Banner geometry is now mutable — every prior B-2 commit fit Banner geometry is now mutable — every prior B-2 commit fit
inside fixed 60 px space, but the notch-labels commit inside fixed 60 px space, but the notch-labels commit
@@ -105,21 +119,29 @@ again. The next sub-pieces need significantly more vertical
room and follow the same shape. room and follow the same shape.
Next finite step on B-2: choices are Next finite step on B-2: choices are
1. **Wire ESC for stop** + extend the keybind-footer text to 1. **Wire ← / → for prev/next move** — needs a "step
`[SPACE] pause/resume · [ESC] stop`. Small, single-axis
commit. UI-first contract for the existing Stop button gets
a keyboard accelerator; the footer carrying only-wired
keybinds means the text update is in lockstep.
2. **Wire ← / → for prev/next move** — needs a "step
backwards" path in `replay_playback`, which currently only backwards" path in `replay_playback`, which currently only
supports forward stepping. Bigger; new state plumbing. supports forward stepping. Backwards stepping is non-trivial:
3. **Move-log scroller / mini-tableau preview** — both need the `Replay` carries the move list but no intermediate game
states, so rewinding means either replaying-from-start to
`cursor - 1` or hooking into the game's undo system. New
state plumbing either way. Footer hint would extend to
`[SPACE] pause/resume · [ESC] stop · [← →] step` in
lockstep with the wiring.
2. **Move-log scroller / mini-tableau preview** — both need
a much larger banner-height grow (effectively the takeover a much larger banner-height grow (effectively the takeover
container itself). Bigger arcs. container itself). Bigger arcs; the natural place to land
the layout reflow that turns the banner into a takeover.
3. **HC-mode coverage for the new banner pieces** — labels
and footer texts currently use `TEXT_SECONDARY`; under HC
mode they should bump to `TEXT_PRIMARY` (or use the
`HighContrastBorder` marker pattern for the 1 px borders).
Small accessibility polish.
Recommended order: ESC (option 1) next as the smallest Recommended order: option 3 (HC polish) is the smallest next
cadence-preserving step, then either ← / → or move-log/preview step and keeps the cadence; option 1 (← / →) is the right
depending on appetite. medium-scope next-feature; option 2 is the multi-session arc
that closes B-2.
## Open punch list ## Open punch list
@@ -168,13 +190,17 @@ palette refresh all shipped in v0.20.0 + v0.21.0. What stays open:
(banner 60 → 76 px to make room for a 16 px label row). (banner 60 → 76 px to make room for a 16 px label row).
Keybind-hint footer (vim-style mode line + `[SPACE] Keybind-hint footer (vim-style mode line + `[SPACE]
pause/resume`) shipped post-v0.21.4 in `1873b3f` (banner pause/resume`) shipped post-v0.21.4 in `1873b3f` (banner
76 → 92 px). Banner geometry is now mutable. What still 76 → 92 px). ESC accelerator wiring (with cross-plugin gate
needs to land: ESC accelerator wiring (small) + ← / → in `pause_plugin::toggle_pause`) shipped post-v0.21.4 in
scrub keys (needs new backwards-step path), then the `90e24d9`; footer hint extended to
bigger pieces — a move-log scroller and a mini-tableau `[SPACE] pause/resume · [ESC] stop` in lockstep. Banner
preview — both screen-takeover-only pieces that need a geometry is now mutable. What still needs to land: ← / →
much larger banner height grow (effectively the takeover scrub keys (needs new backwards-step path), HC-mode
container itself). Multi-session. coverage for the new banner pieces (labels + footer
texts), then the bigger pieces — a move-log scroller and a
mini-tableau preview — both screen-takeover-only pieces
that need a much larger banner height grow (effectively the
takeover container itself). Multi-session.
- *Floating `MOVE N/M` chip above the focused card during - *Floating `MOVE N/M` chip above the focused card during
playback — closed 2026-05-08 by `2fb2d63`.* World-space playback — closed 2026-05-08 by `2fb2d63`.* World-space
`Text2d` entity sibling to the banner overlay; uses the same `Text2d` entity sibling to the banner overlay; uses the same
@@ -327,10 +353,11 @@ v0.21.1 at daa655a, v0.21.0 at 04f9bf9. Working tree clean. See
CHANGELOG.md § [0.21.4] for full detail. CHANGELOG.md § [0.21.4] for full detail.
State: HEAD locally — see `git rev-parse HEAD`. Post-cut HEAD is State: HEAD locally — see `git rev-parse HEAD`. Post-cut HEAD is
`1873b3f` (three carved-out commits on top of v0.21.4 — scrub- `90e24d9` (four carved-out commits on top of v0.21.4 — scrub-bar
bar notches `fe68861`, notch labels `d322abf`, keybind-hint notches `fe68861`, notch labels `d322abf`, keybind-hint footer
footer `1873b3f`). All workspace tests pass (1240; check with `1873b3f`, ESC accelerator + pause-modal gate `90e24d9`). All
`cargo test --workspace`), clippy clean. workspace tests pass (1243; check with `cargo test --workspace`),
clippy clean.
READ FIRST (in order, before doing anything): READ FIRST (in order, before doing anything):
1. SESSION_HANDOFF.md — this file 1. SESSION_HANDOFF.md — this file
@@ -363,19 +390,24 @@ DECISION TO ASK THE PLAYER FIRST:
0/25/50/75/100 %); percentage labels under each notch 0/25/50/75/100 %); percentage labels under each notch
shipped in `d322abf` (banner 60 → 76 px — first layout shipped in `d322abf` (banner 60 → 76 px — first layout
change); keybind-hint footer shipped in `1873b3f` change); keybind-hint footer shipped in `1873b3f`
(banner 76 → 92 px — vim-style mode line on the left, (banner 76 → 92 px — vim-style mode line + `[SPACE]
`[SPACE] pause/resume` on the right). Banner geometry pause/resume`); ESC accelerator wiring shipped in
is now mutable. The natural next finite step is to `90e24d9` (cross-plugin gate in `pause_plugin`; footer
**wire ESC for stop** and extend the footer text to extended to `[SPACE] pause/resume · [ESC] stop`).
`[SPACE] pause/resume · [ESC] stop` — small, single- Banner geometry is now mutable. Natural next finite
axis, surfaces another keyboard accelerator alongside steps:
the existing Stop button. After that: ← / → for 1. **HC-mode coverage** for the new banner pieces
prev/next move (needs new backwards-step path in (labels + footer texts use `TEXT_SECONDARY`; under
`replay_playback`), then move-log scroller and mini- HC they should bump). Smallest next step.
tableau preview — both screen-takeover-only pieces that 2. **Wire ← / → for prev/next move.** Needs a
need a much larger banner-height grow (effectively the backwards-step path in `replay_playback` — either
takeover container itself). Mockup at replay-from-start or hook into the game's undo
`docs/ui-mockups/replay-overlay-mobile.html`. system. Medium-scope next-feature.
3. **Move-log scroller / mini-tableau preview** — both
need a much larger banner-height grow (effectively
the takeover container itself). Multi-session arcs
that close B-2.
Mockup at `docs/ui-mockups/replay-overlay-mobile.html`.
C. Phase 8 (sync) — local storage scaffolding, self-hosted C. Phase 8 (sync) — local storage scaffolding, self-hosted
Axum server, `SolitaireServerClient` impl, GPGS stub Axum server, `SolitaireServerClient` impl, GPGS stub
wired into Settings. The biggest open arc by scope; rolls wired into Settings. The biggest open arc by scope; rolls