Compass Rotation
On hover, the compass mark rotates 45°. This is the signature interaction — deliberate, orientational. Used on the nav logo and footer logo only.
transform: rotate(45deg) · 0.7s · cubic-bezier(0.34, 1.56, 0.64, 1)
Button Wipe
Buttons use a left-to-right colour wipe (translateX overlay) on hover. The text stays in place while the background transitions beneath it. Never use opacity fade on buttons.
transform: translateX(-101% → 0) · 0.4s · cubic-bezier(0.4, 0, 0.2, 1)
Scroll Reveal
Elements enter from 20px below, fading to full opacity. Staggered by 65ms per element group. Never animate elements that were already in the viewport on load.
opacity: 0→1, translateY: 20px→0 · 0.7s · ease · threshold: 7%
Service Expand
Service card descriptions expand on hover using max-height animation. The reveal is deliberate, not instant — it respects the user's attention rather than demanding it.
max-height: 0→180px · 0.45s · cubic-bezier(0.4, 0, 0.2, 1)
FAQ Accordion
FAQ items expand via max-height to their scroll height. Only one item open at a time. The icon transitions from + to a horizontal line — never an X, which implies dismissal, not closure.
max-height: 0→scrollHeight · 0.45s · cubic-bezier(0.4, 0, 0.2, 1)
Scroll Parallax
Forest divider sections move at 0.08× scroll speed. This is subtle — barely perceptible on first pass. It should never distract, only create a sense of depth when noticed.
translateY: offset × 0.08 · passive scroll · no easing (raw)