{
  "version": 3,
  "sources": ["/cdn/shop/t/110/assets/hytz-v2-build2.js?hytz_flip_restore=070926v180"],
  "sourcesContent": ["/* Hytz mk.II \u2014 frontend behaviors */\n/* build: 2026-05-11-1955 \u2014 force CDN hash bump for sticky ATC fade fix */\n\n/* \u2550\u2550\u2550 Native Shopify policy pages \u2014 inject breadcrumb + eyebrow to match brand page header \u2550\u2550\u2550 */\n(function () {\n  function enhancePolicyPage() {\n    var container = document.querySelector('.shopify-policy__container');\n    if (!container || container.dataset.hyEnhanced) return;\n    container.dataset.hyEnhanced = '1';\n\n    var title = container.querySelector('.shopify-policy__title');\n    if (!title) return;\n    var h1 = title.querySelector('h1');\n    var titleText = h1 ? h1.textContent.trim() : 'Policy';\n\n    // Breadcrumb at the very top\n    var crumb = document.createElement('div');\n    crumb.className = 'hy-breadcrumb';\n    crumb.innerHTML = '<a href=\"/\">Home</a> <span>/</span> ' + titleText;\n    container.insertBefore(crumb, title);\n\n    // Yellow eyebrow above the title h1\n    var eyebrow = document.createElement('div');\n    eyebrow.className = 'hy-section-label';\n    eyebrow.textContent = 'Legal';\n    title.insertBefore(eyebrow, h1 || title.firstChild);\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', enhancePolicyPage);\n  } else {\n    enhancePolicyPage();\n  }\n})();\n\n/* \u2550\u2550\u2550 V3 homepage visual order \u2014 show formula lineup immediately after hero without editing protected template JSON \u2550\u2550\u2550 */\n(function () {\n  function moveLineupAfterHero() {\n    if (window.location.pathname !== '/' && window.location.pathname !== '') return;\n    var heroSection = document.querySelector('[id$=\"__hytz_hero\"].shopify-section');\n    /* Sol B24 (063026) \u2014 explicit homepage section order (index.json is theme-editor-owned, so reorder at\n       runtime). Visible order: hero \u00B7 product lineup \u00B7 supplements-have-your-back + six-habits (both live in\n       the intro section) \u00B7 three-steps \u00B7 real nights (reviews) \u00B7 we-don't-judge (about) \u00B7 full transparency\n       (science) \u00B7 faq. The empty UGC placeholder + the modal are parked at the end (UGC renders nothing). */\n    if (heroSection) {\n      var order = ['hytz_lineup', 'hytz_intro', 'hytz_how_it_works', 'hytz_reviews', 'hytz_about_section', 'hytz_science', 'hytz_faq_section', 'hytz_ugc', 'hytz_modal'];\n      var prev = heroSection;\n      order.forEach(function (sfx) {\n        var el = document.querySelector('[id$=\"__' + sfx + '\"].shopify-section');\n        if (el && prev) { prev.insertAdjacentElement('afterend', el); prev = el; }\n      });\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', moveLineupAfterHero, { once: true });\n  } else {\n    moveLineupAfterHero();\n  }\n})();\n\n/* \u2550\u2550\u2550 Review count \u2192 \"(#)\" \u2014 Sol 062026. Judge.me preview badge renders \"20 reviews\"; we want a bare\n   \"(20)\" next to the stars. Rewrite .jdgm-prev-badge__text client-side; Judge.me re-renders async, so\n   re-run on load + a few delays + observe badge mutations. Idempotent (skips already-formatted text). \u2550\u2550\u2550 */\n(function () {\n  function fmt(el) {\n    var raw = (el.textContent || '').trim();\n    if (!raw || raw.charAt(0) === '(') return;                 // already \"(N)\" or empty\n    var badge = el.closest('.jdgm-prev-badge');\n    var n = badge && badge.getAttribute('data-number-of-reviews');\n    if (n == null || n === '') { var m = raw.match(/\\d[\\d,]*/); n = m ? m[0] : null; }\n    if (n == null) return;                                     // no count (e.g. \"No reviews\") \u2014 leave it\n    el.textContent = '(' + String(n).replace(/,/g, '') + ')';\n  }\n  function run() { document.querySelectorAll('.jdgm-prev-badge__text').forEach(fmt); }\n  function boot() {\n    run();\n    [300, 900, 2000, 4000].forEach(function (d) { setTimeout(run, d); });\n    try {\n      var obs = new MutationObserver(function () { run(); });\n      document.querySelectorAll('.jdgm-preview-badge, .hy-lineup-stars').forEach(function (host) {\n        obs.observe(host, { childList: true, subtree: true });\n      });\n    } catch (e) {}\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot, { once: true });\n  } else { boot(); }\n})();\n\n/* \u2550\u2550\u2550 FABLE IMP-100 (070626) \u2014 Judge.me write-review modal ships <a class=\"jdgm-write-review-modal__btn--back\">\n   with no href (hardcoded in JM's shopify_v2.js template) \u2192 Lighthouse SEO crawlable-anchors fails on\n   PDP/free-hytz (the only reason those pages miss SEO 100). It's a button, not a link \u2014 stamp role=\"button\"\n   (the audit skips anchors with a role attribute). JM prepends the modal as a DIRECT child of <body> and\n   re-creates it on every open, so watch body childList (non-subtree = negligible) + sweep at boot. \u2550\u2550\u2550 */\n(function () {\n  function stamp(root) {\n    (root || document).querySelectorAll('a.jdgm-write-review-modal__btn--back:not([role])')\n      .forEach(function (a) { a.setAttribute('role', 'button'); });\n  }\n  function boot() {\n    stamp();\n    try {\n      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.nodeType === 1 && n.classList && n.classList.contains('jdgm-write-review-modal')) stamp(n);\n          }\n        }\n      }).observe(document.body, { childList: true });\n    } catch (e) {\n      [1000, 3000, 8000].forEach(function (d) { setTimeout(stamp, d); });\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot, { once: true });\n  } else { boot(); }\n})();\n\n/* \u2550\u2550\u2550 Cart drawer position override \u2014 drop from nav PILL as a connected extension \u2550\u2550\u2550 */\n(function () {\n  function positionCart() {\n    var drawer = document.getElementById('hytz-cart-drawer');\n    var inner = document.querySelector('.hytz-nav-inner');\n    if (!drawer || !inner) return;\n    var r = inner.getBoundingClientRect();\n    drawer.style.position = 'fixed';\n    drawer.style.top = r.bottom + 'px'; // touch nav pill bottom (no gap)\n    drawer.style.left = r.left + 'px';\n    drawer.style.width = r.width + 'px';\n    drawer.style.right = 'auto';\n    drawer.style.maxHeight = 'calc(100vh - ' + (r.bottom + 16) + 'px)';\n  }\n  window.hytzPositionCart = positionCart;\n  // Only re-position while the drawer is actually open \u2014 skips two layout\n  // reads per scroll tick on every page where the drawer is closed/absent.\n  // Open-time positioning is handled by the MutationObserver + transitionend below.\n  function positionCartIfOpen() {\n    var drawer = document.getElementById('hytz-cart-drawer');\n    if (!drawer || !drawer.classList.contains('active')) return;\n    positionCart();\n  }\n  window.addEventListener('resize', positionCartIfOpen, { passive: true });\n  window.addEventListener('scroll', positionCartIfOpen, { passive: true });\n  // Re-sync after nav's shrink/grow transition settles (width/max-width + top + height)\n  document.addEventListener('DOMContentLoaded', function () {\n    var nav = document.querySelector('.hytz-nav');\n    var inner = document.querySelector('.hytz-nav-inner');\n    function onNavSettle(e) {\n      if (['top', 'max-width', 'height', 'padding'].indexOf(e.propertyName) === -1) return;\n      positionCart();\n    }\n    if (nav) nav.addEventListener('transitionend', onNavSettle);\n    if (inner) inner.addEventListener('transitionend', onNavSettle);\n  });\n  var observer = new MutationObserver(function (muts) {\n    muts.forEach(function (m) {\n      if (m.type === 'attributes' && m.attributeName === 'class') {\n        var d = m.target;\n        var nav = document.querySelector('.hytz-nav');\n        if (d.classList.contains('active')) {\n          positionCart();\n          if (nav) nav.classList.add('cart-open');\n        } else {\n          if (nav) nav.classList.remove('cart-open');\n        }\n      }\n    });\n  });\n  document.addEventListener('DOMContentLoaded', function () {\n    var d = document.getElementById('hytz-cart-drawer');\n    if (d) observer.observe(d, { attributes: true, attributeFilter: ['class'] });\n  });\n})();\n\n/* \u2550\u2550\u2550 Mobile menu toggle \u2014 drops from nav pill like the cart drawer \u2550\u2550\u2550 */\n(function () {\n  var hamburger = document.getElementById('hytz-nav-hamburger');\n  var menu = document.getElementById('hy-mobile-menu');\n  var overlay = document.getElementById('hy-mobile-menu-overlay');\n  var nav = document.querySelector('.hytz-nav');\n  if (!hamburger || !menu || !overlay || !nav) return;\n\n  /* FABLE-A11Y (a11y #7): expose the hamburger's state + wire it to the menu (button markup lives\n     in snippets/hytz-v2-nav.liquid, so the attrs are set here on init and toggled on open/close). */\n  hamburger.setAttribute('aria-controls', 'hy-mobile-menu');\n  hamburger.setAttribute('aria-expanded', 'false');\n\n  function positionMenu() {\n    var inner = document.querySelector('.hytz-nav-inner');\n    if (!inner || !menu) return;\n    var r = inner.getBoundingClientRect();\n    menu.style.position = 'fixed';\n    menu.style.top = r.bottom + 'px';\n    menu.style.left = r.left + 'px';\n    menu.style.width = r.width + 'px';\n    menu.style.maxHeight = 'calc(100vh - ' + (r.bottom + 16) + 'px)';\n  }\n  function openMenu() {\n    // Mutex \u2014 if cart drawer is open, close it first so only one panel shows at a time\n    if (window.hyLockBodyScroll) window.hyLockBodyScroll('mobile-menu');\n    var cart = document.getElementById('hytz-cart-drawer');\n    var cartOverlay = document.getElementById('hytz-cart-overlay');\n    if (cart && cart.classList.contains('active')) {\n      if (typeof window.hytzCloseCart === 'function') {\n        window.hytzCloseCart();\n      } else {\n        cart.classList.remove('active');\n        if (cartOverlay) cartOverlay.classList.remove('active');\n        nav.classList.remove('cart-open');\n      }\n    }\n    positionMenu();\n    menu.classList.add('active');\n    overlay.classList.add('active');\n    nav.classList.add('menu-open');\n    menu.setAttribute('aria-hidden', 'false');\n    /* FABLE-A11Y: reflect open state + move focus to the first menu item. */\n    hamburger.setAttribute('aria-expanded', 'true');\n    var firstItem = menu.querySelector('a[href], button:not([disabled])');\n    if (firstItem) requestAnimationFrame(function () { firstItem.focus(); });\n  }\n  function closeMenu() {\n    /* FABLE-A11Y: only pull focus back to the hamburger when the user was inside the menu\n       (Escape / overlay / link / toggle) \u2014 not when a mutex (cart opening) closes it, which\n       would steal focus from the cart drawer's own focus move-in. */\n    var focusWasInside = menu.contains(document.activeElement);\n    menu.classList.remove('active');\n    overlay.classList.remove('active');\n    nav.classList.remove('menu-open');\n    menu.setAttribute('aria-hidden', 'true');\n    hamburger.setAttribute('aria-expanded', 'false');   /* FABLE-A11Y */\n    if (window.hyUnlockBodyScroll) window.hyUnlockBodyScroll('mobile-menu');\n    if (focusWasInside && typeof hamburger.focus === 'function') hamburger.focus();   /* FABLE-A11Y */\n  }\n  // Expose for cross-script mutex (cart-open handler calls this to close menu)\n  window.hytzCloseMobileMenu = closeMenu;\n  window.hytzMobileMenuIsOpen = function () { return menu.classList.contains('active'); };\n  hamburger.addEventListener('click', function () {\n    if (menu.classList.contains('active')) closeMenu();\n    else openMenu();\n  });\n  overlay.addEventListener('click', closeMenu);\n  // Close when a menu link is clicked\n  menu.addEventListener('click', function (e) { if (e.target.closest('a')) closeMenu(); });\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape' && menu.classList.contains('active')) closeMenu();\n  });\n  window.addEventListener('resize', function () {\n    if (menu.classList.contains('active')) positionMenu();\n  }, { passive: true });\n  window.addEventListener('scroll', function () {\n    if (menu.classList.contains('active')) positionMenu();\n  }, { passive: true });\n})();\n\n/* \u2550\u2550\u2550 Nav scroll-shrink \u2550\u2550\u2550 */\n(function () {\n  var nav = document.querySelector('.hytz-nav');\n  if (!nav) return;\n  var threshold = 40;\n  var raf = null;\n  function update() {\n    raf = null;\n    if (window.scrollY > threshold) nav.classList.add('is-scrolled');\n    else nav.classList.remove('is-scrolled');\n  }\n  window.addEventListener('scroll', function () {\n    if (raf) return;\n    raf = requestAnimationFrame(update);\n  }, { passive: true });\n  update();\n})();\n\n/* \u2550\u2550\u2550 Reviews marquee \u2014 JS-driven with drag + swipe, seamless loop \u2550\u2550\u2550 */\n(function () {\n  var track = document.querySelector('.hy-reviews-track');\n  if (!track) return;\n\n  /* FABLE-A11Y (a11y #13): honor prefers-reduced-motion. The CSS keyframe animation is already\n     killed under `reduce`; bail before the rAF drift + cloning so motion-sensitive users get a\n     static marquee instead of an auto-scrolling one. */\n  if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n  var offset = 0;                    // current translateX in px (negative = moved left)\n  var speed = 45;                    // px / second (continuous drift)\n  var lastTime = 0;\n  var isDragging = false;\n  var startX = 0;\n  var startOffset = 0;\n  var velocity = 0;\n  var lastMoveX = 0;\n  var lastMoveTime = 0;\n  var inertiaRaf = null;\n\n  // Liquid renders 2 identical copies. Remember the count of \"original\" children\n  // (one set = half the initial children) so setWidth math stays correct after cloning.\n  var originalChildCount = track.children.length;\n  var cardsPerSet = originalChildCount / 2;\n  var setWidth = 0;\n\n  function recalc() {\n    // setWidth = width of one set = total width \u00F7 (total children \u00F7 cardsPerSet)\n    var sets = cardsPerSet ? track.children.length / cardsPerSet : 0;\n    setWidth = sets ? track.scrollWidth / sets : 0;\n  }\n\n  function ensureEnoughContent() {\n    // Seamless loop needs trackWidth \u2265 viewport + setWidth so there's always\n    // enough content ahead of the wrap point to fill the viewport.\n    // Hidden tracks have scrollWidth=0; do NOT clone forever while display:none.\n    if (!cardsPerSet || !setWidth || !track.scrollWidth) return false;\n    var originalSetNodes = Array.from(track.children).slice(0, cardsPerSet);\n    // Single reflow read + arithmetic + one fragment append (each cloned set adds setWidth px)\n    var deficit = (window.innerWidth + setWidth) - track.scrollWidth;\n    if (deficit > 0) {\n      var setsNeeded = Math.min(12, Math.ceil(deficit / setWidth));\n      var frag = document.createDocumentFragment();\n      for (var i = 0; i < setsNeeded; i++) {\n        originalSetNodes.forEach(function (c) { frag.appendChild(c.cloneNode(true)); });\n      }\n      track.appendChild(frag);\n    }\n    return true;\n  }\n\n  recalc();\n  if (!ensureEnoughContent()) return;\n\n  // Take over from CSS animation only after the track is measurable. The\n  // find-your-formula funnel renders review marquees inside display:none steps;\n  // disabling CSS then cloning a zero-width track locks the page on load.\n  track.style.animation = 'none';\n  window.addEventListener('resize', function () {\n    recalc();\n    ensureEnoughContent();\n  });\n  // Recalc after fonts load in case card widths shift\n  if (document.fonts && document.fonts.ready) {\n    document.fonts.ready.then(function () {\n      recalc();\n      ensureEnoughContent();\n    });\n  }\n\n  var marqueeVisible = true;\n  var tickRaf = null;\n  function tick(t) {\n    tickRaf = null;\n    if (!lastTime) lastTime = t;\n    var dt = (t - lastTime) / 1000;\n    lastTime = t;\n\n    if (!isDragging && !inertiaRaf) {\n      offset -= speed * dt;\n    }\n\n    // Seamless wrap\n    while (offset <= -setWidth) offset += setWidth;\n    while (offset > 0) offset -= setWidth;\n\n    track.style.transform = 'translate3d(' + offset + 'px, 0, 0)';\n    if (marqueeVisible) tickRaf = requestAnimationFrame(tick);\n  }\n  // Pause the drift loop while the marquee is off-screen \u2014 no point burning\n  // main-thread frames on a transform nobody can see. lastTime resets on\n  // resume so dt doesn't leap across the paused gap.\n  if ('IntersectionObserver' in window) {\n    new IntersectionObserver(function (entries) {\n      marqueeVisible = entries[0].isIntersecting;\n      if (marqueeVisible && !tickRaf) {\n        lastTime = 0;\n        tickRaf = requestAnimationFrame(tick);\n      }\n    }, { rootMargin: '120px' }).observe(track);\n  }\n  tickRaf = requestAnimationFrame(tick);\n\n  function onDown(e) {\n    isDragging = true;\n    startX = e.clientX;\n    startOffset = offset;\n    velocity = 0;\n    lastMoveX = e.clientX;\n    lastMoveTime = performance.now();\n    track.classList.add('hy-is-dragging');\n    try { track.setPointerCapture(e.pointerId); } catch (_) {}\n    if (inertiaRaf) { cancelAnimationFrame(inertiaRaf); inertiaRaf = null; }\n  }\n\n  function onMove(e) {\n    if (!isDragging) return;\n    var dx = e.clientX - startX;\n    offset = startOffset + dx;\n\n    // Track velocity for inertia\n    var now = performance.now();\n    var dt = now - lastMoveTime;\n    if (dt > 0) {\n      velocity = (e.clientX - lastMoveX) / dt * 1000; // px / sec\n    }\n    lastMoveX = e.clientX;\n    lastMoveTime = now;\n  }\n\n  function onUp(e) {\n    if (!isDragging) return;\n    isDragging = false;\n    track.classList.remove('hy-is-dragging');\n    try { track.releasePointerCapture(e.pointerId); } catch (_) {}\n\n    // Inertia: decay velocity, merge into continuous drift\n    var v = velocity;\n    function inertia() {\n      if (Math.abs(v) < 5) { inertiaRaf = null; return; }\n      offset += v * (1 / 60);\n      v *= 0.94;\n      while (offset <= -setWidth) offset += setWidth;\n      while (offset > 0) offset -= setWidth;\n      inertiaRaf = requestAnimationFrame(inertia);\n    }\n    if (Math.abs(velocity) > 50) inertiaRaf = requestAnimationFrame(inertia);\n  }\n\n  track.addEventListener('pointerdown', onDown);\n  track.addEventListener('pointermove', onMove);\n  track.addEventListener('pointerup', onUp);\n  track.addEventListener('pointercancel', onUp);\n})();\n\n/* \u2550\u2550\u2550 Product quick-shop MODAL \u2014 REMOVED (Sol 062626, G6) \u2550\u2550\u2550\n   The legacy #hy-modal lightbox (click a lineup card \u2192 card-flip + big product-detail overlay)\n   is retired. Its markup was already pulled from sections/hytz-v2-modal.liquid, so this IIFE's\n   getElementById('hy-modal') always returned null and the whole block was dead (the lineup cards\n   now flip in place via the lineup-flip IIFE later in this file). Removed ~377 lines of dead JS.\n   The shared .hy-modal-* CSS is intentionally KEPT \u2014 the Free-Hytz funnel modal\n   (.hy-free-detail-modal in sections/hytz-v2-free-hytz.liquid) still reuses those classes. */\n\n/* ============================================================\n   Accordion behavior: multiple-open allowed (Sol pref, 2026-04-23).\n   Previously had sibling-close logic here \u2014 reverted. Native <details>\n   default behavior handles the rest (each toggles independently).\n   ============================================================ */\n\n/* ============================================================\n   PDP \u2014 Product Detail Page behaviors\n   Session 10 (2026-04-23) \u2014 v3 rebuild\n   ============================================================ */\n(function () {\n  var pdp = document.querySelector('.hy-pdp');\n  if (!pdp) return;\n\n  var handle = pdp.getAttribute('data-handle');\n  var mainImg = document.getElementById('hy-pdp-main-img');\n  var variantInput = document.getElementById('hy-pdp-variant-input');\n  var cartForm = document.getElementById('hy-pdp-cart-form');\n  var cartBtn = document.getElementById('hy-pdp-cart-btn');\n  var cartMsg = document.getElementById('hy-pdp-cart-msg');\n  var cartBtnText = cartBtn ? cartBtn.querySelector('.hy-pdp-cart-btn-text') : null;\n\n  // ---- Render supplement facts as an inline TABLE (v3 \u2014 no accordion) ----\n  if (window.hytzPdpSuppFacts && window.hytzPdpSuppFacts[handle]) {\n    var data = window.hytzPdpSuppFacts[handle];\n    var tbody = document.getElementById('hy-pdp-supp-tbody-' + handle);\n    if (tbody && data && data.facts) {\n      var rows = '';\n      data.facts.forEach(function (f) {\n        rows += '<tr><td>' + f.name + '</td><td>' + f.amount + '</td><td>' + f.dv + '</td></tr>';\n      });\n      tbody.innerHTML = rows;\n    }\n    // Label amounts and Daily Values, kept separate from contaminant testing.\n    var labBody = document.getElementById('hy-pdp-lab-tbody-' + handle);\n    if (labBody && data && data.facts) {\n      var labRows = '';\n\n      data.facts.forEach(function (f) {\n        labRows += '<tr>' +\n          '<td>' + f.name + '</td>' +\n          '<td>' + f.amount + '</td>' +\n          '<td>' + (f.dv || '*') + '</td>' +\n        '</tr>';\n      });\n      labBody.innerHTML = labRows;\n    }\n  }\n\n  // ---- Shared main-image swap helper (fade-swap with decode gate) ----\n  var stickyThumbImg = document.getElementById('hy-pdp-sticky-thumb-img');\n  function swapMainImage(url) {\n    if (!mainImg || !url) return;\n    if (url === mainImg.src || mainImg.src.indexOf(url) !== -1) {\n      // Still keep sticky thumb in sync even if main is already right\n      if (stickyThumbImg && stickyThumbImg.src !== url) stickyThumbImg.src = url;\n      return;\n    }\n    mainImg.classList.add('is-swapping');\n    var next = new Image();\n    next.onload = function () {\n      mainImg.src = url;\n      if (stickyThumbImg) stickyThumbImg.src = url;\n      requestAnimationFrame(function () { mainImg.classList.remove('is-swapping'); });\n    };\n    next.onerror = function () { mainImg.classList.remove('is-swapping'); };\n    next.src = url;\n  }\n\n  // ---- V3 lifestyle gallery: main-image object-fit state ----\n  // Lifestyle stills render full-bleed (cover); bag/product PNGs stay contained.\n  // Every variant/bag swap resets to 'product' so the bag never gets cropped.\n  function setMainImageKind(kind) {\n    if (!mainImg) return;\n    var isLifestyle = kind === 'lifestyle';\n    mainImg.classList.toggle('is-lifestyle', isLifestyle);\n    mainImg.alt = isLifestyle\n      ? ((pdp.dataset.handle || 'Hytz product') + ' \u2014 generated lifestyle preview (AI image, not a customer photo)')\n      : (mainImg.getAttribute('data-product-alt') || mainImg.alt || 'Product image');\n  }\n\n  // Sync the product-image thumbnail rail to a given main-image URL (if any matches).\n  // If a variant image has no exact gallery thumb, clear any stale lifestyle state\n  // and fall back to the first product thumb so the selected state stays honest.\n  function syncThumbsToUrl(url) {\n    var thumbsList = pdp.querySelectorAll('.hy-pdp-gallery-thumb');\n    if (!thumbsList.length || !url) return;\n    var match = null;\n    thumbsList.forEach(function (t) {\n      if (t.dataset.full === url) match = t;\n    });\n    if (!match) {\n      thumbsList.forEach(function (t) {\n        t.classList.remove('is-active');\n        t.setAttribute('aria-selected', 'false');\n      });\n      var firstProductThumb = pdp.querySelector('.hy-pdp-gallery-thumb[data-image-kind=\"product\"]');\n      if (firstProductThumb) {\n        firstProductThumb.classList.add('is-active');\n        firstProductThumb.setAttribute('aria-selected', 'true');\n      }\n      return;\n    }\n    thumbsList.forEach(function (t) {\n      var isActive = t === match;\n      t.classList.toggle('is-active', isActive);\n      t.setAttribute('aria-selected', isActive ? 'true' : 'false');\n    });\n  }\n\n  // ---- Variant pill selection ----\n  /* FABLE-A11Y (a11y #5): mirror aria-pressed onto the pack pills W1-C gave the static attribute to.\n     Only touches elements that already carry aria-pressed, so listbox-style sticky packs (role=option\n     + aria-selected) are left alone. */\n  function hyPillPressed(el, on) { if (el && el.hasAttribute('aria-pressed')) el.setAttribute('aria-pressed', on ? 'true' : 'false'); }\n  var pills = pdp.querySelectorAll('.hy-pdp-price-pill');\n  pills.forEach(function (pill) {\n    pill.addEventListener('click', function () {\n      if (pill.hasAttribute('disabled')) return;\n      pills.forEach(function (p) { p.classList.remove('is-selected'); hyPillPressed(p, false); });   /* FABLE-A11Y */\n      pill.classList.add('is-selected');\n      hyPillPressed(pill, true);   /* FABLE-A11Y */\n      if (variantInput && pill.dataset.variantId) {\n        variantInput.value = pill.dataset.variantId;\n      }\n      // Swap main gallery image + sticky thumb to this variant's image (if available).\n      // Selecting a pack always returns the gallery to the bag/product image, so the\n      // lifestyle full-bleed state is cleared and object-fit returns to contain.\n      if (pill.dataset.variantImage) {\n        setMainImageKind('product');\n        swapMainImage(pill.dataset.variantImage);\n        syncThumbsToUrl(pill.dataset.variantImage);\n        // Sol B5-2 \u2014 the swapped image lives in slide 0. On mobile the gallery is a swipe TRACK, so if the\n        // user has swiped to a later slide, the swap happens off-screen and looks like \"nothing changed.\"\n        // Snap the track back to slide 0 so the selected pack's image is what they see. (Desktop track\n        // doesn't scroll \u2014 scrollLeft stays 0, so this is a no-op there.)\n        var galTrack = document.getElementById('hy-pdp-gallery-main');\n        if (galTrack && galTrack.scrollLeft > 4) galTrack.scrollTo({ left: 0, behavior: 'smooth' });\n      }\n      // Sync gallery tab if size matches (legacy pack-size tabs)\n      var size = pill.dataset.size;\n      var tab = pdp.querySelector('.hy-pdp-gallery-tab[data-size=\"' + size + '\"]');\n      if (tab) syncGalleryTabs(tab);\n    });\n  });\n\n  // ---- Preload all variant images so the pill \u2192 gallery swap is instant ----\n  (function preloadVariantImages() {\n    var seen = {};\n    pills.forEach(function (p) {\n      var u = p.dataset.variantImage;\n      if (u && !seen[u]) { seen[u] = 1; var im = new Image(); im.src = u; }\n    });\n  })();\n\n  // ---- Legacy: gallery pack-size tabs (kept for backward-compat on SKUs without real images) ----\n  var tabs = pdp.querySelectorAll('.hy-pdp-gallery-tab');\n  function syncGalleryTabs(activeTab) {\n    tabs.forEach(function (t) {\n      var isActive = t === activeTab;\n      t.classList.toggle('is-active', isActive);\n      t.setAttribute('aria-selected', isActive ? 'true' : 'false');\n    });\n    if (!mainImg) return;\n    var size = activeTab.dataset.size;\n    var url = mainImg.getAttribute('data-' + size);\n    if (!url || url === mainImg.src) return;\n    setMainImageKind('product');\n    mainImg.classList.add('is-swapping');\n    var next = new Image();\n    next.onload = function () {\n      mainImg.src = url;\n      requestAnimationFrame(function () { mainImg.classList.remove('is-swapping'); });\n    };\n    next.onerror = function () { mainImg.classList.remove('is-swapping'); };\n    next.src = url;\n  }\n  tabs.forEach(function (tab) {\n    tab.addEventListener('click', function () {\n      syncGalleryTabs(tab);\n      var matchingPill = pdp.querySelector('.hy-pdp-price-pill[data-size=\"' + tab.dataset.size + '\"]');\n      if (matchingPill && !matchingPill.hasAttribute('disabled')) {\n        pills.forEach(function (p) { p.classList.remove('is-selected'); hyPillPressed(p, false); });   /* FABLE-A11Y */\n        matchingPill.classList.add('is-selected');\n        hyPillPressed(matchingPill, true);   /* FABLE-A11Y */\n        if (variantInput && matchingPill.dataset.variantId) {\n          variantInput.value = matchingPill.dataset.variantId;\n        }\n      }\n    });\n  });\n\n  // ---- v4: Product image thumbnails (click to swap main image) ----\n  var thumbs = pdp.querySelectorAll('.hy-pdp-gallery-thumb');\n  thumbs.forEach(function (thumb) {\n    thumb.addEventListener('click', function () {\n      var full = thumb.dataset.full;\n      thumbs.forEach(function (t) {\n        var isActive = t === thumb;\n        t.classList.toggle('is-active', isActive);\n        t.setAttribute('aria-selected', isActive ? 'true' : 'false');\n      });\n      // Lifestyle thumbs go full-bleed (cover); product/bag thumbs stay contained.\n      setMainImageKind(thumb.dataset.imageKind === 'lifestyle' ? 'lifestyle' : 'product');\n      if (full) swapMainImage(full);\n    });\n  });\n\n  // ---- Sol B7-6 (062526): \"From dose to done\" \u2014 the 4 stage IMAGES are the clickable tabs; click \u2192 copy below. ----\n  (function initTimeline() {\n    var tl = pdp.querySelector('[data-hy-timeline]');\n    if (!tl) return;\n    var tlTabs = Array.prototype.slice.call(tl.querySelectorAll('.hy-pdp-tl-stage'));\n    var tlPanels = Array.prototype.slice.call(tl.querySelectorAll('.hy-pdp-tl-panel'));\n    if (!tlTabs.length || tlTabs.length !== tlPanels.length) return;\n    function activateStage(idx) {\n      tlTabs.forEach(function (t, i) {\n        var on = i === idx;\n        t.classList.toggle('is-active', on);\n        t.setAttribute('aria-selected', on ? 'true' : 'false');\n        t.tabIndex = on ? 0 : -1;\n      });\n      tlPanels.forEach(function (p, i) {\n        var on = i === idx;\n        p.classList.toggle('is-active', on);\n        if (on) { p.removeAttribute('hidden'); } else { p.setAttribute('hidden', ''); }\n      });\n    }\n    tlTabs.forEach(function (tab, idx) {\n      tab.addEventListener('click', function () { activateStage(idx); });\n      tab.addEventListener('keydown', function (e) {\n        var dir = e.key === 'ArrowRight' ? 1 : (e.key === 'ArrowLeft' ? -1 : 0);\n        if (!dir) return;\n        e.preventDefault();\n        var next = (idx + dir + tlTabs.length) % tlTabs.length;\n        tlTabs[next].focus();\n        activateStage(next);\n      });\n    });\n    // Sol B9-P6 (062526) \u2014 mobile: stages are a horizontal scroll-snap strip; the centered image's copy transitions in as you scroll. (Desktop keeps click.)\n    var stagesRow = tl.querySelector('.hy-pdp-tl-stages');\n    var tlIoHold = 0;   /* Sol A18 (070626) \u2014 mute the IO while a CLICK's smooth-scroll glides the strip: intermediate stages were re-activating mid-glide = the text-box flash/jitter */\n    if (stagesRow && 'IntersectionObserver' in window) {\n      var ratios = {};\n      var io = new IntersectionObserver(function (entries) {\n        if (window.matchMedia('(min-width: 769px)').matches) return;\n        if (Date.now() < tlIoHold) return;\n        entries.forEach(function (e) {\n          var i = tlTabs.indexOf(e.target);\n          if (i > -1) { ratios[i] = e.intersectionRatio; }\n        });\n        var bestIdx = -1, bestRatio = 0.5;\n        Object.keys(ratios).forEach(function (k) { if (ratios[k] > bestRatio) { bestRatio = ratios[k]; bestIdx = +k; } });\n        if (bestIdx > -1) { activateStage(bestIdx); }\n      }, { root: stagesRow, threshold: [0, 0.25, 0.5, 0.75, 1] });\n      tlTabs.forEach(function (t) { io.observe(t); });\n    }\n    /* Sol 070326 \u2014 MOBILE connector: point the drop line at the ACTIVE node wherever it sits (the node scrolls\n       in the strip; the line is on the static card) via measured --tl-drop-x/--tl-drop-h, so it ALWAYS connects\n       incl. the first stage (which can't scroll to center). Plus: click a stage \u2192 auto-scroll it to center. */\n    (function () {\n      if (!stagesRow) return;\n      var raf = 0;\n      function mob() { return window.matchMedia('(max-width: 768px)').matches; }\n      function sync() {\n        raf = 0;\n        if (!mob()) return;\n        var tab = tl.querySelector('.hy-pdp-tl-stage.is-active');\n        var panel = tl.querySelector('.hy-pdp-tl-panel.is-active');\n        if (!tab || !panel || panel.offsetParent === null) return;\n        var tr = tab.getBoundingClientRect(), pr = panel.getBoundingClientRect();\n        panel.style.setProperty('--tl-drop-x', ((tr.left + tr.width / 2) - pr.left) + 'px');\n        panel.style.setProperty('--tl-drop-h', Math.max(6, pr.top - (tr.bottom - 9)) + 'px');\n      }\n      function queue() { if (!raf) raf = requestAnimationFrame(sync); }\n      stagesRow.addEventListener('scroll', queue, { passive: true });\n      tlTabs.forEach(function (t) {\n        t.addEventListener('click', function () {\n          if (!mob()) return;\n          tlIoHold = Date.now() + 700;   /* Sol A18 \u2014 IO stays silent while this smooth-scroll settles */\n          stagesRow.scrollTo({ left: Math.max(0, t.offsetLeft - (stagesRow.clientWidth - t.offsetWidth) / 2), behavior: 'smooth' });\n          queue();\n        });\n      });\n      window.addEventListener('resize', queue, { passive: true });\n      queue();\n    })();\n  })();\n\n  // ---- V3 061826: Sundae-style swipe gallery \u2014 sync dots to scroll + dot\u2192scroll. ----\n  (function () {\n    var track = document.getElementById('hy-pdp-gallery-main');\n    var dotsWrap = document.getElementById('hy-pdp-gallery-dots');\n    if (!track) return;\n    var slides = track.querySelectorAll('.hy-pdp-gallery-slide');\n    if (slides.length < 2) return;\n    var dots = dotsWrap ? dotsWrap.querySelectorAll('.hy-pdp-gallery-dot') : [];\n    var hint = document.querySelector('.hy-pdp-gallery-hint');   // Sol 062426 R12 \u2014 fade out after first swipe (redeploy bump)\n\n    function setActive(idx) {\n      dots.forEach(function (d, i) {\n        var on = i === idx;\n        d.classList.toggle('is-active', on);\n        d.setAttribute('aria-selected', on ? 'true' : 'false');\n      });\n    }\n\n    // Step = distance between consecutive slide left edges (slide width + gap). Measured\n    // from the DOM so the peek offset doesn't skew the math.\n    function step() {\n      if (slides.length < 2) return track.clientWidth;\n      return Math.max(1, slides[1].offsetLeft - slides[0].offsetLeft);\n    }\n\n    // Derive the active slide from horizontal scroll position (nearest snap).\n    var raf = null;\n    function onScroll() {\n      if (hint && track.scrollLeft > 4) hint.classList.add('is-gone');   // Sol 062426 R12 \u2014 hide the swipe hint once swiped\n      if (raf) return;\n      raf = requestAnimationFrame(function () {\n        raf = null;\n        var idx = Math.round(track.scrollLeft / step());\n        if (idx < 0) idx = 0;\n        if (idx > slides.length - 1) idx = slides.length - 1;\n        setActive(idx);\n      });\n    }\n    track.addEventListener('scroll', onScroll, { passive: true });\n\n    // Dot click \u2192 smooth-scroll that slide into view.\n    dots.forEach(function (dot) {\n      dot.addEventListener('click', function () {\n        var i = parseInt(dot.getAttribute('data-dot-index'), 10) || 0;\n        track.scrollTo({ left: i * step(), behavior: 'smooth' });\n        setActive(i);\n      });\n    });\n  })();\n\n  // ---- Sol A17 (070626): R10-1's per-scroll heading transform DELETED. Scroll handlers run on the\n  //      main thread while mobile scrolling paints on the compositor thread \u2192 under a fast flick the\n  //      heading's transform was always \u22651 frame stale (jiggle/clip into the cards). The heading now\n  //      releases NATIVELY: its sticky containing block is the JS-sized .hy-story-headtrack (see\n  //      measure() below + snippets/hytz-pdp-belowstats.liquid), so the compositor moves it itself. ----\n\n  // ---- Sol R13 (070126): size the pinned-heading band to the ACTUAL heading height so the LOCKED\n  //      heading\u2194card gap stays consistent regardless of how many lines the heading wraps to (2 on\n  //      desktop, 2\u20133 on mobile). Was a fixed --hy-story-head sized for 1 line \u2192 the 2-line heading\n  //      overlapped the first card once pinned. We only feed the measured title height as\n  //      --hy-story-titleh; the CSS computes --hy-story-head = titleh + a fixed 3rem gap. ResizeObserver\n  //      re-runs on font-load, viewport change, and when a free-hytz SKU section becomes visible (0\u2192real). ----\n  (function () {\n    var counters = document.querySelectorAll('.hy-pdp-counter');\n    if (!counters.length) return;\n    function measure(counter) {\n      var title = counter.querySelector('.hy-pdp-section-title');\n      if (title) {\n        var h = title.getBoundingClientRect().height;\n        if (h) counter.style.setProperty('--hy-story-titleh', Math.ceil(h) + 'px');   // skip when hidden (h=0) \u2192 keep the CSS fallback\n      }\n      // Sol 070326 \u2014 EQUALIZE the sticky-stacked cards to the TALLEST so none peeks. The panels stack at the same\n      //   sticky top; a taller card (body text > the 28rem min-height floor) releases from sticky EARLIER than\n      //   the shorter ones, so its bottom pokes out below the top card as you leave the section (\"the cards\n      //   behind scroll up before the page\"). Reset \u2192 measure natural \u2192 set every panel's min-height to the max.\n      //   Synchronous (reset+measure+set in one tick \u2192 no paint between \u2192 no flicker); max=0 while hidden \u2192 no-op.\n      var panels = counter.querySelectorAll('.hy-pdp-story-panel');\n      if (panels.length >= 2) {\n        var max = 0;\n        Array.prototype.forEach.call(panels, function (p) { p.style.minHeight = ''; });\n        Array.prototype.forEach.call(panels, function (p) { var ph = p.getBoundingClientRect().height; if (ph > max) max = ph; });\n        if (max > 0) Array.prototype.forEach.call(panels, function (p) { p.style.minHeight = Math.ceil(max) + 'px'; });\n      }\n      // Sol A17 (070626) \u2014 size the heading's sticky TRACK so the heading releases natively in lockstep\n      // with the LAST card (replaces the deleted R10-1 per-scroll transform, which lagged the compositor\n      // on mobile flicks \u2192 jiggle/clip). Header exits its track at scrollY = trackTop + trackH \u2212 pin \u2212 head;\n      // the last card exits the panels at scrollY = panelsTop + panelsHeight \u2212 pin \u2212 head \u2212 lastH.\n      // Lockstep \u21D2 trackH = (panelsTop \u2212 trackTop) + panelsHeight \u2212 lastH. Measured AFTER the equalization\n      // above so lastH is the final card height; the >0 guard skips hidden (free-hytz unselected) counters.\n      var trk = counter.querySelector('.hy-story-headtrack');\n      var panelsEl = counter.querySelector('.hy-pdp-story-panels');\n      if (trk && panelsEl && panels.length) {\n        var lastP = panels[panels.length - 1];\n        var trackH = (panelsEl.getBoundingClientRect().top - trk.getBoundingClientRect().top) + panelsEl.offsetHeight - lastP.offsetHeight;\n        if (trackH > 0) counter.style.setProperty('--hy-story-trackh', Math.ceil(trackH) + 'px');\n      }\n    }\n    function measureAll() { Array.prototype.forEach.call(counters, measure); }\n    Array.prototype.forEach.call(counters, function (counter) {\n      measure(counter);\n      var title = counter.querySelector('.hy-pdp-section-title');\n      if (typeof ResizeObserver !== 'undefined' && title) {\n        try { new ResizeObserver(function () { measure(counter); }).observe(title); } catch (e) {}\n      }\n      // Sol 070326 \u2014 CLIP FIX: the free-hytz SKU counters boot display:none (measure=0 \u2192 CSS falls back to\n      //   --hy-story-titleh:5rem, sized for ~1\u20132 lines). The RO can MISS the display:none\u2192block flip on\n      //   SKU-select when the font is already cached (no reflow \u2192 no 2nd RO fire), so titleh stays too small\n      //   for a heading that wraps to 3 lines (\"What stimulants actually cost your brain\") \u2192 --hy-story-head\n      //   is short \u2192 the 3rd line overflows the pinned band and the first card's top clips under it. Only the\n      //   3-line SKUs bit (others fit the stale value). An IntersectionObserver re-measures the instant a\n      //   counter nears the viewport \u2014 shown + final width + fonts loaded \u2014 so titleh is ALWAYS \u2265 real height\n      //   before you reach the stack. fonts.ready + a manual 'hy:counters-remeasure' event are extra safety.\n      if (typeof IntersectionObserver !== 'undefined') {\n        try { new IntersectionObserver(function (entries) {\n          entries.forEach(function (en) { if (en.isIntersecting) measure(en.target); });\n        }, { rootMargin: '250px 0px' }).observe(counter); } catch (e) {}\n      }\n    });\n    window.addEventListener('resize', measureAll, { passive: true });\n    if (document.fonts && document.fonts.ready && document.fonts.ready.then) document.fonts.ready.then(measureAll);\n    window.addEventListener('hy:counters-remeasure', measureAll);\n  })();\n\n  // ---- Sol R10-5 (063026): odd-aspect gallery slides FIT (contain) instead of crop. The supp-facts panel\n  //      isn't 4:5 like the product photos; mobile force-covers every slide \u2192 it got cropped. Flag any slide\n  //      whose image aspect deviates from 4:5 (0.8) so the .is-contain CSS switches it to object-fit:contain. ----\n  (function () {\n    var imgs = document.querySelectorAll('.hy-pdp-gallery-slide img');\n    if (!imgs.length) return;\n    function check(img) {\n      var w = img.naturalWidth, h = img.naturalHeight;\n      if (!w || !h) return;\n      var ar = w / h;\n      // The supp-facts panel is the odd one out (tall, e.g. 846\u00D71284). It's named `supp-facts-<sku>.png`,\n      // so match the FILENAME (reliable across SKUs) + a tall-aspect fallback. Product photos are square\n      // (1:1) or 4:5 \u2014 deliberately NOT flagged so they keep filling the slot (cover) on mobile.\n      var src = img.currentSrc || img.src || '';\n      var slide = img.closest('.hy-pdp-gallery-slide');\n      if (slide) slide.classList.toggle('is-contain', src.indexOf('supp-facts') !== -1 || ar < 0.72);\n    }\n    Array.prototype.forEach.call(imgs, function (img) {\n      if (img.complete && img.naturalWidth) check(img);\n      else img.addEventListener('load', function () { check(img); }, { once: true });\n    });\n  })();\n\n  // ---- Round 6: Gallery lightbox \u2014 square modal with zoom (scroll, pinch, double-click, pan). ----\n  (function () {\n    var gallery = document.getElementById('hy-pdp-gallery-main');\n    var lightbox = document.getElementById('hy-pdp-lightbox');\n    var lbCard = document.getElementById('hy-pdp-lightbox-card');\n    var lbImg = document.getElementById('hy-pdp-lightbox-img');\n    var lbImgWrap = document.getElementById('hy-pdp-lightbox-img-wrap');\n    var lbClose = document.getElementById('hy-pdp-lightbox-close');\n    var lbZoomIn = document.getElementById('hy-pdp-lightbox-zoom-in');\n    var lbZoomOut = document.getElementById('hy-pdp-lightbox-zoom-out');\n    var lbZoomReset = document.getElementById('hy-pdp-lightbox-zoom-reset');\n    var lbZoomLevel = document.getElementById('hy-pdp-lightbox-zoom-level');\n    if (!gallery || !lightbox || !lbCard || !lbImg || !lbImgWrap) return;\n\n    var sourceEl = null;\n    var lastFocus = null;\n\n    // Zoom state\n    var scale = 1;\n    var minScale = 1;\n    var maxScale = 4;\n    var tx = 0;  // translate x (px) applied on top of scale\n    var ty = 0;\n    var isPanning = false;\n    var panStartX = 0;\n    var panStartY = 0;\n    var panStartTx = 0;\n    var panStartTy = 0;\n\n    // Pinch state (touch)\n    var pinchActive = false;\n    var pinchStartDist = 0;\n    var pinchStartScale = 1;\n\n    function computeFinalRect() {\n      // Round 6: SQUARE modal at 1:1 aspect. Desktop: min(85vmin, 40rem). Mobile: min(92vmin, 32rem).\n      var isMobile = window.innerWidth <= 640;\n      var rem = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n      var vmin = Math.min(window.innerWidth, window.innerHeight);\n      var size;\n      if (isMobile) {\n        size = Math.min(vmin * 0.92, rem * 32);\n      } else {\n        size = Math.min(vmin * 0.85, rem * 40);\n      }\n      return {\n        left: Math.max(16, (window.innerWidth - size) / 2),\n        top: Math.max(16, (window.innerHeight - size) / 2),\n        width: size,\n        height: size\n      };\n    }\n\n    function applyTransform() {\n      lbImg.style.transform = 'translate(' + tx + 'px, ' + ty + 'px) scale(' + scale + ')';\n      if (lbZoomLevel) lbZoomLevel.textContent = Math.round(scale * 100) + '%';\n      lbImgWrap.classList.toggle('is-zoomed', scale > 1);\n      if (lbZoomIn) lbZoomIn.disabled = scale >= maxScale - 0.001;\n      if (lbZoomOut) lbZoomOut.disabled = scale <= minScale + 0.001;\n    }\n    function resetZoom() {\n      scale = 1;\n      tx = 0;\n      ty = 0;\n      applyTransform();\n    }\n    function clampPan() {\n      // Limit pan so image stays reasonably within the wrap\n      var wrapRect = lbImgWrap.getBoundingClientRect();\n      var imgRect = lbImg.getBoundingClientRect();\n      // Max offset each axis = (scaled image dim \u2212 wrap dim) / 2\n      var maxX = Math.max(0, (imgRect.width - wrapRect.width) / 2);\n      var maxY = Math.max(0, (imgRect.height - wrapRect.height) / 2);\n      if (tx > maxX) tx = maxX;\n      if (tx < -maxX) tx = -maxX;\n      if (ty > maxY) ty = maxY;\n      if (ty < -maxY) ty = -maxY;\n    }\n    // Zoom centered on a point within the wrap (e.g. cursor / pinch midpoint)\n    function zoomAt(nextScale, originX, originY) {\n      nextScale = Math.max(minScale, Math.min(maxScale, nextScale));\n      if (nextScale === scale) return;\n      var wrapRect = lbImgWrap.getBoundingClientRect();\n      // Point relative to wrap center\n      var cx = originX - (wrapRect.left + wrapRect.width / 2);\n      var cy = originY - (wrapRect.top + wrapRect.height / 2);\n      var ratio = nextScale / scale;\n      // Adjust translate so the point under the cursor stays fixed\n      tx = cx - (cx - tx) * ratio;\n      ty = cy - (cy - ty) * ratio;\n      scale = nextScale;\n      clampPan();\n      applyTransform();\n    }\n\n    // Sol B7-7 (062526) \u2014 standard centered lightbox: size the card to its final rect, fade + scale in.\n    // (Was a 360\u00B0 rotateY flip that grew out of the thumbnail \u2014 the \"outdated\" motion Sol flagged.)\n    function openLightbox(srcEl, imgUrl) {\n      if (!imgUrl) return;\n      sourceEl = srcEl;\n      lastFocus = document.activeElement;\n      lbImg.src = imgUrl;\n      resetZoom();\n\n      var finalRect = computeFinalRect();\n\n      lightbox.classList.add('is-visible', 'is-opening');\n      lightbox.setAttribute('aria-hidden', 'false');\n      if (window.hyLockBodyScroll) window.hyLockBodyScroll('pdp-lightbox');\n\n      // Card sits centered at its final size; CSS owns the fade + scale (no thumbnail flip).\n      lbCard.style.left = finalRect.left + 'px';\n      lbCard.style.top = finalRect.top + 'px';\n      lbCard.style.width = finalRect.width + 'px';\n      lbCard.style.height = finalRect.height + 'px';\n      lbCard.offsetHeight; // reflow so the fade-in transition runs\n\n      requestAnimationFrame(function () {\n        lightbox.classList.remove('is-opening');\n      });\n\n      setTimeout(function () {\n        if (lbClose) lbClose.focus();\n      }, 200);\n    }\n\n    function closeLightbox() {\n      if (!sourceEl) return;\n      lightbox.classList.add('is-closing');\n      setTimeout(function () {\n        lightbox.classList.remove('is-visible');\n        lightbox.classList.remove('is-closing');\n        lightbox.setAttribute('aria-hidden', 'true');\n        if (window.hyUnlockBodyScroll) window.hyUnlockBodyScroll('pdp-lightbox');\n        lbCard.style.left = '';\n        lbCard.style.top = '';\n        lbCard.style.width = '';\n        lbCard.style.height = '';\n        sourceEl = null;\n        resetZoom();  // Reset on close\n        if (lastFocus && lastFocus.focus) lastFocus.focus();\n      }, 320);\n    }\n\n    // Click a gallery SLIDE \u2192 open lightbox on THAT slide's image (swipe gallery: the\n    // track holds multiple slides, so resolve the clicked slide rather than slide 1).\n    // Lifestyle slides are skipped (they're a labeled generated preview, not zoomable product art).\n    gallery.addEventListener('click', function (e) {\n      return; // Sol (070826) \u2014 PDP product-image lightbox DISABLED (images already full-size). Remove this line to re-enable.\n      var slide = e.target.closest('.hy-pdp-gallery-slide');\n      if (!slide || slide.classList.contains('hy-pdp-gallery-slide--lifestyle')) return;\n      e.preventDefault();\n      var imgEl = slide.querySelector('img');\n      openLightbox(slide, imgEl ? imgEl.src : '');\n    });\n\n    // Dismiss: X button, backdrop (but NOT the card interior \u2014 that's where zoom happens)\n    lightbox.addEventListener('click', function (e) {\n      if (e.target.closest('#hy-pdp-lightbox-close') || e.target.hasAttribute('data-lightbox-dismiss')) {\n        closeLightbox();\n      }\n    });\n\n    // Escape key + Tab focus trap\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && lightbox.classList.contains('is-visible')) {\n        closeLightbox();\n      }\n      if (e.key === 'Tab' && lightbox.classList.contains('is-visible') && !lightbox.classList.contains('is-opening')) {\n        e.preventDefault();\n        if (lbClose) lbClose.focus();\n      }\n    });\n\n    // Resize \u2192 reposition if open (and re-clamp pan)\n    window.addEventListener('resize', function () {\n      if (!lightbox.classList.contains('is-visible') || lightbox.classList.contains('is-opening') || lightbox.classList.contains('is-closing')) return;\n      var finalRect = computeFinalRect();\n      lbCard.style.left = finalRect.left + 'px';\n      lbCard.style.top = finalRect.top + 'px';\n      lbCard.style.width = finalRect.width + 'px';\n      lbCard.style.height = finalRect.height + 'px';\n      clampPan();\n      applyTransform();\n    });\n\n    // Zoom button controls\n    if (lbZoomIn) lbZoomIn.addEventListener('click', function () {\n      var wrapRect = lbImgWrap.getBoundingClientRect();\n      zoomAt(scale + 0.5, wrapRect.left + wrapRect.width / 2, wrapRect.top + wrapRect.height / 2);\n    });\n    if (lbZoomOut) lbZoomOut.addEventListener('click', function () {\n      var wrapRect = lbImgWrap.getBoundingClientRect();\n      zoomAt(scale - 0.5, wrapRect.left + wrapRect.width / 2, wrapRect.top + wrapRect.height / 2);\n    });\n    if (lbZoomReset) lbZoomReset.addEventListener('click', resetZoom);\n\n    // Scroll wheel zoom (zoom at pointer)\n    lbImgWrap.addEventListener('wheel', function (e) {\n      e.preventDefault();\n      var delta = -Math.sign(e.deltaY) * 0.25;\n      zoomAt(scale + delta, e.clientX, e.clientY);\n    }, { passive: false });\n\n    // Double-click toggle 1x \u2194 2x at cursor\n    lbImgWrap.addEventListener('dblclick', function (e) {\n      if (scale > 1) {\n        resetZoom();\n      } else {\n        zoomAt(2, e.clientX, e.clientY);\n      }\n    });\n\n    // Pan on pointer drag (when zoomed)\n    lbImgWrap.addEventListener('pointerdown', function (e) {\n      // Two+ pointers \u2192 pinch path\n      if (e.pointerType === 'touch') return;\n      if (scale <= 1) return;\n      isPanning = true;\n      panStartX = e.clientX;\n      panStartY = e.clientY;\n      panStartTx = tx;\n      panStartTy = ty;\n      lbImgWrap.classList.add('is-panning');\n      try { lbImgWrap.setPointerCapture(e.pointerId); } catch (_) {}\n    });\n    lbImgWrap.addEventListener('pointermove', function (e) {\n      if (!isPanning) return;\n      tx = panStartTx + (e.clientX - panStartX);\n      ty = panStartTy + (e.clientY - panStartY);\n      clampPan();\n      applyTransform();\n    });\n    function endPan(e) {\n      if (!isPanning) return;\n      isPanning = false;\n      lbImgWrap.classList.remove('is-panning');\n      try { lbImgWrap.releasePointerCapture(e.pointerId); } catch (_) {}\n    }\n    lbImgWrap.addEventListener('pointerup', endPan);\n    lbImgWrap.addEventListener('pointercancel', endPan);\n    lbImgWrap.addEventListener('pointerleave', endPan);\n\n    // Pinch-to-zoom (touch) \u2014 use native TouchEvent for 2-finger gesture\n    var activeTouches = {};\n    function touchDist() {\n      var ids = Object.keys(activeTouches);\n      if (ids.length < 2) return 0;\n      var a = activeTouches[ids[0]];\n      var b = activeTouches[ids[1]];\n      var dx = a.x - b.x, dy = a.y - b.y;\n      return Math.sqrt(dx * dx + dy * dy);\n    }\n    function touchMid() {\n      var ids = Object.keys(activeTouches);\n      if (ids.length < 2) return { x: 0, y: 0 };\n      var a = activeTouches[ids[0]];\n      var b = activeTouches[ids[1]];\n      return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n    lbImgWrap.addEventListener('touchstart', function (e) {\n      for (var i = 0; i < e.changedTouches.length; i++) {\n        var t = e.changedTouches[i];\n        activeTouches[t.identifier] = { x: t.clientX, y: t.clientY };\n      }\n      if (Object.keys(activeTouches).length === 2) {\n        pinchActive = true;\n        pinchStartDist = touchDist();\n        pinchStartScale = scale;\n      } else if (Object.keys(activeTouches).length === 1 && scale > 1) {\n        // Single-touch pan\n        var t0 = e.changedTouches[0];\n        isPanning = true;\n        panStartX = t0.clientX;\n        panStartY = t0.clientY;\n        panStartTx = tx;\n        panStartTy = ty;\n        lbImgWrap.classList.add('is-panning');\n      }\n    }, { passive: true });\n    lbImgWrap.addEventListener('touchmove', function (e) {\n      for (var i = 0; i < e.changedTouches.length; i++) {\n        var t = e.changedTouches[i];\n        if (activeTouches[t.identifier]) {\n          activeTouches[t.identifier].x = t.clientX;\n          activeTouches[t.identifier].y = t.clientY;\n        }\n      }\n      if (pinchActive && Object.keys(activeTouches).length >= 2) {\n        e.preventDefault();\n        var d = touchDist();\n        if (pinchStartDist > 0) {\n          var next = pinchStartScale * (d / pinchStartDist);\n          var mid = touchMid();\n          zoomAt(next, mid.x, mid.y);\n        }\n      } else if (isPanning && Object.keys(activeTouches).length === 1) {\n        e.preventDefault();\n        var t = e.changedTouches[0];\n        tx = panStartTx + (t.clientX - panStartX);\n        ty = panStartTy + (t.clientY - panStartY);\n        clampPan();\n        applyTransform();\n      }\n    }, { passive: false });\n    function touchEnd(e) {\n      for (var i = 0; i < e.changedTouches.length; i++) {\n        delete activeTouches[e.changedTouches[i].identifier];\n      }\n      if (Object.keys(activeTouches).length < 2) pinchActive = false;\n      if (Object.keys(activeTouches).length === 0) {\n        isPanning = false;\n        lbImgWrap.classList.remove('is-panning');\n      }\n    }\n    lbImgWrap.addEventListener('touchend', touchEnd);\n    lbImgWrap.addEventListener('touchcancel', touchEnd);\n\n    // Initial UI state\n    applyTransform();\n  })();\n\n  // ---- Sticky ATC (bottom pill) \u2014 Sol 062526: Rhode bottom-sheet pack picker (mirrors free-hytz).\n  // Bar = [pack selector | filled Buy CTA]; tapping the selector cross-slides a sibling sheet of pack options.\n  var sticky = document.getElementById('hy-pdp-sticky');\n  var stickyCta = document.getElementById('hy-pdp-sticky-cta');\n  var stickyCtaPrice = document.getElementById('hy-pdp-sticky-cta-price');   // Buy \u00B7 [price]\n  var stickySheet = document.getElementById('hy-pdp-sticky-sheet');\n  var stickyPicker = sticky ? sticky.querySelector('[data-hy-pdp-sticky-picker]') : null;\n  var stickySelect = document.getElementById('hy-pdp-sticky-select');\n  var stickySelectName = document.getElementById('hy-pdp-sticky-select-name');\n  var stickySelectPrice = document.getElementById('hy-pdp-sticky-select-price');\n  // Pack options now live in the sheet; JS still queries them by .hy-pdp-sticky-pack (data-size/-variant-id/-variant-image + price).\n  var stickyPacks = stickySheet ? stickySheet.querySelectorAll('.hy-pdp-sticky-pack') : [];\n  // B13-P3 \u2014 desktop inline segmented chips (data-size matches the hero pills + sheet packs).\n  var stickyChips = sticky ? sticky.querySelectorAll('.hy-pdp-sticky-chip') : [];\n\n  // B24-P2 (070626) \u2014 kill the pack-switch scroll jump on iOS Safari (which has no native scroll anchoring).\n  // When the user is far down the page (the WHOLE buy area is above the viewport) a sticky pack switch that\n  // grows/shrinks the buy area (the subscribe block appears/hides on Single\u2194plan-eligible) shifts everything\n  // below. Capture a stable below-buy-area anchor's viewport top before the swap, restore it after. On Chrome\n  // the delta is \u22480 (its anchoring already corrected) \u2192 a harmless no-op. Dependency-free, single synchronous tick.\n  function hyBuyArea() { return pdp.querySelector('.hy-pdp-info'); }\n  function hyStackAnchor() { return document.getElementById('hy-pdp-stack') || pdp.querySelector('.hy-pdp-story') || document.querySelector('.hy-footer'); }\n  function hyStableSwap(doSwap) {\n    var buyArea = hyBuyArea();\n    var anchor = hyStackAnchor();\n    var farDown = buyArea && buyArea.getBoundingClientRect().bottom < 0;   // guard: only when buy area is above viewport top\n    var before = (farDown && anchor) ? anchor.getBoundingClientRect().top : null;\n    doSwap();\n    if (before !== null && anchor) {\n      var delta = anchor.getBoundingClientRect().top - before;\n      if (Math.abs(delta) > 0.5) window.scrollBy(0, delta);\n    }\n  }\n\n  function syncStickySelectionFromSize(size) {\n    stickyPacks.forEach(function (p) {\n      var match = p.dataset.size === size;\n      p.classList.toggle('is-selected', match);\n      p.setAttribute('aria-selected', match ? 'true' : 'false');\n      if (match) {\n        var nameEl = p.querySelector('.hy-pdp-sticky-pack-name');\n        var pr = p.querySelector('.hy-pdp-sticky-pack-price');\n        var prTxt = pr ? pr.textContent.trim() : '';\n        if (pr && stickyCtaPrice) stickyCtaPrice.textContent = prTxt;       // mirror price onto Buy CTA\n        if (stickySelectName && nameEl) stickySelectName.textContent = nameEl.textContent.trim();\n        if (stickySelectPrice) stickySelectPrice.textContent = prTxt;       // selector still tracks price (hidden via CSS)\n      }\n    });\n    // Keep the desktop chips in sync (also when selection is driven by hero pills / the mobile dropdown).\n    stickyChips.forEach(function (c) {\n      var cMatch = c.dataset.size === size;\n      c.classList.toggle('is-selected', cMatch);\n      c.setAttribute('aria-pressed', cMatch ? 'true' : 'false');\n    });\n  }\n  function syncHeroSelectionFromSize(size) {\n    pills.forEach(function (p) {\n      var match = p.dataset.size === size;\n      p.classList.toggle('is-selected', match);\n      hyPillPressed(p, match);   /* FABLE-A11Y */\n    });\n  }\n\n  // Hero pill click \u2192 reflect on sticky (price/variant handled by hero pill's own listener upstream)\n  pills.forEach(function (pill) {\n    pill.addEventListener('click', function () {\n      if (pill.hasAttribute('disabled')) return;\n      syncStickySelectionFromSize(pill.dataset.size);\n    });\n  });\n\n  // ---- Rhode bottom-sheet picker: tap selector \u2192 bar slides DOWN + sheet slides UP; pick an option \u2192 inverse.\n  // openSheet/closeSheet toggle .is-picking on the bar + .is-open on the sheet + aria-expanded on the select. ----\n  // B13-P3 \u2014 desktop (\u2265641px) uses inline chips, never the dropdown/sheet.\n  function isStickyDesktop() { return window.matchMedia('(min-width: 641px)').matches; }\n  function closeStickySheet() {\n    if (stickySheet) { stickySheet.classList.remove('is-open'); stickySheet.setAttribute('aria-hidden', 'true'); }\n    if (sticky) sticky.classList.remove('is-picking');\n    if (stickySelect) stickySelect.setAttribute('aria-expanded', 'false');\n  }\n  function openStickySheet() {\n    if (!stickySheet || isStickyDesktop()) return;   // desktop: chips replace the sheet\n    stickySheet.classList.add('is-open'); stickySheet.setAttribute('aria-hidden', 'false');\n    if (sticky) sticky.classList.add('is-picking');\n    if (stickySelect) stickySelect.setAttribute('aria-expanded', 'true');\n  }\n  if (stickySelect) {\n    stickySelect.addEventListener('click', function (e) {\n      e.preventDefault(); e.stopPropagation();\n      if (stickySheet && stickySheet.classList.contains('is-open')) closeStickySheet(); else openStickySheet();\n    });\n  }\n\n  // Sticky pack pick \u2192 drive the hero pill (single source of truth for variant/image/tab sync), then close the sheet.\n  stickyPacks.forEach(function (pack) {\n    pack.addEventListener('click', function () {\n      if (pack.hasAttribute('disabled')) return;\n      var size = pack.dataset.size;\n      hyStableSwap(function () {   // B24-P2 \u2014 restore scroll if the buy-area height changed off-screen\n        var heroPill = pdp.querySelector('.hy-pdp-price-pill[data-size=\"' + size + '\"]');\n        if (heroPill && !heroPill.hasAttribute('disabled')) {\n          heroPill.click();  // triggers variant/image/tab sync + price update + subscribe refresh (height change)\n        }\n        syncStickySelectionFromSize(size);\n      });\n      closeStickySheet();\n    });\n  });\n\n  // B13-P3 \u2014 desktop inline chips: same select-pack routine as the sheet options (drive the hero pill), NO sheet.\n  stickyChips.forEach(function (chip) {\n    chip.addEventListener('click', function () {\n      if (chip.hasAttribute('disabled')) return;\n      var size = chip.dataset.size;\n      hyStableSwap(function () {   // B24-P2 \u2014 restore scroll if the buy-area height changed off-screen\n        var heroPill = pdp.querySelector('.hy-pdp-price-pill[data-size=\"' + size + '\"]');\n        if (heroPill && !heroPill.hasAttribute('disabled')) {\n          heroPill.click();  // triggers variant/image/tab sync + price update\n        }\n        syncStickySelectionFromSize(size);\n      });\n    });\n  });\n\n  // Sol 062526 \u2014 Sticky Buy: adds the selected variant straight to cart (submits the hero cart form).\n  if (stickyCta && cartForm) {\n    stickyCta.addEventListener('click', function () {\n      cartForm.dispatchEvent(new Event('submit', { cancelable: true, bubbles: true }));\n    });\n  }\n  // Close the sheet on click-outside (not the sheet, not the picker) + Escape \u2014 mirrors free-hytz.\n  document.addEventListener('click', function (e) {\n    if (stickySheet && stickySheet.classList.contains('is-open') && !stickySheet.contains(e.target) && stickyPicker && !stickyPicker.contains(e.target)) closeStickySheet();\n  });\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape' && stickySheet && stickySheet.classList.contains('is-open')) closeStickySheet();\n  });\n\n  // Visibility: show sticky once the hero cart form scrolls above the viewport,\n  // AND hide again when the FOOTER enters view (don't sit over the footer).\n  // NOTE: tried using FAQ-passed-viewport-top here originally \u2014 but the FAQ\n  // section ends ~600px before the max scroll position, so faqRect.bottom < 0\n  // is mathematically unreachable. footer-top-in-view is the correct trigger\n  // (effectively: \"user has reached the bottom-of-content zone\").\n  if (sticky && cartForm) {\n    var stickyTick = null;\n    var pageFooter = document.querySelector('.hy-footer');\n    var navInner = document.querySelector('.hytz-nav .hytz-nav-inner');\n    // Match the bar + sheet width to the nav (mirrors free-hytz matchStickyToNav); re-run on the visibility tick.\n    function matchStickyToNav() {\n      if (!navInner) return;\n      var w = navInner.getBoundingClientRect().width;\n      if (!w) return;\n      // B13-F1 \u2014 never exceed the 42rem pill cap, even if the nav reads its full-width (unscrolled) state on a\n      // refresh-while-scrolled. Mirrors the CSS width: min(42rem, 100% - 3.5rem). Kills the wide first-paint flash.\n      var rem = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n      w = Math.min(w, 42 * rem, window.innerWidth - 3.5 * rem);\n      var px = Math.round(w) + 'px';\n      sticky.style.width = px;\n      if (stickySheet) stickySheet.style.width = px;\n    }\n    function updateStickyVisibility() {\n      stickyTick = null;\n      matchStickyToNav();\n      if (isStickyDesktop()) closeStickySheet();   // B13-P3 \u2014 never leave a sheet open after resizing to desktop\n\n      var heroRect = cartForm.getBoundingClientRect();\n      var heroPast = heroRect.bottom < 0;\n      var footerInView = false;\n      if (pageFooter) {\n        var footerRect = pageFooter.getBoundingClientRect();\n        // Footer top has entered the viewport bottom = user reached footer area\n        footerInView = footerRect.top < window.innerHeight;\n      }\n      var shouldShow = heroPast && !footerInView;\n      if (shouldShow) {\n        sticky.classList.add('is-visible');\n        sticky.setAttribute('aria-hidden', 'false');\n      } else {\n        sticky.classList.remove('is-visible');\n        sticky.setAttribute('aria-hidden', 'true');\n        closeStickySheet();   // never leave the sheet open once the bar hides (e.g. scrolling back up)\n      }\n    }\n    function onScrollOrResize() {\n      if (stickyTick !== null) return;\n      stickyTick = requestAnimationFrame(updateStickyVisibility);\n    }\n    window.addEventListener('scroll', onScrollOrResize, { passive: true });\n    window.addEventListener('resize', onScrollOrResize);\n    updateStickyVisibility();  // initial check\n  }\n\n  // ---- B24-AP (070626): buy-area \"Bundle & save\" discovery chip \u2192 smooth-scroll to the Stack-your-habitz band.\n  //      Native href=\"#hy-pdp-stack\" is the no-JS fallback; here we honor prefers-reduced-motion + clear the nav.\n  var stackChip = pdp.querySelector('[data-hy-stack-scroll]');\n  if (stackChip) {\n    stackChip.addEventListener('click', function (e) {\n      var target = document.getElementById('hy-pdp-stack');\n      if (!target) return;   // no band on this page \u2192 let the native anchor jump run\n      e.preventDefault();\n      var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      var y = target.getBoundingClientRect().top + window.pageYOffset - 80;   // clear the sticky nav\n      window.scrollTo({ top: Math.max(0, y), behavior: reduce ? 'auto' : 'smooth' });\n    });\n  }\n\n  // ---- Render ingredient spotlight cards (v3: image-forward tiles) ----\n  if (window.hytzPdpIngredients && window.hytzPdpIngredients[handle]) {\n    var track = document.getElementById('hy-pdp-ingredients-track-' + handle);\n    var ingredients = window.hytzPdpIngredients[handle];\n    if (track && ingredients && ingredients.length) {\n      function escapeHtml(s) {\n        if (s == null) return '';\n        return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n      }\n      var cardsHtml = '';\n      ingredients.forEach(function (ing) {\n        var placeholder = 'Ingredient image: ' + ing.name + ' \u2014 macro shot, product-color tinted';\n        var metaHtml = '';\n        if (ing.foundIn || ing.benefits) {\n          metaHtml = '<div class=\"hy-pdp-ingredient-meta\">';\n          if (ing.foundIn) {\n            metaHtml += '<div class=\"hy-pdp-ingredient-meta-row\">' +\n              '<span class=\"hy-pdp-ingredient-meta-label\">Found in</span>' +\n              '<span class=\"hy-pdp-ingredient-meta-value\">' + escapeHtml(ing.foundIn) + '</span>' +\n              '</div>';\n          }\n          if (ing.benefits) {\n            metaHtml += '<div class=\"hy-pdp-ingredient-meta-row\">' +\n              '<span class=\"hy-pdp-ingredient-meta-label\">Benefits</span>' +\n              '<span class=\"hy-pdp-ingredient-meta-value\">' + escapeHtml(ing.benefits) + '</span>' +\n              '</div>';\n          }\n          metaHtml += '</div>';\n        }\n        var slug = ing.image || '';\n        var imgHtml = '';\n        var imgClass = 'hy-pdp-ingredient-image';\n        if (slug && window.hytzAssetBase) {\n          imgHtml = '<img src=\"' + window.hytzAssetBase + 'ingredient-' + escapeHtml(slug) + '.webp\" alt=\"' + escapeHtml(ing.name) + '\" loading=\"lazy\">';\n          imgClass += ' hy-pdp-ingredient-image--has-img';\n        }\n        cardsHtml += '<article class=\"hy-pdp-ingredient-card\">' +\n          '<div class=\"' + imgClass + '\" data-placeholder=\"' + escapeHtml(placeholder) + '\" data-ingredient-slug=\"' + escapeHtml(slug) + '\">' + imgHtml + '</div>' +\n          '<div class=\"hy-pdp-ingredient-body\">' +\n            '<div class=\"hy-pdp-ingredient-role\">' + escapeHtml(ing.role) + '</div>' +\n            '<h3 class=\"hy-pdp-ingredient-name\">' + escapeHtml(ing.name) + '</h3>' +\n            '<div class=\"hy-pdp-ingredient-amount\">' + escapeHtml(ing.amount) + '</div>' +\n            '<p class=\"hy-pdp-ingredient-blurb\">' + escapeHtml(ing.blurb) + '</p>' +\n            metaHtml +\n          '</div>' +\n        '</article>';\n      });\n      track.innerHTML = cardsHtml;\n    }\n    // Round 8: ingredient arrows now handled by the unified carousel setup below.\n  }\n\n  // ---- B1 (070626): Subscribe & Save toggle \u2014 drives Appstle selling plans from our own UI. ----\n  // Per-variant plans come from the #hy-pdp-plans-data island (hytz-pdp-buyarea.liquid); the chosen\n  // plan id is written to #hy-pdp-selling-plan (read by the AJAX add below \u2014 sticky CTA shares that\n  // same submit). Variant-aware: Single has no allocations \u2192 the whole toggle hides. Listeners here\n  // bind AFTER the pill/chip/sheet wiring above, so refresh() gets the last word on displayed prices.\n  (function initSubscribeToggle() {\n    var subWrap = document.getElementById('hy-pdp-sub');\n    var spInput = document.getElementById('hy-pdp-selling-plan');\n    var island = document.getElementById('hy-pdp-plans-data');\n    if (!subWrap || !spInput || !island || !variantInput) return;\n    var plansByVariant;\n    try { plansByVariant = JSON.parse(island.textContent) || {}; } catch (e) { return; }\n    var freqWrap = document.getElementById('hy-pdp-sub-freq');\n    var noteEl = document.getElementById('hy-pdp-sub-note');\n    var choiceBtns = subWrap.querySelectorAll('[data-hy-sub-choice]');\n    var mode = 'onetime';   // survives pack switches; re-applies when a plan-bearing pack returns\n    function subEsc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;'); }\n    function subMoney(cents) { return '$' + (Math.max(0, Math.round(cents)) / 100).toFixed(2).replace(/\\.00$/, ''); }   // mirrors money_without_trailing_zeros\n    // B26-P1 \u2014 plans render in ascending-interval order (2 Weeks \u2192 1 Month \u2192 2 Months), whatever order\n    // Appstle stores them in. Sorting happens INSIDE plansFor so freqIndex means the same slot on every pack.\n    function planDays(p) {\n      var m = /(\\d+)\\s*(day|week|month|year)/i.exec(p.name || '');\n      if (!m) return 9999;\n      return parseInt(m[1], 10) * ({ day: 1, week: 7, month: 30, year: 365 })[m[2].toLowerCase()];\n    }\n    function plansFor(vid) {\n      return (plansByVariant[String(vid)] || []).slice().sort(function (a, b) { return planDays(a) - planDays(b); });\n    }\n    // B26-P1 \u2014 the DEFAULT frequency stays 1 Month (not the first-listed 2 Weeks): find its sorted slot once.\n    var freqIndex = 0;\n    (function () {\n      for (var vid in plansByVariant) {\n        var sorted = plansFor(vid);\n        if (!sorted.length) continue;\n        for (var i = 0; i < sorted.length; i++) { if (/^\\s*1\\s*month/i.test(sorted[i].name || '')) { freqIndex = i; return; } }\n        return;\n      }\n    })();\n    function clampIndex(plans) { return Math.min(freqIndex, Math.max(0, plans.length - 1)); }\n    function renderFreq(plans) {\n      var sel = clampIndex(plans);\n      var html = '';\n      plans.forEach(function (p, i) {\n        html += '<button type=\"button\" class=\"hy-pdp-freq-pill' + (i === sel ? ' is-selected' : '') + '\" data-freq-index=\"' + i + '\" aria-pressed=\"' + (i === sel) + '\">' + subEsc(p.name) + '</button>';\n      });\n      freqWrap.innerHTML = html;\n      freqWrap.querySelectorAll('.hy-pdp-freq-pill').forEach(function (b) {\n        b.addEventListener('click', function () { freqIndex = parseInt(b.dataset.freqIndex, 10) || 0; refresh(); });\n      });\n    }\n    function refresh() {\n      var plans = plansFor(variantInput.value);\n      var subscribing = mode === 'subscribe' && plans.length > 0;\n      subWrap.hidden = plans.length === 0;   // Single: no plans \u2192 toggle hides entirely\n      choiceBtns.forEach(function (b) {\n        var on = (b.dataset.hySubChoice === 'subscribe') === subscribing;\n        b.classList.toggle('is-selected', on);\n        b.setAttribute('aria-checked', on ? 'true' : 'false');   // B24-AP5 \u2014 rows are role=radio\n      });\n      freqWrap.hidden = !subscribing;\n      if (noteEl) noteEl.hidden = !subscribing;\n      if (subscribing) renderFreq(plans); else freqWrap.innerHTML = '';\n      var plan = subscribing ? plans[clampIndex(plans)] : null;\n      spInput.value = plan ? String(plan.id) : '';\n      // Price displays \u2014 each pack pill shows its own allocation price at the chosen frequency; sticky CTA follows.\n      pills.forEach(function (pill) {\n        var priceEl = pill.querySelector('.hy-pdp-price');\n        if (!priceEl) return;\n        if (pill.dataset.priceOnetime == null) pill.dataset.priceOnetime = priceEl.textContent.trim();\n        var pPlans = plansFor(pill.dataset.variantId);\n        var pPlan = subscribing && pPlans.length ? pPlans[clampIndex(pPlans)] : null;\n        if (pPlan) priceEl.innerHTML = '<span class=\"hy-pdp-price-was\">' + subEsc(pill.dataset.priceOnetime) + '</span><span class=\"hy-pdp-price-now\">' + subMoney(pPlan.price) + '</span>';\n        else priceEl.textContent = pill.dataset.priceOnetime;\n      });\n      // B24-AP5 \u2014 the two Purchase-options rows mirror the SELECTED pack: one-time price (row 1) + the sub deal\n      // (sub price / struck one-time, row 2). Runs AFTER the pill loop so priceOnetime is cached. The sub row shows\n      // its deal even when one-time is selected (the value-prop); prices swap on pack/frequency change, not on mode.\n      var selPill = pdp.querySelector('.hy-pdp-price-pill.is-selected');\n      var selVid = selPill ? selPill.dataset.variantId : (variantInput ? variantInput.value : '');\n      var selPlans = plansFor(selVid);\n      var selPlan = selPlans.length ? selPlans[clampIndex(selPlans)] : null;\n      var selOne = (selPill && selPill.dataset.priceOnetime != null) ? selPill.dataset.priceOnetime : '';\n      var elOne = subWrap.querySelector('[data-hy-sub-onetime-price]');\n      if (elOne && selOne) elOne.textContent = selOne;\n      var elSubNow = subWrap.querySelector('[data-hy-sub-price-now]');\n      var elSubWas = subWrap.querySelector('[data-hy-sub-price-was]');\n      if (elSubNow) elSubNow.textContent = selPlan ? subMoney(selPlan.price) : (selOne || elSubNow.textContent);\n      if (elSubWas && selOne) elSubWas.textContent = selOne;\n      if (stickyCtaPrice) {\n        var selPill = pdp.querySelector('.hy-pdp-price-pill.is-selected');\n        if (plan) stickyCtaPrice.textContent = subMoney(plan.price);\n        else if (selPill && selPill.dataset.priceOnetime != null) stickyCtaPrice.textContent = selPill.dataset.priceOnetime;\n      }\n    }\n    choiceBtns.forEach(function (b) {\n      // B26-P1 \u2014 the Subscribe card is a TOGGLE: click selects, click again deselects (back to one-time).\n      b.addEventListener('click', function () {\n        if (b.dataset.hySubChoice === 'subscribe') mode = (mode === 'subscribe') ? 'onetime' : 'subscribe';\n        else mode = 'onetime';\n        refresh();\n      });\n    });\n    // Re-run after every pack change \u2014 these bind after the handlers above, so they always run last.\n    pills.forEach(function (p) { p.addEventListener('click', refresh); });\n    tabs.forEach(function (t) { t.addEventListener('click', refresh); });\n    stickyChips.forEach(function (c) { c.addEventListener('click', refresh); });\n    stickyPacks.forEach(function (p) { p.addEventListener('click', refresh); });\n    refresh();\n  })();\n\n  // ---- Add to cart (AJAX) ----\n  if (cartForm) {\n    cartForm.addEventListener('submit', function (e) {\n      e.preventDefault();\n      if (!variantInput || !variantInput.value) return;\n      var qtyInput = cartForm.querySelector('input[name=\"quantity\"]');\n      var qty = qtyInput ? Math.max(1, parseInt(qtyInput.value, 10) || 1) : 1;\n      var selectedPill = pdp.querySelector('.hy-pdp-price-pill.is-selected');\n      var selectedSize = selectedPill ? selectedPill.dataset.size : '';\n      var selectedVariantId = variantInput.value;\n      // Sol B5-PDP-3: include the Appstle subscription selling_plan so \"Subscribe\" actually subscribes.\n      // The AJAX add previously sent only {id, quantity}, so a selected subscription was dropped and the\n      // item went in as a one-time product. Read the chosen selling_plan (radio first, then select).\n      // B1 (070626): the custom Subscribe & Save toggle writes #hy-pdp-selling-plan \u2014 authoritative when\n      // present, so the hidden (display:none) Appstle widget's own selling_plan radios/select can never\n      // leak a plan id the customer didn't choose.\n      var spOwn = document.getElementById('hy-pdp-selling-plan');\n      var spRadio = document.querySelector('input[type=\"radio\"][name=\"selling_plan\"]:checked');\n      var spSelect = document.querySelector('select[name=\"selling_plan\"]');\n      var sellingPlanVal = 0;\n      if (spOwn) sellingPlanVal = parseInt(spOwn.value, 10) || 0;\n      else if (spRadio && spRadio.value) sellingPlanVal = parseInt(spRadio.value, 10) || 0;\n      else if (spSelect && spSelect.value) sellingPlanVal = parseInt(spSelect.value, 10) || 0;\n      var atcItem = { id: parseInt(selectedVariantId, 10), quantity: qty };\n      if (sellingPlanVal) atcItem.selling_plan = sellingPlanVal;\n      if (cartBtn) { cartBtn.disabled = true; cartBtn.style.opacity = '0.6'; }\n      if (cartMsg) { cartMsg.classList.remove('is-visible', 'is-error'); }\n      fetch('/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ items: [atcItem] })\n      })\n        .then(function (r) { return r.json(); })\n        .then(function (data) {\n          if (cartBtn) { cartBtn.disabled = false; cartBtn.style.opacity = ''; }\n          if (data && data.status) {\n            if (cartMsg) {\n              cartMsg.textContent = '\u2717 ' + (data.description || 'Could not add');\n              cartMsg.classList.add('is-visible', 'is-error');\n              setTimeout(function () { cartMsg.classList.remove('is-visible'); }, 2800);\n            }\n            return;\n          }\n          if (typeof window.hytzMetaTrackAddToCart === 'function') {\n            window.hytzMetaTrackAddToCart({\n              variantId: selectedVariantId,\n              quantity: qty,\n              response: data,\n              handle: handle,\n              size: selectedSize,\n              source: 'hytz-v2-pdp-ajax',\n              buttonTag: 'pdp_add_to_cart'\n            });\n          }\n          if (cartMsg) {\n            cartMsg.textContent = '\u2713 Added to cart';\n            cartMsg.classList.add('is-visible');\n            setTimeout(function () { cartMsg.classList.remove('is-visible'); }, 2400);\n          }\n          if (typeof window.hytzRefreshCart === 'function') {\n            window.hytzRefreshCart();\n          } else {\n            fetch('/cart.js').then(function (r) { return r.json(); }).then(function (c) {\n              document.querySelectorAll('.hytz-cart-count').forEach(function (el) {\n                el.textContent = c.item_count;\n              });\n            });\n          }\n          // Open mini cart drawer for visual confirmation. Slight delay so the\n          // cart count refresh runs first and the drawer opens with fresh data.\n          if (typeof window.hytzOpenCart === 'function') {\n            setTimeout(function () { window.hytzOpenCart(); }, 350);\n          }\n        })\n        .catch(function () {\n          if (cartBtn) { cartBtn.disabled = false; cartBtn.style.opacity = ''; }\n          if (cartMsg) {\n            cartMsg.textContent = '\u2717 Could not add';\n            cartMsg.classList.add('is-visible', 'is-error');\n            setTimeout(function () { cartMsg.classList.remove('is-visible'); }, 2800);\n          }\n        });\n    });\n  }\n\n  // ---- Round 8: Unified infinite carousel system (Option A \u2014 cloned-edges\n  //      native-scroll with idle-reposition) + line indicators.\n  //\n  //      TRUE infinite: the user scrolls right past the last card and the FIRST\n  //      card appears naturally to the right (because we pre-clone a full copy\n  //      of the originals both before and after the real set). When scroll\n  //      becomes idle (140ms), we silently reposition scrollLeft back to the\n  //      equivalent position in the ORIGINALS zone so the user can keep going\n  //      indefinitely in either direction.\n  //\n  //      Line indicators track which ORIGINAL index is most-visible at any\n  //      scroll position, regardless of which clone set is currently on-screen.\n  //\n  //      Applied to ALL four PDP carousels \u2014 reviews works the same way at\n  //      every viewport, mobile scrollers work when they actually overflow. ----\n  (function () {\n    // Option C (round 8.1): fully layout-aware init/teardown.\n    // A scroller is \"active\" only when its CURRENT computed layout is an\n    // overflowing horizontal scroller (flex/grid with overflow-x: auto|scroll\n    // AND scrollWidth > clientWidth). We inject clones + wire listeners only\n    // when active, and we tear them down (remove clones, unwire) when the\n    // layout flips back to a static grid (e.g. mobile \u2192 desktop resize).\n    //\n    // State is tracked via `data-carousel-state=\"active\"|\"inactive\"` on the\n    // scroller so setup/teardown are idempotent.\n\n    // Registry of { scroller, config, teardown } so the debounced resize\n    // handler can re-evaluate each carousel on viewport changes.\n    var carousels = [];\n\n    function isHorizontalScroller(scroller) {\n      var cs = getComputedStyle(scroller);\n      var isFlex = cs.display === 'flex' && /auto|scroll/.test(cs.overflowX);\n      var isGrid = /grid/.test(cs.display) && /auto|scroll/.test(cs.overflowX);\n      if (!isFlex && !isGrid) return false;\n      // Only treat as a scroller if it actually overflows. Story-panels &\n      // lineup on desktop are display:grid (no overflow-x) \u2014 this second\n      // check is belt-and-suspenders for any future layout that keeps\n      // overflow-x:auto but has no actual overflow.\n      return scroller.scrollWidth > scroller.clientWidth + 1;\n    }\n\n    function teardownCarousel(scroller, linesContainer) {\n      if (!scroller || scroller.dataset.carouselState !== 'active') return;\n      // Remove all cloned children (lead + trail).\n      var clones = scroller.querySelectorAll('[data-hy-clone]');\n      clones.forEach(function (c) { c.parentNode && c.parentNode.removeChild(c); });\n      // Invoke stored teardown (unwires scroll/arrow listeners).\n      if (typeof scroller._hyCarouselTeardown === 'function') {\n        try { scroller._hyCarouselTeardown(); } catch (e) { /* noop */ }\n        scroller._hyCarouselTeardown = null;\n      }\n      // Clear lines container + state flags.\n      if (linesContainer) {\n        linesContainer.innerHTML = '';\n        linesContainer.style.display = 'none';\n      }\n      scroller.dataset.carouselState = 'inactive';\n      delete scroller.dataset.hyCarouselInit;\n      scroller.style.visibility = '';\n      scroller.style.scrollBehavior = '';\n      // Reset scroll position so the static grid doesn't render scrolled off.\n      scroller.scrollLeft = 0;\n    }\n\n    function setupCarousel(config) {\n      var scroller = config.scroller;\n      var linesContainer = config.lines;\n      var navs = config.navs || [];\n      if (!scroller) return;\n\n      // Register once so resize re-evaluation can reach this carousel.\n      if (!scroller.dataset.hyCarouselRegistered) {\n        scroller.dataset.hyCarouselRegistered = '1';\n        carousels.push({ scroller: scroller, config: config });\n      }\n\n      // Bail if already active (e.g. second call for ingredient track after\n      // JS-rendered cards populate).\n      if (scroller.dataset.carouselState === 'active') return;\n\n      // LAYOUT GUARD: only proceed if currently an overflowing scroller.\n      // On desktop for story-panels / lineup, this is false \u2192 no DOM mutations,\n      // no listeners, clean grid renders.\n      if (!isHorizontalScroller(scroller)) {\n        if (linesContainer) { linesContainer.innerHTML = ''; linesContainer.style.display = 'none'; }\n        scroller.dataset.carouselState = 'inactive';\n        return;\n      }\n\n      var originalKids = Array.from(scroller.children).filter(function (c) {\n        // Skip leftover clones (defensive \u2014 teardown should remove them).\n        if (c.dataset && c.dataset.hyClone) return false;\n        // Skip decorative/hidden children (e.g. the story-panel connector,\n        // which is display:none on mobile but still a flex child). Without\n        // this filter they get counted as cards, which throws off n, step,\n        // line-indicator count, and the modIdx mapping.\n        if (c.getBoundingClientRect().width <= 0) return false;\n        return true;\n      });\n      if (originalKids.length < 2) {\n        if (linesContainer) renderLines(linesContainer, originalKids.length, 0, null);\n        scroller.dataset.carouselState = 'inactive';\n        return;\n      }\n\n      scroller.dataset.hyCarouselInit = '1';\n      scroller.dataset.carouselState = 'active';\n      var n = originalKids.length;\n\n      // Tag each original with its target indicator index so updateActive\n      // can read it directly off the card (or its clone) instead of relying\n      // on `bestIdx % n`, which is wrong when non-card children sit in the\n      // flex flow (connector etc.).\n      originalKids.forEach(function (k, idx) { k.dataset.hyIdx = String(idx); });\n\n      // Clone full set before AND after originals: [clones | originals | clones]\n      var leadFrag = document.createDocumentFragment();\n      var trailFrag = document.createDocumentFragment();\n      originalKids.forEach(function (k) {\n        var srcIdx = k.dataset.hyIdx;\n        var leadClone = k.cloneNode(true);\n        leadClone.setAttribute('aria-hidden', 'true');\n        leadClone.dataset.hyClone = 'lead';\n        leadClone.dataset.hyIdx = srcIdx;\n        leadFrag.appendChild(leadClone);\n        var trailClone = k.cloneNode(true);\n        trailClone.setAttribute('aria-hidden', 'true');\n        trailClone.dataset.hyClone = 'trail';\n        trailClone.dataset.hyIdx = srcIdx;\n        trailFrag.appendChild(trailClone);\n      });\n      scroller.insertBefore(leadFrag, originalKids[0]);\n      scroller.appendChild(trailFrag);\n\n      // Compute step: average width of originals + gap.\n      function step() {\n        var ref = originalKids[0];\n        if (!ref) return 0;\n        var r = ref.getBoundingClientRect();\n        var cs = getComputedStyle(scroller);\n        var gap = parseFloat(cs.columnGap || cs.gap || '0') || 0;\n        return r.width + gap;\n      }\n\n      // Initial position: start of the ORIGINALS zone.\n      scroller.style.visibility = 'hidden';\n      function initPos() {\n        var s = step();\n        scroller.style.scrollBehavior = 'auto';\n        scroller.scrollLeft = s * n;\n        requestAnimationFrame(function () {\n          scroller.style.scrollBehavior = '';\n          scroller.style.visibility = '';\n        });\n        updateActive();\n      }\n      requestAnimationFrame(function () { requestAnimationFrame(initPos); });\n\n      // Silent reposition when user has scrolled into clone zones AND is idle.\n      var scrollEndT = null;\n      function maybeReposition() {\n        var s = step();\n        if (s <= 0) return;\n        var width = s * n;\n        var leadEnd = s * n;\n        var trailStart = s * (2 * n);\n        var sl = scroller.scrollLeft;\n        if (sl >= trailStart) {\n          scroller.style.scrollBehavior = 'auto';\n          scroller.scrollLeft = sl - width;\n          requestAnimationFrame(function () { scroller.style.scrollBehavior = ''; });\n        } else if (sl < leadEnd - 1) {\n          scroller.style.scrollBehavior = 'auto';\n          scroller.scrollLeft = sl + width;\n          requestAnimationFrame(function () { scroller.style.scrollBehavior = ''; });\n        }\n      }\n\n      // Active-index tracking for line indicators.\n      // Round 12 fix: branch on scroll-snap-align. Previous code assumed center-snap\n      // for all scrollers, but the lineup uses start-snap \u2014 detection was off by one.\n      var currentActive = 0;\n      function updateActive() {\n        var cards = scroller.children;\n        if (!cards || !cards.length) return;\n        var sRect = scroller.getBoundingClientRect();\n        // Use an actual card (originalKids[0]) to read snap-align \u2014 cards[0]\n        // can be a non-card decorative element with different snap behavior.\n        var snapAlign = (originalKids[0] && getComputedStyle(originalKids[0]).scrollSnapAlign) || 'start';\n        var isCenter = snapAlign.indexOf('center') !== -1;\n        var referencePoint = isCenter ? sRect.left + sRect.width / 2 : sRect.left + 1; // small +1 bias so edge case doesn't double-count\n        var bestCard = null;\n        var bestDist = Infinity;\n        for (var i = 0; i < cards.length; i++) {\n          var card = cards[i];\n          // Only consider tagged cards \u2014 skips connector and other decoration.\n          if (!card.dataset || card.dataset.hyIdx == null || card.dataset.hyIdx === '') continue;\n          var cr = card.getBoundingClientRect();\n          if (cr.width <= 0) continue;\n          var cardPoint = isCenter ? cr.left + cr.width / 2 : cr.left;\n          var d = Math.abs(cardPoint - referencePoint);\n          if (d < bestDist) { bestDist = d; bestCard = card; }\n        }\n        if (!bestCard) return;\n        var modIdx = parseInt(bestCard.dataset.hyIdx, 10) || 0;\n        if (modIdx !== currentActive) {\n          currentActive = modIdx;\n          if (linesContainer) setActiveLine(linesContainer, modIdx);\n          scroller.dataset.hyActive = String(modIdx);\n        }\n      }\n\n      // Scroll handler (scoped so teardown can unwire).\n      function onScroll() {\n        updateActive();\n        clearTimeout(scrollEndT);\n        scrollEndT = setTimeout(maybeReposition, 140);\n      }\n      scroller.addEventListener('scroll', onScroll, { passive: true });\n\n      // Arrow/nav click handlers (scoped for teardown).\n      var navHandlers = [];\n      navs.forEach(function (btn) {\n        var h = function () {\n          var s = step();\n          if (s <= 0) return;\n          var dir = btn.dataset.dir === 'next' ? 1 : -1;\n          scroller.scrollBy({ left: dir * s, behavior: 'smooth' });\n        };\n        btn.addEventListener('click', h);\n        navHandlers.push({ btn: btn, handler: h });\n      });\n\n      // Build line indicators.\n      if (linesContainer) {\n        renderLines(linesContainer, n, 0, function (idx) {\n          var s = step();\n          if (s <= 0) return;\n          scroller.scrollTo({ left: s * (n + idx), behavior: 'smooth' });\n        });\n      }\n\n      // Stash teardown closure so teardownCarousel can unwire listeners.\n      scroller._hyCarouselTeardown = function () {\n        scroller.removeEventListener('scroll', onScroll);\n        navHandlers.forEach(function (nh) { nh.btn.removeEventListener('click', nh.handler); });\n        clearTimeout(scrollEndT);\n      };\n    }\n\n    // Debounced window resize \u2192 re-evaluate every registered carousel.\n    // mobile \u2192 desktop: layout no longer scrolls \u2192 tear down clones/listeners.\n    // desktop \u2192 mobile: layout becomes scroller \u2192 set up clones/listeners.\n    // Same-state resize within active scroller: re-center on active card.\n    var resizeT = null;\n    window.addEventListener('resize', function () {\n      clearTimeout(resizeT);\n      resizeT = setTimeout(function () {\n        carousels.forEach(function (entry) {\n          var sc = entry.scroller;\n          var cfg = entry.config;\n          var shouldBeActive = isHorizontalScroller(sc);\n          var isActive = sc.dataset.carouselState === 'active';\n          if (shouldBeActive && !isActive) {\n            // Was static grid, now a scroller \u2192 set up.\n            setupCarousel(cfg);\n          } else if (!shouldBeActive && isActive) {\n            // Was a scroller, now static grid \u2192 tear down completely.\n            teardownCarousel(sc, cfg.lines);\n          } else if (shouldBeActive && isActive) {\n            // Stayed active \u2014 re-center scroll position on current active card.\n            var kids = Array.from(sc.children).filter(function (c) {\n              if (c.dataset && c.dataset.hyClone) return false;\n              if (c.getBoundingClientRect().width <= 0) return false;\n              return true;\n            });\n            var n = kids.length;\n            if (!n) return;\n            var ref = kids[0];\n            var r = ref.getBoundingClientRect();\n            var cs = getComputedStyle(sc);\n            var gap = parseFloat(cs.columnGap || cs.gap || '0') || 0;\n            var s = r.width + gap;\n            if (s <= 0) return;\n            var active = parseInt(sc.dataset.hyActive || '0', 10) || 0;\n            sc.style.scrollBehavior = 'auto';\n            sc.scrollLeft = s * (n + active);\n            requestAnimationFrame(function () { sc.style.scrollBehavior = ''; });\n          }\n        });\n      }, 150);\n    });\n\n    function renderLines(container, count, active, onClick) {\n      if (!container) return;\n      // Clear existing\n      container.innerHTML = '';\n      if (!count || count < 1) return;\n      // Hide the indicator strip entirely if there's only one slide.\n      if (count < 2) { container.style.display = 'none'; return; }\n      container.style.display = '';\n      for (var i = 0; i < count; i++) {\n        var btn = document.createElement('button');\n        btn.type = 'button';\n        btn.className = 'hy-pdp-scroll-line' + (i === active ? ' is-active' : '');\n        btn.setAttribute('role', 'tab');\n        btn.setAttribute('aria-selected', i === active ? 'true' : 'false');\n        btn.setAttribute('aria-label', 'Go to slide ' + (i + 1));\n        btn.dataset.idx = String(i);\n        if (typeof onClick === 'function') {\n          (function (idx) {\n            btn.addEventListener('click', function () { onClick(idx); });\n          })(i);\n        }\n        container.appendChild(btn);\n      }\n    }\n    function setActiveLine(container, activeIdx) {\n      if (!container) return;\n      var lines = container.querySelectorAll('.hy-pdp-scroll-line');\n      lines.forEach(function (ln, i) {\n        var on = i === activeIdx;\n        ln.classList.toggle('is-active', on);\n        ln.setAttribute('aria-selected', on ? 'true' : 'false');\n      });\n    }\n\n    // ----- Reviews carousel (all viewports) -----\n    var reviewsStage = pdp.querySelector('.hy-pdp-reviews-v4-stage');\n    if (reviewsStage) {\n      setupCarousel({\n        scroller: pdp.querySelector('#hy-pdp-reviews-v4-track'),\n        lines: pdp.querySelector('.hy-pdp-reviews-v4-lines'),\n        navs: Array.prototype.slice.call(reviewsStage.querySelectorAll('.hy-pdp-reviews-v4-nav'))\n      });\n      // Keyboard arrows on the stage (parity with round 6)\n      reviewsStage.setAttribute('tabindex', '0');\n      reviewsStage.addEventListener('keydown', function (e) {\n        var track = reviewsStage.querySelector('#hy-pdp-reviews-v4-track');\n        if (!track) return;\n        var first = track.querySelector(':scope > *');\n        if (!first) return;\n        var cs = getComputedStyle(track);\n        var gap = parseFloat(cs.columnGap || cs.gap || '0') || 0;\n        var s = first.getBoundingClientRect().width + gap;\n        if (e.key === 'ArrowLeft') { track.scrollBy({ left: -s, behavior: 'smooth' }); e.preventDefault(); }\n        else if (e.key === 'ArrowRight') { track.scrollBy({ left: s, behavior: 'smooth' }); e.preventDefault(); }\n      });\n    }\n\n    // ----- Mechanism story panels -----\n    // Sol PDP-R2 P8 \u2014 story scroller now rides the HOMEPAGE scroller (.hy-pdp-story-wrap = .hy-lineup-scroller,\n    // .hy-pdp-story-panels = .hy-lineup-v3) driven by initScroller + the single injected progress bar. The bespoke\n    // setupCarousel (infinite clones + line indicators) is retired here.\n\n    // ----- Ingredients scroller (both mobile + desktop; arrows on desktop) -----\n    // NOTE: ingredient cards are rendered by JS earlier in this IIFE. By the time\n    // we reach here they exist in the DOM, so setupCarousel can proceed.\n    // Sol PDP-R2 P10 \u2014 ingredients scroller now uses the HOMEPAGE scroller (.hy-lineup-scroller > .hy-lineup-v3,\n    // driven by initScroller + the single injected .hy-scroll-progress bar). The bespoke setupCarousel (infinite\n    // clones + line indicators) is retired here \u2014 it was the second progress indicator Sol flagged.\n\n    // ----- Full lineup grid (horizontal scroller all viewports; arrows on desktop only) -----\n    var recsWrap = pdp.querySelector('.hy-pdp-recs-wrap');\n    setupCarousel({\n      scroller: pdp.querySelector('.hy-pdp-recs-grid-v3'),\n      lines: pdp.querySelector('.hy-pdp-recs-lines'),\n      navs: recsWrap ? Array.prototype.slice.call(recsWrap.querySelectorAll('.hy-pdp-recs-nav')) : []\n    });\n  })();\n})();\n\n/* FYF sticky claim bar shim \u2014 keeps the special-offer email bar visible immediately on results load. */\n(function hyFyfStickyClaimShim(){\n  var raf=0;\n  var syncing=false;\n  function ensureCenteredStyles(){\n    if(document.getElementById('hy-fyf-sticky-claim-shim-css')) return;\n    var style=document.createElement('style');\n    style.id='hy-fyf-sticky-claim-shim-css';\n    style.textContent='.hy-ms-funnel-page .sticky-offer-bar .promo-email-field .btn{display:inline-flex!important;align-items:center!important;justify-content:center!important;text-align:center!important;line-height:1!important;box-sizing:border-box!important}.hy-ms-funnel-page #stickyPromoSubmitBtn::after,.hy-ms-funnel-page #promoSubmitBtn::after{align-items:center!important;justify-content:center!important;text-align:center!important}';\n    document.head.appendChild(style);\n  }\n  function isVariantB(root){return root&&root.getAttribute('data-ms-variant')==='b';}\n  function footerBlocking(bar){\n    var footer=document.querySelector('.shopify-section-group-footer-group, footer');\n    var barHeight=bar.getBoundingClientRect().height||94;\n    return !!(footer&&footer.getBoundingClientRect().top<=window.innerHeight-barHeight-10);\n  }\n  function sync(){\n    raf=0;\n    if(syncing) return;\n    var root=document.querySelector('.hy-ms-funnel-page');\n    var bar=document.getElementById('stickyOfferForm');\n    if(!root||!bar) return;\n    syncing=true;\n    try{\n      ensureCenteredStyles();\n      var visible=isVariantB(root)&&root.classList.contains('results-mode')&&root.classList.contains('locator-inline-active')&&!root.classList.contains('offer-claimed')&&!footerBlocking(bar);\n      if(visible){\n        if(bar.hidden) bar.hidden=false;\n        bar.classList.add('is-visible');\n      }else{\n        if(!bar.hidden) bar.hidden=true;\n        bar.classList.remove('is-visible');\n      }\n    }finally{\n      syncing=false;\n    }\n  }\n  function schedule(){if(!raf) raf=requestAnimationFrame(sync);}\n  function bind(){\n    var root=document.querySelector('.hy-ms-funnel-page');\n    if(!root||root.dataset.hyFyfStickyShimBound==='1') return;\n    root.dataset.hyFyfStickyShimBound='1';\n    ensureCenteredStyles();\n    var observer=new MutationObserver(schedule);\n    observer.observe(root,{attributes:true,attributeFilter:['class','data-ms-variant']});\n    var bar=document.getElementById('stickyOfferForm');\n    if(bar) observer.observe(bar,{attributes:true,attributeFilter:['hidden','class']});\n    window.addEventListener('scroll',schedule,{passive:true});\n    window.addEventListener('resize',schedule);\n    window.addEventListener('orientationchange',schedule);\n    document.addEventListener('click',function(){setTimeout(schedule,60);setTimeout(schedule,320);},true);\n    var ticks=0;\n    var timer=setInterval(function(){schedule();ticks+=1;if(ticks>40) clearInterval(timer);},150);\n    schedule();\n  }\n  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',bind,{once:true});\n  else bind();\n})();\n\n/* \u2500\u2500 V3 lineup horizontal scroller: drag-to-scroll (mouse) + glass arrow controls \u2500\u2500 */\n(function () {\n  function initScroller(scroller) {\n    if (!scroller || scroller.__hyScrollerInit) return;\n    if (getComputedStyle(scroller).display !== 'flex') return;   // skip grids (shop/collection) \u2014 drag/swipe is scroller-only\n    scroller.__hyScrollerInit = true;\n    var wrap = scroller.closest('.hy-lineup-scroller');\n    var prev = wrap && wrap.querySelector('.hy-lineup-arrow--prev');\n    var next = wrap && wrap.querySelector('.hy-lineup-arrow--next');\n\n    // Sol A1 (070626): scrollers are NATIVE now (overflow-x:auto + scroll-snap x mandatory in CSS) so\n    // touch gets the PDP-gallery feel: fling momentum + snap. This 1:1 drag handler is MOUSE-ONLY \u2014\n    // desktop cursor-drag \u2014 and .is-dragging disables snap while live so the follow doesn't fight it.\n    var down = false, startX = 0, startLeft = 0, moved = 0;\n    scroller.addEventListener('pointerdown', function (e) {\n      if (e.pointerType !== 'mouse' || e.button !== 0) return;   // touch/pen = native scroll\n      down = true; moved = 0; startX = e.clientX; startLeft = scroller.scrollLeft;\n    });\n    scroller.addEventListener('pointermove', function (e) {\n      if (!down) return;\n      var dx = e.clientX - startX;\n      if (Math.abs(dx) > 3) scroller.classList.add('is-dragging');\n      moved = Math.max(moved, Math.abs(dx));\n      scroller.scrollLeft = startLeft - dx;\n    });\n    function endDrag() {\n      if (!down) return;\n      down = false;\n      scroller.classList.remove('is-dragging');\n      if (moved > 4) snapNearest();   // V3 061826b \u2014 snap to nearest card on release\n    }\n    function snapNearest() {\n      var cards = [].slice.call(scroller.children);   // any scroller's direct items (cards/slots)\n      if (!cards.length) return;\n      var sLeft = scroller.getBoundingClientRect().left;\n      var best = null, bestD = Infinity;\n      cards.forEach(function (c) {\n        var d = Math.abs(c.getBoundingClientRect().left - sLeft);\n        if (d < bestD) { bestD = d; best = c; }\n      });\n      if (best) scroller.scrollBy({ left: best.getBoundingClientRect().left - sLeft, behavior: 'smooth' });\n    }\n    scroller.addEventListener('pointerup', endDrag);\n    scroller.addEventListener('pointercancel', endDrag);\n    scroller.addEventListener('pointerleave', endDrag);\n    scroller.addEventListener('click', function (e) {\n      if (moved > 6) { e.stopPropagation(); e.preventDefault(); }\n      moved = 0;\n    }, true);\n\n    // Sol B17-P7b (062926) \u2014 arrows snap to the next/prev CARD boundary (left-aligned, same as the drag-release\n    // snapNearest), instead of scrollBy a fixed step from a possibly-unaligned position (which left cards off-center).\n    function snapToCard(dir) {\n      var cards = [].slice.call(scroller.children);\n      if (!cards.length) return;\n      var sLeft = scroller.getBoundingClientRect().left;\n      var nearestIdx = 0, bestD = Infinity;\n      cards.forEach(function (c, i) { var d = Math.abs(c.getBoundingClientRect().left - sLeft); if (d < bestD) { bestD = d; nearestIdx = i; } });\n      var targetIdx = Math.max(0, Math.min(cards.length - 1, nearestIdx + dir));\n      scroller.scrollBy({ left: cards[targetIdx].getBoundingClientRect().left - sLeft, behavior: 'smooth' });\n    }\n    if (prev) prev.addEventListener('click', function () { snapToCard(-1); });\n    if (next) next.addEventListener('click', function () { snapToCard(1); });\n\n    function updateArrows() {\n      var max = scroller.scrollWidth - scroller.clientWidth - 2;\n      if (prev) prev.classList.toggle('is-hidden', scroller.scrollLeft <= 2);\n      if (next) next.classList.toggle('is-hidden', scroller.scrollLeft >= max);\n    }\n    scroller.addEventListener('scroll', updateArrows, { passive: true });\n    window.addEventListener('resize', updateArrows);\n    updateArrows();\n\n    initSwipeAffordance(wrap, scroller);\n  }\n\n  // Sol A2 (070626) \u2014 ONE affordance machine, ALL pointers: the glass \"SWIPE\" circle sits in the\n  // next-arrow slot on every scroller (desktop included \u2014 the old fine-pointer bail is gone). The\n  // FIRST drag/scroll fades the circle and sets .hy-arrows-live \u2192 desktop arrows appear in the same\n  // slot; mobile arrows stay display:none \u2264768 so a phone only ever sees the circle \u2192 dots.\n  function initSwipeAffordance(wrap, scroller) {\n    if (!wrap || wrap.__hySwipeInit) return;\n    wrap.__hySwipeInit = true;\n    var hint = document.createElement('div');\n    hint.className = 'hy-swipe-hint';\n    hint.setAttribute('aria-hidden', 'true');\n    hint.innerHTML = '<span>SWIPE</span>';\n    wrap.appendChild(hint);\n    var swiped = false;\n    // Non-overflowing rows (wide desktop, few cards) get no circle \u2014 nothing to swipe.\n    function syncHint() {\n      if (swiped) return;\n      hint.classList.toggle('is-gone', scroller.scrollWidth <= scroller.clientWidth + 4);\n    }\n    window.addEventListener('resize', syncHint, { passive: true });\n    syncHint();\n    (window.hySwipeHintSyncs = window.hySwipeHintSyncs || []).push(syncHint);   // re-synced by the dot module's rescan (hidden-at-load scrollers, e.g. DTC results tail)\n    var onSwipe = function () {\n      if (swiped) return;\n      swiped = true;\n      hint.classList.add('is-gone');          // swipe circle goes away\n      wrap.classList.add('hy-arrows-live');    // edge arrows appear in its place\n      scroller.removeEventListener('scroll', onSwipe);\n      setTimeout(function () { if (hint.parentNode) hint.parentNode.removeChild(hint); }, 450);\n    };\n    scroller.addEventListener('scroll', onSwipe, { passive: true });\n  }\n  function boot() { document.querySelectorAll('.hy-lineup-v3').forEach(initScroller); }\n  if (document.readyState !== 'loading') boot();\n  else document.addEventListener('DOMContentLoaded', boot);\n})();\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   V3 LINEUP FLIP CARD \u2014 replaces the old quick-shop modal.\n   Clicking \"Buy [name]\" flips a lineup card in place (CSS 3D rotateY).\n   The back face shows pack pills (Single / 3-Pack / 25-Pack), an Add-to-Cart\n   button, and a PDP link. Pack data + meta come from window.hytzV2Products /\n   window.hytzV2Meta (emitted by sections/hytz-v2-modal.liquid \u2014 the SSOT).\n   Add-to-cart POSTs to /cart/add.js then calls window.hytzRefreshCart().\n   Self-contained: closes cleanly, guards all DOM access against null.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n(function () {\n  var PACK_ORDER = [\n    { key: 'single',    label: 'Single' },\n    { key: 'three',     label: '3-Pack' },\n    { key: 'dispenser', label: '25-Pack' }\n  ];\n\n  function products() { return window.hytzV2Products || {}; }\n  function metas() { return window.hytzV2Meta || {}; }\n\n  // Build the pack pills + wire the back face for a given flip card.\n  function populateBack(flip) {\n    if (flip.__hyBackReady) return;   // populate once; cheap idempotency\n    var handle = flip.getAttribute('data-handle');\n    var p = products()[handle];\n    var meta = metas()[handle];\n    if (!p || !meta) return;          // no SSOT data \u2192 leave Liquid fallback copy in place\n    flip.__hyBackReady = true;\n\n    var descEl = flip.querySelector('[data-back-desc]');\n    if (descEl) descEl.textContent = meta.desc || '';\n    var nameEl = flip.querySelector('[data-back-name]');\n    if (nameEl) nameEl.textContent = meta.name || '';\n    var subEl = flip.querySelector('[data-back-substance]');\n    if (subEl) subEl.textContent = meta.substance || '';\n\n    var packsWrap = flip.querySelector('[data-back-packs]');\n    if (!packsWrap) return;\n    packsWrap.innerHTML = '';\n    var available = [];\n    PACK_ORDER.forEach(function (pk) {\n      var v = p.variants && p.variants[pk.key];\n      if (!v || !v.id) return;        // only render packs that have a live variant\n      available.push(pk.key);\n      var btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'hy-lineup-pack';\n      btn.dataset.size = pk.key;\n      btn.dataset.variantId = v.id;\n      btn.dataset.price = v.price;\n      if (pk.key === 'three') btn.classList.add('hy-lineup-pack--popular');\n      // Sol 062426 R7 \u2014 size + an INLINE \"Popular\" badge grouped on the left (was a floating top-right badge); price on the right.\n      var leftHtml = '<span class=\"hy-lineup-pack-size\">' + pk.label + '</span>';\n      if (pk.key === 'three') leftHtml += '<span class=\"hy-lineup-pack-pop\">Popular</span>';\n      btn.innerHTML = '<span class=\"hy-lineup-pack-left\">' + leftHtml + '</span><span class=\"hy-lineup-pack-price\">' + v.price + '</span>';\n      packsWrap.appendChild(btn);\n    });\n\n    // Default selection: 3-pack if it exists, else first available.\n    var defaultKey = available.indexOf('single') !== -1 ? 'single' : available[0];\n    selectPack(flip, defaultKey);\n  }\n\n  function selectPack(flip, key) {\n    if (!key) return;\n    var p = products()[flip.getAttribute('data-handle')];\n    flip.querySelectorAll('.hy-lineup-pack').forEach(function (b) {\n      b.classList.toggle('is-selected', b.dataset.size === key);\n    });\n    // Swap the back thumbnail to match the pack (single/three/dispenser).\n    var img = flip.querySelector('[data-back-img]');\n    if (img && p && p.images && p.images[key]) {\n      var url = p.images[key];\n      if (img.src.indexOf(url) === -1) {\n        var next = new Image();\n        next.onload = function () { img.src = url; };\n        next.src = url;\n      }\n    }\n    // Update the ATC button price.\n    var selected = flip.querySelector('.hy-lineup-pack.is-selected');\n    var priceEl = flip.querySelector('[data-back-atc-price]');\n    if (priceEl && selected) priceEl.textContent = selected.dataset.price || '';\n  }\n\n  function flipOpen(flip) {\n    if (!flip || flip.classList.contains('is-flipped')) return;\n    var other = document.querySelector('.hy-lineup-flip.is-flipped');   // only one open at a time\n    if (other && other !== flip) flipClose(other, true);   // R11-SHOP2 \u2014 close the previous one immediately (a new sheet is opening; no delayed teardown)\n    populateBack(flip);\n    var back = flip.querySelector('.hy-flip-back');\n    var front = flip.querySelector('.hy-flip-front');\n    // Sol 062026 \u2014 BULLETPROOF slide-up. The rAF approach left it stuck-until-mouse-move; this drives\n    // the transform inline with a forced reflow so the browser ALWAYS animates 101%\u21920:\n    //   transition:none + start state \u2192 reflow (commit it, no animation) \u2192 restore transition + end state.\n    if (back) {\n      back.style.transition = 'none';\n      back.style.transform = 'translateY(101%)';\n      void back.offsetHeight;            // commit the tucked start state with no transition\n      back.style.transition = '';        // restore the CSS 0.5s transition\n      back.style.transform = 'translateY(0)';\n      back.setAttribute('aria-hidden', 'false');\n    }\n    flip.classList.add('is-flipped');    // after the start state is pinned \u2014 for pointer-events/state\n    if (front) front.setAttribute('aria-hidden', 'true');\n    // Sol B5-SHOP-1: on the shop grid (\u2264900px) the back face is a fixed BOTTOM SHEET \u2192 dim + lock the page.\n    if (flip.closest('.hy-collection-grid--v3') && window.matchMedia('(max-width: 900px)').matches) {\n      document.body.classList.add('hy-sheet-open');\n      if (window.hyLockBodyScroll) window.hyLockBodyScroll('sheet');\n    }\n  }\n\n  function flipClose(flip, immediate) {\n    if (!flip || !flip.classList.contains('is-flipped')) return;\n    var back = flip.querySelector('.hy-flip-back');\n    var front = flip.querySelector('.hy-flip-front');\n    // Sol R11-SHOP2 (063026) \u2014 on mobile the back is a FIXED bottom sheet: `position:fixed` lives on\n    // `.is-flipped .hy-flip-back`. Removing is-flipped IMMEDIATELY (as before) reverted the back to its\n    // in-card position MID-slide \u2192 a SECOND animation (\"two things sliding down at once\"). Fix: slide the\n    // sheet down FIRST (keep is-flipped so it stays fixed), then drop is-flipped + the backdrop AFTER the\n    // transition so the in-card revert happens off-screen. Desktop in-card flip = immediate (no sheet).\n    if (back) { back.style.transition = ''; back.style.transform = 'translateY(101%)'; back.setAttribute('aria-hidden', 'true'); }  // slide down (still fixed/flipped)\n    if (front) front.setAttribute('aria-hidden', 'false');\n    var isSheet = document.body.classList.contains('hy-sheet-open');\n    var done = false;\n    var finish = function () {\n      if (done) return; done = true;\n      if (back) back.removeEventListener('transitionend', onEnd);\n      flip.classList.remove('is-flipped');\n      if (document.body.classList.contains('hy-sheet-open')) {\n        document.body.classList.remove('hy-sheet-open');\n        if (window.hyUnlockBodyScroll) window.hyUnlockBodyScroll('sheet');\n      }\n    };\n    var onEnd = function (e) { if (!e || e.propertyName === 'transform') finish(); };\n    if (isSheet && back && !immediate) {\n      back.addEventListener('transitionend', onEnd);\n      setTimeout(finish, 650);   // fallback (reduced-motion / interrupted transition)\n    } else {\n      finish();   // desktop in-card flip, no sheet, or forced-immediate (a new sheet is opening)\n    }\n    // FABLE IMP-109 (070626) \u2014 keyboard users get focus returned to the card's Buy control (not dropped\n    // to <body>); pointer users keep the old blur so :focus-within releases and the hover Buy affordance\n    // hides on mouse-out (the original rationale, preserved).\n    if (flip.contains(document.activeElement)) {\n      var hyKb = false;\n      try { hyKb = document.activeElement.matches(':focus-visible'); } catch (err) {}\n      var hyBuy = flip.querySelector('.hy-lineup-buy');\n      if (hyKb && hyBuy && hyBuy.focus) hyBuy.focus({ preventScroll: true });\n      else if (document.activeElement.blur) document.activeElement.blur();\n    }\n  }\n\n  function addToCart(flip, variantId, btn) {\n    var msg = flip.querySelector('[data-back-msg]');\n    var label = flip.querySelector('[data-back-atc-label]');\n    var prevLabel = label ? label.textContent : '';\n    btn.disabled = true;\n    btn.style.opacity = '0.6';\n    if (label) label.textContent = 'Adding\u2026';\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ items: [{ id: parseInt(variantId, 10), quantity: 1 }] })\n    })\n      .then(function (r) { return r.json(); })\n      .then(function (data) {\n        btn.disabled = false;\n        btn.style.opacity = '';\n        if (label) label.textContent = prevLabel || 'Add to Cart';\n        if (data && data.status) {\n          if (msg) { msg.textContent = (data.description || 'Could not add'); msg.classList.add('is-visible', 'is-error'); setTimeout(function () { msg.classList.remove('is-visible', 'is-error'); }, 2400); }\n          return;\n        }\n        if (typeof window.hytzMetaTrackAddToCart === 'function') {\n          window.hytzMetaTrackAddToCart({\n            variantId: variantId,\n            quantity: 1,\n            response: data,\n            handle: flip.getAttribute('data-handle'),\n            source: 'hytz-v2-lineup-flip',\n            buttonTag: 'lineup_flip_add_to_cart'\n          });\n        }\n        if (msg) { msg.textContent = 'Added to cart'; msg.classList.add('is-visible', 'is-success'); setTimeout(function () { msg.classList.remove('is-visible', 'is-success'); }, 2200); }\n        if (typeof window.hytzRefreshCart === 'function') {\n          window.hytzRefreshCart();\n        }\n        // On the cart page itself, line items are Liquid-rendered \u2192 reload to reflect.\n        if (/^\\/cart\\/?$/.test(window.location.pathname)) {\n          setTimeout(function () { window.location.reload(); }, 700);\n          return;\n        }\n        setTimeout(function () {\n          flipClose(flip);\n          if (typeof window.hytzOpenCart === 'function') window.hytzOpenCart();\n        }, 500);\n      })\n      .catch(function () {\n        btn.disabled = false;\n        btn.style.opacity = '';\n        if (label) label.textContent = prevLabel || 'Add to Cart';\n        if (msg) { msg.textContent = 'Could not add'; msg.classList.add('is-visible', 'is-error'); setTimeout(function () { msg.classList.remove('is-visible', 'is-error'); }, 2400); }\n      });\n  }\n\n  // Delegated click handling for all flip cards on the page.\n  document.addEventListener('click', function (e) {\n    // Ignore clicks that are really the tail of a drag on the scroller.\n    var scroller = e.target.closest('.hy-lineup-v3');\n    if (scroller && scroller.classList.contains('is-dragging')) return;\n\n    var flip = e.target.closest('.hy-lineup-flip');\n    // Click outside the open card (anywhere not the open card itself) closes its modal.\n    var openFlip = document.querySelector('.hy-lineup-flip.is-flipped');\n    if (openFlip && flip !== openFlip) flipClose(openFlip);\n    if (!flip) return;\n\n    // PDP link \u2192 let it navigate.\n    if (e.target.closest('[data-back-pdp]')) return;\n\n    // Flip back control.\n    if (e.target.closest('.hy-flip-close')) {\n      e.preventDefault();\n      flipClose(flip);\n      return;\n    }\n\n    // Pack pill select.\n    var pack = e.target.closest('.hy-lineup-pack');\n    if (pack) {\n      e.preventDefault();\n      selectPack(flip, pack.dataset.size);\n      return;\n    }\n\n    // Add to cart.\n    var atc = e.target.closest('[data-back-atc]');\n    if (atc) {\n      e.preventDefault();\n      var selected = flip.querySelector('.hy-lineup-pack.is-selected');\n      if (selected && selected.dataset.variantId) addToCart(flip, selected.dataset.variantId, atc);\n      return;\n    }\n\n    // Buy affordance on the front \u2192 flip the card.\n    if (e.target.closest('.hy-lineup-buy')) {\n      e.preventDefault();\n      e.stopPropagation();\n      flipOpen(flip);\n      return;\n    }\n\n    // Click anywhere else on the (un-flipped) front \u2192 go to the product page.\n    if (!flip.classList.contains('is-flipped')) {\n      var pdpLink = flip.querySelector('[data-back-pdp]');\n      var href = pdpLink ? pdpLink.getAttribute('href') : ('/products/' + flip.getAttribute('data-handle'));\n      if (href) window.location.href = href;\n    }\n  });\n\n  // Escape flips the open card back.\n  document.addEventListener('keydown', function (e) {\n    if (e.key !== 'Escape') return;\n    var open = document.querySelector('.hy-lineup-flip.is-flipped');\n    if (open) flipClose(open);\n  });\n})();\n\n/* \u2550\u2550\u2550 Sol 062426 B6-G7 \u2014 preload lazy images BEFORE they enter the viewport \u2550\u2550\u2550\n   Customers were seeing content \"flash in\" as they scrolled to it. Native loading=\"lazy\" only fetches\n   when the image is near the viewport; this promotes each lazy <img> to eager once it's within ~1200px\n   of the viewport, so it's already decoded by the time it scrolls into view. Falls back to a one-shot\n   eager promotion if IntersectionObserver is missing. */\n(function () {\n  function promote(img) { img.loading = 'eager'; if (img.dataset.hySrc && !img.src) img.src = img.dataset.hySrc; }\n  function init() {\n    var lazies = [].slice.call(document.querySelectorAll('img[loading=\"lazy\"]'));\n    if (!lazies.length) return;\n    if (!('IntersectionObserver' in window)) { lazies.forEach(promote); return; }\n    var io = new IntersectionObserver(function (entries, obs) {\n      entries.forEach(function (en) { if (en.isIntersecting) { promote(en.target); obs.unobserve(en.target); } });\n    }, { rootMargin: '1200px 0px' });\n    lazies.forEach(function (img) { io.observe(img); });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();\n})();\n\n/* \u2550\u2550\u2550 Sol 062426 B6-G1 \u2192 B3-2 \u2014 horizontal-scroller DOT indicator \u2550\u2550\u2550\n   Sol wants the PDP-gallery dot style used on EVERY horizontal carousel site-wide (was a thin progress bar).\n   One dot per item (closest item to the left edge = active, like the gallery), clickable to scroll to it.\n   Auto-skips scrollers that don't overflow. Generic: known scroller classes + any [data-hy-scroller].\n   (The auto-scroll reviews marquee uses .hy-reviews-track and is NOT targeted here.) */\n(function () {\n  var SELECTORS = '.hy-lineup-v3, .hy-pdp-ingredients-track, .hy-cart-xsell-scroller, [data-hy-scroller]';\n  function realKids(track) {\n    return [].slice.call(track.children).filter(function (c) {\n      if (!c.classList || c.classList.contains('hy-scroll-dots')) return false;   // skip our own indicator\n      if (c.getAttribute && c.getAttribute('aria-hidden') === 'true') return false;  // skip clones / decorative\n      if (c.dataset && c.dataset.hyClone) return false;\n      return c.getBoundingClientRect().width > 0;\n    });\n  }\n  function build(track) {\n    if (track.dataset.hyDotsInit) return;\n    if (track.scrollWidth <= track.clientWidth + 4) return;   // no overflow \u2192 no indicator\n    var kids = realKids(track);\n    if (kids.length < 2) return;\n    track.dataset.hyDotsInit = '1';\n    var wrap = document.createElement('div');\n    wrap.className = 'hy-scroll-dots';\n    wrap.setAttribute('aria-hidden', 'true');\n    kids.forEach(function (kid) {\n      var d = document.createElement('button');\n      d.type = 'button';\n      d.className = 'hy-scroll-dot';\n      d.tabIndex = -1;\n      d.addEventListener('click', function () {\n        var delta = kid.getBoundingClientRect().left - track.getBoundingClientRect().left;\n        track.scrollTo({ left: track.scrollLeft + delta, behavior: 'smooth' });\n      });\n      wrap.appendChild(d);\n    });\n    track.insertAdjacentElement('afterend', wrap);\n    var dotEls = wrap.children;\n    var raf = null;\n    function update() {\n      raf = null;\n      var sLeft = track.getBoundingClientRect().left;\n      var best = 0, bestD = Infinity;\n      kids.forEach(function (kid, i) {\n        var d = Math.abs(kid.getBoundingClientRect().left - sLeft);\n        if (d < bestD) { bestD = d; best = i; }\n      });\n      for (var i = 0; i < dotEls.length; i++) dotEls[i].classList.toggle('is-active', i === best);\n    }\n    track.addEventListener('scroll', function () { if (!raf) raf = requestAnimationFrame(update); }, { passive: true });\n    window.addEventListener('resize', function () { if (!raf) raf = requestAnimationFrame(update); }, { passive: true });\n    update();\n  }\n  function init() {\n    [].slice.call(document.querySelectorAll(SELECTORS)).forEach(build);\n    // Sol A2 (070626) \u2014 re-sync the swipe-circle overflow checks on the same rescan paths (load /\n    // hyRescanScrollDots) so hidden-at-load scrollers get their circle once revealed.\n    if (window.hySwipeHintSyncs) window.hySwipeHintSyncs.forEach(function (f) { try { f(); } catch (e) {} });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();\n  // Re-scan after late content (Judge.me badges, images) can change scrollWidth.\n  window.addEventListener('load', init);\n  // Sol B2-15 \u2014 expose a re-scan hook. Scrollers inside a display:none slide (e.g. the FYF results\n  // tail) have zero width at load, so build() skips them without marking hyDotsInit. Callers can\n  // re-invoke this once the slide is revealed and the scroller finally overflows.\n  window.hyRescanScrollDots = init;\n})();\n\n/* \u2550\u2550\u2550 Sol 070926 \u2014 horizontal scrollers: images must already be there BEFORE the swipe \u2550\u2550\u2550\n   B6-G7 above promotes lazy images once they're within 1200px of the viewport, but its rootMargin is\n   '1200px 0px' \u2014 VERTICAL only. Cards parked to the RIGHT of a horizontal scroller sit outside the\n   viewport on the X axis, so they never intersect until the customer swipes them in; the fetch starts\n   at that moment and the image renders in late. That's the perceived lag (worst on the PDP gallery,\n   slides 2..N).\n   Fix: observe the scroller CONTAINER instead of each image. When the container nears the viewport\n   (vertically), promote EVERY lazy image inside it at once, regardless of horizontal position. Images\n   currently off-screen go at fetchpriority=low so they stream in behind the critical path and never\n   race the LCP image; decode() takes the decode off the paint path so the swipe is instant too.\n   MutationObserver picks up cards injected later (ingredients, recs, reviews). */\n(function () {\n  var SCROLLERS = '.hy-pdp-gallery-track, .hy-lineup-v3, .hy-pdp-ingredients-track, .hy-pdp-tl-stages,' +\n    ' .hy-pdp-recs-grid-v3, .hy-pdp-reviews-v4-track, .hy-cart-xsell-scroller, .hy-reviews-track,' +\n    ' .hy-byh-presets, [data-hy-scroller]';\n\n  function preload(img) {\n    if (img.dataset.hyPreloaded) return;\n    img.dataset.hyPreloaded = '1';\n    var r = img.getBoundingClientRect();\n    var vw = window.innerWidth || document.documentElement.clientWidth;\n    var offscreenX = r.right <= 0 || r.left >= vw;\n    if (offscreenX && 'fetchPriority' in img) img.fetchPriority = 'low';   // queued cards never outrank the LCP image\n    img.loading = 'eager';\n    if (img.dataset.hySrc && !img.src) img.src = img.dataset.hySrc;\n    if (img.decode) img.decode().catch(function () {});\n  }\n  function preloadAll(track) {\n    [].slice.call(track.querySelectorAll('img[loading=\"lazy\"]')).forEach(preload);\n  }\n  function watchInjected(track) {\n    if (track.dataset.hyPreloadWatch || !('MutationObserver' in window)) return;\n    track.dataset.hyPreloadWatch = '1';\n    new MutationObserver(function () { preloadAll(track); }).observe(track, { childList: true, subtree: true });\n  }\n  function arm(track) {\n    preloadAll(track);\n    watchInjected(track);\n  }\n  var io = ('IntersectionObserver' in window) ? new IntersectionObserver(function (entries, obs) {\n    entries.forEach(function (en) {\n      if (!en.isIntersecting) return;\n      obs.unobserve(en.target);\n      arm(en.target);\n    });\n  }, { rootMargin: '1200px 0px' }) : null;\n\n  function init() {\n    [].slice.call(document.querySelectorAll(SCROLLERS)).forEach(function (track) {\n      if (track.dataset.hyPreloadObs) return;\n      track.dataset.hyPreloadObs = '1';\n      if (io) io.observe(track); else arm(track);   // no IO \u2192 just load them\n    });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();\n  window.addEventListener('load', init);            // late-injected tracks (cart drawer, FYF tail)\n  // Chain the existing rescan hook so a revealed display:none scroller arms its images too.\n  var prevRescan = window.hyRescanScrollDots;\n  window.hyRescanScrollDots = function () { if (prevRescan) prevRescan(); init(); };\n  window.hyPreloadScrollers = init;\n})();\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   FREE-HYTZ \u2014 per-handle below-stats hydrator (B12-F8/F9, 2026-06-26).\n   The free-hytz page renders snippets/hytz-pdp-belowstats.liquid SIX times (one per SKU,\n   hidden) inside [data-hy-belowstats][data-handle] roots. The PDP's own .hy-pdp-scoped module\n   (above) never sees these (no .hy-pdp wrapper here), so this additive initializer runs the SAME\n   supplement-facts table, lab table, ingredient cards + interactive-timeline logic, scoped to each\n   per-handle root. On the PDP there are zero [data-hy-belowstats] elements \u2192 this is a no-op there.\n   Reads the same window.hytzPdpSuppFacts / window.hytzPdpIngredients maps the snippet ships.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n(function () {\n  var roots = document.querySelectorAll('[data-hy-belowstats]');\n  if (!roots.length) return;\n\n  function escHtml(s) {\n    if (s == null) return '';\n    return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n  }\n\n  function hydrateSuppAndLab(root, handle) {\n    if (!(window.hytzPdpSuppFacts && window.hytzPdpSuppFacts[handle])) return;\n    var data = window.hytzPdpSuppFacts[handle];\n    if (!data || !data.facts) return;\n    // Supplement-facts accordion table (lives in the buy-area, id is page-unique per handle).\n    var tbody = document.getElementById('hy-pdp-supp-tbody-' + handle);\n    if (tbody && !tbody.dataset.hyHydrated) {\n      var rows = '';\n      data.facts.forEach(function (f) {\n        rows += '<tr><td>' + escHtml(f.name) + '</td><td>' + escHtml(f.amount) + '</td><td>' + escHtml(f.dv) + '</td></tr>';\n      });\n      tbody.innerHTML = rows;\n      tbody.dataset.hyHydrated = '1';\n    }\n    // Label amounts and Daily Values in the shared belowstats table.\n    var labBody = document.getElementById('hy-pdp-lab-tbody-' + handle);\n    if (labBody && !labBody.dataset.hyHydrated) {\n      var labRows = '';\n      data.facts.forEach(function (f) {\n        labRows += '<tr><td>' + escHtml(f.name) + '</td><td>' + escHtml(f.amount) + '</td>' +\n          '<td>' + escHtml(f.dv || '*') + '</td></tr>';\n      });\n      labBody.innerHTML = labRows;\n      labBody.dataset.hyHydrated = '1';\n    }\n  }\n\n  function hydrateIngredients(root, handle) {\n    if (!(window.hytzPdpIngredients && window.hytzPdpIngredients[handle])) return;\n    var track = document.getElementById('hy-pdp-ingredients-track-' + handle);\n    var ingredients = window.hytzPdpIngredients[handle];\n    if (!track || track.dataset.hyHydrated || !ingredients || !ingredients.length) return;\n    var cardsHtml = '';\n    ingredients.forEach(function (ing) {\n      var placeholder = 'Ingredient image: ' + ing.name + ' \u2014 macro shot, product-color tinted';\n      var metaHtml = '';\n      if (ing.foundIn || ing.benefits) {\n        metaHtml = '<div class=\"hy-pdp-ingredient-meta\">';\n        if (ing.foundIn) {\n          metaHtml += '<div class=\"hy-pdp-ingredient-meta-row\">' +\n            '<span class=\"hy-pdp-ingredient-meta-label\">Found in</span>' +\n            '<span class=\"hy-pdp-ingredient-meta-value\">' + escHtml(ing.foundIn) + '</span></div>';\n        }\n        if (ing.benefits) {\n          metaHtml += '<div class=\"hy-pdp-ingredient-meta-row\">' +\n            '<span class=\"hy-pdp-ingredient-meta-label\">Benefits</span>' +\n            '<span class=\"hy-pdp-ingredient-meta-value\">' + escHtml(ing.benefits) + '</span></div>';\n        }\n        metaHtml += '</div>';\n      }\n      var slug = ing.image || '';\n      var imgHtml = '';\n      var imgClass = 'hy-pdp-ingredient-image';\n      if (slug && window.hytzAssetBase) {\n        imgHtml = '<img src=\"' + window.hytzAssetBase + 'ingredient-' + escHtml(slug) + '.webp\" alt=\"' + escHtml(ing.name) + '\" loading=\"lazy\">';\n        imgClass += ' hy-pdp-ingredient-image--has-img';\n      }\n      cardsHtml += '<article class=\"hy-pdp-ingredient-card\">' +\n        '<div class=\"' + imgClass + '\" data-placeholder=\"' + escHtml(placeholder) + '\" data-ingredient-slug=\"' + escHtml(slug) + '\">' + imgHtml + '</div>' +\n        '<div class=\"hy-pdp-ingredient-body\">' +\n          '<div class=\"hy-pdp-ingredient-role\">' + escHtml(ing.role) + '</div>' +\n          '<h3 class=\"hy-pdp-ingredient-name\">' + escHtml(ing.name) + '</h3>' +\n          '<div class=\"hy-pdp-ingredient-amount\">' + escHtml(ing.amount) + '</div>' +\n          '<p class=\"hy-pdp-ingredient-blurb\">' + escHtml(ing.blurb) + '</p>' +\n          metaHtml +\n        '</div></article>';\n    });\n    track.innerHTML = cardsHtml;\n    track.dataset.hyHydrated = '1';\n  }\n\n  function initTimeline(root) {\n    var tl = root.querySelector('[data-hy-timeline]');\n    if (!tl || tl.dataset.hyTlInit) return;\n    var tlTabs = Array.prototype.slice.call(tl.querySelectorAll('.hy-pdp-tl-stage'));\n    var tlPanels = Array.prototype.slice.call(tl.querySelectorAll('.hy-pdp-tl-panel'));\n    if (!tlTabs.length || tlTabs.length !== tlPanels.length) return;\n    tl.dataset.hyTlInit = '1';\n    function activateStage(idx) {\n      tlTabs.forEach(function (t, i) {\n        var on = i === idx;\n        t.classList.toggle('is-active', on);\n        t.setAttribute('aria-selected', on ? 'true' : 'false');\n        t.tabIndex = on ? 0 : -1;\n      });\n      tlPanels.forEach(function (p, i) {\n        var on = i === idx;\n        p.classList.toggle('is-active', on);\n        if (on) { p.removeAttribute('hidden'); } else { p.setAttribute('hidden', ''); }\n      });\n    }\n    tlTabs.forEach(function (tab, idx) {\n      tab.addEventListener('click', function () { activateStage(idx); });\n      tab.addEventListener('keydown', function (e) {\n        var dir = e.key === 'ArrowRight' ? 1 : (e.key === 'ArrowLeft' ? -1 : 0);\n        if (!dir) return;\n        e.preventDefault();\n        var next = (idx + dir + tlTabs.length) % tlTabs.length;\n        tlTabs[next].focus();\n        activateStage(next);\n      });\n    });\n    var stagesRow = tl.querySelector('.hy-pdp-tl-stages');\n    var tlIoHold = 0;   /* Sol A18 (070626) \u2014 mute the IO while a CLICK's smooth-scroll glides the strip: intermediate stages were re-activating mid-glide = the text-box flash/jitter */\n    if (stagesRow && 'IntersectionObserver' in window) {\n      var ratios = {};\n      var io = new IntersectionObserver(function (entries) {\n        if (window.matchMedia('(min-width: 769px)').matches) return;\n        if (Date.now() < tlIoHold) return;\n        entries.forEach(function (e) {\n          var i = tlTabs.indexOf(e.target);\n          if (i > -1) { ratios[i] = e.intersectionRatio; }\n        });\n        var bestIdx = -1, bestRatio = 0.5;\n        Object.keys(ratios).forEach(function (k) { if (ratios[k] > bestRatio) { bestRatio = ratios[k]; bestIdx = +k; } });\n        if (bestIdx > -1) { activateStage(bestIdx); }\n      }, { root: stagesRow, threshold: [0, 0.25, 0.5, 0.75, 1] });\n      tlTabs.forEach(function (t) { io.observe(t); });\n    }\n    /* Sol 070326 \u2014 MOBILE connector: point the drop line at the ACTIVE node wherever it sits (the node scrolls\n       in the strip; the line is on the static card) via measured --tl-drop-x/--tl-drop-h, so it ALWAYS connects\n       incl. the first stage (which can't scroll to center). Plus: click a stage \u2192 auto-scroll it to center. */\n    (function () {\n      if (!stagesRow) return;\n      var raf = 0;\n      function mob() { return window.matchMedia('(max-width: 768px)').matches; }\n      function sync() {\n        raf = 0;\n        if (!mob()) return;\n        var tab = tl.querySelector('.hy-pdp-tl-stage.is-active');\n        var panel = tl.querySelector('.hy-pdp-tl-panel.is-active');\n        if (!tab || !panel || panel.offsetParent === null) return;\n        var tr = tab.getBoundingClientRect(), pr = panel.getBoundingClientRect();\n        panel.style.setProperty('--tl-drop-x', ((tr.left + tr.width / 2) - pr.left) + 'px');\n        panel.style.setProperty('--tl-drop-h', Math.max(6, pr.top - (tr.bottom - 9)) + 'px');\n      }\n      function queue() { if (!raf) raf = requestAnimationFrame(sync); }\n      stagesRow.addEventListener('scroll', queue, { passive: true });\n      tlTabs.forEach(function (t) {\n        t.addEventListener('click', function () {\n          if (!mob()) return;\n          tlIoHold = Date.now() + 700;   /* Sol A18 \u2014 IO stays silent while this smooth-scroll settles */\n          stagesRow.scrollTo({ left: Math.max(0, t.offsetLeft - (stagesRow.clientWidth - t.offsetWidth) / 2), behavior: 'smooth' });\n          queue();\n        });\n      });\n      window.addEventListener('resize', queue, { passive: true });\n      queue();\n    })();\n  }\n\n  // hytzAssetBase may not be set if no PDP <script> ran; derive a fallback from any ingredient img base.\n  // (The belowstats <script> sets window.hytzAssetBase via the PDP data block; on free-hytz the first SKU's\n  //  block sets it. Guard anyway.)\n  function hydrateRoot(root) {\n    var handle = root.getAttribute('data-handle');\n    if (!handle) return;\n    hydrateSuppAndLab(root, handle);\n    hydrateIngredients(root, handle);\n    initTimeline(root);\n  }\n\n  function run() { Array.prototype.forEach.call(roots, hydrateRoot); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', run); else run();\n  // Re-run on load in case a SKU's data <script> parsed late.\n  window.addEventListener('load', run);\n  // Expose so the free-hytz section script can re-hydrate a freshly-revealed SKU root on demand.\n  window.hytzHydrateBelowStats = run;\n})();\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 BUILD YOUR HABITZ (070526) \u2014 preset-stack / mix bundle add.\n   Any element carrying data-hy-habitz-add=\"<comma-separated variant ids>\" adds all\n   those variants in ONE /cart/add.js call, fires Meta AddToCart per variant, then\n   refreshes + opens the drawer. The Appstle \"Build Your Habitz\" volume discount\n   (a Shopify discount function) auto-applies at 3+/6+ eligible packs (3-Packs + 25-Packs; Singles excluded \u2014 offer 52830 extended 070626) \u2014 no widget\n   needed. Optional data-hy-habitz-label overrides the analytics source tag; a child\n   [data-hy-habitz-btn-label] receives the \"Adding\u2026/Added \u2713\" text swap. \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n(function () {\n  function buildHabitz(ids, sourceEl) {\n    if (!ids || !ids.length) return;\n    var items = ids.map(function (id) { return { id: parseInt(id, 10), quantity: 1 }; });\n    var lbl = sourceEl ? (sourceEl.querySelector('[data-hy-habitz-btn-label]') || sourceEl) : null;\n    var prevText = lbl ? lbl.textContent : '';\n    if (sourceEl) { sourceEl.disabled = true; sourceEl.setAttribute('aria-busy', 'true'); if (lbl) lbl.textContent = 'Adding\u2026'; }\n    function restore(text) { if (sourceEl) { sourceEl.disabled = false; sourceEl.removeAttribute('aria-busy'); } if (lbl) lbl.textContent = text; }\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      credentials: 'same-origin',\n      body: JSON.stringify({ items: items })\n    })\n      .then(function (r) { return r.json(); })\n      .then(function (data) {\n        if (data && data.status) { restore(prevText || 'Add to cart'); return; }\n        if (typeof window.hytzMetaTrackAddToCart === 'function') {\n          ids.forEach(function (id) {\n            window.hytzMetaTrackAddToCart({\n              variantId: id, quantity: 1, response: data,\n              source: 'hytz-build-your-habitz', buttonTag: 'build_your_habitz_add'\n            });\n          });\n        }\n        restore('Added \u2713');\n        setTimeout(function () { if (lbl) lbl.textContent = prevText || 'Add to cart'; }, 1600);\n        if (typeof window.hytzRefreshCart === 'function') window.hytzRefreshCart();\n        if (/^\\/cart\\/?$/.test(window.location.pathname)) { setTimeout(function () { window.location.reload(); }, 700); return; }\n        setTimeout(function () { if (typeof window.hytzOpenCart === 'function') window.hytzOpenCart(); }, 400);\n      })\n      .catch(function () { restore(prevText || 'Add to cart'); });\n  }\n  window.hytzBuildHabitz = buildHabitz;\n  document.addEventListener('click', function (e) {\n    var t = e.target.closest ? e.target.closest('[data-hy-habitz-add]') : null;\n    if (!t) return;\n    e.preventDefault();\n    var ids = (t.getAttribute('data-hy-habitz-add') || '').split(',').map(function (s) { return s.trim(); }).filter(Boolean);\n    buildHabitz(ids, t);\n  });\n})();\n\n// ---- B26-B3 (070626): Appstle Dynamic-Pricing-Bundle builder pages (/apps/bundles/) ----\n// The builders render inside the theme layout, so this file runs there. Three assists Appstle can't\n// do itself: (1) kill its scroll-to-checkout on every Add, (2) swap its white box-shot product images\n// for the theme's transparent bag renders (the white plates read as off-brand), (3) a sticky glass\n// progress chip at the top \u2014 count added + distance to the next tier (tiers parsed from the bundle\n// subtitle, so the same code serves all three builders).\n(function initBundleBuilderAssists() {\n  if (!/^\\/apps\\/bundles\\//.test(location.pathname)) return;\n  // \u2500\u2500 BB-4 (Sol 070926): full Fable port \u2014 fable.com/products/build-your-own-bundle layout +\n  // mechanics, Hytz v3 skin. Appstle's native widget keeps powering add/remove/qty/checkout; its\n  // below-grid summary is HIDDEN (CSS keys off .hy-bb2-on) and stays in the DOM as our state source\n  // + click-proxy target. Our UI: desktop = sticky top bar (meter \u00B7 6 fill-slots \u00B7 Your-stack toggle \u00B7\n  // ADD TO CART w/ live struck pricing) that still fuses under the nav (B34-BB-2 dock CSS keys on the\n  // same .hy-bb-progress class); mobile = Fable's sticky bottom bar + expandable bottom sheet.\n  // CTA gates at the 3-item minimum, exactly like Fable.\n\n  // (1) Appstle jumps to its checkout summary after each add \u2014 block programmatic smooth jumps on\n  // builder pages only (user wheel/touch scrolling is not an API call and is unaffected).\n  var nativeScrollTo = window.scrollTo.bind(window);\n  window.scrollTo = function (a) {\n    if (a && typeof a === 'object' && a.behavior === 'smooth') return;\n    return nativeScrollTo.apply(null, arguments);\n  };\n  var nativeSIV = Element.prototype.scrollIntoView;\n  Element.prototype.scrollIntoView = function () {\n    if (this.closest && this.closest('.appstle-bundle')) return;\n    return nativeSIV.apply(this, arguments);\n  };\n\n  // \u2500\u2500 state readers (all from Appstle's live DOM) \u2500\u2500\n  var tiers = null;\n  function root() {\n    return document.querySelector('.appstle-bundle .ab-dynamic-pricing-bundle-product-page') || document.querySelector('.appstle-bundle');\n  }\n  function parseTiers() {\n    if (tiers) return tiers;\n    var r = root();\n    if (!r) return null;\n    var m = /3\\+[^\u00B7]*save\\s*(\\d+)\\s*%[^\u00B7]*\u00B7\\s*6\\+\\s*save\\s*(\\d+)\\s*%/i.exec(r.textContent || '');   // textContent: the subtitle is display:none (BB-5) but still feeds this\n    if (m) tiers = { three: +m[1], six: +m[2] };\n    return tiers;\n  }\n  function cleanName(s) { return (s || '').replace(/\\s+/g, ' ').replace(/\\s-\\s/, ' \u00B7 ').trim(); }\n  function readItems() {\n    var items = [];\n    document.querySelectorAll('.appstle-bundle .ab-bundle-selected-product-wrapper').forEach(function (w) {\n      var img = w.querySelector('img');\n      var qEl = w.querySelector('.ab-bundle-selected-product-quantity');\n      var link = w.querySelector('.ab-bundle-selected-title-link');\n      var q = 1;\n      if (qEl) { var qm = /(\\d+)/.exec(qEl.textContent || ''); if (qm) q = parseInt(qm[1], 10) || 1; }\n      items.push({ el: w, img: img ? img.src : '', name: cleanName(link && link.textContent), qty: q });\n    });\n    return items;\n  }\n  function itemCount(items) { return items.reduce(function (s, i) { return s + i.qty; }, 0); }\n  function gridUnitPrice(name) {\n    // match the grid card whose img alt contains the product's base name (before \" \u00B7 \")\n    var base = name.split(' \u00B7 ')[0];\n    var cards = document.querySelectorAll('.appstle-bundle .ab-bundle-product-card');\n    for (var i = 0; i < cards.length; i++) {\n      var alt = (cards[i].querySelector('img') || {}).alt || '';\n      if (alt.indexOf(base) !== -1) {\n        var p = cards[i].querySelector('.ab-bundle-product-price');\n        if (p) { var m = /([\\d,.]+)/.exec(p.textContent); if (m) return Math.round(parseFloat(m[1].replace(/,/g, '')) * 100); }\n      }\n    }\n    return null;\n  }\n  function money(c) { return '$' + (c / 100).toFixed(2); }\n  function savingsPct(n) {\n    var T = parseTiers();\n    if (!T) return 0;\n    return n >= 6 ? T.six : n >= 3 ? T.three : 0;\n  }\n\n  // \u2500\u2500 proxies into Appstle's native controls \u2500\u2500\n  function proxyCheckout() {\n    var b = document.querySelector('.appstle-bundle .ab-bundle-add-bundle-to-cart');\n    if (b) b.click();\n  }\n  function gridStepper(name, dir) {\n    var base = name.split(' \u00B7 ')[0];\n    var cards = document.querySelectorAll('.appstle-bundle .ab-bundle-product-card');\n    for (var i = 0; i < cards.length; i++) {\n      var alt = (cards[i].querySelector('img') || {}).alt || '';\n      if (alt.indexOf(base) !== -1) {\n        var wrap = cards[i].querySelector('.ab-bundle-product-info-container div:has(> input[type=\"text\"])');\n        if (!wrap) return;\n        var btns = wrap.querySelectorAll('button');\n        if (btns.length >= 2) (dir > 0 ? btns[btns.length - 1] : btns[0]).click();\n        return;\n      }\n    }\n  }\n  function removeItem(item) {\n    var btn = item.el.querySelector('.ab-bundle-selected-product-remove-btn');\n    if (btn) btn.click();\n  }\n  function restartStack() {\n    var step = function () {\n      var btn = document.querySelector('.appstle-bundle .ab-bundle-selected-product-remove-btn');\n      if (btn) { btn.click(); setTimeout(step, 350); }\n    };\n    step();\n  }\n\n  // \u2500\u2500 UI shell \u2500\u2500\n  var bar = null, mbar = null, sheet = null, backdrop = null, open = false;\n  var SLOT_MAX = 6;\n  function esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;'); }\n  function ensureUI() {\n    var r = root();\n    if (!r) return false;\n    if (!r.classList.contains('hy-bb2-on')) r.classList.add('hy-bb2-on');\n    if (!bar) {\n      bar = document.createElement('div');\n      bar.className = 'hy-bb-progress hy-bb2-bar';\n      bar.setAttribute('aria-live', 'polite');\n      r.insertBefore(bar, r.firstChild);\n    }\n    if (!mbar) {\n      mbar = document.createElement('div');\n      mbar.className = 'hy-bb2-mbar';\n      document.body.appendChild(mbar);\n    }\n    if (!backdrop) {\n      backdrop = document.createElement('div');\n      backdrop.className = 'hy-bb2-backdrop';\n      backdrop.addEventListener('click', function () { toggleSheet(false); });\n      document.body.appendChild(backdrop);\n    }\n    if (!sheet) {\n      sheet = document.createElement('div');\n      sheet.className = 'hy-bb2-sheet';\n      sheet.setAttribute('role', 'dialog');\n      sheet.setAttribute('aria-label', 'Your stack');\n      document.body.appendChild(sheet);\n      document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && open) toggleSheet(false); });\n      window.addEventListener('scroll', function () { if (open) placeSheet(); }, { passive: true });\n      window.addEventListener('resize', function () { if (open) placeSheet(); }, { passive: true });\n    }\n    injectTabs();\n    return true;\n  }\n  function placeSheet() {\n    // BB-9 (Sol): the drawer opens as an EXTENSION of the bar (the mini-cart-from-nav pattern) \u2014\n    // fixed-positioned flush under the bar, same width, repositioned on scroll/resize while open.\n    if (!sheet || !bar) return;\n    if (window.matchMedia('(max-width: 768px)').matches) {\n      sheet.style.top = ''; sheet.style.left = ''; sheet.style.width = '';\n      bar.classList.remove('is-ext');\n      return;\n    }\n    var r = bar.getBoundingClientRect();\n    sheet.style.top = Math.round(r.bottom) + 'px';\n    sheet.style.left = Math.round(r.left) + 'px';\n    sheet.style.width = Math.round(r.width) + 'px';\n    bar.classList.toggle('is-ext', open);\n  }\n  function toggleSheet(want) {\n    open = typeof want === 'boolean' ? want : !open;\n    document.body.classList.toggle('hy-bb2-open', open);\n    render();\n    placeSheet();\n  }\n  // Pack-type tabs (Fable's category pills \u2192 our three builders)\n  var BUILDERS = [\n    { label: 'Singles', slug: 'djpoutvr2i' },\n    { label: '3-Packs', slug: 'pgdvq3qh8k' },\n    { label: '25-Packs', slug: 'xbv9d71l9q' }\n  ];\n  function injectTabs() {\n    var r = root();\n    if (!r || r.querySelector('.hy-bb2-tabs')) return;\n    var heading = r.querySelector('.ab-bundle-heading-title');\n    if (!heading) return;\n    var cur = location.pathname.split('/').pop();\n    var el = document.createElement('nav');\n    el.className = 'hy-bb2-tabs';\n    el.setAttribute('aria-label', 'Pack size');\n    el.innerHTML = BUILDERS.map(function (b) {\n      var on = b.slug === cur;\n      return '<a class=\"hy-bb2-tab' + (on ? ' is-active' : '') + '\" href=\"/apps/bundles/bb/' + b.slug + '\"' + (on ? ' aria-current=\"page\"' : '') + '>' + b.label + '</a>';\n    }).join('');\n    heading.insertAdjacentElement('afterend', el);\n    // BB-5 \u2014 readable tier strip (replaces the hidden run-on subtitle) + the fill-slots row\n    var sub = r.querySelector('.ab-bundle-subtitle');\n    var subText = sub ? sub.textContent : '';\n    var T2 = parseTiers();\n    var cells = [];\n    if (T2) cells = [\n      { pct: T2.three + '%', label: 'off 3+ packs' },\n      { pct: T2.six + '%', label: 'off 6+ packs' }\n    ];\n    var extra = /extra\\s*(\\d+)\\s*%/i.exec(subText);\n    if (extra) cells.push({ pct: '+' + extra[1] + '%', label: 'extra when you subscribe' });\n    var strip = document.createElement('div');\n    strip.className = 'hy-bb2-tiers';\n    strip.innerHTML = cells.map(function (c) {\n      return '<span class=\"hy-bb2-tier\"><b>' + c.pct + '</b><i>' + c.label + '</i></span>';\n    }).join('');\n    el.insertAdjacentElement('afterend', strip);\n    var ps = document.createElement('div');\n    ps.className = 'hy-bb2-slots-page';\n    strip.insertAdjacentElement('afterend', ps);\n  }\n\n  // \u2500\u2500 render \u2500\u2500\n  function captionFor(n, T) {\n    if (n === 0) return 'Add <b>3 items</b> to start saving';\n    if (n < 3) return 'Add <b>' + (3 - n) + ' more</b> to save ' + T.three + '%';\n    if (n < 6) return '<b>You\u2019re saving ' + T.three + '%</b> \u00B7 ' + (6 - n) + ' more for ' + T.six + '%';\n    return '<b>You\u2019re saving ' + T.six + '%!</b>';\n  }\n  function meterHTML(n, T) {\n    // BB-8 (Sol): no caption \u2014 the meter IS the message. Six discrete segments (one per pack toward\n    // the 6+ tier), milestone chips inline after segments 3 and 6. You SEE \"1 more to the next\n    // discount\" instead of reading it. aria-label carries the sentence for screen readers.\n    var label = n === 0 ? 'Add 3 items to start saving'\n      : n < 3 ? ((3 - n) + ' more to save ' + T.three + '%')\n      : n < 6 ? ('Saving ' + T.three + '% \u2014 ' + (6 - n) + ' more for ' + T.six + '%')\n      : ('Saving ' + T.six + '%');\n    var out = '<div class=\"hy-bb-segtrack\" role=\"img\" aria-label=\"' + label + '\">';\n    for (var i = 1; i <= 6; i++) {\n      out += '<span class=\"hy-bb-seg' + (n >= i ? ' is-filled' : '') + '\"></span>';\n      if (i === 3) out += '<span class=\"hy-bb-node' + (n >= 3 ? ' is-hit' : '') + '\">' + T.three + '%</span>';\n    }\n    out += '<span class=\"hy-bb-node' + (n >= 6 ? ' is-hit' : '') + '\">' + T.six + '%</span></div>';\n    return out;\n  }\n  function slotsHTML(items) {\n    var thumbs = [];\n    items.forEach(function (i) { for (var k = 0; k < i.qty && thumbs.length < SLOT_MAX; k++) thumbs.push(i); });\n    var out = '';\n    for (var s = 0; s < SLOT_MAX; s++) {\n      out += thumbs[s]\n        ? '<span class=\"hy-bb2-slot is-filled\"><img src=\"' + esc(thumbs[s].img) + '\" alt=\"' + esc(thumbs[s].name) + '\"></span>'\n        : '<span class=\"hy-bb2-slot\" aria-hidden=\"true\">+</span>';\n    }\n    return '<div class=\"hy-bb2-slots\">' + out + '</div>';\n  }\n  function priceHTML(items, n, p) {\n    var full = 0, ok = true;\n    items.forEach(function (i) {\n      var u = gridUnitPrice(i.name);\n      if (u == null) ok = false; else full += u * i.qty;\n    });\n    if (!ok || !full) return '';\n    if (!p) return '<span class=\"hy-bb2-price\">' + money(full) + '</span>';\n    return '<span class=\"hy-bb2-was\">' + money(full) + '</span> <span class=\"hy-bb2-price\">' + money(Math.round(full * (100 - p) / 100)) + '</span>';\n  }\n  function ctaHTML(items, n, p) {\n    var dis = n < 3 ? ' disabled aria-disabled=\"true\"' : '';\n    return '<button type=\"button\" class=\"hy-bb2-cta\"' + dis + '>Add to cart' + (n > 0 ? ' <span class=\"hy-bb2-cta-price\">' + priceHTML(items, n, p) + '</span>' : '') + '</button>';\n  }\n  function rowsHTML(items, p) {\n    if (!items.length) return '<p class=\"hy-bb2-empty\">Nothing here yet \u2014 add three or more packs to get started.</p>';\n    return items.map(function (i, idx) {\n      var u = gridUnitPrice(i.name);\n      var line = u == null ? '' : (p\n        ? '<span class=\"hy-bb2-was\">' + money(u * i.qty) + '</span> <span class=\"hy-bb2-price\">' + money(Math.round(u * i.qty * (100 - p) / 100)) + '</span>'\n        : '<span class=\"hy-bb2-price\">' + money(u * i.qty) + '</span>');\n      return '<div class=\"hy-bb2-row\" data-idx=\"' + idx + '\">' +\n        '<img class=\"hy-bb2-row-img\" src=\"' + esc(i.img) + '\" alt=\"\">' +\n        '<div class=\"hy-bb2-row-main\"><span class=\"hy-bb2-row-name\">' + esc(i.name) + '</span><span class=\"hy-bb2-row-line\">' + line + '</span></div>' +\n        '<div class=\"hy-bb2-step\"><button type=\"button\" class=\"hy-bb2-dec\" aria-label=\"Remove one\">\u2212</button><span>' + i.qty + '</span><button type=\"button\" class=\"hy-bb2-inc\" aria-label=\"Add one\">+</button></div>' +\n        '<button type=\"button\" class=\"hy-bb2-x\" aria-label=\"Remove ' + esc(i.name) + '\">\u2715</button>' +\n        '</div>';\n    }).join('');\n  }\n  function render() {\n    if (!ensureUI()) return;\n    var T = parseTiers();\n    if (!T) return;\n    var items = readItems();\n    var n = itemCount(items);\n    var p = savingsPct(n);\n    bar.classList.toggle('is-active', n >= 3);\n    bar.innerHTML =\n      '<div class=\"hy-bb2-meterblock\">' + meterHTML(n, T) + '</div>' +\n      '<div class=\"hy-bb2-actions\"><button type=\"button\" class=\"hy-bb2-toggle\" aria-expanded=\"' + open + '\">Your stack <span class=\"hy-bb2-chev\">' + (open ? '\u2303' : '\u2304') + '</span></button>' + ctaHTML(items, n, p) + '</div>';\n    mbar.innerHTML =\n      '<button type=\"button\" class=\"hy-bb2-toggle\" aria-expanded=\"' + open + '\">Your stack <span class=\"hy-bb2-chev\">' + (open ? '\u2303' : '\u2304') + '</span></button>' +\n      ctaHTML(items, n, p);\n    var pageSlots = document.querySelector('.hy-bb2-slots-page');   // BB-5: slots live under the tier strip\n    if (pageSlots) pageSlots.innerHTML = slotsHTML(items);\n    var full = 0, ok = true;\n    items.forEach(function (i) { var u = gridUnitPrice(i.name); if (u == null) ok = false; else full += u * i.qty; });\n    var totalLine = (!ok || !full) ? '' : (p\n      ? '<span class=\"hy-bb2-was\">' + money(full) + '</span> <span class=\"hy-bb2-price\">' + money(Math.round(full * (100 - p) / 100)) + '</span>'\n      : '<span class=\"hy-bb2-price\">' + money(full) + '</span>');\n    sheet.innerHTML =\n      '<div class=\"hy-bb2-sheet-head\"><div class=\"hy-bb-text\">' + captionFor(n, T) + '</div>' + meterHTML(n, T) + '</div>' +\n      '<h3 class=\"hy-bb2-sheet-title\">Your stack</h3>' +\n      '<div class=\"hy-bb2-rows\">' + rowsHTML(items, p) + '</div>' +\n      '<div class=\"hy-bb2-foot\"><button type=\"button\" class=\"hy-bb2-restart\"' + (items.length ? '' : ' disabled') + '>Clear stack</button><span class=\"hy-bb2-total\">Total ' + totalLine + '</span></div>' +\n      ctaHTML(items, n, p) +\n      '<p class=\"hy-bb2-note\">Discounts apply automatically at checkout.</p>';\n    wire(items, n);\n  }\n  function wire(items, n) {\n    [].slice.call(document.querySelectorAll('.hy-bb2-toggle')).forEach(function (t) {\n      t.onclick = function () { toggleSheet(); };\n    });\n    [].slice.call(document.querySelectorAll('.hy-bb2-cta')).forEach(function (c) {\n      c.onclick = function () { if (n >= 3) proxyCheckout(); };\n    });\n    var rs = sheet.querySelector('.hy-bb2-restart');\n    if (rs) rs.onclick = restartStack;\n    [].slice.call(sheet.querySelectorAll('.hy-bb2-row')).forEach(function (row) {\n      var item = items[+row.getAttribute('data-idx')];\n      if (!item) return;\n      row.querySelector('.hy-bb2-inc').onclick = function () { gridStepper(item.name, 1); };\n      row.querySelector('.hy-bb2-dec').onclick = function () { if (item.qty > 1) gridStepper(item.name, -1); else removeItem(item); };\n      row.querySelector('.hy-bb2-x').onclick = function () { removeItem(item); };\n    });\n  }\n\n  // copy polish on Appstle's template strings (React re-renders restore the originals; every write is\n  // guarded to only touch changed text, so the observer never feeds itself).\n  function polishSummary() {\n    var h = document.querySelector('.appstle-bundle .ab-bundle-details-label');\n    if (h && h.textContent !== 'Your stack') h.textContent = 'Your stack';\n    document.querySelectorAll('.appstle-bundle .ab-bundle-variant-name').forEach(function (v) {\n      var c = v.textContent.replace(/^\\s*-\\s*/, '');\n      if (c !== v.textContent) v.textContent = c;\n    });\n    document.querySelectorAll('.appstle-bundle .ab-bundle-selected-title-link').forEach(function (a) {\n      var c = cleanName(a.textContent);\n      if (c !== a.textContent) a.textContent = c;\n    });\n    // BB-6 \u2014 v3 lineup-card anatomy on the grid cards: price inside the glass buy pill (label left /\n    // price right) + a quiet \"Learn more\" PDP link. React re-renders wipe these; the observer\n    // re-applies (existence guards prevent self-feeding).\n    var HANDLES = { 'Sauce Shield': 'sauce-shield', 'Lung Hero': 'lung-hero', 'The Nod': 'the-nod', 'Ski Gear': 'ski-gear', 'The Whip': 'the-whip', 'Roll Patrol': 'roll-patrol' };\n    document.querySelectorAll('.appstle-bundle .ab-bundle-product-card').forEach(function (card) {\n      var alt = (card.querySelector('img') || {}).alt || '';\n      var base = null;\n      for (var k in HANDLES) { if (alt.indexOf(k) !== -1) { base = k; break; } }\n      var btn = card.querySelector('.ab-bundle-product-add-to-bundle');\n      if (btn && !btn.querySelector('.hy-bb2-btn-price')) {\n        var priceEl = card.querySelector('.ab-bundle-product-price');\n        var ptxt = priceEl ? priceEl.textContent.trim() : '';\n        btn.innerHTML = '<span>' + esc(btn.textContent.trim()) + '</span>' + (ptxt ? '<span class=\"hy-bb2-btn-price\">' + esc(ptxt) + '</span>' : '');\n      }\n      if (base) {\n        var block = card.querySelector('div:has(> .ab-bundle-product-title-link)');\n        if (block && !block.querySelector('.hy-bb2-details')) {\n          var db = document.createElement('button');\n          db.type = 'button';\n          db.className = 'hy-bb2-details';\n          db.textContent = 'Details';\n          block.appendChild(db);\n        }\n        var cont = card.querySelector('.ab-bundle-product-details-container');\n        if (cont && !cont.querySelector('.hy-bb2-info') && INFO[base]) {\n          var inf = INFO[base];\n          var rows = inf.i.map(function (g) {\n            return '<div class=\"hy-bb2-ing\"><span class=\"hy-bb2-ing-n\">' + g[0] + ' <em>' + g[1] + '</em></span><span class=\"hy-bb2-ing-b\">' + g[2] + '</span></div>';\n          }).join('');\n          var el2 = document.createElement('div');\n          el2.className = 'hy-bb2-info';\n          el2.innerHTML = '<button type=\"button\" class=\"hy-bb2-info-x\" aria-label=\"Close details\">\u2715</button>' +\n            '<div class=\"hy-bb2-info-tabs\" role=\"tablist\"><button type=\"button\" data-t=\"desc\" class=\"is-on\">Description</button><button type=\"button\" data-t=\"ings\">Ingredients</button></div>' +\n            '<div class=\"hy-bb2-info-panel\" data-p=\"desc\"><p>' + inf.d + '</p></div>' +\n            '<div class=\"hy-bb2-info-panel\" data-p=\"ings\" hidden>' + rows + '</div>';\n          cont.appendChild(el2);\n        }\n      }\n    });\n  }\n  // BB-9 \u2014 per-SKU details content, VERBATIM from shipped surfaces (claim-safe): descriptions =\n  // snippets/hytz-v2-product-card.liquid card_map; ingredients (name/dose/benefit) =\n  // sections/hytz-v2-intro.liquid six-habits data (doses from formulations.md). Keep in sync there.\n  var INFO = {\n    'Sauce Shield': { d: 'DHM and milk thistle to support your liver and the morning after drinking.', i: [['DHM', '450mg', 'A gentler hangover'], ['Milk Thistle', '88mg', 'Liver takes less of a hit'], ['Prickly Pear', '75mg', 'Eases the rough morning'], ['Ginger Root', '450mg', 'Calms a queasy stomach'], ['B-Complex', '49mg', 'Less run-down the next day'], ['Turmeric', '350mg', 'Eases that hungover ache']] },\n    'Lung Hero': { d: 'NAC and mullein to support your airways through smoking and vaping.', i: [['NAC', '96mg', 'A clearer, lighter chest'], ['Mullein', '800mg', 'Breathe a little easier'], ['Elderberry', '400mg', 'Backup for stressed lungs'], ['Marshmallow Root', '300mg', 'Soothes a scratchy throat'], ['Astragalus', '200mg', 'Daily backup for lungs'], ['Pine Bark', '160mg', 'Guards airways daily']] },\n    'The Nod': { d: 'Motility and clarity support to cut the fog from kratom and opioids.', i: [['L-Theanine', '105mg', 'Sharp focus, no jitters'], ['Green Tea', '40mg', 'Shakes off drowsiness'], ['Senna', '2mg', 'Things get moving again'], ['Magnesium', '37mg', 'Keeps you regular'], ['Chicory Fiber', '30mg', 'Smoother digestion'], ['Vitamin C', '480mg', 'Keeps your defenses up']] },\n    'Ski Gear': { d: 'Antioxidants and mood support to ease the stimulant crash.', i: [['ALA', '172mg', 'Less wrecked afterward'], ['5-HTP', '100mg', 'Helps your mood recover'], ['Bromelain', '32mg', 'Clears a stuffy nose'], ['ALCAR', '143mg', 'Helps your head clear'], ['CoQ10', '29mg', 'Fights the drained feeling'], ['Magnesium', '26mg', 'Unclenches a tight jaw']] },\n    'The Whip': { d: 'High-dose B12 and nerve support to replace what nitrous depletes.', i: [['B12', '1.6mg', 'Puts your B12 back'], ['ALA', '100mg', 'Shields your nerves'], ['ALCAR', '100mg', 'Helps nerves repair'], ['Magnesium', '46mg', 'Calms frazzled nerves'], ['Vitamin C', '390mg', 'Helps the B12 land'], ['CoQ10', '25mg', 'Recharges tired nerves']] },\n    'Roll Patrol': { d: '5-HTP and magnesium to support the MDMA comedown.', i: [['5-HTP', '100mg', 'Helps your mood recover'], ['Magnesium', '43mg', 'Loosens a clenched jaw'], ['ALA', '172mg', 'Guards cells from stress'], ['Vitamin C', '210mg', 'Cools the oxidative load'], ['ALCAR', '143mg', 'Steadies your recovery'], ['CoQ10', '30mg', 'Recharges your neurons']] }\n  };\n  // Delegated handlers survive Appstle re-renders (our injected nodes get rebuilt by the observer).\n  document.addEventListener('click', function (e) {\n    if (!e.target || !e.target.closest) return;\n    var d = e.target.closest('.hy-bb2-details');\n    if (d) { var c = d.closest('.ab-bundle-product-details-container'); if (c) c.classList.add('hy-info-open'); return; }\n    if (e.target.closest('.hy-bb2-info-x')) { var c2 = e.target.closest('.ab-bundle-product-details-container'); if (c2) c2.classList.remove('hy-info-open'); return; }\n    var tab = e.target.closest('.hy-bb2-info-tabs button');\n    if (tab) {\n      var info = tab.closest('.hy-bb2-info');\n      [].slice.call(info.querySelectorAll('.hy-bb2-info-tabs button')).forEach(function (b) { b.classList.toggle('is-on', b === tab); });\n      [].slice.call(info.querySelectorAll('.hy-bb2-info-panel')).forEach(function (pn) { pn.hidden = pn.getAttribute('data-p') !== tab.getAttribute('data-t'); });\n    }\n  });\n\n  var tick = null;   // Appstle re-renders (React) \u2014 observe, throttled\n  new MutationObserver(function (muts) {\n    // ignore mutations inside OUR UI (render would loop otherwise)\n    var external = muts.some(function (m) {\n      var t = m.target;\n      return !(t.closest && t.closest('.hy-bb2-bar, .hy-bb2-mbar, .hy-bb2-sheet'));\n    });\n    if (!external || tick) return;\n    tick = setTimeout(function () { tick = null; render(); polishSummary(); }, 120);\n  }).observe(document.body, { childList: true, subtree: true });\n\n  render();\n  polishSummary();\n})();\n"],
  "mappings": "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",
  "names": ["track", "matchStickyToNav", "updateStickyVisibility", "onScrollOrResize", "escapeHtml", "data", "i"]
}
