src/components/image/ImageWithStats.astro
---
interface Stat {
value: string;
label: string;
}
interface Props {
src?: string;
alt?: string;
stats?: Stat[];
}
const {
src = '',
alt = 'Resultaten afbeelding',
stats = [
{ value: '+340%', label: 'Omzetgroei' },
{ value: '4.2x', label: 'ROAS gemiddeld' },
{ value: '80+', label: 'Tevreden klanten' },
{ value: '12jr', label: 'Ervaring' },
],
} = Astro.props;
---
<div class="iws">
<div class="iws__media">
{src ? (
<img class="iws__img" src={src} alt={alt} />
) : (
<div class="iws__placeholder" aria-label={alt}></div>
)}
</div>
<div class="iws__stats">
{stats.map((s) => (
<div class="iws__stat">
<span class="iws__value">{s.value}</span>
<span class="iws__label">{s.label}</span>
</div>
))}
</div>
</div>
<style>
:root {
--color-accent: #6366f1;
--color-primary: #0a0a0a;
}
.iws {
position: relative;
border-radius: 12px;
overflow: hidden;
}
.iws__media {
aspect-ratio: 16/9;
}
.iws__img {
width: 100%;
height: 100%;
object-fit: cover;
}
.iws__placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #1a2a4a 0%, #2a3a6a 100%);
}
.iws__stats {
position: absolute;
bottom: 0;
left: 0;
right: 0;
display: grid;
grid-template-columns: repeat(4, 1fr);
background: rgba(10,10,10,0.85);
backdrop-filter: blur(8px);
padding: 1.25rem;
gap: 1rem;
}
.iws__stat {
text-align: center;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.iws__value {
font-size: 1.5rem;
font-weight: 800;
color: var(--color-accent, #6366f1);
line-height: 1;
}
.iws__label {
font-size: 0.7rem;
font-weight: 600;
color: rgba(255,255,255,0.7);
text-transform: uppercase;
letter-spacing: 0.08em;
}
@media (max-width: 640px) {
.iws__stats { grid-template-columns: repeat(2, 1fr); position: static; }
.iws__stat { padding: 0.75rem; }
}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
src | string | — | Afbeelding URL |
alt | string | — | Alt-tekst |
stats | { value: string; label: string }[] | — | Statistieken naast de afbeelding |
* = verplicht