Hero 15

A directory-style hero with an oversized title, split intro with dual CTAs, and a row of wordmark cards with minimal imagery.

hero-15.tsx

import Balancer from 'react-wrap-balancer'

import { Button } from '@/components/ui/button'

const studios = [
  {
    name: 'Halden',
    wordmark: (
      <span className="font-serif text-3xl leading-none tracking-tight italic">
        Halden
      </span>
    ),
    description:
      'An independent product studio of 40 designers and engineers building calm, durable software for teams in health and finance.',
    image:
      'https://images.unsplash.com/photo-1581539250439-c96689b516dd?q=80&w=1200&auto=format&fit=crop',
  },
  {
    name: 'Northfield',
    wordmark: (
      <span className="text-lg leading-none font-medium tracking-[0.24em] uppercase">
        Northfield
      </span>
    ),
    description:
      'Northfield partners with early-stage founders to shape brand, interface, and launch strategy in focused six-week sprints.',
    image:
      'https://images.unsplash.com/photo-1610701596007-11502861dcfa?q=80&w=1200&auto=format&fit=crop',
  },
  {
    name: 'Formworks',
    wordmark: (
      <span className="text-xl leading-[0.9] font-black tracking-tight">
        Form—
        <br />
        works
      </span>
    ),
    description:
      'A small collective pairing industrial design with careful frontend engineering for consumer hardware brands worldwide.',
    image:
      'https://images.unsplash.com/photo-1494438639946-1ebd1d20bf85?q=80&w=1200&auto=format&fit=crop',
  },
]

export function Hero15() {
  return (
    <section className="bg-background relative isolate w-full overflow-hidden">
      <div className="relative z-10 mx-auto flex max-w-7xl flex-col gap-14 px-6 py-20 sm:gap-20 sm:py-28">
        <div className="grid gap-8 lg:grid-cols-2 lg:items-start lg:gap-16">
          <h1 className="text-foreground text-4xl font-medium tracking-tight text-balance sm:text-5xl">
            Studio Directory
          </h1>

          <div className="flex flex-col gap-6 lg:pt-2">
            <p className="text-muted-foreground max-w-lg text-base sm:text-lg">
              <Balancer>
                Meet independent teams that turn rough ideas into polished,
                well-built products.
              </Balancer>
            </p>
            <div className="flex flex-wrap items-center gap-3">
              <Button
                size="lg"
                className="w-fit rounded-full px-5"
                nativeButton={false}
                render={<a href="#" />}
              >
                Browse studios
              </Button>
              <Button
                size="lg"
                variant="outline"
                className="w-fit rounded-full px-5"
                nativeButton={false}
                render={<a href="#" />}
              >
                List your studio
              </Button>
            </div>
          </div>
        </div>

        <div className="grid gap-4 lg:grid-cols-3 lg:gap-6">
          {studios.map((studio) => (
            <a
              key={studio.name}
              href="#"
              aria-label={studio.name}
              className="group bg-card text-card-foreground focus-visible:ring-ring/50 flex flex-col gap-6 rounded-sm p-6 outline-none focus-visible:ring-3 sm:p-8"
            >
              <div className="flex h-10 items-end">{studio.wordmark}</div>
              <p className="text-muted-foreground line-clamp-2 text-sm sm:text-base">
                {studio.description}
              </p>
              <div className="relative mt-auto aspect-16/9 overflow-hidden rounded-sm outline outline-black/5 dark:outline-white/10">
                <img
                  src={studio.image}
                  alt="Alt"
                  decoding="async"
                  className="size-full object-cover grayscale transition-transform duration-500 ease-out group-hover:scale-[1.03]"
                />
              </div>
            </a>
          ))}
        </div>
      </div>
    </section>
  )
}