Skip to content
All Taste components

Team

Team — tall portrait grid

Tall portrait cards with each name and role on a frosted label, ending with an open-roles card.

3:4 portraits · frosted caption · profile link · hiring card · 2 → 4 columns

The team

Seven people, four countries, one inbox

We’re small on purpose. Write to support and one of us will answer, usually the person who built the thing.

  • Maya OkonkwoCo-founder, CEO
  • Felix NavarroCo-founder, engineering
  • Ingrid SolbergHead of design
  • Samir HaddadPayments lead
  • Chloé MartinCustomer support
  • Dev MalhotraProduct engineer
  • Hana SatoGrowth
  • 2 open roles

    Join us

    Remote-friendly, four-day weeks in August.

    See open roles
import { ArrowRight, Linkedin } from "lucide-react";

type Member = { name: string; role: string; photo?: string; linkedin?: string };

const team: Member[] = [
  { name: "Maya Okonkwo", role: "Co-founder, CEO", photo: "/team/maya.jpg", linkedin: "#" },
  { name: "Felix Navarro", role: "Co-founder, engineering", photo: "/team/felix.jpg", linkedin: "#" },
  { name: "Ingrid Solberg", role: "Head of design", linkedin: "#" },
  { name: "Samir Haddad", role: "Payments lead", linkedin: "#" },
  { name: "Chloé Martin", role: "Customer support", linkedin: "#" },
  { name: "Dev Malhotra", role: "Product engineer", linkedin: "#" },
  { name: "Hana Sato", role: "Growth", linkedin: "#" },
];

const initials = (name: string) => name.split(" ").map((w) => w[0]).join("").slice(0, 2);

export function TeamPortraits() {
  return (
    <section aria-labelledby="team-portraits-title" className="bg-bg px-5 py-16 font-sans sm:px-10 sm:py-20">
      <div className="mx-auto max-w-6xl">
        <div className="flex flex-wrap items-end justify-between gap-5">
          <div>
            <p className="text-[13px] font-medium text-primary">The team</p>
            <h2 id="team-portraits-title" className="mt-3 text-balance text-3xl font-semibold tracking-tight text-fg sm:text-4xl">Seven people, four countries, one inbox</h2>
          </div>
          <p className="max-w-[40ch] text-sm leading-relaxed text-fg-muted">We’re small on purpose. Write to support and one of us will answer, usually the person who built the thing.</p>
        </div>

        <ul className="mt-10 grid grid-cols-2 gap-4 md:grid-cols-4">
          {team.map((m) => (
            <li key={m.name}>
              <figure className="relative grid aspect-[3/4] place-items-center overflow-hidden rounded-lg bg-gradient-to-b from-primary-soft to-surface-2">
                {m.photo
                  ? <img src={m.photo} alt="" className="absolute inset-0 size-full object-cover" />
                  : <span className="mb-[30%] text-5xl font-semibold tracking-tighter text-primary-soft-fg/60" aria-hidden>{initials(m.name)}</span>}
                <figcaption className="absolute inset-x-2.5 bottom-2.5 flex items-center justify-between gap-2 rounded bg-bg/90 px-3 py-2.5 text-[13px] backdrop-blur">
                  <div className="min-w-0">
                    <p className="truncate font-semibold text-fg">{m.name}</p>
                    <p className="truncate text-xs text-fg-muted">{m.role}</p>
                  </div>
                  {m.linkedin && (
                    <a href={m.linkedin} aria-label={m.name + " on LinkedIn"} className="shrink-0 text-fg-subtle hover:text-fg">
                      <Linkedin className="size-4" aria-hidden />
                    </a>
                  )}
                </figcaption>
              </figure>
            </li>
          ))}
          <li className="grid aspect-[3/4] content-end gap-2 rounded-lg border border-dashed border-border-strong p-5">
            <span className="w-fit rounded-full bg-primary-soft px-2 py-0.5 text-xs font-medium text-primary-soft-fg">2 open roles</span>
            <h3 className="text-base font-semibold text-fg">Join us</h3>
            <p className="text-[13px] text-fg-subtle">Remote-friendly, four-day weeks in August.</p>
            <a href="/careers" className="inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline">See open roles <ArrowRight className="size-3.5" aria-hidden /></a>
          </li>
        </ul>
      </div>
    </section>
  );
}

The code uses the Taste Tailwind preset. Make yours on the Taste page with Export my system.