@spectrum-web-components/overlay 0.33.2 → 0.33.3-overlay.65

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