tweenly

Playground

Tune timing, curves and springs by hand, watch the result, then copy the code for Motion, GSAP or CSS.

01

Animation lab

Pick a preset, shape its timing and stagger, and get the same animation in three libraries.

0.6s
0.1s
repeat
target
6
0.06s
import { motion } from "motion/react"

export function Boxes() {
  return (
    <div className="flex flex-wrap gap-3">
      {Array.from({ length: 6 }, (_, i) => (
        <motion.div
          key={i}
          className="size-12 rounded-xl bg-[#ff4d12]"
          initial={{ opacity: 0, y: 24 }}
          animate={{ opacity: 1, y: 0 }}
          transition={{
            duration: 0.6,
            delay: 0.1 + i * 0.06,
            ease: [0.22, 1, 0.36, 1],
          }}
        />
      ))}
    </div>
  )
}
02

Easing editor

Drag the control points of a cubic-bezier and feel the difference against linear.

timeprogress
curve
linear
cubic-bezier(0.22, 1, 0.36, 1)

Drag the orange handles, or focus one and use the arrow keys. The orange dot on the curve traces progress over time.

presets
1s
x1
0.22
y1
1
x2
0.36
y2
1

Nearest GSAP ease: power4.out (off by up to 1.1%)

.box {
  transition: transform 1s cubic-bezier(0.22, 1, 0.36, 1);
}

/* or */
.box {
  animation: slide 1s cubic-bezier(0.22, 1, 0.36, 1) both;
}
03

Spring explorer

Stiffness, damping and mass, simulated in your browser. Fling the ball to feel it.

settles in 0.34s·ζ 0.8
settled0.5s
drag me
presets
450
34
1
import { motion } from "motion/react"

const spring = {
  type: "spring",
  stiffness: 450,
  damping: 34,
  mass: 1,
} as const

// settles in about 0.34s
<motion.div animate={{ x: 240 }} transition={spring} />
04

Stagger

Ripple a grid from the center, the edges, a corner or a seeded random order.

from
effect
7 × 7
0.06s
import { motion } from "motion/react"

const cols = 7
const rows = 7
const steps = (x: number, y: number) => Math.hypot(x - (cols - 1) / 2, y - (rows - 1) / 2)

export function Grid() {
  return (
    <div className="grid gap-2" style={{ gridTemplateColumns: `repeat(${cols}, 1fr)` }}>
      {Array.from({ length: cols * rows }, (_, i) => (
        <motion.div
          key={i}
          className="aspect-square rounded-md bg-[#ff4d12]"
          initial={{ opacity: 0, scale: 0 }}
          animate={{ opacity: 1, scale: 1 }}
          transition={{
            duration: 0.5,
            delay: steps(i % cols, Math.floor(i / cols)) * 0.06,
            ease: [0.22, 1, 0.36, 1],
          }}
        />
      ))}
    </div>
  )
}
05

Touch everything

Real tweenly components, live. Type, toggle, hold and slide.

Browse all components

Revenue

$0▲ 87.1%

Jan – Aug 2025

Chart Line

Check your inbox

Try 123456, anything else shakes.

OTP Input
3
Controls

Revenue

Last 14 days

$0
16.3%vs $60,879 prior
Jun 01Jun 14
88% of goal$80,000
Chart KPI

Traffic

By browser

30%22%20%19%10%0Total
Chart Radial
0/50Seats filled
Chart Dots
Slide to confirm
Buttons