1(()=>{const radios=document.querySelectorAll(`[data-radio-uncheckable="true"]`) 2radios.forEach((radio)=>{radio.addEventListener("click",function(event){event.preventDefault() 3if(this.checked){this.checked=false}}) 4const labels=document.querySelectorAll(`label[for="${radio.id}"]`) 5labels.forEach((label)=>{label.addEventListener("click",function(event){event.preventDefault() 6radio.checked=!radio.checked})})})})() 7const firstSectionButtons=document.querySelectorAll("button[data-first-section]") 8firstSectionButtons.forEach((btn)=>{const firstSection=document.querySelector("section.hero + section") 9if(!firstSection){btn.remove() 10return} 11btn.addEventListener("click",()=>{window.scrollTo({top:window.scrollY+firstSection.getBoundingClientRect().top,left:0,behavior:"smooth",})})}) 12const dialogs=document.querySelectorAll("dialog") 13dialogs.forEach((dialog)=>{dialog.addEventListener("click",()=>{dialog.close() 14document.body.classList.remove("overflow-hidden")}) 15const contentWrapper=dialog.querySelector(".dialog-content-wrapper") 16contentWrapper?.addEventListener("click",(e)=>{e.stopPropagation()})});(()=>{const dialog=document.querySelector("#sales-dialog") 17const localStorageID="sales-popup-opened-v2" 18const sessionStorageID="sales-popup-pageviews" 19if(localStorage.getItem(localStorageID))return 20const pageViews=Number(sessionStorage.getItem(sessionStorageID)||0)+1 21sessionStorage.setItem(sessionStorageID,pageViews) 22if(pageViews<2||!dialog)return 23const closeBtn=dialog.querySelector(".close-btn") 24if(closeBtn){closeBtn.addEventListener("click",()=>{dialog.close() 25document.body.classList.remove("overflow-hidden")})} 26document.body.classList.add("overflow-hidden") 27dialog.showModal() 28localStorage.setItem(localStorageID,"true")})() 29const heroFullScreenSwiper=new Swiper(".hero-fullscreen .swiper",{loop:true,grabCursor:true,autoplay:{delay:3500,disableOnInteraction:false,},speed:1500,pagination:{el:".hero-fullscreen .swiper-pagination",clickable:true,},}) 30const heroImagesSwiper=new Swiper(".hero-images .swiper",{enabled:true,loop:true,grabCursor:true,autoplay:{delay:2500,disableOnInteraction:false,speed:1000,},pagination:{el:".hero-images .swiper-pagination",clickable:true,},breakpoints:{768:{enabled:false,},},}) 31const reviewsSwiper=new Swiper("section.reviews .swiper",{slidesPerView:1,grabCursor:true,autoplay:{delay:8500,disableOnInteraction:false,},speed:1000,pagination:{el:"section.reviews .swiper .swiper-pagination",clickable:true,},effect:"fade",}) 32const productGallery=new Swiper("section.single-product .swiper-product-gallery",{slidesPerView:1,spaceBetween:20,pagination:{el:"section.single-product .swiper-product-gallery .swiper-pagination",},}) 33const rowRepeaterImages=new Swiper("section.row.row-repeater-images .swiper",{slidesPerView:1,spaceBetween:0,enabled:true,pagination:{el:"section.row.row-repeater-images .swiper .swiper-pagination",},breakpoints:{768:{enabled:false,},},}) 34const relatedProducts=new Swiper("section.product-related-products .swiper",{slidesPerView:1.25,freeMode:true,spaceBetween:10,breakpoints:{768:{enabled:false,},},}) 35window.addEventListener("load",()=>{let gsapLoaded=false 36while(!gsapLoaded){document.body.classList.add("loading-gsap") 37if(gsap){document.body.classList.remove("loading-gsap") 38gsapLoaded=true}} 39gsap.registerEffect({name:"floatY",effect:(targets,config)=>{if(!config.trigger){console.warn({targets:targets,warning:"Had no trigger"}) 40return} 41return gsap.fromTo(targets,{y:config.startY},{y:config.endY,scrollTrigger:{start:"top-=0% bottom-=20%",end:"center bottom-=5%",trigger:config.trigger,scrub:1,},},)},extendTimeline:true,defaults:{startY:-25,endY:0,},}) 42gsap.registerEffect({name:"scaler",effect:(targets,config)=>{if(!config.trigger){console.warn({targets:targets,warning:"Had no trigger"}) 43return} 44return gsap.fromTo(targets,{scale:config.startScale},{scale:config.endScale,scrollTrigger:{start:"top bottom-=20%",end:"bottom bottom-=20%",trigger:config.trigger,scrub:1,},},)},defaults:{startScale:1.1,endScale:1,},extendTimeline:true,}) 45gsap.registerEffect({name:"fade",effect:(targets,config)=>{if(!config.trigger){console.warn({targets:targets,warning:"Had no trigger"}) 46return} 47gsap.set(targets,{opacity:0,y:config.startY}) 48return gsap.to(targets,{opacity:1,y:0,stagger:config.stagger,scrollTrigger:{start:config.start,trigger:config.trigger,markers:config.markers,},})},defaults:{startY:-20,stagger:0.2,markers:false,start:"top bottom-=20%"},extendTimeline:true,}) 49document.querySelectorAll(".gsap-scaler-trigger").forEach((scalerTrigger)=>{const query=scalerTrigger.dataset?.gsapScalerTriggerSelector?scalerTrigger.dataset?.gsapScalerTriggerSelector:".gsap-scaler" 50const scalers=scalerTrigger.querySelectorAll(query)
51scalers.forEach((scaler)=>{const scalerConfig={trigger:scalerTrigger,} 52if(scaler.dataset.gsapScalerStartScale){scalerConfig.startScale=scaler.dataset.gsapScalerStartScale} 53gsap.effects.scaler(scaler,scalerConfig)})}) 54document.querySelectorAll(".gsap-fader").forEach((fader)=>{let selector=fader.children 55const faderConfig={trigger:fader,} 56if(fader.dataset.gsapFaderSelector){const htmlElements=document.querySelectorAll(fader.dataset.gsapFaderSelector) 57if(htmlElements.length){selector=htmlElements}else{console.warn("The fader.dataset.gsapFaderSelector had no elements to target:",fader)}} 58if(fader.dataset.gsapFaderStartY){faderConfig.startY=fader.dataset.gsapFaderStartY} 59gsap.effects.fade(selector,faderConfig)}) 60document.querySelectorAll(".gsap-float-trigger").forEach((floatTrigger)=>{const query=floatTrigger.dataset.gsapFloatTriggerSelector?floatTrigger.dataset.gsapFloatTriggerSelector:".gsap-float-y" 61const floaters=floatTrigger.querySelectorAll(query) 62floaters.forEach((floater)=>{const floaterConfig={trigger:floatTrigger,} 63if(floater.dataset.gsapFloatStartY){floaterConfig.startY=floater.dataset.gsapFloatStartY} 64gsap.effects.floatY(floater,floaterConfig)})})}) 65window.initMap=async()=>{const iconDims={width:31.4,height:44.35,} 66const mapInitializers=Array.from(document.querySelectorAll(".eg-google-map")).map(async(mapContainer)=>{const{Map,Marker,InfoWindow,Size,LatLngBounds,Animation}=google.maps 67const{defaults,pinIcons}=egGoogleMapsData||{defaults:{},pinIcons:{},} 68const markersData=mapContainer.dataset.markersData?JSON.parse(atob(mapContainer.dataset.markersData)):[] 69console.log("markers",markersData) 70const map=new Map(mapContainer,{center:{lat:defaults?.lat||45.4627042,lng:defaults?.lng||9.0953321,},zoom:defaults?.zoom||12,disableDefaultUI:true,controlSize:24,zoomControl:true,minZoom:4,maxZoom:17,styles:[{featureType:"administrative",elementType:"labels.text.fill",stylers:[{color:"#444444",},],},{featureType:"landscape",elementType:"all",stylers:[{color:"#f2f2f2",},],},{featureType:"landscape.natural.terrain",elementType:"all",stylers:[{color:"#004a42",},],},{featureType:"poi",elementType:"all",stylers:[{visibility:"off",},],},{featureType:"road",elementType:"all",stylers:[{saturation:-100,},{lightness:45,},],},{featureType:"road.highway",elementType:"all",stylers:[{visibility:"simplified",},],},{featureType:"road.arterial",elementType:"labels.icon",stylers:[{visibility:"off",},],},{featureType:"transit",elementType:"all",stylers:[{visibility:"off",},],},{featureType:"water",elementType:"all",stylers:[{color:"#DBD1C0",},{visibility:"on",},],},],}) 71const scaledSize=new Size(iconDims.width,iconDims.height) 72const bounds=new LatLngBounds() 73const markers=markersData.map((markerData)=>{const{position}=markerData 74const marker=new Marker({position,map,title:`${( markerData.title || position.city || "" ).toUpperCase()} (${( position?.state_short || "" ).toUpperCase()})`,icon:{url:pinIcons.default,scaledSize,},}) 75if(markerData.infoWindow){marker.infoWindow=new InfoWindow({content:markerData.infoWindow,}) 76marker.addListener("click",()=>{markers.forEach((lMarker)=>{if(lMarker===marker){lMarker.infoWindow.open(map,lMarker) 77lMarker.setIcon({url:pinIcons.active,scaledSize,})}else{lMarker.infoWindow?.close() 78lMarker.setIcon({url:pinIcons.default,scaledSize,})}})}) 79marker.infoWindow.addListener("closeclick",()=>{marker.setIcon({url:pinIcons.default,scaledSize,}) 80marker.setAnimation(null)}) 81document.querySelectorAll(`[data-id="${markerData.id}"]`).forEach((link)=>{link.addEventListener("click",(e)=>{e.preventDefault() 82markers.forEach((lMarker)=>{if(lMarker===marker){lMarker.setAnimation(Animation.BOUNCE) 83setTimeout(()=>lMarker.setAnimation(null),2000) 84lMarker.infoWindow.open(map,lMarker) 85lMarker.setIcon({url:pinIcons.active,scaledSize,})}else{lMarker.setAnimation(null) 86lMarker.infoWindow?.close() 87lMarker.setIcon({url:pinIcons.default,scaledSize,})}}) 88smoothScrollTo(mapContainer,600,parseInt(document.documentElement.style.getPropertyValue("--header-height")||200))})})} 89bounds.extend(marker.getPosition()) 90marker.brand=markerData.brand 91return marker}) 92map.fitBounds(bounds,85)})
93return await Promise.all(mapInitializers)} 94class AjaxRequest{constructor(config){this.cache=new Map() 95this.config=config 96this.filtersSelector=config.filters 97this.formData=config.formData 98this.wrapper=document.querySelector(config.wrapper) 99this.pagination=document.querySelector(config.pagination) 100this.action=config.action 101this.urlParams=new URLSearchParams(window.location.search) 102if(!this.pagination||!this.wrapper||!this.action)return 103this.addEventListeners()} 104addEventListeners(firstTime=true){const pages=this.pagination.querySelectorAll("button") 105pages.forEach((button)=>{const page=button.dataset.page 106button.addEventListener("click",this.handlePageClick.bind(this,page))}) 107if(!this.filtersSelector||!firstTime)return 108this.filters=document.querySelectorAll(this.filtersSelector) 109this.filters.forEach((filter)=>{const urlFilterValue=this.urlParams.get(filter.dataset.filter) 110if(urlFilterValue){filter.value=urlFilterValue 111console.log("done")} 112filter.addEventListener("change",this.handleFilterChange.bind(this))})} 113handleFilterChange(){this.updateURL() 114this.handlePageClick(1)} 115updateContent({wrapper:wrapperHtml,pagination:paginationHtml,page}){this.wrapper.innerHTML=wrapperHtml 116this.pagination.innerHTML=paginationHtml 117this.addEventListeners(false) 118this.wrapper.classList.remove("loading") 119this.updateURL(page)} 120updateView(params){if(document.startViewTransition){document.startViewTransition(()=>{this.updateContent(params)}) 121return} 122this.updateContent(params)} 123updateURL(page=null){const urlParams=new URLSearchParams() 124this.filters.forEach((filter)=>{const filterID=filter.dataset.filter 125if(filterID&&filter.value){urlParams.set(filterID,filter.value)}}) 126if(page){urlParams.set("page",page)} 127if(this.wrapper.dataset.categorySlug){urlParams.set("product_cat",this.wrapper.dataset.categorySlug)} 128window.history.pushState({},"",`${window.location.pathname}?${urlParams.toString()}`)} 129async handlePageClick(page){window.scrollTo({top:window.scrollY+this.wrapper.getBoundingClientRect().top-250,behavior:"smooth",}) 130const cached=this.cache.get(this.getUniqueKey(page)) 131if(cached){console.log("using cache") 132this.updateView({wrapper:cached.wrapper,pagination:cached.pagination,page:page}) 133return} 134const formData=new FormData() 135formData.append("action",this.action) 136formData.append("page",page) 137if(this.formData){Object.entries(this.formData).forEach(([key,value])=>{formData.append(key,value)})} 138if(this.filtersSelector){const filtersObj={} 139this.filters.forEach((filter)=>{const filterName=filter.dataset.filter 140console.log(filterName) 141if(filterName){filtersObj[filterName]=filter.value}}) 142if(this.wrapper.dataset.categorySlug){filtersObj["product_cat"]=this.wrapper.dataset.categorySlug} 143formData.append("filters",JSON.stringify(filtersObj))} 144try{this.wrapper.classList.add("loading") 145console.log("fetching") 146const res=await fetch("/wp-admin/admin-ajax.php",{method:"POST",body:formData}) 147const data=await res.json() 148if(!data.success)throw new Error("News Ajax didn't succeed") 149console.log(data) 150const wrapperHtml=data.data.html 151const paginationHtml=data.data.pagination 152this.updateView({wrapper:wrapperHtml,pagination:paginationHtml,page:page}) 153this.cache.set(this.getUniqueKey(page),{wrapper:wrapperHtml,pagination:paginationHtml,page:page})}catch(e){this.wrapper.classList.remove("loading") 154console.log(e)}} 155getUniqueKey(page){const keys=[page] 156if(this.filters){this.filters.forEach((filter)=>{keys.push(filter.value)})} 157return keys.join("-")}} 158new AjaxRequest({pagination:".news-cards-wrapper .pagination",wrapper:".news-cards-wrapper .news-wrapper",action:"filter_news",scrollTo:false,}) 159new AjaxRequest({pagination:".blog-archive .pagination",wrapper:".blog-archive .articles-wrapper",action:"filter_blog",scrollTo:false,});(()=>{const mostRecent=document.querySelector(".blog-archive .most-recent") 160if(!mostRecent)return 161document.querySelector(".blog-archive .pagination")?.addEventListener("click",(e)=>{const btn=e.target.closest("button[data-page]") 162if(!btn)return 163const page=parseInt(btn.dataset.page) 164mostRecent.style.display=page===1?"":"none"})})();new AjaxRequest({pagination:".product-lister .pagination",wrapper:".product-lister .products-wrapper",action:"filter_products",scrollTo:false,formData:{only_content:true,},filters:".product-lister .filters .filters-wrapper select",});(()=>{const productChips=document.querySelectorAll("section.single-product .columns .product-info .infos .chips-content input") 165const labels=Array.from(productChips).map((chip)=>{return document.querySelector(`label[for="${chip.id}"]`)}).filter((e)=>
165e) 166productChips.forEach((chip)=>{chip.addEventListener("change",()=>{labels.forEach((label)=>{if(label.getAttribute("for")==chip.id){label.classList.add("active")}else{label.classList.remove("active")}})})})})() 167function revealingHeader(options={}){const config={header:document.querySelector("header"),scrollDownTreshold:250,scrollUpTreshold:250,hideTreshold:document.querySelector("header")?.getBoundingClientRect().height/2,floatingClass:"floating",floatingClassActive:"floating-active",debug:false,...options,} 168const header=config.header 169if(!header){console.error("The header was not detected") 170return} 171const scrollUpThreshold=config.scrollUpTreshold 172const scrollDownThreshold=config.scrollDownTreshold 173const hideThreshold=config.hideTreshold 174const floatingClass=config.floatingClass 175const floatingClassActive=config.floatingClassActive 176let previousY=window.scrollY 177let changedDirectionYUp=1 178let changedDirectionYDown=1 179let scrolledUp=false 180let isScrollingUp=false 181if(window.scrollY<hideThreshold){header.classList.remove(floatingClass)}else{header.classList.add(floatingClass) 182if(config.debug)console.log("Adding class floating")} 183window.addEventListener("scroll",()=>{const currentY=window.scrollY 184if(previousY>=currentY){isScrollingUp=true 185changedDirectionYDown=currentY}else{isScrollingUp=false 186scrolledUp=false 187changedDirectionYUp=currentY 188if(currentY-changedDirectionYDown>=scrollDownThreshold){header.classList.remove(floatingClassActive)}} 189if(isScrollingUp&&!scrolledUp){changedDirectionYUp=currentY 190scrolledUp=true} 191if(isScrollingUp){if(changedDirectionYUp-currentY>=scrollUpThreshold&¤tY!=0){header.classList.add(floatingClassActive)}else{header.classList.remove(floatingClassActive) 192if(config.debug)console.log("Not has class")}} 193previousY=currentY 194if(currentY<hideThreshold){header.classList.remove(floatingClass) 195return} 196header.classList.add(floatingClass) 197if(config.debug)console.log("Adding class floating")})} 198revealingHeader();(()=>{const menuToggler=document.querySelector(".menu-toggler") 199if(!menuToggler)return 200menuToggler.addEventListener("click",()=>{document.body.classList.toggle("mobile-open")})})() 201jQuery(function($){$("body.woocommerce-account.loggedin .woocommerce").on("click",".account-title",function(){$("body.woocommerce-account.loggedin .woocommerce .account-title").toggleClass("active")}) 202if($(".woocommerce-checkout-review-order-table").length){$(".woocommerce-checkout-review-order-table").clone().appendTo($(".checkout-your-order"))} 203$("body").on("click",".login-form .register-now",function(){$(".woocommerce-account .login-form").hide().animate({opacity:0}
203,500) 204$(".woocommerce-account .register-form").show().animate({opacity:1},500)}) 205$("body").on("click",".register-form .login-now",function(){$(".woocommerce-account .register-form").hide().animate({opacity:0},500) 206$(".woocommerce-account .login-form").show().animate({opacity:1},500)})});(()=>{const atelierBookingForm=document.querySelector(".atelier-booking-form .form-types") 207const iframe=document.querySelector(".atelier-booking-form iframe") 208const back=document.querySelector(".atelier-booking-form .back") 209if(!atelierBookingForm||!iframe)return 210atelierBookingForm.querySelectorAll(".form-type").forEach((formType)=>{const button=formType.querySelector("button") 211if(!button)return 212button.addEventListener("click",()=>{iframe.src=formType.dataset.url+"?embed=true" 213atelierBookingForm.classList.add("display-none") 214iframe.classList.remove("display-none") 215back.classList.remove("display-none")}) 216back.addEventListener("click",()=>{atelierBookingForm.classList.remove("display-none") 217iframe.classList.add("display-none") 218back.classList.add("display-none")})})})();(()=>{document.querySelectorAll('.accordion').forEach(accordion=>{const lines=accordion.querySelectorAll('.list-line') 219lines.forEach(line=>{line.toggleOpen=(open=true)=>line.classList.toggle('open',open) 220const contentAbove=line.querySelector('.content-above') 221const contentBelow=line.querySelector('.content-below') 222const triggerBtn=line.querySelector('.trigger-btn') 223if(!contentBelow){triggerBtn?.remove() 224return} 225function listenerFn(e){const wasOpen=line.classList.contains('open') 226line.toggleOpen(!wasOpen) 227if(!wasOpen)lines.forEach(l=>l!==line&&l.toggleOpen(false))} 228contentAbove?.addEventListener('click',listenerFn) 229contentAbove?.style.setProperty("cursor","pointer")})})})();(()=>{const openers=document.querySelectorAll(".ai-chat-opener") 230openers.forEach((opener)=>{opener.addEventListener("click",(e)=>{e.preventDefault() 231e.stopPropagation() 232const host=document.querySelector("#zipchat-shadow-host") 233if(!host||!host.shadowRoot)return 234const chatBtn=host.shadowRoot.querySelector("#widget-chat-button") 235if(!chatBtn)return 236setTimeout(()=>chatBtn.click(),0)})})})()
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.