@magic-spells/dialog-panel 1.1.0 → 1.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.
@@ -14,6 +14,7 @@
14
14
  * @property {HTMLDialogElement} dialog - Reference to inner <dialog> element
15
15
  * @property {boolean} isOpen - True if state is 'showing' or 'shown'
16
16
  * @property {HTMLElement|null} triggerElement - Element that triggered current action
17
+ * @property {Object|null} morphEngine - Optional duck-typed morph transition engine
17
18
  *
18
19
  * @fires beforeShow - Fired before showing starts (cancelable)
19
20
  * @fires shown - Fired after show animation completes
@@ -26,12 +27,19 @@
26
27
  #triggerElement = null;
27
28
  #dialog = null;
28
29
  #result = null;
30
+ #hideTriggerElement = null;
31
+ #morphEngine = null;
32
+ #morphListenersAttached = false;
29
33
 
30
34
  // Event handler references for cleanup
31
35
  #handlers = {
32
36
  click: null,
33
37
  dialogClick: null,
34
38
  cancel: null,
39
+ close: null,
40
+ morphShown: null,
41
+ morphHidden: null,
42
+ morphStop: null,
35
43
  };
36
44
 
37
45
  // Animation cleanup references
@@ -65,6 +73,7 @@
65
73
 
66
74
  // Bind event handlers
67
75
  _.#bindEvents();
76
+ _.#wireMorphEngine();
68
77
  }
69
78
 
70
79
  disconnectedCallback() {
@@ -79,6 +88,7 @@
79
88
  clearTimeout(_.#pendingTimeout);
80
89
  _.#pendingTimeout = null;
81
90
  }
91
+ _.#unwireMorphEngine();
82
92
 
83
93
  // Clean up event listeners
84
94
  if (_.#handlers.click) {
@@ -94,6 +104,9 @@
94
104
  if (_.#handlers.cancel) {
95
105
  _.#dialog.removeEventListener('cancel', _.#handlers.cancel);
96
106
  }
107
+ if (_.#handlers.close) {
108
+ _.#dialog.removeEventListener('close', _.#handlers.close);
109
+ }
97
110
  }
98
111
  }
99
112
 
@@ -137,6 +150,105 @@
137
150
  _.hide();
138
151
  };
139
152
  _.#dialog.addEventListener('cancel', _.#handlers.cancel);
153
+
154
+ // Cover browser force-close paths that bypass the cancel event
155
+ _.#handlers.close = () => {
156
+ if (
157
+ _.#morphEngine?.state === 'shown' &&
158
+ _.#state === 'shown' &&
159
+ !_.#dialog.open
160
+ ) {
161
+ _.hide();
162
+ }
163
+ };
164
+ _.#dialog.addEventListener('close', _.#handlers.close);
165
+ }
166
+
167
+ /**
168
+ * Wire morph engine lifecycle listeners
169
+ * @private
170
+ */
171
+ #wireMorphEngine() {
172
+ const _ = this;
173
+
174
+ if (!_.#morphEngine || _.#morphListenersAttached) return;
175
+
176
+ if (!_.#handlers.morphShown) {
177
+ _.#handlers.morphShown = _.#handleMorphShown.bind(_);
178
+ _.#handlers.morphHidden = _.#handleMorphHidden.bind(_);
179
+ _.#handlers.morphStop = _.#handleMorphStop.bind(_);
180
+ }
181
+
182
+ _.#morphEngine.on('shown', _.#handlers.morphShown);
183
+ _.#morphEngine.on('hidden', _.#handlers.morphHidden);
184
+ _.#morphEngine.on('stop', _.#handlers.morphStop);
185
+ _.#morphListenersAttached = true;
186
+ }
187
+
188
+ /**
189
+ * Unwire morph engine lifecycle listeners
190
+ * @private
191
+ */
192
+ #unwireMorphEngine() {
193
+ const _ = this;
194
+
195
+ if (!_.#morphEngine || !_.#morphListenersAttached) return;
196
+
197
+ _.#morphEngine.off('shown', _.#handlers.morphShown);
198
+ _.#morphEngine.off('hidden', _.#handlers.morphHidden);
199
+ _.#morphEngine.off('stop', _.#handlers.morphStop);
200
+ _.#morphListenersAttached = false;
201
+ }
202
+
203
+ /**
204
+ * Promote the settled morph target into the dialog top layer
205
+ * @private
206
+ */
207
+ #handleMorphShown() {
208
+ const _ = this;
209
+
210
+ if (!_.#dialog.open) _.#dialog.showModal();
211
+ _.#setState('shown');
212
+ _.#emit('shown');
213
+ }
214
+
215
+ /**
216
+ * Finalize a settled morph hide
217
+ * @private
218
+ */
219
+ #handleMorphHidden() {
220
+ this.#finalizeMorphHide();
221
+ }
222
+
223
+ /**
224
+ * Finalize an interrupted morph as hidden
225
+ * @private
226
+ */
227
+ #handleMorphStop() {
228
+ this.#finalizeMorphHide();
229
+ }
230
+
231
+ /**
232
+ * Restore the component's hidden state after a morph ends
233
+ * @private
234
+ */
235
+ #finalizeMorphHide() {
236
+ const _ = this;
237
+
238
+ if (_.#dialog.open) _.#dialog.close();
239
+ _.#setState('hidden');
240
+ _.#emit('hidden', {
241
+ result: _.#result,
242
+ triggerElement: _.#hideTriggerElement,
243
+ });
244
+
245
+ // Return focus to trigger element
246
+ if (_.#triggerElement) _.#triggerElement.focus();
247
+
248
+ // Clean up
249
+ _.#triggerElement = null;
250
+ _.#hideTriggerElement = null;
251
+ _.#result = null;
140
252
  }
141
253
 
142
254
  /**
@@ -150,17 +262,36 @@
150
262
  // Check if already showing/shown
151
263
  if (_.#state === 'showing' || _.#state === 'shown') return true;
152
264
 
153
- // If currently hiding, ignore (let hide complete first)
154
- if (_.#state === 'hiding') return false;
265
+ const reversingMorph =
266
+ _.#state === 'hiding' && _.#morphEngine?.state === 'hiding';
267
+
268
+ // CSS transitions cannot reverse while hiding
269
+ if (_.#state === 'hiding' && !reversingMorph) return false;
155
270
 
156
271
  // Store trigger element for focus return later
157
- _.#triggerElement = triggerEl || null;
272
+ if (!reversingMorph) _.#triggerElement = triggerEl || null;
158
273
 
159
274
  // Fire beforeShow (cancelable)
160
275
  if (!_.#emit('beforeShow', { cancelable: true })) return false;
161
276
 
162
- // Set state to 'showing' and open native dialog
277
+ if (reversingMorph) {
278
+ _.#hideTriggerElement = null;
279
+ _.#result = null;
280
+ }
281
+
282
+ // Set state to 'showing'
163
283
  _.#setState('showing');
284
+
285
+ if (_.#morphEngine && (triggerEl || reversingMorph)) {
286
+ _.#morphEngine.show({
287
+ from: _.#triggerElement,
288
+ to: _.#dialog,
289
+ display: _.getAttribute('morph-display') || 'block',
290
+ });
291
+ return true;
292
+ }
293
+
294
+ // Open native dialog for the CSS transition path
164
295
  _.#dialog.showModal();
165
296
 
166
297
  // Double RAF ensures browser has painted the 'showing' state
@@ -191,8 +322,11 @@
191
322
  // Check if already hiding/hidden
192
323
  if (_.#state === 'hiding' || _.#state === 'hidden') return true;
193
324
 
194
- // If currently showing, ignore (let show complete first)
195
- if (_.#state === 'showing') return false;
325
+ const reversingMorph =
326
+ _.#state === 'showing' && _.#morphEngine?.state === 'showing';
327
+
328
+ // CSS transitions cannot reverse while showing
329
+ if (_.#state === 'showing' && !reversingMorph) return false;
196
330
 
197
331
  // Capture result from trigger element
198
332
  _.#result = triggerEl?.dataset?.result ?? null;
@@ -208,6 +342,14 @@
208
342
  return false;
209
343
  }
210
344
 
345
+ if (reversingMorph || _.#morphEngine?.state === 'shown') {
346
+ _.#hideTriggerElement = triggerEl;
347
+ if (_.#dialog.open) _.#dialog.close();
348
+ _.#morphEngine.hide();
349
+ _.#setState('hiding');
350
+ return true;
351
+ }
352
+
211
353
  // Set state to 'hiding' - this triggers CSS exit animation
212
354
  _.#setState('hiding');
213
355
 
@@ -239,15 +381,16 @@
239
381
  #waitForTransition(callback) {
240
382
  const _ = this;
241
383
  let called = false;
384
+ let timerId = null;
242
385
 
243
386
  const done = () => {
244
387
  if (called) return;
245
388
  called = true;
246
389
  _.#dialog.removeEventListener('transitionend', onTransitionEnd);
247
- if (_.#pendingTimeout) {
248
- clearTimeout(_.#pendingTimeout);
249
- _.#pendingTimeout = null;
250
- }
390
+ // clear only our own timer — clearing the shared field would let an
391
+ // earlier, still-pending wait cancel a later wait's fallback
392
+ clearTimeout(timerId);
393
+ if (_.#pendingTimeout === timerId) _.#pendingTimeout = null;
251
394
  callback();
252
395
  };
253
396
 
@@ -257,10 +400,8 @@
257
400
 
258
401
  _.#dialog.addEventListener('transitionend', onTransitionEnd);
259
402
 
260
- _.#pendingTimeout = setTimeout(
261
- done,
262
- DialogPanel.TRANSITION_FALLBACK_TIMEOUT
263
- );
403
+ timerId = setTimeout(done, DialogPanel.TRANSITION_FALLBACK_TIMEOUT);
404
+ _.#pendingTimeout = timerId;
264
405
  }
265
406
 
266
407
  /**
@@ -299,6 +440,34 @@
299
440
  return _.dispatchEvent(event);
300
441
  }
301
442
 
443
+ /**
444
+ * Optional morph transition transport
445
+ * @returns {Object|null} The attached morph engine
446
+ */
447
+ get morphEngine() {
448
+ return this.#morphEngine;
449
+ }
450
+
451
+ /**
452
+ * Attach or remove a duck-typed morph transition engine
453
+ * @param {Object|null} engine - Engine with show, hide, state, on, and off
454
+ */
455
+ set morphEngine(engine) {
456
+ const _ = this;
457
+
458
+ if (_.#morphEngine === engine) return;
459
+
460
+ _.#unwireMorphEngine();
461
+ _.#morphEngine = engine || null;
462
+
463
+ if (_.#morphEngine) {
464
+ _.setAttribute('morph', '');
465
+ _.#wireMorphEngine();
466
+ } else {
467
+ _.removeAttribute('morph');
468
+ }
469
+ }
470
+
302
471
  // Read-only properties
303
472
  get state() {
304
473
  return this.#state;
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-panel.js","sources":["../src/dialog-panel.js"],"sourcesContent":["import './dialog-panel.css';\n\n/**\n * DialogPanel - A lightweight web component wrapper for native <dialog> elements\n * with state-driven animations.\n *\n * @extends HTMLElement\n *\n * @property {string} state - Current state: 'hidden' | 'showing' | 'shown' | 'hiding'\n * @property {HTMLDialogElement} dialog - Reference to inner <dialog> element\n * @property {boolean} isOpen - True if state is 'showing' or 'shown'\n * @property {HTMLElement|null} triggerElement - Element that triggered current action\n *\n * @fires beforeShow - Fired before showing starts (cancelable)\n * @fires shown - Fired after show animation completes\n * @fires beforeHide - Fired before hiding starts (cancelable)\n * @fires hidden - Fired after hide animation completes\n */\nclass DialogPanel extends HTMLElement {\n\t// Private fields\n\t#state = 'hidden';\n\t#triggerElement = null;\n\t#dialog = null;\n\t#result = null;\n\n\t// Event handler references for cleanup\n\t#handlers = {\n\t\tclick: null,\n\t\tdialogClick: null,\n\t\tcancel: null,\n\t};\n\n\t// Animation cleanup references\n\t#pendingRAF = null;\n\t#pendingTimeout = null;\n\n\t// Fallback timeout for transitionend (in ms)\n\tstatic TRANSITION_FALLBACK_TIMEOUT = 700;\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Find inner dialog element\n\t\t_.#dialog = _.querySelector('dialog');\n\n\t\tif (!_.#dialog) {\n\t\t\tconsole.warn(\n\t\t\t\t'DialogPanel: No <dialog> element found inside <dialog-panel>'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Auto-create dialog-backdrop if not present\n\t\tif (!_.querySelector('dialog-backdrop')) {\n\t\t\tconst backdrop = document.createElement('dialog-backdrop');\n\t\t\t_.insertBefore(backdrop, _.firstChild);\n\t\t}\n\n\t\t// Set initial state attribute\n\t\t_.#setState('hidden');\n\n\t\t// Bind event handlers\n\t\t_.#bindEvents();\n\t}\n\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Cancel pending animations\n\t\tif (_.#pendingRAF) {\n\t\t\tcancelAnimationFrame(_.#pendingRAF);\n\t\t\t_.#pendingRAF = null;\n\t\t}\n\t\tif (_.#pendingTimeout) {\n\t\t\tclearTimeout(_.#pendingTimeout);\n\t\t\t_.#pendingTimeout = null;\n\t\t}\n\n\t\t// Clean up event listeners\n\t\tif (_.#handlers.click) {\n\t\t\t_.removeEventListener('click', _.#handlers.click);\n\t\t}\n\t\tif (_.#dialog) {\n\t\t\tif (_.#handlers.dialogClick) {\n\t\t\t\t_.#dialog.removeEventListener(\n\t\t\t\t\t'click',\n\t\t\t\t\t_.#handlers.dialogClick\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (_.#handlers.cancel) {\n\t\t\t\t_.#dialog.removeEventListener('cancel', _.#handlers.cancel);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Bind event listeners for close buttons, backdrop, and escape key\n\t * @private\n\t */\n\t#bindEvents() {\n\t\tconst _ = this;\n\n\t\t// Handle close buttons with data-action-hide-dialog\n\t\t_.#handlers.click = (e) => {\n\t\t\tconst trigger = e.target.closest('[data-action-hide-dialog]');\n\t\t\tif (trigger) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t_.hide(trigger);\n\t\t\t}\n\t\t};\n\t\t_.addEventListener('click', _.#handlers.click);\n\n\t\t// Handle backdrop click - detect clicks outside dialog bounds\n\t\t// This works because clicks on ::backdrop still fire on the dialog element\n\t\t_.#handlers.dialogClick = (e) => {\n\t\t\tconst rect = _.#dialog.getBoundingClientRect();\n\t\t\tconst clickedOutside =\n\t\t\t\te.clientX < rect.left ||\n\t\t\t\te.clientX > rect.right ||\n\t\t\t\te.clientY < rect.top ||\n\t\t\t\te.clientY > rect.bottom;\n\t\t\tif (clickedOutside) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t_.hide();\n\t\t\t}\n\t\t};\n\t\t_.#dialog.addEventListener('click', _.#handlers.dialogClick);\n\n\t\t// Handle escape key - intercept native cancel and animate close\n\t\t_.#handlers.cancel = (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\t_.hide();\n\t\t};\n\t\t_.#dialog.addEventListener('cancel', _.#handlers.cancel);\n\t}\n\n\t/**\n\t * Show the dialog with animation\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the show\n\t * @returns {boolean} False if show was prevented via beforeShow event\n\t */\n\tshow(triggerEl = null) {\n\t\tconst _ = this;\n\n\t\t// Check if already showing/shown\n\t\tif (_.#state === 'showing' || _.#state === 'shown') return true;\n\n\t\t// If currently hiding, ignore (let hide complete first)\n\t\tif (_.#state === 'hiding') return false;\n\n\t\t// Store trigger element for focus return later\n\t\t_.#triggerElement = triggerEl || null;\n\n\t\t// Fire beforeShow (cancelable)\n\t\tif (!_.#emit('beforeShow', { cancelable: true })) return false;\n\n\t\t// Set state to 'showing' and open native dialog\n\t\t_.#setState('showing');\n\t\t_.#dialog.showModal();\n\n\t\t// Double RAF ensures browser has painted the 'showing' state\n\t\t// before we transition to 'shown'\n\t\t_.#pendingRAF = requestAnimationFrame(() => {\n\t\t\t_.#pendingRAF = requestAnimationFrame(() => {\n\t\t\t\t_.#pendingRAF = null;\n\t\t\t\t_.#setState('shown');\n\n\t\t\t\t// Wait for transition to complete before firing 'shown' event\n\t\t\t\t_.#waitForTransition(() => {\n\t\t\t\t\t_.#emit('shown');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Hide the dialog with animation\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the hide\n\t * @returns {boolean} False if hide was prevented via beforeHide event\n\t */\n\thide(triggerEl = null) {\n\t\tconst _ = this;\n\n\t\t// Check if already hiding/hidden\n\t\tif (_.#state === 'hiding' || _.#state === 'hidden') return true;\n\n\t\t// If currently showing, ignore (let show complete first)\n\t\tif (_.#state === 'showing') return false;\n\n\t\t// Capture result from trigger element\n\t\t_.#result = triggerEl?.dataset?.result ?? null;\n\n\t\t// Fire beforeHide (cancelable)\n\t\tif (\n\t\t\t!_.#emit('beforeHide', {\n\t\t\t\tcancelable: true,\n\t\t\t\tresult: _.#result,\n\t\t\t\ttriggerElement: triggerEl,\n\t\t\t})\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Set state to 'hiding' - this triggers CSS exit animation\n\t\t_.#setState('hiding');\n\n\t\t// Wait for transition to complete\n\t\t_.#waitForTransition(() => {\n\t\t\t_.#dialog.close();\n\t\t\t_.#setState('hidden');\n\t\t\t_.#emit('hidden', {\n\t\t\t\tresult: _.#result,\n\t\t\t\ttriggerElement: triggerEl,\n\t\t\t});\n\n\t\t\t// Return focus to trigger element\n\t\t\tif (_.#triggerElement) _.#triggerElement.focus();\n\n\t\t\t// Clean up\n\t\t\t_.#triggerElement = null;\n\t\t\t_.#result = null;\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Wait for CSS transition to complete with fallback timeout\n\t * @param {Function} callback - Called when transition completes\n\t * @private\n\t */\n\t#waitForTransition(callback) {\n\t\tconst _ = this;\n\t\tlet called = false;\n\n\t\tconst done = () => {\n\t\t\tif (called) return;\n\t\t\tcalled = true;\n\t\t\t_.#dialog.removeEventListener('transitionend', onTransitionEnd);\n\t\t\tif (_.#pendingTimeout) {\n\t\t\t\tclearTimeout(_.#pendingTimeout);\n\t\t\t\t_.#pendingTimeout = null;\n\t\t\t}\n\t\t\tcallback();\n\t\t};\n\n\t\tconst onTransitionEnd = (e) => {\n\t\t\tif (e.target === _.#dialog) done();\n\t\t};\n\n\t\t_.#dialog.addEventListener('transitionend', onTransitionEnd);\n\n\t\t_.#pendingTimeout = setTimeout(\n\t\t\tdone,\n\t\t\tDialogPanel.TRANSITION_FALLBACK_TIMEOUT\n\t\t);\n\t}\n\n\t/**\n\t * Set the component state\n\t * @param {string} newState - The new state\n\t * @private\n\t */\n\t#setState(newState) {\n\t\tthis.#state = newState;\n\t\tthis.setAttribute('state', newState);\n\t}\n\n\t/**\n\t * Emit a custom event\n\t * @param {string} name - Event name\n\t * @param {Object} options - Event options\n\t * @returns {boolean} False if event was cancelled\n\t * @private\n\t */\n\t#emit(name, options = {}) {\n\t\tconst _ = this;\n\t\tconst { cancelable = false, ...detail } = options;\n\n\t\tconst event = new CustomEvent(name, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tcancelable,\n\t\t\tdetail: {\n\t\t\t\ttriggerElement: _.#triggerElement,\n\t\t\t\tresult: _.#result,\n\t\t\t\tstate: _.#state,\n\t\t\t\t...detail,\n\t\t\t},\n\t\t});\n\n\t\treturn _.dispatchEvent(event);\n\t}\n\n\t// Read-only properties\n\tget state() {\n\t\treturn this.#state;\n\t}\n\tget dialog() {\n\t\treturn this.#dialog;\n\t}\n\tget isOpen() {\n\t\treturn this.#state === 'showing' || this.#state === 'shown';\n\t}\n\tget triggerElement() {\n\t\treturn this.#triggerElement;\n\t}\n}\n\n/**\n * DialogBackdrop - A custom backdrop element that animates with the dialog-panel state.\n * Use this instead of native ::backdrop for consistent cross-browser animations.\n *\n * @extends HTMLElement\n */\nclass DialogBackdrop extends HTMLElement {\n\t#panel = null;\n\t#handlers = {\n\t\tclick: null,\n\t};\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Find parent dialog-panel\n\t\t_.#panel = _.closest('dialog-panel');\n\n\t\tif (!_.#panel) {\n\t\t\tconsole.warn(\n\t\t\t\t'DialogBackdrop: Must be inside a <dialog-panel> element'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle click to close\n\t\t_.#handlers.click = () => {\n\t\t\t_.#panel.hide();\n\t\t};\n\t\t_.addEventListener('click', _.#handlers.click);\n\t}\n\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\t\tif (_.#handlers.click) {\n\t\t\t_.removeEventListener('click', _.#handlers.click);\n\t\t}\n\t}\n}\n\n// Register the custom elements\n// Note: dialog-backdrop must be defined BEFORE dialog-panel,\n// because dialog-panel's connectedCallback may create dialog-backdrop elements\nif (!customElements.get('dialog-backdrop')) {\n\tcustomElements.define('dialog-backdrop', DialogBackdrop);\n}\nif (!customElements.get('dialog-panel')) {\n\tcustomElements.define('dialog-panel', DialogPanel);\n}\n\nexport { DialogPanel, DialogBackdrop };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dialog-panel.js","sources":["../src/dialog-panel.js"],"sourcesContent":["import './dialog-panel.css';\n\n/**\n * DialogPanel - A lightweight web component wrapper for native <dialog> elements\n * with state-driven animations.\n *\n * @extends HTMLElement\n *\n * @property {string} state - Current state: 'hidden' | 'showing' | 'shown' | 'hiding'\n * @property {HTMLDialogElement} dialog - Reference to inner <dialog> element\n * @property {boolean} isOpen - True if state is 'showing' or 'shown'\n * @property {HTMLElement|null} triggerElement - Element that triggered current action\n * @property {Object|null} morphEngine - Optional duck-typed morph transition engine\n *\n * @fires beforeShow - Fired before showing starts (cancelable)\n * @fires shown - Fired after show animation completes\n * @fires beforeHide - Fired before hiding starts (cancelable)\n * @fires hidden - Fired after hide animation completes\n */\nclass DialogPanel extends HTMLElement {\n\t// Private fields\n\t#state = 'hidden';\n\t#triggerElement = null;\n\t#dialog = null;\n\t#result = null;\n\t#hideTriggerElement = null;\n\t#morphEngine = null;\n\t#morphListenersAttached = false;\n\n\t// Event handler references for cleanup\n\t#handlers = {\n\t\tclick: null,\n\t\tdialogClick: null,\n\t\tcancel: null,\n\t\tclose: null,\n\t\tmorphShown: null,\n\t\tmorphHidden: null,\n\t\tmorphStop: null,\n\t};\n\n\t// Animation cleanup references\n\t#pendingRAF = null;\n\t#pendingTimeout = null;\n\n\t// Fallback timeout for transitionend (in ms)\n\tstatic TRANSITION_FALLBACK_TIMEOUT = 700;\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Find inner dialog element\n\t\t_.#dialog = _.querySelector('dialog');\n\n\t\tif (!_.#dialog) {\n\t\t\tconsole.warn(\n\t\t\t\t'DialogPanel: No <dialog> element found inside <dialog-panel>'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Auto-create dialog-backdrop if not present\n\t\tif (!_.querySelector('dialog-backdrop')) {\n\t\t\tconst backdrop = document.createElement('dialog-backdrop');\n\t\t\t_.insertBefore(backdrop, _.firstChild);\n\t\t}\n\n\t\t// Set initial state attribute\n\t\t_.#setState('hidden');\n\n\t\t// Bind event handlers\n\t\t_.#bindEvents();\n\t\t_.#wireMorphEngine();\n\t}\n\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Cancel pending animations\n\t\tif (_.#pendingRAF) {\n\t\t\tcancelAnimationFrame(_.#pendingRAF);\n\t\t\t_.#pendingRAF = null;\n\t\t}\n\t\tif (_.#pendingTimeout) {\n\t\t\tclearTimeout(_.#pendingTimeout);\n\t\t\t_.#pendingTimeout = null;\n\t\t}\n\t\t_.#unwireMorphEngine();\n\n\t\t// Clean up event listeners\n\t\tif (_.#handlers.click) {\n\t\t\t_.removeEventListener('click', _.#handlers.click);\n\t\t}\n\t\tif (_.#dialog) {\n\t\t\tif (_.#handlers.dialogClick) {\n\t\t\t\t_.#dialog.removeEventListener(\n\t\t\t\t\t'click',\n\t\t\t\t\t_.#handlers.dialogClick\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (_.#handlers.cancel) {\n\t\t\t\t_.#dialog.removeEventListener('cancel', _.#handlers.cancel);\n\t\t\t}\n\t\t\tif (_.#handlers.close) {\n\t\t\t\t_.#dialog.removeEventListener('close', _.#handlers.close);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Bind event listeners for close buttons, backdrop, and escape key\n\t * @private\n\t */\n\t#bindEvents() {\n\t\tconst _ = this;\n\n\t\t// Handle close buttons with data-action-hide-dialog\n\t\t_.#handlers.click = (e) => {\n\t\t\tconst trigger = e.target.closest('[data-action-hide-dialog]');\n\t\t\tif (trigger) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t_.hide(trigger);\n\t\t\t}\n\t\t};\n\t\t_.addEventListener('click', _.#handlers.click);\n\n\t\t// Handle backdrop click - detect clicks outside dialog bounds\n\t\t// This works because clicks on ::backdrop still fire on the dialog element\n\t\t_.#handlers.dialogClick = (e) => {\n\t\t\tconst rect = _.#dialog.getBoundingClientRect();\n\t\t\tconst clickedOutside =\n\t\t\t\te.clientX < rect.left ||\n\t\t\t\te.clientX > rect.right ||\n\t\t\t\te.clientY < rect.top ||\n\t\t\t\te.clientY > rect.bottom;\n\t\t\tif (clickedOutside) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t_.hide();\n\t\t\t}\n\t\t};\n\t\t_.#dialog.addEventListener('click', _.#handlers.dialogClick);\n\n\t\t// Handle escape key - intercept native cancel and animate close\n\t\t_.#handlers.cancel = (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\t_.hide();\n\t\t};\n\t\t_.#dialog.addEventListener('cancel', _.#handlers.cancel);\n\n\t\t// Cover browser force-close paths that bypass the cancel event\n\t\t_.#handlers.close = () => {\n\t\t\tif (\n\t\t\t\t_.#morphEngine?.state === 'shown' &&\n\t\t\t\t_.#state === 'shown' &&\n\t\t\t\t!_.#dialog.open\n\t\t\t) {\n\t\t\t\t_.hide();\n\t\t\t}\n\t\t};\n\t\t_.#dialog.addEventListener('close', _.#handlers.close);\n\t}\n\n\t/**\n\t * Wire morph engine lifecycle listeners\n\t * @private\n\t */\n\t#wireMorphEngine() {\n\t\tconst _ = this;\n\n\t\tif (!_.#morphEngine || _.#morphListenersAttached) return;\n\n\t\tif (!_.#handlers.morphShown) {\n\t\t\t_.#handlers.morphShown = _.#handleMorphShown.bind(_);\n\t\t\t_.#handlers.morphHidden = _.#handleMorphHidden.bind(_);\n\t\t\t_.#handlers.morphStop = _.#handleMorphStop.bind(_);\n\t\t}\n\n\t\t_.#morphEngine.on('shown', _.#handlers.morphShown);\n\t\t_.#morphEngine.on('hidden', _.#handlers.morphHidden);\n\t\t_.#morphEngine.on('stop', _.#handlers.morphStop);\n\t\t_.#morphListenersAttached = true;\n\t}\n\n\t/**\n\t * Unwire morph engine lifecycle listeners\n\t * @private\n\t */\n\t#unwireMorphEngine() {\n\t\tconst _ = this;\n\n\t\tif (!_.#morphEngine || !_.#morphListenersAttached) return;\n\n\t\t_.#morphEngine.off('shown', _.#handlers.morphShown);\n\t\t_.#morphEngine.off('hidden', _.#handlers.morphHidden);\n\t\t_.#morphEngine.off('stop', _.#handlers.morphStop);\n\t\t_.#morphListenersAttached = false;\n\t}\n\n\t/**\n\t * Promote the settled morph target into the dialog top layer\n\t * @private\n\t */\n\t#handleMorphShown() {\n\t\tconst _ = this;\n\n\t\tif (!_.#dialog.open) _.#dialog.showModal();\n\t\t_.#setState('shown');\n\t\t_.#emit('shown');\n\t}\n\n\t/**\n\t * Finalize a settled morph hide\n\t * @private\n\t */\n\t#handleMorphHidden() {\n\t\tthis.#finalizeMorphHide();\n\t}\n\n\t/**\n\t * Finalize an interrupted morph as hidden\n\t * @private\n\t */\n\t#handleMorphStop() {\n\t\tthis.#finalizeMorphHide();\n\t}\n\n\t/**\n\t * Restore the component's hidden state after a morph ends\n\t * @private\n\t */\n\t#finalizeMorphHide() {\n\t\tconst _ = this;\n\n\t\tif (_.#dialog.open) _.#dialog.close();\n\t\t_.#setState('hidden');\n\t\t_.#emit('hidden', {\n\t\t\tresult: _.#result,\n\t\t\ttriggerElement: _.#hideTriggerElement,\n\t\t});\n\n\t\t// Return focus to trigger element\n\t\tif (_.#triggerElement) _.#triggerElement.focus();\n\n\t\t// Clean up\n\t\t_.#triggerElement = null;\n\t\t_.#hideTriggerElement = null;\n\t\t_.#result = null;\n\t}\n\n\t/**\n\t * Show the dialog with animation\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the show\n\t * @returns {boolean} False if show was prevented via beforeShow event\n\t */\n\tshow(triggerEl = null) {\n\t\tconst _ = this;\n\n\t\t// Check if already showing/shown\n\t\tif (_.#state === 'showing' || _.#state === 'shown') return true;\n\n\t\tconst reversingMorph =\n\t\t\t_.#state === 'hiding' && _.#morphEngine?.state === 'hiding';\n\n\t\t// CSS transitions cannot reverse while hiding\n\t\tif (_.#state === 'hiding' && !reversingMorph) return false;\n\n\t\t// Store trigger element for focus return later\n\t\tif (!reversingMorph) _.#triggerElement = triggerEl || null;\n\n\t\t// Fire beforeShow (cancelable)\n\t\tif (!_.#emit('beforeShow', { cancelable: true })) return false;\n\n\t\tif (reversingMorph) {\n\t\t\t_.#hideTriggerElement = null;\n\t\t\t_.#result = null;\n\t\t}\n\n\t\t// Set state to 'showing'\n\t\t_.#setState('showing');\n\n\t\tif (_.#morphEngine && (triggerEl || reversingMorph)) {\n\t\t\t_.#morphEngine.show({\n\t\t\t\tfrom: _.#triggerElement,\n\t\t\t\tto: _.#dialog,\n\t\t\t\tdisplay: _.getAttribute('morph-display') || 'block',\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\t// Open native dialog for the CSS transition path\n\t\t_.#dialog.showModal();\n\n\t\t// Double RAF ensures browser has painted the 'showing' state\n\t\t// before we transition to 'shown'\n\t\t_.#pendingRAF = requestAnimationFrame(() => {\n\t\t\t_.#pendingRAF = requestAnimationFrame(() => {\n\t\t\t\t_.#pendingRAF = null;\n\t\t\t\t_.#setState('shown');\n\n\t\t\t\t// Wait for transition to complete before firing 'shown' event\n\t\t\t\t_.#waitForTransition(() => {\n\t\t\t\t\t_.#emit('shown');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Hide the dialog with animation\n\t * @param {HTMLElement} [triggerEl=null] - The element that triggered the hide\n\t * @returns {boolean} False if hide was prevented via beforeHide event\n\t */\n\thide(triggerEl = null) {\n\t\tconst _ = this;\n\n\t\t// Check if already hiding/hidden\n\t\tif (_.#state === 'hiding' || _.#state === 'hidden') return true;\n\n\t\tconst reversingMorph =\n\t\t\t_.#state === 'showing' && _.#morphEngine?.state === 'showing';\n\n\t\t// CSS transitions cannot reverse while showing\n\t\tif (_.#state === 'showing' && !reversingMorph) return false;\n\n\t\t// Capture result from trigger element\n\t\t_.#result = triggerEl?.dataset?.result ?? null;\n\n\t\t// Fire beforeHide (cancelable)\n\t\tif (\n\t\t\t!_.#emit('beforeHide', {\n\t\t\t\tcancelable: true,\n\t\t\t\tresult: _.#result,\n\t\t\t\ttriggerElement: triggerEl,\n\t\t\t})\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (reversingMorph || _.#morphEngine?.state === 'shown') {\n\t\t\t_.#hideTriggerElement = triggerEl;\n\t\t\tif (_.#dialog.open) _.#dialog.close();\n\t\t\t_.#morphEngine.hide();\n\t\t\t_.#setState('hiding');\n\t\t\treturn true;\n\t\t}\n\n\t\t// Set state to 'hiding' - this triggers CSS exit animation\n\t\t_.#setState('hiding');\n\n\t\t// Wait for transition to complete\n\t\t_.#waitForTransition(() => {\n\t\t\t_.#dialog.close();\n\t\t\t_.#setState('hidden');\n\t\t\t_.#emit('hidden', {\n\t\t\t\tresult: _.#result,\n\t\t\t\ttriggerElement: triggerEl,\n\t\t\t});\n\n\t\t\t// Return focus to trigger element\n\t\t\tif (_.#triggerElement) _.#triggerElement.focus();\n\n\t\t\t// Clean up\n\t\t\t_.#triggerElement = null;\n\t\t\t_.#result = null;\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Wait for CSS transition to complete with fallback timeout\n\t * @param {Function} callback - Called when transition completes\n\t * @private\n\t */\n\t#waitForTransition(callback) {\n\t\tconst _ = this;\n\t\tlet called = false;\n\t\tlet timerId = null;\n\n\t\tconst done = () => {\n\t\t\tif (called) return;\n\t\t\tcalled = true;\n\t\t\t_.#dialog.removeEventListener('transitionend', onTransitionEnd);\n\t\t\t// clear only our own timer — clearing the shared field would let an\n\t\t\t// earlier, still-pending wait cancel a later wait's fallback\n\t\t\tclearTimeout(timerId);\n\t\t\tif (_.#pendingTimeout === timerId) _.#pendingTimeout = null;\n\t\t\tcallback();\n\t\t};\n\n\t\tconst onTransitionEnd = (e) => {\n\t\t\tif (e.target === _.#dialog) done();\n\t\t};\n\n\t\t_.#dialog.addEventListener('transitionend', onTransitionEnd);\n\n\t\ttimerId = setTimeout(done, DialogPanel.TRANSITION_FALLBACK_TIMEOUT);\n\t\t_.#pendingTimeout = timerId;\n\t}\n\n\t/**\n\t * Set the component state\n\t * @param {string} newState - The new state\n\t * @private\n\t */\n\t#setState(newState) {\n\t\tthis.#state = newState;\n\t\tthis.setAttribute('state', newState);\n\t}\n\n\t/**\n\t * Emit a custom event\n\t * @param {string} name - Event name\n\t * @param {Object} options - Event options\n\t * @returns {boolean} False if event was cancelled\n\t * @private\n\t */\n\t#emit(name, options = {}) {\n\t\tconst _ = this;\n\t\tconst { cancelable = false, ...detail } = options;\n\n\t\tconst event = new CustomEvent(name, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tcancelable,\n\t\t\tdetail: {\n\t\t\t\ttriggerElement: _.#triggerElement,\n\t\t\t\tresult: _.#result,\n\t\t\t\tstate: _.#state,\n\t\t\t\t...detail,\n\t\t\t},\n\t\t});\n\n\t\treturn _.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Optional morph transition transport\n\t * @returns {Object|null} The attached morph engine\n\t */\n\tget morphEngine() {\n\t\treturn this.#morphEngine;\n\t}\n\n\t/**\n\t * Attach or remove a duck-typed morph transition engine\n\t * @param {Object|null} engine - Engine with show, hide, state, on, and off\n\t */\n\tset morphEngine(engine) {\n\t\tconst _ = this;\n\n\t\tif (_.#morphEngine === engine) return;\n\n\t\t_.#unwireMorphEngine();\n\t\t_.#morphEngine = engine || null;\n\n\t\tif (_.#morphEngine) {\n\t\t\t_.setAttribute('morph', '');\n\t\t\t_.#wireMorphEngine();\n\t\t} else {\n\t\t\t_.removeAttribute('morph');\n\t\t}\n\t}\n\n\t// Read-only properties\n\tget state() {\n\t\treturn this.#state;\n\t}\n\tget dialog() {\n\t\treturn this.#dialog;\n\t}\n\tget isOpen() {\n\t\treturn this.#state === 'showing' || this.#state === 'shown';\n\t}\n\tget triggerElement() {\n\t\treturn this.#triggerElement;\n\t}\n}\n\n/**\n * DialogBackdrop - A custom backdrop element that animates with the dialog-panel state.\n * Use this instead of native ::backdrop for consistent cross-browser animations.\n *\n * @extends HTMLElement\n */\nclass DialogBackdrop extends HTMLElement {\n\t#panel = null;\n\t#handlers = {\n\t\tclick: null,\n\t};\n\n\tconnectedCallback() {\n\t\tconst _ = this;\n\n\t\t// Find parent dialog-panel\n\t\t_.#panel = _.closest('dialog-panel');\n\n\t\tif (!_.#panel) {\n\t\t\tconsole.warn(\n\t\t\t\t'DialogBackdrop: Must be inside a <dialog-panel> element'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle click to close\n\t\t_.#handlers.click = () => {\n\t\t\t_.#panel.hide();\n\t\t};\n\t\t_.addEventListener('click', _.#handlers.click);\n\t}\n\n\tdisconnectedCallback() {\n\t\tconst _ = this;\n\t\tif (_.#handlers.click) {\n\t\t\t_.removeEventListener('click', _.#handlers.click);\n\t\t}\n\t}\n}\n\n// Register the custom elements\n// Note: dialog-backdrop must be defined BEFORE dialog-panel,\n// because dialog-panel's connectedCallback may create dialog-backdrop elements\nif (!customElements.get('dialog-backdrop')) {\n\tcustomElements.define('dialog-backdrop', DialogBackdrop);\n}\nif (!customElements.get('dialog-panel')) {\n\tcustomElements.define('dialog-panel', DialogPanel);\n}\n\nexport { DialogPanel, DialogBackdrop };\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- dialog-panel{display:contents}dialog-panel>dialog{border:none;box-shadow:0 10px 25px rgba(0,0,0,.15);max-height:85vh;max-width:32rem;opacity:0;overflow:visible;padding:0;transform:scale(.95);transition:opacity .3s ease-out,transform .3s ease-out;width:90vw}dialog-panel:has(dialog-backdrop)>dialog::backdrop{background:transparent}dialog-panel:not(:has(dialog-backdrop))>dialog::backdrop{background:rgba(0,0,0,.3);opacity:0;transition:opacity .3s ease-out}dialog-backdrop{background:rgba(0,0,0,.3);height:200dvh;left:50%;opacity:0;pointer-events:none;position:fixed;top:50%;transform:translateY(-50%) translateX(-50%);transition:opacity .3s ease-out;width:200vw;z-index:9999999}dialog-panel[state=showing]>dialog{opacity:0;transform:scale(.95)}dialog-panel:not(:has(dialog-backdrop))[state=showing]>dialog::backdrop{opacity:0}dialog-panel[state=shown]>dialog{opacity:1;transform:scale(1)}dialog-panel:not(:has(dialog-backdrop))[state=shown]>dialog::backdrop{opacity:1}dialog-panel[state=hiding]>dialog{opacity:0;transform:scale(.95);transition:opacity .2s ease-in,transform .2s ease-in}dialog-panel:not(:has(dialog-backdrop))[state=hiding]>dialog::backdrop{opacity:0;transition:opacity .2s ease-in}dialog-panel[state=hidden]>dialog-backdrop,dialog-panel[state=showing]>dialog-backdrop{opacity:0;pointer-events:none}dialog-panel[state=shown]>dialog-backdrop{opacity:1;pointer-events:auto}dialog-panel[state=hiding]>dialog-backdrop{opacity:0;pointer-events:none;transition:opacity .2s ease-in}dialog-panel[position=top]>dialog{margin:0 auto auto;max-height:85vh;max-width:100%;width:100%}dialog-panel[position=top][state=hiding]>dialog,dialog-panel[position=top][state=showing]>dialog{opacity:1;transform:translateY(-100%)}dialog-panel[position=top][state=shown]>dialog{opacity:1;transform:translateY(0)}dialog-panel[position=bottom]>dialog{margin:auto auto 0;max-height:85vh;max-width:100%;width:100%}dialog-panel[position=bottom][state=hiding]>dialog,dialog-panel[position=bottom][state=showing]>dialog{opacity:1;transform:translateY(100%)}dialog-panel[position=bottom][state=shown]>dialog{opacity:1;transform:translateY(0)}dialog-panel[position=left]>dialog{height:100dvh;margin:auto auto auto 0;max-height:100dvh;max-width:100%;width:min(24rem,90vw)}dialog-panel[position=left][state=hiding]>dialog,dialog-panel[position=left][state=showing]>dialog{opacity:1;transform:translateX(-100%)}dialog-panel[position=left][state=shown]>dialog{opacity:1;transform:translateX(0)}dialog-panel[position=right]>dialog{height:100dvh;margin:auto 0 auto auto;max-height:100dvh;max-width:100%;width:min(24rem,90vw)}dialog-panel[position=right][state=hiding]>dialog,dialog-panel[position=right][state=showing]>dialog{opacity:1;transform:translateX(100%)}dialog-panel[position=right][state=shown]>dialog{opacity:1;transform:translateX(0)}
1
+ dialog-panel{display:contents}dialog-panel>dialog{border:none;box-shadow:0 10px 25px rgba(0,0,0,.15);max-height:85vh;max-width:32rem;opacity:0;overflow:visible;padding:0;transform:scale(.95);transition:opacity .3s ease-out,transform .3s ease-out;width:90vw}dialog-panel:has(dialog-backdrop)>dialog::backdrop{background:transparent}dialog-panel:not(:has(dialog-backdrop))>dialog::backdrop{background:rgba(0,0,0,.3);opacity:0;transition:opacity .3s ease-out}dialog-backdrop{background:rgba(0,0,0,.3);height:200dvh;left:50%;opacity:0;pointer-events:none;position:fixed;top:50%;transform:translateY(-50%) translateX(-50%);transition:opacity .3s ease-out;width:200vw;z-index:9999999}dialog-panel[state=showing]>dialog{opacity:0;transform:scale(.95)}dialog-panel:not(:has(dialog-backdrop))[state=showing]>dialog::backdrop{opacity:0}dialog-panel[state=shown]>dialog{opacity:1;transform:scale(1)}dialog-panel:not(:has(dialog-backdrop))[state=shown]>dialog::backdrop{opacity:1}dialog-panel[state=hiding]>dialog{opacity:0;transform:scale(.95);transition:opacity .2s ease-in,transform .2s ease-in}dialog-panel:not(:has(dialog-backdrop))[state=hiding]>dialog::backdrop{opacity:0;transition:opacity .2s ease-in}dialog-panel[state=hidden]>dialog-backdrop,dialog-panel[state=showing]>dialog-backdrop{opacity:0;pointer-events:none}dialog-panel[state=shown]>dialog-backdrop{opacity:1;pointer-events:auto}dialog-panel[state=hiding]>dialog-backdrop{opacity:0;pointer-events:none;transition:opacity .2s ease-in}dialog-panel[position=bottom]>dialog,dialog-panel[position=left]>dialog,dialog-panel[position=right]>dialog,dialog-panel[position=top]>dialog{margin:0;max-width:100%;opacity:1;position:fixed}dialog-panel[position=top]>dialog{bottom:auto;left:0;max-height:85vh;right:0;top:0;transform:translateY(-100%);width:100%}dialog-panel[position=top][state=shown]>dialog{transform:translateY(0)}dialog-panel[position=bottom]>dialog{bottom:0;left:0;max-height:85vh;right:0;top:auto;transform:translateY(100%);width:100%}dialog-panel[position=bottom][state=shown]>dialog{transform:translateY(0)}dialog-panel[position=left]>dialog{bottom:0;height:100dvh;left:0;max-height:100dvh;right:auto;top:0;transform:translateX(-100%);width:min(24rem,90vw)}dialog-panel[position=left][state=shown]>dialog{transform:translateX(0)}dialog-panel[position=right]>dialog{bottom:0;height:100dvh;left:auto;max-height:100dvh;right:0;top:0;transform:translateX(100%);width:min(24rem,90vw)}dialog-panel[position=right][state=shown]>dialog{transform:translateX(0)}body:has(dialog-panel[state=hiding]),body:has(dialog-panel[state=showing]),body:has(dialog-panel[state=shown]){overflow:hidden}dialog-panel[morph]>dialog,dialog-panel[morph][state]>dialog{inset:0;margin:auto;max-height:none;max-width:none;opacity:1;position:fixed;transform:none;transition:none}dialog-panel[morph][state=showing]>dialog-backdrop{opacity:1;pointer-events:auto}
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DialogPanel={})}(this,function(e){"use strict";class DialogPanel extends HTMLElement{#e="hidden";#t=null;#n=null;#l=null;#i={click:null,dialogClick:null,cancel:null};#a=null;#o=null;static TRANSITION_FALLBACK_TIMEOUT=700;connectedCallback(){const e=this;if(e.#n=e.querySelector("dialog"),e.#n){if(!e.querySelector("dialog-backdrop")){const t=document.createElement("dialog-backdrop");e.insertBefore(t,e.firstChild)}e.#s("hidden"),e.#d()}else console.warn("DialogPanel: No <dialog> element found inside <dialog-panel>")}disconnectedCallback(){const e=this;e.#a&&(cancelAnimationFrame(e.#a),e.#a=null),e.#o&&(clearTimeout(e.#o),e.#o=null),e.#i.click&&e.removeEventListener("click",e.#i.click),e.#n&&(e.#i.dialogClick&&e.#n.removeEventListener("click",e.#i.dialogClick),e.#i.cancel&&e.#n.removeEventListener("cancel",e.#i.cancel))}#d(){const e=this;e.#i.click=t=>{const n=t.target.closest("[data-action-hide-dialog]");n&&(t.stopPropagation(),e.hide(n))},e.addEventListener("click",e.#i.click),e.#i.dialogClick=t=>{const n=e.#n.getBoundingClientRect();(t.clientX<n.left||t.clientX>n.right||t.clientY<n.top||t.clientY>n.bottom)&&(t.stopPropagation(),e.hide())},e.#n.addEventListener("click",e.#i.dialogClick),e.#i.cancel=t=>{t.preventDefault(),t.stopPropagation(),e.hide()},e.#n.addEventListener("cancel",e.#i.cancel)}show(e=null){const t=this;return"showing"===t.#e||"shown"===t.#e||"hiding"!==t.#e&&(t.#t=e||null,!!t.#c("beforeShow",{cancelable:!0})&&(t.#s("showing"),t.#n.showModal(),t.#a=requestAnimationFrame(()=>{t.#a=requestAnimationFrame(()=>{t.#a=null,t.#s("shown"),t.#r(()=>{t.#c("shown")})})}),!0))}hide(e=null){const t=this;return"hiding"===t.#e||"hidden"===t.#e||"showing"!==t.#e&&(t.#l=e?.dataset?.result??null,!!t.#c("beforeHide",{cancelable:!0,result:t.#l,triggerElement:e})&&(t.#s("hiding"),t.#r(()=>{t.#n.close(),t.#s("hidden"),t.#c("hidden",{result:t.#l,triggerElement:e}),t.#t&&t.#t.focus(),t.#t=null,t.#l=null}),!0))}#r(e){const t=this;let n=!1;const l=()=>{n||(n=!0,t.#n.removeEventListener("transitionend",i),t.#o&&(clearTimeout(t.#o),t.#o=null),e())},i=e=>{e.target===t.#n&&l()};t.#n.addEventListener("transitionend",i),t.#o=setTimeout(l,DialogPanel.TRANSITION_FALLBACK_TIMEOUT)}#s(e){this.#e=e,this.setAttribute("state",e)}#c(e,t={}){const n=this,{cancelable:l=!1,...i}=t,a=new CustomEvent(e,{bubbles:!0,composed:!0,cancelable:l,detail:{triggerElement:n.#t,result:n.#l,state:n.#e,...i}});return n.dispatchEvent(a)}get state(){return this.#e}get dialog(){return this.#n}get isOpen(){return"showing"===this.#e||"shown"===this.#e}get triggerElement(){return this.#t}}class DialogBackdrop extends HTMLElement{#g=null;#i={click:null};connectedCallback(){const e=this;e.#g=e.closest("dialog-panel"),e.#g?(e.#i.click=()=>{e.#g.hide()},e.addEventListener("click",e.#i.click)):console.warn("DialogBackdrop: Must be inside a <dialog-panel> element")}disconnectedCallback(){const e=this;e.#i.click&&e.removeEventListener("click",e.#i.click)}}customElements.get("dialog-backdrop")||customElements.define("dialog-backdrop",DialogBackdrop),customElements.get("dialog-panel")||customElements.define("dialog-panel",DialogPanel),e.DialogBackdrop=DialogBackdrop,e.DialogPanel=DialogPanel});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).DialogPanel={})}(this,function(e){"use strict";class DialogPanel extends HTMLElement{#e="hidden";#n=null;#t=null;#i=null;#l=null;#o=null;#r=!1;#s={click:null,dialogClick:null,cancel:null,close:null,morphShown:null,morphHidden:null,morphStop:null};#a=null;#d=null;static TRANSITION_FALLBACK_TIMEOUT=700;connectedCallback(){const e=this;if(e.#t=e.querySelector("dialog"),e.#t){if(!e.querySelector("dialog-backdrop")){const n=document.createElement("dialog-backdrop");e.insertBefore(n,e.firstChild)}e.#h("hidden"),e.#g(),e.#c()}else console.warn("DialogPanel: No <dialog> element found inside <dialog-panel>")}disconnectedCallback(){const e=this;e.#a&&(cancelAnimationFrame(e.#a),e.#a=null),e.#d&&(clearTimeout(e.#d),e.#d=null),e.#p(),e.#s.click&&e.removeEventListener("click",e.#s.click),e.#t&&(e.#s.dialogClick&&e.#t.removeEventListener("click",e.#s.dialogClick),e.#s.cancel&&e.#t.removeEventListener("cancel",e.#s.cancel),e.#s.close&&e.#t.removeEventListener("close",e.#s.close))}#g(){const e=this;e.#s.click=n=>{const t=n.target.closest("[data-action-hide-dialog]");t&&(n.stopPropagation(),e.hide(t))},e.addEventListener("click",e.#s.click),e.#s.dialogClick=n=>{const t=e.#t.getBoundingClientRect();(n.clientX<t.left||n.clientX>t.right||n.clientY<t.top||n.clientY>t.bottom)&&(n.stopPropagation(),e.hide())},e.#t.addEventListener("click",e.#s.dialogClick),e.#s.cancel=n=>{n.preventDefault(),n.stopPropagation(),e.hide()},e.#t.addEventListener("cancel",e.#s.cancel),e.#s.close=()=>{"shown"!==e.#o?.state||"shown"!==e.#e||e.#t.open||e.hide()},e.#t.addEventListener("close",e.#s.close)}#c(){const e=this;e.#o&&!e.#r&&(e.#s.morphShown||(e.#s.morphShown=e.#m.bind(e),e.#s.morphHidden=e.#u.bind(e),e.#s.morphStop=e.#E.bind(e)),e.#o.on("shown",e.#s.morphShown),e.#o.on("hidden",e.#s.morphHidden),e.#o.on("stop",e.#s.morphStop),e.#r=!0)}#p(){const e=this;e.#o&&e.#r&&(e.#o.off("shown",e.#s.morphShown),e.#o.off("hidden",e.#s.morphHidden),e.#o.off("stop",e.#s.morphStop),e.#r=!1)}#m(){const e=this;e.#t.open||e.#t.showModal(),e.#h("shown"),e.#w("shown")}#u(){this.#f()}#E(){this.#f()}#f(){const e=this;e.#t.open&&e.#t.close(),e.#h("hidden"),e.#w("hidden",{result:e.#i,triggerElement:e.#l}),e.#n&&e.#n.focus(),e.#n=null,e.#l=null,e.#i=null}show(e=null){const n=this;if("showing"===n.#e||"shown"===n.#e)return!0;const t="hiding"===n.#e&&"hiding"===n.#o?.state;return!("hiding"===n.#e&&!t)&&(t||(n.#n=e||null),!!n.#w("beforeShow",{cancelable:!0})&&(t&&(n.#l=null,n.#i=null),n.#h("showing"),n.#o&&(e||t)?(n.#o.show({from:n.#n,to:n.#t,display:n.getAttribute("morph-display")||"block"}),!0):(n.#t.showModal(),n.#a=requestAnimationFrame(()=>{n.#a=requestAnimationFrame(()=>{n.#a=null,n.#h("shown"),n.#k(()=>{n.#w("shown")})})}),!0)))}hide(e=null){const n=this;if("hiding"===n.#e||"hidden"===n.#e)return!0;const t="showing"===n.#e&&"showing"===n.#o?.state;return!("showing"===n.#e&&!t)&&(n.#i=e?.dataset?.result??null,!!n.#w("beforeHide",{cancelable:!0,result:n.#i,triggerElement:e})&&(t||"shown"===n.#o?.state?(n.#l=e,n.#t.open&&n.#t.close(),n.#o.hide(),n.#h("hiding"),!0):(n.#h("hiding"),n.#k(()=>{n.#t.close(),n.#h("hidden"),n.#w("hidden",{result:n.#i,triggerElement:e}),n.#n&&n.#n.focus(),n.#n=null,n.#i=null}),!0)))}#k(e){const n=this;let t=!1,i=null;const l=()=>{t||(t=!0,n.#t.removeEventListener("transitionend",o),clearTimeout(i),n.#d===i&&(n.#d=null),e())},o=e=>{e.target===n.#t&&l()};n.#t.addEventListener("transitionend",o),i=setTimeout(l,DialogPanel.TRANSITION_FALLBACK_TIMEOUT),n.#d=i}#h(e){this.#e=e,this.setAttribute("state",e)}#w(e,n={}){const t=this,{cancelable:i=!1,...l}=n,o=new CustomEvent(e,{bubbles:!0,composed:!0,cancelable:i,detail:{triggerElement:t.#n,result:t.#i,state:t.#e,...l}});return t.dispatchEvent(o)}get morphEngine(){return this.#o}set morphEngine(e){const n=this;n.#o!==e&&(n.#p(),n.#o=e||null,n.#o?(n.setAttribute("morph",""),n.#c()):n.removeAttribute("morph"))}get state(){return this.#e}get dialog(){return this.#t}get isOpen(){return"showing"===this.#e||"shown"===this.#e}get triggerElement(){return this.#n}}class DialogBackdrop extends HTMLElement{#b=null;#s={click:null};connectedCallback(){const e=this;e.#b=e.closest("dialog-panel"),e.#b?(e.#s.click=()=>{e.#b.hide()},e.addEventListener("click",e.#s.click)):console.warn("DialogBackdrop: Must be inside a <dialog-panel> element")}disconnectedCallback(){const e=this;e.#s.click&&e.removeEventListener("click",e.#s.click)}}customElements.get("dialog-backdrop")||customElements.define("dialog-backdrop",DialogBackdrop),customElements.get("dialog-panel")||customElements.define("dialog-panel",DialogPanel),e.DialogBackdrop=DialogBackdrop,e.DialogPanel=DialogPanel});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magic-spells/dialog-panel",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "A lightweight web component wrapper for native <dialog> elements with state-driven animations.",
5
5
  "author": "Cory Schulz",
6
6
  "license": "MIT",