{
  "version": 3,
  "sources": ["/cdn/shop/t/34/assets/eagleline-theme.js?el103-readback=20260823"],
  "sourcesContent": ["(() => {\n  document.documentElement.classList.remove(\"no-js\");\n  document.documentElement.classList.add(\"js\");\n\n  const pageType = document.body?.dataset.pageType || \"unknown\";\n  const approvedStorefrontMarkets = new Set([\"japan\", \"thailand\", \"unknown\"]);\n  const analyticsPreview = document.documentElement.dataset.analyticsPreview === \"true\";\n  const declaredStorefrontMarket = document.body?.dataset.storefrontMarket;\n  const storefrontMarket = approvedStorefrontMarkets.has(declaredStorefrontMarket)\n    ? declaredStorefrontMarket\n    : \"unknown\";\n  let themeStrings = {};\n  try {\n    const themeStringsNode = document.getElementById(\"EagleLineThemeStrings\");\n    if (themeStringsNode) themeStrings = JSON.parse(themeStringsNode.textContent);\n  } catch {\n    themeStrings = {};\n  }\n  const themeString = (key, fallback = \"\") => {\n    const value = themeStrings[key];\n    return typeof value === \"string\" && value ? value : fallback;\n  };\n  const publishEagleLineEvent = (name, parameters = {}) => {\n    const publish = window.Shopify?.analytics?.publish;\n    if (typeof publish !== \"function\") return false;\n    try {\n      const result = publish.call(window.Shopify.analytics, name, {\n        ...parameters,\n        storefront_market: storefrontMarket,\n      });\n      result?.catch?.(() => {});\n      return true;\n    } catch {\n      return false;\n    }\n  };\n\n  const TRACKING_STATE_EVENT = \"eagleline:tracking-state\";\n  const CONTENT_STABILITY_MS = 1000;\n  const ARRIVAL_ATTRIBUTION_MS = 4000;\n  const contentSections = [...document.querySelectorAll(\"[data-content-section]\")];\n  let activeNavigation = null;\n  let settledAttribution = null;\n  let directEntryAttribution = null;\n  let navigationSettleTimer = 0;\n  let attributionExpiryTimer = 0;\n\n  const dispatchTrackingState = () => {\n    document.dispatchEvent(new CustomEvent(TRACKING_STATE_EVENT));\n  };\n\n  const contentSectionForElement = (element) => {\n    const zone = element?.closest?.(\"[data-content-section]\");\n    return zone?.dataset.contentSection || null;\n  };\n\n  const visibleViewportArea = (element) => {\n    if (!element?.isConnected) return 0;\n    const rect = element.getBoundingClientRect();\n    const width = Math.max(0, Math.min(rect.right, window.innerWidth) - Math.max(rect.left, 0));\n    const height = Math.max(0, Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0));\n    return width * height;\n  };\n\n  const dominantContentSection = ({ preferNavigationTarget = true } = {}) => {\n    const viewportArea = Math.max(1, window.innerWidth * window.innerHeight);\n    const scores = contentSections\n      .map((element) => ({\n        element,\n        sectionName: element.dataset.contentSection,\n        area: visibleViewportArea(element),\n      }))\n      .filter((score) => score.sectionName && score.area > 0)\n      .sort((left, right) => right.area - left.area);\n    if (!scores.length || scores[0].area < viewportArea * .12) return \"transition\";\n\n    const preferredSection = preferNavigationTarget\n      ? (activeNavigation?.targetSection\n        || settledAttribution?.targetSection\n        || directEntryAttribution?.targetSection)\n      : null;\n    if (preferredSection) {\n      const preferred = scores.find((score) => score.sectionName === preferredSection);\n      if (preferred && preferred.area >= viewportArea * .12) return preferredSection;\n    }\n\n    const [first, second] = scores;\n    if (second && second.area >= first.area * .9) return \"transition\";\n    return first.sectionName;\n  };\n\n  const currentViewAttribution = () => {\n    if (activeNavigation) return null;\n    if (settledAttribution) {\n      return {\n        arrival_method: \"assisted\",\n        navigation_source: settledAttribution.navigationSource,\n      };\n    }\n    if (directEntryAttribution) {\n      return {\n        arrival_method: \"direct_entry\",\n        navigation_source: \"direct_hash\",\n      };\n    }\n    return { arrival_method: \"organic\", navigation_source: \"none\" };\n  };\n\n  const clearAttribution = () => {\n    window.clearTimeout(attributionExpiryTimer);\n    attributionExpiryTimer = 0;\n    settledAttribution = null;\n    directEntryAttribution = null;\n  };\n\n  const finishNavigation = () => {\n    if (!activeNavigation) return;\n    const completed = activeNavigation;\n    activeNavigation = null;\n    if (completed.arrivalMethod === \"direct_entry\") {\n      directEntryAttribution = { targetSection: completed.targetSection };\n    } else {\n      settledAttribution = {\n        navigationSource: completed.navigationSource,\n        targetSection: completed.targetSection,\n      };\n      window.clearTimeout(attributionExpiryTimer);\n      attributionExpiryTimer = window.setTimeout(() => {\n        settledAttribution = null;\n        attributionExpiryTimer = 0;\n        dispatchTrackingState();\n      }, ARRIVAL_ATTRIBUTION_MS);\n    }\n    dispatchTrackingState();\n  };\n\n  const scheduleNavigationSettle = (delay = 180) => {\n    window.clearTimeout(navigationSettleTimer);\n    navigationSettleTimer = window.setTimeout(finishNavigation, delay);\n  };\n\n  const cancelNavigation = () => {\n    if (!activeNavigation && !settledAttribution && !directEntryAttribution) return;\n    window.clearTimeout(navigationSettleTimer);\n    navigationSettleTimer = 0;\n    activeNavigation = null;\n    clearAttribution();\n    dispatchTrackingState();\n  };\n\n  const startEagleLineNavigation = (target, navigationSource, options = {}) => {\n    if (!target) return;\n    window.clearTimeout(navigationSettleTimer);\n    clearAttribution();\n    activeNavigation = {\n      arrivalMethod: \"assisted\",\n      navigationSource,\n      targetSection: contentSectionForElement(target),\n    };\n    dispatchTrackingState();\n    const reduceMotion = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n    if (Number.isFinite(options.top)) {\n      window.scrollTo({ top: options.top, behavior: reduceMotion ? \"auto\" : \"smooth\" });\n    } else {\n      target.scrollIntoView({\n        behavior: reduceMotion ? \"auto\" : \"smooth\",\n        block: \"start\",\n        inline: \"nearest\",\n      });\n    }\n    scheduleNavigationSettle(reduceMotion ? 80 : 240);\n  };\n\n  const normalizePath = (value) => {\n    const trimmed = value.replace(/\\/+$/, \"\");\n    return trimmed || \"/\";\n  };\n\n  const hashTarget = (hash) => {\n    if (typeof hash !== \"string\" || !hash.startsWith(\"#\") || hash.length < 2) return null;\n    try {\n      return document.getElementById(decodeURIComponent(hash.slice(1)));\n    } catch {\n      return null;\n    }\n  };\n\n  const sameDocumentAnchorTarget = (anchor) => {\n    if (!anchor || anchor.hasAttribute(\"download\")) return null;\n    const targetName = anchor.getAttribute(\"target\");\n    if (targetName && targetName.toLowerCase() !== \"_self\") return null;\n    let url;\n    try {\n      url = new URL(anchor.href, window.location.href);\n    } catch {\n      return null;\n    }\n    if (url.origin !== window.location.origin\n      || normalizePath(url.pathname) !== normalizePath(window.location.pathname)\n      || url.search !== window.location.search) return null;\n    return hashTarget(url.hash);\n  };\n\n  const navigationSourceFor = (element) => {\n    if (element?.closest?.(\"[data-purchase-cta]\")) return \"choose_product\";\n    if (element?.closest?.(\".el-header, [data-island], .el-v63-offer-bar\")) return \"header\";\n    if (element?.closest?.(\".el-footer\")) return \"footer\";\n    return \"content_link\";\n  };\n\n  const sourceSectionFor = (element) => (\n    contentSectionForElement(element)\n    || dominantContentSection({ preferNavigationTarget: false })\n    || \"unknown\"\n  );\n\n  const observeQualifiedVisibility = (element, delay, qualifies, callback) => {\n    if (!element || !(\"IntersectionObserver\" in window)) return () => {};\n    let timer = 0;\n    let qualifying = false;\n    let latestEntry = null;\n    let attempts = 0;\n    const clearTimer = () => {\n      window.clearTimeout(timer);\n      timer = 0;\n    };\n    const cleanup = () => {\n      clearTimer();\n      observer.disconnect();\n      document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n      document.removeEventListener(TRACKING_STATE_EVENT, handleTrackingState);\n    };\n    const schedule = () => {\n      if (timer || !qualifying || activeNavigation || document.visibilityState !== \"visible\") return;\n      timer = window.setTimeout(() => {\n        timer = 0;\n        if (!qualifying || activeNavigation || document.visibilityState !== \"visible\" || !element.isConnected) return;\n        const completed = callback();\n        if (completed !== false) {\n          cleanup();\n          return;\n        }\n        attempts += 1;\n        if (attempts < 10) schedule();\n        else cleanup();\n      }, attempts ? 500 : delay);\n    };\n    const observer = new IntersectionObserver((entries) => {\n      const entry = entries[0];\n      latestEntry = entry || null;\n      qualifying = Boolean(entry && qualifies(entry) && !activeNavigation);\n      if (!qualifying) {\n        clearTimer();\n        return;\n      }\n      schedule();\n    }, { threshold: [0, .01, .25, .5, .75] });\n    const handleVisibilityChange = () => {\n      if (document.visibilityState !== \"visible\") {\n        clearTimer();\n        return;\n      }\n      qualifying = Boolean(latestEntry && qualifies(latestEntry) && !activeNavigation);\n      schedule();\n    };\n    const handleTrackingState = () => {\n      qualifying = Boolean(latestEntry && qualifies(latestEntry) && !activeNavigation);\n      if (!qualifying) clearTimer();\n      else schedule();\n    };\n    observer.observe(element);\n    document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n    document.addEventListener(TRACKING_STATE_EVENT, handleTrackingState);\n    return cleanup;\n  };\n\n  const viewedCtaPlacements = new Set();\n  document.querySelectorAll(\"[data-purchase-cta]\").forEach((cta) => {\n    const placement = cta.dataset.ctaPlacement;\n    if (!placement) return;\n    observeQualifiedVisibility(\n      cta,\n      500,\n      (entry) => entry.isIntersecting && entry.intersectionRatio >= .5,\n      () => {\n        if (viewedCtaPlacements.has(placement)) return true;\n        const attribution = currentViewAttribution();\n        if (!attribution) return false;\n        const published = publishEagleLineEvent(\"eagleline_cta_view\", {\n          placement,\n          page_type: pageType,\n          ...attribution,\n        });\n        if (published) viewedCtaPlacements.add(placement);\n        return published;\n      },\n    );\n  });\n\n  let purchaseFormViewed = false;\n  document.querySelectorAll(\"[data-product-form]\").forEach((formRoot) => {\n    const form = formRoot.querySelector(\"form\") || formRoot;\n    observeQualifiedVisibility(\n      form,\n      1000,\n      (entry) => entry.isIntersecting && entry.intersectionRatio >= .5,\n      () => {\n        if (purchaseFormViewed) return true;\n        const attribution = currentViewAttribution();\n        if (!attribution) return false;\n        const published = publishEagleLineEvent(\"eagleline_purchase_form_view\", {\n          page_type: pageType,\n          ...attribution,\n        });\n        if (published) purchaseFormViewed = true;\n        return published;\n      },\n    );\n  });\n\n  const viewedContentSections = new Set();\n  let pendingContentSection = null;\n  let pendingContentTimer = 0;\n  let pendingContentAttempts = 0;\n  let contentTrackingFrame = 0;\n  const clearPendingContent = () => {\n    window.clearTimeout(pendingContentTimer);\n    pendingContentTimer = 0;\n    pendingContentSection = null;\n    pendingContentAttempts = 0;\n  };\n  const evaluateDominantContent = () => {\n    contentTrackingFrame = 0;\n    if (activeNavigation || document.visibilityState !== \"visible\") {\n      clearPendingContent();\n      return;\n    }\n    const sectionName = dominantContentSection();\n    if (!sectionName || sectionName === \"transition\" || viewedContentSections.has(sectionName)) {\n      clearPendingContent();\n      return;\n    }\n    if (pendingContentSection !== sectionName) {\n      clearPendingContent();\n      pendingContentSection = sectionName;\n    }\n    if (pendingContentTimer) return;\n    pendingContentTimer = window.setTimeout(() => {\n      pendingContentTimer = 0;\n      if (activeNavigation\n        || document.visibilityState !== \"visible\"\n        || dominantContentSection() !== pendingContentSection) {\n        clearPendingContent();\n        return;\n      }\n      const attribution = currentViewAttribution();\n      if (!attribution) return;\n      const published = publishEagleLineEvent(\"eagleline_content_view\", {\n        section_name: pendingContentSection,\n        page_type: pageType,\n        ...attribution,\n      });\n      if (published) {\n        viewedContentSections.add(pendingContentSection);\n        clearPendingContent();\n        return;\n      }\n      pendingContentAttempts += 1;\n      if (pendingContentAttempts < 10) evaluateDominantContent();\n      else clearPendingContent();\n    }, pendingContentAttempts ? 500 : CONTENT_STABILITY_MS);\n  };\n  const requestDominantContentEvaluation = () => {\n    if (!contentTrackingFrame) contentTrackingFrame = window.requestAnimationFrame(evaluateDominantContent);\n  };\n  window.addEventListener(\"scroll\", () => {\n    if (activeNavigation) scheduleNavigationSettle();\n    requestDominantContentEvaluation();\n  }, { passive: true });\n  window.addEventListener(\"resize\", requestDominantContentEvaluation, { passive: true });\n  window.addEventListener(\"scrollend\", () => {\n    if (activeNavigation) scheduleNavigationSettle(0);\n  }, { passive: true });\n  document.addEventListener(\"visibilitychange\", requestDominantContentEvaluation);\n  document.addEventListener(TRACKING_STATE_EVENT, requestDominantContentEvaluation);\n  requestDominantContentEvaluation();\n\n  const verticalNavigationKeys = new Set([\n    \"ArrowDown\",\n    \"ArrowUp\",\n    \"End\",\n    \"Home\",\n    \"PageDown\",\n    \"PageUp\",\n    \" \",\n  ]);\n  window.addEventListener(\"wheel\", cancelNavigation, { passive: true });\n  window.addEventListener(\"touchstart\", cancelNavigation, { passive: true });\n  window.addEventListener(\"keydown\", (event) => {\n    if (event.isTrusted && verticalNavigationKeys.has(event.key)) cancelNavigation();\n  });\n\n  document.addEventListener(\"click\", (event) => {\n    if ((!event.isTrusted && !analyticsPreview) || event.button !== 0) return;\n    const purchaseCta = event.target.closest?.(\"[data-purchase-cta]\");\n    if (purchaseCta) {\n      publishEagleLineEvent(\"eagleline_cta_click\", {\n        placement: purchaseCta.dataset.ctaPlacement,\n        destination: purchaseCta.dataset.ctaDestination,\n        page_type: pageType,\n        source_section: sourceSectionFor(purchaseCta),\n      });\n    }\n\n    if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n    const anchor = event.target.closest?.(\"a[href]\");\n    if (!anchor || anchor.matches(\"[data-hl-dot]\")) return;\n    const target = sameDocumentAnchorTarget(anchor);\n    if (!target) return;\n    event.preventDefault();\n    if (anchor.matches(\".el-skip-link\")) {\n      target.scrollIntoView({ block: \"start\", inline: \"nearest\" });\n      target.focus?.({ preventScroll: true });\n      return;\n    }\n    startEagleLineNavigation(target, navigationSourceFor(anchor));\n  });\n\n  const initialHashTarget = hashTarget(window.location.hash);\n  if (initialHashTarget) {\n    activeNavigation = {\n      arrivalMethod: \"direct_entry\",\n      navigationSource: \"direct_hash\",\n      targetSection: contentSectionForElement(initialHashTarget),\n    };\n    dispatchTrackingState();\n    scheduleNavigationSettle(240);\n  }\n  window.addEventListener(\"hashchange\", () => {\n    const target = hashTarget(window.location.hash);\n    window.clearTimeout(navigationSettleTimer);\n    navigationSettleTimer = 0;\n    activeNavigation = null;\n    clearAttribution();\n    if (target) {\n      activeNavigation = {\n        arrivalMethod: \"assisted\",\n        navigationSource: \"browser_history\",\n        targetSection: contentSectionForElement(target),\n      };\n      scheduleNavigationSettle(240);\n    }\n    dispatchTrackingState();\n  });\n\n  const openedFaqIds = new Set();\n  document.querySelectorAll(\"details[data-faq-id]\").forEach((details) => {\n    const faqId = details.dataset.faqId;\n    const summary = details.querySelector(\"summary\");\n    if (!faqId || !summary) return;\n    summary.addEventListener(\"click\", (event) => {\n      if (!event.isTrusted || details.open || openedFaqIds.has(faqId)) return;\n      window.requestAnimationFrame(() => {\n        if (!details.open || openedFaqIds.has(faqId)) return;\n        const published = publishEagleLineEvent(\"eagleline_faq_open\", {\n          faq_id: faqId,\n          page_type: pageType,\n        });\n        if (published) openedFaqIds.add(faqId);\n      });\n    });\n  });\n\n  const selectionToastTimers = new WeakMap();\n  const showSelectionGateToast = (selectionGate) => {\n    const productForm = selectionGate.closest(\"[data-product-form]\");\n    const selectionToast = productForm?.querySelector(\"[data-selection-toast]\");\n    const prompt = selectionGate.getAttribute(\"aria-label\") || \"\";\n    if (!selectionToast || !prompt) return;\n    const timers = selectionToastTimers.get(selectionToast) || {};\n    window.clearTimeout(timers.hide);\n    window.clearTimeout(timers.cleanup);\n    selectionToast.classList.remove(\"is-visible\");\n    selectionToast.textContent = \"\";\n    window.requestAnimationFrame(() => {\n      selectionToast.textContent = prompt;\n      selectionToast.setAttribute(\"aria-hidden\", \"false\");\n      selectionToast.classList.add(\"is-visible\");\n    });\n    const hide = window.setTimeout(() => {\n      selectionToast.classList.remove(\"is-visible\");\n      selectionToast.setAttribute(\"aria-hidden\", \"true\");\n      const cleanup = window.setTimeout(() => {\n        selectionToast.textContent = \"\";\n      }, window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ? 0 : 260);\n      selectionToastTimers.set(selectionToast, { hide: 0, cleanup });\n    }, 2600);\n    selectionToastTimers.set(selectionToast, { hide, cleanup: 0 });\n  };\n\n  document.addEventListener(\"click\", (event) => {\n    const selectionGate = event.target.closest?.(\"[data-selection-gate]\");\n    if (selectionGate) {\n      showSelectionGateToast(selectionGate);\n      return;\n    }\n    if (!event.isTrusted) return;\n    const checkoutControl = event.target.closest?.(\"[data-checkout-select]\");\n    if (!checkoutControl) return;\n    if (checkoutControl.getAttribute(\"aria-disabled\") === \"true\") return;\n    const productForm = checkoutControl.closest(\"[data-product-form]\");\n    if (checkoutControl.matches(\"[data-direct-checkout]\") && productForm?.dataset.selectionReady !== \"true\") return;\n    const variantId = productForm?.querySelector(\"[data-variant-id]\")?.value\n      || checkoutControl.dataset.variantId;\n    const parameters = {\n      checkout_path: checkoutControl.dataset.checkoutPath || \"direct_checkout\",\n      page_type: pageType,\n    };\n    if (variantId) parameters.variant_id = variantId;\n    publishEagleLineEvent(\"eagleline_checkout_select\", parameters);\n  }, true);\n\n  const initialize = () => {\n  const motionPreference = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n  let reducedMotion = motionPreference.matches;\n  const reducedData = Boolean(\n    navigator.connection?.saveData\n    || window.matchMedia?.(\"(prefers-reduced-data: reduce)\").matches,\n  );\n\n  const onMediaChange = (query, callback) => {\n    if (query.addEventListener) query.addEventListener(\"change\", callback);\n    else query.addListener?.(callback);\n  };\n\n  onMediaChange(motionPreference, (event) => {\n    reducedMotion = event.matches;\n    if (reducedMotion) document.querySelectorAll(\"video\").forEach((video) => video.pause());\n    document.dispatchEvent(new CustomEvent(\"eagleline:media-state\"));\n  });\n\n  const isVisible = (element) => {\n    if (!element || element.hidden || element.getAttribute(\"aria-hidden\") === \"true\") return false;\n    if (!element.getClientRects().length) return false;\n    const style = window.getComputedStyle(element);\n    return style.display !== \"none\" && style.visibility !== \"hidden\";\n  };\n\n  const observeVisibility = (element, callback, options = {}) => {\n    if (\"IntersectionObserver\" in window) {\n      const observer = new IntersectionObserver(\n        ([entry]) => callback(entry.isIntersecting, entry.intersectionRatio),\n        options,\n      );\n      observer.observe(element);\n      return () => observer.disconnect();\n    }\n\n    let frame = 0;\n    const check = () => {\n      frame = 0;\n      const rect = element.getBoundingClientRect();\n      const intersects = rect.bottom > 0 && rect.top < window.innerHeight;\n      callback(intersects, intersects ? 1 : 0);\n    };\n    const requestCheck = () => {\n      if (!frame) frame = window.requestAnimationFrame(check);\n    };\n    window.addEventListener(\"scroll\", requestCheck, { passive: true });\n    window.addEventListener(\"resize\", requestCheck, { passive: true });\n    check();\n    return () => {\n      window.removeEventListener(\"scroll\", requestCheck);\n      window.removeEventListener(\"resize\", requestCheck);\n      if (frame) window.cancelAnimationFrame(frame);\n    };\n  };\n\n  const safePlay = (video) => {\n    if (!(video instanceof HTMLVideoElement)) return;\n    video.muted = true;\n    video.loop = true;\n    video.playsInline = true;\n    video.play().catch(() => {});\n  };\n\n  document.querySelectorAll(\"[data-header]\").forEach((header) => {\n    const update = () => header.classList.toggle(\"is-scrolled\", window.scrollY > 12);\n    update();\n    window.addEventListener(\"scroll\", update, { passive: true });\n  });\n\n\n  document.querySelectorAll(\"[data-hero-motion]\").forEach((hero) => {\n    let pointerX = 0;\n    let pointerY = 0;\n    let currentX = 0;\n    let currentY = 0;\n    let scrollY = 0;\n    let frame = 0;\n\n    const render = () => {\n      frame = 0;\n      if (reducedMotion) {\n        currentX = 0;\n        currentY = 0;\n        hero.style.setProperty(\"--hero-x\", \"0px\");\n        hero.style.setProperty(\"--hero-y\", \"0px\");\n        return;\n      }\n      const goalY = pointerY + scrollY;\n      currentX += (pointerX - currentX) * 0.14;\n      currentY += (goalY - currentY) * 0.14;\n      hero.style.setProperty(\"--hero-x\", `${currentX.toFixed(2)}px`);\n      hero.style.setProperty(\"--hero-y\", `${currentY.toFixed(2)}px`);\n      if (Math.abs(pointerX - currentX) > 0.04 || Math.abs(goalY - currentY) > 0.04) {\n        frame = window.requestAnimationFrame(render);\n      }\n    };\n\n    const requestRender = () => {\n      if (!frame) frame = window.requestAnimationFrame(render);\n    };\n\n    const updateScroll = () => {\n      if (reducedMotion) return requestRender();\n      const rect = hero.getBoundingClientRect();\n      const viewportProgress = (window.innerHeight - rect.top) / (window.innerHeight + rect.height);\n      scrollY = (Math.max(0, Math.min(1, viewportProgress)) - 0.5) * 10;\n      /* Scroll-out follow-up to the load swipe. Two drivers, set on the root\n         so the hero, the press baton line and the spine track all read them:\n         --hero-exit-edge starts at first scroll and sweeps the twin cobalt\n         bars back across the pinned hero in the reverse direction of the\n         intro, while --hero-exit waits out a 10% hero-height dead zone\n         before the copy sinks/dissolves and the photo settles and dims.\n         Both complete just as the pinned hero releases (40svh). */\n      const exit = Math.max(0, Math.min(1, (window.scrollY - rect.height * 0.1) / (rect.height * 0.28)));\n      document.documentElement.style.setProperty(\"--hero-exit\", exit.toFixed(3));\n      const edgeExit = Math.max(0, Math.min(1, window.scrollY / (rect.height * 0.38)));\n      document.documentElement.style.setProperty(\"--hero-exit-edge\", edgeExit.toFixed(3));\n      requestRender();\n    };\n\n    hero.addEventListener(\"pointermove\", (event) => {\n      if (reducedMotion || event.pointerType === \"touch\") return;\n      const rect = hero.getBoundingClientRect();\n      pointerX = ((event.clientX - rect.left) / rect.width - 0.5) * 10;\n      pointerY = ((event.clientY - rect.top) / rect.height - 0.5) * 8;\n      requestRender();\n    });\n    hero.addEventListener(\"pointerleave\", () => {\n      pointerX = 0;\n      pointerY = 0;\n      requestRender();\n    });\n    window.addEventListener(\"scroll\", updateScroll, { passive: true });\n    window.addEventListener(\"resize\", updateScroll, { passive: true });\n    onMediaChange(motionPreference, updateScroll);\n    updateScroll();\n  });\n\n  /* Bar-linked intro: instead of a fixed time stagger, each copy element\n     reveals (rise + fade) at the moment the intro swipe bars physically\n     cross it. The bars literally write the copy in. Without JS or under\n     reduced motion the CSS time-staggered entrance runs unchanged. */\n  document.querySelectorAll(\".el-v63-hero-full\").forEach((hero) => {\n    const edge = hero.querySelector(\".el-hero-edge\");\n    const copy = hero.querySelector(\".el-v6-hero-copy, .el-v63-hero-copy\");\n    /* The bar-linked version reads live geometry each animation frame. The\n       compact layout keeps the same entrance via the CSS stagger instead,\n       avoiding forced-layout work on phones and portrait tablets. */\n    const compactViewport = window.matchMedia(\"(max-width: 920px)\").matches;\n    if (!edge || !copy || reducedMotion || compactViewport) return;\n    const items = [...copy.children];\n    if (!items.length) return;\n    hero.classList.add(\"bar-linked\");\n    const scale = Math.min(1, window.innerWidth / 1440);\n    const offsets = [40, 170, 300, 420, 510, 590].map((v) => v * scale);\n    const started = performance.now();\n    const tick = (now) => {\n      const barX = edge.getBoundingClientRect().right;\n      let pending = false;\n      items.forEach((el, index) => {\n        if (el.classList.contains(\"is-in\")) return;\n        const trigger = el.getBoundingClientRect().left + (offsets[index] || offsets[offsets.length - 1]);\n        if (barX >= trigger || now - started > 2600) {\n          el.classList.add(\"is-in\");\n        } else {\n          pending = true;\n        }\n      });\n      if (pending && now - started < 2800) window.requestAnimationFrame(tick);\n    };\n    window.requestAnimationFrame(tick);\n  });\n\n  /* Shared carousel: dot anchors remain useful without JS; enhanced controls\n     move one centered card at a time and keep the active state synchronized. */\n  document.querySelectorAll(\"[data-highlights]\").forEach((section) => {\n    const track = section.querySelector(\"[data-hl-track]\");\n    const slides = [...section.querySelectorAll(\"[data-hl-slide]\")];\n    const dots = [...section.querySelectorAll(\"[data-hl-dot]\")];\n    let previous = null;\n    let next = null;\n    if (!track || !slides.length) return;\n    if (!reducedMotion) track.classList.add(\"is-live\");\n    const timerText = section.querySelector(\".el-v63-hl-symbol text\");\n    let timerFrame = 0;\n    let timerWasActive = false;\n    let frame = 0;\n    let currentIndex = -1;\n    let manualStartIndex = -1;\n    let manualIntentTimer = 0;\n    let pointerStart = null;\n    let ignoreSlideClickUntil = 0;\n    const clearManualIntent = () => {\n      window.clearTimeout(manualIntentTimer);\n      manualIntentTimer = 0;\n      manualStartIndex = -1;\n    };\n    const syncControls = (index) => {\n      [[previous, index <= 0], [next, index >= slides.length - 1]].forEach(([control, disabled]) => {\n        if (!control) return;\n        control.disabled = disabled;\n        control.setAttribute(\"aria-disabled\", String(disabled));\n      });\n    };\n    const update = () => {\n      frame = 0;\n      /* Cards are narrower than the track, so the active slide is the one\n         whose center is closest to the track's visible center. */\n      const center = track.getBoundingClientRect().left + track.clientWidth / 2;\n      let index = 0;\n      let best = Infinity;\n      slides.forEach((slide, i) => {\n        const rect = slide.getBoundingClientRect();\n        const distance = Math.abs(rect.left + rect.width / 2 - center);\n        if (distance < best) { best = distance; index = i; }\n      });\n      dots.forEach((dot, i) => {\n        const active = i === index;\n        dot.classList.toggle(\"is-active\", active);\n        if (active) dot.setAttribute(\"aria-current\", \"true\");\n        else dot.removeAttribute(\"aria-current\");\n      });\n      slides.forEach((slide, i) => slide.classList.toggle(\"is-active\", i === index));\n      syncControls(index);\n      if (manualStartIndex >= 0 && index !== manualStartIndex) {\n        publishEagleLineEvent(\"eagleline_media_engage\", {\n          media_type: \"image\",\n          placement: \"mid_page\",\n          action: \"gallery_select\",\n        });\n        clearManualIntent();\n      }\n      currentIndex = index;\n      /* Slide 3's timer counts up to 00:05 like a stopwatch each time its\n         card centers; the arc sweep is CSS on the same activation. */\n      const timerActive = Boolean(slides[index] && slides[index].matches(\".el-v63-hl-icon.is-active\"));\n      if (timerText && !reducedMotion) {\n        if (timerActive && !timerWasActive) {\n          window.cancelAnimationFrame(timerFrame);\n          const started = performance.now();\n          const tick = (now) => {\n            const t = Math.max(0, Math.min(1, (now - started - 150) / 1200));\n            timerText.textContent = \"00:0\" + Math.min(5, Math.ceil(t * 5));\n            if (t < 1) timerFrame = window.requestAnimationFrame(tick);\n          };\n          timerFrame = window.requestAnimationFrame(tick);\n        } else if (!timerActive && timerWasActive) {\n          window.cancelAnimationFrame(timerFrame);\n          timerText.textContent = \"00:05\";\n        }\n      }\n      timerWasActive = timerActive;\n    };\n    const request = () => {\n      if (!frame) frame = window.requestAnimationFrame(update);\n    };\n    const markManualIntent = (event) => {\n      if (!event.isTrusted) return;\n      manualStartIndex = currentIndex;\n      window.clearTimeout(manualIntentTimer);\n      manualIntentTimer = window.setTimeout(clearManualIntent, 2000);\n    };\n    const scrollToIndex = (index, event) => {\n      const targetIndex = Math.max(0, Math.min(slides.length - 1, index));\n      if (targetIndex === currentIndex) return;\n      const target = slides[targetIndex];\n      const trackRect = track.getBoundingClientRect();\n      const targetRect = target.getBoundingClientRect();\n      markManualIntent(event);\n      track.scrollTo({\n        left: track.scrollLeft + targetRect.left + targetRect.width / 2\n          - trackRect.left - track.clientWidth / 2,\n        behavior: reducedMotion ? \"auto\" : \"smooth\",\n      });\n    };\n    const beginPointer = (event) => {\n      markManualIntent(event);\n      if (!event.isPrimary || (event.pointerType === \"mouse\" && event.button !== 0)) return;\n      pointerStart = {\n        id: event.pointerId,\n        x: event.clientX,\n        y: event.clientY,\n        scrollLeft: track.scrollLeft,\n        moved: false,\n      };\n    };\n    const trackPointer = (event) => {\n      if (!pointerStart || event.pointerId !== pointerStart.id) return;\n      if (Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 8) {\n        pointerStart.moved = true;\n      }\n    };\n    const finishPointer = (event) => {\n      if (!pointerStart || event.pointerId !== pointerStart.id) return;\n      if (pointerStart.moved || Math.abs(track.scrollLeft - pointerStart.scrollLeft) > 4) {\n        ignoreSlideClickUntil = Date.now() + 350;\n      }\n      pointerStart = null;\n    };\n    track.addEventListener(\"pointerdown\", beginPointer, { passive: true });\n    track.addEventListener(\"pointermove\", trackPointer, { passive: true });\n    track.addEventListener(\"pointerup\", finishPointer, { passive: true });\n    track.addEventListener(\"pointercancel\", finishPointer, { passive: true });\n    track.addEventListener(\"wheel\", markManualIntent, { passive: true });\n    track.addEventListener(\"keydown\", (event) => {\n      if ([\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"].includes(event.key)) {\n        markManualIntent(event);\n      }\n    });\n    previous = section.querySelector(\"[data-carousel-prev]\");\n    next = section.querySelector(\"[data-carousel-next]\");\n    previous?.addEventListener(\"click\", (event) => scrollToIndex(currentIndex - 1, event));\n    next?.addEventListener(\"click\", (event) => scrollToIndex(currentIndex + 1, event));\n    dots.forEach((dot, index) => dot.addEventListener(\"click\", (event) => {\n      event.preventDefault();\n      scrollToIndex(index, event);\n    }));\n    slides.forEach((slide, index) => slide.addEventListener(\"click\", (event) => {\n      if (Date.now() < ignoreSlideClickUntil || index === currentIndex) return;\n      const trackRect = track.getBoundingClientRect();\n      const slideRect = slide.getBoundingClientRect();\n      if (Math.min(trackRect.right, slideRect.right) <= Math.max(trackRect.left, slideRect.left)) return;\n      scrollToIndex(currentIndex + (index < currentIndex ? -1 : 1), event);\n    }));\n    track.addEventListener(\"scroll\", request, { passive: true });\n    window.addEventListener(\"resize\", request, { passive: true });\n    update();\n  });\n\n  /* Universal text reveal: every text element outside the chrome and the\n     zones with their own choreography rises in once as it enters the\n     viewport and never hides again. Leaf-level text only (a block whose\n     descendants carry text reveals as one unit). Armed state is applied by\n     JS only when motion is allowed; otherwise everything is simply visible. */\n  if (!reducedMotion) {\n    const revealZones = document.querySelectorAll(\"main, .el-footer\");\n    const revealExclude = \".el-v63-hero, .el-v63-hl-track, .el-v63-patent-gallery, .el-v63-five, .el-v63-diff-rows, .el-spine, .el-island, .el-header, .el-v63-offer-bar\";\n    const revealSelector = \".el-kicker, h1, h2, h3, h4, h5, p, li, figcaption, summary, dt, dd\";\n    const revealItems = [];\n    revealZones.forEach((zone) => {\n      zone.querySelectorAll(revealSelector).forEach((el) => {\n        if (el.closest(revealExclude)) return;\n        if (el.querySelector(revealSelector)) return; // keep reveals leaf-level\n        if (el.closest(\"details:not([open])\")) return; // collapsed content stays ready\n        if (el.offsetParent === null) return; // hidden until shown by other logic\n        revealItems.push(el);\n      });\n    });\n    const revealObserver = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (!entry.isIntersecting) return;\n        entry.target.classList.add(\"is-in\");\n        revealObserver.unobserve(entry.target);\n      });\n    }, { threshold: 0 });\n    const revealSiblings = new Map();\n    revealItems.forEach((el) => {\n      const parent = el.parentElement;\n      const index = revealSiblings.get(parent) || 0;\n      revealSiblings.set(parent, index + 1);\n      el.style.setProperty(\"--reveal-delay\", `${Math.min(index * 70, 350)}ms`);\n      el.classList.add(\"el-reveal\");\n      revealObserver.observe(el);\n    });\n  }\n\n  /* Hide the floating header while the purchase chapter itself is on screen,\n     then restore it when the customer scrolls above or below that chapter. */\n  document.querySelectorAll(\"[data-island]\").forEach((island) => {\n    const heroAnchor = document.querySelector(\".el-hero-pin\") || document.querySelector(\".el-v63-hero\");\n    const header = document.querySelector(\"[data-header]\");\n    const productGallery = document.querySelector(\"[data-product-gallery]\")\n      || document.querySelector(\"#eagleline-buy\");\n    const productRegion = productGallery?.closest(\"section\") || productGallery;\n    let visible = false;\n    let frame = 0;\n    const setVisible = (nextVisible) => {\n      if (nextVisible === visible) return;\n      visible = nextVisible;\n      island.classList.toggle(\"is-visible\", visible);\n      island.setAttribute(\"aria-hidden\", String(!visible));\n      island.toggleAttribute(\"inert\", !visible);\n    };\n    const update = () => {\n      frame = 0;\n      const vh = window.innerHeight;\n      const productRect = productRegion?.getBoundingClientRect();\n      const productInView = Boolean(productRect && productRect.top < vh && productRect.bottom > 0);\n      const openingCleared = heroAnchor\n        ? heroAnchor.getBoundingClientRect().bottom <= vh * (visible ? .16 : .1)\n        : pageType === \"product\" && ((header?.getBoundingClientRect().bottom || 0) <= 0 || window.scrollY > 96);\n      setVisible(openingCleared && !productInView);\n    };\n    const request = () => {\n      if (!frame) frame = window.requestAnimationFrame(update);\n    };\n    window.addEventListener(\"scroll\", request, { passive: true });\n    window.addEventListener(\"resize\", request, { passive: true });\n    update();\n  });\n\n  document.querySelectorAll(\"[data-spine]\").forEach((spine) => {\n    const progressEl = spine.querySelector(\".el-spine-progress\");\n    const tipEl = spine.querySelector(\".el-spine-tip\");\n    const labels = {\n      top: themeString(\"spine_top\", \"Top\"),\n      \"why-line\": themeString(\"spine_why\", \"Why a line helps\"),\n      ritual: themeString(\"spine_ritual\", \"How to use\"),\n      story: themeString(\"spine_story\", \"Story\"),\n      technology: themeString(\"spine_technology\", \"Mechanism\"),\n      makuake: themeString(\"spine_makuake\", \"Makuake history\"),\n      \"eagleline-buy\": themeString(\"spine_buy\", \"Choose a product\"),\n    };\n    /* Interstitial moments get no spine node: the highlights carousel, the\n       two posters and the breather are transitions, not chapters. The FAQ\n       is folded into the buy node, which carries the page's tail end. */\n    const spineSkip = new Set([\"highlights\", \"poster-line\", \"form\", \"poster-score\", \"faq\"]);\n    const chapters = [...document.querySelectorAll(\"main section[id]\")].filter((section) => !spineSkip.has(section.id));\n    const count = chapters.length;\n    /* Where the spine dot conceptually \"is\" for a chapter: the section top\n       sits just under the dynamic island when it is showing, otherwise with\n       a small gap \u2014 measured live so framed sections never sit under chrome.\n       Also precompute which chapters sit on dark or cobalt backgrounds so\n       the spine can switch to its light scheme there. */\n    const focusOffset = () => {\n      const island = document.querySelector(\"[data-island]\");\n      if (island && island.classList.contains(\"is-visible\")) {\n        return island.getBoundingClientRect().bottom + 16;\n      }\n      return 24;\n    };\n    const chapterIsDark = chapters.map((chapter) => {\n      const bg = getComputedStyle(chapter).backgroundColor.match(/[\\d.]+/g);\n      if (!bg || bg.length < 3 || (bg.length > 3 && parseFloat(bg[3]) === 0)) return false;\n      const luminance = (0.2126 * bg[0] + 0.7152 * bg[1] + 0.0722 * bg[2]) / 255;\n      return luminance < 0.45;\n    });\n    const nodes = chapters.map((chapter) => {\n      const text = labels[chapter.id] || chapter.id;\n      const node = document.createElement(\"button\");\n      node.type = \"button\";\n      node.className = \"el-spine-node\";\n      node.setAttribute(\"aria-label\", themeString(\"spine_go_to\", \"Go to __SECTION__\").replace(\"__SECTION__\", text));\n      if (chapter.id === \"eagleline-buy\") {\n        node.dataset.purchaseCta = \"\";\n        node.dataset.ctaPlacement = \"section_nav\";\n        node.dataset.ctaDestination = \"product_gallery\";\n      }\n      const label = document.createElement(\"span\");\n      label.className = \"el-spine-label\";\n      label.setAttribute(\"aria-hidden\", \"true\");\n      label.textContent = text;\n      node.appendChild(label);\n      node.addEventListener(\"click\", () => {\n        const top = chapter.getBoundingClientRect().top + window.scrollY;\n        const target = Math.max(0, top - focusOffset());\n        startEagleLineNavigation(chapter, \"spine\", { top: target });\n      });\n      spine.appendChild(node);\n      return node;\n    });\n\n    let idleTimer = 0;\n    const armIdle = () => {\n      window.clearTimeout(idleTimer);\n      spine.classList.remove(\"labels-idle\");\n      idleTimer = window.setTimeout(() => spine.classList.add(\"labels-idle\"), 1200);\n    };\n    const setExpanded = (on) => {\n      spine.classList.toggle(\"is-expanded\", on);\n      if (on) {\n        window.clearTimeout(idleTimer);\n        spine.classList.remove(\"labels-idle\");\n      } else {\n        armIdle();\n      }\n    };\n    window.addEventListener(\"pointermove\", (event) => {\n      if (event.pointerType === \"touch\") return;\n      const near = event.clientX <= 96;\n      if (near !== spine.classList.contains(\"is-expanded\")) setExpanded(near);\n    }, { passive: true });\n\n    let frame = 0;\n    let lastActive = -1;\n    const update = () => {\n      frame = 0;\n      const scrollMax = Math.max(1, document.documentElement.scrollHeight - window.innerHeight);\n      const p = Math.min(1, Math.max(0, window.scrollY / scrollMax));\n      /* Every chapter gets its natural anchor (its framed scroll position),\n         including the last one: forcing the final anchor to 1 desynced the\n         tip from the final sections' dots. The tip rests on the last node\n         from that section's framed position to the page bottom. */\n      const anchors = chapters.map((chapter, index) => {\n        if (index === 0) return 0;\n        const top = chapter.getBoundingClientRect().top + window.scrollY;\n        return Math.min(1, Math.max(0, (top - focusOffset()) / scrollMax));\n      });\n      let segment = 0;\n      for (let index = 0; index < count - 1; index += 1) {\n        if (p >= anchors[index]) segment = index;\n      }\n      segment = Math.min(segment, count - 2);\n      const a0 = anchors[segment];\n      const a1 = anchors[segment + 1];\n      const local = a1 > a0 ? Math.min(1, Math.max(0, (p - a0) / (a1 - a0))) : 1;\n      const spinePos = Math.min(1, count > 1 ? (segment + local) / (count - 1) : 0);\n      const activeIndex = Math.round(spinePos * (count - 1));\n      if (activeIndex !== lastActive) {\n        lastActive = activeIndex;\n        spine.classList.toggle(\"is-inverted\", chapterIsDark[activeIndex] === true);\n        if (!spine.classList.contains(\"is-expanded\")) armIdle();\n      }\n      if (progressEl) progressEl.style.height = `${spinePos * 100}%`;\n      if (tipEl) tipEl.style.top = `${spinePos * 100}%`;\n      nodes.forEach((node, index) => {\n        const pos = count > 1 ? index / (count - 1) : 0;\n        node.style.top = `${pos * 100}%`;\n        node.classList.toggle(\"is-passed\", spinePos >= pos - 0.001);\n        node.classList.toggle(\"is-active\", index === activeIndex);\n      });\n    };\n    const requestUpdate = () => {\n      if (!frame) frame = window.requestAnimationFrame(update);\n    };\n    window.addEventListener(\"scroll\", requestUpdate, { passive: true });\n    window.addEventListener(\"resize\", requestUpdate, { passive: true });\n    update();\n  });\n\n  /* Five-second steps: the three timestamped steps light in sequence with\n     scroll. Without JS or under reduced motion they stay fully lit (CSS\n     default); JS only \"arms\" the dim state when animation is allowed. */\n  document.querySelectorAll(\"[data-five]\").forEach((block) => {\n    const stage = block.querySelector(\".el-v63-five-stage\");\n    const steps = [...block.querySelectorAll(\".el-v63-five-steps li\")];\n    if (!stage || reducedMotion) return;\n    const thresholds = [0.15, 0.5, 0.85];\n    block.classList.add(\"is-armed\");\n    let frame = 0;\n    const update = () => {\n      frame = 0;\n      const rect = stage.getBoundingClientRect();\n      const vh = window.innerHeight;\n      const p = Math.max(0, Math.min(1, (vh * 0.85 - rect.top) / (vh * 0.5)));\n      steps.forEach((li, index) => li.classList.toggle(\"is-lit\", p >= thresholds[index]));\n    };\n    const request = () => {\n      if (!frame) frame = window.requestAnimationFrame(update);\n    };\n    window.addEventListener(\"scroll\", request, { passive: true });\n    window.addEventListener(\"resize\", request, { passive: true });\n    update();\n  });\n\n  /* Angle diagram entry draw: the four angle lines draw themselves once when\n     the diagram scrolls into view. Path lengths are measured so the dash\n     animation needs no magic numbers; the overlay then fades back to the\n     baked artwork. Skipped under reduced motion (image lines suffice). */\n  document.querySelectorAll(\".el-v63-angle-media\").forEach((media) => {\n    const draw = media.querySelector(\".el-v63-angle-draw\");\n    if (!draw || reducedMotion) return;\n    draw.querySelectorAll(\"path\").forEach((path) => {\n      const length = path.getTotalLength();\n      path.style.setProperty(\"--len\", `${length}px`);\n      path.style.strokeDasharray = `${length}`;\n    });\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (!entry.isIntersecting) return;\n        media.classList.add(\"is-drawn\");\n        observer.disconnect();\n      });\n    }, { threshold: 0.35 });\n    observer.observe(media);\n  });\n\n  /* Ball lane: a dimpled golf ball rolls the full page width left-to-right\n     with scroll, rotating clockwise and drawing a cobalt line behind it \u2014\n     the ball marks the line. When the roll completes, the line flashes.\n     Static ball, no mark, under reduced motion / no-JS. */\n  document.querySelectorAll(\"[data-ball-lane]\").forEach((lane) => {\n    const ball = lane.querySelector(\".el-v63-ball-lane-ball\");\n    const mark = lane.querySelector(\".el-v63-ball-lane-mark\");\n    if (!ball || !mark || reducedMotion) return;\n    let frame = 0;\n    const update = () => {\n      frame = 0;\n      const rect = lane.getBoundingClientRect();\n      const vh = window.innerHeight;\n      const p = Math.max(0, Math.min(1, (vh - rect.top) / (vh + rect.height)));\n      const startX = window.innerWidth - 48;\n      const x = 4 + p * (startX - 4);\n      const rotation = ((x - 4) / 69.1) * 360;\n      ball.style.transform = `translate(${x.toFixed(1)}px, -50%) rotate(${rotation.toFixed(1)}deg)`;\n      mark.style.width = `${(x + 11).toFixed(1)}px`;\n      lane.classList.toggle(\"is-complete\", p >= 0.985);\n    };\n    const request = () => {\n      if (!frame) frame = window.requestAnimationFrame(update);\n    };\n    window.addEventListener(\"scroll\", request, { passive: true });\n    window.addEventListener(\"resize\", request, { passive: true });\n    update();\n  });\n\n  /* Versus rows: staggered entry choreography. Each row rises in as it\n     enters, the pain photo settles into its muted grade, the answer photo\n     lifts, and the cobalt edge draws down beside the answer title. Final\n     state is the CSS default; JS only arms the hidden start. */\n  document.querySelectorAll(\".el-v63-diff-rows\").forEach((rows) => {\n    if (reducedMotion) return;\n    const items = [...rows.querySelectorAll(\".el-v63-diff-row\")];\n    if (!items.length) return;\n    rows.classList.add(\"is-armed\");\n    items.forEach((row, index) => { row.style.transitionDelay = `${index * 90}ms`; });\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (!entry.isIntersecting) return;\n        entry.target.classList.add(\"is-in\");\n        observer.unobserve(entry.target);\n      });\n    }, { threshold: 0.3 });\n    items.forEach((row) => observer.observe(row));\n  });\n\n  document.querySelectorAll(\"[data-reveal]\").forEach((element) => {\n    if (reducedMotion) {\n      element.classList.add(\"is-visible\");\n      return;\n    }\n    let stopObserving = () => {};\n    stopObserving = observeVisibility(\n      element,\n      (inView) => {\n        if (!inView) return;\n        element.classList.add(\"is-visible\");\n        stopObserving();\n      },\n      { rootMargin: \"0px 0px -12% 0px\", threshold: 0.15 },\n    );\n  });\n\n  document.querySelectorAll(\"video[data-viewport-video]\").forEach((video) => {\n    if (video.closest(\"[data-mechanism-switcher]\")) return;\n    const shell = video.closest(\"[data-viewport-video-shell]\") || video.parentElement;\n    const toggle = shell?.querySelector(\"[data-viewport-video-toggle]\");\n    const toggleText = shell?.querySelector(\"[data-viewport-video-toggle-text]\");\n    const toggleIcon = shell?.querySelector(\"[data-viewport-video-toggle-icon]\");\n    const status = shell?.querySelector(\"[data-viewport-video-status]\");\n    let inView = false;\n    let playbackEnabled = !reducedMotion && !reducedData;\n    let reducedMotionOverride = false;\n    let lastReducedMotion = reducedMotion;\n\n    video.muted = true;\n    video.loop = true;\n    video.playsInline = true;\n    video.pause();\n\n    const playbackRequested = () =>\n      playbackEnabled && (!reducedMotion || reducedMotionOverride);\n    const announce = (message) => {\n      if (status) status.textContent = message;\n    };\n    const syncToggle = () => {\n      const enabled = playbackRequested();\n      const text = enabled\n        ? themeString(\"ritual_pause_label\", \"Pause the line-drawing demonstration\")\n        : themeString(\"ritual_play_label\", \"Play the line-drawing demonstration\");\n      toggle?.setAttribute(\"aria-label\", text);\n      toggle?.setAttribute(\"data-media-playback\", enabled ? \"enabled\" : \"paused\");\n      if (toggleText) toggleText.textContent = enabled\n        ? themeString(\"pause\", \"Pause\")\n        : themeString(\"play\", \"Play\");\n      if (toggleIcon) toggleIcon.textContent = enabled ? \"\u2161\" : \"\u25B6\";\n    };\n    const syncPlayingState = () => {\n      toggle?.setAttribute(\"data-media-playing\", String(!video.paused));\n    };\n    const sync = () => {\n      if (playbackRequested() && !document.hidden && inView && isVisible(video)) safePlay(video);\n      else video.pause();\n      syncToggle();\n    };\n    if (toggle) {\n      toggle.hidden = false;\n      toggle.disabled = false;\n      toggle.addEventListener(\"click\", (event) => {\n        const enablePlayback = !playbackRequested();\n        playbackEnabled = enablePlayback;\n        reducedMotionOverride = enablePlayback && reducedMotion;\n        if (!enablePlayback) video.pause();\n        sync();\n        if (event.isTrusted) {\n          publishEagleLineEvent(\"eagleline_media_engage\", {\n            media_type: \"video\",\n            placement: \"mid_page\",\n            action: enablePlayback ? \"video_play\" : \"video_pause\",\n          });\n        }\n        announce(enablePlayback\n          ? themeString(\"ritual_playing\", \"The line-drawing demonstration is playing.\")\n          : themeString(\"ritual_paused\", \"The line-drawing demonstration is paused.\"));\n      });\n    }\n    video.addEventListener(\"play\", syncPlayingState);\n    video.addEventListener(\"pause\", syncPlayingState);\n    observeVisibility(\n      video,\n      (visible) => {\n        inView = visible;\n        sync();\n      },\n      { threshold: 0.28 },\n    );\n    document.addEventListener(\"visibilitychange\", sync);\n    document.addEventListener(\"eagleline:media-state\", () => {\n      if (reducedMotion !== lastReducedMotion) {\n        lastReducedMotion = reducedMotion;\n        reducedMotionOverride = false;\n        playbackEnabled = !reducedMotion && !reducedData;\n        announce(\n          reducedMotion\n            ? themeString(\"ritual_reduced_motion\", \"The demonstration is paused for reduced motion.\")\n            : reducedData\n              ? themeString(\"ritual_reduced_data\", \"Autoplay is off for reduced data.\")\n              : themeString(\"ritual_motion_resumed\", \"The demonstration is playing after reduced motion was turned off.\"),\n        );\n      }\n      sync();\n    });\n    syncPlayingState();\n    syncToggle();\n  });\n\n  document.querySelectorAll(\"[data-youtube-embed]\").forEach((embed) => {\n    const button = embed.querySelector(\"[data-youtube-play]\");\n    const videoId = embed.dataset.youtubeId;\n    if (!button || !videoId) return;\n\n    button.addEventListener(\"click\", (event) => {\n      if (event.isTrusted) {\n        publishEagleLineEvent(\"eagleline_media_engage\", {\n          media_type: \"video\",\n          placement: \"mid_page\",\n          action: \"video_play\",\n        });\n      }\n      const iframe = document.createElement(\"iframe\");\n      iframe.src = `https://www.youtube-nocookie.com/embed/${encodeURIComponent(videoId)}?autoplay=1&rel=0&modestbranding=1&playsinline=1`;\n      iframe.title = themeString(\"lesson_video_title\", \"Kina Golf explains how to use a line on a golf ball when putting\");\n      iframe.allow = \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\";\n      iframe.referrerPolicy = \"strict-origin-when-cross-origin\";\n      iframe.allowFullscreen = true;\n      iframe.tabIndex = 0;\n      button.replaceWith(iframe);\n      iframe.focus();\n    });\n  });\n\n  const gallerySequences = new WeakMap();\n  const galleryImageLoads = new Map();\n  const GALLERY_MAIN_SIZES = \"(max-width: 820px) min(calc(100vw - 32px), 680px), (max-width: 1100px) and (orientation: portrait) min(calc(100vw - 48px), 920px), (max-width: 1100px) 48vw, 640px\";\n  const galleryControlSources = (control) => {\n    const fallback = control?.dataset.galleryThumb || \"\";\n    const midSrc = control?.dataset.galleryMidSrc || \"\";\n    const fullSrc = control?.dataset.galleryFullSrc || fallback;\n    const declaredFullWidth = Number(control?.dataset.galleryWidth);\n    const fullWidth = Number.isInteger(declaredFullWidth) && declaredFullWidth > 0\n      ? declaredFullWidth\n      : 1200;\n    const src = fullSrc || midSrc || fallback;\n    const srcset = midSrc && fullSrc ? `${midSrc} 768w, ${fullSrc} ${fullWidth}w` : \"\";\n    return {\n      src,\n      srcset,\n      sizes: srcset ? GALLERY_MAIN_SIZES : \"\",\n    };\n  };\n\n  const loadGalleryImage = (media) => {\n    const imageMedia = typeof media === \"string\" ? { src: media } : media;\n    const source = imageMedia?.src;\n    if (!source) return Promise.reject(new Error(\"Missing gallery image source\"));\n    const srcset = imageMedia.srcset || \"\";\n    const sizes = imageMedia.sizes || \"\";\n    const responsiveContext = srcset\n      ? `${window.innerWidth || 0}@${window.devicePixelRatio || 1}`\n      : \"\";\n    const cacheKey = JSON.stringify([source, srcset, sizes, responsiveContext]);\n    const cached = galleryImageLoads.get(cacheKey);\n    if (cached) return cached;\n\n    const request = new Promise((resolve, reject) => {\n      const preload = new Image();\n      let settled = false;\n      const timeout = window.setTimeout(() => {\n        if (settled) return;\n        settled = true;\n        reject(new Error(\"Gallery image load timed out\"));\n      }, 8000);\n      const finish = async () => {\n        if (settled) return;\n        try {\n          await preload.decode?.();\n        } catch {}\n        if (settled) return;\n        settled = true;\n        window.clearTimeout(timeout);\n        resolve(preload);\n      };\n      preload.onload = finish;\n      preload.onerror = () => {\n        if (settled) return;\n        settled = true;\n        window.clearTimeout(timeout);\n        reject(new Error(\"Gallery image failed to load\"));\n      };\n      preload.decoding = \"async\";\n      if (srcset) {\n        preload.sizes = sizes || GALLERY_MAIN_SIZES;\n        preload.srcset = srcset;\n      }\n      preload.src = source;\n      if (preload.complete && preload.naturalWidth) window.queueMicrotask(finish);\n    });\n\n    galleryImageLoads.set(cacheKey, request);\n    request.catch(() => {\n      if (galleryImageLoads.get(cacheKey) === request) galleryImageLoads.delete(cacheKey);\n    });\n    return request;\n  };\n\n  const warmGalleryControl = (control) => {\n    if (reducedData || !control?.dataset.galleryThumb) return;\n    loadGalleryImage(galleryControlSources(control)).catch(() => {});\n  };\n\n  const warmGalleryNeighbors = (gallery, activeControl = null) => {\n    if (reducedData) return;\n    const controls = [...gallery.querySelectorAll(\"[data-gallery-thumb]\")];\n    const current = activeControl\n      || controls.find((control) => control.getAttribute(\"aria-pressed\") === \"true\");\n    const currentIndex = controls.indexOf(current);\n    if (currentIndex < 0) return;\n    const warm = () => {\n      warmGalleryControl(controls[currentIndex - 1]);\n      warmGalleryControl(controls[currentIndex + 1]);\n    };\n    if (\"requestIdleCallback\" in window) {\n      window.requestIdleCallback(warm, { timeout: 1000 });\n    } else {\n      window.setTimeout(warm, 120);\n    }\n  };\n\n  const galleryMeasuredInteractions = new WeakMap();\n\n  const publishGalleryMediaEvent = (gallery, control, interactionSource, action = \"gallery_select\") => {\n    const mediaId = control?.dataset.galleryMediaId;\n    const mediaType = control?.dataset.galleryMediaType || \"image\";\n    if (!mediaId || !interactionSource) return;\n    const measured = galleryMeasuredInteractions.get(gallery) || new Set();\n    const measurementKey = [mediaId, interactionSource, action].join(\":\");\n    if (measured.has(measurementKey)) return;\n    const published = publishEagleLineEvent(\"eagleline_media_engage\", {\n      media_type: mediaType,\n      placement: pageType === \"product\" ? \"product_page\" : \"purchase_section\",\n      action,\n      media_id: mediaId,\n      interaction_source: interactionSource,\n    });\n    if (!published) return;\n    measured.add(measurementKey);\n    galleryMeasuredInteractions.set(gallery, measured);\n  };\n\n  const syncGalleryVideoToggle = (video, toggle) => {\n    if (!video || !toggle) return;\n    const playing = !video.paused && !video.ended;\n    toggle.classList.toggle(\"is-playing\", playing);\n    toggle.setAttribute(\"aria-label\", playing\n      ? themeString(\"gallery_pause_label\", \"Pause video\")\n      : themeString(\"gallery_play_label\", \"Play video\"));\n  };\n\n  const setGalleryMedia = async (gallery, media, activeControl = null, options = {}) => {\n    const frame = gallery.querySelector(\".el-gallery-main\");\n    const mainImage = gallery.querySelector(\"[data-gallery-main]\");\n    const mainVideo = gallery.querySelector(\"[data-gallery-main-video]\");\n    const videoToggle = gallery.querySelector(\"[data-gallery-video-toggle]\");\n    const index = gallery.querySelector(\"[data-gallery-index]\");\n    const controls = [...gallery.querySelectorAll(\"[data-gallery-thumb]\")];\n    const mediaType = media?.mediaType === \"video\" ? \"video\" : \"image\";\n    if (!frame || !mainImage || !mainVideo || !media?.src) return false;\n    if (mediaType === \"video\" && !media.videoSrc) return false;\n    const sequence = (gallerySequences.get(gallery) || 0) + 1;\n    gallerySequences.set(gallery, sequence);\n\n    const commit = () => {\n      if (sequence !== gallerySequences.get(gallery)) return false;\n      frame.dataset.galleryTreatment = media.treatment || \"\";\n\n      if (mediaType === \"video\") {\n        mainVideo.poster = media.src;\n        mainVideo.setAttribute(\"aria-label\", media.alt || themeString(\"gallery_fallback_alt\", \"EagleLine demonstration video\"));\n        if (mainVideo.dataset.gallerySource !== media.videoSrc) {\n          mainVideo.pause();\n          mainVideo.src = media.videoSrc;\n          mainVideo.dataset.gallerySource = media.videoSrc;\n          mainVideo.load();\n        }\n        mainImage.hidden = true;\n        mainVideo.hidden = false;\n        if (videoToggle) {\n          videoToggle.hidden = false;\n          syncGalleryVideoToggle(mainVideo, videoToggle);\n        }\n        if (!reducedMotion && options.autoplay !== false) {\n          window.setTimeout(() => {\n            if (mainVideo.hidden) return;\n            mainVideo.play().catch(() => {});\n          }, 0);\n        }\n      } else {\n        mainVideo.pause();\n        mainVideo.hidden = true;\n        if (videoToggle) videoToggle.hidden = true;\n        mainImage.hidden = false;\n        mainImage.sizes = media.sizes || GALLERY_MAIN_SIZES;\n        mainImage.srcset = media.srcset || media.src;\n        mainImage.src = media.src;\n        mainImage.decoding = \"async\";\n        mainImage.alt = media.alt || \"EagleLine\";\n        if (media.width) mainImage.width = Number(media.width);\n        if (media.height) mainImage.height = Number(media.height);\n        mainImage.dataset.galleryFit = media.fit || \"cover\";\n        mainImage.style.opacity = \"1\";\n      }\n\n      if (index && activeControl?.dataset.galleryIndexValue) {\n        index.textContent = activeControl.dataset.galleryIndexValue;\n      }\n      controls.forEach((control) => {\n        const active = control === activeControl;\n        control.classList.toggle(\"is-active\", active);\n        control.setAttribute(\"aria-pressed\", String(active));\n      });\n\n      const controlStrip = activeControl?.parentElement;\n      if (controlStrip && controlStrip.scrollWidth > controlStrip.clientWidth) {\n        window.requestAnimationFrame(() => {\n          const left = activeControl.offsetLeft - (controlStrip.clientWidth - activeControl.offsetWidth) / 2;\n          controlStrip.scrollTo({\n            left: Math.max(0, left),\n            behavior: options.instant || reducedMotion ? \"auto\" : \"smooth\",\n          });\n        });\n      }\n      warmGalleryNeighbors(gallery, activeControl);\n      return true;\n    };\n\n    gallery.setAttribute(\"aria-busy\", \"true\");\n    try {\n      await loadGalleryImage(media);\n      return commit();\n    } catch {\n      return false;\n    } finally {\n      if (sequence === gallerySequences.get(gallery)) gallery.removeAttribute(\"aria-busy\");\n    }\n  };\n\n  const galleryControlMedia = (control) => ({\n    ...galleryControlSources(control),\n    videoSrc: control?.dataset.galleryVideoSrc,\n    mediaType: control?.dataset.galleryMediaType || \"image\",\n    mediaId: control?.dataset.galleryMediaId,\n    alt: control?.dataset.galleryAlt,\n    width: control?.dataset.galleryWidth,\n    height: control?.dataset.galleryHeight,\n    fit: control?.dataset.galleryFit,\n    treatment: control?.dataset.galleryTreatment,\n  });\n\n  const selectGalleryControl = (gallery, control, event, options = {}) => {\n    if (!control) return Promise.resolve(false);\n    if (control.getAttribute(\"aria-pressed\") === \"true\") {\n      if (gallery.getAttribute(\"aria-busy\") === \"true\") {\n        gallerySequences.set(gallery, (gallerySequences.get(gallery) || 0) + 1);\n        gallery.removeAttribute(\"aria-busy\");\n      }\n      return Promise.resolve(false);\n    }\n    const customerSelection = Boolean(event?.isTrusted || options.customerSelection);\n    const interactionSource = options.interactionSource || \"thumbnail\";\n    return setGalleryMedia(gallery, galleryControlMedia(control), control, options).then((committed) => {\n      if (committed && customerSelection) {\n        publishGalleryMediaEvent(gallery, control, interactionSource);\n      }\n      return committed;\n    });\n  };\n  const initializeGallerySwipe = (gallery, controls) => {\n    const frame = gallery.querySelector(\".el-gallery-main\");\n    const mainImage = gallery.querySelector(\"[data-gallery-main]\");\n    const mainVideo = gallery.querySelector(\"[data-gallery-main-video]\");\n    if (!frame || !mainImage || !mainVideo || !(\"PointerEvent\" in window)) return;\n\n    const lockDistance = 6;\n    const flickDistance = 10;\n    const velocityWindow = 120;\n    const flickProjection = 220;\n    const commitVelocity = .18;\n    const quickGestureWindow = 180;\n    const edgeResistance = .18;\n    let gesture = null;\n    let track = null;\n    let settleTimer = 0;\n    let settleComplete = null;\n\n    mainImage.draggable = false;\n    mainVideo.draggable = false;\n\n    const trackImage = (control) => {\n      const sourceImage = control?.querySelector(\"img\");\n      const media = galleryControlSources(control);\n      const source = media.src || sourceImage?.currentSrc || sourceImage?.src;\n      if (!source) return document.createElement(\"span\");\n      const image = document.createElement(\"img\");\n      if (media.srcset) {\n        image.sizes = media.sizes || GALLERY_MAIN_SIZES;\n        image.srcset = media.srcset;\n      }\n      image.src = source;\n      image.decoding = \"async\";\n      image.alt = \"\";\n      image.draggable = false;\n      image.setAttribute(\"aria-hidden\", \"true\");\n      image.dataset.galleryFit = control?.dataset.galleryFit || \"cover\";\n      image.dataset.galleryTreatment = control?.dataset.galleryTreatment || \"\";\n      return image;\n    };\n\n    const removeTrack = () => {\n      window.clearTimeout(settleTimer);\n      settleTimer = 0;\n      if (track && settleComplete) track.removeEventListener(\"transitionend\", settleComplete);\n      settleComplete = null;\n      frame.classList.remove(\"is-swipe-tracking\", \"is-swipe-settling\");\n      track?.remove();\n      track = null;\n    };\n\n    const waitForMainMediaPaint = async () => {\n      if (!mainImage.hidden && typeof mainImage.decode === \"function\") {\n        const imageReady = new Promise((resolve) => {\n          if (mainImage.complete && mainImage.naturalWidth) {\n            resolve();\n            return;\n          }\n          let timeout = 0;\n          const finish = () => {\n            window.clearTimeout(timeout);\n            mainImage.removeEventListener(\"load\", finish);\n            mainImage.removeEventListener(\"error\", finish);\n            resolve();\n          };\n          mainImage.addEventListener(\"load\", finish, { once: true });\n          mainImage.addEventListener(\"error\", finish, { once: true });\n          timeout = window.setTimeout(finish, 800);\n        });\n        try {\n          await Promise.race([mainImage.decode(), imageReady]);\n        } catch {\n          await imageReady;\n        }\n      }\n      await new Promise((resolve) => {\n        window.requestAnimationFrame(() => window.requestAnimationFrame(resolve));\n      });\n    };\n\n    const buildTrack = (activeIndex) => {\n      removeTrack();\n      warmGalleryControl(controls[activeIndex - 1]);\n      warmGalleryControl(controls[activeIndex + 1]);\n      track = document.createElement(\"div\");\n      track.className = \"el-gallery-swipe-track\";\n      track.setAttribute(\"aria-hidden\", \"true\");\n      track.append(\n        activeIndex > 0 ? trackImage(controls[activeIndex - 1]) : document.createElement(\"span\"),\n        trackImage(controls[activeIndex]),\n        activeIndex < controls.length - 1 ? trackImage(controls[activeIndex + 1]) : document.createElement(\"span\"),\n      );\n      frame.append(track);\n      frame.classList.add(\"is-swipe-tracking\");\n    };\n\n    const resetGesture = () => {\n      gesture = null;\n      removeTrack();\n    };\n\n    const recordGestureSamples = (activeGesture, event) => {\n      let events = [];\n      try {\n        events = event.getCoalescedEvents?.() || [];\n      } catch {}\n      [...events, event].forEach((sample) => {\n        if (!Number.isFinite(sample.clientX) || !Number.isFinite(sample.timeStamp)) return;\n        const last = activeGesture.samples[activeGesture.samples.length - 1];\n        if (last && sample.timeStamp < last.time) return;\n        if (last && sample.timeStamp === last.time) {\n          last.x = sample.clientX;\n          return;\n        }\n        activeGesture.samples.push({ x: sample.clientX, time: sample.timeStamp });\n      });\n      const cutoff = event.timeStamp - velocityWindow;\n      activeGesture.samples = activeGesture.samples.filter((sample) => sample.time >= cutoff);\n      const clock = performance.now();\n      activeGesture.clockSamples.push({ x: event.clientX, time: clock });\n      activeGesture.clockSamples = activeGesture.clockSamples.filter(\n        (sample) => sample.time >= clock - velocityWindow,\n      );\n    };\n\n    const gestureReleaseVelocity = (activeGesture, releaseClock) => {\n      const samples = activeGesture.clockSamples.filter(\n        (sample) => sample.time >= releaseClock - velocityWindow,\n      );\n      if (samples.length < 2) return 0;\n      const first = samples[0];\n      const last = samples[samples.length - 1];\n      const elapsed = last.time - first.time;\n      return elapsed > 0 ? (last.x - first.x) / elapsed : 0;\n    };\n\n    const finishGesture = (event, cancelled = false, useLastPoint = false) => {\n      if (!gesture || event.pointerId !== gesture.pointerId) return;\n      const completedGesture = gesture;\n      gesture = null;\n      if (useLastPoint) {\n        const clock = performance.now();\n        completedGesture.clockSamples.push({ x: completedGesture.lastX, time: clock });\n        completedGesture.clockSamples = completedGesture.clockSamples.filter(\n          (sample) => sample.time >= clock - velocityWindow,\n        );\n      } else {\n        recordGestureSamples(completedGesture, event);\n      }\n      const releaseX = !useLastPoint && Number.isFinite(event.clientX)\n        ? event.clientX\n        : completedGesture.lastX;\n      const releaseY = !useLastPoint && Number.isFinite(event.clientY)\n        ? event.clientY\n        : completedGesture.lastY;\n      completedGesture.deltaX = releaseX - completedGesture.startX;\n      completedGesture.deltaY = releaseY - completedGesture.startY;\n      if (frame.hasPointerCapture?.(completedGesture.pointerId)) {\n        try {\n          frame.releasePointerCapture(completedGesture.pointerId);\n        } catch {}\n      }\n      if (cancelled || completedGesture.axis === \"vertical\") {\n        removeTrack();\n        return;\n      }\n\n      if (!completedGesture.axis) {\n        const absoluteX = Math.abs(completedGesture.deltaX);\n        const absoluteY = Math.abs(completedGesture.deltaY);\n        if (\n          Math.max(absoluteX, absoluteY) < lockDistance\n          || absoluteX < lockDistance\n          || absoluteY > absoluteX * 1.2\n        ) {\n          removeTrack();\n          return;\n        }\n        completedGesture.axis = \"horizontal\";\n        buildTrack(completedGesture.activeIndex);\n      }\n\n      if (!track) return;\n\n      const width = frame.clientWidth || 1;\n      const direction = completedGesture.deltaX < 0 ? 1 : -1;\n      const targetIndex = completedGesture.activeIndex + direction;\n      const hasTarget = targetIndex >= 0 && targetIndex < controls.length;\n      const distance = Math.abs(completedGesture.deltaX);\n      const distanceThreshold = Math.min(width * .16, 56);\n      const releaseClock = performance.now();\n      const recentVelocityX = gestureReleaseVelocity(completedGesture, releaseClock);\n      const wholeGestureElapsed = releaseClock - completedGesture.startedAt;\n      const wholeGestureVelocityX = wholeGestureElapsed > 0 && wholeGestureElapsed <= quickGestureWindow\n        ? completedGesture.deltaX / wholeGestureElapsed\n        : 0;\n      const releaseVelocityX = Math.abs(wholeGestureVelocityX) > Math.abs(recentVelocityX)\n        ? wholeGestureVelocityX\n        : recentVelocityX;\n      const projectedDistance = distance + Math.abs(releaseVelocityX) * flickProjection;\n      const velocityCommits = distance >= flickDistance\n        && Math.abs(releaseVelocityX) >= commitVelocity\n        && Math.sign(releaseVelocityX) === Math.sign(completedGesture.deltaX)\n        && projectedDistance >= distanceThreshold;\n      const commits = hasTarget && (distance >= distanceThreshold || velocityCommits);\n      const finalX = commits ? -direction * width : 0;\n      const translatedX = hasTarget\n        ? completedGesture.deltaX\n        : completedGesture.deltaX * edgeResistance;\n      track.style.transform = `translate3d(${translatedX}px, 0, 0)`;\n\n      const complete = () => {\n        if (commits) {\n          selectGalleryControl(gallery, controls[targetIndex], event, {\n            instant: true,\n            interactionSource: \"swipe\",\n          })\n            .then(async (committed) => {\n              if (committed) await waitForMainMediaPaint();\n            })\n            .finally(removeTrack);\n          return;\n        }\n        removeTrack();\n      };\n\n      if (reducedMotion) {\n        track.style.transform = `translate3d(${finalX}px, 0, 0)`;\n        complete();\n        return;\n      }\n\n      frame.classList.add(\"is-swipe-settling\");\n      const settlingTrack = track;\n      let settled = false;\n      const finishSettle = (transitionEvent = null) => {\n        if (\n          transitionEvent\n          && (transitionEvent.target !== settlingTrack || transitionEvent.propertyName !== \"transform\")\n        ) return;\n        if (settled) return;\n        settled = true;\n        window.clearTimeout(settleTimer);\n        settleTimer = 0;\n        settlingTrack.removeEventListener(\"transitionend\", finishSettle);\n        if (settleComplete === finishSettle) settleComplete = null;\n        complete();\n      };\n      settleComplete = finishSettle;\n      settlingTrack.addEventListener(\"transitionend\", finishSettle);\n      window.requestAnimationFrame(() => {\n        if (track !== settlingTrack) return;\n        settlingTrack.style.transform = `translate3d(${finalX}px, 0, 0)`;\n        settleTimer = window.setTimeout(finishSettle, 450);\n      });\n    };\n\n    frame.addEventListener(\"pointerdown\", (event) => {\n      if (event.pointerType !== \"touch\") return;\n      if (event.target.closest?.(\"[data-gallery-video-toggle]\")) return;\n      if (!event.isPrimary) {\n        resetGesture();\n        return;\n      }\n      if (event.button !== 0 || track || gallery.getAttribute(\"aria-busy\") === \"true\") return;\n      const activeIndex = controls.findIndex((control) => control.getAttribute(\"aria-pressed\") === \"true\");\n      if (activeIndex < 0) return;\n      gesture = {\n        pointerId: event.pointerId,\n        activeIndex,\n        startX: event.clientX,\n        startY: event.clientY,\n        lastX: event.clientX,\n        lastY: event.clientY,\n        deltaX: 0,\n        deltaY: 0,\n        samples: [{ x: event.clientX, time: event.timeStamp }],\n        clockSamples: [{ x: event.clientX, time: performance.now() }],\n        startedAt: performance.now(),\n        axis: null,\n      };\n    });\n\n    frame.addEventListener(\"pointermove\", (event) => {\n      if (!gesture || event.pointerId !== gesture.pointerId) return;\n      const deltaX = event.clientX - gesture.startX;\n      const deltaY = event.clientY - gesture.startY;\n      gesture.lastX = event.clientX;\n      gesture.lastY = event.clientY;\n      const absoluteX = Math.abs(deltaX);\n      const absoluteY = Math.abs(deltaY);\n\n      if (!gesture.axis) {\n        if (Math.max(absoluteX, absoluteY) < lockDistance) return;\n        if (absoluteY >= 10 && absoluteY >= absoluteX * 1.73) {\n          gesture.axis = \"vertical\";\n          return;\n        }\n        if (absoluteX < lockDistance || absoluteY > absoluteX * 1.2) return;\n        gesture.axis = \"horizontal\";\n        buildTrack(gesture.activeIndex);\n        try {\n          frame.setPointerCapture(event.pointerId);\n        } catch {}\n      }\n\n      if (gesture.axis !== \"horizontal\" || !track) return;\n      event.preventDefault();\n      recordGestureSamples(gesture, event);\n      gesture.deltaX = deltaX;\n      gesture.deltaY = deltaY;\n      const direction = deltaX < 0 ? 1 : -1;\n      const targetIndex = gesture.activeIndex + direction;\n      const hasTarget = targetIndex >= 0 && targetIndex < controls.length;\n      const translatedX = hasTarget ? deltaX : deltaX * edgeResistance;\n      track.style.transform = `translate3d(${translatedX}px, 0, 0)`;\n    }, { passive: false });\n\n    frame.addEventListener(\"pointerup\", (event) => finishGesture(event));\n    frame.addEventListener(\"pointercancel\", (event) => {\n      finishGesture(event, gesture?.axis !== \"horizontal\", true);\n    });\n    frame.addEventListener(\"lostpointercapture\", (event) => {\n      if (event.target !== frame) return;\n      if (gesture && event.pointerId === gesture.pointerId) resetGesture();\n    });\n  };\n\n  const initializeGalleryRailHint = (gallery) => {\n    const rail = gallery.querySelector(\".el-gallery-controls\");\n    const coarsePointer = window.matchMedia?.(\"(pointer: coarse)\").matches;\n    if (!rail || !coarsePointer || reducedMotion || reducedData || !(\"IntersectionObserver\" in window)) return;\n\n    let cancelled = false;\n    let animation = null;\n    const cancel = () => {\n      cancelled = true;\n      animation?.cancel?.();\n      observer.disconnect();\n      rail.style.removeProperty(\"scroll-snap-type\");\n    };\n    [\"pointerdown\", \"wheel\", \"keydown\", \"touchstart\"].forEach((eventName) => {\n      gallery.addEventListener(eventName, cancel, { once: true, passive: eventName !== \"keydown\" });\n    });\n    gallery.addEventListener(\"eagleline:variant-change\", (event) => {\n      if (event.detail?.userInitiated) cancel();\n    });\n\n    const observer = new IntersectionObserver((entries) => {\n      if (cancelled || !entries.some((entry) => entry.isIntersecting && entry.intersectionRatio >= .35)) return;\n      observer.disconnect();\n      if (rail.scrollWidth <= rail.clientWidth + 4 || typeof rail.animate !== \"function\") return;\n      rail.style.setProperty(\"scroll-snap-type\", \"none\");\n      animation = rail.animate(\n        [\n          { transform: \"translate3d(0, 0, 0)\", easing: \"cubic-bezier(.37,0,.63,1)\" },\n          { transform: \"translate3d(-18px, 0, 0)\", offset: .22, easing: \"cubic-bezier(.37,0,.63,1)\" },\n          { transform: \"translate3d(0, 0, 0)\", offset: .43, easing: \"cubic-bezier(.37,0,.63,1)\" },\n          { transform: \"translate3d(-14px, 0, 0)\", offset: .7, easing: \"cubic-bezier(.37,0,.63,1)\" },\n          { transform: \"translate3d(0, 0, 0)\" },\n        ],\n        { duration: 1400, delay: 350, easing: \"linear\", iterations: 1 },\n      );\n      const restoreSnap = () => rail.style.removeProperty(\"scroll-snap-type\");\n      if (animation.finished?.finally) animation.finished.finally(restoreSnap).catch(() => {});\n      else window.setTimeout(restoreSnap, 1900);\n    }, { threshold: [.35] });\n    observer.observe(rail);\n  };\n\n  const primeGalleryMain = (gallery, { urgent = false } = {}) => {\n    const mainImage = gallery?.querySelector(\"[data-gallery-main]\");\n    const activeControl = gallery?.querySelector('[data-gallery-thumb][aria-pressed=\"true\"]');\n    if (!mainImage || !activeControl) return Promise.resolve();\n    mainImage.loading = \"eager\";\n    if (\"fetchPriority\" in mainImage) mainImage.fetchPriority = urgent ? \"high\" : \"low\";\n    return loadGalleryImage(galleryControlSources(activeControl));\n  };\n\n  const productGallery = document.querySelector(\"[data-product-gallery][data-gallery]\");\n  if (productGallery) {\n    const primeFromIntent = () => {\n      primeGalleryMain(productGallery, { urgent: true })\n        .then(() => {\n          if (!reducedData) warmGalleryNeighbors(productGallery);\n        })\n        .catch(() => {});\n    };\n    document.querySelectorAll('[data-purchase-cta][data-cta-destination=\"product_gallery\"]').forEach((cta) => {\n      cta.addEventListener(\"pointerdown\", primeFromIntent, { passive: true });\n      cta.addEventListener(\"focus\", primeFromIntent, { passive: true });\n      cta.addEventListener(\"click\", primeFromIntent, { passive: true });\n    });\n\n    if (pageType === \"home\" && !reducedData) {\n      const heroImage = document.querySelector('.el-v63-hero img[fetchpriority=\"high\"]');\n      const schedulePrime = () => {\n        const run = () => primeGalleryMain(productGallery).catch(() => {});\n        if (\"requestIdleCallback\" in window) window.requestIdleCallback(run, { timeout: 1200 });\n        else window.setTimeout(run, 120);\n      };\n      if (typeof heroImage?.decode === \"function\") {\n        heroImage.decode().catch(() => {}).then(schedulePrime);\n      } else if (heroImage?.complete) schedulePrime();\n      else heroImage?.addEventListener(\"load\", schedulePrime, { once: true });\n    }\n  }\n\n  document.querySelectorAll(\"[data-gallery]\").forEach((gallery) => {\n    const controls = [...gallery.querySelectorAll(\"[data-gallery-thumb]\")];\n    const mainVideo = gallery.querySelector(\"[data-gallery-main-video]\");\n    const videoToggle = gallery.querySelector(\"[data-gallery-video-toggle]\");\n    controls.forEach((button) => {\n      button.disabled = false;\n      button.addEventListener(\"click\", (event) => {\n        selectGalleryControl(gallery, button, event, { interactionSource: \"thumbnail\" });\n      });\n    });\n    if (mainVideo && videoToggle) {\n      [\"play\", \"pause\", \"ended\"].forEach((eventName) => {\n        mainVideo.addEventListener(eventName, () => syncGalleryVideoToggle(mainVideo, videoToggle));\n      });\n      videoToggle.addEventListener(\"click\", (event) => {\n        event.preventDefault();\n        event.stopPropagation();\n        const activeControl = controls.find((control) => control.getAttribute(\"aria-pressed\") === \"true\");\n        if (!activeControl || activeControl.dataset.galleryMediaType !== \"video\") return;\n        if (mainVideo.paused) {\n          mainVideo.play().then(() => {\n            if (event.isTrusted) {\n              publishGalleryMediaEvent(gallery, activeControl, \"video_control\", \"video_play\");\n            }\n          }).catch(() => {});\n          return;\n        }\n        mainVideo.pause();\n        if (event.isTrusted) {\n          publishGalleryMediaEvent(gallery, activeControl, \"video_control\", \"video_pause\");\n        }\n      });\n      syncGalleryVideoToggle(mainVideo, videoToggle);\n    }\n    initializeGallerySwipe(gallery, controls);\n    initializeGalleryRailHint(gallery);\n    if (reducedData) return;\n    const warm = () => warmGalleryNeighbors(gallery);\n    let warmScheduled = false;\n    const scheduleWarm = () => {\n      if (warmScheduled) return;\n      warmScheduled = true;\n      const runWhenIdle = () => {\n        window.requestAnimationFrame(() => {\n          if (\"requestIdleCallback\" in window) window.requestIdleCallback(warm, { timeout: 1500 });\n          else window.setTimeout(warm, 0);\n        });\n      };\n      const mainImage = gallery.querySelector(\"[data-gallery-main]\");\n      if (typeof mainImage?.decode === \"function\") {\n        mainImage.decode().catch(() => {}).then(runWhenIdle);\n      } else runWhenIdle();\n    };\n    if (!(\"IntersectionObserver\" in window)) {\n      scheduleWarm();\n      return;\n    }\n    const observer = new IntersectionObserver((entries) => {\n      if (!entries.some((entry) => entry.isIntersecting)) return;\n      observer.disconnect();\n      scheduleWarm();\n    }, { rootMargin: \"400px 0px\" });\n    observer.observe(gallery);\n  });\n\n\n  document.querySelectorAll(\"[data-mechanism-switcher]\").forEach((switcher) => {\n    const panels = [...switcher.querySelectorAll(\"video[data-mechanism-panel]\")];\n    const tabs = [...switcher.querySelectorAll(\"[data-mechanism-tab]\")];\n    const label = switcher.querySelector(\"[data-mechanism-label]\");\n    const summaryTitle = switcher.querySelector(\"[data-mechanism-summary-title]\");\n    const summaryCopy = switcher.querySelector(\"[data-mechanism-summary-copy]\");\n    const toggle = switcher.querySelector(\"[data-mechanism-toggle]\");\n    const toggleText = switcher.querySelector(\"[data-mechanism-toggle-text]\");\n    const toggleIcon = switcher.querySelector(\"[data-mechanism-toggle-icon]\");\n    const status = switcher.querySelector(\"[data-mechanism-status]\");\n    if (!panels.length || panels.length !== tabs.length) return;\n\n    tabs.forEach((tab) => { tab.disabled = false; });\n    panels.forEach((panel) => {\n      panel.muted = true;\n      panel.loop = true;\n      panel.playsInline = true;\n      panel.removeAttribute(\"controls\");\n      panel.pause();\n    });\n    if (toggle) {\n      toggle.hidden = false;\n      toggle.disabled = false;\n    }\n\n    let activeIndex = 0;\n    let inView = false;\n    let playbackEnabled = !reducedMotion && !reducedData;\n    let reducedMotionOverride = false;\n    const currentPanel = () => panels[activeIndex];\n    const playbackRequested = () =>\n      playbackEnabled && (!reducedMotion || reducedMotionOverride);\n\n    const announce = (message) => {\n      if (status) status.textContent = message;\n    };\n    const syncToggle = () => {\n      const enabled = playbackRequested();\n      const text = enabled\n        ? themeString(\"mechanism_pause_label\", \"Pause the mechanism video\")\n        : themeString(\"mechanism_play_label\", \"Play the mechanism video\");\n      toggle?.setAttribute(\"aria-label\", text);\n      toggle?.setAttribute(\"data-media-playback\", enabled ? \"enabled\" : \"paused\");\n      if (toggleText) toggleText.textContent = enabled\n        ? themeString(\"pause\", \"Pause\")\n        : themeString(\"play\", \"Play\");\n      if (toggleIcon) toggleIcon.textContent = enabled ? \"\u2161\" : \"\u25B6\";\n    };\n    const syncPlayingState = () => {\n      toggle?.setAttribute(\"data-media-playing\", String(!currentPanel().paused));\n    };\n    const playCurrent = () => {\n      const panel = currentPanel();\n      if (playbackRequested() && !document.hidden && inView && isVisible(panel)) safePlay(panel);\n      else panel.pause();\n      syncToggle();\n    };\n    const activate = (index) => {\n      activeIndex = (index + panels.length) % panels.length;\n      panels.forEach((panel, panelIndex) => {\n        const active = panelIndex === activeIndex;\n        panel.pause();\n        panel.classList.toggle(\"is-current\", active);\n        panel.setAttribute(\"aria-hidden\", String(!active));\n        panel.tabIndex = -1;\n      });\n      tabs.forEach((tab, tabIndex) => {\n        const active = tabIndex === activeIndex;\n        tab.classList.toggle(\"is-current\", active);\n        tab.closest(\"li\")?.classList.toggle(\"is-current\", active);\n        tab.setAttribute(\"aria-pressed\", String(active));\n        tab.removeAttribute(\"aria-selected\");\n        tab.tabIndex = 0;\n      });\n      if (label) label.textContent = tabs[activeIndex].dataset.mechanismLabel || tabs[activeIndex].textContent.trim();\n      if (summaryTitle) summaryTitle.textContent = tabs[activeIndex].querySelector(\"strong\")?.textContent || \"\";\n      if (summaryCopy) summaryCopy.textContent = tabs[activeIndex].querySelector(\"span\")?.textContent || \"\";\n      playCurrent();\n      syncPlayingState();\n      syncToggle();\n      document.dispatchEvent(new CustomEvent(\"eagleline:media-state\"));\n    };\n\n    panels.forEach((panel) => {\n      panel.addEventListener(\"play\", syncPlayingState);\n      panel.addEventListener(\"pause\", syncPlayingState);\n    });\n    tabs.forEach((tab, index) => tab.addEventListener(\"click\", (event) => {\n      if (index === activeIndex) return;\n      if (event.isTrusted) {\n        publishEagleLineEvent(\"eagleline_media_engage\", {\n          media_type: \"video\",\n          placement: \"mid_page\",\n          action: \"gallery_select\",\n        });\n      }\n      activate(index);\n    }));\n    toggle?.addEventListener(\"click\", (event) => {\n      const enablePlayback = !playbackRequested();\n      playbackEnabled = enablePlayback;\n      reducedMotionOverride = enablePlayback && reducedMotion;\n      if (!enablePlayback) panels.forEach((panel) => panel.pause());\n      else playCurrent();\n      if (event.isTrusted) {\n        publishEagleLineEvent(\"eagleline_media_engage\", {\n          media_type: \"video\",\n          placement: \"mid_page\",\n          action: enablePlayback ? \"video_play\" : \"video_pause\",\n        });\n      }\n      announce(enablePlayback\n        ? themeString(\"mechanism_playing\", \"The mechanism video is playing.\")\n        : themeString(\"mechanism_paused\", \"The mechanism video is paused.\"));\n      syncPlayingState();\n      syncToggle();\n    });\n    observeVisibility(\n      switcher,\n      (visible) => {\n        inView = visible;\n        if (visible) playCurrent();\n        else panels.forEach((panel) => panel.pause());\n        syncToggle();\n      },\n      { threshold: 0.32 },\n    );\n    document.addEventListener(\"visibilitychange\", () => {\n      if (document.hidden) panels.forEach((panel) => panel.pause());\n      else playCurrent();\n      syncToggle();\n    });\n    document.addEventListener(\"eagleline:media-state\", playCurrent);\n    switcher.addEventListener(\"keydown\", (event) => {\n      if (!tabs.includes(document.activeElement)) return;\n      if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n      event.preventDefault();\n      const direction = event.key === \"ArrowRight\" ? 1 : -1;\n      const index = (tabs.indexOf(document.activeElement) + direction + tabs.length) % tabs.length;\n      tabs[index].focus();\n      if (event.isTrusted) {\n        publishEagleLineEvent(\"eagleline_media_engage\", {\n          media_type: \"video\",\n          placement: \"mid_page\",\n          action: \"gallery_select\",\n        });\n      }\n      activate(index);\n    });\n    onMediaChange(motionPreference, (event) => {\n      reducedMotionOverride = false;\n      playbackEnabled = !event.matches && !reducedData;\n      if (event.matches) {\n        panels.forEach((panel) => panel.pause());\n      } else playCurrent();\n      announce(\n        event.matches\n          ? themeString(\"mechanism_reduced_motion\", \"The mechanism video is paused for reduced motion.\")\n          : reducedData\n            ? themeString(\"mechanism_reduced_data\", \"Mechanism autoplay is off for reduced data.\")\n            : themeString(\"mechanism_motion_resumed\", \"The mechanism video is playing after reduced motion was turned off.\"),\n      );\n      syncPlayingState();\n      syncToggle();\n    });\n    activate(0);\n  });\n\n  document.querySelectorAll(\"[data-product-form]\").forEach((root) => {\n    const productScript = root.querySelector(\"[data-product-json]\");\n    if (!productScript) return;\n\n    let product;\n    try {\n      product = JSON.parse(productScript.textContent);\n    } catch {\n      return;\n    }\n\n    const form = root.querySelector(\"form\");\n    const variantSelector = root.querySelector(\"[data-variant-id]\");\n    const price = root.querySelector(\"[data-product-price]\");\n    const status = root.querySelector(\"[data-variant-status]\");\n    const acceleratedCheckout = root.querySelector(\"[data-accelerated-checkout]\");\n    const checkoutDivider = root.querySelector(\"[data-checkout-divider]\");\n    const directCheckout = root.querySelector(\"[data-direct-checkout]\");\n    const directCheckoutText = root.querySelector(\"[data-direct-checkout-text]\");\n    const selectionGates = [...root.querySelectorAll(\"[data-selection-gate]\")];\n    const gallery = root.closest(\".el-product-grid\")?.querySelector(\"[data-gallery]\");\n    const optionControls = root.querySelector(\"[data-option-controls]\");\n    const optionButtons = [...root.querySelectorAll(\"[data-option-control]\")];\n    const strings = product.strings || {};\n    const locale = product.locale || document.documentElement.lang || undefined;\n    const currency = product.currency || \"\";\n    let currencyFormatter = null;\n    try {\n      if (currency) currencyFormatter = new Intl.NumberFormat(locale, { style: \"currency\", currency });\n    } catch {\n      currencyFormatter = null;\n    }\n    const money = (cents, formatted = \"\") => (\n      formatted\n      || currencyFormatter?.format(Number(cents || 0) / 100)\n      || String(Number(cents || 0) / 100)\n    );\n    const renderString = (template, replacements = {}) => Object.entries(replacements).reduce(\n      (result, [token, value]) => result.replaceAll(token, () => String(value)),\n      template || \"\",\n    );\n    const displayPrice = (variant) => money(variant?.price, variant?.priceFormatted);\n    const canonicalPack = (value) => value === \"one_pack\" || value === \"two_pack\" ? value : \"\";\n    const canonicalColor = (value) => value === \"black\" || value === \"white\" ? value : \"\";\n    let selectedPackKey = null;\n    let selectedColorKey = null;\n    let internalVariantChange = false;\n    let pendingSelectionEvents = new Map();\n    let checkoutHighlighted = false;\n\n    if (variantSelector && status?.id) variantSelector.setAttribute(\"aria-describedby\", status.id);\n    if (variantSelector && optionControls && optionButtons.length) {\n      optionControls.hidden = false;\n      variantSelector.closest(\".el-option-group\")?.classList.add(\"has-options\");\n      variantSelector.tabIndex = -1;\n      variantSelector.hidden = true;\n      variantSelector.required = false;\n      if (form) form.noValidate = true;\n    }\n\n    const findVariant = () =>\n      product.variants.find((variant) => String(variant.id) === variantSelector?.value);\n    const findVariantByKeys = (packKey, colorKey) =>\n      product.variants.find((variant) => variant.packKey === packKey && variant.colorKey === colorKey);\n    const selectionPrompt = () => {\n      if (!selectedPackKey && !selectedColorKey) return strings.selectionPrompt || \"\";\n      if (!selectedPackKey) return strings.selectionPack || \"\";\n      if (!selectedColorKey) return strings.selectionColor || \"\";\n      return strings.selectionCheck || \"\";\n    };\n\n    const syncOptionControls = () => {\n      optionButtons.forEach((button) => {\n        const name = button.dataset.optionName;\n        const value = button.dataset.optionValue;\n        const candidatePackKey = name === \"pack\" ? canonicalPack(value) : selectedPackKey;\n        const candidateColorKey = name === \"color\" ? canonicalColor(value) : selectedColorKey;\n        const candidateAvailable = product.variants.some((variant) => (\n          variant.available\n          && (!candidatePackKey || variant.packKey === candidatePackKey)\n          && (!candidateColorKey || variant.colorKey === candidateColorKey)\n        ));\n        const active = name === \"pack\" ? value === selectedPackKey : value === selectedColorKey;\n        button.classList.toggle(\"is-selected\", active);\n        button.setAttribute(\"aria-pressed\", String(active));\n        button.disabled = !candidateAvailable;\n      });\n    };\n\n    const selectGalleryColor = (colorKey, userInitiated = false) => {\n      if (!gallery) return;\n      const matching = gallery.querySelector(`[data-gallery-primary-color=\"${canonicalColor(colorKey)}\"]`);\n      if (matching) {\n        selectGalleryControl(gallery, matching, null, {\n          autoplay: false,\n          customerSelection: Boolean(userInitiated),\n          instant: true,\n          interactionSource: \"color_auto\",\n        });\n      }\n    };\n\n    const updateGallery = (variant, changeDetail = null) => {\n      if (!gallery) return;\n      gallery.dataset.selectedVariantId = String(variant.id);\n      gallery.dispatchEvent(\n        new CustomEvent(\"eagleline:variant-change\", {\n          bubbles: true,\n          detail: { variant, userInitiated: Boolean(changeDetail?.userInitiated) },\n        }),\n      );\n    };\n\n    const syncPurchaseState = (variant) => {\n      const complete = Boolean(selectedPackKey && selectedColorKey);\n      const ready = Boolean(complete && variant?.available);\n      root.dataset.selectionReady = String(ready);\n      if (acceleratedCheckout) {\n        acceleratedCheckout.dataset.variantId = ready ? String(variant.id) : \"\";\n        acceleratedCheckout.setAttribute(\"aria-disabled\", String(!ready));\n        acceleratedCheckout.setAttribute(\"aria-hidden\", String(!ready));\n        acceleratedCheckout.toggleAttribute(\"inert\", !ready);\n        acceleratedCheckout.classList.toggle(\"is-selection-incomplete\", !ready);\n      }\n      if (checkoutDivider) checkoutDivider.hidden = false;\n      if (directCheckout) {\n        directCheckout.dataset.variantId = ready ? String(variant.id) : \"\";\n        directCheckout.setAttribute(\"aria-disabled\", String(!ready));\n        directCheckout.setAttribute(\"aria-hidden\", String(!ready));\n        directCheckout.toggleAttribute(\"inert\", !ready);\n        directCheckout.classList.toggle(\"is-selection-incomplete\", !ready);\n        if (ready && variant.checkoutUrl) directCheckout.href = variant.checkoutUrl;\n        else directCheckout.removeAttribute(\"href\");\n      }\n      selectionGates.forEach((selectionGate) => {\n        selectionGate.hidden = ready;\n        selectionGate.setAttribute(\"aria-label\", ready ? \"\" : complete ? strings.selectionSoldOut || \"\" : selectionPrompt());\n      });\n      if (directCheckoutText) {\n        directCheckoutText.textContent = complete && !variant?.available\n          ? strings.soldOut || \"\"\n          : strings.checkout || \"\";\n      }\n    };\n\n    const publishPendingSelections = (variant) => {\n      if (!variant?.available || !pendingSelectionEvents.size) return;\n      const events = [...pendingSelectionEvents.values()];\n      pendingSelectionEvents.clear();\n      events.forEach((changeDetail) => {\n        publishEagleLineEvent(\"eagleline_option_select\", {\n          option: changeDetail.option === \"pack\" ? \"pack_size\" : \"color\",\n          value: changeDetail.option === \"pack\"\n            ? canonicalPack(changeDetail.value)\n            : canonicalColor(changeDetail.value),\n          variant_id: String(variant.id),\n          pack_size: canonicalPack(variant.packKey),\n          color: canonicalColor(variant.colorKey),\n        });\n      });\n    };\n\n    const updateSelection = (changeDetail = null, syncSelector = true) => {\n      const variant = selectedPackKey && selectedColorKey\n        ? findVariantByKeys(selectedPackKey, selectedColorKey)\n        : null;\n      const nextVariantId = variant ? String(variant.id) : \"\";\n      if (syncSelector && variantSelector && variantSelector.value !== nextVariantId) {\n        internalVariantChange = true;\n        variantSelector.value = nextVariantId;\n        variantSelector.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        internalVariantChange = false;\n      }\n      syncOptionControls();\n      if (status) {\n        status.textContent = !selectedPackKey || !selectedColorKey\n          ? selectionPrompt()\n          : variant?.available\n          ? renderString(strings.statusAvailable, {\n            __EL_TITLE__: variant.title,\n            __EL_PRICE__: displayPrice(variant),\n          })\n          : renderString(strings.statusSoldOut, {\n            __EL_TITLE__: variant?.title || strings.selectedCombination || \"\",\n          });\n        status.classList.toggle(\"is-available\", Boolean(variant?.available));\n      }\n      if (variant?.available) {\n        if (price) price.textContent = displayPrice(variant);\n        updateGallery(variant, changeDetail);\n        if (changeDetail?.userInitiated && !checkoutHighlighted && !reducedMotion && directCheckout?.animate) {\n          checkoutHighlighted = true;\n          directCheckout.animate(\n            [\n              { boxShadow: \"0 0 0 0 rgba(7,87,213,0)\" },\n              { boxShadow: \"0 0 0 4px rgba(7,87,213,.18)\", offset: .45 },\n              { boxShadow: \"0 0 0 0 rgba(7,87,213,0)\" },\n            ],\n            { duration: 560, easing: \"ease-out\", iterations: 1 },\n          );\n        }\n        publishPendingSelections(variant);\n      }\n      syncPurchaseState(variant);\n    };\n\n    variantSelector?.addEventListener(\"change\", () => {\n      if (internalVariantChange) return;\n      const variant = findVariant();\n      selectedPackKey = canonicalPack(variant?.packKey) || null;\n      selectedColorKey = canonicalColor(variant?.colorKey) || null;\n      pendingSelectionEvents.clear();\n      if (selectedColorKey) selectGalleryColor(selectedColorKey, false);\n      updateSelection(null, false);\n    });\n    optionButtons.forEach((button) => {\n      button.addEventListener(\"click\", (event) => {\n        if (!variantSelector || button.disabled) return;\n        const option = button.dataset.optionName;\n        const value = button.dataset.optionValue;\n        const currentValue = option === \"pack\" ? selectedPackKey : selectedColorKey;\n        if (value === currentValue) return;\n        if (option === \"pack\") selectedPackKey = canonicalPack(value) || null;\n        else selectedColorKey = canonicalColor(value) || null;\n        const changeDetail = { option, value, userInitiated: event.isTrusted };\n        if (event.isTrusted) pendingSelectionEvents.set(option, changeDetail);\n        if (option === \"color\") selectGalleryColor(value, event.isTrusted);\n        updateSelection(changeDetail);\n      });\n    });\n    const initialVariant = findVariant();\n    selectedPackKey = canonicalPack(initialVariant?.packKey) || null;\n    selectedColorKey = canonicalColor(initialVariant?.colorKey) || null;\n    if (selectedColorKey) selectGalleryColor(selectedColorKey, false);\n    updateSelection(null, false);\n\n    window.addEventListener(\"pageshow\", () => {\n      window.requestAnimationFrame(() => {\n        const restoredVariant = findVariant();\n        const selectedVariant = selectedPackKey && selectedColorKey\n          ? findVariantByKeys(selectedPackKey, selectedColorKey)\n          : null;\n        if ((restoredVariant?.id || null) === (selectedVariant?.id || null)) return;\n        selectedPackKey = canonicalPack(restoredVariant?.packKey) || null;\n        selectedColorKey = canonicalColor(restoredVariant?.colorKey) || null;\n        pendingSelectionEvents.clear();\n        if (selectedColorKey) selectGalleryColor(selectedColorKey, false);\n        updateSelection(null, false);\n      });\n    });\n\n  });\n\n  /* FAQ accordion: a smooth height tween on top of the native <details>\n     toggle. No-JS keeps the instant native behavior; reduced motion skips\n     the controller entirely. The .is-animating class clips the box while\n     the tween runs. */\n  if (!reducedMotion) {\n    document.querySelectorAll(\".el-v6-support-list details\").forEach((details) => {\n      const summary = details.querySelector(\"summary\");\n      if (!summary) return;\n      summary.addEventListener(\"click\", (event) => {\n        event.preventDefault();\n        if (details.dataset.animating) return;\n        const summaryHeight = summary.offsetHeight;\n        const options = { duration: 320, easing: \"cubic-bezier(.22, 1, .36, 1)\" };\n        details.dataset.animating = \"1\";\n        details.classList.add(\"is-animating\");\n        if (details.open) {\n          const start = details.offsetHeight;\n          const animation = details.animate({ height: [start + \"px\", summaryHeight + \"px\"] }, options);\n          animation.onfinish = () => {\n            details.open = false;\n            delete details.dataset.animating;\n            details.classList.remove(\"is-animating\");\n          };\n        } else {\n          details.open = true;\n          const end = details.offsetHeight;\n          const animation = details.animate({ height: [summaryHeight + \"px\", end + \"px\"] }, options);\n          animation.onfinish = () => {\n            delete details.dataset.animating;\n            details.classList.remove(\"is-animating\");\n          };\n        }\n      });\n    });\n  }\n  };\n\n  /* On compact screens, let the responsive hero image reach first paint\n     before initializing below-fold motion and controls. Essential content,\n     links, and native form fallbacks already work in the HTML. */\n  const compactBoot = window.matchMedia(\"(max-width: 920px)\").matches;\n  if (compactBoot) {\n    window.requestAnimationFrame(() => window.setTimeout(initialize, 0));\n  } else {\n    initialize();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["productGallery"]
}
