{
  "version": 3,
  "sources": ["/cdn/shop/t/46/assets/algolia-custom-hooks.js?version=1.0.0"],
  "sourcesContent": ["import { formatTitle,renderProductTile,preloadSecondaryImage,setupImageSwapObserver, renderPlpPriorityFilters, injectbuilderContentTile, renderFilterPills, bindClickWithFilterLabels, unselectCatgegoryFacets } from './custom-utils.js';\nimport { isMobileBreakpoint } from './utilities.js';\nimport { renderCustomFilterComponent, customCheckboxItem } from './filter/custom-filter.js';\n\nconst isMobile = isMobileBreakpoint();\nconst REPLICA_INDEX_NAME = 'new'; \nconst DEFAULT_INDEX_NAME = 'mshopify_products'; \n\n//PLP loader code\n// Optimized: Wait for algolia-shopify-instantsearch to exist, then insert loader\nfunction insertLoaderWhenReady() {\n  const observer = new MutationObserver(() => {\n    const plpContainer = document.getElementById('algolia-shopify-instantsearch');\n    if (plpContainer && !document.getElementById('plp-loader')) {\n      const loader = document.createElement('div');\n      loader.id = 'plp-loader';\n      loader.className = 'for-plp-loading loading';\n      plpContainer.insertAdjacentElement('afterbegin', loader);\n      observer.disconnect(); // Stop observing once done\n    }\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n}\n\n//below 2 hooks are specifically added for new-arrivals collections to render teh data from new index by default\n//below listener have the custom hooks for algolia instant search\ndocument.addEventListener('algolia.hooks.initialize', function () {\n    // 1. Register the hook to modify the InstantSearch options, this is required so that on new-arriavls index the Relevance sort renders the data from new index\n    algoliaShopify.hooks.registerHook(\n      \"beforeInstantSearchOptions\", \n      function (options) {\n          console.log(\"Algolia Hook Fired: Replacing Sort Index Value.\");\n          // 1. --- MODIFY THE SORTORDERS ARRAY ---\n          \n          // Check if the sortOrders array exists and has at least one item\n          if (options.sortOrders && options.sortOrders.length > 0) {\n              \n              // TARGET: Get a reference to the FIRST sort option object (usually \"Relevance\")\n              const defaultSortOption = options.sortOrders[0];\n              defaultSortOption.label = 'Featured'; \n              if (window.location.pathname.includes('/collections/new-arrival')) {\n                // OVERRIDE: Change its index value to your replica index\n                defaultSortOption.value = REPLICA_INDEX_NAME; \n              }\n              \n          }\n\n          return options;\n      }\n    );\n  if (window.location.pathname.includes('/collections/new-arrival')) {\n    //this hook is required so that on new-arrivals collection page the routing and initial state works properly with the replica index\n    algoliaShopify.hooks.registerHook(\n      'beforeInstantSearchConfigurationOptions', \n      \n      function(options) {\n          \n          // 1. OVERRIDE indexName: Force InstantSearch to use the replica\n          options.indexName = REPLICA_INDEX_NAME;\n          \n          // 2. INITIAL STATE FIX: Prevents \"reading 'query' of undefined\" error\n          // Ensures the new index has a defined initial state.\n          options.initialUiState = {\n              [REPLICA_INDEX_NAME]: { \n                  query: '', \n                  page: 1, \n              },\n              // Also define the default index to prevent conflicts if other widgets reference it\n              [DEFAULT_INDEX_NAME]: {}, \n          };\n          \n          // 3. ROUTING FIX: Ensures URL synchronization (filter appending) works\n          // We must map the state between the REPLICA_INDEX_NAME (search engine) \n          // and the DEFAULT_INDEX_NAME (router expectation).\n          options.routing = options.routing || {};\n          options.routing.stateMapping = options.routing.stateMapping || {};\n          \n          \n          // --- Function to write state from search engine to URL ---\n          options.routing.stateMapping.stateToRoute = function(uiState) {\n              // Takes the state from the active REPLICA_INDEX_NAME and puts it \n              // under the DEFAULT_INDEX_NAME key so the router writes it to the URL correctly.\n              \n              const newUiState = {\n                  ...uiState,\n                  [DEFAULT_INDEX_NAME]: uiState[REPLICA_INDEX_NAME] || {}\n              };\n              \n              // Remove the replica key from the route state\n              delete newUiState[REPLICA_INDEX_NAME];\n              \n              return newUiState;\n          };\n\n          // --- Function to read state from URL to search engine ---\n          options.routing.stateMapping.routeToState = function(routeState) {\n              // Takes the state read from the URL (keyed by DEFAULT_INDEX_NAME) \n              // and maps it to the REPLICA_INDEX_NAME so the replica executes the search.\n              \n              const newRouteState = {\n                  ...routeState,\n                  [REPLICA_INDEX_NAME]: routeState[DEFAULT_INDEX_NAME] || {}\n              };\n              \n              return newRouteState;\n          };\n\n          console.log(`Algolia: Collection is using replica index ${REPLICA_INDEX_NAME} with routing fix applied.`);\n\n          return options;\n      }\n    );\n  } \n\n  algoliaShopify.hooks.registerHook('beforeInstantSearchFacetParamsOptions', function(params, facet) {\n    if (facet.name === \"vendor\") {\n      return {\n        ...params,\n        sortBy: ['isRefined','name:asc'],\n        templates: {\n          item(item, { html }) {\n            return customCheckboxItem(item, html, facet.name);\n          }\n        },\n      };\n    }\n\n    if (facet.name != \"named_tags.Material\" && facet.name != \"meta.custom.us_size\") {\n      return {\n        ...params,\n        sortBy: ['name:asc'],\n        templates: {\n          item(item, { html }) {\n            return customCheckboxItem(item, html, facet.name);\n          }\n        },\n        transformItems(items) {\n          return items.map(item => ({\n            ...item,\n            label: item.label.split(\">\").pop().trim(),\n          }));\n        },\n      };\n    }\n\n    return {\n        ...params,\n        templates: {\n          item(item, { html }) {\n            return customCheckboxItem(item, html, facet.name);\n          }\n        },\n      };\n  });\n\n  //below hook is used to customize the stats template to show the results count in required format\n  algoliaShopify.hooks.registerHook('beforeInstantSearchStatsTemplate', function(_defaultTemplate, data, html) {\n    return html`\n      ${data.hasOneResult &&\n        html`\n          <span class=\"ais-stats--nb-results\">\n            1 Products\n          </span>\n        `}\n      ${data.hasManyResults &&\n        html`\n          <span class=\"ais-stats--nb-results\">\n            ${' '} ${algoliaShopify.helpers.formatNumber(data.nbHits)} ${' '}\n            Products\n          </span>\n        `}\n    `;\n  });\n\n    //below hook is used to add a secondary image placeholder in the product item template\n    algoliaShopify.hooks.registerHook('beforeInstantSearchProductTemplate', function(_defaultTemplate, hit) {\n\n    // Return the MODIFIED original template\n    if(!isMobile) {\n      preloadSecondaryImage(hit.handle)\n    }\n\n    return renderProductTile(hit);\n  });\n});\n\n//below function is used to preset the category filters based on collection to which user is navigating and also handle the clear all filters functionality to re-apply the default filters\ndocument.addEventListener('algolia.instantSearch.afterInit', (evt) => {\n  // 1. Define your mapping: handle => category path\n  const collectionCategoryMap = window.GLOBAL_COLLECTION_MAPPING || '';\n  // Helper to open a facet dropdown\n    function openFacet(wrapper) {\n      if (!wrapper) return;\n      const header = wrapper.querySelector('.ais-facet--header');\n      if (header && wrapper.style.display !== 'none') header.click();\n    }\n    const lvl0WidgetWrapper = document.querySelector(`.ais-facet-named_tags\\\\.categories\\\\.lvl0`);\n    const lvl1WidgetWrapper = document.querySelector(`.ais-facet-named_tags\\\\.categories\\\\.lvl1`);\n    const lvl2WidgetWrapper = document.querySelector(`.ais-facet-named_tags\\\\.categories\\\\.lvl2`);\n\n    if (lvl0WidgetWrapper) {\n        if (collectionCategoryMap) {\n            // Hide the widget\n            lvl0WidgetWrapper.classList.add('hide');\n            // Hide lvl2 only if collectionCategoryMap does not include ' > '\n            // AND the URL does not include 'named_tags.categories.lvl1'\n            if (!collectionCategoryMap.includes(' > ') && !window.location.href.includes('named_tags.categories.lvl1') && !window.location.href.includes('named_tags.categories.lvl2')) {\n              openFacet(lvl1WidgetWrapper);\n              lvl2WidgetWrapper?.classList.add('hide');\n            } else {\n              openFacet(lvl2WidgetWrapper);\n            }\n        } else {\n            // Ensure it's visible if the collection is one where lvl0 should be shown (e.g., 'dresses')\n            lvl0WidgetWrapper.classList.remove('hide');\n              if (!window.location.href.includes('named_tags.categories.lvl0')) {\n              openFacet(lvl0WidgetWrapper);\n              lvl1WidgetWrapper.classList.add('hide');\n              lvl2WidgetWrapper.classList.add('hide');\n            }\n            else if (!window.location.href.includes('named_tags.categories.lvl1')) {\n              openFacet(lvl1WidgetWrapper);\n              lvl2WidgetWrapper.classList.add('hide');\n            } else {\n              openFacet(lvl2WidgetWrapper);\n            }\n        }\n    }\n\n    // Global variable to store the default category path for comparison\n    let defaultRefinements = {};\n    //on load we clear the min and max price applied\n    defaultRefinements['price'] = '\u2265 0';\n    const refinementsToApply = {};\n    let search = window.algoliaShopify?.instantsearch?.search;\n\n    let sortUIListenerAttached = false;\n\n    // ----------------------------------------------------\n    // NEW FUNCTION: Logic for the Custom Sort Dropdown\n    // ----------------------------------------------------\n  const setupCustomSortUI = () => {\n    // Find the original select and its container\n    const select = document.querySelector('.ais-SortBy-select');\n    const sortByContainer = select ? select.closest('.ais-SortBy') : null;\n    const aisSortContainer = sortByContainer ? sortByContainer.closest('.ais-sort') : null;\n    if (aisSortContainer) {\n      aisSortContainer.classList.remove('mobile', 'desktop');\n      aisSortContainer.classList.add(isMobile ? 'mobile' : 'desktop');\n    }\n    if (!select || !sortByContainer || sortUIListenerAttached) return;\n\n    // Create a dedicated target for the custom UI\n    let targetContainer = sortByContainer.querySelector('#custom-sort-target');\n    if (!targetContainer) {\n      targetContainer = document.createElement('div');\n      targetContainer.id = 'custom-sort-target';\n      select.insertAdjacentElement('afterend', targetContainer);\n      // Apply the necessary CSS to hide the original select\n      select.style.cssText = 'position: absolute; opacity: 0; width: 100%; height: 100%; top: 0; left: 0; cursor: pointer; z-index: 2;';\n    }\n\n    // --- 1. DYNAMICALLY GENERATE THE CUSTOM UI ---\n  let customHtml = '<div class=\"custom-sort-dropdown\" >';\n    customHtml += `<div class=\"custom-sort-selected-value\" tabindex=\"0\">${isMobile ? 'SORT' : ''}</div>`;\n    customHtml += '<ul class=\"custom-sort-options-list\">';\n    Array.from(select.options).forEach(option => {\n      customHtml += `<li data-value=\"${option.value}\" tabindex=\"0\"><span class=\"ga-sort-${window.COLLECTION_TITLE} - ${option.textContent}\">${option.textContent}</span></li>`;\n    });\n    customHtml += '</ul></div>';\n    targetContainer.innerHTML = customHtml;\n\n        // Now, grab references to the newly created elements\n        const customDropdown = targetContainer.querySelector('.custom-sort-dropdown');\n        const selectedValueDisplay = targetContainer.querySelector('.custom-sort-selected-value');\n        const optionsList = targetContainer.querySelector('.custom-sort-options-list');\n\n        // --- 2. SYNC LOGIC ---\n        const updateCustomUI = () => {\n            const selectedOption = select.options[select.selectedIndex];\n            if (selectedOption) {\n                if(!isMobile)\n                  selectedValueDisplay.textContent = selectedOption.textContent;\n                optionsList.querySelectorAll('li').forEach(li => {\n                    li.classList.toggle('is-active', li.dataset.value === selectedOption.value);\n                });\n            }\n        };\n\n        // --- 3. EVENT LISTENERS ---\n        // Located within your setupCustomSortUI function:\n        function handleOptionSelect(event) {\n          // For keydown, only proceed if Enter is pressed\n          if (event.type === 'keydown' && !(event.key === 'Enter' || event.keyCode === 13)) {\n              return;\n          }\n          event.preventDefault();\n          event.stopPropagation();\n          const option = event.target.closest('li[data-value]');\n          if (option) {\n              const newValue = option.dataset.value;\n              // 1. Update the hidden Algolia select value\n              select.value = newValue;\n              // 2. Programmatically trigger the 'change' event for Algolia\n              select.dispatchEvent(new Event('change', { bubbles: true }));\n              // 3. Close the dropdown\n              customDropdown.classList.remove('is-open');\n          }\n        }\n\n        optionsList.addEventListener('click', handleOptionSelect);\n        optionsList.addEventListener('keydown', handleOptionSelect);\n\n        // Also, add stopPropagation to the display click handler to prevent it \n        // from affecting surrounding elements on open/close\n        selectedValueDisplay.addEventListener('click', (event) => {\n            event.stopPropagation(); // Prevent issues with the close-on-outside-click logic\n            customDropdown.classList.toggle('is-open');\n        });\n\n        // Add this for Enter key support\n        selectedValueDisplay.addEventListener('keydown', (event) => {\n            if (event.key === 'Enter' || event.keyCode === 13) {\n                event.preventDefault();\n                event.stopPropagation();\n                customDropdown.classList.toggle('is-open');\n            }\n        });\n\n        document.addEventListener('click', (e) => {\n            if (!customDropdown.contains(e.target) && customDropdown.classList.contains('is-open')) {\n                customDropdown.classList.remove('is-open');\n            }\n        });\n\n        // Set the flag to prevent re-attaching listeners\n        select.addEventListener('change', updateCustomUI);\n        updateCustomUI(); \n        sortUIListenerAttached = true;\n    };\n    // ----------------------------------------------------\n\n    const populateDefaultRefinement = (categoryPath) => {\n      // 4. Split category path into levels\n      const levels = categoryPath.split('>').map(s => s.trim());\n\n      // 5. Prepare and store default facet refinements\n      if (levels[0]) {\n          defaultRefinements['named_tags.categories.lvl0'] = levels[0];\n          refinementsToApply['named_tags.categories.lvl0'] = levels[0];\n      }\n      if (levels[1]) {\n          const lvl1_value = levels.slice(0, 2).join(' > ');\n          defaultRefinements['named_tags.categories.lvl1'] = lvl1_value;\n          refinementsToApply['named_tags.categories.lvl1'] = lvl1_value;\n      }\n      if (levels[2]) {\n          const lvl2_value = levels.slice(0, 3).join(' > ');\n          defaultRefinements['named_tags.categories.lvl2'] = lvl2_value;\n          refinementsToApply['named_tags.categories.lvl2'] = lvl2_value;\n      } \n    }\n\n    //by default auto is true, when called from clear all filters we set it to false so that we can reset the page number and price range\n    const clearAndApplyRefinements = (auto=true) => {\n      // Clear existing default refinements before re-applying, \n      // especially important if called via 'Clear all' handler\n      Object.keys(defaultRefinements).forEach(attr => {\n          search.helper.clearRefinements(attr);\n      });\n\n      Object.entries(refinementsToApply).forEach(([attr, value]) => {\n          search.helper.addDisjunctiveFacetRefinement(attr, value);\n      });\n      if(auto) {\n        //below code is added to retain teh page number in url when user navigates from pdp to plp\n        // Get page from URL (supports ?page=2 or Algolia's #page=2)\n        let page = 0;\n        const urlParams = new URLSearchParams(window.location.search);\n        if (urlParams.has('page')) {\n            page = parseInt(urlParams.get('page'), 10) - 1; // Algolia uses 0-based index\n        } else {\n            // Check hash for Algolia's format: #page=2\n            const hashMatch = window.location.hash.match(/page=(\\\\d+)/);\n            if (hashMatch) {\n                page = parseInt(hashMatch[1], 10) - 1;\n            }\n        }\n        search.helper.setPage(page);\n\n        // Retain price range from URL\n        const priceRangeParam = urlParams.get('range[price]');\n        if (priceRangeParam) {\n            const [min, max] = priceRangeParam.split(':').map(Number);\n            if (!isNaN(min) && min > 0) {\n                search.helper.addNumericRefinement('price', '>=', min);\n            }\n            if (!isNaN(max) && max > 0) {\n                search.helper.addNumericRefinement('price', '<=', max);\n            }\n        }\n      }\n      // 7. Trigger the search to fetch results with the filter applied\n      search.helper.search();\n    }\n\n    const updatePriceSliderMarkers = () => {\n        // 1. Select all the elements displaying the static marker values\n      const valueMarkers = document.querySelectorAll('.rheostat-value');\n\n      // 2. Define the logic to find the closest higher value in hundreds\n      // Math.ceil(4937 / 100) * 100 = 50 * 100 = 5000\n      // Math.ceil(9875 / 100) * 100 = 99 * 100 = 9900\n      const getClosestHigherHundred = (value) => {\n          // Handle 0 case to prevent it from becoming 100\n          if (value === 0) return 0; \n          return Math.ceil(value / 100) * 100;\n      };\n\n      if (valueMarkers.length >= 3) {\n          // --- 1st Marker (Minimum) ---\n          // Requirement: Must be 0\n          valueMarkers[0].textContent = '0'; \n\n          // --- 2nd Marker (Middle) ---\n          // 1. Get the current value (4937 in your HTML example)\n          let middleValue = parseInt(valueMarkers[1].textContent.trim());\n          // 2. Apply the logic and update the display\n          valueMarkers[1].textContent = getClosestHigherHundred(middleValue);\n\n          // --- 3rd Marker (Maximum) ---\n          // 1. Get the current value (9875 in your HTML example)\n          let maxValue = parseInt(valueMarkers[2].textContent.trim());\n          // 2. Apply the logic and update the display\n          valueMarkers[2].textContent = getClosestHigherHundred(maxValue);\n      }\n    }\n    renderPlpPriorityFilters();\n    \n    // renderFilterPills();// trigger after 2 secs to ensure the facets are rendered\n    // setTimeout(() => {\n    //   renderFilterPills();\n    // }, 2000);\n\n    //wait for 3 seconds to ensure the search object is initialized\n    //on click on all lables under the div.custom-filters-accordion call renderFilterPills function\n    setTimeout(() => {\n      bindClickWithFilterLabels();\n    }, 2000);\n    \n    // --- 1. Define the core function to apply filters ---\n    const applyDefaultCollectionFilters = (auto=true) => {\n       \n\n        // 2. Get current collection handle from URL\n        const match = window.location.pathname.match(/\\/collections\\/([^\\/]+)/);\n        const collectionHandle = match ? match[1] : null;\n\n        // 3. Get category path for this collection\n        const categoryPath = window.GLOBAL_COLLECTION_MAPPING;\n                // 6. Apply facet refinements\n        if (!search || !search.helper) return;\n        \n        if (categoryPath) {\n          populateDefaultRefinement(categoryPath)\n          clearAndApplyRefinements(auto)\n        }\n\n        // 8. Handle rendering logic (pill cleanup and hiding)\n        // Show loader when loading starts\n        if (typeof insertLoaderWhenReady === 'function') insertLoaderWhenReady();\n\n        // 8. Handle rendering logic (pill cleanup and hiding)\n        search.on('render', () => { \n          if (window.location.pathname.includes('/search')) {\n            document.title='Women\u2019s designer fashion | Olivela'\n          }\n          window.scrollTo({top:0,behavior:'smooth'});\n            const loader = document.getElementById('plp-loader');\n            if (loader) {\n              setTimeout(() => loader.classList.remove('loading'), 2000);\n            }  \n\n            unselectCatgegoryFacets();\n            \n            if(!isMobile) {\n              //secondary image not required on mobile\n              // Re-initialize secondary image swap on each render      \n              setupImageSwapObserver()\n            }\n\n            \n\n            const allRefinementPills = document.querySelectorAll('.ais-current-refined-values--item');\n            const currentRefinementsContainer = document.querySelector('.ais-current-refined-values-container');\n            const clearFilterContainer = document.querySelector('.ais-clear-refinements-container')\n            let userAppliedFilterExists = false;\n\n            allRefinementPills.forEach((el) => {\n                const anchor = el.querySelector('a');\n                const attribute = anchor?.getAttribute('data-attribute');\n                const value = anchor?.getAttribute('data-value') ? anchor?.getAttribute('data-value') : 0;\n                const label = anchor?.getAttribute('data-label');\n                const childDiv = el.querySelector('a > div');\n\n                // Check if the pill is one of the default filters\n                const isDefaultFilter = defaultRefinements[attribute] === decodeURIComponent(label);\n\n                if (isDefaultFilter) {\n                    // **A. Hide the default filter pill**\n                    el.style.display = 'none';\n                } else {\n                    // This is a user-applied filter (not a default)\n                    userAppliedFilterExists = true;\n                    // B. Clean up the text for user-applied hierarchical filters\n                    //if (childDiv && attribute.startsWith('named_tags.categories.lvl')) {\n                        let decodedLabel = decodeURIComponent(label).split('>').pop().trim();\n                        // Replace \u2265 629 with $629 and above\n                        if (/\u2265\\s*/.test(decodedLabel)) {\n                          decodedLabel = `$${value} and above`;\n                        }\n                        // Replace \u2264 7574 with $7574 and below\n                        if (/\u2264\\s*/.test(decodedLabel)) {\n                          decodedLabel = `$${value} and below`;\n                        }\n                        childDiv.textContent = decodedLabel;\n                    //}\n                }\n            });\n\n            // **C. Hide the entire CurrentRefinements section if only default filters are present**\n            if (currentRefinementsContainer) {\n                if (!userAppliedFilterExists) {\n                    currentRefinementsContainer.style.display = 'none';\n                    clearFilterContainer.style.display = 'none';\n                } else {\n                    // Only show if a user-applied filter exists\n                    currentRefinementsContainer.style.display = '';\n                    clearFilterContainer.style.display = '';\n                }\n            }\n\n            \n\n            // --- C. Simplified Facet Hiding Logic for named_tags.categories.lvl0 ---\n            // If the current collection handle is in the defined list, hide the lvl0 facet.\n            const lvl0WidgetWrapper = document.querySelector(`.ais-facet-named_tags\\\\.categories\\\\.lvl0`);\n            const lvl1WidgetWrapper = document.querySelector(`.ais-facet-named_tags\\\\.categories\\\\.lvl1`);\n            const lvl2WidgetWrapper = document.querySelector(`.ais-facet-named_tags\\\\.categories\\\\.lvl2`);\n\n            // Helper to get selected labels from a facet wrapper\n            function getSelectedLabels(wrapper) {\n              if (!wrapper) return [];\n              return Array.from(wrapper.querySelectorAll('.ais-RefinementList-item--selected span'))\n                .map(span => span.textContent.trim());\n            }\n\n            // 3. Set facet titles\n            if (lvl1WidgetWrapper) {\n              const selectedLvl0 = getSelectedLabels(lvl0WidgetWrapper);\n              const header1 = lvl1WidgetWrapper.querySelector('.ais-facet--header');\n              if (header1) header1.textContent = selectedLvl0.join(', ');\n            }\n            if (lvl2WidgetWrapper) {\n              const selectedLvl1 = getSelectedLabels(lvl1WidgetWrapper);\n              const header2 = lvl2WidgetWrapper.querySelector('.ais-facet--header');\n              if (header2) header2.textContent = selectedLvl1.join(', ');\n            }\n\n\n            // --- LABEL SHORTENING LOGIC (for facet list values) ---\n            document.querySelectorAll('.ais-RefinementList-item--selected').forEach((labelElement) => {\n                const labelNodes = Array.from(labelElement.childNodes);\n                const textNode = labelNodes.find(node => node.nodeType === 3 && node.textContent.includes('>'));\n                if (textNode) {\n                    const fullLabel = textNode.textContent.trim();\n                    //not allowing the user to deselect the preselected facets\n                    if (Object.values(defaultRefinements).includes(fullLabel)) {\n                        labelElement?.parentElement?.parentElement?.style?.setProperty('pointer-events', 'none', 'important');\n                    }\n                    if (fullLabel.includes('>')) {\n                        textNode.textContent = fullLabel.split('>').pop().trim();\n                    }\n                }\n            });\n            // Hide pagination if no results count or only 5 li in pagination\n            const nbResults = document.querySelector('.ais-stats--nb-results'); \n            const nbResultsMessage = document.querySelector('.ais-hit-empty--title');\n            if(nbResultsMessage) {\n              nbResultsMessage.innerHTML = `Sorry, we couldn't find any matching results for \nthis search.`\n            } \n            const paginationContainer = document.querySelector('.ais-pagination-container');\n            const paginationList = paginationContainer ? paginationContainer.querySelector('.ais-Pagination-list') : null;\n            const paginationItems = paginationList ? paginationList.querySelectorAll('li') : [];\n            if (paginationContainer && paginationContainer.style) {\n                if (!nbResults || paginationItems.length === 5) {\n                    paginationContainer.style.display = 'none';\n                } else {\n                    paginationContainer.style.display = '';\n                }\n            }\n            //update the price slider dispaly value to nearest 100s\n            updatePriceSliderMarkers();\n            setupCustomSortUI();\n            // --- Render custom filter component ---\n            const nbHits = search.helper.lastResults ? search.helper.lastResults.nbHits : 0;\n            renderCustomFilterComponent(nbHits);\n            setTimeout(injectbuilderContentTile(), 100);\n            renderFilterPills();\n            let sortCon = document.querySelector('.ais-SortBy-select')\n            if(sortCon) {\n              sortCon.style.display = 'none';\n            }\n        });\n    };\n\n    // --- 2. Run on Initial Load ---\n    applyDefaultCollectionFilters();\n\n    // --- 3. Observe the DOM for the Clear all button ---\n    const targetNode = document.getElementById('ais-facets') || document.body;\n    let listenerAttached = false;\n\n    const observer = new MutationObserver(function(mutations, observer) {\n        if (listenerAttached) return;\n\n        const clearButton = document.querySelector('.ais-ClearRefinements-button');\n\n        if (clearButton) {\n            // Found the button, now attach the listener\n            clearButton.addEventListener('click', () => {\n                console.log('clear filter clicked');\n                // Algolia's 'Clear all' removes ALL filters.\n                // We re-apply the default filters after a short delay.\n                setTimeout(applyDefaultCollectionFilters(false), 100);\n            });\n\n            // Set flag and stop observing\n            listenerAttached = true;\n            observer.disconnect();\n        }\n    });\n\n    // Start observing for changes in the subtree\n    observer.observe(targetNode, {\n        childList: true,\n        subtree: true\n    });\n});"],
  "mappings": "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",
  "names": ["lvl0WidgetWrapper", "lvl1WidgetWrapper", "lvl2WidgetWrapper", "observer"]
}
