@spectrum-web-components/overlay 0.16.4 → 0.16.6-devmode.7

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.
Files changed (93) hide show
  1. package/active-overlay.dev.js +3 -0
  2. package/active-overlay.dev.js.map +7 -0
  3. package/active-overlay.js +3 -14
  4. package/active-overlay.js.map +7 -1
  5. package/overlay-trigger.dev.js +3 -0
  6. package/overlay-trigger.dev.js.map +7 -0
  7. package/overlay-trigger.js +3 -14
  8. package/overlay-trigger.js.map +7 -1
  9. package/package.json +68 -14
  10. package/src/ActiveOverlay.dev.js +445 -0
  11. package/src/ActiveOverlay.dev.js.map +7 -0
  12. package/src/ActiveOverlay.js +404 -424
  13. package/src/ActiveOverlay.js.map +7 -1
  14. package/src/OverlayTrigger.dev.js +293 -0
  15. package/src/OverlayTrigger.dev.js.map +7 -0
  16. package/src/OverlayTrigger.js +245 -264
  17. package/src/OverlayTrigger.js.map +7 -1
  18. package/src/VirtualTrigger.dev.js +30 -0
  19. package/src/VirtualTrigger.dev.js.map +7 -0
  20. package/src/VirtualTrigger.js +28 -38
  21. package/src/VirtualTrigger.js.map +7 -1
  22. package/src/active-overlay.css.dev.js +12 -0
  23. package/src/active-overlay.css.dev.js.map +7 -0
  24. package/src/active-overlay.css.js +3 -14
  25. package/src/active-overlay.css.js.map +7 -1
  26. package/src/index.dev.js +7 -0
  27. package/src/index.dev.js.map +7 -0
  28. package/src/index.js +7 -18
  29. package/src/index.js.map +7 -1
  30. package/src/loader.dev.js +5 -0
  31. package/src/loader.dev.js.map +7 -0
  32. package/src/loader.js +3 -14
  33. package/src/loader.js.map +7 -1
  34. package/src/overlay-events.dev.js +7 -0
  35. package/src/overlay-events.dev.js.map +7 -0
  36. package/src/overlay-events.js +5 -16
  37. package/src/overlay-events.js.map +7 -1
  38. package/src/overlay-stack.dev.js +436 -0
  39. package/src/overlay-stack.dev.js.map +7 -0
  40. package/src/overlay-stack.js +374 -420
  41. package/src/overlay-stack.js.map +7 -1
  42. package/src/overlay-timer.dev.js +71 -0
  43. package/src/overlay-timer.dev.js.map +7 -0
  44. package/src/overlay-timer.js +64 -82
  45. package/src/overlay-timer.js.map +7 -1
  46. package/src/overlay-trigger.css.dev.js +6 -0
  47. package/src/overlay-trigger.css.dev.js.map +7 -0
  48. package/src/overlay-trigger.css.js +3 -14
  49. package/src/overlay-trigger.css.js.map +7 -1
  50. package/src/overlay-types.dev.js +1 -0
  51. package/src/overlay-types.dev.js.map +7 -0
  52. package/src/overlay-types.js +1 -13
  53. package/src/overlay-types.js.map +7 -1
  54. package/src/overlay-utils.dev.js +28 -0
  55. package/src/overlay-utils.dev.js.map +7 -0
  56. package/src/overlay-utils.js +22 -33
  57. package/src/overlay-utils.js.map +7 -1
  58. package/src/overlay.dev.js +85 -0
  59. package/src/overlay.dev.js.map +7 -0
  60. package/src/overlay.js +83 -119
  61. package/src/overlay.js.map +7 -1
  62. package/stories/overlay-story-components.js +188 -184
  63. package/stories/overlay-story-components.js.map +7 -1
  64. package/stories/overlay.stories.js +238 -228
  65. package/stories/overlay.stories.js.map +7 -1
  66. package/sync/overlay-trigger.dev.js +7 -0
  67. package/sync/overlay-trigger.dev.js.map +7 -0
  68. package/sync/overlay-trigger.js +5 -16
  69. package/sync/overlay-trigger.js.map +7 -1
  70. package/test/benchmark/basic-test.js +7 -18
  71. package/test/benchmark/basic-test.js.map +7 -1
  72. package/test/overlay-lifecycle.test.js +107 -115
  73. package/test/overlay-lifecycle.test.js.map +7 -1
  74. package/test/overlay-timer.test.js +110 -122
  75. package/test/overlay-timer.test.js.map +7 -1
  76. package/test/overlay-trigger-click.test.js +43 -48
  77. package/test/overlay-trigger-click.test.js.map +7 -1
  78. package/test/overlay-trigger-extended.test.js +167 -182
  79. package/test/overlay-trigger-extended.test.js.map +7 -1
  80. package/test/overlay-trigger-hover-click.test.js +59 -73
  81. package/test/overlay-trigger-hover-click.test.js.map +7 -1
  82. package/test/overlay-trigger-hover.test.js +74 -77
  83. package/test/overlay-trigger-hover.test.js.map +7 -1
  84. package/test/overlay-trigger-longpress.test.js +166 -178
  85. package/test/overlay-trigger-longpress.test.js.map +7 -1
  86. package/test/overlay-trigger-sync.test.js +400 -422
  87. package/test/overlay-trigger-sync.test.js.map +7 -1
  88. package/test/overlay-trigger.test.js +400 -422
  89. package/test/overlay-trigger.test.js.map +7 -1
  90. package/test/overlay.test-vrt.js +4 -15
  91. package/test/overlay.test-vrt.js.map +7 -1
  92. package/test/overlay.test.js +458 -479
  93. package/test/overlay.test.js.map +7 -1
@@ -1,29 +1,31 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- import '@spectrum-web-components/button/sp-button.js';
13
- import '@spectrum-web-components/dialog/sp-dialog.js';
14
- import '@spectrum-web-components/popover/sp-popover.js';
15
- import { setViewport } from '@web/test-runner-commands';
16
- import { Overlay } from '../';
17
- import { isVisible, waitForPredicate } from '../../../test/testing-helpers.js';
18
- import { elementUpdated, expect, fixture, html, nextFrame, oneEvent, waitUntil, } from '@open-wc/testing';
19
- import { sendKeys } from '@web/test-runner-commands';
20
- import { definedOverlayElement, virtualElement, } from '../stories/overlay.stories';
21
- import { sendMouse } from '../../../test/plugins/browser.js';
22
- describe('Overlays', () => {
23
- let testDiv;
24
- let openOverlays = [];
25
- beforeEach(async () => {
26
- testDiv = await fixture(html `
1
+ import "@spectrum-web-components/button/sp-button.js";
2
+ import "@spectrum-web-components/dialog/sp-dialog.js";
3
+ import "@spectrum-web-components/popover/sp-popover.js";
4
+ import { setViewport } from "@web/test-runner-commands";
5
+ import {
6
+ Overlay
7
+ } from "@spectrum-web-components/overlay";
8
+ import { isVisible, waitForPredicate } from "../../../test/testing-helpers.js";
9
+ import {
10
+ elementUpdated,
11
+ expect,
12
+ fixture,
13
+ html,
14
+ nextFrame,
15
+ oneEvent,
16
+ waitUntil
17
+ } from "@open-wc/testing";
18
+ import { sendKeys } from "@web/test-runner-commands";
19
+ import {
20
+ definedOverlayElement,
21
+ virtualElement
22
+ } from "../stories/overlay.stories";
23
+ import { sendMouse } from "../../../test/plugins/browser.js";
24
+ describe("Overlays", () => {
25
+ let testDiv;
26
+ let openOverlays = [];
27
+ beforeEach(async () => {
28
+ testDiv = await fixture(html`
27
29
  <div id="top">
28
30
  <style>
29
31
  body {
@@ -73,185 +75,165 @@ describe('Overlays', () => {
73
75
  </div>
74
76
  </div>
75
77
  `);
76
- await elementUpdated(testDiv);
77
- });
78
- afterEach(() => {
79
- openOverlays.map((close) => close());
80
- openOverlays = [];
81
- });
82
- [
83
- 'bottom',
84
- 'bottom-start',
85
- 'bottom-end',
86
- 'top',
87
- 'top-start',
88
- 'top-end',
89
- 'left',
90
- 'left-start',
91
- 'left-end',
92
- 'right',
93
- 'right-start',
94
- 'right-end',
95
- 'none',
96
- ].map((direction) => {
97
- const placement = direction;
98
- it(`opens a popover - ${placement}`, async () => {
99
- const button = testDiv.querySelector('#first-button');
100
- const outerPopover = testDiv.querySelector('#outer-popover');
101
- expect(outerPopover.parentElement).to.exist;
102
- if (outerPopover.parentElement) {
103
- expect(outerPopover.parentElement.id).to.equal('overlay-content');
104
- }
105
- expect(isVisible(outerPopover)).to.be.false;
106
- expect(button).to.exist;
107
- openOverlays.push(await Overlay.open(button, 'click', outerPopover, {
108
- delayed: false,
109
- placement,
110
- offset: 10,
111
- }));
112
- // Wait for the DOM node to be stolen and reparented into the overlay
113
- await waitForPredicate(() => !!(outerPopover.parentElement &&
114
- outerPopover.parentElement.id !== 'overlay-content'));
115
- expect(outerPopover.parentElement).to.exist;
116
- if (outerPopover.parentElement) {
117
- expect(outerPopover.parentElement.id).not.to.equal('overlay-content');
118
- }
119
- expect(isVisible(outerPopover)).to.be.true;
120
- });
121
- });
122
- it(`updates a popover`, async () => {
123
- const button = testDiv.querySelector('#first-button');
124
- const outerPopover = testDiv.querySelector('#outer-popover');
125
- expect(outerPopover.parentElement).to.exist;
126
- if (outerPopover.parentElement) {
127
- expect(outerPopover.parentElement.id).to.equal('overlay-content');
128
- }
129
- expect(isVisible(outerPopover)).to.be.false;
130
- expect(button).to.exist;
131
- openOverlays.push(await Overlay.open(button, 'click', outerPopover, {
132
- delayed: false,
133
- offset: 10,
134
- }));
135
- // Wait for the DOM node to be stolen and reparented into the overlay
136
- await waitForPredicate(() => !!(outerPopover.parentElement &&
137
- outerPopover.parentElement.id !== 'overlay-content'));
138
- expect(isVisible(outerPopover)).to.be.true;
139
- Overlay.update();
140
- expect(isVisible(outerPopover)).to.be.true;
78
+ await elementUpdated(testDiv);
79
+ });
80
+ afterEach(() => {
81
+ openOverlays.map((close) => close());
82
+ openOverlays = [];
83
+ });
84
+ [
85
+ "bottom",
86
+ "bottom-start",
87
+ "bottom-end",
88
+ "top",
89
+ "top-start",
90
+ "top-end",
91
+ "left",
92
+ "left-start",
93
+ "left-end",
94
+ "right",
95
+ "right-start",
96
+ "right-end",
97
+ "none"
98
+ ].map((direction) => {
99
+ const placement = direction;
100
+ it(`opens a popover - ${placement}`, async () => {
101
+ const button = testDiv.querySelector("#first-button");
102
+ const outerPopover = testDiv.querySelector("#outer-popover");
103
+ expect(outerPopover.parentElement).to.exist;
104
+ if (outerPopover.parentElement) {
105
+ expect(outerPopover.parentElement.id).to.equal("overlay-content");
106
+ }
107
+ expect(isVisible(outerPopover)).to.be.false;
108
+ expect(button).to.exist;
109
+ openOverlays.push(await Overlay.open(button, "click", outerPopover, {
110
+ delayed: false,
111
+ placement,
112
+ offset: 10
113
+ }));
114
+ await waitForPredicate(() => !!(outerPopover.parentElement && outerPopover.parentElement.id !== "overlay-content"));
115
+ expect(outerPopover.parentElement).to.exist;
116
+ if (outerPopover.parentElement) {
117
+ expect(outerPopover.parentElement.id).not.to.equal("overlay-content");
118
+ }
119
+ expect(isVisible(outerPopover)).to.be.true;
141
120
  });
142
- it(`opens a popover w/ delay`, async () => {
143
- const button = testDiv.querySelector('#first-button');
144
- const outerPopover = testDiv.querySelector('#outer-popover');
145
- expect(outerPopover.parentElement).to.exist;
146
- if (outerPopover.parentElement) {
147
- expect(outerPopover.parentElement.id).to.equal('overlay-content');
148
- }
149
- expect(isVisible(outerPopover)).to.be.false;
150
- expect(button).to.exist;
151
- openOverlays.push(await Overlay.open(button, 'click', outerPopover, {
152
- delayed: true,
153
- offset: 10,
154
- }));
155
- // Wait for the DOM node to be stolen and reparented into the overlay
156
- await waitUntil(() => !!(outerPopover.parentElement &&
157
- outerPopover.parentElement.id !== 'overlay-content'), 'overlay opened');
158
- expect(outerPopover.parentElement).to.exist;
159
- if (outerPopover.parentElement) {
160
- expect(outerPopover.parentElement.id).not.to.equal('overlay-content');
161
- }
162
- expect(isVisible(outerPopover)).to.be.true;
163
- });
164
- it('opens hover overlay', async () => {
165
- const button = testDiv.querySelector('#first-button');
166
- const hoverOverlay = testDiv.querySelector('#hover-1');
167
- const clickOverlay = testDiv.querySelector('#outer-popover');
168
- expect(button).to.exist;
169
- expect(hoverOverlay).to.exist;
170
- expect(isVisible(hoverOverlay)).to.be.false;
171
- expect(isVisible(clickOverlay)).to.be.false;
172
- openOverlays.push(await Overlay.open(button, 'hover', hoverOverlay, {
173
- delayed: false,
174
- placement: 'top',
175
- offset: 10,
176
- }));
177
- // Wait for the DOM node to be stolen and reparented into the overlay
178
- await waitForPredicate(() => !!(hoverOverlay.parentElement &&
179
- hoverOverlay.parentElement.id !== 'overlay-content'));
180
- expect(hoverOverlay.parentElement).to.exist;
181
- if (hoverOverlay.parentElement) {
182
- expect(hoverOverlay.parentElement.id).not.to.equal('overlay-content');
183
- }
184
- expect(isVisible(hoverOverlay)).to.be.true;
185
- // Opening click overlay should close the hover overlay
186
- openOverlays.push(await Overlay.open(button, 'click', clickOverlay, {
187
- delayed: false,
188
- placement: 'bottom',
189
- offset: 10,
190
- }));
191
- // Wait for the DOM node to be stolen and reparented into the overlay
192
- await waitForPredicate(() => !!(clickOverlay.parentElement &&
193
- clickOverlay.parentElement.id !== 'overlay-content' &&
194
- hoverOverlay.parentElement &&
195
- hoverOverlay.parentElement.id === 'overlay-content'));
196
- if (hoverOverlay.parentElement) {
197
- expect(hoverOverlay.parentElement.id).to.equal('overlay-content');
198
- }
199
- expect(isVisible(hoverOverlay)).to.be.false;
200
- expect(isVisible(clickOverlay)).to.be.true;
201
- });
202
- it('opens custom overlay', async () => {
203
- const button = testDiv.querySelector('#first-button');
204
- const customOverlay = testDiv.querySelector('#hover-1');
205
- const clickOverlay = testDiv.querySelector('#outer-popover');
206
- expect(button).to.exist;
207
- expect(customOverlay).to.exist;
208
- expect(isVisible(customOverlay)).to.be.false;
209
- expect(isVisible(clickOverlay)).to.be.false;
210
- openOverlays.push(await Overlay.open(button, 'custom', customOverlay, {
211
- delayed: false,
212
- placement: 'top',
213
- offset: 10,
214
- }));
215
- // Wait for the DOM node to be stolen and reparented into the overlay
216
- await waitForPredicate(() => !!(customOverlay.parentElement &&
217
- customOverlay.parentElement.id !== 'overlay-content'));
218
- expect(customOverlay.parentElement).to.exist;
219
- if (customOverlay.parentElement) {
220
- expect(customOverlay.parentElement.id).not.to.equal('overlay-content');
221
- }
222
- expect(isVisible(customOverlay)).to.be.true;
223
- // Opening click overlay should close the hover overlay
224
- openOverlays.push(await Overlay.open(button, 'click', clickOverlay, {
225
- delayed: false,
226
- placement: 'bottom',
227
- offset: 10,
228
- }));
229
- // Wait for the DOM node to be stolen and reparented into the overlay
230
- await waitForPredicate(() => !!(clickOverlay.parentElement &&
231
- clickOverlay.parentElement.id !== 'overlay-content'));
232
- expect(isVisible(customOverlay)).to.be.true;
233
- expect(isVisible(clickOverlay)).to.be.true;
234
- });
235
- it('closes via events', async () => {
236
- const el = await fixture(html `
121
+ });
122
+ it(`updates a popover`, async () => {
123
+ const button = testDiv.querySelector("#first-button");
124
+ const outerPopover = testDiv.querySelector("#outer-popover");
125
+ expect(outerPopover.parentElement).to.exist;
126
+ if (outerPopover.parentElement) {
127
+ expect(outerPopover.parentElement.id).to.equal("overlay-content");
128
+ }
129
+ expect(isVisible(outerPopover)).to.be.false;
130
+ expect(button).to.exist;
131
+ openOverlays.push(await Overlay.open(button, "click", outerPopover, {
132
+ delayed: false,
133
+ offset: 10
134
+ }));
135
+ await waitForPredicate(() => !!(outerPopover.parentElement && outerPopover.parentElement.id !== "overlay-content"));
136
+ expect(isVisible(outerPopover)).to.be.true;
137
+ Overlay.update();
138
+ expect(isVisible(outerPopover)).to.be.true;
139
+ });
140
+ it(`opens a popover w/ delay`, async () => {
141
+ const button = testDiv.querySelector("#first-button");
142
+ const outerPopover = testDiv.querySelector("#outer-popover");
143
+ expect(outerPopover.parentElement).to.exist;
144
+ if (outerPopover.parentElement) {
145
+ expect(outerPopover.parentElement.id).to.equal("overlay-content");
146
+ }
147
+ expect(isVisible(outerPopover)).to.be.false;
148
+ expect(button).to.exist;
149
+ openOverlays.push(await Overlay.open(button, "click", outerPopover, {
150
+ delayed: true,
151
+ offset: 10
152
+ }));
153
+ await waitUntil(() => !!(outerPopover.parentElement && outerPopover.parentElement.id !== "overlay-content"), "overlay opened");
154
+ expect(outerPopover.parentElement).to.exist;
155
+ if (outerPopover.parentElement) {
156
+ expect(outerPopover.parentElement.id).not.to.equal("overlay-content");
157
+ }
158
+ expect(isVisible(outerPopover)).to.be.true;
159
+ });
160
+ it("opens hover overlay", async () => {
161
+ const button = testDiv.querySelector("#first-button");
162
+ const hoverOverlay = testDiv.querySelector("#hover-1");
163
+ const clickOverlay = testDiv.querySelector("#outer-popover");
164
+ expect(button).to.exist;
165
+ expect(hoverOverlay).to.exist;
166
+ expect(isVisible(hoverOverlay)).to.be.false;
167
+ expect(isVisible(clickOverlay)).to.be.false;
168
+ openOverlays.push(await Overlay.open(button, "hover", hoverOverlay, {
169
+ delayed: false,
170
+ placement: "top",
171
+ offset: 10
172
+ }));
173
+ await waitForPredicate(() => !!(hoverOverlay.parentElement && hoverOverlay.parentElement.id !== "overlay-content"));
174
+ expect(hoverOverlay.parentElement).to.exist;
175
+ if (hoverOverlay.parentElement) {
176
+ expect(hoverOverlay.parentElement.id).not.to.equal("overlay-content");
177
+ }
178
+ expect(isVisible(hoverOverlay)).to.be.true;
179
+ openOverlays.push(await Overlay.open(button, "click", clickOverlay, {
180
+ delayed: false,
181
+ placement: "bottom",
182
+ offset: 10
183
+ }));
184
+ await waitForPredicate(() => !!(clickOverlay.parentElement && clickOverlay.parentElement.id !== "overlay-content" && hoverOverlay.parentElement && hoverOverlay.parentElement.id === "overlay-content"));
185
+ if (hoverOverlay.parentElement) {
186
+ expect(hoverOverlay.parentElement.id).to.equal("overlay-content");
187
+ }
188
+ expect(isVisible(hoverOverlay)).to.be.false;
189
+ expect(isVisible(clickOverlay)).to.be.true;
190
+ });
191
+ it("opens custom overlay", async () => {
192
+ const button = testDiv.querySelector("#first-button");
193
+ const customOverlay = testDiv.querySelector("#hover-1");
194
+ const clickOverlay = testDiv.querySelector("#outer-popover");
195
+ expect(button).to.exist;
196
+ expect(customOverlay).to.exist;
197
+ expect(isVisible(customOverlay)).to.be.false;
198
+ expect(isVisible(clickOverlay)).to.be.false;
199
+ openOverlays.push(await Overlay.open(button, "custom", customOverlay, {
200
+ delayed: false,
201
+ placement: "top",
202
+ offset: 10
203
+ }));
204
+ await waitForPredicate(() => !!(customOverlay.parentElement && customOverlay.parentElement.id !== "overlay-content"));
205
+ expect(customOverlay.parentElement).to.exist;
206
+ if (customOverlay.parentElement) {
207
+ expect(customOverlay.parentElement.id).not.to.equal("overlay-content");
208
+ }
209
+ expect(isVisible(customOverlay)).to.be.true;
210
+ openOverlays.push(await Overlay.open(button, "click", clickOverlay, {
211
+ delayed: false,
212
+ placement: "bottom",
213
+ offset: 10
214
+ }));
215
+ await waitForPredicate(() => !!(clickOverlay.parentElement && clickOverlay.parentElement.id !== "overlay-content"));
216
+ expect(isVisible(customOverlay)).to.be.true;
217
+ expect(isVisible(clickOverlay)).to.be.true;
218
+ });
219
+ it("closes via events", async () => {
220
+ const el = await fixture(html`
237
221
  <div id="root">
238
222
  <sp-dialog dismissable></sp-dialog>
239
223
  </div>
240
224
  `);
241
- const dialog = el.querySelector('sp-dialog');
242
- openOverlays.push(await Overlay.open(el, 'click', dialog, {
243
- delayed: false,
244
- placement: 'bottom',
245
- offset: 10,
246
- }));
247
- await waitUntil(() => !!dialog.parentElement &&
248
- dialog.parentElement.tagName === 'ACTIVE-OVERLAY', 'content is stolen');
249
- dialog.close();
250
- await waitUntil(() => !!dialog.parentElement &&
251
- dialog.parentElement.tagName !== 'ACTIVE-OVERLAY', 'content is returned');
252
- });
253
- it('closes an inline overlay when tabbing past the content', async () => {
254
- const el = await fixture(html `
225
+ const dialog = el.querySelector("sp-dialog");
226
+ openOverlays.push(await Overlay.open(el, "click", dialog, {
227
+ delayed: false,
228
+ placement: "bottom",
229
+ offset: 10
230
+ }));
231
+ await waitUntil(() => !!dialog.parentElement && dialog.parentElement.tagName === "ACTIVE-OVERLAY", "content is stolen");
232
+ dialog.close();
233
+ await waitUntil(() => !!dialog.parentElement && dialog.parentElement.tagName !== "ACTIVE-OVERLAY", "content is returned");
234
+ });
235
+ it("closes an inline overlay when tabbing past the content", async () => {
236
+ const el = await fixture(html`
255
237
  <div>
256
238
  <sp-button class="trigger">Trigger</sp-button>
257
239
  <div class="content">
@@ -260,33 +242,33 @@ describe('Overlays', () => {
260
242
  <input value="After" id="after" />
261
243
  </div>
262
244
  `);
263
- const trigger = el.querySelector('.trigger');
264
- const content = el.querySelector('.content');
265
- const input = el.querySelector('input');
266
- const after = el.querySelector('#after');
267
- openOverlays.push(await Overlay.open(trigger, 'inline', content, {}));
268
- trigger.focus();
269
- await sendKeys({
270
- press: 'Tab',
271
- });
272
- expect(document.activeElement).to.equal(input);
273
- expect(input.closest('active-overlay') !== null);
274
- await sendKeys({
275
- press: 'Shift+Tab',
276
- });
277
- expect(document.activeElement).to.equal(trigger);
278
- await sendKeys({
279
- press: 'Tab',
280
- });
281
- expect(document.activeElement).to.equal(input);
282
- await sendKeys({
283
- press: 'Tab',
284
- });
285
- expect(document.activeElement).to.equal(after);
286
- await waitUntil(() => document.querySelector('active-overlay') === null);
245
+ const trigger = el.querySelector(".trigger");
246
+ const content = el.querySelector(".content");
247
+ const input = el.querySelector("input");
248
+ const after = el.querySelector("#after");
249
+ openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
250
+ trigger.focus();
251
+ await sendKeys({
252
+ press: "Tab"
253
+ });
254
+ expect(document.activeElement).to.equal(input);
255
+ expect(input.closest("active-overlay") !== null);
256
+ await sendKeys({
257
+ press: "Shift+Tab"
287
258
  });
288
- it('closes an inline overlay when tabbing before the trigger', async () => {
289
- const el = await fixture(html `
259
+ expect(document.activeElement).to.equal(trigger);
260
+ await sendKeys({
261
+ press: "Tab"
262
+ });
263
+ expect(document.activeElement).to.equal(input);
264
+ await sendKeys({
265
+ press: "Tab"
266
+ });
267
+ expect(document.activeElement).to.equal(after);
268
+ await waitUntil(() => document.querySelector("active-overlay") === null);
269
+ });
270
+ it("closes an inline overlay when tabbing before the trigger", async () => {
271
+ const el = await fixture(html`
290
272
  <div>
291
273
  <input value="Before" id="before" />
292
274
  <sp-button class="trigger">Trigger</sp-button>
@@ -298,189 +280,188 @@ describe('Overlays', () => {
298
280
  </div>
299
281
  </div>
300
282
  `);
301
- const trigger = el.querySelector('.trigger');
302
- const content = el.querySelector('.content');
303
- const input = el.querySelector('.content input');
304
- const before = el.querySelector('#before');
305
- openOverlays.push(await Overlay.open(trigger, 'inline', content, {}));
306
- trigger.focus();
307
- await sendKeys({
308
- press: 'Tab',
309
- });
310
- expect(document.activeElement).to.equal(input);
311
- expect(input.closest('active-overlay') !== null);
312
- await sendKeys({
313
- press: 'Shift+Tab',
314
- });
315
- expect(document.activeElement).to.equal(trigger);
316
- await sendKeys({
317
- press: 'Shift+Tab',
318
- });
319
- expect(document.activeElement).to.equal(before);
320
- await waitUntil(() => document.querySelector('active-overlay') === null);
283
+ const trigger = el.querySelector(".trigger");
284
+ const content = el.querySelector(".content");
285
+ const input = el.querySelector(".content input");
286
+ const before = el.querySelector("#before");
287
+ openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
288
+ trigger.focus();
289
+ await sendKeys({
290
+ press: "Tab"
291
+ });
292
+ expect(document.activeElement).to.equal(input);
293
+ expect(input.closest("active-overlay") !== null);
294
+ await sendKeys({
295
+ press: "Shift+Tab"
296
+ });
297
+ expect(document.activeElement).to.equal(trigger);
298
+ await sendKeys({
299
+ press: "Shift+Tab"
321
300
  });
322
- it('opens detached content', async () => {
323
- const textContent = 'This is a detached element that has been overlaid';
324
- const el = await fixture(html `
301
+ expect(document.activeElement).to.equal(before);
302
+ await waitUntil(() => document.querySelector("active-overlay") === null);
303
+ });
304
+ it("opens detached content", async () => {
305
+ const textContent = "This is a detached element that has been overlaid";
306
+ const el = await fixture(html`
325
307
  <button>Trigger</button>
326
308
  `);
327
- const content = document.createElement('div');
328
- content.textContent = textContent;
329
- const opened = oneEvent(el, 'sp-opened');
330
- const closeOverlay = await Overlay.open(el, 'click', content, {
331
- placement: 'bottom',
332
- });
333
- await opened;
334
- let activeOverlay = document.querySelector('active-overlay');
335
- if (activeOverlay) {
336
- expect(activeOverlay.textContent).to.equal(textContent);
337
- }
338
- else {
339
- expect(activeOverlay).to.not.be.null;
340
- }
341
- const closed = oneEvent(el, 'sp-closed');
342
- closeOverlay();
343
- await closed;
344
- activeOverlay = document.querySelector('active-overlay');
345
- expect(activeOverlay).to.be.null;
346
- content.remove();
309
+ const content = document.createElement("div");
310
+ content.textContent = textContent;
311
+ const opened = oneEvent(el, "sp-opened");
312
+ const closeOverlay = await Overlay.open(el, "click", content, {
313
+ placement: "bottom"
347
314
  });
315
+ await opened;
316
+ let activeOverlay = document.querySelector("active-overlay");
317
+ if (activeOverlay) {
318
+ expect(activeOverlay.textContent).to.equal(textContent);
319
+ } else {
320
+ expect(activeOverlay).to.not.be.null;
321
+ }
322
+ const closed = oneEvent(el, "sp-closed");
323
+ closeOverlay();
324
+ await closed;
325
+ activeOverlay = document.querySelector("active-overlay");
326
+ expect(activeOverlay).to.be.null;
327
+ content.remove();
328
+ });
348
329
  });
349
330
  describe('Overlay - type="modal"', () => {
350
- it('closes on `contextmenu` and passes that to the underlying page', async () => {
351
- await fixture(html `
352
- ${virtualElement(Object.assign(Object.assign({}, virtualElement.args), { offset: 6 }))}
331
+ it("closes on `contextmenu` and passes that to the underlying page", async () => {
332
+ await fixture(html`
333
+ ${virtualElement({
334
+ ...virtualElement.args,
335
+ offset: 6
336
+ })}
353
337
  `);
354
- const width = window.innerWidth;
355
- const height = window.innerHeight;
356
- let opened = oneEvent(document, 'sp-opened');
357
- // Right click to open "context menu" overlay.
358
- sendMouse({
359
- steps: [
360
- {
361
- type: 'move',
362
- position: [width / 2 + 50, height / 2],
363
- },
364
- {
365
- type: 'click',
366
- options: {
367
- button: 'right',
368
- },
369
- position: [width / 2 + 50, height / 2],
370
- },
371
- ],
372
- });
373
- await opened;
374
- const firstOverlay = document.querySelector('active-overlay');
375
- const firstHeadline = firstOverlay.querySelector('[slot="header"]');
376
- expect(firstOverlay, 'first overlay').to.not.be.null;
377
- expect(firstOverlay.isConnected).to.be.true;
378
- expect(firstHeadline.textContent).to.equal('Menu source: end');
379
- let closed = oneEvent(document, 'sp-closed');
380
- opened = oneEvent(document, 'sp-opened');
381
- // Right click to out of the "context menu" overlay to both close
382
- // the first overlay and have the event passed to the surfacing page
383
- // in order to open a subsequent "context menu" overlay.
384
- sendMouse({
385
- steps: [
386
- {
387
- type: 'move',
388
- position: [width / 4, height / 4],
389
- },
390
- {
391
- type: 'click',
392
- options: {
393
- button: 'right',
394
- },
395
- position: [width / 4, height / 4],
396
- },
397
- ],
398
- });
399
- await closed;
400
- await opened;
401
- const secondOverlay = document.querySelector('active-overlay');
402
- const secondHeadline = secondOverlay.querySelector('[slot="header"]');
403
- expect(secondOverlay, 'second overlay').to.not.be.null;
404
- expect(secondOverlay).to.not.equal(firstOverlay);
405
- expect(firstOverlay.isConnected).to.be.false;
406
- expect(secondOverlay.isConnected).to.be.true;
407
- expect(secondHeadline.textContent).to.equal('Menu source: start');
408
- closed = oneEvent(document, 'sp-closed');
409
- sendMouse({
410
- steps: [
411
- {
412
- type: 'move',
413
- position: [width / 8, height / 8],
414
- },
415
- {
416
- type: 'click',
417
- position: [width / 8, height / 8],
418
- },
419
- ],
420
- });
421
- await closed;
422
- await nextFrame();
338
+ const width = window.innerWidth;
339
+ const height = window.innerHeight;
340
+ let opened = oneEvent(document, "sp-opened");
341
+ sendMouse({
342
+ steps: [
343
+ {
344
+ type: "move",
345
+ position: [width / 2 + 50, height / 2]
346
+ },
347
+ {
348
+ type: "click",
349
+ options: {
350
+ button: "right"
351
+ },
352
+ position: [width / 2 + 50, height / 2]
353
+ }
354
+ ]
355
+ });
356
+ await opened;
357
+ const firstOverlay = document.querySelector("active-overlay");
358
+ const firstHeadline = firstOverlay.querySelector('[slot="header"]');
359
+ expect(firstOverlay, "first overlay").to.not.be.null;
360
+ expect(firstOverlay.isConnected).to.be.true;
361
+ expect(firstHeadline.textContent).to.equal("Menu source: end");
362
+ let closed = oneEvent(document, "sp-closed");
363
+ opened = oneEvent(document, "sp-opened");
364
+ sendMouse({
365
+ steps: [
366
+ {
367
+ type: "move",
368
+ position: [width / 4, height / 4]
369
+ },
370
+ {
371
+ type: "click",
372
+ options: {
373
+ button: "right"
374
+ },
375
+ position: [width / 4, height / 4]
376
+ }
377
+ ]
423
378
  });
424
- it('does not open content off of the viewport', async () => {
425
- await fixture(html `
426
- ${virtualElement(Object.assign(Object.assign({}, virtualElement.args), { offset: 6 }))}
379
+ await closed;
380
+ await opened;
381
+ const secondOverlay = document.querySelector("active-overlay");
382
+ const secondHeadline = secondOverlay.querySelector('[slot="header"]');
383
+ expect(secondOverlay, "second overlay").to.not.be.null;
384
+ expect(secondOverlay).to.not.equal(firstOverlay);
385
+ expect(firstOverlay.isConnected).to.be.false;
386
+ expect(secondOverlay.isConnected).to.be.true;
387
+ expect(secondHeadline.textContent).to.equal("Menu source: start");
388
+ closed = oneEvent(document, "sp-closed");
389
+ sendMouse({
390
+ steps: [
391
+ {
392
+ type: "move",
393
+ position: [width / 8, height / 8]
394
+ },
395
+ {
396
+ type: "click",
397
+ position: [width / 8, height / 8]
398
+ }
399
+ ]
400
+ });
401
+ await closed;
402
+ await nextFrame();
403
+ });
404
+ it("does not open content off of the viewport", async () => {
405
+ await fixture(html`
406
+ ${virtualElement({
407
+ ...virtualElement.args,
408
+ offset: 6
409
+ })}
427
410
  `);
428
- await setViewport({ width: 360, height: 640 });
429
- // Allow viewport update to propagate.
430
- await nextFrame();
431
- const opened = oneEvent(document, 'sp-opened');
432
- // Right click to open "context menu" overlay.
433
- sendMouse({
434
- steps: [
435
- {
436
- type: 'move',
437
- position: [270, 10],
438
- },
439
- {
440
- type: 'click',
441
- options: {
442
- button: 'right',
443
- },
444
- position: [270, 10],
445
- },
446
- ],
447
- });
448
- await opened;
449
- const activeOverlay = document.querySelector('active-overlay');
450
- expect(activeOverlay.placement).to.equal('right-start');
451
- expect(activeOverlay.getAttribute('actual-placement')).to.equal('bottom');
452
- const closed = oneEvent(document, 'sp-closed');
453
- sendKeys({
454
- press: 'Escape',
455
- });
456
- await closed;
457
- await nextFrame();
411
+ await setViewport({ width: 360, height: 640 });
412
+ await nextFrame();
413
+ const opened = oneEvent(document, "sp-opened");
414
+ sendMouse({
415
+ steps: [
416
+ {
417
+ type: "move",
418
+ position: [270, 10]
419
+ },
420
+ {
421
+ type: "click",
422
+ options: {
423
+ button: "right"
424
+ },
425
+ position: [270, 10]
426
+ }
427
+ ]
428
+ });
429
+ await opened;
430
+ const activeOverlay = document.querySelector("active-overlay");
431
+ expect(activeOverlay.placement).to.equal("right-start");
432
+ expect(activeOverlay.getAttribute("actual-placement")).to.equal("bottom");
433
+ const closed = oneEvent(document, "sp-closed");
434
+ sendKeys({
435
+ press: "Escape"
458
436
  });
459
- it('opens children in the modal stack through shadow roots', async () => {
460
- const el = await fixture(definedOverlayElement());
461
- const trigger = el.querySelector('[slot="trigger"]');
462
- let open = oneEvent(el, 'sp-opened');
463
- trigger.click();
464
- await open;
465
- const content = document.querySelector('popover-content');
466
- open = oneEvent(content, 'sp-opened');
467
- content.button.click();
468
- await open;
469
- const activeOverlays = document.querySelectorAll('active-overlay');
470
- activeOverlays.forEach((overlay) => {
471
- expect(overlay.slot).to.equal('open');
472
- });
473
- let close = oneEvent(content, 'sp-closed');
474
- content.trigger.removeAttribute('open');
475
- await close;
476
- close = oneEvent(el, 'sp-closed');
477
- el.removeAttribute('open');
478
- await close;
437
+ await closed;
438
+ await nextFrame();
439
+ });
440
+ it("opens children in the modal stack through shadow roots", async () => {
441
+ const el = await fixture(definedOverlayElement());
442
+ const trigger = el.querySelector('[slot="trigger"]');
443
+ let open = oneEvent(el, "sp-opened");
444
+ trigger.click();
445
+ await open;
446
+ const content = document.querySelector("popover-content");
447
+ open = oneEvent(content, "sp-opened");
448
+ content.button.click();
449
+ await open;
450
+ const activeOverlays = document.querySelectorAll("active-overlay");
451
+ activeOverlays.forEach((overlay) => {
452
+ expect(overlay.slot).to.equal("open");
479
453
  });
454
+ let close = oneEvent(content, "sp-closed");
455
+ content.trigger.removeAttribute("open");
456
+ await close;
457
+ close = oneEvent(el, "sp-closed");
458
+ el.removeAttribute("open");
459
+ await close;
460
+ });
480
461
  });
481
- describe('Overlay - timing', () => {
482
- it('manages multiple modals in a row without preventing them from closing', async () => {
483
- const test = await fixture(html `
462
+ describe("Overlay - timing", () => {
463
+ it("manages multiple modals in a row without preventing them from closing", async () => {
464
+ const test = await fixture(html`
484
465
  <div>
485
466
  <overlay-trigger>
486
467
  <sp-button slot="trigger">Trigger 1</sp-button>
@@ -499,87 +480,85 @@ describe('Overlay - timing', () => {
499
480
  </overlay-trigger>
500
481
  </div>
501
482
  `);
502
- const overlayTrigger1 = test.querySelector('overlay-trigger:first-child');
503
- const overlayTrigger2 = test.querySelector('overlay-trigger:last-child');
504
- const trigger1 = overlayTrigger1.querySelector('[slot="trigger"]');
505
- const trigger2 = overlayTrigger2.querySelector('[slot="trigger"]');
506
- const boundingRectTrigger1 = trigger1.getBoundingClientRect();
507
- const boundingRectTrigger2 = trigger2.getBoundingClientRect();
508
- const trigger1Position = [
509
- boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
510
- boundingRectTrigger1.top + boundingRectTrigger1.height / 2,
511
- ];
512
- const outsideTrigger1 = [
513
- boundingRectTrigger1.left + boundingRectTrigger1.width * 2,
514
- boundingRectTrigger1.top + boundingRectTrigger1.height * 2,
515
- ];
516
- const trigger2Position = [
517
- boundingRectTrigger2.left + boundingRectTrigger2.width / 2,
518
- boundingRectTrigger2.top + boundingRectTrigger2.height / 2,
519
- ];
520
- const outsideTrigger2 = [
521
- boundingRectTrigger2.left + boundingRectTrigger2.width * 2,
522
- boundingRectTrigger2.top + boundingRectTrigger2.height / 2,
523
- ];
524
- await sendMouse({
525
- steps: [
526
- {
527
- type: 'move',
528
- position: trigger1Position,
529
- },
530
- ],
531
- });
532
- await nextFrame();
533
- await nextFrame();
534
- await sendMouse({
535
- steps: [
536
- {
537
- type: 'move',
538
- position: outsideTrigger1,
539
- },
540
- ],
541
- });
542
- await nextFrame();
543
- await nextFrame();
544
- await sendMouse({
545
- steps: [
546
- {
547
- type: 'move',
548
- position: trigger2Position,
549
- },
550
- ],
551
- });
552
- await nextFrame();
553
- await nextFrame();
554
- const opened = oneEvent(trigger2, 'sp-opened');
555
- sendMouse({
556
- steps: [
557
- {
558
- type: 'click',
559
- position: trigger2Position,
560
- },
561
- ],
562
- });
563
- await opened;
564
- expect(overlayTrigger1.hasAttribute('open')).to.be.false;
565
- expect(overlayTrigger2.hasAttribute('open')).to.be.true;
566
- expect(overlayTrigger2.getAttribute('open')).to.equal('click');
567
- const closed = oneEvent(overlayTrigger2, 'sp-closed');
568
- sendMouse({
569
- steps: [
570
- {
571
- type: 'click',
572
- position: outsideTrigger2,
573
- },
574
- ],
575
- });
576
- await closed;
577
- // sometimes safari needs to wait a few frames for the open attribute to update
578
- for (let i = 0; i < 3; i++)
579
- await nextFrame();
580
- expect(overlayTrigger1.hasAttribute('open')).to.be.false;
581
- expect(overlayTrigger2.hasAttribute('open'), overlayTrigger2.open).to.be
582
- .false;
483
+ const overlayTrigger1 = test.querySelector("overlay-trigger:first-child");
484
+ const overlayTrigger2 = test.querySelector("overlay-trigger:last-child");
485
+ const trigger1 = overlayTrigger1.querySelector('[slot="trigger"]');
486
+ const trigger2 = overlayTrigger2.querySelector('[slot="trigger"]');
487
+ const boundingRectTrigger1 = trigger1.getBoundingClientRect();
488
+ const boundingRectTrigger2 = trigger2.getBoundingClientRect();
489
+ const trigger1Position = [
490
+ boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
491
+ boundingRectTrigger1.top + boundingRectTrigger1.height / 2
492
+ ];
493
+ const outsideTrigger1 = [
494
+ boundingRectTrigger1.left + boundingRectTrigger1.width * 2,
495
+ boundingRectTrigger1.top + boundingRectTrigger1.height * 2
496
+ ];
497
+ const trigger2Position = [
498
+ boundingRectTrigger2.left + boundingRectTrigger2.width / 2,
499
+ boundingRectTrigger2.top + boundingRectTrigger2.height / 2
500
+ ];
501
+ const outsideTrigger2 = [
502
+ boundingRectTrigger2.left + boundingRectTrigger2.width * 2,
503
+ boundingRectTrigger2.top + boundingRectTrigger2.height / 2
504
+ ];
505
+ await sendMouse({
506
+ steps: [
507
+ {
508
+ type: "move",
509
+ position: trigger1Position
510
+ }
511
+ ]
512
+ });
513
+ await nextFrame();
514
+ await nextFrame();
515
+ await sendMouse({
516
+ steps: [
517
+ {
518
+ type: "move",
519
+ position: outsideTrigger1
520
+ }
521
+ ]
522
+ });
523
+ await nextFrame();
524
+ await nextFrame();
525
+ await sendMouse({
526
+ steps: [
527
+ {
528
+ type: "move",
529
+ position: trigger2Position
530
+ }
531
+ ]
532
+ });
533
+ await nextFrame();
534
+ await nextFrame();
535
+ const opened = oneEvent(trigger2, "sp-opened");
536
+ sendMouse({
537
+ steps: [
538
+ {
539
+ type: "click",
540
+ position: trigger2Position
541
+ }
542
+ ]
543
+ });
544
+ await opened;
545
+ expect(overlayTrigger1.hasAttribute("open")).to.be.false;
546
+ expect(overlayTrigger2.hasAttribute("open")).to.be.true;
547
+ expect(overlayTrigger2.getAttribute("open")).to.equal("click");
548
+ const closed = oneEvent(overlayTrigger2, "sp-closed");
549
+ sendMouse({
550
+ steps: [
551
+ {
552
+ type: "click",
553
+ position: outsideTrigger2
554
+ }
555
+ ]
583
556
  });
557
+ await closed;
558
+ for (let i = 0; i < 3; i++)
559
+ await nextFrame();
560
+ expect(overlayTrigger1.hasAttribute("open")).to.be.false;
561
+ expect(overlayTrigger2.hasAttribute("open"), overlayTrigger2.open).to.be.false;
562
+ });
584
563
  });
585
- //# sourceMappingURL=overlay.test.js.map
564
+ //# sourceMappingURL=overlay.test.js.map