@spectrum-web-components/overlay 0.17.1-devmode2.0 → 0.18.1

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 (92) hide show
  1. package/README.md +3 -0
  2. package/active-overlay.dev.js +1 -0
  3. package/active-overlay.dev.js.map +1 -1
  4. package/active-overlay.js +1 -2
  5. package/active-overlay.js.map +2 -2
  6. package/overlay-trigger.dev.js +1 -0
  7. package/overlay-trigger.dev.js.map +1 -1
  8. package/overlay-trigger.js +1 -2
  9. package/overlay-trigger.js.map +2 -2
  10. package/package.json +6 -6
  11. package/src/ActiveOverlay.dev.js +57 -23
  12. package/src/ActiveOverlay.dev.js.map +2 -2
  13. package/src/ActiveOverlay.js +8 -437
  14. package/src/ActiveOverlay.js.map +2 -2
  15. package/src/OverlayTrigger.dev.js +51 -18
  16. package/src/OverlayTrigger.dev.js.map +1 -1
  17. package/src/OverlayTrigger.js +2 -265
  18. package/src/OverlayTrigger.js.map +2 -2
  19. package/src/VirtualTrigger.dev.js +1 -0
  20. package/src/VirtualTrigger.dev.js.map +1 -1
  21. package/src/VirtualTrigger.js +1 -29
  22. package/src/VirtualTrigger.js.map +2 -2
  23. package/src/active-overlay.css.dev.js +1 -0
  24. package/src/active-overlay.css.dev.js.map +1 -1
  25. package/src/active-overlay.css.js +2 -4
  26. package/src/active-overlay.css.js.map +2 -2
  27. package/src/index.dev.js +1 -0
  28. package/src/index.dev.js.map +1 -1
  29. package/src/index.js +1 -6
  30. package/src/index.js.map +1 -1
  31. package/src/loader.dev.js +1 -0
  32. package/src/loader.dev.js.map +1 -1
  33. package/src/loader.js +1 -4
  34. package/src/loader.js.map +2 -2
  35. package/src/overlay-events.dev.js +1 -0
  36. package/src/overlay-events.dev.js.map +1 -1
  37. package/src/overlay-events.js +1 -6
  38. package/src/overlay-events.js.map +2 -2
  39. package/src/overlay-stack.dev.js +95 -44
  40. package/src/overlay-stack.dev.js.map +3 -3
  41. package/src/overlay-stack.js +2 -405
  42. package/src/overlay-stack.js.map +3 -3
  43. package/src/overlay-timer.dev.js +1 -0
  44. package/src/overlay-timer.dev.js.map +1 -1
  45. package/src/overlay-timer.js +1 -70
  46. package/src/overlay-timer.js.map +2 -2
  47. package/src/overlay-trigger.css.dev.js +1 -0
  48. package/src/overlay-trigger.css.dev.js.map +1 -1
  49. package/src/overlay-trigger.css.js +2 -4
  50. package/src/overlay-trigger.css.js.map +2 -2
  51. package/src/overlay-types.dev.js +1 -0
  52. package/src/overlay-types.js +1 -0
  53. package/src/overlay-utils.dev.js +4 -1
  54. package/src/overlay-utils.dev.js.map +1 -1
  55. package/src/overlay-utils.js +1 -27
  56. package/src/overlay-utils.js.map +2 -2
  57. package/src/overlay.dev.js +1 -0
  58. package/src/overlay.dev.js.map +1 -1
  59. package/src/overlay.js +1 -84
  60. package/src/overlay.js.map +2 -2
  61. package/stories/overlay-story-components.js +17 -5
  62. package/stories/overlay-story-components.js.map +2 -2
  63. package/stories/overlay.stories.js +24 -8
  64. package/stories/overlay.stories.js.map +1 -1
  65. package/sync/overlay-trigger.dev.js +1 -0
  66. package/sync/overlay-trigger.dev.js.map +1 -1
  67. package/sync/overlay-trigger.js +1 -6
  68. package/sync/overlay-trigger.js.map +2 -2
  69. package/test/benchmark/basic-test.js +5 -2
  70. package/test/benchmark/basic-test.js.map +1 -1
  71. package/test/overlay-lifecycle.test.js +51 -14
  72. package/test/overlay-lifecycle.test.js.map +1 -1
  73. package/test/overlay-timer.test.js +1 -0
  74. package/test/overlay-timer.test.js.map +2 -2
  75. package/test/overlay-trigger-click.test.js +20 -5
  76. package/test/overlay-trigger-click.test.js.map +1 -1
  77. package/test/overlay-trigger-extended.test.js +19 -6
  78. package/test/overlay-trigger-extended.test.js.map +1 -1
  79. package/test/overlay-trigger-hover-click.test.js +7 -2
  80. package/test/overlay-trigger-hover-click.test.js.map +1 -1
  81. package/test/overlay-trigger-hover.test.js +110 -19
  82. package/test/overlay-trigger-hover.test.js.map +2 -2
  83. package/test/overlay-trigger-longpress.test.js +85 -29
  84. package/test/overlay-trigger-longpress.test.js.map +2 -2
  85. package/test/overlay-trigger-sync.test.js +183 -56
  86. package/test/overlay-trigger-sync.test.js.map +2 -2
  87. package/test/overlay-trigger.test.js +183 -56
  88. package/test/overlay-trigger.test.js.map +2 -2
  89. package/test/overlay.test-vrt.js +1 -0
  90. package/test/overlay.test-vrt.js.map +1 -1
  91. package/test/overlay.test.js +162 -74
  92. package/test/overlay.test.js.map +1 -1
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  import { expect, fixture, html, oneEvent } from "@open-wc/testing";
2
3
  import "@spectrum-web-components/popover/sp-popover.js";
3
4
  import "@spectrum-web-components/action-button/sp-action-button.js";
@@ -20,7 +21,9 @@ describe("Overlay Trigger - Hover and Click", () => {
20
21
  </sp-tooltip>
21
22
  </overlay-trigger>
22
23
  `);
23
- const trigger = el.querySelector("[slot=trigger]");
24
+ const trigger = el.querySelector(
25
+ "[slot=trigger]"
26
+ );
24
27
  let interaction;
25
28
  for (let i = 0; i < 3; i++) {
26
29
  const openedEvent = oneEvent(el, "sp-opened");
@@ -45,7 +48,9 @@ describe("Overlay Trigger - Hover and Click", () => {
45
48
  </sp-tooltip>
46
49
  </overlay-trigger>
47
50
  `);
48
- const trigger = el.querySelector("[slot=trigger]");
51
+ const trigger = el.querySelector(
52
+ "[slot=trigger]"
53
+ );
49
54
  const bounds = el.getBoundingClientRect();
50
55
  let interaction;
51
56
  const hoveredEvent = oneEvent(el, "sp-opened");
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["overlay-trigger-hover-click.test.ts"],
4
4
  "sourcesContent": ["/*\nCopyright 2021 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 { expect, fixture, html, oneEvent } from '@open-wc/testing';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/button/sp-button.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\nimport { OverlayTrigger } from '@spectrum-web-components/overlay/src/OverlayTrigger';\nimport { TriggerInteractions } from '@spectrum-web-components/overlay/src/overlay-types';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport { ActionButton } from '@spectrum-web-components/action-button';\nimport { sendMouse } from '../../../test/plugins/browser.js';\n\ndescribe('Overlay Trigger - Hover and Click', () => {\n it('toggles open and closed on click', async () => {\n const el = await fixture<OverlayTrigger>(html`\n <overlay-trigger>\n <sp-button slot=\"trigger\">Click and hover</sp-button>\n <sp-popover slot=\"click-content\" dialog tip>\n Popover content\n </sp-popover>\n <sp-tooltip slot=\"hover-content\" delayed>\n Tooltip content\n </sp-tooltip>\n </overlay-trigger>\n `);\n const trigger = el.querySelector(\n '[slot=trigger]'\n ) as unknown as ActionButton;\n let interaction: TriggerInteractions;\n\n // repeatedly click to toggle the popover\n for (let i = 0; i < 3; i++) {\n const openedEvent = oneEvent(el, 'sp-opened');\n trigger.click();\n interaction = (await openedEvent).detail.interaction;\n\n expect(interaction).equals('click');\n\n const closedEvent = oneEvent(el, 'sp-closed');\n trigger.click();\n interaction = (await closedEvent).detail.interaction;\n\n expect(interaction).equals('click');\n }\n });\n it('toggles on click after hover', async () => {\n const el = await fixture<OverlayTrigger>(html`\n <overlay-trigger>\n <sp-button slot=\"trigger\">Click and hover</sp-button>\n <sp-popover slot=\"click-content\" dialog tip>\n Popover content\n </sp-popover>\n <sp-tooltip slot=\"hover-content\" delayed>\n Tooltip content\n </sp-tooltip>\n </overlay-trigger>\n `);\n const trigger = el.querySelector(\n '[slot=trigger]'\n ) as unknown as ActionButton;\n const bounds = el.getBoundingClientRect();\n let interaction: TriggerInteractions;\n\n // hover over the button to trigger the tooltip\n const hoveredEvent = oneEvent(el, 'sp-opened');\n sendMouse({\n steps: [\n {\n type: 'move',\n position: [bounds.left - 1, bounds.top - 1],\n },\n {\n type: 'move',\n position: [bounds.left, bounds.top],\n },\n {\n type: 'move',\n position: [bounds.left + 1, bounds.top + 1],\n },\n ],\n });\n interaction = (await hoveredEvent).detail.interaction;\n\n expect(interaction).equals('hover');\n\n // repeatedly click to toggle the popover\n for (let i = 0; i < 3; i++) {\n const openedEvent = oneEvent(el, 'sp-opened');\n trigger.click();\n interaction = (await openedEvent).detail.interaction;\n\n expect(interaction).equals('click');\n\n const closedEvent = oneEvent(el, 'sp-closed');\n trigger.click();\n interaction = (await closedEvent).detail.interaction;\n\n expect(interaction).equals('click');\n }\n });\n});\n"],
5
- "mappings": "AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA,SAAS,qCAAqC,MAAM;AAChD,KAAG,oCAAoC,YAAY;AAC/C,UAAM,KAAK,MAAM,QAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUxC;AACD,UAAM,UAAU,GAAG,cACf,gBACJ;AACA,QAAI;AAGJ,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,oBAAe,OAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAElC,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,oBAAe,OAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAAA,IACtC;AAAA,EACJ,CAAC;AACD,KAAG,gCAAgC,YAAY;AAC3C,UAAM,KAAK,MAAM,QAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUxC;AACD,UAAM,UAAU,GAAG,cACf,gBACJ;AACA,UAAM,SAAS,GAAG,sBAAsB;AACxC,QAAI;AAGJ,UAAM,eAAe,SAAS,IAAI,WAAW;AAC7C,cAAU;AAAA,MACN,OAAO;AAAA,QACH;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,OAAO,GAAG,OAAO,MAAM,CAAC;AAAA,QAC9C;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,MAAM,OAAO,GAAG;AAAA,QACtC;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,OAAO,GAAG,OAAO,MAAM,CAAC;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,kBAAe,OAAM,cAAc,OAAO;AAE1C,WAAO,WAAW,EAAE,OAAO,OAAO;AAGlC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,oBAAe,OAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAElC,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,oBAAe,OAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAAA,IACtC;AAAA,EACJ,CAAC;AACL,CAAC;",
5
+ "mappings": ";AAWA,SAAS,QAAQ,SAAS,MAAM,gBAAgB;AAChD,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AAGP,OAAO;AAEP,SAAS,iBAAiB;AAE1B,SAAS,qCAAqC,MAAM;AAChD,KAAG,oCAAoC,YAAY;AAC/C,UAAM,KAAK,MAAM,QAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUxC;AACD,UAAM,UAAU,GAAG;AAAA,MACf;AAAA,IACJ;AACA,QAAI;AAGJ,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,qBAAe,MAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAElC,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,qBAAe,MAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAAA,IACtC;AAAA,EACJ,CAAC;AACD,KAAG,gCAAgC,YAAY;AAC3C,UAAM,KAAK,MAAM,QAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUxC;AACD,UAAM,UAAU,GAAG;AAAA,MACf;AAAA,IACJ;AACA,UAAM,SAAS,GAAG,sBAAsB;AACxC,QAAI;AAGJ,UAAM,eAAe,SAAS,IAAI,WAAW;AAC7C,cAAU;AAAA,MACN,OAAO;AAAA,QACH;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,OAAO,GAAG,OAAO,MAAM,CAAC;AAAA,QAC9C;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,MAAM,OAAO,GAAG;AAAA,QACtC;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,OAAO,GAAG,OAAO,MAAM,CAAC;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,mBAAe,MAAM,cAAc,OAAO;AAE1C,WAAO,WAAW,EAAE,OAAO,OAAO;AAGlC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,qBAAe,MAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAElC,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,cAAQ,MAAM;AACd,qBAAe,MAAM,aAAa,OAAO;AAEzC,aAAO,WAAW,EAAE,OAAO,OAAO;AAAA,IACtC;AAAA,EACJ,CAAC;AACL,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,22 +1,47 @@
1
+ "use strict";
1
2
  import {
2
3
  aTimeout,
3
4
  elementUpdated,
4
5
  expect,
5
6
  fixture,
6
7
  html,
8
+ nextFrame,
7
9
  oneEvent,
8
10
  waitUntil
9
11
  } from "@open-wc/testing";
12
+ import "@spectrum-web-components/overlay/overlay-trigger.js";
10
13
  import "@spectrum-web-components/popover/sp-popover.js";
14
+ import "@spectrum-web-components/button/sp-button.js";
15
+ import "@spectrum-web-components/tooltip/sp-tooltip.js";
16
+ import "@spectrum-web-components/dialog/sp-dialog-wrapper.js";
11
17
  import "@spectrum-web-components/action-button/sp-action-button.js";
12
18
  import "@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js";
13
- import "@spectrum-web-components/overlay/overlay-trigger.js";
14
19
  import { spy } from "sinon";
20
+ import { sendKeys } from "@web/test-runner-commands";
21
+ import "@spectrum-web-components/theme/sp-theme.js";
22
+ import "@spectrum-web-components/theme/src/themes.js";
23
+ async function styledFixture(story) {
24
+ const test = await fixture(html`
25
+ <sp-theme theme="spectrum" scale="medium" color="light">
26
+ ${story}
27
+ </sp-theme>
28
+ `);
29
+ return test.children[0];
30
+ }
15
31
  describe("Overlay Trigger - Hover", () => {
32
+ afterEach(async () => {
33
+ const el = document.querySelector("overlay-trigger");
34
+ if (el.open) {
35
+ const closed = oneEvent(el, "sp-closed");
36
+ el.open = void 0;
37
+ await closed;
38
+ }
39
+ });
16
40
  it("displays `hover` declaratively", async () => {
17
41
  const openedSpy = spy();
18
42
  const closedSpy = spy();
19
- const el = await fixture((() => html`
43
+ const el = await fixture(
44
+ (() => html`
20
45
  <overlay-trigger
21
46
  placement="right-start"
22
47
  open="hover"
@@ -28,9 +53,14 @@ describe("Overlay Trigger - Hover", () => {
28
53
  </sp-action-button>
29
54
  <sp-popover slot="hover-content" tip></sp-popover>
30
55
  </overlay-trigger>
31
- `)());
56
+ `)()
57
+ );
32
58
  await elementUpdated(el);
33
- await waitUntil(() => openedSpy.calledOnce, "hover content projected to overlay", { timeout: 2e3 });
59
+ await waitUntil(
60
+ () => openedSpy.calledOnce,
61
+ "hover content projected to overlay",
62
+ { timeout: 2e3 }
63
+ );
34
64
  el.removeAttribute("open");
35
65
  await elementUpdated(el);
36
66
  await waitUntil(() => closedSpy.calledOnce, "hover content returned", {
@@ -38,20 +68,24 @@ describe("Overlay Trigger - Hover", () => {
38
68
  });
39
69
  });
40
70
  it("persists hover content", async () => {
41
- const el = await fixture((() => html`
71
+ const el = await fixture(
72
+ (() => html`
42
73
  <overlay-trigger placement="right-start">
43
74
  <sp-action-button slot="trigger">
44
75
  <sp-icon-magnify slot="icon"></sp-icon-magnify>
45
76
  </sp-action-button>
46
77
  <sp-popover slot="hover-content" tip></sp-popover>
47
78
  </overlay-trigger>
48
- `)());
79
+ `)()
80
+ );
49
81
  await elementUpdated(el);
50
82
  expect(el.open).to.be.undefined;
51
83
  const trigger = el.querySelector('[slot="trigger"]');
52
- trigger.dispatchEvent(new Event("mouseenter", {
53
- bubbles: true
54
- }));
84
+ trigger.dispatchEvent(
85
+ new Event("mouseenter", {
86
+ bubbles: true
87
+ })
88
+ );
55
89
  await elementUpdated(el);
56
90
  expect(el.open).to.equal("hover");
57
91
  trigger.click();
@@ -59,7 +93,8 @@ describe("Overlay Trigger - Hover", () => {
59
93
  expect(el.open).to.equal("hover");
60
94
  });
61
95
  it("closes persistent hover content on `longpress`", async () => {
62
- const el = await fixture((() => html`
96
+ const el = await fixture(
97
+ (() => html`
63
98
  <overlay-trigger placement="right-start">
64
99
  <sp-action-button slot="trigger">
65
100
  <sp-icon-magnify slot="icon"></sp-icon-magnify>
@@ -67,30 +102,37 @@ describe("Overlay Trigger - Hover", () => {
67
102
  <sp-popover slot="hover-content" tip></sp-popover>
68
103
  <sp-popover slot="longpress-content" tip></sp-popover>
69
104
  </overlay-trigger>
70
- `)());
105
+ `)()
106
+ );
71
107
  await elementUpdated(el);
72
108
  expect(el.open).to.be.undefined;
73
109
  const trigger = el.querySelector('[slot="trigger"]');
74
- trigger.dispatchEvent(new Event("mouseenter", {
75
- bubbles: true
76
- }));
110
+ trigger.dispatchEvent(
111
+ new Event("mouseenter", {
112
+ bubbles: true
113
+ })
114
+ );
77
115
  await elementUpdated(el);
78
116
  expect(el.open).to.equal("hover");
79
- trigger.dispatchEvent(new Event("longpress", {
80
- bubbles: true
81
- }));
117
+ trigger.dispatchEvent(
118
+ new Event("longpress", {
119
+ bubbles: true
120
+ })
121
+ );
82
122
  await elementUpdated(el);
83
123
  expect(el.open).to.equal("longpress");
84
124
  });
85
125
  it('closes `hover` overlay when [type="modal"]', async () => {
86
- const el = await fixture((() => html`
126
+ const el = await fixture(
127
+ (() => html`
87
128
  <overlay-trigger placement="right-start" type="modal">
88
129
  <sp-action-button slot="trigger">
89
130
  <sp-icon-magnify slot="icon"></sp-icon-magnify>
90
131
  </sp-action-button>
91
132
  <sp-popover slot="hover-content" tip></sp-popover>
92
133
  </overlay-trigger>
93
- `)());
134
+ `)()
135
+ );
94
136
  await elementUpdated(el);
95
137
  expect(el.open).to.be.undefined;
96
138
  const trigger = el.querySelector('[slot="trigger"]');
@@ -106,5 +148,54 @@ describe("Overlay Trigger - Hover", () => {
106
148
  await elementUpdated(el);
107
149
  expect(el.open).to.be.null;
108
150
  });
151
+ it('will not return focus to a "modal" parent', async () => {
152
+ const el = await styledFixture(html`
153
+ <overlay-trigger type="modal" placement="none">
154
+ <sp-button slot="trigger">Toggle Dialog</sp-button>
155
+ <sp-dialog-wrapper
156
+ slot="click-content"
157
+ headline="Dialog title"
158
+ size="s"
159
+ >
160
+ ${[1, 2, 3, 4].map(
161
+ (index) => html`
162
+ <overlay-trigger>
163
+ <sp-button slot="trigger" id="button-${index}">
164
+ Button with Tooltip ${index}
165
+ </sp-button>
166
+ <sp-tooltip slot="hover-content">
167
+ Tooltip ${index}
168
+ </sp-tooltip>
169
+ </overlay-trigger>
170
+ `
171
+ )}
172
+ </sp-dialog-wrapper>
173
+ </overlay-trigger>
174
+ `);
175
+ await elementUpdated(el);
176
+ const button = el.querySelector("sp-button");
177
+ const dialog = el.querySelector("sp-dialog-wrapper");
178
+ await elementUpdated(button);
179
+ await elementUpdated(dialog);
180
+ let opened = oneEvent(button, "sp-opened");
181
+ button.dispatchEvent(new Event("click", { bubbles: true }));
182
+ await opened;
183
+ const button1 = dialog.querySelector("#button-1");
184
+ const button2 = dialog.querySelector("#button-2");
185
+ opened = oneEvent(button1, "sp-opened");
186
+ sendKeys({
187
+ press: "Tab"
188
+ });
189
+ await opened;
190
+ await nextFrame();
191
+ expect(button1 === document.activeElement).to.be.true;
192
+ opened = oneEvent(button2, "sp-opened");
193
+ sendKeys({
194
+ press: "Tab"
195
+ });
196
+ await opened;
197
+ await nextFrame();
198
+ expect(button2 === document.activeElement).to.be.true;
199
+ });
109
200
  });
110
201
  //# sourceMappingURL=overlay-trigger-hover.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["overlay-trigger-hover.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 aTimeout,\n elementUpdated,\n expect,\n fixture,\n html,\n oneEvent,\n waitUntil,\n} from '@open-wc/testing';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport { OverlayTrigger } from '@spectrum-web-components/overlay';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport { spy } from 'sinon';\nimport { ActionButton } from '@spectrum-web-components/action-button';\n\ndescribe('Overlay Trigger - Hover', () => {\n it('displays `hover` 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=\"hover\"\n @sp-opened=${() => openedSpy()}\n @sp-closed=${() => closedSpy()}\n >\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n await waitUntil(\n () => openedSpy.calledOnce,\n 'hover content projected to overlay',\n { timeout: 2000 }\n );\n\n el.removeAttribute('open');\n await elementUpdated(el);\n\n await waitUntil(() => closedSpy.calledOnce, 'hover content returned', {\n timeout: 2000,\n });\n });\n it('persists hover content', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n expect(el.open).to.be.undefined;\n\n const trigger = el.querySelector('[slot=\"trigger\"]') as ActionButton;\n trigger.dispatchEvent(\n new Event('mouseenter', {\n bubbles: true,\n })\n );\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('hover');\n\n trigger.click();\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('hover');\n });\n it('closes persistent hover content on `longpress`', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n <sp-popover slot=\"longpress-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n expect(el.open).to.be.undefined;\n\n const trigger = el.querySelector('[slot=\"trigger\"]') as ActionButton;\n trigger.dispatchEvent(\n new Event('mouseenter', {\n bubbles: true,\n })\n );\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('hover');\n\n trigger.dispatchEvent(\n new Event('longpress', {\n bubbles: true,\n })\n );\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('longpress');\n });\n it('closes `hover` overlay when [type=\"modal\"]', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\" type=\"modal\">\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n expect(el.open).to.be.undefined;\n\n const trigger = el.querySelector('[slot=\"trigger\"]') as ActionButton;\n const opened = oneEvent(el, 'sp-opened');\n trigger.focus();\n await opened;\n\n await elementUpdated(el);\n await aTimeout(500);\n\n expect(el.open).to.equal('hover');\n\n const closed = oneEvent(el, 'sp-closed');\n trigger.blur();\n await closed;\n\n await elementUpdated(el);\n\n expect(el.open).to.be.null;\n });\n});\n"],
5
- "mappings": "AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AACA;AACA;AAEA;AACA;AAGA,SAAS,2BAA2B,MAAM;AACtC,KAAG,kCAAkC,YAAY;AAC7C,UAAM,YAAY,IAAI;AACtB,UAAM,YAAY,IAAI;AACtB,UAAM,KAAK,MAAM,QACZ,OAAM;AAAA;AAAA;AAAA;AAAA,iCAIc,MAAM,UAAU;AAAA,iCAChB,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOlC,CACP;AACA,UAAM,eAAe,EAAE;AAEvB,UAAM,UACF,MAAM,UAAU,YAChB,sCACA,EAAE,SAAS,IAAK,CACpB;AAEA,OAAG,gBAAgB,MAAM;AACzB,UAAM,eAAe,EAAE;AAEvB,UAAM,UAAU,MAAM,UAAU,YAAY,0BAA0B;AAAA,MAClE,SAAS;AAAA,IACb,CAAC;AAAA,EACL,CAAC;AACD,KAAG,0BAA0B,YAAY;AACrC,UAAM,KAAK,MAAM,QACZ,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOJ,CACP;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAEtB,UAAM,UAAU,GAAG,cAAc,kBAAkB;AACnD,YAAQ,cACJ,IAAI,MAAM,cAAc;AAAA,MACpB,SAAS;AAAA,IACb,CAAC,CACL;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,YAAQ,MAAM;AAEd,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAAA,EACpC,CAAC;AACD,KAAG,kDAAkD,YAAY;AAC7D,UAAM,KAAK,MAAM,QACZ,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQJ,CACP;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAEtB,UAAM,UAAU,GAAG,cAAc,kBAAkB;AACnD,YAAQ,cACJ,IAAI,MAAM,cAAc;AAAA,MACpB,SAAS;AAAA,IACb,CAAC,CACL;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,YAAQ,cACJ,IAAI,MAAM,aAAa;AAAA,MACnB,SAAS;AAAA,IACb,CAAC,CACL;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,WAAW;AAAA,EACxC,CAAC;AACD,KAAG,8CAA8C,YAAY;AACzD,UAAM,KAAK,MAAM,QACZ,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOJ,CACP;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAEtB,UAAM,UAAU,GAAG,cAAc,kBAAkB;AACnD,UAAM,SAAS,SAAS,IAAI,WAAW;AACvC,YAAQ,MAAM;AACd,UAAM;AAEN,UAAM,eAAe,EAAE;AACvB,UAAM,SAAS,GAAG;AAElB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,UAAM,SAAS,SAAS,IAAI,WAAW;AACvC,YAAQ,KAAK;AACb,UAAM;AAEN,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAAA,EAC1B,CAAC;AACL,CAAC;",
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 aTimeout,\n elementUpdated,\n expect,\n fixture,\n html,\n nextFrame,\n oneEvent,\n waitUntil,\n} from '@open-wc/testing';\nimport '@spectrum-web-components/overlay/overlay-trigger.js';\nimport '@spectrum-web-components/popover/sp-popover.js';\nimport '@spectrum-web-components/button/sp-button.js';\nimport '@spectrum-web-components/tooltip/sp-tooltip.js';\nimport '@spectrum-web-components/dialog/sp-dialog-wrapper.js';\nimport '@spectrum-web-components/action-button/sp-action-button.js';\nimport '@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js';\nimport { OverlayTrigger } from '@spectrum-web-components/overlay';\nimport { spy } from 'sinon';\nimport { ActionButton } from '@spectrum-web-components/action-button';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { Button } from '@spectrum-web-components/button';\nimport '@spectrum-web-components/theme/sp-theme.js';\nimport '@spectrum-web-components/theme/src/themes.js';\nimport { TemplateResult } from '@spectrum-web-components/base';\nimport { Theme } from '@spectrum-web-components/theme';\n\nasync function styledFixture<T extends Element>(\n story: TemplateResult\n): Promise<T> {\n const test = await fixture<Theme>(html`\n <sp-theme theme=\"spectrum\" scale=\"medium\" color=\"light\">\n ${story}\n </sp-theme>\n `);\n return test.children[0] as T;\n}\n\ndescribe('Overlay Trigger - Hover', () => {\n afterEach(async () => {\n const el = document.querySelector('overlay-trigger') as OverlayTrigger;\n if (el.open) {\n const closed = oneEvent(el, 'sp-closed');\n el.open = undefined;\n await closed;\n }\n });\n it('displays `hover` 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=\"hover\"\n @sp-opened=${() => openedSpy()}\n @sp-closed=${() => closedSpy()}\n >\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n await waitUntil(\n () => openedSpy.calledOnce,\n 'hover content projected to overlay',\n { timeout: 2000 }\n );\n\n el.removeAttribute('open');\n await elementUpdated(el);\n\n await waitUntil(() => closedSpy.calledOnce, 'hover content returned', {\n timeout: 2000,\n });\n });\n it('persists hover content', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n expect(el.open).to.be.undefined;\n\n const trigger = el.querySelector('[slot=\"trigger\"]') as ActionButton;\n trigger.dispatchEvent(\n new Event('mouseenter', {\n bubbles: true,\n })\n );\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('hover');\n\n trigger.click();\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('hover');\n });\n it('closes persistent hover content on `longpress`', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\">\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n <sp-popover slot=\"longpress-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n expect(el.open).to.be.undefined;\n\n const trigger = el.querySelector('[slot=\"trigger\"]') as ActionButton;\n trigger.dispatchEvent(\n new Event('mouseenter', {\n bubbles: true,\n })\n );\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('hover');\n\n trigger.dispatchEvent(\n new Event('longpress', {\n bubbles: true,\n })\n );\n\n await elementUpdated(el);\n\n expect(el.open).to.equal('longpress');\n });\n it('closes `hover` overlay when [type=\"modal\"]', async () => {\n const el = await fixture<OverlayTrigger>(\n (() => html`\n <overlay-trigger placement=\"right-start\" type=\"modal\">\n <sp-action-button slot=\"trigger\">\n <sp-icon-magnify slot=\"icon\"></sp-icon-magnify>\n </sp-action-button>\n <sp-popover slot=\"hover-content\" tip></sp-popover>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n\n expect(el.open).to.be.undefined;\n\n const trigger = el.querySelector('[slot=\"trigger\"]') as ActionButton;\n const opened = oneEvent(el, 'sp-opened');\n trigger.focus();\n await opened;\n\n await elementUpdated(el);\n await aTimeout(500);\n\n expect(el.open).to.equal('hover');\n\n const closed = oneEvent(el, 'sp-closed');\n trigger.blur();\n await closed;\n\n await elementUpdated(el);\n\n expect(el.open).to.be.null;\n });\n it('will not return focus to a \"modal\" parent', async () => {\n const el = await styledFixture<OverlayTrigger>(html`\n <overlay-trigger type=\"modal\" placement=\"none\">\n <sp-button slot=\"trigger\">Toggle Dialog</sp-button>\n <sp-dialog-wrapper\n slot=\"click-content\"\n headline=\"Dialog title\"\n size=\"s\"\n >\n ${[1, 2, 3, 4].map(\n (index) => html`\n <overlay-trigger>\n <sp-button slot=\"trigger\" id=\"button-${index}\">\n Button with Tooltip ${index}\n </sp-button>\n <sp-tooltip slot=\"hover-content\">\n Tooltip ${index}\n </sp-tooltip>\n </overlay-trigger>\n `\n )}\n </sp-dialog-wrapper>\n </overlay-trigger>\n `);\n await elementUpdated(el);\n\n const button = el.querySelector('sp-button') as Button;\n const dialog = el.querySelector('sp-dialog-wrapper') as HTMLElement;\n await elementUpdated(button);\n await elementUpdated(dialog);\n\n let opened = oneEvent(button, 'sp-opened');\n button.dispatchEvent(new Event('click', { bubbles: true }));\n await opened;\n const button1 = dialog.querySelector('#button-1') as Button;\n const button2 = dialog.querySelector('#button-2') as Button;\n\n opened = oneEvent(button1, 'sp-opened');\n sendKeys({\n press: 'Tab',\n });\n await opened;\n\n await nextFrame();\n\n expect(button1 === document.activeElement).to.be.true;\n\n opened = oneEvent(button2, 'sp-opened');\n sendKeys({\n press: 'Tab',\n });\n await opened;\n\n await nextFrame();\n\n expect(button2 === document.activeElement).to.be.true;\n });\n});\n"],
5
+ "mappings": ";AAWA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AAEP,SAAS,WAAW;AAEpB,SAAS,gBAAgB;AAEzB,OAAO;AACP,OAAO;AAIP,eAAe,cACX,OACU;AACV,QAAM,OAAO,MAAM,QAAe;AAAA;AAAA,cAExB;AAAA;AAAA,KAET;AACD,SAAO,KAAK,SAAS;AACzB;AAEA,SAAS,2BAA2B,MAAM;AACtC,YAAU,YAAY;AAClB,UAAM,KAAK,SAAS,cAAc,iBAAiB;AACnD,QAAI,GAAG,MAAM;AACT,YAAM,SAAS,SAAS,IAAI,WAAW;AACvC,SAAG,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ,CAAC;AACD,KAAG,kCAAkC,YAAY;AAC7C,UAAM,YAAY,IAAI;AACtB,UAAM,YAAY,IAAI;AACtB,UAAM,KAAK,MAAM;AAAA,OACZ,MAAM;AAAA;AAAA;AAAA;AAAA,iCAIc,MAAM,UAAU;AAAA,iCAChB,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOlC;AAAA,IACP;AACA,UAAM,eAAe,EAAE;AAEvB,UAAM;AAAA,MACF,MAAM,UAAU;AAAA,MAChB;AAAA,MACA,EAAE,SAAS,IAAK;AAAA,IACpB;AAEA,OAAG,gBAAgB,MAAM;AACzB,UAAM,eAAe,EAAE;AAEvB,UAAM,UAAU,MAAM,UAAU,YAAY,0BAA0B;AAAA,MAClE,SAAS;AAAA,IACb,CAAC;AAAA,EACL,CAAC;AACD,KAAG,0BAA0B,YAAY;AACrC,UAAM,KAAK,MAAM;AAAA,OACZ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOJ;AAAA,IACP;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAEtB,UAAM,UAAU,GAAG,cAAc,kBAAkB;AACnD,YAAQ;AAAA,MACJ,IAAI,MAAM,cAAc;AAAA,QACpB,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,YAAQ,MAAM;AAEd,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAAA,EACpC,CAAC;AACD,KAAG,kDAAkD,YAAY;AAC7D,UAAM,KAAK,MAAM;AAAA,OACZ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQJ;AAAA,IACP;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAEtB,UAAM,UAAU,GAAG,cAAc,kBAAkB;AACnD,YAAQ;AAAA,MACJ,IAAI,MAAM,cAAc;AAAA,QACpB,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,YAAQ;AAAA,MACJ,IAAI,MAAM,aAAa;AAAA,QACnB,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AAEA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,WAAW;AAAA,EACxC,CAAC;AACD,KAAG,8CAA8C,YAAY;AACzD,UAAM,KAAK,MAAM;AAAA,OACZ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOJ;AAAA,IACP;AACA,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAEtB,UAAM,UAAU,GAAG,cAAc,kBAAkB;AACnD,UAAM,SAAS,SAAS,IAAI,WAAW;AACvC,YAAQ,MAAM;AACd,UAAM;AAEN,UAAM,eAAe,EAAE;AACvB,UAAM,SAAS,GAAG;AAElB,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,UAAM,SAAS,SAAS,IAAI,WAAW;AACvC,YAAQ,KAAK;AACb,UAAM;AAEN,UAAM,eAAe,EAAE;AAEvB,WAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAAA,EAC1B,CAAC;AACD,KAAG,6CAA6C,YAAY;AACxD,UAAM,KAAK,MAAM,cAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAQjC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,MACX,CAAC,UAAU;AAAA;AAAA,uEAEoC;AAAA,0DACb;AAAA;AAAA;AAAA,8CAGZ;AAAA;AAAA;AAAA;AAAA,IAI1B;AAAA;AAAA;AAAA,SAGX;AACD,UAAM,eAAe,EAAE;AAEvB,UAAM,SAAS,GAAG,cAAc,WAAW;AAC3C,UAAM,SAAS,GAAG,cAAc,mBAAmB;AACnD,UAAM,eAAe,MAAM;AAC3B,UAAM,eAAe,MAAM;AAE3B,QAAI,SAAS,SAAS,QAAQ,WAAW;AACzC,WAAO,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AAC1D,UAAM;AACN,UAAM,UAAU,OAAO,cAAc,WAAW;AAChD,UAAM,UAAU,OAAO,cAAc,WAAW;AAEhD,aAAS,SAAS,SAAS,WAAW;AACtC,aAAS;AAAA,MACL,OAAO;AAAA,IACX,CAAC;AACD,UAAM;AAEN,UAAM,UAAU;AAEhB,WAAO,YAAY,SAAS,aAAa,EAAE,GAAG,GAAG;AAEjD,aAAS,SAAS,SAAS,WAAW;AACtC,aAAS;AAAA,MACL,OAAO;AAAA,IACX,CAAC;AACD,UAAM;AAEN,UAAM,UAAU;AAEhB,WAAO,YAAY,SAAS,aAAa,EAAE,GAAG,GAAG;AAAA,EACrD,CAAC;AACL,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  import {
2
3
  elementUpdated,
3
4
  expect,
@@ -21,7 +22,8 @@ import { sendMouse } from "../../../test/plugins/browser.js";
21
22
  import { findDescribedNode } from "../../../test/testing-helpers-a11y.js";
22
23
  describe("Overlay Trigger - Longpress", () => {
23
24
  it("displays `longpress` content", async () => {
24
- const el = await fixture((() => html`
25
+ const el = await fixture(
26
+ (() => html`
25
27
  <overlay-trigger placement="right-start">
26
28
  <sp-action-button slot="trigger" hold-affordance>
27
29
  <sp-icon-magnify slot="icon"></sp-icon-magnify>
@@ -44,10 +46,13 @@ describe("Overlay Trigger - Longpress", () => {
44
46
  </sp-action-group>
45
47
  </sp-popover>
46
48
  </overlay-trigger>
47
- `)());
49
+ `)()
50
+ );
48
51
  await elementUpdated(el);
49
52
  const trigger = el.querySelector("sp-action-button");
50
- const content = el.querySelector('[slot="longpress-content"]');
53
+ const content = el.querySelector(
54
+ '[slot="longpress-content"]'
55
+ );
51
56
  expect(trigger).to.not.be.null;
52
57
  expect(content).to.not.be.null;
53
58
  expect(content.open).to.be.false;
@@ -77,7 +82,7 @@ describe("Overlay Trigger - Longpress", () => {
77
82
  expect(!content.open, "closes for `Alt+ArrowDown`").to.be.true;
78
83
  await elementUpdated(el);
79
84
  open = oneEvent(el, "sp-opened");
80
- trigger.dispatchEvent(new Event("pointerdown"));
85
+ trigger.dispatchEvent(new PointerEvent("pointerdown", { button: 0 }));
81
86
  await open;
82
87
  expect(content.open, "opens for `pointerdown`").to.be.true;
83
88
  closed = oneEvent(el, "sp-closed");
@@ -90,7 +95,8 @@ describe("Overlay Trigger - Longpress", () => {
90
95
  it("displays `longpress` declaratively", async () => {
91
96
  const openedSpy = spy();
92
97
  const closedSpy = spy();
93
- const el = await fixture((() => html`
98
+ const el = await fixture(
99
+ (() => html`
94
100
  <overlay-trigger
95
101
  placement="right-start"
96
102
  open="longpress"
@@ -102,16 +108,22 @@ describe("Overlay Trigger - Longpress", () => {
102
108
  </sp-action-button>
103
109
  <sp-popover slot="longpress-content" tip></sp-popover>
104
110
  </overlay-trigger>
105
- `)());
111
+ `)()
112
+ );
106
113
  await elementUpdated(el);
107
- await waitUntil(() => openedSpy.calledOnce, "longpress content projected to overlay", { timeout: 2e3 });
114
+ await waitUntil(
115
+ () => openedSpy.calledOnce,
116
+ "longpress content projected to overlay",
117
+ { timeout: 2e3 }
118
+ );
108
119
  const closed = oneEvent(el, "sp-closed");
109
120
  el.removeAttribute("open");
110
121
  await closed;
111
122
  expect(closedSpy.calledOnce, "longpress content returned").to.be.true;
112
123
  });
113
124
  it("describes longpress interaction accessibly", async () => {
114
- const el = await fixture(html`
125
+ const el = await fixture(
126
+ html`
115
127
  <overlay-trigger placement="right-start">
116
128
  <sp-action-button slot="trigger" hold-affordance>
117
129
  Trigger with hold affordance
@@ -134,19 +146,28 @@ describe("Overlay Trigger - Longpress", () => {
134
146
  </sp-action-group>
135
147
  </sp-popover>
136
148
  </overlay-trigger>
137
- `);
149
+ `
150
+ );
138
151
  const trigger = el.querySelector('[slot="trigger"]');
139
152
  await elementUpdated(el);
140
153
  expect(trigger.hasAttribute("aria-describedby")).to.be.true;
141
154
  expect(el.open).to.be.undefined;
142
155
  expect(el.childNodes.length, "always").to.equal(6);
143
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
156
+ await findDescribedNode(
157
+ "Trigger with hold affordance",
158
+ LONGPRESS_INSTRUCTIONS.keyboard
159
+ );
144
160
  const opened = oneEvent(el, "sp-opened");
145
- trigger.dispatchEvent(new Event("longpress", { bubbles: true, composed: true }));
161
+ trigger.dispatchEvent(
162
+ new Event("longpress", { bubbles: true, composed: true })
163
+ );
146
164
  await opened;
147
165
  expect(el.open).to.equal("longpress");
148
166
  expect(el.childNodes.length, "always").to.equal(6);
149
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
167
+ await findDescribedNode(
168
+ "Trigger with hold affordance",
169
+ LONGPRESS_INSTRUCTIONS.keyboard
170
+ );
150
171
  const closed = oneEvent(el, "sp-closed");
151
172
  await sendKeys({
152
173
  press: "Escape"
@@ -155,10 +176,14 @@ describe("Overlay Trigger - Longpress", () => {
155
176
  expect(el.open).to.be.null;
156
177
  expect(trigger.hasAttribute("aria-describedby")).to.be.true;
157
178
  expect(el.childNodes.length, "always").to.equal(6);
158
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
179
+ await findDescribedNode(
180
+ "Trigger with hold affordance",
181
+ LONGPRESS_INSTRUCTIONS.keyboard
182
+ );
159
183
  });
160
184
  it("removes longpress `aria-describedby` description element when longpress content is removed", async () => {
161
- const el = await fixture(html`
185
+ const el = await fixture(
186
+ html`
162
187
  <overlay-trigger placement="right-start">
163
188
  <sp-action-button slot="trigger" hold-affordance>
164
189
  Trigger with hold affordance
@@ -181,9 +206,12 @@ describe("Overlay Trigger - Longpress", () => {
181
206
  </sp-action-group>
182
207
  </sp-popover>
183
208
  </overlay-trigger>
184
- `);
209
+ `
210
+ );
185
211
  const trigger = el.querySelector('[slot="trigger"]');
186
- const content = el.querySelector('[slot="longpress-content"]');
212
+ const content = el.querySelector(
213
+ '[slot="longpress-content"]'
214
+ );
187
215
  await elementUpdated(el);
188
216
  expect(el.hasLongpressContent).to.be.true;
189
217
  expect(el.childNodes.length, "always").to.equal(6);
@@ -196,12 +224,16 @@ describe("Overlay Trigger - Longpress", () => {
196
224
  el.setAttribute("hold-affordance", "true");
197
225
  el.append(content);
198
226
  await elementUpdated(el);
199
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
227
+ await findDescribedNode(
228
+ "Trigger with hold affordance",
229
+ LONGPRESS_INSTRUCTIONS.keyboard
230
+ );
200
231
  expect(el.hasLongpressContent).to.be.true;
201
232
  expect(el.childNodes.length, "always").to.equal(6);
202
233
  });
203
234
  it("recognises multiple overlay triggers in a11y tree", async () => {
204
- const el = await fixture(html`
235
+ const el = await fixture(
236
+ html`
205
237
  <div id="container">
206
238
  <overlay-trigger id="first-trigger" placement="right-start">
207
239
  <sp-action-button slot="trigger" hold-affordance>
@@ -240,19 +272,31 @@ describe("Overlay Trigger - Longpress", () => {
240
272
  </sp-popover>
241
273
  </overlay-trigger>
242
274
  </div>
243
- `);
275
+ `
276
+ );
244
277
  await elementUpdated(el);
245
278
  const div = document.getElementById("container");
246
- const firstTrigger = document.getElementById("first-trigger");
247
- const secondTrigger = document.getElementById("second-trigger");
279
+ const firstTrigger = document.getElementById(
280
+ "first-trigger"
281
+ );
282
+ const secondTrigger = document.getElementById(
283
+ "second-trigger"
284
+ );
248
285
  expect(firstTrigger.hasLongpressContent).to.be.true;
249
286
  expect(secondTrigger.hasLongpressContent).to.be.true;
250
287
  expect(div.childNodes.length, "always").to.equal(5);
251
- await findDescribedNode("First button", LONGPRESS_INSTRUCTIONS.keyboard);
252
- await findDescribedNode("Second button", LONGPRESS_INSTRUCTIONS.keyboard);
288
+ await findDescribedNode(
289
+ "First button",
290
+ LONGPRESS_INSTRUCTIONS.keyboard
291
+ );
292
+ await findDescribedNode(
293
+ "Second button",
294
+ LONGPRESS_INSTRUCTIONS.keyboard
295
+ );
253
296
  });
254
297
  it("describes interactions differently to the user", async () => {
255
- const test = await fixture(html`
298
+ const test = await fixture(
299
+ html`
256
300
  <div>
257
301
  <input id="first" />
258
302
  <overlay-trigger placement="right-start">
@@ -285,12 +329,15 @@ describe("Overlay Trigger - Longpress", () => {
285
329
  </overlay-trigger>
286
330
  <input id="last" />
287
331
  </div>
288
- `);
332
+ `
333
+ );
289
334
  const el = test.querySelector("overlay-trigger");
290
335
  const first = test.querySelector("#first");
291
336
  const firstRect = first.getBoundingClientRect();
292
337
  const trigger = el.querySelector("sp-action-button");
293
- const content = el.querySelector('[slot="longpress-content"]');
338
+ const content = el.querySelector(
339
+ '[slot="longpress-content"]'
340
+ );
294
341
  await elementUpdated(el);
295
342
  expect(trigger).to.not.be.null;
296
343
  expect(content).to.not.be.null;
@@ -301,11 +348,17 @@ describe("Overlay Trigger - Longpress", () => {
301
348
  press: "Tab"
302
349
  });
303
350
  expect(document.activeElement === trigger, "Trigger focused").to.be.true;
304
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
351
+ await findDescribedNode(
352
+ "Trigger with hold affordance",
353
+ LONGPRESS_INSTRUCTIONS.keyboard
354
+ );
305
355
  await sendKeys({
306
356
  press: "Tab"
307
357
  });
308
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
358
+ await findDescribedNode(
359
+ "Trigger with hold affordance",
360
+ LONGPRESS_INSTRUCTIONS.keyboard
361
+ );
309
362
  await sendMouse({
310
363
  steps: [
311
364
  {
@@ -317,7 +370,10 @@ describe("Overlay Trigger - Longpress", () => {
317
370
  trigger.focus();
318
371
  await nextFrame();
319
372
  await nextFrame();
320
- await findDescribedNode("Trigger with hold affordance", LONGPRESS_INSTRUCTIONS.keyboard);
373
+ await findDescribedNode(
374
+ "Trigger with hold affordance",
375
+ LONGPRESS_INSTRUCTIONS.keyboard
376
+ );
321
377
  });
322
378
  });
323
379
  //# sourceMappingURL=overlay-trigger-longpress.test.js.map