/* global React, ReactDOM */
const { useState, useEffect } = React;

// ============================================
// Icons (line, minimal)
// ============================================
const Icon = {
  Phone: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/>
    </svg>
  ),
  Whatsapp: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/>
    </svg>
  ),
  Mail: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/>
      <polyline points="22,6 12,13 2,6"/>
    </svg>
  ),
  ArrowRight: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <line x1="5" y1="12" x2="19" y2="12"/>
      <polyline points="12,5 19,12 12,19"/>
    </svg>
  ),
  Menu: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <line x1="4" y1="7" x2="20" y2="7"/>
      <line x1="4" y1="12" x2="20" y2="12"/>
      <line x1="4" y1="17" x2="20" y2="17"/>
    </svg>
  ),
  Close: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <line x1="6" y1="6" x2="18" y2="18"/>
      <line x1="18" y1="6" x2="6" y2="18"/>
    </svg>
  ),
};

// ============================================
// Header
// ============================================
function DemoBar() {
  return (
    <div className="demobar">
      <div className="container demobar__inner">
        <span className="demobar__tag">24/7</span>
        <span className="demobar__text">Bij overlijden zijn wij dag en nacht bereikbaar. <strong>020 123 4567</strong></span>
        <a href="#contact" className="demobar__cta">Direct contact <Icon.ArrowRight /></a>
      </div>
    </div>
  );
}

function Header() {
  const [open, setOpen] = useState(false);

  // Auto-close when crossing into desktop layout (e.g. orientation change)
  useEffect(() => {
    const mql = window.matchMedia('(min-width: 880px)');
    const onChange = (e) => { if (e.matches) setOpen(false); };
    mql.addEventListener('change', onChange);
    return () => mql.removeEventListener('change', onChange);
  }, []);

  useEffect(() => {
    if (!open) return;

    const onKey = (e) => { if (e.key === 'Escape') setOpen(false); };
    document.addEventListener('keydown', onKey);

    // iOS-safe scroll lock: fix body and restore scroll position on close
    const scrollY = window.scrollY;
    const body = document.body;
    const prev = {
      position: body.style.position,
      top: body.style.top,
      left: body.style.left,
      right: body.style.right,
      width: body.style.width,
    };
    body.style.position = 'fixed';
    body.style.top = `-${scrollY}px`;
    body.style.left = '0';
    body.style.right = '0';
    body.style.width = '100%';

    return () => {
      document.removeEventListener('keydown', onKey);
      body.style.position = prev.position;
      body.style.top = prev.top;
      body.style.left = prev.left;
      body.style.right = prev.right;
      body.style.width = prev.width;
      window.scrollTo(0, scrollY);
    };
  }, [open]);

  const close = () => setOpen(false);

  return (
    <React.Fragment>
      <header className={`header ${open ? 'header--menu-open' : ''}`}>
        <div className="container header__inner">
          <a href="#" className="brand" aria-label="Begrafenisondernemer.nl">
            <span className="brand__logo" aria-hidden="true">
              <svg viewBox="0 0 32 32" width="28" height="28" fill="none" stroke="currentColor" strokeWidth="1.25">
                <circle cx="16" cy="16" r="13" />
                <path d="M16 5 v22 M5 16 h22" strokeWidth="0.75" opacity="0.4" />
                <circle cx="16" cy="16" r="3" fill="currentColor" stroke="none" />
              </svg>
            </span>
            <span className="brand__name">
              <span className="brand__mark">Begrafenisondernemer</span><span className="brand__tld">.nl</span>
            </span>
          </a>
          <nav className="nav">
            <a href="#diensten">Onze zorg</a>
            <a href="#werkwijze">Werkwijze</a>
            <a href="#overons">Over ons</a>
            <a href="#tarieven">Tarieven</a>
            <a href="#contact">Contact</a>
          </nav>
          <a href="tel:+31201234567" className="header__phone">
            <span className="dot"></span>
            <span>24 uur, <strong>020 123 4567</strong></span>
          </a>
          <button
            type="button"
            className={`header__toggle ${open ? 'header__toggle--open' : ''}`}
            aria-label={open ? 'Menu sluiten' : 'Menu openen'}
            aria-expanded={open}
            aria-controls="mobile-menu"
            onClick={() => setOpen((o) => !o)}
          >
            <span className="header__toggle-bars" aria-hidden="true">
              <span></span>
              <span></span>
              <span></span>
            </span>
          </button>
        </div>
      </header>

      <div
        className={`mobile-menu__backdrop ${open ? 'mobile-menu__backdrop--open' : ''}`}
        onClick={close}
        aria-hidden="true"
      />

      <aside
        id="mobile-menu"
        className={`mobile-menu ${open ? 'mobile-menu--open' : ''}`}
        role="dialog"
        aria-modal="true"
        aria-label="Hoofdmenu"
        aria-hidden={!open}
      >
        <div className="mobile-menu__head">
          <span className="mobile-menu__eyebrow">Menu</span>
          <button
            type="button"
            className="mobile-menu__close"
            aria-label="Menu sluiten"
            onClick={close}
          >
            <Icon.Close />
          </button>
        </div>
        <nav className="mobile-menu__nav" onClick={close}>
          <a href="#diensten"><span>Onze zorg</span><Icon.ArrowRight /></a>
          <a href="#werkwijze"><span>Werkwijze</span><Icon.ArrowRight /></a>
          <a href="#overons"><span>Over ons</span><Icon.ArrowRight /></a>
          <a href="#tarieven"><span>Tarieven</span><Icon.ArrowRight /></a>
          <a href="#werkgebied"><span>Werkgebied</span><Icon.ArrowRight /></a>
          <a href="#contact"><span>Contact</span><Icon.ArrowRight /></a>
        </nav>
        <div className="mobile-menu__foot">
          <p className="mobile-menu__note">Bij overlijden zijn wij dag en nacht bereikbaar.</p>
          <a href="tel:+31201234567" className="mobile-menu__phone" onClick={close}>
            <Icon.Phone /> 020 123 4567
          </a>
          <div className="mobile-menu__actions">
            <a href="https://wa.me/31201234567" className="mobile-menu__action" onClick={close}>
              <Icon.Whatsapp /> WhatsApp
            </a>
            <a href="mailto:info@begrafenisondernemer.nl" className="mobile-menu__action" onClick={close}>
              <Icon.Mail /> E-mail
            </a>
          </div>
        </div>
      </aside>
    </React.Fragment>
  );
}

// ============================================
// Hero
// ============================================
function Hero({ heroImage }) {
  return (
    <section className="hero">
      <div className="container">
        <div className="hero__grid">
          <div className="hero__copy">
            <p className="eyebrow">Uitvaartzorg sinds 1998</p>
            <h1 className="hero__title">
              In stilte<br />
              <em>begeleiden</em> wij<br />
              u verder.
            </h1>
            <p className="hero__lede">
              Bij een overlijden hoeft u niets meteen te weten of te beslissen. Wij komen langs, luisteren, en regelen samen met u wat nodig is, in uw eigen tempo.
            </p>
            <div className="hero__contact">
              <span className="hero__contact-label">Dag en nacht bereikbaar</span>
              <a href="tel:+31201234567" className="hero__phone">020 123 4567</a>
              <span className="hero__avail">
                <span className="dot"></span>
                Ook 's nachts en in het weekend
              </span>
            </div>
          </div>
          <figure className="hero__image">
            <img src={heroImage} alt="Zacht ochtendlicht door takken in een rustig landschap" />
          </figure>
        </div>
        <div className="hero__meta">
          <div className="hero__meta-item">
            <span className="hero__meta-num">28 jaar</span>
            <span className="hero__meta-label">ervaring</span>
          </div>
          <div className="hero__meta-item">
            <span className="hero__meta-num">Klein team</span>
            <span className="hero__meta-label">van drie</span>
          </div>
          <div className="hero__meta-item">
            <span className="hero__meta-num">Aangesloten</span>
            <span className="hero__meta-label">bij BGNU</span>
          </div>
          <div className="hero__meta-item">
            <span className="hero__meta-num">Noord-Holland</span>
            <span className="hero__meta-label">en het Gooi</span>
          </div>
        </div>
      </div>
    </section>
  );
}

// ============================================
// Direct contact bar
// ============================================
function ContactBar() {
  return (
    <section className="contactbar">
      <div className="container">
        <div className="contactbar__inner">
          <div>
            <p className="contactbar__lede">Iemand overleden?</p>
            <p className="contactbar__sub">Belt u ons gerust direct, ook buiten kantooruren.</p>
          </div>
          <div></div>
          <a href="tel:+31201234567" className="contactbar__btn contactbar__btn--solid">
            <Icon.Phone /> 020 123 4567
          </a>
          <a href="https://wa.me/31612345678" className="contactbar__btn">
            <Icon.Whatsapp /> WhatsApp
          </a>
        </div>
      </div>
    </section>
  );
}

// ============================================
// Diensten
// ============================================
const DIENSTEN = [
  {
    n: '01',
    title: 'Uitvaartbegeleiding',
    body: 'Persoonlijke begeleiding van het eerste gesprek tot de dag zelf. Wij regelen wat geregeld moet worden, en geven u de ruimte om er voor uw naasten te zijn.',
  },
  {
    n: '02',
    title: 'Begrafenis',
    body: 'Een uitvaart op een begraafplaats van uw keuze, in alle rust voorbereid. Wij verzorgen de samenwerking met de begraafplaats en alle formaliteiten.',
  },
  {
    n: '03',
    title: 'Crematie',
    body: 'Een crematieplechtigheid in een crematorium in de regio, of op een andere passende locatie. Met of zonder ceremonie, geheel zoals u wenst.',
  },
  {
    n: '04',
    title: 'Voorregeling',
    body: 'Voor wie zelf wil vastleggen hoe afscheid genomen wordt. Een rustig gesprek aan tafel, geen verplichtingen, alles helder op papier voor uw nabestaanden.',
  },
];

function Diensten() {
  return (
    <section id="diensten" className="section">
      <div className="container">
        <div className="diensten__head">
          <div className="diensten__intro">
            <p className="eyebrow">Wat wij doen</p>
            <h2 className="kicker">Vier vormen van zorg.</h2>
            <p className="intro-lede">Iedere uitvaart is anders. Wij richten ons op wat past bij de overledene en bij u, niet op wat gangbaar is.</p>
            <p className="intro-lede">
              Of u kiest voor een begrafenis op een begraafplaats van uw keuze of een crematie in alle rust, wij begeleiden u vanaf het eerste gesprek tot de dag zelf, en regelen wat geregeld moet worden zodat u er voor uw naasten kunt zijn.
            </p>
            <p className="intro-lede">
              Voor wie zelf wil vastleggen hoe afscheid genomen wordt, bieden wij een vrijblijvende voorregeling aan tafel. Geen verplichtingen, alles helder op papier voor uw nabestaanden.
            </p>
          </div>
          <figure className="diensten__image">
            <img src="img/UitvaartVervoer.png" alt="Uitvaartvervoer onderweg" />
          </figure>
        </div>
        <div className="diensten__grid">
          {DIENSTEN.map((d) => (
            <div key={d.n} className="dienst">
              <span className="dienst__num">{d.n}</span>
              <h3 className="dienst__title">{d.title}</h3>
              <p className="dienst__body">{d.body}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ============================================
// Werkwijze
// ============================================
const STAPPEN = [
  {
    n: 'I',
    title: 'U belt ons',
    body: 'U bereikt ons direct, dag en nacht. Wij luisteren eerst, er hoeven nog geen beslissingen genomen te worden. Vaak is een afspraak voor een huisbezoek de eerste stap.',
  },
  {
    n: 'II',
    title: 'Wij komen bij u langs',
    body: 'Bij u thuis of op een andere plek waar u zich op uw gemak voelt. We maken samen een eerste plan, en bespreken wat er praktisch geregeld moet worden.',
  },
  {
    n: 'III',
    title: 'Voorbereiding in uw tempo',
    body: 'In de dagen die volgen vullen we het plan verder in. Locatie, kist of mand, muziek, sprekers, bloemen, kaarten. Niets hoeft, alles kan.',
  },
  {
    n: 'IV',
    title: 'De afscheidsdag',
    body: 'Wij zijn er die dag van begin tot eind. U hoeft alleen aanwezig te zijn, voor uzelf en voor uw naasten.',
  },
  {
    n: 'V',
    title: 'Nazorg',
    body: 'Een paar weken na de uitvaart komen wij nog eens langs. Voor het afronden van papieren, en om te horen hoe het met u gaat.',
  },
];

function Werkwijze() {
  return (
    <section id="werkwijze" className="section werkwijze">
      <div className="container">
        <div className="werkwijze__intro">
          <p className="eyebrow">Werkwijze</p>
          <h2 className="werkwijze__title">Wat er gebeurt nadat u belt.</h2>
          <p className="werkwijze__lede">
            U hoeft niets voor te bereiden. Het enige wat van u verwacht wordt, is dat u belt. De rest komt op zijn tijd.
          </p>
        </div>
        <div className="steps">
          {STAPPEN.map((s) => (
            <div key={s.n} className="step">
              <span className="step__num">{s.n}</span>
              <h3 className="step__title">{s.title}</h3>
              <p className="step__body">{s.body}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ============================================
// Over ons
// ============================================
function OverOns({ portraitImage }) {
  return (
    <section id="overons" className="section">
      <div className="container">
        <div className="overons__grid">
          <div className="overons__portrait">
            <img src={portraitImage} alt="Portret van uitvaartverzorger Marieke Vermeer in haar werkkamer" />
          </div>
          <div>
            <p className="eyebrow">Over ons</p>
            <h2 className="overons__title">Een klein bureau, met aandacht voor één familie tegelijk.</h2>
            <div className="overons__body">
              <p>
                Mijn naam is Marieke Vermeer. Sinds 1998 begeleid ik families bij een afscheid. Wat begon als een eenmansbureau is nu een klein team van drie, bewust klein gehouden, omdat goede zorg vraagt om tijd.
              </p>
              <p>
                Wij werken niet met pakketten en niet met vaste draaiboeken. Iedere familie is anders, iedere overledene was anders. Onze taak is om goed te luisteren en daarna pas voor te stellen wat passend zou kunnen zijn.
              </p>
              <p>
                U vindt bij ons geen marketingverhaal. Wel een telefoon die altijd opgenomen wordt, en mensen die hun werk al lang en met overgave doen.
              </p>
            </div>
            <p className="overons__sig">
              Marieke Vermeer
              <small>Uitvaartverzorger sinds 1998</small>
            </p>
          </div>
        </div>
      </div>
    </section>
  );
}

// ============================================
// Tarieven
// ============================================
const TARIEVEN = [
  {
    title: 'Sobere uitvaart',
    price: 'vanaf € 4.250',
    note: 'Crematie, kleine kring',
    body: 'Een ingetogen afscheid in besloten kring. Inclusief begeleiding, vervoer, opbaring en een eenvoudige plechtigheid. Geschikt voor wie kiest voor stilte boven ceremonie.',
  },
  {
    title: 'Volledige uitvaart',
    price: 'vanaf € 7.900',
    note: 'Indicatie, gemiddelde wensen',
    body: 'Een volledige uitvaart met plechtigheid, koffietafel, rouwkaarten en bloemen. De meeste families kiezen voor iets in deze richting; de exacte invulling bepaalt u.',
  },
  {
    title: 'Begrafenis',
    price: 'vanaf € 6.500',
    note: 'Exclusief grafrechten',
    body: 'Een begrafenis op een door u gekozen begraafplaats. Grafrechten en kosten van de begraafplaats verschillen per gemeente en zijn niet inbegrepen.',
  },
  {
    title: 'Voorregeling',
    price: '€ 0',
    note: 'Vrijblijvend gesprek',
    body: 'Een gesprek aan tafel om vast te leggen hoe u afscheid genomen wilt zien. U bent ons niets verschuldigd. Het gesprek heeft alleen waarde als u die wilt.',
  },
];

function Tarieven() {
  return (
    <section id="tarieven" className="section tarieven">
      <div className="container">
        <div className="tarieven__head">
          <figure className="tarieven__image">
            <img src="img/Rouwkaart.png" alt="Een sobere rouwkaart" />
          </figure>
          <div className="tarieven__intro">
            <p className="eyebrow">Tarieven</p>
            <h2 className="kicker">Wat kost een uitvaart bij ons.</h2>
            <p className="intro-lede">
              De kosten van een uitvaart hangen af van uw keuzes. Hieronder ziet u richtbedragen. Voor een precieze opgave maken wij vooraf altijd een schriftelijke begroting.
            </p>
            <p className="intro-lede">
              Geen verborgen kosten, geen verrassingen achteraf. Kosten van derden, zoals gemeente, begraafplaats of crematorium, brengen wij apart in rekening en verantwoorden wij in een heldere eindafrekening.
            </p>
            <p className="intro-lede">
              Een uitvaartverzekering dekt vaak een groot deel van de kosten. Wij helpen u bij het opvragen van uw polis en het indienen van de declaratie. Voor wie geen verzekering heeft, bespreken wij de mogelijkheden in alle openheid.
            </p>
          </div>
        </div>
        <div className="tarieven__list">
          {TARIEVEN.map((t) => (
            <div key={t.title} className="tarief">
              <div className="tarief__head">
                <h3 className="tarief__title">{t.title}</h3>
                <span className="tarief__price">
                  {t.price}
                  <small>{t.note}</small>
                </span>
              </div>
              <p className="tarief__body">{t.body}</p>
            </div>
          ))}
        </div>
        <p className="tarieven__note">
          Een uitvaartverzekering dekt vaak een deel van de kosten. Wij helpen u bij het opvragen van uw polis en het indienen van de declaratie.
        </p>
      </div>
    </section>
  );
}

// ============================================
// Reviews
// ============================================
const REVIEWS = [
  {
    body: 'Wij hadden geen idee waar te beginnen toen mijn vader plotseling overleed. Marieke kwam dezelfde middag nog langs, dronk een kopje koffie mee, en heeft ons in de dagen daarna door alles heen geholpen zonder ooit te haasten.',
    attr: 'Familie de Wit, Amstelveen',
  },
  {
    body: 'Wat me vooral is bijgebleven: er werd niets opgelegd. Toen wij twijfelden over de muziek, hebben we samen gewoon even gezeten. De stilte daarbij was waardevoller dan elk advies.',
    attr: 'Anneke, Haarlem',
  },
  {
    body: 'Mijn moeder had alles vooraf met hen besproken. Daardoor wisten wij precies wat zij wilde, en konden we ons concentreren op afscheid nemen. Daar zijn we haar, en hen, nog altijd dankbaar voor.',
    attr: 'Familie Bouwman, Hilversum',
  },
  {
    body: 'Een prijsopgave kregen we vooraf op papier. Geen verrassingen achteraf. Dat lijkt vanzelfsprekend, maar het gaf ons enorm veel rust in een verwarrende periode.',
    attr: 'Peter, Amsterdam',
  },
];

function Reviews() {
  return (
    <section className="section section--alt">
      <div className="container">
        <p className="eyebrow">Ervaringen van families</p>
        <h2 className="kicker">Wat anderen ons toevertrouwden.</h2>
        <div className="reviews__grid">
          {REVIEWS.map((r, i) => (
            <div key={i} className="review">
              <p className="review__body">"{r.body}"</p>
              <p className="review__attr">{r.attr}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ============================================
// Contact + form
// ============================================
function ContactForm() {
  const [form, setForm] = useState({ naam: '', telefoon: '', bericht: '' });
  const [errors, setErrors] = useState({});
  const [submitted, setSubmitted] = useState(false);
  const [submitting, setSubmitting] = useState(false);

  const validate = () => {
    const e = {};
    if (!form.naam.trim()) e.naam = 'Vul uw naam in.';
    if (!form.telefoon.trim()) e.telefoon = 'Vul uw telefoonnummer in.';
    else if (!/^[\d\s\-+()]{8,}$/.test(form.telefoon.trim())) e.telefoon = 'Dit lijkt geen geldig telefoonnummer.';
    return e;
  };

  const onSubmit = (ev) => {
    ev.preventDefault();
    const e = validate();
    setErrors(e);
    if (Object.keys(e).length) return;
    setSubmitting(true);
    setTimeout(() => {
      setSubmitting(false);
      setSubmitted(true);
    }, 700);
  };

  const update = (k, v) => {
    setForm((f) => ({ ...f, [k]: v }));
    if (errors[k]) setErrors((er) => ({ ...er, [k]: undefined }));
  };

  if (submitted) {
    return (
      <div className="form">
        <h3 className="form__title">Bericht ontvangen.</h3>
        <p className="form__lede">
          Dank u voor uw bericht. Wij nemen zo spoedig mogelijk contact met u op, meestal binnen het uur, ook 's avonds en in het weekend.
        </p>
        <div className="form__success">
          Heeft u haast? Belt u ons gerust op <a href="tel:+31201234567"><strong>020 123 4567</strong></a>.
        </div>
      </div>
    );
  }

  return (
    <form className="form" onSubmit={onSubmit} noValidate>
      <h3 className="form__title">Korte vraag of verzoek.</h3>
      <p className="form__lede">
        Liever bellen? Dat kan altijd. Vult u liever iets in, dan nemen wij contact met u op.
      </p>
      <div className={`field ${errors.naam ? 'field--error' : ''}`}>
        <label htmlFor="naam">Uw naam</label>
        <input
          id="naam"
          type="text"
          autoComplete="name"
          value={form.naam}
          onChange={(e) => update('naam', e.target.value)}
        />
        {errors.naam && <span className="field__error">{errors.naam}</span>}
      </div>
      <div className={`field ${errors.telefoon ? 'field--error' : ''}`}>
        <label htmlFor="telefoon">Telefoon</label>
        <input
          id="telefoon"
          type="tel"
          autoComplete="tel"
          value={form.telefoon}
          onChange={(e) => update('telefoon', e.target.value)}
        />
        {errors.telefoon && <span className="field__error">{errors.telefoon}</span>}
      </div>
      <div className="field">
        <label htmlFor="bericht">Kort bericht (optioneel)</label>
        <textarea
          id="bericht"
          value={form.bericht}
          onChange={(e) => update('bericht', e.target.value)}
          rows={3}
        />
      </div>
      <button className="form__submit" type="submit" disabled={submitting}>
        {submitting ? 'Versturen…' : 'Verstuur bericht'}
        <Icon.ArrowRight />
      </button>
      <p className="form__privacy">
        Door dit formulier te versturen gaat u akkoord met onze{' '}
        <a href="#" onClick={(e) => { e.preventDefault(); window.openLegal && window.openLegal('privacy'); }}>privacyverklaring</a>.
        Uw gegevens worden uitsluitend gebruikt om contact met u op te nemen en niet gedeeld met derden.
      </p>
    </form>
  );
}

function Contact() {
  return (
    <section id="contact" className="section contact">
      <div className="container">
        <div className="contact__grid">
          <div>
            <p className="eyebrow" style={{ color: 'color-mix(in srgb, var(--bg) 60%, transparent)' }}>Contact</p>
            <h2 className="contact__title">Wij zijn er voor u, ook nu.</h2>
            <p className="contact__lede">
              Belt u ons gerust, op welk moment ook. Voor een eerste gesprek of een vraag waar u in deze dagen mee zit. Een verplichting is er niet.
            </p>
            <div className="contact__details">
              <div className="contact__detail">
                <p className="contact__detail-label">Telefoon, 24 uur</p>
                <p className="contact__detail-value">
                  <a href="tel:+31201234567">020 123 4567</a>
                </p>
              </div>
              <div className="contact__detail">
                <p className="contact__detail-label">WhatsApp</p>
                <p className="contact__detail-value">
                  <a href="https://wa.me/31612345678">06 1234 5678</a>
                </p>
              </div>
              <div className="contact__detail">
                <p className="contact__detail-label">E-mail</p>
                <p className="contact__detail-value">
                  <a href="mailto:contact@stillewegen.nl">contact@stillewegen.nl</a>
                </p>
              </div>
              <div className="contact__detail">
                <p className="contact__detail-label">Werkgebied</p>
                <p className="contact__detail-value">
                  Amsterdam, Amstelveen, Haarlem,<br/>Hilversum en omstreken.
                </p>
              </div>
              <div className="contact__detail">
                <p className="contact__detail-label">Bezoek op afspraak</p>
                <p className="contact__detail-value">
                  Singelweg 14, Amsterdam
                </p>
              </div>
            </div>
          </div>
          <ContactForm />
        </div>
      </div>
    </section>
  );
}

// ============================================
// Beeldenstrip — sober gallery before contact
// ============================================
const GALLERY = [
  {
    src: 'img/Bloemkist.png',
    alt: 'Een kist met bloemen',
    cap: 'Een laatste groet, in bloei',
  },
  {
    src: 'img/Kaarsen.png',
    alt: 'Brandende kaarsen in stilte',
    cap: 'Licht, in alle stilte',
  },
  {
    src: 'img/Sieraden.png',
    alt: 'Sobere herinneringssieraden',
    cap: 'Een tastbare herinnering',
  },
];

function Beelden() {
  return (
    <section className="section section--alt beelden">
      <div className="container">
        <div className="beelden__head">
          <p className="eyebrow">In beelden</p>
          <h2 className="kicker">Een afscheid, in tonen van rust.</h2>
        </div>
        <div className="beelden__grid">
          {GALLERY.map((g, i) => (
            <figure key={i} className={`beelden__item beelden__item--${i}`}>
              <img src={g.src} alt={g.alt} loading="lazy" />
              <figcaption>{g.cap}</figcaption>
            </figure>
          ))}
        </div>
      </div>
    </section>
  );
}

// ============================================
// Werkgebied
// ============================================
const REGIOS = [
  { plaats: 'Amsterdam', sub: 'Centrum, Oud-West, Zuid, Noord' },
  { plaats: 'Amstelveen', sub: 'En omliggende gemeenten' },
  { plaats: 'Haarlem', sub: 'Bloemendaal, Heemstede' },
  { plaats: 'Hilversum', sub: 'Het Gooi, \'s-Graveland' },
  { plaats: 'Almere', sub: 'Stad en buitengebied' },
  { plaats: 'Zaandam', sub: 'Zaanstreek' },
];

function Werkgebied() {
  return (
    <section id="werkgebied" className="section">
      <div className="container">
        <div className="werkgebied__grid">
          <div className="werkgebied__copy">
            <p className="eyebrow">Werkgebied</p>
            <h2 className="kicker">Waar wij u kunnen bijstaan.</h2>
            <p className="intro-lede">Wij werken in de regio Noord-Holland en het Gooi. Voor families daarbuiten denken wij graag mee. Een eerste gesprek is altijd kosteloos en vrijblijvend.</p>
            <p className="intro-lede">
              Of u nu in Amsterdam, Amstelveen, Haarlem, Hilversum, Almere of Zaandam woont, wij komen bij u langs, doorgaans nog dezelfde dag. Bij u thuis of op een andere plek waar u zich op uw gemak voelt.
            </p>
            <p className="intro-lede">
              Wij kennen de begraafplaatsen, crematoria en aulae in de regio. Daardoor kunnen wij snel schakelen en zorgvuldig samenwerken met de plekken die voor u en uw naasten betekenis hebben.
            </p>
          </div>
          <figure className="werkgebied__image">
            <img src="img/Kistenvervoer.png" alt="Zorgvuldig kistenvervoer" loading="lazy" />
          </figure>
        </div>
        <div className="regios">
          {REGIOS.map((r) => (
            <div key={r.plaats} className="regio">
              <h3 className="regio__plaats">{r.plaats}</h3>
              <p className="regio__sub">{r.sub}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ============================================
// Footer
// ============================================
function SellSection() {
  return null;
}

function Footer() {
  return (
    <footer className="footer">
      <div className="container">
        <div className="footer__grid">
          <div className="footer__col footer__col--brand">
            <p className="footer__title">Begrafenis&shy;ondernemer<span style={{ color: 'var(--accent)' }}>.nl</span></p>
            <p>Een klein, persoonlijk uitvaartbureau. Werkzaam in heel Noord-Holland en het Gooi.</p>
            <a href="#contact" className="footer__cta">
              Neem contact op <Icon.ArrowRight />
            </a>
          </div>
          <div className="footer__col">
            <p className="footer__title">Adres</p>
            <p>Singelweg 14<br/>1015 AB Amsterdam<br/>Bezoek op afspraak</p>
          </div>
          <div className="footer__col">
            <p className="footer__title">Bereikbaar</p>
            <p>24 uur per dag, 7 dagen per week.</p>
            <p className="footer__contact">
              <a href="tel:+31201234567">020 123 4567</a><br/>
              <a href="mailto:contact@begrafenisondernemer.nl">contact@begrafenisondernemer.nl</a>
            </p>
          </div>
        </div>
        <div className="footer__bottom">
          <span>© 2026 Begrafenisondernemer.nl</span>
          <span className="footer__legal">
            <a href="#" onClick={(e) => { e.preventDefault(); window.openLegal && window.openLegal('privacy'); }}>Privacyverklaring</a>
            <span className="footer__legal-sep">·</span>
            <a href="#" onClick={(e) => { e.preventDefault(); window.openLegal && window.openLegal('cookies'); }}>Cookieverklaring</a>
            <span className="footer__legal-sep">·</span>
            <a href="#" onClick={(e) => { e.preventDefault(); window.openLegal && window.openLegal('voorwaarden'); }}>Algemene voorwaarden</a>
            <span className="footer__legal-sep">·</span>
            KvK 12345678
            <span className="footer__legal-sep">·</span>
            BTW NL001234567B01
          </span>
        </div>
      </div>
    </footer>
  );
}

// ============================================
// Sticky mobile actions
// ============================================
function StickyActions() {
  return (
    <div className="sticky-actions">
      <a href="tel:+31201234567" className="sticky-bel">
        <Icon.Phone /> Bel direct
      </a>
      <a href="https://wa.me/31612345678" className="sticky-wa">
        <Icon.Whatsapp /> WhatsApp
      </a>
    </div>
  );
}

// ============================================
// Cookie banner (Telecommunicatiewet art 11.7a + AVG)
// ============================================
function CookieBanner() {
  const [visible, setVisible] = useState(false);

  useEffect(() => {
    try {
      if (!localStorage.getItem('cookieConsent')) setVisible(true);
    } catch (e) { setVisible(true); }
  }, []);

  const setConsent = (value) => {
    try { localStorage.setItem('cookieConsent', value); } catch (e) {}
    setVisible(false);
  };

  if (!visible) return null;

  return (
    <div className="cookiebanner" role="dialog" aria-live="polite" aria-label="Cookiemelding">
      <div className="cookiebanner__inner">
        <div className="cookiebanner__copy">
          <p className="cookiebanner__title">Cookies op deze website</p>
          <p className="cookiebanner__text">
            Wij plaatsen alleen functionele cookies die nodig zijn om de website goed te laten werken.
            Voor het meten van bezoek vragen wij eerst uw toestemming.
            Lees meer in onze{' '}
            <a href="#" onClick={(e) => { e.preventDefault(); window.openLegal && window.openLegal('cookies'); }}>cookieverklaring</a>{' '}en{' '}
            <a href="#" onClick={(e) => { e.preventDefault(); window.openLegal && window.openLegal('privacy'); }}>privacyverklaring</a>.
          </p>
        </div>
        <div className="cookiebanner__actions">
          <button type="button" className="cookiebanner__btn cookiebanner__btn--ghost" onClick={() => setConsent('declined')}>
            Alleen noodzakelijk
          </button>
          <button type="button" className="cookiebanner__btn cookiebanner__btn--solid" onClick={() => setConsent('accepted')}>
            Akkoord
          </button>
        </div>
      </div>
    </div>
  );
}

// ============================================
// Legal modals (Privacy, Cookies, Voorwaarden)
// ============================================
const LEGAL_CONTENT = {
  privacy: {
    title: 'Privacyverklaring',
    body: (
      <>
        <p><em>Laatst bijgewerkt: april 2026</em></p>
        <p>
          Begrafenisondernemer.nl, gevestigd aan Singelweg 14, 1015 AB Amsterdam (KvK 12345678),
          is verantwoordelijk voor de verwerking van persoonsgegevens zoals weergegeven in deze privacyverklaring.
          Wij hechten grote waarde aan de bescherming van uw persoonsgegevens en verwerken deze in overeenstemming met de Algemene Verordening Gegevensbescherming (AVG).
        </p>
        <h4>Welke gegevens verwerken wij</h4>
        <ul>
          <li>Naam en contactgegevens (telefoonnummer, e-mailadres, adres)</li>
          <li>Gegevens van de overledene voor zover nodig voor de uitvoering van de uitvaart</li>
          <li>Polisgegevens van uitvaartverzekeringen, indien van toepassing</li>
          <li>Financiële gegevens voor facturatie</li>
          <li>Gegevens die u zelf invult op het contactformulier</li>
        </ul>
        <h4>Met welk doel</h4>
        <ul>
          <li>Het uitvoeren van de uitvaartdienstverlening</li>
          <li>Contact met u opnemen naar aanleiding van uw verzoek</li>
          <li>Het afhandelen van betalingen en het voldoen aan wettelijke administratieplichten</li>
          <li>Het afwikkelen van een uitvaartverzekering bij de verzekeraar</li>
        </ul>
        <h4>Bewaartermijn</h4>
        <p>
          Wij bewaren uw gegevens niet langer dan strikt noodzakelijk. Voor de fiscale administratie hanteren wij de wettelijke bewaartermijn van zeven jaar.
          Contactformuliergegevens van niet-klanten worden binnen één jaar verwijderd.
        </p>
        <h4>Delen met derden</h4>
        <p>
          Wij delen uw gegevens uitsluitend met derden voor zover dat noodzakelijk is voor de uitvoering van de uitvaart
          (zoals gemeente, begraafplaats, crematorium, drukker van rouwkaarten, en uw verzekeraar) of om te voldoen aan een wettelijke verplichting.
          Met deze partijen sluiten wij waar nodig een verwerkersovereenkomst.
        </p>
        <h4>Uw rechten</h4>
        <p>
          U heeft het recht op inzage, rectificatie of verwijdering van uw persoonsgegevens, het recht op beperking van de verwerking, het recht op gegevensoverdraagbaarheid,
          en het recht om uw toestemming in te trekken. Stuur uw verzoek naar contact@begrafenisondernemer.nl.
          U heeft ook het recht een klacht in te dienen bij de Autoriteit Persoonsgegevens.
        </p>
        <h4>Beveiliging</h4>
        <p>
          Wij nemen passende technische en organisatorische maatregelen om misbruik, verlies en onbevoegde toegang tegen te gaan.
          Verzending van het contactformulier verloopt via een beveiligde verbinding (TLS).
        </p>
      </>
    ),
  },
  cookies: {
    title: 'Cookieverklaring',
    body: (
      <>
        <p><em>Laatst bijgewerkt: april 2026</em></p>
        <p>
          Een cookie is een klein tekstbestand dat bij uw bezoek aan deze website op uw apparaat wordt geplaatst.
          Op basis van de Telecommunicatiewet en de AVG informeren wij u over de cookies die wij gebruiken.
        </p>
        <h4>Functionele cookies (geen toestemming nodig)</h4>
        <p>
          Deze cookies zijn noodzakelijk om de website goed te laten functioneren, bijvoorbeeld om uw cookievoorkeur en weergaveinstellingen te onthouden.
          Deze worden zonder voorafgaande toestemming geplaatst.
        </p>
        <h4>Analytische cookies (alleen na toestemming)</h4>
        <p>
          Wij gebruiken privacy-vriendelijke statistieken om te begrijpen hoe bezoekers de site gebruiken. Deze worden uitsluitend geplaatst nadat u op "Akkoord" heeft geklikt in de cookiebanner.
          IP-adressen worden geanonimiseerd en gegevens worden niet gedeeld met derden.
        </p>
        <h4>Geen tracking of marketingcookies</h4>
        <p>
          Wij plaatsen geen advertentie- of trackingcookies. Wij gebruiken geen sociale-media-pixels.
        </p>
        <h4>Toestemming intrekken</h4>
        <p>
          U kunt uw cookievoorkeur op elk moment wijzigen door uw browsergeschiedenis (cookies en site-gegevens) van deze site te verwijderen.
          Bij uw volgende bezoek krijgt u opnieuw de cookiebanner te zien.
        </p>
      </>
    ),
  },
  voorwaarden: {
    title: 'Algemene voorwaarden',
    body: (
      <>
        <p><em>Versie april 2026</em></p>
        <h4>Artikel 1. Toepasselijkheid</h4>
        <p>
          Deze algemene voorwaarden zijn van toepassing op alle overeenkomsten tussen Begrafenisondernemer.nl (hierna: de uitvaartverzorger) en de opdrachtgever, tenzij schriftelijk anders is overeengekomen.
        </p>
        <h4>Artikel 2. Totstandkoming overeenkomst</h4>
        <p>
          De overeenkomst komt tot stand op het moment dat de opdrachtgever de uitvaartverzorger mondeling of schriftelijk opdracht geeft tot het verzorgen van de uitvaart.
          Een schriftelijke offerte of begroting wordt zo spoedig mogelijk na de eerste bespreking aan de opdrachtgever verstrekt.
        </p>
        <h4>Artikel 3. Uitvoering</h4>
        <p>
          De uitvaartverzorger voert de werkzaamheden uit overeenkomstig de wensen van de opdrachtgever en de geldende wet- en regelgeving (waaronder de Wet op de lijkbezorging).
          Wijzigingen in de opdracht worden zo veel mogelijk schriftelijk vastgelegd.
        </p>
        <h4>Artikel 4. Tarieven en betaling</h4>
        <p>
          De tarieven worden vooraf in een begroting vastgelegd. Door- en bijkomende kosten van derden (zoals gemeente, begraafplaats of crematorium) worden separaat in rekening gebracht.
          Betaling dient plaats te vinden binnen veertien dagen na factuurdatum, tenzij anders overeengekomen.
        </p>
        <h4>Artikel 5. Annulering</h4>
        <p>
          Bij annulering van de opdracht door de opdrachtgever worden de tot dat moment gemaakte kosten en bestede uren in rekening gebracht.
        </p>
        <h4>Artikel 6. Aansprakelijkheid</h4>
        <p>
          De aansprakelijkheid van de uitvaartverzorger is beperkt tot het bedrag dat in het betreffende geval door de aansprakelijkheidsverzekeraar wordt uitgekeerd.
          Indirecte schade en gevolgschade zijn van vergoeding uitgesloten.
        </p>
        <h4>Artikel 7. Klachten</h4>
        <p>
          Klachten over de uitvoering dienen binnen veertien dagen na de uitvaart schriftelijk te worden ingediend bij de uitvaartverzorger.
          De uitvaartverzorger is aangesloten bij de Branchevereniging Gecertificeerde Nederlandse Uitvaartondernemingen (BGNU). De geschillenregeling van de BGNU is van toepassing.
        </p>
        <h4>Artikel 8. Toepasselijk recht</h4>
        <p>
          Op deze overeenkomst is uitsluitend Nederlands recht van toepassing. Geschillen worden voorgelegd aan de bevoegde rechter in het arrondissement Amsterdam.
        </p>
      </>
    ),
  },
};

function LegalModal({ id, onClose }) {
  const isOpen = !!(id && LEGAL_CONTENT[id]);

  useEffect(() => {
    if (!isOpen) return;
    const onKey = (e) => { if (e.key === 'Escape') onClose(); };
    document.addEventListener('keydown', onKey);
    const prevOverflow = document.body.style.overflow;
    document.body.style.overflow = 'hidden';
    return () => {
      document.removeEventListener('keydown', onKey);
      document.body.style.overflow = prevOverflow;
    };
  }, [isOpen, onClose]);

  if (!isOpen) return null;
  const { title, body } = LEGAL_CONTENT[id];

  return (
    <div className="legal-modal" role="dialog" aria-modal="true" aria-labelledby="legal-modal-title" onClick={onClose}>
      <div className="legal-modal__panel" onClick={(e) => e.stopPropagation()}>
        <button type="button" className="legal-modal__close" onClick={onClose} aria-label="Sluiten">×</button>
        <h2 id="legal-modal-title" className="legal-modal__title">{title}</h2>
        <div className="legal-modal__body">{body}</div>
      </div>
    </div>
  );
}

// ============================================
// Tweaks panel
// ============================================
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "palette": "anthracite",
  "typePairing": "cormorant"
}/*EDITMODE-END*/;

function TweaksUI() {
  const [tweaks, setTweak] = window.useTweaks(TWEAK_DEFAULTS);
  const { TweaksPanel, TweakSection, TweakRadio, TweakSelect } = window;

  React.useEffect(() => {
    const root = document.documentElement;
    if (tweaks.palette === 'default') root.removeAttribute('data-palette');
    else root.setAttribute('data-palette', tweaks.palette);
    if (tweaks.typePairing === 'cormorant') root.removeAttribute('data-type');
    else root.setAttribute('data-type', tweaks.typePairing);
  }, [tweaks.palette, tweaks.typePairing]);

  return (
    <TweaksPanel title="Tweaks">
      <TweakSection label="Kleurpalet" />
      <TweakSelect
        label="Palet"
        value={tweaks.palette}
        onChange={(v) => setTweak('palette', v)}
        options={[
          { value: 'default', label: 'Crème + diepgroen' },
          { value: 'anthracite', label: 'Steen + inktzwart' },
          { value: 'brown', label: 'Goudgeel + terracotta' },
          { value: 'bordeaux', label: 'Roze + bordeaux' },
          { value: 'slate', label: 'Eucalyptus + leigroen' },
          { value: 'sand', label: 'Mosterd + olijf' },
          { value: 'ink', label: 'Donker, inkt + amber' },
          { value: 'moss', label: 'Limoengroen + bos' },
          { value: 'midnight', label: 'Donker, nacht + koper' },
        ]}
      />
      <TweakSection label="Typografie" />
      <TweakSelect
        label="Kop-lettertype"
        value={tweaks.typePairing}
        onChange={(v) => setTweak('typePairing', v)}
        options={[
          { value: 'cormorant', label: 'Cormorant Garamond' },
          { value: 'garamond', label: 'EB Garamond' },
          { value: 'lora', label: 'Lora' },
          { value: 'fraunces', label: 'Fraunces' },
        ]}
      />
    </TweaksPanel>
  );
}

// ============================================
// App
// ============================================
const HERO_IMG = 'img/begraafplaats.png';
const PORTRAIT_IMG = 'img/Bloemen.png';

function App() {
  const [legalOpen, setLegalOpen] = useState(null);

  useEffect(() => {
    window.openLegal = (id) => setLegalOpen(id);
    return () => { delete window.openLegal; };
  }, []);

  React.useEffect(() => {
    const els = document.querySelectorAll('.section, .hero, .contactbar');
    els.forEach((el) => el.classList.add('reveal'));
    const io = new IntersectionObserver((entries) => {
      entries.forEach((e) => {
        if (e.isIntersecting) {
          e.target.classList.add('reveal--in');
          io.unobserve(e.target);
        }
      });
    }, { threshold: 0.08, rootMargin: '0px 0px -40px 0px' });
    els.forEach((el) => io.observe(el));
    return () => io.disconnect();
  }, []);

  return (
    <>
      <DemoBar />
      <Header />
      <main>
        <Hero heroImage={HERO_IMG} />
        <ContactBar />
        <Diensten />
        <Werkwijze />
        <OverOns portraitImage={PORTRAIT_IMG} />
        <Tarieven />
        <Reviews />
        <Beelden />
        <Werkgebied />
        <Contact />
        <SellSection />
      </main>
      <Footer />
      <StickyActions />
      <CookieBanner />
      <LegalModal id={legalOpen} onClose={() => setLegalOpen(null)} />
      <TweaksUI />
    </>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
