TL;DR
- Generic prompts get generic results — "add animations" produces basic fades
- Structured motion prompts specify spring values, stagger timing, and exit behavior
- Works across Claude, Cursor, Lovable, and Bolt
You asked your AI coding tool to "add animations" and got fade-ins on everything. Maybe a hover scale effect. Nothing that feels *detailed* — no coordinated timing, no physics-based motion, no micro-interactions that respond to what the user is actually doing.
Getting detailed animations from Claude, Cursor, or Lovable isn't about finding a better AI model. It's about giving the model better instructions. Here's how to move past basic fade-ins and into production-quality motion.
What "detailed" actually means
When developers search for "detailed animations," they're looking for motion that goes beyond surface-level transitions. Detailed animations have four qualities:
AI tools can produce all four. They just need to be told explicitly.
Why "add animations" gives shallow results
When you prompt an AI with "add animations to this page," the model makes safe, generic choices:
opacity: 0 to opacity: 1ease-in-outThis is the AI equivalent of "I'll add some CSS transitions and call it done." The model isn't wrong — you asked for animations and it gave you animations. But you wanted *detailed* animations, and that requires a detailed prompt.
The 3 levels of animation detail
Level 1: Basic (fade and slide)
This is what AI generates by default. Simple opacity and position changes with CSS-style easing.
// Level 1: Basic — what AI gives you unprompted
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.3 }}
>
{content}
</motion.div>How to prompt for Level 1: "Add a fade-in animation." You barely need to try.
Level 2: Intermediate (spring physics + stagger)
Spring-based motion with coordinated timing between elements. This requires specifying the physics model and stagger behavior.
// Level 2: Intermediate — requires specific prompting
const container = {
hidden: {},
show: { transition: { staggerChildren: 0.06 } },
};
const item = {
hidden: { opacity: 0, y: 20 },
show: {
opacity: 1,
y: 0,
transition: { type: "spring", damping: 25, stiffness: 250 },
},
};
<motion.div variants={container} initial="hidden" animate="show">
{items.map((i) => (
<motion.div key={i.id} variants={item}>
{i.label}
</motion.div>
))}
</motion.div>How to prompt for Level 2: "Use Framer Motion with spring physics (damping: 25, stiffness: 250). Stagger children with 60ms delay. Animate from opacity 0 and y: 20."
Level 3: Advanced (gesture-aware, orchestrated, layout)
Full orchestration with gesture responses, layout animations, AnimatePresence for exits, and context-aware timing. This is what makes an interface feel professionally designed.
// Level 3: Advanced — requires structured prompts or motion specifications
<AnimatePresence mode="wait">
{isOpen && (
<motion.div
key="panel"
initial={{ opacity: 0, scale: 0.96, y: 8 }}
animate={{ opacity: 1, scale: 1, y: 0 }}
exit={{ opacity: 0, scale: 0.98, y: -4 }}
transition={{ type: "spring", damping: 28, stiffness: 300 }}
>
<motion.ul
variants={{
show: { transition: { staggerChildren: 0.04, delayChildren: 0.1 } },
}}
initial="hidden"
animate="show"
>
{items.map((item) => (
<motion.li
key={item.id}
layout
variants={{
hidden: { opacity: 0, x: -12 },
show: {
opacity: 1,
x: 0,
transition: { type: "spring", damping: 22, stiffness: 280 },
},
}}
whileHover={{
x: 4,
backgroundColor: "rgba(0,0,0,0.03)",
transition: { type: "spring", damping: 20, stiffness: 300 },
}}
>
{item.label}
</motion.li>
))}
</motion.ul>
</motion.div>
)}
</AnimatePresence>How to prompt for Level 3: You'd need a paragraph of specifications covering entrance, exit, stagger, hover, tap, layout behavior, reduced motion, and timing relationships. That's a lot to write for every component.
Comparison: basic prompt vs detailed prompt vs motion prompt
| Aspect | "Add animations" | Detailed prompt | Motion prompt |
|---|---|---|---|
| Easing | ease-in-out | Spring physics | Spring physics |
| Stagger | None | Yes, specified | Yes, systematic |
| Exit animations | None | If requested | Always included |
| Hover/tap states | Basic or none | If specified | Full interaction set |
| Reduced motion | Never | If remembered | Always included |
| Consistency | Random per component | Per-prompt | App-wide system |
| Effort per component | Low | High | Zero after setup |
The jump from Level 1 to Level 3 isn't about AI capability — it's about prompt quality. Structured prompts consistently produce Level 3 output because they give the AI the same detailed specifications a senior animation developer would follow.
Why structured prompts win
Writing a detailed animation prompt for every component is technically possible but impractical. You'd need to specify spring values, stagger timing, exit behavior, reduced motion handling, and interaction states for each component — then keep them consistent across your entire app.
Motion prompts solve this by packaging those specifications into a single file. Add it to your Cursor Rules, Claude Project, or Lovable session once, and every AI-generated component comes out at Level 3 detail automatically.
For tool-specific guides, see How to Get Better Animations in Claude, How to Get Better Animations in Cursor, or Add Animations to Vibe-Coded Apps.
UI Motion Prompts — structured animation specifications that get you Level 3 detail from any AI coding tool. Works with Cursor, Claude, Lovable, and v0.
More articles
How to Build a Smooth UI with AI Prompts
Practical guide on what makes a UI feel smooth (timing, easing, springs, reduced motion), why AI tools default to janky transitions, and how structured motion prompts solve this.
CSS Animations Are Dead — Here's What Replaced Them
Why CSS animations are declining (-40%) as AI coding tools take over, what's replacing them (Framer Motion via AI prompts), and why you should stop hand-coding @keyframes.