Skip to main content
Executive Support by Beige Threat

Motion

Motion serves clarity, not decoration. Six durations, five easings, six named choreographies. Editorial pacing: short, settled, never bouncy. The system honours prefers-reduced-motion automatically – every transition collapses to 1ms and every distance to 0px when the reader asks for stillness.

Durations

Anchored to perceived response thresholds. 80 ms reads as instant feedback. 220 ms is the default reveal. Anything beyond 480 ms is reserved for editorial moments and route changes. Hover any tile to play.

—es-duration-instant
80ms
State flicker – tick, press feedback.
—es-duration-fast
150ms
Hover, focus, press.
—es-duration-base
220ms
Disclosure, popover, toast.
—es-duration-slow
320ms
Modal, sheet, drawer.
—es-duration-slower
480ms
Page transitions.
—es-duration-deliberate
700ms
Hero reveal, splash moment.

Easings

Each curve carries an intent. Standard handles two-way state changes. Entrance decelerates as a thing arrives. Exit accelerates as it leaves. Emphasized is the editorial curve – slow start, fast finish – for hero reveals and route transitions. Linear is for indeterminate progress only. Bouncy and elastic curves are not part of the system.

—es-easing-standard
cubic-bezier(0.2, 0, 0.2, 1)
Symmetric – hover, focus, press.
—es-easing-entrance
cubic-bezier(0, 0, 0.2, 1)
Decelerate – arriving on screen.
—es-easing-exit
cubic-bezier(0.4, 0, 1, 1)
Accelerate – leaving screen.
—es-easing-emphasized
cubic-bezier(0.2, 0, 0, 1)
Editorial – hero, page transition.
—es-easing-linear
linear
Indeterminate progress only.

Semantic motion

Components consume semantic aliases – never the primitives. Each alias composes a duration with an easing for a specific intent. Re-tune the system in one place. Hover any card to play.

Find your level
—es-motion-state
fast · standard · 150ms
Hover, focus, press. The smallest movement.
Issue 87 · The leadership issue
—es-motion-reveal
base · entrance · 220ms
Disclosure, popover, toast. Element arrives.
Saved
—es-motion-dismiss
fast · exit · 150ms
Element leaves – chip cleared, toast retracted.
Confirm subscription
All eight 2026 issues.
—es-motion-overlay
base · emphasized · 220ms
Modal, sheet, drawer. Scrim fades, body lifts.
Issue 86
Issue 87
—es-motion-page
slow · emphasized · 320ms
Route changes between sections.
Settled, never bouncy.
—es-motion-editorial
deliberate · emphasized · 700ms
Hero reveal, splash moment.

Distance

Translate offsets for entrance and exit slides. Match distance to duration: a 4 px state shift travels in 150 ms; a 32 px toast travels in 220 ms. Larger distances need more time, but never invent values between these four.

—es-distance-xs
4px
Hover lift, focus shift.
—es-distance-sm
8px
List-item entrance, popover offset.
—es-distance-md
16px
Modal lift, tooltip slide.
—es-distance-lg
32px
Toast from below, drawer offset.

Choreography

Stagger composes a list reveal so items arrive in sequence, not at once. Three offsets handle every case. Use tight for dense menus, default for editorial lists, loose for hero galleries. Hover the list to replay.

Issue 87 · The leadership issue
Issue 86 · The systems issue
Issue 85 · The room issue
Issue 84 · The voice issue
—es-stagger-tight
30ms · dense menus
Issue 87 · The leadership issue
Issue 86 · The systems issue
Issue 85 · The room issue
Issue 84 · The voice issue
—es-stagger-default
50ms · editorial lists
Issue 87 · The leadership issue
Issue 86 · The systems issue
Issue 85 · The room issue
Issue 84 · The voice issue
—es-stagger-loose
80ms · hero galleries

Reduced motion

Roughly one in three desktop visitors has prefers-reduced-motion: reduce set – often for vestibular reasons. The token system honours that automatically. Every duration collapses to 1 ms; every distance collapses to 0 px. The state still changes – the journey to it does not.

Default · motion on
--es-duration-base:    220ms
--es-duration-slow:    320ms
--es-distance-md:      16px
--es-distance-lg:      32px
--es-stagger-default:  50ms
Tokens read at their declared values. Animations play in full.
Reduced · prefers-reduced-motion: reduce
--es-duration-base:    1ms
--es-duration-slow:    1ms
--es-distance-md:      0px
--es-distance-lg:      0px
--es-stagger-default:  0ms
Same tokens, same components – states swap without travel or delay.

The contract for every component is the same: consume the tokens, never hard-code a duration or a distance, and the reduced-motion case takes care of itself.

Usage rules

Do · State changes use fast + standard
transition: var(—es-motion-state);
/* 150ms · standard */

Hover, focus, and press use the state token. Two-way moves want a symmetric curve.

Don't · One duration for everything
* { transition: all 300ms ease; }

A blanket transition makes hovers sluggish and modals rushed. Each move picks its own duration.

Do · Entrances decelerate
transition: var(—es-motion-reveal);
/* 220ms · entrance curve */

Things arriving on screen ease out – fast in, slow to settle. Reads as “landing”.

Don't · Linear curves on entrances
transition: 220ms linear;

Linear arrivals feel mechanical. Reserve linear for indeterminate progress.

Do · Exits accelerate
transition: var(—es-motion-dismiss);
/* 150ms · exit curve */

Things leaving ease in – slow to start, fast to clear. Lower duration than the entrance.

Don't · Bouncy or elastic curves
cubic-bezier(.68,-.55,.27,1.55)

Overshoot reads as playful. Editorial brands are settled – pick from the five sanctioned curves.

Do · Animate transform and opacity
transform: translateY(-4px);
opacity: 0 → 1;

Both run on the GPU. Animating top or height repaints the layout and stutters.

Don't · Animate body copy
Paragraphs that fade in word by word punish the reader.

Body copy stays still. Reveal the container; never animate the words inside it.

Do · Honour reduced-motion via tokens
.card { transition: var(--es-motion-reveal); }

Consume the semantic tokens. The reduced-motion override is built in – no extra media query needed.

Don't · Auto-play motion over 480ms
.hero { animation: drift 700ms
infinite alternate; }

Anything past 480 ms is editorial – it plays once, on user input. Never on a loop.

Tokens to ship

The full reference. Components consume the semantic aliases; the primitives sit beneath, available for one-off composition.

Durations
--es-duration-instant
80ms

State flicker – tick, button-press feedback.

80ms
--es-duration-fast
150ms

Default state transition – hover, focus, press.

150ms
--es-duration-base
220ms

Default reveal – disclosure, popover, toast.

220ms
--es-duration-slow
320ms

Modal, sheet, drawer entrance.

320ms
--es-duration-slower
480ms

Page transition, hero element shifts.

480ms
--es-duration-deliberate
700ms

Editorial moment – hero reveal, splash.

700ms
Easings
--es-easing-standard
cubic-bezier(0.2, 0, 0.2, 1)

Symmetric in/out. State changes – hover, focus, press.

standard
--es-easing-entrance
cubic-bezier(0, 0, 0.2, 1)

Decelerate. Element arriving on screen.

entrance
--es-easing-exit
cubic-bezier(0.4, 0, 1, 1)

Accelerate. Element leaving screen.

exit
--es-easing-emphasized
cubic-bezier(0.2, 0, 0, 1)

Slow start, fast end. Hero and page transitions.

emphasized
--es-easing-linear
linear

Indeterminate progress only.

linear
Distance and stagger
--es-distance-xs
4px

Hover lift, focus shift.

4px
--es-distance-sm
8px

List-item entrance, popover offset.

8px
--es-distance-md
16px

Modal lift, tooltip slide.

16px
--es-distance-lg
32px

Toast from below, drawer offset.

32px
--es-stagger-tight
30ms

Dense menus, compact filter rows.

30ms
--es-stagger-default
50ms

Editorial lists, navigation reveals.

50ms
--es-stagger-loose
80ms

Hero galleries, splash sequences.

80ms
Semantic – consume these
--es-motion-state
fast + standard

Hover, focus, press.

150ms · standard
--es-motion-reveal
base + entrance

Disclosure, popover, toast.

220ms · entrance
--es-motion-dismiss
fast + exit

Element leaves the screen.

150ms · exit
--es-motion-overlay
base + emphasized

Modal, sheet, drawer.

220ms · emphasized
--es-motion-page
slow + emphasized

Route changes between sections.

320ms · emphasized
--es-motion-editorial
deliberate + emphasized

Hero reveal, splash moment.

700ms · emphasized