motion-review
Reviewing Motion in a Diff
Default to flagging. Approval is earned, not assumed: motion that runs is not motion that passes, and a transition that merely works while landing from the wrong origin, firing on a keyboard shortcut, or holding the user for 450ms is a regression this diff introduced. Read every motion hunk before judging any line of it, measure each animation against a fixed bar rather than against your mood, and close with one word — Block or Approve. A review that ends in a paragraph of impressions has not been done.
This skill reviews the motion in a diff and nothing else. ui-review owns non-motion UI code; on a mixed diff ui-review runs first and hands its motion hunks here, so never re-report its spacing, type, or contrast findings. Two further boundaries: a whole-codebase sweep that ends in a prioritized fix plan is motion-audit, not this skill, and a rendered screen or screen recording rather than source text is design-critique.
Read the project's own motion vocabulary before writing the first finding. Grep for --ease-, --duration-, the Tailwind theme block, and whichever of motion/framer-motion, React Spring, GSAP, or plain CSS the package manifest actually carries. Review the diff against that system: if the repo defines --ease-drawer, a hand-typed cubic-bezier(0.32, 0.72, 0, 1) in the diff is a finding even though the number is correct, and every fix you propose must be written in the repo's existing tokens. A review that bolts on a parallel easing vocabulary has added the exact debt it was called to prevent.
Quick Reference
| Topic | Where |
|---|---|
| Exact curves, durations, spring configs, velocity and stagger numbers | standards.md — open it the moment a finding needs a number, before you type one from memory |
| Documented exemptions and known false positives | standards.md — open it before reporting anything that looks like a violation but sits on a modal, a marketing page, or a reduced-motion block |
Core Principles
- Ask the frequency question before the easing question. A perfectly eased 200ms animation on a command-palette toggle is still a Block, and re-easing it is wasted work: the fix is deletion. The gate is
100+/day → no animation, ever, and any keyboard-initiated action is disqualified regardless of count. Exception: marketing and explanatory surfaces, where a given visitor sees the motion roughly once and the frequency gate does not bind.