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:

typescript
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.

typescript
// 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.

Presetfrom values
Fade Inopacity: 0
Blur Inopacity: 0, filter: "blur(10px)"
Fade Upopacity: 0, y: 100
Fade Downopacity: 0, y: -100
Fade Leftopacity: 0, x: 100
Fade Rightopacity: 0, x: -100
Scale Inscale: 0
Scale In Softscale: 0.5, opacity: 0
Zoom Inscale: 0.3, opacity: 0
Zoom Outscale: 1.3, opacity: 0
Flip In XrotateX: 90, opacity: 0
Flip In YrotateY: 90, opacity: 0
Rise & Fadeopacity: 0, y: 80, scale: 0.95
Skew Slideopacity: 0, x: -100, skewX: 15
Spiral Inscale: 0, rotate: 180, opacity: 0
Corner Popscale: 0, rotate: -90, transformOrigin: "0% 0%"

All x/y values are in px. All rotate/rotateX/rotateY values are in degrees.

typescript
// 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.

Presetto valuesRepeat
Pulsescale: 1.1infinite yoyo
Shake Xx: 103× yoyo then stops
Shake Yy: 10infinite yoyo
Wigglerotate: 5infinite yoyo
Bouncey: -20infinite yoyo
Rubber BandscaleX: 1.3, scaleY: 0.8infinite yoyo
Swingrotate: 15, transformOrigin: "50% 0%"infinite yoyo
Pendulumrotate: 20, transformOrigin: "50% 0%"infinite yoyo
Flashopacity: 0.3infinite yoyo
Strobeopacity: 0infinite yoyo
Flip BackrotateY: 360infinite (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.

typescript
// 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

Presetfrom valuesStagger eachStagger from
Words Fade Inopacity: 00.08sstart
Words Slide Upopacity: 0, y: 200.10sstart
Words Slide Downopacity: 0, y: -200.10sstart
Words From Leftopacity: 0, x: -300.08sstart
Words From Rightopacity: 0, x: 300.08sstart
Words From Centeropacity: 0, scale: 0.50.10scenter
Words From Edgesopacity: 00.10sedges
Words Blur Inopacity: 0, filter: "blur(10px)"0.10sstart
Words Skew Inopacity: 0, skewX: 200.08sstart
Words Typewriteropacity: 0, x: -100.15sstart

Characters

Presetfrom valuesStagger eachStagger from
Chars Fade Inopacity: 00.03sstart
Chars Cascadeopacity: 0, y: 300.03sstart
Chars Pop Inscale: 00.02sstart
Chars Rotate Inopacity: 0, rotate: 900.03sstart
Chars Randomopacity: 0, y: 200.02srandom
Chars 3D FliprotateX: 90, opacity: 00.03sstart
Chars Waveopacity: 0, y: -200.02sstart
Typewriteropacity: 00.05sstart

Lines

Presetfrom valuesStagger eachStagger from
Lines Riseopacity: 0, y: 400.20sstart
Lines Fadeopacity: 00.15sstart

All x/y values are in px. rotate/rotateX in degrees. skewX in degrees.

typescript
// 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.

Presetfrom values
Gentle Fadeopacity: 0.3
Soft Slide Upy: 20, opacity: 0.5
Float Iny: 15, opacity: 0
Blur to Focusopacity: 0, filter: "blur(5px)"
Elegant Scalescale: 0.95, opacity: 0
Drift Rightx: -20, opacity: 0
Drift Leftx: 20, opacity: 0
Rise Subtley: 10, opacity: 0, scale: 0.98
Drop Subtley: -10, opacity: 0, scale: 0.98
Grow Subtlescale: 0.9, opacity: 0
Shrink Inscale: 1.1, opacity: 0
Soft Blur Slidey: 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.

typescript
// 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)

Presetfrom values
Spiral Inscale: 0, rotate: 180, opacity: 0
Twist Inrotate: 360, scale: 0, opacity: 0
Bounce Inscale: 0
Squeeze InscaleX: 0, scaleY: 1, opacity: 0
Morph Inscale: 0.5, skewX: 20, opacity: 0

Exit (to only)

Presetto values
Spiral Outscale: 0, rotate: -180, opacity: 0
Squeeze OutscaleX: 1, scaleY: 0, opacity: 0

Complete Transitions (from + to)

Presetfrom valuesto values
Slide Throughx: -100, opacity: 0x: 100, opacity: 0
Zoom Throughscale: 0, opacity: 0scale: 2, opacity: 0
Flip FullrotateY: -90, opacity: 0rotateY: 90, opacity: 0
Rotate Throughrotate: -180rotate: 180
Color ShiftbackgroundColor: "#ff0000"backgroundColor: "#0000ff"
Skew TransformskewX: -30, x: -50skewX: 30, x: 50
Scale Bouncescale: 0scale: 1.2 + repeat: { times: 1, yoyo: true }
Perspective SpinrotateY: 180, scale: 0.5rotateY: 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).

typescript
// 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

CategoryCountPatternTrigger Style
Entrances16from onlyPage load, scroll
Loops11to + repeatPage load (always-on)
Text Reveals20from + split + staggerPage load, scroll
Smooth Transitions12from only (subtle values)Scroll, page load
Creative Effects15from, to, or bothPage load, click, hover

Total: 74 presets.