gesture-responses — Claude Code skill: gesture animations
A skill for animating tap, swipe and drag responses: it sets timings, easing curves and code patterns for CSS and JS.
npx skills add dylantarre/animation-principles --skill gesture-responses -a claude-codeWhat gesture-responses does
The skill takes Disney's 12 animation principles and maps them onto direct interactions: button presses, drag feedback, swipe responses, tap ripples. Each principle comes with what it looks like in code — an element compressing on press, springing back on release, the animation starting from the point of contact.
Inside there is a timing table per gesture type plus ready patterns. A button press is transform: scale(0.97) over 50ms, release runs 250ms with cubic-bezier(0.34, 1.56, 0.64, 1), a ripple expands over 600ms. Drag feedback gets a JavaScript example: movement with a slight lag, then a spring snap back.
The skill states its own hard limit: a gesture response has to stay under 100ms or the link between action and animation breaks. That makes real touch devices the place to check your work — a desktop emulator hides the lag.
What it helps with
- make a button respond to press instantly
- add a ripple from the tap point
- snap a dragged element back with a spring
- pick timings and easing for a swipe
- define rest, pressed and released states for an interactive element
Example prompts for the agent
- make the button press response follow the gesture-responses skill
- add a ripple from the tap point and an overshoot on release
- set up drag feedback with a slight lag and a snap back
How to install gesture-responses
1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill gesture-responses -a claude-code2Manually: put the files in place
~/.claude/skills/gesture-responses/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/gesture-responses/
1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill gesture-responses -a codex2Manually: put the files in place
.agents/skills/gesture-responses/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill gesture-responses -a cursor2Manually: put the files in place
.cursor/skills/gesture-responses/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install dylantarre/animation-principles gesture-responses2Manually: put the files in place
.github/skills/gesture-responses/SKILL.md1Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill gesture-responses -a gemini-cli2Platform CLI
gemini skills install https://github.com/dylantarre/animation-principles --path skills/05-by-animation-type/gesture-responsesManually: put the files in place
.devin/skills/gesture-responses/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add dylantarre/animation-principles --skill gesture-responses -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 gesture-responses
How do I install gesture-responses in Claude?
Run npx skills add dylantarre/animation-principles --skill gesture-responses -a claude-code. The skill file lands in ~/.claude/skills/gesture-responses/SKILL.md.
What does gesture-responses do?
It describes animation for direct interactions: presses, drags, swipes and taps. You get timings, easing curves and CSS and JavaScript examples.
Where does gesture-responses break down?
It requires a gesture response under 100ms. A slower animation kills the direct-manipulation feel, so test on actual touch devices.
Source text
SKILL.md · MIT
---
name: gesture-responses
description: Use when responding to touch or click interactions - button presses, drag feedback, swipe responses, tap ripples, or any direct manipulation animation.
---
# Gesture Response Animations
Apply Disney's 12 principles to direct user interactions.
## Principle Application
**Squash & Stretch**: Elements compress on press (scale 0.95-0.97), spring back on release.
**Anticipation**: The press IS the anticipation. Response should be immediate - no delay.
**Staging**: Response originates from interaction point. Ripples expand from tap location.
**Straight Ahead vs Pose-to-Pose**: Define rest, pressed, and released poses. Transitions flow between them.
**Follow Through & Overlapping**: Release animation overshoots rest position. Scale to 1.02, settle to 1.0.
**Slow In/Slow Out**: Press: instant. Release: ease-out with overshoot `cubic-bezier(0.34, 1.56, 0.64, 1)`.
**Arcs**: Drag elements follow finger with slight lag on curves. Snapping follows arc to destination.
**Secondary Action**: Press triggers ripple + scale + shadow change simultaneously.
**Timing**:
- Press response: 0-50ms (must feel instant)
- Release recovery: 150-300ms (can be playful)
- Ripple expansion: 400-600ms (decorative, can be slower)
**Exaggeration**: Subtle for press (0.97), playful for release (overshoot 1.03).
**Solid Drawing**: Pressed state should feel "pushed in" - smaller scale, reduced shadow, shifted color.
**Appeal**: Gestures should feel physically satisfying. Like pressing a real button.
## Timing Recommendations
| Gesture | Press Duration | Release Duration | Easing |
|---------|---------------|------------------|--------|
| Tap/Click | 50ms | 200ms | ease-out + overshoot |
| Long Press | 50ms | 300ms | ease-out |
| Drag Start | 100ms | - | ease-out |
| Drag Release | - | 300ms | spring |
| Swipe | - | 200-400ms | ease-out |
| Pinch | real-time | 300ms | spring |
## Implementation Patterns
```css
/* Button press */
.button {
transition: transform 50ms ease-out;
}
.button:active {
transform: scale(0.97);
}
/* Release with overshoot */
.button:not(:active) {
transition: transform 250ms cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* Material ripple */
.ripple {
animation: ripple 600ms ease-out forwards;
}
@keyframes ripple {
from {
transform: scale(0);
opacity: 0.5;
}
to {
transform: scale(4);
opacity: 0;
}
}
```
## Drag Feedback Pattern
```javascript
// Smooth drag with slight lag
element.style.transform = `translate(${x}px, ${y}px)`;
element.style.transition = 'transform 50ms ease-out';
// Snap back with spring
element.style.transition = 'transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1)';
element.style.transform = 'translate(0, 0)';
```
## Critical Rule
Gesture responses must be under 100ms to feel connected to the action. Anything slower breaks the direct manipulation illusion. Test on actual touch devices.
© dylantarre · MIT · dylantarre/animation-principles