AutoAnimate (@formkit/auto-animate) zero-config animations for React. Use for list transitions, accordions, toasts, or encountering SSR errors, animation libraries complexity.
SKILL.md
AutoAnimate
Status: Production Ready ✅
Last Updated: 2026-08-03
Dependencies: None (works with any React setup)
Latest Versions: @formkit/[email protected]
// Use client-only import to prevent SSR errors
import { useState, useEffect } from "react";
export function useAutoAnimateSafe<T extends HTMLElement>() {
const [parent, setParent] = useState<T | null>(null);
useEffect(() => {
if (typeof window !== "undefined" && parent) {
import("@formkit/auto-animate").then(({ default: autoAnimate }) => {
autoAnimate(parent);
});
}
}, [parent]);
return [parent, setParent] as const;
}
Known Issues Prevention
This skill prevents documented issues:
10+
Issue #1: SSR/Next.js Import Errors
Error: "Can't import the named export 'useEffect' from non EcmaScript module"
Source: https://github.com/formkit/auto-animate/issues/55Why It Happens: AutoAnimate uses DOM APIs not available on server
Prevention: Use dynamic imports (see templates/vite-ssr-safe.tsx)
Error: Items don't animate correctly or flash
Source: Official docs
Why It Happens: React can't track which items changed
Prevention: Always use unique, stable keys (key={item.id})
Issue #4: Flexbox Width Issues
Error: Elements snap to width instead of animating smoothly
Source: Official docs
Why It Happens: flex-grow: 1 waits for surrounding content
Prevention: Use explicit width instead of flex-grow for animated elements
Issue #5: Table Row Display Issues
Error: Table structure breaks when removing rows
Source: https://github.com/formkit/auto-animate/issues/7Why It Happens: Display: table-row conflicts with animations
Prevention: Apply to <tbody> instead of individual rows, or use div-based layouts
Issue #6: Jest Testing Errors
Error: "Cannot find module '@formkit/auto-animate/react'"
Source: https://github.com/formkit/auto-animate/issues/29Why It Happens: Jest doesn't resolve ESM exports correctly
Prevention: Configure moduleNameMapper in jest.config.js
Issue #7: esbuild Compatibility
Error: "Path '.' not exported by package"
Source: https://github.com/formkit/auto-animate/issues/36Why It Happens: ESM/CommonJS condition mismatch
Prevention: Configure esbuild to handle ESM modules properly
Issue #8: CSS Position Side Effects
Error: Layout breaks after adding AutoAnimate
Source: Official docs
Why It Happens: Parent automatically gets position: relativePrevention: Account for position change in CSS or set explicitly
Issue #9: Vue/Nuxt Registration Errors
Error: "Failed to resolve directive: auto-animate"
Source: https://github.com/formkit/auto-animate/issues/43Why It Happens: Plugin not registered correctly
Prevention: Proper plugin setup in Vue/Nuxt config (see references/)
Issue #10: Angular ESM Issues
Error: Build fails with "ESM-only package"
Source: https://github.com/formkit/auto-animate/issues/72Why It Happens: CommonJS build environment
Prevention: Configure ng-packagr for Angular Package Format
When to Use AutoAnimate vs Motion
Use AutoAnimate When:
✅ Simple list transitions (add/remove/sort)
✅ Accordion expand/collapse
✅ Toast notifications fade in/out
✅ Form validation messages appear/disappear
✅ Zero configuration preferred
✅ Small bundle size critical (3.28 KB)
✅ Applying to existing/3rd-party code
✅ "Good enough" animations acceptable
Use Motion When:
✅ Complex choreographed animations
✅ Gesture controls (drag, swipe, hover)
✅ Scroll-based animations
✅ Spring physics animations
✅ SVG path animations
✅ Keyframe control needed
✅ Animation variants/orchestration
✅ Custom easing curves
Rule of Thumb: Use AutoAnimate for 90% of cases, Motion for hero/interactive animations.
Critical Rules
Always Do
✅ Use unique, stable keys - key={item.id} not key={index}
✅ Keep parent in DOM - Parent ref element always rendered
✅ Client-only for SSR - Dynamic import for server environments
✅ Respect accessibility - Keep disrespectUserMotionPreference: false
✅ Test with motion disabled - Verify UI works without animations
✅ Use explicit width - Avoid flex-grow on animated elements
✅ Apply to tbody for tables - Not individual rows
Never Do
❌ Conditional parent - {show && <ul ref={parent}>}
❌ Index as key - key={index} breaks animations
❌ Ignore SSR - Will break in Cloudflare Workers/Next.js
❌ Force animations - disrespectUserMotionPreference: true breaks accessibility
❌ Animate tables directly - Use tbody or div-based layout
❌ Skip unique keys - Required for proper animation
❌ Complex animations - Use Motion instead
Configuration
AutoAnimate is zero-config by default. Optional customization:
AutoAnimate works perfectly with Cloudflare Workers Static Assets:
✅ Client-side only - Runs in browser, not Worker runtime
✅ No Node.js deps - Pure browser code
✅ Edge-friendly - 3.28 KB gzipped
✅ SSR-safe - Use dynamic imports (see templates/)