--- name: motion-animation-patterns description: Use this skill for implementing Motion (Framer Motion) animations in React applications. Covers animation presets, page transitions, modal animations, list stagger effects, hover interactions, skeleton loaders, and RTL-aware animation patterns. context: fork agent: rapid-ui-designer version: 1.0.0 author: Yonatan Gross tags: [motion, framer-motion, animation, react, ux, transitions, hover, stagger, skeleton] user-invocable: false --- # Motion Animation Patterns ## Overview This skill provides comprehensive guidance for implementing Motion (Framer Motion) animations in React 19 applications. It ensures consistent, performant, and accessible animations across the UI using centralized animation presets. **When to use this skill:** - Adding page transition animations - Implementing modal/dialog entrance/exit animations - Creating staggered list animations - Adding hover and tap micro-interactions - Implementing skeleton loading states - Creating collapse/expand animations - Building toast/notification animations **Bundled Resources:** - `references/animation-presets.md` - Complete preset API reference - `examples/component-patterns.md` - Common animation patterns --- ## Core Architecture ### Animation Presets Library (`frontend/src/lib/animations.ts`) All animations MUST use the centralized `animations.ts` presets. This ensures: - Consistent motion language across the app - RTL-aware animations (Hebrew support) - Performance optimization - Easy maintainability ```typescript // ✅ CORRECT: Import from animations.ts import { motion, AnimatePresence } from 'motion/react'; import { fadeIn, slideUp, staggerContainer, modalContent } from '@/lib/animations'; // ❌ WRONG: Inline animation values ``` --- ## Available Presets ### Transition Timing | Preset | Duration | Ease | Use For | |--------|----------|------|---------| | `transitions.fast` | 0.15s | easeOut | Micro-interactions | | `transitions.normal` | 0.2s | easeOut | Most animations | | `transitions.slow` | 0.3s | easeInOut | Emphasis effects | | `transitions.spring` | spring | 300/25 | Playful elements | | `transitions.gentleSpring` | spring | 200/20 | Modals/overlays | ### Basic Animations | Preset | Effect | Use For | |--------|--------|---------| | `fadeIn` | Opacity fade | Simple reveal | | `fadeScale` | Fade + slight scale | Subtle emphasis | | `scaleIn` | Fade + scale from center | Badges, buttons | ### Slide Animations (RTL-Aware) | Preset | Direction | Use For | |--------|-----------|---------| | `slideInRight` | Right to center | RTL Hebrew UI (natural) | | `slideInLeft` | Left to center | LTR content | | `slideUp` | Bottom to center | Cards, panels | | `slideDown` | Top to center | Dropdowns | ### List/Stagger Animations | Preset | Effect | Use For | |--------|--------|---------| | `staggerContainer` | Parent with stagger | List wrappers | | `staggerContainerFast` | Fast stagger | Quick lists | | `staggerItem` | Fade + slide child | List items | | `staggerItemRight` | RTL slide child | Hebrew lists | ### Modal/Dialog Animations | Preset | Effect | Use For | |--------|--------|---------| | `modalBackdrop` | Overlay fade | Modal background | | `modalContent` | Scale + fade | Modal body | | `sheetContent` | Slide from bottom | Mobile sheets | | `dropdownDown` | Scale from top | Dropdown menus | | `dropdownUp` | Scale from bottom | Context menus | ### Page Transitions | Preset | Effect | Use For | |--------|--------|---------| | `pageFade` | Simple fade | Route changes | | `pageSlide` | RTL slide | Navigation | ### Micro-Interactions | Preset | Effect | Use For | |--------|--------|---------| | `tapScale` | Scale on tap | Buttons, cards | | `hoverLift` | Lift + shadow | Cards, list items | | `buttonPress` | Press effect | Interactive buttons | | `cardHover` | Hover emphasis | Card components | ### Loading States | Preset | Effect | Use For | |--------|--------|---------| | `pulse` | Opacity pulse | Skeleton loaders | | `shimmer` | Sliding highlight | Shimmer effect | ### Utility Animations | Preset | Effect | Use For | |--------|--------|---------| | `toastSlideIn` | Slide + scale | Notifications | | `collapse` | Height animation | Accordions | --- ## Implementation Patterns ### 1. Page Transitions Wrap routes with `AnimatePresence` for smooth page changes: ```tsx // frontend/src/components/AnimatedRoutes.tsx import { Routes, Route, useLocation } from 'react-router'; import { AnimatePresence, motion } from 'motion/react'; import { pageFade } from '@/lib/animations'; export function AnimatedRoutes() { const location = useLocation(); return ( {/* routes */} ); } ``` ### 2. Modal Animations Use `AnimatePresence` for enter/exit animations: ```tsx import { motion, AnimatePresence } from 'motion/react'; import { modalBackdrop, modalContent } from '@/lib/animations'; function Modal({ isOpen, onClose, children }) { return ( {isOpen && ( <>
{children}
)}
); } ``` ### 3. Staggered List Animations Use parent container with child variants: ```tsx import { motion } from 'motion/react'; import { staggerContainer, staggerItem } from '@/lib/animations'; function ItemList({ items }) { return ( {items.map((item) => ( ))} ); } ``` ### 4. Card Hover Interactions Apply micro-interactions to cards: ```tsx import { motion } from 'motion/react'; import { cardHover, tapScale } from '@/lib/animations'; function Card({ onClick, children }) { return ( {children} ); } ``` ### 5. Skeleton Loaders with Motion Use Motion pulse for consistent animation: ```tsx import { motion } from 'motion/react'; import { pulse } from '@/lib/animations'; function Skeleton({ className }) { return (