
12 Principles Of Animation
Audit CSS and motion code against Disney-style web animation rules before shipping UI polish.
Overview
12-principles-of-animation is an agent skill most often used in Build (also Ship → review) that audits web animation code against Disney-inspired timing, easing, physics, and staging rules and reports file:line findings.
Install
npx skills add https://github.com/raphaelsalaja/skill --skill 12-principles-of-animationWhat is this skill?
- Outputs review findings in file:line format for fast fixes in the repo
- 4 prioritized rule categories: Timing, Easing, Physics, and Staging with prefixed rule IDs
- Enforces timing-under-300ms for user-initiated animations and timing-consistent across similar controls
- Flags anti-patterns such as entrance animation on context menus (exit-only rule)
- Adapted from Disney’s 12 principles for practical web interface motion
- 4 prioritized rule categories: Timing, Easing, Physics, Staging
- User-initiated animations must complete within 300ms (timing-under-300ms)
Adoption & trust: 1 installs on skills.sh; 18 GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
You shipped motion in CSS or components but cannot tell if durations, easing, or entrance behavior will feel sluggish, inconsistent, or wrong for real UI patterns.
Who is it for?
Solo builders polishing interaction design in React/CSS who want objective motion QA without hiring a motion specialist.
Skip if: Teams that only need brand illustration or video animation pipelines with no in-app UI motion code to review.
When should I use this skill?
Reviewing motion, implementing animations, or checking animation quality.
What do I get? / Deliverables
You get a prioritized, file:line checklist of animation rule passes and fails so you can align timing, easing, and staging before merge or release.
- File:line rule findings grouped by timing, easing, physics, and staging
- Pass/fail examples aligned to documented rule IDs
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Animation implementation lives in frontend code, so Build → frontend is the canonical shelf for this checker. The skill reads UI motion code (CSS, React motion) and enforces timing, easing, physics, and staging on interface elements.
Where it fits
After adding button hovers and drawer transitions, run the skill on changed components to enforce sub-300ms user-initiated timing.
Before merging a UI PR, scan motion diffs for inconsistent durations across primary and secondary buttons.
Polish landing-page hero motion so entrance staging does not fight readability on first paint.
How it compares
Use as a structured motion linter for UI code instead of vague “make it smoother” chat feedback.
Common Questions / FAQ
Who is 12-principles-of-animation for?
Indie and solo frontend builders, design-engineers, and agents reviewing CSS or component motion before ship.
When should I use 12-principles-of-animation?
During Build when implementing animations, before Ship when reviewing motion in a PR, or when a launch page’s interactions feel inconsistent or too slow.
Is 12-principles-of-animation safe to install?
It is intended to read and analyze your code paths you specify; review the Security Audits panel on this catalog page before enabling broad agent filesystem access.
SKILL.md
READMESKILL.md - 12 Principles Of Animation
# 12 Principles of Animation Review animation code for compliance with Disney's 12 principles adapted for web interfaces. ## How It Works 1. Read the specified files (or prompt user for files/pattern) 2. Check against all rules below 3. Output findings in `file:line` format ## Rule Categories | Priority | Category | Prefix | |----------|----------|--------| | 1 | Timing | `timing-` | | 2 | Easing | `easing-` | | 3 | Physics | `physics-` | | 4 | Staging | `staging-` | ## Rules ### Timing Rules #### `timing-under-300ms` User-initiated animations must complete within 300ms. **Fail:** ```css .button { transition: transform 400ms; } ``` **Pass:** ```css .button { transition: transform 200ms; } ``` #### `timing-consistent` Similar elements must use identical timing values. **Fail:** ```css .button-primary { transition: 200ms; } .button-secondary { transition: 150ms; } ``` **Pass:** ```css .button-primary { transition: 200ms; } .button-secondary { transition: 200ms; } ``` #### `timing-no-entrance-context-menu` Context menus should not animate on entrance (exit only). **Fail:** ```tsx <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} /> ``` **Pass:** ```tsx <motion.div exit={{ opacity: 0 }} /> ``` ### Easing Rules #### `easing-entrance-ease-out` Entrances must use `ease-out` (arrive fast, settle gently). **Fail:** ```css .modal-enter { animation-timing-function: ease-in; } ``` **Pass:** ```css .modal-enter { animation-timing-function: ease-out; } ``` #### `easing-exit-ease-in` Exits must use `ease-in` (build momentum before departure). **Fail:** ```css .modal-exit { animation-timing-function: ease-out; } ``` **Pass:** ```css .modal-exit { animation-timing-function: ease-in; } ``` #### `easing-no-linear-motion` Linear easing should only be used for progress indicators, not motion. **Fail:** ```css .card { transition: transform 200ms linear; } ``` **Pass:** ```css .progress-bar { transition: width 100ms linear; } ``` #### `easing-natural-decay` Use exponential ramps, not linear, for natural decay. **Fail:** ```ts gain.gain.linearRampToValueAtTime(0, t + 0.05); ``` **Pass:** ```ts gain.gain.exponentialRampToValueAtTime(0.001, t + 0.05); ``` ### Physics Rules #### `physics-active-state` Interactive elements must have active/pressed state with scale transform. **Fail:** ```css .button:hover { background: var(--gray-3); } /* Missing :active state */ ``` **Pass:** ```css .button:active { transform: scale(0.98); } ``` #### `physics-subtle-deformation` Squash/stretch deformation must be subtle (0.95-1.05 range). **Fail:** ```tsx <motion.div whileTap={{ scale: 0.8 }} /> ``` **Pass:** ```tsx <motion.div whileTap={{ scale: 0.98 }} /> ``` #### `physics-spring-for-overshoot` Use springs (not easing) when overshoot-and-settle is needed. **Fail:** ```tsx <motion.div transition={{ duration: 0.3, ease: "easeOut" }} /> // When element should bounce/settle ``` **Pass:** ```tsx <motion.div transition={{ type: "spring", stiffness: 500, damping: 30 }} /> ``` #### `physics-no-excessive-stagger` Stagger delays must not exceed 50ms per item. **Fail:** ```tsx transition={{ staggerChildren: 0.15 }} ``` **Pass:** ```tsx transition={{ staggerChildren: 0.03 }} ``` ### Staging Rules #### `staging-one-focal-point` Only one element should animate prominently at a time. **Fail:** ```tsx // Multiple elements with competing entrance animations <motion.div animate={{ scale: 1.1 }} /> <motion.div animate={{ scale: 1.1 }} /> ``` #### `staging-dim-background` Modal/dialog backgrounds should dim to direct focus. **Fail:** ```css .overlay { background: transparent; }