crucıble

Frieze

A calm, always-on brand marquee / logo cloud. Loops horizontally or vertically, reversible, with gradient edge-fade masks, a hairline baseline, an optional 3D-perspective tilt, and per-mark lift-on-hover. Pure CSS at constant velocity, pause-on-hover.

cssfree

Installation

CLI

npx shadcn@latest add @crucible/frieze

Props

PropTypeDefaultDescription
childrenReact.ReactNodeThe marks to display — logos, wordmarks, SVG glyphs, anything. Each direct child becomes one lift-on-hover item. The set is duplicated internally for a seamless loop; only the first copy is exposed to assistive tech.
orientation"horizontal" | "vertical""horizontal"Loop axis.
reversebooleanfalseReverse the travel direction (right / down instead of left / up).
speednumber40Travel speed in pixels per second — held constant regardless of content length or viewport size (duration is derived from the measured track).
gapnumber48Space between marks, in pixels.
pauseOnHoverbooleantrueHalt the strip while it (or one of its marks) is hovered/focused.
fadenumber64Width of the gradient edge-fade masks, in pixels, so marks dissolve at the boundary.
repeatnumber2Copies of the children set laid end to end within one looping half. Bump it when the mark set is too short to fill the viewport.
perspectivebooleanfalseAngle the strip in 3D space for a receding logo-wall look.
tiltnumber18Tilt angle in degrees when perspective is on.
restOpacitynumber0.55Resting opacity of each mark before it lifts to full on hover.
baselinebooleantrueDraw the hairline architectural baseline that grounds the strip.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"div">, "children">they pass through to the underlying element.

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