Review a feature and add purposeful animations. Identifies static areas needing feedback, transitions, or delight, then adds motion/react or CSS transitions. Use when asked to "animate this", "add motion", "make it feel alive", or "add transitions".
Adds purposeful animations and transitions to static interfaces for improved feedback and user experience.
/plugin marketplace add howells/arc/plugin install arc@howellsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
<tool_restrictions>
EnterPlanMode — BANNED. Execute phases below directly.ExitPlanMode — BANNED. You are never in plan mode.
</tool_restrictions>Review a feature and add purposeful motion. One orchestrated experience beats scattered animations everywhere.
Announce at start: "I'm using the animate skill to add purposeful motion."
<important> **This skill is user-interactive. Do NOT spawn agents.** Animation choices are subjective — the user must see and approve each addition.Every animation must answer: "Why does this exist?"
One well-orchestrated experience beats scattered animations everywhere. Focus on high-impact moments. </important>
<required_reading> Read ALL of these using the Read tool:
${CLAUDE_PLUGIN_ROOT}/rules/interface/animation.md — Easing, duration, spring presets, performance tiers${CLAUDE_PLUGIN_ROOT}/references/animation-patterns.md — Deep animation patterns${CLAUDE_PLUGIN_ROOT}/references/frontend-design.md — Anti-patterns (bounce/elastic = dated)
</required_reading>Ask the user:
Question: "What's the personality of this feature?"
Header: "Motion tone"
Options:
1. "Snappy and confident" — Quick, decisive transitions. Enterprise, developer tools.
2. "Smooth and refined" — Gentle, polished. Premium, editorial.
3. "Playful and energetic" — Slightly exaggerated, delightful. Consumer, creative tools.
4. "Minimal and functional" — Almost invisible. Utility-focused, data-heavy.
Also determine:
Analyze the code and identify static areas:
Present a focused plan. Less is more.
## Animation Plan
### Hero Moment (1 max)
- **What**: [e.g., Page load entrance sequence]
- **How**: [e.g., Staggered fade-up of sections, 50ms delay]
- **Duration**: [e.g., 300-500ms total]
### Feedback Layer (per-interaction)
| Element | Trigger | Animation | Duration |
|---------|---------|-----------|----------|
| Buttons | Press | `active:scale-[0.97]` | CSS instant |
| Cards | Hover | `hover:shadow-lg hover:-translate-y-0.5` | 150ms |
| Toggle | Click | Slide + color transition | 200ms |
### Transition Layer (state changes)
| State Change | Animation | Duration |
|-------------|-----------|----------|
| Modal open | Fade + scale(0.98→1) + y(20→0) | 200ms ease-out |
| Dropdown | Scale(0.95→1) + opacity | 150ms ease-out |
| Accordion | grid-rows 0fr→1fr | 300ms ease-out |
### Reduced Motion Alternatives
| Full Animation | Reduced Motion |
|---------------|---------------|
| Slide + fade | Fade only (200ms) |
| Scale + move | Opacity only |
| Staggered entrance | Simultaneous fade |
Ask: "Does this animation plan feel right?"
| Purpose | Duration | Easing |
|---|---|---|
| Instant feedback (press, toggle) | 100-150ms | — (CSS transitions) |
| State changes (hover, menu) | 150-200ms | ease-out |
| Layout changes (modal, accordion) | 200-300ms | cubic-bezier(0.25, 1, 0.5, 1) |
| Entrance animations | 300-500ms | cubic-bezier(0.16, 1, 0.3, 1) |
| Exit = 75% of entrance | — | ease-in |
<!-- Button press feedback -->
<button class="transition-transform active:scale-[0.97]">
<!-- Card hover lift -->
<div class="transition-all duration-150 hover:shadow-lg hover:-translate-y-0.5">
<!-- Dropdown -->
<div class="transition-all duration-150 ease-out origin-top
data-[state=open]:scale-100 data-[state=open]:opacity-100
data-[state=closed]:scale-95 data-[state=closed]:opacity-0">
// Modal entrance
<motion.div
initial={{ opacity: 0, y: 20, scale: 0.98 }}
animate={{ opacity: 1, y: 0, scale: 1 }}
exit={{ opacity: 0, y: 10, scale: 0.98 }}
transition={{ duration: 0.2, ease: [0.25, 1, 0.5, 1] }}
/>
// Staggered list
<motion.div variants={{ visible: { transition: { staggerChildren: 0.03 } } }}>
{items.map(item => (
<motion.div
key={item.id}
variants={{ hidden: { opacity: 0, y: 8 }, visible: { opacity: 1, y: 0 } }}
/>
))}
</motion.div>
// Interactive spring
<motion.button whileTap={{ scale: 0.97 }} transition={{ type: "spring", stiffness: 400, damping: 25 }}>
.accordion-content {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 300ms cubic-bezier(0.25, 1, 0.5, 1);
}
.accordion-content[data-state="open"] {
grid-template-rows: 1fr;
}
.accordion-content > div {
overflow: hidden;
}
const shouldReduce = useReducedMotion();
<motion.div
animate={{
opacity: 1,
y: shouldReduce ? 0 : 20,
}}
/>
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
After implementing:
width, height, top, left) — use transformprefers-reduced-motion — accessibility violation<arc_log>
After completing this skill, append to the activity log.
See: ${CLAUDE_PLUGIN_ROOT}/references/arc-log.md
Entry: /arc:animate — [Component/page] animated ([hero moment, # micro-interactions])
</arc_log>
<success_criteria> Animate is complete when:
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.