{
  "version": 3,
  "sources": ["/cdn/shop/t/11/assets/dehde-contract-quote.js?nocache=1790761801"],
  "sourcesContent": ["/*\n * Dehde \u2013 quote request panel <dehde-quote> (markup: snippets/dehde-contract-quote-panel.liquid, which documents\n * the public interface: field names, markup hooks, the API below and the page URLs that pre-fill the panel).\n *\n * What it does\n *  - One Shopify contact form in steps: 3 inline (Cosa ti serve \u2192 Quante \u2192 Come ti contattiamo), 2 in the popup\n *    (La tua richiesta \u2192 Come ti contattiamo, data-mode=\"popup\"). The step count is read from the markup\n *    ([data-q-step]); the last step is always the contact step. Without JS every step is stacked and the form\n *    posts as is; with JS one step shows at a time, with a step indicator (tabs \u2265768px, \"Passo 1 di N\" below).\n *  - Products of the request (\"lines\"): seeded by the server (PDP popup, cart popup), loaded on /pages/contract from\n *    ?da=carrello (/cart.js) or ?prodotto=<handle>&variante=<id>&quantita=<n> (/products/<handle>.js), or picked\n *    from the product search ([data-q-picker], Shopify predictive search, ARIA 1.2 combobox). Inline, a seeded or\n *    URL-loaded request opens on step 2; products picked from the search never move the step (people add several).\n *  - Each line: quantity stepper, quick chips 10 \u00B7 20 \u00B7 40 \u00B7 80 (lines only), and for a picked product with\n *    several variants an optional variant select (first option \"da definire\").\n *  - Popup (inside the theme's <modal-component>): the theme gives Esc, scroll lock (body.overflow-hidden) and\n *    focus back to the opener; its focus trap is computed once at open and counts hidden steps, so the panel adds\n *    its own Tab wrap over the controls that are visible now. Esc inside the search closes the result list first\n *    and does not reach the modal.\n *  - Before the POST it writes contact[Prodotti] / contact[Cosa ti serve] from the panel, validates the two\n *    required fields + privacy, and stores a short summary in sessionStorage so the \"Richiesta ricevuta\" box\n *    can repeat it after Shopify's reload (?contact_posted=true). Nothing else is stored.\n *  - Sending (see \"submit\" below): the form is posted with fetch() (same fields, same /contact endpoint, after\n *    Shopify's hCaptcha has added its token) and the \"Richiesta ricevuta\" box replaces the steps in place, with a\n *    short fade \u2014 no page reload, no jump to the top and back. Shopify's native POST + reload stays as the fallback\n *    (captcha challenge, network error, unrecognised answer), so a request is never lost.\n *  - Every wa.me link inside the panel carries the same request as text (\"40 \u00D7 Souvenir 550 \u2013 Rosso (Pedrali)\u2026\").\n *  - Measurement: preventivo_passo_1..3 (first time each step shows), generate_lead (on the confirmation),\n *    whatsapp_click {posizione}. Pushed to window.dataLayer when present and published as Shopify custom events\n *    (Shopify.analytics.publish) when available; silently skipped otherwise.\n *\n * API on the element: addItems(items) \u00B7 setItems(items) \u00B7 message() \u00B7 waUrl() \u00B7 goStep(n)\n * Events (bubble): 'dehde-quote:change' {items, waUrl, sent} \u00B7 'dehde-quote:step' {step}\n */\n(function () {\n  if (window.customElements && customElements.get('dehde-quote')) return;\n\n  var EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n  var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  function track(name, params) {\n    try {\n      if (Array.isArray(window.dataLayer)) window.dataLayer.push(Object.assign({ event: name }, params || {}));\n      if (window.Shopify && Shopify.analytics && typeof Shopify.analytics.publish === 'function') {\n        Shopify.analytics.publish(name, params || {});\n      }\n    } catch (e) { /* measurement never blocks the request */ }\n  }\n  window.DehdeQuoteTrack = window.DehdeQuoteTrack || track;\n\n  function store(key, value) {\n    try {\n      if (value === undefined) return JSON.parse(window.sessionStorage.getItem(key) || 'null');\n      if (value === null) window.sessionStorage.removeItem(key);\n      else window.sessionStorage.setItem(key, JSON.stringify(value));\n    } catch (e) { return null; }\n    return null;\n  }\n\n  function clean(text) { return String(text || '').replace(/\\s+/g, ' ').trim(); }\n  function stop(text) { return /[.!?\u2026]$/.test(text) ? text : text + '.'; }\n  function money(cents) {\n    if (cents == null || cents === '') return '';\n    var out = '';\n    try {\n      if (window.Shopify && typeof Shopify.formatMoney === 'function') out = Shopify.formatMoney(cents, window.money_format);\n    } catch (e) { out = ''; }\n    if (!out) out = '\u20AC' + (Number(cents) / 100).toFixed(2).replace('.', ',');\n    // money_format may carry markup (<span class=money>); DOMParser never executes it\n    return new DOMParser().parseFromString(out, 'text/html').body.textContent || '';\n  }\n  function sized(src, width) {\n    if (!src) return '';\n    try {\n      var url = new URL(src, window.location.href);\n      url.searchParams.set('width', String(width));\n      return url.toString();\n    } catch (e) { return src; }\n  }\n  function toInt(value, fallback) {\n    var n = parseInt(value, 10);\n    if (isNaN(n) || n < 1) return fallback;\n    return Math.min(n, 9999);\n  }\n  function routeRoot() {\n    return (window.Shopify && Shopify.routes && Shopify.routes.root) || '/';\n  }\n  function handleOf(url) {\n    var m = /\\/products\\/([^/?#]+)/.exec(url || '');\n    return m ? decodeURIComponent(m[1]).toLowerCase() : '';\n  }\n  function isShown(el) {\n    return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n  }\n  var FOCUSABLE = 'a[href], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled]), select:not([disabled]), ' +\n    'textarea:not([disabled]), summary, iframe, [tabindex]:not([tabindex^=\"-\"])';\n\n  class DehdeQuote extends HTMLElement {\n    connectedCallback() {\n      // The popup (<modal-component data-container=\"body\">) moves this element to <body> and back: initialise once.\n      if (this._ready) return;\n      this._ready = true;\n      this.form = this.querySelector('form');\n      this.uid = this.dataset.uid || 'dehde-quote';\n      this.key = 'dehde-quote:' + this.uid;\n      this.popup = this.dataset.mode === 'popup';\n      this.items = [];\n      this.step = 1;\n      this.seen = {};\n      this.origin = this.dataset.origin || '';\n      this.originParam = { page: 'menu', collection: 'collezione', product: 'scheda', cart: 'carrello' }[this.dataset.source] || 'menu';\n\n      this.sentBox = this.querySelector('[data-q-sent]');\n      if (this.sentBox) { this.initSent(); return; }\n      if (!this.form) return;\n      this.initFlow();\n    }\n\n    /* ---------- confirmation after Shopify's reload ---------- */\n    initSent() {\n      var saved = store(this.key);\n      var list = this.querySelector('[data-q-summary]');\n      // The inline script in the snippet normally filled the rows already (before first paint): never twice.\n      if (saved && list && !list.children.length && saved.rows && saved.rows.length) {\n        saved.rows.forEach(function (row) {\n          var li = document.createElement('li');\n          li.textContent = row;\n          list.appendChild(li);\n        });\n        list.hidden = false;\n      }\n      if (saved) {\n        track('generate_lead', { origine: saved.origine || this.originParam, prodotti: saved.count || 0 });\n        store(this.key, null);\n      }\n      this.emit({ sent: true });\n    }\n\n    /* ---------- the steps ---------- */\n    initFlow() {\n      var self = this;\n      this.classList.add('is-ready');\n      this.form.noValidate = true; // our messages; native bubbles cannot reach fields in hidden steps\n      this.total = this.qa('[data-q-step]').length || 1;\n      this.q('[data-q-tabs]').hidden = false;\n      this.q('[data-q-progress]').hidden = false;\n\n      // Raw category fields are summarised in contact[Cosa ti serve] (no-JS keeps them named)\n      this.qa('[data-q-cat], [data-q-cat-qty]').forEach(function (input) {\n        input.dataset.name = input.name;\n        input.removeAttribute('name');\n      });\n\n      this.productsField = this.q('[data-q-products]');\n      this.needsField = this.q('[data-q-needs]');\n      this.legacyLabel = this.q('[data-dehde-quote-product-input]');\n      this.legacyUrl = this.q('[data-dehde-quote-url-input]');\n\n      var seed = this.q('script[data-q-seed]');\n      if (seed) {\n        try {\n          var data = JSON.parse(seed.textContent);\n          this.variants = data.variants || [];\n          (data.items || []).forEach(function (it, i) {\n            self.items.push(self.norm(it, data.legacy && i === 0));\n          });\n        } catch (e) { /* bad seed: the category flow still works */ }\n      }\n\n      var hadError = !!this.q('[data-q-error]');\n      if (hadError) this.restore();\n\n      this.addEventListener('click', this.onClick.bind(this));\n      this.addEventListener('input', this.onInput.bind(this));\n      this.addEventListener('change', this.onInput.bind(this));\n      this.addEventListener('keydown', this.onKey.bind(this));\n      this.addEventListener('keyup', function (e) {\n        // Esc already used by the search (close the list / clear the field): the popup must not close on it\n        if (e.key === 'Escape' && self._eatEsc) { self._eatEsc = false; e.stopPropagation(); }\n      });\n      this.addEventListener('focusout', function (e) {\n        if (e.target.matches && e.target.matches('.dehde-q_qty input')) self.setQty(e.target, e.target.value);\n        if (e.target.matches && e.target.matches('[data-q-f]')) self.onBlur(e.target); // UI v2: inline error on blur\n      });\n      this.form.addEventListener('submit', this.onSubmit.bind(this));\n      this.hookSubmit();\n      this.watchLegacy();\n      this.initPicker();\n      this.initModal();\n\n      this.step = hadError ? this.total : (!this.popup && this.items.length ? 2 : 1);\n      this.render();\n      if (hadError) {\n        var alert = this.q('[data-q-error]');\n        if (alert) alert.focus();\n      }\n\n      if (this.dataset.source === 'page' && !hadError) this.fromUrl();\n    }\n\n    /* ?da=carrello \u00B7 ?prodotto=<handle>&variante=<id>&quantita=<n> (JS only: Liquid cannot read the query) */\n    fromUrl() {\n      var self = this;\n      var params = new URLSearchParams(window.location.search);\n      var handle = params.get('prodotto');\n      if (params.get('da') === 'carrello') {\n        fetch('/cart.js', { headers: { Accept: 'application/json' } })\n          .then(function (r) { return r.ok ? r.json() : null; })\n          .then(function (cart) {\n            if (!cart || !cart.items || !cart.items.length) return;\n            self.addItems(cart.items.map(function (it) {\n              var single = it.product_has_only_default_variant;\n              return {\n                title: it.product_title, vendor: it.vendor, variant: single ? '' : it.variant_title,\n                url: window.location.origin + it.url, image: it.image, price: it.final_price, qty: it.quantity\n              };\n            }), 'dal carrello', 'carrello');\n          })\n          .catch(function () { /* stays on the category flow */ });\n      } else if (handle && /^[a-z0-9-]+$/i.test(handle)) {\n        fetch('/products/' + encodeURIComponent(handle) + '.js', { headers: { Accept: 'application/json' } })\n          .then(function (r) { return r.ok ? r.json() : null; })\n          .then(function (p) {\n            if (!p || !p.variants) return;\n            var wanted = params.get('variante');\n            var v = p.variants.filter(function (x) { return String(x.id) === wanted; })[0] ||\n              p.variants.filter(function (x) { return x.available; })[0] || p.variants[0];\n            var single = p.variants.length === 1 && /^default/i.test(v.title || '');\n            var img = (v.featured_image && v.featured_image.src) || p.featured_image || '';\n            self.addItems([{\n              title: p.title, vendor: p.vendor, variant: single ? '' : v.title,\n              url: window.location.origin + '/products/' + p.handle + '?variant=' + v.id,\n              image: img, price: v.price, qty: toInt(params.get('quantita'), 1)\n            }], 'dalla scheda', 'scheda');\n          })\n          .catch(function () { /* 404 or offline: stays on the category flow */ });\n      }\n    }\n\n    norm(it, legacy) {\n      return {\n        title: clean(it.title), vendor: clean(it.vendor), variant: clean(it.variant),\n        url: it.url || '', image: it.image ? sized(it.image, 176) : '', price: it.price,\n        qty: toInt(it.qty, 1), legacy: !!legacy\n      };\n    }\n\n    /* Public: attach products. Inline: step 1 done \u2192 step 2 (URL flows). The popup keeps its step. */\n    addItems(items, fromLabel, originParam) {\n      var self = this;\n      (items || []).forEach(function (it) { self.items.push(self.norm(it, false)); });\n      if (fromLabel) {\n        this.fromLabel = fromLabel;\n        this.origin = (this.dataset.origin || 'Pagina Contract') + ' \u2013 ' + fromLabel;\n      }\n      if (originParam) this.originParam = originParam;\n      if (!this.popup && this.items.length && this.step === 1) this.step = 2;\n      this.render();\n    }\n\n    /* Public: replace the products (cart popup: the live /cart.js lines on every open). Keeps the step. */\n    setItems(items) {\n      var self = this;\n      this.items = (items || []).map(function (it) { return self.norm(it, false); });\n      if (!this.form) return;\n      if (!this.items.length && !this.popup) this.step = 1;\n      this.render();\n    }\n\n    /* PDP: dehde-pdp.js rewrites the legacy inputs and the visible label on variant change. */\n    watchLegacy() {\n      var self = this;\n      if (!this.legacyLabel) return;\n      var dialog = this.closest('[role=\"dialog\"]') || document;\n      var shown = dialog.querySelector('[data-dehde-quote-product]');\n      if (!shown || !window.MutationObserver) return;\n      new MutationObserver(function () { self.syncLegacy(); self.render(); })\n        .observe(shown, { childList: true, characterData: true, subtree: true });\n    }\n    syncLegacy() {\n      var item = this.items.filter(function (i) { return i.legacy; })[0];\n      if (!item || !this.legacyUrl) return;\n      var match = /[?&]variant=(\\d+)/.exec(this.legacyUrl.value || '');\n      var v = match && (this.variants || []).filter(function (x) { return String(x.id) === match[1]; })[0];\n      if (v) {\n        item.variant = clean(v.title);\n        item.price = v.price;\n        if (v.image) item.image = sized(v.image, 176);\n      }\n      item.url = this.legacyUrl.value || item.url;\n    }\n\n    /* ---------- popup: Tab wrap over the controls visible now ----------\n     * The theme's trapFocus() (assets/global.js) stores first/last focusable once, at open, hidden steps included:\n     * from the real last visible control Tab would leave the dialog. This handler runs on the <modal-component>\n     * before the theme's document listener and stops it at the two edges. */\n    initModal() {\n      var modal = this.closest('modal-component');\n      if (!modal || modal._dehdeTrap) return;\n      modal._dehdeTrap = true;\n      modal.addEventListener('keydown', function (e) {\n        if (e.key !== 'Tab') return;\n        var dialog = modal.querySelector('[role=\"dialog\"]');\n        if (!modal.classList.contains('modal--active') || !dialog) return;\n        var box = dialog.querySelector('.modal-component_body') || dialog;\n        var els = Array.prototype.filter.call(box.querySelectorAll(FOCUSABLE), isShown);\n        if (!els.length) return;\n        var first = els[0], last = els[els.length - 1], a = document.activeElement;\n        var inside = box.contains(a);\n        if (e.shiftKey && (a === first || !inside)) {\n          e.preventDefault(); e.stopPropagation(); last.focus();\n        } else if (!e.shiftKey && (a === last || !inside)) {\n          e.preventDefault(); e.stopPropagation(); first.focus();\n        }\n      });\n    }\n\n    /* ---------- product search (combobox) ---------- */\n    initPicker() {\n      var self = this;\n      this.search = this.q('[data-q-search]');\n      if (!this.search) return;\n      this.results = this.q('[data-q-results]');\n      this.searchStatus = this.q('[data-q-search-status]');\n      this.found = [];\n      this.active = -1;\n      this.search.addEventListener('input', function () {\n        window.clearTimeout(self.searchTimer);\n        var text = clean(self.search.value);\n        if (text.length < 2) {\n          if (self.ctrl) self.ctrl.abort();\n          self.closeList();\n          self.status('');\n          return;\n        }\n        self.searchTimer = window.setTimeout(function () { self.lookup(text); }, 250);\n      });\n      this.search.addEventListener('keydown', this.onSearchKey.bind(this));\n      this.search.addEventListener('focus', function () {\n        if (self.found.length && clean(self.search.value).length >= 2) self.openList();\n      });\n      this.search.addEventListener('blur', function () {\n        // a tap on a result keeps the focus in the field (mousedown below), so this is a real \"leave\"\n        window.setTimeout(function () {\n          if (document.activeElement !== self.search) self.closeList();\n        }, 150);\n      });\n      this.results.addEventListener('mousedown', function (e) { e.preventDefault(); });\n      this.results.addEventListener('click', function (e) {\n        var li = e.target.closest && e.target.closest('[role=\"option\"]');\n        if (li) self.pick(+li.dataset.i);\n      });\n    }\n\n    lookup(text) {\n      var self = this;\n      if (this.ctrl) this.ctrl.abort();\n      this.ctrl = window.AbortController ? new AbortController() : null;\n      var url = routeRoot() + 'search/suggest.json?q=' + encodeURIComponent(text) +\n        '&resources%5Btype%5D=product&resources%5Blimit%5D=6&resources%5Boptions%5D%5Bunavailable_products%5D=last';\n      this.search.setAttribute('aria-busy', 'true');\n      fetch(url, { headers: { Accept: 'application/json' }, signal: this.ctrl ? this.ctrl.signal : undefined })\n        .then(function (r) { if (!r.ok) throw new Error('suggest ' + r.status); return r.json(); })\n        .then(function (d) {\n          var list = (((d || {}).resources || {}).results || {}).products || [];\n          self.found = list.map(function (p) {\n            var min = parseFloat(p.price_min || p.price), max = parseFloat(p.price_max || p.price);\n            return {\n              title: clean(p.title), vendor: clean(p.vendor), handle: String(p.handle || '').toLowerCase(),\n              url: window.location.origin + '/products/' + p.handle, // no _pos/_psq tracking in the e-mail\n              image: p.image || (p.featured_image && p.featured_image.url) || '',\n              price: isNaN(min) ? null : Math.round(min * 100), from: !isNaN(max) && max > min\n            };\n          });\n          self.drawResults(text, false);\n        })\n        .catch(function (err) {\n          if (err && err.name === 'AbortError') return;\n          self.found = [];\n          self.drawResults(text, true);\n        })\n        .then(function () { self.search.removeAttribute('aria-busy'); });\n    }\n\n    status(text) {\n      if (!this.searchStatus) return;\n      this.searchStatus.textContent = text;\n      this.searchStatus.hidden = !text;\n    }\n\n    isAdded(p) {\n      return this.items.some(function (it) { return (it.handle || handleOf(it.url)) === p.handle; });\n    }\n\n    drawResults(text, failed) {\n      var self = this;\n      this.results.textContent = '';\n      this.setActive(-1);\n      if (!this.found.length) {\n        this.closeList();\n        this.status(failed\n          ? 'Ricerca non disponibile ora. Scrivi il modello nelle note.'\n          : 'Nessun prodotto per \u00AB' + text + '\u00BB. Scrivilo nelle note: lo cerchiamo noi.');\n        return;\n      }\n      this.status(this.found.length === 1 ? '1 prodotto trovato' : this.found.length + ' prodotti trovati');\n      this.found.forEach(function (p, i) {\n        var li = document.createElement('li');\n        li.className = 'dehde-q_opt';\n        li.id = self.uid + '-opt-' + i;\n        li.setAttribute('role', 'option');\n        li.setAttribute('aria-selected', 'false');\n        li.dataset.i = i;\n        var media = document.createElement('span');\n        media.className = 'dehde-q_opt-media';\n        if (p.image) {\n          var img = document.createElement('img');\n          img.src = sized(p.image, 120);\n          img.alt = '';\n          img.width = 56; img.height = 56;\n          img.loading = 'lazy';\n          media.appendChild(img);\n        }\n        var body = document.createElement('span');\n        body.className = 'dehde-q_opt-body';\n        var vendor = document.createElement('span');\n        vendor.className = 'dehde-q_vendor';\n        vendor.textContent = p.vendor;\n        var name = document.createElement('span');\n        name.className = 'dehde-q_opt-name';\n        name.textContent = p.title;\n        var price = document.createElement('span');\n        price.className = 'dehde-q_opt-price';\n        price.textContent = p.price == null ? '' : (p.from ? 'da ' : '') + money(p.price);\n        body.appendChild(vendor); body.appendChild(name); body.appendChild(price);\n        var state = document.createElement('span');\n        state.className = 'dehde-q_opt-state';\n        media.setAttribute('aria-hidden', 'true');\n        li.appendChild(media); li.appendChild(body); li.appendChild(state);\n        self.markOption(li, self.isAdded(p));\n        self.results.appendChild(li);\n      });\n      this.openList();\n    }\n\n    markOption(li, added) {\n      li.dataset.added = added ? 'true' : 'false';\n      var state = li.querySelector('.dehde-q_opt-state');\n      if (state) state.textContent = added ? 'Aggiunto' : 'Aggiungi';\n    }\n\n    openList() {\n      if (!this.results || !this.results.children.length) return;\n      this.results.hidden = false;\n      this.search.setAttribute('aria-expanded', 'true');\n    }\n    closeList() {\n      if (!this.results) return;\n      this.results.hidden = true;\n      this.search.setAttribute('aria-expanded', 'false');\n      this.setActive(-1);\n    }\n    setActive(i) {\n      this.active = i;\n      var active = null;\n      Array.prototype.forEach.call(this.results.children, function (li, n) {\n        var on = n === i;\n        li.setAttribute('aria-selected', on ? 'true' : 'false');\n        li.classList.toggle('is-active', on);\n        if (on) active = li;\n      });\n      if (active) {\n        this.search.setAttribute('aria-activedescendant', active.id);\n        active.scrollIntoView({ block: 'nearest' });\n      } else {\n        this.search.removeAttribute('aria-activedescendant');\n      }\n    }\n\n    onSearchKey(e) {\n      var n = this.found.length, open = !this.results.hidden;\n      switch (e.key) {\n        case 'ArrowDown':\n          if (!n) return;\n          e.preventDefault();\n          if (!open) this.openList();\n          this.setActive(this.active + 1 >= n ? 0 : this.active + 1);\n          break;\n        case 'ArrowUp':\n          if (!n) return;\n          e.preventDefault();\n          if (!open) this.openList();\n          this.setActive(this.active <= 0 ? n - 1 : this.active - 1);\n          break;\n        case 'Enter':\n          e.preventDefault(); // never submits, never changes step\n          if (open && this.active > -1) this.pick(this.active);\n          else if (clean(this.search.value).length >= 2) { window.clearTimeout(this.searchTimer); this.lookup(clean(this.search.value)); }\n          break;\n        case 'Escape':\n          if (open) { e.preventDefault(); this.closeList(); this._eatEsc = true; }\n          else if (this.search.value) { e.preventDefault(); this.search.value = ''; this.status(''); this._eatEsc = true; }\n          break;\n        case 'Tab':\n          this.closeList();\n          break;\n      }\n    }\n\n    /* A search result \u2192 a line of the request (qty 1). The list stays open: people add several products. */\n    pick(i) {\n      var p = this.found[i];\n      if (!p) return;\n      var li = this.results.children[i];\n      if (this.isAdded(p)) {\n        this.say(p.title + ' \u00E8 gi\u00E0 nella richiesta');\n        return;\n      }\n      var item = this.norm({ title: p.title, vendor: p.vendor, variant: '', url: p.url, image: p.image, price: p.price, qty: 1 }, false);\n      item.handle = p.handle;\n      item.from = p.from;\n      item.base = { price: p.price, from: p.from, url: p.url, image: item.image };\n      this.items.push(item);\n      if (this.popup) this.pickerOpen = true; // keep the search on screen after the first product\n      var err = this.q('[data-q-err1]');\n      if (err) err.hidden = true;\n      if (li) this.markOption(li, true);\n      this.say(p.title + ' aggiunto alla richiesta');\n      this.render();\n      this.loadVariants(item);\n    }\n\n    /* Variants of a picked product (/products/<handle>.js): an optional select on its line. */\n    loadVariants(item) {\n      var self = this;\n      fetch(routeRoot() + 'products/' + encodeURIComponent(item.handle) + '.js', { headers: { Accept: 'application/json' } })\n        .then(function (r) { return r.ok ? r.json() : null; })\n        .then(function (p) {\n          if (!p || !p.variants || p.variants.length < 2 || self.items.indexOf(item) < 0) return;\n          item.variants = p.variants.map(function (v) {\n            return { id: v.id, title: clean(v.title), price: v.price, image: (v.featured_image && v.featured_image.src) || '' };\n          });\n          var names = (p.options || []).map(function (o) { return clean(typeof o === 'string' ? o : o.name); });\n          item.optLabel = names.length === 1 && names[0] ? names[0] : 'Variante';\n          self.drawItems();\n        })\n        .catch(function () { /* no select: the product still travels, without variant */ });\n    }\n\n    setVariant(item, id) {\n      var v = (item.variants || []).filter(function (x) { return String(x.id) === String(id); })[0];\n      var base = item.base || {};\n      if (v) {\n        item.variantId = v.id;\n        item.variant = v.title;\n        item.price = v.price;\n        item.from = false;\n        item.url = (base.url || item.url.split('?')[0]) + '?variant=' + v.id;\n        item.image = v.image ? sized(v.image, 176) : base.image;\n      } else {\n        item.variantId = null;\n        item.variant = '';\n        item.price = base.price;\n        item.from = base.from;\n        item.url = base.url || item.url;\n        item.image = base.image;\n      }\n    }\n\n    /* ---------- helpers ---------- */\n    q(sel) { return this.querySelector(sel); }\n    qa(sel) { return Array.prototype.slice.call(this.querySelectorAll(sel)); }\n    show(sel, on) { this.qa(sel).forEach(function (el) { el.hidden = !on; }); }\n    ticked() { return this.qa('[data-q-cat]').filter(function (c) { return c.checked; }); }\n    free() { var f = this.q('[data-q-free]'); return f ? clean(f.value) : ''; }\n    amount() { var f = this.q('[data-q-freeqty]'); return f && !f.disabled ? clean(f.value) : ''; }\n    field(name) { var f = this.q('[data-q-f=\"' + name + '\"]'); return f ? clean(f.value) : ''; }\n    greeting() {\n      if (this.dataset.greeting) return clean(this.dataset.greeting);\n      var base = this.dataset.waBase || '';\n      var comma = base.indexOf(',');\n      return comma > 0 && comma < 24 ? base.slice(0, comma) : 'Ciao';\n    }\n    catQty(cat) { var i = this.q('[data-q-cat-qty=\"' + cat + '\"]'); return i ? toInt(i.value, 1) : 1; }\n    itemLabel(it) { return it.title + (it.variant ? ' \u2013 ' + it.variant : ''); }\n    stepName(n) { var el = this.q('[data-q-step=\"' + n + '\"]'); return el ? el.dataset.qName || '' : ''; }\n\n    /* \"40 \u00D7 Souvenir 550 \u2013 Rosso (Pedrali)\" for products, \"40 sedie\" for categories: both travel together */\n    catLines() {\n      var self = this;\n      return this.ticked().map(function (c) { return self.catQty(c.dataset.qCat) + ' ' + c.dataset.word; });\n    }\n    lines() {\n      var self = this;\n      return this.items.map(function (it) {\n        return it.qty + ' \u00D7 ' + self.itemLabel(it) + (it.vendor ? ' (' + it.vendor + ')' : '');\n      }).concat(this.catLines());\n    }\n\n    /* Public: the WhatsApp text (bible note 4). */\n    message() {\n      if (this.legacyLabel) this.syncLegacy();\n      var base = clean(this.dataset.waBase) || 'Ciao, vorrei un preventivo per un progetto contract';\n      base = base.replace(/[.!]+$/, '');\n      var list = this.lines(), text;\n      // One product or many: always the list form \"vorrei un preventivo per: 10 \u00D7 Spritz \u2013 \u2026 (Nardi)\" (bible note 4).\n      if (this.items.length) {\n        text = this.greeting() + ', vorrei un preventivo per: ' + list.join(', ') + '.';\n      } else if (list.length) {\n        text = base + ': ' + list.join(', ') + '.';\n      } else {\n        text = base + '.';\n      }\n      if (this.free()) text += ' Note: ' + stop(this.free());\n      if (!list.length && this.amount()) text += ' Quantit\u00E0: ' + stop(this.amount());\n      var project = [this.field('venue'), this.field('city')].filter(Boolean);\n      if (project.length) text += ' Progetto: ' + project.join(', ') + '.';\n      return text;\n    }\n    waUrl() {\n      var n = this.dataset.waNumber;\n      return n ? 'https://wa.me/' + n + '?text=' + encodeURIComponent(this.message()) : '';\n    }\n\n    setQty(input, value) {\n      var n = toInt(value, 1);\n      input.value = n;\n      var box = input.closest('.dehde-q_qty');\n      var minus = box && box.querySelector('[data-q-minus]');\n      if (minus) minus.disabled = n <= 1;\n      return n;\n    }\n    markChips(row, n) {\n      if (!row) return;\n      row.querySelectorAll('[data-q-chip]').forEach(function (chip) {\n        chip.setAttribute('aria-pressed', +chip.dataset.qChip === n ? 'true' : 'false');\n      });\n    }\n\n    /* ---------- drawing ---------- */\n    render() {\n      var self = this;\n      var has = this.items.length > 0;\n      var cats = this.ticked();\n\n      this.qa('[data-q-step]').forEach(function (el) { el.hidden = +el.dataset.qStep !== self.step; });\n      this.qa('[data-q-goto]').forEach(function (b) {\n        var n = +b.dataset.qGoto, done = n < self.step;\n        b.dataset.done = done ? 'true' : 'false';\n        if (n === self.step) b.setAttribute('aria-current', 'step'); else b.removeAttribute('aria-current');\n        b.disabled = !done;\n      });\n      this.q('[data-q-step-n]').textContent = this.step;\n      this.q('[data-q-step-t]').textContent = this.stepName(this.step);\n      this.qa('[data-q-seg]').forEach(function (s, i) { s.dataset.on = i < self.step ? 'true' : 'false'; });\n\n      var recap = this.q('[data-q-recap]');\n      recap.hidden = !(has && this.step > 1);\n      this.q('[data-q-recap-t]').textContent = this.items.length + (this.items.length === 1 ? ' prodotto' : ' prodotti') + (this.fromLabel ? ' ' + this.fromLabel : '');\n\n      this.show('[data-q-lines-block]', has);\n      if (this.popup) {\n        // popup step 1: the search sits behind \"Aggiungi altri prodotti\" once the request has a product\n        var openPicker = !has || !!this.pickerOpen;\n        this.show('[data-q-picker]', openPicker);\n        var more = this.q('[data-q-more]');\n        if (more) {\n          more.hidden = openPicker;\n          more.setAttribute('aria-expanded', openPicker ? 'true' : 'false');\n        }\n      } else {\n        // inline step 1: products and categories live side by side; step 2 asks the quantities of both\n        this.show('[data-q-minis-block]', has);\n        this.show('[data-q-cats-qty]', cats.length > 0 || !has);\n        this.qa('[data-q-qrow]').forEach(function (row) {\n          var on = cats.some(function (c) { return c.dataset.qCat === row.dataset.qQrow; });\n          row.hidden = !on;\n          var input = row.querySelector('input');\n          if (on && !input.value) self.setQty(input, 1);\n        });\n        var freeQty = this.q('[data-q-freeqty-field]');\n        if (freeQty) freeQty.hidden = cats.length > 0 || has;\n        var freeQtyInput = this.q('[data-q-freeqty]');\n        if (freeQtyInput) freeQtyInput.disabled = cats.length > 0 || has;\n      }\n\n      this.drawItems();\n      this.syncWa();\n      this.emit({ sent: false });\n\n      if (!this.seen[this.step]) {\n        this.seen[this.step] = true;\n        track('preventivo_passo_' + this.step, { origine: this.originParam });\n      }\n    }\n\n    drawItems() {\n      var self = this;\n      var pairs = [\n        [this.q('template[data-q-tpl-line]'), this.q('[data-q-lines]')],\n        [this.q('template[data-q-tpl-mini]'), this.q('[data-q-minis]')]\n      ].filter(function (pair) { return pair[0] && pair[1]; });\n      // keep the focus on a control of a line (quantity, variant select, chip) while re-drawing\n      var active = document.activeElement, keep = null;\n      pairs.forEach(function (pair, p) {\n        if (!active || !pair[1].contains(active) || !active.closest('[data-index]')) return;\n        var hook = ['data-q-item-qty', 'data-q-pick-select', 'data-q-chip', 'data-q-plus', 'data-q-minus'].filter(function (h) { return active.hasAttribute(h); })[0];\n        if (hook) keep = { p: p, i: +active.closest('[data-index]').dataset.index, sel: '[' + hook + (hook === 'data-q-chip' ? '=\"' + active.dataset.qChip + '\"' : '') + ']' };\n      });\n      pairs.forEach(function (pair, p) {\n        var list = pair[1];\n        list.textContent = '';\n        self.items.forEach(function (it, i) {\n          var node = pair[0].content.firstElementChild.cloneNode(true);\n          node.dataset.index = i;\n          var img = node.querySelector('[data-q-img]');\n          if (it.image) { img.src = it.image; img.alt = ''; } else { img.remove(); }\n          var name = node.querySelector('[data-q-name]');\n          name.textContent = it.title;\n          if (it.url) name.href = it.url; else name.removeAttribute('href');\n          node.querySelector('[data-q-vendor]').textContent = it.vendor;\n          var variant = node.querySelector('[data-q-variant]');\n          var price = node.querySelector('[data-q-price]');\n          var priceText = it.price == null ? '' : (it.from ? 'da ' : '') + money(it.price);\n          var picker = it.variants && it.variants.length > 1;\n          if (price) {\n            price.textContent = priceText;\n            variant.textContent = it.variant;\n            variant.hidden = !it.variant || picker;\n          } else {\n            variant.textContent = [picker ? '' : it.variant, priceText].filter(Boolean).join(' \u00B7 ');\n          }\n          var pick = node.querySelector('[data-q-pick]');\n          if (pick && picker) {\n            var sel = pick.querySelector('[data-q-pick-select]');\n            var label = pick.querySelector('[data-q-pick-label]');\n            sel.id = self.uid + '-pick-' + p + '-' + i;\n            label.htmlFor = sel.id;\n            label.textContent = it.optLabel || 'Variante';\n            var none = document.createElement('option');\n            none.value = '';\n            none.textContent = 'Da definire';\n            sel.appendChild(none);\n            it.variants.forEach(function (v) {\n              var o = document.createElement('option');\n              o.value = String(v.id);\n              o.textContent = v.title;\n              sel.appendChild(o);\n            });\n            sel.value = it.variantId ? String(it.variantId) : '';\n            pick.hidden = false;\n          }\n          var remove = node.querySelector('[data-q-remove]');\n          remove.setAttribute('aria-label', 'Togli ' + it.title + ' dalla richiesta');\n          var qty = node.querySelector('[data-q-item-qty]');\n          if (qty) {\n            qty.id = self.uid + '-item-' + p + '-' + i;\n            qty.setAttribute('aria-label', 'Quantit\u00E0 di ' + it.title);\n            node.querySelector('[data-q-minus]').setAttribute('aria-label', 'Diminuisci quantit\u00E0 di ' + it.title);\n            node.querySelector('[data-q-plus]').setAttribute('aria-label', 'Aumenta quantit\u00E0 di ' + it.title);\n            self.setQty(qty, it.qty);\n          }\n          var chips = node.querySelector('[data-q-chips]');\n          if (chips) {\n            chips.setAttribute('aria-label', 'Quantit\u00E0 rapide per ' + it.title);\n            self.markChips(node, it.qty);\n          }\n          list.appendChild(node);\n        });\n      });\n      if (keep) {\n        var again = pairs[keep.p][1].querySelector('[data-index=\"' + keep.i + '\"] ' + keep.sel);\n        if (again && !again.disabled) again.focus({ preventScroll: true });\n      }\n    }\n\n    syncWa() {\n      this.compose(); // keep the hidden fields current (see onSubmit)\n      var url = this.waUrl();\n      if (!url) return;\n      this.qa('a[href*=\"wa.me/\"]').forEach(function (a) { a.href = url; });\n    }\n\n    emit(extra) {\n      var detail = Object.assign({ items: this.items.length, waUrl: this.sentBox ? '' : this.waUrl() }, extra || {});\n      this.dispatchEvent(new CustomEvent('dehde-quote:change', { bubbles: true, detail: detail }));\n    }\n\n    goStep(n) {\n      this.step = Math.max(1, Math.min(this.total || 1, n));\n      this.render();\n      var el = this.q('[data-q-step=\"' + this.step + '\"]');\n      if (!el) return;\n      try { el.focus({ preventScroll: true }); } catch (e) { el.focus(); }\n      var scroller = this.popup && this.closest('.modal-component');\n      if (scroller) {\n        // popup: every step starts at the top of the dialog (the modal itself is the scroll container)\n        scroller.scrollTop = 0;\n      } else {\n        var top = el.getBoundingClientRect().top;\n        if (top < 90 || top > window.innerHeight - 120) {\n          (this.q('[data-q-heading]') || el).scrollIntoView({ block: 'start', behavior: reduced ? 'auto' : 'smooth' });\n        }\n      }\n      this.dispatchEvent(new CustomEvent('dehde-quote:step', { bubbles: true, detail: { step: this.step } }));\n    }\n\n    /* ---------- validation ---------- */\n    mark(input, errorEl, bad) {\n      if (!input) return;\n      if (bad) input.setAttribute('aria-invalid', 'true'); else input.removeAttribute('aria-invalid');\n      if (errorEl) errorEl.hidden = !bad;\n    }\n    next1() {\n      var ok = this.items.length || this.ticked().length || this.free();\n      this.q('[data-q-err1]').hidden = !!ok;\n      if (!ok) {\n        var first = [this.search, this.q('[data-q-cat]'), this.q('[data-q-free]')].filter(function (el) { return el && isShown(el); })[0];\n        if (first) first.focus();\n        return;\n      }\n      this.goStep(2);\n    }\n    /* UI v2 \u00A73.14 (L12): one rule per required field, shared by submit, blur and the live clean-up below.\n       Returns true when the field is invalid; the message + aria-invalid are set here (aria-describedby is in the markup). */\n    checkField(key) {\n      var input = this.q('[data-q-f=\"' + key + '\"]');\n      if (!input) return false;\n      var bad = key === 'privacy' ? !input.checked\n        : key === 'email' ? !EMAIL_RE.test(clean(input.value))\n        : !clean(input.value);\n      this.mark(input, this.q('[data-q-err=\"' + key + '\"]'), bad);\n      return bad;\n    }\n    /* Blur: validate a text field only once the visitor has typed in it (or it is already flagged), so tabbing\n       through an empty form never paints it red. Errors are never ADDED while typing (see onInput). */\n    onBlur(input) {\n      var key = input.dataset.qF;\n      if (key !== 'name' && key !== 'email') return;\n      if (input.dataset.qDirty || input.getAttribute('aria-invalid') === 'true') this.checkField(key);\n    }\n    check() {\n      var name = this.q('[data-q-f=\"name\"]'), mail = this.q('[data-q-f=\"email\"]'), ok = this.q('[data-q-f=\"privacy\"]');\n      var e1 = this.checkField('name'), e2 = this.checkField('email'), e3 = this.checkField('privacy');\n      if (e1 || e2 || e3) {\n        if (this.step !== this.total) this.goStep(this.total);\n        (e1 ? name : e2 ? mail : ok).focus();\n        return false;\n      }\n      return true;\n    }\n\n    /* ---------- submit ----------\n     * Shopify protects contact forms with hCaptcha (the \"captcha-bootstrap\" script in content_for_header, then\n     * cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/\u2026iife.js). On the first focus inside this form its\n     * provider BINDS the form: it captures the form's own submit() function, replaces form.submit with its wrapper\n     * and adds its own 'submit' listener (preventDefault \u2192 invisible hCaptcha \u2192 hidden h-captcha-response input \u2192\n     * the captured submit()). Our listener was added earlier, so it runs first:\n     *  - invalid request \u2192 stopImmediatePropagation(), so no challenge opens for a form that cannot be sent;\n     *  - valid request  \u2192 hidden fields composed + summary stored, then Shopify's listener takes over.\n     * The hidden fields are also re-composed on every change (compose()), so whichever path finally submits\n     * the form (native POST, the captcha's programmatic submit, or send() below) carries the current request.\n     *\n     * AJAX without breaking that order (hookSubmit): before the provider binds, form.submit is replaced on the\n     * instance by send(). The provider captures THAT function, so after the token is in the form it calls send()\n     * instead of a native POST: hCaptcha still runs first and the token travels with the fetch. */\n    hookSubmit() {\n      // Too late if the provider already bound the form (a field focused before this deferred script ran): it\n      // captured the native submit(), so this panel keeps the native POST + reload. Never happens in practice.\n      if (this.form.hasAttribute('data-hcaptcha-bound')) return;\n      try {\n        this.form.submit = this.send.bind(this);\n        this.hooked = true;\n      } catch (e) { /* read-only in some very old browser: native POST */ }\n    }\n\n    onSubmit(e) {\n      // A request is already on its way (double click / Enter): do not open a second captcha or POST.\n      if (this.sending) { e.preventDefault(); e.stopImmediatePropagation(); return; }\n      if (!this.check()) { e.preventDefault(); e.stopImmediatePropagation(); return; }\n      var self = this;\n      var parts = this.compose();\n      store(this.key, {\n        rows: parts.rows, count: this.items.length, origine: this.originParam,\n        items: this.items, cats: this.ticked().map(function (c) { return [c.dataset.qCat, self.catQty(c.dataset.qCat)]; })\n      });\n      if (!this.hooked) return; // native POST (see hookSubmit)\n      // Bound by Shopify's captcha provider: its listener (next) runs the captcha, then calls send().\n      if (this.form.hasAttribute('data-hcaptcha-bound')) return;\n      // Captcha bootstrap on the page but the provider not bound yet (script still loading): unchanged, Shopify's\n      // document listener holds this submit exactly as before; the next click goes through the bound path.\n      if (window.Shopify && Shopify.captcha) return;\n      // No captcha on this storefront: post it ourselves.\n      e.preventDefault();\n      this.send();\n    }\n\n    /* POST the form with fetch(): same endpoint (form.action = /contact#<form id>, the hash is not sent), same\n     * fields, same encoding as the native form (application/x-www-form-urlencoded), cookies included. Shopify\n     * answers with a 302 back to the page (Referer) that fetch follows:\n     *   \u2026?contact_posted=true#\u2026  \u2192 sent;   the page with form.errors \u2192 errors shown inline, the visitor fixes them;\n     *   /challenge (interactive captcha) or anything unrecognised or a network error \u2192 native POST fallback. */\n    send() {\n      var self = this;\n      if (this.sending) return;\n      this.sending = true;\n      this.form.setAttribute('aria-busy', 'true');\n      var body;\n      try {\n        body = new URLSearchParams(new FormData(this.form));\n      } catch (e) {\n        this.native();\n        return;\n      }\n      fetch(this.form.action, {\n        method: 'POST',\n        body: body,\n        credentials: 'same-origin',\n        headers: { Accept: 'text/html' }\n      })\n        .then(function (r) {\n          return r.text().then(function (html) { return self.outcome(r, html); });\n        })\n        .catch(function () { return { native: true }; })\n        .then(function (res) {\n          self.sending = false;\n          self.form.removeAttribute('aria-busy');\n          if (res.sent) self.showSent();\n          else if (res.error) self.showError(res.error);\n          else self.native();\n        });\n    }\n\n    /* Reads Shopify's answer. Our own markers first (this panel, by data-uid, in the returned page), then the URL. */\n    outcome(r, html) {\n      var doc = null;\n      try { doc = new DOMParser().parseFromString(html, 'text/html'); } catch (e) { doc = null; }\n      var mine = doc && doc.querySelector('dehde-quote[data-uid=\"' + this.uid + '\"]');\n      if (r.ok && mine && mine.querySelector('[data-q-sent]')) return { sent: true };\n      if (r.ok && /[?&]contact_posted=true/.test(r.url || '')) return { sent: true };\n      if (/\\/challenge/.test(r.url || '') || (doc && doc.querySelector('form[action*=\"/challenge\"]'))) return { native: true };\n      var err = r.ok && mine && mine.querySelector('[data-q-error]');\n      if (err) return { error: err };\n      return { native: true };\n    }\n\n    /* Fallback: the browser's own POST (the prototype submit(): no submit event, so neither our listener nor the\n     * captcha's run again). Shopify then shows its challenge page if it wants one and reloads this page with\n     * ?contact_posted=true; the summary is still in sessionStorage for the server-rendered box. */\n    native() {\n      this.sending = false;\n      this.form.removeAttribute('aria-busy');\n      HTMLFormElement.prototype.submit.call(this.form);\n    }\n\n    /* Server-side errors from the AJAX answer: the same [data-q-error] block Shopify's reload would print, at the top\n     * of the form, on the contact step. The form stays as it is (captcha container, form_type, token inputs), so\n     * the next click runs the captcha again and sends through send(). */\n    showError(node) {\n      var old = this.q('[data-q-error]');\n      if (old) old.remove();\n      var alert = document.importNode(node, true);\n      alert.removeAttribute('data-dehde-quote-autoopen');\n      this.form.insertBefore(alert, this.form.firstChild);\n      if (this.step !== this.total) this.goStep(this.total);\n      try { alert.focus({ preventScroll: true }); } catch (e) { alert.focus(); }\n      this.reveal(alert);\n    }\n\n    /* Sent: the steps give way to the \"Richiesta ricevuta\" box (template data-q-tpl-sent = the server markup).\n     * Calm switch, opacity/transform only: the form keeps its height while the steps fade out (nothing moves), the\n     * box replaces them and fades/slides 8px in. Reduced motion: an instant swap. Then focus on the box heading\n     * (screen readers read \"Richiesta ricevuta\") and a scroll only if the box is not on screen. */\n    showSent() {\n      var self = this;\n      var tpl = this.q('template[data-q-tpl-sent]');\n      if (!tpl || !tpl.content.firstElementChild) { this.native(); return; } // old markup cached: server path\n      var box = tpl.content.firstElementChild.cloneNode(true);\n      var saved = store(this.key);\n      var list = box.querySelector('[data-q-summary]');\n      if (saved && list && saved.rows && saved.rows.length) {\n        saved.rows.forEach(function (row) {\n          var li = document.createElement('li');\n          li.textContent = row;\n          list.appendChild(li);\n        });\n        list.hidden = false;\n      }\n      track('generate_lead', { origine: (saved && saved.origine) || this.originParam, prodotti: (saved && saved.count) || this.items.length });\n      store(this.key, null);\n\n      var form = this.form;\n      // The box is shorter than the steps it replaces, so whatever sits after the panel moves up: on the page the\n      // aside / sections below (phones), in the popup \u2265 768px the whole centred sheet re-centres. Measured before\n      // this fix: a visible jump and a layout shift of ~0.1. FLIP instead (glide): measure those elements before the\n      // swap, offset them back with a transform right after it, then ease the transform to 0 \u2014 they glide into\n      // place, transform only, no layout shift reported. Elements that do not move are left alone.\n      var movers = this.popup ? [this.closest('.modal-component_wrapper')].filter(Boolean) : this.after();\n      var swap = function () {\n        var tops = movers.map(function (el) { return el.getBoundingClientRect().top; });\n        // keep what Shopify's captcha put in the form; everything else (steps, hidden request fields) goes\n        Array.prototype.slice.call(form.children).forEach(function (el) {\n          if (!el.matches('input[type=\"hidden\"], .h-captcha')) el.remove();\n        });\n        if (!reduced) box.classList.add('is-entering');\n        form.appendChild(box);\n        form.classList.remove('is-leaving');\n        form.style.minHeight = '';\n        if (!reduced) self.glide(movers, tops);\n        self.sentBox = box;\n        var heading = box.querySelector('[data-q-sent-heading]') || box;\n        try { heading.focus({ preventScroll: true }); } catch (e) { heading.focus(); }\n        self.reveal(box);\n        if (!reduced) {\n          box.getBoundingClientRect(); // commit the start state, then let the transition run\n          window.requestAnimationFrame(function () { box.classList.remove('is-entering'); });\n        }\n        self.emit({ sent: true });\n      };\n      if (reduced) { swap(); return; }\n      form.style.minHeight = form.offsetHeight + 'px'; // nothing below moves while the steps fade out\n      form.classList.add('is-leaving');\n      window.setTimeout(swap, 160); // = the .is-leaving fade in dehde-contract-quote.css\n    }\n\n    /* What comes after the panel in the page: the following siblings of the panel and of each of its ancestors\n     * (hidden / fixed / sticky ones skipped: they are not pushed by the flow). Measured by glide(). */\n    after() {\n      var out = [];\n      var node = this.closest('.dehde-ui-panel') || this;\n      while (node && node.parentElement && node !== document.body) {\n        for (var sib = node.nextElementSibling; sib; sib = sib.nextElementSibling) {\n          if (sib.matches('script, style, template, link')) continue;\n          var cs = window.getComputedStyle(sib);\n          if (cs.display === 'none' || cs.position === 'fixed' || cs.position === 'sticky') continue;\n          out.push(sib);\n        }\n        node = node.parentElement;\n      }\n      return out;\n    }\n\n    /* FLIP: every element that moved (top now \u2260 tops[i]) and is on screen now or was before gets\n     * translateY(old \u2212 new) with no transition, then eases back in 280ms (the box's curve). Inline styles restored. */\n    glide(els, tops) {\n      var vh = window.innerHeight;\n      var moved = [];\n      els.forEach(function (el, i) {\n        var r = el.getBoundingClientRect();\n        var delta = tops[i] - r.top;\n        if (Math.abs(delta) < 1) return;\n        if (!((r.top < vh && r.bottom > 0) || (tops[i] < vh && tops[i] + r.height > 0))) return; // off screen\n        moved.push({ el: el, delta: delta, transform: el.style.transform, transition: el.style.transition });\n      });\n      if (!moved.length) return;\n      moved.forEach(function (m) {\n        m.el.style.transition = 'none';\n        m.el.style.transform = 'translateY(' + m.delta + 'px)';\n      });\n      document.body.getBoundingClientRect(); // commit the offset frame\n      window.requestAnimationFrame(function () {\n        moved.forEach(function (m) {\n          m.el.style.transition = 'transform 280ms cubic-bezier(.2, 0, 0, 1)';\n          m.el.style.transform = m.transform;\n        });\n        window.setTimeout(function () {\n          moved.forEach(function (m) { m.el.style.transition = m.transition; });\n        }, 320);\n      });\n    }\n\n    /* Scroll only when needed: popup \u2192 the dialog is the scroll container, back to its top if the element is\n     * above it; page \u2192 if the element is under the sticky header or below the fold (same thresholds as goStep). */\n    reveal(el) {\n      var behavior = reduced ? 'auto' : 'smooth';\n      var scroller = this.popup && this.closest('.modal-component');\n      if (scroller) {\n        var r = el.getBoundingClientRect(), s = scroller.getBoundingClientRect();\n        if (r.top < s.top || r.top > s.bottom - 120) scroller.scrollTo({ top: 0, behavior: behavior });\n        return;\n      }\n      var top = el.getBoundingClientRect().top;\n      if (top < 90 || top > window.innerHeight - 120) {\n        // land on the panel's kicker + H2 (as goStep does) so the box is read in its context\n        (this.q('[data-q-heading]') || el).scrollIntoView({ block: 'start', behavior: behavior });\n      }\n    }\n\n    /* Writes contact[Prodotti] / contact[Cosa ti serve] / contact[Origine] from the panel. */\n    compose() {\n      var self = this;\n      if (!this.productsField) return { rows: [] };\n      if (this.legacyLabel) this.syncLegacy();\n\n      var productLines = this.items.map(function (it) {\n        return it.qty + ' \u00D7 ' + self.itemLabel(it) + (it.vendor ? ' (' + it.vendor + ')' : '') + (it.url ? ' \u00B7 ' + it.url : '');\n      });\n      this.productsField.value = productLines.join('\\n');\n      this.productsField.disabled = !productLines.length;\n\n      var cats = this.catLines();\n      this.needsField.value = cats.join(', ');\n      this.needsField.disabled = !cats.length;\n\n      // PDP legacy fields: dropped if the product was removed from the request\n      var keepLegacy = this.items.some(function (i) { return i.legacy; });\n      if (this.legacyLabel) this.legacyLabel.disabled = !keepLegacy;\n      if (this.legacyUrl) this.legacyUrl.disabled = !keepLegacy;\n\n      var origin = this.q('[data-q-origin]');\n      if (origin) origin.value = this.origin;\n\n      var rows = productLines.map(function (l) { return l.split(' \u00B7 ')[0]; }).concat(cats);\n      if (this.free()) rows = rows.concat(this.free());\n      if (!rows.length && this.amount()) rows.push('Quantit\u00E0 indicative: ' + this.amount());\n      return { rows: rows };\n    }\n\n    /* After a server-side error the page reloads: bring back what the visitor had put in the panel. */\n    restore() {\n      var self = this;\n      var saved = store(this.key);\n      if (!saved) return;\n      if (saved.items && !this.items.length) saved.items.forEach(function (it) { self.items.push(self.norm(it, false)); });\n      (saved.cats || []).forEach(function (pair) {\n        var box = self.q('[data-q-cat=\"' + pair[0] + '\"]');\n        var qty = self.q('[data-q-cat-qty=\"' + pair[0] + '\"]');\n        if (box) box.checked = true;\n        if (qty) qty.value = pair[1];\n      });\n    }\n\n    /* ---------- events ---------- */\n    onClick(e) {\n      var t = e.target, b;\n      if (!t.closest) return;\n      if ((b = t.closest('[data-q-next]'))) { if (b.dataset.qNext === '1') this.next1(); else this.goStep(this.step + 1); return; }\n      if ((b = t.closest('[data-q-back]'))) { this.goStep(this.step - 1); return; }\n      if ((b = t.closest('[data-q-goto]'))) { if (!b.disabled) this.goStep(+b.dataset.qGoto); return; }\n      if ((b = t.closest('[data-q-goto-edit]'))) { this.goStep(1); return; }\n      if ((b = t.closest('[data-q-more]'))) {\n        this.pickerOpen = true;\n        this.render();\n        if (this.search) this.search.focus();\n        return;\n      }\n      if ((b = t.closest('[data-q-remove]'))) {\n        var i = +b.closest('[data-index]').dataset.index;\n        var gone = this.items.splice(i, 1)[0];\n        if (!this.items.length && !this.popup) this.step = 1;\n        this.render();\n        this.say((gone ? gone.title + ' tolto' : 'Prodotto tolto') + ' dalla richiesta');\n        if (this.results && !this.results.hidden) {\n          var self = this;\n          Array.prototype.forEach.call(this.results.children, function (li) { self.markOption(li, self.isAdded(self.found[+li.dataset.i])); });\n        }\n        var focusTo = this.items.length ? this.q('[data-q-step=\"' + this.step + '\"] [data-q-remove]') : null;\n        if (!focusTo && this.search && isShown(this.search)) focusTo = this.search;\n        if (!focusTo) focusTo = this.q('[data-q-step=\"' + this.step + '\"]');\n        if (focusTo) focusTo.focus();\n        return;\n      }\n      if ((b = t.closest('[data-q-chip]'))) {\n        var row = b.closest('[data-index]');\n        var input = row && row.querySelector('[data-q-item-qty]');\n        if (!input) return;\n        this.qtyChanged(input, this.setQty(input, +b.dataset.qChip));\n        return;\n      }\n      if ((b = t.closest('[data-q-minus], [data-q-plus]'))) {\n        var box = b.closest('.dehde-q_qty').querySelector('input');\n        var n = this.setQty(box, toInt(box.value, 1) + (b.hasAttribute('data-q-plus') ? 1 : -1));\n        this.qtyChanged(box, n);\n        return;\n      }\n      if ((b = t.closest('a[href*=\"wa.me/\"]'))) {\n        b.href = this.waUrl() || b.href;\n        track('whatsapp_click', { posizione: 'pannello', origine: this.originParam });\n      }\n    }\n    qtyChanged(input, n) {\n      var row = input.closest('[data-index]');\n      if (row && input.matches('[data-q-item-qty]')) {\n        this.items[+row.dataset.index].qty = n;\n        this.markChips(row, n);\n      }\n      this.syncWa();\n      this.emit();\n    }\n    onInput(e) {\n      var t = e.target;\n      if (!t.matches) return;\n      if (t.matches('[data-q-search]')) return; // the search has its own listeners and never posts\n      if (t.matches('[data-q-pick-select]')) {\n        if (e.type !== 'change') return;\n        var item = this.items[+t.closest('[data-index]').dataset.index];\n        if (item) this.setVariant(item, t.value);\n        this.drawItems();\n        this.syncWa();\n        this.emit();\n        return;\n      }\n      if (t.matches('[data-q-cat]')) { this.q('[data-q-err1]').hidden = true; this.render(); return; }\n      if (t.matches('[data-q-free]')) this.q('[data-q-err1]').hidden = true;\n      // UI v2 \u00A73.14: while typing, an error already shown is re-checked and cleared as soon as the value is valid\n      // (never added on a keystroke; blur and submit add it). Privacy: a tick clears it at once.\n      if (t.matches('[data-q-f=\"name\"], [data-q-f=\"email\"]')) {\n        if (e.type === 'input') t.dataset.qDirty = '1';\n        if (t.getAttribute('aria-invalid') === 'true') this.checkField(t.dataset.qF);\n      }\n      if (t.matches('[data-q-f=\"privacy\"]') && t.checked) this.mark(t, this.q('[data-q-err=\"privacy\"]'), false);\n      if (t.matches('.dehde-q_qty input')) {\n        var n = toInt(t.value, 1);\n        var minus = t.closest('.dehde-q_qty').querySelector('[data-q-minus]');\n        if (minus) minus.disabled = n <= 1;\n        this.qtyChanged(t, n);\n        return;\n      }\n      this.syncWa();\n      // Tell listeners (the sticky bar <dehde-ct-quote-bar>) the new waUrl too: free text, venue and city are part\n      // of the WhatsApp message. Not inside syncWa(), because render() already calls syncWa() + emit().\n      this.emit();\n    }\n    onKey(e) {\n      if (e.key !== 'Enter') return;\n      var t = e.target;\n      if (!t.matches || t.matches('[data-q-search]')) return; // Enter in the search = pick a result\n      if (!t.matches('input:not([type=\"checkbox\"]):not([type=\"hidden\"])')) return;\n      if (this.step === this.total) return; // Enter in the contact step submits (the submit handler validates)\n      e.preventDefault();\n      if (this.step === 1) this.next1(); else this.goStep(this.step + 1);\n    }\n    say(text) {\n      var live = this.q('[data-q-live]');\n      if (!live) return;\n      live.textContent = '';\n      window.setTimeout(function () { live.textContent = text; }, 50);\n    }\n  }\n\n  customElements.define('dehde-quote', DehdeQuote);\n})();\n"],
  "mappings": "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",
  "names": []
}
