1customElements.get("product-form")||customElements.define("product-form",class extends HTMLElement{constructor(){super(),this.form=this.querySelector("form"),this.variantIdInput.disabled=!1,this.form.addEventListener("submit",this.onSubmitHandler.bind(this)),this.cart=document.querySelector("cart-notification")||document.querySelector("cart-drawer"),this.submitButton=this.querySelector('[type="submit"]'),this.submitButtonText=this.submitButton?.querySelector("span"),this.submitButton&&document.querySelector("cart-drawer")&&this.submitButton.setAttribute("aria-haspopup","dialog"),this.hideErrors=this.dataset.hideErrors==="true"}connectedCallback(){this.querySelectorAll(".change--selectProduct").forEach(select=>{select.addEventListener("change",()=>this.onOptionChange())})}onOptionChange(){const wrapper=this.closest(".product-wrapper__inner");wrapper?.classList.add("loading");const selectedOptions=Array.from(this.querySelectorAll(".change--selectProduct")).sort((a,b)=>a.dataset.index.localeCompare(b.dataset.index)).map(select=>select.value.trim()),sectionId=this.dataset.section||this.closest("[data-section]").dataset.section,matchedVariant=JSON.parse(this.querySelector("#product-json").textContent).find(v=>selectedOptions.every((val,index)=>v[`option${index+1}`]?.toLowerCase()===val.toLowerCase()));if(!matchedVariant){wrapper?.classList.remove("loading");return}const productUrl=`${window.location.pathname}?variant=${matchedVariant.id}`,hiddenSelect=this.querySelector('select[name="id"]');hiddenSelect&&Array.from(hiddenSelect.options).forEach(option=>{option.selected=option.value===String(matchedVariant.id)}),fetch(`${productUrl}§ion_id=${sectionId}`).then(res=>res.text()).then(html=>{const newContent=new DOMParser().parseFromString(html,"text/html").querySelector("#product-id-section"),parent=this.closest(".product__info-container");if(!newContent)return;parent.replaceWith(newContent),this.changeURL(productUrl.split("?")[0],matchedVariant.id),this.scrollToVariantImage(matchedVariant.id);const optionValues=matchedVariant.options?.filter(Boolean)??[];document.dispatchEvent(new CustomEvent("variant:changed",{detail:{variantId:matchedVariant.id,optionValues}}))}).catch(e=>console.error(e)).finally(()=>{wrapper?.classList.remove("loading")})}changeURL(url,variantId){const newUrl=`${url}${variantId?`?variant=${variantId}`:""}`;window.history.replaceState({},"",newUrl)}async onSubmitHandler(evt){if(evt.preventDefault(),this.submitButton.getAttribute("aria-disabled")==="true")return;this.handleErrorMessage(),this.submitButton.setAttribute("aria-disabled",!0),this.submitButton.classList.add("loading"),this.querySelector(".loading__spinner").classList.remove("hidden");const config=fetchConfig("javascript");config.headers["X-Requested-With"]="XMLHttpRequest",delete config.headers["Content-Type"];const formData=new FormData(this.form);this.cart&&(formData.append("sections",this.cart.getSectionsToRender().map(section=>section.id)),formData.append("sections_url",window.location.pathname),this.cart.setActiveElement(document.activeElement)),config.body=formData;const discountCode=this.dataset.discountCode||this.getAttribute("data-discount-code")||"";if(discountCode)try{const discountResponse=await fetch("/cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({discount:discountCode})});console.log("Discount response",await discountResponse.json())}catch(e){console.error("Discount error",e)}await fetch(`${routes.cart_add_url}`,config).then(response=>response.json()).then(response=>{if(response.status){publish(PUB_SUB_EVENTS.cartError,{source:"product-form",productVariantId:formData.get("id"),errors:response.errors||response.description,message:response.message}),this.handleErrorMessage(response.description);const soldOutMessage=this.submitButton.querySelector(".sold-out-message");if(!soldOutMessage)return;this.submitButton.setAttribute("aria-disabled",!0),this.submitButtonText.classList.add("hidden"),soldOutMessage.classList.remove("hidden"),this.error=!0;return}else if(!this.cart){window.location=window.routes.cart_url;return}window.CartTimer!=null&&window.CartTimer.set();const startMarker=CartPerformance.createStartingMarker("add:wait-for-subscribers");this.error||publish(PUB_SUB_EVENTS.cartUpdate,{source:"product-form",productVariantId:formData.get("id"),cartData:response}).then(()=>{CartPerformance.measureFromMarker("add:wait-for-subscribers",startMarker)}),this.error=!1;const quickAddModal=this.closest("quick-add-modal");quickAddModal?(document.body.addEventListener("modalClosed",()=>{setTimeout(()=>{CartPerformance.measure("add:paint-updated-sections",()=>{this.cart.renderContents(response)})})},{once:!0}),quickAddModal.hide(!0)):CartPerformance.measure("add:paint-updated-sections",()=>{this.cart.renderContents(response)})}).catch(e=>{console.error(e)}).finally(()=>{this.submitButton.classList.remove("loading"),this.cart&&this.cart.classList.contains("is-empty")&&this.cart.classList.remove("is-empty"),this.error||this.submitButton.removeAttribute("aria-disabled"),this.querySelector(".loading__spinner").classList.add("hidden"),CartPerformance.measureFromEvent("add:user-action",evt)})}scrollToVariantImage(variantId){const swiperEl=document.querySelector("product-template-swiper");if(!swiperEl||!swiperEl.mainSlider)return;const slides=swiperEl.querySelectorAll(".swiper-main .swiper-slide");let targetIndex=0;
1slides.forEach((slide,index)=>{const variantIds=slide.dataset.variantId?.split(",").map(id=>id.trim());variantIds&&variantIds.includes(String(variantId))&&(targetIndex=index)}),swiperEl.mainSlider.slideTo(targetIndex)}handleErrorMessage(errorMessage=!1){this.hideErrors||(this.errorMessageWrapper=this.errorMessageWrapper||this.querySelector(".product-form__error-message-wrapper"),this.errorMessageWrapper&&(this.errorMessage=this.errorMessage||this.errorMessageWrapper.querySelector(".product-form__error-message"),this.errorMessageWrapper.toggleAttribute("hidden",!errorMessage),errorMessage&&(this.errorMessage.textContent=errorMessage)))}toggleSubmitButton(disable=!0,text){disable?(this.submitButton.setAttribute("disabled","disabled"),text&&(this.submitButtonText.textContent=text)):(this.submitButton.removeAttribute("disabled"),this.submitButtonText.textContent=window.variantStrings.addToCart)}get variantIdInput(){return this.form.querySelector("[name=id]")}}); 2//# sourceMappingURL=/cdn/shop/t/17/assets/product-form.js.map?v=120400897235240484311789987090
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.