@spectrum-web-components/overlay 0.19.0 → 0.19.2-overlay.33

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.
Files changed (114) hide show
  1. package/package.json +56 -5
  2. package/sp-overlay.d.ts +11 -0
  3. package/sp-overlay.dev.js +14 -0
  4. package/sp-overlay.dev.js.map +7 -0
  5. package/sp-overlay.js +2 -0
  6. package/sp-overlay.js.map +7 -0
  7. package/src/OverlayBase.d.ts +91 -0
  8. package/src/OverlayBase.dev.js +521 -0
  9. package/src/OverlayBase.dev.js.map +7 -0
  10. package/src/OverlayBase.js +16 -0
  11. package/src/OverlayBase.js.map +7 -0
  12. package/src/OverlayDialog.d.ts +8 -0
  13. package/src/OverlayDialog.dev.js +43 -0
  14. package/src/OverlayDialog.dev.js.map +7 -0
  15. package/src/OverlayDialog.js +2 -0
  16. package/src/OverlayDialog.js.map +7 -0
  17. package/src/OverlayElement.d.ts +66 -0
  18. package/src/OverlayElement.dev.js +371 -0
  19. package/src/OverlayElement.dev.js.map +7 -0
  20. package/src/OverlayElement.js +9 -0
  21. package/src/OverlayElement.js.map +7 -0
  22. package/src/OverlayNoPopover.d.ts +8 -0
  23. package/src/OverlayNoPopover.dev.js +63 -0
  24. package/src/OverlayNoPopover.dev.js.map +7 -0
  25. package/src/OverlayNoPopover.js +2 -0
  26. package/src/OverlayNoPopover.js.map +7 -0
  27. package/src/OverlayPopover.d.ts +8 -0
  28. package/src/OverlayPopover.dev.js +37 -0
  29. package/src/OverlayPopover.dev.js.map +7 -0
  30. package/src/OverlayPopover.js +2 -0
  31. package/src/OverlayPopover.js.map +7 -0
  32. package/src/OverlayStack.d.ts +24 -0
  33. package/src/OverlayStack.dev.js +113 -0
  34. package/src/OverlayStack.dev.js.map +7 -0
  35. package/src/OverlayStack.js +2 -0
  36. package/src/OverlayStack.js.map +7 -0
  37. package/src/OverlayTrigger.d.ts +18 -31
  38. package/src/OverlayTrigger.dev.js +137 -245
  39. package/src/OverlayTrigger.dev.js.map +3 -3
  40. package/src/OverlayTrigger.js +54 -22
  41. package/src/OverlayTrigger.js.map +3 -3
  42. package/src/PlacementController.d.ts +35 -0
  43. package/src/PlacementController.dev.js +172 -0
  44. package/src/PlacementController.dev.js.map +7 -0
  45. package/src/PlacementController.js +2 -0
  46. package/src/PlacementController.js.map +7 -0
  47. package/src/fullSizePlugin.d.ts +12 -0
  48. package/src/fullSizePlugin.dev.js +39 -0
  49. package/src/fullSizePlugin.dev.js.map +7 -0
  50. package/src/fullSizePlugin.js +2 -0
  51. package/src/fullSizePlugin.js.map +7 -0
  52. package/src/overlay-base.css.d.ts +2 -0
  53. package/src/overlay-base.css.dev.js +9 -0
  54. package/src/overlay-base.css.dev.js.map +7 -0
  55. package/src/overlay-base.css.js +6 -0
  56. package/src/overlay-base.css.js.map +7 -0
  57. package/src/overlay-element.css.d.ts +2 -0
  58. package/src/overlay-element.css.dev.js +7 -0
  59. package/src/overlay-element.css.dev.js.map +7 -0
  60. package/src/overlay-element.css.js +4 -0
  61. package/src/overlay-element.css.js.map +7 -0
  62. package/src/overlay-trigger.css.dev.js +1 -1
  63. package/src/overlay-trigger.css.dev.js.map +1 -1
  64. package/src/overlay-trigger.css.js +1 -1
  65. package/src/overlay-trigger.css.js.map +1 -1
  66. package/src/placement.d.ts +21 -0
  67. package/src/placement.dev.js +111 -0
  68. package/src/placement.dev.js.map +7 -0
  69. package/src/placement.js +2 -0
  70. package/src/placement.js.map +7 -0
  71. package/src/sizePlugin.d.ts +12 -0
  72. package/src/sizePlugin.dev.js +18 -0
  73. package/src/sizePlugin.dev.js.map +7 -0
  74. package/src/sizePlugin.js +2 -0
  75. package/src/sizePlugin.js.map +7 -0
  76. package/src/topLayerOverTransforms.d.ts +22 -0
  77. package/src/topLayerOverTransforms.dev.js +161 -0
  78. package/src/topLayerOverTransforms.dev.js.map +7 -0
  79. package/src/topLayerOverTransforms.js +2 -0
  80. package/src/topLayerOverTransforms.js.map +7 -0
  81. package/stories/overlay-element.stories.js +216 -0
  82. package/stories/overlay-element.stories.js.map +7 -0
  83. package/stories/overlay-story-components.js +1 -2
  84. package/stories/overlay-story-components.js.map +2 -2
  85. package/stories/overlay.stories.js +652 -637
  86. package/stories/overlay.stories.js.map +2 -2
  87. package/sync/overlay-trigger.d.ts +4 -0
  88. package/sync/overlay-trigger.dev.js +1 -3
  89. package/sync/overlay-trigger.dev.js.map +2 -2
  90. package/sync/overlay-trigger.js +1 -1
  91. package/sync/overlay-trigger.js.map +3 -3
  92. package/test/index.js +3 -3
  93. package/test/index.js.map +2 -2
  94. package/test/overlay-element.test-vrt.js +5 -0
  95. package/test/overlay-element.test-vrt.js.map +7 -0
  96. package/test/overlay-element.test.js +739 -0
  97. package/test/overlay-element.test.js.map +7 -0
  98. package/test/overlay-lifecycle.test.js +15 -61
  99. package/test/overlay-lifecycle.test.js.map +2 -2
  100. package/test/overlay-trigger-click.test.js +3 -2
  101. package/test/overlay-trigger-click.test.js.map +2 -2
  102. package/test/overlay-trigger-extended.test.js +1 -1
  103. package/test/overlay-trigger-extended.test.js.map +2 -2
  104. package/test/overlay-trigger-hover-click.test.js +1 -1
  105. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  106. package/test/overlay-trigger-hover.test.js +2 -2
  107. package/test/overlay-trigger-hover.test.js.map +2 -2
  108. package/test/overlay-trigger-longpress.test.js +1 -1
  109. package/test/overlay-trigger-longpress.test.js.map +2 -2
  110. package/test/overlay-update.test.js +4 -4
  111. package/test/overlay-update.test.js.map +2 -2
  112. package/test/overlay.test.js +3 -3
  113. package/test/overlay.test.js.map +2 -2
  114. package/custom-elements.json +0 -1191
@@ -0,0 +1,521 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __decorateClass = (decorators, target, key, kind) => {
5
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
6
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
7
+ if (decorator = decorators[i])
8
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
9
+ if (kind && result)
10
+ __defProp(target, key, result);
11
+ return result;
12
+ };
13
+ import {
14
+ html,
15
+ SpectrumElement
16
+ } from "@spectrum-web-components/base";
17
+ import {
18
+ property,
19
+ query,
20
+ queryAssignedElements,
21
+ state
22
+ } from "@spectrum-web-components/base/src/decorators.js";
23
+ import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
24
+ import {
25
+ ElementResolutionController,
26
+ elementResolverUpdatedSymbol
27
+ } from "@spectrum-web-components/reactive-controllers/src/ElementResolution.js";
28
+ import {
29
+ ifDefined,
30
+ styleMap
31
+ } from "@spectrum-web-components/base/src/directives.js";
32
+ import styles from "./overlay-base.css.js";
33
+ import { overlayStack } from "./OverlayStack.dev.js";
34
+ import { PlacementController } from "./PlacementController.dev.js";
35
+ const LONGPRESS_DURATION = 300;
36
+ export const LONGPRESS_INSTRUCTIONS = {
37
+ touch: "Double tap and long press for additional options",
38
+ keyboard: "Press Space or Alt+Down Arrow for additional options",
39
+ mouse: "Click and hold for additional options"
40
+ };
41
+ export class BeforetoggleClosedEvent extends Event {
42
+ constructor() {
43
+ super("beforetoggle", {
44
+ bubbles: false,
45
+ composed: false
46
+ });
47
+ this.currentState = "open";
48
+ this.newState = "closed";
49
+ }
50
+ }
51
+ export class BeforetoggleOpenEvent extends Event {
52
+ constructor() {
53
+ super("beforetoggle", {
54
+ bubbles: false,
55
+ composed: false
56
+ });
57
+ this.currentState = "closed";
58
+ this.newState = "open";
59
+ }
60
+ }
61
+ const _OverlayBase = class extends SpectrumElement {
62
+ constructor() {
63
+ super(...arguments);
64
+ this._disabled = false;
65
+ this.longpressed = false;
66
+ this.offset = 6;
67
+ this.placementController = new PlacementController(this);
68
+ this._open = false;
69
+ this.receivesFocus = "auto";
70
+ this.releaseAriaDescribedby = () => {
71
+ return;
72
+ };
73
+ this.triggerElement = null;
74
+ this.type = "hint";
75
+ this.wasOpen = false;
76
+ this.elementResolver = new ElementResolutionController(this);
77
+ this.handlePointerdown = (event) => {
78
+ if (!this.triggerElement)
79
+ return;
80
+ if (event.button !== 0)
81
+ return;
82
+ const triggerElement = this.triggerElement;
83
+ this.longpressed = false;
84
+ triggerElement.addEventListener("pointerup", this.handlePointerup);
85
+ triggerElement.addEventListener("pointercancel", this.handlePointerup);
86
+ this.longressTimeout = setTimeout(() => {
87
+ if (!triggerElement)
88
+ return;
89
+ triggerElement.dispatchEvent(
90
+ new CustomEvent("longpress", {
91
+ bubbles: true,
92
+ composed: true,
93
+ detail: {
94
+ source: "pointer"
95
+ }
96
+ })
97
+ );
98
+ }, LONGPRESS_DURATION);
99
+ };
100
+ this.handlePointerup = () => {
101
+ clearTimeout(this.longressTimeout);
102
+ if (!this.triggerElement)
103
+ return;
104
+ if (this.longpressed) {
105
+ this.open = true;
106
+ }
107
+ setTimeout(() => {
108
+ this.longpressed = false;
109
+ });
110
+ const triggerElement = this.triggerElement;
111
+ triggerElement.removeEventListener("pointerup", this.handlePointerup);
112
+ triggerElement.removeEventListener(
113
+ "pointercancel",
114
+ this.handlePointerup
115
+ );
116
+ };
117
+ /**
118
+ * @private
119
+ */
120
+ this.handleKeydown = (event) => {
121
+ const { code, altKey } = event;
122
+ if (code === "Space" || altKey && code === "ArrowDown") {
123
+ if (code === "ArrowDown") {
124
+ event.stopPropagation();
125
+ event.stopImmediatePropagation();
126
+ }
127
+ }
128
+ };
129
+ this.handleKeyup = (event) => {
130
+ const { code, altKey } = event;
131
+ if (code === "Space" || altKey && code === "ArrowDown") {
132
+ event.stopPropagation();
133
+ this.dispatchEvent(
134
+ new CustomEvent("longpress", {
135
+ bubbles: true,
136
+ composed: true,
137
+ detail: {
138
+ source: "keyboard"
139
+ }
140
+ })
141
+ );
142
+ }
143
+ };
144
+ this.handleClick = () => {
145
+ if (this.longpressed)
146
+ return;
147
+ this.open = !this.open;
148
+ };
149
+ this.focusedin = false;
150
+ this.handleFocusin = () => {
151
+ this.open = true;
152
+ this.focusedin = true;
153
+ };
154
+ this.handleFocusout = () => {
155
+ this.focusedin = false;
156
+ if (this.pointerentered)
157
+ return;
158
+ this.open = false;
159
+ };
160
+ this.pointerentered = false;
161
+ this.handlePointerenter = () => {
162
+ this.open = true;
163
+ this.pointerentered = true;
164
+ };
165
+ this.handlePointerleave = () => {
166
+ this.pointerentered = false;
167
+ const triggerElement = this.triggerElement;
168
+ if (this.focusedin && triggerElement.matches(":focus-visible"))
169
+ return;
170
+ this.open = false;
171
+ };
172
+ this.handleLongpress = () => {
173
+ this.open = true;
174
+ this.longpressed = true;
175
+ };
176
+ }
177
+ get disabled() {
178
+ return this._disabled;
179
+ }
180
+ set disabled(disabled) {
181
+ this._disabled = disabled;
182
+ if (disabled) {
183
+ this.wasOpen = this.open;
184
+ this.open = false;
185
+ } else {
186
+ this.open = this.open || this.wasOpen;
187
+ this.wasOpen = false;
188
+ }
189
+ }
190
+ get open() {
191
+ return this._open;
192
+ }
193
+ set open(open) {
194
+ if (open && this.disabled)
195
+ return;
196
+ if (open === this.open)
197
+ return;
198
+ this._open = open;
199
+ this.requestUpdate("open", !this.open);
200
+ }
201
+ get usesDialog() {
202
+ return this.type === "modal" || this.type === "page";
203
+ }
204
+ get popoverValue() {
205
+ switch (this.type) {
206
+ case "modal":
207
+ case "page":
208
+ return void 0;
209
+ case "hint":
210
+ return "manual";
211
+ default:
212
+ return this.type;
213
+ }
214
+ }
215
+ manageChildren(open) {
216
+ const eventName = open ? "sp-opened" : "sp-closed";
217
+ let announced = false;
218
+ this.elements.forEach((el) => {
219
+ if (typeof el.open !== "undefined") {
220
+ el.open = open;
221
+ el.dispatchEvent(
222
+ new Event(eventName, {
223
+ bubbles: false,
224
+ composed: false
225
+ })
226
+ );
227
+ }
228
+ if (!announced) {
229
+ this.dispatchEvent(
230
+ new Event(eventName, {
231
+ bubbles: true,
232
+ composed: true
233
+ })
234
+ );
235
+ announced = true;
236
+ }
237
+ });
238
+ }
239
+ async manageDialogOpen() {
240
+ console.warn(
241
+ "Implement the `manageDialogOpen` method in a class extension."
242
+ );
243
+ }
244
+ async managePopoverOpen() {
245
+ console.warn(
246
+ "Implement the `managePopoverOpen` method in a class extension."
247
+ );
248
+ }
249
+ get requiresPosition() {
250
+ if (this.type === "page" || !this.open)
251
+ return false;
252
+ if (!this.triggerElement || !this.placement && this.type !== "hint")
253
+ return false;
254
+ return true;
255
+ }
256
+ managePosition() {
257
+ if (!this.requiresPosition)
258
+ return;
259
+ const offset = this.offset || 0;
260
+ const trigger = this.triggerElement;
261
+ const placement = this.placement || "right";
262
+ this.placementController.placeOverlay(this.dialogEl, {
263
+ // delayed?: boolean,
264
+ offset,
265
+ placement,
266
+ // notImmediatelyClosable?: boolean, // rename or place behind other API options
267
+ // receivesFocus?: 'auto';
268
+ // root?: HTMLElement;
269
+ trigger,
270
+ type: this.type
271
+ });
272
+ }
273
+ async manageOpen() {
274
+ var _a;
275
+ if (!this.isConnected)
276
+ return;
277
+ if (!this.hasUpdated) {
278
+ await this.updateComplete;
279
+ }
280
+ if (this.open) {
281
+ overlayStack.add(this);
282
+ } else {
283
+ overlayStack.remove(this);
284
+ }
285
+ if (this.usesDialog) {
286
+ this.manageDialogOpen();
287
+ } else {
288
+ this.managePopoverOpen();
289
+ }
290
+ if (this.open) {
291
+ _OverlayBase.openCount += 1;
292
+ } else {
293
+ const getAncestors = () => {
294
+ var _a2;
295
+ const ancestors = [];
296
+ let currentNode = document.activeElement;
297
+ while ((currentNode == null ? void 0 : currentNode.shadowRoot) && currentNode.shadowRoot.activeElement) {
298
+ currentNode = currentNode.shadowRoot.activeElement;
299
+ }
300
+ while (currentNode) {
301
+ const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_a2 = currentNode.getRootNode()) == null ? void 0 : _a2.host);
302
+ if (ancestor) {
303
+ ancestors.push(ancestor);
304
+ }
305
+ currentNode = ancestor;
306
+ }
307
+ return ancestors;
308
+ };
309
+ if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(
310
+ this.getRootNode().activeElement
311
+ ) || !!getAncestors().find((el) => el === this))) {
312
+ this.triggerElement.focus();
313
+ }
314
+ }
315
+ }
316
+ manageTriggerElement(triggerElement) {
317
+ if (triggerElement) {
318
+ triggerElement.removeEventListener("click", this.handleClick);
319
+ triggerElement.removeEventListener("focusin", this.handleFocusin);
320
+ triggerElement.removeEventListener("focusout", this.handleFocusout);
321
+ triggerElement.removeEventListener(
322
+ "pointerenter",
323
+ this.handlePointerenter
324
+ );
325
+ triggerElement.removeEventListener(
326
+ "pointerleave",
327
+ this.handlePointerleave
328
+ );
329
+ triggerElement.addEventListener(
330
+ "pointerdown",
331
+ this.handlePointerdown
332
+ );
333
+ triggerElement.removeEventListener("keydown", this.handleKeydown);
334
+ triggerElement.removeEventListener("keyup", this.handleKeyup);
335
+ triggerElement.removeEventListener(
336
+ "longpress",
337
+ this.handleLongpress
338
+ );
339
+ this.releaseAriaDescribedby();
340
+ }
341
+ if (!this.triggerElement || !!this.triggerElement.updateBoundingClientRect)
342
+ return;
343
+ const nextTriggerElement = this.triggerElement;
344
+ switch (this.triggerInteraction) {
345
+ case "click":
346
+ nextTriggerElement.addEventListener("click", this.handleClick);
347
+ return;
348
+ case "longpress":
349
+ nextTriggerElement.addEventListener(
350
+ "pointerdown",
351
+ this.handlePointerdown
352
+ );
353
+ nextTriggerElement.addEventListener(
354
+ "keydown",
355
+ this.handleKeydown
356
+ );
357
+ nextTriggerElement.addEventListener("keyup", this.handleKeyup);
358
+ nextTriggerElement.addEventListener(
359
+ "longpress",
360
+ this.handleLongpress
361
+ );
362
+ return;
363
+ case "hover":
364
+ nextTriggerElement.addEventListener(
365
+ "focusin",
366
+ this.handleFocusin
367
+ );
368
+ nextTriggerElement.addEventListener(
369
+ "focusout",
370
+ this.handleFocusout
371
+ );
372
+ nextTriggerElement.addEventListener(
373
+ "pointerenter",
374
+ this.handlePointerenter
375
+ );
376
+ nextTriggerElement.addEventListener(
377
+ "pointerleave",
378
+ this.handlePointerleave
379
+ );
380
+ if (this.receivesFocus === "true")
381
+ return;
382
+ const releaseAriaDescribedby = conditionAttributeWithId(
383
+ nextTriggerElement,
384
+ "aria-describedby",
385
+ [this.id]
386
+ );
387
+ this.releaseAriaDescribedby = () => {
388
+ releaseAriaDescribedby();
389
+ this.releaseAriaDescribedby = () => {
390
+ return;
391
+ };
392
+ };
393
+ return;
394
+ }
395
+ }
396
+ handleBeforetoggle({
397
+ newState: open
398
+ }) {
399
+ if (open === "open") {
400
+ this.handlePopovershow();
401
+ } else {
402
+ this.handlePopoverhide();
403
+ }
404
+ }
405
+ handlePopoverhide() {
406
+ this.open = false;
407
+ this.dispatchEvent(new BeforetoggleClosedEvent());
408
+ }
409
+ handlePopovershow() {
410
+ this.dispatchEvent(new BeforetoggleOpenEvent());
411
+ }
412
+ willUpdate(changes) {
413
+ var _a;
414
+ if (!this.hasAttribute("id")) {
415
+ this.setAttribute(
416
+ "id",
417
+ `${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0, 8)}`
418
+ );
419
+ }
420
+ if (changes.has("open") && (typeof changes.get("open") !== "undefined" || this.open)) {
421
+ this.manageOpen();
422
+ }
423
+ if (changes.has("trigger")) {
424
+ const [id, interaction] = ((_a = this.trigger) == null ? void 0 : _a.split("@")) || [];
425
+ this.elementResolver.selector = id ? `#${id}` : "";
426
+ this.triggerInteraction = interaction;
427
+ }
428
+ const oldTrigger = this.triggerElement;
429
+ if (changes.has(elementResolverUpdatedSymbol)) {
430
+ this.triggerElement = this.elementResolver.element;
431
+ this.manageTriggerElement(oldTrigger);
432
+ }
433
+ if (changes.has("triggerElement")) {
434
+ this.manageTriggerElement(changes.get("triggerElement"));
435
+ }
436
+ }
437
+ updated(changes) {
438
+ super.updated(changes);
439
+ if (changes.has("placement")) {
440
+ if (this.placement) {
441
+ this.dialogEl.setAttribute("actual-placement", this.placement);
442
+ } else {
443
+ this.dialogEl.removeAttribute("actual-placement");
444
+ }
445
+ if (typeof changes.get("placement") !== "undefined") {
446
+ this.managePosition();
447
+ }
448
+ }
449
+ }
450
+ render() {
451
+ const hasPopoverAttribute = "popover" in this;
452
+ const popoverValue = hasPopoverAttribute ? this.popoverValue : void 0;
453
+ return html`
454
+ <dialog
455
+ part="dialog"
456
+ popover=${ifDefined(popoverValue)}
457
+ @close=${() => {
458
+ this.open = false;
459
+ }}
460
+ @cancel=${() => {
461
+ this.open = false;
462
+ }}
463
+ @beforetoggle=${this.handleBeforetoggle}
464
+ @popovershow=${this.handlePopovershow}
465
+ style=${styleMap({
466
+ "--swc-overlay-z-index": _OverlayBase.openCount.toString()
467
+ })}
468
+ >
469
+ <div part="content">
470
+ <slot></slot>
471
+ </div>
472
+ </dialog>
473
+ `;
474
+ }
475
+ connectedCallback() {
476
+ super.connectedCallback();
477
+ this.addEventListener("close", () => {
478
+ this.open = false;
479
+ });
480
+ }
481
+ };
482
+ export let OverlayBase = _OverlayBase;
483
+ OverlayBase.styles = [styles];
484
+ OverlayBase.openCount = 1;
485
+ __decorateClass([
486
+ query("dialog")
487
+ ], OverlayBase.prototype, "dialogEl", 2);
488
+ __decorateClass([
489
+ property({ type: Boolean })
490
+ ], OverlayBase.prototype, "disabled", 1);
491
+ __decorateClass([
492
+ queryAssignedElements({ flatten: true })
493
+ ], OverlayBase.prototype, "elements", 2);
494
+ __decorateClass([
495
+ property()
496
+ ], OverlayBase.prototype, "offset", 2);
497
+ __decorateClass([
498
+ property({ type: Boolean, reflect: true })
499
+ ], OverlayBase.prototype, "open", 1);
500
+ __decorateClass([
501
+ property()
502
+ ], OverlayBase.prototype, "placement", 2);
503
+ __decorateClass([
504
+ property({ attribute: "receives-focus" })
505
+ ], OverlayBase.prototype, "receivesFocus", 2);
506
+ __decorateClass([
507
+ query("slot")
508
+ ], OverlayBase.prototype, "slotEl", 2);
509
+ __decorateClass([
510
+ property()
511
+ ], OverlayBase.prototype, "trigger", 2);
512
+ __decorateClass([
513
+ state()
514
+ ], OverlayBase.prototype, "triggerElement", 2);
515
+ __decorateClass([
516
+ state()
517
+ ], OverlayBase.prototype, "triggerInteraction", 2);
518
+ __decorateClass([
519
+ property()
520
+ ], OverlayBase.prototype, "type", 2);
521
+ //# sourceMappingURL=OverlayBase.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["OverlayBase.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport type { Placement } from '@floating-ui/dom';\nimport {\n html,\n PropertyValues,\n SpectrumElement,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n queryAssignedElements,\n state,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { conditionAttributeWithId } from '@spectrum-web-components/base/src/condition-attribute-with-id.js';\nimport {\n ElementResolutionController,\n elementResolverUpdatedSymbol,\n} from '@spectrum-web-components/reactive-controllers/src/ElementResolution.js';\nimport type { VirtualTrigger } from './VirtualTrigger.dev.js'\nimport {\n ifDefined,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport styles from './overlay-base.css.js';\nimport { overlayStack } from './OverlayStack.dev.js'\nimport { PlacementController } from './PlacementController.dev.js'\n\nexport type OpenableElement = HTMLElement & {\n open: boolean;\n tipElement?: HTMLElement;\n updateComplete?: Promise<void>;\n};\n\nexport type OverlayTypes = 'auto' | 'hint' | 'manual' | 'modal' | 'page';\n\nconst LONGPRESS_DURATION = 300;\n\nexport type LongpressEvent = {\n source: 'pointer' | 'keyboard';\n};\n\nexport const LONGPRESS_INSTRUCTIONS = {\n touch: 'Double tap and long press for additional options',\n keyboard: 'Press Space or Alt+Down Arrow for additional options',\n mouse: 'Click and hold for additional options',\n};\n\nexport class BeforetoggleClosedEvent extends Event {\n currentState = 'open';\n newState = 'closed';\n constructor() {\n super('beforetoggle', {\n bubbles: false,\n composed: false,\n });\n }\n}\n\nexport class BeforetoggleOpenEvent extends Event {\n currentState = 'closed';\n newState = 'open';\n constructor() {\n super('beforetoggle', {\n bubbles: false,\n composed: false,\n });\n }\n}\n\nexport class OverlayBase extends SpectrumElement {\n static override styles = [styles];\n\n @query('dialog')\n dialogEl!: HTMLDialogElement & {\n showPopover(): void;\n hidePopover(): void;\n };\n\n @property({ type: Boolean })\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (disabled) {\n this.wasOpen = this.open;\n this.open = false;\n } else {\n this.open = this.open || this.wasOpen;\n this.wasOpen = false;\n }\n }\n\n private _disabled = false;\n\n @queryAssignedElements({ flatten: true })\n elements!: OpenableElement[];\n\n public parentOverlayToForceClose?: OverlayBase;\n\n protected longpressed = false;\n\n private longressTimeout!: ReturnType<typeof setTimeout>;\n\n @property()\n offset: number | [number, number] = 6;\n\n public placementController = new PlacementController(this);\n\n @property({ type: Boolean, reflect: true })\n get open(): boolean {\n return this._open;\n }\n\n set open(open: boolean) {\n if (open && this.disabled) return;\n if (open === this.open) return;\n this._open = open;\n this.requestUpdate('open', !this.open);\n }\n\n private _open = false;\n\n static openCount = 1;\n\n @property()\n placement?: Placement;\n\n @property({ attribute: 'receives-focus' })\n receivesFocus: 'true' | 'false' | 'auto' = 'auto';\n\n private releaseAriaDescribedby = (): void => {\n return;\n };\n\n @query('slot')\n slotEl!: HTMLSlotElement;\n\n @property()\n trigger?: string;\n\n @state()\n triggerElement: HTMLElement | VirtualTrigger | null = null;\n\n @state()\n triggerInteraction?: 'click' | 'longpress' | 'hover';\n\n @property()\n type: OverlayTypes = 'hint';\n\n protected wasOpen = false;\n\n private elementResolver = new ElementResolutionController(this);\n\n private get usesDialog(): boolean {\n return this.type === 'modal' || this.type === 'page';\n }\n\n private get popoverValue(): 'auto' | 'manual' | undefined {\n switch (this.type) {\n case 'modal':\n case 'page':\n return undefined;\n case 'hint':\n return 'manual';\n default:\n return this.type;\n }\n }\n\n protected manageChildren(open: boolean): void {\n const eventName = open ? 'sp-opened' : 'sp-closed';\n let announced = false;\n this.elements.forEach((el) => {\n if (typeof el.open !== 'undefined') {\n el.open = open;\n el.dispatchEvent(\n new Event(eventName, {\n bubbles: false,\n composed: false,\n })\n );\n }\n if (!announced) {\n this.dispatchEvent(\n new Event(eventName, {\n bubbles: true,\n composed: true,\n })\n );\n announced = true;\n }\n });\n }\n\n protected async manageDialogOpen(): Promise<void> {\n console.warn(\n 'Implement the `manageDialogOpen` method in a class extension.'\n );\n }\n\n protected async managePopoverOpen(): Promise<void> {\n console.warn(\n 'Implement the `managePopoverOpen` method in a class extension.'\n );\n }\n\n protected get requiresPosition(): boolean {\n // Do no position \"page\" overlays as they should block the entrie UI.\n if (this.type === 'page' || !this.open) return false;\n // Do not position content without a trigger element, what would you position it in relation to?\n // Do not automaticallyu position contnent, unless it is a \"hint\".\n if (!this.triggerElement || (!this.placement && this.type !== 'hint'))\n return false;\n return true;\n }\n\n protected managePosition(): void {\n if (!this.requiresPosition) return;\n\n const offset = this.offset || 0;\n const trigger = this.triggerElement as HTMLElement;\n const placement = (this.placement as Placement) || 'right';\n\n this.placementController.placeOverlay(this.dialogEl, {\n // delayed?: boolean,\n offset,\n placement,\n // notImmediatelyClosable?: boolean, // rename or place behind other API options\n // receivesFocus?: 'auto';\n // root?: HTMLElement;\n trigger,\n type: this.type,\n });\n }\n\n protected async manageOpen(): Promise<void> {\n if (!this.isConnected) return;\n\n if (!this.hasUpdated) {\n await this.updateComplete;\n }\n\n if (this.open) {\n overlayStack.add(this);\n } else {\n overlayStack.remove(this);\n }\n\n if (this.usesDialog) {\n this.manageDialogOpen();\n } else {\n this.managePopoverOpen();\n }\n if (this.open) {\n OverlayBase.openCount += 1;\n // this.manageChildren(this.open);\n // this.managePosition();\n } else {\n // If the focus remains inside of the overlay or\n // a slotted descendent of the overlay you need to return\n // focus back to the trigger.\n const getAncestors = (): HTMLElement[] => {\n const ancestors: HTMLElement[] = [];\n // eslint-disable-next-line @spectrum-web-components/document-active-element\n let currentNode = document.activeElement;\n while (\n currentNode?.shadowRoot &&\n currentNode.shadowRoot.activeElement\n ) {\n currentNode = currentNode.shadowRoot.activeElement;\n }\n while (currentNode) {\n const ancestor =\n currentNode.assignedSlot ||\n currentNode.parentElement ||\n (currentNode.getRootNode() as ShadowRoot)?.host;\n if (ancestor) {\n ancestors.push(ancestor as HTMLElement);\n }\n currentNode = ancestor;\n }\n return ancestors;\n };\n if (\n (this.triggerElement as HTMLElement)?.focus &&\n (this.contains(\n (this.getRootNode() as Document).activeElement\n ) ||\n !!getAncestors().find((el) => el === this))\n ) {\n (this.triggerElement as HTMLElement).focus();\n }\n }\n }\n\n protected manageTriggerElement(triggerElement: HTMLElement | null): void {\n if (triggerElement) {\n triggerElement.removeEventListener('click', this.handleClick);\n triggerElement.removeEventListener('focusin', this.handleFocusin);\n triggerElement.removeEventListener('focusout', this.handleFocusout);\n triggerElement.removeEventListener(\n 'pointerenter',\n this.handlePointerenter\n );\n triggerElement.removeEventListener(\n 'pointerleave',\n this.handlePointerleave\n );\n triggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdown\n );\n triggerElement.removeEventListener('keydown', this.handleKeydown);\n triggerElement.removeEventListener('keyup', this.handleKeyup);\n triggerElement.removeEventListener(\n 'longpress',\n this.handleLongpress\n );\n this.releaseAriaDescribedby();\n }\n if (\n !this.triggerElement ||\n !!(this.triggerElement as VirtualTrigger).updateBoundingClientRect\n )\n return;\n const nextTriggerElement = this.triggerElement as HTMLElement;\n switch (this.triggerInteraction) {\n case 'click':\n nextTriggerElement.addEventListener('click', this.handleClick);\n return;\n case 'longpress':\n nextTriggerElement.addEventListener(\n 'pointerdown',\n this.handlePointerdown\n );\n nextTriggerElement.addEventListener(\n 'keydown',\n this.handleKeydown\n );\n nextTriggerElement.addEventListener('keyup', this.handleKeyup);\n nextTriggerElement.addEventListener(\n 'longpress',\n this.handleLongpress\n );\n return;\n case 'hover':\n nextTriggerElement.addEventListener(\n 'focusin',\n this.handleFocusin\n );\n nextTriggerElement.addEventListener(\n 'focusout',\n this.handleFocusout\n );\n nextTriggerElement.addEventListener(\n 'pointerenter',\n this.handlePointerenter\n );\n nextTriggerElement.addEventListener(\n 'pointerleave',\n this.handlePointerleave\n );\n if (this.receivesFocus === 'true') return;\n\n const releaseAriaDescribedby = conditionAttributeWithId(\n nextTriggerElement,\n 'aria-describedby',\n [this.id]\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.releaseAriaDescribedby = () => {\n return;\n };\n };\n return;\n }\n }\n\n private handlePointerdown = (event: PointerEvent): void => {\n if (!this.triggerElement) return;\n if (event.button !== 0) return;\n const triggerElement = this.triggerElement as HTMLElement;\n this.longpressed = false;\n triggerElement.addEventListener('pointerup', this.handlePointerup);\n triggerElement.addEventListener('pointercancel', this.handlePointerup);\n this.longressTimeout = setTimeout(() => {\n if (!triggerElement) return;\n triggerElement.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'pointer',\n },\n })\n );\n }, LONGPRESS_DURATION);\n };\n\n private handlePointerup = (): void => {\n clearTimeout(this.longressTimeout);\n if (!this.triggerElement) return;\n if (this.longpressed) {\n this.open = true;\n }\n setTimeout(() => {\n this.longpressed = false;\n });\n const triggerElement = this.triggerElement as HTMLElement;\n triggerElement.removeEventListener('pointerup', this.handlePointerup);\n triggerElement.removeEventListener(\n 'pointercancel',\n this.handlePointerup\n );\n };\n\n /**\n * @private\n */\n protected handleKeydown = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n if (code === 'ArrowDown') {\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n }\n };\n\n protected handleKeyup = (event: KeyboardEvent): void => {\n const { code, altKey } = event;\n if (code === 'Space' || (altKey && code === 'ArrowDown')) {\n event.stopPropagation();\n this.dispatchEvent(\n new CustomEvent<LongpressEvent>('longpress', {\n bubbles: true,\n composed: true,\n detail: {\n source: 'keyboard',\n },\n })\n );\n }\n };\n\n protected handleClick = (): void => {\n if (this.longpressed) return;\n this.open = !this.open;\n };\n\n private focusedin = false;\n\n protected handleFocusin = (): void => {\n this.open = true;\n this.focusedin = true;\n };\n\n protected handleFocusout = (): void => {\n this.focusedin = false;\n if (this.pointerentered) return;\n this.open = false;\n };\n\n private pointerentered = false;\n\n protected handlePointerenter = (): void => {\n this.open = true;\n this.pointerentered = true;\n };\n\n protected handlePointerleave = (): void => {\n this.pointerentered = false;\n const triggerElement = this.triggerElement as HTMLElement;\n if (this.focusedin && triggerElement.matches(':focus-visible')) return;\n this.open = false;\n };\n\n protected handleLongpress = (): void => {\n this.open = true;\n this.longpressed = true;\n };\n\n protected handleBeforetoggle({\n newState: open,\n }: Event & { newState: string }): void {\n if (open === 'open') {\n this.handlePopovershow();\n } else {\n this.handlePopoverhide();\n }\n }\n\n protected handlePopoverhide(): void {\n this.open = false;\n this.dispatchEvent(new BeforetoggleClosedEvent());\n // const triggerElement = this.triggerElement as HTMLElement;\n // if (this.triggerInteraction === 'click') {\n // requestAnimationFrame(() => {\n // triggerElement.addEventListener('click', this.handleClick);\n // });\n // }\n }\n\n protected handlePopovershow(): void {\n this.dispatchEvent(new BeforetoggleOpenEvent());\n }\n\n override willUpdate(changes: PropertyValues): void {\n if (!this.hasAttribute('id')) {\n this.setAttribute(\n 'id',\n `${this.tagName.toLowerCase()}-${crypto\n .randomUUID()\n .slice(0, 8)}`\n );\n }\n if (\n changes.has('open') &&\n (typeof changes.get('open') !== 'undefined' || this.open)\n ) {\n this.manageOpen();\n }\n if (changes.has('trigger')) {\n const [id, interaction] = this.trigger?.split('@') || [];\n this.elementResolver.selector = id ? `#${id}` : '';\n this.triggerInteraction = interaction as\n | 'click'\n | 'longpress'\n | 'hover'\n | undefined;\n }\n const oldTrigger = this.triggerElement as HTMLElement;\n if (changes.has(elementResolverUpdatedSymbol)) {\n this.triggerElement = this.elementResolver.element;\n this.manageTriggerElement(oldTrigger);\n }\n if (changes.has('triggerElement')) {\n this.manageTriggerElement(changes.get('triggerElement'));\n }\n }\n\n protected override updated(changes: PropertyValues): void {\n super.updated(changes);\n if (changes.has('placement')) {\n if (this.placement) {\n this.dialogEl.setAttribute('actual-placement', this.placement);\n } else {\n this.dialogEl.removeAttribute('actual-placement');\n }\n if (typeof changes.get('placement') !== 'undefined') {\n this.managePosition();\n }\n }\n }\n\n public override render(): TemplateResult {\n const hasPopoverAttribute = 'popover' in this;\n const popoverValue = hasPopoverAttribute\n ? this.popoverValue\n : undefined;\n return html`\n <dialog\n part=\"dialog\"\n popover=${ifDefined(popoverValue)}\n @close=${() => {\n this.open = false;\n }}\n @cancel=${() => {\n this.open = false;\n }}\n @beforetoggle=${this.handleBeforetoggle}\n @popovershow=${this.handlePopovershow}\n style=${styleMap({\n '--swc-overlay-z-index': OverlayBase.openCount.toString(),\n })}\n >\n <div part=\"content\">\n <slot></slot>\n </div>\n </dialog>\n `;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // this.manageOpen();\n this.addEventListener('close', () => {\n this.open = false;\n });\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;AAaA;AAAA,EACI;AAAA,EAEA;AAAA,OAEG;AACP;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,gCAAgC;AACzC;AAAA,EACI;AAAA,EACA;AAAA,OACG;AAEP;AAAA,EACI;AAAA,EACA;AAAA,OACG;AACP,OAAO,YAAY;AACnB,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAUpC,MAAM,qBAAqB;AAMpB,aAAM,yBAAyB;AAAA,EAClC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AACX;AAEO,aAAM,gCAAgC,MAAM;AAAA,EAG/C,cAAc;AACV,UAAM,gBAAgB;AAAA,MAClB,SAAS;AAAA,MACT,UAAU;AAAA,IACd,CAAC;AANL,wBAAe;AACf,oBAAW;AAAA,EAMX;AACJ;AAEO,aAAM,8BAA8B,MAAM;AAAA,EAG7C,cAAc;AACV,UAAM,gBAAgB;AAAA,MAClB,SAAS;AAAA,MACT,UAAU;AAAA,IACd,CAAC;AANL,wBAAe;AACf,oBAAW;AAAA,EAMX;AACJ;AAEO,MAAM,eAAN,cAA0B,gBAAgB;AAAA,EAA1C;AAAA;AAyBH,SAAQ,YAAY;AAOpB,SAAU,cAAc;AAKxB,kBAAoC;AAEpC,SAAO,sBAAsB,IAAI,oBAAoB,IAAI;AAczD,SAAQ,QAAQ;AAQhB,yBAA2C;AAE3C,SAAQ,yBAAyB,MAAY;AACzC;AAAA,IACJ;AASA,0BAAsD;AAMtD,gBAAqB;AAErB,SAAU,UAAU;AAEpB,SAAQ,kBAAkB,IAAI,4BAA4B,IAAI;AAoO9D,SAAQ,oBAAoB,CAAC,UAA8B;AACvD,UAAI,CAAC,KAAK;AAAgB;AAC1B,UAAI,MAAM,WAAW;AAAG;AACxB,YAAM,iBAAiB,KAAK;AAC5B,WAAK,cAAc;AACnB,qBAAe,iBAAiB,aAAa,KAAK,eAAe;AACjE,qBAAe,iBAAiB,iBAAiB,KAAK,eAAe;AACrE,WAAK,kBAAkB,WAAW,MAAM;AACpC,YAAI,CAAC;AAAgB;AACrB,uBAAe;AAAA,UACX,IAAI,YAA4B,aAAa;AAAA,YACzC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,cACJ,QAAQ;AAAA,YACZ;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,GAAG,kBAAkB;AAAA,IACzB;AAEA,SAAQ,kBAAkB,MAAY;AAClC,mBAAa,KAAK,eAAe;AACjC,UAAI,CAAC,KAAK;AAAgB;AAC1B,UAAI,KAAK,aAAa;AAClB,aAAK,OAAO;AAAA,MAChB;AACA,iBAAW,MAAM;AACb,aAAK,cAAc;AAAA,MACvB,CAAC;AACD,YAAM,iBAAiB,KAAK;AAC5B,qBAAe,oBAAoB,aAAa,KAAK,eAAe;AACpE,qBAAe;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAKA;AAAA;AAAA;AAAA,SAAU,gBAAgB,CAAC,UAA+B;AACtD,YAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAI,SAAS,WAAY,UAAU,SAAS,aAAc;AACtD,YAAI,SAAS,aAAa;AACtB,gBAAM,gBAAgB;AACtB,gBAAM,yBAAyB;AAAA,QACnC;AAAA,MACJ;AAAA,IACJ;AAEA,SAAU,cAAc,CAAC,UAA+B;AACpD,YAAM,EAAE,MAAM,OAAO,IAAI;AACzB,UAAI,SAAS,WAAY,UAAU,SAAS,aAAc;AACtD,cAAM,gBAAgB;AACtB,aAAK;AAAA,UACD,IAAI,YAA4B,aAAa;AAAA,YACzC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,cACJ,QAAQ;AAAA,YACZ;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAEA,SAAU,cAAc,MAAY;AAChC,UAAI,KAAK;AAAa;AACtB,WAAK,OAAO,CAAC,KAAK;AAAA,IACtB;AAEA,SAAQ,YAAY;AAEpB,SAAU,gBAAgB,MAAY;AAClC,WAAK,OAAO;AACZ,WAAK,YAAY;AAAA,IACrB;AAEA,SAAU,iBAAiB,MAAY;AACnC,WAAK,YAAY;AACjB,UAAI,KAAK;AAAgB;AACzB,WAAK,OAAO;AAAA,IAChB;AAEA,SAAQ,iBAAiB;AAEzB,SAAU,qBAAqB,MAAY;AACvC,WAAK,OAAO;AACZ,WAAK,iBAAiB;AAAA,IAC1B;AAEA,SAAU,qBAAqB,MAAY;AACvC,WAAK,iBAAiB;AACtB,YAAM,iBAAiB,KAAK;AAC5B,UAAI,KAAK,aAAa,eAAe,QAAQ,gBAAgB;AAAG;AAChE,WAAK,OAAO;AAAA,IAChB;AAEA,SAAU,kBAAkB,MAAY;AACpC,WAAK,OAAO;AACZ,WAAK,cAAc;AAAA,IACvB;AAAA;AAAA,EApZA,IAAI,WAAoB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,SAAS,UAAmB;AAC5B,SAAK,YAAY;AACjB,QAAI,UAAU;AACV,WAAK,UAAU,KAAK;AACpB,WAAK,OAAO;AAAA,IAChB,OAAO;AACH,WAAK,OAAO,KAAK,QAAQ,KAAK;AAC9B,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAAA,EAmBA,IAAI,OAAgB;AAChB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,KAAK,MAAe;AACpB,QAAI,QAAQ,KAAK;AAAU;AAC3B,QAAI,SAAS,KAAK;AAAM;AACxB,SAAK,QAAQ;AACb,SAAK,cAAc,QAAQ,CAAC,KAAK,IAAI;AAAA,EACzC;AAAA,EAmCA,IAAY,aAAsB;AAC9B,WAAO,KAAK,SAAS,WAAW,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,IAAY,eAA8C;AACtD,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO,KAAK;AAAA,IACpB;AAAA,EACJ;AAAA,EAEU,eAAe,MAAqB;AAC1C,UAAM,YAAY,OAAO,cAAc;AACvC,QAAI,YAAY;AAChB,SAAK,SAAS,QAAQ,CAAC,OAAO;AAC1B,UAAI,OAAO,GAAG,SAAS,aAAa;AAChC,WAAG,OAAO;AACV,WAAG;AAAA,UACC,IAAI,MAAM,WAAW;AAAA,YACjB,SAAS;AAAA,YACT,UAAU;AAAA,UACd,CAAC;AAAA,QACL;AAAA,MACJ;AACA,UAAI,CAAC,WAAW;AACZ,aAAK;AAAA,UACD,IAAI,MAAM,WAAW;AAAA,YACjB,SAAS;AAAA,YACT,UAAU;AAAA,UACd,CAAC;AAAA,QACL;AACA,oBAAY;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAgB,mBAAkC;AAC9C,YAAQ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAgB,oBAAmC;AAC/C,YAAQ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,IAAc,mBAA4B;AAEtC,QAAI,KAAK,SAAS,UAAU,CAAC,KAAK;AAAM,aAAO;AAG/C,QAAI,CAAC,KAAK,kBAAmB,CAAC,KAAK,aAAa,KAAK,SAAS;AAC1D,aAAO;AACX,WAAO;AAAA,EACX;AAAA,EAEU,iBAAuB;AAC7B,QAAI,CAAC,KAAK;AAAkB;AAE5B,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,UAAU,KAAK;AACrB,UAAM,YAAa,KAAK,aAA2B;AAEnD,SAAK,oBAAoB,aAAa,KAAK,UAAU;AAAA;AAAA,MAEjD;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,MACA,MAAM,KAAK;AAAA,IACf,CAAC;AAAA,EACL;AAAA,EAEA,MAAgB,aAA4B;AAzPhD;AA0PQ,QAAI,CAAC,KAAK;AAAa;AAEvB,QAAI,CAAC,KAAK,YAAY;AAClB,YAAM,KAAK;AAAA,IACf;AAEA,QAAI,KAAK,MAAM;AACX,mBAAa,IAAI,IAAI;AAAA,IACzB,OAAO;AACH,mBAAa,OAAO,IAAI;AAAA,IAC5B;AAEA,QAAI,KAAK,YAAY;AACjB,WAAK,iBAAiB;AAAA,IAC1B,OAAO;AACH,WAAK,kBAAkB;AAAA,IAC3B;AACA,QAAI,KAAK,MAAM;AACX,mBAAY,aAAa;AAAA,IAG7B,OAAO;AAIH,YAAM,eAAe,MAAqB;AAnRtD,YAAAA;AAoRgB,cAAM,YAA2B,CAAC;AAElC,YAAI,cAAc,SAAS;AAC3B,gBACI,2CAAa,eACb,YAAY,WAAW,eACzB;AACE,wBAAc,YAAY,WAAW;AAAA,QACzC;AACA,eAAO,aAAa;AAChB,gBAAM,WACF,YAAY,gBACZ,YAAY,mBACXA,MAAA,YAAY,YAAY,MAAxB,gBAAAA,IAA0C;AAC/C,cAAI,UAAU;AACV,sBAAU,KAAK,QAAuB;AAAA,UAC1C;AACA,wBAAc;AAAA,QAClB;AACA,eAAO;AAAA,MACX;AACA,YACK,UAAK,mBAAL,mBAAqC,WACrC,KAAK;AAAA,QACD,KAAK,YAAY,EAAe;AAAA,MACrC,KACI,CAAC,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,OAAO,IAAI,IAC/C;AACE,QAAC,KAAK,eAA+B,MAAM;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEU,qBAAqB,gBAA0C;AACrE,QAAI,gBAAgB;AAChB,qBAAe,oBAAoB,SAAS,KAAK,WAAW;AAC5D,qBAAe,oBAAoB,WAAW,KAAK,aAAa;AAChE,qBAAe,oBAAoB,YAAY,KAAK,cAAc;AAClE,qBAAe;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACT;AACA,qBAAe;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACT;AACA,qBAAe;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACT;AACA,qBAAe,oBAAoB,WAAW,KAAK,aAAa;AAChE,qBAAe,oBAAoB,SAAS,KAAK,WAAW;AAC5D,qBAAe;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACT;AACA,WAAK,uBAAuB;AAAA,IAChC;AACA,QACI,CAAC,KAAK,kBACN,CAAC,CAAE,KAAK,eAAkC;AAE1C;AACJ,UAAM,qBAAqB,KAAK;AAChC,YAAQ,KAAK,oBAAoB;AAAA,MAC7B,KAAK;AACD,2BAAmB,iBAAiB,SAAS,KAAK,WAAW;AAC7D;AAAA,MACJ,KAAK;AACD,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA,2BAAmB,iBAAiB,SAAS,KAAK,WAAW;AAC7D,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA;AAAA,MACJ,KAAK;AACD,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA,2BAAmB;AAAA,UACf;AAAA,UACA,KAAK;AAAA,QACT;AACA,YAAI,KAAK,kBAAkB;AAAQ;AAEnC,cAAM,yBAAyB;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,CAAC,KAAK,EAAE;AAAA,QACZ;AACA,aAAK,yBAAyB,MAAM;AAChC,iCAAuB;AACvB,eAAK,yBAAyB,MAAM;AAChC;AAAA,UACJ;AAAA,QACJ;AACA;AAAA,IACR;AAAA,EACJ;AAAA,EA0GU,mBAAmB;AAAA,IACzB,UAAU;AAAA,EACd,GAAuC;AACnC,QAAI,SAAS,QAAQ;AACjB,WAAK,kBAAkB;AAAA,IAC3B,OAAO;AACH,WAAK,kBAAkB;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEU,oBAA0B;AAChC,SAAK,OAAO;AACZ,SAAK,cAAc,IAAI,wBAAwB,CAAC;AAAA,EAOpD;AAAA,EAEU,oBAA0B;AAChC,SAAK,cAAc,IAAI,sBAAsB,CAAC;AAAA,EAClD;AAAA,EAES,WAAW,SAA+B;AA1gBvD;AA2gBQ,QAAI,CAAC,KAAK,aAAa,IAAI,GAAG;AAC1B,WAAK;AAAA,QACD;AAAA,QACA,GAAG,KAAK,QAAQ,YAAY,KAAK,OAC5B,WAAW,EACX,MAAM,GAAG,CAAC;AAAA,MACnB;AAAA,IACJ;AACA,QACI,QAAQ,IAAI,MAAM,MACjB,OAAO,QAAQ,IAAI,MAAM,MAAM,eAAe,KAAK,OACtD;AACE,WAAK,WAAW;AAAA,IACpB;AACA,QAAI,QAAQ,IAAI,SAAS,GAAG;AACxB,YAAM,CAAC,IAAI,WAAW,MAAI,UAAK,YAAL,mBAAc,MAAM,SAAQ,CAAC;AACvD,WAAK,gBAAgB,WAAW,KAAK,IAAI,OAAO;AAChD,WAAK,qBAAqB;AAAA,IAK9B;AACA,UAAM,aAAa,KAAK;AACxB,QAAI,QAAQ,IAAI,4BAA4B,GAAG;AAC3C,WAAK,iBAAiB,KAAK,gBAAgB;AAC3C,WAAK,qBAAqB,UAAU;AAAA,IACxC;AACA,QAAI,QAAQ,IAAI,gBAAgB,GAAG;AAC/B,WAAK,qBAAqB,QAAQ,IAAI,gBAAgB,CAAC;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEmB,QAAQ,SAA+B;AACtD,UAAM,QAAQ,OAAO;AACrB,QAAI,QAAQ,IAAI,WAAW,GAAG;AAC1B,UAAI,KAAK,WAAW;AAChB,aAAK,SAAS,aAAa,oBAAoB,KAAK,SAAS;AAAA,MACjE,OAAO;AACH,aAAK,SAAS,gBAAgB,kBAAkB;AAAA,MACpD;AACA,UAAI,OAAO,QAAQ,IAAI,WAAW,MAAM,aAAa;AACjD,aAAK,eAAe;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEgB,SAAyB;AACrC,UAAM,sBAAsB,aAAa;AACzC,UAAM,eAAe,sBACf,KAAK,eACL;AACN,WAAO;AAAA;AAAA;AAAA,0BAGW,UAAU,YAAY;AAAA,yBACvB,MAAM;AACX,WAAK,OAAO;AAAA,IAChB;AAAA,0BACU,MAAM;AACZ,WAAK,OAAO;AAAA,IAChB;AAAA,gCACgB,KAAK;AAAA,+BACN,KAAK;AAAA,wBACZ,SAAS;AAAA,MACb,yBAAyB,aAAY,UAAU,SAAS;AAAA,IAC5D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb;AAAA,EAES,oBAA0B;AAC/B,UAAM,kBAAkB;AAExB,SAAK,iBAAiB,SAAS,MAAM;AACjC,WAAK,OAAO;AAAA,IAChB,CAAC;AAAA,EACL;AACJ;AA5gBO,WAAM,cAAN;AAAM,YACO,SAAS,CAAC,MAAM;AADvB,YAuDF,YAAY;AAnDnB;AAAA,EADC,MAAM,QAAQ;AAAA,GAHN,YAIT;AAMI;AAAA,EADH,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GATlB,YAUL;AAkBJ;AAAA,EADC,sBAAsB,EAAE,SAAS,KAAK,CAAC;AAAA,GA3B/B,YA4BT;AASA;AAAA,EADC,SAAS;AAAA,GApCD,YAqCT;AAKI;AAAA,EADH,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAzCjC,YA0CL;AAgBJ;AAAA,EADC,SAAS;AAAA,GAzDD,YA0DT;AAGA;AAAA,EADC,SAAS,EAAE,WAAW,iBAAiB,CAAC;AAAA,GA5DhC,YA6DT;AAOA;AAAA,EADC,MAAM,MAAM;AAAA,GAnEJ,YAoET;AAGA;AAAA,EADC,SAAS;AAAA,GAtED,YAuET;AAGA;AAAA,EADC,MAAM;AAAA,GAzEE,YA0ET;AAGA;AAAA,EADC,MAAM;AAAA,GA5EE,YA6ET;AAGA;AAAA,EADC,SAAS;AAAA,GA/ED,YAgFT;",
6
+ "names": ["_a"]
7
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";var m=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var i=(l,r,e,t)=>{for(var o=t>1?void 0:t?g(r,e):r,n=l.length-1,s;n>=0;n--)(s=l[n])&&(o=(t?s(r,e,o):s(o))||o);return t&&o&&m(r,e,o),o};import{html as v,SpectrumElement as f}from"@spectrum-web-components/base";import{property as a,query as h,queryAssignedElements as E,state as c}from"@spectrum-web-components/base/src/decorators.js";import{conditionAttributeWithId as b}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{ElementResolutionController as w,elementResolverUpdatedSymbol as y}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{ifDefined as L,styleMap as P}from"@spectrum-web-components/base/src/directives.js";import T from"./overlay-base.css.js";import{overlayStack as u}from"./OverlayStack.js";import{PlacementController as C}from"./PlacementController.js";const S=300;export const LONGPRESS_INSTRUCTIONS={touch:"Double tap and long press for additional options",keyboard:"Press Space or Alt+Down Arrow for additional options",mouse:"Click and hold for additional options"};export class BeforetoggleClosedEvent extends Event{constructor(){super("beforetoggle",{bubbles:!1,composed:!1});this.currentState="open";this.newState="closed"}}export class BeforetoggleOpenEvent extends Event{constructor(){super("beforetoggle",{bubbles:!1,composed:!1});this.currentState="closed";this.newState="open"}}const p=class extends f{constructor(){super(...arguments);this._disabled=!1;this.longpressed=!1;this.offset=6;this.placementController=new C(this);this._open=!1;this.receivesFocus="auto";this.releaseAriaDescribedby=()=>{};this.triggerElement=null;this.type="hint";this.wasOpen=!1;this.elementResolver=new w(this);this.handlePointerdown=e=>{if(!this.triggerElement||e.button!==0)return;const t=this.triggerElement;this.longpressed=!1,t.addEventListener("pointerup",this.handlePointerup),t.addEventListener("pointercancel",this.handlePointerup),this.longressTimeout=setTimeout(()=>{t&&t.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"pointer"}}))},S)};this.handlePointerup=()=>{if(clearTimeout(this.longressTimeout),!this.triggerElement)return;this.longpressed&&(this.open=!0),setTimeout(()=>{this.longpressed=!1});const e=this.triggerElement;e.removeEventListener("pointerup",this.handlePointerup),e.removeEventListener("pointercancel",this.handlePointerup)};this.handleKeydown=e=>{const{code:t,altKey:o}=e;(t==="Space"||o&&t==="ArrowDown")&&t==="ArrowDown"&&(e.stopPropagation(),e.stopImmediatePropagation())};this.handleKeyup=e=>{const{code:t,altKey:o}=e;(t==="Space"||o&&t==="ArrowDown")&&(e.stopPropagation(),this.dispatchEvent(new CustomEvent("longpress",{bubbles:!0,composed:!0,detail:{source:"keyboard"}})))};this.handleClick=()=>{this.longpressed||(this.open=!this.open)};this.focusedin=!1;this.handleFocusin=()=>{this.open=!0,this.focusedin=!0};this.handleFocusout=()=>{this.focusedin=!1,!this.pointerentered&&(this.open=!1)};this.pointerentered=!1;this.handlePointerenter=()=>{this.open=!0,this.pointerentered=!0};this.handlePointerleave=()=>{this.pointerentered=!1;const e=this.triggerElement;this.focusedin&&e.matches(":focus-visible")||(this.open=!1)};this.handleLongpress=()=>{this.open=!0,this.longpressed=!0}}get disabled(){return this._disabled}set disabled(e){this._disabled=e,e?(this.wasOpen=this.open,this.open=!1):(this.open=this.open||this.wasOpen,this.wasOpen=!1)}get open(){return this._open}set open(e){e&&this.disabled||e!==this.open&&(this._open=e,this.requestUpdate("open",!this.open))}get usesDialog(){return this.type==="modal"||this.type==="page"}get popoverValue(){switch(this.type){case"modal":case"page":return;case"hint":return"manual";default:return this.type}}manageChildren(e){const t=e?"sp-opened":"sp-closed";let o=!1;this.elements.forEach(n=>{typeof n.open!="undefined"&&(n.open=e,n.dispatchEvent(new Event(t,{bubbles:!1,composed:!1}))),o||(this.dispatchEvent(new Event(t,{bubbles:!0,composed:!0})),o=!0)})}async manageDialogOpen(){console.warn("Implement the `manageDialogOpen` method in a class extension.")}async managePopoverOpen(){console.warn("Implement the `managePopoverOpen` method in a class extension.")}get requiresPosition(){return!(this.type==="page"||!this.open||!this.triggerElement||!this.placement&&this.type!=="hint")}managePosition(){if(!this.requiresPosition)return;const e=this.offset||0,t=this.triggerElement,o=this.placement||"right";this.placementController.placeOverlay(this.dialogEl,{offset:e,placement:o,trigger:t,type:this.type})}async manageOpen(){var e;if(this.isConnected)if(this.hasUpdated||await this.updateComplete,this.open?u.add(this):u.remove(this),this.usesDialog?this.manageDialogOpen():this.managePopoverOpen(),this.open)p.openCount+=1;else{const t=()=>{var s;const o=[];let n=document.activeElement;for(;n!=null&&n.shadowRoot&&n.shadowRoot.activeElement;)n=n.shadowRoot.activeElement;for(;n;){const d=n.assignedSlot||n.parentElement||((s=n.getRootNode())==null?void 0:s.host);d&&o.push(d),n=d}return o};(e=this.triggerElement)!=null&&e.focus&&(this.contains(this.getRootNode().activeElement)||t().find(o=>o===this))&&this.triggerElement.focus()}}manageTriggerElement(e){if(e&&(e.removeEventListener("click",this.handleClick),e.removeEventListener("focusin",this.handleFocusin),e.removeEventListener("focusout",this.handleFocusout),e.removeEventListener("pointerenter",this.handlePointerenter),e.removeEventListener("pointerleave",this.handlePointerleave),e.addEventListener("pointerdown",this.handlePointerdown),e.removeEventListener("keydown",this.handleKeydown),e.removeEventListener("keyup",this.handleKeyup),e.removeEventListener("longpress",this.handleLongpress),this.releaseAriaDescribedby()),!this.triggerElement||this.triggerElement.updateBoundingClientRect)return;const t=this.triggerElement;switch(this.triggerInteraction){case"click":t.addEventListener("click",this.handleClick);return;case"longpress":t.addEventListener("pointerdown",this.handlePointerdown),t.addEventListener("keydown",this.handleKeydown),t.addEventListener("keyup",this.handleKeyup),t.addEventListener("longpress",this.handleLongpress);return;case"hover":if(t.addEventListener("focusin",this.handleFocusin),t.addEventListener("focusout",this.handleFocusout),t.addEventListener("pointerenter",this.handlePointerenter),t.addEventListener("pointerleave",this.handlePointerleave),this.receivesFocus==="true")return;const o=b(t,"aria-describedby",[this.id]);this.releaseAriaDescribedby=()=>{o(),this.releaseAriaDescribedby=()=>{}};return}}handleBeforetoggle({newState:e}){e==="open"?this.handlePopovershow():this.handlePopoverhide()}handlePopoverhide(){this.open=!1,this.dispatchEvent(new BeforetoggleClosedEvent)}handlePopovershow(){this.dispatchEvent(new BeforetoggleOpenEvent)}willUpdate(e){var o;if(this.hasAttribute("id")||this.setAttribute("id",`${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0,8)}`),e.has("open")&&(typeof e.get("open")!="undefined"||this.open)&&this.manageOpen(),e.has("trigger")){const[n,s]=((o=this.trigger)==null?void 0:o.split("@"))||[];this.elementResolver.selector=n?`#${n}`:"",this.triggerInteraction=s}const t=this.triggerElement;e.has(y)&&(this.triggerElement=this.elementResolver.element,this.manageTriggerElement(t)),e.has("triggerElement")&&this.manageTriggerElement(e.get("triggerElement"))}updated(e){super.updated(e),e.has("placement")&&(this.placement?this.dialogEl.setAttribute("actual-placement",this.placement):this.dialogEl.removeAttribute("actual-placement"),typeof e.get("placement")!="undefined"&&this.managePosition())}render(){const t="popover"in this?this.popoverValue:void 0;return v`
2
+ <dialog
3
+ part="dialog"
4
+ popover=${L(t)}
5
+ @close=${()=>{this.open=!1}}
6
+ @cancel=${()=>{this.open=!1}}
7
+ @beforetoggle=${this.handleBeforetoggle}
8
+ @popovershow=${this.handlePopovershow}
9
+ style=${P({"--swc-overlay-z-index":p.openCount.toString()})}
10
+ >
11
+ <div part="content">
12
+ <slot></slot>
13
+ </div>
14
+ </dialog>
15
+ `}connectedCallback(){super.connectedCallback(),this.addEventListener("close",()=>{this.open=!1})}};export let OverlayBase=p;OverlayBase.styles=[T],OverlayBase.openCount=1,i([h("dialog")],OverlayBase.prototype,"dialogEl",2),i([a({type:Boolean})],OverlayBase.prototype,"disabled",1),i([E({flatten:!0})],OverlayBase.prototype,"elements",2),i([a()],OverlayBase.prototype,"offset",2),i([a({type:Boolean,reflect:!0})],OverlayBase.prototype,"open",1),i([a()],OverlayBase.prototype,"placement",2),i([a({attribute:"receives-focus"})],OverlayBase.prototype,"receivesFocus",2),i([h("slot")],OverlayBase.prototype,"slotEl",2),i([a()],OverlayBase.prototype,"trigger",2),i([c()],OverlayBase.prototype,"triggerElement",2),i([c()],OverlayBase.prototype,"triggerInteraction",2),i([a()],OverlayBase.prototype,"type",2);
16
+ //# sourceMappingURL=OverlayBase.js.map