@spectrum-web-components/overlay 0.35.0 → 0.35.1-rc.24

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