{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/hide-project.js?hp=22033"],
  "sourcesContent": ["document.documentElement.classList.remove('no-js');\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  // V22.002 \u2014 the HTML starts with a mobile-only white under-canvas so Safari/\n  // Chromium cannot expose the dark storefront root before the first real paint.\n  // Stylesheets are ready before this deferred script runs; release the guard\n  // after two frames so the rendered page owns the canvas from here onward.\n  requestAnimationFrame(() => requestAnimationFrame(() => {\n    document.documentElement.classList.remove('hp-mobile-first-paint');\n  }));\n\n  // Announcement message rotator \u2014 Blur + Reveal.\n  const hpAnnV21 = document.querySelector('[data-ann]');\n  const hpAnnMessagesV21 = Array.from(document.querySelectorAll('[data-ann-message]'));\n  if (hpAnnV21 && hpAnnMessagesV21.length > 1 && hpAnnV21.dataset.annRotate === 'true') {\n    let hpAnnIndexV21 = hpAnnMessagesV21.findIndex(item => item.classList.contains('is-active'));\n    if (hpAnnIndexV21 < 0) hpAnnIndexV21 = 0;\n    const hpAnnDelayV21 = Math.max(2000, parseInt(hpAnnV21.dataset.annDelay || '4000', 10));\n    const hpAnnTransitionV21 = Math.max(180, parseInt(hpAnnV21.dataset.annTransition || '420', 10));\n\n    window.setInterval(() => {\n      if (!hpAnnV21.isConnected || hpAnnV21.hidden) return;\n      const currentMessage = hpAnnMessagesV21[hpAnnIndexV21];\n      const nextIndex = (hpAnnIndexV21 + 1) % hpAnnMessagesV21.length;\n      const nextMessage = hpAnnMessagesV21[nextIndex];\n\n      currentMessage.classList.remove('is-active');\n      currentMessage.classList.add('is-leaving');\n\n      window.setTimeout(() => {\n        currentMessage.classList.remove('is-leaving');\n        nextMessage.classList.add('is-active');\n        hpAnnIndexV21 = nextIndex;\n      }, hpAnnTransitionV21);\n    }, hpAnnDelayV21);\n  }\n\n\n\n  // ========================================================\n  // V15 RECOVERY CONTROLLER\n  // ========================================================\n  const HP = {\n    designMode:\n      document.documentElement.dataset.designMode === 'true' ||\n      Boolean(window.Shopify && Shopify.designMode),\n    root: document.documentElement,\n    viewport: document.querySelector('[data-hp-viewport]'),\n    scrollContainer: document.querySelector('[data-scroll-container]'),\n    header: document.querySelector('[data-hp-header]'),\n    stickyClone: null,\n    smoothActive: false,\n    currentY: window.scrollY,\n    targetY: window.scrollY,\n    ease: .05,\n    raf: 0,\n    headerStart: 0\n  };\n\n  const hpFinePointer = window.matchMedia('(pointer:fine)');\n  const hpReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n  // V22.007 \u2014 collection-card reveal hook. Smooth scroll moves the visual page\n  // after native scroll events have already fired, so collection reveal checks\n  // must also run from the smooth-scroll render frame.\n  let hpCollectionRevealTick = null;\n\n  // Product info panel sticky measurements for transform SmoothScroll.\n  const hpProductSection = document.querySelector('.hp-product-page-v5');\n  const hpProductPanel = hpProductSection?.querySelector('.hp-product-panel');\n  const hpProductPanelInner = hpProductPanel?.querySelector('.hp-product-panel__inner');\n  const hpProductFooter = document.querySelector('.hp-footer--refgrid, .hp-footer');\n  let hpProductPanelTop = 0;\n  let hpProductPanelMax = 0;\n  let hpProductPanelHandoffStart = 0;\n  let hpProductPanelPageEnd = 0;\n  let hpProductPanelFooterScrollActive = false;\n  let hpProductPanelFooterScrollStart = 0;\n\n  // V22.029 \u2014 one deterministic accordion transaction.\n  // During a tab swap we do NOT let the changing accordion height steer the\n  // product-panel viewport. We temporarily anchor either:\n  //   \u2022 the clicked tab label (normal PDP scrolling), or\n  //   \u2022 the bottom of the panel (footer handoff / page end).\n  // This keeps the panel visually still while preserving the original smooth\n  // height + blur/reveal accordion animation.\n  let hpProductAccordionTxn = null;\n  let hpProductAccordionTxnSeq = 0;\n\n  const hpAccordionPageY = () => HP.smoothActive ? HP.currentY : window.scrollY;\n\n  const hpStabilizeProductAccordionTxn = () => {\n    const txn = hpProductAccordionTxn;\n    if (!txn || !hpProductPanelInner || window.innerWidth <= 980) return;\n\n    const maxScroll = Math.max(0, hpProductPanelInner.scrollHeight - hpProductPanelInner.clientHeight);\n\n    if (txn.mode === 'bottom') {\n      // At the real page end keep the lower accordion tabs pinned above the\n      // footer. For a partial footer handoff preserve the current distance from\n      // the bottom instead of snapping the panel to a new position.\n      const target = Math.max(0, Math.min(maxScroll, maxScroll - txn.bottomGap));\n      if (Math.abs(hpProductPanelInner.scrollTop - target) > .25) {\n        hpProductPanelInner.scrollTop = target;\n      }\n      return;\n    }\n\n    const summary = txn.summary;\n    if (!summary?.isConnected) return;\n    const innerRect = hpProductPanelInner.getBoundingClientRect();\n    const summaryRect = summary.getBoundingClientRect();\n    const currentOffset = summaryRect.top - innerRect.top;\n    const delta = currentOffset - txn.summaryOffset;\n    if (Math.abs(delta) > .25) {\n      const target = Math.max(0, Math.min(maxScroll, hpProductPanelInner.scrollTop + delta));\n      hpProductPanelInner.scrollTop = target;\n    }\n  };\n\n  const hpBeginProductAccordionTxn = summary => {\n    if (!hpProductPanelInner || !summary || window.innerWidth <= 980) return null;\n\n    const pageY = hpAccordionPageY();\n    const handoffRange = Math.max(1, hpProductPanelPageEnd - hpProductPanelHandoffStart);\n    const handoffProgress = Math.max(0, Math.min(1, (pageY - hpProductPanelHandoffStart) / handoffRange));\n    const maxScroll = Math.max(0, hpProductPanelInner.scrollHeight - hpProductPanelInner.clientHeight);\n    const atPageEnd = pageY >= hpProductPanelPageEnd - 3 || handoffProgress >= .92;\n    const inFooterHandoff = handoffProgress > .02;\n    const innerRect = hpProductPanelInner.getBoundingClientRect();\n    const summaryRect = summary.getBoundingClientRect();\n\n    const txn = {\n      id: ++hpProductAccordionTxnSeq,\n      mode: inFooterHandoff ? 'bottom' : 'summary',\n      summary,\n      summaryOffset: summaryRect.top - innerRect.top,\n      // When the page is truly at the bottom, intentionally pin to the panel's\n      // true bottom so MATERIALS / CARE / SHIPPING always remain visible.\n      bottomGap: atPageEnd ? 0 : Math.max(0, maxScroll - hpProductPanelInner.scrollTop),\n      raf: 0\n    };\n\n    hpProductAccordionTxn = txn;\n    hpProductPanelFooterScrollActive = false;\n    hpProductPanel?.classList.add('is-accordion-transitioning');\n\n    const tick = () => {\n      if (!hpProductAccordionTxn || hpProductAccordionTxn.id !== txn.id) return;\n      hpStabilizeProductAccordionTxn();\n      txn.raf = requestAnimationFrame(tick);\n    };\n    txn.raf = requestAnimationFrame(tick);\n    return txn;\n  };\n\n  const hpEndProductAccordionTxn = txn => {\n    if (!txn || !hpProductAccordionTxn || hpProductAccordionTxn.id !== txn.id) return;\n    if (txn.raf) cancelAnimationFrame(txn.raf);\n\n    // One final correction after the height transition has committed.\n    hpStabilizeProductAccordionTxn();\n    hpProductAccordionTxn = null;\n    hpProductPanel?.classList.remove('is-accordion-transitioning');\n    hpProductPanelFooterScrollActive = false;\n\n    requestAnimationFrame(() => {\n      hpMeasureSmooth();\n      hpMeasureProductPanel();\n      hpUpdateProductPanel();\n    });\n  };\n\n  // V22.029 \u2014 stable footer-anchored PDP panel + anchored animated accordions.\n  // Keep the REAL footer edge as the stopping point, but also account for the\n  // panel's internal overflow. With DETAILS open, the inner surface can be taller\n  // than the visible sticky box. Merely lifting the box leaves the top of DETAILS\n  // parked on screen while MATERIALS / CARE are hidden below it.\n  //\n  // The fix is a two-part handoff:\n  // 1) the sticky box still clamps to the real footer edge;\n  // 2) while the footer enters, the panel's own scroll position is advanced from\n  //    its current position to its true bottom. Visually the COMPLETE panel content\n  //    rises upward with the page, so an open description never leaves a black tail.\n  const hpMeasureProductPanel = () => {\n    if (!hpProductSection || !hpProductPanel || !hpProductPanelInner) return;\n\n    const oldContainerTransform = HP.scrollContainer?.style.transform || '';\n    const oldPanelOffset = hpProductPanelInner.style.getPropertyValue('--hp-product-panel-offset');\n    const oldPanelAvailable = hpProductPanelInner.style.getPropertyValue('--hp-product-panel-available');\n    if (HP.scrollContainer) HP.scrollContainer.style.transform = 'translate3d(0,0,0)';\n\n    // Measure from the panel's native origin, but always restore its current\n    // visual transform before the browser can paint. Older builds left this at\n    // 0px until the next smooth-scroll frame, which was the source of the flash.\n    hpProductPanelInner.style.setProperty('--hp-product-panel-offset', '0px');\n    hpProductPanelInner.style.removeProperty('--hp-product-panel-available');\n\n    const panelRect = hpProductPanel.getBoundingClientRect();\n    const headerHeight = HP.header?.offsetHeight || 42;\n    const stickyTop = headerHeight + 16;\n    const viewportCap = Math.max(220, window.innerHeight - stickyTop - 16);\n    hpProductPanelInner.style.setProperty('--hp-product-panel-viewport', `${viewportCap}px`);\n\n    // Read the actual rendered sticky box after its stable max-height is applied.\n    const stickyBoxHeight = Math.min(\n      panelRect.height,\n      Math.max(1, hpProductPanelInner.getBoundingClientRect().height)\n    );\n    const footerRect = hpProductFooter?.getBoundingClientRect();\n\n    // In smooth mode the transform was reset above, so rects are already page\n    // coordinates. In native mode add scrollY because rects are viewport-relative.\n    const nativeScrollY = HP.smoothActive ? 0 : window.scrollY;\n    const panelPageTop = panelRect.top + nativeScrollY;\n    const footerPageTop = (footerRect?.top ?? panelRect.bottom) + nativeScrollY;\n\n    hpProductPanelTop = panelPageTop - stickyTop;\n    hpProductPanelMax = Math.max(0, footerPageTop - panelPageTop - stickyBoxHeight);\n    hpProductPanelHandoffStart = hpProductPanelTop + hpProductPanelMax;\n\n    const pageHeight = HP.smoothActive && HP.scrollContainer\n      ? Math.max(HP.scrollContainer.scrollHeight, Math.ceil(HP.scrollContainer.getBoundingClientRect().height))\n      : Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    hpProductPanelPageEnd = Math.max(hpProductPanelHandoffStart + 1, pageHeight - window.innerHeight);\n\n    if (oldPanelOffset) hpProductPanelInner.style.setProperty('--hp-product-panel-offset', oldPanelOffset);\n    else hpProductPanelInner.style.removeProperty('--hp-product-panel-offset');\n    if (oldPanelAvailable) hpProductPanelInner.style.setProperty('--hp-product-panel-available', oldPanelAvailable);\n    else hpProductPanelInner.style.removeProperty('--hp-product-panel-available');\n    if (HP.scrollContainer) HP.scrollContainer.style.transform = oldContainerTransform;\n  };\n\n  const hpProductPanelPageY = () => HP.smoothActive ? HP.currentY : window.scrollY;\n\n  const hpUpdateProductPanel = (options = {}) => {\n    if (!hpProductPanelInner || !hpProductPanel || window.innerWidth <= 980) {\n      hpProductPanelInner?.style.setProperty('--hp-product-panel-offset', '0px');\n      hpProductPanelInner?.style.removeProperty('--hp-product-panel-available');\n      hpProductPanelInner?.style.removeProperty('--hp-product-panel-viewport');\n      return;\n    }\n\n    // Native scrolling uses CSS sticky. In transform SmoothScroll mode we mimic\n    // it explicitly: follow the viewport, then clamp at the REAL footer top.\n    const pageY = HP.smoothActive ? HP.currentY : window.scrollY;\n    let offset = 0;\n    if (HP.smoothActive) {\n      const desired = Math.max(0, pageY - hpProductPanelTop);\n      offset = Math.min(hpProductPanelMax, desired);\n    }\n    hpProductPanelInner.style.setProperty('--hp-product-panel-offset', `${offset}px`);\n    hpProductPanelInner.style.removeProperty('--hp-product-panel-available');\n\n    // V22.029 \u2014 when the panel contains more content than its visible sticky box\n    // (most noticeably with DETAILS open), use the final page travel to reveal that\n    // hidden lower content. This makes the panel itself appear to lift upward as the\n    // footer arrives instead of leaving the top of DETAILS parked above a black tail.\n    const maxInnerScroll = Math.max(0, hpProductPanelInner.scrollHeight - hpProductPanelInner.clientHeight);\n\n    // Accordion animation owns the panel viewport for ~340ms. This is the key\n    // stability rule: the footer handoff never competes with a moving accordion.\n    if (hpProductAccordionTxn) {\n      hpStabilizeProductAccordionTxn();\n      return;\n    }\n\n    if (options.skipInner) return;\n\n    const handoffRange = Math.max(1, hpProductPanelPageEnd - hpProductPanelHandoffStart);\n    const rawProgress = (pageY - hpProductPanelHandoffStart) / handoffRange;\n    const progress = Math.max(0, Math.min(1, rawProgress));\n\n    if (maxInnerScroll > 1 && progress > 0) {\n      if (!hpProductPanelFooterScrollActive) {\n        hpProductPanelFooterScrollActive = true;\n        hpProductPanelFooterScrollStart = Math.min(maxInnerScroll, hpProductPanelInner.scrollTop);\n      }\n      const eased = progress * progress * (3 - 2 * progress);\n      const targetScroll = hpProductPanelFooterScrollStart + (maxInnerScroll - hpProductPanelFooterScrollStart) * eased;\n      hpProductPanelInner.scrollTop = targetScroll;\n    } else if (hpProductPanelFooterScrollActive && progress <= 0) {\n      hpProductPanelInner.scrollTop = Math.min(\n        Math.max(0, hpProductPanelFooterScrollStart),\n        Math.max(0, hpProductPanelInner.scrollHeight - hpProductPanelInner.clientHeight)\n      );\n      hpProductPanelFooterScrollActive = false;\n    }\n  };\n\n  const hpMeasureSmooth = () => {\n    if (!HP.smoothActive || !HP.scrollContainer) return;\n    const previousTransform = HP.scrollContainer.style.transform;\n    HP.scrollContainer.style.transform = 'translate3d(0,0,0)';\n    const height = Math.max(\n      HP.scrollContainer.scrollHeight,\n      Math.ceil(HP.scrollContainer.getBoundingClientRect().height)\n    );\n    document.body.style.height = `${height}px`;\n    HP.scrollContainer.style.transform = previousTransform;\n  };\n\n  const hpMeasureHeader = () => {\n    if (!HP.header) return;\n    if (HP.smoothActive && HP.scrollContainer) {\n      const old = HP.scrollContainer.style.transform;\n      HP.scrollContainer.style.transform = 'translate3d(0,0,0)';\n      HP.headerStart = HP.header.getBoundingClientRect().top;\n      HP.scrollContainer.style.transform = old;\n    } else {\n      HP.headerStart = HP.header.getBoundingClientRect().top + window.scrollY;\n    }\n  };\n\n  const hpCreateStickyClone = () => {\n    if (!HP.header || HP.stickyClone || !HP.header.classList.contains('hp-header--sticky')) return;\n    const clone = HP.header.cloneNode(true);\n    clone.removeAttribute('data-hp-header');\n    clone.classList.add('hp-sticky-clone');\n    clone.setAttribute('aria-hidden','true');\n    clone.querySelectorAll('[id]').forEach(el => el.removeAttribute('id'));\n    document.body.appendChild(clone);\n    HP.stickyClone = clone;\n  };\n\n  const hpDestroyStickyClone = () => {\n    HP.stickyClone?.remove();\n    HP.stickyClone = null;\n  };\n\n  let hpLastScrollY = window.scrollY;\n  let hpStickyVisible = false;\n  const hpUpdateSticky = () => {\n    if (!HP.header || !HP.header.classList.contains('hp-header--sticky')) return;\n\n    // Mobile: keep the real Shopify header section native-sticky. Never hand off to a clone.\n    if (window.matchMedia('(max-width: 900px)').matches) {\n      hpStickyVisible = false;\n      hpDestroyStickyClone();\n      HP.header.classList.remove('hp-header-hidden','hp-header-is-fixed','hp-sticky-enter');\n      return;\n    }\n\n    // V21.20 desktop: decide from the REAL header's current visual position, not from\n    // scrollY/currentY thresholds. This is critical when smooth-scroll translates the\n    // whole page: scroll position can be ahead of what is actually on screen and used\n    // to let the original header disappear before the clone arrived.\n    hpCreateStickyClone();\n    const rect = HP.header.getBoundingClientRect();\n    hpStickyVisible = rect.top <= 0;\n\n    HP.stickyClone?.classList.toggle('is-visible', hpStickyVisible);\n    HP.stickyClone?.setAttribute('aria-hidden', hpStickyVisible ? 'false' : 'true');\n    HP.stickyClone?.classList.remove('is-hidden-on-down');\n    HP.header.classList.remove('hp-header-hidden');\n    hpLastScrollY = window.scrollY;\n  };\n\n  const hpSmoothFrame = () => {\n    if (!HP.smoothActive || !HP.scrollContainer) return;\n    HP.targetY = window.scrollY;\n    HP.currentY += (HP.targetY - HP.currentY) * HP.ease;\n    if (Math.abs(HP.targetY - HP.currentY) < .08) HP.currentY = HP.targetY;\n    HP.scrollContainer.style.transform = `translate3d(0, ${-HP.currentY}px, 0)`;\n    hpUpdateSticky();\n    hpUpdateProductPanel();\n    hpCollectionRevealTick?.();\n    HP.raf = requestAnimationFrame(hpSmoothFrame);\n  };\n\n  const hpStopSmooth = () => {\n    if (HP.raf) cancelAnimationFrame(HP.raf);\n    HP.raf = 0;\n    HP.smoothActive = false;\n    HP.root.classList.remove('hp-smooth-active');\n    if (HP.scrollContainer) HP.scrollContainer.style.transform = '';\n    document.body.style.height = '';\n    hpDestroyStickyClone();\n  };\n\n  const hpStartSmooth = () => {\n    if (!HP.viewport || !HP.scrollContainer || HP.smoothActive) return;\n    HP.smoothActive = true;\n    HP.root.classList.add('hp-smooth-active');\n    HP.currentY = window.scrollY;\n    HP.targetY = HP.currentY;\n    hpMeasureSmooth();\n    hpMeasureHeader();\n    hpMeasureProductPanel();\n    hpUpdateSticky();\n    hpUpdateProductPanel();\n    HP.raf = requestAnimationFrame(hpSmoothFrame);\n  };\n\n  const hpRefreshMode = () => {\n    const settingEnabled = HP.root.dataset.smoothScroll === 'true';\n    const desktopOnly = HP.root.dataset.smoothScrollDesktopOnly === 'true';\n    const allowedDevice = (!desktopOnly || hpFinePointer.matches) && !HP.root.classList.contains('hp-tablet-mobile-ui');\n    const canUse = settingEnabled && allowedDevice && !hpReducedMotion.matches && !HP.designMode;\n\n    const rawEase = parseInt(HP.root.dataset.smoothScrollEase || '5', 10);\n    HP.ease = Math.min(.15, Math.max(.02, rawEase / 100));\n\n    if (canUse) hpStartSmooth();\n    else hpStopSmooth();\n\n    hpMeasureHeader();\n    hpUpdateSticky();\n  };\n\n  hpRefreshMode();\n  window.addEventListener('resize', () => {\n    hpRefreshMode();\n    hpMeasureSmooth();\n    hpMeasureProductPanel();\n    hpUpdateProductPanel();\n  }, { passive:true });\n  window.addEventListener('scroll', hpUpdateSticky, { passive:true });\n  window.addEventListener('scroll', hpUpdateProductPanel, { passive:true });\n  window.addEventListener('load', () => {\n    hpMeasureSmooth();\n    hpMeasureProductPanel();\n  }, { once:true });\n  document.fonts?.ready?.then(() => {\n    hpMeasureSmooth();\n    hpMeasureProductPanel();\n  });\n\n  // V22.029 \u2014 accordion state changes do NOT re-measure the PDP shell mid-transition.\n  // The panel is absolutely bounded by the gallery and its inner surface is the\n  // only scrollable area, so re-measuring sticky/footer geometry on every <details>\n  // toggle only introduces compositor jumps. Keep footer auto-scroll paused while\n  // a tab transaction settles and leave shell measurements untouched.\n  hpProductPanel?.querySelectorAll('.hp-product-info-accordion').forEach(details => {\n    details.addEventListener('toggle', () => {\n      hpProductPanelFooterScrollActive = false;\n    });\n  });\n\n  if ('ResizeObserver' in window && HP.scrollContainer) {\n    const hpResizeObserver = new ResizeObserver(() => {\n      hpMeasureSmooth();\n      hpMeasureProductPanel();\n      hpUpdateProductPanel();\n    });\n    hpResizeObserver.observe(HP.scrollContainer);\n    // V22.029: do not observe hpProductPanelInner. Accordion content changes its\n    // scrollHeight without changing the gallery/footer geometry; observing it caused\n    // repeated sticky re-measures and visible flashes during tab swaps.\n  }\n\n  // Product image loading animation.\n  const hpInitImageLoaders = (scope = document) => {\n    scope.querySelectorAll('.hp-product__image, .hp-product-media').forEach(box => {\n      if (box.dataset.hpLoaderBound === '1') return;\n      box.dataset.hpLoaderBound = '1';\n\n      const primary = box.querySelector('img');\n      if (!primary) return;\n\n      box.classList.add('hp-image-loading');\n      const finish = () => {\n        box.classList.remove('hp-image-loading');\n        box.classList.add('hp-image-loaded');\n        box.closest('.hp-product')?.classList.add('hp-image-card-ready');\n      };\n\n      if (primary.complete && primary.naturalWidth > 0) requestAnimationFrame(finish);\n      else {\n        primary.addEventListener('load', finish, { once:true });\n        primary.addEventListener('error', finish, { once:true });\n      }\n    });\n  };\n  hpInitImageLoaders();\n\n\n  /* V22.024 \u2014 Product gallery remains deterministic. DETAILS is closed by default,\n     the panel keeps one scroll surface, and the desktop footer handoff is anchored\n     to the real footer edge so the whole panel lifts upward at the end of the PDP. */\n\n  /* V21.103 \u2014 theme-wide image Blur + Reveal, including AJAX Search. */\n  const hpImageRevealSelector = [\n    '.viewport img',\n    '.hp-search img',\n    '.hp-mega img',\n    '.hp-cart-drawer img',\n    '.hp-mobile img'\n  ].join(',');\n\n  const hpShouldRevealImage = img => {\n    if (!img || img.nodeName !== 'IMG') return false;\n    if (img.matches('.hp-logo__image, .hp-product__image-secondary')) return false;\n    if (img.closest('.hp-logo, .hp-logo__visual, .hp-preloader')) return false;\n    return true;\n  };\n\n  const hpBindThemeImageReveal = (img, initialScan = false) => {\n    if (!hpShouldRevealImage(img) || img.dataset.hpThemeReveal === '1') return;\n    img.dataset.hpThemeReveal = '1';\n\n    /* Cached first-paint images must not be hidden AFTER they already rendered.\n       The page transition supplies their intro; dynamic/new images still reveal. */\n    if (initialScan && img.complete && img.naturalWidth > 0) {\n      img.classList.remove('hp-theme-image-loading', 'hp-theme-image-loaded');\n      img.classList.add('hp-theme-image-ready');\n      return;\n    }\n\n    img.classList.add('hp-theme-image-loading');\n\n    let finished = false;\n    const reveal = () => {\n      if (finished) return;\n      finished = true;\n      const commit = () => requestAnimationFrame(() => requestAnimationFrame(() => {\n        img.classList.remove('hp-theme-image-loading', 'hp-theme-image-ready');\n        img.classList.add('hp-theme-image-loaded');\n      }));\n      if (img.decode && img.naturalWidth > 0) img.decode().catch(() => {}).finally(commit);\n      else commit();\n    };\n\n    if (img.complete && img.naturalWidth > 0) reveal();\n    else {\n      img.addEventListener('load', reveal, { once:true });\n      img.addEventListener('error', reveal, { once:true });\n      window.setTimeout(reveal, 2200);\n    }\n  };\n\n  const hpInitThemeImageReveal = (scope = document, initialScan = false) => {\n    if (scope.matches?.('img')) hpBindThemeImageReveal(scope, initialScan);\n    scope.querySelectorAll?.(hpImageRevealSelector).forEach(img => hpBindThemeImageReveal(img, initialScan));\n  };\n\n  hpInitThemeImageReveal(document, true);\n\n  if ('MutationObserver' in window) {\n    const hpImageMutationObserver = new MutationObserver(mutations => {\n      mutations.forEach(mutation => mutation.addedNodes.forEach(node => {\n        if (node.nodeType === 1) hpInitThemeImageReveal(node, false);\n      }));\n    });\n    hpImageMutationObserver.observe(document.body, { childList:true, subtree:true });\n  }\n\n  // V21.22 \u2014 images should behave like interface artwork, not draggable files.\n  const hpLockImages = (scope = document) => {\n    scope.querySelectorAll('img').forEach(img => {\n      img.draggable = false;\n      img.setAttribute('draggable', 'false');\n    });\n  };\n  hpLockImages();\n  document.addEventListener('dragstart', event => {\n    // V21.24 \u2014 prevent browser ghost-drag for both imagery and links.\n    if (event.target?.closest?.('img, a, .hp-logo__visual')) event.preventDefault();\n  }, true);\n  document.addEventListener('shopify:section:load', event => {\n    hpInitImageLoaders(event.target);\n    hpLockImages(event.target);\n    hpCleanProductDescription?.(event.target);\n    hpMeasureSmooth();\n    hpMeasureHeader();\n    hpUpdateSticky();\n  });\n\n  // V22.020 \u2014 Shopify rich text can contain spacer-only paragraphs (<p><br></p>\n  // or &nbsp;) which make long product descriptions look much taller than the\n  // actual copy. Remove only paragraphs that have no meaningful text/media.\n  const hpCleanProductDescription = (scope = document) => {\n    scope.querySelectorAll('.hp-product-info-accordion--description .rte p').forEach(paragraph => {\n      const text = (paragraph.textContent || '').replace(/\\u00a0/g, ' ').trim();\n      const hasMeaningfulMedia = Boolean(paragraph.querySelector('img, video, iframe, svg, picture, table, a[href]'));\n      if (!text && !hasMeaningfulMedia) paragraph.remove();\n    });\n  };\n  hpCleanProductDescription(document);\n\n  // V22.030 \u2014 clean, anchored product-information accordions.\n  // Keeps the premium height + soft-fade motion, while one temporary\n  // viewport anchor prevents the whole panel from moving. At the footer the anchor\n  // switches to the panel bottom, so the remaining tabs stay visible at all times.\n  const hpInitAccordions = (scope = document) => {\n    const hpAccordionPadding = 18;\n    const hpAccordionDuration = 260;\n\n    const hpStyle = (content, name, value) => {\n      content.style.setProperty(name, value, 'important');\n    };\n\n    const hpCleanupAccordion = details => {\n      const content = details.querySelector('[data-hp-accordion-content]');\n      if (!content) return;\n      if (details._hpAccordionEnd) {\n        content.removeEventListener('transitionend', details._hpAccordionEnd);\n        details._hpAccordionEnd = null;\n      }\n      if (details._hpAccordionTimer) {\n        window.clearTimeout(details._hpAccordionTimer);\n        details._hpAccordionTimer = 0;\n      }\n    };\n\n    const hpFinishAccordion = (details, opening) => {\n      const content = details.querySelector('[data-hp-accordion-content]');\n      if (!content) return;\n      hpCleanupAccordion(details);\n\n      if (opening) {\n        details.open = true;\n        details.dataset.hpAccordionState = 'open';\n        hpStyle(content, 'height', 'auto');\n        hpStyle(content, 'padding-bottom', `${hpAccordionPadding}px`);\n        hpStyle(content, 'opacity', '1');\n        hpStyle(content, 'filter', 'none');\n      } else {\n        details.open = false;\n        details.dataset.hpAccordionState = 'closed';\n        hpStyle(content, 'height', '0px');\n        hpStyle(content, 'padding-bottom', '0px');\n        hpStyle(content, 'opacity', '0');\n        hpStyle(content, 'filter', 'none');\n      }\n    };\n\n    const hpAnimateAccordion = (details, opening) => new Promise(resolve => {\n      const content = details.querySelector('[data-hp-accordion-content]');\n      if (!content) {\n        resolve();\n        return;\n      }\n\n      hpCleanupAccordion(details);\n\n      if (opening) {\n        details.open = true;\n        details.dataset.hpAccordionState = 'opening';\n\n        // A true closed frame first, then animate to the measured content height.\n        hpStyle(content, 'height', '0px');\n        hpStyle(content, 'padding-bottom', '0px');\n        hpStyle(content, 'opacity', '0');\n        hpStyle(content, 'filter', 'none');\n        void content.offsetHeight;\n\n        requestAnimationFrame(() => {\n          const targetHeight = Math.max(0, content.scrollHeight) + hpAccordionPadding;\n          hpStyle(content, 'height', `${targetHeight}px`);\n          hpStyle(content, 'padding-bottom', `${hpAccordionPadding}px`);\n          hpStyle(content, 'opacity', '1');\n          hpStyle(content, 'filter', 'none');\n        });\n      } else {\n        if (!details.open) {\n          hpFinishAccordion(details, false);\n          resolve();\n          return;\n        }\n\n        details.dataset.hpAccordionState = 'closing';\n        const currentHeight = Math.max(0, content.getBoundingClientRect().height);\n        hpStyle(content, 'height', `${currentHeight}px`);\n        hpStyle(content, 'padding-bottom', getComputedStyle(content).paddingBottom || `${hpAccordionPadding}px`);\n        hpStyle(content, 'opacity', getComputedStyle(content).opacity || '1');\n        hpStyle(content, 'filter', 'none');\n        void content.offsetHeight;\n\n        requestAnimationFrame(() => {\n          hpStyle(content, 'height', '0px');\n          hpStyle(content, 'padding-bottom', '0px');\n          hpStyle(content, 'opacity', '0');\n          hpStyle(content, 'filter', 'none');\n        });\n      }\n\n      let finished = false;\n      const finish = event => {\n        if (finished) return;\n        if (event && (event.target !== content || event.propertyName !== 'height')) return;\n        finished = true;\n        hpFinishAccordion(details, opening);\n        resolve();\n      };\n\n      details._hpAccordionEnd = finish;\n      content.addEventListener('transitionend', finish);\n      details._hpAccordionTimer = window.setTimeout(() => finish(), hpAccordionDuration + 160);\n    });\n\n    scope.querySelectorAll('.hp-product-accordion').forEach(details => {\n      if (details.dataset.hpAccordionBound === '1') return;\n      const summary = details.querySelector('summary');\n      const content = details.querySelector('[data-hp-accordion-content]');\n      if (!summary || !content) return;\n\n      details.dataset.hpAccordionBound = '1';\n      hpFinishAccordion(details, details.open);\n\n      summary.addEventListener('click', event => {\n        event.preventDefault();\n\n        // Ignore repeat clicks for the few frames in which the group is already\n        // transitioning. This removes race conditions without changing the feel.\n        if (hpProductAccordionTxn) return;\n\n        const state = details.dataset.hpAccordionState || (details.open ? 'open' : 'closed');\n        const wantsClose = state === 'open' || state === 'opening';\n        const txn = hpBeginProductAccordionTxn(summary);\n        const animations = [];\n\n        if (wantsClose) {\n          animations.push(hpAnimateAccordion(details, false));\n        } else {\n          const group = details.closest('.hp-product-info-accordions');\n          if (group) {\n            group.querySelectorAll('.hp-product-info-accordion').forEach(other => {\n              if (other === details) return;\n              const otherState = other.dataset.hpAccordionState || (other.open ? 'open' : 'closed');\n              if (other.open || otherState === 'opening') {\n                animations.push(hpAnimateAccordion(other, false));\n              }\n            });\n          }\n          animations.push(hpAnimateAccordion(details, true));\n        }\n\n        Promise.all(animations).then(() => hpEndProductAccordionTxn(txn));\n      });\n    });\n  };\n  hpInitAccordions();\n\n  // ========================================================\n  // V21.116 - deterministic page transition controller\n  // ========================================================\n  const hpTransitionStyle = HP.root.dataset.pageTransition;\n  const hpTransitionEnabled =\n    HP.root.dataset.pageTransitionEnabled === 'true' &&\n    hpTransitionStyle !== 'none' &&\n    !HP.designMode;\n  const hpIntroEnabled = HP.root.dataset.pageTransitionIntro === 'true';\n  const hpOutroEnabled = HP.root.dataset.pageTransitionOutro === 'true';\n  const hpTransitionDuration = Math.max(\n    150,\n    parseInt(HP.root.dataset.pageTransitionDuration || '400', 10)\n  );\n  const hpTransitionStage = document.querySelector('[data-page-transition-stage]');\n\n  const hpAfterPaint = callback => {\n    requestAnimationFrame(() => requestAnimationFrame(callback));\n  };\n\n  const hpRunStageTransition = mutate => new Promise(resolve => {\n    if (!hpTransitionStage || hpReducedMotion.matches) {\n      mutate();\n      hpAfterPaint(resolve);\n      return;\n    }\n\n    let settled = false;\n    let timer = 0;\n\n    const finish = () => {\n      if (settled) return;\n      settled = true;\n      window.clearTimeout(timer);\n      hpTransitionStage.removeEventListener('transitionend', onEnd);\n      hpAfterPaint(resolve);\n    };\n\n    const onEnd = event => {\n      if (event.target !== hpTransitionStage) return;\n      if (!['opacity', 'filter', 'transform'].includes(event.propertyName)) return;\n      finish();\n    };\n\n    hpTransitionStage.addEventListener('transitionend', onEnd);\n    timer = window.setTimeout(finish, hpTransitionDuration + 220);\n\n    void hpTransitionStage.offsetWidth;\n    mutate();\n  });\n\n  if (hpTransitionEnabled) {\n    if (hpIntroEnabled) {\n      hpAfterPaint(async () => {\n        const hpIsMobileTransition = window.matchMedia('(max-width:899px)').matches || HP.root.classList.contains('hp-tablet-mobile-ui');\n\n        HP.root.classList.add('hp-page-transition-running');\n        if (hpIsMobileTransition) HP.root.classList.add('hp-mobile-enter-settling');\n\n        await hpRunStageTransition(() => {\n          HP.root.classList.remove('hp-page-entering', 'hp-page-leaving');\n          HP.root.classList.add('hp-page-ready');\n        });\n\n        hpAfterPaint(() => {\n          HP.root.classList.remove('hp-page-transition-running', 'hp-mobile-enter-settling');\n        });\n      });\n    } else {\n      HP.root.classList.remove('hp-page-entering', 'hp-page-leaving');\n      HP.root.classList.add('hp-page-ready');\n    }\n\n    const hpCanTransition = (link, event) => {\n      if (!hpOutroEnabled || !link || event.defaultPrevented) return false;\n      if (event.target?.closest?.('[data-hp-card-quick-add]')) return false;\n      if (event.button && event.button !== 0) return false;\n      if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return false;\n      if (link.target && link.target !== '_self') return false;\n      if (link.hasAttribute('download')) return false;\n\n      const href = link.getAttribute('href') || '';\n      if (!href || href.startsWith('#') || href.startsWith('mailto:') ||\n          href.startsWith('tel:') || href.startsWith('javascript:')) return false;\n\n      const url = new URL(link.href, window.location.href);\n      if (url.origin !== window.location.origin) return false;\n      if (\n        url.pathname === window.location.pathname &&\n        url.search === window.location.search &&\n        url.hash\n      ) return false;\n\n      return true;\n    };\n\n    let hpTransitionNavigating = false;\n\n    document.addEventListener('click', event => {\n      const link = event.target.closest('a[href]');\n      if (!hpCanTransition(link, event) || hpTransitionNavigating) return;\n\n      hpTransitionNavigating = true;\n      event.preventDefault();\n      event.stopImmediatePropagation();\n\n      const targetHref = link.href;\n      const hpLeavingMega = document.querySelector('[data-mega-root].is-open');\n      if (hpLeavingMega) hpLeavingMega.classList.add('is-page-leaving');\n\n      if (HP.scrollContainer && HP.smoothActive) {\n        HP.scrollContainer.style.transform = `translate3d(0, ${-HP.currentY}px, 0)`;\n      }\n\n      HP.root.classList.add('hp-page-transition-running');\n\n      hpRunStageTransition(() => {\n        HP.root.classList.remove('hp-page-ready', 'hp-page-entering');\n        HP.root.classList.add('hp-page-leaving');\n      }).then(() => {\n        window.location.assign(targetHref);\n      });\n    }, true);\n\n    /* pageshow fires on normal loads too. Only BFCache restores should\n       normalize transition classes; normal loads must finish their intro. */\n    window.addEventListener('pageshow', event => {\n      if (!event.persisted) return;\n\n      hpTransitionNavigating = false;\n      HP.root.classList.remove(\n        'hp-page-entering',\n        'hp-page-leaving',\n        'hp-mobile-enter-settling',\n        'hp-page-transition-running'\n      );\n      document.querySelector('[data-mega-root]')?.classList.remove('is-page-leaving');\n      HP.root.classList.add('hp-page-ready');\n    });\n  }\n\n\n  // V21.133 \u2014 mobile-stable Size Guide.\n  // Root fixes:\n  // 1) preserve the header's exact layout space while its real node is portalled;\n  // 2) snapshot/restore the page scroll frame;\n  // 3) never auto-focus CLOSE on touch devices, removing the blue focus mark.\n  const hpInitProductExtrasV21133 = (scope = document) => {\n    try {\n      const guides = Array.from(scope.querySelectorAll?.('[data-size-guide-v3]') || []);\n\n      guides.forEach(guide => {\n        if (guide.dataset.hpGuideV3Bound === '1') return;\n        guide.dataset.hpGuideV3Bound = '1';\n\n        // Keep the popup outside the transformed page tree.\n        if (guide.parentElement !== document.body) {\n          document.body.appendChild(guide);\n        }\n\n        const openers = Array.from(document.querySelectorAll('[data-size-guide-open]'));\n        const closers = Array.from(guide.querySelectorAll('[data-size-guide-close-v3]'));\n        const card = guide.querySelector('.hp-size-guide-v3__card');\n\n        let previousFocus = null;\n        let closeTimer = 0;\n        let isClosing = false;\n        let hpHeaderPortal = null;\n\n        const hpCaptureScrollFrame = () => ({\n          windowY: window.scrollY,\n          currentY: Number.isFinite(HP.currentY) ? HP.currentY : window.scrollY,\n          targetY: Number.isFinite(HP.targetY) ? HP.targetY : window.scrollY,\n          transform: HP.scrollContainer?.style.transform || ''\n        });\n\n        const hpRestoreScrollFrame = snapshot => {\n          if (!snapshot) return;\n\n          // Never let the header portal alter the page's perceived Y position.\n          if (Math.abs(window.scrollY - snapshot.windowY) > 0.5) {\n            window.scrollTo(0, snapshot.windowY);\n          }\n\n          if (HP.smoothActive && HP.scrollContainer) {\n            HP.currentY = snapshot.currentY;\n            HP.targetY = snapshot.targetY;\n            HP.scrollContainer.style.transform =\n              `translate3d(0, ${-snapshot.currentY}px, 0)`;\n          }\n        };\n\n        const hpPortalMobileHeader = () => {\n          if (!window.matchMedia('(max-width:767px)').matches) return;\n          if (hpHeaderPortal) return;\n\n          const headerSection = document.querySelector('#shopify-section-header');\n          if (!headerSection || headerSection.dataset.hpSizeGuidePortalled === '1') return;\n\n          const rect = headerSection.getBoundingClientRect();\n          const computed = window.getComputedStyle(headerSection);\n          const snapshot = hpCaptureScrollFrame();\n\n          // A real element placeholder preserves layout height.\n          // The old Comment placeholder had zero height and caused the page\n          // to visibly move by roughly the header height in the supplied video.\n          const placeholder = document.createElement('div');\n          placeholder.className = 'hp-size-guide-header-placeholder';\n          placeholder.setAttribute('aria-hidden', 'true');\n          placeholder.style.height = `${Math.max(1, Math.round(rect.height))}px`;\n          placeholder.style.minHeight = `${Math.max(1, Math.round(rect.height))}px`;\n          placeholder.style.width = '100%';\n          placeholder.style.flex = `0 0 ${Math.max(1, Math.round(rect.height))}px`;\n          placeholder.style.marginTop = computed.marginTop;\n          placeholder.style.marginBottom = computed.marginBottom;\n\n          headerSection.parentNode?.insertBefore(placeholder, headerSection);\n\n          headerSection.dataset.hpSizeGuidePortalled = '1';\n          headerSection.style.setProperty(\n            '--hp-size-guide-header-height',\n            `${Math.max(1, Math.round(rect.height))}px`\n          );\n\n          document.body.appendChild(headerSection);\n          headerSection.classList.add('hp-size-guide-header-portal');\n\n          hpHeaderPortal = {\n            header: headerSection,\n            placeholder,\n            snapshot\n          };\n\n          // Keep the exact visual frame after the DOM move.\n          hpRestoreScrollFrame(snapshot);\n        };\n\n        const hpRestoreMobileHeader = () => {\n          if (!hpHeaderPortal) return;\n\n          const { header, placeholder, snapshot } = hpHeaderPortal;\n\n          // Atomic swap: no intermediate frame with missing/duplicated height.\n          if (placeholder?.parentNode) {\n            placeholder.parentNode.replaceChild(header, placeholder);\n          }\n\n          header.classList.remove('hp-size-guide-header-portal');\n          header.removeAttribute('data-hp-size-guide-portalled');\n          header.style.removeProperty('--hp-size-guide-header-height');\n\n          hpHeaderPortal = null;\n\n          hpRestoreScrollFrame(snapshot);\n\n          requestAnimationFrame(() => {\n            hpRestoreScrollFrame(snapshot);\n            hpMeasureHeader();\n            hpMeasureSmooth();\n            hpUpdateSticky();\n          });\n        };\n\n        const finishClose = () => {\n          if (!isClosing) return;\n\n          isClosing = false;\n          window.clearTimeout(closeTimer);\n          guide.classList.remove('is-closing');\n          guide.setAttribute('aria-hidden', 'true');\n          HP.root.classList.remove('hp-size-guide-v3-open');\n          card?.removeEventListener('transitionend', onCloseEnd);\n\n          // Restore the real header only after the reverse animation is done.\n          hpRestoreMobileHeader();\n\n          // On mobile/touch, do NOT focus the opener again.\n          // iOS/Chrome can scroll a focused control into view, which was the\n          // second source of the \"page moved\" feeling in the video.\n          if (window.matchMedia('(pointer:fine)').matches && previousFocus?.isConnected) {\n            previousFocus.focus?.({ preventScroll:true });\n          }\n        };\n\n        const onCloseEnd = event => {\n          if (event.target !== card || event.propertyName !== 'transform') return;\n          finishClose();\n        };\n\n        const openGuide = () => {\n          window.clearTimeout(closeTimer);\n          isClosing = false;\n          card?.removeEventListener('transitionend', onCloseEnd);\n\n          previousFocus = document.activeElement;\n\n          if (card) {\n            card.scrollTop = 0;\n          }\n\n          hpPortalMobileHeader();\n\n          guide.classList.remove('is-closing');\n          guide.setAttribute('aria-hidden', 'false');\n          HP.root.classList.add('hp-size-guide-v3-open');\n\n          // Commit hidden frame -> animate in.\n          // Deliberately no closeButton.focus() here:\n          // it was creating the blue rectangle seen around CLOSE in the video.\n          void guide.offsetWidth;\n          requestAnimationFrame(() => {\n            guide.classList.add('is-open');\n          });\n        };\n\n        const closeGuide = () => {\n          if (!guide.classList.contains('is-open') || isClosing) return;\n\n          isClosing = true;\n          guide.classList.add('is-closing');\n          guide.classList.remove('is-open');\n\n          if (card) {\n            card.addEventListener('transitionend', onCloseEnd);\n          }\n\n          closeTimer = window.setTimeout(finishClose, 620);\n        };\n\n        openers.forEach(button => {\n          if (button.dataset.hpSizeGuideOpenBound === '1') return;\n          button.dataset.hpSizeGuideOpenBound = '1';\n          button.addEventListener('click', openGuide);\n        });\n\n        closers.forEach(button => {\n          if (button.dataset.hpSizeGuideCloseBound === '1') return;\n          button.dataset.hpSizeGuideCloseBound = '1';\n          button.addEventListener('click', closeGuide);\n        });\n\n        guide.addEventListener('keydown', event => {\n          if (event.key === 'Escape') closeGuide();\n        });\n\n        window.addEventListener('resize', () => {\n          if (!guide.classList.contains('is-open') &&\n              !guide.classList.contains('is-closing')) return;\n\n          if (window.matchMedia('(max-width:767px)').matches) {\n            hpPortalMobileHeader();\n          } else {\n            hpRestoreMobileHeader();\n          }\n        }, { passive:true });\n      });\n    } catch (error) {\n      console.warn('[HIDE PROJECT] Product size guide:', error);\n    }\n  };\n\n  hpInitProductExtrasV21133();\n\n  document.addEventListener('shopify:section:load', event => {\n    hpInitProductExtrasV21133(event.target);\n  });\n\n\n\n\n  // Theme Editor section reload support.\n  document.addEventListener('shopify:section:load', event => {\n    hpInitImageLoaders(event.target);\n    hpInitAccordions(event.target);\n    hpMeasureSmooth();\n    hpMeasureProductPanel();\n  });\n\n  // Mobile/touch product size preview:\n  // first tap reveals sizes, second tap follows the product link.\n  if (window.matchMedia('(hover: none), (pointer: coarse)').matches) {\n    const touchCards = Array.from(document.querySelectorAll('.hp-product'));\n    touchCards.forEach(card => {\n      const sizes = card.querySelector('.hp-product__sizes-row');\n      if (!sizes) return;\n\n      card.addEventListener('click', event => {\n        if (!card.classList.contains('is-touch-preview')) {\n          event.preventDefault();\n          touchCards.forEach(other => {\n            if (other !== card) other.classList.remove('is-touch-preview');\n          });\n          card.classList.add('is-touch-preview');\n        }\n      });\n    });\n\n    document.addEventListener('click', event => {\n      if (!event.target.closest('.hp-product')) {\n        touchCards.forEach(card => card.classList.remove('is-touch-preview'));\n      }\n    });\n  }\n\n\n  // Hero background video performance controller V23\n  // Only the visible video in the active slide is allowed to decode/play.\n  // Other hero videos stay paused and at metadata preload to avoid CPU/GPU,\n  // memory and bandwidth contention on desktop and especially iOS Safari.\n  (() => {\n    const allVideos = Array.from(document.querySelectorAll('[data-hp-hero-video]'));\n    if (!allVideos.length) return;\n\n    const isRenderable = (video) => {\n      const wrap = video.closest('.hp-hero-slide__video');\n      if (!wrap) return true;\n      return getComputedStyle(wrap).display !== 'none';\n    };\n\n    const setVisible = (video, visible) => {\n      const wrap = video.closest('.hp-hero-slide__video');\n      video.classList.toggle('is-video-visible', visible);\n      if (wrap) wrap.classList.toggle('is-video-visible', visible);\n    };\n\n    const prepare = (video) => {\n      if (video.dataset.hpHeroPrepared === 'true') return;\n\n      video.muted = true;\n      video.defaultMuted = true;\n      video.playsInline = true;\n      video.loop = true;\n      video.setAttribute('muted', '');\n      video.setAttribute('playsinline', '');\n      video.setAttribute('webkit-playsinline', '');\n      video.disablePictureInPicture = true;\n      video.setAttribute('disablepictureinpicture', '');\n      // Do not let Safari/Shopify flash a poster frame before playback.\n      video.poster = '';\n      video.removeAttribute('poster');\n\n      const markReady = () => video.classList.add('is-video-ready');\n      if (video.readyState >= 2) markReady();\n      else {\n        video.addEventListener('loadeddata', markReady, { once:true });\n        video.addEventListener('canplay', markReady, { once:true });\n      }\n\n      const reveal = () => setVisible(video, true);\n      video.addEventListener('playing', reveal);\n      video.addEventListener('canplay', () => {\n        if (!video.paused && !document.hidden) reveal();\n      });\n      video.addEventListener('pause', () => setVisible(video, false));\n      video.addEventListener('emptied', () => setVisible(video, false));\n      video.dataset.hpHeroPrepared = 'true';\n    };\n\n    const pauseVideo = (video, coolDown = true) => {\n      try { video.pause(); } catch (_) {}\n      video.classList.remove('is-video-playing');\n      setVisible(video, false);\n      if (coolDown) video.preload = 'metadata';\n    };\n\n    const requestPlay = (video) => {\n      if (!isRenderable(video) || document.hidden) return;\n      prepare(video);\n      video.preload = 'auto';\n      const promise = video.play();\n      if (promise && typeof promise.then === 'function') {\n        promise.then(() => {\n          video.classList.add('is-video-playing');\n          setVisible(video, true);\n        }).catch(() => {\n          setVisible(video, false);\n        });\n      } else if (!video.paused) {\n        setVisible(video, true);\n      }\n    };\n\n    const visibleVideosIn = (slide) => {\n      if (!slide) return [];\n      return Array.from(slide.querySelectorAll('[data-hp-hero-video]')).filter(isRenderable);\n    };\n\n    const warmNext = (slider, activeSlide) => {\n      if (!slider) return;\n      const slides = Array.from(slider.querySelectorAll('[data-hero-slide]'));\n      const idx = slides.indexOf(activeSlide);\n      if (idx < 0 || slides.length < 2) return;\n      const nextSlide = slides[(idx + 1) % slides.length];\n      visibleVideosIn(nextSlide).forEach(video => {\n        prepare(video);\n        // Metadata keeps the browser aware of the source without decoding it.\n        video.preload = 'metadata';\n      });\n    };\n\n    const syncSlider = (slider) => {\n      if (!slider) return;\n      const activeSlide = slider.querySelector('[data-hero-slide].is-active');\n      const activeVideos = new Set(visibleVideosIn(activeSlide));\n\n      slider.querySelectorAll('[data-hp-hero-video]').forEach(video => {\n        if (activeVideos.has(video)) requestPlay(video);\n        else pauseVideo(video, true);\n      });\n      warmNext(slider, activeSlide);\n    };\n\n    const syncAll = () => {\n      document.querySelectorAll('[data-hero-slider]').forEach(syncSlider);\n    };\n\n    allVideos.forEach(video => {\n      prepare(video);\n      setVisible(video, false);\n      video.autoplay = false;\n      video.removeAttribute('autoplay');\n      video.preload = 'metadata';\n    });\n\n    window.HPHeroVideo = { syncSlider, syncAll, requestPlay, pauseVideo };\n\n    // Start as early as possible but only for the active/renderable video.\n    syncAll();\n    requestAnimationFrame(syncAll);\n    window.addEventListener('load', syncAll, { once:true });\n    window.addEventListener('pageshow', syncAll);\n\n    // Pause video decoding when the tab is hidden, resume only the active one.\n    document.addEventListener('visibilitychange', () => {\n      if (document.hidden) allVideos.forEach(video => pauseVideo(video, false));\n      else syncAll();\n    });\n\n    // Stop decoding heroes that are far outside the viewport.\n    if ('IntersectionObserver' in window) {\n      const observer = new IntersectionObserver(entries => {\n        entries.forEach(entry => {\n          const slider = entry.target;\n          if (entry.isIntersecting) syncSlider(slider);\n          else slider.querySelectorAll('[data-hp-hero-video]').forEach(video => pauseVideo(video, false));\n        });\n      }, { rootMargin:'120px 0px', threshold:0.01 });\n      document.querySelectorAll('[data-hero-slider]').forEach(slider => observer.observe(slider));\n    }\n\n    // Re-evaluate desktop/mobile source when viewport class changes.\n    let resizeTimer = null;\n    window.addEventListener('resize', () => {\n      clearTimeout(resizeTimer);\n      resizeTimer = setTimeout(syncAll, 120);\n    }, { passive:true });\n\n    // iOS Low Power Mode can block autoplay. A user gesture is the earliest\n    // standards-compliant unlock; only the currently active video is retried.\n    const unlock = () => syncAll();\n    ['touchstart','pointerdown','click','keydown'].forEach(type =>\n      document.addEventListener(type, unlock, { capture:true, passive:true, once:true })\n    );\n  })();\n\n  // Hero slider V11\n  document.querySelectorAll('[data-hero-slider]').forEach(slider => {\n    const slides = Array.from(slider.querySelectorAll('[data-hero-slide]'));\n    const count = slides.length;\n    if (count <= 1) return;\n\n    const prev = slider.querySelector('[data-hero-prev]');\n    const next = slider.querySelector('[data-hero-next]');\n    const dots = Array.from(slider.querySelectorAll('[data-hero-dot]'));\n    const currentEl = slider.querySelector('[data-hero-current]');\n    const autoplay = slider.dataset.autoplay === 'true';\n    const pauseHover = slider.dataset.pauseHover === 'true';\n    const delay = Math.max(2000, parseInt(slider.dataset.delay || '6000', 10));\n    const speed = Math.max(250, parseInt(slider.dataset.speed || '650', 10));\n\n    let index = 0;\n    let timer = null;\n\n    const formatIndex = i => String(i + 1).padStart(2, '0');\n\n    const go = (newIndex) => {\n      newIndex = (newIndex + count) % count;\n      if (newIndex === index) return;\n\n      const old = slides[index];\n      const nextSlide = slides[newIndex];\n\n      old.classList.add('was-active');\n      old.classList.remove('is-active');\n      old.setAttribute('aria-hidden', 'true');\n\n      nextSlide.classList.remove('was-active');\n      nextSlide.classList.add('is-active');\n      nextSlide.setAttribute('aria-hidden', 'false');\n\n      dots.forEach((dot, i) => dot.classList.toggle('is-active', i === newIndex));\n      if (currentEl) currentEl.textContent = formatIndex(newIndex);\n\n      setTimeout(() => old.classList.remove('was-active'), speed + 50);\n      index = newIndex;\n\n      // Keep video decoding limited to the newly-active slide.\n      window.HPHeroVideo?.syncSlider(slider);\n    };\n\n    const stop = () => {\n      if (timer) clearInterval(timer);\n      timer = null;\n    };\n\n    const start = () => {\n      stop();\n      if (autoplay) timer = setInterval(() => go(index + 1), delay);\n    };\n\n    prev?.addEventListener('click', () => { go(index - 1); start(); });\n    next?.addEventListener('click', () => { go(index + 1); start(); });\n    dots.forEach((dot, i) => dot.addEventListener('click', () => { go(i); start(); }));\n\n    // V21.10 \u2014 mobile/touch swipe. Vertical page scrolling remains native; only a\n    // deliberate horizontal gesture changes the hero slide.\n    let touchStartX = 0;\n    let touchStartY = 0;\n    let touchStartTime = 0;\n    slider.addEventListener('touchstart', event => {\n      const touch = event.touches && event.touches[0];\n      if (!touch) return;\n      touchStartX = touch.clientX;\n      touchStartY = touch.clientY;\n      touchStartTime = performance.now();\n      if (pauseHover) stop();\n    }, { passive:true });\n    slider.addEventListener('touchend', event => {\n      const touch = event.changedTouches && event.changedTouches[0];\n      if (!touch) { start(); return; }\n      const dx = touch.clientX - touchStartX;\n      const dy = touch.clientY - touchStartY;\n      const elapsed = performance.now() - touchStartTime;\n      const horizontal = Math.abs(dx) >= 42 && Math.abs(dx) > Math.abs(dy) * 1.15;\n      if (horizontal && elapsed < 900) go(dx < 0 ? index + 1 : index - 1);\n      start();\n    }, { passive:true });\n    slider.addEventListener('touchcancel', start, { passive:true });\n\n    if (pauseHover) {\n      slider.addEventListener('mouseenter', stop);\n      slider.addEventListener('mouseleave', start);\n    }\n\n    window.HPHeroVideo?.syncSlider(slider);\n    start();\n  });\n\n\n\n\n  // Collection controls\n  const collectionRoot = document.querySelector('[data-collection-root]');\n  if (collectionRoot) {\n    const filterPanel = collectionRoot.querySelector('[data-filter-panel]');\n    const filterToggle = collectionRoot.querySelector('[data-filter-toggle]');\n    let hpFilterAnimation = null;\n\n    const setFilterPanelOpen = (open) => {\n      if (!filterPanel || !filterToggle) return;\n      hpFilterAnimation?.cancel();\n      hpFilterAnimation = null;\n\n      filterPanel.classList.toggle('is-open', open);\n      filterToggle.setAttribute('aria-expanded', open ? 'true' : 'false');\n      filterToggle.classList.toggle('is-open', open);\n\n      // The panel now uses an interpolated CSS grid row instead of animating\n      // pixel heights in JavaScript. That avoids the close-frame hitch caused\n      // by scrollHeight/layout reads on large filter sets.\n      const onEnd = event => {\n        if (event.target !== filterPanel || event.propertyName !== 'grid-template-rows') return;\n        filterPanel.removeEventListener('transitionend', onEnd);\n        hpMeasureSmooth();\n      };\n      filterPanel.addEventListener('transitionend', onEnd);\n      requestAnimationFrame(hpMeasureSmooth);\n    };\n\n    filterToggle?.addEventListener('click', () => {\n      setFilterPanelOpen(!filterPanel.classList.contains('is-open'));\n    });\n\n    const collectionGrid = collectionRoot.querySelector('[data-collection-grid]');\n    const layoutButtons = [...collectionRoot.querySelectorAll('[data-grid-cols]')];\n\n    /* V22.007 \u2014 every collection card gets the same reveal, not only the\n       cards visible during the first native scroll event. This is intentionally\n       rect-based so it stays correct with the transform smooth-scroll system. */\n    const hpCollectionRevealPending = new Set();\n    let hpCollectionRevealRaf = 0;\n\n    const hpCollectionRevealCheck = () => {\n      if (!hpCollectionRevealPending.size) return;\n      const viewportHeight = window.innerHeight || document.documentElement.clientHeight || 0;\n      const revealLine = viewportHeight * .94;\n      const gridCards = collectionGrid ? [...collectionGrid.children].filter(el => el.matches?.('.hp-product')) : [];\n      const gridTemplate = collectionGrid ? getComputedStyle(collectionGrid).gridTemplateColumns : '';\n      const columnCount = Math.max(1, gridTemplate.split(/\\s+/).filter(Boolean).length || 1);\n      const stagger = collectionRoot.classList.contains('hp-collection-stagger');\n\n      hpCollectionRevealPending.forEach(card => {\n        if (!card.isConnected) {\n          hpCollectionRevealPending.delete(card);\n          return;\n        }\n        const rect = card.getBoundingClientRect();\n        if (rect.top <= revealLine && rect.bottom >= 0) {\n          const index = Math.max(0, gridCards.indexOf(card));\n          card.style.setProperty('--hp-collection-reveal-delay', stagger ? `${(index % columnCount) * 42}ms` : '0ms');\n          card.classList.add('is-collection-revealed', 'visible');\n          hpCollectionRevealPending.delete(card);\n        }\n      });\n    };\n\n    const hpScheduleCollectionRevealCheck = () => {\n      if (hpCollectionRevealRaf) return;\n      hpCollectionRevealRaf = requestAnimationFrame(() => {\n        hpCollectionRevealRaf = 0;\n        hpCollectionRevealCheck();\n      });\n    };\n\n    const hpInitCollectionCardReveal = (scope = collectionGrid) => {\n      if (!scope) return;\n      const cards = [...scope.children].filter(el => el.matches?.('.hp-product'));\n      const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      cards.forEach(card => {\n        card.classList.add('hp-collection-reveal-v22007');\n        card.classList.remove('is-collection-revealed');\n        card.style.setProperty('--hp-collection-reveal-delay', '0ms');\n\n        if (reduced || collectionRoot.classList.contains('hp-collection-anim--none')) {\n          card.classList.add('is-collection-revealed', 'visible');\n        } else {\n          hpCollectionRevealPending.add(card);\n        }\n      });\n\n      hpScheduleCollectionRevealCheck();\n    };\n\n    hpCollectionRevealTick = hpCollectionRevealCheck;\n    window.addEventListener('scroll', hpScheduleCollectionRevealCheck, { passive:true });\n    window.addEventListener('resize', hpScheduleCollectionRevealCheck, { passive:true });\n    window.addEventListener('orientationchange', hpScheduleCollectionRevealCheck, { passive:true });\n    hpInitCollectionCardReveal();\n\n    /* V22.004 \u2014 iPad/tablet collection opens on the requested 5-column default,\n       while keeping every layout-switcher button functional afterwards. */\n    const hpApplyTabletCollectionDefault = () => {\n      if (!HP.root.classList.contains('hp-tablet-mobile-ui')) return;\n      if (collectionRoot.dataset.hpLayoutTouched === '1') return;\n      collectionRoot.style.setProperty('--prod-cols', '5');\n      collectionRoot.classList.remove('hp-collection-layout--compact','hp-collection-layout--editorial');\n      collectionRoot.classList.add('hp-collection-layout--standard');\n      layoutButtons.forEach(button => {\n        const active = button.dataset.gridCols === '5';\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', active ? 'true' : 'false');\n      });\n    };\n    hpApplyTabletCollectionDefault();\n    let hpTabletCollectionResizeTimer = 0;\n    window.addEventListener('resize', () => {\n      clearTimeout(hpTabletCollectionResizeTimer);\n      hpTabletCollectionResizeTimer = window.setTimeout(hpApplyTabletCollectionDefault, 90);\n    }, { passive:true });\n\n    const animateCollectionLayout = (applyLayout) => {\n      if (!collectionGrid) { applyLayout(); hpMeasureSmooth(); return; }\n\n      const cards = [...collectionGrid.children].filter(el => el.nodeType === 1);\n      if (!cards.length || window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n        applyLayout();\n        requestAnimationFrame(hpMeasureSmooth);\n        return;\n      }\n\n      /* V21.35 \u2014 restore the clean V21.31 FLIP reflow.\n         No motion-blur peak, no per-card timing differences, no disappear/reappear.\n         Every product stays visible and moves from its exact previous slot to the\n         new slot with one shared Blur + Reveal transition. */\n      const first = new Map(cards.map(card => [card, card.getBoundingClientRect()]));\n\n      cards.forEach(card => {\n        card.__hpLayoutAnimations?.forEach(anim => { try { anim.cancel(); } catch (_) {} });\n        card.__hpLayoutAnimations = [];\n        if (card.__hpLayoutTimer) {\n          clearTimeout(card.__hpLayoutTimer);\n          card.__hpLayoutTimer = null;\n        }\n        ['animation','transition','transform','transform-origin','filter','opacity','will-change','z-index'].forEach(prop => card.style.removeProperty(prop));\n      });\n\n      applyLayout();\n      void collectionGrid.offsetWidth;\n\n      const last = new Map(cards.map(card => [card, card.getBoundingClientRect()]));\n      const duration = 760;\n      const ease = 'cubic-bezier(.22,1,.36,1)';\n\n      cards.forEach(card => {\n        const a = first.get(card);\n        const b = last.get(card);\n        if (!a || !b || !b.width || !b.height) return;\n\n        const dx = a.left - b.left;\n        const dy = a.top - b.top;\n        const sx = a.width / b.width;\n        const sy = a.height / b.height;\n\n        card.style.setProperty('animation', 'none', 'important');\n        card.style.setProperty('transition', 'none', 'important');\n        card.style.setProperty('transform-origin', '0 0', 'important');\n        card.style.setProperty('transform', `translate3d(${dx}px, ${dy}px, 0) scale(${sx}, ${sy})`, 'important');\n        card.style.setProperty('filter', 'blur(7px)', 'important');\n        card.style.setProperty('opacity', '.88', 'important');\n        card.style.setProperty('will-change', 'transform, filter, opacity', 'important');\n        card.style.setProperty('z-index', '1', 'important');\n      });\n\n      requestAnimationFrame(() => {\n        requestAnimationFrame(() => {\n          cards.forEach(card => {\n            card.style.setProperty('transition', `transform ${duration}ms ${ease}, filter ${duration}ms ${ease}, opacity ${duration}ms ${ease}`, 'important');\n            card.style.setProperty('transform', 'translate3d(0,0,0) scale(1,1)', 'important');\n            card.style.setProperty('filter', 'blur(0)', 'important');\n            card.style.setProperty('opacity', '1', 'important');\n\n            card.__hpLayoutTimer = window.setTimeout(() => {\n              ['animation','transition','transform','transform-origin','filter','opacity','will-change','z-index'].forEach(prop => card.style.removeProperty(prop));\n              card.__hpLayoutTimer = null;\n            }, duration + 80);\n          });\n        });\n      });\n\n      // Re-measure the transformed smooth-scroll page once the grid settles.\n      window.setTimeout(() => {\n        hpMeasureSmooth();\n        if (HP.smoothActive && HP.scrollContainer) {\n          const oldTransform = HP.scrollContainer.style.transform;\n          HP.scrollContainer.style.transform = 'translate3d(0,0,0)';\n          const contentHeight = Math.max(HP.scrollContainer.scrollHeight, Math.ceil(HP.scrollContainer.getBoundingClientRect().height));\n          HP.scrollContainer.style.transform = oldTransform;\n          const maxY = Math.max(0, contentHeight - window.innerHeight);\n          if (window.scrollY > maxY) window.scrollTo(0, maxY);\n          HP.targetY = Math.min(HP.targetY, maxY);\n          HP.currentY = Math.min(HP.currentY, maxY);\n        }\n      }, duration + 90);\n    };\n\n    layoutButtons.forEach(button => {\n      button.addEventListener('click', () => {\n        collectionRoot.dataset.hpLayoutTouched = '1';\n        if (button.classList.contains('is-active')) return;\n        animateCollectionLayout(() => {\n          const cols = button.dataset.gridCols || '5';\n          collectionRoot.style.setProperty('--prod-cols', cols);\n          collectionRoot.classList.remove('hp-collection-layout--compact','hp-collection-layout--editorial');\n          collectionRoot.classList.add('hp-collection-layout--standard');\n          layoutButtons.forEach(b => {\n            const active = b === button;\n            b.classList.toggle('is-active', active);\n            b.setAttribute('aria-pressed', active ? 'true' : 'false');\n          });\n        });\n      });\n    });\n\n    document.querySelector('[data-footer-to-top]')?.addEventListener('click', event => {\n      event.preventDefault();\n      window.scrollTo({ top:0, behavior:'smooth' });\n    });\n\n    const customSort = collectionRoot.querySelector('[data-custom-sort]');\n    const nativeSort = collectionRoot.querySelector('[data-collection-sort]');\n    const sortTrigger = customSort?.querySelector('[data-sort-trigger]');\n    const sortMenu = customSort?.querySelector('[data-sort-menu]');\n\n    const closeSort = () => {\n      customSort?.classList.remove('is-open');\n      sortTrigger?.setAttribute('aria-expanded', 'false');\n    };\n\n    sortTrigger?.addEventListener('click', event => {\n      event.stopPropagation();\n      const nextOpen = !customSort.classList.contains('is-open');\n      customSort.classList.toggle('is-open', nextOpen);\n      sortTrigger.setAttribute('aria-expanded', nextOpen ? 'true' : 'false');\n    });\n\n    customSort?.querySelectorAll('[data-sort-option]').forEach(option => {\n      option.addEventListener('click', () => {\n        const value = option.dataset.sortValue;\n        if (!value) return;\n\n        if (nativeSort) nativeSort.value = value;\n        customSort.querySelectorAll('[data-sort-option]').forEach(item => {\n          const active = item === option;\n          item.classList.toggle('is-active', active);\n          item.setAttribute('aria-selected', active ? 'true' : 'false');\n        });\n        customSort.querySelector('[data-sort-label]').textContent = option.textContent.trim();\n        closeSort();\n\n        const url = new URL(window.location.href);\n        url.searchParams.set('sort_by', value);\n        window.location.assign(url.toString());\n      });\n    });\n\n    document.addEventListener('click', event => {\n      if (!event.target.closest('[data-custom-sort]')) closeSort();\n    });\n\n    document.addEventListener('keydown', event => {\n      if (event.key === 'Escape') closeSort();\n    });\n\n    // V21.19 \u2014 PREVIOUS / NEXT are true in-place collection navigation.\n    // The document/header/toolbar never reload or move; only grid + pager are swapped.\n    let hpCollectionPaging = false;\n    const hpWait = ms => new Promise(resolve => window.setTimeout(resolve, ms));\n\n    const hpFetchCollectionMarkup = async href => {\n      const requestUrl = new URL(href, window.location.href);\n      requestUrl.searchParams.set('_hp_collection', Date.now().toString());\n      const response = await fetch(requestUrl.href, {\n        method:'GET',\n        credentials:'same-origin',\n        cache:'no-store',\n        headers:{\n          'Accept':'text/html',\n          'X-Requested-With':'XMLHttpRequest'\n        }\n      });\n      if (!response.ok) throw new Error(`Collection request ${response.status}`);\n      const html = await response.text();\n      const doc = new DOMParser().parseFromString(html, 'text/html');\n      const nextRoot = doc.querySelector('[data-collection-root]');\n      const nextGrid = nextRoot?.querySelector('[data-collection-grid]');\n      if (!nextRoot || !nextGrid) throw new Error('Collection markup missing');\n      return { doc, nextRoot, nextGrid };\n    };\n\n    const hpSwapCollectionPage = async (href, push = true) => {\n      if (!href || hpCollectionPaging || !collectionGrid) return;\n      hpCollectionPaging = true;\n      collectionRoot.classList.add('is-page-loading');\n      const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      const oldCards = [...collectionGrid.children].filter(el => el.nodeType === 1);\n      const stableScrollY = window.scrollY;\n\n      try {\n        // Start the request immediately while the current cards blur away.\n        const request = hpFetchCollectionMarkup(href);\n        if (!reduced) {\n          oldCards.forEach((card, index) => {\n            card.getAnimations().forEach(anim => anim.cancel());\n            card.animate([\n              { opacity:1, filter:'blur(0px)', transform:'translate3d(0,0,0) scale(1)' },\n              { opacity:0, filter:'blur(11px)', transform:'translate3d(0,-5px,0) scale(.985)' }\n            ], {\n              duration:240,\n              delay:Math.min(index * 7, 70),\n              easing:'cubic-bezier(.4,0,1,1)',\n              fill:'forwards'\n            });\n          });\n        }\n\n        const [{ doc, nextRoot, nextGrid }] = await Promise.all([\n          request,\n          reduced ? Promise.resolve() : hpWait(250)\n        ]);\n\n        collectionGrid.innerHTML = nextGrid.innerHTML;\n\n        const currentPagination = collectionRoot.querySelector('.hp-pagination');\n        const nextPagination = nextRoot.querySelector('.hp-pagination');\n        if (currentPagination && nextPagination) currentPagination.replaceWith(nextPagination.cloneNode(true));\n        else if (currentPagination && !nextPagination) currentPagination.remove();\n        else if (!currentPagination && nextPagination) collectionGrid.insertAdjacentElement('afterend', nextPagination.cloneNode(true));\n\n        hpInitImageLoaders(collectionGrid);\n        const newCards = [...collectionGrid.children].filter(el => el.nodeType === 1);\n        newCards.forEach(card => card.getAnimations().forEach(anim => anim.cancel()));\n        hpInitCollectionCardReveal(collectionGrid);\n\n        const resolved = new URL(href, window.location.href);\n        if (push) history.pushState({ hpCollectionPage:true }, '', resolved.href);\n        if (doc.title) document.title = doc.title;\n\n        // Absolutely no page jump: keep the viewport exactly where it was.\n        if (Math.abs(window.scrollY - stableScrollY) > 1) window.scrollTo(0, stableScrollY);\n        hpMeasureSmooth();\n        hpMeasureProductPanel();\n      } catch (error) {\n        // Never fall back to document navigation: user asked for a fixed page shell.\n        console.error('[HIDE PROJECT] in-place collection pagination failed', error);\n        oldCards.forEach(card => {\n          card.getAnimations().forEach(anim => anim.cancel());\n          card.style.opacity = '';\n          card.style.filter = '';\n          card.style.transform = '';\n        });\n      } finally {\n        hpCollectionPaging = false;\n        collectionRoot.classList.remove('is-page-loading');\n      }\n    };\n\n    // Capture phase prevents any theme/app click handler from navigating first.\n    collectionRoot.addEventListener('click', event => {\n      const link = event.target.closest('.hp-pagination a');\n      if (!link || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n      event.preventDefault();\n      event.stopPropagation();\n      hpSwapCollectionPage(link.href, true);\n    }, true);\n\n    window.addEventListener('popstate', () => {\n      if (document.querySelector('[data-collection-root]')) hpSwapCollectionPage(window.location.href, false);\n    });\n  }\n\n\n\n  const preloader = document.querySelector('[data-preloader]');\n  if (preloader && preloader.dataset.preloaderOnce === 'true' && sessionStorage.getItem('hp_preloader_seen') === '1') { preloader.remove(); }\n  if (preloader && document.body.contains(preloader)) {\n    const minTime = parseInt(getComputedStyle(preloader).getPropertyValue('--pre-time')) || 900;\n    const started = performance.now();\n    let hidden = false;\n    const hide = () => {\n      if (hidden) return;\n      hidden = true;\n      const wait = Math.max(0, minTime - (performance.now() - started));\n      setTimeout(() => {\n        if (preloader.dataset.preloaderOnce === 'true') sessionStorage.setItem('hp_preloader_seen','1');\n        preloader.classList.add('done');\n        setTimeout(() => preloader.remove(), 650);\n      }, wait);\n    };\n    if (document.readyState === 'complete') hide();\n    else window.addEventListener('load', hide, { once: true });\n    setTimeout(hide, 3000);\n  }\n\n  const hero = document.querySelector('.hp-hero');\n  if (hero) requestAnimationFrame(() => hero.classList.add('ready'));\n\n  if ('IntersectionObserver' in window) {\n    const io = new IntersectionObserver(entries => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          entry.target.classList.add('visible');\n          io.unobserve(entry.target);\n        }\n      });\n    }, { threshold: .08 });\n    document.querySelectorAll('.hp-reveal').forEach(el => io.observe(el));\n  } else {\n    document.querySelectorAll('.hp-reveal').forEach(el => el.classList.add('visible'));\n  }\n\n  const ann = document.querySelector('[data-ann]');\n  document.querySelector('[data-ann-close]')?.addEventListener('click', () => ann?.remove());\n\n  const mobile = document.querySelector('[data-mobile]');\n  const openMobile = () => {\n    mobile?.classList.add('open');\n    document.body.classList.add('hp-mobile-menu-open');\n    document.documentElement.classList.add('hp-mobile-menu-open-root');\n  };\n  const closeMobile = () => {\n    mobile?.classList.remove('open');\n    document.body.classList.remove('hp-mobile-menu-open');\n    document.documentElement.classList.remove('hp-mobile-menu-open-root');\n  };\n  document.addEventListener('click', event => {\n    if (event.target.closest('[data-menu-open]')) {\n      event.preventDefault();\n      openMobile();\n      return;\n    }\n    if (event.target.closest('[data-menu-close]')) {\n      event.preventDefault();\n      closeMobile();\n    }\n  });\n  mobile?.querySelectorAll('a').forEach(a => a.addEventListener('click', closeMobile));\n\n  const drawer = document.querySelector('[data-cart-drawer]');\n  const overlay = document.querySelector('[data-cart-overlay]');\n  const body = document.querySelector('[data-cart-body]');\n  const foot = document.querySelector('[data-cart-foot]');\n  const subtotal = document.querySelector('[data-cart-subtotal]');\n  const cartRecs = document.querySelector('[data-cart-recs]');\n  const cartRecsTrack = document.querySelector('[data-cart-recs-track]');\n  const cartRecsPrev = document.querySelector('[data-cart-recs-prev]');\n  const cartRecsNext = document.querySelector('[data-cart-recs-next]');\n  const cartRecsToggle = document.querySelector('[data-cart-recs-toggle]');\n\n  // Shopify money formatter used by every live-cart render path.\n  // The previous build called `money(...)` without ever defining it.\n  // The cart mutation therefore succeeded on Shopify, then JS crashed while\n  // repainting the drawer \u2014 exactly why the change only appeared after refresh.\n  const money = (value) => {\n    const raw = value == null ? 0 : value;\n    let cents;\n\n    if (typeof raw === 'number' && Number.isFinite(raw)) {\n      cents = Math.round(raw);\n    } else {\n      const str = String(raw).trim();\n      // Ajax cart/recommendations use cents, while /products.json can return\n      // decimal strings such as \"13832.00\". Support both shapes.\n      cents = /^-?\\d+(?:\\.\\d+)?$/.test(str) && str.includes('.')\n        ? Math.round(parseFloat(str) * 100)\n        : Math.round(Number(str) || 0);\n    }\n\n    const format = window.HIDE_PROJECT?.moneyFormat || '${{amount}}';\n    const amount = (cents / 100).toLocaleString(undefined, {\n      minimumFractionDigits: cents % 100 ? 2 : 0,\n      maximumFractionDigits: 2\n    });\n\n    return String(format)\n      .replace(/\\{\\{\\s*amount_no_decimals_with_comma_separator\\s*\\}\\}/g, Math.round(cents / 100).toLocaleString().replace(/,/g, '.'))\n      .replace(/\\{\\{\\s*amount_no_decimals\\s*\\}\\}/g, Math.round(cents / 100).toLocaleString())\n      .replace(/\\{\\{\\s*amount_with_comma_separator\\s*\\}\\}/g, amount.replace(/,/g, 'X').replace(/\\./g, ',').replace(/X/g, '.'))\n      .replace(/\\{\\{\\s*amount\\s*\\}\\}/g, amount);\n  };\n\n  let cartRecsProductId = null;\n  let cartRecsAutoplayTimer = null;\n  let cartRecsPaused = false;\n\n  const openCart = () => {\n    closeMobile();\n\n    // Open the drawer FIRST. Never make the user wait for /cart.js or\n    // recommendations before the panel becomes visible. The network sync runs\n    // in the background and repaints the already-open drawer when it finishes.\n    drawer?.classList.add('open');\n    overlay?.classList.add('open');\n    drawer?.setAttribute('aria-hidden', 'false');\n    document.body.style.overflow = 'hidden';\n\n    getCart()\n      .then(cart => {\n        renderCart(cart);\n        return loadCartRecommendations(cart);\n      })\n      .catch(error => {\n        console.error('[HIDE PROJECT] Could not sync cart after opening:', error);\n      });\n  };\n\n  const closeCart = () => {\n    drawer?.classList.remove('open');\n    overlay?.classList.remove('open');\n    drawer?.setAttribute('aria-hidden', 'true');\n    document.body.style.overflow = '';\n  };\n\n  // Delegate header/cart actions so cloned sticky-header buttons keep working too.\n  document.addEventListener('click', event => {\n    const openButton = event.target.closest('[data-cart-open]');\n    if (openButton) {\n      event.preventDefault();\n      openCart();\n      return;\n    }\n\n    const closeButton = event.target.closest('[data-cart-close]');\n    if (closeButton) {\n      event.preventDefault();\n      closeCart();\n    }\n  });\n  overlay?.addEventListener('click', closeCart);\n  document.addEventListener('keydown', e => { if (e.key === 'Escape') closeCart(); });\n\n\n  const cartRecCache = new Map();\n  let cartRecRequestToken = 0;\n\n  cartRecsToggle?.addEventListener('click', () => {\n    if (!cartRecs) return;\n    const collapsed = cartRecs.classList.toggle('is-collapsed');\n    cartRecsToggle.setAttribute('aria-expanded', collapsed ? 'false' : 'true');\n    cartRecsToggle.setAttribute('aria-label', collapsed ? 'Show recommendations' : 'Hide recommendations');\n    if (collapsed) stopCartRecommendationsAutoplay();\n    else requestAnimationFrame(startCartRecommendationsAutoplay);\n  });\n\n  cartRecs?.querySelector('.hp-cart-recs__head')?.addEventListener('click', event => {\n    if (event.target.closest('[data-cart-recs-prev],[data-cart-recs-next],[data-cart-recs-toggle]')) return;\n    cartRecsToggle?.click();\n  });\n\n  const renderCartRecommendations = (products = [], { keepVisible = false } = {}) => {\n    if (!cartRecs || !cartRecsTrack) return;\n\n    if (!products.length) {\n      if (!keepVisible) {\n        cartRecs.hidden = true;\n        cartRecsTrack.innerHTML = '';\n      }\n      return;\n    }\n\n    cartRecsTrack.innerHTML = products.map(product => {\n      const mediaImage =\n        product.featured_media?.preview_image ||\n        product.media?.[0]?.preview_image ||\n        null;\n\n      const image =\n        product.featured_image ||\n        mediaImage ||\n        product.images?.[0] ||\n        product.image ||\n        null;\n\n      let imageUrl =\n        typeof image === 'string'\n          ? image\n          : (\n              image?.url ||\n              image?.src ||\n              image?.originalSrc ||\n              image?.preview_image?.src ||\n              null\n            );\n\n      // Shopify can return protocol-relative CDN URLs.\n      if (imageUrl && imageUrl.startsWith('//')) imageUrl = `${window.location.protocol}${imageUrl}`;\n\n      const rawPrice =\n        product.price ??\n        product.price_min ??\n        product.variants?.[0]?.price ??\n        '';\n      const price = rawPrice === '' ? '' : money(rawPrice);\n      const productUrl = product.url || `/products/${product.handle || ''} `;\n      return `\n        <a class=\"hp-cart-rec hp-cart-rec--blur-reveal\" href=\"${productUrl.trim()}\" data-product-handle=\"${esc(product.handle || '')}\">\n          <div class=\"hp-cart-rec__image\">\n            ${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${esc(product.title || '')}\" loading=\"eager\" decoding=\"async\" data-cart-rec-image>` : '<span class=\"hp-cart-rec__no-image\">NO IMAGE</span>'}\n          </div>\n          <div class=\"hp-cart-rec__meta\">\n            <div class=\"hp-cart-rec__title\">${esc(product.title || '')}</div>\n          </div>\n        </a>\n      `;\n    }).join('');\n\n    cartRecs.hidden = false;\n    cartRecs.classList.remove('is-loading');\n\n    const revealRecommendationImage = (img, box) => {\n      if (!img || !box) return;\n      let revealed = false;\n\n      const revealNow = () => {\n        if (revealed) return;\n        revealed = true;\n        requestAnimationFrame(() => {\n          img.classList.add('is-loaded');\n          box.classList.add('is-loaded');\n          box.classList.remove('is-loading');\n        });\n      };\n\n      const reveal = async () => {\n        if (!img.naturalWidth) return;\n        // Reveal immediately when bytes are available, then let decode finish\n        // without keeping the card invisible. This prevents blank/black cards\n        // on Safari/Chrome cache races.\n        revealNow();\n        try { if (img.decode) await img.decode(); } catch (_) {}\n        revealNow();\n      };\n\n      box.classList.add('is-loading');\n      if (img.complete && img.naturalWidth) reveal();\n      else img.addEventListener('load', reveal, { once:true });\n\n      // Absolute safety net: a successfully loaded image must never remain at\n      // opacity:0 just because a load/decode event raced the listener.\n      setTimeout(() => {\n        if (img.naturalWidth) revealNow();\n      }, 500);\n    };\n\n    // If an API response omitted image fields, hydrate only those cards\n    // from Shopify's product .js endpoint without hiding the slider.\n    cartRecsTrack.querySelectorAll('.hp-cart-rec[data-product-handle]').forEach(card => {\n      const imageBox = card.querySelector('.hp-cart-rec__image');\n      const currentImg = imageBox?.querySelector('img');\n      const handle = card.dataset.productHandle;\n      if (!imageBox || !handle) return;\n\n      const hydrateImage = async () => {\n        try {\n          const root = window.Shopify?.routes?.root || '/';\n          const response = await fetch(`${root}products/${encodeURIComponent(handle)}.js?_hp=${Date.now()}`, {\n            credentials:'same-origin',\n            cache:'no-store',\n            headers:{ 'Accept':'application/json' }\n          });\n          if (!response.ok) return;\n\n          const fullProduct = await response.json();\n          let src = fullProduct.featured_image || fullProduct.images?.[0] || null;\n          if (typeof src === 'object') src = src?.src || src?.url || null;\n          if (src && src.startsWith('//')) src = `${window.location.protocol}${src}`;\n\n          if (src) {\n            imageBox.innerHTML = `<img src=\"${src}\" alt=\"${esc(fullProduct.title || '')}\" loading=\"eager\" decoding=\"async\" fetchpriority=\"low\" data-cart-rec-image>`;\n            revealRecommendationImage(imageBox.querySelector('img'), imageBox);\n          }\n        } catch (_) {}\n      };\n\n      if (!currentImg) {\n        hydrateImage();\n      } else {\n        currentImg.loading = 'eager';\n        currentImg.decoding = 'async';\n        revealRecommendationImage(currentImg, imageBox);\n        currentImg.addEventListener('error', hydrateImage, { once:true });\n        if (currentImg.complete && !currentImg.naturalWidth) hydrateImage();\n      }\n    });\n\n    requestAnimationFrame(startCartRecommendationsAutoplay);\n  };\n\n  const fetchFallbackRecommendations = async (limit, excludedProductIds = []) => {\n    const root = hpCartRoot();\n    const candidates = [\n      `${root}collections/all/products.json?limit=${Math.max(limit * 3, 12)}`,\n      `${root}products.json?limit=${Math.max(limit * 3, 12)}`\n    ];\n\n    for (const endpoint of candidates) {\n      try {\n        const response = await fetch(endpoint, {\n          headers:{ 'Accept':'application/json' },\n          credentials:'same-origin',\n          cache:'no-store'\n        });\n\n        if (!response.ok) continue;\n\n        const payload = await response.json();\n        const products = (payload.products || [])\n          .filter(product => !excludedProductIds.includes(product.id))\n          .slice(0, limit);\n\n        if (products.length) return products;\n      } catch (_) {}\n    }\n\n    return [];\n  };\n\n  const loadCartRecommendations = async (cart) => {\n    if (!cartRecs || !cartRecsTrack) return;\n\n    const firstItem = cart?.items?.[0] || null;\n    const productId = firstItem?.product_id || null;\n    const excludedIds = (cart?.items || []).map(item => item.product_id);\n    const limit = Math.max(3, Math.min(10, parseInt(cartRecs.dataset.cartRecsLimit || '6', 10)));\n\n    // Never show recommendations for an empty cart.\n    if (!productId || !cart?.item_count) {\n      stopCartRecommendationsAutoplay();\n      cartRecsProductId = null;\n      cartRecs.classList.remove('is-loading');\n      cartRecsTrack.innerHTML = '';\n      cartRecs.hidden = true;\n      return;\n    }\n\n    if (cartRecCache.has(productId)) {\n      /* V21.74: reopening the drawer must not rebuild/re-reveal an already\n         rendered recommendation strip. Keep the existing DOM composited. */\n      if (cartRecsProductId === productId && cartRecsTrack.children.length) {\n        cartRecs.hidden = false;\n        requestAnimationFrame(startCartRecommendationsAutoplay);\n        return;\n      }\n      cartRecsProductId = productId;\n      renderCartRecommendations(cartRecCache.get(productId));\n      return;\n    }\n\n    const requestToken = ++cartRecRequestToken;\n    cartRecsProductId = productId;\n    cartRecs.classList.add('is-loading');\n\n    try {\n      let products = [];\n      const root = hpCartRoot();\n\n      const response = await fetch(\n        `${root}recommendations/products.json?product_id=${encodeURIComponent(productId)}&limit=${limit}`,\n        {\n          headers:{ 'Accept':'application/json' },\n          credentials:'same-origin',\n          cache:'no-store'\n        }\n      );\n\n      if (response.ok) {\n        const payload = await response.json();\n        products = (payload.products || []).filter(product => !excludedIds.includes(product.id));\n      }\n\n      if (!products.length) {\n        products = await fetchFallbackRecommendations(limit, excludedIds);\n      }\n\n      if (requestToken !== cartRecRequestToken) return;\n\n      if (products.length) {\n        cartRecCache.set(productId, products);\n        renderCartRecommendations(products);\n      } else {\n        renderCartRecommendations([]);\n      }\n    } catch (error) {\n      console.warn('[HIDE PROJECT] Cart recommendations:', error);\n      if (requestToken !== cartRecRequestToken) return;\n\n      try {\n        const fallback = await fetchFallbackRecommendations(limit, excludedIds);\n        if (fallback.length) renderCartRecommendations(fallback);\n        else renderCartRecommendations([]);\n      } catch (_) {\n        renderCartRecommendations([]);\n      }\n    } finally {\n      cartRecs.classList.remove('is-loading');\n    }\n  };\n\n  const stopCartRecommendationsAutoplay = () => {\n    if (cartRecsAutoplayTimer) clearInterval(cartRecsAutoplayTimer);\n    cartRecsAutoplayTimer = null;\n  };\n\n  const startCartRecommendationsAutoplay = () => {\n    stopCartRecommendationsAutoplay();\n    if (!cartRecs || !cartRecsTrack || cartRecs.dataset.cartRecsAutoplay !== 'true') return;\n\n    const delay = Math.max(2000, parseInt(cartRecs.dataset.cartRecsDelay || '4000', 10));\n    cartRecsAutoplayTimer = setInterval(() => {\n      if (cartRecsPaused || cartRecs.hidden || document.hidden) return;\n\n      const card = cartRecsTrack.querySelector('.hp-cart-rec:not(.hp-cart-rec--skeleton)');\n      if (!card) return;\n\n      const step = card.getBoundingClientRect().width + 8;\n      const maxScroll = Math.max(0, cartRecsTrack.scrollWidth - cartRecsTrack.clientWidth);\n\n      if (cartRecsTrack.scrollLeft >= maxScroll - 4) {\n        cartRecsTrack.scrollTo({ left: 0, behavior: 'smooth' });\n      } else {\n        cartRecsTrack.scrollBy({ left: step, behavior: 'smooth' });\n      }\n    }, delay);\n  };\n\n  const moveCartRecommendations = direction => {\n    if (!cartRecsTrack) return;\n    const card = cartRecsTrack.querySelector('.hp-cart-rec:not(.hp-cart-rec--skeleton)');\n    const amount = card ? card.getBoundingClientRect().width + 8 : 180;\n    cartRecsTrack.scrollBy({ left: direction * amount, behavior: 'smooth' });\n  };\n\n  cartRecsPrev?.addEventListener('click', () => {\n    moveCartRecommendations(-1);\n    startCartRecommendationsAutoplay();\n  });\n  cartRecsNext?.addEventListener('click', () => {\n    moveCartRecommendations(1);\n    startCartRecommendationsAutoplay();\n  });\n\n  cartRecs?.addEventListener('mouseenter', () => { cartRecsPaused = true; });\n  cartRecs?.addEventListener('mouseleave', () => { cartRecsPaused = false; });\n  cartRecs?.addEventListener('touchstart', () => { cartRecsPaused = true; }, { passive:true });\n  cartRecs?.addEventListener('touchend', () => {\n    cartRecsPaused = false;\n    startCartRecommendationsAutoplay();\n  }, { passive:true });\n\n  const cartBodyAlreadyMatches = cart => {\n    if (!body || !cart) return false;\n    const rows = [...body.querySelectorAll('.hp-drawer-item[data-line-key]')];\n    if (!cart.items?.length) return cart.item_count === 0 && !!body.querySelector('.hp-cart-empty');\n    if (rows.length !== cart.items.length) return false;\n    return cart.items.every((item, index) => {\n      const row = rows[index];\n      if (!row || row.dataset.lineKey !== item.key) return false;\n      const qty = parseInt(row.querySelector('.hp-drawer-qty span')?.textContent || '-1', 10);\n      return qty === item.quantity;\n    });\n  };\n\n  const renderCart = (cart) => {\n    document.querySelectorAll('[data-cart-count]').forEach(el => el.textContent = cart.item_count);\n    if (!body) return;\n\n    /* V21.74: Shopify already server-renders the current cart. On mobile,\n       replacing identical rows on every drawer open retriggers every image\n       reveal and looks like a full-product flash. Leave identical DOM alone. */\n    if (cartBodyAlreadyMatches(cart)) {\n      if (subtotal) subtotal.textContent = money(cart.total_price);\n      if (foot) foot.hidden = !cart.item_count;\n      return;\n    }\n\n    if (!cart.items.length) {\n      body.innerHTML = '<div class=\"hp-cart-empty\"><div class=\"hp-cart-empty__mark\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 8V6a5 5 0 0 1 10 0v2\"/><path d=\"M5 8h14l1 13H4L5 8Z\"/></svg></div><div class=\"hp-cart-empty__title\">YOUR CART IS EMPTY.</div><div class=\"hp-cart-empty__copy\">NO OBJECTS HAVE BEEN ADDED TO THE SYSTEM YET.</div><button type=\"button\" class=\"hp-cart-empty__close\" data-cart-close-dynamic>CONTINUE EXPLORING</button></div>'; body.querySelector('[data-cart-close-dynamic]')?.addEventListener('click', closeCart);\n      if (foot) foot.hidden = true;\n      return;\n    }\n\n    body.innerHTML = cart.items.map(item => `\n      <article class=\"hp-drawer-item\" data-line-key=\"${item.key}\">\n        <a class=\"hp-drawer-item__image\" href=\"${item.url}\">\n          ${item.image ? `<img src=\"${item.image}&width=320\" alt=\"\">` : ''}\n        </a>\n        <div class=\"hp-drawer-item__meta\">\n          <div>\n            <a class=\"hp-drawer-item__title\" href=\"${item.url}\">${item.product_title}</a>\n            ${item.variant_title && item.variant_title !== 'Default Title' ? `<div class=\"hp-drawer-item__variant\">${item.variant_title}</div>` : ''}\n            <div class=\"hp-drawer-item__price\">${money(item.final_price)}</div>\n          </div>\n          <div class=\"hp-drawer-item__controls\">\n            <div class=\"hp-drawer-qty\">\n              <button type=\"button\" data-cart-qty=\"-1\" data-key=\"${item.key}\">\u2212</button>\n              <span>${item.quantity}</span>\n              <button type=\"button\" data-cart-qty=\"1\" data-key=\"${item.key}\">+</button>\n            </div>\n            <button type=\"button\" class=\"hp-drawer-remove\" data-cart-remove data-key=\"${item.key}\">REMOVE</button>\n          </div>\n        </div>\n      </article>`).join('');\n\n    // V21.27 \u2014 every freshly rendered cart image uses the same Blur + Reveal\n    // language as the rest of the theme. Reveal after decode/load so a newly\n    // added product never flashes/cuts in abruptly.\n    body.querySelectorAll('.hp-drawer-item__image img').forEach((img, index) => {\n      const frame = img.closest('.hp-drawer-item__image');\n      if (!frame) return;\n      frame.classList.add('hp-cart-image-loading');\n      frame.style.setProperty('--hp-cart-image-delay', `${Math.min(index * 24, 96)}ms`);\n\n      let done = false;\n      const reveal = () => {\n        if (done) return;\n        done = true;\n        frame.classList.remove('hp-cart-image-loading');\n        frame.classList.add('hp-cart-image-loaded');\n      };\n\n      if (img.complete && img.naturalWidth > 0) {\n        if (img.decode) img.decode().catch(() => {}).finally(() => requestAnimationFrame(reveal));\n        else requestAnimationFrame(reveal);\n      } else {\n        img.addEventListener('load', () => {\n          if (img.decode) img.decode().catch(() => {}).finally(() => requestAnimationFrame(reveal));\n          else requestAnimationFrame(reveal);\n        }, { once:true });\n        img.addEventListener('error', reveal, { once:true });\n        window.setTimeout(reveal, 1200);\n      }\n    });\n\n    if (subtotal) subtotal.textContent = money(cart.total_price);\n    if (foot) foot.hidden = false;\n  };\n\n  const getCart = async () => hpFreshCart();\n\n  const hpCartRoot = () => window.Shopify?.routes?.root || '/';\n\n  const hpFreshCart = async () => {\n    const joiner = hpCartRoot().includes('?') ? '&' : '?';\n    const response = await fetch(`${hpCartRoot()}cart.js${joiner}_hp=${Date.now()}`, {\n      credentials:'same-origin',\n      cache:'no-store',\n      headers:{\n        'Accept':'application/json',\n        'Cache-Control':'no-cache',\n        'Pragma':'no-cache'\n      }\n    });\n    if (!response.ok) throw new Error('Could not refresh cart');\n    return response.json();\n  };\n\n  const hpMutateCart = async (key, quantity) => {\n    let response = await fetch(`${hpCartRoot()}cart/change.js`, {\n      method:'POST',\n      credentials:'same-origin',\n      cache:'no-store',\n      headers:{\n        'Content-Type':'application/json',\n        'Accept':'application/json'\n      },\n      body:JSON.stringify({ id:key, quantity })\n    });\n\n    // Some stores/apps interfere with change.js by key.\n    // Fallback to update.js using the exact line-item key.\n    if (!response.ok) {\n      response = await fetch(`${hpCartRoot()}cart/update.js`, {\n        method:'POST',\n        credentials:'same-origin',\n        cache:'no-store',\n        headers:{\n          'Content-Type':'application/json',\n          'Accept':'application/json'\n        },\n        body:JSON.stringify({ updates:{ [key]:quantity } })\n      });\n    }\n\n    if (!response.ok) {\n      const payload = await response.json().catch(() => ({}));\n      throw new Error(payload?.description || payload?.message || 'Could not update cart');\n    }\n\n    // Always re-read /cart.js after a mutation.\n    // This avoids stale cart payloads from apps/caches and guarantees drawer state.\n    const cart = await hpFreshCart();\n    renderCart(cart);\n    await loadCartRecommendations(cart);\n    return cart;\n  };\n\n  const changeCart = (key, quantity) => hpMutateCart(key, quantity);\n\n  const hpAnimateCartRowOut = async row => {\n    if (!row || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n    const height = row.getBoundingClientRect().height;\n    if (!height) return;\n\n    row.style.overflow = 'hidden';\n    row.style.transformOrigin = '50% 0%';\n    const animation = row.animate([\n      { height:`${height}px`, opacity:1, filter:'blur(0px)', transform:'translate3d(0,0,0) scale(1)', paddingTop:getComputedStyle(row).paddingTop, paddingBottom:getComputedStyle(row).paddingBottom },\n      { height:`${Math.max(1,height*.72)}px`, opacity:.58, filter:'blur(2px)', transform:'translate3d(0,-3px,0) scale(.995)', offset:.42 },\n      { height:'0px', opacity:0, filter:'blur(6px)', transform:'translate3d(0,-8px,0) scale(.985)', paddingTop:'0px', paddingBottom:'0px' }\n    ], { duration:330, easing:'cubic-bezier(.16,1,.3,1)', fill:'forwards' });\n\n    try { await animation.finished; } catch (_) {}\n  };\n\n  // Side cart instant edits \u2014 document delegation survives every re-render.\n  document.addEventListener('click', async event => {\n    const qtyButton = event.target.closest('[data-cart-qty]');\n    if (qtyButton && drawer?.contains(qtyButton)) {\n      event.preventDefault();\n\n      const row = qtyButton.closest('.hp-drawer-item');\n      const countNode = row?.querySelector('.hp-drawer-qty span');\n      const current = parseInt(countNode?.textContent || '1', 10);\n      const delta = parseInt(qtyButton.dataset.cartQty || '0', 10);\n      const next = Math.max(0, current + delta);\n\n      if (countNode) countNode.textContent = next;\n      row?.classList.add('is-updating');\n\n      try {\n        await changeCart(qtyButton.dataset.key, next);\n      } catch (error) {\n        if (countNode) countNode.textContent = current;\n        console.error('[HIDE PROJECT] Cart update:', error);\n      } finally {\n        row?.classList.remove('is-updating');\n      }\n      return;\n    }\n\n    const removeButton = event.target.closest('[data-cart-remove]');\n    if (removeButton && drawer?.contains(removeButton)) {\n      event.preventDefault();\n      const row = removeButton.closest('.hp-drawer-item');\n      row?.classList.add('is-removing');\n\n      const rowParent = row?.parentNode || null;\n      const rowNextSibling = row?.nextSibling || null;\n\n      try {\n        await hpAnimateCartRowOut(row);\n        /* Remove this keyed row BEFORE renderCart compares the fresh cart.\n           Remaining product <img> nodes stay untouched, so they cannot flash. */\n        row?.remove();\n        await changeCart(removeButton.dataset.key, 0);\n      } catch (error) {\n        if (row && rowParent && !row.isConnected) {\n          row.getAnimations?.().forEach(animation => animation.cancel());\n          row.removeAttribute('style');\n          row.classList.remove('is-removing', 'is-updating');\n          if (rowNextSibling && rowNextSibling.parentNode === rowParent) rowParent.insertBefore(row, rowNextSibling);\n          else rowParent.appendChild(row);\n        } else {\n          row?.classList.remove('is-removing');\n        }\n        console.error('[HIDE PROJECT] Cart remove:', error);\n      }\n    }\n  });\n\n\n  // Add to cart \u2014 capture phase prevents the native /cart redirect.\n  document.addEventListener('submit', async event => {\n    const form = event.target.closest('form[action*=\"/cart/add\"]');\n    if (!form || form.hasAttribute('data-no-drawer')) return;\n\n    const behavior = document.documentElement.dataset.addToCartBehavior || 'drawer';\n    if (behavior === 'page') return;\n\n    event.preventDefault();\n    event.stopImmediatePropagation();\n\n    const submit = form.querySelector('[type=\"submit\"]');\n    const submitWasDisabled = Boolean(submit?.disabled);\n    const submitOriginalHTML = submit?.innerHTML || '';\n    const animateSubmitText = (text) => {\n      if (!submit) return;\n      submit.innerHTML = `<span class=\"hp-atc-feedback-inner\"><span>${text}</span></span>`;\n      submit.classList.remove('hp-atc-feedback');\n      void submit.offsetWidth;\n      submit.classList.add('hp-atc-feedback');\n    };\n    if (submit) {\n      submit.disabled = true;\n      submit.classList.add('is-adding');\n      animateSubmitText('ADDING TO CART\u2026');\n    }\n\n    try {\n      const response = await fetch(`${hpCartRoot()}cart/add.js`, {\n        method:'POST',\n        credentials:'same-origin',\n        cache:'no-store',\n        headers:{ 'Accept':'application/json' },\n        body:new FormData(form)\n      });\n      const payload = await response.json().catch(() => ({}));\n      if (!response.ok) throw new Error(payload.description || payload.message || 'Could not add to cart');\n\n      if (submit) {\n        submit.classList.remove('is-adding');\n        submit.classList.add('is-added');\n        animateSubmitText('ADDED TO CART');\n      }\n      await new Promise(resolve => window.setTimeout(resolve, 360));\n      await openCart();\n    } catch (error) {\n      console.error('[HIDE PROJECT] Add to cart:', error);\n      if (submit) animateSubmitText('TRY AGAIN');\n      openCart();\n    } finally {\n      if (submit) {\n        window.setTimeout(() => {\n          submit.innerHTML = submitOriginalHTML;\n          submit.classList.remove('is-adding','is-added','hp-atc-feedback');\n          submit.disabled = submitWasDisabled;\n        }, 760);\n      }\n    }\n  }, true);\n\n  // Product-card size quick add \u2014 clicking a visible available size adds\n  // its matching available variant to the cart without following the card link.\n  const hpQuickAddCardVariant = async trigger => {\n    if (!trigger || trigger.classList.contains('is-sold') || trigger.dataset.hpAdding === '1') return;\n    const variantId = trigger.dataset.variantId;\n    if (!variantId) return;\n\n    trigger.dataset.hpAdding = '1';\n    trigger.classList.add('is-adding');\n    try {\n      const response = await fetch(`${hpCartRoot()}cart/add.js`, {\n        method:'POST',\n        credentials:'same-origin',\n        cache:'no-store',\n        headers:{ 'Accept':'application/json', 'Content-Type':'application/json' },\n        body:JSON.stringify({ items:[{ id:Number(variantId), quantity:1 }] })\n      });\n      const payload = await response.json().catch(() => ({}));\n      if (!response.ok) throw new Error(payload.description || payload.message || 'Could not add size to cart');\n      trigger.classList.remove('is-adding');\n      trigger.classList.add('is-added');\n      window.setTimeout(() => trigger.classList.remove('is-added'), 650);\n      // Quick-add should behave like a normal add-to-cart: stay on the grid,\n      // refresh the cart, then open the side drawer.\n      await openCart();\n    } catch (error) {\n      console.error('[HIDE PROJECT] Card size quick add:', error);\n      trigger.classList.remove('is-adding');\n    } finally {\n      delete trigger.dataset.hpAdding;\n    }\n  };\n\n  document.addEventListener('click', event => {\n    const trigger = event.target.closest('[data-hp-card-quick-add]');\n    if (!trigger) return;\n    event.preventDefault();\n    event.stopPropagation();\n    event.stopImmediatePropagation();\n    hpQuickAddCardVariant(trigger);\n  }, true);\n\n  document.addEventListener('keydown', event => {\n    const trigger = event.target.closest?.('[data-hp-card-quick-add]');\n    if (!trigger || (event.key !== 'Enter' && event.key !== ' ')) return;\n    event.preventDefault();\n    event.stopPropagation();\n    hpQuickAddCardVariant(trigger);\n  }, true);\n\n  const searchModal=document.querySelector('[data-search-modal]'),searchOverlay=document.querySelector('[data-search-overlay]'),searchInput=document.querySelector('[data-search-input]'),searchResults=document.querySelector('[data-search-results]'),searchStatus=document.querySelector('[data-search-status]');let searchTimer;\n  const openSearch=()=>{closeMobile();searchModal?.classList.add('open');searchOverlay?.classList.add('open');searchModal?.setAttribute('aria-hidden','false');document.body.style.overflow='hidden';setTimeout(()=>searchInput?.focus(),120)};\n  const closeSearch=()=>{searchModal?.classList.remove('open');searchOverlay?.classList.remove('open');searchModal?.setAttribute('aria-hidden','true');document.body.style.overflow=''};\n  document.addEventListener('click',event=>{if(event.target.closest('[data-search-open]')){event.preventDefault();openSearch();return}if(event.target.closest('[data-search-close]')){event.preventDefault();closeSearch()}});searchOverlay?.addEventListener('click',closeSearch);\n  document.addEventListener('keydown',e=>{if(e.key==='Escape')closeSearch()});\n  const searchClear=document.querySelector('[data-search-clear]');\n  const hpSyncSearchClear=()=>{\n    const hasValue=Boolean(searchInput?.value);\n    searchClear?.classList.toggle('is-visible',hasValue);\n    searchClear?.setAttribute('aria-hidden',hasValue?'false':'true');\n    if(searchClear) searchClear.tabIndex=hasValue?0:-1;\n  };\n  hpSyncSearchClear();\n  searchClear?.addEventListener('click',()=>{\n    if(searchInput) searchInput.value='';\n    if(searchResults) searchResults.innerHTML='';\n    if(searchStatus) searchStatus.textContent='START TYPING TO SEARCH THE SYSTEM.';\n    hpSyncSearchClear();\n    searchInput?.focus();\n  });\n  const esc=(s='')=>s.replace(/[&<>\"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[c]));\n  const hpSearchImageUrl = raw => {\n    if (!raw) return '';\n    try {\n      const url = new URL(raw, window.location.origin);\n      // Shopify CDN accepts width as a query parameter; using an explicit card\n      // width avoids downloading an oversized source on the first search.\n      url.searchParams.set('width', '640');\n      return url.toString();\n    } catch (_) { return raw; }\n  };\n  const hpRevealSearchResults = () => {\n    if (!searchResults) return;\n    const items = [...searchResults.querySelectorAll('.hp-search-result')];\n    items.forEach((item, index) => {\n      const reveal = () => {\n        if (item.dataset.hpSearchReady === '1') return;\n        item.dataset.hpSearchReady = '1';\n        item.style.setProperty('--hp-search-delay', `${Math.min(index * 42, 210)}ms`);\n        requestAnimationFrame(() => item.classList.add('is-revealed'));\n      };\n      const img = item.querySelector('img');\n      if (!img || (img.complete && img.naturalWidth > 0)) reveal();\n      else {\n        img.addEventListener('load', reveal, { once:true });\n        img.addEventListener('error', reveal, { once:true });\n        // Never leave a result invisible on a slow/broken image.\n        window.setTimeout(reveal, 900);\n      }\n    });\n  };\n  let hpSearchRequestId = 0;\n  let hpProductCatalogCache = null;\n  let hpProductCatalogPromise = null;\n\n  const hpNormalizeSearchText = value => String(value || '')\n    .toLowerCase()\n    .normalize('NFKD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/[^a-z0-9]+/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n\n  const hpLoadProductCatalog = async () => {\n    if (Array.isArray(hpProductCatalogCache)) return hpProductCatalogCache;\n    if (hpProductCatalogPromise) return hpProductCatalogPromise;\n    const hpSearchRoot=(window.Shopify&&window.Shopify.routes&&window.Shopify.routes.root)||'/';\n    hpProductCatalogPromise = fetch(`${hpSearchRoot}products.json?limit=250`, {\n      headers:{Accept:'application/json'}, credentials:'same-origin', cache:'no-store'\n    })\n      .then(response => { if (!response.ok) throw new Error(`Catalog ${response.status}`); return response.json(); })\n      .then(data => { hpProductCatalogCache = Array.isArray(data?.products) ? data.products : []; return hpProductCatalogCache; })\n      .finally(() => { hpProductCatalogPromise = null; });\n    return hpProductCatalogPromise;\n  };\n\n  const hpCatalogSearch = async rawQuery => {\n    const q = hpNormalizeSearchText(rawQuery);\n    if (!q) return [];\n    const tokens = q.split(' ').filter(Boolean);\n    const products = await hpLoadProductCatalog();\n    return products\n      .map(product => {\n        const variantText = (product.variants || []).map(v => v.title).join(' ');\n        const haystack = hpNormalizeSearchText([product.title, product.handle, product.vendor, product.product_type, product.tags, variantText].join(' '));\n        if (!tokens.every(token => haystack.includes(token))) return null;\n        let score = 0;\n        const title = hpNormalizeSearchText(product.title);\n        if (title === q) score += 100;\n        if (title.startsWith(q)) score += 60;\n        if (title.includes(q)) score += 30;\n        tokens.forEach(token => { if (title.includes(token)) score += 8; });\n        const firstVariant = product.variants?.[0] || {};\n        const imageUrl = product.image?.src || product.images?.[0]?.src || '';\n        return {\n          _hpScore: score,\n          title: product.title || '',\n          url: `${((window.Shopify&&window.Shopify.routes&&window.Shopify.routes.root)||'/')}products/${product.handle}`,\n          featured_image: imageUrl ? { url:imageUrl } : null,\n          image: imageUrl,\n          price: firstVariant.price ? `${firstVariant.price}` : ''\n        };\n      })\n      .filter(Boolean)\n      .sort((a,b) => b._hpScore - a._hpScore)\n      .slice(0,10);\n  };\n\n  const hpFetchSearchProducts = async (q, prefix = 'last') => {\n    const hpSearchRoot=(window.Shopify&&window.Shopify.routes&&window.Shopify.routes.root)||'/';\n    const params = new URLSearchParams();\n    params.set('q', q);\n    params.set('resources[type]', 'product');\n    params.set('resources[limit]', '10');\n    params.set('resources[options][unavailable_products]', 'last');\n    if (prefix) params.set('resources[options][prefix]', prefix);\n    // Do not restrict fields here. Shopify's predictive index varies slightly\n    // between storefronts/markets and field restrictions were the main reason\n    // valid products intermittently returned zero results on mobile.\n    const response = await fetch(`${hpSearchRoot}search/suggest.json?${params.toString()}`, {\n      headers:{Accept:'application/json'}, credentials:'same-origin', cache:'no-store'\n    });\n    if (!response.ok) throw new Error(`Search ${response.status}`);\n    const data = await response.json();\n    return data?.resources?.results?.products || [];\n  };\n  const predictiveSearch=async rawQuery=>{\n    if(!searchResults||!searchStatus)return;\n    const q = String(rawQuery || '').replace(/\\s+/g,' ').trim();\n    const requestId=++hpSearchRequestId;\n    if(!q){searchResults.innerHTML='';searchStatus.textContent='START TYPING TO SEARCH THE SYSTEM.';searchResults.classList.remove('is-updating');return}\n    searchStatus.textContent='SEARCHING...';\n    searchResults.classList.add('is-updating');\n    try{\n      let ps = [];\n      try { ps = await hpFetchSearchProducts(q, 'last'); } catch (_) {}\n      // Second pass: Shopify's broad predictive matcher.\n      if (!ps.length) { try { ps = await hpFetchSearchProducts(q, ''); } catch (_) {} }\n      // Final source-of-truth fallback for mobile/Safari and storefronts where\n      // predictive search indexing lags behind the actual catalog. We pull the\n      // public product catalog once and filter it locally, so an existing\n      // product can never incorrectly become a permanent NO RESULTS state.\n      if (!ps.length) { try { ps = await hpCatalogSearch(q); } catch (_) {} }\n      if(requestId!==hpSearchRequestId)return;\n      if(!ps.length){searchResults.innerHTML='';searchStatus.textContent='NO RESULTS FOUND.';return}\n      searchStatus.textContent=`${ps.length} RESULTS`;\n      searchResults.innerHTML=ps.map(p=>{\n        const image=hpSearchImageUrl(p.featured_image?.url||p.image||'');\n        const href=p.url || '#';\n        return `<a class=\"hp-search-result\" href=\"${href}\"><div class=\"hp-search-result__image\">${image?`<img src=\"${image}\" alt=\"\" loading=\"eager\" decoding=\"async\" draggable=\"false\">`:''}</div><div class=\"hp-search-result__meta\"><div class=\"hp-search-result__title\">${esc(p.title||'')}</div></div></a>`;\n      }).join('');\n      hpLockImages(searchResults);\n      hpRevealSearchResults();\n    }catch(e){\n      console.warn('[HIDE PROJECT] Predictive search:', e);\n      try {\n        const ps = await hpCatalogSearch(q);\n        if(requestId!==hpSearchRequestId)return;\n        if(ps.length){\n          searchStatus.textContent=`${ps.length} RESULTS`;\n          searchResults.innerHTML=ps.map(p=>{\n            const image=hpSearchImageUrl(p.featured_image?.url||p.image||'');\n            return `<a class=\"hp-search-result\" href=\"${p.url||'#'}\"><div class=\"hp-search-result__image\">${image?`<img src=\"${image}\" alt=\"\" loading=\"eager\" decoding=\"async\" draggable=\"false\">`:''}</div><div class=\"hp-search-result__meta\"><div class=\"hp-search-result__title\">${esc(p.title||'')}</div></div></a>`;\n          }).join('');\n          hpLockImages(searchResults);\n          hpRevealSearchResults();\n        } else {\n          searchStatus.textContent='NO RESULTS FOUND.';\n        }\n      } catch (_) {\n        if(requestId===hpSearchRequestId)searchStatus.textContent='SEARCH UNAVAILABLE.';\n      }\n    }finally{\n      if(requestId===hpSearchRequestId)searchResults.classList.remove('is-updating');\n    }\n  };\n  const hpQueueSearch = (delay = 150) => {\n    hpSyncSearchClear();\n    clearTimeout(searchTimer);\n    const q = searchInput?.value || '';\n    searchTimer=setTimeout(()=>predictiveSearch(q), delay);\n  };\n  searchInput?.addEventListener('input',()=>hpQueueSearch(150));\n  searchInput?.addEventListener('search',()=>hpQueueSearch(0));\n  searchInput?.addEventListener('change',()=>hpQueueSearch(0));\n  searchInput?.addEventListener('compositionend',()=>hpQueueSearch(0));\n\n  // Keep SEARCH inside the same modal on every device. Never navigate to the\n  // standalone Shopify search page when the user presses Enter / SEARCH.\n  const hpSearchForm = searchInput?.closest('form');\n  hpSearchForm?.addEventListener('submit', event => {\n    event.preventDefault();\n    event.stopPropagation();\n    hpQueueSearch(0);\n    searchInput?.focus({ preventScroll:true });\n  });\n\n  // Mobile Safari can skip a normal `input` event after autofill / keyboard\n  // suggestion acceptance. Capture keyboard release too, but debounce it.\n  searchInput?.addEventListener('keyup', event => {\n    if (event.key === 'Enter') return;\n    hpQueueSearch(80);\n  });\n\n  // Full cart page instant edits \u2014 no refresh.\n  const hpCartPageV21 = document.querySelector('[data-cart-page]');\n\n  const updateCartPageFromStateV21 = cart => {\n    if (!hpCartPageV21) return;\n    document.querySelectorAll('[data-cart-count]').forEach(el => el.textContent = cart.item_count);\n\n    const count = hpCartPageV21.querySelector('[data-cart-page-count]');\n    if (count) count.textContent = `${cart.item_count} ITEMS`;\n\n    const map = new Map(cart.items.map(item => [item.key, item]));\n    hpCartPageV21.querySelectorAll('[data-cart-page-line]').forEach(row => {\n      const item = map.get(row.dataset.key);\n      if (!item) {\n        const animation = row.animate(\n          [\n            { opacity:1, filter:'blur(0px)', transform:'translateY(0)' },\n            { opacity:0, filter:'blur(8px)', transform:'translateY(-6px)' }\n          ],\n          { duration:280, easing:'ease', fill:'forwards' }\n        );\n        animation.finished.then(() => row.remove()).catch(() => row.remove());\n        return;\n      }\n\n      const input = row.querySelector('[data-cart-page-input]');\n      if (input) input.value = item.quantity;\n      const linePrice = row.querySelector('[data-cart-page-line-price]');\n      if (linePrice) linePrice.textContent = money(item.final_line_price);\n    });\n\n    const subtotalEl = hpCartPageV21.querySelector('[data-cart-page-subtotal]');\n    if (subtotalEl) subtotalEl.textContent = money(cart.total_price);\n\n    if (!cart.items.length) {\n      hpCartPageV21.querySelector('[data-cart-page-items]')?.remove();\n      hpCartPageV21.querySelector('[data-cart-page-summary]')?.remove();\n      if (!hpCartPageV21.querySelector('[data-cart-page-empty]')) {\n        hpCartPageV21.querySelector('.hp-cart-page-v21__inner')?.insertAdjacentHTML('beforeend', `\n          <div class=\"hp-cart-page-v21__empty\" data-cart-page-empty>\n            <div class=\"hp-cart-page-v21__empty-mark\">\n              <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 8V6a5 5 0 0 1 10 0v2\"/><path d=\"M5 8h14l1 13H4L5 8Z\"/></svg>\n            </div>\n            <p>YOUR CART IS EMPTY.</p>\n            <a href=\"/collections/all\">CONTINUE SHOPPING \u2192</a>\n          </div>\n        `);\n      }\n    }\n  };\n\n  const changeCartPageV21 = async (key, quantity) => {\n    const cart = await changeCart(key, quantity);\n    updateCartPageFromStateV21(cart);\n    return cart;\n  };\n\n  hpCartPageV21?.addEventListener('click', async event => {\n    const qty = event.target.closest('[data-cart-page-qty]');\n    if (qty) {\n      const row = qty.closest('[data-cart-page-line]');\n      const input = row?.querySelector('[data-cart-page-input]');\n      const current = parseInt(input?.value || '1', 10);\n      const next = Math.max(0, current + parseInt(qty.dataset.cartPageQty || '0', 10));\n      qty.disabled = true;\n      try { await changeCartPageV21(qty.dataset.key, next); }\n      finally { qty.disabled = false; }\n      return;\n    }\n\n    const remove = event.target.closest('[data-cart-page-remove]');\n    if (remove) {\n      remove.disabled = true;\n      try { await changeCartPageV21(remove.dataset.key, 0); }\n      finally { remove.disabled = false; }\n    }\n  });\n\n  let hpCartPageTimerV21 = null;\n  hpCartPageV21?.addEventListener('change', event => {\n    const input = event.target.closest('[data-cart-page-input]');\n    if (!input) return;\n    clearTimeout(hpCartPageTimerV21);\n    hpCartPageTimerV21 = setTimeout(() => {\n      changeCartPageV21(input.dataset.key, Math.max(0, parseInt(input.value || '0', 10))).catch(console.error);\n    }, 100);\n  });\n\n  // Product image lightbox \u2014 centered gallery + Blur & Reveal navigation.\n  const productLightbox = document.querySelector('[data-product-lightbox]');\n  const productLightboxImage = productLightbox?.querySelector('[data-product-lightbox-image]');\n  const productLightboxStage = productLightbox?.querySelector('[data-product-lightbox-stage]');\n  const productLightboxMedia = Array.from(document.querySelectorAll('[data-product-lightbox-src]'));\n\n  // The product page lives inside the transformed smooth-scroll container.\n  // A fixed child of a transformed ancestor is NOT viewport-fixed.\n  // Move the lightbox to <body> once so it is always centered on the real screen.\n  if (productLightbox && productLightbox.parentElement !== document.body) {\n    document.body.appendChild(productLightbox);\n  }\n\n  let productLightboxIndex = 0;\n  let productLightboxRequest = 0;\n  const productLightboxCache = new Map();\n\n  const preloadProductLightboxImage = src => {\n    if (!src) return Promise.reject(new Error('Missing image source'));\n    if (productLightboxCache.has(src)) return productLightboxCache.get(src);\n\n    const promise = new Promise((resolve, reject) => {\n      const img = new Image();\n      img.decoding = 'async';\n      img.onload = async () => {\n        try { if (img.decode) await img.decode(); } catch (_) {}\n        resolve(img);\n      };\n      img.onerror = reject;\n      img.src = src;\n    });\n\n    productLightboxCache.set(src, promise);\n    return promise;\n  };\n\n  const warmProductLightboxNeighbours = index => {\n    if (!productLightboxMedia.length) return;\n    [index - 1, index + 1].forEach(nextIndex => {\n      const normalized = (nextIndex + productLightboxMedia.length) % productLightboxMedia.length;\n      const src = productLightboxMedia[normalized]?.dataset.productLightboxSrc;\n      if (src) preloadProductLightboxImage(src).catch(() => {});\n    });\n  };\n\n  const showProductLightboxImage = async (index, animate = true) => {\n    if (!productLightboxImage || !productLightboxMedia.length) return;\n\n    const normalized = (index + productLightboxMedia.length) % productLightboxMedia.length;\n    const media = productLightboxMedia[normalized];\n    const src = media?.dataset.productLightboxSrc;\n    if (!src) return;\n\n    const requestId = ++productLightboxRequest;\n    productLightboxIndex = normalized;\n    const preview = media.querySelector('img')?.currentSrc || media.querySelector('img')?.src || '';\n\n    // Initial open: use the already-rendered gallery image immediately, then upgrade\n    // it to the decoded high-resolution asset without flashing a blank frame.\n    if (!animate) {\n      productLightboxStage?.classList.remove('is-changing');\n      productLightboxStage?.classList.add('is-ready');\n      if (preview) productLightboxImage.src = preview;\n      productLightboxImage.setAttribute('fetchpriority', 'high');\n\n      try {\n        const loaded = await preloadProductLightboxImage(src);\n        if (requestId !== productLightboxRequest) return;\n        productLightboxImage.src = loaded.src;\n      } catch (_) {\n        if (requestId !== productLightboxRequest) return;\n        if (!preview) productLightboxImage.src = src;\n      }\n      warmProductLightboxNeighbours(normalized);\n      return;\n    }\n\n    // Navigation: NEVER swap to a low-res preview first. Keep the current image\n    // visible while the next image is decoded, blur it out, then do one atomic src\n    // swap and reveal. This removes the old preview -> high-res double swap glitch.\n    const transitionStartedAt = performance.now();\n    productLightboxStage?.classList.remove('is-ready');\n    productLightboxStage?.classList.add('is-changing');\n    productLightboxImage.setAttribute('fetchpriority', 'high');\n\n    let nextSrc = src;\n    try {\n      const loaded = await preloadProductLightboxImage(src);\n      if (requestId !== productLightboxRequest) return;\n      nextSrc = loaded.src;\n    } catch (_) {\n      if (requestId !== productLightboxRequest) return;\n      nextSrc = preview || src;\n    }\n\n    // Give the outgoing image enough time to visibly blur before the single swap.\n    const elapsed = performance.now() - transitionStartedAt;\n    const waitBeforeSwap = Math.max(0, 135 - elapsed);\n    if (waitBeforeSwap) await new Promise(resolve => window.setTimeout(resolve, waitBeforeSwap));\n    if (requestId !== productLightboxRequest) return;\n\n    productLightboxImage.src = nextSrc;\n    try { if (productLightboxImage.decode) await productLightboxImage.decode(); } catch (_) {}\n    if (requestId !== productLightboxRequest) return;\n\n    // Two RAFs force a clean paint boundary: blurred old frame -> new decoded frame -> reveal.\n    requestAnimationFrame(() => requestAnimationFrame(() => {\n      if (requestId !== productLightboxRequest) return;\n      productLightboxStage?.classList.remove('is-changing');\n      productLightboxStage?.classList.add('is-ready');\n    }));\n\n    warmProductLightboxNeighbours(normalized);\n  };\n\n  // Pre-warm the first gallery images after the critical page load work finishes.\n  const warmInitialLightbox = () => {\n    productLightboxMedia.slice(0, 3).forEach(media => {\n      const src = media.dataset.productLightboxSrc;\n      if (src) preloadProductLightboxImage(src).catch(() => {});\n    });\n  };\n  if ('requestIdleCallback' in window) requestIdleCallback(warmInitialLightbox, { timeout:1800 });\n  else window.setTimeout(warmInitialLightbox, 900);\n\n  productLightboxMedia.forEach(media => {\n    media.addEventListener('pointerenter', () => {\n      const src = media.dataset.productLightboxSrc;\n      if (src) preloadProductLightboxImage(src).catch(() => {});\n    }, { passive:true });\n  });\n\n  let productLightboxCloseTimer = 0;\n  const finishProductLightboxClose = () => {\n    if (!productLightbox) return;\n    window.clearTimeout(productLightboxCloseTimer);\n    productLightboxCloseTimer = 0;\n    productLightbox.classList.remove('open','is-closing');\n    productLightbox.setAttribute('aria-hidden', 'true');\n\n    /* iOS Safari repaints the whole page if overflow is restored in the exact\n       frame the fixed lightbox layer disappears. Unlock two painted frames\n       later so the page underneath is already stable. */\n    if (window.matchMedia('(max-width: 720px)').matches) {\n      requestAnimationFrame(() => requestAnimationFrame(() => {\n        document.body.classList.remove('hp-lightbox-open');\n      }));\n    } else {\n      document.body.classList.remove('hp-lightbox-open');\n    }\n  };\n\n  const closeProductLightbox = () => {\n    if (!productLightbox || !productLightbox.classList.contains('open')) return;\n\n    // Cancel any in-flight image transition so Safari does not composite two\n    // visual effects while the overlay is being removed.\n    productLightboxRequest += 1;\n    productLightboxStage?.classList.remove('is-changing');\n    productLightboxStage?.classList.add('is-ready');\n\n    if (window.matchMedia('(max-width: 720px)').matches &&\n        !window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n      productLightbox.classList.add('is-closing');\n      /* Keep aria-visible during the visual close. Hiding the accessibility\n         tree in the same frame made WebKit tear down the compositing layer. */\n      productLightbox.setAttribute('aria-hidden', 'false');\n\n      /* V21.80: close the mobile lightbox as one compositor layer. Listening on\n         the root avoids the old dialog/backdrop desync that produced a flash. */\n      const finish = event => {\n        if (event && (event.target !== productLightbox || event.propertyName !== 'opacity')) return;\n        productLightbox.removeEventListener('transitionend', finish);\n        finishProductLightboxClose();\n      };\n      productLightbox.addEventListener('transitionend', finish);\n      productLightboxCloseTimer = window.setTimeout(() => {\n        productLightbox.removeEventListener('transitionend', finish);\n        finishProductLightboxClose();\n      }, 280);\n      return;\n    }\n\n    finishProductLightboxClose();\n  };\n\n  productLightboxMedia.forEach((media, index) => {\n    media.addEventListener('click', event => {\n      event.preventDefault();\n      if (!productLightbox || !productLightboxImage) return;\n\n      productLightboxIndex = index;\n      window.clearTimeout(productLightboxCloseTimer);\n      productLightboxCloseTimer = 0;\n      productLightbox.classList.remove('is-closing');\n      showProductLightboxImage(index, false);\n      productLightbox.classList.add('open');\n      productLightbox.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('hp-lightbox-open');\n    });\n  });\n\n  productLightbox?.querySelectorAll('[data-product-lightbox-close]').forEach(button => {\n    button.addEventListener('click', closeProductLightbox);\n  });\n\n  productLightbox?.querySelector('[data-product-lightbox-prev]')?.addEventListener('click', () => {\n    showProductLightboxImage(productLightboxIndex - 1, true);\n  });\n\n  productLightbox?.querySelector('[data-product-lightbox-next]')?.addEventListener('click', () => {\n    showProductLightboxImage(productLightboxIndex + 1, true);\n  });\n\n  // Mobile/tablet swipe navigation. Horizontal swipe left = next, right = previous.\n  if (productLightboxStage) {\n    let swipeStartX = 0;\n    let swipeStartY = 0;\n    let swipeTracking = false;\n\n    const beginSwipe = (x, y) => {\n      if (!productLightbox?.classList.contains('open')) return;\n      swipeStartX = x;\n      swipeStartY = y;\n      swipeTracking = true;\n    };\n\n    const endSwipe = (x, y) => {\n      if (!swipeTracking) return;\n      swipeTracking = false;\n      const dx = x - swipeStartX;\n      const dy = y - swipeStartY;\n      if (Math.abs(dx) < 44 || Math.abs(dx) <= Math.abs(dy) * 1.15) return;\n      showProductLightboxImage(productLightboxIndex + (dx < 0 ? 1 : -1), true);\n    };\n\n    if ('PointerEvent' in window) {\n      productLightboxStage.addEventListener('pointerdown', event => {\n        if (event.pointerType === 'mouse' && event.button !== 0) return;\n        beginSwipe(event.clientX, event.clientY);\n      }, { passive:true });\n      productLightboxStage.addEventListener('pointerup', event => endSwipe(event.clientX, event.clientY), { passive:true });\n      productLightboxStage.addEventListener('pointercancel', () => { swipeTracking = false; }, { passive:true });\n    } else {\n      productLightboxStage.addEventListener('touchstart', event => {\n        const touch = event.changedTouches?.[0];\n        if (touch) beginSwipe(touch.clientX, touch.clientY);\n      }, { passive:true });\n      productLightboxStage.addEventListener('touchend', event => {\n        const touch = event.changedTouches?.[0];\n        if (touch) endSwipe(touch.clientX, touch.clientY);\n      }, { passive:true });\n    }\n  }\n\n  document.addEventListener('keydown', event => {\n    if (!productLightbox?.classList.contains('open')) return;\n    if (event.key === 'Escape') closeProductLightbox();\n    if (event.key === 'ArrowLeft') showProductLightboxImage(productLightboxIndex - 1, true);\n    if (event.key === 'ArrowRight') showProductLightboxImage(productLightboxIndex + 1, true);\n  });\n\n});\n\n\n/* V21.46 \u2014 desktop nested mega menu: hover preview + whole-surface blur/reveal */\n(() => {\n  const root = document.querySelector('[data-mega-root]');\n  if (!root) return;\n  document.body.appendChild(root);\n  const panels = [...root.querySelectorAll('[data-mega-panel]')];\n  // V22.001 \u2014 deterministic initial mega state. Liquid renders every top-level\n  // menu as a sibling panel; only the panel selected by its trigger may render.\n  panels.forEach(panel => {\n    panel.hidden = true;\n    panel.classList.remove('is-active');\n  });\n  root.setAttribute('aria-hidden', 'true');\n  let activeId = null;\n  let closeTimer = 0;\n  let closeEndHandler = null;\n  const hideTimers = new WeakMap();\n  const allTriggers = () => [...document.querySelectorAll('[data-mega-trigger]')];\n\n  const finishHide = set => {\n    const timer = hideTimers.get(set);\n    if (timer) clearTimeout(timer);\n    set.classList.remove('is-active','is-leaving');\n    set.hidden = true;\n    hideTimers.delete(set);\n  };\n\n  const hideSet = (set, immediate = false) => {\n    if (!set || set.hidden) return;\n    const old = hideTimers.get(set);\n    if (old) clearTimeout(old);\n    set.classList.remove('is-active');\n    if (immediate) { finishHide(set); return; }\n    set.classList.add('is-leaving');\n    const timer = setTimeout(() => finishHide(set), 360);\n    hideTimers.set(set, timer);\n  };\n\n  const clearPreview = (panel, immediate = false) => {\n    if (!panel) return;\n    panel.querySelectorAll('[data-mega-preview]').forEach(set => hideSet(set, immediate));\n    panel.querySelectorAll('[data-mega-preview-target]').forEach(link => link.classList.remove('is-active'));\n    const empty = panel.querySelector('[data-mega-preview-empty]');\n    if (empty) empty.hidden = true;\n  };\n\n  const activatePreview = (panel, id) => {\n    if (!panel || !id) return;\n    const targetSet = panel.querySelector(`[data-mega-preview=\"${CSS.escape(id)}\"]`);\n    const targetLink = panel.querySelector(`[data-mega-preview-target=\"${CSS.escape(id)}\"]`);\n    panel.querySelectorAll('[data-mega-preview]').forEach(set => { if (set !== targetSet) hideSet(set, false); });\n    panel.querySelectorAll('[data-mega-preview-target]').forEach(link => link.classList.toggle('is-active', link === targetLink));\n    if (targetSet) {\n      const timer = hideTimers.get(targetSet);\n      if (timer) clearTimeout(timer);\n      hideTimers.delete(targetSet);\n      targetSet.hidden = false;\n      targetSet.classList.remove('is-leaving');\n      requestAnimationFrame(() => requestAnimationFrame(() => targetSet.classList.add('is-active')));\n    }\n  };\n\n  const syncTriggers = id => {\n    allTriggers().forEach(t => {\n      const active = Boolean(id) && t.dataset.megaId === id;\n      t.classList.toggle('is-active', active);\n      t.setAttribute('aria-expanded', active ? 'true' : 'false');\n    });\n  };\n\n  const cleanupClosingInlineStyles = () => {\n    root.style.removeProperty('opacity');\n    root.style.removeProperty('filter');\n  };\n\n  const cancelPendingClose = () => {\n    if (closeTimer) {\n      clearTimeout(closeTimer);\n      closeTimer = 0;\n    }\n    if (closeEndHandler) {\n      root.removeEventListener('transitionend', closeEndHandler);\n      closeEndHandler = null;\n    }\n    cleanupClosingInlineStyles();\n  };\n\n  const finishClose = () => {\n    cancelPendingClose();\n    panels.forEach(panel => {\n      clearPreview(panel, true);\n      panel.hidden = true;\n      panel.classList.remove('is-active');\n    });\n    root.classList.remove('is-open','is-closing');\n    root.setAttribute('aria-hidden','true');\n  };\n\n  const close = (immediate = false) => {\n    activeId = null;\n    syncTriggers(null);\n    cancelPendingClose();\n    if (immediate || window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n      finishClose();\n      return;\n    }\n\n    /* V21.55: keep the surface alive until the upward transform really ends.\n       The previous fallback timer was not cancelled after transitionend, which\n       could later close a menu that had already been reopened. */\n    root.classList.remove('is-closing');\n    root.classList.add('is-open');\n    root.setAttribute('aria-hidden','false');\n    root.style.setProperty('opacity','1','important');\n    root.style.setProperty('filter','none','important');\n    void root.offsetHeight;\n\n    closeEndHandler = event => {\n      if (event.target !== root || event.propertyName !== 'transform') return;\n      finishClose();\n    };\n    root.addEventListener('transitionend', closeEndHandler);\n\n    requestAnimationFrame(() => {\n      root.classList.add('is-closing');\n      root.classList.remove('is-open');\n    });\n\n    closeTimer = window.setTimeout(finishClose, 760);\n  };\n\n  const open = (id, trigger) => {\n    const panel = panels.find(p => p.dataset.megaPanel === id);\n    if (!panel) return;\n    cancelPendingClose();\n    root.classList.remove('is-closing');\n    const sourceHeader = trigger?.closest('.hp-header');\n    if (sourceHeader) root.style.top = `${Math.round(Math.max(0, sourceHeader.getBoundingClientRect().bottom))}px`;\n    panels.forEach(p => {\n      if (p !== panel) clearPreview(p, true);\n      p.hidden = p !== panel;\n      p.classList.toggle('is-active', p === panel);\n    });\n    clearPreview(panel, true);\n    syncTriggers(id);\n    activeId = id;\n    root.setAttribute('aria-hidden','false');\n    requestAnimationFrame(() => requestAnimationFrame(() => root.classList.add('is-open')));\n  };\n\n  document.addEventListener('click', event => {\n    const trigger = event.target.closest('[data-mega-trigger]');\n    if (trigger) {\n      event.preventDefault();\n      const id = trigger.dataset.megaId;\n      if (activeId === id) close(); else open(id, trigger);\n      return;\n    }\n    if (!activeId) return;\n    if (event.target.closest('[data-mega-root]')) {\n      if (event.target.closest('a')) close();\n      return;\n    }\n    close();\n  });\n\n  root.addEventListener('pointerover', event => {\n    const target = event.target.closest('[data-mega-preview-target]');\n    if (!target || !root.contains(target)) return;\n    activatePreview(target.closest('[data-mega-panel]'), target.dataset.megaPreviewTarget);\n  });\n\n  root.addEventListener('pointerout', event => {\n    const target = event.target.closest('[data-mega-preview-target]');\n    if (!target || !root.contains(target) || target.contains(event.relatedTarget)) return;\n    const panel = target.closest('[data-mega-panel]');\n    if (!panel) return;\n    target.classList.remove('is-active');\n    const set = panel.querySelector(`[data-mega-preview=\"${CSS.escape(target.dataset.megaPreviewTarget)}\"]`);\n    hideSet(set, false);\n  });\n\n  root.addEventListener('focusin', event => {\n    const target = event.target.closest('[data-mega-preview-target]');\n    if (!target) return;\n    activatePreview(target.closest('[data-mega-panel]'), target.dataset.megaPreviewTarget);\n  });\n  root.addEventListener('focusout', event => {\n    const target = event.target.closest('[data-mega-preview-target]');\n    if (!target || target.contains(event.relatedTarget)) return;\n    const panel = target.closest('[data-mega-panel]');\n    if (!panel) return;\n    target.classList.remove('is-active');\n    const set = panel.querySelector(`[data-mega-preview=\"${CSS.escape(target.dataset.megaPreviewTarget)}\"]`);\n    hideSet(set, false);\n  });\n\n  document.addEventListener('keydown', event => { if (event.key === 'Escape') close(); });\n  window.addEventListener('resize', () => { if (window.innerWidth < 900) close(true); }, { passive:true });\n\n  /* V21.140 \u2014 footer Blur + Reveal ONCE per page load.\n     After the first successful reveal the observer disconnects permanently,\n     so scrolling away/back never replays the footer entrance. */\n  const hpFooterSection = document.querySelector('.hp-footer--refgrid');\n  if (hpFooterSection && 'IntersectionObserver' in window) {\n    let hpFooterRevealed = false;\n\n    const hpFooterObserver = new IntersectionObserver((entries, observer) => {\n      entries.forEach((entry) => {\n        if (hpFooterRevealed) return;\n\n        if (entry.isIntersecting && entry.intersectionRatio >= 0.10) {\n          hpFooterRevealed = true;\n          hpFooterSection.classList.add('is-hp-footer-visible');\n          hpFooterSection.dataset.hpFooterRevealed = '1';\n          observer.disconnect();\n        }\n      });\n    }, {\n      threshold: [0, 0.10, 0.25],\n      rootMargin: '0px 0px -2% 0px'\n    });\n\n    hpFooterObserver.observe(hpFooterSection);\n  } else if (hpFooterSection) {\n    hpFooterSection.classList.add('is-hp-footer-visible');\n    hpFooterSection.dataset.hpFooterRevealed = '1';\n  }\n\n})();\n\n\n/* V21.45 \u2014 mobile editorial accordion */\n(() => {\n  const mobile = document.querySelector('[data-mobile]');\n  if (!mobile) return;\n\n  const closeGroup = group => {\n    if (!group) return;\n    group.classList.remove('is-open');\n    const trigger = group.querySelector('[data-mobile-group-trigger]');\n    const panel = group.querySelector('[data-mobile-group-panel]');\n    trigger?.setAttribute('aria-expanded','false');\n    panel?.setAttribute('aria-hidden','true');\n  };\n\n  mobile.addEventListener('click', event => {\n    const trigger = event.target.closest('[data-mobile-group-trigger]');\n    if (!trigger) return;\n    event.preventDefault();\n    const group = trigger.closest('[data-mobile-group]');\n    if (!group) return;\n    const willOpen = !group.classList.contains('is-open');\n    mobile.querySelectorAll('[data-mobile-group].is-open').forEach(other => {\n      if (other !== group) closeGroup(other);\n    });\n    group.classList.toggle('is-open', willOpen);\n    trigger.setAttribute('aria-expanded', willOpen ? 'true' : 'false');\n    group.querySelector('[data-mobile-group-panel]')?.setAttribute('aria-hidden', willOpen ? 'false' : 'true');\n    if (willOpen) {\n      requestAnimationFrame(() => group.scrollIntoView({ block:'nearest', behavior:'smooth' }));\n    }\n  });\n\n  document.addEventListener('click', event => {\n    if (event.target.closest('[data-menu-close]') || event.target.closest('.hp-mobile a')) {\n      mobile.querySelectorAll('[data-mobile-group].is-open').forEach(closeGroup);\n    }\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
