Zoeken...  ⌘K GitHub

FormNewsletter Forms

Nieuwsbrief-aanmeldformulier met naam en e-mail.

/form-newsletter
src/components/forms/FormNewsletter.astro
---
interface Props {
  heading?: string;
  subtext?: string;
  submitLabel?: string;
  compact?: boolean;
}

const {
  heading = "Blijf op de hoogte",
  subtext = "Ontvang maandelijks onze beste marketing insights, case studies en groeistrategie tips. Geen spam. Altijd afmeldbaar.",
  submitLabel = "Aanmelden",
  compact = false,
} = Astro.props;
---

<div class={`fnl-wrap${compact ? " fnl-wrap--compact" : ""}`}>
  {!compact && (
    <div class="fnl-header">
      {heading && <h2 class="fnl-heading">{heading}</h2>}
      {subtext && <p class="fnl-subtext">{subtext}</p>}
    </div>
  )}
  <form class="fnl-form" onsubmit="return false;" novalidate>
    {!compact && (
      <div class="fnl-row">
        <div class="fnl-field">
          <label class="fnl-label" for="fnl-name">Voornaam</label>
          <input class="fnl-input" type="text" id="fnl-name" name="first_name" placeholder="Jouw voornaam" autocomplete="given-name" />
        </div>
        <div class="fnl-field">
          <label class="fnl-label" for="fnl-email">E-mailadres *</label>
          <input class="fnl-input" type="email" id="fnl-email" name="email" placeholder="jij@bedrijf.nl" required autocomplete="email" />
        </div>
      </div>
    )}
    {compact && (
      <input class="fnl-input" type="email" name="email" placeholder="Jouw e-mailadres" required autocomplete="email" aria-label="E-mailadres" />
    )}
    {!compact && (
      <div class="fnl-checkgroup">
        <p class="fnl-check-label-head">Interesses (optioneel):</p>
        <div class="fnl-checks">
          {["Performance marketing", "SEO & content", "Social media", "Design & branding"].map(t => (
            <label class="fnl-check-item">
              <input class="fnl-check" type="checkbox" name="interests" value={t} />
              {t}
            </label>
          ))}
        </div>
      </div>
    )}
    <button class="fnl-submit" type="submit">{submitLabel}</button>
    {!compact && <p class="fnl-disclaimer">Door je aan te melden ga je akkoord met onze <a href="/privacy" class="fnl-link">privacyverklaring</a>.</p>}
  </form>
</div>

<style>
  .fnl-wrap { max-width: 560px; padding: 2rem 0; }
  .fnl-wrap--compact { max-width: 100%; padding: 0; }
  .fnl-header { margin-bottom: 1.75rem; }
  .fnl-heading {
    font-size: 1.75rem;
    font-weight: 800;
    color: var(--color-primary, #0a0a0a);
    margin: 0 0 0.5rem;
  }
  .fnl-subtext { font-size: 0.95rem; color: #666; margin: 0; }
  .fnl-form { display: flex; flex-direction: column; gap: 1.25rem; }
  .fnl-wrap--compact .fnl-form { flex-direction: row; align-items: flex-end; gap: 0.75rem; }
  .fnl-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem; }
  @media (max-width: 480px) { .fnl-row { grid-template-columns: 1fr; } }
  .fnl-field { display: flex; flex-direction: column; gap: 0.4rem; }
  .fnl-label { font-size: 0.85rem; font-weight: 600; color: var(--color-primary, #0a0a0a); }
  .fnl-input {
    padding: 0.7rem 0.9rem;
    border: 1.5px solid #ddd;
    border-radius: 8px;
    font-size: 0.95rem;
    color: var(--color-primary, #0a0a0a);
    background: #fff;
    transition: border-color 0.2s;
    font-family: inherit;
    box-sizing: border-box;
    flex: 1;
  }
  .fnl-input:focus {
    outline: none;
    border-color: var(--color-accent, #6366f1);
    box-shadow: 0 0 0 3px rgba(99,102,241,0.12);
  }
  .fnl-checkgroup { background: #f9f9f9; border-radius: 8px; padding: 1rem 1.25rem; }
  .fnl-check-label-head { font-size: 0.85rem; font-weight: 600; color: #555; margin: 0 0 0.75rem; }
  .fnl-checks { display: flex; flex-wrap: wrap; gap: 0.5rem 1.25rem; }
  .fnl-check-item { display: flex; align-items: center; gap: 0.4rem; font-size: 0.85rem; color: #444; cursor: pointer; }
  .fnl-check { accent-color: var(--color-accent, #6366f1); }
  .fnl-submit {
    padding: 0.85rem 1.75rem;
    background: var(--color-accent, #6366f1);
    color: #fff;
    border: none;
    border-radius: 8px;
    font-size: 0.95rem;
    font-weight: 600;
    cursor: pointer;
    transition: opacity 0.2s;
    white-space: nowrap;
    align-self: flex-start;
  }
  .fnl-wrap--compact .fnl-submit { align-self: auto; }
  .fnl-submit:hover { opacity: 0.88; }
  .fnl-disclaimer { font-size: 0.8rem; color: #999; margin: 0; }
  .fnl-link { color: var(--color-accent, #6366f1); }
</style>

Props

Prop Type Default Beschrijving
heading string Formuliertitel
subtext string Beschrijving
submitLabel string Knoplabel
compact boolean Compacte weergave zonder koptitel

* = verplicht