@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.
- package/active-overlay.dev.js +1 -0
- package/active-overlay.dev.js.map +1 -1
- package/active-overlay.js +1 -1
- package/active-overlay.js.map +2 -2
- package/overlay-trigger.dev.js +1 -0
- package/overlay-trigger.dev.js.map +1 -1
- package/overlay-trigger.js +1 -1
- package/overlay-trigger.js.map +2 -2
- package/package.json +4 -4
- package/src/ActiveOverlay.dev.js +60 -24
- package/src/ActiveOverlay.dev.js.map +3 -3
- package/src/ActiveOverlay.js +3 -3
- package/src/ActiveOverlay.js.map +3 -3
- package/src/OverlayTrigger.dev.js +51 -18
- package/src/OverlayTrigger.dev.js.map +1 -1
- package/src/OverlayTrigger.js +2 -2
- package/src/OverlayTrigger.js.map +2 -2
- package/src/VirtualTrigger.dev.js +1 -0
- package/src/VirtualTrigger.dev.js.map +1 -1
- package/src/VirtualTrigger.js +1 -1
- package/src/VirtualTrigger.js.map +2 -2
- package/src/active-overlay.css.dev.js +1 -0
- package/src/active-overlay.css.dev.js.map +1 -1
- package/src/active-overlay.css.js +1 -1
- package/src/active-overlay.css.js.map +2 -2
- package/src/index.dev.js +1 -0
- package/src/index.dev.js.map +1 -1
- package/src/index.js +1 -1
- package/src/index.js.map +1 -1
- package/src/loader.dev.js +1 -0
- package/src/loader.dev.js.map +1 -1
- package/src/loader.js +1 -1
- package/src/loader.js.map +2 -2
- package/src/overlay-events.dev.js +1 -0
- package/src/overlay-events.dev.js.map +1 -1
- package/src/overlay-events.js +1 -1
- package/src/overlay-events.js.map +2 -2
- package/src/overlay-stack.d.ts +1 -1
- package/src/overlay-stack.dev.js +97 -46
- package/src/overlay-stack.dev.js.map +3 -3
- package/src/overlay-stack.js +2 -2
- package/src/overlay-stack.js.map +3 -3
- package/src/overlay-timer.dev.js +1 -0
- package/src/overlay-timer.dev.js.map +1 -1
- package/src/overlay-timer.js +1 -1
- package/src/overlay-timer.js.map +2 -2
- package/src/overlay-trigger.css.dev.js +1 -0
- package/src/overlay-trigger.css.dev.js.map +1 -1
- package/src/overlay-trigger.css.js +1 -1
- package/src/overlay-trigger.css.js.map +2 -2
- package/src/overlay-types.dev.js +1 -0
- package/src/overlay-types.js +1 -0
- package/src/overlay-utils.dev.js +4 -1
- package/src/overlay-utils.dev.js.map +1 -1
- package/src/overlay-utils.js +1 -1
- package/src/overlay-utils.js.map +2 -2
- package/src/overlay.dev.js +1 -0
- package/src/overlay.dev.js.map +1 -1
- package/src/overlay.js +1 -1
- package/src/overlay.js.map +2 -2
- package/stories/overlay-story-components.js +219 -11
- package/stories/overlay-story-components.js.map +2 -2
- package/stories/overlay.stories.js +354 -55
- package/stories/overlay.stories.js.map +1 -1
- package/sync/overlay-trigger.dev.js +1 -0
- package/sync/overlay-trigger.dev.js.map +1 -1
- package/sync/overlay-trigger.js +1 -1
- package/sync/overlay-trigger.js.map +2 -2
- package/test/benchmark/basic-test.js +10 -2
- package/test/benchmark/basic-test.js.map +1 -1
- package/test/overlay-lifecycle.test.js +149 -6
- package/test/overlay-lifecycle.test.js.map +1 -1
- package/test/overlay-timer.test.js +117 -1
- package/test/overlay-timer.test.js.map +2 -2
- package/test/overlay-trigger-click.test.js +66 -7
- package/test/overlay-trigger-click.test.js.map +1 -1
- package/test/overlay-trigger-extended.test.js +187 -4
- package/test/overlay-trigger-extended.test.js.map +1 -1
- package/test/overlay-trigger-hover-click.test.js +68 -3
- package/test/overlay-trigger-hover-click.test.js.map +1 -1
- package/test/overlay-trigger-hover.test.js +172 -7
- package/test/overlay-trigger-hover.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +233 -9
- package/test/overlay-trigger-longpress.test.js.map +2 -2
- package/test/overlay-trigger-sync.test.js +536 -4
- package/test/overlay-trigger-sync.test.js.map +2 -2
- package/test/overlay-trigger.test.js +536 -4
- package/test/overlay-trigger.test.js.map +2 -2
- package/test/overlay.test-vrt.js +4 -1
- package/test/overlay.test-vrt.js.map +1 -1
- package/test/overlay.test.js +565 -11
- package/test/overlay.test.js.map +1 -1
package/test/overlay.test.js
CHANGED
|
@@ -1,4 +1,33 @@
|
|
|
1
|
-
|
|
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
|
-
`
|
|
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
|
-
`)
|
|
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
|
-
`)
|
|
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
|
-
`)
|
|
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
|
-
`
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
`)
|
|
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
|