src/components/video/VideoIntro.astro
---
interface Props {
src?: string;
poster?: string;
eyebrow?: string;
title?: string;
body?: string;
bullets?: string[];
}
const {
src = '',
poster = '',
eyebrow = 'Hoe wij werken',
title = 'Strategie, executie en groei — in één team',
body = 'Geen grote bureaustructuren of losse freelancers. BLURR is een geïntegreerd team dat verantwoordelijkheid neemt van briefing tot resultaat.',
bullets = [
'Eén aanspreekpunt, volledige verantwoordelijkheid',
'Data-gedreven beslissingen in elke stap',
'Maandelijkse rapportages met harde cijfers',
],
} = Astro.props;
---
<section class="vit">
<div class="vit__text">
{eyebrow && <p class="vit__eyebrow">{eyebrow}</p>}
<h2 class="vit__title">{title}</h2>
<p class="vit__body">{body}</p>
{bullets.length > 0 && (
<ul class="vit__bullets">
{bullets.map((b) => (
<li class="vit__bullet">
<span class="vit__bullet-icon" aria-hidden="true">✓</span>
{b}
</li>
))}
</ul>
)}
</div>
<div class="vit__media">
<div class="vit__player">
{src ? (
<video class="vit__video" src={src} poster={poster || undefined} controls></video>
) : (
<div class="vit__placeholder" aria-label="Intro video placeholder">
<div class="vit__play-icon" aria-hidden="true">
<svg width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="25" fill="rgba(99,102,241,0.85)"/>
<polygon points="20,14 40,25 20,36" fill="#fff"/>
</svg>
</div>
<span class="vit__duration-hint">3:28</span>
</div>
)}
</div>
</div>
</section>
<style>
:root {
--color-accent: #6366f1;
--color-primary: #0a0a0a;
}
.vit {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
align-items: center;
padding: 3rem 0;
}
.vit__eyebrow {
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--color-accent, #6366f1);
margin: 0 0 0.75rem;
}
.vit__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;
}
.vit__body {
font-size: 1.05rem;
color: #666;
line-height: 1.7;
margin: 0 0 1.75rem;
}
.vit__bullets {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.vit__bullet {
display: flex;
align-items: flex-start;
gap: 0.6rem;
font-size: 0.95rem;
color: #444;
line-height: 1.5;
}
.vit__bullet-icon {
color: var(--color-accent, #6366f1);
font-weight: 700;
flex-shrink: 0;
margin-top: 0.1em;
}
.vit__player {
aspect-ratio: 16/9;
border-radius: 12px;
overflow: hidden;
}
.vit__video { width: 100%; height: 100%; object-fit: cover; }
.vit__placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #0a0a20 0%, #1a1a40 100%);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1rem;
cursor: pointer;
}
.vit__duration-hint {
font-size: 0.8rem;
color: rgba(255,255,255,0.5);
font-weight: 600;
}
@media (max-width: 768px) {
.vit { grid-template-columns: 1fr; gap: 2rem; }
}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
src | string | — | Video URL |
poster | string | — | Poster URL |
eyebrow | string | — | Klein label boven de titel |
title | string | — | Hoofdtitel |
body | string | — | Inleidende tekst |
bullets | string[] | — | Bulletpunten |
* = verplicht