Zoeken...  ⌘K GitHub

HeroVideoGrid Hero

Donkere split-hero: eyebrow, accent-kop, sub, CTA en stat-rij links; mozaïek-grid van vier beelden rechts.

/hero-video-grid
src/components/hero/HeroVideoGrid.astro
---
/**
 * HeroVideoGrid — donkere split-hero: links eyebrow, kop met accent-woord, sub,
 * CTA en een stat-rij; rechts een mozaïek-grid van vier beelden. Alleen dark.
 *
 * Props:
 * - eyebrow?: string
 * - headline?: string
 * - accent?: string            accent-woord binnen de kop (cursief gemarkeerd)
 * - headlineTail?: string      rest van de kop, na het accent-woord
 * - sub?: string
 * - cta?: { label: string; href: string }
 * - stats?: { value: string; label: string }[]
 * - images?: { src: string; alt?: string }[]   vier beelden voor het mozaïek
 */
interface Props {
  eyebrow?: string;
  headline?: string;
  accent?: string;
  headlineTail?: string;
  sub?: string;
  cta?: { label: string; href: string };
  stats?: { value: string; label: string }[];
  images?: { src: string; alt?: string }[];
}

const {
  eyebrow = 'Digital Marketing Agency',
  headline = 'Groei die je',
  accent = 'ziet',
  headlineTail = 'in de cijfers',
  sub = 'Van strategie tot lancering. Wij zijn het bureau dat resultaten levert die er toe doen.',
  cta = { label: 'Bekijk ons werk →', href: '#' },
  stats = [
    { value: '80+', label: 'Klanten' },
    { value: '4.2×', label: 'Gemiddeld ROAS' },
    { value: '93%', label: 'Retentie' },
  ],
  images = [
    { src: '/img/ext/photo-1460925895917-afdab827c52f-w600-18aff0.jpg', alt: '' },
    { src: '/img/ext/photo-1551434678-e076c223a692-w400-770994.jpg', alt: '' },
    { src: '/img/ext/photo-1611532736597-de2d4265fba3-w400-a33fbb.jpg', alt: '' },
    { src: '/img/ext/photo-1504868584819-f8e8b4b6d7e3-w400-b57f3e.jpg', alt: '' },
  ],
} = Astro.props;
---

<section class:list={['bl-section', 'hvg']}>
  <div class="bl-inner hvg-inner">
    <!-- Left -->
    <div class="hvg__left">
      {eyebrow && <p class="hvg__eyebrow">{eyebrow}</p>}
      <h1 class="hvg__headline">{headline}{accent && <> <em>{accent}</em></>}{headlineTail && ` ${headlineTail}`}</h1>
      {sub && <p class="hvg__sub">{sub}</p>}
      {cta && <a href={cta.href} class="hvg__cta">{cta.label}</a>}
      {stats.length > 0 && (
        <div class="hvg__stats">
          {stats.map((s) => (
            <div class="hvg__stat">
              <div class="hvg__stat-value">{s.value}</div>
              <div class="hvg__stat-label">{s.label}</div>
            </div>
          ))}
        </div>
      )}
    </div>
    <!-- Right: mosaic grid -->
    <div class="hvg__grid">
      {images.map((img, i) => (
        <div class:list={['hvg__cell', `hvg__cell--${i + 1}`]}>
          <img data-allow-img src={img.src} alt={img.alt ?? ''} loading="eager" fetchpriority="high" decoding="async" />
        </div>
      ))}
    </div>
  </div>
</section>

<style>
.hvg{background:var(--color-primary, #0a0a0a);color:#e8e8e8;overflow:hidden}
.hvg-inner{display:grid;grid-template-columns:1fr 1fr;gap:4rem;align-items:center}
.hvg__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--color-accent, #6366f1);margin-bottom:1rem}
.hvg__headline{font-size:clamp(2.5rem,4.5vw,4rem);font-weight:800;line-height:1.05;letter-spacing:-.04em;color:#fff;margin-bottom:1.25rem}
.hvg__headline em{font-style:normal;color:var(--color-accent, #6366f1)}
.hvg__sub{font-size:1.0625rem;line-height:1.65;color:#aaa;margin-bottom:2rem;max-width:40ch}
.hvg__cta{display:inline-block;background:var(--color-accent, #6366f1);color:#fff;text-decoration:none;font-weight:700;font-size:.9375rem;padding:.875rem 1.75rem;border-radius:var(--radius, .5rem);transition:filter .2s,transform .2s;margin-bottom:2.5rem}
.hvg__cta:hover{filter:brightness(1.15);transform:translateY(-1px)}
.hvg__stats{display:flex;gap:2.5rem;padding-top:1.5rem;border-top:1px solid rgba(255,255,255,.1)}
.hvg__stat-value{font-size:1.875rem;font-weight:800;color:#fff;letter-spacing:-.03em}
.hvg__stat-label{font-size:.875rem;color:#aaa;margin-top:.25rem}
.hvg__grid{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:240px 240px;gap:.75rem}
.hvg__cell{border-radius:calc(var(--radius, .5rem) * 1.5);overflow:hidden}
.hvg__cell img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
.hvg__cell:hover img{transform:scale(1.04)}
.hvg__cell--1{grid-row:1 / 3;grid-column:1}

@media (max-width: 768px){
  .hvg-inner{grid-template-columns:1fr;gap:2.5rem}
  .hvg__grid{grid-template-rows:180px 180px}
  .hvg__cell--1{grid-row:1 / 3}
  .hvg__stats{gap:1.5rem}
}
</style>

Props

Prop Type Default Beschrijving
eyebrow string 'Digital Marketing Agency' Eyebrow boven de kop
headline string 'Groei die je' Kop, deel vóór het accent-woord
accent string 'ziet' Accent-woord (gekleurd) binnen de kop
headlineTail string 'in de cijfers' Kop, deel na het accent-woord
sub string - Ondertitel
cta { label: string; href: string } - CTA-knop
stats { value: string; label: string }[] - Statistieken onder de CTA
images { src: string; alt?: string }[] - Vier beelden voor het mozaïek-grid

* = verplicht