1import{Component}from"@theme/component";import{fetchConfig,preloadImage,onAnimationEnd,yieldToMainThread}from"@theme/utilities";import{ThemeEvents,CartAddEvent,CartErrorEvent}from"@theme/events";import{cartPerformance}from"@theme/performance";import{morph}from"@theme/morph";const ERROR_MESSAGE_DISPLAY_DURATION=1e4,ERROR_BUTTON_REENABLE_DELAY=1e3,SUCCESS_MESSAGE_DISPLAY_DURATION=5e3,REQUIRED_SIZE_SELECTION_SELECTOR='input[data-is-size-option="true"]:checked, option[data-is-size-option="true"]:checked, input[data-requires-explicit-selection="true"]:checked, option[data-requires-explicit-selection="true"]:checked',getRequiredSizePicker=element=>{const scope=element.closest(".quick-add-modal__content, .nw-product-card__actions-desktop, .product-details")||element.parentElement;return Array.from(scope?.querySelectorAll("variant-picker[data-require-explicit-size-selection]")||[]).find(picker=>picker instanceof HTMLElement&&picker.dataset.productId===element.dataset.productId)},hasRequiredSizeSelection=element=>{const picker=getRequiredSizePicker(element);return!picker||!picker.hasAttribute("data-required-size-selection-ready")?!1:!!picker.querySelector(REQUIRED_SIZE_SELECTION_SELECTOR)};export class AddToCartComponent extends Component{requiredRefs=["addToCartButton"];#resetTimeouts=[];connectedCallback(){super.connectedCallback(),this.addEventListener("pointerenter",this.#preloadImage)}disconnectedCallback(){super.disconnectedCallback(),this.#resetTimeouts&&this.#resetTimeouts.forEach(timeoutId=>clearTimeout(timeoutId)),this.removeEventListener("pointerenter",this.#preloadImage)}disable(){this.refs.addToCartButton.disabled=!0}enable(){this.refs.addToCartButton.disabled=!1}handleClick(event){if(!this.closest("form")?.checkValidity())return;const productForm=this.closest("product-form-component");if(productForm?.dataset.requireExplicitSizeSelection==="true"&&!hasRequiredSizeSelection(productForm)){productForm.showRequiredSizeSelection();return}const quantitySelector=productForm?.refs.quantitySelector;quantitySelector?.canAddToCart&&!quantitySelector.canAddToCart().canAdd||this.refs.addToCartButton.dataset.puppet!=="true"&&(this.dataset.addToCartAnimation==="true"&&!event.target.closest(".quick-add-modal")&&this.#animateFlyToCart(),this.animateAddToCart())}#preloadImage=()=>{const image=this.dataset.productVariantMedia;image&&preloadImage(image)};#animateFlyToCart(){const{addToCartButton}=this.refs,cartIcon=document.querySelector(".header-actions__cart-icon"),image=this.dataset.productVariantMedia;if(!cartIcon||!addToCartButton||!image)return;const flyToCartElement=document.createElement("fly-to-cart");let flyToCartClass=addToCartButton.classList.contains("quick-add__button")?"fly-to-cart--quick":"fly-to-cart--main";flyToCartElement.classList.add(flyToCartClass),flyToCartElement.style.setProperty("background-image",`url(${image})`),flyToCartElement.style.setProperty("--start-opacity","0"),flyToCartElement.source=addToCartButton,flyToCartElement.destination=cartIcon,document.body.appendChild(flyToCartElement)}animateAddToCart=async function(){const{addToCartButton}=this.refs;this.#resetTimeouts||(this.#resetTimeouts=[]),this.#resetTimeouts.forEach(timeoutId2=>clearTimeout(timeoutId2)),this.#resetTimeouts=[],addToCartButton.dataset.added!=="true"&&(addToCartButton.dataset.added="true"),await yieldToMainThread(),await onAnimationEnd(addToCartButton);const timeoutId=setTimeout(()=>{addToCartButton.removeAttribute("data-added");const index=this.#resetTimeouts.indexOf(timeoutId);index>-1&&this.#resetTimeouts.splice(index,1)},800);this.#resetTimeouts.push(timeoutId)}}customElements.get("add-to-cart-component")||customElements.define("add-to-cart-component",AddToCartComponent);class ProductFormComponent extends Component{requiredRefs=["variantId","liveRegion"];#abortController=new AbortController;#timeout;#variantChangeInProgress=!1;#addToCartQueue=[];connectedCallback(){super.connectedCallback();const{signal}=this.#abortController,target=this.closest(".shopify-section, dialog, product-card");target?.addEventListener(ThemeEvents.variantUpdate,this.#onVariantUpdate,{signal}),target?.addEventListener(ThemeEvents.variantSelected,this.#onVariantSelected,{signal}),this.#syncRequiredSizeSelection(),document.addEventListener(ThemeEvents.cartUpdate,this.#onCartUpdate,{signal})}disconnectedCallback(){super.disconnectedCallback(),this.#abortController.abort()}#updateCartQuantityFromData(cart){const variantIdInput=this.querySelector('input[name="id"]');if(!variantIdInput?.value||!cart?.items)return 0;const cartItem=cart.items.find(item=>item.variant_id.toString()===variantIdInput.value.toString()),cartQty=cartItem?cartItem.quantity:0,quantitySelector=this.querySelector("quantity-selector-component");return quantitySelector?.setCartQuantity&&quantitySelector.setCartQuantity(cartQty),this.#updateQuantityLabel(cartQty),cartQty}async#fetchAndUpdateCartQuantity(){if(!this.querySelector('input[name="id"]')?.value)return null;try{const cart=await(await fetch("/cart.js")).json();return this.#updateCartQuantityFromData(cart),cart}catch(error){return console.error("Failed to fetch cart quantity:",error),null}}#onCartUpdate=async event=>{if(event.detail?.sourceId===this.id||event.detail?.data?.source==="product-form-component")return;const cart=event.detail?.resource;cart?.items?this.#updateCartQuantityFromData(cart):await this.#fetchAndUpdateCartQuantity()};handleSubmit(event){if(event.preventDefault(),this.#hasPendingRequiredSizeSelection()){this.showRequiredSizeSelection();return}if(this.#variantChangeInProgress){const intendedVariantId=this.#getIntendedVariantId(),quantity=this.#getQuantity();intendedVariantId&&this.#addToCartQueue.push({variantId:intendedVariantId,quantity}),this.refs.addToCartButtonContainer?.animateAddToCart?.();return}this.#processAddToCart(void 0,void 0,event)}
1showRequiredSizeSelection(){const quickAdd=this.closest(".nw-detail-buy-buttons")?.querySelector("quick-add-component");if(quickAdd?.handleClick){quickAdd.handleClick(new Event("click"));return}this.dispatchEvent(new CustomEvent("size-selection-required",{bubbles:!0}))}#getIntendedVariantId(){const embeddedVariantId=this.#getSelectedEmbeddedVariantId();return embeddedVariantId||new URL(window.location.href).searchParams.get("variant")||this.refs.variantId?.value||void 0}#getSelectedEmbeddedVariantId(){const selectedOption=this.closest(".nw-complete-look-card__actions, .nw-product-card__actions, .nw-product-card__actions-desktop")?.querySelector("variant-picker[data-nw-embedded-variant-picker]")?.querySelector('input[type="radio"]:checked[data-variant-id], select option:checked[data-variant-id]');if(selectedOption instanceof HTMLElement)return selectedOption.dataset.variantId||void 0}#getQuantity(){return Number(this.refs.quantitySelector?.getValue?.())||Number(this.dataset.quantityDefault)||1}#processAddToCart(overrideVariantId,overrideQuantity,event){const{addToCartTextError}=this.refs,selectedVariantId=overrideVariantId||this.#getSelectedEmbeddedVariantId();this.#timeout&&clearTimeout(this.#timeout);const allAddToCartContainers=this.querySelectorAll("add-to-cart-component");if(!overrideVariantId&&Array.from(allAddToCartContainers).some(container=>container.refs.addToCartButton?.disabled))return;const form=this.querySelector("form");if(!form)throw new Error("Product form element missing");if(!overrideVariantId&&this.refs.quantitySelector?.canAddToCart){const validation=this.refs.quantitySelector.canAddToCart();if(!validation.canAdd){for(const container of allAddToCartContainers)container.disable();const errorMessage=(this.dataset.quantityErrorMax||"").replace("{{ maximum }}",validation.maxQuantity?.toString()||"");if(addToCartTextError){addToCartTextError.classList.remove("hidden");const textNode=addToCartTextError.childNodes[2];if(textNode)textNode.textContent=errorMessage;else{const newTextNode=document.createTextNode(errorMessage);addToCartTextError.appendChild(newTextNode)}this.#setLiveRegionText(errorMessage),this.#timeout&&clearTimeout(this.#timeout),this.#timeout=setTimeout(()=>{addToCartTextError&&(addToCartTextError.classList.add("hidden"),this.#clearLiveRegionText())},ERROR_MESSAGE_DISPLAY_DURATION)}setTimeout(()=>{for(const container of allAddToCartContainers)container.enable()},ERROR_BUTTON_REENABLE_DELAY);return}}const formData=new FormData(form);selectedVariantId&&formData.set("id",selectedVariantId),overrideQuantity!==void 0&&formData.set("quantity",overrideQuantity.toString());const cartItemsComponents=document.querySelectorAll("cart-items-component");let cartItemComponentsSectionIds=[];cartItemsComponents.forEach(item=>{item instanceof HTMLElement&&item.dataset.sectionId&&cartItemComponentsSectionIds.push(item.dataset.sectionId),formData.append("sections",cartItemComponentsSectionIds.join(","))});const fetchCfg=fetchConfig("javascript",{body:formData});fetch(Theme.routes.cart_add_url,{...fetchCfg,headers:{...fetchCfg.headers,Accept:"text/html"}}).then(response=>response.json()).then(async response=>{if(response.status){if(this.dispatchEvent(new CartErrorEvent(form.getAttribute("id")||"",response.message,response.description,response.errors)),!addToCartTextError)return;addToCartTextError.classList.remove("hidden");const textNode=addToCartTextError.childNodes[2];if(textNode)textNode.textContent=response.message;else{const newTextNode=document.createTextNode(response.message);addToCartTextError.appendChild(newTextNode)}this.#setLiveRegionText(response.message),this.#timeout=setTimeout(()=>{addToCartTextError&&(addToCartTextError.classList.add("hidden"),this.#clearLiveRegionText())},ERROR_MESSAGE_DISPLAY_DURATION),this.dispatchEvent(new CartAddEvent({},this.id,{didError:!0,source:"product-form-component",itemCount:Number(formData.get("quantity"))||Number(this.dataset.quantityDefault),productId:this.dataset.productId}));return}else{const id=formData.get("id");if(addToCartTextError&&(addToCartTextError.classList.add("hidden"),addToCartTextError.removeAttribute("aria-live")),!id)throw new Error("Form ID is required");const anyAddToCartButton=allAddToCartContainers[0]?.refs.addToCartButton;if(anyAddToCartButton){const addedText=anyAddToCartButton.querySelector(".add-to-cart-text--added")?.textContent?.trim()||Theme.translations.added;this.#setLiveRegionText(addedText),setTimeout(()=>{this.#clearLiveRegionText()},SUCCESS_MESSAGE_DISPLAY_DURATION)}const updatedCart=await this.#fetchAndUpdateCartQuantity();this.#publishProductAdded(id.toString(),Number(formData.get("quantity"))||Number(this.dataset.quantityDefault)),this.dispatchEvent(new CartAddEvent(updatedCart||{},id.toString(),{source:"product-form-component",itemCount:Number(formData.get("quantity"))||Number(this.dataset.quantityDefault),productId:this.dataset.productId,variantId:id.toString(),addedItem:response,sections:response.sections}))}}).catch(error=>{console.error(error)}).finally(()=>{event&&cartPerformance.measureFromEvent("add:user-action",event)})}#processBatchAddToCart(items){if(items.length===0)return;const{addToCartTextError}=this.refs;this.#timeout&&clearTimeout(this.#timeout);const cartItemsComponents=document.querySelectorAll("cart-items-component"),cartItemComponentsSectionIds=[];for(const item of cartItemsComponents)item instanceof HTMLElement&&item.dataset.sectionId&&cartItemComponentsSectionIds.push(item.dataset.sectionId);const payload={items:items.map(item=>({id:Number(item.variantId),quantity:item.quantity,...this.#linePropertiesForCurrentVariant()})),sections:cartItemComponentsSectionIds.join(",")};fetch(Theme.routes.cart_add_url,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(payload)}).then(response=>response.json()).then(async response=>{if(response.status){if(this.dispatchEvent(new CartErrorEvent(this.id,response.message,response.description,response.errors)),addToCartTextError){addToCartTextError.classList.remove("hidden");const textNode=addToCartTextError.childNodes[2];textNode?textNode.textContent=response.message:addToCartTextError.appendChild(document.createTextNode(response.message)),this.#setLiveRegionText(response.message),this.#timeout=setTimeout(()=>{addToCartTextError.classList.add("hidden"),this.#clearLiveRegionText()},ERROR_MESSAGE_DISPLAY_DURATION)}this.dispatchEvent(new CartAddEvent({},this.id,{didError:!0,source:"product-form-component",itemCount:items.reduce((sum,item)=>sum+item.quantity,0),productId:this.dataset.productId}));return}addToCartTextError&&(addToCartTextError.classList.add("hidden"),addToCartTextError.removeAttribute("aria-live"));const anyAddToCartButton=this.querySelectorAll("add-to-cart-component")[0]?.refs.addToCartButton;if(anyAddToCartButton){const addedText=anyAddToCartButton.querySelector(".add-to-cart-text--added")?.textContent?.trim()||Theme.translations.added;this.#setLiveRegionText(addedText),setTimeout(()=>this.#clearLiveRegionText(),SUCCESS_MESSAGE_DISPLAY_DURATION)}const updatedCart=await this.#fetchAndUpdateCartQuantity(),totalQuantity=items.reduce((sum,item)=>sum+item.quantity,0);items.length===1&&this.#publishProductAdded(items[0].variantId,items[0].quantity),this.dispatchEvent(new CartAddEvent(updatedCart||{},this.id,{source:"product-form-component",itemCount:totalQuantity,productId:this.dataset.productId,variantId:items.length===1?items[0].variantId:void 0,sections:response.sections}))}).catch(error=>{console.error(error)})}#updateQuantityLabel(cartQty){const quantityLabel=this.refs.quantityLabelCartCount;if(quantityLabel){const inCartText=quantityLabel.textContent?.match(/\((\d+)\s+(.+)\)/);inCartText&&inCartText[2]&&(quantityLabel.textContent=`(${cartQty} ${inCartText[2]})`),quantityLabel.classList.toggle("hidden",cartQty===0)}}#setLiveRegionText(text){const liveRegion=this.refs.liveRegion;liveRegion.textContent=text}#clearLiveRegionText(){const liveRegion=this.refs.liveRegion;liveRegion.textContent=""}#morphOrUpdateElement(currentElement,newElement,insertReferenceElement=null){currentElement&&newElement?morph(currentElement,newElement):currentElement&&!newElement?currentElement.remove():!currentElement&&newElement&&insertReferenceElement&&insertReferenceElement.insertAdjacentElement("beforebegin",newElement.cloneNode(!0))}#shouldIgnoreCarouselEmbeddedVariantEvent(event){const embeddedPicker=event.composedPath().find(n=>n instanceof HTMLElement&&n.localName==="variant-picker"&&n.hasAttribute("data-nw-embedded-variant-picker"));if(!embeddedPicker)return!1;
1const formForPicker=embeddedPicker.closest(".nw-complete-look-card__actions, .nw-product-card__actions, .nw-product-card__actions-desktop")?.querySelector("product-form-component");return!formForPicker||formForPicker!==this}#isVariantEventForCurrentProduct(event){const variantPicker=event.composedPath().find(node=>node instanceof HTMLElement&&node.localName==="variant-picker");return variantPicker?.dataset.productId?String(variantPicker.dataset.productId)===String(this.dataset.productId):!0}#hasPendingRequiredSizeSelection(){return this.dataset.requireExplicitSizeSelection!=="true"?!1:!hasRequiredSizeSelection(this)}#syncRequiredSizeSelection(){this.#hasPendingRequiredSizeSelection()&&(this.refs.variantId.value="",this.refs.variantId.disabled=!0)}#linePropertiesForCurrentVariant(){const input=this.querySelector('input[name="properties[_productm]"]'),productm=input instanceof HTMLInputElement?input.value.trim():"";return productm===""?{}:{properties:{_productm:productm}}}#publishProductAdded(variantId,quantity){const input=this.querySelector('input[name="properties[_productm]"]'),parsedProductm=input instanceof HTMLInputElement?Number(input.value):Number.NaN;window.DisfrazzesAnalytics?.publish?.("product_added_to_cart",{variant_id:variantId,quantity,productm:Number.isFinite(parsedProductm)?parsedProductm:null})}#syncProductmProperty(nextMarkup){const form=this.querySelector("form");if(!form)return;const current=form.querySelector('input[name="properties[_productm]"]'),next=nextMarkup.querySelector('input[name="properties[_productm]"]');next instanceof HTMLInputElement?current instanceof HTMLInputElement?current.value=next.value:form.append(next.cloneNode(!0)):current instanceof HTMLInputElement&¤t.remove()}#onVariantUpdate=async event=>{if(this.#shouldIgnoreCarouselEmbeddedVariantEvent(event))return;if(event.detail.data.newProduct)this.dataset.productId=event.detail.data.newProduct.id;else if(event.detail.data.productId!==this.dataset.productId)return;const{variantId}=this.refs,hasPendingSizeSelection=this.#hasPendingRequiredSizeSelection();variantId.value=hasPendingSizeSelection?"":event.detail.resource?.id??"",variantId.disabled=hasPendingSizeSelection||event.detail.resource==null||event.detail.resource.available==!1,this.#syncProductmProperty(event.detail.data.html);const currentBuyButtonsBlock=this.closest(".buy-buttons-block"),currentBuyButtonsKey=Array.from(currentBuyButtonsBlock?.classList||[]).find(className=>className.startsWith("buy-buttons-block--")),newBuyButtonsBlock=currentBuyButtonsKey?event.detail.data.html.querySelector(`.${currentBuyButtonsKey}`):event.detail.data.html.querySelector(".buy-buttons-block");if(this.#variantChangeInProgress=!1,this.#addToCartQueue.length>0){const queuedItems=[...this.#addToCartQueue];this.#addToCartQueue=[],this.#processBatchAddToCart(queuedItems)}if(currentBuyButtonsBlock&&newBuyButtonsBlock){morph(currentBuyButtonsBlock,newBuyButtonsBlock),await this.#fetchAndUpdateCartQuantity();return}const{addToCartButtonContainer:currentAddToCartButtonContainer,acceleratedCheckoutButtonContainer}=this.refs,currentAddToCartButton=currentAddToCartButtonContainer?.refs.addToCartButton,newAddToCartButtonContainer=event.detail.data.html.querySelector('[ref="addToCartButtonContainer"]'),newProductFormButtons=event.detail.data.html.querySelector(".nw-product-form-buttons, .product-form-buttons"),currentProductFormButtons=this.refs.productFormButtons;if((currentAddToCartButtonContainer?"add-to-cart":"notify")!==(newAddToCartButtonContainer?"add-to-cart":"notify")&¤tProductFormButtons&&newProductFormButtons){morph(currentProductFormButtons,newProductFormButtons),acceleratedCheckoutButtonContainer&&(event.detail.resource==null||event.detail.resource.available==!1?acceleratedCheckoutButtonContainer?.setAttribute("hidden","true"):acceleratedCheckoutButtonContainer?.removeAttribute("hidden")),await this.#fetchAndUpdateCartQuantity();return}if(!currentAddToCartButtonContainer||!currentAddToCartButton&&!acceleratedCheckoutButtonContainer)return;hasPendingSizeSelection||event.detail.resource==null||event.detail.resource.available==!1?currentAddToCartButtonContainer.disable():currentAddToCartButtonContainer.enable();const newAddToCartButton=event.detail.data.html.querySelector('product-form-component [ref="addToCartButton"]');if(newAddToCartButton&¤tAddToCartButton&&morph(currentAddToCartButton,newAddToCartButton),acceleratedCheckoutButtonContainer&&(event.detail.resource==null||event.detail.resource.available==!1?acceleratedCheckoutButtonContainer?.setAttribute("hidden","true"):acceleratedCheckoutButtonContainer?.removeAttribute("hidden")),event.detail.resource){const productVariantMedia=event.detail.resource.featured_media?.preview_image?.src;productVariantMedia&&this.refs.addToCartButtonContainer?.setAttribute("data-product-variant-media",productVariantMedia+"&width=100")}const{quantityRules,pricePerItem,quantitySelector,productFormButtons,quantityLabel,quantitySelectorWrapper}=this.refs,newQuantityInput=event.detail.data.html.querySelector('quantity-selector-component input[ref="quantityInput"]');quantitySelector?.updateConstraints&&newQuantityInput&&quantitySelector.updateConstraints(newQuantityInput.min,newQuantityInput.max||null,newQuantityInput.step);const newQuantityRules=event.detail.data.html.querySelector(".quantity-rules"),isQuantityRulesChanging=!!quantityRules!=!!newQuantityRules,newPricePerItem=event.detail.data.html.querySelector("price-per-item");if((isQuantityRulesChanging||!!pricePerItem!=!!newPricePerItem)&&quantitySelector){const currentQuantityValue=quantitySelector.getValue?.(),newProductFormButtons2=event.detail.data.html.querySelector(".product-form-buttons, .nw-product-form-buttons");if(productFormButtons&&newProductFormButtons2){morph(productFormButtons,newProductFormButtons2);const newQuantityInputElement=event.detail.data.html.querySelector('quantity-selector-component input[ref="quantityInput"]');this.refs.quantitySelector?.updateConstraints&&newQuantityInputElement&¤tQuantityValue&&(this.refs.quantitySelector.setValue(currentQuantityValue),this.refs.quantitySelector.updateConstraints(newQuantityInputElement.min,newQuantityInputElement.max||null,newQuantityInputElement.step))}}else{const morphTargets=[[".quantity-label",quantityLabel,quantitySelector],[".quantity-rules",quantityRules,this.refs.productFormButtons],["price-per-item",pricePerItem,quantitySelectorWrapper]];for(const[selector,currentElement,fallback]of morphTargets)this.#morphOrUpdateElement(currentElement,event.detail.data.html.querySelector(selector),fallback)}const currentVolumePricing=this.refs.volumePricing,newVolumePricing=event.detail.data.html.querySelector("volume-pricing");this.#morphOrUpdateElement(currentVolumePricing,newVolumePricing,this.refs.productFormButtons),(quantityRules||newQuantityRules||pricePerItem||newPricePerItem||currentVolumePricing||newVolumePricing)&&await this.#fetchAndUpdateCartQuantity()};#onVariantSelected=event=>{this.#shouldIgnoreCarouselEmbeddedVariantEvent(event)||this.#isVariantEventForCurrentProduct(event)&&(this.#variantChangeInProgress=!0)}}customElements.get("product-form-component")||customElements.define("product-form-component",ProductFormComponent); 2//# sourceMappingURL=/cdn/shop/t/2/assets/product-form.js.map?v=7772842931684598661790246521
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.