{
  "version": 3,
  "sources": ["/cdn/shop/t/12/assets/predictive-search.js?x=1794251281337"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { debounce, onAnimationEnd, prefersReducedMotion, requestIdleCallback } from '@theme/utilities';\nimport { sectionRenderer } from '@theme/section-renderer';\nimport { morph } from '@theme/morph';\nimport { RecentlyViewed } from '@theme/recently-viewed-products';\nimport { DialogCloseEvent, DialogOpenEvent, DialogComponent } from '@theme/dialog';\nimport { SearchUpdateEvent } from '@shopify/events';\n\n/**\n * Ricerca predittiva: copia di predictive-search.js di Horizon 4.1.5 con i soli\n * agganci al markup adattati alle classi mib- (marcati \"mib:\"). Il markup sta in\n * snippets/mib-search-drawer.liquid, sections/predictive-search.liquid e\n * sections/predictive-search-empty.liquid.\n *\n * Modifiche rispetto a Horizon:\n * - gli elementi navigabili con le frecce sono tutti i [ref=\"resultsItems[]\"], nell'ordine\n *   del DOM, senza classi di contenitore;\n * - lo scroll si azzera sul contenitore dei risultati (ref predictiveSearchResults);\n * - lo stato vuoto e' `.mib-search-empty-section` e i visti di recente entrano in\n *   `#mib-search-recent`, con i ref gia' scritti dal Liquid;\n * - la scorciatoia da tastiera accetta anche Ctrl+K;\n * - Invio senza voce scelta apre i risultati con type=product (la pagina \u00E8 solo prodotti).\n *\n * @typedef {object} Refs\n * @property {HTMLInputElement} searchInput - The search input element.\n * @property {HTMLElement} predictiveSearchResults - The predictive search results container.\n * @property {HTMLElement} resetButton - The reset button element.\n * @property {HTMLElement[]} [resultsItems] - The search results items elements.\n * @property {HTMLElement} [recentlyViewedWrapper] - The recently viewed products wrapper.\n * @property {HTMLElement[]} [recentlyViewedTitle] - The recently viewed title elements.\n * @property {HTMLElement[]} [recentlyViewedItems] - The recently viewed product items.\n * @extends {Component<Refs>}\n */\nclass PredictiveSearchComponent extends Component {\n  requiredRefs = ['searchInput', 'predictiveSearchResults', 'resetButton'];\n\n  #controller = new AbortController();\n\n  /**\n   * @type {AbortController | null}\n   */\n  #activeFetch = null;\n\n  #emptyStateLoaded = false;\n\n  /**\n   * Get the dialog component.\n   * @returns {DialogComponent | null} The dialog component.\n   */\n  get dialog() {\n    return this.closest('dialog-component');\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    const { dialog } = this;\n    const { signal } = this.#controller;\n\n    if (this.refs.searchInput.value.length > 0) {\n      this.#showResetButton();\n    }\n\n    if (dialog) {\n      document.addEventListener('keydown', this.#handleKeyboardShortcut, { signal });\n      dialog.addEventListener(DialogCloseEvent.eventName, this.#handleDialogClose, { signal });\n      dialog.addEventListener(DialogOpenEvent.eventName, this.#handleDialogOpen, { signal, once: true });\n\n      this.addEventListener('click', this.#handleModalClick, { signal });\n    }\n\n    if (RecentlyViewed.getProducts().length > 0) {\n      requestIdleCallback(() => {\n        this.#loadEmptyState();\n      });\n    }\n  }\n\n  /**\n   * Handles clicks within the predictive search modal to maintain focus on the input\n   * @param {MouseEvent} event - The mouse event\n   */\n  #handleModalClick = (event) => {\n    const target = /** @type {HTMLElement} */ (event.target);\n    const isInteractiveElement =\n      target instanceof HTMLButtonElement ||\n      target instanceof HTMLAnchorElement ||\n      target instanceof HTMLInputElement ||\n      target.closest('button') ||\n      target.closest('a') ||\n      target.closest('input');\n\n    if (!isInteractiveElement && this.refs.searchInput) {\n      this.refs.searchInput.focus();\n    }\n  };\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.#controller.abort();\n  }\n\n  /**\n   * Handles the CMD+K / CTRL+K key combination.\n   * @param {KeyboardEvent} event - The keyboard event.\n   */\n  #handleKeyboardShortcut = (event) => {\n    if ((event.metaKey || event.ctrlKey) && event.key === 'k') {\n      // mib: se il campo di ricerca dell'header e' visibile (da --bp-md), la scorciatoia\n      // e' sua (sections/header.liquid): il drawer non deve aprirsi.\n      if (document.querySelector('.mib-header__searchbox')?.checkVisibility?.()) return;\n      event.preventDefault();\n      this.dialog?.toggleDialog();\n    }\n  };\n\n  /**\n   * Handles the dialog close event.\n   */\n  #handleDialogClose = () => {\n    this.#resetSearch();\n  };\n\n  #handleDialogOpen = () => {\n    if (!this.#emptyStateLoaded && RecentlyViewed.getProducts().length > 0) {\n      this.#loadEmptyState();\n    }\n  };\n\n  #loadEmptyState() {\n    if (this.#emptyStateLoaded) return;\n    this.#emptyStateLoaded = true;\n    this.resetSearch(false);\n  }\n\n  /** mib: tutti gli elementi navigabili, nell'ordine del DOM. */\n  get #allResultsItems() {\n    return /** @type {HTMLElement[]} */ (\n      Array.from(this.querySelectorAll('[ref=\"resultsItems[]\"]')).filter((item) => item instanceof HTMLElement)\n    );\n  }\n\n  /**\n   * Track whether the last interaction was keyboard-based\n   * @type {boolean}\n   */\n  #isKeyboardNavigation = false;\n\n  get #currentIndex() {\n    return this.#allResultsItems?.findIndex((item) => item.getAttribute('aria-selected') === 'true') ?? -1;\n  }\n\n  set #currentIndex(index) {\n    if (!this.#allResultsItems?.length) return;\n\n    let activeItem = null;\n\n    this.#allResultsItems.forEach((item) => {\n      item.classList.remove('keyboard-focus');\n    });\n\n    for (const [itemIndex, item] of this.#allResultsItems.entries()) {\n      if (itemIndex === index) {\n        item.setAttribute('aria-selected', 'true');\n        if (this.#isKeyboardNavigation) {\n          item.classList.add('keyboard-focus');\n        }\n        activeItem = item;\n      } else {\n        item.removeAttribute('aria-selected');\n      }\n    }\n\n    activeItem?.scrollIntoView({ behavior: prefersReducedMotion() ? 'instant' : 'smooth', block: 'nearest' });\n    this.refs.searchInput.focus();\n  }\n\n  get #currentItem() {\n    return this.#allResultsItems?.[this.#currentIndex];\n  }\n\n  /**\n   * Navigate through the predictive search results using arrow keys or close them with the Escape key.\n   * @param {KeyboardEvent} event - The keyboard event.\n   */\n  onSearchKeyDown = (event) => {\n    if (event.key === 'Escape') {\n      this.#resetSearch();\n      return;\n    }\n\n    if (!this.#allResultsItems?.length || event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n      return;\n    }\n\n    const currentIndex = this.#currentIndex;\n    const totalItems = this.#allResultsItems.length;\n\n    switch (event.key) {\n      case 'ArrowDown':\n        this.#isKeyboardNavigation = true;\n        event.preventDefault();\n        this.#currentIndex = currentIndex < totalItems - 1 ? currentIndex + 1 : 0;\n        break;\n\n      case 'Tab':\n        if (event.shiftKey) {\n          this.#isKeyboardNavigation = true;\n          event.preventDefault();\n          this.#currentIndex = currentIndex > 0 ? currentIndex - 1 : totalItems - 1;\n        } else {\n          this.#isKeyboardNavigation = true;\n          event.preventDefault();\n          this.#currentIndex = currentIndex < totalItems - 1 ? currentIndex + 1 : 0;\n        }\n        break;\n\n      case 'ArrowUp':\n        this.#isKeyboardNavigation = true;\n        event.preventDefault();\n        this.#currentIndex = currentIndex > 0 ? currentIndex - 1 : totalItems - 1;\n        break;\n\n      case 'Enter': {\n        const singleResultContainer = this.refs.predictiveSearchResults.querySelector('[data-single-result-url]');\n        if (singleResultContainer instanceof HTMLElement && singleResultContainer.dataset.singleResultUrl) {\n          event.preventDefault();\n          window.location.href = singleResultContainer.dataset.singleResultUrl;\n          return;\n        }\n\n        if (this.#currentIndex >= 0) {\n          event.preventDefault();\n          this.#currentItem?.querySelector('a')?.click();\n        } else {\n          const searchUrl = new URL(Theme.routes.search_url, location.origin);\n          searchUrl.searchParams.set('q', this.refs.searchInput.value);\n          // mib: la pagina dei risultati \u00E8 solo prodotti (fetta 7)\n          searchUrl.searchParams.set('type', 'product');\n          window.location.href = searchUrl.toString();\n        }\n        break;\n      }\n    }\n  };\n\n  /**\n   * Clears the recently viewed products.\n   * @param {Event} event - The event.\n   */\n  clearRecentlyViewedProducts(event) {\n    event.stopPropagation();\n\n    RecentlyViewed.clearProducts();\n\n    const { recentlyViewedItems, recentlyViewedTitle, recentlyViewedWrapper } = this.refs;\n\n    const allRecentlyViewedElements = [...(recentlyViewedItems || []), ...(recentlyViewedTitle || [])];\n\n    if (allRecentlyViewedElements.length === 0) {\n      return;\n    }\n\n    if (recentlyViewedWrapper) {\n      recentlyViewedWrapper.classList.add('removing');\n\n      onAnimationEnd(recentlyViewedWrapper, () => {\n        recentlyViewedWrapper.remove();\n      });\n    }\n  }\n\n  /**\n   * Reset the search state.\n   * @param {boolean} [keepFocus=true] - Whether to keep focus on input after reset\n   */\n  resetSearch = debounce((keepFocus = true) => {\n    if (keepFocus) {\n      this.refs.searchInput.focus();\n    }\n    this.#resetSearch();\n  }, 100);\n\n  /**\n   * Debounce the search handler to fetch and display search results based on the input value.\n   * Reset the current selection index and close results if the search term is empty.\n   */\n  search = debounce((event) => {\n    // If the input is not a text input (like using the Escape key), don't search\n    if (!event.inputType) return;\n\n    const searchTerm = this.refs.searchInput.value.trim();\n    this.#currentIndex = -1;\n\n    if (!searchTerm.length) {\n      this.#resetSearch();\n      return;\n    }\n\n    this.#showResetButton();\n    this.#getSearchResults(searchTerm);\n  }, 200);\n\n  /** mib: un solo contenitore scorrevole, il ref stesso. */\n  #resetScrollPositions() {\n    requestAnimationFrame(() => {\n      this.refs.predictiveSearchResults.scrollTo(0, 0);\n    });\n  }\n\n  /**\n   * Fetch search results using the section renderer and update the results container.\n   * @param {string} searchTerm - The term to search for\n   */\n  async #getSearchResults(searchTerm) {\n    if (!this.dataset.sectionId) return;\n\n    const url = new URL(Theme.routes.predictive_search_url, location.origin);\n    url.searchParams.set('q', searchTerm);\n    url.searchParams.set('resources[limit_scope]', 'each');\n\n    const { predictiveSearchResults } = this.refs;\n\n    const abortController = this.#createAbortController();\n\n    const deferredPromise = SearchUpdateEvent.createPromise();\n\n    this.dispatchEvent(\n      new SearchUpdateEvent({\n        search: {\n          query: searchTerm,\n        },\n        promise: deferredPromise.promise,\n      })\n    );\n\n    sectionRenderer\n      .getSectionHTML(this.dataset.sectionId, false, url)\n      .then((resultsMarkup) => {\n        if (!resultsMarkup) {\n          deferredPromise.resolve({ totalCount: 0 });\n          return;\n        }\n\n        if (abortController.signal.aborted) {\n          deferredPromise.reject(new Error('Fetch aborted by user'));\n          return;\n        }\n\n        morph(predictiveSearchResults, resultsMarkup);\n\n        this.#resetScrollPositions();\n\n        // Count all result items (products, collections, pages, articles, queries)\n        const resultCount = predictiveSearchResults.querySelectorAll('[ref=\"resultsItems[]\"]').length;\n        deferredPromise.resolve({ totalCount: resultCount });\n      })\n      .catch((error) => {\n        deferredPromise.reject(error);\n        if (abortController.signal.aborted) return;\n        throw error;\n      });\n  }\n\n  /**\n   * Fetch the markup for the recently viewed products.\n   * @returns {Promise<string | null>} The markup for the recently viewed products.\n   */\n  async #getRecentlyViewedProductsMarkup() {\n    if (!this.dataset.sectionId) return null;\n\n    const viewedProducts = RecentlyViewed.getProducts();\n    if (viewedProducts.length === 0) return null;\n\n    const url = new URL(Theme.routes.search_url, location.origin);\n    url.searchParams.set('q', viewedProducts.map(/** @param {string} id */ (id) => `id:${id}`).join(' OR '));\n    url.searchParams.set('resources[type]', 'product');\n\n    return sectionRenderer.getSectionHTML(this.dataset.sectionId, false, url);\n  }\n\n  #hideResetButton() {\n    const { resetButton } = this.refs;\n\n    resetButton.hidden = true;\n  }\n\n  #showResetButton() {\n    const { resetButton } = this.refs;\n\n    resetButton.hidden = false;\n  }\n\n  #createAbortController() {\n    const abortController = new AbortController();\n    if (this.#activeFetch) {\n      this.#activeFetch.abort();\n    }\n    this.#activeFetch = abortController;\n    return abortController;\n  }\n\n  #resetSearch = async () => {\n    const { predictiveSearchResults, searchInput } = this.refs;\n    const emptySectionId = 'predictive-search-empty';\n\n    this.#currentIndex = -1;\n    searchInput.value = '';\n    this.#hideResetButton();\n\n    const abortController = this.#createAbortController();\n    const url = new URL(window.location.href);\n    url.searchParams.delete('page');\n\n    const emptySectionMarkup = await sectionRenderer.getSectionHTML(emptySectionId, false, url);\n    const parsedEmptySectionMarkup = new DOMParser()\n      .parseFromString(emptySectionMarkup, 'text/html')\n      .querySelector('.mib-search-empty-section');\n\n    if (!parsedEmptySectionMarkup) throw new Error('No empty section markup found');\n\n    /** This needs to be awaited and not .then so the DOM is already morphed\n     * when #closeResults is called and therefore the height is animated */\n    const viewedProducts = RecentlyViewed.getProducts();\n\n    if (viewedProducts.length > 0) {\n      const recentlyViewedMarkup = await this.#getRecentlyViewedProductsMarkup();\n      if (!recentlyViewedMarkup) return;\n\n      // mib: il Liquid scrive gia' i ref; qui si sposta solo il blocco nel segnaposto\n      const parsedRecentlyViewedMarkup = new DOMParser().parseFromString(recentlyViewedMarkup, 'text/html');\n      const recentlyViewedProductsHtml = parsedRecentlyViewedMarkup.getElementById('mib-search-recent');\n      const target = parsedEmptySectionMarkup.querySelector('#mib-search-recent');\n      if (recentlyViewedProductsHtml && target) {\n        target.replaceChildren(...Array.from(recentlyViewedProductsHtml.children));\n      }\n    }\n\n    if (abortController.signal.aborted) return;\n\n    morph(predictiveSearchResults, parsedEmptySectionMarkup);\n    this.#resetScrollPositions();\n  };\n}\n\nif (!customElements.get('predictive-search-component')) {\n  customElements.define('predictive-search-component', PredictiveSearchComponent);\n}\n"],
  "mappings": "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",
  "names": []
}
