plugins/tailwindcss-master/skills/tailwindcss-animations/SKILL.md
Tailwind CSS animations and transitions including built-in utilities and custom keyframes. PROACTIVELY activate for: (1) animate-* utilities (spin, ping, pulse, bounce), (2) custom @keyframes via @theme animate, (3) transition utilities (transition, duration, ease), (4) transforms (scale, rotate, translate) with transition, (5) prefers-reduced-motion: reduce, (6) Framer Motion / Motion One integration with Tailwind, (7) CSS scroll-driven animations (animation-timeline), (8) view transitions API with Tailwind, (9) hover, focus, group-hover transitions, (10) staggered list animations. Provides: animation utility reference, custom keyframe examples, reduced-motion pattern, Framer Motion integration, and scroll-driven animation recipes.
npx skillsauth add JosiahSiegel/claude-plugin-marketplace tailwindcss-animationsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Continuous rotation for loading indicators:
<svg class="animate-spin h-5 w-5 text-blue-500" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" />
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
</svg>
Radar-style pulse for notifications:
<span class="relative flex h-3 w-3">
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-sky-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-3 w-3 bg-sky-500"></span>
</span>
Subtle fade for skeleton loaders:
<div class="animate-pulse flex space-x-4">
<div class="rounded-full bg-slate-200 h-10 w-10"></div>
<div class="flex-1 space-y-2 py-1">
<div class="h-2 bg-slate-200 rounded"></div>
<div class="h-2 bg-slate-200 rounded w-5/6"></div>
</div>
</div>
Attention-grabbing vertical bounce:
<svg class="animate-bounce w-6 h-6 text-blue-500" fill="none" viewBox="0 0 24 24">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3" />
</svg>
| Class | CSS Property |
|-------|--------------|
| transition-none | None |
| transition-all | All properties |
| transition | Common properties |
| transition-colors | Colors only |
| transition-opacity | Opacity only |
| transition-shadow | Shadow only |
| transition-transform | Transform only |
| Class | Duration |
|-------|----------|
| duration-75 | 75ms |
| duration-100 | 100ms |
| duration-150 | 150ms |
| duration-200 | 200ms |
| duration-300 | 300ms |
| duration-500 | 500ms |
| duration-700 | 700ms |
| duration-1000 | 1000ms |
| Class | Easing |
|-------|--------|
| ease-linear | Linear |
| ease-in | Accelerate |
| ease-out | Decelerate |
| ease-in-out | Accelerate then decelerate |
| Class | Delay |
|-------|-------|
| delay-75 | 75ms |
| delay-100 | 100ms |
| delay-150 | 150ms |
| delay-200 | 200ms |
| delay-300 | 300ms |
| delay-500 | 500ms |
<!-- Color transition -->
<button class="bg-blue-500 hover:bg-blue-700 transition-colors duration-200">
Hover me
</button>
<!-- Scale on hover -->
<div class="transform hover:scale-105 transition-transform duration-200">
Card
</div>
<!-- Opacity transition -->
<div class="opacity-100 hover:opacity-75 transition-opacity duration-150">
Fade
</div>
<!-- Multiple properties -->
<button class="
bg-blue-500 hover:bg-blue-700
transform hover:scale-105
shadow-md hover:shadow-lg
transition-all duration-200
">
Full transition
</button>
<div class="transform scale-100 hover:scale-110 transition-transform">
Scale up
</div>
<div class="transform scale-100 hover:scale-90 transition-transform">
Scale down
</div>
<!-- Specific axes -->
<div class="transform hover:scale-x-110">Horizontal</div>
<div class="transform hover:scale-y-110">Vertical</div>
<div class="transform hover:rotate-12 transition-transform">
Rotate right
</div>
<div class="transform hover:-rotate-12 transition-transform">
Rotate left
</div>
<div class="transform hover:rotate-180 transition-transform duration-500">
Flip
</div>
<div class="transform hover:translate-x-2 transition-transform">
Move right
</div>
<div class="transform hover:-translate-y-2 transition-transform">
Move up
</div>
<div class="transform hover:skew-x-3 transition-transform">
Skew horizontal
</div>
<div class="transform hover:skew-y-3 transition-transform">
Skew vertical
</div>
<div class="origin-center transform hover:rotate-45">Center (default)</div>
<div class="origin-top-left transform hover:rotate-45">Top left</div>
<div class="origin-bottom-right transform hover:rotate-45">Bottom right</div>
@theme {
/* Custom keyframes */
--animate-fade-in: fade-in 0.5s ease-out;
--animate-slide-up: slide-up 0.3s ease-out;
--animate-shake: shake 0.5s ease-in-out;
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slide-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
<div class="animate-fade-in">Fades in</div>
<div class="animate-slide-up">Slides up</div>
<div class="animate-shake">Shakes on error</div>
@theme {
--ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035);
--ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
--ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
<div class="transition-transform ease-bounce duration-300 hover:scale-110">
Bouncy scale
</div>
<!-- Only animate if user prefers motion -->
<div class="motion-safe:animate-bounce motion-reduce:animate-none">
Respects preferences
</div>
<!-- Alternative: reduced animation -->
<button class="
motion-safe:transition-all motion-safe:duration-200
motion-reduce:transition-none
hover:bg-blue-600
">
Accessible button
</button>
/* Apply globally */
@media (prefers-reduced-motion: reduce) {
*,
::before,
::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
<div class="
transform transition-all duration-200
hover:-translate-y-1 hover:shadow-lg
bg-white rounded-lg p-6 shadow
">
Card content
</div>
<button class="
transform transition-transform duration-100
active:scale-95
bg-blue-500 text-white px-4 py-2 rounded
">
Click me
</button>
<div class="flex space-x-1">
<div class="w-2 h-2 bg-blue-500 rounded-full animate-bounce [animation-delay:-0.3s]"></div>
<div class="w-2 h-2 bg-blue-500 rounded-full animate-bounce [animation-delay:-0.15s]"></div>
<div class="w-2 h-2 bg-blue-500 rounded-full animate-bounce"></div>
</div>
<div class="opacity-0 translate-y-4 transition-all duration-500" data-animate>
Content that fades in
</div>
// Intersection Observer to trigger animation
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.remove('opacity-0', 'translate-y-4')
}
})
})
document.querySelectorAll('[data-animate]').forEach(el => observer.observe(el))
<div class="animate-pulse">
<div class="h-4 bg-gray-200 rounded w-3/4 mb-4"></div>
<div class="h-4 bg-gray-200 rounded w-1/2 mb-4"></div>
<div class="h-4 bg-gray-200 rounded w-5/6"></div>
</div>
<button class="group" aria-label="Toggle menu">
<span class="block w-6 h-0.5 bg-black transition-all duration-200 group-open:rotate-45 group-open:translate-y-1.5"></span>
<span class="block w-6 h-0.5 bg-black mt-1 transition-opacity duration-200 group-open:opacity-0"></span>
<span class="block w-6 h-0.5 bg-black mt-1 transition-all duration-200 group-open:-rotate-45 group-open:-translate-y-1.5"></span>
</button>
For complex enter/leave transitions, use a library like Headless UI:
import { Transition } from '@headlessui/react'
function Modal({ isOpen, children }) {
return (
<Transition
show={isOpen}
enter="transition-opacity duration-300"
enterFrom="opacity-0"
enterTo="opacity-100"
leave="transition-opacity duration-200"
leaveFrom="opacity-100"
leaveTo="opacity-0"
>
{children}
</Transition>
)
}
<!-- GOOD - GPU accelerated -->
<div class="transform hover:translate-x-2 transition-transform">
<!-- AVOID - May cause repaints -->
<div class="hover:left-2 transition-all">
<!-- GOOD - Only transitions what changes -->
<div class="transition-colors duration-200 hover:bg-blue-500">
<!-- AVOID - Transitions everything -->
<div class="transition-all duration-200 hover:bg-blue-500">
<!-- GOOD - Snappy feedback -->
<button class="transition-colors duration-150">
<!-- AVOID - Too slow for UI feedback -->
<button class="transition-colors duration-1000">
<!-- Only for complex, frequently animated elements -->
<div class="will-change-transform animate-spin">
Loading spinner
</div>
development
Use for Clerk sessions, tokens, webhooks, orgs, and security. PROACTIVELY activate for session tokens, JWT templates, getToken(), custom claims, pending sessions, multi-session UX, organizations, roles, permissions, system vs custom permissions, features/plans, MFA/passkeys/password policy/bot protection, Clerk webhooks, Svix signatures, verifyWebhook(), user/org sync, retries/replays, environment variables, custom domains, secret rotation, logs, and auth security reviews. Provides token semantics, webhook idempotency, authorization defaults, and hardening checklist.
tools
Use for Clerk in Next.js. PROACTIVELY activate for @clerk/nextjs setup, App Router auth()/currentUser(), clerkMiddleware(), proxy.ts/middleware.ts, createRouteMatcher(), protected pages/layouts/Route Handlers/Server Actions/API routes/tRPC, auth.protect() role/permission/token checks, ClerkProvider placement, server-only clerkClient, Link prefetch, redirects, 401/404 auth failures, custom domains, __clerk proxy paths, and deployment gotchas. Provides file patterns, server/client boundary rules, matcher templates, and production checks.
development
Use for Clerk frontend auth flows. PROACTIVELY activate for React, JavaScript, Vue, Nuxt, Astro, Expo, React Router, TanStack React Start, or SPA setup; ClerkProvider and publishable-key wiring; SignIn/SignUp/UserButton/UserProfile/OrganizationSwitcher; custom useUser/useAuth/useClerk/useSignIn/useSignUp/useSession/useOrganization flows; multi-session UX; cross-origin getToken() fetches; loading states, redirects, routing, CORS/cookies, or hydration bugs. Provides SDK selection, UI patterns, token-fetch templates, and frontend gotchas.
development
Use for Clerk dev/prod readiness, deployment, and multi-language implementation planning. PROACTIVELY activate for environment variables, pk_test/sk_test vs pk_live/sk_live, local dev, preview/staging/prod instances, domains/DNS, redirects, OAuth credentials, custom domains/proxy, authorizedParties, CSP, CORS/cookies, webhooks/tunnels, Vercel/Netlify/Cloudflare/API gateways, monitoring/troubleshooting, and backends in Node/Express/Fastify, Python/FastAPI/Django/Flask, Go, Ruby/Rails, Java/Spring, .NET, PHP/Laravel. Provides checklists, rollout plans, and language-portable patterns.