CTACard CTA
Elevated card CTA — hoge impact, rounded corners, optionele achtergrondafbeelding. 4 varianten.
src/components/cta/CTACard.astro
---
/**
* CTACard
* Elevated card CTA — centered, hoge impact, optionele achtergrondafbeelding.
* Ideaal als pre-footer sectie.
*/
interface Props {
eyebrow?: string;
headline: string;
sub?: string;
ctaLabel?: string;
ctaHref?: string;
ctaSecondary?: string;
ctaSecondaryHref?: string;
backgroundImage?: string;
variant?: 'light' | 'dark' | 'accent' | 'image';
}
const {
eyebrow,
headline,
sub,
ctaLabel = 'Neem contact op',
ctaHref = '#',
ctaSecondary,
ctaSecondaryHref = '#',
backgroundImage,
variant = 'dark',
} = Astro.props;
---
<section class="ctc" data-component="cta-card">
<div class="ctc__outer">
<div class:list={['ctc__card', `ctc__card--${variant}`]}
style={backgroundImage ? `--bg-img: url('${backgroundImage}')` : ''}>
{backgroundImage && <div class="ctc__overlay"></div>}
<div class="ctc__body">
{eyebrow && <p class="ctc__eyebrow">{eyebrow}</p>}
<h2 class="ctc__headline" set:html={headline} />
{sub && <p class="ctc__sub">{sub}</p>}
<div class="ctc__ctas">
<a href={ctaHref} class="ctc__cta ctc__cta--primary">{ctaLabel}</a>
{ctaSecondary && (
<a href={ctaSecondaryHref} class="ctc__cta ctc__cta--ghost">{ctaSecondary}</a>
)}
</div>
</div>
</div>
</div>
</section>
<style>
.ctc {
padding: 4rem 1.5rem;
background: var(--color-bg, #fff);
}
.ctc__outer {
max-width: 1000px;
margin: 0 auto;
}
.ctc__card {
border-radius: calc(var(--radius, 0.5rem) * 3);
padding: 5rem 3rem;
text-align: center;
position: relative;
overflow: hidden;
}
.ctc__card--light {
background: #f5f5f7;
color: var(--color-primary, #0a0a0a);
}
.ctc__card--dark {
background: var(--color-primary, #0a0a0a);
color: #fff;
}
.ctc__card--accent {
background: var(--color-accent, #6366f1);
color: #fff;
}
.ctc__card--image {
background-image: var(--bg-img);
background-size: cover;
background-position: center;
color: #fff;
}
.ctc__overlay {
position: absolute;
inset: 0;
background: rgba(0,0,0,0.55);
}
.ctc__body {
position: relative;
z-index: 1;
}
.ctc__eyebrow {
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
opacity: 0.55;
margin-bottom: 1rem;
}
.ctc__headline {
font-size: clamp(2rem, 4vw, 3.25rem);
font-weight: 800;
line-height: 1.1;
letter-spacing: -0.03em;
margin-bottom: 1.25rem;
}
.ctc__card--light .ctc__headline {
color: var(--color-primary, #0a0a0a);
}
.ctc__headline :global(em) {
font-style: normal;
color: var(--color-accent, #6366f1);
}
.ctc__card--accent .ctc__headline :global(em),
.ctc__card--image .ctc__headline :global(em) {
color: rgba(255,255,255,0.7);
}
.ctc__sub {
font-size: 1.0625rem;
line-height: 1.6;
opacity: 0.7;
margin-bottom: 2.5rem;
max-width: 52ch;
margin-left: auto;
margin-right: auto;
}
.ctc__ctas {
display: flex;
gap: 0.875rem;
justify-content: center;
flex-wrap: wrap;
}
.ctc__cta {
display: inline-block;
padding: 0.9375rem 2rem;
border-radius: var(--radius, 0.5rem);
font-weight: 700;
font-size: 1rem;
text-decoration: none;
transition: all 0.2s;
}
.ctc__card--light .ctc__cta--primary {
background: var(--color-accent, #6366f1);
color: #fff;
}
.ctc__card--dark .ctc__cta--primary,
.ctc__card--image .ctc__cta--primary {
background: #fff;
color: var(--color-primary, #0a0a0a);
}
.ctc__card--accent .ctc__cta--primary {
background: #fff;
color: var(--color-accent, #6366f1);
}
.ctc__cta--primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
.ctc__cta--ghost {
border: 1.5px solid rgba(255,255,255,0.4);
color: inherit;
opacity: 0.75;
}
.ctc__card--light .ctc__cta--ghost {
border-color: rgba(0,0,0,0.2);
color: var(--color-primary, #0a0a0a);
}
.ctc__cta--ghost:hover { opacity: 1; }
@media (max-width: 640px) {
.ctc__card { padding: 3rem 1.5rem; }
.ctc__cta { width: 100%; text-align: center; }
.ctc__ctas { flex-direction: column; align-items: center; }
}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
headline * | string | — | CTA headline |
variant | 'light' | 'dark' | 'accent' | 'image' | 'dark' | Achtergrondvariant |
backgroundImage | string | — | Achtergrondafbeelding URL (alleen voor variant="image") |
eyebrow | string | — | Klein label boven headline |
sub | string | — | Ondertitel |
ctaLabel | string | — | Primaire CTA tekst |
* = verplicht