IconMasonry icon
Masonry-stijl kaarten-grid: items met icoon, titel en beschrijving. Featured items krijgen accentachtergrond.
src/components/icon/IconMasonry.astro
---
/**
* IconMasonry
* Masonry-stijl kaarten-grid met groot en klein formaat kaarten.
* Elk item heeft optioneel icoon, titel en beschrijving.
* Featured items (featured: true) krijgen een accentachtergrond.
*
* Props:
* - headline?: string
* - sub?: string
* - items: { icon?: string; title: string; description: string; featured?: boolean }[]
* - accentColor?: string default '#6366f1'
* - theme?: 'light' | 'dark' default 'light'
*/
interface Props {
headline?: string;
sub?: string;
items: { icon?: string; title: string; description: string; featured?: boolean }[];
accentColor?: string;
theme?: 'light' | 'dark';
}
const { headline, sub, items, accentColor = '#6366f1', theme = 'light' } = Astro.props;
---
<section class:list={['bl-section', 'imas', `imas--${theme}`]}>
<div class="bl-inner imas-inner" style={`--color-accent: ${accentColor}`}>
{headline && <h2 class="imas-headline">{headline}</h2>}
{sub && <p class="imas-sub">{sub}</p>}
<div class="imas-grid">
{items.map(item => (
<div class:list={['imas-card', item.featured && 'imas-card--featured']}>
{item.icon && <span class="imas-icon" aria-hidden="true">{item.icon}</span>}
<h3 class="imas-title">{item.title}</h3>
<p class="imas-desc">{item.description}</p>
</div>
))}
</div>
</div>
</section>
<style>
.imas--light { background: var(--color-bg, #fff); }
.imas--dark { background: #0a0a0a; }
.imas-headline {
font-size: clamp(1.75rem, 3vw, 2.25rem);
font-weight: 800;
color: var(--color-primary, #0a0a0a);
margin: 0 0 .75rem;
letter-spacing: -.02em;
}
.imas--dark .imas-headline { color: #e8e8e8; }
.imas-sub {
font-size: 1.0625rem;
color: #6b7280;
margin: 0 0 2rem;
line-height: 1.6;
}
.imas--dark .imas-sub { color: #aaa; }
.imas-grid {
columns: 2;
gap: 1rem;
}
@media (max-width: 600px) {
.imas-grid { columns: 1; }
}
.imas-card {
break-inside: avoid;
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 1.25rem;
margin-bottom: 1rem;
display: flex;
flex-direction: column;
gap: .5rem;
transition: transform .2s, box-shadow .2s;
}
.imas-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px color-mix(in srgb, var(--color-accent) 15%, transparent);
}
.imas--dark .imas-card {
background: #111;
border-color: #333;
}
.imas-card--featured {
background: color-mix(in srgb, var(--color-accent) 8%, #f8f8ff);
border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);
}
.imas--dark .imas-card--featured {
background: color-mix(in srgb, var(--color-accent) 12%, #111);
border-color: color-mix(in srgb, var(--color-accent) 30%, transparent);
}
.imas-icon { font-size: 1.5rem; }
.imas-title {
margin: 0;
font-size: 1rem;
font-weight: 700;
color: var(--color-primary, #0a0a0a);
}
.imas--dark .imas-title { color: #e8e8e8; }
.imas-desc {
margin: 0;
font-size: .9rem;
line-height: 1.6;
color: #6b7280;
}
.imas--dark .imas-desc { color: #aaa; }
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
headline | string | - | Optionele sectiekop |
sub | string | - | Optionele subtekst |
items * | { icon?: string; title: string; description: string; featured?: boolean }[] | - | Kaart-items; featured items krijgen accentachtergrond |
accentColor | string | '#6366f1' | Kleur voor featured-kaarten |
theme | 'light' | 'dark' | 'light' | Achtergrondmodus |
* = verplicht