@spectrum-web-components/slider 1.1.0 → 1.1.1

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 (72) hide show
  1. package/package.json +8 -8
  2. package/sp-slider-handle.d.ts +6 -0
  3. package/sp-slider-handle.dev.js +5 -0
  4. package/sp-slider-handle.dev.js.map +7 -0
  5. package/sp-slider-handle.js +2 -0
  6. package/sp-slider-handle.js.map +7 -0
  7. package/sp-slider.d.ts +7 -0
  8. package/sp-slider.dev.js +6 -0
  9. package/sp-slider.dev.js.map +7 -0
  10. package/sp-slider.js +2 -0
  11. package/sp-slider.js.map +7 -0
  12. package/src/HandleController.d.ts +116 -0
  13. package/src/HandleController.dev.js +553 -0
  14. package/src/HandleController.dev.js.map +7 -0
  15. package/src/HandleController.js +34 -0
  16. package/src/HandleController.js.map +7 -0
  17. package/src/Slider.d.ts +97 -0
  18. package/src/Slider.dev.js +481 -0
  19. package/src/Slider.dev.js.map +7 -0
  20. package/src/Slider.js +105 -0
  21. package/src/Slider.js.map +7 -0
  22. package/src/SliderHandle.d.ts +57 -0
  23. package/src/SliderHandle.dev.js +179 -0
  24. package/src/SliderHandle.dev.js.map +7 -0
  25. package/src/SliderHandle.js +2 -0
  26. package/src/SliderHandle.js.map +7 -0
  27. package/src/index.d.ts +3 -0
  28. package/src/index.dev.js +5 -0
  29. package/src/index.dev.js.map +7 -0
  30. package/src/index.js +2 -0
  31. package/src/index.js.map +7 -0
  32. package/src/slider-overrides.css.d.ts +2 -0
  33. package/src/slider-overrides.css.dev.js +7 -0
  34. package/src/slider-overrides.css.dev.js.map +7 -0
  35. package/src/slider-overrides.css.js +4 -0
  36. package/src/slider-overrides.css.js.map +7 -0
  37. package/src/slider.css.d.ts +2 -0
  38. package/src/slider.css.dev.js +7 -0
  39. package/src/slider.css.dev.js.map +7 -0
  40. package/src/slider.css.js +4 -0
  41. package/src/slider.css.js.map +7 -0
  42. package/src/spectrum-slider.css.d.ts +2 -0
  43. package/src/spectrum-slider.css.dev.js +7 -0
  44. package/src/spectrum-slider.css.dev.js.map +7 -0
  45. package/src/spectrum-slider.css.js +4 -0
  46. package/src/spectrum-slider.css.js.map +7 -0
  47. package/stories/slider-sizes.stories.js +36 -0
  48. package/stories/slider-sizes.stories.js.map +7 -0
  49. package/stories/slider.stories.js +1121 -0
  50. package/stories/slider.stories.js.map +7 -0
  51. package/sync/sp-slider.dev.js +4 -0
  52. package/sync/sp-slider.dev.js.map +7 -0
  53. package/sync/sp-slider.js +2 -0
  54. package/sync/sp-slider.js.map +7 -0
  55. package/test/benchmark/test-basic.js +15 -0
  56. package/test/benchmark/test-basic.js.map +7 -0
  57. package/test/index.js +286 -0
  58. package/test/index.js.map +7 -0
  59. package/test/slider-editable-sync.test.js +5 -0
  60. package/test/slider-editable-sync.test.js.map +7 -0
  61. package/test/slider-editable.test.js +5 -0
  62. package/test/slider-editable.test.js.map +7 -0
  63. package/test/slider-handle-upgrade.test.js +28 -0
  64. package/test/slider-handle-upgrade.test.js.map +7 -0
  65. package/test/slider-memory.test.js +8 -0
  66. package/test/slider-memory.test.js.map +7 -0
  67. package/test/slider-sizes.test-vrt.js +5 -0
  68. package/test/slider-sizes.test-vrt.js.map +7 -0
  69. package/test/slider.test-vrt.js +5 -0
  70. package/test/slider.test-vrt.js.map +7 -0
  71. package/test/slider.test.js +1522 -0
  72. package/test/slider.test.js.map +7 -0
@@ -0,0 +1,1121 @@
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
+ max20.parameters = {
399
+ // Disables Chromatic's snapshotting on a global level
400
+ chromatic: { disableSnapshot: true }
401
+ };
402
+ export const editable = (args = {}) => {
403
+ return html`
404
+ <div style="width: 500px; margin: 12px 20px;">
405
+ <sp-slider
406
+ editable
407
+ max="360"
408
+ min="0"
409
+ value="90"
410
+ step="1"
411
+ @input=${handleEvent(args)}
412
+ @change=${handleEvent(args)}
413
+ .formatOptions=${{
414
+ style: "unit",
415
+ unit: "degree",
416
+ unitDisplay: "narrow"
417
+ }}
418
+ ...=${spreadProps(args)}
419
+ >
420
+ Angle
421
+ </sp-slider>
422
+ </div>
423
+ `;
424
+ };
425
+ editable.decorators = [editableDecorator];
426
+ import "@spectrum-web-components/slider/sp-slider.js";
427
+ import "@spectrum-web-components/overlay/overlay-trigger.js";
428
+ import "@spectrum-web-components/button/sp-button.js";
429
+ import "@spectrum-web-components/tray/sp-tray.js";
430
+ export const Multiple = (args) => {
431
+ const updateSliderConfig = (min, max, value, step) => {
432
+ const slider = document.querySelector("sp-slider");
433
+ if (slider) {
434
+ slider.value = value;
435
+ slider.min = min;
436
+ slider.max = max;
437
+ slider.step = step;
438
+ }
439
+ };
440
+ return html`
441
+ <overlay-trigger type="modal">
442
+ <sp-button slot="trigger" variant="secondary">
443
+ Toggle menu
444
+ </sp-button>
445
+ <sp-tray slot="click-content">
446
+ <div style="padding: 8px; width: 100%">
447
+ <sp-slider
448
+ label="Slider Label"
449
+ min=${args.min}
450
+ max=${args.max}
451
+ value=${args.value}
452
+ step=${args.step}
453
+ variant="filled"
454
+ hide-stepper
455
+ editable
456
+ ></sp-slider>
457
+ <div
458
+ style="display: grid; gap: 8px; padding: 8px; width: 50%; margin: auto;"
459
+ >
460
+ <sp-button
461
+ size="s"
462
+ @click=${() => updateSliderConfig(0.25, 4, 0.75, 0.01)}
463
+ >
464
+ Duration
465
+ </sp-button>
466
+ <sp-button
467
+ size="s"
468
+ @click=${() => updateSliderConfig(2, 100, 2, 1)}
469
+ >
470
+ Personality
471
+ </sp-button>
472
+ <sp-button
473
+ size="s"
474
+ @click=${() => updateSliderConfig(2, 25, 3, 1)}
475
+ >
476
+ Intensity
477
+ </sp-button>
478
+ </div>
479
+ </div>
480
+ </sp-tray>
481
+ </overlay-trigger>
482
+ `;
483
+ };
484
+ Multiple.args = {
485
+ min: 0.25,
486
+ max: 4,
487
+ value: 0.75,
488
+ step: 0.01
489
+ };
490
+ export const editableWithDefaultValue = (args = {}) => {
491
+ return html`
492
+ <div style="width: 500px; margin: 12px 20px;">
493
+ <sp-slider
494
+ editable
495
+ max="360"
496
+ min="0"
497
+ value="90"
498
+ step="1"
499
+ default-value="180"
500
+ @input=${handleEvent(args)}
501
+ @change=${handleEvent(args)}
502
+ .formatOptions=${{
503
+ style: "unit",
504
+ unit: "degree",
505
+ unitDisplay: "narrow"
506
+ }}
507
+ ...=${spreadProps(args)}
508
+ >
509
+ Angle
510
+ </sp-slider>
511
+ </div>
512
+ `;
513
+ };
514
+ editableWithDefaultValue.swc_vrt = {
515
+ skip: true
516
+ };
517
+ editableWithDefaultValue.parameters = {
518
+ // Disables Chromatic's snapshotting on a global level
519
+ chromatic: { disableSnapshot: true }
520
+ };
521
+ export const editableWithFractionValue = (args = {}) => {
522
+ return html`
523
+ <div style="width: 500px; margin: 12px 20px;">
524
+ <sp-slider
525
+ editable
526
+ max="255"
527
+ min="0.1"
528
+ value="0.5"
529
+ step="0.01"
530
+ default-value="18"
531
+ @input=${handleEvent(args)}
532
+ @change=${handleEvent(args)}
533
+ ...=${spreadProps(args)}
534
+ >
535
+ Angle
536
+ </sp-slider>
537
+ </div>
538
+ `;
539
+ };
540
+ editableWithFractionValue.swc_vrt = {
541
+ skip: true
542
+ };
543
+ editableWithFractionValue.parameters = {
544
+ // Disables Chromatic's snapshotting on a global level
545
+ chromatic: { disableSnapshot: true }
546
+ };
547
+ export const editableDisabled = (args = {}) => {
548
+ return html`
549
+ <div style="width: 500px; margin: 12px 20px;">
550
+ <sp-slider
551
+ editable
552
+ disabled
553
+ max="360"
554
+ min="0"
555
+ value="90"
556
+ step="1"
557
+ @input=${handleEvent(args)}
558
+ @change=${handleEvent(args)}
559
+ .formatOptions=${{
560
+ style: "unit",
561
+ unit: "degree",
562
+ unitDisplay: "narrow"
563
+ }}
564
+ ...=${spreadProps(args)}
565
+ >
566
+ Angle
567
+ </sp-slider>
568
+ </div>
569
+ `;
570
+ };
571
+ editable.decorators = [editableDecorator];
572
+ export const editableCustom = (args = {}) => {
573
+ return html`
574
+ <div
575
+ style="width: 500px; margin: 12px 20px; --mod-stepper-width: 150px;"
576
+ >
577
+ <sp-slider
578
+ editable
579
+ max="24"
580
+ min="0"
581
+ value="12.75"
582
+ step="0.25"
583
+ @input=${handleEvent(args)}
584
+ @change=${handleEvent(args)}
585
+ .formatOptions=${{ style: "unit", unit: "hour" }}
586
+ ...=${spreadProps(args)}
587
+ >
588
+ Hours
589
+ </sp-slider>
590
+ </div>
591
+ `;
592
+ };
593
+ editableCustom.decorators = [editableDecorator];
594
+ export const editableWithoutVisibleLabels = (args = {}) => {
595
+ return html`
596
+ <div style="width: 500px; margin: 12px 20px;">
597
+ <sp-slider
598
+ editable
599
+ max="1"
600
+ min="0"
601
+ value=".5"
602
+ step="0.01"
603
+ @input=${handleEvent(args)}
604
+ @change=${handleEvent(args)}
605
+ .formatOptions=${{ style: "percent" }}
606
+ ...=${spreadProps(args)}
607
+ >
608
+ Opacity
609
+ </sp-slider>
610
+ </div>
611
+ `;
612
+ };
613
+ editableWithoutVisibleLabels.args = {
614
+ labelVisibility: "none"
615
+ };
616
+ export const hideStepper = (args = {}) => {
617
+ return html`
618
+ <div style="width: 500px; margin: 12px 20px;">
619
+ <sp-slider
620
+ editable
621
+ hide-stepper
622
+ max="1"
623
+ min="0"
624
+ value=".5"
625
+ step="0.01"
626
+ @input=${handleEvent(args)}
627
+ @change=${handleEvent(args)}
628
+ .formatOptions=${{ style: "percent" }}
629
+ ...=${spreadProps(args)}
630
+ >
631
+ Opacity
632
+ </sp-slider>
633
+ </div>
634
+ `;
635
+ };
636
+ hideStepper.decorators = [editableDecorator];
637
+ export const Gradient = (args = {}) => {
638
+ return html`
639
+ <style>
640
+ sp-slider {
641
+ --mod-slider-track-color: linear-gradient(
642
+ to right,
643
+ red,
644
+ green 100%
645
+ );
646
+ }
647
+ sp-slider[dir='rtl'] {
648
+ --mod-slider-track-color: linear-gradient(
649
+ to left,
650
+ red,
651
+ green 100%
652
+ );
653
+ }
654
+ </style>
655
+ <div
656
+ style="
657
+ width: 500px;
658
+ margin: 12px 20px;
659
+ "
660
+ >
661
+ <sp-slider
662
+ label="Opacity"
663
+ max="100"
664
+ min="0"
665
+ value="50"
666
+ id="opacity-slider"
667
+ @input=${handleEvent(args)}
668
+ @change=${handleEvent(args)}
669
+ ...=${spreadProps(args)}
670
+ ></sp-slider>
671
+ </div>
672
+ `;
673
+ };
674
+ Gradient.args = {
675
+ variant: void 0
676
+ };
677
+ export const tick = (args = {}) => {
678
+ return html`
679
+ <sp-slider
680
+ label="Slider Label"
681
+ variant="tick"
682
+ min="0"
683
+ max="92"
684
+ ...=${spreadProps(args)}
685
+ ></sp-slider>
686
+ <sp-slider
687
+ label="Slider Label"
688
+ variant="tick"
689
+ min="0"
690
+ max="92"
691
+ ...=${spreadProps(args)}
692
+ ></sp-slider>
693
+ `;
694
+ };
695
+ tick.args = {
696
+ variant: "tick",
697
+ tickStep: 5
698
+ };
699
+ export const tickLabels = (args = {}) => {
700
+ return html`
701
+ <sp-slider
702
+ label="Slider Label"
703
+ tick-labels
704
+ variant="tick"
705
+ min="50"
706
+ max="75"
707
+ ...=${spreadProps(args)}
708
+ ></sp-slider>
709
+ <sp-slider
710
+ label="Slider Label"
711
+ tick-labels
712
+ variant="tick"
713
+ min="50"
714
+ max="75"
715
+ ...=${spreadProps(args)}
716
+ ></sp-slider>
717
+ `;
718
+ };
719
+ tickLabels.args = {
720
+ variant: "tick",
721
+ tickStep: 5
722
+ };
723
+ export const Disabled = (args = {}) => {
724
+ return html`
725
+ <div style="width: 500px; margin: 12px 20px;">
726
+ <sp-slider
727
+ disabled
728
+ value="5"
729
+ step="0.5"
730
+ min="0"
731
+ max="20"
732
+ label="Intensity"
733
+ ...=${spreadProps(args)}
734
+ ></sp-slider>
735
+ </div>
736
+ `;
737
+ };
738
+ export const Quiet = (args = {}) => {
739
+ return html`
740
+ <div style="width: 500px; margin: 12px 20px;">
741
+ <sp-slider
742
+ editable
743
+ hide-stepper
744
+ quiet
745
+ value="5"
746
+ step="0.5"
747
+ min="0"
748
+ max="20"
749
+ label="Intensity"
750
+ ...=${spreadProps(args)}
751
+ ></sp-slider>
752
+ </div>
753
+ `;
754
+ };
755
+ export const inPopover = (args = {}) => {
756
+ return html`
757
+ <sp-popover open style="min-width: 0">
758
+ <sp-dialog no-divider>
759
+ <sp-slider
760
+ editable
761
+ hide-stepper
762
+ quiet
763
+ value="5"
764
+ step="0.5"
765
+ min="0"
766
+ max="20"
767
+ label="Intensity"
768
+ ...=${spreadProps(args)}
769
+ ></sp-slider>
770
+ </sp-dialog>
771
+ </sp-popover>
772
+ `;
773
+ };
774
+ export const Indeterminate = (args = {}) => {
775
+ return html`
776
+ <div style="width: 500px; margin: 12px 20px;">
777
+ <sp-slider
778
+ editable
779
+ indeterminate
780
+ value="5"
781
+ step="0.5"
782
+ min="0"
783
+ max="20"
784
+ label="Intensity"
785
+ @input=${handleEvent(args)}
786
+ @change=${handleEvent(args)}
787
+ ...=${spreadProps(args)}
788
+ ></sp-slider>
789
+ </div>
790
+ `;
791
+ };
792
+ export const ExplicitHandle = (args = {}) => {
793
+ return html`
794
+ <div style="width: 500px; margin: 12px 20px;">
795
+ <sp-slider
796
+ step="0.5"
797
+ min="0"
798
+ max="20"
799
+ @input=${handleHandleEvent(args)}
800
+ @change=${handleHandleEvent(args)}
801
+ ...=${spreadProps(args)}
802
+ >
803
+ Intensity
804
+ <sp-slider-handle slot="handle" value="5"></sp-slider-handle>
805
+ </sp-slider>
806
+ </div>
807
+ `;
808
+ };
809
+ export const TwoHandles = (args = {}) => {
810
+ return html`
811
+ <div style="width: 500px; margin: 12px 20px;">
812
+ <sp-slider
813
+ value="5"
814
+ step="1"
815
+ min="0"
816
+ max="255"
817
+ @input=${handleHandleEvent(args)}
818
+ @change=${handleHandleEvent(args)}
819
+ ...=${spreadProps(args)}
820
+ >
821
+ Output Levels
822
+ <sp-slider-handle
823
+ slot="handle"
824
+ name="min"
825
+ label="Minimum"
826
+ value="5"
827
+ ></sp-slider-handle>
828
+ <sp-slider-handle
829
+ slot="handle"
830
+ name="max"
831
+ label="Maximum"
832
+ value="250"
833
+ ></sp-slider-handle>
834
+ </sp-slider>
835
+ </div>
836
+ `;
837
+ };
838
+ TwoHandles.args = {
839
+ variant: "range",
840
+ tickStep: 10
841
+ };
842
+ export const TwoHandlesPt = (args = {}) => {
843
+ return html`
844
+ <div style="width: 500px; margin: 12px 20px;">
845
+ <sp-slider
846
+ value="5"
847
+ step="1"
848
+ min="0"
849
+ max="255"
850
+ @input=${handleHandleEvent(args)}
851
+ @change=${handleHandleEvent(args)}
852
+ .formatOptions=${{
853
+ style: "unit",
854
+ unit: "pt"
855
+ }}
856
+ ...=${spreadProps(args)}
857
+ >
858
+ Output Levels
859
+ <sp-slider-handle
860
+ slot="handle"
861
+ name="min"
862
+ label="Minimum"
863
+ value="5"
864
+ ></sp-slider-handle>
865
+ <sp-slider-handle
866
+ slot="handle"
867
+ name="max"
868
+ label="Maximum"
869
+ value="250"
870
+ ></sp-slider-handle>
871
+ </sp-slider>
872
+ </div>
873
+ `;
874
+ };
875
+ TwoHandlesPt.args = {
876
+ variant: "range",
877
+ tickStep: 10
878
+ };
879
+ export const ThreeHandlesPc = (args = {}) => {
880
+ return html`
881
+ <div style="width: 500px; margin: 12px 20px;">
882
+ <sp-slider
883
+ value="5"
884
+ step="1"
885
+ min="0"
886
+ max="255"
887
+ @input=${handleHandleEvent(args)}
888
+ @change=${handleHandleEvent(args)}
889
+ .formatOptions=${{ style: "unit", unit: "pc" }}
890
+ ...=${spreadProps(args)}
891
+ >
892
+ Output Levels
893
+ <sp-slider-handle
894
+ slot="handle"
895
+ value="5"
896
+ label="Low"
897
+ ></sp-slider-handle>
898
+ <sp-slider-handle
899
+ slot="handle"
900
+ value="133"
901
+ label="Mid"
902
+ ></sp-slider-handle>
903
+ <sp-slider-handle
904
+ slot="handle"
905
+ value="250"
906
+ label="High"
907
+ ></sp-slider-handle>
908
+ </sp-slider>
909
+ </div>
910
+ `;
911
+ };
912
+ ThreeHandlesPc.args = {
913
+ variant: "range"
914
+ };
915
+ export const ThreeHandlesOrdered = (args = {}) => {
916
+ return html`
917
+ <div style="width: 500px; margin: 12px 20px;">
918
+ <sp-slider
919
+ step="1"
920
+ min="0"
921
+ max="255"
922
+ @input=${handleHandleEvent(args)}
923
+ @change=${handleHandleEvent(args)}
924
+ ...=${spreadProps(args)}
925
+ >
926
+ Output Levels
927
+ <sp-slider-handle
928
+ slot="handle"
929
+ name="low"
930
+ label="Low"
931
+ value="5"
932
+ max="next"
933
+ ></sp-slider-handle>
934
+ <sp-slider-handle
935
+ slot="handle"
936
+ name="mid"
937
+ label="Mid"
938
+ value="100"
939
+ min="previous"
940
+ max="next"
941
+ ></sp-slider-handle>
942
+ <sp-slider-handle
943
+ slot="handle"
944
+ name="high"
945
+ label="High"
946
+ value="250"
947
+ min="previous"
948
+ ></sp-slider-handle>
949
+ </sp-slider>
950
+ </div>
951
+ `;
952
+ };
953
+ ThreeHandlesOrdered.args = {
954
+ variant: "range",
955
+ tickStep: 10
956
+ };
957
+ export const ThreeHandlesComplex = (args = {}) => {
958
+ const values = {
959
+ black: 50,
960
+ gray: 4.98,
961
+ white: 225
962
+ };
963
+ const handleEvent2 = ({ onInput, onChange }) => (event) => {
964
+ const target = event.target;
965
+ if (target.value != null) {
966
+ if (typeof target.value === "object") {
967
+ const value = JSON.stringify(target.value, null, 2);
968
+ if (onInput && event.type === "input") {
969
+ onInput(value);
970
+ } else if (onChange && event.type === "change") {
971
+ onChange(value);
972
+ }
973
+ } else {
974
+ const value = `${target.name}: ${target.value}`;
975
+ if (onInput && event.type === "input") {
976
+ onInput(value);
977
+ } else if (onChange && event.type === "change") {
978
+ onChange(value);
979
+ }
980
+ }
981
+ values[target.name] = target.value;
982
+ }
983
+ };
984
+ const grayNormalization = {
985
+ toNormalized(value) {
986
+ const normalizedBlack = values.black / 255;
987
+ const normalizedWhite = values.white / 255;
988
+ const clamped = Math.max(Math.min(value, 1), 0);
989
+ return clamped * (normalizedWhite - normalizedBlack) + normalizedBlack;
990
+ },
991
+ fromNormalized(value) {
992
+ const normalizedBlack = values.black / 255;
993
+ const normalizedWhite = values.white / 255;
994
+ const clamped = Math.max(
995
+ Math.min(value, normalizedWhite),
996
+ normalizedBlack
997
+ );
998
+ return (clamped - normalizedBlack) / (normalizedWhite - normalizedBlack);
999
+ }
1000
+ };
1001
+ const blackNormalization = {
1002
+ toNormalized(value) {
1003
+ const clamped = Math.min(value, values.white);
1004
+ return clamped / 255;
1005
+ },
1006
+ fromNormalized(value) {
1007
+ const denormalized = value * 255;
1008
+ return Math.min(denormalized, values.white);
1009
+ }
1010
+ };
1011
+ const whiteNormalization = {
1012
+ toNormalized(value) {
1013
+ const clamped = Math.max(value, values.black);
1014
+ return clamped / 255;
1015
+ },
1016
+ fromNormalized(value) {
1017
+ const denormalized = value * 255;
1018
+ return Math.max(denormalized, values.black);
1019
+ }
1020
+ };
1021
+ const computeGray = (value) => {
1022
+ let result = 1;
1023
+ if (value > 0.5) {
1024
+ result = Math.max(2 * (1 - value), 0.01);
1025
+ } else if (value < 0.5) {
1026
+ result = ((1 - 2 * value) * (Math.sqrt(9.99) - 1) + 1) ** 2;
1027
+ }
1028
+ const formatOptions = {
1029
+ maximumFractionDigits: 2,
1030
+ minimumFractionDigits: 2
1031
+ };
1032
+ return new Intl.NumberFormat(navigator.language, formatOptions).format(
1033
+ result
1034
+ );
1035
+ };
1036
+ return html`
1037
+ <div style="width: 500px; margin: 12px 20px;">
1038
+ <sp-slider
1039
+ step="1"
1040
+ min="0"
1041
+ max="255"
1042
+ @input=${handleEvent2}
1043
+ @change=${handleEvent2}
1044
+ ...=${spreadProps(args)}
1045
+ >
1046
+ Output Levels
1047
+ <sp-slider-handle
1048
+ slot="handle"
1049
+ name="black"
1050
+ label="Black"
1051
+ value=${values.black}
1052
+ .normalization=${blackNormalization}
1053
+ ></sp-slider-handle>
1054
+ <sp-slider-handle
1055
+ slot="handle"
1056
+ name="gray"
1057
+ label="Gray"
1058
+ value="0.215"
1059
+ min="0"
1060
+ max="1"
1061
+ step="0.005"
1062
+ .normalization=${grayNormalization}
1063
+ .getAriaHandleText=${computeGray}
1064
+ ></sp-slider-handle>
1065
+ <sp-slider-handle
1066
+ slot="handle"
1067
+ name="white"
1068
+ label="White"
1069
+ value=${values.white}
1070
+ .normalization=${whiteNormalization}
1071
+ ></sp-slider-handle>
1072
+ </sp-slider>
1073
+ </div>
1074
+ `;
1075
+ };
1076
+ ThreeHandlesComplex.args = {
1077
+ variant: "range",
1078
+ tickStep: 10
1079
+ };
1080
+ export const focusTabDemo = (args = {}) => {
1081
+ const value = 50;
1082
+ const min = 0;
1083
+ const max = 100;
1084
+ const step = 1;
1085
+ return html`
1086
+ <div style="width: 500px; margin: 12px 20px 20px;">
1087
+ <sp-slider
1088
+ value="${value}"
1089
+ step="${step}"
1090
+ min="${min}"
1091
+ max="${max}"
1092
+ label="Opacity"
1093
+ id="opacity-slider-opacity"
1094
+ ...=${spreadProps(args)}
1095
+ ></sp-slider>
1096
+ </div>
1097
+ <div style="width: 500px; margin: 20px;">
1098
+ <sp-slider
1099
+ value="${value}"
1100
+ step="${step}"
1101
+ min="${min}"
1102
+ max="${max}"
1103
+ label="Lightness"
1104
+ id="opacity-slider-lightness"
1105
+ ...=${spreadProps(args)}
1106
+ ></sp-slider>
1107
+ </div>
1108
+ <div style="width: 500px; margin: 20px 20px 12px;">
1109
+ <sp-slider
1110
+ value="${value}"
1111
+ step="${step}"
1112
+ min="${min}"
1113
+ max="${max}"
1114
+ label="Saturation"
1115
+ id="opacity-slider-saturation"
1116
+ ...=${spreadProps(args)}
1117
+ ></sp-slider>
1118
+ </div>
1119
+ `;
1120
+ };
1121
+ //# sourceMappingURL=slider.stories.js.map