Zoeken...  ⌘K GitHub

CtaVideo CTA

Split-CTA met tekst en knop links en een video-thumbnail met play-knop, duur-badge en caption rechts.

/cta-video
src/components/cta/CtaVideo.astro
---
/**
 * CtaVideo
 * Split-CTA: links eyebrow + kop + sub + knop, rechts een video-thumbnail
 * met play-knop, duur-badge en caption. Light.
 *
 * Props:
 * - eyebrow?: string
 * - headline: string
 * - sub?: string
 * - cta?: { label: string; href: string }
 * - videoHref?: string             link achter de thumbnail (default '#')
 * - image: string                  thumbnail-bron
 * - imageAlt?: string
 * - duration?: string              duur-badge, bv. '3:24'
 * - caption?: string               regel onder de thumbnail
 */
interface Props {
  eyebrow?: string;
  headline: string;
  sub?: string;
  cta?: { label: string; href: string };
  videoHref?: string;
  image: string;
  imageAlt?: string;
  duration?: string;
  caption?: string;
}

const {
  eyebrow,
  headline,
  sub,
  cta,
  videoHref = '#',
  image,
  imageAlt = '',
  duration,
  caption,
} = Astro.props;
---

<section class:list={['bl-section', 'ctavid']}>
  <div class="bl-inner ctavid-inner">
    <div class="ctavid-text">
      {eyebrow && <span class="ctavid-eyebrow">{eyebrow}</span>}
      <h2 class="ctavid-headline">{headline}</h2>
      {sub && <p class="ctavid-sub">{sub}</p>}
      {cta && <a href={cta.href} class="ctavid-btn">{cta.label}</a>}
    </div>
    <div class="ctavid-media">
      <a href={videoHref} class="ctavid-thumb" aria-label="Bekijk video">
        <img data-allow-img src={image} alt={imageAlt} class="ctavid-img" loading="lazy" decoding="async" />
        <div class="ctavid-play">
          <div class="ctavid-play-icon">&#9654;</div>
        </div>
        {duration && <span class="ctavid-duration">{duration}</span>}
      </a>
      {caption && <p class="ctavid-caption">{caption}</p>}
    </div>
  </div>
</section>

<style>
.ctavid{background:#fff;border-top:1px solid #e5e7eb}
.ctavid-inner{display:grid;grid-template-columns:1fr 1fr;gap:5rem;align-items:center}
.ctavid-eyebrow{display:block;font-size:.75rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--color-accent,#6366f1);margin-bottom:.875rem}
.ctavid-headline{font-size:clamp(1.75rem,3.5vw,2.75rem);font-weight:900;color:#0a0a0a;letter-spacing:-.04em;line-height:1.15;margin:0 0 1rem}
.ctavid-sub{font-size:1.125rem;color:#6b7280;line-height:1.65;margin:0 0 2rem}
.ctavid-btn{display:inline-flex;align-items:center;padding:.875rem 2rem;background:var(--color-accent,#6366f1);color:#fff;font-weight:700;font-size:1rem;border-radius:.5rem;text-decoration:none;transition:opacity .2s}
.ctavid-btn:hover{opacity:.88}
.ctavid-thumb{display:block;position:relative;border-radius:1rem;overflow:hidden;aspect-ratio:16/9}
.ctavid-img{width:100%;height:100%;object-fit:cover;display:block}
.ctavid-play{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0000004d;transition:background .2s}
.ctavid-thumb:hover .ctavid-play{background:#00000073}
.ctavid-play-icon{width:60px;height:60px;background:#fffffff2;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1.125rem;color:#0a0a0a;padding-left:4px;transition:transform .2s}
.ctavid-thumb:hover .ctavid-play-icon{transform:scale(1.08)}
.ctavid-duration{position:absolute;bottom:.75rem;right:.75rem;background:#000000bf;color:#fff;font-size:.8125rem;font-weight:600;padding:.2rem .5rem;border-radius:.25rem}
.ctavid-caption{font-size:.875rem;color:#6b7280;margin:.75rem 0 0}
@media (max-width:820px){
  .ctavid-inner{grid-template-columns:1fr;gap:2.5rem}
}
</style>

Props

Prop Type Default Beschrijving
headline * string - H2-kop
image * string - Thumbnail-bron
eyebrow string - Klein label boven de kop
sub string - Ondertitel
cta { label: string; href: string } - CTA-knop
videoHref string '#' Link achter de thumbnail
imageAlt string "" Alt-tekst
duration string - Duur-badge, bv. 3:24
caption string - Regel onder de thumbnail

* = verplicht