the stage pins while the section scrolls; each act reads its own progress
The section is tall. Its stage is sticky. Scroll drives --stage-p from 0 to 1 across the dwell, in CSS, no React per frame.
Each <Act> gets --act-p (its own window) and --act-on (1 while on stage). Opacity, transform, clip: all CSS.
useAct() changes once per checkpoint. Mount a phone when its act begins; never sample scroll.
The section is tall. Its stage is sticky. Scroll drives --stage-p from 0 to 1 across the dwell, in CSS, no React per frame.
Each <Act> gets --act-p (its own window) and --act-on (1 while on stage). Opacity, transform, clip: all CSS.
useAct() changes once per checkpoint. Mount a phone when its act begins; never sample scroll.