The Lab · free tools
Motion you can feel before you ship
Interactive playgrounds for the craft behind great interfaces. Tune a spring, sketch a scroll sequence, forge a gradient — then export production-ready output. All tools run in your browser; nothing is uploaded.
Easing Lab
Watch your curve race a linear dot, then copy the exact cubic-bezier for CSS, Tailwind or JS.
transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1); /* 1100ms */Spring Lab
A real mass–spring–damper integrator. Pull the ball, watch overshoot, then read the settle time.
{ stiffness: 180, damping: 14, mass: 1 } // ~—ms to settleScroll Lab
Sketch scroll choreography on a playhead: drag it, set your trigger points, and export the recipe with exact thresholds.
ScrollObserver recipe (from your choreography)
enter completes ~ 25%
pin window 25% → 55%
pin ends 55%
exit completes ~ 80%–100%
// import { onScroll } from "your-scroll-lib"
// hero element:
enter: opacity 0→1 · translateY 60→0 (cubic-bezier(.16,1,.3,1))
pin: scale 1.06 · subtle glow, sticky
exit: opacity →0 · translateY →-40
// honor prefers-reduced-motion: jump to final stateGradient Forge
Pick three hues and an angle; the harmony guardrail nudges you toward tasteful spreads.
background: linear-gradient(115deg, hsl(258 85% 60%), hsl(198 90% 62%), hsl(320 80% 66%));Also in the Lab
Smaller tools for the decisions that surround motion: stagger math, radius shapes, shadow stacks, filter checks.
Timing-chart composer
Author an enter → dwell → exit timeline and read it as CSS keyframes.
@keyframes motif-timing {
0% { transform: translateX(0); opacity: 0; }
26.25% { transform: translateX(60px); opacity: 1; }
82.5% { transform: translateX(60px); opacity: 1; }
100% { transform: translateX(0); opacity: 0; }
}
.timing {
animation: motif-timing 1600ms;
}Stagger calculator
Input N items and read the per-item delay offsets for one wave.
Wave length 310ms · per-item offsets in ms.
const items = [...document.querySelectorAll(".wave > *")];
items.forEach((el, i) => {
el.style.transitionDelay = `60 + i * 50ms`;
});
// or in CSS: transition-delay: 60ms, 110ms, 160ms…Background-position painter
Drag the two stops on the canvas; the gradient direction follows your hand.
Direction angle ≈ 131° · stops at (15%, 20%) and (85%, 80%).
background: linear-gradient(131deg, #8b5cf6 0%, #22d3ee 100%);Text-animation lab
Compare scramble, typewriter and wipe on your own copy before choosing.
Tip: scramble suits short claims, typewriter suits code/terminal scenes, wipe suits hero moments. See the library's scramble-text and wipe-reveal.
Colour-ramp checker
Build an accessible ramp — every step is measured against the dark surface, live.
:root {
--ramp-0: #000083; /* 1.23:1 on dark */
--ramp-1: #1a1da8; /* 1.65:1 on dark */
--ramp-2: #3e41cc; /* 2.62:1 on dark */
--ramp-3: #6366f1; /* 4.35:1 on dark */
--ramp-4: #888bff; /* 6.64:1 on dark */
--ramp-5: #acafff; /* 9.55:1 on dark */
--ramp-6: #d1d4ff; /* 13.47:1 on dark */
}Border-radius playground
Asymmetric radii with a live preview and Tailwind-ready output.
Asymmetric corners give cards direction — large top corners make a card read as "opening downward".
className="rounded-[24px_8px_24px_8px]"Shadow stacker
Stack up to three layers and read the combined elevation as one CSS value.
box-shadow: 0 1px 2px rgb(0 0 0 / 0.06), 0 4px 12px rgb(0 0 0 / 0.1), 0 16px 32px rgb(0 0 0 / 0.12);Filter lab
Single-filter previews on a synthetic test card — no stock photo required.
/* no filters applied — the card is clean */System tools
Share state, audit cost, preview preferences — the meta-tools that make the other labs productive.
Hue-shift simulator
Preview a brand hue rotated across the surfaces it actually lives on.
Shifting hue by ±20–40° simulates seasonal or campaign theming without touching structure.
:root {
--brand-hue: 250;
--accent: hsl(250 82% 22%);
--accent-text: hsl(250 82% 70%);
--surface-tint: hsl(250 18% 96%);
}Breakpoint inspector
Drag the container width and watch one demo component reflow through its own breakpoints.
Field notes card
Media sits beside the copy until the container gets roomy.
Breakpoint: 560–860px · same logic as a container query.
Motion-preference preview
Toggle prefers-reduced-motion and watch the same scene pick a calmer branch.
Full branch: items nudge and cascade. The reduced preview shows what the switch buys.
Export clipboard
One click from any lab to your project — pick the dialect first, then copy.
className="rounded-xl bg-violet-600 px-5 py-2.5 text-sm font-semibold text-white transition hover:bg-violet-500 active:scale-[.97]"Perf meter
Every motion has a price. Pick an animation and read which pipeline stage it taxes.
Stage: cheap — compositor-only.
URL state for labs
Tune a curve, then share the exact configuration as a link — state lives in the URL.
cubic-bezier(.16, 1.00, .30, 1.00) · /lab?x1=.16&y1=1&x2=.3&y2=1
Favourite recipes
Pin tuned outputs with a name — they persist in your browser for the next session.
No saved recipes yet — tap one of the presets above.
Random inspiration button
Stuck on a blank canvas? Shuffle a considered palette and start from somewhere real.
Midnight archive
ink on bone, one amber
Preset 1 of 5 — every preset obeys the three-colour rule, so the start is never a mess.
:root {
--bg: #0c0d12;
--text: #f5f1e8;
--accent: #eab308;
}The craft shelf
Twenty-five small tools from the third idea bank — one decision each, all in your browser.
#276
Token contrast lab
16.69:1 — AA pass
#277
Spacing scale visualiser
#278
Type scale previewer
12px — Scale
16px — Scale
20px — Scale
24px — Scale
32px — Scale
#279
Radius previewer
#280
Shadow stack viewer
#281
Motion duration lab
300 ms across three standard easings
#282
Grid playground
#283
Colour-blindness approximation
approximations from filter matrices — not a diagnosis
prota
deute
trita
#284
Reduced-motion preview toggle
#285
Focus-order tracer
tab order: click into the fields, or Tab to them
#286
Breakpoint ruler
reading…
sm 640 · md 768 · lg 1024 · xl 1280 — resize the window
#287
Z-index inventory
#288
Inline icon searcher
#289
Copy tone checker
Could not save. Check your connection and try again.
#290
Locale formatter lab
#291
ARIA role explorer
switch: needs aria-checked
#292
Gradient contrast helper
worst end-to-end pair: 2.96:1 — white text needs ≥4.5 at both stops
#293
Easing compare
#294
Line-length measurer
longest line 91 chars — over the band
#295
Tab-stop simulator
the grid is a heuristic, not a measurement
#296
Print preview tool
Essay, as printed
Navigation and chrome are removed by the @media print block; the body keeps its measure and its footnotes.
the site’s print stylesheet is asserted by the export gate
#297
JSON schema formatter
{
"slug": "combo-box",
"kind": "element",
"a11y": 98
}#298
Slug generator
reading-a-diff-as-a-reviewer
#299
Meta-tag previewer
Components that ship with receipts | Motif UI (34/60)
Every component is audited, scored and priced in bytes. (55/155)
#300
Keyboard-only run sheet
tick each as you walk the flow with keys only
Calibration & review
Tune the details that make generated work feel finished — then compare two versions before you choose.
Typing-speed meter
Calibrate a typewriter demo: your copy length against a believable words-per-minute pace.
At 35 wpm a real typist lands ≈ 14.4s on 42 characters — anything faster than that reads as telepathy, not typing.
width: 0;
overflow: hidden;
white-space: nowrap;
animation: typing 14400ms steps(42) forwards;
@keyframes typing { to { width: 100%; } }Icon line-weight lab
Stroke width and cap roundness across the icon set, tuned as one family.
A family should share one stroke weight and one cap style — mixing 1.5px and 3px icons in one UI is the fastest way to look unfinished.
<svg fill="none" stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round">Logo-drift preview
Preview a drifting logo inside its safe zone — the guides keep the drift honest.
@keyframes drift {
0%, 100% { transform: translateX(-10px); }
50% { transform: translateX(10px); }
}Diff viewer
Paste two exports side by side; the loop scrubs a mid-frame so the difference is visible, not theoretical.
The middle pane cross-fades between the two exports so you can see the frame where they are indistinguishable.
More tools
Some require Pro — they're marked.
Easing Lab
Feel every easing curve on a real spring; drag the handles of a cubic-bezier and watch a dot race between two targets. Export CSS / JS / Tailwind.
Spring Lab
Tune stiffness, damping and mass against real physics — then export the config for your favourite motion lib.
Scroll Lab
Sketch scroll choreography: trigger points, sync progress, staggers. Copy the recipe into your project.
Gradient Forge
Bend multi-stop gradients on an editable path with colour-harmony guardrails so you never ship an ugly one.
Texture Forge
Grain, glass, halftone, paper — procedural textures at any resolution, seeded for reproducibility.
Theme Studio
Design your brand tokens once and remap every Motif component to them live.
Palette Engine
Generate harmonious palettes with an accessibility-first picker (contrast pre-checked live).
Contrast Sentinel
Paste any two colours (or a whole token file) and get WCAG AA/AAA verdicts per usage size.
Token Contrast Lab
Paste two token values and get the ratio plus the AA verdict for the usage size.
Spacing Scale Visualiser
The token scale rendered as nested bars — pick the step, skip the guess.
Type Scale Previewer
Sample text at every step of the scale with live px labels.
Motion Duration Lab
Scrub 50–800 ms and watch three standard easings race side by side.
Colour-Blindness Approximation
Three filtered swatches labelled as approximations, not diagnoses.
Gradient Contrast Helper
Samples a gradient end to end and reports the worst pair.
Easing Compare
The three standard easings side by side; the full bezier editor remains the Easing Lab.
Tab-Stop Simulator
A 44 px grid over a sample control set, labelled as a heuristic.
Meta-Tag Previewer
Title and description against their length limits, as the SERP renders them.
Keyboard-Only Run Sheet
A checklist that walks a flow with keys only — tick as you go.