Animation Presets
Full catalog of built-in presets — Entrances, Loops, Text Reveals, Smooth Transitions, Creative Effects.
Presets are ready-made animation configurations built into the Motion.page Builder. Each preset pre-fills from, to, stagger, split, and repeat settings — a starting point you can customize immediately.
In the Builder, open the Presets panel, pick a category, and click any preset to apply it to the selected element. In the SDK, copy the from/to values from the tables below directly into your Motion() call.
SDK Usage
Presets don’t have a dedicated API option — use the from/to values from each preset’s row directly in AnimationConfig:
import { Motion } from "@motion.page/sdk";
// Fade Up preset
Motion("hero", "#hero", {
from: { opacity: 0, y: 100 },
duration: 0.8,
ease: "power2.out",
}).onPageLoad();
// Pulse loop preset
Motion("badge", ".badge", {
to: { scale: 1.1 },
duration: 0.8,
repeat: { times: -1, yoyo: true },
ease: "power1.inOut",
}).onPageLoad();
// Text reveal preset (Words Slide Up)
Motion("headline", "h1", {
split: "words",
from: { opacity: 0, y: 20 },
stagger: { each: 0.1, from: "start" },
duration: 0.7,
ease: "power2.out",
}).onPageLoad(); Overriding Preset Values
Apply a preset in the Builder, then adjust any value — duration, ease, individual from/to properties. In the SDK, the preset values are just defaults: change whatever you need.
// Fade Up with a slower duration and spring ease
Motion("section", ".section", {
from: { opacity: 0, y: 60 }, // reduced offset (default: 100)
duration: 1.2, // slower (common default: 0.8)
ease: "elastic.out(1, 0.75)", // spring instead of power ease
}).onPageLoad(); Entrances
Entrance presets animate elements into their natural state — all use from values only. The SDK resolves the missing to endpoint from the element’s current computed CSS.
| Preset | from values |
|---|---|
| Fade In | opacity: 0 |
| Blur In | opacity: 0, filter: "blur(10px)" |
| Fade Up | opacity: 0, y: 100 |
| Fade Down | opacity: 0, y: -100 |
| Fade Left | opacity: 0, x: 100 |
| Fade Right | opacity: 0, x: -100 |
| Scale In | scale: 0 |
| Scale In Soft | scale: 0.5, opacity: 0 |
| Zoom In | scale: 0.3, opacity: 0 |
| Zoom Out | scale: 1.3, opacity: 0 |
| Flip In X | rotateX: 90, opacity: 0 |
| Flip In Y | rotateY: 90, opacity: 0 |
| Rise & Fade | opacity: 0, y: 80, scale: 0.95 |
| Skew Slide | opacity: 0, x: -100, skewX: 15 |
| Spiral In | scale: 0, rotate: 180, opacity: 0 |
| Corner Pop | scale: 0, rotate: -90, transformOrigin: "0% 0%" |
All x/y values are in px. All rotate/rotateX/rotateY values are in degrees.
// Flip In X
Motion("card", ".card", {
from: { rotateX: 90, opacity: 0 },
duration: 0.7,
ease: "power3.out",
}).onScroll({ scrub: false, toggleActions: "play none none none" });
// Corner Pop — note the custom transform origin
Motion("pop", ".badge", {
from: { scale: 0, rotate: -90 },
duration: 0.5,
ease: "back.out(1.7)",
}).onPageLoad();
// Set transform origin separately:
// Motion.set(".badge", { transformOrigin: "0% 0%" }); Loops
Loop presets animate to a custom state with infinite repeat. All use to values only — the SDK reads the element’s current CSS as the start point.
| Preset | to values | Repeat |
|---|---|---|
| Pulse | scale: 1.1 | infinite yoyo |
| Shake X | x: 10 | 3× yoyo then stops |
| Shake Y | y: 10 | infinite yoyo |
| Wiggle | rotate: 5 | infinite yoyo |
| Bounce | y: -20 | infinite yoyo |
| Rubber Band | scaleX: 1.3, scaleY: 0.8 | infinite yoyo |
| Swing | rotate: 15, transformOrigin: "50% 0%" | infinite yoyo |
| Pendulum | rotate: 20, transformOrigin: "50% 0%" | infinite yoyo |
| Flash | opacity: 0.3 | infinite yoyo |
| Strobe | opacity: 0 | infinite yoyo |
| Flip Back | rotateY: 360 | infinite (no yoyo) |
x/y values are in px. rotate/rotateY in degrees. Shake X repeats 3 times (plays 4 total) then stops; all others loop infinitely.
// Pulse
Motion("pulse", ".cta-button", {
to: { scale: 1.1 },
duration: 0.8,
ease: "power1.inOut",
repeat: { times: -1, yoyo: true },
}).onPageLoad();
// Swing — set the pivot point before animating
Motion.set(".pendulum", { transformOrigin: "50% 0%" });
Motion("swing", ".pendulum", {
to: { rotate: 15 },
duration: 1,
ease: "power1.inOut",
repeat: { times: -1, yoyo: true },
}).onPageLoad();
// Flip Back — continuous spin (no yoyo)
Motion("spin", ".icon", {
to: { rotateY: 360 },
duration: 2,
ease: "none",
repeat: { times: -1, yoyo: false },
}).onPageLoad(); Text Reveals
Text Reveal presets split text into characters, words, or lines and stagger them in. All use from values with a split type and stagger configuration.
Words
| Preset | from values | Stagger each | Stagger from |
|---|---|---|---|
| Words Fade In | opacity: 0 | 0.08s | start |
| Words Slide Up | opacity: 0, y: 20 | 0.10s | start |
| Words Slide Down | opacity: 0, y: -20 | 0.10s | start |
| Words From Left | opacity: 0, x: -30 | 0.08s | start |
| Words From Right | opacity: 0, x: 30 | 0.08s | start |
| Words From Center | opacity: 0, scale: 0.5 | 0.10s | center |
| Words From Edges | opacity: 0 | 0.10s | edges |
| Words Blur In | opacity: 0, filter: "blur(10px)" | 0.10s | start |
| Words Skew In | opacity: 0, skewX: 20 | 0.08s | start |
| Words Typewriter | opacity: 0, x: -10 | 0.15s | start |
Characters
| Preset | from values | Stagger each | Stagger from |
|---|---|---|---|
| Chars Fade In | opacity: 0 | 0.03s | start |
| Chars Cascade | opacity: 0, y: 30 | 0.03s | start |
| Chars Pop In | scale: 0 | 0.02s | start |
| Chars Rotate In | opacity: 0, rotate: 90 | 0.03s | start |
| Chars Random | opacity: 0, y: 20 | 0.02s | random |
| Chars 3D Flip | rotateX: 90, opacity: 0 | 0.03s | start |
| Chars Wave | opacity: 0, y: -20 | 0.02s | start |
| Typewriter | opacity: 0 | 0.05s | start |
Lines
| Preset | from values | Stagger each | Stagger from |
|---|---|---|---|
| Lines Rise | opacity: 0, y: 40 | 0.20s | start |
| Lines Fade | opacity: 0 | 0.15s | start |
All x/y values are in px. rotate/rotateX in degrees. skewX in degrees.
// Words Slide Up
Motion("headline", "h1", {
split: "words",
from: { opacity: 0, y: 20 },
stagger: { each: 0.1, from: "start" },
duration: 0.7,
ease: "power2.out",
}).onPageLoad();
// Chars 3D Flip — perspective helps the 3D effect read clearly
Motion("title-3d", ".title", {
split: "chars",
from: { rotateX: 90, opacity: 0 },
stagger: { each: 0.03, from: "start" },
duration: 0.6,
ease: "power3.out",
}).onPageLoad();
// Words From Center — stagger radiates outward from middle
Motion("center-reveal", ".tagline", {
split: "words",
from: { opacity: 0, scale: 0.5 },
stagger: { each: 0.1, from: "center" },
duration: 0.6,
ease: "back.out(1.7)",
}).onPageLoad();
// Lines Rise — use mask to clip overflow during slide
Motion("lines-in", ".paragraph", {
split: "lines",
mask: true,
from: { opacity: 0, y: 40 },
stagger: { each: 0.2, from: "start" },
duration: 0.8,
ease: "power3.out",
}).onPageLoad(); Smooth Transitions
Smooth Transition presets use subtle values for gentle, polished reveals. All use from values only. Good for body copy, cards, and supporting UI elements where dramatic entrances feel excessive.
| Preset | from values |
|---|---|
| Gentle Fade | opacity: 0.3 |
| Soft Slide Up | y: 20, opacity: 0.5 |
| Float In | y: 15, opacity: 0 |
| Blur to Focus | opacity: 0, filter: "blur(5px)" |
| Elegant Scale | scale: 0.95, opacity: 0 |
| Drift Right | x: -20, opacity: 0 |
| Drift Left | x: 20, opacity: 0 |
| Rise Subtle | y: 10, opacity: 0, scale: 0.98 |
| Drop Subtle | y: -10, opacity: 0, scale: 0.98 |
| Grow Subtle | scale: 0.9, opacity: 0 |
| Shrink In | scale: 1.1, opacity: 0 |
| Soft Blur Slide | y: 15, opacity: 0, filter: "blur(3px)" |
x/y values are in px. Negative opacity start values (e.g. 0.3, 0.5) fade from partially visible rather than fully invisible — producing a softer effect.
// Elegant Scale — great for modals and cards
Motion("card-reveal", ".card", {
from: { scale: 0.95, opacity: 0 },
duration: 0.5,
ease: "power2.out",
}).onScroll({ scrub: false, toggleActions: "play none none none" });
// Blur to Focus — cinematic feel for hero text
Motion("hero-focus", ".hero-text", {
from: { opacity: 0, filter: "blur(5px)" },
duration: 0.9,
ease: "power2.out",
}).onPageLoad();
// Batch multiple elements with stagger
Motion("section-items", ".section-item", {
from: { y: 15, opacity: 0 },
duration: 0.5,
stagger: 0.08,
ease: "power2.out",
}).onScroll({ scrub: false, toggleActions: "play none none none" }); Creative Effects
Creative Effects presets include entrance-only (from), exit-only (to), and complete transitions (from + to — where neither endpoint matches the element’s natural state).
Entrance (from only)
| Preset | from values |
|---|---|
| Spiral In | scale: 0, rotate: 180, opacity: 0 |
| Twist In | rotate: 360, scale: 0, opacity: 0 |
| Bounce In | scale: 0 |
| Squeeze In | scaleX: 0, scaleY: 1, opacity: 0 |
| Morph In | scale: 0.5, skewX: 20, opacity: 0 |
Exit (to only)
| Preset | to values |
|---|---|
| Spiral Out | scale: 0, rotate: -180, opacity: 0 |
| Squeeze Out | scaleX: 1, scaleY: 0, opacity: 0 |
Complete Transitions (from + to)
| Preset | from values | to values |
|---|---|---|
| Slide Through | x: -100, opacity: 0 | x: 100, opacity: 0 |
| Zoom Through | scale: 0, opacity: 0 | scale: 2, opacity: 0 |
| Flip Full | rotateY: -90, opacity: 0 | rotateY: 90, opacity: 0 |
| Rotate Through | rotate: -180 | rotate: 180 |
| Color Shift | backgroundColor: "#ff0000" | backgroundColor: "#0000ff" |
| Skew Transform | skewX: -30, x: -50 | skewX: 30, x: 50 |
| Scale Bounce | scale: 0 | scale: 1.2 + repeat: { times: 1, yoyo: true } |
| Perspective Spin | rotateY: 180, scale: 0.5 | rotateY: 360, scale: 1 |
x values are in px. rotate/rotateY/skewX in degrees. Complete transitions define explicit start and end states — the element passes through both on its way to the natural resting state (or is explicitly a pass-through effect like Slide Through).
// Bounce In — add a back ease for the overshoot feel
Motion("pop-in", ".modal", {
from: { scale: 0 },
duration: 0.5,
ease: "back.out(1.7)",
}).onPageLoad();
// Spiral Out — play on exit trigger
Motion("spiral-exit", ".panel", {
to: { scale: 0, rotate: -180, opacity: 0 },
duration: 0.6,
ease: "power3.in",
}).onClick();
// Flip Full — complete flip transition, both endpoints are non-natural
Motion("flip-card", ".card", {
from: { rotateY: -90, opacity: 0 },
to: { rotateY: 90, opacity: 0 },
duration: 0.6,
ease: "power2.inOut",
}).onClick();
// Color Shift — hover color transition between two explicit colors
Motion("color-hover", ".button", {
from: { backgroundColor: "#ff0000" },
to: { backgroundColor: "#0000ff" },
duration: 0.4,
ease: "power2.inOut",
}).onHover({ each: true, onLeave: "reverse" });
// Scale Bounce — grows in then bounces once
Motion("scale-bounce", ".notification", {
from: { scale: 0 },
to: { scale: 1.2 },
duration: 0.4,
ease: "power2.out",
repeat: { times: 1, yoyo: true },
}).onPageLoad();
// Perspective Spin — rotating reveal from a half-turn
Motion("spin-reveal", ".card", {
from: { rotateY: 180, scale: 0.5 },
to: { rotateY: 360, scale: 1 },
duration: 0.8,
ease: "power2.out",
}).onPageLoad(); Quick Reference
| Category | Count | Pattern | Trigger Style |
|---|---|---|---|
| Entrances | 16 | from only | Page load, scroll |
| Loops | 11 | to + repeat | Page load (always-on) |
| Text Reveals | 20 | from + split + stagger | Page load, scroll |
| Smooth Transitions | 12 | from only (subtle values) | Scroll, page load |
| Creative Effects | 15 | from, to, or both | Page load, click, hover |
Total: 74 presets.