Zoeken...  ⌘K GitHub

FormReview Forms

Reviewformulier met sterrenbeoordeling.

/form-review
src/components/forms/FormReview.astro
---
interface Props {
  heading?: string;
  subtext?: string;
  submitLabel?: string;
  productOrService?: string;
}

const {
  heading = "Laat een review achter",
  subtext = "Jouw eerlijke mening helpt andere bedrijven een weloverwogen keuze te maken.",
  submitLabel = "Review plaatsen",
  productOrService = "BLURR Marketing",
} = Astro.props;
---

<div class="frv-wrap">
  <div class="frv-header">
    {heading && <h2 class="frv-heading">{heading}</h2>}
    {subtext && <p class="frv-subtext">{subtext}</p>}
  </div>
  <form class="frv-form" onsubmit="return false;" novalidate>
    <div class="frv-stars-field">
      <span class="frv-label">Jouw beoordeling van {productOrService} *</span>
      <div class="frv-stars" role="group" aria-label="Sterren beoordeling">
        {[5,4,3,2,1].map(n => (
          <label class="frv-star" aria-label={`${n} ster${n !== 1 ? "ren" : ""}`}>
            <input class="frv-star-input" type="radio" name="rating" value={n} required />
            <span class="frv-star-icon" aria-hidden="true">★</span>
          </label>
        ))}
      </div>
    </div>
    <div class="frv-row">
      <div class="frv-field">
        <label class="frv-label" for="frv-name">Naam *</label>
        <input class="frv-input" type="text" id="frv-name" name="name" placeholder="Jouw naam" required autocomplete="name" />
      </div>
      <div class="frv-field">
        <label class="frv-label" for="frv-company">Bedrijf</label>
        <input class="frv-input" type="text" id="frv-company" name="company" placeholder="Bedrijfsnaam" autocomplete="organization" />
      </div>
    </div>
    <div class="frv-field">
      <label class="frv-label" for="frv-title">Titel van je review *</label>
      <input class="frv-input" type="text" id="frv-title" name="title" placeholder="Bijv. Uitstekende samenwerking, resultaten overtroffen onze verwachtingen" required />
    </div>
    <div class="frv-field">
      <label class="frv-label" for="frv-review">Jouw review *</label>
      <textarea class="frv-textarea" id="frv-review" name="review" rows="5" placeholder="Deel jouw ervaring met BLURR. Wat heeft je het meest geholpen? Wat zou je andere bedrijven aanraden?" required></textarea>
      <span class="frv-hint">Minimaal 50 tekens voor een goede review.</span>
    </div>
    <div class="frv-field">
      <label class="frv-label">Wat waardeer je het meest?</label>
      <div class="frv-tags">
        {["Communicatie", "Resultaten", "Snelheid", "Creativiteit", "Kennis & expertise", "Transparantie", "Prijs-kwaliteit"].map(t => (
          <label class="frv-tag-item">
            <input class="frv-tag-check" type="checkbox" name="highlights" value={t} />
            <span>{t}</span>
          </label>
        ))}
      </div>
    </div>
    <label class="frv-check-label">
      <input class="frv-check" type="checkbox" name="public_consent" required />
      Ik geef toestemming om deze review publiek te plaatsen
    </label>
    <button class="frv-submit" type="submit">{submitLabel}</button>
  </form>
</div>

<style>
  .frv-wrap { max-width: 600px; padding: 2rem 0; }
  .frv-header { margin-bottom: 1.75rem; }
  .frv-heading { font-size: 1.75rem; font-weight: 800; color: var(--color-primary, #0a0a0a); margin: 0 0 0.5rem; }
  .frv-subtext { font-size: 0.95rem; color: #666; margin: 0; }
  .frv-form { display: flex; flex-direction: column; gap: 1.25rem; }
  .frv-stars-field { display: flex; flex-direction: column; gap: 0.5rem; }
  .frv-label { font-size: 0.85rem; font-weight: 600; color: var(--color-primary, #0a0a0a); }
  .frv-stars {
    display: flex; flex-direction: row-reverse; gap: 0.25rem;
    width: fit-content;
  }
  .frv-star { cursor: pointer; }
  .frv-star-input { display: none; }
  .frv-star-icon { font-size: 2rem; color: #ddd; transition: color 0.1s; display: block; }
  .frv-star:hover .frv-star-icon,
  .frv-star:hover ~ .frv-star .frv-star-icon { color: #f59e0b; }
  .frv-star-input:checked ~ .frv-star .frv-star-icon,
  .frv-star:has(.frv-star-input:checked) .frv-star-icon { color: #f59e0b; }
  .frv-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem; }
  @media (max-width: 480px) { .frv-row { grid-template-columns: 1fr; } }
  .frv-field { display: flex; flex-direction: column; gap: 0.4rem; }
  .frv-input, .frv-textarea {
    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; width: 100%;
  }
  .frv-input:focus, .frv-textarea:focus { outline: none; border-color: var(--color-accent, #6366f1); box-shadow: 0 0 0 3px rgba(99,102,241,0.12); }
  .frv-textarea { resize: vertical; min-height: 120px; }
  .frv-hint { font-size: 0.75rem; color: #999; }
  .frv-tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }
  .frv-tag-item { display: flex; align-items: center; gap: 0.4rem; padding: 0.4rem 0.9rem; background: #f5f5f5; border-radius: 20px; font-size: 0.83rem; color: #444; cursor: pointer; border: 1.5px solid transparent; }
  .frv-tag-item:has(input:checked) { background: #eef2ff; color: var(--color-accent, #6366f1); border-color: var(--color-accent, #6366f1); }
  .frv-tag-check { display: none; }
  .frv-check-label { display: flex; align-items: flex-start; gap: 0.5rem; font-size: 0.83rem; color: #555; cursor: pointer; }
  .frv-check { accent-color: var(--color-accent, #6366f1); flex-shrink: 0; margin-top: 2px; }
  .frv-submit {
    padding: 0.9rem 2rem; background: var(--color-accent, #6366f1); color: #fff;
    border: none; border-radius: 8px; font-size: 1rem; font-weight: 600;
    cursor: pointer; transition: opacity 0.2s; align-self: flex-start;
  }
  .frv-submit:hover { opacity: 0.88; }
</style>

Props

Prop Type Default Beschrijving
headline string Formuliertitel
product string Product naam

* = verplicht