@spectrum-web-components/overlay 0.16.4 → 0.16.6-devmode.7

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 (93) hide show
  1. package/active-overlay.dev.js +3 -0
  2. package/active-overlay.dev.js.map +7 -0
  3. package/active-overlay.js +3 -14
  4. package/active-overlay.js.map +7 -1
  5. package/overlay-trigger.dev.js +3 -0
  6. package/overlay-trigger.dev.js.map +7 -0
  7. package/overlay-trigger.js +3 -14
  8. package/overlay-trigger.js.map +7 -1
  9. package/package.json +68 -14
  10. package/src/ActiveOverlay.dev.js +445 -0
  11. package/src/ActiveOverlay.dev.js.map +7 -0
  12. package/src/ActiveOverlay.js +404 -424
  13. package/src/ActiveOverlay.js.map +7 -1
  14. package/src/OverlayTrigger.dev.js +293 -0
  15. package/src/OverlayTrigger.dev.js.map +7 -0
  16. package/src/OverlayTrigger.js +245 -264
  17. package/src/OverlayTrigger.js.map +7 -1
  18. package/src/VirtualTrigger.dev.js +30 -0
  19. package/src/VirtualTrigger.dev.js.map +7 -0
  20. package/src/VirtualTrigger.js +28 -38
  21. package/src/VirtualTrigger.js.map +7 -1
  22. package/src/active-overlay.css.dev.js +12 -0
  23. package/src/active-overlay.css.dev.js.map +7 -0
  24. package/src/active-overlay.css.js +3 -14
  25. package/src/active-overlay.css.js.map +7 -1
  26. package/src/index.dev.js +7 -0
  27. package/src/index.dev.js.map +7 -0
  28. package/src/index.js +7 -18
  29. package/src/index.js.map +7 -1
  30. package/src/loader.dev.js +5 -0
  31. package/src/loader.dev.js.map +7 -0
  32. package/src/loader.js +3 -14
  33. package/src/loader.js.map +7 -1
  34. package/src/overlay-events.dev.js +7 -0
  35. package/src/overlay-events.dev.js.map +7 -0
  36. package/src/overlay-events.js +5 -16
  37. package/src/overlay-events.js.map +7 -1
  38. package/src/overlay-stack.dev.js +436 -0
  39. package/src/overlay-stack.dev.js.map +7 -0
  40. package/src/overlay-stack.js +374 -420
  41. package/src/overlay-stack.js.map +7 -1
  42. package/src/overlay-timer.dev.js +71 -0
  43. package/src/overlay-timer.dev.js.map +7 -0
  44. package/src/overlay-timer.js +64 -82
  45. package/src/overlay-timer.js.map +7 -1
  46. package/src/overlay-trigger.css.dev.js +6 -0
  47. package/src/overlay-trigger.css.dev.js.map +7 -0
  48. package/src/overlay-trigger.css.js +3 -14
  49. package/src/overlay-trigger.css.js.map +7 -1
  50. package/src/overlay-types.dev.js +1 -0
  51. package/src/overlay-types.dev.js.map +7 -0
  52. package/src/overlay-types.js +1 -13
  53. package/src/overlay-types.js.map +7 -1
  54. package/src/overlay-utils.dev.js +28 -0
  55. package/src/overlay-utils.dev.js.map +7 -0
  56. package/src/overlay-utils.js +22 -33
  57. package/src/overlay-utils.js.map +7 -1
  58. package/src/overlay.dev.js +85 -0
  59. package/src/overlay.dev.js.map +7 -0
  60. package/src/overlay.js +83 -119
  61. package/src/overlay.js.map +7 -1
  62. package/stories/overlay-story-components.js +188 -184
  63. package/stories/overlay-story-components.js.map +7 -1
  64. package/stories/overlay.stories.js +238 -228
  65. package/stories/overlay.stories.js.map +7 -1
  66. package/sync/overlay-trigger.dev.js +7 -0
  67. package/sync/overlay-trigger.dev.js.map +7 -0
  68. package/sync/overlay-trigger.js +5 -16
  69. package/sync/overlay-trigger.js.map +7 -1
  70. package/test/benchmark/basic-test.js +7 -18
  71. package/test/benchmark/basic-test.js.map +7 -1
  72. package/test/overlay-lifecycle.test.js +107 -115
  73. package/test/overlay-lifecycle.test.js.map +7 -1
  74. package/test/overlay-timer.test.js +110 -122
  75. package/test/overlay-timer.test.js.map +7 -1
  76. package/test/overlay-trigger-click.test.js +43 -48
  77. package/test/overlay-trigger-click.test.js.map +7 -1
  78. package/test/overlay-trigger-extended.test.js +167 -182
  79. package/test/overlay-trigger-extended.test.js.map +7 -1
  80. package/test/overlay-trigger-hover-click.test.js +59 -73
  81. package/test/overlay-trigger-hover-click.test.js.map +7 -1
  82. package/test/overlay-trigger-hover.test.js +74 -77
  83. package/test/overlay-trigger-hover.test.js.map +7 -1
  84. package/test/overlay-trigger-longpress.test.js +166 -178
  85. package/test/overlay-trigger-longpress.test.js.map +7 -1
  86. package/test/overlay-trigger-sync.test.js +400 -422
  87. package/test/overlay-trigger-sync.test.js.map +7 -1
  88. package/test/overlay-trigger.test.js +400 -422
  89. package/test/overlay-trigger.test.js.map +7 -1
  90. package/test/overlay.test-vrt.js +4 -15
  91. package/test/overlay.test-vrt.js.map +7 -1
  92. package/test/overlay.test.js +458 -479
  93. package/test/overlay.test.js.map +7 -1
@@ -1,29 +1,27 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- import { elementUpdated, expect, fixture, html, nextFrame, oneEvent, waitUntil, } from '@open-wc/testing';
13
- import '@spectrum-web-components/action-button/sp-action-button.js';
14
- import '@spectrum-web-components/action-group/sp-action-group.js';
15
- import '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';
16
- import '@spectrum-web-components/popover/sp-popover.js';
17
- import { LONGPRESS_INSTRUCTIONS } from '..';
18
- import '@spectrum-web-components/overlay/overlay-trigger.js';
19
- import { sendKeys } from '@web/test-runner-commands';
20
- import { spy } from 'sinon';
21
- import '@spectrum-web-components/base';
22
- import { sendMouse } from '../../../test/plugins/browser.js';
23
- import { findDescribedNode } from '../../../test/testing-helpers-a11y.js';
24
- describe('Overlay Trigger - Longpress', () => {
25
- it('displays `longpress` content', async () => {
26
- const el = await fixture((() => html `
1
+ import {
2
+ elementUpdated,
3
+ expect,
4
+ fixture,
5
+ html,
6
+ nextFrame,
7
+ oneEvent,
8
+ waitUntil
9
+ } from "@open-wc/testing";
10
+ import "@spectrum-web-components/action-button/sp-action-button.js";
11
+ import "@spectrum-web-components/action-group/sp-action-group.js";
12
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js";
13
+ import "@spectrum-web-components/popover/sp-popover.js";
14
+ import {
15
+ LONGPRESS_INSTRUCTIONS
16
+ } from "@spectrum-web-components/overlay";
17
+ import "@spectrum-web-components/overlay/overlay-trigger.js";
18
+ import { sendKeys } from "@web/test-runner-commands";
19
+ import { spy } from "sinon";
20
+ import { sendMouse } from "../../../test/plugins/browser.js";
21
+ import { findDescribedNode } from "../../../test/testing-helpers-a11y.js";
22
+ describe("Overlay Trigger - Longpress", () => {
23
+ it("displays `longpress` content", async () => {
24
+ const el = await fixture((() => html`
27
25
  <overlay-trigger placement="right-start">
28
26
  <sp-action-button slot="trigger" hold-affordance>
29
27
  <sp-icon-magnify slot="icon"></sp-icon-magnify>
@@ -47,52 +45,52 @@ describe('Overlay Trigger - Longpress', () => {
47
45
  </sp-popover>
48
46
  </overlay-trigger>
49
47
  `)());
50
- await elementUpdated(el);
51
- const trigger = el.querySelector('sp-action-button');
52
- const content = el.querySelector('[slot="longpress-content"]');
53
- expect(trigger).to.not.be.null;
54
- expect(content).to.not.be.null;
55
- expect(content.open).to.be.false;
56
- trigger.focus();
57
- let open = oneEvent(el, 'sp-opened');
58
- await sendKeys({
59
- press: 'Space',
60
- });
61
- await open;
62
- expect(content.open, 'opens for `Space`').to.be.true;
63
- let closed = oneEvent(el, 'sp-closed');
64
- document.body.click();
65
- await closed;
66
- expect(!content.open, 'closes for `Space`').to.be.true;
67
- trigger.focus();
68
- open = oneEvent(el, 'sp-opened');
69
- sendKeys({
70
- press: 'Alt+ArrowDown',
71
- });
72
- await open;
73
- expect(content.open, 'opens for `Alt+ArrowDown`').to.be.true;
74
- closed = oneEvent(el, 'sp-closed');
75
- await sendKeys({
76
- press: 'Escape',
77
- });
78
- await closed;
79
- expect(!content.open, 'closes for `Alt+ArrowDown`').to.be.true;
80
- await elementUpdated(el);
81
- open = oneEvent(el, 'sp-opened');
82
- trigger.dispatchEvent(new Event('pointerdown'));
83
- await open;
84
- expect(content.open, 'opens for `pointerdown`').to.be.true;
85
- closed = oneEvent(el, 'sp-closed');
86
- await sendKeys({
87
- press: 'Escape',
88
- });
89
- await closed;
90
- expect(!content.open, 'closes for `pointerdown`').to.be.true;
48
+ await elementUpdated(el);
49
+ const trigger = el.querySelector("sp-action-button");
50
+ const content = el.querySelector('[slot="longpress-content"]');
51
+ expect(trigger).to.not.be.null;
52
+ expect(content).to.not.be.null;
53
+ expect(content.open).to.be.false;
54
+ trigger.focus();
55
+ let open = oneEvent(el, "sp-opened");
56
+ await sendKeys({
57
+ press: "Space"
91
58
  });
92
- it('displays `longpress` declaratively', async () => {
93
- const openedSpy = spy();
94
- const closedSpy = spy();
95
- const el = await fixture((() => html `
59
+ await open;
60
+ expect(content.open, "opens for `Space`").to.be.true;
61
+ let closed = oneEvent(el, "sp-closed");
62
+ document.body.click();
63
+ await closed;
64
+ expect(!content.open, "closes for `Space`").to.be.true;
65
+ trigger.focus();
66
+ open = oneEvent(el, "sp-opened");
67
+ sendKeys({
68
+ press: "Alt+ArrowDown"
69
+ });
70
+ await open;
71
+ expect(content.open, "opens for `Alt+ArrowDown`").to.be.true;
72
+ closed = oneEvent(el, "sp-closed");
73
+ await sendKeys({
74
+ press: "Escape"
75
+ });
76
+ await closed;
77
+ expect(!content.open, "closes for `Alt+ArrowDown`").to.be.true;
78
+ await elementUpdated(el);
79
+ open = oneEvent(el, "sp-opened");
80
+ trigger.dispatchEvent(new Event("pointerdown"));
81
+ await open;
82
+ expect(content.open, "opens for `pointerdown`").to.be.true;
83
+ closed = oneEvent(el, "sp-closed");
84
+ await sendKeys({
85
+ press: "Escape"
86
+ });
87
+ await closed;
88
+ expect(!content.open, "closes for `pointerdown`").to.be.true;
89
+ });
90
+ it("displays `longpress` declaratively", async () => {
91
+ const openedSpy = spy();
92
+ const closedSpy = spy();
93
+ const el = await fixture((() => html`
96
94
  <overlay-trigger
97
95
  placement="right-start"
98
96
  open="longpress"
@@ -105,15 +103,15 @@ describe('Overlay Trigger - Longpress', () => {
105
103
  <sp-popover slot="longpress-content" tip></sp-popover>
106
104
  </overlay-trigger>
107
105
  `)());
108
- await elementUpdated(el);
109
- await waitUntil(() => openedSpy.calledOnce, 'longpress content projected to overlay', { timeout: 2000 });
110
- const closed = oneEvent(el, 'sp-closed');
111
- el.removeAttribute('open');
112
- await closed;
113
- expect(closedSpy.calledOnce, 'longpress content returned').to.be.true;
114
- });
115
- it('describes longpress interaction accessibly', async () => {
116
- const el = await fixture(html `
106
+ await elementUpdated(el);
107
+ await waitUntil(() => openedSpy.calledOnce, "longpress content projected to overlay", { timeout: 2e3 });
108
+ const closed = oneEvent(el, "sp-closed");
109
+ el.removeAttribute("open");
110
+ await closed;
111
+ expect(closedSpy.calledOnce, "longpress content returned").to.be.true;
112
+ });
113
+ it("describes longpress interaction accessibly", async () => {
114
+ const el = await fixture(html`
117
115
  <overlay-trigger placement="right-start">
118
116
  <sp-action-button slot="trigger" hold-affordance>
119
117
  Trigger with hold affordance
@@ -137,34 +135,30 @@ describe('Overlay Trigger - Longpress', () => {
137
135
  </sp-popover>
138
136
  </overlay-trigger>
139
137
  `);
140
- const trigger = el.querySelector('[slot="trigger"]');
141
- await elementUpdated(el);
142
- expect(trigger.hasAttribute('aria-describedby')).to.be.true;
143
- expect(el.open).to.be.undefined;
144
- /*
145
- * This test passes because OverlayTrigger adds a new node to describe
146
- * the longpress interaction now available on the trigger element
147
- */
148
- expect(el.childNodes.length, 'always').to.equal(6);
149
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
150
- const opened = oneEvent(el, 'sp-opened');
151
- trigger.dispatchEvent(new Event('longpress', { bubbles: true, composed: true }));
152
- await opened;
153
- expect(el.open).to.equal('longpress');
154
- expect(el.childNodes.length, 'always').to.equal(6);
155
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
156
- const closed = oneEvent(el, 'sp-closed');
157
- await sendKeys({
158
- press: 'Escape',
159
- });
160
- await closed;
161
- expect(el.open).to.be.null;
162
- expect(trigger.hasAttribute('aria-describedby')).to.be.true;
163
- expect(el.childNodes.length, 'always').to.equal(6);
164
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
138
+ const trigger = el.querySelector('[slot="trigger"]');
139
+ await elementUpdated(el);
140
+ expect(trigger.hasAttribute("aria-describedby")).to.be.true;
141
+ expect(el.open).to.be.undefined;
142
+ expect(el.childNodes.length, "always").to.equal(6);
143
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
144
+ const opened = oneEvent(el, "sp-opened");
145
+ trigger.dispatchEvent(new Event("longpress", { bubbles: true, composed: true }));
146
+ await opened;
147
+ expect(el.open).to.equal("longpress");
148
+ expect(el.childNodes.length, "always").to.equal(6);
149
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
150
+ const closed = oneEvent(el, "sp-closed");
151
+ await sendKeys({
152
+ press: "Escape"
165
153
  });
166
- it('removes longpress `aria-describedby` description element when longpress content is removed', async () => {
167
- const el = await fixture(html `
154
+ await closed;
155
+ expect(el.open).to.be.null;
156
+ expect(trigger.hasAttribute("aria-describedby")).to.be.true;
157
+ expect(el.childNodes.length, "always").to.equal(6);
158
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
159
+ });
160
+ it("removes longpress `aria-describedby` description element when longpress content is removed", async () => {
161
+ const el = await fixture(html`
168
162
  <overlay-trigger placement="right-start">
169
163
  <sp-action-button slot="trigger" hold-affordance>
170
164
  Trigger with hold affordance
@@ -188,26 +182,26 @@ describe('Overlay Trigger - Longpress', () => {
188
182
  </sp-popover>
189
183
  </overlay-trigger>
190
184
  `);
191
- const trigger = el.querySelector('[slot="trigger"]');
192
- const content = el.querySelector('[slot="longpress-content"]');
193
- await elementUpdated(el);
194
- expect(el.hasLongpressContent).to.be.true;
195
- expect(el.childNodes.length, 'always').to.equal(6);
196
- el.removeAttribute('hold-affordance');
197
- el.removeChild(content);
198
- await elementUpdated(el);
199
- expect(trigger.hasAttribute('aria-describedby')).to.be.false;
200
- expect(el.hasLongpressContent).to.be.false;
201
- expect(el.childNodes.length, 'always').to.equal(4);
202
- el.setAttribute('hold-affordance', 'true');
203
- el.append(content);
204
- await elementUpdated(el);
205
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
206
- expect(el.hasLongpressContent).to.be.true;
207
- expect(el.childNodes.length, 'always').to.equal(6);
208
- });
209
- it('recognises multiple overlay triggers in a11y tree', async () => {
210
- const el = await fixture(html `
185
+ const trigger = el.querySelector('[slot="trigger"]');
186
+ const content = el.querySelector('[slot="longpress-content"]');
187
+ await elementUpdated(el);
188
+ expect(el.hasLongpressContent).to.be.true;
189
+ expect(el.childNodes.length, "always").to.equal(6);
190
+ el.removeAttribute("hold-affordance");
191
+ el.removeChild(content);
192
+ await elementUpdated(el);
193
+ expect(trigger.hasAttribute("aria-describedby")).to.be.false;
194
+ expect(el.hasLongpressContent).to.be.false;
195
+ expect(el.childNodes.length, "always").to.equal(4);
196
+ el.setAttribute("hold-affordance", "true");
197
+ el.append(content);
198
+ await elementUpdated(el);
199
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
200
+ expect(el.hasLongpressContent).to.be.true;
201
+ expect(el.childNodes.length, "always").to.equal(6);
202
+ });
203
+ it("recognises multiple overlay triggers in a11y tree", async () => {
204
+ const el = await fixture(html`
211
205
  <div id="container">
212
206
  <overlay-trigger id="first-trigger" placement="right-start">
213
207
  <sp-action-button slot="trigger" hold-affordance>
@@ -247,18 +241,18 @@ describe('Overlay Trigger - Longpress', () => {
247
241
  </overlay-trigger>
248
242
  </div>
249
243
  `);
250
- await elementUpdated(el);
251
- const div = document.getElementById('container');
252
- const firstTrigger = document.getElementById('first-trigger');
253
- const secondTrigger = document.getElementById('second-trigger');
254
- expect(firstTrigger.hasLongpressContent).to.be.true;
255
- expect(secondTrigger.hasLongpressContent).to.be.true;
256
- expect(div.childNodes.length, 'always').to.equal(5);
257
- await findDescribedNode('First button', LONGPRESS_INSTRUCTIONS.keyboard);
258
- await findDescribedNode('Second button', LONGPRESS_INSTRUCTIONS.keyboard);
259
- });
260
- it('describes interactions differently to the user', async () => {
261
- const test = await fixture(html `
244
+ await elementUpdated(el);
245
+ const div = document.getElementById("container");
246
+ const firstTrigger = document.getElementById("first-trigger");
247
+ const secondTrigger = document.getElementById("second-trigger");
248
+ expect(firstTrigger.hasLongpressContent).to.be.true;
249
+ expect(secondTrigger.hasLongpressContent).to.be.true;
250
+ expect(div.childNodes.length, "always").to.equal(5);
251
+ await findDescribedNode("First button", LONGPRESS_INSTRUCTIONS.keyboard);
252
+ await findDescribedNode("Second button", LONGPRESS_INSTRUCTIONS.keyboard);
253
+ });
254
+ it("describes interactions differently to the user", async () => {
255
+ const test = await fixture(html`
262
256
  <div>
263
257
  <input id="first" />
264
258
  <overlay-trigger placement="right-start">
@@ -292,44 +286,38 @@ describe('Overlay Trigger - Longpress', () => {
292
286
  <input id="last" />
293
287
  </div>
294
288
  `);
295
- const el = test.querySelector('overlay-trigger');
296
- const first = test.querySelector('#first');
297
- const firstRect = first.getBoundingClientRect();
298
- const trigger = el.querySelector('sp-action-button');
299
- const content = el.querySelector('[slot="longpress-content"]');
300
- await elementUpdated(el);
301
- expect(trigger).to.not.be.null;
302
- expect(content).to.not.be.null;
303
- expect(trigger.hasAttribute('aria-describedby')).to.be.true;
304
- expect(content.open).to.be.false;
305
- first.focus();
306
- await sendKeys({
307
- press: 'Tab',
308
- });
309
- expect(document.activeElement === trigger, 'Trigger focused').to.be
310
- .true;
311
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
312
- await sendKeys({
313
- press: 'Tab',
314
- });
315
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
316
- /*
317
- * The following re-establishes that focus is not visible
318
- * for this portion of the test. That way, the LONGPRESS_INSTRUCTIONS
319
- * change appropriately depending on the type of interaction.
320
- */
321
- await sendMouse({
322
- steps: [
323
- {
324
- type: 'click',
325
- position: [firstRect.x, firstRect.y],
326
- },
327
- ],
328
- });
329
- trigger.focus();
330
- await nextFrame();
331
- await nextFrame();
332
- await findDescribedNode('Trigger with hold affordance', LONGPRESS_INSTRUCTIONS.keyboard);
289
+ const el = test.querySelector("overlay-trigger");
290
+ const first = test.querySelector("#first");
291
+ const firstRect = first.getBoundingClientRect();
292
+ const trigger = el.querySelector("sp-action-button");
293
+ const content = el.querySelector('[slot="longpress-content"]');
294
+ await elementUpdated(el);
295
+ expect(trigger).to.not.be.null;
296
+ expect(content).to.not.be.null;
297
+ expect(trigger.hasAttribute("aria-describedby")).to.be.true;
298
+ expect(content.open).to.be.false;
299
+ first.focus();
300
+ await sendKeys({
301
+ press: "Tab"
302
+ });
303
+ expect(document.activeElement === trigger, "Trigger focused").to.be.true;
304
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
305
+ await sendKeys({
306
+ press: "Tab"
307
+ });
308
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
309
+ await sendMouse({
310
+ steps: [
311
+ {
312
+ type: "click",
313
+ position: [firstRect.x, firstRect.y]
314
+ }
315
+ ]
333
316
  });
317
+ trigger.focus();
318
+ await nextFrame();
319
+ await nextFrame();
320
+ await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
321
+ });
334
322
  });
335
- //# sourceMappingURL=overlay-trigger-longpress.test.js.map
323
+ //# sourceMappingURL=overlay-trigger-longpress.test.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"overlay-trigger-longpress.test.js","sourceRoot":"","sources":["overlay-trigger-longpress.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n elementUpdated,\n expect,\n fixture,\n html,\n nextFrame,\n oneEvent,\n waitUntil,\n} from '@open-wc/testing';\nimport { ActionButton } from '@spectrum-web-components/action-button';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/action-group/sp-action-group.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport { Popover } from '@spectrum-web-components/popover';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport { LONGPRESS_INSTRUCTIONS, OverlayTrigger } from '..';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { spy } from 'sinon';\nimport '@spectrum-web-components/base';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { findDescribedNode } from '../../../test/testing-helpers-a11y.js';\n\ndescribe('Overlay Trigger - Longpress', () => {\n it('displays `longpress` content', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `)()\n );\n\n await elementUpdated(el);\n\n const trigger = el.querySelector('sp-action-button') as ActionButton;\n const content = el.querySelector(\n '[slot=\"longpress-content\"]'\n ) as Popover;\n\n expect(trigger).to.not.be.null;\n expect(content).to.not.be.null;\n expect(content.open).to.be.false;\n\n trigger.focus();\n let open = oneEvent(el, 'sp-opened');\n await sendKeys({\n press: 'Space',\n });\n await open;\n expect(content.open, 'opens for `Space`').to.be.true;\n\n let closed = oneEvent(el, 'sp-closed');\n document.body.click();\n await closed;\n\n expect(!content.open, 'closes for `Space`').to.be.true;\n\n trigger.focus();\n open = oneEvent(el, 'sp-opened');\n sendKeys({\n press: 'Alt+ArrowDown',\n });\n await open;\n expect(content.open, 'opens for `Alt+ArrowDown`').to.be.true;\n closed = oneEvent(el, 'sp-closed');\n await sendKeys({\n press: 'Escape',\n });\n await closed;\n expect(!content.open, 'closes for `Alt+ArrowDown`').to.be.true;\n await elementUpdated(el);\n\n open = oneEvent(el, 'sp-opened');\n trigger.dispatchEvent(new Event('pointerdown'));\n await open;\n expect(content.open, 'opens for `pointerdown`').to.be.true;\n closed = oneEvent(el, 'sp-closed');\n await sendKeys({\n press: 'Escape',\n });\n await closed;\n expect(!content.open, 'closes for `pointerdown`').to.be.true;\n });\n it('displays `longpress` declaratively', async () => {\n const openedSpy = spy();\n const closedSpy = spy();\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger\n placement=\"right-start\"\n open=\"longpress\"\n @sp-opened=${() => openedSpy()}\n @sp-closed=${() => closedSpy()}\n >\n <sp-action-button slot=\"trigger\" hold-affordance>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n await waitUntil(\n () => openedSpy.calledOnce,\n 'longpress content projected to overlay',\n { timeout: 2000 }\n );\n\n const closed = oneEvent(el, 'sp-closed');\n el.removeAttribute('open');\n await closed;\n\n expect(closedSpy.calledOnce, 'longpress content returned').to.be.true;\n });\n it('describes longpress interaction accessibly', async () => {\n const el = await fixture<OverlayTrigger>(\n html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Trigger with hold affordance\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `\n );\n const trigger = el.querySelector('[slot=\"trigger\"]') as HTMLElement;\n\n await elementUpdated(el);\n\n expect(trigger.hasAttribute('aria-describedby')).to.be.true;\n expect(el.open).to.be.undefined;\n /*\n * This test passes because OverlayTrigger adds a new node to describe\n * the longpress interaction now available on the trigger element\n */\n expect(el.childNodes.length, 'always').to.equal(6);\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n const opened = oneEvent(el, 'sp-opened');\n trigger.dispatchEvent(\n new Event('longpress', { bubbles: true, composed: true })\n );\n await opened;\n\n expect(el.open).to.equal('longpress');\n expect(el.childNodes.length, 'always').to.equal(6);\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n const closed = oneEvent(el, 'sp-closed');\n\n await sendKeys({\n press: 'Escape',\n });\n await closed;\n\n expect(el.open).to.be.null;\n expect(trigger.hasAttribute('aria-describedby')).to.be.true;\n expect(el.childNodes.length, 'always').to.equal(6);\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n });\n it('removes longpress `aria-describedby` description element when longpress content is removed', async () => {\n const el = await fixture<OverlayTrigger>(\n html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Trigger with hold affordance\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `\n );\n const trigger = el.querySelector('[slot=\"trigger\"]') as HTMLElement;\n const content = el.querySelector(\n '[slot=\"longpress-content\"]'\n ) as Popover;\n await elementUpdated(el);\n\n expect(el.hasLongpressContent).to.be.true;\n expect(el.childNodes.length, 'always').to.equal(6);\n\n el.removeAttribute('hold-affordance');\n el.removeChild(content);\n\n await elementUpdated(el);\n\n expect(trigger.hasAttribute('aria-describedby')).to.be.false;\n expect(el.hasLongpressContent).to.be.false;\n expect(el.childNodes.length, 'always').to.equal(4);\n\n el.setAttribute('hold-affordance', 'true');\n el.append(content);\n\n await elementUpdated(el);\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n expect(el.hasLongpressContent).to.be.true;\n expect(el.childNodes.length, 'always').to.equal(6);\n });\n it('recognises multiple overlay triggers in a11y tree', async () => {\n const el = await fixture<OverlayTrigger>(\n html`\n <div id=\"container\">\n <overlay-trigger id=\"first-trigger\" placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n First button\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n <overlay-trigger id=\"second-trigger\" placement=\"left-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Second button\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n </div>\n `\n );\n await elementUpdated(el);\n\n const div = document.getElementById('container') as HTMLElement;\n const firstTrigger = document.getElementById(\n 'first-trigger'\n ) as OverlayTrigger;\n const secondTrigger = document.getElementById(\n 'second-trigger'\n ) as OverlayTrigger;\n\n expect(firstTrigger.hasLongpressContent).to.be.true;\n expect(secondTrigger.hasLongpressContent).to.be.true;\n expect(div.childNodes.length, 'always').to.equal(5);\n\n await findDescribedNode(\n 'First button',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n await findDescribedNode(\n 'Second button',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n });\n it('describes interactions differently to the user', async () => {\n const test = await fixture<OverlayTrigger>(\n html`\n <div>\n <input id=\"first\" />\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Trigger with hold affordance\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n <input id=\"last\" />\n </div>\n `\n );\n const el = test.querySelector('overlay-trigger') as OverlayTrigger;\n const first = test.querySelector('#first') as HTMLElement;\n const firstRect = first.getBoundingClientRect();\n const trigger = el.querySelector('sp-action-button') as HTMLElement;\n const content = el.querySelector(\n '[slot=\"longpress-content\"]'\n ) as Popover;\n\n await elementUpdated(el);\n\n expect(trigger).to.not.be.null;\n expect(content).to.not.be.null;\n expect(trigger.hasAttribute('aria-describedby')).to.be.true;\n expect(content.open).to.be.false;\n\n first.focus();\n\n await sendKeys({\n press: 'Tab',\n });\n\n expect(document.activeElement === trigger, 'Trigger focused').to.be\n .true;\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n await sendKeys({\n press: 'Tab',\n });\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n /*\n * The following re-establishes that focus is not visible\n * for this portion of the test. That way, the LONGPRESS_INSTRUCTIONS\n * change appropriately depending on the type of interaction.\n */\n await sendMouse({\n steps: [\n {\n type: 'click',\n position: [firstRect.x, firstRect.y],\n },\n ],\n });\n\n trigger.focus();\n\n await nextFrame();\n await nextFrame();\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n });\n});\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["overlay-trigger-longpress.test.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport {\n elementUpdated,\n expect,\n fixture,\n html,\n nextFrame,\n oneEvent,\n waitUntil,\n} from '@open-wc/testing';\nimport { ActionButton } from '@spectrum-web-components/action-button';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/action-group/sp-action-group.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport { Popover } from '@spectrum-web-components/popover';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport {\n LONGPRESS_INSTRUCTIONS,\n OverlayTrigger,\n} from '@spectrum-web-components/overlay';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { spy } from 'sinon';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { findDescribedNode } from '../../../test/testing-helpers-a11y.js';\n\ndescribe('Overlay Trigger - Longpress', () => {\n it('displays `longpress` content', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `)()\n );\n\n await elementUpdated(el);\n\n const trigger = el.querySelector('sp-action-button') as ActionButton;\n const content = el.querySelector(\n '[slot=\"longpress-content\"]'\n ) as Popover;\n\n expect(trigger).to.not.be.null;\n expect(content).to.not.be.null;\n expect(content.open).to.be.false;\n\n trigger.focus();\n let open = oneEvent(el, 'sp-opened');\n await sendKeys({\n press: 'Space',\n });\n await open;\n expect(content.open, 'opens for `Space`').to.be.true;\n\n let closed = oneEvent(el, 'sp-closed');\n document.body.click();\n await closed;\n\n expect(!content.open, 'closes for `Space`').to.be.true;\n\n trigger.focus();\n open = oneEvent(el, 'sp-opened');\n sendKeys({\n press: 'Alt+ArrowDown',\n });\n await open;\n expect(content.open, 'opens for `Alt+ArrowDown`').to.be.true;\n closed = oneEvent(el, 'sp-closed');\n await sendKeys({\n press: 'Escape',\n });\n await closed;\n expect(!content.open, 'closes for `Alt+ArrowDown`').to.be.true;\n await elementUpdated(el);\n\n open = oneEvent(el, 'sp-opened');\n trigger.dispatchEvent(new Event('pointerdown'));\n await open;\n expect(content.open, 'opens for `pointerdown`').to.be.true;\n closed = oneEvent(el, 'sp-closed');\n await sendKeys({\n press: 'Escape',\n });\n await closed;\n expect(!content.open, 'closes for `pointerdown`').to.be.true;\n });\n it('displays `longpress` declaratively', async () => {\n const openedSpy = spy();\n const closedSpy = spy();\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger\n placement=\"right-start\"\n open=\"longpress\"\n @sp-opened=${() => openedSpy()}\n @sp-closed=${() => closedSpy()}\n >\n <sp-action-button slot=\"trigger\" hold-affordance>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n await waitUntil(\n () => openedSpy.calledOnce,\n 'longpress content projected to overlay',\n { timeout: 2000 }\n );\n\n const closed = oneEvent(el, 'sp-closed');\n el.removeAttribute('open');\n await closed;\n\n expect(closedSpy.calledOnce, 'longpress content returned').to.be.true;\n });\n it('describes longpress interaction accessibly', async () => {\n const el = await fixture<OverlayTrigger>(\n html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Trigger with hold affordance\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `\n );\n const trigger = el.querySelector('[slot=\"trigger\"]') as HTMLElement;\n\n await elementUpdated(el);\n\n expect(trigger.hasAttribute('aria-describedby')).to.be.true;\n expect(el.open).to.be.undefined;\n /*\n * This test passes because OverlayTrigger adds a new node to describe\n * the longpress interaction now available on the trigger element\n */\n expect(el.childNodes.length, 'always').to.equal(6);\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n const opened = oneEvent(el, 'sp-opened');\n trigger.dispatchEvent(\n new Event('longpress', { bubbles: true, composed: true })\n );\n await opened;\n\n expect(el.open).to.equal('longpress');\n expect(el.childNodes.length, 'always').to.equal(6);\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n const closed = oneEvent(el, 'sp-closed');\n\n await sendKeys({\n press: 'Escape',\n });\n await closed;\n\n expect(el.open).to.be.null;\n expect(trigger.hasAttribute('aria-describedby')).to.be.true;\n expect(el.childNodes.length, 'always').to.equal(6);\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n });\n it('removes longpress `aria-describedby` description element when longpress content is removed', async () => {\n const el = await fixture<OverlayTrigger>(\n html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Trigger with hold affordance\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n `\n );\n const trigger = el.querySelector('[slot=\"trigger\"]') as HTMLElement;\n const content = el.querySelector(\n '[slot=\"longpress-content\"]'\n ) as Popover;\n await elementUpdated(el);\n\n expect(el.hasLongpressContent).to.be.true;\n expect(el.childNodes.length, 'always').to.equal(6);\n\n el.removeAttribute('hold-affordance');\n el.removeChild(content);\n\n await elementUpdated(el);\n\n expect(trigger.hasAttribute('aria-describedby')).to.be.false;\n expect(el.hasLongpressContent).to.be.false;\n expect(el.childNodes.length, 'always').to.equal(4);\n\n el.setAttribute('hold-affordance', 'true');\n el.append(content);\n\n await elementUpdated(el);\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n expect(el.hasLongpressContent).to.be.true;\n expect(el.childNodes.length, 'always').to.equal(6);\n });\n it('recognises multiple overlay triggers in a11y tree', async () => {\n const el = await fixture<OverlayTrigger>(\n html`\n <div id=\"container\">\n <overlay-trigger id=\"first-trigger\" placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n First button\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n <overlay-trigger id=\"second-trigger\" placement=\"left-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Second button\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n </div>\n `\n );\n await elementUpdated(el);\n\n const div = document.getElementById('container') as HTMLElement;\n const firstTrigger = document.getElementById(\n 'first-trigger'\n ) as OverlayTrigger;\n const secondTrigger = document.getElementById(\n 'second-trigger'\n ) as OverlayTrigger;\n\n expect(firstTrigger.hasLongpressContent).to.be.true;\n expect(secondTrigger.hasLongpressContent).to.be.true;\n expect(div.childNodes.length, 'always').to.equal(5);\n\n await findDescribedNode(\n 'First button',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n await findDescribedNode(\n 'Second button',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n });\n it('describes interactions differently to the user', async () => {\n const test = await fixture<OverlayTrigger>(\n html`\n <div>\n <input id=\"first\" />\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\" hold-affordance>\n Trigger with hold affordance\n </sp-action-button>\n <sp-popover slot=\"longpress-content\" tip>\n <sp-action-group\n selects=\"single\"\n vertical\n style=\"margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);\"\n >\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n <sp-action-button>\n <sp-icon-magnify\n slot=\"icon\"\n ></sp-icon-magnify>\n </sp-action-button>\n </sp-action-group>\n </sp-popover>\n </overlay-trigger>\n <input id=\"last\" />\n </div>\n `\n );\n const el = test.querySelector('overlay-trigger') as OverlayTrigger;\n const first = test.querySelector('#first') as HTMLElement;\n const firstRect = first.getBoundingClientRect();\n const trigger = el.querySelector('sp-action-button') as HTMLElement;\n const content = el.querySelector(\n '[slot=\"longpress-content\"]'\n ) as Popover;\n\n await elementUpdated(el);\n\n expect(trigger).to.not.be.null;\n expect(content).to.not.be.null;\n expect(trigger.hasAttribute('aria-describedby')).to.be.true;\n expect(content.open).to.be.false;\n\n first.focus();\n\n await sendKeys({\n press: 'Tab',\n });\n\n expect(document.activeElement === trigger, 'Trigger focused').to.be\n .true;\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n await sendKeys({\n press: 'Tab',\n });\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n\n /*\n * The following re-establishes that focus is not visible\n * for this portion of the test. That way, the LONGPRESS_INSTRUCTIONS\n * change appropriately depending on the type of interaction.\n */\n await sendMouse({\n steps: [\n {\n type: 'click',\n position: [firstRect.x, firstRect.y],\n },\n ],\n });\n\n trigger.focus();\n\n await nextFrame();\n await nextFrame();\n\n await findDescribedNode(\n 'Trigger with hold affordance',\n LONGPRESS_INSTRUCTIONS.keyboard\n );\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }