@spectrum-web-components/overlay 0.34.1-rc.0 → 0.35.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 +152 -227
- 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 +529 -1389
- package/package.json +22 -48
- 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 +31 -23
- package/src/OverlayTrigger.dev.js +245 -135
- 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 +2 -0
- package/src/VirtualTrigger.dev.js.map +2 -2
- package/src/VirtualTrigger.js +1 -1
- package/src/VirtualTrigger.js.map +3 -3
- 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 -2
- 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-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 +5 -7
- 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 +702 -799
- 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 +376 -407
- 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 +6 -1
- package/test/overlay-trigger-extended.test.js.map +2 -2
- package/test/overlay-trigger-hover-click.test.js +23 -23
- package/test/overlay-trigger-hover-click.test.js.map +2 -2
- package/test/overlay-trigger-hover.test.js +34 -40
- package/test/overlay-trigger-hover.test.js.map +2 -2
- package/test/overlay-trigger-longpress.test.js +80 -98
- 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-v1.test.js → overlay.test.js} +249 -267
- package/test/overlay.test.js.map +7 -0
- package/sp-overlay.d.ts +0 -6
- package/sp-overlay.dev.js +0 -5
- package/sp-overlay.js +0 -2
- package/src/Overlay.d.ts +0 -29
- package/src/Overlay.dev.js +0 -91
- package/src/Overlay.dev.js.map +0 -7
- package/src/Overlay.js +0 -2
- package/src/Overlay.js.map +0 -7
- package/src/OverlayBase.d.ts +0 -124
- package/src/OverlayBase.dev.js +0 -744
- package/src/OverlayBase.dev.js.map +0 -7
- package/src/OverlayBase.js +0 -31
- package/src/OverlayBase.js.map +0 -7
- package/src/OverlayDialog.d.ts +0 -8
- package/src/OverlayDialog.dev.js +0 -160
- 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 -8
- package/src/OverlayNoPopover.dev.js +0 -149
- 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 -8
- package/src/OverlayPopover.dev.js +0 -199
- 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 -29
- package/src/OverlayStack.dev.js +0 -126
- 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 -36
- package/src/PlacementController.dev.js +0 -191
- 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-base.css.dev.js +0 -9
- package/src/overlay-base.css.dev.js.map +0 -7
- package/src/overlay-base.css.js +0 -6
- package/src/overlay-base.css.js.map +0 -7
- package/src/topLayerOverTransforms.d.ts +0 -23
- package/src/topLayerOverTransforms.dev.js +0 -170
- 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 -247
- 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 -682
- package/test/overlay-element.test.js.map +0 -7
- package/test/overlay-v1.test.js.map +0 -7
- package/test/overlay-v2.test.js +0 -720
- package/test/overlay-v2.test.js.map +0 -7
- /package/src/{overlay-base.css.d.ts → active-overlay.css.d.ts} +0 -0
|
@@ -1,49 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import "@spectrum-web-components/button/sp-button.js";
|
|
3
3
|
import "@spectrum-web-components/dialog/sp-dialog.js";
|
|
4
|
-
import "@spectrum-web-components/overlay/sp-overlay.js";
|
|
5
|
-
import "@spectrum-web-components/overlay/overlay-trigger.js";
|
|
6
|
-
import "@spectrum-web-components/tooltip/sp-tooltip.js";
|
|
7
4
|
import "@spectrum-web-components/popover/sp-popover.js";
|
|
8
5
|
import { setViewport } from "@web/test-runner-commands";
|
|
9
6
|
import {
|
|
10
7
|
Overlay
|
|
11
8
|
} from "@spectrum-web-components/overlay";
|
|
9
|
+
import { isVisible } from "../../../test/testing-helpers.js";
|
|
12
10
|
import {
|
|
13
11
|
elementUpdated,
|
|
14
12
|
expect,
|
|
13
|
+
fixture,
|
|
15
14
|
html,
|
|
16
15
|
nextFrame,
|
|
17
|
-
oneEvent
|
|
16
|
+
oneEvent,
|
|
17
|
+
waitUntil
|
|
18
18
|
} from "@open-wc/testing";
|
|
19
19
|
import { sendKeys } from "@web/test-runner-commands";
|
|
20
20
|
import {
|
|
21
21
|
definedOverlayElement,
|
|
22
|
-
|
|
22
|
+
virtualElement
|
|
23
23
|
} from "../stories/overlay.stories";
|
|
24
24
|
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
25
|
-
|
|
26
|
-
import "@spectrum-web-components/theme/sp-theme.js";
|
|
27
|
-
import "@spectrum-web-components/theme/src/themes.js";
|
|
28
|
-
import { render } from "@spectrum-web-components/base";
|
|
29
|
-
import {
|
|
30
|
-
fixture,
|
|
31
|
-
isInteractive,
|
|
32
|
-
isOnTopLayer
|
|
33
|
-
} from "../../../test/testing-helpers.js";
|
|
34
|
-
async function styledFixture(story) {
|
|
35
|
-
const test = await fixture(html`
|
|
36
|
-
<sp-theme theme="spectrum" scale="medium" color="dark">
|
|
37
|
-
${story}
|
|
38
|
-
</sp-theme>
|
|
39
|
-
`);
|
|
40
|
-
return test.children[0];
|
|
41
|
-
}
|
|
42
|
-
describe("Overlays, v1", () => {
|
|
25
|
+
describe("Overlays", () => {
|
|
43
26
|
let testDiv;
|
|
44
27
|
let openOverlays = [];
|
|
45
28
|
beforeEach(async () => {
|
|
46
|
-
testDiv = await
|
|
29
|
+
testDiv = await fixture(
|
|
47
30
|
html`
|
|
48
31
|
<div id="top">
|
|
49
32
|
<style>
|
|
@@ -65,28 +48,31 @@ describe("Overlays, v1", () => {
|
|
|
65
48
|
display: none;
|
|
66
49
|
}
|
|
67
50
|
</style>
|
|
68
|
-
<sp-button
|
|
51
|
+
<sp-button
|
|
52
|
+
id="first-button"
|
|
53
|
+
variant="primary"
|
|
54
|
+
slot="trigger"
|
|
55
|
+
>
|
|
69
56
|
Show Popover
|
|
70
57
|
</sp-button>
|
|
71
58
|
<div id="overlay-content">
|
|
72
|
-
<sp-popover
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
<sp-button>Test 3</sp-button>
|
|
59
|
+
<sp-popover
|
|
60
|
+
id="outer-popover"
|
|
61
|
+
slot="click-content"
|
|
62
|
+
direction="bottom"
|
|
63
|
+
tip
|
|
64
|
+
open
|
|
65
|
+
>
|
|
66
|
+
<sp-dialog class="options-popover-content">
|
|
67
|
+
A popover message
|
|
82
68
|
</sp-dialog>
|
|
83
69
|
</sp-popover>
|
|
84
|
-
<
|
|
70
|
+
<div id="hover-1" class="hover-content">
|
|
85
71
|
Hover message
|
|
86
|
-
</
|
|
87
|
-
<
|
|
72
|
+
</div>
|
|
73
|
+
<div id="hover-2" class="hover-content">
|
|
88
74
|
Other hover message
|
|
89
|
-
</
|
|
75
|
+
</div>
|
|
90
76
|
</div>
|
|
91
77
|
</div>
|
|
92
78
|
`
|
|
@@ -114,19 +100,21 @@ describe("Overlays, v1", () => {
|
|
|
114
100
|
].map((direction) => {
|
|
115
101
|
const placement = direction;
|
|
116
102
|
it(`opens a popover - ${placement}`, async () => {
|
|
117
|
-
const clickSpy = spy();
|
|
118
103
|
const button = testDiv.querySelector(
|
|
119
104
|
"#first-button"
|
|
120
105
|
);
|
|
121
106
|
const outerPopover = testDiv.querySelector(
|
|
122
107
|
"#outer-popover"
|
|
123
108
|
);
|
|
124
|
-
outerPopover.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
109
|
+
expect(outerPopover.parentElement).to.exist;
|
|
110
|
+
if (outerPopover.parentElement) {
|
|
111
|
+
expect(outerPopover.parentElement.id).to.equal(
|
|
112
|
+
"overlay-content"
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
expect(isVisible(outerPopover)).to.be.false;
|
|
128
116
|
expect(button).to.exist;
|
|
129
|
-
const opened = oneEvent(
|
|
117
|
+
const opened = oneEvent(button, "sp-opened");
|
|
130
118
|
openOverlays.push(
|
|
131
119
|
await Overlay.open(button, "click", outerPopover, {
|
|
132
120
|
delayed: false,
|
|
@@ -135,52 +123,25 @@ describe("Overlays, v1", () => {
|
|
|
135
123
|
})
|
|
136
124
|
);
|
|
137
125
|
await opened;
|
|
138
|
-
expect(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
expect(button).to.exist;
|
|
146
|
-
const opened = oneEvent(outerPopover, "sp-opened");
|
|
147
|
-
openOverlays.push(
|
|
148
|
-
await Overlay.open(button, "modal", outerPopover, {
|
|
149
|
-
delayed: false
|
|
150
|
-
})
|
|
151
|
-
);
|
|
152
|
-
await opened;
|
|
153
|
-
const firstFocused = outerPopover.querySelector(
|
|
154
|
-
"#outer-focus-target"
|
|
155
|
-
);
|
|
156
|
-
expect(document.activeElement === firstFocused).to.be.true;
|
|
157
|
-
await sendKeys({
|
|
158
|
-
press: "Tab"
|
|
159
|
-
});
|
|
160
|
-
expect(document.activeElement === button).to.be.false;
|
|
161
|
-
await sendKeys({
|
|
162
|
-
press: "Tab"
|
|
126
|
+
expect(outerPopover.parentElement).to.exist;
|
|
127
|
+
if (outerPopover.parentElement) {
|
|
128
|
+
expect(outerPopover.parentElement.id).not.to.equal(
|
|
129
|
+
"overlay-content"
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
expect(isVisible(outerPopover)).to.be.true;
|
|
163
133
|
});
|
|
164
|
-
expect(document.activeElement === button).to.be.false;
|
|
165
|
-
await sendKeys({
|
|
166
|
-
press: "Shift+Tab"
|
|
167
|
-
});
|
|
168
|
-
expect(document.activeElement === button).to.be.false;
|
|
169
|
-
await sendKeys({
|
|
170
|
-
press: "Shift+Tab"
|
|
171
|
-
});
|
|
172
|
-
expect(document.activeElement === button).to.be.false;
|
|
173
|
-
await sendKeys({
|
|
174
|
-
press: "Shift+Tab"
|
|
175
|
-
});
|
|
176
|
-
expect(document.activeElement === button).to.be.false;
|
|
177
134
|
});
|
|
178
135
|
it(`updates a popover`, async () => {
|
|
179
136
|
const button = testDiv.querySelector("#first-button");
|
|
180
137
|
const outerPopover = testDiv.querySelector("#outer-popover");
|
|
181
|
-
expect(
|
|
138
|
+
expect(outerPopover.parentElement).to.exist;
|
|
139
|
+
if (outerPopover.parentElement) {
|
|
140
|
+
expect(outerPopover.parentElement.id).to.equal("overlay-content");
|
|
141
|
+
}
|
|
142
|
+
expect(isVisible(outerPopover)).to.be.false;
|
|
182
143
|
expect(button).to.exist;
|
|
183
|
-
const opened = oneEvent(
|
|
144
|
+
const opened = oneEvent(button, "sp-opened");
|
|
184
145
|
openOverlays.push(
|
|
185
146
|
await Overlay.open(button, "click", outerPopover, {
|
|
186
147
|
delayed: false,
|
|
@@ -188,16 +149,20 @@ describe("Overlays, v1", () => {
|
|
|
188
149
|
})
|
|
189
150
|
);
|
|
190
151
|
await opened;
|
|
191
|
-
expect(
|
|
152
|
+
expect(isVisible(outerPopover)).to.be.true;
|
|
192
153
|
Overlay.update();
|
|
193
|
-
expect(
|
|
154
|
+
expect(isVisible(outerPopover)).to.be.true;
|
|
194
155
|
});
|
|
195
156
|
it(`opens a popover w/ delay`, async () => {
|
|
196
157
|
const button = testDiv.querySelector("#first-button");
|
|
197
158
|
const outerPopover = testDiv.querySelector("#outer-popover");
|
|
198
|
-
expect(
|
|
159
|
+
expect(outerPopover.parentElement).to.exist;
|
|
160
|
+
if (outerPopover.parentElement) {
|
|
161
|
+
expect(outerPopover.parentElement.id).to.equal("overlay-content");
|
|
162
|
+
}
|
|
163
|
+
expect(isVisible(outerPopover)).to.be.false;
|
|
199
164
|
expect(button).to.exist;
|
|
200
|
-
const opened = oneEvent(
|
|
165
|
+
const opened = oneEvent(button, "sp-opened");
|
|
201
166
|
openOverlays.push(
|
|
202
167
|
await Overlay.open(button, "click", outerPopover, {
|
|
203
168
|
delayed: true,
|
|
@@ -205,7 +170,13 @@ describe("Overlays, v1", () => {
|
|
|
205
170
|
})
|
|
206
171
|
);
|
|
207
172
|
await opened;
|
|
208
|
-
expect(
|
|
173
|
+
expect(outerPopover.parentElement).to.exist;
|
|
174
|
+
if (outerPopover.parentElement) {
|
|
175
|
+
expect(outerPopover.parentElement.id).not.to.equal(
|
|
176
|
+
"overlay-content"
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
expect(isVisible(outerPopover)).to.be.true;
|
|
209
180
|
});
|
|
210
181
|
it("opens hover overlay", async () => {
|
|
211
182
|
const button = testDiv.querySelector("#first-button");
|
|
@@ -213,9 +184,9 @@ describe("Overlays, v1", () => {
|
|
|
213
184
|
const clickOverlay = testDiv.querySelector(
|
|
214
185
|
"#outer-popover"
|
|
215
186
|
);
|
|
216
|
-
expect(
|
|
217
|
-
expect(
|
|
218
|
-
let opened = oneEvent(
|
|
187
|
+
expect(isVisible(hoverOverlay)).to.be.false;
|
|
188
|
+
expect(isVisible(clickOverlay)).to.be.false;
|
|
189
|
+
let opened = oneEvent(button, "sp-opened");
|
|
219
190
|
openOverlays.push(
|
|
220
191
|
await Overlay.open(button, "hover", hoverOverlay, {
|
|
221
192
|
delayed: false,
|
|
@@ -224,9 +195,14 @@ describe("Overlays, v1", () => {
|
|
|
224
195
|
})
|
|
225
196
|
);
|
|
226
197
|
await opened;
|
|
227
|
-
expect(
|
|
228
|
-
|
|
229
|
-
|
|
198
|
+
expect(hoverOverlay.parentElement).to.exist;
|
|
199
|
+
if (hoverOverlay.parentElement) {
|
|
200
|
+
expect(hoverOverlay.parentElement.id).not.to.equal(
|
|
201
|
+
"overlay-content"
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
expect(isVisible(hoverOverlay)).to.be.true;
|
|
205
|
+
opened = oneEvent(button, "sp-opened");
|
|
230
206
|
openOverlays.push(
|
|
231
207
|
await Overlay.open(button, "click", clickOverlay, {
|
|
232
208
|
delayed: false,
|
|
@@ -235,12 +211,11 @@ describe("Overlays, v1", () => {
|
|
|
235
211
|
})
|
|
236
212
|
);
|
|
237
213
|
await opened;
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
).to.be.true;
|
|
243
|
-
expect(await isOnTopLayer(hoverOverlay), "hover overlay interactive").to.be.false;
|
|
214
|
+
if (hoverOverlay.parentElement) {
|
|
215
|
+
expect(hoverOverlay.parentElement.id).to.equal("overlay-content");
|
|
216
|
+
}
|
|
217
|
+
expect(isVisible(hoverOverlay)).to.be.false;
|
|
218
|
+
expect(isVisible(clickOverlay)).to.be.true;
|
|
244
219
|
});
|
|
245
220
|
it("opens custom overlay", async () => {
|
|
246
221
|
const button = testDiv.querySelector("#first-button");
|
|
@@ -250,9 +225,9 @@ describe("Overlays, v1", () => {
|
|
|
250
225
|
);
|
|
251
226
|
expect(button).to.exist;
|
|
252
227
|
expect(customOverlay).to.exist;
|
|
253
|
-
expect(
|
|
254
|
-
expect(
|
|
255
|
-
let opened = oneEvent(
|
|
228
|
+
expect(isVisible(customOverlay)).to.be.false;
|
|
229
|
+
expect(isVisible(clickOverlay)).to.be.false;
|
|
230
|
+
let opened = oneEvent(button, "sp-opened");
|
|
256
231
|
openOverlays.push(
|
|
257
232
|
await Overlay.open(button, "custom", customOverlay, {
|
|
258
233
|
delayed: false,
|
|
@@ -261,8 +236,14 @@ describe("Overlays, v1", () => {
|
|
|
261
236
|
})
|
|
262
237
|
);
|
|
263
238
|
await opened;
|
|
264
|
-
expect(
|
|
265
|
-
|
|
239
|
+
expect(customOverlay.parentElement).to.exist;
|
|
240
|
+
if (customOverlay.parentElement) {
|
|
241
|
+
expect(customOverlay.parentElement.id).not.to.equal(
|
|
242
|
+
"overlay-content"
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
expect(isVisible(customOverlay)).to.be.true;
|
|
246
|
+
opened = oneEvent(button, "sp-opened");
|
|
266
247
|
openOverlays.push(
|
|
267
248
|
await Overlay.open(button, "click", clickOverlay, {
|
|
268
249
|
delayed: false,
|
|
@@ -271,58 +252,52 @@ describe("Overlays, v1", () => {
|
|
|
271
252
|
})
|
|
272
253
|
);
|
|
273
254
|
await opened;
|
|
274
|
-
expect(
|
|
255
|
+
expect(isVisible(customOverlay)).to.be.true;
|
|
256
|
+
expect(isVisible(clickOverlay)).to.be.true;
|
|
275
257
|
});
|
|
276
258
|
it("closes via events", async () => {
|
|
277
|
-
const
|
|
278
|
-
<div>
|
|
279
|
-
<sp-
|
|
280
|
-
<sp-dialog dismissable>
|
|
281
|
-
Some Content for the Dialog.
|
|
282
|
-
</sp-dialog>
|
|
283
|
-
</sp-popover>
|
|
259
|
+
const el = await fixture(html`
|
|
260
|
+
<div id="root">
|
|
261
|
+
<sp-dialog dismissable></sp-dialog>
|
|
284
262
|
</div>
|
|
285
263
|
`);
|
|
286
|
-
const el = test.querySelector("sp-popover");
|
|
287
264
|
const dialog = el.querySelector("sp-dialog");
|
|
288
265
|
const opened = oneEvent(el, "sp-opened");
|
|
289
266
|
openOverlays.push(
|
|
290
|
-
await Overlay.open(
|
|
267
|
+
await Overlay.open(el, "click", dialog, {
|
|
291
268
|
delayed: false,
|
|
292
269
|
placement: "bottom",
|
|
293
270
|
offset: 10
|
|
294
271
|
})
|
|
295
272
|
);
|
|
296
273
|
await opened;
|
|
297
|
-
expect(await isInteractive(el)).to.be.true;
|
|
298
|
-
const closed = oneEvent(el, "sp-closed");
|
|
299
274
|
dialog.close();
|
|
300
|
-
await
|
|
301
|
-
|
|
275
|
+
await waitUntil(
|
|
276
|
+
() => !!dialog.parentElement && dialog.parentElement.tagName !== "ACTIVE-OVERLAY",
|
|
277
|
+
"content is returned"
|
|
278
|
+
);
|
|
302
279
|
});
|
|
303
280
|
it("closes an inline overlay when tabbing past the content", async () => {
|
|
304
281
|
const el = await fixture(html`
|
|
305
282
|
<div>
|
|
306
283
|
<sp-button class="trigger">Trigger</sp-button>
|
|
307
|
-
<
|
|
284
|
+
<div class="content">
|
|
308
285
|
<input />
|
|
309
|
-
</
|
|
286
|
+
</div>
|
|
310
287
|
<input value="After" id="after" />
|
|
311
288
|
</div>
|
|
312
289
|
`);
|
|
313
290
|
const trigger = el.querySelector(".trigger");
|
|
314
291
|
const content = el.querySelector(".content");
|
|
315
292
|
const input = el.querySelector("input");
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
);
|
|
323
|
-
await opened;
|
|
324
|
-
expect(await isInteractive(content)).to.be.true;
|
|
293
|
+
const after = el.querySelector("#after");
|
|
294
|
+
openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
|
|
295
|
+
trigger.focus();
|
|
296
|
+
await sendKeys({
|
|
297
|
+
press: "Tab"
|
|
298
|
+
});
|
|
325
299
|
expect(document.activeElement).to.equal(input);
|
|
300
|
+
expect(input.closest("active-overlay") !== null);
|
|
326
301
|
await sendKeys({
|
|
327
302
|
press: "Shift+Tab"
|
|
328
303
|
});
|
|
@@ -331,13 +306,13 @@ describe("Overlays, v1", () => {
|
|
|
331
306
|
press: "Tab"
|
|
332
307
|
});
|
|
333
308
|
expect(document.activeElement).to.equal(input);
|
|
334
|
-
const closed = oneEvent(content, "sp-closed");
|
|
335
309
|
await sendKeys({
|
|
336
310
|
press: "Tab"
|
|
337
311
|
});
|
|
338
|
-
expect(document.activeElement).to.equal(
|
|
339
|
-
await
|
|
340
|
-
|
|
312
|
+
expect(document.activeElement).to.equal(after);
|
|
313
|
+
await waitUntil(
|
|
314
|
+
() => document.querySelector("active-overlay") === null
|
|
315
|
+
);
|
|
341
316
|
});
|
|
342
317
|
it("closes an inline overlay when tabbing before the trigger", async () => {
|
|
343
318
|
const el = await fixture(html`
|
|
@@ -355,13 +330,14 @@ describe("Overlays, v1", () => {
|
|
|
355
330
|
const trigger = el.querySelector(".trigger");
|
|
356
331
|
const content = el.querySelector(".content");
|
|
357
332
|
const input = el.querySelector(".content input");
|
|
358
|
-
const
|
|
333
|
+
const before = el.querySelector("#before");
|
|
359
334
|
openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
|
|
360
335
|
trigger.focus();
|
|
361
336
|
await sendKeys({
|
|
362
337
|
press: "Tab"
|
|
363
338
|
});
|
|
364
339
|
expect(document.activeElement).to.equal(input);
|
|
340
|
+
expect(input.closest("active-overlay") !== null);
|
|
365
341
|
await sendKeys({
|
|
366
342
|
press: "Shift+Tab"
|
|
367
343
|
});
|
|
@@ -369,7 +345,10 @@ describe("Overlays, v1", () => {
|
|
|
369
345
|
await sendKeys({
|
|
370
346
|
press: "Shift+Tab"
|
|
371
347
|
});
|
|
372
|
-
expect(document.activeElement).to.equal(
|
|
348
|
+
expect(document.activeElement).to.equal(before);
|
|
349
|
+
await waitUntil(
|
|
350
|
+
() => document.querySelector("active-overlay") === null
|
|
351
|
+
);
|
|
373
352
|
});
|
|
374
353
|
it("opens detached content", async () => {
|
|
375
354
|
const textContent = "This is a detached element that has been overlaid";
|
|
@@ -378,127 +357,118 @@ describe("Overlays, v1", () => {
|
|
|
378
357
|
<button>Trigger</button>
|
|
379
358
|
`
|
|
380
359
|
);
|
|
381
|
-
const content = document.createElement("
|
|
360
|
+
const content = document.createElement("div");
|
|
382
361
|
content.textContent = textContent;
|
|
383
|
-
const opened = oneEvent(
|
|
362
|
+
const opened = oneEvent(el, "sp-opened");
|
|
384
363
|
const closeOverlay = await Overlay.open(el, "click", content, {
|
|
385
364
|
placement: "bottom"
|
|
386
365
|
});
|
|
387
366
|
await opened;
|
|
388
|
-
|
|
389
|
-
|
|
367
|
+
let activeOverlay = document.querySelector("active-overlay");
|
|
368
|
+
if (activeOverlay) {
|
|
369
|
+
expect(activeOverlay.textContent).to.equal(textContent);
|
|
370
|
+
} else {
|
|
371
|
+
expect(activeOverlay).to.not.be.null;
|
|
372
|
+
}
|
|
373
|
+
const closed = oneEvent(el, "sp-closed");
|
|
390
374
|
closeOverlay();
|
|
391
375
|
await closed;
|
|
392
|
-
|
|
376
|
+
activeOverlay = document.querySelector("active-overlay");
|
|
377
|
+
expect(activeOverlay).to.be.null;
|
|
393
378
|
content.remove();
|
|
394
379
|
});
|
|
395
380
|
});
|
|
396
|
-
describe('Overlay - type="modal"
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
height = window.innerHeight;
|
|
418
|
-
});
|
|
419
|
-
after(() => {
|
|
420
|
-
var _a;
|
|
421
|
-
(_a = document.querySelector("sp-theme")) == null ? void 0 : _a.remove();
|
|
422
|
-
});
|
|
423
|
-
it('opens the first "contextmenu" overlay', async () => {
|
|
424
|
-
const opened = oneEvent(document, "sp-opened");
|
|
425
|
-
await sendMouse({
|
|
426
|
-
steps: [
|
|
427
|
-
{
|
|
428
|
-
type: "move",
|
|
429
|
-
position: [width / 2 + 50, height / 2]
|
|
381
|
+
describe('Overlay - type="modal"', () => {
|
|
382
|
+
it("closes on `contextmenu` and passes that to the underlying page", async () => {
|
|
383
|
+
await fixture(html`
|
|
384
|
+
${virtualElement({
|
|
385
|
+
...virtualElement.args,
|
|
386
|
+
offset: 6
|
|
387
|
+
})}
|
|
388
|
+
`);
|
|
389
|
+
const width = window.innerWidth;
|
|
390
|
+
const height = window.innerHeight;
|
|
391
|
+
let opened = oneEvent(document, "sp-opened");
|
|
392
|
+
sendMouse({
|
|
393
|
+
steps: [
|
|
394
|
+
{
|
|
395
|
+
type: "move",
|
|
396
|
+
position: [width / 2 + 50, height / 2]
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
type: "click",
|
|
400
|
+
options: {
|
|
401
|
+
button: "right"
|
|
430
402
|
},
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
button: "right"
|
|
435
|
-
},
|
|
436
|
-
position: [width / 2 + 50, height / 2]
|
|
437
|
-
}
|
|
438
|
-
]
|
|
439
|
-
});
|
|
440
|
-
await opened;
|
|
441
|
-
firstMenu = document.querySelector("sp-popover");
|
|
442
|
-
expect(firstMenu.textContent).to.include("Menu source: end");
|
|
443
|
-
firstRect = firstMenu.getBoundingClientRect();
|
|
444
|
-
expect(firstMenu).to.not.be.null;
|
|
403
|
+
position: [width / 2 + 50, height / 2]
|
|
404
|
+
}
|
|
405
|
+
]
|
|
445
406
|
});
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
407
|
+
await opened;
|
|
408
|
+
const firstOverlay = document.querySelector(
|
|
409
|
+
"active-overlay"
|
|
410
|
+
);
|
|
411
|
+
const firstHeadline = firstOverlay.querySelector(
|
|
412
|
+
'[slot="header"]'
|
|
413
|
+
);
|
|
414
|
+
expect(firstOverlay, "first overlay").to.not.be.null;
|
|
415
|
+
expect(firstOverlay.isConnected).to.be.true;
|
|
416
|
+
expect(firstHeadline.textContent).to.equal("Menu source: end");
|
|
417
|
+
let closed = oneEvent(document, "sp-closed");
|
|
418
|
+
opened = oneEvent(document, "sp-opened");
|
|
419
|
+
sendMouse({
|
|
420
|
+
steps: [
|
|
421
|
+
{
|
|
422
|
+
type: "move",
|
|
423
|
+
position: [width / 4, height / 4]
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
type: "click",
|
|
427
|
+
options: {
|
|
428
|
+
button: "right"
|
|
429
|
+
},
|
|
430
|
+
position: [width / 4, height / 4]
|
|
431
|
+
}
|
|
432
|
+
]
|
|
471
433
|
});
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
434
|
+
await closed;
|
|
435
|
+
await opened;
|
|
436
|
+
const secondOverlay = document.querySelector(
|
|
437
|
+
"active-overlay"
|
|
438
|
+
);
|
|
439
|
+
const secondHeadline = secondOverlay.querySelector(
|
|
440
|
+
'[slot="header"]'
|
|
441
|
+
);
|
|
442
|
+
expect(secondOverlay, "second overlay").to.not.be.null;
|
|
443
|
+
expect(secondOverlay).to.not.equal(firstOverlay);
|
|
444
|
+
expect(firstOverlay.isConnected).to.be.false;
|
|
445
|
+
expect(secondOverlay.isConnected).to.be.true;
|
|
446
|
+
expect(secondHeadline.textContent).to.equal("Menu source: start");
|
|
447
|
+
closed = oneEvent(document, "sp-closed");
|
|
448
|
+
sendMouse({
|
|
449
|
+
steps: [
|
|
450
|
+
{
|
|
451
|
+
type: "move",
|
|
452
|
+
position: [width / 8, height / 8]
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
type: "click",
|
|
456
|
+
position: [width / 8, height / 8]
|
|
457
|
+
}
|
|
458
|
+
]
|
|
485
459
|
});
|
|
460
|
+
await closed;
|
|
461
|
+
await nextFrame();
|
|
486
462
|
});
|
|
487
463
|
it("does not open content off of the viewport", async () => {
|
|
488
|
-
before(async () => {
|
|
489
|
-
await setViewport({ width: 360, height: 640 });
|
|
490
|
-
await nextFrame();
|
|
491
|
-
});
|
|
492
|
-
after(async () => {
|
|
493
|
-
await setViewport({ width: 800, height: 600 });
|
|
494
|
-
await nextFrame();
|
|
495
|
-
});
|
|
496
464
|
await fixture(html`
|
|
497
|
-
${
|
|
498
|
-
...
|
|
465
|
+
${virtualElement({
|
|
466
|
+
...virtualElement.args,
|
|
499
467
|
offset: 6
|
|
500
468
|
})}
|
|
501
469
|
`);
|
|
470
|
+
await setViewport({ width: 360, height: 640 });
|
|
471
|
+
await nextFrame();
|
|
502
472
|
const opened = oneEvent(document, "sp-opened");
|
|
503
473
|
sendMouse({
|
|
504
474
|
steps: [
|
|
@@ -516,15 +486,19 @@ describe('Overlay - type="modal", v1', () => {
|
|
|
516
486
|
]
|
|
517
487
|
});
|
|
518
488
|
await opened;
|
|
519
|
-
const
|
|
520
|
-
|
|
521
|
-
|
|
489
|
+
const activeOverlay = document.querySelector(
|
|
490
|
+
"active-overlay"
|
|
491
|
+
);
|
|
492
|
+
expect(activeOverlay.placement).to.equal("right-start");
|
|
493
|
+
expect(activeOverlay.getAttribute("actual-placement")).to.equal(
|
|
494
|
+
"bottom"
|
|
495
|
+
);
|
|
522
496
|
const closed = oneEvent(document, "sp-closed");
|
|
523
497
|
sendKeys({
|
|
524
498
|
press: "Escape"
|
|
525
499
|
});
|
|
526
500
|
await closed;
|
|
527
|
-
|
|
501
|
+
await nextFrame();
|
|
528
502
|
});
|
|
529
503
|
it("opens children in the modal stack through shadow roots", async () => {
|
|
530
504
|
const el = await fixture(definedOverlayElement());
|
|
@@ -534,47 +508,51 @@ describe('Overlay - type="modal", v1', () => {
|
|
|
534
508
|
let open = oneEvent(el, "sp-opened");
|
|
535
509
|
trigger.click();
|
|
536
510
|
await open;
|
|
537
|
-
expect(el.open).to.equal("click");
|
|
538
511
|
const content = document.querySelector(
|
|
539
512
|
"popover-content"
|
|
540
513
|
);
|
|
541
514
|
open = oneEvent(content, "sp-opened");
|
|
542
515
|
content.button.click();
|
|
543
516
|
await open;
|
|
544
|
-
|
|
517
|
+
const activeOverlays = document.querySelectorAll("active-overlay");
|
|
518
|
+
activeOverlays.forEach((overlay) => {
|
|
519
|
+
expect(overlay.slot).to.equal("open");
|
|
520
|
+
});
|
|
545
521
|
let close = oneEvent(content, "sp-closed");
|
|
546
522
|
content.trigger.removeAttribute("open");
|
|
547
523
|
await close;
|
|
548
|
-
expect(content.trigger.open).to.be.null;
|
|
549
524
|
close = oneEvent(el, "sp-closed");
|
|
550
525
|
el.removeAttribute("open");
|
|
551
526
|
await close;
|
|
552
|
-
expect(el.open).to.be.null;
|
|
553
527
|
});
|
|
554
528
|
});
|
|
555
|
-
describe("Overlay - timing
|
|
529
|
+
describe("Overlay - timing", () => {
|
|
556
530
|
it("manages multiple modals in a row without preventing them from closing", async () => {
|
|
557
531
|
const test = await fixture(html`
|
|
558
532
|
<div>
|
|
559
|
-
<overlay-trigger
|
|
533
|
+
<overlay-trigger>
|
|
560
534
|
<sp-button slot="trigger">Trigger 1</sp-button>
|
|
561
535
|
<sp-popover slot="hover-content">
|
|
562
536
|
<p>Hover contentent for "Trigger 1".</p>
|
|
563
537
|
</sp-popover>
|
|
564
538
|
</overlay-trigger>
|
|
565
|
-
<overlay-trigger
|
|
539
|
+
<overlay-trigger>
|
|
566
540
|
<sp-button slot="trigger">Trigger 2</sp-button>
|
|
567
|
-
<sp-popover slot="click-content">
|
|
568
|
-
<p>Click contentent for "Trigger 2".</p>
|
|
569
|
-
</sp-popover>
|
|
570
541
|
<sp-popover slot="hover-content">
|
|
571
542
|
<p>Hover contentent for "Trigger 2".</p>
|
|
572
543
|
</sp-popover>
|
|
544
|
+
<sp-popover slot="click-content">
|
|
545
|
+
<p>Click contentent for "Trigger 2".</p>
|
|
546
|
+
</sp-popover>
|
|
573
547
|
</overlay-trigger>
|
|
574
548
|
</div>
|
|
575
549
|
`);
|
|
576
|
-
const overlayTrigger1 = test.querySelector(
|
|
577
|
-
|
|
550
|
+
const overlayTrigger1 = test.querySelector(
|
|
551
|
+
"overlay-trigger:first-child"
|
|
552
|
+
);
|
|
553
|
+
const overlayTrigger2 = test.querySelector(
|
|
554
|
+
"overlay-trigger:last-child"
|
|
555
|
+
);
|
|
578
556
|
const trigger1 = overlayTrigger1.querySelector(
|
|
579
557
|
'[slot="trigger"]'
|
|
580
558
|
);
|
|
@@ -587,13 +565,17 @@ describe("Overlay - timing, v1", () => {
|
|
|
587
565
|
boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
|
|
588
566
|
boundingRectTrigger1.top + boundingRectTrigger1.height / 2
|
|
589
567
|
];
|
|
590
|
-
const
|
|
591
|
-
boundingRectTrigger1.left + boundingRectTrigger1.width
|
|
592
|
-
|
|
568
|
+
const outsideTrigger1 = [
|
|
569
|
+
boundingRectTrigger1.left + boundingRectTrigger1.width * 2,
|
|
570
|
+
boundingRectTrigger1.top + boundingRectTrigger1.height * 2
|
|
593
571
|
];
|
|
594
572
|
const trigger2Position = [
|
|
595
573
|
boundingRectTrigger2.left + boundingRectTrigger2.width / 2,
|
|
596
|
-
boundingRectTrigger2.top + boundingRectTrigger2.height /
|
|
574
|
+
boundingRectTrigger2.top + boundingRectTrigger2.height / 2
|
|
575
|
+
];
|
|
576
|
+
const outsideTrigger2 = [
|
|
577
|
+
boundingRectTrigger2.left + boundingRectTrigger2.width * 2,
|
|
578
|
+
boundingRectTrigger2.top + boundingRectTrigger2.height / 2
|
|
597
579
|
];
|
|
598
580
|
await sendMouse({
|
|
599
581
|
steps: [
|
|
@@ -609,7 +591,7 @@ describe("Overlay - timing, v1", () => {
|
|
|
609
591
|
steps: [
|
|
610
592
|
{
|
|
611
593
|
type: "move",
|
|
612
|
-
position:
|
|
594
|
+
position: outsideTrigger1
|
|
613
595
|
}
|
|
614
596
|
]
|
|
615
597
|
});
|
|
@@ -626,7 +608,7 @@ describe("Overlay - timing, v1", () => {
|
|
|
626
608
|
await nextFrame();
|
|
627
609
|
await nextFrame();
|
|
628
610
|
const opened = oneEvent(trigger2, "sp-opened");
|
|
629
|
-
|
|
611
|
+
sendMouse({
|
|
630
612
|
steps: [
|
|
631
613
|
{
|
|
632
614
|
type: "click",
|
|
@@ -635,23 +617,23 @@ describe("Overlay - timing, v1", () => {
|
|
|
635
617
|
]
|
|
636
618
|
});
|
|
637
619
|
await opened;
|
|
638
|
-
await nextFrame();
|
|
639
|
-
await nextFrame();
|
|
640
620
|
expect(overlayTrigger1.hasAttribute("open")).to.be.false;
|
|
641
621
|
expect(overlayTrigger2.hasAttribute("open")).to.be.true;
|
|
642
622
|
expect(overlayTrigger2.getAttribute("open")).to.equal("click");
|
|
643
623
|
const closed = oneEvent(overlayTrigger2, "sp-closed");
|
|
644
|
-
|
|
624
|
+
sendMouse({
|
|
645
625
|
steps: [
|
|
646
626
|
{
|
|
647
627
|
type: "click",
|
|
648
|
-
position:
|
|
628
|
+
position: outsideTrigger2
|
|
649
629
|
}
|
|
650
630
|
]
|
|
651
631
|
});
|
|
652
632
|
await closed;
|
|
633
|
+
for (let i = 0; i < 3; i++)
|
|
634
|
+
await nextFrame();
|
|
653
635
|
expect(overlayTrigger1.hasAttribute("open")).to.be.false;
|
|
654
|
-
expect(overlayTrigger2.hasAttribute("open")).to.be.false;
|
|
636
|
+
expect(overlayTrigger2.hasAttribute("open"), overlayTrigger2.open).to.be.false;
|
|
655
637
|
});
|
|
656
638
|
});
|
|
657
|
-
//# sourceMappingURL=overlay
|
|
639
|
+
//# sourceMappingURL=overlay.test.js.map
|