@spectrum-web-components/overlay 0.31.1-overlay.29 → 0.31.1-react.21

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