Zoeken...  ⌘K GitHub

VideoGrid2 video

Alternatief video grid met gemixte groottes.

/video-grid-2
src/components/video/VideoGrid2.astro
---
/**
 * VideoGrid2
 * Alternatief video-grid met gemixte groottes
 */
interface Props {
  headline?: string;
  videos?: { title: string; duration?: string; category?: string }[];
}
const {
  headline = 'Kijk achter de schermen',
  videos = [
    { title: 'Van strategie naar resultaat', duration: '4:32', category: 'Case study' },
    { title: 'Google Ads in 2025 — wat werkt', duration: '8:17', category: 'Tutorial' },
    { title: 'SEO audit live voor klant', duration: '12:05', category: 'Live sessie' },
    { title: 'Conversie-optimalisatie basics', duration: '6:48', category: 'Educatief' },
    { title: 'Hoe wij campagnes bouwen', duration: '3:55', category: 'Intern' },
  ],
} = Astro.props;
---

<section class="vg2">
  <div class="vg2__inner">
    {headline && <h2 class="vg2__headline">{headline}</h2>}
    <div class="vg2__grid">
      {videos.map((v, i) => (
        <div class={`vg2__card${i === 0 ? ' vg2__card--featured' : ''}`}>
          <div class="vg2__thumb">
            <span class="vg2__play" aria-hidden="true">▶</span>
            {v.duration && <span class="vg2__duration">{v.duration}</span>}
          </div>
          <div class="vg2__meta">
            {v.category && <span class="vg2__cat">{v.category}</span>}
            <h3 class="vg2__title">{v.title}</h3>
          </div>
        </div>
      ))}
    </div>
  </div>
</section>

<style>
  .vg2 {
    background: #fff;
    padding: 4rem 1.5rem;
  }
  .vg2__inner {
    max-width: 1060px;
    margin: 0 auto;
  }
  .vg2__headline {
    font-size: 1.75rem;
    font-weight: 700;
    color: var(--color-primary, #0a0a0a);
    margin: 0 0 2rem;
  }
  .vg2__grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: auto auto;
    gap: 1.25rem;
  }
  .vg2__card--featured {
    grid-column: 1 / 3;
    grid-row: 1 / 3;
  }
  .vg2__card {
    border-radius: 12px;
    overflow: hidden;
    background: #f4f4f6;
    transition: transform 0.2s;
    cursor: pointer;
  }
  .vg2__card:hover { transform: translateY(-3px); }
  .vg2__thumb {
    aspect-ratio: 16/9;
    background: var(--color-primary, #0a0a0a);
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
  }
  .vg2__card--featured .vg2__thumb {
    background: linear-gradient(135deg, #1e1b4b 0%, var(--color-accent, #6366f1) 100%);
  }
  .vg2__play {
    font-size: 1.5rem;
    color: rgba(255,255,255,0.85);
    background: rgba(255,255,255,0.15);
    width: 52px;
    height: 52px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background 0.2s;
    padding-left: 4px;
  }
  .vg2__card:hover .vg2__play { background: rgba(255,255,255,0.3); }
  .vg2__card--featured .vg2__play { width: 64px; height: 64px; font-size: 1.8rem; }
  .vg2__duration {
    position: absolute;
    bottom: 0.6rem;
    right: 0.75rem;
    background: rgba(0,0,0,0.7);
    color: #fff;
    font-size: 0.72rem;
    font-weight: 600;
    padding: 0.2rem 0.45rem;
    border-radius: 4px;
    font-variant-numeric: tabular-nums;
  }
  .vg2__meta {
    padding: 0.85rem 1rem;
  }
  .vg2__card--featured .vg2__meta {
    padding: 1rem 1.25rem;
  }
  .vg2__cat {
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--color-accent, #6366f1);
    display: block;
    margin-bottom: 0.3rem;
  }
  .vg2__title {
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--color-primary, #0a0a0a);
    margin: 0;
    line-height: 1.35;
  }
  .vg2__card--featured .vg2__title {
    font-size: 1.1rem;
  }
  @media (max-width: 640px) {
    .vg2__grid { grid-template-columns: 1fr; }
    .vg2__card--featured { grid-column: 1; grid-row: auto; }
  }
</style>

Props

Prop Type Default Beschrijving
headline string Sectietitel
videos { title: string; duration?: string; category?: string }[] Video items

* = verplicht