crucıble

Tailstock

Big site footer: link columns that collapse to 2-up then <details> accordions via container queries, a labelled async newsletter form, social row, live status pill and legal row — signed by an oversized wordmark that rises through a clip-path curtain with a letter stagger and one sheen sweep. Compact variant drops the wordmark.

motionpro

Installation

CLI

npx shadcn@latest add @crucible/tailstock

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
wordmarkstring"Studio"Oversized wordmark text that rises through a curtain reveal at the foot of the footer. Ignored when compact.
taglineReact.ReactNodeShort line under the small brand name at the top-left.
columnsTailstockColumn[]Link columns. Omit for a sample Product / Resources / Company set.
onSubscribe(email: string) => void | Promise<unknown>Called with the submitted email. Return a Promise to hold the button in its pending state — resolve shows the success state, reject shows the rejection's message (or a generic one) inline. The newsletter form is always rendered; without a handler it succeeds immediately.
newsletterTitleReact.ReactNode"Stay in the loop"Heading above the newsletter field.
statusTailstockStatus | false{ label: "All systems normal", tone: "operational" }Status pill config, or false to hide it.
socialsTailstockSocial[]Social icon links. Omit for a generic sample row; pass [] to hide.
legalTailstockLink[]Privacy / Terms / CookiesLegal-row links.
copyrightReact.ReactNode"© 2026 {wordmark}. All rights reserved."Copyright line in the legal row.
compactbooleanfalseDrop the oversized wordmark for a tighter, utility footer.
accentColorstring"#c4b5fd"Accent hex for the subscribe button, focus rings, hovers and the wordmark sheen.
refReact.Ref<TailstockHandle>Imperative handle (replay(), focusNewsletter()). React 19 ref-as-prop.
classNamestringExtra classes for the <footer> root.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"footer">, "children"> — they pass through to the underlying element.

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