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