How it works
Keyframes bound to view() with animation-range: entry/exit, and a reading-progress bar on scroll(root).
animation-timeline: view() and scroll() — reveals, progress bar and parallax with no JavaScript.
Keyframes bound to view() with animation-range: entry/exit, and a reading-progress bar on scroll(root).
Runs on the compositor thread — keeps animating even when the main thread is blocked (try the “Block main thread” button).
@supports fallback shows everything static; reduced mode removes the timelines.