{
  "version": 3,
  "sources": ["/cdn/shop/t/66/assets/predictive-search.js?cb=16427"],
  "sourcesContent": ["/* global debounce */\n\nif (!customElements.get('predictive-search')) {\n  class PredictiveSearch extends HTMLElement {\n    constructor() {\n      super();\n      this.cachedResults = {};\n      this.input = this.querySelector('.js-search-input');\n      this.productTypeSelect = this.querySelector('.js-search-product-types');\n      this.productTypeInput = document.getElementById('product_type_input');\n      this.resetBtn = this.querySelector('.js-search-reset');\n      this.results = this.querySelector('.js-search-results');\n      this.overlay = this.querySelector('.js-search-overlay');\n      this.statusEl = this.querySelector('.js-search-status');\n      this.loadingText = this.getAttribute('data-loading-text');\n      this.addListeners();\n    }\n\n    /**\n     * Triggers when the web component is removed from the DOM\n     */\n    disconnectedCallback() {\n      this.close();\n    }\n\n    addListeners() {\n      this.input.addEventListener('focus', this.handleFocus.bind(this));\n      this.input.addEventListener('input', debounce(this.handleInput.bind(this)));\n      if (this.productTypeSelect) {\n        this.productTypeSelect.addEventListener('change', this.handleProductTypeChange.bind(this));\n      }\n      this.querySelector('.search').addEventListener('submit', this.handleSubmit.bind(this));\n    }\n\n    /**\n     * Gets the value of the search input field.\n     * @returns {string}\n     */\n    getQuery() {\n      return this.input.value.trim();\n    }\n\n    /**\n     * Handles search form submit.\n     * @param {object} evt - Event object.\n     */\n    handleSubmit(evt) {\n      if (\n        !this.getQuery().length\n        || this.querySelector('.predictive-search__item[aria-selected=\"true\"]:not(.js-submit)')\n      ) {\n        evt.preventDefault();\n      }\n    }\n\n    /**\n     * Handles 'input' events on the search field.\n     */\n    handleInput() {\n      // autocomplete=off prevents browser from restoring value after using back button in Safari\n      this.input.setAttribute('value', this.input.value);\n\n      const searchTerm = this.getQuery();\n\n      if (!searchTerm.length) {\n        this.close();\n        return;\n      }\n\n      this.getResults(searchTerm);\n    }\n\n    /**\n     * Handles a change of product type\n     * @param {object} evt - Event object.\n     */\n    handleProductTypeChange(evt) {\n      this.productTypeInput.value = evt.detail.selectedValue;\n      const query = this.getQuery();\n      if (query.length > 0) {\n        this.getResults(query);\n      }\n    }\n\n    /**\n     * Handles 'focus' events on the search field.\n     */\n    handleFocus() {\n      const searchTerm = this.getQuery();\n      if (!searchTerm.length) return;\n\n      if (this.getAttribute('results') === 'true') {\n        this.open();\n      } else {\n        this.getResults(searchTerm);\n      }\n    }\n\n    /**\n     * Handles 'keydown' events on the custom element.\n     * @param {object} evt - Event object.\n     */\n    handleKeydown(evt) {\n      // Let tabs script handle keydown events on the tab buttons.\n      if (evt.target.matches('.tablist__tab')) return;\n\n      switch (evt.key) {\n        case 'ArrowUp':\n        case 'ArrowDown':\n          evt.preventDefault();\n\n          if (this.hasAttribute('open')) {\n            this.handleResultsNav(evt.key);\n          }\n          break;\n\n        case 'Enter':\n          this.selectOption();\n          break;\n\n        case 'Escape':\n          this.close();\n          break;\n\n        // no default\n      }\n    }\n\n    /**\n     * Handles 'keyup' events on the custom element.\n     */\n    handleKeyup() {\n      // If search field is empty after key press, close the results.\n      if (!this.getQuery().length) this.close();\n    }\n\n    /**\n     * Handles keyboard navigation of the results.\n     * @param {string} key - Key pressed.\n     */\n    handleResultsNav(key) {\n      const selectedResult = this.querySelector(\n        '[role=\"tabpanel\"]:not([hidden]) [aria-selected=\"true\"]'\n      );\n      const allResults = this.querySelectorAll(\n        '[role=\"tabpanel\"]:not([hidden]) .predictive-search__item'\n      );\n      let resultToSelect = allResults[0];\n\n      if (key === 'ArrowUp') {\n        if (!selectedResult) return;\n\n        // Select the next result up or the last one if we've reached the top of the list.\n        resultToSelect = selectedResult.previousElementSibling || allResults[allResults.length - 1];\n      } else if (key === 'ArrowDown') {\n        if (selectedResult) {\n          // Select the next result down or the first one if we've reached the bottom of the list.\n          resultToSelect = selectedResult.nextElementSibling || allResults[0];\n        }\n      }\n\n      this.statusEl.textContent = '';\n\n      if (resultToSelect) {\n        // If the selected item didn't change, do nothing.\n        if (resultToSelect === selectedResult) return;\n\n        resultToSelect.setAttribute('aria-selected', 'true');\n        if (selectedResult) selectedResult.setAttribute('aria-selected', 'false');\n\n        this.setLiveRegionText(resultToSelect.textContent);\n        this.input.setAttribute('aria-activedescendant', resultToSelect.id);\n      }\n    }\n\n    /**\n     * Selects a result\n     */\n    selectOption() {\n      const selectedResult = this.querySelector('[aria-selected=\"true\"] > .js-search-link');\n      if (selectedResult) selectedResult.click();\n    }\n\n    /**\n     * Gets the results for a search term.\n     * @param {string} searchTerm - Search query.\n     */\n    async getResults(searchTerm) {\n      this.setLiveRegionLoadingState();\n\n      let searchFields = 'title,product_type,variants.title,vendor';\n      if (theme.settings.pSearchIncludeSkus) searchFields += ',variants.sku';\n      if (theme.settings.pSearchIncludeTags) searchFields += ',tag';\n\n      let searchParams = '';\n      if (this.productTypeInput && this.productTypeInput.value !== '') {\n        searchParams = `q=product_type:${encodeURIComponent(this.productTypeInput.value)} AND ${encodeURIComponent(searchTerm)}`;\n      } else {\n        searchParams = `q=${encodeURIComponent(searchTerm)}`;\n      }\n\n      searchParams += `&${encodeURIComponent('resources[limit]')}=${theme.settings.pSearchLimit}`;\n      searchParams += `&${encodeURIComponent('resources[limit_scope]')}=${\n        theme.settings.pSearchLimitScope\n      }`;\n      searchParams += `&${encodeURIComponent('resources[options][fields]')}=${searchFields}`;\n      searchParams += '&section_id=predictive-search';\n\n      const queryKey = searchParams.replace(' ', '-').toLowerCase();\n      if (this.cachedResults[queryKey]) {\n        this.renderResults(this.cachedResults[queryKey]);\n        return;\n      }\n\n      try {\n        const response = await fetch(`${theme.routes.predictiveSearch}?${searchParams}`);\n        if (!response.ok) throw new Error(response.status);\n\n        const tmpl = document.createElement('template');\n        tmpl.innerHTML = await response.text();\n\n        const resultsEl = tmpl.content.querySelector('#shopify-section-predictive-search');\n        const resultsMarkup = resultsEl.innerHTML.replace(/psearch/g, this.input.id);\n\n        this.cachedResults[queryKey] = resultsMarkup;\n        this.renderResults(resultsMarkup);\n      } catch (error) {\n        this.close();\n        throw error;\n      }\n    }\n\n    /**\n     * Sets the live region loading state.\n     */\n    setLiveRegionLoadingState() {\n      this.setLiveRegionText(this.loadingText);\n    }\n\n    /**\n     * Sets the live region text.\n     * @param {string} statusText - Status text.\n     */\n    setLiveRegionText(statusText) {\n      this.statusEl.setAttribute('aria-hidden', 'false');\n      this.statusEl.textContent = statusText;\n\n      setTimeout(() => {\n        this.statusEl.setAttribute('aria-hidden', 'true');\n      }, 1000);\n    }\n\n    /**\n     * Renders the results markup.\n     * @param {string} resultsMarkup - Results markup.\n     */\n    renderResults(resultsMarkup) {\n      this.results.innerHTML = resultsMarkup;\n      this.setAttribute('results', true);\n      this.open();\n    }\n\n    /**\n     * Opens the results listbox.\n     */\n    open() {\n      this.overlay.classList.add('is-visible');\n      if (this.getQuery().length) this.resetBtn.hidden = false;\n      this.input.setAttribute('aria-expanded', 'true');\n      this.setAttribute('open', '');\n      document.body.classList.add('overlay-predictive-search');\n\n      // Add event handlers (so the bound event listeners can be removed).\n      this.keydownHandler = this.keydownHandler || this.handleKeydown.bind(this);\n      this.keyupHandler = this.keyupHandler || this.handleKeyup.bind(this);\n      this.resetBtnClickHandler = this.resetBtnClickHandler || this.close.bind(this);\n      this.overlayClickHandler = this.overlayClickHandler || this.close.bind(this);\n\n      // Add event listeners (for while results are open).\n      this.addEventListener('keydown', this.keydownHandler);\n      this.addEventListener('keyup', this.keyupHandler);\n      this.resetBtn.addEventListener('click', this.resetBtnClickHandler);\n      this.overlay.addEventListener('click', this.overlayClickHandler);\n    }\n\n    /**\n     * Closes the results listbox.\n     * @param {object} evt - Event object.\n     */\n    close(evt) {\n      // If reset button was clicked, empty the input field.\n      if (evt && evt.target === this.resetBtn) {\n        this.input.value = '';\n        this.removeAttribute('results');\n        this.input.focus();\n      }\n\n      // Deselect the selected result (if there is one).\n      const selected = this.querySelector('.predictive-search__item[aria-selected=\"true\"]');\n      if (selected) selected.setAttribute('aria-selected', 'false');\n\n      this.removeAttribute('open');\n      this.resetBtn.hidden = true;\n      this.overlay.classList.remove('is-visible');\n      this.input.setAttribute('aria-activedescendant', '');\n      this.input.setAttribute('aria-expanded', 'false');\n      document.body.classList.remove('overlay-predictive-search');\n\n      // Remove event listeners added on search results opening.\n      this.removeEventListener('keydown', this.keydownHandler);\n      this.resetBtn.removeEventListener('click', this.resetBtnClickHandler);\n      this.overlay.removeEventListener('click', this.overlayClickHandler);\n    }\n  }\n\n  customElements.define('predictive-search', PredictiveSearch);\n}\n"],
  "mappings": "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",
  "names": []
}
