Rail axon
Reading progress as one axon down the rail, a node per section.
Anatomy
| Axon | one dot wide down the rail’s node column, on one canvas at the 2px dot |
|---|---|
| Ahead and behind | --rail-tissue ahead of the reader, --chip-fg behind; solid in both, never dithered |
| Nodes | one per section, 2.5 dots plus 0.5 a minute of reading, up to 5 minutes |
| Front | reaches a section’s node exactly as it turns current, following the scroll on a 90ms exponential |
| Current | its node fires (a 280ms flare) and becomes a --state cell that breathes at ~15fps for as long as the page is open |
| The map | rows spaced in proportion to their sections’ heights on the page, at most 60% of the bar and three rows a section |
| Reduced motion | the front lands at once, nothing fires or breathes, and the current node is a still --state cell |
From src/lib/exposure/rail-axon.ts and the guide’s Motion §6.
Which section is current
| Reading line | a section turns current when its heading passes a line 160px down the screen |
|---|---|
| The last screen | over the last screen of scrolling the line slides down to 48px above the bottom, so a short last section still lights |
| Measured from the page | headings are measured with their box on the page, never offsetTop, which counted from the reading veil and lit the wrong row (fixed Oct 2026) |
Decisions
-
The writing index’s grammar
Chosen because the rail then adds no new idea. A straight rule with section ticks and tissue growing down the field were studied in the same round.
-
Replaced the progress grain
A tone fill rising behind a centred TOC, its edge shimmering with the retired Ambience wave. It read as a gauge, and rose with the page rather than the sections.
-
Mapped by height
Gaps were sized by words first, but sections often have near-equal word counts and the map came out even; height is what the reader feels.
-
The current node breathes
With no fill behind the TOC it is what keeps the rail alive at rest (Oct 2026).