The nav is generated from the page.
Each section declares a name. The navigation clones one template item per section, numbers them, and wires each to its own scroll range — nothing is hand-maintained.
Every item carries its own progress line.
The line is not a page-wide scrollbar. It fills from 0 to 100% across that section's range only, so the nav reads as a set of local timelines.
Ranges are anchored to the viewport centre.
Start and end are offset by half the viewport height, so a section becomes active when it crosses the middle of the screen rather than the top edge. Drag the anchor control to feel the difference.
Scrolling back has to undo cleanly.
Progress is recomputed from geometry on every frame instead of being accumulated, so reversing direction is exact and no state can drift.
Clicking an item travels, it does not jump.
A long eased scroll keeps the spatial relationship legible — you see what you passed.