@spectrum-web-components/slider 1.0.2 → 1.0.3

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.
@@ -0,0 +1,1109 @@
1
+ "use strict";
2
+ import { html } from "@spectrum-web-components/base";
3
+ import "@spectrum-web-components/slider/sp-slider.js";
4
+ import "@spectrum-web-components/slider/sp-slider-handle.js";
5
+ import "@spectrum-web-components/popover/sp-popover.js";
6
+ import "@spectrum-web-components/dialog/sp-dialog.js";
7
+ import {
8
+ variants
9
+ } from "@spectrum-web-components/slider";
10
+ import { spreadProps } from "../../../test/lit-helpers.js";
11
+ export default {
12
+ component: "sp-slider",
13
+ title: "Slider",
14
+ argTypes: {
15
+ onInput: { action: "input" },
16
+ onChange: { action: "change" },
17
+ variant: {
18
+ name: "Variant",
19
+ description: "Determines the style of slider.",
20
+ table: {
21
+ type: { summary: "string" },
22
+ defaultValue: { summary: void 0 }
23
+ },
24
+ control: {
25
+ type: "inline-radio",
26
+ options: [void 0, ...variants]
27
+ }
28
+ },
29
+ tickStep: {
30
+ name: "Tick Step",
31
+ description: "Tick spacing on slider.",
32
+ table: {
33
+ type: { summary: "number" },
34
+ defaultValue: { summary: 0.1 }
35
+ },
36
+ control: {
37
+ type: "number"
38
+ }
39
+ },
40
+ labelVisibility: {
41
+ name: "Label Visibility",
42
+ description: "The labels visibily available in the UI",
43
+ table: {
44
+ type: { summary: '"text" | "value" | "none" | undefined' },
45
+ defaultValue: { summary: void 0 }
46
+ },
47
+ control: {
48
+ type: "text"
49
+ }
50
+ }
51
+ },
52
+ args: {
53
+ variant: void 0,
54
+ tickStep: 0.1,
55
+ labelVisibility: void 0,
56
+ min: void 0,
57
+ max: void 0,
58
+ value: void 0,
59
+ step: void 0
60
+ }
61
+ };
62
+ const handleEvent = ({ onInput, onChange }) => (event) => {
63
+ const { value } = event.target;
64
+ if (onInput && event.type === "input") {
65
+ onInput(value.toString());
66
+ } else if (onChange && event.type === "change") {
67
+ onChange(value.toString());
68
+ }
69
+ };
70
+ const handleHandleEvent = ({ onInput, onChange }) => (event) => {
71
+ const target = event.target;
72
+ if (target.value != null) {
73
+ if (typeof target.value === "object") {
74
+ const value = JSON.stringify(target.value, null, 2);
75
+ if (onInput && event.type === "input") {
76
+ onInput(value);
77
+ } else if (onChange && event.type === "change") {
78
+ onChange(value);
79
+ }
80
+ } else {
81
+ const value = `${target.name}: ${target.value}`;
82
+ if (onInput && event.type === "input") {
83
+ onInput(value);
84
+ } else if (onChange && event.type === "change") {
85
+ onChange(value);
86
+ }
87
+ }
88
+ }
89
+ };
90
+ export const Default = (args = {}) => {
91
+ return html`
92
+ <div style="width: 500px; margin-inline: 20px;">
93
+ <sp-slider
94
+ max="1"
95
+ min="0"
96
+ value=".5"
97
+ step="0.01"
98
+ @input=${handleEvent(args)}
99
+ @change=${handleEvent(args)}
100
+ .formatOptions=${{ style: "percent" }}
101
+ ...=${spreadProps(args)}
102
+ >
103
+ Opacity
104
+ </sp-slider>
105
+ </div>
106
+ `;
107
+ };
108
+ export const Filled = (args = {}) => {
109
+ return html`
110
+ <div style="width: 500px; margin-inline: 20px;">
111
+ <sp-slider
112
+ max="1"
113
+ variant="filled"
114
+ min="0"
115
+ value=".7"
116
+ step="0.01"
117
+ @input=${handleEvent(args)}
118
+ @change=${handleEvent(args)}
119
+ .formatOptions=${{ style: "percent" }}
120
+ ...=${spreadProps(args)}
121
+ >
122
+ Slider Label
123
+ </sp-slider>
124
+ </div>
125
+ `;
126
+ };
127
+ export const HasADefaultValue = (args = {}) => {
128
+ return html`
129
+ <div style="width: 500px; margin-inline: 20px;">
130
+ <sp-slider
131
+ max="1"
132
+ min="0"
133
+ value=".5"
134
+ step="0.01"
135
+ default-value="0.2"
136
+ @input=${handleEvent(args)}
137
+ @change=${handleEvent(args)}
138
+ .formatOptions=${{ style: "percent" }}
139
+ ...=${spreadProps(args)}
140
+ >
141
+ double click or press escape key to reset
142
+ </sp-slider>
143
+ </div>
144
+ `;
145
+ };
146
+ export const FillStart = (args = {}) => {
147
+ return html`
148
+ <div style="width: 500px; margin-inline: 20px;">
149
+ <sp-slider
150
+ max="1"
151
+ fill-start
152
+ variant="filled"
153
+ min="0"
154
+ value=".7"
155
+ step="0.01"
156
+ @input=${handleEvent(args)}
157
+ @change=${handleEvent(args)}
158
+ .formatOptions=${{ style: "percent" }}
159
+ ...=${spreadProps(args)}
160
+ >
161
+ Slider label
162
+ </sp-slider>
163
+ </div>
164
+ `;
165
+ };
166
+ export const FillStartWithValue = (args = {}) => {
167
+ return html`
168
+ <div style="width: 500px; margin-inline: 20px;">
169
+ <sp-slider
170
+ max="1"
171
+ min="0"
172
+ value=".7"
173
+ step="0.1"
174
+ fill-start="0.3"
175
+ variant="filled"
176
+ @input=${handleEvent(args)}
177
+ @change=${handleEvent(args)}
178
+ .formatOptions=${{ style: "percent" }}
179
+ ...=${spreadProps(args)}
180
+ >
181
+ Value Greater than Fill Start
182
+ </sp-slider>
183
+ </div>
184
+ <div style="width: 500px; margin-inline: 20px;">
185
+ <sp-slider
186
+ max="20"
187
+ min="0"
188
+ value="5"
189
+ step="1"
190
+ fill-start="15"
191
+ @input=${handleEvent(args)}
192
+ @change=${handleEvent(args)}
193
+ .formatOptions=${{ style: "number" }}
194
+ ...=${spreadProps(args)}
195
+ >
196
+ Value Less than Fill Start
197
+ </sp-slider>
198
+ </div>
199
+ `;
200
+ };
201
+ export const FillStartWithNegativeMinRange = (args = {}) => {
202
+ return html`
203
+ <div style="width: 500px; margin-inline: 20px;">
204
+ <sp-slider
205
+ max="150"
206
+ min="-50"
207
+ value="25"
208
+ step="1"
209
+ fill-start="0"
210
+ @input=${handleEvent(args)}
211
+ @change=${handleEvent(args)}
212
+ .formatOptions=${{ style: "number" }}
213
+ ...=${spreadProps(args)}
214
+ >
215
+ Fill start with "0" and within range -50 to 150
216
+ </sp-slider>
217
+ </div>
218
+ <div style="width: 500px; margin-inline: 20px;">
219
+ <sp-slider
220
+ max="100"
221
+ min="-50"
222
+ value="-25"
223
+ step="1"
224
+ fill-start="0"
225
+ @input=${handleEvent(args)}
226
+ @change=${handleEvent(args)}
227
+ .formatOptions=${{ style: "number" }}
228
+ .normalization=${{
229
+ toNormalized: (value) => {
230
+ if (value === 0) return 0.5;
231
+ return value < 0 ? 0.5 - value / -50 * 0.5 : 0.5 + value / 100 * 0.5;
232
+ },
233
+ fromNormalized: (value) => {
234
+ if (value === 0.5) return 0;
235
+ return value < 0.5 ? (1 - value / 0.5) * -50 : (value - 0.5) / 0.5 * 100;
236
+ }
237
+ }}
238
+ ...=${spreadProps(args)}
239
+ >
240
+ Fill start with "0" and normalization function within range -50
241
+ to 100
242
+ </sp-slider>
243
+ </div>
244
+ `;
245
+ };
246
+ export const autofocus = (args = {}) => {
247
+ return html`
248
+ <div style="width: 500px; margin-inline: 20px;">
249
+ <sp-slider
250
+ autofocus
251
+ max="1"
252
+ min="0"
253
+ value=".5"
254
+ step="0.01"
255
+ @input=${handleEvent(args)}
256
+ @change=${handleEvent(args)}
257
+ .formatOptions=${{ style: "percent" }}
258
+ ...=${spreadProps(args)}
259
+ >
260
+ Opacity
261
+ </sp-slider>
262
+ </div>
263
+ `;
264
+ };
265
+ export const minimalDOM = () => {
266
+ return html`
267
+ <div style="width: 500px; margin: 12px 20px;">
268
+ <sp-slider>Opacity</sp-slider>
269
+ </div>
270
+ `;
271
+ };
272
+ export const noVisibleTextLabel = (args = {}) => {
273
+ return html`
274
+ <div style="width: 500px; margin: 12px 20px;">
275
+ <sp-slider
276
+ max="1"
277
+ min="0"
278
+ value=".5"
279
+ step="0.01"
280
+ @input=${handleEvent(args)}
281
+ @change=${handleEvent(args)}
282
+ .formatOptions=${{ style: "percent" }}
283
+ ...=${spreadProps(args)}
284
+ >
285
+ Opacity
286
+ </sp-slider>
287
+ </div>
288
+ `;
289
+ };
290
+ noVisibleTextLabel.args = {
291
+ labelVisibility: "value"
292
+ };
293
+ export const noVisibleValueLabel = (args = {}) => {
294
+ return html`
295
+ <div style="width: 500px; margin: 12px 20px;">
296
+ <sp-slider
297
+ max="1"
298
+ min="0"
299
+ value="0"
300
+ step="0.01"
301
+ @input=${handleEvent(args)}
302
+ @change=${handleEvent(args)}
303
+ .formatOptions=${{ style: "percent" }}
304
+ ...=${spreadProps(args)}
305
+ >
306
+ Opacity
307
+ </sp-slider>
308
+ </div>
309
+ `;
310
+ };
311
+ noVisibleValueLabel.args = {
312
+ labelVisibility: "text"
313
+ };
314
+ export const noVisibleLabels = (args = {}) => {
315
+ return html`
316
+ <div style="width: 500px; margin: 12px 20px;">
317
+ <sp-slider
318
+ max="1"
319
+ min="0"
320
+ value=".5"
321
+ step="0.01"
322
+ @input=${handleEvent(args)}
323
+ @change=${handleEvent(args)}
324
+ .formatOptions=${{ style: "percent" }}
325
+ ...=${spreadProps(args)}
326
+ >
327
+ Opacity
328
+ </sp-slider>
329
+ </div>
330
+ `;
331
+ };
332
+ noVisibleLabels.args = {
333
+ labelVisibility: "none"
334
+ };
335
+ export const px = (args = {}) => {
336
+ return html`
337
+ <div style="width: 500px; margin: 12px 20px;">
338
+ <sp-slider
339
+ max="360"
340
+ min="0"
341
+ value="90"
342
+ step="1"
343
+ @input=${handleEvent(args)}
344
+ @change=${handleEvent(args)}
345
+ .formatOptions=${{
346
+ style: "unit",
347
+ unit: "px"
348
+ }}
349
+ ...=${spreadProps(args)}
350
+ >
351
+ Angle
352
+ </sp-slider>
353
+ </div>
354
+ `;
355
+ };
356
+ class NumberFieldDefined extends HTMLElement {
357
+ constructor() {
358
+ super();
359
+ this.numberFieldLoaderPromise = Promise.resolve(false);
360
+ this.numberFieldLoaderPromise = new Promise((res) => {
361
+ customElements.whenDefined("sp-number-field").then(() => {
362
+ res(true);
363
+ });
364
+ });
365
+ }
366
+ get updateComplete() {
367
+ return this.numberFieldLoaderPromise;
368
+ }
369
+ }
370
+ customElements.define("number-field-defined", NumberFieldDefined);
371
+ const editableDecorator = (story) => {
372
+ return html`
373
+ ${story()}
374
+ <number-field-defined></number-field-defined>
375
+ `;
376
+ };
377
+ export const max20 = (args = {}) => {
378
+ return html`
379
+ <div style="width: 200px; margin: 12px 20px;">
380
+ <sp-slider
381
+ editable
382
+ max="20"
383
+ min="0"
384
+ value="5"
385
+ step="1"
386
+ @input=${handleEvent(args)}
387
+ @change=${handleEvent(args)}
388
+ ...=${spreadProps(args)}
389
+ >
390
+ Max 20
391
+ </sp-slider>
392
+ </div>
393
+ `;
394
+ };
395
+ max20.swc_vrt = {
396
+ skip: true
397
+ };
398
+ export const editable = (args = {}) => {
399
+ return html`
400
+ <div style="width: 500px; margin: 12px 20px;">
401
+ <sp-slider
402
+ editable
403
+ max="360"
404
+ min="0"
405
+ value="90"
406
+ step="1"
407
+ @input=${handleEvent(args)}
408
+ @change=${handleEvent(args)}
409
+ .formatOptions=${{
410
+ style: "unit",
411
+ unit: "degree",
412
+ unitDisplay: "narrow"
413
+ }}
414
+ ...=${spreadProps(args)}
415
+ >
416
+ Angle
417
+ </sp-slider>
418
+ </div>
419
+ `;
420
+ };
421
+ editable.decorators = [editableDecorator];
422
+ import "@spectrum-web-components/slider/sp-slider.js";
423
+ import "@spectrum-web-components/overlay/overlay-trigger.js";
424
+ import "@spectrum-web-components/button/sp-button.js";
425
+ import "@spectrum-web-components/tray/sp-tray.js";
426
+ export const Multiple = (args) => {
427
+ const updateSliderConfig = (min, max, value, step) => {
428
+ const slider = document.querySelector("sp-slider");
429
+ if (slider) {
430
+ slider.value = value;
431
+ slider.min = min;
432
+ slider.max = max;
433
+ slider.step = step;
434
+ }
435
+ };
436
+ return html`
437
+ <overlay-trigger type="modal">
438
+ <sp-button slot="trigger" variant="secondary">
439
+ Toggle menu
440
+ </sp-button>
441
+ <sp-tray slot="click-content">
442
+ <div style="padding: 8px; width: 100%">
443
+ <sp-slider
444
+ label="Slider Label"
445
+ min=${args.min}
446
+ max=${args.max}
447
+ value=${args.value}
448
+ step=${args.step}
449
+ variant="filled"
450
+ hide-stepper
451
+ editable
452
+ ></sp-slider>
453
+ <div
454
+ style="display: grid; gap: 8px; padding: 8px; width: 50%; margin: auto;"
455
+ >
456
+ <sp-button
457
+ size="s"
458
+ @click=${() => updateSliderConfig(0.25, 4, 0.75, 0.01)}
459
+ >
460
+ Duration
461
+ </sp-button>
462
+ <sp-button
463
+ size="s"
464
+ @click=${() => updateSliderConfig(2, 100, 2, 1)}
465
+ >
466
+ Personality
467
+ </sp-button>
468
+ <sp-button
469
+ size="s"
470
+ @click=${() => updateSliderConfig(2, 25, 3, 1)}
471
+ >
472
+ Intensity
473
+ </sp-button>
474
+ </div>
475
+ </div>
476
+ </sp-tray>
477
+ </overlay-trigger>
478
+ `;
479
+ };
480
+ Multiple.args = {
481
+ min: 0.25,
482
+ max: 4,
483
+ value: 0.75,
484
+ step: 0.01
485
+ };
486
+ export const editableWithDefaultValue = (args = {}) => {
487
+ return html`
488
+ <div style="width: 500px; margin: 12px 20px;">
489
+ <sp-slider
490
+ editable
491
+ max="360"
492
+ min="0"
493
+ value="90"
494
+ step="1"
495
+ default-value="180"
496
+ @input=${handleEvent(args)}
497
+ @change=${handleEvent(args)}
498
+ .formatOptions=${{
499
+ style: "unit",
500
+ unit: "degree",
501
+ unitDisplay: "narrow"
502
+ }}
503
+ ...=${spreadProps(args)}
504
+ >
505
+ Angle
506
+ </sp-slider>
507
+ </div>
508
+ `;
509
+ };
510
+ editableWithDefaultValue.swc_vrt = {
511
+ skip: true
512
+ };
513
+ export const editableWithFractionValue = (args = {}) => {
514
+ return html`
515
+ <div style="width: 500px; margin: 12px 20px;">
516
+ <sp-slider
517
+ editable
518
+ max="255"
519
+ min="0.1"
520
+ value="0.5"
521
+ step="0.01"
522
+ default-value="18"
523
+ @input=${handleEvent(args)}
524
+ @change=${handleEvent(args)}
525
+ ...=${spreadProps(args)}
526
+ >
527
+ Angle
528
+ </sp-slider>
529
+ </div>
530
+ `;
531
+ };
532
+ editableWithFractionValue.swc_vrt = {
533
+ skip: true
534
+ };
535
+ export const editableDisabled = (args = {}) => {
536
+ return html`
537
+ <div style="width: 500px; margin: 12px 20px;">
538
+ <sp-slider
539
+ editable
540
+ disabled
541
+ max="360"
542
+ min="0"
543
+ value="90"
544
+ step="1"
545
+ @input=${handleEvent(args)}
546
+ @change=${handleEvent(args)}
547
+ .formatOptions=${{
548
+ style: "unit",
549
+ unit: "degree",
550
+ unitDisplay: "narrow"
551
+ }}
552
+ ...=${spreadProps(args)}
553
+ >
554
+ Angle
555
+ </sp-slider>
556
+ </div>
557
+ `;
558
+ };
559
+ editable.decorators = [editableDecorator];
560
+ export const editableCustom = (args = {}) => {
561
+ return html`
562
+ <div
563
+ style="width: 500px; margin: 12px 20px; --mod-stepper-width: 150px;"
564
+ >
565
+ <sp-slider
566
+ editable
567
+ max="24"
568
+ min="0"
569
+ value="12.75"
570
+ step="0.25"
571
+ @input=${handleEvent(args)}
572
+ @change=${handleEvent(args)}
573
+ .formatOptions=${{ style: "unit", unit: "hour" }}
574
+ ...=${spreadProps(args)}
575
+ >
576
+ Hours
577
+ </sp-slider>
578
+ </div>
579
+ `;
580
+ };
581
+ editableCustom.decorators = [editableDecorator];
582
+ export const editableWithoutVisibleLabels = (args = {}) => {
583
+ return html`
584
+ <div style="width: 500px; margin: 12px 20px;">
585
+ <sp-slider
586
+ editable
587
+ max="1"
588
+ min="0"
589
+ value=".5"
590
+ step="0.01"
591
+ @input=${handleEvent(args)}
592
+ @change=${handleEvent(args)}
593
+ .formatOptions=${{ style: "percent" }}
594
+ ...=${spreadProps(args)}
595
+ >
596
+ Opacity
597
+ </sp-slider>
598
+ </div>
599
+ `;
600
+ };
601
+ editableWithoutVisibleLabels.args = {
602
+ labelVisibility: "none"
603
+ };
604
+ export const hideStepper = (args = {}) => {
605
+ return html`
606
+ <div style="width: 500px; margin: 12px 20px;">
607
+ <sp-slider
608
+ editable
609
+ hide-stepper
610
+ max="1"
611
+ min="0"
612
+ value=".5"
613
+ step="0.01"
614
+ @input=${handleEvent(args)}
615
+ @change=${handleEvent(args)}
616
+ .formatOptions=${{ style: "percent" }}
617
+ ...=${spreadProps(args)}
618
+ >
619
+ Opacity
620
+ </sp-slider>
621
+ </div>
622
+ `;
623
+ };
624
+ hideStepper.decorators = [editableDecorator];
625
+ export const Gradient = (args = {}) => {
626
+ return html`
627
+ <style>
628
+ sp-slider {
629
+ --mod-slider-track-color: linear-gradient(
630
+ to right,
631
+ red,
632
+ green 100%
633
+ );
634
+ }
635
+ sp-slider[dir='rtl'] {
636
+ --mod-slider-track-color: linear-gradient(
637
+ to left,
638
+ red,
639
+ green 100%
640
+ );
641
+ }
642
+ </style>
643
+ <div
644
+ style="
645
+ width: 500px;
646
+ margin: 12px 20px;
647
+ "
648
+ >
649
+ <sp-slider
650
+ label="Opacity"
651
+ max="100"
652
+ min="0"
653
+ value="50"
654
+ id="opacity-slider"
655
+ @input=${handleEvent(args)}
656
+ @change=${handleEvent(args)}
657
+ ...=${spreadProps(args)}
658
+ ></sp-slider>
659
+ </div>
660
+ `;
661
+ };
662
+ Gradient.args = {
663
+ variant: void 0
664
+ };
665
+ export const tick = (args = {}) => {
666
+ return html`
667
+ <sp-slider
668
+ label="Slider Label"
669
+ variant="tick"
670
+ min="0"
671
+ max="92"
672
+ ...=${spreadProps(args)}
673
+ ></sp-slider>
674
+ <sp-slider
675
+ label="Slider Label"
676
+ variant="tick"
677
+ min="0"
678
+ max="92"
679
+ ...=${spreadProps(args)}
680
+ ></sp-slider>
681
+ `;
682
+ };
683
+ tick.args = {
684
+ variant: "tick",
685
+ tickStep: 5
686
+ };
687
+ export const tickLabels = (args = {}) => {
688
+ return html`
689
+ <sp-slider
690
+ label="Slider Label"
691
+ tick-labels
692
+ variant="tick"
693
+ min="50"
694
+ max="75"
695
+ ...=${spreadProps(args)}
696
+ ></sp-slider>
697
+ <sp-slider
698
+ label="Slider Label"
699
+ tick-labels
700
+ variant="tick"
701
+ min="50"
702
+ max="75"
703
+ ...=${spreadProps(args)}
704
+ ></sp-slider>
705
+ `;
706
+ };
707
+ tickLabels.args = {
708
+ variant: "tick",
709
+ tickStep: 5
710
+ };
711
+ export const Disabled = (args = {}) => {
712
+ return html`
713
+ <div style="width: 500px; margin: 12px 20px;">
714
+ <sp-slider
715
+ disabled
716
+ value="5"
717
+ step="0.5"
718
+ min="0"
719
+ max="20"
720
+ label="Intensity"
721
+ ...=${spreadProps(args)}
722
+ ></sp-slider>
723
+ </div>
724
+ `;
725
+ };
726
+ export const Quiet = (args = {}) => {
727
+ return html`
728
+ <div style="width: 500px; margin: 12px 20px;">
729
+ <sp-slider
730
+ editable
731
+ hide-stepper
732
+ quiet
733
+ value="5"
734
+ step="0.5"
735
+ min="0"
736
+ max="20"
737
+ label="Intensity"
738
+ ...=${spreadProps(args)}
739
+ ></sp-slider>
740
+ </div>
741
+ `;
742
+ };
743
+ export const inPopover = (args = {}) => {
744
+ return html`
745
+ <sp-popover open style="min-width: 0">
746
+ <sp-dialog no-divider>
747
+ <sp-slider
748
+ editable
749
+ hide-stepper
750
+ quiet
751
+ value="5"
752
+ step="0.5"
753
+ min="0"
754
+ max="20"
755
+ label="Intensity"
756
+ ...=${spreadProps(args)}
757
+ ></sp-slider>
758
+ </sp-dialog>
759
+ </sp-popover>
760
+ `;
761
+ };
762
+ export const Indeterminate = (args = {}) => {
763
+ return html`
764
+ <div style="width: 500px; margin: 12px 20px;">
765
+ <sp-slider
766
+ editable
767
+ indeterminate
768
+ value="5"
769
+ step="0.5"
770
+ min="0"
771
+ max="20"
772
+ label="Intensity"
773
+ @input=${handleEvent(args)}
774
+ @change=${handleEvent(args)}
775
+ ...=${spreadProps(args)}
776
+ ></sp-slider>
777
+ </div>
778
+ `;
779
+ };
780
+ export const ExplicitHandle = (args = {}) => {
781
+ return html`
782
+ <div style="width: 500px; margin: 12px 20px;">
783
+ <sp-slider
784
+ step="0.5"
785
+ min="0"
786
+ max="20"
787
+ @input=${handleHandleEvent(args)}
788
+ @change=${handleHandleEvent(args)}
789
+ ...=${spreadProps(args)}
790
+ >
791
+ Intensity
792
+ <sp-slider-handle slot="handle" value="5"></sp-slider-handle>
793
+ </sp-slider>
794
+ </div>
795
+ `;
796
+ };
797
+ export const TwoHandles = (args = {}) => {
798
+ return html`
799
+ <div style="width: 500px; margin: 12px 20px;">
800
+ <sp-slider
801
+ value="5"
802
+ step="1"
803
+ min="0"
804
+ max="255"
805
+ @input=${handleHandleEvent(args)}
806
+ @change=${handleHandleEvent(args)}
807
+ ...=${spreadProps(args)}
808
+ >
809
+ Output Levels
810
+ <sp-slider-handle
811
+ slot="handle"
812
+ name="min"
813
+ label="Minimum"
814
+ value="5"
815
+ ></sp-slider-handle>
816
+ <sp-slider-handle
817
+ slot="handle"
818
+ name="max"
819
+ label="Maximum"
820
+ value="250"
821
+ ></sp-slider-handle>
822
+ </sp-slider>
823
+ </div>
824
+ `;
825
+ };
826
+ TwoHandles.args = {
827
+ variant: "range",
828
+ tickStep: 10
829
+ };
830
+ export const TwoHandlesPt = (args = {}) => {
831
+ return html`
832
+ <div style="width: 500px; margin: 12px 20px;">
833
+ <sp-slider
834
+ value="5"
835
+ step="1"
836
+ min="0"
837
+ max="255"
838
+ @input=${handleHandleEvent(args)}
839
+ @change=${handleHandleEvent(args)}
840
+ .formatOptions=${{
841
+ style: "unit",
842
+ unit: "pt"
843
+ }}
844
+ ...=${spreadProps(args)}
845
+ >
846
+ Output Levels
847
+ <sp-slider-handle
848
+ slot="handle"
849
+ name="min"
850
+ label="Minimum"
851
+ value="5"
852
+ ></sp-slider-handle>
853
+ <sp-slider-handle
854
+ slot="handle"
855
+ name="max"
856
+ label="Maximum"
857
+ value="250"
858
+ ></sp-slider-handle>
859
+ </sp-slider>
860
+ </div>
861
+ `;
862
+ };
863
+ TwoHandlesPt.args = {
864
+ variant: "range",
865
+ tickStep: 10
866
+ };
867
+ export const ThreeHandlesPc = (args = {}) => {
868
+ return html`
869
+ <div style="width: 500px; margin: 12px 20px;">
870
+ <sp-slider
871
+ value="5"
872
+ step="1"
873
+ min="0"
874
+ max="255"
875
+ @input=${handleHandleEvent(args)}
876
+ @change=${handleHandleEvent(args)}
877
+ .formatOptions=${{ style: "unit", unit: "pc" }}
878
+ ...=${spreadProps(args)}
879
+ >
880
+ Output Levels
881
+ <sp-slider-handle
882
+ slot="handle"
883
+ value="5"
884
+ label="Low"
885
+ ></sp-slider-handle>
886
+ <sp-slider-handle
887
+ slot="handle"
888
+ value="133"
889
+ label="Mid"
890
+ ></sp-slider-handle>
891
+ <sp-slider-handle
892
+ slot="handle"
893
+ value="250"
894
+ label="High"
895
+ ></sp-slider-handle>
896
+ </sp-slider>
897
+ </div>
898
+ `;
899
+ };
900
+ ThreeHandlesPc.args = {
901
+ variant: "range"
902
+ };
903
+ export const ThreeHandlesOrdered = (args = {}) => {
904
+ return html`
905
+ <div style="width: 500px; margin: 12px 20px;">
906
+ <sp-slider
907
+ step="1"
908
+ min="0"
909
+ max="255"
910
+ @input=${handleHandleEvent(args)}
911
+ @change=${handleHandleEvent(args)}
912
+ ...=${spreadProps(args)}
913
+ >
914
+ Output Levels
915
+ <sp-slider-handle
916
+ slot="handle"
917
+ name="low"
918
+ label="Low"
919
+ value="5"
920
+ max="next"
921
+ ></sp-slider-handle>
922
+ <sp-slider-handle
923
+ slot="handle"
924
+ name="mid"
925
+ label="Mid"
926
+ value="100"
927
+ min="previous"
928
+ max="next"
929
+ ></sp-slider-handle>
930
+ <sp-slider-handle
931
+ slot="handle"
932
+ name="high"
933
+ label="High"
934
+ value="250"
935
+ min="previous"
936
+ ></sp-slider-handle>
937
+ </sp-slider>
938
+ </div>
939
+ `;
940
+ };
941
+ ThreeHandlesOrdered.args = {
942
+ variant: "range",
943
+ tickStep: 10
944
+ };
945
+ export const ThreeHandlesComplex = (args = {}) => {
946
+ const values = {
947
+ black: 50,
948
+ gray: 4.98,
949
+ white: 225
950
+ };
951
+ const handleEvent2 = ({ onInput, onChange }) => (event) => {
952
+ const target = event.target;
953
+ if (target.value != null) {
954
+ if (typeof target.value === "object") {
955
+ const value = JSON.stringify(target.value, null, 2);
956
+ if (onInput && event.type === "input") {
957
+ onInput(value);
958
+ } else if (onChange && event.type === "change") {
959
+ onChange(value);
960
+ }
961
+ } else {
962
+ const value = `${target.name}: ${target.value}`;
963
+ if (onInput && event.type === "input") {
964
+ onInput(value);
965
+ } else if (onChange && event.type === "change") {
966
+ onChange(value);
967
+ }
968
+ }
969
+ values[target.name] = target.value;
970
+ }
971
+ };
972
+ const grayNormalization = {
973
+ toNormalized(value) {
974
+ const normalizedBlack = values.black / 255;
975
+ const normalizedWhite = values.white / 255;
976
+ const clamped = Math.max(Math.min(value, 1), 0);
977
+ return clamped * (normalizedWhite - normalizedBlack) + normalizedBlack;
978
+ },
979
+ fromNormalized(value) {
980
+ const normalizedBlack = values.black / 255;
981
+ const normalizedWhite = values.white / 255;
982
+ const clamped = Math.max(
983
+ Math.min(value, normalizedWhite),
984
+ normalizedBlack
985
+ );
986
+ return (clamped - normalizedBlack) / (normalizedWhite - normalizedBlack);
987
+ }
988
+ };
989
+ const blackNormalization = {
990
+ toNormalized(value) {
991
+ const clamped = Math.min(value, values.white);
992
+ return clamped / 255;
993
+ },
994
+ fromNormalized(value) {
995
+ const denormalized = value * 255;
996
+ return Math.min(denormalized, values.white);
997
+ }
998
+ };
999
+ const whiteNormalization = {
1000
+ toNormalized(value) {
1001
+ const clamped = Math.max(value, values.black);
1002
+ return clamped / 255;
1003
+ },
1004
+ fromNormalized(value) {
1005
+ const denormalized = value * 255;
1006
+ return Math.max(denormalized, values.black);
1007
+ }
1008
+ };
1009
+ const computeGray = (value) => {
1010
+ let result = 1;
1011
+ if (value > 0.5) {
1012
+ result = Math.max(2 * (1 - value), 0.01);
1013
+ } else if (value < 0.5) {
1014
+ result = ((1 - 2 * value) * (Math.sqrt(9.99) - 1) + 1) ** 2;
1015
+ }
1016
+ const formatOptions = {
1017
+ maximumFractionDigits: 2,
1018
+ minimumFractionDigits: 2
1019
+ };
1020
+ return new Intl.NumberFormat(navigator.language, formatOptions).format(
1021
+ result
1022
+ );
1023
+ };
1024
+ return html`
1025
+ <div style="width: 500px; margin: 12px 20px;">
1026
+ <sp-slider
1027
+ step="1"
1028
+ min="0"
1029
+ max="255"
1030
+ @input=${handleEvent2}
1031
+ @change=${handleEvent2}
1032
+ ...=${spreadProps(args)}
1033
+ >
1034
+ Output Levels
1035
+ <sp-slider-handle
1036
+ slot="handle"
1037
+ name="black"
1038
+ label="Black"
1039
+ value=${values.black}
1040
+ .normalization=${blackNormalization}
1041
+ ></sp-slider-handle>
1042
+ <sp-slider-handle
1043
+ slot="handle"
1044
+ name="gray"
1045
+ label="Gray"
1046
+ value="0.215"
1047
+ min="0"
1048
+ max="1"
1049
+ step="0.005"
1050
+ .normalization=${grayNormalization}
1051
+ .getAriaHandleText=${computeGray}
1052
+ ></sp-slider-handle>
1053
+ <sp-slider-handle
1054
+ slot="handle"
1055
+ name="white"
1056
+ label="White"
1057
+ value=${values.white}
1058
+ .normalization=${whiteNormalization}
1059
+ ></sp-slider-handle>
1060
+ </sp-slider>
1061
+ </div>
1062
+ `;
1063
+ };
1064
+ ThreeHandlesComplex.args = {
1065
+ variant: "range",
1066
+ tickStep: 10
1067
+ };
1068
+ export const focusTabDemo = (args = {}) => {
1069
+ const value = 50;
1070
+ const min = 0;
1071
+ const max = 100;
1072
+ const step = 1;
1073
+ return html`
1074
+ <div style="width: 500px; margin: 12px 20px 20px;">
1075
+ <sp-slider
1076
+ value="${value}"
1077
+ step="${step}"
1078
+ min="${min}"
1079
+ max="${max}"
1080
+ label="Opacity"
1081
+ id="opacity-slider-opacity"
1082
+ ...=${spreadProps(args)}
1083
+ ></sp-slider>
1084
+ </div>
1085
+ <div style="width: 500px; margin: 20px;">
1086
+ <sp-slider
1087
+ value="${value}"
1088
+ step="${step}"
1089
+ min="${min}"
1090
+ max="${max}"
1091
+ label="Lightness"
1092
+ id="opacity-slider-lightness"
1093
+ ...=${spreadProps(args)}
1094
+ ></sp-slider>
1095
+ </div>
1096
+ <div style="width: 500px; margin: 20px 20px 12px;">
1097
+ <sp-slider
1098
+ value="${value}"
1099
+ step="${step}"
1100
+ min="${min}"
1101
+ max="${max}"
1102
+ label="Saturation"
1103
+ id="opacity-slider-saturation"
1104
+ ...=${spreadProps(args)}
1105
+ ></sp-slider>
1106
+ </div>
1107
+ `;
1108
+ };
1109
+ //# sourceMappingURL=slider.stories.js.map