Skip to content

Commit 9f5f545

Browse files
committed
feat(stories): add The Chronology timeline to the archive
- Add public/stories/timeline.piml: the in-world chronology as 5 eras and 30 dated events (A.W. calendar), each linked to its volume - Add DndTimelinePage at /stories/timeline: era headers, gold event spine, search across events/eras/dates, links into /stories/books/:id - Register the route in AnimatedRoutes and pages/routes.js (prerender), add The Chronology card to the /stories hub - Document the timeline.piml schema in the stories README
1 parent 5348ae7 commit 9f5f545

6 files changed

Lines changed: 435 additions & 0 deletions

File tree

pages/routes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ export const staticRoutes = [
137137
"/stories/items",
138138
"/stories/lore",
139139
"/stories/places",
140+
"/stories/timeline",
140141
"/terminal",
141142
"/the-vague",
142143
"/timeline",

public/stories/README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public/stories/
3131
* `books_en.piml` / `books_tr.piml`: These PIML files serve as the main index for all story books and their respective episodes, separated by language.
3232
* `characters.piml`: This PIML file contains the definitions for all characters (Dramatis Personae).
3333
* `places.piml`: This PIML file contains the definitions for all places and locations (The Atlas).
34+
* `timeline.piml`: This PIML file contains the in-world chronology (The Chronology), grouped into eras of events dated in A.W. (After the War).
3435
* `meta-items/`: Contains item definitions and their respective images.
3536
* `items.piml`: Definitions for artifacts and tools (The Armory).
3637
* `vol-[id]-[slug]/`: Content is organized into "Volumes" (Phases).
@@ -147,6 +148,40 @@ The `books_*.piml` files are PIML documents that, when parsed, result in an obje
147148
* `description` (String): Description of the atmosphere.
148149
* `status` (String): Current status (e.g., Active, Destroyed).
149150

151+
## Timeline Structure (timeline.piml)
152+
153+
```piml
154+
(timeline)
155+
> (era)
156+
(eraId) 1
157+
(eraTitle) After the War
158+
(eraSpan) 0 - 37 A.W.
159+
(eraDescription) The guns of the Great War fall silent...
160+
(events)
161+
> (event)
162+
(year) 0 A.W.
163+
(title) The Great War Ends
164+
(description) The Great War ends and the calendar of Thornus...
165+
(book) Volume I: The Streets of Thornus
166+
(bookId) 1
167+
```
168+
169+
### Era Object Properties:
170+
171+
* `eraId` (Number): A unique identifier for the era, used for ordering.
172+
* `eraTitle` (String): The name of the era.
173+
* `eraSpan` (String): The range of years the era covers, in A.W.
174+
* `eraDescription` (String): A one-line summary of the era's mood and stakes.
175+
* `events` (Array): An array of event objects belonging to this era, in chronological order.
176+
177+
### Event Object Properties:
178+
179+
* `year` (String): The in-world date (e.g., `38 A.W.`, `c. 55 A.W.`, `Undated`).
180+
* `title` (String): The name of the event.
181+
* `description` (String): What happened, spoiler-tolerant but concise.
182+
* `book` (String, Optional): The volume where the event is told, matching a `bookTitle` in `books_en.piml`.
183+
* `bookId` (Number, Optional): The `bookId` of that volume, used to link the event to `/stories/books/{bookId}`.
184+
150185
## Item Structure (meta-items/items.piml)
151186

152187
```piml

public/stories/timeline.piml

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
(timeline)
2+
> (era)
3+
(eraId) 1
4+
(eraTitle) After the War
5+
(eraSpan) 0 - 37 A.W.
6+
(eraDescription) The guns of the Great War fall silent, and Thornus begins counting its years. A long, uneasy peace in which the next fire is quietly arranged.
7+
(events)
8+
> (event)
9+
(year) 0 A.W.
10+
(title) The Great War Ends
11+
(description) The Great War ends and the calendar of Thornus begins counting After the War—a reckoning built on the promise that nothing so terrible could happen twice. The promise does not hold.
12+
> (event)
13+
(year) 16 A.W.
14+
(title) A Daughter in Glareach
15+
(description) Lenia Krauper is born to the soldier Lorhud Krauper in the poor town of Glareach. She will live twenty-two years, and sew twenty-two silver stars into a dark green beret.
16+
(book) Volume II: The Cost of Sin
17+
(bookId) 2
18+
> (event)
19+
(year) c. 30 A.W.
20+
(title) The Agency That Does Not Exist
21+
(description) A young Soren Perborn enters the service of Black Ragnarok—the agency that doesn't exist, serving the kingdom that doesn't care. Freya Haelmar, Vancelor "The Fox" Ivarel, and Palwin Condervale share his shadows.
22+
(book) Volume V: The Black Ragnarok
23+
(bookId) 5
24+
> (event)
25+
(year) c. 34 A.W.
26+
(title) The Refusal of Isabylle Fredsound
27+
(description) Aester Cloudwear proposes the gentrification of Glareach. Isabylle Fredsound refuses to destroy the city's soul; her reward is a staged car "accident." A street orphan named Kramen Mandora pulls her from the wreckage and earns a household.
28+
(book) Volume II: The Cost of Sin
29+
(bookId) 2
30+
> (event)
31+
(year) 36 A.W.
32+
(title) The Shadow That Glowed
33+
(description) Galarian Freiton begins his thirteen-year pursuit of the Soul of Viyu—a vantablack star he believes will give the world free energy. He does not know he is digging a very deep, very bright grave.
34+
(book) Volume IV: The Resistance
35+
(bookId) 4
36+
37+
> (era)
38+
(eraId) 2
39+
(eraTitle) The Burning of Glareach
40+
(eraSpan) 38 A.W.
41+
(eraDescription) One year, two fires. A city is erased from the map, and a king is born beneath another one.
42+
(events)
43+
> (event)
44+
(year) 38 A.W.
45+
(title) The War of Fourbournes
46+
(description) Aester Cloudwear manipulates the front lines, drawing the artillery onto the shanties of Glareach. The town burns off the map. To the calendar-makers, it is a footnote; to those who lived there, it is the end of the world.
47+
(book) Volume II: The Cost of Sin
48+
(bookId) 2
49+
> (event)
50+
(year) 38 A.W.
51+
(title) Twenty-Two Stars Go Dark
52+
(description) During the razing, Lenia Krauper—twenty-two years old—is dragged from her home and murdered by Aester Cloudwear while her father watches helplessly from the shadows. Her blood becomes the mortar of the first casino of new Glareach.
53+
(book) Volume II: The Cost of Sin
54+
(bookId) 2
55+
> (event)
56+
(year) 38 A.W.
57+
(title) The Crown Is Born
58+
(description) In Predymesh, a daughter is born to the sewer worker Donlane DeRosa. Niva will grow up tracing the crown-shaped birthmark on her father's hand, calling him the King of the Sewers.
59+
(book) Volume I: The Streets of Thornus
60+
(bookId) 1
61+
62+
> (era)
63+
(eraId) 3
64+
(eraTitle) The Age of Neon
65+
(eraSpan) 39 - 55 A.W.
66+
(eraDescription) New Glareach rises on old bones. The kingdom learns to look away, and the men who profit learn there is no price for anything.
67+
(events)
68+
> (event)
69+
(year) c. 45 A.W.
70+
(title) New Glareach Rises
71+
(description) Cloudwear rebuilds only what turns a profit: a neon-soaked metropolis of casinos and legalized vice. The old districts and the rocky coastline are left to the ash and the ghosts.
72+
(book) Volume II: The Cost of Sin
73+
(bookId) 2
74+
> (event)
75+
(year) 49 A.W.
76+
(title) The Needle at the Festival
77+
(description) At the "Last Breath" festival, Agents Sprite and Laozi slip an Alilberry needle into Galarian Freiton's arm while Hellbound plays. The coroner writes heart failure. His widow begins an eleven-year plan—and a comedy career in Craninal.
78+
(book) Volume IV: The Resistance
79+
(bookId) 4
80+
> (event)
81+
(year) c. 55 A.W.
82+
(title) The Stolen Mountain
83+
(description) Avalia Krones recovers Proxanian Seeds and a cache of Sansu Syrup from an illegal excavation, shortly before the military seizes Proxan Mountain. The Krones Formula—and the Agricultural Revolution—follow.
84+
(book) Volume IV: The Resistance
85+
(bookId) 4
86+
> (event)
87+
(year) 55 A.W.
88+
(title) A Fisherman and a White Coat
89+
(description) Soren Perborn walks away from Black Ragnarok and buys a boat in Oakhaven. The same year, a money-hungry young researcher named Muatti takes a post behind the white walls of St. Jude's, where a word drifts the corridors like a draft: RedLink.
90+
(book) Volume V: The Black Ragnarok
91+
(bookId) 5
92+
93+
> (era)
94+
(eraId) 4
95+
(eraTitle) The Rose and the Link
96+
(eraSpan) 56 - 59 A.W.
97+
(eraDescription) A wrong canister, a red wheat, and a door beneath a mountain that should have stayed shut.
98+
(events)
99+
> (event)
100+
(year) 56 A.W.
101+
(title) The Wrong Shelf
102+
(description) On a night shift at the Krones Research Lab, Willare Frindjen feeds the bioreactor from a mislabeled canister—the Crimson Binder. The reactor vents its spores over the slums of Predymesh for six hours before she burns the evidence.
103+
(book) Volume IV: The Resistance
104+
(bookId) 4
105+
> (event)
106+
(year) 56 A.W.
107+
(title) Patient Zero
108+
(description) Nine-year-old Pellera Orlong wakes with a crimson rose-leaf on her brow. The slums name the slow sickness the Touch of Rose. Her father Nex will trade his mason's hammer for a thief's shim to fund a single drop of Alilberry.
109+
(book) Volume III: The RedLink Arc
110+
(bookId) 3
111+
> (event)
112+
(year) c. 57 A.W.
113+
(title) Two Silences
114+
(description) Avalia Krones stands over Patient Zero with Willare at her side. Each woman recognizes her own share of the sin. Neither speaks. The Gilded Sickness remains a mystery—by choice.
115+
(book) Volume III: The RedLink Arc
116+
(bookId) 3
117+
> (event)
118+
(year) 57 A.W.
119+
(title) RedLink Protocol 0-12
120+
(description) In the Transistor Ward beneath St. Jude's, twelve Rose-Marked subjects are infused with Agitated Sansu. A river of liquid ruby tethers them into a single twelve-core engine. Corshield orders the 24-unit expansion immediately.
121+
(book) Volume III: The RedLink Arc
122+
(bookId) 3
123+
> (event)
124+
(year) 58 A.W.
125+
(title) Bed Fourteen
126+
(description) Freya Haelmar, hunting the rot inside her own agency, volunteers into the expanded ward. They give her the Rose by transfusion and plug her into the network. Palwin Condervale begins buying time.
127+
(book) Volume VI: The Fifth Death
128+
(bookId) 6
129+
> (event)
130+
(year) 58 A.W.
131+
(title) The Winter of Doctor Crale
132+
(description) Prolonged exposure to the Echo shatters Doctor Crale across a single winter—twelve hearts beating as one drum, a black sun beneath the mountain. Muatti is promoted to fill the vacancy, and begins to hear the rhythm.
133+
(book) Volume VII: The Elegy
134+
(bookId) 7
135+
> (event)
136+
(year) 58 A.W.
137+
(title) Class of 58
138+
(description) Niva DeRosa graduates third in her class from the Military Academy of Thornus and pins on an intelligence officer's badge. In the crowd, a stooped man with a crown on his hand wipes tears from his eyes.
139+
(book) Volume I: The Streets of Thornus
140+
(bookId) 1
141+
> (event)
142+
(year) c. 59 A.W.
143+
(title) The Hollow Detective
144+
(description) In Predymesh, the detective Corrigan hunts his own double through a hall of mirrors and fires the final shot of the Case of the Mirror Man. The reflection does not break. It escapes.
145+
(book) Volume I: The Streets of Thornus
146+
(bookId) 1
147+
> (event)
148+
(year) c. 59 A.W.
149+
(title) The Gun That Lowered
150+
(description) Hired through three shell companies to kill the Sultan of Butterflies, Lorhud Krauper follows her into the alley behind The Laughing Stock—and takes her hand instead of the contract. The failed bullet becomes Corshield's "clinical" warrant.
151+
(book) Volume II: The Cost of Sin
152+
(bookId) 2
153+
> (event)
154+
(year) c. 59 A.W.
155+
(title) The Notebook Changes Hands
156+
(description) Valeth Vanceshire dines beneath the skulls in the ceiling of the Kosnak Estate and walks out with the truth in his pocket. He does not keep it long: outside the gates, Nex Orlong lifts the navy blue notebook with the silver star.
157+
(book) Volume III: The RedLink Arc
158+
(bookId) 3
159+
160+
> (era)
161+
(eraId) 5
162+
(eraTitle) The Fifth Death
163+
(eraSpan) 60 A.W.
164+
(eraDescription) Eleven hours, twenty-two stars, one burning asylum. The year the calling stopped.
165+
(events)
166+
> (event)
167+
(year) 60 A.W.
168+
(title) A Letter Smelling of Salt
169+
(description) A yellowed envelope reaches a fisherman in Oakhaven: "It was cold in the mountains." Code 7-Alpha. Soren Perborn stops fishing. The sender is not who he believes.
170+
(book) Volume V: The Black Ragnarok
171+
(bookId) 5
172+
> (event)
173+
(year) 60 A.W.
174+
(title) The Massacre of the Grenadiers
175+
(description) At the City Market, a "Cytrox" attack kills Mayor Lynnia and thirteen civilians—among them Donlane DeRosa, buying flowers for his sister. Niva DeRosa walks into the smoke and out of her own name.
176+
(book) Volume I: The Streets of Thornus
177+
(bookId) 1
178+
> (event)
179+
(year) 60 A.W.
180+
(title) The Lighthouse of Ash
181+
(description) Soren, the Fox, and Palwin raise a command post in the one corner of Glareach the developers left to the ghosts—and hear the massacre break on the radio. Grenades, Palwin. Whom do you lure with grenades?
182+
(book) Volume V: The Black Ragnarok
183+
(bookId) 5
184+
> (event)
185+
(year) 60 A.W.
186+
(title) The Cathedral of Red String
187+
(description) The trio lifts Major Rolnifeld off the busiest street in Predymesh. The sewer rats set their price in names. Behind a dead neon sign, Fox finds Niva's unfinished war—and a ring engraved N.D.R., Class of 58 A.W.
188+
(book) Volume VI: The Fifth Death
189+
(bookId) 6
190+
> (event)
191+
(year) 60 A.W.
192+
(title) The Hour That Burned
193+
(description) In a condemned Glareach clock tower, Rolnifeld bleeds on the Chronometer and relives the hour he refused to listen. Klaude Barral goes pale at what follows: the mountain is not broadcasting. It is calling.
194+
(book) Volume VI: The Fifth Death
195+
(bookId) 6
196+
> (event)
197+
(year) 60 A.W.
198+
(title) The Eleventh Hour of Muatti
199+
(description) Muatti resolves to unfind the eleven hours. Project Glacier sends quiet professionals. Bleeding out in a locked wing, he pours the truth down into the under-city instead—where the forgotten live, listen, and never forget.
200+
(book) Volume VII: The Elegy
201+
(bookId) 7
202+
> (event)
203+
(year) 60 A.W.
204+
(title) The Fall of St. Jude's
205+
(description) The Sultan screams eleven years of grief through the RedLink. The Viyu pours down the link and closes like a mouth on the caller beneath the mountain. Freya wakes. Fox holds the corridor and counts to five. The asylum burns; the pulse dies.
206+
(book) Volume VI: The Fifth Death
207+
(bookId) 6
208+
> (event)
209+
(year) Undated
210+
(title) The Dark at the Edge of the Ring
211+
(description) In the Gauntlet of Glareach, the prizefighter Pugion wins one last time, tastes blood that is not his own, makes the sign—it's done—and walks slowly out of the light.
212+
(book) Volume VII: The Elegy
213+
(bookId) 7

src/components/AnimatedRoutes.jsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const DndPlacesPage = lazy(() => import('../pages/dnd/DndPlacesPage'));
2323
const DndItemsPage = lazy(() => import('../pages/dnd/DndItemsPage'));
2424
const DndBookPage = lazy(() => import('../pages/dnd/DndBookPage'));
2525
const DndAuthorsPage = lazy(() => import('../pages/dnd/DndAuthorsPage'));
26+
const DndTimelinePage = lazy(() => import('../pages/dnd/DndTimelinePage'));
2627
// Serfs & Frauds — "Black Ragnarok" retro-futuristic archive terminal (/snf)
2728
const SnfHubPage = lazy(() => import('../pages/snf/SnfHubPage'));
2829
const SnfArchivePage = lazy(() => import('../pages/snf/SnfArchivePage'));
@@ -741,6 +742,23 @@ const AnimatedRoutes = ({
741742
</motion.div>
742743
}
743744
/>
745+
{/* D&D Timeline Page */}
746+
<Route
747+
path="/stories/timeline"
748+
element={
749+
<motion.div
750+
initial="initial"
751+
animate="in"
752+
exit="out"
753+
variants={pageVariants}
754+
transition={pageTransition}
755+
>
756+
<Suspense fallback={<Loading />}>
757+
<DndTimelinePage />
758+
</Suspense>
759+
</motion.div>
760+
}
761+
/>
744762
{/* ===== Serfs & Frauds // Black Ragnarok Archive Terminal (/snf) ===== */}
745763
<Route
746764
path="/snf"

src/pages/dnd/DndPage.jsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
UsersThreeIcon,
1212
MapTrifoldIcon,
1313
SwordIcon,
14+
HourglassIcon,
1415
} from '@phosphor-icons/react';
1516

1617
const DndPage = () => {
@@ -91,6 +92,12 @@ const DndPage = () => {
9192
link="/stories/items"
9293
icon={<SwordIcon size={48} weight="duotone" />}
9394
/>
95+
<DndCard
96+
title="The Chronology"
97+
description="The measured years of Thornus, era by era."
98+
link="/stories/timeline"
99+
icon={<HourglassIcon size={48} weight="duotone" />}
100+
/>
94101
<DndCard
95102
title="Creators"
96103
description="Meeting the scribes behind the legend."

0 commit comments

Comments
 (0)