Team Grid
ComponentsTeam Grid
SectionsNew

Team Grid

Introduce the people behind the work. Portrait cards with useful roles, short introductions, and a full profile a visitor can open.

USE IT FORAgency about pagesCompany teamsConference speaker introductions
React + CSS

EXAMPLE STUDIO TEAM

THE PEOPLE BEHIND THE WORK

A few good people.

Mira Patel

Strategy & direction

Mira helps teams find the clearest version of their story. She brings audience research, thoughtful questions, and a practical plan to every new project. Before a design takes shape, she works with clients to understand the people it needs to serve. Her work connects a brand’s ambition to the decisions a visitor makes on a real website.

Daniel Park

Product & design

Daniel turns complex ideas into calm, useful experiences. His work moves between visual systems, product details, and the everyday paths people take through a website. He cares about clear hierarchy, strong typography, and giving the content room to do its job. He works closely with engineers so that the finished product feels as considered as the first design.

Sofia Reed

Creative engineering

Sofia brings ideas to life through accessible, resilient interfaces. She builds the details that make a site feel responsive, from image galleries to well-labeled forms. Her approach starts with a useful foundation, then adds motion where it helps someone understand a change. She makes sure the experience works just as well with a keyboard, on a phone, and at a slower connection.

MEET THE TEAM
Live component. Go ahead, interact.
01

Installation

Run this in your shadcn-configured React project. The component and stylesheet are added together.

TERMINAL
npx shadcn@latest add http://localhost:5173/r/team-grid.json

This command uses the current site address. For localhost, keep this preview running on the same computer. Files follow your configured components alias.

02

Usage

Import the component and make the details your own.

TypeScript
import { TeamGrid } from '@/components/anticraft/TeamGrid';

export function Example() {
  return (
    <TeamGrid
      title="Good people. Different perspectives."
      items={[
        {
          id: 'mira', name: 'Mira Patel', role: 'Strategy & direction',
          bio: 'Mira helps teams find the clearest version of their story. She brings audience research, thoughtful questions, and a practical plan to every new project.',
          portrait: <img src="/images/mira.jpg" alt="" />,
          links: [{ label: 'Read Mira’s journal', href: '/journal/mira' }],
        },
        {
          id: 'daniel', name: 'Daniel Park', role: 'Product & design',
          bio: 'Daniel turns complex ideas into calm, useful experiences. His work moves between visual systems, product details, and the everyday paths people take through a website.',
          portrait: <img src="/images/daniel.jpg" alt="" />,
        },
        {
          id: 'sofia', name: 'Sofia Reed', role: 'Creative engineering',
          bio: 'Sofia brings ideas to life through accessible, resilient interfaces. She builds the details that make a site feel responsive and works closely with design from the first sketch.',
          portrait: <img src="/images/sofia.jpg" alt="" />,
        },
      ]}
    />
  );
}
03

Props

PropTypeDefaultDescription
itemsTeamGridItem[]RequiredPeople with a unique id, name, role, full bio string, and decorative ReactNode portrait. Optional links are ordinary labeled destinations in the full profile. An empty list displays a quiet placeholder.
items[].portraitReactNodeRequiredA decorative portrait or illustration, rendered inert and hidden from assistive technology because the adjacent heading identifies the person. Keep links and controls out of portraits. Supply your own image files for the example paths.
items[].biostringRequiredThe complete introduction. Cards show a preview of up to three lines; the profile shows the whole text and preserves paragraph breaks.
items[].links{ label: string; href: string }[]undefinedOptional ordinary profile links with descriptive visible labels. Links appear outside the decorative portrait. Replace example paths with real destinations in your site; omit links when no destination exists.
titlestring'Good people. Different perspectives.'Visible heading and accessible section name. An empty string hides the heading while retaining an Our team accessible label.
classNamestring''Additional classes. Customize --ac-team-surface, --ac-team-ink, --ac-team-muted, --ac-team-line, and --ac-team-accent on this element.
04

Motion & accessibility

Considered by default.

Every card keeps its name, role, introduction, and Meet button visible on pointer and touch screens. A gentle portrait scale on hover is decorative and removed for reduced motion. Meet opens a native modal with the complete bio and optional profile links. Normal Tab navigation stays inside the open modal; Escape and the visible Close button dismiss it and return focus to the opener. Background scrolling is restored on close or unmount. Removing an open person from items closes their profile safely. The grid responds to its own container, moving from three to two to one column; the compact live demo uses a horizontal rail to keep the full controls visible. All example people and biographies are fictional.

Use semantic content and meaningful labels in your composition. Check contrast and keyboard behavior with your own styles and content.