src/components/video/VideoShowcase.astro
---
interface Props {
src?: string;
poster?: string;
title?: string;
description?: string;
cta?: string;
ctaHref?: string;
label?: string;
}
const {
src = '',
poster = '',
title = 'De BLURR aanpak in 3 minuten',
description = 'Bekijk hoe wij van strategie naar meetbaar resultaat gaan. Van de eerste briefing tot de laatste rapportage — volledig transparant en resultaatgericht.',
cta = 'Start een gesprek',
ctaHref = '#',
label = 'Featured video',
} = Astro.props;
---
<section class="vsh">
<div class="vsh__media">
<div class="vsh__player">
{src ? (
<video class="vsh__video" src={src} poster={poster || undefined} controls></video>
) : (
<div class="vsh__placeholder" aria-label="Video placeholder">
<div class="vsh__play-btn" aria-hidden="true">
<svg width="56" height="56" viewBox="0 0 56 56" fill="none">
<circle cx="28" cy="28" r="28" fill="rgba(99,102,241,0.9)"/>
<polygon points="22,16 46,28 22,40" fill="white"/>
</svg>
</div>
</div>
)}
</div>
</div>
<div class="vsh__content">
{label && <span class="vsh__label">{label}</span>}
<h2 class="vsh__title">{title}</h2>
{description && <p class="vsh__desc">{description}</p>}
{cta && <a class="vsh__cta" href={ctaHref}>{cta}</a>}
</div>
</section>
<style>
:root {
--color-accent: #6366f1;
--color-primary: #0a0a0a;
}
.vsh {
display: grid;
grid-template-columns: 3fr 2fr;
gap: 3rem;
align-items: center;
padding: 3rem 0;
}
.vsh__media {}
.vsh__player {
position: relative;
aspect-ratio: 16/9;
border-radius: 12px;
overflow: hidden;
}
.vsh__video { width: 100%; height: 100%; object-fit: cover; }
.vsh__placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #0f0f2a 0%, #1a1a4a 100%);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.vsh__label {
display: inline-block;
font-size: 0.7rem;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--color-accent, #6366f1);
margin-bottom: 0.75rem;
}
.vsh__title {
font-size: clamp(1.5rem, 3vw, 2.25rem);
font-weight: 700;
color: var(--color-primary, #0a0a0a);
margin: 0 0 1.25rem;
line-height: 1.2;
}
.vsh__desc {
font-size: 1rem;
color: #666;
line-height: 1.7;
margin: 0 0 2rem;
}
.vsh__cta {
display: inline-block;
padding: 0.85rem 2rem;
background: var(--color-accent, #6366f1);
color: #fff;
text-decoration: none;
border-radius: 8px;
font-weight: 700;
font-size: 0.95rem;
transition: opacity 0.2s;
}
.vsh__cta:hover { opacity: 0.85; }
@media (max-width: 768px) {
.vsh { grid-template-columns: 1fr; }
}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
src | string | — | Video URL |
poster | string | — | Poster URL |
title | string | — | Koptitel |
description | string | — | Beschrijvende tekst |
cta | string | — | CTA-knop label |
ctaHref | string | — | CTA-knop URL |
label | string | — | Bovenste label |
* = verplicht