crucıble

Imprint

Letterpress image trail: pointer travel stamps a pile of proofs that land with a settle, a seeded tilt, a registration double and an ink-spread shadow, then fade and desaturate like aging paper. Clicks stack larger proofs, a seeded ghost path keeps printing when idle, and an imperative stamp(x, y) handle; reduced motion rests on a static corner pile.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/imprint

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
childrenReact.ReactNodeContent inside the scope. Stays fully interactive; the trail prints behind it.
classNamestring
itemsImprintItem[]a seeded set of soft slate/graphite gradient tiles with short catalog labelsWhat gets stamped, cycled in order.
spacingnumber90Pointer travel (px) between stamps.
sizenumber140Stamp width in px (height is 5:4 of it). Click proofs are 1.45x.
maxnumber12Most stamps on the pile at once; the oldest lift off beyond it.
lifenumber1600How long (ms) a stamp rests before it fades and desaturates away.
rotatenumber6Max seeded tilt either way, in degrees.
idlebooleantrueGhost autoplay along a seeded Lissajous path after 1.5s without a pointer.
seednumber7Seed for the ghost path, tilts, registration offsets and default tiles.
pausedbooleanfalseStop stamping (pointer and ghost). Existing stamps finish aging out.
refReact.Ref<ImprintHandle>React 19 ref prop — imperative stamp(x, y).

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