@spectrum-web-components/overlay 0.30.0 → 0.30.1-overlay.30

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