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

// ===== ICONS =====
const Icon = {
  Check: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" {...p}><polyline points="20 6 9 17 4 12" /></svg>,
  Phone: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" 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>,
  Mail: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" 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>,
  Pin: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" /><circle cx="12" cy="10" r="3" /></svg>,
  Shield: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" /></svg>,
  Clock: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><circle cx="12" cy="12" r="10" /><polyline points="12 6 12 12 16 14" /></svg>,
  File: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /></svg>,
  Award: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><circle cx="12" cy="8" r="6" /><polyline points="8.21 13.89 7 22 12 19 17 22 15.79 13.88" /></svg>,
  ArrowRight: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><line x1="5" y1="12" x2="19" y2="12" /><polyline points="12 5 19 12 12 19" /></svg>,
  ArrowUpRight: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" /></svg>,
  Wrench: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" /></svg>,
  Home: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" /><polyline points="9 22 9 12 15 12 15 22" /></svg>,
  Drop: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z" /></svg>,
  Layers: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><polygon points="12 2 2 7 12 12 22 7 12 2" /><polyline points="2 17 12 22 22 17" /><polyline points="2 12 12 17 22 12" /></svg>,
  Pipe: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M4 4v6a4 4 0 0 0 4 4h8a4 4 0 0 1 4 4v2" /></svg>,
  Chimney: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" {...p}><path d="M3 21V11l9-7 9 7v10" /><path d="M14 6v-3h4v6" /></svg>
};

// ===== LOGO =====
function Logo({ small }) {
  return (
    <a href="#" className="logo" aria-label="Loep Woningstoffering">
      <img src="assets/logo-transparent.png" alt="Loep Woningstoffering" className="logo-img" />
    </a>);

}

// ===== NAV =====
function Nav({ onQuoteClick }) {
  return (
    <header className="nav">
      <div className="container nav-inner">
        <Logo />
        <nav className="nav-links">
          <a href="#diensten">Diensten</a>
          <a href="#over-ons">Over ons</a>

          <a href="#contact">Contact</a>
        </nav>
        <div className="nav-cta">
          <button className="btn btn-primary" onClick={onQuoteClick}>
            Neem contact op <Icon.ArrowRight className="arrow" style={{ width: 16, height: 16 }} />
          </button>
        </div>
      </div>
    </header>);

}

// ===== HERO =====
function Hero({ layout, onQuoteClick }) {
  return (
    <section className="hero">
      <div className="container hero-grid">
        <div>
          <h1 className="display hero-h1">
            Strakke vloeren, slimme gordijnen en altijd een <em>pootje <svg className="paw-icon" viewBox="0 0 64 64" aria-hidden="true"><g fill="#7a4a1f"><ellipse cx="32" cy="44" rx="14" ry="11" /><ellipse cx="13" cy="30" rx="6" ry="8" /><ellipse cx="51" cy="30" rx="6" ry="8" /><ellipse cx="22" cy="16" rx="5.5" ry="7" /><ellipse cx="42" cy="16" rx="5.5" ry="7" /></g></svg> gezelligheid</em> erbij.
          </h1>
          <p className="hero-sub">


          </p>
          <div className="hero-cta-row">
            <button className="btn btn-primary lg" onClick={onQuoteClick}>
              Neem contact op
              <Icon.ArrowRight className="arrow" style={{ width: 18, height: 18 }} />
            </button>
            <a href="tel:+31637564310" className="btn btn-ghost lg">
              <Icon.Phone style={{ width: 16, height: 16 }} /> +31 6 37564310
            </a>
          </div>
        </div>

      </div>
    </section>);

}

// ===== USP STRIP =====
function USPStrip() {
  const items = [
  { icon: Icon.Award, title: '10+ jaar werkervaring', sub: 'Sinds 2015 actief' },
  { icon: Icon.File, title: 'Neem contact op', sub: 'Snel persoonlijk antwoord' },
  { icon: Icon.Clock, title: '24/7 bereikbaar', sub: 'Spoeddienst bij schade' },
  { icon: Icon.Shield, title: '10 jaar garantie', sub: 'Schriftelijk vastgelegd' }];

  return (
    <section className="usp">
      <div className="container usp-grid">
        {items.map((it, i) =>
        <div key={i} className="usp-item">
            <div className="usp-icon"><it.icon /></div>
            <div className="usp-text">
              <strong>{it.title}</strong>
              <span>{it.sub}</span>
            </div>
          </div>
        )}
      </div>
    </section>);

}

// ===== SERVICES =====
const SERVICES = [
{ num: '01', slug: 'allround-vloerenlegger', icon: Icon.Layers, title: 'Allround vloerenlegger', image: 'assets/floor-herringbone.png',
  intro: 'Van een enkele plank vervangen tot een volledige vloer leggen — wij doen het netjes, snel en zonder verrassingen.',
  body: 'Onze vloerleggers werken met PVC, laminaat, parket, visgraat en tapijt. We egaliseren, repareren ondervloeren, leveren materiaal en plaatsen plinten. Eén ploeg van begin tot eind, vaste prijs vooraf.',
  bullets: ['PVC, laminaat, parket en visgraat', 'Egaliseren en ondervloeren', 'Plinten en afwerking', 'Vaste prijs, geen meerwerk achteraf'],
  timelineTitle: 'Van kale ondervloer tot opgeleverde visgraat.',
  timeline: [
  { day: 'Dag 1', title: 'Egaliseren', desc: 'Ondervloer vlak getrokken en strak afgewerkt — de basis voor elke nette vloer.', image: 'assets/timeline/01-egalisatie.png' },
  { day: 'Dag 2', title: 'Ondervloer leggen', desc: 'Geluiddempende ondervloer uitgerold, op maat gesneden en vastgezet.', image: 'assets/timeline/02-ondervloer.png' },
  { day: 'Dag 3', title: 'Eerste banen visgraat', desc: 'Het patroon wordt uitgezet vanuit het midden — hier valt of staat de hele vloer.', image: 'assets/timeline/03-eerste-banen.png' },
  { day: 'Dag 3', title: 'Pasmaken bij randen', desc: 'Op iedere hoek en doorgang wordt elk plankje individueel ingemeten en bijgesneden.', image: 'assets/timeline/04-pasmaken.png' },
  { day: 'Dag 4', title: 'Woonkamer in vorm', desc: 'De ruimte krijgt karakter — visgraat met lichte kaderafwerking langs de wanden.', image: 'assets/timeline/05-woonkamer.png' },
  { day: 'Dag 4', title: 'Drempels en doorgangen', desc: 'Naadloze overgangen tussen kamers, zonder zichtbare drempelprofielen.', image: 'assets/timeline/06-drempels.png' },
  { day: 'Dag 5', title: 'Oplevering', desc: 'Vloer geveegd, gecheckt op gelijkmatigheid en klaar voor gebruik. Klant tevreden.', image: 'assets/timeline/07-oplevering.png' }]
},
{ num: '02', slug: 'elektrische-raamdecoratie', icon: Icon.Home, title: 'Elektrische raamdecoratie', image: 'assets/raamdecoratie.png',
  intro: 'Op afstand bediende rolgordijnen, plissés en duettes — strak ingemeten en netjes weggewerkt.',
  body: 'We leveren en monteren elektrische raamdecoratie van A-merken, met bediening via afstandsbediening, schakelaar of app. Bekabeling weggewerkt, koppelbaar met domotica, en altijd binnen één bezoek geplaatst.',
  bullets: ['Plissé, duette, rol- en vouwgordijnen', 'Bediening per afstand of app', 'Koppelbaar met domotica', 'Inmeten en monteren in één bezoek'],
  timelineTitle: 'Van losse motoren tot een stille druk op de knop.',
  timeline: [
  { day: 'Dag 1', title: 'Voorbereiding op locatie', desc: 'Motoren, kabels en bedieningen worden uitgelegd en gecontroleerd voordat de eerste schroef wordt gezet.', image: 'assets/timeline-raam/01-voorbereiding.png' },
  { day: 'Dag 1', title: 'Glasdak in beeld', desc: 'Voor de montage brengen we de hele constructie in kaart — elke rail moet exact tussen de spanten passen.', image: 'assets/timeline-raam/02-inmeten.png' },
  { day: 'Dag 2', title: 'Rails en geleiders plaatsen', desc: 'De donkere geleiders worden in het glasdak gemonteerd, perfect parallel en strak afgewerkt.', image: 'assets/timeline-raam/03-rails.png' },
  { day: 'Dag 2', title: 'Plissés op hoogte hangen', desc: 'Vakman op de ladder — elk plissé wordt boven het kozijn ingehangen en op de motor aangesloten.', image: 'assets/timeline-raam/04-montage.png' },
  { day: 'Dag 3', title: 'Buitenaanzicht', desc: 'Van buiten ogen de plissés als één strakke lijn onder het glasdak — geen rommelige beugels of zichtbare bedrading.', image: 'assets/timeline-raam/05-buitenaanzicht.png' },
  { day: 'Dag 3', title: 'Oplevering', desc: 'Klaar om te genieten. Met één druk op de knop dimt de zon en wordt de loft een aangename ruimte.', image: 'assets/timeline-raam/06-oplevering.png' }]
}];


function Services({ onQuoteClick }) {
  return (
    <section className="services" id="diensten">
      <div className="container">
        <div className="section-head">
          <div>
            <span className="eyebrow"><span className="dot"></span>Onze diensten</span>
            <h2 className="display">Alles voor uw vloer,<br />in één opdracht.</h2>
          </div>
          <p>Ik leg vloeren en installeer elektrische gordijnen met oog voor kwaliteit en afwerking. Bij iedere klus gaat mijn hond gezellig mee — een trouwe collega die vaak zorgt voor een glimlach bij de klant.</p>
        </div>
        <div className="services-grid">
          {SERVICES.map((s) =>
          <a key={s.num} href={'#dienst/' + s.slug} className={'service-card' + (s.image ? ' has-image' : '')}>
              <div className="num">— {s.num}</div>
              <div className="icon"><s.icon style={{ width: 20, height: 20 }} /></div>
              <h3>{s.title}</h3>
              {s.image ?
            <div className="service-card-image">
                  <img src={s.image} alt={s.title} />
                </div> :
            <p>{s.desc}</p>
            }
              <span className="arrow-link">Lees meer <Icon.ArrowUpRight style={{ width: 14, height: 14 }} /></span>
            </a>
          )}
        </div>
      </div>
    </section>);

}

// ===== SERVICE DETAIL PAGE =====
function ServiceDetail({ service, onQuoteClick }) {
  const storageKey = 'loep-photos-' + service.slug;
  const [photos, setPhotos] = useState(() => {
    try {return JSON.parse(localStorage.getItem(storageKey) || '[]');}
    catch (e) {return [];}
  });
  const [dragOver, setDragOver] = useState(false);
  const [lightbox, setLightbox] = useState(null);
  const fileInputRef = useRef(null);

  useEffect(() => {
    try {localStorage.setItem(storageKey, JSON.stringify(photos));}
    catch (e) {/* quota */}
  }, [photos, storageKey]);

  useEffect(() => {window.scrollTo(0, 0);}, [service.slug]);

  const addFiles = (files) => {
    const list = Array.from(files).filter((f) => f.type.startsWith('image/'));
    list.forEach((f) => {
      const reader = new FileReader();
      reader.onload = (ev) => {
        setPhotos((p) => [...p, { id: Date.now() + '-' + Math.random().toString(36).slice(2, 8), src: ev.target.result, name: f.name, caption: '' }]);
      };
      reader.readAsDataURL(f);
    });
  };

  const onDrop = (e) => {
    e.preventDefault();
    setDragOver(false);
    if (e.dataTransfer.files && e.dataTransfer.files.length) addFiles(e.dataTransfer.files);
  };

  const removePhoto = (id) => setPhotos((p) => p.filter((x) => x.id !== id));
  const updateCaption = (id, caption) => setPhotos((p) => p.map((x) => x.id === id ? { ...x, caption } : x));
  const clearAll = () => {if (confirm('Alle foto\'s verwijderen?')) setPhotos([]);};

  return (
    <main className="service-detail">
      <div className="container">
        <a href="#diensten" className="back-link"><Icon.ArrowRight style={{ width: 14, height: 14, transform: 'rotate(180deg)' }} /> Terug naar diensten</a>

        <div className="detail-head">
          <div>
            <span className="eyebrow"><span className="dot"></span>Dienst — {service.num}</span>
            <h1 className="display">{service.title}</h1>
            <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', marginTop: 28 }}>
              <button className="btn btn-orange" onClick={onQuoteClick}>Neem contact op <Icon.ArrowRight style={{ width: 16, height: 16 }} /></button>
              <a href="tel:+31637564310" className="btn btn-ghost"><Icon.Phone style={{ width: 16, height: 16 }} /> Bel direct</a>
            </div>
          </div>
        </div>

        {service.timeline &&
        <div className="timeline-section">
          <div className="gallery-head">
            <div>
              <span className="eyebrow"><span className="dot"></span>Werk in beeld</span>
              <h2 className="display">{service.timelineTitle || 'Van eerste schets\ntot oplevering.'}</h2>
            </div>
            <p>Een recent project, stap voor stap. Zo ziet het eruit als wij van begin tot eind doen wat we beloven.</p>
          </div>
          <ol className="timeline">
            {service.timeline.map((step, i) =>
            <li key={i} className="timeline-item">
                <div className="timeline-rail">
                  <div className="timeline-dot">{String(i + 1).padStart(2, '0')}</div>
                  {i < service.timeline.length - 1 && <div className="timeline-line" />}
                </div>
                <div className="timeline-content">
                  <div className="timeline-meta">
                    <span className="timeline-day">{step.day}</span>
                    <span className="timeline-sep">·</span>
                    <span className="timeline-step">Stap {i + 1} van {service.timeline.length}</span>
                  </div>
                  <h3 className="timeline-title">{step.title}</h3>
                  <p className="timeline-desc">{step.desc}</p>
                  <div className="timeline-image">
                    <img src={step.image} alt={step.title} loading="lazy" />
                  </div>
                </div>
              </li>
            )}
          </ol>
        </div>
        }

      </div>
    </main>);

}

// ===== ABOUT =====
function About() {
  return (
    <section className="about" id="over-ons">
      <div className="container about-grid">
        <div style={{ position: 'relative' }}>
          <div className="about-photo">
            <img src={window.__resources?.founderImg || "assets/founder.png"} alt="Rick Diemeer, oprichter Loep Woningstoffering" />
            <div className="signature">
              Rick Diemeer
              <small>Oprichter & vloerlegger</small>
            </div>
          </div>
        </div>
        <div>
          <h2 className="display">Hoi, ik ben Rick — woningstoffeerder.</h2>
          <p className="about-lead">
            Ik lever graag mooi werk af. Geen klus is voor mij "gewoon een klus". Ik let op details en ga pas weg als alles klopt.
          </p>
          <p className="about-body">
            Samen met mijn trouwe viervoeter Dirkje rijd ik dagelijks rond. We leggen vloeren en hangen raamdecoratie op.
            Mijn lengte komt daarbij goed van pas — bij lage plafonds sla ik het trapje vaak over.
          </p>
          <p className="about-body">
            Kwaliteit en afspraken nakomen staan bij mij voorop, maar minstens zo belangrijk: een goed gesprek en een kop koffie tussendoor.
          </p>
          <p className="about-body">
            Op zoek naar een stoffeerder met vakmanschap én persoonlijke aandacht? Dan kom ik graag een keer kennismaken!
          </p>
        </div>
      </div>
    </section>);

}

// ===== QUOTE FORM =====
function QuoteForm({ mode }) {
  // mode: 'multi' | 'single'
  const [step, setStep] = useState(0); // 0,1,2 then 3 = success
  const [data, setData] = useState({
    postcode: '', huisnr: '',
    services: [],
    naam: '', telefoon: '', email: '', bericht: ''
  });
  const [errors, setErrors] = useState({});
  const [pcStatus, setPcStatus] = useState(null); // null | 'checking' | 'ok' | 'no'
  const pcTimer = useRef(null);

  const update = (k, v) => setData((d) => ({ ...d, [k]: v }));

  // postcode check
  useEffect(() => {
    if (!data.postcode || data.postcode.length < 4) {setPcStatus(null);return;}
    setPcStatus('checking');
    clearTimeout(pcTimer.current);
    pcTimer.current = setTimeout(() => {
      // Noord-Holland postcodes 1000-2199 globally
      const num = parseInt(data.postcode.slice(0, 4), 10);
      if (isNaN(num)) {setPcStatus('no');return;}
      setPcStatus(num >= 1000 && num <= 2199 ? 'ok' : 'no');
    }, 600);
    return () => clearTimeout(pcTimer.current);
  }, [data.postcode]);

  const toggleService = (s) => {
    setData((d) => ({
      ...d,
      services: d.services.includes(s) ? d.services.filter((x) => x !== s) : [...d.services, s]
    }));
  };

  const validateStep = (s) => {
    const e = {};
    if (mode === 'single' || s === 0) {
      if (!data.postcode || !/^\d{4}\s?[A-Za-z]{0,2}$/.test(data.postcode)) e.postcode = 'Vul een geldige postcode in';
      if (!data.huisnr) e.huisnr = 'Huisnummer ontbreekt';
    }
    if (mode === 'single' || s === 1) {
      if (data.services.length === 0) e.services = 'Kies minstens één dienst';
    }
    if (mode === 'single' || s === 2) {
      if (!data.naam.trim()) e.naam = 'Vul uw naam in';
      if (!data.telefoon || data.telefoon.replace(/\D/g, '').length < 9) e.telefoon = 'Vul een geldig telefoonnummer in';
      if (!data.email || !/^\S+@\S+\.\S+$/.test(data.email)) e.email = 'Vul een geldig e-mailadres in';
    }
    setErrors(e);
    return Object.keys(e).length === 0;
  };

  const next = () => {
    if (validateStep(step)) setStep((s) => s + 1);
  };
  const buildWaLink = () => {
    const lines = ['Hallo Rick, ik wil graag contact opnemen.', ''];
    if (data.naam) lines.push('Naam: ' + data.naam);
    if (data.telefoon) lines.push('Telefoon: ' + data.telefoon);
    if (data.email) lines.push('E-mail: ' + data.email);
    if (data.postcode || data.huisnr) lines.push('Adres: ' + [data.postcode, data.huisnr].filter(Boolean).join(' '));
    if (data.services.length) lines.push('Dienst(en): ' + data.services.join(', '));
    if (data.bericht) lines.push('Bericht: ' + data.bericht);
    return 'https://wa.me/31637564310?text=' + encodeURIComponent(lines.join('\n'));
  };

  const submit = () => {
    if (mode === 'single') {
      if (!validateStep(0) || !validateStep(1) || !validateStep(2)) return;
    } else {
      if (!validateStep(2)) return;
    }
    window.open(buildWaLink(), '_blank', 'noopener');
    setStep(3);
  };

  const SERVICE_OPTIONS = [
  'Allround vloerenlegger', 'Elektrische raamdecoratie'];


  if (step === 3) {
    return (
      <div className="form-card">
        <div className="form-success">
          <div className="check-icon">
            <Icon.Check style={{ width: 30, height: 30 }} strokeWidth="2.6" />
          </div>
          <h3>Bijna klaar — verstuur uw bericht in WhatsApp.</h3>
          <p>We hebben WhatsApp voor u geopend met uw gegevens ingevuld. Druk daar op verzenden en we reageren persoonlijk. Werkt dat niet? Bereik ons hieronder.</p>
          <div className="success-actions" style={{ display: 'flex', flexWrap: 'wrap', gap: 10, justifyContent: 'center', marginTop: 20 }}>
            <a href={buildWaLink()} target="_blank" rel="noopener" className="btn btn-primary">Open WhatsApp</a>
            <a href="mailto:r.diemeer@gmail.com" className="btn btn-ghost">Mail ons</a>
            <a href="tel:+31637564310" className="btn btn-ghost">Bel ons</a>
          </div>
        </div>
      </div>);

  }

  // Multi-step view
  if (mode === 'multi') {
    return (
      <div className="form-card" id="contact">
        <div className="form-head">
          <div className="form-title">Neem contact op</div>
          <div className="form-step-pill">STAP {step + 1} / 3</div>
        </div>
        <div className="form-progress">
          {[0, 1, 2].map((i) =>
          <span key={i} className={i < step ? 'done' : i === step ? 'active' : ''} />
          )}
        </div>

        {step === 0 &&
        <div className="fade-in">
            <p style={{ margin: '0 0 20px', color: 'var(--c-text-soft)', fontSize: 14 }}>Eerst even checken: werken we bij u in de buurt?</p>
            <div className="field-row">
              <div className={'field' + (errors.postcode ? ' has-error' : '')}>
                <label>Postcode<span className="req">*</span></label>
                <input type="text" placeholder="1234 AB" value={data.postcode} onChange={(e) => update('postcode', e.target.value.toUpperCase())} />
                {errors.postcode && <div className="err">{errors.postcode}</div>}
                {pcStatus === 'checking' && <div className="postcode-status checking">Controleren…</div>}
                {pcStatus === 'ok' && <div className="postcode-status ok"><Icon.Check style={{ width: 14, height: 14 }} /> Top — we werken hier</div>}
                {pcStatus === 'no' && <div className="postcode-status no">Buiten ons werkgebied — bel even, soms doen we 't toch</div>}
              </div>
              <div className={'field' + (errors.huisnr ? ' has-error' : '')}>
                <label>Huisnummer<span className="req">*</span></label>
                <input type="text" placeholder="12" value={data.huisnr} onChange={(e) => update('huisnr', e.target.value)} />
                {errors.huisnr && <div className="err">{errors.huisnr}</div>}
              </div>
            </div>
            <div className="form-actions">
              <button className="btn btn-primary" onClick={next}>Volgende stap <Icon.ArrowRight style={{ width: 16, height: 16 }} /></button>
            </div>
          </div>
        }

        {step === 1 &&
        <div className="fade-in">
            <p style={{ margin: '0 0 20px', color: 'var(--c-text-soft)', fontSize: 14 }}>Waarvoor heeft u ons nodig? (meerdere mogelijk)</p>
            <div className="service-chips">
              {SERVICE_OPTIONS.map((s) =>
            <button key={s} type="button" className={'service-chip' + (data.services.includes(s) ? ' selected' : '')} onClick={() => toggleService(s)}>
                  <span className="check">{data.services.includes(s) && <Icon.Check style={{ width: 12, height: 12 }} />}</span>
                  <span>{s}</span>
                </button>
            )}
            </div>
            {errors.services && <div className="err" style={{ marginTop: 6, fontSize: 12.5, color: '#C73A2D' }}>{errors.services}</div>}
            <div className="form-actions">
              <button className="btn btn-ghost btn-back" onClick={() => setStep((s) => s - 1)}>Terug</button>
              <button className="btn btn-primary" onClick={next}>Volgende stap <Icon.ArrowRight style={{ width: 16, height: 16 }} /></button>
            </div>
          </div>
        }

        {step === 2 &&
        <div className="fade-in">
            <p style={{ margin: '0 0 20px', color: 'var(--c-text-soft)', fontSize: 14 }}>Bijna klaar — hoe kunnen we u bereiken?</p>
            <div className={'field' + (errors.naam ? ' has-error' : '')}>
              <label>Naam<span className="req">*</span></label>
              <input type="text" placeholder="Uw volledige naam" value={data.naam} onChange={(e) => update('naam', e.target.value)} />
              {errors.naam && <div className="err">{errors.naam}</div>}
            </div>
            <div className="field-row">
              <div className={'field' + (errors.telefoon ? ' has-error' : '')}>
                <label>Telefoon<span className="req">*</span></label>
                <input type="tel" placeholder="06 12 34 56 78" value={data.telefoon} onChange={(e) => update('telefoon', e.target.value)} />
                {errors.telefoon && <div className="err">{errors.telefoon}</div>}
              </div>
              <div className={'field' + (errors.email ? ' has-error' : '')}>
                <label>E-mail<span className="req">*</span></label>
                <input type="email" placeholder="naam@email.nl" value={data.email} onChange={(e) => update('email', e.target.value)} />
                {errors.email && <div className="err">{errors.email}</div>}
              </div>
            </div>
            <div className="field">
              <label>Toelichting <span style={{ color: 'var(--c-text-mute)', fontWeight: 400 }}>(optioneel)</span></label>
              <textarea placeholder="Bijv. 'schade in de slaapkamer sinds vorige week'" value={data.bericht} onChange={(e) => update('bericht', e.target.value)} />
            </div>
            <div className="form-actions">
              <button className="btn btn-ghost btn-back" onClick={() => setStep((s) => s - 1)}>Terug</button>
              <button className="btn btn-primary" onClick={submit}>Aanvraag versturen <Icon.ArrowRight style={{ width: 16, height: 16 }} /></button>
            </div>
          </div>
        }
      </div>);

  }

  // Single-page mode
  return (
    <div className="form-card" id="contact">
      <div className="form-head">
        <div className="form-title">Neem contact op</div>
        <div className="form-step-pill">5 VELDEN · 60 SEC</div>
      </div>
      <div className={'field' + (errors.naam ? ' has-error' : '')}>
        <label>Naam<span className="req">*</span></label>
        <input type="text" placeholder="Uw volledige naam" value={data.naam} onChange={(e) => update('naam', e.target.value)} />
        {errors.naam && <div className="err">{errors.naam}</div>}
      </div>
      <div className="field-row">
        <div className={'field' + (errors.telefoon ? ' has-error' : '')}>
          <label>Telefoon<span className="req">*</span></label>
          <input type="tel" placeholder="06 12 34 56 78" value={data.telefoon} onChange={(e) => update('telefoon', e.target.value)} />
          {errors.telefoon && <div className="err">{errors.telefoon}</div>}
        </div>
        <div className={'field' + (errors.email ? ' has-error' : '')}>
          <label>E-mail<span className="req">*</span></label>
          <input type="email" placeholder="naam@email.nl" value={data.email} onChange={(e) => update('email', e.target.value)} />
          {errors.email && <div className="err">{errors.email}</div>}
        </div>
      </div>
      <div className="field-row">
        <div className={'field' + (errors.postcode ? ' has-error' : '')}>
          <label>Postcode<span className="req">*</span></label>
          <input type="text" placeholder="1234 AB" value={data.postcode} onChange={(e) => update('postcode', e.target.value.toUpperCase())} />
          {errors.postcode && <div className="err">{errors.postcode}</div>}
          {pcStatus === 'ok' && <div className="postcode-status ok"><Icon.Check style={{ width: 14, height: 14 }} /> We werken hier</div>}
          {pcStatus === 'no' && <div className="postcode-status no">Buiten werkgebied — bel even</div>}
        </div>
        <div className={'field' + (errors.huisnr ? ' has-error' : '')}>
          <label>Huisnummer<span className="req">*</span></label>
          <input type="text" placeholder="12" value={data.huisnr} onChange={(e) => update('huisnr', e.target.value)} />
          {errors.huisnr && <div className="err">{errors.huisnr}</div>}
        </div>
      </div>
      <div className="field">
        <label>Bericht <span style={{ color: 'var(--c-text-mute)', fontWeight: 400 }}>(optioneel)</span></label>
        <textarea placeholder="Wat kunnen we voor u doen?" value={data.bericht} onChange={(e) => update('bericht', e.target.value)} />
      </div>
      <button className="btn btn-primary lg" style={{ width: '100%' }} onClick={submit}>
        Verstuur bericht <Icon.ArrowRight style={{ width: 16, height: 16 }} />
      </button>
    </div>);

}

// ===== CTA SECTION =====
function CTASection({ formMode }) {
  const waNumber = '31637564310';
  const waMessage = encodeURIComponent('Hallo ik ben (naam) ik ben geïnteresseerd in…..');
  const waLink = `https://wa.me/${waNumber}?text=${waMessage}`;

  return (
    <section className="cta" id="contact">
      <div className="container cta-grid">
        <div>
          <span className="eyebrow on-dark"><span className="dot"></span>Contact</span>
          <h2>Neem contact op via <em>WhatsApp</em> en plan een afspraak in.</h2>
          <p className="cta-phone-note">
            <Icon.Phone style={{ width: 16, height: 16 }} />
            <span>Liever bellen of mailen? <a href="tel:+31637564310">+31 6 37564310</a> · <a href="mailto:r.diemeer@gmail.com">r.diemeer@gmail.com</a> <strong>(telefonisch alleen tijdens kantoortijden)</strong></span>
          </p>
          <div className="cta-contact" style={{ display: 'none' }}>
            <a href="tel:+31637564310"><Icon.Phone /> +31 6 37564310</a>
          </div>
        </div>
        <div className="wa-card">
          <div className="wa-card-icon" aria-hidden="true">
            <svg viewBox="0 0 24 24" fill="currentColor" width="36" height="36">
              <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z" />
            </svg>
          </div>
          <div className="wa-card-eyebrow">WHATSAPP</div>
          <h3 className="wa-card-title">Plan direct een afspraak</h3>
          <p className="wa-card-sub">
            Stuur een berichtje en we reageren persoonlijk. Geen formulier, geen wachten — gewoon contact.
          </p>
          <a href={waLink} target="_blank" rel="noopener" className="wa-card-btn">
            <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18" style={{ marginRight: 10 }}>
              <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z" />
            </svg>
            Stuur WhatsApp-bericht
          </a>
        </div>
      </div>
    </section>);

}

// ===== TERMS & CONDITIONS PAGE =====
function TermsConditions() {
  return (
    <section className="privacy-page">
      <div className="container privacy-container">
        <a href="#" className="back-link"><Icon.ArrowRight style={{ width: 14, height: 14, transform: 'rotate(180deg)' }} /> Terug naar home</a>
        <header className="privacy-head">
          <h1 className="display">Algemene voorwaarden</h1>
          <p className="privacy-meta">Loep Woningstoffering · Versie juli 2026</p>
        </header>

        <article className="privacy-body">
          <section>
            <h2>1. Definities</h2>
            <p>In deze algemene voorwaarden wordt verstaan onder:</p>
            <ul>
              <li><strong>Opdrachtnemer:</strong> Loep Woningstoffering, zelfstandige onderneming gevestigd te Alkmaar (Van der Woudestraat 168, 1815 VZ Alkmaar), ingeschreven bij de Kamer van Koophandel onder nummer 89659570.</li>
              <li><strong>Opdrachtgever:</strong> de natuurlijke of rechtspersoon die aan opdrachtnemer een opdracht heeft gegeven tot het verrichten van werkzaamheden.</li>
              <li><strong>Overeenkomst:</strong> elke afspraak tussen opdrachtnemer en opdrachtgever tot het verrichten van werkzaamheden, waaronder vloerwerken, raamdecoratie en aanverwante diensten.</li>
              <li><strong>Werkzaamheden:</strong> alle door opdrachtnemer uit te voeren of uitgevoerde diensten, leveringen en bijkomende prestaties.</li>
            </ul>
          </section>

          <section>
            <h2>2. Toepasselijkheid</h2>
            <p>Deze algemene voorwaarden zijn van toepassing op alle aanbiedingen, offertes en overeenkomsten tussen Loep Woningstoffering en de opdrachtgever, tenzij schriftelijk uitdrukkelijk anders is overeengekomen.</p>
            <p>Algemene voorwaarden van de opdrachtgever worden uitdrukkelijk van de hand gewezen, tenzij deze schriftelijk door opdrachtnemer zijn aanvaard.</p>
          </section>

          <section>
            <h2>3. Aanbiedingen en offertes</h2>
            <p>Alle aanbiedingen en offertes van Loep Woningstoffering zijn vrijblijvend en geldig gedurende 30 dagen na dagtekening, tenzij anders aangegeven.</p>
            <p>Een offerte is gebaseerd op de door de opdrachtgever verstrekte informatie en — indien van toepassing — op een inmeting ter plaatse. Wijzigingen in de uitgangspunten kunnen leiden tot aanpassing van de prijs.</p>
            <p>Kennelijke vergissingen of fouten in een aanbieding binden opdrachtnemer niet.</p>
          </section>

          <section>
            <h2>4. Totstandkoming en wijziging van de overeenkomst</h2>
            <p>De overeenkomst komt tot stand op het moment dat de opdrachtgever de offerte schriftelijk, per e-mail of WhatsApp heeft aanvaard, dan wel op het moment dat opdrachtnemer met de uitvoering van de werkzaamheden is aangevangen met instemming van de opdrachtgever.</p>
            <p>Wijzigingen of aanvullingen op de overeenkomst zijn slechts geldig wanneer deze schriftelijk of via e-mail door beide partijen zijn bevestigd.</p>
          </section>

          <section>
            <h2>5. Prijzen en meerwerk</h2>
            <p>Alle prijzen zijn in euro’s, inclusief btw, tenzij uitdrukkelijk anders vermeld. Reiskosten, parkeerkosten en bijzondere materialen kunnen apart worden gefactureerd indien dit vooraf is besproken.</p>
            <p>Werkzaamheden die buiten de oorspronkelijke opdracht vallen — zoals extra egalisatie, herstel van een ondervloer of het verwijderen van een bestaande vloer — worden als meerwerk beschouwd en in overleg met de opdrachtgever uitgevoerd en afgerekend.</p>
          </section>

          <section>
            <h2>6. Uitvoering van de werkzaamheden</h2>
            <p>Loep Woningstoffering voert de werkzaamheden uit naar beste inzicht en vermogen, en overeenkomstig de eisen van goed vakmanschap.</p>
            <p>De opdrachtgever zorgt voor een veilige, schone en goed bereikbare werkplek. Water, elektra en een afvoer voor afval dienen kosteloos beschikbaar te zijn. Eventuele meubels en losse goederen worden door of in opdracht van de opdrachtgever verplaatst, tenzij anders afgesproken.</p>
            <p>Indien de werkplek bij aankomst niet werkbaar is en hierdoor vertraging of extra werk ontstaat, kunnen de extra uren in rekening worden gebracht.</p>
          </section>

          <section>
            <h2>7. Oplevering en levertijden</h2>
            <p>Opgegeven leverings- en uitvoeringstermijnen zijn indicatief. Overschrijding van een termijn geeft de opdrachtgever geen recht op schadevergoeding of ontbinding van de overeenkomst, tenzij sprake is van opzet of grove schuld aan de zijde van opdrachtnemer.</p>
            <p>Na voltooiing van de werkzaamheden wordt het werk gezamenlijk gecontroleerd en opgeleverd. Eventuele opmerkingen worden direct genoteerd en, indien gegrond, kosteloos verholpen.</p>
          </section>

          <section>
            <h2>8. Betaling</h2>
            <p>Betaling vindt plaats binnen 14 dagen na factuurdatum, tenzij anders schriftelijk overeengekomen. Bij grotere opdrachten kan opdrachtnemer een aanbetaling van maximaal 30% bij opdrachtbevestiging verlangen.</p>
            <p>Bij niet-tijdige betaling is de opdrachtgever van rechtswege in verzuim en is wettelijke rente verschuldigd. Buitengerechtelijke incassokosten zijn voor rekening van de opdrachtgever conform het Besluit vergoeding voor buitengerechtelijke incassokosten.</p>
          </section>

          <section>
            <h2>9. Garantie en klachten</h2>
            <p>Loep Woningstoffering staat in voor de vakkundige uitvoering van de werkzaamheden. Op het uitgevoerde werk wordt 12 maanden garantie verleend op montagefouten, gerekend vanaf de opleveringsdatum, mits het werk wordt gebruikt en onderhouden zoals redelijkerwijs van een normaal gebruiker mag worden verwacht.</p>
            <p>De garantie geldt niet voor schade door normale slijtage, onjuist gebruik, vochtproblemen vanuit de ondervloer of woning, of werkzaamheden die door derden zijn uitgevoerd of gewijzigd.</p>
            <p>Klachten over de uitvoering dienen binnen 14 dagen na ontdekking schriftelijk of per e-mail aan opdrachtnemer te worden gemeld, zodat het probleem onderzocht en zo nodig hersteld kan worden.</p>
          </section>

          <section>
            <h2>10. Aansprakelijkheid</h2>
            <p>De aansprakelijkheid van Loep Woningstoffering is beperkt tot het bedrag dat in het betreffende geval door de aansprakelijkheidsverzekering wordt uitgekeerd, vermeerderd met het eigen risico. Indien om welke reden dan ook geen uitkering plaatsvindt, is de aansprakelijkheid beperkt tot ten hoogste het factuurbedrag van de betreffende opdracht.</p>
            <p>Opdrachtnemer is niet aansprakelijk voor indirecte schade, waaronder gevolgschade, gederfde omzet, gemiste besparingen en schade door bedrijfsstagnatie.</p>
            <p>Opdrachtnemer is niet aansprakelijk voor schade veroorzaakt door gebreken in materialen die door of namens de opdrachtgever zijn aangeleverd.</p>
          </section>

          <section>
            <h2>11. Overmacht</h2>
            <p>In geval van overmacht is opdrachtnemer gerechtigd de overeenkomst op te schorten of geheel of gedeeltelijk te ontbinden, zonder tot enige schadevergoeding gehouden te zijn. Onder overmacht wordt onder meer verstaan: ziekte, weersomstandigheden die de uitvoering verhinderen, transportproblemen, leveringsproblemen van leveranciers en overige van de wil van opdrachtnemer onafhankelijke omstandigheden.</p>
          </section>

          <section>
            <h2>12. Eigendomsvoorbehoud</h2>
            <p>Alle door Loep Woningstoffering geleverde materialen blijven eigendom van opdrachtnemer totdat de opdrachtgever alle verplichtingen uit de overeenkomst volledig is nagekomen, waaronder de betaling van de hoofdsom, rente en kosten.</p>
          </section>

          <section>
            <h2>13. Geschillen en toepasselijk recht</h2>
            <p>Op alle overeenkomsten tussen Loep Woningstoffering en de opdrachtgever is Nederlands recht van toepassing.</p>
            <p>Geschillen die niet in onderling overleg kunnen worden opgelost, worden voorgelegd aan de bevoegde rechter in het arrondissement waar opdrachtnemer is gevestigd, tenzij dwingendrechtelijke bepalingen anders voorschrijven.</p>
          </section>

          <section>
            <h2>14. Herroepingsrecht voor consumenten</h2>
            <p>Indien de overeenkomst met een consument tot stand komt buiten de verkoopruimte van opdrachtnemer — bijvoorbeeld bij de opdrachtgever thuis na een inmeting — heeft de consument het recht de overeenkomst binnen 14 dagen na het sluiten ervan zonder opgave van redenen te ontbinden.</p>
            <p>De consument kan hiervan gebruikmaken door binnen deze termijn een ondubbelzinnige verklaring (schriftelijk of per e-mail) aan opdrachtnemer te sturen. Reeds betaalde bedragen worden binnen 14 dagen terugbetaald.</p>
            <p>Het herroepingsrecht vervalt wanneer de werkzaamheden op uitdrukkelijk verzoek van de consument binnen de bedenktijd volledig zijn uitgevoerd, of wanneer het gaat om producten die op maat zijn gemaakt of duidelijk voor de consument persoonlijk zijn bestemd (zoals op maat gesneden vloerbedekking en maatwerk raamdecoratie). De consument verklaart hiermee bekend te zijn bij het geven van opdracht tot uitvoering binnen de bedenktijd.</p>
          </section>

          <section>
            <h2>15. Contact</h2>
            <ul className="privacy-meta-list">
              <li><span>Bedrijfsnaam</span><strong>Loep Woningstoffering</strong></li>
              <li><span>Adres</span><strong>Van der Woudestraat 168, 1815 VZ Alkmaar</strong></li>
              <li><span>KvK-nummer</span><strong>89659570</strong></li>
              <li><span>Btw-id</span><strong>NL004751001B22</strong></li>
              <li><span>Telefoon</span><strong><a href="tel:+31637564310">+31 6 37564310</a></strong></li>
              <li><span>E-mailadres</span><strong><a href="mailto:r.diemeer@gmail.com">r.diemeer@gmail.com</a></strong></li>
            </ul>
          </section>
        </article>
      </div>
    </section>);

}

// ===== PRIVACY POLICY PAGE =====
function PrivacyPolicy() {
  return (
    <section className="privacy-page">
      <div className="container privacy-container">
        <a href="#" className="back-link"><Icon.ArrowRight style={{ width: 14, height: 14, transform: 'rotate(180deg)' }} /> Terug naar home</a>
        <header className="privacy-head">
          <h1 className="display">Privacyverklaring</h1>
          <p className="privacy-meta">Loep Woningstoffering · Laatst bijgewerkt: juli 2026</p>
        </header>

        <article className="privacy-body">
          <section>
            <h2>1. Inleiding</h2>
            <p>Loep Woningstoffering, gevestigd te Alkmaar en gedreven door Rick Diemeer, is verantwoordelijk voor de verwerking van persoonsgegevens zoals weergegeven in deze privacyverklaring. Wij hechten veel waarde aan de bescherming van uw persoonsgegevens en zorgen ervoor dat de persoonlijke informatie die u aan ons verstrekt vertrouwelijk wordt behandeld.</p>
          </section>

          <section>
            <h2>2. Contactgegevens</h2>
            <p>Voor vragen over deze privacyverklaring kunt u contact met ons opnemen:</p>
            <ul className="privacy-meta-list">
              <li><span>Bedrijfsnaam</span><strong>Loep Woningstoffering</strong></li>
              <li><span>Eigenaar</span><strong>Rick Diemeer</strong></li>
              <li><span>Adres</span><strong>Van der Woudestraat 168, 1815 VZ Alkmaar</strong></li>
              <li><span>KvK-nummer</span><strong>89659570</strong></li>
              <li><span>Btw-id</span><strong>NL004751001B22</strong></li>
              <li><span>Telefoon</span><strong><a href="tel:+31637564310">+31 6 37564310</a></strong></li>
              <li><span>E-mailadres</span><strong><a href="mailto:r.diemeer@gmail.com">r.diemeer@gmail.com</a></strong></li>
            </ul>
          </section>

          <section>
            <h2>3. Welke persoonsgegevens verwerken wij?</h2>
            <p>Loep Woningstoffering verwerkt uw persoonsgegevens doordat u contact met ons opneemt of gebruikmaakt van ons contact-/offerteformulier, en/of omdat u deze gegevens zelf aan ons verstrekt. Wij verwerken de volgende persoonsgegevens:</p>
            <ul>
              <li>Voor- en achternaam</li>
              <li>E-mailadres</li>
              <li>Telefoonnummer</li>
              <li>Adresgegevens van de locatie waar de werkzaamheden moeten worden uitgevoerd</li>
              <li>Overige gegevens die u zelf verstrekt over uw aanvraag of opdracht</li>
            </ul>
          </section>

          <section>
            <h2>4. Doel en grondslag van de verwerking</h2>
            <p>Wij verwerken uw persoonsgegevens voor de volgende doeleinden:</p>
            <ul>
              <li>Het beantwoorden van uw vragen en verzoeken via het contact-/offerteformulier, telefoon, e-mail of WhatsApp</li>
              <li>Het opstellen en uitbrengen van een offerte</li>
              <li>Het uitvoeren van de overeenkomst en het onderhouden van contact tijdens en na de werkzaamheden</li>
              <li>Het opstellen en versturen van facturen en het voeren van onze administratie</li>
            </ul>
            <p>De wettelijke grondslag voor deze verwerking is de uitvoering van de overeenkomst met u, dan wel het nemen van maatregelen op uw verzoek voorafgaand aan het sluiten van een overeenkomst, en het voldoen aan een wettelijke (administratie- en bewaar)plicht.</p>
          </section>

          <section>
            <h2>5. Cookies</h2>
            <p>Onze website gebruikt uitsluitend functionele cookies die noodzakelijk zijn voor het correct en veilig functioneren van de website. Voor deze cookies is geen toestemming vereist. Wij gebruiken geen analytische of tracking cookies en volgen uw surfgedrag niet.</p>
          </section>

          <section>
            <h2>6. Bewaartermijn</h2>
            <p>Loep Woningstoffering bewaart uw persoonsgegevens niet langer dan strikt noodzakelijk is om de doelen te realiseren waarvoor uw gegevens worden verzameld. Aanvragen die niet tot een opdracht leiden, bewaren wij maximaal twee jaar na het laatste contact. Gegevens die op onze administratie en facturen staan, bewaren wij zeven jaar om te voldoen aan de wettelijke fiscale bewaarplicht.</p>
          </section>

          <section>
            <h2>7. Delen met derden</h2>
            <p>Loep Woningstoffering verkoopt uw gegevens niet aan derden. Wij verstrekken uw gegevens uitsluitend aan derden indien dit noodzakelijk is voor de uitvoering van onze dienstverlening of om te voldoen aan een wettelijke verplichting. Met bedrijven die uw gegevens verwerken in onze opdracht sluiten wij een verwerkersovereenkomst.</p>
          </section>

          <section>
            <h2>8. Uw rechten</h2>
            <p>Op grond van de Algemene Verordening Gegevensbescherming (AVG) heeft u de volgende rechten:</p>
            <ul>
              <li><strong>Recht op inzage:</strong> u heeft het recht uw persoonsgegevens in te zien.</li>
              <li><strong>Recht op rectificatie:</strong> u heeft het recht onjuiste gegevens te laten corrigeren.</li>
              <li><strong>Recht op vergetelheid:</strong> u kunt verzoeken uw gegevens te laten verwijderen.</li>
              <li><strong>Recht op beperking:</strong> u heeft het recht de verwerking te laten beperken.</li>
              <li><strong>Recht op overdraagbaarheid:</strong> u kunt uw gegevens in digitale vorm opvragen.</li>
              <li><strong>Recht van bezwaar:</strong> u kunt bezwaar maken tegen de verwerking van uw gegevens.</li>
            </ul>
            <p>U kunt uw verzoek indienen via het e-mailadres vermeld in artikel 2. Wij reageren binnen vier weken. U heeft ook het recht een klacht in te dienen bij de <a href="https://www.autoriteitpersoonsgegevens.nl" target="_blank" rel="noopener">Autoriteit Persoonsgegevens</a>.</p>
          </section>

          <section>
            <h2>9. Beveiliging</h2>
            <p>Loep Woningstoffering neemt de bescherming van uw gegevens serieus en neemt passende technische en organisatorische maatregelen om misbruik, verlies, onbevoegde toegang, ongewenste openbaarmaking en ongeoorloofde wijziging van uw persoonsgegevens te voorkomen. Als u de indruk heeft dat uw gegevens niet goed beveiligd zijn of er aanwijzingen zijn van misbruik, neem dan contact met ons op via het e-mailadres vermeld in artikel 2.</p>
          </section>

          <section>
            <h2>10. Wijzigingen in deze privacyverklaring</h2>
            <p>Loep Woningstoffering behoudt zich het recht voor deze privacyverklaring te wijzigen. Wijzigingen worden gepubliceerd op deze pagina. Wij adviseren u de privacyverklaring regelmatig te raadplegen.</p>
          </section>
        </article>
      </div>
    </section>);

}

// ===== FOOTER =====
function Footer() {
  return (
    <footer className="footer">
      <div className="container">
        <div className="footer-grid">
          <div>
            <Logo />
            <p className="footer-blurb">
              Zelfstandig ondernemer met sinds 2015 werkervaring in vloerwerken. Bedrijf opgericht in 2023 — vakwerk, eerlijke prijzen en een ploeg die u bij naam kent, voor heel Noord-Holland.
            </p>
          </div>
          <div>
            <h4>Diensten</h4>
            <ul>
              <li><a href="#dienst/allround-vloerenlegger">Allround vloerenlegger</a></li>
              <li><a href="#dienst/elektrische-raamdecoratie">Elektrische raamdecoratie</a></li>
            </ul>
          </div>
          <div>
            <h4>Bedrijf</h4>
            <ul>
              <li><a href="#over-ons">Over ons</a></li>
              <li><a href="#contact">Contact</a></li>
            </ul>
          </div>
          <div>
            <h4>Contact</h4>
            <ul>
              <li><a href="tel:+31637564310">+31 6 37564310</a></li>
              <li><a href="mailto:r.diemeer@gmail.com">r.diemeer@gmail.com</a></li>
              <li><a href="https://www.linkedin.com/in/rick-diemeer-9baa7116b" target="_blank" rel="noopener" aria-label="LinkedIn profiel"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" style={{verticalAlign:'middle'}}><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a></li>
            </ul>
          </div>
        </div>
        <div className="footer-bottom">
          <span>© 2026 Loep Woningstoffering · Vloerleggers Noord-Holland</span>
          <span style={{ display: 'flex', gap: 24 }}>
            <a href="#voorwaarden">Algemene voorwaarden</a>
            <a href="#privacy">Privacyverklaring</a>
          </span>
        </div>
      </div>
    </footer>);

}

// ===== MOBILE STICKY CTA =====
function MobileCTA({ onQuoteClick }) {
  return (
    <div className="mobile-cta">
      <div className="mobile-cta-text">
        <span>Neem contact op</span>
        <small>VIA WHATSAPP</small>
      </div>
      <button className="btn btn-primary" onClick={onQuoteClick}>Contact</button>
    </div>);

}

// ===== APP =====
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "palette": "warm",
  "formMode": "multi",
  "heroLayout": "split"
} /*EDITMODE-END*/;

function useRoute() {
  const [route, setRoute] = useState(() => window.location.hash || '');
  useEffect(() => {
    const onHash = () => setRoute(window.location.hash || '');
    window.addEventListener('hashchange', onHash);
    return () => window.removeEventListener('hashchange', onHash);
  }, []);
  return route;
}

function App() {
  const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const route = useRoute();

  useEffect(() => {
    document.documentElement.dataset.palette = tweaks.palette;
  }, [tweaks.palette]);

  const onQuoteClick = () => {
    const scrollToContact = () => {
      const el = document.getElementById('contact');
      if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 80, behavior: 'smooth' });
    };
    if (route.startsWith('#dienst/')) {
      window.location.hash = '';
      // wait for home to render, then scroll to #contact
      setTimeout(scrollToContact, 60);
      return;
    }
    scrollToContact();
  };

  // Detail-page routing
  const detailMatch = route.match(/^#dienst\/(.+)$/);
  const detailService = detailMatch ? SERVICES.find((s) => s.slug === detailMatch[1]) : null;
  const isPrivacy = route === '#privacy';
  const isTerms = route === '#voorwaarden';

  useEffect(() => {
    if (isPrivacy || isTerms || detailService) {
      window.scrollTo({ top: 0, behavior: 'auto' });
    }
  }, [route]);

  const FloatingWA = (
    <a href="https://wa.me/31637564310"
    target="_blank"
    rel="noopener"
    className="wa-btn"
    aria-label="Neem contact op via WhatsApp">
      <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
        <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z" />
      </svg>
      <span className="wa-btn-label">WhatsApp</span>
    </a>
  );

  if (detailService) {
    return (
      <>
        <Nav onQuoteClick={onQuoteClick} />
        <ServiceDetail service={detailService} onQuoteClick={onQuoteClick} />
        <Footer />
      </>);
  }

  if (isPrivacy) {
    return (
      <>
        <Nav onQuoteClick={onQuoteClick} />
        <PrivacyPolicy />
        <Footer />
      </>);
  }

  if (isTerms) {
    return (
      <>
        <Nav onQuoteClick={onQuoteClick} />
        <TermsConditions />
        <Footer />
      </>);
  }

  return (
    <>
      <Nav onQuoteClick={onQuoteClick} />
      <Hero layout={tweaks.heroLayout} onQuoteClick={onQuoteClick} />
      <Services onQuoteClick={onQuoteClick} />
      <About />
      <CTASection formMode={tweaks.formMode} />
      <Footer />
      <MobileCTA onQuoteClick={onQuoteClick} />
    </>);

}

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