crucıble

Fallow

Empty-state block with five presets (no results, first run, error, offline, inbox zero) and a custom mode. Each preset has an original 1.5px line illustration with one accent detail and a three-cycle idle loop, plus title, description, primary action, secondary link, suggestion chips and an async retry button that runs pending to success.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/fallow

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
kindFallowKind"no-results"Which preset to render. Each preset brings its own line illustration and default copy/actions; "custom" renders only what you pass.
titleReact.ReactNodethe preset's copyHeadline.
descriptionReact.ReactNodethe preset's copySupporting sentence under the headline.
actionFallowAction | nullthe preset's action; pass null to hide it. In retry mode (onRetry set) its label becomes the retry button's idle labelPrimary action (accent-filled button).
secondaryActionFallowAction | nullthe preset's link; pass null to hide itSecondary text link.
suggestionsstring[]three sample queries for no-results, none otherwise; pass [] to hideSuggestion chips shown under the copy ("Try 'deploy'").
onSuggestion(suggestion: string) => voidFires with the chip's text when a suggestion is chosen.
onRetry() => void | Promise<unknown>Retry mode (meant for error / offline). When set, the primary button calls this; return a Promise to show a pending spinner, then a success check on resolve, or an inline "still failing" note on reject.
sizeFallowSize"md"Overall scale: illustration size, type ramp and button height.
framedbooleanfalseWrap the block in a dashed-border panel instead of rendering bare.
illustrationReact.ReactNodeReplace the preset illustration (decorative; rendered aria-hidden).
titleAs"h2" | "h3" | "h4" | "p""h3"Heading element for the title.
pausedbooleanfalseStop the illustration's idle loop (it already stops by itself after 3 cycles).
accentColorstring"#a3c9a8" (sage)The single accent: illustration detail, primary fill, focus rings.
refReact.Ref<FallowHandle>Imperative handle (replay()). React 19 ref-as-prop.
classNamestringExtra classes for the root.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"div">, "title" | "children"> — they pass through to the underlying element.

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