Motion
Motion system
GSAP for orchestrated motion. CSS for micro-states. 2 easing curves. 5 duration tiers.
The cardinal rule
GSAP = scroll reveals, staggers, complex state transitions. CSS = hover, focus, active. Never CSS keyframes for content reveals.
Easing curves
cubic-bezier(0.19, 1, 0.22, 1)
GSAP: power3.out
Default for all entrances. Fast start, smooth deceleration. Used in 90% of animations.
cubic-bezier(0.76, 0, 0.24, 1)
GSAP: power4.inOut
Bidirectional only. Nav menu, modal transitions. Symmetrical acceleration.
Duration scale
GSAP patterns
ScrollTrigger top 85%
y:25→0, opacity:0→1, 0.8s, power3.out
CSS stacking (no JS)
Hero sticky -z-10, canvas relative z-20
Toggle button
clipPath polygon, links stagger y:40→0, 0.8s
ScrollTrigger pin
pin:true, snap:1/(panels-1)
CSS group:hover
scale(1.05), grayscale(0), 1s ease-out
First visit (cookie)
Logo scale+opacity timeline, ~3s
CSS transitions
Reflexive micro-interactions. Direct user interaction only, not scroll.
Do / Don't
Use GSAP for scroll-triggered reveals
Use CSS transitions for hover states
Use --ease-out for entrance animations
Use data-reveal for standard fade-up
Use CSS @keyframes for content reveals
Use ease-in for entrances
Animate layout properties (width, height)
Use transition-all on complex components