crucıble

Lintel

Brand-agnostic landing hero in three layouts behind one shared header (logo, nav, sign-in + CTA, focus-trapped menu sheet under 640px): frame — a product window tilted back in perspective that flattens as the hero scrolls over a pooling accent glow; split — copy beside a CSS phone whose screen push-cycles three app screens; centered — a word-by-word blur-reveal headline, announcement pill and trust row over a drifting dot grid. Staggered intro, idle loops that pause on hover, focus and offscreen.

motionpro

Installation

CLI

npx shadcn@latest add @crucible/lintel

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
layoutLintelLayout"frame"Composition: frame (copy over a product window that flattens on scroll), split (copy left, cycling phone right) or centered (big blur-reveal headline over a drifting dot grid with a trust row).
eyebrowLintelEyebrow | string | false{ tag: "New", label: "Scheduled workflows are here", href: "#" }Announcement pill above the headline. A string renders a plain pill; false hides it.
titlestring"The calm control room for fast-moving teams"Headline.
subtitleReact.ReactNodeSupporting paragraph under the headline.
primaryCtaLintelAction | false{ label: "Start free trial", href: "#" }Solid accent call to action. false hides it.
secondaryCtaLintelAction | false{ label: "Book a demo", href: "#" }Quiet secondary call to action. false hides it.
navLintelNavLink[]Product / Solutions / Pricing / DocsHeader links (best with 4). Pass [] to hide.
logoReact.ReactNodea neutral glyph + "Outpost" wordmarkHeader logo slot.
logoHrefstring"#"Where the logo links.
signInLintelAction | false{ label: "Sign in", href: "#" }Ghost sign-in action in the header. false hides it.
headerCtaLintelAction | falseprimaryCta's target with the label "Get started"; false hides itSolid header CTA.
frameReact.ReactNodeCustom visual. In frame it becomes the product window's interior (wrap regions in ChassisPanel for the boot treatment); in split it replaces the phone's cycling screens; in centered it renders under the trust row.
truststring[]Company names for the trust row (centered). Each gets a neutral logo mark. [] hides the row.
trustLabelstring"Trusted by teams at"Caption above the trust row.
accentColorstring"#7dd3fc"Signature accent: CTA fill, focus rings, glow, bloom. Ink on accent fills auto-picks black/white.
scrollerReact.RefObject<HTMLElement | null>Scroll container that drives the frame tilt. Omit to follow the window. The container needs a non-static position.
tiltnumber18Start angle of the frame tilt, in degrees.
cycleSecondsnumber3.5Seconds each phone screen holds in split before pushing to the next.
pausedbooleanfalseFreeze ambient loops (phone cycling, grid drift, glow breathing, window idle life).
seednumber11Seed for the sample data in the phone screens.
refReact.Ref<LintelHandle>Imperative handle (replay()). React 19 ref-as-prop.
classNamestringExtra classes for the <section> root.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"section">, "title" | "children"> — they pass through to the underlying element.

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