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