@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.
- package/README.md +3 -0
- package/active-overlay.dev.js +1 -0
- package/active-overlay.dev.js.map +1 -1
- package/active-overlay.js +1 -2
- package/active-overlay.js.map +2 -2
- package/overlay-trigger.dev.js +1 -0
- package/overlay-trigger.dev.js.map +1 -1
- package/overlay-trigger.js +1 -2
- package/overlay-trigger.js.map +2 -2
- package/package.json +6 -6
- package/src/ActiveOverlay.dev.js +57 -23
- package/src/ActiveOverlay.dev.js.map +2 -2
- package/src/ActiveOverlay.js +8 -437
- package/src/ActiveOverlay.js.map +2 -2
- package/src/OverlayTrigger.dev.js +51 -18
- package/src/OverlayTrigger.dev.js.map +1 -1
- package/src/OverlayTrigger.js +2 -265
- package/src/OverlayTrigger.js.map +2 -2
- package/src/VirtualTrigger.dev.js +1 -0
- package/src/VirtualTrigger.dev.js.map +1 -1
- package/src/VirtualTrigger.js +1 -29
- package/src/VirtualTrigger.js.map +2 -2
- package/src/active-overlay.css.dev.js +1 -0
- package/src/active-overlay.css.dev.js.map +1 -1
- package/src/active-overlay.css.js +2 -4
- package/src/active-overlay.css.js.map +2 -2
- package/src/index.dev.js +1 -0
- package/src/index.dev.js.map +1 -1
- package/src/index.js +1 -6
- package/src/index.js.map +1 -1
- package/src/loader.dev.js +1 -0
- package/src/loader.dev.js.map +1 -1
- package/src/loader.js +1 -4
- package/src/loader.js.map +2 -2
- package/src/overlay-events.dev.js +1 -0
- package/src/overlay-events.dev.js.map +1 -1
- package/src/overlay-events.js +1 -6
- package/src/overlay-events.js.map +2 -2
- package/src/overlay-stack.dev.js +95 -44
- package/src/overlay-stack.dev.js.map +3 -3
- package/src/overlay-stack.js +2 -405
- package/src/overlay-stack.js.map +3 -3
- package/src/overlay-timer.dev.js +1 -0
- package/src/overlay-timer.dev.js.map +1 -1
- package/src/overlay-timer.js +1 -70
- package/src/overlay-timer.js.map +2 -2
- package/src/overlay-trigger.css.dev.js +1 -0
- package/src/overlay-trigger.css.dev.js.map +1 -1
- package/src/overlay-trigger.css.js +2 -4
- package/src/overlay-trigger.css.js.map +2 -2
- package/src/overlay-types.dev.js +1 -0
- package/src/overlay-types.js +1 -0
- package/src/overlay-utils.dev.js +4 -1
- package/src/overlay-utils.dev.js.map +1 -1
- package/src/overlay-utils.js +1 -27
- package/src/overlay-utils.js.map +2 -2
- package/src/overlay.dev.js +1 -0
- package/src/overlay.dev.js.map +1 -1
- package/src/overlay.js +1 -84
- package/src/overlay.js.map +2 -2
- package/stories/overlay-story-components.js +17 -5
- package/stories/overlay-story-components.js.map +2 -2
- package/stories/overlay.stories.js +24 -8
- package/stories/overlay.stories.js.map +1 -1
- package/sync/overlay-trigger.dev.js +1 -0
- package/sync/overlay-trigger.dev.js.map +1 -1
- package/sync/overlay-trigger.js +1 -6
- package/sync/overlay-trigger.js.map +2 -2
- package/test/benchmark/basic-test.js +5 -2
- package/test/benchmark/basic-test.js.map +1 -1
- package/test/overlay-lifecycle.test.js +51 -14
- package/test/overlay-lifecycle.test.js.map +1 -1
- package/test/overlay-timer.test.js +1 -0
- package/test/overlay-timer.test.js.map +2 -2
- package/test/overlay-trigger-click.test.js +20 -5
- package/test/overlay-trigger-click.test.js.map +1 -1
- package/test/overlay-trigger-extended.test.js +19 -6
- package/test/overlay-trigger-extended.test.js.map +1 -1
- package/test/overlay-trigger-hover-click.test.js +7 -2
- package/test/overlay-trigger-hover-click.test.js.map +1 -1
- package/test/overlay-trigger-hover.test.js +110 -19
- package/test/overlay-trigger-hover.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +85 -29
- package/test/overlay-trigger-longpress.test.js.map +2 -2
- package/test/overlay-trigger-sync.test.js +183 -56
- package/test/overlay-trigger-sync.test.js.map +2 -2
- package/test/overlay-trigger.test.js +183 -56
- package/test/overlay-trigger.test.js.map +2 -2
- package/test/overlay.test-vrt.js +1 -0
- package/test/overlay.test-vrt.js.map +1 -1
- package/test/overlay.test.js +162 -74
- 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(
|
|
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(
|
|
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;
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
53
|
-
|
|
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(
|
|
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(
|
|
75
|
-
|
|
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(
|
|
80
|
-
|
|
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(
|
|
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/
|
|
5
|
-
"mappings": "AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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": "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",
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
156
|
+
await findDescribedNode(
|
|
157
|
+
"Trigger with hold affordance",
|
|
158
|
+
LONGPRESS_INSTRUCTIONS.keyboard
|
|
159
|
+
);
|
|
144
160
|
const opened = oneEvent(el, "sp-opened");
|
|
145
|
-
trigger.dispatchEvent(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
247
|
-
|
|
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(
|
|
252
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|