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