{
  "version": 3,
  "sources": ["/cdn/shop/t/71/assets/curvs-cart.js?cb=18842"],
  "sourcesContent": ["/* ============================================================================\n   curvs-cart.js \u2014 cart drawer + quick-add sheet controller.\n   Delegated document-level singleton (CONVENTIONS.md \u00A77): one guarded install,\n   all handlers delegated, elements re-queried at event time so theme-editor\n   re-renders and Section Rendering swaps never orphan a listener.\n\n   Public contract (document-level CustomEvents):\n     curvs:cart:open                          -> opens the drawer\n     curvs:cart:changed                       -> drawer refetches itself and re-renders\n     curvs:quickadd:open  { detail:{handle} } -> opens the quick-add sheet\n\n   Impact 7.2 interop (so stock sections keep working while they coexist):\n     - listens to Impact's `cart:change` / `variant:add` / `cart:refresh`\n       (stock product forms dispatch these after /cart/add.js)\n     - after our own mutations we dispatch Impact's `cart:change` with the full\n       cart JSON (flagged detail.curvs) so stock <cart-count> bubbles update.\n   ========================================================================== */\n(function () {\n  'use strict';\n  if (window.__cvCart) return; // singleton guard \u2014 survives section re-renders\n  window.__cvCart = true;\n\n  var S = {\n    refreshing: false,\n    queued: false,\n    loading: false,\n    lineErrors: {}, // lineKey -> message, re-applied after a section swap\n    qa: null,       // { handle, product, size, oneSize, busy }\n    kachingCfg: null,   // deal config fetched off the bra PDP (see kachingWarm)\n    kachingWarming: null,\n    resetting: false,   // braDealReset in flight\n    lastFocus: null\n  };\n\n  var ERROR_ICON = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"#9E4438\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"6.4\"></circle><path d=\"M8 5v3.6\"></path><path d=\"M8 10.9v.1\"></path></svg>';\n\n  /* ---- lookups (never cached across events) -------------------------------- */\n  function wrap() { return document.querySelector('[data-cv-cart]'); }\n  function rootEl() { return document.querySelector('[data-cv-cart-root]'); }\n  function qaEl() { return document.querySelector('[data-cv-qa-root]'); }\n  function pageEl() { return document.querySelector('[data-cv-cartpage]'); } // /cart page section\n  function routesRoot() {\n    return (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n  }\n  function cfg() {\n    var node = document.querySelector('[data-cv-cart-config]');\n    if (!node) return { urgencyTemplate: '', qa: {} };\n    try { return JSON.parse(node.textContent); } catch (e) { return { urgencyTemplate: '', qa: {} }; }\n  }\n  function money(cents) {\n    if (window.Curvs && window.Curvs.formatMoney) return window.Curvs.formatMoney(cents);\n    return (cents / 100).toFixed(2); // last-resort fallback, no hardcoded symbol\n  }\n\n  /* ---- open / close -------------------------------------------------------- */\n  function drawerOpen() { var w = wrap(); return !!(w && w.classList.contains('is-open')); }\n  function qaOpen() { var q = qaEl(); return !!(q && q.classList.contains('is-open')); }\n  function syncScrollLock() {\n    var on = drawerOpen() || qaOpen();\n    var html = document.documentElement, body = document.body;\n    if (on === html.classList.contains('cv-cart-lock')) return;\n    if (on) {\n      // body goes position:fixed (curvs.css) \u2014 keep the page where it was\n      S.lockY = window.scrollY || window.pageYOffset || 0;\n      body.style.top = -S.lockY + 'px';\n      html.classList.add('cv-cart-lock');\n    } else {\n      html.classList.remove('cv-cart-lock');\n      body.style.top = '';\n      window.scrollTo(0, S.lockY || 0);\n    }\n  }\n  function rememberFocus() {\n    if (!S.lastFocus) S.lastFocus = document.activeElement;\n  }\n  function restoreFocus() {\n    if (drawerOpen() || qaOpen()) return;\n    if (S.lastFocus && document.contains(S.lastFocus) && typeof S.lastFocus.focus === 'function') {\n      S.lastFocus.focus();\n    }\n    S.lastFocus = null;\n  }\n  function focusInto(selector) {\n    window.setTimeout(function () {\n      var target = document.querySelector(selector);\n      if (target) target.focus();\n    }, 60);\n  }\n\n  function openDrawer() {\n    var w = wrap();\n    if (!w || w.classList.contains('is-open')) return;\n    rememberFocus();\n    w.classList.add('is-open');\n    w.setAttribute('aria-hidden', 'false');\n    syncScrollLock();\n    // Focus the dialog container (tabindex=\"-1\"), NOT the close button: a\n    // pointer-opened drawer must not paint a focus ring on a control. The Tab\n    // handler below still traps focus inside the panel.\n    focusInto('[data-cv-cart-panel]');\n  }\n  function closeDrawer() {\n    var w = wrap();\n    if (!w || !w.classList.contains('is-open')) return;\n    w.classList.remove('is-open');\n    w.setAttribute('aria-hidden', 'true');\n    syncScrollLock();\n    restoreFocus();\n  }\n\n  /* ---- loading state ------------------------------------------------------- */\n  function setLoading(on) {\n    S.loading = on;\n    var w = wrap();\n    if (w) w.classList.toggle('is-loading', on);\n    var p = pageEl(); // /cart page mirrors the drawer's loading treatment\n    if (p) p.classList.toggle('is-loading', on);\n  }\n\n  /* ---- section re-render (Section Rendering API) --------------------------- */\n  function swapSection(html, rootSelector) {\n    if (!html) return;\n    var cur = document.querySelector(rootSelector);\n    if (!cur) return;\n    var doc = new DOMParser().parseFromString(html, 'text/html');\n    var fresh = doc.querySelector(rootSelector);\n    if (fresh) cur.innerHTML = fresh.innerHTML;\n  }\n\n  /* A failed section refetch must never leave the previous render standing as if\n     it were the live bag. One silent retry, then a visible error row. */\n  function clearLoadError() {\n    document.querySelectorAll('[data-cv-cart-loaderror]').forEach(function (el) { el.remove(); });\n  }\n  function showLoadError() {\n    var c = cfg();\n    var msg = c.loadError || 'We couldn\u2019t load your bag. Please refresh the page.';\n    var hosts = [];\n    var drawerBody = document.querySelector('[data-cv-cart-panel] .cv-cart__body');\n    if (drawerBody) hosts.push(drawerBody);\n    var page = document.querySelector('[data-cv-cartpage-root]');\n    if (page) hosts.push(page);\n    hosts.forEach(function (host) {\n      if (host.querySelector('[data-cv-cart-loaderror]')) return;\n      var row = document.createElement('p');\n      row.className = 'cv-cart__loaderror';\n      row.setAttribute('data-cv-cart-loaderror', '');\n      row.setAttribute('role', 'status');\n      row.innerHTML = ERROR_ICON + ' ';\n      row.appendChild(document.createTextNode(msg));\n      host.insertBefore(row, host.firstChild);\n    });\n  }\n\n  function refresh(attempt) {\n    if (S.refreshing) { S.queued = true; return; }\n    S.refreshing = true;\n    // The drawer is opened synchronously by `curvs:cart:open` while this fetch is\n    // still in flight, so the loading treatment has to go on BEFORE the request:\n    // without it the drawer shows the stale (often empty) server render first.\n    setLoading(true);\n    var retrying = false;\n    var w = wrap();\n    var drawerId = (w && w.getAttribute('data-cv-section-id')) || 'curvs-cart-drawer';\n    // The /cart page renders the same line/footer components, so it re-renders\n    // in the same round trip when it is on screen.\n    var p = pageEl();\n    var pageId = p && p.getAttribute('data-cv-section-id');\n    var ids = pageId ? drawerId + ',' + pageId : drawerId;\n    // The cart-page section is enabled_on the cart template only, so it must be\n    // requested against the page we are actually on, not the shop root.\n    var base = pageId ? window.location.pathname : routesRoot();\n    fetch(base + '?sections=' + encodeURIComponent(ids))\n      .then(function (res) {\n        if (!res.ok) throw new Error('sections ' + res.status);\n        return res.json();\n      })\n      .then(function (json) {\n        if (!json) return;\n        clearLoadError();\n        // Replacing the list mid-swipe makes iOS drop the scroll gesture, so a\n        // render that lands while a finger is down waits for touchend.\n        var paint = function () {\n          swapSection(json[drawerId], '[data-cv-cart-root]');\n          if (pageId) swapSection(json[pageId], '[data-cv-cartpage-root]');\n          applyLineErrors();\n          offerSync();\n        };\n        if (S.touching) { S.pendingPaint = paint; } else { paint(); }\n      })\n      .catch(function () {\n        /* four attempts, 1.5s apart, before the error row \u2014 a throttled or\n           VPN'd connection drops single fetches routinely (Ron 2026-09-08) */\n        if ((attempt || 0) < 3) { retrying = true; return; }\n        showLoadError();\n      })\n      .then(function () {\n        S.refreshing = false;\n        // Keep the loading treatment up across the retry \u2014 the bag contents on\n        // screen are not trustworthy until one of the two attempts lands.\n        if (retrying) { window.setTimeout(function () { refresh((attempt || 0) + 1); }, 1500); return; }\n        setLoading(false);\n        if (S.queued) { S.queued = false; refresh(); }\n      });\n  }\n\n  /* ---- line-level errors (injected after swaps; server renders urgency) ---- */\n  function setLineError(key, message) {\n    S.lineErrors[key] = message;\n    applyLineErrors();\n  }\n  function applyLineErrors() {\n    Object.keys(S.lineErrors).forEach(function (key) {\n      var esc = window.CSS && CSS.escape ? CSS.escape(key) : key.replace(/\"/g, '\\\\\"');\n      // On /cart the same line renders twice (page + the always-present drawer),\n      // so paint every copy \u2014 not just the first one in the document.\n      var lines = document.querySelectorAll('[data-cv-cart-line][data-line-key=\"' + esc + '\"]');\n      if (!lines.length) { delete S.lineErrors[key]; return; }\n      Array.prototype.forEach.call(lines, function (line) {\n        var slot = line.querySelector('[data-cv-cart-line-errors]');\n        if (!slot || slot.querySelector('[data-cv-js-error]')) return;\n        var span = document.createElement('span');\n        span.className = 'cv-cart-line__error';\n        span.setAttribute('data-cv-js-error', '');\n        span.innerHTML = ERROR_ICON + ' ';\n        span.appendChild(document.createTextNode(S.lineErrors[key]));\n        slot.appendChild(span);\n      });\n    });\n  }\n\n  /* ---- cart mutations ------------------------------------------------------ */\n  function announceCartChanged(cartJson) {\n    // Contract event first (drawer + header re-render), then Impact interop.\n    document.dispatchEvent(new CustomEvent('curvs:cart:changed'));\n    if (cartJson) {\n      document.dispatchEvent(new CustomEvent('cart:change', { detail: { cart: cartJson, curvs: true } }));\n    }\n  }\n\n  function changeLine(key, quantity, maxKnown) {\n    setLoading(true);\n    fetch(routesRoot() + 'cart/change.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ id: key, quantity: quantity })\n    })\n      .then(function (res) {\n        if (res.ok) {\n          delete S.lineErrors[key];\n          return res.json().then(function (cart) { announceCartChanged(cart); braDealReset(cart); });\n        }\n        return res.json().catch(function () { return {}; }).then(function (body) {\n          // Stock-copy discipline: only ever state a remaining count below 10.\n          var c = cfg();\n          var msg;\n          if (maxKnown && maxKnown < 10 && c.urgencyTemplate) {\n            msg = c.urgencyTemplate.replace('{count}', maxKnown);\n          } else {\n            // Shopify names the real problem (\"You can only add 2 of this item\u2026\").\n            // That is always more useful than the generic string.\n            msg = (body && body.description) ||\n              (c.qa && c.qa.genericError) || 'Something went wrong. Please try again.';\n          }\n          setLoading(false);\n          setLineError(key, msg);\n        });\n      })\n      .catch(function () {\n        setLoading(false);\n        var c = cfg();\n        setLineError(key, (c.qa && c.qa.genericError) || 'Something went wrong. Please try again.');\n      });\n  }\n\n  /* ---- quick-add sheet ----------------------------------------------------- */\n  /* opts.mode 'color' turns the sheet into a colour picker for one cart line:\n     S.qa.size then holds the picked COLOUR, the size is fixed to opts.size,\n     and confirm swaps the line instead of adding (Ron 2026-09-08). */\n  function openQa(handle, sale, opts) {\n    if (!handle) return;\n    var q = qaEl();\n    if (!q) return;\n    opts = opts || {};\n    S.qa = { handle: handle, product: null, size: opts.mode === 'color' ? (opts.color || '') : '',\n             oneSize: false, busy: false, sale: sale || { pct: 0, fixed: 0 },\n             mode: opts.mode || 'size', fixedSize: opts.size || '',\n             lineKey: opts.lineKey || null, lineProps: opts.props || null,\n             swatches: opts.swatches || null, lineQty: opts.qty || 1 };\n    rememberFocus();\n    q.classList.add('is-open');\n    q.setAttribute('aria-hidden', 'false');\n    syncScrollLock();\n    resetQaUi();\n    focusInto('[data-cv-qa-close]');\n    fetch(routesRoot() + 'products/' + encodeURIComponent(handle) + '.js')\n      .then(function (res) {\n        if (!res.ok) throw new Error('http ' + res.status);\n        return res.json();\n      })\n      .then(function (product) {\n        if (!S.qa || S.qa.handle !== handle) return;\n        S.qa.product = product;\n        var sizeIdx = qaSizeOptionIndex(product);\n        if (sizeIdx === -1) {\n          S.qa.oneSize = true;\n        }\n        renderQa();\n      })\n      .catch(function () {\n        if (!S.qa || S.qa.handle !== handle) return;\n        var c = cfg();\n        showQaError((c.qa && c.qa.genericError) || 'Something went wrong. Please try again.');\n        var spinner = document.querySelector('[data-cv-qa-spinner]');\n        if (spinner) spinner.remove();\n        renderQaFailed(handle);\n      });\n  }\n\n  /* No product loaded = no sizes and an inert CTA. Give the sheet a way out\n     instead of leaving it telling the customer to select a size that is not\n     there: retry the same fetch, or leave for the product page. */\n  function renderQaFailed(handle) {\n    var q = qaEl();\n    if (!q) return;\n    var c = cfg();\n    var sizes = q.querySelector('[data-cv-qa-sizes]');\n    if (sizes) {\n      sizes.hidden = false;\n      sizes.innerHTML = '';\n      var retry = document.createElement('button');\n      retry.type = 'button';\n      retry.className = 'cv-qa__retry';\n      retry.setAttribute('data-cv-qa-retry', handle);\n      retry.textContent = (c.qa && c.qa.retry) || 'Try again';\n      sizes.appendChild(retry);\n      var link = document.createElement('a');\n      link.className = 'cv-qa__retry-link';\n      link.href = routesRoot() + 'products/' + encodeURIComponent(handle);\n      link.textContent = (c.qa && c.qa.viewProduct) || 'View the product page';\n      sizes.appendChild(link);\n    }\n    var sizeLabel = q.querySelector('.cv-qa__size-label');\n    if (sizeLabel) sizeLabel.hidden = true;\n    var cta = q.querySelector('[data-cv-qa-confirm]');\n    if (cta) {\n      cta.textContent = (c.qa && c.qa.unavailable) || 'UNAVAILABLE';\n      cta.classList.remove('is-busy');\n      cta.setAttribute('aria-disabled', 'true');\n    }\n  }\n\n  function closeQa() {\n    var q = qaEl();\n    if (!q || !q.classList.contains('is-open')) return;\n    q.classList.remove('is-open');\n    q.setAttribute('aria-hidden', 'true');\n    S.qa = null;\n    syncScrollLock();\n    restoreFocus();\n  }\n\n  function resetQaUi() {\n    var q = qaEl();\n    if (!q) return;\n    var c = cfg();\n    var img = q.querySelector('[data-cv-qa-img]');\n    if (img) { img.hidden = true; img.removeAttribute('src'); img.alt = ''; }\n    setText(q, '[data-cv-qa-name]', '');\n    setText(q, '[data-cv-qa-price]', '');\n    var was = q.querySelector('[data-cv-qa-was]');\n    if (was) was.hidden = true;\n    setText(q, '[data-cv-qa-size-name]', (c.qa && c.qa.sizePlaceholder) || 'Select');\n    var sizes = q.querySelector('[data-cv-qa-sizes]');\n    if (sizes) {\n      sizes.hidden = false;\n      sizes.innerHTML = '<span class=\"cv-qa__spinner\" data-cv-qa-spinner><span></span></span>';\n    }\n    var sizeLabel = q.querySelector('.cv-qa__size-label');\n    if (sizeLabel) sizeLabel.hidden = false;\n    hideQaError();\n    var cta = q.querySelector('[data-cv-qa-confirm]');\n    if (cta) {\n      cta.textContent = (c.qa && c.qa.selectSize) || 'SELECT A SIZE';\n      cta.classList.remove('is-busy');\n      cta.removeAttribute('aria-disabled'); // clears a previous failed-load state\n    }\n  }\n\n  function setText(scope, selector, text) {\n    var node = scope.querySelector(selector);\n    if (node) node.textContent = text;\n  }\n  function showQaError(message) {\n    var q = qaEl();\n    if (!q) return;\n    var box = q.querySelector('[data-cv-qa-error]');\n    if (box) {\n      box.hidden = false;\n      setText(box, '[data-cv-qa-error-text]', message);\n    }\n  }\n  function hideQaError() {\n    var q = qaEl();\n    if (!q) return;\n    var box = q.querySelector('[data-cv-qa-error]');\n    if (box) box.hidden = true;\n  }\n\n  // Index of the size option in product.options (product.js returns an array\n  // of option name strings). -1 = no size dimension (one-size product).\n  function qaSizeOptionIndex(product) {\n    var options = product.options || [];\n    for (var i = 0; i < options.length; i++) {\n      var name = typeof options[i] === 'string' ? options[i] : (options[i] && options[i].name) || '';\n      if (/size/i.test(name)) return i;\n    }\n    if (options.length === 1) {\n      var only = typeof options[0] === 'string' ? options[0] : (options[0] && options[0].name) || '';\n      var v0 = product.variants && product.variants[0];\n      if (v0 && v0.title === 'Default Title') return -1; // true one-size\n      return 0; // single non-size option still needs a choice \u2014 treat as the pick\n    }\n    return -1;\n  }\n\n  function qaSizeValues(product, sizeIdx) {\n    var seen = {};\n    var values = [];\n    (product.variants || []).forEach(function (v) {\n      var val = v['option' + (sizeIdx + 1)];\n      if (val && !seen[val]) { seen[val] = true; values.push(val); }\n    });\n    return values;\n  }\n  function qaSizeAvailable(product, sizeIdx, value) {\n    return (product.variants || []).some(function (v) {\n      return v['option' + (sizeIdx + 1)] === value && v.available;\n    });\n  }\n  function qaSelectedVariant() {\n    if (!S.qa || !S.qa.product) return null;\n    var p = S.qa.product;\n    if (S.qa.mode === 'color') {\n      if (!S.qa.size) return null;\n      return (p.variants || []).filter(function (v) {\n        return v.option1 === S.qa.size && v.option2 === S.qa.fixedSize && v.available;\n      })[0] || null;\n    }\n    if (S.qa.oneSize) {\n      var first = (p.variants || []).filter(function (v) { return v.available; })[0];\n      return first || null;\n    }\n    if (!S.qa.size) return null;\n    var idx = qaSizeOptionIndex(p);\n    var match = (p.variants || []).filter(function (v) {\n      return v['option' + (idx + 1)] === S.qa.size && v.available;\n    })[0];\n    return match || null;\n  }\n\n  function renderQa() {\n    var q = qaEl();\n    if (!q || !S.qa || !S.qa.product) return;\n    var c = cfg();\n    var p = S.qa.product;\n\n    var img = q.querySelector('[data-cv-qa-img]');\n    var src = (p.images && p.images[0]) || p.featured_image || '';\n    if (img && src) {\n      img.src = src + (src.indexOf('?') > -1 ? '&' : '?') + 'width=300';\n      img.alt = (p.title || '').replace(/\\s*\\(Special Offer\\)/i, '');\n      img.hidden = false;\n    }\n    /* the unlisted offer twin is titled \"\u2026 (Special Offer)\" in admin; customers see the plain name */\n    setText(q, '[data-cv-qa-name]', (p.title || '').replace(/\\s*\\(Special Offer\\)/i, ''));\n\n    var variant = qaSelectedVariant();\n    var priceCents = variant ? variant.price : p.price;\n    var compareCents = variant ? variant.compare_at_price : p.compare_at_price;\n\n    /* Same order of precedence as snippets/curvs-price.liquid: a real compare_at\n       wins, otherwise the metafield convention passed in from the row. Kept in\n       step with that snippet deliberately \u2014 two answers to \"what does this cost\"\n       in one drawer is the bug this is fixing. */\n    var sale = (S.qa && S.qa.sale) || { pct: 0, fixed: 0 };\n    if (!(compareCents && compareCents > priceCents)) {\n      if (sale.fixed > 0 && sale.fixed < priceCents) {\n        compareCents = priceCents;\n        priceCents = priceCents - sale.fixed;\n      } else if (sale.pct > 0) {\n        compareCents = priceCents;\n        priceCents = Math.round(priceCents * (100 - sale.pct) / 100);\n      }\n    }\n    setText(q, '[data-cv-qa-price]', money(priceCents));\n\n    var saveEl = q.querySelector('[data-cv-qa-save]');\n    if (saveEl) {\n      if (compareCents && compareCents > priceCents) {\n        saveEl.textContent = 'Save ' + Math.round((compareCents - priceCents) * 100 / compareCents) + '%';\n        saveEl.hidden = false;\n      } else {\n        saveEl.hidden = true;\n      }\n    }\n    var was = q.querySelector('[data-cv-qa-was]');\n    if (was) {\n      if (compareCents && compareCents > priceCents) {\n        was.textContent = money(compareCents);\n        was.hidden = false;\n      } else {\n        was.hidden = true;\n      }\n    }\n\n    var sizesBox = q.querySelector('[data-cv-qa-sizes]');\n    var sizeLabel = q.querySelector('.cv-qa__size-label');\n    if (sizeLabel && sizeLabel.firstChild && !S.qaSizeLabelText) S.qaSizeLabelText = sizeLabel.firstChild.nodeValue;\n    if (S.qa.mode === 'color') {\n      /* a free line stays free \u2014 never quote the unit price here */\n      setText(q, '[data-cv-qa-price]', 'FREE');\n      if (was) was.hidden = true;\n      if (saveEl) saveEl.hidden = true;\n      if (sizeLabel) { sizeLabel.hidden = false; if (sizeLabel.firstChild) sizeLabel.firstChild.nodeValue = 'Colour: '; }\n      setText(q, '[data-cv-qa-size-name]', S.qa.size || 'Select');\n      if (sizesBox) {\n        sizesBox.hidden = false;\n        sizesBox.innerHTML = '';\n        var seenC = {}, colours = [];\n        (p.variants || []).forEach(function (v) {\n          if (v.option2 !== S.qa.fixedSize || seenC[v.option1]) return;\n          seenC[v.option1] = true;\n          colours.push({ name: v.option1, ok: !!v.available });\n        });\n        /* round swatches (Ron): styles resolved server-side by curvs-swatch-style\n           and carried on the link; names only when no style is known */\n        var sw = S.qa.swatches || {};\n        sizesBox.classList.add('is-swatches');\n        sizesBox.style.gridTemplateColumns = '';\n        colours.forEach(function (col) {\n          var cb = document.createElement('button');\n          cb.type = 'button';\n          var style = sw[col.name];\n          cb.className = (style ? 'cv-qa__swatch' : 'cv-qa__size') + (col.ok ? '' : ' is-out') + (S.qa.size === col.name ? ' is-on' : '');\n          cb.setAttribute('data-cv-qa-size', col.name);\n          cb.setAttribute('title', col.name);\n          cb.setAttribute('aria-label', col.name);\n          if (!col.ok) cb.setAttribute('aria-disabled', 'true');\n          if (style) { var dot = document.createElement('span'); dot.setAttribute('style', style); cb.appendChild(dot); }\n          else { cb.textContent = col.name; }\n          sizesBox.appendChild(cb);\n        });\n      }\n    } else if (S.qa.oneSize) {\n      if (sizesBox) sizesBox.hidden = true;\n      if (sizeLabel) sizeLabel.hidden = true;\n    } else {\n      var idx = qaSizeOptionIndex(p);\n      if (sizesBox) { sizesBox.classList.remove('is-swatches'); sizesBox.style.gridTemplateColumns = ''; }\n      if (sizeLabel && sizeLabel.firstChild && S.qaSizeLabelText) sizeLabel.firstChild.nodeValue = S.qaSizeLabelText;\n      setText(q, '[data-cv-qa-size-name]', S.qa.size || (c.qa && c.qa.sizePlaceholder) || 'Select');\n      if (sizesBox) {\n        sizesBox.hidden = false;\n        sizesBox.innerHTML = '';\n        var sizeValues = qaSizeValues(p, idx);\n        /* the CSS default is five columns; balance the last row the way both PDP\n           templates do, so a 7-size product reads 4 + 3 here too */\n        if (window.Curvs && typeof window.Curvs.sizeCols === 'function') {\n          sizesBox.style.gridTemplateColumns = 'repeat(' + window.Curvs.sizeCols(sizeValues.length) + ', 1fr)';\n        }\n        sizeValues.forEach(function (value) {\n          var soldOut = !qaSizeAvailable(p, idx, value);\n          var btn = document.createElement('button');\n          btn.type = 'button';\n          btn.className = 'cv-qa__size' + (soldOut ? ' is-out' : '') + (S.qa.size === value ? ' is-on' : '');\n          btn.setAttribute('data-cv-qa-size', value);\n          if (soldOut) btn.setAttribute('aria-disabled', 'true');\n          btn.textContent = value;\n          sizesBox.appendChild(btn);\n        });\n      }\n    }\n\n    var cta = q.querySelector('[data-cv-qa-confirm]');\n    if (cta && !S.qa.busy) {\n      var ready = S.qa.oneSize || !!S.qa.size;\n      cta.textContent = ready\n        ? ((c.qa && c.qa.addToBag) || 'ADD TO BAG')\n        : ((c.qa && c.qa.selectSize) || 'SELECT A SIZE');\n      if (S.qa.mode === 'color') cta.textContent = ready ? 'CHANGE COLOUR' : 'SELECT A COLOUR';\n      cta.classList.remove('is-busy');\n    }\n  }\n\n  function confirmQa() {\n    if (!S.qa || S.qa.busy || !S.qa.product) return;\n    var variant = qaSelectedVariant();\n    if (!variant) return; // CTA still reads SELECT A SIZE \u2014 the sizing gate\n    var c = cfg();\n    S.qa.busy = true;\n    var q = qaEl();\n    var cta = q && q.querySelector('[data-cv-qa-confirm]');\n    if (cta) {\n      cta.textContent = (c.qa && c.qa.adding) || 'ADDING\u2026';\n      cta.classList.add('is-busy');\n    }\n    hideQaError();\n    var qaItems = [{ id: variant.id, quantity: 1 }];\n    /* colour mode (Ron 2026-09-08): a swapped unit re-added on its own lands\n       at the TOP of the cart, where Kaching's transform prices it as paid.\n       So the whole bra group is rebuilt with the new variant in the swapped\n       unit's place \u2014 one line per unit, same deal tag \u2014 and Kaching prices\n       the five together again: 2 paid, 3 free. */\n    var qaPre = Promise.resolve();\n    if (S.qa.mode === 'color' && S.qa.lineKey) {\n      var tag = S.qa.lineProps && S.qa.lineProps.__kaching_bundles;\n      qaPre = fetch(routesRoot() + 'cart.js').then(function (r) { return r.json(); }).then(function (cart) {\n        var updates = {}, units = [], swapped = false;\n        (cart.items || []).forEach(function (line) {\n          if (!/bra/i.test(line.product_type || '')) return;\n          updates[line.key] = 0;\n          for (var q = 0; q < line.quantity; q++) {\n            if (line.key === S.qa.lineKey && !swapped) { units.push(variant.id); swapped = true; }\n            else units.push(line.variant_id);\n          }\n        });\n        if (!swapped) units.push(variant.id);\n        qaItems = units.map(function (vid, ui) {\n          var lp = { '__cv_gift': String(ui + 1) };\n          if (tag) lp['__kaching_bundles'] = tag;\n          return { id: parseInt(vid, 10), quantity: 1, properties: lp };\n        });\n        return fetch(routesRoot() + 'cart/update.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ updates: updates })\n        });\n      });\n    }\n    qaPre.then(function () {\n      return fetch(routesRoot() + 'cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ items: qaItems })\n      });\n    })\n      .then(function (res) {\n        if (res.ok) return;\n        // Carry Shopify's own wording (inventory caps name the exact remaining\n        // quantity) into the catch instead of flattening it to the generic line.\n        return res.json().catch(function () { return {}; }).then(function (body) {\n          var err = new Error('add failed');\n          err.description = body && body.description;\n          throw err;\n        });\n      })\n      .then(function () {\n        // The add itself has already succeeded here. Nothing that happens after\n        // this point may present itself to the customer as a failed add, so the\n        // UI is committed now and the cart JSON is fetched separately below.\n        closeQa();\n        announceCartChanged(null); // drawer + header badge both key off this\n        openDrawer();\n        // Impact interop echo only. Its failure is swallowed on purpose: the\n        // drawer refresh above is what actually renders the bag.\n        fetch(routesRoot() + 'cart.js')\n          .then(function (r) { return r.ok ? r.json() : null; })\n          .then(function (cart) {\n            if (cart) {\n              document.dispatchEvent(new CustomEvent('cart:change', { detail: { cart: cart, curvs: true } }));\n            }\n          })\n          .catch(function () {});\n      })\n      .catch(function (err) {\n        if (S.qa) S.qa.busy = false;\n        showQaError(\n          (err && err.description) ||\n          (c.qa && c.qa.genericError) || 'Something went wrong. Please try again.'\n        );\n        renderQa();\n      });\n  }\n\n  /* ---- Kaching bundle properties -------------------------------------------\n     The bra deals (1+1, 2+3) are Kaching BXGY bundles. Kaching applies them by\n     tagging the add with a `__kaching_bundles` line property and letting its\n     cart-transform split the free units out at $0. An add without that property\n     is a plain full-price add \u2014 which is exactly what the drawer's upsell was\n     doing (Ron 2026-09-08).\n\n     The metadata is NOT hardcoded here: deal/version/AB ids rotate whenever the\n     deal is re-saved or an A/B variant flips, and a stale id silently means\n     \"no discount\". Instead we read whatever config Kaching itself published on\n     this page load, so the drawer always tags with the deal that is actually\n     live. No config found -> we return null and the caller adds plainly rather\n     than promising a discount it cannot deliver. */\n  function kachingConfig() {\n    /* Kaching publishes each deal as\n       <script class=\"kaching-bundles-deal-block-settings\" data-product-id=\u2026>.\n       That element only exists on PDPs where its block renders, so the drawer\n       also carries a copy fetched from the bra PDP (see kachingRemoteConfig). */\n    var out = [];\n    Array.prototype.forEach.call(\n      document.querySelectorAll('script.kaching-bundles-deal-block-settings'),\n      function (n) { try { out.push(JSON.parse(n.textContent)); } catch (e) {} }\n    );\n    if (S.kachingCfg) out = out.concat(S.kachingCfg);\n    return out.length ? out : null;\n  }\n\n  /* Fetch the deal config off the bra PDP once per page load, so a drawer add\n     from the homepage or a collection can carry the same deal tag the PDP\n     widget uses. Failure is silent: the caller then adds without a deal tag\n     rather than promising a discount the cart will not honour. */\n  function kachingWarm(handle) {\n    if (!handle || S.kachingCfg) return Promise.resolve();\n    if (S.kachingWarming) return S.kachingWarming;\n    S.kachingWarming = fetch(routesRoot() + 'products/' + encodeURIComponent(handle))\n      .then(function (r) { return r.ok ? r.text() : null; })\n      .then(function (html) {\n        if (!html) return;\n        var doc = new DOMParser().parseFromString(html, 'text/html');\n        var found = [];\n        Array.prototype.forEach.call(\n          doc.querySelectorAll('script.kaching-bundles-deal-block-settings'),\n          function (n) { try { found.push(JSON.parse(n.textContent)); } catch (e) {} }\n        );\n        if (found.length) S.kachingCfg = found;\n      })\n      .catch(function () {})\n      .then(function () { S.kachingWarming = null; });\n    return S.kachingWarming;\n  }\n\n  function kachingProps(productId, barMatcher) {\n    var cfgs = kachingConfig();\n    if (!cfgs) return null;\n    for (var i = 0; i < cfgs.length; i++) {\n      var c = cfgs[i];\n      if (!c || !Array.isArray(c.dealBars)) continue;\n      var ids = c.selectedProductIds || [];\n      if (ids.length && ids.indexOf(Number(productId)) === -1) continue;\n      for (var j = 0; j < c.dealBars.length; j++) {\n        var bar = c.dealBars[j];\n        if (!barMatcher(bar)) continue;\n        var payload = {\n          deal: c.nanoId,\n          pp: Number(productId),\n          main: true,\n          v: c.versionId,\n          id: Math.random().toString(36).slice(2, 6),\n          bid: bar.id\n        };\n        if (c.abTestVariantId) { payload.abid = c.abTestVariantId; payload.ab = c.abTestVariantLetter; }\n        return { '__kaching_bundles': JSON.stringify(payload) };\n      }\n    }\n    return null;\n  }\n\n  /* Deal reset (Ron 2026-09-08): removing a free bra must not leave a half\n     deal behind. When a tagged group no longer holds its buy+get units, the\n     tags come off the remaining bra lines (re-added plain, full price), so\n     the drawer offers the deal afresh instead of a stale group nothing can\n     join. Unknown deals are left alone. */\n  function braDealReset(cart) {\n    if (!cart || !cart.items || S.resetting) return;\n    var braLine = null;\n    cart.items.forEach(function (l) { if (!braLine && /bra/i.test(l.product_type || '') && l.properties && l.properties.__kaching_bundles) braLine = l; });\n    if (!braLine) return;\n    kachingWarm(braLine.handle).then(function () {\n      var cfgs = kachingConfig();\n      if (!cfgs) return;\n      var bars = {};\n      cfgs.forEach(function (c) { (c.dealBars || []).forEach(function (b) { bars[b.id] = b; }); });\n      var groups = {};\n      cart.items.forEach(function (line) {\n        var raw = line.properties && line.properties.__kaching_bundles;\n        if (!raw || !/bra/i.test(line.product_type || '')) return;\n        var tag; try { tag = JSON.parse(raw); } catch (e) { return; }\n        var g = groups[tag.id] || (groups[tag.id] = { units: 0, bid: tag.bid, lines: [] });\n        g.units += line.quantity; g.lines.push(line);\n      });\n      var stale = [];\n      Object.keys(groups).forEach(function (gid) {\n        var g = groups[gid], bar = bars[g.bid];\n        if (!bar) return;\n        var need = (Number(bar.buyQuantity) || 0) + (Number(bar.getQuantity) || 0);\n        if (g.units < need) stale = stale.concat(g.lines);\n      });\n      if (!stale.length) return;\n      S.resetting = true;\n      var updates = {}, items = {};\n      stale.forEach(function (line) { updates[line.key] = 0; items[line.variant_id] = (items[line.variant_id] || 0) + line.quantity; });\n      var plain = Object.keys(items).map(function (vid) { return { id: parseInt(vid, 10), quantity: items[vid] }; });\n      fetch(routesRoot() + 'cart/update.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ updates: updates }) })\n        .then(function () { return fetch(routesRoot() + 'cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ items: plain }) }); })\n        .then(function () { S.resetting = false; announceCartChanged(null); })\n        .catch(function () { S.resetting = false; });\n    });\n  }\n\n  /* Special-offer bodysuit (Ron 2026-09-10): the 2+-pairs slot adds an\n     UNLISTED twin of the bodysuit at its offer price. \"This order only\" is\n     enforced here, not by a discount: after every refresh the cart is read\n     back, and if fewer than two pairs remain the twin is swapped for the\n     regular product in the same variant (and the other way round when a\n     second pair arrives after a regular bodysuit). Handles come off the\n     drawer root; nothing runs when they are unset or identical. */\n  function offerSync() {\n    var w = wrap();\n    if (!w || S.swapping) return;\n    var offer = w.getAttribute('data-cv-offer-handle');\n    var base = w.getAttribute('data-cv-offer-base');\n    if (!offer || !base || offer === base) return;\n    fetch(routesRoot() + 'cart.js')\n      .then(function (res) { return res.json(); })\n      .then(function (cart) {\n        if (!cart || !cart.items) return;\n        var denim = 0, offerLines = [], baseLines = [];\n        cart.items.forEach(function (l) {\n          if (/jeans|denim/i.test(l.product_type || '')) denim += l.quantity;\n          if (l.handle === offer) offerLines.push(l);\n          if (l.handle === base) baseLines.push(l);\n        });\n        var from, to;\n        if (denim < 2 && offerLines.length) { from = offerLines; to = base; }\n        else if (denim >= 2 && baseLines.length) { from = baseLines; to = offer; }\n        else return;\n        S.swapping = true;\n        return fetch(routesRoot() + 'products/' + to + '.js')\n          .then(function (res) { return res.json(); })\n          .then(function (p) {\n            var updates = {}, items = [];\n            from.forEach(function (l) {\n              var match = (p.variants || []).filter(function (v) { return v.title === l.variant_title; })[0];\n              if (!match) return;\n              updates[l.key] = 0;\n              items.push({ id: match.id, quantity: l.quantity });\n            });\n            if (!items.length) throw new Error('no variant match');\n            return fetch(routesRoot() + 'cart/update.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ updates: updates }) })\n              .then(function () { return fetch(routesRoot() + 'cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ items: items }) }); });\n          })\n          .then(function () { S.swapping = false; announceCartChanged(null); })\n          .catch(function () { S.swapping = false; });\n      })\n      .catch(function () {});\n  }\n\n  /* jeans slider chevron: one slide per tap, hidden at the end of the track */\n  document.addEventListener('scroll', function (e) {\n    var tr = e.target;\n    if (!tr || !tr.classList || !tr.classList.contains('cv-cart-up__track')) return;\n    var nb = tr.parentNode && tr.parentNode.querySelector('[data-cv-cart-up-next]');\n    if (nb) nb.classList.toggle('is-end', tr.scrollLeft + tr.clientWidth >= tr.scrollWidth - 4);\n  }, true);\n\n  /* ---- delegated events ----------------------------------------------------- */\n  document.addEventListener('click', function (e) {\n    // CONVENTIONS.md \u00A77 target guard: apps and Shopify's own scripts dispatch\n    // synthetic events straight at `document`, which has no .closest/.matches.\n    var target = e.target;\n    if (!target || typeof target.closest !== 'function') return;\n    var t;\n\n    if (target.closest('[data-cv-cart-close]')) { closeDrawer(); return; }\n    if (target.closest('[data-cv-qa-close]')) { closeQa(); return; }\n\n    // Scrims are dedicated elements behind the panels \u2014 content clicks never land here.\n    if (target.matches('[data-cv-cart-scrim]')) { closeDrawer(); return; }\n    if (target.matches('[data-cv-qa-scrim]')) { closeQa(); return; }\n\n    /* Bra rows: inline colour/size pickers resolve against the row's variant\n       map, so the ADD stays one click. Selection lives on the row's dataset \u2014\n       the drawer re-renders from the server after every cart change, which\n       would drop any JS-side state. */\n    t = target.closest('[data-cv-cart-up-next]');\n    if (t) {\n      var tr = t.parentNode && t.parentNode.querySelector('.cv-cart-up__track');\n      if (tr) tr.scrollBy({ left: 302, behavior: 'smooth' });\n      return;\n    }\n\n    t = target.closest('[data-cv-cart-bra-color]');\n    if (t) {\n      var braRow = t.closest('[data-cv-cart-bra]');\n      if (!braRow) return;\n      var pickColor = t.getAttribute('data-cv-cart-bra-color');\n      braRow.setAttribute('data-color', pickColor);\n      Array.prototype.forEach.call(braRow.querySelectorAll('[data-cv-cart-bra-color]'), function (el) {\n        el.classList.toggle('is-on', el === t);\n      });\n      /* the thumbnail follows the swatch */\n      var imap = {};\n      try { imap = JSON.parse(braRow.getAttribute('data-image-map')) || {}; } catch (err) {}\n      var braImg = braRow.querySelector('[data-cv-cart-bra-img]');\n      if (braImg && imap[pickColor]) braImg.src = imap[pickColor];\n      return;\n    }\n\n    t = target.closest('[data-cv-cart-bra-add]');\n    if (t) {\n      if (t.classList.contains('is-busy')) return;\n      var braVid;\n      var braAddRow = t.closest('[data-cv-cart-bra]');\n      if (t.hasAttribute('data-autoadd')) {\n        /* auto-add banner: her size+colour are already resolved server-side */\n        braVid = parseInt(t.getAttribute('data-variant-id'), 10);\n      } else {\n        if (!braAddRow) return;\n        var braMap = {};\n        try { braMap = JSON.parse(braAddRow.getAttribute('data-variant-map')) || {}; } catch (err) {}\n        braVid = braMap[braAddRow.getAttribute('data-color') + '|' + braAddRow.getAttribute('data-size')];\n      }\n      if (!braVid) {\n        /* the picked pair is sold out \u2014 fall back to the sheet rather than\n           firing an add we know will fail */\n        document.dispatchEvent(new CustomEvent('curvs:quickadd:open', { detail: {\n          handle: t.getAttribute('data-handle')\n        } }));\n        return;\n      }\n      var braQty = parseInt(t.getAttribute('data-qty'), 10) || 1;\n      var braC = cfg();\n      var braOrig = t.textContent;\n      /* Tag the add with the Kaching deal so the free units are actually free.\n         data-buy/data-get say which BXGY bar this row is selling (1+1 or 2+3);\n         the add posts buy+get units together, exactly as the PDP widget does. */\n      var wantBuy = parseInt(t.getAttribute('data-buy'), 10) || 0;\n      var wantGet = parseInt(t.getAttribute('data-get'), 10) || 0;\n      var braProps = null;\n      if (wantBuy && wantGet) {\n        braProps = kachingProps(t.getAttribute('data-product-id'), function (bar) {\n          return bar && bar.dealBarType === 'bxgy' &&\n                 Number(bar.buyQuantity) === wantBuy && Number(bar.getQuantity) === wantGet;\n        });\n      }\n      /* A \"get N free\" add is only free because of the deal tag. Without it\n         the free units would land at full price \u2014 worse than not offering the\n         upgrade \u2014 so the row falls back to the PDP, where the widget applies\n         the deal properly (Ron 2026-09-08: a 3rd bra was landing full price). */\n      if (!braProps && t.hasAttribute('data-require-deal')) {\n        t.classList.remove('is-busy');\n        t.textContent = braOrig;\n        window.location.href = routesRoot() + 'products/' + t.getAttribute('data-handle');\n        return;\n      }\n      var braItems = [];\n      var braFail = function () {\n        t.classList.remove('is-busy');\n        t.textContent = braOrig;\n        document.dispatchEvent(new CustomEvent('curvs:quickadd:open', { detail: {\n          handle: t.getAttribute('data-handle')\n        } }));\n      };\n      var braPost = function () {\n        return fetch(routesRoot() + 'cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ items: braItems })\n        })\n          .then(function (res) { if (res.ok) { announceCartChanged(null); } else { braFail(); } })\n          .catch(function () { t.classList.remove('is-busy'); t.textContent = braOrig; });\n      };\n      t.classList.add('is-busy');\n      t.textContent = (braC.qa && braC.qa.adding) || 'ADDING\u2026';\n      if (t.hasAttribute('data-upgrade')) {\n        /* GROUP REBUILD (Ron 2026-09-08): a drawer add that only appends units\n           starts a NEW Kaching group that never joins the bra she already has,\n           so nothing came out free. Instead every bra line is zeroed and\n           re-added together with the new units under ONE tag \u2014 one item per\n           variant, no extra properties, exactly the payload the PDP widget\n           sends \u2014 and Kaching's cart transform splits the paid and free units\n           into their own lines, which is what lets her recolour each one. */\n        fetch(routesRoot() + 'cart.js')\n          .then(function (r) { return r.json(); })\n          .then(function (cart) {\n            /* one dedicated line per unit (Ron): a per-line marker stops Shopify\n               merging same-variant units, so every bra \u2014 paid or free \u2014 can be\n               recoloured on its own row */\n            var updates = {};\n            var units = [];\n            (cart.items || []).forEach(function (line) {\n              if (!/bra/i.test(line.product_type || '')) return;\n              updates[line.key] = 0;\n              for (var q = 0; q < line.quantity; q++) units.push(line.variant_id);\n            });\n            for (var nq = 0; nq < braQty; nq++) units.push(braVid);\n            units.forEach(function (vid, ui) {\n              var lp = {};\n              if (braProps) { for (var pk in braProps) lp[pk] = braProps[pk]; }\n              lp['__cv_gift'] = String(ui + 1);\n              braItems.push({ id: parseInt(vid, 10), quantity: 1, properties: lp });\n            });\n            return fetch(routesRoot() + 'cart/update.js', {\n              method: 'POST',\n              headers: { 'Content-Type': 'application/json' },\n              body: JSON.stringify({ updates: updates })\n            });\n          })\n          .then(function () { return braPost(); })\n          .catch(braFail);\n        return;\n      }\n      var braItem = { id: braVid, quantity: braQty };\n      if (braProps) braItem.properties = braProps;\n      braItems.push(braItem);\n      braPost();\n      return;\n    }\n\n    /* \"change colour\" on a free line: the quick-add sheet in colour mode */\n    t = target.closest('[data-cv-cart-line-color-open]');\n    if (t) {\n      var cprops = null;\n      try { cprops = JSON.parse(t.getAttribute('data-props') || 'null'); } catch (err) {}\n      var cswatches = null;\n      try { cswatches = JSON.parse(t.getAttribute('data-swatches') || 'null'); } catch (err) {}\n      openQa(t.getAttribute('data-handle'), null, {\n        mode: 'color',\n        swatches: cswatches,\n        qty: parseInt(t.getAttribute('data-qty'), 10) || 1,\n        size: t.getAttribute('data-size'),\n        color: t.getAttribute('data-color'),\n        lineKey: t.getAttribute('data-line-key'),\n        props: cprops\n      });\n      return;\n    }\n\n    /* One-click upsell add: the row carries the variant id already matched to\n       the bag's size in Liquid. On a refusal (inventory cap etc.) fall back to\n       the quick-add sheet, which explains itself. */\n    t = target.closest('[data-cv-cart-direct-add]');\n    if (t) {\n      if (t.classList.contains('is-busy')) return;\n      var directVid = parseInt(t.getAttribute('data-variant-id'), 10);\n      if (!directVid) return;\n      var directC = cfg();\n      var directOrig = t.textContent;\n      t.classList.add('is-busy');\n      t.textContent = (directC.qa && directC.qa.adding) || 'ADDING\u2026';\n      fetch(routesRoot() + 'cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ items: [{ id: directVid, quantity: 1 }] })\n      })\n        .then(function (res) {\n          if (res.ok) {\n            announceCartChanged(null); // refresh re-renders the drawer, slots recompute\n            return;\n          }\n          t.classList.remove('is-busy');\n          t.textContent = directOrig;\n          document.dispatchEvent(new CustomEvent('curvs:quickadd:open', { detail: {\n            handle: t.getAttribute('data-handle')\n          } }));\n        })\n        .catch(function () {\n          t.classList.remove('is-busy');\n          t.textContent = directOrig;\n        });\n      return;\n    }\n\n    t = target.closest('[data-cv-cart-qa-open]');\n    if (t) {\n      document.dispatchEvent(new CustomEvent('curvs:quickadd:open', { detail: {\n        handle: t.getAttribute('data-handle'),\n        /* the store's display-pricing numbers, rendered by curvs-sale on the row.\n           product.js carries no metafields, so without these the sheet quoted the\n           raw price while the row beside it showed the discounted one. */\n        salePct: parseInt(t.getAttribute('data-sale-pct'), 10) || 0,\n        saleFixed: parseInt(t.getAttribute('data-sale-fixed'), 10) || 0\n      } }));\n      return;\n    }\n\n    t = target.closest('[data-cv-qa-retry]');\n    if (t) { openQa(t.getAttribute('data-cv-qa-retry')); return; }\n\n    t = target.closest('[data-cv-qa-size]');\n    if (t) {\n      if (!t.classList.contains('is-out') && S.qa) {\n        S.qa.size = t.getAttribute('data-cv-qa-size');\n        renderQa();\n      }\n      return;\n    }\n    if (target.closest('[data-cv-qa-confirm]')) { confirmQa(); return; }\n\n    t = target.closest('[data-cv-cart-inc], [data-cv-cart-dec], [data-cv-cart-remove]');\n    if (t) {\n      if (S.loading) return;\n      var line = t.closest('[data-cv-cart-line]');\n      if (!line) return;\n      var key = line.getAttribute('data-line-key');\n      var qty = parseInt(line.getAttribute('data-cv-qty'), 10) || 1;\n      var max = parseInt(line.getAttribute('data-cv-max'), 10) || 0;\n      if (t.hasAttribute('data-cv-cart-remove')) { changeLine(key, 0, max); return; }\n      if (t.hasAttribute('data-cv-cart-inc')) {\n        if (max && qty >= max) return; // clamp silently, like the prototype\n        changeLine(key, qty + 1, max);\n        return;\n      }\n      // minus at qty 1 removes the line (Ron 2026-09-08)\n      changeLine(key, qty - 1, max);\n      return;\n    }\n  });\n\n  /* ---- keyboard: ESC closes topmost layer; Tab is trapped for real ---------- */\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape') {\n      if (qaOpen()) { closeQa(); e.stopPropagation(); }\n      else if (drawerOpen()) { closeDrawer(); e.stopPropagation(); }\n      return;\n    }\n    if (e.key !== 'Tab') return;\n    var container = null;\n    if (qaOpen()) {\n      var q = qaEl();\n      container = q && q.querySelector('.cv-qa__sheet');\n    } else if (drawerOpen()) {\n      container = document.querySelector('[data-cv-cart-panel]');\n    }\n    if (!container) return;\n    var focusables = Array.prototype.slice.call(\n      container.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')\n    ).filter(function (el) { return el.offsetParent !== null; });\n    if (!focusables.length) { e.preventDefault(); return; }\n    var first = focusables[0];\n    var last = focusables[focusables.length - 1];\n    var active = document.activeElement;\n    // active === container: the dialog itself holds focus right after opening.\n    if (!container.contains(active) || active === container) {\n      e.preventDefault();\n      (e.shiftKey ? last : first).focus();\n    } else if (e.shiftKey && active === first) {\n      e.preventDefault();\n      last.focus();\n    } else if (!e.shiftKey && active === last) {\n      e.preventDefault();\n      first.focus();\n    }\n  });\n\n  /* ---- public contract events ------------------------------------------------ */\n  /* a bra upsell row on screen means a bra deal may be one click away */\n  function warmFromRows() {\n    var row = document.querySelector('[data-cv-cart-bra-add][data-buy]');\n    if (row && parseInt(row.getAttribute('data-buy'), 10) > 0) {\n      kachingWarm(row.getAttribute('data-handle'));\n    }\n  }\n  document.addEventListener('touchstart', function (e) {\n    if (e.target && typeof e.target.closest === 'function' && e.target.closest('[data-cv-cart]')) S.touching = true;\n  }, { passive: true });\n  var touchDone = function () {\n    S.touching = false;\n    if (S.pendingPaint) { var fn = S.pendingPaint; S.pendingPaint = null; fn(); }\n  };\n  document.addEventListener('touchend', touchDone, { passive: true });\n  document.addEventListener('touchcancel', touchDone, { passive: true });\n  document.addEventListener('curvs:cart:open', function () { openDrawer(); warmFromRows(); });\n\n  /* ---- Cart trigger on markets that keep Impact's header ----------------------\n     The CURVS header carries [data-cv-hdr-cart] and its own JS. NL/DE/EU render\n     IMPACT's header, whose cart link opens Impact's drawer through\n     aria-controls=\"cart-drawer\" \u2014 a section we disable, so the click fell through\n     to /cart (Ron 2026-09-12). Claim any link pointing at the cart page, but only\n     while this drawer is actually on the page, and never on /cart itself so the\n     page stays reachable.\n  ---------------------------------------------------------------------------- */\n  document.addEventListener('click', function (e) {\n    if (!e.target || typeof e.target.closest !== 'function') return;\n    if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button) return;\n    var a = e.target.closest('a[href]');\n    if (!a) return;\n    if (a.hasAttribute('data-cv-hdr-cart')) return;      // CURVS header handles its own\n    if (a.closest('[data-cv-cart]')) return;             // links inside the drawer\n    var path = (a.getAttribute('href') || '').split('?')[0].replace(/\\/$/, '');\n    if (!/(^|\\/)cart$/.test(path)) return;              // /cart, /nl/cart, /de/cart\n    if (/(^|\\/)cart$/.test(window.location.pathname.replace(/\\/$/, ''))) return;\n    if (!wrap()) return;                                 // no CURVS drawer here\n    e.preventDefault();\n    openDrawer();\n    warmFromRows();\n    refresh();\n  });\n  document.addEventListener('curvs:cart:changed', function () {\n    refresh();\n    window.setTimeout(warmFromRows, 1200); // after the section swap paints\n  });\n  document.addEventListener('curvs:quickadd:open', function (e) {\n    var d = e.detail || {};\n    openQa(d.handle, { pct: d.salePct || 0, fixed: d.saleFixed || 0 });\n  });\n\n  /* ---- Impact 7.2 interop ----------------------------------------------------- */\n  document.addEventListener('cart:change', function (e) {\n    if (e.detail && e.detail.curvs) return; // our own echo \u2014 refresh already ran\n    refresh();\n  });\n  document.addEventListener('variant:add', function (e) {\n    if (e.detail && e.detail.blockCartDrawerOpening) return;\n    // Match stock CartDrawer: only auto-open when the theme cart type is drawer.\n    var tv = window.themeVariables;\n    if (tv && tv.settings && tv.settings.cartType && tv.settings.cartType !== 'drawer') return;\n    openDrawer(); // stock product forms open the drawer, matching stock behavior\n  });\n  document.addEventListener('cart:refresh', function () { refresh(); });\n  window.addEventListener('pageshow', function (e) {\n    if (e.persisted) refresh(); // bfcache restore \u2014 resync the drawer\n  });\n\n  /* ---- theme editor: preview the drawer when its section is selected --------- */\n  if (window.Shopify && window.Shopify.designMode) {\n    document.addEventListener('shopify:section:select', function (e) {\n      if (e.target && e.target.querySelector && e.target.querySelector('[data-cv-cart]')) openDrawer();\n    });\n    document.addEventListener('shopify:section:deselect', function (e) {\n      if (e.target && e.target.querySelector && e.target.querySelector('[data-cv-cart]')) closeDrawer();\n    });\n  }\n})();\n"],
  "mappings": "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",
  "names": ["q", "line"]
}
