{
  "version": 3,
  "sources": ["/cdn/shop/t/54/assets/luv-cart-editorial.js"],
  "sourcesContent": ["/* =====================================================================\n   LUV SECRET : CART EDITORIAL CONTROLLER\n   - Smart cross-sell: shows recommended heroes ONLY when contextually useful\n   - Mobile bottom sheet: scroll lock + slide animations\n   - Cart drawer attribute tagging: sets cart attribute when candle is added\n   - Hardened: idempotent, single-instance, no DOM thrash\n   ===================================================================== */\n/* cart v2 : reward messaging, unlocked benefits, bfcache fix, arrival dates */\n(function () {\n  'use strict';\n\n  if (window.__LUV_CART_EDITORIAL_INIT__) return;\n  window.__LUV_CART_EDITORIAL_INIT__ = true;\n\n  // ---------- Config ----------\n  var XSELL_HANDLES = [\n    'the-jelly-prebiotic-hydration-serum',\n    'the-restore-blemish-care-moisturiser',\n    'the-soft-reset-retinol-alternative-serum',\n    'the-tone-kojic-brightening-face-cream',\n    'the-cover-cc-ceramide-stick'\n  ];\n  var BRIDGE_THRESHOLD = 1500; // \u00A315 in cents : if within this of next threshold, surface cross-sells\n\n  // ---------- Utilities ----------\n  function refreshCart() {\n    return fetch('/cart.js', { credentials: 'same-origin', headers: { Accept: 'application/json' } })\n      .then(function (r) { return r.json(); });\n  }\n\n  function thresholds() {\n    if (window.LuvRewards && window.LuvRewards.thresholds) return window.LuvRewards.thresholds();\n    return { ship: 7500, candle: 12000, cart10: 18000 };\n  }\n\n  function currencySymbol() {\n    var c = (window.Shopify && Shopify.currency && Shopify.currency.active) || 'GBP';\n    return c === 'USD' ? '$' : (c === 'EUR' ? '\\u20AC' : '\\u00A3');\n  }\n\n  function nonCandleSubtotal(cart) {\n    if (window.LuvCandlePicker && window.LuvCandlePicker.nonCandleSubtotal) {\n      return window.LuvCandlePicker.nonCandleSubtotal(cart);\n    }\n    // v3.4 (2026-06-04) : a paid candle counts toward the ladder. Only the FREE\n    // BOGOS candle line (final_line_price === 0) is excluded from the subtotal\n    // used to evaluate reward thresholds. Otherwise a customer adding a paid \u00A329\n    // candle would see the ladder drop instead of advance.\n    var sum = 0;\n    (cart.items || []).forEach(function (it) {\n      var isCandle = (it.handle || '').indexOf('candle') !== -1 ||\n                     (it.product_type || '').toLowerCase() === 'candle';\n      var finalPx = (it.final_line_price != null ? it.final_line_price :\n                    (it.line_price != null ? it.line_price : it.original_line_price || 0));\n      if (isCandle && finalPx === 0) {\n        // free BOGOS candle : skip\n        return;\n      }\n      sum += finalPx;\n    });\n    return sum;\n  }\n\n  // ---------- Product cache ----------\n  var productCache = {};\n  function loadProduct(handle) {\n    if (productCache[handle]) return Promise.resolve(productCache[handle]);\n    return fetch('/products/' + handle + '.js', { credentials: 'same-origin' })\n      .then(function (r) { return r.ok ? r.json() : null; })\n      .then(function (p) { if (p) productCache[handle] = p; return p; })\n      .catch(function () { return null; });\n  }\n\n  function loadAllProducts() {\n    return Promise.all(XSELL_HANDLES.map(loadProduct)).then(function (arr) {\n      return arr.filter(function (p) { return p && p.available; });\n    });\n  }\n\n  // ---------- Cross-sell logic ----------\n  function pickCrossSells(cart, products) {\n    var inCart = {};\n    (cart.items || []).forEach(function (it) { inCart[it.handle] = true; });\n    var sub = nonCandleSubtotal(cart);\n    var t = thresholds();\n\n    var candidates = products.filter(function (p) { return !inCart[p.handle]; });\n    if (!candidates.length) return [];\n\n    // Contextual logic:\n    // 1. If only 1 hero in cart : surface another to unlock \"second 30% off\"\n    // 2. If within \u00A315 of next threshold : surface affordable options\n    // 3. If 2+ heroes and above \u00A3120 : show one premium add-on (gentle, no nudge)\n    // Limit to 3 cards.\n    return candidates.slice(0, 3);\n  }\n\n  function shouldShowXsell(cart) {\n    if (!cart || cart.item_count === 0) return false;\n    var sub = nonCandleSubtotal(cart);\n    var t = thresholds();\n    // Always show if below candle threshold OR if 1 hero only\n    if (sub < t.candle) return true;\n    // After candle, only show if exactly 1 cart item\n    return cart.item_count === 1;\n  }\n\n  function xsellHeading(cart) {\n    var sub = nonCandleSubtotal(cart);\n    var t = thresholds();\n    if (sub < t.ship) {\n      var diff = Math.ceil((t.ship - sub) / 100);\n      return { title: 'You may also love', sub: currencySymbol() + diff + ' away from Complimentary Shipping' };\n    }\n    if (sub < t.candle) {\n      var diff2 = Math.ceil((t.candle - sub) / 100);\n      return { title: 'Complete your ritual', sub: currencySymbol() + diff2 + ' away from Complimentary Candle' };\n    }\n    if (sub < t.cart10) {\n      var diff3 = Math.ceil((t.cart10 - sub) / 100);\n      return { title: 'One more step', sub: currencySymbol() + diff3 + ' away from 10% OVESSI Reward' };\n    }\n    return { title: 'You may also love', sub: 'Curated for your ritual' };\n  }\n\n  function renderXsell(cart) {\n    // v6 : server-side luv-xsell.liquid renders inside the host. If the host already\n    // contains our server-side .luv-xsell node, leave it alone (do not double-render).\n    var hosts = document.querySelectorAll('[data-luv-xsell-host]');\n    if (!hosts.length) return Promise.resolve();\n    var anyServerRendered = false;\n    hosts.forEach(function (h) { if (h.querySelector('.luv-xsell')) anyServerRendered = true; });\n    if (anyServerRendered) {\n      hosts.forEach(function (h) { h.hidden = false; });\n      return Promise.resolve();\n    }\n    if (!shouldShowXsell(cart)) {\n      hosts.forEach(function (h) { h.innerHTML = ''; h.hidden = true; });\n      return Promise.resolve();\n    }\n    return loadAllProducts().then(function (products) {\n      var picks = pickCrossSells(cart, products);\n      if (!picks.length) {\n        hosts.forEach(function (h) { h.innerHTML = ''; h.hidden = true; });\n        return;\n      }\n      var head = xsellHeading(cart);\n      var html =\n        '<div class=\"luv-cart-xsell\">' +\n          '<h3 class=\"luv-cart-xsell__title\">' + escapeHtml(head.title) + '</h3>' +\n          '<p class=\"luv-cart-xsell__sub\">' + escapeHtml(head.sub) + '</p>' +\n          '<div class=\"luv-cart-xsell__strip\">' +\n            picks.map(function (p) { return cardHtml(p); }).join('') +\n          '</div>' +\n        '</div>';\n      hosts.forEach(function (h) { h.innerHTML = html; h.hidden = false; });\n    });\n  }\n\n  function cardHtml(p) {\n    var v = (p.variants && p.variants[0]) || null;\n    if (!v) return '';\n    var img = (p.featured_image || (p.images && p.images[0]) || '');\n    if (img && img.indexOf('http') !== 0) img = 'https:' + img;\n    var price = formatCents(v.price);\n    var name = (p.title || '').split(':')[0].trim();\n    return (\n      '<div class=\"luv-cart-xsell__card\">' +\n        '<a href=\"/products/' + p.handle + '\" tabindex=\"-1\" style=\"display:block;\">' +\n          '<img class=\"luv-cart-xsell__img\" src=\"' + (img || '') + '\" alt=\"' + escapeHtml(p.title) + '\" loading=\"lazy\" />' +\n        '</a>' +\n        '<div class=\"luv-cart-xsell__name\">' + escapeHtml(name) + '</div>' +\n        '<div class=\"luv-cart-xsell__price\">' + price + '</div>' +\n        '<button class=\"luv-cart-xsell__add\" type=\"button\" data-luv-xsell-add=\"' + v.id + '\">Add to ritual</button>' +\n      '</div>'\n    );\n  }\n\n  function formatCents(cents) {\n    var c = currencySymbol();\n    var amt = (cents / 100);\n    var s = (Math.round(amt * 100) / 100).toFixed(2).replace(/\\.00$/, '');\n    return c + s;\n  }\n\n  function escapeHtml(s) {\n    return String(s || '').replace(/[&<>\"']/g, function (ch) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[ch];\n    });\n  }\n\n  // ---------- Add from cross-sell ----------\n  // PHASE 3 FIX (2026-06-01): harden against any ancestor anchor capturing the click.\n  // The xsell card has a thumbnail anchor and a title anchor (both link to PDP).\n  // The ADD button must NEVER trigger navigation, even if the click event bubbles into a parent.\n  function handleXsellAdd(e) {\n    var btn = e.target.closest('[data-luv-xsell-add]');\n    if (!btn) return;\n    // v5 (2026-06-05): new .luv-xsell__ctarow inline buttons are managed by\n    // assets/luv-xsell.js \u2014 do not intercept here, otherwise spans get clobbered.\n    if (btn.classList && btn.classList.contains('luv-xsell__ctarow')) return;\n    // Block any default navigation immediately. Use stopImmediatePropagation so no later capture-phase\n    // listener on document or ancestor anchors can intervene.\n    if (typeof e.preventDefault === 'function') e.preventDefault();\n    if (typeof e.stopImmediatePropagation === 'function') e.stopImmediatePropagation();\n    e.stopPropagation();\n    // Belt-and-braces : if any ancestor link is mid-handling, neutralise it for this tick.\n    var anc = btn.closest('a[href]');\n    if (anc) { anc.setAttribute('data-luv-disabled-once', '1'); }\n    var vidAttr = btn.getAttribute('data-luv-xsell-add');\n    var vid = parseInt(vidAttr, 10);\n    if (!vid) {\n      vid = parseInt(btn.getAttribute('data-variant-id'), 10);\n    }\n    if (!vid) {\n      var hostCard = btn.closest('[data-handle]');\n      if (hostCard) {\n        var hostV = hostCard.querySelector('[data-variant-id]');\n        if (hostV) vid = parseInt(hostV.getAttribute('data-variant-id'), 10);\n      }\n    }\n    if (!vid) return;\n    // v3 : ADD \u2192 ADDING \u2192 ADDED \u2713 state machine with double-click guard (CRO brief section 2)\n    var textEl = btn.querySelector('.luv-xsell__add-text') || btn;\n    var origText = textEl.textContent;\n    var labelAdd = btn.getAttribute('data-label-add') || origText || 'Add';\n    var labelAdding = btn.getAttribute('data-label-adding') || 'Adding';\n    var labelAdded = btn.getAttribute('data-label-added') || 'Added';\n    if (btn.dataset.state === 'adding' || btn.dataset.state === 'added') return;\n    btn.dataset.state = 'adding';\n    btn.disabled = true;\n    btn.setAttribute('aria-disabled', 'true');\n    textEl.textContent = labelAdding;\n    // Capture pre-add cart state to detect empty-to-populated transition\n    var preAddItemCount = (window.__luvCart && window.__luvCart.item_count) || 0;\n    var onCartPage = !!document.querySelector('.template-cart, #main-cart-items, body.template-cart');\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n      body: JSON.stringify({ items: [{ id: vid, quantity: 1 }] })\n    })\n    .then(function (r) { return r.json(); })\n    .then(function () { return refreshCart(); })\n    .then(function (cart) {\n      window.__luvCart = cart;\n      document.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }));\n      // Refresh cart drawer sections so new line appears\n      if (window.LuvCandlePicker && window.LuvCandlePicker.refresh) {\n        window.LuvCandlePicker.refresh();\n      }\n      // ADDED state\n      btn.dataset.state = 'added';\n      textEl.textContent = labelAdded + ' \u2713';\n      // FIX v2.1 : empty-cart-on-cart-page transition\n      // When cart was empty and we're on /cart, the page rendered the empty-cart UI (luv-cart-empty)\n      // not the items table. Section-swap won't reveal the items table until full page reload.\n      // Reload after a short delay so the ADDED check has visible feedback first.\n      // PHASE 4 FIX: empty-cart on /cart page \u2014 try section-swap FIRST.\n      // Only fall back to reload if the items table is still missing after swap.\n      if (onCartPage && preAddItemCount === 0) {\n        refreshCartSections().then(function () {\n          renderXsell(cart);\n          refreshRewardMessaging(cart);\n          if (typeof refreshArrival === 'function') refreshArrival();\n          // After swap, verify items table actually rendered. If not (empty cart template\n          // doesn't include the items wrapper), reload as last resort.\n          setTimeout(function () {\n            var hasItems = document.querySelector('#main-cart-items .cart-items, #main-cart-items table.cart-items, .cart-items__row, .cart-item');\n            if (!hasItems) {\n              window.location.reload();\n            }\n          }, 350);\n        }).catch(function () {\n          // section-swap failed entirely \u2192 reload\n          window.location.reload();\n        });\n        return;\n      }\n      // Refresh cart drawer DOM via Dawn's section-render\n      refreshCartSections().then(function () {\n        renderXsell(cart);\n        // FIX v2.1 : re-render reward messaging after section swap (hosts are empty divs in fetched HTML)\n        refreshRewardMessaging(cart);\n        if (typeof refreshArrival === 'function') refreshArrival();\n      });\n      // Auto-revert button after 1.2s if it's still in DOM (xsell may re-render and remove product)\n      setTimeout(function () {\n        if (!document.body.contains(btn)) return;\n        btn.dataset.state = '';\n        btn.disabled = false;\n        btn.removeAttribute('aria-disabled');\n        textEl.textContent = labelAdd;\n      }, 1200);\n    })\n    .catch(function () {\n      btn.dataset.state = '';\n      btn.disabled = false;\n      btn.removeAttribute('aria-disabled');\n      textEl.textContent = labelAdd;\n    });\n  }\n\n  function refreshCartSections() {\n    var hosts = [\n      { id: 'CartDrawer', sel: '#CartDrawer' },\n      { id: 'cart-icon-bubble', sel: '#cart-icon-bubble' },\n      { id: 'main-cart-items', sel: '#main-cart-items .js-contents' },\n      { id: 'main-cart-footer', sel: '#main-cart-footer .js-contents' }\n    ];\n    return Promise.all(hosts.map(function (h) {\n      var el = document.querySelector(h.sel);\n      if (!el) return null;\n      var sectionId = (el.closest('[data-id]') || {}).dataset && (el.closest('[data-id]')).dataset.id;\n      if (!sectionId && el.id === 'CartDrawer') sectionId = 'cart-drawer';\n      if (!sectionId) return null;\n      return fetch('/?section_id=' + encodeURIComponent(sectionId), { credentials: 'same-origin' })\n        .then(function (r) { return r.text(); })\n        .then(function (html) {\n          try {\n            var doc = new DOMParser().parseFromString(html, 'text/html');\n            var src = doc.querySelector(h.sel);\n            if (src && el) {\n              // Re-insert xsell host BEFORE replacement to preserve placement\n              el.innerHTML = src.innerHTML;\n              attachXsellHost();\n            }\n          } catch (e) {}\n        })\n        .catch(function () {});\n    }));\n  }\n\n  // ---------- Inject xsell host into cart drawer + cart page ----------\n  function attachXsellHost() {\n    // Cart drawer: insert between LUV-CART-REWARDS-END and cart-drawer__footer\n    var drawer = document.querySelector('cart-drawer');\n    if (drawer) {\n      var wrap = drawer.querySelector('.luv-cart-rewards-wrap');\n      if (wrap && !drawer.querySelector('[data-luv-xsell-host]')) {\n        var host = document.createElement('div');\n        host.setAttribute('data-luv-xsell-host', 'drawer');\n        host.hidden = true;\n        wrap.parentNode.insertBefore(host, wrap.nextSibling);\n      }\n    }\n    // Cart page\n    var page = document.querySelector('.template-cart #main-cart-items');\n    if (page && !page.parentNode.querySelector('[data-luv-xsell-host]')) {\n      var host2 = document.createElement('div');\n      host2.setAttribute('data-luv-xsell-host', 'page');\n      host2.className = 'page-width';\n      host2.hidden = true;\n      page.parentNode.insertBefore(host2, page);\n    }\n  }\n\n  // ---------- Trust note : DISABLED in v3 (2026-06-01) ----------\n  // The cart drawer reward ladder already shows Complimentary Shipping / Candle / 10% OVESSI Reward\n  // status dynamically (luv-rewards.js). This duplicate footer note used stale terminology and\n  // duplicated shipping messaging (CRO brief section 3). Permanently neutered as a no-op.\n  function attachTrustNote() {\n    // intentional no-op : trust strip now lives in cart-drawer.liquid body beneath reward ladder\n    return;\n  }\n\n  // ---------- Mobile bottom sheet : prevent body scroll when open ----------\n  function watchDrawerOpen() {\n    var drawer = document.querySelector('cart-drawer');\n    if (!drawer) return;\n    var mo = new MutationObserver(function () {\n      var isOpen = drawer.classList.contains('active') || drawer.hasAttribute('open');\n      document.body.classList.toggle('luv-cart-open', isOpen);\n      if (window.matchMedia('(max-width: 749px)').matches) {\n        document.documentElement.style.overflow = isOpen ? 'hidden' : '';\n      }\n    });\n    mo.observe(drawer, { attributes: true, attributeFilter: ['class', 'open'] });\n  }\n\n  // ---------- Add free candle ----------\n  // Free candle threshold : matches Shopify automatic discount minimum (\u00A3120)\n  var FREE_CANDLE_THRESHOLD = 12000;\n\n  function nonCandleSubtotal(cart) {\n    var sub = 0;\n    for (var i = 0; i < cart.items.length; i++) {\n      var it = cart.items[i];\n      var h = (it.handle || '').toLowerCase();\n      var pt = (it.product_type || '').toLowerCase();\n      var isCandle = h.indexOf('candle') !== -1 || pt === 'candle';\n      // Use line_price (pre-discount) so 30%-off-second-hero doesn't push us below \u00A3120 threshold.\n      if (!isCandle) sub += it.line_price || it.final_line_price || 0;\n    }\n    return sub;\n  }\n\n  function handleCandleAdd(e) {\n    var btn = e.target.closest('button[data-luv-candle-item]');\n    if (!btn) return;\n    // only the interactive picker has buttons; preview is divs.\n    e.stopPropagation();\n    if (typeof e.preventDefault === 'function') e.preventDefault();\n    var vid = parseInt(btn.getAttribute('data-variant-id'), 10);\n    if (!vid) return;\n    if (btn.disabled || btn.classList.contains('is-loading')) return;\n    btn.classList.add('is-loading');\n    btn.disabled = true;\n    // Check threshold FIRST : do not add a candle if cart subtotal < \u00A3120,\n    // otherwise Shopify's automatic discount won't apply and the customer gets charged.\n    refreshCart().then(function (cart) {\n      var sub = nonCandleSubtotal(cart);\n      if (sub < FREE_CANDLE_THRESHOLD) {\n        btn.classList.remove('is-loading');\n        btn.disabled = false;\n        // soft inline message\n        var picker = btn.closest('[data-luv-candle-picker]');\n        if (picker) {\n          var msg = picker.querySelector('[data-luv-candle-locked-msg]');\n          if (!msg) {\n            msg = document.createElement('div');\n            msg.setAttribute('data-luv-candle-locked-msg', '');\n            msg.style.cssText = 'margin-top:8px;font-size:12px;color:#8E8780;text-align:center;';\n            picker.appendChild(msg);\n          }\n          var away = Math.ceil((FREE_CANDLE_THRESHOLD - sub) / 100);\n          msg.textContent = 'Spend ' + currencySymbol() + away + ' more to unlock Complimentary Candle';\n          setTimeout(function () { if (msg && msg.parentNode) msg.parentNode.removeChild(msg); }, 4500);\n        }\n        return Promise.reject('threshold');\n      }\n      return cart;\n    }).then(function (cart) {\n      var existingCandle = null;\n      for (var i = 0; i < cart.items.length; i++) {\n        var it = cart.items[i];\n        var h = (it.handle || '').toLowerCase();\n        var pt = (it.product_type || '').toLowerCase();\n        if (h.indexOf('candle') !== -1 || pt === 'candle') {\n          existingCandle = it;\n          break;\n        }\n      }\n      var pre = Promise.resolve();\n      if (existingCandle) {\n        pre = fetch('/cart/change.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ id: existingCandle.key, quantity: 0 })\n        });\n      }\n      return pre.then(function () {\n        return fetch('/cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({\n            items: [{ id: vid, quantity: 1 }]\n          })\n        });\n      });\n    })\n    .then(function () { return refreshCart(); })\n    .then(function (cart) {\n      window.__luvCart = cart;\n      document.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }));\n      refreshCartSections().then(function () {\n        renderXsell(cart);\n      });\n    })\n    .catch(function () {})\n    .then(function () {\n      btn.classList.remove('is-loading');\n      btn.disabled = false;\n    });\n  }\n\n  // ---------- Candle picker lock state ----------\n  function updateCandlePickerLock(cart) {\n    if (!cart) return;\n    var sub = nonCandleSubtotal(cart);\n    var unlocked = sub >= FREE_CANDLE_THRESHOLD;\n    var pickers = document.querySelectorAll('[data-luv-candle-picker][data-luv-candle-picker-mode=\"interactive\"]');\n    pickers.forEach(function (picker) {\n      // Idempotent guard : only touch DOM if state actually needs to change.\n      // Without this guard, mutating the picker re-fires any MutationObserver\n      // watching for DOM changes and creates an infinite update loop.\n      var alreadyUnlocked = picker.classList.contains('is-unlocked');\n      var alreadyLocked = picker.classList.contains('is-locked');\n      var inDesiredState = unlocked ? alreadyUnlocked && !alreadyLocked : alreadyLocked && !alreadyUnlocked;\n      var targetSubText;\n      if (unlocked) {\n        targetSubText = 'One per order';\n      } else {\n        var away = Math.ceil((FREE_CANDLE_THRESHOLD - sub) / 100);\n        targetSubText = 'Spend ' + currencySymbol() + away + ' more to unlock';\n      }\n      var subEl = picker.querySelector('.luv-candle-picker__sub');\n      var subInSync = !subEl || subEl.textContent === targetSubText;\n      if (inDesiredState && subInSync) return;\n      picker.classList.toggle('is-locked', !unlocked);\n      picker.classList.toggle('is-unlocked', unlocked);\n      var btns = picker.querySelectorAll('button[data-luv-candle-item]');\n      btns.forEach(function (b) {\n        var desiredDisabled = !unlocked;\n        if (b.disabled !== desiredDisabled) b.disabled = desiredDisabled;\n        var desiredAria = desiredDisabled ? 'true' : 'false';\n        if (b.getAttribute('aria-disabled') !== desiredAria) b.setAttribute('aria-disabled', desiredAria);\n      });\n      if (subEl && subEl.textContent !== targetSubText) subEl.textContent = targetSubText;\n    });\n  }\n\n  // ---------- Init ----------\n  function init() {\n    attachXsellHost();\n    attachTrustNote();\n    watchDrawerOpen();\n    document.addEventListener('click', handleXsellAdd, true);\n    document.addEventListener('click', handleCandleAdd, true);\n\n    refreshCart().then(function (cart) {\n      window.__luvCart = cart;\n      renderXsell(cart);\n      updateCandlePickerLock(cart);\n    });\n\n    document.addEventListener('cart:updated', function (e) {\n      var cart = e.detail && e.detail.items ? e.detail : (e.detail && e.detail.data) || window.__luvCart;\n      if (cart) {\n        attachXsellHost();\n        attachTrustNote();\n        renderXsell(cart);\n        updateCandlePickerLock(cart);\n      }\n    });\n\n    document.addEventListener('cart:update', function (e) {\n      setTimeout(function () {\n        refreshCart().then(function (cart) {\n          window.__luvCart = cart;\n          attachXsellHost();\n          attachTrustNote();\n          renderXsell(cart);\n          updateCandlePickerLock(cart);\n        });\n      }, 150);\n    });\n\n    // Watch ONLY for picker insertion (childList on a narrow scope), not arbitrary\n    // DOM mutations. We previously observed the whole body subtree which fed back\n    // into itself every time updateCandlePickerLock changed the picker.\n    var pickerObserverScheduled = false;\n    function schedulePickerCheck() {\n      if (pickerObserverScheduled) return;\n      pickerObserverScheduled = true;\n      requestAnimationFrame(function () {\n        pickerObserverScheduled = false;\n        if (window.__luvCart && document.querySelector('[data-luv-candle-picker]')) {\n          updateCandlePickerLock(window.__luvCart);\n        }\n      });\n    }\n    // Observe the cart-drawer host only, not the whole body. Filter to childList\n    // events that add nodes (picker re-render), not attribute toggles we just set.\n    var drawerHost = document.querySelector('cart-drawer');\n    if (drawerHost) {\n      var pickerObserver = new MutationObserver(function (mutations) {\n        for (var i = 0; i < mutations.length; i++) {\n          if (mutations[i].type === 'childList' && mutations[i].addedNodes && mutations[i].addedNodes.length) {\n            schedulePickerCheck();\n            return;\n          }\n        }\n      });\n      pickerObserver.observe(drawerHost, { childList: true, subtree: true });\n    }\n  }\n\n  // v2 drawer override : inject style to ensure cart-drawer-items is a static block\n  function injectDrawerV2Override() {\n    if (document.getElementById('drawer-v2-js-override')) return;\n    var style = document.createElement('style');\n    style.id = 'drawer-v2-js-override';\n    style.textContent = 'cart-drawer cart-drawer-items{flex:0 0 auto !important;display:block !important;overflow:visible !important;height:auto !important;max-height:none !important;}cart-drawer .luv-drawer__body{flex:1 1 0 !important;min-height:0 !important;overflow-y:auto !important;}cart-drawer .drawer__inner{overflow:hidden !important;}';\n    document.head.appendChild(style);\n  }\n  injectDrawerV2Override();\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* LUV bundle grouping: now rendered server-side in cart-drawer.liquid and main-cart-items.liquid */\n\n/* ============================================================\n   OVESSI cart v2 module \u2014 appended 2026-06-01\n   - Dynamic next-reward sentence under estimated total (drawer + page)\n   - Unlocked-benefits block (premium wording, NO discount language)\n   - Arrival-date refresh for [data-luv-arrival] (server-side fallback already in DOM)\n   - bfcache (pageshow.persisted) hard-reset for cart spinner / loading state\n   - Wires \"View Cart\" CTA (no-op enhancement; href works without JS)\n   ============================================================ */\n(function () {\n  'use strict';\n\n  // ---- thresholds (region-aware via Shopify.currency) ----\n  function regionThresholds() {\n    var cur = (window.Shopify && Shopify.currency && Shopify.currency.active) || 'GBP';\n    if (cur === 'USD') return { ship: 7500,  candle: 15000, cart10: 22500, sym: '$', code: 'USD' };\n    if (cur === 'EUR') return { ship: 9000,  candle: 14500, cart10: 21500, sym: '\\u20AC', code: 'EUR' };\n    return                     { ship: 7500,  candle: 12000, cart10: 18000, sym: '\\u00A3', code: 'GBP' };\n  }\n\n  function fmtMoney(cents, sym, code) {\n    var whole = Math.ceil(cents / 100);\n    // EUR : use comma; GBP/USD : dot. Keep no decimals for clean reward msg.\n    if (code === 'EUR') return whole + '\\u00A0' + sym;\n    return sym + whole;\n  }\n\n  // v3.1.2 : round to nearest 5 for the \"worth approximately\" total. This\n  // matches luv-rewards.js formatMoneyApprox() so both surfaces agree.\n  function fmtMoneyApprox(cents, sym, code) {\n    var pounds = Math.round(cents / 100);\n    var rounded = Math.round(pounds / 5) * 5;\n    if (rounded < 5) rounded = 5;\n    if (code === 'EUR') return rounded + '\\u00A0' + sym;\n    return sym + rounded;\n  }\n\n  function nonCandleSubCart(cart) {\n    // v3.1.1 : use original_line_price (pre-discount) so the 10% reward value\n    // matches what the customer sees applied at checkout, AND matches the\n    // amount the rewards bar uses (cart.items_subtotal_price). This keeps\n    // the side-cart ladder and main-cart unlocked card in sync.\n    // v3.4 (2026-06-04) : paid candles count toward the ladder. Only the FREE\n    // BOGOS candle (final_line_price === 0) is excluded.\n    var sum = 0;\n    (cart.items || []).forEach(function (it) {\n      var h = (it.handle || '').toLowerCase();\n      var pt = (it.product_type || '').toLowerCase();\n      var isCandle = h.indexOf('candle') !== -1 || pt === 'candle';\n      var finalPx = (typeof it.final_line_price === 'number') ? it.final_line_price : null;\n      if (isCandle && finalPx === 0) {\n        // free BOGOS candle : skip\n        return;\n      }\n      sum += (it.original_line_price != null ? it.original_line_price : (it.line_price || it.final_line_price || 0));\n    });\n    return sum;\n  }\n\n  function nextRewardSentence(locale, awayCents, tier, sym, code) {\n    var money = fmtMoney(awayCents, sym, code);\n    // tier : 'ship' | 'candle' | 'cart10'\n    var map = {\n      en: {\n        ship:    \"Add \" + money + \" and your ritual ships on us.\",\n        candle:  \"Add \" + money + \" and a quiet candle joins your ritual.\",\n        cart10:  \"Add \" + money + \" and the whole ritual softens by 10%.\"\n      },\n      de: {\n        ship:    \"Noch \" + money + \" und dein Ritual reist auf uns.\",\n        candle:  \"Noch \" + money + \" und eine stille Kerze begleitet dein Ritual.\",\n        cart10:  \"Noch \" + money + \" und das ganze Ritual wird um 10% sanfter.\"\n      },\n      fr: {\n        ship:    \"Ajoutez \" + money + \" et votre rituel voyage offert.\",\n        candle:  \"Ajoutez \" + money + \" et une bougie discr\u00E8te rejoint votre rituel.\",\n        cart10:  \"Ajoutez \" + money + \" et tout le rituel s\\u2019adoucit de 10%.\"\n      },\n      es: {\n        ship:    \"Suma \" + money + \" y tu ritual viaja por nuestra cuenta.\",\n        candle:  \"Suma \" + money + \" y una vela tranquila se une a tu ritual.\",\n        cart10:  \"Suma \" + money + \" y todo el ritual se suaviza un 10%.\"\n      }\n    };\n    return (map[locale] && map[locale][tier]) || map.en[tier];\n  }\n\n  function allUnlockedSentence(locale) {\n    var map = {\n      en: \"Your ritual carries every layer we offer.\",\n      de: \"Dein Ritual tr\\u00e4gt jede Schicht, die wir anbieten.\",\n      fr: \"Votre rituel porte chaque couche que nous offrons.\",\n      es: \"Tu ritual lleva cada capa que ofrecemos.\"\n    };\n    return map[locale] || map.en;\n  }\n\n  function unlockedLabels(locale) {\n    var map = {\n      en: { ship: \"Complimentary Shipping\", candle: \"Complimentary Candle\", cart10: \"10% OVESSI Reward\",\n            heading: \"You have unlocked\", worth: \"Your unlocked benefits are worth approximately \" },\n      de: { ship: \"Versand inklusive\", candle: \"Kerze inklusive\", cart10: \"10% OVESSI Vorteil\",\n            heading: \"Du hast freigeschaltet\", worth: \"Deine freigeschalteten Vorteile entsprechen rund \" },\n      fr: { ship: \"Livraison offerte\", candle: \"Bougie offerte\", cart10: \"10% OVESSI Offert\",\n            heading: \"Vous avez d\\u00e9bloqu\\u00e9\", worth: \"Vos b\\u00e9n\\u00e9fices d\\u00e9bloqu\\u00e9s repr\\u00e9sentent environ \" },\n      es: { ship: \"Env\\u00edo incluido\", candle: \"Vela incluida\", cart10: \"10% OVESSI Beneficio\",\n            heading: \"Has desbloqueado\", worth: \"Tus beneficios desbloqueados equivalen aprox. a \" }\n    };\n    return map[locale] || map.en;\n  }\n\n  // Value of each unlocked benefit, in region currency cents.\n  // SINGLE SOURCE OF TRUTH: window.__LUV_CANDLE_VALUE + window.__LUV_SHIP_VALUE\n  // (set by luv-rewards.js). Fallback constants here match what luv-rewards.js publishes.\n  // Live Shopify candle price (verified 2026-06-01): \u00A329 / \u20AC34.95 / $40.\n  // Live Shopify shipping cost: \u00A34.95 / \u20AC5.95 / $5.95.\n  // Cart 10%: computed live (10% of non-candle subtotal).\n  function valueShip(code) {\n    var src = (typeof window !== 'undefined' && window.__LUV_SHIP_VALUE) || null;\n    if (src && src[code] != null) return src[code];\n    return code === 'EUR' ? 595 : (code === 'USD' ? 595 : 495);\n  }\n  function valueCandle(code) {\n    var src = (typeof window !== 'undefined' && window.__LUV_CANDLE_VALUE) || null;\n    if (src && src[code] != null) return src[code];\n    return code === 'EUR' ? 3500 : (code === 'USD' ? 4000 : 2900);\n  }\n\n  function buildUnlockedHTML(cart, locale) {\n    var t = regionThresholds();\n    // v3.2.2 BUG B3 FIX : ALWAYS compute subtotal from the same source as buildNextRewardHTML\n    // (nonCandleSubCart). Reading window.__luvCartCents introduced a race condition where\n    // the unlocked card and the next-reward sentence used different numbers and could\n    // disagree about which threshold had been crossed. Single source of truth = the cart\n    // we were passed.\n    var sub = nonCandleSubCart(cart);\n    var unlocked = [];\n    var value = 0;\n    if (sub >= t.ship)   { unlocked.push('ship');   value += valueShip(t.code); }\n    if (sub >= t.candle) { unlocked.push('candle'); value += valueCandle(t.code); }\n    if (sub >= t.cart10) { unlocked.push('cart10'); value += Math.round(sub * 0.10); }\n    if (!unlocked.length) return '';\n    var L = unlockedLabels(locale);\n    var lines = unlocked.map(function (k) {\n      return '<li class=\"luv-drawer__unlocked-li\"><span class=\"luv-drawer__unlocked-check\" aria-hidden=\"true\">\\u2713</span> ' + L[k] + '</li>';\n    }).join('');\n    var html = '<div class=\"luv-drawer__unlocked-card\">'\n      + '<p class=\"luv-drawer__unlocked-heading\">' + L.heading + '</p>'\n      + '<ul class=\"luv-drawer__unlocked-list\">' + lines + '</ul>';\n    if (value > 0) {\n      // v3.1.2 : use approximate (nearest 5) so it matches the reward ladder.\n      html += '<p class=\"luv-drawer__unlocked-worth\">' + L.worth + fmtMoneyApprox(value, t.sym, t.code) + '.</p>';\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function buildNextRewardHTML(cart, locale) {\n    var t = regionThresholds();\n    var sub = nonCandleSubCart(cart);\n    var tiers = [\n      { k: 'ship',   v: t.ship },\n      { k: 'candle', v: t.candle },\n      { k: 'cart10', v: t.cart10 }\n    ];\n    // Find next not-yet-unlocked tier\n    var next = null;\n    for (var i = 0; i < tiers.length; i++) {\n      if (sub < tiers[i].v) { next = tiers[i]; break; }\n    }\n    if (!next) {\n      // all unlocked\n      return '<p class=\"luv-drawer__nextreward-text luv-drawer__nextreward-text--all\">' + allUnlockedSentence(locale) + '</p>';\n    }\n    var away = next.v - sub;\n    return '<p class=\"luv-drawer__nextreward-text\">' + nextRewardSentence(locale, away, next.k, t.sym, t.code) + '</p>';\n  }\n\n  function refreshRewardMessaging(cart) {\n    // v3.2.2 BUG B3 FIX : if no cart passed, fall back to window.__luvCart, then re-fetch.\n    // This makes refresh deterministic \u2014 any caller can invoke without a cart and get\n    // a real render, instead of silently writing stale or empty content.\n    if (!cart || !cart.items) {\n      if (window.__luvCart && window.__luvCart.items) {\n        cart = window.__luvCart;\n      } else {\n        // last resort: fetch and retry. Avoid infinite loop with a guard.\n        if (!refreshRewardMessaging._fetching) {\n          refreshRewardMessaging._fetching = true;\n          fetch('/cart.js', { credentials: 'same-origin' })\n            .then(function (r) { return r.json(); })\n            .then(function (c) {\n              window.__luvCart = c;\n              refreshRewardMessaging._fetching = false;\n              refreshRewardMessaging(c);\n            })\n            .catch(function () { refreshRewardMessaging._fetching = false; });\n        }\n        return;\n      }\n    }\n    // Update cached cart so subsequent reads use the freshest data\n    window.__luvCart = cart;\n    var nodes = document.querySelectorAll('[data-luv-nextreward]');\n    nodes.forEach(function (n) {\n      var loc = n.getAttribute('data-locale') || 'en';\n      n.innerHTML = buildNextRewardHTML(cart, loc);\n    });\n    var unl = document.querySelectorAll('[data-luv-unlocked]');\n    unl.forEach(function (n) {\n      var loc = n.getAttribute('data-locale') || 'en';\n      n.innerHTML = buildUnlockedHTML(cart, loc);\n    });\n  }\n\n  // v3.2.2 BUG B3 FIX : when Dawn re-renders the cart section after add/remove/qty\n  // change, the [data-luv-unlocked] and [data-luv-nextreward] containers get\n  // REPLACED with empty server-rendered ones. The cart:updated/cart:update\n  // events fire, but if our handler ran before the section swap completed, our\n  // writes get overwritten. We add a MutationObserver scoped to cart-items and\n  // cart-drawer that re-paints whenever a [data-luv-unlocked] or [data-luv-nextreward]\n  // is added to the DOM. Coalesced to one paint per animation frame to avoid loops.\n  var __rewardRepaintScheduled = false;\n  function scheduleRewardRepaint() {\n    if (__rewardRepaintScheduled) return;\n    __rewardRepaintScheduled = true;\n    requestAnimationFrame(function () {\n      __rewardRepaintScheduled = false;\n      // Always pull fresh cart before repainting so we never write stale state\n      fetch('/cart.js', { credentials: 'same-origin' })\n        .then(function (r) { return r.json(); })\n        .then(function (cart) {\n          window.__luvCart = cart;\n          refreshRewardMessaging(cart);\n        }).catch(function () {\n          // fallback : use cached cart\n          if (window.__luvCart) refreshRewardMessaging(window.__luvCart);\n        });\n    });\n  }\n  function startRewardSectionObserver() {\n    if (!window.MutationObserver) return;\n    var hosts = [document.querySelector('cart-items'), document.querySelector('cart-drawer'), document.getElementById('main-cart-footer')].filter(Boolean);\n    if (!hosts.length) {\n      // Observe body until the hosts exist (cart-items appears only on /cart)\n      hosts = [document.body];\n    }\n    hosts.forEach(function (host) {\n      var mo = new MutationObserver(function (mutations) {\n        var triggers = false;\n        for (var i = 0; i < mutations.length; i++) {\n          var m = mutations[i];\n          // Look for added nodes that ARE or CONTAIN our reward hooks\n          if (m.addedNodes && m.addedNodes.length) {\n            for (var j = 0; j < m.addedNodes.length; j++) {\n              var n = m.addedNodes[j];\n              if (n.nodeType !== 1) continue;\n              if (n.matches && (n.matches('[data-luv-unlocked]') || n.matches('[data-luv-nextreward]'))) { triggers = true; break; }\n              if (n.querySelector && (n.querySelector('[data-luv-unlocked]') || n.querySelector('[data-luv-nextreward]'))) { triggers = true; break; }\n            }\n          }\n          if (triggers) break;\n        }\n        if (triggers) scheduleRewardRepaint();\n      });\n      mo.observe(host, { childList: true, subtree: true });\n    });\n  }\n\n  // ---- arrival window renderer v2.1 ----\n  // User feedback : no calendar dates. Always show a dynamic days-window per region.\n  // Per-region defaults : UK 3\u20137 / EU 5\u201310 / US 2\u20135 business days. Window numbers are\n  // read from data-min-days / data-max-days on the host element (Liquid sets them from\n  // cart.currency.iso_code so this is region-aware).\n  function arrivalWindowString(locale, minDays, maxDays) {\n    // Use en-dash inside the number range per explicit user override.\n    var range = minDays + '\\u2013' + maxDays;\n    var map = {\n      en: 'Estimated arrival in ' + range + ' business days \\u2022 Express available',\n      de: 'Voraussichtliche Ankunft in ' + range + ' Werktagen \\u2022 Express verf\\u00fcgbar',\n      fr: 'Arriv\\u00e9e estim\\u00e9e sous ' + range + ' jours ouvr\\u00e9s \\u2022 Express disponible',\n      es: 'Llegada estimada en ' + range + ' d\\u00edas h\\u00e1biles \\u2022 Express disponible'\n    };\n    return map[locale] || map.en;\n  }\n  function madeToOrderString(locale) {\n    var map = {\n      // v3.2.3 (2026-06-01 23:20 UK): \\u2736 prefix removed. The glyph U+2736\n      // (six-pointed black star) has no font fallback in Safari/Chrome on most\n      // OSes, so the browser rendered it as a literal asterisk '*'. The Liquid\n      // template renders this same line cleanly without any prefix; the JS\n      // must match. Do NOT re-add any glyph prefix here.\n      en: 'Made to order \\u2022 Confirmed within 48 hours',\n      de: 'Auf Bestellung gefertigt \\u2022 Best\\u00e4tigung innerhalb von 48 Stunden',\n      fr: 'Fabriqu\\u00e9 sur commande \\u2022 Confirmation sous 48 heures',\n      es: 'Hecho bajo pedido \\u2022 Confirmaci\\u00f3n en 48 horas'\n    };\n    return map[locale] || map.en;\n  }\n  function refreshArrival() {\n    document.querySelectorAll('[data-luv-arrival]').forEach(function (n) {\n      var loc = n.getAttribute('data-locale') || 'en';\n      var minD = parseInt(n.getAttribute('data-min-days') || '3', 10);\n      var maxD = parseInt(n.getAttribute('data-max-days') || '7', 10);\n      var arrEl = n.querySelector('.luv-ships-to__arrival');\n      if (arrEl) arrEl.textContent = arrivalWindowString(loc, minD, maxD);\n      var madeEl = n.querySelector('.luv-ships-to__made');\n      if (madeEl) madeEl.textContent = madeToOrderString(loc);\n    });\n  }\n\n  // ---- bfcache fix v3 : on ANY back-navigation, hard-reset cart UI + watchdog ----\n  // Symptom : pressing browser back from /checkout leaves a spinner overlay on the cart drawer / page.\n  // v3 (2026-06-01) : run on every pageshow + a 3-second MutationObserver watchdog\n  // that instantly removes any newly-added is-loading / loading-overlay / aria-busy state.\n  function bfcacheReset() {\n    try {\n      document.body.classList.remove('overflow-hidden');\n      // Hide ALL Dawn spinners and loading overlays\n      var spinSel = '.loading__spinner, .loading-overlay__spinner, .loading-overlay, .cart-drawer__loading-overlay';\n      document.querySelectorAll(spinSel).forEach(function (s) {\n        s.classList.add('hidden');\n        s.style.display = 'none';\n        s.setAttribute('aria-hidden', 'true');\n      });\n      // Remove is-loading from every cart-related container\n      var cartForms = document.querySelectorAll('cart-drawer, cart-items, form[action$=\"/cart\"], form#CartDrawer-Form, [data-cart], .cart, .cart__items, .cart-drawer__inner');\n      cartForms.forEach(function (el) {\n        el.classList.remove('is-loading', 'cart-drawer--loading', 'is-busy');\n        el.removeAttribute('aria-busy');\n      });\n      // Re-enable any checkout buttons that were left disabled mid-submit\n      var btnSel = '#CartDrawer-Checkout, #checkout, button[name=\"checkout\"], .cart__checkout-button, [data-checkout-btn]';\n      document.querySelectorAll(btnSel).forEach(function (btn) {\n        btn.removeAttribute('aria-disabled');\n        btn.removeAttribute('disabled');\n        btn.classList.remove('is-loading', 'loading');\n        // Remove any inline spinner inside the button\n        var inner = btn.querySelector('.loading__spinner, .loading-overlay__spinner');\n        if (inner) inner.classList.add('hidden');\n      });\n      // Force a clean cart fetch + re-render of all cart UI\n      fetch('/cart.js', { credentials: 'same-origin', headers: { Accept: 'application/json' } })\n        .then(function (r) { return r.json(); })\n        .then(function (cart) {\n          window.__luvCart = cart;\n          refreshRewardMessaging(cart);\n          if (typeof refreshArrival === 'function') refreshArrival();\n        }).catch(function(){});\n    } catch (e) {}\n  }\n  // v3 : Run on EVERY pageshow (bfcache persisted OR fresh). Fresh navigations after\n  // browser-back from /checkout are not always bfcache, but the symptoms are identical.\n  // PHASE 4 ADD: 3-second watchdog observer that kills any spinner/loading state added\n  // by Dawn's cart-items.js or cart-drawer.js after our reset runs.\n  function startSpinnerWatchdog() {\n    if (!window.MutationObserver) return;\n    var cleared = false;\n    var endsAt = Date.now() + 3000;\n    var mo = new MutationObserver(function () {\n      if (Date.now() > endsAt) { mo.disconnect(); return; }\n      // Kill spinners\n      document.querySelectorAll('.loading__spinner, .loading-overlay__spinner, .loading-overlay, .cart-drawer__loading-overlay').forEach(function (s) {\n        if (s.classList.contains('hidden')) return;\n        s.classList.add('hidden');\n        s.style.display = 'none';\n        s.setAttribute('aria-hidden', 'true');\n      });\n      // Kill is-loading on cart hosts\n      document.querySelectorAll('cart-drawer, cart-items, form[action$=\"/cart\"], #CartDrawer-Form, .cart, .cart__items, .cart-drawer__inner').forEach(function (el) {\n        if (el.hasAttribute('aria-busy')) el.removeAttribute('aria-busy');\n        el.classList.remove('is-loading', 'cart-drawer--loading', 'is-busy');\n      });\n      // Re-enable any disabled checkout buttons\n      document.querySelectorAll('#CartDrawer-Checkout, #checkout, button[name=\"checkout\"], .cart__checkout-button, [data-checkout-btn]').forEach(function (btn) {\n        if (btn.hasAttribute('disabled')) btn.removeAttribute('disabled');\n        if (btn.hasAttribute('aria-disabled')) btn.removeAttribute('aria-disabled');\n        btn.classList.remove('is-loading', 'loading');\n      });\n      cleared = true;\n    });\n    mo.observe(document.body, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['class', 'aria-busy', 'disabled', 'aria-disabled', 'style']\n    });\n    setTimeout(function () { mo.disconnect(); }, 3100);\n  }\n  window.addEventListener('pageshow', function (e) {\n    bfcacheReset();\n    startSpinnerWatchdog();\n  });\n  // Also detect the user clicking checkout (so we can mark the moment) and the user\n  // returning to the cart page from /checkouts (referrer-based)\n  try {\n    var ref = document.referrer || '';\n    if (/\\/checkouts?\\b/.test(ref) || /shopify\\.com\\/checkout/i.test(ref)) {\n      bfcacheReset();\n    }\n  } catch (e) {}\n  // Also reset on visibilitychange when returning to the tab\n  document.addEventListener('visibilitychange', function () {\n    if (document.visibilityState === 'visible') {\n      // light refresh\n      fetch('/cart.js', { credentials: 'same-origin' }).then(function (r) { return r.json(); })\n        .then(function (cart) { window.__luvCart = cart; refreshRewardMessaging(cart); }).catch(function(){});\n    }\n  });\n\n  // ---- initial bind + cart:updated listener ----\n  function init() {\n    refreshArrival();\n    fetch('/cart.js', { credentials: 'same-origin' }).then(function (r) { return r.json(); })\n      .then(function (cart) { window.__luvCart = cart; refreshRewardMessaging(cart); }).catch(function(){});\n    // v3.2.2 BUG B3 FIX : start observer that re-paints reward hooks whenever\n    // Dawn re-renders the cart section and replaces our DOM containers.\n    startRewardSectionObserver();\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  // v3.2.2 BUG B3 FIX : robust event wiring.\n  // - 'cart:updated' (LuvCandlePicker / luv-cart-sync) carries the cart in detail.\n  // - 'cart:update' (Dawn standard) carries section data, NOT a cart object \u2014\n  //   we must fetch /cart.js to get the fresh cart.\n  // We re-paint reward hooks for BOTH events, on a microtask delay to let Dawn\n  // finish swapping the cart section first.\n  function handleCartEventForRewards(e) {\n    var d = e && e.detail;\n    var maybeCart = null;\n    if (d && d.items) maybeCart = d;\n    else if (d && d.cart && d.cart.items) maybeCart = d.cart;\n    if (maybeCart) {\n      window.__luvCart = maybeCart;\n      // Wait one frame so Dawn section swap completes first, then re-paint\n      requestAnimationFrame(function () { refreshRewardMessaging(maybeCart); });\n    } else {\n      // Force a re-fetch and re-paint\n      scheduleRewardRepaint();\n    }\n  }\n  document.addEventListener('cart:updated', handleCartEventForRewards);\n  document.addEventListener('cart:update',  handleCartEventForRewards);\n\n  // v3.1.2 : Re-render unlocked-card whenever luv-rewards.js has finished\n  // computing window.__luvCartCents. v3.2.2 : also schedule a fresh fetch so\n  // unlocked + next-reward use the same cart.\n  document.addEventListener('luv:rewards-updated', function () {\n    if (window.__luvCart && window.__luvCart.items) {\n      refreshRewardMessaging(window.__luvCart);\n    } else {\n      scheduleRewardRepaint();\n    }\n  });\n\n  // Expose for other modules\n  window.LuvCartV2 = { refreshRewardMessaging: refreshRewardMessaging, refreshArrival: refreshArrival };\n})();\n\n/* ============================================================\n   OVESSI cart v3 : Express Checkout reorder + structure (PHASE 5 \u2014 2026-06-01)\n   Desktop : Shop Pay full-width row1, [Google Pay \u00B7 PayPal] row2.   (NO Apple Pay row on desktop)\n   Mobile  : Apple Pay full-width row1, [Shop Pay \u00B7 Google Pay \u00B7 PayPal] row2.\n   Accepted-payments text line beneath (no logos).\n   ============================================================ */\n(function () {\n  'use strict';\n  // v2.1 fix : Shopify accelerated checkout cart renders these web components \u2014 NOT the legacy shop-pay-button / apple-pay-button tags.\n  var SHOP_PAY_SEL    = 'shop-pay-wallet-button, shop-pay-button, [is=\"shop-pay-button\"], .shopify-payment-button [aria-label*=\"Shop Pay\" i]';\n  var APPLE_PAY_SEL   = 'shopify-apple-pay-button, apple-pay-button, [aria-label*=\"Apple Pay\" i]';\n  var PAYPAL_SEL      = 'shopify-paypal-button, [aria-label*=\"PayPal\" i]';\n  var GOOGLE_PAY_SEL  = 'shopify-google-pay-button, [aria-label*=\"Google Pay\" i]';\n\n  function isMobile() {\n    return window.matchMedia && window.matchMedia('(max-width: 749px)').matches;\n  }\n\n  function isAppleAvailable(el) {\n    if (!el) return false;\n    var box = el.getBoundingClientRect();\n    if (box.width === 0 && box.height === 0) return false;\n    // Some Apple Pay components ship with display:none until canMakePayments resolves\n    var st = window.getComputedStyle(el);\n    if (st.display === 'none' || st.visibility === 'hidden') return false;\n    return true;\n  }\n\n  function reorderExpress() {\n    var hosts = document.querySelectorAll('[data-luv-express] .luv-express__shell');\n    if (!hosts.length) return;\n    var mobile = isMobile();\n    hosts.forEach(function (shell) {\n      // Find wallet web components inside Shopify's accelerated-checkout-cart\n      var byKey = {};\n      var el;\n      el = shell.querySelector(SHOP_PAY_SEL);   if (el) byKey.shop   = el;\n      el = shell.querySelector(APPLE_PAY_SEL);  if (el) byKey.apple  = el;\n      el = shell.querySelector(PAYPAL_SEL);     if (el) byKey.paypal = el;\n      el = shell.querySelector(GOOGLE_PAY_SEL); if (el) byKey.google = el;\n      var have = Object.keys(byKey).length;\n      if (have < 2) return;\n\n      // PHASE 5 CONFIGURATION:\n      // Desktop : primary=shop, secondary=[google, paypal] \u2014 Apple deliberately omitted on desktop.\n      // Mobile  : primary=apple (if available, else shop), secondary=[shop, google, paypal] minus primary.\n      var primaryKey, secondaryKeys;\n      if (mobile) {\n        if (byKey.apple && isAppleAvailable(byKey.apple)) {\n          primaryKey = 'apple';\n          secondaryKeys = ['shop', 'google', 'paypal'];\n        } else {\n          primaryKey = 'shop';\n          secondaryKeys = ['google', 'paypal'];\n        }\n      } else {\n        primaryKey = 'shop';\n        secondaryKeys = ['google', 'paypal'];\n      }\n\n      var primary = byKey[primaryKey];\n      if (!primary) {\n        // Fall back to first available\n        primaryKey = Object.keys(byKey)[0];\n        primary = byKey[primaryKey];\n      }\n      var secondary = [];\n      secondaryKeys.forEach(function (k) {\n        if (k === primaryKey) return;\n        if (byKey[k]) secondary.push(byKey[k]);\n      });\n\n      // Hide any wallet web components we don't want shown (e.g. Apple Pay on desktop)\n      // by leaving them inside their original container with display:none.\n      var hideKeys = Object.keys(byKey).filter(function (k) {\n        return k !== primaryKey && secondaryKeys.indexOf(k) === -1;\n      });\n      hideKeys.forEach(function (k) {\n        var n = byKey[k];\n        if (n) n.style.display = 'none';\n      });\n\n      // Skip if already structured AND the primary slot already has our primary wallet inside\n      var existingPrimary = shell.querySelector('.luv-express__primary');\n      if (existingPrimary && existingPrimary.contains(primary)) {\n        // Verify secondary row matches expected count too\n        var existingRow0 = shell.querySelector('.luv-express__row');\n        if (existingRow0 && existingRow0.children.length === secondary.length) return;\n      }\n\n      // Build new primary/row divs\n      var primaryDiv = document.createElement('div');\n      primaryDiv.className = 'luv-express__primary';\n      var rowDiv = document.createElement('div');\n      rowDiv.className = 'luv-express__row luv-express__row--' + secondary.length;\n      primary.style.display = '';\n      primaryDiv.appendChild(primary);\n      secondary.forEach(function (s) { s.style.display = ''; rowDiv.appendChild(s); });\n\n      // Remove any existing structure\n      var existingPrimary2 = shell.querySelector('.luv-express__primary');\n      if (existingPrimary2) existingPrimary2.remove();\n      var existingRow = shell.querySelector('.luv-express__row');\n      if (existingRow) existingRow.remove();\n\n      shell.appendChild(primaryDiv);\n      if (secondary.length) shell.appendChild(rowDiv);\n\n      // Hide emptied containers\n      var emptyHost = shell.querySelector('.dynamic-checkout__content');\n      if (emptyHost) {\n        var hasBtns = emptyHost.querySelector('shop-pay-wallet-button, shopify-paypal-button, shopify-google-pay-button, shopify-apple-pay-button');\n        if (!hasBtns) emptyHost.style.display = 'none';\n      }\n    });\n  }\n\n  // Find the nearest meaningful wrapper (parent button container) so we move whole control, not just inner element\n  function nearestWrapper(el, root) {\n    var n = el;\n    var limit = 6;\n    while (n && n !== root && limit-- > 0) {\n      var s = n.parentElement;\n      if (!s || s === root) break;\n      // Prefer a wrapper that contains the wallet directly and has display block\n      n = s;\n    }\n    return n;\n  }\n\n  function tryReorder() {\n    // Shopify's accelerated-checkout may load async \u2014 retry up to ~3s\n    var attempts = 0;\n    var iv = setInterval(function () {\n      attempts += 1;\n      try { reorderExpress(); } catch (e) {}\n      if (attempts > 15) clearInterval(iv);\n    }, 200);\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', tryReorder);\n  } else {\n    tryReorder();\n  }\n  // Re-attempt on viewport flip\n  window.addEventListener('resize', function () {\n    // Only restructure if breakpoint flips (mobile primary differs from desktop primary)\n    var hosts = document.querySelectorAll('[data-luv-express] .luv-express__shell .luv-express__primary');\n    if (!hosts.length) return;\n    // Clear and rebuild\n    document.querySelectorAll('[data-luv-express] .luv-express__shell').forEach(function (shell) {\n      // Pull all child wallet wrappers back to shell level and clear; reorder will rebuild\n      var children = [];\n      shell.querySelectorAll('.luv-express__primary > *, .luv-express__row > *').forEach(function (n) { children.push(n); });\n      while (shell.firstChild) shell.removeChild(shell.firstChild);\n      children.forEach(function (n) { shell.appendChild(n); });\n    });\n    reorderExpress();\n  });\n})();\n\n/* ============================================================\n   V3 : LOCALE-PRESERVING EMPTY-CART CTAs\n   Safety net for any link tagged [data-luv-keep-locale=\"1\"].\n   Forces the URL to include the active locale prefix so Shopify\n   Markets does not flip the user back to English on click.\n   ============================================================ */\n(function () {\n  'use strict';\n\n  function activeLocalePrefix() {\n    // Read locale from <html lang>, fall back to URL path inspection.\n    var htmlLang = (document.documentElement.getAttribute('lang') || '').toLowerCase();\n    var iso = htmlLang.split('-')[0];\n    if (iso === 'de' || iso === 'fr' || iso === 'es') return '/' + iso;\n    // Path-based fallback (e.g., /de/cart, /fr/products/x)\n    var m = (window.location.pathname || '').match(/^\\/(de|fr|es)(?:\\/|$)/i);\n    if (m) return '/' + m[1].toLowerCase();\n    return ''; // English / default\n  }\n\n  function normaliseHref(rawHref) {\n    if (!rawHref || typeof rawHref !== 'string') return rawHref;\n    // Only touch same-origin pathnames\n    if (/^(https?:|mailto:|tel:|#)/i.test(rawHref)) return rawHref;\n    var prefix = activeLocalePrefix();\n    if (!prefix) return rawHref; // English needs no prefix\n    // Already prefixed? leave alone\n    if (new RegExp('^' + prefix + '(?:/|$)', 'i').test(rawHref)) return rawHref;\n    // Absolute path: insert locale right after the leading slash\n    if (rawHref.charAt(0) === '/') {\n      return prefix + rawHref;\n    }\n    return rawHref;\n  }\n\n  function patchLink(a) {\n    if (!a || a.__luvLocalePatched) return;\n    var current = a.getAttribute('href');\n    var fixed = normaliseHref(current);\n    if (fixed !== current) {\n      a.setAttribute('href', fixed);\n    }\n    a.__luvLocalePatched = true;\n  }\n\n  function sweep(root) {\n    var scope = root && root.querySelectorAll ? root : document;\n    var nodes = scope.querySelectorAll('a[data-luv-keep-locale=\"1\"]');\n    for (var i = 0; i < nodes.length; i++) patchLink(nodes[i]);\n  }\n\n  // Click-time guarantee (catches dynamic renders + stops mid-flight if href slipped)\n  document.addEventListener('click', function (e) {\n    var a = e.target && e.target.closest ? e.target.closest('a[data-luv-keep-locale=\"1\"]') : null;\n    if (!a) return;\n    var raw = a.getAttribute('href') || '';\n    var fixed = normaliseHref(raw);\n    if (fixed !== raw) {\n      a.setAttribute('href', fixed);\n    }\n  }, true);\n\n  // Initial sweep + observe drawer/cart re-renders\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function () { sweep(document); });\n  } else {\n    sweep(document);\n  }\n\n  var mo = new MutationObserver(function (muts) {\n    for (var i = 0; i < muts.length; i++) {\n      var added = muts[i].addedNodes;\n      for (var j = 0; j < added.length; j++) {\n        var n = added[j];\n        if (n && n.nodeType === 1) {\n          if (n.matches && n.matches('a[data-luv-keep-locale=\"1\"]')) patchLink(n);\n          else sweep(n);\n        }\n      }\n    }\n  });\n  try { mo.observe(document.body || document.documentElement, { childList: true, subtree: true }); } catch (e) {}\n})();\n\n/* edge-rotate-touch 1780610977 */\n"],
  "mappings": "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",
  "names": ["refreshRewardMessaging", "refreshArrival"]
}
