All-Access · 22 templates$1270.97$99/year — save 92%Get access
  • HomeHome
  • TemplatesTemplates23
  • ComponentsComponents78
  • PricingPricing
  • Need a Website?Need a Website?New
Unlock All AccessUnlock All Access

Our latest template collection

Ready-to-launch sites for real estate agents, service businesses, and local brands — built to rank, load fast, and convert.

Explore All TemplatesExplore All Templates

Orvaine - Luxury Equestrian & Horse Breeding Website Template

Orvaine is a premium website template for stud farms, sport horse breeders and equestrian estates: horse pages with pedigrees, events, films. Next.js, Astro, Sanity.

Download Template
Orvaine - Luxury Equestrian & Horse Breeding Website Template

Maressa - Luxury Yacht Charter & Sales Website Template

Maressa is a premium website template for yacht charter, brokerage and superyacht brands: 21 editable sections, full-screen films, Next.js and Astro versions. Sanity.

Download Template
Maressa - Luxury Yacht Charter & Sales Website Template

Krishi – Agriculture & Farm Website Template

Krishi is a premium website template for farms, agritech and food brands: 17 editable sections, cinematic GSAP motion and both Next.js and Astro versions. Built with Sanity.

Download Template
Krishi – Agriculture & Farm Website Template
ComponentsTeam

Team Portrait Cards

View code
Full screen

A team section with white cards holding the name and a round portrait, followed by role and bio. React and Tailwind CSS, no dependencies.

TeamPortraitCards.tsx
// Team section on a grey panel: heading and intro, then white cards with the
// name and a round portrait, followed by role and short bio.
// Pure Tailwind, no dependencies. Works with Tailwind v3 and v4.

type Member = { name: string; role: string; bio: string; photo: string };

type Props = {
  heading?: string;
  intro?: string;
  members?: Member[];
};

const face = (id: string) => `https://images.unsplash.com/photo-${id}?w=500&h=500&q=80&auto=format&fit=crop&crop=faces`;

const DEFAULT_MEMBERS: Member[] = [
  { name: "Daniel Reyes", role: "Creative director", bio: "Fifteen years shaping brands for hospitality, retail and tech.", photo: face("1472099645785-5658abf4ff4e") },
  { name: "Lena Hart", role: "Design lead", bio: "Turns strategy into identities, systems and type that hold up everywhere.", photo: face("1438761681033-6461ffad8d80") },
  { name: "Omar Aziz", role: "Developer", bio: "Builds the fast, accessible websites our designs become.", photo: face("1500648767791-00dcc994a43e") },
];

export default function TeamPortraitCards({
  heading = "The team",
  intro = "A small, senior team. You work directly with the people doing the work, from the first call to launch.",
  members = DEFAULT_MEMBERS,
}: Props) {
  return (
    <section className="bg-[#f7f7f7] px-5 py-20 font-['Inter',ui-sans-serif,system-ui,sans-serif] text-black antialiased md:px-10 md:py-28">
      <div className="mx-auto max-w-7xl">
        <h2 className="text-[clamp(32px,4vw,56px)] font-bold leading-tight tracking-[-0.03em]">{heading}</h2>
        <p className="mt-6 max-w-3xl text-xl font-medium md:mt-8 md:text-2xl">{intro}</p>

        <ul className="mt-12 grid gap-x-8 gap-y-12 sm:grid-cols-2 lg:mt-16 lg:grid-cols-3">
          {members.map((m) => (
            <li key={m.name} className="flex flex-col gap-5">
              <div className="flex aspect-[424/457] flex-col bg-white p-5">
                <h3 className="text-lg font-semibold">{m.name}</h3>
                <div className="flex flex-1 items-center justify-center pb-6">
                  <img src={m.photo} alt={m.name} loading="lazy" className="aspect-square w-3/5 rounded-full object-cover" />
                </div>
              </div>
              <div className="flex flex-col gap-2.5">
                <p className="text-lg font-semibold">{m.role}</p>
                <p className="font-medium text-[#595959]">{m.bio}</p>
              </div>
            </li>
          ))}
        </ul>
      </div>
    </section>
  );
}

How to use it

  1. Make sure your Next.js or React project has Tailwind CSS set up (v3 or v4 both work).
  2. Create components/TeamPortraitCards.tsx and paste the code.
  3. Import it into a page and replace the sample text and images with your own.
Visaro - Creative & Branding Agency Template (Next.js + Sanity)

From the full template

Visaro$49

Every page, Sanity CMS and SEO already set up. This section is one of 4 you can try free.

Get the full template Get the full template Live preview Live preview
Share
Category
Team
Template
Visaro
Dependencies
None, just React
Works with
Next.js, React, Tailwind CSS v3 & v4
Added
Oct 29, 2026

More from Visaro

See the full template
Agency Split Hero
Hero

Agency Split Hero

Process Photo Cards
Feature

Process Photo Cards

Staggered Portfolio Grid
Gallery

Staggered Portfolio Grid

More team

View all
Alternating Feature Rows
Feature

Alternating Feature Rows

Arched Portrait Carousel
Carousel

Arched Portrait Carousel

Awards Checkerboard
Feature

Awards Checkerboard

Ready for a faster site that's easier to edit?

Book a free 30-minute call. We'll review your current site and send a fixed-price plan. No pressure, no pitch.

Book Free Call Book Free Call No commitment required

Fast Next.js + Sanity websites, built for you or ready to launch with our templates.

Book a Free Call Book a Free Call
Services
  • Web Design
  • UI/UX Design
  • Framer Dev
  • Webflow Dev
  • Custom Dev
  • Sanity CMS
Resources
  • Templates
  • Pricing
  • License
  • Components
  • Case Studies
Company
  • About Us
  • Contact
  • Privacy Policy
© 2026 rayso.studio — All rights reservedDesigned & built in-house Remote-first agency
Let's TalkLet's Talk