1if(!customElements.get("collection-grid")){class CollectionGrid extends HTMLElement{constructor(){super(),this.bindOnButtonClick=this.onButtonClick.bind(this),this.bindOnPageScroll=this.onPageScroll.bind(this)}connectedCallback(){this.init(),this.handlePLPScrollRestoration()}disconnectedCallback(){window.removeEventListener("scroll",this.bindOnPageScroll)}init(){this.dataset.paginationType!=="pages"&&(this.loadingPage=!1,this.currentPage=+this.dataset.currentPage,this.productGrid=this.querySelector("#product-grid"),this.productGrid&&(this.paginationElement=this.querySelector(".collection-grid__pagination .product-count"),this.cardSelector=this.productGrid.classList.contains("grill")?".grill__item":".grid__item",this.cardPageElements=Array.from(this.querySelectorAll(`${this.cardSelector}[data-current-page]`)),this.currentPages={},this.cardPageElements.forEach(element=>{const pageKey=element.dataset.currentPage;this.currentPages[pageKey]||(this.currentPages[pageKey]={url:"",page:null,first:null,last:null}),this.currentPages[pageKey].url=element.dataset.currentPageUrl,this.currentPages[pageKey].page=+element.dataset.currentPage,element.hasAttribute("last-from-page")?this.currentPages[pageKey].last=element:element.hasAttribute("first-from-page")&&(this.currentPages[pageKey].first=element)}),this.automaticTriggers=this.querySelectorAll(".collection-grid__automatic"),this.dataset.paginationType==="click"&&(this.prevButton=this.querySelector(".collection-grid__prev"),this.nextButton=this.querySelector(".collection-grid__next"),this.prevButton&&this.prevButton.addEventListener("click",this.bindOnButtonClick),this.nextButton&&this.nextButton.addEventListener("click",this.bindOnButtonClick)),this.checkAutomaticTriggers(),window.addEventListener("scroll",this.bindOnPageScroll)))}loadPage(targetUrl,trigger){targetUrl||(this.loadingPage=!1),this.loadingPage=!0,fetch(targetUrl).then(response=>response.text()).then(responseText=>{const responseHTML=new DOMParser().parseFromString(responseText,"text/html"),currentScroll=document.documentElement.scrollHeight-window.scrollY,newScrollY=window.scrollY-300;let newProductCards=Array.from(responseHTML.querySelectorAll(`collection-grid ${this.cardSelector}`));const newPaginationElement=responseHTML.querySelector(".collection-grid__pagination .product-count");let newTrigger=responseHTML.getElementById(trigger.id);trigger.id=="PrevPageTrigger"&&(newProductCards=newProductCards.reverse(),this.hasAttribute("data-cascade")&&(newProductCards=newProductCards.map((card,index)=>(card.style.setProperty("--animation-order",index),card)))),newProductCards.forEach(card=>{trigger.id=="PrevPageTrigger"?this.productGrid.prepend(card):trigger.id=="NextPageTrigger"&&this.productGrid.appendChild(card)}),trigger.id=="PrevPageTrigger"?window.scrollTo({top:document.documentElement.scrollHeight-currentScroll,behavior:"instant"}):window.innerHeight+window.scrollY>=document.documentElement.scrollHeight&&window.scrollTo({top:newScrollY,behavior:"instant"}),newTrigger?(newTrigger.addEventListener("click",this.bindOnButtonClick),trigger.replaceWith(newTrigger)):trigger.remove(),newPaginationElement&&this.paginationElement&&trigger.id!="PrevPageTrigger"&&(this.paginationElement.innerHTML=newPaginationElement.innerHTML)}).catch(err=>{console.error(err),trigger&&this.setLoadingTrigger(trigger,!1)}).finally(()=>{this.cardPageElements=Array.from(this.querySelectorAll(`${this.cardSelector}[data-current-page]`)),this.currentPages={},this.cardPageElements.forEach(element=>{const pageKey=element.dataset.currentPage;this.currentPages[pageKey]||(this.currentPages[pageKey]={url:"",first:null,last:null}),this.currentPages[pageKey].url=element.dataset.currentPageUrl,this.currentPages[pageKey].page=+element.dataset.currentPage,element.hasAttribute("last-from-page")?this.currentPages[pageKey].last=element:element.hasAttribute("first-from-page")&&(this.currentPages[pageKey].first=element)}),this.paginationElement=this.querySelector(".collection-grid__pagination .product-count"),this.automaticTriggers=this.querySelectorAll(".collection-grid__automatic"),trigger&&this.setLoadingTrigger(trigger,!1),this.loadingPage=!1})}onButtonClick(event){event.preventDefault();const button=event.currentTarget;this.setLoadingTrigger(button,!0),this.loadPage(button.dataset.target,button)}setLoadingTrigger(opener,enableLoading){enableLoading?(opener.setAttribute("aria-disabled",!0),opener.classList.add("loading"),opener.querySelector(".loading__spinner").classList.remove("hidden")):(opener.removeAttribute("aria-disabled"),opener.classList.remove("loading"),opener.querySelector(".loading__spinner").classList.add("hidden"))}checkAutomaticTriggers(){this.loadingPage||this.automaticTriggers.forEac
1h(trigger=>{trigger.getBoundingClientRect().top>0&&trigger.getBoundingClientRect().bottom<window.innerHeight&&(this.setLoadingTrigger(trigger,!0),this.loadPage(trigger.dataset.target,trigger))})}onPageScroll(){Object.entries(this.currentPages).forEach(([pageKey,page])=>{if(this.currentPage!=page.page&&window.scrollY>=page.first.offsetTop&&window.scrollY<page.last.offsetTop+page.last.getBoundingClientRect().height){const url=new URL(window.location.href),params=url.searchParams;params.set("page",`${page.page}`),url.search=params.toString(),window.history.replaceState({page:page.page},"",url),this.currentPage=page.page,page.title&&(document.title=page.title);const canonicalEl=document.querySelector('link[rel="canonical"]');if(canonicalEl){const canonicalUrl=new URL(canonicalEl.href);if(canonicalUrl.searchParams.set("page",`${page.page}`),canonicalEl.href=canonicalUrl.href,page.page>1){const prevUrl=new URL(canonicalUrl.href);page.page-1===1?prevUrl.searchParams.delete("page"):prevUrl.searchParams.set("page",`${page.page-1}`);let prevLinkEl=document.querySelector('link[rel="prev"]');prevLinkEl||(prevLinkEl=document.createElement("link"),prevLinkEl.rel="prev",document.head.appendChild(prevLinkEl)),prevLinkEl.href=prevUrl.href}if(this.querySelector("#NextPageTrigger")){const nextUrl=new URL(canonicalUrl.href);nextUrl.searchParams.set("page",`${page.page+1}`);let nextLinkEl=document.querySelector('link[rel="next"]');nextLinkEl||(nextLinkEl=document.createElement("link"),nextLinkEl.rel="next",document.head.appendChild(nextLinkEl)),nextLinkEl.href=nextUrl.href}}}}),this.checkAutomaticTriggers()}handlePLPScrollRestoration(){/^((?!chrome|android).)*safari/i.test(navigator.userAgent)&&/iPhone|iPad|iPod/i.test(navigator.userAgent)&&(window.addEventListener("beforeunload",()=>{sessionStorage.setItem("plp-scroll",window.scrollY)}),document.addEventListener("click",e=>{const link=e.target.closest("a");link&&link.href&&link.href.indexOf("/products/")!==-1&&sessionStorage.setItem("plp-scroll",window.scrollY)}),window.addEventListener("pageshow",event=>{const scroll=sessionStorage.getItem("plp-scroll");event.persisted&&scroll!==null?(setTimeout(()=>{window.scrollTo(0,parseInt(scroll,10))},100),sessionStorage.removeItem("plp-scroll")):event.persisted||sessionStorage.removeItem("plp-scroll")}))}}customElements.define("collection-grid",CollectionGrid)} 2//# sourceMappingURL=/cdn/shop/t/2/assets/component-collection-grid.js.map?v=76527917168127318431780493290
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.