docs: final review fixes — deferred backlog, doc accuracy, sample-data note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas Winther
2026-10-23 19:13:41 +02:00
co-authored by Claude Opus 5.5
parent dd106c5d0e
commit 2ff58ace46
11 changed files with 103 additions and 37 deletions
+12 -12
View File
@@ -44,7 +44,7 @@ export const songs: Song[] = [
odyssey: null, // TODO(verify)
parts: [
{ name: "Verse 1", singers: ["Odysseus"], lines: lyric("Odysseus", 1), motifIds: ["odysseus", "just-a-man"] }, // TODO(verify)
{ name: "Chorus", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["just-a-man"], startSec: 60 },
{ name: "Chorus", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["just-a-man"], startSec: 60 }, // TODO(verify) singers
],
facts: ["Shows Odysseus as a husband and father before the voyage."], // TODO(verify)
videos: [{ title: "Just a Man — search", url: yt("EPIC The Musical Just a Man") }],
@@ -55,7 +55,7 @@ export const songs: Song[] = [
odyssey: { book: 9, lines: "39-61", url: BUTLER }, // TODO(verify) raid on the Cicones
parts: [
{ name: "Verse 1", singers: ["Eurylochus", "Odysseus"], lines: lyric("crew", 1), motifIds: ["odysseus"] }, // TODO(verify)
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["warrior"] },
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["warrior"] }, // TODO(verify) singers
],
facts: ["The crew's high spirits are about to run into trouble."], // TODO(verify)
videos: [{ title: "Full Speed Ahead — search", url: yt("EPIC The Musical Full Speed Ahead") }],
@@ -65,8 +65,8 @@ export const songs: Song[] = [
storyTime: { yearsAfterTroy: 0, label: "Shortly after leaving Troy" }, // TODO(verify)
odyssey: null, // TODO(verify)
parts: [
{ name: "Verse 1", singers: ["Odysseus"], lines: lyric("Odysseus", 1), motifIds: ["open-arms"] }, // TODO(verify)
{ name: "Verse 2", singers: ["Odysseus", "Crew"], lines: lyric("crew", 2), motifIds: ["open-arms", "odysseus"] },
{ name: "Verse 1", singers: ["Polites", "Odysseus"], lines: lyric("Odysseus", 1), motifIds: ["open-arms"] }, // TODO(verify) Polites leads, with Odysseus
{ name: "Verse 2", singers: ["Polites", "Odysseus", "Crew"], lines: lyric("crew", 2), motifIds: ["open-arms", "odysseus"] }, // TODO(verify) singers
],
facts: ["Introduces a welcoming melody that returns later."], // TODO(verify)
videos: [{ title: "Open Arms — search", url: yt("EPIC The Musical Open Arms") }],
@@ -77,7 +77,7 @@ export const songs: Song[] = [
odyssey: { book: 13, lines: "287-310", url: BUTLER }, // TODO(verify) Athena and Odysseus
parts: [
{ name: "Verse 1", singers: ["Athena"], lines: lyric("Athena", 1), motifIds: ["athena", "warrior"] }, // TODO(verify)
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["odysseus", "warrior"], startSec: 70 },
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["odysseus", "warrior"], startSec: 70 }, // TODO(verify) singers
],
facts: ["Athena teaches Odysseus to fight with wit."], // TODO(verify)
videos: [{ title: "Warrior of the Mind — search", url: yt("EPIC The Musical Warrior of the Mind") }],
@@ -87,8 +87,8 @@ export const songs: Song[] = [
storyTime: { yearsAfterTroy: 1, label: "The island of the Cyclopes" }, // TODO(verify)
odyssey: { book: 9, lines: "105-460", url: BUTLER }, // TODO(verify)
parts: [
{ name: "Verse 1", singers: ["Polyphemus"], lines: lyric("Polyphemus", 1), motifIds: ["polyphemus"] },
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["odysseus", "warrior"], startSec: 50 },
{ name: "Verse 1", singers: ["Polyphemus"], lines: lyric("Polyphemus", 1), motifIds: ["polyphemus"] }, // TODO(verify) singers
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["odysseus", "warrior"], startSec: 50 }, // TODO(verify) singers
],
facts: ["Odysseus meets Polyphemus in his cave."], // TODO(verify)
videos: [{ title: "Polyphemus — search", url: yt("EPIC The Musical Polyphemus") }],
@@ -99,7 +99,7 @@ export const songs: Song[] = [
odyssey: { book: 9, lines: "287-412", url: BUTLER }, // TODO(verify)
parts: [
{ name: "Verse 1", singers: ["Polyphemus", "Crew"], lines: lyric("Polyphemus", 1), motifIds: ["polyphemus"] }, // TODO(verify)
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["odysseus", "just-a-man"] },
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["odysseus", "just-a-man"] }, // TODO(verify) singers
],
facts: ["The crew is trapped and Odysseus must choose a plan."], // TODO(verify)
videos: [{ title: "Survive — search", url: yt("EPIC The Musical Survive") }],
@@ -109,8 +109,8 @@ export const songs: Song[] = [
storyTime: { yearsAfterTroy: 1, label: "Escaping the cave" }, // TODO(verify)
odyssey: { book: 9, lines: "431-460", url: BUTLER }, // TODO(verify)
parts: [
{ name: "Verse 1", singers: ["Telemachus"], lines: lyric("Telemachus", 1), motifIds: ["remember"] }, // TODO(verify)
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["remember", "open-arms"], startSec: 40 },
{ name: "Verse 1", singers: ["Telemachus"], lines: lyric("Telemachus", 1), motifIds: ["remember"] }, // TODO(verify) Telemachus as singer
{ name: "Verse 2", singers: ["Odysseus"], lines: lyric("Odysseus", 2), motifIds: ["remember", "open-arms"], startSec: 40 }, // TODO(verify) singers
],
facts: ["A memorial theme introduced here returns later."], // TODO(verify)
videos: [{ title: "Remember Them — search", url: yt("EPIC The Musical Remember Them") }],
@@ -120,9 +120,9 @@ export const songs: Song[] = [
storyTime: { yearsAfterTroy: 1, label: "Leaving the island" }, // TODO(verify)
odyssey: { book: 9, lines: "473-542", url: BUTLER }, // TODO(verify)
parts: [
{ name: "Verse 1", singers: ["Odysseus", "Polyphemus"], lines: lyric("Odysseus", 1), motifIds: ["polyphemus", "odysseus"] }, // TODO(verify)
{ name: "Verse 1", singers: ["Odysseus", "Athena"], lines: lyric("Odysseus", 1), motifIds: ["odysseus", "athena"] }, // TODO(verify) singers
],
facts: ["The Cyclops saga ends with Odysseus revealing his name."], // TODO(verify)
facts: ["Closes the Cyclops saga as Odysseus leaves the island."], // TODO(verify)
videos: [{ title: "My Goodbye — search", url: yt("EPIC The Musical My Goodbye") }],
},
{
+1 -1
View File
@@ -10,7 +10,7 @@
<body>
<main>
<h1>EPIC: The Musical Timeline</h1>
<p class="lede">Seven design directions for an interactive timeline. Pick one, or mix several.</p>
<p class="lede">Seven design directions for an interactive timeline. Pick one, or mix several. Sample content: placeholder lyrics and unverified details, for comparing designs only.</p>
<ul class="cards">
<li class="card"><a href="/mockups/01-editorial/"><span class="card__num">01</span><h2>Editorial scroll</h2><p>A clean horizontal line in a parchment-and-serif editorial style, with motifs as thin coloured threads underneath.</p><p class="card__try">Try this: Pan sideways, notice gap length tracking in-story time, and open a song.</p></a></li>
<li class="card"><a href="/mockups/02-vertical-story/"><span class="card__num">02</span><h2>Vertical story</h2><p>The voyage scrolls downward; songs reveal one at a time beside a sticky detail panel.</p><p class="card__try">Try this: Scroll and watch the sticky detail panel update.</p></a></li>
+1 -1
View File
@@ -1,4 +1,4 @@
import { mountCredits } from "./shared/credits";
// Cards are static in index.html (kept in sync with src/mockups/registry.ts by tests/server.test.ts).
// Cards are static in index.html (tests/server.test.ts checks each registry entry's name, pitch and tryThis appear here).
mountCredits();
+15 -15
View File
@@ -12,21 +12,21 @@ export function startServer(port: number): Server<undefined> {
return Bun.serve({
port,
routes: {
"/": home,
"/mockups/01-editorial/": m0,
"/mockups/01-editorial": Response.redirect("/mockups/01-editorial/", 302),
"/mockups/02-vertical-story/": m1,
"/mockups/02-vertical-story": Response.redirect("/mockups/02-vertical-story/", 302),
"/mockups/03-transit-map/": m2,
"/mockups/03-transit-map": Response.redirect("/mockups/03-transit-map/", 302),
"/mockups/04-greek-frieze/": m3,
"/mockups/04-greek-frieze": Response.redirect("/mockups/04-greek-frieze/", 302),
"/mockups/05-score/": m4,
"/mockups/05-score": Response.redirect("/mockups/05-score/", 302),
"/mockups/06-constellation/": m5,
"/mockups/06-constellation": Response.redirect("/mockups/06-constellation/", 302),
"/mockups/07-sea-voyage/": m6,
"/mockups/07-sea-voyage": Response.redirect("/mockups/07-sea-voyage/", 302),
"/": home,
"/mockups/01-editorial/": m0,
"/mockups/01-editorial": Response.redirect("/mockups/01-editorial/", 302),
"/mockups/02-vertical-story/": m1,
"/mockups/02-vertical-story": Response.redirect("/mockups/02-vertical-story/", 302),
"/mockups/03-transit-map/": m2,
"/mockups/03-transit-map": Response.redirect("/mockups/03-transit-map/", 302),
"/mockups/04-greek-frieze/": m3,
"/mockups/04-greek-frieze": Response.redirect("/mockups/04-greek-frieze/", 302),
"/mockups/05-score/": m4,
"/mockups/05-score": Response.redirect("/mockups/05-score/", 302),
"/mockups/06-constellation/": m5,
"/mockups/06-constellation": Response.redirect("/mockups/06-constellation/", 302),
"/mockups/07-sea-voyage/": m6,
"/mockups/07-sea-voyage": Response.redirect("/mockups/07-sea-voyage/", 302),
},
development: process.env.NODE_ENV !== "production",
fetch() {
+1 -1
View File
@@ -21,7 +21,7 @@ export function createAudioSlot(song: Song): HTMLElement {
btn.textContent = part.name;
btn.addEventListener("click", () => {
audio.currentTime = part.startSec!;
void audio.play?.();
audio.play?.()?.catch(() => {});
});
root.append(btn);
}