@spectrum-web-components/overlay 0.34.1-rc.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +152 -227
  2. package/active-overlay.d.ts +6 -0
  3. package/active-overlay.dev.js +5 -0
  4. package/{sp-overlay.dev.js.map → active-overlay.dev.js.map} +3 -3
  5. package/active-overlay.js +2 -0
  6. package/{sp-overlay.js.map → active-overlay.js.map} +4 -4
  7. package/custom-elements.json +529 -1389
  8. package/package.json +22 -48
  9. package/src/ActiveOverlay.d.ts +84 -0
  10. package/src/ActiveOverlay.dev.js +517 -0
  11. package/src/ActiveOverlay.dev.js.map +7 -0
  12. package/src/ActiveOverlay.js +16 -0
  13. package/src/ActiveOverlay.js.map +7 -0
  14. package/src/OverlayTrigger.d.ts +31 -23
  15. package/src/OverlayTrigger.dev.js +245 -135
  16. package/src/OverlayTrigger.dev.js.map +3 -3
  17. package/src/OverlayTrigger.js +22 -52
  18. package/src/OverlayTrigger.js.map +3 -3
  19. package/src/VirtualTrigger.dev.js +2 -0
  20. package/src/VirtualTrigger.dev.js.map +2 -2
  21. package/src/VirtualTrigger.js +1 -1
  22. package/src/VirtualTrigger.js.map +3 -3
  23. package/src/active-overlay.css.dev.js +13 -0
  24. package/src/active-overlay.css.dev.js.map +7 -0
  25. package/src/active-overlay.css.js +10 -0
  26. package/src/active-overlay.css.js.map +7 -0
  27. package/src/index.d.ts +3 -2
  28. package/src/index.dev.js +3 -2
  29. package/src/index.dev.js.map +2 -2
  30. package/src/index.js +1 -1
  31. package/src/index.js.map +2 -2
  32. package/src/loader.d.ts +2 -2
  33. package/src/loader.dev.js +19 -2
  34. package/src/loader.dev.js.map +2 -2
  35. package/src/loader.js +1 -1
  36. package/src/loader.js.map +3 -3
  37. package/src/overlay-stack.d.ts +50 -0
  38. package/src/overlay-stack.dev.js +515 -0
  39. package/src/overlay-stack.dev.js.map +7 -0
  40. package/src/overlay-stack.js +34 -0
  41. package/src/overlay-stack.js.map +7 -0
  42. package/src/overlay-trigger.css.dev.js +1 -1
  43. package/src/overlay-trigger.css.dev.js.map +1 -1
  44. package/src/overlay-trigger.css.js +1 -1
  45. package/src/overlay-trigger.css.js.map +1 -1
  46. package/src/overlay-types.d.ts +5 -7
  47. package/src/overlay-types.dev.js +0 -1
  48. package/src/overlay-types.dev.js.map +3 -3
  49. package/src/overlay-types.js +1 -1
  50. package/src/overlay-types.js.map +3 -3
  51. package/src/overlay-utils.d.ts +3 -0
  52. package/src/overlay-utils.dev.js +31 -0
  53. package/src/overlay-utils.dev.js.map +7 -0
  54. package/src/overlay-utils.js +2 -0
  55. package/src/overlay-utils.js.map +7 -0
  56. package/src/overlay.d.ts +59 -0
  57. package/src/overlay.dev.js +127 -0
  58. package/src/overlay.dev.js.map +7 -0
  59. package/src/overlay.js +2 -0
  60. package/src/overlay.js.map +7 -0
  61. package/stories/overlay-story-components.js +8 -9
  62. package/stories/overlay-story-components.js.map +2 -2
  63. package/stories/overlay.stories.js +702 -799
  64. package/stories/overlay.stories.js.map +2 -2
  65. package/sync/overlay-trigger.d.ts +0 -4
  66. package/sync/overlay-trigger.dev.js +4 -1
  67. package/sync/overlay-trigger.dev.js.map +2 -2
  68. package/sync/overlay-trigger.js +1 -1
  69. package/sync/overlay-trigger.js.map +3 -3
  70. package/test/benchmark/basic-test.js +1 -1
  71. package/test/benchmark/basic-test.js.map +1 -1
  72. package/test/index.js +376 -407
  73. package/test/index.js.map +3 -3
  74. package/test/overlay-lifecycle.test.js +106 -34
  75. package/test/overlay-lifecycle.test.js.map +2 -2
  76. package/test/overlay-trigger-click.test.js +5 -11
  77. package/test/overlay-trigger-click.test.js.map +2 -2
  78. package/test/overlay-trigger-extended.test.js +6 -1
  79. package/test/overlay-trigger-extended.test.js.map +2 -2
  80. package/test/overlay-trigger-hover-click.test.js +23 -23
  81. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  82. package/test/overlay-trigger-hover.test.js +34 -40
  83. package/test/overlay-trigger-hover.test.js.map +2 -2
  84. package/test/overlay-trigger-longpress.test.js +80 -98
  85. package/test/overlay-trigger-longpress.test.js.map +2 -2
  86. package/test/overlay-trigger-sync.test.js +1 -1
  87. package/test/overlay-trigger-sync.test.js.map +2 -2
  88. package/test/overlay-trigger.test.js +1 -1
  89. package/test/overlay-trigger.test.js.map +2 -2
  90. package/test/overlay-update.test.js +4 -4
  91. package/test/overlay-update.test.js.map +2 -2
  92. package/test/{overlay-v1.test.js → overlay.test.js} +249 -267
  93. package/test/overlay.test.js.map +7 -0
  94. package/sp-overlay.d.ts +0 -6
  95. package/sp-overlay.dev.js +0 -5
  96. package/sp-overlay.js +0 -2
  97. package/src/Overlay.d.ts +0 -29
  98. package/src/Overlay.dev.js +0 -91
  99. package/src/Overlay.dev.js.map +0 -7
  100. package/src/Overlay.js +0 -2
  101. package/src/Overlay.js.map +0 -7
  102. package/src/OverlayBase.d.ts +0 -124
  103. package/src/OverlayBase.dev.js +0 -744
  104. package/src/OverlayBase.dev.js.map +0 -7
  105. package/src/OverlayBase.js +0 -31
  106. package/src/OverlayBase.js.map +0 -7
  107. package/src/OverlayDialog.d.ts +0 -8
  108. package/src/OverlayDialog.dev.js +0 -160
  109. package/src/OverlayDialog.dev.js.map +0 -7
  110. package/src/OverlayDialog.js +0 -2
  111. package/src/OverlayDialog.js.map +0 -7
  112. package/src/OverlayNoPopover.d.ts +0 -8
  113. package/src/OverlayNoPopover.dev.js +0 -149
  114. package/src/OverlayNoPopover.dev.js.map +0 -7
  115. package/src/OverlayNoPopover.js +0 -2
  116. package/src/OverlayNoPopover.js.map +0 -7
  117. package/src/OverlayPopover.d.ts +0 -8
  118. package/src/OverlayPopover.dev.js +0 -199
  119. package/src/OverlayPopover.dev.js.map +0 -7
  120. package/src/OverlayPopover.js +0 -2
  121. package/src/OverlayPopover.js.map +0 -7
  122. package/src/OverlayStack.d.ts +0 -29
  123. package/src/OverlayStack.dev.js +0 -126
  124. package/src/OverlayStack.dev.js.map +0 -7
  125. package/src/OverlayStack.js +0 -2
  126. package/src/OverlayStack.js.map +0 -7
  127. package/src/PlacementController.d.ts +0 -36
  128. package/src/PlacementController.dev.js +0 -191
  129. package/src/PlacementController.dev.js.map +0 -7
  130. package/src/PlacementController.js +0 -2
  131. package/src/PlacementController.js.map +0 -7
  132. package/src/fullSizePlugin.d.ts +0 -12
  133. package/src/fullSizePlugin.dev.js +0 -39
  134. package/src/fullSizePlugin.dev.js.map +0 -7
  135. package/src/fullSizePlugin.js +0 -2
  136. package/src/fullSizePlugin.js.map +0 -7
  137. package/src/overlay-base.css.dev.js +0 -9
  138. package/src/overlay-base.css.dev.js.map +0 -7
  139. package/src/overlay-base.css.js +0 -6
  140. package/src/overlay-base.css.js.map +0 -7
  141. package/src/topLayerOverTransforms.d.ts +0 -23
  142. package/src/topLayerOverTransforms.dev.js +0 -170
  143. package/src/topLayerOverTransforms.dev.js.map +0 -7
  144. package/src/topLayerOverTransforms.js +0 -2
  145. package/src/topLayerOverTransforms.js.map +0 -7
  146. package/stories/overlay-element.stories.js +0 -247
  147. package/stories/overlay-element.stories.js.map +0 -7
  148. package/test/overlay-element.test-vrt.js +0 -5
  149. package/test/overlay-element.test-vrt.js.map +0 -7
  150. package/test/overlay-element.test.js +0 -682
  151. package/test/overlay-element.test.js.map +0 -7
  152. package/test/overlay-v1.test.js.map +0 -7
  153. package/test/overlay-v2.test.js +0 -720
  154. package/test/overlay-v2.test.js.map +0 -7
  155. /package/src/{overlay-base.css.d.ts → active-overlay.css.d.ts} +0 -0
@@ -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-divder>
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-divder>
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();
212
+ await nextFrame();
213
+ await nextFrame();
214
+ await nextFrame();
215
+ if (document.scrollingElement) {
216
+ document.scrollingElement.scrollTop = 100;
217
+ }
339
218
  await nextFrame();
340
219
  await nextFrame();
341
- ((_b = this.previousElementSibling) == null ? void 0 : _b.lastElementChild).open = "click";
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,148 +247,97 @@ 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" placement="none" 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-divder>
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">
509
- My Tooltip 1
510
- </sp-tooltip>
511
- B
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">
338
+ My Tooltip 1
339
+ </sp-tooltip>
340
+ B
512
341
  </sp-action-button>
513
342
  </sp-dialog>
514
343
  </sp-popover>
@@ -518,8 +347,8 @@ 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>
522
- <sp-dialog size="s" no-divder>
350
+ <sp-popover slot="click-content" direction="bottom" tip open>
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>
525
354
  </sp-dialog>
@@ -529,6 +358,72 @@ export const deep = () => html`
529
358
  deep.swc_vrt = {
530
359
  skip: true
531
360
  };
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>
386
+ </sp-dialog>
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
+ };
532
427
  export const deepNesting = () => {
533
428
  const color = window.__swc_hack_knobs__.defaultColor;
534
429
  const outter = color === "light" ? "dark" : "light";
@@ -558,140 +453,6 @@ export const deepNesting = () => {
558
453
  </sp-theme>
559
454
  `;
560
455
  };
561
- class DefinedOverlayReady extends HTMLElement {
562
- constructor() {
563
- super(...arguments);
564
- this.handleTriggerOpened = async () => {
565
- this.overlay.removeEventListener("sp-opened", this.handleTriggerOpened);
566
- await nextFrame();
567
- await nextFrame();
568
- await nextFrame();
569
- await nextFrame();
570
- this.popover = document.querySelector(
571
- "popover-content"
572
- );
573
- if (!this.popover) {
574
- return;
575
- }
576
- this.popover.addEventListener("sp-opened", this.handlePopoverOpen);
577
- await nextFrame();
578
- await nextFrame();
579
- this.popover.button.click();
580
- };
581
- this.handlePopoverOpen = async () => {
582
- await nextFrame();
583
- this.ready(true);
584
- };
585
- this.readyPromise = Promise.resolve(false);
586
- }
587
- connectedCallback() {
588
- if (!!this.ready)
589
- return;
590
- this.readyPromise = new Promise((res) => {
591
- this.ready = res;
592
- this.setup();
593
- });
594
- }
595
- async setup() {
596
- await nextFrame();
597
- await nextFrame();
598
- this.overlay = document.querySelector(
599
- `overlay-trigger`
600
- );
601
- const button = document.querySelector(
602
- `[slot="trigger"]`
603
- );
604
- this.overlay.addEventListener("sp-opened", this.handleTriggerOpened);
605
- await nextFrame();
606
- await nextFrame();
607
- button.click();
608
- }
609
- disconnectedCallback() {
610
- this.overlay.removeEventListener("sp-opened", this.handleTriggerOpened);
611
- this.popover.removeEventListener("sp-opened", this.handlePopoverOpen);
612
- }
613
- get updateComplete() {
614
- return this.readyPromise;
615
- }
616
- }
617
- customElements.define("defined-overlay-ready", DefinedOverlayReady);
618
- const definedOverlayDecorator = (story) => {
619
- return html`
620
- ${story()}
621
- <defined-overlay-ready></defined-overlay-ready>
622
- `;
623
- };
624
- export const definedOverlayElement = () => {
625
- return html`
626
- <overlay-trigger placement="bottom" type="modal">
627
- <sp-button variant="primary" slot="trigger">Open popover</sp-button>
628
- <sp-popover slot="click-content" direction="bottom">
629
- <sp-dialog no-divder>
630
- <popover-content></popover-content>
631
- </sp-dialog>
632
- </sp-popover>
633
- </overlay-trigger>
634
- `;
635
- };
636
- definedOverlayElement.decorators = [definedOverlayDecorator];
637
- export const detachedElement = () => {
638
- let overlay;
639
- const openDetachedOverlayContent = async ({
640
- target
641
- }) => {
642
- if (overlay) {
643
- overlay.open = false;
644
- overlay = void 0;
645
- return;
646
- }
647
- const div = document.createElement("div");
648
- div.open = false;
649
- div.textContent = "This div is overlaid";
650
- div.setAttribute(
651
- "style",
652
- `
653
- background-color: var(--spectrum-global-color-gray-50);
654
- color: var(--spectrum-global-color-gray-800);
655
- border: 1px solid;
656
- padding: 2em;
657
- `
658
- );
659
- overlay = await Overlay.open(div, {
660
- type: "auto",
661
- trigger: target,
662
- receivesFocus: "auto",
663
- placement: "bottom",
664
- offset: 0
665
- });
666
- overlay.addEventListener("sp-closed", () => {
667
- overlay = void 0;
668
- });
669
- target.insertAdjacentElement("afterend", overlay);
670
- };
671
- requestAnimationFrame(() => {
672
- openDetachedOverlayContent({
673
- target: document.querySelector(
674
- "#detached-content-trigger"
675
- )
676
- });
677
- });
678
- return html`
679
- <style>
680
- sp-overlay div:not([placement]) {
681
- visibility: hidden;
682
- }
683
- </style>
684
- <sp-action-button
685
- id="detached-content-trigger"
686
- @click=${openDetachedOverlayContent}
687
- >
688
- <sp-icon-open-in
689
- slot="icon"
690
- label="Open in overlay"
691
- ></sp-icon-open-in>
692
- </sp-action-button>
693
- `;
694
- };
695
456
  export const edges = () => {
696
457
  return html`
697
458
  <style>
@@ -721,7 +482,7 @@ export const edges = () => {
721
482
  <br />
722
483
  Left
723
484
  </sp-button>
724
- <sp-tooltip slot="hover-content" delayed tip="bottom">
485
+ <sp-tooltip slot="hover-content" delayed open tip="bottom">
725
486
  Triskaidekaphobia and More
726
487
  </sp-tooltip>
727
488
  </overlay-trigger>
@@ -731,7 +492,7 @@ export const edges = () => {
731
492
  <br />
732
493
  Right
733
494
  </sp-button>
734
- <sp-tooltip slot="hover-content" delayed tip="bottom">
495
+ <sp-tooltip slot="hover-content" delayed open tip="bottom">
735
496
  Triskaidekaphobia and More
736
497
  </sp-tooltip>
737
498
  </overlay-trigger>
@@ -741,7 +502,7 @@ export const edges = () => {
741
502
  <br />
742
503
  Left
743
504
  </sp-button>
744
- <sp-tooltip slot="hover-content" delayed tip="top">
505
+ <sp-tooltip slot="hover-content" delayed open tip="top">
745
506
  Triskaidekaphobia and More
746
507
  </sp-tooltip>
747
508
  </overlay-trigger>
@@ -751,188 +512,73 @@ export const edges = () => {
751
512
  <br />
752
513
  Right
753
514
  </sp-button>
754
- <sp-tooltip slot="hover-content" delayed tip="top">
515
+ <sp-tooltip slot="hover-content" delayed open tip="top">
755
516
  Triskaidekaphobia and More
756
517
  </sp-tooltip>
757
518
  </overlay-trigger>
758
519
  `;
759
520
  };
760
- export const inline = () => {
761
- const closeEvent = new Event("close", { bubbles: true, composed: true });
762
- return html`
763
- <overlay-trigger type="inline">
764
- <sp-button slot="trigger">Open</sp-button>
765
- <sp-popover slot="click-content">
766
- <sp-button
767
- @click=${(event) => {
768
- event.target.dispatchEvent(closeEvent);
769
- }}
770
- >
771
- Close
772
- </sp-button>
773
- </sp-popover>
774
- </overlay-trigger>
775
- ${extraText}
776
- `;
777
- };
778
- export const longpress = () => {
521
+ export const updated = () => {
779
522
  return html`
780
- <overlay-trigger placement="right-start">
781
- <sp-action-button slot="trigger" hold-affordance>
782
- <sp-icon-magnify slot="icon"></sp-icon-magnify>
783
- </sp-action-button>
784
- <sp-tooltip slot="hover-content">Search real hard...</sp-tooltip>
785
- <sp-popover slot="longpress-content" tip>
786
- <sp-action-group
787
- @change=${(event) => event.target.dispatchEvent(
788
- new Event("close", { bubbles: true })
789
- )}
790
- selects="single"
791
- vertical
792
- style="margin: calc(var(--spectrum-actiongroup-button-gap-y,var(--spectrum-global-dimension-size-100)) / 2);"
793
- >
794
- <sp-action-button>
795
- <sp-icon-magnify slot="icon"></sp-icon-magnify>
796
- </sp-action-button>
797
- <sp-action-button>
798
- <sp-icon-magnify slot="icon"></sp-icon-magnify>
799
- </sp-action-button>
800
- <sp-action-button>
801
- <sp-icon-magnify slot="icon"></sp-icon-magnify>
802
- </sp-action-button>
803
- </sp-action-group>
804
- </sp-popover>
805
- </overlay-trigger>
806
- `;
807
- };
808
- export const modalLoose = () => {
809
- const closeEvent = new Event("close", { bubbles: true, composed: true });
810
- return html`
811
- <overlay-trigger type="modal" placement="none">
812
- <sp-button slot="trigger">Open</sp-button>
813
- <sp-dialog
814
- size="s"
815
- dismissable
816
- slot="click-content"
817
- @closed=${(event) => event.target.dispatchEvent(closeEvent)}
818
- >
819
- <h2 slot="heading">Loose Dialog</h2>
820
- <p>
821
- The
822
- <code>sp-dialog</code>
823
- element is not "meant" to be a modal alone. In that way it
824
- does not manage its own
825
- <code>open</code>
826
- attribute or outline when it should have
827
- <code>pointer-events: auto</code>
828
- . It's a part of this test suite to prove that content in
829
- this way can be used in an
830
- <code>overlay-trigger</code>
831
- element.
832
- </p>
833
- </sp-dialog>
834
- </overlay-trigger>
835
- ${extraText}
836
- `;
837
- };
838
- export const modalManaged = () => {
839
- const closeEvent = new Event("close", { bubbles: true, composed: true });
840
- return html`
841
- <overlay-trigger type="modal" placement="none">
842
- <sp-button slot="trigger">Open</sp-button>
843
- <sp-dialog-wrapper
844
- underlay
845
- slot="click-content"
846
- headline="Wrapped Dialog w/ Hero Image"
847
- confirm-label="Keep Both"
848
- secondary-label="Replace"
849
- cancel-label="Cancel"
850
- footer="Content for footer"
851
- @confirm=${(event) => {
852
- event.target.dispatchEvent(closeEvent);
853
- }}
854
- @secondary=${(event) => {
855
- event.target.dispatchEvent(closeEvent);
856
- }}
857
- @cancel=${(event) => {
858
- event.target.dispatchEvent(closeEvent);
859
- }}
860
- >
861
- <p>
862
- The
863
- <code>sp-dialog-wrapper</code>
864
- element has been prepared for use in an
865
- <code>overlay-trigger</code>
866
- element by it's combination of modal, underlay, etc. styles
867
- and features.
868
- </p>
869
- </sp-dialog-wrapper>
870
- </overlay-trigger>
871
- ${extraText}
872
- `;
873
- };
874
- export const modalWithinNonModal = () => {
875
- return html`
876
- <overlay-trigger type="inline">
877
- <sp-button variant="primary" slot="trigger">
878
- Open inline overlay
879
- </sp-button>
880
- <sp-popover slot="click-content">
881
- <sp-dialog size="s" no-divder>
882
- <overlay-trigger type="modal">
883
- <sp-button variant="primary" slot="trigger">
884
- Open modal overlay
885
- </sp-button>
886
- <sp-popover slot="click-content">
887
- <sp-dialog size="s" no-divder>
888
- Modal overlay
889
- </sp-dialog>
890
- </sp-popover>
891
- </overlay-trigger>
892
- </sp-dialog>
893
- </sp-popover>
894
- </overlay-trigger>
895
- `;
896
- };
897
- export const noCloseOnResize = (args) => html`
898
- <style>
899
- sp-button:hover {
900
- border: 10px solid;
901
- width: 100px;
902
- }
903
- </style>
904
- ${template({
905
- ...args,
906
- open: "click"
907
- })}
908
- `;
909
- noCloseOnResize.swc_vrt = {
910
- skip: true
911
- };
912
- export const openClickContent = (args) => template({
913
- ...args,
914
- open: "click"
915
- });
916
- export const openHoverContent = (args) => template({
917
- ...args,
918
- open: "hover"
919
- });
920
- export const replace = () => {
921
- const closeEvent = new Event("close", { bubbles: true, composed: true });
922
- return html`
923
- <overlay-trigger type="replace">
924
- <sp-button slot="trigger">Open</sp-button>
925
- <sp-popover slot="click-content">
926
- <sp-button
927
- @click=${(event) => {
928
- event.target.dispatchEvent(closeEvent);
929
- }}
930
- >
931
- Close
932
- </sp-button>
933
- </sp-popover>
934
- </overlay-trigger>
935
- ${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>
936
582
  `;
937
583
  };
938
584
  export const sideHoverDraggable = () => {
@@ -965,133 +611,232 @@ export const sideHoverDraggable = () => {
965
611
  </overlay-drag>
966
612
  `;
967
613
  };
968
- export const superComplexModal = () => {
614
+ export const longpress = () => {
969
615
  return html`
970
- <overlay-trigger type="modal" placement="none">
971
- <sp-button slot="trigger" variant="accent">Toggle Dialog</sp-button>
972
- <sp-popover slot="click-content">
973
- <sp-dialog size="s">
974
- <overlay-trigger>
975
- <sp-button slot="trigger" variant="primary">
976
- Toggle Dialog
977
- </sp-button>
978
- <sp-popover slot="click-content">
979
- <sp-dialog size="s" no-divider>
980
- <overlay-trigger type="modal">
981
- <sp-button
982
- slot="trigger"
983
- variant="secondary"
984
- >
985
- Toggle Dialog
986
- </sp-button>
987
- <sp-popover slot="click-content">
988
- <sp-dialog size="s" no-divider>
989
- <p>
990
- When you get this deep, this
991
- ActiveOverlay should be the only
992
- one in [slot="open"].
993
- </p>
994
- <p>
995
- All of the rest of the
996
- ActiveOverlay elements should
997
- have had their [slot] attribute
998
- removed.
999
- </p>
1000
- <p>
1001
- Closing this ActiveOverlay
1002
- should replace them...
1003
- </p>
1004
- </sp-dialog>
1005
- </sp-popover>
1006
- </overlay-trigger>
1007
- </sp-dialog>
1008
- </sp-popover>
1009
- </overlay-trigger>
1010
- </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>
1011
640
  </sp-popover>
1012
641
  </overlay-trigger>
1013
642
  `;
1014
643
  };
1015
- 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 = () => {
1016
723
  return html`
1017
- ${storyStyles}
1018
724
  <style>
1019
- sp-tooltip {
1020
- 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;
1021
763
  }
1022
764
  </style>
1023
- <overlay-drag>
1024
- <overlay-trigger class="demo top-left" placement="bottom">
1025
- <overlay-target-icon
1026
- slot="trigger"
1027
- style="translate(400px, 300px)"
1028
- ></overlay-target-icon>
1029
- <sp-tooltip slot="hover-content" delayed tip="bottom">
1030
- Click to open popover
1031
- </sp-tooltip>
1032
- <sp-popover slot="click-content" position="bottom" tip>
1033
- <sp-dialog size="s" no-divder>
1034
- <sp-slider
1035
- value="5"
1036
- step="0.5"
1037
- min="0"
1038
- max="20"
1039
- label="Awesomeness"
1040
- ></sp-slider>
1041
- <div id="styled-div">
1042
- The background of this div should be blue
1043
- </div>
1044
- <overlay-trigger id="inner-trigger" placement="bottom">
1045
- <sp-button slot="trigger">Press Me</sp-button>
1046
- <sp-popover
1047
- slot="click-content"
1048
- placement="bottom"
1049
- tip
1050
- >
1051
- <sp-dialog size="s" no-divder>
1052
- Another Popover
1053
- </sp-dialog>
1054
- </sp-popover>
1055
-
1056
- <sp-tooltip
1057
- slot="hover-content"
1058
- delayed
1059
- tip="bottom"
1060
- >
1061
- Click to open another popover.
1062
- </sp-tooltip>
1063
- </overlay-trigger>
1064
- </sp-dialog>
1065
- </sp-popover>
1066
- </overlay-trigger>
1067
- </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>
1068
790
  `;
1069
791
  };
1070
- export const updating = () => {
1071
- const update = () => {
1072
- const button = document.querySelector('[slot="trigger"]');
1073
- button.style.left = `${Math.floor(Math.random() * 200)}px`;
1074
- button.style.top = `${Math.floor(Math.random() * 200)}px`;
1075
- button.style.position = "fixed";
1076
- };
792
+ complexModal.decorators = [complexModalDecorator];
793
+ export const superComplexModal = () => {
1077
794
  return html`
1078
- <overlay-trigger type="click">
1079
- <sp-button variant="primary" slot="trigger">
1080
- Open inline overlay
1081
- </sp-button>
795
+ <overlay-trigger type="modal" placement="none">
796
+ <sp-button slot="trigger" variant="accent">Toggle Dialog</sp-button>
1082
797
  <sp-popover slot="click-content">
1083
- <sp-dialog size="s" no-divder>
1084
- <sp-button variant="primary" @click=${update}>
1085
- Update trigger location.
1086
- </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>
1087
835
  </sp-dialog>
1088
836
  </sp-popover>
1089
837
  </overlay-trigger>
1090
838
  `;
1091
839
  };
1092
- updating.swc_vrt = {
1093
- skip: true
1094
- };
1095
840
  class StartEndContextmenu extends HTMLElement {
1096
841
  constructor() {
1097
842
  super();
@@ -1113,17 +858,15 @@ class StartEndContextmenu extends HTMLElement {
1113
858
  }
1114
859
  }
1115
860
  customElements.define("start-end-contextmenu", StartEndContextmenu);
1116
- export const virtualElementV1 = (args) => {
861
+ export const virtualElement = (args) => {
1117
862
  const contextMenuTemplate = (kind = "") => html`
1118
863
  <sp-popover
1119
864
  style="width:300px;"
1120
865
  @click=${(event) => {
1121
866
  var _a;
1122
- if (event.target.localName === "sp-menu-item") {
1123
- (_a = event.target) == null ? void 0 : _a.dispatchEvent(
1124
- new Event("close", { bubbles: true })
1125
- );
1126
- }
867
+ return (_a = event.target) == null ? void 0 : _a.dispatchEvent(
868
+ new Event("close", { bubbles: true })
869
+ );
1127
870
  }}
1128
871
  >
1129
872
  <sp-menu>
@@ -1140,9 +883,8 @@ export const virtualElementV1 = (args) => {
1140
883
  </sp-menu>
1141
884
  </sp-popover>
1142
885
  `;
1143
- const handleContextmenu = async (event) => {
886
+ const pointerenter = async (event) => {
1144
887
  event.preventDefault();
1145
- event.stopPropagation();
1146
888
  const source = event.composedPath()[0];
1147
889
  const { id } = source;
1148
890
  const trigger = event.target;
@@ -1150,12 +892,10 @@ export const virtualElementV1 = (args) => {
1150
892
  const fragment = document.createDocumentFragment();
1151
893
  render(contextMenuTemplate(id), fragment);
1152
894
  const popover = fragment.querySelector("sp-popover");
1153
- openOverlay(trigger, "click", popover, {
895
+ openOverlay(trigger, "modal", popover, {
1154
896
  placement: args.placement,
1155
897
  receivesFocus: "auto",
1156
- virtualTrigger,
1157
- offset: 0,
1158
- notImmediatelyClosable: true
898
+ virtualTrigger
1159
899
  });
1160
900
  };
1161
901
  return html`
@@ -1167,78 +907,241 @@ export const virtualElementV1 = (args) => {
1167
907
  </style>
1168
908
  <start-end-contextmenu
1169
909
  class="app-root"
1170
- @contextmenu=${{
1171
- capture: true,
1172
- handleEvent: handleContextmenu
1173
- }}
910
+ @contextmenu=${pointerenter}
1174
911
  ></start-end-contextmenu>
1175
912
  `;
1176
913
  };
1177
- virtualElementV1.args = {
914
+ virtualElement.args = {
1178
915
  placement: "right-start"
1179
916
  };
1180
- export const virtualElement = (args) => {
1181
- const contextMenuTemplate = (kind = "") => html`
1182
- <sp-popover
1183
- style="width:300px;"
1184
- @click=${(event) => {
1185
- var _a;
1186
- if (event.target.localName === "sp-menu-item") {
1187
- (_a = event.target) == null ? void 0 : _a.dispatchEvent(
1188
- new Event("close", { bubbles: true })
1189
- );
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;
1190
926
  }
1191
- }}
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}
1192
955
  >
1193
- <sp-menu>
1194
- <sp-menu-group>
1195
- <span slot="header">Menu source: ${kind}</span>
1196
- <sp-menu-item>Deselect</sp-menu-item>
1197
- <sp-menu-item>Select inverse</sp-menu-item>
1198
- <sp-menu-item>Feather...</sp-menu-item>
1199
- <sp-menu-item>Select and mask...</sp-menu-item>
1200
- <sp-menu-divider></sp-menu-divider>
1201
- <sp-menu-item>Save selection</sp-menu-item>
1202
- <sp-menu-item disabled>Make work path</sp-menu-item>
1203
- </sp-menu-group>
1204
- </sp-menu>
1205
- </sp-popover>
956
+ <sp-icon-open-in
957
+ slot="icon"
958
+ label="Open in overlay"
959
+ ></sp-icon-open-in>
960
+ </sp-action-button>
1206
961
  `;
1207
- const handleContextmenu = async (event) => {
1208
- event.preventDefault();
1209
- event.stopPropagation();
1210
- const source = event.composedPath()[0];
1211
- const { id } = source;
1212
- const trigger = event.target;
1213
- const virtualTrigger = new VirtualTrigger(event.clientX, event.clientY);
1214
- const fragment = document.createDocumentFragment();
1215
- render(contextMenuTemplate(id), fragment);
1216
- const popover = fragment.querySelector("sp-popover");
1217
- const overlay = await openOverlay(popover, {
1218
- trigger: virtualTrigger,
1219
- placement: args.placement,
1220
- offset: 0,
1221
- notImmediatelyClosable: true
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();
1222
983
  });
1223
- 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();
1224
1050
  };
1225
1051
  return html`
1226
- <style>
1227
- .app-root {
1228
- position: absolute;
1229
- inset: 0;
1230
- }
1231
- </style>
1232
- <start-end-contextmenu
1233
- class="app-root"
1234
- @contextmenu=${{
1235
- capture: true,
1236
- handleEvent: handleContextmenu
1237
- }}
1238
- ></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>
1239
1064
  `;
1240
1065
  };
1241
- virtualElement.args = {
1242
- 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
1243
1146
  };
1244
1147
  //# sourceMappingURL=overlay.stories.js.map