@spectrum-web-components/overlay 0.35.1-rc.41 → 0.36.0

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