{
  "version": 3,
  "sources": ["/cdn/shop/t/64/assets/main.js?r=301237552"],
  "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((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    }, { rootMargin: `0px 0px ${threshold}px 0px` });\n\n    io.observe(element);\n  } else {\n    callback();\n  }\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('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  let firstEl = null;\n  let lastEl = null;\n  const isVisible = (el) => el.offsetParent && getComputedStyle(el).visibility !== 'hidden';\n\n  const setFirstLastEls = () => {\n    for (let i = 0; i < focusableEls.length; i += 1) {\n      if (isVisible(focusableEls[i])) {\n        firstEl = focusableEls[i];\n        break;\n      }\n    }\n    for (let i = focusableEls.length - 1; i >= 0; i -= 1) {\n      if (isVisible(focusableEls[i])) {\n        lastEl = focusableEls[i];\n        break;\n      }\n    }\n  };\n\n  removeTrapFocus();\n\n  trapFocusHandlers.focusin = (evt) => {\n    setFirstLastEls();\n\n    if (evt.target !== container && evt.target !== lastEl && evt.target !== firstEl) 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    setFirstLastEls();\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\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\ntheme.stickyHeaderHeight = () => {\n  const v = getComputedStyle(document.documentElement).getPropertyValue('--theme-sticky-header-height');\n  if (v) {\n    return parseInt(v, 10) || 0;\n  }\n  return 0;\n};\n\ntheme.getOffsetTopFromDoc = (el) => el.getBoundingClientRect().top + window.scrollY;\n\ntheme.getOffsetLeftFromDoc = (el) => el.getBoundingClientRect().left + window.scrollX;\n\ntheme.getScrollParent = (node) => {\n  if (!node) return null;\n\n  const isElement = node instanceof HTMLElement;\n  const style = isElement ? window.getComputedStyle(node) : null;\n  const overflowY = style ? style.overflowY : null;\n  const isScrollable = overflowY && overflowY !== 'visible' && overflowY !== 'hidden';\n\n  if (isScrollable && node.scrollHeight > node.clientHeight) {\n    return node;\n  }\n\n  const parent = theme.getScrollParent(node.parentNode);\n\n  // If no parent scroll container found, we are at the root\n  if (!parent || parent === document.documentElement || parent === document.body) {\n    return window;\n  }\n\n  return parent;\n};\n\ntheme.scrollToRevealElement = (el) => {\n  const scrollContainer = theme.getScrollParent(el);\n  const scrollTop = scrollContainer === window ? window.scrollY : scrollContainer.scrollTop;\n  const scrollVisibleHeight = scrollContainer === window\n    ? window.innerHeight : 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  const onScrollEnd = debounce(() => {\n    const top = scrollContainer === window ? window.scrollY : scrollContainer.scrollTop;\n    if (elTop >= top + theme.stickyHeaderHeight() && elTop <= top + scrollVisibleHeight - 50) {\n      el.focus({ preventScroll: true });\n      scrollContainer.removeEventListener('scroll', onScrollEnd);\n    }\n  }, 250);\n\n  scrollContainer.addEventListener('scroll', onScrollEnd, { passive: true });\n};\n\ntheme.getEmptyOptionSelectors = (formContainer) => {\n  const emptySections = [];\n\n  formContainer.querySelectorAll('[data-selector-type=\"dropdown\"].option-selector').forEach((el) => {\n    if (!el.querySelector('[aria-selected=\"true\"][data-value]:not([data-value=\"\"])')) {\n      emptySections.push(el);\n    }\n  });\n\n  formContainer.querySelectorAll('[data-selector-type=\"listed\"].option-selector').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', 'form', 'aria-describedby', 'aria-controls', 'data-target-id', 'data-modal'];\n  for (let i = 0; i < suffixCandidates.length; i += 1) {\n    container.querySelectorAll(`[${suffixCandidates[i]}]`).forEach((el) => el.setAttribute(suffixCandidates[i], el.getAttribute(suffixCandidates[i]) + prefix));\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) => { input.disabled = true; });\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 = parseFloat(cs.getPropertyValue('--fade-duration')) * 1000;\n  const slideDuration = 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 = parseFloat(cs.getPropertyValue('--fade-duration')) * 1000;\n  const slideDuration = 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('merge-add-wrapper', 'merge-add-wrapper--slide', 'merge-add-wrapper--fade');\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(`[data-merge=\"${newEl.dataset.merge}\"]`);\n      if (!newEl.dataset.mergeCache\n        || !targetEl.dataset.mergeCache\n        || newEl.dataset.mergeCache !== targetEl.dataset.mergeCache) {\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(`[data-merge-attributes=\"${newEl.dataset.mergeAttributes}\"]`);\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(`[data-merge-list=\"${newList.dataset.mergeList}\"]`);\n      let targetListItems = Array.from(targetList.querySelectorAll('[data-merge-list-item]'));\n      const newListItems = Array.from(newList.querySelectorAll('[data-merge-list-item]'));\n\n      // remove\n      targetListItems.forEach((targetListItem) => {\n        // eslint-disable-next-line max-len\n        const matchedItem = newListItems.find((item) => item.dataset.mergeListItem === targetListItem.dataset.mergeListItem);\n        if (!matchedItem) {\n          theme.hideAndRemove(targetListItem);\n        }\n      });\n\n      // rebuild target list excluding removed items\n      targetListItems = Array.from(targetList.querySelectorAll('[data-merge-list-item]:not(.merge-remove-item)'));\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((item) => item.dataset.mergeListItem === newListItem.dataset.mergeListItem);\n        if (matchedItem) {\n          // replace if changed\n          if (!newListItem.dataset.mergeCache\n            || !matchedItem.dataset.mergeCache\n            || newListItem.dataset.mergeCache !== matchedItem.dataset.mergeCache) {\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(newListItem, targetListItems[i], 'beforebegin', 500);\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 = 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) => observer.observe(c, { attributes: true, attributeFilter: ['loaded'] }));\n};\n\nwindow.addEventListener(\n  'resize',\n  debounce(() => {\n    window.dispatchEvent(new CustomEvent('on:debounced-resize'));\n  })\n);\n\ntheme.fetchCache = {\n  MAX_CACHE_SIZE: 20,\n  cache: new Map(),\n  pending: new Map(),\n\n  /**\n   * Fetches a URL and returns text, storing the result in a cache used for subsequent requests\n   * to the same URL. Use theme.fetchCache.fetch(url) in theme code to return a Promise.\n   * @param {Element} url - URL to fetch.\n   * @returns {string} Text from request.\n   */\n  async fetchAndCache(url) {\n    const response = await fetch(url);\n    const text = await response.text();\n\n    // Evict oldest if needed\n    if (this.cache.size >= this.MAX_CACHE_SIZE) {\n      const oldestKey = [...this.cache.entries()]\n        .sort((a, b) => a[1].timestamp - b[1].timestamp)[0][0];\n      this.cache.delete(oldestKey);\n    }\n\n    this.cache.set(url, { text, timestamp: Date.now() });\n    this.pending.delete(url);\n    return text;\n  },\n\n  /**\n   * Fetches a URL and returns text, using a local cache.\n   * @param {Element} url - URL to fetch.\n   * @returns {Promise} Promise that completes and returns the response as a string parameter.\n   */\n  fetch(url) {\n    if (this.cache.has(url)) {\n      return Promise.resolve(this.cache.get(url).text);\n    }\n\n    if (this.pending.has(url)) {\n      return this.pending.get(url);\n    }\n\n    const promise = this.fetchAndCache(url);\n    this.pending.set(url, promise);\n    return promise;\n  },\n\n  /**\n   * Preload a URL in the fetch cache.\n   * @param {Element} url - URL to preload.\n   */\n  preload(url) {\n    this.fetch(url).catch(() => {\n      this.cache.delete(url);\n      this.pending.delete(url);\n    });\n  },\n\n  /**\n   * Clear the cache.\n   */\n  clear() {\n    this.cache.clear();\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('--viewport-height', `${window.innerHeight}px`);\n}\n\n/**\n * Sets a 'header-height' custom property on the root element.\n */\nfunction setHeaderHeight() {\n  const header = document.querySelector('.js-header-height');\n  if (!header) return;\n  let height = header.offsetHeight;\n\n  // Add announcement bar height (if shown).\n  const announcement = document.querySelector('.cc-announcement');\n  const announcementHeight = announcement ? announcement.offsetHeight : 0;\n  height += announcementHeight;\n\n  document.documentElement.style.setProperty('--announcement-height', `${announcementHeight}px`);\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 * @param {Element} [excludeVideo] - Video element to not pause.\n */\nfunction pauseAllMedia(el = document, excludeVideo = null) {\n  el.querySelectorAll('.js-youtube, .js-vimeo, video').forEach((video) => {\n    if (video === excludeVideo) return;\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('{ \"event\": \"command\", \"func\": \"pauseVideo\", \"args\": \"\" }', '*');\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    try {\n      if (model.modelViewerUI) model.modelViewerUI.pause();\n    } catch {\n      // Do nothing\n    }\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((entries) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting) {\n          this.loadContent(false, false, 'observer');\n          observer.unobserve(this);\n        }\n      });\n    }, { rootMargin: '0px 0px 1000px 0px' });\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 = 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.transitionsEnabled = null;\n    this.groupContainer = this.dataset.groupContainer\n      ? this.closest(this.dataset.groupContainer) : null;\n\n    this.toggle.addEventListener('click', this.handleToggle.bind(this));\n    this.disclosure.addEventListener('transitionend', this.handleTransitionEnd.bind(this));\n  }\n\n  /**\n   * Handles 'click' events on the summary element.\n   * @param {object} evt - Event object.\n   */\n  handleToggle(evt) {\n    if (this.transitionsEnabled === null) this.checkTransitionsEnabled();\n    if (!this.transitionsEnabled) return;\n\n    evt.preventDefault();\n\n    if (!this.disclosure.open) {\n      this.open();\n    } else {\n      this.close();\n    }\n  }\n\n  /**\n   * Check if transitions are enabled on this disclosure, saving this in this.transitionsEnabled\n   */\n  checkTransitionsEnabled() {\n    // Style check may cause break in Chrome dev tools - do not perform on init\n    this.transitionsEnabled = window.getComputedStyle(this.panel).transitionDuration !== '0s';\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    if (this.groupContainer) {\n      this.groupContainer.style.minHeight = null;\n    }\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    // If we're in a group container, close any open disclosures in the group\n    if (this.groupContainer) {\n      this.groupContainer.style.minHeight = `${this.groupContainer.getBoundingClientRect().height}px`;\n      const openDisclosure = this.groupContainer.querySelector('details-disclosure:has(.disclosure[open])');\n      if (openDisclosure) openDisclosure.close();\n    }\n\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('[name=\"properties[Recipient email]\"]');\n      this.recipientEmailLabel = this.querySelector(`label[for=\"${this.recipientEmail.id}\"]`);\n      this.recipientName = this.querySelector('[name=\"properties[Recipient name]\"]');\n      this.recipientMessage = this.querySelector('[name=\"properties[Message]\"]');\n      this.recipientSendOn = this.querySelector('[name=\"properties[Send on]\"]');\n      this.recipientOffsetProperty = this.querySelector('[name=\"properties[__shopify_offset]\"]');\n\n      // When JS is enabled, the recipient email field is required.\n      // Input labels are changed to reflect this.\n      if (this.recipientEmailLabel && this.recipientEmailLabel.dataset.jsLabel) {\n        this.recipientEmailLabel.innerText = 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().getTimezoneOffset().toString();\n        this.recipientOffsetProperty.removeAttribute('disabled');\n      }\n\n      this.recipientCheckbox = this.querySelector('.gift-card-recipient__checkbox');\n      this.recipientCheckbox.addEventListener('change', () => this.synchronizeProperties());\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\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    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(':not(.scrollable-table) > 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    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(new CustomEvent(`on:${this.dataset.name}:before-open`, {\n      bubbles: true\n    }));\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')) 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(getComputedStyle(this).getPropertyValue('--longest-transition-in-ms'));\n    setTimeout(() => {\n      if (callback) callback();\n      this.dispatchEvent(new CustomEvent(`on:${this.dataset.name}:after-open`, {\n        bubbles: true\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(new CustomEvent(`on:${this.dataset.name}:before-close`, {\n      bubbles: true\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    // 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(getComputedStyle(this).getPropertyValue('--longest-transition-in-ms'));\n    setTimeout(() => {\n      if (callback) callback();\n      this.dispatchEvent(new CustomEvent(`on:${this.dataset.name}:after-close`, {\n        bubbles: true\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('.dynamic-payment-button-template');\n\n    if (this.dynamicPaymentButtonTemplate) {\n      this.form = this.closest('form');\n      const variantIdInput = this.form.querySelector('[name=\"id\"]');\n\n      if (variantIdInput.value) {\n        this.tryInitDynamicPaymentButton();\n      } else {\n        this.boundTryInitDynamicPaymentButtonOnChange = this.tryInitDynamicPaymentButton.bind(this);\n        this.form.addEventListener('change', this.boundTryInitDynamicPaymentButtonOnChange);\n      }\n    }\n  }\n\n  /**\n   * Initialise dynamic payment button, if variant exists\n   */\n  tryInitDynamicPaymentButton() {\n    const variantIdInput = this.form.querySelector('[name=\"id\"]');\n    if (variantIdInput.value) {\n      if (this.boundTryInitDynamicPaymentButtonOnChange) {\n        this.form.removeEventListener('change', this.boundTryInitDynamicPaymentButtonOnChange);\n      }\n\n      this.dynamicPaymentButtonTemplate.insertAdjacentHTML('afterend', this.dynamicPaymentButtonTemplate.innerHTML);\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(this, 'click', '.cart-item__remove', (evt) => {\n        evt.preventDefault();\n        this.adjustItemQuantity(evt.target.closest('.cart-item'), { to: 0 });\n      });\n\n      theme.addDelegateEventListener(this, 'click', '.quantity-down', (evt) => {\n        evt.preventDefault();\n        this.adjustItemQuantity(evt.target.closest('.cart-item'), { decrease: true });\n      });\n\n      theme.addDelegateEventListener(this, 'click', '.quantity-up', (evt) => {\n        evt.preventDefault();\n        this.adjustItemQuantity(evt.target.closest('.cart-item'), { increase: true });\n      });\n\n      theme.addDelegateEventListener(this, 'change', '.cart-item__quantity-input', (evt) => {\n        this.adjustItemQuantity(evt.target.closest('.cart-item'), { currentValue: true });\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.querySelectorAll('[data-cc-animate]').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) => el.classList.remove('merge-item-refreshing'));\n\n    this.dispatchEvent(\n      new CustomEvent('on:cart:after-merge', { bubbles: true, cancelable: false })\n    );\n\n    if (theme.settings.afterAddToCart === 'drawer' && this.closest('.drawer') && !this.closest('.drawer').hasAttribute('open')) {\n      document.dispatchEvent(\n        new CustomEvent('theme:open-cart-drawer', { bubbles: true, cancelable: false })\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 (quantityInput.max && parseInt(quantityInput.value, 10) > parseInt(quantityInput.max, 10)) {\n      newQuantity = quantityInput.max;\n      quantityInput.value = newQuantity;\n      theme.showQuickPopup(theme.strings.cartItemsQuantityError.replace('[QUANTITY]', quantityInput.max), quantityInput);\n    }\n\n    clearTimeout(this.adjustItemQuantityTimeout);\n    this.adjustItemQuantityTimeout = setTimeout(() => {\n      const updateParam = { updates: {} };\n      this.querySelectorAll('.cart-item__quantity-input:not([disabled])').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('merge-item-refreshing');\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', { bubbles: true, cancelable: false })\n          );\n        })\n        .catch((error) => {\n          // eslint-disable-next-line no-console\n          console.log(error.message);\n          this.dispatchEvent(new CustomEvent('on:cart:error', {\n            bubbles: true,\n            detail: {\n              error: error.message\n            }\n          }));\n          // Uncertainty... Reload page.\n          window.location.reload();\n        });\n    }, newQuantity === 0 ? 10 : 700);\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('carousel-slider').forEach((el) => el.refresh());\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(`[data-id=\"${this.dataset.id}\"]`);\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(this.checkStickyScroll.bind(this), 200);\n    }\n\n    if (this.filters) {\n      // auto-select availability\n      this.allowAutoApplyHideUnavailable = this.filters.dataset.autoApplyHideUnavailable === 'true';\n      if (this.allowAutoApplyHideUnavailable) {\n        theme.addDelegateEventListener(this, 'change', '.filter-group__checkbox, .cc-price-range__input', (evt, delEl) => {\n          if (this.allowAutoApplyHideUnavailable) {\n            if ((delEl.type === 'checkbox' && delEl.checked) || (delEl.type === 'text' && delEl.value)) {\n              const toEnable = this.filters.querySelector('[name=\"filter.v.availability\"][value=\"1\"]');\n              if (toEnable) {\n                toEnable.checked = true;\n                toEnable.dispatchEvent(\n                  new CustomEvent('change', { bubbles: true, cancelable: false })\n                );\n              }\n            }\n          }\n        });\n\n        theme.addDelegateEventListener(this, 'change', '.filter-group--availability .filter-toggle__input', (evt, delEl) => {\n          if (delEl.checked && delEl.value === '1') {\n            this.allowAutoApplyHideUnavailable = false;\n          }\n        });\n      }\n\n      // ajax filter\n      if (this.dataset.ajaxFiltering === 'true') {\n        // ajax load form submission\n        const debouncedAjaxLoadForm = debounce(this.ajaxLoadForm.bind(this), 700);\n        theme.addDelegateEventListener(this, 'change', '#CollectionFilterForm', debouncedAjaxLoadForm);\n        theme.addDelegateEventListener(this, 'submit', '#CollectionFilterForm', debouncedAjaxLoadForm);\n      } else {\n        theme.addDelegateEventListener(this, 'change', '#CollectionFilterForm', (_evt, delEl) => delEl.submit());\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(this.section, 'click', '.link-dropdown__link, .filter-group__applied-item, .filter-group__clear-link, .pagination a', (evt, delEl) => {\n        evt.preventDefault();\n        this.ajaxLoadUrl(delEl.href);\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(this.section, 'click', '.layout-switch', this.switchGridLayout.bind(this));\n    }\n\n    // show/hide filters\n    this.delegatedToggleFiltersCallback = theme.addDelegateEventListener(this.section, 'click', '[data-toggle-filters]', (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('filter-container--show-filters-desktop');\n      this.section.querySelectorAll('.toggle-btn[data-toggle-filters]').forEach((el) => {\n        el.classList.toggle('toggle-btn--revealed-desktop', isNowVisible);\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.querySelectorAll('#sort-dropdown-options .link-dropdown__link').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    (evt.target.nextElementSibling || evt.target.previousElementSibling).classList.remove('layout-switch--active');\n  }\n\n  checkStickyScroll() {\n    const utilityBarOffsetY = theme.getOffsetTopFromDoc(this.section.querySelector('.utility-bar'));\n    if (window.innerWidth < 768\n        && this.previousScrollTop > window.scrollY\n        && window.scrollY > utilityBarOffsetY) {\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') || 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=${this.dataset.filterSectionId}`;\n    }\n\n    // start fetching URL\n    const refreshContainerSelector = '[data-ajax-container]';\n    const ajaxContainers = this.section.querySelectorAll(refreshContainerSelector);\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('Existing request not needed');\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 (scrollContainer && getComputedStyle(scrollContainer).overflow === 'auto') {\n          const allFilterChildren = 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 (allFilterChildren[i].offsetTop > elAboveScrollTop.offsetTop) {\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: 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).filter((a) => a !== 'filter-group__item--disabled').forEach((cl) => {\n                  elAboveScrollTopData.selector += `.${cl}`;\n                });\n              } else {\n                elAboveScrollTopData.selector += `[${attrName}=\"${CSS.escape(elAboveScrollTop.getAttribute(attrName))}\"]`;\n              }\n            }\n          }\n        }\n\n        // replace contents\n        const template = document.createElement('template');\n        template.innerHTML = response;\n        const newAjaxContainers = template.content.querySelectorAll(refreshContainerSelector);\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 = el.offsetTop + elAboveScrollTopData.extraScrollOffset;\n            }\n          });\n        }\n\n        // update mobile count\n        if (this.utilBarClone) {\n          const from = document.querySelector('.utility-bar:not(.utility-bar--sticky-mobile-copy) .utility-bar__centre');\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 = theme.getOffsetTopFromDoc(this.section.querySelector('[data-ajax-scroll-to]')) - document.querySelector('.section-header').clientHeight;\n        window.scrollTo({\n          top: scrollToY,\n          behavior: 'smooth'\n        });\n      })\n      .catch((error) => {\n        console.warn(error); // eslint-disable-line no-console\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('.gallery-viewer__zoom-container');\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(this, 'click', '.gallery-viewer__thumb', this.onThumbClick.bind(this));\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) => evt.stopPropagation());\n      this.previousBtn.addEventListener('click', this.selectPreviousThumb.bind(this));\n      this.nextBtn.addEventListener('click', this.selectNextThumb.bind(this));\n      this.zoomContainer.addEventListener('click', this.onZoomContainerClick.bind(this));\n      new ResizeObserver(() => this.setInitialImagePosition()).observe(this);\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([...this.thumbContainer.children].find((el) => el.dataset.zoomUrl === currentFullUrl) || this.thumbContainer.firstElementChild);\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 = ((this.currentZoomImage.clientWidth - this.clientWidth) / 2) / midX;\n        finalOffsetX = Math.round(-offsetFromCentreX * offsetMultiplierX);\n      }\n      if (doPanY) {\n        const offsetMultiplierY = ((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 = (this.currentZoomImage.naturalWidth * this.currentTransform.zoom - this.clientWidth) / 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 = (this.currentZoomImage.naturalHeight * this.currentTransform.zoom - this.clientHeight) / 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(this.currentTransform.zoom, Math.min(maxZoomX, maxZoomY));\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  setInitialImagePosition() {\n    this.currentZoomImage.style.top = `${this.clientHeight / 2 - this.currentZoomImage.clientHeight / 2}px`;\n    this.currentZoomImage.style.left = `${this.clientWidth / 2 - this.currentZoomImage.clientWidth / 2}px`;\n    this.setCurrentTransform(0, 0, 0); // centre, zoomed out\n    this.classList.toggle('gallery-viewer--zoomable', this.currentZoomImage.naturalWidth > this.clientWidth || this.currentZoomImage.naturalHeight > this.clientHeight);\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('img', 'gallery-viewer__zoom-image');\n    this.currentZoomImage.alt = '';\n    this.currentZoomImage.style.visibility = 'hidden';\n    this.currentZoomImage.onload = () => {\n      this.zoomContainer.classList.remove('gallery-viewer__zoom-container--loading');\n      this.currentZoomImage.style.visibility = '';\n      this.setInitialImagePosition();\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('.gallery-viewer__thumb--active').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('.gallery-viewer__thumb--active').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) * this.touchPanModifier,\n          (touch1.clientY - this.touchTracking.lastTouchY) * 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((touch1.clientX - touch2.clientX) ** 2 + (touch1.clientY - touch2.clientY) ** 2);\n        if (!this.pinchTracking.isTracking) {\n          this.pinchTracking.lastPinchDistance = pinchDistance;\n          this.pinchTracking.isTracking = true;\n        } else {\n          const pinchDelta = pinchDistance - this.pinchTracking.lastPinchDistance;\n          this.alterCurrentTransformZoomBy(pinchDelta * this.pinchZoomMultiplier);\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.closest('.link-dropdown').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(getComputedStyle(optsBox.querySelector('.link-dropdown__link')).paddingInlineStart, 10);\n      } else {\n        newWidth = parseInt(getComputedStyle(this.button).paddingInlineEnd, 10) + Math.ceil(this.button.querySelector('.link-dropdown__button-text').getBoundingClientRect().width);\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('.navigation__tier-1 > .navigation__item--with-children').forEach((el) => {\n      el.addEventListener('mouseenter', this.onNavParentHoverIn.bind(this));\n    });\n    this.querySelectorAll('.navigation__tier-1 > .navigation__item--with-children').forEach((el) => {\n      el.addEventListener('mouseleave', this.onNavParentHoverOut.bind(this));\n    });\n\n    // touch\n    theme.addDelegateEventListener(this, 'touchstart', '.navigation__tier-1 > .navigation__item--with-children > .navigation__link', (evt, el) => { this.handleTouch(evt, el); }, { passive: true });\n    theme.addDelegateEventListener(this, 'touchend', '.navigation__tier-1 > .navigation__item--with-children > .navigation__link', (evt, el) => { this.handleTouch(evt, el); });\n    theme.addDelegateEventListener(this, 'click', '.navigation__tier-1 > .navigation__item--with-children > .navigation__link', this.onNavParentHoverIn.bind(this));\n\n    // keypress\n    theme.addDelegateEventListener(this, 'keydown', '.navigation__tier-1 > .navigation__item--with-children > .navigation__link', this.onNavKeydown.bind(this));\n\n    // click #-link - open child nav\n    this.querySelectorAll('.navigation__link[href=\"#\"][aria-haspopup=\"true\"]').forEach((el) => {\n      el.addEventListener('click', (evt) => {\n        evt.preventDefault();\n        evt.currentTarget.nextElementSibling.dispatchEvent(new Event('click', { bubbles: true }));\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('.navigation__item--with-small-menu > .navigation__child-tier').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 = this.onProxyNavEnterSmallMenu.bind(this);\n      this.proxyTier1Nav.querySelectorAll('.navigation__item--with-small-menu').forEach((el) => {\n        el.addEventListener('mouseenter', boundOnProxyNavEnterSmallMenu);\n        this.proxyTier1NavBoundEvents.push({ element: el, name: 'mouseenter', fn: boundOnProxyNavEnterSmallMenu });\n      });\n\n      this.proxyTier1NavBoundEvents.push({\n        element: this.proxyTier1Nav,\n        name: 'touchstart',\n        fn: theme.addDelegateEventListener(this.proxyTier1Nav, 'touchstart', '.navigation__item--with-small-menu', this.onProxyNavEnterSmallMenu.bind(this), { passive: true })\n      });\n\n      // transfer all events to main menu\n      const onProxyNavEnterLeaveLargeMenu = (evt) => {\n        const elIndex = [...evt.currentTarget.parentNode.children].indexOf(evt.currentTarget);\n        this.querySelectorAll('.navigation__tier-1 > .navigation__item')[elIndex].dispatchEvent(new Event(evt.type));\n      };\n      this.proxyTier1Nav.querySelectorAll('.navigation__tier-1 > .navigation__item--with-children').forEach((el) => {\n        el.addEventListener('mouseenter', onProxyNavEnterLeaveLargeMenu);\n        this.proxyTier1NavBoundEvents.push({ element: el, name: 'mouseenter', fn: onProxyNavEnterLeaveLargeMenu });\n        el.addEventListener('mouseleave', onProxyNavEnterLeaveLargeMenu);\n        this.proxyTier1NavBoundEvents.push({ element: el, name: 'mouseleave', fn: onProxyNavEnterLeaveLargeMenu });\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(this.proxyTier1Nav, eventName, '.navigation__tier-1 > .navigation__item--with-children > .navigation__link', (evt, el) => {\n            const elIndex = [...el.parentNode.parentNode.children].indexOf(el.parentNode);\n            const proxiedLink = this.querySelectorAll('.navigation__tier-1 > .navigation__item')[elIndex].firstElementChild;\n            this.handleTouch(evt, proxiedLink);\n          }, { passive: eventName === 'touchstart' })\n        });\n      }\n\n      this.proxyTier1NavBoundEvents.push({\n        element: this.proxyTier1Nav,\n        name: 'keydown',\n        fn: theme.addDelegateEventListener(this.proxyTier1Nav, 'keydown', '.navigation__tier-1 > .navigation__item--with-children > .navigation__link', (evt, el) => {\n          if (evt.key === 'Enter') {\n            const elIndex = [...el.parentNode.parentNode.children].indexOf(el.parentNode);\n            const proxiedLink = this.querySelectorAll('.navigation__tier-1 > .navigation__item')[elIndex].firstElementChild;\n            el.setAttribute('aria-expanded', !proxiedLink.parentElement.classList.contains('navigation__item--show-children'));\n            this.onNavKeydown(evt, proxiedLink);\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({ element: this.proxyTier1Nav, name: 'mouseenter', fn: boundHandleNavHover });\n      this.proxyTier1NavBoundEvents.push({ element: this.proxyTier1Nav, name: 'mouseleave', fn: boundHandleNavHover });\n    }\n\n    // create mobile nav\n    const tDiv = document.createElement('div');\n    tDiv.innerHTML = this.querySelector('.mobile-navigation-drawer-template').innerHTML;\n    this.mobileDrawer = tDiv.firstElementChild;\n\n    // add announcement bar items\n    const mobileDrawerFooter = this.mobileDrawer.querySelector('.mobile-navigation-drawer__footer');\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('.announcement-bar .header-localization');\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.querySelector('.section-header').insertAdjacentElement('afterend', this.mobileDrawer);\n\n    // event: open second tier\n    theme.addDelegateEventListener(this.mobileDrawer, 'click', '.navigation__tier-1 > .navigation__item > .navigation__children-toggle', (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 = delEl.previousElementSibling.innerText;\n\n      // position under header\n      delEl.nextElementSibling.style.top = `${Math.ceil(this.mobileDrawer.querySelector('.navigation__mobile-header').clientHeight + 1)}px`;\n\n      // scroll container\n      this.mobileDrawer.closest('.mobile-navigation-drawer').scrollTo({ top: 0, left: 0, behavior: 'instant' }); // 'smooth' not working in iOS 15\n    });\n\n    if (this.mobileDrawer.dataset.mobileExpandWithEntireLink === 'true') {\n      theme.addDelegateEventListener(this.mobileDrawer, 'click', '.navigation__item--with-children > .navigation__link', (evt, delEl) => {\n        evt.preventDefault();\n        delEl.nextElementSibling.dispatchEvent(new Event('click', { bubbles: true, cancelable: true }));\n      });\n    } else {\n      theme.addDelegateEventListener(this.mobileDrawer, 'click', '.navigation__item--with-children > .navigation__link[href=\"#\"]', (evt, delEl) => {\n        evt.preventDefault();\n        delEl.nextElementSibling.dispatchEvent(new Event('click', { bubbles: true, cancelable: true }));\n      });\n    }\n\n    // event: close second tier\n    theme.addDelegateEventListener(this.mobileDrawer, 'click', '.mobile-nav-back', (evt) => {\n      evt.preventDefault();\n      this.mobileDrawer.classList.remove('mobile-navigation-drawer--child-open');\n      this.mobileDrawer.querySelectorAll('.navigation__tier-1 > .navigation__item--open').forEach((el) => {\n        el.classList.remove('navigation__item--open');\n        // return focus\n        const link = el.querySelector('.navigation__link');\n        let delay = 500;\n        try {\n          delay = parseFloat(getComputedStyle(link).transitionDuration.split(', ')[0]) * 1000;\n        } catch (ex) {\n          // do nothing\n        }\n        setTimeout(() => link.focus(), delay);\n      });\n    });\n\n    // event: toggle third tier\n    theme.addDelegateEventListener(this.mobileDrawer, 'click', '.navigation__tier-2 > .navigation__item > .navigation__children-toggle', (evt, delEl) => {\n      evt.preventDefault();\n      const doOpen = !delEl.parentElement.classList.contains('navigation__item--open');\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  handleNavHover(evt) {\n    this.closest('.section-header').classList.toggle('section-header--nav-hover', evt.type === 'mouseenter');\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((child) => child !== dropdownContainer && child.classList.contains('navigation__item--show-children'));\n\n    // close all menus but last opened\n    openSiblings.filter((el) => el !== this.navLastOpenDropdown).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.closest('.section-header').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.closest('.section-header').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 (link.parentElement.classList.contains('navigation__item--show-children')) {\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((el) => el.dispatchEvent(new Event('mouseleave')));\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 (link.dataset.touchOpenTriggeredAt\n            && evt.timeStamp - parseInt(link.dataset.touchOpenTriggeredAt, 10) < 1000) {\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 (el.parentElement.classList.contains('navigation__item--show-children')) {\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('.navigation__tier-1 > .navigation__item')[elIndex].querySelector('.navigation__tier-2-container');\n    if (document.querySelector('html[dir=\"rtl\"]')) {\n      dropdown.style.right = `${dropdown.offsetParent.clientWidth - (theme.getOffsetLeftFromDoc(el) + el.clientWidth)}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      if (this.matches(':hover')) {\n        this.lazyLoadAll();\n      } else {\n        this.initCustomLazyLoading();\n      }\n    }\n  }\n\n  initCustomLazyLoading() {\n    // preload hover images after a delay\n    setTimeout(() => {\n      const hoverImg = this.querySelector('.product-block__image--show-on-hover'); // GR: cards without a hover image threw here (1,221 mobile sessions / 3 days)\n      if (hoverImg) hoverImg.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, { passive: true });\n  }\n\n  lazyLoadAll() {\n    this.querySelectorAll('.product-block__image--inactivated').forEach((el) => el.classList.remove('product-block__image--inactivated'));\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[((index % this.images.length) + this.images.length) % this.images.length];\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    if (!newActiveImage) return; // GR: guard \u2014 no image at that index (286 mobile sessions / 3 days)\n\n    // set new active image visibility\n    [...newActiveImage.parentElement.children].forEach((el) => {\n      el.classList.toggle('product-block__image--active', el === newActiveImage);\n      el.classList.toggle('product-block__image--show-on-hover', el === hoverImage);\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('click', (evt) => {\n      evt.preventDefault();\n      this.incrementActiveImage(1);\n    });\n\n    // previous button\n    this.querySelector('.image-page-button--previous').addEventListener('click', (evt) => {\n      evt.preventDefault();\n      this.incrementActiveImage(-1);\n    });\n\n    // swipe (when not in a carousel)\n    if (!this.closest('.carousel, .product-grid--scrollarea')) {\n      const touchContainer = this.querySelector('.image-cont--with-secondary-image');\n      touchContainer.addEventListener('touchstart', (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      }, { passive: true });\n\n      touchContainer.addEventListener('touchmove', (evt) => {\n        if (theme.productBlockTouchTracking) {\n          if (Math.abs(evt.touches[0].clientY - theme.productBlockTouchStartY) < 30) {\n            const deltaX = 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      }, { passive: true });\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('.product-block-options').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((el) => {\n      el.addEventListener('mouseenter', this.onSelectSwatch.bind(this));\n      el.addEventListener('click', this.onSelectSwatch.bind(this));\n    });\n  }\n};\n\nwindow.customElements.define('product-block', ProductBlock);\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('.main-image carousel-slider');\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 = this.variantPicker && this.hasAttribute('data-media-grouping-enabled') && 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    }\n\n    if (this.hasAttribute('data-zoom-enabled')) {\n      this.galleryModal = this.querySelector('.js-media-zoom-template').content.firstElementChild.cloneNode(true);\n      this.mediaLists.push(this.galleryModal.querySelectorAll('.gallery-viewer__thumb'));\n      theme.addDelegateEventListener(this, 'click', '.show-gallery', this.openGalleryViewer.bind(this));\n\n      if (this.hasAttribute('data-preload')) {\n        this.mainImageContainer.addEventListener('mouseover', MediaGallery.hoverMainImage.bind(this));\n        this.mainImageContainer.addEventListener('touchstart', MediaGallery.hoverMainImage.bind(this), { passive: true });\n      }\n    }\n\n    this.section.addEventListener('on:carousel-slider:select', this.selectMainMedia.bind(this));\n    theme.addDelegateEventListener(this, 'click', '.thumbnail', this.selectThumbnail.bind(this));\n    this.section.addEventListener('on:variant:change', this.onVariantChange.bind(this));\n\n    if (this.hasAttribute('data-preload')) {\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) => { el.loading = 'eager'; });\n        }\n      }, 3000);\n    }\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.getVariantData();\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 = this.variantPicker.getVariantData();\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    const visibleItem = this.querySelector('.thumbnails .slider__item:not([hidden])');\n    if (visibleItem) this.setActiveMedia(visibleItem.dataset.mediaId, false, true);\n  }\n\n  /**\n   * Hover main image.\n   * @param {Event} evt - hover event for image\n   */\n  static hoverMainImage(evt) {\n    MediaGallery.loadImage(evt.currentTarget.querySelector('.slider__item.is-active a.show-gallery'));\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-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 (!anchor || anchor.hasAttribute('data-loading') || anchor.hasAttribute('data-loaded')) return;\n\n    anchor.setAttribute('data-loading', '');\n\n    const image = new Image(5000);\n    image.addEventListener('load', () => {\n      anchor.removeAttribute('data-loading');\n      anchor.setAttribute('data-loaded', '');\n    }, {\n      once: true\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      const visibleItem = this.querySelector('.thumbnails .slider__item:not([hidden])');\n      if (visibleItem) this.setActiveMedia(visibleItem.dataset.mediaId, true);\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    if (evt) {\n      return evt.detail.selectedOptions[this.getMediaGroupData().groupOptionIndex];\n    }\n\n    return this.variantPicker.getSelectedOptions()[this.getMediaGroupData().groupOptionIndex];\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      if (dataEl) {\n        this.variantMediaData = JSON.parse(dataEl.textContent);\n      } else {\n        this.variantMediaData = false;\n      }\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    this.mediaGroupChanged = this.currentMediaGroup !== groupName;\n    this.currentMediaGroup = groupName;\n\n    if (!this.mediaGroupChanged) return;\n\n    if (!groupName) {\n      this.mediaLists.forEach((list) => {\n        list.forEach((mediaItem) => { mediaItem.hidden = false; });\n      });\n      return;\n    }\n\n    const mediaGroupData = this.getMediaGroupData();\n\n    this.mediaLists.forEach((list) => {\n      // Set hidden\n      list.forEach((el) => {\n        const mediaItemGroup = mediaGroupData.media[el.dataset.mediaId].group;\n        const showThis = mediaItemGroup === groupName || mediaItemGroup === true;\n        el.hidden = !showThis;\n      });\n\n      // Move all-groups media to start/end\n      [...list].forEach((el) => {\n        if (mediaGroupData.media[el.dataset.mediaId].group === true) {\n          if (mediaGroupData.media[el.dataset.mediaId].position === 'start') {\n            el.parentElement.prepend(el);\n          } else {\n            el.parentElement.append(el);\n          }\n        }\n      });\n\n      // Move hidden elements to the end (to allow nth-child CSS in layouts)\n      [...list].filter((el) => el.hidden).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(`[data-media-id=\"${strMediaId}\"]`);\n\n    if (scrollToItem) {\n      // slideshow (if visible)\n      if (this.slideshow.hasAttribute('loaded') && this.slideshow.offsetParent) {\n        this.slideshow.scrollToElement(mediaEl, 'instant');\n      }\n\n      // collage (if visible and not first load)\n      if (this.collage\n        && this.collage.offsetParent\n        && !firstLoad\n        && !this.hasAttribute('data-no-collage-variant-highlight')\n      ) {\n        const collageMediaEl = this.collage.querySelector(`[data-media-id=\"${strMediaId}\"]`);\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.querySelectorAll('.product-media-collage__item--highlight-off').forEach((el) => {\n              el.classList.remove('product-media-collage__item--highlight-off');\n            });\n          } else {\n            this.collage.querySelectorAll('.product-media-collage__item').forEach((el) => {\n              if (el === collageMediaEl) {\n                el.classList.remove('product-media-collage__item--highlight-off');\n              } else {\n                el.classList.add('product-media-collage__item--highlight-off');\n              }\n            });\n            this.collage.dataset.highlightTimeoutId = setTimeout(() => {\n              this.collage.querySelectorAll('.product-media-collage__item--highlight-off').forEach((el) => {\n                el.classList.remove('product-media-collage__item--highlight-off');\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('deferred-media');\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      // models require interaction\n    }\n\n    // set model ID\n    if (this.xrButton && this.mediaIsModel(mediaId)) {\n      this.xrButton.dataset.shopifyModel3dId = mediaId;\n    }\n\n    this.dispatchEvent(\n      new CustomEvent('on:media-gallery:change', { bubbles: true, cancelable: false })\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(`.product-media--model[data-model-id=\"${mediaId}\"]`);\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    if (theme.settings.afterAddToCart !== 'no-js') {\n      this.getSubmitForm()?.addEventListener('submit', this.handleSubmit.bind(this));\n    }\n  }\n\n  /**\n   * Get actual product form.\n   * @returns {Element} Product form element.\n   */\n  getSubmitForm() {\n    return this.querySelector('.js-product-form');\n  }\n\n  /**\n   * Handles submission of the product form.\n   * @param {object} evt - Event object.\n   */\n  async handleSubmit(evt) {\n    const form = this.getSubmitForm();\n    if (!form) return;\n\n    evt.preventDefault();\n    this.submitBtn = this.querySelector('[name=\"add\"]');\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(form);\n    const sectionsToUpdate = ['page-header', 'cart-drawer'].map((sel) => document.querySelector(sel)).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 = 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        if (data.sections && sectionsToUpdate.length === Object.keys(data.sections).length) {\n          sectionsToUpdate.forEach((el) => {\n            el.updateFromCartChange(data.sections[el.dataset.sectionId]);\n          });\n        } else {\n          // Unexpected null section return has been observed\n          this.dispatchEvent(new CustomEvent('on:cart:change', { bubbles: true }));\n        }\n\n        if (theme.settings.afterAddToCart === 'notification') {\n          const notification = document.getElementById('AddedNotification').content.firstElementChild.cloneNode(true);\n          notification.dataset.productTitle = data.product_title;\n          let notificationContainer = document.querySelector('.pageheader--sticky');\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(this.submitBtn);\n        }\n      }\n\n      this.dispatchEvent(new CustomEvent('on:cart:add', {\n        bubbles: true,\n        detail: {\n          variantId: data.variant_id\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(new CustomEvent('on:cart:error', {\n        bubbles: true,\n        detail: {\n          error: this.errorMsg.textContent\n        }\n      }));\n\n      // Cart may change despite error\n      this.dispatchEvent(new CustomEvent('on:cart:change', { bubbles: true }));\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 isAnyValid = true;\n    this.querySelectorAll('variant-picker .option-selector').forEach((el) => {\n      // Clear prior errors\n      let isValid = true;\n      el.querySelectorAll('.label__prefix').forEach((label) => label.remove());\n      el.querySelectorAll('.label--contains-error').forEach((label) => label.classList.remove('label--contains-error'));\n\n      // Check for errors\n      if (el.dataset.selectorType === 'listed') {\n        const input = el.querySelector('input');\n        const inputIsValid = input.checkValidity();\n        if (!inputIsValid) {\n          isValid = false;\n        }\n      } else {\n        const selectedOption = el.querySelector('.custom-select .js-option[aria-selected=\"true\"]');\n        if (!selectedOption) {\n          isValid = false;\n        }\n      }\n\n      // Show custom message and scroll to it\n      if (!isValid) {\n        isAnyValid = false;\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      }\n    });\n\n    return isAnyValid;\n  }\n};\n\nwindow.customElements.define('product-form', ProductForm);\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(document, 'click', '.quickbuy-toggle', (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('Existing request not needed');\n          }\n          theme.quickBuy.currentRequestAbortController = 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          quickbuyCont.dataset.productUrl = productUrl;\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(new CustomEvent('on:quickbuy:before-open', { bubbles: true }));\n\n            // expanding\n            if (slider) {\n              // if another block is expanded, remove its expanded class\n              const otherExpanded = Array.from(slider.querySelectorAll('.product-block.expanded')).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.querySelector('.quickbuy-content').cloneNode(true);\n\n                // include size guide sections\n                tmpl.content.querySelectorAll('.section-size-guide').forEach((el) => {\n                  // convert to modal, if not one already\n                  if (el.querySelector('.modal--for-size-guide')) {\n                    newDetail.insertAdjacentElement('beforeend', el.cloneNode(true));\n                  } else {\n                    const sizeGuide = el.querySelector('[data-modal-template]').content.querySelector('size-guide').cloneNode(true);\n                    sizeGuide.querySelector('.modal__content').appendChild(el.querySelector('.size-guide__content'));\n                    newDetail.insertAdjacentElement('beforeend', sizeGuide);\n                  }\n                });\n\n                theme.quickBuy.convertToQuickBuyContent(newDetail, productUrl);\n\n                // add any external resources\n                tmpl.content.querySelectorAll(':is(.section-main-product, .section-size-guide) link[rel=\"stylesheet\"]').forEach((el) => {\n                  if (!document.querySelector(`link[rel=\"stylesheet\"][href=\"${el.getAttribute('href')}\"]`)) {\n                    document.head.insertAdjacentHTML('beforeend', el.outerHTML);\n                  }\n                });\n                tmpl.content.querySelectorAll(':is(.section-main-product, .section-size-guide) script[src]').forEach((el) => {\n                  if (!document.querySelector(`script[src=\"${el.getAttribute('src')}\"]`)) {\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(new CustomEvent('on:quickbuy:after-open', { bubbles: true }));\n              })\n              .catch((error) => {\n                console.warn(error); // eslint-disable-line no-console\n              });\n\n            // enable close button\n            const closeButton = quickbuyCont.querySelector('.close-detail');\n            closeButton.removeAttribute('tabindex');\n            closeButton.removeAttribute('aria-hidden');\n            closeButton.addEventListener('click', theme.quickBuy.onCloseClick);\n\n            // Scroll to an appropriate position\n            const scrollOffset = -120 - theme.stickyHeaderHeight();\n            if (slider) {\n              // Simple for a carousel\n              window.scrollTo({ top: theme.getOffsetTopFromDoc(quickbuyCont) + scrollOffset, behavior: 'smooth' });\n            } else {\n              // Grid - calculate where to scroll if quickbuys above this block will collapse\n              theme.quickBuy.saveProductGridSpacingData();\n              window.scrollTo({ top: parseFloat((block.dataset.qbScrollTo || theme.getOffsetTopFromDoc(quickbuyCont))) + scrollOffset, behavior: 'smooth' });\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(\n                getComputedStyle(quickbuyCont).transitionDuration\n              ) * 1000);\n            } else {\n              theme.quickBuy.contractDetail(block);\n            }\n\n            // scroll to top of closing block, after reflow\n            setTimeout(() => {\n              window.scrollTo({ top: theme.getOffsetTopFromDoc(block) - theme.stickyHeaderHeight() - 20, behavior: 'smooth' });\n            }, 100);\n\n            // disable close button\n            const closeButton = quickbuyCont.querySelector('.close-detail');\n            closeButton.blur();\n            closeButton.setAttribute('tabindex', '-1');\n            closeButton.setAttribute('aria-hidden', true);\n            closeButton.removeEventListener('click', theme.quickBuy.onCloseClick);\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        } 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 = 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(new CustomEvent('on:quickbuy:after-close', { bubbles: true }));\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 = 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 = [...list.querySelectorAll('.product-block')].filter((el) => el.offsetTop === blockTop);\n      blocksInThisRow.forEach((el) => {\n        const elInnerHeight = el.querySelector('.block-inner .block-inner-inner').clientHeight;\n        if (elInnerHeight > tallest) tallest = elInnerHeight;\n      });\n      blocksInThisRow.forEach((el) => {\n        el.querySelector('.block-inner').style.setProperty('--qb-block-height', `${tallest}px`);\n      });\n    },\n\n    convertToQuickBuyContent: (container, productUrl) => {\n      container.querySelectorAll('.more').forEach((el) => { el.href = productUrl; });\n      container.querySelectorAll('.product-title').forEach((el) => {\n        el.innerHTML = `<a href=\"\">${el.innerHTML}</a>`;\n        el.firstElementChild.href = productUrl;\n      });\n      container.querySelectorAll('.show-gallery').forEach((el) => {\n        el.classList.remove('show-gallery');\n        el.href = productUrl;\n      });\n      container.querySelectorAll('.not-in-quickbuy').forEach((el) => { el.remove(); });\n      container.querySelectorAll('.only-in-quickbuy').forEach((el) => { el.classList.remove('only-in-quickbuy'); });\n      container.querySelectorAll('.sticky-column-desktop').forEach((el) => { el.classList.remove('sticky-column-desktop'); });\n      container.querySelectorAll('pickup-availability').forEach((el) => { el.remove(); });\n      container.querySelectorAll('variant-picker[data-update-url=\"true\"]').forEach((el) => { el.dataset.updateUrl = false; });\n      theme.suffixIds(container, 'QuickBuy');\n\n      // enforce thumbnails-under gallery layout\n      container.querySelectorAll('.media-gallery .main-image carousel-slider').forEach((el) => { el.classList.remove('mobile-only'); });\n      container.querySelectorAll('.product-media-collage').forEach((el) => { el.remove(); });\n      container.querySelectorAll('.media-gallery .thumbnails').forEach((el) => { el.classList.remove('mobile-only'); });\n      ['media-gallery--layout-carousel-beside', 'media-gallery--layout-columns-1', 'media-gallery--layout-columns-2', 'media-gallery--layout-collage-1', 'media-gallery--layout-collage-2'].forEach((cl) => {\n        container.querySelectorAll(`.${cl}`).forEach((el) => {\n          el.classList.remove(cl);\n          el.classList.add('media-gallery--layout-carousel-under');\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.querySelector('.product-block.expanded .quickbuy-toggle').dispatchEvent(new CustomEvent('click', { bubbles: true, cancelable: true }));\n      } else {\n        evt.target.closest('.product-block').querySelector('.quickbuy-toggle').dispatchEvent(new CustomEvent('click', { bubbles: true, cancelable: true }));\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    if (this.hasAttribute('loaded')) return;\n\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\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 = this.getWindowOffset(this.slides[1]) - this.getWindowOffset(this.slides[0]);\n\n    // Note: Slide can re-initialise after previous use\n    this.currentIndex = 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((this.gridWidth + this.slideGap) / this.slideSpan);\n    this.slidesToScroll = 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\n    this.sliderStart = this.getWindowOffset(this.slider);\n    if (!this.sliderStart) this.sliderStart = (this.slider.clientWidth - this.gridWidth) / 2;\n    this.sliderEnd = this.sliderStart + this.gridWidth;\n\n    if (this.totalPages < 2) return;\n\n    if (window.matchMedia('(pointer: fine)').matches) {\n      this.slider.classList.add('is-grabbable');\n    }\n\n    if (!this.nav) return;\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.removeAttribute('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      this.slider.addEventListener('dragstart', (evt) => { evt.preventDefault(); });\n    }\n\n    this.resizeHandler = this.handleResize.bind(this);\n    window.addEventListener('on:debounced-resize', this.resizeHandler);\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    window.removeEventListener('on:debounced-resize', this.resizeHandler);\n  }\n\n  /**\n   * Handles 'scroll' events on the slider element.\n   */\n  handleScroll() {\n    // Scroll may be triggered immediately after a resize\n    if (this.gridWidth !== this.grid.clientWidth) this.handleResize();\n\n    const previousIndex = this.currentIndex;\n    this.currentIndex = Math.round(Math.abs(this.slider.scrollLeft) / this.slideSpan);\n\n    if (this.nav) {\n      this.setButtonStates();\n    }\n\n    if (this.dataset.dynamicHeight === 'true') {\n      this.updateDynamicHeight();\n    }\n\n    if (this.dataset.dispatchEvents === 'true' && previousIndex !== this.currentIndex) {\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.mousemoved = false;\n    this.dragIntentional = false;\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   * @param {object} evt - Event object.\n   */\n  handleMouseup(evt) {\n    this.mousedown = false;\n    this.slider.classList.remove('is-grabbing');\n    if (this.mousemoved) {\n      evt.preventDefault();\n      this.slider.classList.remove('is-dragging');\n    }\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.scrollTo({ left: this.scrollPos - (x - this.startX), behavior: 'instant' });\n    if (Math.abs(x - this.startX) > 8) {\n      this.mousemoved = true;\n      this.slider.classList.add('is-dragging');\n    }\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 ((evt.target.name === 'next' && !this.rtl) || (evt.target.name === 'prev' && this.rtl)) {\n      this.scrollPos = this.slider.scrollLeft + (this.slidesToScroll * this.slideSpan);\n    } else {\n      this.scrollPos = 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    this.refresh();\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.hasAttribute('loaded')) this.refresh(); // Ensure loaded when called from outside\n    if (this.slides.indexOf(el) === -1 || this.slides.length < 2) return;\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({ left: this.scrollPos, behavior: transition || 'smooth' });\n    }\n  }\n\n  /**\n   * Sets a height property based on the current slide.\n   */\n  updateDynamicHeight() {\n    this.style.setProperty('--current-slide-height', `${this.slides[this.currentIndex].firstElementChild.clientHeight}px`);\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 = this.getSlideVisibility(this.slides[0]) && this.slider.scrollLeft === 0;\n    this.nextBtn.disabled = this.getSlideVisibility(this.slides[this.slides.length - 1]);\n  }\n}\n\ncustomElements.define('carousel-slider', CarouselSlider);\n\nconst TermsAgreement = class extends HTMLElement {\n  connectedCallback() {\n    this.delegatedEvent = theme.addDelegateEventListener(document, 'click', '#cartform [name=\"checkout\"], .additional-checkout-buttons input, a[href*=\"/checkout\"]', this.handleFormSubmittingEvent.bind(this));\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(theme.strings.cartTermsConfirmation, this.querySelector('[type=\"checkbox\"]'));\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    if (this.dataset.toggleTarget[0] === '#') {\n      const target = document.querySelector(this.dataset.toggleTarget);\n      if (target) {\n        this.setAttribute('aria-controls', target.id);\n        this.setAttribute('aria-expanded', !target.classList.contains('toggle-target--hidden'));\n      }\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 = 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        this.setAttribute('aria-expanded', false);\n        target.classList.add('toggle-target--in-transition', 'toggle-target--hiding');\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('toggle-target--in-transition', 'toggle-target--hiding');\n            target.style.height = '';\n            target.style.opacity = '';\n          }, transitionDuration);\n        }, 10);\n      } else {\n        this.classList.remove('toggle-target-toggler--is-hidden');\n        this.setAttribute('aria-expanded', true);\n        target.classList.add('toggle-target--in-transition', 'toggle-target--revealing');\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('toggle-target--hidden', 'toggle-target--in-transition', 'toggle-target--revealing');\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\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('focusin', this.pauseAnnouncements.bind(this));\n      this.querySelector('.announcement-bar__middle').addEventListener('focusout', this.playAnnouncements.bind(this));\n      this.querySelector('.announcement-button--previous').addEventListener('click', this.previousAnnouncement.bind(this));\n      this.querySelector('.announcement-button--next').addEventListener('click', this.nextAnnouncement.bind(this));\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 = Math.abs(newIndex % this.announcements.length);\n    this.announcements.forEach((announcement, index) => {\n      const background = this.backgrounds.find((bg) => bg.dataset.index === index.toString());\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 = this.announcements[this.currentAnnouncement].style.getPropertyValue('--heading-color');\n    const textColor = this.announcements[this.currentAnnouncement].style.getPropertyValue('--text-color');\n    const linkColor = this.announcements[this.currentAnnouncement].style.getPropertyValue('--link-color');\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') ? this : 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('height--full-ignore-header-height');\n        return;\n      }\n\n      const thisOffsetTop = theme.getOffsetTopFromDoc(this);\n      const phOffsetTop = theme.getOffsetTopFromDoc(ph);\n      if (phOffsetTop - 5 > thisOffsetTop) { // Must be lower. For trans header, it'll roughly match\n        this.fullHeightContainer.classList.add('height--full-ignore-header-height');\n        return;\n      }\n\n      this.fullHeightContainer.classList.add('height--full-minus-header-height');\n      this.checkForHeaderHeightSubtraction();\n\n      const handleResize = debounce(this.checkForHeaderHeightSubtraction.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  }\n\n  checkForHeaderHeightSubtraction() {\n    let height = window.innerHeight;\n    // transparent header & top section? slightly different calculation\n    if (document.querySelector('.pageheader--transparent-permitted') && !this.closest('.shopify-section').previousElementSibling) {\n      document.querySelectorAll('.section-store-messages, .section-announcement-bar').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    const mainSearch = this.querySelector('.main-search');\n    if (mainSearch) {\n      theme.addDelegateEventListener(this, 'click', '.show-search-link', (evt, currentTarget) => {\n        evt.preventDefault();\n        theme.manuallyLoadImages(mainSearch);\n        document.body.classList.add('show-search');\n        setTimeout(() => {\n          theme.trapOpener = currentTarget;\n          trapFocus(mainSearch, this.querySelector('.main-search__input'));\n        }, 500);\n      });\n    }\n\n    // Navigation\n    theme.inlineNavigationCheck();\n\n    // Reveal cart drawer\n    if (theme.settings.cartType === 'drawer' && document.querySelector('.js-cart-drawer') && this.querySelector('.cart-link')) {\n      theme.addDelegateEventListener(this, 'click', '.cart-link', (evt) => {\n        evt.preventDefault();\n        document.querySelector('.js-cart-drawer').open(evt.target);\n      });\n    }\n\n    // Init mobile nav again if it's open and this is a reload\n    if (window.Shopify.designMode && document.body.classList.contains('reveal-mobile-nav')) {\n      theme.openMobileNav();\n    }\n\n    // Preload images after any interaction\n    this.preloadOnFirstInteraction = () => {\n      theme.manuallyLoadImages(this);\n      this.removeEventListener('mouseenter', this.preloadOnFirstInteraction);\n      this.removeEventListener('touchstart', this.preloadOnFirstInteraction);\n      this.removeEventListener('keydown', this.preloadOnFirstInteraction);\n    };\n\n    this.addEventListener('mouseenter', this.preloadOnFirstInteraction);\n    this.addEventListener('touchstart', this.preloadOnFirstInteraction);\n    this.addEventListener('keydown', this.preloadOnFirstInteraction);\n\n    // Preload all images after a delay\n    setTimeout(() => this.preloadOnFirstInteraction(), 5000);\n  }\n\n  connectedCallback() {\n    this.section = document.querySelector('.section-header');\n    this.transparentPageheader = document.querySelector('.pageheader--transparent-permitted');\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 = ['#pageheader .logo-area__right__inner .cart-link .cart-link__icon .cart-link__count'];\n          for (let i = 0; i < selectorsForRefresh.length; i += 1) {\n            const newEl = template.content.querySelector(selectorsForRefresh[i]);\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 = getComputedStyle(this.section).position === 'sticky' || 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('--theme-header-height', `${headerHeight}px`);\n    document.documentElement.style.setProperty('--theme-sticky-header-height', `${stickyHeaderHeight}px`);\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 = 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 (btns.length > limit && !this.querySelector('.related-collection-links__expander')) {\n        Array.from(btns).slice(limit - 1).forEach((el) => el.classList.add('hidden'));\n        const expander = document.createElement('a');\n        expander.className = '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) => el.classList.remove('hidden'));\n          evt.currentTarget.remove();\n        });\n        this.insertAdjacentElement('beforeend', expander);\n      }\n    } else {\n      const expander = this.querySelector('.related-collection-links__expander');\n      if (expander) {\n        [...expander.parentElement.children].forEach((el) => el.classList.remove('hidden'));\n        expander.remove();\n      }\n    }\n  }\n};\n\nwindow.customElements.define('related-collection-link-buttons', RelatedCollectionLinkButtons);\n\nwindow.trapFocus = trapFocus;\nwindow.removeTrapFocus = removeTrapFocus;\n\nwindow.initLazyScript = initLazyScript;\n\nif (!theme.Shopify) theme.Shopify = {};\ntry {\n  theme.Shopify.features = JSON.parse(document.documentElement.querySelector('#shopify-features').textContent);\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 = evt.target.tagName === 'A' ? evt.target : evt.target.closest('a');\n    if (link && link.getAttribute('href') && link.getAttribute('href').length > 1 && link.getAttribute('href')[0] === '#') {\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 = evt.target.tagName === 'A' ? evt.target : evt.target.closest('a');\n      if (link && link.href && link.tagName === 'A' && window.location.hostname !== new URL(link.href).hostname) {\n        link.target = '_blank';\n      }\n    });\n  }\n\n  // Mobile nav\n  theme.addDelegateEventListener(document, 'click', '.mobile-nav-toggle', (evt, currentTarget) => {\n    evt.preventDefault();\n    if (document.body.classList.contains('enable-mobile-nav-transition')) {\n      // hide nav\n      document.body.classList.remove('reveal-mobile-nav', 'reveal-mobile-nav--revealed');\n      setTimeout(() => {\n        document.body.classList.remove('enable-mobile-nav-transition');\n        removeTrapFocus(theme.trapOpener);\n      }, 750);\n    } else {\n      // show nav\n      theme.openMobileNav();\n      theme.trapOpener = currentTarget;\n      trapFocus(document.querySelector('.mobile-navigation-drawer'), document.querySelector('.mobile-navigation-drawer .mobile-nav-toggle'));\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(document.querySelector('.mobile-navigation-drawer .navigation__tier-1 > .navigation__item > .navigation__link'));\n      const delayS = parseFloat(cs.transitionDelay.split(',')[0]) + 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(document.querySelector('.mobile-navigation-drawer'));\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        removeTrapFocus(theme.trapOpener);\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.map((item) => `${item.key}|${item.quantity}`).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.map((x) => x.toString(16).padStart(2, '0')).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', { bubbles: true, cancelable: false })\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"]
}
