npx claudepluginhub lunartech-x/superpowers --plugin superpowersThis skill uses the workspace's default tool permissions.
Implement subtle, purposeful animations that provide feedback, guide attention, and create delightful user experiences without overwhelming the interface.
Applies Disney's 12 animation principles to UI micro-interactions like button states, toggles, form validation, loading indicators, and notification badges.
Adds animation polish to apps: button press feedback, hover states, modal/dropdown transitions, loading skeletons, toasts, staggered lists. Uses CSS/Tailwind respecting prefers-reduced-motion.
Designs microinteractions, motion design, transitions, loading states, and feedback patterns for UI polish using Framer Motion and Tailwind.
Share bugs, ideas, or general feedback.
Implement subtle, purposeful animations that provide feedback, guide attention, and create delightful user experiences without overwhelming the interface.
Micro-interactions are small, focused animations that:
<!-- Duration -->
<div class="transition duration-300">300ms</div>
<div class="transition duration-500">500ms (recommended)</div>
<div class="transition duration-700">700ms (dramatic)</div>
<!-- Easing -->
<div class="transition ease-out">Decelerate (exiting)</div>
<div class="transition ease-in-out">Smooth both ways</div>
<!-- Properties -->
<div class="transition-all">All properties</div>
<div class="transition-transform">Transform only</div>
<div class="transition-colors">Colors only</div>
<div class="transition-opacity">Opacity only</div>
<div class="rounded-2xl bg-white shadow-md
hover:-translate-y-1 hover:shadow-lg
transition-all duration-300">
<!-- Card content -->
</div>
<div class="group overflow-hidden rounded-xl">
<img src="image.jpg"
class="w-full transition-transform duration-500
group-hover:scale-105"
alt="Zoomable image">
</div>
<div class="rounded-2xl border border-white/10 bg-neutral-900
hover:border-white/20 hover:shadow-2xl hover:shadow-brand-500/10
transition-all duration-500">
<!-- Content -->
</div>
<h3 class="text-zinc-900 group-hover:text-brand-600
transition-colors duration-300">
Hover to change color
</h3>
<div class="bg-white hover:bg-zinc-50
transition-colors duration-500">
<!-- Content -->
</div>
Use group class on parent to trigger child animations:
<div class="group rounded-2xl p-6">
<!-- Icon scales on card hover -->
<div class="w-10 h-10 rounded-xl bg-brand-50
group-hover:scale-110
transition-transform duration-300">
<!-- Icon -->
</div>
<!-- Title changes color -->
<h3 class="text-zinc-900 group-hover:text-brand-600
transition-colors duration-300">
Feature Title
</h3>
<!-- Element slides -->
<div class="group-hover:translate-x-1
transition-transform duration-300">
Read more →
</div>
</div>
Use delay utilities for sequential reveals:
<div class="grid grid-cols-4 gap-4">
<div class="group-hover:translate-y-[-4px] transition-transform duration-300">
Step 1
</div>
<div class="group-hover:translate-y-[-4px] transition-transform duration-300 delay-100">
Step 2
</div>
<div class="group-hover:translate-y-[-4px] transition-transform duration-300 delay-200">
Step 3
</div>
<div class="group-hover:translate-y-[-4px] transition-transform duration-300 delay-300">
Step 4
</div>
</div>
<div class="relative">
<!-- Center element -->
<div class="w-16 h-16 rounded-2xl bg-brand-500
group-hover:scale-110 transition-transform duration-500">
<!-- Icon -->
</div>
<!-- Orbiting elements -->
<div class="absolute -left-4 top-0 w-6 h-6 rounded-full bg-emerald-50
group-hover:-translate-x-1 group-hover:-translate-y-1
transition-transform duration-500">
<div class="w-2 h-2 rounded-full bg-emerald-400 animate-pulse"></div>
</div>
<div class="absolute -right-4 top-0 w-6 h-6 rounded-full bg-blue-50
group-hover:translate-x-1 group-hover:-translate-y-1
transition-transform duration-500 delay-100">
<div class="w-2 h-2 rounded-full bg-blue-400 animate-pulse"
style="animation-delay: 0.5s;"></div>
</div>
</div>
<div class="grid grid-cols-2 gap-2">
<div class="bg-blue-50 rounded-xl p-3
group-hover:scale-105 group-hover:-rotate-1
transition-all duration-300">
Item 1
</div>
<div class="bg-emerald-50 rounded-xl p-3
group-hover:scale-105 group-hover:rotate-1
transition-all duration-300 delay-75">
Item 2
</div>
</div>
<span class="w-2 h-2 rounded-full bg-emerald-400 animate-pulse"></span>
<span class="w-1.5 h-1.5 rounded-full bg-brand-400"
style="animation: pulse 3s ease-in-out infinite;"></span>
<svg class="animate-spin text-brand-500" style="animation-duration: 3s;">
<!-- Spinner SVG paths -->
</svg>
<div class="relative overflow-hidden">
<div class="absolute inset-0 bg-gradient-to-r from-transparent via-white/10 to-transparent"
style="animation: shimmer 2s infinite;"></div>
</div>
<style>
@keyframes shimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
</style>
<div class="opacity-0 translate-y-4
animate-[fadeIn_0.5s_ease-out_forwards]">
Content appears with fade
</div>
<style>
@keyframes fadeIn {
to {
opacity: 1;
transform: translateY(0);
}
}
</style>
<ul class="space-y-2">
<li class="animate-[fadeIn_0.3s_ease-out_forwards]" style="animation-delay: 0ms;">Item 1</li>
<li class="animate-[fadeIn_0.3s_ease-out_forwards]" style="animation-delay: 100ms;">Item 2</li>
<li class="animate-[fadeIn_0.3s_ease-out_forwards]" style="animation-delay: 200ms;">Item 3</li>
</ul>
<button class="px-4 py-2 bg-brand-500 text-white rounded-lg
hover:bg-brand-600
active:scale-95
transition-all duration-150">
Click Me
</button>
<a href="#" class="inline-flex items-center gap-2 group">
Learn More
<svg class="w-4 h-4 group-hover:translate-x-1 transition-transform duration-300">
<path d="M5 12h14m-7-7 7 7-7 7" />
</svg>
</a>
<div class="absolute inset-0 pointer-events-none">
<div class="absolute top-1/4 left-1/4 w-96 h-96
bg-brand-500/10 rounded-full blur-[120px] animate-pulse">
</div>
<div class="absolute bottom-1/4 right-1/4 w-96 h-96
bg-purple-500/10 rounded-full blur-[120px] animate-pulse"
style="animation-delay: 2s;">
</div>
</div>
<svg class="animate-bounce text-brand-400">
<path d="M12 5v14m7-7-7 7-7-7" />
</svg>
| Interaction Type | Duration | Use Case |
|---|---|---|
| Instant | 100-150ms | Button press, toggle |
| Quick | 200-300ms | Hover states, small reveals |
| Standard | 300-500ms | Card animations, transitions |
| Dramatic | 500-700ms | Hero reveals, page transitions |
| Slow | 700-1000ms | Background effects, ambient |
/* Only animate transform and opacity for best performance */
.optimized-animation {
will-change: transform, opacity;
transform: translateZ(0); /* GPU acceleration */
}
/* Avoid animating */
.avoid {
/* ❌ Don't animate: width, height, top, left, margin, padding, box-shadow */
}
<!-- Respect reduced motion preferences -->
<div class="motion-safe:hover:-translate-y-1
motion-safe:transition-transform
motion-safe:duration-300">
Respects user preferences
</div>
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
<!-- Card lift -->
class="hover:-translate-y-1 transition-transform duration-300"
<!-- Image zoom -->
class="group-hover:scale-105 transition-transform duration-500"
<!-- Color shift -->
class="hover:text-brand-600 transition-colors duration-300"
<!-- Glow effect -->
class="hover:shadow-2xl hover:shadow-brand-500/10 transition-all duration-500"
<!-- Element reveal -->
class="group-hover:opacity-100 opacity-0 transition-opacity duration-300"
<!-- Icon scale -->
class="group-hover:scale-110 transition-transform duration-300"
<!-- Slide in -->
class="group-hover:translate-x-1 transition-transform duration-300"