@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/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/theme/sp-theme.js";
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(el) {
32
+ const isMenuActiveElement = function() {
34
33
  var _a;
35
- return ((_a = el.shadowRoot.activeElement) == null ? void 0 : _a.localName) === "sp-menu";
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
- <sp-theme scale="medium" color="light">
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
- </sp-theme>
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 = el.shadowRoot.querySelector(
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 nextFrame();
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
- expect(
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, on click, without visible focus on a menu item", async () => {
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
- const boundingRect = el.button.getBoundingClientRect();
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
- let opened = oneEvent(el, "sp-opened");
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
- let closed = oneEvent(el, "sp-closed");
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
- opened = oneEvent(el, "sp-opened");
350
+ const opened2 = oneEvent(el, "sp-opened");
434
351
  button.click();
435
- await opened;
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
- closed = oneEvent(el, "sp-closed");
357
+ const closed2 = oneEvent(el, "sp-closed");
440
358
  firstItem.click();
441
- await closed;
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
- const opened = oneEvent(el, "sp-opened");
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 nextFrame();
484
- await nextFrame();
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 opened;
535
- const closed = oneEvent(el, "sp-closed");
536
- sendKeys({
537
- press: "Escape"
538
- });
539
- await closed;
540
- expect(el.open).to.be.false;
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
- sendKeys({ press: "Enter" });
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
- await sendKeys({ press: "ArrowDown" });
631
- await sendKeys({ press: "ArrowDown" });
632
- expect(thirdItem.focused).to.be.true;
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(el),
561
+ () => isMenuActiveElement(),
639
562
  "first item refocused"
640
563
  );
641
- expect(isMenuActiveElement(el)).to.be.true;
642
- expect(thirdItem.focused).to.be.true;
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("allows tabing to close", async () => {
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 opened;
650
- await nextFrame();
572
+ await elementUpdated(el);
651
573
  expect(el.open).to.be.true;
652
574
  el.focus();
653
- const closed = oneEvent(el, "sp-closed");
654
- sendKeys({ press: "Tab" });
655
- await closed;
656
- expect(el.open, "closes").to.be.false;
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("can close and immediately tab to the next tab stop", async () => {
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(el),
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 === el, "focuses el").to.be.true;
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(el),
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.shadowRoot.querySelector("sp-popover").style.height = "40px";
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 opened;
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.assignedSlot.parentElement.scrollTop;
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
- await sendKeys({
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, _e;
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