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