popmotion — Claude Code skill: what it does, how to install
Helps coding agents implement Disney's 12 animation principles using Popmotion. Useful for building physics-based UI motion and multi-step keyframes.
npx skills add dylantarre/animation-principles --skill popmotion -a claude-codeWhat popmotion does
This skill provides code recipes for Disney's 12 animation principles via Popmotion functions. It covers squash and stretch, anticipation, staging, and exaggeration. The instructions guide the agent using animate(), spring(), and keyframes().
Animations target element styles directly via transforms and opacity. Popmotion runs framework-agnostically, but you must have the popmotion package installed in your project dependencies for the code to work.
What it helps with
- Add physics-based spring motions to UI elements with
spring() - Build chained anticipation and wind-up movements for buttons
- Create multi-step arc trajectories using
keyframes() - Implement delayed overlapping action across layered components
Example prompts for the agent
- Add a spring overshoot animation to this card using Popmotion.
- Create a keyframes arc animation for the floating badge.
- Implement squash and stretch for the button on click.
How to install popmotion
1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill popmotion -a claude-code2Manually: put the files in place
~/.claude/skills/popmotion/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/popmotion/
1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill popmotion -a codex2Manually: put the files in place
.agents/skills/popmotion/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill popmotion -a cursor2Manually: put the files in place
.cursor/skills/popmotion/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install dylantarre/animation-principles popmotion2Manually: put the files in place
.github/skills/popmotion/SKILL.md1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill popmotion -a gemini-cli2Platform CLI
gemini skills install https://github.com/dylantarre/animation-principles --path skills/09-by-tool-framework/popmotionManually: put the files in place
.devin/skills/popmotion/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill popmotion -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about popmotion
How to install popmotion in Claude Code?
Run npx skills add dylantarre/animation-principles --skill popmotion -a claude-code.
What does the popmotion skill do?
It provides ready-to-use patterns for Disney's 12 animation principles using Popmotion's animate, spring, and keyframes functions.
Does this skill require React or another frontend library?
No, Popmotion is framework-agnostic. The skill's code patterns update styles directly on native DOM elements.
Source text
SKILL.md · MIT
---
name: popmotion
description: Use when implementing Disney's 12 animation principles with Popmotion's functional animation library
---
# Popmotion Animation Principles
Implement all 12 Disney animation principles using Popmotion's composable animation functions.
## 1. Squash and Stretch
```javascript
import { animate } from "popmotion";
animate({
from: { scaleX: 1, scaleY: 1 },
to: { scaleX: 1.2, scaleY: 0.8 },
duration: 150,
onUpdate: ({ scaleX, scaleY }) => {
element.style.transform = `scaleX(${scaleX}) scaleY(${scaleY})`;
}
});
```
## 2. Anticipation
```javascript
// Wind up then action
animate({
from: 0,
to: 10,
duration: 200,
onUpdate: v => element.style.transform = `translateY(${v}px) scaleY(0.9)`,
onComplete: () => {
animate({
from: 10,
to: -200,
duration: 400,
ease: easeOut,
onUpdate: v => element.style.transform = `translateY(${v}px)`
});
}
});
```
## 3. Staging
```javascript
animate({
from: 1,
to: 0.6,
onUpdate: v => bg.style.opacity = v
});
animate({
from: 1,
to: 1.1,
onUpdate: v => hero.style.transform = `scale(${v})`
});
```
## 4. Straight Ahead / Pose to Pose
```javascript
import { keyframes } from "popmotion";
keyframes({
values: [
{ x: 0, y: 0 },
{ x: 100, y: -50 },
{ x: 200, y: 0 },
{ x: 300, y: -30 }
],
duration: 1000,
onUpdate: ({ x, y }) => {
element.style.transform = `translate(${x}px, ${y}px)`;
}
});
```
## 5. Follow Through and Overlapping Action
```javascript
animate({ from: 0, to: 200, duration: 500,
onUpdate: v => body.style.transform = `translateX(${v}px)` });
animate({ from: 0, to: 200, duration: 500, elapsed: -50, // delay
onUpdate: v => hair.style.transform = `translateX(${v}px)` });
animate({ from: 0, to: 200, duration: 600, elapsed: -100,
onUpdate: v => cape.style.transform = `translateX(${v}px)` });
```
## 6. Slow In and Slow Out
```javascript
import { animate, easeInOut, easeIn, easeOut } from "popmotion";
animate({
from: 0,
to: 300,
duration: 600,
ease: easeInOut,
onUpdate: v => element.style.transform = `translateX(${v}px)`
});
```
## 7. Arc
```javascript
keyframes({
values: [
{ x: 0, y: 0 },
{ x: 100, y: -100 },
{ x: 200, y: 0 }
],
duration: 1000,
ease: easeInOut,
onUpdate: ({ x, y }) => {
element.style.transform = `translate(${x}px, ${y}px)`;
}
});
```
## 8. Secondary Action
```javascript
// Primary action triggers secondary
animate({
from: 1, to: 1.1, duration: 200,
onUpdate: v => button.style.transform = `scale(${v})`,
onComplete: () => {
animate({
from: 0, to: 15, duration: 150,
onUpdate: v => icon.style.transform = `rotate(${v}deg)`
});
}
});
```
## 9. Timing
```javascript
import { spring } from "popmotion";
// Fast
animate({ from: 0, to: 100, duration: 150 });
// Spring physics
spring({
from: 0,
to: 100,
stiffness: 300,
damping: 20,
onUpdate: v => element.style.transform = `translateX(${v}px)`
});
// Slow
animate({ from: 0, to: 100, duration: 800, ease: easeOut });
```
## 10. Exaggeration
```javascript
spring({
from: { scale: 1, rotate: 0 },
to: { scale: 1.5, rotate: 720 },
stiffness: 200,
damping: 10, // low = overshoot
onUpdate: ({ scale, rotate }) => {
element.style.transform = `scale(${scale}) rotate(${rotate}deg)`;
}
});
```
## 11. Solid Drawing
```javascript
animate({
from: { rotateX: 0, rotateY: 0 },
to: { rotateX: 45, rotateY: 30 },
duration: 500,
onUpdate: ({ rotateX, rotateY }) => {
box.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
}
});
```
## 12. Appeal
```javascript
animate({
from: 1,
to: 1.02,
duration: 300,
ease: easeOut,
onUpdate: v => {
card.style.transform = `scale(${v})`;
card.style.boxShadow = `0 ${20*v}px 40px rgba(0,0,0,${0.2*v})`;
}
});
```
## Key Popmotion Features
- `animate()` - Tween animations
- `spring()` - Physics-based spring
- `keyframes()` - Multi-step animations
- `decay()` - Momentum/inertia
- `easeIn`, `easeOut`, `easeInOut` - Easing functions
- Composable functions - mix and pipe
- Framework agnostic
- Powers Framer Motion under the hood
© dylantarre · MIT · dylantarre/animation-principles