@spectrum-web-components/overlay 0.36.0 → 0.37.0

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