Crucible

Escapement

Ratcheting numeric stepper — digits roll with an overshoot-click spring settle, a brass pawl flicks on every step, and hold-to-repeat accelerates like a wound mechanism. Proper spinbutton semantics with arrow keys, Home/End, and live value announcement.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/escapement

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
valuenumberControlled value.
defaultValuenumber0 (clamped into range)Initial value when uncontrolled.
onChange(value: number) => voidFires with the next value on every step, controlled or not.
minnumber0Lower bound.
maxnumber100Upper bound.
stepnumber1Amount per step.
accentColorstring"#d4a95c" (brass)Accent for the pawl and focus ring.
labelstring"Value"Accessible name for the spinbutton.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"div">, "onChange" | "defaultValue">they pass through to the underlying element.

Honors prefers-reduced-motion with a designed static fallback, and passes className through.