CtaUrgent CTA
Schaarste-CTA: urgentie-badge, kop, voortgangsbalk met resterende plekken, deadline en één knop.
src/components/cta/CtaUrgent.astro
---
/**
* CtaUrgent
* Schaarste-CTA: urgentie-badge, kop, sub, een voortgangsbalk met
* resterende plekken en een deadline-regel, plus één knop. Light.
*
* Props:
* - urgency?: string badge bovenaan
* - headline: string
* - sub?: string
* - spotsFilled?: number percentage gevuld (0-100) voor de balk
* - spotsText?: string tekst onder de balk (HTML toegestaan voor <strong>)
* - deadline?: string deadline-regel
* - cta?: { label: string; href: string }
*/
interface Props {
urgency?: string;
headline: string;
sub?: string;
spotsFilled?: number;
spotsText?: string;
deadline?: string;
cta?: { label: string; href: string };
}
const {
urgency,
headline,
sub,
spotsFilled = 0,
spotsText,
deadline,
cta,
} = Astro.props;
const fill = Math.max(0, Math.min(100, spotsFilled));
---
<section class:list={['bl-section', 'ctaurg']}>
<div class="bl-inner bl-inner--narrow ctaurg-inner">
{urgency && <span class="ctaurg-urgency">{urgency}</span>}
<h2 class="ctaurg-headline">{headline}</h2>
{sub && <p class="ctaurg-sub">{sub}</p>}
{(spotsText || deadline) && (
<div class="ctaurg-signals">
{spotsText && (
<div class="ctaurg-signal">
<div class="ctaurg-bar">
<div class="ctaurg-bar-fill" style={`width:${fill}%`}></div>
</div>
<span class="ctaurg-spots" set:html={spotsText}></span>
</div>
)}
{deadline && <p class="ctaurg-deadline">{deadline}</p>}
</div>
)}
{cta && <a href={cta.href} class="ctaurg-btn">{cta.label}</a>}
</div>
</section>
<style>
.ctaurg{background:#fff7ed;border:1px solid #fed7aa}
.ctaurg-inner{text-align:center}
.ctaurg-urgency{display:inline-block;padding:.3125rem .875rem;background:#ff6b35;color:#fff;font-size:.8125rem;font-weight:700;border-radius:2rem;margin-bottom:1.5rem}
.ctaurg-headline{font-size:clamp(1.75rem,3.5vw,2.5rem);font-weight:900;color:#0a0a0a;letter-spacing:-.04em;line-height:1.15;margin:0 0 .875rem}
.ctaurg-sub{font-size:1.125rem;color:#6b7280;line-height:1.65;margin:0 0 1.75rem}
.ctaurg-signals{margin-bottom:2rem;display:flex;flex-direction:column;gap:.875rem;align-items:center}
.ctaurg-signal{width:100%;max-width:400px}
.ctaurg-bar{height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden;margin-bottom:.375rem}
.ctaurg-bar-fill{height:100%;background:linear-gradient(90deg,#10b981,#059669);border-radius:4px}
.ctaurg-spots{font-size:.9375rem;color:#374151}
.ctaurg-deadline{font-size:.9375rem;color:#92400e;font-weight:500;margin:0}
.ctaurg-btn{display:inline-flex;align-items:center;padding:.9375rem 2.5rem;background:#0a0a0a;color:#fff;font-weight:700;font-size:1rem;border-radius:.5rem;text-decoration:none;transition:opacity .2s}
.ctaurg-btn:hover{opacity:.85}
</style>
Props
| Prop | Type | Default | Beschrijving |
|---|---|---|---|
headline * | string | - | H2-kop |
urgency | string | - | Urgentie-badge bovenaan |
sub | string | - | Ondertitel |
spotsFilled | number | 0 | Percentage gevuld (0-100) voor de balk |
spotsText | string | - | Tekst onder de balk (HTML toegestaan voor <strong>) |
deadline | string | - | Deadline-regel |
cta | { label: string; href: string } | - | CTA-knop |
* = verplicht