Skip to content
Back to skills

Animation

ASecurity

Implement animations using the Motion library. Use when adding motion, transitions, gestures, scroll effects, or interactive animations to components. Triggered by implementation requests, not conceptual discussions.

  • 207 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 4, 2026
designtypescriptbashreactspringgitperformance

Security analysis

A100/100

Pro scans all 13 files and shows the line behind each finding

Scanned September 4, 2026

npx -y skills add NeverSight/skills_feed --skill animation --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Animation?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Animation
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/neversight-animation/badge)](https://www.skillsdirectory.com/skills/neversight-animation)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: animation
description: Implement animations using the Motion library. Use when adding motion, transitions, gestures, scroll effects, or interactive animations to components. Triggered by implementation requests, not conceptual discussions.
allowed-tools: [Read, Edit, Grep, Glob, Bash, Write]
---

# Animation Implementation with Motion

Use the Motion library (https://motion.dev) for all animation work.

## Quick Start

**React (Primary):**

```jsx
import { motion } from "motion/react"

// Basic animation
<motion.div animate={{ opacity: 1, y: 0 }} />

// With transition config
<motion.div
  animate={{ x: 100 }}
  transition={{ type: "spring", stiffness: 100 }}
/>
```

## Core Patterns

### 1. Spring Physics (Preferred)

```jsx
<motion.div
  animate={{ scale: 1 }}
  transition={{
    type: 'spring',
    stiffness: 260,
    damping: 20,
  }}
/>
```

Spring presets:

- **Gentle**: `stiffness: 120, damping: 14`
- **Wobbly**: `stiffness: 180, damping: 12`
- **Stiff**: `stiffness: 300, damping: 20`

### 2. Gesture Interactions

```jsx
<motion.div
  whileHover={{ scale: 1.05 }}
  whileTap={{ scale: 0.95 }}
  drag="x"
  dragConstraints={{ left: -100, right: 100 }}
/>
```

### 3. Layout Animations

```jsx
<motion.div layout>{/* Content that changes position/size */}</motion.div>
```

### 4. Scroll-Linked Effects

```jsx
import { useScroll, useTransform } from "motion/react"

const { scrollYProgress } = useScroll()
const opacity = useTransform(scrollYProgress, [0, 1], [1, 0])

<motion.div style={{ opacity }} />
```

### 5. Stagger Children

```jsx
<motion.ul
  variants={{
    visible: { transition: { staggerChildren: 0.07 } },
  }}
>
  {items.map((item) => (
    <motion.li
      key={item}
      variants={{
        hidden: { opacity: 0, y: 20 },
        visible: { opacity: 1, y: 0 },
      }}
    />
  ))}
</motion.ul>
```

### 6. Enter/Exit Animations

```jsx
import { AnimatePresence } from 'motion/react';

<AnimatePresence>
  {show && <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} />}
</AnimatePresence>;
```

## Animation Properties

**Transform** (GPU-accelerated, performant):

- `x, y, z` - Translate
- `scale, scaleX, scaleY` - Scale
- `rotate, rotateX, rotateY, rotateZ` - Rotation
- `skew, skewX, skewY` - Skew

**Visual** (use sparingly, can affect performance):

- `opacity`
- `background, backgroundColor`
- `color`
- `borderRadius`

**SVG-specific**:

- `pathLength` - For path drawing animations
- `pathOffset` - Offset the path
- `pathSpacing` - Spacing between dashes

## Accessibility

Always respect user preferences:

```jsx
<motion.div
  animate={{ x: 100 }}
  transition={{
    type: 'spring',
    // Disables animation if user prefers reduced motion
    duration: 0,
  }}
/>
```

Motion automatically handles `prefers-reduced-motion`. Springs become instant transitions.

## Performance Tips

1. **Animate transforms/opacity only** when possible (GPU-accelerated)
2. **Use `layout` prop** instead of animating width/height manually
3. **Avoid animating** during scroll when possible
4. **Use `will-change: transform`** for complex animations (Motion handles this)
5. **Limit simultaneous animations** - stagger instead of all-at-once

## Design Principles (Brief)

### When to Animate

- State transitions (loading → success)
- Spatial changes (entering/exiting view)
- Drawing attention (sparingly)
- Confirming user action

### When NOT to Animate

- Repeated actions after first occurrence
- Performance-critical paths
- User-controlled scrolling
- Every single interaction (restraint matters)

### Timing Guidelines

- **Micro-interactions**: 150-250ms
- **Panel/modal transitions**: 200-300ms
- **Page transitions**: 300-500ms
- **Springs**: Let physics determine duration

### Spring vs Duration

- **Use springs for**: Interactive elements, gestures, layout changes
- **Use duration for**: Intentional sequences, choreography, loaders

See `principles.md` for detailed animation philosophy.

## Common Patterns

**Loading state:**

```jsx
<motion.div
  animate={{ rotate: 360 }}
  transition={{
    repeat: Infinity,
    duration: 1,
    ease: 'linear',
  }}
/>
```

**Toast notification:**

```jsx
<motion.div
  initial={{ x: 400, opacity: 0 }}
  animate={{ x: 0, opacity: 1 }}
  exit={{ x: 400, opacity: 0 }}
  transition={{ type: 'spring', stiffness: 300, damping: 30 }}
/>
```

**Drawer:**

```jsx
<motion.div
  initial={{ x: '-100%' }}
  animate={{ x: 0 }}
  exit={{ x: '-100%' }}
  transition={{ type: 'spring', damping: 25 }}
/>
```

**Accordion:**

```jsx
<motion.div
  animate={{ height: isOpen ? 'auto' : 0 }}
  transition={{ type: 'spring', bounce: 0 }}
  style={{ overflow: 'hidden' }}
/>
```

## Resources

- **Motion Docs**: https://motion.dev/docs/react
- **Motion Examples**: https://motion.dev/examples (100+ free examples)
- **GitHub Repository**: https://github.com/motiondivision/motion
- **Extended resources**: See `resources.md` for curated animation.dev lessons and vault

## Quick Troubleshooting

**Animation not running?**

- Check if element is conditionally rendered (use AnimatePresence)
- Verify target values are different from initial values
- Check for CSS that might override (e.g., `!important`)

**Performance issues?**

- Stick to transforms and opacity
- Use `layout` prop instead of animating dimensions
- Check browser DevTools Performance tab

**Layout animations flickering?**

- Ensure parent has `position: relative`
- Add `layout` to both parent and child if needed
- Check for conflicting CSS transitions

## Notes

- Motion is MIT licensed, production-ready
- Hybrid engine: 120fps, GPU-accelerated
- TypeScript support built-in
- Tree-shakable for optimal bundle size
- Works with React 18+ (including Suspense)

Files in this skill

  • SKILL.md5.6 KB
  • description_ar.txt378 B
  • description_cn.txt168 B
  • description_de.txt281 B
  • description_en.txt217 B
  • description_es.txt259 B
  • description_fr.txt295 B
  • description_it.txt261 B
  • description_ja.txt386 B
  • description_ko.txt274 B
  • description_ru.txt438 B
  • description_tw.txt168 B
  • stats.json65 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…