@spectrum-web-components/overlay 0.34.1-rc.0 → 0.35.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 (155) hide show
  1. package/README.md +152 -227
  2. package/active-overlay.d.ts +6 -0
  3. package/active-overlay.dev.js +5 -0
  4. package/{sp-overlay.dev.js.map → active-overlay.dev.js.map} +3 -3
  5. package/active-overlay.js +2 -0
  6. package/{sp-overlay.js.map → active-overlay.js.map} +4 -4
  7. package/custom-elements.json +529 -1389
  8. package/package.json +22 -48
  9. package/src/ActiveOverlay.d.ts +84 -0
  10. package/src/ActiveOverlay.dev.js +517 -0
  11. package/src/ActiveOverlay.dev.js.map +7 -0
  12. package/src/ActiveOverlay.js +16 -0
  13. package/src/ActiveOverlay.js.map +7 -0
  14. package/src/OverlayTrigger.d.ts +31 -23
  15. package/src/OverlayTrigger.dev.js +245 -135
  16. package/src/OverlayTrigger.dev.js.map +3 -3
  17. package/src/OverlayTrigger.js +22 -52
  18. package/src/OverlayTrigger.js.map +3 -3
  19. package/src/VirtualTrigger.dev.js +2 -0
  20. package/src/VirtualTrigger.dev.js.map +2 -2
  21. package/src/VirtualTrigger.js +1 -1
  22. package/src/VirtualTrigger.js.map +3 -3
  23. package/src/active-overlay.css.dev.js +13 -0
  24. package/src/active-overlay.css.dev.js.map +7 -0
  25. package/src/active-overlay.css.js +10 -0
  26. package/src/active-overlay.css.js.map +7 -0
  27. package/src/index.d.ts +3 -2
  28. package/src/index.dev.js +3 -2
  29. package/src/index.dev.js.map +2 -2
  30. package/src/index.js +1 -1
  31. package/src/index.js.map +2 -2
  32. package/src/loader.d.ts +2 -2
  33. package/src/loader.dev.js +19 -2
  34. package/src/loader.dev.js.map +2 -2
  35. package/src/loader.js +1 -1
  36. package/src/loader.js.map +3 -3
  37. package/src/overlay-stack.d.ts +50 -0
  38. package/src/overlay-stack.dev.js +515 -0
  39. package/src/overlay-stack.dev.js.map +7 -0
  40. package/src/overlay-stack.js +34 -0
  41. package/src/overlay-stack.js.map +7 -0
  42. package/src/overlay-trigger.css.dev.js +1 -1
  43. package/src/overlay-trigger.css.dev.js.map +1 -1
  44. package/src/overlay-trigger.css.js +1 -1
  45. package/src/overlay-trigger.css.js.map +1 -1
  46. package/src/overlay-types.d.ts +5 -7
  47. package/src/overlay-types.dev.js +0 -1
  48. package/src/overlay-types.dev.js.map +3 -3
  49. package/src/overlay-types.js +1 -1
  50. package/src/overlay-types.js.map +3 -3
  51. package/src/overlay-utils.d.ts +3 -0
  52. package/src/overlay-utils.dev.js +31 -0
  53. package/src/overlay-utils.dev.js.map +7 -0
  54. package/src/overlay-utils.js +2 -0
  55. package/src/overlay-utils.js.map +7 -0
  56. package/src/overlay.d.ts +59 -0
  57. package/src/overlay.dev.js +127 -0
  58. package/src/overlay.dev.js.map +7 -0
  59. package/src/overlay.js +2 -0
  60. package/src/overlay.js.map +7 -0
  61. package/stories/overlay-story-components.js +8 -9
  62. package/stories/overlay-story-components.js.map +2 -2
  63. package/stories/overlay.stories.js +702 -799
  64. package/stories/overlay.stories.js.map +2 -2
  65. package/sync/overlay-trigger.d.ts +0 -4
  66. package/sync/overlay-trigger.dev.js +4 -1
  67. package/sync/overlay-trigger.dev.js.map +2 -2
  68. package/sync/overlay-trigger.js +1 -1
  69. package/sync/overlay-trigger.js.map +3 -3
  70. package/test/benchmark/basic-test.js +1 -1
  71. package/test/benchmark/basic-test.js.map +1 -1
  72. package/test/index.js +376 -407
  73. package/test/index.js.map +3 -3
  74. package/test/overlay-lifecycle.test.js +106 -34
  75. package/test/overlay-lifecycle.test.js.map +2 -2
  76. package/test/overlay-trigger-click.test.js +5 -11
  77. package/test/overlay-trigger-click.test.js.map +2 -2
  78. package/test/overlay-trigger-extended.test.js +6 -1
  79. package/test/overlay-trigger-extended.test.js.map +2 -2
  80. package/test/overlay-trigger-hover-click.test.js +23 -23
  81. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  82. package/test/overlay-trigger-hover.test.js +34 -40
  83. package/test/overlay-trigger-hover.test.js.map +2 -2
  84. package/test/overlay-trigger-longpress.test.js +80 -98
  85. package/test/overlay-trigger-longpress.test.js.map +2 -2
  86. package/test/overlay-trigger-sync.test.js +1 -1
  87. package/test/overlay-trigger-sync.test.js.map +2 -2
  88. package/test/overlay-trigger.test.js +1 -1
  89. package/test/overlay-trigger.test.js.map +2 -2
  90. package/test/overlay-update.test.js +4 -4
  91. package/test/overlay-update.test.js.map +2 -2
  92. package/test/{overlay-v1.test.js → overlay.test.js} +249 -267
  93. package/test/overlay.test.js.map +7 -0
  94. package/sp-overlay.d.ts +0 -6
  95. package/sp-overlay.dev.js +0 -5
  96. package/sp-overlay.js +0 -2
  97. package/src/Overlay.d.ts +0 -29
  98. package/src/Overlay.dev.js +0 -91
  99. package/src/Overlay.dev.js.map +0 -7
  100. package/src/Overlay.js +0 -2
  101. package/src/Overlay.js.map +0 -7
  102. package/src/OverlayBase.d.ts +0 -124
  103. package/src/OverlayBase.dev.js +0 -744
  104. package/src/OverlayBase.dev.js.map +0 -7
  105. package/src/OverlayBase.js +0 -31
  106. package/src/OverlayBase.js.map +0 -7
  107. package/src/OverlayDialog.d.ts +0 -8
  108. package/src/OverlayDialog.dev.js +0 -160
  109. package/src/OverlayDialog.dev.js.map +0 -7
  110. package/src/OverlayDialog.js +0 -2
  111. package/src/OverlayDialog.js.map +0 -7
  112. package/src/OverlayNoPopover.d.ts +0 -8
  113. package/src/OverlayNoPopover.dev.js +0 -149
  114. package/src/OverlayNoPopover.dev.js.map +0 -7
  115. package/src/OverlayNoPopover.js +0 -2
  116. package/src/OverlayNoPopover.js.map +0 -7
  117. package/src/OverlayPopover.d.ts +0 -8
  118. package/src/OverlayPopover.dev.js +0 -199
  119. package/src/OverlayPopover.dev.js.map +0 -7
  120. package/src/OverlayPopover.js +0 -2
  121. package/src/OverlayPopover.js.map +0 -7
  122. package/src/OverlayStack.d.ts +0 -29
  123. package/src/OverlayStack.dev.js +0 -126
  124. package/src/OverlayStack.dev.js.map +0 -7
  125. package/src/OverlayStack.js +0 -2
  126. package/src/OverlayStack.js.map +0 -7
  127. package/src/PlacementController.d.ts +0 -36
  128. package/src/PlacementController.dev.js +0 -191
  129. package/src/PlacementController.dev.js.map +0 -7
  130. package/src/PlacementController.js +0 -2
  131. package/src/PlacementController.js.map +0 -7
  132. package/src/fullSizePlugin.d.ts +0 -12
  133. package/src/fullSizePlugin.dev.js +0 -39
  134. package/src/fullSizePlugin.dev.js.map +0 -7
  135. package/src/fullSizePlugin.js +0 -2
  136. package/src/fullSizePlugin.js.map +0 -7
  137. package/src/overlay-base.css.dev.js +0 -9
  138. package/src/overlay-base.css.dev.js.map +0 -7
  139. package/src/overlay-base.css.js +0 -6
  140. package/src/overlay-base.css.js.map +0 -7
  141. package/src/topLayerOverTransforms.d.ts +0 -23
  142. package/src/topLayerOverTransforms.dev.js +0 -170
  143. package/src/topLayerOverTransforms.dev.js.map +0 -7
  144. package/src/topLayerOverTransforms.js +0 -2
  145. package/src/topLayerOverTransforms.js.map +0 -7
  146. package/stories/overlay-element.stories.js +0 -247
  147. package/stories/overlay-element.stories.js.map +0 -7
  148. package/test/overlay-element.test-vrt.js +0 -5
  149. package/test/overlay-element.test-vrt.js.map +0 -7
  150. package/test/overlay-element.test.js +0 -682
  151. package/test/overlay-element.test.js.map +0 -7
  152. package/test/overlay-v1.test.js.map +0 -7
  153. package/test/overlay-v2.test.js +0 -720
  154. package/test/overlay-v2.test.js.map +0 -7
  155. /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>
@@ -51,6 +65,8 @@ export const runOverlayTriggerTests = (type) => {
51
65
  slot="click-content"
52
66
  direction="bottom"
53
67
  tip
68
+ open
69
+ tabindex="0"
54
70
  >
55
71
  <sp-dialog
56
72
  no-divider
@@ -71,6 +87,8 @@ export const runOverlayTriggerTests = (type) => {
71
87
  slot="click-content"
72
88
  direction="bottom"
73
89
  tip
90
+ open
91
+ tabindex="0"
74
92
  >
75
93
  <sp-dialog
76
94
  no-divider
@@ -94,489 +112,407 @@ export const runOverlayTriggerTests = (type) => {
94
112
  </div>
95
113
  `
96
114
  );
97
- this.innerTrigger = this.testDiv.querySelector(
115
+ innerTrigger = testDiv.querySelector(
98
116
  "#inner-trigger"
99
117
  );
100
- this.outerTrigger = this.testDiv.querySelector(
118
+ outerTrigger = testDiv.querySelector(
101
119
  "#trigger"
102
120
  );
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(
121
+ innerButton = testDiv.querySelector("#inner-button");
122
+ outerButton = testDiv.querySelector("#outer-button");
123
+ innerClickContent = testDiv.querySelector(
110
124
  "#inner-popover"
111
125
  );
112
- this.outerClickContent = this.testDiv.querySelector(
126
+ outerClickContent = testDiv.querySelector(
113
127
  "#outer-popover"
114
128
  );
115
- this.hoverContent = this.testDiv.querySelector(
129
+ hoverContent = testDiv.querySelector(
116
130
  "#hover-content"
117
131
  );
118
132
  });
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();
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();
127
161
  await open;
128
- expect(
129
- await isOnTopLayer(this.outerClickContent),
130
- "popover available at point"
131
- ).to.be.true;
162
+ expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
163
+ OverlayTrigger
164
+ );
165
+ expect(isVisible(outerClickContent)).to.be.true;
132
166
  });
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();
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();
142
173
  await opened;
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;
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
180
  await closed;
150
- expect(
151
- await isOnTopLayer(this.outerClickContent),
152
- "popover not available at point"
153
- ).to.be.false;
181
+ expect(isVisible(outerClickContent)).to.be.false;
182
+ expect(outerTrigger.disabled).to.be.true;
154
183
  });
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();
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();
163
189
  await open;
164
- expect(
165
- await isOnTopLayer(this.outerClickContent),
166
- "popover available at point"
167
- ).to.be.true;
190
+ expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
191
+ OverlayTrigger
192
+ );
193
+ expect(isVisible(outerClickContent)).to.be.true;
168
194
  window.dispatchEvent(new Event("resize"));
169
195
  window.dispatchEvent(new Event("resize"));
170
- expect(
171
- await isOnTopLayer(this.outerClickContent),
172
- "popover available at point"
173
- ).to.be.true;
196
+ expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
197
+ OverlayTrigger
198
+ );
199
+ expect(isVisible(outerClickContent)).to.be.true;
174
200
  });
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();
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();
186
209
  await opened;
187
210
  expect(
188
- await isOnTopLayer(this.outerClickContent),
189
- "popover available at point"
190
- ).to.be.true;
211
+ outerClickContent.parentElement
212
+ ).to.not.be.an.instanceOf(OverlayTrigger);
213
+ expect(isVisible(outerClickContent)).to.be.true;
191
214
  });
192
215
  });
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;
216
+ it("does not open a hover popover when a click popover is open", async () => {
198
217
  expect(
199
- await isOnTopLayer(this.hoverContent),
200
- "hover not available at point"
218
+ isVisible(outerClickContent),
219
+ "outer popover not visible"
201
220
  ).to.be.false;
202
- expect(this.outerButton).to.exist;
203
- const open = oneEvent(this.outerTrigger, "sp-opened");
204
- this.outerButton.click();
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();
205
225
  await open;
226
+ expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
227
+ OverlayTrigger
228
+ );
229
+ expect(isVisible(outerClickContent), "outer popover visible").to.be.true;
206
230
  expect(
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"
231
+ isVisible(hoverContent),
232
+ "hover popover still not visible"
213
233
  ).to.be.false;
214
- this.outerButton.dispatchEvent(
234
+ outerButton.dispatchEvent(
215
235
  new Event("mouseenter", {
216
236
  bubbles: true,
217
237
  composed: true
218
238
  })
219
239
  );
220
240
  await nextFrame();
241
+ expect(hoverContent.parentElement).to.be.instanceOf(
242
+ OverlayTrigger
243
+ );
221
244
  expect(
222
- await isOnTopLayer(this.outerClickContent),
223
- "popover available at point"
245
+ isVisible(outerClickContent),
246
+ "outer popover visible again"
224
247
  ).to.be.true;
225
248
  expect(
226
- await isOnTopLayer(this.hoverContent),
227
- "hover not available at point"
249
+ isVisible(hoverContent),
250
+ "hover popover not visible again"
228
251
  ).to.be.false;
229
252
  });
230
- it("does not open a popover when [disabled]", async function() {
231
- const triggerZone = this.outerTrigger.shadowRoot.querySelector(
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(
232
257
  "#trigger"
233
258
  );
234
- expect(this.outerTrigger.disabled).to.be.false;
235
- let open = oneEvent(this.outerTrigger, "sp-opened");
236
- this.outerButton.click();
259
+ expect(outerTrigger.disabled).to.be.false;
260
+ let open = oneEvent(outerTrigger, "sp-opened");
261
+ outerButton.click();
237
262
  await open;
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
- });
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();
251
268
  await closed;
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;
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
+ );
266
281
  triggerZone.dispatchEvent(new Event("mouseenter"));
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();
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();
278
292
  await open;
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();
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
298
  await closed;
286
- expect(
287
- await isOnTopLayer(this.outerClickContent),
288
- "hover not available at point"
289
- ).to.be.false;
299
+ expect((_f = outerClickContent.parentElement) == null ? void 0 : _f.localName).to.equal(
300
+ "overlay-trigger"
301
+ );
290
302
  });
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();
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();
303
309
  await open;
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();
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();
311
317
  await open;
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;
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;
320
323
  });
321
- it('focus previous "modal" when closing nested "modal"', async function() {
322
- this.outerTrigger.type = "modal";
323
- this.innerTrigger.type = "modal";
324
+ it('focus previous "modal" when closing nested "modal"', async () => {
325
+ outerTrigger.type = "modal";
326
+ innerTrigger.type = "modal";
324
327
  expect(
325
- await isOnTopLayer(this.outerClickContent),
326
- "outer click content not available at point"
328
+ isVisible(outerClickContent),
329
+ "outer popover starts closed"
327
330
  ).to.be.false;
328
331
  expect(
329
- await isOnTopLayer(this.innerClickContent),
330
- "inner click content not available at point"
332
+ isVisible(innerClickContent),
333
+ "inner popover starts closed"
331
334
  ).to.be.false;
332
- const outerOpen = oneEvent(this.outerButton, "sp-opened");
333
- this.outerButton.click();
335
+ expect(outerButton).to.exist;
336
+ const outerOpen = oneEvent(outerButton, "sp-opened");
337
+ outerButton.click();
334
338
  await outerOpen;
339
+ expect(outerClickContent.parentElement).to.not.be.an.instanceOf(
340
+ OverlayTrigger
341
+ );
342
+ expect(isVisible(outerClickContent), "outer popover opens").to.be.true;
335
343
  expect(
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"
344
+ isVisible(innerClickContent),
345
+ "inner popover stays closed"
342
346
  ).to.be.false;
343
- const innerOpen = oneEvent(this.innerButton, "sp-opened");
344
- this.innerButton.click();
347
+ const innerOpen = oneEvent(innerButton, "sp-opened");
348
+ innerButton.click();
345
349
  await innerOpen;
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
- });
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();
358
357
  await innerClose;
358
+ expect(innerClickContent.parentElement).to.be.instanceOf(
359
+ OverlayTrigger
360
+ );
359
361
  expect(
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,
362
+ document.activeElement === innerButton,
369
363
  "outer popover recieved focus"
370
364
  ).to.be.true;
371
365
  });
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();
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();
377
371
  await outerOpen;
378
372
  expect(
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();
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();
384
378
  await innerOpen;
385
379
  expect(
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;
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;
393
385
  pressSpace();
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
- });
386
+ expect(isVisible(outerClickContent)).to.be.true;
387
+ expect(isVisible(innerClickContent)).to.be.true;
388
+ const innerClose = oneEvent(innerButton, "sp-closed");
389
+ pressEscape();
406
390
  await innerClose;
407
391
  expect(
408
- await isOnTopLayer(this.outerClickContent),
409
- "outer click content available at point"
392
+ innerClickContent.parentElement instanceof OverlayTrigger,
393
+ "inner content returned"
410
394
  ).to.be.true;
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
- });
395
+ expect(isVisible(outerClickContent)).to.be.true;
396
+ expect(isVisible(innerClickContent)).to.be.false;
397
+ const outerClose = oneEvent(outerButton, "sp-closed");
398
+ pressEscape();
419
399
  await outerClose;
420
400
  expect(
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;
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;
428
406
  });
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();
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();
434
412
  await outerOpen;
435
413
  expect(
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();
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();
441
419
  await innerOpen;
442
420
  expect(
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();
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();
451
427
  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;
452
433
  expect(
453
- await isOnTopLayer(this.outerClickContent),
454
- "outer click content is available at point"
455
- ).to.be.true;
456
- expect(
457
- await isOnTopLayer(this.innerClickContent),
458
- "inner click content is available at point"
434
+ innerClickContent.parentElement instanceof OverlayTrigger,
435
+ "inner content returned"
459
436
  ).to.be.true;
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;
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();
471
441
  await outerClose;
472
442
  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;
443
+ outerClickContent.parentElement instanceof OverlayTrigger,
444
+ "outer content returned"
445
+ ).to.be.true;
446
+ expect(isVisible(outerClickContent)).to.be.false;
447
+ expect(isVisible(innerClickContent)).to.be.false;
480
448
  });
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
- });
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);
496
463
  await open;
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
- });
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);
513
471
  await close;
514
- expect(
515
- await isOnTopLayer(this.hoverContent),
516
- "hover content is not available at point"
517
- ).to.be.false;
472
+ expect(hoverContent.parentElement).to.be.instanceOf(
473
+ OverlayTrigger
474
+ );
475
+ expect(isVisible(hoverContent)).to.be.false;
518
476
  });
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
- });
534
- await nextFrame();
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"
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"
553
490
  ).to.be.false;
491
+ const mouseEnter = new MouseEvent("mouseenter");
492
+ const mouseLeave = new MouseEvent("mouseleave");
493
+ triggerZone.dispatchEvent(mouseEnter);
494
+ await nextFrame();
495
+ triggerZone.dispatchEvent(mouseLeave);
496
+ await waitUntil(
497
+ () => isVisible(hoverContent) === false,
498
+ "hoverContent should still not be visible"
499
+ );
554
500
  });
555
- it("dispatches events on open/close", async function() {
556
- const opened = oneEvent(this.outerButton, "sp-opened");
557
- this.outerButton.click();
501
+ it("dispatches events on open/close", async () => {
502
+ const opened = oneEvent(outerButton, "sp-opened");
503
+ outerButton.click();
558
504
  const openedEvent = await opened;
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
- });
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();
574
510
  const closedEvent = await closed;
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;
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;
580
516
  });
581
517
  });
582
518
  describe("System interactions", () => {
@@ -592,7 +528,47 @@ export const runOverlayTriggerTests = (type) => {
592
528
  });
593
529
  await Promise.all(closes);
594
530
  });
595
- it.skip('manages multiple layers of `type="modal"', async () => {
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 () => {
596
572
  var _a, _b, _c;
597
573
  const el = await fixture(html`
598
574
  <overlay-trigger type="modal" placement="none">
@@ -718,14 +694,7 @@ export const runOverlayTriggerTests = (type) => {
718
694
  ).to.equal("open");
719
695
  await nextFrame();
720
696
  const closed = oneEvent(triggers[2], "sp-closed");
721
- sendMouse({
722
- steps: [
723
- {
724
- type: "click",
725
- position: [1, 1]
726
- }
727
- ]
728
- });
697
+ document.body.click();
729
698
  await closed;
730
699
  await elementUpdated(overlayTriggers[2]);
731
700
  activeOverlays = [