FooterRetro Footer
Retro/editorial footer met dikke bovenrand, cursieve tagline, uppercase-links en een mono contactregel.
src/components/footer/FooterRetro.astro
---
/**
* FooterRetro
* Retro/editorial footer: dikke bovenrand, logo + cursieve tagline, een kolom
* uppercase-links en een mono contactregel. Lichte zandkleurige achtergrond.
*
* Props:
* - logo: string
* - tagline?: string
* - links?: Array<{ label: string; href: string }>
* - contact?: string mono contactregel
* - copyright?: string default "© {jaar} {logo}"
* - established?: string klein mono label rechtsonder
*/
interface Props {
logo: string;
tagline?: string;
links?: { label: string; href: string }[];
contact?: string;
copyright?: string;
established?: string;
}
const {
logo,
tagline,
links = [],
contact,
copyright,
established,
} = Astro.props;
const year = new Date().getFullYear();
const copyrightText = copyright ?? `© ${year} ${logo}`;
---
<footer class="bl-section fret">
<div class="fret-top-border"></div>
<div class="bl-inner fret-inner">
<div class="fret-main">
<span class="fret-logo">{logo}</span>
{tagline && <p class="fret-tagline">{tagline}</p>}
</div>
{links.length > 0 && (
<nav class="fret-links" aria-label="Footer navigatie">
{links.map(l => <a href={l.href} class="fret-link">{l.label}</a>)}
</nav>
)}
{contact && <div class="fret-contact">{contact}</div>}
</div>
<div class="fret-bottom">
<div class="bl-inner fret-bottom-inner">
<p class="fret-copy">{copyrightText}</p>
{established && <div class="fret-mono">{established}</div>}
</div>
</div>
</footer>
<style>
.fret { padding-block: 0; background: #f5f0e8; }
.fret-top-border { height: 4px; background: #0a0a0a; }
.fret-inner {
padding-block: 2.5rem;
display: grid;
grid-template-columns: 1fr auto auto;
gap: 3rem;
align-items: start;
}
.fret-logo {
font-weight: 900;
font-size: 1.5rem;
color: #0a0a0a;
text-decoration: none;
letter-spacing: -.04em;
display: block;
margin-bottom: .5rem;
}
.fret-tagline { font-size: 1rem; color: #4b5563; font-style: italic; margin: 0; }
.fret-links { display: flex; flex-direction: column; gap: .375rem; }
.fret-link {
font-size: .875rem;
font-weight: 700;
letter-spacing: .04em;
text-transform: uppercase;
color: #0a0a0a;
text-decoration: none;
padding: .25rem 0;
border-bottom: 1px solid transparent;
transition: border-color .15s;
}
.fret-link:hover { border-bottom-color: #0a0a0a; }
.fret-contact { font-family: monospace; font-size: .875rem; color: #374151; }
.fret-bottom { border-top: 2px solid #0a0a0a; }
.fret-bottom-inner {
padding-block: .875rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.fret-copy { font-size: .875rem; color: #4b5563; margin: 0; }
.fret-mono { font-family: monospace; font-size: .8125rem; letter-spacing: .12em; color: #6b7280; }
@media (max-width: 720px) {
.fret-inner { grid-template-columns: 1fr; gap: 1.5rem; }
}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
logo * | string | - | Merknaam |
tagline | string | - | Cursieve tagline onder het logo |
links | { label: string; href: string }[] | [] | Footer navigatielinks |
contact | string | - | Mono contactregel |
copyright | string | - | Eigen copyright (auto-gegenereerd als leeg) |
established | string | - | Klein mono label rechtsonder |
* = verplicht