feat(mockups): 15 voyage look 2 (cohesive look 2, paths A strip / B in world / C timeline)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Lucas Winther
2026-10-30 02:26:27 +01:00
co-authored by Claude Opus 5.5
parent 50c54c1949
commit bd84e177e6
13 changed files with 3057 additions and 1 deletions
+3
View File
@@ -82,3 +82,6 @@ Small, specific, independently actionable. Remove only when actually done.
- [ ] `src/mockups/07-sea-voyage/`: per-frame `Color`/`Vector3` allocations; WebGL probe context is not released.
- [ ] `src/mockups/07-sea-voyage/`: no `webglcontextlost` handler; DPR is read once.
- [ ] `src/mockups/07-sea-voyage/`: waypoint tag `innerHTML` is unescaped; drawer clips the "The open sea" label.
- Mockup 14: the cave-mouth mask may repeat as holes during the curtain drop (Chrome, oversized mask
region). Fixed in 15 by shrinking the region; 14 left as is (superseded).
+6
View File
@@ -250,6 +250,12 @@ mockup of the transition.
- **C. Timeline at the bottom** — the step bar becomes a horizontal song timeline with motif threads
under it (the original "big horizontal line"), with "you are here".
- **15 is finished and committed** (`feat/sea-chart-round`, not pushed); report in
`docs/design/002-sea-chart-spikes/15-voyage-look2-report.md`. Preview rebuilt with 01–15.
Agent's recommendation (unconfirmed): C (bottom timeline) as the home for paths, with B's ribbons
as an optional extra in 3D. Known: B's labels stack over the cave mouth; A is dense (numbers only);
C takes ~220px of stage height.
## Open questions (in priority order)
1. ~~Which sea-chart approach (08–11) reads best, or which mix?~~ 11's navigation + 10's style (§9).
@@ -0,0 +1,123 @@
# 15 Voyage, look 2 — report
Status: **done** (not committed). Built from `15-voyage-look2-brief.md`, starting from a copy of 14.
## What was built
`src/mockups/15-voyage-look2/` is 14's five-beat voyage with its side panel, tabs, placeholders and URL
params (`?beat=` `?t=` `?play=` `?tab=` `?panel=0`). New params: **`?paths=a|b|c`** (default `a`) and
**`?motif=<id>`** (starts with that motif highlighted).
1. **Look 2 only.** The look toggle, look 3's palette, sail and panel code and the `Look` type are gone.
Look 2's colours are unchanged: teal and cream sea, cream sky, terracotta frieze, bright motif colours.
2. **Look 3's cohesion, on look 2's colours.**
- **One ornament.** The frieze's meander key band, drawn as a strip between glaze rules, runs along
the top of the panel (18px), the caption card and the step bar or timeline (12–14px). It is the
same tile as in the frieze.
- **One type pairing.** All labels use the frieze inscriptions' style: Cormorant, capitals, wide
tracking. That covers the caption eyebrow, the panel eyebrow, tabs, fact labels, beat labels,
"Paths", strip headings, fan-work types and the B labels. Titles stay in Cormorant and body text in
Inter.
- **One accent pair.** Terracotta and glaze black replace 14's rhumb-red. Track badges and the
current beat are terracotta discs with black numerals, as on the frieze. Play and Back are black
pills. Cards have black 2px rules. The current tab has a terracotta tongue. The footer is glaze with
a terracotta rule. The vellum roller edge is replaced by a black rule, so the panel reads as the
same book as the frieze.
- **Fitted frieze.** The viewBox is now cropped to the band, and the band sits in a box between the
caption and the HUD. Two registers fill the height: a **palmette chain** above (a vase neck) and a
**running-wave scroll** under the ground line. The horizon sync and the curtain drop were rewritten
for the new box. The morph still starts on the painted ground line (`-morph.png`).
- **Sea.** The filled crest patches (14's "lily pads") are gone. The sea is now two flat swell bands
plus thin cream wave strokes on the upper swells, which thin out with distance.
- **Giant.** The outline hulls are half as thick (0.32 → 0.15). The giant is scaled 0.8 → 0.72, so the
club stays well inside the frame. The flock's outlines are halved too.
3. **Paths out in the open.** "Paths A · B · C" sits in the HUD with a short name (In the panel / In the
world / Timeline). In all three modes, the current song's motifs show without any click. **One pick
highlights everywhere**: the pinned strip, the Paths tab (buttons and vertical strip), lyrics (the
matching parts light up, the others dim, and the chips are buttons), frieze threads, 3D ribbons and
their labels, and the timeline. The pick is kept across songs when the new song has that motif, and
is mirrored in `?motif=`. The Paths tab stays as the full detail view.
- **A. Pinned strip** (`threads.ts` `hStrip`, about 150px). It sits between the song header and the
tabs, whatever tab is open. All 10 songs are knots on a dashed course, numbered, with saga ticks
and a terracotta "here" column. A small ship with "you are here" **sails between songs as the beats
play**. One soft thread per motif, knotted where it plays (12's style). The motif names are buttons
with a from/returns tooltip.
- **B. Threads in the world** (`ribbons.ts`). Every song has a fixed place on the route: two behind
the start, Full Speed Ahead at the start, Polyphemus at the anchorage, Survive at the cave mouth,
and the rest beyond the island. Each motif is a flat ribbon with a black edge that rides the waves.
It is **solid behind the ship and dashed ahead**, with open-ring knots. Each ribbon has a floating
vellum label on its next knot ahead ("POLYPHEMUS · next: 7. Survive"), and labels stack when they
would overlap. Ribbons fade out near the camera so they don't become roads. In the cave, ribbons run
along the floor between the flock and the giant. In the frieze beats, the wave-scroll register
becomes the **thread register**: ink-edged threads in the bright colours, knotted under each painted
song, running off the band where the motif continues, with names on the left (clickable).
- **C. Timeline at the bottom.** The HUD becomes a full-width vellum timeline. Its top row holds Play,
the steps, the beats and the paths toggle. Below are all songs as stops with titles, saga names,
the "here" column, the sailing ship with "you are here", and the motif threads underneath. The
frieze box shrinks so the band still fits above it.
Files: `main.ts` (beats, paths mode, motif pick, B labels, C timeline, fitted frieze), `panel.ts`,
`threads.ts` (new: shared thread data and the horizontal strip), `ribbons.ts` (new: 3D ribbons),
`scene.ts` (one palette, sea strokes, thinner outlines, ribbons and label projection), `frieze.ts`
(cropped viewBox, chain and wave or thread registers, tighter mouth mask), `figures.ts`, `chart.ts`,
`fanworks.ts` (copied), `style.css`.
## Screenshots (1440×900, `screenshots/`)
- Paths A: `15-voyage-look2-beat1.png` … `-beat5.png`
- Beat 3 with `?motif=polyphemus`: `-paths-a.png`, `-paths-b.png`, `-paths-c.png`
- `-beat1-paths-b.png` (frieze threads), `-beat5-paths-c.png`, `-lyrics.png` (A, `?motif=odysseus`)
- Extra: `-beat2-paths-b.png`, `-beat4-paths-b.png`, `-beat5-paths-b.png` (cave ribbons), `-paths-tab.png`,
`-collapsed.png` (panel collapsed, C), `-morph.png` (1→2 at 40%), `-mid-curtain.png` (3→4 at 50%, B),
`-mid-cave.png` (4→5 at 60%)
The credits footer is fully visible in every one.
## What works
- **Cohesion.** The meander strip, the capitals labels and the terracotta/black accents tie the
caption, HUD and panel to the frieze, and the sea and sky keep look 2's pop. It now reads as one site.
- **The frieze fills the stage.** The band sits between the caption and the HUD with only a small
margin of glaze (`-beat1`, `-beat4`). The new registers look native to the vase.
- **The sea** reads as drawn strokes, not pads. The giant is lighter and fully in frame.
- **A** is always visible without changing the panel's job, and the sailing ship makes it feel alive.
- **B** is the most striking: the threads literally run ahead of the ship to the cave mouth
(`-paths-b`). In the frieze, the thread register is a natural vase band (`-beat1-paths-b`).
- **C** is the clearest overview. It is the user's "big horizontal line", with every song titled.
- Checked: `bun test` (50 pass), `bun run typecheck`, and a production build to the scratchpad.
## What doesn't, or is rough
- **B labels on the island** can stack over the cave mouth, as Odysseus and Polyphemus both return in
Survive (`-paths-b`). They are readable, but the leader line of the upper label points at nothing.
- **B ribbons behind the ship** sweep towards the camera at the lower left in beat 2. They now fade, but
still cross under the HUD. The far ribbons (tracks 8–10, beyond the island) are only small dashes.
- **B's frieze labels** are small (about 12px on screen at this stage width).
- **A at 372px is dense.** The 10 knots are about 22px apart, so the numbers carry the meaning and song
titles appear only in tooltips. "Warrior of the Mind" just fits the label column.
- **C costs about 220px of stage.** The landfall and cave are framed higher, and in the cave the flock
sits behind the timeline (`-beat5-paths-c`).
- The morph frame shows a large flat sun with a ring. This is 14's camera at horizon lock, not changed.
- Play timing was not checked in a live browser (headless virtual time, same caveat as 13 and 14).
Desktop 1440×900 only.
## Paths A / B / C, honestly
**A (pinned strip)** is the safest. It is always there and compact, it keeps the stage clean, and the
sailing ship makes "you are here" concrete. But it is small and abstract: numbers, not names, in a busy
panel. It fixes "too hidden" without making paths feel like part of the voyage.
**B (threads in the world)** is the most "EPIC". The motifs become something the ship sails along, and
you see a theme run ahead into the Cyclops' cave before the song gets there. The frieze version is
lovely. The costs: it depends on camera framing (labels stack, ribbons near the camera need fading),
and it shows only the current song's motifs, with no overview of the whole voyage. It is the hardest
to build well for every landing.
**C (timeline at the bottom)** is the clearest. Every song is named, the threads are long enough to
read as journeys, and the step controls sit with it naturally. It costs stage height, and the
interface feels more like a tool and less like a picture.
My read: **C as the home for paths, with B's ribbons as an optional flourish in the 3D** (the frieze
thread register in particular is cheap and beautiful). A works as a fallback when the panel is the
main surface, for example on smaller screens. Each needs one more pass: C could collapse to a slim
course line while the 3D plays, and B labels need smarter placement.