The other three sheets answer questions: what should I do here,
what's the number, which lesson was that in. This one doesn't answer
anything. It's the instruments, laid out on a bench, for when you already know what you
want to test and don't want to re-read an argument to get at the knob.
These are the labs, not pictures of them
Each one below is the same component the lesson mounts, running the same code. Change
something here and it behaves exactly as it does in place. Nothing you do on this page is
saved, and nothing carries between labs — reload to reset all of them at once.
Index
| Lab | What's side by side | What you can change |
| 01 · Curves | Four curves racing on one duration | The shared duration |
| 02 · Cost | The same movement bought with two properties | Property, elements per lane, main-thread block |
| 03 · Stagger | A group entering, with its timeline drawn underneath | Items, duration each, step, travel, order, easing |
| 04 · Scroll | One reveal as a trigger and as a scrub | Mode, re-trigger, fire point, step, duration, travel |
| 05 · Exits | Two identical panels, opened and closed | Enter and exit duration, easing, motion, exit direction |
| 06 · Tools | One effect via transition, keyframes and WAAPI | Duration, easing — and interrupt, pause, seek |
| 07 · Origin | Origin following the trigger vs left at the default | Corner, scale, duration, easing, rotation |
| 08 · Springs | A spring and a tween over the same distance | Stiffness, damping, mass, tween duration, easing |
| 09 · Reduced motion | One interface under three policies | The user's preference, your policy, travel, duration |
| 10 · Hover & press | Mouse and finger on the same button | Input, gate, hover duration, press depth, press-down |
| 10 · Two clocks | Two real buttons, one number apart, sides shuffled | What's compared, the one duration under test |
| 11 · FLIP | A reorder done by the browser and done by FLIP | Technique, the style flush, duration, easing |
| 11 · View Transitions | One tile opened three ways: cut, cross-fade, morph | Mode, name uniqueness, duration, easing |
| 12 · Appearing | One row appended four ways, three of which animate | Where the row's first value comes from |
| 12 · Changing your mind | A keyframe entrance and a transition entrance, interrupted together | How long before you change your mind |
| 13 · Two kinds of reveal | A masked reveal and a fade-and-rise, driven by one press | Window shape, duration, and whether the content moves too |
| 13 · Three builds of a wipe | One picture built with clip-path and with two rectangles | What the reveal is asked to do, and copies to measure |
| D01 · The catalogue | Twelve patterns, each one playable and each one breakable | Family, and the broken switch on every pattern |
| D02 · Pick a home | One app, four elements, six places each could live | Element, and where it lives when it's closed |
| D02 · Three ways out | One entrance, three exits, played together | Nothing — one button, and the comparison is the point |
| D03 · Which channel wins | Size, weight and colour against nine pixels of movement | Which tile gets the motion |
| D03 · What does this promote | One card, one fixed animation, eight possible targets | Which element moves |
| D04 · Button states | One working save button with five promises removable | Which states have feedback |
| D04 · Hold to confirm | A commitment the reader may leave before it completes | Length, progress feedback, release behaviour |
| D05 · Tracking the hand | Direct and lagged drag, sides shuffled | Nothing — the simultaneous feeling is the point |
| D05 · Five drag moments | A reorder with lift, ghost, gap, settle and snap-back | Which moment is removed |
| D06 · The deck | One deck under four indicator and release decisions | Count, indicator, peek, snap |
| D06 · Autoplay | A readable slide against an advancing timer | Interval, pause, what interaction does |
| D07 · Scroll timeline | An entrance and an explanation under the same scroll | Trigger/scrub, distance, pin, depth |
| D07 · Scroll contract | Direct scroll and smoothed catch-up, sides shuffled | Nothing — one input drives both |
| Scratch | Nothing — it is a bare patch | The markup and the CSS |
01 · Same duration, different curve
Lesson 0001 — Ease-out, or nothing
· four curves fired together, one duration
Reach for it when you're about to argue that a curve is wrong. Drop the duration to 100ms
first: below roughly 120ms all four curves are indistinguishable, and the argument you're
having is really about duration.
02 · Same animation, different property
Lesson 0002 — The four-property budget
· the same movement bought two ways, side by side
Reach for it when someone tells you a property is "basically free." Raise the count until
the two columns visibly separate, then read the frame time rather than trusting your eyes —
the point at which they split is the number worth quoting.
03 · Find the band
Lesson 0003 — Stagger and orchestration
· count, step, travel and order, with the total shown
Reach for it when you have a real n and a real budget. Set the count to what you
actually ship, then find the step that keeps the overlap ratio comfortable and the total
under about 600ms. Push the step up until it stops reading as one gesture — that edge is the
thing worth knowing.
04 · Scroll the panel
Lesson 0004 — The scroll reveal
· the same reveal, driven by an event and by scroll position
Reach for it when you're deciding whether a reveal should fire or track. Use "Stop
halfway" on the scrub column: if the content is unreadable in that frozen state, it can't be
a scrub, and no amount of tuning fixes it.
05 · Open them, then close them
Lesson 0005 — Exits
· two identical panels, entering and leaving
Reach for it when an exit feels wrong and you can't name why. Nine times out of ten it's
an ease-out exit, which spends most of its time crawling near zero opacity — the element is
gone as far as you're concerned, and the page is still waiting for it.
06 · Ask all three to do the same thing
Lesson 0006 — Choosing a tool
· one effect as a transition, as keyframes, and through WAAPI
Reach for it when a tool choice is live. Read the capability table against your
requirement rather than the general one — most of the time you never pause or seek, and the
cheapest thing that can do the job wins by default.
07 · Open it from each corner
Lesson 0007 — Transform-origin
· one popover, four trigger positions, origin on and off
Reach for it when a menu or popover feels detached from the thing that opened it. Cycle
the corners with the origin left at centre, then set it correctly and cycle again. The
difference is not subtle once you've seen it, which is the whole reason to look.
08 · Same move, two models of time
Lesson 0008 — Springs
· a tween and a spring covering identical distance
Reach for it when you're choosing between a duration and a physics model, or tuning
bounce and visualDuration without guessing. Interrupt the move
mid-flight — that's the case the spring exists for, and the one a duration can't answer.
09 · One interface, three policies
Lesson 0009 — Reduced motion
· the global reset, nothing, and the per-element answer
Reach for it when you need to show someone why the copy-pasted global reset isn't the
answer. Switch to it and watch the spinner. You don't have to say anything.
10 · One button, two kinds of hand
Lesson 0010 — Hover and press
· mouse and finger against the same button, gated and ungated
Reach for it when you're setting press depth on something that isn't a button — a card, a
row, a full-width bar — and want to see the displacement rather than compute it. Also the
fastest way to reproduce sticky hover for someone who doesn't believe it happens.
10 · Two buttons, two clocks
Lesson 0010 — Hover and press
· two real buttons one number apart, with the sides shuffled
Reach for it when someone wants to argue a press duration, or when you want to check a
number against your own hand rather than against a table. Press both, commit to one, then
reveal — the shuffle is the point, because a timing you were told about is a timing you agree
with for free.
11 · Watch it move, or watch it teleport
Lesson 0011 — Layout animation
· the same reorder unaided and through FLIP, with the four steps shown
Reach for it when a FLIP you wrote isn't animating and you're staring at code that looks
correct. Set the flush to skipped here first, so you know exactly what that
failure looks like — it is indistinguishable from having no FLIP at all, which is why it costs
people an afternoon.
11 · One tile, opened three ways
Lesson 0011 — Layout animation
· a hard cut, a cross-fade, and a named morph, from one code path
Reach for it when you're deciding how much of a view transition to specify, or when a morph
is coming out as a cross-fade and you want to confirm it's a naming problem. Fair warning: this
one really does freeze the whole workbench for its duration, which is the point.
12 · Append a row, four ways
Lesson 0012 — Things that just appeared
· the same appended row with no first value, with
@starting-style, with keyframes, and with a forced reflow
Reach for it when something you just inserted refuses to animate and the console is empty.
Start on nothing to see what that failure looks like, then read the count
underneath — getAnimations() is the instrument, and 0 means the
transition was never created rather than created wrong.
12 · Open it, then change your mind
Lesson 0012 — Things that just appeared
· a keyframe entrance and a transition entrance, closed mid-flight
by the same press
Reach for it when you are choosing between @keyframes and
@starting-style for an entrance, or when a panel snaps to fully-open before it
closes and you want to confirm why. Short delays are where the two come apart.
13 · Reveal it, two ways
Lesson 0013 — Reveals with clip-path
· the same hero revealed by moving the window and by moving the
content, both from one press
Reach for it when a reveal is being described as too soft, too tentative, or not
“editorial” enough — usually that is a fade where a mask was wanted. The badges are
measured off the headline itself, so they hold at any duration, and the three shapes where the
right pane goes to opacity only are the ones a rectangle cannot make at all.
13 · One picture, three builds
Lesson 0013 — Reveals with clip-path
· clip-path against a moving window and a static one,
under five things a reveal might be asked to do
Reach for it before writing a reveal, to answer the only question that decides the build:
could a rectangle have done this? Run the five demands to find out what each build can express,
then run the cost strip at 48, 120 and 300 copies to find where the shape stops being free on
the machine in front of you.
D01 · Twelve patterns, twelve conventions
Lesson D001 — The map, and the words for it
· each pattern beside a switch that breaks the convention it depends on
Reach for it in a review, when you need the word for something on screen: play the pattern
you think it is and see whether it matches. The verb chips under each name are the shortlist,
and the broken version is there for when the argument is about whether a convention is load-
bearing — it is faster to break it than to describe it.
D02 · Pick a home, get a motion
Lesson D002 — Where things live when they're off screen
· the transform is derived from the home, never chosen
Reach for it when someone asks whether a thing should fade or slide. Put the real element on
the bench, try the two homes being argued about, and read the line under the frame — the argument
is usually settled before anyone has said the word easing. The CSS panel is the receipt
to paste into the ticket.
D02 · Same entrance, three ways out
Lesson D002 — Where things live when they're off screen
· returns home, fades in place, leaves out the far side
Reach for it when an exit is being defended as “just a fade”. The three run at
once on purpose: played one after another they all look fine, and the difference only exists
side by side.
D03 · Which channel wins
Lesson D003 — Motion is hierarchy
· motion against size, weight and colour, one channel per tile
Reach for it when someone calls an animation decorative. Hand the motion to the plain tile
and press play: nine pixels beat every static channel on the board, which is the whole reason
an animation is never only decorative.
D03 · What does this promote
Lesson D003 — Motion is hierarchy
· same timing, same class, eight places to put it
Reach for it in a review, with the real component in mind. Find the option that matches what
is being proposed, read the line underneath, and check it against what the card is actually for.
The CSS panel is there to show that nothing but the target ever changed.
D04 · A button is seven promises
Lesson D004 — The button
· a working save action whose feedback can disappear state by state
Reach for it when a button looks complete in a mock but feels unfinished in a hand. Remove
hover, focus, press, pending or success one at a time: the action continues to work, and the
verdict names the promise that silently went missing.
D04 · Hold to confirm
Lesson D004 — The button
· a state the reader is inside and can leave
Reach for it when a destructive action needs deliberate commitment. Turn the progress
feedback off to make a still-functional interaction unusable, then compare snap-back against
the plausible-looking mistake of keeping partial progress after release.
D05 · Which one still belongs to your hand?
Lesson D005 — Things you drag
· direct tracking and a 120ms transition, simultaneously reachable
Reach for it whenever someone proposes making a drag feel smoother with a transition. The
pointer ring shows the requested position, the sides shuffle, and one chip visibly trails its
own hand.
D05 · The five moments of a drag
Lesson D005 — Things you drag
· pickup, evidence, landing and rejection around a real reorder
Reach for it when the middle of a drag works but the interaction still feels weightless or
uncertain. Switch off lift, ghost, gap, settle and snap-back independently; the reorder stays
functional while the missing promise becomes visible.
D06 · One deck, four decisions
Lesson D006 — Decks, and what the dots promise
· indicator, discoverability and release against a changing item count
Reach for it when a carousel is being reviewed at the count in the mock. Raise the count to
forty and make the dots keep their promise; hide the peek to test whether the deck is still
discoverable; let a page-shaped card drift to expose the release mismatch.
D06 · Read the slide
Lesson D006 — Decks, and what the dots promise
· autoplay against actual reading
Reach for it when autoplay is being argued as a style preference. Read the sentence at three
seconds, then let the deck ignore hover or resume after an explicit interaction. The counter
makes each otherwise-silent interruption audible.
D07 · One story, four decisions
Lesson D007 — Scroll as a timeline
· content, driver, distance, pin and depth in one scrollport
Reach for it before choosing a scroll library. Stop an entrance and an explanation halfway:
the first becomes a half-made headline, while the second remains a valid intermediate state.
Then price each beat in screens and ask what the pin is actually holding constant.
D07 · One gesture, two contracts
Lesson D007 — Scroll as a timeline
· direct scroll beside polished catch-up, with the answer hidden
Reach for it when “smooth scrolling” looks expensive in a recording but feels wrong under a
hand. One gesture drives both panes, and the marker shows where the input already asked to be;
reveal only after choosing the pane that still feels attached.
D08 · Split the text
Lesson D008 — Text that arrives
· granularity, stagger and reveal style against a hero word and a paragraph
Reach for it before adding a split-text plugin. Change the unit and delay together, then read
the measured total: the same character split that gives a hero word a pulse can turn body copy
into a queue.
D08 · Same words, different promise
Lesson D008 — Text that arrives
· mask uncovering beside fade-up arrival
Reach for it when a reveal feels like a preset instead of a decision. Press one button for both
panes, stop halfway, and decide whether the type stayed still while a window opened or arrived
dimmer and lower.
Scratch
No lesson · an empty playground, kept here so
the bench has a bare patch on it
Every lab above is a fixed experiment: it holds one thing still so you can move another.
This one holds nothing still. Paste in markup and CSS you're actually working on, or delete
what's there and start from an empty rule.
This is the one sheet not worth printing — the labs are the
content, and on paper they're empty boxes. It prints as the index and the notes, which is
probably not what you wanted. Reference 01 and
02 are the ones that survive a printer.