{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/global.js?cb=5678"],
  "sourcesContent": ["// \u2500\u2500 Global Constants & Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst PUB_SUB_EVENTS = {\n  cartUpdate: \"cart-update\", // Cart updated\n  quantityUpdate: \"quantity-update\", // Product quantity changed\n  variantChange: \"variant-change\", // Product variant changed\n  cartError: \"cart-error\", // Cart error\n};\nwindow.PUB_SUB_EVENTS = PUB_SUB_EVENTS;\n\nconst NO_DECIMAL_CURRENCIES = [\n  \"BIF\",\n  \"CLP\",\n  \"DJF\",\n  \"GNF\",\n  \"JPY\",\n  \"KMF\",\n  \"KRW\",\n  \"MGA\",\n  \"PYG\",\n  \"RWF\",\n  \"UGX\",\n  \"VND\",\n  \"VUV\",\n  \"XAF\",\n  \"XOF\",\n  \"XPF\",\n];\n\n// Global JavaScript functions and variables\nconst webvista = (function () {\n  // DOM ready detection\n  function onReady(callback) {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", callback);\n    } else {\n      callback();\n    }\n  }\n\n  /**\n   * Fetch HTML content\n   * @param url\n   * @param signal\n   * @returns {Promise<Document>}\n   */\n  async function fetchHtml(url, signal = null) {\n    const fetchOptions = signal ? { signal } : {};\n    const response = await fetch(url, fetchOptions);\n\n    if (!response.ok) {\n      throw new Error(\n        `HTTP error! Status: ${response.status} ${response.statusText}`,\n      );\n    }\n\n    const text = await response.text();\n    return new DOMParser().parseFromString(text, \"text/html\");\n  }\n\n  // Lazy image loading animation\n  function initLazyImageAnimation(root = document) {\n    const scope =\n      root instanceof Event ? root.target || document : root || document;\n    const images = Array.from(\n      scope.querySelectorAll(\"img.image-lazy-loading[data-srcset]\"),\n    );\n    if (!images.length) return;\n\n    const applySrcset = (img) => {\n      const srcset = img.dataset.srcset;\n      if (!srcset) return;\n      img.srcset = srcset;\n      img.removeAttribute(\"data-srcset\");\n      const onLoad = () => {\n        img.classList.remove(\"image-lazy-placeholder\");\n        img.classList.remove(\"image-lazy-loading\");\n        img.removeEventListener(\"load\", onLoad);\n        img.removeEventListener(\"error\", onLoad);\n      };\n      img.addEventListener(\"load\", onLoad);\n      img.addEventListener(\"error\", onLoad);\n    };\n\n    if (!(\"IntersectionObserver\" in window)) {\n      images.forEach(applySrcset);\n      return;\n    }\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (!entry.isIntersecting) return;\n          applySrcset(entry.target);\n          observer.unobserve(entry.target);\n        });\n      },\n      { rootMargin: \"100px 0px\" },\n    );\n\n    images.forEach((img) => observer.observe(img));\n  }\n\n  // Detect browser RTL scrollLeft behavior once per document and cache it.\n  // Possible values:\n  // - default:  scrollLeft increases from 0..max (LTR-like)\n  // - reverse:  scrollLeft decreases from max..0\n  // - negative: scrollLeft goes 0..-max\n  function getRtlScrollMode() {\n    const root = document.documentElement;\n    const cached = root?.dataset?.rtlScrollMode;\n    if (cached) return cached;\n    if (!document.body) return \"default\";\n\n    const tester = document.createElement(\"div\");\n    tester.dir = \"rtl\";\n    tester.style.width = \"4px\";\n    tester.style.height = \"1px\";\n    tester.style.overflow = \"scroll\";\n    tester.style.visibility = \"hidden\";\n    tester.innerHTML = '<div style=\"width:8px;height:1px;\"></div>';\n    document.body.appendChild(tester);\n\n    // If setting scrollLeft to 1 doesn't change scrollLeft, we're in \"negative\".\n    // If scrollLeft at 0 is > 0, we're in \"reverse\".\n    tester.scrollLeft = 0;\n    const atZero = tester.scrollLeft;\n    tester.scrollLeft = 1;\n    const atOne = tester.scrollLeft;\n\n    let mode = \"default\";\n    if (atOne === 0) {\n      mode = \"negative\";\n    } else if (atZero > 0) {\n      mode = \"reverse\";\n    }\n\n    document.body.removeChild(tester);\n    if (root?.dataset) root.dataset.rtlScrollMode = mode;\n    return mode;\n  }\n\n  // Add product to browsing history\n  function addProductToHistory(productId, limit = 20) {\n    if (!productId) return;\n    const storageKey = \"product_history_ids\";\n    try {\n      const raw = localStorage.getItem(storageKey);\n      const existing = raw ? JSON.parse(raw) : [];\n      const list = Array.isArray(existing) ? existing.map(String) : [];\n      const currentId = String(productId);\n      const next = [currentId, ...list.filter((id) => id !== currentId)].slice(\n        0,\n        limit,\n      );\n      localStorage.setItem(storageKey, JSON.stringify(next));\n    } catch (error) {\n      // ignore storage errors\n    }\n  }\n\n  /**\n   * Get fetch config\n   * @param {string} [type=\"json\"] Response type\n   * @param {string} [method=\"POST\"] HTTP method\n   * @returns {Object} Fetch config object\n   */\n  function fetchConfig(type = \"json\", method = \"POST\") {\n    return {\n      method: method,\n      headers: {\n        \"Content-Type\": \"application/json\",\n        Accept: `application/${type}`,\n      },\n    };\n  }\n\n  /**\n   * Check if a value is numeric\n   * @param value\n   * @returns {boolean}\n   */\n  function isNumeric(value) {\n    if (value === null || value === \"\") return false;\n    return !Number.isNaN(Number(value));\n  }\n\n  /**\n   * Format price amount\n   * @param {number} [amount=0]\n   * @param {string} currency\n   * @returns {string|undefined}\n   */\n  function formatPriceAmount(amount = 0, currency) {\n    if (!window.priceFormatTemplate || !currency) return;\n\n    const value = amount / 100;\n    const hasNoDecimals = NO_DECIMAL_CURRENCIES.includes(currency);\n\n    const price = value.toLocaleString(undefined, {\n      minimumFractionDigits: hasNoDecimals ? 0 : 2,\n      maximumFractionDigits: hasNoDecimals ? 0 : 2,\n    });\n\n    return window.priceFormatTemplate.replace(/[\\d,.]+/, price);\n  }\n\n  // Localization details element\n  function initLocalizationDetails() {\n    const detailsList = Array.from(\n      document.querySelectorAll(\"details[data-localization-details]\"),\n    );\n    if (!detailsList.length) return;\n\n    const closeAll = (except) => {\n      detailsList.forEach((details) => {\n        if (details !== except) {\n          details.removeAttribute(\"open\");\n        }\n      });\n    };\n\n    document.addEventListener(\"click\", (event) => {\n      const current = event.target.closest(\n        \"details[data-localization-details]\",\n      );\n      if (current) {\n        closeAll(current);\n        return;\n      }\n      closeAll(null);\n    });\n\n    document.addEventListener(\"keydown\", (event) => {\n      if (event.key === \"Escape\") closeAll(null);\n    });\n  }\n\n  // Tooltip hover helper\n  function hideTooltips() {\n    const tooltip = document.body?.querySelector(\"[data-tooltip-root]\");\n    if (!tooltip) return;\n    tooltip.style.opacity = \"0\";\n  }\n\n  function initTooltips(root = document) {\n    // Mobile/touch devices don't have a true hover state; avoid showing tooltips there.\n    // This also prevents focus-triggered tooltips on touch screens.\n    const canHover =\n      window.matchMedia &&\n      window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches;\n    if (!canHover) {\n      hideTooltips();\n      return;\n    }\n\n    const targets = Array.from(root.querySelectorAll(\"[data-tooltip]\"));\n    if (!targets.length) return;\n\n    let tooltip = document.body.querySelector(\"[data-tooltip-root]\");\n    if (!tooltip) {\n      tooltip = document.createElement(\"div\");\n      tooltip.setAttribute(\"data-tooltip-root\", \"true\");\n      tooltip.className = \"tooltip\";\n\n      const arrow = document.createElement(\"div\");\n      arrow.className = \"tooltip__arrow\";\n      tooltip.appendChild(arrow);\n\n      document.body.appendChild(tooltip);\n    }\n\n    let hideTimer = null;\n    const showTooltip = (event) => {\n      const target = event.currentTarget;\n      const text = target.dataset.tooltip || \"\";\n      if (!text) return;\n      if (hideTimer) {\n        clearTimeout(hideTimer);\n        hideTimer = null;\n      }\n      tooltip.textContent = text;\n      const arrow = tooltip.querySelector(\"div\");\n      if (arrow) tooltip.appendChild(arrow);\n      tooltip.style.opacity = \"1\";\n      positionTooltip(target);\n    };\n\n    const hideTooltip = () => {\n      if (hideTimer) {\n        clearTimeout(hideTimer);\n      }\n      hideTimer = setTimeout(() => {\n        tooltip.style.opacity = \"0\";\n      }, 50);\n    };\n\n    const positionTooltip = (target) => {\n      const rect = target.getBoundingClientRect();\n      const offset = 12;\n      const top = rect.top - offset;\n      tooltip.style.left = `${rect.left + rect.width / 2}px`;\n      tooltip.style.top = `${top}px`;\n      tooltip.style.transform = \"translate(-50%, -100%)\";\n    };\n\n    targets.forEach((target) => {\n      if (target.dataset.tooltipInit === \"true\") return;\n      target.dataset.tooltipInit = \"true\";\n      target.addEventListener(\"mouseenter\", showTooltip);\n      target.addEventListener(\"mouseleave\", hideTooltip);\n      target.addEventListener(\"mousemove\", () => positionTooltip(target));\n    });\n  }\n\n  function escapeAttributeValue(value) {\n    return String(value).replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n  }\n\n  function resolveShopifyEditorBlockId(event, root = document) {\n    if (!event) return null;\n\n    const blockIdFromDetail =\n      event.detail && typeof event.detail.blockId === \"string\"\n        ? event.detail.blockId\n        : null;\n    if (blockIdFromDetail) {\n      return blockIdFromDetail;\n    }\n\n    const target = event.target instanceof Element ? event.target : null;\n    if (!target) {\n      return null;\n    }\n\n    const scope = root instanceof Element ? root : null;\n    const isInScope = (node) => !scope || scope.contains(node);\n\n    const nodeWithData = target.closest(\"[data-block-id]\");\n    if (nodeWithData && isInScope(nodeWithData)) {\n      return nodeWithData.dataset.blockId || null;\n    }\n\n    const nodeWithShopifyData = target.closest(\"[data-shopify-editor-block-id]\");\n    if (nodeWithShopifyData && isInScope(nodeWithShopifyData)) {\n      return nodeWithShopifyData.dataset.shopifyEditorBlockId || null;\n    }\n\n    const nodeWithId = target.closest('[id^=\"shopify-block-\"]');\n    if (nodeWithId && isInScope(nodeWithId)) {\n      return nodeWithId.id.replace(\"shopify-block-\", \"\");\n    }\n\n    return null;\n  }\n\n  /**\n   * Bind Shopify Theme Editor block select/deselect events for a specific scope.\n   * Resolves block id + element, then dispatches normalized payload to callbacks.\n   * @param {Object} [options]\n   * @param {Element|Document} [options.root=document] Query scope for matching block element.\n   * @param {(payload:{blockId:string,event:Event,blockElement:Element}) => void} [options.onSelect]\n   * @param {(payload:{blockId:string,event:Event,blockElement:Element}) => void} [options.onDeselect]\n   * @param {(blockId:string) => Element|null} [options.getBlockElement]\n   * @returns {() => void} Unbind function.\n   */\n  function bindShopifyEditorBlockEvents(options = {}) {\n    const root = options.root instanceof Element ? options.root : document;\n    const onSelect =\n      typeof options.onSelect === \"function\" ? options.onSelect : null;\n    const onDeselect =\n      typeof options.onDeselect === \"function\" ? options.onDeselect : null;\n    const getBlockElement =\n      typeof options.getBlockElement === \"function\"\n        ? options.getBlockElement\n        : function defaultGetBlockElement(blockId) {\n            if (!blockId || !root.querySelector) return null;\n            const escapedBlockId = escapeAttributeValue(blockId);\n            if (\n              root instanceof Element &&\n              (root.id === `shopify-block-${blockId}` ||\n                root.dataset.blockId === blockId ||\n                root.dataset.shopifyEditorBlockId === blockId)\n            ) {\n              return root;\n            }\n            const blockById = document.getElementById(\n              `shopify-block-${blockId}`,\n            );\n            if (blockById && root.contains(blockById)) {\n              return blockById;\n            }\n            return (\n              root.querySelector(\n                `[data-block-id=\"${escapedBlockId}\"], [data-shopify-editor-block-id=\"${escapedBlockId}\"]`,\n              )\n            );\n          };\n\n    const emit = (callback, event) => {\n      if (!callback) return;\n      const blockId = resolveShopifyEditorBlockId(event, root);\n      if (!blockId) return;\n      const blockElement = getBlockElement(blockId);\n      if (!blockElement) return;\n      callback({ blockId: blockId, event: event, blockElement: blockElement });\n    };\n\n    const handleSelect = (event) => emit(onSelect, event);\n    const handleDeselect = (event) => emit(onDeselect, event);\n\n    document.addEventListener(\"shopify:block:select\", handleSelect);\n    document.addEventListener(\"shopify:block:deselect\", handleDeselect);\n    window.addEventListener(\"shopify:block:select\", handleSelect);\n    window.addEventListener(\"shopify:block:deselect\", handleDeselect);\n\n    return function unbindShopifyEditorBlockEvents() {\n      document.removeEventListener(\"shopify:block:select\", handleSelect);\n      document.removeEventListener(\"shopify:block:deselect\", handleDeselect);\n      window.removeEventListener(\"shopify:block:select\", handleSelect);\n      window.removeEventListener(\"shopify:block:deselect\", handleDeselect);\n    };\n  }\n\n  onReady(initLazyImageAnimation);\n  onReady(initLocalizationDetails);\n  onReady(initTooltips);\n  document.addEventListener(\"shopify:section:load\", initLazyImageAnimation);\n  document.addEventListener(\"shopify:section:load\", initLocalizationDetails);\n  document.addEventListener(\"shopify:section:load\", initTooltips);\n  document.addEventListener(\"shopify:section:select\", initLazyImageAnimation);\n  document.addEventListener(\"shopify:section:reorder\", initLazyImageAnimation);\n  document.addEventListener(\"shopify:section:deselect\", initLazyImageAnimation);\n\n  /**\n   * Get all visible, focusable elements inside a container\n   * @param {HTMLElement} container\n   * @returns {HTMLElement[]}\n   */\n  function getFocusableElements(container) {\n    if (!container) return [];\n    return Array.from(\n      container.querySelectorAll(\n        'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n      )\n    ).filter(\n      (el) =>\n        !el.closest(\"[hidden]\") &&\n        !el.closest(\".hidden\") &&\n        el.offsetParent !== null\n    );\n  }\n\n  /**\n   * Create a keydown handler that traps Tab focus within a container\n   * and optionally closes on Escape.\n   * @param {HTMLElement} container\n   * @param {object} [options]\n   * @param {function} [options.onEscape] - Called when Escape is pressed\n   * @returns {function}\n   */\n  function createFocusTrap(container, options) {\n    var onEscape = options && options.onEscape ? options.onEscape : null;\n    return function (event) {\n      if (event.key === \"Escape\" && onEscape) {\n        event.preventDefault();\n        onEscape();\n        return;\n      }\n      if (event.key !== \"Tab\") return;\n      const focusable = getFocusableElements(container);\n      if (focusable.length === 0) return;\n      const first = focusable[0];\n      const last = focusable[focusable.length - 1];\n      if (event.shiftKey) {\n        if (document.activeElement === first) {\n          event.preventDefault();\n          last.focus();\n        }\n      } else {\n        if (document.activeElement === last) {\n          event.preventDefault();\n          first.focus();\n        }\n      }\n    };\n  }\n\n  /**\n   * Move focus to the first focusable element inside a container.\n   * @param {HTMLElement} container\n   */\n  function focusFirstElement(container) {\n    if (!container) return;\n    requestAnimationFrame(function () {\n      var focusable = getFocusableElements(container);\n      if (focusable.length) {\n        focusable[0].focus();\n      }\n    });\n  }\n\n  return {\n    fetchHtml: fetchHtml,\n    initLazyImageAnimation: initLazyImageAnimation,\n    initLocalizationDetails: initLocalizationDetails,\n    initTooltips: initTooltips,\n    hideTooltips: hideTooltips,\n    getRtlScrollMode: getRtlScrollMode,\n    fetchConfig: fetchConfig,\n    isNumeric: isNumeric,\n    formatPriceAmount: formatPriceAmount,\n    addProductToHistory: addProductToHistory,\n    getFocusableElements: getFocusableElements,\n    createFocusTrap: createFocusTrap,\n    focusFirstElement: focusFirstElement,\n    resolveShopifyEditorBlockId: resolveShopifyEditorBlockId,\n    bindShopifyEditorBlockEvents: bindShopifyEditorBlockEvents,\n  };\n})();\n\nwindow.webvista = webvista;\n\n// Header Component\n\n// \u2500\u2500 Base Components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Handles header interactions like mega menus, dropdowns, and mobile menu\nclass HeaderComponent extends HTMLElement {\n  constructor() {\n    super();\n    this.header = this;\n    this.activeMega = null;\n    this.activeDropdown = null;\n    this.mobileOpen = false;\n    this.searchOpen = false;\n    this.isStickyActive = false;\n    this.stickyAnimTimer = null;\n    this.lastScrollY = 0;\n    this.cleanup = [];\n    this.isReady = false;\n    this.scrollRaf = null;\n    this.resizeRaf = null;\n    this.isScrolled = null;\n    this.isTransparentState = null; // Transparent state\n    this.menuOpenState = null;\n    this.hasMegaState = null;\n    this.activeMegaState = null;\n    this.activeDropdownState = null;\n    this.mobileOpenState = null;\n    this.searchOpenState = null;\n    this.mobileSubmenuState = \"\";\n    this.scrollLockState = null;\n    this.stickyInsetState = null;\n    this.headerHeightState = null;\n    this.stickyTransitionState = null;\n    this.headerBarHeight = 0;\n    this.openMobileSubmenus = new Set();\n    this.submenuAutoTimers = new WeakMap();\n    this.submenuHeights = new WeakMap();\n    this.searchOpener = null;\n    this._searchFocusTrap = null;\n    this.mobileOpener = null;\n    this._mobileFocusTrap = null;\n  }\n\n  connectedCallback() {\n    if (this.isReady) return;\n    this.isReady = true;\n    this.cacheElements();\n    this.bindEvents();\n    this.update();\n  }\n\n  disconnectedCallback() {\n    this.destroy();\n    this.isReady = false;\n  }\n\n  // Cache element references\n  cacheElements() {\n    this.headerBar = this.querySelector(\"[data-header-bar]\");\n    this.logoText = this.querySelector(\"[data-logo-text]\");\n    this.logoImage = this.querySelector(\"[data-logo-image]\");\n    this.logoImageTransparent = this.querySelector(\n      \"[data-logo-image-transparent]\",\n    );\n    this.logoImages = Array.from(\n      this.querySelectorAll(\"[data-logo-image]\"),\n    );\n    this.logoImagesTransparent = Array.from(\n      this.querySelectorAll(\"[data-logo-image-transparent]\"),\n    );\n    this.navRow = this.querySelector(\"[data-header-nav]\");\n    this.cartBadge = this.querySelector(\"[data-cart-badge]\");\n    this.megaWrapper = this.querySelector(\"[data-mega-wrapper]\");\n    this.megaPanels = Array.from(this.querySelectorAll(\"[data-mega-panel]\"));\n    this.megaTriggers = Array.from(\n      this.querySelectorAll(\"[data-mega-trigger]\"),\n    );\n    this.searchOverlay = document.querySelector(\"[data-search-overlay]\");\n    this.searchInput = this.searchOverlay\n      ? this.searchOverlay.querySelector(\"[data-search-input]\")\n      : null;\n    this.searchToggles = Array.from(\n      this.querySelectorAll(\"[data-search-toggle]\"),\n    );\n    this.searchCloseButtons = this.searchOverlay\n      ? Array.from(this.searchOverlay.querySelectorAll(\"[data-search-close]\"))\n      : [];\n    this.cartDrawer = document.getElementById(\"Cart-Drawer\");\n    this.cartToggles = Array.from(\n      this.querySelectorAll(\"[data-cart-drawer-toggle]\"),\n    );\n    this.dropdownButtons = Array.from(\n      this.querySelectorAll(\"[data-dropdown-toggle]\"),\n    );\n    this.dropdownPanels = Array.from(\n      this.querySelectorAll(\"[data-dropdown-panel]\"),\n    );\n    this.mobileToggles = Array.from(\n      this.querySelectorAll(\"[data-mobile-toggle]\"),\n    );\n    this.mobileDrawer = this.querySelector(\"[data-mobile-drawer]\");\n    this.mobileBackdrop = this.querySelector(\"[data-mobile-backdrop]\");\n    this.mobilePanel = this.querySelector(\"[data-mobile-panel]\");\n    this.mobileMenu = this.querySelector(\"[data-mobile-menu]\");\n    this.mobileSubmenuToggles = Array.from(\n      this.querySelectorAll(\"[data-mobile-submenu-toggle]\"),\n    );\n    this.mobileSubmenus = Array.from(\n      this.querySelectorAll(\"[data-mobile-submenu]\"),\n    );\n    this.sectionWrapper = this.closest(\".shopify-section\");\n    this.transparentHeader = this.dataset.transparentHeader === \"true\"; // Whether transparent header is enabled\n    this.cartType = this.dataset.cartType || \"drawer\";\n    this.stickyType = this.dataset.stickyType || \"none\";\n    if (this.stickyType === \"reduce-logo-size\") {\n      this.stickyType = \"none\";\n    }\n    this.headerBarHeight = this.headerBar ? this.headerBar.offsetHeight : 0;\n  }\n\n  addListener(el, event, handler, options) {\n    if (!el) return;\n    el.addEventListener(event, handler, options);\n    this.cleanup.push(() => el.removeEventListener(event, handler, options));\n  }\n\n  toggleClasses(el, classes, on) {\n    if (!el) return;\n    classes.forEach((cls) => el.classList.toggle(cls, on));\n  }\n\n  // Toggle sticky section classes\n  toggleStickySectionClasses(on) {\n    if (!this.sectionWrapper) return;\n    this.sectionWrapper.classList.toggle(\"sticky\", on);\n    this.sectionWrapper.classList.toggle(\"top-0\", on);\n    this.sectionWrapper.classList.toggle(\"z-50\", on);\n  }\n\n  // Update header state based on scroll position and interaction\n  update() {\n    if (!this.header.isConnected) return;\n\n    const scrollY = window.scrollY || 0;\n    const isScrolled = scrollY > 8; // Scrolled past threshold\n    const scrollUp = scrollY < this.lastScrollY;\n    const stickyThreshold = this.headerBarHeight || 0;\n    const hasMega = Boolean(this.activeMega);\n    const hasDropdown = Boolean(this.activeDropdown);\n    const menuOpen =\n      hasMega || hasDropdown || this.mobileOpen || this.searchOpen;\n    const isTransparent = this.transparentHeader && !menuOpen && !isScrolled; // Should be transparent\n    const shadowOn =\n      !isTransparent || hasDropdown || this.mobileOpen || this.searchOpen;\n    const openMobileKey = Array.from(this.openMobileSubmenus).sort().join(\"|\");\n    const isTransparentChanged = isTransparent !== this.isTransparentState;\n    const isScrolledChanged = isScrolled !== this.isScrolled;\n    const shadowOnChanged = shadowOn !== this.shadowOnState;\n    const hasMegaChanged = hasMega !== this.hasMegaState;\n    const activeMegaChanged = this.activeMega !== this.activeMegaState;\n    const activeDropdownChanged =\n      this.activeDropdown !== this.activeDropdownState;\n    const mobileOpenChanged = this.mobileOpen !== this.mobileOpenState;\n    const searchOpenChanged = this.searchOpen !== this.searchOpenState;\n    const submenusChanged = openMobileKey !== this.mobileSubmenuState;\n\n    this.updateTransparency({\n      isTransparent,\n      isTransparentChanged,\n      isScrolled,\n      isScrolledChanged,\n    });\n    this.updateMenus({\n      hasMega,\n      shadowOn,\n      shadowOnChanged,\n      hasMegaChanged,\n      activeMegaChanged,\n      activeDropdownChanged,\n    });\n    this.updateMobile({\n      openMobileKey,\n      mobileOpenChanged,\n      submenusChanged,\n    });\n    this.updateSticky({\n      scrollY,\n      scrollUp,\n      stickyThreshold,\n      menuOpen,\n      searchOpen: this.searchOpen,\n    });\n    this.updateSearchOverlay({ searchOpenChanged });\n    this.updateScrollLock({ searchOpenChanged, mobileOpenChanged });\n\n    this.isScrolled = isScrolled;\n    this.lastScrollY = scrollY;\n    this.isTransparentState = isTransparent;\n    this.menuOpenState = menuOpen;\n    this.shadowOnState = shadowOn;\n    this.hasMegaState = hasMega;\n    this.activeMegaState = this.activeMega;\n    this.activeDropdownState = this.activeDropdown;\n    this.mobileOpenState = this.mobileOpen;\n    document.body.classList.toggle(\"search-open\", this.searchOpen);\n    this.searchOpenState = this.searchOpen;\n    this.mobileSubmenuState = openMobileKey;\n  }\n\n  // Update transparency\n  updateTransparency({\n    isTransparent,\n    isTransparentChanged,\n    isScrolled,\n    isScrolledChanged,\n  }) {\n    if (!this.transparentHeader) return;\n\n    if (isTransparentChanged) {\n      if (isTransparent) {\n        this.header.setAttribute(\"data-header-transparent\", \"true\");\n      } else {\n        this.header.removeAttribute(\"data-header-transparent\");\n      }\n\n      // Toggle logo visibility based on transparent state\n      if (this.logoImagesTransparent.length) {\n        this.logoImagesTransparent.forEach((el) => {\n          this.toggleClasses(el, [\"hidden\"], !isTransparent);\n        });\n        this.logoImages.forEach((el) => {\n          this.toggleClasses(el, [\"hidden\"], isTransparent);\n        });\n      }\n    }\n\n    if (isScrolledChanged) {\n      this.toggleClasses(this.headerBar, [\"py-2\"], isScrolled);\n      this.toggleClasses(this.headerBar, [\"py-6\"], !isScrolled);\n      this.toggleClasses(this.logoText, [\"text-xl\", \"md:text-2xl\"], isScrolled);\n      this.toggleClasses(\n        this.logoText,\n        [\"text-2xl\", \"md:text-4xl\"],\n        !isScrolled,\n      );\n      [...this.logoImages, ...this.logoImagesTransparent].forEach((logo) => {\n        this.toggleClasses(logo, [\"h-6\", \"md:h-8\"], isScrolled);\n        this.toggleClasses(logo, [\"h-8\", \"md:h-12\"], !isScrolled);\n      });\n      this.headerBarHeight = this.headerBar ? this.headerBar.offsetHeight : 0;\n    }\n  }\n\n  // Update menu state\n  updateMenus({\n    hasMega,\n    shadowOn,\n    shadowOnChanged,\n    hasMegaChanged,\n    activeMegaChanged,\n    activeDropdownChanged,\n  }) {\n    if (\n      !shadowOnChanged &&\n      !hasMegaChanged &&\n      !activeMegaChanged &&\n      !activeDropdownChanged\n    ) {\n      return;\n    }\n\n    if (shadowOnChanged) {\n      this.toggleClasses(this.headerBar, [\"shadow-sm\"], shadowOn);\n    }\n\n    if (hasMegaChanged && this.megaWrapper) {\n      this.toggleClasses(\n        this.megaWrapper,\n        [\"opacity-100\", \"pointer-events-auto\", \"max-h-[600px]\"],\n        hasMega,\n      );\n      this.toggleClasses(\n        this.megaWrapper,\n        [\"opacity-0\", \"pointer-events-none\", \"max-h-0\"],\n        !hasMega,\n      );\n      this.megaWrapper.inert = !hasMega;\n    }\n\n    if (activeMegaChanged) {\n      this.megaPanels.forEach((panel) => {\n        const isHidden = panel.dataset.megaPanel !== this.activeMega;\n        panel.classList.toggle(\"hidden\", isHidden);\n        panel.classList.toggle(\"grid\", !isHidden);\n      });\n\n      this.megaTriggers.forEach((trigger) => {\n        const id = trigger.dataset.megaTrigger;\n        const isActive = id === this.activeMega;\n        const link = trigger.querySelector(\"[data-mega-link]\");\n        const arrow = trigger.querySelector(\"[data-mega-arrow]\");\n        const underline = trigger.querySelector(\"[data-mega-underline]\");\n\n        this.toggleClasses(link, [\"accent\"], isActive);\n        this.toggleClasses(arrow, [\"rotate-180\"], isActive);\n        this.toggleClasses(underline, [\"w-full\"], isActive);\n        this.toggleClasses(underline, [\"w-0\"], !isActive);\n      });\n    }\n\n    if (activeDropdownChanged) {\n      this.dropdownPanels.forEach((panel) => {\n        panel.classList.toggle(\n          \"hidden\",\n          panel.dataset.dropdownPanel !== this.activeDropdown,\n        );\n      });\n\n      this.dropdownButtons.forEach((button) => {\n        const id = button.dataset.dropdownToggle;\n        const isActive = id === this.activeDropdown;\n        button.setAttribute(\"aria-expanded\", isActive ? \"true\" : \"false\");\n        const arrow = button.querySelector(\"[data-dropdown-arrow]\");\n        this.toggleClasses(arrow, [\"rotate-180\"], isActive);\n      });\n    }\n  }\n\n  // Update mobile menu state\n  updateMobile({ openMobileKey, mobileOpenChanged, submenusChanged }) {\n    if (!mobileOpenChanged && !submenusChanged) return;\n\n    if (mobileOpenChanged) {\n      if (this.mobileDrawer) {\n        this.toggleClasses(\n          this.mobileDrawer,\n          [\"opacity-100\", \"pointer-events-auto\"],\n          this.mobileOpen,\n        );\n        this.toggleClasses(\n          this.mobileDrawer,\n          [\"opacity-0\", \"pointer-events-none\"],\n          !this.mobileOpen,\n        );\n      }\n      if (this.mobileBackdrop) {\n        this.toggleClasses(\n          this.mobileBackdrop,\n          [\"opacity-100\"],\n          this.mobileOpen,\n        );\n        this.toggleClasses(\n          this.mobileBackdrop,\n          [\"opacity-0\"],\n          !this.mobileOpen,\n        );\n      }\n      if (this.mobilePanel) {\n        this.toggleClasses(\n          this.mobilePanel,\n          [\"translate-x-0\"],\n          this.mobileOpen,\n        );\n        this.toggleClasses(\n          this.mobilePanel,\n          [\"-translate-x-full\"],\n          !this.mobileOpen,\n        );\n      }\n    }\n\n    if (mobileOpenChanged && this.mobileToggles.length) {\n      this.mobileToggles.forEach((toggle) => {\n        toggle.setAttribute(\n          \"aria-expanded\",\n          this.mobileOpen ? \"true\" : \"false\",\n        );\n      });\n    }\n\n    if (mobileOpenChanged && this.mobileDrawer) {\n      if (this.mobileOpen) {\n        if (!this._mobileFocusTrap) {\n          this._mobileFocusTrap = webvista.createFocusTrap(this.mobileDrawer, {\n            onEscape: () => {\n              this.mobileOpen = false;\n              this.openMobileSubmenus.clear();\n              this.update();\n            },\n          });\n        }\n        this.mobileDrawer.inert = false;\n        this.mobileDrawer.addEventListener(\"keydown\", this._mobileFocusTrap);\n        webvista.focusFirstElement(this.mobilePanel);\n      } else {\n        this.mobileDrawer.inert = true;\n        if (this._mobileFocusTrap) {\n          this.mobileDrawer.removeEventListener(\"keydown\", this._mobileFocusTrap);\n        }\n        if (this.mobileOpener && typeof this.mobileOpener.focus === \"function\") {\n          this.mobileOpener.focus();\n          this.mobileOpener = null;\n        }\n      }\n    }\n\n    if (submenusChanged && this.mobileSubmenus.length) {\n      this.mobileSubmenus.forEach((panel) => {\n        const id = panel.dataset.mobileSubmenu;\n        const isOpen = this.openMobileSubmenus.has(id);\n        panel.inert = !isOpen;\n        let cachedHeight = this.submenuHeights.get(panel);\n\n        if (isOpen) {\n          panel.style.opacity = \"1\";\n          if (panel.style.maxHeight !== \"none\") {\n            if (!cachedHeight) {\n              cachedHeight = panel.scrollHeight;\n              this.submenuHeights.set(panel, cachedHeight);\n            }\n            panel.style.maxHeight = `${cachedHeight}px`;\n            this.deferSubmenuAutoHeight(panel, id);\n          }\n        } else {\n          panel.style.opacity = \"0\";\n          if (panel.style.maxHeight === \"none\") {\n            if (!cachedHeight) {\n              cachedHeight = panel.scrollHeight;\n              this.submenuHeights.set(panel, cachedHeight);\n            }\n            panel.style.maxHeight = `${cachedHeight}px`;\n          }\n          requestAnimationFrame(() => {\n            panel.style.maxHeight = \"0px\";\n          });\n        }\n      });\n    }\n\n    if (submenusChanged && this.mobileSubmenuToggles.length) {\n      this.mobileSubmenuToggles.forEach((toggle) => {\n        const id = toggle.dataset.mobileSubmenuToggle;\n        const isOpen = this.openMobileSubmenus.has(id);\n        toggle.setAttribute(\"aria-expanded\", isOpen ? \"true\" : \"false\");\n        const arrow = toggle.querySelector(\"[data-mobile-submenu-arrow]\");\n        this.toggleClasses(arrow, [\"rotate-180\"], isOpen);\n      });\n    }\n  }\n\n  // Update sticky header state\n  updateSticky({ scrollY, scrollUp, stickyThreshold, menuOpen, searchOpen }) {\n    if (!this.sectionWrapper) return;\n\n    if (\n      searchOpen &&\n      (this.stickyType === \"always\" || this.stickyType === \"on-scroll-up\")\n    ) {\n      if (!this.isStickyActive) {\n        this.toggleStickySectionClasses(true);\n        this.isStickyActive = true;\n      }\n      if (this.stickyType === \"on-scroll-up\") {\n        const headerHeight = stickyThreshold || 0;\n        if (headerHeight !== this.headerHeightState) {\n          this.headerHeightState = headerHeight;\n        }\n        if (!this.stickyTransitionState) {\n          this.sectionWrapper.style.setProperty(\n            \"transition\",\n            \"inset-block-start 300ms ease\",\n          );\n          this.stickyTransitionState = true;\n        }\n        if (this.stickyInsetState !== \"0px\") {\n          this.sectionWrapper.style.setProperty(\"inset-block-start\", \"0px\");\n          this.stickyInsetState = \"0px\";\n        }\n      }\n      return;\n    }\n\n    if (this.stickyType === \"always\") {\n      if (!this.isStickyActive) {\n        this.toggleStickySectionClasses(true);\n        this.isStickyActive = true;\n      }\n      return;\n    }\n\n    if (this.stickyType === \"on-scroll-up\") {\n      if (!this.isStickyActive) {\n        this.toggleStickySectionClasses(true);\n        this.isStickyActive = true;\n      }\n\n      const headerHeight = stickyThreshold || 0;\n      if (headerHeight !== this.headerHeightState) {\n        this.headerHeightState = headerHeight;\n      }\n\n      // Set sticky transition animation\n      if (!this.stickyTransitionState) {\n        this.sectionWrapper.style.setProperty(\n          \"transition\",\n          \"inset-block-start 300ms ease\",\n        );\n        this.stickyTransitionState = true;\n      }\n\n      const shouldHide = !scrollUp && !menuOpen;\n      const insetValue = shouldHide ? `-${headerHeight}px` : \"0px\";\n      if (insetValue !== this.stickyInsetState) {\n        this.sectionWrapper.style.setProperty(\"inset-block-start\", insetValue);\n        this.stickyInsetState = insetValue;\n      }\n      return;\n    }\n\n    if (this.isStickyActive) {\n      this.toggleStickySectionClasses(false);\n      this.isStickyActive = false;\n    }\n    if (this.stickyInsetState !== null) {\n      this.sectionWrapper.style.removeProperty(\"inset-block-start\");\n      this.stickyInsetState = null;\n    }\n    if (this.headerHeightState !== null) {\n      this.headerHeightState = null;\n    }\n  }\n\n  // Update search overlay state\n  updateSearchOverlay({ searchOpenChanged }) {\n    if (!this.searchOverlay) return;\n    if (!searchOpenChanged) return;\n\n    this.toggleClasses(\n      this.searchOverlay,\n      [\"translate-y-0\", \"opacity-100\", \"pointer-events-auto\"],\n      this.searchOpen,\n    );\n    this.toggleClasses(\n      this.searchOverlay,\n      [\"-translate-y-full\", \"opacity-0\", \"pointer-events-none\"],\n      !this.searchOpen,\n    );\n    this.searchOverlay.inert = !this.searchOpen;\n    this.searchOverlay.setAttribute(\"aria-hidden\", String(!this.searchOpen));\n  }\n\n  // Update scroll lock state\n  updateScrollLock({ searchOpenChanged, mobileOpenChanged }) {\n    const shouldLock = this.mobileOpen || this.searchOpen;\n    if (!searchOpenChanged && !mobileOpenChanged) return;\n    if (shouldLock === this.scrollLockState) return;\n    if (shouldLock) {\n      this._savedScrollY = window.scrollY;\n      document.body.style.position = \"fixed\";\n      document.body.style.top = `-${this._savedScrollY}px`;\n      document.body.style.left = \"0\";\n      document.body.style.right = \"0\";\n      document.documentElement.classList.add(\"overflow-hidden\");\n    } else {\n      document.documentElement.classList.remove(\"overflow-hidden\");\n      document.body.style.position = \"\";\n      document.body.style.top = \"\";\n      document.body.style.left = \"\";\n      document.body.style.right = \"\";\n      if (typeof this._savedScrollY === \"number\") {\n        window.scrollTo(0, this._savedScrollY);\n        this._savedScrollY = null;\n      }\n    }\n    this.scrollLockState = shouldLock;\n  }\n\n  deferSubmenuAutoHeight(panel, id) {\n    const existingTimer = this.submenuAutoTimers.get(panel);\n    if (existingTimer) {\n      clearTimeout(existingTimer);\n    }\n    const timer = setTimeout(() => {\n      if (this.openMobileSubmenus.has(id)) {\n        panel.style.maxHeight = \"none\";\n      }\n    }, 520);\n    this.submenuAutoTimers.set(panel, timer);\n  }\n\n  openMega(id) {\n    if (!id || !this.megaPanels.length) return;\n    this.activeMega = id;\n    this.activeDropdown = null;\n    this.mobileOpen = false;\n    this.update();\n  }\n\n  closeMega() {\n    if (!this.activeMega) return;\n    this.returnMegaFocus();\n    this.activeMega = null;\n    this.update();\n  }\n\n  returnMegaFocus() {\n    if (!this.activeMega) return;\n    const active = document.activeElement;\n    const panel = this.megaPanels.find(\n      (p) => p.dataset.megaPanel === this.activeMega,\n    );\n    if (!panel || !panel.contains(active)) return;\n    const trigger = this.megaTriggers.find(\n      (t) => t.dataset.megaTrigger === this.activeMega,\n    );\n    const link = trigger?.querySelector(\"[data-mega-link]\");\n    if (link) {\n      link.focus();\n    }\n  }\n\n  openSearch(opener) {\n    if (!this.searchOverlay) return;\n    this.searchOpener = opener || document.activeElement;\n    this.activeMega = null;\n    this.activeDropdown = null;\n    this.mobileOpen = false;\n    this.searchOpen = true;\n    this.update();\n    document.dispatchEvent(new CustomEvent(\"search:open\"));\n    if (!this._searchFocusTrap) {\n      this._searchFocusTrap = webvista.createFocusTrap(this.searchOverlay);\n    }\n    this.searchOverlay.addEventListener(\"keydown\", this._searchFocusTrap);\n    if (this.searchInput) {\n      requestAnimationFrame(() => {\n        this.searchInput.focus();\n      });\n    }\n  }\n\n  closeSearch() {\n    if (!this.searchOverlay) return;\n    this.searchOpen = false;\n    this.update();\n    if (this._searchFocusTrap) {\n      this.searchOverlay.removeEventListener(\"keydown\", this._searchFocusTrap);\n    }\n    if (this.searchOpener && typeof this.searchOpener.focus === \"function\") {\n      this.searchOpener.focus();\n      this.searchOpener = null;\n    }\n  }\n\n  toggleSearch(opener) {\n    if (!this.searchOverlay) return;\n    if (this.searchOpen) {\n      this.closeSearch();\n    } else {\n      this.openSearch(opener);\n    }\n  }\n\n  toggleDropdown(id, options = {}) {\n    const { keepMobileOpen = false } = options;\n    this.activeMega = null;\n    if (!keepMobileOpen) {\n      this.mobileOpen = false;\n    }\n    this.activeDropdown = this.activeDropdown === id ? null : id;\n    this.update();\n  }\n\n  closeDropdown() {\n    if (!this.activeDropdown) return;\n    this.activeDropdown = null;\n    this.update();\n  }\n\n  closeAll() {\n    if (this.searchOpen) {\n      this.closeSearch();\n    }\n    if (this.mobileOpen) {\n      this.mobileOpen = false;\n      this.openMobileSubmenus.clear();\n    }\n    this.returnMegaFocus();\n    this.activeMega = null;\n    this.activeDropdown = null;\n    this.update();\n  }\n\n  toggleMobileSubmenu(id) {\n    if (!id) return;\n    if (this.openMobileSubmenus.has(id)) {\n      this.openMobileSubmenus.delete(id);\n    } else {\n      this.openMobileSubmenus.add(id);\n    }\n    this.update();\n  }\n\n  bindEvents() {\n    this.megaTriggers.forEach((trigger) => {\n      const id = trigger.dataset.megaTrigger;\n      const panel = this.megaPanels.find(\n        (p) => p.dataset.megaPanel === id,\n      );\n      const link = trigger.querySelector(\"[data-mega-link]\");\n\n      this.addListener(trigger, \"mouseenter\", () => this.openMega(id));\n      this.addListener(trigger, \"focusin\", () => this.openMega(id));\n\n      /* \u7126\u70B9\u79BB\u5F00 trigger + panel \u8303\u56F4\u65F6\u5173\u95ED mega */\n      const checkMegaFocusLost = () => {\n        requestAnimationFrame(() => {\n          if (this.activeMega !== id) return;\n          const active = document.activeElement;\n          if (trigger.contains(active)) return;\n          if (panel && panel.contains(active)) return;\n          this.activeMega = null;\n          this.update();\n        });\n      };\n      this.addListener(trigger, \"focusout\", checkMegaFocusLost);\n      if (panel) this.addListener(panel, \"focusout\", checkMegaFocusLost);\n\n      /* Tab: trigger \u2192 panel \u7B2C\u4E00\u4E2A\u94FE\u63A5 */\n      if (link) {\n        this.addListener(link, \"keydown\", (event) => {\n          if (event.key !== \"Tab\" || event.shiftKey) return;\n          if (this.activeMega !== id || !panel) return;\n          event.preventDefault();\n          webvista.focusFirstElement(panel);\n        });\n      }\n\n      /* Tab/Shift+Tab: panel \u8FB9\u754C\u5904\u7406 */\n      if (panel) {\n        this.addListener(panel, \"keydown\", (event) => {\n          if (event.key !== \"Tab\") return;\n          const focusable = webvista.getFocusableElements(panel);\n          if (!focusable.length) return;\n          const first = focusable[0];\n          const last = focusable[focusable.length - 1];\n\n          if (!event.shiftKey && document.activeElement === last) {\n            /* Tab \u8FC7\u6700\u540E\u4E00\u4E2A\u94FE\u63A5 \u2192 \u7126\u70B9\u5230\u4E0B\u4E00\u4E2A\u5BFC\u822A\u9879 */\n            event.preventDefault();\n            this.activeMega = null;\n            this.update();\n            const nextItem = trigger.nextElementSibling;\n            const nextFocusable = nextItem\n              ? nextItem.querySelector(\"a, button\") || nextItem\n              : null;\n            if (nextFocusable) nextFocusable.focus();\n          } else if (event.shiftKey && document.activeElement === first) {\n            /* Shift+Tab \u8FC7\u7B2C\u4E00\u4E2A\u94FE\u63A5 \u2192 \u7126\u70B9\u56DE trigger\uFF08mega \u4FDD\u6301\u6253\u5F00\uFF09 */\n            event.preventDefault();\n            if (link) link.focus();\n          }\n        });\n      }\n    });\n\n    this.dropdownButtons.forEach((button) => {\n      const id = button.dataset.dropdownToggle;\n      this.addListener(button, \"click\", (event) => {\n        event.preventDefault();\n        const isMobileDropdown = Boolean(button.closest(\"[data-mobile-panel]\"));\n        this.toggleDropdown(id, { keepMobileOpen: isMobileDropdown });\n      });\n    });\n\n    if (this.searchToggles.length) {\n      this.searchToggles.forEach((toggle) => {\n        this.addListener(toggle, \"click\", (event) => {\n          event.preventDefault();\n          this.toggleSearch(toggle);\n        });\n      });\n    }\n\n    if (this.searchCloseButtons.length) {\n      this.searchCloseButtons.forEach((button) => {\n        this.addListener(button, \"click\", () => {\n          this.closeSearch();\n        });\n      });\n    }\n\n    if (this.cartToggles.length) {\n      this.cartToggles.forEach((toggle) => {\n        this.addListener(toggle, \"click\", (event) => {\n          if (this.cartType === \"page\") return;\n          event.preventDefault();\n          if (this.cartDrawer) {\n            this.cartDrawer.show(event.currentTarget);\n            return;\n          }\n          window.location.href = window.routes?.cart_url || \"/cart\";\n        });\n      });\n    }\n\n    if (this.mobileToggles.length) {\n      this.mobileToggles.forEach((toggle) => {\n        this.addListener(toggle, \"click\", () => {\n          this.activeMega = null;\n          this.activeDropdown = null;\n          if (!this.mobileOpen) {\n            this.mobileOpener = toggle;\n          }\n          this.mobileOpen = !this.mobileOpen;\n          if (!this.mobileOpen) {\n            this.openMobileSubmenus.clear();\n          }\n          this.update();\n        });\n      });\n    }\n\n    if (this.mobileBackdrop) {\n      this.addListener(this.mobileBackdrop, \"click\", () => {\n        this.activeMega = null;\n        this.activeDropdown = null;\n        this.mobileOpen = false;\n        this.openMobileSubmenus.clear();\n        this.update();\n      });\n    }\n\n    if (this.mobilePanel) {\n      this.addListener(this.mobilePanel, \"click\", (event) => {\n        event.stopPropagation();\n        if (\n          this.activeDropdown &&\n          !event.target.closest(\"[data-dropdown-panel]\") &&\n          !event.target.closest(\"[data-dropdown-toggle]\")\n        ) {\n          this.closeDropdown();\n        }\n      });\n      this.addListener(this.mobilePanel, \"pointerdown\", (event) => {\n        event.stopPropagation();\n      });\n    }\n\n    if (this.mobileSubmenuToggles.length) {\n      this.mobileSubmenuToggles.forEach((toggle) => {\n        const id = toggle.dataset.mobileSubmenuToggle;\n        this.addListener(toggle, \"click\", (event) => {\n          if (event.target.closest(\"[data-mobile-menu-link]\")) return;\n          event.preventDefault();\n          this.toggleMobileSubmenu(id);\n        });\n        this.addListener(toggle, \"keydown\", (event) => {\n          if (event.key === \"Enter\" || event.key === \" \") {\n            if (event.target.closest(\"[data-mobile-menu-link]\")) return;\n            event.preventDefault();\n            this.toggleMobileSubmenu(id);\n          }\n        });\n      });\n    }\n\n    this.addListener(this.header, \"mouseleave\", () => this.closeMega());\n    this.addListener(this.header, \"focusout\", (event) => {\n      if (this.mobileOpen) return;\n      if (this.searchOpen) return;\n      if (!this.header.contains(event.relatedTarget)) this.closeAll();\n    });\n\n    this.addListener(document, \"click\", (event) => {\n      if (this.mobileOpen) return;\n      if (this.searchOpen && this.searchOverlay?.contains(event.target)) return;\n      if (!this.header.contains(event.target)) this.closeAll();\n    });\n\n    this.addListener(document, \"keydown\", (event) => {\n      if (event.key === \"Escape\") this.closeAll();\n    });\n\n    const onScroll = () => {\n      if (this.scrollRaf) return;\n      this.scrollRaf = requestAnimationFrame(() => {\n        this.scrollRaf = null;\n        this.update();\n      });\n    };\n    this.addListener(window, \"scroll\", onScroll, { passive: true });\n\n    const onResize = () => {\n      if (this.resizeRaf) return;\n      this.resizeRaf = requestAnimationFrame(() => {\n        this.resizeRaf = null;\n        this.headerBarHeight = this.headerBar ? this.headerBar.offsetHeight : 0;\n        this.update();\n      });\n    };\n    this.addListener(window, \"resize\", onResize);\n  }\n\n  destroy() {\n    this.cleanup.forEach((remove) => remove());\n    this.cleanup = [];\n    if (this.scrollRaf) {\n      cancelAnimationFrame(this.scrollRaf);\n      this.scrollRaf = null;\n    }\n    if (this.resizeRaf) {\n      cancelAnimationFrame(this.resizeRaf);\n      this.resizeRaf = null;\n    }\n    this.submenuAutoTimers = new WeakMap();\n    this.submenuHeights = new WeakMap();\n  }\n}\ncustomElements.define(\"header-component\", HeaderComponent);\n\n// Slider component\nclass SliderComponent extends HTMLElement {\n  constructor() {\n    super();\n    this.track = null;\n    this.prevButton = null;\n    this.nextButton = null;\n    this.dots = null;\n    this.scrollbar = null;\n    this.scrollbarThumb = null;\n    this.isEnabled = false;\n    this.autoplayTimer = null;\n    this.autoplayInterval = 5000;\n    this.autoplayEnabled = false;\n    this.autoplayPaused = false;\n    this.pauseOnHover = true;\n    this.prefersReducedMotion = null;\n    this.onScroll = this.onScroll.bind(this);\n    this.onPrevClick = this.onPrevClick.bind(this);\n    this.onNextClick = this.onNextClick.bind(this);\n    this.onDotClick = this.onDotClick.bind(this);\n    this.onResize = this.onResize.bind(this);\n    this.onVisibilityChange = this.onVisibilityChange.bind(this);\n    this.onMouseEnter = this.onMouseEnter.bind(this);\n    this.onMouseLeave = this.onMouseLeave.bind(this);\n    this.onFocusIn = this.onFocusIn.bind(this);\n    this.onFocusOut = this.onFocusOut.bind(this);\n    this.onSliderKeyDown = this.onSliderKeyDown.bind(this);\n    this.onScrollbarPointerDown = this.onScrollbarPointerDown.bind(this);\n    this.onScrollbarPointerMove = this.onScrollbarPointerMove.bind(this);\n    this.onScrollbarPointerUp = this.onScrollbarPointerUp.bind(this);\n    this.onPointerDown = this.onPointerDown.bind(this);\n    this.onPointerMove = this.onPointerMove.bind(this);\n    this.onPointerUp = this.onPointerUp.bind(this);\n    this.onDragStart = this.onDragStart.bind(this);\n    this.resizeObserver = null;\n    this.isDragging = false;\n    this.dragStartX = 0;\n    this.dragStartScroll = 0;\n    this.dragPointerId = null;\n    this.prevScrollSnapType = \"\";\n    this.prevScrollBehavior = \"\";\n    this.snapRestoreTimer = null;\n    this.dragSpeed = 1.6;\n    this.dragRaf = null;\n    this.dragTargetScroll = null;\n    this.resetTransformTimer = null;\n    this.edgeSnapTarget = null;\n    this.dragDelta = 0;\n    this.dragHasMoved = false;\n    this.dragThreshold = 6;\n    this.isScrollbarDragging = false;\n    this.scrollbarPointerId = null;\n    this.scrollbarDragStartX = 0;\n    this.scrollbarDragStartScroll = 0;\n    this.scrollbarRaf = null;\n    this.scrollbarTargetScroll = null;\n    this.scrollbarPrevSnapType = \"\";\n    this.scrollbarPrevScrollBehavior = \"\";\n    this.isRtl = null;\n    this.isTouchCapable = null;\n    this.editorCleanup = null;\n  }\n\n  connectedCallback() {\n    this.track = this.querySelector(\"[data-slider-track]\");\n    this.prevButton = this.querySelector(\"[data-slider-prev]\");\n    this.nextButton = this.querySelector(\"[data-slider-next]\");\n    this.dots = this.querySelector(\"[data-slider-dots]\");\n    this.scrollbar = this.querySelector(\"[data-slider-scrollbar]\");\n    this.scrollbarThumb = this.querySelector(\"[data-slider-scrollbar-thumb]\");\n\n    if (!this.track) return;\n    this.bindEditorEvents();\n\n    const slides = Array.from(this.track.children);\n    this.isEnabled = slides.length > 1;\n    if (!this.isEnabled) {\n      this.track.classList.remove(\"cursor-grab\");\n      this.track.classList.add(\"cursor-default\");\n      this.track.style.overflowX = \"hidden\";\n      if (this.prevButton) this.prevButton.disabled = true;\n      if (this.nextButton) this.nextButton.disabled = true;\n      if (this.dots) {\n        this.buildDots();\n        this.updateDots();\n      }\n      if (this.scrollbar) {\n        this.scrollbar.setAttribute(\"aria-hidden\", \"true\");\n        this.scrollbar.style.display = \"none\";\n      }\n      return;\n    }\n\n    this.track.querySelectorAll(\"img\").forEach((img) => {\n      img.setAttribute(\"draggable\", \"false\");\n      img.addEventListener(\"dragstart\", this.onDragStart);\n    });\n    this.track.querySelectorAll(\"a\").forEach((link) => {\n      link.setAttribute(\"draggable\", \"false\");\n      link.addEventListener(\"dragstart\", this.onDragStart);\n    });\n\n    const speedAttr = this.getAttribute(\"data-drag-speed\");\n    if (speedAttr) {\n      const parsed = Number.parseFloat(speedAttr);\n      if (!Number.isNaN(parsed) && parsed > 0) {\n        this.dragSpeed = parsed;\n      }\n    }\n    this.track.classList.add(\"cursor-grab\");\n    this.track.addEventListener(\"scroll\", this.onScroll);\n    this.track.addEventListener(\"pointerdown\", this.onPointerDown);\n    this.addEventListener(\"keydown\", this.onSliderKeyDown);\n    if (this.prevButton) {\n      this.prevButton.addEventListener(\"click\", this.onPrevClick);\n    }\n    if (this.nextButton) {\n      this.nextButton.addEventListener(\"click\", this.onNextClick);\n    }\n    if (this.dots) {\n      this.dots.addEventListener(\"click\", this.onDotClick);\n      this.buildDots();\n      this.updateDots();\n    }\n    if (this.scrollbar && this.scrollbarThumb) {\n      this.scrollbar.addEventListener(\n        \"pointerdown\",\n        this.onScrollbarPointerDown,\n      );\n    }\n    if (this.scrollbar) {\n      this.scrollbar.setAttribute(\"aria-hidden\", \"false\");\n    }\n\n    if (window.ResizeObserver) {\n      this.resizeObserver = new ResizeObserver(this.onResize);\n      this.resizeObserver.observe(this.track);\n    }\n\n    this.updateButtons();\n    this.updateDots();\n    this.updateScrollbar();\n    this.setupAutoplay();\n  }\n\n  disconnectedCallback() {\n    if (this.editorCleanup) {\n      this.editorCleanup();\n      this.editorCleanup = null;\n    }\n    if (this.track) {\n      this.track.removeEventListener(\"scroll\", this.onScroll);\n      this.track.removeEventListener(\"pointerdown\", this.onPointerDown);\n      this.track.querySelectorAll(\"img\").forEach((img) => {\n        img.removeEventListener(\"dragstart\", this.onDragStart);\n      });\n      this.track.querySelectorAll(\"a\").forEach((link) => {\n        link.removeEventListener(\"dragstart\", this.onDragStart);\n      });\n    }\n    this.removeEventListener(\"keydown\", this.onSliderKeyDown);\n    if (this.prevButton) {\n      this.prevButton.removeEventListener(\"click\", this.onPrevClick);\n    }\n    if (this.nextButton) {\n      this.nextButton.removeEventListener(\"click\", this.onNextClick);\n    }\n    if (this.dots) {\n      this.dots.removeEventListener(\"click\", this.onDotClick);\n    }\n    if (this.scrollbar) {\n      this.scrollbar.removeEventListener(\n        \"pointerdown\",\n        this.onScrollbarPointerDown,\n      );\n    }\n    this.removeScrollbarDragListeners();\n    this.stopAutoplay();\n    this.removeAutoplayListeners();\n    this.removeDragListeners();\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n  }\n\n  onResize() {\n    if (!this.isEnabled) return;\n    this.updateButtons();\n    this.updateDots();\n    this.updateScrollbar();\n  }\n\n  onScroll() {\n    if (!this.isEnabled) return;\n    this.updateButtons();\n    this.updateDots();\n    this.updateScrollbar();\n  }\n\n  getIsRtl() {\n    if (this.isRtl !== null) return this.isRtl;\n    this.isRtl = document.documentElement.getAttribute(\"dir\") === \"rtl\";\n    return this.isRtl;\n  }\n\n  getIsTouchCapable() {\n    if (this.isTouchCapable !== null) return this.isTouchCapable;\n    const maxTouchPoints =\n      typeof navigator !== \"undefined\" && navigator.maxTouchPoints\n        ? navigator.maxTouchPoints\n        : 0;\n    if (maxTouchPoints > 0) {\n      this.isTouchCapable = true;\n      return this.isTouchCapable;\n    }\n    if (window.matchMedia) {\n      // Some browsers report touch capability via coarse pointers.\n      this.isTouchCapable = window.matchMedia(\"(any-pointer: coarse)\").matches;\n      return this.isTouchCapable;\n    }\n    this.isTouchCapable = false;\n    return this.isTouchCapable;\n  }\n\n  getMaxScroll() {\n    if (!this.track) return 0;\n    return this.track.scrollWidth - this.track.clientWidth;\n  }\n\n  getScrollLeft() {\n    if (!this.track) return 0;\n    if (!this.getIsRtl()) return this.track.scrollLeft;\n    const max = this.getMaxScroll();\n    const mode = window.webvista?.getRtlScrollMode\n      ? window.webvista.getRtlScrollMode()\n      : \"default\";\n    if (mode === \"negative\") {\n      return max + this.track.scrollLeft;\n    }\n    if (mode === \"reverse\") {\n      return max - this.track.scrollLeft;\n    }\n    return this.track.scrollLeft;\n  }\n\n  setScrollLeft(value, behavior = \"auto\") {\n    if (!this.track) return;\n    const max = this.getMaxScroll();\n    const clamped = Math.max(0, Math.min(max, value));\n    let target = clamped;\n    if (this.getIsRtl()) {\n      const mode = window.webvista?.getRtlScrollMode\n        ? window.webvista.getRtlScrollMode()\n        : \"default\";\n      if (mode === \"negative\") {\n        target = clamped - max;\n      } else if (mode === \"reverse\") {\n        target = max - clamped;\n      }\n    }\n    if (behavior === \"smooth\" && this.track.scrollTo) {\n      this.track.scrollTo({ left: target, behavior });\n      return;\n    }\n    this.track.scrollLeft = target;\n  }\n\n  onSliderKeyDown(event) {\n    if (!this.isEnabled) return;\n    if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n    // Skip if focus is inside an input, textarea, or [contenteditable]\n    var tag = document.activeElement && document.activeElement.tagName;\n    if (tag === \"INPUT\" || tag === \"TEXTAREA\" || (document.activeElement && document.activeElement.isContentEditable)) return;\n    event.preventDefault();\n    if (event.key === \"ArrowLeft\") {\n      this.onPrevClick();\n    } else {\n      this.onNextClick();\n    }\n  }\n\n  onPrevClick() {\n    if (!this.isEnabled) return;\n    if (!this.track) return;\n    if (this.getIsRtl()) {\n      const current = this.getActiveIndex();\n      this.scrollToIndex(Math.max(0, current - 1));\n      return;\n    }\n    const amount = this.track.clientWidth * 0.8;\n    this.setScrollLeft(this.getScrollLeft() - amount, \"smooth\");\n  }\n\n  onNextClick() {\n    if (!this.isEnabled) return;\n    if (!this.track) return;\n    if (this.getIsRtl()) {\n      const slides = this.getSlides();\n      const current = this.getActiveIndex();\n      this.scrollToIndex(Math.min(slides.length - 1, current + 1));\n      return;\n    }\n    const amount = this.track.clientWidth * 0.8;\n    this.setScrollLeft(this.getScrollLeft() + amount, \"smooth\");\n  }\n\n  setupAutoplay() {\n    if (!this.track) return;\n    const autoplayAttr = this.getAttribute(\"data-slider-autoplay\");\n    this.autoplayEnabled = autoplayAttr !== null && autoplayAttr !== \"false\";\n    if (!this.autoplayEnabled) return;\n    const intervalAttr = Number.parseInt(\n      this.getAttribute(\"data-slider-interval\"),\n      10,\n    );\n    if (!Number.isNaN(intervalAttr) && intervalAttr > 0) {\n      this.autoplayInterval = intervalAttr;\n    }\n    const pauseAttr = this.getAttribute(\"data-slider-pause-on-hover\");\n    this.pauseOnHover = pauseAttr !== \"false\";\n    if (window.matchMedia) {\n      this.prefersReducedMotion = window.matchMedia(\n        \"(prefers-reduced-motion: reduce)\",\n      );\n      if (this.prefersReducedMotion.matches) return;\n    }\n    this.addAutoplayListeners();\n    this.startAutoplay();\n  }\n\n  addAutoplayListeners() {\n    document.addEventListener(\"visibilitychange\", this.onVisibilityChange);\n    if (this.pauseOnHover) {\n      this.addEventListener(\"mouseenter\", this.onMouseEnter);\n      this.addEventListener(\"mouseleave\", this.onMouseLeave);\n    }\n    this.addEventListener(\"focusin\", this.onFocusIn);\n    this.addEventListener(\"focusout\", this.onFocusOut);\n  }\n\n  removeAutoplayListeners() {\n    document.removeEventListener(\"visibilitychange\", this.onVisibilityChange);\n    if (this.pauseOnHover) {\n      this.removeEventListener(\"mouseenter\", this.onMouseEnter);\n      this.removeEventListener(\"mouseleave\", this.onMouseLeave);\n    }\n    this.removeEventListener(\"focusin\", this.onFocusIn);\n    this.removeEventListener(\"focusout\", this.onFocusOut);\n  }\n\n  onVisibilityChange() {\n    if (document.hidden) {\n      this.pauseAutoplay();\n    } else {\n      this.resumeAutoplay();\n    }\n  }\n\n  onMouseEnter() {\n    this.pauseAutoplay();\n  }\n\n  onMouseLeave() {\n    this.resumeAutoplay();\n  }\n\n  onFocusIn() {\n    this.pauseAutoplay();\n  }\n\n  onFocusOut() {\n    this.resumeAutoplay();\n  }\n\n  startAutoplay() {\n    if (!this.autoplayEnabled || this.autoplayTimer) return;\n    const slides = this.getSlides();\n    if (slides.length < 2) return;\n    this.autoplayTimer = setInterval(() => {\n      if (this.autoplayPaused || document.hidden) return;\n      this.advanceSlide();\n    }, this.autoplayInterval);\n  }\n\n  stopAutoplay() {\n    if (!this.autoplayTimer) return;\n    clearInterval(this.autoplayTimer);\n    this.autoplayTimer = null;\n  }\n\n  pauseAutoplay() {\n    if (!this.autoplayEnabled) return;\n    this.autoplayPaused = true;\n  }\n\n  resumeAutoplay() {\n    if (!this.autoplayEnabled) return;\n    this.autoplayPaused = false;\n    this.startAutoplay();\n  }\n\n  getSlides() {\n    if (!this.track) return [];\n    return Array.from(this.track.children);\n  }\n\n  bindEditorEvents() {\n    if (!window.Shopify || !window.Shopify.designMode) {\n      return;\n    }\n\n    if (\n      !window.webvista ||\n      typeof window.webvista.bindShopifyEditorBlockEvents !== \"function\"\n    ) {\n      return;\n    }\n\n    if (this.editorCleanup) {\n      this.editorCleanup();\n      this.editorCleanup = null;\n    }\n\n    this.editorCleanup = window.webvista.bindShopifyEditorBlockEvents({\n      root: this,\n      onSelect: ({ blockElement }) => {\n        const slide = this.getSlideFromBlockElement(blockElement);\n        if (!slide) return;\n        const slides = this.getSlides();\n        const index = slides.indexOf(slide);\n        if (index < 0) return;\n        this.scrollToIndex(index);\n      },\n    });\n  }\n\n  getSlideFromBlockElement(blockElement) {\n    if (!(blockElement instanceof Element) || !this.track) return null;\n    if (!this.track.contains(blockElement)) return null;\n\n    let current = blockElement;\n    while (\n      current &&\n      current.parentElement &&\n      current.parentElement !== this.track\n    ) {\n      current = current.parentElement;\n    }\n\n    if (!current || current.parentElement !== this.track) return null;\n    return current;\n  }\n\n  getSlideLeft(slide) {\n    if (!this.track || !slide) return 0;\n    const trackRect = this.track.getBoundingClientRect();\n    const slideRect = slide.getBoundingClientRect();\n    return slideRect.left - trackRect.left + this.getScrollLeft();\n  }\n\n  getActiveIndex() {\n    if (!this.track) return 0;\n    const slides = this.getSlides();\n    if (!slides.length) return 0;\n    if (!this.getIsRtl()) {\n      const scrollLeft = this.getScrollLeft();\n      let activeIndex = 0;\n      let smallest = Infinity;\n      slides.forEach((slide, index) => {\n        const target = this.getSlideLeft(slide);\n        const distance = Math.abs(target - scrollLeft);\n        if (distance < smallest) {\n          smallest = distance;\n          activeIndex = index;\n        }\n      });\n      return activeIndex;\n    }\n    const trackRect = this.track.getBoundingClientRect();\n    let activeIndex = 0;\n    let smallest = Infinity;\n    slides.forEach((slide, index) => {\n      const rect = slide.getBoundingClientRect();\n      // In RTL, \"inline-start\" is the right edge.\n      const distance = Math.abs(rect.right - trackRect.right);\n      if (distance < smallest) {\n        smallest = distance;\n        activeIndex = index;\n      }\n    });\n    return activeIndex;\n  }\n\n  scrollToIndex(index) {\n    if (!this.track) return;\n    const slides = this.getSlides();\n    const target = slides[index];\n    if (!target) return;\n    if (this.getIsRtl()) {\n      target.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"nearest\",\n        inline: \"start\",\n      });\n      return;\n    }\n    const maxScroll = this.getMaxScroll();\n    const scrollTarget = this.getSlideLeft(target);\n    const clamped = Math.max(0, Math.min(maxScroll, scrollTarget));\n    this.setScrollLeft(clamped, \"smooth\");\n  }\n\n  advanceSlide() {\n    const slides = this.getSlides();\n    if (slides.length < 2) return;\n    const current = this.getActiveIndex();\n    const nextIndex = current + 1 >= slides.length ? 0 : current + 1;\n    this.scrollToIndex(nextIndex);\n  }\n\n  onDotClick(event) {\n    if (!this.track) return;\n    const dot = event.target.closest(\"[data-slider-dot]\");\n    if (!dot || !this.dots || !this.dots.contains(dot)) return;\n    const index = Number.parseInt(dot.getAttribute(\"data-slider-dot\"), 10);\n    if (Number.isNaN(index)) return;\n    const slides = Array.from(this.track.children);\n    const target = slides[index];\n    if (!target) return;\n    if (this.getIsRtl()) {\n      target.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"nearest\",\n        inline: \"start\",\n      });\n      return;\n    }\n    const maxScroll = this.getMaxScroll();\n    const clamped = Math.max(0, Math.min(maxScroll, target.offsetLeft));\n    this.setScrollLeft(clamped, \"smooth\");\n  }\n\n  buildDots() {\n    if (!this.dots || !this.track) return;\n    const slides = Array.from(this.track.children);\n    if (slides.length < 2) {\n      this.dots.innerHTML = \"\";\n      this.dots.style.display = \"none\";\n      return;\n    }\n    const existing = this.dots.querySelectorAll(\"[data-slider-dot]\");\n    if (existing.length === slides.length) return;\n    this.dots.innerHTML = \"\";\n    this.dots.style.display = \"\";\n    const baseClasses = this.dots.getAttribute(\"data-slider-dot-classes\") || \"\";\n    const baseOpacityAttr = this.dots.getAttribute(\"data-slider-dot-opacity\");\n    const baseOpacity =\n      baseOpacityAttr !== null ? Number.parseFloat(baseOpacityAttr) : 0.3;\n    slides.forEach((slide, index) => {\n      const button = document.createElement(\"button\");\n      button.type = \"button\";\n      button.setAttribute(\"data-slider-dot\", index);\n      button.setAttribute(\"aria-label\", `Go to slide ${index + 1}`);\n      if (baseClasses) {\n        button.className = baseClasses;\n      }\n      if (!Number.isNaN(baseOpacity)) {\n        button.style.opacity = String(baseOpacity);\n      }\n      this.dots.appendChild(button);\n    });\n  }\n\n  updateDots() {\n    if (!this.dots || !this.track) return;\n    const dots = Array.from(this.dots.querySelectorAll(\"[data-slider-dot]\"));\n    if (!dots.length) return;\n    const slides = Array.from(this.track.children);\n    if (slides.length < 2) {\n      this.dots.innerHTML = \"\";\n      this.dots.style.display = \"none\";\n      return;\n    }\n    this.dots.style.display = \"\";\n    const activeIndex = this.getActiveIndex();\n    const activeClasses =\n      this.dots.getAttribute(\"data-slider-dot-active-classes\") || \"\";\n    const activeClassList = activeClasses\n      .split(\" \")\n      .map((value) => value.trim())\n      .filter(Boolean);\n    const baseOpacityAttr = this.dots.getAttribute(\"data-slider-dot-opacity\");\n    const activeOpacityAttr = this.dots.getAttribute(\n      \"data-slider-dot-active-opacity\",\n    );\n    const baseOpacity =\n      baseOpacityAttr !== null ? Number.parseFloat(baseOpacityAttr) : 0.3;\n    const activeOpacity =\n      activeOpacityAttr !== null ? Number.parseFloat(activeOpacityAttr) : 1;\n    dots.forEach((dot, index) => {\n      const isActive = index === activeIndex;\n      dot.setAttribute(\"aria-current\", isActive ? \"true\" : \"false\");\n      if (activeClassList.length) {\n        activeClassList.forEach((className) => {\n          dot.classList.toggle(className, isActive);\n        });\n      }\n      if (!Number.isNaN(baseOpacity) && !Number.isNaN(activeOpacity)) {\n        dot.style.opacity = isActive\n          ? String(activeOpacity)\n          : String(baseOpacity);\n      }\n    });\n  }\n\n  updateScrollbar() {\n    if (!this.scrollbar || !this.scrollbarThumb || !this.track) return;\n    if (!this.isEnabled) {\n      this.scrollbar.setAttribute(\"aria-hidden\", \"true\");\n      this.scrollbar.style.display = \"none\";\n      return;\n    }\n    const maxScroll = this.getMaxScroll();\n    if (maxScroll <= 0) {\n      this.scrollbar.setAttribute(\"aria-hidden\", \"true\");\n      this.scrollbar.style.display = \"none\";\n      return;\n    }\n    this.scrollbar.setAttribute(\"aria-hidden\", \"false\");\n    this.scrollbar.style.display = \"\";\n    const widthPercent = Math.min(\n      100,\n      (this.track.clientWidth / this.track.scrollWidth) * 100,\n    );\n    const leftPercent =\n      (this.getScrollLeft() / maxScroll) * (100 - widthPercent);\n    this.scrollbarThumb.style.width = `${widthPercent}%`;\n    this.scrollbarThumb.style.left = `${leftPercent}%`;\n  }\n\n  onScrollbarPointerDown(event) {\n    if (!this.track || !this.scrollbar || !this.scrollbarThumb) return;\n    if (!this.isEnabled || event.button !== 0) return;\n    const thumb = event.target.closest(\"[data-slider-scrollbar-thumb]\");\n    if (!thumb) {\n      this.jumpToScrollbarPosition(event);\n      return;\n    }\n    event.preventDefault();\n    this.scrollbarPrevSnapType = this.track.style.scrollSnapType;\n    this.scrollbarPrevScrollBehavior = this.track.style.scrollBehavior;\n    this.track.style.scrollSnapType = \"none\";\n    this.track.style.scrollBehavior = \"auto\";\n    this.isScrollbarDragging = true;\n    this.scrollbarPointerId = event.pointerId;\n    this.scrollbarDragStartX = event.clientX;\n    this.scrollbarDragStartScroll = this.getScrollLeft();\n    this.scrollbarThumb.classList.add(\"cursor-grabbing\");\n    this.scrollbarThumb.classList.remove(\"cursor-grab\");\n    try {\n      this.scrollbarThumb.setPointerCapture(event.pointerId);\n    } catch (error) {}\n    this.addScrollbarDragListeners();\n  }\n\n  onScrollbarPointerMove(event) {\n    if (!this.isScrollbarDragging) return;\n    if (!this.track || !this.scrollbar || !this.scrollbarThumb) return;\n    const maxScroll = this.getMaxScroll();\n    if (maxScroll <= 0) return;\n    const trackWidth =\n      this.scrollbar.clientWidth - this.scrollbarThumb.offsetWidth;\n    if (trackWidth <= 0) return;\n    const deltaX = event.clientX - this.scrollbarDragStartX;\n    const nextScroll =\n      this.scrollbarDragStartScroll + (deltaX / trackWidth) * maxScroll;\n    this.scrollbarTargetScroll = Math.max(0, Math.min(maxScroll, nextScroll));\n    if (this.scrollbarRaf) return;\n    this.scrollbarRaf = requestAnimationFrame(() => {\n      this.scrollbarRaf = null;\n      if (!this.track || this.scrollbarTargetScroll === null) return;\n      this.setScrollLeft(this.scrollbarTargetScroll);\n    });\n  }\n\n  onScrollbarPointerUp(event) {\n    if (!this.isScrollbarDragging) return;\n    this.isScrollbarDragging = false;\n    if (this.scrollbarRaf) {\n      cancelAnimationFrame(this.scrollbarRaf);\n      this.scrollbarRaf = null;\n    }\n    if (this.scrollbarTargetScroll !== null && this.track) {\n      this.setScrollLeft(this.scrollbarTargetScroll);\n    }\n    this.scrollbarTargetScroll = null;\n    if (this.scrollbarThumb && this.scrollbarPointerId !== null) {\n      try {\n        this.scrollbarThumb.releasePointerCapture(this.scrollbarPointerId);\n      } catch (error) {}\n    }\n    this.scrollbarPointerId = null;\n    if (this.scrollbarThumb) {\n      this.scrollbarThumb.classList.remove(\"cursor-grabbing\");\n      this.scrollbarThumb.classList.add(\"cursor-grab\");\n    }\n    if (this.track) {\n      this.track.style.scrollSnapType = this.scrollbarPrevSnapType;\n      this.track.style.scrollBehavior = this.scrollbarPrevScrollBehavior;\n      this.snapToNearest();\n    }\n    this.removeScrollbarDragListeners();\n  }\n\n  addScrollbarDragListeners() {\n    document.addEventListener(\"pointermove\", this.onScrollbarPointerMove);\n    document.addEventListener(\"pointerup\", this.onScrollbarPointerUp);\n    document.addEventListener(\"pointercancel\", this.onScrollbarPointerUp);\n  }\n\n  removeScrollbarDragListeners() {\n    document.removeEventListener(\"pointermove\", this.onScrollbarPointerMove);\n    document.removeEventListener(\"pointerup\", this.onScrollbarPointerUp);\n    document.removeEventListener(\"pointercancel\", this.onScrollbarPointerUp);\n  }\n\n  jumpToScrollbarPosition(event) {\n    if (!this.track || !this.scrollbar || !this.scrollbarThumb) return;\n    const maxScroll = this.getMaxScroll();\n    if (maxScroll <= 0) return;\n    const rect = this.scrollbar.getBoundingClientRect();\n    const thumbWidth = this.scrollbarThumb.offsetWidth;\n    const trackWidth = rect.width - thumbWidth;\n    if (trackWidth <= 0) return;\n    const clickX = event.clientX - rect.left - thumbWidth / 2;\n    const ratio = Math.max(0, Math.min(1, clickX / trackWidth));\n    this.setScrollLeft(ratio * maxScroll, \"smooth\");\n  }\n\n  onPointerDown(event) {\n    if (!this.isEnabled) return;\n    if (!this.track) return;\n    // On touch-capable devices, native scrolling + scroll-snap is smoother and\n    // avoids fighting the browser's panning/momentum behavior.\n    if (this.getIsTouchCapable()) return;\n    // Also prefer native handling for touch/pen pointers.\n    if (event.pointerType === \"touch\" || event.pointerType === \"pen\") return;\n    if (event.button !== 0) return;\n    if (\n      event.target &&\n      event.target.closest(\n        \"button, input, textarea, select, model-viewer, [data-slider-no-drag]\",\n      )\n    ) {\n      return;\n    }\n    if (this.snapRestoreTimer) {\n      clearTimeout(this.snapRestoreTimer);\n      this.snapRestoreTimer = null;\n      this.restoreSnapStyles();\n    }\n    if (this.resetTransformTimer) {\n      clearTimeout(this.resetTransformTimer);\n      this.resetTransformTimer = null;\n    }\n    this.isDragging = true;\n    this.dragHasMoved = false;\n    this.dragPointerId = event.pointerId;\n    this.dragStartX = event.clientX;\n    this.dragStartScroll = this.getScrollLeft();\n    this.track.addEventListener(\"pointermove\", this.onPointerMove);\n    this.track.addEventListener(\"pointerup\", this.onPointerUp);\n    this.track.addEventListener(\"pointercancel\", this.onPointerUp);\n  }\n\n  startDrag() {\n    if (!this.track || this.dragHasMoved) return;\n    this.dragHasMoved = true;\n    if (this.dragPointerId !== null) {\n      try {\n        this.track.setPointerCapture(this.dragPointerId);\n      } catch (error) {}\n    }\n    this.track.style.transition = \"\";\n    this.track.classList.add(\"select-none\", \"cursor-grabbing\");\n    this.track.classList.remove(\"cursor-grab\");\n    this.prevScrollSnapType = this.track.style.scrollSnapType;\n    this.prevScrollBehavior = this.track.style.scrollBehavior;\n    this.track.style.scrollSnapType = \"none\";\n    this.track.style.scrollBehavior = \"auto\";\n  }\n\n  onPointerMove(event) {\n    if (!this.track || !this.isDragging) return;\n    const rawDelta = event.clientX - this.dragStartX;\n    if (!this.dragHasMoved && Math.abs(rawDelta) < this.dragThreshold) {\n      return;\n    }\n    event.preventDefault();\n    this.startDrag();\n    const delta = rawDelta * this.dragSpeed;\n    const maxScroll = this.getMaxScroll();\n    let nextScroll = this.dragStartScroll - delta;\n    if (nextScroll < 0) {\n      const elastic = Math.min(60, Math.abs(nextScroll) * 0.3);\n      this.track.style.transform = `translateX(${elastic}px)`;\n      nextScroll = 0;\n    } else if (nextScroll > maxScroll) {\n      const over = nextScroll - maxScroll;\n      const elastic = Math.min(60, Math.abs(over) * 0.3);\n      this.track.style.transform = `translateX(-${elastic}px)`;\n      nextScroll = maxScroll;\n    } else {\n      this.track.style.transform = \"\";\n    }\n    this.dragTargetScroll = nextScroll;\n    if (this.dragRaf) return;\n    this.dragRaf = requestAnimationFrame(() => {\n      this.dragRaf = null;\n      if (!this.track || this.dragTargetScroll === null) return;\n      this.setScrollLeft(this.dragTargetScroll);\n    });\n  }\n\n  onDragStart(event) {\n    event.preventDefault();\n  }\n\n  onPointerUp(event) {\n    if (!this.track || !this.isDragging) return;\n    if (this.dragPointerId !== null) {\n      try {\n        this.track.releasePointerCapture(this.dragPointerId);\n      } catch (error) {}\n    }\n    const wasDragging = this.dragHasMoved;\n    this.isDragging = false;\n    this.dragHasMoved = false;\n    this.dragPointerId = null;\n    this.track.classList.remove(\"select-none\", \"cursor-grabbing\");\n    this.track.classList.add(\"cursor-grab\");\n    if (this.dragRaf) {\n      cancelAnimationFrame(this.dragRaf);\n      this.dragRaf = null;\n    }\n    if (this.dragTargetScroll !== null) {\n      this.setScrollLeft(this.dragTargetScroll);\n    }\n    this.dragTargetScroll = null;\n    if (!wasDragging) {\n      this.restoreSnapStyles();\n      this.removeDragListeners();\n      return;\n    }\n    this.dragDelta = this.getScrollLeft() - this.dragStartScroll;\n    const maxScroll = this.getMaxScroll();\n    const edgeThreshold = Math.max(24, this.track.clientWidth * 0.06);\n    if (maxScroll > 0) {\n      if (this.getScrollLeft() >= maxScroll - edgeThreshold) {\n        this.edgeSnapTarget = maxScroll;\n      } else if (this.getScrollLeft() <= edgeThreshold) {\n        this.edgeSnapTarget = 0;\n      } else {\n        this.edgeSnapTarget = null;\n      }\n    } else {\n      this.edgeSnapTarget = null;\n    }\n    if (this.track.style.transform) {\n      this.track.style.transition = \"transform 220ms ease-out\";\n      this.track.style.transform = \"\";\n      this.resetTransformTimer = setTimeout(() => {\n        if (!this.track) return;\n        this.track.style.transition = \"\";\n        this.resetTransformTimer = null;\n      }, 240);\n    }\n    this.removeDragListeners();\n    const shouldDelaySnap = Boolean(this.track.style.transition);\n    const snapDelay = shouldDelaySnap ? 240 : 0;\n    this.snapRestoreTimer = setTimeout(() => {\n      this.snapToNearest();\n      this.restoreSnapStyles();\n      this.snapRestoreTimer = null;\n    }, snapDelay);\n  }\n\n  removeDragListeners() {\n    if (!this.track) return;\n    this.track.removeEventListener(\"pointermove\", this.onPointerMove);\n    this.track.removeEventListener(\"pointerup\", this.onPointerUp);\n    this.track.removeEventListener(\"pointercancel\", this.onPointerUp);\n  }\n\n  restoreSnapStyles() {\n    if (!this.track) return;\n    this.track.style.scrollSnapType = this.prevScrollSnapType;\n    this.track.style.scrollBehavior = this.prevScrollBehavior;\n  }\n\n  snapToNearest() {\n    if (!this.track) return;\n    if (this.edgeSnapTarget !== null) {\n      const clamped = Math.max(\n        0,\n        Math.min(this.getMaxScroll(), this.edgeSnapTarget),\n      );\n      this.edgeSnapTarget = null;\n      this.track.style.scrollBehavior = \"smooth\";\n      this.setScrollLeft(clamped, \"smooth\");\n      return;\n    }\n    const slides = Array.from(this.track.children);\n    if (!slides.length) return;\n    if (this.getIsRtl()) {\n      const trackRect = this.track.getBoundingClientRect();\n      let nearest = slides[0];\n      let smallest = Infinity;\n      slides.forEach((slide) => {\n        const rect = slide.getBoundingClientRect();\n        // In RTL, \"inline-start\" is the right edge.\n        const distance = Math.abs(rect.right - trackRect.right);\n        if (distance < smallest) {\n          smallest = distance;\n          nearest = slide;\n        }\n      });\n      this.dragDelta = 0;\n      nearest.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"nearest\",\n        inline: \"start\",\n      });\n      return;\n    }\n    const scrollLeft = this.getScrollLeft();\n    const maxScroll = this.getMaxScroll();\n    const getTarget = (slide, index) => {\n      if (index === 0) {\n        return 0;\n      }\n      if (\n        index === slides.length - 1 &&\n        maxScroll > 0 &&\n        this.getSlideLeft(slide) < maxScroll\n      ) {\n        return maxScroll;\n      }\n      return this.getSlideLeft(slide);\n    };\n    let nearest = slides[0];\n    let nearestTarget = getTarget(nearest, 0);\n    let smallest = Math.abs(nearestTarget - scrollLeft);\n    let nearestIndex = 0;\n    slides.forEach((slide, index) => {\n      const target = getTarget(slide, index);\n      const distance = Math.abs(target - scrollLeft);\n      if (distance < smallest) {\n        smallest = distance;\n        nearest = slide;\n        nearestTarget = target;\n        nearestIndex = index;\n      }\n    });\n    if (this.dragDelta !== 0) {\n      // Find the slide we started on before dragging\n      let startIndex = 0;\n      let startSmallest = Infinity;\n      slides.forEach((slide, index) => {\n        const target = getTarget(slide, index);\n        const distance = Math.abs(target - this.dragStartScroll);\n        if (distance < startSmallest) {\n          startSmallest = distance;\n          startIndex = index;\n        }\n      });\n      // Only apply momentum if the nearest slide is still the starting one\n      // (small drag that didn't scroll past the midpoint). If we already\n      // passed the next slide naturally, just snap to nearest \u2014 no extra push.\n      if (nearestIndex === startIndex) {\n        const direction = this.dragDelta > 0 ? 1 : -1;\n        const nextIndex = startIndex + direction;\n        if (nextIndex >= 0 && nextIndex < slides.length) {\n          const slideWidth =\n            slides[nextIndex].clientWidth || this.track.clientWidth;\n          if (Math.abs(this.dragDelta) >= slideWidth * 0.3) {\n            nearestTarget = getTarget(slides[nextIndex], nextIndex);\n          }\n        }\n      }\n    }\n    this.dragDelta = 0;\n    this.track.style.scrollBehavior = \"smooth\";\n    const clamped = Math.max(0, Math.min(maxScroll, nearestTarget));\n    this.setScrollLeft(clamped, \"smooth\");\n  }\n\n  updateButtons() {\n    if (!this.track || !this.prevButton || !this.nextButton) return;\n    const slides = this.getSlides();\n    if (slides.length < 2) {\n      this.prevButton.disabled = true;\n      this.nextButton.disabled = true;\n      return;\n    }\n    const maxScroll = this.getMaxScroll();\n    if (maxScroll <= 0) {\n      this.prevButton.disabled = true;\n      this.nextButton.disabled = true;\n      return;\n    }\n    const scrollLeft = this.getScrollLeft();\n    const edgeThreshold = Math.max(1, Math.round(this.track.clientWidth * 0.01));\n    this.prevButton.disabled = scrollLeft <= edgeThreshold;\n    this.nextButton.disabled = scrollLeft >= maxScroll - edgeThreshold;\n  }\n}\ncustomElements.define(\"slider-component\", SliderComponent);\n\n// Responsive slider component\n// Extends SliderComponent to enable/disable based on viewport size\n// Uses data attributes to configure behavior\nclass ResponsiveSliderComponent extends SliderComponent {\n  constructor() {\n    super();\n    this.mediaQuery = null;\n    this.isEnabled = null;\n    this.onMediaChange = this.onMediaChange.bind(this);\n  }\n\n  connectedCallback() {\n    this.track = this.querySelector(\"[data-slider-track]\");\n    if (!this.track) return;\n    this.mediaQuery = window.matchMedia(\"(min-width: 768px)\");\n    if (this.mediaQuery.addEventListener) {\n      this.mediaQuery.addEventListener(\"change\", this.onMediaChange);\n    } else if (this.mediaQuery.addListener) {\n      this.mediaQuery.addListener(this.onMediaChange);\n    }\n    this.applyMode();\n  }\n\n  disconnectedCallback() {\n    if (this.mediaQuery) {\n      if (this.mediaQuery.removeEventListener) {\n        this.mediaQuery.removeEventListener(\"change\", this.onMediaChange);\n      } else if (this.mediaQuery.removeListener) {\n        this.mediaQuery.removeListener(this.onMediaChange);\n      }\n      this.mediaQuery = null;\n    }\n    if (this.isEnabled) {\n      super.disconnectedCallback();\n    }\n    this.isEnabled = null;\n  }\n\n  onMediaChange() {\n    this.applyMode();\n  }\n\n  applyMode() {\n    if (!this.track) return;\n    const enableMobile = this.getAttribute(\"data-enable-mobile\") === \"true\";\n    const enableDesktop = this.getAttribute(\"data-enable-desktop\") === \"true\";\n    const isDesktop = this.mediaQuery\n      ? this.mediaQuery.matches\n      : window.innerWidth >= 768;\n    const shouldEnable = isDesktop ? enableDesktop : enableMobile;\n    if (shouldEnable === this.isEnabled) return;\n\n    if (this.isEnabled) {\n      super.disconnectedCallback();\n    }\n\n    this.isEnabled = shouldEnable;\n    this.updateTrackClasses(shouldEnable);\n    this.updateItemClasses(shouldEnable);\n\n    if (shouldEnable) {\n      super.connectedCallback();\n    } else {\n      this.track.style.transform = \"\";\n      this.track.style.transition = \"\";\n      this.track.style.scrollSnapType = \"\";\n      this.track.style.scrollBehavior = \"\";\n      this.track.classList.remove(\n        \"cursor-grab\",\n        \"cursor-grabbing\",\n        \"select-none\",\n      );\n    }\n  }\n\n  updateTrackClasses(enabled) {\n    this.toggleClasses(\n      this.track,\n      this.getAttribute(\"data-slider-enabled-classes\"),\n      this.getAttribute(\"data-slider-disabled-classes\"),\n      enabled,\n    );\n  }\n\n  updateItemClasses(enabled) {\n    const items = this.querySelectorAll(\"[data-slider-item]\");\n    items.forEach((item) => {\n      this.toggleClasses(\n        item,\n        item.getAttribute(\"data-slider-item-enabled-classes\"),\n        item.getAttribute(\"data-slider-item-disabled-classes\"),\n        enabled,\n      );\n    });\n  }\n\n  toggleClasses(element, enabledClasses, disabledClasses, enabled) {\n    if (!element) return;\n    const add = enabled ? enabledClasses : disabledClasses;\n    const remove = enabled ? disabledClasses : enabledClasses;\n    this.parseClassList(remove).forEach((name) =>\n      element.classList.remove(name),\n    );\n    this.parseClassList(add).forEach((name) => element.classList.add(name));\n  }\n\n  parseClassList(value) {\n    if (!value) return [];\n    return value.split(/\\s+/).filter(Boolean);\n  }\n}\ncustomElements.define(\"responsive-slider-component\", ResponsiveSliderComponent);\n\n// Quantity Input Component\n// Handles incrementing and decrementing quantity input values\nclass QuantityInput extends HTMLElement {\n  constructor() {\n    super();\n    this.input = null;\n    this.onClick = this.onClick.bind(this);\n    this.onInputChange = this.onInputChange.bind(this);\n    this.changeEvent = new Event(\"change\", { bubbles: true });\n  }\n\n  connectedCallback() {\n    this.input =\n      this.querySelector('input[name=\"quantity\"]') ||\n      this.querySelector('input[name=\"updates[]\"]');\n    if (!this.input) return;\n    this.addEventListener(\"click\", this.onClick);\n    this.input.addEventListener(\"change\", this.onInputChange);\n    this.updateQtyButtonState();\n    const hasBoundaryData =\n      this.input.dataset.min ||\n      this.input.dataset.max ||\n      this.input.dataset.cartQuantity;\n    if (hasBoundaryData && this.input.name === \"quantity\") {\n      this.setQuantityBoundaries();\n    }\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener(\"click\", this.onClick);\n    if (this.input) {\n      this.input.removeEventListener(\"change\", this.onInputChange);\n    }\n  }\n\n  onClick(event) {\n    const button = event.target.closest(\"button\");\n    if (!button || !this.input) return;\n    if (button.name === \"minus\") {\n      this.input.stepDown();\n    }\n    if (button.name === \"plus\") {\n      this.input.stepUp();\n    }\n    this.input.dispatchEvent(this.changeEvent);\n    this.updateQtyButtonState();\n  }\n\n  onInputChange() {\n    this.updateQtyButtonState();\n  }\n\n  // Update quantity button state\n  updateQtyButtonState() {\n    if (!this.input) return;\n    const value = parseInt(this.input.value, 10);\n    const buttonMinus = this.querySelector('button[name=\"minus\"]');\n    const buttonPlus = this.querySelector('button[name=\"plus\"]');\n\n    if (this.input.min) {\n      const min = parseInt(this.input.min, 10);\n      if (buttonMinus) {\n        const isDisabled = value <= min;\n        buttonMinus.classList.toggle(\"disabled\", isDisabled);\n        buttonMinus.toggleAttribute(\"disabled\", isDisabled);\n      }\n    }\n\n    if (this.input.max) {\n      const max = parseInt(this.input.max, 10);\n      if (buttonPlus) {\n        const isDisabled = value >= max;\n        buttonPlus.classList.toggle(\"disabled\", isDisabled);\n        buttonPlus.toggleAttribute(\"disabled\", isDisabled);\n      }\n    }\n  }\n\n  // Set quantity boundaries based on data attributes and cart quantity\n  setQuantityBoundaries(preserveValue = false) {\n    if (!this.input) return;\n    const data = {\n      cartQuantity: this.input.dataset.cartQuantity\n        ? parseInt(this.input.dataset.cartQuantity, 10)\n        : 0,\n      min: this.input.dataset.min\n        ? parseInt(this.input.dataset.min, 10)\n        : this.input.min\n          ? parseInt(this.input.min, 10)\n          : 1,\n      max: this.input.dataset.max\n        ? parseInt(this.input.dataset.max, 10)\n        : this.input.max\n          ? parseInt(this.input.max, 10)\n          : null,\n      step: this.input.step ? parseInt(this.input.step, 10) : 1,\n    };\n\n    const resolvedMin = Number.isNaN(data.min) ? 1 : data.min;\n    const resolvedMax =\n      data.max === null || Number.isNaN(data.max) ? null : data.max;\n    const resolvedStep = Number.isNaN(data.step) ? 1 : data.step;\n    const cartQty = Number.isNaN(data.cartQuantity) ? 0 : data.cartQuantity;\n\n    let min = resolvedMin;\n    const max = resolvedMax === null ? resolvedMax : resolvedMax - cartQty;\n    if (max !== null) {\n      min = Math.min(min, max);\n    }\n    if (cartQty >= resolvedMin) min = Math.min(min, resolvedStep);\n\n    if (max !== null && max < 0) {\n      this.input.min = 0;\n      this.input.max = 0;\n      this.input.value = 0;\n      this.input.dispatchEvent(this.changeEvent);\n      this.updateQtyButtonState();\n      return;\n    }\n\n    this.input.min = min;\n    this.input.max = max;\n    if (preserveValue) {\n      let nextValue = parseInt(this.input.value, 10);\n      if (Number.isNaN(nextValue)) {\n        nextValue = min;\n      }\n      if (max !== null) {\n        nextValue = Math.min(nextValue, max);\n      }\n      if (min !== null) {\n        nextValue = Math.max(nextValue, min);\n      }\n      this.input.value = nextValue;\n    } else {\n      this.input.value = min;\n    }\n    this.input.dispatchEvent(this.changeEvent);\n    this.updateQtyButtonState();\n  }\n}\ncustomElements.define(\"quantity-input\", QuantityInput);\n\n// Accordion Details Component\nclass AccordionDetails extends HTMLElement {\n  constructor() {\n    super();\n    this.items = [];\n    this.initialOpenItems = new Set();\n    this.editorActiveBlockId = null;\n    this.editorCleanup = null;\n    this.onTriggerClick = this.onTriggerClick.bind(this);\n  }\n\n  connectedCallback() {\n    this.items = Array.from(this.querySelectorAll(\"[data-accordion-item]\"));\n    this.initialOpenItems = new Set(\n      this.items.filter((item) => item.hasAttribute(\"data-open\")),\n    );\n    this.items.forEach((item) => {\n      const trigger = item.querySelector(\"[data-accordion-trigger]\");\n      if (!trigger) return;\n      trigger.addEventListener(\"click\", this.onTriggerClick);\n      if (!item.hasAttribute(\"data-open\")) {\n        const content = item.querySelector(\"[data-accordion-content]\");\n        const inner = content?.firstElementChild;\n        if (inner) inner.setAttribute(\"inert\", \"\");\n      }\n    });\n    this.bindEditorEvents();\n  }\n\n  disconnectedCallback() {\n    this.editorActiveBlockId = null;\n    if (this.editorCleanup) {\n      this.editorCleanup();\n      this.editorCleanup = null;\n    }\n    this.items.forEach((item) => {\n      const trigger = item.querySelector(\"[data-accordion-trigger]\");\n      if (!trigger) return;\n      trigger.removeEventListener(\"click\", this.onTriggerClick);\n    });\n  }\n\n  getAllowMultiple() {\n    return (\n      this.dataset.accordionMode === \"multi\" ||\n      this.hasAttribute(\"data-accordion-multi\")\n    );\n  }\n\n  getGroupItems() {\n    const allowMultiple =\n      this.dataset.accordionMode === \"multi\" ||\n      this.hasAttribute(\"data-accordion-multi\");\n    const group = this.dataset.group;\n    return group && !allowMultiple\n      ? Array.from(\n          document.querySelectorAll(\n            `accordion-details[data-group=\"${group}\"] [data-accordion-item]`,\n          ),\n        )\n      : this.items;\n  }\n\n  setItemOpen(item, isOpen) {\n    if (!item) return;\n    const trigger = item.querySelector(\"[data-accordion-trigger]\");\n    const content = item.querySelector(\"[data-accordion-content]\");\n    const inner = content?.firstElementChild;\n    const plus = item.querySelector(\".product-accordion__plus\");\n\n    if (isOpen) {\n      item.setAttribute(\"data-open\", \"true\");\n      if (content) {\n        content.classList.remove(\"grid-rows-[0fr]\");\n        content.classList.add(\"grid-rows-[1fr]\", \"pb-4\");\n      }\n      if (inner) inner.removeAttribute(\"inert\");\n      if (trigger) {\n        trigger.setAttribute(\"aria-expanded\", \"true\");\n      }\n      if (plus) plus.classList.remove(\"rotate-90\");\n      return;\n    }\n\n    item.removeAttribute(\"data-open\");\n    if (content) {\n      content.classList.remove(\"grid-rows-[1fr]\", \"pb-4\");\n      content.classList.add(\"grid-rows-[0fr]\");\n    }\n    if (inner) inner.setAttribute(\"inert\", \"\");\n    if (trigger) {\n      trigger.setAttribute(\"aria-expanded\", \"false\");\n    }\n    if (plus) plus.classList.add(\"rotate-90\");\n  }\n\n  closeSiblingItems(activeItem) {\n    if (this.getAllowMultiple()) {\n      return;\n    }\n    this.getGroupItems().forEach((item) => {\n      if (item === activeItem) {\n        return;\n      }\n      this.setItemOpen(item, false);\n    });\n  }\n\n  openItem(item) {\n    if (!item) {\n      return;\n    }\n    this.closeSiblingItems(item);\n    this.setItemOpen(item, true);\n  }\n\n  restoreInitialState() {\n    this.items.forEach((item) => {\n      const shouldOpen = this.initialOpenItems.has(item);\n      this.setItemOpen(item, shouldOpen);\n    });\n  }\n\n  bindEditorEvents() {\n    if (\n      !window.webvista ||\n      typeof window.webvista.bindShopifyEditorBlockEvents !== \"function\"\n    ) {\n      return;\n    }\n\n    this.editorCleanup = window.webvista.bindShopifyEditorBlockEvents({\n      root: this,\n      onSelect: ({ blockId, blockElement }) => {\n        this.editorActiveBlockId = blockId;\n        const targetItem =\n          (blockElement &&\n            (blockElement.matches(\"[data-accordion-item]\")\n              ? blockElement\n              : blockElement.querySelector(\"[data-accordion-item]\"))) ||\n          this.items[0] ||\n          this.querySelector(\"[data-accordion-item]\");\n        if (!targetItem) {\n          return;\n        }\n        this.openItem(targetItem);\n      },\n      onDeselect: ({ blockId }) => {\n        if (!blockId || blockId !== this.editorActiveBlockId) {\n          return;\n        }\n        this.editorActiveBlockId = null;\n        window.setTimeout(() => {\n          if (this.editorActiveBlockId !== null) {\n            return;\n          }\n          this.restoreInitialState();\n        }, 0);\n      },\n    });\n  }\n\n  onTriggerClick(event) {\n    const trigger = event.currentTarget;\n    const item = trigger.closest(\"[data-accordion-item]\");\n    if (!item) return;\n    const isOpen = item.hasAttribute(\"data-open\");\n\n    if (isOpen) {\n      this.setItemOpen(item, false);\n      return;\n    }\n\n    this.openItem(item);\n  }\n}\ncustomElements.define(\"accordion-details\", AccordionDetails);\n\n// Tabs Base Component\nclass TabsBase extends HTMLElement {\n  constructor() {\n    super();\n    this.buttons = [];\n    this.panels = [];\n    this.track = null;\n    this.nav = null;\n    this.activeId = null;\n    this.touchStartX = 0;\n    this.touchStartY = 0;\n    this.touchDeltaX = 0;\n    this.touchDeltaY = 0;\n    this.onTabClick = this.onTabClick.bind(this);\n    this.onTabKeydown = this.onTabKeydown.bind(this);\n    this.onPanelKeydown = this.onPanelKeydown.bind(this);\n    this.onTouchStart = this.onTouchStart.bind(this);\n    this.onTouchMove = this.onTouchMove.bind(this);\n    this.onTouchEnd = this.onTouchEnd.bind(this);\n  }\n\n  connectedCallback() {\n    this.buttons = Array.from(this.querySelectorAll(\"[data-tab-button]\"));\n    this.panels = Array.from(this.querySelectorAll(\"[data-tab-panel]\"));\n    this.track = this.querySelector(\"[data-tabs-track]\");\n    this.nav = this.querySelector(\"[data-tabs-nav]\");\n\n    if (!this.buttons.length || !this.panels.length) return;\n\n    this.buttons.forEach((button) => {\n      button.addEventListener(\"click\", this.onTabClick);\n      button.addEventListener(\"keydown\", this.onTabKeydown);\n    });\n\n    this.panels.forEach((panel) => {\n      panel.addEventListener(\"keydown\", this.onPanelKeydown);\n    });\n\n    // Swipe-to-switch is opt-in. Add `data-tabs-swipe=\"true\"` to enable.\n    if (this.dataset.tabsSwipe === \"true\") {\n      this.bindSwipe();\n    }\n\n    const selected = this.buttons.find(\n      (button) => button.getAttribute(\"aria-selected\") === \"true\",\n    );\n    const firstId = this.buttons[0]\n      ? this.buttons[0].getAttribute(\"data-tab-id\")\n      : null;\n    const initialId =\n      (selected && selected.getAttribute(\"data-tab-id\")) || firstId;\n    this.setActiveTab(initialId, { scrollToNav: false });\n\n    // Shopify editor: activate tab when block is selected\n    this._onEditorBlockSelect = (event) => {\n      const blockId = event.detail && event.detail.blockId;\n      if (!blockId) return;\n      // Find button whose data-tab-id ends with the block id\n      const button = this.buttons.find((b) => {\n        const tabId = b.getAttribute(\"data-tab-id\") || \"\";\n        return tabId.endsWith(blockId);\n      });\n      if (button) {\n        this.setActiveTab(button.getAttribute(\"data-tab-id\"));\n      }\n    };\n    document.addEventListener(\"shopify:block:select\", this._onEditorBlockSelect);\n  }\n\n  disconnectedCallback() {\n    this.buttons.forEach((button) => {\n      button.removeEventListener(\"click\", this.onTabClick);\n      button.removeEventListener(\"keydown\", this.onTabKeydown);\n    });\n\n    this.panels.forEach((panel) => {\n      panel.removeEventListener(\"keydown\", this.onPanelKeydown);\n    });\n\n    if (this.track) {\n      this.track.removeEventListener(\"touchstart\", this.onTouchStart);\n      this.track.removeEventListener(\"touchmove\", this.onTouchMove);\n      this.track.removeEventListener(\"touchend\", this.onTouchEnd);\n    }\n\n    if (this._onEditorBlockSelect) {\n      document.removeEventListener(\"shopify:block:select\", this._onEditorBlockSelect);\n      this._onEditorBlockSelect = null;\n    }\n  }\n\n  onTabClick(event) {\n    const button = event.currentTarget;\n    const targetId = button.getAttribute(\"data-tab-id\");\n    this.setActiveTab(targetId);\n  }\n\n  // Keyboard navigation for tabs (WAI-ARIA Tabs pattern)\n  onTabKeydown(event) {\n    var key = event.key;\n    if (\n      key !== \"ArrowLeft\" &&\n      key !== \"ArrowRight\" &&\n      key !== \"Home\" &&\n      key !== \"End\"\n    )\n      return;\n\n    event.preventDefault();\n\n    var currentIndex = this.buttons.indexOf(event.currentTarget);\n    var nextIndex;\n\n    if (key === \"ArrowRight\") {\n      nextIndex = (currentIndex + 1) % this.buttons.length;\n    } else if (key === \"ArrowLeft\") {\n      nextIndex =\n        (currentIndex - 1 + this.buttons.length) % this.buttons.length;\n    } else if (key === \"Home\") {\n      nextIndex = 0;\n    } else if (key === \"End\") {\n      nextIndex = this.buttons.length - 1;\n    }\n\n    var targetId = this.buttons[nextIndex].getAttribute(\"data-tab-id\");\n    this.setActiveTab(targetId);\n    this.buttons[nextIndex].focus();\n  }\n\n  // Escape anywhere in panel, or Shift+Tab on first element \u2192 return to active tab\n  onPanelKeydown(event) {\n    if (event.key === \"Escape\") {\n      event.preventDefault();\n      var active = this.buttons.find(\n        function (b) { return b.getAttribute(\"aria-selected\") === \"true\"; }\n      );\n      if (active) active.focus();\n      return;\n    }\n\n    if (event.key !== \"Tab\" || !event.shiftKey) return;\n\n    var panel = event.currentTarget;\n    var focusable = webvista.getFocusableElements(panel);\n    if (focusable.length && document.activeElement !== focusable[0]) return;\n\n    var activeButton = this.buttons.find(\n      function (b) { return b.getAttribute(\"aria-selected\") === \"true\"; }\n    );\n    if (!activeButton) return;\n\n    event.preventDefault();\n    activeButton.focus();\n  }\n\n  bindSwipe() {\n    if (!this.track) return;\n    this.track.addEventListener(\"touchstart\", this.onTouchStart, {\n      passive: true,\n    });\n    this.track.addEventListener(\"touchmove\", this.onTouchMove, {\n      passive: true,\n    });\n    this.track.addEventListener(\"touchend\", this.onTouchEnd, {\n      passive: true,\n    });\n  }\n\n  onTouchStart(event) {\n    const touch = event.touches[0];\n    this.touchStartX = touch.clientX;\n    this.touchStartY = touch.clientY;\n    this.touchDeltaX = 0;\n    this.touchDeltaY = 0;\n  }\n\n  onTouchMove(event) {\n    const touch = event.touches[0];\n    this.touchDeltaX = touch.clientX - this.touchStartX;\n    this.touchDeltaY = touch.clientY - this.touchStartY;\n  }\n\n  onTouchEnd() {\n    const absX = Math.abs(this.touchDeltaX);\n    const absY = Math.abs(this.touchDeltaY);\n    if (absX < 40 || absX < absY) return;\n\n    if (this.touchDeltaX < 0) {\n      this.setActiveByOffset(1);\n    } else {\n      this.setActiveByOffset(-1);\n    }\n  }\n\n  setActiveByOffset(offset) {\n    const ids = this.buttons.map((button) =>\n      button.getAttribute(\"data-tab-id\"),\n    );\n    const currentIndex = ids.indexOf(this.activeId);\n    if (currentIndex === -1) return;\n\n    const nextIndex = Math.max(\n      0,\n      Math.min(ids.length - 1, currentIndex + offset),\n    );\n    if (nextIndex === currentIndex) return;\n    this.setActiveTab(ids[nextIndex]);\n  }\n\n  setActiveTab(targetId, options = {}) {\n    if (!targetId || this.activeId === targetId) return;\n\n    this.activeId = targetId;\n    const { scrollToNav = true } = options;\n\n    const activeClass = this.dataset.tabActiveClass || \"text-foreground\";\n    const inactiveClass = this.dataset.tabInactiveClass || \"text-foreground/40\";\n    const inactiveHoverClass =\n      this.dataset.tabInactiveHoverClass || \"hover:text-foreground/70\";\n    const indicatorActiveClass =\n      this.dataset.tabIndicatorActiveClass || \"scale-x-100\";\n    const indicatorInactiveClass =\n      this.dataset.tabIndicatorInactiveClass || \"scale-x-0\";\n    const indicatorSelector =\n      this.dataset.tabIndicatorSelector || \"[data-tab-indicator]\";\n    const panelInnerSelector =\n      this.dataset.tabPanelInnerSelector || \".routine-tabs__panel-inner\";\n\n    this.buttons.forEach((button) => {\n      const isActive = button.getAttribute(\"data-tab-id\") === targetId;\n      button.setAttribute(\"aria-selected\", String(isActive));\n      button.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n      button.classList.toggle(activeClass, isActive);\n      button.classList.toggle(inactiveClass, !isActive);\n      button.classList.toggle(inactiveHoverClass, !isActive);\n\n      const indicator = button.querySelector(indicatorSelector);\n      if (indicator) {\n        indicator.classList.toggle(indicatorActiveClass, isActive);\n        indicator.classList.toggle(indicatorInactiveClass, !isActive);\n      }\n\n      if (isActive && this.nav && scrollToNav) {\n        button.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"nearest\",\n          inline: \"center\",\n        });\n      }\n    });\n\n    this.panels.forEach((panel) => {\n      const isActive = panel.id === targetId;\n      panel.classList.toggle(\"hidden\", !isActive);\n      panel.setAttribute(\"aria-hidden\", String(!isActive));\n      const inner = panel.querySelector(panelInnerSelector);\n      if (inner) {\n        inner.classList.toggle(\"animate-fade-in-up\", isActive);\n      }\n    });\n  }\n}\ncustomElements.define(\"tabs-base\", TabsBase);\n\n// Countdown Timer Component\nclass CountdownTimer extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.countdownInit === \"true\") return;\n\n    this.dataset.countdownInit = \"true\";\n\n    const endValue = this.getAttribute(\"data-countdown-end\");\n    if (!endValue) return;\n\n    const endTime = new Date(endValue.replace(\" \", \"T\"));\n    if (Number.isNaN(endTime.getTime())) return;\n\n    this.endTime = endTime;\n    this.daysEl = this.querySelector(\"[data-countdown-days]\");\n    this.hoursEl = this.querySelector(\"[data-countdown-hours]\");\n    this.minutesEl = this.querySelector(\"[data-countdown-minutes]\");\n    this.secondsEl = this.querySelector(\"[data-countdown-seconds]\");\n\n    this.updateCountdown = this.updateCountdown.bind(this);\n    this.updateCountdown();\n    this.timerId = setInterval(this.updateCountdown, 1000);\n  }\n\n  disconnectedCallback() {\n    if (this.timerId) {\n      clearInterval(this.timerId);\n      this.timerId = null;\n    }\n  }\n\n  updateCountdown() {\n    if (!this.endTime) return;\n\n    const diff = Math.max(0, this.endTime.getTime() - Date.now());\n    const hasDays = Boolean(this.daysEl);\n    const days = hasDays ? Math.floor(diff / 86400000) : 0;\n    const hours = hasDays\n      ? Math.floor((diff % 86400000) / 3600000)\n      : Math.floor(diff / 3600000);\n    const minutes = Math.floor((diff % 3600000) / 60000);\n    const seconds = Math.floor((diff % 60000) / 1000);\n\n    const daysValue = String(days).padStart(2, \"0\");\n    const hoursValue = String(hours).padStart(2, \"0\");\n    const minutesValue = String(minutes).padStart(2, \"0\");\n    const secondsValue = String(seconds).padStart(2, \"0\");\n\n    if (this.daysEl && this.daysEl.textContent !== daysValue)\n      this.daysEl.textContent = daysValue;\n    this.updateDisplay(hoursValue, minutesValue, secondsValue);\n\n    if (diff <= 0 && this.timerId) {\n      clearInterval(this.timerId);\n      this.timerId = null;\n    }\n  }\n\n  updateDisplay(hoursValue, minutesValue, secondsValue) {\n    if (this.hoursEl && this.hoursEl.textContent !== hoursValue)\n      this.hoursEl.textContent = hoursValue;\n    if (this.minutesEl && this.minutesEl.textContent !== minutesValue)\n      this.minutesEl.textContent = minutesValue;\n    if (this.secondsEl && this.secondsEl.textContent !== secondsValue)\n      this.secondsEl.textContent = secondsValue;\n  }\n}\ncustomElements.define(\"countdown-timer\", CountdownTimer);\n\n// Video Autoplay Component\nclass VideoAutoplay extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.playBound === \"true\") return;\n\n    this.playButton = this.querySelector(\"[data-play-button]\");\n    this.video = this.querySelector(\"video\");\n    this.playIcon = this.querySelector(\"[data-icon-play]\");\n    this.pauseIcon = this.querySelector(\"[data-icon-pause]\");\n    this.muteButton = this.querySelector(\"[data-mute-button]\");\n    this.muteIcon = this.querySelector(\"[data-icon-muted]\");\n    this.unmuteIcon = this.querySelector(\"[data-icon-unmuted]\");\n    this.progressBar = null;\n    this.progressFill = null;\n    this._observer = null;\n\n    if (!this.video) return;\n    if (!this.playButton && !this.muteButton) return;\n\n    this.dataset.playBound = \"true\";\n    this.initProgress();\n    this.initViewportObserver();\n    if (this.playButton) {\n      this.playButton.addEventListener(\"click\", () => this.handleToggle());\n    }\n    if (this.muteButton) {\n      this.muteButton.addEventListener(\"click\", () => this.handleMuteToggle());\n    }\n    this.video.addEventListener(\"play\", () => this.updateUi(true));\n    this.video.addEventListener(\"pause\", () => this.updateUi(false));\n    this.video.addEventListener(\"ended\", () => this.updateUi(false));\n    this.video.addEventListener(\"timeupdate\", () => this.updateProgress());\n    this.video.addEventListener(\"durationchange\", () => this.updateProgress());\n    this.video.addEventListener(\"loadedmetadata\", () => this.updateProgress());\n    this.video.addEventListener(\"volumechange\", () => this.updateMuteUi());\n\n    this.updateUi(!this.video.paused);\n  }\n\n  disconnectedCallback() {\n    if (this._observer) {\n      this._observer.disconnect();\n      this._observer = null;\n    }\n  }\n\n  initViewportObserver() {\n    if (!this.video) return;\n    this._observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (!entry.isIntersecting) {\n            this.video.muted = true;\n            this.updateMuteUi();\n          }\n        }\n      },\n      { threshold: 0.25 },\n    );\n    this._observer.observe(this);\n  }\n\n  handleToggle() {\n    if (!this.video) return;\n    if (this.video.paused) {\n      const playPromise = this.video.play();\n      if (playPromise && typeof playPromise.catch === \"function\") {\n        playPromise.catch(() => {});\n      }\n    } else {\n      this.video.pause();\n    }\n  }\n\n  play() {\n    if (!this.video) return;\n    const playPromise = this.video.play();\n    if (playPromise && typeof playPromise.catch === \"function\") {\n      playPromise.catch(() => {});\n    }\n  }\n\n  pause() {\n    if (!this.video) return;\n    this.video.pause();\n  }\n\n  toggleMute(forceState = null) {\n    if (!this.video) return;\n    if (typeof forceState === \"boolean\") {\n      this.video.muted = forceState;\n    } else {\n      this.video.muted = !this.video.muted;\n    }\n    this.updateMuteUi();\n  }\n\n  updateUi(isPlaying) {\n    this.classList.toggle(\"is-playing\", isPlaying);\n    if (this.playButton) {\n      this.playButton.setAttribute(\n        \"aria-label\",\n        isPlaying ? \"Pause video\" : \"Play video\",\n      );\n      this.playButton.setAttribute(\n        \"aria-pressed\",\n        isPlaying ? \"true\" : \"false\",\n      );\n    }\n    if (this.playIcon) {\n      this.playIcon.classList.toggle(\"hidden\", isPlaying);\n    }\n    if (this.pauseIcon) {\n      this.pauseIcon.classList.toggle(\"hidden\", !isPlaying);\n    }\n    if (this.muteButton) {\n      this.muteButton.classList.toggle(\"hidden\", !isPlaying);\n    }\n    if (isPlaying) {\n      this.updateMuteUi();\n    }\n  }\n\n  handleMuteToggle() {\n    if (!this.video) return;\n    this.video.muted = !this.video.muted;\n    this.updateMuteUi();\n  }\n\n  updateMuteUi() {\n    if (!this.video || !this.muteButton) return;\n    const isMuted = this.video.muted;\n    this.muteButton.setAttribute(\"aria-label\", isMuted ? \"Muted\" : \"Unmuted\");\n    this.muteButton.setAttribute(\"aria-pressed\", isMuted ? \"true\" : \"false\");\n    if (this.muteIcon) {\n      this.muteIcon.classList.toggle(\"hidden\", !isMuted);\n    }\n    if (this.unmuteIcon) {\n      this.unmuteIcon.classList.toggle(\"hidden\", isMuted);\n    }\n  }\n\n  initProgress() {\n    if (!this.video) return;\n    const shouldShowProgress = this.dataset.showProgress === \"true\";\n    if (!shouldShowProgress) return;\n    if (this.querySelector(\"[data-video-progress]\")) {\n      this.progressBar = this.querySelector(\"[data-video-progress]\");\n      this.progressFill = this.progressBar.querySelector(\n        \"[data-video-progress-fill]\",\n      );\n      return;\n    }\n    const pos = getComputedStyle(this).position;\n    if (pos === \"static\") this.style.position = \"relative\";\n    const bar = document.createElement(\"div\");\n    bar.setAttribute(\"data-video-progress\", \"\");\n    bar.style.position = \"absolute\";\n    bar.style.left = \"0\";\n    bar.style.right = \"0\";\n    bar.style.bottom = \"0\";\n    const heightValue = Number(this.dataset.progressHeight || 2);\n    const height = Number.isNaN(heightValue) ? 2 : Math.max(heightValue, 1);\n    bar.style.height = `${height}px`;\n    bar.style.color = \"rgba(255, 255, 255, 0.8)\";\n    bar.style.background = \"rgba(255, 255, 255, 0.1)\";\n    bar.style.pointerEvents = \"none\";\n    bar.style.opacity = \"0\";\n\n    const fill = document.createElement(\"div\");\n    fill.setAttribute(\"data-video-progress-fill\", \"\");\n    fill.style.height = \"100%\";\n    fill.style.width = \"0%\";\n    fill.style.background = \"currentColor\";\n    fill.style.transition = \"width 0.1s linear\";\n\n    bar.appendChild(fill);\n    this.appendChild(bar);\n    this.progressBar = bar;\n    this.progressFill = fill;\n  }\n\n  updateProgress() {\n    if (!this.video || !this.progressBar || !this.progressFill) return;\n    const duration = this.video.duration || 0;\n    if (!duration || Number.isNaN(duration)) {\n      this.progressBar.style.opacity = \"0\";\n      this.progressFill.style.width = \"0%\";\n      return;\n    }\n    const current = this.video.currentTime || 0;\n    const percent = Math.min(Math.max(current / duration, 0), 1) * 100;\n    this.progressBar.style.opacity = \"1\";\n    this.progressFill.style.width = `${percent}%`;\n  }\n\n}\ncustomElements.define(\"video-autoplay\", VideoAutoplay);\n\n// Vertical: data-axis=\"vertical\" (direction: up|down)\nclass ScrollSeamless extends HTMLElement {\n  connectedCallback() {\n    if (!document.getElementById(\"scroll-seamless-styles\")) {\n      const style = document.createElement(\"style\");\n      style.id = \"scroll-seamless-styles\";\n      style.textContent = `\n          @keyframes scroll-seamless-marquee-x {\n            0% { transform: translateX(var(--scroll-seamless-start, 0)); }\n            100% {\n              transform: translateX(\n                var(--scroll-seamless-end, calc(var(--scroll-seamless-direction, -1) * var(--scroll-seamless-distance, 50%)))\n              );\n            }\n          }\n          @keyframes scroll-seamless-marquee-y {\n            0% { transform: translateY(var(--scroll-seamless-start, 0)); }\n            100% {\n              transform: translateY(\n                var(--scroll-seamless-end, calc(var(--scroll-seamless-direction, -1) * var(--scroll-seamless-distance, 50%)))\n              );\n            }\n          }\n          .scroll-seamless__track {\n            animation: scroll-seamless-marquee-x var(--scroll-seamless-duration, 30s) linear infinite;\n            will-change: transform;\n          }\n          .scroll-seamless__track.is-vertical {\n            animation-name: scroll-seamless-marquee-y;\n          }\n          .scroll-seamless__track.is-paused {\n            animation-play-state: paused;\n          }\n          .scroll-seamless__mask {\n            -webkit-mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);\n            mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);\n          }\n          .scroll-seamless__mask.is-vertical {\n            -webkit-mask-image: linear-gradient(to bottom, transparent, black 10%, black 90%, transparent);\n            mask-image: linear-gradient(to bottom, transparent, black 10%, black 90%, transparent);\n          }\n          @media (prefers-reduced-motion: reduce) {\n            .scroll-seamless__track {\n              animation: none;\n            }\n          }\n        `;\n      document.head.appendChild(style);\n    }\n\n    const track = this.querySelector(\".scroll-seamless__track\");\n\n    if (!track) {\n      return;\n    }\n\n    const axisValue = (this.dataset.axis || this.dataset.orientation || \"\")\n      .toLowerCase()\n      .trim();\n    const isVertical = axisValue === \"vertical\" || axisValue === \"y\";\n\n    // Keep horizontal marquee behavior consistent regardless of page `dir`.\n    // If a section/snippet needs RTL inside the marquee, set `dir` explicitly on <scroll-seamless>.\n    if (!isVertical && !this.hasAttribute(\"dir\")) {\n      this.setAttribute(\"dir\", \"ltr\");\n    }\n    const directionToken = (this.dataset.direction || \"\").toLowerCase().trim();\n    const directionValue = isVertical\n      ? directionToken === \"down\"\n        ? 1\n        : -1\n      : directionToken === \"right\"\n        ? 1\n        : -1;\n    track.style.setProperty(\"--scroll-seamless-direction\", directionValue);\n    if (directionValue === 1) {\n      track.style.setProperty(\n        \"--scroll-seamless-start\",\n        \"calc(-1 * var(--scroll-seamless-distance, 50%))\",\n      );\n      track.style.setProperty(\"--scroll-seamless-end\", \"0px\");\n    } else {\n      track.style.setProperty(\"--scroll-seamless-start\", \"0px\");\n      track.style.setProperty(\n        \"--scroll-seamless-end\",\n        \"calc(var(--scroll-seamless-direction, -1) * var(--scroll-seamless-distance, 50%))\",\n      );\n    }\n    track.classList.toggle(\"is-vertical\", isVertical);\n    const mask = this.querySelector(\".scroll-seamless__mask\");\n    if (mask) {\n      mask.classList.toggle(\"is-vertical\", isVertical);\n    }\n\n    const ensureClones = () => {\n      // Measure original items width (excluding clones) without removing them first.\n      const originals = Array.from(\n        track.querySelectorAll(\n          ':scope > :not([data-scroll-seamless-clone=\"true\"])',\n        ),\n      );\n      if (!originals.length) return;\n\n      let baseLength = 0;\n      originals.forEach((item) => {\n        const rect = item.getBoundingClientRect();\n        baseLength += isVertical ? rect.height : rect.width;\n      });\n      // Account for gap between original items.\n      const trackStyle = getComputedStyle(track);\n      const gap =\n        parseFloat(isVertical ? trackStyle.rowGap : trackStyle.columnGap) || 0;\n      if (originals.length > 1) baseLength += gap * (originals.length - 1);\n\n      if (baseLength <= 0) return;\n\n      const viewportLength = track.parentElement\n        ? isVertical\n          ? track.parentElement.offsetHeight\n          : track.parentElement.offsetWidth\n        : baseLength;\n      const copies = Math.max(\n        2,\n        Math.ceil((viewportLength + baseLength) / baseLength),\n      );\n\n      // Skip rebuild if clone count and base length haven't changed significantly.\n      const prevCopies = Number.parseInt(\n        track.dataset.scrollSeamlessCopies || \"0\",\n        10,\n      );\n      const prevBase = Number.parseFloat(\n        track.dataset.scrollSeamlessBaseLength || \"0\",\n      );\n      if (prevCopies === copies && Math.abs(prevBase - baseLength) < 1) return;\n\n      const existingClones = track.querySelectorAll(\n        '[data-scroll-seamless-clone=\"true\"]',\n      );\n      existingClones.forEach((clone) => clone.remove());\n\n      const fragment = document.createDocumentFragment();\n      for (let i = 1; i < copies; i += 1) {\n        originals.forEach((item) => {\n          const clone = item.cloneNode(true);\n          clone.dataset.scrollSeamlessClone = \"true\";\n          clone.setAttribute(\"aria-hidden\", \"true\");\n          fragment.appendChild(clone);\n        });\n      }\n\n      track.appendChild(fragment);\n\n      // Eagerly load all lazy images in the track \u2013 seamless scrolling\n      // makes every image visible regardless of viewport position.\n      track\n        .querySelectorAll(\"img.image-lazy-loading[data-srcset]\")\n        .forEach((img) => {\n          img.srcset = img.dataset.srcset;\n          img.removeAttribute(\"data-srcset\");\n          img.src = \"\";\n          img.classList.remove(\"image-lazy-placeholder\", \"image-lazy-loading\");\n        });\n\n      track.dataset.scrollSeamlessCopies = String(copies);\n      track.dataset.scrollSeamlessBaseLength = String(baseLength);\n    };\n\n    const updateDuration = () => {\n      ensureClones();\n\n      const copies = Math.max(\n        Number.parseInt(track.dataset.scrollSeamlessCopies || \"2\", 10),\n        1,\n      );\n      const measuredLength = isVertical\n        ? track.getBoundingClientRect().height || track.scrollHeight\n        : track.getBoundingClientRect().width || track.scrollWidth;\n      const storedLength = Number.parseFloat(\n        track.dataset.scrollSeamlessBaseLength || \"\",\n      );\n      const baseDistance = Math.max(\n        Number.isFinite(storedLength) && storedLength > 0\n          ? storedLength\n          : measuredLength / copies,\n        1,\n      );\n      track.style.setProperty(\n        \"--scroll-seamless-distance\",\n        `${baseDistance}px`,\n      );\n\n      const speed = Number.parseFloat(\n        this.dataset.speed ||\n          track.dataset.speed ||\n          track.dataset.marqueeSpeed ||\n          \"\",\n      );\n      if (!Number.isFinite(speed) || speed <= 0) {\n        return;\n      }\n\n      const duration = baseDistance / speed;\n      track.style.setProperty(\"--scroll-seamless-duration\", `${duration}s`);\n    };\n\n    updateDuration();\n    this.updateDuration = updateDuration;\n    this.ensureClones = ensureClones;\n    window.addEventListener(\"resize\", updateDuration);\n\n    if (window.ResizeObserver) {\n      let resizeRaf = null;\n      const debouncedUpdate = () => {\n        if (resizeRaf) return;\n        resizeRaf = requestAnimationFrame(() => {\n          resizeRaf = null;\n          updateDuration();\n        });\n      };\n      this.resizeObserver = new ResizeObserver(debouncedUpdate);\n      this.resizeObserver.observe(track);\n    }\n\n    if (this.dataset.pauseOnHover === \"true\") {\n      const pause = () => track.classList.add(\"is-paused\");\n      const resume = () => track.classList.remove(\"is-paused\");\n\n      track.addEventListener(\"mouseenter\", pause);\n      track.addEventListener(\"mouseleave\", resume);\n      track.addEventListener(\"focusin\", pause);\n      track.addEventListener(\"focusout\", resume);\n      track.addEventListener(\"touchstart\", pause, { passive: true });\n      track.addEventListener(\"touchend\", resume);\n    }\n  }\n\n  disconnectedCallback() {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n    }\n\n    if (this.updateDuration) {\n      window.removeEventListener(\"resize\", this.updateDuration);\n    }\n  }\n}\ncustomElements.define(\"scroll-seamless\", ScrollSeamless);\n\n// Country Province Component\nclass CountryProvince extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  connectedCallback() {\n    this.countrySelector = this.querySelector(\"[data-country-selector]\");\n    this.provinceSelector = this.querySelector(\"[data-province-selector]\");\n    if (!this.countrySelector || !this.provinceSelector) return;\n\n    this.initCountry();\n    this.initProvince();\n\n    this.countrySelector.addEventListener(\n      \"change\",\n      this.onCountryChange.bind(this),\n    );\n  }\n\n  initCountry() {\n    const value = this.countrySelector.getAttribute(\"data-default\");\n    if (value != null) {\n      this.selectByValue(this.countrySelector, value);\n      this.onCountryChange();\n    }\n  }\n\n  initProvince() {\n    const value = this.provinceSelector.getAttribute(\"data-default\");\n    if (value != null) this.selectByValue(this.provinceSelector, value);\n  }\n\n  onCountryChange() {\n    const opt =\n      this.countrySelector.options[this.countrySelector.selectedIndex];\n    const raw = opt.getAttribute(\"data-provinces\");\n    if (!raw) return;\n\n    const provinces = JSON.parse(raw);\n    this.clearOptions(this.provinceSelector);\n\n    if (Array.isArray(provinces) && provinces.length > 0) {\n      this.setOptions(this.provinceSelector, provinces);\n      this.showProvince();\n    } else {\n      this.hideProvince();\n    }\n  }\n\n  showProvince() {\n    const wrapper = this.getProvinceWrapper();\n    if (wrapper) wrapper.classList.remove(\"hidden\");\n  }\n\n  hideProvince() {\n    const wrapper = this.getProvinceWrapper();\n    if (wrapper) wrapper.classList.add(\"hidden\");\n  }\n\n  getProvinceWrapper() {\n    return (\n      this.provinceSelector.closest(\"[data-province-wrapper]\") ||\n      this.provinceSelector.closest(\".cart-drawer-toolbar__select-wrap\") ||\n      this.provinceSelector.closest(\".cart-page__shipping-select-wrap\")\n    );\n  }\n\n  selectByValue(selector, value) {\n    for (let i = 0, count = selector.options.length; i < count; i++) {\n      const option = selector.options[i];\n      if (value === option.value || value === option.innerHTML) {\n        selector.selectedIndex = i;\n        break;\n      }\n    }\n  }\n\n  setOptions(selector, values) {\n    if (values && Array.isArray(values) && values.length > 0) {\n      const fragment = document.createDocumentFragment();\n      values.forEach((value) => {\n        const opt = document.createElement(\"option\");\n        opt.value = value[0];\n        opt.innerHTML = value[1];\n        fragment.appendChild(opt);\n      });\n\n      selector.appendChild(fragment);\n    }\n  }\n\n  clearOptions(selector) {\n    selector.innerHTML = \"\";\n  }\n}\ncustomElements.define(\"country-province\", CountryProvince);\n\n// \u2500\u2500 Feature Components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Predictive Search Component\n// Handles live search suggestions as the user types\nclass PredictiveSearch extends HTMLElement {\n  static instances = new Set();\n\n  constructor() {\n    super();\n    this.searchTerm = \"\";\n    this.abortController = null;\n    this.cachedResults = {};\n    this.debounceTimer = null;\n    this.resultsWrapper = null;\n    this.emptyWrapper = null;\n    this.input = null;\n  }\n\n  connectedCallback() {\n    this.cacheElements();\n    this.bindEvents();\n    PredictiveSearch.instances.add(this);\n  }\n\n  disconnectedCallback() {\n    this.unbindEvents();\n    PredictiveSearch.instances.delete(this);\n  }\n\n  // Cache element references\n  cacheElements() {\n    this.resultsWrapper = this.querySelector(\"[data-search-results]\");\n    this.emptyWrapper = this.querySelector(\"[data-search-empty]\");\n    this.input = this.querySelector(\"[data-search-input]\");\n    this.clearButton = this.querySelector(\"[data-search-clear]\");\n    this.predictiveEnabled = this.dataset.predictiveEnabled === \"true\";\n  }\n\n  // Bind events\n  bindEvents() {\n    if (!this.input) return;\n    this.onInput = this.handleInput.bind(this); // Bind input handler\n    this.input.addEventListener(\"input\", this.onInput);\n    this.onTrendingClick = this.handleTrendingClick.bind(this);\n    this.addEventListener(\"click\", this.onTrendingClick);\n    if (this.clearButton) {\n      this.onClearClick = this.handleClearClick.bind(this);\n      this.clearButton.addEventListener(\"click\", this.onClearClick);\n    }\n  }\n\n  // Unbind events\n  unbindEvents() {\n    if (this.input && this.onInput) {\n      this.input.removeEventListener(\"input\", this.onInput);\n    }\n    if (this.onTrendingClick) {\n      this.removeEventListener(\"click\", this.onTrendingClick);\n    }\n    if (this.clearButton && this.onClearClick) {\n      this.clearButton.removeEventListener(\"click\", this.onClearClick);\n    }\n  }\n\n  // Handle trending search click\n  handleTrendingClick(event) {\n    const button = event.target.closest(\"[data-search-trending]\");\n    if (!button) return;\n    const term = button.dataset.searchTrending || \"\";\n    if (!term) return;\n    if (this.input) {\n      this.input.value = term;\n      this.input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n      this.input.focus();\n    }\n  }\n\n  // Handle input event\n  handleInput(event) {\n    const value = event.target.value.trim();\n    this.toggleClearButton(Boolean(value));\n    if (!this.predictiveEnabled) return; // Skip if predictive search is disabled\n    if (this.debounceTimer) {\n      clearTimeout(this.debounceTimer);\n    }\n    this.debounceTimer = setTimeout(() => {\n      this.searchTerm = value;\n      if (!this.searchTerm) {\n        this.clearResults();\n        return;\n      }\n      this.getSearchResults();\n    }, 200);\n  }\n\n  // Clear search results\n  clearResults() {\n    if (this.resultsWrapper) {\n      this.resultsWrapper.classList.add(\"hidden\");\n      this.resultsWrapper.innerHTML = \"\";\n    }\n    if (this.emptyWrapper) {\n      this.emptyWrapper.classList.remove(\"hidden\");\n    }\n    this.toggleClearButton(Boolean(this.input && this.input.value.trim()));\n    this.removeAttribute(\"loading\");\n    this.removeAttribute(\"results\");\n  }\n\n  toggleClearButton(show) {\n    if (!this.clearButton) return;\n    this.clearButton.classList.toggle(\"opacity-0\", !show);\n    this.clearButton.classList.toggle(\"pointer-events-none\", !show);\n    this.clearButton.tabIndex = show ? 0 : -1;\n  }\n\n  handleClearClick() {\n    if (!this.input) return;\n    this.input.value = \"\";\n    this.input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n    this.toggleClearButton(false);\n    this.clearResults();\n    this.input.focus();\n  }\n\n  setLiveRegionLoading() {\n    this.setAttribute(\"loading\", \"\");\n  }\n\n  // Render search results\n  renderSearchResults(markup) {\n    if (this.resultsWrapper) {\n      this.resultsWrapper.innerHTML = markup;\n      this.resultsWrapper.classList.remove(\"hidden\");\n      if (window.webvista?.initLazyImageAnimation) {\n        window.webvista.initLazyImageAnimation(this.resultsWrapper);\n      }\n    }\n    if (this.emptyWrapper) {\n      this.emptyWrapper.classList.add(\"hidden\");\n    }\n    this.removeAttribute(\"loading\");\n    this.setAttribute(\"results\", \"\");\n  }\n\n  // Fetch search results\n  getSearchResults() {\n    if (!this.predictiveEnabled) {\n      this.clearResults();\n      return;\n    }\n    const predictiveUrl =\n      this.dataset.predictiveUrl || window.routes?.predictive_search_url;\n    if (!predictiveUrl) {\n      this.clearResults();\n      return;\n    }\n\n    const queryKey = this.searchTerm.replace(/\\s+/g, \"-\").toLowerCase();\n    this.setLiveRegionLoading();\n\n    if (this.cachedResults[queryKey]) {\n      this.renderSearchResults(this.cachedResults[queryKey]);\n      return;\n    }\n\n    if (this.abortController) {\n      this.abortController.abort();\n    }\n    this.abortController = new AbortController();\n\n    const url = new URL(predictiveUrl, window.location.origin);\n\n    url.search = new URLSearchParams({\n      q: this.searchTerm,\n      \"resources[limit]\": 10,\n      \"resources[limit_scope]\": \"each\",\n      \"resources[options][fields]\":\n        \"title,product_type,variants.title,vendor,variants.sku\",\n      section_id: this.dataset.sectionId || \"predictive-search\",\n    });\n\n    fetch(url.toString(), {\n      signal: this.abortController.signal,\n    })\n      .then((response) => {\n        if (!response.ok) {\n          throw new Error(response.status);\n        }\n        return response.text();\n      })\n      .then((text) => {\n        const resultsMarkup = new DOMParser()\n          .parseFromString(text, \"text/html\")\n          .querySelector(\".shopify-section\").innerHTML;\n\n        PredictiveSearch.instances.forEach((instance) => {\n          instance.cachedResults[queryKey] = resultsMarkup;\n        });\n\n        this.renderSearchResults(resultsMarkup);\n      })\n      .catch((error) => {\n        if (error?.code === 20 || error?.name === \"AbortError\") {\n          return;\n        }\n        this.clearResults();\n      });\n  }\n}\ncustomElements.define(\"predictive-search\", PredictiveSearch);\n\n// Quick View Modal Component\n// Lightweight modal shell \u2014 product interactions handled by product.js components\nclass QuickViewModal extends HTMLElement {\n  constructor() {\n    super();\n    this.content = null;\n    this.overlay = null;\n    this.isOpen = false;\n    this.opener = null;\n    this.productUrl = \"\";\n    this.fetchAbort = null;\n    this.isLoading = false;\n    this.loadingTrigger = null;\n    this.hideTimer = null;\n    this._focusTrap = null;\n    this.onDocumentClick = this.onDocumentClick.bind(this);\n  }\n\n  connectedCallback() {\n    this.cacheElements();\n    document.addEventListener(\"click\", this.onDocumentClick);\n    if (Shopify.designMode) {\n      this.onEditorSelect = this.onEditorSelect.bind(this);\n      this.onEditorDeselect = this.onEditorDeselect.bind(this);\n      document.addEventListener(\"shopify:section:select\", this.onEditorSelect);\n      document.addEventListener(\"shopify:section:deselect\", this.onEditorDeselect);\n    }\n  }\n\n  disconnectedCallback() {\n    document.removeEventListener(\"click\", this.onDocumentClick);\n    if (Shopify.designMode) {\n      document.removeEventListener(\"shopify:section:select\", this.onEditorSelect);\n      document.removeEventListener(\"shopify:section:deselect\", this.onEditorDeselect);\n    }\n    if (this.fetchAbort) {\n      this.fetchAbort.abort();\n      this.fetchAbort = null;\n    }\n  }\n\n  cacheElements() {\n    this.content = this.querySelector(\"[data-quick-view-content]\");\n    this.overlay = this.querySelector(\"[data-quick-view-overlay]\");\n  }\n\n  onDocumentClick(event) {\n    const trigger = event.target.closest(\"[data-quick-view-trigger]\");\n    if (trigger) {\n      event.preventDefault();\n      this.open(trigger);\n      return;\n    }\n    const close = event.target.closest(\"[data-quick-view-close]\");\n    if (close && this.contains(close)) {\n      event.preventDefault();\n      this.hide();\n    }\n  }\n\n  async open(trigger) {\n    const handle = trigger.dataset.productHandle;\n    if (!handle) return;\n    if (this.isLoading && this.loadingTrigger === trigger) return;\n    if (this.loadingTrigger && this.loadingTrigger !== trigger) {\n      this.setTriggerLoading(this.loadingTrigger, false);\n    }\n    const returnFocusId = trigger.dataset.returnFocusId;\n    const returnFocusTarget = returnFocusId\n      ? document.getElementById(returnFocusId)\n      : null;\n    this.opener = returnFocusTarget || trigger;\n    this.productUrl = trigger.dataset.productUrl || \"\";\n    this.loadingTrigger = trigger;\n    this.setTriggerLoading(trigger, true);\n    const loaded = await this.loadProduct(handle);\n    this.setTriggerLoading(trigger, false);\n    this.loadingTrigger = null;\n    if (loaded) {\n      this.addToHistory(trigger);\n      this.show();\n    }\n  }\n\n  addToHistory(trigger) {\n    const productId = trigger.dataset.productId;\n    if (!productId) return;\n    window.webvista?.addProductToHistory(productId);\n  }\n\n  show() {\n    if (this.isOpen) return;\n    this.isOpen = true;\n    if (this.hideTimer) {\n      clearTimeout(this.hideTimer);\n      this.hideTimer = null;\n    }\n    this.classList.remove(\"hidden\");\n    this.classList.add(\"flex\");\n    this.setAttribute(\"aria-hidden\", \"false\");\n    this._savedScrollY = window.scrollY;\n    document.body.style.position = \"fixed\";\n    document.body.style.top = `-${this._savedScrollY}px`;\n    document.body.style.left = \"0\";\n    document.body.style.right = \"0\";\n    document.documentElement.classList.add(\"overflow-hidden\");\n    if (this.overlay) {\n      this.overlay.classList.add(\"opacity-100\");\n      this.overlay.classList.remove(\"opacity-0\");\n    }\n    if (!this._focusTrap) {\n      this._focusTrap = webvista.createFocusTrap(this, {\n        onEscape: this.hide.bind(this),\n      });\n    }\n    this.addEventListener(\"keydown\", this._focusTrap);\n    webvista.focusFirstElement(this);\n  }\n\n  hide() {\n    if (!this.isOpen) return;\n    this.isOpen = false;\n    this.setAttribute(\"aria-hidden\", \"true\");\n    document.documentElement.classList.remove(\"overflow-hidden\");\n    document.body.style.position = \"\";\n    document.body.style.top = \"\";\n    document.body.style.left = \"\";\n    document.body.style.right = \"\";\n    if (typeof this._savedScrollY === \"number\") {\n      window.scrollTo(0, this._savedScrollY);\n      this._savedScrollY = null;\n    }\n    if (this.overlay) {\n      this.overlay.classList.remove(\"opacity-100\");\n      this.overlay.classList.add(\"opacity-0\");\n    }\n    if (this.hideTimer) {\n      clearTimeout(this.hideTimer);\n      this.hideTimer = null;\n    }\n    this.classList.add(\"hidden\");\n    this.classList.remove(\"flex\");\n    if (this._focusTrap) {\n      this.removeEventListener(\"keydown\", this._focusTrap);\n    }\n    if (this.opener && typeof this.opener.focus === \"function\") {\n      this.opener.focus();\n    }\n  }\n\n  async loadProduct(handle) {\n    this.isLoading = true;\n    this.setLoadingState(true);\n    if (this.fetchAbort) this.fetchAbort.abort();\n    const controller = new AbortController();\n    this.fetchAbort = controller;\n    try {\n      const url = this.buildQuickViewUrl(handle);\n      const response = await fetch(url, { signal: controller.signal });\n      if (!response.ok) {\n        throw new Error(\"Quick view request failed.\");\n      }\n      const html = await response.text();\n      const parsed = new DOMParser().parseFromString(html, \"text/html\");\n      const content = parsed.querySelector(\"[data-quick-view-content]\");\n      if (!content) {\n        throw new Error(\"Quick view content missing.\");\n      }\n      const nextContent = content.cloneNode(true);\n      if (this.content) {\n        this.content.replaceWith(nextContent);\n      } else {\n        this.appendChild(nextContent);\n      }\n      this.content = nextContent;\n      this.content.querySelectorAll(\"script\").forEach((old) => {\n        const fresh = document.createElement(\"script\");\n        for (const attr of old.attributes) fresh.setAttribute(attr.name, attr.value);\n        if (old.textContent) fresh.textContent = old.textContent;\n        old.replaceWith(fresh);\n      });\n      this.configureVariantPickerUrl();\n      if (window.webvista?.initLazyImageAnimation) {\n        window.webvista.initLazyImageAnimation(this.content);\n      }\n      return true;\n    } catch (error) {\n      if (error.name === \"AbortError\") return;\n      this.setErrorState();\n      return false;\n    } finally {\n      this.setLoadingState(false);\n      this.isLoading = false;\n    }\n  }\n\n  buildQuickViewUrl(handle) {\n    const base = this.productUrl || `/products/${handle}`;\n    const url = new URL(base, window.location.origin);\n    url.searchParams.set(\"view\", \"quick-view-partial\");\n    return url.toString();\n  }\n\n  configureVariantPickerUrl() {\n    const variantSelects = this.querySelector(\"high-variant-selects\");\n    if (!variantSelects || !this.productUrl) return;\n    const url = new URL(this.productUrl, window.location.origin);\n    url.searchParams.set(\"view\", \"quick-view-partial\");\n    variantSelects.dataset.url = url.toString();\n    variantSelects.dataset.updateUrl = \"false\";\n  }\n\n  setLoadingState(isLoading) {\n    if (!isLoading) return;\n    if (this.content) {\n      this.content.innerHTML =\n        '<div class=\"w-full p-10 text-center text-sm text-gray-400\">Loading...</div>';\n    }\n  }\n\n  setTriggerLoading(trigger, isLoading) {\n    if (!trigger) return;\n    trigger.dataset.quickViewLoading = isLoading ? \"true\" : \"false\";\n    trigger.setAttribute(\"aria-busy\", isLoading ? \"true\" : \"false\");\n    trigger.disabled = isLoading;\n    trigger.classList.toggle(\"opacity-60\", isLoading);\n    trigger.classList.toggle(\"cursor-wait\", isLoading);\n    const label = trigger.querySelector(\"[data-quick-view-label]\");\n    const icon = trigger.querySelector(\"[data-quick-view-icon]\");\n    const spinner = trigger.querySelector(\"[data-quick-view-spinner]\");\n    if (label) {\n      label.classList.toggle(\"hidden\", isLoading);\n    }\n    if (spinner) {\n      spinner.classList.toggle(\"hidden\", !isLoading);\n    }\n    if (icon) {\n      icon.classList.toggle(\"hidden\", isLoading);\n    }\n  }\n\n  openEditorPreview() {\n    const handle = this.dataset.editorPreviewHandle;\n    if (!handle) return;\n    const fakeOpener = document.createElement(\"button\");\n    fakeOpener.dataset.productHandle = handle;\n    fakeOpener.dataset.productUrl = this.dataset.editorPreviewUrl || \"\";\n    this.open(fakeOpener);\n  }\n\n  onEditorSelect(event) {\n    if (!event.detail?.sectionId) return;\n    const sectionEl = document.getElementById(`shopify-section-${event.detail.sectionId}`);\n    if (!sectionEl) return;\n    if (!sectionEl.contains(this) && !this.closest(`#shopify-section-${event.detail.sectionId}`)) return;\n    this.openEditorPreview();\n  }\n\n  onEditorDeselect(event) {\n    if (!event.detail?.sectionId) return;\n    const sectionEl = document.getElementById(`shopify-section-${event.detail.sectionId}`);\n    if (!sectionEl) return;\n    if (!sectionEl.contains(this) && !this.closest(`#shopify-section-${event.detail.sectionId}`)) return;\n    if (this.isOpen) this.hide();\n  }\n\n  setErrorState() {\n    if (this.content) {\n      this.content.innerHTML =\n        '<div class=\"w-full p-10 text-center text-sm text-gray-400\">Unable to load. Please try again.</div>';\n    }\n  }\n}\ncustomElements.define(\"quick-view-modal\", QuickViewModal);\n\n// Product Card Component\nclass ProductCard extends HTMLElement {\n  constructor() {\n    super();\n    this.image = null;\n    this.swatches = null;\n    this.onMouseOver = this.onMouseOver.bind(this);\n    this.onFocusIn = this.onFocusIn.bind(this);\n    this.onMouseLeave = this.onMouseLeave.bind(this);\n    this.onFocusOut = this.onFocusOut.bind(this);\n  }\n\n  connectedCallback() {\n    const imageHost = this.querySelector(\"[data-product-card-image]\");\n    this.image =\n      imageHost?.tagName === \"IMG\"\n        ? imageHost\n        : imageHost?.querySelector(\"img\");\n    this.swatches = this.querySelector(\"[data-product-card-swatches]\");\n    if (!this.image || !this.swatches) return;\n    if (this.swatches.dataset.previewInit === \"true\") return;\n    this.swatches.dataset.previewInit = \"true\";\n\n    this.swatches.addEventListener(\"mouseover\", this.onMouseOver);\n    this.swatches.addEventListener(\"focusin\", this.onFocusIn);\n    this.swatches.addEventListener(\"mouseleave\", this.onMouseLeave);\n    this.swatches.addEventListener(\"focusout\", this.onFocusOut);\n  }\n\n  disconnectedCallback() {\n    if (!this.swatches) return;\n    this.swatches.removeEventListener(\"mouseover\", this.onMouseOver);\n    this.swatches.removeEventListener(\"focusin\", this.onFocusIn);\n    this.swatches.removeEventListener(\"mouseleave\", this.onMouseLeave);\n    this.swatches.removeEventListener(\"focusout\", this.onFocusOut);\n  }\n\n  storeOriginal() {\n    if (!this.image) return;\n    if (!this.image.dataset.originalSrc) {\n      this.image.dataset.originalSrc = this.image.getAttribute(\"src\") || \"\";\n    }\n    if (!this.image.dataset.originalSrcset) {\n      this.image.dataset.originalSrcset =\n        this.image.getAttribute(\"srcset\") || \"\";\n    }\n    if (!this.image.dataset.originalDataSrcset) {\n      this.image.dataset.originalDataSrcset =\n        this.image.getAttribute(\"data-srcset\") || \"\";\n    }\n  }\n\n  applyVariant(url) {\n    if (!this.image || !url) return;\n    this.storeOriginal();\n    this.image.setAttribute(\"src\", url);\n    this.image.removeAttribute(\"data-srcset\");\n    this.image.removeAttribute(\"srcset\");\n  }\n\n  restoreOriginal() {\n    if (!this.image || !this.image.dataset.originalSrc) return;\n    this.image.setAttribute(\"src\", this.image.dataset.originalSrc);\n    if (this.image.dataset.originalSrcset) {\n      this.image.setAttribute(\"srcset\", this.image.dataset.originalSrcset);\n    }\n    if (this.image.dataset.originalDataSrcset) {\n      this.image.setAttribute(\n        \"data-srcset\",\n        this.image.dataset.originalDataSrcset,\n      );\n    }\n  }\n\n  setActiveSwatch(active) {\n    if (!this.swatches) return;\n    const items = Array.from(\n      this.swatches.querySelectorAll(\"[data-product-card-swatch]\"),\n    );\n    items.forEach((item) => {\n      const isActive = item === active;\n      item.classList.toggle(\"ring-2\", isActive);\n      item.classList.toggle(\"ring-offset-2\", isActive);\n      item.classList.toggle(\n        \"ring-[color:rgba(var(--color-foreground),0.4)]\",\n        isActive,\n      );\n      item.classList.toggle(\n        \"ring-offset-[color:rgb(var(--color-background))]\",\n        isActive,\n      );\n    });\n  }\n\n  onMouseOver(event) {\n    const swatch = event.target.closest(\"[data-product-card-swatch]\");\n    if (!swatch || !this.swatches?.contains(swatch)) return;\n    const url = swatch.dataset.variantImage || \"\";\n    this.setActiveSwatch(swatch);\n    this.applyVariant(url);\n  }\n\n  onFocusIn(event) {\n    const swatch = event.target.closest(\"[data-product-card-swatch]\");\n    if (!swatch || !this.swatches?.contains(swatch)) return;\n    const url = swatch.dataset.variantImage || \"\";\n    this.setActiveSwatch(swatch);\n    this.applyVariant(url);\n  }\n\n  onMouseLeave() {\n    this.setActiveSwatch(null);\n    this.restoreOriginal();\n  }\n\n  onFocusOut(event) {\n    if (this.swatches?.contains(event.relatedTarget)) return;\n    this.setActiveSwatch(null);\n    this.restoreOriginal();\n  }\n}\ncustomElements.define(\"product-card\", ProductCard);\n\n// Price Countdown Component\nclass PriceCountdown extends HTMLElement {\n  constructor() {\n    super();\n    this.hoursNode = null;\n    this.minutesNode = null;\n    this.secondsNode = null;\n    this.trigger = null;\n    this.tooltip = null;\n    this.endTime = null;\n    this.timer = null;\n    this.isTooltipOpen = false;\n    this.isTouch = false;\n    this.isHover = false;\n    this.hoverCloseTimer = null;\n    this.onTriggerClick = this.onTriggerClick.bind(this);\n    this.onDocumentClick = this.onDocumentClick.bind(this);\n    this.update = this.update.bind(this);\n    this.positionTooltip = this.positionTooltip.bind(this);\n    this.onTooltipTransitionEnd = this.onTooltipTransitionEnd.bind(this);\n    this.onMouseEnter = this.onMouseEnter.bind(this);\n    this.onMouseLeave = this.onMouseLeave.bind(this);\n  }\n\n  connectedCallback() {\n    this.hoursNode = this.querySelector(\"[data-countdown-hours]\");\n    this.minutesNode = this.querySelector(\"[data-countdown-minutes]\");\n    this.secondsNode = this.querySelector(\"[data-countdown-seconds]\");\n    this.trigger = this.querySelector(\"[data-countdown-trigger]\");\n    this.tooltip = this.querySelector(\"[data-countdown-tooltip]\");\n    const end = this.dataset.countdownEnd;\n    if (!end || !this.hoursNode || !this.minutesNode || !this.secondsNode) {\n      return;\n    }\n\n    const parsed = new Date(end);\n    if (Number.isNaN(parsed.getTime())) {\n      return;\n    }\n    this.endTime = parsed.getTime();\n\n    this.isTouch = window.matchMedia(\"(hover: none)\").matches;\n    this.isHover = window.matchMedia(\"(hover: hover)\").matches;\n    if (this.isTouch && this.trigger && this.tooltip) {\n      this.trigger.addEventListener(\"click\", this.onTriggerClick);\n      document.addEventListener(\"click\", this.onDocumentClick);\n      this.tooltip.addEventListener(\n        \"transitionend\",\n        this.onTooltipTransitionEnd,\n      );\n    }\n    if (this.isHover && this.tooltip) {\n      this.addEventListener(\"mouseenter\", this.onMouseEnter);\n      this.addEventListener(\"mouseleave\", this.onMouseLeave);\n      this.tooltip.addEventListener(\n        \"transitionend\",\n        this.onTooltipTransitionEnd,\n      );\n    }\n\n    this.update();\n    this.timer = window.setInterval(this.update, 1000);\n  }\n\n  disconnectedCallback() {\n    if (this.timer) {\n      window.clearInterval(this.timer);\n      this.timer = null;\n    }\n    if (this.isTouch && this.trigger) {\n      this.trigger.removeEventListener(\"click\", this.onTriggerClick);\n      document.removeEventListener(\"click\", this.onDocumentClick);\n      if (this.tooltip) {\n        this.tooltip.removeEventListener(\n          \"transitionend\",\n          this.onTooltipTransitionEnd,\n        );\n      }\n    }\n    if (this.isHover) {\n      this.removeEventListener(\"mouseenter\", this.onMouseEnter);\n      this.removeEventListener(\"mouseleave\", this.onMouseLeave);\n      if (this.tooltip) {\n        this.tooltip.removeEventListener(\n          \"transitionend\",\n          this.onTooltipTransitionEnd,\n        );\n      }\n    }\n    if (this.hoverCloseTimer) {\n      window.clearTimeout(this.hoverCloseTimer);\n      this.hoverCloseTimer = null;\n    }\n  }\n\n  onTriggerClick(event) {\n    event.stopPropagation();\n    this.setTooltipOpen(!this.isTooltipOpen);\n  }\n\n  onDocumentClick(event) {\n    if (!this.isTooltipOpen) return;\n    if (this.contains(event.target)) return;\n    this.setTooltipOpen(false);\n  }\n\n  onMouseEnter() {\n    if (this.hoverCloseTimer) {\n      window.clearTimeout(this.hoverCloseTimer);\n      this.hoverCloseTimer = null;\n    }\n    this.setTooltipOpen(true);\n  }\n\n  onMouseLeave() {\n    if (this.hoverCloseTimer) {\n      window.clearTimeout(this.hoverCloseTimer);\n    }\n    this.hoverCloseTimer = window.setTimeout(() => {\n      this.setTooltipOpen(false);\n      this.hoverCloseTimer = null;\n    }, 300);\n  }\n\n  setTooltipOpen(isOpen) {\n    if (!this.tooltip) return;\n    this.isTooltipOpen = isOpen;\n    if (isOpen) {\n      this.tooltip.classList.remove(\"hidden\");\n    }\n    this.tooltip.classList.toggle(\"opacity-100\", isOpen);\n    this.tooltip.classList.toggle(\"delay-0\", isOpen);\n    this.tooltip.classList.toggle(\"opacity-0\", !isOpen);\n    this.tooltip.classList.toggle(\"delay-300\", !isOpen);\n    if (isOpen) {\n      this.positionTooltip();\n    }\n  }\n\n  positionTooltip() {\n    if (!this.tooltip) return;\n    const padding = 12;\n    const viewportWidth = document.documentElement.clientWidth;\n    const hostRect = this.getBoundingClientRect();\n    const tooltipRect = this.tooltip.getBoundingClientRect();\n    const tooltipHalf = tooltipRect.width / 2;\n    let minCenter = padding + tooltipHalf;\n    let maxCenter = viewportWidth - padding - tooltipHalf;\n    if (minCenter > maxCenter) {\n      minCenter = viewportWidth / 2;\n      maxCenter = viewportWidth / 2;\n    }\n    const idealCenter = hostRect.left + hostRect.width / 2;\n    const clampedCenter = Math.min(Math.max(idealCenter, minCenter), maxCenter);\n    const leftWithinHost = clampedCenter - hostRect.left;\n    this.tooltip.style.left = `${leftWithinHost}px`;\n    this.tooltip.style.transform = \"translateX(-50%)\";\n    this.tooltip.style.maxWidth = `${Math.max(0, viewportWidth - padding * 2)}px`;\n  }\n\n  onTooltipTransitionEnd(event) {\n    if (!this.tooltip) return;\n    if (event.propertyName !== \"opacity\") return;\n    if (this.isTooltipOpen) return;\n    this.tooltip.classList.add(\"hidden\");\n    this.tooltip.style.left = \"\";\n    this.tooltip.style.transform = \"\";\n    this.tooltip.style.maxWidth = \"\";\n  }\n\n  update() {\n    if (!this.endTime) return;\n    const now = Date.now();\n    const diff = Math.max(0, this.endTime - now);\n    const totalSeconds = Math.floor(diff / 1000);\n    const hours = Math.floor(totalSeconds / 3600);\n    const minutes = Math.floor((totalSeconds % 3600) / 60);\n    const seconds = totalSeconds % 60;\n\n    this.hoursNode.textContent = String(hours).padStart(2, \"0\");\n    this.minutesNode.textContent = String(minutes).padStart(2, \"0\");\n    this.secondsNode.textContent = String(seconds).padStart(2, \"0\");\n  }\n}\ncustomElements.define(\"price-countdown\", PriceCountdown);\n\n// Typing Placeholder Component\n// Animates input placeholder text with a typing/deleting loop through multiple phrases\n// Focus: stops animation, clears placeholder, shows native caret\n// Blur: resumes animation if input is empty\nclass TypingPlaceholder extends HTMLElement {\n  connectedCallback() {\n    this.input = this.querySelector(\"[data-typing-input]\");\n    if (!this.input) return;\n\n    this.phrases = (this.dataset.phrases || \"\")\n      .split(\",\")\n      .map((s) => s.trim())\n      .filter(Boolean);\n    if (this.phrases.length < 2) return;\n\n    this.typeSpeed = parseInt(this.dataset.typeSpeed) || 80;\n    this.deleteSpeed = parseInt(this.dataset.deleteSpeed) || 40;\n    this.pauseDuration = parseInt(this.dataset.pause) || 1500;\n    this.originalPlaceholder = this.input.getAttribute(\"placeholder\") || \"\";\n    this.currentIndex = 0;\n    this.charIndex = 0;\n    this.timer = null;\n    this.isAnimating = false;\n\n    this._onFocus = () => this.stop(\"\");\n    this._onBlur = () => { if (!this.input.value) this.start(); };\n    this.input.addEventListener(\"focus\", this._onFocus);\n    this.input.addEventListener(\"blur\", this._onBlur);\n\n    if (document.activeElement !== this.input && !this.input.value) {\n      this.start();\n    }\n  }\n\n  disconnectedCallback() {\n    this.stop();\n    if (this.input) {\n      this.input.removeEventListener(\"focus\", this._onFocus);\n      this.input.removeEventListener(\"blur\", this._onBlur);\n    }\n  }\n\n  start() {\n    if (this.isAnimating) return;\n    this.isAnimating = true;\n    this.currentIndex = 0;\n    this.charIndex = 0;\n    this.input.setAttribute(\"placeholder\", \"\");\n    this.typePhrase();\n  }\n\n  stop(placeholder) {\n    if (this.timer) {\n      clearTimeout(this.timer);\n      this.timer = null;\n    }\n    this.isAnimating = false;\n    if (this.input) {\n      this.input.setAttribute(\"placeholder\", placeholder !== undefined ? placeholder : this.originalPlaceholder);\n    }\n  }\n\n  typePhrase() {\n    if (!this.isAnimating) return;\n    const phrase = this.phrases[this.currentIndex];\n    if (this.charIndex <= phrase.length) {\n      this.input.setAttribute(\"placeholder\", phrase.slice(0, this.charIndex));\n      this.charIndex++;\n      this.timer = setTimeout(() => this.typePhrase(), this.typeSpeed);\n    } else {\n      this.timer = setTimeout(() => this.deletePhrase(), this.pauseDuration);\n    }\n  }\n\n  deletePhrase() {\n    if (!this.isAnimating) return;\n    const phrase = this.phrases[this.currentIndex];\n    if (this.charIndex > 0) {\n      this.charIndex--;\n      this.input.setAttribute(\"placeholder\", phrase.slice(0, this.charIndex));\n      this.timer = setTimeout(() => this.deletePhrase(), this.deleteSpeed);\n    } else {\n      this.currentIndex = (this.currentIndex + 1) % this.phrases.length;\n      this.timer = setTimeout(() => this.typePhrase(), this.typeSpeed);\n    }\n  }\n}\ncustomElements.define(\"typing-placeholder\", TypingPlaceholder);\n"],
  "mappings": "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",
  "names": ["activeIndex", "smallest", "clamped", "nearest"]
}
