PageSourceSearch

https://re-play.com/cdn/shop/t/212/assets/product-form.js?v=53768074326365643211785801251

js re-play.com collected 2026-10-03 22:18:33 UTC 12,314 bytes, 8 lines download raw bytes

1customElements.get("product-form")||customElements.define("product-form",class extends HTMLElement{constructor(){super(),this.timeout,this.form=this.querySelector("form"),this.form.addEventListener("submit",this.onSubmitHandler.bind(this)),this.cart=document.querySelector("cart-notification")||document.querySelector("cart-drawer"),this.quantityInput=this.querySelector(".quantity__input"),this.quickModal=this.closest(".quick-add"),this.hideErrors=this.dataset.hideErrors==="true",this.quantityInput&&this.quantityInput.addEventListener("error",this.validateQuantity.bind(this)),this.addToCartButtons=this.querySelectorAll("[data-add-to-cart]"),document.querySelector("cart-drawer")&&this.addToCartButtons.forEach(submitButton=>{submitButton.setAttribute("aria-haspopup","dialog")}),this.onWindowResize=this.debounce(()=>this.handleWindowResize.bind(this)),this.productInfoWrapper=this.closest(".product__info-wrapper"),this.addToCartSection=document.querySelector(".product-single__meta"),this.addToCartSection&&(this.addToCartContent=this.addToCartSection.querySelector(".product__meta-grid"),this.productSelectors=this.addToCartContent.querySelector(".product__meta-grid-item--selectors"),this.lowStockNotification=this.addToCartContent.querySelector("[data-left-quantity]")),this.controlsGroupSubmitTrigger=this.querySelector("#data-controls-group-submit-trigger"),this.controlsGroupSubmit=this.querySelector("[data-controls-group-submit]"),this.goToCartButtons=this.querySelectorAll("[data-go-to-cart]"),this.dynamicCheckoutWrap=this.querySelector(".product-form__dynamic-buttons"),this.dynamicCheckoutWrap&&this.dynamicCheckoutWrap.addEventListener("click",evt=>{if(evt.preventDefault(),this.dynamicCheckoutWrap.classList.contains("product-form__dynamic-buttons--disable"))this.validateCustomProperties()?this.dynamicCheckoutWrap.classList.remove("product-form__dynamic-buttons--disable"):(this.handleErrorMessage(`${window.variantStrings.customPropertyError}`),this.handleButtonLoadingState(!1));else{this.dynamicCheckoutWrap.classList.add("product-form__dynamic-buttons--loading");let shopifyButton=evt.target;shopifyButton.role!="button"&&(shopifyButton=shopifyButton.closest('[role="button"]')),shopifyButton.innerHTML=`<span class="product-form-spinner" data-loader>
2              <div class="spinner">
3                <div class="bounce1"></div>
4                <div class="bounce2"></div>
5                <div class="bounce3"></div>
6              </div>
7            </span>`,shopifyButton.dataset.loading=!0}}),this.quickModal||(this.onScrollHandler=this.onScroll.bind(this)),window.addEventListener("resize",this.onWindowResize),this.initBreakpoints()}initBreakpoints(){const self=this;enquire.register("screen and (max-width: 1000px)",{match:()=>{window.addEventListener("scroll",self.onScrollHandler,!1),self.bpSmall=!0},unmatch:()=>{window.removeEventListener("scroll",self.onScrollHandler,!1),self.bpSmall=!1}})}onScroll(){if(!this.controlsGroupSubmitTrigger)return;const elemTop=this.controlsGroupSubmitTrigger.getBoundingClientRect().top,controlsIsFixed=this.controlsGroupSubmit.classList.contains("fix-controls-group--submit");controlsIsFixed&&elemTop>-56?requestAnimationFrame(this.resetAddToCartButton.bind(this)):!controlsIsFixed&&elemTop<-56&&requestAnimationFrame(this.stickyAddToCartButton.bind(this))}resetAddToCartButton(){this.controlsGroupSubmit.classList.remove("fix-controls-group--submit")}stickyAddToCartButton(){this.controlsGroupSubmit.classList.add("fix-controls-group--submit")}handleWindowResize(){const addToCartHeight=this.addToCartSection.offsetHeight;this.addToCartSection.offsetHeight.style.minHeight=`${addToCartHeight}px`}debounce(func,timeout=300){let timer;return(...args)=>{clearTimeout(timer),timer=setTimeout(()=>{func.apply(this,args)},timeout)}}validateQuantity(evt){evt.preventDefault();const quantityLimit=this.quantityInput.getAttribute("max");(!this.lowStockNotification||this.lowStockNotification.textContent==="")&&this.handleErrorMessage(window.variantStrings.lowStockError.replace("[quantity]",quantityLimit))}getValidationError(){let error="",fieldsetsRadios=Array.from(this.productSelectors.querySelectorAll("fieldset"))||[],fieldsets=Array.from(this.productSelectors.querySelectorAll("select"))||[];return fieldsets.length&&(fieldsets=fieldsets.map(fieldset=>{const selectedIndex=fieldset.selectedIndex,nameRegex=fieldset.name.match(/\[(.*?)\]/)||[];return selectedIndex>=0?{name:nameRegex[1],value:fieldset.value}:{name:nameRegex[1]}})),fieldsetsRadios.length&&(fieldsetsRadios=fieldsetsRadios.map(fieldset=>{const inputChecked=Array.from(fieldset.querySelectorAll("input")).find(radio=>radio.checked),name=fieldset.querySelector("input").name;return inputChecked?{name:inputChecked.name,value:inputChecked.value}:{name}}
7)),fieldsetsRadios.concat(fieldsets).forEach(option=>{!option.value&&option.name&&(error=`${window.variantStrings.variantValidError} ${option.name.toLocaleLowerCase()}`)}),error}validateCustomProperties(){let checker=arr=>arr.every(v=>v===!0);const productMetagrid=this.form.closest(".product__meta-grid"),customInputs=productMetagrid?Array.from(productMetagrid.querySelectorAll(".product_custom-options [aria-required]")):[];if(customInputs.length===0)return!0;const validationArray=customInputs.map(customInput=>{if(customInput.required)return validateFormInput(customInput)});return checker(validationArray)}onSubmitHandler(evt){if(evt.preventDefault(),this.handleErrorMessage(),this.handleButtonLoadingState(!0),!this.validateCustomProperties())return this.handleErrorMessage(`${window.variantStrings.customPropertyError}`,!0),this.handleButtonLoadingState(!1),!1;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,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});let errorMsg=response.description;if(!this.hideErrors){const r=/All \d+/,matchItemsLeft=errorMsg.match(r),r2=/You can't add more /i,matchCantAdd=errorMsg.match(r2),r3=/is already sold out/i,matchSoldOut=errorMsg.match(r3);if(matchItemsLeft&&matchItemsLeft.length){const itemsLeft=matchItemsLeft[0].replace("All ","");errorMsg=`We only have ${itemsLeft} and they\u2019re already in your cart!`,itemsLeft==="1"&&(errorMsg=`We only have ${itemsLeft} and it's already in your cart!`)}else matchSoldOut&&matchSoldOut.length&&(errorMsg="This product is already sold out.");matchCantAdd&&matchCantAdd.length&&(errorMsg="You can't add more of this item to your cart.")}this.handleButtonLoadingState(!1),this.handleErrorMessage(errorMsg);return}else if(!this.cart){window.location=window.routes.cart_url;return}let qtyValue=1;if(this.quantityInput&&(qtyValue=this.quantityInput.value),publish(PUB_SUB_EVENTS.cartUpdate,{source:"product-form",productVariantId:formData.get("id")}),this.bpSmall)if(this.cart&&this.cart.classList.contains("drawer")){const quickAddModal=this.closest("quick-add-modal");quickAddModal?(document.body.addEventListener("modalClosed",()=>{setTimeout(()=>{this.cart.renderContents(response,qtyValue)})},{once:!0}),quickAddModal.hide(!0)):this.cart.renderContents(response,qtyValue)}else this.renderBubbleCart(response),this.showGoToCartButton();else if(this.cart){const quickAddModal=this.closest("quick-add-modal");quickAddModal?(document.body.addEventListener("modalClosed",()=>{setTimeout(()=>{this.cart.renderContents(response,qtyValue)})},{once:!0}),quickAddModal.hide(!0)):this.cart.renderContents(response,qtyValue)}}).catch(e=>{this.handleErrorMessage(`${window.cartStrings.error}`),console.error(e)}).finally(()=>{(!this.bpSmall||this.cart&&this.cart.classList.contains("drawer"))&&this.handleButtonLoadingState(!1)})}renderBubbleCart(response){const cartIconBubble=document.getElementById("cart-icon-bubble");if(cartIconBubble){const html=response.sections["cart-icon-bubble"],sourceCartIcon=new DOMParser().parseFromString(html,"text/html").querySelector(".shopify-section");cartIconBubble.innerHTML=sourceCartIcon.innerHTML}}showGoToCartButton(){this.quickModal&&this.quickModal.classList.add("quick-add--visible"),this.goToCartButtons.forEach(goToCartButton=>{goToCartButton.classList.add("product-form__open-cart--fadein")}),setTimeout(()=>{this.handleButtonLoadingState(!1)},500),setTimeout(()=>{this.quickModal&&this.quickModal.classList.remove("quick-add--visible"),this.goToCartButtons.forEach(goToCartButton=>{goToCartButton.classList.remove("product-form__open-cart--fadein")})},5e3)}handleButtonLoadingState(isLoading){if(isLoading)this.addToCartButtons.forEach(addToCart=>{addToCart.disabled=!0,addToCart.setAttribute("aria-disabled",!0),addToCart.classList.add("product-form__cart-submit--loading","btn--loading")}),this.quickModal&&this.quickModal.classList.add("quick-add--visible");else{let activeButton=!1;this.addToCartButtons.forEach(addToCart=>{addToCart.disabled=!1,addToCart.removeAttribute("aria-disabled"),addToCart.classList.remove("product-form__cart-submit--loading","btn--loading"),addToCart.classList.contains("btn--load-error")&&(activeButton=!0)}),this.goToCartButtons.forEach(goToCartButton=>{goToCartButton.classList.contains("product-form__open-cart--fadein")&&(activeButton=!0)}),this.quickModal&&!activeButton&&this.quickModal.classList.remove("quick-add--visible")}}handleErrorMessage(errorMessage=!1,linkToError){if(!this.hideErrors)if(this.errorMessageWrapper=this.errorMessageWrapper||this.querySelector(".product-form__error-message-wrapper"),this.errorMessage=this.errorMessage||this.errorMessageWrapper.querySelector(".product-form__error-message"),this.errorButtonFixed=this.errorButtonFixed||this.querySelector(".product-form__error-message-wrapper.mobile--error"),this.errorMessageFixed=this.errorButtonFixed?this.errorButtonFixed.querySelector(".product-form__error-message"):null,errorMessage){if(this.errorMessageWrapper.classList.remove("hidden"),this.errorButtonFixed&&this.errorButtonFixed.classList.remove("mobile--error--hidden"),this.errorMessageWrapper.classList.contains("product-form__error-message--button-in")){const btn=this.errorMessageWrapper.closest(".btn"),productCard=this.errorMessageWrapper.closest("product-card");if(btn.classList.add("btn--load-error"),this.quickModal&&this.quickModal.classList.add("quick-add--visible"),productCard){const hideButton=productCard.querySelector(".quick-add--mockup .quick-add__submit"),errorMessageWrapperElm=hideButton.querySelector(".product-form__error-message-wrapper"),errorMessageElm=errorMessageWrapperElm.querySelector(".product-form__error-message");hideButton.classList.add("btn--load-error"),errorMessageWrapperElm.classList.remove("hidden"),errorMessageElm.textContent=errorMessage,setTimeout(()=>{errorMessageWrapperElm.classList.add("hidden"),hideButton.classList.remove("btn--load-error")})}setTimeout(()=>{this.quickModal&&this.quickModal.classList.remove("quick-add--visible"),this.errorMessageWrapper.classList.add("hidden"),btn.classList.remove("btn--load-error")},5e3)}if(this.errorMessage.textContent=errorMessage,this.errorMessageFixed&&(this.errorMessageFixed.textContent=errorMessage),linkToError){this.errorMessage.textContent="";const iconStyle=this.errorMessage.dataset.iconStyle,linkToError2=document.createElement("a");linkToError2.setAttribute("class","product-form__error-message__link"),linkToError2.setAttribute("href","#top"),linkToError2.textContent=` ${errorMessage}`,document.createElement("i").setAttribute("class",`icon ${iconStyle} fa-wrench`),this.errorMessage.appendChild(linkToError2),linkToError2.addEventListener("click",evt=>{evt.preventDefault(),window.scrollTo({top:0,behavior:"smooth"})},!1)}}else this.errorMessageWrapper.classList.add("hidden"),this.errorButtonFixed&&this.errorButtonFixed.classList.add("mobile--error--hidden")}});
8//# sourceMappingURL=/cdn/shop/t/212/assets/product-form.js.map?v=53768074326365643211785801251

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.