@spectrum-web-components/overlay 0.36.0 → 0.37.0
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 +266 -149
- package/custom-elements.json +1678 -553
- package/package.json +49 -22
- package/sp-overlay.d.ts +6 -0
- package/sp-overlay.dev.js +5 -0
- package/{active-overlay.dev.js.map → sp-overlay.dev.js.map} +3 -3
- package/sp-overlay.js +2 -0
- package/{active-overlay.js.map → sp-overlay.js.map} +4 -4
- package/src/AbstractOverlay.d.ts +58 -0
- package/src/AbstractOverlay.dev.js +211 -0
- package/src/AbstractOverlay.dev.js.map +7 -0
- package/src/AbstractOverlay.js +2 -0
- package/src/AbstractOverlay.js.map +7 -0
- package/src/Overlay.d.ts +163 -0
- package/src/Overlay.dev.js +792 -0
- package/src/Overlay.dev.js.map +7 -0
- package/src/Overlay.js +33 -0
- package/src/Overlay.js.map +7 -0
- package/src/OverlayDialog.d.ts +4 -0
- package/src/OverlayDialog.dev.js +135 -0
- package/src/OverlayDialog.dev.js.map +7 -0
- package/src/OverlayDialog.js +2 -0
- package/src/OverlayDialog.js.map +7 -0
- package/src/OverlayNoPopover.d.ts +4 -0
- package/src/OverlayNoPopover.dev.js +109 -0
- package/src/OverlayNoPopover.dev.js.map +7 -0
- package/src/OverlayNoPopover.js +2 -0
- package/src/OverlayNoPopover.js.map +7 -0
- package/src/OverlayPopover.d.ts +4 -0
- package/src/OverlayPopover.dev.js +169 -0
- package/src/OverlayPopover.dev.js.map +7 -0
- package/src/OverlayPopover.js +2 -0
- package/src/OverlayPopover.js.map +7 -0
- package/src/OverlayStack.d.ts +43 -0
- package/src/OverlayStack.dev.js +150 -0
- package/src/OverlayStack.dev.js.map +7 -0
- package/src/OverlayStack.js +2 -0
- package/src/OverlayStack.js.map +7 -0
- package/src/OverlayTrigger.d.ts +26 -42
- package/src/OverlayTrigger.dev.js +172 -296
- package/src/OverlayTrigger.dev.js.map +3 -3
- package/src/OverlayTrigger.js +49 -25
- package/src/OverlayTrigger.js.map +3 -3
- package/src/PlacementController.d.ts +38 -0
- package/src/PlacementController.dev.js +199 -0
- package/src/PlacementController.dev.js.map +7 -0
- package/src/PlacementController.js +2 -0
- package/src/PlacementController.js.map +7 -0
- package/src/VirtualTrigger.dev.js +2 -1
- package/src/VirtualTrigger.dev.js.map +2 -2
- package/src/VirtualTrigger.js +1 -1
- package/src/VirtualTrigger.js.map +2 -2
- package/src/fullSizePlugin.d.ts +12 -0
- package/src/fullSizePlugin.dev.js +39 -0
- package/src/fullSizePlugin.dev.js.map +7 -0
- package/src/fullSizePlugin.js +2 -0
- package/src/fullSizePlugin.js.map +7 -0
- package/src/index.d.ts +2 -3
- package/src/index.dev.js +2 -3
- package/src/index.dev.js.map +2 -2
- package/src/index.js +1 -1
- package/src/index.js.map +2 -2
- package/src/loader.d.ts +1 -2
- package/src/loader.dev.js +2 -19
- package/src/loader.dev.js.map +2 -2
- package/src/loader.js +1 -1
- package/src/loader.js.map +3 -3
- package/src/overlay-timer.dev.js.map +2 -2
- package/src/overlay-timer.js.map +2 -2
- package/src/overlay-trigger.css.dev.js +1 -1
- package/src/overlay-trigger.css.dev.js.map +1 -1
- package/src/overlay-trigger.css.js +3 -3
- package/src/overlay-trigger.css.js.map +1 -1
- package/src/overlay-types.d.ts +25 -31
- package/src/overlay-types.dev.js +1 -0
- package/src/overlay-types.dev.js.map +3 -3
- package/src/overlay-types.js +1 -1
- package/src/overlay-types.js.map +3 -3
- package/src/overlay.css.dev.js +9 -0
- package/src/overlay.css.dev.js.map +7 -0
- package/src/overlay.css.js +6 -0
- package/src/overlay.css.js.map +7 -0
- package/src/topLayerOverTransforms.d.ts +2 -0
- package/src/topLayerOverTransforms.dev.js +91 -0
- package/src/topLayerOverTransforms.dev.js.map +7 -0
- package/src/topLayerOverTransforms.js +2 -0
- package/src/topLayerOverTransforms.js.map +7 -0
- package/stories/overlay-element.stories.js +476 -0
- package/stories/overlay-element.stories.js.map +7 -0
- package/stories/overlay-story-components.js +9 -8
- package/stories/overlay-story-components.js.map +2 -2
- package/stories/overlay.stories.js +824 -680
- package/stories/overlay.stories.js.map +2 -2
- package/sync/overlay-trigger.d.ts +5 -0
- package/sync/overlay-trigger.dev.js +2 -4
- package/sync/overlay-trigger.dev.js.map +2 -2
- package/sync/overlay-trigger.js +1 -1
- package/sync/overlay-trigger.js.map +3 -3
- package/test/benchmark/basic-test.js +2 -2
- package/test/benchmark/basic-test.js.map +1 -1
- package/test/index.js +414 -377
- package/test/index.js.map +3 -3
- package/test/overlay-element.test-vrt.js +5 -0
- package/test/overlay-element.test-vrt.js.map +7 -0
- package/test/overlay-element.test.js +682 -0
- package/test/overlay-element.test.js.map +7 -0
- package/test/overlay-lifecycle.test.js +36 -106
- package/test/overlay-lifecycle.test.js.map +2 -2
- package/test/overlay-trigger-click.test.js +11 -5
- package/test/overlay-trigger-click.test.js.map +2 -2
- package/test/overlay-trigger-extended.test.js +46 -36
- package/test/overlay-trigger-extended.test.js.map +2 -2
- package/test/overlay-trigger-hover-click.test.js +38 -25
- package/test/overlay-trigger-hover-click.test.js.map +2 -2
- package/test/overlay-trigger-hover.test.js +41 -35
- package/test/overlay-trigger-hover.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +211 -82
- package/test/overlay-trigger-longpress.test.js.map +2 -2
- package/test/overlay-trigger-sync.test.js +1 -1
- package/test/overlay-trigger-sync.test.js.map +2 -2
- package/test/overlay-trigger.test.js +1 -1
- package/test/overlay-trigger.test.js.map +2 -2
- package/test/overlay-update.test.js +5 -5
- package/test/overlay-update.test.js.map +2 -2
- package/test/overlay-v1.test.js +547 -0
- package/test/overlay-v1.test.js.map +7 -0
- package/test/overlay.test.js +385 -269
- package/test/overlay.test.js.map +3 -3
- package/active-overlay.d.ts +0 -6
- package/active-overlay.dev.js +0 -5
- package/active-overlay.js +0 -2
- package/src/ActiveOverlay.d.ts +0 -84
- package/src/ActiveOverlay.dev.js +0 -517
- package/src/ActiveOverlay.dev.js.map +0 -7
- package/src/ActiveOverlay.js +0 -16
- package/src/ActiveOverlay.js.map +0 -7
- package/src/active-overlay.css.dev.js +0 -13
- package/src/active-overlay.css.dev.js.map +0 -7
- package/src/active-overlay.css.js +0 -10
- package/src/active-overlay.css.js.map +0 -7
- package/src/overlay-stack.d.ts +0 -50
- package/src/overlay-stack.dev.js +0 -515
- package/src/overlay-stack.dev.js.map +0 -7
- package/src/overlay-stack.js +0 -34
- package/src/overlay-stack.js.map +0 -7
- package/src/overlay-utils.d.ts +0 -3
- package/src/overlay-utils.dev.js +0 -31
- package/src/overlay-utils.dev.js.map +0 -7
- package/src/overlay-utils.js +0 -2
- package/src/overlay-utils.js.map +0 -7
- package/src/overlay.d.ts +0 -59
- package/src/overlay.dev.js +0 -127
- package/src/overlay.dev.js.map +0 -7
- package/src/overlay.js +0 -2
- package/src/overlay.js.map +0 -7
- /package/src/{active-overlay.css.d.ts → overlay.css.d.ts} +0 -0
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import {
|
|
3
|
-
aTimeout,
|
|
4
3
|
elementUpdated,
|
|
5
4
|
expect,
|
|
6
|
-
fixture,
|
|
7
5
|
html,
|
|
8
6
|
nextFrame,
|
|
9
7
|
oneEvent,
|
|
@@ -20,8 +18,10 @@ import { spy } from "sinon";
|
|
|
20
18
|
import { sendKeys } from "@web/test-runner-commands";
|
|
21
19
|
import "@spectrum-web-components/theme/sp-theme.js";
|
|
22
20
|
import "@spectrum-web-components/theme/src/themes.js";
|
|
23
|
-
import {
|
|
24
|
-
|
|
21
|
+
import {
|
|
22
|
+
fixture,
|
|
23
|
+
ignoreResizeObserverLoopError
|
|
24
|
+
} from "../../../test/testing-helpers.js";
|
|
25
25
|
ignoreResizeObserverLoopError(before, after);
|
|
26
26
|
async function styledFixture(story) {
|
|
27
27
|
const test = await fixture(html`
|
|
@@ -86,14 +86,18 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
86
86
|
it('allows pointer to enter the "tooltip" without closing the "tooltip"', async () => {
|
|
87
87
|
const opened = oneEvent(button, "sp-opened");
|
|
88
88
|
button.dispatchEvent(
|
|
89
|
-
new MouseEvent("
|
|
89
|
+
new MouseEvent("pointerenter", {
|
|
90
90
|
bubbles: true,
|
|
91
91
|
composed: true
|
|
92
92
|
})
|
|
93
93
|
);
|
|
94
94
|
await nextFrame();
|
|
95
|
+
await nextFrame();
|
|
96
|
+
await nextFrame();
|
|
97
|
+
await nextFrame();
|
|
98
|
+
expect(tooltip.open).to.be.true;
|
|
95
99
|
button.dispatchEvent(
|
|
96
|
-
new MouseEvent("
|
|
100
|
+
new MouseEvent("pointerleave", {
|
|
97
101
|
relatedTarget: tooltip,
|
|
98
102
|
bubbles: true,
|
|
99
103
|
composed: true
|
|
@@ -101,7 +105,7 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
101
105
|
);
|
|
102
106
|
await nextFrame();
|
|
103
107
|
tooltip.dispatchEvent(
|
|
104
|
-
new MouseEvent("
|
|
108
|
+
new MouseEvent("pointerleave", {
|
|
105
109
|
relatedTarget: button,
|
|
106
110
|
bubbles: true,
|
|
107
111
|
composed: true
|
|
@@ -111,25 +115,26 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
111
115
|
expect(el.open).to.equal("hover");
|
|
112
116
|
const closed = oneEvent(button, "sp-closed");
|
|
113
117
|
button.dispatchEvent(
|
|
114
|
-
new MouseEvent("
|
|
118
|
+
new MouseEvent("pointerleave", {
|
|
119
|
+
relatedTarget: null,
|
|
115
120
|
bubbles: true,
|
|
116
121
|
composed: true
|
|
117
122
|
})
|
|
118
123
|
);
|
|
119
124
|
await closed;
|
|
120
|
-
expect(el.open).to.be.
|
|
125
|
+
expect(el.open).to.be.undefined;
|
|
121
126
|
});
|
|
122
127
|
it('closes the "tooltip" when leaving the "tooltip"', async () => {
|
|
123
128
|
const opened = oneEvent(button, "sp-opened");
|
|
124
129
|
button.dispatchEvent(
|
|
125
|
-
new MouseEvent("
|
|
130
|
+
new MouseEvent("pointerenter", {
|
|
126
131
|
bubbles: true,
|
|
127
132
|
composed: true
|
|
128
133
|
})
|
|
129
134
|
);
|
|
130
135
|
await nextFrame();
|
|
131
136
|
button.dispatchEvent(
|
|
132
|
-
new MouseEvent("
|
|
137
|
+
new MouseEvent("pointerleave", {
|
|
133
138
|
relatedTarget: tooltip,
|
|
134
139
|
bubbles: true,
|
|
135
140
|
composed: true
|
|
@@ -139,13 +144,14 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
139
144
|
expect(el.open).to.equal("hover");
|
|
140
145
|
const closed = oneEvent(button, "sp-closed");
|
|
141
146
|
tooltip.dispatchEvent(
|
|
142
|
-
new MouseEvent("
|
|
147
|
+
new MouseEvent("pointerleave", {
|
|
148
|
+
relatedTarget: null,
|
|
143
149
|
bubbles: true,
|
|
144
150
|
composed: true
|
|
145
151
|
})
|
|
146
152
|
);
|
|
147
153
|
await closed;
|
|
148
|
-
expect(el.open).to.be.
|
|
154
|
+
expect(el.open).to.be.undefined;
|
|
149
155
|
});
|
|
150
156
|
});
|
|
151
157
|
it("persists hover content", async () => {
|
|
@@ -162,12 +168,14 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
162
168
|
await elementUpdated(el);
|
|
163
169
|
expect(el.open).to.be.undefined;
|
|
164
170
|
const trigger = el.querySelector('[slot="trigger"]');
|
|
171
|
+
const opened = oneEvent(trigger, "sp-opened");
|
|
165
172
|
trigger.dispatchEvent(
|
|
166
|
-
new Event("
|
|
167
|
-
bubbles: true
|
|
173
|
+
new Event("pointerenter", {
|
|
174
|
+
bubbles: true,
|
|
175
|
+
composed: true
|
|
168
176
|
})
|
|
169
177
|
);
|
|
170
|
-
await
|
|
178
|
+
await opened;
|
|
171
179
|
expect(el.open).to.equal("hover");
|
|
172
180
|
trigger.click();
|
|
173
181
|
await elementUpdated(el);
|
|
@@ -188,19 +196,21 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
188
196
|
await elementUpdated(el);
|
|
189
197
|
expect(el.open).to.be.undefined;
|
|
190
198
|
const trigger = el.querySelector('[slot="trigger"]');
|
|
199
|
+
let opened = oneEvent(trigger, "sp-opened");
|
|
191
200
|
trigger.dispatchEvent(
|
|
192
|
-
new Event("
|
|
201
|
+
new Event("pointerenter", {
|
|
193
202
|
bubbles: true
|
|
194
203
|
})
|
|
195
204
|
);
|
|
196
|
-
await
|
|
205
|
+
await opened;
|
|
197
206
|
expect(el.open).to.equal("hover");
|
|
207
|
+
opened = oneEvent(trigger, "sp-opened");
|
|
198
208
|
trigger.dispatchEvent(
|
|
199
209
|
new Event("longpress", {
|
|
200
210
|
bubbles: true
|
|
201
211
|
})
|
|
202
212
|
);
|
|
203
|
-
await
|
|
213
|
+
await opened;
|
|
204
214
|
expect(el.open).to.equal("longpress");
|
|
205
215
|
});
|
|
206
216
|
it('closes `hover` overlay when [type="modal"]', async () => {
|
|
@@ -220,21 +230,15 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
220
230
|
const opened = oneEvent(el, "sp-opened");
|
|
221
231
|
trigger.focus();
|
|
222
232
|
await opened;
|
|
223
|
-
await elementUpdated(el);
|
|
224
|
-
await aTimeout(500);
|
|
225
233
|
expect(el.open).to.equal("hover");
|
|
226
234
|
const closed = oneEvent(el, "sp-closed");
|
|
227
235
|
trigger.blur();
|
|
228
236
|
await closed;
|
|
229
|
-
|
|
230
|
-
expect(el.open).to.be.null;
|
|
237
|
+
expect(el.open).to.be.undefined;
|
|
231
238
|
});
|
|
232
239
|
it('will not return focus to a "modal" parent', async () => {
|
|
233
|
-
if (isFirefox()) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
240
|
const el = await styledFixture(html`
|
|
237
|
-
<overlay-trigger type="modal"
|
|
241
|
+
<overlay-trigger type="modal">
|
|
238
242
|
<sp-button slot="trigger">Toggle Dialog</sp-button>
|
|
239
243
|
<sp-dialog-wrapper
|
|
240
244
|
slot="click-content"
|
|
@@ -259,27 +263,29 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
259
263
|
await elementUpdated(el);
|
|
260
264
|
const button = el.querySelector("sp-button");
|
|
261
265
|
const dialog = el.querySelector("sp-dialog-wrapper");
|
|
266
|
+
const button1 = dialog.querySelector("#button-1");
|
|
267
|
+
const button2 = dialog.querySelector("#button-2");
|
|
268
|
+
const button3 = dialog.querySelector("#button-3");
|
|
262
269
|
await elementUpdated(button);
|
|
263
270
|
await elementUpdated(dialog);
|
|
264
271
|
let opened = oneEvent(button, "sp-opened");
|
|
272
|
+
const openedHint = oneEvent(button1, "sp-opened");
|
|
265
273
|
button.dispatchEvent(new Event("click", { bubbles: true }));
|
|
266
274
|
await opened;
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
opened = oneEvent(
|
|
275
|
+
await openedHint;
|
|
276
|
+
expect(button1 === document.activeElement).to.be.true;
|
|
277
|
+
opened = oneEvent(button2, "sp-opened");
|
|
270
278
|
sendKeys({
|
|
271
279
|
press: "Tab"
|
|
272
280
|
});
|
|
273
281
|
await opened;
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
opened = oneEvent(button2, "sp-opened");
|
|
282
|
+
expect(button2 === document.activeElement).to.be.true;
|
|
283
|
+
opened = oneEvent(button3, "sp-opened");
|
|
277
284
|
sendKeys({
|
|
278
285
|
press: "Tab"
|
|
279
286
|
});
|
|
280
287
|
await opened;
|
|
281
|
-
|
|
282
|
-
expect(button2 === document.activeElement).to.be.true;
|
|
288
|
+
expect(button3 === document.activeElement).to.be.true;
|
|
283
289
|
});
|
|
284
290
|
});
|
|
285
291
|
//# 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 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';\nimport { Tooltip } from '@spectrum-web-components/tooltip';\nimport { ignoreResizeObserverLoopError } from '../../../test/testing-helpers.js';\nimport { isFirefox } from '@spectrum-web-components/shared/src/platform.js';\n\nignoreResizeObserverLoopError(before, after);\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 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 describe('\"tooltip\" mouse interactions', () => {\n let el: OverlayTrigger;\n let button: ActionButton;\n let tooltip: Tooltip;\n beforeEach(async () => {\n 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-tooltip slot=\"hover-content\" tip>\n Magnify\n </sp-tooltip>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n button = el.querySelector('sp-action-button') as ActionButton;\n tooltip = el.querySelector('sp-tooltip') as Tooltip;\n });\n it('allows pointer to enter the \"tooltip\" without closing the \"tooltip\"', async () => {\n const opened = oneEvent(button, 'sp-opened');\n button.dispatchEvent(\n new MouseEvent('mouseenter', {\n bubbles: true,\n composed: true,\n })\n );\n await nextFrame();\n button.dispatchEvent(\n new MouseEvent('mouseleave', {\n relatedTarget: tooltip,\n bubbles: true,\n composed: true,\n })\n );\n await nextFrame();\n tooltip.dispatchEvent(\n new MouseEvent('mouseleave', {\n relatedTarget: button,\n bubbles: true,\n composed: true,\n })\n );\n await opened;\n\n expect(el.open).to.equal('hover');\n\n const closed = oneEvent(button, 'sp-closed');\n button.dispatchEvent(\n new MouseEvent('mouseleave', {\n bubbles: true,\n composed: true,\n })\n );\n await closed;\n\n expect(el.open).to.be.null;\n });\n it('closes the \"tooltip\" when leaving the \"tooltip\"', async () => {\n const opened = oneEvent(button, 'sp-opened');\n button.dispatchEvent(\n new MouseEvent('mouseenter', {\n bubbles: true,\n composed: true,\n })\n );\n await nextFrame();\n button.dispatchEvent(\n new MouseEvent('mouseleave', {\n relatedTarget: tooltip,\n bubbles: true,\n composed: true,\n })\n );\n await opened;\n\n expect(el.open).to.equal('hover');\n\n const closed = oneEvent(button, 'sp-closed');\n tooltip.dispatchEvent(\n new MouseEvent('mouseleave', {\n bubbles: true,\n composed: true,\n })\n );\n await closed;\n\n expect(el.open).to.be.null;\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 // There is an `sp-dialog-base` recyling issue in Firefox\n if (isFirefox()) {\n return;\n }\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,
|
|
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 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';\nimport { Tooltip } from '@spectrum-web-components/tooltip';\nimport {\n fixture,\n ignoreResizeObserverLoopError,\n} from '../../../test/testing-helpers.js';\n\nignoreResizeObserverLoopError(before, after);\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 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 describe('\"tooltip\" mouse interactions', () => {\n let el: OverlayTrigger;\n let button: ActionButton;\n let tooltip: Tooltip;\n beforeEach(async () => {\n 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-tooltip slot=\"hover-content\" tip>\n Magnify\n </sp-tooltip>\n </overlay-trigger>\n `)()\n );\n await elementUpdated(el);\n button = el.querySelector('sp-action-button') as ActionButton;\n tooltip = el.querySelector('sp-tooltip') as Tooltip;\n });\n it('allows pointer to enter the \"tooltip\" without closing the \"tooltip\"', async () => {\n const opened = oneEvent(button, 'sp-opened');\n button.dispatchEvent(\n new MouseEvent('pointerenter', {\n bubbles: true,\n composed: true,\n })\n );\n await nextFrame();\n await nextFrame();\n await nextFrame();\n await nextFrame();\n expect(tooltip.open).to.be.true;\n button.dispatchEvent(\n new MouseEvent('pointerleave', {\n relatedTarget: tooltip,\n bubbles: true,\n composed: true,\n })\n );\n await nextFrame();\n tooltip.dispatchEvent(\n new MouseEvent('pointerleave', {\n relatedTarget: button,\n bubbles: true,\n composed: true,\n })\n );\n await opened;\n\n expect(el.open).to.equal('hover');\n\n const closed = oneEvent(button, 'sp-closed');\n button.dispatchEvent(\n new MouseEvent('pointerleave', {\n relatedTarget: null,\n bubbles: true,\n composed: true,\n })\n );\n await closed;\n\n expect(el.open).to.be.undefined;\n });\n it('closes the \"tooltip\" when leaving the \"tooltip\"', async () => {\n const opened = oneEvent(button, 'sp-opened');\n button.dispatchEvent(\n new MouseEvent('pointerenter', {\n bubbles: true,\n composed: true,\n })\n );\n await nextFrame();\n button.dispatchEvent(\n new MouseEvent('pointerleave', {\n relatedTarget: tooltip,\n bubbles: true,\n composed: true,\n })\n );\n await opened;\n\n expect(el.open).to.equal('hover');\n\n const closed = oneEvent(button, 'sp-closed');\n tooltip.dispatchEvent(\n new MouseEvent('pointerleave', {\n relatedTarget: null,\n bubbles: true,\n composed: true,\n })\n );\n await closed;\n\n expect(el.open).to.be.undefined;\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 const opened = oneEvent(trigger, 'sp-opened');\n trigger.dispatchEvent(\n new Event('pointerenter', {\n bubbles: true,\n composed: true,\n })\n );\n await opened;\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 let opened = oneEvent(trigger, 'sp-opened');\n trigger.dispatchEvent(\n new Event('pointerenter', {\n bubbles: true,\n })\n );\n await opened;\n\n expect(el.open).to.equal('hover');\n\n opened = oneEvent(trigger, 'sp-opened');\n trigger.dispatchEvent(\n new Event('longpress', {\n bubbles: true,\n })\n );\n await opened;\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 expect(el.open).to.equal('hover');\n\n const closed = oneEvent(el, 'sp-closed');\n trigger.blur();\n await closed;\n\n expect(el.open).to.be.undefined;\n });\n it('will not return focus to a \"modal\" parent', async () => {\n const el = await styledFixture<OverlayTrigger>(html`\n <overlay-trigger type=\"modal\">\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 const button1 = dialog.querySelector('#button-1') as Button;\n const button2 = dialog.querySelector('#button-2') as Button;\n const button3 = dialog.querySelector('#button-3') as Button;\n await elementUpdated(button);\n await elementUpdated(dialog);\n\n let opened = oneEvent(button, 'sp-opened');\n const openedHint = oneEvent(button1, 'sp-opened');\n button.dispatchEvent(new Event('click', { bubbles: true }));\n await opened;\n await openedHint;\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 expect(button2 === document.activeElement).to.be.true;\n\n opened = oneEvent(button3, 'sp-opened');\n sendKeys({\n press: 'Tab',\n });\n await opened;\n\n expect(button3 === document.activeElement).to.be.true;\n });\n});\n"],
|
|
5
|
+
"mappings": ";AAWA;AAAA,EACI;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;AAAA,EACI;AAAA,EACA;AAAA,OACG;AAEP,8BAA8B,QAAQ,KAAK;AAE3C,eAAe,cACX,OACU;AACV,QAAM,OAAO,MAAM,QAAe;AAAA;AAAA,cAExB,KAAK;AAAA;AAAA,KAEd;AACD,SAAO,KAAK,SAAS,CAAC;AAC1B;AAEA,SAAS,2BAA2B,MAAM;AACtC,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,CAAC;AAAA,iCACjB,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOnC;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,WAAS,gCAAgC,MAAM;AAC3C,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,eAAW,YAAY;AACnB,WAAK,MAAM;AAAA,SACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBASJ;AAAA,MACP;AACA,YAAM,eAAe,EAAE;AACvB,eAAS,GAAG,cAAc,kBAAkB;AAC5C,gBAAU,GAAG,cAAc,YAAY;AAAA,IAC3C,CAAC;AACD,OAAG,uEAAuE,YAAY;AAClF,YAAM,SAAS,SAAS,QAAQ,WAAW;AAC3C,aAAO;AAAA,QACH,IAAI,WAAW,gBAAgB;AAAA,UAC3B,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM,UAAU;AAChB,YAAM,UAAU;AAChB,YAAM,UAAU;AAChB,YAAM,UAAU;AAChB,aAAO,QAAQ,IAAI,EAAE,GAAG,GAAG;AAC3B,aAAO;AAAA,QACH,IAAI,WAAW,gBAAgB;AAAA,UAC3B,eAAe;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM,UAAU;AAChB,cAAQ;AAAA,QACJ,IAAI,WAAW,gBAAgB;AAAA,UAC3B,eAAe;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM;AAEN,aAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,YAAM,SAAS,SAAS,QAAQ,WAAW;AAC3C,aAAO;AAAA,QACH,IAAI,WAAW,gBAAgB;AAAA,UAC3B,eAAe;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM;AAEN,aAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAAA,IAC1B,CAAC;AACD,OAAG,mDAAmD,YAAY;AAC9D,YAAM,SAAS,SAAS,QAAQ,WAAW;AAC3C,aAAO;AAAA,QACH,IAAI,WAAW,gBAAgB;AAAA,UAC3B,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM,UAAU;AAChB,aAAO;AAAA,QACH,IAAI,WAAW,gBAAgB;AAAA,UAC3B,eAAe;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM;AAEN,aAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,YAAM,SAAS,SAAS,QAAQ,WAAW;AAC3C,cAAQ;AAAA,QACJ,IAAI,WAAW,gBAAgB;AAAA,UAC3B,eAAe;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM;AAEN,aAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AAAA,IAC1B,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,UAAM,SAAS,SAAS,SAAS,WAAW;AAC5C,YAAQ;AAAA,MACJ,IAAI,MAAM,gBAAgB;AAAA,QACtB,SAAS;AAAA,QACT,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AACA,UAAM;AAEN,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,QAAI,SAAS,SAAS,SAAS,WAAW;AAC1C,YAAQ;AAAA,MACJ,IAAI,MAAM,gBAAgB;AAAA,QACtB,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AACA,UAAM;AAEN,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,aAAS,SAAS,SAAS,WAAW;AACtC,YAAQ;AAAA,MACJ,IAAI,MAAM,aAAa;AAAA,QACnB,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AACA,UAAM;AAEN,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,WAAO,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAEhC,UAAM,SAAS,SAAS,IAAI,WAAW;AACvC,YAAQ,KAAK;AACb,UAAM;AAEN,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,KAAK;AAAA,0DAClB,KAAK;AAAA;AAAA;AAAA,8CAGjB,KAAK;AAAA;AAAA;AAAA;AAAA,IAI/B,CAAC;AAAA;AAAA;AAAA,SAGZ;AACD,UAAM,eAAe,EAAE;AAEvB,UAAM,SAAS,GAAG,cAAc,WAAW;AAC3C,UAAM,SAAS,GAAG,cAAc,mBAAmB;AACnD,UAAM,UAAU,OAAO,cAAc,WAAW;AAChD,UAAM,UAAU,OAAO,cAAc,WAAW;AAChD,UAAM,UAAU,OAAO,cAAc,WAAW;AAChD,UAAM,eAAe,MAAM;AAC3B,UAAM,eAAe,MAAM;AAE3B,QAAI,SAAS,SAAS,QAAQ,WAAW;AACzC,UAAM,aAAa,SAAS,SAAS,WAAW;AAChD,WAAO,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AAC1D,UAAM;AACN,UAAM;AAEN,WAAO,YAAY,SAAS,aAAa,EAAE,GAAG,GAAG;AAEjD,aAAS,SAAS,SAAS,WAAW;AACtC,aAAS;AAAA,MACL,OAAO;AAAA,IACX,CAAC;AACD,UAAM;AAEN,WAAO,YAAY,SAAS,aAAa,EAAE,GAAG,GAAG;AAEjD,aAAS,SAAS,SAAS,WAAW;AACtC,aAAS;AAAA,MACL,OAAO;AAAA,IACX,CAAC;AACD,UAAM;AAEN,WAAO,YAAY,SAAS,aAAa,EAAE,GAAG,GAAG;AAAA,EACrD,CAAC;AACL,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
elementUpdated,
|
|
4
4
|
expect,
|
|
5
|
-
fixture,
|
|
6
5
|
html,
|
|
7
6
|
nextFrame,
|
|
8
7
|
oneEvent,
|
|
9
8
|
waitUntil
|
|
10
9
|
} from "@open-wc/testing";
|
|
11
10
|
import "@spectrum-web-components/action-button/sp-action-button.js";
|
|
11
|
+
import "@spectrum-web-components/button/sp-button.js";
|
|
12
12
|
import "@spectrum-web-components/action-group/sp-action-group.js";
|
|
13
13
|
import "@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js";
|
|
14
14
|
import "@spectrum-web-components/popover/sp-popover.js";
|
|
@@ -20,77 +20,204 @@ import { sendKeys } from "@web/test-runner-commands";
|
|
|
20
20
|
import { spy } from "sinon";
|
|
21
21
|
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
22
22
|
import { findDescribedNode } from "../../../test/testing-helpers-a11y.js";
|
|
23
|
+
import { fixture, isOnTopLayer } from "../../../test/testing-helpers.js";
|
|
24
|
+
import { longpress } from "../stories/overlay.stories.js";
|
|
23
25
|
describe("Overlay Trigger - Longpress", () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
(()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
<sp-action-button>
|
|
38
|
-
<sp-icon-magnify slot="icon"></sp-icon-magnify>
|
|
39
|
-
</sp-action-button>
|
|
40
|
-
<sp-action-button>
|
|
41
|
-
<sp-icon-magnify slot="icon"></sp-icon-magnify>
|
|
42
|
-
</sp-action-button>
|
|
43
|
-
<sp-action-button>
|
|
44
|
-
<sp-icon-magnify slot="icon"></sp-icon-magnify>
|
|
45
|
-
</sp-action-button>
|
|
46
|
-
</sp-action-group>
|
|
47
|
-
</sp-popover>
|
|
48
|
-
</overlay-trigger>
|
|
49
|
-
`)()
|
|
50
|
-
);
|
|
51
|
-
await elementUpdated(el);
|
|
52
|
-
const trigger = el.querySelector("sp-action-button");
|
|
53
|
-
const content = el.querySelector(
|
|
54
|
-
'[slot="longpress-content"]'
|
|
55
|
-
);
|
|
56
|
-
expect(trigger).to.not.be.null;
|
|
57
|
-
expect(content).to.not.be.null;
|
|
58
|
-
expect(content.open).to.be.false;
|
|
59
|
-
trigger.focus();
|
|
60
|
-
let open = oneEvent(el, "sp-opened");
|
|
61
|
-
await sendKeys({
|
|
62
|
-
press: "Space"
|
|
26
|
+
describe("responds to use interactions", () => {
|
|
27
|
+
beforeEach(async function() {
|
|
28
|
+
this.el = await fixture(longpress());
|
|
29
|
+
this.trigger = this.el.querySelector(
|
|
30
|
+
"sp-action-button"
|
|
31
|
+
);
|
|
32
|
+
this.content = this.el.querySelector(
|
|
33
|
+
'[slot="longpress-content"]'
|
|
34
|
+
);
|
|
35
|
+
expect(this.trigger).to.not.be.null;
|
|
36
|
+
expect(this.content).to.not.be.null;
|
|
37
|
+
expect(this.content.open).to.be.false;
|
|
38
|
+
this.trigger.focus();
|
|
63
39
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
40
|
+
it("opens/closes for `Space`", async function() {
|
|
41
|
+
const open = oneEvent(this.el, "sp-opened");
|
|
42
|
+
await sendKeys({
|
|
43
|
+
press: "Space"
|
|
44
|
+
});
|
|
45
|
+
await open;
|
|
46
|
+
expect(this.content.open, "opens for `Space`").to.be.true;
|
|
47
|
+
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
48
|
+
const closed = oneEvent(this.el, "sp-closed");
|
|
49
|
+
sendMouse({
|
|
50
|
+
steps: [
|
|
51
|
+
{
|
|
52
|
+
type: "click",
|
|
53
|
+
position: [500, 20]
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
await closed;
|
|
58
|
+
await nextFrame();
|
|
59
|
+
await nextFrame();
|
|
60
|
+
await nextFrame();
|
|
61
|
+
await nextFrame();
|
|
62
|
+
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
63
|
+
expect(this.content.open, "closes for `Space`").to.be.false;
|
|
74
64
|
});
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
65
|
+
it("opens/closes for `Alt+ArrowDown`", async function() {
|
|
66
|
+
const open = oneEvent(this.el, "sp-opened");
|
|
67
|
+
sendKeys({
|
|
68
|
+
press: "Alt+ArrowDown"
|
|
69
|
+
});
|
|
70
|
+
await open;
|
|
71
|
+
await nextFrame();
|
|
72
|
+
await nextFrame();
|
|
73
|
+
expect(this.content.open, "opens for `Alt+ArrowDown`").to.be.true;
|
|
74
|
+
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
75
|
+
const closed = oneEvent(this.el, "sp-closed");
|
|
76
|
+
await sendKeys({
|
|
77
|
+
press: "Escape"
|
|
78
|
+
});
|
|
79
|
+
await closed;
|
|
80
|
+
await nextFrame();
|
|
81
|
+
await nextFrame();
|
|
82
|
+
expect(this.content.open, "closes for `Alt+ArrowDown`").to.be.false;
|
|
83
|
+
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
80
84
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
85
|
+
it("opens/closes for `Alt+ArrowDown` with Button", async function() {
|
|
86
|
+
const button = document.createElement("sp-button");
|
|
87
|
+
button.slot = "trigger";
|
|
88
|
+
this.trigger.replaceWith(button);
|
|
89
|
+
await elementUpdated(button);
|
|
90
|
+
button.focus();
|
|
91
|
+
await elementUpdated(button);
|
|
92
|
+
const open = oneEvent(this.el, "sp-opened");
|
|
93
|
+
sendKeys({
|
|
94
|
+
press: "Alt+ArrowDown"
|
|
95
|
+
});
|
|
96
|
+
await open;
|
|
97
|
+
await nextFrame();
|
|
98
|
+
await nextFrame();
|
|
99
|
+
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
100
|
+
expect(this.content.open, "opens for `Alt+ArrowDown`").to.be.true;
|
|
101
|
+
const closed = oneEvent(this.el, "sp-closed");
|
|
102
|
+
await sendKeys({
|
|
103
|
+
press: "Escape"
|
|
104
|
+
});
|
|
105
|
+
await closed;
|
|
106
|
+
await nextFrame();
|
|
107
|
+
await nextFrame();
|
|
108
|
+
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
109
|
+
expect(this.content.open, "closes for `Alt+ArrowDown`").to.be.false;
|
|
110
|
+
});
|
|
111
|
+
it("opens/closes for `longpress`", async function() {
|
|
112
|
+
expect(this.trigger.holdAffordance).to.be.true;
|
|
113
|
+
let open = oneEvent(this.el, "sp-opened");
|
|
114
|
+
const rect = this.trigger.getBoundingClientRect();
|
|
115
|
+
await sendMouse({
|
|
116
|
+
steps: [
|
|
117
|
+
{
|
|
118
|
+
type: "move",
|
|
119
|
+
position: [
|
|
120
|
+
rect.left + rect.width / 2,
|
|
121
|
+
rect.top + rect.height / 2
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: "down"
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
});
|
|
129
|
+
await open;
|
|
130
|
+
await nextFrame();
|
|
131
|
+
await nextFrame();
|
|
132
|
+
open = oneEvent(this.el, "sp-opened");
|
|
133
|
+
await open;
|
|
134
|
+
await nextFrame();
|
|
135
|
+
await nextFrame();
|
|
136
|
+
expect(this.content.open, "opens for `pointerdown`").to.be.true;
|
|
137
|
+
await sendMouse({
|
|
138
|
+
steps: [
|
|
139
|
+
{
|
|
140
|
+
type: "up"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: "move",
|
|
144
|
+
position: [
|
|
145
|
+
rect.left + rect.width * 2,
|
|
146
|
+
rect.top + rect.height / 2
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
});
|
|
151
|
+
await nextFrame();
|
|
152
|
+
await nextFrame();
|
|
153
|
+
expect(this.content.open, "stays open for `pointerup`").to.be.true;
|
|
154
|
+
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
155
|
+
const closed = oneEvent(this.trigger, "sp-closed");
|
|
156
|
+
await sendKeys({
|
|
157
|
+
press: "Escape"
|
|
158
|
+
});
|
|
159
|
+
await closed;
|
|
160
|
+
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
161
|
+
expect(this.content.open, "closes for `pointerdown`").to.be.false;
|
|
162
|
+
});
|
|
163
|
+
it("opens/closes for `longpress` with Button", async function() {
|
|
164
|
+
const button = document.createElement("sp-button");
|
|
165
|
+
button.slot = "trigger";
|
|
166
|
+
this.trigger.remove();
|
|
167
|
+
this.el.append(button);
|
|
168
|
+
await elementUpdated(this.el);
|
|
169
|
+
await nextFrame();
|
|
170
|
+
await nextFrame();
|
|
171
|
+
let open = oneEvent(this.el, "sp-opened");
|
|
172
|
+
const rect = button.getBoundingClientRect();
|
|
173
|
+
await sendMouse({
|
|
174
|
+
steps: [
|
|
175
|
+
{
|
|
176
|
+
type: "move",
|
|
177
|
+
position: [
|
|
178
|
+
rect.left + rect.width / 2,
|
|
179
|
+
rect.top + rect.height / 2
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: "down"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
});
|
|
187
|
+
await open;
|
|
188
|
+
await nextFrame();
|
|
189
|
+
await nextFrame();
|
|
190
|
+
open = oneEvent(this.el, "sp-opened");
|
|
191
|
+
await open;
|
|
192
|
+
await nextFrame();
|
|
193
|
+
await nextFrame();
|
|
194
|
+
expect(this.content.open, "opens for `pointerdown`").to.be.true;
|
|
195
|
+
await sendMouse({
|
|
196
|
+
steps: [
|
|
197
|
+
{
|
|
198
|
+
type: "up"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
type: "move",
|
|
202
|
+
position: [
|
|
203
|
+
rect.left + rect.width * 2,
|
|
204
|
+
rect.top + rect.height / 2
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
});
|
|
209
|
+
await nextFrame();
|
|
210
|
+
await nextFrame();
|
|
211
|
+
expect(this.content.open, "stays open for `pointerup`").to.be.true;
|
|
212
|
+
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
213
|
+
const closed = oneEvent(button, "sp-closed");
|
|
214
|
+
await sendKeys({
|
|
215
|
+
press: "Escape"
|
|
216
|
+
});
|
|
217
|
+
await closed;
|
|
218
|
+
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
219
|
+
expect(this.content.open, "closes for `pointerdown`").to.be.false;
|
|
91
220
|
});
|
|
92
|
-
await closed;
|
|
93
|
-
expect(!content.open, "closes for `pointerdown`").to.be.true;
|
|
94
221
|
});
|
|
95
222
|
it("displays `longpress` declaratively", async () => {
|
|
96
223
|
const openedSpy = spy();
|
|
@@ -148,6 +275,8 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
148
275
|
</overlay-trigger>
|
|
149
276
|
`
|
|
150
277
|
);
|
|
278
|
+
await nextFrame();
|
|
279
|
+
await nextFrame();
|
|
151
280
|
const trigger = el.querySelector('[slot="trigger"]');
|
|
152
281
|
await elementUpdated(el);
|
|
153
282
|
expect(trigger.hasAttribute("aria-describedby")).to.be.true;
|
|
@@ -169,11 +298,11 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
169
298
|
LONGPRESS_INSTRUCTIONS.keyboard
|
|
170
299
|
);
|
|
171
300
|
const closed = oneEvent(el, "sp-closed");
|
|
172
|
-
|
|
301
|
+
sendKeys({
|
|
173
302
|
press: "Escape"
|
|
174
303
|
});
|
|
175
304
|
await closed;
|
|
176
|
-
expect(el.open).to.be.
|
|
305
|
+
expect(el.open).to.be.undefined;
|
|
177
306
|
expect(trigger.hasAttribute("aria-describedby")).to.be.true;
|
|
178
307
|
expect(el.childNodes.length, "always").to.equal(6);
|
|
179
308
|
await findDescribedNode(
|
|
@@ -213,22 +342,30 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
213
342
|
'[slot="longpress-content"]'
|
|
214
343
|
);
|
|
215
344
|
await elementUpdated(el);
|
|
216
|
-
expect(
|
|
345
|
+
expect(
|
|
346
|
+
trigger.hasAttribute("aria-describedby"),
|
|
347
|
+
"applies described by content"
|
|
348
|
+
).to.be.true;
|
|
217
349
|
expect(el.childNodes.length, "always").to.equal(6);
|
|
218
350
|
el.removeAttribute("hold-affordance");
|
|
219
|
-
|
|
351
|
+
content.remove();
|
|
220
352
|
await elementUpdated(el);
|
|
221
|
-
|
|
222
|
-
|
|
353
|
+
await nextFrame();
|
|
354
|
+
await nextFrame();
|
|
355
|
+
expect(
|
|
356
|
+
trigger.hasAttribute("aria-describedby"),
|
|
357
|
+
"removed described by content"
|
|
358
|
+
).to.be.false;
|
|
223
359
|
expect(el.childNodes.length, "always").to.equal(4);
|
|
224
360
|
el.setAttribute("hold-affordance", "true");
|
|
225
361
|
el.append(content);
|
|
226
362
|
await elementUpdated(el);
|
|
363
|
+
await nextFrame();
|
|
364
|
+
await nextFrame();
|
|
227
365
|
await findDescribedNode(
|
|
228
366
|
"Trigger with hold affordance",
|
|
229
367
|
LONGPRESS_INSTRUCTIONS.keyboard
|
|
230
368
|
);
|
|
231
|
-
expect(el.hasLongpressContent).to.be.true;
|
|
232
369
|
expect(el.childNodes.length, "always").to.equal(6);
|
|
233
370
|
});
|
|
234
371
|
it("recognises multiple overlay triggers in a11y tree", async () => {
|
|
@@ -276,14 +413,6 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
276
413
|
);
|
|
277
414
|
await elementUpdated(el);
|
|
278
415
|
const div = document.getElementById("container");
|
|
279
|
-
const firstTrigger = document.getElementById(
|
|
280
|
-
"first-trigger"
|
|
281
|
-
);
|
|
282
|
-
const secondTrigger = document.getElementById(
|
|
283
|
-
"second-trigger"
|
|
284
|
-
);
|
|
285
|
-
expect(firstTrigger.hasLongpressContent).to.be.true;
|
|
286
|
-
expect(secondTrigger.hasLongpressContent).to.be.true;
|
|
287
416
|
expect(div.childNodes.length, "always").to.equal(5);
|
|
288
417
|
await findDescribedNode(
|
|
289
418
|
"First button",
|