joel.design/system← Back to site
Foundations / Motion

Fast out, settle gentle.

The motion language is restrained. Out-expo for almost everything. Snappy for layout moves. Spring exists in the system but rarely fires. The whole library lives in three curves and four durations, applied identically everywhere.

The signature is consistency
What makes motion ownable isn’t any single curve. It’s reusing the exact same values across every element. Two durations, one easing curve, one spring config. Rauno Freiberg, Paco Coursey, and Linear all do this. Tiny library, applied everywhere, becomes the brand’s motion fingerprint.

Easing curves.

Each card animates the orange dot using its own curve so you can see the difference. Out Expo is the workhorse. Spring is the exception, used only where overshoot adds meaning.

Out Expo
cubic-bezier(0.16, 1, 0.3, 1)
Default site easing. Element reveals, magnetic CTAs, hover state expansions. Fast out, settles soft.
Smooth
cubic-bezier(0.25, 0.46, 0.45, 0.94)
Color and opacity transitions. Apple-default ease. Quietest possible animation.
Snappy
cubic-bezier(0.32, 0.72, 0, 1)
Linear-style. Page-level transitions, accordion expand. Snappy out, gentle settle.
Spring (Out Back)
cubic-bezier(0.34, 1.56, 0.64, 1)
Used sparingly for delight moments. Overshoot then settle. Avoid on layout transitions.

Durations.

Five duration tokens. Most of the site uses fast or base. Slow is for choreographed entrance sequences. Extra is for page-section reveals. Big enough to feel intentional, short enough to never block.

--dur-instant
Hover-color, micro state changes.
100ms
--dur-fast
Default for hovers and active states.
180ms
--dur-base
Component reveals, accordion expand, sidebar slide.
280ms
--dur-slow
Element entrance from off-screen, hero reveal sequence.
500ms
--dur-extra
Page-section enter on scroll, big editorial moments.
800ms

Rules.

  • One curve per surface. Don’t mix Out Expo and Spring on the same component. Pick one.
  • Reuse the variable. transition: width 280ms var(--ease-out-expo), never a raw cubic-bezier. The token is the contract.
  • Avoid Spring on layout. Overshoot on a moving card looks broken. Save spring for non-positional moments. A button glow, a checkmark snap.
  • Respect prefers-reduced-motion. If the user has it on, drop all durations to 0.01s. The system should still work, just without the choreography.