crucıble

Terminus

A split-flap departure board — a grid of matte charcoal tiles whose hinged flaps churn through the character ring and cascade diagonally to the message, each flap landing with a gravity overbite and a shadow cast on the lower half. Only changed tiles animate; optional synthesized flap sound.

motionpro

Installation

CLI

npx shadcn@latest add @crucible/terminus

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
textstringA single message to display. Ignored when messages is provided.
messagesstring[]Messages to cycle through, one after another, like a departure board.
columnsnumberthe longest message line (clamped 6–22)Grid width in tiles.
rowsnumberthe tallest wrapped messageGrid height in tiles.
align"left" | "center""center"Horizontal alignment of text within the grid.
flipDurationnumber0.08Seconds each single flap takes — the master tempo scale.
cascadenumber0.028Seconds of diagonal stagger added per tile (top-left → bottom-right).
cycleIntervalnumber3600Milliseconds each message holds before cycling to the next.
loopbooleantrueRestart from the first message after the last.
charsetstringOrdered ring of characters the flaps churn through.
soundbooleanfalsePlay a synthesized mechanical flap click on each flip.
volumenumber0.3Flap-click volume, 0–1.
tileColorstring"#17171a"Matte tile color.
glyphColorstring"#f2ede3"Glyph color — warm off-white by default.
seamColorstring"#000000"Hairline center-seam color.
tileSizenumber46Tile edge length in px.
gapnumber4Gap between tiles in px.
radiusnumber6Tile corner radius in px.
pausedbooleanfalseFreeze cycling on the current message.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"div">, "children">they pass through to the underlying element.

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