const { useState, useEffect, useRef, useMemo } = React;

/* ========== TWEAK DEFAULTS ========== */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "light",
  "accent": "#B85426",
  "showWpBar": false,
  "fontPairing": "serif-sans"
}/*EDITMODE-END*/;

/* ========== ICONS ========== */
const Icon = {
  arrow: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M5 12h14M13 6l6 6-6 6"/>
    </svg>
  ),
  arrowUp: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M7 17L17 7M9 7h8v8"/>
    </svg>
  ),
  arrowLeft: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M19 12H5M11 18l-6-6 6-6"/>
    </svg>
  ),
  check: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M5 12l5 5L20 7"/>
    </svg>
  ),
  plus: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" {...p}>
      <path d="M12 5v14M5 12h14"/>
    </svg>
  ),
  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>
  ),
  mail: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <rect x="3" y="5" width="18" height="14" rx="1"/>
      <path d="M3 7l9 6 9-6"/>
    </svg>
  ),
  pin: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" 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>
  ),
  ig: (p) => (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" {...p}>
      <rect x="3" y="3" width="18" height="18" rx="5"/>
      <circle cx="12" cy="12" r="4"/>
      <circle cx="17.5" cy="6.5" r="1" fill="currentColor"/>
    </svg>
  ),
  fb: (p) => (
    <svg viewBox="0 0 24 24" fill="currentColor" {...p}>
      <path d="M13.5 21v-8H16l.5-3.5H13.5V7.5c0-1 .3-1.7 1.8-1.7H16.7V2.7C16.4 2.6 15.4 2.5 14.3 2.5c-2.4 0-4 1.4-4 4v3H7.7V13h2.6v8h3.2z"/>
    </svg>
  ),
  li: (p) => (
    <svg viewBox="0 0 24 24" fill="currentColor" {...p}>
      <path d="M4.98 3.5C4.98 4.88 3.87 6 2.5 6S0 4.88 0 3.5 1.12 1 2.5 1s2.48 1.12 2.48 2.5zM.22 8h4.56v14H.22V8zm7.32 0h4.37v1.94h.06c.61-1.16 2.1-2.38 4.32-2.38 4.62 0 5.47 3.04 5.47 6.99V22h-4.56v-6.18c0-1.47-.03-3.36-2.05-3.36-2.05 0-2.36 1.6-2.36 3.25V22H7.54V8z"/>
    </svg>
  ),
  wa: (p) => (
    <svg viewBox="0 0 24 24" fill="currentColor" {...p}>
      <path d="M17.5 14.4c-.3-.1-1.7-.8-2-.9-.3-.1-.4-.1-.6.1-.2.3-.7.9-.9 1.1-.2.2-.3.2-.6.1-.3-.1-1.2-.4-2.3-1.4-.8-.7-1.4-1.7-1.6-1.9-.2-.3 0-.4.1-.6.1-.1.3-.3.4-.5.1-.2.2-.3.3-.5.1-.2 0-.4 0-.5 0-.1-.6-1.5-.8-2.1-.2-.5-.4-.5-.6-.5h-.5c-.2 0-.5.1-.7.3-.2.3-.9.9-.9 2.2 0 1.3.9 2.5 1.1 2.7.1.2 1.8 2.7 4.4 3.8 2.6 1 2.6.7 3 .7.5-.1 1.5-.6 1.7-1.2.2-.6.2-1.1.2-1.2-.1-.1-.3-.2-.6-.3zM12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.3A10 10 0 1 0 12 2z"/>
    </svg>
  ),
};

/* ========== DATA ========== */
const SERVICES = [
  {
    num: "01", tag: "Montage", title: "Montagewerk",
    desc: "Sommige dingen horen gewoon strak te hangen. Een televisie die niet scheef hangt, een kast die niet wiebelt en planken die écht blijven zitten. Van kleine montageklussen tot complete inrichting: wij zorgen dat alles stevig, netjes en precies op z'n plek komt. Geen gezoek naar handleidingen of missende schroefjes, dat regelen wij wel.",
    tasks: [
      "Meubels monteren",
      "TV-beugels plaatsen",
      "Wandplanken ophangen",
      "Lampen en verlichting monteren",
      "Gordijnrails en jaloezieën installeren",
      "Schilderijen en spiegels bevestigen",
      "Kasten op maat plaatsen",
      "Deurbeslag vervangen",
      "Kleine interieurafwerking",
    ],
  },
  {
    num: "02", tag: "Verbouw", title: "Kleine verbouwingen",
    desc: "Een woning hoeft niet compleet op de schop voor een groot verschil. Soms maken juist de slimme aanpassingen het huis fijner, moderner en praktischer. Wij helpen met kleine verbouwingen die direct resultaat geven, zonder maandenlange bouwchaos in huis.",
    tasks: [
      "Binnenwanden plaatsen of aanpassen",
      "Kleine badkamerverbouwingen",
      "Toilet renovaties",
      "Laminaat- en pvc-vloeren leggen",
      "Plafonds afwerken of verlagen",
      "Deuren plaatsen",
      "Isolatiewerkzaamheden",
      "Afwerking van muren en plafonds",
    ],
  },
  {
    num: "03", tag: "Reparatie", title: "Reparaties",
    desc: "Iedere woning heeft ze wel: die kleine irritaties waar je nét niet aan toekomt. Een deur die klemt, een kraan die drupt of iets dat \u201cnog even gemaakt moet worden\u201d. Wij lossen het snel en netjes op voordat klein groter wordt.",
    tasks: [
      "Lekkages oplossen",
      "Kranen repareren of vervangen",
      "Deuren en ramen afstellen",
      "Sloten vervangen",
      "Kitwerk herstellen",
      "Kleine elektra reparaties",
      "Beschadigingen herstellen",
      "Losse tegels vastzetten",
      "Dakgoot reparaties",
    ],
  },
  {
    num: "04", tag: "Onderhoud", title: "Onderhoud in en om het huis",
    desc: "Goed onderhoud merk je pas wanneer het níet gebeurt. Daarom helpen wij om jouw woning netjes, veilig en verzorgd te houden, binnen én buiten. Zo voorkom je onverwachte problemen en blijft alles in topconditie.",
    tasks: [
      "Klein schilderwerk",
      "Houtwerk onderhoud",
      "Dakgoten reinigen",
      "Gevel en terras schoonmaken",
      "Kitnaden controleren en vervangen",
      "Kleine tuinwerkzaamheden",
      "Ventilatieroosters schoonmaken",
      "Periodiek woningonderhoud",
      "Kleine herstelwerkzaamheden",
    ],
  },
  {
    num: "05", tag: "Houtwerk", title: "Veranda's & overkappingen",
    desc: "Buiten zitten is altijd een goed idee, als het maar comfortabel is. Wij bouwen veranda's en overkappingen waar sfeer, gemak en vakwerk samenkomen. Een plek om lange zomeravonden door te brengen of droog van je koffie te genieten terwijl de regen tikt op het dak.",
    tasks: [
      "Veranda's bouwen",
      "Overkappingen plaatsen",
      "Pergola's maken",
      "Vlonders leggen",
      "Buitenverlichting installeren",
      "Houten buitenconstructies",
      "Carports realiseren",
      "Terrasoverkappingen bouwen",
      "Buitenkeukens monteren",
    ],
  },
  {
    num: "06", tag: "Installatie", title: "Installatiewerk",
    desc: "Een installatie moet gewoon werken. Zonder gedoe, zonder losse kabels en zonder verrassingen. Wij verzorgen kleine installatiewerkzaamheden netjes, veilig en professioneel.",
    tasks: [
      "Lampen aansluiten",
      "Stopcontacten plaatsen",
      "Schakelaars vervangen",
      "Sanitair installeren",
      "Kranen vervangen",
      "Wasmachines aansluiten",
      "Keukenapparatuur installeren",
      "Afzuigkappen plaatsen",
      "Buitenverlichting aansluiten",
      "Kleine loodgieterswerkzaamheden",
    ],
  },
];

const WHY = [
  { num: "01", title: "Betrouwbaar", desc: "Afspraak is afspraak. Op tijd aanwezig, duidelijke prijs vooraf, geen verrassingen." },
  { num: "02", title: "Netjes", desc: "Schoencovers aan, plastic erover, bezem mee. We laten het achter zoals we het vonden." },
  { num: "03", title: "Persoonlijk", desc: "Eén aanspreekpunt. Direct contact met de vakman die ook daadwerkelijk bij je thuis komt." },
  { num: "04", title: "Flexibel", desc: "Avond, weekend, kort dag. Klein of groot werk. Eén klus of een hele klussenlijst." },
];

const PROCESS = [
  { num: "01", title: "Aanvraag", desc: "Heb je een klus, idee of project? Laat het ons weten via telefoon, WhatsApp of het contactformulier. Groot of klein, we denken graag met je mee en kijken direct naar de mogelijkheden." },
  { num: "02", title: "Offerte", desc: "Geen verrassingen achteraf. Je ontvangt een duidelijke offerte waarin precies staat wat we gaan doen, wat het kost en hoe we het aanpakken. Transparant en overzichtelijk." },
  { num: "03", title: "Inplannen", desc: "Akkoord? Dan plannen we de werkzaamheden op een moment dat het jou uitkomt. We houden van heldere afspraken en korte lijnen, zodat je weet waar je aan toe bent. Spoed? Vaak nog dezelfde dag mogelijk." },
  { num: "04", title: "Uitvoering", desc: "Tijdens de werkzaamheden werken we netjes, zorgvuldig en met aandacht voor detail. Geen haastwerk, maar degelijk vakwerk waar je jarenlang plezier van hebt." },
  { num: "05", title: "Oplevering", desc: "Pas klaar als alles klopt. Samen lopen we het werk na en zorgen we ervoor dat alles netjes wordt opgeleverd. Jij tevreden, dan zijn wij dat ook." },
];

const PROJECTS = [
  { src: "assets/veranda-buiten.jpg", title: "Veranda met douglas latwerk", tag: "VERANDA · 2025", layout: "p-1", location: "Zutphen" },
  { src: "assets/veranda-binnen.jpg", title: "Veranda met lichtkoepel", tag: "VERANDA · 2025", layout: "p-2", location: "Zutphen" },
  { src: "assets/houtwand.jpg", title: "Houtgevel op maat", tag: "VERANDA · 2025", layout: "p-3", location: "Zutphen" },
  { src: "assets/detail-hout.jpg", title: "Detail · inbouwspots & afwerking", tag: "VERANDA · 2025", layout: "p-4", location: "Zutphen" },
  { src: "assets/schuur.jpg", title: "Bijgebouw in lariks", tag: "VERANDA · 2025", layout: "p-5", location: "Zutphen" },
];

const TESTIMONIALS = [
  { quote: "Binnen een week was de hele bijkeuken verbouwd. Strakker dan ik durfde hopen, en de prijs klopte tot op de euro.", name: "Marieke V.", role: "Apeldoorn", initial: "M" },
  { quote: "Een echte vakman. Eerlijk, snel, en hij denkt mee. We hebben nu een vaste klusser voor het hele huis.", name: "Jeroen B.", role: "Beekbergen", initial: "J" },
  { quote: "Inbouwkast op maat — past tot de millimeter. Werkplaats schoon achtergelaten alsof er niemand geweest is.", name: "Sanne T.", role: "Ede", initial: "S" },
  { quote: "Vier klussen op één dag, allemaal netjes afgewerkt. Communicatie helder, geen verrassingen op de factuur.", name: "Pieter K.", role: "Vaassen", initial: "P" },
  { quote: "De keuken-montage was complex maar werd kalm en grondig aangepakt. Aanrader voor wie kwaliteit wil.", name: "Lisanne D.", role: "Loenen", initial: "L" },
];

/* ========== COMPONENTS ========== */
function WpBar() {
  return (
    <div className="wp-bar">
      <svg className="wp-logo" viewBox="0 0 122.5 122.5" fill="#c3c4c7"><path d="M61.3 0a61.3 61.3 0 1 0 61.2 61.3A61.3 61.3 0 0 0 61.3 0zM6.2 61.3a55 55 0 0 1 4.7-22.3l26.4 72.4A55.2 55.2 0 0 1 6.2 61.3zm55.1 55.2a55 55 0 0 1-15.6-2.3l16.6-48.2 17 46.7a5.2 5.2 0 0 0 .4.8 55.1 55.1 0 0 1-18.4 3zm7.6-81c3.3-.2 6.3-.6 6.3-.6 3-.4 2.6-4.8-.4-4.6 0 0-8.9.7-14.7.7-5.4 0-14.5-.7-14.5-.7-3-.2-3.3 4.3-.3 4.6 0 0 2.8.4 5.8.6l8.6 23.6L48 95.1 27.7 35c3.3-.2 6.3-.6 6.3-.6 3-.4 2.6-4.8-.4-4.6 0 0-8.9.7-14.7.7L17.5 30A55.1 55.1 0 0 1 100 19.7c-.2 0-.4 0-.7-.1-5.4 0-9.3 4.7-9.3 9.8 0 4.5 2.6 8.4 5.4 12.9 2.1 3.7 4.5 8.4 4.5 15.2 0 4.7-1.8 10.2-4.2 17.8L90 88.6zm17.8 73.4l16.9-48.8c3.2-7.9 4.2-14.2 4.2-19.8 0-2-.1-3.9-.4-5.7a55.1 55.1 0 0 1-20.7 74.3z"/></svg>
      <a className="wp-item" href="#"><span>Skål Designs</span></a>
      <a className="wp-item" href="#">Aanpassen</a>
      <a className="wp-item" href="#">+ Nieuw</a>
      <a className="wp-item" href="#">Reacties</a>
      <span className="spacer"/>
      <span className="wp-item">Hallo, Beheerder</span>
    </div>
  );
}

function Nav({ active, onNavigate }) {
  const [scrolled, setScrolled] = useState(false);
  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 30);
    window.addEventListener('scroll', onScroll, { passive: true });
    onScroll();
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  const links = [
    { id: "home", label: "Home" },
    { id: "diensten", label: "Diensten" },
    { id: "projecten", label: "Projecten" },
    { id: "werkwijze", label: "Werkwijze" },
    { id: "over", label: "Over ons" },
    { id: "contact", label: "Contact" },
  ];
  return (
    <nav className={`nav ${scrolled ? 'scrolled' : ''}`}>
      <div className="container nav-inner">
        <a className="brand" href="#home" onClick={(e) => { e.preventDefault(); onNavigate("home"); }}>
          <img className="brand-logo" src="assets/logo.svg" alt="Skål Designs"/>
          <span className="brand-tag">Designs</span>
        </a>
        <div className="nav-links">
          {links.map(l => (
            <a key={l.id} href={`#${l.id}`} className={active === l.id ? "active" : ""}
              onClick={(e) => { e.preventDefault(); onNavigate(l.id); }}>{l.label}</a>
          ))}
        </div>
        <a className="nav-cta" href="#contact" onClick={(e) => { e.preventDefault(); onNavigate("contact"); }}>
          Offerte aanvragen <Icon.arrow/>
        </a>
      </div>
    </nav>
  );
}

function Hero({ onNavigate }) {
  return (
    <section id="home" className="hero" data-screen-label="Home">
      <div className="container">
        <div className="hero-grid reveal">
          <div>
            <span className="eyebrow" style={{marginBottom: 32, display: 'inline-flex'}}>Apeldoorn ·</span>
            <h1 style={{marginTop: 20}}>
              Vakmanschap<br/>
              voor <span className="it">elke</span><br/>
              klus.
            </h1>
          </div>
          <div className="hero-meta">
            <p className="hero-sub">
              Professionele hulp voor kleine en grote werkzaamheden in en rondom huis.
              Eén vakman, één aanspreekpunt, één afspraak die klopt.
            </p>
            <div className="hero-ctas">
              <a className="btn" href="#contact" onClick={(e)=>{e.preventDefault(); onNavigate("contact");}}>
                Offerte aanvragen <Icon.arrow className="btn-arrow"/>
              </a>
              <a className="btn alt" href="#diensten" onClick={(e)=>{e.preventDefault(); onNavigate("diensten");}}>
                Bekijk diensten
              </a>
            </div>
          </div>
        </div>

        <div className="hero-image-row reveal">
          <div className="hero-image" style={{aspectRatio: '16/9', borderRadius: 'var(--radius)', overflow: 'hidden', position: 'relative'}}>
            <img src="assets/veranda-binnen.jpg" alt="Veranda met lichtkoepel in Zutphen"
              style={{width:'100%', height:'100%', objectFit:'cover', display:'block'}}/>
            <span className="ph-corner" style={{color: '#fff', background: 'rgba(22,20,15,0.55)', padding: '6px 10px', backdropFilter: 'blur(8px)'}}>VERANDA · ZUTPHEN · 2025</span>
          </div>
          <div className="hero-aside-card">
            <span className="label">Project</span>
            <h3>Veranda met lichtkoepel & douglas houtwerk</h3>
            <div className="meta">
              <span><i className="dot"></i>Opgeleverd</span>
              <span>2025 · Zutphen</span>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function Ticker() {
  const items = ["Montage", "Reparatie", "Maatwerk", "Onderhoud", "Verbouw", "Schilderwerk", "Tuinklussen", "Hang- en sluitwerk"];
  const all = [...items, ...items, ...items];
  return (
    <div className="ticker">
      <div className="ticker-track">
        {all.map((t, i) => <span key={i}>{t}</span>)}
      </div>
    </div>
  );
}

function Intro() {
  return (
    <section data-screen-label="Intro">
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Over Skål Designs</span>
            <h2 style={{marginTop: 24}}>Een vakman die <span className="it">opruimt</span> als hij weggaat.</h2>
          </div>
          <p className="sec-sub">
            Skål Designs is het klussenbedrijf van Apeldoorn voor wie het werk
            goed gedaan wil hebben — door één vaste persoon, op tijd, voor een eerlijke prijs.
          </p>
        </div>
        <div className="intro-grid reveal">
          <p className="lead">
            We werken voor particulieren die geen <span className="it">half werk</span> willen.
            Of het nu gaat om een wankele deur, een nieuwe inbouwkast,
            of een hele rij klussen die maar blijft liggen — wij pakken het op,
            werken het netjes af, en lopen samen met je rond voor we vertrekken.
          </p>
          <div className="intro-stats">
            <div className="stat">
              <div className="stat-num">240+</div>
              <div className="stat-label">Klussen voltooid</div>
            </div>
            <div className="stat">
              <div className="stat-num">4.9</div>
              <div className="stat-label">Gemiddelde beoordeling</div>
            </div>
            <div className="stat">
              <div className="stat-num">24u</div>
              <div className="stat-label">Reactie op offerte</div>
            </div>
            <div className="stat">
              <div className="stat-num">100%</div>
              <div className="stat-label">Tevreden­heids­garantie</div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function Services({ onNavigate }) {
  const [open, setOpen] = useState(null);
  return (
    <section id="diensten" data-screen-label="Diensten">
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Diensten</span>
            <h2 style={{marginTop: 24}}>Wat we <span className="it">doen</span>.</h2>
          </div>
          <p className="sec-sub">
            Van een losse klus tot een complete klussenlijst. Geen project te klein — en de meeste te overzien zonder gedoe.
          </p>
        </div>

        <div className="services-accordion reveal">
          {SERVICES.map((s, i) => {
            const isOpen = open === i;
            return (
              <div className={"service-item" + (isOpen ? " open" : "")} key={s.num}>
                <button className="service-header" onClick={() => setOpen(isOpen ? null : i)} aria-expanded={isOpen}>
                  <span className="service-num">{s.num} / {s.tag}</span>
                  <span className="service-title">{s.title}</span>
                  <span className="service-toggle"><Icon.plus/></span>
                </button>
                <div className="service-body">
                  <div className="service-body-inner">
                    <p className="service-desc">{s.desc}</p>
                    <div className="service-tasks">
                      <span className="service-tasks-label">Werkzaamheden</span>
                      <ul>
                        {s.tasks.map(t => (
                          <li key={t}><Icon.check/><span>{t}</span></li>
                        ))}
                      </ul>
                    </div>
                    <button className="service-cta" onClick={() => onNavigate("contact")}>
                      Offerte aanvragen <Icon.arrow/>
                    </button>
                  </div>
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </section>
  );
}

function Why() {
  return (
    <div className="why-wrap" data-screen-label="Waarom">
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Waarom Skål Designs</span>
            <h2 style={{marginTop: 24}}>Vier afspraken<br/>die we <span className="it">altijd</span> waarmaken.</h2>
          </div>
          <p className="sec-sub">
            Een klussenbedrijf hoort betrouwbaar te zijn. We hebben het in vier punten gevangen — en houden er onszelf aan.
          </p>
        </div>
        <div className="why-grid reveal">
          {WHY.map(w => (
            <div className="why-item" key={w.num}>
              <span className="why-num">{w.num}</span>
              <h3>{w.title}</h3>
              <p>{w.desc}</p>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

function Process() {
  return (
    <section id="werkwijze" data-screen-label="Werkwijze">
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Werkwijze</span>
            <h2 style={{marginTop: 24}}>Van aanvraag tot <span className="it">oplevering</span>.</h2>
          </div>
          <p className="sec-sub">
            Een rustige, voorspelbare aanpak. Geen verrassingen, geen meerwerk zonder overleg.
          </p>
        </div>
        <div className="process-list reveal">
          {PROCESS.map(p => (
            <div className="process-row" key={p.num}>
              <span className="process-num">— {p.num}</span>
              <span className="process-title">{p.title}</span>
              <span className="process-desc">{p.desc}</span>
              <Icon.arrow className="process-arrow"/>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function Projects({ onNavigate }) {
  return (
    <div className="projects-wrap" id="projecten" data-screen-label="Projecten">
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Uitgelichte projecten</span>
            <h2 style={{marginTop: 24}}>Recent <span className="it">werk</span>.</h2>
          </div>
          <p className="sec-sub">
            Een selectie uit verandas, overkappingen en houtwerk-projecten in en rond Apeldoorn.
            Gemaakt met douglas, lariks en eerlijk vakmanschap.
          </p>
        </div>
        <div className="projects-grid reveal">
          {PROJECTS.map((p, i) => (
            <div className={`project ${p.layout}`} key={i} onClick={() => onNavigate("contact")}>
              <span className="project-corner">{p.tag} · {p.location}</span>
              <img src={p.src} alt={p.title} loading="lazy"/>
              <div className="project-meta">
                <div>
                  <span className="tag">PROJECT 0{i+1}</span>
                  <h4>{p.title}</h4>
                </div>
                <span className="arrow"><Icon.arrowUp/></span>
              </div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

function Testimonials() {
  const [i, setI] = useState(0);
  const [perView, setPerView] = useState(3);
  useEffect(() => {
    const update = () => {
      if (window.innerWidth < 600) setPerView(1);
      else if (window.innerWidth < 900) setPerView(2);
      else setPerView(3);
    };
    update();
    window.addEventListener('resize', update);
    return () => window.removeEventListener('resize', update);
  }, []);
  const max = Math.max(0, TESTIMONIALS.length - perView);
  const clamped = Math.min(i, max);
  const offset = clamped * (100 / perView);

  return (
    <div className="testi-wrap">
      <section data-screen-label="Reviews" style={{padding: 'clamp(72px, 11vw, 140px) 0'}}>
        <div className="container">
          <div className="sec-head reveal">
            <div>
              <span className="eyebrow">Klantreviews</span>
              <h2 style={{marginTop: 24}}>Wat klanten <span className="it">zeggen</span>.</h2>
            </div>
            <p className="sec-sub">
              Een eerlijke selectie uit ruim 80 reviews — verzameld via Google en persoonlijke gesprekken na oplevering.
            </p>
          </div>

          <div className="testi-track-wrap reveal">
            <div className="testi-track" style={{transform: `translateX(calc(-${offset}% - ${clamped * (24 / perView)}px))`}}>
              {TESTIMONIALS.map((t, idx) => (
                <article className="testi-card" key={idx}>
                  <p className="testi-quote">{t.quote}</p>
                  <div className="testi-author">
                    <div className="testi-avatar">{t.initial}</div>
                    <div>
                      <div className="name">{t.name}</div>
                      <div className="role">{t.role}</div>
                    </div>
                  </div>
                </article>
              ))}
            </div>
          </div>

          <div className="testi-controls reveal" style={{marginTop: 40, justifyContent: 'space-between'}}>
            <div className="testi-progress">
              {Array.from({length: max + 1}).map((_, idx) => (
                <span key={idx} className={`testi-dot ${idx === clamped ? 'active' : ''}`}/>
              ))}
            </div>
            <div className="testi-controls">
              <button className="testi-btn" onClick={() => setI(Math.max(0, clamped - 1))} aria-label="Vorige"><Icon.arrowLeft/></button>
              <button className="testi-btn" onClick={() => setI(Math.min(max, clamped + 1))} aria-label="Volgende"><Icon.arrow/></button>
            </div>
          </div>
        </div>
      </section>
    </div>
  );
}

function About() {
  return (
    <section id="over" data-screen-label="Over ons">
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Over ons</span>
            <h2 style={{marginTop: 24}}>Een kleine onderneming<br/>met <span className="it">grote</span> standaarden.</h2>
          </div>
          <p className="sec-sub">
            Skål Designs is een eenmanszaak uit Apeldoorn. Eén vakman, met een netwerk van vertrouwde collega's voor het zware werk.
          </p>
        </div>

        <div className="about-grid reveal">
          <div className="about-image" style={{aspectRatio: '4/5', borderRadius: 'var(--radius)', overflow: 'hidden', position: 'relative'}}>
            <img src="assets/houtwand.jpg" alt="Houten gevelbekleding met verticale latten — werk van Skål Designs"
              style={{width:'100%', height:'100%', objectFit:'cover', display:'block'}}/>
            <span className="ph-corner" style={{color:'#fff', background:'rgba(22,20,15,0.55)', padding:'6px 10px', backdropFilter:'blur(8px)', fontFamily:'var(--font-mono)', fontSize:11, letterSpacing:'0.14em', textTransform:'uppercase'}}>VERANDA · ZUTPHEN · 2025</span>
          </div>
          <div className="about-text">
            <p>
              Skål is Scandinavisch voor "<span className="it">proost</span>" — een teken van wederzijds respect.
              Dat is precies hoe ik wil werken: met respect voor jouw huis,
              jouw tijd, en het vak.
            </p>
            <p>
              Ik begon Skål Designs omdat ik genoeg had gezien van klussers die te laat komen, een rommel achterlaten,
              of een prijs noemen die plotseling verdubbelt. Het kan anders. Het hoort anders.
            </p>
            <p>
              Mijn werk loopt van een wankele deur of een tv-beugel tot complete verandas, overkappingen en houtgevels op maat —
              elke klus krijgt dezelfde aanpak: ik kom op tijd, leg uit wat ik doe, doe het netjes,
              en lever pas op als jij tevreden bent.
            </p>
            <div className="signature">
              <span className="signature-mark">S.</span>
              <div className="signature-meta">
                <div className="name">Skål Designs</div>
                <div className="role">KVK 88128938 · Eenmanszaak</div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function ContactForm() {
  const [form, setForm] = useState({ naam: "", email: "", tel: "", bericht: "" });
  const [errors, setErrors] = useState({});
  const [submitted, setSubmitted] = useState(false);

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

  const submit = (e) => {
    e.preventDefault();
    const er = {};
    if (form.naam.trim().length < 2) er.naam = "Naam ontbreekt";
    if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(form.email)) er.email = "Ongeldig e-mailadres";
    if (form.bericht.trim().length < 10) er.bericht = "Vertel ons iets meer over de klus";
    setErrors(er);
    if (Object.keys(er).length === 0) {
      setSubmitted(true);
      setForm({ naam: "", email: "", tel: "", bericht: "" });
      setTimeout(() => setSubmitted(false), 4000);
    }
  };

  return (
    <>
      <form className="form" onSubmit={submit} noValidate>
        <div className={`field ${errors.naam ? 'error' : ''}`}>
          <label htmlFor="naam">Naam *</label>
          <input id="naam" type="text" value={form.naam} onChange={e => update('naam', e.target.value)} placeholder="Voor- en achternaam"/>
          <span className="err">{errors.naam}</span>
        </div>
        <div className={`field ${errors.email ? 'error' : ''}`}>
          <label htmlFor="email">E-mailadres *</label>
          <input id="email" type="email" value={form.email} onChange={e => update('email', e.target.value)} placeholder="jij@voorbeeld.nl"/>
          <span className="err">{errors.email}</span>
        </div>
        <div className="field full">
          <label htmlFor="tel">Telefoonnummer</label>
          <input id="tel" type="tel" value={form.tel} onChange={e => update('tel', e.target.value)} placeholder="06 — optioneel"/>
          <span className="err"></span>
        </div>
        <div className={`field full ${errors.bericht ? 'error' : ''}`}>
          <label htmlFor="bericht">Bericht *</label>
          <textarea id="bericht" value={form.bericht} onChange={e => update('bericht', e.target.value)} placeholder="Beschrijf je klus — een foto erbij mag altijd via WhatsApp"/>
          <span className="err">{errors.bericht}</span>
        </div>
        <div className="form-submit-row">
          <span className="form-note">* Verplichte velden. We reageren binnen 24 uur op werkdagen.</span>
          <button type="submit" className="btn accent">
            Verstuur aanvraag <Icon.arrow className="btn-arrow"/>
          </button>
        </div>
      </form>
      <div className={`toast ${submitted ? 'show' : ''}`}>
        <span className="dot"></span>
        <span>Bedankt — je aanvraag is verstuurd.</span>
      </div>
    </>
  );
}

function Contact() {
  return (
    <section id="contact" data-screen-label="Contact" style={{background: 'var(--bg-2)'}}>
      <div className="container">
        <div className="sec-head reveal">
          <div>
            <span className="eyebrow">Contact</span>
            <h2 style={{marginTop: 24}}>Vertel ons over <span className="it">je klus</span>.</h2>
          </div>
          <p className="sec-sub">
            Een mail, een belletje, of een appje met een foto. We reageren binnen 24 uur met een eerlijke inschatting.
          </p>
        </div>

        <div className="contact-grid reveal">
          <div>
            <ContactForm/>
          </div>
          <div style={{display:'flex', flexDirection:'column', gap: 16}}>
            <div className="contact-info">
              <div className="info-block">
                <div className="label">Bellen</div>
                <a href="tel:+31616650882" className="value">06 — 16 65 08 82</a>
              </div>
              <div className="info-block">
                <div className="label">Mailen</div>
                <a href="mailto:info@skal-designs.nl" className="value">info@skal-designs.nl</a>
              </div>
              <div className="info-block">
                <div className="label">Bezoekadres</div>
                <div className="value small">
                  Kamillestraat 35<br/>
                  7322 PL Apeldoorn<br/>
                  Nederland
                </div>
              </div>
              <div className="info-block">
                <div className="label">Administratie</div>
                <div className="value small">
                  KVK 88128938 · Eenmanszaak<br/>
                  BTW-id op aanvraag
                </div>
              </div>
            </div>
            <div className="map-wrap">
              <div className="map-grid"></div>
              <svg className="map-roads" viewBox="0 0 400 250" preserveAspectRatio="none">
                <path d="M0 80 Q 100 60 200 100 T 400 90" stroke="var(--line)" strokeWidth="6" fill="none"/>
                <path d="M0 170 Q 120 200 220 160 T 400 180" stroke="var(--line)" strokeWidth="6" fill="none"/>
                <path d="M150 0 Q 180 80 200 130 T 240 250" stroke="var(--line)" strokeWidth="6" fill="none"/>
                <path d="M280 0 L 280 250" stroke="var(--line)" strokeWidth="3" fill="none"/>
              </svg>
              <span className="ph-corner map">APELDOORN · KAMILLESTRAAT</span>
              <div className="map-pin"></div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function CtaMega({ onNavigate }) {
  return (
    <div className="cta-wrap">
      <div className="container">
        <div className="cta-card reveal">
          <h2>
            Klaar voor een<br/>
            klus die <span className="it">klopt</span>?
          </h2>
          <div className="cta-actions">
            <a className="btn" href="#contact" onClick={(e)=>{e.preventDefault(); onNavigate("contact");}}>
              Offerte aanvragen <Icon.arrow className="btn-arrow"/>
            </a>
            <a className="btn alt" href="tel:+31616650882">
              <Icon.phone style={{width:14, height:14}}/> Of bel direct
            </a>
          </div>
        </div>
      </div>
    </div>
  );
}

function Footer() {
  return (
    <footer>
      <div className="container">
        <div className="footer-grid">
          <div className="footer-brand">
            <img src="assets/logo.svg" alt="Skål Designs" style={{height: 64, width: 'auto', marginBottom: 20, display: 'block'}}/>
            <p>
              Klussenbedrijf uit Apeldoorn voor verandas, montage, onderhoud,
              reparaties en maatwerk in en rondom huis.
            </p>
          </div>
          <div className="footer-col">
            <h4>Diensten</h4>
            <ul>
              <li><a href="#diensten">Montagewerk</a></li>
              <li><a href="#diensten">Verbouwingen</a></li>
              <li><a href="#diensten">Reparaties</a></li>
              <li><a href="#diensten">Onderhoud</a></li>
              <li><a href="#diensten">Verandas & maatwerk</a></li>
            </ul>
          </div>
          <div className="footer-col">
            <h4>Bedrijf</h4>
            <ul>
              <li><a href="#projecten">Projecten</a></li>
              <li><a href="#over">Over ons</a></li>
              <li><a href="#werkwijze">Werkwijze</a></li>
              <li><a href="#contact">Contact</a></li>
              <li><a href="#">Algemene voorwaarden</a></li>
            </ul>
          </div>
          <div className="footer-col">
            <h4>Contact</h4>
            <ul>
              <li><a href="tel:+31616650882">06 — 16 65 08 82</a></li>
              <li><a href="mailto:info@skal-designs.nl">info@skal-designs.nl</a></li>
              <li>Kamillestraat 35<br/>7322 PL Apeldoorn</li>
              <li>KVK 88128938</li>
            </ul>
          </div>
        </div>
        <div className="footer-bottom">
          <span>© 2026 Skål Designs · Alle rechten voorbehouden</span>
          <div className="socials">
            <a href="#" aria-label="WhatsApp"><Icon.wa/></a>
            <a href="#" aria-label="Instagram"><Icon.ig/></a>
            <a href="#" aria-label="Facebook"><Icon.fb/></a>
            <a href="#" aria-label="LinkedIn"><Icon.li/></a>
          </div>
        </div>
      </div>
    </footer>
  );
}

/* ========== APP ========== */
function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [active, setActive] = useState("home");

  /* Apply tweaks to CSS */
  useEffect(() => {
    document.documentElement.setAttribute('data-theme', t.theme);
    document.documentElement.style.setProperty('--accent', t.accent);
    if (t.fontPairing === "sans-only") {
      document.documentElement.style.setProperty('--font-display', "'Geist', sans-serif");
    } else if (t.fontPairing === "serif-only") {
      document.documentElement.style.setProperty('--font-display', "'Instrument Serif', serif");
      document.documentElement.style.setProperty('--font-body', "'Instrument Serif', serif");
    } else {
      document.documentElement.style.setProperty('--font-display', "'Instrument Serif', serif");
      document.documentElement.style.setProperty('--font-body', "'Geist', sans-serif");
    }
    document.body.classList.toggle('has-wp-bar', t.showWpBar);
  }, [t]);

  /* Scroll-to navigation */
  const onNavigate = (id) => {
    const el = document.getElementById(id);
    if (el) {
      const offset = t.showWpBar ? 32 : 0;
      const y = el.getBoundingClientRect().top + window.scrollY - offset;
      window.scrollTo({ top: y, behavior: 'smooth' });
    }
    setActive(id);
  };

  /* Reveal observer + section spy */
  useEffect(() => {
    const reveals = document.querySelectorAll('.reveal');
    const io = new IntersectionObserver((entries) => {
      entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); }});
    }, { threshold: 0.12, rootMargin: '0px 0px -50px 0px' });
    reveals.forEach(r => io.observe(r));

    const sections = ['home','diensten','projecten','werkwijze','over','contact'];
    const spy = () => {
      const y = window.scrollY + window.innerHeight * 0.35;
      let cur = 'home';
      for (const s of sections) {
        const el = document.getElementById(s);
        if (el && y >= el.offsetTop) cur = s;
      }
      setActive(cur);
    };
    window.addEventListener('scroll', spy, { passive: true });
    spy();
    return () => { io.disconnect(); window.removeEventListener('scroll', spy); };
  }, []);

  return (
    <>
      {t.showWpBar && <WpBar/>}
      <Nav active={active} onNavigate={onNavigate}/>
      <Hero onNavigate={onNavigate}/>
      <Ticker/>
      <Intro/>
      <Services onNavigate={onNavigate}/>
      <Why/>
      <Projects onNavigate={onNavigate}/>
      <Process/>
      <Testimonials/>
      <About/>
      <CtaMega onNavigate={onNavigate}/>
      <Contact/>
      <Footer/>

      <TweaksPanel title="Tweaks">
        <TweakSection label="Thema">
          <TweakRadio label="Modus" value={t.theme} options={[
            {value: "light", label: "Licht"},
            {value: "dark", label: "Donker"},
          ]} onChange={(v) => setTweak('theme', v)}/>
          <TweakColor label="Accent" value={t.accent} options={[
            "#B85426", "#16140F", "#3A5A40", "#1F4E79", "#8B5E3C"
          ]} onChange={(v) => setTweak('accent', v)}/>
        </TweakSection>
        <TweakSection label="Typografie">
          <TweakRadio label="Pairing" value={t.fontPairing} options={[
            {value: "serif-sans", label: "Serif+Sans"},
            {value: "sans-only", label: "Sans"},
            {value: "serif-only", label: "Serif"},
          ]} onChange={(v) => setTweak('fontPairing', v)}/>
        </TweakSection>
        <TweakSection label="WordPress">
          <TweakToggle label="Admin-bar" value={t.showWpBar} onChange={(v) => setTweak('showWpBar', v)}/>
        </TweakSection>
      </TweaksPanel>
    </>
  );
}

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