crucıble

Hallmarks

A trusted-by logo cloud section in three variants: a marquee belt composed from Frieze, a grid whose logos ignite from ghost to full contrast in a seeded stamp-landing scatter on scroll-in, and a relay row where one slot at a time plate-flips to a logo not currently shown. Marks sit grayscale and dimmed at rest, lift to full contrast on hover, and are height-normalized; eyebrow/heading framing included. Renders as a static full-contrast grid under reduced motion.

motionpro

Installation

CLI

npx shadcn@latest add @crucible/hallmarks

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
logosHallmarkLogo[]eight brand-free placeholder wordmarksMarks on the wall.
variant"grid" | "marquee" | "relay""grid"Display mode. grid ignites marks from ghost to full contrast in a seeded scatter on scroll-in; marquee composes the Frieze belt inside the section frame; relay shows a fixed row where one slot at a time plate-flips to a different logo.
eyebrowReact.ReactNode"Trusted by"Small uppercase kicker above the heading. Pass null/empty to omit.
headingReact.ReactNodeOptional heading rendered as an h2 beneath the eyebrow. Omitted by default.
friezeOmit<FriezeProps, "children">Passthrough props for the composed Frieze belt (marquee variant only).
pattern"scatter" | "sweep""scatter"Grid ignition order: seeded scatter or a plain left-to-right sweep.
staggernumber0.06Seconds between consecutive grid ignitions.
thresholdnumber0.35IntersectionObserver threshold that triggers the grid ignition.
intervalnumber2400Milliseconds between relay plate-flips (clamped to ≥ 600).
slotsnumber5Visible slots in the relay row (clamped to the logo count).
restOpacitynumber0.55Resting opacity of each mark before hover lifts it to full.
grayscalenumber1Grayscale amount applied to marks at rest, 0–1.
gapnumber48Gap between marks, in pixels (also forwarded to Frieze in marquee mode).
logoHeightnumber28Normalized mark height in pixels — SVGs and images scale to this.
seednumber7Seed for the scatter ignition order and the relay slot rotation.
colorsstring[]["rgba(255,255,255,0.5)"]Accent palette; colors[0] tints the eyebrow kicker.
pausedbooleanfalseFreeze all choreography: settled grid, halted belt, suspended relay.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"section">, "children">they pass through to the underlying element.

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