PageSourceSearch

https://madebymutant.com/cdn/shop/t/16/assets/product-form.js?v=85152811500710111631764944329

js madebymutant.com collected 2026-10-02 07:48:03 UTC 6,197 bytes, 2 lines download raw bytes

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"),document.querySelector("cart-drawer")&&this.submitButton.setAttribute("aria-haspopup","dialog"),this.hideErrors=this.dataset.hideErrors==="true"}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 clampQuantityToHtmlMinMax=()=>{try{const quantityInput=this.form.querySelector('input[name="quantity"]');if(quantityInput){const minAttr=quantityInput.min?parseInt(quantityInput.min,10):null,maxAttr=quantityInput.max?parseInt(quantityInput.max,10):null;let currentQty=parseInt(quantityInput.value,10);isNaN(currentQty)&&minAttr!==null&&(currentQty=minAttr),minAttr!==null&&currentQty<minAttr&&(currentQty=minAttr),maxAttr!==null&&currentQty>maxAttr&&(currentQty=maxAttr),isNaN(currentQty)||(quantityInput.value=currentQty)}}catch(e){console.error("Quantity clamp error (product form submit):",e)}},performAddToCart=()=>{const config=fetchConfig("javascript");config.headers["X-Requested-With"]="XMLHttpRequest",delete config.headers["Content-Type"],clampQuantityToHtmlMinMax();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.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}this.error||publish(PUB_SUB_EVENTS.cartUpdate,{source:"product-form",productVariantId:formData.get("id"),cartData:response}),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)}).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")})};let orderLimit=null;try{const variantId=this.variantIdInput&&this.variantIdInput.value;if(variantId){const productInfoEl=this.closest("[data-product-id]"),productId=productInfoEl?productInfoEl.dataset.productId:null;if(productId){if(!this.variantOrderLimits){const limitsScript=document.getElementById(`VariantOrderLimits-${productId}`);if(limitsScript)try{this.variantOrderLimits=JSON.parse(limitsScript.textContent||limitsScript.innerHTML||"{}")}catch(e){console.error("Error parsing VariantOrderLimits JSON:",e),this.variantOrderLimits={}}else this.variantOrderLimits={}}const rawLimit=this.variantOrderLimits[variantId];if(rawLimit!=null){const parsedLimit=parseInt(rawLimit,10);!isNaN(parsedLimit)&&parsedLimit>0&&(orderLimit=parsedLimit)}}}}catch(e){console.error("Error reading variant order limits:",e)}if(!orderLimit){performAddToCart();return}fetch("/cart.js",{credentials:"same-origin"}).then(res=>
1res.ok?res.json():Promise.reject(res)).then(cart=>{const variantId=this.variantIdInput&&this.variantIdInput.value;if(!variantId){performAddToCart();return}const existingLine=cart.items.find(item=>String(item.variant_id)===String(variantId)),existingQty=existingLine?existingLine.quantity:0,quantityInput=this.form.querySelector('input[name="quantity"]');let requested=quantityInput?parseInt(quantityInput.value,10):1;(isNaN(requested)||requested<1)&&(requested=1);const maxAdditional=orderLimit-existingQty;if(maxAdditional<=0){this.error=!0;const message=window.variantStrings&&window.variantStrings.orderLimitReached?window.variantStrings.orderLimitReached.replace("[limit]",orderLimit):`You can only purchase ${orderLimit} of this item.`;this.handleErrorMessage(message),this.submitButton.classList.remove("loading"),this.querySelector(".loading__spinner").classList.add("hidden"),this.submitButton.removeAttribute("aria-disabled");return}requested>maxAdditional&&(requested=maxAdditional),quantityInput&&(quantityInput.value=requested),performAddToCart()}).catch(e=>{console.error("Error checking cart before add:",e),performAddToCart()})}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/16/assets/product-form.js.map?v=85152811500710111631764944329

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.