@spectrum-web-components/overlay 0.34.1-rc.0 → 0.35.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 (155) hide show
  1. package/README.md +152 -227
  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 +529 -1389
  8. package/package.json +22 -48
  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 +31 -23
  15. package/src/OverlayTrigger.dev.js +245 -135
  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 +2 -0
  20. package/src/VirtualTrigger.dev.js.map +2 -2
  21. package/src/VirtualTrigger.js +1 -1
  22. package/src/VirtualTrigger.js.map +3 -3
  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 -2
  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-trigger.css.dev.js +1 -1
  43. package/src/overlay-trigger.css.dev.js.map +1 -1
  44. package/src/overlay-trigger.css.js +1 -1
  45. package/src/overlay-trigger.css.js.map +1 -1
  46. package/src/overlay-types.d.ts +5 -7
  47. package/src/overlay-types.dev.js +0 -1
  48. package/src/overlay-types.dev.js.map +3 -3
  49. package/src/overlay-types.js +1 -1
  50. package/src/overlay-types.js.map +3 -3
  51. package/src/overlay-utils.d.ts +3 -0
  52. package/src/overlay-utils.dev.js +31 -0
  53. package/src/overlay-utils.dev.js.map +7 -0
  54. package/src/overlay-utils.js +2 -0
  55. package/src/overlay-utils.js.map +7 -0
  56. package/src/overlay.d.ts +59 -0
  57. package/src/overlay.dev.js +127 -0
  58. package/src/overlay.dev.js.map +7 -0
  59. package/src/overlay.js +2 -0
  60. package/src/overlay.js.map +7 -0
  61. package/stories/overlay-story-components.js +8 -9
  62. package/stories/overlay-story-components.js.map +2 -2
  63. package/stories/overlay.stories.js +702 -799
  64. package/stories/overlay.stories.js.map +2 -2
  65. package/sync/overlay-trigger.d.ts +0 -4
  66. package/sync/overlay-trigger.dev.js +4 -1
  67. package/sync/overlay-trigger.dev.js.map +2 -2
  68. package/sync/overlay-trigger.js +1 -1
  69. package/sync/overlay-trigger.js.map +3 -3
  70. package/test/benchmark/basic-test.js +1 -1
  71. package/test/benchmark/basic-test.js.map +1 -1
  72. package/test/index.js +376 -407
  73. package/test/index.js.map +3 -3
  74. package/test/overlay-lifecycle.test.js +106 -34
  75. package/test/overlay-lifecycle.test.js.map +2 -2
  76. package/test/overlay-trigger-click.test.js +5 -11
  77. package/test/overlay-trigger-click.test.js.map +2 -2
  78. package/test/overlay-trigger-extended.test.js +6 -1
  79. package/test/overlay-trigger-extended.test.js.map +2 -2
  80. package/test/overlay-trigger-hover-click.test.js +23 -23
  81. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  82. package/test/overlay-trigger-hover.test.js +34 -40
  83. package/test/overlay-trigger-hover.test.js.map +2 -2
  84. package/test/overlay-trigger-longpress.test.js +80 -98
  85. package/test/overlay-trigger-longpress.test.js.map +2 -2
  86. package/test/overlay-trigger-sync.test.js +1 -1
  87. package/test/overlay-trigger-sync.test.js.map +2 -2
  88. package/test/overlay-trigger.test.js +1 -1
  89. package/test/overlay-trigger.test.js.map +2 -2
  90. package/test/overlay-update.test.js +4 -4
  91. package/test/overlay-update.test.js.map +2 -2
  92. package/test/{overlay-v1.test.js → overlay.test.js} +249 -267
  93. package/test/overlay.test.js.map +7 -0
  94. package/sp-overlay.d.ts +0 -6
  95. package/sp-overlay.dev.js +0 -5
  96. package/sp-overlay.js +0 -2
  97. package/src/Overlay.d.ts +0 -29
  98. package/src/Overlay.dev.js +0 -91
  99. package/src/Overlay.dev.js.map +0 -7
  100. package/src/Overlay.js +0 -2
  101. package/src/Overlay.js.map +0 -7
  102. package/src/OverlayBase.d.ts +0 -124
  103. package/src/OverlayBase.dev.js +0 -744
  104. package/src/OverlayBase.dev.js.map +0 -7
  105. package/src/OverlayBase.js +0 -31
  106. package/src/OverlayBase.js.map +0 -7
  107. package/src/OverlayDialog.d.ts +0 -8
  108. package/src/OverlayDialog.dev.js +0 -160
  109. package/src/OverlayDialog.dev.js.map +0 -7
  110. package/src/OverlayDialog.js +0 -2
  111. package/src/OverlayDialog.js.map +0 -7
  112. package/src/OverlayNoPopover.d.ts +0 -8
  113. package/src/OverlayNoPopover.dev.js +0 -149
  114. package/src/OverlayNoPopover.dev.js.map +0 -7
  115. package/src/OverlayNoPopover.js +0 -2
  116. package/src/OverlayNoPopover.js.map +0 -7
  117. package/src/OverlayPopover.d.ts +0 -8
  118. package/src/OverlayPopover.dev.js +0 -199
  119. package/src/OverlayPopover.dev.js.map +0 -7
  120. package/src/OverlayPopover.js +0 -2
  121. package/src/OverlayPopover.js.map +0 -7
  122. package/src/OverlayStack.d.ts +0 -29
  123. package/src/OverlayStack.dev.js +0 -126
  124. package/src/OverlayStack.dev.js.map +0 -7
  125. package/src/OverlayStack.js +0 -2
  126. package/src/OverlayStack.js.map +0 -7
  127. package/src/PlacementController.d.ts +0 -36
  128. package/src/PlacementController.dev.js +0 -191
  129. package/src/PlacementController.dev.js.map +0 -7
  130. package/src/PlacementController.js +0 -2
  131. package/src/PlacementController.js.map +0 -7
  132. package/src/fullSizePlugin.d.ts +0 -12
  133. package/src/fullSizePlugin.dev.js +0 -39
  134. package/src/fullSizePlugin.dev.js.map +0 -7
  135. package/src/fullSizePlugin.js +0 -2
  136. package/src/fullSizePlugin.js.map +0 -7
  137. package/src/overlay-base.css.dev.js +0 -9
  138. package/src/overlay-base.css.dev.js.map +0 -7
  139. package/src/overlay-base.css.js +0 -6
  140. package/src/overlay-base.css.js.map +0 -7
  141. package/src/topLayerOverTransforms.d.ts +0 -23
  142. package/src/topLayerOverTransforms.dev.js +0 -170
  143. package/src/topLayerOverTransforms.dev.js.map +0 -7
  144. package/src/topLayerOverTransforms.js +0 -2
  145. package/src/topLayerOverTransforms.js.map +0 -7
  146. package/stories/overlay-element.stories.js +0 -247
  147. package/stories/overlay-element.stories.js.map +0 -7
  148. package/test/overlay-element.test-vrt.js +0 -5
  149. package/test/overlay-element.test-vrt.js.map +0 -7
  150. package/test/overlay-element.test.js +0 -682
  151. package/test/overlay-element.test.js.map +0 -7
  152. package/test/overlay-v1.test.js.map +0 -7
  153. package/test/overlay-v2.test.js +0 -720
  154. package/test/overlay-v2.test.js.map +0 -7
  155. /package/src/{overlay-base.css.d.ts → active-overlay.css.d.ts} +0 -0
@@ -1,49 +1,32 @@
1
1
  "use strict";
2
2
  import "@spectrum-web-components/button/sp-button.js";
3
3
  import "@spectrum-web-components/dialog/sp-dialog.js";
4
- import "@spectrum-web-components/overlay/sp-overlay.js";
5
- import "@spectrum-web-components/overlay/overlay-trigger.js";
6
- import "@spectrum-web-components/tooltip/sp-tooltip.js";
7
4
  import "@spectrum-web-components/popover/sp-popover.js";
8
5
  import { setViewport } from "@web/test-runner-commands";
9
6
  import {
10
7
  Overlay
11
8
  } from "@spectrum-web-components/overlay";
9
+ import { isVisible } from "../../../test/testing-helpers.js";
12
10
  import {
13
11
  elementUpdated,
14
12
  expect,
13
+ fixture,
15
14
  html,
16
15
  nextFrame,
17
- oneEvent
16
+ oneEvent,
17
+ waitUntil
18
18
  } from "@open-wc/testing";
19
19
  import { sendKeys } from "@web/test-runner-commands";
20
20
  import {
21
21
  definedOverlayElement,
22
- virtualElementV1
22
+ virtualElement
23
23
  } from "../stories/overlay.stories";
24
24
  import { sendMouse } from "../../../test/plugins/browser.js";
25
- import { spy } from "sinon";
26
- import "@spectrum-web-components/theme/sp-theme.js";
27
- import "@spectrum-web-components/theme/src/themes.js";
28
- import { render } from "@spectrum-web-components/base";
29
- import {
30
- fixture,
31
- isInteractive,
32
- isOnTopLayer
33
- } from "../../../test/testing-helpers.js";
34
- async function styledFixture(story) {
35
- const test = await fixture(html`
36
- <sp-theme theme="spectrum" scale="medium" color="dark">
37
- ${story}
38
- </sp-theme>
39
- `);
40
- return test.children[0];
41
- }
42
- describe("Overlays, v1", () => {
25
+ describe("Overlays", () => {
43
26
  let testDiv;
44
27
  let openOverlays = [];
45
28
  beforeEach(async () => {
46
- testDiv = await styledFixture(
29
+ testDiv = await fixture(
47
30
  html`
48
31
  <div id="top">
49
32
  <style>
@@ -65,28 +48,31 @@ describe("Overlays, v1", () => {
65
48
  display: none;
66
49
  }
67
50
  </style>
68
- <sp-button id="first-button" variant="primary">
51
+ <sp-button
52
+ id="first-button"
53
+ variant="primary"
54
+ slot="trigger"
55
+ >
69
56
  Show Popover
70
57
  </sp-button>
71
58
  <div id="overlay-content">
72
- <sp-popover id="outer-popover" direction="bottom" tip>
73
- <sp-dialog no-divider>
74
- <div class="options-popover-content">
75
- A popover message
76
- </div>
77
- <sp-button id="outer-focus-target">
78
- Test 1
79
- </sp-button>
80
- <sp-button>Test 2</sp-button>
81
- <sp-button>Test 3</sp-button>
59
+ <sp-popover
60
+ id="outer-popover"
61
+ slot="click-content"
62
+ direction="bottom"
63
+ tip
64
+ open
65
+ >
66
+ <sp-dialog class="options-popover-content">
67
+ A popover message
82
68
  </sp-dialog>
83
69
  </sp-popover>
84
- <sp-tooltip id="hover-1" class="hover-content">
70
+ <div id="hover-1" class="hover-content">
85
71
  Hover message
86
- </sp-tooltip>
87
- <sp-tooltip id="hover-2" class="hover-content">
72
+ </div>
73
+ <div id="hover-2" class="hover-content">
88
74
  Other hover message
89
- </sp-tooltip>
75
+ </div>
90
76
  </div>
91
77
  </div>
92
78
  `
@@ -114,19 +100,21 @@ describe("Overlays, v1", () => {
114
100
  ].map((direction) => {
115
101
  const placement = direction;
116
102
  it(`opens a popover - ${placement}`, async () => {
117
- const clickSpy = spy();
118
103
  const button = testDiv.querySelector(
119
104
  "#first-button"
120
105
  );
121
106
  const outerPopover = testDiv.querySelector(
122
107
  "#outer-popover"
123
108
  );
124
- outerPopover.addEventListener("click", () => {
125
- clickSpy();
126
- });
127
- expect(await isInteractive(outerPopover)).to.be.false;
109
+ expect(outerPopover.parentElement).to.exist;
110
+ if (outerPopover.parentElement) {
111
+ expect(outerPopover.parentElement.id).to.equal(
112
+ "overlay-content"
113
+ );
114
+ }
115
+ expect(isVisible(outerPopover)).to.be.false;
128
116
  expect(button).to.exist;
129
- const opened = oneEvent(outerPopover, "sp-opened");
117
+ const opened = oneEvent(button, "sp-opened");
130
118
  openOverlays.push(
131
119
  await Overlay.open(button, "click", outerPopover, {
132
120
  delayed: false,
@@ -135,52 +123,25 @@ describe("Overlays, v1", () => {
135
123
  })
136
124
  );
137
125
  await opened;
138
- expect(await isInteractive(outerPopover)).to.be.true;
139
- });
140
- });
141
- it(`opens a modal dialog`, async () => {
142
- const button = testDiv.querySelector("#first-button");
143
- const outerPopover = testDiv.querySelector("#outer-popover");
144
- expect(await isInteractive(outerPopover)).to.be.false;
145
- expect(button).to.exist;
146
- const opened = oneEvent(outerPopover, "sp-opened");
147
- openOverlays.push(
148
- await Overlay.open(button, "modal", outerPopover, {
149
- delayed: false
150
- })
151
- );
152
- await opened;
153
- const firstFocused = outerPopover.querySelector(
154
- "#outer-focus-target"
155
- );
156
- expect(document.activeElement === firstFocused).to.be.true;
157
- await sendKeys({
158
- press: "Tab"
159
- });
160
- expect(document.activeElement === button).to.be.false;
161
- await sendKeys({
162
- press: "Tab"
126
+ expect(outerPopover.parentElement).to.exist;
127
+ if (outerPopover.parentElement) {
128
+ expect(outerPopover.parentElement.id).not.to.equal(
129
+ "overlay-content"
130
+ );
131
+ }
132
+ expect(isVisible(outerPopover)).to.be.true;
163
133
  });
164
- expect(document.activeElement === button).to.be.false;
165
- await sendKeys({
166
- press: "Shift+Tab"
167
- });
168
- expect(document.activeElement === button).to.be.false;
169
- await sendKeys({
170
- press: "Shift+Tab"
171
- });
172
- expect(document.activeElement === button).to.be.false;
173
- await sendKeys({
174
- press: "Shift+Tab"
175
- });
176
- expect(document.activeElement === button).to.be.false;
177
134
  });
178
135
  it(`updates a popover`, async () => {
179
136
  const button = testDiv.querySelector("#first-button");
180
137
  const outerPopover = testDiv.querySelector("#outer-popover");
181
- expect(await isInteractive(outerPopover)).to.be.false;
138
+ expect(outerPopover.parentElement).to.exist;
139
+ if (outerPopover.parentElement) {
140
+ expect(outerPopover.parentElement.id).to.equal("overlay-content");
141
+ }
142
+ expect(isVisible(outerPopover)).to.be.false;
182
143
  expect(button).to.exist;
183
- const opened = oneEvent(outerPopover, "sp-opened");
144
+ const opened = oneEvent(button, "sp-opened");
184
145
  openOverlays.push(
185
146
  await Overlay.open(button, "click", outerPopover, {
186
147
  delayed: false,
@@ -188,16 +149,20 @@ describe("Overlays, v1", () => {
188
149
  })
189
150
  );
190
151
  await opened;
191
- expect(await isInteractive(outerPopover)).to.be.true;
152
+ expect(isVisible(outerPopover)).to.be.true;
192
153
  Overlay.update();
193
- expect(await isInteractive(outerPopover)).to.be.true;
154
+ expect(isVisible(outerPopover)).to.be.true;
194
155
  });
195
156
  it(`opens a popover w/ delay`, async () => {
196
157
  const button = testDiv.querySelector("#first-button");
197
158
  const outerPopover = testDiv.querySelector("#outer-popover");
198
- expect(await isInteractive(outerPopover)).to.be.false;
159
+ expect(outerPopover.parentElement).to.exist;
160
+ if (outerPopover.parentElement) {
161
+ expect(outerPopover.parentElement.id).to.equal("overlay-content");
162
+ }
163
+ expect(isVisible(outerPopover)).to.be.false;
199
164
  expect(button).to.exist;
200
- const opened = oneEvent(outerPopover, "sp-opened");
165
+ const opened = oneEvent(button, "sp-opened");
201
166
  openOverlays.push(
202
167
  await Overlay.open(button, "click", outerPopover, {
203
168
  delayed: true,
@@ -205,7 +170,13 @@ describe("Overlays, v1", () => {
205
170
  })
206
171
  );
207
172
  await opened;
208
- expect(await isInteractive(outerPopover)).to.be.true;
173
+ expect(outerPopover.parentElement).to.exist;
174
+ if (outerPopover.parentElement) {
175
+ expect(outerPopover.parentElement.id).not.to.equal(
176
+ "overlay-content"
177
+ );
178
+ }
179
+ expect(isVisible(outerPopover)).to.be.true;
209
180
  });
210
181
  it("opens hover overlay", async () => {
211
182
  const button = testDiv.querySelector("#first-button");
@@ -213,9 +184,9 @@ describe("Overlays, v1", () => {
213
184
  const clickOverlay = testDiv.querySelector(
214
185
  "#outer-popover"
215
186
  );
216
- expect(await isOnTopLayer(hoverOverlay)).to.be.false;
217
- expect(await isOnTopLayer(clickOverlay)).to.be.false;
218
- let opened = oneEvent(hoverOverlay, "sp-opened");
187
+ expect(isVisible(hoverOverlay)).to.be.false;
188
+ expect(isVisible(clickOverlay)).to.be.false;
189
+ let opened = oneEvent(button, "sp-opened");
219
190
  openOverlays.push(
220
191
  await Overlay.open(button, "hover", hoverOverlay, {
221
192
  delayed: false,
@@ -224,9 +195,14 @@ describe("Overlays, v1", () => {
224
195
  })
225
196
  );
226
197
  await opened;
227
- expect(await isOnTopLayer(hoverOverlay)).to.be.true;
228
- opened = oneEvent(clickOverlay, "sp-opened");
229
- const closed = oneEvent(hoverOverlay, "sp-closed");
198
+ expect(hoverOverlay.parentElement).to.exist;
199
+ if (hoverOverlay.parentElement) {
200
+ expect(hoverOverlay.parentElement.id).not.to.equal(
201
+ "overlay-content"
202
+ );
203
+ }
204
+ expect(isVisible(hoverOverlay)).to.be.true;
205
+ opened = oneEvent(button, "sp-opened");
230
206
  openOverlays.push(
231
207
  await Overlay.open(button, "click", clickOverlay, {
232
208
  delayed: false,
@@ -235,12 +211,11 @@ describe("Overlays, v1", () => {
235
211
  })
236
212
  );
237
213
  await opened;
238
- await closed;
239
- expect(
240
- await isInteractive(clickOverlay),
241
- "click overlay not interactive"
242
- ).to.be.true;
243
- expect(await isOnTopLayer(hoverOverlay), "hover overlay interactive").to.be.false;
214
+ if (hoverOverlay.parentElement) {
215
+ expect(hoverOverlay.parentElement.id).to.equal("overlay-content");
216
+ }
217
+ expect(isVisible(hoverOverlay)).to.be.false;
218
+ expect(isVisible(clickOverlay)).to.be.true;
244
219
  });
245
220
  it("opens custom overlay", async () => {
246
221
  const button = testDiv.querySelector("#first-button");
@@ -250,9 +225,9 @@ describe("Overlays, v1", () => {
250
225
  );
251
226
  expect(button).to.exist;
252
227
  expect(customOverlay).to.exist;
253
- expect(await isOnTopLayer(customOverlay)).to.be.false;
254
- expect(await isOnTopLayer(clickOverlay)).to.be.false;
255
- let opened = oneEvent(customOverlay, "sp-opened");
228
+ expect(isVisible(customOverlay)).to.be.false;
229
+ expect(isVisible(clickOverlay)).to.be.false;
230
+ let opened = oneEvent(button, "sp-opened");
256
231
  openOverlays.push(
257
232
  await Overlay.open(button, "custom", customOverlay, {
258
233
  delayed: false,
@@ -261,8 +236,14 @@ describe("Overlays, v1", () => {
261
236
  })
262
237
  );
263
238
  await opened;
264
- expect(await isOnTopLayer(customOverlay)).to.be.true;
265
- opened = oneEvent(clickOverlay, "sp-opened");
239
+ expect(customOverlay.parentElement).to.exist;
240
+ if (customOverlay.parentElement) {
241
+ expect(customOverlay.parentElement.id).not.to.equal(
242
+ "overlay-content"
243
+ );
244
+ }
245
+ expect(isVisible(customOverlay)).to.be.true;
246
+ opened = oneEvent(button, "sp-opened");
266
247
  openOverlays.push(
267
248
  await Overlay.open(button, "click", clickOverlay, {
268
249
  delayed: false,
@@ -271,58 +252,52 @@ describe("Overlays, v1", () => {
271
252
  })
272
253
  );
273
254
  await opened;
274
- expect(await isOnTopLayer(clickOverlay), "click content open").to.be.true;
255
+ expect(isVisible(customOverlay)).to.be.true;
256
+ expect(isVisible(clickOverlay)).to.be.true;
275
257
  });
276
258
  it("closes via events", async () => {
277
- const test = await fixture(html`
278
- <div>
279
- <sp-popover id="root">
280
- <sp-dialog dismissable>
281
- Some Content for the Dialog.
282
- </sp-dialog>
283
- </sp-popover>
259
+ const el = await fixture(html`
260
+ <div id="root">
261
+ <sp-dialog dismissable></sp-dialog>
284
262
  </div>
285
263
  `);
286
- const el = test.querySelector("sp-popover");
287
264
  const dialog = el.querySelector("sp-dialog");
288
265
  const opened = oneEvent(el, "sp-opened");
289
266
  openOverlays.push(
290
- await Overlay.open(test, "click", el, {
267
+ await Overlay.open(el, "click", dialog, {
291
268
  delayed: false,
292
269
  placement: "bottom",
293
270
  offset: 10
294
271
  })
295
272
  );
296
273
  await opened;
297
- expect(await isInteractive(el)).to.be.true;
298
- const closed = oneEvent(el, "sp-closed");
299
274
  dialog.close();
300
- await closed;
301
- expect(await isInteractive(el)).to.be.false;
275
+ await waitUntil(
276
+ () => !!dialog.parentElement && dialog.parentElement.tagName !== "ACTIVE-OVERLAY",
277
+ "content is returned"
278
+ );
302
279
  });
303
280
  it("closes an inline overlay when tabbing past the content", async () => {
304
281
  const el = await fixture(html`
305
282
  <div>
306
283
  <sp-button class="trigger">Trigger</sp-button>
307
- <sp-popover class="content">
284
+ <div class="content">
308
285
  <input />
309
- </sp-popover>
286
+ </div>
310
287
  <input value="After" id="after" />
311
288
  </div>
312
289
  `);
313
290
  const trigger = el.querySelector(".trigger");
314
291
  const content = el.querySelector(".content");
315
292
  const input = el.querySelector("input");
316
- const after2 = el.querySelector("#after");
317
- const opened = oneEvent(content, "sp-opened");
318
- openOverlays.push(
319
- await Overlay.open(trigger, "inline", content, {
320
- receivesFocus: "auto"
321
- })
322
- );
323
- await opened;
324
- expect(await isInteractive(content)).to.be.true;
293
+ const after = el.querySelector("#after");
294
+ openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
295
+ trigger.focus();
296
+ await sendKeys({
297
+ press: "Tab"
298
+ });
325
299
  expect(document.activeElement).to.equal(input);
300
+ expect(input.closest("active-overlay") !== null);
326
301
  await sendKeys({
327
302
  press: "Shift+Tab"
328
303
  });
@@ -331,13 +306,13 @@ describe("Overlays, v1", () => {
331
306
  press: "Tab"
332
307
  });
333
308
  expect(document.activeElement).to.equal(input);
334
- const closed = oneEvent(content, "sp-closed");
335
309
  await sendKeys({
336
310
  press: "Tab"
337
311
  });
338
- expect(document.activeElement).to.equal(after2);
339
- await closed;
340
- expect(await isInteractive(content)).to.be.false;
312
+ expect(document.activeElement).to.equal(after);
313
+ await waitUntil(
314
+ () => document.querySelector("active-overlay") === null
315
+ );
341
316
  });
342
317
  it("closes an inline overlay when tabbing before the trigger", async () => {
343
318
  const el = await fixture(html`
@@ -355,13 +330,14 @@ describe("Overlays, v1", () => {
355
330
  const trigger = el.querySelector(".trigger");
356
331
  const content = el.querySelector(".content");
357
332
  const input = el.querySelector(".content input");
358
- const before2 = el.querySelector("#before");
333
+ const before = el.querySelector("#before");
359
334
  openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
360
335
  trigger.focus();
361
336
  await sendKeys({
362
337
  press: "Tab"
363
338
  });
364
339
  expect(document.activeElement).to.equal(input);
340
+ expect(input.closest("active-overlay") !== null);
365
341
  await sendKeys({
366
342
  press: "Shift+Tab"
367
343
  });
@@ -369,7 +345,10 @@ describe("Overlays, v1", () => {
369
345
  await sendKeys({
370
346
  press: "Shift+Tab"
371
347
  });
372
- expect(document.activeElement).to.equal(before2);
348
+ expect(document.activeElement).to.equal(before);
349
+ await waitUntil(
350
+ () => document.querySelector("active-overlay") === null
351
+ );
373
352
  });
374
353
  it("opens detached content", async () => {
375
354
  const textContent = "This is a detached element that has been overlaid";
@@ -378,127 +357,118 @@ describe("Overlays, v1", () => {
378
357
  <button>Trigger</button>
379
358
  `
380
359
  );
381
- const content = document.createElement("sp-popover");
360
+ const content = document.createElement("div");
382
361
  content.textContent = textContent;
383
- const opened = oneEvent(content, "sp-opened");
362
+ const opened = oneEvent(el, "sp-opened");
384
363
  const closeOverlay = await Overlay.open(el, "click", content, {
385
364
  placement: "bottom"
386
365
  });
387
366
  await opened;
388
- expect(await isInteractive(content)).to.be.true;
389
- const closed = oneEvent(content, "sp-closed");
367
+ let activeOverlay = document.querySelector("active-overlay");
368
+ if (activeOverlay) {
369
+ expect(activeOverlay.textContent).to.equal(textContent);
370
+ } else {
371
+ expect(activeOverlay).to.not.be.null;
372
+ }
373
+ const closed = oneEvent(el, "sp-closed");
390
374
  closeOverlay();
391
375
  await closed;
392
- expect(await isInteractive(content)).to.be.false;
376
+ activeOverlay = document.querySelector("active-overlay");
377
+ expect(activeOverlay).to.be.null;
393
378
  content.remove();
394
379
  });
395
380
  });
396
- describe('Overlay - type="modal", v1', () => {
397
- describe("handle multiple separate `contextmenu` events", async () => {
398
- let width = 0;
399
- let height = 0;
400
- let firstMenu;
401
- let firstRect;
402
- let secondMenu;
403
- let secondRect;
404
- before(async () => {
405
- render(
406
- html`
407
- <sp-theme color="light" scale="large">
408
- ${virtualElementV1({
409
- ...virtualElementV1.args,
410
- offset: 6
411
- })}
412
- </sp-theme>
413
- `,
414
- document.body
415
- );
416
- width = window.innerWidth;
417
- height = window.innerHeight;
418
- });
419
- after(() => {
420
- var _a;
421
- (_a = document.querySelector("sp-theme")) == null ? void 0 : _a.remove();
422
- });
423
- it('opens the first "contextmenu" overlay', async () => {
424
- const opened = oneEvent(document, "sp-opened");
425
- await sendMouse({
426
- steps: [
427
- {
428
- type: "move",
429
- position: [width / 2 + 50, height / 2]
381
+ describe('Overlay - type="modal"', () => {
382
+ it("closes on `contextmenu` and passes that to the underlying page", async () => {
383
+ await fixture(html`
384
+ ${virtualElement({
385
+ ...virtualElement.args,
386
+ offset: 6
387
+ })}
388
+ `);
389
+ const width = window.innerWidth;
390
+ const height = window.innerHeight;
391
+ let opened = oneEvent(document, "sp-opened");
392
+ sendMouse({
393
+ steps: [
394
+ {
395
+ type: "move",
396
+ position: [width / 2 + 50, height / 2]
397
+ },
398
+ {
399
+ type: "click",
400
+ options: {
401
+ button: "right"
430
402
  },
431
- {
432
- type: "click",
433
- options: {
434
- button: "right"
435
- },
436
- position: [width / 2 + 50, height / 2]
437
- }
438
- ]
439
- });
440
- await opened;
441
- firstMenu = document.querySelector("sp-popover");
442
- expect(firstMenu.textContent).to.include("Menu source: end");
443
- firstRect = firstMenu.getBoundingClientRect();
444
- expect(firstMenu).to.not.be.null;
403
+ position: [width / 2 + 50, height / 2]
404
+ }
405
+ ]
445
406
  });
446
- it('closes the first "contextmenu" when opening a second', async () => {
447
- var _a, _b, _c, _d;
448
- const closed = oneEvent(document, "sp-closed");
449
- const opened = oneEvent(document, "sp-opened");
450
- const trigger = document.querySelector(
451
- "start-end-contextmenu"
452
- );
453
- (_b = (_a = trigger.shadowRoot) == null ? void 0 : _a.querySelector("#start")) == null ? void 0 : _b.dispatchEvent(
454
- new Event("contextmenu", {
455
- composed: true
456
- })
457
- );
458
- await nextFrame();
459
- (_d = (_c = trigger.shadowRoot) == null ? void 0 : _c.querySelector("#start")) == null ? void 0 : _d.dispatchEvent(
460
- new Event("pointerup", {
461
- composed: true,
462
- bubbles: true
463
- })
464
- );
465
- await closed;
466
- await opened;
467
- secondMenu = document.querySelector("sp-popover");
468
- expect(secondMenu.textContent).to.include("Menu source: start");
469
- secondRect = secondMenu.getBoundingClientRect();
470
- expect(secondMenu).to.not.be.null;
407
+ await opened;
408
+ const firstOverlay = document.querySelector(
409
+ "active-overlay"
410
+ );
411
+ const firstHeadline = firstOverlay.querySelector(
412
+ '[slot="header"]'
413
+ );
414
+ expect(firstOverlay, "first overlay").to.not.be.null;
415
+ expect(firstOverlay.isConnected).to.be.true;
416
+ expect(firstHeadline.textContent).to.equal("Menu source: end");
417
+ let closed = oneEvent(document, "sp-closed");
418
+ opened = oneEvent(document, "sp-opened");
419
+ sendMouse({
420
+ steps: [
421
+ {
422
+ type: "move",
423
+ position: [width / 4, height / 4]
424
+ },
425
+ {
426
+ type: "click",
427
+ options: {
428
+ button: "right"
429
+ },
430
+ position: [width / 4, height / 4]
431
+ }
432
+ ]
471
433
  });
472
- it('closes the second "contextmenu" when clicking away', async () => {
473
- const closed = oneEvent(document, "sp-closed");
474
- sendMouse({
475
- steps: [
476
- {
477
- type: "click",
478
- position: [width - width / 8, height - height / 8]
479
- }
480
- ]
481
- });
482
- await closed;
483
- expect(firstRect.top).to.not.equal(secondRect.top);
484
- expect(firstRect.left).to.not.equal(secondRect.left);
434
+ await closed;
435
+ await opened;
436
+ const secondOverlay = document.querySelector(
437
+ "active-overlay"
438
+ );
439
+ const secondHeadline = secondOverlay.querySelector(
440
+ '[slot="header"]'
441
+ );
442
+ expect(secondOverlay, "second overlay").to.not.be.null;
443
+ expect(secondOverlay).to.not.equal(firstOverlay);
444
+ expect(firstOverlay.isConnected).to.be.false;
445
+ expect(secondOverlay.isConnected).to.be.true;
446
+ expect(secondHeadline.textContent).to.equal("Menu source: start");
447
+ closed = oneEvent(document, "sp-closed");
448
+ sendMouse({
449
+ steps: [
450
+ {
451
+ type: "move",
452
+ position: [width / 8, height / 8]
453
+ },
454
+ {
455
+ type: "click",
456
+ position: [width / 8, height / 8]
457
+ }
458
+ ]
485
459
  });
460
+ await closed;
461
+ await nextFrame();
486
462
  });
487
463
  it("does not open content off of the viewport", async () => {
488
- before(async () => {
489
- await setViewport({ width: 360, height: 640 });
490
- await nextFrame();
491
- });
492
- after(async () => {
493
- await setViewport({ width: 800, height: 600 });
494
- await nextFrame();
495
- });
496
464
  await fixture(html`
497
- ${virtualElementV1({
498
- ...virtualElementV1.args,
465
+ ${virtualElement({
466
+ ...virtualElement.args,
499
467
  offset: 6
500
468
  })}
501
469
  `);
470
+ await setViewport({ width: 360, height: 640 });
471
+ await nextFrame();
502
472
  const opened = oneEvent(document, "sp-opened");
503
473
  sendMouse({
504
474
  steps: [
@@ -516,15 +486,19 @@ describe('Overlay - type="modal", v1', () => {
516
486
  ]
517
487
  });
518
488
  await opened;
519
- const firstMenu = document.querySelector("sp-menu");
520
- expect(firstMenu).to.not.be.null;
521
- expect(await isInteractive(firstMenu)).to.be.true;
489
+ const activeOverlay = document.querySelector(
490
+ "active-overlay"
491
+ );
492
+ expect(activeOverlay.placement).to.equal("right-start");
493
+ expect(activeOverlay.getAttribute("actual-placement")).to.equal(
494
+ "bottom"
495
+ );
522
496
  const closed = oneEvent(document, "sp-closed");
523
497
  sendKeys({
524
498
  press: "Escape"
525
499
  });
526
500
  await closed;
527
- expect(await isInteractive(firstMenu)).to.be.false;
501
+ await nextFrame();
528
502
  });
529
503
  it("opens children in the modal stack through shadow roots", async () => {
530
504
  const el = await fixture(definedOverlayElement());
@@ -534,47 +508,51 @@ describe('Overlay - type="modal", v1', () => {
534
508
  let open = oneEvent(el, "sp-opened");
535
509
  trigger.click();
536
510
  await open;
537
- expect(el.open).to.equal("click");
538
511
  const content = document.querySelector(
539
512
  "popover-content"
540
513
  );
541
514
  open = oneEvent(content, "sp-opened");
542
515
  content.button.click();
543
516
  await open;
544
- expect(content.trigger.open).to.equal("click");
517
+ const activeOverlays = document.querySelectorAll("active-overlay");
518
+ activeOverlays.forEach((overlay) => {
519
+ expect(overlay.slot).to.equal("open");
520
+ });
545
521
  let close = oneEvent(content, "sp-closed");
546
522
  content.trigger.removeAttribute("open");
547
523
  await close;
548
- expect(content.trigger.open).to.be.null;
549
524
  close = oneEvent(el, "sp-closed");
550
525
  el.removeAttribute("open");
551
526
  await close;
552
- expect(el.open).to.be.null;
553
527
  });
554
528
  });
555
- describe("Overlay - timing, v1", () => {
529
+ describe("Overlay - timing", () => {
556
530
  it("manages multiple modals in a row without preventing them from closing", async () => {
557
531
  const test = await fixture(html`
558
532
  <div>
559
- <overlay-trigger id="test-1" placement="right">
533
+ <overlay-trigger>
560
534
  <sp-button slot="trigger">Trigger 1</sp-button>
561
535
  <sp-popover slot="hover-content">
562
536
  <p>Hover contentent for "Trigger 1".</p>
563
537
  </sp-popover>
564
538
  </overlay-trigger>
565
- <overlay-trigger id="test-2" placement="right">
539
+ <overlay-trigger>
566
540
  <sp-button slot="trigger">Trigger 2</sp-button>
567
- <sp-popover slot="click-content">
568
- <p>Click contentent for "Trigger 2".</p>
569
- </sp-popover>
570
541
  <sp-popover slot="hover-content">
571
542
  <p>Hover contentent for "Trigger 2".</p>
572
543
  </sp-popover>
544
+ <sp-popover slot="click-content">
545
+ <p>Click contentent for "Trigger 2".</p>
546
+ </sp-popover>
573
547
  </overlay-trigger>
574
548
  </div>
575
549
  `);
576
- const overlayTrigger1 = test.querySelector("#test-1");
577
- const overlayTrigger2 = test.querySelector("#test-2");
550
+ const overlayTrigger1 = test.querySelector(
551
+ "overlay-trigger:first-child"
552
+ );
553
+ const overlayTrigger2 = test.querySelector(
554
+ "overlay-trigger:last-child"
555
+ );
578
556
  const trigger1 = overlayTrigger1.querySelector(
579
557
  '[slot="trigger"]'
580
558
  );
@@ -587,13 +565,17 @@ describe("Overlay - timing, v1", () => {
587
565
  boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
588
566
  boundingRectTrigger1.top + boundingRectTrigger1.height / 2
589
567
  ];
590
- const outsideTriggers = [
591
- boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
592
- 300
568
+ const outsideTrigger1 = [
569
+ boundingRectTrigger1.left + boundingRectTrigger1.width * 2,
570
+ boundingRectTrigger1.top + boundingRectTrigger1.height * 2
593
571
  ];
594
572
  const trigger2Position = [
595
573
  boundingRectTrigger2.left + boundingRectTrigger2.width / 2,
596
- boundingRectTrigger2.top + boundingRectTrigger2.height / 4
574
+ boundingRectTrigger2.top + boundingRectTrigger2.height / 2
575
+ ];
576
+ const outsideTrigger2 = [
577
+ boundingRectTrigger2.left + boundingRectTrigger2.width * 2,
578
+ boundingRectTrigger2.top + boundingRectTrigger2.height / 2
597
579
  ];
598
580
  await sendMouse({
599
581
  steps: [
@@ -609,7 +591,7 @@ describe("Overlay - timing, v1", () => {
609
591
  steps: [
610
592
  {
611
593
  type: "move",
612
- position: outsideTriggers
594
+ position: outsideTrigger1
613
595
  }
614
596
  ]
615
597
  });
@@ -626,7 +608,7 @@ describe("Overlay - timing, v1", () => {
626
608
  await nextFrame();
627
609
  await nextFrame();
628
610
  const opened = oneEvent(trigger2, "sp-opened");
629
- await sendMouse({
611
+ sendMouse({
630
612
  steps: [
631
613
  {
632
614
  type: "click",
@@ -635,23 +617,23 @@ describe("Overlay - timing, v1", () => {
635
617
  ]
636
618
  });
637
619
  await opened;
638
- await nextFrame();
639
- await nextFrame();
640
620
  expect(overlayTrigger1.hasAttribute("open")).to.be.false;
641
621
  expect(overlayTrigger2.hasAttribute("open")).to.be.true;
642
622
  expect(overlayTrigger2.getAttribute("open")).to.equal("click");
643
623
  const closed = oneEvent(overlayTrigger2, "sp-closed");
644
- await sendMouse({
624
+ sendMouse({
645
625
  steps: [
646
626
  {
647
627
  type: "click",
648
- position: outsideTriggers
628
+ position: outsideTrigger2
649
629
  }
650
630
  ]
651
631
  });
652
632
  await closed;
633
+ for (let i = 0; i < 3; i++)
634
+ await nextFrame();
653
635
  expect(overlayTrigger1.hasAttribute("open")).to.be.false;
654
- expect(overlayTrigger2.hasAttribute("open")).to.be.false;
636
+ expect(overlayTrigger2.hasAttribute("open"), overlayTrigger2.open).to.be.false;
655
637
  });
656
638
  });
657
- //# sourceMappingURL=overlay-v1.test.js.map
639
+ //# sourceMappingURL=overlay.test.js.map