About motion-one
A design skill for implementing Disney’s 12 animation principles with Motion One. It provides Web Animations API examples for interface and web motion, including timelines, staggered effects, and scroll-linked animations.
Key features
- 01Examples for 12 animation principles
- 02Single animations and timelines
- 03Staggered effects and spring easing
- 04Scroll-linked and in-view motion
Use cases
- 01Adding character to interface elements
- 02Sequencing motion across multiple elements
- 03Creating scroll-responsive web animations
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ dylantarre/ animation-principles --skill motion-oneAfter installing, type/motion-onein Claude Code to confirm it loaded.
Details
From the project READMEMotion One Animation Principles
Implement all 12 Disney animation principles using Motion One's performant Web Animations API wrapper.
1. Squash and Stretch
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
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
animate(".background", { filter: "blur(3px)", opacity: 0.6 });
animate(".hero", { scale: 1.1 });
4. Straight Ahead / Pose to Pose
animate(".element", {
x: [0, 100, 200, 300],
y: [0, -50, 0, -30]
}, { duration: 1 });
5. Follow Through and Overlapping Action
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
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
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
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
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
import { spring } from "motion";
animate(".element", { scale: 1.5, rotate: 720 }, {
easing: spring({ stiffness: 200, damping: 10 }) // overshoot
});
11. Solid Drawing
animate(".box", {
rotateX: 45,
rotateY: 30
}, { duration: 0.5 });
// Set perspective in CSS: perspective: 1000px;
12. Appeal
animate(".card", {
scale: 1.02,
boxShadow: "0 20px 40px rgba(0,0,0,0.2)"
}, { duration: 0.3, easing: "ease-out" });
Stagger Animation
import { stagger } from "motion";
animate(".item",
{ opacity: [0, 1], y: [20, 0] },
{ delay: stagger(0.1) }
);
Scroll Animations
import { scroll, animate } from "motion";
scroll(
animate(".parallax", { y: [0, 100] }),
{ target: document.querySelector(".container") }
);
In-View Animations
import { inView } from "motion";
inView(".section", ({ target }) => {
animate(target, { opacity: 1, y: 0 }, { duration: 0.5 });
});
Key Motion One Features
animate()- Single animationtimeline()- Sequence withatpositioningstagger()- Offset delaysspring()- Physics-based easingscroll()- Scroll-linked animationsinView()- Intersection observer wrapper- Uses Web Animations API (hardware accelerated)
- Tiny bundle size (~3kb)
Comments
Markdown supported