framer-motion · mindrally — Claude Code skill: smooth React animations
Tells your agent which properties to animate in Motion and which ones wreck layout. Useful when the project already runs React and TypeScript.
npx skills add Mindrally/skills --skill framer-motion -a claude-codeWhat framer-motion does
This skill turns the agent into a Motion (formerly Framer Motion) reviewer for React and TypeScript. It insists on importing from motion/react, since the old framer-motion path is outdated, and it limits animation to x, y, scale, rotate and opacity — those run on the GPU and skip layout recalculation. Animating width, height, top, left, margin or padding is called out as a source of jank.
Inside are code patterns: variants with staggerChildren for complex scenes, layoutId for shared element transitions, spring transitions instead of durations, AnimatePresence for exit animations, and useScroll with useTransform for parallax. Separate sections cover willChange, memoizing variants and callbacks with useMemo and useCallback, and useReducedMotion so animations respect the system setting.
There is a debugging section too: React DevTools for extra re-renders, the Chrome DevTools Performance tab for stutter, and testing on real devices. The stated target is 60fps, 120fps on high refresh rate displays. If your project animates with CSS or another library, these rules will fight your current code — worth checking before you install.
What it helps with
- switch imports from
framer-motiontomotion/react - stop jank when animating layout properties
- add page transitions with
AnimatePresence - build parallax with
useScrollanduseTransform - honor
prefers-reduced-motionin a component
Example prompts for the agent
- animate this list appearing with a stagger between items
- why does the modal stutter on close — check it against the framer-motion rules
- rewrite the page transition with Motion and reduced motion support
How to install framer-motion
1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill framer-motion -a claude-code2Manually: put the files in place
~/.claude/skills/framer-motion/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/framer-motion/
1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill framer-motion -a codex2Manually: put the files in place
.agents/skills/framer-motion/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill framer-motion -a cursor2Manually: put the files in place
.cursor/skills/framer-motion/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Mindrally/skills framer-motion2Manually: put the files in place
.github/skills/framer-motion/SKILL.md1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill framer-motion -a gemini-cli2Platform CLI
gemini skills install https://github.com/Mindrally/skills --path framer-motionManually: put the files in place
.devin/skills/framer-motion/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Mindrally/skills --skill framer-motion -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about framer-motion
How do I install framer-motion in Claude?
Run npx skills add Mindrally/skills --skill framer-motion -a claude-code. The skill file lands at ~/.claude/skills/framer-motion/SKILL.md.
What does the framer-motion skill do?
It hands the agent a set of React animation rules: which properties to animate, how to structure variants, gestures, scroll effects and exit animations. It also points at ways to track down extra re-renders and stutter.
Why does it say motion/react instead of framer-motion?
The library was renamed from Framer Motion to Motion, and the old import path is outdated. The skill requires the current API.
Source text
SKILL.md · Apache-2.0
---
name: framer-motion
description: Expert guidelines for building performant animations with Framer Motion/Motion library in React applications
metadata:
maintainer: Mindrally
source: https://github.com/Mindrally/skills
---
# Framer Motion / Motion Animation Guidelines
You are an expert in Framer Motion (now Motion), React, and TypeScript. Follow these guidelines when creating animations.
## Core Principles
### Import from the Correct Package
- Use `import { motion } from "motion/react"` for React projects (not "framer-motion" - this is outdated)
- The library was renamed from Framer Motion to Motion
- Always use the latest Motion API
### Performance-First Approach
- Animate transform properties (`x`, `y`, `scale`, `rotate`) and `opacity` for best performance
- These properties can be hardware-accelerated and don't trigger layout recalculations
- Avoid animating properties that cause layout shifts like `width`, `height`, `top`, `left`, `margin`, `padding`
## Hardware Acceleration
### Use will-change Properly
```tsx
// When animating transforms
<motion.div
style={{ willChange: "transform" }}
animate={{ x: 100, y: 50, scale: 1.2 }}
/>
// When animating other GPU-accelerated properties
<motion.div
style={{ willChange: "opacity, transform" }}
animate={{ opacity: 0.5, x: 100 }}
/>
```
### Properties to Add to willChange
- `transform` - for x, y, scale, rotate, skew
- `opacity` - for opacity animations
- `filter` - for blur, brightness, etc.
- `clipPath` - for clip-path animations
- `backgroundColor` - for background color transitions
## Animation Best Practices
### Use Variants for Complex Animations
```tsx
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.1
}
}
};
const itemVariants = {
hidden: { y: 20, opacity: 0 },
visible: { y: 0, opacity: 1 }
};
```
### Use layoutId for Shared Element Transitions
```tsx
<motion.div layoutId="shared-element" />
```
### Prefer spring Animations
```tsx
// Springs feel more natural than duration-based animations
<motion.div
animate={{ x: 100 }}
transition={{ type: "spring", stiffness: 300, damping: 30 }}
/>
```
## React Integration
### Memoization for Performance
```tsx
// Memoize animation variants
const variants = useMemo(() => ({
hidden: { opacity: 0 },
visible: { opacity: 1 }
}), []);
// Memoize callbacks
const handleAnimationComplete = useCallback(() => {
// handler logic
}, []);
```
### Avoid Inline Style Objects
```tsx
// Bad - creates new object on every render
<motion.div style={{ willChange: "transform" }} />
// Good - define outside or memoize
const style = { willChange: "transform" };
<motion.div style={style} />
```
## Accessibility
### Respect Reduced Motion Preferences
```tsx
import { useReducedMotion } from "motion/react";
function Component() {
const shouldReduceMotion = useReducedMotion();
return (
<motion.div
animate={{ x: shouldReduceMotion ? 0 : 100 }}
transition={{ duration: shouldReduceMotion ? 0 : 0.3 }}
/>
);
}
```
## Gesture Animations
### Use Gesture Props Correctly
```tsx
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
transition={{ type: "spring", stiffness: 400, damping: 17 }}
/>
```
## Scroll Animations
### Use useScroll for Scroll-Linked Animations
```tsx
import { useScroll, useTransform, motion } from "motion/react";
function ParallaxComponent() {
const { scrollYProgress } = useScroll();
const y = useTransform(scrollYProgress, [0, 1], [0, -100]);
return <motion.div style={{ y }} />;
}
```
## Exit Animations
### Use AnimatePresence for Exit Animations
```tsx
import { AnimatePresence, motion } from "motion/react";
<AnimatePresence mode="wait">
{isVisible && (
<motion.div
key="modal"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
/>
)}
</AnimatePresence>
```
## Common Patterns
### Staggered List Animation
```tsx
<motion.ul
initial="hidden"
animate="visible"
variants={{
visible: { transition: { staggerChildren: 0.07 } }
}}
>
{items.map((item) => (
<motion.li
key={item.id}
variants={{
hidden: { opacity: 0, y: 20 },
visible: { opacity: 1, y: 0 }
}}
/>
))}
</motion.ul>
```
### Page Transitions
```tsx
const pageTransition = {
initial: { opacity: 0, x: -20 },
animate: { opacity: 1, x: 0 },
exit: { opacity: 0, x: 20 },
transition: { duration: 0.3 }
};
```
## Performance Debugging
- Use React DevTools to inspect re-renders
- Use Chrome DevTools Performance tab to identify animation jank
- Target 60fps minimum, 120fps on high refresh rate displays
- Test on actual devices, especially mid-range Android phones
© Mindrally · Apache-2.0 · Mindrally/skills
Similar skills
Everything for Frontend and UI →framer-motion by other authors comes first.