Entry
The reveal fires as the element crosses into view.
The scroll guide explains the tier ladder. This page is the ladder running.
There is no scroll listener on this page, no IntersectionObserver, and no library. Everything below is animation-timeline plus the reveal wrapper.
animation-timeline: view()noanimation-triggerno The wrapper is an-reveal; the child carries the animation. One markup shape at every tier.
The reveal fires as the element crosses into view.
entry 20% to cover 45% — tune where it starts and ends.
On Chrome 145+ it latches. Elsewhere it replays on re-entry.
Where timelines are missing, the content is simply here.
The :nth-child index lands on the wrapper, but the delay is computed on the animated child, so the cascade survives the extra element. This is the interop that took a registered inheriting property to get right.
Progress is bound to the scrollbar, so these run backwards when you scroll up. Back and forth is the free default here, not a feature.
an-scrub-upan-scrub-scalean-scrub-rotatean-scrub-blur Three depths, one token. --an-parallax-depth from -1 to 1.
Cards stick, then shrink and dim as they exit. position: sticky plus a view timeline on the exit range.
Keep scrolling. Each card holds its place, then recedes.
Keep scrolling. Each card holds its place, then recedes.
Keep scrolling. Each card holds its place, then recedes.
Keep scrolling. Each card holds its place, then recedes.
No scroll listener, no observer, no library. Everything above is animation-timeline plus the reveal ladder. Read how it degrades →