{
  "version": 3,
  "sources": ["/cdn/shop/t/24/assets/theme.js?cv=20260824a"],
  "sourcesContent": ["window.FoxTheme = window.FoxTheme || {};\nFoxTheme.config = {\n  hasLocalStorage: false,\n  mqlMobile: false,\n  mqlTablet: false,\n  mediaQueryMobile: \"screen and (max-width: 767px)\",\n  mediaQueryTablet: \"screen and (max-width: 1023px)\",\n  motionReduced: window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n  isTouch:\n    \"ontouchstart\" in window ||\n    navigator.maxTouchPoints > 0 ||\n    navigator.msMaxTouchPoints > 0,\n  isRTL: document.documentElement.getAttribute(\"dir\") === \"rtl\",\n};\nconsole.log(\n  \"%c\" +\n    window.FoxTheme.settings.themeName +\n    \" theme (v\" +\n    window.FoxTheme.settings.themeVersion +\n    \") by Foxecom\",\n  \"font-size: 14px; color: #FF5C00;\"\n);\n(function () {\n  // Detect browser has support local storage.\n  try {\n    const key = \"hyper:test\";\n    window.localStorage.setItem(key, \"test\");\n    window.localStorage.removeItem(key);\n    FoxTheme.config.hasLocalStorage = true;\n  } catch (err) {}\n\n  FoxTheme.DOMready = function (callback) {\n    document.readyState != \"loading\"\n      ? callback()\n      : document.addEventListener(\"DOMContentLoaded\", callback);\n  };\n\n  FoxTheme.a11y = {\n    trapFocusHandlers: {},\n    getFocusableElements: (container) => {\n      return Array.from(\n        container.querySelectorAll(\n          \"summary, a[href], button:enabled, [tabindex]:not([tabindex^='-']), [draggable], area, input:not([type=hidden]):enabled, select:enabled, textarea:enabled, object, iframe\"\n        )\n      );\n    },\n    trapFocus: (container, elementToFocus = container) => {\n      var elements = FoxTheme.a11y.getFocusableElements(container);\n      var first = elements[0];\n      var last = elements[elements.length - 1];\n\n      FoxTheme.a11y.removeTrapFocus();\n\n      FoxTheme.a11y.trapFocusHandlers.focusin = (event) => {\n        if (\n          event.target !== container &&\n          event.target !== last &&\n          event.target !== first\n        )\n          return;\n\n        document.addEventListener(\n          \"keydown\",\n          FoxTheme.a11y.trapFocusHandlers.keydown\n        );\n      };\n\n      FoxTheme.a11y.trapFocusHandlers.focusout = function () {\n        document.removeEventListener(\n          \"keydown\",\n          FoxTheme.a11y.trapFocusHandlers.keydown\n        );\n      };\n\n      FoxTheme.a11y.trapFocusHandlers.keydown = function (event) {\n        if (event.code.toUpperCase() !== \"TAB\") return; // If not TAB key\n        // On the last focusable element and tab forward, focus the first element.\n        if (event.target === last && !event.shiftKey) {\n          event.preventDefault();\n          first.focus();\n        }\n\n        //  On the first focusable element and tab backward, focus the last element.\n        if (\n          (event.target === container || event.target === first) &&\n          event.shiftKey\n        ) {\n          event.preventDefault();\n          last.focus();\n        }\n      };\n\n      document.addEventListener(\n        \"focusout\",\n        FoxTheme.a11y.trapFocusHandlers.focusout\n      );\n      document.addEventListener(\n        \"focusin\",\n        FoxTheme.a11y.trapFocusHandlers.focusin\n      );\n\n      elementToFocus.focus();\n\n      if (\n        elementToFocus.tagName === \"INPUT\" &&\n        [\"search\", \"text\", \"email\", \"url\"].includes(elementToFocus.type) &&\n        elementToFocus.value\n      ) {\n        elementToFocus.setSelectionRange(0, elementToFocus.value.length);\n      }\n    },\n    removeTrapFocus: (elementToFocus = null) => {\n      document.removeEventListener(\n        \"focusin\",\n        FoxTheme.a11y.trapFocusHandlers.focusin\n      );\n      document.removeEventListener(\n        \"focusout\",\n        FoxTheme.a11y.trapFocusHandlers.focusout\n      );\n      document.removeEventListener(\n        \"keydown\",\n        FoxTheme.a11y.trapFocusHandlers.keydown\n      );\n\n      if (elementToFocus) elementToFocus.focus();\n    },\n  };\n\n  FoxTheme.utils = {\n    throttle: (callback) => {\n      let requestId = null,\n        lastArgs;\n      const later = (context) => () => {\n        requestId = null;\n        callback.apply(context, lastArgs);\n      };\n      const throttled = (...args) => {\n        lastArgs = args;\n        if (requestId === null) {\n          requestId = requestAnimationFrame(later(this));\n        }\n      };\n      throttled.cancel = () => {\n        cancelAnimationFrame(requestId);\n        requestId = null;\n      };\n      return throttled;\n    },\n    setScrollbarWidth: () => {\n      const scrollbarWidth = window.innerWidth - document.body.clientWidth;\n      scrollbarWidth > 0 &&\n        document.documentElement.style.setProperty(\n          \"--scrollbar-width\",\n          `${scrollbarWidth}px`\n        );\n    },\n    waitForEvent: (element, eventName) => {\n      return new Promise((resolve) => {\n        // Event handler that checks if the event target is the expected element\n        const eventHandler = (event) => {\n          if (event.target === element) {\n            element.removeEventListener(eventName, eventHandler); // Clean up listener\n            resolve(event); // Resolve the promise with the event\n          }\n        };\n\n        // Attach the event handler to the element\n        element.addEventListener(eventName, eventHandler);\n      });\n    },\n    queryDomNodes: (selectors = {}, context = document) => {\n      const domNodes = Object.entries(selectors).reduce(\n        (acc, [name, selector]) => {\n          const findOne = typeof selector === \"string\";\n          const queryMethod = findOne ? \"querySelector\" : \"querySelectorAll\";\n          const sl = findOne ? selector : selector[0];\n\n          acc[name] = context && context[queryMethod](sl);\n          if (!findOne && acc[name]) {\n            acc[name] = [...acc[name]];\n          }\n          return acc;\n        },\n        {}\n      );\n      return domNodes;\n    },\n    addEventDelegate: ({\n      context = document.documentElement,\n      event = \"click\",\n      selector,\n      handler,\n      capture = false,\n    }) => {\n      const listener = function (e) {\n        // loop parent nodes from the target to the delegation node\n        for (\n          let target = e.target;\n          target && target !== this;\n          target = target.parentNode\n        ) {\n          if (target.matches(selector)) {\n            handler.call(target, e, target);\n            break;\n          }\n        }\n      };\n      context.addEventListener(event, listener, capture);\n      return () => {\n        context.removeEventListener(event, listener, capture);\n      };\n    },\n    getSectionId: (element) => {\n      if (element.hasAttribute(\"data-section-id\")) {\n        return element.dataset.sectionId;\n      } else {\n        if (!element.classList.contains(\"shopify-section\")) {\n          element = element.closest(\".shopify-section\");\n        }\n        return element.id.replace(\"shopify-section-\", \"\");\n      }\n    },\n    debounce: (fn, wait) => {\n      let t;\n      return (...args) => {\n        clearTimeout(t);\n        t = setTimeout(() => fn.apply(this, args), wait);\n      };\n    },\n    fetchConfig: (type = \"json\") => {\n      return {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Accept: `application/${type}`,\n        },\n      };\n    },\n    /**\n     * Store key-value pair with expiration time in localStorage\n     * Use storage instead of cookie to make it work properly on Safari IOS (in iframe).\n     */\n    setStorage(key, value, expiryInDays = null) {\n      if (!FoxTheme.config.hasLocalStorage) return;\n\n      const item = {\n        value: value,\n      };\n\n      if (expiryInDays !== null) {\n        const now = new Date();\n        item.expiry = now.getTime() + expiryInDays * 86400000;\n      }\n\n      window.localStorage.setItem(key, JSON.stringify(item));\n    },\n    getStorage(key) {\n      if (!FoxTheme.config.hasLocalStorage) return null;\n\n      const itemStr = window.localStorage.getItem(key);\n      // If the item doesn't exist, return null.\n      if (!itemStr) {\n        return null;\n      }\n      const item = JSON.parse(itemStr);\n      // Compare the expiry time of the item with the current time.\n      if (item.expiry && new Date().getTime() > item.expiry) {\n        // If the item has expired, remove it from storage and return null.\n        window.localStorage.removeItem(key);\n        return null;\n      }\n      return item.value;\n    },\n    postLink: (path, options) => {\n      options = options || {};\n      const method = options[\"method\"] || \"post\";\n      const params = options[\"parameters\"] || {};\n\n      const form = document.createElement(\"form\");\n      form.setAttribute(\"method\", method);\n      form.setAttribute(\"action\", path);\n\n      for (const key in params) {\n        for (const index in params[key]) {\n          for (const key2 in params[key][index]) {\n            const hiddenField = document.createElement(\"input\");\n            hiddenField.setAttribute(\"type\", \"hidden\");\n            hiddenField.setAttribute(\"name\", `${key}[${index}][${key2}]`);\n            hiddenField.setAttribute(\"value\", params[key][index][key2]);\n            form.appendChild(hiddenField);\n          }\n        }\n      }\n      document.body.appendChild(form);\n      form.submit();\n      document.body.removeChild(form);\n    },\n    imageReady: (imageOrArray) => {\n      if (!imageOrArray) {\n        return Promise.resolve();\n      }\n      imageOrArray =\n        imageOrArray instanceof Element\n          ? [imageOrArray]\n          : Array.from(imageOrArray);\n      return Promise.all(\n        imageOrArray.map((image) => {\n          return new Promise((resolve) => {\n            if (\n              (image.tagName === \"IMG\" && image.complete) ||\n              !image.offsetParent\n            ) {\n              resolve();\n            } else {\n              image.onload = () => resolve();\n            }\n          });\n        })\n      );\n    },\n    displayedMedia: (media) => {\n      return Array.from(media).find((item) => {\n        const style = window.getComputedStyle(item);\n        return style.display !== \"none\";\n      });\n    },\n  };\n\n  FoxTheme.pubsub = {\n    PUB_SUB_EVENTS: {\n      cartUpdate: \"cart-update\",\n      quantityUpdate: \"quantity-update\",\n      quantityRules: \"quantity-rules\",\n      quantityBoundries: \"quantity-boundries\",\n      variantChange: \"variant-change\",\n      cartError: \"cart-error\",\n      facetUpdate: \"facet-update\",\n      optionValueSelectionChange: \"option-value-selection-change\",\n    },\n    subscribers: {},\n    subscribe: (eventName, callback) => {\n      if (FoxTheme.pubsub.subscribers[eventName] === undefined) {\n        FoxTheme.pubsub.subscribers[eventName] = [];\n      }\n\n      FoxTheme.pubsub.subscribers[eventName] = [\n        ...FoxTheme.pubsub.subscribers[eventName],\n        callback,\n      ];\n\n      return function unsubscribe() {\n        FoxTheme.pubsub.subscribers[eventName] = FoxTheme.pubsub.subscribers[\n          eventName\n        ].filter((cb) => {\n          return cb !== callback;\n        });\n      };\n    },\n\n    publish: (eventName, data) => {\n      if (FoxTheme.pubsub.subscribers[eventName]) {\n        FoxTheme.pubsub.subscribers[eventName].forEach((callback) => {\n          callback(data);\n        });\n      }\n    },\n  };\n\n  FoxTheme.focusVisiblePolyfill = function () {\n    const navKeys = [\n      \"ARROWUP\",\n      \"ARROWDOWN\",\n      \"ARROWLEFT\",\n      \"ARROWRIGHT\",\n      \"TAB\",\n      \"ENTER\",\n      \"SPACE\",\n      \"ESCAPE\",\n      \"HOME\",\n      \"END\",\n      \"PAGEUP\",\n      \"PAGEDOWN\",\n    ];\n    let currentFocusedElement = null;\n    let mouseClick = null;\n\n    window.addEventListener(\"keydown\", (event) => {\n      if (navKeys.includes(event.code.toUpperCase())) {\n        mouseClick = false;\n      }\n    });\n\n    window.addEventListener(\"mousedown\", (event) => {\n      mouseClick = true;\n    });\n\n    window.addEventListener(\n      \"focus\",\n      () => {\n        if (currentFocusedElement)\n          currentFocusedElement.classList.remove(\"focused\");\n\n        if (mouseClick) return;\n\n        currentFocusedElement = document.activeElement;\n        currentFocusedElement.classList.add(\"focused\");\n      },\n      true\n    );\n  };\n\n  FoxTheme.Carousel = (function () {\n    class Carousel {\n      constructor(container, options, modules = null) {\n        this.container = container;\n        let defaultModules = [\n          FoxTheme.Swiper.Navigation,\n          FoxTheme.Swiper.Pagination,\n          FoxTheme.Swiper.A11y,\n        ];\n        if (modules) {\n          defaultModules = defaultModules.concat(modules);\n        }\n        this.options = {\n          modules: defaultModules,\n          ...options,\n        };\n      }\n\n      init() {\n        this.slider = new FoxTheme.Swiper.Swiper(this.container, this.options);\n      }\n    }\n    return Carousel;\n  })();\n\n  FoxTheme.delayUntilInteraction = (function () {\n    class ScriptLoader {\n      constructor(callback, delay = 5000) {\n        this.loadScriptTimer = setTimeout(callback, delay);\n        this.userInteractionEvents = [\n          \"mouseover\",\n          \"mousemove\",\n          \"keydown\",\n          \"touchstart\",\n          \"touchend\",\n          \"touchmove\",\n          \"wheel\",\n        ];\n\n        this.onScriptLoader = this.triggerScriptLoader.bind(this, callback);\n        this.userInteractionEvents.forEach((event) => {\n          window.addEventListener(event, this.onScriptLoader, {\n            passive: !0,\n          });\n        });\n      }\n\n      triggerScriptLoader(callback) {\n        callback();\n        clearTimeout(this.loadScriptTimer);\n        this.userInteractionEvents.forEach((event) => {\n          window.removeEventListener(event, this.onScriptLoader, {\n            passive: !0,\n          });\n        });\n      }\n    }\n\n    return ScriptLoader;\n  })();\n\n  FoxTheme.Currency = (function () {\n    const moneyFormat = \"${{amount}}\"; // eslint-disable-line camelcase\n\n    function formatMoney(cents, format) {\n      if (typeof cents === \"string\") {\n        cents = cents.replace(\".\", \"\");\n      }\n      let value = \"\";\n      const placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n      const formatString = format || moneyFormat;\n\n      function formatWithDelimiters(number, precision, thousands, decimal) {\n        thousands = thousands || \",\";\n        decimal = decimal || \".\";\n\n        if (isNaN(number) || number === null) {\n          return 0;\n        }\n\n        number = (number / 100.0).toFixed(precision);\n\n        const parts = number.split(\".\");\n        const dollarsAmount = parts[0].replace(\n          /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n          \"$1\" + thousands\n        );\n        const centsAmount = parts[1] ? decimal + parts[1] : \"\";\n\n        return dollarsAmount + centsAmount;\n      }\n\n      switch (formatString.match(placeholderRegex)[1]) {\n        case \"amount\":\n          value = formatWithDelimiters(cents, 2);\n          break;\n        case \"amount_no_decimals\":\n          value = formatWithDelimiters(cents, 0);\n          break;\n        case \"amount_with_comma_separator\":\n          value = formatWithDelimiters(cents, 2, \".\", \",\");\n          break;\n        case \"amount_no_decimals_with_comma_separator\":\n          value = formatWithDelimiters(cents, 0, \".\", \",\");\n          break;\n        case \"amount_no_decimals_with_space_separator\":\n          value = formatWithDelimiters(cents, 0, \" \");\n          break;\n        case \"amount_with_apostrophe_separator\":\n          value = formatWithDelimiters(cents, 2, \"'\");\n          break;\n      }\n\n      return formatString.replace(placeholderRegex, value);\n    }\n\n    function getBaseUnit(variant) {\n      if (!variant) {\n        return;\n      }\n\n      if (\n        !variant.unit_price_measurement ||\n        !variant.unit_price_measurement.reference_value\n      ) {\n        return;\n      }\n\n      return variant.unit_price_measurement.reference_value === 1\n        ? variant.unit_price_measurement.reference_unit\n        : variant.unit_price_measurement.reference_value +\n            variant.unit_price_measurement.reference_unit;\n    }\n\n    return {\n      formatMoney: formatMoney,\n      getBaseUnit: getBaseUnit,\n    };\n  })();\n\n  new FoxTheme.delayUntilInteraction(() => {\n    document.body.removeAttribute(\"data-initializing\");\n  });\n\n  FoxTheme.DOMready(FoxTheme.utils.setScrollbarWidth);\n  // window.addEventListener('resize', FoxTheme.utils.throttle(FoxTheme.utils.setScrollbarWidth));\n\n  const mql = window.matchMedia(FoxTheme.config.mediaQueryMobile);\n  FoxTheme.config.mqlMobile = mql.matches;\n  mql.onchange = (event) => {\n    if (event.matches) {\n      FoxTheme.config.mqlMobile = true;\n      document.dispatchEvent(new CustomEvent(\"matchMobile\"));\n    } else {\n      FoxTheme.config.mqlMobile = false;\n      document.dispatchEvent(new CustomEvent(\"unmatchMobile\"));\n    }\n  };\n\n  const mqlTablet = window.matchMedia(FoxTheme.config.mediaQueryTablet);\n  FoxTheme.config.mqlTablet = mqlTablet.matches;\n  mqlTablet.onchange = (event) => {\n    if (event.matches) {\n      FoxTheme.config.mqlTablet = true;\n      document.dispatchEvent(new CustomEvent(\"matchTablet\"));\n    } else {\n      FoxTheme.config.mqlTablet = false;\n      document.dispatchEvent(new CustomEvent(\"unmatchTablet\"));\n    }\n  };\n})();\n\n// Here run the querySelector to figure out if the browser supports :focus-visible or not and run code based on it.\ntry {\n  document.querySelector(\":focus-visible\");\n} catch (e) {\n  FoxTheme.focusVisiblePolyfill();\n}\n\nfunction pauseAllMedia() {\n  document.querySelectorAll(\".js-youtube\").forEach((video) => {\n    video.contentWindow.postMessage(\n      '{\"event\":\"command\",\"func\":\"' + \"pauseVideo\" + '\",\"args\":\"\"}',\n      \"*\"\n    );\n  });\n  document.querySelectorAll(\".js-vimeo\").forEach((video) => {\n    video.contentWindow.postMessage('{\"method\":\"pause\"}', \"*\");\n  });\n  document.querySelectorAll(\"video\").forEach((video) => video.pause());\n  document.querySelectorAll(\"product-model\").forEach((model) => {\n    if (model.modelViewerUI) model.modelViewerUI.pause();\n  });\n}\n\nclass HTMLUpdateUtility {\n  /**\n   * Used to swap an HTML node with a new node.\n   * The new node is inserted as a previous sibling to the old node, the old node is hidden, and then the old node is removed.\n   *\n   * The function currently uses a double buffer approach, but this should be replaced by a view transition once it is more widely supported https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n   */\n  static viewTransition(\n    oldNode,\n    newContent,\n    preProcessCallbacks = [],\n    postProcessCallbacks = []\n  ) {\n    if (!oldNode || !newContent) return;\n    preProcessCallbacks?.forEach((callback) => callback(newContent));\n\n    const newNodeWrapper = document.createElement(\"div\");\n    HTMLUpdateUtility.setInnerHTML(newNodeWrapper, newContent.outerHTML);\n    const newNode = newNodeWrapper.firstChild;\n\n    // dedupe IDs\n    const uniqueKey = Date.now();\n    oldNode.querySelectorAll(\"[id], [form]\").forEach((element) => {\n      element.id && (element.id = `${element.id}-${uniqueKey}`);\n      element.form &&\n        element.setAttribute(\n          \"form\",\n          `${element.form.getAttribute(\"id\")}-${uniqueKey}`\n        );\n    });\n\n    oldNode.parentNode.insertBefore(newNode, oldNode);\n    oldNode.style.display = \"none\";\n\n    postProcessCallbacks?.forEach((callback) => callback(newNode));\n\n    setTimeout(() => oldNode.remove(), 500);\n  }\n\n  // Sets inner HTML and reinjects the script tags to allow execution. By default, scripts are disabled when using element.innerHTML.\n  static setInnerHTML(element, html) {\n    element.innerHTML = html;\n    element.querySelectorAll(\"script\").forEach((oldScriptTag) => {\n      const newScriptTag = document.createElement(\"script\");\n      Array.from(oldScriptTag.attributes).forEach((attribute) => {\n        newScriptTag.setAttribute(attribute.name, attribute.value);\n      });\n      newScriptTag.appendChild(document.createTextNode(oldScriptTag.innerHTML));\n      oldScriptTag.parentNode.replaceChild(newScriptTag, oldScriptTag);\n    });\n  }\n}\nclass PageTransition extends HTMLElement {\n  constructor() {\n    super();\n\n    window.addEventListener(\"beforeunload\", () => {\n      document.body.classList.add(\"page-loading\");\n    });\n\n    window.addEventListener(\"DOMContentLoaded\", () => {\n      FoxTheme.Motion.animate(\n        this,\n        { visibility: \"hidden\", opacity: 0 },\n        { duration: 1 }\n      );\n\n      document.body.classList.add(\"page-loaded\");\n      document.dispatchEvent(new CustomEvent(\"page:loaded\"));\n    });\n\n    window.addEventListener(\"pageshow\", (event) => {\n      if (event.persisted) {\n        document.body.classList.remove(\"page-loading\");\n      }\n    });\n  }\n}\ncustomElements.define(\"page-transition\", PageTransition);\n\nconst clearModalComponentCount = new WeakMap();\nclass ModalComponent extends HTMLElement {\n  constructor() {\n    super();\n    this.events = {\n      handleAfterHide: \"modal:handleAfterHide\",\n      handleAfterShow: \"modal:handleAfterShow\",\n    };\n\n    this.classes = {\n      show: \"modal-show\",\n      showing: \"modal-showing\",\n    };\n  }\n\n  static get observedAttributes() {\n    return [\"id\", \"open\"];\n  }\n\n  get isLockingNeeded() {\n    return false;\n  }\n\n  get requiresBodyAppended() {\n    return false;\n  }\n\n  get controls() {\n    return Array.from(\n      document.querySelectorAll(`[aria-controls=\"${this.id}\"]`)\n    );\n  }\n\n  get designMode() {\n    return this.hasAttribute(\"shopify-design-mode\");\n  }\n\n  get open() {\n    return this.hasAttribute(\"open\");\n  }\n\n  get overlay() {\n    // Check if the _overlay property is already set\n    if (!this._overlay) {\n      // If not set, find the element and cache it\n      this._overlay = this.querySelector(\".fixed-overlay\");\n    }\n\n    // Return the cached element\n    return this._overlay;\n  }\n\n  get focusElement() {\n    return this.querySelector(\"button\");\n  }\n  connectedCallback() {\n    // Initialize the AbortController\n    this.abortController = new AbortController();\n\n    // Delegate clicks so controls still work after DOM replacements (e.g. cart:refresh)\n    document.addEventListener(\"click\", this.onButtonClick.bind(this), {\n      signal: this.abortController.signal,\n    });\n\n    // Add keyup event listener to document for handling the Escape key\n    document.addEventListener(\n      \"keyup\",\n      (event) => {\n        if (event.code === \"Escape\") {\n          this.hide();\n        }\n      },\n      { signal: this.abortController.signal }\n    );\n\n    // Additional setup for Shopify design mode\n    if (this.designMode && Shopify.designMode) {\n      const section = this.closest(\".shopify-section\");\n      section.addEventListener(\n        \"shopify:section:select\",\n        (event) => {\n          this.show(null, !event.detail.load);\n        },\n        {\n          signal: this.abortController.signal,\n        }\n      );\n      section.addEventListener(\n        \"shopify:section:deselect\",\n        () => {\n          this.hide();\n        },\n        {\n          signal: this.abortController.signal,\n        }\n      );\n    }\n  }\n\n  disconnectedCallback() {\n    this.abortController.abort();\n  }\n\n  attributeChangedCallback(name, oldValue, newValue) {\n    switch (name) {\n      case \"open\":\n        this.controls.forEach((button) =>\n          button.setAttribute(\n            \"aria-expanded\",\n            newValue === null ? \"false\" : \"true\"\n          )\n        );\n\n        if (\n          oldValue === null &&\n          (newValue === \"\" || newValue === \"immediate\")\n        ) {\n          this.hidden = false;\n          this.removeAttribute(\"inert\");\n\n          this.parentElementBeforeAppend = null;\n          if (\n            this.requiresBodyAppended &&\n            this.parentElement !== document.body\n          ) {\n            this.parentElementBeforeAppend = this.parentElement;\n            document.body.append(this);\n          }\n          const handleShowTransitionPromise =\n            this.handleShowTransition(newValue !== \"immediate\") ||\n            Promise.resolve();\n          handleShowTransitionPromise.then(() => {\n            this.handleAfterShow();\n            this.dispatchEvent(\n              new CustomEvent(this.events.handleAfterShow, { bubbles: true })\n            );\n          });\n        } else if (oldValue !== null && newValue === null) {\n          this.setAttribute(\"inert\", \"\");\n\n          const handleHideTransitionPromise =\n            this.handleHideTransition() || Promise.resolve();\n          handleHideTransitionPromise.then(() => {\n            this.handleAfterHide();\n\n            if (!this.hasAttribute(\"inert\")) return;\n\n            if (\n              this.parentElement === document.body &&\n              this.parentElementBeforeAppend\n            ) {\n              this.parentElementBeforeAppend.appendChild(this);\n              this.parentElementBeforeAppend = null;\n            }\n            this.dispatchEvent(\n              new CustomEvent(this.events.handleAfterHide, { bubbles: true })\n            );\n\n            this.hidden = true;\n          });\n        }\n        this.dispatchEvent(new CustomEvent(\"toggle\", { bubbles: true }));\n\n        break;\n    }\n  }\n\n  onButtonClick(event) {\n    const control = event.target.closest(`[aria-controls=\"${this.id}\"]`);\n    if (!control) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (control.disabled) {\n      return;\n    }\n\n    if (this.open) {\n      this.hide();\n    } else {\n      this.show(control);\n    }\n  }\n\n  hide() {\n    if (this.open) {\n      this.removeAttribute(\"open\");\n      return FoxTheme.utils.waitForEvent(this, this.events.handleAfterHide);\n    }\n  }\n\n  show(activeElement = null, animate = true) {\n    if (!this.shouleBeShow()) {\n      return;\n    }\n\n    if (!this.open) {\n      this.prepareToShow();\n      this.activeElement = activeElement;\n      this.setAttribute(\"open\", animate ? \"\" : \"immediate\");\n\n      if (this.isLockingNeeded) {\n        document.body.classList.add(this.classes.showing);\n      }\n\n      return FoxTheme.utils.waitForEvent(this, this.events.handleAfterShow);\n    }\n  }\n\n  handleAfterHide() {\n    setTimeout(() => {\n      // Remove trap focus from the active element\n      FoxTheme.a11y.removeTrapFocus(this.activeElement);\n\n      // Conditionally manage locking behavior\n      if (this.isLockingNeeded) {\n        // Decrement the lock layer count for the ModalElement\n        const currentModalCount =\n          clearModalComponentCount.get(ModalComponent) - 1;\n        clearModalComponentCount.set(ModalComponent, currentModalCount);\n\n        // Toggle the 'open' class on the body based on the current lock count\n        document.body.classList.toggle(\n          this.classes.show,\n          currentModalCount > 0\n        );\n      }\n    });\n  }\n\n  handleAfterShow() {\n    // Trap focus on the specified elements\n    if (!Shopify.designMode) {\n      FoxTheme.a11y.trapFocus(this, this.focusElement);\n    }\n\n    // Check if locking is needed\n    if (this.isLockingNeeded) {\n      // Increment the lock layer count for the ModalElement\n      const currentLockCount = clearModalComponentCount.get(ModalComponent) + 1;\n      clearModalComponentCount.set(ModalComponent, currentLockCount);\n\n      // Manage class changes on the document body\n      document.body.classList.remove(this.classes.showing);\n      document.body.classList.add(this.classes.show);\n    }\n  }\n\n  shouleBeShow() {\n    return true;\n  }\n\n  prepareToShow() {}\n\n  handleShowTransition() {\n    // Start a timeout to set an attribute\n    setTimeout(() => {\n      this.setAttribute(\"active\", \"\");\n    }, 75);\n\n    // Return a promise that resolves when the transition ends\n    return new Promise((resolve) => {\n      this.overlay.addEventListener(\"transitionend\", resolve, { once: true });\n    });\n  }\n\n  handleHideTransition() {\n    // Immediately remove the 'active' attribute\n    this.removeAttribute(\"active\");\n\n    // Return a promise that resolves when the transition ends\n    return new Promise((resolve) => {\n      this.overlay.addEventListener(\"transitionend\", resolve, { once: true });\n    });\n  }\n}\ncustomElements.define(\"modal-component\", ModalComponent);\nclearModalComponentCount.set(ModalComponent, 0);\n\nclass BasicModal extends ModalComponent {\n  constructor() {\n    super();\n  }\n\n  get isLockingNeeded() {\n    return true;\n  }\n\n  get requiresBodyAppended() {\n    return true;\n  }\n}\ncustomElements.define(\"basic-modal\", BasicModal);\n\nclass DrawerComponent extends ModalComponent {\n  constructor() {\n    super();\n    this.events = {\n      handleAfterHide: \"drawer:handleAfterHide\",\n      handleAfterShow: \"drawer:handleAfterShow\",\n    };\n  }\n  get isLockingNeeded() {\n    return true;\n  }\n  get requiresBodyAppended() {\n    return true;\n  }\n}\ncustomElements.define(\"drawer-component\", DrawerComponent);\n\nclass SpotlightPick extends DrawerComponent {\n  constructor() {\n    super();\n  }\n\n  get requiresBodyAppended() {\n    return false;\n  }\n}\ncustomElements.define(\"spotlight-pick\", SpotlightPick);\n\nclass AccordionDetails extends HTMLDetailsElement {\n  constructor() {\n    super();\n    this.initAccordion();\n  }\n\n  initAccordion() {\n    this.isOpen = this.hasAttribute(\"open\");\n    this.summaryElement = this.querySelector(\"summary\");\n    this.contentElement = this.querySelector(\"summary + *\");\n    this.setAttribute(\"aria-expanded\", this.isOpen ? \"true\" : \"false\");\n\n    this.summaryElement.addEventListener(\n      \"click\",\n      this.toggleAccordion.bind(this)\n    );\n\n    if (Shopify.designMode) {\n      this.designModeEventSetup();\n    }\n  }\n\n  static get observedAttributes() {\n    return [\"open\"];\n  }\n\n  get open() {\n    return this.isOpen;\n  }\n\n  set open(value) {\n    if (value !== this.isOpen) {\n      this.isOpen = value;\n\n      if (this.isConnected) {\n        this.animateAccordion(value);\n      } else {\n        if (value) {\n          this.setAttribute(\"open\", \"\");\n        } else {\n          this.removeAttribute(\"open\");\n        }\n      }\n\n      this.setAttribute(\"aria-expanded\", value ? \"true\" : \"false\");\n      this.setAttribute(\"aria-controls\", this.contentElement.id);\n\n      this.handleAfterToggle();\n    }\n  }\n\n  handleAfterToggle() {}\n\n  toggleAccordion(event) {\n    event.preventDefault();\n    this.open = !this.open;\n  }\n\n  close() {\n    this.isOpen = false;\n    this.animateAccordion(false);\n  }\n\n  async animateAccordion(isOpen) {\n    this.style.overflow = \"hidden\";\n\n    if (isOpen) {\n      this.setAttribute(\"open\", \"\");\n      this.parentElement.classList.add(\"active\");\n\n      await FoxTheme.Motion.timeline([\n        [\n          this,\n          {\n            height: [\n              `${this.summaryElement.clientHeight + 1}px`,\n              `${this.scrollHeight + 1}px`,\n            ],\n          },\n          { duration: 0.25, easing: \"ease\" },\n        ],\n        [\n          this.contentElement,\n          { opacity: [0, 1], transform: [\"translateY(10px)\", \"translateY(0)\"] },\n          { duration: 0.15, at: \"<\" },\n        ],\n      ]).finished;\n    } else {\n      await FoxTheme.Motion.timeline([\n        [this.contentElement, { opacity: 0 }, { duration: 0.15 }],\n        [\n          this,\n          {\n            height: [\n              `${this.clientHeight + 1}px`,\n              `${this.summaryElement.clientHeight + 1}px`,\n            ],\n          },\n          { duration: 0.25, at: \"<\", easing: \"ease\" },\n        ],\n      ]).finished;\n\n      this.removeAttribute(\"open\");\n      this.parentElement.classList.remove(\"active\");\n    }\n\n    this.style.height = \"auto\";\n    this.style.overflow = \"visible\";\n  }\n\n  designModeEventSetup() {\n    this.addEventListener(\"shopify:block:select\", () => {\n      this.open = true;\n    });\n\n    this.addEventListener(\"shopify:block:deselect\", () => {\n      this.open = false;\n    });\n  }\n\n  attributeChangedCallback(name, oldValue, newValue) {\n    if (name === \"open\") {\n      this.setAttribute(\"aria-controls\", this.contentElement.id);\n    }\n  }\n}\ncustomElements.define(\"accordion-details\", AccordionDetails, {\n  extends: \"details\",\n});\n\nclass AccordionGroup extends AccordionDetails {\n  constructor() {\n    super();\n  }\n\n  handleAfterToggle() {\n    if (this.isOpen) {\n      const parent = this.closest(\".accordion-parent\") || document;\n      const siblingsAccordions = parent.querySelectorAll(\n        'details[is=\"accordion-group\"]'\n      );\n\n      siblingsAccordions.forEach((details) => {\n        if (details !== this) {\n          details.open = false;\n        }\n      });\n    }\n  }\n}\ncustomElements.define(\"accordion-group\", AccordionGroup, {\n  extends: \"details\",\n});\n\nclass ProgressBar extends HTMLElement {\n  constructor() {\n    super();\n\n    if (this.hasAttribute(\"style\")) return;\n\n    if (this.dataset.from) {\n      this.initProgress();\n    }\n\n    FoxTheme.Motion.inView(this, this.init.bind(this));\n  }\n\n  init() {\n    this.setPercentage(this.dataset.value, this.dataset.max);\n  }\n\n  initProgress() {\n    this.setPercentage(this.dataset.from, this.dataset.max);\n  }\n\n  setPercentage(val1, val2) {\n    this.style.setProperty(\n      \"--percent\",\n      `${(parseInt(val1) / parseInt(val2)) * 100}%`\n    );\n  }\n}\ncustomElements.define(\"progress-bar\", ProgressBar);\n\nclass CartCount extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  cartUpdateUnsubscriber = undefined;\n\n  connectedCallback() {\n    this.cartUpdateUnsubscriber = FoxTheme.pubsub.subscribe(\n      FoxTheme.pubsub.PUB_SUB_EVENTS.cartUpdate,\n      this.onCartUpdate.bind(this)\n    );\n  }\n\n  disconnectedCallback() {\n    if (this.cartUpdateUnsubscriber) {\n      this.cartUpdateUnsubscriber();\n    }\n  }\n\n  get itemCount() {\n    return parseInt(this.innerText);\n  }\n\n  get type() {\n    return this.dataset.type;\n  }\n\n  onCartUpdate(event) {\n    if (event.cart.errors) return;\n\n    let count = event.cart.item_count > 99 ? \"99+\" : event.cart.item_count;\n\n    if (this.type === \"blank\") {\n      count = `(${count})`;\n    }\n\n    if (this.classList.contains(\"cart-count--absolute\")) {\n      if (event.cart.item_count > 99) {\n        this.innerHTML = `<span class=\"text-sm-extra\">${count}</span>`;\n        this.classList.add(\"cart-count--small-medium\");\n      } else {\n        this.innerText = count;\n        this.classList.remove(\"cart-count--small-medium\");\n      }\n    } else {\n      this.innerText = count;\n    }\n\n    this.hidden = this.itemCount === 0 || event.cart.item_count === 0;\n\n    const method = this.itemCount === 0 ? \"remove\" : \"add\";\n    document.documentElement.classList[method](\"cart-has-items\");\n  }\n}\ncustomElements.define(\"cart-count\", CartCount);\n\nclass QuantityInput extends HTMLElement {\n  quantityUpdateUnsubscriber = undefined;\n  quantityBoundriesUnsubscriber = undefined;\n  quantityRulesUnsubscriber = undefined;\n\n  constructor() {\n    super();\n  }\n\n  get sectionId() {\n    return this.getAttribute(\"data-section-id\");\n  }\n\n  get productId() {\n    return this.getAttribute(\"data-product-id\");\n  }\n\n  get input() {\n    return this.querySelector(\"input\");\n  }\n\n  get value() {\n    return this.input.value;\n  }\n\n  connectedCallback() {\n    // Prevent duplicate initialization\n    if (this._initialized) {\n      return;\n    }\n    this._initialized = true;\n\n    this.abortController = new AbortController();\n\n    this.buttons = Array.from(this.querySelectorAll(\"button\"));\n    this.changeEvent = new Event(\"change\", { bubbles: true });\n\n    this.input.addEventListener(\"change\", this.onInputChange.bind(this));\n    this.input.addEventListener(\"focus\", () =>\n      setTimeout(() => this.input.select())\n    );\n\n    this.buttons.forEach((button) => {\n      button.addEventListener(\"click\", this.onButtonClick.bind(this)),\n        {\n          signal: this.abortController.signal,\n        };\n    });\n\n    this.validateQtyRules();\n\n    this.quantityUpdateUnsubscriber = FoxTheme.pubsub.subscribe(\n      FoxTheme.pubsub.PUB_SUB_EVENTS.quantityUpdate,\n      this.validateQtyRules.bind(this)\n    );\n    this.quantityBoundriesUnsubscriber = FoxTheme.pubsub.subscribe(\n      FoxTheme.pubsub.PUB_SUB_EVENTS.quantityBoundries,\n      this.setQuantityBoundries.bind(this)\n    );\n    this.quantityRulesUnsubscriber = FoxTheme.pubsub.subscribe(\n      FoxTheme.pubsub.PUB_SUB_EVENTS.quantityRules,\n      this.updateQuantityRules.bind(this)\n    );\n  }\n\n  disconnectedCallback() {\n    this.abortController.abort();\n\n    if (this.quantityUpdateUnsubscriber) {\n      this.quantityUpdateUnsubscriber();\n    }\n    if (this.quantityBoundriesUnsubscriber) {\n      this.quantityBoundriesUnsubscriber();\n    }\n    if (this.quantityRulesUnsubscriber) {\n      this.quantityRulesUnsubscriber();\n    }\n  }\n\n  onButtonClick(event) {\n    event.preventDefault();\n    const previousValue = this.input.value;\n\n    if (event.currentTarget.name === \"plus\") {\n      if (\n        parseInt(this.input.getAttribute(\"data-min\")) >\n          parseInt(this.input.step) &&\n        this.input.value == 0\n      ) {\n        this.input.value = this.input.getAttribute(\"data-min\");\n      } else {\n        this.input.stepUp();\n      }\n    } else {\n      this.input.stepDown();\n    }\n\n    if (previousValue !== this.input.value)\n      this.input.dispatchEvent(this.changeEvent);\n\n    if (\n      this.input.getAttribute(\"data-min\") === previousValue &&\n      event.currentTarget.name === \"minus\"\n    ) {\n      this.input.value = parseInt(this.input.min);\n    }\n  }\n\n  onInputChange() {\n    if (this.input.value === \"\") {\n      this.input.value = parseInt(this.input.min);\n    }\n    this.validateQtyRules();\n  }\n\n  validateQtyRules() {\n    const value = parseInt(this.input.value);\n    if (this.input.min) {\n      const buttonMinus = this.querySelector('button[name=\"minus\"]');\n      if (buttonMinus)\n        buttonMinus.toggleAttribute(\n          \"disabled\",\n          parseInt(value) <= parseInt(this.input.min)\n        );\n    }\n    if (this.input.max) {\n      const buttonPlus = this.querySelector('button[name=\"plus\"]');\n      if (buttonPlus)\n        buttonPlus.toggleAttribute(\n          \"disabled\",\n          parseInt(value) >= parseInt(this.input.max)\n        );\n    }\n  }\n\n  updateQuantityRules({ data: { sectionId, productId, parsedHTML } }) {\n    if (sectionId !== this.sectionId || productId !== this.productId) return;\n\n    const selectors = [\n      \".quantity__input\",\n      \".quantity__rules\",\n      \".quantity__label\",\n    ];\n    const quantityFormUpdated = parsedHTML.getElementById(\n      `QuantityForm-${sectionId}`\n    );\n    const quantityForm = this.closest(`#QuantityForm-${sectionId}`);\n    for (let selector of selectors) {\n      const current = quantityForm.querySelector(selector);\n      const updated = quantityFormUpdated?.querySelector(selector);\n      if (!current || !updated) continue;\n\n      if (selector === \".quantity__input\") {\n        const attributes = [\n          \"data-cart-quantity\",\n          \"data-min\",\n          \"data-max\",\n          \"step\",\n        ];\n        for (let attribute of attributes) {\n          const valueUpdated = updated.getAttribute(attribute);\n          if (valueUpdated !== null) {\n            current.setAttribute(attribute, valueUpdated);\n          } else {\n            current.removeAttribute(attribute);\n          }\n        }\n      } else {\n        current.innerHTML = updated.innerHTML;\n      }\n    }\n  }\n\n  setQuantityBoundries({ data: { sectionId, productId } }) {\n    if (sectionId !== this.sectionId || productId !== this.productId) return;\n    const data = {\n      cartQuantity: this.input.hasAttribute(\"data-cart-quantity\")\n        ? parseInt(this.input.getAttribute(\"data-cart-quantity\"))\n        : 0,\n      min: this.input.hasAttribute(\"data-min\")\n        ? parseInt(this.input.getAttribute(\"data-min\"))\n        : 1,\n      max: this.input.hasAttribute(\"data-max\")\n        ? parseInt(this.input.getAttribute(\"data-max\"))\n        : null,\n      step: this.input.hasAttribute(\"step\")\n        ? parseInt(this.input.getAttribute(\"step\"))\n        : 1,\n    };\n\n    let min = data.min;\n    const max = data.max === null ? data.max : data.max - data.cartQuantity;\n    if (max !== null) min = Math.min(min, max);\n    if (data.cartQuantity >= data.min) min = Math.min(min, data.step);\n\n    this.input.min = min;\n\n    if (max) {\n      this.input.max = max;\n    } else {\n      this.input.removeAttribute(\"max\");\n    }\n    this.input.value = min;\n\n    FoxTheme.pubsub.publish(\n      FoxTheme.pubsub.PUB_SUB_EVENTS.quantityUpdate,\n      undefined\n    );\n  }\n}\ncustomElements.define(\"quantity-input\", QuantityInput);\n\nclass QuantitySelector extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  connectedCallback() {\n    this.abortController = new AbortController();\n\n    this.input = this.querySelector(\"input\");\n    this.buttons = Array.from(this.querySelectorAll(\"button\"));\n    this.changeEvent = new Event(\"change\", { bubbles: true });\n\n    this.buttons.forEach(\n      (button) =>\n        button.addEventListener(\"click\", this.onButtonClick.bind(this)),\n      {\n        signal: this.abortController.signal,\n      }\n    );\n  }\n\n  disconnectedCallback() {\n    this.abortController.abort();\n  }\n\n  onButtonClick(event) {\n    event.preventDefault();\n    const previousValue = this.input.value;\n\n    if (event.currentTarget.name === \"plus\") {\n      this.input.quantity = this.input.quantity + 1;\n    } else {\n      this.input.quantity = this.input.quantity - 1;\n    }\n\n    if (previousValue !== this.input.value)\n      this.input.dispatchEvent(this.changeEvent);\n  }\n}\ncustomElements.define(\"quantity-selector\", QuantitySelector);\n\nconst onYouTubeApiLoaded = new Promise((resolve) => {\n  window.onYouTubeIframeAPIReady = () => resolve();\n});\nclass VideoElement extends HTMLElement {\n  constructor() {\n    super();\n\n    if (this.posterElement) {\n      this.posterElement.addEventListener(\n        \"click\",\n        this.handlePosterClick.bind(this)\n      );\n    }\n\n    if (this.autoplay) {\n      FoxTheme.Motion.inView(this, () => {\n        if (!this.paused) {\n          this.play();\n        }\n\n        return () => {\n          this.pause();\n        };\n      });\n    }\n  }\n\n  get posterElement() {\n    return this.querySelector('[id^=\"DeferredPoster-\"]');\n  }\n\n  get controlledElement() {\n    return this.hasAttribute(\"aria-controls\")\n      ? document.getElementById(this.getAttribute(\"aria-controls\"))\n      : null;\n  }\n\n  get autoplay() {\n    return this.hasAttribute(\"autoplay\");\n  }\n\n  get playing() {\n    return this.hasAttribute(\"playing\");\n  }\n\n  get player() {\n    return (this.playerProxy =\n      this.playerProxy ||\n      new Proxy(this.initializePlayer(), {\n        get: (target, prop) => {\n          return async () => {\n            target = await target;\n            this.handlePlayerAction(target, prop);\n          };\n        },\n      }));\n  }\n\n  static get observedAttributes() {\n    return [\"playing\"];\n  }\n\n  handlePosterClick(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (this.playing) {\n      this.paused = true;\n      this.pause();\n    } else {\n      this.paused = false;\n      this.play();\n    }\n  }\n\n  play() {\n    if (!this.playing) {\n      this.player.play();\n    }\n  }\n\n  pause() {\n    if (this.playing) {\n      this.player.pause();\n    }\n  }\n\n  attributeChangedCallback(name, oldValue, newValue) {\n    if (name === \"playing\") {\n      if (oldValue === null && newValue === \"\") {\n        return this.dispatchEvent(\n          new CustomEvent(\"video:play\", { bubbles: true })\n        );\n      }\n\n      if (newValue === null) {\n        return this.dispatchEvent(\n          new CustomEvent(\"video:pause\", { bubbles: true })\n        );\n      }\n    }\n  }\n\n  initializePlayer() {\n    if (this.hasAttribute(\"source\")) {\n      this.setAttribute(\"loaded\", \"\");\n      this.closest(\".media\")?.classList.remove(\"loading\");\n\n      return new Promise(async (resolve) => {\n        const templateElement = this.querySelector(\"template\");\n        if (templateElement) {\n          templateElement.replaceWith(\n            templateElement.content.firstElementChild.cloneNode(true)\n          );\n        }\n        const muteVideo =\n          this.hasAttribute(\"autoplay\") ||\n          window.matchMedia(\"screen and (max-width: 1023px)\").matches;\n        const script = document.createElement(\"script\");\n        script.type = \"text/javascript\";\n        if (this.getAttribute(\"source\") === \"youtube\") {\n          if (!window.YT || !window.YT.Player) {\n            script.src = \"https://www.youtube.com/iframe_api\";\n            document.head.appendChild(script);\n            await new Promise((resolve2) => {\n              script.onload = resolve2;\n            });\n          }\n          await onYouTubeApiLoaded;\n          const player = new YT.Player(this.querySelector(\"iframe\"), {\n            events: {\n              onReady: () => {\n                if (muteVideo) {\n                  player.mute();\n                }\n                resolve(player);\n              },\n              onStateChange: (event) => {\n                if (event.data === YT.PlayerState.PLAYING) {\n                  this.setAttribute(\"playing\", \"\");\n                } else if (\n                  event.data === YT.PlayerState.ENDED ||\n                  event.data === YT.PlayerState.PAUSED\n                ) {\n                  this.removeAttribute(\"playing\");\n                }\n              },\n            },\n          });\n        }\n        if (this.getAttribute(\"source\") === \"vimeo\") {\n          if (!window.Vimeo || !window.Vimeo.Player) {\n            script.src = \"https://player.vimeo.com/api/player.js\";\n            document.head.appendChild(script);\n            await new Promise((resolve2) => {\n              script.onload = resolve2;\n            });\n          }\n          const player = new Vimeo.Player(this.querySelector(\"iframe\"));\n          if (muteVideo) {\n            player.setMuted(true);\n          }\n          player.on(\"play\", () => {\n            this.setAttribute(\"playing\", \"\");\n          });\n          player.on(\"pause\", () => this.removeAttribute(\"playing\"));\n          player.on(\"ended\", () => this.removeAttribute(\"playing\"));\n          resolve(player);\n        }\n      });\n    } else {\n      this.appendChild(\n        this.querySelector(\"template\").content.firstElementChild.cloneNode(true)\n      );\n      this.setAttribute(\"loaded\", \"\");\n      this.closest(\".media\")?.classList.remove(\"loading\");\n\n      const player = this.querySelector(\"video\");\n      player.addEventListener(\"play\", () => {\n        this.setAttribute(\"playing\", \"\");\n        this.removeAttribute(\"suspended\");\n      });\n      player.addEventListener(\"pause\", () => {\n        if (!player.seeking && player.paused) {\n          this.removeAttribute(\"playing\");\n        }\n      });\n      return player;\n    }\n  }\n\n  handlePlayerAction(target, prop) {\n    if (this.getAttribute(\"source\") === \"youtube\") {\n      prop === \"play\" ? target.playVideo() : target.pauseVideo();\n    } else {\n      if (prop === \"play\" && !this.hasAttribute(\"source\")) {\n        target.play().catch((error) => {\n          if (error.name === \"NotAllowedError\") {\n            this.setAttribute(\"suspended\", \"\");\n            target.controls = true;\n            const replacementImageSrc =\n              target.previousElementSibling?.currentSrc;\n            if (replacementImageSrc) {\n              target.poster = replacementImageSrc;\n            }\n          }\n        });\n      } else {\n        target[prop]();\n      }\n    }\n  }\n}\ncustomElements.define(\"video-element\", VideoElement);\n\nclass LocalizationForm extends HTMLElement {\n  constructor() {\n    super();\n    this.elements = {\n      input: this.querySelector(\n        'input[name=\"locale_code\"], input[name=\"country_code\"]'\n      ),\n      button: this.querySelector(\"button\"),\n      panel: this.querySelector(\".disclosure-list\"),\n    };\n\n    this.elements.panel.removeAttribute(\"hidden\");\n    this.elements.button.addEventListener(\n      \"click\",\n      this.openSelector.bind(this)\n    );\n    this.elements.button.addEventListener(\n      \"focusout\",\n      this.closeSelector.bind(this)\n    );\n    this.addEventListener(\"keyup\", this.onContainerKeyUp.bind(this));\n\n    this.querySelectorAll(\"a\").forEach((item) =>\n      item.addEventListener(\"click\", this.onItemClick.bind(this))\n    );\n\n    this.handleDropdownPos();\n  }\n\n  handleDropdownPos() {\n    const offsetButton = this.elements.button.getBoundingClientRect().right;\n    if (window.innerWidth - offsetButton < 220) {\n      this.elements.button.nextElementSibling &&\n        this.elements.button.nextElementSibling.classList.add(\n          \"disclosure-list__right\"\n        );\n    }\n  }\n\n  hidePanel() {\n    this.elements.button.setAttribute(\"aria-expanded\", \"false\");\n    this.removeAttribute(\"open\");\n  }\n\n  onContainerKeyUp(event) {\n    if (event.code.toUpperCase() !== \"ESCAPE\") return;\n\n    this.hidePanel();\n    this.elements.button.focus();\n  }\n\n  onItemClick(event) {\n    event.preventDefault();\n    const form = this.querySelector(\"form\");\n    this.elements.input.value = event.currentTarget.dataset.value;\n    if (form) form.submit();\n  }\n\n  openSelector() {\n    this.elements.button.focus();\n    this.toggleAttribute(\"open\");\n    this.elements.button.setAttribute(\n      \"aria-expanded\",\n      (\n        this.elements.button.getAttribute(\"aria-expanded\") === \"false\"\n      ).toString()\n    );\n  }\n\n  closeSelector(event) {\n    const shouldClose =\n      (event.relatedTarget && event.relatedTarget.nodeName === \"BUTTON\") ||\n      (event.relatedTarget &&\n        !event.relatedTarget.classList.contains(\"disclosure-list__option\"));\n    if (event.relatedTarget === null || shouldClose) {\n      this.hidePanel(shouldClose);\n    }\n  }\n}\ncustomElements.define(\"localization-form\", LocalizationForm);\n\nclass GridList extends HTMLElement {\n  constructor() {\n    super();\n\n    if (FoxTheme.config.motionReduced || this.hasAttribute(\"motion-reduced\"))\n      return;\n\n    this.hideGridItems();\n    FoxTheme.Motion.inView(this, this.showGridItems.bind(this), {\n      margin: \"0px 0px -50px 0px\",\n    });\n  }\n\n  get gridItems() {\n    return this.querySelectorAll(\".f-column\");\n  }\n\n  get visibleGridItems() {\n    return this.querySelectorAll(\".f-column:not([style])\");\n  }\n\n  hideGridItems() {\n    FoxTheme.Motion.animate(\n      this.gridItems,\n      { transform: \"translateY(3.5rem)\", opacity: 0.01, visibility: \"hidden\" },\n      { duration: 0 }\n    );\n  }\n\n  showGridItems() {\n    FoxTheme.Motion.animate(\n      this.gridItems,\n      {\n        transform: [\"translateY(3.5rem)\", \"translateY(0)\"],\n        opacity: [0.01, 1],\n        visibility: [\"hidden\", \"visible\"],\n      },\n      {\n        duration: 0.5,\n        delay: FoxTheme.config.motionReduced ? 0 : FoxTheme.Motion.stagger(0.1),\n        easing: [0, 0, 0.3, 1],\n      }\n    );\n  }\n\n  reShowVisibleGridItems() {\n    FoxTheme.Motion.animate(\n      this.visibleGridItems,\n      {\n        transform: [\"translateY(3.5rem)\", \"translateY(0)\"],\n        opacity: [0.01, 1],\n        visibility: [\"hidden\", \"visible\"],\n      },\n      {\n        duration: 0.5,\n        delay: FoxTheme.config.motionReduced ? 0 : FoxTheme.Motion.stagger(0.1),\n        easing: [0, 0, 0.3, 1],\n      }\n    );\n  }\n}\ncustomElements.define(\"grid-list\", GridList);\n\nclass AnnouncementBar extends HTMLElement {\n  constructor() {\n    super();\n    this.announcementItemsWrapper = this.querySelector(\".swiper-wrapper\");\n\n    FoxTheme.Motion.inView(this, this.initializeCarousel.bind(this), {\n      margin: \"200px 0px 200px 0px\",\n    });\n  }\n\n  getNextSlideButton() {\n    return this.querySelector(\".swiper-button-next\");\n  }\n\n  getPrevSlideButton() {\n    return this.querySelector(\".swiper-button-prev\");\n  }\n\n  get getSlideItems() {\n    return (this._cachedSlideItems =\n      this._cachedSlideItems ||\n      Array.from(this.announcementItemsWrapper.children));\n  }\n\n  isAutoplayEnabled() {\n    return this.hasAttribute(\"autoplay\");\n  }\n\n  getAutoplaySpeed() {\n    return this.hasAttribute(\"autoplay\")\n      ? parseInt(this.getAttribute(\"autoplay-speed\")) * 1000\n      : 5000;\n  }\n\n  initializeCarousel() {\n    if (this.getSlideItems.length > 1) {\n      this.carousel = new FoxTheme.Carousel(\n        this,\n        {\n          navigation: {\n            nextEl: this.getNextSlideButton(),\n            prevEl: this.getPrevSlideButton(),\n          },\n          loop: true,\n          autoplay: this.isAutoplayEnabled()\n            ? { delay: this.getAutoplaySpeed(), pauseOnMouseEnter: true }\n            : false,\n        },\n        [FoxTheme.Swiper.Autoplay]\n      );\n      this.carousel && this.carousel.init();\n\n      if (Shopify.designMode) {\n        this.addEventListener(\"shopify:block:select\", (event) => {\n          this.carousel.slider.slideToLoop(\n            this.getSlideItems.indexOf(event.target)\n          );\n        });\n      }\n    }\n  }\n}\ncustomElements.define(\"announcement-bar\", AnnouncementBar);\n\nclass SelectElement extends HTMLElement {\n  constructor() {\n    super();\n\n    FoxTheme.Motion.inView(this, this.init.bind(this), {\n      margin: \"200px 0px 200px 0px\",\n    });\n\n    this.select = this.querySelector(\"select\");\n\n    this.select &&\n      this.select.addEventListener(\n        \"change\",\n        this.handleSelectChange.bind(this)\n      );\n  }\n\n  init() {\n    const style = window.getComputedStyle(this);\n    const value = this.select.options[this.select.selectedIndex].text;\n\n    const text = document.createElement(\"span\");\n    text.style.fontFamily = style.fontFamily;\n    text.style.fontSize = style.fontSize;\n    text.style.fontWeight = style.fontWeight;\n    text.style.visibility = \"hidden\";\n    text.style.position = \"absolute\";\n    text.innerHTML = value;\n\n    document.body.appendChild(text);\n    const width = text.clientWidth;\n\n    this.style.setProperty(\"--width\", `${width}px`);\n    text.remove();\n  }\n\n  handleSelectChange() {\n    this.init();\n  }\n}\ncustomElements.define(\"select-element\", SelectElement);\n\nclass ProductBundleVariantSelector extends HTMLElement {\n  constructor() {\n    super();\n\n    this.cssClasses = {\n      soldOut: \"f-price--sold-out\",\n      onSale: \"f-price--on-sale\",\n      noCompare: \"f-price--no-compare\",\n    };\n\n    this.priceElement = this.querySelector(\".f-price\");\n    this.variantSelect = this.querySelector(\"select\");\n\n    this.variantSelect &&\n      this.variantSelect.addEventListener(\n        \"change\",\n        this.handleVariantChange.bind(this)\n      );\n  }\n\n  handleVariantChange(event) {\n    const variantSelect = event.target;\n    const selectedVariant = variantSelect.options[variantSelect.selectedIndex];\n    const compareAtPrice = parseInt(\n      selectedVariant.dataset.compare_at_price || 0\n    );\n    const price = parseInt(selectedVariant.dataset.price || 0);\n    const available = selectedVariant.dataset.available === \"true\";\n    const priceVaries = variantSelect.dataset.price_varies === \"true\";\n    const compareAtPriceVaries =\n      variantSelect.dataset.compare_at_price_varies === \"true\";\n\n    // Remove classes\n    this.priceElement.classList.remove(this.cssClasses.soldOut);\n    this.priceElement.classList.remove(this.cssClasses.onSale);\n    this.priceElement.classList.remove(this.cssClasses.noCompare);\n\n    // Add classes\n    if (!available) {\n      this.priceElement.classList.add(this.cssClasses.soldOut);\n    } else if (compareAtPrice > price && available) {\n      this.priceElement.classList.add(this.cssClasses.onSale);\n    }\n    if (!priceVaries && compareAtPriceVaries) {\n      this.priceElement.classList.add(this.cssClasses.noCompare);\n    }\n\n    // Change price\n    const regularPriceElement = this.querySelector(\".f-price__regular\");\n    regularPriceElement.querySelector(\n      \".f-price-item--regular\"\n    ).innerHTML = `${FoxTheme.Currency.formatMoney(\n      price,\n      FoxTheme.settings.moneyFormat\n    )}`;\n\n    const salePriceElement = this.querySelector(\".f-price__sale\");\n    salePriceElement.querySelector(\n      \".f-price-item--regular\"\n    ).innerHTML = `<s>${FoxTheme.Currency.formatMoney(\n      compareAtPrice,\n      FoxTheme.settings.moneyFormat\n    )}</s>`;\n    salePriceElement.querySelector(\n      \".f-price-item--sale\"\n    ).innerHTML = `${FoxTheme.Currency.formatMoney(\n      price,\n      FoxTheme.settings.moneyFormat\n    )}`;\n  }\n}\ncustomElements.define(\n  \"product-bundle-variant-selector\",\n  ProductBundleVariantSelector\n);\n\nclass ProductsBundle extends HTMLElement {\n  constructor() {\n    super();\n\n    this.cssClasses = {\n      hover: \"is-hover\",\n      active: \"is-active\",\n    };\n\n    this.cartDrawerElement = document.querySelector(\"cart-drawer\");\n    this.addToCartButtonElement = this.querySelector(\"button\");\n\n    this.addToCartButtonElement &&\n      this.addToCartButtonElement.addEventListener(\n        \"click\",\n        this.handleButtonClick.bind(this)\n      );\n\n    this.productBundleBlocks = this.querySelectorAll(\"[data-block-id]\");\n    this.productBundleBlocks.forEach((block) =>\n      block.addEventListener(\n        \"mouseenter\",\n        this.handleBlockHover.bind(this, \"enter\")\n      )\n    );\n    this.productBundleBlocks.forEach((block) =>\n      block.addEventListener(\n        \"mouseleave\",\n        this.handleBlockHover.bind(this, \"leave\")\n      )\n    );\n  }\n\n  handleBlockHover(type, event) {\n    if (type === \"enter\") {\n      this.classList.add(this.cssClasses.hover);\n      this.toggleBlockActive(event.target, true);\n    } else {\n      this.classList.remove(this.cssClasses.hover);\n      this.toggleBlockActive(null, false);\n    }\n  }\n\n  toggleBlockActive(target, isActive) {\n    this.productBundleBlocks.forEach((block) => {\n      if (target) {\n        if (block.dataset.blockId === target.dataset.blockId) {\n          block.classList.add(this.cssClasses.active);\n        } else {\n          block.classList.remove(this.cssClasses.active);\n        }\n      } else {\n        block.classList.remove(this.cssClasses.active);\n      }\n    });\n  }\n\n  handleButtonClick(event) {\n    event.preventDefault();\n    this.lastClickedElement = event.submitter || event.currentTarget;\n\n    const productIds = this.querySelectorAll('[name=\"id\"]');\n    const items = {\n      items: [...productIds]\n        .map((e) => e.value)\n        .map((e) => ({\n          id: e,\n          quantity: 1,\n        })),\n    };\n\n    if (\n      document.body.classList.contains(\"cart-template\") ||\n      FoxTheme.settings.cartType != \"drawer\"\n    ) {\n      FoxTheme.utils.postLink(FoxTheme.routes.cart_add_url, {\n        parameters: {\n          ...items,\n        },\n      });\n      return;\n    }\n\n    this.showErrorMessage();\n    this.toggleButtonLoading(true);\n\n    let sectionsToBundle = [];\n    document.documentElement.dispatchEvent(\n      new CustomEvent(\"cart:grouped-sections\", {\n        bubbles: true,\n        detail: { sections: sectionsToBundle },\n      })\n    );\n\n    const body = JSON.stringify({\n      ...items,\n      sections: sectionsToBundle,\n      section_url: window.pathname,\n    });\n\n    fetch(`${FoxTheme.routes.cart_add_url}`, {\n      ...FoxTheme.utils.fetchConfig(\"javascript\"),\n      ...{ body },\n    })\n      .then((response) => response.json())\n      .then(async (parsedState) => {\n        if (parsedState.status) {\n          this.showErrorMessage(parsedState.description);\n          return;\n        }\n        if (parsedState.status === 422) {\n          document.dispatchEvent(\n            new CustomEvent(\"product-ajax:error\", {\n              detail: {\n                errorMessage: parsedState.description,\n              },\n            })\n          );\n        } else {\n          const cartJson = await (\n            await fetch(`${FoxTheme.routes.cart_url}`, {\n              ...FoxTheme.utils.fetchConfig(),\n            })\n          ).json();\n          cartJson[\"sections\"] = parsedState[\"sections\"];\n\n          FoxTheme.pubsub.publish(FoxTheme.pubsub.PUB_SUB_EVENTS.cartUpdate, {\n            cart: cartJson,\n          });\n          document.dispatchEvent(\n            new CustomEvent(\"product-ajax:added\", {\n              detail: {\n                product: parsedState,\n              },\n            })\n          );\n          this.cartDrawerElement &&\n            this.cartDrawerElement.show(this.lastClickedElement);\n        }\n      })\n      .catch((e) => {\n        console.error(e);\n      })\n      .finally(() => {\n        this.toggleButtonLoading(false);\n      });\n  }\n\n  showErrorMessage(errorMessage = false) {\n    this.errorMessageElement =\n      this.errorMessageElement ||\n      this.querySelector(\".product-form__error-message\");\n    if (this.errorMessageElement) {\n      this.errorMessageElement.hidden = !errorMessage;\n\n      if (errorMessage) this.errorMessageElement.textContent = errorMessage;\n    } else {\n      errorMessage && alert(errorMessage);\n    }\n  }\n\n  toggleButtonLoading(status) {\n    if (status) {\n      this.addToCartButtonElement.classList.add(\"btn--loading\");\n      this.addToCartButtonElement.setAttribute(\"disabled\", true);\n    } else {\n      this.addToCartButtonElement.classList.remove(\"btn--loading\");\n      this.addToCartButtonElement.removeAttribute(\"disabled\");\n    }\n  }\n}\ncustomElements.define(\"products-bundle\", ProductsBundle);\n\nclass ProductRecentlyViewed extends HTMLElement {\n  constructor() {\n    super();\n\n    if (FoxTheme.config.hasLocalStorage) {\n      const productId = parseInt(this.dataset.productId);\n      const cookieName = \"hypertheme:recently-viewed\";\n      const items = JSON.parse(window.localStorage.getItem(cookieName) || \"[]\");\n\n      if (items.includes(productId)) {\n        items.splice(items.indexOf(productId), 1);\n      }\n\n      items.unshift(productId);\n\n      window.localStorage.setItem(\n        cookieName,\n        JSON.stringify(items.slice(0, 20))\n      );\n    }\n  }\n}\ncustomElements.define(\"product-recently-viewed\", ProductRecentlyViewed);\n\nclass MotionElement extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  connectedCallback() {\n    if (FoxTheme.config.motionReduced) return;\n    this.preInitialize();\n    FoxTheme.Motion.inView(\n      this,\n      async () => {\n        if (!this.isInstant && this.media)\n          await FoxTheme.utils.imageReady(this.media);\n        this.initialize();\n      },\n      { margin: \"0px 0px -80px 0px\" }\n    );\n  }\n\n  get isHold() {\n    return this.hasAttribute(\"hold\");\n  }\n\n  get isInstant() {\n    return this.hasAttribute(\"data-instantly\");\n  }\n\n  get mediaElements() {\n    return Array.from(this.querySelectorAll(\"img, iframe, svg\"));\n  }\n\n  get animationType() {\n    return this.dataset.motion || \"fade-up\";\n  }\n\n  get animationDelay() {\n    return parseInt(this.dataset.motionDelay || 0) / 1000;\n  }\n\n  preInitialize() {\n    if (this.isHold) return;\n    switch (this.animationType) {\n      case \"fade-in\":\n        FoxTheme.Motion.animate(this, { opacity: 0.01 }, { duration: 0 });\n        break;\n\n      case \"fade-up\":\n        FoxTheme.Motion.animate(\n          this,\n          { transform: \"translateY(2.5rem)\", opacity: 0.01 },\n          { duration: 0 }\n        );\n        break;\n\n      case \"zoom-in\":\n        FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(0.8)\" },\n          { duration: 0 }\n        );\n        break;\n      case \"zoom-in-lg\":\n        FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(0)\" },\n          { duration: 0 }\n        );\n        break;\n\n      case \"zoom-out\":\n        FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(1.08)\" },\n          { duration: 0 }\n        );\n        break;\n\n      case \"zoom-out-sm\":\n        FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(1.03)\" },\n          { duration: 0 }\n        );\n    }\n  }\n\n  async initialize() {\n    if (this.isHold) return;\n\n    switch (this.animationType) {\n      case \"fade-in\":\n        await FoxTheme.Motion.animate(\n          this,\n          { opacity: 1 },\n          { duration: 1.5, delay: this.animationDelay, easing: [0, 0, 0.3, 1] }\n        ).finished;\n        break;\n\n      case \"fade-up\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"translateY(0)\", opacity: 1 },\n          { duration: 0.5, delay: this.animationDelay, easing: [0, 0, 0.3, 1] }\n        ).finished;\n        break;\n\n      case \"zoom-in\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(1)\" },\n          { duration: 1.3, delay: this.animationDelay, easing: [0, 0, 0.3, 1] }\n        ).finished;\n        break;\n\n      case \"zoom-in-lg\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(1)\" },\n          { duration: 0.5, delay: this.animationDelay, easing: [0, 0, 0.3, 1] }\n        ).finished;\n        break;\n\n      case \"zoom-out\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(1)\" },\n          { duration: 1.5, delay: this.animationDelay, easing: [0, 0, 0.3, 1] }\n        ).finished;\n        break;\n\n      case \"zoom-out-sm\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(1)\" },\n          { duration: 1, delay: this.animationDelay, easing: [0, 0, 0.3, 1] }\n        ).finished;\n        break;\n    }\n  }\n\n  async resetAnimation(duration) {\n    switch (this.animationType) {\n      case \"fade-in\":\n        await FoxTheme.Motion.animate(\n          this,\n          { opacity: 0 },\n          {\n            duration: duration ? duration : 1.5,\n            delay: this.animationDelay,\n            easing: duration ? \"none\" : [0, 0, 0.3, 1],\n          }\n        ).finished;\n        break;\n\n      case \"fade-up\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"translateY(2.5rem)\", opacity: 0 },\n          {\n            duration: duration ? duration : 0.5,\n            delay: this.animationDelay,\n            easing: duration ? \"none\" : [0, 0, 0.3, 1],\n          }\n        ).finished;\n        break;\n\n      case \"zoom-in\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(0)\" },\n          {\n            duration: duration ? duration : 1.3,\n            delay: this.animationDelay,\n            easing: duration ? \"none\" : [0, 0, 0.3, 1],\n          }\n        ).finished;\n        break;\n\n      case \"zoom-in-lg\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(0)\" },\n          {\n            duration: duration ? duration : 1.3,\n            delay: this.animationDelay,\n            easing: duration ? \"none\" : [0, 0, 0.3, 1],\n          }\n        ).finished;\n        break;\n\n      case \"zoom-out\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(0)\" },\n          {\n            duration: duration ? duration : 1.3,\n            delay: this.animationDelay,\n            easing: duration ? \"none\" : [0.16, 1, 0.3, 1],\n          }\n        ).finished;\n        break;\n\n      case \"zoom-out-sm\":\n        await FoxTheme.Motion.animate(\n          this,\n          { transform: \"scale(0)\" },\n          {\n            duration: duration ? duration : 1.3,\n            delay: this.animationDelay,\n            easing: duration ? \"none\" : [0.16, 1, 0.3, 1],\n          }\n        ).finished;\n        break;\n    }\n  }\n\n  refreshAnimation() {\n    this.removeAttribute(\"hold\");\n    this.preInitialize();\n    setTimeout(() => {\n      this.initialize();\n    }, 50); // Delay a bit to make animation re init properly.\n  }\n}\ncustomElements.define(\"motion-element\", MotionElement);\n\nclass TabsComponent extends HTMLElement {\n  constructor() {\n    super();\n    this.selectors = {\n      tabHeader: '[role=\"tablist\"]',\n      tabPanels: ['[role=\"tabpanel\"]'],\n      tabNavs: ['[role=\"tab\"]'],\n      tabSelect: \"tab-selector\",\n      tabNav: \".tabs__nav-js\",\n    };\n    this.domNodes = FoxTheme.utils.queryDomNodes(this.selectors, this);\n\n    this.selectedIndex = 0;\n    this.selectedTab = this.domNodes.tabPanels[this.selectedIndex];\n    this.scrollToActiveTab = this.dataset.scrollToActiveTab === \"true\";\n    this.scrollOffset = 20;\n    this.headerEl = document.querySelector(\n      '.header-section header[is=\"sticky-header\"]'\n    );\n\n    this.init();\n    this.setActiveTab(0);\n\n    this.tabChange = new CustomEvent(\"tabChange\", {\n      bubbles: true,\n      detail: { selectedTab: this.selectedTab },\n    });\n  }\n\n  connectedCallback() {\n    this.setActiveTab(0);\n  }\n\n  init = () => {\n    this.buttons.forEach((tab) => {\n      tab.addEventListener(\"click\", this.onTabClick.bind(this));\n    });\n    this.domNodes.tabHeader &&\n      this.domNodes.tabHeader.addEventListener(\n        \"keydown\",\n        this.handleKeyDown.bind(this)\n      );\n    this.setAccessible();\n  };\n\n  static get observedAttributes() {\n    return [\"data-selected\"];\n  }\n\n  get buttons() {\n    return (this._buttons = this._buttons || Array.from(this.domNodes.tabNavs));\n  }\n\n  getHeaderHeight() {\n    let headerHeight = 0;\n\n    if (this.headerEl) {\n      const height = Math.round(this.headerEl.offsetHeight);\n      if (this.headerEl.isAlwaysSticky) {\n        headerHeight = height;\n      } else {\n        const isSticky = document.body.classList.contains(\n          this.headerEl.classes.pinned\n        );\n\n        if (window.scrollY > this.offsetTop - this.scrollOffset) {\n          headerHeight = height;\n        }\n\n        if (\n          isSticky &&\n          window.scrollY >= this.offsetTop - this.scrollOffset - height\n        ) {\n          headerHeight = height;\n        }\n      }\n    }\n\n    return headerHeight;\n  }\n\n  scrollToTop() {\n    let offsetTop = this.offsetTop - this.scrollOffset - this.getHeaderHeight();\n    window.scrollTo({ top: offsetTop, behavior: \"smooth\" });\n  }\n\n  onTabClick(evt) {\n    evt.preventDefault();\n    const currentTab = evt.currentTarget;\n    const index = currentTab ? Number(currentTab.dataset.index) : 0;\n    this.setActiveTab(index);\n\n    if (this.scrollToActiveTab) {\n      this.scrollToTop();\n    }\n  }\n\n  setActiveTab = (tabIndex) => {\n    const { tabNavs, tabPanels, tabSelect } = this.domNodes;\n    if (tabIndex !== -1) {\n      const newHeader = tabNavs && tabNavs[tabIndex];\n      const newTab = tabPanels && tabPanels[tabIndex];\n      this.setAttribute(\"data-selected\", tabIndex);\n\n      tabNavs.forEach((nav) => nav.setAttribute(\"aria-selected\", false));\n\n      newHeader && newHeader.setAttribute(\"aria-selected\", true);\n\n      this.selectedIndex = tabIndex;\n      this.selectedTab = newTab;\n\n      this.dispatchEvent(\n        new CustomEvent(\"tabChange\", {\n          bubbles: true,\n          detail: { selectedIndex: tabIndex, selectedTab: newTab },\n        })\n      );\n\n      if (tabSelect) {\n        tabSelect.querySelector(\"select\").value = tabIndex;\n      }\n    }\n  };\n\n  setAccessible() {\n    const { tabNavs, tabPanels } = this.domNodes;\n    tabNavs.forEach((tab, index) => {\n      if (tab.id) tabPanels[index].setAttribute(\"aria-labelledby\", tab.id);\n      tab.setAttribute(\"aria-selected\", index === 0);\n      tab.setAttribute(\"data-index\", index);\n      if (index !== 0) {\n        // tab.setAttribute('tabindex', -1);\n      }\n    });\n    tabPanels.forEach((panel, index) => {\n      if (panel.id) tabNavs[index].setAttribute(\"aria-controls\", panel.id);\n      panel.setAttribute(\"tabindex\", 0);\n    });\n  }\n\n  handleKeyDown(e) {\n    const { tabNavs } = this.domNodes;\n    if (e.keyCode === 39 || e.keyCode === 37) {\n      tabNavs[this.selectedIndex].setAttribute(\"tabindex\", -1);\n      if (e.keyCode === 39) {\n        this.selectedIndex++;\n        // If we're at the end, go to the start.\n        if (this.selectedIndex >= tabNavs.length) {\n          this.selectedIndex = 0;\n        }\n        // Move left.\n      } else if (e.keyCode === 37) {\n        this.selectedIndex--;\n        // If we're at the start, move to the end.\n        if (this.selectedIndex < 0) {\n          this.selectedIndex = tabNavs.length - 1;\n        }\n      }\n\n      tabNavs[this.selectedIndex].setAttribute(\"tabindex\", 0);\n      tabNavs[this.selectedIndex].focus();\n    }\n  }\n\n  getSelected() {\n    return {\n      index: this.selectedIndex,\n      element: this.selectedTab,\n    };\n  }\n\n  attributeChangedCallback(name, oldValue, newValue) {\n    if (\n      name === \"data-selected\" &&\n      oldValue !== null &&\n      oldValue !== newValue\n    ) {\n      const fromButton = this.buttons[parseInt(oldValue)];\n      const toButton = this.buttons[parseInt(newValue)];\n      this.transition(\n        document.getElementById(fromButton.getAttribute(\"aria-controls\")),\n        document.getElementById(toButton.getAttribute(\"aria-controls\"))\n      );\n\n      this.scrollToActiveButton(toButton);\n    }\n  }\n\n  scrollToActiveButton(toButton) {\n    const containerGap = 15;\n    const scrollRect = toButton.getBoundingClientRect();\n    const boxRect = this.domNodes.tabNav.getBoundingClientRect();\n    const scrollLeft = this.domNodes.tabNav.scrollLeft;\n    const scrollOffset = scrollRect.x + scrollLeft - boxRect.x - containerGap;\n\n    this.domNodes.tabNav.scrollTo({\n      left: scrollOffset,\n      behavior: \"smooth\",\n    });\n  }\n\n  async transition(fromPanel, toPanel) {\n    await FoxTheme.Motion.animate(\n      fromPanel,\n      { transform: [\"translateY(0)\", \"translateY(2rem)\"], opacity: [1, 0] },\n      { duration: 0.3 }\n    ).finished;\n\n    fromPanel.hidden = true;\n    toPanel.hidden = false;\n\n    FoxTheme.Motion.animate(\n      toPanel,\n      { transform: [\"translateY(2rem)\", \"translateY(0)\"], opacity: [0, 1] },\n      { duration: 0.3 }\n    ).finished;\n\n    toPanel.querySelector(\"grid-list\") &&\n      toPanel.querySelector(\"grid-list\").showGridItems();\n  }\n}\ncustomElements.define(\"tabs-component\", TabsComponent);\n\nclass TabSelector extends HTMLElement {\n  constructor() {\n    super();\n\n    this.tabs = this.closest(\"tabs-component\");\n\n    this.querySelector(\"select\").addEventListener(\"change\", (e) => {\n      this.tabs.setActiveTab(e.target.value);\n    });\n  }\n}\ncustomElements.define(\"tab-selector\", TabSelector);\n\nclass Parallax extends HTMLElement {\n  get parallax() {\n    return this.dataset.parallax ? parseFloat(this.dataset.parallax) : false;\n  }\n\n  get parallaxDirection() {\n    return this.dataset.parallaxDirection || \"vertical\";\n  }\n\n  get parallaxMediaElements() {\n    return Array.from(\n      this.querySelectorAll(\"img, video, iframe, svg, video-element\")\n    );\n  }\n\n  connectedCallback() {\n    if (this.shouldInitializeParallax()) {\n      this.setupParallax();\n    }\n  }\n\n  shouldInitializeParallax() {\n    return !FoxTheme.config.motionReduced && this.parallax;\n  }\n\n  setupParallax() {\n    const parallaxScale = 1 + this.parallax;\n    const parallaxTranslate = (this.parallax * 100) / (1 + this.parallax);\n\n    let parallaxTransformProperties = {};\n\n    if (this.parallaxDirection === \"vertical\") {\n      parallaxTransformProperties = {\n        transform: [\n          `scale(${parallaxScale}) translateY(0)`,\n          `scale(${parallaxScale}) translateY(${parallaxTranslate}%)`,\n        ],\n        transformOrigin: [\"bottom\", \"bottom\"],\n      };\n    } else if (this.parallaxDirection === \"horizontal\") {\n      parallaxTransformProperties = {\n        transform: [\n          `scale(${parallaxScale}) translateX(0)`,\n          `scale(${parallaxScale}) translateX(${parallaxTranslate}%)`,\n        ],\n        transformOrigin: [\"right\", \"right\"],\n      };\n    } else {\n      parallaxTransformProperties = {\n        transform: [`scale(1)`, `scale(${parallaxScale})`],\n        transformOrigin: [\"center\", \"center\"],\n      };\n    }\n\n    FoxTheme.Motion.scroll(\n      FoxTheme.Motion.animate(\n        this.parallaxMediaElements,\n        parallaxTransformProperties,\n        { easing: \"linear\" }\n      ),\n      {\n        target: this,\n        offset: [\"start end\", \"end start\"],\n      }\n    );\n  }\n}\ncustomElements.define(\"parallax-element\", Parallax);\n\nclass ProductForm extends HTMLFormElement {\n  constructor() {\n    super();\n\n    this.productIdInput = this.querySelector(\"[name=id]\");\n    this.productIdInput.disabled = false;\n    this.addEventListener(\"submit\", this.handleFormSubmit);\n  }\n\n  get cartDrawerElement() {\n    return document.querySelector(\"cart-drawer\");\n  }\n\n  get submitButtonElement() {\n    return (this._submitButtonElement =\n      this._submitButtonElement || this.querySelector('[type=\"submit\"]'));\n  }\n\n  get isHideErrors() {\n    return this.dataset.hideErrors === \"true\";\n  }\n\n  handleFormSubmit = (event) => {\n    if (FoxTheme.settings.cartType === \"page\") return;\n\n    event.preventDefault();\n    if (this.submitButtonElement.getAttribute(\"aria-disabled\") === \"true\")\n      return;\n    this.lastSubmittedElement = event.submitter || event.currentTarget;\n\n    this.displayFormErrors();\n\n    let sectionsToBundle = [];\n    document.documentElement.dispatchEvent(\n      new CustomEvent(\"cart:grouped-sections\", {\n        bubbles: true,\n        detail: { sections: sectionsToBundle },\n      })\n    );\n\n    const config = FoxTheme.utils.fetchConfig(\"javascript\");\n    config.headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n    delete config.headers[\"Content-Type\"];\n\n    this.formData = new FormData(this);\n    this.formData.append(\"sections\", sectionsToBundle);\n    this.formData.append(\"sections_url\", window.location.pathname);\n\n    config.body = this.formData;\n\n    this.submitButtonElement.setAttribute(\"aria-disabled\", \"true\");\n    this.submitButtonElement.classList.add(\"btn--loading\");\n\n    this.handleFormSubmission(config);\n  };\n\n  displayFormErrors = (errorMessage = false) => {\n    if (this.isHideErrors) return;\n\n    this.formErrorMessage =\n      this.formErrorMessage ||\n      this.querySelector(\".product-form__error-message\");\n    if (!this.formErrorMessage) {\n      if (errorMessage !== false) {\n        alert(errorMessage);\n      }\n    } else {\n      this.formErrorMessage.toggleAttribute(\"hidden\", !errorMessage);\n      if (errorMessage !== false) {\n        this.formErrorMessage.innerText = errorMessage;\n      }\n    }\n  };\n\n  resetFormState() {\n    this.hasError = false;\n    this.submitButtonElement.removeAttribute(\"aria-disabled\");\n    this.displayFormErrors();\n  }\n\n  handleFormSubmission = (config) => {\n    fetch(`${FoxTheme.routes.cart_add_url}`, config)\n      .then((response) => response.json())\n      .then(async (parsedState) => {\n        if (parsedState.status) {\n          this.handleCartError(parsedState);\n          return;\n        }\n\n        const cartJson = await (\n          await fetch(`${FoxTheme.routes.cart_url}`, {\n            ...FoxTheme.utils.fetchConfig(),\n          })\n        ).json();\n        cartJson[\"sections\"] = parsedState[\"sections\"];\n\n        this.updateCartState(cartJson);\n        this.dispatchProductAddedEvent(parsedState);\n\n        this.showCartDrawer();\n      })\n      .catch((error) => {\n        console.log(error);\n      })\n      .finally(() => {\n        this.submitButtonElement.classList.remove(\"btn--loading\");\n\n        if (!this.hasError) {\n          this.submitButtonElement.removeAttribute(\"aria-disabled\");\n        }\n      });\n  };\n\n  handleCartError = (parsedState) => {\n    FoxTheme.pubsub.publish(FoxTheme.pubsub.PUB_SUB_EVENTS.cartError, {\n      source: \"product-form\",\n      productVariantId: this.formData.get(\"id\"),\n      errors: parsedState.errors || parsedState.description,\n      message: parsedState.message,\n    });\n    this.displayFormErrors(parsedState.description);\n    document.dispatchEvent(\n      new CustomEvent(\"product-ajax:error\", {\n        detail: {\n          errorMessage: parsedState.description,\n        },\n      })\n    );\n    this.hasError = true;\n  };\n\n  updateCartState = (cartJson) => {\n    FoxTheme.pubsub.publish(FoxTheme.pubsub.PUB_SUB_EVENTS.cartUpdate, {\n      cart: cartJson,\n    });\n  };\n\n  dispatchProductAddedEvent = (parsedState) => {\n    document.dispatchEvent(\n      new CustomEvent(\"product-ajax:added\", {\n        detail: {\n          product: parsedState,\n        },\n      })\n    );\n  };\n\n  showCartDrawer = () => {\n    const quickViewModal = this.closest(\"quick-view-modal\");\n    if (quickViewModal) {\n      if (this.cartDrawerElement && !this.cartDrawerElement.open) {\n        document.body.addEventListener(\n          quickViewModal.events.handleAfterHide,\n          () => {\n            setTimeout(() => {\n              this.cartDrawerElement.show(this.lastSubmittedElement);\n            });\n          },\n          { once: true }\n        );\n      }\n\n      quickViewModal.hide(true);\n    } else {\n      this.cartDrawerElement &&\n        this.cartDrawerElement.show(this.lastSubmittedElement);\n    }\n  };\n}\ncustomElements.define(\"product-form\", ProductForm, { extends: \"form\" });\n\nclass NewsletterForm extends HTMLFormElement {\n  constructor() {\n    super();\n\n    this.selectors = {\n      subscribedMessage: \"[id*=Newsletter-error-subscribed]\",\n    };\n\n    this.init();\n  }\n\n  /**\n   * Show message when user re-subscribe with exists email.\n   */\n  init() {\n    const liveUrl = window.location.href;\n    const result = liveUrl.includes(\"form_type=customer\");\n    const inputVal = this.querySelector('[id*=\"NewsletterForm\"]').value.length;\n    const messageElement = this.querySelector(this.selectors.subscribedMessage);\n\n    if (result && inputVal != 0 && messageElement) {\n      messageElement.classList.remove(\"hidden\");\n    }\n  }\n}\ncustomElements.define(\"newsletter-form\", NewsletterForm, { extends: \"form\" });\n\nclass ColorSwatch extends HTMLUListElement {\n  constructor() {\n    super();\n\n    this.selectors = {\n      card: \".product-card\",\n      mainImg: \".product-card__image--main img\",\n      swatches: \".swatch-item\",\n      variantImg: \".color-swatch--variant-image\",\n    };\n\n    this.hoverTracker = null;\n  }\n\n  connectedCallback() {\n    this.optionNodes = this.querySelectorAll(this.selectors.swatches);\n    this.init();\n  }\n\n  init() {\n    this.abortController = new AbortController();\n\n    this.pcard = this.closest(this.selectors.card);\n    this.mainImage = this.pcard.querySelector(this.selectors.mainImg);\n\n    this.optionNodes.forEach((button) => {\n      button.addEventListener(\"mouseenter\", this.onMouseEnter.bind(this), {\n        signal: this.abortController.signal,\n      });\n    });\n  }\n\n  onMouseEnter(e) {\n    const { target } = e;\n    const variantImage = target.querySelector(this.selectors.variantImg);\n\n    clearTimeout(this.hoverTracker);\n    this.hoverTracker = setTimeout(() => {\n      this.selected && this.selected.removeAttribute(\"aria-selected\");\n      target.setAttribute(\"aria-selected\", true);\n      this.selected = target;\n\n      if (this.mainImage && variantImage) {\n        this.mainImage.src = variantImage.src;\n        this.mainImage.srcset = variantImage.srcset;\n      }\n    }, 50);\n  }\n\n  disconnectedCallback() {\n    this.abortController.abort();\n  }\n}\ncustomElements.define(\"color-swatch\", ColorSwatch, { extends: \"ul\" });\n\nclass ScrollingPromotion extends HTMLElement {\n  constructor() {\n    super();\n    if (FoxTheme.config.motionReduced) return;\n    this.promotion = this.querySelector(\".promotion\");\n    this.repeatTimes =\n      typeof this.dataset.repeats !== \"undefined\"\n        ? Number(this.dataset.repeats)\n        : 10;\n\n    FoxTheme.Motion.inView(this, this.init.bind(this), {\n      margin: \"200px 0px 200px 0px\",\n    });\n  }\n  init() {\n    if (this.childElementCount === 1) {\n      this.promotion.classList.add(\"promotion--animated\");\n\n      for (let index = 0; index < this.repeatTimes; index++) {\n        this.clone = this.promotion.cloneNode(true);\n        this.appendChild(this.clone);\n      }\n\n      // Pause when out of view.\n      const observer = new IntersectionObserver(\n        (entries, _observer) => {\n          entries.forEach((entry) => {\n            if (entry.isIntersecting) {\n              this.scrollingPlay();\n            } else {\n              this.scrollingPause();\n            }\n          });\n        },\n        { rootMargin: \"0px 0px 50px 0px\" }\n      );\n\n      observer.observe(this);\n    }\n  }\n\n  scrollingPlay() {\n    this.classList.remove(\"scrolling-promotion--paused\");\n  }\n\n  scrollingPause() {\n    this.classList.add(\"scrolling-promotion--paused\");\n  }\n}\ncustomElements.define(\"scrolling-promotion\", ScrollingPromotion);\n\nclass ScrollingTextBanner extends HTMLElement {\n  constructor() {\n    super();\n    if (FoxTheme.config.motionReduced) return;\n    this.track = this.querySelector(\".scrolling-text-banner__track\");\n    this.items = this.track\n      ? Array.from(this.track.querySelectorAll(\".scrolling-text-banner__item\"))\n      : [];\n    this.currentIndex = 0;\n    this.transitionDuration = Number(this.dataset.transitionDuration) || 3;\n    this.transitionEffect = this.dataset.transitionEffect || \"slide\";\n    this.intervalId = null;\n    this.isPaused = false;\n    this.isHovered = false;\n    this.isInView = false;\n\n    FoxTheme.Motion.inView(this, this.init.bind(this), {\n      margin: \"200px 0px 200px 0px\",\n    });\n  }\n\n  init() {\n    if (this.items.length > 0) {\n      this.showItem(0);\n    }\n\n    if (this.items.length <= 1) return;\n\n    if (this.dataset.pauseOnHover) {\n      const handleMouseEnter = (e) => {\n        this.isHovered = true;\n        this.pause();\n      };\n\n      const handleMouseLeave = (e) => {\n        this.isHovered = false;\n        this.isPaused = false;\n      };\n\n      const parentSection = this.closest(\".scrolling-text-banner\");\n\n      if (parentSection) {\n        parentSection.addEventListener(\"mouseenter\", handleMouseEnter);\n        parentSection.addEventListener(\"mouseleave\", handleMouseLeave);\n        parentSection.addEventListener(\"mouseover\", handleMouseEnter);\n        parentSection.addEventListener(\"mouseout\", handleMouseLeave);\n      }\n\n      this.addEventListener(\"mouseenter\", handleMouseEnter);\n      this.addEventListener(\"mouseleave\", handleMouseLeave);\n      this.addEventListener(\"mouseover\", handleMouseEnter);\n      this.addEventListener(\"mouseout\", handleMouseLeave);\n\n      if (this.track) {\n        this.track.addEventListener(\"mouseenter\", handleMouseEnter);\n        this.track.addEventListener(\"mouseleave\", handleMouseLeave);\n        this.track.addEventListener(\"mouseover\", handleMouseEnter);\n        this.track.addEventListener(\"mouseout\", handleMouseLeave);\n      }\n\n      this.items.forEach((item, index) => {\n        item.addEventListener(\"mouseenter\", handleMouseEnter);\n        item.addEventListener(\"mouseleave\", handleMouseLeave);\n      });\n    }\n\n    const observer = new IntersectionObserver(\n      (entries, _observer) => {\n        entries.forEach((entry) => {\n          const wasInView = this.isInView;\n          this.isInView = entry.isIntersecting;\n\n          if (entry.isIntersecting) {\n            // Coming back into view\n            if (!wasInView || !this.intervalId) {\n              // Was out of view or interval was cleared - restart\n              if (!this.isHovered) {\n                this.play();\n              }\n            } else if (!this.isPaused && !this.isHovered) {\n              // Already in view, just ensure it's playing\n              this.isPaused = false;\n            }\n          } else {\n            // Going out of view\n            this.stop();\n          }\n        });\n      },\n      { rootMargin: \"0px 0px 50px 0px\" }\n    );\n\n    observer.observe(this);\n\n    // Handle tab visibility change (when user switches tabs)\n    const handleVisibilityChange = () => {\n      if (document.hidden) {\n        // Tab is hidden - pause but don't stop\n        this.isPaused = true;\n      } else {\n        // Tab is visible again - resume if in view and not hovered\n        if (this.isInView && !this.isHovered) {\n          // Check if interval is still running\n          if (!this.intervalId) {\n            this.play();\n          } else {\n            // Interval exists but might be paused, resume it\n            this.isPaused = false;\n          }\n        }\n      }\n    };\n\n    document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n    // Handle window focus/blur as backup\n    const handleFocus = () => {\n      if (this.isInView && !this.isHovered && !this.intervalId) {\n        this.play();\n      }\n    };\n\n    const handleBlur = () => {\n      this.isPaused = true;\n    };\n\n    window.addEventListener(\"focus\", handleFocus);\n    window.addEventListener(\"blur\", handleBlur);\n\n    // Store cleanup function\n    this._cleanup = () => {\n      document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n      window.removeEventListener(\"focus\", handleFocus);\n      window.removeEventListener(\"blur\", handleBlur);\n    };\n\n    this.isInView = true;\n    this.play();\n  }\n\n  showItem(index) {\n    // Remove active class from all items\n    this.items.forEach((item) => {\n      item.classList.remove(\n        \"scrolling-text-banner__item--active\",\n        \"scrolling-text-banner__item--prev\"\n      );\n    });\n\n    // Add prev class to previous item\n    if (this.currentIndex !== index && this.items[this.currentIndex]) {\n      this.items[this.currentIndex].classList.add(\n        \"scrolling-text-banner__item--prev\"\n      );\n    }\n\n    // Set new current index and show new item\n    this.currentIndex = index;\n    if (this.items[this.currentIndex]) {\n      this.items[this.currentIndex].classList.add(\n        \"scrolling-text-banner__item--active\"\n      );\n    }\n  }\n\n  next() {\n    const nextIndex = (this.currentIndex + 1) % this.items.length;\n    this.showItem(nextIndex);\n  }\n\n  play() {\n    if (this.items.length <= 1 || this.isHovered) {\n      return;\n    }\n\n    this.isPaused = false;\n\n    // Always clear existing interval before creating new one\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n\n    this.intervalId = setInterval(() => {\n      // Double check hover state by checking if element matches :hover\n      const isCurrentlyHovered =\n        this.matches(\":hover\") ||\n        (this.track && this.track.matches(\":hover\")) ||\n        (this.closest(\".scrolling-text-banner\") &&\n          this.closest(\".scrolling-text-banner\").matches(\":hover\"));\n\n      // If hover state changed\n      if (isCurrentlyHovered && !this.isHovered) {\n        this.isHovered = true;\n        this.isPaused = true; // Pause logic but keep interval running\n        return;\n      }\n\n      // If no longer hovered, resume\n      if (!isCurrentlyHovered && this.isHovered) {\n        this.isHovered = false;\n        this.isPaused = false;\n        // Continue to next() call below\n      }\n\n      // Only proceed if not paused and not hovered\n      if (!this.isPaused && !this.isHovered && !isCurrentlyHovered) {\n        this.next();\n      }\n    }, this.transitionDuration * 1000);\n  }\n\n  pause() {\n    this.isPaused = true;\n    // Don't clear interval - let it keep running to detect hover state changes\n    // Only clear interval when component is disconnected or out of view\n  }\n\n  stop() {\n    // Complete stop - clear interval (used when out of view)\n    this.isPaused = true;\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n  }\n\n  disconnectedCallback() {\n    this.stop();\n    if (this._cleanup) {\n      this._cleanup();\n    }\n  }\n}\ncustomElements.define(\"scrolling-text-banner\", ScrollingTextBanner);\n\nclass ReadMore extends HTMLElement {\n  constructor() {\n    super();\n\n    this.selectors = {\n      content: \".read-more__content\",\n      button: \".read-more__toggle\",\n      buttonText: \".button-text\",\n    };\n\n    this.classes = {\n      isDisabled: \"is-disabled\",\n      isCollapsed: \"is-collapsed\",\n    };\n\n    this.abortController = new AbortController();\n\n    this.toggleClass = this.dataset.toggleClass;\n    this.showText = this.dataset.showText;\n    this.hideText = this.dataset.hideText;\n    this.buttonEl = this.querySelector(this.selectors.button);\n    this.contentEl = this.querySelector(this.selectors.content);\n\n    this.buttonEl.addEventListener(\"click\", this.onClick.bind(this), {\n      signal: this.abortController.signal,\n    });\n\n    this.init();\n  }\n\n  init() {\n    this.classList.remove(this.classes.isDisabled);\n    this.contentEl.classList.remove(this.toggleClass);\n    this.showLess();\n  }\n\n  showMore() {\n    this.contentEl.classList.remove(this.toggleClass);\n    this.classList.remove(this.classes.isCollapsed);\n    this.buttonEl.querySelector(this.selectors.buttonText).textContent =\n      this.hideText;\n    this.resetHeight();\n  }\n\n  showLess() {\n    this.contentEl.classList.add(this.toggleClass);\n    this.classList.add(this.classes.isCollapsed);\n    this.buttonEl.querySelector(this.selectors.buttonText).textContent =\n      this.showText;\n    this.setHeight();\n  }\n\n  setHeight() {\n    const lineHeight = parseFloat(\n      window.getComputedStyle(this.contentEl).lineHeight\n    );\n    const lines = parseInt(\n      window.getComputedStyle(this.contentEl).getPropertyValue(\"--line-clamp\")\n    );\n    const maxHeight = lineHeight * lines;\n    this.contentEl.style.setProperty(\"max-height\", maxHeight + \"px\");\n  }\n\n  resetHeight() {\n    this.contentEl.style.removeProperty(\"max-height\");\n  }\n\n  onClick(evt) {\n    if (this.contentEl.classList.contains(this.toggleClass)) {\n      this.showMore();\n    } else {\n      this.showLess();\n    }\n  }\n\n  disconnectedCallback() {\n    this.abortController.abort();\n  }\n}\ncustomElements.define(\"read-more\", ReadMore);\n\nclass CopyToClipboard extends HTMLButtonElement {\n  constructor() {\n    super();\n\n    this.clickHandler = this.onClick.bind(this);\n  }\n\n  connectedCallback() {\n    this.addEventListener(\"click\", this.clickHandler);\n  }\n\n  onClick() {\n    const valueToCopy = this.dataset.copyValue;\n    const buttonTextEl = this.querySelector(\".btn__text\");\n\n    try {\n      navigator.clipboard.writeText(valueToCopy);\n      buttonTextEl.innerText = this.dataset.copiedText;\n    } catch (error) {}\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener(\"click\", this.clickHandler);\n  }\n}\ncustomElements.define(\"copy-to-clipboard\", CopyToClipboard, {\n  extends: \"button\",\n});\n\nclass ScrollProgressBar extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  get totalWidth() {\n    return this.contentContainer.offsetWidth;\n  }\n\n  connectedCallback() {\n    // Create media query list\n    this.mediaQuery = window.matchMedia(FoxTheme.config.mediaQueryMobile);\n\n    // Create ResizeObserver\n    this.resizeObserver = new ResizeObserver(() => {\n      if (this.mediaQuery.matches) {\n        this.init();\n      }\n    });\n\n    // Store media query handler\n    this.mediaQueryHandler = (event) => {\n      if (event.matches) {\n        this.init();\n      } else {\n        this.disable();\n      }\n    };\n\n    // Add media query change listener\n    this.mediaQuery.addEventListener(\"change\", this.mediaQueryHandler);\n\n    // Initial check\n    if (!this.mediaQuery.matches) {\n      this.disable();\n      return;\n    }\n\n    this.init();\n  }\n\n  init() {\n    const targetId = this.getAttribute(\"target\");\n    this.target = document.getElementById(targetId);\n\n    if (!this.target) {\n      console.error(\"Target element not found\");\n      return;\n    }\n\n    this.contentContainer = this.target.children[0];\n    this.progressBar = this.querySelector(\".progress-bar\");\n\n    const targetStyle = window.getComputedStyle(this.target);\n    this.targetPadding =\n      parseFloat(targetStyle.paddingLeft) +\n      parseFloat(targetStyle.paddingRight);\n\n    // Start observing target for size changes\n    this.resizeObserver.observe(this.target);\n\n    // Check if content overflows\n    const viewportWidth = this.target.clientWidth - this.targetPadding;\n\n    if (this.totalWidth <= viewportWidth) {\n      this.disable();\n      return;\n    }\n\n    // Calculate initial progress\n    this.calculateInitialProgress();\n\n    // Add scroll listener\n    this.scrollHandler = () => {\n      requestAnimationFrame(() => this.updateProgress());\n    };\n    this.target.addEventListener(\"scroll\", this.scrollHandler);\n\n    // Show progress bar and do initial update\n    this.style.display = \"block\";\n    this.updateProgress();\n  }\n\n  disable() {\n    // Remove scroll listener if exists\n    if (this.scrollHandler && this.target) {\n      this.target.removeEventListener(\"scroll\", this.scrollHandler);\n    }\n\n    // Hide progress bar\n    this.style.display = \"none\";\n\n    // Reset progress\n    if (this.progressBar) {\n      this.progressBar.style.width = \"0%\";\n    }\n\n    // Stop observing target\n    if (this.target) {\n      this.resizeObserver.unobserve(this.target);\n    }\n  }\n\n  disconnectedCallback() {\n    // Clean up media query listener with stored handler\n    this.mediaQuery.removeEventListener(\"change\", this.mediaQueryHandler);\n    // Disconnect resize observer\n    this.resizeObserver.disconnect();\n    this.disable();\n  }\n\n  calculateInitialProgress() {\n    const viewportWidth = this.target.clientWidth - this.targetPadding;\n    this.initialProgress = (viewportWidth / this.totalWidth) * 100;\n\n    this.target.addEventListener(\"scroll\", () => {\n      requestAnimationFrame(() => this.updateProgress());\n    });\n    this.updateProgress();\n  }\n\n  updateProgress() {\n    const viewportWidth = this.target.clientWidth - this.targetPadding;\n    const scrolled = this.target.scrollLeft;\n    const maxScroll = this.totalWidth - viewportWidth;\n\n    const scrollProgress =\n      (scrolled / maxScroll) * (100 - this.initialProgress);\n    const totalProgress = this.initialProgress + scrollProgress;\n\n    const clampedProgress = Math.min(\n      100,\n      Math.max(this.initialProgress, totalProgress)\n    );\n\n    this.progressBar.style.width = `${clampedProgress}%`;\n  }\n}\n\ncustomElements.define(\"scroll-progress-bar\", ScrollProgressBar);\n"],
  "mappings": "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",
  "names": []
}
