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