Reference · Easing and springs
Documentation

Easing and springs

Every curve and spring preset in EaseKit with its exact values, and how duration, bounce and physics relate.

Every keyframe has a curve that shapes the segment leading into it. EaseKit has two families: tweens (cubic Bézier curves with a fixed duration) and springs (physical motion described by a duration and a bounce). This page lists every preset with its values, so you can match them in code.

Named curves

CurveLabel in the appValueUse for
easeOutEase-out (strong)cubic-bezier(0.23, 1, 0.32, 1)Entrances and exits; the default
easeInOutEase-in-out (strong)cubic-bezier(0.77, 0, 0.175, 1)Movement on screen
easeInEase-incubic-bezier(0.55, 0.055, 0.675, 0.19)Leaving with intent; rarely right for UI
easeEasecubic-bezier(0.25, 0.1, 0.25, 1)Hover and color changes (CSS ease)
drawerDrawercubic-bezier(0.32, 0.72, 0, 1)iOS-like sheets and drawers
linearLinearcubic-bezier(0, 0, 1, 1)Loops, rotation, dash flow
holdHoldNo interpolationJumps to the value at the keyframe
cubicBeziercubic-bezier(…)Any four valuesYour own curve

Springs

A spring is described by a perceptual duration in seconds and a bounce: 0 is critically damped (no overshoot), up to about 0.5 is playful. Springs land exactly on the keyframe; their curve is stretched when you stretch a clip. The AI's range: bounce up to 0.3 for UI, up to 0.5 for teasers and social clips.

WherePresetDurationBounce
Curve editorSmooth0.45 s0
Curve editorSnappy0.35 s0.1
Curve editorLively0.4 s0.2
Curve editorPlayful0.5 s0.35
Keyframe menuSpring0.5 s0
Keyframe menuSpring with Bounce0.55 s0.25
Layers tabSpring smooth0.45 s0
Layers tabSpring lively0.4 s0.15
Layers tabSpring playful0.5 s0.3
State transitionsSpring · calm0.35 s0.1
State transitionsSpring · snappy0.25 s0.15
State transitionsSpring · playful0.4 s0.3
Names the AI understandsspring / bouncy0.5 s0.15 / 0.3
Names the AI understandssnappy / smooth0.35 s / 0.5 s0.1 / 0

The curve editor

ModeControlsRangeDefault
TweenTwo draggable control points; presets Ease-out, In-out, Drawer, Ease, Linear, Ease-in; copy button for the cubic-bezier(…) value
Spring · TimeDuration0.1–1.5 s0.5 s
Spring · TimeBounce0–0.80
Spring · PhysicsStiffness10–1,000100
Spring · PhysicsDamping1–10010
Spring · PhysicsMass0.1–51

Switching from Tween to Spring starts at 0.45 s with bounce 0.1. Physics values convert to duration and bounce, so both views describe the same spring. Under the controls, a line reads for example “Overshoot 12% · settles after 0.62 s”.

State transitions

The default transition into a state is a spring of 0.3 s with bounce 0.1 (lasting 0.25 s). The menu also has Spring · calm, Spring · snappy, Spring · playful, Ease out · 150 ms, Ease out · 250 ms, Ease in-out · 300 ms and Instant. A trigger can carry its own transition, which wins over the state's (set by the AI or over MCP). A released drag springs back with 0.35 s and bounce 0.25 unless its trigger has a transition.

Variant transitions

Variant switches use the first transition that's set: the switch's or trigger's own, the instance's Transition, the variant set's Transition: …, then the default Short spring (0.3 s, bounce 0.1).

PresetCurve
Short springSpring 0.3 s, bounce 0.1 (the default)
Quick easeEase out, 0.15 s
Smooth springSpring 0.45 s, bounce 0
Bouncy springSpring 0.5 s, bounce 0.3
InstantNo tween

Colors in a variant switch blend with a critically damped version of a spring, so a color never overshoots.

Style presets

StyleEnterExitMoveSpring
Calm InterfaceEase-out (strong)Ease-out (strong)Ease-in-out (strong)0.4 s · 0.1
Fluid (Apple-like)Spring 0.45 s · 0.12Ease-out (strong)Spring 0.5 s · 00.45 s · 0.15
Punchy SocialSpring 0.5 s · 0.3Ease-inEase-in-out (strong)0.5 s · 0.3

In exports

ExportBéziersSprings
Motion (React)ExactAn exact JS port of EaseKit's spring curve
LottieExactBaked into dense keyframes
HTML, Web AnimationsSampledSampled (60 fps for Web Animations)
CSSExact per segmentlinear() approximations
SwiftUIkeyframeAnimator curvesSpring keyframes
// The default curve in CSS and Motion
transition-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
<motion.div transition={{ ease: [0.23, 1, 0.32, 1] }} />