Campfire
Registry

Logo Cloud

A centered, muted row of logos.

<LogoCloud heading="Trusted by teams at">
  <img src="/logos/acme.svg" alt="Acme" />
  <img src="/logos/globex.svg" alt="Globex" />
  <img src="/logos/initech.svg" alt="Initech" />
</LogoCloud>

Installation

camp add logo-cloud

Or with any shadcn-compatible CLI:

bunx shadcn@latest add https://campfire-deck.vercel.app/r/logo-cloud.json

Copy the source into components/logo-cloud.tsx. It imports cn from @/lib/utils — scaffolded by camp init, or camp add utils:

components/logo-cloud.tsx
import type { ComponentProps } from "react";
import { cn } from "@/lib/utils";

export type LogoCloudProps = ComponentProps<"section"> & {
  /** Optional uppercase eyebrow above the logos. */
  heading?: string;
};

/** A centered, muted row of logos. */
export default function LogoCloud({
  heading,
  className,
  children,
  ...props
}: LogoCloudProps) {
  return (
    <section
      className={cn("flex flex-col gap-6", className)}
      data-slot="logo-cloud"
      {...props}
    >
      {heading ? (
        <span
          className="text-center text-sm uppercase tracking-[0.2em] opacity-50"
          data-slot="logo-cloud-heading"
        >
          {heading}
        </span>
      ) : null}
      <div
        className="flex flex-wrap items-center justify-center gap-x-14 gap-y-8 opacity-70 grayscale"
        data-slot="logo-cloud-logos"
      >
        {children}
      </div>
    </section>
  );
}

Usage

Children are rendered in a wrapped, grayscale row — images, wordmarks, or any inline content work:

slides/03-customers.mdx
---
title: Customers
---

<LogoCloud heading="Trusted by teams at">
  <img src="/logos/acme.svg" alt="Acme" />
  <img src="/logos/globex.svg" alt="Globex" />
</LogoCloud>

API Reference

Extends ComponentProps<"section"> — native props are forwarded and className is merged last. Parts expose data-slot="logo-cloud", logo-cloud-heading, and logo-cloud-logos.

Prop

Type

On this page