{
  "version": 3,
  "sources": ["/cdn/shop/t/87/assets/product-form.js?qr_single_copy=20261008-1"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { fetchConfig, preloadImage, onAnimationEnd, yieldToMainThread } from '@theme/utilities';\nimport { cartPerformance } from '@theme/performance';\nimport { morph } from '@theme/morph';\nimport { CartLinesUpdateEvent, CartErrorEvent, ProductSelectEvent, StandardEvents } from '@shopify/events';\nimport { resolveVariantId } from '@theme/variant-resolution';\nimport { withSingleCopyAdd, SingleCopyCartError, singleCopyMessages } from '@theme/qr-cart-single-copy';\n\n// Error message display duration - gives users time to read the message\nconst ERROR_MESSAGE_DISPLAY_DURATION = 10000;\n\n// Button re-enable delay after error - prevents rapid repeat attempts\nconst ERROR_BUTTON_REENABLE_DELAY = 1000;\n\n// Success message display duration for screen readers\nconst SUCCESS_MESSAGE_DISPLAY_DURATION = 5000;\n\n/**\n * @typedef {HTMLElement & {\n *   source: Element,\n *   destination: Element,\n *   useSourceSize: string | boolean\n * }} FlyToCart\n */\n\n/**\n * A custom element that manages an add to cart button.\n *\n * @typedef {object} AddToCartRefs\n * @property {HTMLButtonElement} addToCartButton - The add to cart button.\n * @extends Component<AddToCartRefs>\n */\nexport class AddToCartComponent extends Component {\n  requiredRefs = ['addToCartButton'];\n\n  /** @type {number[] | undefined} */\n  #resetTimeouts = /** @type {number[]} */ ([]);\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    this.addEventListener('pointerenter', this.#preloadImage);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    if (this.#resetTimeouts) {\n      this.#resetTimeouts.forEach(/** @param {number} timeoutId */ (timeoutId) => clearTimeout(timeoutId));\n    }\n    this.removeEventListener('pointerenter', this.#preloadImage);\n  }\n\n  /**\n   * Disables the add to cart button.\n   */\n  disable() {\n    this.refs.addToCartButton.disabled = true;\n  }\n\n  /**\n   * Enables the add to cart button.\n   */\n  enable() {\n    this.refs.addToCartButton.disabled = false;\n  }\n\n  /**\n   * Handles the click event for the add to cart button.\n   * @param {MouseEvent & {target: HTMLElement}} event - The click event.\n   */\n  handleClick(event) {\n    const form = this.closest('form');\n    if (!form?.checkValidity()) return;\n  }\n\n  animateSuccessfulAdd() {\n    if (this.refs.addToCartButton.dataset.puppet === 'true') return;\n    if (this.dataset.addToCartAnimation === 'true' && !this.closest('.quick-add-modal')) {\n      this.#animateFlyToCart();\n    }\n    this.animateAddToCart();\n  }\n\n  #preloadImage = () => {\n    const image = this.dataset.productVariantMedia;\n\n    if (!image) return;\n\n    preloadImage(image);\n  };\n\n  /**\n   * Animates the fly to cart animation.\n   */\n  #animateFlyToCart() {\n    const { addToCartButton } = this.refs;\n    const cartIcon = document.querySelector('.header-actions__cart-icon');\n\n    const image = this.dataset.productVariantMedia;\n\n    if (!cartIcon || !addToCartButton || !image) return;\n\n    const flyToCartElement = /** @type {FlyToCart} */ (document.createElement('fly-to-cart'));\n\n    let flyToCartClass = addToCartButton.classList.contains('quick-add__button')\n      ? 'fly-to-cart--quick'\n      : 'fly-to-cart--main';\n\n    flyToCartElement.classList.add(flyToCartClass);\n    flyToCartElement.style.setProperty('background-image', `url(${image})`);\n    flyToCartElement.style.setProperty('--start-opacity', '0');\n    flyToCartElement.source = addToCartButton;\n    flyToCartElement.destination = cartIcon;\n\n    document.body.appendChild(flyToCartElement);\n  }\n\n  /**\n   * Animates the add to cart button.\n   */\n  animateAddToCart = async function () {\n    const { addToCartButton } = this.refs;\n\n    // Initialize the array if it doesn't exist\n    if (!this.#resetTimeouts) {\n      this.#resetTimeouts = [];\n    }\n\n    // Clear all existing timeouts\n    this.#resetTimeouts.forEach(/** @param {number} timeoutId */ (timeoutId) => clearTimeout(timeoutId));\n    this.#resetTimeouts = [];\n\n    if (addToCartButton.dataset.added !== 'true') {\n      addToCartButton.dataset.added = 'true';\n    }\n\n    // The onAnimationEnd can trigger a style recalculation so we yield to the main thread first.\n    await yieldToMainThread();\n    await onAnimationEnd(addToCartButton);\n\n    // Create new timeout and store it in the array\n    const timeoutId = setTimeout(() => {\n      addToCartButton.removeAttribute('data-added');\n\n      // Remove this timeout from the array\n      const index = this.#resetTimeouts.indexOf(timeoutId);\n      if (index > -1) {\n        this.#resetTimeouts.splice(index, 1);\n      }\n    }, 800);\n\n    this.#resetTimeouts.push(timeoutId);\n  };\n}\n\nif (!customElements.get('add-to-cart-component')) {\n  customElements.define('add-to-cart-component', AddToCartComponent);\n}\n\n/**\n * A custom element that manages a product form.\n *\n * @typedef {{items: Array<{quantity: number, variant_id: number}>}} Cart\n *\n * @typedef {object} ProductFormRefs\n * @property {HTMLInputElement} variantId - The form input for submitting the variant ID.\n * @property {AddToCartComponent | undefined} addToCartButtonContainer - The add to cart button container element.\n * @property {HTMLElement | undefined} addToCartTextError - The add to cart text error.\n * @property {HTMLElement | undefined} acceleratedCheckoutButtonContainer - The accelerated checkout button container element.\n * @property {HTMLElement} liveRegion - The live region.\n * @property {HTMLElement | undefined} quantityLabelCartCount - The quantity label cart count element.\n * @property {HTMLElement | undefined} quantityRules - The quantity rules element.\n * @property {HTMLElement | undefined} productFormButtons - The product form buttons container.\n * @property {HTMLElement | undefined} volumePricing - The volume pricing component.\n * @property {any | undefined} quantitySelector - The quantity selector component.\n * @property {HTMLElement | undefined} quantitySelectorWrapper - The quantity selector wrapper element.\n * @property {HTMLElement | undefined} quantityLabel - The quantity label element.\n * @property {HTMLElement | undefined} pricePerItem - The price per item component.\n *\n * @typedef {object} QueuedAddToCartItem\n * @property {number} quantity - The quantity captured when Add was clicked.\n * @property {number} generation - The variant-change generation active when Add was clicked.\n * @property {string | null} intendedVariantId - The selected option's data-variant-id, when present.\n * @property {Promise<unknown> | null} pendingVariantChange - The server-side section fetch for the clicked selection.\n * @property {string | null} variantResolutionUrl - A section-rendering URL that resolves the clicked selection.\n * @property {FormData} formData - The native form data captured for the clicked selection.\n * @property {string} productId - The product captured for the clicked selection.\n *\n * @typedef {object} QuantityConstraints\n * @property {string} min\n * @property {string | null} max\n * @property {string} step\n * @property {string | null} cartQuantity\n *\n * @extends Component<ProductFormRefs>\n */\nclass ProductFormComponent extends Component {\n  requiredRefs = ['variantId', 'liveRegion'];\n  #abortController = new AbortController();\n\n  /** @type {number | undefined} */\n  #timeout;\n\n  /** @type {HTMLElement | undefined} */\n  #singleCopyFeedback;\n\n  /** @type {boolean} */\n  #variantChangeInProgress = false;\n\n  /** @type {number} */\n  #variantChangeGeneration = 0;\n\n  /**\n   * Adds queued while a variant change is in flight. Each entry captures the selection state and\n   * generation active when Add was clicked, then resolves that selection at drain time.\n   * @type {QueuedAddToCartItem[]}\n   */\n  #addToCartQueue = [];\n\n  /**\n   * The in-flight variant-change section fetch promise. The queue drain awaits this before\n   * reading the resolved variant id.\n   * @type {Promise<unknown> | null}\n   */\n  #pendingVariantChange = null;\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    const { signal } = this.#abortController;\n    const target = this.closest('.shopify-section, dialog, product-card');\n    target?.addEventListener(StandardEvents.productSelect, this.#onProductSelect, { signal });\n\n    // Listen for cart updates to sync data-cart-quantity\n    document.addEventListener(StandardEvents.cartLinesUpdate, this.#onCartUpdate, { signal });\n    this.#applySingleCopyPurchaseControls();\n  }\n\n  updatedCallback() {\n    super.updatedCallback();\n    this.#applySingleCopyPurchaseControls();\n  }\n\n  #applySingleCopyPurchaseControls() {\n    this.refs.acceleratedCheckoutButtonContainer?.setAttribute('hidden', 'true');\n    this.refs.quantitySelector?.setValue?.('1');\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    this.#abortController.abort();\n    this.#singleCopyFeedback?.remove();\n  }\n\n  #getVariantIdInput() {\n    return /** @type {HTMLInputElement | null} */ (this.querySelector('input[name=\"id\"]'))?.value;\n  }\n\n  async #refreshCart() {\n    /** @type {import('@theme/component-cart-items').CartItemsComponent | null} */\n    const cartItemsComponent = document.querySelector('cart-items-component');\n\n    if (cartItemsComponent) {\n      await customElements.whenDefined('cart-items-component');\n      return cartItemsComponent.fetchCartData();\n    }\n\n    // Fallback for pages without cart-items-component (e.g. page-based cart on product pages)\n    return fetch(`${Theme.routes.cart_url}.json`, {\n      headers: { Accept: 'application/json' },\n      credentials: 'same-origin',\n    }).then((response) => {\n      if (!response.ok) throw new Error(`Failed to fetch cart: ${response.status}`);\n      return response.json();\n    });\n  }\n\n  /**\n   * Updates quantity selector with cart data for current variant\n   * @param {Cart} cart - The cart object with items array\n   */\n  #updateCartQuantity(cart) {\n    const variantIdInput = this.#getVariantIdInput();\n    if (!variantIdInput) return;\n\n    const cartItem = cart.items.find(\n      /** @param {any} item */\n      (item) => item.variant_id.toString() === variantIdInput.toString()\n    );\n    const cartQty = cartItem ? cartItem.quantity : 0;\n\n    // Use public API to update quantity selector\n    const quantitySelector =\n      /** @type {import('@theme/component-cart-quantity-selector').CartQuantitySelectorComponent | null} */ (\n        this.querySelector('quantity-selector-component')\n      );\n\n    if (quantitySelector?.setCartQuantity) {\n      quantitySelector.setCartQuantity(cartQty);\n      quantitySelector.setValue('1');\n    }\n\n    // Update quantity label if it exists\n    this.#updateQuantityLabel(cartQty);\n  }\n\n  /**\n   * Updates data-cart-quantity when cart is updated from elsewhere\n   * @param {CartLinesUpdateEvent} event\n   */\n  #onCartUpdate = async (event) => {\n    if (!this.#getVariantIdInput()) return;\n\n    event.promise\n      ?.then(({ detail }) => {\n        // Skip if this event came from this component\n        if (detail?.sourceId === this.id || detail?.source === 'product-form-component') return;\n\n        if (detail?.items) {\n          this.#updateCartQuantity(/** @type {Cart} */ ({ items: detail.items }));\n        } else {\n          this.#refreshCart().then((cart) => this.#updateCartQuantity(cart));\n        }\n      })\n      .catch((error) => {\n        if (error?.name !== 'AbortError') console.warn('[product-form] Event promise rejected:', error);\n      });\n  };\n\n  /** @param {Event} event */\n  handleSubmit(event) {\n    event.preventDefault();\n\n    if (this.#variantChangeInProgress) {\n      this.#addToCartQueue.push(this.#createQueuedAddToCartItem());\n      return;\n    }\n\n    return this.#processAddToCart(undefined, undefined, event);\n  }\n\n  /** @returns {number} */\n  #getQuantity() {\n    return 1;\n  }\n\n  /** @returns {QueuedAddToCartItem} */\n  #createQueuedAddToCartItem() {\n    const picker = this.#getVariantPicker();\n    const selectedOption = picker?.selectedOption;\n    const form = this.querySelector('form');\n    if (!form) throw new Error('Product form element missing');\n\n    return {\n      quantity: this.#getQuantity(),\n      formData: new FormData(form),\n      productId: this.dataset.productId,\n      generation: this.#variantChangeGeneration,\n      intendedVariantId: selectedOption?.dataset.variantId ?? null,\n      pendingVariantChange: this.#pendingVariantChange,\n      variantResolutionUrl: picker && selectedOption ? picker.buildRequestUrl(selectedOption) : null,\n    };\n  }\n\n  /**\n   * @param {string} [overrideVariantId]\n   * @param {number} [overrideQuantity]\n   * @param {Event} [event]\n   * @param {{formData: FormData, productId: string, quantityConstraints: QuantityConstraints | null}} [queuedItem]\n   */\n  #processAddToCart(overrideVariantId, overrideQuantity, event, queuedItem) {\n    const { addToCartTextError } = this.refs;\n\n    if (this.#timeout) clearTimeout(this.#timeout);\n\n    const allAddToCartContainers = /** @type {NodeListOf<AddToCartComponent>} */ (\n      this.querySelectorAll('add-to-cart-component')\n    );\n\n    if (!overrideVariantId) {\n      const anyButtonDisabled = Array.from(allAddToCartContainers).some(\n        (container) => container.refs.addToCartButton?.disabled\n      );\n      if (anyButtonDisabled) return;\n    }\n\n    const form = this.querySelector('form');\n    if (!form) throw new Error('Product form element missing');\n\n    const formData = queuedItem?.formData ?? new FormData(form);\n    if (overrideVariantId) formData.set('id', overrideVariantId);\n    formData.set('quantity', '1');\n    const constraints = queuedItem?.quantityConstraints ?? this.#getQuantityConstraintsFromHtml(this);\n    const productId = queuedItem?.productId ?? this.dataset.productId;\n\n    const cartItemsComponents = document.querySelectorAll('cart-items-component');\n    let cartItemComponentsSectionIds = [];\n    cartItemsComponents.forEach((item) => {\n      if (item instanceof HTMLElement && item.dataset.sectionId) {\n        cartItemComponentsSectionIds.push(item.dataset.sectionId);\n      }\n    });\n    formData.set('sections', cartItemComponentsSectionIds.join(','));\n\n    const itemCount = 1;\n    return withSingleCopyAdd({\n      productId,\n      variantId: String(formData.get('id') || ''),\n      constraints,\n      add: () => {\n        const deferredEventPromise = CartLinesUpdateEvent.createPromise();\n\n        this.dispatchEvent(\n          new CartLinesUpdateEvent({\n            action: 'add',\n            context: 'product',\n            lines: [\n              {\n                merchandiseId: /** @type {string} */ (formData.get('id')),\n                quantity: itemCount,\n              },\n            ],\n            promise: deferredEventPromise.promise,\n          })\n        );\n\n        const fetchCfg = fetchConfig('javascript', { body: formData });\n\n        return fetch(Theme.routes.cart_add_url, {\n          ...fetchCfg,\n          headers: {\n            ...fetchCfg.headers,\n            Accept: 'text/html',\n          },\n        })\n          .then((response) => response.json())\n          .then(async (response) => {\n            if (response.status) {\n              this.dispatchEvent(\n                new CartErrorEvent({\n                  error: response.message || 'Add to cart failed',\n                  code: 'INVALID',\n                  detail: {\n                    description: response.description,\n                    errors: response.errors,\n                  },\n                })\n              );\n\n              // Fetch the updated cart to get the actual total quantity for this variant\n              await this.#refreshCart()\n                .then((ajaxCart) =>\n                  deferredEventPromise.resolve({\n                    cart: CartLinesUpdateEvent.createCartFromAjaxResponse(ajaxCart),\n                    detail: {\n                      didError: true,\n                      items: ajaxCart.items,\n                      source: 'product-form-component',\n                      sourceId: this.id.toString(),\n                      itemCount,\n                      productId,\n                    },\n                  })\n                )\n                .catch(deferredEventPromise.reject);\n\n              if (!addToCartTextError) return;\n              addToCartTextError.classList.remove('hidden');\n\n              addToCartTextError.replaceChildren(document.createTextNode(response.message || response.description));\n\n              // Create or get existing error live region for screen readers\n              this.#setLiveRegionText(response.message);\n\n              this.#timeout = setTimeout(() => {\n                if (!addToCartTextError) return;\n                addToCartTextError.classList.add('hidden');\n\n                // Clear the announcement\n                this.#clearLiveRegionText();\n              }, ERROR_MESSAGE_DISPLAY_DURATION);\n\n              return;\n            } else {\n              const id = formData.get('id');\n              this.#singleCopyFeedback?.remove();\n              for (const container of allAddToCartContainers) container.animateSuccessfulAdd();\n\n              if (addToCartTextError) {\n                addToCartTextError.classList.add('hidden');\n                addToCartTextError.removeAttribute('aria-live');\n              }\n\n              if (!id) throw new Error('Form ID is required');\n\n              // Add aria-live region to inform screen readers that the item was added\n              // Get the added text from any add-to-cart button\n              const anyAddToCartButton = allAddToCartContainers[0]?.refs.addToCartButton;\n              if (anyAddToCartButton) {\n                const addedTextElement = anyAddToCartButton.querySelector('.add-to-cart-text--added');\n                const addedText = addedTextElement?.textContent?.trim() || Theme.translations.added;\n\n                this.#setLiveRegionText(addedText);\n\n                setTimeout(() => {\n                  this.#clearLiveRegionText();\n                }, SUCCESS_MESSAGE_DISPLAY_DURATION);\n              }\n\n              // Fetch the updated cart to get the actual total quantity for this variant\n              const cart = await this.#refreshCart()\n                .then((ajaxCart) => {\n                  deferredEventPromise.resolve({\n                    cart: CartLinesUpdateEvent.createCartFromAjaxResponse(ajaxCart),\n                    detail: {\n                      items: ajaxCart.items,\n                      source: 'product-form-component',\n                      sourceId: this.id.toString(),\n                      itemCount,\n                      productId,\n                      sections: response.sections,\n                      didError: false,\n                    },\n                  });\n\n                  if (this.#getVariantIdInput()) {\n                    this.#updateCartQuantity(ajaxCart);\n                  }\n\n                  return ajaxCart;\n                })\n                .catch(deferredEventPromise.reject);\n            }\n          })\n          .catch((error) => {\n            console.error(error);\n            deferredEventPromise.reject(error);\n\n            this.dispatchEvent(\n              new CartErrorEvent({\n                error: error?.message || 'Network error during add to cart',\n                code: 'SERVICE_UNAVAILABLE',\n              })\n            );\n          })\n          .finally(() => {\n            if (event) cartPerformance.measureFromEvent('add:user-action', event);\n          });\n      },\n    }).catch((error) => {\n      if (error instanceof SingleCopyCartError) {\n        this.#showSingleCopyNotice(error.code);\n        return;\n      }\n      this.#showSingleCopyNotice('cart_check_failed');\n    });\n  }\n\n  #showSingleCopyNotice(code) {\n    const message = singleCopyMessages[code] || singleCopyMessages.cart_check_failed;\n    let addToCartTextError = this.refs.addToCartTextError;\n    if (!addToCartTextError) {\n      this.#singleCopyFeedback?.remove();\n      addToCartTextError = document.createElement('p');\n      addToCartTextError.className = 'qr-single-copy-feedback';\n      this.#singleCopyFeedback = addToCartTextError;\n      document.body.appendChild(addToCartTextError);\n      this.#timeout = setTimeout(() => this.#singleCopyFeedback?.remove(), ERROR_MESSAGE_DISPLAY_DURATION);\n    }\n    if (addToCartTextError) {\n      addToCartTextError.classList.remove('hidden');\n      addToCartTextError.replaceChildren(document.createTextNode(message));\n      if (code === 'already_in_cart') {\n        const link = document.createElement('a');\n        link.href = Theme.routes.cart_url;\n        link.textContent = Theme.translations.view_cart || singleCopyMessages.view_cart;\n        link.style.marginInlineStart = '0.5em';\n        link.addEventListener('click', (event) => {\n          if (event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n            return;\n          }\n          const drawer = document.querySelector('theme-drawer#cart-drawer');\n          if (drawer?.open) {\n            event.preventDefault();\n            drawer.open();\n          }\n        });\n        addToCartTextError.appendChild(link);\n      }\n    }\n    this.#setLiveRegionText(message);\n  }\n\n  async #processBatchAddToCart(items) {\n    const seenProducts = new Set();\n    for (const item of items) {\n      if (seenProducts.has(item.productId)) continue;\n      seenProducts.add(item.productId);\n      await this.#processAddToCart(item.variantId, 1, undefined, item);\n    }\n  }\n\n  /**\n   * Updates the quantity label with the current cart quantity\n   * @param {number} cartQty - The quantity in cart\n   */\n  #updateQuantityLabel(cartQty) {\n    const quantityLabel = this.refs.quantityLabelCartCount;\n    if (quantityLabel) {\n      const inCartText = quantityLabel.textContent?.match(/\\((\\d+)\\s+(.+)\\)/);\n      if (inCartText && inCartText[2]) {\n        quantityLabel.textContent = `(${cartQty} ${inCartText[2]})`;\n      }\n\n      // Show/hide based on quantity\n      quantityLabel.classList.toggle('hidden', cartQty === 0);\n    }\n  }\n\n  /**\n   * @param {*} text\n   */\n  #setLiveRegionText(text) {\n    const liveRegion = this.refs.liveRegion;\n    liveRegion.textContent = text;\n  }\n\n  #clearLiveRegionText() {\n    const liveRegion = this.refs.liveRegion;\n    liveRegion.textContent = '';\n  }\n\n  /**\n   * Morphs or removes/adds an element based on current and new element states\n   * @param {Element | null | undefined} currentElement - The current element in the DOM\n   * @param {Element | null | undefined} newElement - The new element from the server response\n   * @param {Element | null} [insertReferenceElement] - Element to insert before if adding new element\n   */\n  #morphOrUpdateElement(currentElement, newElement, insertReferenceElement = null) {\n    if (currentElement && newElement) {\n      morph(currentElement, newElement);\n    } else if (currentElement && !newElement) {\n      currentElement.remove();\n    } else if (!currentElement && newElement && insertReferenceElement) {\n      insertReferenceElement.insertAdjacentElement('beforebegin', /** @type {Element} */ (newElement.cloneNode(true)));\n    }\n  }\n\n  /**\n   * @param {ProductSelectEvent} event\n   */\n  #onProductSelect = async (event) => {\n    // Skip events from product-cards when this form is at the section level\n    const sourceCard = /** @type {Element | null} */ (event.target)?.closest('product-card');\n    if (sourceCard && !sourceCard.contains(this)) return;\n\n    // Track generation to prevent a stale (aborted) call from clearing the flag\n    // while a newer variant selection is still pending.\n    const generation = ++this.#variantChangeGeneration;\n    this.#variantChangeInProgress = true;\n    // Hold the in-flight section-fetch promise so the queue drain can await it before reading the\n    // resolved variant id.\n    this.#pendingVariantChange = event.promise;\n\n    try {\n      const { detail } = await event.promise;\n      if (!detail?.html) return;\n\n      const { html, newProduct, productId, resource } = detail;\n\n      // Update product context if new product loaded (combined listing)\n      if (newProduct) {\n        this.dataset.productId = newProduct.id;\n      } else if (productId && productId !== this.dataset.productId) {\n        return;\n      }\n\n      const { variantId } = this.refs;\n      variantId.value = resource?.id ?? '';\n\n      const { addToCartButtonContainer: currentAddToCartButtonContainer, acceleratedCheckoutButtonContainer } =\n        this.refs;\n      const currentAddToCartButton = currentAddToCartButtonContainer?.refs.addToCartButton;\n\n      // Update state and text for add-to-cart button\n      if (!currentAddToCartButtonContainer || (!currentAddToCartButton && !acceleratedCheckoutButtonContainer)) return;\n\n      // Update the button state\n      if (resource == null || resource.available == false) {\n        currentAddToCartButtonContainer.disable();\n      } else {\n        currentAddToCartButtonContainer.enable();\n      }\n\n      const newAddToCartButton = html.querySelector('product-form-component [ref=\"addToCartButton\"]');\n      if (newAddToCartButton && currentAddToCartButton) {\n        morph(currentAddToCartButton, newAddToCartButton);\n      }\n\n      if (acceleratedCheckoutButtonContainer) {\n        acceleratedCheckoutButtonContainer.setAttribute('hidden', 'true');\n      }\n\n      // Set the data attribute for the product variant media if it exists\n      if (resource) {\n        const productVariantMedia = resource.featured_media?.preview_image?.src;\n        if (productVariantMedia) {\n          this.refs.addToCartButtonContainer?.setAttribute(\n            'data-product-variant-media',\n            productVariantMedia + '&width=100'\n          );\n        }\n      }\n\n      // Check if quantity rules, price-per-item, or add-to-cart are appearing/disappearing (causes layout shift)\n      const {\n        quantityRules,\n        pricePerItem,\n        quantitySelector,\n        productFormButtons,\n        quantityLabel,\n        quantitySelectorWrapper,\n      } = this.refs;\n\n      // Update quantity selector's min/max/step attributes and cart quantity for the new variant\n      const newQuantityInput = /** @type {HTMLInputElement | null} */ (\n        html.querySelector('quantity-selector-component input[ref=\"quantityInput\"]')\n      );\n\n      if (quantitySelector?.updateConstraints && newQuantityInput) {\n        quantitySelector.updateConstraints(newQuantityInput.min, newQuantityInput.max || null, newQuantityInput.step);\n        // Keep data-quantity-default attribute in sync with new variant's minimum quantity\n        this.dataset.quantityDefault = '1';\n        quantitySelector.setValue('1');\n      }\n\n      const newQuantityRules = html.querySelector('.quantity-rules');\n      const isQuantityRulesChanging = !!quantityRules !== !!newQuantityRules;\n\n      const newPricePerItem = html.querySelector('price-per-item');\n      const isPricePerItemChanging = !!pricePerItem !== !!newPricePerItem;\n\n      if ((isQuantityRulesChanging || isPricePerItemChanging) && quantitySelector) {\n        // Store quantity value before morphing entire container\n        const currentQuantityValue = quantitySelector.getValue?.();\n\n        const newProductFormButtons = html.querySelector('.product-form-buttons');\n\n        if (productFormButtons && newProductFormButtons) {\n          morph(productFormButtons, newProductFormButtons);\n\n          // Get the NEW quantity selector after morphing and update its constraints\n          const newQuantityInputElement = /** @type {HTMLInputElement | null} */ (\n            html.querySelector('quantity-selector-component input[ref=\"quantityInput\"]')\n          );\n\n          if (this.refs.quantitySelector?.updateConstraints && newQuantityInputElement && currentQuantityValue) {\n            // Temporarily set the old value so updateConstraints can snap it properly\n            this.refs.quantitySelector.setValue(currentQuantityValue);\n            // updateConstraints will snap to valid increment if needed\n            this.refs.quantitySelector.updateConstraints(\n              newQuantityInputElement.min,\n              newQuantityInputElement.max || null,\n              newQuantityInputElement.step\n            );\n            // Keep data-quantity-default attribute in sync with new variant's minimum quantity\n            this.dataset.quantityDefault = '1';\n            this.refs.quantitySelector.setValue('1');\n          }\n        }\n      } else {\n        // Update elements individually when layout isn't changing\n        /** @type {Array<[string, HTMLElement | undefined, HTMLElement | undefined]>} */\n        const morphTargets = [\n          ['.quantity-label', quantityLabel, quantitySelector],\n          ['.quantity-rules', quantityRules, this.refs.productFormButtons],\n          ['price-per-item', pricePerItem, quantitySelectorWrapper],\n        ];\n\n        for (const [selector, currentElement, fallback] of morphTargets) {\n          this.#morphOrUpdateElement(currentElement, html.querySelector(selector), fallback);\n        }\n      }\n\n      // Morph volume pricing if it exists\n      const currentVolumePricing = this.refs.volumePricing;\n      const newVolumePricing = html.querySelector('volume-pricing');\n      this.#morphOrUpdateElement(currentVolumePricing, newVolumePricing, this.refs.productFormButtons);\n\n      const hasB2BFeatures =\n        quantityRules ||\n        newQuantityRules ||\n        pricePerItem ||\n        newPricePerItem ||\n        currentVolumePricing ||\n        newVolumePricing;\n\n      if (!hasB2BFeatures) return;\n\n      // Fetch and update cart quantity for the new variant\n      this.#refreshCart().then((cart) => this.#updateCartQuantity(cart));\n    } finally {\n      // Only clear the flag if no newer variant selection has started\n      if (generation === this.#variantChangeGeneration) {\n        this.#variantChangeInProgress = false;\n\n        // Drain any queued add-to-cart requests that accumulated during the variant change\n        await this.#drainAddToCartQueue();\n      }\n    }\n  };\n\n  /**\n   * Drains the add-to-cart queue accumulated while a variant change was in flight.\n   *\n   * Each queued add resolves against the selection and generation that were active when Add was\n   * clicked. If no variant resolves, that queued add is aborted so a stale, empty, or maxed\n   * variant id is never sent. The add-to-cart button is already disabled for unavailable\n   * selections in #onProductSelect, so no further UI change is needed.\n   */\n  async #drainAddToCartQueue() {\n    if (this.#addToCartQueue.length === 0) return;\n\n    const queuedItems = [...this.#addToCartQueue];\n    this.#addToCartQueue = [];\n\n    /** @type {Array<{variantId: string, quantity: number, formData: FormData, productId: string, quantityConstraints: QuantityConstraints | null}>} */\n    const resolvedItems = [];\n    for (const item of queuedItems) {\n      const resolvedItem = await this.#resolveQueuedAddToCartItem(item);\n      if (resolvedItem) {\n        resolvedItems.push(resolvedItem);\n      }\n    }\n\n    return this.#processBatchAddToCart(resolvedItems);\n  }\n\n  /**\n   * @param {QueuedAddToCartItem} item\n   * @returns {Promise<{variantId: string, quantity: number, formData: FormData, productId: string, quantityConstraints: QuantityConstraints | null} | null>}\n   */\n  async #resolveQueuedAddToCartItem(item) {\n    const { variantId, quantityConstraints, productId } = await this.#resolveQueuedVariant(item);\n    if (!variantId) return null;\n\n    return {\n      variantId,\n      quantity: 1,\n      quantityConstraints,\n      formData: item.formData,\n      productId,\n    };\n  }\n\n  /**\n   * @param {QueuedAddToCartItem} item\n   * @returns {Promise<{variantId: string | null, quantityConstraints: QuantityConstraints | null, productId: string}>}\n   */\n  async #resolveQueuedVariant(item) {\n    /** @type {string | null} */\n    let resolvedVariantId = null;\n    /** @type {boolean | undefined} */\n    let available;\n    /** @type {QuantityConstraints | null} */\n    let quantityConstraints = null;\n    let productId = item.productId;\n\n    if (item.pendingVariantChange) {\n      try {\n        const result = /** @type {{detail?: {resource?: any, html?: Document | Element}}} */ (\n          await item.pendingVariantChange\n        );\n        const resource = result?.detail?.resource;\n        productId = String(result?.detail?.newProduct?.id ?? result?.detail?.productId ?? productId);\n        quantityConstraints = this.#getQuantityConstraintsFromHtml(result?.detail?.html);\n        if (resource === null) {\n          available = false;\n        } else if (resource) {\n          resolvedVariantId = resource.id != null ? String(resource.id) : null;\n          available = resource.available !== false;\n        }\n      } catch {\n        const resolvedVariant = await this.#resolveVariantFromUrl(item.variantResolutionUrl).catch(() => ({\n          variantId: null,\n          available: false,\n          quantityConstraints: null,\n          productId: null,\n        }));\n        resolvedVariantId = resolvedVariant.variantId;\n        available = resolvedVariant.available;\n        quantityConstraints = resolvedVariant.quantityConstraints;\n        productId = resolvedVariant.productId || productId;\n      }\n    }\n\n    const isLatestGeneration = item.generation === this.#variantChangeGeneration;\n    const variantId = resolveVariantId({\n      resolvedVariantId,\n      intendedVariantId: item.intendedVariantId,\n      hiddenInputValue: isLatestGeneration ? this.#getVariantIdInput() ?? null : null,\n      available: available ?? (isLatestGeneration ? !this.#isAddToCartDisabled() : undefined),\n    });\n\n    return { variantId, quantityConstraints, productId };\n  }\n\n  /**\n   * @param {Document | Element | null | undefined} html\n   * @returns {QuantityConstraints | null}\n   */\n  #getQuantityConstraintsFromHtml(html) {\n    const quantityInput = /** @type {HTMLInputElement | null} */ (\n      html?.querySelector?.('quantity-selector-component input[ref=\"quantityInput\"]') ?? null\n    );\n    if (!quantityInput) return null;\n\n    return {\n      min: quantityInput.min,\n      max: quantityInput.max || null,\n      step: quantityInput.step,\n      cartQuantity: quantityInput.getAttribute('data-cart-quantity'),\n    };\n  }\n\n  /**\n   * Resolves a queued selection using the server-side section renderer when the original in-flight\n   * request was aborted by a later variant selection.\n   * @param {string | null} variantResolutionUrl\n   * @returns {Promise<{variantId: string | null, available: boolean | undefined, quantityConstraints: QuantityConstraints | null, productId: string | null}>}\n   */\n  async #resolveVariantFromUrl(variantResolutionUrl) {\n    if (!variantResolutionUrl) return { variantId: null, available: undefined, quantityConstraints: null, productId: null };\n\n    const response = await fetch(variantResolutionUrl, { credentials: 'same-origin' });\n    if (!response.ok) return { variantId: null, available: false, quantityConstraints: null, productId: null };\n\n    const html = new DOMParser().parseFromString(await response.text(), 'text/html');\n    const quantityConstraints = this.#getQuantityConstraintsFromHtml(html);\n    const textContent = html.querySelector('variant-picker script[type=\"application/json\"]')?.textContent;\n    if (!textContent) return { variantId: null, available: false, quantityConstraints, productId: null };\n\n    const resource = JSON.parse(textContent);\n    if (!resource || typeof resource !== 'object') return { variantId: null, available: false, quantityConstraints, productId: null };\n\n    return {\n      variantId: resource.id != null ? String(resource.id) : null,\n      productId: html.querySelector('product-form-component')?.getAttribute('data-product-id') ?? null,\n      available: resource.available !== false,\n      quantityConstraints,\n    };\n  }\n\n  /**\n   * @returns {import('@theme/variant-picker').default | null}\n   */\n  #getVariantPicker() {\n    const container = this.closest('product-card') ?? this.closest('dialog') ?? this.closest('.shopify-section');\n    const pickers = /** @type {import('@theme/variant-picker').default[]} */ (\n      Array.from(container?.querySelectorAll('variant-picker, swatches-variant-picker-component') ?? [])\n    );\n    const productId = this.dataset.productId;\n\n    if (productId) {\n      const matchingPicker = pickers.find((picker) => picker.dataset.productId === productId);\n      if (matchingPicker) return matchingPicker;\n    }\n\n    return pickers.length === 1 ? pickers[0] ?? null : null;\n  }\n\n  /**\n   * Whether the current selection's add-to-cart button is disabled (unavailable selection).\n   * @returns {boolean}\n   */\n  #isAddToCartDisabled() {\n    const containers = /** @type {NodeListOf<AddToCartComponent>} */ (this.querySelectorAll('add-to-cart-component'));\n    return Array.from(containers).some((container) => container.refs.addToCartButton?.disabled);\n  }\n}\n\nif (!customElements.get('product-form-component')) {\n  customElements.define('product-form-component', ProductFormComponent);\n}\n"],
  "mappings": "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",
  "names": ["timeoutId"]
}
