Method
Each number here was read from a browser while it visited the site. Nothing was estimated from video or copied from a stylesheet by eye.
One visit
- Load once in Chromium at 1440 by 900, wait for the network to settle, then three more seconds.
- Scroll to the bottom with the mouse wheel, in steps of 80% of the viewport, pausing 450ms each.
- Hover and leave up to 30 distinct links and buttons, spread through the page.
- Click, only for component demo sites whose motion needs it (Sonner, Vaul): their own demo buttons, then Escape. Listed in the raw file.
- Scan every element's computed
transitionandanimation, including::beforeand::after.
Throughout, a probe injected before the page's own scripts records every transitionrun andanimationstart event with the exact computed timing, every element.animate() call,document.getAnimations() every 120ms, and GSAP's timeline when a page exposes it. Stylesheet and script text is scanned for counts only (reduced-motion queries, transition: all, keyframe names, library fingerprints). No site code, asset or screenshot is stored.
A second run does the same with prefers-reduced-motion: reduce. Each run is one load. Raw files are published beside the site, and an entry's values must match one raw record exactly (timing, duration, phase, property, selector, count) or the build fails.
Words
From Bryce's motion glossary (design-taste, filed 2026-09-01). Posture names what the motion is for; two sites can share a curve and feel nothing alike.
- Spatial
- The page is sparse and the motion delivers the content. Things travel from somewhere to somewhere. Transform and opacity lead the property list, durations run long.
- Material
- The page is already dense and designed. Motion changes how surfaces look rather than where they are: shadow, colour, background. Short durations. Nothing arrives; everything responds.
- Ambient
- Nothing triggers it. Untriggered, looping, slow. Decorative when the loops are many, uniform and procedurally named; diagrammatic when they illustrate a product feature; character when they're few and named after a subject's behaviour.
- The quick test
- Read the property list. Transform and opacity on top means spatial; shadow and colour on top means material. Each entry shows this count from its raw file beside the posture it was given.
- Statement
- The one big move. At most one per site here.
- Secondary
- Long moves under the statement.
- Signature
- The move that's recognisably theirs, often an overshoot.
- Utility
- Hover, press, colour: the fast floor.
- Exit
- Leaving, when it's timed differently from arriving.
This site's own motion
easeprint runs Bryce's motion default (motion.css, unchanged): statement 900mscubic-bezier(0.19, 1, 0.22, 1), signature 400ms cubic-bezier(0.2, 1.4, 0.4, 1), utility 200ms ease-out, micro 120ms, exit 140ms ease-in. The chrome spends only the small ones: cards rise on utility and drop on exit, buttons press on micro. Nothing moves on load or on scroll. The page paints finished, and every long move on the site is a demo you asked to play.
Reduced motion verdicts
Movement events (transform, translate, scale, rotate, position, size) in the reduced run as a share of the normal run. Fades are allowed under reduced motion, so they don't count against a site.
- Honored
- 20% or less of the movement remains.
- Partly honored
- More than 20%, up to 75%.
- Not honored
- More than 75% remains.
- Nothing measured moves
- No movement in the normal run, so nothing to reduce in CSS or WAAPI.
What it can't see
- Motion run on
requestAnimationFrame: smooth scroll (Lenis, Locomotive), GSAP tweens on pages that don't expose GSAP, Framer Motion springs not handed to WAAPI. - Anything drawn in a canvas. Entries say "motion lives in canvas" when a WebGL canvas covers a quarter of the viewport or more.
- Menus, forms, drags, other pages, and states behind clicks (except the two demo sites).
- Timing only. Distances, scale amounts and keyframe values aren't recorded, so the demos show each curve as a fixed travel or a fade.
- One visit on one day. Sites change; a measurement is true for its date.
The convention, as tests
An aggressive ease-out (at least 60% of the distance by 25% of the time), 700ms or longer, with a non-ambient tier of 300ms or less on the same site. See who passes.
Run it
pnpm measure https://example.com
pnpm measure https://example.com --reduced
pnpm summarize data/raw/example.com/2026-10-17.json