From harness-claude
Creates performant CSS animations using Tailwind transitions, keyframes, and motion-safe prefixes for hovers, entrances, spinners, and micro-interactions.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Create performant CSS animations with Tailwind transitions, keyframe utilities, and motion-safe considerations
Provides Tailwind CSS built-in animations (spin, ping, pulse, bounce) and transition utilities (properties, durations, easings, delays) with HTML examples. Use for loading indicators, notifications, hovers, and UI motion.
Analyzes Next.js + Tailwind + React projects to implement purposeful UI animations like hero intros, hovers, scroll reveals, and page transitions for better UX.
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.
Share bugs, ideas, or general feedback.
Create performant CSS animations with Tailwind transitions, keyframe utilities, and motion-safe considerations
transition-* utilities for property transitions (hover, focus, state changes).animate-* utilities for keyframe animations (continuous motion, entrance effects).transform and opacity for 60fps performance โ avoid animating width, height, margin, or top.motion-safe: prefix so animations only play when the user has not enabled "reduce motion".tailwind.config.ts for project-specific animations.// Transitions โ state-based property changes
function Button({ children }: { children: React.ReactNode }) {
return (
<button className="
bg-blue-600 text-white px-4 py-2 rounded-md
transition-all duration-200 ease-in-out
hover:bg-blue-700 hover:shadow-lg hover:-translate-y-0.5
active:translate-y-0 active:shadow-md
focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2
">
{children}
</button>
);
}
// Entrance animation with motion-safe
function FadeIn({ children }: { children: React.ReactNode }) {
return (
<div className="motion-safe:animate-fade-in motion-reduce:opacity-100">
{children}
</div>
);
}
// Built-in Tailwind animations
<div className="animate-spin h-8 w-8 border-4 border-blue-600 border-t-transparent rounded-full" />
<div className="animate-pulse bg-gray-200 h-4 rounded" />
<div className="animate-bounce text-2xl">๐</div>
// tailwind.config.ts โ custom animations
const config: Config = {
theme: {
extend: {
keyframes: {
'fade-in': {
'0%': { opacity: '0', transform: 'translateY(10px)' },
'100%': { opacity: '1', transform: 'translateY(0)' },
},
'slide-in-right': {
'0%': { transform: 'translateX(100%)' },
'100%': { transform: 'translateX(0)' },
},
'scale-in': {
'0%': { opacity: '0', transform: 'scale(0.95)' },
'100%': { opacity: '1', transform: 'scale(1)' },
},
},
animation: {
'fade-in': 'fade-in 0.5s ease-out forwards',
'slide-in-right': 'slide-in-right 0.3s ease-out',
'scale-in': 'scale-in 0.2s ease-out',
},
},
},
};
Performance-safe properties: The browser can animate transform and opacity on the GPU (compositor layer) without triggering layout recalculation. Animating other properties causes reflow:
| Safe (GPU) | Unsafe (reflow) |
|---|---|
transform (translate, scale, rotate) | width, height |
opacity | margin, padding |
filter | top, left, right, bottom |
border-width, font-size |
Transition utilities:
transition โ all properties (color, background, border, shadow, transform, opacity)transition-colors โ only color-related propertiestransition-transform โ only transformtransition-opacity โ only opacityduration-* โ 75, 100, 150, 200, 300, 500, 700, 1000ease-* โ linear, in, out, in-outMotion accessibility: Always use motion-safe: for decorative animations. Users with vestibular disorders can enable "reduce motion" in their OS settings:
<div className="motion-safe:animate-fade-in motion-reduce:opacity-100">
Content appears instantly for motion-sensitive users
</div>
Staggered animations (with custom properties):
{
items.map((item, i) => (
<div
key={item.id}
className="motion-safe:animate-fade-in"
style={{ animationDelay: `${i * 100}ms` }}
>
{item.name}
</div>
));
}
https://tailwindcss.com/docs/animation