motion-continuity
Skill3 starsChanged 8 days agoMITView on GitHub
Use when designing, building or reviewing a transition between two states of the same thing — a card that grows into its detail view, a list that reorders, a panel or sheet that slides in and out, a column of items moving as one, an indicator that follows a moving target — or when an animation cuts, jumps when interrupted, runs ahead of what drives it, fades on its own timer, stutters on a phone, or ignores reduced motion in its script path. Framework-neutral: CSS transitions and keyframes, the Web Animations API, View Transitions, scroll-driven animations, or a per-frame loop. Cite when two objects appear mid-transition where there should be one, when a follower overtakes its driver, when related elements land on different frames, when width, height, top or left are animated, or when a requestAnimationFrame loop reads layout every frame. Not the accessibility criteria for motion (frontend-a11y) and not easing or duration token naming (token-naming-conventions).
In this repository66 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- clud-bug-collaborationSkill
- critical-issues-onlySkill
- evidence-based-reviewSkill
- respect-existing-conventionsSkill
- skill-frontmatter-qualitySkill
- apca-contrastSkill
- api-contract-enforcementSkill
- brand-voice-reviewSkill
- chroma-harmonizationSkill
- clud-bug-collaborationSkill
- component-sizing-principlesSkill
- component-sizingSkill
- composing-a-screenSkill
- consuming-a-design-systemSkill
- conventions-templateSkill
- critical-issues-onlySkill
- curating-a-skill-catalogSkill
- designing-a-design-systemSkill
- designing-elite-uiSkill
- design-system-consistencySkill
- design-token-namingSkill
- dtcg-formatSkill
- empirical-design-principlesSkill
- evidence-based-reviewSkill
- finding-a-catalog-skillSkill
- frontend-a11ySkill
- guarding-a-regressionSkill
- ios-safari-surfacesSkill
- line-height-gridSkill
- logmindSkill
- oklch-color-spaceSkill
- orchestrating-agent-delegationSkill
- orchestrating-a-multi-agent-runSkill
- orchestrating-elite-agent-qaSkill
- palette-relationshipsSkill
- pii-and-complianceSkill
- proving-an-absenceSkill
- respect-existing-conventionsSkill
- retiring-a-superseded-decisionSkill
- reviewing-design-workSkill
- semver-design-tokensSkill
- session-heartbeatSkill
- skillforgeSkill
- skill-frontmatter-qualitySkill
- spacing-systemSkill
- technical-writingSkill
- test-disciplineSkill
- thrill-designSkill
- token-frugal-toolingSkill
- token-naming-conventionsSkill
- type-scaleSkill
- udts-component-sizing-laddersSkill
- udts-dtcg-extensionsSkill
- udts-linter-rulesSkill
- udts-naming-conventionSkill
- udts-reviewSkill
- udts-semver-defaultsSkill
- udts-spacing-defaultsSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 56
No follower overtakes its driver.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Motion continuity
Motion between two states exists to tell the reader this is the same thing, moved. A cut makes them find it again; a jump makes them doubt what they saw. Every rule below protects that one reading, then keeps it cheap enough to hold at frame rate on the weakest device you ship to.
When to use
- Designing a state change of one object: open, close, expand, reorder, dismiss, switch.
- Several elements move in one gesture and must read as one.
- An animation stutters, lags its driver, overshoots, or flashes at its end.
- Choosing an implementation: CSS, Web Animations, View Transitions, or a per-frame loop.
When NOT to use
- Whether motion must be reducible or pausable — the criteria (SC 2.2.2, 2.3.3) are frontend-a11y's; rule 8 only says what the reduced path keeps.
- Naming easing and duration tokens — token-naming-conventions.
- Ambient loops with no state change — there is nothing to connect; only rules 6–8 apply.
The rules
1. An element becomes its next state; it is never replaced by it. The failure is the cut: the detail view appears and the card it came from vanishes. Recognise: a slowed capture has a frame showing two objects where there should be one, or neither. Fix: carry one element's geometry from first state to last — the same node animated, or a shared-element transition (View Transitions' view-transition-name). Exits animate too; a state that snaps back undoes what the entrance built.
2. Start from where it is. An interrupted motion continues from its current rendered position; a reversal reverses from here, not from rest. Recognise: a teleport on the frame a second input lands. Fix: read the in-flight value (getComputedStyle, animation.currentTime) before building the next motion — or make interaction motions atomic: queue input, finish the motion, then recompute state from the pointer. Pick one model per system; hover state must be recomputed when any motion ends, or it stays stale.
3. Pushed, not pulled. Whatever is driven never gets ahead of its driver. When a column moves as one, nothing gains on what is above it; an indicator following a moving target is derived from the target's position, not animated separately to the target's destination. Recognise: in a slowed capture a follower overtakes, overlaps, then settles back. Fix: compute the follower from the driver — the same timeline plus an offset.
4. Related motion shares one clock. Elements of one gesture start on one timestamp, use one curve family, and land on the same frame; a stagger is an offset on that clock, never a separate timer. Independent timers drift a frame at a time and the arrivals scatter. Fix: one timeline — Web Animations with a shared startTime on document.timeline, or one frame driver computing every element from one t.
5. A fade belongs to its motion. Opacity is timed into the movement it accompanies: an entrance pre-fades so the element is fully present as it arrives; an exit completes its fade as it leaves, not after. Recognise: the last frame of a motion shows an entrance below full opacity, or an exit still visible. Fix: put the fade on the same animation as keyframe offsets, not on its own transition.
6. Animate on the compositor. Which properties may transition is web-interface-guidelines-review §9's; travel goes on transform (translate, scale, rotate). filter is composited in Chromium and WebKit only; most else lays out or paints and misses the budget (16.7 ms at 60 Hz) on the devices you did not test. A size change becomes a scale on the container with an inverse scale on its content — and because easing makes two-keyframe scale and counter-scale disagree mid-flight, the content warps: precompute the counter-scale as sampled keyframes (about one per frame) with the easing baked in.
7. Precompute once per interaction, then hand it to the engine. Measure the first and last states once, at the start (FLIP: First, Last, Invert, Play), build the keyframes, and give them to CSS or Web Animations to play. A per-frame script that reads layout and writes styles competes with input on the main thread and stalls under load. Motion that follows continuous input — drag, scroll — uses scroll-driven animations (animation-timeline: scroll() / view(); Chrome 115, Safari 26, Firefox 159 — still behind @supports (animation-timeline: scroll()) with a frame-loop fallback) or one frame loop that writes transforms and never reads layout.
8. Reduced motion keeps the meaning, drops the travel. What prefers-reduced-motion: reduce asks for is web-interface-guidelines-review §9's; a short crossfade or an instant change is one compliant technique. The order of events and the end state stay identical; parallax and ambient loops stop. Every path honours it — CSS, Web Animations, script loops, video.
Silent failures
- Smooth on the build machine. Per-frame script holds 60 fps there and scatters on a phone. Throttle the CPU in the trace before believing it.
- End-state screenshots. A capture taken after the motion settles cannot show a cut or a jump. Slow it and record — DevTools' animation speed control, or scaled duration tokens plus a slowed clock in any frame loop. Setting
playbackRateondocument.getAnimations()slows only what is already running. - Reduced motion in CSS only — frontend-a11y's silent failure; rule 8 makes every path reach the same end state in the same order.
- A clip-path shape that holds, then snaps [observed in WebKit]: a
path()containing a zero-radius arc does not interpolate. Clamp radii to a small positive value.
Verification
- A slowed recording of each transition shows one object throughout, no frame with both or neither.
- Interrupting mid-flight produces no teleport; hover state is correct after every motion ends.
- No follower overtakes its driver; related elements land within one frame of each other.
- A performance trace during the motion shows no per-frame layout or paint, on a throttled CPU.
- With reduced motion on, the same end state is reached by every path, scripted ones included.
Cross-references
- Consumed by: thrill-design (principle 5) and designing-elite-ui (alive interaction, both worked examples); visual-polish records motion rather than judging stills.
- Motion criteria and modes: frontend-a11y.
- Code-level rule set: web-interface-guidelines-review flags layout-property transitions in a diff.
- Testing on the engine that ships: orchestrating-elite-agent-qa, ios-safari-surfaces.
Sources
- Rule 1: Material's container transform "creates a visible connection between two UI elements" (Material Components); CSS View Transitions 1.
- Rule 6: "Where possible, restrict animations to
opacityandtransform" (web.dev); sampled counter-scale keyframes (Chrome); the 16.7 ms budget is 1000 ms ÷ 60. - Rule 7: FLIP (Lewis); Scroll-driven Animations, support per MDN; shared timelines in Web Animations 1.
- Rule 8: Media Queries 5.
- House convention, not a standard: rules 2–5. No spec says a follower may not overtake its driver; the reasoning is the failure each names.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

