crucıble

Annals

Changelog section block: release entries on a scroll-linked spine with sticky version and date, change items grouped into colored New / Improved / Fixed / Deprecated chips, procedural screenshot plates and a collapsible "Show N more changes". Multi-select kind filters collapse non-matching items with height animation, search highlights matches with <mark>, the newest release wears a single-pulse Latest badge, and a Subscribe button morphs into an inline email field with async pending/success/error states.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/annals

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
entriesAnnalsEntry[]a seeded sample changelogReleases, newest first. The first entry carries the "Latest" badge.
titleReact.ReactNode"What's new"Section headline (<h2>).
eyebrowReact.ReactNode"Changelog"Small label above the headline.
descriptionReact.ReactNodeSupporting copy under the headline.
onSubscribe(email: string) => void | Promise<unknown>Called with the email from the inline subscribe field. Return a Promise to hold the pending state — resolve shows "Subscribed", reject shows the rejection message (or a generic one) inline.
rssHrefstring | false"/changelog/rss.xml"Href of the RSS ghost link; false hides it.
collapseAfternumber4Items shown per release before "Show N more changes" (ignored while searching).
showMediabooleantrueRender media plates (real or procedural).
searchablebooleantrueShow the search field in the toolbar.
scrollerReact.RefObject<HTMLElement | null>Scroll container that drives the spine's progress beam. Auto-detects the nearest scrollable ancestor (or the window) when omitted; pass a ref to pin it explicitly.
stickyBackgroundstring"rgb(10 10 10 / 0.86)"Backdrop painted behind the sticky toolbar so entries scroll beneath it cleanly. Match your surface.
accentColorstring"#bef264"Accent hex: "New" chips, the spine beam, Latest badge, subscribe button, marks and focus rings.
refReact.Ref<AnnalsHandle>Imperative handle (replay(), clearFilters(), focusSearch()). React 19 ref-as-prop.
classNamestringExtra classes for the <section> root.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"section">, "children" | "title"> — they pass through to the underlying element.

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