crucıble

Wire

A self-looping activity feed for marketing heroes: entries land with one confident spring and a hairline flash that cools in 400ms, siblings shuffle down, and the oldest retires under an edge fade — all on seeded, jittered news-wire cadence. Decorative counterpart to dispatch; hover pauses the feed.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/wire

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
itemsWireItem[]a built-in set of generic product eventsEvents the feed cycles through. The loop order is a seeded shuffle of this array (deterministic per seed), so the cadence never reads scripted.
intervalnumber2.4Mean seconds between inserts while looping.
jitternumber0.35Jitter applied to each gap as a fraction of interval (0 = metronomic, 0.5 = gaps range ±50%). Seeded — the same rhythm every load.
direction"top" | "bottom""top"Where new entries land: "top" (news wire) or "bottom" (chat).
maxVisiblenumber4How many entries stay in the feed before the oldest retires.
fadeDepthnumber48Depth in px of the fade mask under which the oldest entry retires.
spring{ stiffness?: number; damping?: number }{ stiffness: 500, damping: 42 }Spring for entry and the siblings' shuffle — one confident settle, no bounce chain.
loopbooleantrueSelf-loop through items. Disable to drive the feed only via ref.push().
hoverPausebooleantruePause the loop while the pointer is over the feed.
colorsstring[]["#fbbf24"]Accent cycle for icon chips (per-item accent wins). Accents stay confined to the chip — cards remain neutral.
seednumber7Seed for the shuffle order and interval jitter.
pausedbooleanfalseFreeze the loop entirely.
refReact.Ref<WireHandle>Imperative handle exposing push(item) for live-push mode.
Also accepts all props of Omit<React.HTMLAttributes<HTMLDivElement>, "children">they pass through to the underlying element.

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