{
  "version": 3,
  "sources": ["/cdn/shop/t/138/assets/hytz-v2-build2.js?hytz_flip_restore=060626v9"],
  "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 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  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  }\n  function closeMenu() {\n    menu.classList.remove('active');\n    overlay.classList.remove('active');\n    nav.classList.remove('menu-open');\n    menu.setAttribute('aria-hidden', 'true');\n    if (window.hyUnlockBodyScroll) window.hyUnlockBodyScroll('mobile-menu');\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  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 modal \u2014 flip + expand from lineup card \u2550\u2550\u2550 */\n(function () {\n  var modal = document.getElementById('hy-modal');\n  if (!modal) return;\n  var card = document.getElementById('hy-modal-card');\n  var currentSize = 'single';\n  var currentHandle = null;\n  var sourceCard = null;\n\n  function formatSupp(sf) {\n    if (!sf) return '';\n    var html = '<div class=\"hy-supp-serving\">Serving Size: ' + sf.serving + '</div>';\n    html += '<div class=\"hy-supp-divider-thick\"></div>';\n    html += '<div class=\"hy-supp-row hy-supp-row-header\"><span>Amount Per Serving</span><span>% DV</span></div>';\n    html += '<div class=\"hy-supp-divider\"></div>';\n    sf.facts.forEach(function (f) {\n      html += '<div class=\"hy-supp-row\"><span>' + f.name + ' <strong>' + f.amount + '</strong></span><span>' + f.dv + '</span></div>';\n      html += '<div class=\"hy-supp-divider\"></div>';\n    });\n    html += '<div class=\"hy-supp-footnote\">* Daily Value not established.</div>';\n    return html;\n  }\n\n  function populate(handle) {\n    var p = window.hytzV2Products && window.hytzV2Products[handle];\n    var meta = window.hytzV2Meta && window.hytzV2Meta[handle];\n    if (!p || !meta) return;\n    card.style.setProperty('--c', 'var(' + meta.color + ')');\n    var splashMap = window.hytzV2Splashes || {};\n    if (splashMap[handle]) {\n      card.style.setProperty('--splash', splashMap[handle]);\n    }\n    document.getElementById('hy-modal-substance').textContent = meta.substance;\n    document.getElementById('hy-modal-name').textContent = meta.name;\n    document.getElementById('hy-modal-meta').textContent = meta.caps;\n    document.getElementById('hy-modal-desc').textContent = meta.desc;\n    document.getElementById('hy-modal-timing').textContent = meta.timing;\n    document.getElementById('hy-modal-supp-facts').innerHTML = formatSupp(meta.suppFacts);\n    document.getElementById('hy-modal-pdp').href = p.url;\n\n    // Preload all variant images so switching is instant (no network wait on click)\n    Object.keys(p.images).forEach(function (key) {\n      var u = p.images[key];\n      if (u) { var pre = new Image(); pre.src = u; }\n    });\n\n    currentSize = 'three';\n    setImage('three', p);\n\n    // Populate variant pills + reset selection state to default (3-pack \u2014 Most\n    // Popular). Variant click (handled in delegate) selects + swaps image; ATC\n    // button submits the currently-selected pill \u2014 matches PDP UX.\n    document.querySelectorAll('.hy-modal-price-pill').forEach(function (pill) {\n      var size = pill.dataset.size;\n      var v = p.variants[size];\n      if (v) {\n        pill.querySelector('[data-price]').textContent = v.price;\n        pill.dataset.variantId = v.id;\n        pill.style.display = '';\n        pill.classList.toggle('is-selected', size === 'three');\n      } else {\n        pill.style.display = 'none';\n        pill.classList.remove('is-selected');\n      }\n    });\n\n    // Reset cart message + ATC button state from any prior open\n    var msg = document.getElementById('hy-modal-cart-msg');\n    if (msg) { msg.textContent = ''; msg.classList.remove('is-visible', 'is-success-pop', 'is-error'); }\n    var atc = document.getElementById('hy-modal-cart-btn');\n    if (atc) { atc.disabled = false; atc.style.opacity = ''; }\n\n    // Reset accordions to closed\n    document.querySelectorAll('.hy-modal-acc').forEach(function (a) { a.removeAttribute('open'); });\n    // Reset scroll\n    var scroll = document.getElementById('hy-modal-scroll');\n    if (scroll) scroll.scrollTop = 0;\n  }\n\n  function setImage(size, p) {\n    var url = p.images[size] || p.images.single;\n    var container = document.getElementById('hy-modal-img');\n    var existing = container.querySelector('img');\n    if (!existing) {\n      container.innerHTML = '<img src=\"' + url + '\" alt=\"\">';\n      return;\n    }\n    if (existing.src === url || existing.src.indexOf(url) !== -1) return;\n    // Fade out, swap src once the new image is decoded, fade in\n    existing.classList.add('is-swapping');\n    var next = new Image();\n    next.onload = function () {\n      existing.src = url;\n      // Force repaint then fade back in\n      requestAnimationFrame(function () {\n        existing.classList.remove('is-swapping');\n      });\n    };\n    next.onerror = function () {\n      existing.classList.remove('is-swapping');\n    };\n    next.src = url;\n  }\n\n  function modalFinalRect() {\n    var vw = window.innerWidth, vh = window.innerHeight;\n    var isMobile = vw < 700;\n    // Mobile: leave breathing room so users can tap the backdrop to dismiss \u2014\n    // more top/bottom than left/right. Desktop: unchanged (capped at 1180x820).\n    var marginX = isMobile ? 18 : 16;\n    var marginY = isMobile ? 54 : 16;\n    var maxW = Math.min(1180, vw - marginX * 2);\n    var maxH = Math.min(820, vh - marginY * 2);\n    return {\n      left: (vw - maxW) / 2,\n      top: (vh - maxH) / 2,\n      width: maxW,\n      height: maxH\n    };\n  }\n\n  function modalMorphTransform(fromRect, toRect) {\n    if (!fromRect || !toRect || !toRect.width || !toRect.height) return 'translate3d(0,0,0) scale(1,1)';\n    var sx = Math.max(0.08, fromRect.width / toRect.width);\n    var sy = Math.max(0.08, fromRect.height / toRect.height);\n    var dx = fromRect.left - toRect.left;\n    var dy = fromRect.top - toRect.top;\n    return 'translate3d(' + dx + 'px,' + dy + 'px,0) scale(' + sx + ',' + sy + ')';\n  }\n\n  function setModalCardRect(rect) {\n    card.style.left = rect.left + 'px';\n    card.style.top = rect.top + 'px';\n    card.style.width = rect.width + 'px';\n    card.style.height = rect.height + 'px';\n  }\n\n  function openModal(handle, srcCard) {\n    currentHandle = handle;\n    sourceCard = srcCard;\n    populate(handle);\n\n    var sourceRect = srcCard.getBoundingClientRect();\n    var finalRect = modalFinalRect();\n\n    // Reset scroll hint state so it re-appears every time modal opens\n    modal.classList.remove('has-scrolled');\n    var hintEl = document.getElementById('hy-modal-scroll-hint');\n    if (hintEl) hintEl.classList.remove('is-hidden');\n    // Reset scroll position so hint threshold doesn't trigger immediately\n    var scrollEl2 = document.getElementById('hy-modal-scroll');\n    if (scrollEl2) scrollEl2.scrollTop = 0;\n\n    // Visible + content hidden during the card flip\n    modal.classList.add('is-visible', 'is-opening');\n    modal.classList.remove('is-closing');\n    modal.setAttribute('aria-hidden', 'false');\n    if (window.hyLockBodyScroll) window.hyLockBodyScroll('product-modal');\n\n    // CARD FLIP OUT: the card starts at the clicked lineup card's rect and grows to\n    // centre while spinning a full turn (rotateY 0 -> 360) \u2014 it flips OUT of the card.\n    // On close it flips back INTO the card (mirror). Geometry + transform both\n    // transition (see .hy-modal-card). Content is hidden during the spin and fades\n    // in as it lands (see .hy-modal CSS).\n    card.style.transition = 'none';\n    card.style.transformOrigin = 'center';\n    setModalCardRect(sourceRect);\n    card.style.opacity = '1';\n    card.style.transform = 'rotateY(0deg)';\n    card.offsetHeight; // reflow\n\n    card.style.transition = '';\n    requestAnimationFrame(function () {\n      setModalCardRect(finalRect);\n      card.style.transform = 'rotateY(360deg)';\n    });\n\n    // After the spin lands, drop the transform so the scrollable pane isn't inside\n    // a transformed parent (kills scroll jitter). 360deg === 0deg, so it's seamless.\n    setTimeout(function () {\n      if (!modal.classList.contains('is-visible') || modal.classList.contains('is-closing')) return;\n      modal.classList.remove('is-opening');\n      card.style.transition = 'none';\n      card.style.transform = 'none';\n    }, 620);\n  }\n\n  function closeModal() {\n    if (!sourceCard || modal.classList.contains('is-closing')) return;\n    modal.classList.remove('is-opening');\n    modal.classList.add('is-closing');\n\n    var sourceRect = sourceCard.getBoundingClientRect();\n    var finalRect = modalFinalRect();\n\n    // CARD FLIP IN: the card shrinks from centre back into the source lineup card's\n    // rect while spinning a full turn (mirror of open). Content is already faded out\n    // (is-closing) so only the empty card travels.\n    card.style.transition = 'none';\n    card.style.transformOrigin = 'center';\n    setModalCardRect(finalRect);\n    card.style.transform = 'rotateY(0deg)';\n    card.offsetHeight; // reflow\n\n    card.style.transition = '';\n    requestAnimationFrame(function () {\n      setModalCardRect(sourceRect);\n      card.style.transform = 'rotateY(360deg)';\n    });\n\n    setTimeout(function () {\n      modal.classList.remove('is-visible');\n      modal.classList.remove('is-closing');\n      modal.setAttribute('aria-hidden', 'true');\n      if (window.hyUnlockBodyScroll) window.hyUnlockBodyScroll('product-modal');\n      card.style.transition = 'none';\n      card.style.left = ''; card.style.top = ''; card.style.width = ''; card.style.height = '';\n      card.style.transform = '';\n      card.style.transformOrigin = '';\n      card.style.opacity = '';\n      sourceCard = null;\n      currentHandle = null;\n    }, 620);\n  }\n\n  // Click delegation\n  document.addEventListener('click', function (e) {\n    // Modal close (X or backdrop)\n    if (modal.classList.contains('is-visible')) {\n      if (e.target.closest('#hy-modal-close') || e.target.classList.contains('hy-modal-backdrop')) {\n        closeModal();\n        return;\n      }\n      // Variant pill click \u2192 select + swap image (NO immediate add-to-cart, matches PDP)\n      var pill = e.target.closest('.hy-modal-price-pill');\n      if (pill && !pill.disabled && !pill.hasAttribute('aria-disabled')) {\n        e.preventDefault();\n        document.querySelectorAll('.hy-modal-price-pill').forEach(function (p) { p.classList.remove('is-selected'); });\n        pill.classList.add('is-selected');\n        var prod = window.hytzV2Products[currentHandle];\n        if (prod && pill.dataset.size) {\n          currentSize = pill.dataset.size;\n          setImage(pill.dataset.size, prod);\n        }\n        return;\n      }\n      // Add to Cart button \u2192 submit currently-selected variant\n      var atcBtn = e.target.closest('#hy-modal-cart-btn');\n      if (atcBtn) {\n        e.preventDefault();\n        var selectedPill = document.querySelector('.hy-modal-price-pill.is-selected');\n        if (selectedPill && selectedPill.dataset.variantId) {\n          addToCart(selectedPill.dataset.variantId, atcBtn);\n        }\n        return;\n      }\n      return; // any other click inside modal: do nothing\n    }\n    // Lineup card click \u2192 open modal\n    // Scoped to component classes that should trigger the flip-modal.\n    // NOT bare [data-handle] (overmatches on PDP / ingredient cards / etc).\n    var srcCard = e.target.closest('.hy-lineup-card[data-handle], .hytz-cart-empty-row[data-handle]');\n    if (srcCard) {\n      if (e.target.closest('a[href]')) return;\n      e.preventDefault();\n      openModal(srcCard.dataset.handle, srcCard);\n    }\n  });\n\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape' && modal.classList.contains('is-visible')) closeModal();\n    // Keyboard open for role=\"button\" lineup cards \u2014 scoped same as click.\n    if ((e.key === 'Enter' || e.key === ' ') && !modal.classList.contains('is-visible')) {\n      var t = e.target;\n      if (t && t.classList && (t.classList.contains('hy-lineup-card') || t.classList.contains('hytz-cart-empty-row')) && t.hasAttribute('data-handle')) {\n        e.preventDefault();\n        openModal(t.dataset.handle, t);\n      }\n    }\n  });\n\n  // Mobile scroll-hint: hide once user scrolls the right panel\n  var scrollEl = document.getElementById('hy-modal-scroll');\n  var hint = document.getElementById('hy-modal-scroll-hint');\n  if (scrollEl && hint) {\n    scrollEl.addEventListener('scroll', function () {\n      if (scrollEl.scrollTop > 20) {\n        hint.classList.add('is-hidden');\n        modal.classList.add('has-scrolled');\n      }\n    }, { passive: true });\n  }\n\n  // Cart add via Shopify AJAX\n  function addToCart(variantId, btn) {\n    var msg = document.getElementById('hy-modal-cart-msg');\n    btn.style.opacity = '0.6';\n    if (btn.tagName === 'BUTTON') btn.disabled = true;\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ items: [{ id: parseInt(variantId), quantity: 1 }] })\n    })\n      .then(function (r) { return r.json(); })\n      .then(function (data) {\n        btn.style.opacity = '';\n        if (btn.tagName === 'BUTTON') btn.disabled = false;\n        if (data && data.status) {\n          if (msg) { msg.textContent = '\u2717 ' + (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: currentHandle,\n            size: currentSize,\n            source: 'hytz-v2-modal',\n            buttonTag: 'modal_add_to_cart'\n          });\n        }\n        if (msg) {\n          msg.textContent = '\u2713 Added to cart';\n          msg.classList.add('is-visible', 'is-success-pop');\n          setTimeout(function () {\n            msg.classList.remove('is-visible', 'is-success-pop');\n          }, 2200);\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        // On the cart page itself, the Liquid-rendered line items need a full\n        // reload to reflect the new state \u2014 cart markup isn't AJAX-swapped.\n        if (/^\\/cart\\/?$/.test(window.location.pathname)) {\n          setTimeout(function () { window.location.reload(); }, 900);\n          return;\n        }\n        // Close modal and open cart drawer for strong visual confirmation.\n        // 700ms lets the success pop animation play before transitioning.\n        setTimeout(function () {\n          if (typeof closeModal === 'function') closeModal();\n          if (typeof window.hytzOpenCart === 'function') window.hytzOpenCart();\n        }, 700);\n      })\n      .catch(function () {\n        btn.style.opacity = '';\n        if (btn.tagName === 'BUTTON') btn.disabled = false;\n        if (msg) {\n          msg.textContent = '\u2717 Could not add';\n          msg.classList.add('is-visible', 'is-error');\n          setTimeout(function () { msg.classList.remove('is-visible', 'is-error'); }, 2400);\n        }\n      });\n  }\n})();\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    // Lab potency table \u2014 uses claimed amount as both claimed + tested until real data wires in.\n    var labBody = document.getElementById('hy-pdp-lab-tbody-' + handle);\n    if (labBody && data && data.facts) {\n      var labRows = '';\n      data.facts.forEach(function (f) {\n        labRows += '<tr>' +\n          '<td>' + f.name + '</td>' +\n          '<td>' + f.amount + '</td>' +\n          '<td>' + f.amount + '</td>' +\n          '<td><span class=\"hy-pdp-lab-pass\">\u2713 Pass</span></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  // Sync the product-image thumbnail rail to a given main-image URL (if any matches).\n  // Leaves thumb state alone when nothing matches \u2014 prevents a stale \"active\" thumb\n  // on variants whose image isn't in the product gallery.\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) return;\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  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'); });\n      pill.classList.add('is-selected');\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      if (pill.dataset.variantImage) {\n        swapMainImage(pill.dataset.variantImage);\n        syncThumbsToUrl(pill.dataset.variantImage);\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    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'); });\n        matchingPill.classList.add('is-selected');\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      if (full) swapMainImage(full);\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    function openLightbox(srcEl, imgUrl) {\n      if (!imgUrl) return;\n      sourceEl = srcEl;\n      lastFocus = document.activeElement;\n      lbImg.src = imgUrl;\n      resetZoom();\n\n      var rect = srcEl.getBoundingClientRect();\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      // Position card at source, no transition\n      lbCard.style.transition = 'none';\n      lbCard.style.left = rect.left + 'px';\n      lbCard.style.top = rect.top + 'px';\n      lbCard.style.width = rect.width + 'px';\n      lbCard.style.height = rect.height + 'px';\n      lbCard.style.transform = 'rotateY(0deg)';\n      lbCard.offsetHeight; // reflow\n\n      // Animate to square + 360\u00B0 flip\n      lbCard.style.transition = '';\n      requestAnimationFrame(function () {\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.style.transform = 'rotateY(360deg)';\n      });\n\n      setTimeout(function () {\n        lightbox.classList.remove('is-opening');\n        if (lbClose) lbClose.focus();\n      }, 600);\n    }\n\n    function closeLightbox() {\n      if (!sourceEl) return;\n      lightbox.classList.add('is-closing');\n      var rect = sourceEl.getBoundingClientRect();\n      setTimeout(function () {\n        lbCard.style.left = rect.left + 'px';\n        lbCard.style.top = rect.top + 'px';\n        lbCard.style.width = rect.width + 'px';\n        lbCard.style.height = rect.height + 'px';\n        lbCard.style.transform = 'rotateY(0deg)';\n      }, 100);\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.transition = 'none';\n        lbCard.style.left = '';\n        lbCard.style.top = '';\n        lbCard.style.width = '';\n        lbCard.style.height = '';\n        lbCard.style.transform = '';\n        sourceEl = null;\n        resetZoom();  // Reset on close\n        if (lastFocus && lastFocus.focus) lastFocus.focus();\n      }, 750);\n    }\n\n    // Click main gallery area \u2192 open lightbox (accepts img OR zoom-hint icon clicks)\n    gallery.addEventListener('click', function (e) {\n      e.preventDefault();\n      var imgEl = gallery.querySelector('img');\n      openLightbox(gallery, 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 round 4: pack pills (no qty), bidirectional sync with hero pills ----\n  var sticky = document.getElementById('hy-pdp-sticky');\n  var stickyCta = document.getElementById('hy-pdp-sticky-cta');\n  var stickyPacks = sticky ? sticky.querySelectorAll('.hy-pdp-sticky-pack') : [];\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-checked', match ? '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    });\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  // Sticky pack click \u2192 drive the hero pill (single source of truth for variant/image/tab sync)\n  stickyPacks.forEach(function (pack) {\n    pack.addEventListener('click', function () {\n      if (pack.hasAttribute('disabled')) return;\n      var size = pack.dataset.size;\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  // Sticky CTA \u2192 submit the hero form (quantity stays at form default of 1)\n  if (stickyCta && cartForm) {\n    stickyCta.addEventListener('click', function () {\n      cartForm.dispatchEvent(new Event('submit', { cancelable: true, bubbles: true }));\n    });\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    function updateStickyVisibility() {\n      stickyTick = null;\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      }\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  // ---- 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) + '.png\" 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  // ---- 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      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: [{ id: parseInt(selectedVariantId, 10), quantity: qty }] })\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 (mobile-only; grid on desktop so no scroll) -----\n    // We still call setupCarousel; it no-ops if the scroller doesn't actually overflow.\n    setupCarousel({\n      scroller: pdp.querySelector('.hy-pdp-story-panels'),\n      lines: pdp.querySelector('.hy-pdp-story-lines')\n    });\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    var ingWrap = pdp.querySelector('.hy-pdp-ingredients-scroller');\n    setupCarousel({\n      scroller: pdp.querySelector('.hy-pdp-ingredients-track'),\n      lines: pdp.querySelector('.hy-pdp-ingredients-lines'),\n      navs: ingWrap ? Array.prototype.slice.call(ingWrap.querySelectorAll('.hy-pdp-ingredients-arrow')) : []\n    });\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"],
  "mappings": "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",
  "names": ["updateStickyVisibility", "onScrollOrResize", "escapeHtml", "data", "track"]
}
