@spectrum-web-components/overlay 0.33.2 → 0.33.3-overlay.65

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 (155) hide show
  1. package/README.md +227 -152
  2. package/custom-elements.json +1387 -527
  3. package/package.json +48 -22
  4. package/sp-overlay.d.ts +6 -0
  5. package/sp-overlay.dev.js +5 -0
  6. package/{active-overlay.dev.js.map → sp-overlay.dev.js.map} +3 -3
  7. package/sp-overlay.js +2 -0
  8. package/{active-overlay.js.map → sp-overlay.js.map} +4 -4
  9. package/src/Overlay.d.ts +29 -0
  10. package/src/Overlay.dev.js +91 -0
  11. package/src/Overlay.dev.js.map +7 -0
  12. package/src/Overlay.js +2 -0
  13. package/src/Overlay.js.map +7 -0
  14. package/src/OverlayBase.d.ts +124 -0
  15. package/src/OverlayBase.dev.js +744 -0
  16. package/src/OverlayBase.dev.js.map +7 -0
  17. package/src/OverlayBase.js +31 -0
  18. package/src/OverlayBase.js.map +7 -0
  19. package/src/OverlayDialog.d.ts +8 -0
  20. package/src/OverlayDialog.dev.js +160 -0
  21. package/src/OverlayDialog.dev.js.map +7 -0
  22. package/src/OverlayDialog.js +2 -0
  23. package/src/OverlayDialog.js.map +7 -0
  24. package/src/OverlayNoPopover.d.ts +8 -0
  25. package/src/OverlayNoPopover.dev.js +149 -0
  26. package/src/OverlayNoPopover.dev.js.map +7 -0
  27. package/src/OverlayNoPopover.js +2 -0
  28. package/src/OverlayNoPopover.js.map +7 -0
  29. package/src/OverlayPopover.d.ts +8 -0
  30. package/src/OverlayPopover.dev.js +199 -0
  31. package/src/OverlayPopover.dev.js.map +7 -0
  32. package/src/OverlayPopover.js +2 -0
  33. package/src/OverlayPopover.js.map +7 -0
  34. package/src/OverlayStack.d.ts +29 -0
  35. package/src/OverlayStack.dev.js +122 -0
  36. package/src/OverlayStack.dev.js.map +7 -0
  37. package/src/OverlayStack.js +2 -0
  38. package/src/OverlayStack.js.map +7 -0
  39. package/src/OverlayTrigger.d.ts +23 -31
  40. package/src/OverlayTrigger.dev.js +135 -245
  41. package/src/OverlayTrigger.dev.js.map +3 -3
  42. package/src/OverlayTrigger.js +52 -22
  43. package/src/OverlayTrigger.js.map +3 -3
  44. package/src/PlacementController.d.ts +36 -0
  45. package/src/PlacementController.dev.js +191 -0
  46. package/src/PlacementController.dev.js.map +7 -0
  47. package/src/PlacementController.js +2 -0
  48. package/src/PlacementController.js.map +7 -0
  49. package/src/VirtualTrigger.dev.js +0 -2
  50. package/src/VirtualTrigger.dev.js.map +2 -2
  51. package/src/VirtualTrigger.js +1 -1
  52. package/src/VirtualTrigger.js.map +3 -3
  53. package/src/fullSizePlugin.d.ts +12 -0
  54. package/src/fullSizePlugin.dev.js +39 -0
  55. package/src/fullSizePlugin.dev.js.map +7 -0
  56. package/src/fullSizePlugin.js +2 -0
  57. package/src/fullSizePlugin.js.map +7 -0
  58. package/src/index.d.ts +2 -3
  59. package/src/index.dev.js +2 -3
  60. package/src/index.dev.js.map +2 -2
  61. package/src/index.js +1 -1
  62. package/src/index.js.map +2 -2
  63. package/src/loader.d.ts +2 -2
  64. package/src/loader.dev.js +2 -19
  65. package/src/loader.dev.js.map +2 -2
  66. package/src/loader.js +1 -1
  67. package/src/loader.js.map +3 -3
  68. package/src/overlay-base.css.dev.js +9 -0
  69. package/src/overlay-base.css.dev.js.map +7 -0
  70. package/src/overlay-base.css.js +6 -0
  71. package/src/overlay-base.css.js.map +7 -0
  72. package/src/overlay-trigger.css.dev.js +1 -1
  73. package/src/overlay-trigger.css.dev.js.map +1 -1
  74. package/src/overlay-trigger.css.js +1 -1
  75. package/src/overlay-trigger.css.js.map +1 -1
  76. package/src/overlay-types.d.ts +6 -4
  77. package/src/overlay-types.dev.js +1 -0
  78. package/src/overlay-types.dev.js.map +3 -3
  79. package/src/overlay-types.js +1 -1
  80. package/src/overlay-types.js.map +3 -3
  81. package/src/topLayerOverTransforms.d.ts +23 -0
  82. package/src/topLayerOverTransforms.dev.js +170 -0
  83. package/src/topLayerOverTransforms.dev.js.map +7 -0
  84. package/src/topLayerOverTransforms.js +2 -0
  85. package/src/topLayerOverTransforms.js.map +7 -0
  86. package/stories/overlay-element.stories.js +247 -0
  87. package/stories/overlay-element.stories.js.map +7 -0
  88. package/stories/overlay-story-components.js +9 -8
  89. package/stories/overlay-story-components.js.map +2 -2
  90. package/stories/overlay.stories.js +780 -683
  91. package/stories/overlay.stories.js.map +2 -2
  92. package/sync/overlay-trigger.d.ts +4 -0
  93. package/sync/overlay-trigger.dev.js +1 -4
  94. package/sync/overlay-trigger.dev.js.map +2 -2
  95. package/sync/overlay-trigger.js +1 -1
  96. package/sync/overlay-trigger.js.map +3 -3
  97. package/test/benchmark/basic-test.js +1 -1
  98. package/test/benchmark/basic-test.js.map +1 -1
  99. package/test/index.js +407 -376
  100. package/test/index.js.map +3 -3
  101. package/test/overlay-element.test-vrt.js +5 -0
  102. package/test/overlay-element.test-vrt.js.map +7 -0
  103. package/test/overlay-element.test.js +664 -0
  104. package/test/overlay-element.test.js.map +7 -0
  105. package/test/overlay-lifecycle.test.js +34 -106
  106. package/test/overlay-lifecycle.test.js.map +2 -2
  107. package/test/overlay-trigger-click.test.js +11 -5
  108. package/test/overlay-trigger-click.test.js.map +2 -2
  109. package/test/overlay-trigger-extended.test.js +1 -6
  110. package/test/overlay-trigger-extended.test.js.map +2 -2
  111. package/test/overlay-trigger-hover-click.test.js +23 -23
  112. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  113. package/test/overlay-trigger-hover.test.js +40 -34
  114. package/test/overlay-trigger-hover.test.js.map +2 -2
  115. package/test/overlay-trigger-longpress.test.js +98 -80
  116. package/test/overlay-trigger-longpress.test.js.map +2 -2
  117. package/test/overlay-trigger-sync.test.js +1 -1
  118. package/test/overlay-trigger-sync.test.js.map +2 -2
  119. package/test/overlay-trigger.test.js +1 -1
  120. package/test/overlay-trigger.test.js.map +2 -2
  121. package/test/overlay-update.test.js +4 -4
  122. package/test/overlay-update.test.js.map +2 -2
  123. package/test/{overlay.test.js → overlay-v1.test.js} +267 -249
  124. package/test/overlay-v1.test.js.map +7 -0
  125. package/test/overlay-v2.test.js +720 -0
  126. package/test/overlay-v2.test.js.map +7 -0
  127. package/active-overlay.d.ts +0 -6
  128. package/active-overlay.dev.js +0 -5
  129. package/active-overlay.js +0 -2
  130. package/src/ActiveOverlay.d.ts +0 -84
  131. package/src/ActiveOverlay.dev.js +0 -517
  132. package/src/ActiveOverlay.dev.js.map +0 -7
  133. package/src/ActiveOverlay.js +0 -16
  134. package/src/ActiveOverlay.js.map +0 -7
  135. package/src/active-overlay.css.dev.js +0 -13
  136. package/src/active-overlay.css.dev.js.map +0 -7
  137. package/src/active-overlay.css.js +0 -10
  138. package/src/active-overlay.css.js.map +0 -7
  139. package/src/overlay-stack.d.ts +0 -50
  140. package/src/overlay-stack.dev.js +0 -515
  141. package/src/overlay-stack.dev.js.map +0 -7
  142. package/src/overlay-stack.js +0 -34
  143. package/src/overlay-stack.js.map +0 -7
  144. package/src/overlay-utils.d.ts +0 -3
  145. package/src/overlay-utils.dev.js +0 -31
  146. package/src/overlay-utils.dev.js.map +0 -7
  147. package/src/overlay-utils.js +0 -2
  148. package/src/overlay-utils.js.map +0 -7
  149. package/src/overlay.d.ts +0 -59
  150. package/src/overlay.dev.js +0 -127
  151. package/src/overlay.dev.js.map +0 -7
  152. package/src/overlay.js +0 -2
  153. package/src/overlay.js.map +0 -7
  154. package/test/overlay.test.js.map +0 -7
  155. /package/src/{active-overlay.css.d.ts → overlay-base.css.d.ts} +0 -0
package/test/index.js CHANGED
@@ -1,22 +1,19 @@
1
1
  "use strict";
2
- import { escapeEvent, isVisible } from "../../../test/testing-helpers.js";
2
+ import { fixture, isOnTopLayer } from "../../../test/testing-helpers.js";
3
3
  import {
4
4
  aTimeout,
5
5
  elementUpdated,
6
6
  expect,
7
- fixture,
8
7
  html,
9
8
  nextFrame,
10
9
  oneEvent,
11
10
  waitUntil
12
11
  } from "@open-wc/testing";
13
- import {
14
- OverlayTrigger
15
- } from "@spectrum-web-components/overlay";
16
12
  import "@spectrum-web-components/button/sp-button.js";
17
13
  import "@spectrum-web-components/popover/sp-popover.js";
18
- import { Popover } from "@spectrum-web-components/popover";
19
14
  import "@spectrum-web-components/theme/sp-theme.js";
15
+ import { sendMouse } from "../../../test/plugins/browser.js";
16
+ import { sendKeys } from "@web/test-runner-commands";
20
17
  function pressKey(code) {
21
18
  const up = new KeyboardEvent("keyup", {
22
19
  bubbles: true,
@@ -26,23 +23,12 @@ function pressKey(code) {
26
23
  });
27
24
  document.dispatchEvent(up);
28
25
  }
29
- const pressEscape = () => {
30
- document.dispatchEvent(escapeEvent());
31
- };
32
26
  const pressSpace = () => pressKey("Space");
33
- export const runOverlayTriggerTests = () => {
34
- describe("Overlay Trigger - sync", () => {
27
+ export const runOverlayTriggerTests = (type) => {
28
+ describe(`Overlay Trigger - ${type}`, () => {
35
29
  describe("open/close", () => {
36
- let testDiv;
37
- let innerTrigger;
38
- let outerTrigger;
39
- let innerButton;
40
- let outerButton;
41
- let innerClickContent;
42
- let outerClickContent;
43
- let hoverContent;
44
- beforeEach(async () => {
45
- testDiv = await fixture(
30
+ beforeEach(async function() {
31
+ this.testDiv = await fixture(
46
32
  html`
47
33
  <div>
48
34
  <style>
@@ -65,8 +51,6 @@ export const runOverlayTriggerTests = () => {
65
51
  slot="click-content"
66
52
  direction="bottom"
67
53
  tip
68
- open
69
- tabindex="0"
70
54
  >
71
55
  <sp-dialog
72
56
  no-divider
@@ -87,8 +71,6 @@ export const runOverlayTriggerTests = () => {
87
71
  slot="click-content"
88
72
  direction="bottom"
89
73
  tip
90
- open
91
- tabindex="0"
92
74
  >
93
75
  <sp-dialog
94
76
  no-divider
@@ -112,407 +94,489 @@ export const runOverlayTriggerTests = () => {
112
94
  </div>
113
95
  `
114
96
  );
115
- innerTrigger = testDiv.querySelector(
97
+ this.innerTrigger = this.testDiv.querySelector(
116
98
  "#inner-trigger"
117
99
  );
118
- outerTrigger = testDiv.querySelector(
100
+ this.outerTrigger = this.testDiv.querySelector(
119
101
  "#trigger"
120
102
  );
121
- innerButton = testDiv.querySelector("#inner-button");
122
- outerButton = testDiv.querySelector("#outer-button");
123
- innerClickContent = testDiv.querySelector(
103
+ this.innerButton = this.testDiv.querySelector(
104
+ "#inner-button"
105
+ );
106
+ this.outerButton = this.testDiv.querySelector(
107
+ "#outer-button"
108
+ );
109
+ this.innerClickContent = this.testDiv.querySelector(
124
110
  "#inner-popover"
125
111
  );
126
- outerClickContent = testDiv.querySelector(
112
+ this.outerClickContent = this.testDiv.querySelector(
127
113
  "#outer-popover"
128
114
  );
129
- hoverContent = testDiv.querySelector(
115
+ this.hoverContent = this.testDiv.querySelector(
130
116
  "#hover-content"
131
117
  );
132
118
  });
133
- afterEach(async () => {
134
- if (outerTrigger.open) {
135
- const closed = oneEvent(outerTrigger, "sp-closed");
136
- outerTrigger.open = void 0;
137
- await closed;
138
- }
139
- outerTrigger.removeAttribute("type");
140
- if (innerTrigger.open) {
141
- const closed = oneEvent(innerTrigger, "sp-closed");
142
- innerTrigger.open = void 0;
143
- await closed;
144
- }
145
- innerTrigger.removeAttribute("type");
146
- });
147
- it("loads", async () => {
148
- if (!(outerClickContent instanceof Popover))
149
- throw new Error("popover is not an instance of Popover");
150
- expect(outerClickContent).to.exist;
151
- expect(outerClickContent.shadowRoot).to.exist;
152
- expect(outerClickContent.parentElement).to.be.an.instanceOf(
153
- OverlayTrigger
154
- );
155
- });
156
- it("opens a popover", async () => {
157
- expect(isVisible(outerClickContent)).to.be.false;
158
- expect(outerButton).to.exist;
159
- const open = oneEvent(outerTrigger, "sp-opened");
160
- outerButton.click();
119
+ it("opens a popover", async function() {
120
+ expect(
121
+ await isOnTopLayer(this.outerClickContent),
122
+ "popover not available at point"
123
+ ).to.be.false;
124
+ expect(this.outerButton).to.exist;
125
+ const open = oneEvent(this.outerTrigger, "sp-opened");
126
+ this.outerButton.click();
161
127
  await open;
162
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
163
- OverlayTrigger
164
- );
165
- expect(isVisible(outerClickContent)).to.be.true;
128
+ expect(
129
+ await isOnTopLayer(this.outerClickContent),
130
+ "popover available at point"
131
+ ).to.be.true;
166
132
  });
167
- it("[disabled] closes a popover", async () => {
168
- expect(isVisible(outerClickContent)).to.be.false;
169
- expect(outerTrigger.disabled).to.be.false;
170
- expect(outerButton).to.exist;
171
- const opened = oneEvent(outerButton, "sp-opened");
172
- outerButton.click();
133
+ it("[disabled] closes a popover", async function() {
134
+ expect(
135
+ await isOnTopLayer(this.outerClickContent),
136
+ "popover not available at point"
137
+ ).to.be.false;
138
+ expect(this.outerTrigger.disabled).to.be.false;
139
+ expect(this.outerButton).to.exist;
140
+ const opened = oneEvent(this.outerButton, "sp-opened");
141
+ this.outerButton.click();
173
142
  await opened;
174
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
175
- OverlayTrigger
176
- );
177
- expect(isVisible(outerClickContent)).to.be.true;
178
- const closed = oneEvent(outerButton, "sp-closed");
179
- outerTrigger.disabled = true;
143
+ expect(
144
+ await isOnTopLayer(this.outerClickContent),
145
+ "popover available at point"
146
+ ).to.be.true;
147
+ const closed = oneEvent(this.outerButton, "sp-closed");
148
+ this.outerTrigger.disabled = true;
180
149
  await closed;
181
- expect(isVisible(outerClickContent)).to.be.false;
182
- expect(outerTrigger.disabled).to.be.true;
150
+ expect(
151
+ await isOnTopLayer(this.outerClickContent),
152
+ "popover not available at point"
153
+ ).to.be.false;
183
154
  });
184
- it("resizes a popover", async () => {
185
- expect(isVisible(outerClickContent)).to.be.false;
186
- expect(outerButton).to.exist;
187
- const open = oneEvent(outerTrigger, "sp-opened");
188
- outerButton.click();
155
+ it("resizes a popover", async function() {
156
+ expect(
157
+ await isOnTopLayer(this.outerClickContent),
158
+ "popover not available at point"
159
+ ).to.be.false;
160
+ expect(this.outerButton).to.exist;
161
+ const open = oneEvent(this.outerTrigger, "sp-opened");
162
+ this.outerButton.click();
189
163
  await open;
190
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
191
- OverlayTrigger
192
- );
193
- expect(isVisible(outerClickContent)).to.be.true;
164
+ expect(
165
+ await isOnTopLayer(this.outerClickContent),
166
+ "popover available at point"
167
+ ).to.be.true;
194
168
  window.dispatchEvent(new Event("resize"));
195
169
  window.dispatchEvent(new Event("resize"));
196
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
197
- OverlayTrigger
198
- );
199
- expect(isVisible(outerClickContent)).to.be.true;
170
+ expect(
171
+ await isOnTopLayer(this.outerClickContent),
172
+ "popover available at point"
173
+ ).to.be.true;
200
174
  });
201
- ["modal", "replace", "inline"].map((type) => {
202
- it(`opens a popover - [type="${type}"]`, async () => {
203
- outerTrigger.type = type;
204
- await elementUpdated(outerTrigger);
205
- expect(isVisible(outerClickContent)).to.be.false;
206
- expect(outerButton).to.exist;
207
- const opened = oneEvent(outerTrigger, "sp-opened");
208
- outerButton.click();
175
+ ["modal", "replace", "inline"].map((type2) => {
176
+ it(`opens a popover - [type="${type2}"]`, async function() {
177
+ this.outerTrigger.type = type2;
178
+ await elementUpdated(this.outerTrigger);
179
+ expect(
180
+ await isOnTopLayer(this.outerClickContent),
181
+ "popover not available at point"
182
+ ).to.be.false;
183
+ expect(this.outerButton).to.exist;
184
+ const opened = oneEvent(this.outerTrigger, "sp-opened");
185
+ this.outerButton.click();
209
186
  await opened;
210
187
  expect(
211
- outerClickContent.parentElement
212
- ).to.not.be.an.instanceOf(OverlayTrigger);
213
- expect(isVisible(outerClickContent)).to.be.true;
188
+ await isOnTopLayer(this.outerClickContent),
189
+ "popover available at point"
190
+ ).to.be.true;
214
191
  });
215
192
  });
216
- it("does not open a hover popover when a click popover is open", async () => {
193
+ it("does not open a hover popover when a click popover is open", async function() {
194
+ expect(
195
+ await isOnTopLayer(this.outerClickContent),
196
+ "popover not available at point"
197
+ ).to.be.false;
217
198
  expect(
218
- isVisible(outerClickContent),
219
- "outer popover not visible"
199
+ await isOnTopLayer(this.hoverContent),
200
+ "hover not available at point"
220
201
  ).to.be.false;
221
- expect(isVisible(hoverContent), "hover popover not visible").to.be.false;
222
- expect(outerButton).to.exist;
223
- const open = oneEvent(outerTrigger, "sp-opened");
224
- outerButton.click();
202
+ expect(this.outerButton).to.exist;
203
+ const open = oneEvent(this.outerTrigger, "sp-opened");
204
+ this.outerButton.click();
225
205
  await open;
226
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
227
- OverlayTrigger
228
- );
229
- expect(isVisible(outerClickContent), "outer popover visible").to.be.true;
230
206
  expect(
231
- isVisible(hoverContent),
232
- "hover popover still not visible"
207
+ await isOnTopLayer(this.outerClickContent),
208
+ "popover available at point"
209
+ ).to.be.true;
210
+ expect(
211
+ await isOnTopLayer(this.hoverContent),
212
+ "hover not available at point"
233
213
  ).to.be.false;
234
- outerButton.dispatchEvent(
214
+ this.outerButton.dispatchEvent(
235
215
  new Event("mouseenter", {
236
216
  bubbles: true,
237
217
  composed: true
238
218
  })
239
219
  );
240
220
  await nextFrame();
241
- expect(hoverContent.parentElement).to.be.instanceOf(
242
- OverlayTrigger
243
- );
244
221
  expect(
245
- isVisible(outerClickContent),
246
- "outer popover visible again"
222
+ await isOnTopLayer(this.outerClickContent),
223
+ "popover available at point"
247
224
  ).to.be.true;
248
225
  expect(
249
- isVisible(hoverContent),
250
- "hover popover not visible again"
226
+ await isOnTopLayer(this.hoverContent),
227
+ "hover not available at point"
251
228
  ).to.be.false;
252
229
  });
253
- it("does not open a popover when [disabled]", async () => {
254
- var _a, _b, _c, _d, _e, _f;
255
- const root = outerTrigger.shadowRoot ? outerTrigger.shadowRoot : outerTrigger;
256
- const triggerZone = root.querySelector(
230
+ it("does not open a popover when [disabled]", async function() {
231
+ const triggerZone = this.outerTrigger.shadowRoot.querySelector(
257
232
  "#trigger"
258
233
  );
259
- expect(outerTrigger.disabled).to.be.false;
260
- let open = oneEvent(outerTrigger, "sp-opened");
261
- outerButton.click();
234
+ expect(this.outerTrigger.disabled).to.be.false;
235
+ let open = oneEvent(this.outerTrigger, "sp-opened");
236
+ this.outerButton.click();
262
237
  await open;
263
- expect((_a = outerClickContent.parentElement) == null ? void 0 : _a.localName).to.equal(
264
- "active-overlay"
265
- );
266
- let closed = oneEvent(outerTrigger, "sp-closed");
267
- document.body.click();
238
+ expect(
239
+ await isOnTopLayer(this.outerClickContent),
240
+ "hover available at point"
241
+ ).to.be.true;
242
+ let closed = oneEvent(this.outerTrigger, "sp-closed");
243
+ sendMouse({
244
+ steps: [
245
+ {
246
+ type: "click",
247
+ position: [1, 1]
248
+ }
249
+ ]
250
+ });
268
251
  await closed;
269
- expect((_b = outerClickContent.parentElement) == null ? void 0 : _b.localName).to.equal(
270
- "overlay-trigger"
271
- );
272
- outerTrigger.disabled = true;
273
- await elementUpdated(outerTrigger);
274
- expect(outerTrigger.disabled).to.be.true;
275
- expect(outerTrigger.hasAttribute("disabled")).to.be.true;
276
- outerButton.click();
277
- await aTimeout(200);
278
- expect((_c = outerClickContent.parentElement) == null ? void 0 : _c.localName).to.equal(
279
- "overlay-trigger"
280
- );
252
+ expect(
253
+ await isOnTopLayer(this.outerClickContent),
254
+ "hover not available at point"
255
+ ).to.be.false;
256
+ this.outerTrigger.disabled = true;
257
+ await elementUpdated(this.outerTrigger);
258
+ expect(this.outerTrigger.disabled).to.be.true;
259
+ expect(this.outerTrigger.hasAttribute("disabled")).to.be.true;
260
+ this.outerButton.click();
261
+ await aTimeout(150);
262
+ expect(
263
+ await isOnTopLayer(this.outerClickContent),
264
+ "hover not available at point"
265
+ ).to.be.false;
281
266
  triggerZone.dispatchEvent(new Event("mouseenter"));
282
- await aTimeout(200);
283
- expect((_d = outerClickContent.parentElement) == null ? void 0 : _d.localName).to.equal(
284
- "overlay-trigger"
285
- );
286
- outerTrigger.disabled = false;
287
- await elementUpdated(outerTrigger);
288
- expect(outerTrigger.disabled).to.be.false;
289
- expect(outerTrigger.hasAttribute("disabled")).to.be.false;
290
- open = oneEvent(outerTrigger, "sp-opened");
291
- outerButton.click();
267
+ await aTimeout(150);
268
+ expect(
269
+ await isOnTopLayer(this.outerClickContent),
270
+ "hover not available at point"
271
+ ).to.be.false;
272
+ this.outerTrigger.disabled = false;
273
+ await elementUpdated(this.outerTrigger);
274
+ expect(this.outerTrigger.disabled).to.be.false;
275
+ expect(this.outerTrigger.hasAttribute("disabled")).to.be.false;
276
+ open = oneEvent(this.outerTrigger, "sp-opened");
277
+ this.outerButton.click();
292
278
  await open;
293
- expect((_e = outerClickContent.parentElement) == null ? void 0 : _e.localName).to.equal(
294
- "active-overlay"
295
- );
296
- closed = oneEvent(outerTrigger, "sp-closed");
297
- outerButton.click();
279
+ expect(
280
+ await isOnTopLayer(this.outerClickContent),
281
+ "hover available at point"
282
+ ).to.be.true;
283
+ closed = oneEvent(this.outerTrigger, "sp-closed");
284
+ this.outerButton.click();
298
285
  await closed;
299
- expect((_f = outerClickContent.parentElement) == null ? void 0 : _f.localName).to.equal(
300
- "overlay-trigger"
301
- );
286
+ expect(
287
+ await isOnTopLayer(this.outerClickContent),
288
+ "hover not available at point"
289
+ ).to.be.false;
302
290
  });
303
- it("opens a nested popover", async () => {
304
- expect(isVisible(outerClickContent)).to.be.false;
305
- expect(isVisible(innerClickContent)).to.be.false;
306
- expect(outerButton).to.exist;
307
- let open = oneEvent(outerTrigger, "sp-opened");
308
- outerButton.click();
291
+ it("opens a nested popover", async function() {
292
+ expect(
293
+ await isOnTopLayer(this.outerClickContent),
294
+ "hover not available at point"
295
+ ).to.be.false;
296
+ expect(
297
+ await isOnTopLayer(this.innerClickContent),
298
+ "hover not available at point"
299
+ ).to.be.false;
300
+ expect(this.outerButton).to.exist;
301
+ let open = oneEvent(this.outerTrigger, "sp-opened");
302
+ this.outerButton.click();
309
303
  await open;
310
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
311
- OverlayTrigger
312
- );
313
- expect(isVisible(outerClickContent)).to.be.true;
314
- expect(isVisible(innerClickContent)).to.be.false;
315
- open = oneEvent(innerTrigger, "sp-opened");
316
- innerButton.click();
304
+ expect(
305
+ await isOnTopLayer(this.outerClickContent),
306
+ "outer click content available at point"
307
+ ).to.be.true;
308
+ expect(await isOnTopLayer(this.innerClickContent)).to.be.false;
309
+ open = oneEvent(this.innerTrigger, "sp-opened");
310
+ this.innerButton.click();
317
311
  await open;
318
- expect(innerClickContent.parentElement).to.not.be.instanceOf(
319
- OverlayTrigger
320
- );
321
- expect(isVisible(outerClickContent)).to.be.true;
322
- expect(isVisible(innerClickContent)).to.be.true;
312
+ expect(
313
+ await isOnTopLayer(this.outerClickContent),
314
+ "outer click content available at point"
315
+ ).to.be.true;
316
+ expect(
317
+ await isOnTopLayer(this.innerClickContent),
318
+ "inner click content available at point"
319
+ ).to.be.true;
323
320
  });
324
- it('focus previous "modal" when closing nested "modal"', async () => {
325
- outerTrigger.type = "modal";
326
- innerTrigger.type = "modal";
321
+ it('focus previous "modal" when closing nested "modal"', async function() {
322
+ this.outerTrigger.type = "modal";
323
+ this.innerTrigger.type = "modal";
327
324
  expect(
328
- isVisible(outerClickContent),
329
- "outer popover starts closed"
325
+ await isOnTopLayer(this.outerClickContent),
326
+ "outer click content not available at point"
330
327
  ).to.be.false;
331
328
  expect(
332
- isVisible(innerClickContent),
333
- "inner popover starts closed"
329
+ await isOnTopLayer(this.innerClickContent),
330
+ "inner click content not available at point"
334
331
  ).to.be.false;
335
- expect(outerButton).to.exist;
336
- const outerOpen = oneEvent(outerButton, "sp-opened");
337
- outerButton.click();
332
+ const outerOpen = oneEvent(this.outerButton, "sp-opened");
333
+ this.outerButton.click();
338
334
  await outerOpen;
339
- expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
340
- OverlayTrigger
341
- );
342
- expect(isVisible(outerClickContent), "outer popover opens").to.be.true;
343
335
  expect(
344
- isVisible(innerClickContent),
345
- "inner popover stays closed"
336
+ await isOnTopLayer(this.outerClickContent),
337
+ "outer click content available at point"
338
+ ).to.be.true;
339
+ expect(
340
+ await isOnTopLayer(this.innerClickContent),
341
+ "inner click content available at point"
346
342
  ).to.be.false;
347
- const innerOpen = oneEvent(innerButton, "sp-opened");
348
- innerButton.click();
343
+ const innerOpen = oneEvent(this.innerButton, "sp-opened");
344
+ this.innerButton.click();
349
345
  await innerOpen;
350
- expect(innerClickContent.parentElement).to.not.be.instanceOf(
351
- OverlayTrigger
352
- );
353
- expect(isVisible(outerClickContent), "outer popover stays open").to.be.true;
354
- expect(isVisible(innerClickContent), "inner popover opens").to.be.true;
355
- const innerClose = oneEvent(innerButton, "sp-closed");
356
- pressEscape();
346
+ expect(
347
+ await isOnTopLayer(this.outerClickContent),
348
+ "outer click content available at point"
349
+ ).to.be.true;
350
+ expect(
351
+ await isOnTopLayer(this.innerClickContent),
352
+ "inner click content available at point"
353
+ ).to.be.true;
354
+ const innerClose = oneEvent(this.innerButton, "sp-closed");
355
+ await sendKeys({
356
+ press: "Escape"
357
+ });
357
358
  await innerClose;
358
- expect(innerClickContent.parentElement).to.be.instanceOf(
359
- OverlayTrigger
360
- );
361
359
  expect(
362
- document.activeElement === innerButton,
360
+ await isOnTopLayer(this.outerClickContent),
361
+ "outer click content available at point"
362
+ ).to.be.true;
363
+ expect(
364
+ await isOnTopLayer(this.innerClickContent),
365
+ "inner click content not available at point"
366
+ ).to.be.false;
367
+ expect(
368
+ document.activeElement === this.innerButton,
363
369
  "outer popover recieved focus"
364
370
  ).to.be.true;
365
371
  });
366
- it("escape closes an open popover", async () => {
367
- outerTrigger.type = "modal";
368
- innerTrigger.type = "modal";
369
- const outerOpen = oneEvent(outerButton, "sp-opened");
370
- outerButton.click();
372
+ it("escape closes an open popover", async function() {
373
+ this.outerTrigger.type = "modal";
374
+ this.innerTrigger.type = "modal";
375
+ const outerOpen = oneEvent(this.outerButton, "sp-opened");
376
+ this.outerButton.click();
371
377
  await outerOpen;
372
378
  expect(
373
- outerClickContent.parentElement instanceof OverlayTrigger,
374
- "outer content stolen and reparented"
375
- ).to.be.false;
376
- const innerOpen = oneEvent(innerButton, "sp-opened");
377
- innerButton.click();
379
+ await isOnTopLayer(this.outerClickContent),
380
+ "outer click content available at point"
381
+ ).to.be.true;
382
+ const innerOpen = oneEvent(this.innerButton, "sp-opened");
383
+ this.innerButton.click();
378
384
  await innerOpen;
379
385
  expect(
380
- innerClickContent.parentElement instanceof OverlayTrigger,
381
- "inner content stolen and reparented"
382
- ).to.be.false;
383
- expect(isVisible(outerClickContent)).to.be.true;
384
- expect(isVisible(innerClickContent)).to.be.true;
386
+ await isOnTopLayer(this.outerClickContent),
387
+ "outer click content available at point"
388
+ ).to.be.true;
389
+ expect(
390
+ await isOnTopLayer(this.innerClickContent),
391
+ "inner click content available at point"
392
+ ).to.be.true;
385
393
  pressSpace();
386
- expect(isVisible(outerClickContent)).to.be.true;
387
- expect(isVisible(innerClickContent)).to.be.true;
388
- const innerClose = oneEvent(innerButton, "sp-closed");
389
- pressEscape();
394
+ expect(
395
+ await isOnTopLayer(this.outerClickContent),
396
+ "outer click content available at point"
397
+ ).to.be.true;
398
+ expect(
399
+ await isOnTopLayer(this.innerClickContent),
400
+ "inner click content available at point"
401
+ ).to.be.true;
402
+ const innerClose = oneEvent(this.innerButton, "sp-closed");
403
+ await sendKeys({
404
+ press: "Escape"
405
+ });
390
406
  await innerClose;
391
407
  expect(
392
- innerClickContent.parentElement instanceof OverlayTrigger,
393
- "inner content returned"
408
+ await isOnTopLayer(this.outerClickContent),
409
+ "outer click content available at point"
394
410
  ).to.be.true;
395
- expect(isVisible(outerClickContent)).to.be.true;
396
- expect(isVisible(innerClickContent)).to.be.false;
397
- const outerClose = oneEvent(outerButton, "sp-closed");
398
- pressEscape();
411
+ expect(
412
+ await isOnTopLayer(this.innerClickContent),
413
+ "inner click content not available at point"
414
+ ).to.be.false;
415
+ const outerClose = oneEvent(this.outerButton, "sp-closed");
416
+ await sendKeys({
417
+ press: "Escape"
418
+ });
399
419
  await outerClose;
400
420
  expect(
401
- outerClickContent.parentElement instanceof OverlayTrigger,
402
- "outer content returned"
403
- ).to.be.true;
404
- expect(isVisible(outerClickContent)).to.be.false;
405
- expect(isVisible(innerClickContent)).to.be.false;
421
+ await isOnTopLayer(this.outerClickContent),
422
+ "outer click content not available at point"
423
+ ).to.be.false;
424
+ expect(
425
+ await isOnTopLayer(this.innerClickContent),
426
+ "inner click content not available at point"
427
+ ).to.be.false;
406
428
  });
407
- it("click closes an open popover", async () => {
408
- outerTrigger.type = "modal";
409
- innerTrigger.type = "modal";
410
- const outerOpen = oneEvent(outerButton, "sp-opened");
411
- outerButton.click();
429
+ it("click closes an open popover", async function() {
430
+ this.outerTrigger.type = "auto";
431
+ this.innerTrigger.type = "auto";
432
+ const outerOpen = oneEvent(this.outerButton, "sp-opened");
433
+ this.outerButton.click();
412
434
  await outerOpen;
413
435
  expect(
414
- outerClickContent.parentElement instanceof OverlayTrigger,
415
- "outer content stolen and reparented"
416
- ).to.be.false;
417
- const innerOpen = oneEvent(innerButton, "sp-opened");
418
- innerButton.click();
436
+ await isOnTopLayer(this.outerClickContent),
437
+ "outer click content is available at point"
438
+ ).to.be.true;
439
+ const innerOpen = oneEvent(this.innerButton, "sp-opened");
440
+ this.innerButton.click();
419
441
  await innerOpen;
420
442
  expect(
421
- innerClickContent.parentElement instanceof OverlayTrigger,
422
- "inner content stolen and reparented"
423
- ).to.be.false;
424
- expect(isVisible(outerClickContent)).to.be.true;
425
- expect(isVisible(innerClickContent)).to.be.true;
426
- innerClickContent.click();
443
+ await isOnTopLayer(this.outerClickContent),
444
+ "outer click content is available at point"
445
+ ).to.be.true;
446
+ expect(
447
+ await isOnTopLayer(this.innerClickContent),
448
+ "inner click content is available at point"
449
+ ).to.be.true;
450
+ this.innerClickContent.click();
427
451
  await aTimeout(200);
428
- expect(isVisible(outerClickContent)).to.be.true;
429
- expect(isVisible(innerClickContent)).to.be.true;
430
- const innerClose = oneEvent(innerButton, "sp-closed");
431
- document.body.click();
432
- await innerClose;
433
452
  expect(
434
- innerClickContent.parentElement instanceof OverlayTrigger,
435
- "inner content returned"
453
+ await isOnTopLayer(this.outerClickContent),
454
+ "outer click content is available at point"
436
455
  ).to.be.true;
437
- expect(isVisible(outerClickContent)).to.be.true;
438
- expect(isVisible(innerClickContent)).to.be.false;
439
- const outerClose = oneEvent(outerButton, "sp-closed");
440
- document.body.click();
441
- await outerClose;
442
456
  expect(
443
- outerClickContent.parentElement instanceof OverlayTrigger,
444
- "outer content returned"
457
+ await isOnTopLayer(this.innerClickContent),
458
+ "inner click content is available at point"
445
459
  ).to.be.true;
446
- expect(isVisible(outerClickContent)).to.be.false;
447
- expect(isVisible(innerClickContent)).to.be.false;
460
+ const innerClose = oneEvent(this.innerButton, "sp-closed");
461
+ const outerClose = oneEvent(this.outerButton, "sp-closed");
462
+ sendMouse({
463
+ steps: [
464
+ {
465
+ type: "click",
466
+ position: [1, 1]
467
+ }
468
+ ]
469
+ });
470
+ await innerClose;
471
+ await outerClose;
472
+ expect(
473
+ await isOnTopLayer(this.outerClickContent),
474
+ "outer click content is not available at point"
475
+ ).to.be.not;
476
+ expect(
477
+ await isOnTopLayer(this.innerClickContent),
478
+ "inner click content is not available at point"
479
+ ).to.be.not;
448
480
  });
449
- it("opens a hover popover", async () => {
450
- const root = outerTrigger.shadowRoot ? outerTrigger.shadowRoot : outerTrigger;
451
- const triggerZone = root.querySelector(
452
- "#trigger"
453
- );
454
- expect(triggerZone).to.exist;
455
- if (!triggerZone)
456
- return;
457
- expect(outerButton).to.exist;
458
- expect(hoverContent).to.exist;
459
- expect(isVisible(hoverContent)).to.be.false;
460
- const open = oneEvent(outerTrigger, "sp-opened");
461
- const mouseEnter = new MouseEvent("mouseenter");
462
- triggerZone.dispatchEvent(mouseEnter);
481
+ it("opens a hover popover", async function() {
482
+ expect(await isOnTopLayer(this.hoverContent)).to.be.false;
483
+ const rect = this.outerTrigger.getBoundingClientRect();
484
+ const open = oneEvent(this.outerTrigger, "sp-opened");
485
+ sendMouse({
486
+ steps: [
487
+ {
488
+ type: "move",
489
+ position: [
490
+ rect.left + rect.width / 2,
491
+ rect.top + rect.height / 2
492
+ ]
493
+ }
494
+ ]
495
+ });
463
496
  await open;
464
- expect(hoverContent.parentElement).to.not.be.instanceOf(
465
- OverlayTrigger
466
- );
467
- expect(isVisible(hoverContent)).to.be.true;
468
- const close = oneEvent(outerTrigger, "sp-closed");
469
- const mouseLeave = new MouseEvent("mouseleave");
470
- triggerZone.dispatchEvent(mouseLeave);
497
+ expect(
498
+ await isOnTopLayer(this.hoverContent),
499
+ "hover content is available at point"
500
+ ).to.be.true;
501
+ const close = oneEvent(this.outerTrigger, "sp-closed");
502
+ sendMouse({
503
+ steps: [
504
+ {
505
+ type: "move",
506
+ position: [
507
+ rect.left + rect.width * 2,
508
+ rect.top + rect.height / 2
509
+ ]
510
+ }
511
+ ]
512
+ });
471
513
  await close;
472
- expect(hoverContent.parentElement).to.be.instanceOf(
473
- OverlayTrigger
474
- );
475
- expect(isVisible(hoverContent)).to.be.false;
476
- });
477
- it("closes a hover popover", async () => {
478
- const root = outerTrigger.shadowRoot ? outerTrigger.shadowRoot : outerTrigger;
479
- const triggerZone = root.querySelector(
480
- "#trigger"
481
- );
482
- expect(triggerZone).to.exist;
483
- if (!triggerZone)
484
- return;
485
- expect(outerButton).to.exist;
486
- expect(hoverContent).to.exist;
487
- expect(
488
- isVisible(hoverContent),
489
- "hoverContent should not be visible"
514
+ expect(
515
+ await isOnTopLayer(this.hoverContent),
516
+ "hover content is not available at point"
490
517
  ).to.be.false;
491
- const mouseEnter = new MouseEvent("mouseenter");
492
- const mouseLeave = new MouseEvent("mouseleave");
493
- triggerZone.dispatchEvent(mouseEnter);
518
+ });
519
+ it("closes a hover popover", async function() {
520
+ expect(await isOnTopLayer(this.hoverContent)).to.be.false;
521
+ const rect = this.outerTrigger.getBoundingClientRect();
522
+ const close = oneEvent(this.outerTrigger, "sp-closed");
523
+ await sendMouse({
524
+ steps: [
525
+ {
526
+ type: "move",
527
+ position: [
528
+ rect.left + rect.width / 2,
529
+ rect.top + rect.height / 2
530
+ ]
531
+ }
532
+ ]
533
+ });
494
534
  await nextFrame();
495
- triggerZone.dispatchEvent(mouseLeave);
496
- await waitUntil(
497
- () => isVisible(hoverContent) === false,
498
- "hoverContent should still not be visible"
499
- );
535
+ await nextFrame();
536
+ await nextFrame();
537
+ await nextFrame();
538
+ await sendMouse({
539
+ steps: [
540
+ {
541
+ type: "move",
542
+ position: [
543
+ rect.left + rect.width * 2,
544
+ rect.top + rect.height / 2
545
+ ]
546
+ }
547
+ ]
548
+ });
549
+ await close;
550
+ expect(
551
+ await isOnTopLayer(this.hoverContent),
552
+ "hover content is not available at point"
553
+ ).to.be.false;
500
554
  });
501
- it("dispatches events on open/close", async () => {
502
- const opened = oneEvent(outerButton, "sp-opened");
503
- outerButton.click();
555
+ it("dispatches events on open/close", async function() {
556
+ const opened = oneEvent(this.outerButton, "sp-opened");
557
+ this.outerButton.click();
504
558
  const openedEvent = await opened;
505
- expect(isVisible(outerClickContent)).to.be.true;
506
- expect(outerTrigger.open).to.equal("click");
507
- expect(openedEvent.detail.interaction).to.equal("click");
508
- const closed = oneEvent(outerButton, "sp-closed");
509
- document.body.click();
559
+ expect(
560
+ await isOnTopLayer(this.outerClickContent),
561
+ "hover content is available at point"
562
+ ).to.be.true;
563
+ expect(this.outerTrigger.open).to.equal("click");
564
+ expect(openedEvent.detail.interaction).to.equal("auto");
565
+ const closed = oneEvent(this.outerButton, "sp-closed");
566
+ sendMouse({
567
+ steps: [
568
+ {
569
+ type: "click",
570
+ position: [1, 1]
571
+ }
572
+ ]
573
+ });
510
574
  const closedEvent = await closed;
511
- expect(outerClickContent.parentElement).to.be.instanceOf(
512
- OverlayTrigger
513
- );
514
- expect(closedEvent.detail.interaction).to.equal("click");
515
- expect(isVisible(outerClickContent)).to.be.false;
575
+ expect(closedEvent.detail.interaction).to.equal("auto");
576
+ expect(
577
+ await isOnTopLayer(this.outerClickContent),
578
+ "hover content is not available at point"
579
+ ).to.be.false;
516
580
  });
517
581
  });
518
582
  describe("System interactions", () => {
@@ -528,47 +592,7 @@ export const runOverlayTriggerTests = () => {
528
592
  });
529
593
  await Promise.all(closes);
530
594
  });
531
- it("acquires a `color` and `size` from `sp-theme`", async () => {
532
- const el = await fixture(html`
533
- <sp-theme color="dark">
534
- <sp-theme color="light">
535
- <overlay-trigger id="trigger" placement="top">
536
- <sp-button
537
- id="outer-button"
538
- variant="primary"
539
- slot="trigger"
540
- >
541
- Show Popover
542
- </sp-button>
543
- <sp-popover
544
- id="outer-popover"
545
- dialog
546
- slot="click-content"
547
- direction="bottom"
548
- tip
549
- open
550
- >
551
- Popover content!
552
- </sp-popover>
553
- </overlay-trigger>
554
- </sp-theme>
555
- </sp-theme>
556
- `);
557
- await elementUpdated(el);
558
- expect(document.querySelector("active-overlay")).to.be.null;
559
- const button = el.querySelector("sp-button");
560
- const opened = oneEvent(button, "sp-opened");
561
- button.click();
562
- await opened;
563
- await elementUpdated(el);
564
- const overlay = document.querySelector(
565
- "active-overlay"
566
- );
567
- expect(overlay).to.exist;
568
- expect(overlay.theme.color).to.not.equal("dark");
569
- expect(overlay.theme.color).to.equal("light");
570
- });
571
- it('manages multiple layers of `type="modal"', async () => {
595
+ it.skip('manages multiple layers of `type="modal"', async () => {
572
596
  var _a, _b, _c;
573
597
  const el = await fixture(html`
574
598
  <overlay-trigger type="modal" placement="none">
@@ -694,7 +718,14 @@ export const runOverlayTriggerTests = () => {
694
718
  ).to.equal("open");
695
719
  await nextFrame();
696
720
  const closed = oneEvent(triggers[2], "sp-closed");
697
- document.body.click();
721
+ sendMouse({
722
+ steps: [
723
+ {
724
+ type: "click",
725
+ position: [1, 1]
726
+ }
727
+ ]
728
+ });
698
729
  await closed;
699
730
  await elementUpdated(overlayTriggers[2]);
700
731
  activeOverlays = [