From dylantarre-animation-principles
Use when drawing user focus - notification badges, new feature highlights, error callouts, promotional banners, or any animation meant to attract attention.
npx claudepluginhub joshuarweaver/cascade-content-creation-misc-1 --plugin dylantarre-animation-principlesThis skill uses the workspace's default tool permissions.
Apply Disney's 12 principles to focus-drawing motion.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Apply Disney's 12 principles to focus-drawing motion.
Squash & Stretch: Pulsing scale draws attention. 1.0 → 1.1 → 1.0 cycle catches peripheral vision.
Anticipation: Brief pause before attention animation. Let it build then release.
Staging: Position attention elements where users will see them. Corner badges, inline highlights.
Straight Ahead vs Pose-to-Pose: Design attention states: rest, active/pulsing, acknowledged.
Follow Through & Overlapping: Badge pulses, then count updates. Stagger the attention signals.
Slow In/Slow Out: Ease in/out on pulses. Smooth oscillation is less jarring than sharp bounces.
Arcs: Shake animations follow arc patterns. Left-right with slight vertical oscillation.
Secondary Action: Pulse + glow + color shift for maximum attention (use sparingly).
Timing:
Exaggeration: This is where exaggeration shines. Scale to 1.2, bright colors, bold motion.
Solid Drawing: Attention elements must still feel part of the UI, not floating or detached.
Appeal: Attention should feel like helpful notification, not aggressive demand.
| Attention Type | Duration | Cycles | Decay |
|---|---|---|---|
| Badge Pulse | 300ms | 2-3 | Stop after animation |
| Notification Dot | 2000ms | 3 | 6 seconds total |
| New Feature | 500ms | 2 | Stay subtle |
| Error Shake | 400ms | 1 | None |
| Urgent Alert | 1000ms | infinite | Until dismissed |
| Promotional | 3000ms | 2 | 6 seconds |
/* Pulse attention */
.badge-pulse {
animation: pulse 2000ms ease-in-out 3;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.15); }
}
/* Subtle glow */
.glow-attention {
animation: glow 2000ms ease-in-out 3;
}
@keyframes glow {
0%, 100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); }
50% { box-shadow: 0 0 0 8px rgba(59, 130, 246, 0.3); }
}
/* Error shake */
.shake {
animation: shake 400ms ease-in-out;
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
20%, 60% { transform: translateX(-8px); }
40%, 80% { transform: translateX(8px); }
}
/* Ring animation (notification) */
.ring {
animation: ring 2500ms ease-in-out 2;
}
@keyframes ring {
0%, 100% { transform: rotate(0); }
10%, 30% { transform: rotate(10deg); }
20%, 40% { transform: rotate(-10deg); }
50%, 100% { transform: rotate(0); }
}
// Auto-stop attention after timeout
const attention = element.animate([
{ transform: 'scale(1)' },
{ transform: 'scale(1.15)' },
{ transform: 'scale(1)' }
], {
duration: 2000,
iterations: 3
});
// Or with CSS
setTimeout(() => {
element.classList.remove('attention');
}, 6000);
prefers-reduced-motion: static indicator only, no animation