FooterGrid Footer
Lichte footer met merk-kolom en vier link-kolommen in een vast raster; copyright + secundaire links onderaan.
src/components/footer/FooterGrid.astro
---
/**
* FooterGrid — lichte footer met merk-kolom en vier link-kolommen in een vast
* raster. Onderaan copyright + secundaire links.
*
* Props:
* - logo?: string
* - logoHref?: string
* - tagline?: string
* - socials?: { label: string; href: string; icon?: string }[]
* - columns?: { title: string; links: { label: string; href: string }[] }[]
* - bottomLinks?: { label: string; href: string }[]
* - copyright?: string (default: "© {jaar}")
*/
interface FooterColumn {
title: string;
links: { label: string; href: string }[];
}
interface Props {
logo?: string;
logoHref?: string;
tagline?: string;
socials?: { label: string; href: string; icon?: string }[];
columns?: FooterColumn[];
bottomLinks?: { label: string; href: string }[];
copyright?: string;
}
const {
logo = 'Merk',
logoHref = '/',
tagline = 'Meetbare marketing voor ambitieuze bedrijven.',
socials = [
{ label: 'LinkedIn', href: '#', icon: 'in' },
{ label: 'Instagram', href: '#', icon: 'ig' },
],
columns = [
{ title: 'Diensten', links: [
{ label: 'Google Ads', href: '#' },
{ label: 'Meta Ads', href: '#' },
{ label: 'SEO', href: '#' },
{ label: 'E-mail', href: '#' },
] },
{ title: 'Bureau', links: [
{ label: 'Over ons', href: '#' },
{ label: 'Cases', href: '#' },
{ label: 'Blog', href: '#' },
] },
{ title: 'Support', links: [
{ label: 'FAQ', href: '#' },
{ label: 'Contact', href: '#' },
{ label: 'Status', href: '#' },
] },
{ title: 'Juridisch', links: [
{ label: 'Privacy', href: '#' },
{ label: 'Voorwaarden', href: '#' },
{ label: 'Cookies', href: '#' },
] },
],
bottomLinks = [
{ label: 'Sitemap', href: '#' },
{ label: 'Toegankelijkheid', href: '#' },
],
copyright,
} = Astro.props;
const year = new Date().getFullYear();
const copyrightText = copyright ?? `© ${year}`;
---
<footer class="bl-section fgrid">
<div class="bl-inner fgrid-inner">
<div class="fgrid-brand">
<a href={logoHref} class="fgrid-logo">{logo}</a>
{tagline && <p class="fgrid-tagline">{tagline}</p>}
{socials.length > 0 && (
<div class="fgrid-socials">
{socials.map(s => <a href={s.href} class="fgrid-social" aria-label={s.label}>{s.icon}</a>)}
</div>
)}
</div>
{columns.map(col => (
<div class="fgrid-col">
<h4 class="fgrid-col-title">{col.title}</h4>
<ul class="fgrid-col-links">
{col.links.map(l => <li><a href={l.href} class="fgrid-col-link">{l.label}</a></li>)}
</ul>
</div>
))}
</div>
<div class="fgrid-bottom">
<div class="bl-inner fgrid-bottom-inner">
<p class="fgrid-copy">{copyrightText}</p>
{bottomLinks.length > 0 && (
<nav class="fgrid-bottom-links">
{bottomLinks.map(l => <a href={l.href} class="fgrid-bottom-link">{l.label}</a>)}
</nav>
)}
</div>
</div>
</footer>
<style>
.fgrid{background:#fff;border-top:1px solid #e5e7eb;padding-block:0}
.fgrid-inner{padding-block:3.5rem 2rem;display:grid;grid-template-columns:repeat(5,1fr);gap:2.5rem}
.fgrid-logo{font-weight:900;font-size:1.125rem;color:#0a0a0a;text-decoration:none;letter-spacing:-.03em;display:block;margin-bottom:.75rem}
.fgrid-tagline{font-size:.9375rem;color:#4b5563;line-height:1.6;margin:0 0 1.25rem}
.fgrid-socials{display:flex;gap:.5rem}
.fgrid-social{width:32px;height:32px;border-radius:.375rem;background:#f1f5f9;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:600;text-decoration:none;color:#374151;transition:background-color .15s,color .15s}
.fgrid-social:hover{background:var(--color-accent,#6366f1);color:#fff}
.fgrid-col-title{font-size:.6875rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#6b7280;margin:0 0 .875rem}
.fgrid-col-links{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.5rem}
.fgrid-col-link{font-size:.9375rem;color:#374151;text-decoration:none;transition:color .15s}
.fgrid-col-link:hover{color:var(--color-accent,#6366f1)}
.fgrid-bottom{border-top:1px solid #f1f5f9}
.fgrid-bottom-inner{padding-block:1.25rem;display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.fgrid-copy{font-size:.8125rem;color:#6b7280;margin:0}
.fgrid-bottom-links{display:flex;gap:1.5rem}
.fgrid-bottom-link{font-size:.8125rem;color:#6b7280;text-decoration:none;transition:color .15s}
.fgrid-bottom-link:hover{color:#0a0a0a}
@media(max-width:900px){.fgrid-inner{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.fgrid-inner{grid-template-columns:1fr 1fr}}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
logo | string | 'Merk' | Merknaam |
logoHref | string | '/' | Link van het logo |
tagline | string | - | Korte omschrijving |
socials | { label; href; icon? }[] | - | Social-media links |
columns | { title; links: { label; href }[] }[] | - | Link-kolommen |
bottomLinks | { label; href }[] | - | Secundaire links onderaan |
copyright | string | '© {jaar}' | Copyright-regel |
* = verplicht