{
  "version": 3,
  "sources": ["/cdn/shop/t/9/assets/cart-grouping.js?cv=4"],
  "sourcesContent": ["/**\r\n * Cart Grouping System\r\n * Handles visual grouping of cart items by child name\r\n *\r\n * PRIMARY SOURCE: This is the canonical implementation (moved from resources-old/js/cart-grouping.js)\r\n * Built version is in assets/cart-grouping.js and loaded in layout/theme.liquid\r\n *\r\n * Features:\r\n * - Groups cart items in drawer by child name (reads \"For\" property)\r\n * - Creates section headers: \"For: ChildName\"\r\n * - Watches for cart updates via MutationObserver\r\n * - Re-groups automatically when items added/removed/quantities changed\r\n * - Works with RecommendationsModal items that include child name\r\n *\r\n * Integration points:\r\n * - RecommendationsModal sends items with: properties: { For: childName }\r\n * - CartGrouping detects this and formats the drawer display\r\n * - Listens to cart:unified-update event (primary)\r\n * - Fallback listeners for cart-items:refreshed, cart-drawer:refreshed\r\n */\r\nclass CartGrouping {\r\n  constructor() {\r\n    this.init();\r\n  }\r\n\r\n  // Static flag to prevent infinite loops\r\n  static isProcessing = false;\r\n  // Track when the last unified update occurred\r\n  static lastUnifiedUpdate = 0;\r\n\r\n  init() {\r\n    // Only initialize if not already processing\r\n    if (CartGrouping.isProcessing) {\r\n      return;\r\n    }\r\n\r\n    this.processCartItems();\r\n  }\r\n\r\n  processCartItems() {\r\n    try {\r\n      // Set processing flag\r\n      CartGrouping.isProcessing = true;\r\n      \r\n      // Process both cart drawer and main cart\r\n      const cartDrawerItems = document.querySelector('cart-drawer-items');\r\n      const mainCartItems = document.querySelector('cart-items');\r\n      \r\n      if (cartDrawerItems) {\r\n        this.groupItemsInContainer(cartDrawerItems);\r\n      }\r\n      \r\n      if (mainCartItems) {\r\n        this.groupItemsInContainer(mainCartItems);\r\n      }\r\n      \r\n      // Reset processing flag after a short delay\r\n      setTimeout(() => {\r\n        CartGrouping.isProcessing = false;\r\n      }, 100);\r\n    } catch (error) {\r\n      console.error('\u274C Error processing cart items:', error);\r\n      // Reset processing flag on error\r\n      CartGrouping.isProcessing = false;\r\n    }\r\n  }\r\n\r\n  groupItemsInContainer(container) {\r\n    try {\r\n      const tbody = container.querySelector('tbody');\r\n      if (!tbody) {\r\n        return;\r\n      }\r\n\r\n      const items = tbody.querySelectorAll('.cart-item');\r\n      if (items.length === 0) {\r\n        return;\r\n      }\r\n\r\n      // Group items by child name\r\n      const groups = this.groupItemsByChild(items);\r\n      \r\n      // Don't clear if no groups to process\r\n      if (Object.keys(groups).length === 0) {\r\n        return;\r\n      }\r\n      \r\n      // Clear existing content\r\n      tbody.innerHTML = '';\r\n      \r\n      // Add grouped content\r\n      Object.entries(groups).forEach(([childName, groupItems]) => {\r\n        if (childName && childName !== 'null' && childName !== '') {\r\n          // Add group header\r\n          const headerRow = this.createGroupHeader(childName, container);\r\n          if (headerRow) {\r\n            tbody.appendChild(headerRow);\r\n          }\r\n          \r\n          // Add grouped items; hide duplicated 'For:' line meta inside rows\r\n          groupItems.forEach(item => {\r\n            item.classList.add('cart-item--grouped');\r\n            // Hide inline 'For: ...' meta if present under this grouped header\r\n            const meta = item.querySelector('.product-option, .cart-item__property, [data-line-property]');\r\n            if (meta) {\r\n              const text = (meta.textContent || '').toLowerCase();\r\n              if (text.includes('for:')) meta.style.display = 'none';\r\n            }\r\n            tbody.appendChild(item);\r\n          });\r\n        } else {\r\n          // Add ungrouped items\r\n          groupItems.forEach(item => {\r\n            tbody.appendChild(item);\r\n          });\r\n        }\r\n      });\r\n\r\n    } catch (error) {\r\n      console.error('\u274C Error grouping items in container:', error);\r\n    }\r\n  }\r\n\r\n  groupItemsByChild(items) {\r\n    try {\r\n      const groups = {};\r\n      \r\n      items.forEach(item => {\r\n        const childName = item.getAttribute('data-for-child');\r\n        if (!groups[childName]) {\r\n          groups[childName] = [];\r\n        }\r\n        groups[childName].push(item);\r\n      });\r\n      \r\n      return groups;\r\n    } catch (error) {\r\n      console.error('\u274C Error grouping items by child:', error);\r\n      return {};\r\n    }\r\n  }\r\n\r\n  createGroupHeader(childName, container) {\r\n    try {\r\n      const isDrawer = container.tagName === 'CART-DRAWER-ITEMS';\r\n      const colspan = isDrawer ? 4 : 5;\r\n      \r\n      const headerRow = document.createElement('tr');\r\n      headerRow.className = 'cart-item-group-header';\r\n      \r\n      const headerCell = document.createElement('td');\r\n      headerCell.colSpan = colspan;\r\n      headerCell.className = 'cart-item-group-title';\r\n      \r\n      const headerTitle = document.createElement('h3');\r\n      headerTitle.className = 'h4';\r\n      headerTitle.textContent = `For: ${childName}`;\r\n      \r\n      headerCell.appendChild(headerTitle);\r\n      headerRow.appendChild(headerCell);\r\n      \r\n      return headerRow;\r\n    } catch (error) {\r\n      console.error('\u274C Error creating group header:', error);\r\n      return null;\r\n    }\r\n  }\r\n}\r\n\r\n// Initialize when DOM is ready\r\nif (document.readyState === 'loading') {\r\n  document.addEventListener('DOMContentLoaded', function () {\r\n    new CartGrouping();\r\n  });\r\n} else {\r\n  new CartGrouping();\r\n}\r\n\r\n// Listen for unified cart updates (preferred)\r\ndocument.addEventListener('cart:unified-update', (event) => {\r\n  // No need to delay - grouping is already applied in the unified update\r\n  // Mark that we've handled this update\r\n  CartGrouping.lastUnifiedUpdate = Date.now();\r\n});\r\n\r\n// Fallback listeners for individual cart events (with longer delays to prevent conflicts)\r\ndocument.addEventListener('cart-items:refreshed', function (event) {\r\n  // Only apply grouping if not from unified update and enough time has passed\r\n  const timeSinceUnified = Date.now() - (CartGrouping.lastUnifiedUpdate || 0);\r\n  if (!event?.detail?.updateType?.includes('unified') && timeSinceUnified > 1000) {\r\n    setTimeout(function () {\r\n      return new CartGrouping();\r\n    }, 500); // Longer delay to prevent conflicts\r\n  }\r\n});\r\n\r\ndocument.addEventListener('cart-drawer:refreshed', function (event) {\r\n  // Only apply grouping if not from unified update and enough time has passed\r\n  const timeSinceUnified = Date.now() - (CartGrouping.lastUnifiedUpdate || 0);\r\n  if (!event?.detail?.updateType?.includes('unified') && timeSinceUnified > 1000) {\r\n    setTimeout(function () {\r\n      return new CartGrouping();\r\n    }, 500); // Longer delay to prevent conflicts\r\n  }\r\n});\r\n\r\n// Listen for quantity changes - wait for cart to update\r\ndocument.addEventListener('change', (event) => {\r\n  if (event.target.matches('input[data-quantity-variant-id]')) {\r\n    // Skip if a unified update was recent\r\n    const timeSinceUnified = Date.now() - CartGrouping.lastUnifiedUpdate;\r\n    if (timeSinceUnified < 1000) {\r\n      return;\r\n    }\r\n    \r\n    // Wait for the cart to be updated by Shopify\r\n    setTimeout(() => new CartGrouping(), 1000);\r\n  }\r\n});\r\n\r\n// Listen for remove button clicks - wait for cart to update\r\ndocument.addEventListener('click', (event) => {\r\n  if (event.target.closest('cart-remove-button')) {\r\n    // Skip if a unified update was recent\r\n    const timeSinceUnified = Date.now() - CartGrouping.lastUnifiedUpdate;\r\n    if (timeSinceUnified < 1000) {\r\n      return;\r\n    }\r\n    \r\n    // Wait for the cart to be updated by Shopify\r\n    setTimeout(() => new CartGrouping(), 1000);\r\n  }\r\n});\r\n\r\n// Use MutationObserver to watch for cart content changes\r\nconst cartObserver = new MutationObserver((mutations) => {\r\n  // Skip if we're already processing\r\n  if (CartGrouping.isProcessing) {\r\n    return;\r\n  }\r\n  \r\n  // Skip if a unified update was recent\r\n  const timeSinceUnified = Date.now() - CartGrouping.lastUnifiedUpdate;\r\n  if (timeSinceUnified < 1000) {\r\n    return;\r\n  }\r\n  \r\n  let shouldRegroup = false;\r\n  \r\n  mutations.forEach((mutation) => {\r\n    if (mutation.type === 'childList') {\r\n      const target = mutation.target;\r\n      if (target.closest('cart-items') || target.closest('cart-drawer-items')) {\r\n        // Check if this is actually a cart item being added/removed\r\n        const addedNodes = Array.from(mutation.addedNodes);\r\n        const removedNodes = Array.from(mutation.removedNodes);\r\n        \r\n        const hasCartItemChanges = addedNodes.some(node => \r\n          node.nodeType === Node.ELEMENT_NODE && \r\n          (node.classList?.contains('cart-item') || node.querySelector?.('.cart-item'))\r\n        ) || removedNodes.some(node => \r\n          node.nodeType === Node.ELEMENT_NODE && \r\n          (node.classList?.contains('cart-item') || node.querySelector?.('.cart-item'))\r\n        );\r\n        \r\n        // Don't regroup if we're adding our own group headers\r\n        const isAddingGroupHeader = addedNodes.some(node => \r\n          node.nodeType === Node.ELEMENT_NODE && \r\n          node.classList?.contains('cart-item-group-header')\r\n        );\r\n        \r\n        if (hasCartItemChanges && !isAddingGroupHeader) {\r\n          shouldRegroup = true;\r\n        }\r\n      }\r\n    }\r\n  });\r\n  \r\n  if (shouldRegroup) {\r\n    // Wait a bit longer for the cart to be fully updated\r\n    setTimeout(() => new CartGrouping(), 500);\r\n  }\r\n});\r\n\r\n// Start observing when DOM is ready\r\nif (document.readyState === 'loading') {\r\n  document.addEventListener('DOMContentLoaded', () => {\r\n    const cartContainers = document.querySelectorAll('cart-items, cart-drawer-items');\r\n    cartContainers.forEach(container => {\r\n      cartObserver.observe(container, { childList: true, subtree: true });\r\n    });\r\n  });\r\n} else {\r\n  const cartContainers = document.querySelectorAll('cart-items, cart-drawer-items');\r\n  cartContainers.forEach(container => {\r\n    cartObserver.observe(container, { childList: true, subtree: true });\r\n  });\r\n} \r\n"],
  "mappings": "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",
  "names": []
}
