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