@spectrum-web-components/overlay 1.1.0 → 1.1.1

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 (204) hide show
  1. package/overlay-trigger.d.ts +6 -0
  2. package/overlay-trigger.dev.js +5 -0
  3. package/overlay-trigger.dev.js.map +7 -0
  4. package/overlay-trigger.js +2 -0
  5. package/overlay-trigger.js.map +7 -0
  6. package/package.json +7 -7
  7. package/sp-overlay.d.ts +6 -0
  8. package/sp-overlay.dev.js +5 -0
  9. package/sp-overlay.dev.js.map +7 -0
  10. package/sp-overlay.js +2 -0
  11. package/sp-overlay.js.map +7 -0
  12. package/src/AbstractOverlay.d.ts +72 -0
  13. package/src/AbstractOverlay.dev.js +234 -0
  14. package/src/AbstractOverlay.dev.js.map +7 -0
  15. package/src/AbstractOverlay.js +2 -0
  16. package/src/AbstractOverlay.js.map +7 -0
  17. package/src/ClickController.d.ts +14 -0
  18. package/src/ClickController.dev.js +42 -0
  19. package/src/ClickController.dev.js.map +7 -0
  20. package/src/ClickController.js +2 -0
  21. package/src/ClickController.js.map +7 -0
  22. package/src/HoverController.d.ts +22 -0
  23. package/src/HoverController.dev.js +177 -0
  24. package/src/HoverController.dev.js.map +7 -0
  25. package/src/HoverController.js +2 -0
  26. package/src/HoverController.js.map +7 -0
  27. package/src/InteractionController.d.ts +44 -0
  28. package/src/InteractionController.dev.js +94 -0
  29. package/src/InteractionController.dev.js.map +7 -0
  30. package/src/InteractionController.js +2 -0
  31. package/src/InteractionController.js.map +7 -0
  32. package/src/LongpressController.d.ts +21 -0
  33. package/src/LongpressController.dev.js +156 -0
  34. package/src/LongpressController.dev.js.map +7 -0
  35. package/src/LongpressController.js +2 -0
  36. package/src/LongpressController.js.map +7 -0
  37. package/src/Overlay.d.ts +464 -0
  38. package/src/Overlay.dev.js +794 -0
  39. package/src/Overlay.dev.js.map +7 -0
  40. package/src/Overlay.js +33 -0
  41. package/src/Overlay.js.map +7 -0
  42. package/src/OverlayDialog.d.ts +4 -0
  43. package/src/OverlayDialog.dev.js +140 -0
  44. package/src/OverlayDialog.dev.js.map +7 -0
  45. package/src/OverlayDialog.js +2 -0
  46. package/src/OverlayDialog.js.map +7 -0
  47. package/src/OverlayNoPopover.d.ts +4 -0
  48. package/src/OverlayNoPopover.dev.js +117 -0
  49. package/src/OverlayNoPopover.dev.js.map +7 -0
  50. package/src/OverlayNoPopover.js +2 -0
  51. package/src/OverlayNoPopover.js.map +7 -0
  52. package/src/OverlayPopover.d.ts +4 -0
  53. package/src/OverlayPopover.dev.js +199 -0
  54. package/src/OverlayPopover.dev.js.map +7 -0
  55. package/src/OverlayPopover.js +2 -0
  56. package/src/OverlayPopover.js.map +7 -0
  57. package/src/OverlayStack.d.ts +44 -0
  58. package/src/OverlayStack.dev.js +163 -0
  59. package/src/OverlayStack.dev.js.map +7 -0
  60. package/src/OverlayStack.js +2 -0
  61. package/src/OverlayStack.js.map +7 -0
  62. package/src/OverlayTrigger.d.ts +52 -0
  63. package/src/OverlayTrigger.dev.js +243 -0
  64. package/src/OverlayTrigger.dev.js.map +7 -0
  65. package/src/OverlayTrigger.js +57 -0
  66. package/src/OverlayTrigger.js.map +7 -0
  67. package/src/PlacementController.d.ts +157 -0
  68. package/src/PlacementController.dev.js +287 -0
  69. package/src/PlacementController.dev.js.map +7 -0
  70. package/src/PlacementController.js +2 -0
  71. package/src/PlacementController.js.map +7 -0
  72. package/src/VirtualTrigger.d.ts +7 -0
  73. package/src/VirtualTrigger.dev.js +32 -0
  74. package/src/VirtualTrigger.dev.js.map +7 -0
  75. package/src/VirtualTrigger.js +2 -0
  76. package/src/VirtualTrigger.js.map +7 -0
  77. package/src/events.d.ts +23 -0
  78. package/src/events.dev.js +39 -0
  79. package/src/events.dev.js.map +7 -0
  80. package/src/events.js +2 -0
  81. package/src/events.js.map +7 -0
  82. package/src/fullSizePlugin.d.ts +12 -0
  83. package/src/fullSizePlugin.dev.js +39 -0
  84. package/src/fullSizePlugin.dev.js.map +7 -0
  85. package/src/fullSizePlugin.js +2 -0
  86. package/src/fullSizePlugin.js.map +7 -0
  87. package/src/index.d.ts +6 -0
  88. package/src/index.dev.js +8 -0
  89. package/src/index.dev.js.map +7 -0
  90. package/src/index.js +2 -0
  91. package/src/index.js.map +7 -0
  92. package/src/loader.d.ts +4 -0
  93. package/src/loader.dev.js +11 -0
  94. package/src/loader.dev.js.map +7 -0
  95. package/src/loader.js +2 -0
  96. package/src/loader.js.map +7 -0
  97. package/src/overlay-events.d.ts +11 -0
  98. package/src/overlay-events.dev.js +8 -0
  99. package/src/overlay-events.dev.js.map +7 -0
  100. package/src/overlay-events.js +2 -0
  101. package/src/overlay-events.js.map +7 -0
  102. package/src/overlay-timer.d.ts +22 -0
  103. package/src/overlay-timer.dev.js +72 -0
  104. package/src/overlay-timer.dev.js.map +7 -0
  105. package/src/overlay-timer.js +2 -0
  106. package/src/overlay-timer.js.map +7 -0
  107. package/src/overlay-trigger-directive.d.ts +26 -0
  108. package/src/overlay-trigger-directive.dev.js +87 -0
  109. package/src/overlay-trigger-directive.dev.js.map +7 -0
  110. package/src/overlay-trigger-directive.js +2 -0
  111. package/src/overlay-trigger-directive.js.map +7 -0
  112. package/src/overlay-trigger.css.d.ts +2 -0
  113. package/src/overlay-trigger.css.dev.js +7 -0
  114. package/src/overlay-trigger.css.dev.js.map +7 -0
  115. package/src/overlay-trigger.css.js +4 -0
  116. package/src/overlay-trigger.css.js.map +7 -0
  117. package/src/overlay-types.d.ts +50 -0
  118. package/src/overlay-types.dev.js +3 -0
  119. package/src/overlay-types.dev.js.map +7 -0
  120. package/src/overlay-types.js +2 -0
  121. package/src/overlay-types.js.map +7 -0
  122. package/src/overlay.css.d.ts +2 -0
  123. package/src/overlay.css.dev.js +7 -0
  124. package/src/overlay.css.dev.js.map +7 -0
  125. package/src/overlay.css.js +4 -0
  126. package/src/overlay.css.js.map +7 -0
  127. package/src/slottable-request-directive.d.ts +17 -0
  128. package/src/slottable-request-directive.dev.js +66 -0
  129. package/src/slottable-request-directive.dev.js.map +7 -0
  130. package/src/slottable-request-directive.js +2 -0
  131. package/src/slottable-request-directive.js.map +7 -0
  132. package/src/slottable-request-event.d.ts +12 -0
  133. package/src/slottable-request-event.dev.js +28 -0
  134. package/src/slottable-request-event.dev.js.map +7 -0
  135. package/src/slottable-request-event.js +2 -0
  136. package/src/slottable-request-event.js.map +7 -0
  137. package/src/strategies.d.ts +8 -0
  138. package/src/strategies.dev.js +10 -0
  139. package/src/strategies.dev.js.map +7 -0
  140. package/src/strategies.js +2 -0
  141. package/src/strategies.js.map +7 -0
  142. package/stories/index.js +48 -0
  143. package/stories/index.js.map +7 -0
  144. package/stories/overlay-directive.stories.js +340 -0
  145. package/stories/overlay-directive.stories.js.map +7 -0
  146. package/stories/overlay-element.stories.js +687 -0
  147. package/stories/overlay-element.stories.js.map +7 -0
  148. package/stories/overlay-story-components.js +338 -0
  149. package/stories/overlay-story-components.js.map +7 -0
  150. package/stories/overlay.stories.js +1412 -0
  151. package/stories/overlay.stories.js.map +7 -0
  152. package/sync/overlay-trigger.d.ts +6 -0
  153. package/sync/overlay-trigger.dev.js +6 -0
  154. package/sync/overlay-trigger.dev.js.map +7 -0
  155. package/sync/overlay-trigger.js +2 -0
  156. package/sync/overlay-trigger.js.map +7 -0
  157. package/test/benchmark/basic-test.js +40 -0
  158. package/test/benchmark/basic-test.js.map +7 -0
  159. package/test/benchmark/directive-test.js +43 -0
  160. package/test/benchmark/directive-test.js.map +7 -0
  161. package/test/benchmark/element-test.js +40 -0
  162. package/test/benchmark/element-test.js.map +7 -0
  163. package/test/benchmark/lazy-test.js +47 -0
  164. package/test/benchmark/lazy-test.js.map +7 -0
  165. package/test/index.js +605 -0
  166. package/test/index.js.map +7 -0
  167. package/test/overlay-directive.test-vrt.js +5 -0
  168. package/test/overlay-directive.test-vrt.js.map +7 -0
  169. package/test/overlay-directive.test.js +162 -0
  170. package/test/overlay-directive.test.js.map +7 -0
  171. package/test/overlay-element.test-vrt.js +5 -0
  172. package/test/overlay-element.test-vrt.js.map +7 -0
  173. package/test/overlay-element.test.js +934 -0
  174. package/test/overlay-element.test.js.map +7 -0
  175. package/test/overlay-lifecycle.test.js +139 -0
  176. package/test/overlay-lifecycle.test.js.map +7 -0
  177. package/test/overlay-memory.test.js +10 -0
  178. package/test/overlay-memory.test.js.map +7 -0
  179. package/test/overlay-timer.test.js +118 -0
  180. package/test/overlay-timer.test.js.map +7 -0
  181. package/test/overlay-trigger-click.test.js +164 -0
  182. package/test/overlay-trigger-click.test.js.map +7 -0
  183. package/test/overlay-trigger-directive.test.js +75 -0
  184. package/test/overlay-trigger-directive.test.js.map +7 -0
  185. package/test/overlay-trigger-extended.test.js +235 -0
  186. package/test/overlay-trigger-extended.test.js.map +7 -0
  187. package/test/overlay-trigger-hover-click.test.js +225 -0
  188. package/test/overlay-trigger-hover-click.test.js.map +7 -0
  189. package/test/overlay-trigger-hover.test.js +308 -0
  190. package/test/overlay-trigger-hover.test.js.map +7 -0
  191. package/test/overlay-trigger-longpress.test.js +531 -0
  192. package/test/overlay-trigger-longpress.test.js.map +7 -0
  193. package/test/overlay-trigger-sync.test.js +5 -0
  194. package/test/overlay-trigger-sync.test.js.map +7 -0
  195. package/test/overlay-trigger.test.js +5 -0
  196. package/test/overlay-trigger.test.js.map +7 -0
  197. package/test/overlay-update.test.js +28 -0
  198. package/test/overlay-update.test.js.map +7 -0
  199. package/test/overlay-v1.test.js +569 -0
  200. package/test/overlay-v1.test.js.map +7 -0
  201. package/test/overlay.test-vrt.js +5 -0
  202. package/test/overlay.test-vrt.js.map +7 -0
  203. package/test/overlay.test.js +865 -0
  204. package/test/overlay.test.js.map +7 -0
@@ -0,0 +1,1412 @@
1
+ "use strict";
2
+ import "@spectrum-web-components/action-button/sp-action-button.js";
3
+ import "@spectrum-web-components/action-group/sp-action-group.js";
4
+ import { html } from "@spectrum-web-components/base";
5
+ import { ifDefined } from "@spectrum-web-components/base/src/directives.js";
6
+ import "@spectrum-web-components/button/sp-button.js";
7
+ import "@spectrum-web-components/dialog/sp-dialog-wrapper.js";
8
+ import "@spectrum-web-components/dialog/sp-dialog.js";
9
+ import "@spectrum-web-components/field-label/sp-field-label.js";
10
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js";
11
+ import "@spectrum-web-components/icons-workflow/icons/sp-icon-open-in.js";
12
+ import {
13
+ openOverlay,
14
+ Overlay,
15
+ VirtualTrigger
16
+ } from "@spectrum-web-components/overlay";
17
+ import "@spectrum-web-components/overlay/overlay-trigger.js";
18
+ import "@spectrum-web-components/accordion/sp-accordion-item.js";
19
+ import "@spectrum-web-components/accordion/sp-accordion.js";
20
+ import "@spectrum-web-components/button-group/sp-button-group.js";
21
+ import "@spectrum-web-components/menu/sp-menu-divider.js";
22
+ import "@spectrum-web-components/menu/sp-menu-group.js";
23
+ import "@spectrum-web-components/menu/sp-menu-item.js";
24
+ import "@spectrum-web-components/menu/sp-menu.js";
25
+ import "@spectrum-web-components/overlay/sp-overlay.js";
26
+ import "@spectrum-web-components/picker/sp-picker.js";
27
+ import "@spectrum-web-components/popover/sp-popover.js";
28
+ import "@spectrum-web-components/radio/sp-radio-group.js";
29
+ import "@spectrum-web-components/radio/sp-radio.js";
30
+ import "@spectrum-web-components/slider/sp-slider.js";
31
+ import "@spectrum-web-components/theme/sp-theme.js";
32
+ import "@spectrum-web-components/theme/src/themes.js";
33
+ import "@spectrum-web-components/tooltip/sp-tooltip.js";
34
+ import "../../../projects/story-decorator/src/types.js";
35
+ import { render } from "lit-html";
36
+ import "./overlay-story-components.js";
37
+ const storyStyles = html`
38
+ <style>
39
+ html,
40
+ body,
41
+ #root,
42
+ #root-inner,
43
+ sp-story-decorator {
44
+ height: 100%;
45
+ margin: 0;
46
+ }
47
+
48
+ sp-story-decorator::part(container) {
49
+ display: flex;
50
+ flex-direction: column;
51
+ width: 100%;
52
+ height: 100%;
53
+ align-items: center;
54
+ justify-content: center;
55
+ }
56
+
57
+ overlay-trigger {
58
+ flex: none;
59
+ }
60
+
61
+ #styled-div {
62
+ background-color: var(--styled-div-background-color, blue);
63
+ color: white;
64
+ padding: 4px 10px;
65
+ margin-bottom: 10px;
66
+ }
67
+
68
+ #inner-trigger {
69
+ display: inline-block;
70
+ }
71
+ </style>
72
+ `;
73
+ export default {
74
+ title: "Overlay",
75
+ argTypes: {
76
+ offset: { control: "number" },
77
+ placement: {
78
+ control: {
79
+ type: "inline-radio",
80
+ options: [
81
+ "top",
82
+ "top-start",
83
+ "top-end",
84
+ "bottom",
85
+ "bottom-start",
86
+ "bottom-end",
87
+ "left",
88
+ "left-start",
89
+ "left-end",
90
+ "right",
91
+ "right-start",
92
+ "right-end",
93
+ "auto",
94
+ "auto-start",
95
+ "auto-end",
96
+ "none"
97
+ ]
98
+ }
99
+ },
100
+ type: {
101
+ control: {
102
+ type: "inline-radio",
103
+ options: ["modal", "replace", "inline"]
104
+ }
105
+ },
106
+ colorStop: {
107
+ control: {
108
+ type: "inline-radio",
109
+ options: ["light", "dark"]
110
+ }
111
+ }
112
+ },
113
+ args: {
114
+ placement: "bottom",
115
+ offset: 0,
116
+ colorStop: "light"
117
+ }
118
+ };
119
+ const template = ({
120
+ placement,
121
+ offset,
122
+ open,
123
+ type
124
+ }) => {
125
+ return html`
126
+ ${storyStyles}
127
+ <overlay-trigger
128
+ content="click hover"
129
+ id="trigger"
130
+ placement="${placement}"
131
+ offset="${offset}"
132
+ open=${ifDefined(open)}
133
+ type=${ifDefined(type)}
134
+ >
135
+ <sp-button variant="primary" slot="trigger">Show Popover</sp-button>
136
+ <sp-popover slot="click-content" placement="${placement}" tip>
137
+ <sp-dialog no-divider>
138
+ <sp-slider
139
+ value="5"
140
+ step="0.5"
141
+ min="0"
142
+ max="20"
143
+ label="Awesomeness"
144
+ default-value="10"
145
+ ></sp-slider>
146
+ <div id="styled-div">
147
+ The background of this div should be blue
148
+ </div>
149
+ <overlay-trigger id="inner-trigger" placement="bottom">
150
+ <sp-button slot="trigger">Press Me</sp-button>
151
+ <sp-popover slot="click-content" placement="bottom" tip>
152
+ <sp-dialog size="s" no-divider>
153
+ Another Popover
154
+ </sp-dialog>
155
+ </sp-popover>
156
+
157
+ <sp-tooltip slot="hover-content" delayed tip="bottom">
158
+ Click to open another popover.
159
+ </sp-tooltip>
160
+ </overlay-trigger>
161
+ </sp-dialog>
162
+ </sp-popover>
163
+ <sp-tooltip
164
+ slot="hover-content"
165
+ ?delayed=${open !== "hover"}
166
+ tip="bottom"
167
+ >
168
+ Click to open a popover.
169
+ </sp-tooltip>
170
+ </overlay-trigger>
171
+ `;
172
+ };
173
+ const extraText = html`
174
+ <p>This is some text.</p>
175
+ <p>This is some text.</p>
176
+ <p>
177
+ This is a
178
+ <a href="#anchor">link</a>
179
+ .
180
+ </p>
181
+ `;
182
+ function nextFrame() {
183
+ return new Promise((res) => requestAnimationFrame(() => res()));
184
+ }
185
+ export const Default = (args) => template(args);
186
+ export const accordion = () => {
187
+ return html`
188
+ <overlay-trigger type="modal" placement="top-start">
189
+ <style>
190
+ sp-button {
191
+ margin-top: 70vh;
192
+ }
193
+ </style>
194
+ <sp-button variant="primary" slot="trigger">
195
+ Open overlay w/ accordion
196
+ </sp-button>
197
+ <sp-popover
198
+ slot="click-content"
199
+ style="overflow-y: scroll;position: static;"
200
+ >
201
+ <sp-dialog size="s" no-divider>
202
+ <sp-accordion allow-multiple>
203
+ <sp-accordion-item label="Some things">
204
+ <p>
205
+ Thing
206
+ <br />
207
+ <br />
208
+ <br />
209
+ <br />
210
+ <br />
211
+ <br />
212
+ <br />
213
+ more things
214
+ </p>
215
+ </sp-accordion-item>
216
+ <sp-accordion-item label="Other things">
217
+ <p>
218
+ Thing
219
+ <br />
220
+ <br />
221
+ <br />
222
+ <br />
223
+ <br />
224
+ <br />
225
+ <br />
226
+ more things
227
+ </p>
228
+ </sp-accordion-item>
229
+ <sp-accordion-item label="More things">
230
+ <p>
231
+ Thing
232
+ <br />
233
+ <br />
234
+ <br />
235
+ <br />
236
+ <br />
237
+ <br />
238
+ <br />
239
+ more things
240
+ </p>
241
+ </sp-accordion-item>
242
+ <sp-accordion-item label="Additional things">
243
+ <p>
244
+ Thing
245
+ <br />
246
+ <br />
247
+ <br />
248
+ <br />
249
+ <br />
250
+ <br />
251
+ <br />
252
+ more things
253
+ </p>
254
+ </sp-accordion-item>
255
+ </sp-accordion>
256
+ </sp-dialog>
257
+ </sp-popover>
258
+ </overlay-trigger>
259
+ `;
260
+ };
261
+ accordion.swc_vrt = {
262
+ skip: true
263
+ };
264
+ accordion.parameters = {
265
+ // Disables Chromatic's snapshotting on a global level
266
+ chromatic: { disableSnapshot: true }
267
+ };
268
+ export const clickAndHoverTarget = () => {
269
+ return html`
270
+ <overlay-trigger type="modal">
271
+ <sp-button variant="primary" slot="trigger">Button</sp-button>
272
+ <sp-popover slot="click-content" placement="bottom" tip>
273
+ Popover content
274
+ </sp-popover>
275
+ <sp-tooltip slot="hover-content" placement="right">
276
+ Tooltip content
277
+ </sp-tooltip>
278
+ </overlay-trigger>
279
+ `;
280
+ };
281
+ clickAndHoverTarget.swc_vrt = {
282
+ skip: true
283
+ };
284
+ clickAndHoverTarget.parameters = {
285
+ // Disables Chromatic's snapshotting on a global level
286
+ chromatic: { disableSnapshot: true }
287
+ };
288
+ export const clickAndHoverTargets = () => {
289
+ return html`
290
+ <div>
291
+ ${storyStyles}
292
+ <style>
293
+ .friendly-target {
294
+ padding: 4px;
295
+ margin: 6px;
296
+ border: 2px solid black;
297
+ border-radius: 6px;
298
+ cursor: default;
299
+ }
300
+ </style>
301
+ <overlay-trigger placement="right">
302
+ <div class="friendly-target" slot="trigger" tabindex="0">
303
+ Click me
304
+ </div>
305
+ <sp-tooltip slot="click-content" tip="right">
306
+ Ok, now hover the other trigger
307
+ </sp-tooltip>
308
+ </overlay-trigger>
309
+ <overlay-trigger placement="left">
310
+ <div class="friendly-target" slot="trigger" tabindex="0">
311
+ Then hover me
312
+ </div>
313
+ <sp-tooltip slot="hover-content" tip="right">
314
+ Now click my trigger -- I should stay open, but the other
315
+ overlay should close
316
+ </sp-tooltip>
317
+ </overlay-trigger>
318
+ </div>
319
+ `;
320
+ };
321
+ clickAndHoverTargets.swc_vrt = {
322
+ skip: true
323
+ };
324
+ clickAndHoverTargets.parameters = {
325
+ // Disables Chromatic's snapshotting on a global level
326
+ chromatic: { disableSnapshot: true }
327
+ };
328
+ class ScrollForcer extends HTMLElement {
329
+ constructor() {
330
+ super();
331
+ this.doScroll = async () => {
332
+ var _a;
333
+ (_a = this.previousElementSibling) == null ? void 0 : _a.addEventListener(
334
+ "sp-opened",
335
+ this.doScroll
336
+ );
337
+ await nextFrame();
338
+ await nextFrame();
339
+ await nextFrame();
340
+ await nextFrame();
341
+ if (document.scrollingElement) {
342
+ document.scrollingElement.scrollTop = 100;
343
+ }
344
+ await nextFrame();
345
+ await nextFrame();
346
+ this.ready(true);
347
+ };
348
+ this.readyPromise = Promise.resolve(false);
349
+ this.readyPromise = new Promise((res) => {
350
+ this.ready = res;
351
+ });
352
+ this.setup();
353
+ }
354
+ async setup() {
355
+ var _a, _b;
356
+ await nextFrame();
357
+ await nextFrame();
358
+ (_a = this.previousElementSibling) == null ? void 0 : _a.addEventListener(
359
+ "sp-opened",
360
+ this.doScroll
361
+ );
362
+ await nextFrame();
363
+ await nextFrame();
364
+ ((_b = this.previousElementSibling) == null ? void 0 : _b.lastElementChild).open = "click";
365
+ }
366
+ get updateComplete() {
367
+ return this.readyPromise;
368
+ }
369
+ }
370
+ customElements.define("scroll-forcer", ScrollForcer);
371
+ export const clickContentClosedOnScroll = (args) => html`
372
+ <div style="margin: 50vh 0 100vh;">
373
+ ${template({
374
+ ...args
375
+ })}
376
+ </div>
377
+ `;
378
+ clickContentClosedOnScroll.decorators = [
379
+ (story) => html`
380
+ <style>
381
+ html,
382
+ body,
383
+ #root,
384
+ #root-inner,
385
+ sp-story-decorator {
386
+ height: auto !important;
387
+ }
388
+ </style>
389
+ ${story()}
390
+ <scroll-forcer></scroll-forcer>
391
+ `
392
+ ];
393
+ class ComplexModalReady extends HTMLElement {
394
+ constructor() {
395
+ super();
396
+ this.handleTriggerOpened = async () => {
397
+ await nextFrame();
398
+ const picker = document.querySelector("#test-picker");
399
+ picker.addEventListener("sp-opened", this.handlePickerOpen);
400
+ picker.open = true;
401
+ };
402
+ this.handlePickerOpen = async () => {
403
+ const picker = document.querySelector("#test-picker");
404
+ const actions = [nextFrame, picker.updateComplete];
405
+ await Promise.all(actions);
406
+ this.ready(true);
407
+ };
408
+ this.readyPromise = Promise.resolve(false);
409
+ this.readyPromise = new Promise((res) => {
410
+ this.ready = res;
411
+ this.setup();
412
+ });
413
+ }
414
+ async setup() {
415
+ await nextFrame();
416
+ const overlay = document.querySelector(
417
+ `overlay-trigger`
418
+ );
419
+ overlay.addEventListener("sp-opened", this.handleTriggerOpened);
420
+ }
421
+ get updateComplete() {
422
+ return this.readyPromise;
423
+ }
424
+ }
425
+ customElements.define("complex-modal-ready", ComplexModalReady);
426
+ const complexModalDecorator = (story) => {
427
+ return html`
428
+ ${story()}
429
+ <complex-modal-ready></complex-modal-ready>
430
+ `;
431
+ };
432
+ export const complexModal = () => {
433
+ return html`
434
+ <style>
435
+ body {
436
+ --swc-margin-test: 10px;
437
+ margin: var(--swc-margin-test);
438
+ }
439
+ sp-story-decorator::part(container) {
440
+ min-height: calc(100vh - (2 * var(--swc-margin-test)));
441
+ padding: 0;
442
+ display: grid;
443
+ place-content: center;
444
+ }
445
+ </style>
446
+ <overlay-trigger type="modal" open="click">
447
+ <sp-dialog-wrapper
448
+ slot="click-content"
449
+ headline="Dialog title"
450
+ dismissable
451
+ underlay
452
+ footer="Content for footer"
453
+ >
454
+ <sp-field-label for="test-picker">
455
+ Selection type:
456
+ </sp-field-label>
457
+ <sp-picker id="test-picker">
458
+ <sp-menu-item>Deselect</sp-menu-item>
459
+ <sp-menu-item>Select inverse</sp-menu-item>
460
+ <sp-menu-item>Feather...</sp-menu-item>
461
+ <sp-menu-item>Select and mask...</sp-menu-item>
462
+ <sp-menu-divider></sp-menu-divider>
463
+ <sp-menu-item>Save selection</sp-menu-item>
464
+ <sp-menu-item disabled>Make work path</sp-menu-item>
465
+ </sp-picker>
466
+ </sp-dialog-wrapper>
467
+ <sp-button slot="trigger" variant="primary">
468
+ Toggle Dialog
469
+ </sp-button>
470
+ </overlay-trigger>
471
+ `;
472
+ };
473
+ complexModal.decorators = [complexModalDecorator];
474
+ export const customizedClickContent = (args) => html`
475
+ <style>
476
+ sp-popover {
477
+ --styled-div-background-color: var(
478
+ --spectrum-accent-background-color-default
479
+ );
480
+ --mod-button-background-color-default: rebeccapurple;
481
+ }
482
+ </style>
483
+ ${template({
484
+ ...args,
485
+ open: "click"
486
+ })}
487
+ `;
488
+ export const deep = () => html`
489
+ <overlay-trigger>
490
+ <sp-button variant="primary" slot="trigger">
491
+ Open popover 1 with buttons + selfmanaged Tooltips
492
+ </sp-button>
493
+ <sp-popover slot="click-content" direction="bottom" tip>
494
+ <sp-dialog size="s" no-divider>
495
+ <sp-action-button>
496
+ <sp-tooltip self-managed placement="bottom">
497
+ My Tooltip 1
498
+ </sp-tooltip>
499
+ A
500
+ </sp-action-button>
501
+ <sp-action-button>
502
+ <sp-tooltip self-managed placement="bottom">
503
+ My Tooltip 1
504
+ </sp-tooltip>
505
+ B
506
+ </sp-action-button>
507
+ </sp-dialog>
508
+ </sp-popover>
509
+ </overlay-trigger>
510
+
511
+ <overlay-trigger>
512
+ <sp-button variant="primary" slot="trigger">
513
+ Open popover 2 with buttons without ToolTips
514
+ </sp-button>
515
+ <sp-popover slot="click-content" direction="bottom" tip>
516
+ <sp-dialog size="s" no-divider>
517
+ <sp-action-button>X</sp-action-button>
518
+ <sp-action-button>Y</sp-action-button>
519
+ </sp-dialog>
520
+ </sp-popover>
521
+ </overlay-trigger>
522
+ `;
523
+ deep.swc_vrt = {
524
+ skip: true
525
+ };
526
+ deep.parameters = {
527
+ // Disables Chromatic's snapshotting on a global level
528
+ chromatic: { disableSnapshot: true }
529
+ };
530
+ export const deepChildTooltip = () => html`
531
+ <overlay-trigger>
532
+ <sp-button variant="primary" slot="trigger">Open popover</sp-button>
533
+ <sp-popover slot="click-content" direction="bottom" tip>
534
+ <sp-dialog no-divider>
535
+ <p>Let us open another overlay here</p>
536
+ <overlay-trigger>
537
+ <sp-button variant="primary" slot="trigger">
538
+ Open sub popover
539
+ </sp-button>
540
+ <sp-popover slot="click-content" direction="bottom" tip>
541
+ <sp-dialog no-divider>
542
+ <p>
543
+ Render an action button with tooltips. Clicking
544
+ the action button shouldn't close everything
545
+ </p>
546
+ <sp-action-button>
547
+ Button with self-managed tooltip
548
+ <sp-tooltip self-managed placement="top">
549
+ Deep Child ToolTip
550
+ </sp-tooltip>
551
+ </sp-action-button>
552
+ <sp-action-button>Just a button</sp-action-button>
553
+ </sp-dialog>
554
+ </sp-popover>
555
+ </overlay-trigger>
556
+ </sp-dialog>
557
+ </sp-popover>
558
+ </overlay-trigger>
559
+ `;
560
+ export const deepNesting = () => {
561
+ const color = window.__swc_hack_knobs__.defaultColor;
562
+ const outter = color === "light" ? "dark" : "light";
563
+ return html`
564
+ ${storyStyles}
565
+ <sp-theme
566
+ color=${outter}
567
+ system=${window.__swc_hack_knobs__.defaultSystemVariant}
568
+ scale=${window.__swc_hack_knobs__.defaultScale}
569
+ dir=${window.__swc_hack_knobs__.defaultDirection}
570
+ >
571
+ <sp-theme
572
+ color=${color}
573
+ system=${window.__swc_hack_knobs__.defaultSystemVariant}
574
+ scale=${window.__swc_hack_knobs__.defaultScale}
575
+ dir=${window.__swc_hack_knobs__.defaultDirection}
576
+ >
577
+ <recursive-popover
578
+ tabindex=""
579
+ style="
580
+ background-color: var(--spectrum-gray-100);
581
+ color: var(--spectrum-gray-800);
582
+ padding: calc(var(--swc-scale-factor) * 22px);
583
+ "
584
+ ></recursive-popover>
585
+ </sp-theme>
586
+ </sp-theme>
587
+ `;
588
+ };
589
+ class DefinedOverlayReady extends HTMLElement {
590
+ constructor() {
591
+ super(...arguments);
592
+ this.handleTriggerOpened = async () => {
593
+ this.overlayElement.removeEventListener(
594
+ "sp-opened",
595
+ this.handleTriggerOpened
596
+ );
597
+ await nextFrame();
598
+ await nextFrame();
599
+ await nextFrame();
600
+ await nextFrame();
601
+ this.popoverElement = document.querySelector(
602
+ "popover-content"
603
+ );
604
+ if (!this.popoverElement) {
605
+ return;
606
+ }
607
+ this.popoverElement.addEventListener(
608
+ "sp-opened",
609
+ this.handlePopoverOpen
610
+ );
611
+ await nextFrame();
612
+ await nextFrame();
613
+ this.popoverElement.button.click();
614
+ };
615
+ this.handlePopoverOpen = async () => {
616
+ await nextFrame();
617
+ this.ready(true);
618
+ };
619
+ this.readyPromise = Promise.resolve(false);
620
+ }
621
+ connectedCallback() {
622
+ if (!!this.ready) return;
623
+ this.readyPromise = new Promise((res) => {
624
+ this.ready = res;
625
+ this.setup();
626
+ });
627
+ }
628
+ async setup() {
629
+ await nextFrame();
630
+ await nextFrame();
631
+ this.overlayElement = document.querySelector(
632
+ `overlay-trigger`
633
+ );
634
+ const button = document.querySelector(
635
+ `[slot="trigger"]`
636
+ );
637
+ this.overlayElement.addEventListener(
638
+ "sp-opened",
639
+ this.handleTriggerOpened
640
+ );
641
+ await nextFrame();
642
+ await nextFrame();
643
+ button.click();
644
+ }
645
+ disconnectedCallback() {
646
+ this.overlayElement.removeEventListener(
647
+ "sp-opened",
648
+ this.handleTriggerOpened
649
+ );
650
+ this.popoverElement.removeEventListener(
651
+ "sp-opened",
652
+ this.handlePopoverOpen
653
+ );
654
+ }
655
+ get updateComplete() {
656
+ return this.readyPromise;
657
+ }
658
+ }
659
+ customElements.define("defined-overlay-ready", DefinedOverlayReady);
660
+ const definedOverlayDecorator = (story) => {
661
+ return html`
662
+ ${story()}
663
+ <defined-overlay-ready></defined-overlay-ready>
664
+ `;
665
+ };
666
+ export const definedOverlayElement = () => {
667
+ return html`
668
+ <overlay-trigger placement="bottom" type="modal">
669
+ <sp-button variant="primary" slot="trigger">Open popover</sp-button>
670
+ <sp-popover slot="click-content" direction="bottom">
671
+ <sp-dialog no-divider>
672
+ <popover-content></popover-content>
673
+ </sp-dialog>
674
+ </sp-popover>
675
+ </overlay-trigger>
676
+ `;
677
+ };
678
+ definedOverlayElement.decorators = [definedOverlayDecorator];
679
+ export const detachedElement = () => {
680
+ let overlay;
681
+ const openDetachedOverlayContent = async ({
682
+ target
683
+ }) => {
684
+ if (overlay) {
685
+ overlay.open = false;
686
+ overlay = void 0;
687
+ return;
688
+ }
689
+ const div = document.createElement("div");
690
+ div.open = false;
691
+ div.textContent = "This div is overlaid";
692
+ div.setAttribute(
693
+ "style",
694
+ `
695
+ background-color: var(--spectrum-gray-50);
696
+ color: var(--spectrum-gray-800);
697
+ border: 1px solid;
698
+ padding: 2em;
699
+ `
700
+ );
701
+ overlay = await Overlay.open(div, {
702
+ type: "auto",
703
+ trigger: target,
704
+ receivesFocus: "auto",
705
+ placement: "bottom",
706
+ offset: 0
707
+ });
708
+ overlay.addEventListener("sp-closed", () => {
709
+ overlay = void 0;
710
+ });
711
+ target.insertAdjacentElement("afterend", overlay);
712
+ };
713
+ requestAnimationFrame(() => {
714
+ openDetachedOverlayContent({
715
+ target: document.querySelector(
716
+ "#detached-content-trigger"
717
+ )
718
+ });
719
+ });
720
+ return html`
721
+ <style>
722
+ sp-overlay div:not([placement]) {
723
+ visibility: hidden;
724
+ }
725
+ </style>
726
+ <sp-action-button
727
+ id="detached-content-trigger"
728
+ @click=${openDetachedOverlayContent}
729
+ >
730
+ <sp-icon-open-in
731
+ slot="icon"
732
+ label="Open in overlay"
733
+ ></sp-icon-open-in>
734
+ </sp-action-button>
735
+ `;
736
+ };
737
+ export const edges = () => {
738
+ return html`
739
+ <style>
740
+ .demo {
741
+ position: absolute;
742
+ }
743
+ .top-left {
744
+ top: 0;
745
+ left: 0;
746
+ }
747
+ .top-right {
748
+ top: 0;
749
+ right: 0;
750
+ }
751
+ .bottom-right {
752
+ bottom: 0;
753
+ right: 0;
754
+ }
755
+ .bottom-left {
756
+ bottom: 0;
757
+ left: 0;
758
+ }
759
+ </style>
760
+ <overlay-trigger class="demo top-left" placement="bottom">
761
+ <sp-button slot="trigger">
762
+ Top/
763
+ <br />
764
+ Left
765
+ </sp-button>
766
+ <sp-tooltip slot="hover-content" delayed tip="bottom">
767
+ Triskaidekaphobia and More
768
+ </sp-tooltip>
769
+ </overlay-trigger>
770
+ <overlay-trigger class="demo top-right" placement="bottom">
771
+ <sp-button slot="trigger">
772
+ Top/
773
+ <br />
774
+ Right
775
+ </sp-button>
776
+ <sp-tooltip slot="hover-content" delayed tip="bottom">
777
+ Triskaidekaphobia and More
778
+ </sp-tooltip>
779
+ </overlay-trigger>
780
+ <overlay-trigger class="demo bottom-left" placement="top">
781
+ <sp-button slot="trigger">
782
+ Bottom/
783
+ <br />
784
+ Left
785
+ </sp-button>
786
+ <sp-tooltip slot="hover-content" delayed tip="top">
787
+ Triskaidekaphobia and More
788
+ </sp-tooltip>
789
+ </overlay-trigger>
790
+ <overlay-trigger placement="top" class="demo bottom-right">
791
+ <sp-button slot="trigger">
792
+ Bottom/
793
+ <br />
794
+ Right
795
+ </sp-button>
796
+ <sp-tooltip slot="hover-content" delayed tip="top">
797
+ Triskaidekaphobia and More
798
+ </sp-tooltip>
799
+ </overlay-trigger>
800
+ `;
801
+ };
802
+ export const inline = () => {
803
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
804
+ return html`
805
+ <overlay-trigger type="inline">
806
+ <sp-button slot="trigger">Open</sp-button>
807
+ <sp-popover slot="click-content">
808
+ <sp-button
809
+ @click=${(event) => {
810
+ event.target.dispatchEvent(closeEvent);
811
+ }}
812
+ >
813
+ Close
814
+ </sp-button>
815
+ </sp-popover>
816
+ </overlay-trigger>
817
+ ${extraText}
818
+ `;
819
+ };
820
+ export const longpress = () => {
821
+ return html`
822
+ <overlay-trigger placement="right-start">
823
+ <sp-action-button slot="trigger" hold-affordance>
824
+ <sp-icon-magnify slot="icon"></sp-icon-magnify>
825
+ </sp-action-button>
826
+ <sp-tooltip slot="hover-content">Search real hard...</sp-tooltip>
827
+ <sp-popover slot="longpress-content" tip>
828
+ <sp-action-group
829
+ @change=${(event) => event.target.dispatchEvent(
830
+ new Event("close", { bubbles: true })
831
+ )}
832
+ selects="single"
833
+ vertical
834
+ style="margin: calc(var(--spectrum-actiongroup-button-gap-y,calc(var(--swc-scale-factor) * 10px)) / 2);"
835
+ >
836
+ <sp-action-button>
837
+ <sp-icon-magnify slot="icon"></sp-icon-magnify>
838
+ </sp-action-button>
839
+ <sp-action-button>
840
+ <sp-icon-magnify slot="icon"></sp-icon-magnify>
841
+ </sp-action-button>
842
+ <sp-action-button>
843
+ <sp-icon-magnify slot="icon"></sp-icon-magnify>
844
+ </sp-action-button>
845
+ </sp-action-group>
846
+ </sp-popover>
847
+ </overlay-trigger>
848
+ `;
849
+ };
850
+ export const modalLoose = () => {
851
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
852
+ return html`
853
+ <overlay-trigger type="modal">
854
+ <sp-button slot="trigger">Open</sp-button>
855
+ <sp-dialog
856
+ size="s"
857
+ dismissable
858
+ slot="click-content"
859
+ @closed=${(event) => event.target.dispatchEvent(closeEvent)}
860
+ >
861
+ <h2 slot="heading">Loose Dialog</h2>
862
+ <p>
863
+ The
864
+ <code>sp-dialog</code>
865
+ element is not "meant" to be a modal alone. In that way it
866
+ does not manage its own
867
+ <code>open</code>
868
+ attribute or outline when it should have
869
+ <code>pointer-events: auto</code>
870
+ . It's a part of this test suite to prove that content in
871
+ this way can be used in an
872
+ <code>overlay-trigger</code>
873
+ element.
874
+ </p>
875
+ </sp-dialog>
876
+ </overlay-trigger>
877
+ ${extraText}
878
+ `;
879
+ };
880
+ export const modalNoFocus = () => {
881
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
882
+ return html`
883
+ <overlay-trigger type="modal" receives-focus="false">
884
+ <sp-button slot="trigger">Open</sp-button>
885
+ <sp-dialog-wrapper
886
+ underlay
887
+ slot="click-content"
888
+ headline="Wrapped Dialog w/ Hero Image"
889
+ size="s"
890
+ >
891
+ <p>
892
+ The
893
+ <code>sp-dialog-wrapper</code>
894
+ element has been prepared for use in an
895
+ <code>overlay-trigger</code>
896
+ element by it's combination of modal, underlay, etc. styles
897
+ and features.
898
+ </p>
899
+ <sp-button-group style="margin-inline-start: auto">
900
+ <sp-button
901
+ data-test-id="dialog-cancel-btn"
902
+ variant="secondary"
903
+ treatment="outline"
904
+ size="l"
905
+ @click=${(event) => event.target.dispatchEvent(closeEvent)}
906
+ >
907
+ ${"Cancel"}
908
+ </sp-button>
909
+ <sp-button
910
+ data-test-id="dialog-override-btn"
911
+ variant="negative"
912
+ size="l"
913
+ @click=${(event) => event.target.dispatchEvent(closeEvent)}
914
+ >
915
+ ${"Override"}
916
+ </sp-button>
917
+ </sp-button-group>
918
+ </sp-dialog-wrapper>
919
+ </overlay-trigger>
920
+ `;
921
+ };
922
+ export const modalManaged = () => {
923
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
924
+ return html`
925
+ <overlay-trigger type="modal">
926
+ <sp-button slot="trigger">Open</sp-button>
927
+ <sp-dialog-wrapper
928
+ underlay
929
+ slot="click-content"
930
+ headline="Wrapped Dialog w/ Hero Image"
931
+ confirm-label="Keep Both"
932
+ secondary-label="Replace"
933
+ cancel-label="Cancel"
934
+ footer="Content for footer"
935
+ @confirm=${(event) => {
936
+ event.target.dispatchEvent(closeEvent);
937
+ }}
938
+ @secondary=${(event) => {
939
+ event.target.dispatchEvent(closeEvent);
940
+ }}
941
+ @cancel=${(event) => {
942
+ event.target.dispatchEvent(closeEvent);
943
+ }}
944
+ >
945
+ <p>
946
+ The
947
+ <code>sp-dialog-wrapper</code>
948
+ element has been prepared for use in an
949
+ <code>overlay-trigger</code>
950
+ element by it's combination of modal, underlay, etc. styles
951
+ and features.
952
+ </p>
953
+ </sp-dialog-wrapper>
954
+ </overlay-trigger>
955
+ ${extraText}
956
+ `;
957
+ };
958
+ export const modalWithinNonModal = () => {
959
+ return html`
960
+ <overlay-trigger type="inline">
961
+ <sp-button variant="primary" slot="trigger">
962
+ Open inline overlay
963
+ </sp-button>
964
+ <sp-popover slot="click-content">
965
+ <sp-dialog size="s" no-divider>
966
+ <overlay-trigger type="modal">
967
+ <sp-button variant="primary" slot="trigger">
968
+ Open modal overlay
969
+ </sp-button>
970
+ <sp-popover slot="click-content">
971
+ <sp-dialog size="s" no-divider>
972
+ Modal overlay
973
+ </sp-dialog>
974
+ </sp-popover>
975
+ </overlay-trigger>
976
+ </sp-dialog>
977
+ </sp-popover>
978
+ </overlay-trigger>
979
+ `;
980
+ };
981
+ export const noCloseOnResize = (args) => html`
982
+ <style>
983
+ sp-button:hover {
984
+ border: 10px solid;
985
+ width: 100px;
986
+ }
987
+ </style>
988
+ ${template({
989
+ ...args,
990
+ open: "click"
991
+ })}
992
+ `;
993
+ noCloseOnResize.swc_vrt = {
994
+ skip: true
995
+ };
996
+ noCloseOnResize.parameters = {
997
+ // Disables Chromatic's snapshotting on a global level
998
+ chromatic: { disableSnapshot: true }
999
+ };
1000
+ export const openClickContent = (args) => template({
1001
+ ...args,
1002
+ open: "click"
1003
+ });
1004
+ export const openHoverContent = (args) => template({
1005
+ ...args,
1006
+ open: "hover"
1007
+ });
1008
+ export const replace = () => {
1009
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
1010
+ return html`
1011
+ <overlay-trigger type="replace">
1012
+ <sp-button slot="trigger">Open</sp-button>
1013
+ <sp-popover slot="click-content">
1014
+ <sp-button
1015
+ @click=${(event) => {
1016
+ event.target.dispatchEvent(closeEvent);
1017
+ }}
1018
+ >
1019
+ Close
1020
+ </sp-button>
1021
+ </sp-popover>
1022
+ </overlay-trigger>
1023
+ ${extraText}
1024
+ `;
1025
+ };
1026
+ export const sideHoverDraggable = () => {
1027
+ return html`
1028
+ ${storyStyles}
1029
+ <style>
1030
+ sp-tooltip {
1031
+ transition: none;
1032
+ }
1033
+ </style>
1034
+ <overlay-drag>
1035
+ <overlay-trigger placement="right">
1036
+ <overlay-target-icon slot="trigger"></overlay-target-icon>
1037
+ <sp-tooltip slot="hover-content" delayed tip="right">
1038
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
1039
+ Vivamus egestas sed enim sed condimentum. Nunc facilisis
1040
+ scelerisque massa sed luctus. Orci varius natoque penatibus
1041
+ et magnis dis parturient montes, nascetur ridiculus mus.
1042
+ Suspendisse sagittis sodales purus vitae ultricies. Integer
1043
+ at dui sem. Sed quam tortor, ornare in nisi et, rhoncus
1044
+ lacinia mauris. Sed vel rutrum mauris, ac pellentesque nibh.
1045
+ Sed feugiat semper libero, sit amet vehicula orci fermentum
1046
+ id. Vivamus imperdiet egestas luctus. Mauris tincidunt
1047
+ malesuada ante, faucibus viverra nunc blandit a. Fusce et
1048
+ nisl nisi. Aenean dictum quam id mollis faucibus. Nulla a
1049
+ ultricies dui. In hac habitasse platea dictumst. Curabitur
1050
+ gravida lobortis vestibulum.
1051
+ </sp-tooltip>
1052
+ </overlay-trigger>
1053
+ </overlay-drag>
1054
+ `;
1055
+ };
1056
+ export const superComplexModal = () => {
1057
+ return html`
1058
+ <overlay-trigger type="modal">
1059
+ <sp-button slot="trigger" variant="accent">Toggle Dialog</sp-button>
1060
+ <sp-popover slot="click-content">
1061
+ <sp-dialog size="s">
1062
+ <overlay-trigger>
1063
+ <sp-button slot="trigger" variant="primary">
1064
+ Toggle Dialog
1065
+ </sp-button>
1066
+ <sp-popover slot="click-content">
1067
+ <sp-dialog size="s" no-divider>
1068
+ <overlay-trigger type="modal">
1069
+ <sp-button
1070
+ slot="trigger"
1071
+ variant="secondary"
1072
+ >
1073
+ Toggle Dialog
1074
+ </sp-button>
1075
+ <sp-popover slot="click-content">
1076
+ <sp-dialog size="s" no-divider>
1077
+ <p>
1078
+ When you get this deep, this
1079
+ ActiveOverlay should be the only
1080
+ one in [slot="open"].
1081
+ </p>
1082
+ <p>
1083
+ All of the rest of the
1084
+ ActiveOverlay elements should
1085
+ have had their [slot] attribute
1086
+ removed.
1087
+ </p>
1088
+ <p>
1089
+ Closing this ActiveOverlay
1090
+ should replace them...
1091
+ </p>
1092
+ </sp-dialog>
1093
+ </sp-popover>
1094
+ </overlay-trigger>
1095
+ </sp-dialog>
1096
+ </sp-popover>
1097
+ </overlay-trigger>
1098
+ </sp-dialog>
1099
+ </sp-popover>
1100
+ </overlay-trigger>
1101
+ `;
1102
+ };
1103
+ export const updated = () => {
1104
+ return html`
1105
+ ${storyStyles}
1106
+ <style>
1107
+ sp-tooltip {
1108
+ transition: none;
1109
+ }
1110
+ </style>
1111
+ <overlay-drag>
1112
+ <overlay-trigger class="demo top-left" placement="bottom">
1113
+ <overlay-target-icon
1114
+ slot="trigger"
1115
+ style="translate(400px, 300px)"
1116
+ ></overlay-target-icon>
1117
+ <sp-tooltip slot="hover-content" delayed tip="bottom">
1118
+ Click to open popover
1119
+ </sp-tooltip>
1120
+ <sp-popover slot="click-content" position="bottom" tip>
1121
+ <sp-dialog size="s" no-divider>
1122
+ <sp-slider
1123
+ value="5"
1124
+ step="0.5"
1125
+ min="0"
1126
+ max="20"
1127
+ label="Awesomeness"
1128
+ ></sp-slider>
1129
+ <div id="styled-div">
1130
+ The background of this div should be blue
1131
+ </div>
1132
+ <overlay-trigger id="inner-trigger" placement="bottom">
1133
+ <sp-button slot="trigger">Press Me</sp-button>
1134
+ <sp-popover
1135
+ slot="click-content"
1136
+ placement="bottom"
1137
+ tip
1138
+ >
1139
+ <sp-dialog size="s" no-divider>
1140
+ Another Popover
1141
+ </sp-dialog>
1142
+ </sp-popover>
1143
+
1144
+ <sp-tooltip
1145
+ slot="hover-content"
1146
+ delayed
1147
+ tip="bottom"
1148
+ >
1149
+ Click to open another popover.
1150
+ </sp-tooltip>
1151
+ </overlay-trigger>
1152
+ </sp-dialog>
1153
+ </sp-popover>
1154
+ </overlay-trigger>
1155
+ </overlay-drag>
1156
+ `;
1157
+ };
1158
+ export const updating = () => {
1159
+ const update = () => {
1160
+ const button = document.querySelector('[slot="trigger"]');
1161
+ button.style.left = `${Math.floor(Math.random() * 200)}px`;
1162
+ button.style.top = `${Math.floor(Math.random() * 200)}px`;
1163
+ button.style.position = "fixed";
1164
+ };
1165
+ return html`
1166
+ <overlay-trigger type="click">
1167
+ <sp-button variant="primary" slot="trigger">
1168
+ Open inline overlay
1169
+ </sp-button>
1170
+ <sp-popover slot="click-content">
1171
+ <sp-dialog size="s" no-divider>
1172
+ <sp-button variant="primary" @click=${update}>
1173
+ Update trigger location.
1174
+ </sp-button>
1175
+ </sp-dialog>
1176
+ </sp-popover>
1177
+ </overlay-trigger>
1178
+ `;
1179
+ };
1180
+ updating.swc_vrt = {
1181
+ skip: true
1182
+ };
1183
+ updating.parameters = {
1184
+ // Disables Chromatic's snapshotting on a global level
1185
+ chromatic: { disableSnapshot: true }
1186
+ };
1187
+ class StartEndContextmenu extends HTMLElement {
1188
+ constructor() {
1189
+ super();
1190
+ this.attachShadow({ mode: "open" });
1191
+ this.shadowRoot.innerHTML = `
1192
+ <style>
1193
+ :host {
1194
+ display: flex;
1195
+ align-items: stretch;
1196
+ }
1197
+ div {
1198
+ width: 50%;
1199
+ height: 100%;
1200
+ }
1201
+ </style>
1202
+ <div id="start"></div>
1203
+ <div id="end"></div>
1204
+ `;
1205
+ }
1206
+ }
1207
+ customElements.define("start-end-contextmenu", StartEndContextmenu);
1208
+ export const virtualElementV1 = (args) => {
1209
+ const contextMenuTemplate = (kind = "") => html`
1210
+ <sp-popover
1211
+ style="width:300px;"
1212
+ @click=${(event) => {
1213
+ var _a;
1214
+ if (event.target.localName === "sp-menu-item") {
1215
+ (_a = event.target) == null ? void 0 : _a.dispatchEvent(
1216
+ new Event("close", { bubbles: true })
1217
+ );
1218
+ }
1219
+ }}
1220
+ >
1221
+ <sp-menu>
1222
+ <sp-menu-group>
1223
+ <span slot="header">Menu source: ${kind}</span>
1224
+ <sp-menu-item>Deselect</sp-menu-item>
1225
+ <sp-menu-item>Select inverse</sp-menu-item>
1226
+ <sp-menu-item>Feather...</sp-menu-item>
1227
+ <sp-menu-item>Select and mask...</sp-menu-item>
1228
+ <sp-menu-divider></sp-menu-divider>
1229
+ <sp-menu-item>Save selection</sp-menu-item>
1230
+ <sp-menu-item disabled>Make work path</sp-menu-item>
1231
+ </sp-menu-group>
1232
+ </sp-menu>
1233
+ </sp-popover>
1234
+ `;
1235
+ const handleContextmenu = async (event) => {
1236
+ event.preventDefault();
1237
+ event.stopPropagation();
1238
+ const source = event.composedPath()[0];
1239
+ const { id } = source;
1240
+ const trigger = event.target;
1241
+ const virtualTrigger = new VirtualTrigger(event.clientX, event.clientY);
1242
+ const fragment = document.createDocumentFragment();
1243
+ render(contextMenuTemplate(id), fragment);
1244
+ const popover = fragment.querySelector("sp-popover");
1245
+ openOverlay(trigger, "click", popover, {
1246
+ placement: args.placement,
1247
+ receivesFocus: "auto",
1248
+ virtualTrigger,
1249
+ offset: 0,
1250
+ notImmediatelyClosable: true
1251
+ });
1252
+ };
1253
+ return html`
1254
+ <style>
1255
+ .app-root {
1256
+ position: absolute;
1257
+ inset: 0;
1258
+ }
1259
+ </style>
1260
+ <start-end-contextmenu
1261
+ class="app-root"
1262
+ @contextmenu=${{
1263
+ capture: true,
1264
+ handleEvent: handleContextmenu
1265
+ }}
1266
+ ></start-end-contextmenu>
1267
+ `;
1268
+ };
1269
+ virtualElementV1.args = {
1270
+ placement: "right-start"
1271
+ };
1272
+ export const virtualElement = (args) => {
1273
+ const contextMenuTemplate = (kind = "") => html`
1274
+ <sp-popover
1275
+ style="width:300px;"
1276
+ @click=${(event) => {
1277
+ var _a;
1278
+ if (event.target.localName === "sp-menu-item") {
1279
+ (_a = event.target) == null ? void 0 : _a.dispatchEvent(
1280
+ new Event("close", { bubbles: true })
1281
+ );
1282
+ }
1283
+ }}
1284
+ >
1285
+ <sp-menu>
1286
+ <sp-menu-group>
1287
+ <span slot="header">Menu source: ${kind}</span>
1288
+ <sp-menu-item>Deselect</sp-menu-item>
1289
+ <sp-menu-item>Select inverse</sp-menu-item>
1290
+ <sp-menu-item>Feather...</sp-menu-item>
1291
+ <sp-menu-item>Select and mask...</sp-menu-item>
1292
+ <sp-menu-divider></sp-menu-divider>
1293
+ <sp-menu-item>Save selection</sp-menu-item>
1294
+ <sp-menu-item disabled>Make work path</sp-menu-item>
1295
+ </sp-menu-group>
1296
+ </sp-menu>
1297
+ </sp-popover>
1298
+ `;
1299
+ const handleContextmenu = async (event) => {
1300
+ event.preventDefault();
1301
+ event.stopPropagation();
1302
+ const source = event.composedPath()[0];
1303
+ const { id } = source;
1304
+ const trigger = event.target;
1305
+ const virtualTrigger = new VirtualTrigger(event.clientX, event.clientY);
1306
+ const fragment = document.createDocumentFragment();
1307
+ render(contextMenuTemplate(id), fragment);
1308
+ const popover = fragment.querySelector("sp-popover");
1309
+ const overlay = await openOverlay(popover, {
1310
+ trigger: virtualTrigger,
1311
+ placement: args.placement,
1312
+ offset: 0,
1313
+ notImmediatelyClosable: true,
1314
+ type: "auto"
1315
+ });
1316
+ trigger.insertAdjacentElement("afterend", overlay);
1317
+ };
1318
+ return html`
1319
+ <style>
1320
+ .app-root {
1321
+ position: absolute;
1322
+ inset: 0;
1323
+ }
1324
+ </style>
1325
+ <start-end-contextmenu
1326
+ class="app-root"
1327
+ @contextmenu=${{
1328
+ capture: true,
1329
+ handleEvent: handleContextmenu
1330
+ }}
1331
+ ></start-end-contextmenu>
1332
+ `;
1333
+ };
1334
+ virtualElement.args = {
1335
+ placement: "right-start"
1336
+ };
1337
+ export const virtualElementDeclaratively = (args) => {
1338
+ const handleContextmenu = async (event) => {
1339
+ event.preventDefault();
1340
+ event.stopPropagation();
1341
+ const overlay2 = document.querySelector(
1342
+ "sp-overlay:not([open])"
1343
+ );
1344
+ if (overlay2.triggerElement instanceof VirtualTrigger) {
1345
+ overlay2.triggerElement.updateBoundingClientRect(
1346
+ event.clientX,
1347
+ event.clientY
1348
+ );
1349
+ }
1350
+ overlay2.willPreventClose = true;
1351
+ overlay2.open = true;
1352
+ };
1353
+ const overlay = () => html`
1354
+ <sp-overlay
1355
+ offset="0"
1356
+ type="auto"
1357
+ placement=${args.placement}
1358
+ .triggerElement=${new VirtualTrigger(0, 0)}
1359
+ >
1360
+ <sp-popover
1361
+ style="width:300px;"
1362
+ @change=${(event) => {
1363
+ var _a;
1364
+ (_a = event.target) == null ? void 0 : _a.dispatchEvent(
1365
+ new Event("close", { bubbles: true })
1366
+ );
1367
+ }}
1368
+ >
1369
+ <sp-menu>
1370
+ <sp-menu-group>
1371
+ <span slot="header">Menu</span>
1372
+ <sp-menu-item>Deselect</sp-menu-item>
1373
+ <sp-menu-item>Select inverse</sp-menu-item>
1374
+ <sp-menu-item>Feather...</sp-menu-item>
1375
+ <sp-menu-item>Select and mask...</sp-menu-item>
1376
+ <sp-menu-divider></sp-menu-divider>
1377
+ <sp-menu-item>Save selection</sp-menu-item>
1378
+ <sp-menu-item disabled>Make work path</sp-menu-item>
1379
+ </sp-menu-group>
1380
+ </sp-menu>
1381
+ </sp-popover>
1382
+ </sp-overlay>
1383
+ `;
1384
+ return html`
1385
+ <style>
1386
+ .app-root {
1387
+ position: absolute;
1388
+ inset: 0;
1389
+ }
1390
+ </style>
1391
+ <div
1392
+ class="app-root"
1393
+ @contextmenu=${{
1394
+ capture: true,
1395
+ handleEvent: handleContextmenu
1396
+ }}
1397
+ >
1398
+ ${overlay()} ${overlay()}
1399
+ </div>
1400
+ `;
1401
+ };
1402
+ virtualElementDeclaratively.args = {
1403
+ placement: "right-start"
1404
+ };
1405
+ virtualElementDeclaratively.swc_vrt = {
1406
+ skip: true
1407
+ };
1408
+ virtualElementDeclaratively.parameters = {
1409
+ // Disables Chromatic's snapshotting on a global level
1410
+ chromatic: { disableSnapshot: true }
1411
+ };
1412
+ //# sourceMappingURL=overlay.stories.js.map