{
  "version": 3,
  "sources": ["/cdn/shop/t/66/assets/custom-select.js?cb=16427"],
  "sourcesContent": ["if (!customElements.get('custom-select')) {\n  class CustomSelect extends HTMLElement {\n    constructor() {\n      super();\n      this.button = this.querySelector('.custom-select__btn');\n      this.listbox = this.querySelector('.custom-select__listbox');\n      this.selectedOption = this.querySelector('[aria-selected=\"true\"]');\n\n      // Set the selected option.\n      if (!this.selectedOption) {\n        this.selectedOption = this.listbox.firstElementChild;\n      }\n\n      this.setButtonWidth();\n      window.initLazyScript(this, this.init.bind(this));\n    }\n\n    init() {\n      this.options = this.querySelectorAll('.custom-select__option');\n      this.nativeSelect = document.getElementById(`${this.id}-native`);\n      this.swatches = !!Array.from(this.options).find((el) => 'swatch' in el.dataset);\n      this.focusedClass = 'is-focused';\n      this.searchString = '';\n      this.listboxOpen = false;\n      this.selectedOption = this.querySelector('[aria-selected=\"true\"]');\n\n      // Set the selected option.\n      if (!this.selectedOption) {\n        this.selectedOption = this.listbox.firstElementChild;\n      }\n\n      this.addEventListener('keydown', this.handleKeydown.bind(this));\n      this.button.addEventListener('mousedown', this.handleMousedown.bind(this));\n    }\n\n    /**\n     * Returns the next visible sibling element\n     * @param {Element} elem - The element to search\n     * @returns {Element}\n     */\n    static getNextVisibleSibling(elem) {\n      let sibling = elem.nextElementSibling;\n      while (sibling) {\n        if (sibling.offsetParent) return sibling;\n        sibling = sibling.nextElementSibling;\n      }\n      return null;\n    }\n\n    /**\n     * Returns the previous visible sibling element\n     * @param {Element} elem - The element to search\n     * @returns {Element}\n     */\n    static getPreviousVisibleSibling(elem) {\n      let sibling = elem.previousElementSibling;\n      while (sibling) {\n        if (sibling.offsetParent) return sibling;\n        sibling = sibling.previousElementSibling;\n      }\n      return null;\n    }\n\n    /**\n     * Adds event listeners when the options list is open.\n     */\n    addListboxOpenListeners() {\n      this.mouseoverHandler = this.handleMouseover.bind(this);\n      this.mouseleaveHandler = this.handleMouseleave.bind(this);\n      this.clickHandler = this.handleClick.bind(this);\n      this.blurHandler = this.handleBlur.bind(this);\n\n      this.listbox.addEventListener('mouseover', this.mouseoverHandler);\n      this.listbox.addEventListener('mouseleave', this.mouseleaveHandler);\n      this.listbox.addEventListener('click', this.clickHandler);\n      this.listbox.addEventListener('blur', this.blurHandler);\n    }\n\n    /**\n     * Removes event listeners added when the options list was open.\n     */\n    removeListboxOpenListeners() {\n      this.listbox.removeEventListener('mouseover', this.mouseoverHandler);\n      this.listbox.removeEventListener('mouseleave', this.mouseleaveHandler);\n      this.listbox.removeEventListener('click', this.clickHandler);\n      this.listbox.removeEventListener('blur', this.blurHandler);\n    }\n\n    /**\n     * Handles 'keydown' events on the custom select element.\n     * @param {object} evt - Event object.\n     */\n    handleKeydown(evt) {\n      if (this.listboxOpen) {\n        this.handleKeyboardNav(evt);\n      } else if (evt.key === 'ArrowUp' || evt.key === 'ArrowDown' || evt.key === ' ') {\n        evt.preventDefault();\n        this.showListbox();\n      }\n    }\n\n    /**\n     * Handles 'mousedown' events on the button element.\n     * @param {object} evt - Event object.\n     */\n    handleMousedown(evt) {\n      if (!this.listboxOpen && evt.button === 0) {\n        this.showListbox();\n      }\n    }\n\n    /**\n     * Handles 'mouseover' events on the options list.\n     * @param {object} evt - Event object.\n     */\n    handleMouseover(evt) {\n      if (evt.target.matches('li')) {\n        this.focusOption(evt.target);\n      }\n    }\n\n    /**\n     * Handles 'mouseleave' events on the options list.\n     */\n    handleMouseleave() {\n      this.focusOption(this.selectedOption);\n    }\n\n    /**\n     * Handles 'click' events on the custom select element.\n     * @param {object} evt - Event object.\n     */\n    handleClick(evt) {\n      // mouse down + move + up will trigger a click event on parent - only respond to clicks on LI\n      if (evt.target.tagName === 'LI') {\n        this.selectOption(evt.target);\n      }\n    }\n\n    /**\n     * Handles 'blur' events on the options list.\n     */\n    handleBlur() {\n      if (this.listboxOpen) {\n        this.hideListbox();\n      }\n    }\n\n    /**\n     * Handles 'keydown' events on the options list.\n     * @param {object} evt - Event object.\n     */\n    handleKeyboardNav(evt) {\n      let optionToFocus;\n\n      // Disable tabbing if options list is open (as per native select element).\n      if (evt.key === 'Tab') {\n        evt.preventDefault();\n      }\n\n      switch (evt.key) {\n        // Focus an option.\n        case 'ArrowUp':\n        case 'ArrowDown':\n          evt.preventDefault();\n\n          if (evt.key === 'ArrowUp') {\n            optionToFocus = CustomSelect.getPreviousVisibleSibling(this.focusedOption);\n          } else {\n            optionToFocus = CustomSelect.getNextVisibleSibling(this.focusedOption);\n          }\n\n          if (optionToFocus && !optionToFocus.classList.contains('is-disabled')) {\n            this.focusOption(optionToFocus);\n          }\n          break;\n\n        // Select an option.\n        case 'Enter':\n        case ' ':\n          evt.preventDefault();\n          this.selectOption(this.focusedOption);\n          break;\n\n        // Cancel and close the options list.\n        case 'Escape':\n          evt.preventDefault();\n          this.hideListbox();\n          break;\n\n        // Search for an option and focus the first match (if one exists).\n        default:\n          optionToFocus = this.findOption(evt.key);\n\n          if (optionToFocus) {\n            this.focusOption(optionToFocus);\n          }\n          break;\n      }\n    }\n\n    /**\n     * Sets the button width to the same as the longest option, to prevent\n     * the button width from changing depending on the option selected.\n     */\n    setButtonWidth() {\n      // Get the width of an element without side padding.\n      const getHorizontalPadding = (el) => {\n        const elStyle = getComputedStyle(el);\n        return parseFloat(elStyle.paddingLeft) + parseFloat(elStyle.paddingRight);\n      };\n\n      const buttonPadding = getHorizontalPadding(this.button);\n      const optionPadding = getHorizontalPadding(this.selectedOption);\n      const buttonBorder = this.button.offsetWidth - this.button.clientWidth;\n      const optionWidth = Math.ceil(this.selectedOption.getBoundingClientRect().width);\n\n      this.button.style.setProperty('--custom-select-button-width', `${optionWidth - optionPadding + buttonPadding + buttonBorder}px`);\n    }\n\n    /**\n     * Shows the options list.\n     */\n    showListbox() {\n      this.listbox.hidden = false;\n      this.listboxOpen = true;\n\n      this.classList.add('is-open');\n      this.button.setAttribute('aria-expanded', 'true');\n      this.listbox.setAttribute('aria-hidden', 'false');\n\n      // Slight delay required to prevent blur event being fired immediately.\n      setTimeout(() => {\n        this.focusOption(this.selectedOption);\n        this.listbox.focus();\n\n        this.addListboxOpenListeners();\n      });\n    }\n\n    /**\n     * Hides the options list.\n     */\n    hideListbox() {\n      if (!this.listboxOpen) return;\n\n      this.listbox.hidden = true;\n      this.listboxOpen = false;\n\n      this.classList.remove('is-open');\n      this.button.setAttribute('aria-expanded', 'false');\n      this.listbox.setAttribute('aria-hidden', 'true');\n\n      if (this.focusedOption) {\n        this.focusedOption.classList.remove(this.focusedClass);\n        this.focusedOption = null;\n      }\n\n      this.button.focus();\n      this.removeListboxOpenListeners();\n    }\n\n    /**\n     * Finds a matching option from a typed string.\n     * @param {string} key - Key pressed.\n     * @returns {?Element}\n     */\n    findOption(key) {\n      this.searchString += key;\n\n      // If there's a timer already running, clear it.\n      if (this.searchTimer) {\n        clearTimeout(this.searchTimer);\n      }\n\n      // Wait 500ms to see if another key is pressed, if not then clear the search string.\n      this.searchTimer = setTimeout(() => {\n        this.searchString = '';\n      }, 500);\n\n      // Find an option that contains the search string (if there is one).\n      const matchingOption = Array.from(this.options).find((option) => {\n        const label = option.innerText.toLowerCase();\n        return label.includes(this.searchString) && !option.classList.contains('is-disabled');\n      });\n\n      return matchingOption;\n    }\n\n    /**\n     * Focuses an option.\n     * @param {Element} option - <li> element of the option to focus.\n     */\n    focusOption(option) {\n      // Remove focus on currently focused option (if there is one).\n      if (this.focusedOption) {\n        this.focusedOption.classList.remove(this.focusedClass);\n      }\n\n      // Set focus on the option.\n      this.focusedOption = option;\n      this.focusedOption.classList.add(this.focusedClass);\n\n      // If option is out of view, scroll the list.\n      if (this.listbox.scrollHeight > this.listbox.clientHeight) {\n        const scrollBottom = this.listbox.clientHeight + this.listbox.scrollTop;\n        const optionBottom = option.offsetTop + option.offsetHeight;\n\n        if (optionBottom > scrollBottom) {\n          this.listbox.scrollTop = optionBottom - this.listbox.clientHeight;\n        } else if (option.offsetTop < this.listbox.scrollTop) {\n          this.listbox.scrollTop = option.offsetTop;\n        }\n      }\n    }\n\n    /**\n     * Selects an option.\n     * @param {Element} option - Option <li> element.\n     */\n    selectOption(option) {\n      if (option !== this.selectedOption) {\n        // Switch aria-selected attribute to selected option.\n        option.setAttribute('aria-selected', 'true');\n        this.selectedOption.setAttribute('aria-selected', 'false');\n\n        // Update swatch colour in the button.\n        if (this.swatches) {\n          this.button.dataset.swatch = option.dataset.swatch || '';\n          const nativeSwatchColor = option.style.getPropertyValue('--native-swatch-color');\n          if (nativeSwatchColor) {\n            this.button.style.setProperty('--native-swatch-color', nativeSwatchColor);\n            this.button.style.setProperty('--native-swatch-image', '');\n          }\n          const nativeSwatchImage = option.style.getPropertyValue('--native-swatch-image');\n          if (nativeSwatchImage) {\n            this.button.style.setProperty('--native-swatch-image', nativeSwatchImage);\n            this.button.style.setProperty('--native-swatch-color', '');\n          }\n        }\n\n        // Update the button text and set the option as active.\n        this.button.firstElementChild.textContent = option.firstElementChild.textContent;\n        this.listbox.setAttribute('aria-activedescendant', option.id);\n        this.selectedOption = document.getElementById(option.id);\n\n        // If a native <select> exists, update its selected value and dispatch a 'change' event.\n        if (this.nativeSelect) {\n          this.nativeSelect.value = option.dataset.value;\n          this.nativeSelect.dispatchEvent(new Event('change', { bubbles: true }));\n        } else {\n          // Dispatch a 'change' event on the custom select element.\n          const detail = { selectedValue: option.dataset.value };\n          this.dispatchEvent(new CustomEvent('change', { bubbles: true, detail }));\n        }\n      }\n\n      this.hideListbox();\n    }\n  }\n\n  customElements.define('custom-select', CustomSelect);\n}\n"],
  "mappings": "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",
  "names": []
}
