src/components/content/ContentGrid.astro
---
interface GridItem {
icon?: string;
title: string;
text: string;
tag?: string;
}
interface Props {
heading?: string;
subheading?: string;
columns?: 2 | 3 | 4;
items?: GridItem[];
}
const {
heading = "Onze diensten",
subheading = "Van strategie tot executie — alles onder één dak.",
columns = 3,
items = [
{ icon: "🎯", title: "Paid Search", text: "Google Ads campagnes die scoren op intent. Van zoekwoord tot conversie.", tag: "Performance" },
{ icon: "📱", title: "Social Advertising", text: "Meta, LinkedIn en TikTok campagnes die de juiste mensen bereiken op het juiste moment.", tag: "Paid Social" },
{ icon: "✍️", title: "Content Marketing", text: "Content die niet alleen gevonden wordt, maar ook converteert. Van blog tot whitepaper.", tag: "Organisch" },
{ icon: "🔍", title: "SEO", text: "Technische SEO, contentstrategie en linkbuilding voor duurzame organische groei.", tag: "Organisch" },
{ icon: "📧", title: "E-mail Marketing", text: "Geautomatiseerde e-mailflows die leads nurturen en klanten activeren.", tag: "Conversie" },
{ icon: "📊", title: "Analytics & Data", text: "Één dashboard voor alle kanalen. Altijd inzicht in wat werkt en wat niet.", tag: "Insights" },
],
} = Astro.props;
---
<section class="cgr-wrap">
<div class="cgr-header">
{heading && <h2 class="cgr-heading">{heading}</h2>}
{subheading && <p class="cgr-subheading">{subheading}</p>}
</div>
<div class={`cgr-grid cgr-grid--${columns}`}>
{items.map(item => (
<div class="cgr-card">
{item.icon && <div class="cgr-icon" aria-hidden="true">{item.icon}</div>}
<div class="cgr-card-body">
{item.tag && <span class="cgr-tag">{item.tag}</span>}
<h3 class="cgr-card-title">{item.title}</h3>
<p class="cgr-card-text">{item.text}</p>
</div>
</div>
))}
</div>
</section>
<style>
.cgr-wrap { padding: 3rem 0; }
.cgr-header {
margin-bottom: 2.5rem;
}
.cgr-heading {
font-size: 2rem;
font-weight: 800;
color: var(--color-primary, #0a0a0a);
margin: 0 0 0.5rem;
}
.cgr-subheading {
font-size: 1.1rem;
color: #666;
margin: 0;
}
.cgr-grid {
display: grid;
gap: 1.5rem;
}
.cgr-grid--2 { grid-template-columns: repeat(2, 1fr); }
.cgr-grid--3 { grid-template-columns: repeat(3, 1fr); }
.cgr-grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 900px) {
.cgr-grid--3, .cgr-grid--4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
.cgr-grid--2, .cgr-grid--3, .cgr-grid--4 { grid-template-columns: 1fr; }
}
.cgr-card {
padding: 1.75rem;
background: #fff;
border: 1px solid #e5e5e5;
border-radius: 12px;
transition: box-shadow 0.2s, transform 0.2s;
}
.cgr-card:hover {
box-shadow: 0 8px 30px rgba(0,0,0,0.08);
transform: translateY(-2px);
}
.cgr-icon {
font-size: 2rem;
margin-bottom: 1rem;
}
.cgr-tag {
display: inline-block;
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--color-accent, #6366f1);
background: #eef2ff;
padding: 0.25rem 0.6rem;
border-radius: 4px;
margin-bottom: 0.6rem;
}
.cgr-card-title {
font-size: 1.1rem;
font-weight: 700;
color: var(--color-primary, #0a0a0a);
margin: 0 0 0.5rem;
}
.cgr-card-text {
font-size: 0.9rem;
line-height: 1.65;
color: #666;
margin: 0;
}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
heading | string | — | Sectietitel |
subheading | string | — | Subtitel |
columns | 2 | 3 | 4 | — | Kolommen in het grid |
items | { icon?: string; title: string; text: string; tag?: string }[] | — | Grid items |
* = verplicht