@spectrum-web-components/overlay 0.35.1-rc.41 → 0.36.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 +150 -237
- package/active-overlay.d.ts +6 -0
- package/active-overlay.dev.js +5 -0
- package/{sp-overlay.dev.js.map → active-overlay.dev.js.map} +3 -3
- package/active-overlay.js +2 -0
- package/{sp-overlay.js.map → active-overlay.js.map} +4 -4
- package/custom-elements.json +1215 -0
- package/package.json +22 -49
- package/src/ActiveOverlay.d.ts +84 -0
- package/src/ActiveOverlay.dev.js +517 -0
- package/src/ActiveOverlay.dev.js.map +7 -0
- package/src/ActiveOverlay.js +16 -0
- package/src/ActiveOverlay.js.map +7 -0
- package/src/OverlayTrigger.d.ts +41 -24
- package/src/OverlayTrigger.dev.js +295 -133
- package/src/OverlayTrigger.dev.js.map +3 -3
- package/src/OverlayTrigger.js +22 -52
- package/src/OverlayTrigger.js.map +3 -3
- package/src/VirtualTrigger.dev.js +1 -2
- package/src/VirtualTrigger.dev.js.map +2 -2
- package/src/VirtualTrigger.js +1 -1
- package/src/VirtualTrigger.js.map +2 -2
- package/src/active-overlay.css.dev.js +13 -0
- package/src/active-overlay.css.dev.js.map +7 -0
- package/src/active-overlay.css.js +10 -0
- package/src/active-overlay.css.js.map +7 -0
- package/src/index.d.ts +3 -2
- package/src/index.dev.js +3 -2
- 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 +2 -1
- package/src/loader.dev.js +19 -2
- package/src/loader.dev.js.map +2 -2
- package/src/loader.js +1 -1
- package/src/loader.js.map +3 -3
- package/src/overlay-stack.d.ts +50 -0
- package/src/overlay-stack.dev.js +515 -0
- package/src/overlay-stack.dev.js.map +7 -0
- package/src/overlay-stack.js +34 -0
- package/src/overlay-stack.js.map +7 -0
- 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 +1 -1
- package/src/overlay-trigger.css.js.map +1 -1
- package/src/overlay-types.d.ts +31 -25
- package/src/overlay-types.dev.js +0 -1
- 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-utils.d.ts +3 -0
- package/src/overlay-utils.dev.js +31 -0
- package/src/overlay-utils.dev.js.map +7 -0
- package/src/overlay-utils.js +2 -0
- package/src/overlay-utils.js.map +7 -0
- package/src/overlay.d.ts +59 -0
- package/src/overlay.dev.js +127 -0
- package/src/overlay.dev.js.map +7 -0
- package/src/overlay.js +2 -0
- package/src/overlay.js.map +7 -0
- package/stories/overlay-story-components.js +8 -9
- package/stories/overlay-story-components.js.map +2 -2
- package/stories/overlay.stories.js +697 -825
- package/stories/overlay.stories.js.map +2 -2
- package/sync/overlay-trigger.d.ts +0 -4
- package/sync/overlay-trigger.dev.js +4 -1
- 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 +1 -1
- package/test/benchmark/basic-test.js.map +1 -1
- package/test/index.js +377 -408
- package/test/index.js.map +3 -3
- package/test/overlay-lifecycle.test.js +106 -34
- package/test/overlay-lifecycle.test.js.map +2 -2
- package/test/overlay-trigger-click.test.js +5 -11
- package/test/overlay-trigger-click.test.js.map +2 -2
- package/test/overlay-trigger-extended.test.js +36 -42
- package/test/overlay-trigger-extended.test.js.map +2 -2
- package/test/overlay-trigger-hover-click.test.js +24 -27
- package/test/overlay-trigger-hover-click.test.js.map +2 -2
- package/test/overlay-trigger-hover.test.js +35 -41
- package/test/overlay-trigger-hover.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +81 -206
- 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 +4 -4
- package/test/overlay-update.test.js.map +2 -2
- package/test/overlay.test.js +268 -386
- package/test/overlay.test.js.map +3 -3
- package/sp-overlay.d.ts +0 -6
- package/sp-overlay.dev.js +0 -5
- package/sp-overlay.js +0 -2
- package/src/AbstractOverlay.d.ts +0 -56
- package/src/AbstractOverlay.dev.js +0 -202
- package/src/AbstractOverlay.dev.js.map +0 -7
- package/src/AbstractOverlay.js +0 -2
- package/src/AbstractOverlay.js.map +0 -7
- package/src/Overlay.d.ts +0 -147
- package/src/Overlay.dev.js +0 -777
- package/src/Overlay.dev.js.map +0 -7
- package/src/Overlay.js +0 -33
- package/src/Overlay.js.map +0 -7
- package/src/OverlayDialog.d.ts +0 -4
- package/src/OverlayDialog.dev.js +0 -135
- package/src/OverlayDialog.dev.js.map +0 -7
- package/src/OverlayDialog.js +0 -2
- package/src/OverlayDialog.js.map +0 -7
- package/src/OverlayNoPopover.d.ts +0 -4
- package/src/OverlayNoPopover.dev.js +0 -110
- package/src/OverlayNoPopover.dev.js.map +0 -7
- package/src/OverlayNoPopover.js +0 -2
- package/src/OverlayNoPopover.js.map +0 -7
- package/src/OverlayPopover.d.ts +0 -4
- package/src/OverlayPopover.dev.js +0 -169
- package/src/OverlayPopover.dev.js.map +0 -7
- package/src/OverlayPopover.js +0 -2
- package/src/OverlayPopover.js.map +0 -7
- package/src/OverlayStack.d.ts +0 -43
- package/src/OverlayStack.dev.js +0 -150
- package/src/OverlayStack.dev.js.map +0 -7
- package/src/OverlayStack.js +0 -2
- package/src/OverlayStack.js.map +0 -7
- package/src/PlacementController.d.ts +0 -38
- package/src/PlacementController.dev.js +0 -199
- package/src/PlacementController.dev.js.map +0 -7
- package/src/PlacementController.js +0 -2
- package/src/PlacementController.js.map +0 -7
- package/src/fullSizePlugin.d.ts +0 -12
- package/src/fullSizePlugin.dev.js +0 -39
- package/src/fullSizePlugin.dev.js.map +0 -7
- package/src/fullSizePlugin.js +0 -2
- package/src/fullSizePlugin.js.map +0 -7
- package/src/overlay.css.dev.js +0 -9
- package/src/overlay.css.dev.js.map +0 -7
- package/src/overlay.css.js +0 -6
- package/src/overlay.css.js.map +0 -7
- package/src/topLayerOverTransforms.d.ts +0 -2
- package/src/topLayerOverTransforms.dev.js +0 -90
- package/src/topLayerOverTransforms.dev.js.map +0 -7
- package/src/topLayerOverTransforms.js +0 -2
- package/src/topLayerOverTransforms.js.map +0 -7
- package/stories/overlay-element.stories.js +0 -366
- package/stories/overlay-element.stories.js.map +0 -7
- package/test/overlay-element.test-vrt.js +0 -5
- package/test/overlay-element.test-vrt.js.map +0 -7
- package/test/overlay-element.test.js +0 -681
- package/test/overlay-element.test.js.map +0 -7
- package/test/overlay-v1.test.js +0 -651
- package/test/overlay-v1.test.js.map +0 -7
- /package/src/{overlay.css.d.ts → active-overlay.css.d.ts} +0 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import {
|
|
3
|
+
aTimeout,
|
|
3
4
|
elementUpdated,
|
|
4
5
|
expect,
|
|
6
|
+
fixture,
|
|
5
7
|
html,
|
|
6
8
|
nextFrame,
|
|
7
9
|
oneEvent,
|
|
@@ -18,10 +20,8 @@ import { spy } from "sinon";
|
|
|
18
20
|
import { sendKeys } from "@web/test-runner-commands";
|
|
19
21
|
import "@spectrum-web-components/theme/sp-theme.js";
|
|
20
22
|
import "@spectrum-web-components/theme/src/themes.js";
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
ignoreResizeObserverLoopError
|
|
24
|
-
} from "../../../test/testing-helpers.js";
|
|
23
|
+
import { ignoreResizeObserverLoopError } from "../../../test/testing-helpers.js";
|
|
24
|
+
import { isFirefox } from "@spectrum-web-components/shared/src/platform.js";
|
|
25
25
|
ignoreResizeObserverLoopError(before, after);
|
|
26
26
|
async function styledFixture(story) {
|
|
27
27
|
const test = await fixture(html`
|
|
@@ -86,18 +86,14 @@ 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("mouseenter", {
|
|
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;
|
|
99
95
|
button.dispatchEvent(
|
|
100
|
-
new MouseEvent("
|
|
96
|
+
new MouseEvent("mouseleave", {
|
|
101
97
|
relatedTarget: tooltip,
|
|
102
98
|
bubbles: true,
|
|
103
99
|
composed: true
|
|
@@ -105,7 +101,7 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
105
101
|
);
|
|
106
102
|
await nextFrame();
|
|
107
103
|
tooltip.dispatchEvent(
|
|
108
|
-
new MouseEvent("
|
|
104
|
+
new MouseEvent("mouseleave", {
|
|
109
105
|
relatedTarget: button,
|
|
110
106
|
bubbles: true,
|
|
111
107
|
composed: true
|
|
@@ -115,26 +111,25 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
115
111
|
expect(el.open).to.equal("hover");
|
|
116
112
|
const closed = oneEvent(button, "sp-closed");
|
|
117
113
|
button.dispatchEvent(
|
|
118
|
-
new MouseEvent("
|
|
119
|
-
relatedTarget: null,
|
|
114
|
+
new MouseEvent("mouseleave", {
|
|
120
115
|
bubbles: true,
|
|
121
116
|
composed: true
|
|
122
117
|
})
|
|
123
118
|
);
|
|
124
119
|
await closed;
|
|
125
|
-
expect(el.open).to.be.
|
|
120
|
+
expect(el.open).to.be.null;
|
|
126
121
|
});
|
|
127
122
|
it('closes the "tooltip" when leaving the "tooltip"', async () => {
|
|
128
123
|
const opened = oneEvent(button, "sp-opened");
|
|
129
124
|
button.dispatchEvent(
|
|
130
|
-
new MouseEvent("
|
|
125
|
+
new MouseEvent("mouseenter", {
|
|
131
126
|
bubbles: true,
|
|
132
127
|
composed: true
|
|
133
128
|
})
|
|
134
129
|
);
|
|
135
130
|
await nextFrame();
|
|
136
131
|
button.dispatchEvent(
|
|
137
|
-
new MouseEvent("
|
|
132
|
+
new MouseEvent("mouseleave", {
|
|
138
133
|
relatedTarget: tooltip,
|
|
139
134
|
bubbles: true,
|
|
140
135
|
composed: true
|
|
@@ -144,14 +139,13 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
144
139
|
expect(el.open).to.equal("hover");
|
|
145
140
|
const closed = oneEvent(button, "sp-closed");
|
|
146
141
|
tooltip.dispatchEvent(
|
|
147
|
-
new MouseEvent("
|
|
148
|
-
relatedTarget: null,
|
|
142
|
+
new MouseEvent("mouseleave", {
|
|
149
143
|
bubbles: true,
|
|
150
144
|
composed: true
|
|
151
145
|
})
|
|
152
146
|
);
|
|
153
147
|
await closed;
|
|
154
|
-
expect(el.open).to.be.
|
|
148
|
+
expect(el.open).to.be.null;
|
|
155
149
|
});
|
|
156
150
|
});
|
|
157
151
|
it("persists hover content", async () => {
|
|
@@ -168,14 +162,12 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
168
162
|
await elementUpdated(el);
|
|
169
163
|
expect(el.open).to.be.undefined;
|
|
170
164
|
const trigger = el.querySelector('[slot="trigger"]');
|
|
171
|
-
const opened = oneEvent(trigger, "sp-opened");
|
|
172
165
|
trigger.dispatchEvent(
|
|
173
|
-
new Event("
|
|
174
|
-
bubbles: true
|
|
175
|
-
composed: true
|
|
166
|
+
new Event("mouseenter", {
|
|
167
|
+
bubbles: true
|
|
176
168
|
})
|
|
177
169
|
);
|
|
178
|
-
await
|
|
170
|
+
await elementUpdated(el);
|
|
179
171
|
expect(el.open).to.equal("hover");
|
|
180
172
|
trigger.click();
|
|
181
173
|
await elementUpdated(el);
|
|
@@ -196,21 +188,19 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
196
188
|
await elementUpdated(el);
|
|
197
189
|
expect(el.open).to.be.undefined;
|
|
198
190
|
const trigger = el.querySelector('[slot="trigger"]');
|
|
199
|
-
let opened = oneEvent(trigger, "sp-opened");
|
|
200
191
|
trigger.dispatchEvent(
|
|
201
|
-
new Event("
|
|
192
|
+
new Event("mouseenter", {
|
|
202
193
|
bubbles: true
|
|
203
194
|
})
|
|
204
195
|
);
|
|
205
|
-
await
|
|
196
|
+
await elementUpdated(el);
|
|
206
197
|
expect(el.open).to.equal("hover");
|
|
207
|
-
opened = oneEvent(trigger, "sp-opened");
|
|
208
198
|
trigger.dispatchEvent(
|
|
209
199
|
new Event("longpress", {
|
|
210
200
|
bubbles: true
|
|
211
201
|
})
|
|
212
202
|
);
|
|
213
|
-
await
|
|
203
|
+
await elementUpdated(el);
|
|
214
204
|
expect(el.open).to.equal("longpress");
|
|
215
205
|
});
|
|
216
206
|
it('closes `hover` overlay when [type="modal"]', async () => {
|
|
@@ -230,15 +220,21 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
230
220
|
const opened = oneEvent(el, "sp-opened");
|
|
231
221
|
trigger.focus();
|
|
232
222
|
await opened;
|
|
223
|
+
await elementUpdated(el);
|
|
224
|
+
await aTimeout(500);
|
|
233
225
|
expect(el.open).to.equal("hover");
|
|
234
226
|
const closed = oneEvent(el, "sp-closed");
|
|
235
227
|
trigger.blur();
|
|
236
228
|
await closed;
|
|
237
|
-
|
|
229
|
+
await elementUpdated(el);
|
|
230
|
+
expect(el.open).to.be.null;
|
|
238
231
|
});
|
|
239
232
|
it('will not return focus to a "modal" parent', async () => {
|
|
233
|
+
if (isFirefox()) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
240
236
|
const el = await styledFixture(html`
|
|
241
|
-
<overlay-trigger type="modal">
|
|
237
|
+
<overlay-trigger type="modal" placement="none">
|
|
242
238
|
<sp-button slot="trigger">Toggle Dialog</sp-button>
|
|
243
239
|
<sp-dialog-wrapper
|
|
244
240
|
slot="click-content"
|
|
@@ -263,29 +259,27 @@ describe("Overlay Trigger - Hover", () => {
|
|
|
263
259
|
await elementUpdated(el);
|
|
264
260
|
const button = el.querySelector("sp-button");
|
|
265
261
|
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");
|
|
269
262
|
await elementUpdated(button);
|
|
270
263
|
await elementUpdated(dialog);
|
|
271
264
|
let opened = oneEvent(button, "sp-opened");
|
|
272
|
-
const openedHint = oneEvent(button1, "sp-opened");
|
|
273
265
|
button.dispatchEvent(new Event("click", { bubbles: true }));
|
|
274
266
|
await opened;
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
opened = oneEvent(
|
|
267
|
+
const button1 = dialog.querySelector("#button-1");
|
|
268
|
+
const button2 = dialog.querySelector("#button-2");
|
|
269
|
+
opened = oneEvent(button1, "sp-opened");
|
|
278
270
|
sendKeys({
|
|
279
271
|
press: "Tab"
|
|
280
272
|
});
|
|
281
273
|
await opened;
|
|
282
|
-
|
|
283
|
-
|
|
274
|
+
await nextFrame();
|
|
275
|
+
expect(button1 === document.activeElement).to.be.true;
|
|
276
|
+
opened = oneEvent(button2, "sp-opened");
|
|
284
277
|
sendKeys({
|
|
285
278
|
press: "Tab"
|
|
286
279
|
});
|
|
287
280
|
await opened;
|
|
288
|
-
|
|
281
|
+
await nextFrame();
|
|
282
|
+
expect(button2 === document.activeElement).to.be.true;
|
|
289
283
|
});
|
|
290
284
|
});
|
|
291
285
|
//# 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 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
|
|
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,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,SAAS,qCAAqC;AAC9C,SAAS,iBAAiB;AAE1B,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,cAAc;AAAA,UACzB,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM,UAAU;AAChB,aAAO;AAAA,QACH,IAAI,WAAW,cAAc;AAAA,UACzB,eAAe;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM,UAAU;AAChB,cAAQ;AAAA,QACJ,IAAI,WAAW,cAAc;AAAA,UACzB,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,cAAc;AAAA,UACzB,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,cAAc;AAAA,UACzB,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,YAAM,UAAU;AAChB,aAAO;AAAA,QACH,IAAI,WAAW,cAAc;AAAA,UACzB,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,cAAc;AAAA,UACzB,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,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;AAExD,QAAI,UAAU,GAAG;AACb;AAAA,IACJ;AACA,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,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
|
}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
elementUpdated,
|
|
4
4
|
expect,
|
|
5
|
+
fixture,
|
|
5
6
|
html,
|
|
6
7
|
nextFrame,
|
|
7
8
|
oneEvent,
|
|
8
9
|
waitUntil
|
|
9
10
|
} from "@open-wc/testing";
|
|
10
11
|
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,210 +20,77 @@ 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";
|
|
25
23
|
describe("Overlay Trigger - Longpress", () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
await nextFrame();
|
|
66
|
-
await nextFrame();
|
|
67
|
-
await nextFrame();
|
|
68
|
-
await nextFrame();
|
|
69
|
-
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
70
|
-
expect(this.content.open, "closes for `Space`").to.be.false;
|
|
71
|
-
});
|
|
72
|
-
it("opens/closes for `Alt+ArrowDown`", async function() {
|
|
73
|
-
const open = oneEvent(this.el, "sp-opened");
|
|
74
|
-
sendKeys({
|
|
75
|
-
press: "Alt+ArrowDown"
|
|
76
|
-
});
|
|
77
|
-
await open;
|
|
78
|
-
await nextFrame();
|
|
79
|
-
await nextFrame();
|
|
80
|
-
expect(this.content.open, "opens for `Alt+ArrowDown`").to.be.true;
|
|
81
|
-
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
82
|
-
const closed = oneEvent(this.el, "sp-closed");
|
|
83
|
-
await sendKeys({
|
|
84
|
-
press: "Escape"
|
|
85
|
-
});
|
|
86
|
-
await closed;
|
|
87
|
-
await nextFrame();
|
|
88
|
-
await nextFrame();
|
|
89
|
-
expect(this.content.open, "closes for `Alt+ArrowDown`").to.be.false;
|
|
90
|
-
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
24
|
+
it("displays `longpress` content", async () => {
|
|
25
|
+
const el = await fixture(
|
|
26
|
+
(() => html`
|
|
27
|
+
<overlay-trigger placement="right-start">
|
|
28
|
+
<sp-action-button slot="trigger" hold-affordance>
|
|
29
|
+
<sp-icon-magnify slot="icon"></sp-icon-magnify>
|
|
30
|
+
</sp-action-button>
|
|
31
|
+
<sp-popover slot="longpress-content" tip>
|
|
32
|
+
<sp-action-group
|
|
33
|
+
selects="single"
|
|
34
|
+
vertical
|
|
35
|
+
style="margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);"
|
|
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"
|
|
91
63
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
});
|
|
103
|
-
await open;
|
|
104
|
-
await nextFrame();
|
|
105
|
-
await nextFrame();
|
|
106
|
-
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
107
|
-
expect(this.content.open, "opens for `Alt+ArrowDown`").to.be.true;
|
|
108
|
-
const closed = oneEvent(this.el, "sp-closed");
|
|
109
|
-
await sendKeys({
|
|
110
|
-
press: "Escape"
|
|
111
|
-
});
|
|
112
|
-
await closed;
|
|
113
|
-
await nextFrame();
|
|
114
|
-
await nextFrame();
|
|
115
|
-
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
116
|
-
expect(this.content.open, "closes for `Alt+ArrowDown`").to.be.false;
|
|
64
|
+
await open;
|
|
65
|
+
expect(content.open, "opens for `Space`").to.be.true;
|
|
66
|
+
let closed = oneEvent(el, "sp-closed");
|
|
67
|
+
document.body.click();
|
|
68
|
+
await closed;
|
|
69
|
+
expect(!content.open, "closes for `Space`").to.be.true;
|
|
70
|
+
trigger.focus();
|
|
71
|
+
open = oneEvent(el, "sp-opened");
|
|
72
|
+
sendKeys({
|
|
73
|
+
press: "Alt+ArrowDown"
|
|
117
74
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
steps: [
|
|
124
|
-
{
|
|
125
|
-
type: "move",
|
|
126
|
-
position: [
|
|
127
|
-
rect.left + rect.width / 2,
|
|
128
|
-
rect.top + rect.height / 2
|
|
129
|
-
]
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
type: "down"
|
|
133
|
-
}
|
|
134
|
-
]
|
|
135
|
-
});
|
|
136
|
-
await open;
|
|
137
|
-
await nextFrame();
|
|
138
|
-
await nextFrame();
|
|
139
|
-
open = oneEvent(this.el, "sp-opened");
|
|
140
|
-
await open;
|
|
141
|
-
await nextFrame();
|
|
142
|
-
await nextFrame();
|
|
143
|
-
expect(this.content.open, "opens for `pointerdown`").to.be.true;
|
|
144
|
-
await sendMouse({
|
|
145
|
-
steps: [
|
|
146
|
-
{
|
|
147
|
-
type: "up"
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
type: "move",
|
|
151
|
-
position: [
|
|
152
|
-
rect.left + rect.width * 2,
|
|
153
|
-
rect.top + rect.height / 2
|
|
154
|
-
]
|
|
155
|
-
}
|
|
156
|
-
]
|
|
157
|
-
});
|
|
158
|
-
await nextFrame();
|
|
159
|
-
await nextFrame();
|
|
160
|
-
expect(this.content.open, "stays open for `pointerup`").to.be.true;
|
|
161
|
-
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
162
|
-
const closed = oneEvent(this.trigger, "sp-closed");
|
|
163
|
-
await sendKeys({
|
|
164
|
-
press: "Escape"
|
|
165
|
-
});
|
|
166
|
-
await closed;
|
|
167
|
-
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
168
|
-
expect(this.content.open, "closes for `pointerdown`").to.be.false;
|
|
75
|
+
await open;
|
|
76
|
+
expect(content.open, "opens for `Alt+ArrowDown`").to.be.true;
|
|
77
|
+
closed = oneEvent(el, "sp-closed");
|
|
78
|
+
await sendKeys({
|
|
79
|
+
press: "Escape"
|
|
169
80
|
});
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
steps: [
|
|
181
|
-
{
|
|
182
|
-
type: "move",
|
|
183
|
-
position: [
|
|
184
|
-
rect.left + rect.width / 2,
|
|
185
|
-
rect.top + rect.height / 2
|
|
186
|
-
]
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
type: "down"
|
|
190
|
-
}
|
|
191
|
-
]
|
|
192
|
-
});
|
|
193
|
-
await open;
|
|
194
|
-
await nextFrame();
|
|
195
|
-
await nextFrame();
|
|
196
|
-
open = oneEvent(this.el, "sp-opened");
|
|
197
|
-
await open;
|
|
198
|
-
await nextFrame();
|
|
199
|
-
await nextFrame();
|
|
200
|
-
expect(this.content.open, "opens for `pointerdown`").to.be.true;
|
|
201
|
-
await sendMouse({
|
|
202
|
-
steps: [
|
|
203
|
-
{
|
|
204
|
-
type: "up"
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
type: "move",
|
|
208
|
-
position: [
|
|
209
|
-
rect.left + rect.width * 2,
|
|
210
|
-
rect.top + rect.height / 2
|
|
211
|
-
]
|
|
212
|
-
}
|
|
213
|
-
]
|
|
214
|
-
});
|
|
215
|
-
await nextFrame();
|
|
216
|
-
await nextFrame();
|
|
217
|
-
expect(this.content.open, "stays open for `pointerup`").to.be.true;
|
|
218
|
-
expect(await isOnTopLayer(this.content)).to.be.true;
|
|
219
|
-
const closed = oneEvent(button, "sp-closed");
|
|
220
|
-
await sendKeys({
|
|
221
|
-
press: "Escape"
|
|
222
|
-
});
|
|
223
|
-
await closed;
|
|
224
|
-
expect(await isOnTopLayer(this.content)).to.be.false;
|
|
225
|
-
expect(this.content.open, "closes for `pointerdown`").to.be.false;
|
|
81
|
+
await closed;
|
|
82
|
+
expect(!content.open, "closes for `Alt+ArrowDown`").to.be.true;
|
|
83
|
+
await elementUpdated(el);
|
|
84
|
+
open = oneEvent(el, "sp-opened");
|
|
85
|
+
trigger.dispatchEvent(new PointerEvent("pointerdown", { button: 0 }));
|
|
86
|
+
await open;
|
|
87
|
+
expect(content.open, "opens for `pointerdown`").to.be.true;
|
|
88
|
+
closed = oneEvent(el, "sp-closed");
|
|
89
|
+
await sendKeys({
|
|
90
|
+
press: "Escape"
|
|
226
91
|
});
|
|
92
|
+
await closed;
|
|
93
|
+
expect(!content.open, "closes for `pointerdown`").to.be.true;
|
|
227
94
|
});
|
|
228
95
|
it("displays `longpress` declaratively", async () => {
|
|
229
96
|
const openedSpy = spy();
|
|
@@ -302,11 +169,11 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
302
169
|
LONGPRESS_INSTRUCTIONS.keyboard
|
|
303
170
|
);
|
|
304
171
|
const closed = oneEvent(el, "sp-closed");
|
|
305
|
-
sendKeys({
|
|
172
|
+
await sendKeys({
|
|
306
173
|
press: "Escape"
|
|
307
174
|
});
|
|
308
175
|
await closed;
|
|
309
|
-
expect(el.open).to.be.
|
|
176
|
+
expect(el.open).to.be.null;
|
|
310
177
|
expect(trigger.hasAttribute("aria-describedby")).to.be.true;
|
|
311
178
|
expect(el.childNodes.length, "always").to.equal(6);
|
|
312
179
|
await findDescribedNode(
|
|
@@ -346,22 +213,22 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
346
213
|
'[slot="longpress-content"]'
|
|
347
214
|
);
|
|
348
215
|
await elementUpdated(el);
|
|
349
|
-
expect(
|
|
216
|
+
expect(el.hasLongpressContent).to.be.true;
|
|
350
217
|
expect(el.childNodes.length, "always").to.equal(6);
|
|
351
218
|
el.removeAttribute("hold-affordance");
|
|
352
|
-
|
|
219
|
+
el.removeChild(content);
|
|
353
220
|
await elementUpdated(el);
|
|
354
221
|
expect(trigger.hasAttribute("aria-describedby")).to.be.false;
|
|
222
|
+
expect(el.hasLongpressContent).to.be.false;
|
|
355
223
|
expect(el.childNodes.length, "always").to.equal(4);
|
|
356
224
|
el.setAttribute("hold-affordance", "true");
|
|
357
225
|
el.append(content);
|
|
358
226
|
await elementUpdated(el);
|
|
359
|
-
await nextFrame();
|
|
360
|
-
await nextFrame();
|
|
361
227
|
await findDescribedNode(
|
|
362
228
|
"Trigger with hold affordance",
|
|
363
229
|
LONGPRESS_INSTRUCTIONS.keyboard
|
|
364
230
|
);
|
|
231
|
+
expect(el.hasLongpressContent).to.be.true;
|
|
365
232
|
expect(el.childNodes.length, "always").to.equal(6);
|
|
366
233
|
});
|
|
367
234
|
it("recognises multiple overlay triggers in a11y tree", async () => {
|
|
@@ -409,6 +276,14 @@ describe("Overlay Trigger - Longpress", () => {
|
|
|
409
276
|
);
|
|
410
277
|
await elementUpdated(el);
|
|
411
278
|
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;
|
|
412
287
|
expect(div.childNodes.length, "always").to.equal(5);
|
|
413
288
|
await findDescribedNode(
|
|
414
289
|
"First button",
|