From 93e9165a885bed105fa54a3ed0ed951c2d97aadb Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Fri, 30 Oct 2026 04:45:08 +0100 Subject: [PATCH] feat(mockups): 17 voyage with real content (FLAC, synced lyrics, Odyssey passage) Co-Authored-By: Claude Opus 5.5 --- docs/design/002-direction-round-notes.md | 7 + .../17-voyage-real-report.md | 133 +++ src/mockups/17-voyage-real/chart.ts | 65 ++ src/mockups/17-voyage-real/content.ts | 114 +++ src/mockups/17-voyage-real/fanworks.ts | 72 ++ src/mockups/17-voyage-real/figures.ts | 269 ++++++ src/mockups/17-voyage-real/frieze.ts | 226 +++++ src/mockups/17-voyage-real/main.ts | 437 +++++++++ src/mockups/17-voyage-real/panel.ts | 599 ++++++++++++ src/mockups/17-voyage-real/player.ts | 139 +++ src/mockups/17-voyage-real/ribbons.ts | 190 ++++ src/mockups/17-voyage-real/scene.ts | 732 +++++++++++++++ src/mockups/17-voyage-real/style.css | 858 +++++++++++++++++- src/mockups/17-voyage-real/threads.ts | 236 +++++ 14 files changed, 4076 insertions(+), 1 deletion(-) create mode 100644 docs/design/002-sea-chart-spikes/17-voyage-real-report.md create mode 100644 src/mockups/17-voyage-real/chart.ts create mode 100644 src/mockups/17-voyage-real/content.ts create mode 100644 src/mockups/17-voyage-real/fanworks.ts create mode 100644 src/mockups/17-voyage-real/figures.ts create mode 100644 src/mockups/17-voyage-real/frieze.ts create mode 100644 src/mockups/17-voyage-real/panel.ts create mode 100644 src/mockups/17-voyage-real/player.ts create mode 100644 src/mockups/17-voyage-real/ribbons.ts create mode 100644 src/mockups/17-voyage-real/scene.ts create mode 100644 src/mockups/17-voyage-real/threads.ts diff --git a/docs/design/002-direction-round-notes.md b/docs/design/002-direction-round-notes.md index d2f3e13..70fcd58 100644 --- a/docs/design/002-direction-round-notes.md +++ b/docs/design/002-direction-round-notes.md @@ -341,6 +341,13 @@ and brief one agent from a copy of 16, using `/content/library.json`, `parseLrc` - Resumed from §18. 17 (real content) is started now, as agreed; the user's reaction to 16 is asked in parallel. +- **17 is finished and committed**; report in `docs/design/002-sea-chart-spikes/17-voyage-real-report.md`. + Real FLAC playback with seeking, line-synced lyrics (click a line to seek), the Butler Odyssey passage + in a reading view, fallback to 16 without the folder. Agent's choices: "Play voyage" stays silent (no + excerpts, avoids near-autoplay); part buttons dropped in real mode (sample part times don't match the + recordings). Open: passage start points are keyword guesses; parts/motifs aren't timed to the + recordings yet (report proposes a small mapping file in the content folder). + ## Open questions (in priority order) 1. ~~Which sea-chart approach (08–11) reads best, or which mix?~~ 11's navigation + 10's style (§9). diff --git a/docs/design/002-sea-chart-spikes/17-voyage-real-report.md b/docs/design/002-sea-chart-spikes/17-voyage-real-report.md new file mode 100644 index 0000000..54d0ebe --- /dev/null +++ b/docs/design/002-sea-chart-spikes/17-voyage-real-report.md @@ -0,0 +1,133 @@ +# 17 Voyage with real content — report + +Status: **done** (not committed). Built from `17-voyage-real-brief.md`, starting from a copy of 16. + +## What was built + +`src/mockups/17-voyage-real/` is 16 unchanged on the stage (look 2, Inter labels, frieze accents, five +beats, stylised 3D, combined paths, fan works placeholders). Only the content side changed. URL params +are as in 16, plus **`?read=1`**, which opens About's Odyssey reading view for the first song (used for +screenshots). + +- **`content.ts`** (new) reads the mounted folder at runtime: + - `loadLibrary()` fetches `/content/library.json` before the panel is built (top-level await, 4 s + timeout). A 404 or a failure means "not mounted". + - `realFor(song)` matches a sample song to the library by normalised title. Case, accents, + apostrophes and punctuation are ignored. A miss is logged once and does not crash. + - `loadLyrics()` parses `.lrc` files with `parseLrc` (`src/shared/lrc.ts`) and splits `.txt` files + into plain lines. `loadBook()` fetches `/content/homer/odyssey/.json`. Both are cached. + - It also holds the keywords that mark each song's passage, `passageStart()`, and a footnote-marker + stripper for Gutenberg's inline note numbers. + - Only types are imported from `src/content/`. + +1. **Real player** (`player.ts`, `panel.ts`). + - The `