Polish and refine existing motion against the transitions.dev motion-token scale — duration, distance, scale, blur, and easing — plus the rules for WHEN each token applies (open/close asymmetry, hover-in vs hover-out, stagger offsets, and intent delays). An add-on to the transitions-dev skill, focused on tuning what already animates rather than adding new transitions. Use when the user asks to "polish my transitions", "refine the motion", "tune the timing / easing", "make the animation feel better / less janky", "tighten the durations", "fix the stagger", "align to the motion tokens", "audit the motion", "review my animations", "scan for ad-hoc transitions", "tokenize my animations", or runs the commands transitions review or transitions polish. Also drives the Refine panel's Small refinement feature. Triggers on "motion polish", "transition polish", "refine motion", "timing feels off", "too slow / too fast", "stagger", "delay", "open close timing", "hover in out".
76
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
An add-on to the transitions-dev skill. Where transitions-dev installs whole transitions, this skill polishes motion that already exists: it scans the five motion-token dimensions — duration, distance, scale, blur, easing — and suggests the token each value should reference, plus the higher-order rules for when a value is right (open/close asymmetry, hover in/out, stagger, delay).
Install it alongside transitions-dev, or on its own — the token values are restated below so this skill can audit a project standalone. When it is installed, the transitions.dev Refine panel automatically feeds these rules into every Small refinement job.
A value is not "wrong" because it is off by 20ms. It is wrong when it does not fit what the motion does. Always infer the usage first — modal close, dropdown open, tooltip, badge appear, page slide, text reveal, shake — then pick the token whose documented usage matches. A 300ms modal close maps to --duration-quick (150ms) because both are "modal close", even though the numbers differ. If a value's usage matches no token usage, leave it untouched. Never force a swap just because a number is close.
Same scale the transitions.dev Motion tokens tab exposes. Copy this skill's _root.css into your project once; once imported, reference any token as var(--…). The transitions-dev transitions ship literal values, so they work without these tokens — install this skill to tune them against the shared scale.
| Token | Value | Usage |
|---|---|---|
--duration-stagger | 40ms | per-item stagger offset |
--duration-micro | 80ms | tooltip/path delay, shake segment, large stagger |
--duration-quick | 150ms | modal/dropdown close, text swap, tooltip appear |
--duration-fast | 250ms | icon swap, dropdown/modal open, tabs sliding, page slide |
--duration-medium | 350ms | panel close, toast close |
--duration-slow | 400ms | panel open, skeleton content reveal, input clear |
--duration-very-slow | 500ms | emphasis moments, badge appear, text reveal, success check |
| Token | Value | Usage |
|---|---|---|
--ease-smooth-out | cubic-bezier(0.22, 1, 0.36, 1) | modal/dropdown/panel open + close, page slide, resize, position change |
--ease-in-out | ease-in-out | icon swap, text swap, text reveal, skeleton reveal |
--ease-out | ease-out | tooltip open / close |
--ease-linear | linear | shimmer, skeleton pulse, spinner |
--ease-bounce | cubic-bezier(0.34, 1.36, 0.64, 1) | badge pop open |
--ease-bounce-strong | cubic-bezier(0.34, 3.85, 0.64, 1) | bouncy hover-out (avatar return) |
--ease-smooth-out is the default. Nudge generic ease, ease-in, or any hand-rolled cubic-bezier(...) / linear(...) toward it only for surface motion (open/close, slide, resize, position). Leave the other five token easings alone — they are already on-grid and each carries its own intent.
| Token | Value | Usage |
|---|---|---|
--distance-micro | 4px | text swap |
--distance-small | 6px | error shake (small segment) |
--distance-base | 8px | badge diagonal reveal, page slide, error shake (large segment) |
--distance-medium | 12px | text reveal |
--distance-large | 30px | check badge appear |
Travel distance scales down with frequency and up with ceremony: an in-place text swap barely moves (4px), a page slide travels a readable 8px, a one-off celebratory badge can sweep 30px. If a translate distance is larger than ~40px for anything but a full panel/drawer, it usually reads as sluggish — pull it toward --distance-base.
| Token | Value | Usage |
|---|---|---|
--scale-large | 0.96 | modal open / close |
--scale-medium | 0.97 | dropdown open |
--scale-small | 0.98 | tooltip open |
--scale-tiny | 0.99 | dropdown close |
The captured value is the non-resting "pre" scale the surface animates from; it always settles to 1. Bigger surfaces start from further away (0.96 modal), small hints barely scale (0.98–0.99). A pre-scale below ~0.9 reads as a "zoom" and rarely fits UI chrome — snap it to the usage token.
| Token | Value | Usage |
|---|---|---|
--blur-small | 2px | panel reveal, icon swap, text swap, skeleton reveal, number pop-in |
--blur-medium | 3px | page slide, text reveal |
--blur-large | 8px | success check open |
Blur is the non-resting "pre" blur, settling to 0. Use it to soften a swap or slide, never on a plain fade or a color/theme change. Blur can be absent as well as off-token: when the usage clearly calls for one (a page slide with no blur lane) suggest adding --blur-medium.
Opening is an invitation; closing should get out of the way. Closes are faster and quieter than opens.
--duration-fast → --duration-quick); panel open 400ms → close 350ms (--duration-slow → --duration-medium); toast close 350ms (--duration-medium).--ease-smooth-out. Overshoot curves belong to entrances only (badge pop, number pop-in) — never bounce a close.--duration-fast-or-less lift with --ease-smooth-out.--ease-bounce-strong (avatar return, cubic-bezier(0.34, 3.85, 0.64, 1)) so the row settles instead of snapping. This is the one place the out is more elaborate than the in.--duration-stagger (40ms) per item; step up to --duration-micro (80ms) for a few large items. Keep the total stagger (offset × item count) under ~300ms so the last item doesn't feel late — for long lists, cap the number of staggered items or shrink the offset.--duration-micro (80ms) before appearing so a passing cursor doesn't trigger it; the success-check path draw uses the same 80ms beat. A delay is right when you want to filter accidental triggers or sequence two things — not to pad a slow animation.The skill exposes two namespaced verbs. Every command starts with transitions so the invocation never collides with verbs from other skills installed in the same project. review reports; polish applies.
Trigger phrases: transitions review, "review my animations", "audit the motion", "scan for ad-hoc transitions", "tokenize my animations", "where are my durations off", "align to the motion tokens", "make the timing consistent".
Behaviour:
style= / CSS-in-JS, styled-components, <style> blocks, and Tailwind arbitrary values (duration-[300ms], [transition-timing-function:...]) — for all five dimensions: durations (…ms/…s), easings (cubic-bezier(...) / keywords), translate distances (translate*(…px)), scale(...), and blur(...). Read @keyframes via the animation that drives them.transitions-dev's transitions apply domain.path/to/Component.css:L42 — modal close: 300ms → var(--duration-quick) (150ms) — close should be quicker than the 250ms open.path/to/List.css:L20 — stagger: 120ms → var(--duration-stagger) (40ms) — 8 items × 120ms = 960ms total, last item feels late.no matching token usage and leave them.transitions polish to apply these changes, or confirm any line to apply individually."Trigger phrases: transitions polish, "polish my transitions", "refine the motion", "tune the timing / easing", "apply the motion tokens", "fix the stagger", "tokenize my animations".
Behaviour:
transitions review in this session, run the same scan from transitions review first (steps 1–4) to build the change list. If they named a specific file, line, or value, scope the scan to that context.var(--…) references where the project's _root.css (this skill's _root.css) is already imported; otherwise write the token's literal value and note that importing _root.css would let future tweaks happen in one place.0.25s vs 250ms) unless switching to var(--…).style objects, and Motion/Framer variants._root.css is not yet in the project, offer to install it (once) before or alongside the polish pass.When this skill is installed in a project, the transitions.dev Refine panel's Small refinement tab automatically inlines the compact rules in _refine-rules.md into its agent prompt, so per-click suggestions honor these rules with zero extra file reads. transitions review mirrors that audit at project scale; transitions polish writes the accepted tweaks to source.
Natural next additions to this skill: performance hygiene (transition: all, animating width/top/box-shadow instead of transform/opacity, will-change misuse), missing prefers-reduced-motion detection, a cross-project consistency audit (same-purpose transitions using different values), Tailwind/Framer token adapters, and a "motion polish score" report.
67d5c67
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.