@spectrum-web-components/overlay 0.35.1-rc.41 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +150 -237
  2. package/active-overlay.d.ts +6 -0
  3. package/active-overlay.dev.js +5 -0
  4. package/{sp-overlay.dev.js.map → active-overlay.dev.js.map} +3 -3
  5. package/active-overlay.js +2 -0
  6. package/{sp-overlay.js.map → active-overlay.js.map} +4 -4
  7. package/custom-elements.json +1215 -0
  8. package/package.json +22 -49
  9. package/src/ActiveOverlay.d.ts +84 -0
  10. package/src/ActiveOverlay.dev.js +517 -0
  11. package/src/ActiveOverlay.dev.js.map +7 -0
  12. package/src/ActiveOverlay.js +16 -0
  13. package/src/ActiveOverlay.js.map +7 -0
  14. package/src/OverlayTrigger.d.ts +41 -24
  15. package/src/OverlayTrigger.dev.js +295 -133
  16. package/src/OverlayTrigger.dev.js.map +3 -3
  17. package/src/OverlayTrigger.js +22 -52
  18. package/src/OverlayTrigger.js.map +3 -3
  19. package/src/VirtualTrigger.dev.js +1 -2
  20. package/src/VirtualTrigger.dev.js.map +2 -2
  21. package/src/VirtualTrigger.js +1 -1
  22. package/src/VirtualTrigger.js.map +2 -2
  23. package/src/active-overlay.css.dev.js +13 -0
  24. package/src/active-overlay.css.dev.js.map +7 -0
  25. package/src/active-overlay.css.js +10 -0
  26. package/src/active-overlay.css.js.map +7 -0
  27. package/src/index.d.ts +3 -2
  28. package/src/index.dev.js +3 -2
  29. package/src/index.dev.js.map +2 -2
  30. package/src/index.js +1 -1
  31. package/src/index.js.map +2 -2
  32. package/src/loader.d.ts +2 -1
  33. package/src/loader.dev.js +19 -2
  34. package/src/loader.dev.js.map +2 -2
  35. package/src/loader.js +1 -1
  36. package/src/loader.js.map +3 -3
  37. package/src/overlay-stack.d.ts +50 -0
  38. package/src/overlay-stack.dev.js +515 -0
  39. package/src/overlay-stack.dev.js.map +7 -0
  40. package/src/overlay-stack.js +34 -0
  41. package/src/overlay-stack.js.map +7 -0
  42. package/src/overlay-timer.dev.js.map +2 -2
  43. package/src/overlay-timer.js.map +2 -2
  44. package/src/overlay-trigger.css.dev.js +1 -1
  45. package/src/overlay-trigger.css.dev.js.map +1 -1
  46. package/src/overlay-trigger.css.js +1 -1
  47. package/src/overlay-trigger.css.js.map +1 -1
  48. package/src/overlay-types.d.ts +31 -25
  49. package/src/overlay-types.dev.js +0 -1
  50. package/src/overlay-types.dev.js.map +3 -3
  51. package/src/overlay-types.js +1 -1
  52. package/src/overlay-types.js.map +3 -3
  53. package/src/overlay-utils.d.ts +3 -0
  54. package/src/overlay-utils.dev.js +31 -0
  55. package/src/overlay-utils.dev.js.map +7 -0
  56. package/src/overlay-utils.js +2 -0
  57. package/src/overlay-utils.js.map +7 -0
  58. package/src/overlay.d.ts +59 -0
  59. package/src/overlay.dev.js +127 -0
  60. package/src/overlay.dev.js.map +7 -0
  61. package/src/overlay.js +2 -0
  62. package/src/overlay.js.map +7 -0
  63. package/stories/overlay-story-components.js +8 -9
  64. package/stories/overlay-story-components.js.map +2 -2
  65. package/stories/overlay.stories.js +697 -825
  66. package/stories/overlay.stories.js.map +2 -2
  67. package/sync/overlay-trigger.d.ts +0 -4
  68. package/sync/overlay-trigger.dev.js +4 -1
  69. package/sync/overlay-trigger.dev.js.map +2 -2
  70. package/sync/overlay-trigger.js +1 -1
  71. package/sync/overlay-trigger.js.map +3 -3
  72. package/test/benchmark/basic-test.js +1 -1
  73. package/test/benchmark/basic-test.js.map +1 -1
  74. package/test/index.js +377 -408
  75. package/test/index.js.map +3 -3
  76. package/test/overlay-lifecycle.test.js +106 -34
  77. package/test/overlay-lifecycle.test.js.map +2 -2
  78. package/test/overlay-trigger-click.test.js +5 -11
  79. package/test/overlay-trigger-click.test.js.map +2 -2
  80. package/test/overlay-trigger-extended.test.js +36 -42
  81. package/test/overlay-trigger-extended.test.js.map +2 -2
  82. package/test/overlay-trigger-hover-click.test.js +24 -27
  83. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  84. package/test/overlay-trigger-hover.test.js +35 -41
  85. package/test/overlay-trigger-hover.test.js.map +2 -2
  86. package/test/overlay-trigger-longpress.test.js +81 -206
  87. package/test/overlay-trigger-longpress.test.js.map +2 -2
  88. package/test/overlay-trigger-sync.test.js +1 -1
  89. package/test/overlay-trigger-sync.test.js.map +2 -2
  90. package/test/overlay-trigger.test.js +1 -1
  91. package/test/overlay-trigger.test.js.map +2 -2
  92. package/test/overlay-update.test.js +4 -4
  93. package/test/overlay-update.test.js.map +2 -2
  94. package/test/overlay.test.js +268 -386
  95. package/test/overlay.test.js.map +3 -3
  96. package/sp-overlay.d.ts +0 -6
  97. package/sp-overlay.dev.js +0 -5
  98. package/sp-overlay.js +0 -2
  99. package/src/AbstractOverlay.d.ts +0 -56
  100. package/src/AbstractOverlay.dev.js +0 -202
  101. package/src/AbstractOverlay.dev.js.map +0 -7
  102. package/src/AbstractOverlay.js +0 -2
  103. package/src/AbstractOverlay.js.map +0 -7
  104. package/src/Overlay.d.ts +0 -147
  105. package/src/Overlay.dev.js +0 -777
  106. package/src/Overlay.dev.js.map +0 -7
  107. package/src/Overlay.js +0 -33
  108. package/src/Overlay.js.map +0 -7
  109. package/src/OverlayDialog.d.ts +0 -4
  110. package/src/OverlayDialog.dev.js +0 -135
  111. package/src/OverlayDialog.dev.js.map +0 -7
  112. package/src/OverlayDialog.js +0 -2
  113. package/src/OverlayDialog.js.map +0 -7
  114. package/src/OverlayNoPopover.d.ts +0 -4
  115. package/src/OverlayNoPopover.dev.js +0 -110
  116. package/src/OverlayNoPopover.dev.js.map +0 -7
  117. package/src/OverlayNoPopover.js +0 -2
  118. package/src/OverlayNoPopover.js.map +0 -7
  119. package/src/OverlayPopover.d.ts +0 -4
  120. package/src/OverlayPopover.dev.js +0 -169
  121. package/src/OverlayPopover.dev.js.map +0 -7
  122. package/src/OverlayPopover.js +0 -2
  123. package/src/OverlayPopover.js.map +0 -7
  124. package/src/OverlayStack.d.ts +0 -43
  125. package/src/OverlayStack.dev.js +0 -150
  126. package/src/OverlayStack.dev.js.map +0 -7
  127. package/src/OverlayStack.js +0 -2
  128. package/src/OverlayStack.js.map +0 -7
  129. package/src/PlacementController.d.ts +0 -38
  130. package/src/PlacementController.dev.js +0 -199
  131. package/src/PlacementController.dev.js.map +0 -7
  132. package/src/PlacementController.js +0 -2
  133. package/src/PlacementController.js.map +0 -7
  134. package/src/fullSizePlugin.d.ts +0 -12
  135. package/src/fullSizePlugin.dev.js +0 -39
  136. package/src/fullSizePlugin.dev.js.map +0 -7
  137. package/src/fullSizePlugin.js +0 -2
  138. package/src/fullSizePlugin.js.map +0 -7
  139. package/src/overlay.css.dev.js +0 -9
  140. package/src/overlay.css.dev.js.map +0 -7
  141. package/src/overlay.css.js +0 -6
  142. package/src/overlay.css.js.map +0 -7
  143. package/src/topLayerOverTransforms.d.ts +0 -2
  144. package/src/topLayerOverTransforms.dev.js +0 -90
  145. package/src/topLayerOverTransforms.dev.js.map +0 -7
  146. package/src/topLayerOverTransforms.js +0 -2
  147. package/src/topLayerOverTransforms.js.map +0 -7
  148. package/stories/overlay-element.stories.js +0 -366
  149. package/stories/overlay-element.stories.js.map +0 -7
  150. package/test/overlay-element.test-vrt.js +0 -5
  151. package/test/overlay-element.test-vrt.js.map +0 -7
  152. package/test/overlay-element.test.js +0 -681
  153. package/test/overlay-element.test.js.map +0 -7
  154. package/test/overlay-v1.test.js +0 -651
  155. package/test/overlay-v1.test.js.map +0 -7
  156. /package/src/{overlay.css.d.ts → active-overlay.css.d.ts} +0 -0
@@ -1,777 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __decorateClass = (decorators, target, key, kind) => {
5
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
6
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
7
- if (decorator = decorators[i])
8
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
9
- if (kind && result)
10
- __defProp(target, key, result);
11
- return result;
12
- };
13
- import {
14
- html
15
- } from "@spectrum-web-components/base";
16
- import {
17
- property,
18
- query,
19
- queryAssignedElements,
20
- state
21
- } from "@spectrum-web-components/base/src/decorators.js";
22
- import {
23
- isAndroid,
24
- isIOS
25
- } from "@spectrum-web-components/shared/src/platform.js";
26
- import {
27
- ElementResolutionController,
28
- elementResolverUpdatedSymbol
29
- } from "@spectrum-web-components/reactive-controllers/src/ElementResolution.js";
30
- import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
31
- import {
32
- ifDefined,
33
- styleMap
34
- } from "@spectrum-web-components/base/src/directives.js";
35
- import { AbstractOverlay, nextFrame } from "./AbstractOverlay.dev.js";
36
- import { OverlayDialog } from "./OverlayDialog.dev.js";
37
- import { OverlayPopover } from "./OverlayPopover.dev.js";
38
- import { OverlayNoPopover } from "./OverlayNoPopover.dev.js";
39
- import { overlayStack } from "./OverlayStack.dev.js";
40
- import { noop } from "./AbstractOverlay.dev.js";
41
- import { VirtualTrigger } from "./VirtualTrigger.dev.js";
42
- import { PlacementController } from "./PlacementController.dev.js";
43
- import styles from "./overlay.css.js";
44
- const LONGPRESS_DURATION = 300;
45
- export const LONGPRESS_INSTRUCTIONS = {
46
- touch: "Double tap and long press for additional options",
47
- keyboard: "Press Space or Alt+Down Arrow for additional options",
48
- mouse: "Click and hold for additional options"
49
- };
50
- const supportsPopover = "showPopover" in document.createElement("div");
51
- let OverlayFeatures = OverlayDialog(AbstractOverlay);
52
- if (supportsPopover) {
53
- OverlayFeatures = OverlayPopover(OverlayFeatures);
54
- } else {
55
- OverlayFeatures = OverlayNoPopover(OverlayFeatures);
56
- }
57
- const _Overlay = class _Overlay extends OverlayFeatures {
58
- constructor() {
59
- super(...arguments);
60
- this.delayed = false;
61
- this._disabled = false;
62
- this.longpressState = "null";
63
- this.offset = 6;
64
- this.placementController = new PlacementController(this);
65
- this._open = false;
66
- this.receivesFocus = "auto";
67
- this.releaseAriaDescribedby = noop;
68
- this.releaseLongpressDescribedby = noop;
69
- this._state = "closed";
70
- this.triggerElement = null;
71
- this.type = "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.placementController.allowPlacementUpdate = true;
575
- this.manageOpen(false);
576
- }
577
- handleSlotchange() {
578
- if (this.triggerElement) {
579
- this.prepareAriaDescribedby(this.triggerElement);
580
- }
581
- if (!this.elements.length) {
582
- this.releaseLongpressDescribedby();
583
- } else if (this.hasNonVirtualTrigger) {
584
- this.prepareLongpressDescription(
585
- this.triggerElement
586
- );
587
- }
588
- }
589
- shouldPreventClose() {
590
- const shouldPreventClose = this.willPreventClose;
591
- this.willPreventClose = false;
592
- return shouldPreventClose;
593
- }
594
- willUpdate(changes) {
595
- var _a;
596
- if (!this.hasUpdated) {
597
- this.addEventListener("focusout", (event) => {
598
- if (this.type !== "auto") {
599
- return;
600
- }
601
- if (!event.relatedTarget) {
602
- return;
603
- }
604
- const relationEvent = new Event("overlay-relation-query", {
605
- bubbles: true,
606
- composed: true
607
- });
608
- event.relatedTarget.addEventListener(
609
- relationEvent.type,
610
- (event2) => {
611
- if (!event2.composedPath().includes(this)) {
612
- this.open = false;
613
- }
614
- }
615
- );
616
- event.relatedTarget.dispatchEvent(relationEvent);
617
- });
618
- }
619
- if (!this.hasAttribute("id")) {
620
- this.setAttribute(
621
- "id",
622
- `${this.tagName.toLowerCase()}-${crypto.randomUUID().slice(0, 8)}`
623
- );
624
- }
625
- if (changes.has("open") && (typeof changes.get("open") !== "undefined" || this.open)) {
626
- this.manageOpen(changes.get("open"));
627
- }
628
- if (changes.has("trigger")) {
629
- const [id, interaction] = ((_a = this.trigger) == null ? void 0 : _a.split("@")) || [];
630
- this.elementResolver.selector = id ? `#${id}` : "";
631
- this.triggerInteraction = interaction;
632
- }
633
- const oldTrigger = this.triggerElement;
634
- if (changes.has(elementResolverUpdatedSymbol)) {
635
- this.triggerElement = this.elementResolver.element;
636
- this.manageTriggerElement(oldTrigger);
637
- }
638
- if (changes.has("triggerElement")) {
639
- this.manageTriggerElement(changes.get("triggerElement"));
640
- }
641
- }
642
- updated(changes) {
643
- super.updated(changes);
644
- if (changes.has("placement")) {
645
- if (this.placement) {
646
- this.dialogEl.setAttribute("actual-placement", this.placement);
647
- } else {
648
- this.dialogEl.removeAttribute("actual-placement");
649
- }
650
- if (this.open && typeof changes.get("placement") !== "undefined") {
651
- this.placementController.resetOverlayPosition();
652
- }
653
- }
654
- }
655
- renderContent() {
656
- return html`
657
- <div style=${styleMap(this.dialogStyleMap)} part="content">
658
- <slot @slotchange=${this.handleSlotchange}></slot>
659
- </div>
660
- `;
661
- }
662
- get dialogStyleMap() {
663
- return {
664
- "--swc-overlay-open-count": _Overlay.openCount.toString()
665
- };
666
- }
667
- renderDialog() {
668
- return html`
669
- <dialog
670
- class="dialog"
671
- part="dialog"
672
- placement=${ifDefined(
673
- this.requiresPosition ? this.placement || "right" : void 0
674
- )}
675
- @close=${this.handleBrowserClose}
676
- @cancel=${this.handleBrowserClose}
677
- @beforetoggle=${this.handleBeforetoggle}
678
- ?is-visible=${this.state !== "closed"}
679
- >
680
- ${this.renderContent()}
681
- </dialog>
682
- `;
683
- }
684
- renderPopover() {
685
- return html`
686
- <div
687
- class="dialog"
688
- part="dialog"
689
- placement=${ifDefined(
690
- this.requiresPosition ? this.placement || "right" : void 0
691
- )}
692
- popover=${ifDefined(this.popoverValue)}
693
- @beforetoggle=${this.handleBeforetoggle}
694
- @close=${this.handleBrowserClose}
695
- ?is-visible=${this.state !== "closed"}
696
- >
697
- ${this.renderContent()}
698
- </div>
699
- `;
700
- }
701
- render() {
702
- const isDialog = this.type === "modal" || this.type === "page";
703
- return html`
704
- ${isDialog ? this.renderDialog() : this.renderPopover()}
705
- <slot name="longpress-describedby-descriptor"></slot>
706
- `;
707
- }
708
- connectedCallback() {
709
- super.connectedCallback();
710
- this.addEventListener("close", () => {
711
- this.open = false;
712
- });
713
- if (this.hasNonVirtualTrigger) {
714
- this.bindEvents();
715
- }
716
- }
717
- disconnectedCallback() {
718
- if (this.hasNonVirtualTrigger) {
719
- this.unbindEvents();
720
- }
721
- this.open = false;
722
- super.disconnectedCallback();
723
- }
724
- };
725
- _Overlay.styles = [styles];
726
- _Overlay.openCount = 1;
727
- __decorateClass([
728
- property({ type: Boolean })
729
- ], _Overlay.prototype, "delayed", 2);
730
- __decorateClass([
731
- query(".dialog")
732
- ], _Overlay.prototype, "dialogEl", 2);
733
- __decorateClass([
734
- property({ type: Boolean })
735
- ], _Overlay.prototype, "disabled", 1);
736
- __decorateClass([
737
- queryAssignedElements({
738
- flatten: true,
739
- selector: ':not([slot="longpress-describedby-descriptor"])'
740
- // gather only elements slotted into the default slot
741
- })
742
- ], _Overlay.prototype, "elements", 2);
743
- __decorateClass([
744
- property({ type: Number })
745
- ], _Overlay.prototype, "offset", 2);
746
- __decorateClass([
747
- property({ type: Boolean, reflect: true })
748
- ], _Overlay.prototype, "open", 1);
749
- __decorateClass([
750
- property()
751
- ], _Overlay.prototype, "placement", 2);
752
- __decorateClass([
753
- property({ attribute: "receives-focus" })
754
- ], _Overlay.prototype, "receivesFocus", 2);
755
- __decorateClass([
756
- query("slot")
757
- ], _Overlay.prototype, "slotEl", 2);
758
- __decorateClass([
759
- state()
760
- ], _Overlay.prototype, "state", 1);
761
- __decorateClass([
762
- property({ type: Number, attribute: "tip-padding" })
763
- ], _Overlay.prototype, "tipPadding", 2);
764
- __decorateClass([
765
- property()
766
- ], _Overlay.prototype, "trigger", 2);
767
- __decorateClass([
768
- property({ attribute: false })
769
- ], _Overlay.prototype, "triggerElement", 2);
770
- __decorateClass([
771
- property({ attribute: false })
772
- ], _Overlay.prototype, "triggerInteraction", 2);
773
- __decorateClass([
774
- property()
775
- ], _Overlay.prototype, "type", 2);
776
- export let Overlay = _Overlay;
777
- //# sourceMappingURL=Overlay.dev.js.map