{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/theme.js?revision=20260727-scroll-title"],
  "sourcesContent": ["/* ============================================================\n   OLEVATE \u00B7 theme logic\n   Ported from the approved design; cart wired to Shopify AJAX API.\n   Config comes from window.OLEVATE (see snippets/olevate-config\n   and sections/buy).\n   ============================================================ */\n(function () {\n  'use strict';\n\n  var OL = window.OLEVATE || {};\n  var ROUTES = OL.routes || {};\n  var FLAVOURS = OL.flavours || {\n    vanilla: { label: 'Real Vanilla', word: 'Vanilla', desc: '' },\n    chocolate: { label: 'Dutch Chocolate', word: 'Chocolate', desc: '' }\n  };\n  function productFromPage() {\n    var buy = document.getElementById('buy');\n    if (buy && buy.dataset.variantVanillaId) {\n      var d = buy.dataset;\n      var plans = Array.prototype.map.call(buy.querySelectorAll('[data-selling-plan]'), function (el) {\n        return {\n          id: Number(el.dataset.sellingPlanId),\n          price: Number(el.dataset.sellingPlanPrice),\n          name: el.dataset.sellingPlanName || ''\n        };\n      });\n      function markupVariant(name) {\n        var cap = name.charAt(0).toUpperCase() + name.slice(1);\n        var id = d['variant' + cap + 'Id'];\n        if (!id) return null;\n        return {\n          id: Number(id),\n          price: Number(d['variant' + cap + 'Price']),\n          available: d['variant' + cap + 'Available'] === 'true',\n          sellingPlans: plans\n        };\n      }\n      /* The supply bundles and the towel are too structured for data-attributes,\n         so they live in the JSON block. Merge them in rather than letting this\n         markup path shadow them \u2014 otherwise subscriptions look unconfigured. */\n      var extra = {};\n      var side = document.getElementById('olevate-product-data');\n      if (side) {\n        try {\n          var parsed = JSON.parse(side.textContent);\n          extra.supplies = parsed.supplies;\n          extra.giftTowel = parsed.giftTowel;\n        } catch (e) { /* markup data alone still drives one-time purchases */ }\n      }\n      return {\n        available: d.productAvailable === 'true',\n        variants: { vanilla: markupVariant('vanilla'), chocolate: markupVariant('chocolate') },\n        priceOnce: Number(d.variantVanillaPrice || d.variantChocolatePrice || 0),\n        gift: d.giftId ? { id: Number(d.giftId), title: d.giftTitle || 'OLEVATE Protein Shaker' } : null,\n        supplies: extra.supplies || null,\n        giftTowel: extra.giftTowel || null\n      };\n    }\n    var data = document.getElementById('olevate-product-data');\n    if (data) {\n      try { return JSON.parse(data.textContent); } catch (e) { /* fall through to legacy config */ }\n    }\n    return OL.product || null;\n  }\n  var PRODUCT = productFromPage() || { available: false, variants: { vanilla: null, chocolate: null }, priceOnce: 9499, gift: null };\n  var CURRENCY = OL.currency || 'AUD';\n  var LOCALE = OL.locale || 'en-AU';\n\n  function money(cents) {\n    var v = (cents || 0) / 100;\n    var whole = Math.round(v) === v;\n    try {\n      return new Intl.NumberFormat(LOCALE, {\n        style: 'currency', currency: CURRENCY,\n        minimumFractionDigits: whole ? 0 : 2,\n        maximumFractionDigits: whole ? 0 : 2\n      }).format(v);\n    } catch (e) {\n      return '$' + v.toFixed(whole ? 0 : 2);\n    }\n  }\n\n  function esc(s) {\n    return String(s == null ? '' : s)\n      .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n  }\n\n  var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  if (reduceMotion) document.body.classList.add('no-anim');\n\n  var $ = function (s, c) { return (c || document).querySelector(s); };\n  var $$ = function (s, c) { return Array.prototype.slice.call((c || document).querySelectorAll(s)); };\n\n  /* ---------- numeral type ----------\n     The design keeps its wide-tracked Plex Mono labels, but the customer chose\n     Inter tabular figures for every number. Copy is editor-managed and prices,\n     cart lines, and counters are rendered after this file loads, so component-\n     by-component markup would inevitably miss a surface. Decorate text runs\n     instead, preserving every surrounding word, separator, and layout value.\n\n     Text in a flex/grid container first stays together in a single inline run:\n     that retains the container's existing gap between the icon and the label,\n     rather than accidentally adding a gap between \u201C60\u201D and \u201C-day\u201D. SVG text\n     receives an SVG <tspan>; icon paths and form fields are never touched. */\n  (function () {\n    var numericText = /(?:[A-Z]{0,3}\\$|[$\u20AC\u00A3\u00A5])?\\d+(?:[,.]\\d+)*(?:[%+])?/g;\n    var hasDigit = /\\d/;\n    var ignored = 'script,style,noscript,template,textarea,select,option,input,button[data-numerals-ignore],code,pre,[contenteditable],[data-numerals-ignore]';\n    var svgNamespace = 'http://www.w3.org/2000/svg';\n    var scheduled = false;\n\n    function isEligible(text) {\n      var parent = text.parentElement;\n      if (!parent || !hasDigit.test(text.nodeValue || '')) return false;\n      if (parent.closest('.marquee,.numeric-value,' + ignored)) return false;\n      var svg = parent.closest('svg');\n      return !svg || !!parent.closest('text,textPath,tspan');\n    }\n\n    function numericElement(svg) {\n      var el = svg\n        ? document.createElementNS(svgNamespace, 'tspan')\n        : document.createElement('span');\n      el.setAttribute('class', 'numeric-value');\n      return el;\n    }\n\n    function keepFlexTextTogether(text) {\n      var parent = text.parentElement;\n      var display = window.getComputedStyle(parent).display;\n      if (display !== 'flex' && display !== 'inline-flex' && display !== 'grid' && display !== 'inline-grid') return text;\n      var run = document.createElement('span');\n      run.setAttribute('class', 'numeric-text-run');\n      parent.replaceChild(run, text);\n      run.appendChild(text);\n      return text;\n    }\n\n    function decorateText(text) {\n      if (!isEligible(text)) return false;\n      var svg = !!text.parentElement.closest('svg');\n      if (!svg) text = keepFlexTextTogether(text);\n      var value = text.nodeValue;\n      numericText.lastIndex = 0;\n      var match = numericText.exec(value);\n      if (!match) return false;\n\n      var fragment = document.createDocumentFragment();\n      var cursor = 0;\n      do {\n        if (match.index > cursor) fragment.appendChild(document.createTextNode(value.slice(cursor, match.index)));\n        var number = numericElement(svg);\n        number.textContent = match[0];\n        fragment.appendChild(number);\n        cursor = match.index + match[0].length;\n        match = numericText.exec(value);\n      } while (match);\n      if (cursor < value.length) fragment.appendChild(document.createTextNode(value.slice(cursor)));\n      text.parentNode.replaceChild(fragment, text);\n      return true;\n    }\n\n    function decorate(root) {\n      if (!root) return;\n      var walker = document.createTreeWalker(root, 4, {\n        acceptNode: function (node) {\n          return isEligible(node) ? 1 : 2;\n        }\n      });\n      var nodes = [];\n      var node;\n      while ((node = walker.nextNode())) nodes.push(node);\n      nodes.forEach(decorateText);\n    }\n\n    function schedule() {\n      if (scheduled) return;\n      scheduled = true;\n      (window.requestAnimationFrame || window.setTimeout)(function () {\n        scheduled = false;\n        decorate(document.body);\n      });\n    }\n\n    decorate(document.body);\n    new MutationObserver(schedule).observe(document.body, { childList: true, characterData: true, subtree: true });\n  })();\n\n  /* ---------- preloader ---------- */\n  var loader = $('#loader');\n  if (loader) {\n    /* The wordmark names the page you are arriving at, so it has to play on\n       every genuine arrival \u2014 including a prerendered one, which is how the\n       home and product pages reach each other.\n\n       Going BACK is not an arrival. bfcache and the back button restore a page\n       the visitor has already seen, so those still skip it entirely.\n\n       A prerendered page runs this script, and its CSS animation, while still\n       hidden. By activation the track-in has long finished, so it is restarted\n       on `prerenderingchange` rather than shown mid-way. The dwell is shorter\n       than a cold load because the page underneath is already painted \u2014 the\n       curtain is there for the brand, not to hide loading. */\n    var navEntry = (window.performance && performance.getEntriesByType\n      && performance.getEntriesByType('navigation')[0]) || {};\n    var wm = loader.firstElementChild;\n\n    function loaderDone() { loader.classList.add('done'); }\n    function hideAfter(ms) { setTimeout(loaderDone, reduceMotion ? 0 : ms); }\n    function playWordmark(ms) {\n      loader.classList.remove('done');\n      if (wm && !reduceMotion) {\n        wm.style.animation = 'none';\n        void wm.offsetWidth;            /* force reflow so the animation restarts */\n        wm.style.animation = '';\n      }\n      hideAfter(ms);\n    }\n\n    if (navEntry.type === 'back_forward') {\n      loaderDone();\n    } else if (document.prerendering === true) {\n      document.addEventListener('prerenderingchange', function () { playWordmark(520); }, { once: true });\n      /* never leave a curtain up if activation somehow goes unreported */\n      setTimeout(function () { if (!document.prerendering) loaderDone(); }, 4000);\n    } else {\n      window.addEventListener('load', function () { hideAfter(650); });\n      setTimeout(loaderDone, 2400);\n    }\n\n    window.addEventListener('pageshow', function (e) {\n      if (e.persisted) loaderDone();\n    });\n  }\n\n  /* ---------- hash arrivals ----------\n     A browser applies the URL's hash once, early \u2014 while the images above the\n     target still have no height and before this script has settled the buy\n     card's blocks. By the time the page finishes and the preloader lifts, the\n     target has moved, and nothing puts it back: the visitor arrives at #buy\n     parked somewhere above or below it. Reloading a page that already had a\n     hash is the easiest way to see it.\n\n     So re-assert the target once the page has loaded, and again after the\n     curtain has cleared. `instant` because CSS sets scroll-behavior:smooth and\n     an arrival should already be where it belongs, not travel there.\n\n     Abandoned the moment the visitor touches the page, so it can never fight\n     someone who has started reading, and skipped for back/forward, which\n     restore a position of their own. Listening for wheel/touch/key rather than\n     `scroll` \u2014 a scroll listener would cancel on this code's own scrolling. */\n  (function () {\n    var entry = (window.performance && performance.getEntriesByType\n      && performance.getEntriesByType('navigation')[0]) || {};\n    if (entry.type === 'back_forward') return;\n    var raw = window.location.hash;\n    if (!raw || raw.length < 2) return;\n    var target;\n    try { target = document.querySelector(raw); } catch (e) { return; }\n    if (!target) return;\n\n    var cancelled = false;\n    function cancel() { cancelled = true; }\n    /* `hashchange` matters as much as the input events: the one-time-packs\n       control sets location.hash itself a moment after load, and without this\n       the settle below would haul the visitor back to where they arrived. */\n    ['wheel', 'touchstart', 'keydown', 'hashchange'].forEach(function (evt) {\n      window.addEventListener(evt, cancel, { passive: true, once: true });\n    });\n\n    function settle() {\n      if (cancelled || !target.isConnected) return;\n      try { target.scrollIntoView({ block: 'start', behavior: 'instant' }); }\n      catch (e) { target.scrollIntoView(true); }\n    }\n    function settleTwice() {\n      settle();\n      /* after the preloader's 650ms dwell, and after late media has settled */\n      setTimeout(settle, 750);\n    }\n    /* `load` may already have fired \u2014 this file is deferred, and a prerendered\n       page activates later still. Waiting for an event that has been and gone\n       would silently do nothing. */\n    if (document.readyState === 'complete') settleTwice();\n    else window.addEventListener('load', settleTwice);\n  })();\n\n  /* ---------- nav ---------- */\n  var nav = $('#nav');\n  var lastY = 0;\n  function onNav() {\n    if (!nav) return;\n    var y = window.scrollY;\n    nav.classList.toggle('scrolled', y > 24);\n    if (y > 480 && y > lastY + 6) nav.classList.add('hidden');\n    else if (y < lastY - 6 || y < 480) nav.classList.remove('hidden');\n    lastY = y;\n  }\n\n  /* ---------- reveals ---------- */\n  var io = new IntersectionObserver(function (es) {\n    es.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } });\n  }, { threshold: 0.16, rootMargin: '0px 0px -6% 0px' });\n  $$('.rv, .step').forEach(function (el) { io.observe(el); });\n\n  /* ---------- counters ---------- */\n  var cio = new IntersectionObserver(function (es) {\n    es.forEach(function (e) {\n      if (!e.isIntersecting) return;\n      cio.unobserve(e.target);\n      var end = parseFloat(e.target.dataset.count);\n      if (reduceMotion) { e.target.textContent = end; return; }\n      var t0 = performance.now(), dur = 1300;\n      (function tick(t) {\n        var p = Math.min((t - t0) / dur, 1), ez = 1 - Math.pow(1 - p, 3);\n        e.target.textContent = Math.round(end * ez);\n        if (p < 1) requestAnimationFrame(tick);\n      })(t0);\n    });\n  }, { threshold: 0.2 });\n  $$('[data-count]').forEach(function (el) { cio.observe(el); });\n\n  /* ---------- collapse (signature) ---------- */\n  var track = $('#collapseTrack');\n  var stickyEl = track ? track.querySelector('.sticky') : null;\n  var clamp01 = function (v) { return Math.max(0, Math.min(1, v)); };\n  var smooth = function (t) { return t * t * (3 - 2 * t); };\n  var norm = function (p, a, b) { return clamp01((p - a) / (b - a)); };\n  function onCollapse() {\n    if (!stickyEl || reduceMotion) return;\n    var r = track.getBoundingClientRect();\n    var total = track.offsetHeight - window.innerHeight;\n    var p = clamp01(-r.top / total);\n    var k = 1 - smooth(norm(p, 0.06, 0.60));\n    var q = smooth(norm(p, 0.52, 0.80));\n    stickyEl.style.setProperty('--k', k.toFixed(4));\n    stickyEl.style.setProperty('--q', q.toFixed(4));\n  }\n\n  /* ---------- powder convergence (grains stream from the tubs onto the scoop) ---------- */\n  (function () {\n    var powderCv = document.getElementById('powderFx');\n    var scoopImg = document.querySelector('.scoop-img');\n    if (!powderCv || !scoopImg || !track || reduceMotion) return;\n    var pctx = powderCv.getContext('2d');\n    var PW = 0, PH = 0, GRAIN = 1;\n    function powderSize() {\n      var dpr = Math.min(window.devicePixelRatio || 1, 2);\n      PW = powderCv.clientWidth; PH = powderCv.clientHeight;\n      powderCv.width = PW * dpr; powderCv.height = PH * dpr;\n      pctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n      /* dust is sized in CSS px, so it keeps its apparent size everywhere; nudge it\n         up on phones so it still reads against the near full-bleed mobile scoop */\n      GRAIN = PW < 700 ? 1.35 : 1;\n    }\n    window.addEventListener('resize', powderSize);\n    powderSize();\n    var prand = (function (s) { return function () { s = (s * 1664525 + 1013904223) >>> 0; return s / 4294967296; }; })(7);\n    var TUBV = [[-.36,-.16],[.35,-.19],[-.31,.20],[.31,.22],[-.13,.31],[.14,-.31]];\n    var GRAINS = [];\n    for (var i = 0; i < 560; i++) {\n      GRAINS.push({\n        tub: TUBV[i % 6],\n        birth: 0.46 + prand() * 0.12,   /* start dropping as the tubs finish collecting */\n        life: 0.09 + prand() * 0.09,    /* short: no long tail / grains from nowhere */\n        ox: (prand() - .5) * .13, oy: (prand() - .5) * .17,\n        lx: (prand() * 2 - 1) * (.55 + .45 * prand()),\n        depth: prand(),\n        bend: (prand() - .5) * 140,\n        r: .5 + prand() * .75,          /* fine dust, not sparkles */\n        tone: prand(),\n        tw: prand() * 6.283\n      });\n    }\n    var PPAL = {\n      vanilla:   { hi: '#F3ECDC', mid: '#E4D6B8', gold: '#C2A069', deep: '#B9A67F' },\n      chocolate: { hi: '#E9DCC6', mid: '#C8A87E', gold: '#B0824D', deep: '#8F6D48' }\n    };\n    var kAt = function (pp) { return 1 - smooth(norm(pp, .06, .60)); };\n    function drawPowder() {\n      var r = track.getBoundingClientRect();\n      var total = track.offsetHeight - window.innerHeight;\n      var p = clamp01(-r.top / total);\n      var now = performance.now() / 1000;\n      pctx.clearRect(0, 0, PW, PH);\n      if (p < .42) return;\n      var q = smooth(norm(p, .52, .80));\n      var pal = PPAL[document.body.dataset.flavour] || PPAL.vanilla;\n      var cx = PW / 2, cy = PH / 2;\n      var ir = scoopImg.getBoundingClientRect();\n      var cr = powderCv.getBoundingClientRect();\n      var imgLeft = ir.left - cr.left, imgTop = ir.top - cr.top;\n      var imgW = ir.width, imgH = ir.height;\n      var hx = imgLeft + imgW * .478;     /* heap centre within the photo */\n      var baseY = imgTop + imgH * .645;    /* cup rim / heap base */\n      var w2 = imgW * .10;\n      var hpk = imgH * .098;               /* up to the powder peak */\n      /* bend + lift were tuned in px against the 760px desktop scoop; scale them with\n         the scoop so the arcs keep the same bow once mobile goes near full-bleed */\n      var arc = imgW / 760;\n      for (var gi = 0; gi < GRAINS.length; gi++) {\n        var g = GRAINS[gi];\n        var t = (p - g.birth) / g.life;\n        if (t <= 0) continue;\n        var prof = 1 - g.lx * g.lx;\n        var lxx = hx + g.lx * w2;\n        var ly = baseY - hpk * prof * (.15 + .85 * g.depth);\n        var col = g.tone > .94 ? pal.gold : (g.tone > .5 ? pal.hi : pal.mid);\n        if (t >= 1) {\n          var a = (.35 + .3 * g.depth) * (1 - .8 * q);\n          if (a <= .02) continue;\n          pctx.globalAlpha = a;\n          pctx.fillStyle = col;\n          pctx.fillRect(lxx, ly, g.r * .9 * GRAIN, g.r * .9 * GRAIN);\n          continue;\n        }\n        var kb = kAt(g.birth);\n        var sx = cx + (g.tub[0] + g.ox) * PW * kb;\n        var sy = cy + (g.tub[1] + g.oy) * PH * kb;\n        var e = smooth(t), u = 1 - e;\n        var mx = (sx + lxx) / 2 + g.bend * arc, my = (sy + ly) / 2 - 30 * arc;\n        var x = u * u * sx + 2 * u * e * mx + e * e * lxx;\n        var y = u * u * sy + 2 * u * e * my + e * e * ly;\n        x += Math.sin(now * 1.7 + g.tw) * 1.6 * u;\n        y += Math.cos(now * 1.4 + g.tw) * 1.6 * u;\n        /* steady soft alpha (no twinkle) so grains read as fine dust, not sparkles */\n        pctx.globalAlpha = Math.sin(Math.PI * t) * (0.40 + 0.18 * g.depth);\n        pctx.fillStyle = col;\n        pctx.beginPath(); pctx.arc(x, y, g.r * GRAIN, 0, 6.283); pctx.fill();\n      }\n      pctx.globalAlpha = 1;\n    }\n    var powderOn = false;\n    function powderLoop() { if (!powderOn) return; drawPowder(); requestAnimationFrame(powderLoop); }\n    new IntersectionObserver(function (es) {\n      var on = es.some(function (e) { return e.isIntersecting; });\n      if (on && !powderOn) { powderOn = true; powderSize(); requestAnimationFrame(powderLoop); }\n      if (!on) powderOn = false;\n    }).observe(track);\n  })();\n\n  /* ---------- float bar ---------- */\n  var floatbar = $('#floatbar');\n  var buySection = $('#buy');\n  var pageFooter = document.querySelector('footer');\n  function onFloatbar() {\n    if (!floatbar || !buySection) return;\n    var past = window.scrollY > window.innerHeight * 1.1;\n    var b = buySection.getBoundingClientRect();\n    var buyVisible = b.top < window.innerHeight * 0.8 && b.bottom > 0;\n    var footerVisible = pageFooter && pageFooter.getBoundingClientRect().top < window.innerHeight;\n    var panelOpen = (drawer && drawer.classList.contains('open')) || (menu && menu.classList.contains('open'));\n    floatbar.classList.toggle('show', past && !buyVisible && !footerVisible && !panelOpen);\n  }\n\n  /* ---------- scroll orchestration ---------- */\n  var ticking = false;\n  function onScroll() {\n    if (ticking) return;\n    ticking = true;\n    requestAnimationFrame(function () { onNav(); onCollapse(); onFloatbar(); ticking = false; });\n  }\n  window.addEventListener('scroll', onScroll, { passive: true });\n\n  /* ---------- flavour system ---------- */\n  var flavour = 'vanilla';\n  var flavourWord = $('#flavourWord');\n  var flavourDesc = $('#flavourDesc');\n  /* shrink the big outlined word so it never widens its grid column\n     (long names would otherwise shrink the stage and shift the layout) */\n  function fitFlavourWord() {\n    if (!flavourWord) return;\n    flavourWord.style.fontSize = '';\n    var avail = flavourWord.clientWidth;\n    var need = flavourWord.scrollWidth;\n    if (need > avail && avail > 0) {\n      var base = parseFloat(getComputedStyle(flavourWord).fontSize);\n      flavourWord.style.fontSize = (Math.floor(base * (avail / need) * 10) / 10) + 'px';\n    }\n  }\n  var syncFlavVideo = function () {};\n  /* assigned by the buy-gallery module below; a flavour change drops any gallery\n     photo showing in the stage so the new pouch (and its back) is what you see. */\n  var resetPackGallery = function () {};\n  function setFlavour(f, animateWord) {\n    flavour = f;\n    document.body.dataset.flavour = f;\n    var F = FLAVOURS[f];\n    $$('.chip').forEach(function (c) { c.classList.toggle('active', c.dataset.flavour === f); });\n    $$('[data-pack]').forEach(function (w) {\n      var vn = w.querySelector('[data-pack-vanilla]');\n      var ch = w.querySelector('[data-pack-chocolate]');\n      if (vn) vn.classList.toggle('active', f === 'vanilla');\n      if (ch) ch.classList.toggle('active', f === 'chocolate');\n    });\n    $$('[data-flavour-name]').forEach(function (el) { el.textContent = F.label; });\n    if (flavourWord) {\n      if (animateWord && !reduceMotion) {\n        flavourWord.classList.add('swap');\n        setTimeout(function () {\n          flavourWord.textContent = F.word;\n          if (flavourDesc) flavourDesc.textContent = F.desc;\n          fitFlavourWord();\n          flavourWord.classList.remove('swap');\n        }, 260);\n      } else {\n        flavourWord.textContent = F.word;\n        if (flavourDesc) flavourDesc.textContent = F.desc;\n        fitFlavourWord();\n      }\n    }\n    resetMix();\n    renderBuy();\n    syncFlavVideo();\n    resetPackGallery();\n  }\n  document.addEventListener('click', function (e) {\n    var chip = e.target.closest ? e.target.closest('.chip') : null;\n    if (chip) setFlavour(chip.dataset.flavour, true);\n  });\n\n  /* ---------- pack flip ----------\n     Desktop (real pointer) flips on hover via CSS. Touch devices have no hover,\n     so bind a tap toggle only there. */\n  var canHover = window.matchMedia && window.matchMedia('(hover: hover)').matches;\n  if (!canHover) {\n    $$('.packwrap[data-flip]').forEach(function (w) {\n      w.addEventListener('click', function () {\n        /* a gallery photo has no back face \u2014 leave it alone */\n        var st = w.closest('.stage');\n        if (st && st.classList.contains('showing-gallery')) return;\n        w.classList.toggle('flipped');\n      });\n    });\n  }\n\n  /* ---------- buy gallery -> stage ----------\n     Tapping a thumbnail puts that photo in the big stage in place of the pouch.\n     Tapping the same one again, or switching flavour, returns to the pouch. */\n  (function () {\n    var media = $('.buy-media');\n    if (!media) return;\n    var stage = media.querySelector('.stage');\n    var wrap = media.querySelector('.packwrap');\n    var thumbs = $$('[data-gallery-thumb]', media);\n    if (!stage || !wrap || !thumbs.length) return;\n\n    var img = null;\n    var current = null;\n\n    function clear() {\n      current = null;\n      stage.classList.remove('showing-gallery');\n      thumbs.forEach(function (t) { t.setAttribute('aria-pressed', 'false'); });\n    }\n\n    function show(t) {\n      if (!img) {\n        /* built on first use so an unused gallery costs no request */\n        img = document.createElement('img');\n        img.className = 'pack-gallery';\n        img.decoding = 'async';\n        wrap.appendChild(img);\n      }\n      img.alt = t.getAttribute('data-full-alt') || '';\n      var set = t.getAttribute('data-full-srcset');\n      if (set) { img.srcset = set; img.sizes = '(max-width: 900px) 92vw, 46vw'; }\n      else { img.removeAttribute('srcset'); img.removeAttribute('sizes'); }\n      img.src = t.getAttribute('data-full');\n      current = t;\n      /* drop a held tap-flip so returning to the pouch shows its front */\n      wrap.classList.remove('flipped');\n      stage.classList.add('showing-gallery');\n      thumbs.forEach(function (x) { x.setAttribute('aria-pressed', x === t ? 'true' : 'false'); });\n    }\n\n    thumbs.forEach(function (t) {\n      t.addEventListener('click', function () {\n        if (current === t) clear(); else show(t);\n      });\n    });\n\n    resetPackGallery = clear;\n  })();\n\n  /* ---------- review posted ----------\n     Shopify redirects back to ?contact_posted=true. The confirmation sits inside\n     a .rv block, which is invisible until the reveal observer fires, and the\n     preloader means the #reviewForm anchor rarely lands you there \u2014 so the\n     customer sees an unchanged page and assumes nothing sent. Reveal it and\n     bring it into view. */\n  (function () {\n    if (document.location.search.indexOf('contact_posted=true') === -1) return;\n    var done = $('[data-rf-posted]');\n    if (!done) return;\n    var block = done.closest('.rev-form') || done.parentElement;\n    if (block) block.classList.add('in');\n    var go = function () {\n      try { done.scrollIntoView({ block: 'center', behavior: reduceMotion ? 'auto' : 'smooth' }); }\n      catch (e) { done.scrollIntoView(); }\n    };\n    /* after the preloader clears, or immediately if it already has */\n    if (loader && !loader.classList.contains('done')) setTimeout(go, 900);\n    else setTimeout(go, 120);\n  })();\n\n  /* ---------- reviews marquee ---------- */\n  (function () {\n    var t = $('#revTrack');\n    if (!t || reduceMotion) return;\n    var group = t.querySelector('.rev-group');\n    if (!group) return;\n    var clone = group.cloneNode(true);\n    clone.setAttribute('aria-hidden', 'true');\n    t.appendChild(clone);\n  })();\n\n  /* ---------- social proof filmstrip (drag + arrows) ---------- */\n  (function () {\n    var strip = $('[data-social]');\n    if (!strip) return;\n    var track = strip.querySelector('[data-social-track]');\n    if (!track) return;\n    var prev = strip.querySelector('[data-social-prev]');\n    var next = strip.querySelector('[data-social-next]');\n\n    function step() {\n      var card = track.querySelector('.social-card');\n      var gap = parseFloat(getComputedStyle(track).columnGap || getComputedStyle(track).gap) || 18;\n      return card ? card.getBoundingClientRect().width + gap : track.clientWidth * 0.8;\n    }\n    function update() {\n      var max = track.scrollWidth - track.clientWidth - 2;\n      if (prev) prev.disabled = track.scrollLeft <= 2;\n      if (next) next.disabled = track.scrollLeft >= max;\n    }\n    var behavior = reduceMotion ? 'auto' : 'smooth';\n    if (prev) prev.addEventListener('click', function () { track.scrollBy({ left: -step(), behavior: behavior }); });\n    if (next) next.addEventListener('click', function () { track.scrollBy({ left: step(), behavior: behavior }); });\n    track.addEventListener('scroll', function () { window.requestAnimationFrame(update); }, { passive: true });\n    window.addEventListener('resize', update);\n    update();\n\n    /* drag-to-scroll (mouse only; touch keeps native momentum + snap) */\n    var down = false, startX = 0, startScroll = 0;\n    track.addEventListener('pointerdown', function (e) {\n      if (e.pointerType !== 'mouse' || e.button !== 0) return;\n      down = true; startX = e.clientX; startScroll = track.scrollLeft;\n      track.classList.add('is-dragging');\n      try { track.setPointerCapture(e.pointerId); } catch (err) {}\n    });\n    track.addEventListener('pointermove', function (e) {\n      if (!down) return;\n      track.scrollLeft = startScroll - (e.clientX - startX);\n    });\n    function end() { if (!down) { return; } down = false; track.classList.remove('is-dragging'); }\n    track.addEventListener('pointerup', end);\n    track.addEventListener('pointercancel', end);\n    track.addEventListener('dragstart', function (e) { e.preventDefault(); });\n  })();\n\n  /* ---------- review form (client-side stub; wire to review app in Phase 2) ---------- */\n  (function () {\n    var form = $('#reviewForm');\n    if (!form) return;\n    var rating = 0;\n    var stars = $$('.rf-star', form);\n    stars.forEach(function (s, i) {\n      s.addEventListener('click', function () {\n        rating = i + 1;\n        stars.forEach(function (x, j) { x.textContent = j < rating ? '\u2605' : '\u2606'; x.setAttribute('aria-pressed', j < rating); });\n      });\n    });\n    $$('.rf-flav', form).forEach(function (b) {\n      b.addEventListener('click', function () { $$('.rf-flav', form).forEach(function (x) { x.classList.toggle('active', x === b); }); });\n    });\n    form.addEventListener('submit', function (e) {\n      var name = ($('#rfName') || {}).value, email = ($('#rfEmail') || {}).value, text = ($('#rfText') || {}).value;\n      if (!rating || !name || !name.trim() || !email || !email.trim() || !text || !text.trim()) {\n        e.preventDefault();\n        toast('Add a rating and your details first.');\n        return;\n      }\n      /* The contact form carries name, email and body only \u2014 fold the rating and\n         flavour into the body or they never reach the inbox. Then let the submit\n         through: preventDefault here is what used to make this a dead form. */\n      var flavEl = $('.rf-flav.active', form);\n      var flavour = flavEl ? flavEl.textContent.trim() : '';\n      var ratingEl = $('#rfRating'), flavourEl = $('#rfFlavour'), bodyEl = $('#rfText');\n      if (ratingEl) ratingEl.value = rating;\n      if (flavourEl) flavourEl.value = flavour;\n      if (bodyEl && bodyEl.value.indexOf('Rating:') !== 0) {\n        var NL = String.fromCharCode(10);\n        bodyEl.value = ['Rating: ' + rating + '/5', 'Flavour: ' + flavour, '', bodyEl.value].join(NL);\n      }\n      toast('Sending your review\u2026');\n    });\n  })();\n\n  /* ---------- buy card ---------- */\n  var plan = 'sub', qty = 1;\n  var qVal = $('#qVal');\n  var addPrice = $('#addPrice');\n  var fbPrice = $('#fbPrice');\n  var addBtn = $('#addBtn');\n\n  var packBtns = $$('.pack');\n  var packMode = packBtns.length > 0;\n  var packSize = 3;\n  var mix = { vanilla: 3, chocolate: 0 };\n  var mixWrap = $('[data-mix]');\n  var oncePacks = $('[data-once-packs]');\n  var subscriptionOptions = $('[data-subscription-options]');\n  var subOptionBtns = $$('[data-sub-option]');\n  var subOptionCards = $$('[data-sub-option-card]');\n  var subscriptionOption = '90';\n  var addActionLabel;\n\n  /* One-time bundle pricing mirrors the automatic discounts configured in Shopify,\n     which are \"amount off each eligible item\" with a MINIMUM quantity \u2014 not fixed\n     totals for exactly 3 or exactly 5. Modelling them as per-unit bands is what\n     makes 4 pouches keep the 3-tub rate and 6+ keep the 5-tub rate, matching what\n     the cart actually charges. Highest qualifying band wins, so keep this sorted\n     by min descending. Subscription pricing comes from the live selling plans.\n     If a tier changes in admin, change it here too. */\n  var ONCE_BANDS = [\n    { min: 5, offPerUnit: 1999 },   /* Bundle \u00B7 5 tubs (17% off) -> $100.00/pouch */\n    { min: 3, offPerUnit: 1333 }    /* Bundle \u00B7 3 tubs (11% off) -> $106.66/pouch */\n  ];\n  function onceUnitOffCents(qty) {\n    for (var i = 0; i < ONCE_BANDS.length; i++) {\n      if (qty >= ONCE_BANDS[i].min) return ONCE_BANDS[i].offPerUnit;\n    }\n    return 0;\n  }\n  /* ---------- subscription supplies ----------\n     A subscription is one bundle product per term (\"30-Day Supply\", \"90-Day\n     Supply\") carrying its own selling plan, so it adds as a SINGLE cart line.\n     supplyFor() returns null when the products/plans aren't set up yet, and\n     every caller falls back to the old per-pouch plans in that case. */\n  function supplyFor(option) {\n    var s = PRODUCT.supplies && PRODUCT.supplies[option];\n    if (!s || !s.id || !s.plans || !s.plans.length) return null;\n    return s;\n  }\n  /* Pick the plan whose name carries the right cadence rather than trusting\n     position. Each supply group holds exactly one plan today, so this is the\n     same answer plans[0] gave \u2014 but the order of that array is Shopify's, and\n     it changes if a second plan is ever added to a group or if the plans are\n     recreated (which is what migrating subscription apps does). Matches\n     subscriptionPlanFor() below, which has always done it this way. */\n  function planFromList(plans, option) {\n    if (!plans || !plans.length) return null;\n    var weeks = option === '90' ? 12 : 4;\n    var named = plans.filter(function (p) {\n      return new RegExp('(?:every )?' + weeks + '\\\\s*weeks?', 'i').test(p.name || '');\n    })[0];\n    return named || plans[0];\n  }\n  function supplyPlanFor(option) {\n    var s = supplyFor(option);\n    return s ? planFromList(s.plans, option) : null;\n  }\n  /* \"2 \u00D7 Real Vanilla + 1 \u00D7 Dutch Chocolate\" -> { vanilla: 2, chocolate: 1 }.\n     Counts are summed per flavour, so the order the option value is written in\n     does not matter. A variant that carries no counts \u2014 notably Shopify's\n     \"Default Title\" on a single-variant product \u2014 parses to all zeros and can\n     never match a real mix, which is what makes this safe to ship before the\n     variants exist. */\n  function parseMixTitle(title) {\n    var out = { vanilla: 0, chocolate: 0 };\n    var value = String(title || '').trim();\n    value.split('+').forEach(function (part) {\n      var m = part.match(/(\\d+)\\s*[\u00D7xX*]\\s*(.+)/);\n      if (!m) return;\n      var n = parseInt(m[1], 10) || 0;\n      if (/choc/i.test(m[2])) out.chocolate += n;\n      else if (/vanilla/i.test(m[2])) out.vanilla += n;\n    });\n    /* The 30-Day replacement uses exact simple one-pouch flavour titles. */\n    if (!out.vanilla && !out.chocolate) {\n      if (/^Real Vanilla$/i.test(value)) out.vanilla = 1;\n      else if (/^Dutch Chocolate$/i.test(value)) out.chocolate = 1;\n    }\n    return out;\n  }\n  /* The supply variant whose flavour split equals the shopper's. null when the\n     supply product has no mix variants yet, or when no variant matches \u2014 both\n     of which fall back to the original single-variant line. */\n  function supplyVariantForMix(option, wanted) {\n    var s = supplyFor(option);\n    if (!s || !s.mixes || !s.mixes.length) return null;\n    var want = { vanilla: wanted.vanilla || 0, chocolate: wanted.chocolate || 0 };\n    for (var i = 0; i < s.mixes.length; i++) {\n      var got = parseMixTitle(s.mixes[i].title);\n      if (got.vanilla === want.vanilla && got.chocolate === want.chocolate) return s.mixes[i];\n    }\n    return null;\n  }\n  /* pouches the chosen term ships \u2014 what the flavour mix must sum to */\n  function supplyPouches(option) {\n    var s = supplyFor(option);\n    return s ? s.pouches : (option === '90' ? 3 : 1);\n  }\n\n  function sellingPlansFor(v) { return (v && v.sellingPlans) || []; }\n  function subscriptionPlanFor(v, option) {\n    var plans = sellingPlansFor(v);\n    var weeks = option === '90' ? 12 : 4;\n    var named = plans.filter(function (p) { return new RegExp('(?:every )?' + weeks + '\\\\s*weeks?', 'i').test(p.name || ''); })[0];\n    if (named) return named;\n    var sorted = plans.slice().sort(function (a, b) { return a.price - b.price; });\n    return option === '90' ? sorted[0] : sorted[sorted.length - 1];\n  }\n  function baseUnitCents(v, isSub) {\n    if (!v) return PRODUCT.priceOnce || 0;\n    if (!isSub) return v.price;\n    var allocation = subscriptionPlanFor(v, subscriptionOption);\n    return allocation ? allocation.price : 0;\n  }\n  function packTotalCents(size, isSub) {\n    var unit = baseUnitCents(variantFor(flavour), isSub);\n    if (isSub) return unit * size;\n    return Math.max(0, unit - onceUnitOffCents(size)) * size;\n  }\n  function packUnitCents(size, isSub) { return Math.round(packTotalCents(size, isSub) / size); }\n  function packSavePct(size, isSub) {\n    var v = variantFor(flavour);\n    if (!v || !v.price) return 0;\n    return Math.round((1 - packTotalCents(size, isSub) / (v.price * size)) * 100);   /* % off one-time base, per the PDF */\n  }\n  function resetMix() {\n    if (!packMode) return;\n    mix = { vanilla: 0, chocolate: 0 };\n    /* default: every pouch is the featured (chip) flavour. On a subscription the\n       total is the supply's pouch count, not the one-time pack size. */\n    mix[flavour] = plan === 'sub' ? supplyPouches(subscriptionOption) : packSize;\n  }\n\n  function variantFor(f) {\n    return (PRODUCT.variants && PRODUCT.variants[f]) || null;\n  }\n  /* Per-pouch figures for the buy card. Subscription pouch prices come from the\n     supply bundle (its plan price divided by the pouches it ships) so the card\n     always quotes exactly what checkout will charge; the per-pouch plans on\n     OLEVATE Complete are only the fallback while the supplies aren't live. */\n  function subPouchCents(option) {\n    var s = supplyFor(option), pl = supplyPlanFor(option);\n    if (s && pl) return Math.round(pl.price / s.pouches);\n    var legacy = subscriptionPlanFor(variantFor(flavour), option);\n    return legacy ? legacy.price : 0;\n  }\n  function subTotalCents(option) {\n    var pl = supplyPlanFor(option);\n    if (pl) return pl.price;\n    return subPouchCents(option) * supplyPouches(option);\n  }\n  function currentPrices() {\n    var v = variantFor(flavour);\n    var once = v ? v.price : PRODUCT.priceOnce;\n    return { once: once, sub30: subPouchCents('30'), sub90: subPouchCents('90') };\n  }\n  function unitPrice() {\n    var pr = currentPrices();\n    return plan === 'sub' ? (subscriptionOption === '90' ? pr.sub90 : pr.sub30) : pr.once;\n  }\n  function renderBuy() {\n    var pageProduct = productFromPage();\n    if (pageProduct) PRODUCT = pageProduct;\n    var pr = currentPrices();\n    [['30', pr.sub30, 1], ['90', pr.sub90, 3]].forEach(function (entry) {\n      var option = entry[0], subPrice = entry[1], count = entry[2];\n      /* exact plan price, never subPrice*count: the 90-day plan is a fixed $90 off,\n         so multiplying a rounded per-pouch figure would drift a cent */\n      var total = subTotalCents(option);\n      var monthly = $('[data-sub-' + option + '-monthly]');\n      var billed = $('[data-sub-' + option + '-billed]');\n      var serving = $('[data-sub-' + option + '-serving]');\n      if (monthly) monthly.textContent = money(total / count);\n      if (billed) billed.textContent = 'billed ' + money(total) + ' every ' + (option === '90' ? '12 weeks' : '4 weeks');\n      if (serving) serving.textContent = money(total / (count * 30));\n    });\n    if (oncePacks) oncePacks.hidden = plan !== 'once';\n    if (subscriptionOptions) subscriptionOptions.hidden = plan !== 'sub';\n    subOptionBtns.forEach(function (b) { b.setAttribute('aria-expanded', String(b.dataset.subOption === subscriptionOption)); });\n    subOptionCards.forEach(function (card) { card.classList.toggle('active', card.dataset.subOptionCard === subscriptionOption); });\n    var toggleAction = $('[data-plan-toggle-action]'), togglePrice = $('[data-price-once-option]');\n    if (toggleAction) toggleAction.textContent = plan === 'sub' ? 'One-time purchase' : 'Subscribe & save';\n    if (togglePrice) togglePrice.textContent = plan === 'sub' ? money(pr.once) : '';\n    if (qVal) qVal.textContent = qty;\n    var subscriptionTotal = subTotalCents(subscriptionOption);\n    if (addPrice) addPrice.textContent = '\u00B7 ' + money(plan === 'sub' ? subscriptionTotal : (packMode ? packTotalCents(packSize, false) : unitPrice() * qty));\n    if (addActionLabel) addActionLabel.textContent = 'Add to cart';\n    if (fbPrice) fbPrice.textContent = FLAVOURS[flavour].label + ' \u00B7 from ' + money(pr.sub90);\n    if (packMode) renderPack();\n  }\n  function renderPack() {\n    var isSub = plan === 'sub';\n    packBtns.forEach(function (b) {\n      var size = parseInt(b.dataset.size, 10) || 1;\n      b.classList.toggle('active', size === packSize);\n      var unit = b.querySelector('[data-pk-unit]');\n      var save = b.querySelector('[data-pk-save]');\n      var pct = packSavePct(size, isSub);\n      if (unit) unit.textContent = money(packUnitCents(size, isSub)) + '/pouch';\n      if (save) save.textContent = pct > 0 ? pct + '% off' : '';\n    });\n    if (mixWrap) {\n      mixWrap.hidden = plan === 'sub' ? subscriptionOption !== '90' : false;\n      $$('[data-mix-count]', mixWrap).forEach(function (el) { el.textContent = mix[el.dataset.mixCount] || 0; });\n    }\n    if (addPrice && !isSub) addPrice.textContent = '\u00B7 ' + money(packTotalCents(packSize, false));\n  }\n  function revealOneTimePacks() {\n    if (!oncePacks || oncePacks.hidden) return;\n    window.setTimeout(function () {\n      if (!oncePacks || oncePacks.hidden) return;\n      window.location.hash = 'one-time-packs';\n      window.setTimeout(function () { window.history.replaceState(null, '', window.location.pathname + window.location.search); }, 350);\n    }, 120);\n  }\n  function bindBuyControls() {\n    var buyCard = $('#buy');\n    if (!buyCard || buyCard.dataset.buyControlsBound === 'ready') return;\n    qVal = $('#qVal');\n    addPrice = $('#addPrice');\n    addActionLabel = $('#addActionLabel');\n    fbPrice = $('#fbPrice');\n    addBtn = $('#addBtn');\n    if (!addBtn) return;\n    buyCard.dataset.buyControlsBound = 'ready';\n    packBtns = $$('.pack', buyCard);\n    packMode = packBtns.length > 0;\n    mixWrap = $('[data-mix]', buyCard);\n    oncePacks = $('[data-once-packs]', buyCard);\n    subscriptionOptions = $('[data-subscription-options]', buyCard);\n    subOptionBtns = $$('[data-sub-option]', buyCard);\n    subOptionCards = $$('[data-sub-option-card]', buyCard);\n\n    var planToggle = $('[data-plan-toggle]', buyCard);\n    if (planToggle) planToggle.addEventListener('click', function () {\n      plan = plan === 'sub' ? 'once' : 'sub';\n      packSize = plan === 'sub' ? (subscriptionOption === '90' ? 3 : 1) : 3;\n      resetMix();\n      renderBuy();\n      if (plan === 'once') revealOneTimePacks();\n    });\n    subOptionBtns.forEach(function (b) {\n      b.addEventListener('click', function () {\n        subscriptionOption = b.dataset.subOption;\n        packSize = subscriptionOption === '90' ? 3 : 1;\n        resetMix();\n        renderBuy();\n      });\n    });\n    var qPlus = $('#qPlus'), qMinus = $('#qMinus');\n    if (qPlus) qPlus.addEventListener('click', function () { qty = Math.min(99, qty + 1); renderBuy(); });\n    if (qMinus) qMinus.addEventListener('click', function () { qty = Math.max(1, qty - 1); renderBuy(); });\n    packBtns.forEach(function (b) {\n      b.addEventListener('click', function () {\n        packSize = parseInt(b.dataset.size, 10) || 1;\n        resetMix();\n        renderBuy();\n      });\n    });\n    if (mixWrap) {\n      mixWrap.addEventListener('click', function (e) {\n        var btn = e.target.closest ? e.target.closest('[data-mix-step]') : null;\n        if (!btn) return;\n        /* Keep a pouch-step click isolated from the wider product-card handlers. */\n        e.preventDefault();\n        e.stopPropagation();\n        var f = btn.dataset.mixF, other = f === 'vanilla' ? 'chocolate' : 'vanilla';\n        var step = parseInt(btn.dataset.mixStep, 10);\n        var next = (mix[f] || 0) + step;\n        if (plan === 'once') {\n          if (next < 0 || next > 99 || (step < 0 && packSize <= 1)) return;\n          mix[f] = next;\n          packSize = mix.vanilla + mix.chocolate;\n        } else {\n          /* a supply ships a fixed number of pouches, so the two steppers are\n             two halves of one total: raising vanilla lowers chocolate */\n          var cap = supplyPouches(subscriptionOption);\n          if (next < 0 || next > cap) return;\n          mix[f] = next;\n          mix[other] = cap - next;\n        }\n        renderBuy();\n      });\n    }\n    if (addBtn) addBtn.addEventListener('click', addCurrentSelection);\n  }\n\n  /* ---------- cart (Shopify AJAX API) ---------- */\n  var drawer = $('#drawer');\n  var scrim = $('#scrim');\n  var dItems = $('#dItems');\n  var backImg = { vanilla: dItems && dItems.dataset.backVanilla, chocolate: dItems && dItems.dataset.backChocolate };\n  var dSubtotal = $('#dSubtotal');\n  var dUpsell = $('#dUpsell');\n  var dShip = $('#dShip');\n  var SHIP_THRESHOLD = (dShip && parseInt(dShip.dataset.threshold, 10)) || 3;\n  var drawerClose = $('#drawerClose');\n  var checkoutBtn = $('#checkoutBtn');\n\n  function openDrawer() {\n    if (!drawer) return;\n    closeMenu(false);\n    drawer.classList.add('open'); if (scrim) scrim.classList.add('show');\n    drawer.setAttribute('aria-hidden', 'false');\n    drawer.removeAttribute('inert');\n    document.body.style.overflow = 'hidden';\n    if (drawerClose) drawerClose.focus();\n  }\n  function closeDrawer() {\n    if (!drawer) return;\n    drawer.classList.remove('open'); if (scrim) scrim.classList.remove('show');\n    drawer.setAttribute('aria-hidden', 'true');\n    drawer.setAttribute('inert', '');\n    document.body.style.overflow = '';\n  }\n  /* ---------- mobile menu ---------- */\n  /* Home page only, and only reachable below 860px where the header's link row\n     is display:none. Shares #scrim and the drawer's easing, and opening either\n     one closes the other \u2014 they slide out of the same edge at the same depth. */\n  var menu = $('#menu');\n  var menuOpen = $('#menuOpen');\n  var menuClose = $('#menuClose');\n\n  function openMenu() {\n    if (!menu) return;\n    closeDrawer();\n    menu.classList.add('open'); if (scrim) scrim.classList.add('show');\n    menu.setAttribute('aria-hidden', 'false');\n    menu.removeAttribute('inert');\n    if (menuOpen) menuOpen.setAttribute('aria-expanded', 'true');\n    document.body.style.overflow = 'hidden';\n    if (menuClose) menuClose.focus();\n  }\n  /* returnFocus is suppressed when the menu closes because the user is going\n     somewhere \u2014 following a link, or opening the cart. Pulling focus back to a\n     trigger they have just left behind would fight them. */\n  function closeMenu(returnFocus) {\n    if (!menu || !menu.classList.contains('open')) return;\n    menu.classList.remove('open'); if (scrim) scrim.classList.remove('show');\n    menu.setAttribute('aria-hidden', 'true');\n    menu.setAttribute('inert', '');\n    if (menuOpen) menuOpen.setAttribute('aria-expanded', 'false');\n    document.body.style.overflow = '';\n    if (returnFocus !== false && menuOpen) menuOpen.focus();\n  }\n  if (menuOpen) menuOpen.addEventListener('click', openMenu);\n  if (menuClose) menuClose.addEventListener('click', function () { closeMenu(); });\n  $$('#menu .m-list a').forEach(function (a) {\n    a.addEventListener('click', function () { closeMenu(false); });\n  });\n  /* The trigger is display:none above 860px, so a menu still open after a\n     resize past that point would have nothing left to close it. */\n  window.addEventListener('resize', function () {\n    if (window.innerWidth > 860) closeMenu(false);\n  });\n\n  if (scrim) scrim.addEventListener('click', function () { closeDrawer(); closeMenu(false); });\n  if (drawerClose) drawerClose.addEventListener('click', closeDrawer);\n  document.addEventListener('keydown', function (e) {\n    if (e.key !== 'Escape') return;\n    closeDrawer();\n    closeMenu();\n  });\n\n  /* cart triggers (header + floatbar) \u2014 shown only when the cart has items */\n  var cartOpeners = $$('[data-cart-open]');\n  var cartCounts = $$('[data-cart-count]');\n  cartOpeners.forEach(function (b) { b.addEventListener('click', openDrawer); });\n  function updateCartUI(cart) {\n    var n = (cart && cart.item_count) || 0;\n    cartCounts.forEach(function (el) { el.textContent = n; });\n    cartOpeners.forEach(function (b) { b.classList.toggle('show', n > 0); });\n  }\n\n  /* Free-shipping progress. Subscription orders receive standard shipping free;\n     one-time orders unlock it at three OLEVATE Complete pouches. */\n  var SHIP_WORDS = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];\n  function shipNum(k) { return SHIP_WORDS[k] || String(k); }\n  function shipPouches(k) { var w = shipNum(k); return w.charAt(0).toUpperCase() + w.slice(1) + (k === 1 ? ' pouch' : ' pouches'); }\n  function shipFill(tpl, value) { return String(tpl).replace('[count]', value); }\n  function renderShip(cart) {\n    if (!dShip) return;\n    var items = (cart && cart.items) || [];\n    var pouchHandle = dShip.dataset.pouchHandle || 'olevate-complete';\n    var isSubscription = items.some(function (it) { return !!it.selling_plan_allocation; });\n    var n = items.reduce(function (total, it) { return total + (it.handle === pouchHandle ? it.quantity : 0); }, 0);\n    var need = SHIP_THRESHOLD - n;\n    var complete = isSubscription || need <= 0;\n    var fill = dShip.querySelector('.d-ship-fill');\n    var h = dShip.querySelector('.d-ship-h');\n    var sub = dShip.querySelector('.d-ship-sub');\n    if (fill) fill.style.width = (isSubscription ? 100 : Math.max(0, Math.min(1, n / SHIP_THRESHOLD)) * 100) + '%';\n    dShip.classList.toggle('is-complete', complete);\n    /* Copy templates come from the theme settings, handed over as data\n       attributes by cart-drawer.liquid. The server-rendered first paint and\n       this re-render therefore read from one source \u2014 they used to be two\n       hardcoded copies kept in step by hand, which is a bug waiting to happen\n       the first time someone edits only one of them. */\n    var D = dShip.dataset;\n    var head = '', subline = '';\n    if (isSubscription) {\n      head = D.msgSubscription || 'Free standard shipping included.';\n    } else if (complete) {\n      head = D.msgUnlocked || 'Free standard shipping unlocked.';\n    } else if (n === 0) {\n      head = shipFill(D.msgEmpty || '[count] unlock free standard shipping.', shipPouches(SHIP_THRESHOLD));\n    } else {\n      head = shipFill(D.msgProgress || '[count] from free standard shipping.', shipPouches(need));\n      subline = need === 1\n        ? (D.subOne || 'One more. Standard shipping is on us.')\n        : shipFill(D.subMany || 'Add [count] more. Standard shipping is on us.', shipNum(need));\n    }\n    if (h) h.textContent = head;\n    if (sub) { sub.textContent = subline; sub.hidden = !subline; }\n  }\n\n  /* ---------- welcome kit ----------\n     The kit is named ON the subscription line and is not a cart line of its own.\n\n     It was briefly both \u2014 real $0 lines zeroed by a Buy-X-get-Y discount \u2014 to\n     make it draw shaker and towel stock down. That was the wrong trade and it\n     was reverted on 8 Aug 2026. A Shopify automatic discount cannot express\n     \"one shaker AND one towel\": it frees the two CHEAPEST eligible items, so a\n     customer who also bought a towel had both towels freed and the kit's shaker\n     silently charged \u2014 $11 over, with the drawer still claiming the kit was\n     free. The theme does not get to choose where a discount lands, so no amount\n     of code here could have fixed it.\n\n     With no discount in the picture that whole class of fault is gone, in every\n     order of operations, and the paid shaker/towel upsell always charges. Stock\n     for the two components is drawn down by the Flow automation instead. */\n  /* Carts built during the 7\u20138 Aug window still hold the kit as its own lines.\n     Once the discount backing them is switched off those lines bill at full\n     price, so sweep them: the kit is on the subscription line now. Sequential,\n     because concurrent cart mutations drop one another, and a key is never\n     retried so a line the cart refuses to drop cannot loop against the\n     re-render that follows. Self-limiting \u2014 no cart made after this ships will\n     ever match. */\n  var legacyKitTries = {};\n  var LEGACY_KIT_DONE = 99;\n  function isLegacyKitLine(it) {\n    return !!(it && it.properties && it.properties['Welcome kit'] && !it.selling_plan_allocation);\n  }\n  function sweepLegacyKit(lines) {\n    var queue = lines.filter(function (l) { return (legacyKitTries[l.key] || 0) < 2; });\n    if (!queue.length) return false;\n    queue.forEach(function (l) { legacyKitTries[l.key] = (legacyKitTries[l.key] || 0) + 1; });\n    (function step() {\n      var line = queue.shift();\n      if (!line) { refreshCart().catch(function () {}); return; }\n      fetch(ROUTES.cartChange || '/cart/change.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n        body: JSON.stringify({ id: line.key, quantity: 0 })\n      }).then(function (r) {\n        /* Only a CONFIRMED removal retires the key. A refused one has to stay\n           retryable \u2014 that line bills at full price now the discount is gone,\n           and silently giving up on it is the failure that costs a customer\n           money. Bounded at two attempts so it still cannot loop. */\n        if (r && r.ok) legacyKitTries[line.key] = LEGACY_KIT_DONE;\n        step();\n      }, step);\n    })();\n    return true;\n  }\n\n  function renderCart(cart) {\n    var legacy = ((cart && cart.items) || []).filter(isLegacyKitLine);\n    if (legacy.length && sweepLegacyKit(legacy)) return;\n    updateCartUI(cart);\n    renderShip(cart);\n    if (!dItems) return;\n    if (!cart || !cart.items || !cart.items.length) {\n      dItems.innerHTML = '<p class=\"d-empty\">Your pouch is empty, for now.</p>';\n      if (dSubtotal) dSubtotal.textContent = money(0);\n      renderUpsell(cart);\n      return;\n    }\n    dItems.innerHTML = cart.items.map(function (it, i) {\n      var img = it.image || (it.featured_image && it.featured_image.url) || '';\n      var backFlav = /choc/i.test(it.variant_title || it.product_title || '') ? 'chocolate' : 'vanilla';\n      var backUrl = backImg[backFlav] || '';\n      var isSub = !!it.selling_plan_allocation;\n      var planName = isSub ? ((it.selling_plan_allocation.selling_plan && it.selling_plan_allocation.selling_plan.name) || 'Subscription') : 'One-time';\n      var giftNote = it.properties && it.properties['OLEVATE welcome gift'] ? 'Welcome gift' : '';\n      var originalLinePrice = it.original_line_price != null ? it.original_line_price : (it.original_price || 0) * it.quantity;\n      var discountAmount = it.total_discount != null ? it.total_discount : Math.max(0, originalLinePrice - it.final_line_price);\n      var discountPct = originalLinePrice > 0 ? Math.round(discountAmount / originalLinePrice * 100) : 0;\n      var discountCopy = !isSub && discountPct > 0 ? '<div class=\"d-discount\">' + discountPct + '% bundle discount applied</div>' : '';\n      /* \"Default Title\" is Shopify's placeholder on single-variant products\n         (the supply bundles) \u2014 never show it to a customer. */\n      var vt = (it.variant_title && it.variant_title !== 'Default Title') ? (it.variant_title + ' \u00B7 ') : '';\n      var props = it.properties || {};\n      /* Since the supply products gained real mix variants the variant title IS\n         the mix (\"1 \u00D7 Real Vanilla\"), so the property would print it twice. */\n      var mixNote = (props['Your mix'] && props['Your mix'] !== it.variant_title)\n        ? '<div class=\"d-sub-line\">' + esc(props['Your mix']) + '</div>'\n        : '';\n      /* The kit is text on this line, so it has no thumbnail of its own \u2014 draw\n         the one bundled shot from assets. Every subscription line carries its\n         own note: two subscriptions in a cart earn two kits. \"free\" is safe to\n         state now that no discount has to fire for it to be true. */\n      var kitImg = (dItems && dItems.dataset.kitImg) || '';\n      var kitImgSet = (dItems && dItems.dataset.kitImgset) || '';\n      var kitLabel = isSub ? (props['Welcome kit'] || '') : '';\n      var kitNote = kitLabel\n        ? '<div class=\"d-sub-kit\">'\n          + (kitImg ? '<img class=\"d-sub-kit-img\" src=\"' + esc(kitImg) + '\"' + (kitImgSet ? ' srcset=\"' + esc(kitImgSet) + '\" sizes=\"44px\"' : '') + ' alt=\"\" width=\"240\" height=\"240\" decoding=\"async\">' : '')\n          + '<span>Welcome kit \u00B7 ' + esc(kitLabel) + ' \u00B7 free</span>'\n          + '</div>'\n        : '';\n      /* the plan's own name reads \"Deliver every 12 weeks, A$90.00 off\" \u2014 fine\n         internally, wrong on a storefront, so show the saving instead */\n      if (isSub) {\n        /* A selling plan's saving isn't a line discount \u2014 price IS the plan\n           price \u2014 so read it off the allocation's compare-at instead. */\n        var alloc = it.selling_plan_allocation || {};\n        var savedPct = discountPct;\n        if (!savedPct && alloc.compare_at_price && alloc.price) {\n          savedPct = Math.round((1 - alloc.price / alloc.compare_at_price) * 100);\n        }\n        var everyMatch = /every\\s+(\\d+)\\s*(week|month)/i.exec(planName);\n        planName = everyMatch\n          ? ('Every ' + everyMatch[1] + ' ' + everyMatch[2] + (everyMatch[1] === '1' ? '' : 's') + (savedPct > 0 ? ' \u00B7 Save ' + savedPct + '%' : ''))\n          : planName;\n      }\n      return '<div class=\"d-item\" style=\"margin-top:' + (i ? 18 : 0) + 'px\">' +\n        '<div class=\"thumb' + (backUrl ? ' has-flip' : '') + '\">' +\n        (img ? '<img class=\"t-front\" src=\"' + esc(img) + '\" alt=\"\">' : '') +\n        (backUrl ? '<img class=\"t-back\" src=\"' + esc(backUrl) + '\" alt=\"\" aria-hidden=\"true\">' : '') +\n        '</div>' +\n        '<div class=\"di-b\">' +\n        '<div class=\"di-n\">' + esc(it.product_title) + '</div>' +\n        '<div class=\"di-m\">' + esc(giftNote || (vt + planName)) + '</div>' +\n        mixNote +\n        discountCopy +\n        '<div class=\"qty\">' +\n        '<button data-key=\"' + esc(it.key) + '\" data-delta=\"-1\" aria-label=\"Decrease\">\u2212</button>' +\n        '<input class=\"qv\" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" data-key=\"' + esc(it.key) + '\" value=\"' + esc(String(it.quantity)) + '\" aria-label=\"Quantity\">' +\n        '<button data-key=\"' + esc(it.key) + '\" data-delta=\"1\" aria-label=\"Increase\">+</button>' +\n        '</div></div>' +\n        '<div class=\"di-p\">' + money(it.final_line_price) + '</div>' +\n        /* Outside .di-b on purpose \u2014 it needs a full-width row of the item, not\n           a place in the text column. See .d-sub-kit in base.css. */\n        kitNote +\n        '</div>';\n    }).join('');\n    /* The bundle discount is an ORDER-level automatic discount, so Shopify leaves\n       the line prices alone and only cart.total_price drops. Showing the saving\n       against the line would therefore be a lie about what that line costs; the\n       subtotal is where the money actually comes off, so the original goes here,\n       struck through, beside the discounted figure. Without it the drawer reads\n       as $119.99 on the line and $108 at the bottom with nothing to explain the\n       gap. Both values come from money(), never from user input. */\n    if (dSubtotal) {\n      var origTotal = cart.original_total_price != null ? cart.original_total_price : cart.total_price;\n      dSubtotal.innerHTML = (origTotal > cart.total_price\n        ? '<s class=\"sv-was\">' + money(origTotal) + '</s> '\n        : '') + money(cart.total_price);\n    }\n    renderUpsell(cart);\n  }\n\n  /* ---------- cart add-ons ----------\n     Always offered, and repeatable: a subscriber gets a shaker and towel free\n     with their first order but can still buy more, and adding one doesn't take\n     the option away. Client's call \u2014 sell as much as possible, keep it a single\n     tap with nothing to work out.\n\n     The heading switches to \"Add extra\" once the welcome kit is already in play,\n     so a price sitting under \"Welcome kit \u00B7 Shaker + Towel\" cannot read as a\n     charge for the free one. */\n  function renderUpsell(cart) {\n    if (!dUpsell) return;\n    var items = (cart && cart.items) || [];\n    var hasSub = items.some(function (it) { return !!it.selling_plan_allocation; });\n    var qty = {};\n    items.forEach(function (it) { qty[it.id] = (qty[it.id] || 0) + it.quantity; });\n\n    var head = $('.d-upsell-h', dUpsell);\n    if (head) head.textContent = hasSub ? 'Add extra' : 'Add to your order';\n\n    $$('[data-upsell]', dUpsell).forEach(function (row) {\n      row.hidden = false;\n      var n = qty[Number(row.getAttribute('data-upsell-id'))] || 0;\n      var tag = $('[data-upsell-count]', row);\n      if (tag) {\n        tag.textContent = n ? n + ' in cart' : '';\n        tag.hidden = !n;\n      }\n    });\n    dUpsell.hidden = !items.length;\n  }\n\n  if (dUpsell) {\n    dUpsell.addEventListener('click', function (e) {\n      var btn = e.target.closest ? e.target.closest('[data-upsell-add]') : null;\n      if (!btn || btn.disabled) return;\n      var row = btn.closest('[data-upsell]');\n      var id = Number(row && row.getAttribute('data-upsell-id'));\n      if (!id) return;\n      btn.disabled = true;\n      var label = btn.textContent;\n      btn.textContent = 'Adding';\n      fetch(ROUTES.cartAdd || '/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n        body: JSON.stringify({ items: [{ id: id, quantity: 1 }] })\n      }).then(function (r) {\n        if (!r.ok) return r.json().then(function (x) { throw new Error(x.description || 'Could not add'); });\n        return r.json();\n      }).then(function () {\n        return refreshCart();\n      }).then(function () {\n        var name = row.querySelector('.d-upsell-n');\n        toast('Added \u00B7 ' + (name ? name.textContent : 'item'));\n      }).catch(function (err) {\n        toast(err.message || 'Could not add');\n      }).finally(function () {\n        btn.disabled = false;\n        btn.textContent = label;\n      });\n    });\n  }\n\n  function fetchCart() {\n    return fetch(ROUTES.cart || '/cart.js', { headers: { 'Accept': 'application/json' } })\n      .then(function (r) {\n        if (!r.ok) throw new Error('Cart unavailable');\n        return r.json();\n      });\n  }\n  function refreshCart() {\n    return fetchCart().then(renderCart);\n  }\n\n  function changeCartLine(key, newQty) {\n    return fetch(ROUTES.cartChange || '/cart/change.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ id: key, quantity: newQty })\n    }).then(function (r) {\n      if (!r.ok) throw new Error('Could not update cart');\n      return r.json();\n    }).then(renderCart)\n      .catch(function (err) {\n        toast(err.message || 'Could not update cart');\n        refreshCart().catch(function () {});\n      });\n  }\n\n  if (dItems) {\n    dItems.addEventListener('click', function (e) {\n      var thumb = e.target.closest ? e.target.closest('.thumb.has-flip') : null;\n      if (thumb) { if (!canHover) thumb.classList.toggle('flipped'); return; }\n      var btn = e.target.closest ? e.target.closest('button[data-key]') : null;\n      if (!btn) return;\n      var qtyEl = btn.parentElement.querySelector('.qv');\n      var current = parseInt(qtyEl ? (qtyEl.value != null ? qtyEl.value : qtyEl.textContent) : '0', 10) || 0;\n      var newQty = Math.max(0, Math.min(99, current + parseInt(btn.dataset.delta, 10)));\n      changeCartLine(btn.dataset.key, newQty);\n    });\n    dItems.addEventListener('change', function (e) {\n      var input = e.target.closest ? e.target.closest('input.qv') : null;\n      if (!input) return;\n      var typed = parseInt(input.value, 10);\n      if (isNaN(typed) || typed < 0) { refreshCart().catch(function () {}); return; }\n      changeCartLine(input.dataset.key, Math.min(99, typed));\n    });\n  }\n\n  function addCurrentSelection() {\n    var button = $('#addBtn');\n    if (!button) return;\n      if (!PRODUCT.available) { toast('Product isn\u2019t connected yet.'); return; }\n      var isSub = plan === 'sub';\n      var items = [];\n      var supply = isSub ? supplyFor(subscriptionOption) : null;\n      var supplyPlan = isSub ? supplyPlanFor(subscriptionOption) : null;\n      if (isSub && supply && supplyPlan) {\n        /* One line for the whole supply. The flavour split rides along as a\n           line property so fulfilment knows what to pack, and the kit is named\n           on the line rather than added as separate lines \u2014 that is what keeps\n           a subscription to a single box in the cart, and what keeps a discount\n           out of the picture entirely. See the welcome kit note above. */\n        var mixParts = [];\n        ['vanilla', 'chocolate'].forEach(function (f) {\n          var n = mix[f] || 0;\n          if (n > 0) mixParts.push(n + ' \u00D7 ' + FLAVOURS[f].label);\n        });\n        if (!mixParts.length) { toast('Choose your flavours.'); return; }\n        var props = { 'Your mix': mixParts.join(', ') };\n        var includes = [];\n        if (PRODUCT.gift && PRODUCT.gift.title) includes.push(PRODUCT.gift.title);\n        if (PRODUCT.giftTowel && PRODUCT.giftTowel.title) includes.push(PRODUCT.giftTowel.title);\n        if (includes.length) props['Welcome kit'] = includes.join(' + ');\n        /* Prefer a real mix variant when the supply product has them. The line\n           stays ONE line with one quantity control either way \u2014 this only\n           changes WHICH variant that line points at, so the flavours reach the\n           subscription contract instead of living in a text property the\n           contract never receives. `Your mix` is kept regardless: it is now\n           redundant as data but it is what the packing slip reads. */\n        var mixVariant = supplyVariantForMix(subscriptionOption, mix);\n        var supplyLineId = mixVariant ? mixVariant.id : supply.id;\n        var supplyLinePlan = (mixVariant && planFromList(mixVariant.plans, subscriptionOption)) || supplyPlan;\n        items.push({ id: supplyLineId, quantity: 1, selling_plan: supplyLinePlan.id, properties: props });\n      } else if (isSub && !supply) {\n        toast('Subscription isn\u2019t set up yet.');\n        return;\n      } else if (packMode) {\n        var flavs = ['vanilla', 'chocolate'];\n        for (var i = 0; i < flavs.length; i++) {\n          var f = flavs[i], n = mix[f] || 0;\n          if (n <= 0) continue;\n          var pv = variantFor(f);\n          if (!pv) { toast(FLAVOURS[f].label + ' isn\u2019t connected yet.'); return; }\n          var subscriptionPlan = isSub ? subscriptionPlanFor(pv, subscriptionOption) : null;\n          if (isSub && !subscriptionPlan) { toast('Subscription isn\u2019t set up yet.'); return; }\n          var pit = { id: pv.id, quantity: n };\n          if (isSub) pit.selling_plan = subscriptionPlan.id;\n          items.push(pit);\n        }\n        if (!items.length) { toast('Choose at least one pouch.'); return; }\n      } else {\n        var v = variantFor(flavour);\n        if (!v) { toast('Product isn\u2019t connected yet.'); return; }\n        var selectedPlan = isSub ? subscriptionPlanFor(v, subscriptionOption) : null;\n        if (isSub && !selectedPlan) { toast('Subscription isn\u2019t set up yet.'); return; }\n        var item = { id: v.id, quantity: qty };\n        if (isSub) item.selling_plan = selectedPlan.id;\n        items.push(item);\n      }\n      /* Legacy path only: with a supply bundle the gifts are named on its line,\n         so adding them again here would put the extra boxes straight back. */\n      if (isSub && !supply && PRODUCT.gift && PRODUCT.gift.id) {\n        items.push({ id: PRODUCT.gift.id, quantity: 1, properties: { 'OLEVATE welcome gift': 'New subscription' } });\n      }\n      button.disabled = true;\n      fetch(ROUTES.cartAdd || '/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n        body: JSON.stringify({ items: items })\n      }).then(function (r) {\n        if (!r.ok) return r.json().then(function (e) { throw new Error(e.description || 'Add failed'); });\n        return r.json();\n      }).then(function () {\n        return refreshCart();\n      }).then(function () {\n        openDrawer();\n        toast(packMode\n          ? ('Added \u00B7 ' + packSize + (packSize > 1 ? ' pouches' : ' pouch') + (isSub ? ' \u00B7 subscription' : ''))\n          : ('Added \u00B7 ' + FLAVOURS[flavour].label + (isSub ? ' \u00B7 subscription' : '')));\n      }).catch(function (err) {\n        toast(err.message || 'Could not add to cart');\n      }).finally(function () { button.disabled = false; });\n  }\n\n  if (checkoutBtn) checkoutBtn.addEventListener('click', function () { window.location.href = '/checkout'; });\n\n  /* ---------- toast ---------- */\n  var toastT;\n  function toast(msg) {\n    var t = $('#toast');\n    if (!t) return;\n    t.textContent = msg;\n    t.classList.add('show');\n    clearTimeout(toastT);\n    toastT = setTimeout(function () { t.classList.remove('show'); }, 2600);\n  }\n\n  /* ---------- accordions ---------- */\n  $$('.qa-q').forEach(function (q) {\n    q.addEventListener('click', function () {\n      var item = q.closest('.qa-item');\n      var a = item.querySelector('.qa-a');\n      var open = item.classList.toggle('open');\n      q.setAttribute('aria-expanded', open);\n      a.style.maxHeight = open ? a.scrollHeight + 'px' : '0px';\n    });\n  });\n  var mt = $('#microToggle');\n  if (mt) {\n    mt.addEventListener('click', function () {\n      var open = mt.getAttribute('aria-expanded') !== 'true';\n      mt.setAttribute('aria-expanded', open);\n      var ml = $('#microList'); if (ml) ml.classList.toggle('open', open);\n      var lbl = mt.querySelector('span'); if (lbl) lbl.textContent = open ? 'Hide the list' : 'Show all 19, with doses';\n    });\n  }\n\n  /* The hero slideshow and its pointer parallax lived here. Both went when the\n     hero became a single background photograph \u2014 there is no #heroStage and no\n     [data-hero-slides] in the markup any more, and nothing else drove them. */\n\n  /* ---------- flavours showcase video (autoplay on section enter, active flavour only) ----------\n     Inert while the section ships stills (.stage-shot); restores itself if the spin videos come back. */\n  (function () {\n    var vids = $$('#flavours .stage-video');\n    if (!vids.length) return;\n    var inView = false;\n    syncFlavVideo = function () {\n      var active = document.body.dataset.flavour === 'chocolate' ? 'chocolate' : 'vanilla';\n      vids.forEach(function (v) {\n        var on = inView && !reduceMotion && v.getAttribute('data-flavour-video') === active;\n        if (on) { var p = v.play(); if (p && p.catch) p.catch(function () {}); }\n        else { v.pause(); }\n      });\n    };\n    if ('IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function (entries) {\n        entries.forEach(function (e) { inView = e.isIntersecting; });\n        syncFlavVideo();\n      }, { threshold: 0.3 });\n      vids.forEach(function (v) { io.observe(v); });\n    } else {\n      inView = true;\n    }\n  })();\n\n  /* ---------- init ---------- */\n  bindBuyControls();\n  setFlavour(PRODUCT.initialFlavour === 'chocolate' ? 'chocolate' : 'vanilla', false);\n  function syncProductData(attempt) {\n    var pageProduct = productFromPage();\n    if (!pageProduct) {\n      if ((attempt || 0) < 10) setTimeout(function () { syncProductData((attempt || 0) + 1); }, 150);\n      return;\n    }\n    PRODUCT = pageProduct;\n    bindBuyControls();\n    if (!$('#addBtn') && (attempt || 0) < 10) {\n      setTimeout(function () { syncProductData((attempt || 0) + 1); }, 150);\n      return;\n    }\n    setFlavour(PRODUCT.initialFlavour === 'chocolate' ? 'chocolate' : 'vanilla', false);\n  }\n  setTimeout(function () { syncProductData(0); }, 0);\n  window.addEventListener('load', function () { syncProductData(0); });\n  refreshCart().catch(function () {});\n  /* A prerendered page fetches the cart at prerender time, which can be\n     minutes before the user actually lands on it \u2014 long enough to have added\n     something on the page they were still reading. Re-read it on activation\n     so the drawer, count and free-shipping bar are never stale. */\n  if (document.prerendering === true) {\n    document.addEventListener('prerenderingchange', function () {\n      refreshCart().catch(function () {});\n    }, { once: true });\n  }\n  onScroll();\n  window.addEventListener('resize', fitFlavourWord);\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(fitFlavourWord);\n})();\n"],
  "mappings": "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",
  "names": ["node", "track", "flavour", "qty", "f", "n", "io"]
}
