Section

Team — Bento

  • Section
  • React
  • MIT

Preview

Live section

Interactive preview
Open preview
9:41 100%
devsnips.dev/library/react/sections/team/bento/
fluid · no fixed width 100%
No dependencies Responsive

Install

Add to your project

terminal
npx devsnips add React/Sections/Team/bento
registry path: React/Sections/Team/bento

Source

Implementation

code.tsx
import * as React from "react";

export type TeamMember = {
  name: string;
  role: string;
  bio?: string;
  initials?: string;
  location?: string;
  social?: { label: string; href: string }[];
};

export interface TeamSectionProps {
  eyebrow?: string;
  title?: string;
  description?: string;
  members?: TeamMember[];
}

const DEFAULT_MEMBERS: TeamMember[] = [
  {
    name: "Alex Morgan",
    role: "Founder & Product",
    bio: "Building tools for developers with a bias toward clarity, useful defaults, and calm software.",
    initials: "AM",
    location: "New York",
  },
  {
    name: "Maya Chen",
    role: "Engineering Lead",
    bio: "Systems, reliability, and the invisible work behind fast interfaces.",
    initials: "MC",
    location: "Toronto",
  },
  {
    name: "Jon Bell",
    role: "Design Director",
    bio: "Interface systems and product language.",
    initials: "JB",
    location: "London",
  },
  {
    name: "Priya Shah",
    role: "Developer Advocate",
    bio: "Docs, examples, and the space between product and community.",
    initials: "PS",
    location: "Bengaluru",
  },
];

export function TeamSection({
  eyebrow = "Team / 01",
  title = "Built by people who care about the details.",
  description = "Four perspectives, one shared standard for making software easier to understand and easier to use.",
  members = DEFAULT_MEMBERS,
}: TeamSectionProps) {
  const headingId = React.useId();
  const featured = members[0];
  const secondary = members[1];
  const compact = members.slice(2);

  return (
    <section
      aria-labelledby={headingId}
      className="bg-[var(--ds-color-background)] font-[var(--ds-font-sans)] text-[var(--ds-color-foreground)]"
    >
      <div className="mx-auto max-w-[1280px] px-4 py-[clamp(4rem,3rem+4vw,6rem)] sm:px-6 lg:px-8">
        <header className="max-w-2xl">
          <p className="font-[var(--ds-font-mono)] text-xs uppercase leading-[1.3] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
            {eyebrow}
          </p>
          <h2
            id={headingId}
            className="mt-3 text-[clamp(1.875rem,1.65rem+1vw,2.25rem)] font-semibold leading-[1.15] tracking-[-0.02em]"
          >
            {title}
          </h2>
          <p className="mt-4 max-w-xl text-[clamp(1rem,0.95rem+0.25vw,1.125rem)] leading-[1.5] text-[var(--ds-color-muted-foreground)]">
            {description}
          </p>
        </header>

        <div className="mt-12 grid grid-cols-12 gap-4 lg:mt-16 lg:gap-6">
          {featured ? (
            <article className="col-span-12 flex min-h-[360px] flex-col rounded-[var(--ds-radius-lg)] border border-[var(--ds-color-border)] bg-[var(--ds-color-surface)] p-6 transition-colors duration-150 ease-out hover:border-[var(--ds-color-border-strong)] motion-reduce:transition-none sm:p-8 lg:col-span-7">
              <div className="flex items-start justify-between gap-6">
                <div className="max-w-[44ch]">
                  <p className="font-[var(--ds-font-mono)] text-xs uppercase leading-[1.4] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
                    Featured profile
                  </p>
                  <h3 className="mt-4 text-2xl font-semibold leading-[1.2] tracking-[-0.015em]">{featured.name}</h3>
                  <p className="mt-1 text-sm leading-5 text-[var(--ds-color-muted-foreground)]">{featured.role}</p>
                </div>
                <span
                  aria-hidden="true"
                  className="inline-flex size-16 shrink-0 items-center justify-center rounded-[var(--ds-radius-md)] border border-[var(--ds-color-border-strong)] bg-[var(--ds-color-surface-subtle)] font-[var(--ds-font-mono)] text-sm font-medium tracking-[0.05em]"
                >
                  {featured.initials ?? featured.name.slice(0, 2).toUpperCase()}
                </span>
              </div>
              <div className="mt-auto grid gap-8 pt-12 sm:grid-cols-[1fr_auto] sm:items-end">
                <p className="max-w-[48ch] text-sm leading-[1.6] text-[var(--ds-color-muted-foreground)]">
                  {featured.bio ?? "Building useful things with a small team."}
                </p>
                <dl className="grid min-w-[150px] gap-3 font-[var(--ds-font-mono)] text-[10px] uppercase leading-[1.4] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
                  <div className="border-l-2 border-[var(--ds-color-accent)] pl-3">
                    <dt>Focus</dt>
                    <dd className="mt-1 text-[var(--ds-color-foreground)]">Product craft</dd>
                  </div>
                  <div>
                    <dt>Base</dt>
                    <dd className="mt-1 text-[var(--ds-color-foreground)]">{featured.location ?? "Remote"}</dd>
                  </div>
                </dl>
              </div>
            </article>
          ) : null}

          {secondary ? (
            <article className="col-span-12 flex min-h-[360px] flex-col rounded-[var(--ds-radius-lg)] border border-[var(--ds-color-border)] bg-[var(--ds-color-surface)] p-6 transition-colors duration-150 ease-out hover:border-[var(--ds-color-border-strong)] motion-reduce:transition-none sm:p-8 lg:col-span-5">
              <div className="flex items-start justify-between gap-4">
                <p className="font-[var(--ds-font-mono)] text-xs uppercase leading-[1.4] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
                  Leadership
                </p>
                <span aria-hidden="true" className="text-lg font-semibold tracking-[-0.02em]">
                  02
                </span>
              </div>
              <div className="mt-auto">
                <span
                  aria-hidden="true"
                  className="inline-flex size-12 items-center justify-center rounded-[var(--ds-radius-md)] border border-[var(--ds-color-border-strong)] font-[var(--ds-font-mono)] text-xs font-medium"
                >
                  {secondary.initials ?? secondary.name.slice(0, 2).toUpperCase()}
                </span>
                <h3 className="mt-6 text-xl font-semibold leading-[1.25]">{secondary.name}</h3>
                <p className="mt-1 text-sm leading-5 text-[var(--ds-color-muted-foreground)]">{secondary.role}</p>
                <p className="mt-5 max-w-[40ch] text-sm leading-[1.6] text-[var(--ds-color-muted-foreground)]">
                  {secondary.bio ?? "Leading engineering with care for the details nobody sees."}
                </p>
              </div>
            </article>
          ) : null}

          {compact.map((member, index) => (
            <article
              key={member.name}
              className="col-span-12 min-h-[220px] rounded-[var(--ds-radius-lg)] border border-[var(--ds-color-border)] bg-[var(--ds-color-surface)] p-6 transition-colors duration-150 ease-out hover:border-[var(--ds-color-border-strong)] motion-reduce:transition-none sm:col-span-6 lg:col-span-3"
            >
              <div className="flex items-start justify-between gap-4">
                <span
                  aria-hidden="true"
                  className="inline-flex size-11 items-center justify-center rounded-[var(--ds-radius-md)] border border-[var(--ds-color-border-strong)] font-[var(--ds-font-mono)] text-xs font-medium"
                >
                  {member.initials ?? member.name.slice(0, 2).toUpperCase()}
                </span>
                <span className="font-[var(--ds-font-mono)] text-xs uppercase leading-[1.4] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
                  {String(index + 3).padStart(2, "0")}
                </span>
              </div>
              <h3 className="mt-10 text-base font-semibold leading-[1.4]">{member.name}</h3>
              <p className="mt-1 text-sm leading-5 text-[var(--ds-color-muted-foreground)]">{member.role}</p>
              {member.location ? (
                <p className="mt-4 font-[var(--ds-font-mono)] text-xs uppercase leading-[1.4] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
                  {member.location}
                </p>
              ) : null}
            </article>
          ))}

          <div className="col-span-12 rounded-[var(--ds-radius-lg)] border border-[var(--ds-color-border)] bg-[var(--ds-color-surface-subtle)] p-6 sm:p-8 lg:col-span-6">
            <p className="font-[var(--ds-font-mono)] text-xs uppercase leading-[1.4] tracking-[0.05em] text-[var(--ds-color-muted-foreground)]">
              How we work
            </p>
            <p className="mt-4 max-w-[48ch] text-lg font-medium leading-[1.45] tracking-[-0.01em]">
              Fewer meetings. Clearer writing. More time spent making the thing.
            </p>
          </div>
          <div className="col-span-12 flex items-end rounded-[var(--ds-radius-lg)] border border-[var(--ds-color-border)] p-6 sm:p-8 lg:col-span-6">
            <p className="max-w-[48ch] text-sm leading-[1.6] text-[var(--ds-color-muted-foreground)]">
              The grid is modular on purpose: featured context first, compact identities second, shared philosophy last.
            </p>
          </div>
        </div>
      </div>
    </section>
  );
}
187 lines UTF-8 · LF · Spaces: 2

AI-ready

Available to your agent.

This section is reachable through the DevSnips CLI, MCP server and Skills integrations — one registry, one resource path.

Resource path

devsnips://sections/team/bento

Continue browsing

View all