home / skills / dylantarre / animation-principles / motion-one

This skill helps implement Disney's 12 animation principles using Motion One to create performant, expressive web animations.

npx playbooks add skill dylantarre/animation-principles --skill motion-one

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
3.6 KB
---
name: motion-one
description: Use when implementing Disney's 12 animation principles with Motion One (modern, lightweight animation library)
---

# Motion One Animation Principles

Implement all 12 Disney animation principles using Motion One's performant Web Animations API wrapper.

## 1. Squash and Stretch

```javascript
import { animate } from "motion";

animate(".ball",
  { scaleX: [1, 1.2, 1], scaleY: [1, 0.8, 1] },
  { duration: 0.3, easing: "ease-in-out" }
);
```

## 2. Anticipation

```javascript
import { timeline } from "motion";

timeline([
  [".character", { y: 10, scaleY: 0.9 }, { duration: 0.2 }],
  [".character", { y: -200 }, { duration: 0.4, easing: "ease-out" }]
]);
```

## 3. Staging

```javascript
animate(".background", { filter: "blur(3px)", opacity: 0.6 });
animate(".hero", { scale: 1.1 });
```

## 4. Straight Ahead / Pose to Pose

```javascript
animate(".element", {
  x: [0, 100, 200, 300],
  y: [0, -50, 0, -30]
}, { duration: 1 });
```

## 5. Follow Through and Overlapping Action

```javascript
timeline([
  [".body", { x: 200 }, { duration: 0.5 }],
  [".hair", { x: 200 }, { duration: 0.5, at: "-0.45" }],
  [".cape", { x: 200 }, { duration: 0.6, at: "-0.5" }]
]);
```

## 6. Slow In and Slow Out

```javascript
animate(".element", { x: 300 }, {
  duration: 0.6,
  easing: [0.42, 0, 0.58, 1] // cubic-bezier ease-in-out
});
// Or: "ease-in", "ease-out", "ease-in-out"
// Or spring: { easing: spring({ stiffness: 100, damping: 15 }) }
```

## 7. Arc

```javascript
animate(".ball", {
  x: [0, 100, 200],
  y: [0, -100, 0]
}, { duration: 1, easing: "ease-in-out" });

// Or with offset path
animate(".element", {
  offsetDistance: ["0%", "100%"]
}, { duration: 1 });
// CSS: offset-path: path('M0,100 Q100,0 200,100');
```

## 8. Secondary Action

```javascript
const button = document.querySelector(".button");
button.addEventListener("mouseenter", () => {
  animate(button, { scale: 1.05 }, { duration: 0.2 });
  animate(".icon", { rotate: 15 }, { duration: 0.15 });
});
```

## 9. Timing

```javascript
import { spring } from "motion";

// Fast snap
animate(".fast", { x: 100 }, { duration: 0.15 });

// Spring physics
animate(".spring", { x: 100 }, {
  easing: spring({ stiffness: 300, damping: 20 })
});

// Slow dramatic
animate(".slow", { x: 100 }, { duration: 0.8, easing: "ease-out" });
```

## 10. Exaggeration

```javascript
import { spring } from "motion";

animate(".element", { scale: 1.5, rotate: 720 }, {
  easing: spring({ stiffness: 200, damping: 10 }) // overshoot
});
```

## 11. Solid Drawing

```javascript
animate(".box", {
  rotateX: 45,
  rotateY: 30
}, { duration: 0.5 });
// Set perspective in CSS: perspective: 1000px;
```

## 12. Appeal

```javascript
animate(".card", {
  scale: 1.02,
  boxShadow: "0 20px 40px rgba(0,0,0,0.2)"
}, { duration: 0.3, easing: "ease-out" });
```

## Stagger Animation

```javascript
import { stagger } from "motion";

animate(".item",
  { opacity: [0, 1], y: [20, 0] },
  { delay: stagger(0.1) }
);
```

## Scroll Animations

```javascript
import { scroll, animate } from "motion";

scroll(
  animate(".parallax", { y: [0, 100] }),
  { target: document.querySelector(".container") }
);
```

## In-View Animations

```javascript
import { inView } from "motion";

inView(".section", ({ target }) => {
  animate(target, { opacity: 1, y: 0 }, { duration: 0.5 });
});
```

## Key Motion One Features

- `animate()` - Single animation
- `timeline()` - Sequence with `at` positioning
- `stagger()` - Offset delays
- `spring()` - Physics-based easing
- `scroll()` - Scroll-linked animations
- `inView()` - Intersection observer wrapper
- Uses Web Animations API (hardware accelerated)
- Tiny bundle size (~3kb)

Overview

This skill teaches how to implement Disney's 12 animation principles using Motion One, a modern, lightweight wrapper around the Web Animations API. It provides concrete code patterns for squash & stretch, anticipation, staging, timing, arcs, springs, stagger, scroll-linked and in-view animations. The focus is on practical, performative techniques that keep bundle size small and run smoothly in the browser.

How this skill works

Each principle is mapped to Motion One primitives like animate(), timeline(), stagger(), spring(), scroll(), and inView(). Example snippets show keyframe arrays, easing choices, timeline positioning, and offset-path usage to produce arcs and overlapping actions. The skill also highlights hardware-accelerated Web Animations API usage and small bundle benefits.

When to use it

  • Animate UI components with natural motion using animation principles (e.g., buttons, cards, characters).
  • Create entrance, exit, and scroll-triggered effects that remain performant on mobile and desktop.
  • Sequence complex layered animations where follow-through and overlapping timing matter.
  • Prototype character or mascot motion that requires squash/stretch, arcs, and anticipation.
  • Add subtle secondary actions and staggered lists to improve perceived polish and clarity.

Best practices

  • Prefer timeline() for sequenced actions and use the at option to overlap steps for follow-through.
  • Use spring() for lively, physics-driven motion and cubic-bezier for controlled slow-in/slow-out.
  • Keep transforms (translate, scale, rotate) on composite properties to stay hardware accelerated.
  • Use stagger() for lists and small delays to reduce layout thrashing and improve rhythm.
  • Limit heavy filters or large blur values; use them for staging but keep durations short for performance.

Example use cases

  • Button hover that scales the button and adds a secondary icon rotation for clear affordance.
  • Character jump using anticipation, squash & stretch, arc motion, and follow-through for hair/cape.
  • Hero section entrance with staging blur on background and inView-triggered reveal for the hero.
  • List or grid reveal using staggered opacity and slide to create a readable visual flow.
  • Scroll-linked parallax where elements move along offset-paths or offsetDistance for arcs.

FAQ

Is Motion One performant for mobile?

Yes. Motion One uses the Web Animations API and composite transforms to stay hardware accelerated and keeps bundle size tiny.

When should I use spring vs easing curves?

Use spring() for organic, bouncy motion and cubic-bezier or named easings for precise slow-in/slow-out timing and dramatic beats.