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