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