@spectrum-web-components/overlay 0.41.0 → 0.41.2

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 (100) hide show
  1. package/custom-elements.json +996 -314
  2. package/package.json +31 -7
  3. package/src/AbstractOverlay.d.ts +13 -3
  4. package/src/AbstractOverlay.dev.js +54 -19
  5. package/src/AbstractOverlay.dev.js.map +2 -2
  6. package/src/AbstractOverlay.js +1 -1
  7. package/src/AbstractOverlay.js.map +3 -3
  8. package/src/ClickController.d.ts +14 -0
  9. package/src/ClickController.dev.js +42 -0
  10. package/src/ClickController.dev.js.map +7 -0
  11. package/src/ClickController.js +2 -0
  12. package/src/ClickController.js.map +7 -0
  13. package/src/HoverController.d.ts +19 -0
  14. package/src/HoverController.dev.js +141 -0
  15. package/src/HoverController.dev.js.map +7 -0
  16. package/src/HoverController.js +2 -0
  17. package/src/HoverController.js.map +7 -0
  18. package/src/InteractionController.d.ts +23 -0
  19. package/src/InteractionController.dev.js +45 -0
  20. package/src/InteractionController.dev.js.map +7 -0
  21. package/src/InteractionController.js +2 -0
  22. package/src/InteractionController.js.map +7 -0
  23. package/src/LongpressController.d.ts +21 -0
  24. package/src/LongpressController.dev.js +157 -0
  25. package/src/LongpressController.dev.js.map +7 -0
  26. package/src/LongpressController.js +2 -0
  27. package/src/LongpressController.js.map +7 -0
  28. package/src/Overlay.d.ts +17 -50
  29. package/src/Overlay.dev.js +86 -363
  30. package/src/Overlay.dev.js.map +2 -2
  31. package/src/Overlay.js +10 -10
  32. package/src/Overlay.js.map +3 -3
  33. package/src/OverlayDialog.dev.js +8 -1
  34. package/src/OverlayDialog.dev.js.map +2 -2
  35. package/src/OverlayDialog.js +1 -1
  36. package/src/OverlayDialog.js.map +3 -3
  37. package/src/OverlayNoPopover.dev.js +9 -3
  38. package/src/OverlayNoPopover.dev.js.map +2 -2
  39. package/src/OverlayNoPopover.js +1 -1
  40. package/src/OverlayNoPopover.js.map +3 -3
  41. package/src/OverlayPopover.dev.js +10 -1
  42. package/src/OverlayPopover.dev.js.map +2 -2
  43. package/src/OverlayPopover.js +1 -1
  44. package/src/OverlayPopover.js.map +3 -3
  45. package/src/OverlayStack.dev.js +3 -0
  46. package/src/OverlayStack.dev.js.map +2 -2
  47. package/src/OverlayStack.js +1 -1
  48. package/src/OverlayStack.js.map +2 -2
  49. package/src/index.d.ts +1 -0
  50. package/src/index.dev.js +1 -0
  51. package/src/index.dev.js.map +2 -2
  52. package/src/index.js +1 -1
  53. package/src/index.js.map +2 -2
  54. package/src/overlay-trigger-directive.d.ts +31 -0
  55. package/src/overlay-trigger-directive.dev.js +102 -0
  56. package/src/overlay-trigger-directive.dev.js.map +7 -0
  57. package/src/overlay-trigger-directive.js +2 -0
  58. package/src/overlay-trigger-directive.js.map +7 -0
  59. package/src/overlay-trigger.css.dev.js +1 -1
  60. package/src/overlay-trigger.css.dev.js.map +1 -1
  61. package/src/overlay-trigger.css.js +1 -1
  62. package/src/overlay-trigger.css.js.map +1 -1
  63. package/src/overlay-types.d.ts +7 -0
  64. package/src/overlay-types.dev.js.map +1 -1
  65. package/src/overlay-types.js.map +1 -1
  66. package/src/overlay.css.dev.js +1 -3
  67. package/src/overlay.css.dev.js.map +2 -2
  68. package/src/overlay.css.js +1 -3
  69. package/src/overlay.css.js.map +2 -2
  70. package/src/slottable-request-event.d.ts +7 -0
  71. package/src/slottable-request-event.dev.js +28 -0
  72. package/src/slottable-request-event.dev.js.map +7 -0
  73. package/src/slottable-request-event.js +2 -0
  74. package/src/slottable-request-event.js.map +7 -0
  75. package/stories/overlay-directive.stories.js +203 -0
  76. package/stories/overlay-directive.stories.js.map +7 -0
  77. package/stories/overlay-element.stories.js +44 -1
  78. package/stories/overlay-element.stories.js.map +2 -2
  79. package/stories/overlay.stories.js +9 -9
  80. package/stories/overlay.stories.js.map +2 -2
  81. package/test/benchmark/basic-test.js +24 -1
  82. package/test/benchmark/basic-test.js.map +2 -2
  83. package/test/benchmark/directive-test.js +42 -0
  84. package/test/benchmark/directive-test.js.map +7 -0
  85. package/test/benchmark/element-test.js +40 -0
  86. package/test/benchmark/element-test.js.map +7 -0
  87. package/test/benchmark/lazy-test.js +48 -0
  88. package/test/benchmark/lazy-test.js.map +7 -0
  89. package/test/index.js +11 -176
  90. package/test/index.js.map +2 -2
  91. package/test/overlay-directive.test-vrt.js +5 -0
  92. package/test/overlay-directive.test-vrt.js.map +7 -0
  93. package/test/overlay-directive.test.js +147 -0
  94. package/test/overlay-directive.test.js.map +7 -0
  95. package/test/overlay-element.test.js +152 -1
  96. package/test/overlay-element.test.js.map +2 -2
  97. package/test/overlay-trigger-directive.test.js +75 -0
  98. package/test/overlay-trigger-directive.test.js.map +7 -0
  99. package/test/overlay-trigger-extended.test.js +1 -1
  100. package/test/overlay-trigger-extended.test.js.map +2 -2
@@ -19,15 +19,10 @@ import {
19
19
  queryAssignedElements,
20
20
  state
21
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
22
  import {
27
23
  ElementResolutionController,
28
24
  elementResolverUpdatedSymbol
29
25
  } from "@spectrum-web-components/reactive-controllers/src/ElementResolution.js";
30
- import { conditionAttributeWithId } from "@spectrum-web-components/base/src/condition-attribute-with-id.js";
31
26
  import {
32
27
  ifDefined,
33
28
  styleMap
@@ -38,17 +33,17 @@ import { OverlayDialog } from "./OverlayDialog.dev.js";
38
33
  import { OverlayPopover } from "./OverlayPopover.dev.js";
39
34
  import { OverlayNoPopover } from "./OverlayNoPopover.dev.js";
40
35
  import { overlayStack } from "./OverlayStack.dev.js";
41
- import { noop } from "./AbstractOverlay.dev.js";
42
36
  import { VirtualTrigger } from "./VirtualTrigger.dev.js";
43
37
  import { PlacementController } from "./PlacementController.dev.js";
38
+ import { ClickController } from "./ClickController.dev.js";
39
+ import { HoverController } from "./HoverController.dev.js";
40
+ import { LongpressController } from "./LongpressController.dev.js";
41
+ export { LONGPRESS_INSTRUCTIONS } from "./LongpressController.dev.js";
42
+ import {
43
+ removeSlottableRequest,
44
+ SlottableRequestEvent
45
+ } from "./slottable-request-event.dev.js";
44
46
  import styles from "./overlay.css.js";
45
- const LONGPRESS_DURATION = 300;
46
- const HOVER_DELAY = 300;
47
- export const LONGPRESS_INSTRUCTIONS = {
48
- touch: "Double tap and long press for additional options",
49
- keyboard: "Press Space or Alt+Down Arrow for additional options",
50
- mouse: "Click and hold for additional options"
51
- };
52
47
  const supportsPopover = "showPopover" in document.createElement("div");
53
48
  let OverlayFeatures = OverlayDialog(AbstractOverlay);
54
49
  if (supportsPopover) {
@@ -56,23 +51,23 @@ if (supportsPopover) {
56
51
  } else {
57
52
  OverlayFeatures = OverlayNoPopover(OverlayFeatures);
58
53
  }
54
+ export const strategies = {
55
+ click: ClickController,
56
+ longpress: LongpressController,
57
+ hover: HoverController
58
+ };
59
59
  const _Overlay = class _Overlay extends OverlayFeatures {
60
60
  constructor() {
61
61
  super(...arguments);
62
62
  this._delayed = false;
63
63
  this._disabled = false;
64
- this.longpressState = "null";
65
64
  this.offset = 0;
66
- this.placementController = new PlacementController(this);
67
65
  this._open = false;
68
66
  this.receivesFocus = "auto";
69
- this.releaseAriaDescribedby = noop;
70
- this.releaseLongpressDescribedby = noop;
71
67
  this._state = "closed";
72
68
  this.triggerElement = null;
73
69
  this.type = "auto";
74
70
  this.wasOpen = false;
75
- this.elementResolver = new ElementResolutionController(this);
76
71
  this.closeOnFocusOut = (event) => {
77
72
  if (!event.relatedTarget) {
78
73
  return;
@@ -91,133 +86,6 @@ const _Overlay = class _Overlay extends OverlayFeatures {
91
86
  );
92
87
  event.relatedTarget.dispatchEvent(relationEvent);
93
88
  };
94
- this.elementIds = [];
95
- this.handlePointerdown = (event) => {
96
- if (!this.triggerElement)
97
- return;
98
- if (event.button !== 0)
99
- return;
100
- const triggerElement = this.triggerElement;
101
- this.longpressState = "potential";
102
- document.addEventListener("pointerup", this.handlePointerup);
103
- document.addEventListener("pointercancel", this.handlePointerup);
104
- if (triggerElement.holdAffordance) {
105
- return;
106
- }
107
- this.longressTimeout = setTimeout(() => {
108
- if (!triggerElement)
109
- return;
110
- triggerElement.dispatchEvent(
111
- new CustomEvent("longpress", {
112
- bubbles: true,
113
- composed: true,
114
- detail: {
115
- source: "pointer"
116
- }
117
- })
118
- );
119
- }, LONGPRESS_DURATION);
120
- };
121
- this.handlePointerup = () => {
122
- clearTimeout(this.longressTimeout);
123
- if (!this.triggerElement)
124
- return;
125
- this.longpressState = this.state === "opening" ? "pressed" : "null";
126
- document.removeEventListener("pointerup", this.handlePointerup);
127
- document.removeEventListener("pointercancel", this.handlePointerup);
128
- };
129
- /**
130
- * @private
131
- */
132
- this.handleKeydown = (event) => {
133
- const { code, altKey } = event;
134
- if (code === "Space" || altKey && code === "ArrowDown") {
135
- if (code === "ArrowDown") {
136
- event.stopPropagation();
137
- event.stopImmediatePropagation();
138
- }
139
- }
140
- };
141
- this.handleKeyup = (event) => {
142
- const { code, altKey } = event;
143
- if (code === "Space" || altKey && code === "ArrowDown") {
144
- if (!this.triggerElement || !this.hasNonVirtualTrigger) {
145
- return;
146
- }
147
- event.stopPropagation();
148
- this.triggerElement.dispatchEvent(
149
- new CustomEvent("longpress", {
150
- bubbles: true,
151
- composed: true,
152
- detail: {
153
- source: "keyboard"
154
- }
155
- })
156
- );
157
- setTimeout(() => {
158
- this.longpressState = "null";
159
- });
160
- }
161
- };
162
- /**
163
- * An overlay with a `click` interaction should not close on click `triggerElement`.
164
- * When a click is initiated (`pointerdown`), apply `preventNextToggle` when the
165
- * overlay is `open` to prevent from toggling the overlay when the click event
166
- * propagates later in the interaction.
167
- */
168
- this.preventNextToggle = false;
169
- this.handlePointerdownForClick = () => {
170
- this.preventNextToggle = this.open;
171
- };
172
- this.handleClick = () => {
173
- if (this.longpressState === "opening" || this.longpressState === "pressed") {
174
- return;
175
- }
176
- if (!this.preventNextToggle) {
177
- this.open = !this.open;
178
- }
179
- this.preventNextToggle = false;
180
- };
181
- this.focusedin = false;
182
- this.handleFocusin = () => {
183
- this.open = true;
184
- this.focusedin = true;
185
- };
186
- this.handleFocusout = () => {
187
- this.focusedin = false;
188
- if (this.pointerentered)
189
- return;
190
- this.open = false;
191
- };
192
- this.pointerentered = false;
193
- this.handlePointerenter = () => {
194
- if (this.hoverTimeout) {
195
- clearTimeout(this.hoverTimeout);
196
- delete this.hoverTimeout;
197
- }
198
- if (this.disabled)
199
- return;
200
- this.open = true;
201
- this.pointerentered = true;
202
- };
203
- // set a timeout once the pointer enters and the overlay is shown
204
- // give the user time to enter the overlay
205
- this.handleOverlayPointerenter = () => {
206
- if (this.hoverTimeout) {
207
- clearTimeout(this.hoverTimeout);
208
- delete this.hoverTimeout;
209
- }
210
- };
211
- this.handlePointerleave = () => {
212
- this.doPointerleave();
213
- };
214
- this.handleOverlayPointerleave = () => {
215
- this.doPointerleave();
216
- };
217
- this.handleLongpress = () => {
218
- this.open = true;
219
- this.longpressState = this.longpressState === "potential" ? "opening" : "pressed";
220
- };
221
89
  }
222
90
  get delayed() {
223
91
  var _a;
@@ -230,11 +98,10 @@ const _Overlay = class _Overlay extends OverlayFeatures {
230
98
  return this._disabled;
231
99
  }
232
100
  set disabled(disabled) {
101
+ var _a;
233
102
  this._disabled = disabled;
234
103
  if (disabled) {
235
- if (this.hasNonVirtualTrigger) {
236
- this.unbindEvents();
237
- }
104
+ (_a = this.strategy) == null ? void 0 : _a.abort();
238
105
  this.wasOpen = this.open;
239
106
  this.open = false;
240
107
  } else {
@@ -246,35 +113,52 @@ const _Overlay = class _Overlay extends OverlayFeatures {
246
113
  get hasNonVirtualTrigger() {
247
114
  return !!this.triggerElement && !(this.triggerElement instanceof VirtualTrigger);
248
115
  }
116
+ get placementController() {
117
+ if (!this._placementController) {
118
+ this._placementController = new PlacementController(this);
119
+ }
120
+ return this._placementController;
121
+ }
249
122
  get open() {
250
123
  return this._open;
251
124
  }
252
125
  set open(open) {
126
+ var _a;
253
127
  if (open && this.disabled)
254
128
  return;
255
129
  if (open === this.open)
256
130
  return;
257
- if ((this.longpressState === "opening" || this.longpressState === "pressed") && !open)
131
+ if (((_a = this.strategy) == null ? void 0 : _a.activelyOpening) && !open)
258
132
  return;
259
133
  this._open = open;
260
134
  if (this.open) {
261
135
  _Overlay.openCount += 1;
262
136
  }
263
137
  this.requestUpdate("open", !this.open);
138
+ if (this.open) {
139
+ this.requestSlottable();
140
+ }
264
141
  }
265
142
  get state() {
266
143
  return this._state;
267
144
  }
268
145
  set state(state2) {
146
+ var _a;
269
147
  if (state2 === this.state)
270
148
  return;
271
149
  const oldState = this.state;
272
150
  this._state = state2;
273
151
  if (this.state === "opened" || this.state === "closed") {
274
- this.longpressState = this.longpressState === "pressed" ? "null" : this.longpressState;
152
+ (_a = this.strategy) == null ? void 0 : _a.shouldCompleteOpen();
275
153
  }
276
154
  this.requestUpdate("state", oldState);
277
155
  }
156
+ get elementResolver() {
157
+ if (!this._elementResolver) {
158
+ this._elementResolver = new ElementResolutionController(this);
159
+ }
160
+ return this._elementResolver;
161
+ }
278
162
  get usesDialog() {
279
163
  return this.type === "modal" || this.type === "page";
280
164
  }
@@ -349,8 +233,32 @@ const _Overlay = class _Overlay extends OverlayFeatures {
349
233
  }
350
234
  focusEl == null ? void 0 : focusEl.focus();
351
235
  }
352
- async manageOpen(oldOpen) {
236
+ returnFocus() {
353
237
  var _a;
238
+ if (this.open || this.type === "hint")
239
+ return;
240
+ const getAncestors = () => {
241
+ var _a2, _b;
242
+ const ancestors = [];
243
+ let currentNode = document.activeElement;
244
+ while ((_a2 = currentNode == null ? void 0 : currentNode.shadowRoot) == null ? void 0 : _a2.activeElement) {
245
+ currentNode = currentNode.shadowRoot.activeElement;
246
+ }
247
+ while (currentNode) {
248
+ const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_b = currentNode.getRootNode()) == null ? void 0 : _b.host);
249
+ if (ancestor) {
250
+ ancestors.push(ancestor);
251
+ }
252
+ currentNode = ancestor;
253
+ }
254
+ return ancestors;
255
+ };
256
+ if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(this.getRootNode().activeElement) || getAncestors().includes(this) || // eslint-disable-next-line @spectrum-web-components/document-active-element
257
+ document.activeElement === document.body)) {
258
+ this.triggerElement.focus();
259
+ }
260
+ }
261
+ async manageOpen(oldOpen) {
354
262
  if (!this.isConnected && this.open)
355
263
  return;
356
264
  if (!this.hasUpdated) {
@@ -407,211 +315,19 @@ const _Overlay = class _Overlay extends OverlayFeatures {
407
315
  );
408
316
  }
409
317
  }
410
- if (!this.open && this.type !== "hint") {
411
- const getAncestors = () => {
412
- var _a2;
413
- const ancestors = [];
414
- let currentNode = document.activeElement;
415
- while ((currentNode == null ? void 0 : currentNode.shadowRoot) && currentNode.shadowRoot.activeElement) {
416
- currentNode = currentNode.shadowRoot.activeElement;
417
- }
418
- while (currentNode) {
419
- const ancestor = currentNode.assignedSlot || currentNode.parentElement || ((_a2 = currentNode.getRootNode()) == null ? void 0 : _a2.host);
420
- if (ancestor) {
421
- ancestors.push(ancestor);
422
- }
423
- currentNode = ancestor;
424
- }
425
- return ancestors;
426
- };
427
- if (((_a = this.triggerElement) == null ? void 0 : _a.focus) && (this.contains(
428
- this.getRootNode().activeElement
429
- ) || getAncestors().includes(this))) {
430
- this.triggerElement.focus();
431
- }
432
- }
433
- }
434
- unbindEvents() {
435
- var _a;
436
- (_a = this.abortController) == null ? void 0 : _a.abort();
437
318
  }
438
319
  bindEvents() {
439
320
  var _a;
321
+ (_a = this.strategy) == null ? void 0 : _a.abort();
322
+ this.strategy = void 0;
440
323
  if (!this.hasNonVirtualTrigger)
441
324
  return;
442
- (_a = this.abortController) == null ? void 0 : _a.abort();
443
- this.abortController = new AbortController();
444
- const nextTriggerElement = this.triggerElement;
445
- switch (this.triggerInteraction) {
446
- case "click":
447
- this.bindClickEvents(nextTriggerElement);
448
- return;
449
- case "longpress":
450
- this.bindLongpressEvents(nextTriggerElement);
451
- return;
452
- case "hover":
453
- this.bindHoverEvents(nextTriggerElement);
454
- return;
455
- }
456
- }
457
- bindClickEvents(triggerElement) {
458
- const options = { signal: this.abortController.signal };
459
- triggerElement.addEventListener("click", this.handleClick, options);
460
- triggerElement.addEventListener(
461
- "pointerdown",
462
- this.handlePointerdownForClick,
463
- options
464
- );
465
- }
466
- bindLongpressEvents(triggerElement) {
467
- const options = { signal: this.abortController.signal };
468
- triggerElement.addEventListener(
469
- "longpress",
470
- this.handleLongpress,
471
- options
472
- );
473
- triggerElement.addEventListener(
474
- "pointerdown",
475
- this.handlePointerdown,
476
- options
477
- );
478
- this.prepareLongpressDescription(triggerElement);
479
- if (triggerElement.holdAffordance) {
480
- return;
481
- }
482
- triggerElement.addEventListener("keydown", this.handleKeydown, options);
483
- triggerElement.addEventListener("keyup", this.handleKeyup, options);
484
- }
485
- bindHoverEvents(triggerElement) {
486
- const options = { signal: this.abortController.signal };
487
- triggerElement.addEventListener("focusin", this.handleFocusin, options);
488
- triggerElement.addEventListener(
489
- "focusout",
490
- this.handleFocusout,
491
- options
492
- );
493
- triggerElement.addEventListener(
494
- "pointerenter",
495
- this.handlePointerenter,
496
- options
497
- );
498
- triggerElement.addEventListener(
499
- "pointerleave",
500
- this.handlePointerleave,
501
- options
502
- );
503
- this.addEventListener(
504
- "pointerenter",
505
- this.handleOverlayPointerenter,
506
- options
507
- );
508
- this.addEventListener(
509
- "pointerleave",
510
- this.handleOverlayPointerleave,
511
- options
512
- );
513
- }
514
- manageTriggerElement(triggerElement) {
515
- if (triggerElement) {
516
- this.unbindEvents();
517
- this.releaseAriaDescribedby();
518
- }
519
- const missingOrVirtual = !this.triggerElement || this.triggerElement instanceof VirtualTrigger;
520
- if (missingOrVirtual) {
521
- return;
522
- }
523
- this.bindEvents();
524
- if (this.receivesFocus === "true")
525
- return;
526
- this.prepareAriaDescribedby();
527
- }
528
- prepareLongpressDescription(trigger) {
529
- if (
530
- // only "longpress" relationships are described this way
531
- this.triggerInteraction !== "longpress" || // do not reapply until target it recycled
532
- this.releaseLongpressDescribedby !== noop || // require "longpress content" to apply relationship
533
- !this.elements.length
534
- ) {
325
+ if (!this.triggerInteraction)
535
326
  return;
536
- }
537
- const longpressDescription = document.createElement("div");
538
- longpressDescription.id = `longpress-describedby-descriptor-${randomID()}`;
539
- const messageType = isIOS() || isAndroid() ? "touch" : "keyboard";
540
- longpressDescription.textContent = LONGPRESS_INSTRUCTIONS[messageType];
541
- longpressDescription.slot = "longpress-describedby-descriptor";
542
- const triggerParent = trigger.getRootNode();
543
- const overlayParent = this.getRootNode();
544
- if (triggerParent === overlayParent) {
545
- this.append(longpressDescription);
546
- } else {
547
- longpressDescription.hidden = !("host" in triggerParent);
548
- trigger.insertAdjacentElement("afterend", longpressDescription);
549
- }
550
- const releaseLongpressDescribedby = conditionAttributeWithId(
551
- trigger,
552
- "aria-describedby",
553
- [longpressDescription.id]
327
+ this.strategy = new strategies[this.triggerInteraction](
328
+ this,
329
+ this.triggerElement
554
330
  );
555
- this.releaseLongpressDescribedby = () => {
556
- releaseLongpressDescribedby();
557
- longpressDescription.remove();
558
- this.releaseLongpressDescribedby = noop;
559
- };
560
- }
561
- prepareAriaDescribedby() {
562
- if (
563
- // only "hover" relationships establed described by content
564
- this.triggerInteraction !== "hover" || // do not reapply until target is recycled
565
- this.releaseAriaDescribedby !== noop || // require "hover content" to apply relationship
566
- !this.elements.length || // Virtual triggers can have no aria content
567
- !this.hasNonVirtualTrigger
568
- ) {
569
- return;
570
- }
571
- const trigger = this.triggerElement;
572
- const triggerRoot = trigger.getRootNode();
573
- const contentRoot = this.elements[0].getRootNode();
574
- const overlayRoot = this.getRootNode();
575
- if (triggerRoot == overlayRoot) {
576
- const releaseAriaDescribedby = conditionAttributeWithId(
577
- trigger,
578
- "aria-describedby",
579
- [this.id]
580
- );
581
- this.releaseAriaDescribedby = () => {
582
- releaseAriaDescribedby();
583
- this.releaseAriaDescribedby = noop;
584
- };
585
- } else if (triggerRoot === contentRoot) {
586
- this.elementIds = this.elements.map((el) => el.id);
587
- const appliedIds = this.elements.map((el) => {
588
- if (!el.id) {
589
- el.id = `${this.tagName.toLowerCase()}-helper-${randomID()}`;
590
- }
591
- return el.id;
592
- });
593
- const releaseAriaDescribedby = conditionAttributeWithId(
594
- trigger,
595
- "aria-describedby",
596
- appliedIds
597
- );
598
- this.releaseAriaDescribedby = () => {
599
- releaseAriaDescribedby();
600
- this.elements.map((el, index) => {
601
- el.id = this.elementIds[index];
602
- });
603
- this.releaseAriaDescribedby = noop;
604
- };
605
- }
606
- }
607
- doPointerleave() {
608
- this.pointerentered = false;
609
- const triggerElement = this.triggerElement;
610
- if (this.focusedin && triggerElement.matches(":focus-visible"))
611
- return;
612
- this.hoverTimeout = setTimeout(() => {
613
- this.open = false;
614
- }, HOVER_DELAY);
615
331
  }
616
332
  handleBeforetoggle(event) {
617
333
  if (event.newState !== "open") {
@@ -619,7 +335,8 @@ const _Overlay = class _Overlay extends OverlayFeatures {
619
335
  }
620
336
  }
621
337
  handleBrowserClose() {
622
- if (this.longpressState !== "opening" && this.longpressState !== "pressed") {
338
+ var _a;
339
+ if (!((_a = this.strategy) == null ? void 0 : _a.activelyOpening)) {
623
340
  this.open = false;
624
341
  return;
625
342
  }
@@ -631,13 +348,11 @@ const _Overlay = class _Overlay extends OverlayFeatures {
631
348
  this.manageOpen(false);
632
349
  }
633
350
  handleSlotchange() {
634
- if (this.triggerElement) {
635
- this.prepareAriaDescribedby();
636
- }
351
+ var _a, _b;
637
352
  if (!this.elements.length) {
638
- this.releaseLongpressDescribedby();
353
+ (_a = this.strategy) == null ? void 0 : _a.releaseDescription();
639
354
  } else if (this.hasNonVirtualTrigger) {
640
- this.prepareLongpressDescription(
355
+ (_b = this.strategy) == null ? void 0 : _b.prepareDescription(
641
356
  this.triggerElement
642
357
  );
643
358
  }
@@ -647,6 +362,17 @@ const _Overlay = class _Overlay extends OverlayFeatures {
647
362
  this.willPreventClose = false;
648
363
  return shouldPreventClose;
649
364
  }
365
+ requestSlottable() {
366
+ if (!this.open) {
367
+ document.body.offsetHeight;
368
+ }
369
+ this.dispatchEvent(
370
+ new SlottableRequestEvent(
371
+ "overlay-content",
372
+ this.open ? {} : removeSlottableRequest
373
+ )
374
+ );
375
+ }
650
376
  willUpdate(changes) {
651
377
  var _a;
652
378
  if (!this.hasAttribute("id")) {
@@ -672,7 +398,7 @@ const _Overlay = class _Overlay extends OverlayFeatures {
672
398
  oldTrigger = changes.get("triggerElement");
673
399
  }
674
400
  if (oldTrigger !== false) {
675
- this.manageTriggerElement(oldTrigger);
401
+ this.bindEvents();
676
402
  }
677
403
  }
678
404
  updated(changes) {
@@ -687,7 +413,7 @@ const _Overlay = class _Overlay extends OverlayFeatures {
687
413
  this.placementController.resetOverlayPosition();
688
414
  }
689
415
  }
690
- if (changes.has("state") && this.state === "closed") {
416
+ if (changes.has("state") && this.state === "closed" && typeof changes.get("state") !== "undefined") {
691
417
  this.placementController.clearOverlayPosition();
692
418
  }
693
419
  }
@@ -749,16 +475,13 @@ const _Overlay = class _Overlay extends OverlayFeatures {
749
475
  this.addEventListener("close", () => {
750
476
  this.open = false;
751
477
  });
752
- if (this.hasNonVirtualTrigger) {
478
+ if (this.hasUpdated) {
753
479
  this.bindEvents();
754
480
  }
755
481
  }
756
482
  disconnectedCallback() {
757
- if (this.hasNonVirtualTrigger) {
758
- this.unbindEvents();
759
- }
760
- this.releaseAriaDescribedby();
761
- this.releaseLongpressDescribedby();
483
+ var _a;
484
+ (_a = this.strategy) == null ? void 0 : _a.releaseDescription();
762
485
  this.open = false;
763
486
  super.disconnectedCallback();
764
487
  }