1class PredictiveSearch extends HTMLFormElement{constructor(){super(),this.cachedMap=new Map,this.focusElement=this.input,this.resetButton.addEventListener("click",this.clear.bind(this)),this.input.addEventListener("input",FoxTheme.utils.debounce(this.onChange.bind(this),300)),this.input.addEventListener("focus",this.onFocus.bind(this)),this.addEventListener("keydown",this.onKeydown.bind(this)),this.searchContent=this.querySelector(".search__content"),this.searchRecommendationEmpty=this.dataset.searchRecommendationEmpty==="true",this.closest(".template-search")&&document.addEventListener("click",this.handleClickOutside.bind(this))}get input(){return this.querySelector('input[type="search"]')}get resetButton(){return this.querySelector('button[type="reset"]')}get statusElement(){return this.querySelector("[data-predictive-search-status]")}get resultsContainer(){return document.getElementById("PredictiveSearchResults-"+FoxTheme.utils.getSectionId(this))}get navigableItems(){const container=this.resultsContainer;return container?Array.from(container.querySelectorAll("a[href], button")).filter(el=>el.offsetParent!==null):[]}onFocus(event){if(this.closest(".template-search")){if(document.body.classList.add("predictive-search-open"),this.getQuery().length===0)return;const url=this.setupURL().toString();this.renderSection(url,event)}}onKeydown(event){const{key}=event;if(key==="Escape"){this.clear();return}if(key!=="ArrowDown"&&key!=="ArrowUp")return;const items=this.navigableItems;if(items.length===0)return;event.preventDefault();const currentIndex=items.indexOf(document.activeElement);if(key==="ArrowDown"){const nextIndex=currentIndex<0?0:(currentIndex+1)%items.length;items[nextIndex].focus()}else{if(currentIndex<=0){this.input.focus();return}items[currentIndex-1].focus()}}announceResults(){const status=this.statusElement;if(!status)return;const countText=this.resultsContainer?.querySelector("[data-predictive-search-count-text]")?.textContent.trim();status.textContent="",countText&&window.requestAnimationFrame(()=>{status.textContent=countText})}getQuery(){return this.input.value.trim()}clear(event=null){event&&event.preventDefault(),this.searchRecommendationEmpty&&this.searchContent&&this.searchContent.classList.add("hidden"),this.input.value="",this.input.focus(),this.removeAttribute("results");const status=this.statusElement;status&&(status.textContent="")}setupURL(){const url=new URL(`${FoxTheme.routes.shop_url}${FoxTheme.routes.predictive_search_url}`);return url.searchParams.set("q",this.getQuery()),url.searchParams.set("resources[limit]",this.dataset.resultsLimit||3),url.searchParams.set("resources[limit_scope]","each"),url.searchParams.set("section_id",FoxTheme.utils.getSectionId(this)),url}onChange(){if(this.getQuery().length===0){this.clear();return}const url=this.setupURL().toString();this.renderSection(url)}renderSection(url){this.cachedMap.has(url)?this.renderSectionFromCache(url):this.renderSectionFromFetch(url)}renderSectionFromCache(url){const responseText=this.cachedMap.get(url);this.renderSearchResults(responseText),this.setAttribute("results","")}renderSectionFromFetch(url){this.setAttribute("loading","true"),this.resetButton.classList.add("btn--loading"),fetch(url).then(response=>{if(!response.ok)throw new Error("Network response was not ok");return response.text()}).then(responseText=>{this.renderSearchResults(responseText),this.cachedMap.set(url,responseText)}).catch(error=>{console.error("Error fetching data: ",error),this.setAttribute("error","Failed to load data")}).finally(()=>{this.removeAttribute("loading"),this.resetButton.classList.remove("btn--loading"),this.setAttribute("results","true")})}renderSearchResults(responseText){const id="PredictiveSearchResults-"+FoxTheme.utils.getSectionId(this),targetElement=document.getElementById(id);if(targetElement){const contentElement=new DOMParser().parseFromString(responseText,"text/html").getElementById(id);contentElement?(this.searchContent?.classList.remove("hidden"),targetElement.innerHTML=contentElement.innerHTML,this.announceResults()):console.error(`Element with id '${id}' not found in the parsed response.`)}else console.error(`Element with id '${id}' not found in the document.`)}handleClickOutside(event){this.contains(event.target)||setTimeout(()=>{document.body.classList.remove("predictive-search-open")})}}customElements.define("predictive-search",PredictiveSearch,{extends:"form"});class SearchDrawer extends DrawerComponent{constructor(){super()}
1get requiresBodyAppended(){return!1}get input(){return this.querySelector('input[type="search"]')}get focusElement(){return this.querySelector('input[type="search"]')}connectedCallback(){super.connectedCallback();const inner=this.querySelector(".drawer__inner");inner&&(this.contentObserver=new MutationObserver(FoxTheme.utils.debounce(()=>this.refreshFocusTrap(),100)),this.contentObserver.observe(inner,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class","hidden","style"]}))}disconnectedCallback(){super.disconnectedCallback(),this.contentObserver?.disconnect()}refreshFocusTrap(){this.open&&FoxTheme.a11y.trapFocus(this,this.focusElement,!1)}}customElements.define("search-drawer",SearchDrawer); 2//# sourceMappingURL=/cdn/shop/t/722/assets/search.js.map?v=145589848362056348031789995314
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.