{
  "version": 3,
  "sources": ["/cdn/shop/t/21/assets/main.js?codex-gallery-v=20260602i"],
  "sourcesContent": ["/**\n * Adds an observer to initialise a script when an element is scrolled into view.\n * @param {Element} element - Element to observe.\n * @param {Function} callback - Function to call when element is scrolled into view.\n * @param {number} [threshold=500] - Distance from viewport (in pixels) to trigger init.\n */\nfunction initLazyScript(element, callback, threshold = 500) {\n  if (\"IntersectionObserver\" in window) {\n    const io = new IntersectionObserver(\n      (entries, observer) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            if (typeof callback === \"function\") {\n              callback();\n              observer.unobserve(entry.target);\n            }\n          }\n        });\n      },\n      { rootMargin: `0px 0px ${threshold}px 0px` }\n    );\n\n    io.observe(element);\n  } else {\n    callback();\n  }\n}\n\ntheme.stickyHeaderHeight = () => {\n  const v = getComputedStyle(document.documentElement).getPropertyValue(\n    \"--theme-sticky-header-height\"\n  );\n  if (v) {\n    return parseInt(v, 10) || 0;\n  }\n  return 0;\n};\n\ntheme.getOffsetTopFromDoc = (el) =>\n  el.getBoundingClientRect().top + window.scrollY;\n\ntheme.getOffsetLeftFromDoc = (el) =>\n  el.getBoundingClientRect().left + window.scrollX;\n\ntheme.getScrollParent = (node) => {\n  const isElement = node instanceof HTMLElement;\n  const overflowY = isElement && window.getComputedStyle(node).overflowY;\n  const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\n\n  if (!node) {\n    return null;\n  }\n\n  if (isScrollable && node.scrollHeight > node.clientHeight) {\n    return node;\n  }\n\n  return (\n    theme.getScrollParent(node.parentNode) ||\n    document.scrollingElement ||\n    window\n  );\n};\n\ntheme.scrollToRevealElement = (el) => {\n  const scrollContainer = theme.getScrollParent(el);\n  const scrollTop =\n    scrollContainer === window ? window.scrollY : scrollContainer.scrollTop;\n  const scrollVisibleHeight =\n    scrollContainer === window\n      ? window.innerHeight\n      : scrollContainer.clientHeight;\n  const elTop = theme.getOffsetTopFromDoc(el);\n  const elBot = elTop + el.offsetHeight;\n  const inViewTop = scrollTop + theme.stickyHeaderHeight();\n  const inViewBot = scrollTop + scrollVisibleHeight - 50;\n\n  if (elTop < inViewTop || elBot > inViewBot) {\n    scrollContainer.scrollTo({\n      top: elTop - 100 - theme.stickyHeaderHeight(),\n      left: 0,\n      behavior: \"smooth\",\n    });\n  }\n};\n\ntheme.getEmptyOptionSelectors = (formContainer) => {\n  const emptySections = [];\n\n  formContainer\n    .querySelectorAll('[data-selector-type=\"dropdown\"].option-selector')\n    .forEach((el) => {\n      if (\n        !el.querySelector(\n          '[aria-selected=\"true\"][data-value]:not([data-value=\"\"])'\n        )\n      ) {\n        emptySections.push(el);\n      }\n    });\n\n  formContainer\n    .querySelectorAll('[data-selector-type=\"listed\"].option-selector')\n    .forEach((el) => {\n      if (!el.querySelector(\"input:checked\")) {\n        emptySections.push(el);\n      }\n    });\n\n  return emptySections;\n};\n\ntheme.suffixIds = (container, prefix) => {\n  const suffixCandidates = [\"id\", \"for\", \"aria-describedby\", \"aria-controls\"];\n  for (let i = 0; i < suffixCandidates.length; i += 1) {\n    container\n      .querySelectorAll(`[${suffixCandidates[i]}]`)\n      .forEach((el) =>\n        el.setAttribute(\n          suffixCandidates[i],\n          el.getAttribute(suffixCandidates[i]) + prefix\n        )\n      );\n  }\n};\n\ntheme.addDelegateEventListener = (\n  element,\n  eventName,\n  selector,\n  callback,\n  addEventListenerParams = null\n) => {\n  const cb = (evt) => {\n    const el = evt.target.closest(selector);\n    if (!el) return;\n    if (!element.contains(el)) return;\n    callback.call(el, evt, el);\n  };\n  element.addEventListener(eventName, cb, addEventListenerParams);\n  return cb;\n};\n\ntheme.hideAndRemove = (el) => {\n  // disable\n  el.querySelectorAll(\"input\").forEach((input) => {\n    input.disabled = true;\n  });\n\n  // wrap\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"merge-remove-wrapper\";\n  el.parentNode.insertBefore(wrapper, el);\n  wrapper.appendChild(el);\n  el.classList.add(\"merge-remove-item\");\n  wrapper.style.height = `${wrapper.clientHeight}px`;\n\n  const cs = getComputedStyle(el);\n  const fadeDuration =\n    parseFloat(cs.getPropertyValue(\"--fade-duration\")) * 1000;\n  const slideDuration =\n    parseFloat(cs.getPropertyValue(\"--slide-duration\")) * 1000;\n\n  setTimeout(() => {\n    wrapper.classList.add(\"merge-remove-wrapper--fade\");\n\n    setTimeout(() => {\n      wrapper.classList.add(\"merge-remove-wrapper--slide\");\n\n      setTimeout(() => wrapper.remove(), slideDuration);\n    }, fadeDuration);\n  }, 10);\n};\n\ntheme.insertAndReveal = (el, target, iaeCmd, delay) => {\n  const initialDelay = delay || 10;\n  el.classList.add(\"merge-add-wrapper\");\n  target.insertAdjacentElement(iaeCmd, el);\n  el.style.height = `${el.firstElementChild.clientHeight}px`;\n\n  const cs = getComputedStyle(el);\n  const fadeDuration =\n    parseFloat(cs.getPropertyValue(\"--fade-duration\")) * 1000;\n  const slideDuration =\n    parseFloat(cs.getPropertyValue(\"--slide-duration\")) * 1000;\n\n  setTimeout(() => {\n    el.classList.add(\"merge-add-wrapper--slide\");\n\n    setTimeout(() => {\n      el.classList.add(\"merge-add-wrapper--fade\");\n\n      setTimeout(() => {\n        // tidy up\n        el.style.height = \"\";\n        el.classList.remove(\n          \"merge-add-wrapper\",\n          \"merge-add-wrapper--slide\",\n          \"merge-add-wrapper--fade\"\n        );\n      }, fadeDuration);\n    }, slideDuration);\n  }, initialDelay);\n};\n\ntheme.mergeNodes = (newContent, targetContainer) => {\n  try {\n    // merge: replace content if changed\n    newContent.querySelectorAll(\"[data-merge]\").forEach((newEl) => {\n      const targetEl = targetContainer.querySelector(\n        `[data-merge=\"${newEl.dataset.merge}\"]`\n      );\n      if (\n        !newEl.dataset.mergeCache ||\n        !targetEl.dataset.mergeCache ||\n        newEl.dataset.mergeCache !== targetEl.dataset.mergeCache\n      ) {\n        targetEl.innerHTML = newEl.innerHTML;\n        if (newEl.dataset.mergeCache || targetEl.dataset.mergeCache) {\n          targetEl.dataset.mergeCache = newEl.dataset.mergeCache;\n        }\n      }\n    });\n    // merge: attributes only\n    newContent.querySelectorAll(\"[data-merge-attributes]\").forEach((newEl) => {\n      const targetEl = targetContainer.querySelector(\n        `[data-merge-attributes=\"${newEl.dataset.mergeAttributes}\"]`\n      );\n      const newElAttributeNames = newEl.getAttributeNames();\n      for (let i = 0; i < newElAttributeNames.length; i += 1) {\n        const attributeName = newElAttributeNames[i];\n        targetEl.setAttribute(attributeName, newEl.getAttribute(attributeName));\n      }\n    });\n    // merge: insert/remove/replace in list\n    newContent.querySelectorAll(\"[data-merge-list]\").forEach((newList) => {\n      const targetList = targetContainer.querySelector(\n        `[data-merge-list=\"${newList.dataset.mergeList}\"]`\n      );\n      let targetListItems = Array.from(\n        targetList.querySelectorAll(\"[data-merge-list-item]\")\n      );\n      const newListItems = Array.from(\n        newList.querySelectorAll(\"[data-merge-list-item]\")\n      );\n\n      // remove\n      targetListItems.forEach((targetListItem) => {\n        // eslint-disable-next-line max-len\n        const matchedItem = newListItems.find(\n          (item) =>\n            item.dataset.mergeListItem === targetListItem.dataset.mergeListItem\n        );\n        if (!matchedItem) {\n          theme.hideAndRemove(targetListItem);\n        }\n      });\n\n      // rebuild target list excluding removed items\n      targetListItems = Array.from(\n        targetList.querySelectorAll(\n          \"[data-merge-list-item]:not(.merge-remove-item)\"\n        )\n      );\n\n      for (let i = 0; i < newListItems.length; i += 1) {\n        const newListItem = newListItems[i];\n        // eslint-disable-next-line max-len\n        const matchedItem = targetListItems.find(\n          (item) =>\n            item.dataset.mergeListItem === newListItem.dataset.mergeListItem\n        );\n        if (matchedItem) {\n          // replace if changed\n          if (\n            !newListItem.dataset.mergeCache ||\n            !matchedItem.dataset.mergeCache ||\n            newListItem.dataset.mergeCache !== matchedItem.dataset.mergeCache\n          ) {\n            matchedItem.innerHTML = newListItem.innerHTML;\n            if (newListItem.dataset.mergeCache) {\n              matchedItem.dataset.mergeCache = newListItem.dataset.mergeCache;\n            }\n          }\n        } else {\n          // add\n          if (i === 0) {\n            // first place\n            theme.insertAndReveal(newListItem, targetList, \"afterbegin\", 500);\n          } else if (i >= targetListItems.length) {\n            // at end\n            theme.insertAndReveal(newListItem, targetList, \"beforeend\", 500);\n          } else {\n            // before element currently at that index\n            theme.insertAndReveal(\n              newListItem,\n              targetListItems[i],\n              \"beforebegin\",\n              500\n            );\n          }\n          // update target list\n          targetListItems.splice(i, 0, newListItem);\n        }\n      }\n    });\n  } catch (ex) {\n    window.location.reload();\n  }\n};\n\n// Show a short-lived text popup above an element\ntheme.showQuickPopup = (message, origin) => {\n  const offsetLeft = theme.getOffsetLeftFromDoc(origin);\n  const offsetTop = theme.getOffsetTopFromDoc(origin);\n  const originLeft = origin.getBoundingClientRect().left;\n  const popup = document.createElement(\"div\");\n  popup.className = \"simple-popup simple-popup--hidden\";\n  popup.innerHTML = message;\n  popup.style.left = `${offsetLeft}px`;\n  popup.style.top = `${offsetTop}px`;\n\n  document.body.appendChild(popup);\n\n  let marginLeft = -(popup.clientWidth - origin.clientWidth) / 2;\n  if (originLeft + marginLeft < 0) {\n    // Pull it away from the left edge of the screen\n    marginLeft -= originLeft + marginLeft - 2;\n  }\n  // Pull from right edge + small gap\n  const offsetRight = offsetLeft + marginLeft + popup.clientWidth + 5;\n  if (offsetRight > window.innerWidth) {\n    marginLeft -= offsetRight - window.innerWidth;\n  }\n  popup.style.marginTop = -popup.clientHeight - 10;\n  popup.style.marginLeft = marginLeft;\n  setTimeout(() => {\n    popup.classList.remove(\"simple-popup--hidden\");\n  }, 10);\n  setTimeout(() => {\n    popup.classList.add(\"simple-popup--hidden\");\n  }, 3500);\n  setTimeout(() => {\n    popup.remove();\n  }, 4000);\n};\n\ntheme.manuallyLoadImages = (container) => {\n  container.querySelectorAll(\"img[data-manual-src]\").forEach((el) => {\n    el.src = el.dataset.manualSrc;\n    el.removeAttribute(\"data-manual-src\");\n    if (el.dataset.manualSrcset) {\n      el.srcset = el.dataset.manualSrcset;\n      el.removeAttribute(\"data-manual-srcset\");\n    }\n  });\n};\n\ntheme.whenComponentLoaded = (component, callback) => {\n  const components =\n    Symbol.iterator in Object(component) ? [...component] : [component];\n  if (!components.find((c) => !c.hasAttribute(\"loaded\"))) {\n    callback();\n    return;\n  }\n  const onMutation = (mutationList, observer) => {\n    for (let i = 0; i < mutationList.length; i += 1) {\n      const mutation = mutationList[i];\n      if (mutation.type === \"attributes\") {\n        if (!components.find((c) => !c.hasAttribute(\"loaded\"))) {\n          observer.disconnect();\n          callback.call();\n        }\n      }\n    }\n  };\n  const observer = new MutationObserver(onMutation);\n  components.forEach((c) =>\n    observer.observe(c, { attributes: true, attributeFilter: [\"loaded\"] })\n  );\n};\n\n/**\n * Returns a function that as long as it continues to be invoked, won't be triggered.\n * @param {Function} fn - Callback function.\n * @param {number} [wait=300] - Delay (in milliseconds).\n * @returns {Function}\n */\nfunction debounce(fn, wait = 300) {\n  let t;\n  return (...args) => {\n    clearTimeout(t);\n    t = setTimeout(() => fn.apply(this, args), wait);\n  };\n}\n\nwindow.addEventListener(\n  \"resize\",\n  debounce(() => {\n    window.dispatchEvent(new CustomEvent(\"on:debounced-resize\"));\n  })\n);\n\n/**\n * Creates a 'mediaMatches' object from the media queries specified in the theme,\n * and adds listeners for each media query. If a breakpoint is crossed, the mediaMatches\n * values are updated and a 'on:breakpoint-change' event is dispatched.\n */\n(() => {\n  const { mediaQueries } = theme;\n  if (!mediaQueries) return;\n\n  const mqKeys = Object.keys(mediaQueries);\n  const mqLists = {};\n  theme.mediaMatches = {};\n\n  /**\n   * Handles a media query (breakpoint) change.\n   */\n  const handleMqChange = () => {\n    const newMatches = mqKeys.reduce((acc, media) => {\n      acc[media] = !!(mqLists[media] && mqLists[media].matches);\n      return acc;\n    }, {});\n\n    // Update mediaMatches values after breakpoint change.\n    Object.keys(newMatches).forEach((key) => {\n      theme.mediaMatches[key] = newMatches[key];\n    });\n\n    window.dispatchEvent(new CustomEvent(\"on:breakpoint-change\"));\n  };\n\n  mqKeys.forEach((mq) => {\n    // Create mqList object for each media query.\n    mqLists[mq] = window.matchMedia(mediaQueries[mq]);\n\n    // Get initial matches for each query.\n    theme.mediaMatches[mq] = mqLists[mq].matches;\n\n    // Add an event listener to each query.\n    try {\n      mqLists[mq].addEventListener(\"change\", handleMqChange);\n    } catch (err1) {\n      // Fallback for legacy browsers (Safari < 14).\n      mqLists[mq].addListener(handleMqChange);\n    }\n  });\n})();\n\n/**\n * Sets a 'viewport-height' custom property on the root element.\n */\nfunction setViewportHeight() {\n  document.documentElement.style.setProperty(\n    \"--viewport-height\",\n    `${window.innerHeight}px`\n  );\n}\n\n/**\n * Sets a 'header-height' custom property on the root element.\n */\nfunction setHeaderHeight() {\n  const header = document.getElementById(\"shopify-section-header\");\n  if (!header) return;\n  let height = header.offsetHeight;\n\n  // Add announcement bar height (if shown).\n  const announcement = document.getElementById(\"shopify-section-announcement\");\n  if (announcement) height += announcement.offsetHeight;\n\n  document.documentElement.style.setProperty(\"--header-height\", `${height}px`);\n}\n\n/**\n * Sets a 'scrollbar-width' custom property on the root element.\n */\nfunction setScrollbarWidth() {\n  document.documentElement.style.setProperty(\n    \"--scrollbar-width\",\n    `${window.innerWidth - document.documentElement.clientWidth}px`\n  );\n}\n\n/**\n * Sets the dimension variables.\n */\nfunction setDimensionVariables() {\n  setViewportHeight();\n  setHeaderHeight();\n  setScrollbarWidth();\n}\n\n// Set the dimension variables once the DOM is loaded\ndocument.addEventListener(\"DOMContentLoaded\", setDimensionVariables);\n\n// Update the dimension variables if viewport resized.\nwindow.addEventListener(\"resize\", debounce(setDimensionVariables, 400));\n\n// iOS alters screen width without resize event, if unexpectedly wide content is found\nsetTimeout(setViewportHeight, 3000);\n\n/**\n * Pauses all media (videos/models) within an element.\n * @param {Element} [el=document] - Element to pause media within.\n */\nfunction pauseAllMedia(el = document) {\n  el.querySelectorAll(\".js-youtube, .js-vimeo, video\").forEach((video) => {\n    const component = video.closest(\"video-component\");\n    if (component && component.dataset.background === \"true\") return;\n\n    if (video.matches(\".js-youtube\")) {\n      video.contentWindow.postMessage(\n        '{ \"event\": \"command\", \"func\": \"pauseVideo\", \"args\": \"\" }',\n        \"*\"\n      );\n    } else if (video.matches(\".js-vimeo\")) {\n      video.contentWindow.postMessage('{ \"method\": \"pause\" }', \"*\");\n    } else {\n      video.pause();\n    }\n  });\n\n  el.querySelectorAll(\"product-model\").forEach((model) => {\n    if (model.modelViewerUI) model.modelViewerUI.pause();\n  });\n}\n\nclass DeferredMedia extends HTMLElement {\n  constructor() {\n    super();\n\n    const loadBtn = this.querySelector(\".js-load-media\");\n    if (loadBtn) {\n      loadBtn.addEventListener(\"click\", this.loadContent.bind(this));\n    } else {\n      this.addObserver();\n    }\n  }\n\n  /**\n   * Adds an Intersection Observer to load the content when viewport scroll is near\n   */\n  addObserver() {\n    if (\"IntersectionObserver\" in window === false) return;\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            this.loadContent(false, false, \"observer\");\n            observer.unobserve(this);\n          }\n        });\n      },\n      { rootMargin: \"0px 0px 1000px 0px\" }\n    );\n\n    observer.observe(this);\n  }\n\n  /**\n   * Loads the deferred media.\n   * @param {boolean} [focus=true] - Focus the deferred media element after loading.\n   * @param {boolean} [pause=true] - Whether to pause all media after loading.\n   * @param {string} [loadTrigger='click'] - The action that caused the deferred content to load.\n   */\n  loadContent(focus = true, pause = true, loadTrigger = \"click\") {\n    if (pause) pauseAllMedia();\n    if (this.getAttribute(\"loaded\") !== null) return;\n\n    this.loadTrigger = loadTrigger;\n    const content =\n      this.querySelector(\"template\").content.firstElementChild.cloneNode(true);\n    this.appendChild(content);\n    this.setAttribute(\"loaded\", \"\");\n\n    const deferredEl = this.querySelector(\"video, model-viewer, iframe\");\n    if (deferredEl && focus) deferredEl.focus();\n  }\n}\n\ncustomElements.define(\"deferred-media\", DeferredMedia);\n\nclass DetailsDisclosure extends HTMLElement {\n  constructor() {\n    super();\n    this.disclosure = this.querySelector(\"details\");\n    this.toggle = this.querySelector(\"summary\");\n    this.panel = this.toggle.nextElementSibling;\n    this.init();\n  }\n\n  init() {\n    // Check if the content element has a CSS transition.\n    if (window.getComputedStyle(this.panel).transitionDuration !== \"0s\") {\n      this.toggle.addEventListener(\"click\", this.handleToggle.bind(this));\n      this.disclosure.addEventListener(\n        \"transitionend\",\n        this.handleTransitionEnd.bind(this)\n      );\n    }\n  }\n\n  /**\n   * Handles 'click' events on the summary element.\n   * @param {object} evt - Event object.\n   */\n  handleToggle(evt) {\n    evt.preventDefault();\n\n    if (this.disclosure.hasAttribute(\"data-always-open\")) return;\n\n    if (!this.disclosure.open) {\n      this.open();\n    } else {\n      this.close();\n    }\n  }\n\n  /**\n   * Handles 'transitionend' events on the details element.\n   * @param {object} evt - Event object.\n   */\n  handleTransitionEnd(evt) {\n    if (evt.target !== this.panel) return;\n\n    if (this.disclosure.classList.contains(\"is-closing\")) {\n      this.disclosure.classList.remove(\"is-closing\");\n      this.disclosure.open = false;\n    }\n\n    this.panel.removeAttribute(\"style\");\n  }\n\n  /**\n   * Adds inline 'height' style to the content element, to trigger open transition.\n   */\n  addContentHeight() {\n    this.panel.style.height = `${this.panel.scrollHeight}px`;\n  }\n\n  /**\n   * Opens the details element.\n   */\n  open() {\n    // Set content 'height' to zero before opening the details element.\n    this.panel.style.height = \"0\";\n\n    // Open the details element\n    this.disclosure.open = true;\n\n    // Set content 'height' to its scroll height, to enable CSS transition.\n    this.addContentHeight();\n  }\n\n  /**\n   * Closes the details element.\n   */\n  close() {\n    // Set content height to its scroll height, to enable transition to zero.\n    this.addContentHeight();\n\n    // Add class to enable styling of content or toggle icon before or during close transition.\n    this.disclosure.classList.add(\"is-closing\");\n\n    // Set content height to zero to trigger the transition.\n    // Slight delay required to allow scroll height to be applied before changing to '0'.\n    setTimeout(() => {\n      this.panel.style.height = \"0\";\n    });\n  }\n}\n\ncustomElements.define(\"details-disclosure\", DetailsDisclosure);\n\nif (!customElements.get(\"gift-card-recipient\")) {\n  class GiftCardRecipient extends HTMLElement {\n    connectedCallback() {\n      this.recipientEmail = this.querySelector(\n        '[name=\"properties[Recipient email]\"]'\n      );\n      this.recipientEmailLabel = this.querySelector(\n        `label[for=\"${this.recipientEmail.id}\"]`\n      );\n      this.recipientName = this.querySelector(\n        '[name=\"properties[Recipient name]\"]'\n      );\n      this.recipientMessage = this.querySelector(\n        '[name=\"properties[Message]\"]'\n      );\n      this.recipientSendOn = this.querySelector('[name=\"properties[Send on]\"]');\n      this.recipientOffsetProperty = this.querySelector(\n        '[name=\"properties[__shopify_offset]\"]'\n      );\n\n      // When JS is enabled, the recipient email field is required.\n      // Input labels are changed to reflect this.\n      if (\n        this.recipientEmailLabel &&\n        this.recipientEmailLabel.dataset.jsLabel\n      ) {\n        this.recipientEmailLabel.innerText =\n          this.recipientEmailLabel.dataset.jsLabel;\n      }\n\n      // Set the timezone offset property input and enable it\n      if (this.recipientOffsetProperty) {\n        this.recipientOffsetProperty.value = new Date()\n          .getTimezoneOffset()\n          .toString();\n        this.recipientOffsetProperty.removeAttribute(\"disabled\");\n      }\n\n      this.recipientCheckbox = this.querySelector(\n        \".gift-card-recipient__checkbox\"\n      );\n      this.recipientCheckbox.addEventListener(\"change\", () =>\n        this.synchronizeProperties()\n      );\n      this.synchronizeProperties();\n    }\n\n    synchronizeProperties() {\n      if (this.recipientCheckbox.checked) {\n        this.recipientEmail.setAttribute(\"required\", \"\");\n        this.recipientEmail.removeAttribute(\"disabled\");\n        this.recipientName.removeAttribute(\"disabled\");\n        this.recipientMessage.removeAttribute(\"disabled\");\n        this.recipientSendOn.removeAttribute(\"disabled\");\n        if (this.recipientOffsetProperty) {\n          this.recipientOffsetProperty.removeAttribute(\"disabled\");\n        }\n      } else {\n        this.recipientEmail.removeAttribute(\"required\");\n        this.recipientEmail.setAttribute(\"disabled\", \"\");\n        this.recipientName.setAttribute(\"disabled\", \"\");\n        this.recipientMessage.setAttribute(\"disabled\", \"\");\n        this.recipientSendOn.setAttribute(\"disabled\", \"\");\n        if (this.recipientOffsetProperty) {\n          this.recipientOffsetProperty.setAttribute(\"disabled\", \"\");\n        }\n      }\n    }\n  }\n\n  customElements.define(\"gift-card-recipient\", GiftCardRecipient);\n}\n\nconst trapFocusHandlers = {};\n\n/**\n * Removes focus trap event listeners and optionally focuses an element.\n * @param {Element} [elementToFocus=null] - Element to focus when trap is removed.\n */\nfunction removeTrapFocus(elementToFocus = null) {\n  document.removeEventListener(\"focusin\", trapFocusHandlers.focusin);\n  document.removeEventListener(\"focusout\", trapFocusHandlers.focusout);\n  document.removeEventListener(\"keydown\", trapFocusHandlers.keydown);\n\n  if (elementToFocus) elementToFocus.focus();\n}\n\n/**\n * Traps focus within a container, e.g. modal or side drawer.\n * @param {Element} container - Container element to trap focus within.\n * @param {Element} [elementToFocus=container] - Initial element to focus when trap is applied.\n */\nfunction trapFocus(container, elementToFocus = container) {\n  const focusableEls = Array.from(\n    container.querySelectorAll(\n      'summary, a[href], area[href], button:not([disabled]), input:not([type=hidden]):not([disabled]), select:not([disabled]), textarea:not([disabled]), object, iframe, audio[controls], video[controls], [tabindex]:not([tabindex^=\"-\"])'\n    )\n  );\n\n  const firstEl = focusableEls[0];\n  const lastEl = focusableEls[focusableEls.length - 1];\n\n  removeTrapFocus();\n\n  trapFocusHandlers.focusin = (evt) => {\n    if (\n      evt.target !== container &&\n      evt.target !== lastEl &&\n      evt.target !== firstEl\n    )\n      return;\n    document.addEventListener(\"keydown\", trapFocusHandlers.keydown);\n  };\n\n  trapFocusHandlers.focusout = () => {\n    document.removeEventListener(\"keydown\", trapFocusHandlers.keydown);\n  };\n\n  trapFocusHandlers.keydown = (evt) => {\n    if (evt.code !== \"Tab\") return;\n\n    // If tab pressed on last focusable element, focus the first element.\n    if (evt.target === lastEl && !evt.shiftKey) {\n      evt.preventDefault();\n      firstEl.focus();\n    }\n\n    //  If shift + tab pressed on the first focusable element, focus the last element.\n    if ((evt.target === container || evt.target === firstEl) && evt.shiftKey) {\n      evt.preventDefault();\n      lastEl.focus();\n    }\n  };\n\n  document.addEventListener(\"focusout\", trapFocusHandlers.focusout);\n  document.addEventListener(\"focusin\", trapFocusHandlers.focusin);\n\n  (elementToFocus || container).focus();\n}\n\nclass Modal extends HTMLElement {\n  constructor() {\n    super();\n    this.addEventListener(\"click\", this.handleClick.bind(this));\n  }\n\n  /**\n   * Handles 'click' events on the modal.\n   * @param {object} evt - Event object.\n   */\n  handleClick(evt) {\n    if (evt.target !== this && !evt.target.matches(\".js-close-modal\")) return;\n    this.close();\n  }\n\n  /**\n   * Opens the modal.\n   * @param {Element} opener - Modal opener element.\n   */\n  open(opener) {\n    // Prevent page behind from scrolling when side drawer is open\n    this.scrollY = window.scrollY;\n    document.body.classList.add(\"fixed\");\n    document.body.style.top = `-${this.scrollY}px`;\n\n    this.setAttribute(\"open\", \"\");\n    this.openedBy = opener;\n\n    trapFocus(this);\n    window.pauseAllMedia();\n\n    // Add event handler (so the bound event listener can be removed).\n    this.keyupHandler = (evt) => evt.key === \"Escape\" && this.close();\n\n    // Add event listener (for while modal is open).\n    this.addEventListener(\"keyup\", this.keyupHandler);\n\n    // Wrap tables in a '.scrollable-table' element for a better mobile experience.\n    this.querySelectorAll(\"table\").forEach((table) => {\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"scrollable-table\";\n      table.parentNode.insertBefore(wrapper, table);\n      wrapper.appendChild(table);\n    });\n  }\n\n  /**\n   * Closes the modal.\n   */\n  close() {\n    // Restore page position and scroll behaviour.\n    document.body.style.top = \"\";\n    document.body.classList.remove(\"fixed\");\n    window.scrollTo(0, this.scrollY);\n\n    this.removeAttribute(\"open\");\n\n    removeTrapFocus(this.openedBy);\n    window.pauseAllMedia();\n\n    // Remove event listener added on modal opening.\n    this.removeEventListener(\"keyup\", this.keyupHandler);\n  }\n}\n\ncustomElements.define(\"modal-dialog\", Modal);\n\nclass ModalOpener extends HTMLElement {\n  constructor() {\n    super();\n\n    const button = this.querySelector(\"button\");\n    if (!button) return;\n\n    button.addEventListener(\"click\", () => {\n      const modal = document.getElementById(this.dataset.modal);\n      if (modal) modal.open(button);\n    });\n  }\n}\n\ncustomElements.define(\"modal-opener\", ModalOpener);\n\nclass SideDrawer extends HTMLElement {\n  constructor() {\n    super();\n    this.overlay = document.querySelector(\".js-overlay\");\n  }\n\n  /**\n   * Handles a 'click' event on the drawer.\n   * @param {object} evt - Event object.\n   */\n  handleClick(evt) {\n    if (evt.target.matches(\".js-close-drawer\") || evt.target === this.overlay) {\n      this.close();\n    }\n  }\n\n  /**\n   * Opens the drawer.\n   * @param {Element} [opener] - Element that triggered opening of the drawer.\n   * @param {Element} [elementToFocus] - Element to focus after drawer opened.\n   * @param {Function} [callback] - Callback function to trigger after the open has completed\n   */\n  open(opener, elementToFocus, callback) {\n    this.dispatchEvent(\n      new CustomEvent(`on:${this.dataset.name}:before-open`, {\n        bubbles: true,\n      })\n    );\n\n    // Prevent page behind from scrolling when side drawer is open.\n    this.scrollY = window.scrollY;\n    document.body.classList.add(\"fixed\");\n    document.body.style.top = `-${this.scrollY}px`;\n    document.documentElement.style.height = \"100vh\";\n\n    this.overlay.classList.add(\"is-visible\");\n    this.setAttribute(\"open\", \"\");\n    this.setAttribute(\"aria-hidden\", \"false\");\n    this.opener = opener;\n\n    trapFocus(this, elementToFocus);\n\n    // Create event handler variables (so the bound event listeners can be removed).\n    this.clickHandler = this.clickHandler || this.handleClick.bind(this);\n    this.keyupHandler = (evt) => {\n      if (evt.key !== \"Escape\" || evt.target.closest(\".cart-drawer-popup\"))\n        return;\n      this.close();\n    };\n\n    // Add event listeners (for while drawer is open).\n    this.addEventListener(\"click\", this.clickHandler);\n    this.addEventListener(\"keyup\", this.keyupHandler);\n    this.overlay.addEventListener(\"click\", this.clickHandler);\n\n    // Handle events after the drawer opens\n    const transitionDuration = parseFloat(\n      getComputedStyle(this).getPropertyValue(\"--longest-transition-in-ms\")\n    );\n    setTimeout(() => {\n      if (callback) callback();\n      this.dispatchEvent(\n        new CustomEvent(`on:${this.dataset.name}:after-open`, {\n          bubbles: true,\n        })\n      );\n    }, transitionDuration);\n  }\n\n  /**\n   * Closes the drawer.\n   * @param {Function} [callback] - Call back function to trigger after the close has completed\n   */\n  close(callback) {\n    this.dispatchEvent(\n      new CustomEvent(`on:${this.dataset.name}:before-close`, {\n        bubbles: true,\n      })\n    );\n\n    this.removeAttribute(\"open\");\n    this.setAttribute(\"aria-hidden\", \"true\");\n    this.overlay.classList.remove(\"is-visible\");\n\n    removeTrapFocus(this.opener);\n\n    // Restore page position and scroll behaviour.\n    document.documentElement.style.height = \"\";\n    document.body.style.top = \"\";\n    document.body.classList.remove(\"fixed\");\n    window.scrollTo(0, this.scrollY);\n\n    // Remove event listeners added on drawer opening.\n    this.removeEventListener(\"click\", this.clickHandler);\n    this.removeEventListener(\"keyup\", this.keyupHandler);\n    this.overlay.removeEventListener(\"click\", this.clickHandler);\n\n    // Handle events after the drawer closes\n    const transitionDuration = parseFloat(\n      getComputedStyle(this).getPropertyValue(\"--longest-transition-in-ms\")\n    );\n    setTimeout(() => {\n      if (callback) callback();\n      this.dispatchEvent(\n        new CustomEvent(`on:${this.dataset.name}:after-close`, {\n          bubbles: true,\n        })\n      );\n    }, transitionDuration);\n  }\n}\n\ncustomElements.define(\"side-drawer\", SideDrawer);\n\nclass BuyButtons extends HTMLElement {\n  constructor() {\n    super();\n    window.initLazyScript(this, this.initLazySection.bind(this));\n  }\n\n  initLazySection() {\n    this.dynamicPaymentButtonTemplate = this.querySelector(\n      \".dynamic-payment-button-template\"\n    );\n\n    if (this.dynamicPaymentButtonTemplate) {\n      this.variantIdInput = this.querySelector('[name=\"id\"]');\n\n      if (this.variantIdInput.value) {\n        this.tryInitDynamicPaymentButton();\n      } else {\n        this.boundTryInitDynamicPaymentButtonOnChange =\n          this.tryInitDynamicPaymentButton.bind(this);\n        this.variantIdInput.addEventListener(\n          \"change\",\n          this.boundTryInitDynamicPaymentButtonOnChange\n        );\n      }\n    }\n  }\n\n  /**\n   * Initialise dynamic payment button, if variant exists\n   */\n  tryInitDynamicPaymentButton() {\n    if (this.variantIdInput.value) {\n      if (this.boundTryInitDynamicPaymentButtonOnChange) {\n        this.variantIdInput.removeEventListener(\n          \"change\",\n          this.boundTryInitDynamicPaymentButtonOnChange\n        );\n      }\n\n      this.dynamicPaymentButtonTemplate.insertAdjacentHTML(\n        \"afterend\",\n        this.dynamicPaymentButtonTemplate.innerHTML\n      );\n      this.dynamicPaymentButtonTemplate.remove();\n\n      if (Shopify.PaymentButton) {\n        Shopify.PaymentButton.init();\n      }\n    }\n  }\n}\n\ncustomElements.define(\"buy-buttons\", BuyButtons);\n\nconst CartForm = class extends HTMLElement {\n  connectedCallback() {\n    this.enableAjaxUpdate = this.dataset.ajaxUpdate;\n\n    if (this.enableAjaxUpdate) {\n      this.sectionId = this.dataset.sectionId;\n      this.boundRefresh = this.refresh.bind(this);\n      document.addEventListener(\"on:cart:change\", this.boundRefresh);\n\n      theme.addDelegateEventListener(\n        this,\n        \"click\",\n        \".cart-item__remove\",\n        (evt) => {\n          evt.preventDefault();\n          this.adjustItemQuantity(evt.target.closest(\".cart-item\"), { to: 0 });\n        }\n      );\n\n      theme.addDelegateEventListener(this, \"click\", \".quantity-down\", (evt) => {\n        evt.preventDefault();\n        this.adjustItemQuantity(evt.target.closest(\".cart-item\"), {\n          decrease: true,\n        });\n      });\n\n      theme.addDelegateEventListener(this, \"click\", \".quantity-up\", (evt) => {\n        evt.preventDefault();\n        this.adjustItemQuantity(evt.target.closest(\".cart-item\"), {\n          increase: true,\n        });\n      });\n\n      theme.addDelegateEventListener(\n        this,\n        \"change\",\n        \".cart-item__quantity-input\",\n        (evt) => {\n          this.adjustItemQuantity(evt.target.closest(\".cart-item\"), {\n            currentValue: true,\n          });\n        }\n      );\n    }\n  }\n\n  disconnectedCallback() {\n    if (this.enableAjaxUpdate) {\n      document.removeEventListener(\"on:cart:change\", this.boundRefresh);\n    }\n  }\n\n  refresh() {\n    this.classList.add(\"cart-form--refreshing\");\n    fetch(`${window.Shopify.routes.root}?section_id=${this.sectionId}`)\n      .then((response) => {\n        if (!response.ok) {\n          throw new Error(`HTTP error! Status: ${response.status}`);\n        }\n        return response.text();\n      })\n      .then((response) => {\n        this.refreshFromHtml(response);\n      });\n  }\n\n  refreshFromHtml(html) {\n    const frag = document.createDocumentFragment();\n    const newContent = document.createElement(\"div\");\n    frag.appendChild(newContent);\n    newContent.innerHTML = html;\n\n    newContent\n      .querySelectorAll(\"[data-cc-animate]\")\n      .forEach((el) => el.removeAttribute(\"data-cc-animate\"));\n\n    theme.mergeNodes(newContent, this);\n\n    this.classList.remove(\"cart-form--refreshing\");\n    this.querySelectorAll(\".merge-item-refreshing\").forEach((el) =>\n      el.classList.remove(\"merge-item-refreshing\")\n    );\n\n    this.dispatchEvent(\n      new CustomEvent(\"on:cart:after-merge\", {\n        bubbles: true,\n        cancelable: false,\n      })\n    );\n\n    if (\n      theme.settings.afterAddToCart === \"drawer\" &&\n      this.closest(\".drawer\") &&\n      !this.closest(\".drawer\").hasAttribute(\"open\")\n    ) {\n      document.dispatchEvent(\n        new CustomEvent(\"theme:open-cart-drawer\", {\n          bubbles: true,\n          cancelable: false,\n        })\n      );\n    }\n  }\n\n  adjustItemQuantity(item, change) {\n    const quantityInput = item.querySelector(\".cart-item__quantity-input\");\n\n    let newQuantity = parseInt(quantityInput.value, 10);\n    if (typeof change.to !== \"undefined\") {\n      newQuantity = change.to;\n      quantityInput.value = newQuantity;\n    } else if (change.increase) {\n      newQuantity += quantityInput.step || 1;\n      quantityInput.value = newQuantity;\n    } else if (change.decrease) {\n      newQuantity -= quantityInput.step || 1;\n      quantityInput.value = newQuantity;\n    } else if (change.currentValue);\n\n    if (\n      quantityInput.max &&\n      parseInt(quantityInput.value, 10) > parseInt(quantityInput.max, 10)\n    ) {\n      newQuantity = quantityInput.max;\n      quantityInput.value = newQuantity;\n      theme.showQuickPopup(\n        theme.strings.cartItemsQuantityError.replace(\n          \"[QUANTITY]\",\n          quantityInput.max\n        ),\n        quantityInput\n      );\n    }\n\n    clearTimeout(this.adjustItemQuantityTimeout);\n    this.adjustItemQuantityTimeout = setTimeout(\n      () => {\n        const updateParam = { updates: {} };\n        this.querySelectorAll(\n          \".cart-item__quantity-input:not([disabled])\"\n        ).forEach((el) => {\n          updateParam.updates[el.dataset.key] = el.value;\n          if (el.value !== el.dataset.initialValue) {\n            el.closest(\"[data-merge-list-item]\").classList.add(\n              \"merge-item-refreshing\"\n            );\n          }\n        });\n        fetch(theme.routes.cartUpdate, {\n          method: \"POST\",\n          body: JSON.stringify(updateParam),\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n        })\n          .then((response) => {\n            if (!response.ok) {\n              throw new Error(`HTTP error! Status: ${response.status}`);\n            }\n            document.dispatchEvent(\n              new CustomEvent(\"on:cart:change\", {\n                bubbles: true,\n                cancelable: false,\n              })\n            );\n          })\n          .catch((error) => {\n            // eslint-disable-next-line no-console\n            console.log(error.message);\n            this.dispatchEvent(\n              new CustomEvent(\"on:cart:error\", {\n                bubbles: true,\n                detail: {\n                  error: error.message,\n                },\n              })\n            );\n            // Uncertainty... Reload page.\n            window.location.reload();\n          });\n      },\n      newQuantity === 0 ? 10 : 700\n    );\n  }\n};\n\nwindow.customElements.define(\"cart-form\", CartForm);\n\nconst CCCartCrossSell = class extends HTMLElement {\n  init() {\n    this.productList = this.querySelector(\".product-grid\");\n\n    if (this.dataset.from) {\n      fetch(this.dataset.from)\n        .then((response) => {\n          if (!response.ok) {\n            throw new Error(`HTTP error! Status: ${response.status}`);\n          }\n          return response.text();\n        })\n        .then((response) => {\n          const frag = document.createDocumentFragment();\n          const newContent = document.createElement(\"div\");\n          frag.appendChild(newContent);\n          newContent.innerHTML = response;\n\n          const pl = newContent.querySelector(\".product-grid\");\n          if (pl) {\n            this.productList.innerHTML = pl.innerHTML;\n            this.querySelectorAll(\".product-block\").forEach((el) =>\n              el.classList.add(\"slider__item\")\n            );\n            this.querySelectorAll(\"carousel-slider\").forEach((el) =>\n              el.refresh()\n            );\n          } else {\n            this.classList.add(\"hidden\");\n          }\n        });\n    }\n  }\n};\n\nwindow.customElements.define(\"cc-cart-cross-sell\", CCCartCrossSell);\n\nconst CCFetchedContent = class extends HTMLElement {\n  connectedCallback() {\n    fetch(this.dataset.url)\n      .then((response) => {\n        if (!response.ok) {\n          throw new Error(`HTTP error! Status: ${response.status}`);\n        }\n        return response.text();\n      })\n      .then((response) => {\n        const frag = document.createDocumentFragment();\n        const fetchedContent = document.createElement(\"div\");\n        frag.appendChild(fetchedContent);\n        fetchedContent.innerHTML = response;\n\n        const replacementContent = fetchedContent.querySelector(\n          `[data-id=\"${this.dataset.id}\"]`\n        );\n        if (replacementContent) {\n          this.innerHTML = replacementContent.innerHTML;\n        }\n      });\n  }\n};\n\nwindow.customElements.define(\"cc-fetched-content\", CCFetchedContent);\n\n/**\n * Returns a function, that, when invoked, will only be triggered at most once during\n * a given window of time.\n * @param {Function} fn - Callback function.\n * @param {number} [wait=300] - Time window (in milliseconds).\n * @returns {Function}\n */\nfunction throttle(fn, wait = 300) {\n  let throttleTimeoutId = -1;\n  let tick = false;\n\n  return () => {\n    clearTimeout(throttleTimeoutId);\n    throttleTimeoutId = setTimeout(fn, wait);\n\n    if (!tick) {\n      fn.call();\n      tick = true;\n      setTimeout(() => {\n        tick = false;\n      }, wait);\n    }\n  };\n}\n\nconst FilterContainer = class extends HTMLElement {\n  constructor() {\n    super();\n    this.section = this.closest(\".shopify-section\");\n    this.filters = this.querySelector(\".filters\");\n\n    const utilityBar = document.querySelector(\".utility-bar\");\n    if (utilityBar) {\n      // duplicate utility bar for mobile\n      this.utilBarClone = utilityBar.cloneNode(true);\n      this.utilBarClone.classList.add(\"utility-bar--sticky-mobile-copy\");\n      this.utilBarClone.removeAttribute(\"data-ajax-container\");\n      utilityBar.insertAdjacentElement(\"afterend\", this.utilBarClone);\n      // ensure ids are unique\n      theme.suffixIds(this.utilBarClone, \"dupe\");\n\n      this.previousScrollTop = window.scrollY;\n      this.throttledCheckStickyScroll = throttle(\n        this.checkStickyScroll.bind(this),\n        200\n      );\n    }\n\n    if (this.filters) {\n      // auto-select availability\n      this.allowAutoApplyHideUnavailable =\n        this.filters.dataset.autoApplyHideUnavailable === \"true\";\n      if (this.allowAutoApplyHideUnavailable) {\n        theme.addDelegateEventListener(\n          this,\n          \"change\",\n          \".filter-group__checkbox, .cc-price-range__input\",\n          (evt, delEl) => {\n            if (this.allowAutoApplyHideUnavailable) {\n              if (\n                (delEl.type === \"checkbox\" && delEl.checked) ||\n                (delEl.type === \"text\" && delEl.value)\n              ) {\n                const toEnable = this.filters.querySelector(\n                  '[name=\"filter.v.availability\"][value=\"1\"]'\n                );\n                if (toEnable) {\n                  toEnable.checked = true;\n                  toEnable.dispatchEvent(\n                    new CustomEvent(\"change\", {\n                      bubbles: true,\n                      cancelable: false,\n                    })\n                  );\n                }\n              }\n            }\n          }\n        );\n\n        theme.addDelegateEventListener(\n          this,\n          \"change\",\n          \".filter-group--availability .filter-toggle__input\",\n          (evt, delEl) => {\n            if (delEl.checked && delEl.value === \"1\") {\n              this.allowAutoApplyHideUnavailable = false;\n            }\n          }\n        );\n      }\n\n      // ajax filter\n      if (this.dataset.ajaxFiltering === \"true\") {\n        // ajax load form submission\n        const debouncedAjaxLoadForm = debounce(\n          this.ajaxLoadForm.bind(this),\n          700\n        );\n        theme.addDelegateEventListener(\n          this,\n          \"change\",\n          \"#CollectionFilterForm\",\n          debouncedAjaxLoadForm\n        );\n        theme.addDelegateEventListener(\n          this,\n          \"submit\",\n          \"#CollectionFilterForm\",\n          debouncedAjaxLoadForm\n        );\n      } else {\n        theme.addDelegateEventListener(\n          this,\n          \"change\",\n          \"#CollectionFilterForm\",\n          (_evt, delEl) => delEl.submit()\n        );\n      }\n\n      // init things that may need re-initialising on ajax load\n      this.initFiltersEtc();\n    }\n\n    // ajax sort, filter, and pagination\n    if (this.dataset.ajaxFiltering === \"true\") {\n      // ajax load on link click\n      theme.addDelegateEventListener(\n        this.section,\n        \"click\",\n        \".link-dropdown__link, .filter-group__applied-item, .filter-group__clear-link, .pagination a\",\n        (evt, delEl) => {\n          evt.preventDefault();\n          this.ajaxLoadUrl(delEl.href);\n        }\n      );\n    }\n  }\n\n  connectedCallback() {\n    // scroll\n    if (this.throttledCheckStickyScroll) {\n      window.addEventListener(\"scroll\", this.throttledCheckStickyScroll);\n    }\n\n    // back button\n    if (this.dataset.ajaxFiltering === \"true\") {\n      this.boundAjaxPopState = this.ajaxPopState.bind(this);\n      window.addEventListener(\"popstate\", this.boundAjaxPopState);\n    }\n\n    // layout switch\n    if (this.section.querySelector(\".layout-switchers\")) {\n      this.boundSwitchGridLayout = theme.addDelegateEventListener(\n        this.section,\n        \"click\",\n        \".layout-switch\",\n        this.switchGridLayout.bind(this)\n      );\n    }\n\n    // show/hide filters\n    this.delegatedToggleFiltersCallback = theme.addDelegateEventListener(\n      this.section,\n      \"click\",\n      \"[data-toggle-filters]\",\n      (evt) => {\n        evt.preventDefault();\n        this.classList.toggle(\"filter-container--show-filters-desktop\");\n        this.classList.toggle(\"filter-container--show-filters-mobile\");\n        const isNowVisible = this.classList.contains(\n          \"filter-container--show-filters-desktop\"\n        );\n        this.section\n          .querySelectorAll(\".toggle-btn[data-toggle-filters]\")\n          .forEach((el) => {\n            el.classList.toggle(\"toggle-btn--revealed-desktop\", isNowVisible);\n          });\n      }\n    );\n  }\n\n  disconnectedCallback() {\n    if (this.boundCheckStickyScroll) {\n      window.removeEventListener(\"scroll\", this.throttledCheckStickyScroll);\n    }\n\n    if (this.boundAjaxPopState) {\n      window.removeEventListener(\"popstate\", this.boundAjaxPopState);\n    }\n  }\n\n  initFiltersEtc() {\n    this.classList.add(\"filter-container--mobile-initialised\");\n\n    // append query vars onto sort urls (e.g. filters, vendor collection)\n    if (window.location.href.indexOf(\"?\") >= 0) {\n      document\n        .querySelectorAll(\"#sort-dropdown-options .link-dropdown__link\")\n        .forEach((el) => {\n          const queryTerms = window.location.href.split(\"?\")[1].split(\"&\");\n          let newHref = el.href;\n          queryTerms.forEach((term) => {\n            if (term.indexOf(\"sort_by=\") === -1) {\n              newHref += `&${term}`;\n            }\n          });\n          el.href = newHref;\n        });\n    }\n  }\n\n  switchGridLayout(evt) {\n    evt.preventDefault();\n    if (evt.target.classList.contains(\"layout-switch--one-column\")) {\n      this.querySelectorAll(\".product-grid\").forEach((el) => {\n        el.classList.remove(\"product-grid--per-row-mob-2\");\n        el.classList.add(\"product-grid--per-row-mob-1\");\n      });\n    } else {\n      this.querySelectorAll(\".product-grid\").forEach((el) => {\n        el.classList.remove(\"product-grid--per-row-mob-1\");\n        el.classList.add(\"product-grid--per-row-mob-2\");\n      });\n    }\n    evt.target.classList.add(\"layout-switch--active\");\n    (\n      evt.target.nextElementSibling || evt.target.previousElementSibling\n    ).classList.remove(\"layout-switch--active\");\n  }\n\n  checkStickyScroll() {\n    const utilityBarOffsetY = theme.getOffsetTopFromDoc(\n      this.section.querySelector(\".utility-bar\")\n    );\n    if (\n      window.innerWidth < 768 &&\n      this.previousScrollTop > window.scrollY &&\n      window.scrollY > utilityBarOffsetY\n    ) {\n      document.body.classList.add(\"utility-bar-sticky-mobile-copy-reveal\");\n    } else {\n      document.body.classList.remove(\"utility-bar-sticky-mobile-copy-reveal\");\n    }\n    this.previousScrollTop = window.scrollY;\n  }\n\n  ajaxLoadForm(evt) {\n    if (evt.type === \"submit\") {\n      evt.preventDefault();\n    }\n    const queryVals = [];\n    this.filters.querySelectorAll(\"input, select\").forEach((input) => {\n      if (\n        ((input.type !== \"checkbox\" && input.type !== \"radio\") ||\n          input.checked) && // is an active input value\n        input.value !== \"\" // has a value\n      ) {\n        queryVals.push([input.name, encodeURIComponent(input.value)]);\n      }\n    });\n    // new url\n    let newUrl = window.location.pathname;\n    queryVals.forEach((value) => {\n      newUrl += `&${value[0]}=${value[1]}`;\n    });\n    newUrl = newUrl.replace(\"&\", \"?\");\n    // load\n    this.ajaxLoadUrl.call(this, newUrl);\n  }\n\n  ajaxPopState() {\n    this.ajaxLoadUrl.call(this, document.location.href, true);\n  }\n\n  ajaxLoadUrl(url, noPushState) {\n    if (!noPushState) {\n      // update url history\n      let fullUrl = url;\n      if (fullUrl.slice(0, 1) === \"/\") {\n        fullUrl = `${window.location.protocol}//${window.location.host}${fullUrl}`;\n      }\n      window.history.pushState({ path: fullUrl }, \"\", fullUrl);\n    }\n\n    // limit render to section, if possible (added after pushState)\n    let fetchUrl = url;\n    if (this.dataset.filterSectionId) {\n      fetchUrl = `${url}${url.indexOf(\"?\") >= 0 ? \"&\" : \"?\"}section_id=${\n        this.dataset.filterSectionId\n      }`;\n    }\n\n    // start fetching URL\n    const refreshContainerSelector = \"[data-ajax-container]\";\n    const ajaxContainers = this.section.querySelectorAll(\n      refreshContainerSelector\n    );\n\n    // loading state\n    ajaxContainers.forEach((el) => el.classList.add(\"ajax-loading\"));\n\n    // cancel current fetch & fetch next\n    if (this.ajaxLoadUrlFetchAbortController) {\n      this.ajaxLoadUrlFetchAbortController.abort();\n    }\n    this.ajaxLoadUrlFetchAbortController = new AbortController();\n\n    fetch(fetchUrl, {\n      method: \"get\",\n      signal: this.ajaxLoadUrlFetchAbortController.signal,\n    })\n      .then((response) => {\n        if (!response.ok) {\n          throw new Error(`HTTP error! Status: ${response.status}`);\n        }\n        return response.text();\n      })\n      .then((response) => {\n        // save active element\n        if (document.activeElement) {\n          this.activeElementId = document.activeElement.id;\n        }\n\n        // before replace - check if container scrolls, if so find item at scroll top\n        const scrollContainer = this.querySelector(\".filters\");\n        let elAboveScrollTopData = null;\n        if (\n          scrollContainer &&\n          getComputedStyle(scrollContainer).overflow === \"auto\"\n        ) {\n          const allFilterChildren =\n            scrollContainer.querySelectorAll(\".filters *\");\n          let elAboveScrollTop = allFilterChildren[0];\n          for (let i = 1; i < allFilterChildren.length; i += 1) {\n            if (allFilterChildren[i].offsetTop) {\n              // if above fold\n              if (allFilterChildren[i].offsetTop < scrollContainer.scrollTop) {\n                // if below previously assigned element, assign\n                if (\n                  allFilterChildren[i].offsetTop > elAboveScrollTop.offsetTop\n                ) {\n                  elAboveScrollTop = allFilterChildren[i];\n                }\n              } else {\n                break;\n              }\n            }\n          }\n          if (elAboveScrollTop.offsetTop === 0) {\n            elAboveScrollTop = false;\n          } else {\n            // determine how to identify this element\n            elAboveScrollTopData = {\n              selector: \"\",\n              textContent: elAboveScrollTop.textContent,\n              extraScrollOffset:\n                scrollContainer.scrollTop - elAboveScrollTop.offsetTop,\n            };\n            const attributeNames = elAboveScrollTop.getAttributeNames();\n            for (let i = 0; i < attributeNames.length; i += 1) {\n              const attrName = attributeNames[i];\n              if (attrName === \"class\") {\n                Array.from(elAboveScrollTop.classList)\n                  .filter((a) => a !== \"filter-group__item--disabled\")\n                  .forEach((cl) => {\n                    elAboveScrollTopData.selector += `.${cl}`;\n                  });\n              } else {\n                elAboveScrollTopData.selector += `[${attrName}=\"${CSS.escape(\n                  elAboveScrollTop.getAttribute(attrName)\n                )}\"]`;\n              }\n            }\n          }\n        }\n\n        // replace contents\n        const template = document.createElement(\"template\");\n        template.innerHTML = response;\n        const newAjaxContainers = template.content.querySelectorAll(\n          refreshContainerSelector\n        );\n        newAjaxContainers.forEach((el, index) => {\n          ajaxContainers[index].innerHTML = el.innerHTML;\n        });\n\n        // init js\n        this.initFiltersEtc();\n\n        // after replace\n        if (elAboveScrollTopData) {\n          this.querySelectorAll(elAboveScrollTopData.selector).forEach((el) => {\n            if (el.textContent === elAboveScrollTopData.textContent) {\n              scrollContainer.scrollTop =\n                el.offsetTop + elAboveScrollTopData.extraScrollOffset;\n            }\n          });\n        }\n\n        // update mobile count\n        if (this.utilBarClone) {\n          const from = document.querySelector(\n            \".utility-bar:not(.utility-bar--sticky-mobile-copy) .utility-bar__centre\"\n          );\n          const to = this.utilBarClone.querySelector(\".utility-bar__centre\");\n          if (from && to) {\n            to.innerHTML = from.innerHTML;\n          }\n        }\n\n        // remove loading state\n        ajaxContainers.forEach((el) => el.classList.remove(\"ajax-loading\"));\n\n        // restore active element\n        if (this.activeElementId) {\n          const el = document.getElementById(this.activeElementId);\n          if (el) {\n            el.focus();\n          }\n        }\n\n        // scroll viewport (must be done after any page size changes)\n        const scrollToY =\n          theme.getOffsetTopFromDoc(\n            this.section.querySelector(\"[data-ajax-scroll-to]\")\n          ) - document.querySelector(\".section-header\").clientHeight;\n        window.scrollTo({\n          top: scrollToY,\n          behavior: \"smooth\",\n        });\n      });\n  }\n};\n\nwindow.customElements.define(\"filter-container\", FilterContainer);\n\n/* eslint-disable max-len */\nconst GalleryViewer = class extends HTMLElement {\n  connectedCallback() {\n    if (!this.initialised) {\n      this.initialised = true;\n\n      // ui\n      this.classList.add(\"gallery-viewer--pre-reveal\");\n      this.zoomContainer = this.querySelector(\n        \".gallery-viewer__zoom-container\"\n      );\n      this.thumbContainer = this.querySelector(\".gallery-viewer__thumbs\");\n      this.controlsContainer = this.querySelector(\".gallery-viewer__controls\");\n      this.previousBtn = this.querySelector(\".gallery-viewer__prev\");\n      this.nextBtn = this.querySelector(\".gallery-viewer__next\");\n\n      // consts\n      this.wheelZoomMultiplier = -0.001;\n      this.pinchZoomMultiplier = 0.003;\n      this.touchPanModifier = 1.0;\n\n      // vars\n      this.currentZoomImage = null;\n      this.currentTransform = {\n        panX: 0,\n        panY: 0,\n        zoom: 1,\n      };\n      this.pinchTracking = {\n        isTracking: false,\n        lastPinchDistance: 0,\n      };\n      this.touchTracking = {\n        isTracking: false,\n        lastTouchX: 0,\n        lastTouchY: 0,\n      };\n\n      // events\n      theme.addDelegateEventListener(\n        this,\n        \"click\",\n        \".gallery-viewer__thumb\",\n        this.onThumbClick.bind(this)\n      );\n      this.addEventListener(\"touchend\", this.stopTrackingTouch.bind(this));\n      this.addEventListener(\"touchmove\", this.trackInputMovement.bind(this));\n      this.addEventListener(\"mousemove\", this.trackInputMovement.bind(this));\n      this.addEventListener(\"wheel\", this.trackWheel.bind(this));\n      // prevent pan while swiping thumbnails\n      this.thumbContainer.addEventListener(\"touchmove\", (evt) =>\n        evt.stopPropagation()\n      );\n      this.previousBtn.addEventListener(\n        \"click\",\n        this.selectPreviousThumb.bind(this)\n      );\n      this.nextBtn.addEventListener(\"click\", this.selectNextThumb.bind(this));\n      this.zoomContainer.addEventListener(\n        \"click\",\n        this.onZoomContainerClick.bind(this)\n      );\n    }\n\n    document.documentElement.classList.add(\"gallery-viewer-open\");\n    this.addEventListener(\"keyup\", this.handleKeyup.bind(this));\n    setTimeout(() => this.classList.remove(\"gallery-viewer--pre-reveal\"), 10);\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  disconnectedCallback() {\n    document.documentElement.classList.remove(\"gallery-viewer-open\");\n  }\n\n  static createEl(type, className, appendTo, innerHTML) {\n    const el = document.createElement(type);\n    el.className = className;\n    if (type === \"a\") {\n      el.href = \"#\";\n    }\n    if (appendTo) {\n      appendTo.insertAdjacentElement(\"beforeend\", el);\n    }\n    if (innerHTML) {\n      el.innerHTML = innerHTML;\n    }\n    return el;\n  }\n\n  init(currentFullUrl) {\n    this.selectThumb(\n      [...this.thumbContainer.children].find(\n        (el) => el.dataset.zoomUrl === currentFullUrl\n      ) || this.thumbContainer.firstElementChild\n    );\n  }\n\n  panZoomImageFromCoordinate(inputX, inputY) {\n    // do nothing if the image fits, pan if not\n    const doPanX = this.currentZoomImage.clientWidth > this.clientWidth;\n    const doPanY = this.currentZoomImage.clientHeight > this.clientHeight;\n\n    if (doPanX || doPanY) {\n      const midX = this.clientWidth / 2;\n      const midY = this.clientHeight / 2;\n\n      const offsetFromCentreX = inputX - midX;\n      const offsetFromCentreY = inputY - midY;\n\n      // the offsetMultipler ensures it can only pan to the edge of the image, no further\n      let finalOffsetX = 0;\n      let finalOffsetY = 0;\n\n      if (doPanX) {\n        const offsetMultiplierX =\n          (this.currentZoomImage.clientWidth - this.clientWidth) / 2 / midX;\n        finalOffsetX = Math.round(-offsetFromCentreX * offsetMultiplierX);\n      }\n      if (doPanY) {\n        const offsetMultiplierY =\n          (this.currentZoomImage.clientHeight - this.clientHeight) / 2 / midY;\n        finalOffsetY = Math.round(-offsetFromCentreY * offsetMultiplierY);\n      }\n\n      this.currentTransform.panX = finalOffsetX;\n      this.currentTransform.panY = finalOffsetY;\n      this.alterCurrentPanBy(0, 0); // sanitise\n      this.updateImagePosition();\n    }\n  }\n\n  alterCurrentPanBy(x, y) {\n    this.currentTransform.panX += x;\n    // limit offset to keep most of image on screen\n    let panXMax =\n      (this.currentZoomImage.naturalWidth * this.currentTransform.zoom -\n        this.clientWidth) /\n      2.0;\n    panXMax = Math.max(panXMax, 0);\n    this.currentTransform.panX = Math.min(this.currentTransform.panX, panXMax);\n    this.currentTransform.panX = Math.max(this.currentTransform.panX, -panXMax);\n\n    this.currentTransform.panY += y;\n    let panYMax =\n      (this.currentZoomImage.naturalHeight * this.currentTransform.zoom -\n        this.clientHeight) /\n      2.0;\n    panYMax = Math.max(panYMax, 0);\n    this.currentTransform.panY = Math.min(this.currentTransform.panY, panYMax);\n    this.currentTransform.panY = Math.max(this.currentTransform.panY, -panYMax);\n    this.updateImagePosition();\n  }\n\n  setCurrentTransform(panX, panY, zoom) {\n    this.currentTransform.panX = panX;\n    this.currentTransform.panY = panY;\n    this.currentTransform.zoom = zoom;\n    this.alterCurrentTransformZoomBy(0);\n  }\n\n  alterCurrentTransformZoomBy(delta) {\n    this.currentTransform.zoom += delta;\n    // do not zoom out further than fit\n    const maxZoomX = this.clientWidth / this.currentZoomImage.naturalWidth;\n    const maxZoomY = this.clientHeight / this.currentZoomImage.naturalHeight;\n    this.currentTransform.zoom = Math.max(\n      this.currentTransform.zoom,\n      Math.min(maxZoomX, maxZoomY)\n    );\n\n    // do not zoom in further than native size\n    this.currentTransform.zoom = Math.min(this.currentTransform.zoom, 1.0);\n\n    // reasses pan bounds\n    this.alterCurrentPanBy(0, 0);\n    this.updateImagePosition();\n  }\n\n  updateImagePosition() {\n    this.currentZoomImage.style.transform = `translate3d(${this.currentTransform.panX}px, ${this.currentTransform.panY}px, 0) scale(${this.currentTransform.zoom})`;\n  }\n\n  selectThumb(thumb) {\n    [...thumb.parentElement.children].forEach((el) => {\n      if (el === thumb) {\n        el.classList.add(\"gallery-viewer__thumb--active\");\n      } else {\n        el.classList.remove(\"gallery-viewer__thumb--active\");\n      }\n    });\n\n    // replace zoom image\n    this.zoomContainer.classList.add(\"gallery-viewer__zoom-container--loading\");\n    this.currentZoomImage = GalleryViewer.createEl(\n      \"img\",\n      \"gallery-viewer__zoom-image\"\n    );\n    this.currentZoomImage.alt = \"\";\n    this.currentZoomImage.style.visibility = \"hidden\";\n    this.currentZoomImage.onload = () => {\n      this.zoomContainer.classList.remove(\n        \"gallery-viewer__zoom-container--loading\"\n      );\n      this.currentZoomImage.style.visibility = \"\";\n      this.currentZoomImage.style.top = `${\n        this.clientHeight / 2 - this.currentZoomImage.clientHeight / 2\n      }px`;\n      this.currentZoomImage.style.left = `${\n        this.clientWidth / 2 - this.currentZoomImage.clientWidth / 2\n      }px`;\n      this.setCurrentTransform(0, 0, 0); // centre, zoomed out\n    };\n    this.currentZoomImage.src = thumb.dataset.zoomUrl;\n    this.zoomContainer.replaceChildren(this.currentZoomImage);\n  }\n\n  selectPreviousThumb(evt) {\n    if (evt) evt.preventDefault();\n    if (this.thumbContainer.childElementCount < 2) return;\n\n    let previous = this.thumbContainer.querySelector(\n      \".gallery-viewer__thumb--active\"\n    ).previousElementSibling;\n    while (!previous || !previous.offsetParent) {\n      if (!previous) {\n        previous = this.thumbContainer.lastElementChild;\n      } else {\n        previous = previous.previousElementSibling;\n      }\n    }\n    this.selectThumb(previous);\n  }\n\n  selectNextThumb(evt) {\n    if (evt) evt.preventDefault();\n    if (this.thumbContainer.childElementCount < 2) return;\n\n    let next = this.thumbContainer.querySelector(\n      \".gallery-viewer__thumb--active\"\n    ).nextElementSibling;\n    while (!next || !next.offsetParent) {\n      if (!next) {\n        next = this.thumbContainer.firstElementChild;\n      } else {\n        next = next.nextElementSibling;\n      }\n    }\n    this.selectThumb(next);\n  }\n\n  stopTrackingTouch() {\n    this.pinchTracking.isTracking = false;\n    this.touchTracking.isTracking = false;\n  }\n\n  trackInputMovement(evt) {\n    evt.preventDefault();\n    if (evt.type === \"touchmove\" && evt.touches.length > 0) {\n      // pan\n      const touch1 = evt.touches[0];\n      if (!this.touchTracking.isTracking) {\n        this.touchTracking.isTracking = true;\n        this.touchTracking.lastTouchX = touch1.clientX;\n        this.touchTracking.lastTouchY = touch1.clientY;\n      } else {\n        this.alterCurrentPanBy(\n          (touch1.clientX - this.touchTracking.lastTouchX) *\n            this.touchPanModifier,\n          (touch1.clientY - this.touchTracking.lastTouchY) *\n            this.touchPanModifier\n        );\n        this.touchTracking.lastTouchX = touch1.clientX;\n        this.touchTracking.lastTouchY = touch1.clientY;\n      }\n\n      if (evt.touches.length === 2) {\n        // pinch\n        const touch2 = evt.touches[1];\n        const pinchDistance = Math.sqrt(\n          (touch1.clientX - touch2.clientX) ** 2 +\n            (touch1.clientY - touch2.clientY) ** 2\n        );\n        if (!this.pinchTracking.isTracking) {\n          this.pinchTracking.lastPinchDistance = pinchDistance;\n          this.pinchTracking.isTracking = true;\n        } else {\n          const pinchDelta =\n            pinchDistance - this.pinchTracking.lastPinchDistance;\n          this.alterCurrentTransformZoomBy(\n            pinchDelta * this.pinchZoomMultiplier\n          );\n          this.pinchTracking.lastPinchDistance = pinchDistance;\n        }\n      } else {\n        this.pinchTracking.isTracking = false;\n      }\n    } else {\n      // mousemove\n      this.panZoomImageFromCoordinate(evt.clientX, evt.clientY);\n    }\n  }\n\n  trackWheel(evt) {\n    evt.preventDefault();\n    if (evt.deltaY !== 0) {\n      this.alterCurrentTransformZoomBy(evt.deltaY * this.wheelZoomMultiplier);\n    }\n  }\n\n  onThumbClick(evt, thumb) {\n    evt.preventDefault();\n    this.selectThumb(thumb);\n  }\n\n  onZoomContainerClick(evt) {\n    evt.preventDefault();\n\n    if (this.currentTransform.zoom === 1.0) {\n      this.currentTransform.zoom = 0;\n      this.alterCurrentTransformZoomBy(0);\n    } else {\n      this.currentTransform.zoom = 1;\n      this.alterCurrentTransformZoomBy(0);\n      this.panZoomImageFromCoordinate(evt.clientX, evt.clientY);\n    }\n  }\n\n  handleKeyup(evt) {\n    switch (evt.key) {\n      case \"ArrowLeft\":\n        evt.preventDefault();\n        this.selectPreviousThumb();\n        break;\n      case \"ArrowRight\":\n        evt.preventDefault();\n        this.selectNextThumb();\n        break;\n    }\n  }\n};\n\nwindow.customElements.define(\"gallery-viewer\", GalleryViewer);\n\nconst LinkDropdown = class extends HTMLElement {\n  constructor() {\n    super();\n\n    this.open = false;\n    this.button = this.querySelector(\".link-dropdown__button\");\n    this.button.addEventListener(\"click\", this.toggle.bind(this));\n  }\n\n  connectedCallback() {\n    if (this.open) {\n      this.addDismissListener();\n    }\n  }\n\n  disconnectedCallback() {\n    if (this.open) {\n      this.removeDismissListener();\n    }\n  }\n\n  toggle(evt, isDismiss) {\n    if (!isDismiss) {\n      evt.preventDefault();\n      evt.stopPropagation();\n    }\n\n    const doExpand = this.button.getAttribute(\"aria-expanded\") === \"false\";\n    this.button.setAttribute(\"aria-expanded\", doExpand);\n    this.button.style.width = `${this.button.clientWidth}px`;\n\n    let newWidth = null;\n    const optsBox = this.button.nextElementSibling;\n    const isLeftAligned = this.button\n      .closest(\".link-dropdown\")\n      .classList.contains(\"link-dropdown--left-aligned\");\n    if (!isLeftAligned) {\n      if (doExpand) {\n        newWidth = optsBox.clientWidth;\n        // rtl - could be either side\n        if (document.querySelector(\"html[dir=rtl]\")) {\n          newWidth += parseInt(getComputedStyle(optsBox).left, 10);\n        } else {\n          newWidth += parseInt(getComputedStyle(optsBox).right, 10);\n        }\n        newWidth -= parseInt(\n          getComputedStyle(optsBox.querySelector(\".link-dropdown__link\"))\n            .paddingInlineStart,\n          10\n        );\n      } else {\n        newWidth =\n          parseInt(getComputedStyle(this.button).paddingInlineEnd, 10) +\n          Math.ceil(\n            this.button\n              .querySelector(\".link-dropdown__button-text\")\n              .getBoundingClientRect().width\n          );\n      }\n      setTimeout(() => {\n        this.button.style.width = `${newWidth}px`;\n      }, 10);\n    }\n\n    if (doExpand) {\n      this.open = true;\n      this.addDismissListener();\n    } else {\n      this.open = false;\n      this.removeDismissListener();\n    }\n  }\n\n  addDismissListener() {\n    this.dismissCallback = this.toggle.bind(this, true);\n    document.addEventListener(\"click\", this.dismissCallback);\n  }\n\n  removeDismissListener() {\n    document.removeEventListener(\"click\", this.dismissCallback);\n    this.dismissCallback = null;\n  }\n};\n\nwindow.customElements.define(\"link-dropdown\", LinkDropdown);\n\nconst MainNavigation = class extends HTMLElement {\n  constructor() {\n    super();\n\n    this.navHoverDelay = 250;\n    this.navLastOpenDropdown = null;\n    this.navOpenTimeoutId = -1;\n\n    // hover\n    this.querySelectorAll(\n      \".navigation__tier-1 > .navigation__item--with-children\"\n    ).forEach((el) => {\n      el.addEventListener(\"mouseenter\", this.onNavParentHoverIn.bind(this));\n    });\n    this.querySelectorAll(\n      \".navigation__tier-1 > .navigation__item--with-children\"\n    ).forEach((el) => {\n      el.addEventListener(\"mouseleave\", this.onNavParentHoverOut.bind(this));\n    });\n\n    // touch\n    theme.addDelegateEventListener(\n      this,\n      \"touchstart\",\n      \".navigation__tier-1 > .navigation__item--with-children > .navigation__link\",\n      (evt, el) => {\n        this.handleTouch(evt, el);\n      },\n      { passive: true }\n    );\n    theme.addDelegateEventListener(\n      this,\n      \"touchend\",\n      \".navigation__tier-1 > .navigation__item--with-children > .navigation__link\",\n      (evt, el) => {\n        this.handleTouch(evt, el);\n      }\n    );\n    theme.addDelegateEventListener(\n      this,\n      \"click\",\n      \".navigation__tier-1 > .navigation__item--with-children > .navigation__link\",\n      this.onNavParentHoverIn.bind(this)\n    );\n\n    // keypress\n    theme.addDelegateEventListener(\n      this,\n      \"keydown\",\n      \".navigation__tier-1 > .navigation__item--with-children > .navigation__link\",\n      this.onNavKeydown.bind(this)\n    );\n\n    // click #-link - open child nav\n    this.querySelectorAll(\n      '.navigation__link[href=\"#\"][aria-haspopup=\"true\"]'\n    ).forEach((el) => {\n      el.addEventListener(\"click\", (evt) => {\n        evt.preventDefault();\n        evt.currentTarget.nextElementSibling.dispatchEvent(\n          new Event(\"click\", { bubbles: true })\n        );\n      });\n    });\n\n    // transparent header hover\n    this.addEventListener(\"mouseenter\", this.handleNavHover.bind(this));\n    this.addEventListener(\"mouseleave\", this.handleNavHover.bind(this));\n  }\n\n  ensureDropdownsInPageBounds() {\n    this.querySelectorAll(\n      \".navigation__item--with-small-menu > .navigation__child-tier\"\n    ).forEach((el) => {\n      const parentBcr = el.parentElement.getBoundingClientRect();\n      const childBcr = el.getBoundingClientRect();\n      const diff = window.innerWidth - (parentBcr.left + childBcr.width);\n      if (diff < 25) {\n        el.style.setProperty(\"--nav-side-offset\", `${diff - 25}px`);\n      }\n    });\n  }\n\n  connectedCallback() {\n    // shuffle dropdowns off RHS of viewport\n    const debouncedEnsureDropdownsInPageBounds = debounce(\n      this.ensureDropdownsInPageBounds.bind(this),\n      300\n    );\n    debouncedEnsureDropdownsInPageBounds();\n    this.resizeObserver = new ResizeObserver((entries) => {\n      for (let i = 0; i < entries.length; i += 1) {\n        const entry = entries[i];\n        if (entry.contentBoxSize || entry.contentRect) {\n          debouncedEnsureDropdownsInPageBounds();\n        }\n      }\n    });\n    this.resizeObserver.observe(this);\n\n    // proxy for desktop nav interaction events\n    this.proxyTier1Nav = document.getElementById(this.dataset.proxyNav);\n\n    if (this.proxyTier1Nav) {\n      // reposition small menu\n      this.proxyTier1NavBoundEvents = [];\n\n      const boundOnProxyNavEnterSmallMenu =\n        this.onProxyNavEnterSmallMenu.bind(this);\n      this.proxyTier1Nav\n        .querySelectorAll(\".navigation__item--with-small-menu\")\n        .forEach((el) => {\n          el.addEventListener(\"mouseenter\", boundOnProxyNavEnterSmallMenu);\n          this.proxyTier1NavBoundEvents.push({\n            element: el,\n            name: \"mouseenter\",\n            fn: boundOnProxyNavEnterSmallMenu,\n          });\n        });\n\n      this.proxyTier1NavBoundEvents.push({\n        element: this.proxyTier1Nav,\n        name: \"touchstart\",\n        fn: theme.addDelegateEventListener(\n          this.proxyTier1Nav,\n          \"touchstart\",\n          \".navigation__item--with-small-menu\",\n          this.onProxyNavEnterSmallMenu.bind(this),\n          { passive: true }\n        ),\n      });\n\n      // transfer all events to main menu\n      const onProxyNavEnterLeaveLargeMenu = (evt) => {\n        const elIndex = [...evt.currentTarget.parentNode.children].indexOf(\n          evt.currentTarget\n        );\n        this.querySelectorAll(\".navigation__tier-1 > .navigation__item\")[\n          elIndex\n        ].dispatchEvent(new Event(evt.type));\n      };\n      this.proxyTier1Nav\n        .querySelectorAll(\n          \".navigation__tier-1 > .navigation__item--with-children\"\n        )\n        .forEach((el) => {\n          el.addEventListener(\"mouseenter\", onProxyNavEnterLeaveLargeMenu);\n          this.proxyTier1NavBoundEvents.push({\n            element: el,\n            name: \"mouseenter\",\n            fn: onProxyNavEnterLeaveLargeMenu,\n          });\n          el.addEventListener(\"mouseleave\", onProxyNavEnterLeaveLargeMenu);\n          this.proxyTier1NavBoundEvents.push({\n            element: el,\n            name: \"mouseleave\",\n            fn: onProxyNavEnterLeaveLargeMenu,\n          });\n        });\n\n      const eventNames = [\"touchstart\", \"touchend\", \"click\"];\n      for (let i = 0; i < eventNames.length; i += 1) {\n        const eventName = eventNames[i];\n        this.proxyTier1NavBoundEvents.push({\n          element: this.proxyTier1Nav,\n          name: eventName,\n          fn: theme.addDelegateEventListener(\n            this.proxyTier1Nav,\n            eventName,\n            \".navigation__tier-1 > .navigation__item--with-children > .navigation__link\",\n            (evt, el) => {\n              const elIndex = [...el.parentNode.parentNode.children].indexOf(\n                el.parentNode\n              );\n              const proxiedLink = this.querySelectorAll(\n                \".navigation__tier-1 > .navigation__item\"\n              )[elIndex].firstElementChild;\n              this.handleTouch(evt, proxiedLink);\n            },\n            { passive: eventName === \"touchstart\" }\n          ),\n        });\n      }\n\n      this.proxyTier1NavBoundEvents.push({\n        element: this.proxyTier1Nav,\n        name: \"keydown\",\n        fn: theme.addDelegateEventListener(\n          this.proxyTier1Nav,\n          \"keydown\",\n          \".navigation__tier-1 > .navigation__item--with-children > .navigation__link\",\n          (evt, el) => {\n            if (evt.key === \"Enter\") {\n              const elIndex = [...el.parentNode.parentNode.children].indexOf(\n                el.parentNode\n              );\n              const proxiedLink = this.querySelectorAll(\n                \".navigation__tier-1 > .navigation__item\"\n              )[elIndex].firstElementChild;\n              el.setAttribute(\n                \"aria-expanded\",\n                !proxiedLink.parentElement.classList.contains(\n                  \"navigation__item--show-children\"\n                )\n              );\n              this.onNavKeydown(evt, proxiedLink);\n            }\n          }\n        ),\n      });\n\n      // transparent header hover\n      const boundHandleNavHover = this.handleNavHover.bind(this);\n      this.proxyTier1Nav.addEventListener(\"mouseenter\", boundHandleNavHover);\n      this.proxyTier1Nav.addEventListener(\"mouseleave\", boundHandleNavHover);\n      this.proxyTier1NavBoundEvents.push({\n        element: this.proxyTier1Nav,\n        name: \"mouseenter\",\n        fn: boundHandleNavHover,\n      });\n      this.proxyTier1NavBoundEvents.push({\n        element: this.proxyTier1Nav,\n        name: \"mouseleave\",\n        fn: boundHandleNavHover,\n      });\n    }\n\n    // create mobile nav\n    const tDiv = document.createElement(\"div\");\n    tDiv.innerHTML = this.querySelector(\n      \".mobile-navigation-drawer-template\"\n    ).innerHTML;\n    this.mobileDrawer = tDiv.firstElementChild;\n\n    // add announcement bar items\n    const mobileDrawerFooter = this.mobileDrawer.querySelector(\n      \".mobile-navigation-drawer__footer\"\n    );\n    const annBarMenu = document.querySelector(\".announcement-bar .inline-menu\");\n    if (annBarMenu) {\n      const clone = annBarMenu.cloneNode(true);\n      clone.classList.remove(\"desktop-only\");\n      mobileDrawerFooter.appendChild(clone);\n    }\n\n    const annBarLocalizations = document.querySelector(\n      \".announcement-bar .header-localization\"\n    );\n    if (annBarLocalizations) {\n      const clone = annBarLocalizations.cloneNode(true);\n      clone.classList.remove(\"desktop-only\");\n      mobileDrawerFooter.appendChild(clone);\n\n      clone.querySelector(\"form\").addEventListener(\"change\", (evt) => {\n        const input = evt.target.previousElementSibling;\n        if (input && input.tagName === \"INPUT\") {\n          input.value = evt.detail.selectedValue;\n          evt.currentTarget.submit();\n        }\n      });\n    }\n\n    const annBarSocial = document.querySelector(\".announcement-bar .social\");\n    if (annBarSocial) {\n      const clone = annBarSocial.cloneNode(true);\n      clone.classList.remove(\"desktop-only\");\n      mobileDrawerFooter.appendChild(clone);\n    }\n\n    // ensure ids are unique\n    theme.suffixIds(this.mobileDrawer, \"MobileNav\");\n\n    // insert into page\n    document\n      .querySelector(\".section-header\")\n      .insertAdjacentElement(\"afterend\", this.mobileDrawer);\n\n    // event: open second tier\n    theme.addDelegateEventListener(\n      this.mobileDrawer,\n      \"click\",\n      \".navigation__tier-1 > .navigation__item > .navigation__children-toggle\",\n      (evt, delEl) => {\n        evt.preventDefault();\n\n        // set text in header\n        delEl.parentElement.classList.add(\"navigation__item--open\");\n        this.mobileDrawer.classList.add(\"mobile-navigation-drawer--child-open\");\n        this.mobileDrawer.querySelector(\".mobile-nav-title\").innerText =\n          delEl.previousElementSibling.innerText;\n\n        // position under header\n        delEl.nextElementSibling.style.top = `${Math.ceil(\n          this.mobileDrawer.querySelector(\".navigation__mobile-header\")\n            .clientHeight + 1\n        )}px`;\n\n        // scroll container\n        this.mobileDrawer\n          .closest(\".mobile-navigation-drawer\")\n          .scrollTo({ top: 0, left: 0, behavior: \"instant\" }); // 'smooth' not working in iOS 15\n      }\n    );\n\n    if (this.mobileDrawer.dataset.mobileExpandWithEntireLink === \"true\") {\n      theme.addDelegateEventListener(\n        this.mobileDrawer,\n        \"click\",\n        \".navigation__item--with-children > .navigation__link\",\n        (evt, delEl) => {\n          evt.preventDefault();\n          delEl.nextElementSibling.dispatchEvent(\n            new Event(\"click\", { bubbles: true, cancelable: true })\n          );\n        }\n      );\n    } else {\n      theme.addDelegateEventListener(\n        this.mobileDrawer,\n        \"click\",\n        '.navigation__item--with-children > .navigation__link[href=\"#\"]',\n        (evt, delEl) => {\n          evt.preventDefault();\n          delEl.nextElementSibling.dispatchEvent(\n            new Event(\"click\", { bubbles: true, cancelable: true })\n          );\n        }\n      );\n    }\n\n    // event: close second tier\n    theme.addDelegateEventListener(\n      this.mobileDrawer,\n      \"click\",\n      \".mobile-nav-back\",\n      (evt) => {\n        evt.preventDefault();\n        this.mobileDrawer.classList.remove(\n          \"mobile-navigation-drawer--child-open\"\n        );\n        this.mobileDrawer\n          .querySelectorAll(\".navigation__tier-1 > .navigation__item--open\")\n          .forEach((el) => {\n            el.classList.remove(\"navigation__item--open\");\n          });\n      }\n    );\n\n    // event: toggle third tier\n    theme.addDelegateEventListener(\n      this.mobileDrawer,\n      \"click\",\n      \".navigation__tier-2 > .navigation__item > .navigation__children-toggle\",\n      (evt, delEl) => {\n        evt.preventDefault();\n        const doOpen = !delEl.parentElement.classList.contains(\n          \"navigation__item--open\"\n        );\n\n        if (doOpen) {\n          delEl.parentElement.classList.add(\"navigation__item--open\");\n          delEl.nextElementSibling.style.height = `${delEl.nextElementSibling.firstElementChild.clientHeight}px`;\n        } else {\n          delEl.parentElement.classList.remove(\"navigation__item--open\");\n          delEl.nextElementSibling.style.height = \"\";\n        }\n      }\n    );\n  }\n\n  handleNavHover(evt) {\n    this.closest(\".section-header\").classList.toggle(\n      \"section-header--nav-hover\",\n      evt.type === \"mouseenter\"\n    );\n  }\n\n  onNavParentHoverIn(evt) {\n    const dropdownContainer = evt.currentTarget;\n    clearTimeout(this.navOpenTimeoutId);\n    clearTimeout(dropdownContainer.dataset.navCloseTimeoutId);\n    const openSiblings = [...dropdownContainer.parentNode.children].filter(\n      (child) =>\n        child !== dropdownContainer &&\n        child.classList.contains(\"navigation__item--show-children\")\n    );\n\n    // close all menus but last opened\n    openSiblings\n      .filter((el) => el !== this.navLastOpenDropdown)\n      .forEach((el) => el.classList.remove(\"navigation__item--show-children\"));\n    this.navLastOpenDropdown = dropdownContainer;\n\n    // show after a delay, based on first-open or not\n    const timeoutDelay = openSiblings.length === 0 ? 0 : this.navHoverDelay;\n\n    // open it\n    const newNavOpenTimeoutId = setTimeout(() => {\n      [...dropdownContainer.parentNode.children].forEach((el) => {\n        if (el === dropdownContainer) {\n          el.classList.add(\"navigation__item--show-children\");\n        } else {\n          el.classList.remove(\"navigation__item--show-children\");\n        }\n      });\n      dropdownContainer\n        .closest(\".section-header\")\n        .classList.add(\"section-header--nav-open\");\n    }, timeoutDelay);\n\n    this.navOpenTimeoutId = newNavOpenTimeoutId;\n    dropdownContainer.dataset.navOpenTimeoutId = newNavOpenTimeoutId;\n\n    dropdownContainer.firstElementChild.setAttribute(\"aria-expanded\", true);\n  }\n\n  onNavParentHoverOut(evt) {\n    // cancel opening, close after delay, and clear transforms\n    const dropdownContainer = evt.currentTarget;\n    clearTimeout(dropdownContainer.dataset.navOpenTimeoutId);\n    dropdownContainer.dataset.navCloseTimeoutId = setTimeout(() => {\n      dropdownContainer.classList.remove(\"navigation__item--show-children\");\n      dropdownContainer\n        .closest(\".section-header\")\n        .classList.remove(\"section-header--nav-open\");\n    }, this.navHoverDelay);\n\n    dropdownContainer.firstElementChild.setAttribute(\"aria-expanded\", false);\n  }\n\n  handleTouch(evt, link) {\n    if (window.innerWidth > 767) {\n      if (evt.type === \"touchstart\") {\n        link.dataset.touchstartedAt = evt.timeStamp.toString();\n      } else if (evt.type === \"touchend\") {\n        // down & up in under a second - presume tap\n        if (evt.timeStamp - parseInt(link.dataset.touchstartedAt, 10) < 1000) {\n          link.dataset.touchOpenTriggeredAt = evt.timeStamp.toString();\n          if (\n            link.parentElement.classList.contains(\n              \"navigation__item--show-children\"\n            )\n          ) {\n            // trigger close\n            link.parentElement.dispatchEvent(new Event(\"mouseleave\"));\n          } else {\n            // trigger close on any open items\n            this.querySelectorAll(\".navigation__item--show-children\").forEach(\n              (el) => el.dispatchEvent(new Event(\"mouseleave\"))\n            );\n            // trigger open\n            link.parentElement.dispatchEvent(new Event(\"mouseenter\"));\n          }\n          // prevent fake click\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      } else if (evt.type === \"click\") {\n        // if touch open was triggered very recently, prevent click event\n        if (\n          link.dataset.touchOpenTriggeredAt &&\n          evt.timeStamp - parseInt(link.dataset.touchOpenTriggeredAt, 10) < 1000\n        ) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    }\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  onNavKeydown(evt, el) {\n    if (evt.key === \"Enter\") {\n      if (\n        el.parentElement.classList.contains(\"navigation__item--show-children\")\n      ) {\n        el.parentElement.dispatchEvent(new Event(\"mouseleave\"));\n      } else {\n        el.parentElement.dispatchEvent(new Event(\"mouseenter\"));\n      }\n      evt.preventDefault();\n    }\n  }\n\n  onProxyNavEnterSmallMenu(evt, delEl) {\n    const el = delEl || evt.currentTarget;\n    const elIndex = [...el.parentNode.children].indexOf(el);\n    const dropdown = this.querySelectorAll(\n      \".navigation__tier-1 > .navigation__item\"\n    )[elIndex].querySelector(\".navigation__tier-2-container\");\n    if (document.querySelector('html[dir=\"rtl\"]')) {\n      dropdown.style.right = `${\n        dropdown.offsetParent.clientWidth -\n        (theme.getOffsetLeftFromDoc(el) + el.clientWidth)\n      }px`;\n    } else {\n      dropdown.style.left = `${theme.getOffsetLeftFromDoc(el)}px`;\n    }\n  }\n\n  disconnectedCallback() {\n    // remove externalities\n    this.mobileDrawer.remove();\n\n    if (this.proxyTier1NavBoundEvents) {\n      for (let i = 0; i < this.proxyTier1NavBoundEvents.length; i += 1) {\n        this.proxyTier1NavBoundEvents[i].element.removeEventListener(\n          this.proxyTier1NavBoundEvents[i].name,\n          this.proxyTier1NavBoundEvents[i].fn\n        );\n      }\n    }\n  }\n};\n\nwindow.customElements.define(\"main-navigation\", MainNavigation);\n\nconst ProductBlock = class extends HTMLElement {\n  constructor() {\n    super();\n    window.initLazyScript(this, this.init.bind(this));\n  }\n\n  init() {\n    this.images = Array.from(this.querySelectorAll(\".product-block__image\"));\n    if (this.images.length > 1) {\n      this.initImagePagination();\n      this.monitorSwatchSelection();\n      this.initCustomLazyLoading();\n    }\n  }\n\n  initCustomLazyLoading() {\n    // preload hover images after a delay\n    setTimeout(() => {\n      this.querySelector(\n        \".product-block__image--show-on-hover\"\n      ).classList.remove(\"product-block__image--inactivated\");\n    }, 1000);\n    // activate all images after first interaction\n    this.boundLazyLoadAll = this.lazyLoadAll.bind(this);\n    this.addEventListener(\"mouseenter\", this.boundLazyLoadAll);\n    this.addEventListener(\"touchstart\", this.boundLazyLoadAll, {\n      passive: true,\n    });\n  }\n\n  lazyLoadAll() {\n    this.querySelectorAll(\".product-block__image--inactivated\").forEach((el) =>\n      el.classList.remove(\"product-block__image--inactivated\")\n    );\n    this.removeEventListener(\"mouseenter\", this.boundLazyLoadAll);\n    this.removeEventListener(\"touchstart\", this.boundLazyLoadAll);\n  }\n\n  // get image at index, safely wrapping index\n  getImageAt(index) {\n    // positive modulo, like it should be, JS does not do *maths* correctly\n    return this.images[\n      ((index % this.images.length) + this.images.length) % this.images.length\n    ];\n  }\n\n  incrementActiveImage(increment) {\n    let index = 0;\n    for (let i = 0; i < this.images.length; i += 1) {\n      if (this.images[i].classList.contains(\"product-block__image--active\")) {\n        index = i;\n        break;\n      }\n    }\n    this.setActiveImage(index + increment);\n  }\n\n  setActiveImage(index) {\n    const newActiveImage = this.getImageAt(index);\n    const hoverImage = this.getImageAt(index + 1);\n\n    // set new active image visibility\n    [...newActiveImage.parentElement.children].forEach((el) => {\n      el.classList.toggle(\n        \"product-block__image--active\",\n        el === newActiveImage\n      );\n      el.classList.toggle(\n        \"product-block__image--show-on-hover\",\n        el === hoverImage\n      );\n    });\n\n    // dots\n    this.querySelectorAll(\".product-block__image-dot\").forEach((el, iter) => {\n      el.classList.toggle(\"product-block__image-dot--active\", iter === index);\n    });\n  }\n\n  initImagePagination() {\n    // next button\n    this.querySelector(\".image-page-button--next\").addEventListener(\n      \"click\",\n      (evt) => {\n        evt.preventDefault();\n        this.incrementActiveImage(1);\n      }\n    );\n\n    // previous button\n    this.querySelector(\".image-page-button--previous\").addEventListener(\n      \"click\",\n      (evt) => {\n        evt.preventDefault();\n        this.incrementActiveImage(-1);\n      }\n    );\n\n    // swipe (when not in a carousel)\n    if (!this.closest(\".carousel, .product-grid--scrollarea\")) {\n      const touchContainer = this.querySelector(\n        \".image-cont--with-secondary-image\"\n      );\n      touchContainer.addEventListener(\n        \"touchstart\",\n        (evt) => {\n          // swipe may end in another block\n          theme.productBlockTouchTracking = true;\n          theme.productBlockTouchStartX = evt.touches[0].clientX;\n          theme.productBlockTouchStartY = evt.touches[0].clientY;\n        },\n        { passive: true }\n      );\n\n      touchContainer.addEventListener(\n        \"touchmove\",\n        (evt) => {\n          if (theme.productBlockTouchTracking) {\n            if (\n              Math.abs(evt.touches[0].clientY - theme.productBlockTouchStartY) <\n              30\n            ) {\n              const deltaX =\n                evt.touches[0].clientX - theme.productBlockTouchStartX;\n              if (deltaX > 25) {\n                this.incrementActiveImage(-1);\n                theme.productBlockTouchTracking = false;\n              } else if (deltaX < -25) {\n                this.incrementActiveImage(1);\n                theme.productBlockTouchTracking = false;\n              }\n            }\n          }\n        },\n        { passive: true }\n      );\n\n      touchContainer.addEventListener(\"touchend\", () => {\n        theme.productBlockTouchTracking = false;\n      });\n    }\n  }\n\n  onSelectSwatch(evt) {\n    // evt.preventDefault();\n    let index = -1;\n\n    for (let i = 0; i < this.images.length; i += 1) {\n      if (this.images[i].dataset.mediaId === evt.currentTarget.dataset.media) {\n        index = i;\n        break;\n      }\n    }\n\n    if (index < 0) return;\n\n    this.setActiveImage(index);\n\n    // include in URL\n    const { optionName } = evt.currentTarget.closest(\n      \".product-block-options\"\n    ).dataset;\n    const optionValue = evt.currentTarget.dataset.optionItem;\n    this.querySelectorAll(\".product-link, .quickbuy-toggle\").forEach((el) => {\n      const url = new URL(el.href);\n      const params = new URLSearchParams(url.search);\n      params.set(optionName, optionValue);\n      el.href = `${url.pathname}?${params}`;\n      el.rel = \"nofollow\";\n    });\n  }\n\n  monitorSwatchSelection() {\n    this.querySelectorAll(\"[data-media].product-block-options__item\").forEach(\n      (el) => {\n        el.addEventListener(\"mouseenter\", this.onSelectSwatch.bind(this));\n        el.addEventListener(\"click\", this.onSelectSwatch.bind(this));\n      }\n    );\n  }\n};\n\nwindow.customElements.define(\"product-block\", ProductBlock);\n\nconst ensureArisLeashSupportImages = () => {\n  if (document.documentElement.lang.toLowerCase().startsWith(\"fr\")) {\n    document\n      .querySelectorAll(\".engraving-preview #curved-text\")\n      .forEach((previewText) => {\n        if (previewText.textContent.trim() === \"Your Name\") {\n          previewText.textContent = \"Votre nom\";\n        }\n      });\n  }\n\n  const imageRules = [\n    {\n      text: /sports leash|cordon sport/i,\n      src: \"https://product-options-img.avisplus.io/undefined/store/1729539945270.png\",\n      alt: \"Sports leash\",\n    },\n    {\n      text: /floating leash|cordon flottant/i,\n      src: \"https://product-options-img.avisplus.io/undefined/store/1729539880767.png\",\n      alt: \"Floating leash\",\n    },\n  ];\n\n  document.querySelectorAll(\".avp-paragraph\").forEach((container) => {\n    if (container.querySelector(\"img\")) return;\n\n    const rule = imageRules.find((item) => item.text.test(container.textContent));\n    if (!rule) return;\n\n    const image = document.createElement(\"img\");\n    image.src = rule.src;\n    image.alt = rule.alt;\n    image.width = 250;\n    image.loading = \"lazy\";\n    image.dataset.activerxOptionImage = \"true\";\n    container.prepend(image);\n  });\n};\n\nconst arisOptionImageObserver = new MutationObserver(\n  ensureArisLeashSupportImages\n);\narisOptionImageObserver.observe(document.documentElement, {\n  childList: true,\n  subtree: true,\n});\nensureArisLeashSupportImages();\n\nconst MediaGallery = class extends HTMLElement {\n  constructor() {\n    super();\n    this.section = this.closest(\".js-product\");\n    this.mainImageContainer = this.querySelector(\".main-image\");\n    this.slideshow = this.mainImageContainer.querySelector(\n      \".main-image carousel-slider\"\n    );\n    this.collage = this.querySelector(\".product-media-collage\");\n    this.xrButton = this.querySelector(\"[data-shopify-xr]\");\n    this.variantPicker = this.section.querySelector(\"variant-picker\");\n    this.mediaGroupingEnabled =\n      this.hasAttribute(\"data-media-grouping-enabled\") &&\n      this.getMediaGroupData();\n    this.mediaLists = [\n      this.querySelectorAll(\".main-image .slider__item\"),\n      this.querySelectorAll(\".product-media-collage__item\"),\n      this.querySelectorAll(\".thumbnails .slider__item\"),\n    ];\n\n    if (this.variantPicker) {\n      const toLoad = [this.variantPicker];\n      if (this.slideshow.offsetParent) {\n        toLoad.push(this.slideshow);\n      }\n      const thumbnailSlider = this.querySelector(\"carousel-slider.thumbnails\");\n      if (thumbnailSlider && thumbnailSlider.offsetParent) {\n        toLoad.push(thumbnailSlider);\n      }\n      theme.whenComponentLoaded(toLoad, this.setFromVariantPicker.bind(this));\n      if (this.mediaGroupingEnabled) {\n        this.initExternalVariantMediaGrouping();\n      }\n    } else if (this.mediaGroupingEnabled) {\n      this.initExternalVariantMediaGrouping();\n    }\n\n    if (this.hasAttribute(\"data-zoom-enabled\")) {\n      this.galleryModal = this.querySelector(\n        \".js-media-zoom-template\"\n      ).content.firstElementChild.cloneNode(true);\n      this.mediaLists.push(\n        this.galleryModal.querySelectorAll(\".gallery-viewer__thumb\")\n      );\n      theme.addDelegateEventListener(\n        this,\n        \"click\",\n        \".show-gallery\",\n        this.openGalleryViewer.bind(this)\n      );\n\n      if (this.hasAttribute(\"data-zoom-preload\")) {\n        this.mainImageContainer.addEventListener(\n          \"mouseover\",\n          MediaGallery.hoverMainImage.bind(this)\n        );\n        this.mainImageContainer.addEventListener(\n          \"touchstart\",\n          MediaGallery.hoverMainImage.bind(this)\n        );\n      }\n    }\n\n    this.section.addEventListener(\n      \"on:carousel-slider:select\",\n      this.selectMainMedia.bind(this)\n    );\n    theme.addDelegateEventListener(\n      this,\n      \"click\",\n      \".thumbnail\",\n      this.selectThumbnail.bind(this)\n    );\n    this.section.addEventListener(\n      \"on:variant:change\",\n      this.onVariantChange.bind(this)\n    );\n\n    // preload slideshow images after a short delay, if slideshow is visible\n    setTimeout(() => {\n      if (this.slideshow.offsetParent) {\n        this.slideshow.querySelectorAll(\".theme-img\").forEach((el) => {\n          el.loading = \"eager\";\n        });\n      }\n    }, 3000);\n  }\n\n  setFromVariantPicker() {\n    if (this.mediaGroupingEnabled) {\n      this.setMediaGroupOnFirstLoad();\n    } else {\n      // Find which variant is selected and set active media.\n      const variant = this.variantPicker.getSelectedVariant();\n      if (variant && variant.featured_media) {\n        this.setActiveMedia(variant.featured_media.id, true, true);\n      }\n    }\n  }\n\n  /**\n   * Run on first load to set initial media group and focussed image\n   */\n  setMediaGroupOnFirstLoad() {\n    this.setActiveMediaGroup(this.getMediaGroupFromOptionSelectors());\n\n    // Find which variant is selected and set active media.\n    const variant =\n      this.variantPicker.getSelectedVariant() ||\n      this.getCurrentVariantForMediaGrouping();\n    if (variant && variant.featured_media) {\n      this.setActiveMedia(variant.featured_media.id, true, true);\n      return;\n    }\n\n    // Default to first visible image.\n    this.setActiveMedia(\n      this.querySelector(\".thumbnails .slider__item:not([hidden])\").dataset\n        .mediaId,\n      false,\n      true\n    );\n  }\n\n  /**\n   * App-driven option pickers update the hidden variant ID without using the\n   * theme's native variant-picker element, so keep media grouping in sync here.\n   */\n  initExternalVariantMediaGrouping() {\n    const syncMediaGroup = () => this.setMediaGroupFromCurrentVariant();\n\n    window.setTimeout(syncMediaGroup, 0);\n    window.setTimeout(syncMediaGroup, 500);\n    window.setTimeout(syncMediaGroup, 1500);\n    this.section.addEventListener(\"change\", () =>\n      window.setTimeout(syncMediaGroup, 0)\n    );\n    this.section.addEventListener(\"click\", (evt) => {\n      if (evt.target.closest(\"media-gallery\")) return;\n      window.setTimeout(syncMediaGroup, 150);\n    });\n  }\n\n  getProductDataForMediaGrouping() {\n    if (\n      window.AvisOptionsData &&\n      window.AvisOptionsData.product_info &&\n      window.AvisOptionsData.product_info.product\n    ) {\n      return window.AvisOptionsData.product_info.product;\n    }\n\n    if (window.AllProductDetail && window.AllProductDetail.default) {\n      return window.AllProductDetail.default;\n    }\n\n    const variantDataEl = this.variantPicker\n      ? this.variantPicker.querySelector('script[type=\"application/json\"]')\n      : this.section.querySelector(\n          'variant-picker script[type=\"application/json\"]'\n        );\n\n    if (variantDataEl) {\n      try {\n        return JSON.parse(variantDataEl.textContent);\n      } catch (error) {\n        return false;\n      }\n    }\n\n    return false;\n  }\n\n  getCurrentVariantForMediaGrouping() {\n    const productData = this.getProductDataForMediaGrouping();\n    if (!productData || !Array.isArray(productData.variants)) return false;\n\n    const variantInput = this.section.querySelector('[name=\"id\"]');\n    const variantId =\n      (variantInput && variantInput.value) ||\n      new URLSearchParams(window.location.search).get(\"variant\") ||\n      window.variantIdSelected;\n\n    if (variantId) {\n      const selectedVariant = productData.variants.find(\n        (variant) => String(variant.id) === String(variantId)\n      );\n      if (selectedVariant) return selectedVariant;\n    }\n\n    return productData.variants[0] || false;\n  }\n\n  setMediaGroupFromCurrentVariant() {\n    const variant = this.getCurrentVariantForMediaGrouping();\n    if (!variant) return;\n\n    const mediaGroupData = this.getMediaGroupData();\n    const groupOptionIndex = mediaGroupData.groupOptionIndex;\n    const groupName =\n      mediaGroupData.variantMediaGroupingEnabled && variant.id\n        ? `variant:${variant.id}`\n        : (variant.options && variant.options[groupOptionIndex]) ||\n          variant[`option${groupOptionIndex + 1}`];\n\n    if (groupName) {\n      this.setActiveMediaGroup(groupName);\n    }\n    const groupChanged = this.mediaGroupChanged;\n\n    if (groupChanged && variant.featured_media && variant.featured_media.id) {\n      this.setActiveMedia(variant.featured_media.id, true);\n    }\n  }\n\n  /**\n   * Hover main image.\n   * @param {Event} evt - hover event for image\n   */\n  static hoverMainImage(evt) {\n    MediaGallery.loadImage(\n      evt.currentTarget.querySelector(\".slider__item.is-active a.show-gallery\")\n    );\n  }\n\n  /**\n   * Open large image viewer.\n   * @param {Event} evt - click event for image\n   * @param {Element} imageLink - link clicked on\n   */\n  openGalleryViewer(evt, imageLink) {\n    evt.preventDefault();\n\n    // add to document on first open\n    if (!this.galleryModal.parentElement) {\n      document.body.appendChild(this.galleryModal);\n    }\n\n    this.galleryModal.open(imageLink);\n    const viewer = this.galleryModal.querySelector(\"gallery-viewer\");\n    viewer.init(imageLink.getAttribute(\"href\"));\n    viewer.focus();\n\n    if (this.hasAttribute(\"data-zoom-preload\")) {\n      this.mediaLists[0].forEach((sliderItem) => {\n        MediaGallery.loadImage(sliderItem.querySelector(\"a.show-gallery\"));\n      });\n    }\n  }\n\n  /**\n   * Load an image.\n   * @param {Element} anchor - anchor element\n   */\n  static loadImage(anchor) {\n    if (\n      anchor.hasAttribute(\"data-loading\") ||\n      anchor.hasAttribute(\"data-loaded\")\n    )\n      return;\n\n    anchor.setAttribute(\"data-loading\", \"\");\n\n    const image = new Image(5000);\n    image.addEventListener(\n      \"load\",\n      () => {\n        anchor.removeAttribute(\"data-loading\");\n        anchor.setAttribute(\"data-loaded\", \"\");\n      },\n      {\n        once: true,\n      }\n    );\n    image.src = anchor.href;\n  }\n\n  /**\n   * Handle a change in variant on the page.\n   * @param {Event} evt - variant change event dispatched by variant-picker\n   */\n  onVariantChange(evt) {\n    if (this.mediaGroupingEnabled) {\n      this.setActiveMediaGroup(this.getMediaGroupFromOptionSelectors(evt));\n    }\n\n    if (evt.detail.variant && evt.detail.variant.featured_media) {\n      this.setActiveMedia(evt.detail.variant.featured_media.id, true);\n    } else if (this.mediaGroupChanged) {\n      // default to first visible image, if group changed and current variant has no related image\n      this.setActiveMedia(\n        this.querySelector(\".thumbnails .slider__item:not([hidden])\").dataset\n          .mediaId,\n        true\n      );\n    }\n  }\n\n  /**\n   * Gets the media group from currently selected variant options.\n   * @param {Event} evt - variant change event dispatched by variant-picker\n   * @returns {?object}\n   */\n  getMediaGroupFromOptionSelectors(evt) {\n    const mediaGroupData = this.getMediaGroupData();\n\n    if (mediaGroupData.variantMediaGroupingEnabled) {\n      const variant =\n        (evt && evt.detail && evt.detail.variant) ||\n        (this.variantPicker && this.variantPicker.getSelectedVariant()) ||\n        this.getCurrentVariantForMediaGrouping();\n      if (variant && variant.id) return `variant:${variant.id}`;\n    }\n\n    if (evt) {\n      return evt.detail.selectedOptions[\n        mediaGroupData.groupOptionIndex\n      ];\n    }\n\n    return this.variantPicker.getSelectedOptions()[\n      mediaGroupData.groupOptionIndex\n    ];\n  }\n\n  normalizeMediaGroupValue(value) {\n    if (value === true) return true;\n    return String(value || \"\").replace(/\\\\\\//g, \"/\").trim();\n  }\n\n  getPrescriptionOptionType(value) {\n    const normalizedValue = String(value || \"\")\n      .normalize(\"NFD\")\n      .replace(/[\\u0300-\\u036f]/g, \"\")\n      .toLowerCase()\n      .trim();\n\n    if (\n      /non[- ]?prescription|sans ordonnance|sans correction/.test(\n        normalizedValue\n      )\n    ) {\n      return \"non-prescription\";\n    }\n\n    if (/prescription|ordonnance|corrective/.test(normalizedValue)) {\n      return \"prescription\";\n    }\n\n    return false;\n  }\n\n  rebuildMediaGroupDataFromVariants(mediaData) {\n    const productData = this.getProductDataForMediaGrouping();\n    const mediaItems = this.querySelectorAll(\n      \".main-image .slider__item[data-media-id]\"\n    );\n\n    if (\n      !productData ||\n      !Array.isArray(productData.variants) ||\n      !Number.isInteger(mediaData.groupOptionIndex)\n    ) {\n      return mediaData;\n    }\n\n    const productMediaData = Array.isArray(productData.media)\n      ? productData.media\n          .map((media) => ({\n            id: String(media.id || \"\"),\n            src:\n              media.src ||\n              (media.preview_image && media.preview_image.src) ||\n              \"\",\n          }))\n          .filter((media) => media.id)\n      : [];\n    const mediaItemData = mediaItems.length\n      ? [...mediaItems].map((mediaItem) => {\n          const image = mediaItem.querySelector(\"img\");\n          return {\n            id: String(mediaItem.dataset.mediaId || \"\"),\n            src: image ? image.currentSrc || image.src || \"\" : \"\",\n          };\n        })\n      : productMediaData;\n\n    if (!mediaItemData.length) return mediaData;\n\n    const productMediaSources = [];\n    productMediaData.forEach((media) => productMediaSources.push(media.src));\n    productData.variants.forEach((variant) => {\n      if (variant.featured_media) {\n        productMediaSources.push(\n          variant.featured_media.src,\n          variant.featured_media.preview_image &&\n            variant.featured_media.preview_image.src\n        );\n      }\n      if (variant.featured_image) {\n        productMediaSources.push(variant.featured_image.src);\n      }\n    });\n    const hasSeparatePrescriptionMedia = [\n      ...mediaItemData.map((mediaItem) => mediaItem.src),\n      ...productMediaSources,\n    ].some((src) => /prescription|precription/i.test(src || \"\"));\n    const prescriptionOptionTypes = productData.variants.map((variant) =>\n      this.getPrescriptionOptionType(\n        (variant.options && variant.options[0]) || variant.option1\n      )\n    );\n    const shouldSplitSeparatePrescriptionMedia =\n      hasSeparatePrescriptionMedia &&\n      prescriptionOptionTypes.includes(\"prescription\") &&\n      prescriptionOptionTypes.includes(\"non-prescription\");\n\n    const groupByFeaturedMediaId = {};\n    productData.variants.forEach((variant) => {\n      if (!variant.featured_media || !variant.featured_media.id) return;\n\n      const groupValue =\n        (variant.options && variant.options[mediaData.groupOptionIndex]) ||\n        variant[`option${mediaData.groupOptionIndex + 1}`];\n\n      if (groupValue) {\n        const featuredMediaId = String(variant.featured_media.id);\n        if (!groupByFeaturedMediaId[featuredMediaId]) {\n          groupByFeaturedMediaId[featuredMediaId] = [];\n        }\n        groupByFeaturedMediaId[featuredMediaId].push(\n          shouldSplitSeparatePrescriptionMedia && variant.id\n            ? `variant:${variant.id}`\n            : this.normalizeMediaGroupValue(groupValue)\n        );\n      }\n    });\n\n    if (!Object.keys(groupByFeaturedMediaId).length) return mediaData;\n\n    let currentGroups = [];\n    const rebuiltMedia = {};\n    mediaItemData.forEach((mediaItem) => {\n      const mediaId = String(mediaItem.id || \"\");\n      if (groupByFeaturedMediaId[mediaId]) {\n        currentGroups = groupByFeaturedMediaId[mediaId];\n      }\n      rebuiltMedia[mediaId] = currentGroups.length\n        ? currentGroups.map((group) => ({ group }))\n        : [{ group: \"Null\" }];\n    });\n\n    if (Object.keys(rebuiltMedia).length) {\n      mediaData.media = rebuiltMedia;\n      mediaData.variantMediaGroupingEnabled =\n        shouldSplitSeparatePrescriptionMedia;\n    }\n\n    return mediaData;\n  }\n\n  /**\n   * Gets the variant media associations for a product.\n   * @returns {?object}\n   */\n  getMediaGroupData() {\n    if (typeof this.variantMediaData === \"undefined\") {\n      const dataEl = this.querySelector(\".js-data-variant-media\");\n\n      if (dataEl) {\n        const rawTextContent = dataEl.textContent;\n\n        // Create an object to store the result\n        const aggregatedMediaData = {\n          groupOptionName: \"\",\n          groupOptionIndex: \"\",\n          media: {},\n        };\n\n        // Extract the groupOptionName and groupOptionIndex\n        const groupOptionNameMatch = rawTextContent.match(\n          /\"groupOptionName\":\"([^\"]+)\"/\n        );\n        const groupOptionIndexMatch = rawTextContent.match(\n          /\"groupOptionIndex\":(\\d+)/\n        );\n        if (groupOptionNameMatch) {\n          aggregatedMediaData.groupOptionName = groupOptionNameMatch[1];\n        }\n        if (groupOptionIndexMatch) {\n          aggregatedMediaData.groupOptionIndex = parseInt(\n            groupOptionIndexMatch[1],\n            10\n          );\n        }\n\n        // Use a regex to extract all media entries\n        const mediaMatches = rawTextContent.match(\n          /\"(\\d+)\":\\s*{\\s*\"group\":\\s*\"([^\"]+)\"\\s*}/g\n        );\n\n        if (mediaMatches) {\n          mediaMatches.forEach((entry) => {\n            const mediaIdMatch = entry.match(\n              /\"(\\d+)\":\\s*{\\s*\"group\":\\s*\"([^\"]+)\"/\n            );\n            if (mediaIdMatch) {\n              const mediaId = mediaIdMatch[1];\n              const groupValue = this.normalizeMediaGroupValue(\n                mediaIdMatch[2]\n              );\n\n              // If the mediaId doesn't exist yet, create an array for it\n              if (!aggregatedMediaData.media[mediaId]) {\n                aggregatedMediaData.media[mediaId] = [];\n              }\n\n              // Add the group to the media array\n              aggregatedMediaData.media[mediaId].push({ group: groupValue });\n            }\n          });\n        }\n\n        this.variantMediaData =\n          this.rebuildMediaGroupDataFromVariants(aggregatedMediaData);\n      } else {\n        this.variantMediaData = false;\n      }\n    }\n\n    if (\n      this.variantMediaData &&\n      !this.variantMediaData.variantMediaGroupingEnabled &&\n      this.getProductDataForMediaGrouping()\n    ) {\n      this.variantMediaData = this.rebuildMediaGroupDataFromVariants(\n        this.variantMediaData\n      );\n    }\n\n    if (\n      this.variantMediaData &&\n      this.variantMediaData.variantMediaGroupingEnabled &&\n      !this.variantMediaDataInitialSyncQueued\n    ) {\n      this.variantMediaDataInitialSyncQueued = true;\n      window.setTimeout(() => this.setMediaGroupFromCurrentVariant(), 0);\n      window.setTimeout(() => this.setMediaGroupFromCurrentVariant(), 500);\n    }\n\n    return this.variantMediaData;\n  }\n\n  /**\n   * Show only images associated to the current variant.\n   * @param {string} groupName - optional - Group to show (uses this.currentItem if empty)\n   */\n  setActiveMediaGroup(groupName) {\n    const normalizedGroupName = this.normalizeMediaGroupValue(groupName);\n    this.mediaGroupChanged = this.currentMediaGroup !== normalizedGroupName;\n    this.currentMediaGroup = normalizedGroupName;\n\n    if (!this.mediaGroupChanged) return;\n\n    if (!normalizedGroupName) {\n      this.mediaLists.forEach((list) => {\n        list.forEach((mediaItem) => {\n          mediaItem.hidden = false;\n        });\n      });\n      return;\n    }\n\n    const mediaGroupData = this.getMediaGroupData();\n    const hasMatchingMedia = Object.values(mediaGroupData.media).some(\n      (mediaItemGroups) =>\n        mediaItemGroups.some(\n          (mediaItemGroup) =>\n            mediaItemGroup.group === true ||\n            this.normalizeMediaGroupValue(mediaItemGroup.group) ===\n              normalizedGroupName\n        )\n    );\n\n    if (!hasMatchingMedia) {\n      this.mediaLists.forEach((list) => {\n        list.forEach((mediaItem) => {\n          mediaItem.hidden = false;\n        });\n      });\n      return;\n    }\n\n    this.mediaLists.forEach((list) => {\n      // Set hidden\n      list.forEach((el) => {\n        const mediaItemGroups = mediaGroupData.media[el.dataset.mediaId] || [];\n        let showThis = false;\n\n        // Iterate over all group values for this media ID\n\n        for (const mediaItemGroup of mediaItemGroups) {\n          // Compare the extracted part with groupName\n          // Check if this relevant part is included in groupName\n          if (\n            mediaItemGroup.group === true ||\n            normalizedGroupName ===\n              this.normalizeMediaGroupValue(mediaItemGroup.group)\n          ) {\n            showThis = true;\n          }\n        }\n\n        el.hidden = !showThis;\n      });\n\n      // Move all-groups media to start/end\n      [...list].forEach((el) => {\n        const mediaItemGroups = mediaGroupData.media[el.dataset.mediaId] || [];\n        if (mediaItemGroups.some((group) => group.group === true)) {\n          const positionGroup = mediaItemGroups.find((group) => group.position);\n          if (positionGroup) {\n            if (positionGroup.position === \"start\") {\n              el.parentElement.prepend(el);\n            } else {\n              el.parentElement.append(el);\n            }\n          }\n        }\n      });\n\n      // Move hidden elements to the end (to allow nth-child CSS in layouts)\n      [...list]\n        .filter((el) => el.hidden)\n        .forEach((el) => el.parentElement.append(el));\n\n      // Refresh slider\n      if (list.length > 0) {\n        const slider = list[0].closest(\"carousel-slider\");\n        if (slider && slider.offsetParent) {\n          slider.refresh();\n        }\n      }\n    });\n  }\n\n  /**\n   * Sets the active media item.\n   * @param {number} mediaId - Media ID to set as active.\n   * @param {boolean} [scrollToItem=true] - Scroll to the active media item.\n   * @param {boolean} [firstLoad=false] - Is gallery initialising.\n   */\n  setActiveMedia(mediaId, scrollToItem = true, firstLoad = false) {\n    const strMediaId = mediaId.toString();\n    const mediaEl = this.mainImageContainer.querySelector(\n      `[data-media-id=\"${strMediaId}\"]`\n    );\n\n    if (scrollToItem) {\n      // slideshow (if visible)\n      if (\n        this.slideshow.hasAttribute(\"loaded\") &&\n        this.slideshow.offsetParent\n      ) {\n        this.slideshow.scrollToElement(mediaEl, \"instant\");\n      }\n\n      // collage (if visible and not first load)\n      if (this.collage && this.collage.offsetParent && !firstLoad) {\n        const collageMediaEl = this.collage.querySelector(\n          `[data-media-id=\"${strMediaId}\"]`\n        );\n        if (collageMediaEl) {\n          theme.scrollToRevealElement(collageMediaEl);\n\n          clearTimeout(this.collage.dataset.highlightTimeoutId);\n          // When media group changes, assume first media has attention\n          if (this.mediaGroupChanged) {\n            this.collage\n              .querySelectorAll(\".product-media-collage__item--highlight-off\")\n              .forEach((el) => {\n                el.classList.remove(\n                  \"product-media-collage__item--highlight-off\"\n                );\n              });\n          } else {\n            this.collage\n              .querySelectorAll(\".product-media-collage__item\")\n              .forEach((el) => {\n                if (el === collageMediaEl) {\n                  el.classList.remove(\n                    \"product-media-collage__item--highlight-off\"\n                  );\n                } else {\n                  el.classList.add(\n                    \"product-media-collage__item--highlight-off\"\n                  );\n                }\n              });\n            this.collage.dataset.highlightTimeoutId = setTimeout(() => {\n              this.collage\n                .querySelectorAll(\".product-media-collage__item--highlight-off\")\n                .forEach((el) => {\n                  el.classList.remove(\n                    \"product-media-collage__item--highlight-off\"\n                  );\n                });\n            }, 1200);\n          }\n        }\n      }\n    }\n\n    this.mediaLists.forEach((list) => {\n      list.forEach((mediaItem) => {\n        if (mediaItem.dataset.mediaId === strMediaId) {\n          mediaItem.classList.add(\"is-active\");\n          const carousel = mediaItem.closest(\"carousel-slider\");\n          if (carousel && carousel.offsetParent) {\n            carousel.scrollToElement(mediaItem);\n          }\n        } else {\n          mediaItem.classList.remove(\"is-active\");\n        }\n      });\n    });\n\n    // play media\n    window.pauseAllMedia();\n    if (mediaEl) {\n      // deferred\n      const deferredMedia = mediaEl.querySelector(\n        \"deferred-media, product-model\"\n      );\n      if (deferredMedia) deferredMedia.loadContent(true);\n\n      // video tag\n      const playableMedia = mediaEl.querySelector(\"video\");\n      if (playableMedia) {\n        playableMedia.play();\n      }\n    }\n\n    // set model ID\n    if (this.xrButton && this.mediaIsModel(mediaId)) {\n      this.xrButton.dataset.shopifyModel3dId = mediaId;\n    }\n\n    document.dispatchEvent(\n      new CustomEvent(\"on:media-gallery:change\", {\n        bubbles: true,\n        cancelable: false,\n      })\n    );\n  }\n\n  /**\n   * Check if media is a 3D model\n   * @param {number} mediaId - Media ID to check.\n   * @returns {boolean} - If it is a 3D model.\n   */\n  mediaIsModel(mediaId) {\n    return !!this.querySelector(\n      `.product-media--model[data-model-id=\"${mediaId}\"]`\n    );\n  }\n\n  selectThumbnail(evt, thumbnail) {\n    evt.preventDefault();\n    this.setActiveMedia(thumbnail.parentNode.dataset.mediaId, true);\n  }\n\n  selectMainMedia(evt) {\n    if (evt.detail.slide.dataset.mediaId) {\n      this.setActiveMedia(evt.detail.slide.dataset.mediaId, false);\n    }\n  }\n};\n\nwindow.customElements.define(\"media-gallery\", MediaGallery);\n\n/* eslint-disable max-len */\n/* eslint-disable no-multiple-empty-lines */\nconst ProductForm = class extends HTMLElement {\n  constructor() {\n    super();\n\n    this.form = this.querySelector(\".js-product-form\");\n    if (this.form) {\n      const idInput = this.form.querySelector('[name=\"id\"]');\n      idInput.disabled = false;\n      idInput.required = true;\n\n      if (theme.settings.afterAddToCart !== \"no-js\") {\n        this.submitBtn = this.querySelector('[name=\"add\"]');\n        this.form.addEventListener(\"submit\", this.handleSubmit.bind(this));\n      }\n    }\n  }\n\n  /**\n   * Handles submission of the product form.\n   * @param {object} evt - Event object.\n   */\n  async handleSubmit(evt) {\n    evt.preventDefault();\n    if (this.submitBtn.getAttribute(\"aria-disabled\") === \"true\") return;\n\n    this.setErrorMsgState();\n\n    const formValid = this.validate();\n    if (!formValid) return;\n\n    // Disable \"Add to Cart\" button until submission is complete.\n    this.submitBtn.setAttribute(\"aria-disabled\", \"true\");\n    this.submitBtn.classList.add(\"is-loading\");\n\n    const formData = new FormData(this.form);\n    const sectionsToUpdate = [\"page-header\", \"cart-drawer\"]\n      .map((sel) => document.querySelector(sel))\n      .filter((el) => el);\n    const sectionIds = sectionsToUpdate.map((el) => el.dataset.sectionId);\n\n    formData.append(\"sections_url\", window.location.pathname);\n    formData.append(\"sections\", sectionIds.join(\",\"));\n\n    const fetchRequestOpts = {\n      method: \"POST\",\n      headers: {\n        Accept: \"application/javascript\",\n        \"X-Requested-With\": \"XMLHttpRequest\",\n      },\n      body: formData,\n    };\n\n    try {\n      const response = await fetch(theme.routes.cartAdd, fetchRequestOpts);\n      const data = await response.json();\n      let error =\n        typeof data.description === \"string\" ? data.description : data.message;\n      if (data.errors && typeof data.errors === \"object\") {\n        error = Object.entries(data.errors).map((item) => item[1].join(\", \"));\n      }\n      if (data.status) this.setErrorMsgState(error);\n      if (!response.ok) throw new Error(response.status);\n\n      if (document.querySelector(\".template-cart\")) {\n        // Cart page\n        const cartForm = document.querySelector(\"cart-form\");\n        if (cartForm && cartForm.enableAjaxUpdate) {\n          cartForm.refresh();\n        }\n      } else if (theme.settings.afterAddToCart === \"page\") {\n        // Allow the tick animation to complete\n        setTimeout(() => {\n          window.location.href = theme.routes.cart;\n        }, 300);\n      } else {\n        sectionsToUpdate.forEach((el) => {\n          el.updateFromCartChange(data.sections[el.dataset.sectionId]);\n        });\n\n        if (theme.settings.afterAddToCart === \"notification\") {\n          const notification = document\n            .getElementById(\"AddedNotification\")\n            .content.firstElementChild.cloneNode(true);\n          notification.dataset.productTitle = data.product_title;\n          let notificationContainer = document.querySelector(\n            \".pageheader--sticky\"\n          );\n          if (!notificationContainer) {\n            notificationContainer = document.querySelector(\"body\");\n          }\n          notificationContainer.appendChild(notification);\n        } else if (theme.settings.afterAddToCart === \"drawer\") {\n          document.querySelector(\".js-cart-drawer\").open();\n        }\n      }\n\n      this.dispatchEvent(\n        new CustomEvent(\"on:cart:add\", {\n          bubbles: true,\n          detail: {\n            variantId: data.variant_id,\n          },\n        })\n      );\n\n      // Re-enable 'Add to Cart' button.\n      this.submitBtn.classList.add(\"is-success\");\n      this.submitBtn.removeAttribute(\"aria-disabled\");\n      setTimeout(() => {\n        this.submitBtn.classList.remove(\"is-loading\");\n        this.submitBtn.classList.remove(\"is-success\");\n      }, 2000);\n    } catch (error) {\n      console.log(error); // eslint-disable-line\n      this.dispatchEvent(\n        new CustomEvent(\"on:cart:error\", {\n          bubbles: true,\n          detail: {\n            error: this.errorMsg.textContent,\n          },\n        })\n      );\n\n      // Re-enable 'Add to Cart' button.\n      this.submitBtn.classList.remove(\"is-loading\");\n      this.submitBtn.classList.remove(\"is-success\");\n      this.submitBtn.removeAttribute(\"aria-disabled\");\n    }\n  }\n\n  /**\n   * Shows/hides an error message.\n   * @param {string} [error=false] - Error to show a message for.\n   */\n  setErrorMsgState(error = false) {\n    this.errorMsg = this.errorMsg || this.querySelector(\".js-form-error\");\n    if (!this.errorMsg) return;\n\n    this.errorMsg.hidden = !error;\n    if (error) {\n      this.errorMsg.innerHTML = \"\";\n      const errorArray = Array.isArray(error) ? error : [error];\n      errorArray.forEach((err, index) => {\n        if (index > 0) this.errorMsg.insertAdjacentHTML(\"beforeend\", \"<br>\");\n        this.errorMsg.insertAdjacentText(\"beforeend\", err);\n      });\n    }\n  }\n\n  /**\n   * Validate form & show errors.\n   * @returns {boolean} - Is form valid.\n   */\n  validate() {\n    let isValid = true;\n    this.querySelectorAll(\"variant-picker .option-selector\").forEach((el) => {\n      if (el.dataset.selectorType === \"listed\") {\n        const input = el.querySelector(\"input\");\n        const inputIsValid = input.reportValidity();\n        if (!inputIsValid) {\n          isValid = false;\n        }\n      } else {\n        // Clear prior errors\n        el.querySelectorAll(\".label__prefix\").forEach((label) =>\n          label.remove()\n        );\n        el.querySelectorAll(\".label--contains-error\").forEach((label) =>\n          label.classList.remove(\"label--contains-error\")\n        );\n\n        const selectedOption = el.querySelector(\n          '.custom-select .js-option[aria-selected=\"true\"]'\n        );\n        if (!selectedOption) {\n          const label = el.querySelector(\".label\");\n          label.setAttribute(\"aria-live\", \"polite\");\n          label.classList.add(\"label--contains-error\");\n          const labelPrefix = document.createElement(\"span\");\n          labelPrefix.innerText = `${theme.strings.productsProductChooseA} `;\n          labelPrefix.className = \"label__prefix\";\n          label.prepend(labelPrefix);\n          theme.scrollToRevealElement(el);\n          isValid = false;\n        }\n      }\n    });\n\n    return isValid;\n  }\n};\n\nwindow.customElements.define(\"product-form\", ProductForm);\n\nclass ProductInventory extends HTMLElement {\n  constructor() {\n    super();\n    window.initLazyScript(this, this.initLazySection.bind(this));\n  }\n\n  initLazySection() {\n    this.threshold = parseInt(this.dataset.threshold, 10);\n    this.productInventory = this.querySelector(\".product-inventory\");\n    this.inventoryNotice = this.querySelector(\".product-inventory__status\");\n    this.variantInventory = this.getVariantInventory();\n\n    this.closest(\".js-product\").addEventListener(\n      \"on:variant:change\",\n      this.handleVariantChange.bind(this)\n    );\n  }\n\n  /**\n   * Gets the inventory data for all product variants\n   * @returns {?object}\n   */\n  getVariantInventory() {\n    const dataEl = this.querySelector('[type=\"application/json\"]');\n    return this.variantInventory || JSON.parse(dataEl.textContent);\n  }\n\n  /**\n   * Handles a 'change' event on the variant picker element\n   * @param {object} evt - Event object\n   */\n  handleVariantChange(evt) {\n    this.updateInventory(\n      evt.detail.variant\n        ? this.variantInventory.find((v) => v.id === evt.detail.variant.id)\n        : null\n    );\n  }\n\n  /**\n   *\n   * Updates the inventory notice\n   * @param {?object} inventory - the inventory data\n   */\n  updateInventory(inventory) {\n    if (!inventory) {\n      this.productInventory.hidden = true;\n      return;\n    }\n\n    const count = inventory.inventory_quantity;\n    const showCount =\n      this.dataset.showInventoryCount === \"always\" ||\n      (this.dataset.showInventoryCount === \"low\" && count <= this.threshold);\n\n    let notice = null;\n    if (showCount) {\n      if (count <= this.threshold) {\n        notice = this.dataset.textXLeftLow.replace(\"[QTY]\", count);\n      } else {\n        notice = this.dataset.textXLeftOk.replace(\"[QTY]\", count);\n      }\n    } else {\n      // eslint-disable-next-line no-lonely-if\n      if (count <= this.threshold) {\n        notice = this.dataset.textLow;\n      } else {\n        notice = this.dataset.textOk;\n      }\n    }\n\n    this.productInventory.classList.toggle(\n      \"product-inventory--low\",\n      count <= this.threshold\n    );\n    this.productInventory.classList.toggle(\n      \"product-inventory--ok\",\n      count > this.threshold\n    );\n    this.inventoryNotice.innerText = notice;\n    this.productInventory.hidden = false;\n  }\n}\n\ncustomElements.define(\"product-inventory\", ProductInventory);\n\nif (!customElements.get(\"quantity-wrapper\")) {\n  class QuantityWrapper extends HTMLElement {\n    connectedCallback() {\n      this.addEventListener(\"click\", this.handleClick.bind(this));\n    }\n\n    handleClick(evt) {\n      const btn = evt.target.closest(\"[data-quantity]\");\n      if (btn) {\n        evt.preventDefault();\n        const input = this.querySelector('[name=\"quantity\"]');\n        let change = btn.dataset.quantity === \"up\" ? 1 : -1;\n        if (input.step) {\n          change *= parseInt(input.step, 10);\n        }\n        input.value = Math.max(1, parseInt(input.value, 10) + change);\n        input.dispatchEvent(\n          new CustomEvent(\"change\", { bubbles: true, cancelable: false })\n        );\n      }\n    }\n  }\n\n  customElements.define(\"quantity-wrapper\", QuantityWrapper);\n}\n\nif (theme.settings.quickbuyStyle !== \"off\") {\n  theme.quickbuy = {\n    quickbuyResizeObserver: null,\n    init: () => {\n      theme.quickbuy.quickbuyResizeObserver = new ResizeObserver((entries) => {\n        for (let i = 0; i < entries.length; i += 1) {\n          const entry = entries[i];\n          if (entry.contentBoxSize || entry.contentRect) {\n            theme.quickbuy.debouncedQuickbuyResize(entry.target);\n          }\n        }\n      });\n\n      theme.addDelegateEventListener(\n        document,\n        \"click\",\n        \".quickbuy-toggle\",\n        (evt, delEl) => {\n          const productUrl = delEl.href;\n\n          // Only show dropdown if screen is large enough for it to be useful\n          if (window.innerWidth >= 768) {\n            evt.preventDefault();\n\n            // cancel current request if one exists\n            if (theme.quickbuy.currentRequestAbortController) {\n              theme.quickbuy.currentRequestAbortController.abort();\n            }\n            theme.quickbuy.currentRequestAbortController =\n              new AbortController();\n\n            const block = delEl.closest(\".product-block\");\n            const slider = delEl.closest(\".collection-slider\");\n            let detailCont = null;\n            let quickbuyCont = null;\n            let sliderRow = null;\n\n            // do different things if it's inside a slideshow\n            if (slider) {\n              sliderRow = slider.closest(\".collection-slider-row\");\n              // slider without detail\n              if (!sliderRow.querySelector(\".quickbuy-container\")) {\n                return;\n              }\n              quickbuyCont = sliderRow.querySelector(\".quickbuy-container\");\n            } else {\n              theme.quickbuy.setBlockHeights(block);\n              quickbuyCont = block.querySelector(\".quickbuy-container\");\n            }\n            detailCont = quickbuyCont.querySelector(\".inner\");\n\n            // toggle active class on block\n            block.classList.toggle(\"expanded\");\n            if (block.classList.contains(\"expanded\")) {\n              quickbuyCont.dispatchEvent(\n                new CustomEvent(\"on:quickbuy:before-open\", { bubbles: true })\n              );\n\n              // expanding\n              if (slider) {\n                // if another block is expanded, remove its expanded class\n                const otherExpanded = Array.from(\n                  slider.querySelectorAll(\".product-block.expanded\")\n                ).filter((el) => el !== block);\n                otherExpanded.forEach((el) => el.classList.remove(\"expanded\"));\n\n                // if expanding from empty, set initial detail container height to 0\n                if (otherExpanded.length === 0) {\n                  quickbuyCont.style.height = 0;\n                }\n              } else {\n                // close expanded siblings\n                [...block.parentElement.children].forEach((el) => {\n                  if (el !== block && el.classList.contains(\"expanded\")) {\n                    theme.quickbuy.contractDetail(el, true);\n                  }\n                });\n              }\n\n              // monitor for contents changing size\n              theme.quickbuy.quickbuyResizeObserver.disconnect();\n              theme.quickbuy.quickbuyResizeObserver.observe(detailCont);\n\n              // add spinner\n              detailCont.innerHTML = '<div class=\"loading-spinner\"></div>';\n\n              // load in content\n              fetch(productUrl, {\n                method: \"get\",\n                signal: theme.quickbuy.currentRequestAbortController.signal,\n              })\n                .then((response) => {\n                  if (!response.ok) {\n                    throw new Error(`HTTP error! Status: ${response.status}`);\n                  }\n                  return response.text();\n                })\n                .then((response) => {\n                  const tmpl = document.createElement(\"template\");\n                  tmpl.innerHTML = response;\n                  const newDetail = tmpl.content\n                    .querySelector(\".quickbuy-content\")\n                    .cloneNode(true);\n\n                  // convert to quickbuy content\n                  newDetail.querySelectorAll(\".more\").forEach((el) => {\n                    el.href = productUrl;\n                  });\n                  newDetail.querySelectorAll(\".product-title\").forEach((el) => {\n                    el.innerHTML = `<a href=\"\">${el.innerHTML}</a>`;\n                    el.firstElementChild.href = productUrl;\n                  });\n                  newDetail.querySelectorAll(\".show-gallery\").forEach((el) => {\n                    el.classList.remove(\"show-gallery\");\n                    el.href = productUrl;\n                  });\n                  newDetail\n                    .querySelectorAll(\".not-in-quickbuy\")\n                    .forEach((el) => {\n                      el.remove();\n                    });\n                  newDetail\n                    .querySelectorAll(\".only-in-quickbuy\")\n                    .forEach((el) => {\n                      el.classList.remove(\"only-in-quickbuy\");\n                    });\n                  newDetail\n                    .querySelectorAll(\".sticky-content-container\")\n                    .forEach((el) => {\n                      el.classList.remove(\"sticky-content-container\");\n                    });\n                  newDetail\n                    .querySelectorAll(\"pickup-availability\")\n                    .forEach((el) => {\n                      el.remove();\n                    });\n                  newDetail\n                    .querySelectorAll('variant-picker[data-update-url=\"true\"]')\n                    .forEach((el) => {\n                      el.dataset.updateUrl = false;\n                    });\n                  newDetail\n                    .querySelectorAll(\"noscript\")\n                    .forEach((el) => el.remove());\n\n                  // enforce thumbnails-under gallery layout\n                  newDetail\n                    .querySelectorAll(\n                      \".media-gallery .main-image carousel-slider\"\n                    )\n                    .forEach((el) => {\n                      el.classList.remove(\"mobile-only\");\n                    });\n                  newDetail\n                    .querySelectorAll(\".product-media-collage\")\n                    .forEach((el) => {\n                      el.remove();\n                    });\n                  newDetail\n                    .querySelectorAll(\".media-gallery .thumbnails\")\n                    .forEach((el) => {\n                      el.classList.remove(\"mobile-only\");\n                    });\n                  [\n                    \"media-gallery--layout-carousel-beside\",\n                    \"media-gallery--layout-columns-1\",\n                    \"media-gallery--layout-columns-2\",\n                    \"media-gallery--layout-collage-1\",\n                    \"media-gallery--layout-collage-2\",\n                  ].forEach((cl) => {\n                    newDetail.querySelectorAll(`.${cl}`).forEach((el) => {\n                      el.classList.remove(cl);\n                      el.classList.add(\"media-gallery--layout-carousel-under\");\n                    });\n                  });\n\n                  // add any external resources\n                  tmpl.content\n                    .querySelectorAll(\n                      '.section-main-product link[rel=\"stylesheet\"]'\n                    )\n                    .forEach((el) => {\n                      if (\n                        !document.querySelector(\n                          `link[rel=\"stylesheet\"][href=\"${el.getAttribute(\n                            \"href\"\n                          )}\"]`\n                        )\n                      ) {\n                        document.head.insertAdjacentHTML(\n                          \"beforeend\",\n                          el.outerHTML\n                        );\n                      }\n                    });\n                  tmpl.content\n                    .querySelectorAll(\".section-main-product script[src]\")\n                    .forEach((el) => {\n                      if (\n                        !document.querySelector(\n                          `script[src=\"${el.getAttribute(\"src\")}\"]`\n                        )\n                      ) {\n                        const scr = document.createElement(\"script\");\n                        scr.src = el.getAttribute(\"src\");\n                        scr.defer = \"defer\";\n                        document.head.appendChild(scr);\n                      }\n                    });\n\n                  detailCont.innerHTML = \"\";\n                  detailCont.appendChild(newDetail);\n\n                  quickbuyCont.dispatchEvent(\n                    new CustomEvent(\"on:quickbuy:after-open\", { bubbles: true })\n                  );\n                });\n\n              // enable close button\n              const closeButton = quickbuyCont.querySelector(\".close-detail\");\n              closeButton.removeAttribute(\"tabindex\");\n              closeButton.addEventListener(\n                \"click\",\n                theme.quickbuy.onCloseClick\n              );\n\n              // Scroll to an appropriate position\n              const scrollOffset = -120 - theme.stickyHeaderHeight();\n              if (slider) {\n                // Simple for a carousel\n                window.scrollTo({\n                  top: theme.getOffsetTopFromDoc(quickbuyCont) + scrollOffset,\n                  behavior: \"smooth\",\n                });\n              } else {\n                // Grid - calculate where to scroll if quickbuys above this block will collapse\n                theme.quickbuy.saveProductGridSpacingData();\n                window.scrollTo({\n                  top:\n                    parseFloat(\n                      block.dataset.qbScrollTo ||\n                        theme.getOffsetTopFromDoc(quickbuyCont)\n                    ) + scrollOffset,\n                  behavior: \"smooth\",\n                });\n              }\n            } else {\n              // Close quick buy\n              if (slider) {\n                // collapse detail container & empty\n                quickbuyCont.style.height = \"0px\";\n                setTimeout(() => {\n                  if (quickbuyCont.style.height === \"0px\") {\n                    detailCont.innerHTML = \"\";\n                  }\n                }, parseFloat(getComputedStyle(quickbuyCont).transitionDuration) * 1000);\n              } else {\n                theme.quickbuy.contractDetail(block);\n              }\n\n              // scroll to top of closing block, after reflow\n              setTimeout(() => {\n                window.scrollTo({\n                  top:\n                    theme.getOffsetTopFromDoc(block) -\n                    theme.stickyHeaderHeight() -\n                    20,\n                  behavior: \"smooth\",\n                });\n              }, 100);\n\n              // disable close button\n              const closeButton = quickbuyCont.querySelector(\".close-detail\");\n              closeButton.setAttribute(\"tabindex\", \"-1\");\n              closeButton.removeEventListener(\n                \"click\",\n                theme.quickbuy.onCloseClick\n              );\n            }\n          }\n        }\n      );\n    },\n\n    debouncedQuickbuyResizeTimeoutID: -1,\n    debouncedQuickbuyResize: (qbInner) => {\n      clearTimeout(theme.quickbuy.debouncedQuickbuyResizeTimeoutID);\n      theme.quickbuy.debouncedQuickbuyResizeTimeoutID = setTimeout(() => {\n        const qbc = qbInner.closest(\".quickbuy-container\");\n        const block = qbc.closest(\".product-block\");\n        if (block) {\n          // use padding in grid\n          // also check expanded class in case it's mid close transition\n          if (block.classList.contains(\"expanded\")) {\n            const targetHeight = qbInner.clientHeight;\n            block.style.paddingBottom = `${targetHeight + 20}px`;\n            qbc.style.height = `${targetHeight}px`;\n          }\n        }\n        if (qbInner.childElementCount > 0) {\n          // use height in carousel\n          // - if not empty (e.g. post-close tidy-up)\n          qbc.style.height = `${qbInner.clientHeight}px`;\n        }\n      }, 100);\n    },\n\n    contractDetail: (block, instant) => {\n      // Cancel everything\n      theme.quickbuy.quickbuyResizeObserver.disconnect();\n      clearTimeout(theme.quickbuy.debouncedQuickbuyResizeTimeoutID);\n\n      block.classList.remove(\"expanded\");\n      const quickbuyCont = block.querySelector(\".quickbuy-container\");\n      if (instant) {\n        quickbuyCont.style.transitionDuration = \"0ms\";\n        block.style.transitionDuration = \"0ms\";\n      }\n      quickbuyCont.style.height = 0;\n      block.style.paddingBottom = 0;\n      // empty .inner after transition\n      const msToClose =\n        parseFloat(getComputedStyle(quickbuyCont).transitionDuration) * 1000;\n      setTimeout(() => {\n        if (quickbuyCont.style.height === \"0px\") {\n          quickbuyCont.querySelector(\".inner\").innerHTML = \"\";\n        }\n        if (instant) {\n          quickbuyCont.style.transitionDuration = \"\";\n          block.style.transitionDuration = \"\";\n        }\n      }, msToClose);\n\n      quickbuyCont.dispatchEvent(\n        new CustomEvent(\"on:quickbuy:after-close\", { bubbles: true })\n      );\n    },\n\n    saveProductGridSpacingData: () => {\n      document.querySelectorAll(\".product-grid\").forEach((el) => {\n        const blocks = el.querySelectorAll(\".product-block .block-inner\");\n        if (blocks.length <= 1) return; // Skip for empty colls\n        let row = 0;\n        let currTop = 0;\n        let runningHeight = 0;\n        const gutter = parseFloat(getComputedStyle(el).rowGap);\n        const listingOffset = theme.getOffsetTopFromDoc(blocks[0]);\n        const rowOffsets = [listingOffset];\n        blocks.forEach((block, index) => {\n          if (block.clientHeight > runningHeight) {\n            runningHeight = block.clientHeight;\n          }\n\n          const currOffsetTop = theme.getOffsetTopFromDoc(block);\n          if (index === 0) {\n            currTop = currOffsetTop;\n          } else if (currOffsetTop > currTop) {\n            row += 1;\n            currTop = currOffsetTop;\n            rowOffsets.push(gutter + runningHeight + rowOffsets[row - 1]);\n            runningHeight = 0;\n          }\n\n          block.dataset.gridRow = row;\n        });\n\n        blocks.forEach((block) => {\n          block.dataset.qbScrollTo =\n            rowOffsets[block.dataset.gridRow] + block.clientHeight;\n        });\n      });\n    },\n\n    setBlockHeights: (block) => {\n      // Align product block heights in this row\n      const list = block.closest(\".product-grid\");\n      if (!list) return;\n\n      let tallest = 0;\n      const blockTop = block.offsetTop;\n      const blocksInThisRow = [\n        ...list.querySelectorAll(\".product-block\"),\n      ].filter((el) => el.offsetTop === blockTop);\n      blocksInThisRow.forEach((el) => {\n        const elInnerHeight = el.querySelector(\n          \".block-inner .block-inner-inner\"\n        ).clientHeight;\n        if (elInnerHeight > tallest) tallest = elInnerHeight;\n      });\n      blocksInThisRow.forEach((el) => {\n        el.querySelector(\".block-inner\").style.setProperty(\n          \"--qb-block-height\",\n          `${tallest}px`\n        );\n      });\n    },\n\n    onCloseClick: (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      const slider = evt.target.closest(\".collection-slider-row\");\n      if (slider) {\n        slider\n          .querySelector(\".product-block.expanded .quickbuy-toggle\")\n          .dispatchEvent(\n            new CustomEvent(\"click\", { bubbles: true, cancelable: true })\n          );\n      } else {\n        evt.target\n          .closest(\".product-block\")\n          .querySelector(\".quickbuy-toggle\")\n          .dispatchEvent(\n            new CustomEvent(\"click\", { bubbles: true, cancelable: true })\n          );\n      }\n    },\n  };\n\n  theme.quickbuy.init();\n}\n\nclass CarouselSlider extends HTMLElement {\n  constructor() {\n    super();\n    this.slides = [...this.querySelectorAll(\".slider__item:not([hidden])\")];\n    if (this.slides.length < 2) {\n      this.setCarouselState(false);\n      return;\n    }\n\n    window.initLazyScript(this, this.init.bind(this));\n  }\n\n  init() {\n    this.slider = this.querySelector(\".slider\");\n    this.grid = this.querySelector(\".slider__grid\");\n    this.nav = this.querySelector(\".slider-nav\");\n    this.rtl = document.dir === \"rtl\";\n\n    if (this.nav) {\n      this.prevBtn = this.querySelector('button[name=\"prev\"]');\n      this.nextBtn = this.querySelector('button[name=\"next\"]');\n    }\n\n    this.initSlider();\n    window.addEventListener(\n      \"on:debounced-resize\",\n      this.handleResize.bind(this)\n    );\n\n    this.setAttribute(\"loaded\", \"\");\n  }\n\n  initSlider() {\n    this.gridWidth = this.grid.clientWidth;\n\n    // Distance between leading edges of adjacent slides (i.e. width of card + gap).\n    this.slideSpan =\n      this.getWindowOffset(this.slides[1]) -\n      this.getWindowOffset(this.slides[0]);\n\n    // Note: Slide can re-initialise after previous use\n    this.currentIndex =\n      Math.round(this.slider.scrollLeft / this.slideSpan) || 0;\n\n    // Width of gap between slides.\n    this.slideGap = this.slideSpan - this.slides[0].clientWidth;\n\n    this.slidesPerPage = Math.round(\n      (this.gridWidth + this.slideGap) / this.slideSpan\n    );\n    this.slidesToScroll =\n      theme.settings.sliderItemsPerNav === \"page\" ? this.slidesPerPage : 1;\n    this.totalPages = this.slides.length - this.slidesPerPage + 1;\n\n    this.setCarouselState(this.totalPages > 1);\n    if (this.dataset.dynamicHeight === \"true\") {\n      this.updateDynamicHeight();\n    }\n    this.addListeners();\n    if (this.totalPages < 2 || !this.nav) return;\n\n    this.sliderStart = this.getWindowOffset(this.slider);\n    if (!this.sliderStart)\n      this.sliderStart = (this.slider.clientWidth - this.gridWidth) / 2;\n    this.sliderEnd = this.sliderStart + this.gridWidth;\n\n    if (window.matchMedia(\"(pointer: fine)\").matches) {\n      this.slider.classList.add(\"is-grabbable\");\n    }\n\n    this.setButtonStates();\n  }\n\n  /**\n   * Re-initialise state. Call if slides have changed.\n   */\n  refresh() {\n    if (this.hasAttribute(\"loaded\")) {\n      this.removeListeners();\n      this.style.removeProperty(\"--current-slide-height\");\n    }\n    this.slides = [...this.querySelectorAll(\".slider__item:not([hidden])\")];\n    if (this.slides.length < 2) {\n      this.setCarouselState(false);\n      return;\n    }\n    this.init();\n  }\n\n  addListeners() {\n    this.scrollHandler = debounce(this.handleScroll.bind(this), 100);\n    this.slider.addEventListener(\"scroll\", this.scrollHandler);\n\n    if (this.nav) {\n      this.navClickHandler = this.handleNavClick.bind(this);\n      this.nav.addEventListener(\"click\", this.navClickHandler);\n    }\n\n    if (window.matchMedia(\"(pointer: fine)\").matches) {\n      this.mousedownHandler = this.handleMousedown.bind(this);\n      this.mouseupHandler = this.handleMouseup.bind(this);\n      this.mousemoveHandler = this.handleMousemove.bind(this);\n\n      this.slider.addEventListener(\"mousedown\", this.mousedownHandler);\n      this.slider.addEventListener(\"mouseup\", this.mouseupHandler);\n      this.slider.addEventListener(\"mouseleave\", this.mouseupHandler);\n      this.slider.addEventListener(\"mousemove\", this.mousemoveHandler);\n    }\n  }\n\n  removeListeners() {\n    this.slider.removeEventListener(\"scroll\", this.scrollHandler);\n\n    if (this.nav) {\n      this.nav.removeEventListener(\"click\", this.navClickHandler);\n    }\n\n    if (window.matchMedia(\"(pointer: fine)\").matches) {\n      this.slider.removeEventListener(\"mousedown\", this.mousedownHandler);\n      this.slider.removeEventListener(\"mouseup\", this.mouseupHandler);\n      this.slider.removeEventListener(\"mouseleave\", this.mouseupHandler);\n      this.slider.removeEventListener(\"mousemove\", this.mousemoveHandler);\n    }\n  }\n\n  /**\n   * Handles 'scroll' events on the slider element.\n   */\n  handleScroll() {\n    const previousIndex = this.currentIndex;\n    this.currentIndex = Math.round(\n      Math.abs(this.slider.scrollLeft) / this.slideSpan\n    );\n\n    if (this.nav) {\n      this.setButtonStates();\n    }\n\n    if (this.dataset.dynamicHeight === \"true\") {\n      this.updateDynamicHeight();\n    }\n\n    if (\n      this.dataset.dispatchEvents === \"true\" &&\n      previousIndex !== this.currentIndex\n    ) {\n      this.dispatchEvent(\n        new CustomEvent(\"on:carousel-slider:select\", {\n          bubbles: true,\n          detail: {\n            index: this.currentIndex,\n            slide: this.slides[this.currentIndex],\n          },\n        })\n      );\n    }\n  }\n\n  /**\n   * Handles 'mousedown' events on the slider element.\n   * @param {object} evt - Event object.\n   */\n  handleMousedown(evt) {\n    this.mousedown = true;\n    this.startX = evt.pageX - this.sliderStart;\n    this.scrollPos = this.slider.scrollLeft;\n    this.slider.classList.add(\"is-grabbing\");\n  }\n\n  /**\n   * Handles 'mouseup' events on the slider element.\n   */\n  handleMouseup() {\n    this.mousedown = false;\n    this.slider.classList.remove(\"is-grabbing\");\n  }\n\n  /**\n   * Handles 'mousemove' events on the slider element.\n   * @param {object} evt - Event object.\n   */\n  handleMousemove(evt) {\n    if (!this.mousedown) return;\n    evt.preventDefault();\n\n    const x = evt.pageX - this.sliderStart;\n    this.slider.scrollLeft = this.scrollPos - (x - this.startX) * 2;\n  }\n\n  /**\n   * Handles 'click' events on the nav buttons container.\n   * @param {object} evt - Event object.\n   */\n  handleNavClick(evt) {\n    if (!evt.target.matches(\".slider-nav__btn\")) return;\n\n    if (\n      (evt.target.name === \"next\" && !this.rtl) ||\n      (evt.target.name === \"prev\" && this.rtl)\n    ) {\n      this.scrollPos =\n        this.slider.scrollLeft + this.slidesToScroll * this.slideSpan;\n    } else {\n      this.scrollPos =\n        this.slider.scrollLeft - this.slidesToScroll * this.slideSpan;\n    }\n\n    this.slider.scrollTo({ left: this.scrollPos, behavior: \"smooth\" });\n  }\n\n  /**\n   * Handles 'on:debounced-resize' events on the window.\n   */\n  handleResize() {\n    if (this.nav) this.removeListeners();\n    this.initSlider();\n  }\n\n  /**\n   * Show a specific item inside this slider.\n   * @param {Element} el - Slide element\n   * @param {string} transition - Transition to pass to behavior parameter of scrollTo (optional)\n   */\n  scrollToElement(el, transition) {\n    if (!this.getSlideVisibility(el)) {\n      // this.scrollPos = this.rtl ? (el.offsetLeft + this.slideSpan) : el.offsetLeft;\n      this.scrollPos = el.offsetLeft;\n      this.slider.scrollTo({\n        left: this.scrollPos,\n        behavior: transition || \"smooth\",\n      });\n    }\n  }\n\n  /**\n   * Sets a height property based on the current slide.\n   */\n  updateDynamicHeight() {\n    this.style.setProperty(\n      \"--current-slide-height\",\n      `${this.slides[this.currentIndex].firstElementChild.clientHeight}px`\n    );\n  }\n\n  /**\n   * Gets the offset of an element from the edge of the viewport (left for ltr, right for rtl).\n   * @param {number} el - Element.\n   * @returns {number}\n   */\n  getWindowOffset(el) {\n    return this.rtl\n      ? window.innerWidth - el.getBoundingClientRect().right\n      : el.getBoundingClientRect().left;\n  }\n\n  /**\n   * Gets the visible state of a slide.\n   * @param {Element} el - Slide element.\n   * @returns {boolean}\n   */\n  getSlideVisibility(el) {\n    const slideStart = this.getWindowOffset(el);\n    const slideEnd = Math.floor(slideStart + this.slides[0].clientWidth);\n    return slideStart >= this.sliderStart && slideEnd <= this.sliderEnd;\n  }\n\n  /**\n   * Sets the active state of the carousel.\n   * @param {boolean} active - Set carousel as active.\n   */\n  setCarouselState(active) {\n    if (active) {\n      this.removeAttribute(\"inactive\");\n\n      // If slider width changed when activated, reinitialise it.\n      if (this.gridWidth !== this.grid.clientWidth) {\n        this.handleBreakpointChange();\n      }\n    } else {\n      this.setAttribute(\"inactive\", \"\");\n    }\n  }\n\n  /**\n   * Sets the disabled state of the nav buttons.\n   */\n  setButtonStates() {\n    this.prevBtn.disabled =\n      this.getSlideVisibility(this.slides[0]) && this.slider.scrollLeft === 0;\n    this.nextBtn.disabled = this.getSlideVisibility(\n      this.slides[this.slides.length - 1]\n    );\n  }\n}\n\ncustomElements.define(\"carousel-slider\", CarouselSlider);\n\nconst TermsAgreement = class extends HTMLElement {\n  connectedCallback() {\n    this.delegatedEvent = theme.addDelegateEventListener(\n      document,\n      \"click\",\n      '#cartform [name=\"checkout\"], .additional-checkout-buttons input, a[href*=\"/checkout\"]',\n      this.handleFormSubmittingEvent.bind(this)\n    );\n  }\n\n  disconnectedCallback() {\n    document.removeEventListener(\"click\", this.delegatedEvent);\n  }\n\n  handleFormSubmittingEvent(evt) {\n    if (!this.querySelector(\"input:checked\")) {\n      evt.preventDefault();\n      theme.showQuickPopup(\n        theme.strings.cartTermsConfirmation,\n        this.querySelector('[type=\"checkbox\"]')\n      );\n    }\n  }\n};\n\nwindow.customElements.define(\"terms-agreement\", TermsAgreement);\n\nconst ToggleTarget = class extends HTMLElement {\n  constructor() {\n    super();\n    this.addEventListener(\"click\", this.toggleOpen.bind(this));\n    this.addEventListener(\"keyup\", this.handleKeyUp.bind(this));\n    if (this.dataset.toggleCloseLabel) {\n      this.dataset.toggleOpenLabel = this.innerHTML;\n    }\n  }\n\n  /**\n   * Handles 'keyup' events on the document.\n   * @param {object} evt - Event object.\n   */\n  handleKeyUp(evt) {\n    if (evt.key === \"Enter\") this.toggleOpen(evt);\n  }\n\n  /**\n   * Opens or closes the target element.\n   * @param {object} evt - Event object.\n   */\n  toggleOpen(evt) {\n    evt.preventDefault();\n\n    const target = document.querySelector(this.dataset.toggleTarget);\n    const transCont = target.querySelector(\".toggle-target-container\");\n    const doCollapse = !target.classList.contains(\"toggle-target--hidden\");\n    const transitionDuration =\n      parseFloat(getComputedStyle(target).transitionDuration) * 1000;\n\n    if (!target.classList.contains(\"toggle-target--in-transition\")) {\n      if (doCollapse) {\n        this.classList.add(\"toggle-target-toggler--is-hidden\");\n        target.classList.add(\n          \"toggle-target--in-transition\",\n          \"toggle-target--hiding\"\n        );\n        target.style.height = `${transCont.clientHeight}px`;\n        target.style.opacity = 1;\n\n        if (this.dataset.toggleCloseLabel) {\n          this.innerHTML = this.dataset.toggleOpenLabel;\n        }\n\n        setTimeout(() => {\n          target.style.height = 0;\n          target.style.opacity = 0;\n\n          setTimeout(() => {\n            target.classList.add(\"toggle-target--hidden\");\n            target.classList.remove(\n              \"toggle-target--in-transition\",\n              \"toggle-target--hiding\"\n            );\n            target.style.height = \"\";\n            target.style.opacity = \"\";\n          }, transitionDuration);\n        }, 10);\n      } else {\n        this.classList.remove(\"toggle-target-toggler--is-hidden\");\n        target.classList.add(\n          \"toggle-target--in-transition\",\n          \"toggle-target--revealing\"\n        );\n        target.style.height = 0;\n        target.style.opacity = 0;\n        target.style.display = \"block\";\n\n        if (this.dataset.toggleCloseLabel) {\n          this.innerHTML = this.dataset.toggleCloseLabel;\n        }\n\n        setTimeout(() => {\n          target.style.height = `${transCont.clientHeight}px`;\n          target.style.opacity = 1;\n\n          setTimeout(() => {\n            target.classList.remove(\n              \"toggle-target--hidden\",\n              \"toggle-target--in-transition\",\n              \"toggle-target--revealing\"\n            );\n            target.style.height = \"\";\n            target.style.opacity = \"\";\n            target.style.display = \"\";\n          }, transitionDuration);\n        }, 10);\n      }\n    }\n  }\n};\n\nwindow.customElements.define(\"toggle-target\", ToggleTarget);\n\nclass VariantContent extends HTMLElement {\n  constructor() {\n    super();\n    if (this.childElementCount > 0) {\n      this.closest(\".js-product\").addEventListener(\n        \"on:variant:change\",\n        this.handleVariantChange.bind(this)\n      );\n    }\n  }\n\n  /**\n   * Handles a 'change' event on the variant picker element\n   * @param {object} evt - Event object\n   */\n  handleVariantChange(evt) {\n    [...this.childNodes]\n      .filter((el) => el.tagName !== \"SCRIPT\")\n      .forEach((el) => el.remove());\n    this.querySelectorAll(\":not(script)\").forEach((el) => el.remove());\n    const contentToShow = this.querySelector(\n      `[data-variant=\"${evt.detail.variant ? evt.detail.variant.id : \"\"}\"]`\n    );\n    if (contentToShow) {\n      this.insertAdjacentHTML(\"beforeend\", contentToShow.innerHTML);\n    }\n  }\n}\n\ncustomElements.define(\"variant-content\", VariantContent);\n\nconst AnnouncementBar = class extends HTMLElement {\n  constructor() {\n    super();\n\n    this.announcements = this.querySelectorAll(\".announcement\");\n    if (this.announcements.length > 1) {\n      this.backgrounds = Array.from(this.querySelectorAll(\".announcement-bg\"));\n      this.changeDelay = 5000;\n      this.currentAnnouncement = 0;\n      this.querySelector(\".announcement-bar__middle\").addEventListener(\n        \"focusin\",\n        this.pauseAnnouncements.bind(this)\n      );\n      this.querySelector(\".announcement-bar__middle\").addEventListener(\n        \"focusout\",\n        this.playAnnouncements.bind(this)\n      );\n      this.querySelector(\".announcement-button--previous\").addEventListener(\n        \"click\",\n        this.previousAnnouncement.bind(this)\n      );\n      this.querySelector(\".announcement-button--next\").addEventListener(\n        \"click\",\n        this.nextAnnouncement.bind(this)\n      );\n      this.observer = new IntersectionObserver(this.handleIntersect.bind(this));\n      this.observer.observe(this);\n    }\n  }\n\n  handleIntersect(entries) {\n    entries.forEach((entry) => {\n      if (entry.target === this) {\n        if (entry.isIntersecting) {\n          this.playAnnouncements(this);\n        } else {\n          this.pauseAnnouncements(this);\n        }\n      }\n    });\n  }\n\n  playAnnouncements() {\n    if (this.announcements.length > 1) {\n      this.announcementInterval = setInterval(() => {\n        this.setCurrentAnnouncement(this.currentAnnouncement + 1);\n      }, this.changeDelay);\n    }\n  }\n\n  pauseAnnouncements() {\n    if (this.announcementInterval) {\n      clearInterval(this.announcementInterval);\n    }\n  }\n\n  setCurrentAnnouncement(newIndex) {\n    this.currentAnnouncement = newIndex % this.announcements.length;\n    this.announcements.forEach((announcement, index) => {\n      const background = this.backgrounds.find(\n        (bg) => bg.dataset.index === index.toString()\n      );\n      if (index !== this.currentAnnouncement) {\n        announcement.classList.add(\"announcement--inactive\");\n        if (background) {\n          background.classList.remove(\"is-active\");\n        }\n      } else {\n        announcement.classList.remove(\"announcement--inactive\");\n        if (background) {\n          background.classList.add(\"is-active\");\n        }\n      }\n    });\n\n    const headingColor =\n      this.announcements[this.currentAnnouncement].style.getPropertyValue(\n        \"--heading-color\"\n      );\n    const textColor =\n      this.announcements[this.currentAnnouncement].style.getPropertyValue(\n        \"--text-color\"\n      );\n    const linkColor =\n      this.announcements[this.currentAnnouncement].style.getPropertyValue(\n        \"--link-color\"\n      );\n    if (headingColor) {\n      this.style.setProperty(\"--heading-color\", headingColor);\n    }\n    if (textColor) {\n      this.style.setProperty(\"--text-color\", textColor);\n    }\n    if (linkColor) {\n      this.style.setProperty(\"--link-color\", linkColor);\n    }\n  }\n\n  previousAnnouncement() {\n    this.setCurrentAnnouncement(this.currentAnnouncement - 1);\n  }\n\n  nextAnnouncement() {\n    this.setCurrentAnnouncement(this.currentAnnouncement + 1);\n  }\n};\n\nwindow.customElements.define(\"announcement-bar\", AnnouncementBar);\n\n/*\n  If the following conditions are met:\n  1. This section directly follows the header\n  2. This section is set to be full page height\n\n  Then:\n  If the header is transparent, subtract the height of messages and announcement bar.\n  If the header if not transparent, subtract the height of the header.\n*/\n\nconst ImageWithTextOverlay = class extends HTMLElement {\n  constructor() {\n    super();\n\n    this.fullHeightContainer = this.classList.contains(\"height--full\")\n      ? this\n      : this.querySelector(\".height--full\");\n\n    if (this.fullHeightContainer) {\n      if (this.closest(\".shopify-section\").previousElementSibling) return;\n      const ph = document.querySelector(\".pageheader\");\n      if (!ph) {\n        this.fullHeightContainer.classList.add(\n          \"height--full-ignore-header-height\"\n        );\n        return;\n      }\n\n      const thisOffsetTop = theme.getOffsetTopFromDoc(this);\n      const phOffsetTop = theme.getOffsetTopFromDoc(ph);\n      if (phOffsetTop - 5 > thisOffsetTop) {\n        // Must be lower. For trans header, it'll roughly match\n        this.fullHeightContainer.classList.add(\n          \"height--full-ignore-header-height\"\n        );\n        return;\n      }\n\n      this.fullHeightContainer.classList.add(\n        \"height--full-minus-header-height\"\n      );\n      this.checkForHeaderHeightSubtraction();\n\n      const handleResize = debounce(\n        this.checkForHeaderHeightSubtraction.bind(this),\n        300\n      );\n      this.resizeObserver = new ResizeObserver((entries) => {\n        for (let i = 0; i < entries.length; i += 1) {\n          const entry = entries[i];\n          if (entry.contentBoxSize || entry.contentRect) {\n            handleResize();\n          }\n        }\n      });\n      this.resizeObserver.observe(this);\n    }\n  }\n\n  checkForHeaderHeightSubtraction() {\n    let height = window.innerHeight;\n    // transparent header & top section? slightly different calculation\n    if (\n      document.querySelector(\".pageheader--transparent-permitted\") &&\n      !this.closest(\".shopify-section\").previousElementSibling\n    ) {\n      document\n        .querySelectorAll(\".section-store-messages, .section-announcement-bar\")\n        .forEach((el) => {\n          height -= el.clientHeight;\n        });\n    } else {\n      height -= document.querySelector(\".section-header\").clientHeight;\n    }\n    this.fullHeightContainer.style.setProperty(\"--image-height\", `${height}px`);\n  }\n};\n\nwindow.customElements.define(\"image-with-text-overlay\", ImageWithTextOverlay);\n\nconst PageHeader = class extends HTMLElement {\n  constructor() {\n    super();\n\n    // Search (delegate event as contents may update with cart changes)\n    if (this.querySelector(\".main-search\")) {\n      theme.addDelegateEventListener(\n        this,\n        \"click\",\n        \".show-search-link\",\n        (evt) => {\n          evt.preventDefault();\n          document.body.classList.add(\"show-search\");\n          setTimeout(() => {\n            this.querySelector(\".main-search__input\").focus();\n          }, 500);\n        }\n      );\n    }\n\n    // Navigation\n    theme.inlineNavigationCheck();\n\n    // Reveal cart drawer\n    if (\n      theme.settings.cartType === \"drawer\" &&\n      document.querySelector(\".js-cart-drawer\") &&\n      this.querySelector(\".cart-link\")\n    ) {\n      theme.addDelegateEventListener(this, \"click\", \".cart-link\", (evt) => {\n        evt.preventDefault();\n        document.querySelector(\".js-cart-drawer\").open();\n      });\n    }\n\n    // init mobile nav again if it's open and this is a reload\n    if (\n      window.Shopify.designMode &&\n      document.body.classList.contains(\"reveal-mobile-nav\")\n    ) {\n      theme.openMobileNav();\n    }\n\n    // restore all disabled images\n    setTimeout(() => theme.manuallyLoadImages(this), 250);\n  }\n\n  connectedCallback() {\n    this.section = document.querySelector(\".section-header\");\n    this.transparentPageheader = document.querySelector(\n      \".pageheader--transparent-permitted\"\n    );\n\n    this.setTransparency();\n    this.setSticky();\n    this.setHeaderHeightProperty();\n\n    window.addEventListener(\"scroll\", this.afterScroll.bind(this));\n\n    this.refreshHeader = () => {\n      fetch(`${window.location.origin}?sections=header`)\n        .then((response) => response.json())\n        .then((data) => {\n          const template = document.createElement(\"template\");\n          template.innerHTML = data.header;\n          const selectorsForRefresh = [\n            \"#pageheader .logo-area__right__inner .cart-link .cart-link__icon .cart-link__count\",\n          ];\n          for (let i = 0; i < selectorsForRefresh.length; i += 1) {\n            const newEl = template.content.querySelector(\n              selectorsForRefresh[i]\n            );\n            const currentEl = this.querySelector(selectorsForRefresh[i]);\n            currentEl.innerHTML = newEl.innerHTML;\n          }\n        });\n    };\n    document.addEventListener(\"on:cart:change\", this.refreshHeader);\n\n    const debouncedAfterResize = debounce(this.afterResize.bind(this), 300);\n    this.resizeObserver = new ResizeObserver((entries) => {\n      for (let i = 0; i < entries.length; i += 1) {\n        const entry = entries[i];\n        if (entry.contentBoxSize || entry.contentRect) {\n          debouncedAfterResize();\n        }\n      }\n    });\n    this.resizeObserver.observe(this);\n  }\n\n  disconnectedCallback() {\n    this.resizeObserver.disconnect();\n    document.removeEventListener(\"on:cart:change\", this.refreshHeader);\n  }\n\n  afterScroll() {\n    this.setTransparency();\n  }\n\n  afterResize() {\n    if (theme.inlineNavigationCheck) {\n      theme.inlineNavigationCheck();\n    }\n    this.setSticky();\n    this.setHeaderHeightProperty();\n  }\n\n  setTransparency() {\n    if (this.transparentPageheader) {\n      const bar = document.querySelector(\".section-announcement-bar\");\n      const scrollThreshold = bar ? bar.offsetTop + bar.clientHeight : 0;\n      if (!this.isSticky || window.scrollY <= scrollThreshold) {\n        this.transparentPageheader.classList.add(\"pageheader--transparent\");\n      } else {\n        this.transparentPageheader.classList.remove(\"pageheader--transparent\");\n      }\n    }\n  }\n\n  setSticky() {\n    this.isSticky =\n      getComputedStyle(this.section).position === \"sticky\" ||\n      getComputedStyle(this.section).position === \"-webkit-sticky\";\n  }\n\n  setHeaderHeightProperty() {\n    let headerHeight = 0;\n    let stickyHeaderHeight = 0;\n\n    if (this.section) {\n      headerHeight = Math.ceil(this.section.clientHeight);\n\n      if (this.isSticky) {\n        stickyHeaderHeight = headerHeight;\n      }\n    }\n\n    document.documentElement.style.setProperty(\n      \"--theme-header-height\",\n      `${headerHeight}px`\n    );\n    document.documentElement.style.setProperty(\n      \"--theme-sticky-header-height\",\n      `${stickyHeaderHeight}px`\n    );\n  }\n\n  updateFromCartChange(html) {\n    const selectorForUpdate = \".logo-area__right\";\n    const template = document.createElement(\"template\");\n    template.innerHTML = html;\n\n    const elToUpdate = this.querySelector(selectorForUpdate);\n    if (elToUpdate) {\n      elToUpdate.innerHTML =\n        template.content.querySelector(selectorForUpdate).innerHTML;\n    }\n  }\n};\n\nwindow.customElements.define(\"page-header\", PageHeader);\n\nconst RelatedCollectionLinkButtons = class extends HTMLElement {\n  constructor() {\n    super();\n\n    const handleResize = debounce(this.truncateButtons.bind(this), 300);\n    this.resizeObserver = new ResizeObserver((entries) => {\n      for (let i = 0; i < entries.length; i += 1) {\n        const entry = entries[i];\n        if (entry.contentBoxSize || entry.contentRect) {\n          handleResize();\n        }\n      }\n    });\n    this.resizeObserver.observe(this);\n\n    this.truncateButtons();\n  }\n\n  truncateButtons() {\n    if (getComputedStyle(this).display === \"flex\") {\n      const limit = 4;\n      const btns = this.querySelectorAll(\".btn\");\n      if (\n        btns.length > limit &&\n        !this.querySelector(\".related-collection-links__expander\")\n      ) {\n        Array.from(btns)\n          .slice(limit - 1)\n          .forEach((el) => el.classList.add(\"hidden\"));\n        const expander = document.createElement(\"a\");\n        expander.className =\n          \"btn btn--tertiary related-collection-links__expander\";\n        expander.href = \"#\";\n        expander.innerText = this.dataset.expanderBtnText;\n        expander.addEventListener(\"click\", (evt) => {\n          evt.preventDefault();\n          this.resizeObserver.disconnect();\n          [...evt.currentTarget.parentElement.children].forEach((el) =>\n            el.classList.remove(\"hidden\")\n          );\n          evt.currentTarget.remove();\n        });\n        this.insertAdjacentElement(\"beforeend\", expander);\n      }\n    } else {\n      const expander = this.querySelector(\n        \".related-collection-links__expander\"\n      );\n      if (expander) {\n        [...expander.parentElement.children].forEach((el) =>\n          el.classList.remove(\"hidden\")\n        );\n        expander.remove();\n      }\n    }\n  }\n};\n\nwindow.customElements.define(\n  \"related-collection-link-buttons\",\n  RelatedCollectionLinkButtons\n);\n\nwindow.initLazyScript = initLazyScript;\n\nif (!theme.Shopify) theme.Shopify = {};\ntry {\n  theme.Shopify.features = JSON.parse(\n    document.documentElement.querySelector(\"#shopify-features\").textContent\n  );\n} catch (e) {\n  theme.Shopify.features = {};\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n  // Smooth scroll to an internal link\n  const internalLinksSmoothScroll = (evt) => {\n    const link =\n      evt.target.tagName === \"A\" ? evt.target : evt.target.closest(\"a\");\n    if (\n      link &&\n      link.getAttribute(\"href\") &&\n      link.getAttribute(\"href\").length > 1 &&\n      link.getAttribute(\"href\")[0] === \"#\"\n    ) {\n      const target = document.querySelector(link.getAttribute(\"href\"));\n      if (target && target.offsetParent) {\n        evt.preventDefault();\n        theme.scrollToRevealElement(target);\n      }\n    }\n  };\n\n  if (theme.settings.internalLinksSmoothScroll) {\n    document.addEventListener(\"click\", internalLinksSmoothScroll);\n  }\n\n  // Enable focus outlines after using the tab key, and remove scroll internal link scroll handler\n  const tabCheck = (evt) => {\n    if (evt.code === \"Tab\") {\n      document.body.classList.add(\"tab-used\");\n      document.removeEventListener(\"keydown\", tabCheck);\n      document.removeEventListener(\"click\", internalLinksSmoothScroll);\n    }\n  };\n  document.addEventListener(\"keydown\", tabCheck);\n\n  // Opening links in a new tab\n  if (theme.settings.externalLinksNewTab) {\n    document.addEventListener(\"click\", (evt) => {\n      const link =\n        evt.target.tagName === \"A\" ? evt.target : evt.target.closest(\"a\");\n      if (\n        link &&\n        link.href &&\n        link.tagName === \"A\" &&\n        window.location.hostname !== new URL(link.href).hostname\n      ) {\n        link.target = \"_blank\";\n      }\n    });\n  }\n\n  // Mobile nav\n  theme.addDelegateEventListener(\n    document,\n    \"click\",\n    \".mobile-nav-toggle\",\n    (evt) => {\n      evt.preventDefault();\n      if (document.body.classList.contains(\"enable-mobile-nav-transition\")) {\n        // hide nav\n        document.body.classList.remove(\n          \"reveal-mobile-nav\",\n          \"reveal-mobile-nav--revealed\"\n        );\n        setTimeout(() => {\n          document.body.classList.remove(\"enable-mobile-nav-transition\");\n        }, 750);\n      } else {\n        // show nav\n        theme.openMobileNav();\n      }\n    }\n  );\n\n  theme.openMobileNav = () => {\n    document.body.classList.add(\"enable-mobile-nav-transition\");\n    setTimeout(() => {\n      document.body.classList.add(\"reveal-mobile-nav\");\n\n      // after reveal, add class\n      const cs = getComputedStyle(\n        document.querySelector(\n          \".mobile-navigation-drawer .navigation__tier-1 > .navigation__item > .navigation__link\"\n        )\n      );\n      const delayS =\n        parseFloat(cs.transitionDelay.split(\",\")[0]) +\n        parseFloat(cs.transitionDuration.split(\",\")[0]);\n      setTimeout(() => {\n        document.body.classList.add(\"reveal-mobile-nav--revealed\");\n      }, delayS * 1000);\n\n      // restore all disabled images\n      theme.manuallyLoadImages(\n        document.querySelector(\".mobile-navigation-drawer\")\n      );\n    }, 10);\n  };\n\n  // Window shade\n  const shade = document.querySelector(\".page-shade\");\n  if (shade) {\n    shade.addEventListener(\"click\", (evt) => {\n      evt.preventDefault();\n      document.body.classList.remove(\"reveal-mobile-nav\", \"show-search\");\n      setTimeout(() => {\n        document.body.classList.remove(\"enable-mobile-nav-transition\");\n      }, 750);\n    });\n  }\n});\n\nwindow.onpageshow = () => {\n  fetch(`${theme.routes.cart}.js`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`HTTP error! Status: ${response.status}`);\n      }\n      return response.json();\n    })\n    .then(async (data) => {\n      const { items } = data;\n      const cartString = items\n        .map((item) => `${item.key}|${item.quantity}`)\n        .join(\",\");\n      const cartUint8 = new TextEncoder().encode(cartString);\n      const cartHashBuffer = await crypto.subtle.digest(\"SHA-256\", cartUint8);\n      const cartHashArray = Array.from(new Uint8Array(cartHashBuffer));\n      const cartHashHex = cartHashArray\n        .map((x) => x.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n      const cartHash = cartHashHex.toString();\n      const cartHashFromDom = document.querySelector(\".cart-link\").dataset.hash;\n      if (cartHash !== cartHashFromDom) {\n        document.dispatchEvent(\n          new CustomEvent(\"on:cart:change\", {\n            bubbles: true,\n            cancelable: false,\n          })\n        );\n      }\n    })\n    .catch((error) => {\n      // eslint-disable-next-line no-console\n      console.log(error.message);\n    });\n};\n"],
  "mappings": "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",
  "names": ["observer"]
}
