const WISHLIST_KEY="esprit_wishlist",MAX_IDS=100,WISHLIST_CHANGE_EVENT="wishlist:change";class WishlistStore{#items=null;#read(){if(Array.isArray(this.#items))return this.#items;let parsed=[];try{const raw=window.localStorage.getItem(WISHLIST_KEY);if(raw){const value=JSON.parse(raw);Array.isArray(value)&&(parsed=value)}}catch{parsed=[]}const safe=[],seen=new Set;for(const item of parsed){const id=typeof item=="object"&&item!==null?String(item.id??"").trim():String(item??"").trim();if(!(!/^\d+$/.test(id)||seen.has(id))&&(seen.add(id),safe.push(this.#normalize({...typeof item=="object"&&item!==null?item:{},id})),safe.length>=100))break}return this.#items=safe,this.#items}#normalize(item){return{id:String(item?.id??"").trim(),handle:String(item?.handle??"").trim(),url:String(item?.url??"").trim(),title:String(item?.title??"").trim(),image:String(item?.image??"").trim(),imageAlt:String(item?.imageAlt??item?.title??"").trim(),price:String(item?.price??"").trim()}}#write(items){this.#items=items.slice(0,100).map(item=>this.#normalize(item));try{window.localStorage.setItem(WISHLIST_KEY,JSON.stringify(this.#items))}catch{}}#emit(productId,action){const ids=this.list();window.dispatchEvent(new CustomEvent(WISHLIST_CHANGE_EVENT,{detail:{productId,action,ids,count:ids.length}}))}add(product){const item=this.#normalize(typeof product=="object"&&product!==null?product:{id:product}),id=item.id;if(!/^\d+$/.test(id))return!1;const items=this.#read();return items.some(entry=>entry.id===id)||items.length>=100?!1:(items.push(item),this.#write(items),this.#emit(id,"add"),!0)}remove(productId){const id=String(productId??"").trim(),items=this.#read(),next=items.filter(item=>item.id!==id);return next.length===items.length?!1:(this.#write(next),this.#emit(id,"remove"),!0)}toggle(product){const id=typeof product=="object"&&product!==null?product.id:product;return this.contains(id)?this.remove(id):this.add(product)}contains(productId){const id=String(productId??"").trim();return this.#read().some(item=>item.id===id)}count(){return this.#read().length}list(){return this.#read().map(item=>item.id)}items(){return this.#read().map(item=>({...item}))}updateMetadata(product){const item=this.#normalize(product);if(!/^\d+$/.test(item.id))return!1;const items=this.#read(),index=items.findIndex(entry=>entry.id===item.id);if(index===-1)return!1;const next={...items[index],...Object.fromEntries(Object.entries(item).filter(([,value])=>value))};return items[index]=next,this.#write(items),!0}}const wishlistStore=new WishlistStore;class WishlistButton extends HTMLElement{connectedCallback(){this.button=this.querySelector("button"),this.productId=String(this.dataset.productId??"").trim(),!(!(this.button instanceof HTMLButtonElement)||!/^\d+$/.test(this.productId))&&(this.addLabel=this.dataset.addLabel||"",this.removeLabel=this.dataset.removeLabel||"",this.defaultLabel=this.dataset.defaultLabel||this.addLabel,this.product=this.getProductMetadata(),this.handleToggle=this.handleToggle.bind(this),this.handleChange=this.handleChange.bind(this),this.button.addEventListener("click",this.handleToggle),window.addEventListener(WISHLIST_CHANGE_EVENT,this.handleChange),wishlistStore.contains(this.productId)&&wishlistStore.updateMetadata(this.product),this.sync())}disconnectedCallback(){this.button?.removeEventListener("click",this.handleToggle),window.removeEventListener(WISHLIST_CHANGE_EVENT,this.handleChange)}handleToggle(event){event.preventDefault(),event.stopPropagation(),wishlistStore.toggle(this.product)}getProductMetadata(){return{id:this.productId,handle:this.dataset.productHandle||"",url:this.dataset.productUrl||"",title:this.dataset.productTitle||"",image:this.dataset.productImage||"",imageAlt:this.dataset.productImageAlt||this.dataset.productTitle||"",price:this.dataset.productPrice||""}}handleChange(){this.sync()}sync(){const active=wishlistStore.contains(this.productId);this.button?.setAttribute("aria-pressed",active?"true":"false"),this.button?.setAttribute("aria-label",active?this.removeLabel:this.addLabel);const label=this.querySelector("[data-wishlist-label]");label&&(label.textContent=active?this.removeLabel:this.defaultLabel),this.classList.toggle("is-active",active)}}class WishlistCount extends HTMLElement{connectedCallback(){this.badge=this.querySelector("[data-wishlist-count]")||this,this.handleChange=this.handleChange.bind(this),window.addEventListener(WISHLIST_CHANGE_EVENT,this.handleChange),this.sync()}disconnectedCallback(){window.removeEventListener(WISHLIST_CHANGE_EVENT,this.handleChange)}handleChange(){this.sync()}sync(){const count=wishlistStore.count();this.badge.textContent=String(count),this.hidden=count===0&&!this.hasAttribute("show-zero")}}class WishlistPage extends HTMLElement{connectedCallback(){this.productSectionId=this.dataset.productSectionId||"gco-wishlist-drawer-card",this.maxProducts=Number(this.dataset.maxProducts||100),this.items=this.querySelector("[data-wishlist-items]"),this.empty=this.querySelector("[data-wishlist-empty]"),this.missing=this.querySelector("[data-wishlist-missing]"),this.skeleton=this.querySelector("[data-wishlist-skeleton]"),this.handleChange=this.handleChange.bind(this),this.isHydrating=!1,this.pendingHydrate=!1,this.abortController=null,this.hydrated=!1,this.cardHtmlCache=new Map,this.hydrateMode=(this.dataset.hydrateMode||"").trim(),this.addLabel=this.dataset.addLabel||"Add to wishlist",this.removeLabel=this.dataset.removeLabel||"Remove from wishlist",this.defaultLabel=this.dataset.defaultLabel||"Wishlist",this.hydrateOnConnect=this.hydrateMode==="immediate"||this.dataset.hydrateOnConnect==="true",window.addEventListener(WISHLIST_CHANGE_EVENT,this.handleChange),this.hydrateOnConnect?(this.observer=null,this.hydrate()):(this.observer=new IntersectionObserver(entries=>{entries.some(entry=>entry.isIntersecting)&&(this.observer?.disconnect(),this.hydrate())},{rootMargin:"250px"}),this.observer.observe(this))}disconnectedCallback(){window.removeEventListener(WISHLIST_CHANGE_EVENT,this.handleChange),this.observer?.disconnect(),this.abortController?.abort()}handleChange(event){if(event?.detail?.action!=="hydrate"){if(this.isHydrating){this.pendingHydrate=!0;return}this.hydrated=!1,this.hydrate()}}async hydrate(){if(this.hydrated&&!this.pendingHydrate)return;if(this.isHydrating){this.pendingHydrate=!0;return}this.abortController?.abort(),this.abortController=new AbortController,this.isHydrating=!0,this.hydrated=!0;const items=wishlistStore.items().slice(0,this.maxProducts);if(items.length===0){this.renderEmpty(),this.finishHydrate();return}this.setAttribute("aria-busy","true"),this.skeleton.hidden=!1,this.empty.hidden=!0,this.missing&&(this.missing.hidden=!0);const renderableItems=items.filter(item=>item.handle);if(renderableItems.length===0){this.renderMissing(),this.finishHydrate();return}const ordered=[],fetchFailures=[],staleIds=[];try{const htmlResults=await Promise.all(renderableItems.map(async item=>{try{const html=await this.fetchCardHtmlByHandle(item.handle);return{item,html}}catch{return fetchFailures.push(item.handle),{item,html:""}}})),liveIds=new Set(wishlistStore.list().slice(0,this.maxProducts));for(const result of htmlResults)liveIds.has(result.item.id)&&(result.html?ordered.push(result.html):fetchFailures.includes(result.item.handle)||staleIds.push(result.item.id))}catch{}for(const id of staleIds)wishlistStore.remove(id);if(ordered.length===0){fetchFailures.length>0?(this.skeleton.hidden=!0,this.items.hidden=!0,this.empty.hidden=!0,this.missing&&(this.missing.hidden=!1)):wishlistStore.count()===0?this.renderEmpty():this.renderMissing(),this.finishHydrate();return}this.items.innerHTML=ordered.join(""),this.items.hidden=!1,this.empty.hidden=!0,this.missing&&(this.missing.hidden=!0),this.skeleton.hidden=!0,this.removeAttribute("aria-busy"),window.dispatchEvent(new CustomEvent(WISHLIST_CHANGE_EVENT,{detail:{action:"hydrate",ids:wishlistStore.list(),count:wishlistStore.count()}})),this.finishHydrate()}async fetchCardHtmlByHandle(handle){const safeHandle=String(handle??"").trim();if(!safeHandle)return"";if(this.cardHtmlCache.has(safeHandle))return this.cardHtmlCache.get(safeHandle)||"";const url=new URL(`/products/${encodeURIComponent(safeHandle)}`,window.location.origin);url.searchParams.set("section_id",this.productSectionId);const response=await fetch(url.toString(),{credentials:"same-origin",signal:this.abortController?.signal});if(!response.ok){if(response.status===404)return this.cardHtmlCache.set(safeHandle,""),"";throw new Error(`Wishlist card request failed with HTTP ${response.status}`)}const text=await response.text(),doc=new DOMParser().parseFromString(text,"text/html"),card=Array.from(doc.querySelectorAll("[data-wishlist-product-handle]")).find(node=>node.getAttribute("data-wishlist-product-handle")===safeHandle);if(!card)throw new Error("Wishlist card markup missing from product response");const html=card.outerHTML;return this.cardHtmlCache.set(safeHandle,html),html}renderEmpty(){this.items.innerHTML="",this.items.hidden=!0,this.skeleton.hidden=!0,this.empty.hidden=!1,this.missing&&(this.missing.hidden=!0),this.removeAttribute("aria-busy")}renderMissing(){this.items.innerHTML="",this.items.hidden=!0,this.skeleton.hidden=!0,this.empty.hidden=!0,this.missing&&(this.missing.hidden=!1),this.removeAttribute("aria-busy")}finishHydrate(){this.isHydrating=!1,this.removeAttribute("aria-busy"),this.pendingHydrate&&(this.pendingHydrate=!1,this.hydrate())}}customElements.define("wishlist-button",WishlistButton),customElements.define("wishlist-count",WishlistCount),customElements.define("wishlist-page",WishlistPage);export{wishlistStore,WISHLIST_CHANGE_EVENT}; //# sourceMappingURL=/cdn/shop/t/35/assets/gco-wishlist.js.map?v=57964507084011399721792180915