{
  "version": 3,
  "sources": ["/cdn/shop/t/49/assets/predictive-search.js?version=1.0.276"],
  "sourcesContent": ["// Predictive search v1.1.0.\n// v1.1.0 (Task 114): sold-out products are requested too (unavailable_products=show); predictive-search.liquid lists them after in-stock ones with a Sold out badge.\nif (typeof SearchForm !== 'undefined') {\n  class PredictiveSearch extends SearchForm {\n    constructor() {\n      super();\n      this.cachedResults = {};\n      this.predictiveSearchResults = this.querySelector('[data-predictive-search]');\n      this.allPredictiveSearchInstances =\n        document.querySelectorAll('predictive-search');\n      this.isOpen = false;\n      this.abortController = new AbortController();\n      this.searchTerm = '';\n  \n      this.setupEventListeners();\n    }\n  \n    setupEventListeners() {\n      this.input.form.addEventListener('submit', this.onFormSubmit.bind(this));\n  \n      this.input.addEventListener('focus', this.onFocus.bind(this));\n      this.addEventListener('focusout', this.onFocusOut.bind(this));\n      this.addEventListener('keyup', this.onKeyup.bind(this));\n      this.addEventListener('keydown', this.onKeydown.bind(this));\n    }\n  \n    getQuery() {\n      return this.input.value.trim();\n    }\n  \n    onChange() {\n      super.onChange();\n      const newSearchTerm = this.getQuery();\n      if (!this.searchTerm || !newSearchTerm.startsWith(this.searchTerm)) {\n        // Remove the results when they are no longer relevant for the new search term\n        // so they don't show up when the dropdown opens again\n        this.querySelector(\"#predictive-search-results-groups-wrapper\")?.remove();\n      }\n  \n      // Update the term asap, don't wait for the predictive search query to finish loading\n      this.updateSearchForTerm(this.searchTerm, newSearchTerm);\n  \n      this.searchTerm = newSearchTerm;\n  \n      if (!this.searchTerm.length) {\n        this.close(true);\n        return;\n      }\n  \n      this.getSearchResults(this.searchTerm);\n    }\n  \n    onFormSubmit(event) {\n      if (!this.getQuery().length || this.querySelector('[aria-selected=\"true\"] a')) event.preventDefault();\n    }\n  \n    onFormReset(event) {\n      super.onFormReset(event);\n      if (super.shouldResetForm()) {\n        this.searchTerm = '';\n        this.abortController.abort();\n        this.abortController = new AbortController();\n        this.closeResults(true);\n      }\n    }\n  \n    onFocus() {\n      const currentSearchTerm = this.getQuery();\n  \n      if (!currentSearchTerm.length) return;\n  \n      if (this.searchTerm !== currentSearchTerm) {\n        // Search term was changed from other search input, treat it as a user change\n        this.onChange();\n      } else if (this.getAttribute('results') === 'true') {\n        this.open();\n      } else {\n        this.getSearchResults(this.searchTerm);\n      }\n    }\n  \n    onFocusOut() {\n      setTimeout(() => {\n        if (!this.contains(document.activeElement)) this.close();\n      })\n    }\n  \n    onKeyup(event) {\n      if (!this.getQuery().length) this.close(true);\n      event.preventDefault();\n  \n      switch (event.code) {\n        case 'ArrowUp':\n          this.switchOption('up')\n          break;\n        case 'ArrowDown':\n          this.switchOption('down');\n          break;\n        case 'Enter':\n          this.selectOption();\n          break;\n      }\n    }\n  \n    onKeydown(event) {\n      // Prevent the cursor from moving in the input when using the up and down arrow keys\n      if (\n        event.code === 'ArrowUp' ||\n        event.code === 'ArrowDown'\n      ) {\n        event.preventDefault();\n      }\n    }\n  \n    updateSearchForTerm(previousTerm, newTerm) {\n      const searchForTextElement = this.querySelector(\n        \"[data-predictive-search-search-for-text]\"\n      );\n      const currentButtonText = searchForTextElement?.innerText;\n      if (currentButtonText) {\n        if (currentButtonText.match(new RegExp(previousTerm, \"g\")).length > 1) {\n          // The new term matches part of the button text and not just the search term, do not replace to avoid mistakes\n          return;\n        }\n        const newButtonText = currentButtonText.replace(previousTerm, newTerm);\n        searchForTextElement.innerText = newButtonText;\n      }\n    }\n  \n    switchOption(direction) {\n      if (!this.getAttribute('open')) return;\n  \n      const moveUp = direction === 'up';\n      const selectedElement = this.querySelector('[aria-selected=\"true\"]');\n  \n      // Filter out hidden elements (duplicated page and article resources) thanks\n      // to this https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n      const allVisibleElements = Array.from(\n        this.querySelectorAll(\"li, button.predictive-search__item\")\n      ).filter((element) => element.offsetParent !== null);\n      let activeElementIndex = 0;\n  \n      if (moveUp && !selectedElement) return;\n  \n      let selectedElementIndex = -1;\n      let i = 0;\n  \n      while (selectedElementIndex === -1 && i <= allVisibleElements.length) {\n        if (allVisibleElements[i] === selectedElement) {\n          selectedElementIndex = i;\n        }\n        i++;\n      }\n  \n      this.statusElement.textContent = \"\";\n  \n      if (!moveUp && selectedElement) {\n        activeElementIndex =\n          selectedElementIndex === allVisibleElements.length - 1\n            ? 0\n            : selectedElementIndex + 1;\n      } else if (moveUp) {\n        activeElementIndex =\n          selectedElementIndex === 0\n            ? allVisibleElements.length - 1\n            : selectedElementIndex - 1;\n      }\n  \n      if (activeElementIndex === selectedElementIndex) return;\n  \n      const activeElement = allVisibleElements[activeElementIndex];\n  \n      activeElement.setAttribute('aria-selected', true);\n      if (selectedElement) selectedElement.setAttribute('aria-selected', false);\n  \n      this.input.setAttribute('aria-activedescendant', activeElement.id);\n    }\n  \n    selectOption() {\n      const selectedOption = this.querySelector(\n        '[aria-selected=\"true\"] a, button[aria-selected=\"true\"]'\n      );\n  \n      if (selectedOption) selectedOption.click();\n    }\n  \n    getSearchResults(searchTerm) {\n      const queryKey = searchTerm.replace(\" \", \"-\").toLowerCase();\n      this.setLiveRegionLoadingState();\n  \n      if (this.cachedResults[queryKey]) {\n        this.renderSearchResults(this.cachedResults[queryKey]);\n        return;\n      }\n  \n      fetch(`${routes.predictive_search_url}?q=${encodeURIComponent(searchTerm)}&resources[type]=product&resources[options][unavailable_products]=show&resources[options][fields]=title,variants.sku,product_type,variants.title&section_id=predictive-search`,\n      { signal: this.abortController.signal }\n      )\n        .then((response) => {\n          if (!response.ok) {\n            var error = new Error(response.status);\n            this.close();\n            throw error;\n          }\n  \n          return response.text();\n        })\n        .then((text) => {\n          const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-predictive-search').innerHTML;\n          // Save bandwidth keeping the cache in all instances synced\n          this.allPredictiveSearchInstances.forEach(\n            (predictiveSearchInstance) => {\n              predictiveSearchInstance.cachedResults[queryKey] = resultsMarkup;\n            }\n          );\n          this.renderSearchResults(resultsMarkup);\n        })\n        .catch((error) => {\n          if (error?.code === 20) {\n            // Code 20 means the call was aborted\n            return;\n          }\n          this.close();\n          throw error;\n        });\n    }\n  \n    setLiveRegionLoadingState() {\n      this.statusElement = this.statusElement || this.querySelector('.predictive-search-status');\n      this.loadingText = this.loadingText || this.getAttribute('data-loading-text');\n  \n      this.setLiveRegionText(this.loadingText);\n      this.setAttribute('loading', true);\n    }\n  \n    setLiveRegionText(statusText) {\n      this.statusElement.setAttribute('aria-hidden', 'false');\n      this.statusElement.textContent = statusText;\n  \n      setTimeout(() => {\n        this.statusElement.setAttribute('aria-hidden', 'true');\n      }, 1000);\n    }\n  \n    renderSearchResults(resultsMarkup) {\n      this.predictiveSearchResults.innerHTML = resultsMarkup;\n      this.setAttribute('results', true);\n  \n      this.setLiveRegionResults();\n      this.open();\n    }\n  \n    setLiveRegionResults() {\n      this.removeAttribute('loading');\n      this.setLiveRegionText(this.querySelector('[data-predictive-search-live-region-count-value]').textContent);\n    }\n  \n    getResultsMaxHeight() {\n      this.resultsMaxHeight = window.innerHeight - document.querySelector('.section-header').getBoundingClientRect().bottom;\n      return this.resultsMaxHeight;\n    }\n  \n    open() {\n      this.predictiveSearchResults.style.maxHeight = this.resultsMaxHeight || `${this.getResultsMaxHeight()}px`;\n      this.setAttribute('open', true);\n      this.input.setAttribute('aria-expanded', true);\n      this.isOpen = true;\n    }\n  \n    close(clearSearchTerm = false) {\n      this.closeResults(clearSearchTerm);\n      this.isOpen = false;\n    }\n  \n    closeResults(clearSearchTerm = false) {\n      if (clearSearchTerm) {\n        this.input.value = '';\n        this.removeAttribute('results');\n      }\n      const selected = this.querySelector('[aria-selected=\"true\"]');\n  \n      if (selected) selected.setAttribute('aria-selected', false);\n  \n      this.input.setAttribute('aria-activedescendant', '');\n      this.removeAttribute('loading');\n      this.removeAttribute('open');\n      this.input.setAttribute('aria-expanded', false);\n      this.resultsMaxHeight = false\n      this.predictiveSearchResults.removeAttribute('style');\n    }\n  }\n  \n  customElements.define('predictive-search', PredictiveSearch);\n  }\n  "],
  "mappings": "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",
  "names": []
}
