Skip to content
Motion & InteractionHectorpattern

Scroll Velocity Bus

One RAF writes --scroll-progress and --scroll-velocity; every atmosphere and stage reads the bus without registering listeners.

Built here · no external address

Hector: Solid, honourable, high-craft work.

Why it matters

Forty scroll listeners is how a calm archive becomes jank. A single writer and CSS variables keep motion physical and cheap.

Key techniques

  • Lenis optional under reduced motion.
  • Velocity normalised and decayed toward rest.
  • Readers are CSS-only wherever possible.

What to steal

The transferable part.

Decay the velocity. Instant zero feels digital; a short settle feels like weight.

What not to copy

Context-specific or costly.

Do not start a second Lenis instance inside a widget.

Inclusion rationale

Documents the spine every other surface already depends on.

Technical register

Performance

One RAF for the whole document. Widgets must not add scroll listeners.

Mobile

Touch multiplier tuned separately; passive listeners only in the fallback path.

Accessibility

Under reduced motion, Lenis is off and progress still updates for the reading rail.