@spectrum-web-components/action-menu 1.0.1 → 1.0.2

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.
Files changed (34) hide show
  1. package/package.json +8 -9
  2. package/LICENSE +0 -201
  3. package/stories/action-menu-sizes.stories.js +0 -23
  4. package/stories/action-menu-sizes.stories.js.map +0 -7
  5. package/stories/action-menu.stories.js +0 -424
  6. package/stories/action-menu.stories.js.map +0 -7
  7. package/stories/index.js +0 -69
  8. package/stories/index.js.map +0 -7
  9. package/test/action-menu-directive.test.js +0 -29
  10. package/test/action-menu-directive.test.js.map +0 -7
  11. package/test/action-menu-groups.test.js +0 -85
  12. package/test/action-menu-groups.test.js.map +0 -7
  13. package/test/action-menu-memory.test.js +0 -5
  14. package/test/action-menu-memory.test.js.map +0 -7
  15. package/test/action-menu-sizes.test-vrt.js +0 -5
  16. package/test/action-menu-sizes.test-vrt.js.map +0 -7
  17. package/test/action-menu-sync.test.js +0 -9
  18. package/test/action-menu-sync.test.js.map +0 -7
  19. package/test/action-menu.test-vrt.js +0 -5
  20. package/test/action-menu.test-vrt.js.map +0 -7
  21. package/test/action-menu.test.js +0 -9
  22. package/test/action-menu.test.js.map +0 -7
  23. package/test/benchmark/test-basic.js +0 -21
  24. package/test/benchmark/test-basic.js.map +0 -7
  25. package/test/benchmark/test-directive.js +0 -26
  26. package/test/benchmark/test-directive.js.map +0 -7
  27. package/test/benchmark/test-lazy.js +0 -35
  28. package/test/benchmark/test-lazy.js.map +0 -7
  29. package/test/benchmark/test-open-close-directive.js +0 -67
  30. package/test/benchmark/test-open-close-directive.js.map +0 -7
  31. package/test/benchmark/test-open-close.js +0 -62
  32. package/test/benchmark/test-open-close.js.map +0 -7
  33. package/test/index.js +0 -651
  34. package/test/index.js.map +0 -7
package/test/index.js DELETED
@@ -1,651 +0,0 @@
1
- "use strict";
2
- import {
3
- aTimeout,
4
- elementUpdated,
5
- expect,
6
- html,
7
- nextFrame,
8
- oneEvent
9
- } from "@open-wc/testing";
10
- import { testForLitDevWarnings } from "../../../test/testing-helpers";
11
- import { spy } from "sinon";
12
- import {
13
- fixture,
14
- ignoreResizeObserverLoopError
15
- } from "../../../test/testing-helpers.js";
16
- import "@spectrum-web-components/dialog/sp-dialog-base.js";
17
- import {
18
- iconOnly,
19
- tooltipDescriptionAndPlacement
20
- } from "../stories/action-menu.stories.js";
21
- import { findDescribedNode } from "../../../test/testing-helpers-a11y.js";
22
- import { sendMouse } from "../../../test/plugins/browser.js";
23
- import { sendKeys, setViewport } from "@web/test-runner-commands";
24
- import { isWebKit } from "@spectrum-web-components/shared";
25
- import { SAFARI_FOCUS_RING_CLASS } from "@spectrum-web-components/picker/src/MobileController.js";
26
- ignoreResizeObserverLoopError(before, after);
27
- const deprecatedActionMenuFixture = async () => await fixture(html`
28
- <sp-action-menu label="More Actions">
29
- <sp-menu>
30
- <sp-menu-item>Deselect</sp-menu-item>
31
- <sp-menu-item>Select Inverse</sp-menu-item>
32
- <sp-menu-item>Feather...</sp-menu-item>
33
- <sp-menu-item>Select and Mask...</sp-menu-item>
34
- <sp-menu-divider></sp-menu-divider>
35
- <sp-menu-item>Save Selection</sp-menu-item>
36
- <sp-menu-item disabled>Make Work Path</sp-menu-item>
37
- </sp-menu>
38
- </sp-action-menu>
39
- `);
40
- const actionMenuFixture = async () => await fixture(html`
41
- <sp-action-menu label="More Actions">
42
- <sp-menu-item>Deselect</sp-menu-item>
43
- <sp-menu-item>Select Inverse</sp-menu-item>
44
- <sp-menu-item>Feather...</sp-menu-item>
45
- <sp-menu-item>Select and Mask...</sp-menu-item>
46
- <sp-menu-divider></sp-menu-divider>
47
- <sp-menu-item>Save Selection</sp-menu-item>
48
- <sp-menu-item disabled>Make Work Path</sp-menu-item>
49
- </sp-action-menu>
50
- `);
51
- const actionSubmenuFixture = async () => await fixture(html`
52
- <sp-action-menu label="More Actions">
53
- <sp-menu-item>One</sp-menu-item>
54
- <sp-menu-item selected id="root-selected-item">Two</sp-menu-item>
55
- <sp-menu-item id="item-with-submenu">
56
- B should be selected
57
- <sp-menu slot="submenu">
58
- <sp-menu-item>A</sp-menu-item>
59
- <sp-menu-item selected id="sub-selected-item">
60
- B
61
- </sp-menu-item>
62
- <sp-menu-item>C</sp-menu-item>
63
- </sp-menu>
64
- </sp-menu-item>
65
- </sp-action-menu>
66
- `);
67
- export const testActionMenu = (mode) => {
68
- describe(`Action menu: ${mode}`, () => {
69
- testForLitDevWarnings(async () => await actionMenuFixture());
70
- it("loads", async () => {
71
- const el = await actionMenuFixture();
72
- await elementUpdated(el);
73
- expect(el).to.not.be.undefined;
74
- await expect(el).to.be.accessible();
75
- });
76
- it('loads - [slot="label"]', async () => {
77
- const el = await fixture(html`
78
- <sp-action-menu>
79
- <span slot="label">More Actions</span>
80
- <sp-menu-item>Deselect</sp-menu-item>
81
- <sp-menu-item>Select Inverse</sp-menu-item>
82
- <sp-menu-item>Feather...</sp-menu-item>
83
- <sp-menu-item>Select and Mask...</sp-menu-item>
84
- <sp-menu-divider></sp-menu-divider>
85
- <sp-menu-item>Save Selection</sp-menu-item>
86
- <sp-menu-item disabled>Make Work Path</sp-menu-item>
87
- </sp-action-menu>
88
- `);
89
- await elementUpdated(el);
90
- await nextFrame();
91
- await nextFrame();
92
- await expect(el).to.be.accessible();
93
- });
94
- it("loads - [custom icon]", async () => {
95
- const el = await fixture(html`
96
- <sp-action-menu label="More Actions">
97
- <sp-icon-settings slot="icon"></sp-icon-settings>
98
- <sp-menu-item>Deselect</sp-menu-item>
99
- <sp-menu-item>Select Inverse</sp-menu-item>
100
- <sp-menu-item>Feather...</sp-menu-item>
101
- <sp-menu-item>Select and Mask...</sp-menu-item>
102
- <sp-menu-divider></sp-menu-divider>
103
- <sp-menu-item>Save Selection</sp-menu-item>
104
- <sp-menu-item disabled>Make Work Path</sp-menu-item>
105
- </sp-action-menu>
106
- `);
107
- await elementUpdated(el);
108
- await nextFrame();
109
- await nextFrame();
110
- await expect(el).to.be.accessible();
111
- });
112
- it("dispatches change events, no [href]", async () => {
113
- const changeSpy = spy();
114
- const el = await fixture(html`
115
- <sp-action-menu
116
- label="More Actions"
117
- @change=${({
118
- target: { value }
119
- }) => {
120
- changeSpy(value);
121
- }}
122
- >
123
- <sp-icon-settings slot="icon"></sp-icon-settings>
124
- <sp-menu-item>Deselect</sp-menu-item>
125
- <sp-menu-item>Select Inverse</sp-menu-item>
126
- <sp-menu-item>Feather...</sp-menu-item>
127
- <sp-menu-item>Select and Mask...</sp-menu-item>
128
- <sp-menu-divider></sp-menu-divider>
129
- <sp-menu-item>Save Selection</sp-menu-item>
130
- <sp-menu-item disabled>Make Work Path</sp-menu-item>
131
- </sp-action-menu>
132
- `);
133
- expect(changeSpy.callCount).to.equal(0);
134
- expect(el.open).to.be.false;
135
- const menuItem2 = el.querySelector(
136
- "sp-menu-item:nth-child(2)"
137
- );
138
- const opened = oneEvent(el, "sp-opened");
139
- el.click();
140
- await elementUpdated(el);
141
- await opened;
142
- expect(el.open).to.be.true;
143
- const closed = oneEvent(el, "sp-closed");
144
- menuItem2.click();
145
- await closed;
146
- expect(el.open).to.be.false;
147
- expect(changeSpy.callCount).to.equal(1);
148
- expect(changeSpy.calledWith("Deselect")).to.be.true;
149
- });
150
- it("closes when Menu Item has [href]", async () => {
151
- const changeSpy = spy();
152
- const el = await fixture(html`
153
- <sp-action-menu
154
- label="More Actions"
155
- @change=${() => {
156
- changeSpy();
157
- }}
158
- >
159
- <sp-icon-settings slot="icon"></sp-icon-settings>
160
- <sp-menu-item href="#">Deselect</sp-menu-item>
161
- <sp-menu-item href="#">Select Inverse</sp-menu-item>
162
- <sp-menu-item href="#">Feather...</sp-menu-item>
163
- <sp-menu-item href="#">Select and Mask...</sp-menu-item>
164
- <sp-menu-divider></sp-menu-divider>
165
- <sp-menu-item href="#">Save Selection</sp-menu-item>
166
- <sp-menu-item href="#" disabled>
167
- Make Work Path
168
- </sp-menu-item>
169
- </sp-action-menu>
170
- `);
171
- expect(changeSpy.callCount).to.equal(0);
172
- expect(el.open).to.be.false;
173
- const menuItem2 = el.querySelector(
174
- "sp-menu-item:nth-child(2)"
175
- );
176
- const opened = oneEvent(el, "sp-opened");
177
- el.click();
178
- await opened;
179
- expect(el.open).to.be.true;
180
- const closed = oneEvent(el, "sp-closed");
181
- menuItem2.click();
182
- await closed;
183
- expect(el.open).to.be.false;
184
- expect(changeSpy.callCount).to.equal(0);
185
- });
186
- it("can be `quiet`", async () => {
187
- const el = await actionMenuFixture();
188
- expect(el.quiet).to.be.false;
189
- el.quiet = true;
190
- await elementUpdated(el);
191
- expect(el.quiet).to.be.true;
192
- });
193
- it("can be `staticColor`", async () => {
194
- const el = await actionMenuFixture();
195
- expect(el.staticColor == void 0).to.be.true;
196
- el.staticColor = "black";
197
- await elementUpdated(el);
198
- expect(el.staticColor == "black").to.be.true;
199
- el.staticColor = "white";
200
- await elementUpdated(el);
201
- expect(el.staticColor == "white").to.be.true;
202
- });
203
- it("stay `valid`", async () => {
204
- const el = await actionMenuFixture();
205
- expect(el.invalid).to.be.false;
206
- el.invalid = true;
207
- await elementUpdated(el);
208
- expect(el.invalid).to.be.false;
209
- });
210
- it("focus()", async () => {
211
- const el = await actionMenuFixture();
212
- el.focus();
213
- expect(document.activeElement).to.equal(el);
214
- expect(el.shadowRoot.activeElement).to.equal(el.focusElement);
215
- const opened = oneEvent(el, "sp-opened");
216
- el.open = true;
217
- await opened;
218
- const closed = oneEvent(el, "sp-closed");
219
- el.open = false;
220
- await closed;
221
- expect(document.activeElement).to.equal(el);
222
- expect(el.shadowRoot.activeElement).to.equal(el.focusElement);
223
- });
224
- it("manages focus-ring styles", async () => {
225
- if (!isWebKit()) {
226
- return;
227
- }
228
- const el = await actionMenuFixture();
229
- el.isMobile.matches = true;
230
- el.bindEvents();
231
- await setViewport({ width: 360, height: 640 });
232
- await nextFrame();
233
- let opened = oneEvent(el, "sp-opened");
234
- const boundingRect = el.button.getBoundingClientRect();
235
- sendMouse({
236
- steps: [
237
- {
238
- type: "click",
239
- position: [
240
- boundingRect.x + boundingRect.width / 2,
241
- boundingRect.y + boundingRect.height / 2
242
- ]
243
- }
244
- ]
245
- });
246
- await opened;
247
- const tray = el.shadowRoot.querySelector("sp-tray");
248
- expect(tray).to.not.be.null;
249
- let closed = oneEvent(el, "sp-closed");
250
- const firstItem = el.querySelector("sp-menu-item");
251
- firstItem.click();
252
- await elementUpdated(el);
253
- await closed;
254
- expect(el.open).to.be.false;
255
- const button = el.shadowRoot.querySelector(
256
- "#button"
257
- );
258
- expect(button).to.not.be.null;
259
- expect(button.classList.contains(SAFARI_FOCUS_RING_CLASS)).to.be.true;
260
- expect(document.activeElement === el).to.be.true;
261
- await sendMouse({
262
- steps: [
263
- {
264
- type: "click",
265
- position: [0, 0]
266
- }
267
- ]
268
- });
269
- expect(document.activeElement === el).to.be.false;
270
- opened = oneEvent(el, "sp-opened");
271
- await sendKeys({
272
- press: "Tab"
273
- });
274
- await sendKeys({
275
- press: "Enter"
276
- });
277
- await elementUpdated(el);
278
- await opened;
279
- closed = oneEvent(el, "sp-closed");
280
- firstItem.click();
281
- await elementUpdated(el);
282
- await closed;
283
- expect(el.open).to.be.false;
284
- expect(button.classList.contains(SAFARI_FOCUS_RING_CLASS)).to.be.false;
285
- });
286
- it("opens unmeasured", async () => {
287
- const el = await actionMenuFixture();
288
- const button = el.button;
289
- expect(button).to.have.attribute("aria-haspopup", "true");
290
- expect(button).to.not.have.attribute("aria-expanded", "true");
291
- expect(button).to.not.have.attribute("aria-controls", "menu");
292
- el.click();
293
- await elementUpdated(el);
294
- expect(el.open).to.be.true;
295
- expect(button).to.have.attribute("aria-haspopup", "true");
296
- expect(button).to.have.attribute("aria-expanded", "true");
297
- expect(button).to.have.attribute("aria-controls", "menu");
298
- });
299
- it("opens repeatedly with Menu in the correct location", async function() {
300
- const el = await fixture(
301
- iconOnly({
302
- ...iconOnly.args,
303
- align: "end"
304
- })
305
- );
306
- await elementUpdated(el);
307
- el.focus();
308
- await elementUpdated(el);
309
- let opened = oneEvent(el, "sp-opened");
310
- await sendKeys({ press: "ArrowRight" });
311
- await sendKeys({ press: "ArrowLeft" });
312
- await sendKeys({ press: "Space" });
313
- await opened;
314
- const firstRect = el.overlayElement.dialogEl.getBoundingClientRect();
315
- let closed = oneEvent(el, "sp-closed");
316
- await sendKeys({ press: "Space" });
317
- await closed;
318
- opened = oneEvent(el, "sp-opened");
319
- await sendKeys({ press: "Space" });
320
- await opened;
321
- const secondRect = el.overlayElement.dialogEl.getBoundingClientRect();
322
- closed = oneEvent(el, "sp-closed");
323
- await sendKeys({ press: "Space" });
324
- await closed;
325
- expect(firstRect).to.deep.equal(secondRect);
326
- });
327
- it("opens and selects in a single pointer button interaction", async () => {
328
- const el = await actionMenuFixture();
329
- const thirdItem = el.querySelector(
330
- "sp-menu-item:nth-of-type(3)"
331
- );
332
- const boundingRect = el.button.getBoundingClientRect();
333
- expect(el.value).to.not.equal(thirdItem.value);
334
- const opened = oneEvent(el, "sp-opened");
335
- await sendMouse({
336
- steps: [
337
- {
338
- type: "move",
339
- position: [
340
- boundingRect.x + boundingRect.width / 2,
341
- boundingRect.y + boundingRect.height / 2
342
- ]
343
- },
344
- {
345
- type: "down"
346
- }
347
- ]
348
- });
349
- await opened;
350
- const thirdItemRect = thirdItem.getBoundingClientRect();
351
- const closed = oneEvent(el, "sp-closed");
352
- let selected = "";
353
- el.addEventListener("change", (event) => {
354
- selected = event.target.value;
355
- });
356
- await sendMouse({
357
- steps: [
358
- {
359
- type: "move",
360
- position: [
361
- thirdItemRect.x + thirdItemRect.width / 2,
362
- thirdItemRect.y + thirdItemRect.height / 2
363
- ]
364
- },
365
- {
366
- type: "up"
367
- }
368
- ]
369
- });
370
- await closed;
371
- expect(el.open).to.be.false;
372
- expect(selected).to.equal(thirdItem.value);
373
- });
374
- it("has attribute aria-describedby", async () => {
375
- const name = "sp-picker";
376
- const description = "Rendering a Picker";
377
- const el = await fixture(html`
378
- <sp-action-menu label=${name}>
379
- <sp-menu-item>Select Inverse</sp-menu-item>
380
- <sp-menu-item>Feather...</sp-menu-item>
381
- <span slot="description">${description}</span>
382
- </sp-action-menu>
383
- `);
384
- await elementUpdated(el);
385
- await findDescribedNode(name, description);
386
- });
387
- it("opens unmeasured with deprecated syntax", async () => {
388
- const el = await deprecatedActionMenuFixture();
389
- el.click();
390
- await elementUpdated(el);
391
- expect(el.open).to.be.true;
392
- });
393
- it("toggles open/close multiple time", async () => {
394
- const el = await actionMenuFixture();
395
- await elementUpdated(el);
396
- const button = el.button;
397
- expect(button).to.have.attribute("aria-haspopup", "true");
398
- expect(button).to.have.attribute("aria-expanded", "false");
399
- expect(button).not.to.have.attribute("aria-controls");
400
- let opened = oneEvent(el, "sp-opened");
401
- el.open = true;
402
- await opened;
403
- expect(el.open).to.be.true;
404
- expect(button).to.have.attribute("aria-expanded", "true");
405
- expect(button).to.have.attribute("aria-controls", "menu");
406
- let closed = oneEvent(el, "sp-closed");
407
- el.open = false;
408
- await closed;
409
- expect(el.open).to.be.false;
410
- expect(button).to.have.attribute("aria-expanded", "false");
411
- expect(button).not.to.have.attribute("aria-controls");
412
- opened = oneEvent(el, "sp-opened");
413
- el.open = true;
414
- await opened;
415
- expect(el.open).to.be.true;
416
- expect(button).to.have.attribute("aria-expanded", "true");
417
- expect(button).to.have.attribute("aria-controls", "menu");
418
- closed = oneEvent(el, "sp-closed");
419
- el.open = false;
420
- await closed;
421
- expect(el.open).to.be.false;
422
- expect(button).to.have.attribute("aria-expanded", "false");
423
- expect(button).not.to.have.attribute("aria-controls");
424
- });
425
- it("allows submenu items to be selected", async () => {
426
- const root = await actionSubmenuFixture();
427
- const menuItem = root.querySelector("#item-with-submenu");
428
- const submenu = menuItem.querySelector(
429
- 'sp-menu[slot="submenu"]'
430
- );
431
- const selectedItem = submenu.querySelector(
432
- "#sub-selected-item"
433
- );
434
- expect(selectedItem.selected, "item should be initially selected").to.be.true;
435
- let opened = oneEvent(root, "sp-opened");
436
- root.click();
437
- await opened;
438
- expect(root.open).to.be.true;
439
- opened = oneEvent(menuItem, "sp-opened");
440
- menuItem.dispatchEvent(
441
- new PointerEvent("pointerenter", { bubbles: true })
442
- );
443
- await opened;
444
- await elementUpdated(submenu);
445
- expect(
446
- selectedItem.selected,
447
- "initially selected item should maintain selection"
448
- ).to.be.true;
449
- });
450
- it("allows top-level selection state to change", async () => {
451
- let selected = true;
452
- const handleChange = (event) => {
453
- if (event.target.value === "test") {
454
- selected = !selected;
455
- event.target.updateComplete.then(() => {
456
- event.target.value = selected ? "test" : "";
457
- });
458
- }
459
- };
460
- const root = await fixture(html`
461
- <sp-action-menu label="More Actions" @change=${handleChange}>
462
- <sp-menu-item>One</sp-menu-item>
463
- <sp-menu-item selected value="test" id="root-selected-item">
464
- Two
465
- </sp-menu-item>
466
- <sp-menu-item id="item-with-submenu">
467
- B should be selected
468
- <sp-menu slot="submenu">
469
- <sp-menu-item>A</sp-menu-item>
470
- <sp-menu-item selected id="sub-selected-item">
471
- B
472
- </sp-menu-item>
473
- <sp-menu-item>C</sp-menu-item>
474
- </sp-menu>
475
- </sp-menu-item>
476
- </sp-action-menu>
477
- `);
478
- const unselectedItem = root.querySelector(
479
- "sp-menu-item"
480
- );
481
- const selectedItem = root.querySelector(
482
- "#root-selected-item"
483
- );
484
- expect(unselectedItem.textContent).to.include("One");
485
- expect(unselectedItem.selected).to.be.false;
486
- expect(selectedItem.textContent).to.include("Two");
487
- expect(selectedItem.selected).to.be.true;
488
- let opened = oneEvent(root, "sp-opened");
489
- root.click();
490
- await opened;
491
- let closed = oneEvent(root, "sp-closed");
492
- selectedItem.click();
493
- await closed;
494
- expect(root.open).to.be.false;
495
- opened = oneEvent(root, "sp-opened");
496
- root.click();
497
- await opened;
498
- closed = oneEvent(root, "sp-closed");
499
- unselectedItem.click();
500
- await closed;
501
- opened = oneEvent(root, "sp-opened");
502
- root.click();
503
- await opened;
504
- expect(unselectedItem.textContent).to.include("One");
505
- expect(unselectedItem.selected).to.be.false;
506
- expect(selectedItem.textContent).to.include("Two");
507
- expect(selectedItem.selected).to.be.false;
508
- closed = oneEvent(root, "sp-closed");
509
- selectedItem.click();
510
- await closed;
511
- opened = oneEvent(root, "sp-opened");
512
- root.click();
513
- await opened;
514
- expect(unselectedItem.textContent).to.include("One");
515
- expect(unselectedItem.selected).to.be.false;
516
- expect(selectedItem.textContent).to.include("Two");
517
- expect(selectedItem.selected).to.be.true;
518
- });
519
- it("shows tooltip", async function() {
520
- const openSpy = spy();
521
- const el = await fixture(
522
- tooltipDescriptionAndPlacement(
523
- tooltipDescriptionAndPlacement.args
524
- )
525
- );
526
- const tooltip = el.querySelector("sp-tooltip");
527
- const rect = el.getBoundingClientRect();
528
- tooltip.addEventListener("sp-opened", () => openSpy());
529
- await elementUpdated(tooltip);
530
- await nextFrame();
531
- await nextFrame();
532
- const overlay = tooltip.shadowRoot.querySelector(
533
- "sp-overlay"
534
- );
535
- await elementUpdated(overlay);
536
- expect(overlay.triggerElement === el.button).to.be.true;
537
- let open = oneEvent(tooltip, "sp-opened");
538
- await sendMouse({
539
- steps: [
540
- {
541
- position: [
542
- rect.left + rect.width / 2,
543
- rect.top + rect.height / 2
544
- ],
545
- type: "move"
546
- }
547
- ]
548
- });
549
- await open;
550
- expect(tooltip.open).to.be.true;
551
- const close = oneEvent(tooltip, "sp-closed");
552
- open = oneEvent(el, "sp-opened");
553
- await sendMouse({
554
- steps: [
555
- {
556
- position: [
557
- rect.left + rect.width / 2,
558
- rect.top + rect.height / 2
559
- ],
560
- type: "click"
561
- }
562
- ]
563
- });
564
- await close;
565
- await open;
566
- expect(tooltip.open, "tooltip still open").to.be.false;
567
- expect(el.open, "menu not open").to.be.true;
568
- const menu = el.optionsMenu;
569
- const menuRect = menu.getBoundingClientRect();
570
- await sendMouse({
571
- steps: [
572
- {
573
- position: [
574
- menuRect.left + menuRect.width / 2,
575
- menuRect.top + menuRect.height / 2
576
- ],
577
- type: "move"
578
- }
579
- ]
580
- });
581
- await aTimeout(150);
582
- expect(openSpy.callCount).to.equal(1);
583
- });
584
- it("opens, then closes, on subsequent clicks", async function() {
585
- const el = await actionMenuFixture();
586
- const rect = el.getBoundingClientRect();
587
- await nextFrame();
588
- await nextFrame();
589
- const open = oneEvent(el, "sp-opened");
590
- await sendMouse({
591
- steps: [
592
- {
593
- position: [
594
- rect.left + rect.width / 2,
595
- rect.top + rect.height / 2
596
- ],
597
- type: "click"
598
- }
599
- ]
600
- });
601
- await open;
602
- expect(el.open).to.be.true;
603
- await aTimeout(50);
604
- expect(el.open).to.be.true;
605
- const close = oneEvent(el, "sp-closed");
606
- await sendMouse({
607
- steps: [
608
- {
609
- position: [
610
- rect.left + rect.width / 2,
611
- rect.top + rect.height / 2
612
- ],
613
- type: "click"
614
- }
615
- ]
616
- });
617
- await close;
618
- expect(el.open).to.be.false;
619
- await aTimeout(50);
620
- expect(el.open).to.be.false;
621
- });
622
- it("should handle scroll event", async () => {
623
- const renderMenuItems = () => Array.from(
624
- { length: 30 },
625
- (_, i) => html`
626
- <sp-menu-item style="width: 100%;">
627
- Menu Item ${i + 1}
628
- </sp-menu-item>
629
- `
630
- );
631
- const handleActionMenuScroll = spy();
632
- const el = await fixture(html`
633
- <sp-action-menu @scroll=${() => handleActionMenuScroll()}>
634
- <span slot="label">More Actions</span>
635
- <sp-menu-item>Deselect</sp-menu-item>
636
- <sp-menu-item>Select Inverse</sp-menu-item>
637
- <sp-menu-item>Feather...</sp-menu-item>
638
- <sp-menu-item>Select and Mask...</sp-menu-item>
639
- ${renderMenuItems()}
640
- </sp-action-menu>
641
- `);
642
- await elementUpdated(el);
643
- expect(handleActionMenuScroll.called).to.be.false;
644
- el.dispatchEvent(
645
- new Event("scroll", { cancelable: true, composed: true })
646
- );
647
- expect(handleActionMenuScroll).to.have.been.called;
648
- });
649
- });
650
- };
651
- //# sourceMappingURL=index.js.map