@magic-spells/cart-panel 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cart-panel.cjs.js +34 -7
- package/dist/cart-panel.cjs.js.map +1 -1
- package/dist/cart-panel.esm.js +35 -8
- package/dist/cart-panel.esm.js.map +1 -1
- package/dist/cart-panel.js +1681 -1619
- package/dist/cart-panel.js.map +1 -1
- package/dist/cart-panel.min.js +1 -1
- package/package.json +2 -2
- package/src/cart-panel.js +35 -7
package/dist/cart-panel.cjs.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var cartItem = require('@magic-spells/cart-item');
|
|
6
5
|
require('@magic-spells/focus-trap');
|
|
7
6
|
var EventEmitter = require('@magic-spells/event-emitter');
|
|
7
|
+
var cartItem = require('@magic-spells/cart-item');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Custom element that creates an accessible modal cart dialog with focus management
|
|
@@ -280,7 +280,6 @@ class CartDialog extends HTMLElement {
|
|
|
280
280
|
this.#currentCart = updatedCart;
|
|
281
281
|
this.#renderCartItems(updatedCart);
|
|
282
282
|
this.#renderCartPanel(updatedCart);
|
|
283
|
-
element.setState('ready');
|
|
284
283
|
|
|
285
284
|
// Emit cart updated and data changed events
|
|
286
285
|
const cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);
|
|
@@ -325,7 +324,7 @@ class CartDialog extends HTMLElement {
|
|
|
325
324
|
if (!cartData) return;
|
|
326
325
|
|
|
327
326
|
// Calculate subtotal from all items except those marked to ignore pricing
|
|
328
|
-
const pricedItems = cartData.items.filter(item => {
|
|
327
|
+
const pricedItems = cartData.items.filter((item) => {
|
|
329
328
|
const ignorePrice = item.properties?._ignore_price_in_subtotal;
|
|
330
329
|
return !ignorePrice;
|
|
331
330
|
});
|
|
@@ -480,6 +479,26 @@ class CartDialog extends HTMLElement {
|
|
|
480
479
|
});
|
|
481
480
|
}
|
|
482
481
|
|
|
482
|
+
/**
|
|
483
|
+
* Update existing cart-item elements with fresh cart data
|
|
484
|
+
* @private
|
|
485
|
+
*/
|
|
486
|
+
#updateItemsInDOM(itemsContainer, cartData) {
|
|
487
|
+
const visibleItems = this.#getVisibleCartItems(cartData);
|
|
488
|
+
const existingItems = Array.from(itemsContainer.querySelectorAll('cart-item'));
|
|
489
|
+
|
|
490
|
+
existingItems.forEach((cartItemEl) => {
|
|
491
|
+
const key = cartItemEl.getAttribute('key');
|
|
492
|
+
const updatedItemData = visibleItems.find((item) => (item.key || item.id) === key);
|
|
493
|
+
|
|
494
|
+
if (updatedItemData) {
|
|
495
|
+
// Update cart-item with fresh data and full cart context
|
|
496
|
+
// The cart-item will handle HTML comparison and only re-render if needed
|
|
497
|
+
cartItemEl.setData(updatedItemData, cartData);
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
|
|
483
502
|
/**
|
|
484
503
|
* Add new items to DOM with animation delay
|
|
485
504
|
* @private
|
|
@@ -538,9 +557,16 @@ class CartDialog extends HTMLElement {
|
|
|
538
557
|
#addCalculatedFields(cartData) {
|
|
539
558
|
if (!cartData) return cartData;
|
|
540
559
|
|
|
560
|
+
// For display counts: use visible items (excludes _hide_in_cart)
|
|
541
561
|
const visibleItems = this.#getVisibleCartItems(cartData);
|
|
542
562
|
const calculated_count = visibleItems.reduce((total, item) => total + item.quantity, 0);
|
|
543
|
-
|
|
563
|
+
|
|
564
|
+
// For pricing: use all items except those marked to ignore pricing
|
|
565
|
+
const pricedItems = cartData.items.filter((item) => {
|
|
566
|
+
const ignorePrice = item.properties?._ignore_price_in_subtotal;
|
|
567
|
+
return !ignorePrice;
|
|
568
|
+
});
|
|
569
|
+
const calculated_subtotal = pricedItems.reduce(
|
|
544
570
|
(total, item) => total + (item.line_price || 0),
|
|
545
571
|
0
|
|
546
572
|
);
|
|
@@ -581,8 +607,6 @@ class CartDialog extends HTMLElement {
|
|
|
581
607
|
// Create cart-item elements without animation
|
|
582
608
|
visibleItems.forEach((itemData) => {
|
|
583
609
|
const cartItem$1 = new cartItem.CartItem(itemData); // No animation
|
|
584
|
-
// const cartItem = document.createElement('cart-item');
|
|
585
|
-
// cartItem.setData(itemData);
|
|
586
610
|
itemsContainer.appendChild(cartItem$1);
|
|
587
611
|
});
|
|
588
612
|
|
|
@@ -602,7 +626,10 @@ class CartDialog extends HTMLElement {
|
|
|
602
626
|
// Step 1: Remove items that are no longer in cart data
|
|
603
627
|
this.#removeItemsFromDOM(itemsContainer, newKeysSet);
|
|
604
628
|
|
|
605
|
-
// Step 2:
|
|
629
|
+
// Step 2: Update existing items with fresh data (handles templates, bundles, etc.)
|
|
630
|
+
this.#updateItemsInDOM(itemsContainer, cartData);
|
|
631
|
+
|
|
632
|
+
// Step 3: Add new items that weren't in DOM (with animation delay)
|
|
606
633
|
const itemsToAdd = visibleItems.filter(
|
|
607
634
|
(itemData) => !currentKeys.has(itemData.key || itemData.id)
|
|
608
635
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart-panel.cjs.js","sources":["../src/cart-panel.js"],"sourcesContent":["import './cart-panel.scss';\nimport { CartItem } from '@magic-spells/cart-item';\nimport '@magic-spells/focus-trap';\nimport EventEmitter from '@magic-spells/event-emitter';\n\n/**\n * Custom element that creates an accessible modal cart dialog with focus management\n * @extends HTMLElement\n */\nclass CartDialog extends HTMLElement {\n\t#handleTransitionEnd;\n\t#currentCart = null;\n\t#eventEmitter;\n\t#isInitialRender = true;\n\n\t/**\n\t * Clean up event listeners when component is removed from DOM\n\t */\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\n\t\t// Ensure body scroll is restored if component is removed while open\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t\tthis.#restoreScroll();\n\n\t\t// Detach event listeners\n\t\tthis.#detachListeners();\n\t}\n\n\t/**\n\t * Locks body scrolling\n\t * @private\n\t */\n\t#lockScroll() {\n\t\t// Apply overflow hidden to body\n\t\tdocument.body.classList.add('overflow-hidden');\n\t}\n\n\t/**\n\t * Restores body scrolling when cart dialog is closed\n\t * @private\n\t */\n\t#restoreScroll() {\n\t\t// Remove overflow hidden from body\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t}\n\n\t/**\n\t * Initializes the cart dialog, sets up focus trap and overlay\n\t */\n\tconstructor() {\n\t\tsuper();\n\t\tconst _ = this;\n\t\t_.id = _.getAttribute('id');\n\t\t_.setAttribute('role', 'dialog');\n\t\t_.setAttribute('aria-modal', 'true');\n\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t_.triggerEl = null;\n\n\t\t// Initialize event emitter\n\t\t_.#eventEmitter = new EventEmitter();\n\n\t\t// Create a handler for transition end events\n\t\t_.#handleTransitionEnd = (e) => {\n\t\t\tif (e.propertyName === 'opacity' && _.getAttribute('aria-hidden') === 'true') {\n\t\t\t\t_.contentPanel.classList.add('hidden');\n\n\t\t\t\t// Emit afterHide event - cart dialog has completed its transition\n\t\t\t\t_.#emit('cart-dialog:afterHide', { triggerElement: _.triggerEl });\n\t\t\t}\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Now that we're in the DOM, find the content panel and set up focus trap\n\t\t_.contentPanel = _.querySelector('cart-panel');\n\n\t\tif (!_.contentPanel) {\n\t\t\tconsole.error('cart-panel element not found inside cart-dialog');\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if focus-trap already exists, if not create one\n\t\t_.focusTrap = _.contentPanel.querySelector('focus-trap');\n\t\tif (!_.focusTrap) {\n\t\t\t_.focusTrap = document.createElement('focus-trap');\n\n\t\t\t// Move all existing cart-panel content into the focus trap\n\t\t\tconst existingContent = Array.from(_.contentPanel.childNodes);\n\t\t\texistingContent.forEach((child) => _.focusTrap.appendChild(child));\n\n\t\t\t// Insert focus trap inside the cart-panel\n\t\t\t_.contentPanel.appendChild(_.focusTrap);\n\t\t}\n\n\t\t// Ensure we have labelledby and describedby references\n\t\tif (!_.getAttribute('aria-labelledby')) {\n\t\t\tconst heading = _.querySelector('h1, h2, h3');\n\t\t\tif (heading && !heading.id) {\n\t\t\t\theading.id = `${_.id}-title`;\n\t\t\t}\n\t\t\tif (heading?.id) {\n\t\t\t\t_.setAttribute('aria-labelledby', heading.id);\n\t\t\t}\n\t\t}\n\n\t\t// Add modal overlay if it doesn't already exist\n\t\tif (!_.querySelector('cart-overlay')) {\n\t\t\t_.prepend(document.createElement('cart-overlay'));\n\t\t}\n\t\t_.#attachListeners();\n\t\t_.#bindKeyboard();\n\n\t\t// Load cart data immediately after component initialization\n\t\t_.refreshCart();\n\t}\n\n\t/**\n\t * Event emitter method - Add an event listener with a cleaner API\n\t * @param {string} eventName - Name of the event to listen for\n\t * @param {Function} callback - Callback function to execute when event is fired\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\ton(eventName, callback) {\n\t\tthis.#eventEmitter.on(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Event emitter method - Remove an event listener\n\t * @param {string} eventName - Name of the event to stop listening for\n\t * @param {Function} callback - Callback function to remove\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\toff(eventName, callback) {\n\t\tthis.#eventEmitter.off(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal method to emit events via the event emitter\n\t * @param {string} eventName - Name of the event to emit\n\t * @param {*} [data] - Optional data to include with the event\n\t * @private\n\t */\n\t#emit(eventName, data = null) {\n\t\tthis.#eventEmitter.emit(eventName, data);\n\n\t\t// Also emit as native DOM events for better compatibility\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent(eventName, {\n\t\t\t\tdetail: data,\n\t\t\t\tbubbles: true,\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Attach event listeners for cart dialog functionality\n\t * @private\n\t */\n\t#attachListeners() {\n\t\tconst _ = this;\n\n\t\t// Handle trigger buttons\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest(`[aria-controls=\"${_.id}\"]`);\n\t\t\tif (!trigger) return;\n\n\t\t\tif (trigger.getAttribute('data-prevent-default') === 'true') {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t_.show(trigger);\n\t\t});\n\n\t\t// Handle close buttons\n\t\t_.addEventListener('click', (e) => {\n\t\t\tif (!e.target.closest('[data-action-hide-cart]')) return;\n\t\t\t_.hide();\n\t\t});\n\n\t\t// Handle cart item remove events\n\t\t_.addEventListener('cart-item:remove', (e) => {\n\t\t\t_.#handleCartItemRemove(e);\n\t\t});\n\n\t\t// Handle cart item quantity change events\n\t\t_.addEventListener('cart-item:quantity-change', (e) => {\n\t\t\t_.#handleCartItemQuantityChange(e);\n\t\t});\n\n\t\t// Add transition end listener\n\t\t_.contentPanel.addEventListener('transitionend', _.#handleTransitionEnd);\n\t}\n\n\t/**\n\t * Detach event listeners\n\t * @private\n\t */\n\t#detachListeners() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\t}\n\n\t/**\n\t * Binds keyboard events for accessibility\n\t * @private\n\t */\n\t#bindKeyboard() {\n\t\tthis.addEventListener('keydown', (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Handle cart item removal\n\t * @private\n\t */\n\t#handleCartItemRemove(e) {\n\t\tconst { cartKey, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Remove item by setting quantity to 0\n\t\tthis.updateCartItem(cartKey, 0)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - let smart comparison handle the removal animation\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to remove cart item:', cartKey);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error removing cart item:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Handle cart item quantity change\n\t * @private\n\t */\n\t#handleCartItemQuantityChange(e) {\n\t\tconst { cartKey, quantity, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Update item quantity\n\t\tthis.updateCartItem(cartKey, quantity)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - update cart data and refresh items\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\t\t\t\t\telement.setState('ready');\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to update cart item quantity:', cartKey, quantity);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error updating cart item quantity:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart count elements across the site\n\t * @private\n\t */\n\t#renderCartCount(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate visible item count (excluding _hide_in_cart items)\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst visibleItemCount = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\n\t\t// Update all cart count elements across the site\n\t\tconst cartCountElements = document.querySelectorAll('[data-content-cart-count]');\n\t\tcartCountElements.forEach((element) => {\n\t\t\telement.textContent = visibleItemCount;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart subtotal elements across the site\n\t * @private\n\t */\n\t#renderCartSubtotal(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate subtotal from all items except those marked to ignore pricing\n\t\tconst pricedItems = cartData.items.filter(item => {\n\t\t\tconst ignorePrice = item.properties?._ignore_price_in_subtotal;\n\t\t\treturn !ignorePrice;\n\t\t});\n\t\tconst subtotal = pricedItems.reduce((total, item) => total + (item.line_price || 0), 0);\n\n\t\t// Update all cart subtotal elements across the site\n\t\tconst cartSubtotalElements = document.querySelectorAll('[data-content-cart-subtotal]');\n\t\tcartSubtotalElements.forEach((element) => {\n\t\t\t// Format as currency (assuming cents, convert to dollars)\n\t\t\tconst formatted = (subtotal / 100).toFixed(2);\n\t\t\telement.textContent = `$${formatted}`;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart items display based on cart data\n\t * @private\n\t */\n\t#renderCartPanel(cart = null) {\n\t\tconst cartData = cart || this.#currentCart;\n\t\tif (!cartData) return;\n\n\t\t// Get cart sections\n\t\tconst hasItemsSection = this.querySelector('[data-cart-has-items]');\n\t\tconst emptySection = this.querySelector('[data-cart-is-empty]');\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!hasItemsSection || !emptySection || !itemsContainer) {\n\t\t\tconsole.warn(\n\t\t\t\t'Cart sections not found. Expected [data-cart-has-items], [data-cart-is-empty], and [data-content-cart-items]'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check visible item count for showing/hiding sections\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst hasVisibleItems = visibleItems.length > 0;\n\n\t\t// Show/hide sections based on visible item count\n\t\tif (hasVisibleItems) {\n\t\t\thasItemsSection.style.display = '';\n\t\t\temptySection.style.display = 'none';\n\t\t} else {\n\t\t\thasItemsSection.style.display = 'none';\n\t\t\temptySection.style.display = '';\n\t\t}\n\n\t\t// Update cart count and subtotal across the site\n\t\tthis.#renderCartCount(cartData);\n\t\tthis.#renderCartSubtotal(cartData);\n\t}\n\n\t/**\n\t * Fetch current cart data from server\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\tgetCart() {\n\t\treturn fetch('/cart.json', {\n\t\t\tcrossDomain: true,\n\t\t\tcredentials: 'same-origin',\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching cart:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart item quantity on server\n\t * @param {string|number} key - Cart item key/ID\n\t * @param {number} quantity - New quantity (0 to remove)\n\t * @returns {Promise<Object>} Updated cart data object\n\t */\n\tupdateCartItem(key, quantity) {\n\t\treturn fetch('/cart/change.json', {\n\t\t\tcrossDomain: true,\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'same-origin',\n\t\t\tbody: JSON.stringify({ id: key, quantity: quantity }),\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error updating cart item:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Refresh cart data from server and update components\n\t * @param {Object} [cartObj=null] - Optional cart object to use instead of fetching\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\trefreshCart(cartObj = null) {\n\t\t// If cart object is provided, use it directly\n\t\tif (cartObj && !cartObj.error) {\n\t\t\t// console.log('Using provided cart data:', cartObj);\n\t\t\tthis.#currentCart = cartObj;\n\t\t\tthis.#renderCartItems(cartObj);\n\t\t\tthis.#renderCartPanel(cartObj);\n\n\t\t\t// Emit cart refreshed and data changed events\n\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartObj);\n\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\n\t\t\treturn Promise.resolve(cartObj);\n\t\t}\n\n\t\t// Otherwise fetch from server\n\t\treturn this.getCart().then((cartData) => {\n\t\t\t// console.log('Cart data received:', cartData);\n\t\t\tif (cartData && !cartData.error) {\n\t\t\t\tthis.#currentCart = cartData;\n\t\t\t\tthis.#renderCartItems(cartData);\n\t\t\t\tthis.#renderCartPanel(cartData);\n\n\t\t\t\t// Emit cart refreshed and data changed events\n\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartData);\n\t\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t} else {\n\t\t\t\tconsole.warn('Cart data has error or is null:', cartData);\n\t\t\t}\n\t\t\treturn cartData;\n\t\t});\n\t}\n\n\t/**\n\t * Remove items from DOM that are no longer in cart data\n\t * @private\n\t */\n\t#removeItemsFromDOM(itemsContainer, newKeysSet) {\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\n\t\tconst itemsToRemove = currentItems.filter((item) => !newKeysSet.has(item.getAttribute('key')));\n\n\t\titemsToRemove.forEach((item) => {\n\t\t\tconsole.log('destroy yourself', item);\n\t\t\titem.destroyYourself();\n\t\t});\n\t}\n\n\t/**\n\t * Add new items to DOM with animation delay\n\t * @private\n\t */\n\t#addItemsToDOM(itemsContainer, itemsToAdd, newKeys) {\n\t\t// Delay adding new items by 300ms to let cart slide open first\n\t\tsetTimeout(() => {\n\t\t\titemsToAdd.forEach((itemData) => {\n\t\t\t\tconst cartItem = CartItem.createAnimated(itemData);\n\t\t\t\tconst targetIndex = newKeys.indexOf(itemData.key || itemData.id);\n\n\t\t\t\t// Find the correct position to insert the new item\n\t\t\t\tif (targetIndex === 0) {\n\t\t\t\t\t// Insert at the beginning\n\t\t\t\t\titemsContainer.insertBefore(cartItem, itemsContainer.firstChild);\n\t\t\t\t} else {\n\t\t\t\t\t// Find the item that should come before this one\n\t\t\t\t\tlet insertAfter = null;\n\t\t\t\t\tfor (let i = targetIndex - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst prevKey = newKeys[i];\n\t\t\t\t\t\tconst prevItem = itemsContainer.querySelector(`cart-item[key=\"${prevKey}\"]`);\n\t\t\t\t\t\tif (prevItem) {\n\t\t\t\t\t\t\tinsertAfter = prevItem;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (insertAfter) {\n\t\t\t\t\t\tinsertAfter.insertAdjacentElement('afterend', cartItem);\n\t\t\t\t\t} else {\n\t\t\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 100);\n\t}\n\n\t/**\n\t * Filter cart items to exclude those with _hide_in_cart property\n\t * @private\n\t */\n\t#getVisibleCartItems(cartData) {\n\t\tif (!cartData || !cartData.items) return [];\n\t\treturn cartData.items.filter((item) => {\n\t\t\t// Check for _hide_in_cart in various possible locations\n\t\t\tconst hidden = item.properties?._hide_in_cart;\n\n\t\t\treturn !hidden;\n\t\t});\n\t}\n\n\t/**\n\t * Add calculated fields to cart object for events\n\t * @private\n\t */\n\t#addCalculatedFields(cartData) {\n\t\tif (!cartData) return cartData;\n\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst calculated_count = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\t\tconst calculated_subtotal = visibleItems.reduce(\n\t\t\t(total, item) => total + (item.line_price || 0),\n\t\t\t0\n\t\t);\n\n\t\treturn {\n\t\t\t...cartData,\n\t\t\tcalculated_count,\n\t\t\tcalculated_subtotal,\n\t\t};\n\t}\n\n\t/**\n\t * Render cart items from Shopify cart data with smart comparison\n\t * @private\n\t */\n\t#renderCartItems(cartData) {\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!itemsContainer || !cartData || !cartData.items) {\n\t\t\tconsole.warn('Cannot render cart items:', {\n\t\t\t\titemsContainer: !!itemsContainer,\n\t\t\t\tcartData: !!cartData,\n\t\t\t\titems: cartData?.items?.length,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Filter out items with _hide_in_cart property\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\n\t\t// Handle initial render - load all items without animation\n\t\tif (this.#isInitialRender) {\n\t\t\t// console.log('Initial cart render:', visibleItems.length, 'visible items');\n\n\t\t\t// Clear existing items\n\t\t\titemsContainer.innerHTML = '';\n\n\t\t\t// Create cart-item elements without animation\n\t\t\tvisibleItems.forEach((itemData) => {\n\t\t\t\tconst cartItem = new CartItem(itemData); // No animation\n\t\t\t\t// const cartItem = document.createElement('cart-item');\n\t\t\t\t// cartItem.setData(itemData);\n\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t});\n\n\t\t\tthis.#isInitialRender = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current DOM items and their keys\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\t\tconst currentKeys = new Set(currentItems.map((item) => item.getAttribute('key')));\n\n\t\t// Get new cart data keys in order (only visible items)\n\t\tconst newKeys = visibleItems.map((item) => item.key || item.id);\n\t\tconst newKeysSet = new Set(newKeys);\n\n\t\t// Step 1: Remove items that are no longer in cart data\n\t\tthis.#removeItemsFromDOM(itemsContainer, newKeysSet);\n\n\t\t// Step 2: Add new items that weren't in DOM (with animation delay)\n\t\tconst itemsToAdd = visibleItems.filter(\n\t\t\t(itemData) => !currentKeys.has(itemData.key || itemData.id)\n\t\t);\n\t\tthis.#addItemsToDOM(itemsContainer, itemsToAdd, newKeys);\n\t}\n\n\t/**\n\t * Set the template function for cart items\n\t * @param {Function} templateFn - Function that takes item data and returns HTML string\n\t */\n\tsetCartItemTemplate(templateName, templateFn) {\n\t\tCartItem.setTemplate(templateName, templateFn);\n\t}\n\n\t/**\n\t * Set the processing template function for cart items\n\t * @param {Function} templateFn - Function that returns HTML string for processing state\n\t */\n\tsetCartItemProcessingTemplate(templateFn) {\n\t\tCartItem.setProcessingTemplate(templateFn);\n\t}\n\n\t/**\n\t * Shows the cart dialog and traps focus within it\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the cart dialog\n\t * @fires CartDialog#show - Fired when the cart dialog has been shown\n\t */\n\tshow(triggerEl = null, cartObj) {\n\t\tconst _ = this;\n\t\t_.triggerEl = triggerEl || false;\n\n\t\t// Lock body scrolling\n\t\t_.#lockScroll();\n\n\t\t// Remove the hidden class first to ensure content is rendered\n\t\t_.contentPanel.classList.remove('hidden');\n\n\t\t// Give the browser a moment to process before starting animation\n\t\trequestAnimationFrame(() => {\n\t\t\t// Update ARIA states\n\t\t\t_.setAttribute('aria-hidden', 'false');\n\n\t\t\tif (_.triggerEl) {\n\t\t\t\t_.triggerEl.setAttribute('aria-expanded', 'true');\n\t\t\t}\n\n\t\t\t// Focus management\n\t\t\tconst firstFocusable = _.querySelector(\n\t\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\t\t\t);\n\n\t\t\tif (firstFocusable) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tfirstFocusable.focus();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Refresh cart data when showing\n\t\t\t_.refreshCart(cartObj);\n\n\t\t\t// Emit show event - cart dialog is now visible\n\t\t\t_.#emit('cart-dialog:show', { triggerElement: _.triggerEl });\n\t\t});\n\t}\n\n\t/**\n\t * Hides the cart dialog and restores focus\n\t * @fires CartDialog#hide - Fired when the cart dialog has started hiding (transition begins)\n\t * @fires CartDialog#afterHide - Fired when the cart dialog has completed its hide transition\n\t */\n\thide() {\n\t\tconst _ = this;\n\n\t\t// Update ARIA states\n\t\tif (_.triggerEl) {\n\t\t\t// remove focus from modal panel first\n\t\t\t_.triggerEl.focus();\n\t\t\t// mark trigger as no longer expanded\n\t\t\t_.triggerEl.setAttribute('aria-expanded', 'false');\n\t\t} else {\n\t\t\t// If no trigger element, blur any focused element inside the panel\n\t\t\tconst activeElement = document.activeElement;\n\t\t\tif (activeElement && _.contains(activeElement)) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\t// Set aria-hidden to start transition\n\t\t\t// The transitionend event handler will add display:none when complete\n\t\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t\t// Emit hide event - cart dialog is now starting to hide\n\t\t\t_.#emit('cart-dialog:hide', { triggerElement: _.triggerEl });\n\n\t\t\t// Restore body scroll\n\t\t\t_.#restoreScroll();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that creates a clickable overlay for the cart dialog\n * @extends HTMLElement\n */\nclass CartOverlay extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('tabindex', '-1');\n\t\tthis.setAttribute('aria-hidden', 'true');\n\t\tthis.cartDialog = this.closest('cart-dialog');\n\t\tthis.#attachListeners();\n\t}\n\n\t#attachListeners() {\n\t\tthis.addEventListener('click', () => {\n\t\t\tthis.cartDialog.hide();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that wraps the content of the cart dialog\n * @extends HTMLElement\n */\nclass CartPanel extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('role', 'document');\n\t}\n}\n\nif (!customElements.get('cart-dialog')) {\n\tcustomElements.define('cart-dialog', CartDialog);\n}\nif (!customElements.get('cart-overlay')) {\n\tcustomElements.define('cart-overlay', CartOverlay);\n}\nif (!customElements.get('cart-panel')) {\n\tcustomElements.define('cart-panel', CartPanel);\n}\n\nexport { CartDialog, CartOverlay, CartPanel, CartItem };\nexport default CartDialog;\n\n// Make CartItem available globally for Shopify themes\nif (typeof window !== 'undefined') {\n\twindow.CartItem = CartItem;\n}\n"],"names":["cartItem","CartItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cart-panel.cjs.js","sources":["../src/cart-panel.js"],"sourcesContent":["import './cart-panel.scss';\n\nimport '@magic-spells/focus-trap';\nimport EventEmitter from '@magic-spells/event-emitter';\nimport { CartItem } from '@magic-spells/cart-item';\n\n/**\n * Custom element that creates an accessible modal cart dialog with focus management\n * @extends HTMLElement\n */\nclass CartDialog extends HTMLElement {\n\t#handleTransitionEnd;\n\t#currentCart = null;\n\t#eventEmitter;\n\t#isInitialRender = true;\n\n\t/**\n\t * Clean up event listeners when component is removed from DOM\n\t */\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\n\t\t// Ensure body scroll is restored if component is removed while open\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t\tthis.#restoreScroll();\n\n\t\t// Detach event listeners\n\t\tthis.#detachListeners();\n\t}\n\n\t/**\n\t * Locks body scrolling\n\t * @private\n\t */\n\t#lockScroll() {\n\t\t// Apply overflow hidden to body\n\t\tdocument.body.classList.add('overflow-hidden');\n\t}\n\n\t/**\n\t * Restores body scrolling when cart dialog is closed\n\t * @private\n\t */\n\t#restoreScroll() {\n\t\t// Remove overflow hidden from body\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t}\n\n\t/**\n\t * Initializes the cart dialog, sets up focus trap and overlay\n\t */\n\tconstructor() {\n\t\tsuper();\n\t\tconst _ = this;\n\t\t_.id = _.getAttribute('id');\n\t\t_.setAttribute('role', 'dialog');\n\t\t_.setAttribute('aria-modal', 'true');\n\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t_.triggerEl = null;\n\n\t\t// Initialize event emitter\n\t\t_.#eventEmitter = new EventEmitter();\n\n\t\t// Create a handler for transition end events\n\t\t_.#handleTransitionEnd = (e) => {\n\t\t\tif (e.propertyName === 'opacity' && _.getAttribute('aria-hidden') === 'true') {\n\t\t\t\t_.contentPanel.classList.add('hidden');\n\n\t\t\t\t// Emit afterHide event - cart dialog has completed its transition\n\t\t\t\t_.#emit('cart-dialog:afterHide', { triggerElement: _.triggerEl });\n\t\t\t}\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Now that we're in the DOM, find the content panel and set up focus trap\n\t\t_.contentPanel = _.querySelector('cart-panel');\n\n\t\tif (!_.contentPanel) {\n\t\t\tconsole.error('cart-panel element not found inside cart-dialog');\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if focus-trap already exists, if not create one\n\t\t_.focusTrap = _.contentPanel.querySelector('focus-trap');\n\t\tif (!_.focusTrap) {\n\t\t\t_.focusTrap = document.createElement('focus-trap');\n\n\t\t\t// Move all existing cart-panel content into the focus trap\n\t\t\tconst existingContent = Array.from(_.contentPanel.childNodes);\n\t\t\texistingContent.forEach((child) => _.focusTrap.appendChild(child));\n\n\t\t\t// Insert focus trap inside the cart-panel\n\t\t\t_.contentPanel.appendChild(_.focusTrap);\n\t\t}\n\n\t\t// Ensure we have labelledby and describedby references\n\t\tif (!_.getAttribute('aria-labelledby')) {\n\t\t\tconst heading = _.querySelector('h1, h2, h3');\n\t\t\tif (heading && !heading.id) {\n\t\t\t\theading.id = `${_.id}-title`;\n\t\t\t}\n\t\t\tif (heading?.id) {\n\t\t\t\t_.setAttribute('aria-labelledby', heading.id);\n\t\t\t}\n\t\t}\n\n\t\t// Add modal overlay if it doesn't already exist\n\t\tif (!_.querySelector('cart-overlay')) {\n\t\t\t_.prepend(document.createElement('cart-overlay'));\n\t\t}\n\t\t_.#attachListeners();\n\t\t_.#bindKeyboard();\n\n\t\t// Load cart data immediately after component initialization\n\t\t_.refreshCart();\n\t}\n\n\t/**\n\t * Event emitter method - Add an event listener with a cleaner API\n\t * @param {string} eventName - Name of the event to listen for\n\t * @param {Function} callback - Callback function to execute when event is fired\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\ton(eventName, callback) {\n\t\tthis.#eventEmitter.on(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Event emitter method - Remove an event listener\n\t * @param {string} eventName - Name of the event to stop listening for\n\t * @param {Function} callback - Callback function to remove\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\toff(eventName, callback) {\n\t\tthis.#eventEmitter.off(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal method to emit events via the event emitter\n\t * @param {string} eventName - Name of the event to emit\n\t * @param {*} [data] - Optional data to include with the event\n\t * @private\n\t */\n\t#emit(eventName, data = null) {\n\t\tthis.#eventEmitter.emit(eventName, data);\n\n\t\t// Also emit as native DOM events for better compatibility\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent(eventName, {\n\t\t\t\tdetail: data,\n\t\t\t\tbubbles: true,\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Attach event listeners for cart dialog functionality\n\t * @private\n\t */\n\t#attachListeners() {\n\t\tconst _ = this;\n\n\t\t// Handle trigger buttons\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest(`[aria-controls=\"${_.id}\"]`);\n\t\t\tif (!trigger) return;\n\n\t\t\tif (trigger.getAttribute('data-prevent-default') === 'true') {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t_.show(trigger);\n\t\t});\n\n\t\t// Handle close buttons\n\t\t_.addEventListener('click', (e) => {\n\t\t\tif (!e.target.closest('[data-action-hide-cart]')) return;\n\t\t\t_.hide();\n\t\t});\n\n\t\t// Handle cart item remove events\n\t\t_.addEventListener('cart-item:remove', (e) => {\n\t\t\t_.#handleCartItemRemove(e);\n\t\t});\n\n\t\t// Handle cart item quantity change events\n\t\t_.addEventListener('cart-item:quantity-change', (e) => {\n\t\t\t_.#handleCartItemQuantityChange(e);\n\t\t});\n\n\t\t// Add transition end listener\n\t\t_.contentPanel.addEventListener('transitionend', _.#handleTransitionEnd);\n\t}\n\n\t/**\n\t * Detach event listeners\n\t * @private\n\t */\n\t#detachListeners() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\t}\n\n\t/**\n\t * Binds keyboard events for accessibility\n\t * @private\n\t */\n\t#bindKeyboard() {\n\t\tthis.addEventListener('keydown', (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Handle cart item removal\n\t * @private\n\t */\n\t#handleCartItemRemove(e) {\n\t\tconst { cartKey, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Remove item by setting quantity to 0\n\t\tthis.updateCartItem(cartKey, 0)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - let smart comparison handle the removal animation\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to remove cart item:', cartKey);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error removing cart item:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Handle cart item quantity change\n\t * @private\n\t */\n\t#handleCartItemQuantityChange(e) {\n\t\tconst { cartKey, quantity, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Update item quantity\n\t\tthis.updateCartItem(cartKey, quantity)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - update cart data and refresh items\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to update cart item quantity:', cartKey, quantity);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error updating cart item quantity:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart count elements across the site\n\t * @private\n\t */\n\t#renderCartCount(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate visible item count (excluding _hide_in_cart items)\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst visibleItemCount = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\n\t\t// Update all cart count elements across the site\n\t\tconst cartCountElements = document.querySelectorAll('[data-content-cart-count]');\n\t\tcartCountElements.forEach((element) => {\n\t\t\telement.textContent = visibleItemCount;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart subtotal elements across the site\n\t * @private\n\t */\n\t#renderCartSubtotal(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate subtotal from all items except those marked to ignore pricing\n\t\tconst pricedItems = cartData.items.filter((item) => {\n\t\t\tconst ignorePrice = item.properties?._ignore_price_in_subtotal;\n\t\t\treturn !ignorePrice;\n\t\t});\n\t\tconst subtotal = pricedItems.reduce((total, item) => total + (item.line_price || 0), 0);\n\n\t\t// Update all cart subtotal elements across the site\n\t\tconst cartSubtotalElements = document.querySelectorAll('[data-content-cart-subtotal]');\n\t\tcartSubtotalElements.forEach((element) => {\n\t\t\t// Format as currency (assuming cents, convert to dollars)\n\t\t\tconst formatted = (subtotal / 100).toFixed(2);\n\t\t\telement.textContent = `$${formatted}`;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart items display based on cart data\n\t * @private\n\t */\n\t#renderCartPanel(cart = null) {\n\t\tconst cartData = cart || this.#currentCart;\n\t\tif (!cartData) return;\n\n\t\t// Get cart sections\n\t\tconst hasItemsSection = this.querySelector('[data-cart-has-items]');\n\t\tconst emptySection = this.querySelector('[data-cart-is-empty]');\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!hasItemsSection || !emptySection || !itemsContainer) {\n\t\t\tconsole.warn(\n\t\t\t\t'Cart sections not found. Expected [data-cart-has-items], [data-cart-is-empty], and [data-content-cart-items]'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check visible item count for showing/hiding sections\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst hasVisibleItems = visibleItems.length > 0;\n\n\t\t// Show/hide sections based on visible item count\n\t\tif (hasVisibleItems) {\n\t\t\thasItemsSection.style.display = '';\n\t\t\temptySection.style.display = 'none';\n\t\t} else {\n\t\t\thasItemsSection.style.display = 'none';\n\t\t\temptySection.style.display = '';\n\t\t}\n\n\t\t// Update cart count and subtotal across the site\n\t\tthis.#renderCartCount(cartData);\n\t\tthis.#renderCartSubtotal(cartData);\n\t}\n\n\t/**\n\t * Fetch current cart data from server\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\tgetCart() {\n\t\treturn fetch('/cart.json', {\n\t\t\tcrossDomain: true,\n\t\t\tcredentials: 'same-origin',\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching cart:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart item quantity on server\n\t * @param {string|number} key - Cart item key/ID\n\t * @param {number} quantity - New quantity (0 to remove)\n\t * @returns {Promise<Object>} Updated cart data object\n\t */\n\tupdateCartItem(key, quantity) {\n\t\treturn fetch('/cart/change.json', {\n\t\t\tcrossDomain: true,\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'same-origin',\n\t\t\tbody: JSON.stringify({ id: key, quantity: quantity }),\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error updating cart item:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Refresh cart data from server and update components\n\t * @param {Object} [cartObj=null] - Optional cart object to use instead of fetching\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\trefreshCart(cartObj = null) {\n\t\t// If cart object is provided, use it directly\n\t\tif (cartObj && !cartObj.error) {\n\t\t\t// console.log('Using provided cart data:', cartObj);\n\t\t\tthis.#currentCart = cartObj;\n\t\t\tthis.#renderCartItems(cartObj);\n\t\t\tthis.#renderCartPanel(cartObj);\n\n\t\t\t// Emit cart refreshed and data changed events\n\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartObj);\n\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\n\t\t\treturn Promise.resolve(cartObj);\n\t\t}\n\n\t\t// Otherwise fetch from server\n\t\treturn this.getCart().then((cartData) => {\n\t\t\t// console.log('Cart data received:', cartData);\n\t\t\tif (cartData && !cartData.error) {\n\t\t\t\tthis.#currentCart = cartData;\n\t\t\t\tthis.#renderCartItems(cartData);\n\t\t\t\tthis.#renderCartPanel(cartData);\n\n\t\t\t\t// Emit cart refreshed and data changed events\n\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartData);\n\t\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t} else {\n\t\t\t\tconsole.warn('Cart data has error or is null:', cartData);\n\t\t\t}\n\t\t\treturn cartData;\n\t\t});\n\t}\n\n\t/**\n\t * Remove items from DOM that are no longer in cart data\n\t * @private\n\t */\n\t#removeItemsFromDOM(itemsContainer, newKeysSet) {\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\n\t\tconst itemsToRemove = currentItems.filter((item) => !newKeysSet.has(item.getAttribute('key')));\n\n\t\titemsToRemove.forEach((item) => {\n\t\t\tconsole.log('destroy yourself', item);\n\t\t\titem.destroyYourself();\n\t\t});\n\t}\n\n\t/**\n\t * Update existing cart-item elements with fresh cart data\n\t * @private\n\t */\n\t#updateItemsInDOM(itemsContainer, cartData) {\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst existingItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\n\t\texistingItems.forEach((cartItemEl) => {\n\t\t\tconst key = cartItemEl.getAttribute('key');\n\t\t\tconst updatedItemData = visibleItems.find((item) => (item.key || item.id) === key);\n\n\t\t\tif (updatedItemData) {\n\t\t\t\t// Update cart-item with fresh data and full cart context\n\t\t\t\t// The cart-item will handle HTML comparison and only re-render if needed\n\t\t\t\tcartItemEl.setData(updatedItemData, cartData);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Add new items to DOM with animation delay\n\t * @private\n\t */\n\t#addItemsToDOM(itemsContainer, itemsToAdd, newKeys) {\n\t\t// Delay adding new items by 300ms to let cart slide open first\n\t\tsetTimeout(() => {\n\t\t\titemsToAdd.forEach((itemData) => {\n\t\t\t\tconst cartItem = CartItem.createAnimated(itemData);\n\t\t\t\tconst targetIndex = newKeys.indexOf(itemData.key || itemData.id);\n\n\t\t\t\t// Find the correct position to insert the new item\n\t\t\t\tif (targetIndex === 0) {\n\t\t\t\t\t// Insert at the beginning\n\t\t\t\t\titemsContainer.insertBefore(cartItem, itemsContainer.firstChild);\n\t\t\t\t} else {\n\t\t\t\t\t// Find the item that should come before this one\n\t\t\t\t\tlet insertAfter = null;\n\t\t\t\t\tfor (let i = targetIndex - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst prevKey = newKeys[i];\n\t\t\t\t\t\tconst prevItem = itemsContainer.querySelector(`cart-item[key=\"${prevKey}\"]`);\n\t\t\t\t\t\tif (prevItem) {\n\t\t\t\t\t\t\tinsertAfter = prevItem;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (insertAfter) {\n\t\t\t\t\t\tinsertAfter.insertAdjacentElement('afterend', cartItem);\n\t\t\t\t\t} else {\n\t\t\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 100);\n\t}\n\n\t/**\n\t * Filter cart items to exclude those with _hide_in_cart property\n\t * @private\n\t */\n\t#getVisibleCartItems(cartData) {\n\t\tif (!cartData || !cartData.items) return [];\n\t\treturn cartData.items.filter((item) => {\n\t\t\t// Check for _hide_in_cart in various possible locations\n\t\t\tconst hidden = item.properties?._hide_in_cart;\n\n\t\t\treturn !hidden;\n\t\t});\n\t}\n\n\t/**\n\t * Add calculated fields to cart object for events\n\t * @private\n\t */\n\t#addCalculatedFields(cartData) {\n\t\tif (!cartData) return cartData;\n\n\t\t// For display counts: use visible items (excludes _hide_in_cart)\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst calculated_count = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\n\t\t// For pricing: use all items except those marked to ignore pricing\n\t\tconst pricedItems = cartData.items.filter((item) => {\n\t\t\tconst ignorePrice = item.properties?._ignore_price_in_subtotal;\n\t\t\treturn !ignorePrice;\n\t\t});\n\t\tconst calculated_subtotal = pricedItems.reduce(\n\t\t\t(total, item) => total + (item.line_price || 0),\n\t\t\t0\n\t\t);\n\n\t\treturn {\n\t\t\t...cartData,\n\t\t\tcalculated_count,\n\t\t\tcalculated_subtotal,\n\t\t};\n\t}\n\n\t/**\n\t * Render cart items from Shopify cart data with smart comparison\n\t * @private\n\t */\n\t#renderCartItems(cartData) {\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!itemsContainer || !cartData || !cartData.items) {\n\t\t\tconsole.warn('Cannot render cart items:', {\n\t\t\t\titemsContainer: !!itemsContainer,\n\t\t\t\tcartData: !!cartData,\n\t\t\t\titems: cartData?.items?.length,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Filter out items with _hide_in_cart property\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\n\t\t// Handle initial render - load all items without animation\n\t\tif (this.#isInitialRender) {\n\t\t\t// console.log('Initial cart render:', visibleItems.length, 'visible items');\n\n\t\t\t// Clear existing items\n\t\t\titemsContainer.innerHTML = '';\n\n\t\t\t// Create cart-item elements without animation\n\t\t\tvisibleItems.forEach((itemData) => {\n\t\t\t\tconst cartItem = new CartItem(itemData); // No animation\n\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t});\n\n\t\t\tthis.#isInitialRender = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current DOM items and their keys\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\t\tconst currentKeys = new Set(currentItems.map((item) => item.getAttribute('key')));\n\n\t\t// Get new cart data keys in order (only visible items)\n\t\tconst newKeys = visibleItems.map((item) => item.key || item.id);\n\t\tconst newKeysSet = new Set(newKeys);\n\n\t\t// Step 1: Remove items that are no longer in cart data\n\t\tthis.#removeItemsFromDOM(itemsContainer, newKeysSet);\n\n\t\t// Step 2: Update existing items with fresh data (handles templates, bundles, etc.)\n\t\tthis.#updateItemsInDOM(itemsContainer, cartData);\n\n\t\t// Step 3: Add new items that weren't in DOM (with animation delay)\n\t\tconst itemsToAdd = visibleItems.filter(\n\t\t\t(itemData) => !currentKeys.has(itemData.key || itemData.id)\n\t\t);\n\t\tthis.#addItemsToDOM(itemsContainer, itemsToAdd, newKeys);\n\t}\n\n\t/**\n\t * Set the template function for cart items\n\t * @param {Function} templateFn - Function that takes item data and returns HTML string\n\t */\n\tsetCartItemTemplate(templateName, templateFn) {\n\t\tCartItem.setTemplate(templateName, templateFn);\n\t}\n\n\t/**\n\t * Set the processing template function for cart items\n\t * @param {Function} templateFn - Function that returns HTML string for processing state\n\t */\n\tsetCartItemProcessingTemplate(templateFn) {\n\t\tCartItem.setProcessingTemplate(templateFn);\n\t}\n\n\t/**\n\t * Shows the cart dialog and traps focus within it\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the cart dialog\n\t * @fires CartDialog#show - Fired when the cart dialog has been shown\n\t */\n\tshow(triggerEl = null, cartObj) {\n\t\tconst _ = this;\n\t\t_.triggerEl = triggerEl || false;\n\n\t\t// Lock body scrolling\n\t\t_.#lockScroll();\n\n\t\t// Remove the hidden class first to ensure content is rendered\n\t\t_.contentPanel.classList.remove('hidden');\n\n\t\t// Give the browser a moment to process before starting animation\n\t\trequestAnimationFrame(() => {\n\t\t\t// Update ARIA states\n\t\t\t_.setAttribute('aria-hidden', 'false');\n\n\t\t\tif (_.triggerEl) {\n\t\t\t\t_.triggerEl.setAttribute('aria-expanded', 'true');\n\t\t\t}\n\n\t\t\t// Focus management\n\t\t\tconst firstFocusable = _.querySelector(\n\t\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\t\t\t);\n\n\t\t\tif (firstFocusable) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tfirstFocusable.focus();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Refresh cart data when showing\n\t\t\t_.refreshCart(cartObj);\n\n\t\t\t// Emit show event - cart dialog is now visible\n\t\t\t_.#emit('cart-dialog:show', { triggerElement: _.triggerEl });\n\t\t});\n\t}\n\n\t/**\n\t * Hides the cart dialog and restores focus\n\t * @fires CartDialog#hide - Fired when the cart dialog has started hiding (transition begins)\n\t * @fires CartDialog#afterHide - Fired when the cart dialog has completed its hide transition\n\t */\n\thide() {\n\t\tconst _ = this;\n\n\t\t// Update ARIA states\n\t\tif (_.triggerEl) {\n\t\t\t// remove focus from modal panel first\n\t\t\t_.triggerEl.focus();\n\t\t\t// mark trigger as no longer expanded\n\t\t\t_.triggerEl.setAttribute('aria-expanded', 'false');\n\t\t} else {\n\t\t\t// If no trigger element, blur any focused element inside the panel\n\t\t\tconst activeElement = document.activeElement;\n\t\t\tif (activeElement && _.contains(activeElement)) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\t// Set aria-hidden to start transition\n\t\t\t// The transitionend event handler will add display:none when complete\n\t\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t\t// Emit hide event - cart dialog is now starting to hide\n\t\t\t_.#emit('cart-dialog:hide', { triggerElement: _.triggerEl });\n\n\t\t\t// Restore body scroll\n\t\t\t_.#restoreScroll();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that creates a clickable overlay for the cart dialog\n * @extends HTMLElement\n */\nclass CartOverlay extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('tabindex', '-1');\n\t\tthis.setAttribute('aria-hidden', 'true');\n\t\tthis.cartDialog = this.closest('cart-dialog');\n\t\tthis.#attachListeners();\n\t}\n\n\t#attachListeners() {\n\t\tthis.addEventListener('click', () => {\n\t\t\tthis.cartDialog.hide();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that wraps the content of the cart dialog\n * @extends HTMLElement\n */\nclass CartPanel extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('role', 'document');\n\t}\n}\n\nif (!customElements.get('cart-dialog')) {\n\tcustomElements.define('cart-dialog', CartDialog);\n}\nif (!customElements.get('cart-overlay')) {\n\tcustomElements.define('cart-overlay', CartOverlay);\n}\nif (!customElements.get('cart-panel')) {\n\tcustomElements.define('cart-panel', CartPanel);\n}\n\nexport { CartDialog, CartOverlay, CartPanel, CartItem };\nexport default CartDialog;\n\n// Make CartItem available globally for Shopify themes\nif (typeof window !== 'undefined') {\n\twindow.CartItem = CartItem;\n}\n"],"names":["cartItem","CartItem"],"mappings":"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"}
|
package/dist/cart-panel.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { CartItem } from '@magic-spells/cart-item';
|
|
2
|
-
export { CartItem } from '@magic-spells/cart-item';
|
|
3
1
|
import '@magic-spells/focus-trap';
|
|
4
2
|
import EventEmitter from '@magic-spells/event-emitter';
|
|
3
|
+
import { CartItem } from '@magic-spells/cart-item';
|
|
4
|
+
export { CartItem } from '@magic-spells/cart-item';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Custom element that creates an accessible modal cart dialog with focus management
|
|
@@ -277,7 +277,6 @@ class CartDialog extends HTMLElement {
|
|
|
277
277
|
this.#currentCart = updatedCart;
|
|
278
278
|
this.#renderCartItems(updatedCart);
|
|
279
279
|
this.#renderCartPanel(updatedCart);
|
|
280
|
-
element.setState('ready');
|
|
281
280
|
|
|
282
281
|
// Emit cart updated and data changed events
|
|
283
282
|
const cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);
|
|
@@ -322,7 +321,7 @@ class CartDialog extends HTMLElement {
|
|
|
322
321
|
if (!cartData) return;
|
|
323
322
|
|
|
324
323
|
// Calculate subtotal from all items except those marked to ignore pricing
|
|
325
|
-
const pricedItems = cartData.items.filter(item => {
|
|
324
|
+
const pricedItems = cartData.items.filter((item) => {
|
|
326
325
|
const ignorePrice = item.properties?._ignore_price_in_subtotal;
|
|
327
326
|
return !ignorePrice;
|
|
328
327
|
});
|
|
@@ -477,6 +476,26 @@ class CartDialog extends HTMLElement {
|
|
|
477
476
|
});
|
|
478
477
|
}
|
|
479
478
|
|
|
479
|
+
/**
|
|
480
|
+
* Update existing cart-item elements with fresh cart data
|
|
481
|
+
* @private
|
|
482
|
+
*/
|
|
483
|
+
#updateItemsInDOM(itemsContainer, cartData) {
|
|
484
|
+
const visibleItems = this.#getVisibleCartItems(cartData);
|
|
485
|
+
const existingItems = Array.from(itemsContainer.querySelectorAll('cart-item'));
|
|
486
|
+
|
|
487
|
+
existingItems.forEach((cartItemEl) => {
|
|
488
|
+
const key = cartItemEl.getAttribute('key');
|
|
489
|
+
const updatedItemData = visibleItems.find((item) => (item.key || item.id) === key);
|
|
490
|
+
|
|
491
|
+
if (updatedItemData) {
|
|
492
|
+
// Update cart-item with fresh data and full cart context
|
|
493
|
+
// The cart-item will handle HTML comparison and only re-render if needed
|
|
494
|
+
cartItemEl.setData(updatedItemData, cartData);
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
|
|
480
499
|
/**
|
|
481
500
|
* Add new items to DOM with animation delay
|
|
482
501
|
* @private
|
|
@@ -535,9 +554,16 @@ class CartDialog extends HTMLElement {
|
|
|
535
554
|
#addCalculatedFields(cartData) {
|
|
536
555
|
if (!cartData) return cartData;
|
|
537
556
|
|
|
557
|
+
// For display counts: use visible items (excludes _hide_in_cart)
|
|
538
558
|
const visibleItems = this.#getVisibleCartItems(cartData);
|
|
539
559
|
const calculated_count = visibleItems.reduce((total, item) => total + item.quantity, 0);
|
|
540
|
-
|
|
560
|
+
|
|
561
|
+
// For pricing: use all items except those marked to ignore pricing
|
|
562
|
+
const pricedItems = cartData.items.filter((item) => {
|
|
563
|
+
const ignorePrice = item.properties?._ignore_price_in_subtotal;
|
|
564
|
+
return !ignorePrice;
|
|
565
|
+
});
|
|
566
|
+
const calculated_subtotal = pricedItems.reduce(
|
|
541
567
|
(total, item) => total + (item.line_price || 0),
|
|
542
568
|
0
|
|
543
569
|
);
|
|
@@ -578,8 +604,6 @@ class CartDialog extends HTMLElement {
|
|
|
578
604
|
// Create cart-item elements without animation
|
|
579
605
|
visibleItems.forEach((itemData) => {
|
|
580
606
|
const cartItem = new CartItem(itemData); // No animation
|
|
581
|
-
// const cartItem = document.createElement('cart-item');
|
|
582
|
-
// cartItem.setData(itemData);
|
|
583
607
|
itemsContainer.appendChild(cartItem);
|
|
584
608
|
});
|
|
585
609
|
|
|
@@ -599,7 +623,10 @@ class CartDialog extends HTMLElement {
|
|
|
599
623
|
// Step 1: Remove items that are no longer in cart data
|
|
600
624
|
this.#removeItemsFromDOM(itemsContainer, newKeysSet);
|
|
601
625
|
|
|
602
|
-
// Step 2:
|
|
626
|
+
// Step 2: Update existing items with fresh data (handles templates, bundles, etc.)
|
|
627
|
+
this.#updateItemsInDOM(itemsContainer, cartData);
|
|
628
|
+
|
|
629
|
+
// Step 3: Add new items that weren't in DOM (with animation delay)
|
|
603
630
|
const itemsToAdd = visibleItems.filter(
|
|
604
631
|
(itemData) => !currentKeys.has(itemData.key || itemData.id)
|
|
605
632
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart-panel.esm.js","sources":["../src/cart-panel.js"],"sourcesContent":["import './cart-panel.scss';\nimport { CartItem } from '@magic-spells/cart-item';\nimport '@magic-spells/focus-trap';\nimport EventEmitter from '@magic-spells/event-emitter';\n\n/**\n * Custom element that creates an accessible modal cart dialog with focus management\n * @extends HTMLElement\n */\nclass CartDialog extends HTMLElement {\n\t#handleTransitionEnd;\n\t#currentCart = null;\n\t#eventEmitter;\n\t#isInitialRender = true;\n\n\t/**\n\t * Clean up event listeners when component is removed from DOM\n\t */\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\n\t\t// Ensure body scroll is restored if component is removed while open\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t\tthis.#restoreScroll();\n\n\t\t// Detach event listeners\n\t\tthis.#detachListeners();\n\t}\n\n\t/**\n\t * Locks body scrolling\n\t * @private\n\t */\n\t#lockScroll() {\n\t\t// Apply overflow hidden to body\n\t\tdocument.body.classList.add('overflow-hidden');\n\t}\n\n\t/**\n\t * Restores body scrolling when cart dialog is closed\n\t * @private\n\t */\n\t#restoreScroll() {\n\t\t// Remove overflow hidden from body\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t}\n\n\t/**\n\t * Initializes the cart dialog, sets up focus trap and overlay\n\t */\n\tconstructor() {\n\t\tsuper();\n\t\tconst _ = this;\n\t\t_.id = _.getAttribute('id');\n\t\t_.setAttribute('role', 'dialog');\n\t\t_.setAttribute('aria-modal', 'true');\n\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t_.triggerEl = null;\n\n\t\t// Initialize event emitter\n\t\t_.#eventEmitter = new EventEmitter();\n\n\t\t// Create a handler for transition end events\n\t\t_.#handleTransitionEnd = (e) => {\n\t\t\tif (e.propertyName === 'opacity' && _.getAttribute('aria-hidden') === 'true') {\n\t\t\t\t_.contentPanel.classList.add('hidden');\n\n\t\t\t\t// Emit afterHide event - cart dialog has completed its transition\n\t\t\t\t_.#emit('cart-dialog:afterHide', { triggerElement: _.triggerEl });\n\t\t\t}\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Now that we're in the DOM, find the content panel and set up focus trap\n\t\t_.contentPanel = _.querySelector('cart-panel');\n\n\t\tif (!_.contentPanel) {\n\t\t\tconsole.error('cart-panel element not found inside cart-dialog');\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if focus-trap already exists, if not create one\n\t\t_.focusTrap = _.contentPanel.querySelector('focus-trap');\n\t\tif (!_.focusTrap) {\n\t\t\t_.focusTrap = document.createElement('focus-trap');\n\n\t\t\t// Move all existing cart-panel content into the focus trap\n\t\t\tconst existingContent = Array.from(_.contentPanel.childNodes);\n\t\t\texistingContent.forEach((child) => _.focusTrap.appendChild(child));\n\n\t\t\t// Insert focus trap inside the cart-panel\n\t\t\t_.contentPanel.appendChild(_.focusTrap);\n\t\t}\n\n\t\t// Ensure we have labelledby and describedby references\n\t\tif (!_.getAttribute('aria-labelledby')) {\n\t\t\tconst heading = _.querySelector('h1, h2, h3');\n\t\t\tif (heading && !heading.id) {\n\t\t\t\theading.id = `${_.id}-title`;\n\t\t\t}\n\t\t\tif (heading?.id) {\n\t\t\t\t_.setAttribute('aria-labelledby', heading.id);\n\t\t\t}\n\t\t}\n\n\t\t// Add modal overlay if it doesn't already exist\n\t\tif (!_.querySelector('cart-overlay')) {\n\t\t\t_.prepend(document.createElement('cart-overlay'));\n\t\t}\n\t\t_.#attachListeners();\n\t\t_.#bindKeyboard();\n\n\t\t// Load cart data immediately after component initialization\n\t\t_.refreshCart();\n\t}\n\n\t/**\n\t * Event emitter method - Add an event listener with a cleaner API\n\t * @param {string} eventName - Name of the event to listen for\n\t * @param {Function} callback - Callback function to execute when event is fired\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\ton(eventName, callback) {\n\t\tthis.#eventEmitter.on(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Event emitter method - Remove an event listener\n\t * @param {string} eventName - Name of the event to stop listening for\n\t * @param {Function} callback - Callback function to remove\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\toff(eventName, callback) {\n\t\tthis.#eventEmitter.off(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal method to emit events via the event emitter\n\t * @param {string} eventName - Name of the event to emit\n\t * @param {*} [data] - Optional data to include with the event\n\t * @private\n\t */\n\t#emit(eventName, data = null) {\n\t\tthis.#eventEmitter.emit(eventName, data);\n\n\t\t// Also emit as native DOM events for better compatibility\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent(eventName, {\n\t\t\t\tdetail: data,\n\t\t\t\tbubbles: true,\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Attach event listeners for cart dialog functionality\n\t * @private\n\t */\n\t#attachListeners() {\n\t\tconst _ = this;\n\n\t\t// Handle trigger buttons\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest(`[aria-controls=\"${_.id}\"]`);\n\t\t\tif (!trigger) return;\n\n\t\t\tif (trigger.getAttribute('data-prevent-default') === 'true') {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t_.show(trigger);\n\t\t});\n\n\t\t// Handle close buttons\n\t\t_.addEventListener('click', (e) => {\n\t\t\tif (!e.target.closest('[data-action-hide-cart]')) return;\n\t\t\t_.hide();\n\t\t});\n\n\t\t// Handle cart item remove events\n\t\t_.addEventListener('cart-item:remove', (e) => {\n\t\t\t_.#handleCartItemRemove(e);\n\t\t});\n\n\t\t// Handle cart item quantity change events\n\t\t_.addEventListener('cart-item:quantity-change', (e) => {\n\t\t\t_.#handleCartItemQuantityChange(e);\n\t\t});\n\n\t\t// Add transition end listener\n\t\t_.contentPanel.addEventListener('transitionend', _.#handleTransitionEnd);\n\t}\n\n\t/**\n\t * Detach event listeners\n\t * @private\n\t */\n\t#detachListeners() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\t}\n\n\t/**\n\t * Binds keyboard events for accessibility\n\t * @private\n\t */\n\t#bindKeyboard() {\n\t\tthis.addEventListener('keydown', (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Handle cart item removal\n\t * @private\n\t */\n\t#handleCartItemRemove(e) {\n\t\tconst { cartKey, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Remove item by setting quantity to 0\n\t\tthis.updateCartItem(cartKey, 0)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - let smart comparison handle the removal animation\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to remove cart item:', cartKey);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error removing cart item:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Handle cart item quantity change\n\t * @private\n\t */\n\t#handleCartItemQuantityChange(e) {\n\t\tconst { cartKey, quantity, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Update item quantity\n\t\tthis.updateCartItem(cartKey, quantity)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - update cart data and refresh items\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\t\t\t\t\telement.setState('ready');\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to update cart item quantity:', cartKey, quantity);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error updating cart item quantity:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart count elements across the site\n\t * @private\n\t */\n\t#renderCartCount(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate visible item count (excluding _hide_in_cart items)\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst visibleItemCount = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\n\t\t// Update all cart count elements across the site\n\t\tconst cartCountElements = document.querySelectorAll('[data-content-cart-count]');\n\t\tcartCountElements.forEach((element) => {\n\t\t\telement.textContent = visibleItemCount;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart subtotal elements across the site\n\t * @private\n\t */\n\t#renderCartSubtotal(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate subtotal from all items except those marked to ignore pricing\n\t\tconst pricedItems = cartData.items.filter(item => {\n\t\t\tconst ignorePrice = item.properties?._ignore_price_in_subtotal;\n\t\t\treturn !ignorePrice;\n\t\t});\n\t\tconst subtotal = pricedItems.reduce((total, item) => total + (item.line_price || 0), 0);\n\n\t\t// Update all cart subtotal elements across the site\n\t\tconst cartSubtotalElements = document.querySelectorAll('[data-content-cart-subtotal]');\n\t\tcartSubtotalElements.forEach((element) => {\n\t\t\t// Format as currency (assuming cents, convert to dollars)\n\t\t\tconst formatted = (subtotal / 100).toFixed(2);\n\t\t\telement.textContent = `$${formatted}`;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart items display based on cart data\n\t * @private\n\t */\n\t#renderCartPanel(cart = null) {\n\t\tconst cartData = cart || this.#currentCart;\n\t\tif (!cartData) return;\n\n\t\t// Get cart sections\n\t\tconst hasItemsSection = this.querySelector('[data-cart-has-items]');\n\t\tconst emptySection = this.querySelector('[data-cart-is-empty]');\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!hasItemsSection || !emptySection || !itemsContainer) {\n\t\t\tconsole.warn(\n\t\t\t\t'Cart sections not found. Expected [data-cart-has-items], [data-cart-is-empty], and [data-content-cart-items]'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check visible item count for showing/hiding sections\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst hasVisibleItems = visibleItems.length > 0;\n\n\t\t// Show/hide sections based on visible item count\n\t\tif (hasVisibleItems) {\n\t\t\thasItemsSection.style.display = '';\n\t\t\temptySection.style.display = 'none';\n\t\t} else {\n\t\t\thasItemsSection.style.display = 'none';\n\t\t\temptySection.style.display = '';\n\t\t}\n\n\t\t// Update cart count and subtotal across the site\n\t\tthis.#renderCartCount(cartData);\n\t\tthis.#renderCartSubtotal(cartData);\n\t}\n\n\t/**\n\t * Fetch current cart data from server\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\tgetCart() {\n\t\treturn fetch('/cart.json', {\n\t\t\tcrossDomain: true,\n\t\t\tcredentials: 'same-origin',\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching cart:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart item quantity on server\n\t * @param {string|number} key - Cart item key/ID\n\t * @param {number} quantity - New quantity (0 to remove)\n\t * @returns {Promise<Object>} Updated cart data object\n\t */\n\tupdateCartItem(key, quantity) {\n\t\treturn fetch('/cart/change.json', {\n\t\t\tcrossDomain: true,\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'same-origin',\n\t\t\tbody: JSON.stringify({ id: key, quantity: quantity }),\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error updating cart item:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Refresh cart data from server and update components\n\t * @param {Object} [cartObj=null] - Optional cart object to use instead of fetching\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\trefreshCart(cartObj = null) {\n\t\t// If cart object is provided, use it directly\n\t\tif (cartObj && !cartObj.error) {\n\t\t\t// console.log('Using provided cart data:', cartObj);\n\t\t\tthis.#currentCart = cartObj;\n\t\t\tthis.#renderCartItems(cartObj);\n\t\t\tthis.#renderCartPanel(cartObj);\n\n\t\t\t// Emit cart refreshed and data changed events\n\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartObj);\n\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\n\t\t\treturn Promise.resolve(cartObj);\n\t\t}\n\n\t\t// Otherwise fetch from server\n\t\treturn this.getCart().then((cartData) => {\n\t\t\t// console.log('Cart data received:', cartData);\n\t\t\tif (cartData && !cartData.error) {\n\t\t\t\tthis.#currentCart = cartData;\n\t\t\t\tthis.#renderCartItems(cartData);\n\t\t\t\tthis.#renderCartPanel(cartData);\n\n\t\t\t\t// Emit cart refreshed and data changed events\n\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartData);\n\t\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t} else {\n\t\t\t\tconsole.warn('Cart data has error or is null:', cartData);\n\t\t\t}\n\t\t\treturn cartData;\n\t\t});\n\t}\n\n\t/**\n\t * Remove items from DOM that are no longer in cart data\n\t * @private\n\t */\n\t#removeItemsFromDOM(itemsContainer, newKeysSet) {\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\n\t\tconst itemsToRemove = currentItems.filter((item) => !newKeysSet.has(item.getAttribute('key')));\n\n\t\titemsToRemove.forEach((item) => {\n\t\t\tconsole.log('destroy yourself', item);\n\t\t\titem.destroyYourself();\n\t\t});\n\t}\n\n\t/**\n\t * Add new items to DOM with animation delay\n\t * @private\n\t */\n\t#addItemsToDOM(itemsContainer, itemsToAdd, newKeys) {\n\t\t// Delay adding new items by 300ms to let cart slide open first\n\t\tsetTimeout(() => {\n\t\t\titemsToAdd.forEach((itemData) => {\n\t\t\t\tconst cartItem = CartItem.createAnimated(itemData);\n\t\t\t\tconst targetIndex = newKeys.indexOf(itemData.key || itemData.id);\n\n\t\t\t\t// Find the correct position to insert the new item\n\t\t\t\tif (targetIndex === 0) {\n\t\t\t\t\t// Insert at the beginning\n\t\t\t\t\titemsContainer.insertBefore(cartItem, itemsContainer.firstChild);\n\t\t\t\t} else {\n\t\t\t\t\t// Find the item that should come before this one\n\t\t\t\t\tlet insertAfter = null;\n\t\t\t\t\tfor (let i = targetIndex - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst prevKey = newKeys[i];\n\t\t\t\t\t\tconst prevItem = itemsContainer.querySelector(`cart-item[key=\"${prevKey}\"]`);\n\t\t\t\t\t\tif (prevItem) {\n\t\t\t\t\t\t\tinsertAfter = prevItem;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (insertAfter) {\n\t\t\t\t\t\tinsertAfter.insertAdjacentElement('afterend', cartItem);\n\t\t\t\t\t} else {\n\t\t\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 100);\n\t}\n\n\t/**\n\t * Filter cart items to exclude those with _hide_in_cart property\n\t * @private\n\t */\n\t#getVisibleCartItems(cartData) {\n\t\tif (!cartData || !cartData.items) return [];\n\t\treturn cartData.items.filter((item) => {\n\t\t\t// Check for _hide_in_cart in various possible locations\n\t\t\tconst hidden = item.properties?._hide_in_cart;\n\n\t\t\treturn !hidden;\n\t\t});\n\t}\n\n\t/**\n\t * Add calculated fields to cart object for events\n\t * @private\n\t */\n\t#addCalculatedFields(cartData) {\n\t\tif (!cartData) return cartData;\n\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst calculated_count = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\t\tconst calculated_subtotal = visibleItems.reduce(\n\t\t\t(total, item) => total + (item.line_price || 0),\n\t\t\t0\n\t\t);\n\n\t\treturn {\n\t\t\t...cartData,\n\t\t\tcalculated_count,\n\t\t\tcalculated_subtotal,\n\t\t};\n\t}\n\n\t/**\n\t * Render cart items from Shopify cart data with smart comparison\n\t * @private\n\t */\n\t#renderCartItems(cartData) {\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!itemsContainer || !cartData || !cartData.items) {\n\t\t\tconsole.warn('Cannot render cart items:', {\n\t\t\t\titemsContainer: !!itemsContainer,\n\t\t\t\tcartData: !!cartData,\n\t\t\t\titems: cartData?.items?.length,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Filter out items with _hide_in_cart property\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\n\t\t// Handle initial render - load all items without animation\n\t\tif (this.#isInitialRender) {\n\t\t\t// console.log('Initial cart render:', visibleItems.length, 'visible items');\n\n\t\t\t// Clear existing items\n\t\t\titemsContainer.innerHTML = '';\n\n\t\t\t// Create cart-item elements without animation\n\t\t\tvisibleItems.forEach((itemData) => {\n\t\t\t\tconst cartItem = new CartItem(itemData); // No animation\n\t\t\t\t// const cartItem = document.createElement('cart-item');\n\t\t\t\t// cartItem.setData(itemData);\n\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t});\n\n\t\t\tthis.#isInitialRender = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current DOM items and their keys\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\t\tconst currentKeys = new Set(currentItems.map((item) => item.getAttribute('key')));\n\n\t\t// Get new cart data keys in order (only visible items)\n\t\tconst newKeys = visibleItems.map((item) => item.key || item.id);\n\t\tconst newKeysSet = new Set(newKeys);\n\n\t\t// Step 1: Remove items that are no longer in cart data\n\t\tthis.#removeItemsFromDOM(itemsContainer, newKeysSet);\n\n\t\t// Step 2: Add new items that weren't in DOM (with animation delay)\n\t\tconst itemsToAdd = visibleItems.filter(\n\t\t\t(itemData) => !currentKeys.has(itemData.key || itemData.id)\n\t\t);\n\t\tthis.#addItemsToDOM(itemsContainer, itemsToAdd, newKeys);\n\t}\n\n\t/**\n\t * Set the template function for cart items\n\t * @param {Function} templateFn - Function that takes item data and returns HTML string\n\t */\n\tsetCartItemTemplate(templateName, templateFn) {\n\t\tCartItem.setTemplate(templateName, templateFn);\n\t}\n\n\t/**\n\t * Set the processing template function for cart items\n\t * @param {Function} templateFn - Function that returns HTML string for processing state\n\t */\n\tsetCartItemProcessingTemplate(templateFn) {\n\t\tCartItem.setProcessingTemplate(templateFn);\n\t}\n\n\t/**\n\t * Shows the cart dialog and traps focus within it\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the cart dialog\n\t * @fires CartDialog#show - Fired when the cart dialog has been shown\n\t */\n\tshow(triggerEl = null, cartObj) {\n\t\tconst _ = this;\n\t\t_.triggerEl = triggerEl || false;\n\n\t\t// Lock body scrolling\n\t\t_.#lockScroll();\n\n\t\t// Remove the hidden class first to ensure content is rendered\n\t\t_.contentPanel.classList.remove('hidden');\n\n\t\t// Give the browser a moment to process before starting animation\n\t\trequestAnimationFrame(() => {\n\t\t\t// Update ARIA states\n\t\t\t_.setAttribute('aria-hidden', 'false');\n\n\t\t\tif (_.triggerEl) {\n\t\t\t\t_.triggerEl.setAttribute('aria-expanded', 'true');\n\t\t\t}\n\n\t\t\t// Focus management\n\t\t\tconst firstFocusable = _.querySelector(\n\t\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\t\t\t);\n\n\t\t\tif (firstFocusable) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tfirstFocusable.focus();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Refresh cart data when showing\n\t\t\t_.refreshCart(cartObj);\n\n\t\t\t// Emit show event - cart dialog is now visible\n\t\t\t_.#emit('cart-dialog:show', { triggerElement: _.triggerEl });\n\t\t});\n\t}\n\n\t/**\n\t * Hides the cart dialog and restores focus\n\t * @fires CartDialog#hide - Fired when the cart dialog has started hiding (transition begins)\n\t * @fires CartDialog#afterHide - Fired when the cart dialog has completed its hide transition\n\t */\n\thide() {\n\t\tconst _ = this;\n\n\t\t// Update ARIA states\n\t\tif (_.triggerEl) {\n\t\t\t// remove focus from modal panel first\n\t\t\t_.triggerEl.focus();\n\t\t\t// mark trigger as no longer expanded\n\t\t\t_.triggerEl.setAttribute('aria-expanded', 'false');\n\t\t} else {\n\t\t\t// If no trigger element, blur any focused element inside the panel\n\t\t\tconst activeElement = document.activeElement;\n\t\t\tif (activeElement && _.contains(activeElement)) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\t// Set aria-hidden to start transition\n\t\t\t// The transitionend event handler will add display:none when complete\n\t\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t\t// Emit hide event - cart dialog is now starting to hide\n\t\t\t_.#emit('cart-dialog:hide', { triggerElement: _.triggerEl });\n\n\t\t\t// Restore body scroll\n\t\t\t_.#restoreScroll();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that creates a clickable overlay for the cart dialog\n * @extends HTMLElement\n */\nclass CartOverlay extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('tabindex', '-1');\n\t\tthis.setAttribute('aria-hidden', 'true');\n\t\tthis.cartDialog = this.closest('cart-dialog');\n\t\tthis.#attachListeners();\n\t}\n\n\t#attachListeners() {\n\t\tthis.addEventListener('click', () => {\n\t\t\tthis.cartDialog.hide();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that wraps the content of the cart dialog\n * @extends HTMLElement\n */\nclass CartPanel extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('role', 'document');\n\t}\n}\n\nif (!customElements.get('cart-dialog')) {\n\tcustomElements.define('cart-dialog', CartDialog);\n}\nif (!customElements.get('cart-overlay')) {\n\tcustomElements.define('cart-overlay', CartOverlay);\n}\nif (!customElements.get('cart-panel')) {\n\tcustomElements.define('cart-panel', CartPanel);\n}\n\nexport { CartDialog, CartOverlay, CartPanel, CartItem };\nexport default CartDialog;\n\n// Make CartItem available globally for Shopify themes\nif (typeof window !== 'undefined') {\n\twindow.CartItem = CartItem;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cart-panel.esm.js","sources":["../src/cart-panel.js"],"sourcesContent":["import './cart-panel.scss';\n\nimport '@magic-spells/focus-trap';\nimport EventEmitter from '@magic-spells/event-emitter';\nimport { CartItem } from '@magic-spells/cart-item';\n\n/**\n * Custom element that creates an accessible modal cart dialog with focus management\n * @extends HTMLElement\n */\nclass CartDialog extends HTMLElement {\n\t#handleTransitionEnd;\n\t#currentCart = null;\n\t#eventEmitter;\n\t#isInitialRender = true;\n\n\t/**\n\t * Clean up event listeners when component is removed from DOM\n\t */\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\n\t\t// Ensure body scroll is restored if component is removed while open\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t\tthis.#restoreScroll();\n\n\t\t// Detach event listeners\n\t\tthis.#detachListeners();\n\t}\n\n\t/**\n\t * Locks body scrolling\n\t * @private\n\t */\n\t#lockScroll() {\n\t\t// Apply overflow hidden to body\n\t\tdocument.body.classList.add('overflow-hidden');\n\t}\n\n\t/**\n\t * Restores body scrolling when cart dialog is closed\n\t * @private\n\t */\n\t#restoreScroll() {\n\t\t// Remove overflow hidden from body\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t}\n\n\t/**\n\t * Initializes the cart dialog, sets up focus trap and overlay\n\t */\n\tconstructor() {\n\t\tsuper();\n\t\tconst _ = this;\n\t\t_.id = _.getAttribute('id');\n\t\t_.setAttribute('role', 'dialog');\n\t\t_.setAttribute('aria-modal', 'true');\n\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t_.triggerEl = null;\n\n\t\t// Initialize event emitter\n\t\t_.#eventEmitter = new EventEmitter();\n\n\t\t// Create a handler for transition end events\n\t\t_.#handleTransitionEnd = (e) => {\n\t\t\tif (e.propertyName === 'opacity' && _.getAttribute('aria-hidden') === 'true') {\n\t\t\t\t_.contentPanel.classList.add('hidden');\n\n\t\t\t\t// Emit afterHide event - cart dialog has completed its transition\n\t\t\t\t_.#emit('cart-dialog:afterHide', { triggerElement: _.triggerEl });\n\t\t\t}\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Now that we're in the DOM, find the content panel and set up focus trap\n\t\t_.contentPanel = _.querySelector('cart-panel');\n\n\t\tif (!_.contentPanel) {\n\t\t\tconsole.error('cart-panel element not found inside cart-dialog');\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if focus-trap already exists, if not create one\n\t\t_.focusTrap = _.contentPanel.querySelector('focus-trap');\n\t\tif (!_.focusTrap) {\n\t\t\t_.focusTrap = document.createElement('focus-trap');\n\n\t\t\t// Move all existing cart-panel content into the focus trap\n\t\t\tconst existingContent = Array.from(_.contentPanel.childNodes);\n\t\t\texistingContent.forEach((child) => _.focusTrap.appendChild(child));\n\n\t\t\t// Insert focus trap inside the cart-panel\n\t\t\t_.contentPanel.appendChild(_.focusTrap);\n\t\t}\n\n\t\t// Ensure we have labelledby and describedby references\n\t\tif (!_.getAttribute('aria-labelledby')) {\n\t\t\tconst heading = _.querySelector('h1, h2, h3');\n\t\t\tif (heading && !heading.id) {\n\t\t\t\theading.id = `${_.id}-title`;\n\t\t\t}\n\t\t\tif (heading?.id) {\n\t\t\t\t_.setAttribute('aria-labelledby', heading.id);\n\t\t\t}\n\t\t}\n\n\t\t// Add modal overlay if it doesn't already exist\n\t\tif (!_.querySelector('cart-overlay')) {\n\t\t\t_.prepend(document.createElement('cart-overlay'));\n\t\t}\n\t\t_.#attachListeners();\n\t\t_.#bindKeyboard();\n\n\t\t// Load cart data immediately after component initialization\n\t\t_.refreshCart();\n\t}\n\n\t/**\n\t * Event emitter method - Add an event listener with a cleaner API\n\t * @param {string} eventName - Name of the event to listen for\n\t * @param {Function} callback - Callback function to execute when event is fired\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\ton(eventName, callback) {\n\t\tthis.#eventEmitter.on(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Event emitter method - Remove an event listener\n\t * @param {string} eventName - Name of the event to stop listening for\n\t * @param {Function} callback - Callback function to remove\n\t * @returns {CartDialog} Returns this for method chaining\n\t */\n\toff(eventName, callback) {\n\t\tthis.#eventEmitter.off(eventName, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal method to emit events via the event emitter\n\t * @param {string} eventName - Name of the event to emit\n\t * @param {*} [data] - Optional data to include with the event\n\t * @private\n\t */\n\t#emit(eventName, data = null) {\n\t\tthis.#eventEmitter.emit(eventName, data);\n\n\t\t// Also emit as native DOM events for better compatibility\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent(eventName, {\n\t\t\t\tdetail: data,\n\t\t\t\tbubbles: true,\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Attach event listeners for cart dialog functionality\n\t * @private\n\t */\n\t#attachListeners() {\n\t\tconst _ = this;\n\n\t\t// Handle trigger buttons\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest(`[aria-controls=\"${_.id}\"]`);\n\t\t\tif (!trigger) return;\n\n\t\t\tif (trigger.getAttribute('data-prevent-default') === 'true') {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t_.show(trigger);\n\t\t});\n\n\t\t// Handle close buttons\n\t\t_.addEventListener('click', (e) => {\n\t\t\tif (!e.target.closest('[data-action-hide-cart]')) return;\n\t\t\t_.hide();\n\t\t});\n\n\t\t// Handle cart item remove events\n\t\t_.addEventListener('cart-item:remove', (e) => {\n\t\t\t_.#handleCartItemRemove(e);\n\t\t});\n\n\t\t// Handle cart item quantity change events\n\t\t_.addEventListener('cart-item:quantity-change', (e) => {\n\t\t\t_.#handleCartItemQuantityChange(e);\n\t\t});\n\n\t\t// Add transition end listener\n\t\t_.contentPanel.addEventListener('transitionend', _.#handleTransitionEnd);\n\t}\n\n\t/**\n\t * Detach event listeners\n\t * @private\n\t */\n\t#detachListeners() {\n\t\tconst _ = this;\n\t\tif (_.contentPanel) {\n\t\t\t_.contentPanel.removeEventListener('transitionend', _.#handleTransitionEnd);\n\t\t}\n\t}\n\n\t/**\n\t * Binds keyboard events for accessibility\n\t * @private\n\t */\n\t#bindKeyboard() {\n\t\tthis.addEventListener('keydown', (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Handle cart item removal\n\t * @private\n\t */\n\t#handleCartItemRemove(e) {\n\t\tconst { cartKey, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Remove item by setting quantity to 0\n\t\tthis.updateCartItem(cartKey, 0)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - let smart comparison handle the removal animation\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to remove cart item:', cartKey);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error removing cart item:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Handle cart item quantity change\n\t * @private\n\t */\n\t#handleCartItemQuantityChange(e) {\n\t\tconst { cartKey, quantity, element } = e.detail;\n\n\t\t// Set item to processing state\n\t\telement.setState('processing');\n\n\t\t// Update item quantity\n\t\tthis.updateCartItem(cartKey, quantity)\n\t\t\t.then((updatedCart) => {\n\t\t\t\tif (updatedCart && !updatedCart.error) {\n\t\t\t\t\t// Success - update cart data and refresh items\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#renderCartItems(updatedCart);\n\t\t\t\t\tthis.#renderCartPanel(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(updatedCart);\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: cartWithCalculatedFields });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t\t} else {\n\t\t\t\t\t// Error - reset to ready state\n\t\t\t\t\telement.setState('ready');\n\t\t\t\t\tconsole.error('Failed to update cart item quantity:', cartKey, quantity);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// Error - reset to ready state\n\t\t\t\telement.setState('ready');\n\t\t\t\tconsole.error('Error updating cart item quantity:', error);\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart count elements across the site\n\t * @private\n\t */\n\t#renderCartCount(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate visible item count (excluding _hide_in_cart items)\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst visibleItemCount = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\n\t\t// Update all cart count elements across the site\n\t\tconst cartCountElements = document.querySelectorAll('[data-content-cart-count]');\n\t\tcartCountElements.forEach((element) => {\n\t\t\telement.textContent = visibleItemCount;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart subtotal elements across the site\n\t * @private\n\t */\n\t#renderCartSubtotal(cartData) {\n\t\tif (!cartData) return;\n\n\t\t// Calculate subtotal from all items except those marked to ignore pricing\n\t\tconst pricedItems = cartData.items.filter((item) => {\n\t\t\tconst ignorePrice = item.properties?._ignore_price_in_subtotal;\n\t\t\treturn !ignorePrice;\n\t\t});\n\t\tconst subtotal = pricedItems.reduce((total, item) => total + (item.line_price || 0), 0);\n\n\t\t// Update all cart subtotal elements across the site\n\t\tconst cartSubtotalElements = document.querySelectorAll('[data-content-cart-subtotal]');\n\t\tcartSubtotalElements.forEach((element) => {\n\t\t\t// Format as currency (assuming cents, convert to dollars)\n\t\t\tconst formatted = (subtotal / 100).toFixed(2);\n\t\t\telement.textContent = `$${formatted}`;\n\t\t});\n\t}\n\n\t/**\n\t * Update cart items display based on cart data\n\t * @private\n\t */\n\t#renderCartPanel(cart = null) {\n\t\tconst cartData = cart || this.#currentCart;\n\t\tif (!cartData) return;\n\n\t\t// Get cart sections\n\t\tconst hasItemsSection = this.querySelector('[data-cart-has-items]');\n\t\tconst emptySection = this.querySelector('[data-cart-is-empty]');\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!hasItemsSection || !emptySection || !itemsContainer) {\n\t\t\tconsole.warn(\n\t\t\t\t'Cart sections not found. Expected [data-cart-has-items], [data-cart-is-empty], and [data-content-cart-items]'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check visible item count for showing/hiding sections\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst hasVisibleItems = visibleItems.length > 0;\n\n\t\t// Show/hide sections based on visible item count\n\t\tif (hasVisibleItems) {\n\t\t\thasItemsSection.style.display = '';\n\t\t\temptySection.style.display = 'none';\n\t\t} else {\n\t\t\thasItemsSection.style.display = 'none';\n\t\t\temptySection.style.display = '';\n\t\t}\n\n\t\t// Update cart count and subtotal across the site\n\t\tthis.#renderCartCount(cartData);\n\t\tthis.#renderCartSubtotal(cartData);\n\t}\n\n\t/**\n\t * Fetch current cart data from server\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\tgetCart() {\n\t\treturn fetch('/cart.json', {\n\t\t\tcrossDomain: true,\n\t\t\tcredentials: 'same-origin',\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching cart:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Update cart item quantity on server\n\t * @param {string|number} key - Cart item key/ID\n\t * @param {number} quantity - New quantity (0 to remove)\n\t * @returns {Promise<Object>} Updated cart data object\n\t */\n\tupdateCartItem(key, quantity) {\n\t\treturn fetch('/cart/change.json', {\n\t\t\tcrossDomain: true,\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'same-origin',\n\t\t\tbody: JSON.stringify({ id: key, quantity: quantity }),\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow Error(response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error updating cart item:', error);\n\t\t\t\treturn { error: true, message: error.message };\n\t\t\t});\n\t}\n\n\t/**\n\t * Refresh cart data from server and update components\n\t * @param {Object} [cartObj=null] - Optional cart object to use instead of fetching\n\t * @returns {Promise<Object>} Cart data object\n\t */\n\trefreshCart(cartObj = null) {\n\t\t// If cart object is provided, use it directly\n\t\tif (cartObj && !cartObj.error) {\n\t\t\t// console.log('Using provided cart data:', cartObj);\n\t\t\tthis.#currentCart = cartObj;\n\t\t\tthis.#renderCartItems(cartObj);\n\t\t\tthis.#renderCartPanel(cartObj);\n\n\t\t\t// Emit cart refreshed and data changed events\n\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartObj);\n\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\n\t\t\treturn Promise.resolve(cartObj);\n\t\t}\n\n\t\t// Otherwise fetch from server\n\t\treturn this.getCart().then((cartData) => {\n\t\t\t// console.log('Cart data received:', cartData);\n\t\t\tif (cartData && !cartData.error) {\n\t\t\t\tthis.#currentCart = cartData;\n\t\t\t\tthis.#renderCartItems(cartData);\n\t\t\t\tthis.#renderCartPanel(cartData);\n\n\t\t\t\t// Emit cart refreshed and data changed events\n\t\t\t\tconst cartWithCalculatedFields = this.#addCalculatedFields(cartData);\n\t\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartWithCalculatedFields });\n\t\t\t\tthis.#emit('cart-dialog:data-changed', cartWithCalculatedFields);\n\t\t\t} else {\n\t\t\t\tconsole.warn('Cart data has error or is null:', cartData);\n\t\t\t}\n\t\t\treturn cartData;\n\t\t});\n\t}\n\n\t/**\n\t * Remove items from DOM that are no longer in cart data\n\t * @private\n\t */\n\t#removeItemsFromDOM(itemsContainer, newKeysSet) {\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\n\t\tconst itemsToRemove = currentItems.filter((item) => !newKeysSet.has(item.getAttribute('key')));\n\n\t\titemsToRemove.forEach((item) => {\n\t\t\tconsole.log('destroy yourself', item);\n\t\t\titem.destroyYourself();\n\t\t});\n\t}\n\n\t/**\n\t * Update existing cart-item elements with fresh cart data\n\t * @private\n\t */\n\t#updateItemsInDOM(itemsContainer, cartData) {\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst existingItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\n\t\texistingItems.forEach((cartItemEl) => {\n\t\t\tconst key = cartItemEl.getAttribute('key');\n\t\t\tconst updatedItemData = visibleItems.find((item) => (item.key || item.id) === key);\n\n\t\t\tif (updatedItemData) {\n\t\t\t\t// Update cart-item with fresh data and full cart context\n\t\t\t\t// The cart-item will handle HTML comparison and only re-render if needed\n\t\t\t\tcartItemEl.setData(updatedItemData, cartData);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Add new items to DOM with animation delay\n\t * @private\n\t */\n\t#addItemsToDOM(itemsContainer, itemsToAdd, newKeys) {\n\t\t// Delay adding new items by 300ms to let cart slide open first\n\t\tsetTimeout(() => {\n\t\t\titemsToAdd.forEach((itemData) => {\n\t\t\t\tconst cartItem = CartItem.createAnimated(itemData);\n\t\t\t\tconst targetIndex = newKeys.indexOf(itemData.key || itemData.id);\n\n\t\t\t\t// Find the correct position to insert the new item\n\t\t\t\tif (targetIndex === 0) {\n\t\t\t\t\t// Insert at the beginning\n\t\t\t\t\titemsContainer.insertBefore(cartItem, itemsContainer.firstChild);\n\t\t\t\t} else {\n\t\t\t\t\t// Find the item that should come before this one\n\t\t\t\t\tlet insertAfter = null;\n\t\t\t\t\tfor (let i = targetIndex - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst prevKey = newKeys[i];\n\t\t\t\t\t\tconst prevItem = itemsContainer.querySelector(`cart-item[key=\"${prevKey}\"]`);\n\t\t\t\t\t\tif (prevItem) {\n\t\t\t\t\t\t\tinsertAfter = prevItem;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (insertAfter) {\n\t\t\t\t\t\tinsertAfter.insertAdjacentElement('afterend', cartItem);\n\t\t\t\t\t} else {\n\t\t\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 100);\n\t}\n\n\t/**\n\t * Filter cart items to exclude those with _hide_in_cart property\n\t * @private\n\t */\n\t#getVisibleCartItems(cartData) {\n\t\tif (!cartData || !cartData.items) return [];\n\t\treturn cartData.items.filter((item) => {\n\t\t\t// Check for _hide_in_cart in various possible locations\n\t\t\tconst hidden = item.properties?._hide_in_cart;\n\n\t\t\treturn !hidden;\n\t\t});\n\t}\n\n\t/**\n\t * Add calculated fields to cart object for events\n\t * @private\n\t */\n\t#addCalculatedFields(cartData) {\n\t\tif (!cartData) return cartData;\n\n\t\t// For display counts: use visible items (excludes _hide_in_cart)\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\t\tconst calculated_count = visibleItems.reduce((total, item) => total + item.quantity, 0);\n\n\t\t// For pricing: use all items except those marked to ignore pricing\n\t\tconst pricedItems = cartData.items.filter((item) => {\n\t\t\tconst ignorePrice = item.properties?._ignore_price_in_subtotal;\n\t\t\treturn !ignorePrice;\n\t\t});\n\t\tconst calculated_subtotal = pricedItems.reduce(\n\t\t\t(total, item) => total + (item.line_price || 0),\n\t\t\t0\n\t\t);\n\n\t\treturn {\n\t\t\t...cartData,\n\t\t\tcalculated_count,\n\t\t\tcalculated_subtotal,\n\t\t};\n\t}\n\n\t/**\n\t * Render cart items from Shopify cart data with smart comparison\n\t * @private\n\t */\n\t#renderCartItems(cartData) {\n\t\tconst itemsContainer = this.querySelector('[data-content-cart-items]');\n\n\t\tif (!itemsContainer || !cartData || !cartData.items) {\n\t\t\tconsole.warn('Cannot render cart items:', {\n\t\t\t\titemsContainer: !!itemsContainer,\n\t\t\t\tcartData: !!cartData,\n\t\t\t\titems: cartData?.items?.length,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Filter out items with _hide_in_cart property\n\t\tconst visibleItems = this.#getVisibleCartItems(cartData);\n\n\t\t// Handle initial render - load all items without animation\n\t\tif (this.#isInitialRender) {\n\t\t\t// console.log('Initial cart render:', visibleItems.length, 'visible items');\n\n\t\t\t// Clear existing items\n\t\t\titemsContainer.innerHTML = '';\n\n\t\t\t// Create cart-item elements without animation\n\t\t\tvisibleItems.forEach((itemData) => {\n\t\t\t\tconst cartItem = new CartItem(itemData); // No animation\n\t\t\t\titemsContainer.appendChild(cartItem);\n\t\t\t});\n\n\t\t\tthis.#isInitialRender = false;\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current DOM items and their keys\n\t\tconst currentItems = Array.from(itemsContainer.querySelectorAll('cart-item'));\n\t\tconst currentKeys = new Set(currentItems.map((item) => item.getAttribute('key')));\n\n\t\t// Get new cart data keys in order (only visible items)\n\t\tconst newKeys = visibleItems.map((item) => item.key || item.id);\n\t\tconst newKeysSet = new Set(newKeys);\n\n\t\t// Step 1: Remove items that are no longer in cart data\n\t\tthis.#removeItemsFromDOM(itemsContainer, newKeysSet);\n\n\t\t// Step 2: Update existing items with fresh data (handles templates, bundles, etc.)\n\t\tthis.#updateItemsInDOM(itemsContainer, cartData);\n\n\t\t// Step 3: Add new items that weren't in DOM (with animation delay)\n\t\tconst itemsToAdd = visibleItems.filter(\n\t\t\t(itemData) => !currentKeys.has(itemData.key || itemData.id)\n\t\t);\n\t\tthis.#addItemsToDOM(itemsContainer, itemsToAdd, newKeys);\n\t}\n\n\t/**\n\t * Set the template function for cart items\n\t * @param {Function} templateFn - Function that takes item data and returns HTML string\n\t */\n\tsetCartItemTemplate(templateName, templateFn) {\n\t\tCartItem.setTemplate(templateName, templateFn);\n\t}\n\n\t/**\n\t * Set the processing template function for cart items\n\t * @param {Function} templateFn - Function that returns HTML string for processing state\n\t */\n\tsetCartItemProcessingTemplate(templateFn) {\n\t\tCartItem.setProcessingTemplate(templateFn);\n\t}\n\n\t/**\n\t * Shows the cart dialog and traps focus within it\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the cart dialog\n\t * @fires CartDialog#show - Fired when the cart dialog has been shown\n\t */\n\tshow(triggerEl = null, cartObj) {\n\t\tconst _ = this;\n\t\t_.triggerEl = triggerEl || false;\n\n\t\t// Lock body scrolling\n\t\t_.#lockScroll();\n\n\t\t// Remove the hidden class first to ensure content is rendered\n\t\t_.contentPanel.classList.remove('hidden');\n\n\t\t// Give the browser a moment to process before starting animation\n\t\trequestAnimationFrame(() => {\n\t\t\t// Update ARIA states\n\t\t\t_.setAttribute('aria-hidden', 'false');\n\n\t\t\tif (_.triggerEl) {\n\t\t\t\t_.triggerEl.setAttribute('aria-expanded', 'true');\n\t\t\t}\n\n\t\t\t// Focus management\n\t\t\tconst firstFocusable = _.querySelector(\n\t\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\t\t\t);\n\n\t\t\tif (firstFocusable) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tfirstFocusable.focus();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Refresh cart data when showing\n\t\t\t_.refreshCart(cartObj);\n\n\t\t\t// Emit show event - cart dialog is now visible\n\t\t\t_.#emit('cart-dialog:show', { triggerElement: _.triggerEl });\n\t\t});\n\t}\n\n\t/**\n\t * Hides the cart dialog and restores focus\n\t * @fires CartDialog#hide - Fired when the cart dialog has started hiding (transition begins)\n\t * @fires CartDialog#afterHide - Fired when the cart dialog has completed its hide transition\n\t */\n\thide() {\n\t\tconst _ = this;\n\n\t\t// Update ARIA states\n\t\tif (_.triggerEl) {\n\t\t\t// remove focus from modal panel first\n\t\t\t_.triggerEl.focus();\n\t\t\t// mark trigger as no longer expanded\n\t\t\t_.triggerEl.setAttribute('aria-expanded', 'false');\n\t\t} else {\n\t\t\t// If no trigger element, blur any focused element inside the panel\n\t\t\tconst activeElement = document.activeElement;\n\t\t\tif (activeElement && _.contains(activeElement)) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\t// Set aria-hidden to start transition\n\t\t\t// The transitionend event handler will add display:none when complete\n\t\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t\t// Emit hide event - cart dialog is now starting to hide\n\t\t\t_.#emit('cart-dialog:hide', { triggerElement: _.triggerEl });\n\n\t\t\t// Restore body scroll\n\t\t\t_.#restoreScroll();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that creates a clickable overlay for the cart dialog\n * @extends HTMLElement\n */\nclass CartOverlay extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('tabindex', '-1');\n\t\tthis.setAttribute('aria-hidden', 'true');\n\t\tthis.cartDialog = this.closest('cart-dialog');\n\t\tthis.#attachListeners();\n\t}\n\n\t#attachListeners() {\n\t\tthis.addEventListener('click', () => {\n\t\t\tthis.cartDialog.hide();\n\t\t});\n\t}\n}\n\n/**\n * Custom element that wraps the content of the cart dialog\n * @extends HTMLElement\n */\nclass CartPanel extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.setAttribute('role', 'document');\n\t}\n}\n\nif (!customElements.get('cart-dialog')) {\n\tcustomElements.define('cart-dialog', CartDialog);\n}\nif (!customElements.get('cart-overlay')) {\n\tcustomElements.define('cart-overlay', CartOverlay);\n}\nif (!customElements.get('cart-panel')) {\n\tcustomElements.define('cart-panel', CartPanel);\n}\n\nexport { CartDialog, CartOverlay, CartPanel, CartItem };\nexport default CartDialog;\n\n// Make CartItem available globally for Shopify themes\nif (typeof window !== 'undefined') {\n\twindow.CartItem = CartItem;\n}\n"],"names":[],"mappings":"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"}
|