1customElements.get("product-form")||customElements.define("product-form",class extends HTMLElement{constructor(){super(),this.closest(".popup-wrapper__quick-view")&&window.innerWidth<769&&!document.body.classList.contains("hidden")&&document.body.classList.add("hidden"),this.form=this.querySelector("form"),this.cart=document.querySelector("cart-drawer"),this.submitButton=this.querySelector('[type="submit"]'),this.hideErrors=this.dataset.hideErrors==="true",this.form.querySelector("[name=id]").disabled=!1,this.form.addEventListener("submit",this.onSubmitHandler.bind(this))}async onSubmitHandler(evt){if(evt.preventDefault(),document.body.querySelector("body > .overlay").classList.add("open"),this.submitButton.getAttribute("aria-disabled")==="true")return;this.submitButton.setAttribute("aria-disabled",!0),this.submitButton.classList.add("loading"),this.querySelector(".loading-overlay__spinner")?.classList.remove("hidden");const sold_out=this.submitButton.getAttribute("data-sold-out");if(this.submitButton.getAttribute("data-sold-out")==="true"){const q_=this.submitButton.getAttribute("data-type"),color_=this.submitButton.getAttribute("data-color")?`&filter.v.option.color=${encodeURIComponent(this.submitButton.getAttribute("data-color"))}`:"",size_=this.submitButton.getAttribute("data-size")?`&filter.v.option.size=${encodeURIComponent(this.submitButton.getAttribute("data-size"))}`:"",similar_url=`${window.routes.search_url}?q=*&filter.p.product_type=${encodeURIComponent(q_)}${color_}${size_}&view=similar-popup`;fetch(similar_url).then(response=>response.text()).then(responseText=>{setTimeout(()=>{document.querySelector(".similar-view__content").innerHTML="";const drawerContent=document.querySelector(".quick-view__content");drawerContent.innerHTML="",drawerContent.classList.remove("hide-cover"),document.body.querySelector("body > .quick-view-overlay")?.classList.remove("open"),document.querySelector("body").classList.remove("quick-view-open","quick-view-load"),document.dispatchEvent(new CustomEvent("body:visible")),document.dispatchEvent(new CustomEvent("quickview:close")),document.querySelector("quick-view-drawer details").removeAttribute("open")},1),setTimeout(()=>{const productsElement=new DOMParser().parseFromString(responseText,"text/html").getElementById("similar-view-root");document.querySelector(".similar-view__content").innerHTML=productsElement.innerHTML,document.querySelector("body").classList.add("hidden","similar-view-open");let drawer=document.querySelector("similar-view-drawer details");drawer&&!drawer.hasAttribute("open")&&drawer.querySelector("summary").click()},5),setTimeout(()=>{document.querySelector("similar-view .button-close").addEventListener("click",event=>{document.querySelector(".similar-view__content").innerHTML="",document.querySelector("body").classList.remove("hidden","similar-view-open"),document.querySelector("similar-view-drawer details").removeAttribute("open"),document.body.querySelector("body > .overlay").classList.remove("open")})},10)}).catch(e=>{console.error(e)}).finally(()=>{this.submitButton.classList.remove("loading"),this.error||this.submitButton.removeAttribute("aria-disabled"),this.querySelector(".loading-overlay__spinner").classList.add("hidden")})}else{if(this.handleErrorMessage(),!this.validateCustomProperties())return this.handleErrorMessage(`${window.variantStrings.customPropertyError}`,!0),!1;const config=fetchConfig("javascript");config.headers["X-Requested-With"]="XMLHttpRequest",delete config.headers["Content-Type"];const formData=new FormData(this.form);formData.append("sections_url",window.location.pathname);const cartDrawer=document.querySelector("cart-drawer"),cartNotification=document.querySelector("cart-notification"),drawerSections=cartDrawer?.getSectionsToRender?.()||[],notificationSections=cartNotification?.getSectionsToRender?.()||[],allSections=[...drawerSections,...notificationSections],uniqueSectionIds=[...new Set(allSections.map(s=>s.id))];if(formData.append("sections",uniqueSectionIds.join(",")),config.body=formData,document.dispatchEvent(new CustomEvent("cart:add:start")),window.template==="product"){const is_prestige_id=document.getElementById("is-prestige-id")?.value||null,is_prestige=document.getElementById("is-prestige")?.checked,prestige_id=document.getElementById("prestige-id")?.value,config_prestige={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({id:prestige_id,quantity:is_prestige?1:0})};try{is_prestige?is_prestige_id!=prestige_id&&await fetch(`${routes.cart_add_url}`,config_prestige):is_prestige_id==prestige_id&&await fetch(`${routes.cart_
1change_url}`,config_prestige)}catch(error){console.error("Cart add error:",error)}}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.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.submitButton.querySelector("span").classList.add("hidden"),soldOutMessage.classList.remove("hidden"),this.error=!0;return}else if(!this.cart){window.location=window.routes.cart_url;return}this.error||publish(PUB_SUB_EVENTS.cartUpdate,{source:"product-form",productVariantId:formData.get("id")}),this.error=!1;const quickAddModal=this.closest("quick-add-modal");quickAddModal?(document.body.addEventListener("modalClosed",()=>{setTimeout(()=>{this.cart.renderContents(response)})},{once:!0}),quickAddModal.hide(!0)):this.cart.renderContents(response),this.querySelector("recipient-form")&&(this.querySelector("recipient-form").querySelector(".is-open").classList.remove("is-open"),this.querySelector("recipient-form").querySelector(".accordion__panel").style.maxHeight=0),document.dispatchEvent(new CustomEvent("cart:add:success"))}).catch(e=>{console.error(e),document.dispatchEvent(new CustomEvent("cart:add:error"))}).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-overlay__spinner").classList.add("hidden")})}}showSoldOutState(){const soldOutMessage=this.submitButton.querySelector(".sold-out-message");soldOutMessage&&(this.submitButton.setAttribute("aria-disabled",!0),this.submitButton.querySelector("span")?.classList.add("hidden"),soldOutMessage.classList.remove("hidden"))}validateCustomProperties(){let checker=arr=>arr.every(v=>v===!0);const productSection=this.form.closest(".main-product"),customInputs=productSection?Array.from(productSection.querySelectorAll(".custom-options [aria-required]")):[];if(customInputs.length===0)return!0;const validationArray=customInputs.map(customInput=>{if(customInput.required)return validateFormInput(customInput)});return checker(validationArray)}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)))}}),customElements.get("custom-options")||customElements.define("custom-options",class extends HTMLElement{constructor(){super(),this.requiredInputs=this.querySelectorAll("[aria-required]"),this.requiredInputs.length>0&&Array.from(this.requiredInputs).forEach(requiredInput=>this.validateError(requiredInput)),this.output=this.querySelector("[data-selected-custom-option]"),this.output&&(this.inputs=Array.from(this.querySelectorAll('input[type="radio"], input[type="checkbox"], select')),this.handleChange=this.handleChange.bind(this))}connectedCallback(){this.inputs&&this.inputs.length>0&&this.addEventListener("change",this.handleChange),this.optionType=this.dataset.type,this.optionType&&this.optionType==="color-picker"&&this.setColorPicker(),this.optionType&&this.optionType==="image-upload"&&this.setDragAndDrop()}disconnectedCallback(){this.inputs&&this.inputs.length>0&&this.removeEventListener("change",this.handleChange)}handleChange(){this.inputs&&this.inputs.length>0&&this.updateOutput()}setColorPicker(){this.querySelector('input[type="color"]').addEventListener("change",evt=>{const currentInput=evt.currentTarget,selectedColorStatus=this.querySelector(".selected-color-label"),customField=this.querySelector(".color__swatch--color");selectedColorStatus&&(selectedColorStatus.textContent=currentInput.value),customField&&(customField.style.setProperty("--swatch-background",currentInput.value),customField.style.setProperty("--swatch-background-color",currentInput.value))})}validateError(requiredInput){const productSection=requiredInput.closest(".main-product");let eventName="keyup";(requiredInput.tagName==="SELECT"||requiredInput.type==="checkbox"||requiredInput.type==="file")&&(eventName="change"),this.productForm=productSection.querySelector("product-form"),this.dynamicCheckoutWrap=productSection.querySelector(".shopify-payment-button"),requiredInput.addEventListener(eventName,event=>{let currentInput=requiredInput;if((currentInput.value==""||currentInput.type=="checkbox"&&!currentInput.checked)&&this.dynamicCheckoutWrap.classList.add("shopify-payment-button--disable"),currentInput.classList.contains("invalid")){if(currentInput.classList.contains("checkbox-group__input")||currentInput.type=="checkbox"&&!currentInput.checked)return;removeErrorStyle(currentInput),productSection.querySelectorAll(".invali
1d").length===0&&(this.dynamicCheckoutWrap.classList.remove("shopify-payment-button--disable"),this.productForm.handleErrorMessage())}})}updateOutput(){const selected=[];this.inputs.forEach(input=>{if(input.tagName==="SELECT"){const selectedOption=input.options[input.selectedIndex];selectedOption&&selectedOption.value&&selected.push(selectedOption.textContent.trim())}else(input.type==="checkbox"&&input.checked||input.type==="radio"&&input.checked)&&selected.push(input.value.trim())}),this.output.textContent=selected.length>0?"\u2014 "+selected.join(", "):""}formatFileType(file){const type=file.type,splitType=type.split("/"),subtype=splitType[1];let formattedType=subtype,handleSubtype=subtype.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-$/,"").replace(/^-/,"");const applicationType={pdf:subtype.toUpperCase(),"vnd-ms-excel":"Excel","vnd-openxmlformats-officedocument-spreadsheetml-sheet":"Excel","vnd-ms-powerpoint":"PowerPoint","vnd-openxmlformats-officedocument-presentationml-presentation":"PowerPoint","x-msvideo":"AVI",html:"HTML",msword:"Word","vnd-openxmlformats-officedocument-wordprocessingml-document":"Word",csv:"CSV",mpeg:"MP3 Audio",webm:"WEBM Audio","mp4-video":"MP4 Video","mpeg-video":"MPEG Video","webm-video":"WEBM Video","vnd-rar":"RAR archive",rtf:"RTF",plain:"Text",wav:"WAV","vnd-adobe-photoshop":"Adobe Photoshop",postscript:"Adobe Illustrator"};if(type.startsWith("image/"))applicationType[handleSubtype]?formattedType=applicationType[handleSubtype]:(formattedType=splitType[1].toUpperCase(),formattedType=`${formattedType} Image`);else if(type.startsWith("video/")){const handleVideoSubtype=`${handleSubtype}-video`;applicationType[handleVideoSubtype]&&(formattedType=applicationType[handleVideoSubtype])}else applicationType[handleSubtype]&&(formattedType=applicationType[handleSubtype]);return formattedType}calculateSize(file){let numberOfBytes=file.size;if(numberOfBytes===0)return 0;const units=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],exponent=Math.min(Math.floor(Math.log(numberOfBytes)/Math.log(1024)),units.length-1),approx=numberOfBytes/1024**exponent;return exponent===0?`${numberOfBytes} bytes`:`${approx.toFixed(2)} ${units[exponent]}`}getIconName(file){const fileName=file.name,type=file.type;let iconName="";return/\.(xls?x|csv)$/i.test(fileName)&&(iconName="icon--file"),/\.(doc?x)$/i.test(fileName)&&(iconName="icon--file"),/\.(ppt?x)$/i.test(fileName)&&(iconName="icon--file"),/\.(txt)$/i.test(fileName)&&(iconName="icon--file"),/\.(pdf)$/i.test(fileName)&&(iconName="icon--file"),type.startsWith("video/")&&(iconName="icon--video"),type.startsWith("audio/")&&(iconName="icon--audio"),iconName}preview(dropZoneWrapElm,file){const reader=new FileReader;reader.addEventListener("load",()=>{const inputElm=dropZoneWrapElm.querySelector(".drop-zone__input");let thumbnailElement=dropZoneWrapElm.querySelector(".drop-zone__thumb"),preview=dropZoneWrapElm.querySelector(".dd-thumbn
1ail"),fileInfo=dropZoneWrapElm.querySelector(".dd-file-info");if(!thumbnailElement){thumbnailElement=document.createElement("div"),thumbnailElement.classList.add("drop-zone__thumb"),preview=document.createElement("div"),fileInfo=document.createElement("div"),fileInfo.setAttribute("class","dd-file-info"),preview.setAttribute("class","dd-thumbnail");const fileInfoText=document.createElement("div");fileInfoText.setAttribute("class","dd-file-info__text flex--column");const spanTitle=document.createElement("span"),spanFileType2=document.createElement("span");spanTitle.setAttribute("class","dd-file-info__title"),spanFileType2.setAttribute("class","dd-file-info__type caption-font");const btnRemove=document.createElement("button"),btnText=this.querySelector(".file-upload__remove").innerHTML;btnRemove.setAttribute("class","button link-button button--secondary"),btnRemove.innerHTML=btnText,btnRemove.addEventListener("click",evt=>{evt.preventDefault(),inputElm.value="",dropZoneWrapElm.classList.remove("drop-zone-wrap--inactive"),thumbnailElement.parentNode.removeChild(thumbnailElement)},!1),fileInfoText.appendChild(spanTitle),fileInfoText.appendChild(spanFileType2),fileInfo.appendChild(fileInfoText),fileInfo.appendChild(btnRemove),thumbnailElement.appendChild(fileInfo),thumbnailElement.appendChild(preview),dropZoneWrapElm.classList.add("drop-zone-wrap--inactive"),dropZoneWrapElm.appendChild(thumbnailElement)}const spanFileName=fileInfo.querySelector(".dd-file-info__title"),fileName=file.name.substring(0,file.name.lastIndexOf("."))||file.name;spanFileName.textContent=fileName;const spanFileType=fileInfo.querySelector(".dd-file-info__type");if(spanFileType.textContent=`${this.calculateSize(file)}, ${this.formatFileType(file)}`,preview.innerHTML="",preview.removeAttribute("style"),/\.(jpe?g|png|gif|webp)$/i.test(file.name))preview.setAttribute("style",`background-image:url("${reader.result}"); width: 60px;`);else{const icon=this.querySelector(`.${this.getIconName(file)}`);preview.appendChild(icon)}thumbnailElement.setAttribute("data-ts-file",file.name)},!1),reader.readAsDataURL(file)}setDragAndDrop(){const inputElement=this.querySelector(".drop-zone__input"),dropZoneWrapElm=this.querySelector(".drop-zone-wrap"),dropZoneElement=this.querySelector(".drop-zone");inputElement.addEventListener("change",e=>{if(inputElement.files.length){const dropZone=this.querySelector(".drop-zone-wrap"),errorMessage=dropZone.querySelector(".input-error-message"),file=inputElement.files[0],filesize=(file.size/1024/1024).toFixed(4);if(dropZone.classList.remove("drop-zone-wrap--error"),errorMessage&&errorMessage.classList.add("visually-hidden"),filesize>5){inputElement.value="",dropZone.classList.add("drop-zone-wrap--error"),errorMessage&&(errorMessage.classList.remove("visually-hidden"),errorMessage.textContent=window.variantStrings.fileSizeError);return}this.preview(dropZoneWrapElm,file)}}),dropZoneElement.addEventListener("dragover",e=>{e.preventDefault(),dropZoneElement.classList.add("drop-zone--over")}),["dragleave","dragend"].forEach(type=>{dropZoneElement.addEventListener(type,e=>{dropZoneElement.classList.remove("drop-zone--over")})}),dropZoneElement.addEventListener("drop",e=>{e.preventDefault(),e.dataTransfer.files.length&&(inputElement.files=e.dataTransfer.files,this.preview(dropZoneWrapElm,e.dataTransfer.files[0])),dropZoneElement.classList.remove("drop-zone--over")})}}),customElements.get("product-checkbox-group")||customElements.define("product-checkbox-group",class extends HTMLElement{constructor(){super();const productSection=this.closest(".main-product");this.productForm=productSection.querySelector("product-form"),this.dynamicCheckoutWrap=productSection.querySelector(".shopify-payment-button");const errorMessage=this.parentElement.querySelector(".input-error-message"),inputElms=this.querySelectorAll("input[type=checkbox]"),mainInputELm=this.querySelector("input[type=hidden]"),minLimit=this.dataset.min?parseInt(this.dataset.min):null,maxLimit=this.dataset.max?parseInt(this.dataset.max):null;inputElms.forEach(inputElm=>{inputElm.addEventListener("change",evt=>{const checkedInputs=this.querySelectorAll("input[type=checkbox]:checked");let checkedString="";if(minLimit&&checkedInputs.length>
1=minLimit){const inputError=this.querySelector(".invalid");errorMessage&&errorMessage.classList.add("visually-hidden"),inputError&&inputError.classList.remove("invalid"),productSection.querySelectorAll(".invalid").length===0&&this.productForm.handleErrorMessage();const requiredInputs=Array.from(productSection.querySelectorAll("input[aria-required]:not(.checkbox-group__input)"));let checker=arr=>arr.every(v=>v===!0);const checkValues=requiredInputs.map(requiredInput=>!(requiredInput.value==""||requiredInput.type=="checkbox"&&!requiredInput.checked));checker(checkValues)&&this.dynamicCheckoutWrap?this.dynamicCheckoutWrap.classList.remove("shopify-payment-button--disable"):this.dynamicCheckoutWrap&&this.dynamicCheckoutWrap.classList.add("shopify-payment-button--disable")}else minLimit&&checkedInputs.length<minLimit&&this.dynamicCheckoutWrap&&this.dynamicCheckoutWrap.classList.add("shopify-payment-button--disable");if(maxLimit){const disableInput=checkedInputs.length>=maxLimit;this.querySelectorAll("input[type=checkbox]:not(:checked)").forEach(uncheckedInput=>{uncheckedInput.disabled=disableInput})}checkedInputs.forEach(checkedInput=>{checkedString.length>0&&(checkedString+=","),checkedString+=checkedInput.value}),mainInputELm.value=checkedString})})}}); 2//# sourceMappingURL=/cdn/shop/t/2037/assets/product-form.js.map?v=108402537417704636301789996014
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.