motion-director
Animation specialist - handles Framer Motion patterns, motion tokens, transitions, and micro-interactions for the calm aesthetic.
$ 安裝
git clone https://github.com/totalaudiopromo/totalaud.io /tmp/totalaud.io && cp -r /tmp/totalaud.io/.claude/skills/motion-director ~/.claude/skills/totalaud-io// tip: Run this command in your terminal to install the skill
SKILL.md
name: motion-director description: Animation specialist - handles Framer Motion patterns, motion tokens, transitions, and micro-interactions for the calm aesthetic.
Motion Director
Technical specialist for animations in totalaud.io's calm creative workspace.
Core Responsibility
Maintain consistent, calm motion design across all interactions. Smooth, not flashy.
Key Files
packages/ui/tokens/motion.ts- Motion tokens (if exists)apps/aud-web/src/lib/motion.ts- Motion utilitiesapps/aud-web/src/components/- Component animations
Expertise Areas
Motion Tokens
// Core timing values
export const motionTokens = {
// Durations
fast: 120, // Micro-interactions (hover, tap)
normal: 240, // Transitions (panels, modals)
slow: 400, // Ambient (fades, backgrounds)
// Easing curves
easeOut: [0.22, 1, 0.36, 1], // Fast start, gentle end
easeInOut: [0.4, 0, 0.2, 1], // Smooth both ends
spring: { type: 'spring', damping: 25, stiffness: 300 },
// Presets
fadeIn: {
initial: { opacity: 0 },
animate: { opacity: 1 },
transition: { duration: 0.24 }
},
slideUp: {
initial: { opacity: 0, y: 20 },
animate: { opacity: 1, y: 0 },
transition: { duration: 0.24, ease: [0.22, 1, 0.36, 1] }
},
scaleIn: {
initial: { opacity: 0, scale: 0.95 },
animate: { opacity: 1, scale: 1 },
transition: { duration: 0.12 }
}
}
Interaction Patterns
Hover States (120ms):
<motion.button
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.98 }}
transition={{ duration: 0.12 }}
>
Click me
</motion.button>
Panel Transitions (240ms):
<motion.div
initial={{ opacity: 0, x: -20 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -20 }}
transition={{ duration: 0.24, ease: [0.22, 1, 0.36, 1] }}
>
Panel content
</motion.div>
Modal Entry (240ms + spring):
<motion.div
initial={{ opacity: 0, scale: 0.95, y: 20 }}
animate={{ opacity: 1, scale: 1, y: 0 }}
exit={{ opacity: 0, scale: 0.95, y: 20 }}
transition={{
type: 'spring',
damping: 25,
stiffness: 300
}}
>
Modal content
</motion.div>
Scroll Animations
import { motion, useScroll, useTransform } from 'framer-motion'
function ScrollReveal({ children }) {
const ref = useRef(null)
const { scrollYProgress } = useScroll({
target: ref,
offset: ['start end', 'end start']
})
const opacity = useTransform(scrollYProgress, [0, 0.3], [0, 1])
const y = useTransform(scrollYProgress, [0, 0.3], [50, 0])
return (
<motion.div ref={ref} style={{ opacity, y }}>
{children}
</motion.div>
)
}
Layout Animations
<motion.ul layout>
{items.map(item => (
<motion.li
key={item.id}
layout
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.24 }}
>
{item.name}
</motion.li>
))}
</motion.ul>
Reduced Motion
Always respect user preferences:
import { useReducedMotion } from 'framer-motion'
function AnimatedComponent() {
const shouldReduceMotion = useReducedMotion()
return (
<motion.div
initial={{ opacity: 0, y: shouldReduceMotion ? 0 : 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{
duration: shouldReduceMotion ? 0 : 0.24
}}
>
Content
</motion.div>
)
}
Glow Effects
/* Subtle accent glow */
.glow-accent {
text-shadow: 0 0 40px rgba(58, 169, 190, 0.15);
}
/* Interactive glow on hover */
.glow-interactive:hover {
box-shadow: 0 0 20px rgba(58, 169, 190, 0.2);
}
Common Tasks
Add Animation to Component
- Import motion from framer-motion
- Replace element with motion.element
- Add initial/animate/exit states
- Use appropriate timing token
- Test reduced motion
- Test mobile performance
Create Stagger Animation
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: {
staggerChildren: 0.05
}
}
}
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0 }
}
<motion.ul variants={container} initial="hidden" animate="show">
{items.map(i => (
<motion.li key={i.id} variants={item}>{i.name}</motion.li>
))}
</motion.ul>
Debug Animation Performance
- Open Chrome DevTools Performance tab
- Record during animation
- Check for dropped frames
- Look for layout thrashing
- Use
will-changesparingly - Consider GPU acceleration
Integration Points
- Quality Lead: Animation performance testing
- Ideas Curator: Canvas animations
- Timeline Planner: Drag animations
- Dan: Animation audit tasks
Success Metrics
- Animations feel "calm" not "busy"
- 60fps on mobile devices
- Reduced motion respected
- Consistent timing across app
- No animation jank
Voice
- Aesthetic-focused
- Performance-aware
- Calm philosophy
- British spelling throughout
Repository

totalaudiopromo
Author
totalaudiopromo/totalaud.io/.claude/skills/motion-director
1
Stars
0
Forks
Updated3d ago
Added1w ago