PageSourceSearch

https://relode.se/cdn/shop/t/102/assets/facets.js?v=21771618632786570461781768835

js relode.se collected 2026-10-05 01:19:25 UTC 17,079 bytes, 2 lines download raw bytes

1class FacetFiltersForm extends HTMLElement{constructor(){super(),this.onActiveFilterClick=this.onActiveFilterClick.bind(this),this.debouncedOnSubmit=debounce(event=>{this.shouldPreventSubmit(event)||this.onSubmitHandler(event)},800),this.querySelector("form").addEventListener("input",this.debouncedOnSubmit.bind(this));const facetWrapper=this.querySelector("#FacetsWrapperDesktop");facetWrapper&&facetWrapper.addEventListener("keyup",onKeyUpEscape)}static setListeners(){const onHistoryChange=event=>{const searchParams=event.state?event.state.searchParams:FacetFiltersForm.searchParamsInitial;searchParams!==FacetFiltersForm.searchParamsPrev&&FacetFiltersForm.renderPage(searchParams,null,!1)};window.addEventListener("popstate",onHistoryChange)}static toggleActiveFacets(disable=!0){document.querySelectorAll(".js-facet-remove").forEach(element=>{element.classList.toggle("disabled",disable)})}static renderPage(searchParams,event,updateURLHash=!0){FacetFiltersForm.searchParamsPrev=searchParams;const sections=FacetFiltersForm.getSections(),countContainer=document.getElementById("ProductCount"),countContainerDesktop=document.getElementById("ProductCountDesktop");document.getElementById("ProductGridContainer").querySelector(".collection-grid-container").classList.add("loading"),countContainer&&countContainer.classList.add("loading"),countContainerDesktop&&countContainerDesktop.classList.add("loading"),sections.forEach(section=>{const url=`${window.location.pathname}?section_id=${section.section}&${searchParams}`,filterDataUrl=element=>element.url===url;FacetFiltersForm.filterData.some(filterDataUrl)?FacetFiltersForm.renderSectionFromCache(filterDataUrl,event):FacetFiltersForm.renderSectionFromFetch(url,event)}),updateURLHash&&FacetFiltersForm.updateURLHash(searchParams)}static renderSectionFromFetch(url,event){fetch(url).then(response=>response.text()).then(responseText=>{const html=responseText;FacetFiltersForm.filterData=[...FacetFiltersForm.filterData,{html,url}],FacetFiltersForm.renderFilters(html,event),FacetFiltersForm.renderProductGridContainer(html),FacetFiltersForm.renderProductCount(html),document.getElementById("SortBy")&&document.getElementById("SortBy").dispatchEvent(new Event("change",{bubbles:!0})),typeof initializeScrollAnimationTrigger=="function"&&initializeScrollAnimationTrigger(html.innerHTML),setTimeout(()=>{FacetFiltersForm.initializeShowMore()},0)})}static renderSectionFromCache(filterDataUrl,event){const html=FacetFiltersForm.filterData.find(filterDataUrl).html;FacetFiltersForm.renderFilters(html,event),FacetFiltersForm.renderProductGridContainer(html),FacetFiltersForm.renderProductCount(html),document.getElementById("SortBy")&&document.getElementById("SortBy").dispatchEvent(new Event("change",{bubbles:!0})),typeof initializeScrollAnimationTrigger=="function"&&initializeScrollAnimationTrigger(html.innerHTML),setTimeout(()=>{FacetFiltersForm.initializeShowMore()},0)}static renderProductGridContainer(html){document.getElementById("ProductGridContainer").innerHTML=new DOMParser().parseFromString(html,"text/html").getElementById("ProductGridContainer").innerHTML,document.getElementById("ProductGridContainer").querySelectorAll(".scroll-trigger").forEach(element=>{element.classList.add("scroll-trigger--cancel")})}static renderProductCount(html){const countElement=new DOMParser().parseFromString(html,"text/html").getElementById("ProductCount");if(!countElement)return;const count=countElement.innerHTML,container=document.getElementById("ProductCount"),containerDesktop=document.getElementById("ProductCountDesktop");container&&(container.innerHTML=count,container.classList.remove("loading")),containerDesktop&&(containerDesktop.innerHTML=count,containerDesktop.classList.remove("loading"))}static renderFilters(html,event){const parsedHTML=new DOMParser().parseFromString(html,"text/html"),facetDetailsElementsFromFetch=parsedHTML.querySelectorAll("#FacetFiltersForm .js-filter"),facetDetailsElementsFromDom=document.querySelectorAll("facet-filters-form form .js-filter");Array.from(facetDetailsElementsFromDom).forEach(currentElement=>{Array.from(facetDetailsElementsFromFetch).some(({id})=>currentElement.id===id)||currentElement.remove()});const matchesId=element=>
1{const jsFilter=event?event.target.closest(".js-filter"):void 0;return jsFilter?element.id===jsFilter.id:!1},facetsToRender=Array.from(facetDetailsElementsFromFetch).filter(element=>!matchesId(element)),countsToRender=Array.from(facetDetailsElementsFromFetch).find(matchesId);if(facetsToRender.forEach((elementToRender,index)=>{if(document.getElementById(elementToRender.id))document.getElementById(elementToRender.id).innerHTML=elementToRender.innerHTML;else if(index>0){const{className:previousElementClassName,id:previousElementId}=facetsToRender[index-1];if(elementToRender.className===previousElementClassName){document.getElementById(previousElementId).after(elementToRender);return}}}),FacetFiltersForm.renderActiveFacets(parsedHTML),countsToRender){const closestJSFilterID=event.target.closest(".js-filter").id;if(closestJSFilterID){FacetFiltersForm.renderCounts(countsToRender,event.target.closest(".js-filter"));const newElementToActivate=document.getElementById(closestJSFilterID).querySelector(".facets__summary"),isTextInput=event.target.getAttribute("type")==="text";newElementToActivate&&!isTextInput&&newElementToActivate.focus()}}}static renderActiveFacets(html){[".active-facets"].forEach(selector=>{const activeFacetsElement=html.querySelector(selector);activeFacetsElement&&(document.querySelector(selector).innerHTML=activeFacetsElement.innerHTML)}),FacetFiltersForm.toggleActiveFacets(!1)}static renderCounts(source,target){const targetSummary=target.querySelector(".facets__summary"),sourceSummary=source.querySelector(".facets__summary");
1sourceSummary&&targetSummary&&(targetSummary.outerHTML=sourceSummary.outerHTML);const targetHeaderElement=target.querySelector(".facets__header"),sourceHeaderElement=source.querySelector(".facets__header");sourceHeaderElement&&targetHeaderElement&&(targetHeaderElement.outerHTML=sourceHeaderElement.outerHTML);const targetWrapElement=target.querySelector(".facets-wrap"),sourceWrapElement=source.querySelector(".facets-wrap");sourceWrapElement&&targetWrapElement&&(target.querySelector("show-more-button .label-show-more.hidden")&&sourceWrapElement.querySelectorAll(".facets__item.hidden").forEach(hiddenItem=>hiddenItem.classList.replace("hidden","show-more-item")),targetWrapElement.outerHTML=sourceWrapElement.outerHTML)}static updateURLHash(searchParams){history.pushState({searchParams},"",`${window.location.pathname}${searchParams&&"?".concat(searchParams)}`)}static getSections(){return[{section:document.getElementById("product-grid").dataset.id}]}createSearchParams(form){const formData=new FormData(form);return new URLSearchParams(formData).toString()}onSubmitForm(searchParams,event){FacetFiltersForm.renderPage(searchParams,event)}onSubmitHandler(event){event.preventDefault();const params=new URLSearchParams,currentUrl=new URL(window.location.href),sortParam=currentUrl.searchParams.get("sort_by");sortParam&&params.set("sort_by",sortParam);const qParam=currentUrl.searchParams.get("q");qParam&&params.set("q",qParam);const sortBySelect=document.getElementById("SortBy");sortBySelect&&sortBySelect.value&&params.set("sort_by",sortBySelect.value);let sortFilterForms=Array.from(document.querySelectorAll("facet-filters-form form"));sortFilterForms=sortFilterForms.filter(form=>form.querySelector('input[type="checkbox"][name^="filter"]')!==null);const allFilterCheckboxes={};sortFilterForms.forEach(form=>{form.querySelectorAll('input[type="checkbox"]').forEach(input=>{const key=`${input.name}|${input.value}`;allFilterCheckboxes[key]||(allFilterCheckboxes[key]=[]),allFilterCheckboxes[key].push(input)})}),Object.values(allFilterCheckboxes).forEach(inputs=>{if(inputs.length>1){const triggerForm=event.target?event.target.closest("form"):null,primaryInput=inputs.find(input=>input.closest("form")===triggerForm)||inputs[0];inputs.forEach(input=>{input!==primaryInput&&(input.checked=primaryInput.checked)})}}),window.matchMedia("(max-width:990px)").matches&&(sortFilterForms=sortFilterForms.filter(form=>!form.closest(".collection__facets--sidebar"))),sortFilterForms.forEach(form=>{form.querySelectorAll('input[type="checkbox"]').forEach(input=>{input.checked&&params.append(input.name,input.value)}),form.querySelectorAll('input:not([type="checkbox"])').forEach(input=>{if(input.value&&input.name!=="sort_by"&&input.name){if(input.name==="filter.v.price.gte"){const min=input.getAttribute("min");if(min!==null&&Number(input.value)===Number(min))return}if(input.name==="filter.v.price.lte"){const max=input.getAttribute("max");if(max!==null&&Number(input.value)===Number(max))return}params.set(input.name,input.value)}}),form.querySelectorAll("select").forEach(select=>{select.value&&select.name==="sort_by"&&params.set("sort_by",select.value)})}),this.onSubmitForm(params.toString(),event)}onActiveFilterClick(event){event.preventDefault(),FacetFiltersForm.toggleActiveFacets();let url=event.currentTarget.href.indexOf("?")==-1?"":event.currentTarget.href.slice(event.currentTarget.href.indexOf("?")+1);const qParam=new URL(window.location.href).searchParams.get("q");if(qParam){const params=new URLSearchParams(url);params.set("q",qParam),url=params.toString()}FacetFiltersForm.renderPage(url)}shouldPreventSubmit(event){const minInput=event?.target?.form?.querySelector('input[name="filter.v.price.gte"]'),maxInput=event?.target?.form?.querySelector('input[name="filter.v.price.lte"]');if(minInput&&maxInput){const min=parseFloat(minInput.value),max=parseFloat(maxInput.value);if(!isNaN(min)&&!isNaN(max)&&min>=max)return!0}return!1}static initializeShowMore(){document.querySelectorAll(".js-filter[data-show-more-count]").forEach(group=>{const listItems=group.querySelectorAll(".facets__item"),button=group.querySelector(".show-more"),showMoreCount=parseInt(group.dataset.showMoreCount,10)||5;let expanded=FacetFiltersForm.expandedFilters.has(group.id);if(!button)return;
1function updateList(){listItems.forEach((item,index)=>{const shouldCollapse=!expanded&&index>=showMoreCount;item.classList.toggle("is-collapsed",shouldCollapse)}),button.textContent=expanded?window.actionStrings.showLess:window.actionStrings.showMore}button.addEventListener("click",event=>{event.preventDefault(),expanded=!expanded,expanded?FacetFiltersForm.expandedFilters.add(group.id):FacetFiltersForm.expandedFilters.delete(group.id),updateList()}),updateList(),listItems.length<=showMoreCount&&(button.style.display="none")})}}FacetFiltersForm.filterData=[],FacetFiltersForm.searchParamsInitial=window.location.search.slice(1),FacetFiltersForm.searchParamsPrev=window.location.search.slice(1),customElements.define("facet-filters-form",FacetFiltersForm),FacetFiltersForm.setListeners(),FacetFiltersForm.expandedFilters=new Set,FacetFiltersForm.initializeShowMore();class PriceRange extends HTMLElement{constructor(){super(),this.querySelectorAll("input").forEach(element=>{element.addEventListener("change",this.onRangeChange.bind(this)),element.addEventListener("keydown",this.onKeyDown.bind(this))}),this.setMinAndMaxValues()}onRangeChange(event){this.adjustToValidValues(event.currentTarget),this.setMinAndMaxValues()}onKeyDown(event){!["Backspace","Tab","Enter","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Delete","Escape"].includes(event.key)&&!/[0-9.,]/.test(event.key)&&event.preventDefault()}setMinAndMaxValues(){const inputs=this.querySelectorAll("input"),minInput=inputs[0],maxInput=inputs[1];maxInput.value?minInput.setAttribute("data-max",maxInput.value):minInput.setAttribute("data-max",maxInput.getAttribute("max")),minInput.value?maxInput.setAttribute("data-min",minInput.value):maxInput.setAttribute("data-min",minInput.getAttribute("min"))}adjustToValidValues(input){const value=Number(input.value),min=Number(input.getAttribute("min"))||0,max=Number(input.getAttribute("max"));!isNaN(min)&&value<min&&(input.value=min),!isNaN(max)&&value>max&&(input.value=max)}#abortController;connectedCallback(){this.#abortController=new AbortController;const signal={signal:this.#abortController.signal},priceRangeMin=this.querySelector('input[type="range"]:first-child'),priceRangeMax=this.querySelector('input[type="range"]:last-child'),priceInputMin=this.querySelector('input[name="filter.v.price.gte"]'),priceInputMax=this.querySelector('input[name="filter.v.price.lte"]'),minPriceGap=priceRangeMin&&parseInt(priceRangeMin.step)||1,rangeGroup=this.querySelector(".range-group");rangeGroup&&rangeGroup.addEventListener("click",event=>{if(event.target.tagName==="INPUT")return;const rect=rangeGroup.getBoundingClientRect(),x=event.clientX-rect.left,percentage=document.documentElement.getAttribute("dir")==="rtl"?1-Math.max(0,Math.min(1,x/rect.width)):Math.max(0,Math.min(1,x/rect.width));if(!priceRangeMin||!priceRangeMax)return;const min=parseFloat(priceRangeMin.min),range=parseFloat(priceRangeMin.max)-min,clickedValue=Math.round(min+range*percentage),currentMin=parseFloat(priceRangeMin.value),currentMax=parseFloat(priceRangeMax.value);Math.abs(clickedValue-currentMin)<Math.abs(clickedValue-currentMax)?(priceRangeMin.value=clickedValue,priceRangeMin.dispatchEvent(new Event("input",{bubbles:!0})),priceRangeMin.dispatchEvent(new Event("change",{bubbles:!0}))):(priceRangeMax.value=clickedValue,priceRangeMax.dispatchEvent(new Event("input",{bubbles:!0})),priceRangeMax.dispatchEvent(new Event("change",{bubbles:!0})))});const updateRangePosition=(rangeInput,cssProperty)=>{const percentage=parseFloat(rangeInput.value)/parseFloat(rangeInput.max)*100;rangeInput.parentElement.style.setProperty(cssProperty,`${percentage}%`)},clamp=(value,min,max)=>Math.max(min,Math.min(value,max)),validateInput=(input,otherInput,isMin)=>{const value=parseInt(input.value),absoluteMax=parseInt(input.max),otherValue=parseInt(otherInput.value);isNaN(value)||(isMin?value>absoluteMax?input.value=absoluteMax:value>=otherValue&&(input.value=otherValue-1):(value>absoluteMax&&(input.value=absoluteMax),debounce(()=>{value<=otherValue&&(input.value=otherValue+1)},800)))};priceInputMin.addEventListener("focus",()=>priceInputMin.select(),signal),priceInputMax.addEventListener("focus",()=>priceInputMax.select(),signal),priceInputMin.addEventListener("input",()=>validateInput(priceInputMin,priceInputMax,!0),signal),priceInputMax.addEventListener("input",()=>validateInput(priceInputMax,priceInputMin,!1),signal),priceInputMin.addEventListener("change",event=>{event.preventDefault();const value=parseInt(event.target.value),maxValue=parseInt(priceInputMax.value||event.target.max),absoluteMin=parseInt(event.target.min);event.target.value=clamp(value,absoluteMin,maxValue-minPriceGap),priceRangeMin&&(priceRangeMin.value=event.target.value,updateRangePosition(priceRangeMin,"--range-min")),event.target.dispatchEvent(new Event("input",{bubbles:!0}))},signal),priceInputMax.addEventListener("change",event=>{event.preventDefault();const value=parseInt(event.target.value),minValue=parseInt(priceInputMin.value||event.target.min),absoluteMax=parseInt(event.target.max);event.target.value=clamp(value,minValue+minPriceGap,absoluteMax),priceRangeMax&&(priceRangeMax.value=event.target.value,updateRangePosition(priceRangeMax,"--range-max")),event.target.dispatchEvent(new Event("input",{bubbles:!0}))},signal),priceRangeMin?.addEventListener("change",event=>{event.stopPropagation(),priceInputMin.value=event.target.value,priceInputMin.dispatchEvent(new Event("change",{bubbles:!0}))},signal),priceRangeMax?.addEventListener("change",event=>{event.stopPropagation(),priceInputMax.value=event.target.value,priceInputMax.dispatchEvent(new Event("change",{bubbles:!0}))},signal),priceRangeMin?.addEventListener("input",event=>{const value=parseInt(event.target.value),maxValue=parseInt(priceInputMax.value);event.target.value=Math.min(value,maxValue-minPriceGap),updateRangePosition(event.target,"--range-min"),priceInputMin.value=event.target.value},signal),priceRangeMax?.addEventListener("input",event=>{const value=parseInt(event.target.value),minValue=parseInt(priceInputMin.value);event.target.value=Math.max(value,minValue+minPriceGap),updateRangePosition(event.target,"--range-max"),priceInputMax.value=event.target.value},signal)}disconnectedCallback(){this.#abortController&&this.#abortController.abort()}}customElements.define("price-range",PriceRange);class FacetRemove extends HTMLElement{constructor(){super();const facetLink=this.querySelector("a");facetLink.setAttribute("role","button"),facetLink.addEventListener("click",this.closeFilter.bind(this)),facetLink.addEventListener("keyup",event=>{event.preventDefault(),event.code.toUpperCase()==="SPACE"&&this.closeFilter(event)})}closeFilter(event){event.preventDefault(),(this.closest("facet-filters-form")||document.querySelector("facet-filters-form")).onActiveFilterClick(event)}}customElements.define("facet-remove",FacetRemove);
2//# sourceMappingURL=/cdn/shop/t/102/assets/facets.js.map?v=21771618632786570461781768835

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.