@spectrum-web-components/overlay 0.35.1-rc.43 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +150 -237
  2. package/active-overlay.d.ts +6 -0
  3. package/active-overlay.dev.js +5 -0
  4. package/{sp-overlay.dev.js.map → active-overlay.dev.js.map} +3 -3
  5. package/active-overlay.js +2 -0
  6. package/{sp-overlay.js.map → active-overlay.js.map} +4 -4
  7. package/custom-elements.json +1215 -0
  8. package/package.json +22 -49
  9. package/src/ActiveOverlay.d.ts +84 -0
  10. package/src/ActiveOverlay.dev.js +517 -0
  11. package/src/ActiveOverlay.dev.js.map +7 -0
  12. package/src/ActiveOverlay.js +16 -0
  13. package/src/ActiveOverlay.js.map +7 -0
  14. package/src/OverlayTrigger.d.ts +41 -24
  15. package/src/OverlayTrigger.dev.js +295 -133
  16. package/src/OverlayTrigger.dev.js.map +3 -3
  17. package/src/OverlayTrigger.js +22 -52
  18. package/src/OverlayTrigger.js.map +3 -3
  19. package/src/VirtualTrigger.dev.js +1 -2
  20. package/src/VirtualTrigger.dev.js.map +2 -2
  21. package/src/VirtualTrigger.js +1 -1
  22. package/src/VirtualTrigger.js.map +2 -2
  23. package/src/active-overlay.css.dev.js +13 -0
  24. package/src/active-overlay.css.dev.js.map +7 -0
  25. package/src/active-overlay.css.js +10 -0
  26. package/src/active-overlay.css.js.map +7 -0
  27. package/src/index.d.ts +3 -2
  28. package/src/index.dev.js +3 -2
  29. package/src/index.dev.js.map +2 -2
  30. package/src/index.js +1 -1
  31. package/src/index.js.map +2 -2
  32. package/src/loader.d.ts +2 -1
  33. package/src/loader.dev.js +19 -2
  34. package/src/loader.dev.js.map +2 -2
  35. package/src/loader.js +1 -1
  36. package/src/loader.js.map +3 -3
  37. package/src/overlay-stack.d.ts +50 -0
  38. package/src/overlay-stack.dev.js +515 -0
  39. package/src/overlay-stack.dev.js.map +7 -0
  40. package/src/overlay-stack.js +34 -0
  41. package/src/overlay-stack.js.map +7 -0
  42. package/src/overlay-timer.dev.js.map +2 -2
  43. package/src/overlay-timer.js.map +2 -2
  44. package/src/overlay-trigger.css.dev.js +1 -1
  45. package/src/overlay-trigger.css.dev.js.map +1 -1
  46. package/src/overlay-trigger.css.js +1 -1
  47. package/src/overlay-trigger.css.js.map +1 -1
  48. package/src/overlay-types.d.ts +31 -25
  49. package/src/overlay-types.dev.js +0 -1
  50. package/src/overlay-types.dev.js.map +3 -3
  51. package/src/overlay-types.js +1 -1
  52. package/src/overlay-types.js.map +3 -3
  53. package/src/overlay-utils.d.ts +3 -0
  54. package/src/overlay-utils.dev.js +31 -0
  55. package/src/overlay-utils.dev.js.map +7 -0
  56. package/src/overlay-utils.js +2 -0
  57. package/src/overlay-utils.js.map +7 -0
  58. package/src/overlay.d.ts +59 -0
  59. package/src/overlay.dev.js +127 -0
  60. package/src/overlay.dev.js.map +7 -0
  61. package/src/overlay.js +2 -0
  62. package/src/overlay.js.map +7 -0
  63. package/stories/overlay-story-components.js +8 -9
  64. package/stories/overlay-story-components.js.map +2 -2
  65. package/stories/overlay.stories.js +697 -825
  66. package/stories/overlay.stories.js.map +2 -2
  67. package/sync/overlay-trigger.d.ts +0 -4
  68. package/sync/overlay-trigger.dev.js +4 -1
  69. package/sync/overlay-trigger.dev.js.map +2 -2
  70. package/sync/overlay-trigger.js +1 -1
  71. package/sync/overlay-trigger.js.map +3 -3
  72. package/test/benchmark/basic-test.js +1 -1
  73. package/test/benchmark/basic-test.js.map +1 -1
  74. package/test/index.js +377 -408
  75. package/test/index.js.map +3 -3
  76. package/test/overlay-lifecycle.test.js +106 -34
  77. package/test/overlay-lifecycle.test.js.map +2 -2
  78. package/test/overlay-trigger-click.test.js +5 -11
  79. package/test/overlay-trigger-click.test.js.map +2 -2
  80. package/test/overlay-trigger-extended.test.js +36 -42
  81. package/test/overlay-trigger-extended.test.js.map +2 -2
  82. package/test/overlay-trigger-hover-click.test.js +24 -27
  83. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  84. package/test/overlay-trigger-hover.test.js +35 -41
  85. package/test/overlay-trigger-hover.test.js.map +2 -2
  86. package/test/overlay-trigger-longpress.test.js +81 -206
  87. package/test/overlay-trigger-longpress.test.js.map +2 -2
  88. package/test/overlay-trigger-sync.test.js +1 -1
  89. package/test/overlay-trigger-sync.test.js.map +2 -2
  90. package/test/overlay-trigger.test.js +1 -1
  91. package/test/overlay-trigger.test.js.map +2 -2
  92. package/test/overlay-update.test.js +4 -4
  93. package/test/overlay-update.test.js.map +2 -2
  94. package/test/overlay.test.js +268 -386
  95. package/test/overlay.test.js.map +3 -3
  96. package/sp-overlay.d.ts +0 -6
  97. package/sp-overlay.dev.js +0 -5
  98. package/sp-overlay.js +0 -2
  99. package/src/AbstractOverlay.d.ts +0 -56
  100. package/src/AbstractOverlay.dev.js +0 -202
  101. package/src/AbstractOverlay.dev.js.map +0 -7
  102. package/src/AbstractOverlay.js +0 -2
  103. package/src/AbstractOverlay.js.map +0 -7
  104. package/src/Overlay.d.ts +0 -147
  105. package/src/Overlay.dev.js +0 -777
  106. package/src/Overlay.dev.js.map +0 -7
  107. package/src/Overlay.js +0 -33
  108. package/src/Overlay.js.map +0 -7
  109. package/src/OverlayDialog.d.ts +0 -4
  110. package/src/OverlayDialog.dev.js +0 -135
  111. package/src/OverlayDialog.dev.js.map +0 -7
  112. package/src/OverlayDialog.js +0 -2
  113. package/src/OverlayDialog.js.map +0 -7
  114. package/src/OverlayNoPopover.d.ts +0 -4
  115. package/src/OverlayNoPopover.dev.js +0 -110
  116. package/src/OverlayNoPopover.dev.js.map +0 -7
  117. package/src/OverlayNoPopover.js +0 -2
  118. package/src/OverlayNoPopover.js.map +0 -7
  119. package/src/OverlayPopover.d.ts +0 -4
  120. package/src/OverlayPopover.dev.js +0 -169
  121. package/src/OverlayPopover.dev.js.map +0 -7
  122. package/src/OverlayPopover.js +0 -2
  123. package/src/OverlayPopover.js.map +0 -7
  124. package/src/OverlayStack.d.ts +0 -43
  125. package/src/OverlayStack.dev.js +0 -150
  126. package/src/OverlayStack.dev.js.map +0 -7
  127. package/src/OverlayStack.js +0 -2
  128. package/src/OverlayStack.js.map +0 -7
  129. package/src/PlacementController.d.ts +0 -38
  130. package/src/PlacementController.dev.js +0 -199
  131. package/src/PlacementController.dev.js.map +0 -7
  132. package/src/PlacementController.js +0 -2
  133. package/src/PlacementController.js.map +0 -7
  134. package/src/fullSizePlugin.d.ts +0 -12
  135. package/src/fullSizePlugin.dev.js +0 -39
  136. package/src/fullSizePlugin.dev.js.map +0 -7
  137. package/src/fullSizePlugin.js +0 -2
  138. package/src/fullSizePlugin.js.map +0 -7
  139. package/src/overlay.css.dev.js +0 -9
  140. package/src/overlay.css.dev.js.map +0 -7
  141. package/src/overlay.css.js +0 -6
  142. package/src/overlay.css.js.map +0 -7
  143. package/src/topLayerOverTransforms.d.ts +0 -2
  144. package/src/topLayerOverTransforms.dev.js +0 -91
  145. package/src/topLayerOverTransforms.dev.js.map +0 -7
  146. package/src/topLayerOverTransforms.js +0 -2
  147. package/src/topLayerOverTransforms.js.map +0 -7
  148. package/stories/overlay-element.stories.js +0 -463
  149. package/stories/overlay-element.stories.js.map +0 -7
  150. package/test/overlay-element.test-vrt.js +0 -5
  151. package/test/overlay-element.test-vrt.js.map +0 -7
  152. package/test/overlay-element.test.js +0 -681
  153. package/test/overlay-element.test.js.map +0 -7
  154. package/test/overlay-v1.test.js +0 -651
  155. package/test/overlay-v1.test.js.map +0 -7
  156. /package/src/{overlay.css.d.ts → active-overlay.css.d.ts} +0 -0
@@ -1,21 +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
- Overlay,
11
- VirtualTrigger
7
+ Overlay
12
8
  } from "@spectrum-web-components/overlay";
9
+ import { isVisible } from "../../../test/testing-helpers.js";
13
10
  import {
14
11
  elementUpdated,
15
12
  expect,
13
+ fixture,
16
14
  html,
17
15
  nextFrame,
18
- oneEvent
16
+ oneEvent,
17
+ waitUntil
19
18
  } from "@open-wc/testing";
20
19
  import { sendKeys } from "@web/test-runner-commands";
21
20
  import {
@@ -23,28 +22,11 @@ import {
23
22
  virtualElement
24
23
  } from "../stories/overlay.stories";
25
24
  import { sendMouse } from "../../../test/plugins/browser.js";
26
- import { spy } from "sinon";
27
- import "@spectrum-web-components/theme/sp-theme.js";
28
- import "@spectrum-web-components/theme/src/themes.js";
29
- import { render } from "@spectrum-web-components/base";
30
- import {
31
- fixture,
32
- isInteractive,
33
- isOnTopLayer
34
- } from "../../../test/testing-helpers.js";
35
- async function styledFixture(story) {
36
- const test = await fixture(html`
37
- <sp-theme theme="spectrum" scale="medium" color="dark">
38
- ${story}
39
- </sp-theme>
40
- `);
41
- return test.children[0];
42
- }
43
- describe("Overlays, v2", () => {
25
+ describe("Overlays", () => {
44
26
  let testDiv;
45
27
  let openOverlays = [];
46
28
  beforeEach(async () => {
47
- testDiv = await styledFixture(
29
+ testDiv = await fixture(
48
30
  html`
49
31
  <div id="top">
50
32
  <style>
@@ -66,28 +48,31 @@ describe("Overlays, v2", () => {
66
48
  display: none;
67
49
  }
68
50
  </style>
69
- <sp-button id="first-button" variant="primary">
51
+ <sp-button
52
+ id="first-button"
53
+ variant="primary"
54
+ slot="trigger"
55
+ >
70
56
  Show Popover
71
57
  </sp-button>
72
58
  <div id="overlay-content">
73
- <sp-popover id="outer-popover" direction="bottom" tip>
74
- <sp-dialog no-divider>
75
- <div class="options-popover-content">
76
- A popover message
77
- </div>
78
- <sp-button id="outer-focus-target">
79
- Test 1
80
- </sp-button>
81
- <sp-button>Test 2</sp-button>
82
- <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
83
68
  </sp-dialog>
84
69
  </sp-popover>
85
- <sp-tooltip id="hover-1" class="hover-content">
70
+ <div id="hover-1" class="hover-content">
86
71
  Hover message
87
- </sp-tooltip>
88
- <sp-tooltip id="hover-2" class="hover-content">
72
+ </div>
73
+ <div id="hover-2" class="hover-content">
89
74
  Other hover message
90
- </sp-tooltip>
75
+ </div>
91
76
  </div>
92
77
  </div>
93
78
  `
@@ -95,7 +80,7 @@ describe("Overlays, v2", () => {
95
80
  await elementUpdated(testDiv);
96
81
  });
97
82
  afterEach(() => {
98
- openOverlays.map((overlay) => overlay.open = false);
83
+ openOverlays.map((close) => close());
99
84
  openOverlays = [];
100
85
  });
101
86
  [
@@ -110,126 +95,88 @@ describe("Overlays, v2", () => {
110
95
  "left-end",
111
96
  "right",
112
97
  "right-start",
113
- "right-end"
98
+ "right-end",
99
+ "none"
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.addEventListener("click", () => {
125
- clickSpy();
126
- });
127
- expect(await isInteractive(outerPopover)).to.be.false;
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(outerPopover, "sp-opened");
117
+ const opened = oneEvent(button, "sp-opened");
130
118
  openOverlays.push(
131
- await Overlay.open(outerPopover, {
132
- trigger: button,
133
- type: "auto",
119
+ await Overlay.open(button, "click", outerPopover, {
134
120
  delayed: false,
135
121
  placement,
136
122
  offset: 10
137
123
  })
138
124
  );
139
- button.insertAdjacentElement(
140
- "afterend",
141
- openOverlays.at(-1)
142
- );
143
125
  await opened;
144
- expect(await isInteractive(outerPopover)).to.be.true;
145
- });
146
- });
147
- it(`opens a modal dialog`, async () => {
148
- const button = testDiv.querySelector("#first-button");
149
- const outerPopover = testDiv.querySelector("#outer-popover");
150
- expect(await isInteractive(outerPopover)).to.be.false;
151
- expect(button).to.exist;
152
- const opened = oneEvent(outerPopover, "sp-opened");
153
- openOverlays.push(
154
- await Overlay.open(outerPopover, {
155
- trigger: button
156
- })
157
- );
158
- button.insertAdjacentElement(
159
- "afterend",
160
- openOverlays.at(-1)
161
- );
162
- await opened;
163
- const firstFocused = outerPopover.querySelector(
164
- "#outer-focus-target"
165
- );
166
- expect(document.activeElement === firstFocused).to.be.true;
167
- await sendKeys({
168
- press: "Tab"
169
- });
170
- expect(document.activeElement === button).to.be.false;
171
- await sendKeys({
172
- press: "Tab"
173
- });
174
- expect(document.activeElement === button).to.be.false;
175
- await sendKeys({
176
- press: "Shift+Tab"
177
- });
178
- expect(document.activeElement === button).to.be.false;
179
- await sendKeys({
180
- press: "Shift+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;
181
133
  });
182
- expect(document.activeElement === button).to.be.false;
183
- await sendKeys({
184
- press: "Shift+Tab"
185
- });
186
- expect(document.activeElement === button).to.be.false;
187
134
  });
188
135
  it(`updates a popover`, async () => {
189
136
  const button = testDiv.querySelector("#first-button");
190
137
  const outerPopover = testDiv.querySelector("#outer-popover");
191
- expect(await isInteractive(outerPopover)).to.be.false;
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;
192
143
  expect(button).to.exist;
193
- const opened = oneEvent(outerPopover, "sp-opened");
144
+ const opened = oneEvent(button, "sp-opened");
194
145
  openOverlays.push(
195
- await Overlay.open(outerPopover, {
196
- trigger: button,
197
- type: "auto",
146
+ await Overlay.open(button, "click", outerPopover, {
147
+ delayed: false,
198
148
  offset: 10
199
149
  })
200
150
  );
201
- button.insertAdjacentElement(
202
- "afterend",
203
- openOverlays.at(-1)
204
- );
205
151
  await opened;
206
- expect(await isInteractive(outerPopover)).to.be.true;
152
+ expect(isVisible(outerPopover)).to.be.true;
207
153
  Overlay.update();
208
- expect(await isInteractive(outerPopover)).to.be.true;
154
+ expect(isVisible(outerPopover)).to.be.true;
209
155
  });
210
156
  it(`opens a popover w/ delay`, async () => {
211
157
  const button = testDiv.querySelector("#first-button");
212
158
  const outerPopover = testDiv.querySelector("#outer-popover");
213
- expect(await isInteractive(outerPopover)).to.be.false;
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;
214
164
  expect(button).to.exist;
215
- const opened = oneEvent(outerPopover, "sp-opened");
216
- const start = performance.now();
165
+ const opened = oneEvent(button, "sp-opened");
217
166
  openOverlays.push(
218
- await Overlay.open(outerPopover, {
219
- trigger: button,
220
- type: "auto",
167
+ await Overlay.open(button, "click", outerPopover, {
221
168
  delayed: true,
222
169
  offset: 10
223
170
  })
224
171
  );
225
- button.insertAdjacentElement(
226
- "afterend",
227
- openOverlays.at(-1)
228
- );
229
172
  await opened;
230
- const end = performance.now();
231
- expect(await isInteractive(outerPopover)).to.be.true;
232
- expect(end - start).to.be.greaterThan(1e3);
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;
233
180
  });
234
181
  it("opens hover overlay", async () => {
235
182
  const button = testDiv.querySelector("#first-button");
@@ -237,44 +184,38 @@ describe("Overlays, v2", () => {
237
184
  const clickOverlay = testDiv.querySelector(
238
185
  "#outer-popover"
239
186
  );
240
- expect(await isOnTopLayer(hoverOverlay)).to.be.false;
241
- expect(await isOnTopLayer(clickOverlay)).to.be.false;
242
- let opened = oneEvent(hoverOverlay, "sp-opened");
187
+ expect(isVisible(hoverOverlay)).to.be.false;
188
+ expect(isVisible(clickOverlay)).to.be.false;
189
+ let opened = oneEvent(button, "sp-opened");
243
190
  openOverlays.push(
244
- await Overlay.open(hoverOverlay, {
245
- trigger: button,
246
- type: "hint",
191
+ await Overlay.open(button, "hover", hoverOverlay, {
192
+ delayed: false,
247
193
  placement: "top",
248
194
  offset: 10
249
195
  })
250
196
  );
251
- button.insertAdjacentElement(
252
- "afterend",
253
- openOverlays.at(-1)
254
- );
255
197
  await opened;
256
- expect(await isOnTopLayer(hoverOverlay)).to.be.true;
257
- opened = oneEvent(clickOverlay, "sp-opened");
258
- const closed = oneEvent(hoverOverlay, "sp-closed");
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");
259
206
  openOverlays.push(
260
- await Overlay.open(clickOverlay, {
261
- trigger: button,
262
- type: "auto",
207
+ await Overlay.open(button, "click", clickOverlay, {
208
+ delayed: false,
263
209
  placement: "bottom",
264
210
  offset: 10
265
211
  })
266
212
  );
267
- button.insertAdjacentElement(
268
- "afterend",
269
- openOverlays.at(-1)
270
- );
271
213
  await opened;
272
- await closed;
273
- expect(
274
- await isInteractive(clickOverlay),
275
- "click overlay not interactive"
276
- ).to.be.true;
277
- 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;
278
219
  });
279
220
  it("opens custom overlay", async () => {
280
221
  const button = testDiv.querySelector("#first-button");
@@ -284,148 +225,94 @@ describe("Overlays, v2", () => {
284
225
  );
285
226
  expect(button).to.exist;
286
227
  expect(customOverlay).to.exist;
287
- expect(await isOnTopLayer(customOverlay)).to.be.false;
288
- expect(await isOnTopLayer(clickOverlay)).to.be.false;
289
- let opened = oneEvent(customOverlay, "sp-opened");
228
+ expect(isVisible(customOverlay)).to.be.false;
229
+ expect(isVisible(clickOverlay)).to.be.false;
230
+ let opened = oneEvent(button, "sp-opened");
290
231
  openOverlays.push(
291
- await Overlay.open(customOverlay, {
292
- trigger: button,
293
- type: "auto",
232
+ await Overlay.open(button, "custom", customOverlay, {
233
+ delayed: false,
294
234
  placement: "top",
295
235
  offset: 10
296
236
  })
297
237
  );
298
- button.insertAdjacentElement(
299
- "afterend",
300
- openOverlays.at(-1)
301
- );
302
238
  await opened;
303
- expect(await isOnTopLayer(customOverlay)).to.be.true;
304
- opened = oneEvent(clickOverlay, "sp-opened");
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");
305
247
  openOverlays.push(
306
- await Overlay.open(clickOverlay, {
307
- trigger: button,
308
- type: "auto",
248
+ await Overlay.open(button, "click", clickOverlay, {
249
+ delayed: false,
309
250
  placement: "bottom",
310
251
  offset: 10
311
252
  })
312
253
  );
313
- button.insertAdjacentElement(
314
- "afterend",
315
- openOverlays.at(-1)
316
- );
317
254
  await opened;
318
- expect(await isOnTopLayer(clickOverlay), "click content open").to.be.true;
255
+ expect(isVisible(customOverlay)).to.be.true;
256
+ expect(isVisible(clickOverlay)).to.be.true;
319
257
  });
320
258
  it("closes via events", async () => {
321
- const test = await fixture(html`
322
- <div>
323
- <sp-popover id="root">
324
- <sp-dialog dismissable>
325
- Some Content for the Dialog.
326
- </sp-dialog>
327
- </sp-popover>
259
+ const el = await fixture(html`
260
+ <div id="root">
261
+ <sp-dialog dismissable></sp-dialog>
328
262
  </div>
329
263
  `);
330
- const el = test.querySelector("sp-popover");
331
264
  const dialog = el.querySelector("sp-dialog");
332
265
  const opened = oneEvent(el, "sp-opened");
333
266
  openOverlays.push(
334
- await Overlay.open(el, {
335
- trigger: test,
336
- type: "auto",
267
+ await Overlay.open(el, "click", dialog, {
268
+ delayed: false,
337
269
  placement: "bottom",
338
270
  offset: 10
339
271
  })
340
272
  );
341
- test.insertAdjacentElement(
342
- "afterend",
343
- openOverlays.at(-1)
344
- );
345
273
  await opened;
346
- expect(await isInteractive(el)).to.be.true;
347
- const closed = oneEvent(el, "sp-closed");
348
274
  dialog.close();
349
- await closed;
350
- expect(await isInteractive(el)).to.be.false;
351
- });
352
- it("positions with a VirtualTrigger", async () => {
353
- const test = await fixture(html`
354
- <div>
355
- <sp-popover id="root" placement="right">
356
- <sp-dialog dismissable>
357
- Some Content for the Dialog.
358
- </sp-dialog>
359
- </sp-popover>
360
- </div>
361
- `);
362
- const el = test.querySelector("sp-popover");
363
- const trigger = new VirtualTrigger(100, 100);
364
- const opened = oneEvent(el, "sp-opened");
365
- openOverlays.push(
366
- await Overlay.open(el, {
367
- trigger,
368
- type: "auto",
369
- placement: "right",
370
- offset: 10
371
- })
372
- );
373
- test.insertAdjacentElement(
374
- "afterend",
375
- openOverlays.at(-1)
275
+ await waitUntil(
276
+ () => !!dialog.parentElement && dialog.parentElement.tagName !== "ACTIVE-OVERLAY",
277
+ "content is returned"
376
278
  );
377
- await opened;
378
- expect(await isInteractive(el)).to.be.true;
379
- const initial = el.getBoundingClientRect();
380
- trigger.updateBoundingClientRect(500, 500);
381
- await nextFrame();
382
- await nextFrame();
383
- const final = el.getBoundingClientRect();
384
- expect(initial.x).to.not.equal(8);
385
- expect(initial.y).to.not.equal(8);
386
- expect(initial.x).to.not.equal(final.x);
387
- expect(initial.y).to.not.equal(final.y);
388
279
  });
389
280
  it("closes an inline overlay when tabbing past the content", async () => {
390
281
  const el = await fixture(html`
391
282
  <div>
392
283
  <sp-button class="trigger">Trigger</sp-button>
393
- <sp-popover class="content">
284
+ <div class="content">
394
285
  <input />
395
- </sp-popover>
286
+ </div>
396
287
  <input value="After" id="after" />
397
288
  </div>
398
289
  `);
399
290
  const trigger = el.querySelector(".trigger");
400
291
  const content = el.querySelector(".content");
401
292
  const input = el.querySelector("input");
402
- const after2 = el.querySelector("#after");
403
- const opened = oneEvent(content, "sp-opened");
404
- openOverlays.push(
405
- await Overlay.open(content, {
406
- trigger,
407
- type: "auto",
408
- receivesFocus: "auto"
409
- })
410
- );
411
- trigger.insertAdjacentElement(
412
- "afterend",
413
- openOverlays.at(-1)
414
- );
415
- await opened;
416
- 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
+ });
417
299
  expect(document.activeElement).to.equal(input);
418
- const closed = oneEvent(content, "sp-closed");
300
+ expect(input.closest("active-overlay") !== null);
419
301
  await sendKeys({
420
302
  press: "Shift+Tab"
421
303
  });
422
- await closed;
423
304
  expect(document.activeElement).to.equal(trigger);
424
305
  await sendKeys({
425
306
  press: "Tab"
426
307
  });
427
- expect(document.activeElement).to.equal(after2);
428
- expect(await isInteractive(content)).to.be.false;
308
+ expect(document.activeElement).to.equal(input);
309
+ await sendKeys({
310
+ press: "Tab"
311
+ });
312
+ expect(document.activeElement).to.equal(after);
313
+ await waitUntil(
314
+ () => document.querySelector("active-overlay") === null
315
+ );
429
316
  });
430
317
  it("closes an inline overlay when tabbing before the trigger", async () => {
431
318
  const el = await fixture(html`
@@ -443,22 +330,14 @@ describe("Overlays, v2", () => {
443
330
  const trigger = el.querySelector(".trigger");
444
331
  const content = el.querySelector(".content");
445
332
  const input = el.querySelector(".content input");
446
- const before2 = el.querySelector("#before");
447
- openOverlays.push(
448
- await Overlay.open(content, {
449
- trigger,
450
- type: "auto"
451
- })
452
- );
453
- trigger.insertAdjacentElement(
454
- "afterend",
455
- openOverlays.at(-1)
456
- );
333
+ const before = el.querySelector("#before");
334
+ openOverlays.push(await Overlay.open(trigger, "inline", content, {}));
457
335
  trigger.focus();
458
336
  await sendKeys({
459
337
  press: "Tab"
460
338
  });
461
339
  expect(document.activeElement).to.equal(input);
340
+ expect(input.closest("active-overlay") !== null);
462
341
  await sendKeys({
463
342
  press: "Shift+Tab"
464
343
  });
@@ -466,7 +345,10 @@ describe("Overlays, v2", () => {
466
345
  await sendKeys({
467
346
  press: "Shift+Tab"
468
347
  });
469
- expect(document.activeElement).to.equal(before2);
348
+ expect(document.activeElement).to.equal(before);
349
+ await waitUntil(
350
+ () => document.querySelector("active-overlay") === null
351
+ );
470
352
  });
471
353
  it("opens detached content", async () => {
472
354
  const textContent = "This is a detached element that has been overlaid";
@@ -475,130 +357,118 @@ describe("Overlays, v2", () => {
475
357
  <button>Trigger</button>
476
358
  `
477
359
  );
478
- const content = document.createElement("sp-popover");
360
+ const content = document.createElement("div");
479
361
  content.textContent = textContent;
480
- const opened = oneEvent(content, "sp-opened");
481
- const overlay = await Overlay.open(content, {
482
- trigger: el,
483
- type: "auto",
362
+ const opened = oneEvent(el, "sp-opened");
363
+ const closeOverlay = await Overlay.open(el, "click", content, {
484
364
  placement: "bottom"
485
365
  });
486
- el.insertAdjacentElement("afterend", overlay);
487
366
  await opened;
488
- expect(await isInteractive(content)).to.be.true;
489
- const closed = oneEvent(content, "sp-closed");
490
- overlay.open = false;
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");
374
+ closeOverlay();
491
375
  await closed;
492
- expect(await isInteractive(content)).to.be.false;
376
+ activeOverlay = document.querySelector("active-overlay");
377
+ expect(activeOverlay).to.be.null;
493
378
  content.remove();
494
379
  });
495
380
  });
496
- describe('Overlay - type="modal", v2', () => {
497
- describe("handle multiple separate `contextmenu` events", async () => {
498
- let width = 0;
499
- let height = 0;
500
- let firstMenu;
501
- let firstRect;
502
- let secondMenu;
503
- let secondRect;
504
- before(async () => {
505
- render(
506
- html`
507
- <sp-theme color="light" scale="large">
508
- ${virtualElement({
509
- ...virtualElement.args,
510
- offset: 6
511
- })}
512
- </sp-theme>
513
- `,
514
- document.body
515
- );
516
- width = window.innerWidth;
517
- height = window.innerHeight;
518
- });
519
- after(() => {
520
- var _a;
521
- (_a = document.querySelector("sp-theme")) == null ? void 0 : _a.remove();
522
- });
523
- it('opens the first "contextmenu" overlay', async () => {
524
- const opened = oneEvent(document, "sp-opened");
525
- await sendMouse({
526
- steps: [
527
- {
528
- type: "move",
529
- 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"
530
402
  },
531
- {
532
- type: "click",
533
- options: {
534
- button: "right"
535
- },
536
- position: [width / 2 + 50, height / 2]
537
- }
538
- ]
539
- });
540
- await opened;
541
- firstMenu = document.querySelector("sp-popover");
542
- expect(firstMenu.textContent).to.include("Menu source: end");
543
- firstRect = firstMenu.getBoundingClientRect();
544
- expect(firstMenu).to.not.be.null;
403
+ position: [width / 2 + 50, height / 2]
404
+ }
405
+ ]
545
406
  });
546
- it('closes the first "contextmenu" when opening a second', async () => {
547
- var _a, _b, _c, _d;
548
- const closed = oneEvent(document, "sp-closed");
549
- const opened = oneEvent(document, "sp-opened");
550
- const trigger = document.querySelector(
551
- "start-end-contextmenu"
552
- );
553
- (_b = (_a = trigger.shadowRoot) == null ? void 0 : _a.querySelector("#start")) == null ? void 0 : _b.dispatchEvent(
554
- new Event("contextmenu", {
555
- composed: true
556
- })
557
- );
558
- await nextFrame();
559
- (_d = (_c = trigger.shadowRoot) == null ? void 0 : _c.querySelector("#start")) == null ? void 0 : _d.dispatchEvent(
560
- new Event("pointerup", {
561
- composed: true,
562
- bubbles: true
563
- })
564
- );
565
- await closed;
566
- await opened;
567
- secondMenu = document.querySelector("sp-popover");
568
- expect(secondMenu.textContent).to.include("Menu source: start");
569
- secondRect = secondMenu.getBoundingClientRect();
570
- expect(secondMenu).to.not.be.null;
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
+ ]
571
433
  });
572
- it('closes the second "contextmenu" when clicking away', async () => {
573
- const closed = oneEvent(document, "sp-closed");
574
- sendMouse({
575
- steps: [
576
- {
577
- type: "click",
578
- position: [width - width / 8, height - height / 8]
579
- }
580
- ]
581
- });
582
- await closed;
583
- expect(firstRect.top).to.not.equal(secondRect.top);
584
- expect(firstRect.left).to.not.equal(secondRect.left);
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
+ ]
585
459
  });
460
+ await closed;
461
+ await nextFrame();
586
462
  });
587
463
  it("does not open content off of the viewport", async () => {
588
- before(async () => {
589
- await setViewport({ width: 360, height: 640 });
590
- await nextFrame();
591
- });
592
- after(async () => {
593
- await setViewport({ width: 800, height: 600 });
594
- await nextFrame();
595
- });
596
464
  await fixture(html`
597
465
  ${virtualElement({
598
466
  ...virtualElement.args,
599
467
  offset: 6
600
468
  })}
601
469
  `);
470
+ await setViewport({ width: 360, height: 640 });
471
+ await nextFrame();
602
472
  const opened = oneEvent(document, "sp-opened");
603
473
  sendMouse({
604
474
  steps: [
@@ -616,15 +486,19 @@ describe('Overlay - type="modal", v2', () => {
616
486
  ]
617
487
  });
618
488
  await opened;
619
- const firstMenu = document.querySelector("sp-menu");
620
- expect(firstMenu).to.not.be.null;
621
- expect(await isInteractive(firstMenu)).to.be.true;
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
+ );
622
496
  const closed = oneEvent(document, "sp-closed");
623
497
  sendKeys({
624
498
  press: "Escape"
625
499
  });
626
500
  await closed;
627
- expect(await isInteractive(firstMenu)).to.be.false;
501
+ await nextFrame();
628
502
  });
629
503
  it("opens children in the modal stack through shadow roots", async () => {
630
504
  const el = await fixture(definedOverlayElement());
@@ -634,47 +508,51 @@ describe('Overlay - type="modal", v2', () => {
634
508
  let open = oneEvent(el, "sp-opened");
635
509
  trigger.click();
636
510
  await open;
637
- expect(el.open).to.equal("click");
638
511
  const content = document.querySelector(
639
512
  "popover-content"
640
513
  );
641
514
  open = oneEvent(content, "sp-opened");
642
515
  content.button.click();
643
516
  await open;
644
- expect(content.trigger.open).to.equal("click");
517
+ const activeOverlays = document.querySelectorAll("active-overlay");
518
+ activeOverlays.forEach((overlay) => {
519
+ expect(overlay.slot).to.equal("open");
520
+ });
645
521
  let close = oneEvent(content, "sp-closed");
646
522
  content.trigger.removeAttribute("open");
647
523
  await close;
648
- expect(content.trigger.open).to.be.null;
649
524
  close = oneEvent(el, "sp-closed");
650
525
  el.removeAttribute("open");
651
526
  await close;
652
- expect(el.open).to.be.null;
653
527
  });
654
528
  });
655
- describe("Overlay - timing, v2", () => {
529
+ describe("Overlay - timing", () => {
656
530
  it("manages multiple modals in a row without preventing them from closing", async () => {
657
531
  const test = await fixture(html`
658
532
  <div>
659
- <overlay-trigger id="test-1" placement="right">
533
+ <overlay-trigger>
660
534
  <sp-button slot="trigger">Trigger 1</sp-button>
661
535
  <sp-popover slot="hover-content">
662
536
  <p>Hover contentent for "Trigger 1".</p>
663
537
  </sp-popover>
664
538
  </overlay-trigger>
665
- <overlay-trigger id="test-2" placement="right">
539
+ <overlay-trigger>
666
540
  <sp-button slot="trigger">Trigger 2</sp-button>
667
- <sp-popover slot="click-content">
668
- <p>Click contentent for "Trigger 2".</p>
669
- </sp-popover>
670
541
  <sp-popover slot="hover-content">
671
542
  <p>Hover contentent for "Trigger 2".</p>
672
543
  </sp-popover>
544
+ <sp-popover slot="click-content">
545
+ <p>Click contentent for "Trigger 2".</p>
546
+ </sp-popover>
673
547
  </overlay-trigger>
674
548
  </div>
675
549
  `);
676
- const overlayTrigger1 = test.querySelector("#test-1");
677
- const overlayTrigger2 = test.querySelector("#test-2");
550
+ const overlayTrigger1 = test.querySelector(
551
+ "overlay-trigger:first-child"
552
+ );
553
+ const overlayTrigger2 = test.querySelector(
554
+ "overlay-trigger:last-child"
555
+ );
678
556
  const trigger1 = overlayTrigger1.querySelector(
679
557
  '[slot="trigger"]'
680
558
  );
@@ -687,13 +565,17 @@ describe("Overlay - timing, v2", () => {
687
565
  boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
688
566
  boundingRectTrigger1.top + boundingRectTrigger1.height / 2
689
567
  ];
690
- const outsideTriggers = [
691
- boundingRectTrigger1.left + boundingRectTrigger1.width / 2,
692
- 300
568
+ const outsideTrigger1 = [
569
+ boundingRectTrigger1.left + boundingRectTrigger1.width * 2,
570
+ boundingRectTrigger1.top + boundingRectTrigger1.height * 2
693
571
  ];
694
572
  const trigger2Position = [
695
573
  boundingRectTrigger2.left + boundingRectTrigger2.width / 2,
696
- boundingRectTrigger2.top + boundingRectTrigger2.height / 4
574
+ boundingRectTrigger2.top + boundingRectTrigger2.height / 2
575
+ ];
576
+ const outsideTrigger2 = [
577
+ boundingRectTrigger2.left + boundingRectTrigger2.width * 2,
578
+ boundingRectTrigger2.top + boundingRectTrigger2.height / 2
697
579
  ];
698
580
  await sendMouse({
699
581
  steps: [
@@ -709,7 +591,7 @@ describe("Overlay - timing, v2", () => {
709
591
  steps: [
710
592
  {
711
593
  type: "move",
712
- position: outsideTriggers
594
+ position: outsideTrigger1
713
595
  }
714
596
  ]
715
597
  });
@@ -726,7 +608,7 @@ describe("Overlay - timing, v2", () => {
726
608
  await nextFrame();
727
609
  await nextFrame();
728
610
  const opened = oneEvent(trigger2, "sp-opened");
729
- await sendMouse({
611
+ sendMouse({
730
612
  steps: [
731
613
  {
732
614
  type: "click",
@@ -735,23 +617,23 @@ describe("Overlay - timing, v2", () => {
735
617
  ]
736
618
  });
737
619
  await opened;
738
- await nextFrame();
739
- await nextFrame();
740
620
  expect(overlayTrigger1.hasAttribute("open")).to.be.false;
741
621
  expect(overlayTrigger2.hasAttribute("open")).to.be.true;
742
622
  expect(overlayTrigger2.getAttribute("open")).to.equal("click");
743
623
  const closed = oneEvent(overlayTrigger2, "sp-closed");
744
- await sendMouse({
624
+ sendMouse({
745
625
  steps: [
746
626
  {
747
627
  type: "click",
748
- position: outsideTriggers
628
+ position: outsideTrigger2
749
629
  }
750
630
  ]
751
631
  });
752
632
  await closed;
633
+ for (let i = 0; i < 3; i++)
634
+ await nextFrame();
753
635
  expect(overlayTrigger1.hasAttribute("open")).to.be.false;
754
- expect(overlayTrigger2.hasAttribute("open")).to.be.false;
636
+ expect(overlayTrigger2.hasAttribute("open"), overlayTrigger2.open).to.be.false;
755
637
  });
756
638
  });
757
639
  //# sourceMappingURL=overlay.test.js.map