{
  "version": 3,
  "sources": ["/cdn/shop/t/8/assets/component-cart-items.js?czujg=xa"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { fetchConfig, debounce, onAnimationEnd, prefersReducedMotion, resetShimmer } from '@theme/utilities';\nimport { morphSection, sectionRenderer } from '@theme/section-renderer';\nimport {\n  ThemeEvents,\n  CartUpdateEvent,\n  QuantitySelectorUpdateEvent,\n  CartAddEvent,\n  DiscountUpdateEvent,\n} from '@theme/events';\nimport { cartPerformance } from '@theme/performance';\n\n/** @typedef {import('./utilities').TextComponent} TextComponent */\n\n/**\n * A custom element that displays a cart items component.\n *\n * @typedef {object} Refs\n * @property {HTMLElement[]} quantitySelectors - The quantity selector elements.\n * @property {HTMLTableRowElement[]} cartItemRows - The cart item rows.\n * @property {TextComponent} cartTotal - The cart total.\n *\n * @extends {Component<Refs>}\n */\nclass CartItemsComponent extends Component {\n  #debouncedOnChange = debounce(this.#onQuantityChange, 300).bind(this);\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    document.addEventListener(ThemeEvents.cartUpdate, this.#handleCartUpdate);\n    document.addEventListener(ThemeEvents.discountUpdate, this.handleDiscountUpdate);\n    document.addEventListener(ThemeEvents.quantitySelectorUpdate, this.#debouncedOnChange);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    document.removeEventListener(ThemeEvents.cartUpdate, this.#handleCartUpdate);\n    document.removeEventListener(ThemeEvents.quantitySelectorUpdate, this.#debouncedOnChange);\n  }\n\n  /**\n   * Handles QuantitySelectorUpdateEvent change event.\n   * @param {QuantitySelectorUpdateEvent} event - The event.\n   */\n  #onQuantityChange(event) {\n    const { quantity, cartLine: line } = event.detail;\n\n    if (!line) return;\n\n    if (quantity === 0) {\n      return this.onLineItemRemove(line);\n    }\n\n    this.updateQuantity({\n      line,\n      quantity,\n      action: 'change',\n    });\n    const lineItemRow = this.refs.cartItemRows[line - 1];\n\n    if (!lineItemRow) return;\n\n    const textComponent = /** @type {TextComponent | undefined} */ (lineItemRow.querySelector('text-component'));\n    textComponent?.shimmer();\n  }\n\n  /**\n   * Handles the line item removal.\n   * @param {number} line - The line item index.\n   */\n  onLineItemRemove(line) {\n    this.updateQuantity({\n      line,\n      quantity: 0,\n      action: 'clear',\n    });\n\n    const cartItemRowToRemove = this.refs.cartItemRows[line - 1];\n\n    if (!cartItemRowToRemove) return;\n\n    const rowsToRemove = [\n      cartItemRowToRemove,\n      // Get all nested lines of the row to remove\n      ...this.refs.cartItemRows.filter((row) => row.dataset.parentKey === cartItemRowToRemove.dataset.key),\n    ];\n\n    // Add class to the row to trigger the animation\n    rowsToRemove.forEach((row) => {\n      const remove = () => row.remove();\n\n      if (prefersReducedMotion()) return remove();\n\n      row.style.setProperty('--row-height', `${row.clientHeight}px`);\n      row.classList.add('removing');\n\n      // Remove the row after the animation ends\n      onAnimationEnd(row, remove);\n    });\n  }\n\n  /**\n   * Updates the quantity.\n   * @param {Object} config - The config.\n   * @param {number} config.line - The line.\n   * @param {number} config.quantity - The quantity.\n   * @param {string} config.action - The action.\n   */\n  updateQuantity(config) {\n    const cartPerformaceUpdateMarker = cartPerformance.createStartingMarker(`${config.action}:user-action`);\n\n    this.#disableCartItems();\n\n    const { line, quantity } = config;\n    const { cartTotal } = this.refs;\n\n    const cartItemsComponents = document.querySelectorAll('cart-items-component');\n    const sectionsToUpdate = new Set([this.sectionId]);\n    cartItemsComponents.forEach((item) => {\n      if (item instanceof HTMLElement && item.dataset.sectionId) {\n        sectionsToUpdate.add(item.dataset.sectionId);\n      }\n    });\n\n    const body = JSON.stringify({\n      line: line,\n      quantity: quantity,\n      sections: Array.from(sectionsToUpdate).join(','),\n      sections_url: window.location.pathname,\n    });\n\n    cartTotal?.shimmer();\n\n    fetch(`${Theme.routes.cart_change_url}`, fetchConfig('json', { body }))\n      .then((response) => {\n        return response.text();\n      })\n      .then((responseText) => {\n        const parsedResponseText = JSON.parse(responseText);\n\n        resetShimmer(this);\n\n        if (parsedResponseText.errors) {\n          this.#handleCartError(line, parsedResponseText);\n          return;\n        }\n\n        const newSectionHTML = new DOMParser().parseFromString(\n          parsedResponseText.sections[this.sectionId],\n          'text/html'\n        );\n\n        // Grab the new cart item count from a hidden element\n        const newCartHiddenItemCount = newSectionHTML.querySelector('[ref=\"cartItemCount\"]')?.textContent;\n        const newCartItemCount = newCartHiddenItemCount ? parseInt(newCartHiddenItemCount, 10) : 0;\n\n        this.dispatchEvent(\n          new CartUpdateEvent({}, this.sectionId, {\n            itemCount: newCartItemCount,\n            source: 'cart-items-component',\n            sections: parsedResponseText.sections,\n          })\n        );\n\n        morphSection(this.sectionId, parsedResponseText.sections[this.sectionId]);\n      })\n      .catch((error) => {\n        console.error(error);\n      })\n      .finally(() => {\n        this.#enableCartItems();\n        cartPerformance.measureFromMarker(cartPerformaceUpdateMarker);\n      });\n  }\n\n  /**\n   * Handles the discount update.\n   * @param {DiscountUpdateEvent} event - The event.\n   */\n  handleDiscountUpdate = (event) => {\n    this.#handleCartUpdate(event);\n  };\n\n  /**\n   * Handles the cart error.\n   * @param {number} line - The line.\n   * @param {Object} parsedResponseText - The parsed response text.\n   * @param {string} parsedResponseText.errors - The errors.\n   */\n  #handleCartError = (line, parsedResponseText) => {\n    const quantitySelector = this.refs.quantitySelectors[line - 1];\n    const quantityInput = quantitySelector?.querySelector('input');\n\n    if (!quantityInput) throw new Error('Quantity input not found');\n\n    quantityInput.value = quantityInput.defaultValue;\n\n    const cartItemError = this.refs[`cartItemError-${line}`];\n    const cartItemErrorContainer = this.refs[`cartItemErrorContainer-${line}`];\n\n    if (!(cartItemError instanceof HTMLElement)) throw new Error('Cart item error not found');\n    if (!(cartItemErrorContainer instanceof HTMLElement)) throw new Error('Cart item error container not found');\n\n    cartItemError.textContent = parsedResponseText.errors;\n    cartItemErrorContainer.classList.remove('hidden');\n  };\n\n  /**\n   * Handles the cart update.\n   *\n   * @param {DiscountUpdateEvent | CartUpdateEvent | CartAddEvent} event\n   */\n  #handleCartUpdate = (event) => {\n    if (event instanceof DiscountUpdateEvent) {\n      sectionRenderer.renderSection(this.sectionId, { cache: false });\n      return;\n    }\n    if (event.target === this) return;\n\n    const cartItemsHtml = event.detail.data.sections?.[this.sectionId];\n    if (cartItemsHtml) {\n      morphSection(this.sectionId, cartItemsHtml);\n    } else {\n      sectionRenderer.renderSection(this.sectionId, { cache: false });\n    }\n  };\n\n  /**\n   * Disables the cart items.\n   */\n  #disableCartItems() {\n    this.classList.add('cart-items-disabled');\n  }\n\n  /**\n   * Enables the cart items.\n   */\n  #enableCartItems() {\n    this.classList.remove('cart-items-disabled');\n  }\n\n  /**\n   * Gets the section id.\n   * @returns {string} The section id.\n   */\n  get sectionId() {\n    const { sectionId } = this.dataset;\n\n    if (!sectionId) throw new Error('Section id missing');\n\n    return sectionId;\n  }\n}\n\nif (!customElements.get('cart-items-component')) {\n  customElements.define('cart-items-component', CartItemsComponent);\n}\n"],
  "mappings": "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",
  "names": []
}
