
A page transition looked almost right. Frame sampling showed why it wasn’t.
The page transition in the rebuild moved the outgoing page up while a curtain covered it. It looked close to the reference, but side-by-side it started too fast and settled too early.
Measure before tuning
Instead of adjusting durations by eye, I sampled the page offset every animation frame on both versions. The reference eased in slowly (a few pixels at 200ms); the rebuild jumped immediately.
The cause
The ease was written as a CSS-style string: cubic-bezier(.76,0,.2,1). GSAP does not parse that format. It silently falls back to its default ease, so nothing errors and the animation still runs — just on the wrong curve.
The fix
Register the curves once with CustomEase under names such as “leave” and “roll”, then reference the names. After that, the sampled transition matched the reference within a few pixels per frame, and the carousel snap — which had the same bug — used its intended curve too.
If an animation “looks almost right”, measure it. Silent fallbacks are the most expensive bugs to find by eye.