@spectrum-web-components/overlay 0.36.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +266 -149
  2. package/custom-elements.json +1678 -553
  3. package/package.json +49 -22
  4. package/sp-overlay.d.ts +6 -0
  5. package/sp-overlay.dev.js +5 -0
  6. package/{active-overlay.dev.js.map → sp-overlay.dev.js.map} +3 -3
  7. package/sp-overlay.js +2 -0
  8. package/{active-overlay.js.map → sp-overlay.js.map} +4 -4
  9. package/src/AbstractOverlay.d.ts +58 -0
  10. package/src/AbstractOverlay.dev.js +211 -0
  11. package/src/AbstractOverlay.dev.js.map +7 -0
  12. package/src/AbstractOverlay.js +2 -0
  13. package/src/AbstractOverlay.js.map +7 -0
  14. package/src/Overlay.d.ts +163 -0
  15. package/src/Overlay.dev.js +792 -0
  16. package/src/Overlay.dev.js.map +7 -0
  17. package/src/Overlay.js +33 -0
  18. package/src/Overlay.js.map +7 -0
  19. package/src/OverlayDialog.d.ts +4 -0
  20. package/src/OverlayDialog.dev.js +135 -0
  21. package/src/OverlayDialog.dev.js.map +7 -0
  22. package/src/OverlayDialog.js +2 -0
  23. package/src/OverlayDialog.js.map +7 -0
  24. package/src/OverlayNoPopover.d.ts +4 -0
  25. package/src/OverlayNoPopover.dev.js +109 -0
  26. package/src/OverlayNoPopover.dev.js.map +7 -0
  27. package/src/OverlayNoPopover.js +2 -0
  28. package/src/OverlayNoPopover.js.map +7 -0
  29. package/src/OverlayPopover.d.ts +4 -0
  30. package/src/OverlayPopover.dev.js +169 -0
  31. package/src/OverlayPopover.dev.js.map +7 -0
  32. package/src/OverlayPopover.js +2 -0
  33. package/src/OverlayPopover.js.map +7 -0
  34. package/src/OverlayStack.d.ts +43 -0
  35. package/src/OverlayStack.dev.js +150 -0
  36. package/src/OverlayStack.dev.js.map +7 -0
  37. package/src/OverlayStack.js +2 -0
  38. package/src/OverlayStack.js.map +7 -0
  39. package/src/OverlayTrigger.d.ts +26 -42
  40. package/src/OverlayTrigger.dev.js +172 -296
  41. package/src/OverlayTrigger.dev.js.map +3 -3
  42. package/src/OverlayTrigger.js +49 -25
  43. package/src/OverlayTrigger.js.map +3 -3
  44. package/src/PlacementController.d.ts +38 -0
  45. package/src/PlacementController.dev.js +199 -0
  46. package/src/PlacementController.dev.js.map +7 -0
  47. package/src/PlacementController.js +2 -0
  48. package/src/PlacementController.js.map +7 -0
  49. package/src/VirtualTrigger.dev.js +2 -1
  50. package/src/VirtualTrigger.dev.js.map +2 -2
  51. package/src/VirtualTrigger.js +1 -1
  52. package/src/VirtualTrigger.js.map +2 -2
  53. package/src/fullSizePlugin.d.ts +12 -0
  54. package/src/fullSizePlugin.dev.js +39 -0
  55. package/src/fullSizePlugin.dev.js.map +7 -0
  56. package/src/fullSizePlugin.js +2 -0
  57. package/src/fullSizePlugin.js.map +7 -0
  58. package/src/index.d.ts +2 -3
  59. package/src/index.dev.js +2 -3
  60. package/src/index.dev.js.map +2 -2
  61. package/src/index.js +1 -1
  62. package/src/index.js.map +2 -2
  63. package/src/loader.d.ts +1 -2
  64. package/src/loader.dev.js +2 -19
  65. package/src/loader.dev.js.map +2 -2
  66. package/src/loader.js +1 -1
  67. package/src/loader.js.map +3 -3
  68. package/src/overlay-timer.dev.js.map +2 -2
  69. package/src/overlay-timer.js.map +2 -2
  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 +3 -3
  73. package/src/overlay-trigger.css.js.map +1 -1
  74. package/src/overlay-types.d.ts +25 -31
  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/overlay.css.dev.js +9 -0
  80. package/src/overlay.css.dev.js.map +7 -0
  81. package/src/overlay.css.js +6 -0
  82. package/src/overlay.css.js.map +7 -0
  83. package/src/topLayerOverTransforms.d.ts +2 -0
  84. package/src/topLayerOverTransforms.dev.js +91 -0
  85. package/src/topLayerOverTransforms.dev.js.map +7 -0
  86. package/src/topLayerOverTransforms.js +2 -0
  87. package/src/topLayerOverTransforms.js.map +7 -0
  88. package/stories/overlay-element.stories.js +476 -0
  89. package/stories/overlay-element.stories.js.map +7 -0
  90. package/stories/overlay-story-components.js +9 -8
  91. package/stories/overlay-story-components.js.map +2 -2
  92. package/stories/overlay.stories.js +824 -680
  93. package/stories/overlay.stories.js.map +2 -2
  94. package/sync/overlay-trigger.d.ts +5 -0
  95. package/sync/overlay-trigger.dev.js +2 -4
  96. package/sync/overlay-trigger.dev.js.map +2 -2
  97. package/sync/overlay-trigger.js +1 -1
  98. package/sync/overlay-trigger.js.map +3 -3
  99. package/test/benchmark/basic-test.js +2 -2
  100. package/test/benchmark/basic-test.js.map +1 -1
  101. package/test/index.js +414 -377
  102. package/test/index.js.map +3 -3
  103. package/test/overlay-element.test-vrt.js +5 -0
  104. package/test/overlay-element.test-vrt.js.map +7 -0
  105. package/test/overlay-element.test.js +682 -0
  106. package/test/overlay-element.test.js.map +7 -0
  107. package/test/overlay-lifecycle.test.js +36 -106
  108. package/test/overlay-lifecycle.test.js.map +2 -2
  109. package/test/overlay-trigger-click.test.js +11 -5
  110. package/test/overlay-trigger-click.test.js.map +2 -2
  111. package/test/overlay-trigger-extended.test.js +46 -36
  112. package/test/overlay-trigger-extended.test.js.map +2 -2
  113. package/test/overlay-trigger-hover-click.test.js +38 -25
  114. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  115. package/test/overlay-trigger-hover.test.js +41 -35
  116. package/test/overlay-trigger-hover.test.js.map +2 -2
  117. package/test/overlay-trigger-longpress.test.js +211 -82
  118. package/test/overlay-trigger-longpress.test.js.map +2 -2
  119. package/test/overlay-trigger-sync.test.js +1 -1
  120. package/test/overlay-trigger-sync.test.js.map +2 -2
  121. package/test/overlay-trigger.test.js +1 -1
  122. package/test/overlay-trigger.test.js.map +2 -2
  123. package/test/overlay-update.test.js +5 -5
  124. package/test/overlay-update.test.js.map +2 -2
  125. package/test/overlay-v1.test.js +547 -0
  126. package/test/overlay-v1.test.js.map +7 -0
  127. package/test/overlay.test.js +385 -269
  128. package/test/overlay.test.js.map +3 -3
  129. package/active-overlay.d.ts +0 -6
  130. package/active-overlay.dev.js +0 -5
  131. package/active-overlay.js +0 -2
  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 -515
  143. package/src/overlay-stack.dev.js.map +0 -7
  144. package/src/overlay-stack.js +0 -34
  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.css.d.ts} +0 -0
@@ -0,0 +1,792 @@
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
+ } from "@spectrum-web-components/base";
16
+ import {
17
+ property,
18
+ query,
19
+ queryAssignedElements,
20
+ state
21
+ } from "@spectrum-web-components/base/src/decorators.js";
22
+ import {
23
+ isAndroid,
24
+ isIOS
25
+ } from "@spectrum-web-components/shared/src/platform.js";
26
+ import {
27
+ ElementResolutionController,
28
+ elementResolverUpdatedSymbol
29
+ } from "@spectrum-web-components/reactive-controllers/src/ElementResolution.js";
30
+ import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
31
+ import {
32
+ ifDefined,
33
+ styleMap
34
+ } from "@spectrum-web-components/base/src/directives.js";
35
+ import { AbstractOverlay, nextFrame } from "./AbstractOverlay.dev.js";
36
+ import { OverlayDialog } from "./OverlayDialog.dev.js";
37
+ import { OverlayPopover } from "./OverlayPopover.dev.js";
38
+ import { OverlayNoPopover } from "./OverlayNoPopover.dev.js";
39
+ import { overlayStack } from "./OverlayStack.dev.js";
40
+ import { noop } from "./AbstractOverlay.dev.js";
41
+ import { VirtualTrigger } from "./VirtualTrigger.dev.js";
42
+ import { PlacementController } from "./PlacementController.dev.js";
43
+ import styles from "./overlay.css.js";
44
+ const LONGPRESS_DURATION = 300;
45
+ export const LONGPRESS_INSTRUCTIONS = {
46
+ touch: "Double tap and long press for additional options",
47
+ keyboard: "Press Space or Alt+Down Arrow for additional options",
48
+ mouse: "Click and hold for additional options"
49
+ };
50
+ const supportsPopover = "showPopover" in document.createElement("div");
51
+ let OverlayFeatures = OverlayDialog(AbstractOverlay);
52
+ if (supportsPopover) {
53
+ OverlayFeatures = OverlayPopover(OverlayFeatures);
54
+ } else {
55
+ OverlayFeatures = OverlayNoPopover(OverlayFeatures);
56
+ }
57
+ const _Overlay = class _Overlay extends OverlayFeatures {
58
+ constructor() {
59
+ super(...arguments);
60
+ this.delayed = false;
61
+ this._disabled = false;
62
+ this.longpressState = "null";
63
+ this.offset = 6;
64
+ this.placementController = new PlacementController(this);
65
+ this._open = false;
66
+ this.receivesFocus = "auto";
67
+ this.releaseAriaDescribedby = noop;
68
+ this.releaseLongpressDescribedby = noop;
69
+ this._state = "closed";
70
+ this.triggerElement = null;
71
+ this.type = "auto";
72
+ this.wasOpen = false;
73
+ this.elementResolver = new ElementResolutionController(this);
74
+ this.closeOnFocusOut = (event) => {
75
+ if (!event.relatedTarget) {
76
+ return;
77
+ }
78
+ const relationEvent = new Event("overlay-relation-query", {
79
+ bubbles: true,
80
+ composed: true
81
+ });
82
+ event.relatedTarget.addEventListener(
83
+ relationEvent.type,
84
+ (event2) => {
85
+ if (!event2.composedPath().includes(this)) {
86
+ this.open = false;
87
+ }
88
+ }
89
+ );
90
+ event.relatedTarget.dispatchEvent(relationEvent);
91
+ };
92
+ this.elementIds = [];
93
+ this.handlePointerdown = (event) => {
94
+ if (!this.triggerElement)
95
+ return;
96
+ if (event.button !== 0)
97
+ return;
98
+ const triggerElement = this.triggerElement;
99
+ this.longpressState = "potential";
100
+ document.addEventListener("pointerup", this.handlePointerup);
101
+ document.addEventListener("pointercancel", this.handlePointerup);
102
+ if (triggerElement.holdAffordance) {
103
+ return;
104
+ }
105
+ this.longressTimeout = setTimeout(() => {
106
+ if (!triggerElement)
107
+ return;
108
+ triggerElement.dispatchEvent(
109
+ new CustomEvent("longpress", {
110
+ bubbles: true,
111
+ composed: true,
112
+ detail: {
113
+ source: "pointer"
114
+ }
115
+ })
116
+ );
117
+ }, LONGPRESS_DURATION);
118
+ };
119
+ this.handlePointerup = () => {
120
+ clearTimeout(this.longressTimeout);
121
+ if (!this.triggerElement)
122
+ return;
123
+ this.longpressState = this.state === "opening" ? "pressed" : "null";
124
+ document.removeEventListener("pointerup", this.handlePointerup);
125
+ document.removeEventListener("pointercancel", this.handlePointerup);
126
+ };
127
+ /**
128
+ * @private
129
+ */
130
+ this.handleKeydown = (event) => {
131
+ const { code, altKey } = event;
132
+ if (code === "Space" || altKey && code === "ArrowDown") {
133
+ if (code === "ArrowDown") {
134
+ event.stopPropagation();
135
+ event.stopImmediatePropagation();
136
+ }
137
+ }
138
+ };
139
+ this.handleKeyup = (event) => {
140
+ const { code, altKey } = event;
141
+ if (code === "Space" || altKey && code === "ArrowDown") {
142
+ if (!this.triggerElement || !this.hasNonVirtualTrigger) {
143
+ return;
144
+ }
145
+ event.stopPropagation();
146
+ this.triggerElement.dispatchEvent(
147
+ new CustomEvent("longpress", {
148
+ bubbles: true,
149
+ composed: true,
150
+ detail: {
151
+ source: "keyboard"
152
+ }
153
+ })
154
+ );
155
+ setTimeout(() => {
156
+ this.longpressState = "null";
157
+ });
158
+ }
159
+ };
160
+ /**
161
+ * An overlay with a `click` interaction should not close on click `triggerElement`.
162
+ * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the
163
+ * overlay is `open` to prevent from toggling the overlay when the click event
164
+ * propagates later in the interaction.
165
+ */
166
+ this.preventNextToggle = false;
167
+ this.handlePointerdownForClick = () => {
168
+ this.preventNextToggle = this.open;
169
+ };
170
+ this.handleClick = () => {
171
+ if (this.longpressState === "opening" || this.longpressState === "pressed") {
172
+ return;
173
+ }
174
+ if (!this.preventNextToggle) {
175
+ this.open = !this.open;
176
+ }
177
+ this.preventNextToggle = false;
178
+ };
179
+ this.focusedin = false;
180
+ this.handleFocusin = () => {
181
+ this.open = true;
182
+ this.focusedin = true;
183
+ };
184
+ this.handleFocusout = () => {
185
+ this.focusedin = false;
186
+ if (this.pointerentered)
187
+ return;
188
+ this.open = false;
189
+ };
190
+ this.pointerentered = false;
191
+ this.handlePointerenter = () => {
192
+ if (this.disabled)
193
+ return;
194
+ this.open = true;
195
+ this.pointerentered = true;
196
+ };
197
+ this.handlePointerleave = (event) => {
198
+ if (this === event.relatedTarget || this.contains(event.relatedTarget) || [...this.children].find((child) => {
199
+ if (child.localName !== "slot") {
200
+ return false;
201
+ }
202
+ return child.assignedElements({ flatten: true }).find((el) => {
203
+ return el === event.relatedTarget || el.contains(event.relatedTarget);
204
+ });
205
+ })) {
206
+ return;
207
+ }
208
+ this.doPointerleave();
209
+ };
210
+ this.handleOverlayPointerleave = (event) => {
211
+ if (this.triggerElement === event.relatedTarget || this.hasNonVirtualTrigger && this.triggerElement.contains(
212
+ event.relatedTarget
213
+ )) {
214
+ return;
215
+ }
216
+ this.doPointerleave();
217
+ };
218
+ this.handleLongpress = () => {
219
+ this.open = true;
220
+ this.longpressState = this.longpressState === "potential" ? "opening" : "pressed";
221
+ };
222
+ this.willPreventClose = false;
223
+ }
224
+ get disabled() {
225
+ return this._disabled;
226
+ }
227
+ set disabled(disabled) {
228
+ this._disabled = disabled;
229
+ if (disabled) {
230
+ if (this.hasNonVirtualTrigger) {
231
+ this.unbindEvents();
232
+ }
233
+ this.wasOpen = this.open;
234
+ this.open = false;
235
+ } else {
236
+ this.bindEvents();
237
+ this.open = this.open || this.wasOpen;
238
+ this.wasOpen = false;
239
+ }
240
+ }
241
+ get hasNonVirtualTrigger() {
242
+ return !!this.triggerElement && !(this.triggerElement instanceof VirtualTrigger);
243
+ }
244
+ get open() {
245
+ return this._open;
246
+ }
247
+ set open(open) {
248
+ if (open && this.disabled)
249
+ return;
250
+ if (open === this.open)
251
+ return;
252
+ if ((this.longpressState === "opening" || this.longpressState === "pressed") && !open)
253
+ return;
254
+ this._open = open;
255
+ if (this.open) {
256
+ _Overlay.openCount += 1;
257
+ }
258
+ this.requestUpdate("open", !this.open);
259
+ }
260
+ get state() {
261
+ return this._state;
262
+ }
263
+ set state(state2) {
264
+ if (state2 === this.state)
265
+ return;
266
+ const oldState = this.state;
267
+ this._state = state2;
268
+ if (this.state === "opened" || this.state === "closed") {
269
+ this.longpressState = this.longpressState === "pressed" ? "null" : this.longpressState;
270
+ }
271
+ this.requestUpdate("state", oldState);
272
+ }
273
+ get usesDialog() {
274
+ return this.type === "modal" || this.type === "page";
275
+ }
276
+ get popoverValue() {
277
+ const hasPopoverAttribute = "popover" in this;
278
+ if (!hasPopoverAttribute) {
279
+ return void 0;
280
+ }
281
+ switch (this.type) {
282
+ case "modal":
283
+ case "page":
284
+ return void 0;
285
+ case "hint":
286
+ return "manual";
287
+ default:
288
+ return this.type;
289
+ }
290
+ }
291
+ get requiresPosition() {
292
+ if (this.type === "page" || !this.open)
293
+ return false;
294
+ if (!this.triggerElement || !this.placement && this.type !== "hint")
295
+ return false;
296
+ return true;
297
+ }
298
+ managePosition() {
299
+ if (!this.requiresPosition || !this.open)
300
+ return;
301
+ const offset = this.offset || 0;
302
+ const trigger = this.triggerElement;
303
+ const placement = this.placement || "right";
304
+ const tipPadding = this.tipPadding;
305
+ this.placementController.placeOverlay(this.dialogEl, {
306
+ offset,
307
+ placement,
308
+ tipPadding,
309
+ trigger,
310
+ type: this.type
311
+ });
312
+ }
313
+ async managePopoverOpen() {
314
+ super.managePopoverOpen();
315
+ const targetOpenState = this.open;
316
+ if (this.open !== targetOpenState) {
317
+ return;
318
+ }
319
+ await this.manageDelay(targetOpenState);
320
+ if (this.open !== targetOpenState) {
321
+ return;
322
+ }
323
+ await this.ensureOnDOM(targetOpenState);
324
+ if (this.open !== targetOpenState) {
325
+ return;
326
+ }
327
+ const focusEl = await this.makeTransition(targetOpenState);
328
+ if (this.open !== targetOpenState) {
329
+ return;
330
+ }
331
+ await this.applyFocus(targetOpenState, focusEl);
332
+ }
333
+ async applyFocus(targetOpenState, focusEl) {
334
+ if (this.receivesFocus === "false" || this.type === "hint") {
335
+ return;
336
+ }
337
+ await nextFrame();
338
+ await nextFrame();
339
+ if (targetOpenState === this.open && !this.open) {
340
+ if (this.hasNonVirtualTrigger && this.contains(this.getRootNode().activeElement)) {
341
+ this.triggerElement.focus();
342
+ }
343
+ return;
344
+ }
345
+ focusEl == null ? void 0 : focusEl.focus();
346
+ }
347
+ async manageOpen(oldOpen) {
348
+ var _a;
349
+ if (!this.isConnected && this.open)
350
+ return;
351
+ if (!this.hasUpdated) {
352
+ await this.updateComplete;
353
+ }
354
+ if (this.open) {
355
+ overlayStack.add(this);
356
+ if (this.willPreventClose) {
357
+ document.addEventListener(
358
+ "pointerup",
359
+ () => {
360
+ this.dialogEl.classList.toggle(
361
+ "not-immediately-closable",
362
+ false
363
+ );
364
+ this.willPreventClose = false;
365
+ },
366
+ { once: true }
367
+ );
368
+ this.dialogEl.classList.toggle(
369
+ "not-immediately-closable",
370
+ true
371
+ );
372
+ }
373
+ } else {
374
+ if (oldOpen) {
375
+ this.dispose();
376
+ }
377
+ overlayStack.remove(this);
378
+ }
379
+ if (this.open && this.state !== "opened") {
380
+ this.state = "opening";
381
+ } else if (!this.open && this.state !== "closed") {
382
+ this.state = "closing";
383
+ }
384
+ if (this.usesDialog) {
385
+ this.manageDialogOpen();
386
+ } else {
387
+ this.managePopoverOpen();
388
+ }
389
+ if (this.type === "auto") {
390
+ const listenerRoot = this.getRootNode();
391
+ if (this.open) {
392
+ listenerRoot.addEventListener(
393
+ "focusout",
394
+ this.closeOnFocusOut,
395
+ { capture: true }
396
+ );
397
+ } else {
398
+ listenerRoot.removeEventListener(
399
+ "focusout",
400
+ this.closeOnFocusOut,
401
+ { capture: true }
402
+ );
403
+ }
404
+ }
405
+ if (!this.open) {
406
+ const getAncestors = () => {
407
+ var _a2;
408
+ const ancestors = [];
409
+ let currentNode = document.activeElement;
410
+ while ((currentNode == null ? void 0 : currentNode.shadowRoot) && currentNode.shadowRoot.activeElement) {
411
+ currentNode = currentNode.shadowRoot.activeElement;
412
+ }
413
+ while (currentNode) {
414
+ const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_a2 = currentNode.getRootNode()) == null ? void 0 : _a2.host);
415
+ if (ancestor) {
416
+ ancestors.push(ancestor);
417
+ }
418
+ currentNode = ancestor;
419
+ }
420
+ return ancestors;
421
+ };
422
+ if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(
423
+ this.getRootNode().activeElement
424
+ ) || getAncestors().includes(this))) {
425
+ this.triggerElement.focus();
426
+ }
427
+ }
428
+ }
429
+ unbindEvents() {
430
+ var _a;
431
+ (_a = this.abortController) == null ? void 0 : _a.abort();
432
+ }
433
+ bindEvents() {
434
+ if (!this.hasNonVirtualTrigger)
435
+ return;
436
+ this.abortController = new AbortController();
437
+ const nextTriggerElement = this.triggerElement;
438
+ switch (this.triggerInteraction) {
439
+ case "click":
440
+ this.bindClickEvents(nextTriggerElement);
441
+ return;
442
+ case "longpress":
443
+ this.bindLongpressEvents(nextTriggerElement);
444
+ return;
445
+ case "hover":
446
+ this.bindHoverEvents(nextTriggerElement);
447
+ return;
448
+ }
449
+ }
450
+ bindClickEvents(triggerElement) {
451
+ const options = { signal: this.abortController.signal };
452
+ triggerElement.addEventListener("click", this.handleClick, options);
453
+ triggerElement.addEventListener(
454
+ "pointerdown",
455
+ this.handlePointerdownForClick,
456
+ options
457
+ );
458
+ }
459
+ bindLongpressEvents(triggerElement) {
460
+ const options = { signal: this.abortController.signal };
461
+ triggerElement.addEventListener(
462
+ "longpress",
463
+ this.handleLongpress,
464
+ options
465
+ );
466
+ triggerElement.addEventListener(
467
+ "pointerdown",
468
+ this.handlePointerdown,
469
+ options
470
+ );
471
+ this.prepareLongpressDescription(triggerElement);
472
+ if (triggerElement.holdAffordance) {
473
+ return;
474
+ }
475
+ triggerElement.addEventListener("keydown", this.handleKeydown, options);
476
+ triggerElement.addEventListener("keyup", this.handleKeyup, options);
477
+ }
478
+ bindHoverEvents(triggerElement) {
479
+ const options = { signal: this.abortController.signal };
480
+ triggerElement.addEventListener("focusin", this.handleFocusin, options);
481
+ triggerElement.addEventListener(
482
+ "focusout",
483
+ this.handleFocusout,
484
+ options
485
+ );
486
+ triggerElement.addEventListener(
487
+ "pointerenter",
488
+ this.handlePointerenter,
489
+ options
490
+ );
491
+ triggerElement.addEventListener(
492
+ "pointerleave",
493
+ this.handlePointerleave,
494
+ options
495
+ );
496
+ this.addEventListener(
497
+ "pointerleave",
498
+ this.handleOverlayPointerleave,
499
+ options
500
+ );
501
+ }
502
+ manageTriggerElement(triggerElement) {
503
+ if (triggerElement) {
504
+ this.unbindEvents();
505
+ this.releaseAriaDescribedby();
506
+ }
507
+ const missingOrVirtual = !this.triggerElement || this.triggerElement instanceof VirtualTrigger;
508
+ if (missingOrVirtual) {
509
+ return;
510
+ }
511
+ this.bindEvents();
512
+ if (this.receivesFocus === "true")
513
+ return;
514
+ this.prepareAriaDescribedby();
515
+ }
516
+ prepareLongpressDescription(trigger) {
517
+ if (
518
+ // only "longpress" relationships are described this way
519
+ this.triggerInteraction !== "longpress" || // do not reapply until target it recycled
520
+ this.releaseLongpressDescribedby !== noop || // require "longpress content" to apply relationship
521
+ !this.elements.length
522
+ ) {
523
+ return;
524
+ }
525
+ const longpressDescription = document.createElement("div");
526
+ longpressDescription.id = `longpress-describedby-descriptor-${crypto.randomUUID().slice(0, 8)}`;
527
+ const messageType = isIOS() || isAndroid() ? "touch" : "keyboard";
528
+ longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];
529
+ longpressDescription.slot = "longpress-describedby-descriptor";
530
+ trigger.insertAdjacentElement("afterend", longpressDescription);
531
+ const releaseLongpressDescribedby = conditionAttributeWithId(
532
+ trigger,
533
+ "aria-describedby",
534
+ [longpressDescription.id]
535
+ );
536
+ this.releaseLongpressDescribedby = () => {
537
+ releaseLongpressDescribedby();
538
+ longpressDescription.remove();
539
+ this.releaseLongpressDescribedby = noop;
540
+ };
541
+ }
542
+ prepareAriaDescribedby() {
543
+ if (
544
+ // only "hover" relationships establed described by content
545
+ this.triggerInteraction !== "hover" || // do not reapply until target is recycled
546
+ this.releaseAriaDescribedby !== noop || // require "hover content" to apply relationship
547
+ !this.elements.length || // Virtual triggers can have no aria content
548
+ !this.hasNonVirtualTrigger
549
+ ) {
550
+ return;
551
+ }
552
+ const trigger = this.triggerElement;
553
+ const triggerRoot = trigger.getRootNode();
554
+ const contentRoot = this.elements[0].getRootNode();
555
+ const overlayRoot = this.getRootNode();
556
+ if (triggerRoot == overlayRoot) {
557
+ const releaseAriaDescribedby = conditionAttributeWithId(
558
+ trigger,
559
+ "aria-describedby",
560
+ [this.id]
561
+ );
562
+ this.releaseAriaDescribedby = () => {
563
+ releaseAriaDescribedby();
564
+ this.releaseAriaDescribedby = noop;
565
+ };
566
+ } else if (triggerRoot === contentRoot) {
567
+ this.elementIds = this.elements.map((el) => el.id);
568
+ const appliedIds = this.elements.map((el) => {
569
+ if (!el.id) {
570
+ el.id = `${this.tagName.toLowerCase()}-helper-${crypto.randomUUID().slice(0, 8)}`;
571
+ }
572
+ return el.id;
573
+ });
574
+ const releaseAriaDescribedby = conditionAttributeWithId(
575
+ trigger,
576
+ "aria-describedby",
577
+ appliedIds
578
+ );
579
+ this.releaseAriaDescribedby = () => {
580
+ releaseAriaDescribedby();
581
+ this.elements.map((el, index) => {
582
+ el.id = this.elementIds[index];
583
+ });
584
+ this.releaseAriaDescribedby = noop;
585
+ };
586
+ }
587
+ }
588
+ doPointerleave() {
589
+ this.pointerentered = false;
590
+ const triggerElement = this.triggerElement;
591
+ if (this.focusedin && triggerElement.matches(":focus-visible"))
592
+ return;
593
+ this.open = false;
594
+ }
595
+ handleBeforetoggle(event) {
596
+ if (event.newState !== "open") {
597
+ this.handleBrowserClose();
598
+ }
599
+ }
600
+ handleBrowserClose() {
601
+ if (this.longpressState !== "opening" && this.longpressState !== "pressed") {
602
+ this.open = false;
603
+ return;
604
+ }
605
+ this.manuallyKeepOpen();
606
+ }
607
+ manuallyKeepOpen() {
608
+ super.manuallyKeepOpen();
609
+ this.open = true;
610
+ this.placementController.allowPlacementUpdate = true;
611
+ this.manageOpen(false);
612
+ }
613
+ handleSlotchange() {
614
+ if (this.triggerElement) {
615
+ this.prepareAriaDescribedby();
616
+ }
617
+ if (!this.elements.length) {
618
+ this.releaseLongpressDescribedby();
619
+ } else if (this.hasNonVirtualTrigger) {
620
+ this.prepareLongpressDescription(
621
+ this.triggerElement
622
+ );
623
+ }
624
+ }
625
+ shouldPreventClose() {
626
+ const shouldPreventClose = this.willPreventClose;
627
+ this.willPreventClose = false;
628
+ return shouldPreventClose;
629
+ }
630
+ willUpdate(changes) {
631
+ var _a;
632
+ if (!this.hasAttribute("id")) {
633
+ this.setAttribute(
634
+ "id",
635
+ `${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0, 8)}`
636
+ );
637
+ }
638
+ if (changes.has("open") && (typeof changes.get("open") !== "undefined" || this.open)) {
639
+ this.manageOpen(changes.get("open"));
640
+ }
641
+ if (changes.has("trigger")) {
642
+ const [id, interaction] = ((_a = this.trigger) == null ? void 0 : _a.split("@")) || [];
643
+ this.elementResolver.selector = id ? `#${id}` : "";
644
+ this.triggerInteraction = interaction;
645
+ }
646
+ const oldTrigger = this.triggerElement;
647
+ if (changes.has(elementResolverUpdatedSymbol)) {
648
+ this.triggerElement = this.elementResolver.element;
649
+ this.manageTriggerElement(oldTrigger);
650
+ }
651
+ if (changes.has("triggerElement")) {
652
+ this.manageTriggerElement(changes.get("triggerElement"));
653
+ }
654
+ }
655
+ updated(changes) {
656
+ super.updated(changes);
657
+ if (changes.has("placement")) {
658
+ if (this.placement) {
659
+ this.dialogEl.setAttribute("actual-placement", this.placement);
660
+ } else {
661
+ this.dialogEl.removeAttribute("actual-placement");
662
+ }
663
+ if (this.open && typeof changes.get("placement") !== "undefined") {
664
+ this.placementController.resetOverlayPosition();
665
+ }
666
+ }
667
+ }
668
+ renderContent() {
669
+ return html`
670
+ <slot @slotchange=${this.handleSlotchange}></slot>
671
+ `;
672
+ }
673
+ get dialogStyleMap() {
674
+ return {
675
+ "--swc-overlay-open-count": _Overlay.openCount.toString()
676
+ };
677
+ }
678
+ renderDialog() {
679
+ return html`
680
+ <dialog
681
+ class="dialog"
682
+ part="dialog"
683
+ placement=${ifDefined(
684
+ this.requiresPosition ? this.placement || "right" : void 0
685
+ )}
686
+ style=${styleMap(this.dialogStyleMap)}
687
+ @close=${this.handleBrowserClose}
688
+ @cancel=${this.handleBrowserClose}
689
+ @beforetoggle=${this.handleBeforetoggle}
690
+ ?is-visible=${this.state !== "closed"}
691
+ >
692
+ ${this.renderContent()}
693
+ </dialog>
694
+ `;
695
+ }
696
+ renderPopover() {
697
+ return html`
698
+ <div
699
+ class="dialog"
700
+ part="dialog"
701
+ placement=${ifDefined(
702
+ this.requiresPosition ? this.placement || "right" : void 0
703
+ )}
704
+ popover=${ifDefined(this.popoverValue)}
705
+ style=${styleMap(this.dialogStyleMap)}
706
+ @beforetoggle=${this.handleBeforetoggle}
707
+ @close=${this.handleBrowserClose}
708
+ ?is-visible=${this.state !== "closed"}
709
+ >
710
+ ${this.renderContent()}
711
+ </div>
712
+ `;
713
+ }
714
+ render() {
715
+ const isDialog = this.type === "modal" || this.type === "page";
716
+ return html`
717
+ ${isDialog ? this.renderDialog() : this.renderPopover()}
718
+ <slot name="longpress-describedby-descriptor"></slot>
719
+ `;
720
+ }
721
+ connectedCallback() {
722
+ super.connectedCallback();
723
+ this.addEventListener("close", () => {
724
+ this.open = false;
725
+ });
726
+ if (this.hasNonVirtualTrigger) {
727
+ this.bindEvents();
728
+ }
729
+ }
730
+ disconnectedCallback() {
731
+ if (this.hasNonVirtualTrigger) {
732
+ this.unbindEvents();
733
+ }
734
+ this.releaseAriaDescribedby();
735
+ this.releaseLongpressDescribedby();
736
+ this.open = false;
737
+ super.disconnectedCallback();
738
+ }
739
+ };
740
+ _Overlay.styles = [styles];
741
+ _Overlay.openCount = 1;
742
+ __decorateClass([
743
+ property({ type: Boolean })
744
+ ], _Overlay.prototype, "delayed", 2);
745
+ __decorateClass([
746
+ query(".dialog")
747
+ ], _Overlay.prototype, "dialogEl", 2);
748
+ __decorateClass([
749
+ property({ type: Boolean })
750
+ ], _Overlay.prototype, "disabled", 1);
751
+ __decorateClass([
752
+ queryAssignedElements({
753
+ flatten: true,
754
+ selector: ':not([slot="longpress-describedby-descriptor"], slot)'
755
+ // gather only elements slotted into the default slot
756
+ })
757
+ ], _Overlay.prototype, "elements", 2);
758
+ __decorateClass([
759
+ property({ type: Number })
760
+ ], _Overlay.prototype, "offset", 2);
761
+ __decorateClass([
762
+ property({ type: Boolean, reflect: true })
763
+ ], _Overlay.prototype, "open", 1);
764
+ __decorateClass([
765
+ property()
766
+ ], _Overlay.prototype, "placement", 2);
767
+ __decorateClass([
768
+ property({ attribute: "receives-focus" })
769
+ ], _Overlay.prototype, "receivesFocus", 2);
770
+ __decorateClass([
771
+ query("slot")
772
+ ], _Overlay.prototype, "slotEl", 2);
773
+ __decorateClass([
774
+ state()
775
+ ], _Overlay.prototype, "state", 1);
776
+ __decorateClass([
777
+ property({ type: Number, attribute: "tip-padding" })
778
+ ], _Overlay.prototype, "tipPadding", 2);
779
+ __decorateClass([
780
+ property()
781
+ ], _Overlay.prototype, "trigger", 2);
782
+ __decorateClass([
783
+ property({ attribute: false })
784
+ ], _Overlay.prototype, "triggerElement", 2);
785
+ __decorateClass([
786
+ property({ attribute: false })
787
+ ], _Overlay.prototype, "triggerInteraction", 2);
788
+ __decorateClass([
789
+ property()
790
+ ], _Overlay.prototype, "type", 2);
791
+ export let Overlay = _Overlay;
792
+ //# sourceMappingURL=Overlay.dev.js.map