crucıble

Tumbler

3D drum picker — rows ride a perspective cylinder, flick to spin with momentum that lands on a detent, the centred row lit between accent rule lines. Drag, touch, wheel notches, tap-a-row and full keyboard (arrows, PageUp/Down, Home/End, type-ahead). Listbox or spinbutton semantics; TumblerGroup shares one band across drums for time and date pickers. Flat list under reduced motion.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/tumbler

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
labelstringAccessible name for the whole picker, e.g. "Time".
visibleRowsnumber5Rows visible on every drum.
rowHeightnumber40Row height in px for every drum.
accentColorstring"#a5b4fc"Accent for the shared band's rule lines and focus rings.
childrenReact.ReactNodeDrums and any separators (e.g. a ":" span).
Also accepts all props of React.HTMLAttributes<HTMLDivElement> — they pass through to the underlying element.

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