@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.
@@ -43,87 +43,164 @@ async function styledFixture(story) {
43
43
  describe("Overlays", () => {
44
44
  let testDiv;
45
45
  let openOverlays = [];
46
- beforeEach(async () => {
47
- testDiv = await styledFixture(
48
- html`
49
- <div id="top">
50
- <style>
51
- body {
52
- display: flex;
53
- align-items: center;
54
- justify-content: center;
55
- }
46
+ describe("shared fixture", () => {
47
+ beforeEach(async () => {
48
+ testDiv = await styledFixture(
49
+ html`
50
+ <div id="top">
51
+ <style>
52
+ body {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ }
56
57
 
57
- #top {
58
- margin: 100px;
59
- }
58
+ #top {
59
+ margin: 100px;
60
+ }
60
61
 
61
- sp-button {
62
- flex: none;
63
- }
62
+ sp-button {
63
+ flex: none;
64
+ }
64
65
 
65
- #overlay-content {
66
- display: none;
67
- }
68
- </style>
69
- <sp-button id="first-button" variant="primary">
70
- Show Popover
71
- </sp-button>
72
- <div id="overlay-content">
73
- <sp-popover id="outer-popover" direction="bottom" tip>
74
- <sp-dialog no-divider>
75
- <div class="options-popover-content">
76
- A popover message
77
- </div>
78
- <sp-button id="outer-focus-target">
79
- Test 1
80
- </sp-button>
81
- <sp-button>Test 2</sp-button>
82
- <sp-button>Test 3</sp-button>
83
- </sp-dialog>
84
- </sp-popover>
85
- <sp-tooltip id="hover-1" class="hover-content">
86
- Hover message
87
- </sp-tooltip>
88
- <sp-tooltip id="hover-2" class="hover-content">
89
- Other hover message
90
- </sp-tooltip>
66
+ #overlay-content {
67
+ display: none;
68
+ }
69
+ </style>
70
+ <sp-button id="first-button" variant="primary">
71
+ Show Popover
72
+ </sp-button>
73
+ <div id="overlay-content">
74
+ <sp-popover
75
+ id="outer-popover"
76
+ direction="bottom"
77
+ tip
78
+ >
79
+ <sp-dialog no-divider>
80
+ <div class="options-popover-content">
81
+ A popover message
82
+ </div>
83
+ <sp-button id="outer-focus-target">
84
+ Test 1
85
+ </sp-button>
86
+ <sp-button>Test 2</sp-button>
87
+ <sp-button>Test 3</sp-button>
88
+ </sp-dialog>
89
+ </sp-popover>
90
+ <sp-tooltip id="hover-1" class="hover-content">
91
+ Hover message
92
+ </sp-tooltip>
93
+ <sp-tooltip id="hover-2" class="hover-content">
94
+ Other hover message
95
+ </sp-tooltip>
96
+ </div>
91
97
  </div>
92
- </div>
93
- `
94
- );
95
- await elementUpdated(testDiv);
96
- });
97
- afterEach(() => {
98
- openOverlays.map((overlay) => overlay.open = false);
99
- openOverlays = [];
100
- });
101
- [
102
- "bottom",
103
- "bottom-start",
104
- "bottom-end",
105
- "top",
106
- "top-start",
107
- "top-end",
108
- "left",
109
- "left-start",
110
- "left-end",
111
- "right",
112
- "right-start",
113
- "right-end"
114
- ].map((direction) => {
115
- const placement = direction;
116
- it(`opens a popover - ${placement}`, async () => {
117
- const clickSpy = spy();
98
+ `
99
+ );
100
+ await elementUpdated(testDiv);
101
+ });
102
+ afterEach(() => {
103
+ openOverlays.map((overlay) => overlay.open = false);
104
+ openOverlays = [];
105
+ });
106
+ [
107
+ "bottom",
108
+ "bottom-start",
109
+ "bottom-end",
110
+ "top",
111
+ "top-start",
112
+ "top-end",
113
+ "left",
114
+ "left-start",
115
+ "left-end",
116
+ "right",
117
+ "right-start",
118
+ "right-end"
119
+ ].map((direction) => {
120
+ const placement = direction;
121
+ it(`opens a popover - ${placement}`, async () => {
122
+ const clickSpy = spy();
123
+ const button = testDiv.querySelector(
124
+ "#first-button"
125
+ );
126
+ const outerPopover = testDiv.querySelector(
127
+ "#outer-popover"
128
+ );
129
+ outerPopover.addEventListener("click", () => {
130
+ clickSpy();
131
+ });
132
+ expect(await isInteractive(outerPopover)).to.be.false;
133
+ expect(button).to.exist;
134
+ const opened = oneEvent(outerPopover, "sp-opened");
135
+ openOverlays.push(
136
+ await Overlay.open(outerPopover, {
137
+ trigger: button,
138
+ type: "auto",
139
+ delayed: false,
140
+ placement,
141
+ offset: 10
142
+ })
143
+ );
144
+ button.insertAdjacentElement(
145
+ "afterend",
146
+ openOverlays.at(-1)
147
+ );
148
+ await opened;
149
+ expect(await isInteractive(outerPopover)).to.be.true;
150
+ });
151
+ });
152
+ it(`opens a modal dialog`, async () => {
118
153
  const button = testDiv.querySelector(
119
154
  "#first-button"
120
155
  );
121
156
  const outerPopover = testDiv.querySelector(
122
157
  "#outer-popover"
123
158
  );
124
- outerPopover.addEventListener("click", () => {
125
- clickSpy();
159
+ expect(await isInteractive(outerPopover)).to.be.false;
160
+ expect(button).to.exist;
161
+ const opened = oneEvent(outerPopover, "sp-opened");
162
+ openOverlays.push(
163
+ await Overlay.open(outerPopover, {
164
+ trigger: button
165
+ })
166
+ );
167
+ button.insertAdjacentElement(
168
+ "afterend",
169
+ openOverlays.at(-1)
170
+ );
171
+ await opened;
172
+ const firstFocused = outerPopover.querySelector(
173
+ "#outer-focus-target"
174
+ );
175
+ expect(document.activeElement === firstFocused).to.be.true;
176
+ await sendKeys({
177
+ press: "Tab"
126
178
  });
179
+ expect(document.activeElement === button).to.be.false;
180
+ await sendKeys({
181
+ press: "Tab"
182
+ });
183
+ expect(document.activeElement === button).to.be.false;
184
+ await sendKeys({
185
+ press: "Shift+Tab"
186
+ });
187
+ expect(document.activeElement === button).to.be.false;
188
+ await sendKeys({
189
+ press: "Shift+Tab"
190
+ });
191
+ expect(document.activeElement === button).to.be.false;
192
+ await sendKeys({
193
+ press: "Shift+Tab"
194
+ });
195
+ expect(document.activeElement === button).to.be.false;
196
+ });
197
+ it(`updates a popover`, async () => {
198
+ const button = testDiv.querySelector(
199
+ "#first-button"
200
+ );
201
+ const outerPopover = testDiv.querySelector(
202
+ "#outer-popover"
203
+ );
127
204
  expect(await isInteractive(outerPopover)).to.be.false;
128
205
  expect(button).to.exist;
129
206
  const opened = oneEvent(outerPopover, "sp-opened");
@@ -131,8 +208,6 @@ describe("Overlays", () => {
131
208
  await Overlay.open(outerPopover, {
132
209
  trigger: button,
133
210
  type: "auto",
134
- delayed: false,
135
- placement,
136
211
  offset: 10
137
212
  })
138
213
  );
@@ -142,180 +217,134 @@ describe("Overlays", () => {
142
217
  );
143
218
  await opened;
144
219
  expect(await isInteractive(outerPopover)).to.be.true;
220
+ Overlay.update();
221
+ expect(await isInteractive(outerPopover)).to.be.true;
145
222
  });
146
- });
147
- it(`opens a modal dialog`, async () => {
148
- const button = testDiv.querySelector("#first-button");
149
- const outerPopover = testDiv.querySelector("#outer-popover");
150
- expect(await isInteractive(outerPopover)).to.be.false;
151
- expect(button).to.exist;
152
- const opened = oneEvent(outerPopover, "sp-opened");
153
- openOverlays.push(
154
- await Overlay.open(outerPopover, {
155
- trigger: button
156
- })
157
- );
158
- button.insertAdjacentElement(
159
- "afterend",
160
- openOverlays.at(-1)
161
- );
162
- await opened;
163
- const firstFocused = outerPopover.querySelector(
164
- "#outer-focus-target"
165
- );
166
- expect(document.activeElement === firstFocused).to.be.true;
167
- await sendKeys({
168
- press: "Tab"
169
- });
170
- expect(document.activeElement === button).to.be.false;
171
- await sendKeys({
172
- press: "Tab"
173
- });
174
- expect(document.activeElement === button).to.be.false;
175
- await sendKeys({
176
- press: "Shift+Tab"
223
+ it(`opens a popover w/ delay`, async () => {
224
+ const button = testDiv.querySelector(
225
+ "#first-button"
226
+ );
227
+ const outerPopover = testDiv.querySelector(
228
+ "#outer-popover"
229
+ );
230
+ expect(await isInteractive(outerPopover)).to.be.false;
231
+ expect(button).to.exist;
232
+ const opened = oneEvent(outerPopover, "sp-opened");
233
+ const start = performance.now();
234
+ openOverlays.push(
235
+ await Overlay.open(outerPopover, {
236
+ trigger: button,
237
+ type: "auto",
238
+ delayed: true,
239
+ offset: 10
240
+ })
241
+ );
242
+ button.insertAdjacentElement(
243
+ "afterend",
244
+ openOverlays.at(-1)
245
+ );
246
+ await opened;
247
+ const end = performance.now();
248
+ expect(await isInteractive(outerPopover)).to.be.true;
249
+ expect(end - start).to.be.greaterThan(1e3);
177
250
  });
178
- expect(document.activeElement === button).to.be.false;
179
- await sendKeys({
180
- press: "Shift+Tab"
251
+ it("opens hover overlay", async () => {
252
+ const button = testDiv.querySelector(
253
+ "#first-button"
254
+ );
255
+ const hoverOverlay = testDiv.querySelector(
256
+ "#hover-1"
257
+ );
258
+ const clickOverlay = testDiv.querySelector(
259
+ "#outer-popover"
260
+ );
261
+ expect(await isOnTopLayer(hoverOverlay)).to.be.false;
262
+ expect(await isOnTopLayer(clickOverlay)).to.be.false;
263
+ let opened = oneEvent(hoverOverlay, "sp-opened");
264
+ openOverlays.push(
265
+ await Overlay.open(hoverOverlay, {
266
+ trigger: button,
267
+ type: "hint",
268
+ placement: "top",
269
+ offset: 10
270
+ })
271
+ );
272
+ button.insertAdjacentElement(
273
+ "afterend",
274
+ openOverlays.at(-1)
275
+ );
276
+ await opened;
277
+ expect(await isOnTopLayer(hoverOverlay)).to.be.true;
278
+ opened = oneEvent(clickOverlay, "sp-opened");
279
+ const closed = oneEvent(hoverOverlay, "sp-closed");
280
+ openOverlays.push(
281
+ await Overlay.open(clickOverlay, {
282
+ trigger: button,
283
+ type: "auto",
284
+ placement: "bottom",
285
+ offset: 10
286
+ })
287
+ );
288
+ button.insertAdjacentElement(
289
+ "afterend",
290
+ openOverlays.at(-1)
291
+ );
292
+ await opened;
293
+ await closed;
294
+ expect(
295
+ await isInteractive(clickOverlay),
296
+ "click overlay not interactive"
297
+ ).to.be.true;
298
+ expect(
299
+ await isOnTopLayer(hoverOverlay),
300
+ "hover overlay interactive"
301
+ ).to.be.false;
181
302
  });
182
- expect(document.activeElement === button).to.be.false;
183
- await sendKeys({
184
- press: "Shift+Tab"
303
+ it("opens custom overlay", async () => {
304
+ const button = testDiv.querySelector(
305
+ "#first-button"
306
+ );
307
+ const customOverlay = testDiv.querySelector(
308
+ "#hover-1"
309
+ );
310
+ const clickOverlay = testDiv.querySelector(
311
+ "#outer-popover"
312
+ );
313
+ expect(button).to.exist;
314
+ expect(customOverlay).to.exist;
315
+ expect(await isOnTopLayer(customOverlay)).to.be.false;
316
+ expect(await isOnTopLayer(clickOverlay)).to.be.false;
317
+ let opened = oneEvent(customOverlay, "sp-opened");
318
+ openOverlays.push(
319
+ await Overlay.open(customOverlay, {
320
+ trigger: button,
321
+ type: "auto",
322
+ placement: "top",
323
+ offset: 10
324
+ })
325
+ );
326
+ button.insertAdjacentElement(
327
+ "afterend",
328
+ openOverlays.at(-1)
329
+ );
330
+ await opened;
331
+ expect(await isOnTopLayer(customOverlay)).to.be.true;
332
+ opened = oneEvent(clickOverlay, "sp-opened");
333
+ openOverlays.push(
334
+ await Overlay.open(clickOverlay, {
335
+ trigger: button,
336
+ type: "auto",
337
+ placement: "bottom",
338
+ offset: 10
339
+ })
340
+ );
341
+ button.insertAdjacentElement(
342
+ "afterend",
343
+ openOverlays.at(-1)
344
+ );
345
+ await opened;
346
+ expect(await isOnTopLayer(clickOverlay), "click content open").to.be.true;
185
347
  });
186
- expect(document.activeElement === button).to.be.false;
187
- });
188
- it(`updates a popover`, async () => {
189
- const button = testDiv.querySelector("#first-button");
190
- const outerPopover = testDiv.querySelector("#outer-popover");
191
- expect(await isInteractive(outerPopover)).to.be.false;
192
- expect(button).to.exist;
193
- const opened = oneEvent(outerPopover, "sp-opened");
194
- openOverlays.push(
195
- await Overlay.open(outerPopover, {
196
- trigger: button,
197
- type: "auto",
198
- offset: 10
199
- })
200
- );
201
- button.insertAdjacentElement(
202
- "afterend",
203
- openOverlays.at(-1)
204
- );
205
- await opened;
206
- expect(await isInteractive(outerPopover)).to.be.true;
207
- Overlay.update();
208
- expect(await isInteractive(outerPopover)).to.be.true;
209
- });
210
- it(`opens a popover w/ delay`, async () => {
211
- const button = testDiv.querySelector("#first-button");
212
- const outerPopover = testDiv.querySelector("#outer-popover");
213
- expect(await isInteractive(outerPopover)).to.be.false;
214
- expect(button).to.exist;
215
- const opened = oneEvent(outerPopover, "sp-opened");
216
- const start = performance.now();
217
- openOverlays.push(
218
- await Overlay.open(outerPopover, {
219
- trigger: button,
220
- type: "auto",
221
- delayed: true,
222
- offset: 10
223
- })
224
- );
225
- button.insertAdjacentElement(
226
- "afterend",
227
- openOverlays.at(-1)
228
- );
229
- await opened;
230
- const end = performance.now();
231
- expect(await isInteractive(outerPopover)).to.be.true;
232
- expect(end - start).to.be.greaterThan(1e3);
233
- });
234
- it("opens hover overlay", async () => {
235
- const button = testDiv.querySelector("#first-button");
236
- const hoverOverlay = testDiv.querySelector("#hover-1");
237
- const clickOverlay = testDiv.querySelector(
238
- "#outer-popover"
239
- );
240
- expect(await isOnTopLayer(hoverOverlay)).to.be.false;
241
- expect(await isOnTopLayer(clickOverlay)).to.be.false;
242
- let opened = oneEvent(hoverOverlay, "sp-opened");
243
- openOverlays.push(
244
- await Overlay.open(hoverOverlay, {
245
- trigger: button,
246
- type: "hint",
247
- placement: "top",
248
- offset: 10
249
- })
250
- );
251
- button.insertAdjacentElement(
252
- "afterend",
253
- openOverlays.at(-1)
254
- );
255
- await opened;
256
- expect(await isOnTopLayer(hoverOverlay)).to.be.true;
257
- opened = oneEvent(clickOverlay, "sp-opened");
258
- const closed = oneEvent(hoverOverlay, "sp-closed");
259
- openOverlays.push(
260
- await Overlay.open(clickOverlay, {
261
- trigger: button,
262
- type: "auto",
263
- placement: "bottom",
264
- offset: 10
265
- })
266
- );
267
- button.insertAdjacentElement(
268
- "afterend",
269
- openOverlays.at(-1)
270
- );
271
- await opened;
272
- await closed;
273
- expect(
274
- await isInteractive(clickOverlay),
275
- "click overlay not interactive"
276
- ).to.be.true;
277
- expect(await isOnTopLayer(hoverOverlay), "hover overlay interactive").to.be.false;
278
- });
279
- it("opens custom overlay", async () => {
280
- const button = testDiv.querySelector("#first-button");
281
- const customOverlay = testDiv.querySelector("#hover-1");
282
- const clickOverlay = testDiv.querySelector(
283
- "#outer-popover"
284
- );
285
- expect(button).to.exist;
286
- expect(customOverlay).to.exist;
287
- expect(await isOnTopLayer(customOverlay)).to.be.false;
288
- expect(await isOnTopLayer(clickOverlay)).to.be.false;
289
- let opened = oneEvent(customOverlay, "sp-opened");
290
- openOverlays.push(
291
- await Overlay.open(customOverlay, {
292
- trigger: button,
293
- type: "auto",
294
- placement: "top",
295
- offset: 10
296
- })
297
- );
298
- button.insertAdjacentElement(
299
- "afterend",
300
- openOverlays.at(-1)
301
- );
302
- await opened;
303
- expect(await isOnTopLayer(customOverlay)).to.be.true;
304
- opened = oneEvent(clickOverlay, "sp-opened");
305
- openOverlays.push(
306
- await Overlay.open(clickOverlay, {
307
- trigger: button,
308
- type: "auto",
309
- placement: "bottom",
310
- offset: 10
311
- })
312
- );
313
- button.insertAdjacentElement(
314
- "afterend",
315
- openOverlays.at(-1)
316
- );
317
- await opened;
318
- expect(await isOnTopLayer(clickOverlay), "click content open").to.be.true;
319
348
  });
320
349
  it("closes via events", async () => {
321
350
  const test = await fixture(html`