crucıble

Murmur

Streaming assistant message — each arriving word fades up into place behind a breathing caret, with paragraphs, bullet lists and inline code chips, plus a shimmering "Thinking" disclosure that springs closed to "Thought for Ns". Announces completed paragraphs politely; ships a seeded useScriptedStream hook for prototyping.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/murmur

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
textstringThe message text received so far. Blank lines split paragraphs, lines starting with - become bullets, and backticks become inline code chips.
streamingbooleanfalseTrue while more text is still arriving. Shows the breathing caret and animates newly arrived words.
reasoningstringOptional reasoning text, shown in a collapsible "Thinking" section above the answer.
thinkingbooleanfalseTrue while the assistant is still thinking. Keeps the section open, shimmers the label and counts seconds. When it turns false the section collapses to "Thought for Ns".
thinkingStartedAtnumberthe moment thinking became trueWhen thinking started, in epoch ms. Drives the elapsed counter.
thinkingDurationnumberHow long the thinking took, in seconds. Overrides the measured duration in the "Thought for Ns" label, useful when rendering a finished message.
accentColorstring"#a78bfa" (ion violet)Accent for the caret, the thinking shimmer and focus rings.
trailingWordsnumber40How many trailing words get an animated span. Older words render as plain text.
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.