@magic-spells/cart-panel 0.1.1 → 0.2.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"cart-panel.js","sources":["../node_modules/@magic-spells/cart-item/dist/cart-item.esm.js","../node_modules/@magic-spells/focus-trap/dist/focus-trap.esm.js","../node_modules/@magic-spells/event-emitter/dist/event-emitter.esm.js","../src/cart-panel.js"],"sourcesContent":["/**\n * CartItem class that handles the functionality of a cart item component\n */\nclass CartItem extends HTMLElement {\n\t// Static template functions shared across all instances\n\tstatic #template = null;\n\tstatic #processingTemplate = null;\n\n\t// Private fields\n\t#currentState = 'ready';\n\t#isDestroying = false;\n\t#handlers = {};\n\t#itemData = null;\n\n\t/**\n\t * Set the template function for rendering cart items\n\t * @param {Function} templateFn - Function that takes item data and returns HTML string\n\t */\n\tstatic setTemplate(templateFn) {\n\t\tif (typeof templateFn !== 'function') {\n\t\t\tthrow new Error('Template must be a function');\n\t\t}\n\t\tCartItem.#template = templateFn;\n\t}\n\n\t/**\n\t * Set the processing template function for rendering processing overlay\n\t * @param {Function} templateFn - Function that returns HTML string for processing state\n\t */\n\tstatic setProcessingTemplate(templateFn) {\n\t\tif (typeof templateFn !== 'function') {\n\t\t\tthrow new Error('Processing template must be a function');\n\t\t}\n\t\tCartItem.#processingTemplate = templateFn;\n\t}\n\n\t/**\n\t * Define which attributes should be observed for changes\n\t */\n\tstatic get observedAttributes() {\n\t\treturn ['state', 'key'];\n\t}\n\n\t/**\n\t * Called when observed attributes change\n\t */\n\tattributeChangedCallback(name, oldValue, newValue) {\n\t\tif (oldValue === newValue) return;\n\n\t\tif (name === 'state') {\n\t\t\tthis.#currentState = newValue || 'ready';\n\t\t}\n\t}\n\n\tconstructor(itemData = null) {\n\t\tsuper();\n\n\t\t// Store item data if provided\n\t\tthis.#itemData = itemData;\n\n\t\t// Set initial state - start with 'appearing' if we have item data to render\n\t\tthis.#currentState = itemData ? 'appearing' : this.getAttribute('state') || 'ready';\n\n\t\t// Bind event handlers\n\t\tthis.#handlers = {\n\t\t\tclick: this.#handleClick.bind(this),\n\t\t\tchange: this.#handleChange.bind(this),\n\t\t\ttransitionEnd: this.#handleTransitionEnd.bind(this),\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\t// If we have item data, render it first\n\t\tif (this.#itemData) {\n\t\t\tthis.#renderFromData();\n\t\t}\n\n\t\t// Find child elements\n\t\tthis.content = this.querySelector('cart-item-content');\n\t\tthis.processing = this.querySelector('cart-item-processing');\n\n\t\t// Attach event listeners\n\t\tthis.#attachListeners();\n\n\t\t// If we started with 'appearing' state, handle the entry animation\n\t\tif (this.#currentState === 'appearing') {\n\t\t\t// Set the state attribute\n\t\t\tthis.setAttribute('state', 'appearing');\n\n\t\t\t// Get the natural height after rendering\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst naturalHeight = this.scrollHeight;\n\n\t\t\t\t// Set explicit height for animation\n\t\t\t\tthis.style.height = `${naturalHeight}px`;\n\n\t\t\t\t// Transition to ready state after a brief delay\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.setState('ready');\n\t\t\t\t\t// Remove explicit height after animation completes\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.style.height = '';\n\t\t\t\t\t}, 400); // Match appearing duration\n\t\t\t\t}, 50);\n\t\t\t});\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\t// Cleanup event listeners\n\t\tthis.#detachListeners();\n\t}\n\n\t/**\n\t * Attach event listeners\n\t */\n\t#attachListeners() {\n\t\tthis.addEventListener('click', this.#handlers.click);\n\t\tthis.addEventListener('change', this.#handlers.change);\n\t\tthis.addEventListener('transitionend', this.#handlers.transitionEnd);\n\t}\n\n\t/**\n\t * Detach event listeners\n\t */\n\t#detachListeners() {\n\t\tthis.removeEventListener('click', this.#handlers.click);\n\t\tthis.removeEventListener('change', this.#handlers.change);\n\t\tthis.removeEventListener('transitionend', this.#handlers.transitionEnd);\n\t}\n\n\t/**\n\t * Get the current state\n\t */\n\tget state() {\n\t\treturn this.#currentState;\n\t}\n\n\t/**\n\t * Get the cart key for this item\n\t */\n\tget cartKey() {\n\t\treturn this.getAttribute('key');\n\t}\n\n\t/**\n\t * Handle click events (for Remove buttons, etc.)\n\t */\n\t#handleClick(e) {\n\t\t// Check if clicked element is a remove button\n\t\tconst removeButton = e.target.closest('[data-action-remove-item]');\n\t\tif (removeButton) {\n\t\t\te.preventDefault();\n\t\t\tthis.#emitRemoveEvent();\n\t\t}\n\t}\n\n\t/**\n\t * Handle change events (for quantity inputs)\n\t */\n\t#handleChange(e) {\n\t\t// Check if changed element is a quantity input\n\t\tconst quantityInput = e.target.closest('[data-cart-quantity]');\n\t\tif (quantityInput) {\n\t\t\tthis.#emitQuantityChangeEvent(quantityInput.value);\n\t\t}\n\t}\n\n\t/**\n\t * Handle transition end events for destroy animation\n\t */\n\t#handleTransitionEnd(e) {\n\t\tif (e.propertyName === 'height' && this.#isDestroying) {\n\t\t\t// Remove from DOM after height animation completes\n\t\t\tthis.remove();\n\t\t}\n\t}\n\n\t/**\n\t * Emit remove event\n\t */\n\t#emitRemoveEvent() {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('cart-item:remove', {\n\t\t\t\tbubbles: true,\n\t\t\t\tdetail: {\n\t\t\t\t\tcartKey: this.cartKey,\n\t\t\t\t\telement: this,\n\t\t\t\t},\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Emit quantity change event\n\t */\n\t#emitQuantityChangeEvent(quantity) {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('cart-item:quantity-change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tdetail: {\n\t\t\t\t\tcartKey: this.cartKey,\n\t\t\t\t\tquantity: parseInt(quantity),\n\t\t\t\t\telement: this,\n\t\t\t\t},\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Render cart item from data using the static template\n\t */\n\t#renderFromData() {\n\t\tif (!this.#itemData || !CartItem.#template) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the key attribute from item data\n\t\tconst key = this.#itemData.key || this.#itemData.id;\n\t\tif (key) {\n\t\t\tthis.setAttribute('key', key);\n\t\t}\n\n\t\t// Generate HTML from template\n\t\tconst templateHTML = CartItem.#template(this.#itemData);\n\n\t\t// Generate processing HTML from template or use default\n\t\tconst processingHTML = CartItem.#processingTemplate\n\t\t\t? CartItem.#processingTemplate()\n\t\t\t: '<div class=\"cart-item-loader\"></div>';\n\n\t\t// Create the cart-item structure with template content inside cart-item-content\n\t\tthis.innerHTML = `\n <cart-item-content>\n ${templateHTML}\n </cart-item-content>\n <cart-item-processing>\n ${processingHTML}\n </cart-item-processing>\n `;\n\t}\n\n\t/**\n\t * Update the cart item with new data\n\t * @param {Object} itemData - Shopify cart item data\n\t */\n\tsetData(itemData) {\n\t\tthis.#itemData = itemData;\n\t\tthis.#renderFromData();\n\n\t\t// Re-find child elements after re-rendering\n\t\tthis.content = this.querySelector('cart-item-content');\n\t\tthis.processing = this.querySelector('cart-item-processing');\n\t}\n\n\t/**\n\t * Get the current item data\n\t */\n\tget itemData() {\n\t\treturn this.#itemData;\n\t}\n\n\t/**\n\t * Set the state of the cart item\n\t * @param {string} state - 'ready', 'processing', 'destroying', or 'appearing'\n\t */\n\tsetState(state) {\n\t\tif (['ready', 'processing', 'destroying', 'appearing'].includes(state)) {\n\t\t\tthis.setAttribute('state', state);\n\t\t}\n\t}\n\n\t/**\n\t * gracefully animate this cart item closed, then let #handleTransitionEnd remove it\n\t *\n\t * @returns {void}\n\t */\n\tdestroyYourself() {\n\t\t// bail if already in the middle of a destroy cycle\n\t\tif (this.#isDestroying) return;\n\n\t\tthis.#isDestroying = true;\n\n\t\t// snapshot the current rendered height before applying any \"destroying\" styles\n\t\tconst initialHeight = this.offsetHeight;\n\n\t\t// switch to 'destroying' state so css can fade / slide visuals\n\t\tthis.setState('destroying');\n\n\t\t// lock the measured height on the next animation frame to ensure layout is fully flushed\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.style.height = `${initialHeight}px`;\n\t\t\tthis.offsetHeight; // force a reflow so the browser registers the fixed height\n\n\t\t\t// read the css custom property for timing, defaulting to 400ms\n\t\t\tconst elementStyle = getComputedStyle(this);\n\t\t\tconst destroyDuration =\n\t\t\t\telementStyle.getPropertyValue('--cart-item-destroying-duration')?.trim() || '400ms';\n\n\t\t\t// animate only the height to zero; other properties stay under stylesheet control\n\t\t\tthis.style.transition = `height ${destroyDuration} ease`;\n\t\t\tthis.style.height = '0px';\n\t\t});\n\t}\n}\n\n/**\n * Supporting component classes for cart item\n */\nclass CartItemContent extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t}\n}\n\nclass CartItemProcessing extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t}\n}\n\n// Define custom elements (check if not already defined)\nif (!customElements.get('cart-item')) {\n\tcustomElements.define('cart-item', CartItem);\n}\nif (!customElements.get('cart-item-content')) {\n\tcustomElements.define('cart-item-content', CartItemContent);\n}\nif (!customElements.get('cart-item-processing')) {\n\tcustomElements.define('cart-item-processing', CartItemProcessing);\n}\n\nexport { CartItem, CartItemContent, CartItemProcessing };\n//# sourceMappingURL=cart-item.esm.js.map\n","/**\n * Retrieves all focusable elements within a given container.\n *\n * @param {HTMLElement} container - The container element to search for focusable elements.\n * @returns {HTMLElement[]} An array of focusable elements found within the container.\n */\nconst getFocusableElements = (container) => {\n\tconst focusableSelectors =\n\t\t'summary, a[href], button:not(:disabled), [tabindex]:not([tabindex^=\"-\"]):not(focus-trap-start):not(focus-trap-end), [draggable], area, input:not([type=hidden]):not(:disabled), select:not(:disabled), textarea:not(:disabled), object, iframe';\n\treturn Array.from(container.querySelectorAll(focusableSelectors));\n};\n\nclass FocusTrap extends HTMLElement {\n\t/** @type {boolean} Indicates whether the styles have been injected into the DOM. */\n\tstatic styleInjected = false;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.trapStart = null;\n\t\tthis.trapEnd = null;\n\n\t\t// Inject styles only once, when the first FocusTrap instance is created.\n\t\tif (!FocusTrap.styleInjected) {\n\t\t\tthis.injectStyles();\n\t\t\tFocusTrap.styleInjected = true;\n\t\t}\n\t}\n\n\t/**\n\t * Injects necessary styles for the focus trap into the document's head.\n\t * This ensures that focus-trap-start and focus-trap-end elements are hidden.\n\t */\n\tinjectStyles() {\n\t\tconst style = document.createElement('style');\n\t\tstyle.textContent = `\n focus-trap-start,\n focus-trap-end {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n white-space: nowrap;\n }\n `;\n\t\tdocument.head.appendChild(style);\n\t}\n\n\t/**\n\t * Called when the element is connected to the DOM.\n\t * Sets up the focus trap and adds the keydown event listener.\n\t */\n\tconnectedCallback() {\n\t\tthis.setupTrap();\n\t\tthis.addEventListener('keydown', this.handleKeyDown);\n\t}\n\n\t/**\n\t * Called when the element is disconnected from the DOM.\n\t * Removes the keydown event listener.\n\t */\n\tdisconnectedCallback() {\n\t\tthis.removeEventListener('keydown', this.handleKeyDown);\n\t}\n\n\t/**\n\t * Sets up the focus trap by adding trap start and trap end elements.\n\t * Focuses the trap start element to initiate the focus trap.\n\t */\n\tsetupTrap() {\n\t\t// check to see it there are any focusable children\n\t\tconst focusableElements = getFocusableElements(this);\n\t\t// exit if there aren't any\n\t\tif (focusableElements.length === 0) return;\n\n\t\t// create trap start and end elements\n\t\tthis.trapStart = document.createElement('focus-trap-start');\n\t\tthis.trapEnd = document.createElement('focus-trap-end');\n\n\t\t// add to DOM\n\t\tthis.prepend(this.trapStart);\n\t\tthis.append(this.trapEnd);\n\t}\n\n\t/**\n\t * Handles the keydown event. If the Escape key is pressed, the focus trap is exited.\n\t *\n\t * @param {KeyboardEvent} e - The keyboard event object.\n\t */\n\thandleKeyDown = (e) => {\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tthis.exitTrap();\n\t\t}\n\t};\n\n\t/**\n\t * Exits the focus trap by hiding the current container and shifting focus\n\t * back to the trigger element that opened the trap.\n\t */\n\texitTrap() {\n\t\tconst container = this.closest('[aria-hidden=\"false\"]');\n\t\tif (!container) return;\n\n\t\tcontainer.setAttribute('aria-hidden', 'true');\n\n\t\tconst trigger = document.querySelector(\n\t\t\t`[aria-expanded=\"true\"][aria-controls=\"${container.id}\"]`\n\t\t);\n\t\tif (trigger) {\n\t\t\ttrigger.setAttribute('aria-expanded', 'false');\n\t\t\ttrigger.focus();\n\t\t}\n\t}\n}\n\nclass FocusTrapStart extends HTMLElement {\n\t/**\n\t * Called when the element is connected to the DOM.\n\t * Sets the tabindex and adds the focus event listener.\n\t */\n\tconnectedCallback() {\n\t\tthis.setAttribute('tabindex', '0');\n\t\tthis.addEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Called when the element is disconnected from the DOM.\n\t * Removes the focus event listener.\n\t */\n\tdisconnectedCallback() {\n\t\tthis.removeEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Handles the focus event. If focus moves backwards from the first focusable element,\n\t * it is cycled to the last focusable element, and vice versa.\n\t *\n\t * @param {FocusEvent} e - The focus event object.\n\t */\n\thandleFocus = (e) => {\n\t\tconst trap = this.closest('focus-trap');\n\t\tconst focusableElements = getFocusableElements(trap);\n\n\t\tif (focusableElements.length === 0) return;\n\n\t\tconst firstElement = focusableElements[0];\n\t\tconst lastElement =\n\t\t\tfocusableElements[focusableElements.length - 1];\n\n\t\tif (e.relatedTarget === firstElement) {\n\t\t\tlastElement.focus();\n\t\t} else {\n\t\t\tfirstElement.focus();\n\t\t}\n\t};\n}\n\nclass FocusTrapEnd extends HTMLElement {\n\t/**\n\t * Called when the element is connected to the DOM.\n\t * Sets the tabindex and adds the focus event listener.\n\t */\n\tconnectedCallback() {\n\t\tthis.setAttribute('tabindex', '0');\n\t\tthis.addEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Called when the element is disconnected from the DOM.\n\t * Removes the focus event listener.\n\t */\n\tdisconnectedCallback() {\n\t\tthis.removeEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Handles the focus event. When the trap end is focused, focus is shifted back to the trap start.\n\t */\n\thandleFocus = () => {\n\t\tconst trap = this.closest('focus-trap');\n\t\tconst trapStart = trap.querySelector('focus-trap-start');\n\t\ttrapStart.focus();\n\t};\n}\n\ncustomElements.define('focus-trap', FocusTrap);\ncustomElements.define('focus-trap-start', FocusTrapStart);\ncustomElements.define('focus-trap-end', FocusTrapEnd);\n//# sourceMappingURL=focus-trap.esm.js.map\n","class EventEmitter {\n #events;\n\n constructor() {\n this.#events = new Map();\n }\n\n /**\n * Binds a listener to an event.\n * @param {string} event - The event to bind the listener to.\n * @param {Function} listener - The listener function to bind.\n * @returns {EventEmitter} The current instance for chaining.\n * @throws {TypeError} If the listener is not a function.\n */\n on(event, listener) {\n if (typeof listener !== \"function\") {\n throw new TypeError(\"Listener must be a function\");\n }\n\n const listeners = this.#events.get(event) || [];\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n this.#events.set(event, listeners);\n\n return this;\n }\n\n /**\n * Unbinds a listener from an event.\n * @param {string} event - The event to unbind the listener from.\n * @param {Function} listener - The listener function to unbind.\n * @returns {EventEmitter} The current instance for chaining.\n */\n off(event, listener) {\n const listeners = this.#events.get(event);\n if (!listeners) return this;\n\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n if (listeners.length === 0) {\n this.#events.delete(event);\n } else {\n this.#events.set(event, listeners);\n }\n }\n\n return this;\n }\n\n /**\n * Triggers an event and calls all bound listeners.\n * @param {string} event - The event to trigger.\n * @param {...*} args - Arguments to pass to the listener functions.\n * @returns {boolean} True if the event had listeners, false otherwise.\n */\n emit(event, ...args) {\n const listeners = this.#events.get(event);\n if (!listeners || listeners.length === 0) return false;\n\n for (let i = 0, n = listeners.length; i < n; ++i) {\n try {\n listeners[i].apply(this, args);\n } catch (error) {\n console.error(`Error in listener for event '${event}':`, error);\n }\n }\n\n return true;\n }\n\n /**\n * Removes all listeners for a specific event or all events.\n * @param {string} [event] - The event to remove listeners from. If not provided, removes all listeners.\n * @returns {EventEmitter} The current instance for chaining.\n */\n removeAllListeners(event) {\n if (event) {\n this.#events.delete(event);\n } else {\n this.#events.clear();\n }\n return this;\n }\n}\n\nexport { EventEmitter as default };\n//# sourceMappingURL=event-emitter.esm.js.map\n","import './cart-panel.scss';\nimport '@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#scrollPosition = 0;\n\t#currentCart = null;\n\t#eventEmitter;\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 * Saves current scroll position and locks body scrolling\n\t * @private\n\t */\n\t#lockScroll() {\n\t\tconst _ = this;\n\t\t// Save current scroll position\n\t\t_.#scrollPosition = window.pageYOffset;\n\n\t\t// Apply fixed position to body\n\t\tdocument.body.classList.add('overflow-hidden');\n\t\tdocument.body.style.top = `-${_.#scrollPosition}px`;\n\t}\n\n\t/**\n\t * Restores scroll position when cart dialog is closed\n\t * @private\n\t */\n\t#restoreScroll() {\n\t\tconst _ = this;\n\t\t// Remove fixed positioning\n\t\tdocument.body.classList.remove('overflow-hidden');\n\t\tdocument.body.style.removeProperty('top');\n\n\t\t// Restore scroll position\n\t\twindow.scrollTo(0, _.#scrollPosition);\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_.focusTrap = document.createElement('focus-trap');\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_.contentPanel.parentNode.insertBefore(_.focusTrap, _.contentPanel);\n\t\t_.focusTrap.appendChild(_.contentPanel);\n\n\t\t_.focusTrap.setupTrap();\n\n\t\t// Add modal overlay\n\t\t_.prepend(document.createElement('cart-overlay'));\n\t\t_.#attachListeners();\n\t\t_.#bindKeyboard();\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\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 - remove with animation\n\t\t\t\t\telement.destroyYourself();\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#updateCartItems(updatedCart);\n\n\t\t\t\t\t// Emit cart updated and data changed events\n\t\t\t\t\tthis.#emit('cart-dialog:updated', { cart: updatedCart });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', updatedCart);\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\n\t\t\t\t\tthis.#currentCart = updatedCart;\n\t\t\t\t\tthis.#updateCartItems(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\tthis.#emit('cart-dialog:updated', { cart: updatedCart });\n\t\t\t\t\tthis.#emit('cart-dialog:data-changed', updatedCart);\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 items\n\t * @private\n\t */\n\t#updateCartItems(cart = null) {\n\t\t// Placeholder for cart item updates\n\t\t// Could be used to sync cart items with server data\n\t\tconst cartData = cart || this.#currentCart;\n\t\tif (cartData) {\n\t\t\t// Future implementation: update cart item components\n\t\t}\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 * @returns {Promise<Object>} Cart data object\n\t */\n\trefreshCart() {\n\t\treturn this.getCart().then((cartData) => {\n\t\t\tif (cartData && !cartData.error) {\n\t\t\t\tthis.#currentCart = cartData;\n\t\t\t\tthis.#updateCartItems(cartData);\n\n\t\t\t\t// Emit cart refreshed and data changed events\n\t\t\t\tthis.#emit('cart-dialog:refreshed', { cart: cartData });\n\t\t\t\tthis.#emit('cart-dialog:data-changed', cartData);\n\t\t\t}\n\t\t\treturn cartData;\n\t\t});\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) {\n\t\tconst _ = this;\n\t\t_.triggerEl = triggerEl || false;\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\t\t\tif (_.triggerEl) {\n\t\t\t\t_.triggerEl.setAttribute('aria-expanded', 'true');\n\t\t\t}\n\n\t\t\t// Lock body scrolling and save scroll position\n\t\t\t_.#lockScroll();\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\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();\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// Restore body scroll and scroll position\n\t\t_.#restoreScroll();\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}\n\n\t\t// Set aria-hidden to start transition\n\t\t// The transitionend event handler will add display:none when complete\n\t\t_.setAttribute('aria-hidden', 'true');\n\n\t\t// Emit hide event - cart dialog is now starting to hide\n\t\t_.#emit('cart-dialog:hide', { triggerElement: _.triggerEl });\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 };\nexport default CartDialog;\n"],"names":[],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"cart-panel.js","sources":["../node_modules/@magic-spells/quantity-modifier/dist/quantity-modifier.esm.js","../node_modules/@magic-spells/cart-item/dist/cart-item.esm.js","../node_modules/@magic-spells/focus-trap/dist/focus-trap.esm.js","../node_modules/@magic-spells/event-emitter/dist/event-emitter.esm.js","../src/cart-panel.js"],"sourcesContent":["class QuantityModifier extends HTMLElement {\n // Static flag to track if styles have been injected\n static #stylesInjected = false;\n\n constructor() {\n super();\n this.handleDecrement = this.handleDecrement.bind(this);\n this.handleIncrement = this.handleIncrement.bind(this);\n this.handleInputChange = this.handleInputChange.bind(this);\n\n // Inject styles once when first component is created\n QuantityModifier.#injectStyles();\n }\n\n /**\n * Inject global styles for hiding number input spin buttons\n * Only runs once regardless of how many components exist\n */\n static #injectStyles() {\n if (QuantityModifier.#stylesInjected) return;\n\n // this will hide the arrow buttons in the number input field\n const style = document.createElement('style');\n style.textContent = `\n /* Hide number input spin buttons for quantity-modifier */\n quantity-modifier input::-webkit-outer-spin-button,\n quantity-modifier input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n \n quantity-modifier input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n document.head.appendChild(style);\n QuantityModifier.#stylesInjected = true;\n }\n\n // Define which attributes trigger attributeChangedCallback when modified\n static get observedAttributes() {\n return ['min', 'max', 'value'];\n }\n\n // Called when element is added to the DOM\n connectedCallback() {\n this.render();\n this.attachEventListeners();\n }\n\n // Called when element is removed from the DOM\n disconnectedCallback() {\n this.removeEventListeners();\n }\n\n // Called when observed attributes change\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue !== newValue) {\n this.updateInput();\n }\n }\n\n // Get minimum value allowed, defaults to 1\n get min() {\n return parseInt(this.getAttribute('min')) || 1;\n }\n\n // Get maximum value allowed, defaults to 99\n get max() {\n return parseInt(this.getAttribute('max')) || 99;\n }\n\n // Get current value, defaults to 1\n get value() {\n return parseInt(this.getAttribute('value')) || 1;\n }\n\n // Set current value by updating the attribute\n set value(val) {\n this.setAttribute('value', val);\n }\n\n // Render the quantity modifier HTML structure\n render() {\n const min = this.min;\n const max = this.max;\n const value = this.value;\n\n // check to see if these fields already exist\n const existingDecrement = this.querySelector('[data-action-decrement]');\n const existingIncrement = this.querySelector('[data-action-increment]');\n const existingInput = this.querySelector('[data-quantity-modifier-field]');\n\n // if they already exist, just set the values\n if (existingDecrement && existingIncrement && existingInput) {\n existingInput.value = value;\n existingInput.min = min;\n existingInput.max = max;\n existingInput.type = 'number';\n } else {\n // if they don't exist, inject the template\n this.innerHTML = `\n <button data-action-decrement type=\"button\">\n <svg class=\"svg-decrement\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <title>decrement</title>\n <path fill=\"currentColor\" d=\"M368 224H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h352c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"></path>\n </svg>\n </button>\n <input \n type=\"number\" \n inputmode=\"numeric\" \n pattern=\"[0-9]*\" \n data-quantity-modifier-field \n value=\"${value}\" min=\"${min}\" max=\"${max}\">\n <button data-action-increment type=\"button\">\n <svg class=\"svg-increment\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <title>increment</title>\n <path fill=\"currentColor\" d=\"M368 224H224V80c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v144H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h144v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V288h144c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"></path>\n </svg>\n </button>\n `;\n }\n }\n\n // Attach click and input event listeners to buttons and input field\n attachEventListeners() {\n const decrementBtn = this.querySelector('[data-action-decrement]');\n const incrementBtn = this.querySelector('[data-action-increment]');\n const input = this.querySelector('[data-quantity-modifier-field]');\n\n if (decrementBtn) decrementBtn.addEventListener('click', this.handleDecrement);\n if (incrementBtn) incrementBtn.addEventListener('click', this.handleIncrement);\n if (input) input.addEventListener('input', this.handleInputChange);\n }\n\n // Remove event listeners to prevent memory leaks\n removeEventListeners() {\n const decrementBtn = this.querySelector('[data-action-decrement]');\n const incrementBtn = this.querySelector('[data-action-increment]');\n const input = this.querySelector('[data-quantity-modifier-field]');\n\n if (decrementBtn) decrementBtn.removeEventListener('click', this.handleDecrement);\n if (incrementBtn) incrementBtn.removeEventListener('click', this.handleIncrement);\n if (input) input.removeEventListener('input', this.handleInputChange);\n }\n\n // Handle decrement button click, respects minimum value\n handleDecrement() {\n const currentValue = this.value;\n const newValue = Math.max(currentValue - 1, this.min);\n this.updateValue(newValue);\n }\n\n // Handle increment button click, respects maximum value\n handleIncrement() {\n const currentValue = this.value;\n const newValue = Math.min(currentValue + 1, this.max);\n this.updateValue(newValue);\n }\n\n // Handle direct input changes, clamps value between min and max\n handleInputChange(event) {\n const inputValue = parseInt(event.target.value);\n if (!isNaN(inputValue)) {\n const clampedValue = Math.max(this.min, Math.min(inputValue, this.max));\n this.updateValue(clampedValue);\n }\n }\n\n // Update the component value and dispatch change event if value changed\n updateValue(newValue) {\n if (newValue !== this.value) {\n this.value = newValue;\n this.updateInput();\n this.dispatchChangeEvent(newValue);\n }\n }\n\n // Sync the input field with current component state\n updateInput() {\n const input = this.querySelector('[data-quantity-modifier-field]');\n if (input) {\n input.value = this.value;\n input.min = this.min;\n input.max = this.max;\n }\n }\n\n // Dispatch custom event when value changes for external listeners\n dispatchChangeEvent(value) {\n this.dispatchEvent(\n new CustomEvent('quantity-modifier:change', {\n detail: { value },\n bubbles: true,\n })\n );\n }\n}\n\ncustomElements.define('quantity-modifier', QuantityModifier);\n\nexport { QuantityModifier, QuantityModifier as default };\n//# sourceMappingURL=quantity-modifier.esm.js.map\n","export { default as QuantityModifier } from '@magic-spells/quantity-modifier';\n\n/**\n * CartItem class that handles the functionality of a cart item component\n */\nclass CartItem extends HTMLElement {\n\t// Static template functions shared across all instances\n\tstatic #templates = new Map();\n\tstatic #processingTemplate = null;\n\n\t// Private fields\n\t#currentState = 'ready';\n\t#isDestroying = false;\n\t#isAppearing = false;\n\t#handlers = {};\n\t#itemData = null;\n\t#cartData = null;\n\n\t/**\n\t * Set the template function for rendering cart items\n\t * @param {string} name - Template name ('default' for default template)\n\t * @param {Function} templateFn - Function that takes (itemData, cartData) and returns HTML string\n\t */\n\tstatic setTemplate(name, templateFn) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new Error('Template name must be a string');\n\t\t}\n\t\tif (typeof templateFn !== 'function') {\n\t\t\tthrow new Error('Template must be a function');\n\t\t}\n\t\tCartItem.#templates.set(name, templateFn);\n\t}\n\n\t/**\n\t * Set the processing template function for rendering processing overlay\n\t * @param {Function} templateFn - Function that returns HTML string for processing state\n\t */\n\tstatic setProcessingTemplate(templateFn) {\n\t\tif (typeof templateFn !== 'function') {\n\t\t\tthrow new Error('Processing template must be a function');\n\t\t}\n\t\tCartItem.#processingTemplate = templateFn;\n\t}\n\n\t/**\n\t * Create a cart item with appearing animation\n\t * @param {Object} itemData - Shopify cart item data\n\t * @param {Object} cartData - Full Shopify cart object\n\t * @returns {CartItem} Cart item instance that will animate in\n\t */\n\tstatic createAnimated(itemData, cartData) {\n\t\treturn new CartItem(itemData, cartData, { animate: true });\n\t}\n\n\t/**\n\t * Define which attributes should be observed for changes\n\t */\n\tstatic get observedAttributes() {\n\t\treturn ['state', 'key'];\n\t}\n\n\t/**\n\t * Called when observed attributes change\n\t */\n\tattributeChangedCallback(name, oldValue, newValue) {\n\t\tif (oldValue === newValue) return;\n\n\t\tif (name === 'state') {\n\t\t\tthis.#currentState = newValue || 'ready';\n\t\t}\n\t}\n\n\tconstructor(itemData = null, cartData = null, options = {}) {\n\t\tsuper();\n\n\t\t// Store item and cart data if provided\n\t\tthis.#itemData = itemData;\n\t\tthis.#cartData = cartData;\n\n\t\t// Set initial state - start with 'appearing' only if explicitly requested\n\t\tconst shouldAnimate = options.animate || this.hasAttribute('animate-in');\n\t\tthis.#currentState =\n\t\t\titemData && shouldAnimate ? 'appearing' : this.getAttribute('state') || 'ready';\n\n\t\t// Bind event handlers\n\t\tthis.#handlers = {\n\t\t\tclick: this.#handleClick.bind(this),\n\t\t\tchange: this.#handleChange.bind(this),\n\t\t\ttransitionEnd: this.#handleTransitionEnd.bind(this),\n\t\t};\n\t}\n\n\tconnectedCallback() {\n\t\t// If we have item data, render it first\n\t\tif (this.#itemData) {\n\t\t\tthis.#render();\n\t\t}\n\n\t\t// Find child elements\n\t\tthis.content = this.querySelector('cart-item-content');\n\t\tthis.processing = this.querySelector('cart-item-processing');\n\n\t\t// Update line price elements in case of pre-rendered content\n\t\tthis.#updateLinePriceElements();\n\n\t\t// Attach event listeners\n\t\tthis.#attachListeners();\n\n\t\t// If we started with 'appearing' state, handle the entry animation\n\t\tif (this.#currentState === 'appearing') {\n\t\t\t// Set the state attribute\n\t\t\tthis.setAttribute('state', 'appearing');\n\t\t\tthis.#isAppearing = true;\n\n\t\t\t// Get the natural height after rendering\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst naturalHeight = this.scrollHeight;\n\n\t\t\t\t// Set explicit height for animation\n\t\t\t\tthis.style.height = `${naturalHeight}px`;\n\n\t\t\t\t// Transition to ready state after a brief delay\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.setState('ready');\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\t// Cleanup event listeners\n\t\tthis.#detachListeners();\n\t}\n\n\t/**\n\t * Attach event listeners\n\t */\n\t#attachListeners() {\n\t\tthis.addEventListener('click', this.#handlers.click);\n\t\tthis.addEventListener('change', this.#handlers.change);\n\t\tthis.addEventListener('quantity-modifier:change', this.#handlers.change);\n\t\tthis.addEventListener('transitionend', this.#handlers.transitionEnd);\n\t}\n\n\t/**\n\t * Detach event listeners\n\t */\n\t#detachListeners() {\n\t\tthis.removeEventListener('click', this.#handlers.click);\n\t\tthis.removeEventListener('change', this.#handlers.change);\n\t\tthis.removeEventListener('quantity-modifier:change', this.#handlers.change);\n\t\tthis.removeEventListener('transitionend', this.#handlers.transitionEnd);\n\t}\n\n\t/**\n\t * Get the current state\n\t */\n\tget state() {\n\t\treturn this.#currentState;\n\t}\n\n\t/**\n\t * Get the cart key for this item\n\t */\n\tget cartKey() {\n\t\treturn this.getAttribute('key');\n\t}\n\n\t/**\n\t * Handle click events (for Remove buttons, etc.)\n\t */\n\t#handleClick(e) {\n\t\t// Check if clicked element is a remove button\n\t\tconst removeButton = e.target.closest('[data-action-remove-item]');\n\t\tif (removeButton) {\n\t\t\te.preventDefault();\n\t\t\tthis.#emitRemoveEvent();\n\t\t}\n\t}\n\n\t/**\n\t * Handle change events (for quantity inputs and quantity-modifier)\n\t */\n\t#handleChange(e) {\n\t\t// Check if event is from quantity-modifier component\n\t\tif (e.type === 'quantity-modifier:change') {\n\t\t\tthis.#emitQuantityChangeEvent(e.detail.value);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if changed element is a quantity input\n\t\tconst quantityInput = e.target.closest('[data-cart-quantity]');\n\t\tif (quantityInput) {\n\t\t\tthis.#emitQuantityChangeEvent(quantityInput.value);\n\t\t}\n\t}\n\n\t/**\n\t * Handle transition end events for destroy animation and appearing animation\n\t */\n\t#handleTransitionEnd(e) {\n\t\tif (e.propertyName === 'height' && this.#isDestroying) {\n\t\t\t// Remove from DOM after height animation completes\n\t\t\tthis.remove();\n\t\t} else if (e.propertyName === 'height' && this.#isAppearing) {\n\t\t\t// Remove explicit height after appearing animation completes\n\t\t\tthis.style.height = '';\n\t\t\tthis.#isAppearing = false;\n\t\t}\n\t}\n\n\t/**\n\t * Emit remove event\n\t */\n\t#emitRemoveEvent() {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('cart-item:remove', {\n\t\t\t\tbubbles: true,\n\t\t\t\tdetail: {\n\t\t\t\t\tcartKey: this.cartKey,\n\t\t\t\t\telement: this,\n\t\t\t\t},\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Emit quantity change event\n\t */\n\t#emitQuantityChangeEvent(quantity) {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('cart-item:quantity-change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tdetail: {\n\t\t\t\t\tcartKey: this.cartKey,\n\t\t\t\t\tquantity: parseInt(quantity),\n\t\t\t\t\telement: this,\n\t\t\t\t},\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Render cart item from data using the appropriate template\n\t */\n\t#render() {\n\t\tif (!this.#itemData || CartItem.#templates.size === 0) {\n\t\t\tconsole.log('no item data or no template', this.#itemData, CartItem.#templates);\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the key attribute from item data\n\t\tconst key = this.#itemData.key || this.#itemData.id;\n\t\tif (key) {\n\t\t\tthis.setAttribute('key', key);\n\t\t}\n\n\t\t// Determine which template to use\n\t\tconst templateName = this.#itemData.properties?._cart_template || 'default';\n\t\tconst templateFn = CartItem.#templates.get(templateName) || CartItem.#templates.get('default');\n\n\t\tif (!templateFn) {\n\t\t\tconsole.warn(`Cart item template '${templateName}' not found and no default template set`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Generate HTML from template with both item and cart data\n\t\tconst templateHTML = templateFn(this.#itemData, this.#cartData);\n\n\t\t// Generate processing HTML from template or use default\n\t\tconst processingHTML = CartItem.#processingTemplate\n\t\t\t? CartItem.#processingTemplate()\n\t\t\t: '<div class=\"cart-item-loader\"></div>';\n\n\t\t// Create the cart-item structure with template content inside cart-item-content\n\t\tthis.innerHTML = `\n <cart-item-content>\n ${templateHTML}\n </cart-item-content>\n <cart-item-processing>\n ${processingHTML}\n </cart-item-processing>\n `;\n\t}\n\n\t/**\n\t * Update the cart item with new data\n\t * @param {Object} itemData - Shopify cart item data\n\t * @param {Object} cartData - Full Shopify cart object\n\t */\n\tsetData(itemData, cartData = null) {\n\t\tthis.#itemData = itemData;\n\t\tif (cartData) {\n\t\t\tthis.#cartData = cartData;\n\t\t}\n\t\tthis.#render();\n\n\t\t// Re-find child elements after re-rendering\n\t\tthis.content = this.querySelector('cart-item-content');\n\t\tthis.processing = this.querySelector('cart-item-processing');\n\n\t\t// Update line price elements\n\t\tthis.#updateLinePriceElements();\n\t}\n\n\t/**\n\t * Update elements with data-content-line-price attribute\n\t * @private\n\t */\n\t#updateLinePriceElements() {\n\t\tif (!this.#itemData) return;\n\n\t\tconst linePriceElements = this.querySelectorAll('[data-content-line-price]');\n\t\tconst formattedLinePrice = this.#formatCurrency(this.#itemData.line_price || 0);\n\n\t\tlinePriceElements.forEach((element) => {\n\t\t\telement.textContent = formattedLinePrice;\n\t\t});\n\t}\n\n\t/**\n\t * Format currency value from cents to dollar string\n\t * @param {number} cents - Price in cents\n\t * @returns {string} Formatted currency string (e.g., \"$29.99\")\n\t * @private\n\t */\n\t#formatCurrency(cents) {\n\t\tif (typeof cents !== 'number') return '$0.00';\n\t\treturn `$${(cents / 100).toFixed(2)}`;\n\t}\n\n\t/**\n\t * Get the current item data\n\t */\n\tget itemData() {\n\t\treturn this.#itemData;\n\t}\n\n\t/**\n\t * Set the state of the cart item\n\t * @param {string} state - 'ready', 'processing', 'destroying', or 'appearing'\n\t */\n\tsetState(state) {\n\t\tif (['ready', 'processing', 'destroying', 'appearing'].includes(state)) {\n\t\t\tthis.setAttribute('state', state);\n\t\t}\n\t}\n\n\t/**\n\t * gracefully animate this cart item closed, then let #handleTransitionEnd remove it\n\t *\n\t * @returns {void}\n\t */\n\tdestroyYourself() {\n\t\t// bail if already in the middle of a destroy cycle\n\t\tif (this.#isDestroying) return;\n\n\t\tthis.#isDestroying = true;\n\n\t\t// snapshot the current rendered height before applying any \"destroying\" styles\n\t\tconst initialHeight = this.offsetHeight;\n\n\t\t// switch to 'destroying' state so css can fade / slide visuals\n\t\tthis.setState('destroying');\n\n\t\t// lock the measured height on the next animation frame to ensure layout is fully flushed\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.style.height = `${initialHeight}px`;\n\t\t\t// this.offsetHeight; // force a reflow so the browser registers the fixed height\n\n\t\t\t// read the css custom property for timing, defaulting to 400ms\n\t\t\tconst elementStyle = getComputedStyle(this);\n\t\t\tconst destroyDuration =\n\t\t\t\telementStyle.getPropertyValue('--cart-item-destroying-duration')?.trim() || '400ms';\n\n\t\t\t// animate only the height to zero; other properties stay under stylesheet control\n\t\t\tthis.style.transition = `height ${destroyDuration} ease`;\n\t\t\tthis.style.height = '0px';\n\n\t\t\t// setTimeout(() => {\n\t\t\t// \tthis.style.height = '0px';\n\t\t\t// }, 1);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\t// make sure item is removed\n\t\t\t\tthis.remove();\n\t\t\t}, 600);\n\t\t});\n\t}\n}\n\n/**\n * Supporting component classes for cart item\n */\nclass CartItemContent extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t}\n}\n\nclass CartItemProcessing extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t}\n}\n\n// Define custom elements (check if not already defined)\nif (!customElements.get('cart-item')) {\n\tcustomElements.define('cart-item', CartItem);\n}\nif (!customElements.get('cart-item-content')) {\n\tcustomElements.define('cart-item-content', CartItemContent);\n}\nif (!customElements.get('cart-item-processing')) {\n\tcustomElements.define('cart-item-processing', CartItemProcessing);\n}\n\nexport { CartItem, CartItemContent, CartItemProcessing };\n//# sourceMappingURL=cart-item.esm.js.map\n","/**\n * Retrieves all focusable elements within a given container.\n *\n * @param {HTMLElement} container - The container element to search for focusable elements.\n * @returns {HTMLElement[]} An array of focusable elements found within the container.\n */\nconst getFocusableElements = (container) => {\n\tconst focusableSelectors =\n\t\t'summary, a[href], button:not(:disabled), [tabindex]:not([tabindex^=\"-\"]):not(focus-trap-start):not(focus-trap-end), [draggable], area, input:not([type=hidden]):not(:disabled), select:not(:disabled), textarea:not(:disabled), object, iframe';\n\treturn Array.from(container.querySelectorAll(focusableSelectors));\n};\n\nclass FocusTrap extends HTMLElement {\n\t/** @type {boolean} Indicates whether the styles have been injected into the DOM. */\n\tstatic styleInjected = false;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.trapStart = null;\n\t\tthis.trapEnd = null;\n\n\t\t// Inject styles only once, when the first FocusTrap instance is created.\n\t\tif (!FocusTrap.styleInjected) {\n\t\t\tthis.injectStyles();\n\t\t\tFocusTrap.styleInjected = true;\n\t\t}\n\t}\n\n\t/**\n\t * Injects necessary styles for the focus trap into the document's head.\n\t * This ensures that focus-trap-start and focus-trap-end elements are hidden.\n\t */\n\tinjectStyles() {\n\t\tconst style = document.createElement('style');\n\t\tstyle.textContent = `\n focus-trap-start,\n focus-trap-end {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n white-space: nowrap;\n }\n `;\n\t\tdocument.head.appendChild(style);\n\t}\n\n\t/**\n\t * Called when the element is connected to the DOM.\n\t * Sets up the focus trap and adds the keydown event listener.\n\t */\n\tconnectedCallback() {\n\t\tthis.setupTrap();\n\t\tthis.addEventListener('keydown', this.handleKeyDown);\n\t}\n\n\t/**\n\t * Called when the element is disconnected from the DOM.\n\t * Removes the keydown event listener.\n\t */\n\tdisconnectedCallback() {\n\t\tthis.removeEventListener('keydown', this.handleKeyDown);\n\t}\n\n\t/**\n\t * Sets up the focus trap by adding trap start and trap end elements.\n\t * Focuses the trap start element to initiate the focus trap.\n\t */\n\tsetupTrap() {\n\t\t// check to see it there are any focusable children\n\t\tconst focusableElements = getFocusableElements(this);\n\t\t// exit if there aren't any\n\t\tif (focusableElements.length === 0) return;\n\n\t\t// create trap start and end elements\n\t\tthis.trapStart = document.createElement('focus-trap-start');\n\t\tthis.trapEnd = document.createElement('focus-trap-end');\n\n\t\t// add to DOM\n\t\tthis.prepend(this.trapStart);\n\t\tthis.append(this.trapEnd);\n\t}\n\n\t/**\n\t * Handles the keydown event. If the Escape key is pressed, the focus trap is exited.\n\t *\n\t * @param {KeyboardEvent} e - The keyboard event object.\n\t */\n\thandleKeyDown = (e) => {\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tthis.exitTrap();\n\t\t}\n\t};\n\n\t/**\n\t * Exits the focus trap by hiding the current container and shifting focus\n\t * back to the trigger element that opened the trap.\n\t */\n\texitTrap() {\n\t\tconst container = this.closest('[aria-hidden=\"false\"]');\n\t\tif (!container) return;\n\n\t\tcontainer.setAttribute('aria-hidden', 'true');\n\n\t\tconst trigger = document.querySelector(\n\t\t\t`[aria-expanded=\"true\"][aria-controls=\"${container.id}\"]`\n\t\t);\n\t\tif (trigger) {\n\t\t\ttrigger.setAttribute('aria-expanded', 'false');\n\t\t\ttrigger.focus();\n\t\t}\n\t}\n}\n\nclass FocusTrapStart extends HTMLElement {\n\t/**\n\t * Called when the element is connected to the DOM.\n\t * Sets the tabindex and adds the focus event listener.\n\t */\n\tconnectedCallback() {\n\t\tthis.setAttribute('tabindex', '0');\n\t\tthis.addEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Called when the element is disconnected from the DOM.\n\t * Removes the focus event listener.\n\t */\n\tdisconnectedCallback() {\n\t\tthis.removeEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Handles the focus event. If focus moves backwards from the first focusable element,\n\t * it is cycled to the last focusable element, and vice versa.\n\t *\n\t * @param {FocusEvent} e - The focus event object.\n\t */\n\thandleFocus = (e) => {\n\t\tconst trap = this.closest('focus-trap');\n\t\tconst focusableElements = getFocusableElements(trap);\n\n\t\tif (focusableElements.length === 0) return;\n\n\t\tconst firstElement = focusableElements[0];\n\t\tconst lastElement =\n\t\t\tfocusableElements[focusableElements.length - 1];\n\n\t\tif (e.relatedTarget === firstElement) {\n\t\t\tlastElement.focus();\n\t\t} else {\n\t\t\tfirstElement.focus();\n\t\t}\n\t};\n}\n\nclass FocusTrapEnd extends HTMLElement {\n\t/**\n\t * Called when the element is connected to the DOM.\n\t * Sets the tabindex and adds the focus event listener.\n\t */\n\tconnectedCallback() {\n\t\tthis.setAttribute('tabindex', '0');\n\t\tthis.addEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Called when the element is disconnected from the DOM.\n\t * Removes the focus event listener.\n\t */\n\tdisconnectedCallback() {\n\t\tthis.removeEventListener('focus', this.handleFocus);\n\t}\n\n\t/**\n\t * Handles the focus event. When the trap end is focused, focus is shifted back to the trap start.\n\t */\n\thandleFocus = () => {\n\t\tconst trap = this.closest('focus-trap');\n\t\tconst trapStart = trap.querySelector('focus-trap-start');\n\t\ttrapStart.focus();\n\t};\n}\n\nif (!customElements.get('focus-trap')) {\n\tcustomElements.define('focus-trap', FocusTrap);\n}\nif (!customElements.get('focus-trap-start')) {\n\tcustomElements.define('focus-trap-start', FocusTrapStart);\n}\nif (!customElements.get('focus-trap-end')) {\n\tcustomElements.define('focus-trap-end', FocusTrapEnd);\n}\n//# sourceMappingURL=focus-trap.esm.js.map\n","class EventEmitter {\n #events;\n\n constructor() {\n this.#events = new Map();\n }\n\n /**\n * Binds a listener to an event.\n * @param {string} event - The event to bind the listener to.\n * @param {Function} listener - The listener function to bind.\n * @returns {EventEmitter} The current instance for chaining.\n * @throws {TypeError} If the listener is not a function.\n */\n on(event, listener) {\n if (typeof listener !== \"function\") {\n throw new TypeError(\"Listener must be a function\");\n }\n\n const listeners = this.#events.get(event) || [];\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n this.#events.set(event, listeners);\n\n return this;\n }\n\n /**\n * Unbinds a listener from an event.\n * @param {string} event - The event to unbind the listener from.\n * @param {Function} listener - The listener function to unbind.\n * @returns {EventEmitter} The current instance for chaining.\n */\n off(event, listener) {\n const listeners = this.#events.get(event);\n if (!listeners) return this;\n\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n if (listeners.length === 0) {\n this.#events.delete(event);\n } else {\n this.#events.set(event, listeners);\n }\n }\n\n return this;\n }\n\n /**\n * Triggers an event and calls all bound listeners.\n * @param {string} event - The event to trigger.\n * @param {...*} args - Arguments to pass to the listener functions.\n * @returns {boolean} True if the event had listeners, false otherwise.\n */\n emit(event, ...args) {\n const listeners = this.#events.get(event);\n if (!listeners || listeners.length === 0) return false;\n\n for (let i = 0, n = listeners.length; i < n; ++i) {\n try {\n listeners[i].apply(this, args);\n } catch (error) {\n console.error(`Error in listener for event '${event}':`, error);\n }\n }\n\n return true;\n }\n\n /**\n * Removes all listeners for a specific event or all events.\n * @param {string} [event] - The event to remove listeners from. If not provided, removes all listeners.\n * @returns {EventEmitter} The current instance for chaining.\n */\n removeAllListeners(event) {\n if (event) {\n this.#events.delete(event);\n } else {\n this.#events.clear();\n }\n return this;\n }\n}\n\nexport { EventEmitter as default };\n//# sourceMappingURL=event-emitter.esm.js.map\n","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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","x_google_ignoreList":[0,1,2,3]}
@@ -1 +1 @@
1
- cart-item{--cart-item-processing-duration:250ms;--cart-item-destroying-duration:600ms;--cart-item-appearing-duration:400ms;--cart-item-shadow-color:rgba(0,0,0,.15);--cart-item-shadow-color-strong:rgba(0,0,0,.5);--cart-item-processing-bg:hsla(0,0%,39%,.2);--cart-item-destroying-bg:rgba(0,0,0,.1);--cart-item-processing-scale:0.98;--cart-item-destroying-scale:0.85;--cart-item-appearing-scale:0.9;--cart-item-processing-blur:1px;--cart-item-destroying-blur:10px;--cart-item-appearing-blur:2px;--cart-item-destroying-opacity:0.2;--cart-item-appearing-opacity:0.5;--cart-item-destroying-brightness:0.6;--cart-item-destroying-saturate:0.3;box-shadow:inset 0 0 0 transparent;display:block;overflow:hidden;padding:0;position:relative;transition:filter var(--cart-item-processing-duration) ease-out,background-color var(--cart-item-processing-duration) ease-out,box-shadow var(--cart-item-processing-duration) ease-out}cart-item:after{background:transparent;content:"";display:block;height:100%;left:0;pointer-events:none;position:absolute;top:0;transition:background-color var(--cart-item-processing-duration) ease;width:100%}cart-item[state=ready] cart-item-content{filter:blur(0);opacity:1;transform:scale(1)}cart-item[state=ready] cart-item-processing{opacity:0;visibility:hidden}cart-item[state=processing]{box-shadow:inset 0 2px 10px var(--cart-item-shadow-color)}cart-item[state=processing]:after{background:rgba(0,0,0,.15)}cart-item[state=processing] cart-item-content{filter:blur(var(--cart-item-processing-blur));opacity:.9;pointer-events:none;transform:scale(var(--cart-item-processing-scale))}cart-item[state=processing] cart-item-processing{opacity:1;visibility:visible}cart-item[state=destroying]{background-color:var(--cart-item-destroying-bg);box-shadow:inset 0 4px 20px var(--cart-item-shadow-color-strong);margin-bottom:0;margin-top:0;transition:filter var(--cart-item-destroying-duration) ease,background-color var(--cart-item-destroying-duration) ease,box-shadow var(--cart-item-destroying-duration) ease,margin var(--cart-item-destroying-duration) ease}cart-item[state=destroying]:after{background:rgba(0,0,0,.9);transition:background-color var(--cart-item-destroying-duration) ease}cart-item[state=destroying] cart-item-content{filter:blur(var(--cart-item-destroying-blur)) saturate(var(--cart-item-destroying-saturate));opacity:var(--cart-item-destroying-opacity);pointer-events:none;transform:scale(var(--cart-item-destroying-scale));transition:transform var(--cart-item-destroying-duration) ease,filter var(--cart-item-destroying-duration) ease,opacity var(--cart-item-destroying-duration) ease}cart-item[state=destroying] cart-item-processing{opacity:0;transition:opacity var(--cart-item-processing-duration) ease}cart-item[state=appearing]{height:0;overflow:hidden;transition:height var(--cart-item-appearing-duration) ease-out,filter var(--cart-item-appearing-duration) ease-out,opacity var(--cart-item-appearing-duration) ease-out}cart-item[state=appearing] cart-item-content{filter:blur(var(--cart-item-appearing-blur));opacity:var(--cart-item-appearing-opacity);transform:scale(var(--cart-item-appearing-scale));transition:transform var(--cart-item-appearing-duration) ease-out,filter var(--cart-item-appearing-duration) ease-out,opacity var(--cart-item-appearing-duration) ease-out}cart-item[state=appearing] cart-item-processing{opacity:0;visibility:hidden}cart-item-content{display:block;transition:transform var(--cart-item-processing-duration) ease-out,filter var(--cart-item-processing-duration) ease-out,opacity var(--cart-item-processing-duration) ease-out}cart-item-processing{align-items:center;background:transparent;bottom:0;display:flex;justify-content:center;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity var(--cart-item-processing-duration) ease-out,visibility var(--cart-item-processing-duration) ease-out;visibility:hidden;z-index:10}cart-item-processing .cart-item-loader{--_g:no-repeat radial-gradient(circle closest-side,#000 90%,#0000);animation:cart-item-loader 1s linear infinite;aspect-ratio:2;background:var(--_g) 0 50%,var(--_g) 50% 50%,var(--_g) 100% 50%;background-size:33.3333333333% 50%;width:60px}@keyframes cart-item-loader{20%{background-position:0 0,50% 50%,100% 50%}40%{background-position:0 100%,50% 0,100% 50%}60%{background-position:0 50%,50% 100%,100% 0}80%{background-position:0 50%,50% 50%,100% 100%}}:root{--cart-dialog-z-index:1000;--cart-overlay-z-index:1000;--cart-panel-z-index:1001;--cart-panel-width:min(400px,90vw);--cart-overlay-background:rgba(0,0,0,.15);--cart-overlay-backdrop-filter:blur(4px);--cart-panel-background:#fff;--cart-panel-shadow:-5px 0 25px rgba(0,0,0,.15);--cart-panel-border-radius:0;--cart-transition-duration:350ms;--cart-transition-timing:cubic-bezier(0.4,0,0.2,1)}cart-dialog{display:contents}cart-dialog[aria-hidden=false] cart-overlay,cart-dialog[aria-hidden=false] cart-panel{opacity:1;pointer-events:auto}cart-dialog[aria-hidden=false] cart-panel{transform:translateX(0)}cart-overlay{backdrop-filter:var(--cart-overlay-backdrop-filter);background-color:var(--cart-overlay-background);left:0;transition:opacity var(--cart-transition-duration) var(--cart-transition-timing),backdrop-filter var(--cart-transition-duration) var(--cart-transition-timing);width:100vw;z-index:var(--cart-overlay-z-index)}cart-overlay,cart-panel{height:100vh;opacity:0;pointer-events:none;position:fixed;top:0}cart-panel{background:var(--cart-panel-background);border-radius:var(--cart-panel-border-radius);box-shadow:var(--cart-panel-shadow);overflow:hidden;right:0;transform:translateX(100%);transition:opacity var(--cart-transition-duration) var(--cart-transition-timing),transform var(--cart-transition-duration) var(--cart-transition-timing);width:var(--cart-panel-width);z-index:var(--cart-panel-z-index)}cart-panel.hidden{display:none}body.overflow-hidden{height:100%;left:0;margin:0;overflow:hidden;position:fixed;right:0;width:100%}
1
+ cart-item{--cart-item-processing-duration:250ms;--cart-item-destroying-duration:600ms;--cart-item-appearing-duration:400ms;--cart-item-shadow-color:rgba(0,0,0,.15);--cart-item-shadow-color-strong:rgba(0,0,0,.5);--cart-item-destroying-bg:rgba(0,0,0,.1);--cart-item-processing-scale:0.98;--cart-item-destroying-scale:0.85;--cart-item-appearing-scale:0.9;--cart-item-processing-blur:1px;--cart-item-destroying-blur:10px;--cart-item-appearing-blur:2px;--cart-item-destroying-opacity:0.2;--cart-item-appearing-opacity:0.5;--cart-item-destroying-brightness:0.6;--cart-item-destroying-saturate:0.3;box-shadow:inset 0 0 0 transparent;display:block;overflow:hidden;padding:0;position:relative;transition:filter var(--cart-item-processing-duration) ease-out,background-color var(--cart-item-processing-duration) ease-out,box-shadow var(--cart-item-processing-duration) ease-out}cart-item:after{background:transparent;content:"";display:block;height:100%;left:0;pointer-events:none;position:absolute;top:0;transition:background-color var(--cart-item-processing-duration) ease;width:100%}cart-item[state=ready]{transition:filter var(--cart-item-processing-duration) ease-out,background-color var(--cart-item-processing-duration) ease-out,box-shadow var(--cart-item-processing-duration) ease-out,height var(--cart-item-appearing-duration) ease-out}cart-item[state=ready] cart-item-content{filter:blur(0);opacity:1;transform:scale(1);transition:transform var(--cart-item-appearing-duration) ease-out,filter var(--cart-item-appearing-duration) ease-out,opacity var(--cart-item-appearing-duration) ease-out}cart-item[state=ready] cart-item-processing{opacity:0;visibility:hidden}cart-item[state=processing]{box-shadow:inset 0 2px 10px var(--cart-item-shadow-color)}cart-item[state=processing]:after{background:rgba(0,0,0,.15)}cart-item[state=processing] cart-item-content{filter:blur(var(--cart-item-processing-blur));opacity:.9;pointer-events:none;transform:scale(var(--cart-item-processing-scale));transition:transform var(--cart-item-processing-duration) ease-out,filter var(--cart-item-processing-duration) ease-out,opacity var(--cart-item-processing-duration) ease-out}cart-item[state=processing] cart-item-processing{opacity:1;visibility:visible}cart-item[state=destroying]{background-color:var(--cart-item-destroying-bg);box-shadow:inset 0 2px 20px var(--cart-item-shadow-color-strong);margin-bottom:0;margin-top:0;transition:filter var(--cart-item-destroying-duration) ease,background-color var(--cart-item-destroying-duration) ease,box-shadow var(--cart-item-destroying-duration) ease,margin var(--cart-item-destroying-duration) ease}cart-item[state=destroying]:after{background:rgba(0,0,0,.9);transition:background-color var(--cart-item-destroying-duration) ease}cart-item[state=destroying] cart-item-content{filter:blur(var(--cart-item-destroying-blur)) saturate(var(--cart-item-destroying-saturate));opacity:var(--cart-item-destroying-opacity);pointer-events:none;transform:scale(var(--cart-item-destroying-scale));transition:transform var(--cart-item-destroying-duration) ease,filter var(--cart-item-destroying-duration) ease,opacity var(--cart-item-destroying-duration) ease}cart-item[state=destroying] cart-item-processing{opacity:0;transition:opacity var(--cart-item-processing-duration) ease}cart-item[state=appearing]{height:0;overflow:hidden;transition:height var(--cart-item-appearing-duration) ease-out,filter var(--cart-item-appearing-duration) ease-out,opacity var(--cart-item-appearing-duration) ease-out}cart-item[state=appearing] cart-item-content{filter:blur(var(--cart-item-appearing-blur));opacity:var(--cart-item-appearing-opacity);transform:scale(var(--cart-item-appearing-scale));transition:transform var(--cart-item-appearing-duration) ease-out,filter var(--cart-item-appearing-duration) ease-out,opacity var(--cart-item-appearing-duration) ease-out}cart-item[state=appearing] cart-item-processing{opacity:0;visibility:hidden}cart-item-content{display:block}cart-item-processing{align-items:center;background:transparent;bottom:0;display:flex;justify-content:center;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity var(--cart-item-processing-duration) ease-out,visibility var(--cart-item-processing-duration) ease-out;visibility:hidden;z-index:10}cart-item-processing .cart-item-loader{--_g:no-repeat radial-gradient(circle closest-side,#000 90%,#0000);animation:cart-item-loader 1s linear infinite;aspect-ratio:2;background:var(--_g) 0 50%,var(--_g) 50% 50%,var(--_g) 100% 50%;background-size:33.3333333333% 50%;width:60px}@keyframes cart-item-loader{20%{background-position:0 0,50% 50%,100% 50%}40%{background-position:0 100%,50% 0,100% 50%}60%{background-position:0 50%,50% 100%,100% 0}80%{background-position:0 50%,50% 50%,100% 100%}}:root{--cart-dialog-z-index:1000;--cart-overlay-z-index:1000;--cart-panel-z-index:1001;--cart-panel-width:min(400px,90vw);--cart-overlay-background:rgba(0,0,0,.15);--cart-overlay-backdrop-filter:blur(4px);--cart-panel-background:#fff;--cart-panel-shadow:-5px 0 25px rgba(0,0,0,.15);--cart-panel-border-radius:0;--cart-transition-duration:350ms;--cart-transition-timing:cubic-bezier(0.4,0,0.2,1)}cart-dialog{display:contents}cart-dialog[aria-hidden=false] cart-overlay,cart-dialog[aria-hidden=false] cart-panel{opacity:1;pointer-events:auto}cart-dialog[aria-hidden=false] cart-panel{transform:translateX(0)}cart-overlay{backdrop-filter:var(--cart-overlay-backdrop-filter);background-color:var(--cart-overlay-background);height:100vh;left:0;opacity:0;transition:opacity var(--cart-transition-duration) var(--cart-transition-timing),backdrop-filter var(--cart-transition-duration) var(--cart-transition-timing);width:100vw;z-index:var(--cart-overlay-z-index)}cart-overlay,cart-panel{pointer-events:none;position:fixed;top:0}cart-panel{background:var(--cart-panel-background);border-radius:var(--cart-panel-border-radius);box-shadow:var(--cart-panel-shadow);height:100dvh;overflow:hidden;right:0;transform:translateX(100%);transition:transform var(--cart-transition-duration) var(--cart-transition-timing);width:var(--cart-panel-width);z-index:var(--cart-panel-z-index)}cart-panel.hidden{display:none}body.overflow-hidden{overflow:hidden}
@@ -1 +1 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).CartDialog={})}(this,function(t){"use strict";class CartItem extends HTMLElement{static#t=null;static#e=null;#r="ready";#n=!1;#s={};#a=null;static setTemplate(t){if("function"!=typeof t)throw new Error("Template must be a function");CartItem.#t=t}static setProcessingTemplate(t){if("function"!=typeof t)throw new Error("Processing template must be a function");CartItem.#e=t}static get observedAttributes(){return["state","key"]}attributeChangedCallback(t,e,r){e!==r&&"state"===t&&(this.#r=r||"ready")}constructor(t=null){super(),this.#a=t,this.#r=t?"appearing":this.getAttribute("state")||"ready",this.#s={click:this.#i.bind(this),change:this.#o.bind(this),transitionEnd:this.#c.bind(this)}}connectedCallback(){this.#a&&this.#l(),this.content=this.querySelector("cart-item-content"),this.processing=this.querySelector("cart-item-processing"),this.#d(),"appearing"===this.#r&&(this.setAttribute("state","appearing"),requestAnimationFrame(()=>{const t=this.scrollHeight;this.style.height=`${t}px`,setTimeout(()=>{this.setState("ready"),setTimeout(()=>{this.style.height=""},400)},50)}))}disconnectedCallback(){this.#h()}#d(){this.addEventListener("click",this.#s.click),this.addEventListener("change",this.#s.change),this.addEventListener("transitionend",this.#s.transitionEnd)}#h(){this.removeEventListener("click",this.#s.click),this.removeEventListener("change",this.#s.change),this.removeEventListener("transitionend",this.#s.transitionEnd)}get state(){return this.#r}get cartKey(){return this.getAttribute("key")}#i(t){t.target.closest("[data-action-remove-item]")&&(t.preventDefault(),this.#u())}#o(t){const e=t.target.closest("[data-cart-quantity]");e&&this.#m(e.value)}#c(t){"height"===t.propertyName&&this.#n&&this.remove()}#u(){this.dispatchEvent(new CustomEvent("cart-item:remove",{bubbles:!0,detail:{cartKey:this.cartKey,element:this}}))}#m(t){this.dispatchEvent(new CustomEvent("cart-item:quantity-change",{bubbles:!0,detail:{cartKey:this.cartKey,quantity:parseInt(t),element:this}}))}#l(){if(!this.#a||!CartItem.#t)return;const t=this.#a.key||this.#a.id;t&&this.setAttribute("key",t);const e=CartItem.#t(this.#a),r=CartItem.#e?CartItem.#e():'<div class="cart-item-loader"></div>';this.innerHTML=`\n <cart-item-content>\n ${e}\n </cart-item-content>\n <cart-item-processing>\n ${r}\n </cart-item-processing>\n `}setData(t){this.#a=t,this.#l(),this.content=this.querySelector("cart-item-content"),this.processing=this.querySelector("cart-item-processing")}get itemData(){return this.#a}setState(t){["ready","processing","destroying","appearing"].includes(t)&&this.setAttribute("state",t)}destroyYourself(){if(this.#n)return;this.#n=!0;const t=this.offsetHeight;this.setState("destroying"),requestAnimationFrame(()=>{this.style.height=`${t}px`,this.offsetHeight;const e=getComputedStyle(this),r=e.getPropertyValue("--cart-item-destroying-duration")?.trim()||"400ms";this.style.transition=`height ${r} ease`,this.style.height="0px"})}}class CartItemContent extends HTMLElement{constructor(){super()}}class CartItemProcessing extends HTMLElement{constructor(){super()}}customElements.get("cart-item")||customElements.define("cart-item",CartItem),customElements.get("cart-item-content")||customElements.define("cart-item-content",CartItemContent),customElements.get("cart-item-processing")||customElements.define("cart-item-processing",CartItemProcessing);const e=t=>Array.from(t.querySelectorAll('summary, a[href], button:not(:disabled), [tabindex]:not([tabindex^="-"]):not(focus-trap-start):not(focus-trap-end), [draggable], area, input:not([type=hidden]):not(:disabled), select:not(:disabled), textarea:not(:disabled), object, iframe'));class FocusTrap extends HTMLElement{static styleInjected=!1;constructor(){super(),this.trapStart=null,this.trapEnd=null,FocusTrap.styleInjected||(this.injectStyles(),FocusTrap.styleInjected=!0)}injectStyles(){const t=document.createElement("style");t.textContent="\n focus-trap-start,\n focus-trap-end {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n white-space: nowrap;\n }\n ",document.head.appendChild(t)}connectedCallback(){this.setupTrap(),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("keydown",this.handleKeyDown)}setupTrap(){0!==e(this).length&&(this.trapStart=document.createElement("focus-trap-start"),this.trapEnd=document.createElement("focus-trap-end"),this.prepend(this.trapStart),this.append(this.trapEnd))}handleKeyDown=t=>{"Escape"===t.key&&(t.preventDefault(),this.exitTrap())};exitTrap(){const t=this.closest('[aria-hidden="false"]');if(!t)return;t.setAttribute("aria-hidden","true");const e=document.querySelector(`[aria-expanded="true"][aria-controls="${t.id}"]`);e&&(e.setAttribute("aria-expanded","false"),e.focus())}}class FocusTrapStart extends HTMLElement{connectedCallback(){this.setAttribute("tabindex","0"),this.addEventListener("focus",this.handleFocus)}disconnectedCallback(){this.removeEventListener("focus",this.handleFocus)}handleFocus=t=>{const r=this.closest("focus-trap"),n=e(r);if(0===n.length)return;const s=n[0],a=n[n.length-1];t.relatedTarget===s?a.focus():s.focus()}}class FocusTrapEnd extends HTMLElement{connectedCallback(){this.setAttribute("tabindex","0"),this.addEventListener("focus",this.handleFocus)}disconnectedCallback(){this.removeEventListener("focus",this.handleFocus)}handleFocus=()=>{this.closest("focus-trap").querySelector("focus-trap-start").focus()}}customElements.define("focus-trap",FocusTrap),customElements.define("focus-trap-start",FocusTrapStart),customElements.define("focus-trap-end",FocusTrapEnd);class EventEmitter{#p;constructor(){this.#p=new Map}on(t,e){if("function"!=typeof e)throw new TypeError("Listener must be a function");const r=this.#p.get(t)||[];return r.includes(e)||r.push(e),this.#p.set(t,r),this}off(t,e){const r=this.#p.get(t);if(!r)return this;const n=r.indexOf(e);return-1!==n&&(r.splice(n,1),0===r.length?this.#p.delete(t):this.#p.set(t,r)),this}emit(t,...e){const r=this.#p.get(t);if(!r||0===r.length)return!1;for(let n=0,s=r.length;n<s;++n)try{r[n].apply(this,e)}catch(e){console.error(`Error in listener for event '${t}':`,e)}return!0}removeAllListeners(t){return t?this.#p.delete(t):this.#p.clear(),this}}class CartDialog extends HTMLElement{#c;#g=0;#f=null;#y;disconnectedCallback(){const t=this;t.contentPanel&&t.contentPanel.removeEventListener("transitionend",t.#c),document.body.classList.remove("overflow-hidden"),this.#E(),this.#h()}#v(){this.#g=window.pageYOffset,document.body.classList.add("overflow-hidden"),document.body.style.top=`-${this.#g}px`}#E(){document.body.classList.remove("overflow-hidden"),document.body.style.removeProperty("top"),window.scrollTo(0,this.#g)}constructor(){super();const t=this;t.id=t.getAttribute("id"),t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-hidden","true"),t.triggerEl=null,t.#y=new EventEmitter,t.#c=e=>{"opacity"===e.propertyName&&"true"===t.getAttribute("aria-hidden")&&(t.contentPanel.classList.add("hidden"),t.#b("cart-dialog:afterHide",{triggerElement:t.triggerEl}))}}connectedCallback(){const t=this;if(t.contentPanel=t.querySelector("cart-panel"),t.contentPanel){if(t.focusTrap=document.createElement("focus-trap"),!t.getAttribute("aria-labelledby")){const e=t.querySelector("h1, h2, h3");e&&!e.id&&(e.id=`${t.id}-title`),e?.id&&t.setAttribute("aria-labelledby",e.id)}t.contentPanel.parentNode.insertBefore(t.focusTrap,t.contentPanel),t.focusTrap.appendChild(t.contentPanel),t.focusTrap.setupTrap(),t.prepend(document.createElement("cart-overlay")),t.#d(),t.#C()}else console.error("cart-panel element not found inside cart-dialog")}on(t,e){return this.#y.on(t,e),this}off(t,e){return this.#y.off(t,e),this}#b(t,e=null){this.#y.emit(t,e)}#d(){const t=this;document.addEventListener("click",e=>{const r=e.target.closest(`[aria-controls="${t.id}"]`);r&&("true"===r.getAttribute("data-prevent-default")&&e.preventDefault(),t.show(r))}),t.addEventListener("click",e=>{e.target.closest('[data-action="hide-cart"]')&&t.hide()}),t.addEventListener("cart-item:remove",e=>{t.#T(e)}),t.addEventListener("cart-item:quantity-change",e=>{t.#L(e)}),t.contentPanel.addEventListener("transitionend",t.#c)}#h(){const t=this;t.contentPanel&&t.contentPanel.removeEventListener("transitionend",t.#c)}#C(){this.addEventListener("keydown",t=>{"Escape"===t.key&&this.hide()})}#T(t){const{cartKey:e,element:r}=t.detail;r.setState("processing"),this.updateCartItem(e,0).then(t=>{t&&!t.error?(r.destroyYourself(),this.#f=t,this.#S(t),this.#b("cart-dialog:updated",{cart:t}),this.#b("cart-dialog:data-changed",t)):(r.setState("ready"),console.error("Failed to remove cart item:",e))}).catch(t=>{r.setState("ready"),console.error("Error removing cart item:",t)})}#L(t){const{cartKey:e,quantity:r,element:n}=t.detail;n.setState("processing"),this.updateCartItem(e,r).then(t=>{t&&!t.error?(this.#f=t,this.#S(t),n.setState("ready"),this.#b("cart-dialog:updated",{cart:t}),this.#b("cart-dialog:data-changed",t)):(n.setState("ready"),console.error("Failed to update cart item quantity:",e,r))}).catch(t=>{n.setState("ready"),console.error("Error updating cart item quantity:",t)})}#S(t=null){t||this.#f}getCart(){return fetch("/cart.json",{crossDomain:!0,credentials:"same-origin"}).then(t=>{if(!t.ok)throw Error(t.statusText);return t.json()}).catch(t=>(console.error("Error fetching cart:",t),{error:!0,message:t.message}))}updateCartItem(t,e){return fetch("/cart/change.json",{crossDomain:!0,method:"POST",credentials:"same-origin",body:JSON.stringify({id:t,quantity:e}),headers:{"Content-Type":"application/json"}}).then(t=>{if(!t.ok)throw Error(t.statusText);return t.json()}).catch(t=>(console.error("Error updating cart item:",t),{error:!0,message:t.message}))}refreshCart(){return this.getCart().then(t=>(t&&!t.error&&(this.#f=t,this.#S(t),this.#b("cart-dialog:refreshed",{cart:t}),this.#b("cart-dialog:data-changed",t)),t))}show(t=null){const e=this;e.triggerEl=t||!1,e.contentPanel.classList.remove("hidden"),requestAnimationFrame(()=>{e.setAttribute("aria-hidden","false"),e.triggerEl&&e.triggerEl.setAttribute("aria-expanded","true"),e.#v();const t=e.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');t&&requestAnimationFrame(()=>{t.focus()}),e.refreshCart(),e.#b("cart-dialog:show",{triggerElement:e.triggerEl})})}hide(){const t=this;t.#E(),t.triggerEl&&(t.triggerEl.focus(),t.triggerEl.setAttribute("aria-expanded","false")),t.setAttribute("aria-hidden","true"),t.#b("cart-dialog:hide",{triggerElement:t.triggerEl})}}class CartOverlay extends HTMLElement{constructor(){super(),this.setAttribute("tabindex","-1"),this.setAttribute("aria-hidden","true"),this.cartDialog=this.closest("cart-dialog"),this.#d()}#d(){this.addEventListener("click",()=>{this.cartDialog.hide()})}}class CartPanel extends HTMLElement{constructor(){super(),this.setAttribute("role","document")}}customElements.get("cart-dialog")||customElements.define("cart-dialog",CartDialog),customElements.get("cart-overlay")||customElements.define("cart-overlay",CartOverlay),customElements.get("cart-panel")||customElements.define("cart-panel",CartPanel),t.CartDialog=CartDialog,t.CartOverlay=CartOverlay,t.CartPanel=CartPanel,t.default=CartDialog,Object.defineProperty(t,"__esModule",{value:!0})});
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).CartDialog={})}(this,function(t){"use strict";class QuantityModifier extends HTMLElement{static#t=!1;constructor(){super(),this.handleDecrement=this.handleDecrement.bind(this),this.handleIncrement=this.handleIncrement.bind(this),this.handleInputChange=this.handleInputChange.bind(this),QuantityModifier.#e()}static#e(){if(QuantityModifier.#t)return;const t=document.createElement("style");t.textContent='\n /* Hide number input spin buttons for quantity-modifier */\n quantity-modifier input::-webkit-outer-spin-button,\n quantity-modifier input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n \n quantity-modifier input[type="number"] {\n -moz-appearance: textfield;\n }\n ',document.head.appendChild(t),QuantityModifier.#t=!0}static get observedAttributes(){return["min","max","value"]}connectedCallback(){this.render(),this.attachEventListeners()}disconnectedCallback(){this.removeEventListeners()}attributeChangedCallback(t,e,n){e!==n&&this.updateInput()}get min(){return parseInt(this.getAttribute("min"))||1}get max(){return parseInt(this.getAttribute("max"))||99}get value(){return parseInt(this.getAttribute("value"))||1}set value(t){this.setAttribute("value",t)}render(){const t=this.min,e=this.max,n=this.value,r=this.querySelector("[data-action-decrement]"),i=this.querySelector("[data-action-increment]"),a=this.querySelector("[data-quantity-modifier-field]");r&&i&&a?(a.value=n,a.min=t,a.max=e,a.type="number"):this.innerHTML=`\n <button data-action-decrement type="button">\n <svg class="svg-decrement" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">\n <title>decrement</title>\n <path fill="currentColor" d="M368 224H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h352c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z"></path>\n </svg>\n </button>\n <input \n type="number" \n inputmode="numeric" \n pattern="[0-9]*" \n data-quantity-modifier-field \n value="${n}" min="${t}" max="${e}">\n <button data-action-increment type="button">\n <svg class="svg-increment" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">\n <title>increment</title>\n <path fill="currentColor" d="M368 224H224V80c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v144H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h144v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V288h144c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z"></path>\n </svg>\n </button>\n `}attachEventListeners(){const t=this.querySelector("[data-action-decrement]"),e=this.querySelector("[data-action-increment]"),n=this.querySelector("[data-quantity-modifier-field]");t&&t.addEventListener("click",this.handleDecrement),e&&e.addEventListener("click",this.handleIncrement),n&&n.addEventListener("input",this.handleInputChange)}removeEventListeners(){const t=this.querySelector("[data-action-decrement]"),e=this.querySelector("[data-action-increment]"),n=this.querySelector("[data-quantity-modifier-field]");t&&t.removeEventListener("click",this.handleDecrement),e&&e.removeEventListener("click",this.handleIncrement),n&&n.removeEventListener("input",this.handleInputChange)}handleDecrement(){const t=this.value,e=Math.max(t-1,this.min);this.updateValue(e)}handleIncrement(){const t=this.value,e=Math.min(t+1,this.max);this.updateValue(e)}handleInputChange(t){const e=parseInt(t.target.value);if(!isNaN(e)){const t=Math.max(this.min,Math.min(e,this.max));this.updateValue(t)}}updateValue(t){t!==this.value&&(this.value=t,this.updateInput(),this.dispatchChangeEvent(t))}updateInput(){const t=this.querySelector("[data-quantity-modifier-field]");t&&(t.value=this.value,t.min=this.min,t.max=this.max)}dispatchChangeEvent(t){this.dispatchEvent(new CustomEvent("quantity-modifier:change",{detail:{value:t},bubbles:!0}))}}customElements.define("quantity-modifier",QuantityModifier);class CartItem extends HTMLElement{static#n=new Map;static#r=null;#i="ready";#a=!1;#s=!1;#o={};#c=null;#l=null;static setTemplate(t,e){if("string"!=typeof t)throw new Error("Template name must be a string");if("function"!=typeof e)throw new Error("Template must be a function");CartItem.#n.set(t,e)}static setProcessingTemplate(t){if("function"!=typeof t)throw new Error("Processing template must be a function");CartItem.#r=t}static createAnimated(t,e){return new CartItem(t,e,{animate:!0})}static get observedAttributes(){return["state","key"]}attributeChangedCallback(t,e,n){e!==n&&"state"===t&&(this.#i=n||"ready")}constructor(t=null,e=null,n={}){super(),this.#c=t,this.#l=e;const r=n.animate||this.hasAttribute("animate-in");this.#i=t&&r?"appearing":this.getAttribute("state")||"ready",this.#o={click:this.#d.bind(this),change:this.#h.bind(this),transitionEnd:this.#u.bind(this)}}connectedCallback(){this.#c&&this.#m(),this.content=this.querySelector("cart-item-content"),this.processing=this.querySelector("cart-item-processing"),this.#p(),this.#g(),"appearing"===this.#i&&(this.setAttribute("state","appearing"),this.#s=!0,requestAnimationFrame(()=>{const t=this.scrollHeight;this.style.height=`${t}px`,requestAnimationFrame(()=>{this.setState("ready")})}))}disconnectedCallback(){this.#f()}#g(){this.addEventListener("click",this.#o.click),this.addEventListener("change",this.#o.change),this.addEventListener("quantity-modifier:change",this.#o.change),this.addEventListener("transitionend",this.#o.transitionEnd)}#f(){this.removeEventListener("click",this.#o.click),this.removeEventListener("change",this.#o.change),this.removeEventListener("quantity-modifier:change",this.#o.change),this.removeEventListener("transitionend",this.#o.transitionEnd)}get state(){return this.#i}get cartKey(){return this.getAttribute("key")}#d(t){t.target.closest("[data-action-remove-item]")&&(t.preventDefault(),this.#y())}#h(t){if("quantity-modifier:change"===t.type)return void this.#v(t.detail.value);const e=t.target.closest("[data-cart-quantity]");e&&this.#v(e.value)}#u(t){"height"===t.propertyName&&this.#a?this.remove():"height"===t.propertyName&&this.#s&&(this.style.height="",this.#s=!1)}#y(){this.dispatchEvent(new CustomEvent("cart-item:remove",{bubbles:!0,detail:{cartKey:this.cartKey,element:this}}))}#v(t){this.dispatchEvent(new CustomEvent("cart-item:quantity-change",{bubbles:!0,detail:{cartKey:this.cartKey,quantity:parseInt(t),element:this}}))}#m(){if(!this.#c||0===CartItem.#n.size)return void console.log("no item data or no template",this.#c,CartItem.#n);const t=this.#c.key||this.#c.id;t&&this.setAttribute("key",t);const e=this.#c.properties?._cart_template||"default",n=CartItem.#n.get(e)||CartItem.#n.get("default");if(!n)return void console.warn(`Cart item template '${e}' not found and no default template set`);const r=n(this.#c,this.#l),i=CartItem.#r?CartItem.#r():'<div class="cart-item-loader"></div>';this.innerHTML=`\n <cart-item-content>\n ${r}\n </cart-item-content>\n <cart-item-processing>\n ${i}\n </cart-item-processing>\n `}setData(t,e=null){this.#c=t,e&&(this.#l=e),this.#m(),this.content=this.querySelector("cart-item-content"),this.processing=this.querySelector("cart-item-processing"),this.#p()}#p(){if(!this.#c)return;const t=this.querySelectorAll("[data-content-line-price]"),e=this.#E(this.#c.line_price||0);t.forEach(t=>{t.textContent=e})}#E(t){return"number"!=typeof t?"$0.00":`$${(t/100).toFixed(2)}`}get itemData(){return this.#c}setState(t){["ready","processing","destroying","appearing"].includes(t)&&this.setAttribute("state",t)}destroyYourself(){if(this.#a)return;this.#a=!0;const t=this.offsetHeight;this.setState("destroying"),requestAnimationFrame(()=>{this.style.height=`${t}px`;const e=getComputedStyle(this),n=e.getPropertyValue("--cart-item-destroying-duration")?.trim()||"400ms";this.style.transition=`height ${n} ease`,this.style.height="0px",setTimeout(()=>{this.remove()},600)})}}class CartItemContent extends HTMLElement{constructor(){super()}}class CartItemProcessing extends HTMLElement{constructor(){super()}}customElements.get("cart-item")||customElements.define("cart-item",CartItem),customElements.get("cart-item-content")||customElements.define("cart-item-content",CartItemContent),customElements.get("cart-item-processing")||customElements.define("cart-item-processing",CartItemProcessing);const e=t=>Array.from(t.querySelectorAll('summary, a[href], button:not(:disabled), [tabindex]:not([tabindex^="-"]):not(focus-trap-start):not(focus-trap-end), [draggable], area, input:not([type=hidden]):not(:disabled), select:not(:disabled), textarea:not(:disabled), object, iframe'));class FocusTrap extends HTMLElement{static styleInjected=!1;constructor(){super(),this.trapStart=null,this.trapEnd=null,FocusTrap.styleInjected||(this.injectStyles(),FocusTrap.styleInjected=!0)}injectStyles(){const t=document.createElement("style");t.textContent="\n focus-trap-start,\n focus-trap-end {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0, 0, 0, 0);\n overflow: hidden;\n white-space: nowrap;\n }\n ",document.head.appendChild(t)}connectedCallback(){this.setupTrap(),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("keydown",this.handleKeyDown)}setupTrap(){0!==e(this).length&&(this.trapStart=document.createElement("focus-trap-start"),this.trapEnd=document.createElement("focus-trap-end"),this.prepend(this.trapStart),this.append(this.trapEnd))}handleKeyDown=t=>{"Escape"===t.key&&(t.preventDefault(),this.exitTrap())};exitTrap(){const t=this.closest('[aria-hidden="false"]');if(!t)return;t.setAttribute("aria-hidden","true");const e=document.querySelector(`[aria-expanded="true"][aria-controls="${t.id}"]`);e&&(e.setAttribute("aria-expanded","false"),e.focus())}}class FocusTrapStart extends HTMLElement{connectedCallback(){this.setAttribute("tabindex","0"),this.addEventListener("focus",this.handleFocus)}disconnectedCallback(){this.removeEventListener("focus",this.handleFocus)}handleFocus=t=>{const n=this.closest("focus-trap"),r=e(n);if(0===r.length)return;const i=r[0],a=r[r.length-1];t.relatedTarget===i?a.focus():i.focus()}}class FocusTrapEnd extends HTMLElement{connectedCallback(){this.setAttribute("tabindex","0"),this.addEventListener("focus",this.handleFocus)}disconnectedCallback(){this.removeEventListener("focus",this.handleFocus)}handleFocus=()=>{this.closest("focus-trap").querySelector("focus-trap-start").focus()}}customElements.get("focus-trap")||customElements.define("focus-trap",FocusTrap),customElements.get("focus-trap-start")||customElements.define("focus-trap-start",FocusTrapStart),customElements.get("focus-trap-end")||customElements.define("focus-trap-end",FocusTrapEnd);class EventEmitter{#C;constructor(){this.#C=new Map}on(t,e){if("function"!=typeof e)throw new TypeError("Listener must be a function");const n=this.#C.get(t)||[];return n.includes(e)||n.push(e),this.#C.set(t,n),this}off(t,e){const n=this.#C.get(t);if(!n)return this;const r=n.indexOf(e);return-1!==r&&(n.splice(r,1),0===n.length?this.#C.delete(t):this.#C.set(t,n)),this}emit(t,...e){const n=this.#C.get(t);if(!n||0===n.length)return!1;for(let r=0,i=n.length;r<i;++r)try{n[r].apply(this,e)}catch(e){console.error(`Error in listener for event '${t}':`,e)}return!0}removeAllListeners(t){return t?this.#C.delete(t):this.#C.clear(),this}}class CartDialog extends HTMLElement{#u;#b=null;#I;#S=!0;disconnectedCallback(){const t=this;t.contentPanel&&t.contentPanel.removeEventListener("transitionend",t.#u),document.body.classList.remove("overflow-hidden"),this.#L(),this.#f()}#x(){document.body.classList.add("overflow-hidden")}#L(){document.body.classList.remove("overflow-hidden")}constructor(){super();const t=this;t.id=t.getAttribute("id"),t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-hidden","true"),t.triggerEl=null,t.#I=new EventEmitter,t.#u=e=>{"opacity"===e.propertyName&&"true"===t.getAttribute("aria-hidden")&&(t.contentPanel.classList.add("hidden"),t.#q("cart-dialog:afterHide",{triggerElement:t.triggerEl}))}}connectedCallback(){const t=this;if(t.contentPanel=t.querySelector("cart-panel"),t.contentPanel){if(t.focusTrap=t.contentPanel.querySelector("focus-trap"),!t.focusTrap){t.focusTrap=document.createElement("focus-trap");Array.from(t.contentPanel.childNodes).forEach(e=>t.focusTrap.appendChild(e)),t.contentPanel.appendChild(t.focusTrap)}if(!t.getAttribute("aria-labelledby")){const e=t.querySelector("h1, h2, h3");e&&!e.id&&(e.id=`${t.id}-title`),e?.id&&t.setAttribute("aria-labelledby",e.id)}t.querySelector("cart-overlay")||t.prepend(document.createElement("cart-overlay")),t.#g(),t.#T(),t.refreshCart()}else console.error("cart-panel element not found inside cart-dialog")}on(t,e){return this.#I.on(t,e),this}off(t,e){return this.#I.off(t,e),this}#q(t,e=null){this.#I.emit(t,e),this.dispatchEvent(new CustomEvent(t,{detail:e,bubbles:!0}))}#g(){const t=this;document.addEventListener("click",e=>{const n=e.target.closest(`[aria-controls="${t.id}"]`);n&&("true"===n.getAttribute("data-prevent-default")&&e.preventDefault(),t.show(n))}),t.addEventListener("click",e=>{e.target.closest("[data-action-hide-cart]")&&t.hide()}),t.addEventListener("cart-item:remove",e=>{t.#w(e)}),t.addEventListener("cart-item:quantity-change",e=>{t.#A(e)}),t.contentPanel.addEventListener("transitionend",t.#u)}#f(){const t=this;t.contentPanel&&t.contentPanel.removeEventListener("transitionend",t.#u)}#T(){this.addEventListener("keydown",t=>{"Escape"===t.key&&this.hide()})}#w(t){const{cartKey:e,element:n}=t.detail;n.setState("processing"),this.updateCartItem(e,0).then(t=>{if(t&&!t.error){this.#b=t,this.#k(t),this.#D(t);const e=this.#P(t);this.#q("cart-dialog:updated",{cart:e}),this.#q("cart-dialog:data-changed",e)}else n.setState("ready"),console.error("Failed to remove cart item:",e)}).catch(t=>{n.setState("ready"),console.error("Error removing cart item:",t)})}#A(t){const{cartKey:e,quantity:n,element:r}=t.detail;r.setState("processing"),this.updateCartItem(e,n).then(t=>{if(t&&!t.error){this.#b=t,this.#k(t),this.#D(t),r.setState("ready");const e=this.#P(t);this.#q("cart-dialog:updated",{cart:e}),this.#q("cart-dialog:data-changed",e)}else r.setState("ready"),console.error("Failed to update cart item quantity:",e,n)}).catch(t=>{r.setState("ready"),console.error("Error updating cart item quantity:",t)})}#F(t){if(!t)return;const e=this.#M(t).reduce((t,e)=>t+e.quantity,0);document.querySelectorAll("[data-content-cart-count]").forEach(t=>{t.textContent=e})}#H(t){if(!t)return;const e=t.items.filter(t=>{const e=t.properties?._ignore_price_in_subtotal;return!e}).reduce((t,e)=>t+(e.line_price||0),0);document.querySelectorAll("[data-content-cart-subtotal]").forEach(t=>{const n=(e/100).toFixed(2);t.textContent=`$${n}`})}#D(t=null){const e=t||this.#b;if(!e)return;const n=this.querySelector("[data-cart-has-items]"),r=this.querySelector("[data-cart-is-empty]"),i=this.querySelector("[data-content-cart-items]");if(!n||!r||!i)return void console.warn("Cart sections not found. Expected [data-cart-has-items], [data-cart-is-empty], and [data-content-cart-items]");this.#M(e).length>0?(n.style.display="",r.style.display="none"):(n.style.display="none",r.style.display=""),this.#F(e),this.#H(e)}getCart(){return fetch("/cart.json",{crossDomain:!0,credentials:"same-origin"}).then(t=>{if(!t.ok)throw Error(t.statusText);return t.json()}).catch(t=>(console.error("Error fetching cart:",t),{error:!0,message:t.message}))}updateCartItem(t,e){return fetch("/cart/change.json",{crossDomain:!0,method:"POST",credentials:"same-origin",body:JSON.stringify({id:t,quantity:e}),headers:{"Content-Type":"application/json"}}).then(t=>{if(!t.ok)throw Error(t.statusText);return t.json()}).catch(t=>(console.error("Error updating cart item:",t),{error:!0,message:t.message}))}refreshCart(t=null){if(t&&!t.error){this.#b=t,this.#k(t),this.#D(t);const e=this.#P(t);return this.#q("cart-dialog:refreshed",{cart:e}),this.#q("cart-dialog:data-changed",e),Promise.resolve(t)}return this.getCart().then(t=>{if(t&&!t.error){this.#b=t,this.#k(t),this.#D(t);const e=this.#P(t);this.#q("cart-dialog:refreshed",{cart:e}),this.#q("cart-dialog:data-changed",e)}else console.warn("Cart data has error or is null:",t);return t})}#j(t,e){Array.from(t.querySelectorAll("cart-item")).filter(t=>!e.has(t.getAttribute("key"))).forEach(t=>{console.log("destroy yourself",t),t.destroyYourself()})}#$(t,e,n){setTimeout(()=>{e.forEach(e=>{const r=CartItem.createAnimated(e),i=n.indexOf(e.key||e.id);if(0===i)t.insertBefore(r,t.firstChild);else{let e=null;for(let r=i-1;r>=0;r--){const i=n[r],a=t.querySelector(`cart-item[key="${i}"]`);if(a){e=a;break}}e?e.insertAdjacentElement("afterend",r):t.appendChild(r)}})},100)}#M(t){return t&&t.items?t.items.filter(t=>{const e=t.properties?._hide_in_cart;return!e}):[]}#P(t){if(!t)return t;const e=this.#M(t),n=e.reduce((t,e)=>t+e.quantity,0),r=e.reduce((t,e)=>t+(e.line_price||0),0);return{...t,calculated_count:n,calculated_subtotal:r}}#k(t){const e=this.querySelector("[data-content-cart-items]");if(!e||!t||!t.items)return void console.warn("Cannot render cart items:",{itemsContainer:!!e,cartData:!!t,items:t?.items?.length});const n=this.#M(t);if(this.#S)return e.innerHTML="",n.forEach(t=>{const n=new CartItem(t);e.appendChild(n)}),void(this.#S=!1);const r=Array.from(e.querySelectorAll("cart-item")),i=new Set(r.map(t=>t.getAttribute("key"))),a=n.map(t=>t.key||t.id),s=new Set(a);this.#j(e,s);const o=n.filter(t=>!i.has(t.key||t.id));this.#$(e,o,a)}setCartItemTemplate(t,e){CartItem.setTemplate(t,e)}setCartItemProcessingTemplate(t){CartItem.setProcessingTemplate(t)}show(t=null,e){const n=this;n.triggerEl=t||!1,n.#x(),n.contentPanel.classList.remove("hidden"),requestAnimationFrame(()=>{n.setAttribute("aria-hidden","false"),n.triggerEl&&n.triggerEl.setAttribute("aria-expanded","true");const t=n.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');t&&requestAnimationFrame(()=>{t.focus()}),n.refreshCart(e),n.#q("cart-dialog:show",{triggerElement:n.triggerEl})})}hide(){const t=this;if(t.triggerEl)t.triggerEl.focus(),t.triggerEl.setAttribute("aria-expanded","false");else{const e=document.activeElement;e&&t.contains(e)&&e.blur()}requestAnimationFrame(()=>{t.setAttribute("aria-hidden","true"),t.#q("cart-dialog:hide",{triggerElement:t.triggerEl}),t.#L()})}}class CartOverlay extends HTMLElement{constructor(){super(),this.setAttribute("tabindex","-1"),this.setAttribute("aria-hidden","true"),this.cartDialog=this.closest("cart-dialog"),this.#g()}#g(){this.addEventListener("click",()=>{this.cartDialog.hide()})}}class CartPanel extends HTMLElement{constructor(){super(),this.setAttribute("role","document")}}customElements.get("cart-dialog")||customElements.define("cart-dialog",CartDialog),customElements.get("cart-overlay")||customElements.define("cart-overlay",CartOverlay),customElements.get("cart-panel")||customElements.define("cart-panel",CartPanel),"undefined"!=typeof window&&(window.CartItem=CartItem),t.CartDialog=CartDialog,t.CartItem=CartItem,t.CartOverlay=CartOverlay,t.CartPanel=CartPanel,t.default=CartDialog,Object.defineProperty(t,"__esModule",{value:!0})});
@@ -85,8 +85,7 @@ cart-panel {
85
85
  top: 0;
86
86
  right: 0;
87
87
  width: var(--cart-panel-width);
88
- height: 100vh;
89
- opacity: 0;
88
+ height: 100dvh;
90
89
  transform: translateX(100%);
91
90
  pointer-events: none;
92
91
  z-index: var(--cart-panel-z-index);
@@ -94,9 +93,7 @@ cart-panel {
94
93
  box-shadow: var(--cart-panel-shadow);
95
94
  border-radius: var(--cart-panel-border-radius);
96
95
  overflow: hidden;
97
- transition:
98
- opacity var(--cart-transition-duration) var(--cart-transition-timing),
99
- transform var(--cart-transition-duration) var(--cart-transition-timing);
96
+ transition: transform var(--cart-transition-duration) var(--cart-transition-timing);
100
97
 
101
98
  // When explicitly hidden, remove from layout
102
99
  &.hidden {
@@ -107,11 +104,4 @@ cart-panel {
107
104
  // Body scroll lock when cart is open
108
105
  body.overflow-hidden {
109
106
  overflow: hidden;
110
- position: fixed;
111
- width: 100%;
112
- height: 100%;
113
- left: 0;
114
- right: 0;
115
- margin: 0;
116
- // The top property will be set dynamically by the component
117
107
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magic-spells/cart-panel",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Accessible modal shopping cart dialog web component with Shopify integration, focus management, and smooth animations.",
5
5
  "author": "Cory Schulz",
6
6
  "license": "MIT",
@@ -75,8 +75,8 @@
75
75
  "sass": "^1.89.2"
76
76
  },
77
77
  "dependencies": {
78
- "@magic-spells/cart-item": "^0.2.1",
78
+ "@magic-spells/cart-item": "^0.4.0",
79
79
  "@magic-spells/event-emitter": "^0.1.0",
80
- "@magic-spells/focus-trap": "^1.0.6"
80
+ "@magic-spells/focus-trap": "^1.0.7"
81
81
  }
82
82
  }