Logo Cloud
A centered row of client or partner logos with an optional title.
Trusted by teams at
AcmeInitechGlobexSoylentUmbrellaHooli
import { LogoCloud } from '@/foundations/blocks/logo-cloud';
const Placeholder = ({ children }: { children: string }) => (
<span className="font-semibold text-2xl">{children}</span>
);
export default function LogoCloudPreview() {
return (
<LogoCloud
title="Trusted by teams at"
logos={[
{ logo: <Placeholder>Acme</Placeholder>, name: 'Acme' },
{ logo: <Placeholder>Initech</Placeholder>, name: 'Initech' },
{ logo: <Placeholder>Globex</Placeholder>, name: 'Globex' },
{ logo: <Placeholder>Soylent</Placeholder>, name: 'Soylent' },
{ logo: <Placeholder>Umbrella</Placeholder>, name: 'Umbrella' },
{ logo: <Placeholder>Hooli</Placeholder>, name: 'Hooli' },
]}
/>
);
}
export const meta = {
layout: 'fullscreen',
}; Dependencies
Source Code
import { Container } from '@/components/container';
import { cn } from '@/lib/utils/classnames';
interface LogoCloudItem {
/** Logo node — usually an `<img>` or inline `<svg>`. */
logo: React.ReactNode;
/** Optional alt label, used as a Tooltip-style title. */
name?: string;
/** Optional href — wraps the logo in an `<a>`. */
href?: string;
}
interface LogoCloudProps
extends Omit<React.ComponentPropsWithRef<'section'>, 'title'> {
/** Small title above the row, usually one line. */
title?: React.ReactNode;
logos: LogoCloudItem[];
}
const LogoCloud = ({
ref,
className,
title,
logos,
...rest
}: LogoCloudProps) => (
<section
ref={ref}
className={cn('w-full py-16 md:py-20', className)}
{...rest}
>
<Container>
{title && (
<p className="text-center text-foreground-secondary text-lg">{title}</p>
)}
<div
className={cn(
'flex flex-wrap items-center justify-center gap-x-12 gap-y-8 p-6',
title && 'mt-8'
)}
>
{logos.map((item, i) => {
const Wrapper = item.href ? 'a' : 'span';
return (
<Wrapper
key={i}
href={item.href}
title={item.name}
className={cn(
'flex h-9 items-center text-foreground-secondary',
'transition-opacity duration-(--duration-hover) ease-out',
item.href && 'hover:opacity-70'
)}
>
{item.logo}
</Wrapper>
);
})}
</div>
</Container>
</section>
);
export type { LogoCloudItem, LogoCloudProps };
export { LogoCloud }; LogoCloud is the “trusted by” strip — a centered, flex-wrapping row of
logos with an optional title. Logos are passed as ReactNodes so you can
inline SVGs, use <img>, or compose multi-piece marks.
Anatomy
<LogoCloud
title="Trusted by teams at"
logos={[
{ logo: <img src="/acme.svg" alt="Acme" />, name: 'Acme', href: 'https://acme.example' },
{ logo: <img src="/initech.svg" alt="Initech" />, name: 'Initech' },
]}
/>
API Reference
Extends the section element.
| Prop | Default | Type |
|---|---|---|
title | - | ReactNode |
logos * | - | LogoCloudItem[] |
LogoCloudItem
interface LogoCloudItem {
logo: React.ReactNode;
name?: string;
href?: string;
}
Examples
Default
Trusted by teams at
AcmeInitechGlobexSoylentUmbrellaHooli
import { LogoCloud } from '@/foundations/blocks/logo-cloud';
const Placeholder = ({ children }: { children: string }) => (
<span className="font-semibold text-2xl">{children}</span>
);
export default function LogoCloudPreview() {
return (
<LogoCloud
title="Trusted by teams at"
logos={[
{ logo: <Placeholder>Acme</Placeholder>, name: 'Acme' },
{ logo: <Placeholder>Initech</Placeholder>, name: 'Initech' },
{ logo: <Placeholder>Globex</Placeholder>, name: 'Globex' },
{ logo: <Placeholder>Soylent</Placeholder>, name: 'Soylent' },
{ logo: <Placeholder>Umbrella</Placeholder>, name: 'Umbrella' },
{ logo: <Placeholder>Hooli</Placeholder>, name: 'Hooli' },
]}
/>
);
}
export const meta = {
layout: 'fullscreen',
}; Previous
Hero
Next
Stat Grid