{
  "version": 3,
  "sources": ["/cdn/shop/t/69/assets/cu-samenstellen.js?r=20"],
  "sourcesContent": ["/*\n  Cycle-Up: Stel je pakket samen (V10, 2026-10-04).\n  Leest het live assortiment via de Section Rendering API (sections/cu-samenstellen-data.liquid) en bouwt daarmee:\n  vijf vragen of \u00E9\u00E9n zin, een top 3 met uitleg, zelf samenstellen vanaf \u20AC1.000 excl. btw, en het afronden via het\n  contactformulier van Shopify (aanvraag of order). Geen eigen productlijst: wat niet meer in de webshop staat, valt weg.\n*/\n(() => {\n  'use strict';\n\n  const root = document.querySelector('[data-cu-ps]');\n  if (!root) return;\n  const cfgEl = root.querySelector('[data-cu-ps-config]');\n  const cfg = cfgEl ? JSON.parse(cfgEl.textContent) : {};\n  const app = root.querySelector('[data-cu-ps-app]');\n  const form = document.getElementById('cu-ps-form');\n  const formVelden = form ? form.querySelector('[data-cu-ps-formvelden]') : null;\n  const OPSLAG = 'cu-ps-staat';\n\n  const eur = new Intl.NumberFormat('nl-NL', { style: 'currency', currency: 'EUR' });\n  const geld = (c) => eur.format((c || 0) / 100);\n  const esc = (s) => String(s ?? '').replace(/[&<>\"']/g, (ch) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[ch]));\n  const heeft = (lijst, w) => Array.isArray(lijst) && lijst.includes(w);\n  const heeftEen = (lijst, ws) => Array.isArray(lijst) && ws.some((w) => lijst.includes(w));\n  const meet = (naam, data) => {\n    try { window.Shopify?.analytics?.publish?.('cu_ps_' + naam, { ...(data || {}), via: (typeof st !== 'undefined' && st && st.via) || '' }); } catch (e) { /* meten mag nooit de pagina breken */ }\n  };\n  const lees = (k) => { try { return JSON.parse(sessionStorage.getItem(k) || 'null'); } catch (e) { return null; } };\n  const schrijf = (k, v) => { try { sessionStorage.setItem(k, JSON.stringify(v)); } catch (e) { /* priv\u00E9venster */ } };\n  const wis = (k) => { try { sessionStorage.removeItem(k); } catch (e) { /* niets */ } };\n\n  const pakketTypes = new Set(String(cfg.kerstTypes || '').split(',').map((s) => s.trim()).filter(Boolean).concat(['Kerstpakket', 'Wijnpakket', 'Voetbalpakket', 'Borrelpakket']));\n  const KERSTMIN = Number(cfg.kerstMin) || 6;\n  const DREMPEL = Number(cfg.drempelExcl) || 100000;\n  const HANDLING = Number(cfg.handlingExcl) || 500;\n  const ADRESPRIJS = Number(cfg.adresPrijs) || 995;\n  const PRIJSBANDEN = [\n    { id: 'tot10', label: 'Tot \u20AC10', min: 0, max: 1000 },\n    { id: '10-20', label: '\u20AC10 tot \u20AC20', min: 1000, max: 2000 },\n    { id: '20-40', label: '\u20AC20 tot \u20AC40', min: 2000, max: 4000 },\n    { id: '40+', label: '\u20AC40 en meer', min: 4000, max: Infinity }\n  ];\n  // Lucide-iconen voor het startscherm (design system, 2026-10-17)\n  const ICOON = {\n    vragen: '<path d=\"m3 17 2 2 4-4\"/><path d=\"m3 7 2 2 4-4\"/><path d=\"M13 6h8\"/><path d=\"M13 12h8\"/><path d=\"M13 18h8\"/>',\n    zin: '<path d=\"M12 20h9\"/><path d=\"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z\"/>',\n    bladeren: '<rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"/>',\n    zelf: '<path d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\"/><path d=\"M12 22V12\"/><path d=\"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7\"/><path d=\"m7.5 4.27 9 5.15\"/>',\n  };\n  const icoon = (naam) => `<span class=\"cu-iblok\" aria-hidden=\"true\"><svg class=\"icon cu-icoon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${ICOON[naam]}</svg></span>`;\n  const LOEP = '<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M15.5 15.5 21 21M10.5 7.8v5.4M7.8 10.5h5.4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n  const attr = (w) => String(w).replace(/[\"\\\\]/g, '\\\\$&');\n\n  const BUDGETS = [\n    { id: 1, label: 'Tot \u20AC20', min: 0, max: 2000, mid: 1500 },\n    { id: 2, label: '\u20AC20 tot \u20AC30', min: 2000, max: 3000, mid: 2500 },\n    { id: 3, label: '\u20AC30 tot \u20AC40', min: 3000, max: 4000, mid: 3500 },\n    { id: 4, label: '\u20AC40 tot \u20AC50', min: 4000, max: 5000, mid: 4500 },\n    { id: 5, label: '\u20AC50 tot \u20AC75', min: 5000, max: 7500, mid: 6250 },\n    { id: 6, label: 'Boven \u20AC75', min: 7500, max: Infinity, mid: 9000 }\n  ];\n  const budget = (id) => BUDGETS.find((b) => b.id === id) || null;\n\n  const CLUBS = [\n    { id: 'lekkerbekken', naam: 'Lekkerbekken', uitleg: 'zoet en chocolade', f: (p) => heeft(p.smaak, 'Zoet en chocolade') || heeft(p.soort, 'Chocolade en snoep') },\n    { id: 'borrelaars', naam: 'Borrelaars', uitleg: 'borrel, bier en wijn', f: (p) => heeftEen(p.smaak, ['Borrel en snacks', 'Bier', 'Wijn en bubbels']) || heeft(p.extra, 'Serveren en borrelen') || heeft(p.soort, 'Borrel- en snijplanken') },\n    { id: 'thuiskoks', naam: 'Thuiskoks', uitleg: 'koken en tafelen', f: (p) => heeft(p.smaak, 'Koken en tafelen') || heeft(p.extra, 'Voor de keuken') },\n    { id: 'koffieleuten', naam: 'Koffieleuten', uitleg: 'koffie en thee', f: (p) => heeft(p.smaak, 'Koffie en thee') },\n    { id: 'ontbijtfans', naam: 'Ontbijtfans', uitleg: 'een goed ontbijt', f: (p) => heeft(p.smaak, 'Ontbijt') },\n    { id: 'verwenners', naam: 'Verwenners', uitleg: 'verzorging en wellness', f: (p) => heeft(p.smaak, 'Verzorging') || heeft(p.soort, 'Verzorging en wellness') },\n    { id: 'spelletjesmensen', naam: 'Spelletjesmensen', uitleg: 'met een spel erbij', f: (p) => heeft(p.extra, 'Spel') },\n    { id: 'groenevingers', naam: 'Groene vingers', uitleg: 'zelf kweken', f: (p) => heeft(p.extra, 'Zelf kweken') || (heeft(p.soort, 'Zelf maken en kweken') && /kweek|grow|bloei|zaad|plant/i.test(p.titel + ' ' + p.handle)) || heeft(p.kenmerk, 'Gekweekt op koffiedik') },\n    { id: 'sfeermakers', naam: 'Sfeermakers', uitleg: 'kaarsen en sfeer', f: (p) => heeft(p.extra, 'Sfeer in huis') || heeft(p.soort, 'Kaarsen') || heeft(p.soort, 'Sfeer in huis') }\n  ];\n  const CLUB = Object.fromEntries(CLUBS.map((c) => [c.id, c]));\n\n  const GELEGENHEDEN = ['Kerst', 'Sinterklaas', 'Bedankje', 'Welkomstcadeau', 'Jubileum', 'Dag van de Medewerker', 'Secretaressedag', 'Dag van de Zorg', 'Dag van de Leraar', 'Dag van de Vrijwilliger', 'Dag van de Schoonmaak', 'Pasen', 'Verjaardag', 'Beterschap', 'Geboorte', 'Huwelijk', 'Geslaagd', 'Housewarming'];\n  const VOOR = { medewerkers: \"Collega's\", relaties: 'Klanten en relaties', allebei: 'Allebei' };\n  const VERHAAL = ['Gemaakt in onze werkplaats', 'Lokaal gemaakt', 'Hout uit Friesland', 'Geredde weckpot', 'Van gebruikte wijnflessen', 'Gekweekt op koffiedik', 'Handgemaakt', 'Biologisch', 'Vegan'];\n\n  const maand = new Date().getMonth();\n  const standaardGelegenheid = maand >= 9 ? 'Kerst' : null;\n\n  let producten = [];\n  let dataKlaar = false;\n  let dataBelofte = null;\n  let wachtend = null;\n  let wachtHaak = false;\n  let laatsteStapwissel = 0;\n  const geschiedenis = [];\n  let st = nieuweStaat();\n\n  function nieuweStaat() {\n    return {\n      stap: 'start', voor: null, n: 25, budget: null, gelegenheid: standaardGelegenheid, clubs: [], alcoholvrij: false,\n      zin: '', begrepen: null, gekozen: 0, toonMeer: false, gedeeld: null, doel: null,\n      doos: [], nDoos: 25, nDoosAuto: true, zoek: '', soortFilter: '', prijsFilter: '', sortering: '', pickerAantal: 24,\n      route: null, offerteProduct: null, gedeeldeDoos: null, via: '', vooraf: null, berekening: null,\n      gekozenId: null, doosWeg: 0, laatsteWijziging: null, sfeer: null\n    };\n  }\n\n  /* ---------- data ---------- */\n\n  function maakProduct(r) {\n    const varianten = (r.v || []).map((v) => ({ id: v[0], prijs: v[1], beschikbaar: !!v[2], voorraad: v[3], titel: v[4] || '', verzending: !!v[5] }));\n    const beschikbaar = varianten.filter((v) => v.beschikbaar && v.prijs > 0);\n    if (!beschikbaar.length || !r.im) return null;\n    const eerste = beschikbaar[0];\n    return {\n      id: r.i, handle: r.h, titel: r.t, type: r.y || '', foto: r.im, url: '/products/' + r.h,\n      varianten: beschikbaar, variant: eerste, prijs: eerste.prijs,\n      smaak: r.s || [], soort: r.so || [], extra: r.x || [], kenmerk: r.ke || [], kenmerken: r.kk || [], gelegenheid: r.g || [],\n      // Alcohol volgt dezelfde regel als de productpagina (cu-pdp-flags: metaveld of tag). De filterwaarde \"Met alcohol\"\n      // telt wel mee voor \"Alcoholvrij graag\", maar sluit niet zelf de online bestelling af.\n      alcoholFilter: r.a || '', alcohol: !!r.al,\n      partner: r.e === 1, eigen: r.e !== 1,\n      btw: typeof r.b === 'number' ? r.b : null, verhouding: typeof r.r === 'number' && r.r > 0 && r.r <= 1 ? r.r : null,\n      min: Math.max(1, Number(r.m) || 1),\n      kerst: !!r.k, pakket: pakketTypes.has(r.y || ''),\n      // Pakket-extra (label pakket-extra): alleen als extraatje in een eigen pakket, nooit als los voorstel.\n      extraatje: r.px === 1,\n      // Alleen in een pakket (label alleen-pakket, Land van Ons): mag ook met alcohol in een eigen pakket (besluit Jeroen 2026-10-17).\n      alleenPakket: r.lp === 1,\n      // Klassiek kerstpakket (label, keuze Jeroen 2026-10-17): alleen voorstellen als er te weinig andere pakketten passen.\n      klassiek: r.kl === 1,\n      // Sfeerfoto (metaveld cycleup.sfeerfoto, 2026-10-19): foto, uitsnedekader, maten in cm, stand en soort.\n      sf: r.sf && typeof r.sf === 'object' && r.sf.f && Array.isArray(r.sf.k) ? r.sf : null\n    };\n  }\n\n  // Het assortiment blijft 10 minuten in deze browsersessie bewaard (per thema): herladen of terugkomen gaat dan meteen.\n  const DATA_DUUR = 10 * 60 * 1000;\n\n  async function laadData() {\n    const sleutel = `cu-ps-data:${(window.Shopify && window.Shopify.theme && window.Shopify.theme.id) || ''}`;\n    const bewaard = lees(sleutel);\n    if (bewaard && Array.isArray(bewaard.items) && Date.now() - bewaard.t < DATA_DUUR) {\n      const uitOpslag = bewaard.items.map(maakProduct).filter(Boolean);\n      if (uitOpslag.length) return uitOpslag;\n    }\n    const url = new URL(cfg.dataUrl || location.pathname, location.origin);\n    url.searchParams.set('section_id', 'cu-samenstellen-data');\n    const preview = new URLSearchParams(location.search).get('preview_theme_id');\n    if (preview) url.searchParams.set('preview_theme_id', preview);\n    const pagina = async (n) => {\n      const u = new URL(url);\n      u.searchParams.set('page', String(n));\n      const r = await fetch(u.toString(), { credentials: 'same-origin' });\n      if (!r.ok) throw new Error('data ' + r.status);\n      const doc = new DOMParser().parseFromString(await r.text(), 'text/html');\n      const el = doc.querySelector('[data-cu-ps-data]');\n      if (!el) throw new Error('geen data');\n      return { items: JSON.parse(el.textContent), paginas: Number(el.dataset.paginas || 1) };\n    };\n    // Pagina 1 en 2 tegelijk (het assortiment beslaat er nu twee van 250); pas daarna weten we of er meer zijn.\n    const [eerste, tweede] = await Promise.all([pagina(1), pagina(2).catch(() => null)]);\n    let items = eerste.items;\n    if (eerste.paginas >= 2) items = items.concat((tweede || await pagina(2)).items);\n    const rest = [];\n    for (let n = 3; n <= Math.min(eerste.paginas, 8); n += 1) rest.push(pagina(n));\n    for (const r of await Promise.all(rest)) items = items.concat(r.items);\n    schrijf(sleutel, { t: Date.now(), items });\n    return items.map(maakProduct).filter(Boolean);\n  }\n\n  /* ---------- regels ---------- */\n\n  const minimum = (p) => (p.pakket ? Math.max(KERSTMIN, p.min) : p.min);\n  const kanLeveren = (v, n) => v.voorraad === -1 || v.voorraad >= n;\n  const pastGelegenheid = (p, g) => (g === 'Kerst' ? p.kerst || heeft(p.gelegenheid, 'Kerst') : heeft(p.gelegenheid, g));\n  const excl = (prijs, p) => (p && p.verhouding ? Math.round(prijs * p.verhouding)\n    : Math.round(prijs / (1 + (p && typeof p.btw === 'number' ? p.btw : 21) / 100)));\n  // Knop Particulier | Zakelijk in de kop (2026-10-07): \u00E9\u00E9n bedrag, excl. btw (standaard) of incl. btw.\n  const zakelijk = () => document.documentElement.getAttribute('data-cu-btw') !== 'incl';\n  const btwLabel = () => (zakelijk() ? 'excl. btw' : 'incl. btw');\n  const toon = (prijs, p) => (zakelijk() ? excl(prijs, p) : prijs);\n\n  function basis() {\n    return producten.filter((p) => p.type !== 'Toevoeging' && !p.extraatje);\n  }\n\n  function filter(s, tot) {\n    let lijst = basis();\n    if (tot >= 2) lijst = lijst.filter((p) => s.n >= minimum(p) && kanLeveren(p.variant, s.n));\n    if (tot >= 3 && s.budget) {\n      const b = budget(s.budget);\n      lijst = lijst.filter((p) => p.prijs >= b.min && p.prijs < b.max);\n    }\n    if (tot >= 4 && s.gelegenheid) lijst = lijst.filter((p) => pastGelegenheid(p, s.gelegenheid));\n    if (tot >= 5) {\n      if (s.clubs.length) lijst = lijst.filter((p) => s.clubs.some((c) => CLUB[c].f(p)));\n      if (s.alcoholvrij) lijst = lijst.filter((p) => !p.alcohol && p.alcoholFilter !== 'Met alcohol');\n    }\n    return lijst;\n  }\n\n  function rangschik(lijst, s) {\n    const b = budget(s.budget);\n    const doel = s.doel || (b ? b.mid : null);\n    const score = (p) => s.clubs.reduce((t, c) => t + (CLUB[c].f(p) ? 1 : 0), 0);\n    return lijst.slice().sort((a, c) => (Number(c.pakket) - Number(a.pakket))\n      || (score(c) - score(a))\n      || (doel ? Math.abs(a.prijs - doel) - Math.abs(c.prijs - doel) : a.prijs - c.prijs)\n      || a.titel.localeCompare(c.titel, 'nl'));\n  }\n\n  function eigenVoorop(lijst) {\n    const eigen = lijst.some((p) => p.pakket) ? lijst.find((p) => p.eigen && p.pakket) : lijst.find((p) => p.eigen);\n    return eigen ? [eigen].concat(lijst.filter((p) => p !== eigen)) : lijst;\n  }\n\n  function voorstel(s) {\n    const gezien = new Set();\n    const uit = [];\n    const voegToe = (lijst, label) => {\n      for (const p of lijst) {\n        if (gezien.has(p.id)) continue;\n        gezien.add(p.id);\n        uit.push({ p, label });\n      }\n    };\n    if (s.gedeeld) {\n      const gedeeld = producten.find((p) => p.handle === s.gedeeld);\n      if (gedeeld) voegToe([gedeeld], 'Gedeeld voorstel');\n    }\n    const geenKl = (l) => l.filter((p) => !p.klassiek);\n    voegToe(eigenVoorop(rangschik(geenKl(filter(s, 5)), s)), '');\n    // Te weinig andere pakketten binnen precies deze keuzes: eerst de klassieke die wel precies passen, met een label,\n    // en pas daarna verruimen (budget, smaak, gelegenheid). Zo klopt de teller met wat je ziet.\n    if (uit.length < 3) voegToe(rangschik(filter(s, 5), s).filter((p) => p.klassiek), 'Klassiek kerstpakket');\n    if (uit.length < 3 && s.budget) {\n      for (const d of [1, -1]) {\n        const nb = s.budget + d;\n        if (!budget(nb)) continue;\n        voegToe(rangschik(geenKl(filter({ ...s, budget: nb }, 5)), s), d > 0 ? 'Net boven je budget' : 'Net onder je budget');\n        if (uit.length >= 3) break;\n      }\n    }\n    if (uit.length < 3 && (s.clubs.length || s.alcoholvrij === false)) {\n      voegToe(rangschik(geenKl(filter({ ...s, clubs: [] }, 5)), s), 'Andere smaak');\n    }\n    if (uit.length < 3 && s.gelegenheid) {\n      voegToe(rangschik(geenKl(filter({ ...s, clubs: [], gelegenheid: null }, 5)), s), 'Ook leuk');\n    }\n    return uit;\n  }\n\n  function redenen(p, s) {\n    const r = [];\n    const clubs = s.clubs.filter((c) => CLUB[c].f(p)).map((c) => CLUB[c].naam.toLowerCase());\n    if (clubs.length) r.push('Past bij ' + clubs.join(' en '));\n    // Binnen het budget is het uitgangspunt van de top 3; een afwijking krijgt een eigen label (Net boven je budget).\n    const k = p.kenmerk.find((x) => VERHAAL.includes(x));\n    if (k) r.push(k);\n    if (p.alcoholFilter === 'Zonder alcohol') r.push('Zonder alcohol');\n    return r.slice(0, 2);\n  }\n\n  function bezorging(p, n) {\n    const sub = p.prijs * n;\n    // Kerstverzending alleen voor kerstpakketten (type) en partnerpakketten. Eigen cadeaus met de kersttag, zoals de\n    // borrelpakketten en weckpot-sets (02-11), zitten in het algemene profiel en gaan op gewicht.\n    if (p.pakket || p.partner) {\n      if (sub >= cfg.gratisVanaf) return { bedrag: 0, tekst: 'Gratis' };\n      return { bedrag: cfg.kerstBezorg, tekst: geld(cfg.kerstBezorg), nog: cfg.gratisVanaf - sub };\n    }\n    return { bedrag: null, tekst: 'Volgens gewicht, zie de kassa' };\n  }\n\n  /* ---------- zelf samenstellen ---------- */\n\n  function samenstelbaar() {\n    const lijst = [];\n    for (const p of producten) {\n      if (p.pakket || p.type === 'Toevoeging') continue;\n      // Alcohol is (nog) niet online te bestellen: dan ook niet in een eigen pakket (verkoop op afstand, zoals op de productpagina).\n      if (p.alcohol && cfg.alcoholDicht && !p.alleenPakket) continue;\n      for (const v of p.varianten) {\n        if (!v.verzending) continue;\n        lijst.push({ sleutel: p.id + ':' + v.id, p, v, prijs: v.prijs, naam: v.titel ? p.titel + ' (' + v.titel + ')' : p.titel });\n      }\n    }\n    return lijst;\n  }\n\n  function doosTotalen() {\n    const stuks = st.doos.reduce((t, i) => t + i.aantal, 0);\n    const prodIncl = st.doos.reduce((t, i) => t + i.prijs * i.aantal, 0);\n    const prodExcl = st.doos.reduce((t, i) => t + excl(i.prijs, i.p) * i.aantal, 0);\n    const perExcl = prodExcl + HANDLING;\n    const perIncl = prodIncl + Math.round(HANDLING * 1.21);\n    // Minimum in pakketten voor dit pakket (2026-10-17, wens Jeroen: eerst de prijs per pakket, dan pas het aantal).\n    // Zolang de klant het aantal niet zelf veranderde, staat het aantal op dat minimum en loopt het mee met de doos.\n    const minStuks = Math.min(5000, Math.max(1, Math.ceil(DREMPEL / perExcl)));\n    if (st.nDoosAuto !== false && st.doos.length) st.nDoos = minStuks;\n    const n = Math.max(1, st.nDoos || 1);\n    const totaalExcl = perExcl * n;\n    return {\n      n, minStuks, stuks, prodIncl, prodExcl, perExcl, perIncl, totaalExcl, totaalIncl: perIncl * n,\n      haalt: st.doos.length > 0 && totaalExcl >= DREMPEL, nog: Math.max(0, DREMPEL - totaalExcl),\n      tekort: st.doos.filter((i) => !kanLeveren(i.v, n * i.aantal))\n    };\n  }\n\n  function verras() {\n    const alles = samenstelbaar();\n    // Geen vouchers, en in het kerstseizoen geen producten die bij een andere feestdag horen (zoals Sinterklaas).\n    const seizoen = st.gelegenheid || standaardGelegenheid;\n    const anderFeest = (p) => !!seizoen && !heeft(p.gelegenheid, seizoen)\n      && ['Kerst', 'Sinterklaas', 'Pasen'].some((g) => g !== seizoen && (heeft(p.gelegenheid, g) || p.type === g));\n    // Producten zonder soort \u00E9n zonder producttype (zoals een los zakje) zijn geen verrassing.\n    const zonderVouchers = alles.filter((i) => i.p.type !== 'Keuzekado' && !anderFeest(i.p) && (i.p.soort.length || i.p.type));\n    const pool = zonderVouchers.length >= 3 ? zonderVouchers : alles;\n    if (!pool.length) return [];\n    const b = budget(st.budget);\n    const min = b ? Math.max(0, b.min - Math.round(HANDLING * 1.21)) : 1500;\n    const max = b ? Math.min(b.max, 15000) : 6000;\n    for (let poging = 0; poging < 400; poging += 1) {\n      const kopie = pool.slice();\n      const keuze = [];\n      const soorten = new Set();\n      while (keuze.length < 3 && kopie.length) {\n        const item = kopie.splice(Math.floor(Math.random() * kopie.length), 1)[0];\n        const s = item.p.soort[0] || item.p.type;\n        if (soorten.has(s) && poging < 300) continue;\n        if (keuze.some((k) => k.p.id === item.p.id)) continue;\n        soorten.add(s);\n        keuze.push(item);\n      }\n      const som = keuze.reduce((t, i) => t + i.prijs, 0);\n      if (keuze.length === 3 && som >= min && som <= max) return keuze.map((i) => ({ ...i, aantal: 1 }));\n    }\n    return pool.sort(() => Math.random() - 0.5).slice(0, 3).map((i) => ({ ...i, aantal: 1 }));\n  }\n\n  /* ---------- \u00E9\u00E9n zin ---------- */\n\n  function leesZin(zin) {\n    // Spreektaal en notatie gelijktrekken; \"een euro of 30\" is ongeveer 30 euro.\n    const t = ` ${String(zin).toLowerCase().replace(/[\u2019']/g, \"'\").replace(/\u00A0/g, ' ')} `\n      .replace(/(?:een\\s+)?euro\\s+of\\s+(\\d{1,3})/g, '\u20AC$1');\n    const uit = {};\n    const BEDRAG = String.raw`(\\d{1,3}(?:\\.\\d{3})+|\\d+)(?:,(\\d{1,2}|-))?`;\n    const PER = String.raw`(?:p\\.?\\s?p\\.?|pp\\b|per\\s+(?:stuk|persoon|pakket|medewerker|collega|man|mens))`;\n    const MENSEN = String.raw`(?:stuks|stuk\\b|pakket|collega|medewerker|mensen|man\\b|personen|klanten|relaties|werknemers|vrijwilligers|leden|gasten)`;\n    const getal = (heel, dec) => Number(String(heel).replace(/\\./g, '')) + (dec && dec !== '-' ? Number(dec.padEnd(2, '0')) / 100 : 0);\n    const isGeld = (s) => /\u20AC|euro|\\beur\\b|,-|p\\.?\\s?p\\.?|\\bpp\\b|per\\s+(?:stuk|persoon|pakket)/.test(s);\n    let rest = t;\n\n    // 1. Bereiken: \"tussen (de) 25 en 35 euro\", \"van \u20AC25 tot \u20AC35\", \"20-30 euro\", \"15 \u00E0 20 euro\". Alleen met een geldteken.\n    let bereik = null;\n    const reBereik = new RegExp(String.raw`(?:tussen\\s+(?:de\\s+)?|van\\s+)?(\u20AC\\s*)?${BEDRAG}\\s*(?:euro|eur)?\\s*(?:en|tot|-|\u2013|\u00E0)\\s*(?:de\\s+)?(\u20AC\\s*)?${BEDRAG}\\s*(euro\\b|eur\\b|,-|${PER})?`, 'g');\n    let mr;\n    while ((mr = reBereik.exec(t))) {\n      // Zonder geldteken alleen \"tussen X en Y\" waar geen aantal mensen of pakketten op volgt.\n      if (!isGeld(mr[0]) && !(/^\\s*tussen/.test(mr[0]) && !new RegExp(String.raw`^\\s*${MENSEN}`).test(t.slice(mr.index + mr[0].length)))) continue;\n      const a = getal(mr[2], mr[3]);\n      const b = getal(mr[5], mr[6]);\n      if (a > 0 && b > a && b < 1000) {\n        bereik = (a + b) / 2;\n        rest = rest.replace(mr[0], ' ');\n        break;\n      }\n    }\n\n    // 2. Losse bedragen, met wat ervoor en erna staat.\n    const bedragen = [];\n    const reBedrag = new RegExp(String.raw`\u20AC\\s*${BEDRAG}|${BEDRAG}\\s*(?:euro\\b|eur\\b|,-)|${BEDRAG}(?=\\s*${PER})|(?:budget|max(?:imaal)?|hooguit|ongeveer|rond(?:\\s+de)?|circa)\\s+(?:van\\s+)?${BEDRAG}(?!\\s*(?:\\d|${MENSEN}))`, 'g');\n    let mg;\n    const gevonden = [];\n    while ((mg = reBedrag.exec(rest))) {\n      const paren = [[mg[1], mg[2]], [mg[3], mg[4]], [mg[5], mg[6]], [mg[7], mg[8]]].find(([h]) => h !== undefined);\n      const voor = rest.slice(Math.max(0, mg.index - 28), mg.index) + (mg[7] !== undefined ? mg[0].replace(/[\\d.,]+.*$/, '') : '');\n      const na = rest.slice(mg.index + mg[0].length, mg.index + mg[0].length + 28);\n      const bedrag = getal(paren[0], paren[1]);\n      if (!(bedrag > 0)) continue;\n      gevonden.push(mg[0]);\n      bedragen.push({\n        bedrag,\n        perStuk: new RegExp(String.raw`^\\s*(?:(?:euro|eur)\\s*)?(?:${PER}|elk|ieder)`).test(na) || /(?:(?:^|\\s)\u00E0|\\ba|\\bper stuk|\\bper persoon)\\s*$/.test(voor),\n        totaal: /(?:totaal|in totaal|totaalbudget|bij elkaar)/.test(`${voor} ${na.slice(0, 14)}`),\n        grens: /(?:max(?:imaal)?\\.?|tot|hooguit|onder(?:\\s+de)?|minder dan|niet meer dan|beneden(?:\\s+de)?|<)\\s*$/.test(voor) || /^\\s*(?:max(?:imaal)?|maximum|hooguit)\\b/.test(na) ? 'max'\n          : /(?:vanaf|minimaal|minstens|boven(?:\\s+de)?|meer dan|>)\\s*$/.test(voor) ? 'min' : 'rond'\n      });\n    }\n    gevonden.forEach((stuk) => { rest = rest.replace(stuk, ' '); });\n\n    // 3. Aantal: een getal bij pakketten of mensen, \"team van 18\", \"we zijn met 35\", anders het eerste losse getal.\n    //    Jaartallen (2020-2039) tellen niet mee; \"1.200\" mag.\n    const AANTAL = String.raw`(\\d{1,3}(?:\\.\\d{3})+|\\d{1,4})`;\n    const ZELFST = String.raw`(?:x\\b|stuks\\b|stuk\\b|(?:kerst)?pakketten|(?:kerst)?pakket\\b|pakketjes|cadeaus|cadeautjes|geschenken|relatiegeschenken|collega'?s|medewerkers|mensen|man\\b|personen|werknemers|relaties|klanten|vrijwilligers|leden|deelnemers|gasten)`;\n    let ma = rest.match(new RegExp(String.raw`${AANTAL}\\s*(?:\\w+\\s+)?${ZELFST}`));\n    if (!ma) ma = rest.match(new RegExp(String.raw`(?:team van|met z'n|met zijn|we zijn met|voor)\\s+${AANTAL}\\b`));\n    if (!ma) {\n      const los = [...rest.matchAll(new RegExp(String.raw`\\b${AANTAL}\\b(?![-\\s]*(?:jarig|jaar|%))`, 'g'))].map((m) => m[1]).find((x) => !/^20[2-3]\\d$/.test(x));\n      if (los) ma = [los, los];\n    }\n    if (ma) {\n      const n = Number(String(ma[1]).replace(/\\./g, ''));\n      if (n >= 1 && n <= 5000) uit.n = n;\n    }\n\n    // 4. Budget per pakket: bereik, een bedrag per stuk, of een totaal gedeeld door het aantal.\n    //    Een rond bedrag precies op een bandgrens (20, 30, 40, 50, 75) valt in de lagere band; de sortering zoekt\n    //    daarna het dichtst bij het genoemde bedrag.\n    let pp = null;\n    let grens = 'rond';\n    if (bereik !== null) pp = bereik;\n    else if (bedragen.length) {\n      const b = bedragen.find((x) => x.perStuk) || bedragen[0];\n      if (!b.perStuk && (b.totaal || b.bedrag >= 200)) {\n        if (uit.n) { pp = b.bedrag / uit.n; grens = 'max'; } else uit.totaal = b.bedrag;\n      } else {\n        pp = b.bedrag;\n        grens = b.grens;\n      }\n    }\n    if (pp !== null && pp > 0) {\n      const c = Math.round(pp * 100);\n      const opGrens = BUDGETS.some((x) => x.min === c && x.min > 0);\n      const zoek = grens === 'max' || (grens === 'rond' && opGrens) ? c - 1 : c;\n      const band = BUDGETS.find((x) => zoek >= x.min && zoek < x.max);\n      if (band) { uit.budget = band.id; uit.doel = c; }\n    }\n\n    // 5. Voor wie, gelegenheid, clubs en alcohol. Woordgrenzen voorkomen dat \"trouwe klanten\" een huwelijk wordt.\n    const medew = /collega|kollega|medewerker|personeel|\\bteams?\\b|werknemer|vrijwilliger|\\bstaf\\b|afdeling|\\bploeg\\b/.test(t);\n    const relat = /\\bklant|\\brelaties\\b|\\brelatie\\b|leverancier|opdrachtgever|\\bpartners?\\b/.test(t);\n    if (medew && relat) uit.voor = 'allebei';\n    else if (medew) uit.voor = 'medewerkers';\n    else if (relat) uit.voor = 'relaties';\n    const gel = [\n      ['Kerst', /kerst|eindejaar|feestdagen/], ['Sinterklaas', /sinterklaas|\\bsint\\b|pakjesavond/], ['Pasen', /\\bpasen\\b|\\bpaas/],\n      ['Jubileum', /jubileum|jubilaris|\\d+\\s*[- ]?jarig\\s+(?:bestaan|jubileum)|\\d+\\s+jaar\\s+(?:in dienst|bestaan)|\\bbestaan\\b/],\n      ['Bedankje', /bedank|dank je|dankjewel/], ['Welkomstcadeau', /welkom|nieuwe collega|onboarding/],\n      ['Dag van de Zorg', /dag van de zorg|zorgmedewerker/], ['Secretaressedag', /secretaresse/], ['Dag van de Leraar', /\\bleraar|\\bleraren|\\bdocent/],\n      ['Dag van de Vrijwilliger', /vrijwilligersdag|dag van de vrijwilliger/], ['Verjaardag', /verjaardag|\\bjarig\\b/], ['Beterschap', /beterschap|\\bziek\\b|\\bzieke\\b/],\n      ['Geboorte', /geboorte|\\bbaby/], ['Huwelijk', /huwelijk|bruiloft|\\btrouwen\\b|trouwdag|getrouwd/], ['Geslaagd', /geslaagd|diploma/], ['Housewarming', /housewarming|verhuis/]\n    ].find(([, re]) => re.test(t));\n    if (gel) uit.gelegenheid = gel[0];\n    // Een woord telt niet als er \"geen\", \"zonder\" of \"niet\" vlak voor staat (\"geen wijn\").\n    const noemt = (re) => {\n      const r = new RegExp(re.source, 'g');\n      let m;\n      while ((m = r.exec(t))) {\n        if (!/(?:geen|zonder|niet|nooit)\\s+(?:\\w+\\s+)?$/.test(t.slice(Math.max(0, m.index - 16), m.index))) return true;\n      }\n      return false;\n    };\n    const clubs = [];\n    if (noemt(/borrel|biertje|\\bbier\\b|\\bwijn|bubbels|drankje|proost/)) clubs.push('borrelaars');\n    if (noemt(/\\bzoet|chocola|snoep|lekkers|bonbon/)) clubs.push('lekkerbekken');\n    if (noemt(/koken|\\bkok\\b|keuken|foodie|tafelen|smullen/)) clubs.push('thuiskoks');\n    if (noemt(/koffie|\\bthee/)) clubs.push('koffieleuten');\n    if (noemt(/ontbijt/)) clubs.push('ontbijtfans');\n    if (noemt(/verwen|wellness|\\bspa\\b|verzorgingsproduct|ontspan|self ?care/)) clubs.push('verwenners');\n    if (noemt(/\\bspel|\\bgame/)) clubs.push('spelletjesmensen');\n    if (noemt(/kweek|\\bplant(?:en|je|jes)?\\b|groene vingers|\\btuin/)) clubs.push('groenevingers');\n    if (noemt(/kaars|\\bsfeer/)) clubs.push('sfeermakers');\n    if (clubs.length) uit.clubs = clubs;\n    if (/zonder alcohol|alcoholvrij|geen alcohol|drinkt niet|drinken niet|geen wijn|geen drank|zonder wijn/.test(t)) uit.alcoholvrij = true;\n    return uit;\n  }\n\n  /* ---------- weergave ---------- */\n\n  const STAPPEN = ['vraag1', 'vraag2', 'vraag3', 'vraag4', 'vraag5'];\n\n  function teller(tot) {\n    return filter(st, tot).length;\n  }\n\n  const opties = (n) => `${n} ${n === 1 ? 'optie' : 'opties'}`;\n  const pakketten = (n) => `${n} ${n === 1 ? 'pakket' : 'pakketten'}`;\n\n  // Zelf samenstellen pas aanbieden als het minimum van \u20AC1.000 excl. btw in zicht is (spelregel: daaronder niet\n  // aanmoedigen). Bij \"Boven \u20AC75\" telt de prijs van het gekozen pakket, met \u20AC75 als ondergrens.\n  function zelfZinvol(prijsPerStuk) {\n    const b = budget(st.budget);\n    const per = b && Number.isFinite(b.max) ? b.max : Math.max(prijsPerStuk || 0, b ? b.min : 0);\n    return Math.round((st.n * per) / 1.21) >= DREMPEL;\n  }\n\n  function knopHTML(tekst, attrs, primair) {\n    return `<button type=\"button\" class=\"button ${primair ? 'button--primary' : 'button--secondary'}\" ${attrs}><span class=\"btn-fill\" data-fill></span><span class=\"btn-text\">${tekst}</span></button>`;\n  }\n\n  function kop(stapNr, titel, uitleg) {\n    const tot = stapNr;\n    // Telt alleen de vragen die echt gesteld worden (vooraf ingevulde vallen weg, tenzij je er zelf naar teruggaat).\n    const reeks = STAPPEN.filter((s) => s === `vraag${stapNr}` || !overslaan(s));\n    const nr = reeks.indexOf(`vraag${stapNr}`) + 1;\n    return `<div class=\"cu-ps__voortgang\"><span>Vraag ${nr} van ${reeks.length}</span><span class=\"cu-ps__teller\" aria-live=\"polite\">${opties(teller(tot))}</span></div>\n      <div class=\"cu-ps__balk\" aria-hidden=\"true\"><i style=\"width:${Math.round((nr / reeks.length) * 100)}%\"></i></div>\n      <h2 class=\"cu-ps__vraag\" tabindex=\"-1\">${titel}</h2>${uitleg ? `<p class=\"cu-ps__klein\">${uitleg}</p>` : ''}`;\n  }\n\n  function navigatie(verderTekst, verderActie, magVerder) {\n    return `<div class=\"cu-ps__nav\">\n      <button type=\"button\" class=\"cu-ps__terug\" data-actie=\"terug\">Terug</button>\n      ${verderActie ? knopHTML(verderTekst, `data-actie=\"${verderActie}\"${magVerder === false ? ' disabled' : ''}`, true) : ''}\n    </div>`;\n  }\n\n  // Bovenaan elke stap na de vragen: terug naar waar je vandaan kwam, met de naam van die stap.\n  function terugBoven() {\n    return `<button type=\"button\" class=\"cu-ps__terug-boven\" data-actie=\"terug\"><span aria-hidden=\"true\">\u2190</span> ${esc(terugTekst())}</button>`;\n  }\n\n  function terugOnder() {\n    return `<div class=\"cu-ps__nav\"><button type=\"button\" class=\"cu-ps__terug\" data-actie=\"terug\">${esc(terugTekst())}</button></div>`;\n  }\n\n  function chips(naam, opties, gekozen, meer) {\n    return `<div class=\"cu-ps__chips\" data-cu-ps-rij=\"${naam}\">${opties.map((o) => {\n      const aan = Array.isArray(gekozen) ? gekozen.includes(o.w) : gekozen === o.w;\n      return `<button type=\"button\" class=\"cu-ps__chip\" data-kies=\"${naam}\" data-waarde=\"${esc(o.w)}\" aria-pressed=\"${aan}\"${o.uit ? ' disabled' : ''}>${esc(o.l)}${o.sub ? `<span>${esc(o.sub)}</span>` : ''}</button>`;\n    }).join('')}${meer || ''}</div>`;\n  }\n\n  function renderStart() {\n    // Drie gelijke kaarten onder de vraag (2026-10-07): titel, tekst en knop staan per rij op dezelfde hoogte\n    // (subgrid in cu-samenstellen.css). De vraag blijft de eerste .cu-ps__vraag in de app: daar gaat de focus heen.\n    // Design system (2026-10-17): per route een IconBlock en een korte typering, minder tekst.\n    // 2026-10-18 (Jeroen): \"In \u00E9\u00E9n zin\" eruit; derde kaart is rondkijken in het assortiment.\n    const vooraf = (st.vooraf && st.vooraf.budget ? 1 : 0) + (st.vooraf && st.vooraf.gelegenheid ? 1 : 0);\n    const aantal = ['', 'E\u00E9n korte vraag', 'Twee korte vragen', 'Drie korte vragen', 'Vier korte vragen', 'Vijf korte vragen'][5 - vooraf];\n    return `<div class=\"cu-ps__start\">\n      <h2 class=\"cu-ps__vraag cu-ps__start-kop\" tabindex=\"-1\">Hoe wil je beginnen?</h2>\n      <div class=\"cu-ps__kaart cu-ps__kaart--hoofd\">\n        <div class=\"cu-ps__kaart-kop\">${icoon('vragen')}<h3 class=\"cu-ps__kaart-titel\">${aantal}</h3></div>\n        <div class=\"cu-ps__kaart-tekst\">\n          <p class=\"cu-ps__klein\">In een minuut je top 3. Daarna kun je alles nog aanpassen.</p>\n          ${st.vooraf ? `<p class=\"cu-ps__vooraf\">Al ingevuld: ${esc([st.vooraf.gelegenheid, st.vooraf.budget ? budget(st.vooraf.budget).label : ''].filter(Boolean).join(' \u00B7 '))}</p>` : ''}\n        </div>\n        ${knopHTML('Begin met de vragen', 'data-actie=\"begin\"', true)}\n      </div>\n      <div class=\"cu-ps__kaart\">\n        <div class=\"cu-ps__kaart-kop\">${icoon('zelf')}<h3 class=\"cu-ps__kaart-titel\">Helemaal zelf samenstellen</h3></div>\n        <div class=\"cu-ps__kaart-tekst\">\n          <p class=\"cu-ps__klein\">Jij kiest wat erin gaat, wij pakken het in onze werkplaats in. Producten plus \u20AC5 per pakket voor doos en inpakken.</p>\n          <p class=\"cu-ps__kaart-meta\">Vanaf \u20AC1.000 excl. btw</p>\n        </div>\n        ${knopHTML('Zelf samenstellen', 'data-actie=\"samenstellen\"', false)}\n      </div>\n      <div class=\"cu-ps__kaart\">\n        <div class=\"cu-ps__kaart-kop\">${icoon('bladeren')}<h3 class=\"cu-ps__kaart-titel\">Rondkijken in het assortiment</h3></div>\n        <div class=\"cu-ps__kaart-tekst\">\n          <p class=\"cu-ps__klein\">Blader door alle kant-en-klare kerstpakketten en kies er zelf een, van klein bedankje tot groot pakket.</p>\n        </div>\n        <a class=\"button button--secondary\" href=\"${esc(cfg.kerstUrl)}\" data-actie-link=\"bladeren\"><span class=\"btn-fill\" data-fill></span><span class=\"btn-text\">Bekijk de kerstpakketten</span></a>\n      </div>\n    </div>`;\n  }\n\n  function renderBegrepen() {\n    const b = st.begrepen || {};\n    const regels = [];\n    const iets = ['voor', 'n', 'budget', 'totaal', 'gelegenheid', 'clubs', 'alcoholvrij'].some((k) => b[k]);\n    if (b.voor) regels.push(VOOR[b.voor]);\n    regels.push(b.n ? pakketten(b.n) : `${pakketten(st.n)} (standaard)`);\n    if (b.budget) regels.push(budget(b.budget).label);\n    else if (b.totaal) regels.push(`Totaal ${geld(Math.round(b.totaal * 100))}`);\n    if (b.gelegenheid) regels.push(b.gelegenheid);\n    else if (st.gelegenheid) regels.push(`${st.gelegenheid} (het seizoen)`);\n    (b.clubs || []).forEach((c) => regels.push(CLUB[c].naam));\n    if (b.alcoholvrij) regels.push('Alcoholvrij');\n    return `<div class=\"cu-ps__stap\">${terugBoven()}\n      <p class=\"cu-ps__citaat\">${esc(st.zin)}</p>\n      <h2 class=\"cu-ps__vraag\" tabindex=\"-1\">${iets ? 'Dit hebben we begrepen' : 'Dat konden we niet goed lezen'}</h2>\n      ${iets ? `<div class=\"cu-ps__chips\">${regels.map((r) => `<span class=\"cu-ps__chip cu-ps__chip--aan\">${esc(r)}</span>`).join('')}</div>\n      <p class=\"cu-ps__klein\">${b.totaal && !b.n ? 'Noem ook het aantal pakketten, dan rekenen we het budget per pakket uit. ' : ''}Klopt iets niet? Pas het aan in de vragen.</p>` : '<p class=\"cu-ps__klein\">Beantwoord de vragen, dan zoeken we het voor je uit.</p>'}\n      <div class=\"cu-ps__nav\">\n        <button type=\"button\" class=\"cu-ps__terug\" data-actie=\"naar-vraag1\">Vragen aanpassen</button>\n        ${knopHTML(iets ? 'Laat mijn top 3 zien' : 'Naar de vragen', iets ? 'data-actie=\"voorstel\"' : 'data-actie=\"naar-vraag1\"', true)}\n      </div>\n    </div>`;\n  }\n\n  function renderVraag1() {\n    return `<div class=\"cu-ps__stap\">${kop(1, 'Voor wie is het?', '')}\n      <div class=\"cu-ps__tegels\">${Object.entries(VOOR).map(([w, l]) => `<button type=\"button\" class=\"cu-ps__tegel\" data-kies=\"voor\" data-waarde=\"${w}\" aria-pressed=\"${st.voor === w}\">${esc(l)}</button>`).join('')}</div>\n      ${navigatie('Verder', 'verder', !!st.voor)}</div>`;\n  }\n\n  function renderVraag2() {\n    const pakketMin = st.n < KERSTMIN ? `<p class=\"cu-ps__let\">Kerstpakketten bestel je per pakket vanaf ${KERSTMIN} stuks. Met minder zie je alleen losse cadeaus.</p>` : '';\n    return `<div class=\"cu-ps__stap\">${kop(2, 'Hoeveel pakketten?', 'Van elk kerstpakket minimaal ' + KERSTMIN + ' stuks.')}\n      <div class=\"cu-ps__aantal\">\n        <div class=\"cu-ps__stepper\"><button type=\"button\" data-actie=\"min\" aria-label=\"E\u00E9n minder\">\u2212</button><input id=\"cu-ps-aantal\" type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"5000\" value=\"${st.n}\" aria-label=\"Aantal pakketten\"><button type=\"button\" data-actie=\"plus\" aria-label=\"E\u00E9n meer\">+</button></div>\n        ${chips('n', [10, 25, 50, 100].map((x) => ({ w: String(x), l: String(x) })), String(st.n))}\n      </div><div data-cu-ps-minwaarsch>${pakketMin}</div>\n      ${navigatie('Verder', 'verder', st.n >= 1)}</div>`;\n  }\n\n  function renderVraag3() {\n    const s2 = { ...st };\n    const keuzes = BUDGETS.map((b) => ({ w: String(b.id), l: b.label, sub: opties(filter({ ...s2, budget: b.id }, 3).length), uit: filter({ ...s2, budget: b.id }, 3).length === 0 }));\n    return `<div class=\"cu-ps__stap\">${kop(3, 'Budget per pakket', 'Bedragen incl. btw, zoals in de shop.')}\n      ${chips('budget', keuzes, String(st.budget))}\n      ${navigatie('Verder', 'verder', !!st.budget)}</div>`;\n  }\n\n  function renderVraag4() {\n    const opties = GELEGENHEDEN.map((g) => ({ w: g, l: g, n: filter({ ...st, gelegenheid: g }, 4).length }))\n      .filter((o) => o.n >= 3 || o.w === st.gelegenheid)\n      .map((o) => ({ w: o.w, l: o.l, sub: `${o.n}` }));\n    const meer = `<button type=\"button\" class=\"cu-ps__chip\" data-kies=\"gelegenheid\" data-waarde=\"\" aria-pressed=\"${!st.gelegenheid}\">Maakt niet uit</button>`;\n    return `<div class=\"cu-ps__stap\">${kop(4, 'Waarvoor geef je het?', maand >= 9 ? 'Van oktober tot en met december staat Kerst al aan.' : '')}\n      ${chips('gelegenheid', opties, st.gelegenheid || '', meer)}\n      ${navigatie('Verder', 'verder', true)}</div>`;\n  }\n\n  function renderVraag5() {\n    const basisLijst = filter(st, 4);\n    const clubs = CLUBS.map((c) => ({ c, n: basisLijst.filter(c.f).length })).filter((x) => x.n >= 3 || st.clubs.includes(x.c.id));\n    return `<div class=\"cu-ps__stap\">${kop(5, 'Wat voor club is het?', 'Kies er een of meer, of ga meteen door.')}\n      <div class=\"cu-ps__clubs\">${clubs.length ? clubs.map(({ c, n }) => `<button type=\"button\" class=\"cu-ps__club\" data-kies=\"club\" data-waarde=\"${c.id}\" aria-pressed=\"${st.clubs.includes(c.id)}\"><b>${esc(c.naam)}</b><span>${esc(c.uitleg)} \u00B7 ${n}</span></button>`).join('') : '<p class=\"cu-ps__klein\">In deze keuze is er geen club met genoeg opties. Ga gerust door.</p>'}</div>\n      <label class=\"cu-ps__schakel\"><input type=\"checkbox\" data-kies=\"alcoholvrij\"${st.alcoholvrij ? ' checked' : ''}> Alcoholvrij graag</label>\n      ${navigatie('Laat mijn top 3 zien', 'voorstel', true)}</div>`;\n  }\n\n  // Naast de vragen (desktop): hoe de top 3 er nu uitziet. Wordt bij elk antwoord opnieuw getekend, zodat je ziet dat\n  // de vragen ergens toe leiden en de lege rechterhelft een functie heeft (design, 2026-10-17).\n  function voorproefHTML() {\n    const lijst = voorstel(st).slice(0, 3);\n    if (!lijst.length) return '';\n    return `<aside class=\"cu-ps__voorproef\" aria-label=\"Zo ziet je top 3 er nu uit\">\n      <p class=\"cu-ps__voorproef-kop\">Zo ziet je top 3 er nu uit</p>\n      <ul class=\"cu-ps__voorproef-lijst\" role=\"list\">${lijst.map(({ p }) => `<li>\n        <img src=\"${esc(p.foto)}\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">\n        <span class=\"cu-ps__voorproef-tekst\"><span class=\"cu-ps__voorproef-naam\">${esc(naamVan(p))}</span><span class=\"cu-ps__klein\">${geld(toon(p.prijs, p))} per stuk</span></span>\n      </li>`).join('')}</ul>\n      <p class=\"cu-ps__klein\">Met elk antwoord wordt het preciezer.</p>\n    </aside>`;\n  }\n\n  const metVoorproef = (html) => `<div class=\"cu-ps__vraagvak\">${html}${voorproefHTML()}</div>`;\n\n  function metaregel() {\n    const delen = [];\n    if (st.voor) delen.push(VOOR[st.voor]);\n    delen.push(`${st.n} ${st.n === 1 ? 'stuk' : 'stuks'}`);\n    if (st.budget) delen.push(budget(st.budget).label);\n    if (st.gelegenheid) delen.push(st.gelegenheid);\n    if (st.clubs.length) delen.push(st.clubs.map((c) => CLUB[c].naam).join(', '));\n    if (st.alcoholvrij) delen.push('alcoholvrij');\n    return delen.join(' \u00B7 ');\n  }\n\n  // Productnaam met de variant erbij als er meer dan \u00E9\u00E9n is, zodat duidelijk is wat er besteld wordt.\n  const naamVan = (p) => (p.varianten.length > 1 && p.variant.titel ? `${p.titel} (${p.variant.titel})` : p.titel);\n\n  function kaartHTML(item, i) {\n    const p = item.p;\n    const aan = i === st.gekozen;\n    const r = redenen(p, st);\n    return `<li class=\"cu-ps__optie-vak\"><button type=\"button\" class=\"cu-ps__optie\" data-kies=\"optie\" data-waarde=\"${i}\" aria-pressed=\"${aan}\">\n      <img src=\"${esc(p.foto)}\" alt=\"\" loading=\"lazy\" width=\"96\" height=\"96\">\n      <span class=\"cu-ps__optie-tekst\">\n        ${p.eigen ? '<span class=\"cu-ps__badge\">Ingepakt in onze werkplaats</span>' : ''}${item.label ? `<span class=\"cu-ps__badge cu-ps__badge--zacht\">${esc(item.label)}</span>` : ''}\n        <span class=\"cu-ps__optie-naam\">${esc(naamVan(p))}</span>\n        ${r.length ? `<span class=\"cu-ps__redenen\">${r.map((x) => esc(x)).join(' \u00B7 ')}</span>` : ''}\n      </span>\n      <span class=\"cu-ps__optie-prijs\"><span>${geld(toon(p.prijs, p))} per stuk</span><b>${geld(toon(p.prijs, p) * st.n)}</b></span>\n    </button><button type=\"button\" class=\"cu-ps__zoom cu-ps__zoom--optie\" data-actie=\"zoom\" data-waarde=\"p:${p.id}\" aria-label=\"${esc(`Bekijk wat er in ${p.titel} zit`)}\">${LOEP}</button></li>`;\n  }\n\n  function renderVoorstel() {\n    const lijst = voorstel(st);\n    if (!lijst.length) {\n      return `<div class=\"cu-ps__stap\">${terugBoven()}<h2 class=\"cu-ps__vraag\" tabindex=\"-1\">Hiervoor vinden we niets</h2>\n        <p>Met deze keuzes is er geen pakket. Probeer een ander budget, of laat de club weg.</p>\n        <div class=\"cu-ps__nav\"><button type=\"button\" class=\"cu-ps__terug\" data-actie=\"naar-vraag3\">Budget aanpassen</button>${zelfZinvol(0) ? knopHTML('Zelf samenstellen', 'data-actie=\"samenstellen\"', false) : `<a class=\"button button--secondary\" href=\"${esc(cfg.kerstUrl)}\"><span class=\"btn-fill\" data-fill></span><span class=\"btn-text\">Bekijk alle kerstpakketten</span></a>`}</div>\n        <p class=\"cu-ps__klein\">Of bel ons: <a href=\"tel:${esc(cfg.telHref)}\">${esc(cfg.tel)}</a> (${esc(cfg.telKeuze)}).</p></div>`;\n    }\n    // De keuze hoort bij een product, niet bij een plek in de lijst: verandert de lijst (ander aantal, terug of verder in\n    // de browser), dan blijft hetzelfde pakket gekozen zolang het er nog bij staat.\n    if (st.gekozenId) {\n      const plek = lijst.findIndex((x) => x.p.id === st.gekozenId);\n      if (plek >= 0) st.gekozen = plek;\n    }\n    if (st.gekozen >= lijst.length) st.gekozen = 0;\n    st.gekozenId = lijst[st.gekozen].p.id;\n    const zichtbaar = lijst.slice(0, Math.max(st.toonMeer ? 6 : 3, st.gekozen + 1));\n    const gekozen = lijst[st.gekozen].p;\n    const gedeeldOk = !!(st.gedeeld && lijst[0] && lijst[0].label === 'Gedeeld voorstel');\n    const n = st.n;\n    const minN = minimum(gekozen);\n    const bez = bezorging(gekozen, n);\n    const sub = gekozen.prijs * n;\n    const totaal = bez.bedrag === null ? sub : sub + bez.bedrag;\n    const totaalExcl = excl(gekozen.prijs, gekozen) * n + (bez.bedrag ? Math.round(bez.bedrag / 1.21) : 0);\n    // E\u00E9n bedrag volgens de knop in de kop; de bezorging (incl. btw ingesteld) rekent mee met 21%.\n    const zak = zakelijk();\n    const subT = toon(gekozen.prijs, gekozen) * n;\n    const bezTekst = bez.bedrag ? geld(zak ? Math.round(bez.bedrag / 1.21) : bez.bedrag) : bez.tekst;\n    const totaalT = zak ? totaalExcl : totaal;\n    const nogT = bez.nog ? (zak ? excl(bez.nog, gekozen) : bez.nog) : 0;\n    const knopTekst = gekozen.pakket ? 'Bestel dit pakket' : 'Bestel dit cadeau';\n    const extra = bez.nog && gekozen.prijs ? Math.ceil(bez.nog / gekozen.prijs) : 0;\n    const eenheid = (x) => (gekozen.pakket ? (x === 1 ? 'pakket' : 'pakketten') : (x === 1 ? 'stuk' : 'stuks'));\n    const dicht = gekozen.alcohol && cfg.alcoholDicht;\n    const kort = n < minN;\n    // E\u00E9n boodschap over de bezorgdrempel: is er een haalbare tip (\"Maak er 35 van\"), dan geen los bedrag erboven.\n    const tip = !!(extra && extra <= 12 && !kort && kanLeveren(gekozen.variant, n + extra));\n    const voorraadKrap = !kanLeveren(gekozen.variant, n);\n    let bestel;\n    if (dicht) {\n      bestel = `<a class=\"button button--primary\" href=\"tel:${esc(cfg.telHref)}\"><span class=\"btn-fill\" data-fill></span><span class=\"btn-text\">Bel om te bestellen</span></a>`;\n    } else if (gekozen.alcohol) {\n      // Alcohol online: via de productpagina, waar de 18+-bevestiging staat.\n      bestel = `<a class=\"button button--primary\" href=\"${esc(gekozen.url)}\"><span class=\"btn-fill\" data-fill></span><span class=\"btn-text\">Bekijk en bestel</span></a>`;\n    } else if (kort || voorraadKrap) {\n      bestel = knopHTML(knopTekst, 'data-actie=\"bestel\" disabled', true);\n    } else {\n      bestel = knopHTML(knopTekst, 'data-actie=\"bestel\"', true);\n    }\n    return `<div class=\"cu-ps__stap cu-ps__voorstel\">${terugBoven()}\n      <div class=\"cu-ps__voorstel-kop\">\n        <h2 class=\"cu-ps__vraag\" tabindex=\"-1\">${gedeeldOk ? 'Een voorstel voor jullie' : 'Jouw top 3'}</h2>\n        <p class=\"cu-ps__klein\">${esc(metaregel())} \u00B7 <button type=\"button\" class=\"cu-ps__link\" data-actie=\"naar-vraag1\">Aanpassen</button></p>\n        ${st.gedeeld && !gedeeldOk ? '<p class=\"cu-ps__let\">Het gedeelde pakket is niet meer leverbaar. Dit past er het best bij.</p>'\n          : lijst.every((x) => x.label && x.label !== 'Gedeeld voorstel' && x.label !== 'Klassiek kerstpakket') ? `<p class=\"cu-ps__let\">Precies binnen je keuzes is er${st.n >= 50 ? ' voor dit aantal' : ''} niets leverbaar. Dit komt het dichtst in de buurt. Vraag gerust een offerte aan, dan kijken we wat kan.</p>` : ''}\n      </div>\n      <div class=\"cu-ps__voorstel-grid\">\n      <div class=\"cu-ps__voorstel-lijst\">\n        <ul class=\"cu-ps__opties\" role=\"list\">${zichtbaar.map(kaartHTML).join('')}</ul>\n        ${lijst.length > 3 && !st.toonMeer ? `<button type=\"button\" class=\"cu-ps__link\" data-actie=\"meer\">Toon meer opties</button>` : ''}\n      </div>\n      <div class=\"cu-ps__som\">\n        <p class=\"cu-ps__som-titel\">${esc(naamVan(gekozen))}</p>\n        <button type=\"button\" class=\"cu-ps__link cu-ps__inhoud\" data-actie=\"zoom\" data-waarde=\"p:${gekozen.id}\">${gekozen.pakket ? 'Bekijk wat erin zit' : 'Bekijk dit cadeau'}</button>\n        <dl>\n          <dt>${n} \u00D7 ${geld(toon(gekozen.prijs, gekozen))}</dt><dd>${geld(subT)}</dd>\n          <dt>Bezorging</dt><dd>${esc(bezTekst)}</dd>\n          <dt class=\"cu-ps__tot\">Totaal ${btwLabel()}${bez.bedrag === null ? ', excl. bezorging' : ''}</dt><dd class=\"cu-ps__tot\">${geld(totaalT)}</dd>\n        </dl>\n        ${bez.nog ? `<p class=\"cu-ps__klein\">${tip ? '' : `Nog ${geld(nogT)} ${btwLabel()} tot gratis bezorging. `}Kerstpakketten bezorgen we in Nederland.</p>` : ''}\n        ${tip ? `<p class=\"cu-ps__tip\">Met ${extra} ${eenheid(extra)} meer is de bezorging gratis. <button type=\"button\" class=\"cu-ps__link\" data-actie=\"aantal\" data-waarde=\"${n + extra}\">Maak er ${n + extra} van</button></p>` : ''}\n        ${gekozen.partner && gekozen.kerst && cfg.leverVan && cfg.leverTot ? `<p class=\"cu-ps__klein\">Levering tussen ${esc(datumTekst(cfg.leverVan))} en ${esc(datumTekst(cfg.leverTot))}.</p>` : ''}\n        ${gekozen.eigen ? '<p class=\"cu-ps__klein\">Eigen voorraad versturen we gemiddeld binnen 5 werkdagen.</p>' : ''}\n        ${kort ? `<p class=\"cu-ps__let\">Van dit pakket bestel je minimaal ${minN} stuks.</p>` : ''}\n        ${voorraadKrap ? '<p class=\"cu-ps__let\">Zoveel hebben we hiervan nu niet op voorraad. Vraag een offerte aan, dan kijken we wat kan.</p>' : ''}\n        ${dicht ? `<p class=\"cu-ps__klein\">Dit pakket bevat alcohol. Bestellen gaat telefonisch: ${esc(cfg.tel)} (${esc(cfg.telKeuze)}).</p>` : ''}\n        <div class=\"cu-ps__knoppen\">\n          ${bestel}\n          ${dicht ? '' : knopHTML('Offerte aanvragen', 'data-actie=\"offerte\"', false)}\n          <button type=\"button\" class=\"cu-ps__link\" data-actie=\"deel\">Stuur naar een collega</button>\n        </div>\n        <p class=\"cu-ps__klein cu-ps__factuur\">Als bedrijf betaal je achteraf op factuur.</p>\n        <p class=\"cu-ps__klein cu-ps__gedeeld\" data-cu-ps-gedeeld hidden></p>\n        ${n >= 50 ? '<p class=\"cu-ps__klein\">Bij grote aantallen denken we graag mee. Een offerte is vrijblijvend.</p>' : ''}\n      </div>\n      ${zelfZinvol(gekozen.prijs) ? `<div class=\"cu-ps__ontgrendel\">\n        <p><b>Liever helemaal zelf samenstellen?</b> Dat kan vanaf \u20AC1.000 excl. btw. Wij pakken het in onze werkplaats in.</p>\n        ${knopHTML('Zelf samenstellen', 'data-actie=\"samenstellen\"', false)}\n      </div>` : ''}\n      </div>\n      ${terugOnder()}\n    </div>`;\n  }\n\n  function datumTekst(iso) {\n    if (!iso) return '';\n    const d = new Date(iso + 'T12:00:00');\n    return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString('nl-NL', { day: 'numeric', month: 'long' });\n  }\n\n  const EXTRA = 'Extraatjes';\n  // \"Aanbevolen\" is een mix (2026-10-16): om en om per soort, binnen een soort om en om per producttype en per product,\n  // zodat er nooit tien weckpotten of tien varianten van \u00E9\u00E9n product op een rij staan. Deze soorten openen de lijst.\n  const MIXVOLGORDE = ['Kaarsen', 'Drinkflessen en glazen', 'Chocolade en snoep', 'Borrel- en snijplanken', 'Verzorging en wellness', 'Eten en drinken', 'Keuken en tafel', 'Sfeer in huis', 'Zelf maken en kweken', 'Weckpotten'];\n  function spreid(lijst, sleutels) {\n    if (!sleutels.length || lijst.length < 2) return lijst;\n    const [sleutel, ...rest] = sleutels;\n    const groepen = new Map();\n    for (const i of lijst) {\n      const k = sleutel(i);\n      if (!groepen.has(k)) groepen.set(k, []);\n      groepen.get(k).push(i);\n    }\n    const rijen = [...groepen.values()].map((g) => spreid(g, rest));\n    const uit = [];\n    for (let n = 0; uit.length < lijst.length; n += 1) rijen.forEach((g) => { if (g[n]) uit.push(g[n]); });\n    return uit;\n  }\n  let mixBron = null;\n  let mix = [];\n  function gemengd(pool) {\n    if (mixBron !== pool.length + ':' + producten.length) {\n      const plek = (s) => { const i = MIXVOLGORDE.indexOf(s); return i === -1 ? MIXVOLGORDE.length : i; };\n      const geordend = pool.slice().sort((a, b) => plek(a.p.soort[0]) - plek(b.p.soort[0]));\n      mix = spreid(geordend, [(i) => i.p.soort[0] || '', (i) => i.p.type || '', (i) => i.p.id]);\n      mixBron = pool.length + ':' + producten.length;\n    }\n    const volgorde = new Map(mix.map((i, n) => [i.sleutel, n]));\n    return (lijst) => lijst.slice().sort((a, b) => (volgorde.get(a.sleutel) ?? 1e6) - (volgorde.get(b.sleutel) ?? 1e6));\n  }\n  function pickerLijst(pool) {\n    const zoek = st.zoek.trim().toLowerCase();\n    const band = PRIJSBANDEN.find((b) => b.id === st.prijsFilter) || null;\n    const pastSoort = (i) => !st.soortFilter || (st.soortFilter === EXTRA ? i.p.extraatje : i.p.soort[0] === st.soortFilter);\n    const pastZoek = (i) => !zoek || i.naam.toLowerCase().includes(zoek);\n    const pastPrijs = (i) => !band || (i.prijs >= band.min && i.prijs < band.max);\n    const zonderPrijs = pool.filter((i) => pastZoek(i) && pastSoort(i));\n    let lijst = band ? zonderPrijs.filter(pastPrijs) : zonderPrijs;\n    if (st.sortering === 'laag') lijst = lijst.slice().sort((a, b) => a.prijs - b.prijs);\n    else if (st.sortering === 'hoog') lijst = lijst.slice().sort((a, b) => b.prijs - a.prijs);\n    else lijst = gemengd(pool)(lijst);\n    const perBand = Object.fromEntries(PRIJSBANDEN.map((b) => [b.id, zonderPrijs.filter((i) => i.prijs >= b.min && i.prijs < b.max).length]));\n    // Aantallen per soort binnen de zoekterm en het prijsfilter (voor de filterlijst)\n    const zonderSoort = pool.filter((i) => pastZoek(i) && pastPrijs(i));\n    const perSoort = { '': zonderSoort.length, [EXTRA]: zonderSoort.filter((i) => i.p.extraatje).length };\n    for (const i of zonderSoort) { const s = i.p.soort[0]; if (s) perSoort[s] = (perSoort[s] || 0) + 1; }\n    return { lijst, perBand, perSoort };\n  }\n\n\n  // E\u00E9n bedrag per regel volgens de knop in de kop. Het minimum van \u20AC1.000 blijft altijd excl. btw (spelregel).\n  function doosSomRijen(t) {\n    const zak = zakelijk();\n    const l = btwLabel();\n    return `<dt>Producten per pakket${t.stuks ? ` (${t.stuks})` : ''}, ${l}</dt><dd>${geld(zak ? t.prodExcl : t.prodIncl)}</dd>\n      <dt>Doos en inpakken per pakket, ${l}</dt><dd>${geld(zak ? HANDLING : Math.round(HANDLING * 1.21))}</dd>\n      <dt>Per pakket, ${l}</dt><dd>${geld(zak ? t.perExcl : t.perIncl)}</dd>\n      <dt>Bezorging op \u00E9\u00E9n adres</dt><dd>Gratis</dd>\n      <dt>Totaal ${l}</dt><dd>${geld(zak ? t.totaalExcl : t.totaalIncl)}</dd>`;\n  }\n\n  // Korte stand voor de melding na toevoegen: op mobiel staat het totaal dan buiten beeld.\n  function doosStand() {\n    const t = doosTotalen();\n    return `${geld(zakelijk() ? t.perExcl : t.perIncl)} per pakket ${btwLabel()}`;\n  }\n\n  function somIncl(t) {\n    return t.haalt ? `Totaal ${btwLabel()}. Zelf samenstellen kan vanaf \u20AC1.000 excl. btw in totaal.` : `Totaal ${btwLabel()}.`;\n  }\n\n  // Bovenste blok: de prijs van \u00E9\u00E9n pakket, opgebouwd uit de producten en de doos met inpakken.\n  function perPakketHTML(t) {\n    const zak = zakelijk();\n    const l = btwLabel();\n    return `<dl class=\"cu-ps__pp-rijen\">\n        <dt>Producten${t.stuks ? ` (${t.stuks})` : ''}</dt><dd>${geld(zak ? t.prodExcl : t.prodIncl)}</dd>\n        <dt>Doos en inpakken</dt><dd>${geld(zak ? HANDLING : Math.round(HANDLING * 1.21))}</dd>\n      </dl>\n      <p class=\"cu-ps__pp-totaal\"><span>Per pakket</span><strong>${geld(zak ? t.perExcl : t.perIncl)}</strong></p>\n      <p class=\"cu-ps__klein\">${l.charAt(0).toUpperCase() + l.slice(1)}. Bezorging op \u00E9\u00E9n adres is gratis.</p>\n      ${waaromHTML()}`;\n  }\n\n  // Onder het minimum: het minimum als aantal pakketten, met een knop om het in \u00E9\u00E9n keer in te stellen.\n  function tipHTML(t) {\n    return `<span>Bij dit pakket bestel je vanaf ${t.minStuks} stuks (\u20AC1.000 excl. btw).</span>\n      <button type=\"button\" class=\"cu-ps__tip-knop\" data-actie=\"zet-min\">Maak er ${t.minStuks} van</button>\n      <span class=\"cu-ps__klein\">Minder nodig? <a href=\"${esc(cfg.contactUrl)}\">Neem contact op</a>.</span>`;\n  }\n\n  // Het vaste bedrag per pakket kort uitgelegd (2026-10-16, wens Jeroen): wat je ervoor krijgt en wie het doet.\n  const handlingBedrag = () => `${geld(zakelijk() ? HANDLING : Math.round(HANDLING * 1.21))} ${btwLabel()}`;\n  function waaromHTML() {\n    return `<details class=\"cu-ps__waarom\">\n      <summary>Waarom <span data-cu-ps-handling>${handlingBedrag()}</span> per pakket?</summary>\n      <p class=\"cu-ps__klein\">Daarvoor krijgt elk pakket een stevige doos met opvulling en een handgeschreven kaartje. Onze collega's van Social Workforce, de sociale werkplaats in onze HUB in Leeuwarden, pakken alles in. Bezorging op \u00E9\u00E9n adres is gratis.</p>\n    </details>`;\n  }\n\n  function somRegel(t) {\n    const zak = zakelijk();\n    return `<span>${t.n} \u00D7 ${geld(zak ? t.perExcl : t.perIncl)}</span><b>${geld(zak ? t.totaalExcl : t.totaalIncl)}</b>`;\n  }\n\n  // De berekening staat dicht tot de bezoeker hem openklapt; het totaal en de prijs per pakket staan er altijd boven.\n  const berekeningOpen = () => st.berekening === true;\n\n  // Werkt de totalen bij zonder de knoppen te vervangen, zodat typen en meteen klikken samengaan.\n  function werkDoosSomBij() {\n    const t = doosTotalen();\n    const zet = (sel, f) => { const el = app.querySelector(sel); if (el) f(el); };\n    zet('[data-cu-ps-somrijen]', (el) => { el.innerHTML = doosSomRijen(t); });\n    zet('[data-cu-ps-somregel]', (el) => { el.innerHTML = somRegel(t); });\n    zet('[data-cu-ps-somincl]', (el) => { el.textContent = somIncl(t); });\n    zet('[data-cu-ps-handling]', (el) => { el.textContent = handlingBedrag(); });\n    zet('.cu-ps__doos-som', (el) => { el.classList.toggle('is-gehaald', t.haalt); });\n    zet('[data-cu-ps-tip]', (el) => { el.hidden = t.haalt || !st.doos.length; if (!el.hidden) el.innerHTML = tipHTML(t); });\n    zet('#cu-ps-ndoos', (el) => { if (document.activeElement !== el) el.value = t.n; });\n    zet('[data-cu-ps-tekort]', (el) => { el.hidden = !t.tekort.length; });\n    zet('[data-actie=\"naar-gegevens-doos\"]', (el) => { el.disabled = !t.haalt; });\n    zet('[data-cu-ps-mail]', (el) => { el.setAttribute('href', mailDoosHref()); });\n  }\n\n  function werkVraag2Bij() {\n    const tel = app.querySelector('.cu-ps__teller');\n    if (tel) tel.textContent = opties(teller(2));\n    app.querySelectorAll('[data-kies=\"n\"]').forEach((b) => b.setAttribute('aria-pressed', String(b.dataset.waarde === String(st.n))));\n    const plek = app.querySelector('[data-cu-ps-minwaarsch]');\n    if (plek) plek.innerHTML = st.n < KERSTMIN ? `<p class=\"cu-ps__let\">Kerstpakketten bestel je per pakket vanaf ${KERSTMIN} stuks. Met minder zie je alleen losse cadeaus.</p>` : '';\n  }\n\n  function productenHTML() {\n    const t = doosTotalen();\n    const { lijst: gefilterd } = pickerLijst(samenstelbaar());\n    const zichtbaar = gefilterd.slice(0, st.pickerAantal);\n    const inDoos = new Map(st.doos.map((i) => [i.sleutel, i.aantal]));\n    return `<ul class=\"cu-ps__producten\" role=\"list\">${zichtbaar.map((i) => {\n      const n = inDoos.get(i.sleutel) || 0;\n      const krap = i.v.voorraad !== -1 && i.v.voorraad < t.n * Math.max(1, n);\n      return `<li class=\"cu-ps__product-vak\">\n        <button type=\"button\" class=\"cu-ps__product${n ? ' is-gekozen' : ''}\" data-actie=\"erbij\" data-waarde=\"${esc(i.sleutel)}\">\n          <img src=\"${esc(i.p.foto)}\" alt=\"\" loading=\"lazy\" width=\"120\" height=\"120\">\n          <span class=\"cu-ps__product-naam\">${esc(i.naam)}</span>\n          ${i.p.extraatje ? (i.p.kenmerken.length ? `<span class=\"cu-ps__product-kenmerk\">${esc(i.p.kenmerken[0])}</span>` : (i.p.smaak.length ? '<span class=\"cu-ps__product-kenmerk cu-ps__product-kenmerk--lekker\">Gewoon lekker</span>' : '')) : ''}\n          ${krap ? '<span class=\"cu-ps__product-krap\">Beperkt op voorraad, rest in overleg</span>' : ''}\n          <span class=\"cu-ps__product-voet\">\n            <span class=\"cu-ps__product-prijs\">${geld(toon(i.prijs, i.p))}</span>\n            <span class=\"cu-ps__product-actie\">${n ? `${n} in de doos <span class=\"cu-ps__verborgen\">, voeg er nog \u00E9\u00E9n toe</span>` : '<span aria-hidden=\"true\">+</span> Voeg toe'}</span>\n          </span>\n        </button>\n        <button type=\"button\" class=\"cu-ps__zoom\" data-actie=\"zoom\" data-waarde=\"${esc(i.sleutel)}\" aria-label=\"${esc(`Bekijk ${i.naam} groter`)}\">${LOEP}</button>\n      </li>`;\n    }).join('')}</ul>\n    ${gefilterd.length > zichtbaar.length ? `<button type=\"button\" class=\"cu-ps__link\" data-actie=\"meer-producten\">Toon meer producten (${gefilterd.length - zichtbaar.length})</button>` : ''}\n    ${!gefilterd.length ? '<p class=\"cu-ps__klein\">Niets gevonden. Probeer een ander woord of een andere prijs.</p>' : ''}`;\n  }\n\n  function renderSamenstellen() {\n    const t = doosTotalen();\n    const pool = samenstelbaar();\n    const soorten = [...new Set(pool.map((i) => i.p.soort[0]).filter(Boolean))].sort((a, b) => a.localeCompare(b, 'nl'));\n    // Extraatjes als eerste filter na Alles, alleen als er pakket-extra's in het assortiment staan.\n    if (pool.some((i) => i.p.extraatje)) soorten.unshift(EXTRA);\n    const { lijst: gefilterd, perBand, perSoort } = pickerLijst(pool);\n    const leeg = !st.doos.length;\n    const weg = st.gedeeldeDoos ? st.gedeeldeDoos.weg : 0;\n    const gedeeld = st.gedeeldeDoos\n      ? `<p class=\"cu-ps__let\">Dit pakket is met je gedeeld. Pas het gerust aan, of ga verder.${weg ? ` ${weg === 1 ? 'E\u00E9n product is' : `${weg} producten zijn`} niet meer leverbaar en weggelaten.` : ''}</p>`\n      : '';\n    const doosLijst = leeg\n      ? '<p class=\"cu-ps__leeg\">Nog leeg. Kies je producten, of laat ons je verrassen.</p>'\n      : `<ul role=\"list\" class=\"cu-ps__doos-lijst\" data-cu-ps-scroll=\"doos\">${st.doos.map((i) => `<li class=\"cu-ps__doos-item${i.sleutel === st.laatsteWijziging ? ' is-nieuw' : ''}\" data-sleutel=\"${esc(i.sleutel)}\">\n          <button type=\"button\" class=\"cu-ps__doos-bekijk\" data-actie=\"zoom\" data-waarde=\"${esc(i.sleutel)}\" tabindex=\"-1\" aria-hidden=\"true\"><img src=\"${esc(i.p.foto)}\" alt=\"\" width=\"44\" height=\"44\" loading=\"lazy\"></button>\n          <button type=\"button\" class=\"cu-ps__doos-open\" data-actie=\"zoom\" data-waarde=\"${esc(i.sleutel)}\" aria-label=\"${esc(`Bekijk ${i.naam}`)}\"><span class=\"cu-ps__doos-naam\">${esc(i.naam)}</span></button>\n          <span class=\"cu-ps__doos-prijs\">${i.aantal > 1 ? `${i.aantal} \u00D7 ${geld(toon(i.prijs, i.p))}` : geld(toon(i.prijs, i.p))}${i.p.min > t.n * i.aantal ? ` \u00B7 minimaal ${i.p.min} stuks in totaal` : ''}</span>\n          <span class=\"cu-ps__mini\">\n            <button type=\"button\" data-actie=\"min1\" data-waarde=\"${esc(i.sleutel)}\" aria-label=\"${esc(i.aantal > 1 ? `E\u00E9n ${i.naam} minder` : `${i.naam} uit de doos halen`)}\">\u2212</button>\n            <span aria-hidden=\"true\">${i.aantal}</span>\n            <button type=\"button\" data-actie=\"plus1\" data-waarde=\"${esc(i.sleutel)}\" aria-label=\"${esc(`Nog een ${i.naam}`)}\">+</button>\n          </span>\n        </li>`).join('')}</ul>`;\n    const overleg = leeg ? '' : `<details class=\"cu-ps__overleg\">\n            <summary>Overleggen met een collega?</summary>\n            <p class=\"cu-ps__klein\">Stuur je pakket door of bewaar het als pdf, bijvoorbeeld voor akkoord.</p>\n            <div class=\"cu-ps__overleg-knoppen\">\n              <button type=\"button\" class=\"cu-ps__link\" data-actie=\"deel-doos\">Kopieer de link</button>\n              <a class=\"cu-ps__link\" href=\"${esc(mailDoosHref())}\" data-cu-ps-mail>Mail naar een collega</a>\n              <button type=\"button\" class=\"cu-ps__link\" data-actie=\"pdf-doos\">Bewaar als pdf</button>\n            </div>\n            <p class=\"cu-ps__klein cu-ps__gedeeld\" data-cu-ps-doos-gedeeld hidden></p>\n          </details>`;\n    const prijsChips = [{ w: '', l: 'Alle prijzen' }].concat(PRIJSBANDEN.map((b) => ({ w: b.id, l: b.label, sub: String(perBand[b.id]), uit: !perBand[b.id] && st.prijsFilter !== b.id })));\n    const soortChips = [{ w: '', l: 'Alles', sub: String(perSoort[''] || 0) }].concat(soorten.map((s) => ({ w: s, l: s, sub: String(perSoort[s] || 0), uit: !perSoort[s] && st.soortFilter !== s })));\n    // Indeling (2026-10-16): vanaf 1100 px drie kolommen (filters links, producten, de doos rechts). Filters en doos\n    // schuiven mee. De doos heeft een vaste onderkant met het totaal en de knop; alleen de lijst erin scrolt.\n    return `<div class=\"cu-ps__stap cu-ps__samensteller\">${terugBoven()}\n      <div class=\"cu-ps__voorstel-kop\">\n        <h2 class=\"cu-ps__vraag\" tabindex=\"-1\">Jouw eigen pakket</h2>\n        <p class=\"cu-ps__klein\">Kies wat erin gaat; nog eens klikken telt er \u00E9\u00E9n bij. Alle pakketten in je bestelling zijn hetzelfde.</p>\n      </div>\n      ${gedeeld}\n      ${st.doosWeg && !st.gedeeldeDoos ? `<p class=\"cu-ps__let\">${st.doosWeg === 1 ? 'E\u00E9n product uit je doos is' : `${st.doosWeg} producten uit je doos zijn`} niet meer leverbaar en weggelaten.</p>` : ''}\n      <div class=\"cu-ps__bouwer\">\n        <div class=\"cu-ps__filters\" data-cu-ps-scroll=\"filters\">\n          <div class=\"cu-ps__picker-tools\">\n            <label class=\"cu-ps__verborgen\" for=\"cu-ps-zoek\">Zoek op naam</label>\n            <input id=\"cu-ps-zoek\" type=\"search\" placeholder=\"Zoek op naam\" value=\"${esc(st.zoek)}\">\n            <label class=\"cu-ps__sorteer\" for=\"cu-ps-sorteer\"><span class=\"cu-ps__sorteer-tekst\">Sorteer</span>\n              <select id=\"cu-ps-sorteer\">\n                <option value=\"\"${st.sortering ? '' : ' selected'}>Aanbevolen</option>\n                <option value=\"laag\"${st.sortering === 'laag' ? ' selected' : ''}>Prijs laag naar hoog</option>\n                <option value=\"hoog\"${st.sortering === 'hoog' ? ' selected' : ''}>Prijs hoog naar laag</option>\n              </select>\n            </label>\n          </div>\n          <div class=\"cu-ps__filterrij\" role=\"group\" aria-labelledby=\"cu-ps-soort-label\"><p class=\"cu-ps__filterkop\" id=\"cu-ps-soort-label\">Soort</p>${chips('soortfilter', soortChips, st.soortFilter)}</div>\n          <div class=\"cu-ps__prijsrij\" role=\"group\" aria-labelledby=\"cu-ps-prijs-label\"><p class=\"cu-ps__filterkop\" id=\"cu-ps-prijs-label\">Prijs per stuk</p>${chips('prijsfilter', prijsChips, st.prijsFilter)}</div>\n        </div>\n        <div class=\"cu-ps__picker\" id=\"cu-ps-picker\">\n          <div class=\"cu-ps__picker-kop\">\n            <h3 class=\"cu-ps__label\">Kies producten <span class=\"cu-ps__klein\"><span data-cu-ps-telling>${gefilterd.length} ${gefilterd.length === 1 ? 'product' : 'producten'}</span> \u00B7 prijzen ${btwLabel()}</span></h3>\n          </div>\n          <div data-cu-ps-lijst>${productenHTML()}</div>\n        </div>\n        <aside class=\"cu-ps__zijkant\" aria-label=\"Jouw doos\">\n          <div class=\"cu-ps__doos\">\n            <div class=\"cu-ps__doos-kop\"><b>In de doos${t.stuks ? ` <span class=\"cu-ps__teller\">${t.stuks}</span>` : ''}</b>${knopHTML(leeg ? 'Verras me' : '+ Verrassing', 'data-actie=\"verras\"', false)}</div>\n            ${doosLijst}\n            <button type=\"button\" class=\"cu-ps__naar-picker${leeg ? ' cu-ps__naar-picker--leeg' : ''}\" data-actie=\"naar-picker\">\n              <span class=\"cu-ps__smal\">Kies hieronder je producten <span class=\"cu-ps__pijl\" aria-hidden=\"true\">\u2193</span></span>\n              <span class=\"cu-ps__breed\"><span class=\"cu-ps__pijl\" aria-hidden=\"true\">\u2190</span> Kies links je producten</span>\n            </button>\n            <div class=\"cu-ps__perpakket\"${leeg ? ' hidden' : ''}>${perPakketHTML(t)}</div>\n          </div>\n          <div class=\"cu-ps__doos-som${t.haalt ? ' is-gehaald' : ''}\"${leeg ? ' hidden' : ''}>\n            <div class=\"cu-ps__aantalrij\">\n              <label class=\"cu-ps__label\" for=\"cu-ps-ndoos\">Hoeveel pakketten?</label>\n              <div class=\"cu-ps__stepper\"><button type=\"button\" data-actie=\"dmin\" aria-label=\"E\u00E9n pakket minder\">\u2212</button><input id=\"cu-ps-ndoos\" type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"5000\" value=\"${t.n}\"><button type=\"button\" data-actie=\"dplus\" aria-label=\"E\u00E9n pakket meer\">+</button></div>\n            </div>\n            <p class=\"cu-ps__tip\" data-cu-ps-tip${t.haalt || leeg ? ' hidden' : ''}>${t.haalt || leeg ? '' : tipHTML(t)}</p>\n            <p class=\"cu-ps__somregel cu-ps__tot\" data-cu-ps-somregel>${somRegel(t)}</p>\n            <p class=\"cu-ps__klein\" data-cu-ps-somincl>${somIncl(t)}</p>\n            <p class=\"cu-ps__klein\" data-cu-ps-tekort${t.tekort.length ? '' : ' hidden'}>Niet alles ligt in deze aantallen op voorraad. Dat bestellen we bij; het staat in de bevestiging.</p>\n            ${knopHTML('Verder', 'data-actie=\"naar-gegevens-doos\"' + (t.haalt ? '' : ' disabled'), true)}\n            <div class=\"cu-ps__som-links\">\n              <details class=\"cu-ps__berekening\" data-cu-ps-berekening${berekeningOpen() ? ' open' : ''}>\n                <summary>Bekijk de berekening</summary>\n                <dl data-cu-ps-somrijen>${doosSomRijen(t)}</dl>\n                <p class=\"cu-ps__klein\">Levering gemiddeld binnen 10 werkdagen; we stemmen de planning altijd met je af.</p>\n              </details>\n              ${overleg}\n            </div>\n          </div>\n        </aside>\n      </div>\n      ${terugOnder()}\n    </div>`;\n  }\n\n  function samenvattingRegels(intern = false) {\n    const regels = [];\n    if (st.route === 'doos') {\n      const t = doosTotalen();\n      regels.push(`Zelf samengesteld pakket, ${t.n} stuks`);\n      st.doos.forEach((i) => regels.push(`- ${i.aantal > 1 ? `${i.aantal} x ` : ''}${i.naam} (${geld(i.prijs)}${i.aantal > 1 ? ' per stuk' : ''}${intern ? `, ${i.p.partner ? 'partner' : 'eigen'}` : ''}${kanLeveren(i.v, t.n * i.aantal) ? '' : ', bijbestellen'})`));\n      regels.push(`Per pakket: producten ${geld(t.prodIncl)} incl. btw, handling ${geld(HANDLING)} excl. btw`);\n      regels.push(`Totaal: ${geld(t.totaalExcl)} excl. btw (indicatie incl. btw ${geld(t.totaalIncl)})`);\n    } else if (st.offerteProduct) {\n      const p = st.offerteProduct;\n      regels.push(`Kant-en-klaar: ${st.n} \u00D7 ${p.titel} (${geld(p.prijs)} per stuk, ${geld(p.prijs * st.n)} incl. btw)`);\n      if (intern) regels.push(`Product: ${location.origin}${p.url}`);\n    }\n    if (st.route !== 'doos') regels.push(`Keuzes: ${metaregel()}`);\n    else if (st.voor) regels.push(`Voor: ${VOOR[st.voor]}`);\n    return regels;\n  }\n\n  // Na \"Verder\" (zelf samenstellen): elk product met een kleine foto, klik opent het venster (wens Jeroen 2026-10-18).\n  // De tekstregels van samenvattingRegels() blijven voor de mail en het formulier.\n  function recapDoosHTML() {\n    const t = doosTotalen();\n    return `<p class=\"cu-ps__recap-kop\">Zelf samengesteld pakket, ${t.n} stuks <span class=\"cu-ps__klein\">\u00B7 prijzen per stuk ${btwLabel()}</span></p>\n      <ul role=\"list\" class=\"cu-ps__recap-items\">${st.doos.map((i) => `<li>\n        <button type=\"button\" class=\"cu-ps__recap-item\" data-actie=\"zoom\" data-waarde=\"${esc(i.sleutel)}\" aria-label=\"${esc(`Bekijk ${i.naam}`)}\">\n          <img src=\"${esc(i.p.foto)}\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\n          <span class=\"cu-ps__recap-naam\">${esc(i.naam)}</span>\n          <span class=\"cu-ps__recap-prijs\">${i.aantal > 1 ? `${i.aantal} \u00D7 ` : ''}${geld(toon(i.prijs, i.p))}${kanLeveren(i.v, t.n * i.aantal) ? '' : ' \u00B7 bijbestellen'}</span>\n        </button></li>`).join('')}</ul>\n      <p class=\"cu-ps__klein\">Per pakket: producten ${geld(zakelijk() ? t.prodExcl : t.prodIncl)} ${btwLabel()}, handling ${geld(HANDLING)} excl. btw.</p>\n      <p class=\"cu-ps__recap-totaal\"><b>Totaal ${geld(t.totaalExcl)} excl. btw</b> <span class=\"cu-ps__klein\">(indicatie incl. btw ${geld(t.totaalIncl)})</span></p>\n      ${st.voor ? `<p class=\"cu-ps__klein\">Voor: ${esc(VOOR[st.voor])}</p>` : ''}`;\n  }\n\n  function renderGegevens() {\n    const regels = samenvattingRegels();\n    const doos = st.route === 'doos';\n    return `<div class=\"cu-ps__stap cu-ps__gegevens\">${terugBoven()}\n      <h2 class=\"cu-ps__vraag\" tabindex=\"-1\">${doos ? 'Je pakket is samengesteld! <span aria-hidden=\"true\">\uD83C\uDF89</span>' : 'Bijna klaar'}</h2>\n      <p class=\"cu-ps__klein\">${doos ? 'Nog \u00E9\u00E9n stap: laat je gegevens achter, dan nemen we binnen \u00E9\u00E9n werkdag contact met je op.' : 'Laat je gegevens achter, dan bellen we je binnen \u00E9\u00E9n werkdag. Een aanvraag is vrijblijvend.'}</p>\n      ${doos && SFEER_AAN ? `<div class=\"cu-ps__sfeerplek\" data-cu-ps-sfeerplek>${sfeerHTML()}</div>` : ''}\n      <div class=\"cu-ps__recap\"><p class=\"cu-ps__label\">Je aanvraag</p>${doos && st.doos.length ? recapDoosHTML() : `<ul role=\"list\">${regels.map((r) => `<li>${esc(r)}</li>`).join('')}</ul>`}\n        <button type=\"button\" class=\"cu-ps__link\" data-actie=\"${doos ? 'samenstellen' : 'voorstel'}\">Wijzigen</button></div>\n      <div data-cu-ps-formplek></div>\n    </div>`;\n  }\n\n  /* ---------- tekenen ---------- */\n\n  function focusSleutel(el) {\n    if (!el || !app || !app.contains(el) || el === document.body) return null;\n    if (el.id) return `#${el.id}`;\n    const w = el.dataset.waarde !== undefined ? `[data-waarde=\"${attr(el.dataset.waarde)}\"]` : '';\n    if (el.dataset.actie) return `[data-actie=\"${attr(el.dataset.actie)}\"]${w}`;\n    if (el.dataset.kies) return `[data-kies=\"${attr(el.dataset.kies)}\"]${w}`;\n    return null;\n  }\n\n  function zeg(tekst) {\n    let el = root.querySelector('[data-cu-ps-live]');\n    if (!el) {\n      el = document.createElement('div');\n      el.className = 'cu-ps__verborgen';\n      el.setAttribute('aria-live', 'polite');\n      el.setAttribute('data-cu-ps-live', '');\n      root.appendChild(el);\n    }\n    el.textContent = '';\n    window.setTimeout(() => { el.textContent = tekst; }, 60);\n  }\n\n  function render(focus = true) {\n    if (!app) return;\n    const terugFocus = focus ? null : focusSleutel(document.activeElement);\n    if (form && formVelden && form.parentElement !== root.querySelector('.page-width')) {\n      root.querySelector('.page-width').appendChild(form);\n    }\n    if (formVelden) formVelden.hidden = true;\n    // Typen en binnen 250 ms een product kiezen: de getypte zoektekst blijft staan.\n    const zoekVeld = app.querySelector('#cu-ps-zoek');\n    if (zoekVeld) st.zoek = zoekVeld.value;\n    let html = '';\n    switch (st.stap) {\n      case 'start': html = renderStart(); break;\n      case 'begrepen': html = renderBegrepen(); break;\n      case 'vraag1': html = metVoorproef(renderVraag1()); break;\n      case 'vraag2': html = metVoorproef(renderVraag2()); break;\n      case 'vraag3': html = metVoorproef(renderVraag3()); break;\n      case 'vraag4': html = metVoorproef(renderVraag4()); break;\n      case 'vraag5': html = metVoorproef(renderVraag5()); break;\n      case 'voorstel': html = renderVoorstel(); break;\n      case 'samenstellen': html = renderSamenstellen(); break;\n      case 'gegevens': html = renderGegevens(); break;\n      default: html = renderStart();\n    }\n    // Veegrijen (filters op mobiel) houden hun plek bij het opnieuw tekenen.\n    const rijen = {};\n    app.querySelectorAll('[data-cu-ps-rij]').forEach((r) => { rijen[r.dataset.cuPsRij] = r.scrollLeft; });\n    // Ook de doos en de filterkolom houden hun scrollplek: zonder dit sprong de doos na elke klik terug naar boven.\n    const vakken = {};\n    app.querySelectorAll('[data-cu-ps-scroll]').forEach((v) => { vakken[v.dataset.cuPsScroll] = v.scrollTop; });\n    app.innerHTML = html;\n    app.querySelectorAll('[data-cu-ps-rij]').forEach((r) => { if (rijen[r.dataset.cuPsRij]) r.scrollLeft = rijen[r.dataset.cuPsRij]; });\n    app.querySelectorAll('[data-cu-ps-scroll]').forEach((v) => { if (vakken[v.dataset.cuPsScroll]) v.scrollTop = vakken[v.dataset.cuPsScroll]; });\n    toonInDoos();\n    if (st.stap === 'gegevens' && form && formVelden) {\n      const plek = app.querySelector('[data-cu-ps-formplek]');\n      plek.appendChild(form);\n      formVelden.hidden = false;\n      bereidFormulierVoor();\n    }\n    if (st.stap === 'gegevens' && st.route === 'doos') sfeerVoorDoos();\n    bewaar();\n    if (terugFocus) herstelFocus(terugFocus);\n    if (focus) {\n      const h = app.querySelector('.cu-ps__vraag');\n      if (h) h.focus({ preventScroll: true });\n      if (st.stap !== 'start') scrollNaarApp();\n    }\n  }\n\n  // Het zojuist gekozen product in beeld in de lijst van de doos, zonder de pagina zelf te verschuiven.\n  function toonInDoos() {\n    const lijst = app && app.querySelector('[data-cu-ps-scroll=\"doos\"]');\n    const item = lijst && st.laatsteWijziging && lijst.querySelector(`[data-sleutel=\"${attr(st.laatsteWijziging)}\"]`);\n    st.laatsteWijziging = null;\n    if (!item || lijst.scrollHeight <= lijst.clientHeight) return;\n    const boven = item.offsetTop - lijst.offsetTop;\n    if (boven < lijst.scrollTop) lijst.scrollTop = boven - 6;\n    else if (boven + item.offsetHeight > lijst.scrollTop + lijst.clientHeight) lijst.scrollTop = boven + item.offsetHeight - lijst.clientHeight + 6;\n  }\n\n  function bewaar() {\n    const kopie = { ...st, doos: st.doos.map((i) => [i.sleutel, i.aantal]), offerteProduct: st.offerteProduct ? st.offerteProduct.id : null, pad: geschiedenis.slice(-30) };\n    schrijf(OPSLAG, kopie);\n  }\n\n  function herstel(opgeslagen) {\n    if (!opgeslagen) return false;\n    const pool = new Map(samenstelbaar().map((i) => [i.sleutel, i]));\n    st = { ...nieuweStaat(), ...opgeslagen };\n    delete st.pad;\n    let weg = 0;\n    st.doos = (opgeslagen.doos || []).map((k) => {\n      const [sleutel, aantal] = Array.isArray(k) ? k : [k, 1];\n      const item = pool.get(sleutel);\n      if (!item) weg += 1;\n      return item ? { ...item, aantal: Math.max(1, Math.min(99, Number(aantal) || 1)) } : null;\n    }).filter(Boolean);\n    st.doosWeg = weg;\n    st.offerteProduct = opgeslagen.offerteProduct ? producten.find((p) => p.id === opgeslagen.offerteProduct) || null : null;\n    return true;\n  }\n\n  /* ---------- formulier ---------- */\n\n  function bereidFormulierVoor() {\n    const kaartVeld = form.querySelector('[data-cu-ps-kaartveld]');\n    if (kaartVeld) kaartVeld.hidden = st.route !== 'doos';\n    const doos = st.route === 'doos';\n    const labelEen = form.querySelector('[data-cu-ps-label-een]');\n    const subEen = form.querySelector('[data-cu-ps-sub-een]');\n    const radioEen = form.querySelector('input[data-keuze=\"een\"]');\n    if (labelEen) labelEen.textContent = doos ? 'E\u00E9n adres in Nederland of Belgi\u00EB' : 'E\u00E9n adres in Nederland';\n    if (subEen) subEen.textContent = doos ? 'bijvoorbeeld jullie kantoor' : 'bijvoorbeeld jullie kantoor; Belgi\u00EB in overleg';\n    if (radioEen) radioEen.value = doos ? 'E\u00E9n adres (Nederland of Belgi\u00EB)' : 'E\u00E9n adres (Nederland)';\n    const een = form.querySelector('[data-cu-ps-prijs-een]');\n    const thuis = form.querySelector('[data-cu-ps-prijs-thuis]');\n    if (een) een.textContent = bezorgTekstEenAdres();\n    if (thuis) thuis.textContent = `${geld(ADRESPRIJS)} per pakket`;\n    // Een leverdatum in het verleden kan niet: vanaf morgen kiezen.\n    const datum = form.querySelector('#cu-ps-datum');\n    if (datum) {\n      const morgen = new Date(Date.now() + 86400000);\n      datum.min = `${morgen.getFullYear()}-${String(morgen.getMonth() + 1).padStart(2, '0')}-${String(morgen.getDate()).padStart(2, '0')}`;\n    }\n    werkBezorgingBij();\n    bindCaptcha();\n  }\n\n  function bezorgTekstEenAdres() {\n    if (st.route === 'doos') return 'Gratis bezorging';\n    const p = st.offerteProduct;\n    if (!p) return '';\n    const b = bezorging(p, st.n);\n    if (b.bedrag === 0) return 'Gratis bezorging';\n    if (b.bedrag === null) return 'Bezorging volgens gewicht';\n    return `Bezorging ${geld(b.bedrag)}`;\n  }\n\n  function bezorgKeuze() {\n    const keuze = form.querySelector('input[name=\"contact[Bezorging]\"]:checked');\n    return (keuze && keuze.dataset.keuze) || 'een';\n  }\n\n  function werkBezorgingBij() {\n    const w = bezorgKeuze();\n    const adres = form.querySelector('[data-cu-ps-adresveld]');\n    if (adres) adres.hidden = w !== 'een';\n    const thuis = form.querySelector('[data-cu-ps-thuisuitleg]');\n    if (thuis) thuis.hidden = w !== 'thuis';\n  }\n\n  function valideer(soort) {\n    const fouten = [];\n    form.querySelectorAll('[aria-invalid=\"true\"]').forEach((el) => el.removeAttribute('aria-invalid'));\n    const markeer = (el) => { if (el) el.setAttribute('aria-invalid', 'true'); };\n    const verplicht = [['#cu-ps-naam', 'je naam'], ['#cu-ps-bedrijf', 'de bedrijfsnaam'], ['#cu-ps-mail', 'je e-mailadres'], ['#cu-ps-tel', 'je telefoonnummer']];\n    verplicht.forEach(([sel, naam]) => {\n      const el = form.querySelector(sel);\n      if (!el || !el.value.trim()) { fouten.push(`Vul ${naam} in.`); markeer(el); }\n    });\n    const mail = form.querySelector('#cu-ps-mail');\n    if (mail && mail.value.trim() && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(mail.value.trim())) { fouten.push('Het e-mailadres lijkt niet te kloppen.'); markeer(mail); }\n    const tel = form.querySelector('#cu-ps-tel');\n    if (tel && tel.value.trim() && tel.value.replace(/\\D/g, '').length < 9) { fouten.push('Het telefoonnummer lijkt te kort.'); markeer(tel); }\n    if (bezorgKeuze() === 'een' && /^Order/.test(soort || '')) {\n      const adres = form.querySelector('#cu-ps-adres');\n      if (adres && !adres.value.trim()) { fouten.push('Vul het afleveradres in voor een directe order, of kies \"Later beslissen\".'); markeer(adres); }\n    }\n    const datumVeld = form.querySelector('#cu-ps-datum');\n    if (datumVeld && datumVeld.value && datumVeld.min && datumVeld.value < datumVeld.min) { fouten.push('Kies een leverdatum vanaf morgen.'); markeer(datumVeld); }\n    if (st.route === 'doos' && !doosTotalen().haalt) fouten.push('Het minimum van \u20AC1.000 excl. btw is nog niet gehaald.');\n    return fouten;\n  }\n\n  const VELDEN = ['cu-ps-naam', 'cu-ps-bedrijf', 'cu-ps-mail', 'cu-ps-tel', 'cu-ps-adres', 'cu-ps-kaart', 'cu-ps-datum', 'cu-ps-opmerking'];\n\n  function velden() {\n    const uit = {};\n    VELDEN.forEach((id) => { const el = form.querySelector(`#${id}`); if (el) uit[id] = el.value; });\n    uit.bezorging = bezorgKeuze();\n    return uit;\n  }\n\n  function vulVelden(opgeslagen) {\n    if (!opgeslagen || !form) return;\n    VELDEN.forEach((id) => { const el = form.querySelector(`#${id}`); if (el && opgeslagen[id]) el.value = opgeslagen[id]; });\n    const keuze = form.querySelector(`input[name=\"contact[Bezorging]\"][data-keuze=\"${attr(opgeslagen.bezorging || 'een')}\"]`);\n    if (keuze) { keuze.checked = true; werkBezorgingBij(); }\n  }\n\n  function referentie() {\n    const d = new Date();\n    const datum = `${String(d.getDate()).padStart(2, '0')}${String(d.getMonth() + 1).padStart(2, '0')}`;\n    return `SP-${datum}-${Math.random().toString(36).slice(2, 6).toUpperCase()}`;\n  }\n\n  // Onderwerp voor de mail aan het team. Of Shopify contact[subject] als onderwerp gebruikt, moet een echte verzending\n  // uitwijzen; anders staat het als eerste regel in de mail.\n  function onderwerp(soort) {\n    const bedrijf = ((form.querySelector('#cu-ps-bedrijf') || {}).value || '').trim();\n    const kerst = maand >= 9 || st.gelegenheid === 'Kerst';\n    const wat = /^Order/.test(soort) ? (kerst ? 'Kerstpakketorder' : 'Pakketorder') : (kerst ? 'Kerstpakketaanvraag' : 'Pakketaanvraag');\n    return `${kerst ? '\uD83C\uDF84' : '\uD83D\uDCE6'} ${wat} \uD83C\uDF81${bedrijf ? ` ${bedrijf}` : ''}`;\n  }\n\n  function vulVerborgen(soort, ref) {\n    const zet = (naam, waarde) => { const el = form.querySelector(`[data-veld=\"${naam}\"]`); if (el) el.value = waarde; };\n    const regels = samenvattingRegels();\n    const intern = samenvattingRegels(true);\n    const erbij = (r) => { regels.push(r); intern.push(r); };\n    let pakketten = '';\n    let inhoud = '';\n    let totaal = '';\n    if (st.route === 'doos') {\n      const t = doosTotalen();\n      pakketten = String(t.n);\n      inhoud = st.doos.map((i) => `${i.aantal > 1 ? `${i.aantal} x ` : ''}${i.naam}`).join(' | ');\n      totaal = `${geld(t.totaalExcl)} excl. btw, handling ${geld(HANDLING)} excl. btw per pakket inbegrepen`;\n      const kaart = form.querySelector('#cu-ps-kaart');\n      erbij(kaart && kaart.value.trim() ? 'Kaartje: met jullie eigen tekst' : 'Kaartje: wij schrijven zelf iets leuks');\n    } else if (st.offerteProduct) {\n      pakketten = String(st.n);\n      inhoud = st.offerteProduct.titel;\n      totaal = `${geld(st.offerteProduct.prijs * st.n)} incl. btw, excl. bezorging`;\n    }\n    const w = bezorgKeuze();\n    if (w === 'thuis') erbij(`Bezorging: bij iedereen thuis, ${geld(ADRESPRIJS)} per pakket; de adressen nemen we samen door`);\n    else if (w === 'later') erbij('Bezorging: later beslissen');\n    else erbij(`Bezorging: \u00E9\u00E9n adres (${bezorgTekstEenAdres().toLowerCase() || 'in overleg'})`);\n    if (st.route === 'doos' && st.sfeer && st.sfeer.status === 'klaar' && st.sfeer.beeld && !st.sfeer.proef) intern.push(`Sfeerfoto (AI-impressie): ${st.sfeer.beeld}`);\n    zet('onderwerp', onderwerp(soort));\n    zet('soort', soort);\n    zet('referentie', ref);\n    zet('pakketten', pakketten);\n    zet('inhoud', inhoud);\n    zet('totaal', totaal);\n    zet('samenvatting', [`${soort}, referentie ${ref}`].concat(intern).join('\\n'));\n    return regels;\n  }\n\n  function koppelFormulier() {\n    if (!form || !formVelden) return;\n    form.noValidate = true;\n    form.addEventListener('change', (e) => {\n      if (e.target.name === 'contact[Bezorging]') werkBezorgingBij();\n    });\n    form.addEventListener('input', (e) => {\n      if (e.target.id === 'cu-ps-kaart') {\n        const rest = 200 - e.target.value.length;\n        form.querySelector('[data-cu-ps-kaartteller]').textContent = `Nog ${rest} ${rest === 1 ? 'teken' : 'tekens'}.`;\n      }\n    });\n    // Eigen controle in de capture-fase, zodat die v\u00F3\u00F3r de spamcontrole van Shopify (hCaptcha) draait. Klopt er iets\n    // niet, dan stopt het hier helemaal (stopImmediatePropagation); anders laten we het event door: de spamcontrole\n    // verstuurt dan zelf (form.submit, zonder submit-event), of het formulier gaat gewoon weg als die uit staat.\n    form.addEventListener('submit', (e) => {\n      if (form.hasAttribute('data-cu-bezig')) { e.preventDefault(); e.stopImmediatePropagation(); return; }\n      const knop = e.submitter || form.querySelector('[data-soort]');\n      const soort = (knop && knop.dataset.soort) || 'Aanvraag (vrijblijvend)';\n      const meldingen = form.querySelector('[data-cu-ps-validatie]');\n      const fouten = valideer(soort);\n      if (fouten.length) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        meldingen.innerHTML = `<p>${fouten.map(esc).join('<br>')}</p>`;\n        meldingen.hidden = false;\n        const eerste = form.querySelector('[aria-invalid=\"true\"]');\n        if (eerste) { eerste.focus({ preventScroll: true }); eerste.scrollIntoView({ behavior: 'smooth', block: 'center' }); }\n        else meldingen.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        meet('validatie', { aantal: fouten.length });\n        return;\n      }\n      meldingen.hidden = true;\n      const ref = referentie();\n      const regels = vulVerborgen(soort, ref);\n      const naam = ((form.querySelector('#cu-ps-naam') || {}).value || '').trim();\n      const sfeer = st.route === 'doos' && st.sfeer && st.sfeer.status === 'klaar' && st.sfeer.beeld ? { beeld: st.sfeer.beeld, deel: sfeerDeelUrl(), proef: !!st.sfeer.proef } : null;\n      schrijf('cu-ps-verstuurd', { soort, ref, regels, route: st.route, voornaam: naam.split(/\\s+/)[0] || '', sfeer });\n      schrijf('cu-ps-velden', velden());\n      bewaar();\n      meet('verstuur', { soort, route: st.route, aantal: st.route === 'doos' ? doosTotalen().n : st.n });\n      form.setAttribute('data-cu-bezig', '');\n      window.setTimeout(() => {\n        // Gooide de spamcontrole deze poging weg, dan het formulier weer bruikbaar maken.\n        if (e.defaultPrevented && !captchaGebonden()) form.removeAttribute('data-cu-bezig');\n      }, 0);\n      window.setTimeout(() => form.removeAttribute('data-cu-bezig'), 8000);\n    }, true);\n    window.addEventListener('pageshow', () => form.removeAttribute('data-cu-bezig'));\n  }\n\n  // Spamcontrole van Shopify (hCaptcha): Shopify bindt die pas bij de eerste focus of wijziging in het formulier en gooit\n  // tot dan elke verzending weg. Daarom binden we zelf zodra het formulier in beeld komt (zoals cu-pdp.js doet).\n  function captchaGebonden() {\n    return !!form && (form.hasAttribute('data-hcaptcha-bound') || form.hasAttribute('data-recaptcha-bound'));\n  }\n  function bindCaptcha() {\n    const c = window.Shopify && window.Shopify.captcha;\n    if (!form || !c || typeof c.protect !== 'function' || captchaGebonden()) return;\n    try { c.protect(form); } catch (err) { /* dan bindt Shopify zelf bij de eerste focus */ }\n  }\n\n  function toonBevestiging() {\n    const blok = root.querySelector('[data-cu-ps-bevestiging]');\n    if (!blok) return false;\n    root.classList.add('cu-ps--bevestigd');\n    document.querySelectorAll('[id$=\"__faq\"]').forEach((el) => { el.hidden = true; });\n    const info = lees('cu-ps-verstuurd');\n    if (info) {\n      const isOrder = /^Order/.test(info.soort || '');\n      const bedankt = blok.querySelector('[data-cu-ps-bedankt]');\n      if (bedankt && info.voornaam) bedankt.textContent = `Bedankt, ${info.voornaam}!`;\n      blok.querySelector('.cu-ps__groot').textContent = isOrder ? 'Je order is binnen!' : 'Je aanvraag is binnen!';\n      const stappen = blok.querySelector('[data-cu-ps-stappen]');\n      if (stappen && isOrder) stappen.innerHTML = '<li>We nemen je order binnen \u00E9\u00E9n werkdag met je door.</li><li>Daarna krijg je een bevestiging met de definitieve order.</li>';\n      const details = blok.querySelector('[data-cu-ps-bevestiging-details]');\n      if (details) {\n        const sf = info.sfeer && info.sfeer.beeld && /^https:\\/\\//.test(info.sfeer.beeld) ? info.sfeer : null;\n        details.innerHTML = `${sf ? `<figure class=\"cu-ps__sfeer cu-ps__sfeer--bevestiging\">\n            <img src=\"${esc(sf.beeld)}\" width=\"1536\" height=\"1024\" alt=\"AI-gegenereerde impressie van je pakket\">\n            <figcaption class=\"cu-ps__klein\">Zo ongeveer gaat je pakket de deur uit (AI-impressie).</figcaption>\n            ${sf.deel && !sf.proef ? `<a class=\"button button--secondary cu-ps__linkedin\" href=\"${esc(sf.deel)}\" target=\"_blank\" rel=\"noopener\" data-cu-ps-linkedin-bevestiging>Deel je pakket op LinkedIn</a>` : ''}\n          </figure>` : ''}<div class=\"cu-ps__recap\"><p class=\"cu-ps__label\">Wat je verstuurde <span class=\"cu-ps__klein\">\u00B7 referentie ${esc(info.ref)}</span></p><ul role=\"list\">${(info.regels || []).map((r) => `<li>${esc(r)}</li>`).join('')}</ul></div>`;\n        const li = details.querySelector('[data-cu-ps-linkedin-bevestiging]');\n        if (li) li.addEventListener('click', () => meet('sfeer_linkedin', { plek: 'bevestiging' }));\n      }\n      meet('bevestiging', { soort: info.soort });\n      wis('cu-ps-verstuurd');\n      wis('cu-ps-velden');\n      wis(OPSLAG);\n    }\n    if (app) app.hidden = true;\n    blok.focus({ preventScroll: true });\n    const boven = root.getBoundingClientRect().top + window.scrollY - 130;\n    window.scrollTo({ top: Math.max(0, boven), behavior: 'smooth' });\n    window.setTimeout(() => confetti(true), 300);\n    return true;\n  }\n\n  /* ---------- sfeerfoto: AI-impressie van de zelf samengestelde doos (2026-10-19) ---------- */\n  // Na Verder vraagt de samensteller de sfeerfoto-server (cfg.sfeerfotoUrl) om een foto van de doos. De server rekent\n  // de indeling op echte maat uit (maten uit het metaveld cycleup.sfeerfoto) en laat FLUX.3 Klein de foto maken. Zelfde\n  // doos = zelfde foto. Aan via de sectie-instelling, of om te testen met ?sfeerfoto=1.\n\n  const SFEER_AAN = cfg.sfeerfoto === true || new URLSearchParams(location.search).get('sfeerfoto') === '1';\n  const SFEER_URL = String(cfg.sfeerfotoUrl || '').replace(/\\/+$/, '');\n  // Stijl 4 (werkbank in laagjes): alle producten groot in beeld. Stijl 3 (licht en rustig): doos met touwstrik,\n  // alle producten. Stijl 2: werkbank, maximaal 9. Stijl 3 en 4 duren langer.\n  const SFEER_STIJL = (() => {\n    const v = new URLSearchParams(location.search).get('sfeerstijl') || String(cfg.sfeerStijl || '2');\n    return ['2', '3', '4'].includes(v) ? v : '2';\n  })();\n  const SFEER_MAX = SFEER_STIJL === '2' ? 9 : 31;      // zoveel producten passen op \u00E9\u00E9n foto (zie de server)\n  let sfeerTimer = null;\n\n  // Elk product \u00E9\u00E9n keer, alleen producten met sfeerfotogegevens, in de volgorde van de doos.\n  function sfeerItems() {\n    const gezien = new Set();\n    const uit = [];\n    for (const i of st.doos) {\n      const sf = i.p.sf;\n      if (!sf || gezien.has(i.p.id)) continue;\n      gezien.add(i.p.id);\n      uit.push([sf.f, sf.k[0], sf.k[1], sf.k[2], sf.k[3], sf.b, sf.h, sf.d || 2, sf.s || 'staand', sf.t || 'overig', sf.o || '']);\n    }\n    return uit;\n  }\n  const uniekeProducten = () => new Set(st.doos.map((i) => i.p.id)).size;\n  const sfeerSleutel = () => [...new Set(st.doos.map((i) => i.p.id))].sort().join('_');\n  const b64url = (tekst) => {\n    let bin = '';\n    new TextEncoder().encode(tekst).forEach((c) => { bin += String.fromCharCode(c); });\n    return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n  };\n  const sfeerAbs = (pad) => (/^https?:/.test(pad) ? pad : SFEER_URL + pad);\n\n  function sfeerDeelUrl() {\n    const s = st.sfeer;\n    if (!s || !s.beeld) return '';\n    const pad = s.beeld.startsWith(SFEER_URL) ? s.beeld.slice(SFEER_URL.length) : s.beeld;\n    const pagina = `${SFEER_URL}/p?b=${encodeURIComponent(pad)}&l=${encodeURIComponent(deelDoosLink())}`;\n    return `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(pagina)}`;\n  }\n\n  function sfeerHTML() {\n    const s = st.sfeer;\n    if (!s || s.status === 'geen') return '';\n    if (s.status === 'laden') {\n      return `<figure class=\"cu-ps__sfeer is-laden\" aria-busy=\"true\">\n        <div class=\"cu-ps__sfeer-vak\"><span class=\"cu-ps__sfeer-tekst\">We pakken je doos in voor de foto\u2026</span><span class=\"cu-ps__sfeer-balk\" aria-hidden=\"true\"><span${SFEER_STIJL !== '2' ? ' style=\"animation-duration:26s\"' : ''}></span></span></div>\n        <figcaption class=\"cu-ps__klein\">Een AI-impressie van je pakket, klaar in ongeveer ${SFEER_STIJL !== '2' ? '20' : '10'} seconden. Je kunt intussen gewoon verder.</figcaption>\n      </figure>`;\n    }\n    if (s.status === 'fout') {\n      return `<figure class=\"cu-ps__sfeer is-fout\">\n        <div class=\"cu-ps__sfeer-vak\"><span class=\"cu-ps__sfeer-tekst\">De foto van je pakket lukt nu even niet.</span>\n          <button type=\"button\" class=\"cu-ps__link\" data-actie=\"sfeer-opnieuw\">Probeer het opnieuw</button></div>\n      </figure>`;\n    }\n    const totaal = uniekeProducten();\n    const getoond = Math.min(SFEER_MAX, Math.max(0, (s.mee || 0) - (s.weg || 0)));\n    const deels = getoond && getoond < totaal ? ` Op de foto ${getoond === 1 ? 'staat' : 'staan'} ${getoond} van je ${totaal} producten.` : '';\n    return `<figure class=\"cu-ps__sfeer\">\n        <a class=\"cu-ps__sfeer-beeld\" href=\"${esc(s.beeld)}\" target=\"_blank\" rel=\"noopener\"><img src=\"${esc(s.beeld)}\" width=\"1536\" height=\"1024\" alt=\"AI-gegenereerde impressie van je zelf samengestelde pakket\"></a>\n        <figcaption class=\"cu-ps__klein\">AI-impressie, gemaakt op basis van onze productfoto's. De inhoud staat in de lijst; verpakking, aantallen en decoratie kunnen afwijken.${deels}${s.proef ? ' <b>Proefstand: dit is een voorbeeldbeeld, nog niet jouw pakket.</b>' : ''}</figcaption>\n        <div class=\"cu-ps__sfeer-acties\">\n          ${(s.variant || 0) < 2 ? '<button type=\"button\" class=\"cu-ps__link\" data-actie=\"sfeer-ander\">Andere foto</button>' : ''}\n          <a class=\"cu-ps__link\" href=\"${esc(sfeerDeelUrl())}\" target=\"_blank\" rel=\"noopener\" data-cu-ps-linkedin>Deel op LinkedIn</a>\n        </div>\n      </figure>`;\n  }\n\n  function tekenSfeer() {\n    if (st.stap !== 'gegevens' || !app) return;\n    const plek = app.querySelector('[data-cu-ps-sfeerplek]');\n    if (plek) plek.innerHTML = sfeerHTML();\n  }\n\n  // Bij het overzicht: hergebruik wat er al is voor deze doos, hervat een lopende foto, of start een nieuwe.\n  function sfeerVoorDoos() {\n    if (!SFEER_AAN || !SFEER_URL || st.route !== 'doos' || !st.doos.length) return;\n    const s = st.sfeer;\n    const sleutel = sfeerSleutel();\n    if (s && s.sleutel === sleutel) {\n      if (s.status === 'klaar' || s.status === 'geen' || s.status === 'fout') return;\n      if (s.status === 'laden' && s.id) { if (!sfeerTimer) volgSfeer(sleutel); return; }\n      // Startverzoek nog onderweg (opnieuw getekend binnen een paar seconden): niet nog een keer starten.\n      if (s.status === 'laden' && !s.id && Date.now() - (s.start || 0) < 15000) return;\n    }\n    startSfeer(0);\n  }\n\n  async function startSfeer(variant, nonce, poging) {\n    const items = sfeerItems();\n    const sleutel = sfeerSleutel();\n    window.clearTimeout(sfeerTimer);\n    sfeerTimer = null;\n    if (!items.length) { st.sfeer = { status: 'geen', sleutel }; tekenSfeer(); return; }\n    st.sfeer = { status: 'laden', sleutel, variant: variant || 0, start: Date.now(), mee: items.length, poging: poging || 1 };\n    tekenSfeer();\n    meet('sfeer_start', { producten: items.length, variant: variant || 0 });\n    try {\n      const u = new URL(SFEER_URL + '/api/start');\n      u.searchParams.set('d', b64url(JSON.stringify(items)));\n      u.searchParams.set('v', String(variant || 0));\n      if (SFEER_STIJL !== '2') u.searchParams.set('s', SFEER_STIJL);\n      // Versie van de indeling van stijl 4: ophogen na een wijziging, zodat de CDN geen oude foto's teruggeeft.\n      if (SFEER_STIJL === '4') u.searchParams.set('r', '1');\n      if (nonce) u.searchParams.set('n', nonce);\n      const r = await fetch(u.toString(), { mode: 'cors', credentials: 'omit' });\n      const j = await r.json().catch(() => ({}));\n      if (!r.ok || !j.id) throw new Error(j.fout || `start ${r.status}`);\n      if (!st.sfeer || st.sfeer.sleutel !== sleutel) return;\n      Object.assign(st.sfeer, { id: j.id, proef: !!j.proef, weg: j.weggelaten || 0, c: Array.isArray(j.c) ? j.c.join(',') : '' });\n      bewaar();\n      volgSfeer(sleutel);\n    } catch (e) {\n      if (st.sfeer && st.sfeer.sleutel === sleutel) { st.sfeer.status = 'fout'; tekenSfeer(); meet('sfeer_fout', { stap: 'start' }); }\n    }\n  }\n\n  function volgSfeer(sleutel) {\n    window.clearTimeout(sfeerTimer);\n    const stap = async () => {\n      const s = st.sfeer;\n      sfeerTimer = null;\n      if (!s || s.sleutel !== sleutel || s.status !== 'laden') return;\n      if (Date.now() - s.start > 120000) { s.status = 'fout'; tekenSfeer(); meet('sfeer_fout', { stap: 'tijd' }); return; }\n      try {\n        const r = await fetch(`${SFEER_URL}/api/status?id=${encodeURIComponent(s.id)}${s.c ? `&c=${encodeURIComponent(s.c)}` : ''}`, { mode: 'cors', credentials: 'omit' });\n        const j = await r.json().catch(() => ({}));\n        if (!st.sfeer || st.sfeer.sleutel !== sleutel || st.sfeer.status !== 'laden') return;\n        if (j.klaar && j.beeld) {\n          Object.assign(st.sfeer, { status: 'klaar', beeld: sfeerAbs(j.beeld), ms: Date.now() - s.start });\n          bewaar();\n          tekenSfeer();\n          meet('sfeer_klaar', { ms: st.sfeer.ms, proef: !!st.sfeer.proef, variant: st.sfeer.variant });\n          zeg('De foto van je pakket staat klaar.');\n          return;\n        }\n        if (j.mislukt) {\n          // De opdracht zelf mislukte (bijv. een productfoto die even niet te downloaden was): \u00E9\u00E9n keer stil opnieuw.\n          meet('sfeer_fout', { stap: 'model', reden: j.reden || '', poging: s.poging || 1 });\n          if ((s.poging || 1) < 2) { startSfeer(s.variant || 0, Date.now().toString(36), 2); return; }\n          s.status = 'fout'; tekenSfeer(); return;\n        }\n        if (!r.ok) throw new Error(`status ${r.status}`);\n      } catch (e) {\n        s.fouten = (s.fouten || 0) + 1;\n        if (s.fouten > 3) { s.status = 'fout'; tekenSfeer(); meet('sfeer_fout', { stap: 'status' }); return; }\n      }\n      sfeerTimer = window.setTimeout(stap, 2000);\n    };\n    sfeerTimer = window.setTimeout(stap, 1500);\n  }\n\n  /* ---------- feest, melding, vergrootglas, delen ---------- */\n\n  function confetti(veel) {\n    if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n    const doek = document.createElement('canvas');\n    const ctx = doek.getContext && doek.getContext('2d');\n    if (!ctx) return;\n    doek.className = 'cu-ps-confetti';\n    doek.setAttribute('aria-hidden', 'true');\n    document.body.appendChild(doek);\n    const dpr = Math.min(window.devicePixelRatio || 1, 2);\n    const b = window.innerWidth;\n    const h = window.innerHeight;\n    doek.width = b * dpr;\n    doek.height = h * dpr;\n    const kleuren = ['#ff6600', '#ff8a3d', '#ffb27f', '#171717', '#6b6b6b', '#ffd9bf'];\n    const deeltjes = [];\n    (veel ? [0.2, 0.5, 0.8] : [0.5]).forEach((bron) => {\n      for (let k = 0; k < (veel ? 110 : 140); k += 1) {\n        deeltjes.push({\n          x: b * bron, y: h * 0.42,\n          vx: (Math.random() - 0.5) * (veel ? 14 : 12), vy: -(4 + Math.random() * (veel ? 13 : 11)),\n          g: 0.28 + Math.random() * 0.12, w: 6 + Math.random() * 6, l: 9 + Math.random() * 8,\n          r: Math.random() * Math.PI, vr: (Math.random() - 0.5) * 0.32,\n          kleur: kleuren[Math.floor(Math.random() * kleuren.length)]\n        });\n      }\n    });\n    const duur = veel ? 4200 : 2800;\n    const begin = performance.now();\n    const stap = (nu) => {\n      const t = nu - begin;\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n      ctx.clearRect(0, 0, b, h);\n      ctx.globalAlpha = t > duur - 700 ? Math.max(0, (duur - t) / 700) : 1;\n      for (const d of deeltjes) {\n        d.vx *= 0.985; d.vy += d.g; d.x += d.vx; d.y += d.vy; d.r += d.vr;\n        ctx.save();\n        ctx.translate(d.x, d.y);\n        ctx.rotate(d.r);\n        ctx.fillStyle = d.kleur;\n        ctx.fillRect(-d.w / 2, -d.l / 2, d.w, Math.max(1, d.l * Math.abs(Math.cos(d.r * 1.7))));\n        ctx.restore();\n      }\n      if (t < duur) window.requestAnimationFrame(stap); else doek.remove();\n    };\n    window.requestAnimationFrame(stap);\n  }\n\n  let meldingTimer = null;\n  function meldingEl() {\n    let el = root.querySelector('[data-cu-ps-melding]');\n    if (!el) {\n      el = document.createElement('div');\n      el.className = 'cu-ps__melding';\n      el.setAttribute('data-cu-ps-melding', '');\n      el.setAttribute('role', 'status');\n      root.appendChild(el);\n    }\n    return el;\n  }\n  function melding(tekst) {\n    const el = meldingEl();\n    el.innerHTML = `<span>${esc(tekst)}</span><button type=\"button\" class=\"cu-ps__link\" data-cu-ps-naar-doos>Bekijk de doos</button>`;\n    el.classList.add('is-zichtbaar');\n    window.clearTimeout(meldingTimer);\n    meldingTimer = window.setTimeout(() => el.classList.remove('is-zichtbaar'), 2600);\n  }\n\n  // Brengt de keuzehulp net onder de vaste kop van het thema in beeld (zelf samenstellen, gedeeld pakket).\n  function scrollNaarApp() {\n    const kop = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--sticky-header-height')) || 0;\n    const top = app.getBoundingClientRect().top + window.scrollY - kop - 12;\n    if (Math.abs(window.scrollY - top) < 40) return;\n    window.scrollTo({ top: Math.max(0, top), behavior: 'auto' });\n  }\n\n  // Op mobiel staat het totaal onder de opties: na een keuze de bestelknop in beeld brengen. Vanuit het venster ook de\n  // focus erheen, zodat toetsenbord en schermlezer daar verder gaan.\n  function naarSom() {\n    const som = app.querySelector('.cu-ps__som');\n    if (som && window.matchMedia && window.matchMedia('(max-width: 989px)').matches) som.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n  }\n\n  // Focus terug op een gekozen filter en, in een veegrij, die chip helemaal in beeld.\n  function chipInBeeld(sel) {\n    herstelFocus(sel);\n    const chip = app.querySelector(sel);\n    const rij = chip && chip.closest('[data-cu-ps-rij]');\n    if (!rij || rij.scrollWidth <= rij.clientWidth) return;\n    const c = chip.getBoundingClientRect();\n    const r = rij.getBoundingClientRect();\n    if (c.left < r.left || c.right > r.right) rij.scrollLeft += c.left - r.left - 16;\n  }\n\n  function herstelFocus(sel) {\n    try {\n      const el = app.querySelector(sel);\n      if (el) { el.focus({ preventScroll: true }); return true; }\n    } catch (e) { /* ongeldige selector */ }\n    return false;\n  }\n\n  function voegToe(sleutel) {\n    const bestaand = st.doos.find((i) => i.sleutel === sleutel);\n    if (bestaand) bestaand.aantal = Math.min(99, bestaand.aantal + 1);\n    else {\n      const item = samenstelbaar().find((i) => i.sleutel === sleutel);\n      if (!item) return;\n      st.doos = st.doos.concat({ ...item, aantal: 1 });\n    }\n    const nu = st.doos.find((i) => i.sleutel === sleutel);\n    st.laatsteWijziging = sleutel;\n    render(false);\n    melding(`${nu.naam} zit in de doos${nu.aantal > 1 ? ` (${nu.aantal}\u00D7)` : ''} \u00B7 ${doosStand()}`);\n  }\n\n  let venster = null;\n  let vensterOpener = null;\n  const omschrijvingen = new Map();\n  // Alle productfoto's per handle (uit /products/<handle>.js), voor de fotostrook in het venster (wens Jeroen 2026-10-18).\n  const fotos = new Map();\n\n  function fotoMaat(src, breedte) {\n    let u = String(src || '');\n    if (u.startsWith('//')) u = `https:${u}`;\n    if (/[?&]width=\\d+/.test(u)) return u.replace(/([?&])width=\\d+/, `$1width=${breedte}`);\n    return `${u}${u.includes('?') ? '&' : '?'}width=${breedte}`;\n  }\n\n  // Eerst de foto die je al ziet, daarna de andere productfoto's, zonder dubbele.\n  function galerijFotos(item) {\n    const pad = (u) => String(u || '').split('?')[0].replace(/^https?:/, '');\n    const lijst = [{ src: item.p.foto, alt: item.naam }];\n    (fotos.get(item.p.handle) || []).forEach((f) => {\n      if (!lijst.some((x) => pad(x.src) === pad(f.src))) lijst.push({ src: f.src, alt: f.alt || item.naam });\n    });\n    return lijst;\n  }\n\n  function galerijHTML(item) {\n    const lijst = galerijFotos(item);\n    const meer = lijst.length > 1;\n    const plaatjes = lijst.map((f, k) => `<figure class=\"cu-ps__galerij-foto\"${meer ? ` aria-label=\"${esc(`Foto ${k + 1} van ${lijst.length}`)}\"` : ''}><img src=\"${esc(fotoMaat(f.src, 900))}\" alt=\"${esc(f.alt || item.naam)}\" width=\"900\" height=\"900\"${k ? ' loading=\"lazy\"' : ''}></figure>`).join('');\n    return `<div class=\"cu-ps__venster-foto${meer ? ' cu-ps__galerij' : ''}\" data-cu-ps-galerij>\n      <div class=\"cu-ps__galerij-baan\"${meer ? ` tabindex=\"0\" role=\"group\" aria-roledescription=\"fotostrook\" aria-label=\"${esc(`Foto's van ${item.naam}, gebruik de pijltjes`)}\"` : ''}>${plaatjes}</div>\n      ${meer ? `<button type=\"button\" class=\"cu-ps__galerij-pijl cu-ps__galerij-pijl--vorige\" data-venster=\"foto-vorige\" aria-label=\"Vorige foto\">\u2039</button>\n      <button type=\"button\" class=\"cu-ps__galerij-pijl cu-ps__galerij-pijl--volgende\" data-venster=\"foto-volgende\" aria-label=\"Volgende foto\">\u203A</button>\n      <p class=\"cu-ps__galerij-teller\" data-cu-ps-fototeller aria-live=\"polite\">1 / ${lijst.length}</p>` : ''}\n    </div>`;\n  }\n\n  function schuifFoto(richting) {\n    const baan = venster && venster.querySelector('.cu-ps__galerij-baan');\n    if (!baan || baan.children.length < 2) return;\n    const n = baan.children.length;\n    const nu = Math.round(baan.scrollLeft / Math.max(1, baan.clientWidth));\n    const doel = (nu + richting + n) % n;\n    const zacht = !(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n    baan.scrollTo({ left: doel * baan.clientWidth, behavior: zacht ? 'smooth' : 'auto' });\n  }\n\n  function koppelGalerij() {\n    const baan = venster && venster.querySelector('.cu-ps__galerij-baan');\n    const teller = venster && venster.querySelector('[data-cu-ps-fototeller]');\n    if (!baan || !teller) return;\n    let wacht = null;\n    baan.addEventListener('scroll', () => {\n      window.clearTimeout(wacht);\n      wacht = window.setTimeout(() => {\n        teller.textContent = `${Math.round(baan.scrollLeft / Math.max(1, baan.clientWidth)) + 1} / ${baan.children.length}`;\n      }, 80);\n    }, { passive: true });\n  }\n\n  async function laadOmschrijving(handle) {\n    if (omschrijvingen.has(handle)) return omschrijvingen.get(handle);\n    let html = '<p class=\"cu-ps__klein\">Geen omschrijving gevonden. Op de productpagina staan alle details.</p>';\n    try {\n      const r = await fetch(`/products/${encodeURIComponent(handle)}.js`, { headers: { Accept: 'application/json' } });\n      if (r.ok) {\n        const j = await r.json();\n        const media = Array.isArray(j.media) ? j.media.filter((m) => m && m.media_type === 'image' && m.src).map((m) => ({ src: m.src, alt: m.alt })) : [];\n        fotos.set(handle, media.length ? media : (Array.isArray(j.images) ? j.images.map((src) => ({ src, alt: '' })) : []));\n        const doc = new DOMParser().parseFromString(j.description || '', 'text/html');\n        doc.querySelectorAll('script, style, iframe, object, embed, link, meta, form, input, button').forEach((el) => el.remove());\n        doc.querySelectorAll('*').forEach((el) => {\n          [...el.attributes].forEach((a) => {\n            if (/^on/i.test(a.name) || a.name === 'style' || a.name === 'class' || (/^(href|src)$/i.test(a.name) && /^\\s*javascript:/i.test(a.value))) el.removeAttribute(a.name);\n          });\n        });\n        if (doc.body.textContent.trim()) html = doc.body.innerHTML;\n      }\n    } catch (e) { /* dan zonder omschrijving */ }\n    omschrijvingen.set(handle, html);\n    return html;\n  }\n\n  function zoekItem(sleutel) {\n    if (String(sleutel).startsWith('p:')) {\n      const id = Number(String(sleutel).slice(2));\n      const p = producten.find((x) => x.id === id);\n      return p ? { sleutel, p, v: p.variant, prijs: p.prijs, naam: naamVan(p), magErbij: false } : null;\n    }\n    const item = samenstelbaar().find((i) => i.sleutel === sleutel);\n    return item ? { ...item, magErbij: true } : null;\n  }\n\n  function vulVenster(sleutel) {\n    const item = zoekItem(sleutel);\n    if (!item || !venster) return;\n    venster.dataset.sleutel = sleutel;\n    const n = (st.doos.find((i) => i.sleutel === sleutel) || {}).aantal || 0;\n    venster.innerHTML = `<div class=\"cu-ps__venster-binnen\">\n      <button type=\"button\" class=\"cu-ps__venster-sluit\" data-venster=\"sluit\" aria-label=\"Sluiten\">\u00D7</button>\n      ${galerijHTML(item)}\n      <div class=\"cu-ps__venster-tekst\">\n        <h2 class=\"cu-ps__vraag\" id=\"cu-ps-venster-titel\">${esc(item.naam)}</h2>\n        <p class=\"cu-ps__venster-prijs\"><b>${geld(toon(item.prijs, item.p))}</b> <span class=\"cu-ps__klein\">per stuk, ${btwLabel()}</span></p>\n        <div class=\"cu-ps__venster-knoppen\">\n          ${item.magErbij ? knopHTML(n ? `Nog \u00E9\u00E9n erbij (${n} in de doos)` : 'Voeg toe aan de doos', `data-venster=\"erbij\" data-waarde=\"${esc(sleutel)}\"`, true) : ''}\n          ${!item.magErbij && st.stap === 'voorstel' ? (() => {\n            const index = voorstel(st).findIndex((x) => x.p.id === item.p.id);\n            if (index < 0) return '';\n            // Al gekozen: meteen door naar het totaal met de bestelknop.\n            return index !== st.gekozen ? knopHTML(item.p.pakket ? 'Kies dit pakket' : 'Kies dit cadeau', `data-venster=\"kies\" data-waarde=\"${index}\"`, true)\n              : knopHTML('Ga naar bestellen', 'data-venster=\"naar-som\"', true);\n          })() : ''}\n          <a class=\"cu-ps__link\" href=\"${esc(item.p.url)}\" target=\"_blank\" rel=\"noopener\">Bekijk de productpagina</a>\n        </div>\n        <div class=\"cu-ps__venster-omschrijving\" data-cu-ps-omschrijving>${omschrijvingen.get(item.p.handle) || '<p class=\"cu-ps__klein\">Omschrijving laden\u2026</p>'}</div>\n      </div>\n    </div>`;\n    koppelGalerij();\n    if (!omschrijvingen.has(item.p.handle)) {\n      laadOmschrijving(item.p.handle).then((html) => {\n        if (!venster || venster.dataset.sleutel !== sleutel) return;\n        const plek = venster.querySelector('[data-cu-ps-omschrijving]');\n        if (plek) plek.innerHTML = html;\n        // Meer foto's gevonden: de strook opnieuw opbouwen.\n        const galerij = venster.querySelector('[data-cu-ps-galerij]');\n        if (galerij && galerijFotos(item).length > 1) { galerij.outerHTML = galerijHTML(item); koppelGalerij(); }\n      });\n    }\n  }\n\n  function openVenster(sleutel) {\n    if (!venster) {\n      venster = document.createElement('dialog');\n      venster.className = 'cu-ps__venster';\n      venster.setAttribute('aria-labelledby', 'cu-ps-venster-titel');\n      venster.addEventListener('close', () => {\n        // Na \"Kies dit pakket\" of \"Ga naar bestellen\" verder bij de bestelknop, anders terug naar het vergrootglas.\n        const naarSomFocus = venster.dataset.naSluiten === 'som';\n        venster.dataset.naSluiten = '';\n        const knop = naarSomFocus ? app.querySelector('.cu-ps__som .cu-ps__knoppen .button:not([disabled])') : null;\n        if (knop) knop.focus({ preventScroll: true });\n        else if (vensterOpener && app.contains(vensterOpener)) vensterOpener.focus({ preventScroll: true });\n        else herstelFocus(`[data-actie=\"zoom\"][data-waarde=\"${attr(venster.dataset.sleutel || '')}\"]`);\n      });\n      venster.addEventListener('keydown', (e) => {\n        if ((e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') || e.target.closest('input, textarea, select')) return;\n        if (!venster.querySelector('.cu-ps__galerij-pijl')) return;\n        e.preventDefault();\n        schuifFoto(e.key === 'ArrowRight' ? 1 : -1);\n      });\n      venster.addEventListener('click', (e) => {\n        if (e.target === venster) { venster.close(); return; }\n        const knop = e.target.closest('[data-venster]');\n        if (!knop) return;\n        if (knop.dataset.venster === 'sluit') venster.close();\n        if (knop.dataset.venster === 'foto-vorige' || knop.dataset.venster === 'foto-volgende') { schuifFoto(knop.dataset.venster === 'foto-volgende' ? 1 : -1); return; }\n        if (knop.dataset.venster === 'kies' || knop.dataset.venster === 'naar-som') {\n          if (knop.dataset.venster === 'kies') { st.gekozen = Number(knop.dataset.waarde); st.gekozenId = null; }\n          venster.dataset.naSluiten = 'som';\n          venster.close();\n          if (knop.dataset.venster === 'kies') render(false);\n          naarSom();\n        }\n        if (knop.dataset.venster === 'erbij') {\n          voegToe(knop.dataset.waarde);\n          vulVenster(knop.dataset.waarde);\n          const nieuw = venster.querySelector('[data-venster=\"erbij\"]');\n          if (nieuw) nieuw.focus();\n        }\n      });\n      root.appendChild(venster);\n    }\n    vensterOpener = document.activeElement;\n    vulVenster(sleutel);\n    if (typeof venster.showModal === 'function') { if (!venster.open) venster.showModal(); } else venster.setAttribute('open', '');\n    meet('zoom', {});\n  }\n\n  async function kopieer(url, plek) {\n    let gelukt = false;\n    try { await navigator.clipboard.writeText(url); gelukt = true; } catch (e) { gelukt = false; }\n    if (plek) {\n      plek.innerHTML = gelukt ? 'De link staat op je klembord. Plak hem in een mail of chat.' : `Kopieer deze link: <input type=\"text\" readonly value=\"${esc(url)}\" class=\"cu-ps__deelveld\" aria-label=\"Deellink\">`;\n      plek.hidden = false;\n      const veld = plek.querySelector('input');\n      if (veld) { veld.focus(); veld.select(); }\n    }\n    zeg(gelukt ? 'De link staat op je klembord.' : 'Kopieer de link uit het veld.');\n    return gelukt;\n  }\n\n  function deelDoosLink() {\n    const u = new URL(location.origin + location.pathname);\n    u.searchParams.set('doos', st.doos.map((i) => `${i.v.id}x${i.aantal}`).join('_'));\n    u.searchParams.set('nd', String(Math.max(1, st.nDoos || 1)));\n    return u.toString();\n  }\n\n  function mailDoosHref() {\n    const t = doosTotalen();\n    const regels = st.doos.map((i) => `- ${i.aantal > 1 ? `${i.aantal} x ` : ''}${i.naam}`).join('\\n');\n    const foto = st.sfeer && st.sfeer.status === 'klaar' && st.sfeer.beeld && !st.sfeer.proef ? `\\nZo ziet het er ongeveer uit (AI-impressie):\\n${st.sfeer.beeld}\\n` : '';\n    const tekst = `Hoi,\\n\\nIk heb bij Cycle-Up The Shop een pakket samengesteld: ${t.n} pakketten, elk met:\\n${regels}\\n\\nSamen ${geld(t.totaalExcl)} excl. btw. Wat vind je ervan?\\n${foto}\\nBekijken of aanpassen kan hier:\\n${deelDoosLink()}\\n`;\n    return `mailto:?subject=${encodeURIComponent('Ons pakket van Cycle-Up The Shop')}&body=${encodeURIComponent(tekst)}`;\n  }\n\n  // \"Bewaar als pdf\": een eigen printweergave; in het printvenster kies je \"Opslaan als pdf\".\n  async function bewaarPdf() {\n    const t = doosTotalen();\n    document.querySelectorAll('.cu-ps-print').forEach((el) => el.remove());\n    const el = document.createElement('div');\n    el.className = 'cu-ps-print';\n    const datum = new Date().toLocaleDateString('nl-NL', { day: 'numeric', month: 'long', year: 'numeric' });\n    el.innerHTML = `<p class=\"cu-ps-print__merk\">Cycle-Up The Shop \u00B7 shop.cycle-up.nl</p>\n      <h1>Pakketvoorstel</h1>\n      <p class=\"cu-ps-print__sub\">${t.n} pakketten, samengesteld op ${esc(datum)}</p>\n      ${st.sfeer && st.sfeer.status === 'klaar' && st.sfeer.beeld ? `<figure class=\"cu-ps-print__sfeer\"><img src=\"${esc(st.sfeer.beeld)}\" alt=\"AI-impressie van het pakket\"><figcaption>AI-impressie op basis van onze productfoto's. De inhoud staat in de lijst hieronder; verpakking, aantallen en decoratie kunnen afwijken.</figcaption></figure>` : ''}\n      <table>\n        <thead><tr><th></th><th>Per pakket</th><th>Aantal</th><th>Prijs per stuk</th></tr></thead>\n        <tbody>${st.doos.map((i) => `<tr><td><img src=\"${esc(i.p.foto)}\" alt=\"\" width=\"56\" height=\"56\"></td><td>${esc(i.naam)}</td><td>${i.aantal}</td><td>${geld(i.prijs)}</td></tr>`).join('')}</tbody>\n      </table>\n      <dl>\n        <dt>Producten per pakket</dt><dd>${geld(t.prodIncl)} incl. btw</dd>\n        <dt>Handling per pakket: doos, opvulling, kaartje en inpakken</dt><dd>${geld(HANDLING)} excl. btw</dd>\n        <dt>Bezorging op \u00E9\u00E9n adres in Nederland of Belgi\u00EB</dt><dd>Gratis</dd>\n        <dt class=\"cu-ps-print__tot\">${t.n} pakketten, excl. btw</dt><dd class=\"cu-ps-print__tot\">${geld(t.totaalExcl)}</dd>\n        <dt>Incl. btw (indicatie)</dt><dd>${geld(t.totaalIncl)}</dd>\n      </dl>\n      <p>We pakken alles in, in de sociale werkplaats van de HUB in Leeuwarden, met een handgeschreven kaartje. Levering gemiddeld binnen 10 werkdagen; de planning stemmen we altijd met je af.</p>\n      <p>Bekijken of aanpassen: ${esc(deelDoosLink())}</p>\n      <p>Vragen? Bel ${esc(cfg.tel)} (${esc(cfg.telKeuze)}) of mail ${esc(cfg.mail)}.</p>`;\n    document.body.appendChild(el);\n    document.documentElement.classList.add('cu-ps-printen');\n    const titel = document.title;\n    document.title = `Pakketvoorstel Cycle-Up The Shop, ${t.n} pakketten`;\n    await Promise.all([...el.querySelectorAll('img')].map((img) => (img.decode ? img.decode().catch(() => {}) : Promise.resolve())));\n    const klaar = () => {\n      document.documentElement.classList.remove('cu-ps-printen');\n      document.title = titel;\n      el.remove();\n      window.removeEventListener('afterprint', klaar);\n    };\n    window.addEventListener('afterprint', klaar);\n    meet('pdf', { producten: st.doos.length, aantal: t.n });\n    window.print();\n  }\n\n  /* ---------- acties ---------- */\n\n  const VOLGENDE = { vraag1: 'vraag2', vraag2: 'vraag3', vraag3: 'vraag4', vraag4: 'vraag5', vraag5: 'voorstel' };\n\n  // Vragen die een ingang (link met ?gelegenheid= of ?budget=) al beantwoordde, slaan we over zolang het antwoord nog\n  // hetzelfde is. Terug brengt je er gewoon langs, dan kun je het aanpassen.\n  function overslaan(stap) {\n    const vooraf = st.vooraf || {};\n    return !!((stap === 'vraag3' && vooraf.budget && st.budget === vooraf.budget)\n      || (stap === 'vraag4' && vooraf.gelegenheid && st.gelegenheid === vooraf.gelegenheid));\n  }\n\n  function volgende(stap) {\n    let v = VOLGENDE[stap];\n    while (overslaan(v)) v = VOLGENDE[v];\n    return v;\n  }\n  const VORIGE = { vraag1: 'start', vraag2: 'vraag1', vraag3: 'vraag2', vraag4: 'vraag3', vraag5: 'vraag4', voorstel: 'vraag5', begrepen: 'start', gegevens: 'voorstel' };\n\n  // Elke stap krijgt een plek in de browsergeschiedenis, zodat de terugknop (of terugvegen op mobiel) \u00E9\u00E9n stap teruggaat.\n  function naar(stap, opties = {}) {\n    const vorige = st.stap;\n    if (!opties.vanPop && stap !== vorige) {\n      try {\n        history.pushState({ ...(history.state || {}), cuPs: stap }, '', location.href);\n        geschiedenis.push(stap);\n      } catch (e) { /* zonder browsergeschiedenis */ }\n    }\n    st.stap = stap;\n    laatsteStapwissel = performance.now();\n    // Nieuwe resultaten: begin bij optie 1. Terug vanuit de gegevens of via de browser: de keuze blijft staan.\n    if (stap !== 'samenstellen') st.doosWeg = 0;\n    if (stap === 'voorstel' && vorige !== 'gegevens' && !opties.vanPop) {\n      st.gekozen = 0;\n      st.gekozenId = null;\n      st.toonMeer = false;\n      meet('voorstel', { aantal: st.n, budget: st.budget, gelegenheid: st.gelegenheid, clubs: st.clubs });\n    }\n    render();\n  }\n\n  // E\u00E9n tik op Terug is \u00E9\u00E9n stap terug: tot de browser de stap heeft gewisseld (popstate) telt een volgende tik niet,\n  // anders gaat een dubbele tik twee stappen terug (of op de eerste stap de pagina af).\n  let terugSinds = 0;\n  function browserTerug() {\n    if (terugSinds && performance.now() - terugSinds < 3000) return false;\n    terugSinds = performance.now();\n    history.back();\n    return true;\n  }\n\n  // Terug in de app volgt de browsergeschiedenis als de vorige stap daar al staat.\n  function gaTerugNaar(doel) {\n    if (geschiedenis.length > 1 && geschiedenis[geschiedenis.length - 2] === doel) browserTerug();\n    else naar(doel);\n  }\n\n  // \"Terug\" gaat naar de stap waar je vandaan kwam, net als de terugknop van de browser (van je eigen pakket terug naar\n  // je top 3, van je gegevens terug naar je pakket). Zonder eerdere stap (gedeelde link, formulierfout) de logische\n  // vorige stap van de route.\n  function vorigeStap() {\n    if (geschiedenis.length > 1) return geschiedenis[geschiedenis.length - 2];\n    switch (st.stap) {\n      case 'gegevens': return st.route === 'doos' ? 'samenstellen' : 'voorstel';\n      case 'voorstel':\n        if (st.gedeeld) return 'start';\n        return st.route === 'zin' ? 'begrepen' : 'vraag5';\n      case 'samenstellen': return 'start';\n      default: return VORIGE[st.stap] || 'start';\n    }\n  }\n\n  const STAPNAAM = { start: 'het begin', begrepen: 'je zin', voorstel: 'je top 3', samenstellen: 'je eigen pakket', gegevens: 'je gegevens' };\n\n  function terugTekst() {\n    const v = vorigeStap();\n    return v.startsWith('vraag') ? 'Terug naar de vragen' : `Terug naar ${STAPNAAM[v] || 'de vorige stap'}`;\n  }\n\n  function terug() {\n    if (terugSinds && performance.now() - terugSinds < 3000) return;\n    const doel = vorigeStap();\n    meet('terug', { van: st.stap, naar: doel });\n    if (st.stap === 'samenstellen') st.gedeeldeDoos = null;\n    if (geschiedenis.length > 1) browserTerug();\n    else naar(doel);\n  }\n\n  // Herladen houdt de weg terug: staat de browser nog op dezelfde stap, dan neemt de app het bewaarde pad over (de\n  // eerdere stappen staan dan ook nog in de browsergeschiedenis).\n  function startGeschiedenis(pad) {\n    const herladen = !!(history.state && history.state.cuPs === st.stap);\n    try { history.replaceState({ ...(history.state || {}), cuPs: st.stap }, '', location.href); } catch (e) { /* zonder geschiedenis */ }\n    geschiedenis.length = 0;\n    const hersteld = herladen && Array.isArray(pad) && pad.length > 1 && pad[pad.length - 1] === st.stap;\n    if (hersteld) geschiedenis.push(...pad.slice(-30));\n    else geschiedenis.push(st.stap);\n    // Opnieuw tekenen, zodat de terugknop de juiste stap noemt (\"Terug naar je top 3\"); render bewaart ook het pad.\n    if (hersteld) render(false);\n    else bewaar();\n  }\n\n  function zetAantal(n) {\n    st.n = Math.max(1, Math.min(5000, Math.round(Number(n) || 1)));\n    // Het aantal uit de vragen of de zin loopt mee naar de samensteller, zolang er nog geen eigen doos is.\n    if (st.route !== 'doos' && !st.doos.length) { st.nDoos = st.n; st.nDoosAuto = false; }\n  }\n\n  async function bestel(knop) {\n    const lijst = voorstel(st);\n    const item = lijst[st.gekozen];\n    if (!item) return;\n    const p = item.p;\n    knop.setAttribute('aria-busy', 'true');\n    knop.disabled = true;\n    try {\n      const r = await fetch('/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ items: [{ id: p.variant.id, quantity: st.n }] })\n      });\n      const j = await r.json().catch(() => ({}));\n      if (!r.ok || j.status) throw new Error(r.status === 422 ? 'Zoveel kunnen we hiervan nu niet leveren.' : 'Toevoegen lukte niet.');\n      meet('in_winkelwagen', { handle: p.handle, aantal: st.n });\n      try {\n        const cart = await (await fetch('/cart.js', { headers: { Accept: 'application/json' } })).json();\n        const ps = window.theme && window.theme.pubsub;\n        if (ps && ps.publish && ps.PUB_SUB_EVENTS) ps.publish(ps.PUB_SUB_EVENTS.cartUpdate, { source: 'cu-pakket-samenstellen', cart });\n      } catch (e) { /* teller in de kop wordt bij het openen ververst */ }\n      const lade = document.querySelector('cart-drawer');\n      if (lade && !(window.theme && window.theme.settings && window.theme.settings.cartType === 'page')) {\n        document.dispatchEvent(new CustomEvent('cart:refresh', { bubbles: true, detail: { open: true } }));\n      } else {\n        window.location.href = '/cart';\n      }\n    } catch (err) {\n      const plek = app.querySelector('[data-cu-ps-gedeeld]');\n      const reden = err && /^(Zoveel|Toevoegen)/.test(err.message) ? err.message : 'Toevoegen lukte niet.';\n      if (plek) { plek.textContent = `${reden} Vraag gerust een offerte aan of bel ons: ${cfg.tel} (${cfg.telKeuze}).`; plek.hidden = false; }\n      zeg(`${reden} Bel ons gerust.`);\n    } finally {\n      knop.removeAttribute('aria-busy');\n      knop.disabled = false;\n    }\n  }\n\n  function deelLink() {\n    const lijst = voorstel(st);\n    const item = lijst[st.gekozen];\n    const u = new URL(location.origin + location.pathname);\n    if (item) u.searchParams.set('pakket', item.p.handle);\n    u.searchParams.set('n', String(st.n));\n    if (st.budget) u.searchParams.set('b', String(st.budget));\n    if (st.gelegenheid) u.searchParams.set('g', st.gelegenheid);\n    if (st.clubs.length) u.searchParams.set('c', st.clubs.join(','));\n    if (st.alcoholvrij) u.searchParams.set('av', '1');\n    return u.toString();\n  }\n\n  async function deel() {\n    await kopieer(deelLink(), app.querySelector('[data-cu-ps-gedeeld]'));\n    meet('deel', {});\n  }\n\n  function leesIngang() {\n    const q = new URLSearchParams(location.search);\n    const g = q.get('gelegenheid');\n    const b = Number(q.get('budget'));\n    let iets = false;\n    if (g) {\n      const gevonden = GELEGENHEDEN.find((x) => x.toLowerCase() === g.toLowerCase());\n      if (gevonden) { st.gelegenheid = gevonden; iets = true; }\n    }\n    if (budget(b)) { st.budget = b; st.doel = null; iets = true; }\n    if (!q.has('gelegenheid') && !q.has('budget') && !q.has('via')) return false;\n    if (iets) {\n      st.vooraf = { gelegenheid: st.gelegenheid, budget: st.budget };\n      st.stap = 'start';\n    }\n    try {\n      const schoon = new URL(location.href);\n      ['gelegenheid', 'budget', 'via'].forEach((k) => schoon.searchParams.delete(k));\n      history.replaceState(history.state, '', schoon.pathname + schoon.search + schoon.hash);\n    } catch (e) { /* adresbalk blijft dan zoals hij was */ }\n    return iets;\n  }\n\n  function leesGedeeld() {\n    const q = new URLSearchParams(location.search);\n    const handle = q.get('pakket');\n    const doos = q.get('doos');\n    if (!q.get('n') && !handle && !doos) return false;\n    if (doos) {\n      const pool = new Map(samenstelbaar().map((i) => [String(i.v.id), i]));\n      let weg = 0;\n      st.doos = [];\n      doos.split('_').forEach((stuk) => {\n        const [vid, n] = stuk.split('x');\n        const item = pool.get(vid);\n        if (!item) { if (vid) weg += 1; return; }\n        if (st.doos.some((i) => i.sleutel === item.sleutel)) return;\n        st.doos.push({ ...item, aantal: Math.max(1, Math.min(99, Math.round(Number(n) || 1))) });\n      });\n      st.nDoos = Math.max(1, Math.min(5000, Math.round(Number(q.get('nd')) || 25)));\n      st.nDoosAuto = !q.get('nd');\n      st.route = 'doos';\n      st.stap = 'samenstellen';\n      st.gedeeldeDoos = { weg };\n      meet('gedeelde_doos_geopend', { producten: st.doos.length, weg });\n    } else {\n      zetAantal(q.get('n') || 25);\n      const b = Number(q.get('b'));\n      if (budget(b)) st.budget = b;\n      if (q.get('g') !== null) {\n        const g = (q.get('g') || '').toLowerCase();\n        st.gelegenheid = GELEGENHEDEN.find((x) => x.toLowerCase() === g) || null;\n      }\n      st.clubs = (q.get('c') || '').split(',').filter((c) => CLUB[c]);\n      st.alcoholvrij = q.get('av') === '1';\n      st.gedeeld = handle;\n      st.stap = 'voorstel';\n      st.gekozen = 0;\n      st.gekozenId = null;\n      meet('gedeeld_geopend', {});\n    }\n    // De keuzes staan nu in de staat. Uit de adresbalk ermee, zodat terugkomen of herladen de laatste keuzes houdt.\n    try {\n      const schoon = new URL(location.href);\n      ['pakket', 'n', 'b', 'g', 'c', 'av', 'doos', 'nd', 'gelegenheid', 'budget', 'via'].forEach((k) => schoon.searchParams.delete(k));\n      history.replaceState(history.state, '', schoon.pathname + schoon.search + schoon.hash);\n    } catch (e) { /* adresbalk blijft dan zoals hij was */ }\n    return true;\n  }\n\n  function koppelActies() {\n    app.addEventListener('click', (e) => {\n      if (e.target.closest('[data-cu-ps-linkedin]')) { meet('sfeer_linkedin', { plek: 'overzicht' }); return; }\n      // Het startscherm staat er al voordat het assortiment binnen is: een klik wacht dan even en gaat daarna alsnog door.\n      if (!dataKlaar) {\n        const knop = e.target.closest('button[data-actie], button[data-kies]');\n        if (knop && !knop.disabled && dataBelofte) {\n          // Alleen de laatste klik telt; die gaat door zodra het assortiment er is.\n          if (wachtend && wachtend !== knop) wachtend.removeAttribute('aria-busy');\n          wachtend = knop;\n          knop.setAttribute('aria-busy', 'true');\n          zeg('Even geduld, het assortiment wordt geladen.');\n          if (!wachtHaak) {\n            wachtHaak = true;\n            dataBelofte.then(() => {\n              const k = wachtend;\n              wachtend = null;\n              if (k) { k.removeAttribute('aria-busy'); if (k.isConnected) k.click(); }\n            }, () => {});\n          }\n        }\n        return;\n      }\n      // Een dubbelklik of een snelle tweede klik mag niet meteen de volgende vraag beantwoorden.\n      if (performance.now() - laatsteStapwissel < 350) return;\n      const kies = e.target.closest('[data-kies]');\n      if (kies && kies.tagName === 'BUTTON') {\n        const w = kies.dataset.waarde;\n        switch (kies.dataset.kies) {\n          case 'voor': st.voor = w; naar(volgende('vraag1')); return;\n          case 'n': zetAantal(w); render(false); return;\n          case 'budget': st.budget = Number(w); st.doel = null; naar(volgende('vraag3')); return;\n          case 'gelegenheid': st.gelegenheid = w || null; naar(volgende('vraag4')); return;\n          case 'club': st.clubs = st.clubs.includes(w) ? st.clubs.filter((c) => c !== w) : st.clubs.concat(w); render(false); zeg(opties(teller(5))); return;\n          case 'optie': {\n            st.gekozen = Number(w);\n            st.gekozenId = null;\n            render(false);\n            naarSom();\n            return;\n          }\n          case 'soortfilter': st.soortFilter = w; st.pickerAantal = 24; render(false); chipInBeeld(`[data-kies=\"soortfilter\"][data-waarde=\"${attr(w)}\"]`); return;\n          case 'prijsfilter': st.prijsFilter = w; st.pickerAantal = 24; render(false); chipInBeeld(`[data-kies=\"prijsfilter\"][data-waarde=\"${attr(w)}\"]`); return;\n          default: return;\n        }\n      }\n      if (e.target.closest('[data-cu-ps-mail]')) meet('mail_doos', {});\n      const actie = e.target.closest('[data-actie]');\n      if (!actie || actie.disabled) return;\n      const w = actie.dataset.waarde;\n      switch (actie.dataset.actie) {\n        case 'begin': st.route = 'vragen'; st.gedeeld = null; meet('start', { route: 'vragen' }); naar('vraag1'); break;\n        case 'zin': {\n          const veld = app.querySelector('#cu-ps-zin');\n          st.zin = veld ? veld.value.trim() : '';\n          if (!st.zin) { if (veld) veld.focus(); break; }\n          const b = leesZin(st.zin);\n          // Een nieuwe zin is een nieuwe vraag: wat er niet in staat, gaat terug naar de standaard (ook een gedeeld voorstel).\n          const vers = nieuweStaat();\n          Object.assign(st, { voor: vers.voor, budget: vers.budget, doel: null, gelegenheid: vers.gelegenheid, clubs: vers.clubs, alcoholvrij: vers.alcoholvrij, gedeeld: null, vooraf: null }, b);\n          st.begrepen = b;\n          st.route = 'zin';\n          if (b.n) zetAantal(b.n);\n          meet('zin', { herkend: Object.keys(b) });\n          naar('begrepen');\n          break;\n        }\n        case 'samenstellen': {\n          const terugUitGegevens = st.stap === 'gegevens';\n          st.route = 'doos';\n          if (!st.nDoos) st.nDoos = st.n;\n          if (terugUitGegevens) gaTerugNaar('samenstellen');\n          else { meet('start', { route: 'doos' }); naar('samenstellen'); }\n          break;\n        }\n        case 'verder': if (VOLGENDE[st.stap]) naar(volgende(st.stap)); break;\n        case 'terug': terug(); break;\n        case 'naar-vraag1': st.gedeeld = null; st.vooraf = null; gaTerugNaar('vraag1'); break;\n        case 'naar-vraag3': gaTerugNaar('vraag3'); break;\n        case 'naar-start': st.gedeeldeDoos = null; gaTerugNaar('start'); break;\n        case 'voorstel': st.route = st.route === 'doos' ? 'vragen' : st.route; if (st.stap === 'gegevens') gaTerugNaar('voorstel'); else naar('voorstel'); break;\n        case 'min': zetAantal(st.n - 1); render(false); break;\n        case 'plus': zetAantal(st.n + 1); render(false); break;\n        case 'meer': st.toonMeer = true; render(false); herstelFocus('[data-kies=\"optie\"][data-waarde=\"3\"]'); break;\n        case 'bestel': bestel(actie); break;\n        case 'offerte': {\n          const item = voorstel(st)[st.gekozen];\n          st.offerteProduct = item ? item.p : null;\n          st.route = 'offerte';\n          meet('offerte_start', {});\n          naar('gegevens');\n          break;\n        }\n        case 'deel': deel(); break;\n        case 'verras': {\n          // Lege doos: drie verrassingen. Gevulde doos: er komt er \u00E9\u00E9n bij, de rest blijft staan.\n          if (!st.doos.length) st.doos = verras();\n          else {\n            const nieuw = verras().find((i) => !st.doos.some((d) => d.sleutel === i.sleutel));\n            if (nieuw) { st.doos = st.doos.concat(nieuw); melding(`${nieuw.naam} zit in de doos \u00B7 ${doosStand()}`); }\n          }\n          meet('verras', {});\n          render(false);\n          break;\n        }\n        case 'aantal': {\n          zetAantal(w);\n          render(false);\n          if (!herstelFocus('[data-actie=\"bestel\"]:not([disabled])')) {\n            const knop = app.querySelector('.cu-ps__som .cu-ps__knoppen .button');\n            if (knop) knop.focus({ preventScroll: true });\n          }\n          break;\n        }\n        case 'erbij': {\n          const voor = actie.getBoundingClientRect().top;\n          voegToe(w);\n          const na = app.querySelector(`[data-actie=\"erbij\"][data-waarde=\"${attr(w)}\"]`);\n          if (na) {\n            const verschil = na.getBoundingClientRect().top - voor;\n            if (Math.abs(verschil) > 1) window.scrollBy(0, verschil);\n          }\n          herstelFocus(`[data-actie=\"erbij\"][data-waarde=\"${attr(w)}\"]`);\n          break;\n        }\n        case 'plus1': {\n          const item = st.doos.find((i) => i.sleutel === w);\n          if (item) item.aantal = Math.min(99, item.aantal + 1);\n          st.laatsteWijziging = w;\n          render(false);\n          herstelFocus(`[data-actie=\"plus1\"][data-waarde=\"${attr(w)}\"]`);\n          break;\n        }\n        case 'min1': {\n          const item = st.doos.find((i) => i.sleutel === w);\n          if (item) {\n            item.aantal -= 1;\n            if (item.aantal < 1) st.doos = st.doos.filter((i) => i !== item);\n          }\n          render(false);\n          if (!herstelFocus(`[data-actie=\"min1\"][data-waarde=\"${attr(w)}\"]`)) herstelFocus('[data-actie=\"verras\"]');\n          break;\n        }\n        case 'weg': st.doos = st.doos.filter((i) => i.sleutel !== w); render(false); break;\n        case 'zoom': openVenster(w); break;\n        case 'naar-picker': {\n          const doel = app.querySelector('#cu-ps-picker');\n          if (doel) doel.scrollIntoView({ behavior: 'smooth', block: 'start' });\n          break;\n        }\n        case 'deel-doos': kopieer(deelDoosLink(), app.querySelector('[data-cu-ps-doos-gedeeld]')); meet('deel_doos', {}); break;\n        case 'pdf-doos': bewaarPdf(); break;\n        case 'sfeer-ander': if (st.sfeer && (st.sfeer.variant || 0) < 2) { meet('sfeer_ander', { variant: (st.sfeer.variant || 0) + 1 }); startSfeer((st.sfeer.variant || 0) + 1); } break;\n        case 'sfeer-opnieuw': startSfeer(st.sfeer ? st.sfeer.variant || 0 : 0, Date.now().toString(36)); break;\n        case 'dmin': st.nDoosAuto = false; st.nDoos = Math.max(1, (st.nDoos || 1) - 1); render(false); break;\n        case 'dplus': st.nDoosAuto = false; st.nDoos = Math.min(5000, (st.nDoos || 1) + 1); render(false); break;\n        case 'zet-min': st.nDoosAuto = true; meet('zet_minimum', { aantal: doosTotalen().n }); render(false); break;\n        case 'meer-producten': {\n          const eerderZichtbaar = st.pickerAantal;\n          st.pickerAantal += 24;\n          render(false);\n          const eerste = app.querySelectorAll('[data-actie=\"erbij\"]')[eerderZichtbaar];\n          if (eerste) eerste.focus({ preventScroll: true });\n          break;\n        }\n        case 'naar-gegevens-doos': st.route = 'doos'; st.gedeeldeDoos = null; naar('gegevens'); confetti(false); meet('samengesteld', { producten: st.doos.length, aantal: doosTotalen().n }); break;\n        default: break;\n      }\n    });\n    app.addEventListener('toggle', (e) => {\n      if (e.target.matches && e.target.matches('[data-cu-ps-berekening]')) { st.berekening = e.target.open; bewaar(); }\n    }, true);\n    app.addEventListener('change', (e) => {\n      if (e.target.matches('[data-kies=\"alcoholvrij\"]')) { st.alcoholvrij = e.target.checked; render(false); zeg(opties(teller(5))); }\n      if (e.target.id === 'cu-ps-aantal') { zetAantal(e.target.value); werkVraag2Bij(); bewaar(); }\n      if (e.target.id === 'cu-ps-ndoos') { st.nDoosAuto = false; st.nDoos = Math.max(1, Math.min(5000, Math.round(Number(e.target.value) || 1))); werkDoosSomBij(); bewaar(); }\n      if (e.target.id === 'cu-ps-sorteer') { st.sortering = e.target.value; st.pickerAantal = 24; render(false); herstelFocus('#cu-ps-sorteer'); }\n    });\n    let zoekTimer = null;\n    app.addEventListener('input', (e) => {\n      if (e.target.id === 'cu-ps-aantal' && e.target.value !== '') { zetAantal(e.target.value); werkVraag2Bij(); }\n      if (e.target.id === 'cu-ps-ndoos' && e.target.value !== '') { st.nDoosAuto = false; st.nDoos = Math.max(1, Math.min(5000, Math.round(Number(e.target.value) || 1))); werkDoosSomBij(); }\n      if (e.target.id === 'cu-ps-zoek') {\n        clearTimeout(zoekTimer);\n        const waarde = e.target.value;\n        // Alleen de productlijst en de tellers bijwerken; het zoekveld blijft staan (geen knipperend toetsenbord op mobiel).\n        zoekTimer = setTimeout(() => {\n          st.zoek = waarde;\n          st.pickerAantal = 24;\n          const { lijst, perBand, perSoort } = pickerLijst(samenstelbaar());\n          const plek = app.querySelector('[data-cu-ps-lijst]');\n          if (plek) plek.innerHTML = productenHTML();\n          const tel = app.querySelector('[data-cu-ps-telling]');\n          const woorden = `${lijst.length} ${lijst.length === 1 ? 'product' : 'producten'}`;\n          if (tel) tel.textContent = woorden;\n          app.querySelectorAll('[data-kies=\"prijsfilter\"]').forEach((b) => {\n            const w = b.dataset.waarde;\n            if (!w) return;\n            const span = b.querySelector('span');\n            if (span) span.textContent = String(perBand[w] || 0);\n            b.disabled = !perBand[w] && st.prijsFilter !== w;\n          });\n          app.querySelectorAll('[data-kies=\"soortfilter\"]').forEach((b) => {\n            const w = b.dataset.waarde;\n            const span = b.querySelector('span');\n            if (span) span.textContent = String(perSoort[w] || 0);\n            if (w) b.disabled = !perSoort[w] && st.soortFilter !== w;\n          });\n          bewaar();\n          zeg(woorden);\n        }, 250);\n      }\n    });\n    window.addEventListener('popstate', (e) => {\n      terugSinds = 0;\n      const stap = e.state && e.state.cuPs;\n      if (!stap || !app || app.hidden || !producten.length) return;\n      const i = geschiedenis.lastIndexOf(stap);\n      if (i >= 0) geschiedenis.length = i + 1; else geschiedenis.push(stap);\n      if (venster && venster.open) venster.close();\n      naar(stap, { vanPop: true });\n    });\n    root.addEventListener('click', (e) => {\n      if (!e.target.closest('[data-cu-ps-naar-doos]')) return;\n      const doos = app.querySelector('.cu-ps__doos');\n      if (doos) doos.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      const m = root.querySelector('[data-cu-ps-melding]');\n      if (m) m.classList.remove('is-zichtbaar');\n    });\n    app.addEventListener('keydown', (e) => {\n      if (e.key === 'Enter' && e.target.id === 'cu-ps-zin' && !e.shiftKey) {\n        e.preventDefault();\n        app.querySelector('[data-actie=\"zin\"]')?.click();\n      }\n    });\n  }\n\n  /* ---------- aftelklok ---------- */\n\n  function aftelklok() {\n    const el = root.querySelector('[data-cu-ps-aftel]');\n    if (!el || !cfg.deadline) return;\n    const nu = new Date();\n    const grens = new Date(`${cfg.deadline}T23:59:59+01:00`);\n    if (Number.isNaN(grens.getTime())) return;\n    const dagen = Math.ceil((grens - nu) / 86400000) - 1;\n    const kerst = new Date(`${grens.getFullYear()}-12-25T00:00:00+01:00`);\n    if (dagen >= 1 && dagen <= 80) {\n      el.innerHTML = `<strong>Nog ${dagen} ${dagen === 1 ? 'dag' : 'dagen'}</strong> <span>om te bestellen voor levering v\u00F3\u00F3r kerst. Uiterlijk ${esc(datumTekst(cfg.deadline))}.</span>`;\n      el.hidden = false;\n    } else if (dagen === 0) {\n      el.innerHTML = '<strong>Vandaag</strong> <span>is de laatste dag om te bestellen voor levering v\u00F3\u00F3r kerst.</span>';\n      el.hidden = false;\n    } else if (dagen < 0 && nu < kerst) {\n      el.innerHTML = '<strong>Levering v\u00F3\u00F3r kerst</strong> <span>gaat nu in overleg. Bel ons gerust.</span>';\n      el.hidden = false;\n    }\n  }\n\n  /* ---------- start ---------- */\n\n  async function start() {\n    aftelklok();\n    if (!app || cfg.aan === false) return;\n    if (toonBevestiging()) return;\n    koppelFormulier();\n    koppelActies();\n    // Live-regio's vooraf in de pagina, zodat de eerste melding ook wordt voorgelezen.\n    zeg('');\n    meldingEl();\n    dataBelofte = laadData().then((lijst) => { producten = lijst; dataKlaar = true; return lijst; });\n    const q = new URLSearchParams(location.search);\n    const fout = root.querySelector('[data-cu-ps-formfout]');\n    const eerder = lees(OPSLAG);\n    const eerderPad = eerder && eerder.pad;\n    // Gewoon bezoek (geen gedeelde link, geen formulierfout, geen eerdere stap of doos): het startscherm heeft het\n    // assortiment nog niet nodig, dus dat staat er meteen terwijl de data op de achtergrond binnenkomt.\n    const snel = !fout && !q.has('pakket') && !q.has('doos') && !q.get('n')\n      && (!eerder || (eerder.stap === 'start' && !(eerder.doos || []).length && !eerder.offerteProduct));\n    if (snel) {\n      const viaSnel = q.get('via');\n      if (eerder) herstel(eerder);\n      leesIngang();\n      if (viaSnel) st.via = viaSnel.replace(/[^\\w-]/g, '').slice(0, 40);\n      meet('geopend', { gedeeld: false });\n      render(false);\n      startGeschiedenis(eerderPad);\n    }\n    try {\n      await dataBelofte;\n    } catch (err) {\n      app.innerHTML = `<div class=\"cu-ps__fallback\"><p>Het assortiment kon niet worden geladen. Kijk direct bij <a href=\"${esc(cfg.kerstUrl)}\">alle kerstpakketten</a>, of bel ons: <a href=\"tel:${esc(cfg.telHref)}\">${esc(cfg.tel)}</a> (${esc(cfg.telKeuze)}).</p></div>`;\n      return;\n    }\n    if (snel) return;\n    if (fout && herstel(lees(OPSLAG))) {\n      st.stap = 'gegevens';\n      render(false);\n      vulVelden(lees('cu-ps-velden'));\n      startGeschiedenis(eerderPad);\n      fout.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      return;\n    }\n    const via = new URLSearchParams(location.search).get('via');\n    const gedeeld = leesGedeeld();\n    if (!gedeeld) {\n      const opgeslagen = lees(OPSLAG);\n      if (opgeslagen && opgeslagen.stap) herstel(opgeslagen);\n      leesIngang();\n    }\n    if (via) st.via = via.replace(/[^\\w-]/g, '').slice(0, 40);\n    meet('geopend', { gedeeld: !!gedeeld });\n    render(false);\n    // Knop Particulier | Zakelijk in de kop: bedragen opnieuw tekenen. Niet op de stap met het formulier, want daar\n    // zou opnieuw tekenen ingevulde velden kunnen wissen; die stap toont de bedragen bij de volgende stap goed.\n    document.addEventListener('cu:btw', () => { if (st.stap !== 'gegevens') render(false); });\n    startGeschiedenis(eerderPad);\n    if (gedeeld) scrollNaarApp();\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start);\n  else start();\n})();\n"],
  "mappings": "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",
  "names": ["voegToe", "opties", "bestel", "pakketten", "kop", "teller", "el", "w"]
}
