@spectrum-web-components/overlay 0.39.3 → 0.39.4
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/custom-elements.json +9 -2
- package/package.json +9 -9
- package/src/AbstractOverlay.d.ts +2 -1
- package/src/AbstractOverlay.dev.js +6 -0
- package/src/AbstractOverlay.dev.js.map +2 -2
- package/src/AbstractOverlay.js +1 -1
- package/src/AbstractOverlay.js.map +3 -3
- package/src/Overlay.d.ts +3 -1
- package/src/Overlay.dev.js +17 -3
- package/src/Overlay.dev.js.map +2 -2
- package/src/Overlay.js +3 -3
- package/src/Overlay.js.map +3 -3
- package/src/topLayerOverTransforms.dev.js +17 -5
- package/src/topLayerOverTransforms.dev.js.map +2 -2
- package/src/topLayerOverTransforms.js +1 -1
- package/src/topLayerOverTransforms.js.map +3 -3
- package/stories/overlay-element.stories.js +32 -24
- package/stories/overlay-element.stories.js.map +2 -2
- package/test/index.js +7 -0
- package/test/index.js.map +2 -2
- package/test/overlay-trigger-click.test.js +40 -8
- package/test/overlay-trigger-click.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +29 -11
- package/test/overlay-trigger-longpress.test.js.map +2 -2
- package/test/overlay-v1.test.js +235 -206
- package/test/overlay-v1.test.js.map +2 -2
- package/test/overlay.test.js +271 -242
- package/test/overlay.test.js.map +2 -2
package/test/overlay-v1.test.js
CHANGED
|
@@ -41,78 +41,145 @@ async function styledFixture(story) {
|
|
|
41
41
|
describe("Overlays, v1", () => {
|
|
42
42
|
let testDiv;
|
|
43
43
|
let openOverlays = [];
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
describe("shared fixture", () => {
|
|
45
|
+
beforeEach(async () => {
|
|
46
|
+
testDiv = await styledFixture(
|
|
47
|
+
html`
|
|
48
|
+
<div id="top">
|
|
49
|
+
<style>
|
|
50
|
+
body {
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
}
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
#top {
|
|
57
|
+
margin: 100px;
|
|
58
|
+
}
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
sp-button {
|
|
61
|
+
flex: none;
|
|
62
|
+
}
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
<sp-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
64
|
+
#overlay-content {
|
|
65
|
+
display: none;
|
|
66
|
+
}
|
|
67
|
+
</style>
|
|
68
|
+
<sp-button id="first-button" variant="primary">
|
|
69
|
+
Show Popover
|
|
70
|
+
</sp-button>
|
|
71
|
+
<div id="overlay-content">
|
|
72
|
+
<sp-popover
|
|
73
|
+
id="outer-popover"
|
|
74
|
+
direction="bottom"
|
|
75
|
+
tip
|
|
76
|
+
>
|
|
77
|
+
<sp-dialog no-divider>
|
|
78
|
+
<div class="options-popover-content">
|
|
79
|
+
A popover message
|
|
80
|
+
</div>
|
|
81
|
+
<sp-button id="outer-focus-target">
|
|
82
|
+
Test 1
|
|
83
|
+
</sp-button>
|
|
84
|
+
<sp-button>Test 2</sp-button>
|
|
85
|
+
<sp-button>Test 3</sp-button>
|
|
86
|
+
</sp-dialog>
|
|
87
|
+
</sp-popover>
|
|
88
|
+
<sp-tooltip id="hover-1" class="hover-content">
|
|
89
|
+
Hover message
|
|
90
|
+
</sp-tooltip>
|
|
91
|
+
<sp-tooltip id="hover-2" class="hover-content">
|
|
92
|
+
Other hover message
|
|
93
|
+
</sp-tooltip>
|
|
94
|
+
</div>
|
|
89
95
|
</div>
|
|
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
|
-
|
|
96
|
+
`
|
|
97
|
+
);
|
|
98
|
+
await elementUpdated(testDiv);
|
|
99
|
+
});
|
|
100
|
+
afterEach(() => {
|
|
101
|
+
openOverlays.map((close) => close());
|
|
102
|
+
openOverlays = [];
|
|
103
|
+
});
|
|
104
|
+
[
|
|
105
|
+
"bottom",
|
|
106
|
+
"bottom-start",
|
|
107
|
+
"bottom-end",
|
|
108
|
+
"top",
|
|
109
|
+
"top-start",
|
|
110
|
+
"top-end",
|
|
111
|
+
"left",
|
|
112
|
+
"left-start",
|
|
113
|
+
"left-end",
|
|
114
|
+
"right",
|
|
115
|
+
"right-start",
|
|
116
|
+
"right-end",
|
|
117
|
+
"none"
|
|
118
|
+
].map((direction) => {
|
|
119
|
+
const placement = direction;
|
|
120
|
+
it(`opens a popover - ${placement}`, async () => {
|
|
121
|
+
const button = testDiv.querySelector(
|
|
122
|
+
"#first-button"
|
|
123
|
+
);
|
|
124
|
+
const outerPopover = testDiv.querySelector(
|
|
125
|
+
"#outer-popover"
|
|
126
|
+
);
|
|
127
|
+
expect(await isInteractive(outerPopover)).to.be.false;
|
|
128
|
+
expect(button).to.exist;
|
|
129
|
+
const opened = oneEvent(outerPopover, "sp-opened");
|
|
130
|
+
openOverlays.push(
|
|
131
|
+
await Overlay.open(button, "click", outerPopover, {
|
|
132
|
+
delayed: false,
|
|
133
|
+
placement,
|
|
134
|
+
offset: 10
|
|
135
|
+
})
|
|
136
|
+
);
|
|
137
|
+
await opened;
|
|
138
|
+
expect(await isInteractive(outerPopover)).to.be.true;
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
it(`opens a modal dialog`, async () => {
|
|
142
|
+
const button = testDiv.querySelector(
|
|
143
|
+
"#first-button"
|
|
144
|
+
);
|
|
145
|
+
const outerPopover = testDiv.querySelector(
|
|
146
|
+
"#outer-popover"
|
|
147
|
+
);
|
|
148
|
+
expect(await isInteractive(outerPopover)).to.be.false;
|
|
149
|
+
expect(button).to.exist;
|
|
150
|
+
const opened = oneEvent(outerPopover, "sp-opened");
|
|
151
|
+
openOverlays.push(
|
|
152
|
+
await Overlay.open(button, "modal", outerPopover, {
|
|
153
|
+
delayed: false
|
|
154
|
+
})
|
|
155
|
+
);
|
|
156
|
+
await opened;
|
|
157
|
+
const firstFocused = outerPopover.querySelector(
|
|
158
|
+
"#outer-focus-target"
|
|
159
|
+
);
|
|
160
|
+
expect(document.activeElement === firstFocused).to.be.true;
|
|
161
|
+
await sendKeys({
|
|
162
|
+
press: "Tab"
|
|
163
|
+
});
|
|
164
|
+
expect(document.activeElement === button).to.be.false;
|
|
165
|
+
await sendKeys({
|
|
166
|
+
press: "Tab"
|
|
167
|
+
});
|
|
168
|
+
expect(document.activeElement === button).to.be.false;
|
|
169
|
+
await sendKeys({
|
|
170
|
+
press: "Shift+Tab"
|
|
171
|
+
});
|
|
172
|
+
expect(document.activeElement === button).to.be.false;
|
|
173
|
+
await sendKeys({
|
|
174
|
+
press: "Shift+Tab"
|
|
175
|
+
});
|
|
176
|
+
expect(document.activeElement === button).to.be.false;
|
|
177
|
+
await sendKeys({
|
|
178
|
+
press: "Shift+Tab"
|
|
179
|
+
});
|
|
180
|
+
expect(document.activeElement === button).to.be.false;
|
|
181
|
+
});
|
|
182
|
+
it(`updates a popover`, async () => {
|
|
116
183
|
const button = testDiv.querySelector(
|
|
117
184
|
"#first-button"
|
|
118
185
|
);
|
|
@@ -125,151 +192,113 @@ describe("Overlays, v1", () => {
|
|
|
125
192
|
openOverlays.push(
|
|
126
193
|
await Overlay.open(button, "click", outerPopover, {
|
|
127
194
|
delayed: false,
|
|
128
|
-
placement,
|
|
129
195
|
offset: 10
|
|
130
196
|
})
|
|
131
197
|
);
|
|
132
198
|
await opened;
|
|
133
199
|
expect(await isInteractive(outerPopover)).to.be.true;
|
|
200
|
+
Overlay.update();
|
|
201
|
+
expect(await isInteractive(outerPopover)).to.be.true;
|
|
134
202
|
});
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
await sendKeys({
|
|
157
|
-
press: "Tab"
|
|
158
|
-
});
|
|
159
|
-
expect(document.activeElement === button).to.be.false;
|
|
160
|
-
await sendKeys({
|
|
161
|
-
press: "Shift+Tab"
|
|
203
|
+
it(`opens a popover w/ delay`, async () => {
|
|
204
|
+
const button = testDiv.querySelector(
|
|
205
|
+
"#first-button"
|
|
206
|
+
);
|
|
207
|
+
const outerPopover = testDiv.querySelector(
|
|
208
|
+
"#outer-popover"
|
|
209
|
+
);
|
|
210
|
+
expect(await isInteractive(outerPopover)).to.be.false;
|
|
211
|
+
expect(button).to.exist;
|
|
212
|
+
const opened = oneEvent(outerPopover, "sp-opened");
|
|
213
|
+
const start = performance.now();
|
|
214
|
+
openOverlays.push(
|
|
215
|
+
await Overlay.open(button, "click", outerPopover, {
|
|
216
|
+
delayed: true,
|
|
217
|
+
offset: 10
|
|
218
|
+
})
|
|
219
|
+
);
|
|
220
|
+
await opened;
|
|
221
|
+
const end = performance.now();
|
|
222
|
+
expect(await isInteractive(outerPopover)).to.be.true;
|
|
223
|
+
expect(end - start).to.be.greaterThan(1e3);
|
|
162
224
|
});
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
225
|
+
it("opens hover overlay", async () => {
|
|
226
|
+
const button = testDiv.querySelector(
|
|
227
|
+
"#first-button"
|
|
228
|
+
);
|
|
229
|
+
const hoverOverlay = testDiv.querySelector(
|
|
230
|
+
"#hover-1"
|
|
231
|
+
);
|
|
232
|
+
const clickOverlay = testDiv.querySelector(
|
|
233
|
+
"#outer-popover"
|
|
234
|
+
);
|
|
235
|
+
expect(await isOnTopLayer(hoverOverlay)).to.be.false;
|
|
236
|
+
expect(await isOnTopLayer(clickOverlay)).to.be.false;
|
|
237
|
+
let opened = oneEvent(hoverOverlay, "sp-opened");
|
|
238
|
+
openOverlays.push(
|
|
239
|
+
await Overlay.open(button, "hover", hoverOverlay, {
|
|
240
|
+
delayed: false,
|
|
241
|
+
placement: "top",
|
|
242
|
+
offset: 10
|
|
243
|
+
})
|
|
244
|
+
);
|
|
245
|
+
await opened;
|
|
246
|
+
expect(await isOnTopLayer(hoverOverlay)).to.be.true;
|
|
247
|
+
opened = oneEvent(clickOverlay, "sp-opened");
|
|
248
|
+
const closed = oneEvent(hoverOverlay, "sp-closed");
|
|
249
|
+
openOverlays.push(
|
|
250
|
+
await Overlay.open(button, "click", clickOverlay, {
|
|
251
|
+
delayed: false,
|
|
252
|
+
placement: "bottom",
|
|
253
|
+
offset: 10
|
|
254
|
+
})
|
|
255
|
+
);
|
|
256
|
+
await opened;
|
|
257
|
+
await closed;
|
|
258
|
+
expect(
|
|
259
|
+
await isInteractive(clickOverlay),
|
|
260
|
+
"click overlay not interactive"
|
|
261
|
+
).to.be.true;
|
|
262
|
+
expect(
|
|
263
|
+
await isOnTopLayer(hoverOverlay),
|
|
264
|
+
"hover overlay interactive"
|
|
265
|
+
).to.be.false;
|
|
166
266
|
});
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
267
|
+
it("opens custom overlay", async () => {
|
|
268
|
+
const button = testDiv.querySelector(
|
|
269
|
+
"#first-button"
|
|
270
|
+
);
|
|
271
|
+
const customOverlay = testDiv.querySelector(
|
|
272
|
+
"#hover-1"
|
|
273
|
+
);
|
|
274
|
+
const clickOverlay = testDiv.querySelector(
|
|
275
|
+
"#outer-popover"
|
|
276
|
+
);
|
|
277
|
+
expect(button).to.exist;
|
|
278
|
+
expect(customOverlay).to.exist;
|
|
279
|
+
expect(await isOnTopLayer(customOverlay)).to.be.false;
|
|
280
|
+
expect(await isOnTopLayer(clickOverlay)).to.be.false;
|
|
281
|
+
let opened = oneEvent(customOverlay, "sp-opened");
|
|
282
|
+
openOverlays.push(
|
|
283
|
+
await Overlay.open(button, "custom", customOverlay, {
|
|
284
|
+
delayed: false,
|
|
285
|
+
placement: "top",
|
|
286
|
+
offset: 10
|
|
287
|
+
})
|
|
288
|
+
);
|
|
289
|
+
await opened;
|
|
290
|
+
expect(await isOnTopLayer(customOverlay)).to.be.true;
|
|
291
|
+
opened = oneEvent(clickOverlay, "sp-opened");
|
|
292
|
+
openOverlays.push(
|
|
293
|
+
await Overlay.open(button, "click", clickOverlay, {
|
|
294
|
+
delayed: false,
|
|
295
|
+
placement: "bottom",
|
|
296
|
+
offset: 10
|
|
297
|
+
})
|
|
298
|
+
);
|
|
299
|
+
await opened;
|
|
300
|
+
expect(await isOnTopLayer(clickOverlay), "click content open").to.be.true;
|
|
170
301
|
});
|
|
171
|
-
expect(document.activeElement === button).to.be.false;
|
|
172
|
-
});
|
|
173
|
-
it(`updates a popover`, async () => {
|
|
174
|
-
const button = testDiv.querySelector("#first-button");
|
|
175
|
-
const outerPopover = testDiv.querySelector("#outer-popover");
|
|
176
|
-
expect(await isInteractive(outerPopover)).to.be.false;
|
|
177
|
-
expect(button).to.exist;
|
|
178
|
-
const opened = oneEvent(outerPopover, "sp-opened");
|
|
179
|
-
openOverlays.push(
|
|
180
|
-
await Overlay.open(button, "click", outerPopover, {
|
|
181
|
-
delayed: false,
|
|
182
|
-
offset: 10
|
|
183
|
-
})
|
|
184
|
-
);
|
|
185
|
-
await opened;
|
|
186
|
-
expect(await isInteractive(outerPopover)).to.be.true;
|
|
187
|
-
Overlay.update();
|
|
188
|
-
expect(await isInteractive(outerPopover)).to.be.true;
|
|
189
|
-
});
|
|
190
|
-
it(`opens a popover w/ delay`, async () => {
|
|
191
|
-
const button = testDiv.querySelector("#first-button");
|
|
192
|
-
const outerPopover = testDiv.querySelector("#outer-popover");
|
|
193
|
-
expect(await isInteractive(outerPopover)).to.be.false;
|
|
194
|
-
expect(button).to.exist;
|
|
195
|
-
const opened = oneEvent(outerPopover, "sp-opened");
|
|
196
|
-
const start = performance.now();
|
|
197
|
-
openOverlays.push(
|
|
198
|
-
await Overlay.open(button, "click", outerPopover, {
|
|
199
|
-
delayed: true,
|
|
200
|
-
offset: 10
|
|
201
|
-
})
|
|
202
|
-
);
|
|
203
|
-
await opened;
|
|
204
|
-
const end = performance.now();
|
|
205
|
-
expect(await isInteractive(outerPopover)).to.be.true;
|
|
206
|
-
expect(end - start).to.be.greaterThan(1e3);
|
|
207
|
-
});
|
|
208
|
-
it("opens hover overlay", async () => {
|
|
209
|
-
const button = testDiv.querySelector("#first-button");
|
|
210
|
-
const hoverOverlay = testDiv.querySelector("#hover-1");
|
|
211
|
-
const clickOverlay = testDiv.querySelector(
|
|
212
|
-
"#outer-popover"
|
|
213
|
-
);
|
|
214
|
-
expect(await isOnTopLayer(hoverOverlay)).to.be.false;
|
|
215
|
-
expect(await isOnTopLayer(clickOverlay)).to.be.false;
|
|
216
|
-
let opened = oneEvent(hoverOverlay, "sp-opened");
|
|
217
|
-
openOverlays.push(
|
|
218
|
-
await Overlay.open(button, "hover", hoverOverlay, {
|
|
219
|
-
delayed: false,
|
|
220
|
-
placement: "top",
|
|
221
|
-
offset: 10
|
|
222
|
-
})
|
|
223
|
-
);
|
|
224
|
-
await opened;
|
|
225
|
-
expect(await isOnTopLayer(hoverOverlay)).to.be.true;
|
|
226
|
-
opened = oneEvent(clickOverlay, "sp-opened");
|
|
227
|
-
const closed = oneEvent(hoverOverlay, "sp-closed");
|
|
228
|
-
openOverlays.push(
|
|
229
|
-
await Overlay.open(button, "click", clickOverlay, {
|
|
230
|
-
delayed: false,
|
|
231
|
-
placement: "bottom",
|
|
232
|
-
offset: 10
|
|
233
|
-
})
|
|
234
|
-
);
|
|
235
|
-
await opened;
|
|
236
|
-
await closed;
|
|
237
|
-
expect(
|
|
238
|
-
await isInteractive(clickOverlay),
|
|
239
|
-
"click overlay not interactive"
|
|
240
|
-
).to.be.true;
|
|
241
|
-
expect(await isOnTopLayer(hoverOverlay), "hover overlay interactive").to.be.false;
|
|
242
|
-
});
|
|
243
|
-
it("opens custom overlay", async () => {
|
|
244
|
-
const button = testDiv.querySelector("#first-button");
|
|
245
|
-
const customOverlay = testDiv.querySelector("#hover-1");
|
|
246
|
-
const clickOverlay = testDiv.querySelector(
|
|
247
|
-
"#outer-popover"
|
|
248
|
-
);
|
|
249
|
-
expect(button).to.exist;
|
|
250
|
-
expect(customOverlay).to.exist;
|
|
251
|
-
expect(await isOnTopLayer(customOverlay)).to.be.false;
|
|
252
|
-
expect(await isOnTopLayer(clickOverlay)).to.be.false;
|
|
253
|
-
let opened = oneEvent(customOverlay, "sp-opened");
|
|
254
|
-
openOverlays.push(
|
|
255
|
-
await Overlay.open(button, "custom", customOverlay, {
|
|
256
|
-
delayed: false,
|
|
257
|
-
placement: "top",
|
|
258
|
-
offset: 10
|
|
259
|
-
})
|
|
260
|
-
);
|
|
261
|
-
await opened;
|
|
262
|
-
expect(await isOnTopLayer(customOverlay)).to.be.true;
|
|
263
|
-
opened = oneEvent(clickOverlay, "sp-opened");
|
|
264
|
-
openOverlays.push(
|
|
265
|
-
await Overlay.open(button, "click", clickOverlay, {
|
|
266
|
-
delayed: false,
|
|
267
|
-
placement: "bottom",
|
|
268
|
-
offset: 10
|
|
269
|
-
})
|
|
270
|
-
);
|
|
271
|
-
await opened;
|
|
272
|
-
expect(await isOnTopLayer(clickOverlay), "click content open").to.be.true;
|
|
273
302
|
});
|
|
274
303
|
it("closes via events", async () => {
|
|
275
304
|
const test = await fixture(html`
|
|
@@ -292,11 +321,11 @@ describe("Overlays, v1", () => {
|
|
|
292
321
|
})
|
|
293
322
|
);
|
|
294
323
|
await opened;
|
|
295
|
-
expect(await
|
|
324
|
+
expect(await isOnTopLayer(el)).to.be.true;
|
|
296
325
|
const closed = oneEvent(el, "sp-closed");
|
|
297
326
|
dialog.close();
|
|
298
327
|
await closed;
|
|
299
|
-
expect(await
|
|
328
|
+
expect(await isOnTopLayer(el)).to.be.false;
|
|
300
329
|
});
|
|
301
330
|
it("closes an inline overlay when tabbing past the content", async () => {
|
|
302
331
|
const el = await fixture(html`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["overlay-v1.test.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport '@spectrum-web-components/button/sp-button.js';\nimport '@spectrum-web-components/dialog/sp-dialog.js';\nimport '@spectrum-web-components/overlay/sp-overlay.js';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\nimport { Dialog } from '@spectrum-web-components/dialog';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport { Popover } from '@spectrum-web-components/popover';\nimport { setViewport } from '@web/test-runner-commands';\nimport {\n Overlay,\n OverlayTrigger,\n Placement,\n} from '@spectrum-web-components/overlay';\n\nimport {\n elementUpdated,\n expect,\n html,\n nextFrame,\n oneEvent,\n} from '@open-wc/testing';\nimport { sendKeys } from '@web/test-runner-commands';\nimport {\n definedOverlayElement,\n virtualElementV1,\n} from '../stories/overlay.stories';\nimport { PopoverContent } from '../stories/overlay-story-components.js';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport '@spectrum-web-components/theme/sp-theme.js';\nimport '@spectrum-web-components/theme/src/themes.js';\nimport { Theme } from '@spectrum-web-components/theme';\nimport { render, TemplateResult } from '@spectrum-web-components/base';\nimport {\n fixture,\n isInteractive,\n isOnTopLayer,\n} from '../../../test/testing-helpers.js';\nimport { Menu } from '@spectrum-web-components/menu';\n\nasync function styledFixture<T extends Element>(\n story: TemplateResult\n): Promise<T> {\n const test = await fixture<Theme>(html`\n <sp-theme theme=\"spectrum\" scale=\"medium\" color=\"dark\">\n ${story}\n </sp-theme>\n `);\n return test.children[0] as T;\n}\n\ndescribe('Overlays, v1', () => {\n let testDiv!: HTMLDivElement;\n let openOverlays: (() => void)[] = [];\n\n beforeEach(async () => {\n testDiv = await styledFixture<HTMLDivElement>(\n html`\n <div id=\"top\">\n <style>\n body {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n #top {\n margin: 100px;\n }\n\n sp-button {\n flex: none;\n }\n\n #overlay-content {\n display: none;\n }\n </style>\n <sp-button id=\"first-button\" variant=\"primary\">\n Show Popover\n </sp-button>\n <div id=\"overlay-content\">\n <sp-popover id=\"outer-popover\" direction=\"bottom\" tip>\n <sp-dialog no-divider>\n <div class=\"options-popover-content\">\n A popover message\n </div>\n <sp-button id=\"outer-focus-target\">\n Test 1\n </sp-button>\n <sp-button>Test 2</sp-button>\n <sp-button>Test 3</sp-button>\n </sp-dialog>\n </sp-popover>\n <sp-tooltip id=\"hover-1\" class=\"hover-content\">\n Hover message\n </sp-tooltip>\n <sp-tooltip id=\"hover-2\" class=\"hover-content\">\n Other hover message\n </sp-tooltip>\n </div>\n </div>\n `\n );\n await elementUpdated(testDiv);\n });\n\n afterEach(() => {\n openOverlays.map((close) => close());\n openOverlays = [];\n });\n\n [\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'top',\n 'top-start',\n 'top-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'none',\n ].map((direction) => {\n const placement = direction as Placement;\n it(`opens a popover - ${placement}`, async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const outerPopover = testDiv.querySelector(\n '#outer-popover'\n ) as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'click', outerPopover, {\n delayed: false,\n placement,\n offset: 10,\n })\n );\n await opened;\n expect(await isInteractive(outerPopover)).to.be.true;\n });\n });\n\n it(`opens a modal dialog`, async () => {\n const button = testDiv.querySelector('#first-button') as HTMLElement;\n const outerPopover = testDiv.querySelector('#outer-popover') as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'modal', outerPopover, {\n delayed: false,\n })\n );\n await opened;\n\n const firstFocused = outerPopover.querySelector(\n '#outer-focus-target'\n ) as HTMLElement;\n expect(document.activeElement === firstFocused).to.be.true;\n\n /**\n * Tab cycle is awkward in the headless browser, forward tab to just before the known end of the page\n * and the backward tab past the known beginning of the page. Test that you never focused the button\n * that triggered the dialog and is outside of the modal. A test that was able to cycle would be better.\n */\n\n await sendKeys({\n press: 'Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n await sendKeys({\n press: 'Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n });\n\n it(`updates a popover`, async () => {\n const button = testDiv.querySelector('#first-button') as HTMLElement;\n const outerPopover = testDiv.querySelector('#outer-popover') as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'click', outerPopover, {\n delayed: false,\n offset: 10,\n })\n );\n await opened;\n\n expect(await isInteractive(outerPopover)).to.be.true;\n\n Overlay.update();\n\n expect(await isInteractive(outerPopover)).to.be.true;\n });\n\n it(`opens a popover w/ delay`, async () => {\n const button = testDiv.querySelector('#first-button') as HTMLElement;\n const outerPopover = testDiv.querySelector('#outer-popover') as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n const start = performance.now();\n openOverlays.push(\n await Overlay.open(button, 'click', outerPopover, {\n delayed: true,\n offset: 10,\n })\n );\n await opened;\n const end = performance.now();\n expect(await isInteractive(outerPopover)).to.be.true;\n expect(end - start).to.be.greaterThan(1000);\n });\n\n it('opens hover overlay', async () => {\n const button = testDiv.querySelector('#first-button') as HTMLElement;\n const hoverOverlay = testDiv.querySelector('#hover-1') as HTMLElement;\n const clickOverlay = testDiv.querySelector(\n '#outer-popover'\n ) as HTMLElement;\n\n expect(await isOnTopLayer(hoverOverlay)).to.be.false;\n expect(await isOnTopLayer(clickOverlay)).to.be.false;\n\n let opened = oneEvent(hoverOverlay, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'hover', hoverOverlay, {\n delayed: false,\n placement: 'top',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(hoverOverlay)).to.be.true;\n\n opened = oneEvent(clickOverlay, 'sp-opened');\n const closed = oneEvent(hoverOverlay, 'sp-closed');\n // Opening click overlay should close the hover overlay\n openOverlays.push(\n await Overlay.open(button, 'click', clickOverlay, {\n delayed: false,\n placement: 'bottom',\n offset: 10,\n })\n );\n await opened;\n await closed;\n expect(\n await isInteractive(clickOverlay),\n 'click overlay not interactive'\n ).to.be.true;\n expect(await isOnTopLayer(hoverOverlay), 'hover overlay interactive').to\n .be.false;\n });\n\n it('opens custom overlay', async () => {\n const button = testDiv.querySelector('#first-button') as HTMLElement;\n const customOverlay = testDiv.querySelector('#hover-1') as HTMLElement;\n const clickOverlay = testDiv.querySelector(\n '#outer-popover'\n ) as HTMLElement;\n\n expect(button).to.exist;\n expect(customOverlay).to.exist;\n\n expect(await isOnTopLayer(customOverlay)).to.be.false;\n expect(await isOnTopLayer(clickOverlay)).to.be.false;\n\n let opened = oneEvent(customOverlay, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'custom', customOverlay, {\n delayed: false,\n placement: 'top',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(customOverlay)).to.be.true;\n\n opened = oneEvent(clickOverlay, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'click', clickOverlay, {\n delayed: false,\n placement: 'bottom',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(clickOverlay), 'click content open').to.be\n .true;\n });\n\n it('closes via events', async () => {\n const test = await fixture<HTMLDivElement>(html`\n <div>\n <sp-popover id=\"root\">\n <sp-dialog dismissable>\n Some Content for the Dialog.\n </sp-dialog>\n </sp-popover>\n </div>\n `);\n\n const el = test.querySelector('sp-popover') as Popover;\n const dialog = el.querySelector('sp-dialog') as Dialog;\n\n const opened = oneEvent(el, 'sp-opened');\n openOverlays.push(\n await Overlay.open(test, 'click', el, {\n delayed: false,\n placement: 'bottom',\n offset: 10,\n })\n );\n await opened;\n expect(await isInteractive(el)).to.be.true;\n\n const closed = oneEvent(el, 'sp-closed');\n dialog.close();\n await closed;\n expect(await isInteractive(el)).to.be.false;\n });\n\n it('closes an inline overlay when tabbing past the content', async () => {\n const el = await fixture<HTMLDivElement>(html`\n <div>\n <sp-button class=\"trigger\">Trigger</sp-button>\n <sp-popover class=\"content\">\n <input />\n </sp-popover>\n <input value=\"After\" id=\"after\" />\n </div>\n `);\n\n const trigger = el.querySelector('.trigger') as HTMLElement;\n const content = el.querySelector('.content') as HTMLElement;\n const input = el.querySelector('input') as HTMLInputElement;\n const after = el.querySelector('#after') as HTMLAnchorElement;\n\n const opened = oneEvent(content, 'sp-opened');\n openOverlays.push(\n await Overlay.open(trigger, 'inline', content, {\n receivesFocus: 'auto',\n })\n );\n await opened;\n\n expect(await isInteractive(content)).to.be.true;\n expect(document.activeElement).to.equal(input);\n\n const closed = oneEvent(content, 'sp-closed');\n await sendKeys({\n press: 'Shift+Tab',\n });\n await closed;\n\n expect(document.activeElement).to.equal(trigger);\n\n await sendKeys({\n press: 'Tab',\n });\n expect(document.activeElement).to.equal(after);\n expect(await isInteractive(content)).to.be.false;\n });\n\n it('closes an inline overlay when tabbing before the trigger', async () => {\n const el = await fixture<HTMLDivElement>(html`\n <div>\n <input value=\"Before\" id=\"before\" />\n <sp-button class=\"trigger\">Trigger</sp-button>\n <div class=\"content\">\n <label>\n Content in an inline overlay.\n <input />\n </label>\n </div>\n </div>\n `);\n\n const trigger = el.querySelector('.trigger') as HTMLElement;\n const content = el.querySelector('.content') as HTMLElement;\n const input = el.querySelector('.content input') as HTMLInputElement;\n const before = el.querySelector('#before') as HTMLAnchorElement;\n\n const open = oneEvent(trigger, 'sp-opened');\n openOverlays.push(await Overlay.open(trigger, 'inline', content, {}));\n await open;\n\n expect(document.activeElement).to.equal(input);\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement).to.equal(trigger);\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement).to.equal(before);\n });\n\n it('opens detached content', async () => {\n const textContent = 'This is a detached element that has been overlaid';\n const el = await fixture<HTMLButtonElement>(\n html`\n <button>Trigger</button>\n `\n );\n\n const content = document.createElement('sp-popover');\n content.textContent = textContent;\n\n const opened = oneEvent(content, 'sp-opened');\n const closeOverlay = await Overlay.open(el, 'click', content, {\n placement: 'bottom',\n });\n await opened;\n\n expect(await isInteractive(content)).to.be.true;\n\n const closed = oneEvent(content, 'sp-closed');\n closeOverlay();\n await closed;\n\n expect(await isInteractive(content)).to.be.false;\n\n content.remove();\n });\n});\ndescribe('Overlay - type=\"modal\", v1', () => {\n describe('handle multiple separate `contextmenu` events', async () => {\n let width = 0;\n let height = 0;\n let firstMenu: Popover;\n let firstRect: DOMRect;\n let secondMenu: Popover;\n let secondRect: DOMRect;\n before(async () => {\n render(\n html`\n <sp-theme color=\"light\" scale=\"large\">\n ${virtualElementV1({\n ...virtualElementV1.args,\n offset: 6,\n })}\n </sp-theme>\n `,\n document.body\n );\n\n width = window.innerWidth;\n height = window.innerHeight;\n });\n after(() => {\n document.querySelector('sp-theme')?.remove();\n });\n it('opens the first \"contextmenu\" overlay', async () => {\n const opened = oneEvent(document, 'sp-opened');\n // Right click to open \"context menu\" overlay.\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [width / 2 + 50, height / 2],\n },\n {\n type: 'click',\n options: {\n button: 'right',\n },\n position: [width / 2 + 50, height / 2],\n },\n ],\n });\n await opened;\n firstMenu = document.querySelector('sp-popover') as Popover;\n expect(firstMenu.textContent).to.include('Menu source: end');\n firstRect = firstMenu.getBoundingClientRect();\n expect(firstMenu).to.not.be.null;\n });\n it('closes the first \"contextmenu\" when opening a second', async () => {\n const closed = oneEvent(document, 'sp-closed');\n const opened = oneEvent(document, 'sp-opened');\n /**\n * Right click out of the \"context menu\" overlay to both close\n * the first overlay and have the event passed to the surfacing page\n * in order to open a subsequent \"context menu\" overlay.\n *\n * Using `sendMouse` here triggers the light dismiss for some reason while\n * manual interacting in this way does not...\n */\n const trigger = document.querySelector(\n 'start-end-contextmenu'\n ) as HTMLElement;\n trigger.shadowRoot?.querySelector('#start')?.dispatchEvent(\n new Event('contextmenu', {\n composed: true,\n })\n );\n await nextFrame();\n trigger.shadowRoot?.querySelector('#start')?.dispatchEvent(\n new Event('pointerup', {\n composed: true,\n bubbles: true,\n })\n );\n await closed;\n await opened;\n secondMenu = document.querySelector('sp-popover') as Popover;\n expect(secondMenu.textContent).to.include('Menu source: start');\n secondRect = secondMenu.getBoundingClientRect();\n expect(secondMenu).to.not.be.null;\n });\n it('closes the second \"contextmenu\" when clicking away', async () => {\n const closed = oneEvent(document, 'sp-closed');\n sendMouse({\n steps: [\n {\n type: 'click',\n position: [width - width / 8, height - height / 8],\n },\n ],\n });\n await closed;\n expect(firstRect.top).to.not.equal(secondRect.top);\n expect(firstRect.left).to.not.equal(secondRect.left);\n });\n });\n\n it('does not open content off of the viewport', async () => {\n before(async () => {\n await setViewport({ width: 360, height: 640 });\n // Allow viewport update to propagate.\n await nextFrame();\n });\n after(async () => {\n await setViewport({ width: 800, height: 600 });\n // Allow viewport update to propagate.\n await nextFrame();\n });\n\n await fixture<HTMLDivElement>(html`\n ${virtualElementV1({\n ...virtualElementV1.args,\n offset: 6,\n })}\n `);\n\n const opened = oneEvent(document, 'sp-opened');\n // Right click to open \"context menu\" overlay.\n sendMouse({\n steps: [\n {\n type: 'move',\n position: [270, 10],\n },\n {\n type: 'click',\n options: {\n button: 'right',\n },\n position: [270, 10],\n },\n ],\n });\n await opened;\n\n const firstMenu = document.querySelector('sp-menu') as Menu;\n expect(firstMenu).to.not.be.null;\n expect(await isInteractive(firstMenu)).to.be.true;\n\n const closed = oneEvent(document, 'sp-closed');\n sendKeys({\n press: 'Escape',\n });\n await closed;\n\n expect(await isInteractive(firstMenu)).to.be.false;\n });\n\n it('opens children in the modal stack through shadow roots', async () => {\n const el = await fixture<OverlayTrigger>(definedOverlayElement());\n const trigger = el.querySelector(\n '[slot=\"trigger\"]'\n ) as HTMLButtonElement;\n let open = oneEvent(el, 'sp-opened');\n trigger.click();\n await open;\n expect(el.open).to.equal('click');\n const content = document.querySelector(\n 'popover-content'\n ) as PopoverContent;\n open = oneEvent(content, 'sp-opened');\n content.button.click();\n await open;\n expect(content.trigger.open).to.equal('click');\n let close = oneEvent(content, 'sp-closed');\n content.trigger.removeAttribute('open');\n await close;\n expect(content.trigger.open).to.be.null;\n close = oneEvent(el, 'sp-closed');\n el.removeAttribute('open');\n await close;\n expect(el.open).to.be.null;\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport '@spectrum-web-components/button/sp-button.js';\nimport '@spectrum-web-components/dialog/sp-dialog.js';\nimport '@spectrum-web-components/overlay/sp-overlay.js';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\nimport { Dialog } from '@spectrum-web-components/dialog';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport { Popover } from '@spectrum-web-components/popover';\nimport { setViewport } from '@web/test-runner-commands';\nimport {\n Overlay,\n OverlayTrigger,\n Placement,\n} from '@spectrum-web-components/overlay';\n\nimport {\n elementUpdated,\n expect,\n html,\n nextFrame,\n oneEvent,\n} from '@open-wc/testing';\nimport { sendKeys } from '@web/test-runner-commands';\nimport {\n definedOverlayElement,\n virtualElementV1,\n} from '../stories/overlay.stories';\nimport { PopoverContent } from '../stories/overlay-story-components.js';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport '@spectrum-web-components/theme/sp-theme.js';\nimport '@spectrum-web-components/theme/src/themes.js';\nimport { Theme } from '@spectrum-web-components/theme';\nimport { render, TemplateResult } from '@spectrum-web-components/base';\nimport {\n fixture,\n isInteractive,\n isOnTopLayer,\n} from '../../../test/testing-helpers.js';\nimport { Menu } from '@spectrum-web-components/menu';\n\nasync function styledFixture<T extends Element>(\n story: TemplateResult\n): Promise<T> {\n const test = await fixture<Theme>(html`\n <sp-theme theme=\"spectrum\" scale=\"medium\" color=\"dark\">\n ${story}\n </sp-theme>\n `);\n return test.children[0] as T;\n}\n\ndescribe('Overlays, v1', () => {\n let testDiv!: HTMLDivElement;\n let openOverlays: (() => void)[] = [];\n\n describe('shared fixture', () => {\n beforeEach(async () => {\n testDiv = await styledFixture<HTMLDivElement>(\n html`\n <div id=\"top\">\n <style>\n body {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n #top {\n margin: 100px;\n }\n\n sp-button {\n flex: none;\n }\n\n #overlay-content {\n display: none;\n }\n </style>\n <sp-button id=\"first-button\" variant=\"primary\">\n Show Popover\n </sp-button>\n <div id=\"overlay-content\">\n <sp-popover\n id=\"outer-popover\"\n direction=\"bottom\"\n tip\n >\n <sp-dialog no-divider>\n <div class=\"options-popover-content\">\n A popover message\n </div>\n <sp-button id=\"outer-focus-target\">\n Test 1\n </sp-button>\n <sp-button>Test 2</sp-button>\n <sp-button>Test 3</sp-button>\n </sp-dialog>\n </sp-popover>\n <sp-tooltip id=\"hover-1\" class=\"hover-content\">\n Hover message\n </sp-tooltip>\n <sp-tooltip id=\"hover-2\" class=\"hover-content\">\n Other hover message\n </sp-tooltip>\n </div>\n </div>\n `\n );\n await elementUpdated(testDiv);\n });\n\n afterEach(() => {\n openOverlays.map((close) => close());\n openOverlays = [];\n });\n\n [\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'top',\n 'top-start',\n 'top-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'none',\n ].map((direction) => {\n const placement = direction as Placement;\n it(`opens a popover - ${placement}`, async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const outerPopover = testDiv.querySelector(\n '#outer-popover'\n ) as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'click', outerPopover, {\n delayed: false,\n placement,\n offset: 10,\n })\n );\n await opened;\n expect(await isInteractive(outerPopover)).to.be.true;\n });\n });\n\n it(`opens a modal dialog`, async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const outerPopover = testDiv.querySelector(\n '#outer-popover'\n ) as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'modal', outerPopover, {\n delayed: false,\n })\n );\n await opened;\n\n const firstFocused = outerPopover.querySelector(\n '#outer-focus-target'\n ) as HTMLElement;\n expect(document.activeElement === firstFocused).to.be.true;\n\n /**\n * Tab cycle is awkward in the headless browser, forward tab to just before the known end of the page\n * and the backward tab past the known beginning of the page. Test that you never focused the button\n * that triggered the dialog and is outside of the modal. A test that was able to cycle would be better.\n */\n\n await sendKeys({\n press: 'Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n await sendKeys({\n press: 'Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement === button).to.be.false;\n });\n\n it(`updates a popover`, async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const outerPopover = testDiv.querySelector(\n '#outer-popover'\n ) as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'click', outerPopover, {\n delayed: false,\n offset: 10,\n })\n );\n await opened;\n\n expect(await isInteractive(outerPopover)).to.be.true;\n\n Overlay.update();\n\n expect(await isInteractive(outerPopover)).to.be.true;\n });\n\n it(`opens a popover w/ delay`, async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const outerPopover = testDiv.querySelector(\n '#outer-popover'\n ) as Popover;\n\n expect(await isInteractive(outerPopover)).to.be.false;\n expect(button).to.exist;\n\n const opened = oneEvent(outerPopover, 'sp-opened');\n const start = performance.now();\n openOverlays.push(\n await Overlay.open(button, 'click', outerPopover, {\n delayed: true,\n offset: 10,\n })\n );\n await opened;\n const end = performance.now();\n expect(await isInteractive(outerPopover)).to.be.true;\n expect(end - start).to.be.greaterThan(1000);\n });\n\n it('opens hover overlay', async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const hoverOverlay = testDiv.querySelector(\n '#hover-1'\n ) as HTMLElement;\n const clickOverlay = testDiv.querySelector(\n '#outer-popover'\n ) as HTMLElement;\n\n expect(await isOnTopLayer(hoverOverlay)).to.be.false;\n expect(await isOnTopLayer(clickOverlay)).to.be.false;\n\n let opened = oneEvent(hoverOverlay, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'hover', hoverOverlay, {\n delayed: false,\n placement: 'top',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(hoverOverlay)).to.be.true;\n\n opened = oneEvent(clickOverlay, 'sp-opened');\n const closed = oneEvent(hoverOverlay, 'sp-closed');\n // Opening click overlay should close the hover overlay\n openOverlays.push(\n await Overlay.open(button, 'click', clickOverlay, {\n delayed: false,\n placement: 'bottom',\n offset: 10,\n })\n );\n await opened;\n await closed;\n expect(\n await isInteractive(clickOverlay),\n 'click overlay not interactive'\n ).to.be.true;\n expect(\n await isOnTopLayer(hoverOverlay),\n 'hover overlay interactive'\n ).to.be.false;\n });\n\n it('opens custom overlay', async () => {\n const button = testDiv.querySelector(\n '#first-button'\n ) as HTMLElement;\n const customOverlay = testDiv.querySelector(\n '#hover-1'\n ) as HTMLElement;\n const clickOverlay = testDiv.querySelector(\n '#outer-popover'\n ) as HTMLElement;\n\n expect(button).to.exist;\n expect(customOverlay).to.exist;\n\n expect(await isOnTopLayer(customOverlay)).to.be.false;\n expect(await isOnTopLayer(clickOverlay)).to.be.false;\n\n let opened = oneEvent(customOverlay, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'custom', customOverlay, {\n delayed: false,\n placement: 'top',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(customOverlay)).to.be.true;\n\n opened = oneEvent(clickOverlay, 'sp-opened');\n openOverlays.push(\n await Overlay.open(button, 'click', clickOverlay, {\n delayed: false,\n placement: 'bottom',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(clickOverlay), 'click content open').to.be\n .true;\n });\n });\n\n it('closes via events', async () => {\n const test = await fixture<HTMLDivElement>(html`\n <div>\n <sp-popover id=\"root\">\n <sp-dialog dismissable>\n Some Content for the Dialog.\n </sp-dialog>\n </sp-popover>\n </div>\n `);\n\n const el = test.querySelector('sp-popover') as Popover;\n const dialog = el.querySelector('sp-dialog') as Dialog;\n\n const opened = oneEvent(el, 'sp-opened');\n openOverlays.push(\n await Overlay.open(test, 'click', el, {\n delayed: false,\n placement: 'bottom',\n offset: 10,\n })\n );\n await opened;\n expect(await isOnTopLayer(el)).to.be.true;\n\n const closed = oneEvent(el, 'sp-closed');\n dialog.close();\n await closed;\n expect(await isOnTopLayer(el)).to.be.false;\n });\n\n it('closes an inline overlay when tabbing past the content', async () => {\n const el = await fixture<HTMLDivElement>(html`\n <div>\n <sp-button class=\"trigger\">Trigger</sp-button>\n <sp-popover class=\"content\">\n <input />\n </sp-popover>\n <input value=\"After\" id=\"after\" />\n </div>\n `);\n\n const trigger = el.querySelector('.trigger') as HTMLElement;\n const content = el.querySelector('.content') as HTMLElement;\n const input = el.querySelector('input') as HTMLInputElement;\n const after = el.querySelector('#after') as HTMLAnchorElement;\n\n const opened = oneEvent(content, 'sp-opened');\n openOverlays.push(\n await Overlay.open(trigger, 'inline', content, {\n receivesFocus: 'auto',\n })\n );\n await opened;\n\n expect(await isInteractive(content)).to.be.true;\n expect(document.activeElement).to.equal(input);\n\n const closed = oneEvent(content, 'sp-closed');\n await sendKeys({\n press: 'Shift+Tab',\n });\n await closed;\n\n expect(document.activeElement).to.equal(trigger);\n\n await sendKeys({\n press: 'Tab',\n });\n expect(document.activeElement).to.equal(after);\n expect(await isInteractive(content)).to.be.false;\n });\n\n it('closes an inline overlay when tabbing before the trigger', async () => {\n const el = await fixture<HTMLDivElement>(html`\n <div>\n <input value=\"Before\" id=\"before\" />\n <sp-button class=\"trigger\">Trigger</sp-button>\n <div class=\"content\">\n <label>\n Content in an inline overlay.\n <input />\n </label>\n </div>\n </div>\n `);\n\n const trigger = el.querySelector('.trigger') as HTMLElement;\n const content = el.querySelector('.content') as HTMLElement;\n const input = el.querySelector('.content input') as HTMLInputElement;\n const before = el.querySelector('#before') as HTMLAnchorElement;\n\n const open = oneEvent(trigger, 'sp-opened');\n openOverlays.push(await Overlay.open(trigger, 'inline', content, {}));\n await open;\n\n expect(document.activeElement).to.equal(input);\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement).to.equal(trigger);\n\n await sendKeys({\n press: 'Shift+Tab',\n });\n\n expect(document.activeElement).to.equal(before);\n });\n\n it('opens detached content', async () => {\n const textContent = 'This is a detached element that has been overlaid';\n const el = await fixture<HTMLButtonElement>(\n html`\n <button>Trigger</button>\n `\n );\n\n const content = document.createElement('sp-popover');\n content.textContent = textContent;\n\n const opened = oneEvent(content, 'sp-opened');\n const closeOverlay = await Overlay.open(el, 'click', content, {\n placement: 'bottom',\n });\n await opened;\n\n expect(await isInteractive(content)).to.be.true;\n\n const closed = oneEvent(content, 'sp-closed');\n closeOverlay();\n await closed;\n\n expect(await isInteractive(content)).to.be.false;\n\n content.remove();\n });\n});\ndescribe('Overlay - type=\"modal\", v1', () => {\n describe('handle multiple separate `contextmenu` events', async () => {\n let width = 0;\n let height = 0;\n let firstMenu: Popover;\n let firstRect: DOMRect;\n let secondMenu: Popover;\n let secondRect: DOMRect;\n before(async () => {\n render(\n html`\n <sp-theme color=\"light\" scale=\"large\">\n ${virtualElementV1({\n ...virtualElementV1.args,\n offset: 6,\n })}\n </sp-theme>\n `,\n document.body\n );\n\n width = window.innerWidth;\n height = window.innerHeight;\n });\n after(() => {\n document.querySelector('sp-theme')?.remove();\n });\n it('opens the first \"contextmenu\" overlay', async () => {\n const opened = oneEvent(document, 'sp-opened');\n // Right click to open \"context menu\" overlay.\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [width / 2 + 50, height / 2],\n },\n {\n type: 'click',\n options: {\n button: 'right',\n },\n position: [width / 2 + 50, height / 2],\n },\n ],\n });\n await opened;\n firstMenu = document.querySelector('sp-popover') as Popover;\n expect(firstMenu.textContent).to.include('Menu source: end');\n firstRect = firstMenu.getBoundingClientRect();\n expect(firstMenu).to.not.be.null;\n });\n it('closes the first \"contextmenu\" when opening a second', async () => {\n const closed = oneEvent(document, 'sp-closed');\n const opened = oneEvent(document, 'sp-opened');\n /**\n * Right click out of the \"context menu\" overlay to both close\n * the first overlay and have the event passed to the surfacing page\n * in order to open a subsequent \"context menu\" overlay.\n *\n * Using `sendMouse` here triggers the light dismiss for some reason while\n * manual interacting in this way does not...\n */\n const trigger = document.querySelector(\n 'start-end-contextmenu'\n ) as HTMLElement;\n trigger.shadowRoot?.querySelector('#start')?.dispatchEvent(\n new Event('contextmenu', {\n composed: true,\n })\n );\n await nextFrame();\n trigger.shadowRoot?.querySelector('#start')?.dispatchEvent(\n new Event('pointerup', {\n composed: true,\n bubbles: true,\n })\n );\n await closed;\n await opened;\n secondMenu = document.querySelector('sp-popover') as Popover;\n expect(secondMenu.textContent).to.include('Menu source: start');\n secondRect = secondMenu.getBoundingClientRect();\n expect(secondMenu).to.not.be.null;\n });\n it('closes the second \"contextmenu\" when clicking away', async () => {\n const closed = oneEvent(document, 'sp-closed');\n sendMouse({\n steps: [\n {\n type: 'click',\n position: [width - width / 8, height - height / 8],\n },\n ],\n });\n await closed;\n expect(firstRect.top).to.not.equal(secondRect.top);\n expect(firstRect.left).to.not.equal(secondRect.left);\n });\n });\n\n it('does not open content off of the viewport', async () => {\n before(async () => {\n await setViewport({ width: 360, height: 640 });\n // Allow viewport update to propagate.\n await nextFrame();\n });\n after(async () => {\n await setViewport({ width: 800, height: 600 });\n // Allow viewport update to propagate.\n await nextFrame();\n });\n\n await fixture<HTMLDivElement>(html`\n ${virtualElementV1({\n ...virtualElementV1.args,\n offset: 6,\n })}\n `);\n\n const opened = oneEvent(document, 'sp-opened');\n // Right click to open \"context menu\" overlay.\n sendMouse({\n steps: [\n {\n type: 'move',\n position: [270, 10],\n },\n {\n type: 'click',\n options: {\n button: 'right',\n },\n position: [270, 10],\n },\n ],\n });\n await opened;\n\n const firstMenu = document.querySelector('sp-menu') as Menu;\n expect(firstMenu).to.not.be.null;\n expect(await isInteractive(firstMenu)).to.be.true;\n\n const closed = oneEvent(document, 'sp-closed');\n sendKeys({\n press: 'Escape',\n });\n await closed;\n\n expect(await isInteractive(firstMenu)).to.be.false;\n });\n\n it('opens children in the modal stack through shadow roots', async () => {\n const el = await fixture<OverlayTrigger>(definedOverlayElement());\n const trigger = el.querySelector(\n '[slot=\"trigger\"]'\n ) as HTMLButtonElement;\n let open = oneEvent(el, 'sp-opened');\n trigger.click();\n await open;\n expect(el.open).to.equal('click');\n const content = document.querySelector(\n 'popover-content'\n ) as PopoverContent;\n open = oneEvent(content, 'sp-opened');\n content.button.click();\n await open;\n expect(content.trigger.open).to.equal('click');\n let close = oneEvent(content, 'sp-closed');\n content.trigger.removeAttribute('open');\n await close;\n expect(content.trigger.open).to.be.null;\n close = oneEvent(el, 'sp-closed');\n el.removeAttribute('open');\n await close;\n expect(el.open).to.be.null;\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["after", "before"]
|
|
7
7
|
}
|