@spectrum-web-components/overlay 0.19.3 → 0.19.4-overlay.22

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 (156) hide show
  1. package/package.json +50 -21
  2. package/sp-overlay.d.ts +6 -0
  3. package/sp-overlay.dev.js +4 -0
  4. package/{active-overlay.js.map → sp-overlay.dev.js.map} +4 -4
  5. package/sp-overlay.js +2 -0
  6. package/sp-overlay.js.map +7 -0
  7. package/src/Overlay.d.ts +22 -0
  8. package/src/Overlay.dev.js +68 -0
  9. package/src/Overlay.dev.js.map +7 -0
  10. package/src/Overlay.js +2 -0
  11. package/src/Overlay.js.map +7 -0
  12. package/src/OverlayBase.d.ts +97 -0
  13. package/src/OverlayBase.dev.js +572 -0
  14. package/src/OverlayBase.dev.js.map +7 -0
  15. package/src/OverlayBase.js +18 -0
  16. package/src/OverlayBase.js.map +7 -0
  17. package/src/OverlayDialog.d.ts +8 -0
  18. package/src/OverlayDialog.dev.js +43 -0
  19. package/src/OverlayDialog.dev.js.map +7 -0
  20. package/src/OverlayDialog.js +2 -0
  21. package/src/OverlayDialog.js.map +7 -0
  22. package/src/OverlayNoPopover.d.ts +8 -0
  23. package/src/OverlayNoPopover.dev.js +62 -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 +81 -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 +115 -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 +138 -246
  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/VirtualTrigger.dev.js +0 -2
  48. package/src/VirtualTrigger.dev.js.map +2 -2
  49. package/src/VirtualTrigger.js +1 -1
  50. package/src/VirtualTrigger.js.map +3 -3
  51. package/src/fullSizePlugin.d.ts +12 -0
  52. package/src/fullSizePlugin.dev.js +39 -0
  53. package/src/fullSizePlugin.dev.js.map +7 -0
  54. package/src/fullSizePlugin.js +2 -0
  55. package/src/fullSizePlugin.js.map +7 -0
  56. package/src/index.d.ts +2 -3
  57. package/src/index.dev.js +2 -3
  58. package/src/index.dev.js.map +2 -2
  59. package/src/index.js +1 -1
  60. package/src/index.js.map +2 -2
  61. package/src/loader.d.ts +2 -2
  62. package/src/loader.dev.js +2 -19
  63. package/src/loader.dev.js.map +2 -2
  64. package/src/loader.js +1 -1
  65. package/src/loader.js.map +3 -3
  66. package/src/overlay-base.css.dev.js +9 -0
  67. package/src/overlay-base.css.dev.js.map +7 -0
  68. package/src/overlay-base.css.js +6 -0
  69. package/src/overlay-base.css.js.map +7 -0
  70. package/src/overlay-trigger.css.dev.js +1 -1
  71. package/src/overlay-trigger.css.dev.js.map +1 -1
  72. package/src/overlay-trigger.css.js +1 -1
  73. package/src/overlay-trigger.css.js.map +1 -1
  74. package/src/overlay-types.d.ts +3 -3
  75. package/src/overlay-types.dev.js +1 -0
  76. package/src/overlay-types.dev.js.map +3 -3
  77. package/src/overlay-types.js +1 -1
  78. package/src/overlay-types.js.map +3 -3
  79. package/src/placement.d.ts +21 -0
  80. package/src/placement.dev.js +111 -0
  81. package/src/placement.dev.js.map +7 -0
  82. package/src/placement.js +2 -0
  83. package/src/placement.js.map +7 -0
  84. package/src/topLayerOverTransforms.d.ts +22 -0
  85. package/src/topLayerOverTransforms.dev.js +161 -0
  86. package/src/topLayerOverTransforms.dev.js.map +7 -0
  87. package/src/topLayerOverTransforms.js +2 -0
  88. package/src/topLayerOverTransforms.js.map +7 -0
  89. package/stories/overlay-element.stories.js +229 -0
  90. package/stories/overlay-element.stories.js.map +7 -0
  91. package/stories/overlay-story-components.js +1 -6
  92. package/stories/overlay-story-components.js.map +2 -2
  93. package/stories/overlay.stories.js +683 -644
  94. package/stories/overlay.stories.js.map +2 -2
  95. package/sync/overlay-trigger.d.ts +4 -0
  96. package/sync/overlay-trigger.dev.js +1 -4
  97. package/sync/overlay-trigger.dev.js.map +2 -2
  98. package/sync/overlay-trigger.js +1 -1
  99. package/sync/overlay-trigger.js.map +3 -3
  100. package/test/benchmark/basic-test.js +1 -1
  101. package/test/benchmark/basic-test.js.map +1 -1
  102. package/test/index.js +3 -9
  103. package/test/index.js.map +2 -2
  104. package/test/overlay-element.test-vrt.js +5 -0
  105. package/{active-overlay.dev.js.map → test/overlay-element.test-vrt.js.map} +3 -3
  106. package/test/overlay-element.test.js +759 -0
  107. package/test/overlay-element.test.js.map +7 -0
  108. package/test/overlay-lifecycle.test.js +34 -74
  109. package/test/overlay-lifecycle.test.js.map +2 -2
  110. package/test/overlay-trigger-click.test.js +3 -2
  111. package/test/overlay-trigger-click.test.js.map +2 -2
  112. package/test/overlay-trigger-extended.test.js +1 -6
  113. package/test/overlay-trigger-extended.test.js.map +2 -2
  114. package/test/overlay-trigger-hover-click.test.js +1 -1
  115. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  116. package/test/overlay-trigger-hover.test.js +2 -2
  117. package/test/overlay-trigger-hover.test.js.map +2 -2
  118. package/test/overlay-trigger-longpress.test.js +1 -377
  119. package/test/overlay-trigger-longpress.test.js.map +2 -2
  120. package/test/overlay-trigger-sync.test.js +1 -3
  121. package/test/overlay-trigger-sync.test.js.map +2 -2
  122. package/test/overlay-trigger.test.js +1 -3
  123. package/test/overlay-trigger.test.js.map +2 -2
  124. package/test/overlay-update.test.js +4 -4
  125. package/test/overlay-update.test.js.map +2 -2
  126. package/test/overlay.test.js +98 -146
  127. package/test/overlay.test.js.map +2 -2
  128. package/active-overlay.d.ts +0 -6
  129. package/active-overlay.dev.js +0 -4
  130. package/active-overlay.js +0 -2
  131. package/custom-elements.json +0 -1212
  132. package/src/ActiveOverlay.d.ts +0 -84
  133. package/src/ActiveOverlay.dev.js +0 -517
  134. package/src/ActiveOverlay.dev.js.map +0 -7
  135. package/src/ActiveOverlay.js +0 -16
  136. package/src/ActiveOverlay.js.map +0 -7
  137. package/src/active-overlay.css.dev.js +0 -13
  138. package/src/active-overlay.css.dev.js.map +0 -7
  139. package/src/active-overlay.css.js +0 -10
  140. package/src/active-overlay.css.js.map +0 -7
  141. package/src/overlay-stack.d.ts +0 -50
  142. package/src/overlay-stack.dev.js +0 -514
  143. package/src/overlay-stack.dev.js.map +0 -7
  144. package/src/overlay-stack.js +0 -33
  145. package/src/overlay-stack.js.map +0 -7
  146. package/src/overlay-utils.d.ts +0 -3
  147. package/src/overlay-utils.dev.js +0 -31
  148. package/src/overlay-utils.dev.js.map +0 -7
  149. package/src/overlay-utils.js +0 -2
  150. package/src/overlay-utils.js.map +0 -7
  151. package/src/overlay.d.ts +0 -59
  152. package/src/overlay.dev.js +0 -127
  153. package/src/overlay.dev.js.map +0 -7
  154. package/src/overlay.js +0 -2
  155. package/src/overlay.js.map +0 -7
  156. /package/src/{active-overlay.css.d.ts → overlay-base.css.d.ts} +0 -0
@@ -0,0 +1,572 @@
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
+ export const noop = () => {
62
+ return;
63
+ };
64
+ const _OverlayBase = class extends SpectrumElement {
65
+ constructor() {
66
+ super(...arguments);
67
+ this._disabled = false;
68
+ this.dispose = noop;
69
+ this.longpressed = false;
70
+ this.offset = 6;
71
+ this.placementController = new PlacementController(this);
72
+ this._open = false;
73
+ this.receivesFocus = "auto";
74
+ this.releaseAriaDescribedby = noop;
75
+ this.triggerElement = null;
76
+ this.type = "hint";
77
+ this.wasOpen = false;
78
+ this.elementResolver = new ElementResolutionController(this);
79
+ this.elementIds = [];
80
+ this.handlePointerdown = (event) => {
81
+ if (!this.triggerElement)
82
+ return;
83
+ if (event.button !== 0)
84
+ return;
85
+ const triggerElement = this.triggerElement;
86
+ this.longpressed = false;
87
+ triggerElement.addEventListener("pointerup", this.handlePointerup);
88
+ triggerElement.addEventListener("pointercancel", this.handlePointerup);
89
+ this.longressTimeout = setTimeout(() => {
90
+ if (!triggerElement)
91
+ return;
92
+ triggerElement.dispatchEvent(
93
+ new CustomEvent("longpress", {
94
+ bubbles: true,
95
+ composed: true,
96
+ detail: {
97
+ source: "pointer"
98
+ }
99
+ })
100
+ );
101
+ }, LONGPRESS_DURATION);
102
+ };
103
+ this.handlePointerup = () => {
104
+ clearTimeout(this.longressTimeout);
105
+ if (!this.triggerElement)
106
+ return;
107
+ if (this.longpressed) {
108
+ this.open = true;
109
+ }
110
+ setTimeout(() => {
111
+ this.longpressed = false;
112
+ });
113
+ const triggerElement = this.triggerElement;
114
+ triggerElement.removeEventListener("pointerup", this.handlePointerup);
115
+ triggerElement.removeEventListener(
116
+ "pointercancel",
117
+ this.handlePointerup
118
+ );
119
+ };
120
+ /**
121
+ * @private
122
+ */
123
+ this.handleKeydown = (event) => {
124
+ const { code, altKey } = event;
125
+ if (code === "Space" || altKey && code === "ArrowDown") {
126
+ if (code === "ArrowDown") {
127
+ event.stopPropagation();
128
+ event.stopImmediatePropagation();
129
+ }
130
+ }
131
+ };
132
+ this.handleKeyup = (event) => {
133
+ const { code, altKey } = event;
134
+ if (code === "Space" || altKey && code === "ArrowDown") {
135
+ event.stopPropagation();
136
+ this.dispatchEvent(
137
+ new CustomEvent("longpress", {
138
+ bubbles: true,
139
+ composed: true,
140
+ detail: {
141
+ source: "keyboard"
142
+ }
143
+ })
144
+ );
145
+ }
146
+ };
147
+ this.handleClick = () => {
148
+ if (this.longpressed)
149
+ return;
150
+ this.open = !this.open;
151
+ };
152
+ this.focusedin = false;
153
+ this.handleFocusin = () => {
154
+ this.open = true;
155
+ this.focusedin = true;
156
+ };
157
+ this.handleFocusout = () => {
158
+ this.focusedin = false;
159
+ if (this.pointerentered)
160
+ return;
161
+ this.open = false;
162
+ };
163
+ this.pointerentered = false;
164
+ this.handlePointerenter = () => {
165
+ this.open = true;
166
+ this.pointerentered = true;
167
+ };
168
+ this.handlePointerleave = () => {
169
+ this.pointerentered = false;
170
+ const triggerElement = this.triggerElement;
171
+ if (this.focusedin && triggerElement.matches(":focus-visible"))
172
+ return;
173
+ this.open = false;
174
+ };
175
+ this.handleLongpress = () => {
176
+ this.open = true;
177
+ this.longpressed = true;
178
+ };
179
+ this.willPreventClose = false;
180
+ }
181
+ get disabled() {
182
+ return this._disabled;
183
+ }
184
+ set disabled(disabled) {
185
+ this._disabled = disabled;
186
+ if (disabled) {
187
+ this.wasOpen = this.open;
188
+ this.open = false;
189
+ } else {
190
+ this.open = this.open || this.wasOpen;
191
+ this.wasOpen = false;
192
+ }
193
+ }
194
+ get open() {
195
+ return this._open;
196
+ }
197
+ set open(open) {
198
+ if (open && this.disabled)
199
+ return;
200
+ if (open === this.open)
201
+ return;
202
+ this._open = open;
203
+ this.requestUpdate("open", !this.open);
204
+ }
205
+ get usesDialog() {
206
+ return this.type === "modal" || this.type === "page";
207
+ }
208
+ get popoverValue() {
209
+ switch (this.type) {
210
+ case "modal":
211
+ case "page":
212
+ return void 0;
213
+ case "hint":
214
+ return "manual";
215
+ default:
216
+ return this.type;
217
+ }
218
+ }
219
+ manageChildren(open) {
220
+ const eventName = open ? "sp-opened" : "sp-closed";
221
+ let announced = false;
222
+ this.elements.forEach((el) => {
223
+ if (typeof el.open !== "undefined") {
224
+ el.open = open;
225
+ el.dispatchEvent(
226
+ new Event(eventName, {
227
+ bubbles: false,
228
+ composed: false
229
+ })
230
+ );
231
+ }
232
+ if (!announced) {
233
+ this.dispatchEvent(
234
+ new Event(eventName, {
235
+ bubbles: true,
236
+ composed: true
237
+ })
238
+ );
239
+ announced = true;
240
+ }
241
+ });
242
+ }
243
+ async manageDialogOpen() {
244
+ console.warn(
245
+ "Implement the `manageDialogOpen` method in a class extension."
246
+ );
247
+ }
248
+ async managePopoverOpen() {
249
+ console.warn(
250
+ "Implement the `managePopoverOpen` method in a class extension."
251
+ );
252
+ }
253
+ get requiresPosition() {
254
+ if (this.type === "page" || !this.open)
255
+ return false;
256
+ if (!this.triggerElement || !this.placement && this.type !== "hint")
257
+ return false;
258
+ return true;
259
+ }
260
+ managePosition() {
261
+ if (!this.requiresPosition)
262
+ return;
263
+ const offset = this.offset || 0;
264
+ const trigger = this.triggerElement;
265
+ const placement = this.placement || "right";
266
+ this.placementController.placeOverlay(this.dialogEl, {
267
+ // delayed?: boolean,
268
+ offset,
269
+ placement,
270
+ // notImmediatelyClosable?: boolean, // rename or place behind other API options
271
+ // receivesFocus?: 'auto';
272
+ // root?: HTMLElement;
273
+ trigger,
274
+ type: this.type
275
+ });
276
+ }
277
+ async manageOpen() {
278
+ var _a;
279
+ if (!this.isConnected)
280
+ return;
281
+ if (!this.hasUpdated) {
282
+ await this.updateComplete;
283
+ }
284
+ if (this.open) {
285
+ overlayStack.add(this);
286
+ } else {
287
+ this.dispose();
288
+ overlayStack.remove(this);
289
+ }
290
+ if (this.usesDialog) {
291
+ this.manageDialogOpen();
292
+ } else {
293
+ this.managePopoverOpen();
294
+ }
295
+ if (this.open) {
296
+ _OverlayBase.openCount += 1;
297
+ } else {
298
+ const getAncestors = () => {
299
+ var _a2;
300
+ const ancestors = [];
301
+ let currentNode = document.activeElement;
302
+ while ((currentNode == null ? void 0 : currentNode.shadowRoot) && currentNode.shadowRoot.activeElement) {
303
+ currentNode = currentNode.shadowRoot.activeElement;
304
+ }
305
+ while (currentNode) {
306
+ const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_a2 = currentNode.getRootNode()) == null ? void 0 : _a2.host);
307
+ if (ancestor) {
308
+ ancestors.push(ancestor);
309
+ }
310
+ currentNode = ancestor;
311
+ }
312
+ return ancestors;
313
+ };
314
+ if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(
315
+ this.getRootNode().activeElement
316
+ ) || !!getAncestors().find((el) => el === this))) {
317
+ this.triggerElement.focus();
318
+ }
319
+ }
320
+ }
321
+ manageTriggerElement(triggerElement) {
322
+ if (triggerElement) {
323
+ triggerElement.removeEventListener("click", this.handleClick);
324
+ triggerElement.removeEventListener("focusin", this.handleFocusin);
325
+ triggerElement.removeEventListener("focusout", this.handleFocusout);
326
+ triggerElement.removeEventListener(
327
+ "pointerenter",
328
+ this.handlePointerenter
329
+ );
330
+ triggerElement.removeEventListener(
331
+ "pointerleave",
332
+ this.handlePointerleave
333
+ );
334
+ triggerElement.addEventListener(
335
+ "pointerdown",
336
+ this.handlePointerdown
337
+ );
338
+ triggerElement.removeEventListener("keydown", this.handleKeydown);
339
+ triggerElement.removeEventListener("keyup", this.handleKeyup);
340
+ triggerElement.removeEventListener(
341
+ "longpress",
342
+ this.handleLongpress
343
+ );
344
+ this.releaseAriaDescribedby();
345
+ }
346
+ if (!this.triggerElement || !!this.triggerElement.updateBoundingClientRect)
347
+ return;
348
+ const nextTriggerElement = this.triggerElement;
349
+ switch (this.triggerInteraction) {
350
+ case "click":
351
+ nextTriggerElement.addEventListener("click", this.handleClick);
352
+ return;
353
+ case "longpress":
354
+ nextTriggerElement.addEventListener(
355
+ "pointerdown",
356
+ this.handlePointerdown
357
+ );
358
+ nextTriggerElement.addEventListener(
359
+ "keydown",
360
+ this.handleKeydown
361
+ );
362
+ nextTriggerElement.addEventListener("keyup", this.handleKeyup);
363
+ nextTriggerElement.addEventListener(
364
+ "longpress",
365
+ this.handleLongpress
366
+ );
367
+ return;
368
+ case "hover":
369
+ nextTriggerElement.addEventListener(
370
+ "focusin",
371
+ this.handleFocusin
372
+ );
373
+ nextTriggerElement.addEventListener(
374
+ "focusout",
375
+ this.handleFocusout
376
+ );
377
+ nextTriggerElement.addEventListener(
378
+ "pointerenter",
379
+ this.handlePointerenter
380
+ );
381
+ nextTriggerElement.addEventListener(
382
+ "pointerleave",
383
+ this.handlePointerleave
384
+ );
385
+ if (this.receivesFocus === "true")
386
+ return;
387
+ this.prepareAriaDescribedby(nextTriggerElement);
388
+ return;
389
+ }
390
+ }
391
+ prepareAriaDescribedby(trigger) {
392
+ if (
393
+ // only "hover" relationships establed described by content
394
+ this.triggerInteraction !== "hover" || // do not reapply until target is recycled
395
+ this.releaseAriaDescribedby !== noop || // require " hover content" to apply relationship
396
+ !this.elements.length
397
+ )
398
+ return;
399
+ const triggerRoot = trigger.getRootNode();
400
+ const contentRoot = this.elements[0].getRootNode();
401
+ const overlayRoot = this.getRootNode();
402
+ if (triggerRoot == overlayRoot) {
403
+ const releaseAriaDescribedby = conditionAttributeWithId(
404
+ trigger,
405
+ "aria-describedby",
406
+ [this.id]
407
+ );
408
+ this.releaseAriaDescribedby = () => {
409
+ releaseAriaDescribedby();
410
+ this.releaseAriaDescribedby = noop;
411
+ };
412
+ } else if (triggerRoot === contentRoot) {
413
+ this.elementIds = this.elements.map((el) => el.id);
414
+ const appliedIds = this.elements.map((el) => {
415
+ if (!el.id) {
416
+ el.id = `${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0, 8)}`;
417
+ }
418
+ return el.id;
419
+ });
420
+ const releaseAriaDescribedby = conditionAttributeWithId(
421
+ trigger,
422
+ "aria-describedby",
423
+ appliedIds
424
+ );
425
+ this.releaseAriaDescribedby = () => {
426
+ releaseAriaDescribedby();
427
+ this.elements.map((el, index) => {
428
+ el.id = this.elementIds[index];
429
+ });
430
+ this.releaseAriaDescribedby = noop;
431
+ };
432
+ }
433
+ }
434
+ handleBeforetoggle({
435
+ newState: open
436
+ }) {
437
+ if (open === "open") {
438
+ this.handlePopovershow();
439
+ } else {
440
+ this.handlePopoverhide();
441
+ }
442
+ }
443
+ handlePopoverhide() {
444
+ this.open = false;
445
+ this.dispatchEvent(new BeforetoggleClosedEvent());
446
+ }
447
+ handlePopovershow() {
448
+ this.dispatchEvent(new BeforetoggleOpenEvent());
449
+ }
450
+ shouldPreventClose() {
451
+ const shouldPreventClose = this.willPreventClose;
452
+ this.willPreventClose = false;
453
+ return shouldPreventClose;
454
+ }
455
+ willUpdate(changes) {
456
+ var _a;
457
+ if (!this.hasAttribute("id")) {
458
+ this.setAttribute(
459
+ "id",
460
+ `${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0, 8)}`
461
+ );
462
+ }
463
+ if (changes.has("open") && (typeof changes.get("open") !== "undefined" || this.open)) {
464
+ this.manageOpen();
465
+ }
466
+ if (changes.has("trigger")) {
467
+ const [id, interaction] = ((_a = this.trigger) == null ? void 0 : _a.split("@")) || [];
468
+ this.elementResolver.selector = id ? `#${id}` : "";
469
+ this.triggerInteraction = interaction;
470
+ }
471
+ const oldTrigger = this.triggerElement;
472
+ if (changes.has(elementResolverUpdatedSymbol)) {
473
+ this.triggerElement = this.elementResolver.element;
474
+ this.manageTriggerElement(oldTrigger);
475
+ }
476
+ if (changes.has("triggerElement")) {
477
+ this.manageTriggerElement(changes.get("triggerElement"));
478
+ }
479
+ }
480
+ updated(changes) {
481
+ super.updated(changes);
482
+ if (changes.has("placement")) {
483
+ if (this.placement) {
484
+ this.dialogEl.setAttribute("actual-placement", this.placement);
485
+ } else {
486
+ this.dialogEl.removeAttribute("actual-placement");
487
+ }
488
+ if (typeof changes.get("placement") !== "undefined") {
489
+ this.managePosition();
490
+ }
491
+ }
492
+ }
493
+ render() {
494
+ const hasPopoverAttribute = "popover" in this;
495
+ const popoverValue = hasPopoverAttribute ? this.popoverValue : void 0;
496
+ return html`
497
+ <dialog
498
+ part="dialog"
499
+ popover=${ifDefined(popoverValue)}
500
+ @close=${() => {
501
+ this.open = false;
502
+ }}
503
+ @cancel=${() => {
504
+ this.open = false;
505
+ }}
506
+ @beforetoggle=${this.handleBeforetoggle}
507
+ @popovershow=${this.handlePopovershow}
508
+ style=${styleMap({
509
+ "--swc-overlay-z-index": _OverlayBase.openCount.toString()
510
+ })}
511
+ >
512
+ <div part="content">
513
+ <slot
514
+ @slotchange=${() => {
515
+ if (this.triggerElement) {
516
+ this.prepareAriaDescribedby(
517
+ this.triggerElement
518
+ );
519
+ }
520
+ }}
521
+ ></slot>
522
+ </div>
523
+ </dialog>
524
+ `;
525
+ }
526
+ connectedCallback() {
527
+ super.connectedCallback();
528
+ this.addEventListener("close", () => {
529
+ this.open = false;
530
+ });
531
+ }
532
+ };
533
+ export let OverlayBase = _OverlayBase;
534
+ OverlayBase.styles = [styles];
535
+ OverlayBase.openCount = 1;
536
+ __decorateClass([
537
+ query("dialog")
538
+ ], OverlayBase.prototype, "dialogEl", 2);
539
+ __decorateClass([
540
+ property({ type: Boolean })
541
+ ], OverlayBase.prototype, "disabled", 1);
542
+ __decorateClass([
543
+ queryAssignedElements({ flatten: true })
544
+ ], OverlayBase.prototype, "elements", 2);
545
+ __decorateClass([
546
+ property()
547
+ ], OverlayBase.prototype, "offset", 2);
548
+ __decorateClass([
549
+ property({ type: Boolean, reflect: true })
550
+ ], OverlayBase.prototype, "open", 1);
551
+ __decorateClass([
552
+ property()
553
+ ], OverlayBase.prototype, "placement", 2);
554
+ __decorateClass([
555
+ property({ attribute: "receives-focus" })
556
+ ], OverlayBase.prototype, "receivesFocus", 2);
557
+ __decorateClass([
558
+ query("slot")
559
+ ], OverlayBase.prototype, "slotEl", 2);
560
+ __decorateClass([
561
+ property()
562
+ ], OverlayBase.prototype, "trigger", 2);
563
+ __decorateClass([
564
+ state()
565
+ ], OverlayBase.prototype, "triggerElement", 2);
566
+ __decorateClass([
567
+ state()
568
+ ], OverlayBase.prototype, "triggerInteraction", 2);
569
+ __decorateClass([
570
+ property()
571
+ ], OverlayBase.prototype, "type", 2);
572
+ //# 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 const noop = (): void => {\n return;\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 protected dispose = noop;\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 = noop;\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 this.dispose();\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 this.prepareAriaDescribedby(nextTriggerElement);\n return;\n }\n }\n\n private elementIds: string[] = [];\n\n private prepareAriaDescribedby(trigger: HTMLElement): void {\n if (\n // only \"hover\" relationships establed described by content\n this.triggerInteraction !== 'hover' ||\n // do not reapply until target is recycled\n this.releaseAriaDescribedby !== noop ||\n // require \" hover content\" to apply relationship\n !this.elements.length\n )\n return;\n\n const triggerRoot = trigger.getRootNode();\n const contentRoot = this.elements[0].getRootNode();\n const overlayRoot = this.getRootNode();\n if (triggerRoot == overlayRoot) {\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n [this.id]\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.releaseAriaDescribedby = noop;\n };\n } else if (triggerRoot === contentRoot) {\n this.elementIds = this.elements.map((el) => el.id);\n const appliedIds = this.elements.map((el) => {\n if (!el.id) {\n el.id = `${this.tagName.toLowerCase()}-helper-${crypto\n .randomUUID()\n .slice(0, 8)}`;\n }\n return el.id;\n });\n const releaseAriaDescribedby = conditionAttributeWithId(\n trigger,\n 'aria-describedby',\n appliedIds\n );\n this.releaseAriaDescribedby = () => {\n releaseAriaDescribedby();\n this.elements.map((el, index) => {\n el.id = this.elementIds[index];\n });\n this.releaseAriaDescribedby = noop;\n };\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 public willPreventClose = false;\n\n public shouldPreventClose(): boolean {\n const shouldPreventClose = this.willPreventClose;\n this.willPreventClose = false;\n return shouldPreventClose;\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\n @slotchange=${() => {\n if (this.triggerElement) {\n this.prepareAriaDescribedby(\n this.triggerElement as HTMLElement\n );\n }\n }}\n ></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": "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",
6
+ "names": ["_a"]
7
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";var f=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var n=(p,r,e,t)=>{for(var o=t>1?void 0:t?E(r,e):r,i=p.length-1,s;i>=0;i--)(s=p[i])&&(o=(t?s(r,e,o):s(o))||o);return t&&o&&f(r,e,o),o};import{html as b,SpectrumElement as y}from"@spectrum-web-components/base";import{property as l,query as c,queryAssignedElements as w,state as u}from"@spectrum-web-components/base/src/decorators.js";import{conditionAttributeWithId as m}from"@spectrum-web-components/base/src/condition-attribute-with-id.js";import{ElementResolutionController as P,elementResolverUpdatedSymbol as L}from"@spectrum-web-components/reactive-controllers/src/ElementResolution.js";import{ifDefined as T,styleMap as C}from"@spectrum-web-components/base/src/directives.js";import D from"./overlay-base.css.js";import{overlayStack as g}from"./OverlayStack.js";import{PlacementController as A}from"./PlacementController.js";const R=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"}}export const noop=()=>{};const h=class extends y{constructor(){super(...arguments);this._disabled=!1;this.dispose=noop;this.longpressed=!1;this.offset=6;this.placementController=new A(this);this._open=!1;this.receivesFocus="auto";this.releaseAriaDescribedby=noop;this.triggerElement=null;this.type="hint";this.wasOpen=!1;this.elementResolver=new P(this);this.elementIds=[];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"}}))},R)};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};this.willPreventClose=!1}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(i=>{typeof i.open!="undefined"&&(i.open=e,i.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?g.add(this):(this.dispose(),g.remove(this)),this.usesDialog?this.manageDialogOpen():this.managePopoverOpen(),this.open)h.openCount+=1;else{const t=()=>{var s;const o=[];let i=document.activeElement;for(;i!=null&&i.shadowRoot&&i.shadowRoot.activeElement;)i=i.shadowRoot.activeElement;for(;i;){const d=i.assignedSlot||i.parentElement||((s=i.getRootNode())==null?void 0:s.host);d&&o.push(d),i=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;this.prepareAriaDescribedby(t);return}}prepareAriaDescribedby(e){if(this.triggerInteraction!=="hover"||this.releaseAriaDescribedby!==noop||!this.elements.length)return;const t=e.getRootNode(),o=this.elements[0].getRootNode(),i=this.getRootNode();if(t==i){const s=m(e,"aria-describedby",[this.id]);this.releaseAriaDescribedby=()=>{s(),this.releaseAriaDescribedby=noop}}else if(t===o){this.elementIds=this.elements.map(a=>a.id);const s=this.elements.map(a=>(a.id||(a.id=`${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0,8)}`),a.id)),d=m(e,"aria-describedby",s);this.releaseAriaDescribedby=()=>{d(),this.elements.map((a,v)=>{a.id=this.elementIds[v]}),this.releaseAriaDescribedby=noop}}}handleBeforetoggle({newState:e}){e==="open"?this.handlePopovershow():this.handlePopoverhide()}handlePopoverhide(){this.open=!1,this.dispatchEvent(new BeforetoggleClosedEvent)}handlePopovershow(){this.dispatchEvent(new BeforetoggleOpenEvent)}shouldPreventClose(){const e=this.willPreventClose;return this.willPreventClose=!1,e}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[i,s]=((o=this.trigger)==null?void 0:o.split("@"))||[];this.elementResolver.selector=i?`#${i}`:"",this.triggerInteraction=s}const t=this.triggerElement;e.has(L)&&(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 b`
2
+ <dialog
3
+ part="dialog"
4
+ popover=${T(t)}
5
+ @close=${()=>{this.open=!1}}
6
+ @cancel=${()=>{this.open=!1}}
7
+ @beforetoggle=${this.handleBeforetoggle}
8
+ @popovershow=${this.handlePopovershow}
9
+ style=${C({"--swc-overlay-z-index":h.openCount.toString()})}
10
+ >
11
+ <div part="content">
12
+ <slot
13
+ @slotchange=${()=>{this.triggerElement&&this.prepareAriaDescribedby(this.triggerElement)}}
14
+ ></slot>
15
+ </div>
16
+ </dialog>
17
+ `}connectedCallback(){super.connectedCallback(),this.addEventListener("close",()=>{this.open=!1})}};export let OverlayBase=h;OverlayBase.styles=[D],OverlayBase.openCount=1,n([c("dialog")],OverlayBase.prototype,"dialogEl",2),n([l({type:Boolean})],OverlayBase.prototype,"disabled",1),n([w({flatten:!0})],OverlayBase.prototype,"elements",2),n([l()],OverlayBase.prototype,"offset",2),n([l({type:Boolean,reflect:!0})],OverlayBase.prototype,"open",1),n([l()],OverlayBase.prototype,"placement",2),n([l({attribute:"receives-focus"})],OverlayBase.prototype,"receivesFocus",2),n([c("slot")],OverlayBase.prototype,"slotEl",2),n([l()],OverlayBase.prototype,"trigger",2),n([u()],OverlayBase.prototype,"triggerElement",2),n([u()],OverlayBase.prototype,"triggerInteraction",2),n([l()],OverlayBase.prototype,"type",2);
18
+ //# sourceMappingURL=OverlayBase.js.map