1const DEBOUNCE_MS=250,MIN_QUERY_LENGTH=2,CACHE_LIMIT=30,ABORT_ERROR_NAME="AbortError",KL_SEARCH_HISTORY_STORAGE_KEY="kl-search-history",KL_SEARCH_HISTORY_HARD_LIMIT=10,KL_SEARCH_SCROLL_LOCK_CLASS="overflow-hidden";function readUnavailableProductsOption(datasetValue){return datasetValue==="last"?"last":"hide"}function buildSuggestUrl({suggestUrl,sectionId,query,resourceLimit,unavailableProducts}){const parameters=new URLSearchParams({q:query,"resources[type]":"product,collection,query","resources[limit]":String(resourceLimit),"resources[limit_scope]":"each","resources[options][unavailable_products]":unavailableProducts,section_id:sectionId});return`${suggestUrl}?${parameters.toString()}`}function normalizeQuery(value){return value.trim().replace(/\s+/g," ")}function readResultsMarkup(responseText){const resultsElement=new DOMParser().parseFromString(responseText,"text/html").querySelector("[data-kl-search-results]");return resultsElement?resultsElement.outerHTML:null}function addTermToHistory(storedTerms,term){const withoutTerm=storedTerms.filter(storedTerm=>storedTerm.toLowerCase()!==term.toLowerCase());return[term,...withoutTerm].slice(0,10)}function readSearchHistory(){try{const storedValue=localStorage.getItem(KL_SEARCH_HISTORY_STORAGE_KEY);if(!storedValue)return[];const storedTerms=JSON.parse(storedValue);return Array.isArray(storedTerms)?storedTerms.filter(storedTerm=>typeof storedTerm=="string"&&storedTerm.length>0):[]}catch(error){return console.debug("kl-search: could not read the search history",{error}),[]}}function writeSearchHistory(terms){try{localStorage.setItem(KL_SEARCH_HISTORY_STORAGE_KEY,JSON.stringify(terms))}catch(error){console.debug("kl-search: could not save the search history",{terms,error})}}function buildSearchUrl(searchUrl,term){return`${searchUrl}?q=${encodeURIComponent(term)}&options[prefix]=last`}function rememberResults(cache,query,markup){if(cache.size>=30){const oldestQuery=cache.keys().next().value;cache.delete(oldestQuery)}cache.set(query,markup)}function initSearch(dialogElement){const formElement=dialogElement.querySelector("[data-kl-search-form]"),inputElement=dialogElement.querySelector("[data-kl-search-input]"),clearElement=dialogElement.querySelector("[data-kl-search-clear]"),clearLabelElement=dialogElement.querySelector("[data-kl-search-clear-label]"),defaultElement=dialogElement.querySelector("[data-kl-search-default]"),resultsSlotElement=dialogElement.querySelector("[data-kl-search-results-slot]");if(!inputElement||!clearElement||!defaultElement||!resultsSlotElement)return null;const{klSearchSectionId:sectionId,klSearchSuggestUrl:suggestUrl,klSearchUrl:searchUrl}=dialogElement.dataset,resourceLimit=Number.parseInt(dialogElement.dataset.klSearchLimit,10)||10,unavailableProducts=readUnavailableProductsOption(dialogElement.dataset.klSearchUnavailableProducts),clearLabelText=dialogElement.dataset.klSearchClearLabel||"",closeLabelText=dialogElement.dataset.klSearchCloseLabel||"",isPredictiveEnabled=dialogElement.dataset.klSearchPredictive!==void 0&&!!suggestUrl&&!!sectionId,resultsCache=new Map;let debounceTimerId=null,abortController=null,renderedQuery="";function showDefaultState(){renderedQuery="",resultsSlotElement.hidden=!0,resultsSlotElement.replaceChildren(),defaultElement.hidden=!1,inputElement.setAttribute("aria-expanded","false")}function renderHistory(){const historyElement=resultsSlotElement.querySelector("[data-kl-search-history]");if(!historyElement||!searchUrl)return;const listElement=historyElement.querySelector("[data-kl-search-history-list]");if(!listElement)return;const shownLimit=Number.parseInt(historyElement.dataset.klSearchHistoryLimit,10)||5,terms=readSearchHistory().slice(0,shownLimit);if(listElement.replaceChildren(),terms.length===0){historyElement.hidden=!0;return}terms.forEach(term=>{const itemElement=document.createElement("li"),linkElement=document.createElement("a");itemElement.className="kl-search__menu-item",linkElement.className="kl-search__menu-link",linkElement.href=buildSearchUrl(searchUrl,term),linkElement.textContent=term,linkElement.setAttribute("data-kl-search-link",""),itemElement.append(linkElement),listElement.append(itemElement)}),historyElement.hidden=!1}function saveCurrentQuery(){const term=normalizeQuery(inputElement.value);term.length<2||writeSearchHistory(addTermToHistory(readSearchHistory(),term))}function showResultsState(markup){resultsSlotElement.innerHTML=markup,resultsSlotElement.hidden=!1,defaultElement.hidden=!0,inputElement.setAttribute("aria-expanded","true"),renderHistory()}function syncClearLabel(query){clearLabelElement&&(clearLabelElement.textContent=query.length>0?clearLabelText:closeLabelText)}function cancelPendingRequest(){debounceTimerId!==null&&(clearTimeout(debounceTimerId),debounceTimerId=null),abortController&&(abortController.abort(),abortController=null),dialogElement.classList.remove("is-loading")}async function requestResults(query){const controller=new AbortController;abortController=controller,dialogElement.classList.add("is-loading");try{const response=await fetch(buildSuggestUrl({suggestUrl,sectionId,query,resourceLimit,unavailableProducts}),{signal:controller.signal});if(!response.ok)throw new Error(`Predictive search responded ${response.status}`);const markup=readResultsMarkup(await response.text());if(!markup)throw new Error("Predictive search returned no results fragment");
1if(rememberResults(resultsCache,query,markup),normalizeQuery(inputElement.value)!==query)return;renderedQuery=query,showResultsState(markup)}catch(error){if(error?.name===ABORT_ERROR_NAME)return;console.debug("kl-search: could not load results",{query,error}),abortController===controller&&showDefaultState()}finally{abortController===controller&&(abortController=null,dialogElement.classList.remove("is-loading"))}}function handleQueryChange(){const query=normalizeQuery(inputElement.value);if(syncClearLabel(inputElement.value),cancelPendingRequest(),!isPredictiveEnabled||query.length<2){showDefaultState();return}if(query===renderedQuery)return;const cachedMarkup=resultsCache.get(query);if(cachedMarkup){renderedQuery=query,showResultsState(cachedMarkup);return}debounceTimerId=setTimeout(()=>{debounceTimerId=null,requestResults(query)},250)}let hasLockedPageScroll=!1;function lockPageScroll(){document.body.classList.contains(KL_SEARCH_SCROLL_LOCK_CLASS)||(document.body.classList.add(KL_SEARCH_SCROLL_LOCK_CLASS),hasLockedPageScroll=!0)}function unlockPageScroll(){hasLockedPageScroll&&(document.body.classList.remove(KL_SEARCH_SCROLL_LOCK_CLASS),hasLockedPageScroll=!1)}function openSearch(){if(!dialogElement.open){try{dialogElement.showModal()}catch(error){console.debug("kl-search: could not open the panel",{error});return}lockPageScroll(),inputElement.focus({preventScroll:!0})}}function closeSearch(){cancelPendingRequest(),dialogElement.open&&dialogElement.close()}dialogElement.addEventListener("close",unlockPageScroll);function moveFocusThroughResults(step){const linkElements=[...dialogElement.querySelectorAll("[data-kl-search-link]")];if(linkElements.length===0)return;const currentIndex=linkElements.indexOf(document.activeElement);if(currentIndex===-1){linkElements[step>0?0:linkElements.length-1].focus();return}const nextIndex=currentIndex+step;if(nextIndex<0){inputElement.focus();return}nextIndex>=linkElements.length||linkElements[nextIndex].focus()}return inputElement.addEventListener("input",handleQueryChange),inputElement.addEventListener("keydown",event=>{event.key!=="ArrowDown"&&event.key!=="ArrowUp"||(event.preventDefault(),moveFocusThroughResults(event.key==="ArrowDown"?1:-1))}),dialogElement.addEventListener("keydown",event=>{event.target!==inputElement&&(event.key!=="ArrowDown"&&event.key!=="ArrowUp"||(event.preventDefault(),moveFocusThroughResults(event.key==="ArrowDown"?1:-1)))}),clearElement.addEventListener("click",()=>{if(inputElement.value.length===0){closeSearch();return}inputElement.value="",handleQueryChange(),inputElement.focus()}),dialogElement.addEventListener("click",event=>{event.target===dialogElement&&closeSearch()}),resultsSlotElement.addEventListener("click",event=>{event.target.closest("[data-kl-search-link]")&&saveCurrentQuery()}),dialogElement.addEventListener("cancel",cancelPendingRequest),dialogElement.addEventListener("close",()=>{cancelPendingRequest(),inputElement.value="",syncClearLabel(""),showDefaultState()}),formElement&&formElement.addEventListener("submit",event=>{if(normalizeQuery(inputElement.value).length>0){saveCurrentQuery();return}event.preventDefault(),inputElement.focus()}),syncClearLabel(""),{openSearch,closeSearch}}const searchInstances=new Map;function registerSearch(dialogElement){const instance=initSearch(dialogElement);instance&&searchInstances.set(dialogElement,instance)}function findSearchInstance(rootElement){const dialogElement=rootElement.querySelector("[data-kl-search]");return dialogElement&&searchInstances.get(dialogElement)||null}document.addEventListener("click",event=>{if(!event.target.closest("[data-kl-search-open]")||event.metaKey||event.ctrlKey||event.shiftKey||event.button!==0)return;const instance=findSearchInstance(document);instance&&(event.preventDefault(),instance.openSearch())}),document.querySelectorAll("[data-kl-search]").forEach(registerSearch),document.addEventListener("shopify:section:load",event=>{event.target.querySelectorAll("[data-kl-search]").forEach(registerSearch)}),document.addEventListener("shopify:section:select",event=>{findSearchInstance(event.target)?.openSearch()}),document.addEventListener("shopify:section:deselect",event=>{findSearchInstance(event.target)?.closeSearch()});function watchCartDrawerForSearch(){const cartDrawer=document.querySelector("cart-drawer");if(!cartDrawer)return;const homeParent=cartDrawer.parentElement,homeNextSibling=cartDrawer.nextSibling;if(!homeParent)return;function returnCartDrawerHome(){cartDrawer.parentElement!==homeParent&&homeParent.insertBefore(cartDrawer,homeNextSibling)}function syncCartDrawerPlacement(){const openPanel=[...document.querySelectorAll("[data-kl-search]")].find(dialogElement=>dialogElement.open);if(cartDrawer.classList.contains("active")&&openPanel){cartDrawer.parentElement!==openPanel&&openPanel.appendChild(cartDrawer);return}returnCartDrawerHome()}try{new MutationObserver(syncCartDrawerPlacement).observe(cartDrawer,{attributes:!0,attributeFilter:["class"]}),document.querySelectorAll("[data-kl-search]").forEach(dialogElement=>{dialogElement.addEventListener("close",returnCartDrawerHome)})}
1catch(error){console.debug("kl-search: could not follow the cart drawer",{error})}}watchCartDrawerForSearch(); 2//# sourceMappingURL=/cdn/shop/t/430/assets/kl-search.js.map?v=2748186184213332621789073413
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.