feat(tour): highlight each step, and make the comparing steps try both looks

Owner feedback on the forced tour. Each step rings what it is about and,
while forced, dims the rest of the page around it. "Pick a layout" and the
Timeline step hold Continue until both options have been on screen, scroll
their subject to the top of the window and, on wide screens, move the card
to the right edge so the page has room to show the difference.

Guards for the reported snap-back and endless tour, which did not
reproduce: the effect that moves an unseen reader to Relaxed fires at most
once per page load and never after the tab saw the tour done, and setup
saves only the prefs it changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-18 05:10:42 +02:00
1 parent 94fba4d7b5
commit 5be04a7439
8 files changed
+307 -72

No files matched your search

+12 -4
View File
@@ -634,13 +634,21 @@ legend on the same baseline as "Next: …".
- **The tour (2026-10-18, owner).** Every reader takes it once before using the app: new readers
straight after setup, returning readers on their first visit, and readers who saw the earlier tour
once more. Routines → Checklist → Pick a layout → Timeline → Redeem codes → Archive → Settings.
- It floats over the page it describes. While forced, the page behind is `inert` under a light
scrim. It can be scrolled and seen, but not clicked. There is no Skip, and a reload restarts at
step 1.
- It floats over the page it describes. While forced, the page behind is `inert`. It can be
scrolled and seen, but not clicked. There is no Skip, and a reload restarts at step 1.
- Each step rings what it is about (owner, 2026-10-18: greying the page "makes sense, but it should
highlight the option"): the nav tab for Routines, Checklist, Archive and Settings, the Checklist
or the Timeline board for the two comparing steps, the codes list for codes. While forced, the
rest of the page is dimmed around it. The ring is a fixed layer drawn over the target's box
(`TourSpotlight`), not the target raised above a scrim, so no stacking context can trap it.
- "Pick a layout" (on the Checklist) and the Timeline step each hold a two-way switch, Relaxed /
Structured and New / Classic. The switch changes the page behind in place, and the selected one
is kept. Readers are shown the difference rather than told about it, because most never open
Appearance.
Appearance. Continue waits until both options have been on screen (owner: it "should *require*
you to have tested both"); the look showing when the step opens counts as one. These two steps
move the card to the right edge on wide screens (≥1100px) and scroll their subject to the top of
the window, past the code and release banners, so the page has room to show the difference. On a
phone the card stays at the foot, shortened, with the options side by side.
- Returning readers are moved to Relaxed as the tour opens. New readers keep the look they chose in
setup.
- Continue stays in a fixed place and Back sits beside it. Only a replay ("Replay the
@@ -950,3 +950,21 @@ Schema review: no data-loss or stuck-state path. Accepted, by the owner's rule:
had picked Structured on purpose is moved to Relaxed once, and the previous value isn't kept. The tour's
layout step puts it back in one click. Left as is (low): a stale second tab can re-force the tour
once, and a save-error banner shown during a forced tour can be read but not clicked.
### Owner feedback on the forced tour (2026-10-18)
- **Highlight, try both, room for the Timeline.** Done; see `docs/DESIGN.md` → "The tour". Each
step rings its subject, the comparing steps hold Continue until both options have been on screen,
and they dock the card to the side and scroll their subject to the top.
- **Not reproduced, paused by the owner's call:** the owner saw the layout and Timeline switches snap
back ("you have to click like 5 times"), and the tour start again right after Finish tour, without
end. It did not reproduce in Chrome with one, two or three tabs, locally or on the live site, from
a fresh setup or a returning reader (a save logger showed each click written once, and nothing
writing it back). The only code that writes `interface` and `redesignTourSeen` on its own is the
"unseen" effect in `ReaderApp.tsx` (Relaxed + `"returning"`), and it would cause both symptoms if
it fired in some tab after the tour was finished; it now fires at most once per page load and
never after that tab saw the tour done. Setup now saves only the prefs it changed, not the whole
object, so a setup finished in a stale second tab leaves every other setting alone (the ones setup
sets, `redesignTourSeen` among them, it still writes: at worst that tab shows the tour once more). If it recurs:
log every `gacha-tracker:v2:reader` write with a stack (wrap `Storage.prototype.setItem`) in the
owner's own browser, with their data, and note which tabs are open and which build each runs.