BLOBBO/src/ghost
type-two 194f3e22d3 feat(ui): course select on the title + per-course ghosts
The title screen now shows a course-select row: one card per course with its
emoji, name, your best time, and a ghost badge. The current course is
highlighted "you are here"; the others are links. COURSE_META in course/spec
is the one source of truth for the rotation — the title cards and the in-game
switcher both read it, so they can't drift.

Fixes a real cross-course bug found while scoping this: ghosts were stored
under one global key, so your Breakfast Rush ghost would replay through Butter
Run's walls. save/load/has/time now take an optional course key (threaded
installGhost -> recorder/player); the default course keeps the bare legacy key
so nobody's existing ghost is orphaned. The title's best/ghost line is
course-aware for the same reason.

Browser-verified with seeded storage: cards show per-course bests and ghost
badges independently, current-course card highlights, clicking a card loads
that course, breakfast's data untouched from butter. tsc + build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 17:22:48 +10:00
..
format.ts feat(ui): course select on the title + per-course ghosts 2026-07-20 17:22:48 +10:00
index.ts Lane H: ghost replay + title screen 2026-07-18 11:47:34 +10:00
install.ts feat(ui): course select on the title + per-course ghosts 2026-07-20 17:22:48 +10:00
player.ts feat(ui): course select on the title + per-course ghosts 2026-07-20 17:22:48 +10:00
recorder.ts feat(ui): course select on the title + per-course ghosts 2026-07-20 17:22:48 +10:00
verify-drift.ts Lane H: ghost replay + title screen 2026-07-18 11:47:34 +10:00