Easing curve editor

Interactive cubic bezier editor with draggable control points and preset buttons.

Install

npx shadcn@latest add https://substrate.georgedrury.co.uk/r/easing-curve-editor

This also installs the easing utility library.

Examples

Default

cubic-bezier(0.42, 0, 0.58, 1)
"use client"

import { useState } from "react"

Canvas only

"use client"

import { useState } from "react"

Theme variables

VariableTailwind classFallbackDescription
--easing-curvebg-easing-curveText colourBezier curve stroke
--easing-handlebg-easing-handleText colourControl point fill

Components

ComponentDescription
EasingCurveEditorCombines canvas and presets in a vertical stack
EasingCurveCanvasCanvas-rendered bezier curve with draggable control points via pointer capture
EasingPresetsRow of buttons for common easing presets (linear, ease-in, ease-out, etc.)

Props

EasingCurveEditor

PropTypeDefaultDescription
valueCubicBezier—Current bezier value
onChange(bezier: CubicBezier) => void—Called when value changes

EasingCurveCanvas

PropTypeDefaultDescription
valueCubicBezier—Current bezier value
onChange(bezier: CubicBezier) => void—Called when value changes
widthnumber200Canvas width in pixels
heightnumber160Canvas height in pixels

EasingPresets

PropTypeDefaultDescription
valueCubicBezier—Current bezier for highlight
onChange(bezier: CubicBezier) => void—Called when preset is clicked

Easing utility

The easing library provides types and helpers:

import {
	CubicBezier,
	EASING_PRESETS,
	evaluateCubicBezier,
	cubicBezierToString,
	parseCubicBezier,
} from "@/lib/substrate/easing"
ExportDescription
CubicBezierType: { x1, y1, x2, y2 }
EASING_PRESETS7 named presets (linear, ease-in, ease-out, ease-in-out, ease-in-cubic, ease-out-cubic, ease-in-out-cubic)
evaluateCubicBezierEvaluate curve at time t using Newton's method (8 iterations)
cubicBezierToStringConvert to CSS cubic-bezier(x1, y1, x2, y2) string
parseCubicBezierParse a CSS cubic-bezier string back to object
isCubicBezierEqualCompare two bezier values for equality