{
  "version": 3,
  "sources": ["/cdn/shop/t/125/assets/product-form.js"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { fetchConfig, onAnimationEnd, preloadImage } from '@theme/utilities';\nimport { ThemeEvents, VariantUpdateEvent } from '@theme/events';\nimport {\n  CartLinesUpdateEvent as StandardCartLinesUpdateEvent,\n  CartErrorEvent as StandardCartErrorEvent,\n  StandardEvents,\n} from '@shopify/events';\nimport { cartPerformance } from '@theme/performance';\nimport { morph } from '@theme/morph';\nimport { getCartErrorDetails } from './cart-request-errors.js';\n\nexport const ADD_TO_CART_TEXT_ANIMATION_DURATION = 2000;\n\nconst FLY_TO_CART_ANIMATION_DURATION = 600;\nconst NOTIFICATION_AFTER_FLY_TO_CART_BUFFER = 100;\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 * 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  #animationTimeout;\n\n  /** @type {number | undefined} */\n  #cleanupTimeout;\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    this.addEventListener('pointerenter', this.#preloadImage);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    if (this.#animationTimeout) clearTimeout(this.#animationTimeout);\n    if (this.#cleanupTimeout) clearTimeout(this.#cleanupTimeout);\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 quantitySelector = /** @type {any} */ (form.querySelector('quantity-selector-component'));\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\n    this.animateAddToCart();\n\n    const animationEnabled = this.dataset.addToCartAnimation === 'true';\n\n    if (animationEnabled && !event.target.closest('.quick-add-modal')) {\n      this.#animateFlyToCart();\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    flyToCartElement.style.setProperty('background-image', `url(${image})`);\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() {\n    const { addToCartButton } = this.refs;\n\n    if (this.#animationTimeout) clearTimeout(this.#animationTimeout);\n    if (this.#cleanupTimeout) clearTimeout(this.#cleanupTimeout);\n\n    if (!addToCartButton.classList.contains('atc-added')) {\n      addToCartButton.classList.add('atc-added');\n    }\n\n    if (addToCartButton.classList.contains('quick-add__button')) {\n      this.#animationTimeout = setTimeout(() => {\n        addToCartButton.classList.remove('atc-added');\n      }, ADD_TO_CART_TEXT_ANIMATION_DURATION);\n\n      return;\n    }\n\n    this.#animationTimeout = setTimeout(() => {\n      this.#cleanupTimeout = setTimeout(() => {\n        this.refs.addToCartButton.classList.remove('atc-added');\n      }, 10);\n    }, ADD_TO_CART_TEXT_ANIMATION_DURATION);\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 {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 *\n * @extends Component<ProductFormRefs>\n */\nclass ProductFormComponent extends Component {\n  requiredRefs = ['variantId', 'liveRegion'];\n  #abortController = new AbortController();\n  #quantityLimitPending = false;\n\n  /** @type {number | undefined} */\n  #timeout;\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(ThemeEvents.variantRendered, this.#onVariantUpdate, { signal });\n    target?.addEventListener(StandardEvents.productSelect, this.#onVariantSelected, { signal });\n\n    document.addEventListener(StandardEvents.cartLinesUpdate, this.#onStandardCartUpdate, { signal });\n\n    if (this.dataset.quantityLimit) {\n      this.#updateQuantityLimitState(Number.parseInt(this.dataset.cartProductQuantity || '0', 10) || 0);\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    this.#abortController.abort();\n  }\n\n  /**\n   * Updates this form's quantity state from an authoritative Ajax cart.\n   * Collection pages can contain dozens of product forms, so standard cart\n   * consumers must share the cart carried by the event instead of each\n   * issuing its own `/cart.js` request.\n   * @param {{items?: Array<{variant_id: string | number, quantity: number}>}} cart\n   */\n  #updateCartQuantity(cart) {\n    const variantIdInput = /** @type {HTMLInputElement | null} */ (this.querySelector('input[name=\"id\"]'));\n    if (!variantIdInput?.value || !Array.isArray(cart.items)) return null;\n\n    const productLimit = Number.parseInt(this.dataset.quantityLimit || '', 10);\n    const cartQty = cart.items.reduce((total, item) => {\n      const isMatchingItem = Number.isFinite(productLimit)\n        ? item.product_id?.toString() === this.dataset.productId\n        : item.variant_id.toString() === variantIdInput.value.toString();\n\n      return isMatchingItem ? total + Number(item.quantity || 0) : total;\n    }, 0);\n\n    const quantitySelector = /** @type {any} */ (this.querySelector('quantity-selector-component'));\n    quantitySelector?.setCartQuantity?.(cartQty);\n    this.#updateQuantityLabel(cartQty);\n    this.#updateQuantityLimitState(cartQty);\n\n    return cart;\n  }\n\n  /**\n   * Fetches cart and updates quantity selector for current variant\n   * @returns {Promise<Object|null>} The updated cart\n   */\n  async #fetchAndUpdateCartQuantity() {\n    const variantIdInput = /** @type {HTMLInputElement | null} */ (this.querySelector('input[name=\"id\"]'));\n    if (!variantIdInput?.value) return null;\n\n    try {\n      const response = await fetch('/cart.js');\n      const cart = await response.json();\n      return this.#updateCartQuantity(cart);\n    } catch (error) {\n      console.error('Failed to fetch cart quantity:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Updates data-cart-quantity when cart is updated from elsewhere\n   * @param {import('@shopify/events').CartLinesUpdateEvent} event\n   */\n  #onStandardCartUpdate = (event) => {\n    if (event.detail?.sourceId && event.detail.sourceId === this.id) return;\n    event.promise\n      .then(({ detail }) => {\n        const ajaxCart = /** @type {{items?: Array<{variant_id: string | number, quantity: number}>} | undefined} */ (\n          detail?.ajaxCart\n        );\n        if (ajaxCart?.items) return this.#updateCartQuantity(ajaxCart);\n\n        return this.#fetchAndUpdateCartQuantity();\n      })\n      .catch(() => {});\n  };\n\n  /**\n   * Handles the submit event for the product form.\n   *\n   * @param {Event} event - The submit event.\n   */\n  handleSubmit(event) {\n    const { addToCartTextError, addToCartButtonContainer } = this.refs;\n    // Stop default behaviour from the browser\n    event.preventDefault();\n\n    if (this.#timeout) clearTimeout(this.#timeout);\n\n    // Check if the add to cart button is disabled and do an early return if it is\n    if (addToCartButtonContainer?.refs.addToCartButton?.disabled || this.#quantityLimitPending) return;\n\n    // Send the add to cart information to the cart\n    const form = this.querySelector('form');\n\n    if (!form) throw new Error('Product form element missing');\n\n    const productAddOns = this.closest('.product-details')?.querySelector('ch-product-upsells[data-submit-with-main=\"true\"]');\n    if (typeof productAddOns?.validateSelections === 'function' && !productAddOns.validateSelections()) return;\n\n    const quantitySelector = /** @type {any} */ (this.querySelector('quantity-selector-component'));\n    if (quantitySelector && !quantitySelector.quantityInput.reportValidity()) return;\n\n    const configuredLimit = Number.parseInt(this.dataset.quantityLimit || '', 10);\n    const cartProductQuantity = Number.parseInt(this.dataset.cartProductQuantity || '0', 10) || 0;\n    const requestedQuantity = Number.parseInt(\n      /** @type {HTMLInputElement | null} */ (form.querySelector('input[name=\"quantity\"]'))?.value ||\n        this.dataset.quantityDefault ||\n        '1',\n      10\n    );\n    const validation = quantitySelector?.canAddToCart\n      ? quantitySelector.canAddToCart()\n      : {\n          canAdd: !Number.isFinite(configuredLimit) || cartProductQuantity + requestedQuantity <= configuredLimit,\n          maxQuantity: Number.isFinite(configuredLimit) ? configuredLimit : null,\n        };\n\n    if (!validation.canAdd) {\n      addToCartButtonContainer?.disable();\n\n      const errorTemplate = this.dataset.quantityErrorMax || '';\n      const errorMessage = errorTemplate.replace('{{ maximum }}', validation.maxQuantity.toString());\n      const quickAddLimitMessage = this.querySelector('[data-ch-quantity-limit-message]');\n      if (quickAddLimitMessage instanceof HTMLElement) quickAddLimitMessage.hidden = false;\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        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      this.#setLiveRegionText(errorMessage);\n\n      setTimeout(() => {\n        if (!Number.isFinite(configuredLimit) || cartProductQuantity < configuredLimit) {\n          addToCartButtonContainer?.enable();\n        }\n      }, ERROR_BUTTON_REENABLE_DELAY);\n\n      return;\n    }\n\n    if (Number.isFinite(configuredLimit)) this.#quantityLimitPending = true;\n\n    const variantIdInput = /** @type {HTMLInputElement | null} */ (form.querySelector('input[name=\"id\"]'));\n    if (!variantIdInput?.value) {\n      const variantJson = this.closest('.shopify-section, dialog')?.querySelector(\n        'variant-picker.ch-wotm-picker script[type=\"application/json\"]'\n      )?.textContent;\n\n      if (variantJson && variantIdInput) {\n        try {\n          const variantResource = JSON.parse(variantJson);\n          if (variantResource?.id) variantIdInput.value = String(variantResource.id);\n        } catch {\n          variantIdInput.value = '';\n        }\n      }\n    }\n\n    const formData = new FormData(form);\n    const id = formData.get('id');\n\n    if (!id) throw new Error('Form ID is required');\n\n    const cartItemsComponents = document.querySelectorAll('cart-items-component');\n    const cartItemComponentsSectionIds = [];\n    cartItemsComponents.forEach((item) => {\n      if (item instanceof HTMLElement && item.dataset.sectionId) {\n        cartItemComponentsSectionIds.push(item.dataset.sectionId);\n      }\n    });\n    formData.append('sections', cartItemComponentsSectionIds.join(','));\n\n    const variantId = id.toString();\n    const addOnLines =\n      typeof productAddOns?.selectedLines === 'function' ? productAddOns.selectedLines() : [];\n    const mainProperties = {};\n    for (const [key, value] of formData.entries()) {\n      const propertyMatch = key.match(/^properties\\[(.+)\\]$/);\n      if (propertyMatch && String(value)) mainProperties[propertyMatch[1]] = String(value);\n    }\n    const mainLine = {\n      id: variantId,\n      quantity: requestedQuantity,\n      ...(Object.keys(mainProperties).length ? { properties: mainProperties } : {}),\n      ...(formData.get('selling_plan') ? { selling_plan: formData.get('selling_plan').toString() } : {}),\n    };\n    const cartLines = [mainLine, ...addOnLines];\n    const fetchCfg = addOnLines.length\n      ? {\n          method: 'POST',\n          credentials: 'same-origin',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            items: cartLines,\n            sections: cartItemComponentsSectionIds.join(','),\n            sections_url: window.location.pathname,\n          }),\n        }\n      : fetchConfig('javascript', { body: formData });\n    const notificationDelayUntil = this.#notificationDelayUntil();\n    const operationId = globalThis.crypto?.randomUUID?.() || `cart-add-${Date.now()}-${Math.random()}`;\n    const itemCount = cartLines.reduce((total, line) => total + (Number(line.quantity) || 0), 0);\n    const standardDeferred = StandardCartLinesUpdateEvent.createPromise();\n    // A standard event consumer normally observes this promise. Keep a rejection\n    // handler attached so a page without consumers never produces an unhandled rejection.\n    standardDeferred.promise.catch(() => {});\n\n    this.dispatchEvent(\n      new StandardCartLinesUpdateEvent({\n        action: 'add',\n        context: this.closest('dialog') ? 'dialog' : 'product',\n        lines: cartLines.map((line) => ({ merchandiseId: line.id, quantity: line.quantity })),\n        promise: standardDeferred.promise,\n        detail: {\n          source: 'product-form-component',\n          sourceId: this.id,\n          productId: this.dataset.productId,\n          variantId,\n          operationId,\n          quickAdd: Boolean(this.closest('quick-add-component')),\n          addedItem: this.#getAddedItemContext(),\n          itemCount,\n          notificationDelayUntil,\n        },\n      })\n    );\n\n    if (addToCartTextError) {\n      addToCartTextError.classList.add('hidden');\n      addToCartTextError.removeAttribute('aria-live');\n    }\n\n    fetch(Theme.routes.cart_add_url, {\n      ...fetchCfg,\n      headers: {\n        ...fetchCfg.headers,\n        Accept: 'application/json',\n      },\n    })\n      .then(async (httpResponse) => ({ httpResponse, response: await httpResponse.json() }))\n      .then(async ({ httpResponse, response }) => {\n        if (!httpResponse.ok || response.status) {\n          const cartError = getCartErrorDetails(response, httpResponse.status);\n          this.dispatchEvent(\n            new StandardCartErrorEvent({\n              error: cartError.message,\n              code: cartError.code,\n              detail: {\n                source: 'product-form-component',\n                sourceId: this.id,\n                productId: this.dataset.productId,\n                variantId,\n                operationId,\n                httpStatus: httpResponse.status,\n                errors: response.errors,\n                description: response.description,\n              },\n            })\n          );\n          if (addToCartTextError) {\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 = cartError.message;\n            } else {\n              const newTextNode = document.createTextNode(cartError.message);\n              addToCartTextError.appendChild(newTextNode);\n            }\n\n            // Create or get existing error live region for screen readers\n            this.#setLiveRegionText(cartError.message);\n\n            this.#timeout = setTimeout(() => {\n              addToCartTextError.classList.add('hidden');\n\n              // Clear the announcement\n              this.#clearLiveRegionText();\n            }, ERROR_MESSAGE_DISPLAY_DURATION);\n          }\n\n          // Shopify can partially add the available quantity for maximum errors.\n          // Other 422 variants (sold out or invalid selling plans) do not mutate.\n          if (cartError.code === 'MAXIMUM_EXCEEDED') {\n            const cart = await this.#fetchAndUpdateCartQuantity();\n            if (!cart) {\n              standardDeferred.reject(new Error('Unable to refresh the cart after a maximum quantity error.'));\n              return;\n            }\n            standardDeferred.resolve({\n              cart: StandardCartLinesUpdateEvent.createCartFromAjaxResponse(cart),\n              userErrors: [\n                {\n                  code: cartError.code,\n                  message: cartError.message,\n                },\n              ],\n              detail: {\n                ajaxCart: cart,\n                source: 'product-form-component',\n                sourceId: this.id,\n                productId: this.dataset.productId,\n                variantId,\n                operationId,\n                didError: true,\n              },\n            });\n          } else {\n            standardDeferred.reject(Object.assign(new Error(cartError.message), { code: cartError.code }));\n          }\n          return;\n        } else {\n          if (addToCartTextError) {\n            addToCartTextError.classList.add('hidden');\n            addToCartTextError.removeAttribute('aria-live');\n          }\n\n          // Add aria-live region to inform screen readers that the item was added\n          if (this.refs.addToCartButtonContainer?.refs.addToCartButton) {\n            const addToCartButton = this.refs.addToCartButtonContainer.refs.addToCartButton;\n            const addedTextElement = addToCartButton.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          const cart = await this.#fetchAndUpdateCartQuantity();\n\n          if (!cart) throw new Error('Unable to refresh the cart after adding the item.');\n\n          standardDeferred.resolve({\n            cart: StandardCartLinesUpdateEvent.createCartFromAjaxResponse(cart),\n            detail: {\n              ajaxCart: cart,\n              source: 'product-form-component',\n              sourceId: this.id,\n              productId: this.dataset.productId,\n              variantId,\n              operationId,\n              sections: response.sections || {},\n              addedItem: this.#getAddedItemContext(response),\n            },\n          });\n\n        }\n      })\n      .catch(async (error) => {\n        console.error(error);\n        standardDeferred.reject(error);\n        this.dispatchEvent(\n          new StandardCartErrorEvent({\n            error: error instanceof Error ? error.message : 'Unable to add this item to the cart.',\n            code: 'SERVICE_UNAVAILABLE',\n            detail: {\n              source: 'product-form-component',\n              sourceId: this.id,\n              productId: this.dataset.productId,\n              variantId,\n              operationId,\n            },\n          })\n        );\n        await this.#fetchAndUpdateCartQuantity();\n      })\n      .finally(() => {\n        this.#quantityLimitPending = false;\n        cartPerformance.measureFromEvent('add:user-action', event);\n      });\n  }\n\n  #updateQuantityLimitState(cartQty) {\n    const configuredLimit = Number.parseInt(this.dataset.quantityLimit || '', 10);\n    if (!Number.isFinite(configuredLimit)) return;\n\n    this.dataset.cartProductQuantity = cartQty.toString();\n    const atLimit = cartQty >= configuredLimit;\n    const limitMessage = this.querySelector('[data-ch-quantity-limit-message]');\n    if (limitMessage instanceof HTMLElement) limitMessage.hidden = !atLimit;\n    // A dynamically inserted form can connect before its child custom element upgrades.\n    // The native button already exists, so enforce the limit without child lifecycle methods.\n    const addToCartButton = /** @type {HTMLButtonElement | null | undefined} */ (\n      this.refs.addToCartButtonContainer?.querySelector('[ref=\"addToCartButton\"]')\n    );\n\n    if (atLimit) {\n      if (addToCartButton) addToCartButton.disabled = true;\n      this.refs.acceleratedCheckoutButtonContainer?.setAttribute('hidden', 'true');\n    } else if (this.dataset.canAddToCart === 'true') {\n      if (addToCartButton) addToCartButton.disabled = false;\n      this.refs.acceleratedCheckoutButtonContainer?.removeAttribute('hidden');\n    }\n  }\n\n  #notificationDelayUntil() {\n    const addToCartButtonContainer = this.refs.addToCartButtonContainer;\n    const animationEnabled = addToCartButtonContainer?.dataset.addToCartAnimation === 'true';\n    const hasFlyToCartTarget = Boolean(\n      addToCartButtonContainer?.dataset.productVariantMedia && document.querySelector('.header-actions__cart-icon')\n    );\n\n    if (!animationEnabled || this.closest('.quick-add-modal') || !hasFlyToCartTarget) return 0;\n\n    return Date.now() + FLY_TO_CART_ANIMATION_DURATION + NOTIFICATION_AFTER_FLY_TO_CART_BUFFER;\n  }\n\n  #getAddedItemContext(response) {\n    const quickAdd = /** @type {HTMLElement | null} */ (this.closest('quick-add-component'));\n    const productCard = this.closest('product-card');\n    const quickAddModal = this.closest('.quick-add-modal');\n    const productLink = productCard?.querySelector('a[ref=\"productCardLink\"], a[href*=\"/products/\"]');\n    const productImage = productCard?.querySelector('.card-gallery img, img');\n    const productPrice = productCard?.querySelector('product-price');\n    const modalTitle = quickAddModal?.querySelector('.view-product-title a, .product-header a')?.textContent?.trim();\n    const modalImage = quickAddModal?.querySelector('.product-information__media img');\n    const modalPrice = quickAddModal?.querySelector('.product-details product-price, .product-header product-price');\n    const selectedVariantImage = this.refs.addToCartButtonContainer?.dataset.productVariantMedia || '';\n    const pageTitle = document.querySelector('main h1, .product-title, [data-product-title]')?.textContent?.trim();\n    const pageImage = document.querySelector(\n      'main [data-product-media] img, main product-media img, main .product-media img, main img[loading=\"eager\"]'\n    );\n    const pagePrice = this.closest('.shopify-section')?.querySelector('product-price') || document.querySelector('main product-price');\n    const title =\n      quickAdd?.dataset.productTitle ||\n      productCard?.querySelector('.visually-hidden')?.textContent?.trim() ||\n      response?.product_title ||\n      response?.title ||\n      modalTitle ||\n      pageTitle;\n    const image =\n      selectedVariantImage ||\n      (productImage instanceof HTMLImageElement\n        ? productImage.currentSrc || productImage.src || ''\n        : modalImage instanceof HTMLImageElement\n          ? modalImage.currentSrc || modalImage.src || ''\n          : pageImage instanceof HTMLImageElement\n          ? pageImage.currentSrc || pageImage.src || ''\n          : response?.featured_image?.url || response?.image || '');\n\n    return {\n      title: title || '',\n      url:\n        (productLink instanceof HTMLAnchorElement ? productLink.href : '') ||\n        response?.url ||\n        window.location.href,\n      image,\n      imageAlt:\n        (productImage instanceof HTMLImageElement ? productImage.alt : '') ||\n        (modalImage instanceof HTMLImageElement ? modalImage.alt : '') ||\n        (pageImage instanceof HTMLImageElement ? pageImage.alt : '') ||\n        response?.featured_image?.alt ||\n        title ||\n        '',\n      priceText:\n        productPrice?.textContent?.trim() || modalPrice?.textContent?.trim() || pagePrice?.textContent?.trim() || '',\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 {VariantUpdateEvent} event\n   */\n  #onVariantUpdate = async (event) => {\n    if (event.detail.data.newProduct) {\n      this.dataset.productId = event.detail.data.newProduct.id;\n    } else if (event.detail.data.productId !== this.dataset.productId) {\n      return;\n    }\n\n    const { variantId, addToCartButtonContainer } = this.refs;\n\n    const currentAddToCartButton = addToCartButtonContainer?.refs.addToCartButton;\n    const newAddToCartButton = event.detail.data.html.querySelector('[ref=\"addToCartButton\"]');\n\n    // Update the variant ID\n    variantId.value = event.detail.resource?.id ?? '';\n\n    if (!currentAddToCartButton && !this.refs.acceleratedCheckoutButtonContainer) return;\n\n    // Update the button state\n    if (currentAddToCartButton) {\n      if (event.detail.resource == null || event.detail.resource.available == false) {\n        addToCartButtonContainer.disable();\n      } else {\n        addToCartButtonContainer.enable();\n      }\n\n      // Update the add to cart button text and icon\n      if (newAddToCartButton) {\n        morph(currentAddToCartButton, newAddToCartButton);\n      }\n    }\n\n    if (this.refs.acceleratedCheckoutButtonContainer) {\n      if (event.detail.resource == null || event.detail.resource.available == false) {\n        this.refs.acceleratedCheckoutButtonContainer?.setAttribute('hidden', 'true');\n      } else {\n        this.refs.acceleratedCheckoutButtonContainer?.removeAttribute('hidden');\n      }\n    }\n\n    // Set the data attribute for the add to cart button to the product variant media if it exists\n    if (event.detail.resource) {\n      const productVariantMedia = event.detail.resource.featured_media?.preview_image?.src;\n      productVariantMedia &&\n        addToCartButtonContainer?.setAttribute('data-product-variant-media', productVariantMedia + '&width=100');\n    }\n\n    // Update quantity selector's min/max/step attributes and cart quantity for the new variant\n    const quantitySelector = /** @type {any} */ (this.querySelector('quantity-selector-component'));\n    const newQuantityInput = /** @type {HTMLInputElement | null} */ (\n      event.detail.data.html.querySelector('quantity-selector-component input[ref=\"quantityInput\"]')\n    );\n\n    if (quantitySelector?.updateConstraints && newQuantityInput) {\n      quantitySelector.updateConstraints(\n        newQuantityInput.min,\n        newQuantityInput.max || null,\n        newQuantityInput.step\n      );\n    }\n\n    // Check if quantity rules are appearing/disappearing (causes layout shift)\n    const quantityRules = this.refs.quantityRules;\n    const newQuantityRules = event.detail.data.html.querySelector('.quantity-rules');\n    const isQuantityRulesChanging = !!quantityRules !== !!newQuantityRules;\n\n    if (isQuantityRulesChanging && quantitySelector) {\n      // Store quantity value before morphing entire container\n      const currentQuantityValue = quantitySelector.getValue?.();\n\n      const currentProductFormButtons = this.refs.productFormButtons;\n      const newProductFormButtons = event.detail.data.html.querySelector('.product-form-buttons');\n\n      if (currentProductFormButtons && newProductFormButtons) {\n        morph(currentProductFormButtons, newProductFormButtons);\n\n        // Get the NEW quantity selector after morphing and update its constraints\n        const newQuantitySelector = /** @type {any} */ (this.querySelector('quantity-selector-component'));\n        const newQuantityInputElement = /** @type {HTMLInputElement | null} */ (\n          event.detail.data.html.querySelector('quantity-selector-component input[ref=\"quantityInput\"]')\n        );\n\n        if (newQuantitySelector?.updateConstraints && newQuantityInputElement && currentQuantityValue) {\n          // Temporarily set the old value so updateConstraints can snap it properly\n          newQuantitySelector.setValue(currentQuantityValue);\n          // updateConstraints will snap to valid increment if needed\n          newQuantitySelector.updateConstraints(\n            newQuantityInputElement.min,\n            newQuantityInputElement.max || null,\n            newQuantityInputElement.step\n          );\n        }\n      }\n    } else {\n      // Update elements individually when layout isn't changing\n      const quantityLabel = this.querySelector('.quantity-label');\n      const newQuantityLabel = event.detail.data.html.querySelector('.quantity-label');\n      this.#morphOrUpdateElement(quantityLabel, newQuantityLabel, quantitySelector);\n\n      const addToCartButton = this.querySelector('[ref=\"addToCartButtonContainer\"]');\n      this.#morphOrUpdateElement(quantityRules, newQuantityRules, addToCartButton);\n    }\n\n    // Fetch and update cart quantity for the new variant\n    await this.#fetchAndUpdateCartQuantity();\n  };\n\n  /**\n   * Disable the add to cart button while the UI is updating before #onVariantUpdate is called.\n   * Accelerated checkout button is also disabled via its own event listener not exposed to the theme.\n   */\n  #onVariantSelected = () => {\n    this.refs.addToCartButtonContainer?.disable();\n  };\n}\n\nif (!customElements.get('product-form-component')) {\n  customElements.define('product-form-component', ProductFormComponent);\n}\n\nclass FlyToCart extends HTMLElement {\n  /** @type {Element} */\n  source;\n\n  /** @type {Element} */\n  destination;\n\n  connectedCallback() {\n    this.#animate();\n  }\n\n  #animate() {\n    const rect = this.getBoundingClientRect();\n    const sourceRect = this.source.getBoundingClientRect();\n    const destinationRect = this.destination.getBoundingClientRect();\n\n    //Define bezier curve points\n    // Maybe add half of the size of the flying thingy to the x and y to make it center properly\n    const offset = {\n      x: rect.width / 2,\n      y: rect.height / 2,\n    };\n    const startPoint = {\n      x: sourceRect.left + sourceRect.width / 2 - offset.x,\n      y: sourceRect.top + sourceRect.height / 2 - offset.y,\n    };\n\n    const endPoint = {\n      x: destinationRect.left + destinationRect.width / 2 - offset.x,\n      y: destinationRect.top + destinationRect.height / 2 - offset.y,\n    };\n\n    //Calculate the control points\n    const controlPoint1 = { x: startPoint.x, y: startPoint.y - 200 }; // Go up 200px\n    const controlPoint2 = { x: endPoint.x - 300, y: endPoint.y - 100 }; // Go left 300px and up 100px\n\n    //Animation variables\n    /** @type {number | null} */\n    let startTime = null;\n    const duration = 600; // 600ms\n\n    this.style.opacity = '1';\n\n    /**\n     * Animates the flying thingy along the bezier curve.\n     * @param {number} currentTime - The current time.\n     */\n    const animate = (currentTime) => {\n      if (!startTime) startTime = currentTime;\n      const elapsed = currentTime - startTime;\n      const progress = Math.min(elapsed / duration, 1);\n\n      // Calculate current position along the bezier curve\n      const position = bezierPoint(progress, startPoint, controlPoint1, controlPoint2, endPoint);\n\n      //Update the position of the flying thingy\n      this.style.setProperty('--x', `${position.x}px`);\n      this.style.setProperty('--y', `${position.y}px`);\n\n      // Scale down as it approaches the cart\n      const scale = 1 - progress * 0.5;\n      this.style.setProperty('--scale', `${scale}`);\n\n      //Continue the animation if not finished\n      if (progress < 1) {\n        requestAnimationFrame(animate);\n      } else {\n        //Fade out the flying thingy\n        this.style.opacity = '0';\n        onAnimationEnd(this, () => this.remove());\n      }\n    };\n\n    // Position the flying thingy back to the start point\n    this.style.setProperty('--x', `${startPoint.x}px`);\n    this.style.setProperty('--y', `${startPoint.y}px`);\n\n    //Start the animation\n    requestAnimationFrame(animate);\n  }\n}\n\n/**\n * Calculates a point on a cubic B\u00E9zier curve.\n * @param {number} t - The parameter value (0 <= t <= 1).\n * @param {{x: number, y: number}} p0 - The starting point (x, y).\n * @param {{x: number, y: number}} p1 - The first control point (x, y).\n * @param {{x: number, y: number}} p2 - The second control point (x, y).\n * @param {{x: number, y: number}} p3 - The ending point (x, y).\n * @returns {{x: number, y: number}} The point on the curve.\n */\nfunction bezierPoint(t, p0, p1, p2, p3) {\n  const cX = 3 * (p1.x - p0.x);\n  const bX = 3 * (p2.x - p1.x) - cX;\n  const aX = p3.x - p0.x - cX - bX;\n\n  const cY = 3 * (p1.y - p0.y);\n  const bY = 3 * (p2.y - p1.y) - cY;\n  const aY = p3.y - p0.y - cY - bY;\n\n  const x = aX * Math.pow(t, 3) + bX * Math.pow(t, 2) + cX * t + p0.x;\n  const y = aY * Math.pow(t, 3) + bY * Math.pow(t, 2) + cY * t + p0.y;\n\n  return { x, y };\n}\n\nif (!customElements.get('fly-to-cart')) {\n  customElements.define('fly-to-cart', FlyToCart);\n}\n"],
  "mappings": "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",
  "names": []
}
