The title on every board in this set, as one component. Letters drop and land one at a time, the first letter turns up late, its neighbor flinches, and line 2 pops into yellow from right to left. A board’s title plays once, when it scrolls into view. The stage below runs the same title as a loop: it drops, holds, is peeled off in reading order, rests for a beat and drops again.
Its first letter arrives late.
Pops yellow, right to left.
{{f.err}}
Typing changes the letters without moving them. They fall in when you pause or press Enter, and again when you press the stage. {{demo.read}}
Reduced motion is on, so the title stays still: the settled title, line 2 already yellow, with no Pause or Step to offer. Typing still changes the letters, and Enter or leaving a changed field says so on the status line.
{{demo.say}}
The markup every board pastes, shown on real letters at rest, each on its rest cut. Each letter is a pair of spans, so the fall moves one and the flinch or the pop moves the other.
.tl-lateLine 1’s first letter. It starts 3 frames after the last regular letter, dangles over its empty slot and lands too tall.
.tl-flinch --fIts neighbor. Knocked on the tall landing, it pivots on its left foot.
.tl-spA space keeps its gap and never falls.
.tl --d --r --xEvery letter: when it starts, how far it tumbles and how far it drifts.
h1.ttl[aria-label]One heading. Screen readers hear the whole phrase once; both lines are aria-hidden.
.ttl-lineLine 1, in the text color. A block that never wraps.
.ttl-line.ttl-em --pLine 2. It lands in the text color, then pops yellow from right to left, two letters a frame.
.tl-iThe glyph inside each letter. The flinch and the pop move it, so they add to the fall instead of replacing it.
transform-origin: 50% 100%Each letter pivots on its own foot, so it squashes on the line.
svg.fx #nb-ttl-a … #nb-ttl-scThe h1’s first child: six cut filters that re-cut the font’s own glyphs. a, b and c cut a title; sa, sb and sc cut finer, under 40 px.
.tl --nb-cut-rest --nb-cut-altThe cut a letter rests on, and the one it swaps to; cut a opens every fall. Every third letter flips the pair. Each pose cuts to a new one.
Each pose is a held drawing that cuts to the next, on ones (42 ms) or on twos (83 ms). Nothing tweens: every keyframe holds with steps(1, end). A cell is as wide as its drawing is held. Keys are circled, breakdowns sit in brackets, in-betweens stay plain, and the faint letter is the slot it lands in.
The second T of STATION, which tumbles --r: -33deg and drifts --x: 0.17em. Offsets count from its own --d. Each drawing is a new cut: a, alt, rest, a, alt, rest.
Right to left, two letters a frame, set off by the late letter’s squash. Read down: one line per drawing.
While every other letter lands, the D’s slot stays empty and the title reads “OOR STATION”, the way the film’s card reads “ONSTERS, INC.” until its M arrives. The D dangles through cuts a and alt and ends on its rest cut.
The stage runs the title as a loop: it enters on the kit’s own fall-in, holds, is peeled off, rests, and enters again. One cycle of “Door station / playground” is 4,700 ms, 112 drawings of 42 ms. A board’s own title never does this: it plays once and stays.
The kit’s fall-in, as it is on every board: the letters drop, the late D dangles over its empty slot and lands too tall, its neighbor flinches and line 2 pops yellow. It grows with the title.
Dead still on the rest cut, with no boil. The films hold a title for 1.8 s (the Monsters, Inc. wordmark) to 2.2 s (“Disney Presents” in Monsters University).
A peel in reading order, and nothing fades. It is 71% of the entry, because exits are shorter than entries.
An empty frame. The credits leave 160 to 200 ms between lettering shots; a loop has no next shot to cut to, so it gets one drawing more.
Other titles change the entry, and the exit with it. The exit takes the largest sweep, in drawings, that keeps it at or under three quarters of the entry.
| Title | Enter | Exit | Exit of entry | Cycle |
|---|---|---|---|---|
| Door station / playground (this stage) | 1,424 ms | 1,008 ms | 71%, sweep 13 | 4.70 s |
| Scare floor / is open (the Showcase) | 1,214 ms | 882 ms | 73%, sweep 10 | 4.36 s |
| Hi / Yo | 920 ms | 672 ms | 73%, sweep 6 | 3.86 s |
| A / B | 878 ms | 630 ms | 72%, sweep 7 | 3.78 s |
| The longest the fields accept, 16 + 16 | 1,760 ms | 1,050 ms | 60%, sweep 13 | 5.08 s |
The late D arrived last, so it leaves first and alone, and for about three drawings the title reads “OOR STATION”. The rest follow four drawings later in reading order, line 2 two drawings behind. Each letter takes six drawings, 252 ms: a tug, then five that lift it up and to the right while it tumbles and stretches, then gone in one drawing. Each cell is the stage’s own frame at 56 px, so the top edge cuts the letter as it does on the stage. The second T of STATION is the letter, with its own --ex: 2.7em, --ey: -4.42em and --er: -166deg.
no travel: a tugtravel .0298travel .0965travel .2099travel .3848travel .6429nothing left to drawTwo pieces of cut paper tracked leaving frame in the Monsters University credits (25 fps, 14 drawings each) travel along cubic-bezier(0.6, 0.05, 0.85, 0.65): slow at first, then a whip. A letter’s six drawings sit on that curve at 1 / 6 to 5 / 6 of the time: .0298, .0965, .2099, .3848, .6429.
The curve places the drawings and never tweens between them. It is the one ease-in in the set, because this is drawn art thrown out of frame, not a control answering a press. The yellow line is the curve, the white plus marks are one piece and the periwinkle crosses the other.
For comparison, the entry. The letter P in “Disney Presents” falls at near-even spacing, smeared, holds one drawing and lands (the white plus marks).
The kit’s three travelling drawings (the periwinkle crosses) sit a little slower at the start, within one step of it, so the entry is not re-spaced.
The title typed above, letter by letter, on the 42 ms frame grid, for the whole loop: enter, hold, exit and rest. Each block is one drawing at its real length, and the sheet redraws as you type.
{{xs.sum}}
An IntersectionObserver with a 15% bottom margin sets .is-dropping just before the title is seen, then disconnects. A title already in view at mount drops before the first paint. It stays: the class is never removed and a heading never leaves, which would be wrong for navigation and for WCAG 2.2.2.
With no class, the h1 is the finished title. Nothing hides it in advance: the drop’s backwards fill parks each letter off-frame only once the drop has started, and only until its own --d. In a cross-origin frame, where the page can’t see where its frame sits, the title holds the drop’s first pose (.is-pending) until the observer answers, for at most 120 ms.
Each letter is the font’s own glyph, re-cut by one of the six filters in the h1’s svg.fx. Every drawing cuts to a fresh one: a regular letter goes a, alt, rest, a, alt, rest, and the late letter dangles through two cuts, a and alt, and ends on its rest cut. Titles under about 40 px take the fine cut, .ttl--s.
The stage is a separate element, <p role="img">, not a second heading, and its class is static in the template: only the controller sets one of .is-dropping, .is-held, .is-leaving or .is-gone. It runs while the stage is on screen (an IntersectionObserver at 30%), the tab is visible, the fonts are ready and nobody paused it. Otherwise it parks on the settled title and holds first on return, and its first cycle holds first too, so a readable title never blinks out. Each phase starts on its nominal time, so the cycle never drifts.
Pause is the kit’s plain glyph tile, 44 px tall, labelled “Pause” or “Play” and named “Pause title animation” or “Play title animation”. It cuts to the settled title and never freezes mid-flight; Play resumes at the exit. While paused, a native range called Step moves through the cycle, and its aria-valuetext reads “Drawing 40 of 112, 1,680 ms, hold”. Without Element.getAnimations the Step hides itself and Pause still works.
Typing parks the loop on the settled title, so no key ever moves a letter. 700 ms after the last key, or at once on Enter or when you leave a changed field, the title enters again, and so it does when you press the stage, with a pointer or with Enter or Space. Paused, a press runs one entry and parks. The status line is spoken only for those acts. The loop’s own cycles never write it, never call the board’s own play and never announce: the loop has no live region and its name never changes.
No class is ever set and nothing moves, so no Pause or Step is shown. The title stands still, every letter on its rest cut, with line 2 already yellow. This is the only frame it shows:
Frozen on the late letter’s dangle, its longest held pose. The blue pencil marks how far it rises above line 1. The title’s container must not clip this headroom.
76 px, every board title. The dangle rises 56 px (0.73 em).
48 px, a page header. 35 px.
31 px, the Motion board’s strip, on the fine cut. 23 px.
The dangle reads at all three sizes: the D hangs 0.18 em right of its slot and 0.73 em above the line. Titles under 40 px take the fine cut, .ttl--s, so a small letter keeps its shape. A regular letter’s first drawing climbs higher, 0.88 em above its own box for one 42 ms frame, and the glyph itself peaks 0.83 em up: 63 px at 76 px, just inside the kit’s 64 px top padding. This board leaves 84 px, so the box clears too.
Line 2 sets the running time. Up to 12 letters it lands within 1.51 s; at the 16-letter limit of the fields above it takes 1.76 s. Scream and Laugh draw it the same way, because Laugh changes only the canister fill.
Every board title in the set, at 76 px (the Showcase’s own is 112):
In the planned React build, one component per title, and one for the looping stage:
{{ln}}It renders the kit’s markup. Every number comes from the two lines:
{{ln}}There are no timing props. titleLetters(line1, line2) derives --d, --r, --x, --f and --p from each letter’s place with a fixed hash, so the same title always falls the same way. With { exit: true } it adds --e, --ex, --ey and --er for the loop; a board’s h1 never takes the flag.
useTitleDrop(ref) returns the class for the h1: none until the title is seen, is-pending for at most 120 ms in a cross-origin frame, then is-dropping, once. The loop is a <p role="img"> with a static class, and its controller owns the phase classes.
The controller is the titleloop fragment of title.js: tlpMount and tlpUnmount, tlpEnter() for a press, Enter or leaving a changed field, tlpType() for every input event, and tlpVals() for the Pause and Step labels. Only the user’s own acts call it, and only the board writes the status line.
Sources: shared.css 12i (the entry keyframes), 19 (the cut per pose) and 20 (the loop and the exit), nibparts.mjs TTL_DEFS (the six filters), title_tables.mjs (titleLetters) and title.js (the observers and the loop).
{{lede}}
Seven ribs fill in half a second. A second press while it fills jams the valve.
Steady door
Unstable door
{{b.note}}
Seven ribs fill, then the cap twists shut. Letting go early vents it.
Hold for about a second. Works with a mouse, a finger, Space or Enter.
Lane C is tagged out until a door is loaded. A door lasts one run, then the next rolls in. Press it anyway first.
{{l.door}}
{{status}}
Every control on this board works, and none of them needs resetting. Each one finishes its move and comes back by itself, inside the story: a fresh canister rolls in, a full cart is wheeled off, a spent door goes dark, the board wipes itself. Press anything. Tab, Space and Enter work too.
The one primary action on a screen. Seven ribs fill in half a second, the cap twists shut and the full canister drops onto the cart.
{{cap.says}}
Every other action. When the action fills something, the canister glyph fills with it, its cap twists on and the badge lands.
{{gly.says}}
The irreversible confirm. Hold it: seven ribs, then three turns of the cap. Let go early and it vents.
Hold for about a second. Works with a mouse, a finger, Space or Enter.
{{hold.says}}
A recoverable error. This door is unstable: the relief valve blows at rib 5, the red pen rings the gauge and names the cause, and the same button retries.
{{ovr.says}}
Disabled, and it says why. Press it anyway and the tag swings. A door runs once: then its lamp goes out, the tag hangs back up, and the next door rolls in by itself.
{{lock.says}}
Destructive actions are a glyph held for one second: seven ribs of red, then it commits. Let go early and nothing happens.
{{vent.says}}
Door roster
| Door | Lane | Last fill | Status |
|---|---|---|---|
| Door 7 | C | 7 cells, 09:41 | Sealed |
| Door 12 | A | 7 cells, 09:38 | Sealed |
| Door 3 | B | 4 cells, 09:30 | Vented |
| Door 21 | A | 7 cells, 09:12 | Sealed |
| Door 9 | C | None today | Locked out |
| Door 15 | B | 7 cells, 08:57 | Sealed |
Loading the door roster…
{{ldr.line}}
{{pop.say}}
When a wait blocks the page, the page dims and the canister line plays on one piece of paper cut by hand out of square, like the title-card cutouts: no ruled box. It opens only after 400 ms, stays at least 600 ms and leaves in 125 ms. Here the roster refreshes itself every few seconds; Refresh asks at once.
{{shl.label}}
| Door 12 | Lane A |
{{sndSay}}
In place, the same line is drawn small beside what people are reading, and the rows land when it is done. Inside a button the 24 px glyph takes over from the button's own fill until the request lands. Press Send.
Painted is live
Every seal commits and drops onto the cart.
{{mpaint.says}}
Chalk is practice
The result shows, then the board wipes itself. Nothing is sent.
{{mchalk.says}}
Card is records
Every seal deals a card you can count. A full hand is gathered up.
{{mcard.says}}
Board titles fall in like the title cards, one letter at a time, one of them late, and line 2 pops to yellow. The title holds, peels away and falls in again. Press it to restart it; Pause parks it, Step scrubs.
{{t2.says}}
{{voice}}
A set of buttons and controls I built from the scream canisters in Monsters, Inc.
I wanted every state to come from something the canister actually does in the film. The look comes from the Monsters, Inc. title cards, and the timing comes from going through the films frame by frame.
Two variations of the loader design, running on the same 1.42 second loop.
In the movie, a scream canister fills up, seals, overloads and gets tagged out. Buttons do all of that too, so I gave each state a canister mechanic.
I went through the Monsters, Inc. and Monsters University title sequences one frame at a time.
Instead of grabbing stock easing curves, I measured mine from the films. I tracked 24 moves across the title cards and the Monsters University opening credits. One of them is a logo landing. It squashes from 33 px to 24 px over three frames.
The button press uses the curve I fit through those frames. Its first drawing lands at .661, right where the logo sits on frame 2.
All 24 moves came down to 12 curves: press, release, snap, arrive, rise, drop, glide, run, overshoot, overshoot-soft, settle and whip.

I counted every move in drawings at 24 frames per second. A press is two drawings (83 ms), a release is three (125 ms), and a fill takes the film's half second.

Letters drop in one at a time, and one always shows up late, just like the title cards.

The more often you see a moment, the shorter I made it. Hover has no delay. A seal, which you only see now and then, gets a full twist-lock.

I drew the canister from the official Disney Parks canister and checked it against film stills, down to the flat top, the wider cap and foot, the recessed bands and the seven-cell window. Seven cells of 1,200 SUV add up to the 8,400 SUV on the prop.
The title cards are flat paper shapes with no outlines, so the canisters, loader and titles follow that rule too. I hand cut the buttons at first, but smooth pills worked better as controls, so the paper look stayed with the illustrations.
The handoff has the tokens, a state matrix, all 12 curves as CSS, timing for every move and an accessibility checklist. The motion is plain CSS with no animation library.