PageSourceSearch

https://www.sanvenero.com/wp-content/cache/autoptimize/js/autoptim…a773c50493f24a4da3df8b3ee226e.js?ver=1.4.24

js sanvenero.com collected 2026-10-06 00:35:42 UTC 18,134 bytes, 236 lines download raw bytes

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&&currentY!=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.