{
  "version": 3,
  "sources": ["/cdn/shop/t/65/assets/conso-product-form.js?x=13243"],
  "sourcesContent": ["// CONSO \u2014 fork de product-form.js (Horizon) com uma corre\u00E7\u00E3o s\u00F3: recriar o\n// AbortController no connectedCallback (ver coment\u00E1rio em ProductFormComponent).\n// Para comparar com o original: diff contra assets/product-form.js.\nimport { Component } from '@theme/component';\nimport { fetchConfig, preloadImage, onAnimationEnd, yieldToMainThread, parseIntOrDefault } 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';\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    // Check if adding would exceed max before animating\n    const productForm = /** @type {ProductFormComponent | null} */ (this.closest('product-form-component'));\n    const quantitySelector = productForm?.refs.quantitySelector;\n    if (quantitySelector?.canAddToCart) {\n      const validation = quantitySelector.canAddToCart();\n      // Don't animate if it would exceed max\n      if (!validation.canAdd) {\n        return;\n      }\n    }\n    if (this.refs.addToCartButton.dataset.puppet !== 'true') {\n      const animationEnabled = this.dataset.addToCartAnimation === 'true';\n      if (animationEnabled && !event.target.closest('.quick-add-modal')) {\n        this.#animateFlyToCart();\n      }\n      this.animateAddToCart();\n    }\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 *\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 {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    // CONSO: o controller nasce uma vez s\u00F3 (campo) e o disconnectedCallback aborta.\n    // Se o form for MOVIDO no DOM depois de inicializado (o conso-kit-opcoes em\n    // layout \"abas\" traz o .buy-buttons-block pra dentro da aba), o reconnect\n    // registraria os listeners com um signal j\u00E1 abortado: o form parava de ouvir a\n    // troca de variante e o ATC mandava a variante da carga da p\u00E1gina (o menor\n    // tamanho). Recria o controller quando ele j\u00E1 foi abortado.\n    if (this.#abortController.signal.aborted) this.#abortController = new AbortController();\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  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    this.#abortController.abort();\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    }\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      this.refs.addToCartButtonContainer?.animateAddToCart?.();\n      return;\n    }\n\n    this.#processAddToCart(undefined, undefined, event);\n  }\n\n  /** @returns {number} */\n  #getQuantity() {\n    return Number(this.refs.quantitySelector?.getValue?.()) || Number(this.dataset.quantityDefault) || 1;\n  }\n\n  /** @returns {QueuedAddToCartItem} */\n  #createQueuedAddToCartItem() {\n    const picker = this.#getVariantPicker();\n    const selectedOption = picker?.selectedOption;\n\n    return {\n      quantity: this.#getQuantity(),\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   */\n  #processAddToCart(overrideVariantId, overrideQuantity, event) {\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    if (!overrideVariantId && this.refs.quantitySelector?.canAddToCart) {\n      const validation = this.refs.quantitySelector.canAddToCart();\n\n      if (!validation.canAdd) {\n        for (const container of allAddToCartContainers) {\n          container.disable();\n        }\n\n        const errorTemplate = this.dataset.quantityErrorMax || '';\n        const errorMessage = errorTemplate.replace('{{ maximum }}', validation.maxQuantity?.toString() || '');\n        if (addToCartTextError) {\n          addToCartTextError.classList.remove('hidden');\n\n          const textNode = addToCartTextError.childNodes[2];\n          if (textNode) {\n            textNode.textContent = errorMessage;\n          } else {\n            const newTextNode = document.createTextNode(errorMessage);\n            addToCartTextError.appendChild(newTextNode);\n          }\n\n          this.#setLiveRegionText(errorMessage);\n\n          if (this.#timeout) clearTimeout(this.#timeout);\n          this.#timeout = setTimeout(() => {\n            if (!addToCartTextError) return;\n            addToCartTextError.classList.add('hidden');\n            this.#clearLiveRegionText();\n          }, ERROR_MESSAGE_DISPLAY_DURATION);\n        }\n\n        setTimeout(() => {\n          for (const container of allAddToCartContainers) {\n            container.enable();\n          }\n        }, ERROR_BUTTON_REENABLE_DELAY);\n\n        return;\n      }\n    }\n\n    const formData = new FormData(form);\n\n    if (overrideVariantId) {\n      formData.set('id', overrideVariantId);\n    }\n    if (overrideQuantity !== undefined) {\n      formData.set('quantity', overrideQuantity.toString());\n    }\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      formData.append('sections', cartItemComponentsSectionIds.join(','));\n    });\n\n    const itemCount = Number(formData.get('quantity')) || Number(this.dataset.quantityDefault);\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    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          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: this.dataset.productId,\n                },\n              })\n            )\n            .catch(deferredEventPromise.reject);\n\n          if (!addToCartTextError) return;\n          addToCartTextError.classList.remove('hidden');\n\n          // Reuse the text node if the user is spam-clicking\n          const textNode = addToCartTextError.childNodes[2];\n          if (textNode) {\n            textNode.textContent = response.message;\n          } else {\n            const newTextNode = document.createTextNode(response.message);\n            addToCartTextError.appendChild(newTextNode);\n          }\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\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: this.dataset.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) {\n          cartPerformance.measureFromEvent('add:user-action', event);\n        }\n      });\n  }\n\n  /** @param {Array<{variantId: string, quantity: number}>} items */\n  #processBatchAddToCart(items) {\n    if (items.length === 0) return;\n\n    const { addToCartTextError } = this.refs;\n\n    if (this.#timeout) clearTimeout(this.#timeout);\n\n    const cartItemsComponents = document.querySelectorAll('cart-items-component');\n    const cartItemComponentsSectionIds = [];\n    for (const item of cartItemsComponents) {\n      if (item instanceof HTMLElement && item.dataset.sectionId) {\n        cartItemComponentsSectionIds.push(item.dataset.sectionId);\n      }\n    }\n\n    const totalQuantity = items.reduce((sum, item) => sum + item.quantity, 0);\n    const deferredEventPromise = CartLinesUpdateEvent.createPromise();\n\n    this.dispatchEvent(\n      new CartLinesUpdateEvent({\n        action: 'add',\n        context: 'product',\n        lines: items.map((item) => ({\n          merchandiseId: item.variantId,\n          quantity: item.quantity,\n        })),\n        promise: deferredEventPromise.promise,\n      })\n    );\n\n    const payload = {\n      items: items.map((item) => ({\n        id: Number(item.variantId),\n        quantity: item.quantity,\n      })),\n      sections: cartItemComponentsSectionIds.join(','),\n    };\n\n    fetch(Theme.routes.cart_add_url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Accept: 'application/json',\n      },\n      body: JSON.stringify(payload),\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          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: totalQuantity,\n                  productId: this.dataset.productId,\n                },\n              })\n            )\n            .catch(deferredEventPromise.reject);\n\n          if (!addToCartTextError) return;\n          addToCartTextError.classList.remove('hidden');\n          const textNode = addToCartTextError.childNodes[2];\n          if (textNode) {\n            textNode.textContent = response.message;\n          } else {\n            addToCartTextError.appendChild(document.createTextNode(response.message));\n          }\n          this.#setLiveRegionText(response.message);\n\n          this.#timeout = setTimeout(() => {\n            addToCartTextError.classList.add('hidden');\n            this.#clearLiveRegionText();\n          }, ERROR_MESSAGE_DISPLAY_DURATION);\n\n          return;\n        }\n\n        if (addToCartTextError) {\n          addToCartTextError.classList.add('hidden');\n          addToCartTextError.removeAttribute('aria-live');\n        }\n\n        const allAddToCartContainers = /** @type {NodeListOf<AddToCartComponent>} */ (\n          this.querySelectorAll('add-to-cart-component')\n        );\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          this.#setLiveRegionText(addedText);\n          setTimeout(() => this.#clearLiveRegionText(), SUCCESS_MESSAGE_DISPLAY_DURATION);\n        }\n\n        const cart = await this.#refreshCart();\n        deferredEventPromise.resolve({\n          cart: CartLinesUpdateEvent.createCartFromAjaxResponse(cart),\n          detail: {\n            items: cart.items,\n            source: 'product-form-component',\n            sourceId: this.id.toString(),\n            itemCount: totalQuantity,\n            productId: this.dataset.productId,\n            sections: response.sections,\n            didError: false,\n          },\n        });\n        this.#updateCartQuantity(cart);\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  }\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        if (resource == null || resource.available == false) {\n          acceleratedCheckoutButtonContainer?.setAttribute('hidden', 'true');\n        } else {\n          acceleratedCheckoutButtonContainer?.removeAttribute('hidden');\n        }\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 = newQuantityInput.min || '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 = newQuantityInputElement.min || '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}>} */\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    this.#processBatchAddToCart(resolvedItems);\n  }\n\n  /**\n   * @param {QueuedAddToCartItem} item\n   * @returns {Promise<{variantId: string, quantity: number} | null>}\n   */\n  async #resolveQueuedAddToCartItem(item) {\n    const { variantId, quantityConstraints } = await this.#resolveQueuedVariant(item);\n    if (!variantId) return null;\n\n    return {\n      variantId,\n      quantity: this.#normalizeQueuedQuantity(item.quantity, quantityConstraints),\n    };\n  }\n\n  /**\n   * @param {QueuedAddToCartItem} item\n   * @returns {Promise<{variantId: string | null, quantityConstraints: QuantityConstraints | null}>}\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\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        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        }));\n        resolvedVariantId = resolvedVariant.variantId;\n        available = resolvedVariant.available;\n        quantityConstraints = resolvedVariant.quantityConstraints;\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 };\n  }\n\n  /**\n   * @param {number} quantity\n   * @param {QuantityConstraints | null} quantityConstraints\n   * @returns {number}\n   */\n  #normalizeQueuedQuantity(quantity, quantityConstraints) {\n    if (!quantityConstraints) return quantity;\n\n    const min = parseIntOrDefault(quantityConstraints.min, 1);\n    const max = parseIntOrDefault(quantityConstraints.max, null);\n    const step = parseIntOrDefault(quantityConstraints.step, 1);\n    const cartQuantity = parseIntOrDefault(quantityConstraints.cartQuantity, 0);\n    const effectiveMax = max === null ? null : Math.max(max - cartQuantity, min);\n\n    let normalizedQuantity = quantity;\n    if ((quantity - min) % step !== 0) {\n      normalizedQuantity = min + Math.floor((quantity - min) / step) * step;\n    }\n\n    return Math.max(min, Math.min(effectiveMax ?? Infinity, normalizedQuantity));\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}>}\n   */\n  async #resolveVariantFromUrl(variantResolutionUrl) {\n    if (!variantResolutionUrl) return { variantId: null, available: undefined, quantityConstraints: null };\n\n    const response = await fetch(variantResolutionUrl, { credentials: 'same-origin' });\n    if (!response.ok) return { variantId: null, available: false, quantityConstraints: 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 };\n\n    const resource = JSON.parse(textContent);\n    if (!resource || typeof resource !== 'object') return { variantId: null, available: false, quantityConstraints };\n\n    return {\n      variantId: resource.id != null ? String(resource.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"]
}
