Free · CSS · Tailwind · framer-motion

Design easings that feel right.

Drag two handles, watch the loop, copy the snippet. 12 preset easings plus full freedom for back / overshoot curves.

0.160
1.000
0.300
1.000

Preview · 1.5s loop

Presets

CSS

transition-timing-function: cubic-bezier(0.160, 1.000, 0.300, 1.000);

Tailwind v4 @theme

@theme {
  --ease-brand: cubic-bezier(0.160, 1.000, 0.300, 1.000);
}

framer-motion

{ ease: [0.160, 1.000, 0.300, 1.000] }
How it works

Four steps

  1. 1

    Start from a preset

    Twelve named easings cover every common case. Or drag from scratch.

  2. 2

    Drag the handles

    Each control point can leave the [0..1] Y range for back / overshoot-style curves.

  3. 3

    Watch the preview

    A 1.5-second loop shows exactly how the curve feels when it's applied to an animation.

  4. 4

    Copy the snippet

    Plain CSS, a Tailwind v4 ease token, or a framer-motion [x1, y1, x2, y2] array.

Questions

Frequently asked

What's the difference between ease-out and out-expo?+

Ease-out decelerates smoothly but gently; out-expo slams hard at the start then eases to a stop. For transitions entering the screen, out-expo feels modern and snappy; for state changes, a softer ease-out reads calmer.

Can I go outside the [0, 1] range?+

Yes. Y values between -1 and 2 are allowed — that's what unlocks back / overshoot easings where the element passes its target and snaps back. X stays in [0, 1] to keep the animation monotonic in time.

Framer-motion wants an array instead of a cubic-bezier string?+

Yes. framer-motion accepts `ease: [x1, y1, x2, y2]`. The snippet panel outputs exactly that — just paste it into your motion prop.

Does this work with CSS transitions and CSS animations?+

Both. transition-timing-function and animation-timing-function both accept the cubic-bezier() value.

More free tools

Keep building

— Shipping to the App Store?

Translating screenshots into every locale is what lokal was built for. Upload once, ship to every store.

Explore lokal