Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Define a motion system with duration tokens, easing vocabulary, and reduced-motion handling for consistent animation across a product.
.claude/skills/owl-listener-motion-system/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 16% | 0% |
You are an expert in defining motion as a systematic design token layer, not a collection of one-off animations.
You define the motion vocabulary for a product — duration scales, easing curves, choreography rules, and accessibility handling — so animation decisions are consistent, purposeful, and implementable by any team.
Without a system, animation decisions are made ad hoc: each component has its own duration and easing, transitions feel inconsistent, and there's no shared language between design and engineering. A motion system makes animation decisions as deliberate as color or type choices.
Define a small set of named duration values. Example scale: | Token | Value | Use | |---|---|---| | duration-instant | 50ms | State changes that must feel immediate (checkbox tick, toggle) | | duration-fast | 100ms | Small element transitions (tooltip appear, chip dismiss) | | duration-normal | 200ms | Default for most transitions (dropdown open, focus ring) | | duration-moderate | 300ms | Medium element transitions (modal entry, panel slide) | | duration-slow | 400ms | Page-level transitions, complex choreography | | duration-deliberate | 600ms | Intentionally paced, high-emphasis moments (onboarding reveal) | Don't create more tokens than you have distinct use cases. 4–6 values is usually enough.
Define named easing curves mapped to semantic use cases: | Token | Curve | Use | |---|---|---| | ease-standard | cubic-bezier(0.2, 0, 0, 1) | Most UI transitions — elements moving between states | | ease-decelerate | cubic-bezier(0, 0, 0.2, 1) | Elements entering the screen | | ease-accelerate | cubic-bezier(0.3, 0, 1, 0.3) | Elements leaving the screen | | ease-spring | spring / cubic-bezier(0.34, 1.56, 0.64, 1) | Playful or tactile interactions (FAB expand, drawer bounce) | | ease-linear | linear | Looping animations only (progress spinners, shimmer) |
When multiple elements animate together:
The prefers-reduced-motion: reduce media query must be handled at the system level, not component by component:
duration-instant (0ms or 1ms) override for all duration tokens under reduced-motion, applied globally:root level within a prefers-reduced-motion queryEvery product's motion system should be grounded in 3–5 principles:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 29,185 | 22,375 | -23% | 1 | 1 | 0% | 6,207 | 5,420 | -13% | 0 | 0 | — |
case-02 | fail→pass | 18,495 | 15,799 | -15% | 1 | 1 | 0% | 3,640 | 4,372 | +20% | 0 | 0 | — |
case-03 | fail→fail | 25,084 | 22,945 | -9% | 1 | 1 | 0% | 4,909 | 5,277 | +7% | 0 | 0 | — |
case-04 | pass→pass | 21,127 | 21,457 | +2% | 1 | 1 | 0% | 4,682 | 5,749 | +23% | 0 | 0 | — |
case-05 | pass→pass | 23,767 | 27,160 | +14% | 1 | 1 | 0% | 6,185 | 7,194 | +16% | 0 | 0 | — |
case-06 | pass→pass | 18,244 | 18,514 | +1% | 1 | 1 | 0% | 3,622 | 4,792 | +32% | 0 | 0 | — |
case-07 | fail→pass | 12,981 | 11,414 | -12% | 1 | 1 | 0% | 2,779 | 3,261 | +17% | 0 | 0 | — |
case-08 | fail→fail | 10,101 | 9,223 | -9% | 1 | 1 | 0% | 1,870 | 2,779 | +49% | 0 | 0 | — |
case-09 | fail→fail | 13,294 | 12,684 | -5% | 1 | 1 | 0% | 2,456 | 3,346 | +36% | 0 | 0 | — |
case-10 | pass→pass | 12,867 | 15,909 | +24% | 1 | 1 | 0% | 2,193 | 3,625 | +65% | 0 | 0 | — |
case-11 | fail→pass | 11,555 | 8,826 | -24% | 1 | 1 | 0% | 2,266 | 2,868 | +27% | 0 | 0 | — |
case-12 | pass→pass | 12,738 | 12,806 | +1% | 1 | 1 | 0% | 2,290 | 3,644 | +59% | 0 | 0 | — |
case-13 | fail→pass | 10,059 | 12,251 | +22% | 1 | 1 | 0% | 1,831 | 3,266 | +78% | 0 | 0 | — |
case-14 | pass→pass | 14,636 | 15,809 | +8% | 1 | 1 | 0% | 2,779 | 3,800 | +37% | 0 | 0 | — |
case-15 | fail→pass | 12,034 | 7,492 | -38% | 1 | 1 | 0% | 2,186 | 2,527 | +16% | 0 | 0 | — |
case-16 | fail→fail | 12,447 | 10,108 | -19% | 1 | 1 | 0% | 2,463 | 3,129 | +27% | 0 | 0 | — |
case-17 | fail→pass | 18,222 | 18,148 | -0% | 1 | 1 | 0% | 3,066 | 3,884 | +27% | 0 | 0 | — |
case-18 | pass→pass | 11,792 | 12,581 | +7% | 1 | 1 | 0% | 2,026 | 3,213 | +59% | 0 | 0 | — |
case-19 | fail→fail | 16,950 | 16,161 | -5% | 1 | 1 | 0% | 3,047 | 3,786 | +24% | 0 | 0 | — |
case-20 | pass→pass | 12,691 | 12,804 | +1% | 1 | 1 | 0% | 2,237 | 3,298 | +47% | 0 | 0 | — |
case-21 | pass→pass | 14,436 | 16,851 | +17% | 1 | 1 | 0% | 2,766 | 4,312 | +56% | 0 | 0 | — |
case-22 | pass→pass | 14,486 | 12,321 | -15% | 1 | 1 | 0% | 2,475 | 3,507 | +42% | 0 | 0 | — |
case-23 | fail→pass | 12,192 | 9,748 | -20% | 1 | 1 | 0% | 2,571 | 2,913 | +13% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +30 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.