@spectrum-web-components/picker 0.31.1-overlay.29 → 0.31.1-react.21
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 +1734 -0
- package/package.json +14 -14
- package/src/Picker.d.ts +31 -19
- package/src/Picker.dev.js +171 -126
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +16 -31
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +67 -35
- package/src/picker.css.dev.js.map +2 -2
- package/src/picker.css.js +67 -35
- package/src/picker.css.js.map +2 -2
- package/src/spectrum-picker.css.dev.js +66 -34
- package/src/spectrum-picker.css.dev.js.map +2 -2
- package/src/spectrum-picker.css.js +66 -34
- package/src/spectrum-picker.css.js.map +2 -2
- package/sync/index.d.ts +1 -4
- package/sync/index.dev.js +6 -1
- package/sync/index.dev.js.map +2 -2
- package/sync/index.js +1 -1
- package/sync/index.js.map +3 -3
- package/test/index.js +142 -185
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +17 -10
- package/test/picker-reparenting.test.js.map +2 -2
- package/test/picker-responsive.test.js +2 -3
- package/test/picker-responsive.test.js.map +2 -2
- package/test/picker.test.js +1 -1
- package/test/picker.test.js.map +2 -2
package/test/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import {
|
|
3
|
-
aTimeout,
|
|
4
3
|
elementUpdated,
|
|
5
4
|
expect,
|
|
6
5
|
fixture,
|
|
@@ -16,6 +15,7 @@ import {
|
|
|
16
15
|
arrowLeftEvent,
|
|
17
16
|
arrowRightEvent,
|
|
18
17
|
arrowUpEvent,
|
|
18
|
+
escapeEvent,
|
|
19
19
|
testForLitDevWarnings,
|
|
20
20
|
tEvent
|
|
21
21
|
} from "../../../test/testing-helpers.js";
|
|
@@ -27,19 +27,18 @@ import {
|
|
|
27
27
|
import { iconsOnly } from "../stories/picker.stories.js";
|
|
28
28
|
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
29
29
|
import { ignoreResizeObserverLoopError } from "../../../test/testing-helpers.js";
|
|
30
|
-
import "@spectrum-web-components/
|
|
31
|
-
import "@spectrum-web-components/theme/src/themes.js";
|
|
30
|
+
import { isWebKit } from "@spectrum-web-components/shared/src/platform.js";
|
|
32
31
|
ignoreResizeObserverLoopError(before, after);
|
|
33
|
-
const isMenuActiveElement = function(
|
|
32
|
+
const isMenuActiveElement = function() {
|
|
34
33
|
var _a;
|
|
35
|
-
return ((_a =
|
|
34
|
+
return ((_a = document.activeElement) == null ? void 0 : _a.localName) === "sp-menu";
|
|
36
35
|
};
|
|
37
36
|
export function runPickerTests() {
|
|
38
37
|
let el;
|
|
39
38
|
const pickerFixture = async () => {
|
|
40
39
|
const test = await fixture(
|
|
41
40
|
html`
|
|
42
|
-
<
|
|
41
|
+
<div>
|
|
43
42
|
<sp-field-label for="picker">
|
|
44
43
|
Where do you live?
|
|
45
44
|
</sp-field-label>
|
|
@@ -57,7 +56,7 @@ export function runPickerTests() {
|
|
|
57
56
|
<sp-menu-item>Save Selection</sp-menu-item>
|
|
58
57
|
<sp-menu-item disabled>Make Work Path</sp-menu-item>
|
|
59
58
|
</sp-picker>
|
|
60
|
-
</
|
|
59
|
+
</div>
|
|
61
60
|
`
|
|
62
61
|
);
|
|
63
62
|
return test.querySelector("sp-picker");
|
|
@@ -67,6 +66,13 @@ export function runPickerTests() {
|
|
|
67
66
|
el = await pickerFixture();
|
|
68
67
|
await elementUpdated(el);
|
|
69
68
|
});
|
|
69
|
+
afterEach(async () => {
|
|
70
|
+
if (el.open) {
|
|
71
|
+
const closed = oneEvent(el, "sp-closed");
|
|
72
|
+
el.open = false;
|
|
73
|
+
await closed;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
70
76
|
it("loads accessibly", async () => {
|
|
71
77
|
await expect(el).to.be.accessible();
|
|
72
78
|
});
|
|
@@ -75,7 +81,7 @@ export function runPickerTests() {
|
|
|
75
81
|
el.open = true;
|
|
76
82
|
await opened;
|
|
77
83
|
expect(el.open).to.be.true;
|
|
78
|
-
const accessibleCloseButton =
|
|
84
|
+
const accessibleCloseButton = document.querySelector(
|
|
79
85
|
".visually-hidden button"
|
|
80
86
|
);
|
|
81
87
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -84,13 +90,10 @@ export function runPickerTests() {
|
|
|
84
90
|
expect(el.open).to.be.false;
|
|
85
91
|
});
|
|
86
92
|
it("accepts new selected item content", async () => {
|
|
87
|
-
await nextFrame();
|
|
88
|
-
await nextFrame();
|
|
89
93
|
const option2 = el.querySelector('[value="option-2"');
|
|
90
94
|
el.value = "option-2";
|
|
91
95
|
await elementUpdated(option2);
|
|
92
96
|
await elementUpdated(el);
|
|
93
|
-
await aTimeout(150);
|
|
94
97
|
expect(el.value).to.equal("option-2");
|
|
95
98
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
96
99
|
"Select Inverse"
|
|
@@ -111,11 +114,9 @@ export function runPickerTests() {
|
|
|
111
114
|
expect((el.button.textContent || "").trim()).to.equal(newLabel2);
|
|
112
115
|
});
|
|
113
116
|
it("accepts new selected item content when open", async () => {
|
|
114
|
-
await nextFrame();
|
|
115
117
|
const option2 = el.querySelector('[value="option-2"');
|
|
116
118
|
el.value = "option-2";
|
|
117
119
|
await elementUpdated(el);
|
|
118
|
-
await aTimeout(150);
|
|
119
120
|
expect(el.value).to.equal("option-2");
|
|
120
121
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
121
122
|
"Select Inverse"
|
|
@@ -136,10 +137,8 @@ export function runPickerTests() {
|
|
|
136
137
|
);
|
|
137
138
|
});
|
|
138
139
|
it("unsets value when children removed", async () => {
|
|
139
|
-
await nextFrame();
|
|
140
140
|
el.value = "option-2";
|
|
141
141
|
await elementUpdated(el);
|
|
142
|
-
await aTimeout(150);
|
|
143
142
|
expect(el.value).to.equal("option-2");
|
|
144
143
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
145
144
|
"Select Inverse"
|
|
@@ -153,14 +152,8 @@ export function runPickerTests() {
|
|
|
153
152
|
});
|
|
154
153
|
await Promise.all(removals);
|
|
155
154
|
await elementUpdated(el);
|
|
156
|
-
await nextFrame();
|
|
157
|
-
await aTimeout(150);
|
|
158
|
-
expect(el.optionsMenu.childItems.length).to.equal(0);
|
|
159
|
-
if ("showPopover" in document.createElement("div")) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
expect((el.button.textContent || "").trim()).to.equal("");
|
|
163
155
|
expect(el.value).to.equal("");
|
|
156
|
+
expect((el.button.textContent || "").trim()).to.equal("");
|
|
164
157
|
});
|
|
165
158
|
it("accepts a new item and value at the same time", async () => {
|
|
166
159
|
el.value = "option-2";
|
|
@@ -183,7 +176,7 @@ export function runPickerTests() {
|
|
|
183
176
|
item.value = "option-new";
|
|
184
177
|
item.textContent = "New Option";
|
|
185
178
|
el.append(item);
|
|
186
|
-
await
|
|
179
|
+
await elementUpdated(item);
|
|
187
180
|
await elementUpdated(el);
|
|
188
181
|
let opened = oneEvent(el, "sp-opened");
|
|
189
182
|
el.open = true;
|
|
@@ -201,7 +194,6 @@ export function runPickerTests() {
|
|
|
201
194
|
expect(el.value, "second time").to.equal("option-new");
|
|
202
195
|
});
|
|
203
196
|
it('manages its "name" value in the accessibility tree', async () => {
|
|
204
|
-
await nextFrame();
|
|
205
197
|
let snapshot = await a11ySnapshot({});
|
|
206
198
|
expect(
|
|
207
199
|
findAccessibilityNode(
|
|
@@ -212,8 +204,6 @@ export function runPickerTests() {
|
|
|
212
204
|
).to.not.be.null;
|
|
213
205
|
el.value = "option-2";
|
|
214
206
|
await elementUpdated(el);
|
|
215
|
-
await nextFrame();
|
|
216
|
-
await nextFrame();
|
|
217
207
|
snapshot = await a11ySnapshot({});
|
|
218
208
|
expect(
|
|
219
209
|
findAccessibilityNode(
|
|
@@ -250,7 +240,6 @@ export function runPickerTests() {
|
|
|
250
240
|
await expect(el).to.be.accessible();
|
|
251
241
|
});
|
|
252
242
|
it("opens with visible focus on a menu item on `DownArrow`", async () => {
|
|
253
|
-
var _a, _b;
|
|
254
243
|
const firstItem = el.querySelector("sp-menu-item");
|
|
255
244
|
await elementUpdated(el);
|
|
256
245
|
expect(firstItem.focused, "should not visually focused").to.be.false;
|
|
@@ -269,24 +258,12 @@ export function runPickerTests() {
|
|
|
269
258
|
});
|
|
270
259
|
await closed;
|
|
271
260
|
expect(el.open).to.be.false;
|
|
272
|
-
|
|
273
|
-
document.activeElement === el,
|
|
274
|
-
`focused ${(_a = document.activeElement) == null ? void 0 : _a.localName} instead of back on Picker`
|
|
275
|
-
).to.be.true;
|
|
276
|
-
expect(
|
|
277
|
-
el.shadowRoot.activeElement === el.button,
|
|
278
|
-
`focused ${(_b = el.shadowRoot.activeElement) == null ? void 0 : _b.localName} instead of back on button`
|
|
279
|
-
).to.be.true;
|
|
280
|
-
await waitUntil(
|
|
281
|
-
() => !firstItem.focused,
|
|
282
|
-
"finally, not visually focused"
|
|
283
|
-
);
|
|
261
|
+
await waitUntil(() => !firstItem.focused, "not visually focused");
|
|
284
262
|
});
|
|
285
|
-
it("opens
|
|
286
|
-
await nextFrame();
|
|
287
|
-
await nextFrame();
|
|
263
|
+
it("opens without visible focus on a menu item on click", async () => {
|
|
288
264
|
const firstItem = el.querySelector("sp-menu-item");
|
|
289
|
-
|
|
265
|
+
await elementUpdated(el);
|
|
266
|
+
const boundingRect = el.getBoundingClientRect();
|
|
290
267
|
expect(firstItem.focused, "not visually focused").to.be.false;
|
|
291
268
|
const opened = oneEvent(el, "sp-opened");
|
|
292
269
|
sendMouse({
|
|
@@ -301,69 +278,10 @@ export function runPickerTests() {
|
|
|
301
278
|
]
|
|
302
279
|
});
|
|
303
280
|
await opened;
|
|
281
|
+
await elementUpdated(el);
|
|
304
282
|
expect(el.open).to.be.true;
|
|
305
283
|
expect(firstItem.focused, "still not visually focused").to.be.false;
|
|
306
284
|
});
|
|
307
|
-
it("opens/closes multiple times", async () => {
|
|
308
|
-
expect(el.open).to.be.false;
|
|
309
|
-
const boundingRect = el.button.getBoundingClientRect();
|
|
310
|
-
let opened = oneEvent(el, "sp-opened");
|
|
311
|
-
sendMouse({
|
|
312
|
-
steps: [
|
|
313
|
-
{
|
|
314
|
-
type: "click",
|
|
315
|
-
position: [
|
|
316
|
-
boundingRect.x + boundingRect.width / 2,
|
|
317
|
-
boundingRect.y + boundingRect.height / 2
|
|
318
|
-
]
|
|
319
|
-
}
|
|
320
|
-
]
|
|
321
|
-
});
|
|
322
|
-
await opened;
|
|
323
|
-
expect(el.open).to.be.true;
|
|
324
|
-
let closed = oneEvent(el, "sp-closed");
|
|
325
|
-
sendMouse({
|
|
326
|
-
steps: [
|
|
327
|
-
{
|
|
328
|
-
type: "click",
|
|
329
|
-
position: [
|
|
330
|
-
boundingRect.x + boundingRect.width / 2,
|
|
331
|
-
boundingRect.y + boundingRect.height / 2
|
|
332
|
-
]
|
|
333
|
-
}
|
|
334
|
-
]
|
|
335
|
-
});
|
|
336
|
-
await closed;
|
|
337
|
-
expect(el.open).to.be.false;
|
|
338
|
-
opened = oneEvent(el, "sp-opened");
|
|
339
|
-
sendMouse({
|
|
340
|
-
steps: [
|
|
341
|
-
{
|
|
342
|
-
type: "click",
|
|
343
|
-
position: [
|
|
344
|
-
boundingRect.x + boundingRect.width / 2,
|
|
345
|
-
boundingRect.y + boundingRect.height / 2
|
|
346
|
-
]
|
|
347
|
-
}
|
|
348
|
-
]
|
|
349
|
-
});
|
|
350
|
-
await opened;
|
|
351
|
-
expect(el.open).to.be.true;
|
|
352
|
-
closed = oneEvent(el, "sp-closed");
|
|
353
|
-
sendMouse({
|
|
354
|
-
steps: [
|
|
355
|
-
{
|
|
356
|
-
type: "click",
|
|
357
|
-
position: [
|
|
358
|
-
boundingRect.x + boundingRect.width / 2,
|
|
359
|
-
boundingRect.y + boundingRect.height / 2
|
|
360
|
-
]
|
|
361
|
-
}
|
|
362
|
-
]
|
|
363
|
-
});
|
|
364
|
-
await closed;
|
|
365
|
-
expect(el.open).to.be.false;
|
|
366
|
-
});
|
|
367
285
|
it("closes when becoming disabled", async () => {
|
|
368
286
|
expect(el.open).to.be.false;
|
|
369
287
|
el.click();
|
|
@@ -379,15 +297,11 @@ export function runPickerTests() {
|
|
|
379
297
|
document.body.append(other);
|
|
380
298
|
await elementUpdated(el);
|
|
381
299
|
expect(el.open).to.be.false;
|
|
382
|
-
const opened = oneEvent(el, "sp-opened");
|
|
383
300
|
el.click();
|
|
384
|
-
await opened;
|
|
385
301
|
await elementUpdated(el);
|
|
386
302
|
expect(el.open).to.be.true;
|
|
387
|
-
const closed = oneEvent(el, "sp-closed");
|
|
388
303
|
other.click();
|
|
389
|
-
closed;
|
|
390
|
-
await elementUpdated(el);
|
|
304
|
+
await waitUntil(() => !el.open, "closed");
|
|
391
305
|
other.remove();
|
|
392
306
|
});
|
|
393
307
|
it("selects", async () => {
|
|
@@ -399,6 +313,7 @@ export function runPickerTests() {
|
|
|
399
313
|
const opened = oneEvent(el, "sp-opened");
|
|
400
314
|
button.click();
|
|
401
315
|
await opened;
|
|
316
|
+
await elementUpdated(el);
|
|
402
317
|
expect(el.open).to.be.true;
|
|
403
318
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
404
319
|
expect(el.value).to.equal("");
|
|
@@ -418,27 +333,31 @@ export function runPickerTests() {
|
|
|
418
333
|
"sp-menu-item:nth-of-type(2)"
|
|
419
334
|
);
|
|
420
335
|
const button = el.button;
|
|
421
|
-
|
|
336
|
+
const opened = oneEvent(el, "sp-opened");
|
|
422
337
|
button.click();
|
|
423
338
|
await opened;
|
|
339
|
+
await nextFrame();
|
|
424
340
|
expect(el.open).to.be.true;
|
|
425
341
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
426
342
|
expect(el.value).to.equal("");
|
|
427
|
-
|
|
343
|
+
const closed = oneEvent(el, "sp-closed");
|
|
428
344
|
secondItem.click();
|
|
429
345
|
await closed;
|
|
346
|
+
await nextFrame();
|
|
430
347
|
expect(el.open).to.be.false;
|
|
431
348
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Select Inverse");
|
|
432
349
|
expect(el.value).to.equal("option-2");
|
|
433
|
-
|
|
350
|
+
const opened2 = oneEvent(el, "sp-opened");
|
|
434
351
|
button.click();
|
|
435
|
-
await
|
|
352
|
+
await opened2;
|
|
353
|
+
await nextFrame();
|
|
436
354
|
expect(el.open).to.be.true;
|
|
437
355
|
expect((_c = el.selectedItem) == null ? void 0 : _c.itemText).to.equal("Select Inverse");
|
|
438
356
|
expect(el.value).to.equal("option-2");
|
|
439
|
-
|
|
357
|
+
const closed2 = oneEvent(el, "sp-closed");
|
|
440
358
|
firstItem.click();
|
|
441
|
-
await
|
|
359
|
+
await closed2;
|
|
360
|
+
await nextFrame();
|
|
442
361
|
expect(el.open).to.be.false;
|
|
443
362
|
expect((_d = el.selectedItem) == null ? void 0 : _d.itemText).to.equal("Deselect");
|
|
444
363
|
expect(el.value).to.equal("Deselect");
|
|
@@ -446,6 +365,7 @@ export function runPickerTests() {
|
|
|
446
365
|
it("dispatches bubbling and composed events", async () => {
|
|
447
366
|
const changeSpy = spy();
|
|
448
367
|
const parent = el.parentElement;
|
|
368
|
+
parent.attachShadow({ mode: "open" });
|
|
449
369
|
parent.shadowRoot.append(el);
|
|
450
370
|
const secondItem = el.querySelector(
|
|
451
371
|
"sp-menu-item:nth-of-type(2)"
|
|
@@ -455,9 +375,11 @@ export function runPickerTests() {
|
|
|
455
375
|
const opened = oneEvent(el, "sp-opened");
|
|
456
376
|
el.open = true;
|
|
457
377
|
await opened;
|
|
378
|
+
await elementUpdated(el);
|
|
458
379
|
const closed = oneEvent(el, "sp-closed");
|
|
459
380
|
secondItem.click();
|
|
460
381
|
await closed;
|
|
382
|
+
await elementUpdated(el);
|
|
461
383
|
expect(el.value).to.equal(secondItem.value);
|
|
462
384
|
expect(changeSpy.calledOnce).to.be.true;
|
|
463
385
|
});
|
|
@@ -468,9 +390,10 @@ export function runPickerTests() {
|
|
|
468
390
|
"sp-menu-item:nth-of-type(2)"
|
|
469
391
|
);
|
|
470
392
|
const button = el.button;
|
|
471
|
-
|
|
393
|
+
let opened = oneEvent(el, "sp-opened");
|
|
472
394
|
button.click();
|
|
473
395
|
await opened;
|
|
396
|
+
await elementUpdated(el);
|
|
474
397
|
expect(el.open).to.be.true;
|
|
475
398
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
476
399
|
expect(el.value).to.equal("");
|
|
@@ -479,12 +402,14 @@ export function runPickerTests() {
|
|
|
479
402
|
event.preventDefault();
|
|
480
403
|
preventChangeSpy();
|
|
481
404
|
});
|
|
405
|
+
const closed = oneEvent(el, "sp-closed");
|
|
406
|
+
opened = oneEvent(el, "sp-opened");
|
|
482
407
|
secondItem.click();
|
|
483
|
-
await
|
|
484
|
-
await
|
|
408
|
+
await closed;
|
|
409
|
+
await opened;
|
|
410
|
+
await elementUpdated(el);
|
|
485
411
|
expect(preventChangeSpy.calledOnce).to.be.true;
|
|
486
412
|
expect(secondItem.selected, "selection prevented").to.be.false;
|
|
487
|
-
expect(el.open).to.be.true;
|
|
488
413
|
});
|
|
489
414
|
it("can throw focus after `change`", async () => {
|
|
490
415
|
var _a;
|
|
@@ -527,17 +452,20 @@ export function runPickerTests() {
|
|
|
527
452
|
button.dispatchEvent(tEvent());
|
|
528
453
|
await elementUpdated(el);
|
|
529
454
|
expect(el.open, "still closed").to.be.false;
|
|
530
|
-
const opened = oneEvent(el, "sp-opened");
|
|
531
455
|
button.dispatchEvent(arrowUpEvent());
|
|
532
456
|
await elementUpdated(el);
|
|
533
457
|
expect(el.open, "open by ArrowUp").to.be.true;
|
|
534
|
-
await
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
await
|
|
540
|
-
|
|
458
|
+
await waitUntil(
|
|
459
|
+
() => document.querySelector("active-overlay") !== null,
|
|
460
|
+
"an active-overlay has been inserted on the page"
|
|
461
|
+
);
|
|
462
|
+
button.dispatchEvent(escapeEvent());
|
|
463
|
+
await elementUpdated(el);
|
|
464
|
+
await waitUntil(() => el.open === false, "closed by Escape");
|
|
465
|
+
await waitUntil(
|
|
466
|
+
() => document.querySelector("active-overlay") === null,
|
|
467
|
+
"an active-overlay has been inserted on the page"
|
|
468
|
+
);
|
|
541
469
|
});
|
|
542
470
|
it("opens on ArrowDown", async () => {
|
|
543
471
|
var _a, _b;
|
|
@@ -551,18 +479,19 @@ export function runPickerTests() {
|
|
|
551
479
|
const opened = oneEvent(el, "sp-opened");
|
|
552
480
|
button.dispatchEvent(arrowDownEvent());
|
|
553
481
|
await opened;
|
|
482
|
+
await elementUpdated(el);
|
|
554
483
|
expect(el.open, "open by ArrowDown").to.be.true;
|
|
555
484
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
556
485
|
expect(el.value).to.equal("");
|
|
557
486
|
const closed = oneEvent(el, "sp-closed");
|
|
558
487
|
firstItem.click();
|
|
559
488
|
await closed;
|
|
489
|
+
await elementUpdated(el);
|
|
560
490
|
expect(el.open).to.be.false;
|
|
561
491
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Deselect");
|
|
562
492
|
expect(el.value).to.equal("Deselect");
|
|
563
493
|
});
|
|
564
494
|
it("quick selects on ArrowLeft/Right", async () => {
|
|
565
|
-
await nextFrame();
|
|
566
495
|
const selectionSpy = spy();
|
|
567
496
|
el.addEventListener("change", (event) => {
|
|
568
497
|
const { value } = event.target;
|
|
@@ -590,7 +519,6 @@ export function runPickerTests() {
|
|
|
590
519
|
expect(selectionSpy.calledWith("Make Work Path")).to.be.false;
|
|
591
520
|
});
|
|
592
521
|
it("quick selects first item on ArrowRight when no value", async () => {
|
|
593
|
-
await nextFrame();
|
|
594
522
|
const selectionSpy = spy();
|
|
595
523
|
el.addEventListener("change", (event) => {
|
|
596
524
|
const { value } = event.target;
|
|
@@ -608,10 +536,6 @@ export function runPickerTests() {
|
|
|
608
536
|
});
|
|
609
537
|
it("refocuses on list when open", async () => {
|
|
610
538
|
const firstItem = el.querySelector("sp-menu-item");
|
|
611
|
-
const thirdItem = el.querySelector(
|
|
612
|
-
"sp-menu-item:nth-of-type(3)"
|
|
613
|
-
);
|
|
614
|
-
const button = el.button;
|
|
615
539
|
const input = document.createElement("input");
|
|
616
540
|
el.insertAdjacentElement("afterend", input);
|
|
617
541
|
el.focus();
|
|
@@ -619,41 +543,44 @@ export function runPickerTests() {
|
|
|
619
543
|
expect(document.activeElement === input).to.be.true;
|
|
620
544
|
await sendKeys({ press: "Shift+Tab" });
|
|
621
545
|
expect(document.activeElement === el).to.be.true;
|
|
546
|
+
await sendKeys({ press: "Enter" });
|
|
622
547
|
const opened = oneEvent(el, "sp-opened");
|
|
623
|
-
|
|
548
|
+
el.open = true;
|
|
624
549
|
await opened;
|
|
625
550
|
await elementUpdated(el);
|
|
626
551
|
await waitUntil(
|
|
627
552
|
() => firstItem.focused,
|
|
628
553
|
"The first items should have become focused visually."
|
|
629
554
|
);
|
|
630
|
-
|
|
631
|
-
await
|
|
632
|
-
expect(
|
|
633
|
-
button.focus();
|
|
634
|
-
expect(isMenuActiveElement(el)).to.be.false;
|
|
555
|
+
el.blur();
|
|
556
|
+
await elementUpdated(el);
|
|
557
|
+
expect(el.open).to.be.true;
|
|
635
558
|
el.focus();
|
|
636
559
|
await elementUpdated(el);
|
|
637
560
|
await waitUntil(
|
|
638
|
-
() => isMenuActiveElement(
|
|
561
|
+
() => isMenuActiveElement(),
|
|
639
562
|
"first item refocused"
|
|
640
563
|
);
|
|
641
|
-
expect(
|
|
642
|
-
expect(
|
|
564
|
+
expect(el.open).to.be.true;
|
|
565
|
+
expect(isMenuActiveElement()).to.be.true;
|
|
566
|
+
await sendKeys({ press: "ArrowDown" });
|
|
567
|
+
await sendKeys({ press: "ArrowUp" });
|
|
568
|
+
expect(firstItem.focused).to.be.true;
|
|
643
569
|
});
|
|
644
|
-
it("
|
|
645
|
-
const input = document.createElement("input");
|
|
646
|
-
el.insertAdjacentElement("afterend", input);
|
|
647
|
-
const opened = oneEvent(el, "sp-opened");
|
|
570
|
+
it("does not allow tabing to close", async () => {
|
|
648
571
|
el.open = true;
|
|
649
|
-
await
|
|
650
|
-
await nextFrame();
|
|
572
|
+
await elementUpdated(el);
|
|
651
573
|
expect(el.open).to.be.true;
|
|
652
574
|
el.focus();
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
575
|
+
await elementUpdated(el);
|
|
576
|
+
await waitUntil(
|
|
577
|
+
() => isMenuActiveElement(),
|
|
578
|
+
"first item refocused"
|
|
579
|
+
);
|
|
580
|
+
expect(el.open).to.be.true;
|
|
581
|
+
expect(isMenuActiveElement()).to.be.true;
|
|
582
|
+
await sendKeys({ press: "Tab" });
|
|
583
|
+
expect(el.open, "stays open").to.be.true;
|
|
657
584
|
});
|
|
658
585
|
describe("tab order", () => {
|
|
659
586
|
let input1;
|
|
@@ -708,7 +635,51 @@ export function runPickerTests() {
|
|
|
708
635
|
input1
|
|
709
636
|
);
|
|
710
637
|
});
|
|
711
|
-
it(
|
|
638
|
+
it('traps tab in the menu as a `type="modal"` overlay forward', async () => {
|
|
639
|
+
el.focus();
|
|
640
|
+
await nextFrame();
|
|
641
|
+
expect(document.activeElement, "focuses el").to.equal(el);
|
|
642
|
+
const opened = oneEvent(el, "sp-opened");
|
|
643
|
+
sendKeys({ press: "ArrowDown" });
|
|
644
|
+
await opened;
|
|
645
|
+
expect(el.open, "opened").to.be.true;
|
|
646
|
+
await waitUntil(
|
|
647
|
+
() => isMenuActiveElement(),
|
|
648
|
+
"first item focused"
|
|
649
|
+
);
|
|
650
|
+
const activeElement = document.activeElement;
|
|
651
|
+
if (!isWebKit()) {
|
|
652
|
+
const blured = oneEvent(activeElement, "blur");
|
|
653
|
+
sendKeys({ press: "Tab" });
|
|
654
|
+
await blured;
|
|
655
|
+
expect(el.open, "picker still open").to.be.true;
|
|
656
|
+
expect(document.activeElement === input1).to.be.false;
|
|
657
|
+
expect(document.activeElement === input2).to.be.false;
|
|
658
|
+
}
|
|
659
|
+
});
|
|
660
|
+
it('traps tab in the menu as a `type="modal"` overlay backwards', async () => {
|
|
661
|
+
el.focus();
|
|
662
|
+
await nextFrame();
|
|
663
|
+
expect(document.activeElement, "focuses el").to.equal(el);
|
|
664
|
+
const opened = oneEvent(el, "sp-opened");
|
|
665
|
+
await sendKeys({ press: "ArrowDown" });
|
|
666
|
+
await opened;
|
|
667
|
+
expect(el.open, "opened").to.be.true;
|
|
668
|
+
await waitUntil(
|
|
669
|
+
() => isMenuActiveElement(),
|
|
670
|
+
"first item focused"
|
|
671
|
+
);
|
|
672
|
+
const activeElement = document.activeElement;
|
|
673
|
+
if (!isWebKit()) {
|
|
674
|
+
const blured = oneEvent(activeElement, "blur");
|
|
675
|
+
sendKeys({ press: "Shift+Tab" });
|
|
676
|
+
await blured;
|
|
677
|
+
expect(el.open, "picker still open").to.be.true;
|
|
678
|
+
expect(document.activeElement === input1).to.be.false;
|
|
679
|
+
expect(document.activeElement === input2).to.be.false;
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
it("can close and immediate tab to the next tab stop", async () => {
|
|
712
683
|
el.focus();
|
|
713
684
|
await nextFrame();
|
|
714
685
|
expect(document.activeElement, "focuses el").to.equal(el);
|
|
@@ -717,7 +688,7 @@ export function runPickerTests() {
|
|
|
717
688
|
await opened;
|
|
718
689
|
expect(el.open, "opened").to.be.true;
|
|
719
690
|
await waitUntil(
|
|
720
|
-
() => isMenuActiveElement(
|
|
691
|
+
() => isMenuActiveElement(),
|
|
721
692
|
"first item focused"
|
|
722
693
|
);
|
|
723
694
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -734,13 +705,13 @@ export function runPickerTests() {
|
|
|
734
705
|
it("can close and immediate shift+tab to the previous tab stop", async () => {
|
|
735
706
|
el.focus();
|
|
736
707
|
await nextFrame();
|
|
737
|
-
expect(document.activeElement
|
|
708
|
+
expect(document.activeElement, "focuses el").to.equal(el);
|
|
738
709
|
const opened = oneEvent(el, "sp-opened");
|
|
739
710
|
await sendKeys({ press: "ArrowUp" });
|
|
740
711
|
await opened;
|
|
741
712
|
expect(el.open, "opened").to.be.true;
|
|
742
713
|
await waitUntil(
|
|
743
|
-
() => isMenuActiveElement(
|
|
714
|
+
() => isMenuActiveElement(),
|
|
744
715
|
"first item focused"
|
|
745
716
|
);
|
|
746
717
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -749,7 +720,7 @@ export function runPickerTests() {
|
|
|
749
720
|
expect(el.open).to.be.false;
|
|
750
721
|
expect(document.activeElement === el).to.be.true;
|
|
751
722
|
const focused = oneEvent(input1, "focus");
|
|
752
|
-
sendKeys({ press: "Shift+Tab" });
|
|
723
|
+
await sendKeys({ press: "Shift+Tab" });
|
|
753
724
|
await focused;
|
|
754
725
|
expect(el.open).to.be.false;
|
|
755
726
|
expect(document.activeElement === input1).to.be.true;
|
|
@@ -764,7 +735,8 @@ export function runPickerTests() {
|
|
|
764
735
|
expect(el.open).to.be.false;
|
|
765
736
|
});
|
|
766
737
|
it("scrolls selected into view on open", async () => {
|
|
767
|
-
el.
|
|
738
|
+
await el.generatePopover();
|
|
739
|
+
el.popoverEl.style.height = "40px";
|
|
768
740
|
const firstItem = el.querySelector(
|
|
769
741
|
"sp-menu-item:first-child"
|
|
770
742
|
);
|
|
@@ -774,15 +746,11 @@ export function runPickerTests() {
|
|
|
774
746
|
lastItem.disabled = false;
|
|
775
747
|
el.value = lastItem.value;
|
|
776
748
|
await elementUpdated(el);
|
|
777
|
-
const opened = oneEvent(el, "sp-opened");
|
|
778
749
|
el.open = true;
|
|
779
|
-
await
|
|
780
|
-
await waitUntil(
|
|
781
|
-
() => isMenuActiveElement(el),
|
|
782
|
-
"first item focused"
|
|
783
|
-
);
|
|
750
|
+
await elementUpdated(el);
|
|
751
|
+
await waitUntil(() => isMenuActiveElement(), "first item focused");
|
|
784
752
|
const getParentOffset = (el2) => {
|
|
785
|
-
const parentScroll = el2.
|
|
753
|
+
const parentScroll = el2.parentElement.scrollTop;
|
|
786
754
|
const parentOffset = el2.offsetTop - parentScroll;
|
|
787
755
|
return parentOffset;
|
|
788
756
|
};
|
|
@@ -791,9 +759,7 @@ export function runPickerTests() {
|
|
|
791
759
|
lastItem.dispatchEvent(
|
|
792
760
|
new FocusEvent("focusin", { bubbles: true })
|
|
793
761
|
);
|
|
794
|
-
|
|
795
|
-
press: "ArrowDown"
|
|
796
|
-
});
|
|
762
|
+
lastItem.dispatchEvent(arrowDownEvent());
|
|
797
763
|
await elementUpdated(el);
|
|
798
764
|
await nextFrame();
|
|
799
765
|
expect(getParentOffset(lastItem)).to.be.greaterThan(40);
|
|
@@ -831,8 +797,6 @@ export function runPickerTests() {
|
|
|
831
797
|
beforeEach(async () => {
|
|
832
798
|
el = await groupedFixture();
|
|
833
799
|
await elementUpdated(el);
|
|
834
|
-
await nextFrame();
|
|
835
|
-
await nextFrame();
|
|
836
800
|
});
|
|
837
801
|
it("selects the item with a matching value in a group", async () => {
|
|
838
802
|
const item = el.querySelector("#should-be-selected");
|
|
@@ -870,7 +834,6 @@ export function runPickerTests() {
|
|
|
870
834
|
beforeEach(async () => {
|
|
871
835
|
el = await pickerFixture2();
|
|
872
836
|
await elementUpdated(el);
|
|
873
|
-
await nextFrame();
|
|
874
837
|
});
|
|
875
838
|
afterEach(async () => {
|
|
876
839
|
if (el.open) {
|
|
@@ -956,7 +919,6 @@ export function runPickerTests() {
|
|
|
956
919
|
beforeEach(async () => {
|
|
957
920
|
el = await pickerFixture2();
|
|
958
921
|
await elementUpdated(el);
|
|
959
|
-
await nextFrame();
|
|
960
922
|
});
|
|
961
923
|
afterEach(async () => {
|
|
962
924
|
if (el.open) {
|
|
@@ -973,6 +935,7 @@ export function runPickerTests() {
|
|
|
973
935
|
const opened = oneEvent(el, "sp-opened");
|
|
974
936
|
el.button.click();
|
|
975
937
|
await opened;
|
|
938
|
+
await elementUpdated(el);
|
|
976
939
|
expect(el.open).to.be.true;
|
|
977
940
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
978
941
|
expect(el.value).to.equal("");
|
|
@@ -992,7 +955,6 @@ export function runPickerTests() {
|
|
|
992
955
|
`);
|
|
993
956
|
const el2 = test.querySelector("sp-picker");
|
|
994
957
|
await elementUpdated(el2);
|
|
995
|
-
await nextFrame();
|
|
996
958
|
let snapshot = await a11ySnapshot({});
|
|
997
959
|
expect(
|
|
998
960
|
findAccessibilityNode(
|
|
@@ -1003,9 +965,6 @@ export function runPickerTests() {
|
|
|
1003
965
|
).to.not.be.null;
|
|
1004
966
|
el2.value = "2";
|
|
1005
967
|
await elementUpdated(el2);
|
|
1006
|
-
await nextFrame();
|
|
1007
|
-
await nextFrame();
|
|
1008
|
-
expect(el2.value).to.equal("2");
|
|
1009
968
|
snapshot = await a11ySnapshot({});
|
|
1010
969
|
expect(
|
|
1011
970
|
findAccessibilityNode(
|
|
@@ -1018,8 +977,6 @@ export function runPickerTests() {
|
|
|
1018
977
|
it("toggles between pickers", async () => {
|
|
1019
978
|
const el2 = await pickerFixture();
|
|
1020
979
|
const el1 = await pickerFixture();
|
|
1021
|
-
el1.parentElement.style.float = "left";
|
|
1022
|
-
el2.parentElement.style.float = "left";
|
|
1023
980
|
el1.id = "away";
|
|
1024
981
|
el2.id = "other";
|
|
1025
982
|
await Promise.all([elementUpdated(el1), elementUpdated(el2)]);
|
|
@@ -1040,8 +997,8 @@ export function runPickerTests() {
|
|
|
1040
997
|
closed = oneEvent(el2, "sp-closed");
|
|
1041
998
|
el1.click();
|
|
1042
999
|
await Promise.all([open, closed]);
|
|
1043
|
-
expect(el2.open).to.be.false;
|
|
1044
1000
|
expect(el1.open).to.be.true;
|
|
1001
|
+
expect(el2.open).to.be.false;
|
|
1045
1002
|
closed = oneEvent(el1, "sp-closed");
|
|
1046
1003
|
sendKeys({
|
|
1047
1004
|
press: "Escape"
|
|
@@ -1050,7 +1007,7 @@ export function runPickerTests() {
|
|
|
1050
1007
|
expect(el1.open).to.be.false;
|
|
1051
1008
|
});
|
|
1052
1009
|
it("displays selected item text by default", async () => {
|
|
1053
|
-
var _a, _b, _c, _d
|
|
1010
|
+
var _a, _b, _c, _d;
|
|
1054
1011
|
const el2 = await fixture(
|
|
1055
1012
|
html`
|
|
1056
1013
|
<sp-picker
|
|
@@ -1067,7 +1024,6 @@ export function runPickerTests() {
|
|
|
1067
1024
|
</sp-picker>
|
|
1068
1025
|
`
|
|
1069
1026
|
);
|
|
1070
|
-
await nextFrame();
|
|
1071
1027
|
await elementUpdated(el2);
|
|
1072
1028
|
await waitUntil(
|
|
1073
1029
|
() => {
|
|
@@ -1093,14 +1049,11 @@ export function runPickerTests() {
|
|
|
1093
1049
|
const opened = oneEvent(el2, "sp-opened");
|
|
1094
1050
|
sendKeys({ press: "Enter" });
|
|
1095
1051
|
await opened;
|
|
1052
|
+
await elementUpdated(el2.optionsMenu);
|
|
1096
1053
|
expect(
|
|
1097
|
-
el2 === document.activeElement,
|
|
1054
|
+
el2.optionsMenu === document.activeElement,
|
|
1098
1055
|
`activeElement is ${(_d = document.activeElement) == null ? void 0 : _d.localName}`
|
|
1099
1056
|
).to.be.true;
|
|
1100
|
-
expect(
|
|
1101
|
-
el2.optionsMenu === el2.shadowRoot.activeElement,
|
|
1102
|
-
`activeElement is ${(_e = el2.shadowRoot.activeElement) == null ? void 0 : _e.localName}`
|
|
1103
|
-
).to.be.true;
|
|
1104
1057
|
expect(firstItem.focused, 'firstItem NOT "focused"').to.be.false;
|
|
1105
1058
|
expect(secondItem.focused, 'secondItem "focused"').to.be.true;
|
|
1106
1059
|
expect(el2.optionsMenu.getAttribute("aria-activedescendant")).to.equal(
|
|
@@ -1187,11 +1140,15 @@ export function runPickerTests() {
|
|
|
1187
1140
|
await elementUpdated(el2);
|
|
1188
1141
|
expect(openedSpy.calledOnce).to.be.true;
|
|
1189
1142
|
expect(closedSpy.calledOnce).to.be.false;
|
|
1143
|
+
const openedEvent = openedSpy.args[0][0];
|
|
1144
|
+
expect(openedEvent.detail.interaction).to.equal("modal");
|
|
1190
1145
|
const closed = oneEvent(el2, "sp-closed");
|
|
1191
1146
|
el2.open = false;
|
|
1192
1147
|
await closed;
|
|
1193
1148
|
await elementUpdated(el2);
|
|
1194
1149
|
expect(closedSpy.calledOnce).to.be.true;
|
|
1150
|
+
const closedEvent = closedSpy.args[0][0];
|
|
1151
|
+
expect(closedEvent.detail.interaction).to.equal("modal");
|
|
1195
1152
|
});
|
|
1196
1153
|
}
|
|
1197
1154
|
//# sourceMappingURL=index.js.map
|