Logo Cloud

A responsive, continuously scrolling logo marquee with linked cards and optional cursor-centered image reveals. Includes reduced-motion handling and per-card styling.

Installation

  1. 1

    Install the component:

    npx shadcn@latest add https://ui.amines.fun/r/logo-cloud.json
  2. 2

    Usage:

    jsx

    app/page.jsx

    import LogoCloud from "@/registry/blocks/LogoCloud";const items = [  {    id: "northstar",    name: "Northstar",    href: "/stories/northstar",    logo: {      src: "/logos/northstar.svg",      alt: "Northstar",      width: 150,      height: 40,    },    image: {      src: "/stories/northstar.jpg",      alt: "Northstar customer story",    },  },  // Add more logo items using the same shape.];export default function Page() {  return (    <LogoCloud      items={items}      speed={36}      direction="left"      pauseOnHover      ariaLabel="Customer stories"    />  );}

Props

PropTypeDefaultDescription
itemsArray<LogoCloudItem>[]Logo cards to render. Each item may include id, name, href (defaults to #), external, ariaLabel, logo ({ src, alt, width, height, unoptimized }), logoNode (ReactNode), image ({ src, alt, position, unoptimized, blurDataURL }), label, arrow, borderColor, hoverBorderColor, borderWidth, background, and color.
speednumber40Auto-scroll speed in pixels per second. Set to 0 to disable auto-scrolling and leave the row swipeable.
direction"left" | "right""left"Direction in which the logo track scrolls.
pauseOnHoverbooleanfalsePause the marquee while a pointer is over the section. Keyboard focus also pauses the marquee.
respectReducedMotionbooleantrueDisable auto-scrolling when the user requests reduced motion.
reveal{ duration?: number; closeDuration?: number; ease?: Easing }{ duration: 0.65, closeDuration: 0.45, ease: [0.22, 1, 0.36, 1] }Timing and easing for the cursor-centered image reveal and collapse.
imageZoomnumber1.08Starting scale of a revealed image. It animates to 1; set to 1 to disable the zoom.
arrowShiftnumber3Horizontal arrow nudge in pixels on card hover. Set to 0 to disable it.
cardWidthnumber | string360Width of each logo card. A number is treated as pixels; a CSS width string is also accepted.
cardMaxWidthnumber | string"85vw"Maximum width of each card, useful for keeping cards within narrow viewports.
cardHeightnumber | string460Height of each logo card. A number is treated as pixels; a CSS height string is also accepted.
gapnumber | string12Horizontal space between cards. A number is treated as pixels; a CSS margin string is also accepted.
radiusnumber | string24Card corner radius. A number is treated as pixels; a CSS radius string is also accepted.
borderColorstring"#3a3a3a"Default card border color. An item can override this value.
hoverBorderColorstring | false"#6b6b6b"Card border color while hovered or focused. Set to false or the default border color to disable the color change.
borderWidthnumber | string1Card border width. An item can override this value.
backgroundstring"#000"Default card background color or CSS background value. An item can override this value.
colorstring"#fff"Default card foreground color. An item can override this value.
overlaystring | falseDefault dark gradientCSS background value layered over revealed images. Set to false to remove the overlay.
fadebooleantrueFade the marquee track at its left and right edges.
fadeSizenumber8Width of each edge fade as a percentage of the marquee.
labelReactNode | false"Read story"Default label shown near the bottom of each card. An item can override it; set to false to hide labels.
arrowReactNode | falseDefault right-arrow SVGDefault arrow rendered beside each label. An item can override it; set to false to hide arrows.
imageSizesstringDerived from cardWidth (360px fallback)Sizes hint passed to next/image for revealed card images.
imageQualitynumber75Quality passed to next/image for revealed card images.
unoptimizedbooleanfalseSkip Next.js image optimization for all card logos and reveal images. Per-image options can override this value.
ariaLabelstring"Customer stories"Accessible label for the logo cloud section.
classNamestringundefinedAdditional class name applied to the root section.
styleReact.CSSPropertiesundefinedInline styles applied to the root section.
classNamesPartial<Record<"root" | "track" | "item" | "card" | "reveal" | "image" | "overlay" | "logo" | "label", string>>{}Optional class names for the root, track, item, card, reveal, image, overlay, logo, and label elements.