@salt-ds/core 1.43.0 → 1.44.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 (64) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/css/salt-core.css +256 -1
  3. package/dist-cjs/index.js +4 -0
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/slider/RangeSlider.js +188 -0
  6. package/dist-cjs/slider/RangeSlider.js.map +1 -0
  7. package/dist-cjs/slider/Slider.js +151 -0
  8. package/dist-cjs/slider/Slider.js.map +1 -0
  9. package/dist-cjs/slider/internal/SliderThumb.css.js +6 -0
  10. package/dist-cjs/slider/internal/SliderThumb.css.js.map +1 -0
  11. package/dist-cjs/slider/internal/SliderThumb.js +141 -0
  12. package/dist-cjs/slider/internal/SliderThumb.js.map +1 -0
  13. package/dist-cjs/slider/internal/SliderTooltip.css.js +6 -0
  14. package/dist-cjs/slider/internal/SliderTooltip.css.js.map +1 -0
  15. package/dist-cjs/slider/internal/SliderTooltip.js +70 -0
  16. package/dist-cjs/slider/internal/SliderTooltip.js.map +1 -0
  17. package/dist-cjs/slider/internal/SliderTrack.css.js +6 -0
  18. package/dist-cjs/slider/internal/SliderTrack.css.js.map +1 -0
  19. package/dist-cjs/slider/internal/SliderTrack.js +179 -0
  20. package/dist-cjs/slider/internal/SliderTrack.js.map +1 -0
  21. package/dist-cjs/slider/internal/useRangeSliderThumb.js +234 -0
  22. package/dist-cjs/slider/internal/useRangeSliderThumb.js.map +1 -0
  23. package/dist-cjs/slider/internal/useSliderThumb.js +162 -0
  24. package/dist-cjs/slider/internal/useSliderThumb.js.map +1 -0
  25. package/dist-cjs/slider/internal/utils.js +127 -0
  26. package/dist-cjs/slider/internal/utils.js.map +1 -0
  27. package/dist-cjs/switch/Switch.js.map +1 -1
  28. package/dist-es/index.js +2 -0
  29. package/dist-es/index.js.map +1 -1
  30. package/dist-es/slider/RangeSlider.js +186 -0
  31. package/dist-es/slider/RangeSlider.js.map +1 -0
  32. package/dist-es/slider/Slider.js +149 -0
  33. package/dist-es/slider/Slider.js.map +1 -0
  34. package/dist-es/slider/internal/SliderThumb.css.js +4 -0
  35. package/dist-es/slider/internal/SliderThumb.css.js.map +1 -0
  36. package/dist-es/slider/internal/SliderThumb.js +139 -0
  37. package/dist-es/slider/internal/SliderThumb.js.map +1 -0
  38. package/dist-es/slider/internal/SliderTooltip.css.js +4 -0
  39. package/dist-es/slider/internal/SliderTooltip.css.js.map +1 -0
  40. package/dist-es/slider/internal/SliderTooltip.js +68 -0
  41. package/dist-es/slider/internal/SliderTooltip.js.map +1 -0
  42. package/dist-es/slider/internal/SliderTrack.css.js +4 -0
  43. package/dist-es/slider/internal/SliderTrack.css.js.map +1 -0
  44. package/dist-es/slider/internal/SliderTrack.js +177 -0
  45. package/dist-es/slider/internal/SliderTrack.js.map +1 -0
  46. package/dist-es/slider/internal/useRangeSliderThumb.js +232 -0
  47. package/dist-es/slider/internal/useRangeSliderThumb.js.map +1 -0
  48. package/dist-es/slider/internal/useSliderThumb.js +160 -0
  49. package/dist-es/slider/internal/useSliderThumb.js.map +1 -0
  50. package/dist-es/slider/internal/utils.js +119 -0
  51. package/dist-es/slider/internal/utils.js.map +1 -0
  52. package/dist-es/switch/Switch.js.map +1 -1
  53. package/dist-types/index.d.ts +1 -0
  54. package/dist-types/slider/RangeSlider.d.ts +99 -0
  55. package/dist-types/slider/Slider.d.ts +100 -0
  56. package/dist-types/slider/index.d.ts +2 -0
  57. package/dist-types/slider/internal/SliderThumb.d.ts +26 -0
  58. package/dist-types/slider/internal/SliderTooltip.d.ts +6 -0
  59. package/dist-types/slider/internal/SliderTrack.d.ts +24 -0
  60. package/dist-types/slider/internal/useRangeSliderThumb.d.ts +30 -0
  61. package/dist-types/slider/internal/useSliderThumb.d.ts +28 -0
  62. package/dist-types/slider/internal/utils.d.ts +20 -0
  63. package/dist-types/switch/Switch.d.ts +7 -7
  64. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # @salt-ds/core
2
2
 
3
+ ## 1.44.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 7fe2106: Promote updated `Slider` and `RangeSlider` components to core. The update includes:
8
+
9
+ - Improved accessibility and focus behavior.
10
+ - Enhanced API for slider customization, including options like `marks`, `showTicks`, and `showTooltip`.
11
+ - Fixed touch interactions on mobile to allow dragging of the slider thumb without horizontal screen scrolling.
12
+ - Set the default `max` value of the `Slider` and `RangeSlider` as 100 to be consistent with the HTML specification.
13
+
14
+ ```tsx
15
+ <Slider
16
+ min={0}
17
+ max={30}
18
+ defaultValue={15}
19
+ marks={[
20
+ { value: 0, label: "Minimum" },
21
+ { value: 30, label: "Maximum" },
22
+ ]}
23
+ showTicks={true}
24
+ />
25
+ ```
26
+
27
+ ```tsx
28
+ <RangeSlider
29
+ min={0}
30
+ max={30}
31
+ defaultValue={15}
32
+ marks={[
33
+ { value: 0, label: "0" },
34
+ { value: 10, label: "10" },
35
+ { value: 15, label: "15" },
36
+ { value: 19, label: "19" },
37
+ { value: 30, label: "30" },
38
+ ]}
39
+ showTicks={true}
40
+ minLabel="Very low"
41
+ maxLabel="Very high"
42
+ restrictToMarks={true}
43
+ />
44
+ ```
45
+
3
46
  ## 1.43.0
4
47
 
5
48
  ### Minor Changes
package/css/salt-core.css CHANGED
@@ -4557,4 +4557,259 @@ label.saltText small,
4557
4557
  }
4558
4558
  }
4559
4559
 
4560
- /* src/fa7597f6-19b4-4fb6-a9a7-5080ccaa6d59.css */
4560
+ /* src/slider/internal/SliderThumb.css */
4561
+ .saltSliderThumb {
4562
+ align-items: center;
4563
+ background: var(--salt-accent-borderColor);
4564
+ cursor: var(--salt-selectable-cursor-hover);
4565
+ display: flex;
4566
+ height: var(--salt-size-selectable);
4567
+ outline: none;
4568
+ position: absolute;
4569
+ top: calc(((var(--salt-size-selectable) - var(--salt-size-bar)) / 2) * -1);
4570
+ transform: translateX(-50%);
4571
+ width: var(--salt-size-border-strong);
4572
+ touch-action: none;
4573
+ }
4574
+ .saltSliderThumb-disabled {
4575
+ background: var(--salt-accent-borderColor-disabled);
4576
+ pointer-events: none;
4577
+ }
4578
+ .saltSliderThumb-focusVisible {
4579
+ outline-style: var(--salt-focused-outlineStyle);
4580
+ outline-width: var(--salt-focused-outlineWidth);
4581
+ outline-offset: var(--salt-focused-outlineOffset);
4582
+ outline-color: var(--salt-focused-outlineColor);
4583
+ }
4584
+ .saltSliderThumb:active,
4585
+ .saltSliderThumb-dragging {
4586
+ cursor: var(--draggable-grab-cursor-active);
4587
+ }
4588
+ .saltSliderThumb-input {
4589
+ border: 0;
4590
+ appearance: none;
4591
+ cursor: var(--salt-selectable-cursor-hover);
4592
+ height: var(--salt-size-base);
4593
+ left: var(--slider-progressPercentage);
4594
+ margin: 0;
4595
+ opacity: 0.0001;
4596
+ overflow: hidden;
4597
+ -webkit-appearance: none;
4598
+ pointer-events: none;
4599
+ width: var(--salt-size-base);
4600
+ padding: 0;
4601
+ position: absolute;
4602
+ transform: translateX(-50%);
4603
+ }
4604
+ .saltSliderThumb-secondThumb {
4605
+ z-index: 2;
4606
+ }
4607
+ .saltSliderThumb-accessibleText {
4608
+ position: absolute;
4609
+ height: 1px;
4610
+ width: 1px;
4611
+ padding: 0;
4612
+ margin: -1px;
4613
+ overflow: hidden;
4614
+ clip: rect(0, 0, 0, 0);
4615
+ white-space: nowrap;
4616
+ border-width: 0;
4617
+ }
4618
+
4619
+ /* src/slider/internal/SliderTooltip.css */
4620
+ .saltSliderTooltip {
4621
+ background: var(--salt-container-primary-background);
4622
+ border-color: var(--salt-container-primary-borderColor);
4623
+ border-style: var(--saltTooltip-borderStyle, var(--salt-container-borderStyle));
4624
+ border-width: var(--saltTooltip-borderWidth, var(--salt-size-border));
4625
+ border-radius: var(--saltTooltip-borderRadius, var(--salt-palette-corner-weak, 0));
4626
+ box-shadow: var(--saltTooltip-shadow, var(--salt-overlayable-shadow-popout));
4627
+ bottom: 50%;
4628
+ left: 50%;
4629
+ padding: var(--salt-spacing-50) var(--salt-spacing-100);
4630
+ position: absolute;
4631
+ transform: translate(-50%, -50%);
4632
+ text-align: var(--saltTooltip-textAlign, left);
4633
+ user-select: none;
4634
+ visibility: hidden;
4635
+ z-index: var(--saltTooltip-zIndex, var(--salt-zIndex-flyover));
4636
+ }
4637
+ .saltSliderTooltip-visible,
4638
+ .saltSliderTooltip:hover {
4639
+ visibility: visible;
4640
+ }
4641
+ .saltSliderTooltip-arrow {
4642
+ fill: var(--salt-container-primary-background);
4643
+ height: var(--salt-size-icon);
4644
+ left: 50%;
4645
+ position: absolute;
4646
+ pointer-events: none;
4647
+ top: 100%;
4648
+ transform: translateX(-50%);
4649
+ stroke: var(--salt-container-primary-borderColor);
4650
+ stroke-width: var(--salt-size-border);
4651
+ width: var(--salt-size-icon);
4652
+ }
4653
+ .saltSliderTooltip-text {
4654
+ white-space: nowrap;
4655
+ }
4656
+
4657
+ /* src/slider/internal/SliderTrack.css */
4658
+ .saltSliderTrack {
4659
+ --slider-track-background: var(--salt-track-borderColor);
4660
+ --slider-track-fill: var(--salt-accent-borderColor);
4661
+ --slider-progressPercentage: 0%;
4662
+ --slider-tick-height: calc((var(--salt-size-selectable) - var(--salt-size-bar)) / 2);
4663
+ --slider-progressPercentageStart: 0%;
4664
+ --slider-progressPercentageEnd: 0%;
4665
+ display: flex;
4666
+ touch-action: none;
4667
+ width: 100%;
4668
+ }
4669
+ .saltSliderTrack.saltSliderTrack-withMarks {
4670
+ margin-bottom: calc(var(--salt-size-base) / 2);
4671
+ }
4672
+ .saltSliderTrack-disabled {
4673
+ cursor: var(--salt-selectable-cursor-disabled);
4674
+ }
4675
+ .saltSliderTrack-container {
4676
+ align-items: center;
4677
+ display: flex;
4678
+ flex-direction: row;
4679
+ gap: var(--salt-spacing-100);
4680
+ width: 100%;
4681
+ }
4682
+ .saltSliderTrack-wrapper {
4683
+ align-items: center;
4684
+ cursor: var(--salt-selectable-cursor-hover);
4685
+ display: flex;
4686
+ flex: 1;
4687
+ height: var(--salt-size-selectable);
4688
+ position: relative;
4689
+ width: 100%;
4690
+ }
4691
+ .saltSliderTrack-disabled,
4692
+ .saltSliderTrack-disabled .saltSliderTrack-wrapper {
4693
+ cursor: var(--salt-selectable-cursor-disabled);
4694
+ }
4695
+ .saltSliderTrack-disabled .saltSliderTrack-wrapper {
4696
+ pointer-events: none;
4697
+ }
4698
+ .saltSliderTrack-rail {
4699
+ display: flex;
4700
+ flex: 100%;
4701
+ height: var(--salt-size-bar);
4702
+ justify-content: space-between;
4703
+ position: relative;
4704
+ }
4705
+ .saltSliderTrack-rail::before,
4706
+ .saltSliderTrack-rail::after {
4707
+ content: "";
4708
+ display: block;
4709
+ height: 100%;
4710
+ }
4711
+ .saltSliderTrack-rail::before {
4712
+ background: var(--slider-track-fill);
4713
+ border-top-left-radius: var(--salt-palette-corner-weaker);
4714
+ border-bottom-left-radius: var(--salt-palette-corner-weaker);
4715
+ width: calc(var(--slider-progressPercentage) - 1.5 * var(--salt-size-border-strong));
4716
+ }
4717
+ .saltSliderTrack-hasMinTick.saltSliderTrack-rail::before {
4718
+ border-bottom-left-radius: unset;
4719
+ }
4720
+ .saltSliderTrack-rail::after {
4721
+ background: var(--slider-track-background);
4722
+ border-top-right-radius: var(--salt-palette-corner-weaker);
4723
+ border-bottom-right-radius: var(--salt-palette-corner-weaker);
4724
+ width: calc(100% - var(--slider-progressPercentage) - 1.5 * var(--salt-size-border-strong));
4725
+ }
4726
+ .saltSliderTrack-hasMaxTick.saltSliderTrack-rail::after {
4727
+ border-bottom-right-radius: unset;
4728
+ }
4729
+ .saltSliderTrack-range .saltSliderTrack-rail::before {
4730
+ background: var(--slider-track-background);
4731
+ width: calc(var(--slider-progressPercentageStart) - (var(--salt-size-border-strong) * 1.5));
4732
+ }
4733
+ .saltSliderTrack-range .saltSliderTrack-rail::after {
4734
+ background: var(--slider-track-background);
4735
+ width: calc(100% - var(--slider-progressPercentageEnd) - (var(--salt-size-border-strong) * 1.5));
4736
+ }
4737
+ .saltSliderTrack-range .saltSliderTrack-rail .saltSliderTrack-fill {
4738
+ background: var(--slider-track-fill);
4739
+ height: 100%;
4740
+ left: calc(var(--slider-progressPercentageStart) + 1.5 * var(--salt-size-border-strong));
4741
+ position: absolute;
4742
+ width: calc(var(--slider-progressPercentageEnd) - var(--slider-progressPercentageStart) - var(--salt-size-border-strong) * 3);
4743
+ }
4744
+ .saltSliderTrack-minLabel,
4745
+ .saltSliderTrack-maxLabel {
4746
+ user-select: none;
4747
+ }
4748
+ .saltSliderTrack-dragging,
4749
+ .saltSliderTrack-dragging .saltSliderTrack-wrapper {
4750
+ cursor: var(--salt-draggable-grab-cursor-active);
4751
+ }
4752
+ .saltSliderTrack-disabled {
4753
+ --slider-track-fill: var(--salt-accent-borderColor-disabled);
4754
+ --slider-track-background: var(--salt-track-borderColor-disabled);
4755
+ }
4756
+ .saltSliderTrack-ticks {
4757
+ top: calc(var(--salt-size-bar) + var(--slider-tick-height));
4758
+ position: absolute;
4759
+ width: 100%;
4760
+ }
4761
+ .saltSliderTrack-tick {
4762
+ background: var(--slider-track-background);
4763
+ height: var(--slider-tick-height);
4764
+ position: absolute;
4765
+ transform: translate(-50%);
4766
+ width: var(--salt-size-border-strong);
4767
+ }
4768
+ .saltSliderTrack-withTicks .saltSliderTrack-tickHidden {
4769
+ visibility: hidden;
4770
+ }
4771
+ .saltSliderTrack-tickSelected {
4772
+ background: var(--slider-track-fill);
4773
+ }
4774
+ .saltSliderTrack-tick:first-of-type {
4775
+ transform: unset;
4776
+ }
4777
+ .saltSliderTrack-tick:last-of-type {
4778
+ transform: translateX(-100%);
4779
+ }
4780
+ .saltSliderTrack-marks {
4781
+ position: absolute;
4782
+ user-select: none;
4783
+ width: 100%;
4784
+ }
4785
+ .saltSliderTrack-markLabel {
4786
+ color: var(--salt-content-secondary-foreground);
4787
+ font-family: var(--salt-text-label-fontFamily);
4788
+ font-weight: var(--salt-text-label-fontWeight);
4789
+ font-size: var(--salt-text-label-fontSize);
4790
+ line-height: var(--salt-text-label-lineHeight);
4791
+ overflow: hidden;
4792
+ position: absolute;
4793
+ text-overflow: ellipsis;
4794
+ transform: translateX(-50%);
4795
+ top: calc(var(--slider-tick-height) + var(--salt-spacing-50));
4796
+ white-space: nowrap;
4797
+ }
4798
+ .saltSliderTrack-constrainLabelPosition .saltSliderTrack-markLabel:first-of-type {
4799
+ transform: translateX(0%);
4800
+ }
4801
+ .saltSliderTrack-constrainLabelPosition .saltSliderTrack-markLabel:last-of-type {
4802
+ transform: translateX(-100%);
4803
+ }
4804
+ .saltFormField .saltSliderTrack.saltSliderTrack-withMark {
4805
+ margin-bottom: 0;
4806
+ }
4807
+ .saltFormField .saltSliderTrack-container {
4808
+ --saltFormField-label-width: 10%;
4809
+ height: var(--salt-size-base);
4810
+ }
4811
+ .saltFormField .saltSliderTrack-markLabel {
4812
+ top: calc((var(--salt-size-base) - var(--salt-size-bar)) / 2);
4813
+ }
4814
+
4815
+ /* src/1af42f57-5eb2-47da-8657-1a22a667b415.css */
package/dist-cjs/index.js CHANGED
@@ -109,6 +109,8 @@ var Corner = require('./theme/Corner.js');
109
109
  var Toast = require('./toast/Toast.js');
110
110
  var ToastContent = require('./toast/ToastContent.js');
111
111
  var SaltProvider = require('./salt-provider/SaltProvider.js');
112
+ var Slider = require('./slider/Slider.js');
113
+ var RangeSlider = require('./slider/RangeSlider.js');
112
114
  var SplitLayout = require('./split-layout/SplitLayout.js');
113
115
  var Switch = require('./switch/Switch.js');
114
116
  var Tag = require('./tag/Tag.js');
@@ -286,6 +288,8 @@ exports.UNSTABLE_SaltProviderNext = SaltProvider.UNSTABLE_SaltProviderNext;
286
288
  exports.useBreakpoints = SaltProvider.useBreakpoints;
287
289
  exports.useDensity = SaltProvider.useDensity;
288
290
  exports.useTheme = SaltProvider.useTheme;
291
+ exports.Slider = Slider.Slider;
292
+ exports.RangeSlider = RangeSlider.RangeSlider;
289
293
  exports.SplitLayout = SplitLayout.SplitLayout;
290
294
  exports.Switch = Switch.Switch;
291
295
  exports.Tag = Tag.Tag;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,188 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var clsx = require('clsx');
5
+ var React = require('react');
6
+ require('../form-field-context/FormFieldContext.js');
7
+ var useFormFieldProps = require('../form-field-context/useFormFieldProps.js');
8
+ var useControlled = require('../utils/useControlled.js');
9
+ require('../utils/useFloatingUI/useFloatingUI.js');
10
+ require('../utils/useId.js');
11
+ require('../salt-provider/SaltProvider.js');
12
+ require('../viewport/ViewportProvider.js');
13
+ var SliderThumb = require('./internal/SliderThumb.js');
14
+ var SliderTrack = require('./internal/SliderTrack.js');
15
+ var useRangeSliderThumb = require('./internal/useRangeSliderThumb.js');
16
+ var utils = require('./internal/utils.js');
17
+
18
+ const RangeSlider = React.forwardRef(
19
+ function RangeSlider2({
20
+ "aria-label": ariaLabel,
21
+ "aria-labelledby": ariaLabelledBy,
22
+ "aria-valuetext": ariaValueText,
23
+ accessibleMaxText,
24
+ accessibleMinText,
25
+ decimalPlaces = 2,
26
+ disabled: disabledProp = false,
27
+ format,
28
+ marks,
29
+ max = 100,
30
+ min = 0,
31
+ maxLabel,
32
+ minLabel,
33
+ onChange,
34
+ onChangeEnd,
35
+ restrictToMarks = false,
36
+ showTooltip = true,
37
+ step = 1,
38
+ stepMultiplier = 2,
39
+ value: valueProp,
40
+ defaultValue = [min, min + (max - min) / 2],
41
+ ...rest
42
+ }, ref) {
43
+ const [valueState, setValue] = useControlled.useControlled({
44
+ controlled: valueProp,
45
+ default: defaultValue,
46
+ name: "RangeSlider",
47
+ state: "value"
48
+ });
49
+ const lastValueRef = React.useRef(valueState);
50
+ const {
51
+ a11yProps: { "aria-labelledby": formFieldLabelledBy } = {},
52
+ disabled: formFieldDisabled
53
+ } = useFormFieldProps.useFormFieldProps();
54
+ const disabled = formFieldDisabled || disabledProp;
55
+ const inputRefs = Array.from(
56
+ { length: 2 },
57
+ () => React.useRef(null)
58
+ );
59
+ const value = utils.clampRange(
60
+ valueState,
61
+ max,
62
+ min,
63
+ step,
64
+ decimalPlaces,
65
+ marks,
66
+ restrictToMarks
67
+ );
68
+ const progressPercentageStart = utils.calculatePercentage(value[0], max, min);
69
+ const progressPercentageEnd = utils.calculatePercentage(value[1], max, min);
70
+ const handleInputChange = (event, thumbIndex) => {
71
+ const parsedValue = utils.toFloat(event.target.value);
72
+ const values = preventThumbOverlap(parsedValue, value, thumbIndex);
73
+ const haveValuesChanged = values[0] !== lastValueRef.current[0] || values[1] !== lastValueRef.current[1];
74
+ if (haveValuesChanged) {
75
+ const values2 = preventThumbOverlap(parsedValue, value, thumbIndex);
76
+ setValue(values2);
77
+ onChange == null ? void 0 : onChange(event.nativeEvent, values2);
78
+ onChangeEnd == null ? void 0 : onChangeEnd(event.nativeEvent, values2);
79
+ lastValueRef.current = values2;
80
+ }
81
+ };
82
+ const {
83
+ handleBlur,
84
+ handleFocus,
85
+ handleKeydownOnThumb,
86
+ handlePointerDownOnThumb,
87
+ handlePointerDownOnTrack,
88
+ isDragging,
89
+ isFocusVisible,
90
+ sliderRef,
91
+ thumbIndexState,
92
+ preventThumbOverlap
93
+ } = useRangeSliderThumb.useRangeSliderThumb({
94
+ decimalPlaces,
95
+ handleInputChange,
96
+ inputRefs,
97
+ marks,
98
+ min,
99
+ max,
100
+ step,
101
+ value,
102
+ onChange,
103
+ onChangeEnd,
104
+ restrictToMarks,
105
+ setValue,
106
+ stepMultiplier
107
+ });
108
+ const thumbProps = {
109
+ "aria-label": ariaLabel,
110
+ "aria-labelledby": clsx.clsx(formFieldLabelledBy, ariaLabelledBy),
111
+ "aria-valuemax": max,
112
+ "aria-valuemin": min,
113
+ "aria-valuetext": ariaValueText,
114
+ accessibleMaxText,
115
+ accessibleMinText,
116
+ disabled,
117
+ format,
118
+ max,
119
+ maxLabel,
120
+ min,
121
+ minLabel,
122
+ restrictToMarks,
123
+ showTooltip,
124
+ step,
125
+ stepMultiplier,
126
+ sliderValue: value
127
+ };
128
+ return /* @__PURE__ */ jsxRuntime.jsxs(
129
+ SliderTrack.SliderTrack,
130
+ {
131
+ disabled,
132
+ format,
133
+ handlePointerDown: handlePointerDownOnTrack,
134
+ isDragging,
135
+ isRange: true,
136
+ marks,
137
+ min,
138
+ minLabel,
139
+ max,
140
+ maxLabel,
141
+ progressPercentageRange: [
142
+ progressPercentageStart,
143
+ progressPercentageEnd
144
+ ],
145
+ ref,
146
+ sliderRef,
147
+ ...rest,
148
+ children: [
149
+ /* @__PURE__ */ jsxRuntime.jsx(
150
+ SliderThumb.SliderThumb,
151
+ {
152
+ index: 0,
153
+ handleInputChange: (event) => handleInputChange(event, 0),
154
+ handlePointerDown: (event) => handlePointerDownOnThumb(event, 0),
155
+ handleKeydownOnThumb: (event) => handleKeydownOnThumb(event, 0),
156
+ offsetPercentage: `${utils.calculatePercentage(value[0], max, min)}%`,
157
+ trackDragging: isDragging && thumbIndexState === 0,
158
+ isFocusVisible: isFocusVisible && thumbIndexState === 0,
159
+ inputRef: inputRefs[0],
160
+ onFocus: () => handleFocus(0),
161
+ onBlur: () => handleBlur(0),
162
+ ...thumbProps
163
+ }
164
+ ),
165
+ /* @__PURE__ */ jsxRuntime.jsx(
166
+ SliderThumb.SliderThumb,
167
+ {
168
+ index: 1,
169
+ handleInputChange: (event) => handleInputChange(event, 1),
170
+ handlePointerDown: (event) => handlePointerDownOnThumb(event, 1),
171
+ handleKeydownOnThumb: (event) => handleKeydownOnThumb(event, 1),
172
+ offsetPercentage: `${utils.calculatePercentage(value[1], max, min)}%`,
173
+ trackDragging: isDragging && thumbIndexState === 1,
174
+ isFocusVisible: isFocusVisible && thumbIndexState === 1,
175
+ inputRef: inputRefs[1],
176
+ onFocus: () => handleFocus(1),
177
+ onBlur: () => handleBlur(1),
178
+ ...thumbProps
179
+ }
180
+ )
181
+ ]
182
+ }
183
+ );
184
+ }
185
+ );
186
+
187
+ exports.RangeSlider = RangeSlider;
188
+ //# sourceMappingURL=RangeSlider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RangeSlider.js","sources":["../src/slider/RangeSlider.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type HTMLAttributes,\n forwardRef,\n useRef,\n} from \"react\";\nimport { useFormFieldProps } from \"../form-field-context\";\nimport { useControlled } from \"../utils\";\nimport { SliderThumb } from \"./internal/SliderThumb\";\nimport { SliderTrack } from \"./internal/SliderTrack\";\nimport { useRangeSliderThumb } from \"./internal/useRangeSliderThumb\";\nimport { calculatePercentage, clampRange, toFloat } from \"./internal/utils\";\n\nexport interface RangeSliderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\"> {\n /**\n * Accessible text to announce maximum value label.\n */\n accessibleMaxText?: string;\n /**\n * Accessible text to announce minimum value label.\n */\n accessibleMinText?: string;\n /**\n * When minimum and maximum labels are defined, ensure\n * they are confined within the boundary of the slider.\n */\n constrainLabelPosition?: boolean;\n /**\n * The number of allowed decimal places\n * @default 2\n */\n decimalPlaces?: number;\n /**\n * The default value. Use when the component is not controlled.\n * @default [min, min + (max - min) / 2]\n */\n defaultValue?: [number, number];\n /**\n * Disable the slider.\n */\n disabled?: boolean;\n /**\n * Show visual ticks above the marks.\n */\n showTicks?: boolean;\n /**\n * A callback to format the display value in the tooltip, min and max labels\n * and the `aria-valuetext` attribute.\n */\n format?: (value: number) => string | number;\n /**\n * Marks that are displayed under the track.\n */\n marks?: { label: string; value: number }[];\n /**\n * Maximum slider value.\n * @default 10\n */\n max?: number;\n /**\n * Minimum slider value.\n * @default 0\n */\n min?: number;\n /**\n * Label for maximum value.\n */\n maxLabel?: string;\n /**\n * Label for minimum value.\n */\n minLabel?: string;\n /**\n * Callback called when slider value is changed.\n * It provides a generic event and the current value of the slider.\n */\n onChange?: (event: Event, value: [number, number]) => void;\n /**\n * Callback called when the slider is stopped from being dragged or\n * its value is changed from the keyboard. It provides a generic\n * event and the current value of the slider.\n */\n onChangeEnd?: (event: Event, value: [number, number]) => void;\n /**\n * Restrict slider value to marks only. The step will be ignored.\n */\n restrictToMarks?: boolean;\n /**\n * Show the slider value in a tooltip when the thumb is hovered.\n * @default true\n */\n showTooltip?: boolean;\n /**\n * Minimum interval the slider thumb can move.\n * @default 1\n */\n step?: number;\n /**\n * Maximum interval the slider thumb can move when using PageUp and PageDown keys.\n * @default 2\n */\n stepMultiplier?: number;\n /**\n * Value of the slider, to be used when in a controlled state.\n */\n value?: [number, number];\n}\n\nexport const RangeSlider = forwardRef<HTMLDivElement, RangeSliderProps>(\n function RangeSlider(\n {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-valuetext\": ariaValueText,\n accessibleMaxText,\n accessibleMinText,\n decimalPlaces = 2,\n disabled: disabledProp = false,\n format,\n marks,\n max = 100,\n min = 0,\n maxLabel,\n minLabel,\n onChange,\n onChangeEnd,\n restrictToMarks = false,\n showTooltip = true,\n step = 1,\n stepMultiplier = 2,\n value: valueProp,\n defaultValue = [min, min + (max - min) / 2],\n ...rest\n },\n ref,\n ) {\n const [valueState, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"RangeSlider\",\n state: \"value\",\n });\n const lastValueRef = useRef<[number, number]>(valueState);\n\n const {\n a11yProps: { \"aria-labelledby\": formFieldLabelledBy } = {},\n disabled: formFieldDisabled,\n } = useFormFieldProps();\n\n const disabled = formFieldDisabled || disabledProp;\n const inputRefs = Array.from({ length: 2 }, () =>\n useRef<HTMLInputElement>(null),\n );\n const value: [number, number] = clampRange(\n valueState,\n max,\n min,\n step,\n decimalPlaces,\n marks,\n restrictToMarks,\n );\n const progressPercentageStart = calculatePercentage(value[0], max, min);\n const progressPercentageEnd = calculatePercentage(value[1], max, min);\n\n const handleInputChange = (\n event: ChangeEvent<HTMLInputElement>,\n thumbIndex: number,\n ) => {\n const parsedValue = toFloat(event.target.value);\n const values = preventThumbOverlap(parsedValue, value, thumbIndex);\n const haveValuesChanged =\n values[0] !== lastValueRef.current[0] ||\n values[1] !== lastValueRef.current[1];\n if (haveValuesChanged) {\n const values = preventThumbOverlap(parsedValue, value, thumbIndex);\n setValue(values as [number, number]);\n onChange?.(event.nativeEvent, values as [number, number]);\n onChangeEnd?.(event.nativeEvent, values as [number, number]);\n lastValueRef.current = values;\n }\n };\n\n const {\n handleBlur,\n handleFocus,\n handleKeydownOnThumb,\n handlePointerDownOnThumb,\n handlePointerDownOnTrack,\n isDragging,\n isFocusVisible,\n sliderRef,\n thumbIndexState,\n preventThumbOverlap,\n } = useRangeSliderThumb({\n decimalPlaces,\n handleInputChange,\n inputRefs,\n marks,\n min,\n max,\n step,\n value,\n onChange,\n onChangeEnd,\n restrictToMarks,\n setValue,\n stepMultiplier,\n });\n\n const thumbProps = {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": clsx(formFieldLabelledBy, ariaLabelledBy),\n \"aria-valuemax\": max,\n \"aria-valuemin\": min,\n \"aria-valuetext\": ariaValueText,\n accessibleMaxText: accessibleMaxText,\n accessibleMinText: accessibleMinText,\n disabled: disabled,\n format: format,\n max: max,\n maxLabel: maxLabel,\n min: min,\n minLabel: minLabel,\n restrictToMarks: restrictToMarks,\n showTooltip: showTooltip,\n step: step,\n stepMultiplier: stepMultiplier,\n sliderValue: value,\n };\n\n return (\n <SliderTrack\n disabled={disabled}\n format={format}\n handlePointerDown={handlePointerDownOnTrack}\n isDragging={isDragging}\n isRange\n marks={marks}\n min={min}\n minLabel={minLabel}\n max={max}\n maxLabel={maxLabel}\n progressPercentageRange={[\n progressPercentageStart,\n progressPercentageEnd,\n ]}\n ref={ref}\n sliderRef={sliderRef}\n {...rest}\n >\n <SliderThumb\n index={0}\n handleInputChange={(event) => handleInputChange(event, 0)}\n handlePointerDown={(event) => handlePointerDownOnThumb(event, 0)}\n handleKeydownOnThumb={(event) => handleKeydownOnThumb(event, 0)}\n offsetPercentage={`${calculatePercentage(value[0], max, min)}%`}\n trackDragging={isDragging && thumbIndexState === 0}\n isFocusVisible={isFocusVisible && thumbIndexState === 0}\n inputRef={inputRefs[0]}\n onFocus={() => handleFocus(0)}\n onBlur={() => handleBlur(0)}\n {...thumbProps}\n />\n <SliderThumb\n index={1}\n handleInputChange={(event) => handleInputChange(event, 1)}\n handlePointerDown={(event) => handlePointerDownOnThumb(event, 1)}\n handleKeydownOnThumb={(event) => handleKeydownOnThumb(event, 1)}\n offsetPercentage={`${calculatePercentage(value[1], max, min)}%`}\n trackDragging={isDragging && thumbIndexState === 1}\n isFocusVisible={isFocusVisible && thumbIndexState === 1}\n inputRef={inputRefs[1]}\n onFocus={() => handleFocus(1)}\n onBlur={() => handleBlur(1)}\n {...thumbProps}\n />\n </SliderTrack>\n );\n },\n);\n"],"names":["forwardRef","RangeSlider","useControlled","useRef","useFormFieldProps","clampRange","calculatePercentage","toFloat","values","useRangeSliderThumb","clsx","jsxs","SliderTrack","jsx","SliderThumb"],"mappings":"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"}