@spectrum-web-components/overlay 0.34.0 → 0.34.1-rc.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 +227 -152
  2. package/custom-elements.json +1401 -541
  3. package/package.json +48 -22
  4. package/sp-overlay.d.ts +6 -0
  5. package/sp-overlay.dev.js +5 -0
  6. package/{active-overlay.dev.js.map → sp-overlay.dev.js.map} +3 -3
  7. package/sp-overlay.js +2 -0
  8. package/{active-overlay.js.map → sp-overlay.js.map} +4 -4
  9. package/src/Overlay.d.ts +29 -0
  10. package/src/Overlay.dev.js +91 -0
  11. package/src/Overlay.dev.js.map +7 -0
  12. package/src/Overlay.js +2 -0
  13. package/src/Overlay.js.map +7 -0
  14. package/src/OverlayBase.d.ts +124 -0
  15. package/src/OverlayBase.dev.js +744 -0
  16. package/src/OverlayBase.dev.js.map +7 -0
  17. package/src/OverlayBase.js +31 -0
  18. package/src/OverlayBase.js.map +7 -0
  19. package/src/OverlayDialog.d.ts +8 -0
  20. package/src/OverlayDialog.dev.js +160 -0
  21. package/src/OverlayDialog.dev.js.map +7 -0
  22. package/src/OverlayDialog.js +2 -0
  23. package/src/OverlayDialog.js.map +7 -0
  24. package/src/OverlayNoPopover.d.ts +8 -0
  25. package/src/OverlayNoPopover.dev.js +149 -0
  26. package/src/OverlayNoPopover.dev.js.map +7 -0
  27. package/src/OverlayNoPopover.js +2 -0
  28. package/src/OverlayNoPopover.js.map +7 -0
  29. package/src/OverlayPopover.d.ts +8 -0
  30. package/src/OverlayPopover.dev.js +199 -0
  31. package/src/OverlayPopover.dev.js.map +7 -0
  32. package/src/OverlayPopover.js +2 -0
  33. package/src/OverlayPopover.js.map +7 -0
  34. package/src/OverlayStack.d.ts +29 -0
  35. package/src/OverlayStack.dev.js +126 -0
  36. package/src/OverlayStack.dev.js.map +7 -0
  37. package/src/OverlayStack.js +2 -0
  38. package/src/OverlayStack.js.map +7 -0
  39. package/src/OverlayTrigger.d.ts +23 -31
  40. package/src/OverlayTrigger.dev.js +135 -245
  41. package/src/OverlayTrigger.dev.js.map +3 -3
  42. package/src/OverlayTrigger.js +52 -22
  43. package/src/OverlayTrigger.js.map +3 -3
  44. package/src/PlacementController.d.ts +36 -0
  45. package/src/PlacementController.dev.js +191 -0
  46. package/src/PlacementController.dev.js.map +7 -0
  47. package/src/PlacementController.js +2 -0
  48. package/src/PlacementController.js.map +7 -0
  49. package/src/VirtualTrigger.dev.js +0 -2
  50. package/src/VirtualTrigger.dev.js.map +2 -2
  51. package/src/VirtualTrigger.js +1 -1
  52. package/src/VirtualTrigger.js.map +3 -3
  53. package/src/fullSizePlugin.d.ts +12 -0
  54. package/src/fullSizePlugin.dev.js +39 -0
  55. package/src/fullSizePlugin.dev.js.map +7 -0
  56. package/src/fullSizePlugin.js +2 -0
  57. package/src/fullSizePlugin.js.map +7 -0
  58. package/src/index.d.ts +2 -3
  59. package/src/index.dev.js +2 -3
  60. package/src/index.dev.js.map +2 -2
  61. package/src/index.js +1 -1
  62. package/src/index.js.map +2 -2
  63. package/src/loader.d.ts +2 -2
  64. package/src/loader.dev.js +2 -19
  65. package/src/loader.dev.js.map +2 -2
  66. package/src/loader.js +1 -1
  67. package/src/loader.js.map +3 -3
  68. package/src/overlay-base.css.dev.js +9 -0
  69. package/src/overlay-base.css.dev.js.map +7 -0
  70. package/src/overlay-base.css.js +6 -0
  71. package/src/overlay-base.css.js.map +7 -0
  72. package/src/overlay-trigger.css.dev.js +1 -1
  73. package/src/overlay-trigger.css.dev.js.map +1 -1
  74. package/src/overlay-trigger.css.js +1 -1
  75. package/src/overlay-trigger.css.js.map +1 -1
  76. package/src/overlay-types.d.ts +7 -5
  77. package/src/overlay-types.dev.js +1 -0
  78. package/src/overlay-types.dev.js.map +3 -3
  79. package/src/overlay-types.js +1 -1
  80. package/src/overlay-types.js.map +3 -3
  81. package/src/topLayerOverTransforms.d.ts +23 -0
  82. package/src/topLayerOverTransforms.dev.js +170 -0
  83. package/src/topLayerOverTransforms.dev.js.map +7 -0
  84. package/src/topLayerOverTransforms.js +2 -0
  85. package/src/topLayerOverTransforms.js.map +7 -0
  86. package/stories/overlay-element.stories.js +247 -0
  87. package/stories/overlay-element.stories.js.map +7 -0
  88. package/stories/overlay-story-components.js +9 -8
  89. package/stories/overlay-story-components.js.map +2 -2
  90. package/stories/overlay.stories.js +780 -683
  91. package/stories/overlay.stories.js.map +2 -2
  92. package/sync/overlay-trigger.d.ts +4 -0
  93. package/sync/overlay-trigger.dev.js +1 -4
  94. package/sync/overlay-trigger.dev.js.map +2 -2
  95. package/sync/overlay-trigger.js +1 -1
  96. package/sync/overlay-trigger.js.map +3 -3
  97. package/test/benchmark/basic-test.js +1 -1
  98. package/test/benchmark/basic-test.js.map +1 -1
  99. package/test/index.js +407 -376
  100. package/test/index.js.map +3 -3
  101. package/test/overlay-element.test-vrt.js +5 -0
  102. package/test/overlay-element.test-vrt.js.map +7 -0
  103. package/test/overlay-element.test.js +682 -0
  104. package/test/overlay-element.test.js.map +7 -0
  105. package/test/overlay-lifecycle.test.js +34 -106
  106. package/test/overlay-lifecycle.test.js.map +2 -2
  107. package/test/overlay-trigger-click.test.js +11 -5
  108. package/test/overlay-trigger-click.test.js.map +2 -2
  109. package/test/overlay-trigger-extended.test.js +1 -6
  110. package/test/overlay-trigger-extended.test.js.map +2 -2
  111. package/test/overlay-trigger-hover-click.test.js +23 -23
  112. package/test/overlay-trigger-hover-click.test.js.map +2 -2
  113. package/test/overlay-trigger-hover.test.js +40 -34
  114. package/test/overlay-trigger-hover.test.js.map +2 -2
  115. package/test/overlay-trigger-longpress.test.js +98 -80
  116. package/test/overlay-trigger-longpress.test.js.map +2 -2
  117. package/test/overlay-trigger-sync.test.js +1 -1
  118. package/test/overlay-trigger-sync.test.js.map +2 -2
  119. package/test/overlay-trigger.test.js +1 -1
  120. package/test/overlay-trigger.test.js.map +2 -2
  121. package/test/overlay-update.test.js +4 -4
  122. package/test/overlay-update.test.js.map +2 -2
  123. package/test/{overlay.test.js → overlay-v1.test.js} +267 -249
  124. package/test/overlay-v1.test.js.map +7 -0
  125. package/test/overlay-v2.test.js +720 -0
  126. package/test/overlay-v2.test.js.map +7 -0
  127. package/active-overlay.d.ts +0 -6
  128. package/active-overlay.dev.js +0 -5
  129. package/active-overlay.js +0 -2
  130. package/src/ActiveOverlay.d.ts +0 -84
  131. package/src/ActiveOverlay.dev.js +0 -517
  132. package/src/ActiveOverlay.dev.js.map +0 -7
  133. package/src/ActiveOverlay.js +0 -16
  134. package/src/ActiveOverlay.js.map +0 -7
  135. package/src/active-overlay.css.dev.js +0 -13
  136. package/src/active-overlay.css.dev.js.map +0 -7
  137. package/src/active-overlay.css.js +0 -10
  138. package/src/active-overlay.css.js.map +0 -7
  139. package/src/overlay-stack.d.ts +0 -50
  140. package/src/overlay-stack.dev.js +0 -515
  141. package/src/overlay-stack.dev.js.map +0 -7
  142. package/src/overlay-stack.js +0 -34
  143. package/src/overlay-stack.js.map +0 -7
  144. package/src/overlay-utils.d.ts +0 -3
  145. package/src/overlay-utils.dev.js +0 -31
  146. package/src/overlay-utils.dev.js.map +0 -7
  147. package/src/overlay-utils.js +0 -2
  148. package/src/overlay-utils.js.map +0 -7
  149. package/src/overlay.d.ts +0 -59
  150. package/src/overlay.dev.js +0 -127
  151. package/src/overlay.dev.js.map +0 -7
  152. package/src/overlay.js +0 -2
  153. package/src/overlay.js.map +0 -7
  154. package/test/overlay.test.js.map +0 -7
  155. /package/src/{active-overlay.css.d.ts → overlay-base.css.d.ts} +0 -0
@@ -9,14 +9,17 @@ 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";
12
13
  import "@spectrum-web-components/dialog/sp-dialog-wrapper.js";
13
14
  import "@spectrum-web-components/field-label/sp-field-label.js";
14
15
  import "@spectrum-web-components/icons-workflow/icons/sp-icon-magnify.js";
15
16
  import "@spectrum-web-components/icons-workflow/icons/sp-icon-open-in.js";
16
17
  import "@spectrum-web-components/overlay/overlay-trigger.js";
17
18
  import "@spectrum-web-components/picker/sp-picker.js";
19
+ import "@spectrum-web-components/overlay/sp-overlay.js";
18
20
  import "@spectrum-web-components/menu/sp-menu.js";
19
21
  import "@spectrum-web-components/menu/sp-menu-item.js";
22
+ import "@spectrum-web-components/menu/sp-menu-group.js";
20
23
  import "@spectrum-web-components/menu/sp-menu-divider.js";
21
24
  import "@spectrum-web-components/popover/sp-popover.js";
22
25
  import "@spectrum-web-components/slider/sp-slider.js";
@@ -128,33 +131,33 @@ const template = ({
128
131
  type=${ifDefined(type)}
129
132
  >
130
133
  <sp-button variant="primary" slot="trigger">Show Popover</sp-button>
131
- <sp-popover slot="click-content" placement="${placement}" tip>
134
+ <sp-popover
135
+ slot="click-content"
136
+ placement="${placement}"
137
+ tip
138
+ >
132
139
  <sp-dialog no-divider>
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>
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>
158
161
 
159
162
  <sp-tooltip
160
163
  slot="hover-content"
@@ -177,18 +180,148 @@ const template = ({
177
180
  </overlay-trigger>
178
181
  `;
179
182
  };
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
+ }
180
195
  export const Default = (args) => template(args);
181
- export const openHoverContent = (args) => template({
182
- ...args,
183
- open: "hover"
184
- });
185
- export const openClickContent = (args) => template({
186
- ...args,
187
- open: "click"
188
- });
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
+ };
189
305
  class ScrollForcer extends HTMLElement {
190
306
  constructor() {
191
307
  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
+ };
192
325
  this.readyPromise = Promise.resolve(false);
193
326
  this.readyPromise = new Promise((res) => {
194
327
  this.ready = res;
@@ -196,28 +329,16 @@ class ScrollForcer extends HTMLElement {
196
329
  this.setup();
197
330
  }
198
331
  async setup() {
199
- var _a;
332
+ var _a, _b;
200
333
  await nextFrame();
201
334
  await nextFrame();
202
335
  (_a = this.previousElementSibling) == null ? void 0 : _a.addEventListener(
203
336
  "sp-opened",
204
- () => {
205
- this.doScroll();
206
- },
207
- { once: true }
337
+ this.doScroll
208
338
  );
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
- }
218
339
  await nextFrame();
219
340
  await nextFrame();
220
- this.ready(true);
341
+ ((_b = this.previousElementSibling) == null ? void 0 : _b.lastElementChild).open = "click";
221
342
  }
222
343
  get updateComplete() {
223
344
  return this.readyPromise;
@@ -227,8 +348,7 @@ customElements.define("scroll-forcer", ScrollForcer);
227
348
  export const clickContentClosedOnScroll = (args) => html`
228
349
  <div style="margin: 50vh 0 100vh;">
229
350
  ${template({
230
- ...args,
231
- open: "click"
351
+ ...args
232
352
  })}
233
353
  </div>
234
354
  `;
@@ -247,86 +367,137 @@ clickContentClosedOnScroll.decorators = [
247
367
  <scroll-forcer></scroll-forcer>
248
368
  `
249
369
  ];
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
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
+ `;
264
478
  };
479
+ complexModal.decorators = [complexModalDecorator];
265
480
  export const customizedClickContent = (args) => html`
266
481
  <style>
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;
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;
270
487
  }
271
488
  </style>
272
- </style>
273
489
  ${template({
274
490
  ...args,
275
491
  open: "click"
276
492
  })}
277
493
  `;
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
494
  export const deep = () => html`
324
495
  <overlay-trigger>
325
496
  <sp-button variant="primary" slot="trigger">
326
497
  Open popover 1 with buttons + selfmanaged Tooltips
327
498
  </sp-button>
328
- <sp-popover slot="click-content" direction="bottom" tip open>
329
- <sp-dialog size="s" no-divider>
499
+ <sp-popover slot="click-content" direction="bottom" tip>
500
+ <sp-dialog size="s" no-divder>
330
501
  <sp-action-button>
331
502
  <sp-tooltip self-managed placement="bottom" offset="0">
332
503
  My Tooltip 1
@@ -347,8 +518,8 @@ export const deep = () => html`
347
518
  <sp-button variant="primary" slot="trigger">
348
519
  Open popover 2 with buttons without ToolTips
349
520
  </sp-button>
350
- <sp-popover slot="click-content" direction="bottom" tip open>
351
- <sp-dialog size="s" no-divider>
521
+ <sp-popover slot="click-content" direction="bottom" tip>
522
+ <sp-dialog size="s" no-divder>
352
523
  <sp-action-button>X</sp-action-button>
353
524
  <sp-action-button>Y</sp-action-button>
354
525
  </sp-dialog>
@@ -358,72 +529,6 @@ export const deep = () => html`
358
529
  deep.swc_vrt = {
359
530
  skip: true
360
531
  };
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
- };
427
532
  export const deepNesting = () => {
428
533
  const color = window.__swc_hack_knobs__.defaultColor;
429
534
  const outter = color === "light" ? "dark" : "light";
@@ -453,6 +558,140 @@ export const deepNesting = () => {
453
558
  </sp-theme>
454
559
  `;
455
560
  };
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
+ };
456
695
  export const edges = () => {
457
696
  return html`
458
697
  <style>
@@ -482,7 +721,7 @@ export const edges = () => {
482
721
  <br />
483
722
  Left
484
723
  </sp-button>
485
- <sp-tooltip slot="hover-content" delayed open tip="bottom">
724
+ <sp-tooltip slot="hover-content" delayed tip="bottom">
486
725
  Triskaidekaphobia and More
487
726
  </sp-tooltip>
488
727
  </overlay-trigger>
@@ -492,7 +731,7 @@ export const edges = () => {
492
731
  <br />
493
732
  Right
494
733
  </sp-button>
495
- <sp-tooltip slot="hover-content" delayed open tip="bottom">
734
+ <sp-tooltip slot="hover-content" delayed tip="bottom">
496
735
  Triskaidekaphobia and More
497
736
  </sp-tooltip>
498
737
  </overlay-trigger>
@@ -502,7 +741,7 @@ export const edges = () => {
502
741
  <br />
503
742
  Left
504
743
  </sp-button>
505
- <sp-tooltip slot="hover-content" delayed open tip="top">
744
+ <sp-tooltip slot="hover-content" delayed tip="top">
506
745
  Triskaidekaphobia and More
507
746
  </sp-tooltip>
508
747
  </overlay-trigger>
@@ -512,106 +751,31 @@ export const edges = () => {
512
751
  <br />
513
752
  Right
514
753
  </sp-button>
515
- <sp-tooltip slot="hover-content" delayed open tip="top">
754
+ <sp-tooltip slot="hover-content" delayed tip="top">
516
755
  Triskaidekaphobia and More
517
756
  </sp-tooltip>
518
757
  </overlay-trigger>
519
758
  `;
520
759
  };
521
- export const updated = () => {
760
+ export const inline = () => {
761
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
522
762
  return html`
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>
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}
582
776
  `;
583
777
  };
584
- export const sideHoverDraggable = () => {
585
- return html`
586
- ${storyStyles}
587
- <style>
588
- sp-tooltip {
589
- transition: none;
590
- }
591
- </style>
592
- <overlay-drag>
593
- <overlay-trigger placement="right">
594
- <overlay-target-icon slot="trigger"></overlay-target-icon>
595
- <sp-tooltip slot="hover-content" delayed tip="right">
596
- Lorem ipsum dolor sit amet, consectetur adipiscing elit.
597
- Vivamus egestas sed enim sed condimentum. Nunc facilisis
598
- scelerisque massa sed luctus. Orci varius natoque penatibus
599
- et magnis dis parturient montes, nascetur ridiculus mus.
600
- Suspendisse sagittis sodales purus vitae ultricies. Integer
601
- at dui sem. Sed quam tortor, ornare in nisi et, rhoncus
602
- lacinia mauris. Sed vel rutrum mauris, ac pellentesque nibh.
603
- Sed feugiat semper libero, sit amet vehicula orci fermentum
604
- id. Vivamus imperdiet egestas luctus. Mauris tincidunt
605
- malesuada ante, faucibus viverra nunc blandit a. Fusce et
606
- nisl nisi. Aenean dictum quam id mollis faucibus. Nulla a
607
- ultricies dui. In hac habitasse platea dictumst. Curabitur
608
- gravida lobortis vestibulum.
609
- </sp-tooltip>
610
- </overlay-trigger>
611
- </overlay-drag>
612
- `;
613
- };
614
- export const longpress = () => {
778
+ export const longpress = () => {
615
779
  return html`
616
780
  <overlay-trigger placement="right-start">
617
781
  <sp-action-button slot="trigger" hold-affordance>
@@ -641,202 +805,293 @@ export const longpress = () => {
641
805
  </overlay-trigger>
642
806
  `;
643
807
  };
644
- export const clickAndHoverTargets = () => {
808
+ export const modalLoose = () => {
809
+ const closeEvent = new Event("close", { bubbles: true, composed: true });
645
810
  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>
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}
675
836
  `;
676
837
  };
677
- clickAndHoverTargets.swc_vrt = {
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 = {
678
910
  skip: true
679
911
  };
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) => {
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 });
717
922
  return html`
718
- ${story()}
719
- <complex-modal-ready></complex-modal-ready>
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}
720
936
  `;
721
937
  };
722
- export const complexModal = () => {
938
+ export const sideHoverDraggable = () => {
723
939
  return html`
940
+ ${storyStyles}
724
941
  <style>
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;
942
+ sp-tooltip {
943
+ transition: none;
763
944
  }
764
945
  </style>
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>
946
+ <overlay-drag>
947
+ <overlay-trigger placement="right">
948
+ <overlay-target-icon slot="trigger"></overlay-target-icon>
949
+ <sp-tooltip slot="hover-content" delayed tip="right">
950
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
951
+ Vivamus egestas sed enim sed condimentum. Nunc facilisis
952
+ scelerisque massa sed luctus. Orci varius natoque penatibus
953
+ et magnis dis parturient montes, nascetur ridiculus mus.
954
+ Suspendisse sagittis sodales purus vitae ultricies. Integer
955
+ at dui sem. Sed quam tortor, ornare in nisi et, rhoncus
956
+ lacinia mauris. Sed vel rutrum mauris, ac pellentesque nibh.
957
+ Sed feugiat semper libero, sit amet vehicula orci fermentum
958
+ id. Vivamus imperdiet egestas luctus. Mauris tincidunt
959
+ malesuada ante, faucibus viverra nunc blandit a. Fusce et
960
+ nisl nisi. Aenean dictum quam id mollis faucibus. Nulla a
961
+ ultricies dui. In hac habitasse platea dictumst. Curabitur
962
+ gravida lobortis vestibulum.
963
+ </sp-tooltip>
964
+ </overlay-trigger>
965
+ </overlay-drag>
966
+ `;
967
+ };
968
+ export const superComplexModal = () => {
969
+ 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>
1011
+ </sp-popover>
789
1012
  </overlay-trigger>
790
1013
  `;
791
1014
  };
792
- complexModal.decorators = [complexModalDecorator];
793
- export const superComplexModal = () => {
1015
+ export const updated = () => {
1016
+ return html`
1017
+ ${storyStyles}
1018
+ <style>
1019
+ sp-tooltip {
1020
+ transition: none;
1021
+ }
1022
+ </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>
1068
+ `;
1069
+ };
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
+ };
794
1077
  return html`
795
- <overlay-trigger type="modal" placement="none">
796
- <sp-button slot="trigger" variant="accent">Toggle Dialog</sp-button>
1078
+ <overlay-trigger type="click">
1079
+ <sp-button variant="primary" slot="trigger">
1080
+ Open inline overlay
1081
+ </sp-button>
797
1082
  <sp-popover slot="click-content">
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>
1083
+ <sp-dialog size="s" no-divder>
1084
+ <sp-button variant="primary" @click=${update}>
1085
+ Update trigger location.
1086
+ </sp-button>
835
1087
  </sp-dialog>
836
1088
  </sp-popover>
837
1089
  </overlay-trigger>
838
1090
  `;
839
1091
  };
1092
+ updating.swc_vrt = {
1093
+ skip: true
1094
+ };
840
1095
  class StartEndContextmenu extends HTMLElement {
841
1096
  constructor() {
842
1097
  super();
@@ -858,15 +1113,17 @@ class StartEndContextmenu extends HTMLElement {
858
1113
  }
859
1114
  }
860
1115
  customElements.define("start-end-contextmenu", StartEndContextmenu);
861
- export const virtualElement = (args) => {
1116
+ export const virtualElementV1 = (args) => {
862
1117
  const contextMenuTemplate = (kind = "") => html`
863
1118
  <sp-popover
864
1119
  style="width:300px;"
865
1120
  @click=${(event) => {
866
1121
  var _a;
867
- return (_a = event.target) == null ? void 0 : _a.dispatchEvent(
868
- new Event("close", { bubbles: true })
869
- );
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
+ }
870
1127
  }}
871
1128
  >
872
1129
  <sp-menu>
@@ -883,8 +1140,9 @@ export const virtualElement = (args) => {
883
1140
  </sp-menu>
884
1141
  </sp-popover>
885
1142
  `;
886
- const pointerenter = async (event) => {
1143
+ const handleContextmenu = async (event) => {
887
1144
  event.preventDefault();
1145
+ event.stopPropagation();
888
1146
  const source = event.composedPath()[0];
889
1147
  const { id } = source;
890
1148
  const trigger = event.target;
@@ -892,10 +1150,12 @@ export const virtualElement = (args) => {
892
1150
  const fragment = document.createDocumentFragment();
893
1151
  render(contextMenuTemplate(id), fragment);
894
1152
  const popover = fragment.querySelector("sp-popover");
895
- openOverlay(trigger, "modal", popover, {
1153
+ openOverlay(trigger, "click", popover, {
896
1154
  placement: args.placement,
897
1155
  receivesFocus: "auto",
898
- virtualTrigger
1156
+ virtualTrigger,
1157
+ offset: 0,
1158
+ notImmediatelyClosable: true
899
1159
  });
900
1160
  };
901
1161
  return html`
@@ -907,241 +1167,78 @@ export const virtualElement = (args) => {
907
1167
  </style>
908
1168
  <start-end-contextmenu
909
1169
  class="app-root"
910
- @contextmenu=${pointerenter}
1170
+ @contextmenu=${{
1171
+ capture: true,
1172
+ handleEvent: handleContextmenu
1173
+ }}
911
1174
  ></start-end-contextmenu>
912
1175
  `;
913
1176
  };
914
- virtualElement.args = {
1177
+ virtualElementV1.args = {
915
1178
  placement: "right-start"
916
1179
  };
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;
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
+ );
926
1190
  }
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}
1191
+ }}
955
1192
  >
956
- <sp-icon-open-in
957
- slot="icon"
958
- label="Open in overlay"
959
- ></sp-icon-open-in>
960
- </sp-action-button>
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>
961
1206
  `;
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();
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
983
1222
  });
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();
1050
- };
1051
- return html`
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>
1064
- `;
1065
- };
1066
- updating.swc_vrt = {
1067
- skip: true
1068
- };
1069
- export const accordion = () => {
1070
- const handleToggle = () => {
1071
- Overlay.update();
1223
+ trigger.insertAdjacentElement("afterend", overlay);
1072
1224
  };
1073
1225
  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>
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>
1142
1239
  `;
1143
1240
  };
1144
- accordion.swc_vrt = {
1145
- skip: true
1241
+ virtualElement.args = {
1242
+ placement: "right-start"
1146
1243
  };
1147
1244
  //# sourceMappingURL=overlay.stories.js.map