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.

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.

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.

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.

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

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.

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.

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.

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)

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

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

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.