Team + Logo Wall
A team member grid that staggers in, paired with an infinitely scrolling customer logo marquee — a good fit for the trust block on an about page or a home page.
This is a WebberUI Pro component
Free during the launch campaign: sign up or sign in, then hit “Copy install command” in the preview above and it installs straight away — no payment, no credit card. The command below returns 401 while you are signed out.
npx shadcn@latest add "https://webberui.com/r/team-logo-wall.json?t=<install token>"Playground
Tune the props live — the code snippet updates as you go, so you can dial in the look you want before copying it.
<TeamLogoWall />
Installation
npx shadcn@latest add "https://webberui.com/r/team-logo-wall.json?t=<install token>"Or, once registries are configured in components.json, install it as @webberui/team-logo-wall.
Usage
import {
TeamLogoWall,
type TeamMemberData,
type LogoData,
} from "@/components/ui/team-logo-wall";
const members: TeamMemberData[] = [
{ name: "Ada Lovelace", role: "Founder / CEO", avatar: "/team/ada.jpg" },
{ name: "Alan Turing", role: "Chief Technology Officer" },
];
const logos: LogoData[] = [
{ name: "Vercel", src: "/logos/vercel.svg", href: "https://vercel.com" },
{ name: "Linear", src: "/logos/linear.svg" },
];
<TeamLogoWall
members={members}
logos={logos}
eyebrow="Our team"
title="Building animation-first interfaces"
logosLabel="Brands that trust us"
/>;TeamGrid and LogoMarquee can also be imported on their own if you only want one half:
import { TeamGrid, LogoMarquee } from "@/components/ui/team-logo-wall";
<TeamGrid members={members} columns={3} />
<LogoMarquee logos={logos} speed={30} direction="right" />Props
TeamLogoWall
| Prop | Type | Default | Description |
|---|---|---|---|
members | TeamMemberData[] | — | The array of team member data |
logos | LogoData[] | — | The array of customer/partner brand logo data |
eyebrow | React.ReactNode | — | The kicker above the title |
title | React.ReactNode | — | The section's main heading |
description | React.ReactNode | — | Descriptive text below the main heading |
logosLabel | React.ReactNode | — | Caption above the logo marquee |
columns | number | 4 | Column count for the team grid (2–6, degrading automatically at low breakpoints) |
marqueeSpeed | number | 40 | The logo marquee's offset per second (px) |
marqueeDirection | "left" | "right" | "left" | Direction the marquee travels |
pauseOnHover | boolean | true | Pause the marquee on mouse hover or keyboard focus |
label | string | "團隊與合作品牌" (Team and partner brands) | Accessible label for the whole region |
TeamGrid
| Prop | Type | Default | Description |
|---|---|---|---|
members | TeamMemberData[] | — | The array of team member data |
columns | number | 4 | Column count (2–6, degrading automatically at low breakpoints) |
stagger | number | 0.08 | Reveal interval between cards (seconds) |
delay | number | 0 | Delay before the reveal starts (seconds) |
once | boolean | true | Play only the first time the element enters the viewport |
label | string | "團隊成員" (Team members) | Accessible label for the whole region |
LogoMarquee
| Prop | Type | Default | Description |
|---|---|---|---|
logos | LogoData[] | — | The array of customer logo data |
speed | number | 40 | Offset per second (px) |
direction | "left" | "right" | "left" | Direction of travel |
gap | number | 48 | Spacing between logos (px) |
pauseOnHover | boolean | true | Pause on mouse hover or keyboard focus |
label | string | "合作品牌" (Partner brands) | Accessible label for the whole region |
TeamMemberData
| Field | Type | Description |
|---|---|---|
name | string | Member name |
role | string | Job title or role (optional) |
avatar | string | Avatar image URL; when not provided, the first character of the name is shown |
href | string | Link the card goes to when clicked (optional) |
LogoData
| Field | Type | Description |
|---|---|---|
name | string | Brand name, also used as the alt / accessible text |
src | string | Logo image URL |
node | React.ReactNode | A custom logo node (an inline SVG, for example), which takes precedence over src |
href | string | Link to go to when clicked (optional) |
How it works
- Two stacked parts: the top half is the team grid, whose cards fade in and float up one after another by
staggerwhen they enter the viewport; the bottom half is the logo marquee, scrolling smoothly and infinitely withrequestAnimationFrame. - Seamless loop: the marquee renders two identical copies of the content, measures the width of one copy, and cycles the offset within
(-distance, 0], so the switch point is imperceptible; aResizeObserverre-measures whenever the container size changes. - Fading at both ends: the marquee uses
mask-imageso logos dissolve naturally at the left and right boundaries. - Greyscale logos: by default they are presented in greyscale at reduced opacity, returning to full color and full opacity when the cursor hovers that logo.
- Standalone use:
TeamGrid,LogoMarquee, andTeamMemberCardcan all be imported on their own. - Tuning points: the animation durations are based on
var(--wb-duration-fast,200ms)andvar(--wb-ease-out,cubic-bezier(0.22,1,0.36,1)), so you can override them uniformly through CSS variables.
Accessibility
- When the user has "reduce motion" enabled at the system level, the team grid is presented statically (with no stagger) and the logo wall switches to a centered wrapping layout that no longer scrolls.
- The team grid is a
role="list"and the member cards arerole="listitem", with anaria-labelon the region. - The marquee's second copy is marked
aria-hidden, which keeps assistive technology from announcing it twice. - Members and logos with an
hrefare focusable links with a clearfocus-visibleoutline; focusing a link inside the marquee pauses the scrolling (withpauseOnHover), which makes keyboard operation easier. - Avatar
altis left empty (decorative) and the name is presented separately as text; a logo image'saltcomes from the brand'sname.
Pricing Section
A complete pricing section — header, monthly/yearly switch, spring-tweened prices, and a featured plan — with a built-in expandable FAQ accordion, all revealing with a stagger in one pass.
Testimonial Section
A complete social-proof section with a built-in heading, star ratings, avatars, and three layouts — grid, infinite marquee, and single-quote spotlight carousel.