1(function(){"use strict";class StickyPdpForm{constructor(section){if(this.section=section,this.productHandle=this.section.dataset.productHandle||null,!this.productHandle){console.warn("StickyPdpForm: Product handle is not defined");return}if(this.product=null,this.currentVariant=null,this.mainProductSection=document.querySelector(".main-product-section"),this.footer=document.querySelector(".section-footer"),!this.mainProductSection){console.warn("StickyPdpForm: Main product section not found");return}this.elements={productTitle:this.section.querySelector("[data-product-title]"),variantImage:this.section.querySelector("[data-variant-image]"),priceComponent:this.section.querySelector(".product-price"),compareAtPrice:this.section.querySelector("[data-compare-price]"),productPrice:this.section.querySelector("[data-product-price]"),quantityInput:this.section.querySelector("[data-product-quantity]"),addToCartButton:this.section.querySelector("[data-add-to-cart]"),addToCartButtonText:this.section.querySelector("[data-add-to-cart-text]"),buttonPrice:this.section.querySelector("[data-button-price]"),variantInputs:this.section.querySelectorAll("[data-variant-input]"),variantIdSelect:this.section.querySelector("[data-product-select]"),form:this.section.querySelector("form"),toggleButton:this.section.querySelector("[data-toggle-button]"),formBody:this.section.querySelector("[data-form-body]")},this.mainQuantityInput=this.mainProductSection?.querySelector("[data-product-quantity]"),this.isExpanded=!1,this.closeTimeout=null,this.focusableElements=[],this.firstFocusableElement=null,this.lastFocusableElement=null,this.isAjaxFormInitialized=!1,this.isProcessingUpsells=!1,this.init()}init(){this.fetchProductData(),this.initializeScrollObserver(),this.initializeFooterObserver(),this.listenToMainProductVariantChanges(),this.initThemeVariants(),this.initializeToggle(),this.initAjaxProductForm(),this.initQuantitySync()}initAjaxProductForm(){if(this.isAjaxFormInitialized){console.log("\u26A0\uFE0F StickyPdpForm: AJAX form initialization already started");return}if(this.isAjaxFormInitialized=!0,!window.theme||!window.theme.AjaxProduct){let intervalCleared=!1;const checkTheme=setInterval(()=>{intervalCleared||window.theme&&window.theme.AjaxProduct&&(intervalCleared=!0,clearInterval(checkTheme),this.setupAjaxForm())},50);setTimeout(()=>{intervalCleared=!0,clearInterval(checkTheme)},5e3);return}this.setupAjaxForm()}setupAjaxForm(){if(!this.elements.form||!window.theme?.AjaxProduct)return;if(this.elements.form.dataset.ajaxProductActive){console.log("\u26A0\uFE0F StickyPdpForm: Form already has AjaxProduct initialized, skipping");return}this.elements.form.dataset.ajaxProductActive="true";const cartType=window.theme.settings?.cartType;!!document.querySelector('.component-product-upsells[data-upsell-mode="toggle"]')?(this.boundFormSubmitHandler=this.handleFormSubmitWithUpsells.bind(this),this.elements.form.addEventListener("submit",this.boundFormSubmitHandler,!0),console.log("\u2705 StickyPdpForm: Upsell handler attached (form has upsells)"),new window.theme.AjaxProduct(this.elements.form)):(new window.theme.AjaxProduct(this.elements.form),console.log("\u2705 StickyPdpForm: AjaxProduct initialized (cartType:",cartType,")")),cartType==="drawer"&&this.elements.form.addEventListener("ajaxProduct:added",()=>{setTimeout(()=>{this.closeForm()},200)})}handleFormSubmitWithUpsells(evt){if(this.isProcessingUpsells){console.log("\u26A0\uFE0F StickyPdpForm: Already processing, ignoring duplicate submit"),evt.preventDefault(),evt.stopImmediatePropagation();return}const checkedUpsells=this.getCheckedUpsells();checkedUpsells.length!==0&&(evt.preventDefault(),evt.stopPropagation(),evt.stopImmediatePropagation(),this.addProductsWithUpsellsToCart(checkedUpsells))}getCheckedUpsells(){const upsellContainer=document.querySelector('.component-product-upsells[data-upsell-mode="toggle"]');if(!upsellContainer)return[];const checkboxes=upsellContainer.querySelectorAll(".js-upsell-toggle:checked");return Array.from(checkboxes).map(checkbox=>({id:checkbox.dataset.variantId,quantity:1}))}async addProductsWithUpsellsToCart(upsells){const addToCartBtn=this.elements.addToCartButton;if(addToCartBtn){if(this.isProcessingUpsells){console.log("\u26A0\uFE0F StickyPdpForm: Already adding to cart, ignoring duplicate request");return}this.isProcessingUpsells=!0,addToCartBtn.classList.add("is-loading"),addToCartBtn.disabled=!0;try{const formData=new FormData(this.elements.form),mainProductId=formData.get("id"),mainProductQuantity=formData.get("quantity")||1,items=[{id:parseInt(mainProductId),quantity:parseInt(mainProductQuantity)},...upsells.map(upsell=>({id:parseInt(upsell.id),quantity:parseInt(upsell.quantity)}))],response=await fetch(theme.routes.cartAdd,{method:"POST",headers:{"Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},body:JSON.stringify({items})}),data=await response.json();data.status===422||!response.ok?this.handleUpsellError(data):this.handleUpsellSuccess(data)}catch(error){console.error("StickyPdpForm: Error adding products to cart:",error),this.handleUpsellError({description:"An error occurred. Please try again."})}finally{addToCartBtn.classList.remove("is-loading"),addToCartBtn.disabled=!1,this.isProcessingUpsells=!1}}}handleUpsellSuccess(data){const errors=this.elements.form.querySelector(".errors");errors&&errors.remove(),this.elements.form.dispatchEvent(new CustomEvent("ajaxProduct:added",{detail:{product:d
1ata.items?data.items[0]:data,addToCartBtn:this.elements.addToCartButton},bubbles:!0})),document.body.classList.contains("template-cart")&&(window.scrollTo(0,0),location.reload())}handleUpsellError(error){const errorMessage=error.description||error.message||"An error occurred",existingErrors=this.elements.form.querySelector(".errors");existingErrors&&existingErrors.remove();const errorDiv=document.createElement("div");errorDiv.classList.add("errors","text-center"),errorDiv.textContent=errorMessage,this.elements.form.append(errorDiv),this.elements.form.dispatchEvent(new CustomEvent("ajaxProduct:error",{detail:{errorMessage},bubbles:!0}))}initQuantitySync(){this.elements.quantityInput&&(this.elements.quantityInput.addEventListener("change",e=>{const newQuantity=e.target.value;this.mainQuantityInput&&this.mainQuantityInput.value!==newQuantity&&(this.mainQuantityInput.value=newQuantity,this.mainQuantityInput.dispatchEvent(new Event("change",{bubbles:!0})))}),this.mainQuantityInput&&this.mainQuantityInput.addEventListener("change",e=>{const newQuantity=e.target.value;this.elements.quantityInput&&this.elements.quantityInput.value!==newQuantity&&(this.elements.quantityInput.value=newQuantity)}))}initializeToggle(){this.elements.toggleButton&&(this.elements.toggleButton.addEventListener("click",()=>{this.toggleForm()}),document.addEventListener("click",e=>{this.isExpanded&&!this.section.contains(e.target)&&this.closeForm()}),this.handleKeyboardNavigation=this.handleKeyboardNavigation.bind(this))}handleKeyboardNavigation(e){if(this.isExpanded){if(e.key==="Escape"){this.closeForm(),this.elements.toggleButton.focus();return}if(e.key==="Tab"){if(this.focusableElements.length===0)return;e.shiftKey?document.activeElement===this.firstFocusableElement&&(e.preventDefault(),this.lastFocusableElement.focus()):document.activeElement===this.lastFocusableElement&&(e.preventDefault(),this.firstFocusableElement.focus())}}}updateFocusableElements(){const focusableSelectors=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");this.focusableElements=Array.from(this.section.querySelectorAll(focusableSelectors)).filter(el=>el.offsetWidth>0||el.offsetHeight>0||el.getClientRects().length>0),this.firstFocusableElement=this.focusableElements[0],this.lastFocusableElement=this.focusableElements[this.focusableElements.length-1]}toggleForm(){this.isExpanded?this.closeForm():this.openForm()}openForm(){this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.isExpanded=!0,this.section.classList.add("is-expanded"),this.elements.toggleButton.setAttribute("aria-expanded","true"),this.elements.toggleButton.classList.add("is-outline"),this.elements.toggleButton.setAttribute("aria-label","Close options"),this.elements.backdrop&&(this.elements.backdrop.classList.add("is-visible"),this.elements.backdrop.setAttribute("aria-hidden","false")),requestAnimationFrame(()=>{this.updateFocusableElements(),document.addEventListener("keydown",this.handleKeyboardNavigation)}),requestAnimationFrame(()=>{const firstInput=this.elements.formBody?.querySelector("input, select, button");firstInput&&firstInput.focus()})}closeForm(){this.isExpanded&&(this.isExpanded=!1,this.elements.toggleButton.setAttribute("aria-expanded","false"),this.elements.toggleButton.setAttribute("aria-label","View options"),this.elements.toggleButton.classList.remove("is-outline"),this.elements.backdrop&&(this.elements.backdrop.classList.remove("is-visible"),this.elements.backdrop.setAttribute("aria-hidden","true")),document.removeEventListener("keydown",this.handleKeyboardNavigation),this.closeTimeout=setTimeout(()=>{this.section.classList.remove("is-expanded"),this.closeTimeout=null},150))}async fetchProductData(){try{const response=await fetch(`/products/${this.productHandle}.js`);this.product=await response.json();const mainVariantSelect=this.mainProductSection?.querySelector("[data-product-select]");if(mainVariantSelect&&mainVariantSelect.value){const mainVariantId=parseInt(mainVariantSelect.value,10),mainVariant=this.product.variants.find(v=>v.id===mainVariantId);
1if(mainVariant){this.currentVariant=mainVariant,this.updateVariantInfo(mainVariant),console.log("\u2705 StickyPdpForm: Synced with main product variant",mainVariant.id);return}}this.currentVariant=this.product.variants.find(v=>v.available)||this.product.variants[0]}catch(error){console.error("StickyPdpForm: Error fetching product data",error)}}initializeScrollObserver(){new IntersectionObserver(entries=>{entries.forEach(entry=>{entry.isIntersecting?(this.section.classList.remove("is-visible"),document.body.classList.remove("sticky-pdp-form-is-visible")):(this.section.classList.add("is-visible"),document.body.classList.add("sticky-pdp-form-is-visible"))})},{root:null,threshold:.2}).observe(this.mainProductSection)}initializeFooterObserver(){if(!this.footer){console.warn("StickyPdpForm: Footer not found");return}new IntersectionObserver(entries=>{entries.forEach(entry=>{entry.isIntersecting?(this.section.classList.add("is-hidden-footer"),document.body.classList.remove("sticky-pdp-form-is-visible")):(this.section.classList.remove("is-hidden-footer"),this.section.classList.contains("is-visible")&&document.body.classList.add("sticky-pdp-form-is-visible"))})},{root:null,threshold:0}).observe(this.footer)}initThemeVariants(){if(this.elements.variantInputs.length===0||!this.elements.form)return;if(!this.section.querySelector("[data-variant-json]")){const mainVariantJson=this.mainProductSection?.querySelector("[data-variant-json]");if(mainVariantJson){const clonedJson=mainVariantJson.cloneNode(!0);this.section.appendChild(clonedJson)}}const variantsJsonEl=this.section.querySelector("[data-variant-json]");if(variantsJsonEl&&window.theme&&window.theme.Variants){const variantsObject=JSON.parse(variantsJsonEl.innerHTML),options={container:this.section,enableHistoryState:!1,singleOptionSelector:"[data-variant-input]",originalSelectorId:"[data-product-select]",variants:variantsObject,dynamicVariantsEnabled:!0};if(new window.theme.Variants(options),window.theme.VariantAvailability){const currentVariantJsonEl=this.section.querySelector("[data-current-variant-json]"),variantTypeEl=this.section.querySelector(".variant-wrapper");if(currentVariantJsonEl&&variantTypeEl)try{new window.theme.VariantAvailability({container:this.section,namespace:"",type:variantTypeEl.dataset.type,variantsObject,currentVariantObject:JSON.parse(currentVariantJsonEl.innerHTML)})}catch(error){console.warn("StickyPdpForm: Unable to initialise VariantAvailability",error)}}this.section.addEventListener("variantChange",event=>{event.detail&&event.detail.variant&&(this.currentVariant=event.detail.variant,this.updateVariantInfo(event.detail.variant),this.syncWithMainProduct(event.detail.variant))})}}listenToMainProductVariantChanges(){this.mainProductSection.addEventListener("variantChange",event=>{event.detail&&event.detail.variant&&this.updateFromMainProduct(event.detail.variant)}),document.addEventListener("variant:change",event=>{event.target===this.section||this.section.contains(event.target)||event.detail&&event.detail.variant&&this.updateFromMainProduct(event.detail.variant)}),this.mainProductSection.addEventListener("variantStickyBarChange",event=>{event.detail&&event.detail.variant&&this.updateFromMainProduct(event.detail.variant)})}updateFromMainProduct(variant){this.currentVariant=variant,this.updateVariantInputs(variant),this.updateVariantInfo(variant)}updateVariantInputs(variant){this.elements.variantInputs.forEach(input=>{const optionIndex=input.dataset.index,optionValue=variant[optionIndex];input.type==="radio"?input.value===optionValue&&(input.checked=!0):input.tagName==="SELECT"&&(input.value=optionValue)})}syncWithMainProduct(variant){const mainForm=this.mainProductSection.querySelector('form[action*="/cart/add"]');mainForm&&mainForm.querySelectorAll("[data-variant-input]").forEach(input=>{const optionIndex=input.dataset.index,optionValue=variant[optionIndex];input.type==="radio"&&input.value===optionValue&&(input.checked=!0,input.dispatchEvent(new Event("change",{bubbles:!0})))})}updateVariantInfo(variant){if(this.elements.variantIdSelect&&(this.elements.variantIdSelect.value=variant.id,console.log("\u2705 StickyPdpForm: Upd
1ated variant ID select to",variant.id)),this.elements.variantImage){let imageUrl=null;if(variant.featured_image&&variant.featured_image.src?imageUrl=variant.featured_image.src:variant.image&&(imageUrl=variant.image),imageUrl){const resizedUrl=imageUrl.replace(/\.(jpg|jpeg|png|gif|webp)/,"_80x80.$1");this.elements.variantImage.src=resizedUrl}}if(this.elements.productPrice&&(this.elements.productPrice.innerHTML=this.formatMoney(variant.price),variant.compare_at_price>variant.price?this.elements.productPrice.classList.add("product-price__price--on-sale"):this.elements.productPrice.classList.remove("product-price__price--on-sale")),this.elements.compareAtPrice){const compareWrap=this.elements.compareAtPrice.closest("[data-product-price-wrap]");variant.compare_at_price>variant.price?(this.elements.compareAtPrice.innerHTML=this.formatMoney(variant.compare_at_price),compareWrap&&compareWrap.classList.remove("hide")):compareWrap&&compareWrap.classList.add("hide")}if(this.elements.addToCartButton){const defaultText=this.elements.addToCartButtonText?.dataset.defaultText||"Add to cart",soldOutText=window.theme?.strings?.soldOut||"Sold out";variant.available?(this.elements.addToCartButton.disabled=!1,this.elements.addToCartButton.removeAttribute("disabled"),this.elements.addToCartButtonText?(this.elements.addToCartButtonText.textContent=defaultText,this.elements.addToCartButton.setAttribute("aria-label",this.elements.addToCartButtonText.textContent)):this.elements.addToCartButton.setAttribute("aria-label",defaultText),this.elements.buttonPrice&&(this.elements.buttonPrice.innerHTML=this.formatMoney(variant.price),this.elements.buttonPrice.style.display="")):(this.elements.addToCartButton.disabled=!0,this.elements.addToCartButton.setAttribute("disabled","disabled"),this.elements.addToCartButtonText?(this.elements.addToCartButtonText.textContent=soldOutText,this.elements.addToCartButton.setAttribute("aria-label",this.elements.addToCartButtonText.textContent)):this.elements.addToCartButton.setAttribute("aria-label",soldOutText),this.elements.buttonPrice&&(this.elements.buttonPrice.style.display="none"))}}formatMoney(cents){if(window.theme&&window.theme.Currency&&window.theme.Currency.formatMoney){const moneyFormat=window.theme.settings?.moneyFormat||"${{amount}}";return window.theme.Currency.formatMoney(cents,moneyFormat)}return`$${(cents/100).toFixed(2)}`}}function initStickyPdpForm(){const section=document.querySelector(".sticky-pdp-form");section&§ion.dataset.initialized!=="true"&&(new StickyPdpForm(section),section.dataset.initialized="true")}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",initStickyPdpForm):initStickyPdpForm(),document.addEventListener("shopify:section:load",function(event){const section=event.target.querySelector(".sticky-pdp-form");if(section){section.dataset.initialized="false";const form=section.querySelector("form");form&&(delete form.dataset.ajaxProductActive,delete form.dataset.ajaxProductInitialized),new StickyPdpForm(section),section.dataset.initialized="true"}})})(); 2//# sourceMappingURL=/cdn/shop/t/341/assets/section-sticky-pdp-form.js.map?v=93354755585380663501787562868
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.