PageSourceSearch

https://bruntworkwear.com/cdn/shop/t/780/assets/product-add-to-cart.js?v=89927951654343636121790571591

js bruntworkwear.com collected 2026-10-02 04:06:13 UTC 33,246 bytes, 32 lines download raw bytes

1import{Component}from"@theme/component";import{CartAddEvent}from"@theme/events";import{morphSection}from"@theme/section-renderer";import{withCompareAtProps}from"@theme/cart-line-item-properties";class ProductAddToCart extends Component{static get observedAttributes(){return["data-selected-variant-id","data-price","data-compare-at-price","data-inventory-policy","data-inventory-quantity","data-inventory-management","data-items","data-sold-out","data-enable-safety-rating"]}constructor(){super(),this.productId=null,this.isUs=!1,this.currencySymbol=null,this.currentVariant=null,this.bundleItems=null,this.button=null,this.buttonText=null,this.buttonPrice=null,this.topCopy=null,this.originalTopCopyContent=null,this.hurryMessage=null,this.isAddingToCart=!1,this.buttonClickHandler=null,this.inlineFormContainer=null,this.preOrderConfirmHandler=null,this.notifyEmailFormHandler=null,this.notifyEmailInlineFormHandler=null,this.notifyEmailInlineFormKeyHandler=null,this.resizeTimeout=null,this.safetyRatingConfirmHandler=null,this.enableSafetyRating=!1,this.bisContainer=null}connectedCallback(){super.connectedCallback(),this.init()}attributeChangedCallback(name,oldValue,newValue){oldValue!==newValue&&this.updateStateFromAttributes()}init(){this.productId=this.dataset.productId?parseInt(this.dataset.productId,10):null,this.isUs=this.dataset.isUs==="true",this.useKlaviyoWaitlist=this.dataset.useKlaviyoWaitlist==="true",this.enableSafetyRating=this.dataset.enableSafetyRating==="true";const currencyScript=this.querySelector("script[data-currency-symbol]");this.currencySymbol=currencyScript?JSON.parse(currencyScript.textContent)||currencyScript.dataset.currencySymbol:window.Shopify?.currency?.active||"$",this.button=this.querySelector("[data-add-to-cart-button]"),this.buttonText=this.querySelector("[data-button-text]"),this.buttonPrice=this.querySelector("[data-button-price]"),this.topCopy=this.querySelector("[data-top-copy]"),this.hurryMessage=this.querySelector("[data-hurry-message]"),this.topCopy&&(this.originalTopCopyContent=this.topCopy.innerHTML),this.button&&(this.buttonClickHandler&&this.button.removeEventListener("click",this.buttonClickHandler),this.buttonClickHandler=this.handleAddToCartClick.bind(this),this.button.addEventListener("click",this.buttonClickHandler)),this.handleResize=this.handleResize.bind(this),window.addEventListener("resize",this.handleResize),this.subscriptionChangeHandler=this.handleSubscriptionChange.bind(this),this.addEventListener("subscription:changed",this.subscriptionChangeHandler),document.addEventListener("subscription:changed",this.subscriptionChangeHandler),this.checkInitialSubscriptionState(),this.updateStateFromAttributes()}disconnectedCallback(){super.disconnectedCallback?.(),this.handleResize&&window.removeEventListener("resize",this.handleResize),this.resizeTimeout&&clearTimeout(this.resizeTimeout),this.subscriptionChangeHandler&&(this.removeEventListener("subscription:changed",this.subscriptionChangeHandler),document.removeEventListener("subscription:changed",this.subscriptionChangeHandler)),this.removeNotifyEmailInlineForm(),this.removeBisContainer()}checkInitialSubscriptionState(){this.dataset.subscriptionMode&&this.refreshButtonState()}handleResize(){this.resizeTimeout&&clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(()=>{this.getCurrentButtonState()==="out_of_stock"&&(this.bundleItems||!this.isUs||this.useKlaviyoWaitlist)&&this.handleNotifyEmailState()},250)}handleSubscriptionChange(event){event.detail?.targetComponent&&event.detail.targetComponent!==this||(event.detail&&event.detail.option==="subscribe"?(event.detail.sellingPlanId&&(this.dataset.sellingPlanId=event.detail.sellingPlanId.toString()),this.dataset.subscriptionMode="subscribe",event.detail.subscriptionPrice&&(this.dataset.subscriptionPrice=event.detail.subscriptionPrice.toString()),event.detail.subscriptionCompareAtPrice&&(this.dataset.subscriptionCompareAtPrice=event.detail.subscriptionCompareAtPrice.toString())):(this.removeAttribute("data-selling-plan-id"),this.removeAttribute("data-subscription-price"),this.removeAttribute("data-subscription-compare-at-price"),this.dataset.subscriptionMode="one-time"),!this.currentVariant&&!this.bundleItems&&this.updateStateFromAttributes(),this.refreshButtonState())}refreshButtonState(){if(!this.currentVariant&&!this.bundleItems){this.updateStateFromAttributes();return}this.bundleItems?this.updateBundleState():this.currentVariant?this.updateSingleState():this.updateStateFromAttributes()}updateStateFromAttributes(){if(this.enableSafetyRating=this.dataset.enableSafetyRating==="true",this.dataset.items)try{this.bundleItems=JSON.parse(this.dataset.items),this.currentVariant=null,this.updateBundleState();return}catch(e){console.warn("[ProductAddToCart] Invalid data-items JSON",e)}const variantId=this.dataset.selectedVariantId;if(variantId){this.bundleItems=null;const hasSoldOutTag=this.dataset.soldOut==="true";this.currentVariant={id:parseInt(variantId,10),price:parseInt(this.dataset.price,10),compare_at_price:this.dataset.compareAtPrice?parseInt(this.dataset.compareAtPrice,10):null,inventory_policy:this.dataset.inventoryPolicy,inventory_quantity:parseInt(this.dataset.inventoryQuantity,10),inventory_management:this.dataset.inventoryManagement||null,available:!0,requires_selling_plan:!1,has_sold_out_tag:hasSoldOutTag},this.currentVariant.inventory_quantity<=0&&this.currentVariant.inventory_policy==="deny"&&(this.currentVariant.available=!1),this.updateSingleState()}}updateBundleState(){if(!this.bundleItems||this.bundleItems.length===0){delete this.dataset.bundleDisplayPriceCents,this.setButtonState("sold_out"),this.buttonPrice&&(this.buttonPrice.innerHTML=""),this.updateHurryMessage(null);return}const state=this.getBundleButtonState();if(this.setButtonState(state),["default","pre_order","subscribe"].includes(state)){let totalRegularPrice=0;
1this.bundleItems.forEach(item=>{item.price&&(totalRegularPrice+=item.price)});let discountPercentage=parseInt(this.dataset.bundleDiscountPercent||"0",10);if(!Number.isFinite(discountPercentage)||discountPercentage<=0){const bundleAtcComponent=document.querySelector("bundle-atc-component");discountPercentage=bundleAtcComponent?parseInt(bundleAtcComponent.dataset.discountPercentage||"0",10):0}discountPercentage=Math.min(100,Math.max(0,discountPercentage));const discountMultiplier=(100-discountPercentage)/100,totalDiscountedPrice=Math.floor(totalRegularPrice*discountMultiplier);if(this.dataset.bundleDisplayPriceCents=String(totalDiscountedPrice),this.buttonPrice){const aggregateVariant={price:totalDiscountedPrice,compare_at_price:discountPercentage>0?totalRegularPrice:null};this.buttonPrice.innerHTML=` - ${this.formatPriceDisplay(aggregateVariant)}`}}else delete this.dataset.bundleDisplayPriceCents,this.buttonPrice&&(this.buttonPrice.innerHTML="");const hurryVariant=this.bundleItems.find(item=>item.inventory_policy==="deny"&&item.inventory_quantity>0&&item.inventory_quantity<100);this.updateHurryMessage(hurryVariant||null)}updateSingleState(){const variant=this.currentVariant,state=this.getButtonState(variant);if(this.setButtonState(state),this.buttonPrice)if(["default","pre_order","subscribe"].includes(state)&&variant)if(state==="subscribe"&&this.dataset.subscriptionPrice){const subscriptionPrice=parseInt(this.dataset.subscriptionPrice,10),subscriptionCompareAtPrice=this.dataset.subscriptionCompareAtPrice?parseInt(this.dataset.subscriptionCompareAtPrice,10):null,subscriptionVariant={price:subscriptionPrice,compare_at_price:subscriptionCompareAtPrice};this.buttonPrice.innerHTML=` - ${this.formatPriceDisplay(subscriptionVariant)}`}else this.buttonPrice.innerHTML=` - ${this.formatPriceDisplay(variant)}`;else this.buttonPrice.innerHTML="";if(variant){const effectivePrice=state==="subscribe"&&this.dataset.subscriptionPrice?parseInt(this.dataset.subscriptionPrice,10):variant.price;this._updateLoyaltyStrip(effectivePrice)}this.updateHurryMessage(variant)}_updateLoyaltyStrip(priceCents){if(this.hasAttribute("data-items"))return;const strip=this.querySelector('[data-loyalty-earn-root][data-loyalty-context="pdp"]');if(!(strip instanceof HTMLElement))return;strip.hasAttribute("data-loyalty-earn-bundle")&&strip.removeAttribute("data-loyalty-earn-bundle");const pid=this.dataset.productId;pid&&pid!==strip.dataset.productId&&(strip.dataset.productId=pid);const cents=Number(priceCents)||0;strip.dataset.variantPriceCents=String(cents);const cfg=window.Theme?.loyaltyEarn;if(!(cfg?.enabledAddToCart??cfg?.enabled))return;const ppl=Math.max(1,Math.min(20,Number(cfg.pointsPerDollar)||1)),mult=Number(cfg.promoMultiplier)>0?Number(cfg.promoMultiplier):1,units=Math.floor(cents/100),pts=Math.round(units*ppl*mult);strip.hidden=!1,strip.querySelectorAll("[data-loyalty-earn-value]").forEach(el=>{el.textContent=String(pts)})}setButtonState(state){if(!(!this.button||!this.buttonText)){if(state==="out_of_stock"&&this.bundleItems){this.handleNotifyEmailState();return}if(state==="out_of_stock"&&!this.isUs){this.handleNotifyEmailState();return}if(state==="out_of_stock"&&this.isUs&&!this.bundleItems){if(this.useKlaviyoWaitlist){this.handleNotifyEmailState();return}this.removeBisContainer(),this.removeNotifyEmailInlineForm(),this.button&&(this.button.style.display="",this.button.disabled=!0),this.buttonText&&(this.buttonText.textContent=this.getButtonText("sold_out")),this.button&&(this.button.className=this.button.className.replace(/product__addToCartButton--\S+/g,""),this.button.classList.add("product__addToCartButton--sold-out")),this.updateTopCopy("sold_out");return}this.removeNotifyEmailInlineForm(),this.removeBisContainer(),this.button.disabled=state==="sold_out",this.buttonText.textContent=this.getButtonText(state),this.button.className=this.button.className.replace(/product__addToCartButton--\S+/g,""),this.button.classList.add(`product__addToCartButton--${state.replace(/_/g,"-")}`),this.updateTopCopy(state)}}handleNotifyEmailState(){this.removeNotifyEmailInlineForm(),this.button.disabled=!1,this.buttonText.textContent=this.getButtonText("out_of_stock"),this.button.className=this.button.className.replace(/product__addToCartButton--\S+/g,""),this.button.classList.add("product__addToCartButton--out-of-stock"),this.updateTopCopy("out_of_stock")}showNotifyEmailInlineForm(){this.removeNotifyEmailInlineForm(),this.button&&(this.button.style.display="none"),this.inlineFormContainer=document.createElement("div"),this.inlineFormContainer.className="notify-email-inline-form",this.inlineFormContainer.innerHTML=`
2      <div class="flex gap-2">
3        <input
4          type="email"
5          name="email"
6          class="notify-email-inline-input"
7          placeholder="Email Address"
8          autocomplete="email"
9          required
10          data-notify-email-inline-input
11          aria-label="Email address"
12        />
13        <button
14        type="button"
15        class="notify-email-inline-submit btn btn-lg btn-primary-asphalt"
16        data-notify-email-inline-submit
17        aria-label="Submit email notification"
18        >
19        <span data-notify-email-inline-submit-text>Submit</span>
20      </button>
21      </div>
22      <div class="notify-email-inline-error hidden m-2" data-notify-email-inline-error role="alert">
23        <span data-notify-email-inline-error-text></span>
24      </div>
25      <div class="notify-email-inline-message hidden" data-notify-email-inline-message role="alert">
26        <span data-notify-email-inline-message-text></span>
27      </div>
28    `,this.button&&this.button.parentNode?this.button.parentNode.insertBefore(this.inlineFormContainer,this.button.nextSibling):this.appendChild(this.inlineFormContainer),this.setupNotifyEmailInlineForm()}removeNotifyEmailInlineForm(){this.inlineFormContainer&&this.inlineFormContainer.parentNode&&(this.inlineFormContainer.parentNode.removeChild(this.inlineFormContainer),this.inlineFormContainer=null),this.button&&(this.button.style.display="")}handleBisContainerState(){if(this.bundleItems){this.removeBisContainer(),this.removeNotifyEmailInlineForm(),this.button.disabled=!1,this.buttonText.textContent=this.getButtonText("out_of_stock"),this.button.className=this.button.className.replace(/product__addToCartButton--\S+/g,""),this.button.classList.add("product__addToCartButton--out-of-stock"),this.updateTopCopy("out_of_stock");return}this.removeNotifyEmailInlineForm(),this.showBisContainer()}showBisContainer(){this.removeBisContainer(),this.button&&(this.button.style.display="none");const variantId=this.currentVariant?.id||this.dataset.selectedVariantId;if(!variantId){console.warn("[ProductAddToCart] No variant ID available for BIS container");return}this.bisContainer=document.createElement("div"),this.bisContainer.innerHTML=`
29      <div id="ps__bis_target_container"></div>
30      <div id="current-variant" style="display: none">${variantId}</div>
31    `,this.button&&this.button.parentNode?this.button.parentNode.insertBefore(this.bisContainer,this.button.nextSibling):this.appendChild(this.bisContainer)}removeBisContainer(){this.bisContainer&&this.bisContainer.parentNode&&(this.bisContainer.parentNode.removeChild(this.bisContainer),this.bisContainer=null),this.button&&(this.button.style.display="")}setupNotifyEmailInlineForm(){if(!this.inlineFormContainer)return;const input=this.inlineFormContainer.querySelector("[data-notify-email-inline-input]"),submitBtn=this.inlineFormContainer.querySelector("[data-notify-email-inline-submit]"),errorDiv=this.inlineFormContainer.querySelector("[data-notify-email-inline-error]"),messageDiv=this.inlineFormContainer.querySelector("[data-notify-email-inline-message]");!input||!submitBtn||(this.notifyEmailInlineFormHandler&&(submitBtn.removeEventListener("click",this.notifyEmailInlineFormHandler),input.removeEventListener("keypress",this.notifyEmailInlineFormKeyHandler)),this.notifyEmailInlineFormHandler=event=>{event.preventDefault(),this.handleNotifyEmailSubmit(input,submitBtn,errorDiv,messageDiv,!0)},this.notifyEmailInlineFormKeyHandler=event=>{event.key==="Enter"&&(event.preventDefault(),this.handleNotifyEmailSubmit(input,submitBtn,errorDiv,messageDiv,!0))},submitBtn.addEventListener("click",this.notifyEmailInlineFormHandler),input.addEventListener("keypress",this.notifyEmailInlineFormKeyHandler))}updateTopCopy(state){if(!this.topCopy)return;const topCopyElement=this.topCopy;state==="out_of_stock"?(topCopyElement.textContent="Out of stock!",topCopyElement instanceof HTMLElement&&(topCopyElement.style.color="var(--color-cherry)")):this.originalTopCopyContent?(topCopyElement.innerHTML=this.originalTopCopyContent,topCopyElement instanceof HTMLElement&&(topCopyElement.style.color="")):(topCopyElement.textContent="",topCopyElement instanceof HTMLElement&&(topCopyElement.style.color=""))}updateHurryMessage(variant){if(!this.hurryMessage)return;if(variant&&variant.inventory_policy==="deny"&&variant.inventory_quantity>0&&variant.inventory_quantity<100?this.hurryMessage.removeAttribute("hidden"):this.hurryMessage.setAttribute("hidden",""),this.buttonText&&this.button){const currentState=this.getCurrentButtonState();if(currentState==="default"){const newText=this.getButtonText(currentState);this.buttonText.textContent=newText,this.button.setAttribute("aria-label",newText)}}}getButtonText(state){const settings={default:this.dataset.buttonTextDefault??"Add to Cart",preOrder:this.dataset.buttonTextPreOrder??"Pre-Order",subscribe:this.dataset.buttonTextSubscribe??"Subscribe",outOfStockUs:this.dataset.buttonTextOutOfStockUs??"Notify me via text",outOfStockInternational:this.dataset.buttonTextOutOfStockInternational??"Notify me via email",soldOut:this.dataset.buttonTextSoldOut??"Sold Out",urgencyLabel:this.dataset.buttonTextUrgencyLabel??"get it before it's gone"};if(state==="default"&&this.hurryMessage&&!this.hurryMessage.hasAttribute("hidden"))return settings.urgencyLabel;let outOfStockText;return state==="out_of_stock"&&this.bundleItems||state==="out_of_stock"&&this.useKlaviyoWaitlist&&this.isUs?outOfStockText=settings.outOfStockInternational:outOfStockText=this.isUs?settings.outOfStockUs:settings.outOfStockInternational,{pre_order:settings.preOrder,subscribe:settings.subscribe,out_of_stock:outOfStockText,sold_out:settings.soldOut}[state]??settings.default}
31formatPrice(priceInCents){if(isNaN(priceInCents)||priceInCents===null)return{floor:"",sup:""};const floor=Math.floor(priceInCents/100),sup=priceInCents%100;return{floor:`${this.currencySymbol}${floor}`,sup:String(sup).padStart(2,"0")}}formatPriceDisplay(variant){if(!variant||variant.price===null)return"";const priceFormatted=this.formatPrice(variant.price),priceSup=parseInt(priceFormatted.sup,10),productId=this.productId??"",priceHtml=`<span class="igPrice" data-product-id="${productId}">${priceFormatted.floor}${priceSup>0?`<sup class="top-[-0.2em]">${priceFormatted.sup}</sup>`:""}</span>`,{compare_at_price:compareAtPrice,price}=variant;if(compareAtPrice&&compareAtPrice>price&&compareAtPrice>0){const comparePriceFormatted=this.formatPrice(compareAtPrice),comparePriceSup=parseInt(comparePriceFormatted.sup,10),comparePriceHtml=`<span class="text-(--color-gray-accessible) text-12-regular line-through decoration-white compareAtPrice"><span class="igComparePrice text-white" data-product-id="${productId}">${comparePriceFormatted.floor}${comparePriceSup>0?`<sup class="top-[-0.3em]">${comparePriceFormatted.sup}</sup>`:""}</span></span>`;return`${priceHtml} ${comparePriceHtml}`}return priceHtml}getBundleButtonState(){return!this.bundleItems||this.bundleItems.length===0?"sold_out":this.bundleItems.some(item=>item.inventory_policy==="continue")?"pre_order":this.dataset.subscriptionMode==="subscribe"||this.bundleItems.some(item=>item.requires_selling_plan===!0)?"subscribe":this.bundleItems.every(item=>!item.inventory_management||item.inventory_management===""||item.inventory_management!=="shopify")||this.bundleItems.every(item=>item.available&&item.inventory_quantity>0&&item.inventory_policy==="deny")?"default":this.bundleItems.some(item=>(!item.available||item.inventory_quantity<=0&&item.inventory_policy==="deny")&&item.inventory_policy==="deny")?this.bundleItems.some(item=>item.has_sold_out_tag===!0)?"sold_out":"out_of_stock":"sold_out"}getButtonState(variant){return variant?variant.inventory_policy==="continue"?"pre_order":this.dataset.subscriptionMode==="subscribe"||variant.requires_selling_plan===!0?"subscribe":!variant.inventory_management||variant.inventory_management===""||variant.inventory_management!=="shopify"||variant.available&&variant.inventory_quantity>0&&variant.inventory_policy==="deny"?"default":(!variant.available||variant.inventory_quantity<=0&&variant.inventory_policy==="deny")&&variant.inventory_policy==="deny"?variant.has_sold_out_tag===!0?"sold_out":"out_of_stock":"sold_out":"sold_out"}async handleAddToCartClick(event){if(event.preventDefault(),this.isAddingToCart)return;const currentState=this.getCurrentButtonState();if(currentState==="pre_order"){this.showPreOrderModal();return}if(currentState==="out_of_stock"&&(this.bundleItems||!this.isUs||this.useKlaviyoWaitlist)){window.innerWidth<768?this.showNotifyEmailModal():this.showNotifyEmailInlineForm();return}if(this.enableSafetyRating&&!this.isUs&&(currentState==="default"||currentState==="subscribe")){this.showSafetyRatingModal();return}await this.addToCart()}getCurrentButtonState(){return this.bundleItems?this.getBundleButtonState():this.currentVariant?this.getButtonState(this.currentVariant):"sold_out"}showPreOrderModal(){const modal=document.querySelector("#pre-order-modal");if(!modal){console.warn("[ProductAddToCart] Pre-order modal not found");return}const confirmButton=modal.querySelector("[data-pre-order-confirm]"),confirmButtonText=modal.querySelector("[data-pre-order-confirm-text]");if(confirmButton&&confirmButtonText){const defaultText=this.dataset.buttonTextDefault??"Add to Cart";confirmButtonText.textContent=defaultText}if(typeof modal.showDialog=="function")modal.showDialog();else{const dialog=modal.querySelector("dialog");dialog&&typeof dialog.showModal=="function"&&dialog.showModal()}this.setupPreOrderModalConfirm(modal)}setupPreOrderModalConfirm(modal){const confirmButton=modal.querySelector("[data-pre-order-confirm]");if(!confirmButton)return;this.preOrderConfirmHandler&&confirmButton.removeEventListener("click",this.preOrderConfirmHandler),this.preOrderConfirmHandler=async event=>{if(event.preventDefault(),event.stopPropagation(),typeof modal.closeDialog=="function")await modal.closeDialog();else{const dialog=modal.querySelector("dialog");dialog&&typeof dialog.close=="function"&&dialog.close()}await this.addToCart()},confirmButton.addEventListener("click",this.preOrderConfirmHandler);const cleanup=()=>{this.preOrderConfirmHandler&&(confirmButton.removeEventListener("click",this.preOrderConfirmHandler),modal.removeEventListener("dialog:close",cleanup))};modal.addEventListener("dialog:close",cleanup,{once:!0})}showNotifyEmailModal(){const modal=document.querySelector("#notify-me-email-modal");if(!modal){console.warn("[ProductAddToCart] Notify me email modal not found");return}if(typeof modal.showDialog=="function")modal.showDialog();else{const dialog=modal.querySelector("dialog");dialog&&typeof dialog.showModal=="function"&&dialog.showModal()}this.setupNotifyEmailModalForm(modal)}setupNotifyEmailModalForm(modal){const form=modal.querySelector("[data-notify-email-form]"),input=modal.querySelector("[data-notify-email-input]"),submitBtn=modal.querySelector("[data-notify-email-submit]"),errorDiv=modal.querySelector("[data-notify-email-error]"),messageDiv=modal.querySelector("[data-notify-email-message]");!form||!input||!submitBtn||(this.notifyEmailFormHandler&&form.removeEventListener("submit",this.notifyEmailFormHandler),this.notifyEmailFormHandler=event=>{event.preventDefault(),this.handleNotifyEmailSubmit(input,submitBtn,errorDiv,messageDiv,!1)},form.addEventListener("submit",this.notifyEmailFormHandler))}async handleNotifyEmailSubmit(input,submitBtn,errorDiv,messageDiv,isInline){const email=input.value.trim();if(errorDiv&&errorDiv.classList.add("hidden"),messageDiv&&messageDiv.classList.add("hidden"),!email){this.showNotifyEmailError("Please enter an email address.",errorDiv,messageDiv);return}if(!this.validateEmail(email)){this.showNotifyEmailError("Please enter a valid email address.",errorDiv,messageDiv);return}const submitText=submitBtn.querySelector("[data-notify-email-submit-text]")||submitBtn.querySelector("[data-notify-email-inline-submit-text]"),originalText=submitText?submitText.textContent:submitBtn.textContent;submitText?submitText.textContent="Submitting...":submitBtn.textContent="Submitting...",submitBtn.disabled=!0;try{let variantId=null;if(this.bundleItems?variantId=this.bundleItems.find(item=>(!item.available||item.inventory_quantity<=0&&item.inventory_policy==="deny")&&item.inventory_policy==="deny")?.id||null:variantId=this.currentVariant?.id||this.dataset.selectedVariantId,!variantId){this.showNotifyEmailError("Variant information is not available.",errorDiv,messageDiv),submitText?submitText.textContent=originalText:submitBtn.textContent=originalText,submitBtn.disabled=!1;return}const middlewareBase=window.BWWMiddleware?.baseUrl;if(!middlewareBase){this.showNotifyEmailError("Unable to subscribe right now.",errorDiv,messageDiv),console.warn("[BIS] window.BWWMiddleware.baseUrl is unset \u2014 check the Middleware Base URL theme setting"),submitText?submitText.textContent=originalText:submitBtn.textContent=originalText,submitBtn.disabled=!1;return}const url=`${middlewareBase}/bis/subscribe`,requestOptions={method:"POST",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({email,variant_id:String(variantId)})},response=await fetch(url,requestOptions),result=await response.json().catch(()=>({}));if(response.ok){if(this.showNotifyEmailSuccess("Thanks for signing up.",errorDiv,messageDiv),input.value="",!isInline){const modal=document.querySelector("#notify-me-email-modal");modal&&typeof modal.closeDialog=="function"&&setTimeout(()=>{modal.closeDialog()},2e3)}}else this.showNotifyEmailError(result.message||"An error occurred. Please try again",errorDiv,messageDiv)}catch(error){console.error("[ProductAddToCart] Notify email error:",error),this.showNotifyEmailError("An error occurred. Please try again",errorDiv,messageDiv)}finally{submitText?submitText.textContent=originalText:submitBtn.textContent=originalText,submitBtn.disabled=!1}}
31showNotifyEmailError(message,errorDiv,messageDiv){if(errorDiv){const errorText=errorDiv.querySelector("[data-notify-email-error-text]")||errorDiv.querySelector("[data-notify-email-inline-error-text]");errorText&&(errorText.textContent=message),errorDiv.classList.remove("hidden")}messageDiv&&messageDiv.classList.add("hidden")}showNotifyEmailSuccess(message,errorDiv,messageDiv){if(errorDiv&&errorDiv.classList.add("hidden"),messageDiv){const messageText=messageDiv.querySelector("[data-notify-email-message-text]");messageText?messageText.textContent=message:messageDiv.textContent=message,messageDiv.classList.remove("hidden"),messageDiv.classList.remove("error"),messageDiv.classList.add("success")}}validateEmail(email){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)}showSafetyRatingModal(){const modal=document.querySelector("#safety-rating-modal");if(!modal){console.warn("[ProductAddToCart] Safety rating modal not found");return}if(typeof modal.showDialog=="function")modal.showDialog();else{const dialog=modal.querySelector("dialog");dialog&&typeof dialog.showModal=="function"&&dialog.showModal()}this.setupSafetyRatingModalConfirm(modal)}setupSafetyRatingModalConfirm(modal){const confirmButton=modal.querySelector("[data-safety-rating-confirm]");if(!confirmButton)return;this.safetyRatingConfirmHandler&&confirmButton.removeEventListener("click",this.safetyRatingConfirmHandler),this.safetyRatingConfirmHandler=async event=>{if(event.preventDefault(),event.stopPropagation(),typeof modal.closeDialog=="function")await modal.closeDialog();else{const dialog=modal.querySelector("dialog");dialog&&typeof dialog.close=="function"&&dialog.close()}await this.addToCart(!0)},confirmButton.addEventListener("click",this.safetyRatingConfirmHandler);const cleanup=()=>{this.safetyRatingConfirmHandler&&(confirmButton.removeEventListener("click",this.safetyRatingConfirmHandler),modal.removeEventListener("dialog:close",cleanup))};modal.addEventListener("dialog:close",cleanup,{once:!0})}hasRegisteredBundleSlot(selector){if(typeof selector.getBundleItemTrackingId!="function")return!1;const trackingId=selector.getBundleItemTrackingId();return(this.bundleItems||[]).some(item=>item&&item.id&&item._selector_id===trackingId)}reconcileBundleItems(){const showcases=Array.from(document.querySelectorAll("bundle-showcase-component"));let healed=!1;for(const showcase of showcases){const selector=showcase.querySelector("product-option-selectors");if(selector&&!this.hasRegisteredBundleSlot(selector)&&typeof selector.registerBundleSlot=="function")try{selector.registerBundleSlot(),healed=!0}catch(error){console.error("[ProductAddToCart] Could not register bundle slot:",error)}}if(healed)try{this.bundleItems=JSON.parse(this.dataset.items||"[]")}catch(error){console.warn("[ProductAddToCart] Invalid data-items JSON after reconcile",error)}for(let index=0;index<showcases.length;index+=1)this.recoverBundleLineFromDom(showcases[index],index)}recoverBundleLineFromDom(showcase,index){const items=this.bundleItems||[],selector=showcase.querySelector("product-option-selectors"),trackingId=selector&&typeof selector.getBundleItemTrackingId=="function"?selector.getBundleItemTrackingId():null;if(trackingId&&items.some(item=>item&&item._selector_id===trackingId))return!1;const productId=selector&&selector.productId;if(!trackingId&&productId&&items.some(item=>item&&String(item.product_id)===String(productId)))return!1;const input=showcase.querySelector("[data-variant-id-input]"),variantId=input&&input.value?parseInt(input.value,10):NaN;if(!Number.isFinite(variantId)||variantId<=0)return!1;const properties={};try{if(selector&&typeof selector.getFitProperty=="function"){const fit=selector.getFitProperty();fit&&(properties.Fit=fit)}}catch(error){console.warn("[ProductAddToCart] Could not read Fit for a recovered slot",error)}return showcase.querySelector('[data-gender="women"].productOptions__genderTab--isActive')&&(properties._women_size_selected=!0),this.bundleItems=items.concat([{id:variantId,product_id:productId||null,_selector_id:trackingId||`dom:${index}`,properties}]),console.warn("[ProductAddToCart] Recovered an unregistered bundle slot from the DOM",{variantId,productId:productId||null,slot:index}),!0}reportIncompleteBundle(expected,lines){const detail={expected,registered:lines.length,registeredIds:lines.map(line=>line.id),path:window.location.pathname};console.error("[ProductAddToCart] Blocked an incomplete bundle add:",detail),document.dispatchEvent(new CustomEvent("bundle:incomplete-blocked",{detail}))}async addToCart(includeSafetyRating=!1){if(!this.isAddingToCart){if(!this.bundleItems&&!this.currentVariant){console.warn("[ProductAddToCart] No items to add.");return}this.isAddingToCart=!0,this.button&&(this.button.disabled=!0,this.buttonText&&(this.buttonText.textContent="Adding..."));try{let payload={},source="product";if(this.bundleItems){source="bundle",this.reconcileBundleItems();let bundleProperties={};const bundleAtcComponent=document.querySelector("bundle-atc-component");bundleAtcComponent&&typeof bundleAtcComponent.collectBundleProperties=="function"&&(bundleProperties=bundleAtcComponent.collectBundleProperties()),includeSafetyRating&&(bundleProperties._enable_safety_rating=!0);const bundleLines=this.bundleItems.filter(item=>item&&item.id),slotCount=document.querySelectorAll("bundle-showcase-component").length;if(slotCount>0&&bundleLines.length<slotCount)throw this.reportIncompleteBundle(slotCount,bundleLines),new Error("We couldn't add every item in this bundle. Please refresh the page and try again.");if(bundleLines.length===0)throw new Error("We couldn't add this bundle. Please refresh the page and try again.");bundleProperties._bundle_ids=bundleLines.map(line=>String(line.id)).join(","),payload={items:bundleLines.map(item=>({id:item.id,quantity:1,properties:{...withCompareAtProps(item.properties,item.price,item.compare_at_price),...bundleProperties},selling_plan:item.selling_plan||null}))}}else{let properties={};try{this.dataset.cartProperties&&(properties=JSON.parse(this.dataset.cartProperties))}catch(e){console.warn("Error parsing properties",e)}includeSafetyRating&&(properties._enable_safety_rating=!0),properties=withCompareAtProps(properties,this.currentVariant.price,this.currentVariant.compare_at_price);const sellingPlanId=this.dataset.sellingPlanId?parseInt(this.dataset.sellingPlanId,10):null;payload={items:[{id:this.currentVariant.id,quantity:1,properties,selling_plan:sellingPlanId||null}]}}await this.addToCartAndOpenDrawer(payload,source)}catch(error){console.error("[ProductAddToCart] Error:",error),alert(error?.message??"Failed to add to cart.")}finally{if(this.isAddingToCart=!1,this.button&&(this.button.disabled=!1),this.bundleItems)this.setButtonState("default");else{const state=this.getButtonState(this.currentVariant);this.setButtonState(state)}}}}async addToCartAndOpenDrawer(payload,source="product"){document.dispatchEvent(new CustomEvent("cart:add-start"));try{const utils=window.GwpCartUtils;if(utils?.getItemsToBundle&&payload.items){let addingPrice=0;for(const item of payload.items){let unitPrice=0;if(this.currentVariant&&item.id===this.currentVariant.id)unitPrice=this.currentVariant.price||0;else if(this.bundleItems){const match=this.bundleItems.find(b=>b.id===item.id);match&&(unitPrice=match.price||0)}addingPrice+=unitPrice*(item.quantity||1)}
31const gwpItems=utils.getItemsToBundle(addingPrice);for(const gi of gwpItems)payload.items.some(pi=>pi.id===gi.id)||payload.items.push(gi)}}catch{}const cartItemsComponents=document.querySelectorAll("cart-items-component"),sectionsToUpdate=new Set;cartItemsComponents.forEach(item=>{item instanceof HTMLElement&&item.dataset.sectionId&&sectionsToUpdate.add(item.dataset.sectionId)}),sectionsToUpdate.size>0&&(payload.sections=Array.from(sectionsToUpdate).join(","),payload.sections_url=window.location.pathname);const response=await fetch(window.Shopify.routes.root+"cart/add.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload)});if(!response.ok){const errorData=await response.json();throw new Error(errorData.description||"Failed to add items to cart")}const cartData=await response.json(),sections=cartData.sections||{};for(const cartSectionId of sectionsToUpdate)sections[cartSectionId]&&morphSection(cartSectionId,sections[cartSectionId]);const sectionId=this.dataset.sectionId||"product-section",cartAddEvent=new CartAddEvent(cartData,sectionId,{source,itemCount:cartData.item_count,sections});return document.dispatchEvent(cartAddEvent),cartData}}customElements.get("product-add-to-cart")||customElements.define("product-add-to-cart",ProductAddToCart);
32//# sourceMappingURL=/cdn/shop/t/780/assets/product-add-to-cart.js.map?v=89927951654343636121790571591

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.