@salt-ds/core 1.43.0 → 1.44.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 (82) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/css/salt-core.css +256 -1
  3. package/dist-cjs/combo-box/ComboBox.js +4 -1
  4. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  5. package/dist-cjs/dropdown/Dropdown.js +6 -2
  6. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  7. package/dist-cjs/index.js +4 -0
  8. package/dist-cjs/index.js.map +1 -1
  9. package/dist-cjs/list-box/ListBox.js +6 -2
  10. package/dist-cjs/list-box/ListBox.js.map +1 -1
  11. package/dist-cjs/list-control/ListControlState.js +6 -5
  12. package/dist-cjs/list-control/ListControlState.js.map +1 -1
  13. package/dist-cjs/slider/RangeSlider.js +188 -0
  14. package/dist-cjs/slider/RangeSlider.js.map +1 -0
  15. package/dist-cjs/slider/Slider.js +151 -0
  16. package/dist-cjs/slider/Slider.js.map +1 -0
  17. package/dist-cjs/slider/internal/SliderThumb.css.js +6 -0
  18. package/dist-cjs/slider/internal/SliderThumb.css.js.map +1 -0
  19. package/dist-cjs/slider/internal/SliderThumb.js +141 -0
  20. package/dist-cjs/slider/internal/SliderThumb.js.map +1 -0
  21. package/dist-cjs/slider/internal/SliderTooltip.css.js +6 -0
  22. package/dist-cjs/slider/internal/SliderTooltip.css.js.map +1 -0
  23. package/dist-cjs/slider/internal/SliderTooltip.js +70 -0
  24. package/dist-cjs/slider/internal/SliderTooltip.js.map +1 -0
  25. package/dist-cjs/slider/internal/SliderTrack.css.js +6 -0
  26. package/dist-cjs/slider/internal/SliderTrack.css.js.map +1 -0
  27. package/dist-cjs/slider/internal/SliderTrack.js +179 -0
  28. package/dist-cjs/slider/internal/SliderTrack.js.map +1 -0
  29. package/dist-cjs/slider/internal/useRangeSliderThumb.js +234 -0
  30. package/dist-cjs/slider/internal/useRangeSliderThumb.js.map +1 -0
  31. package/dist-cjs/slider/internal/useSliderThumb.js +162 -0
  32. package/dist-cjs/slider/internal/useSliderThumb.js.map +1 -0
  33. package/dist-cjs/slider/internal/utils.js +127 -0
  34. package/dist-cjs/slider/internal/utils.js.map +1 -0
  35. package/dist-cjs/switch/Switch.js.map +1 -1
  36. package/dist-es/combo-box/ComboBox.js +4 -1
  37. package/dist-es/combo-box/ComboBox.js.map +1 -1
  38. package/dist-es/dropdown/Dropdown.js +6 -2
  39. package/dist-es/dropdown/Dropdown.js.map +1 -1
  40. package/dist-es/index.js +2 -0
  41. package/dist-es/index.js.map +1 -1
  42. package/dist-es/list-box/ListBox.js +6 -2
  43. package/dist-es/list-box/ListBox.js.map +1 -1
  44. package/dist-es/list-control/ListControlState.js +6 -5
  45. package/dist-es/list-control/ListControlState.js.map +1 -1
  46. package/dist-es/slider/RangeSlider.js +186 -0
  47. package/dist-es/slider/RangeSlider.js.map +1 -0
  48. package/dist-es/slider/Slider.js +149 -0
  49. package/dist-es/slider/Slider.js.map +1 -0
  50. package/dist-es/slider/internal/SliderThumb.css.js +4 -0
  51. package/dist-es/slider/internal/SliderThumb.css.js.map +1 -0
  52. package/dist-es/slider/internal/SliderThumb.js +139 -0
  53. package/dist-es/slider/internal/SliderThumb.js.map +1 -0
  54. package/dist-es/slider/internal/SliderTooltip.css.js +4 -0
  55. package/dist-es/slider/internal/SliderTooltip.css.js.map +1 -0
  56. package/dist-es/slider/internal/SliderTooltip.js +68 -0
  57. package/dist-es/slider/internal/SliderTooltip.js.map +1 -0
  58. package/dist-es/slider/internal/SliderTrack.css.js +4 -0
  59. package/dist-es/slider/internal/SliderTrack.css.js.map +1 -0
  60. package/dist-es/slider/internal/SliderTrack.js +177 -0
  61. package/dist-es/slider/internal/SliderTrack.js.map +1 -0
  62. package/dist-es/slider/internal/useRangeSliderThumb.js +232 -0
  63. package/dist-es/slider/internal/useRangeSliderThumb.js.map +1 -0
  64. package/dist-es/slider/internal/useSliderThumb.js +160 -0
  65. package/dist-es/slider/internal/useSliderThumb.js.map +1 -0
  66. package/dist-es/slider/internal/utils.js +119 -0
  67. package/dist-es/slider/internal/utils.js.map +1 -0
  68. package/dist-es/switch/Switch.js.map +1 -1
  69. package/dist-types/combo-box/useComboBox.d.ts +7 -7
  70. package/dist-types/index.d.ts +1 -0
  71. package/dist-types/list-control/ListControlState.d.ts +7 -7
  72. package/dist-types/slider/RangeSlider.d.ts +99 -0
  73. package/dist-types/slider/Slider.d.ts +100 -0
  74. package/dist-types/slider/index.d.ts +2 -0
  75. package/dist-types/slider/internal/SliderThumb.d.ts +26 -0
  76. package/dist-types/slider/internal/SliderTooltip.d.ts +6 -0
  77. package/dist-types/slider/internal/SliderTrack.d.ts +24 -0
  78. package/dist-types/slider/internal/useRangeSliderThumb.d.ts +30 -0
  79. package/dist-types/slider/internal/useSliderThumb.d.ts +28 -0
  80. package/dist-types/slider/internal/utils.d.ts +20 -0
  81. package/dist-types/switch/Switch.d.ts +7 -7
  82. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ const toFloat = (value) => typeof value === "string" ? Number.parseFloat(value) : value;
2
+ const calculateMarkPosition = (value, max, min) => {
3
+ if (min === max) {
4
+ return 0;
5
+ }
6
+ const clampedValue = Number.isNaN(toFloat(value)) ? min : Math.min(Math.max(toFloat(value), min), max);
7
+ const markPosition = (clampedValue - min) / (max - min) * 100;
8
+ return Math.round(markPosition * 100) / 100;
9
+ };
10
+ const calculatePercentage = (value, max, min) => (value - min) / (max - min) * 100;
11
+ const clamp = (value, max, min, step, decimalPlaces, marks, restrictToMarks) => {
12
+ if (Number.isNaN(value)) {
13
+ return min;
14
+ }
15
+ const clampedValue = Math.min(Math.max(value, min), max);
16
+ if (restrictToMarks && marks) {
17
+ let closestMark = marks[0].value;
18
+ let smallestDifference = Math.abs(clampedValue - closestMark);
19
+ for (let i = 1; i < marks.length; i++) {
20
+ const currentDifference = Math.abs(clampedValue - marks[i].value);
21
+ if (currentDifference < smallestDifference) {
22
+ smallestDifference = currentDifference;
23
+ closestMark = marks[i].value;
24
+ }
25
+ }
26
+ return closestMark;
27
+ }
28
+ let roundedValue = Math.round(clampedValue / step) * step;
29
+ if (roundedValue > max) {
30
+ roundedValue = max;
31
+ } else if (roundedValue < min) {
32
+ roundedValue = min;
33
+ }
34
+ return Number.parseFloat(roundedValue.toFixed(decimalPlaces));
35
+ };
36
+ const clampRange = (range, max, min, step, decimalPlaces, marks, restrictToMarks) => {
37
+ let [start, end] = range;
38
+ if (Number.isNaN(start)) {
39
+ start = min;
40
+ }
41
+ if (Number.isNaN(end)) {
42
+ end = max;
43
+ }
44
+ if (start > end) {
45
+ [start, end] = [end, start];
46
+ }
47
+ start = clamp(start, max, min, step, decimalPlaces, marks, restrictToMarks);
48
+ end = clamp(end, max, min, step, decimalPlaces, marks, restrictToMarks);
49
+ return [start, end];
50
+ };
51
+ const getClickedPosition = (sliderRef, clientX, max, min, step, decimalPlaces, marks, restrictToMarks) => {
52
+ if (!sliderRef.current) return;
53
+ const sliderRect = sliderRef.current.getBoundingClientRect();
54
+ const rawValue = (clientX - sliderRect.left) / sliderRect.width * (max - min) + min;
55
+ const steppedValue = Math.round(rawValue / step) * step;
56
+ return clamp(
57
+ steppedValue,
58
+ max,
59
+ min,
60
+ step,
61
+ decimalPlaces,
62
+ marks,
63
+ restrictToMarks
64
+ );
65
+ };
66
+ const getKeyboardValue = (event, value, step, stepMultiplier, max, min, restrictToMarks, marks) => {
67
+ let newValue = value;
68
+ if (restrictToMarks && marks && marks.length >= 1) {
69
+ const currentIndex = marks.findIndex((mark) => mark.value === value);
70
+ switch (event.key) {
71
+ case "ArrowUp":
72
+ case "ArrowRight":
73
+ case "PageUp":
74
+ if (currentIndex < marks.length - 1) {
75
+ newValue = marks[currentIndex + 1].value;
76
+ }
77
+ break;
78
+ case "ArrowDown":
79
+ case "ArrowLeft":
80
+ case "PageDown":
81
+ if (currentIndex > 0) {
82
+ newValue = marks[currentIndex - 1].value;
83
+ }
84
+ break;
85
+ default:
86
+ return newValue;
87
+ }
88
+ } else {
89
+ switch (event.key) {
90
+ case "ArrowUp":
91
+ case "ArrowRight":
92
+ newValue = Math.min(value + step, max);
93
+ break;
94
+ case "ArrowDown":
95
+ case "ArrowLeft":
96
+ newValue = Math.max(value - step, min);
97
+ break;
98
+ case "Home":
99
+ newValue = min;
100
+ break;
101
+ case "End":
102
+ newValue = max;
103
+ break;
104
+ case "PageUp":
105
+ newValue = Math.min(value + step * stepMultiplier, max);
106
+ break;
107
+ case "PageDown":
108
+ newValue = Math.max(value - step * stepMultiplier, min);
109
+ break;
110
+ default:
111
+ return newValue;
112
+ }
113
+ }
114
+ event.preventDefault();
115
+ return newValue;
116
+ };
117
+
118
+ export { calculateMarkPosition, calculatePercentage, clamp, clampRange, getClickedPosition, getKeyboardValue, toFloat };
119
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/slider/internal/utils.ts"],"sourcesContent":["import type { RefObject } from \"react\";\n\nexport const toFloat = (value: number | string) =>\n typeof value === \"string\" ? Number.parseFloat(value) : value;\n\nexport const calculateMarkPosition = (\n value: number | string,\n max: number,\n min: number,\n) => {\n if (min === max) {\n return 0;\n }\n const clampedValue = Number.isNaN(toFloat(value))\n ? min\n : Math.min(Math.max(toFloat(value), min), max);\n const markPosition = ((clampedValue - min) / (max - min)) * 100;\n return Math.round(markPosition * 100) / 100;\n};\n\nexport const calculatePercentage = (value: number, max: number, min: number) =>\n ((value - min) / (max - min)) * 100;\n\nexport const clamp = (\n value: number,\n max: number,\n min: number,\n step: number,\n decimalPlaces: number,\n marks?: { value: number; label: string }[],\n restrictToMarks?: boolean,\n) => {\n if (Number.isNaN(value)) {\n return min;\n }\n // Clamp the value between min and max\n const clampedValue = Math.min(Math.max(value, min), max);\n if (restrictToMarks && marks) {\n // Find the closest mark value\n let closestMark = marks[0].value;\n let smallestDifference = Math.abs(clampedValue - closestMark);\n for (let i = 1; i < marks.length; i++) {\n const currentDifference = Math.abs(clampedValue - marks[i].value);\n if (currentDifference < smallestDifference) {\n smallestDifference = currentDifference;\n closestMark = marks[i].value;\n }\n }\n return closestMark;\n }\n // Round to the nearest multiple of the step\n let roundedValue = Math.round(clampedValue / step) * step;\n // Ensure the rounded value does not exceed max or min\n if (roundedValue > max) {\n roundedValue = max;\n } else if (roundedValue < min) {\n roundedValue = min;\n }\n return Number.parseFloat(roundedValue.toFixed(decimalPlaces));\n};\n\nexport const clampRange = (\n range: [number, number],\n max: number,\n min: number,\n step: number,\n decimalPlaces: number,\n marks?: { value: number; label: string }[],\n restrictToMarks?: boolean,\n) => {\n let [start, end] = range;\n\n if (Number.isNaN(start)) {\n start = min;\n }\n if (Number.isNaN(end)) {\n end = max;\n }\n if (start > end) {\n [start, end] = [end, start];\n }\n start = clamp(start, max, min, step, decimalPlaces, marks, restrictToMarks);\n end = clamp(end, max, min, step, decimalPlaces, marks, restrictToMarks);\n return [start, end] as [number, number];\n};\n\nexport const getClickedPosition = (\n sliderRef: RefObject<HTMLDivElement>,\n clientX: number,\n max: number,\n min: number,\n step: number,\n decimalPlaces: number,\n marks?: { label: string; value: number }[],\n restrictToMarks?: boolean,\n) => {\n if (!sliderRef.current) return;\n\n const sliderRect = sliderRef.current.getBoundingClientRect();\n const rawValue =\n ((clientX - sliderRect.left) / sliderRect.width) * (max - min) + min;\n const steppedValue = Math.round(rawValue / step) * step;\n return clamp(\n steppedValue,\n max,\n min,\n step,\n decimalPlaces,\n marks,\n restrictToMarks,\n );\n};\n\nexport const getKeyboardValue = (\n event: React.KeyboardEvent,\n value: number,\n step: number,\n stepMultiplier: number,\n max: number,\n min: number,\n restrictToMarks?: boolean,\n marks?: { label: string; value: number }[],\n) => {\n let newValue = value;\n\n if (restrictToMarks && marks && marks.length >= 1) {\n const currentIndex = marks.findIndex((mark) => mark.value === value);\n\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n case \"PageUp\":\n if (currentIndex < marks.length - 1) {\n newValue = marks[currentIndex + 1].value;\n }\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n case \"PageDown\":\n if (currentIndex > 0) {\n newValue = marks[currentIndex - 1].value;\n }\n break;\n default:\n return newValue;\n }\n } else {\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n newValue = Math.min(value + step, max);\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n newValue = Math.max(value - step, min);\n break;\n case \"Home\":\n newValue = min;\n break;\n case \"End\":\n newValue = max;\n break;\n case \"PageUp\":\n newValue = Math.min(value + step * stepMultiplier, max);\n break;\n case \"PageDown\":\n newValue = Math.max(value - step * stepMultiplier, min);\n break;\n default:\n return newValue;\n }\n }\n\n event.preventDefault();\n return newValue;\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.js","sources":["../src/switch/Switch.tsx"],"sourcesContent":["import {\n type IconProps,\n SuccessSmallSolidIcon,\n SuccessSolidIcon,\n} from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n type ReactNode,\n forwardRef,\n} from \"react\";\nimport { useFormFieldProps } from \"../form-field-context\";\nimport { useDensity } from \"../salt-provider\";\nimport type { DataAttributes } from \"../types\";\nimport { makePrefixer, useControlled } from \"../utils\";\n\nimport switchCss from \"./Switch.css\";\n\nexport interface SwitchProps\n extends Omit<\n ComponentPropsWithoutRef<\"label\">,\n \"children\" | \"onFocus\" | \"onBlur\" | \"onChange\"\n > {\n /**\n * If `true`, the checkbox will be checked.\n */\n checked?: boolean;\n /**\n * Whether the checkbox component is checked by default\n * This will be disregarded if checked is already set.\n */\n defaultChecked?: boolean;\n /**\n * If `true`, the checkbox will be disabled.\n */\n disabled?: boolean;\n /**\n * Properties applied to the input element.\n */\n inputProps?: Partial<ComponentPropsWithoutRef<\"input\">> & DataAttributes;\n /**\n * The label to be shown next to the checkbox.\n */\n label?: ReactNode;\n /**\n * The name applied to the input.\n */\n name?: string;\n /**\n * Callback when checkbox loses focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Callback when checked state is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Callback when checkbox gains focus.\n */\n onFocus?: FocusEventHandler<HTMLInputElement>;\n /**\n * The value of the checkbox.\n */\n value?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltSwitch\");\n\nfunction CheckedIcon(props: IconProps) {\n const density = useDensity();\n return density === \"high\" ? (\n <SuccessSmallSolidIcon {...props} />\n ) : (\n <SuccessSolidIcon {...props} />\n );\n}\n\nexport const Switch = forwardRef<HTMLLabelElement, SwitchProps>(\n function Switch(props, ref) {\n const {\n checked: checkedProp,\n className,\n defaultChecked,\n disabled: disabledProp,\n inputProps = {},\n label,\n name,\n onBlur,\n onChange,\n onFocus,\n value,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-switch\",\n css: switchCss,\n window: targetWindow,\n });\n\n const {\n \"aria-describedby\": inputDescribedBy,\n \"aria-labelledby\": inputLabelledBy,\n className: inputClassName,\n onChange: inputOnChange,\n ...restInputProps\n } = inputProps;\n\n const [checked, setChecked] = useControlled({\n controlled: checkedProp,\n default: Boolean(defaultChecked),\n name: \"Switch\",\n state: \"checked\",\n });\n\n const { a11yProps: formFieldA11yProps, disabled: formFieldDisabled } =\n useFormFieldProps();\n\n const disabled = formFieldDisabled || disabledProp;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n // Workaround for https://github.com/facebook/react/issues/9023\n if (event.nativeEvent.defaultPrevented) {\n return;\n }\n\n const value = event.target.checked;\n setChecked(value);\n onChange?.(event);\n inputOnChange?.(event);\n };\n\n return (\n <label\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"checked\")]: checked,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n <input\n aria-describedby={clsx(\n formFieldA11yProps?.[\"aria-describedby\"],\n inputDescribedBy,\n )}\n aria-labelledby={clsx(\n formFieldA11yProps?.[\"aria-labelledby\"],\n inputLabelledBy,\n )}\n name={name}\n value={value}\n checked={checked}\n className={clsx(withBaseName(\"input\"), inputClassName)}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onBlur={onBlur}\n onChange={handleChange}\n onFocus={onFocus}\n type=\"checkbox\"\n role=\"switch\"\n {...restInputProps}\n />\n <span className={withBaseName(\"track\")}>\n <span className={withBaseName(\"thumb\")}>\n {checked && (\n <CheckedIcon aria-hidden className={withBaseName(\"icon\")} />\n )}\n </span>\n </span>\n {label && <span className={withBaseName(\"label\")}>{label}</span>}\n </label>\n );\n },\n);\n"],"names":["Switch","switchCss","value"],"mappings":"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"}
1
+ {"version":3,"file":"Switch.js","sources":["../src/switch/Switch.tsx"],"sourcesContent":["import {\n type IconProps,\n SuccessSmallSolidIcon,\n SuccessSolidIcon,\n} from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n type ReactNode,\n forwardRef,\n} from \"react\";\nimport { useFormFieldProps } from \"../form-field-context\";\nimport { useDensity } from \"../salt-provider\";\nimport type { DataAttributes } from \"../types\";\nimport { makePrefixer, useControlled } from \"../utils\";\n\nimport switchCss from \"./Switch.css\";\n\nexport interface SwitchProps\n extends Omit<\n ComponentPropsWithoutRef<\"label\">,\n \"children\" | \"onFocus\" | \"onBlur\" | \"onChange\"\n > {\n /**\n * If `true`, the switch will be checked.\n */\n checked?: boolean;\n /**\n * Whether the switch component is checked by default\n * This will be disregarded if checked is already set.\n */\n defaultChecked?: boolean;\n /**\n * If `true`, the switch will be disabled.\n */\n disabled?: boolean;\n /**\n * Properties applied to the input element.\n */\n inputProps?: Partial<ComponentPropsWithoutRef<\"input\">> & DataAttributes;\n /**\n * The label to be shown next to the switch.\n */\n label?: ReactNode;\n /**\n * The name applied to the input.\n */\n name?: string;\n /**\n * Callback when switch loses focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Callback when checked state is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Callback when switch gains focus.\n */\n onFocus?: FocusEventHandler<HTMLInputElement>;\n /**\n * The value of the switch.\n */\n value?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltSwitch\");\n\nfunction CheckedIcon(props: IconProps) {\n const density = useDensity();\n return density === \"high\" ? (\n <SuccessSmallSolidIcon {...props} />\n ) : (\n <SuccessSolidIcon {...props} />\n );\n}\n\nexport const Switch = forwardRef<HTMLLabelElement, SwitchProps>(\n function Switch(props, ref) {\n const {\n checked: checkedProp,\n className,\n defaultChecked,\n disabled: disabledProp,\n inputProps = {},\n label,\n name,\n onBlur,\n onChange,\n onFocus,\n value,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-switch\",\n css: switchCss,\n window: targetWindow,\n });\n\n const {\n \"aria-describedby\": inputDescribedBy,\n \"aria-labelledby\": inputLabelledBy,\n className: inputClassName,\n onChange: inputOnChange,\n ...restInputProps\n } = inputProps;\n\n const [checked, setChecked] = useControlled({\n controlled: checkedProp,\n default: Boolean(defaultChecked),\n name: \"Switch\",\n state: \"checked\",\n });\n\n const { a11yProps: formFieldA11yProps, disabled: formFieldDisabled } =\n useFormFieldProps();\n\n const disabled = formFieldDisabled || disabledProp;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n // Workaround for https://github.com/facebook/react/issues/9023\n if (event.nativeEvent.defaultPrevented) {\n return;\n }\n\n const value = event.target.checked;\n setChecked(value);\n onChange?.(event);\n inputOnChange?.(event);\n };\n\n return (\n <label\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"checked\")]: checked,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n <input\n aria-describedby={clsx(\n formFieldA11yProps?.[\"aria-describedby\"],\n inputDescribedBy,\n )}\n aria-labelledby={clsx(\n formFieldA11yProps?.[\"aria-labelledby\"],\n inputLabelledBy,\n )}\n name={name}\n value={value}\n checked={checked}\n className={clsx(withBaseName(\"input\"), inputClassName)}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onBlur={onBlur}\n onChange={handleChange}\n onFocus={onFocus}\n type=\"checkbox\"\n role=\"switch\"\n {...restInputProps}\n />\n <span className={withBaseName(\"track\")}>\n <span className={withBaseName(\"thumb\")}>\n {checked && (\n <CheckedIcon aria-hidden className={withBaseName(\"icon\")} />\n )}\n </span>\n </span>\n {label && <span className={withBaseName(\"label\")}>{label}</span>}\n </label>\n );\n },\n);\n"],"names":["Switch","switchCss","value"],"mappings":"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"}
@@ -26,7 +26,7 @@ export declare function useComboBox<Item>(props: UseComboBoxProps<Item>): {
26
26
  getOptionAtIndex: (index: number) => {
27
27
  data: OptionValue<Item>;
28
28
  element: HTMLElement;
29
- };
29
+ } | undefined;
30
30
  getIndexOfOption: (option: OptionValue<Item>) => number;
31
31
  getOptionsMatching: (predicate: (option: OptionValue<Item>) => boolean) => {
32
32
  data: OptionValue<Item>;
@@ -36,27 +36,27 @@ export declare function useComboBox<Item>(props: UseComboBoxProps<Item>): {
36
36
  getOptionAfter: (option: OptionValue<Item>) => {
37
37
  data: OptionValue<Item>;
38
38
  element: HTMLElement;
39
- };
39
+ } | undefined;
40
40
  getOptionBefore: (option: OptionValue<Item>) => {
41
41
  data: OptionValue<Item>;
42
42
  element: HTMLElement;
43
- };
43
+ } | undefined;
44
44
  getOptionPageAbove: (start: OptionValue<Item>) => {
45
45
  data: OptionValue<Item>;
46
46
  element: HTMLElement;
47
- } | null;
47
+ } | undefined;
48
48
  getOptionPageBelow: (start: OptionValue<Item>) => {
49
49
  data: OptionValue<Item>;
50
50
  element: HTMLElement;
51
- } | null;
51
+ } | undefined;
52
52
  getFirstOption: () => {
53
53
  data: OptionValue<Item>;
54
54
  element: HTMLElement;
55
- };
55
+ } | undefined;
56
56
  getLastOption: () => {
57
57
  data: OptionValue<Item>;
58
58
  element: HTMLElement;
59
- };
59
+ } | undefined;
60
60
  valueToString: (item: Item) => string;
61
61
  disabled: boolean | undefined;
62
62
  };
@@ -50,6 +50,7 @@ export * from "./text";
50
50
  export * from "./theme";
51
51
  export * from "./toast";
52
52
  export * from "./salt-provider";
53
+ export * from "./slider";
53
54
  export * from "./split-layout";
54
55
  export * from "./switch";
55
56
  export * from "./tag";
@@ -65,7 +65,7 @@ export declare function useListControl<Item>(props: ListControlProps<Item>): {
65
65
  getOptionAtIndex: (index: number) => {
66
66
  data: OptionValue<Item>;
67
67
  element: HTMLElement;
68
- };
68
+ } | undefined;
69
69
  getIndexOfOption: (option: OptionValue<Item>) => number;
70
70
  getOptionsMatching: (predicate: (option: OptionValue<Item>) => boolean) => {
71
71
  data: OptionValue<Item>;
@@ -75,27 +75,27 @@ export declare function useListControl<Item>(props: ListControlProps<Item>): {
75
75
  getOptionAfter: (option: OptionValue<Item>) => {
76
76
  data: OptionValue<Item>;
77
77
  element: HTMLElement;
78
- };
78
+ } | undefined;
79
79
  getOptionBefore: (option: OptionValue<Item>) => {
80
80
  data: OptionValue<Item>;
81
81
  element: HTMLElement;
82
- };
82
+ } | undefined;
83
83
  getOptionPageAbove: (start: OptionValue<Item>) => {
84
84
  data: OptionValue<Item>;
85
85
  element: HTMLElement;
86
- } | null;
86
+ } | undefined;
87
87
  getOptionPageBelow: (start: OptionValue<Item>) => {
88
88
  data: OptionValue<Item>;
89
89
  element: HTMLElement;
90
- } | null;
90
+ } | undefined;
91
91
  getFirstOption: () => {
92
92
  data: OptionValue<Item>;
93
93
  element: HTMLElement;
94
- };
94
+ } | undefined;
95
95
  getLastOption: () => {
96
96
  data: OptionValue<Item>;
97
97
  element: HTMLElement;
98
- };
98
+ } | undefined;
99
99
  valueToString: (item: Item) => string;
100
100
  disabled: boolean | undefined;
101
101
  };
@@ -0,0 +1,99 @@
1
+ import { type HTMLAttributes } from "react";
2
+ export interface RangeSliderProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
3
+ /**
4
+ * Accessible text to announce maximum value label.
5
+ */
6
+ accessibleMaxText?: string;
7
+ /**
8
+ * Accessible text to announce minimum value label.
9
+ */
10
+ accessibleMinText?: string;
11
+ /**
12
+ * When minimum and maximum labels are defined, ensure
13
+ * they are confined within the boundary of the slider.
14
+ */
15
+ constrainLabelPosition?: boolean;
16
+ /**
17
+ * The number of allowed decimal places
18
+ * @default 2
19
+ */
20
+ decimalPlaces?: number;
21
+ /**
22
+ * The default value. Use when the component is not controlled.
23
+ * @default [min, min + (max - min) / 2]
24
+ */
25
+ defaultValue?: [number, number];
26
+ /**
27
+ * Disable the slider.
28
+ */
29
+ disabled?: boolean;
30
+ /**
31
+ * Show visual ticks above the marks.
32
+ */
33
+ showTicks?: boolean;
34
+ /**
35
+ * A callback to format the display value in the tooltip, min and max labels
36
+ * and the `aria-valuetext` attribute.
37
+ */
38
+ format?: (value: number) => string | number;
39
+ /**
40
+ * Marks that are displayed under the track.
41
+ */
42
+ marks?: {
43
+ label: string;
44
+ value: number;
45
+ }[];
46
+ /**
47
+ * Maximum slider value.
48
+ * @default 10
49
+ */
50
+ max?: number;
51
+ /**
52
+ * Minimum slider value.
53
+ * @default 0
54
+ */
55
+ min?: number;
56
+ /**
57
+ * Label for maximum value.
58
+ */
59
+ maxLabel?: string;
60
+ /**
61
+ * Label for minimum value.
62
+ */
63
+ minLabel?: string;
64
+ /**
65
+ * Callback called when slider value is changed.
66
+ * It provides a generic event and the current value of the slider.
67
+ */
68
+ onChange?: (event: Event, value: [number, number]) => void;
69
+ /**
70
+ * Callback called when the slider is stopped from being dragged or
71
+ * its value is changed from the keyboard. It provides a generic
72
+ * event and the current value of the slider.
73
+ */
74
+ onChangeEnd?: (event: Event, value: [number, number]) => void;
75
+ /**
76
+ * Restrict slider value to marks only. The step will be ignored.
77
+ */
78
+ restrictToMarks?: boolean;
79
+ /**
80
+ * Show the slider value in a tooltip when the thumb is hovered.
81
+ * @default true
82
+ */
83
+ showTooltip?: boolean;
84
+ /**
85
+ * Minimum interval the slider thumb can move.
86
+ * @default 1
87
+ */
88
+ step?: number;
89
+ /**
90
+ * Maximum interval the slider thumb can move when using PageUp and PageDown keys.
91
+ * @default 2
92
+ */
93
+ stepMultiplier?: number;
94
+ /**
95
+ * Value of the slider, to be used when in a controlled state.
96
+ */
97
+ value?: [number, number];
98
+ }
99
+ export declare const RangeSlider: import("react").ForwardRefExoticComponent<RangeSliderProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,100 @@
1
+ import { type HTMLAttributes } from "react";
2
+ export interface SliderProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
3
+ /**
4
+ * Accessible text to announce maximum value label.
5
+ */
6
+ accessibleMaxText?: string;
7
+ /**
8
+ * Accessible text to announce minimum value label.
9
+ */
10
+ accessibleMinText?: string;
11
+ /**
12
+ * When minimum and maximum labels are defined, ensure
13
+ * they are confined within the boundary of the slider.
14
+ * @default false
15
+ */
16
+ constrainLabelPosition?: boolean;
17
+ /**
18
+ * The number of allowed decimal places
19
+ * @default 2
20
+ */
21
+ decimalPlaces?: number;
22
+ /**
23
+ * The default value. Use when the component is not controlled.
24
+ * @default min + (max - min) / 2,
25
+ */
26
+ defaultValue?: number;
27
+ /**
28
+ * Disable the slider.
29
+ */
30
+ disabled?: boolean;
31
+ /**
32
+ * A callback to format the display value in the tooltip, min and max labels
33
+ * and the `aria-valuetext` attribute.
34
+ */
35
+ format?: (value: number) => string | number;
36
+ /**
37
+ * Marks that are displayed under the track.
38
+ */
39
+ marks?: {
40
+ label: string;
41
+ value: number;
42
+ }[];
43
+ /**
44
+ * Maximum slider value.
45
+ * @default 10
46
+ */
47
+ max?: number;
48
+ /**
49
+ * Minimum slider value.
50
+ * @default 0
51
+ */
52
+ min?: number;
53
+ /**
54
+ * Label for maximum value.
55
+ */
56
+ maxLabel?: string;
57
+ /**
58
+ * Label for the minimum value.
59
+ */
60
+ minLabel?: string;
61
+ /**
62
+ * Callback called when slider value is changed.
63
+ * It provides a generic event and the current value of the slider.
64
+ */
65
+ onChange?: (event: Event, value: number) => void;
66
+ /**
67
+ * Callback called when the slider is stopped from being dragged or
68
+ * its value is changed from the keyboard. It provides a generic
69
+ * event and the current value of the slider.
70
+ */
71
+ onChangeEnd?: (event: Event, value: number) => void;
72
+ /**
73
+ * Restrict slider value to marks only. The step will be ignored.
74
+ */
75
+ restrictToMarks?: boolean;
76
+ /**
77
+ * Show visual ticks above the marks.
78
+ */
79
+ showTicks?: boolean;
80
+ /**
81
+ * Show the slider value in a tooltip when the thumb is hovered.
82
+ * @default true
83
+ */
84
+ showTooltip?: boolean;
85
+ /**
86
+ * Minimum interval the slider thumb can move.
87
+ * @default 1
88
+ */
89
+ step?: number;
90
+ /**
91
+ * Maximum interval the slider thumb can move when using PageUp and PageDown keys.
92
+ * @default 2
93
+ */
94
+ stepMultiplier?: number;
95
+ /**
96
+ * Value of the slider, to be used when in a controlled state.
97
+ */
98
+ value?: number;
99
+ }
100
+ export declare const Slider: import("react").ForwardRefExoticComponent<SliderProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,2 @@
1
+ export * from "./Slider";
2
+ export * from "./RangeSlider";
@@ -0,0 +1,26 @@
1
+ import { type ChangeEvent, type ComponentPropsWithoutRef, type RefObject } from "react";
2
+ interface SliderThumbProps extends Omit<ComponentPropsWithoutRef<"input">, "onChange" | "defaultValue" | "min" | "max"> {
3
+ accessibleMaxText?: string;
4
+ accessibleMinText?: string;
5
+ disabled: boolean;
6
+ format?: (value: number) => number | string;
7
+ handleInputChange: (event: ChangeEvent<HTMLInputElement>) => void;
8
+ handleKeydownOnThumb: (event: React.KeyboardEvent) => void;
9
+ handlePointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;
10
+ index?: number;
11
+ inputRef?: RefObject<HTMLInputElement>;
12
+ isFocusVisible: boolean;
13
+ max: number;
14
+ maxLabel?: string;
15
+ min: number;
16
+ minLabel?: string;
17
+ offsetPercentage?: string;
18
+ restrictToMarks?: boolean;
19
+ showTooltip?: boolean;
20
+ sliderValue: [number, number] | number;
21
+ step: number;
22
+ stepMultiplier: number;
23
+ trackDragging: boolean;
24
+ }
25
+ export declare const SliderThumb: ({ "aria-label": ariaLabel, "aria-valuetext": ariaValueText, "aria-labelledby": ariaLabelledBy, accessibleMaxText, accessibleMinText, disabled, format, handleInputChange, handleKeydownOnThumb, handlePointerDown, index, inputRef, isFocusVisible, max, maxLabel, min, minLabel, offsetPercentage, restrictToMarks, showTooltip, sliderValue, step, stepMultiplier, trackDragging, ...rest }: SliderThumbProps) => import("react/jsx-runtime").JSX.Element;
26
+ export {};
@@ -0,0 +1,6 @@
1
+ interface SliderTooltipProps {
2
+ value: number | string;
3
+ open?: boolean;
4
+ }
5
+ export declare const SliderTooltip: ({ value, open }: SliderTooltipProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,24 @@
1
+ import { type HTMLAttributes, type RefObject } from "react";
2
+ interface SliderTrackProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
3
+ children: React.ReactNode;
4
+ constrainLabelPosition?: boolean;
5
+ disabled: boolean;
6
+ showTicks?: boolean;
7
+ format?: (value: number) => string | number;
8
+ handlePointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;
9
+ isDragging: boolean;
10
+ isRange?: boolean;
11
+ marks?: {
12
+ label: string;
13
+ value: number;
14
+ }[];
15
+ max: number;
16
+ maxLabel?: number | string;
17
+ min: number;
18
+ minLabel?: number | string;
19
+ progressPercentage?: number;
20
+ progressPercentageRange?: [number, number];
21
+ sliderRef: RefObject<HTMLDivElement>;
22
+ }
23
+ export declare const SliderTrack: import("react").ForwardRefExoticComponent<SliderTrackProps & import("react").RefAttributes<HTMLDivElement>>;
24
+ export {};
@@ -0,0 +1,30 @@
1
+ import { type ChangeEvent, type Dispatch, type RefObject, type SetStateAction } from "react";
2
+ import type { SliderProps } from "../Slider";
3
+ declare type UseRangeSliderThumbProps = Pick<SliderProps, "min" | "max" | "step"> & {
4
+ decimalPlaces: number;
5
+ handleInputChange: (event: ChangeEvent<HTMLInputElement>, thumbIndex: number) => void;
6
+ inputRefs: RefObject<HTMLInputElement>[];
7
+ marks?: {
8
+ label: string;
9
+ value: number;
10
+ }[];
11
+ onChange?: (event: Event, value: [number, number]) => void;
12
+ onChangeEnd?: (event: Event, value: [number, number]) => void;
13
+ restrictToMarks?: boolean;
14
+ setValue: Dispatch<SetStateAction<[number, number]>>;
15
+ stepMultiplier: number;
16
+ value: [number, number];
17
+ };
18
+ export declare const useRangeSliderThumb: ({ decimalPlaces, handleInputChange, inputRefs, marks, min, max, step, onChange, onChangeEnd, restrictToMarks, setValue, stepMultiplier, value, }: UseRangeSliderThumbProps) => {
19
+ handleBlur: (thumbIndex: number) => void;
20
+ handleFocus: (thumbIndex: number) => void;
21
+ handleKeydownOnThumb: (event: React.KeyboardEvent, thumbIndex: number) => void;
22
+ handlePointerDownOnThumb: (event: React.PointerEvent<HTMLDivElement>, thumbIndex: number) => void;
23
+ handlePointerDownOnTrack: (event: React.PointerEvent<HTMLDivElement>) => void;
24
+ isDragging: boolean;
25
+ isFocusVisible: boolean;
26
+ preventThumbOverlap: (currentValue: number, value: [number, number], thumbIndex: number) => [number, number];
27
+ sliderRef: RefObject<HTMLDivElement>;
28
+ thumbIndexState: number;
29
+ };
30
+ export {};
@@ -0,0 +1,28 @@
1
+ import { type ChangeEvent, type Dispatch, type RefObject, type SetStateAction } from "react";
2
+ import type { SliderProps } from "../Slider";
3
+ declare type UseSliderThumbProps = Pick<SliderProps, "min" | "max" | "step"> & {
4
+ decimalPlaces: number;
5
+ handleInputChange: (event: ChangeEvent<HTMLInputElement>) => void;
6
+ inputRef: RefObject<HTMLInputElement>;
7
+ marks?: {
8
+ label: string;
9
+ value: number;
10
+ }[];
11
+ onChange?: (event: Event, value: number) => void;
12
+ onChangeEnd?: (event: Event, value: number) => void;
13
+ restrictToMarks?: boolean;
14
+ setValue: Dispatch<SetStateAction<number>>;
15
+ stepMultiplier: number;
16
+ value: number;
17
+ };
18
+ export declare const useSliderThumb: ({ decimalPlaces, handleInputChange, inputRef, marks, min, max, step, onChange, onChangeEnd, restrictToMarks, setValue, stepMultiplier, value, }: UseSliderThumbProps) => {
19
+ handleBlur: () => void;
20
+ handleFocus: () => void;
21
+ handleKeydownOnThumb: (event: React.KeyboardEvent) => void;
22
+ handlePointerDownOnThumb: (event: React.PointerEvent<HTMLDivElement>) => void;
23
+ handlePointerDownOnTrack: (event: React.PointerEvent<HTMLDivElement>) => void;
24
+ isDragging: boolean;
25
+ isFocusVisible: boolean;
26
+ sliderRef: RefObject<HTMLDivElement>;
27
+ };
28
+ export {};
@@ -0,0 +1,20 @@
1
+ import type { RefObject } from "react";
2
+ export declare const toFloat: (value: number | string) => number;
3
+ export declare const calculateMarkPosition: (value: number | string, max: number, min: number) => number;
4
+ export declare const calculatePercentage: (value: number, max: number, min: number) => number;
5
+ export declare const clamp: (value: number, max: number, min: number, step: number, decimalPlaces: number, marks?: {
6
+ value: number;
7
+ label: string;
8
+ }[] | undefined, restrictToMarks?: boolean | undefined) => number;
9
+ export declare const clampRange: (range: [number, number], max: number, min: number, step: number, decimalPlaces: number, marks?: {
10
+ value: number;
11
+ label: string;
12
+ }[] | undefined, restrictToMarks?: boolean | undefined) => [number, number];
13
+ export declare const getClickedPosition: (sliderRef: RefObject<HTMLDivElement>, clientX: number, max: number, min: number, step: number, decimalPlaces: number, marks?: {
14
+ label: string;
15
+ value: number;
16
+ }[] | undefined, restrictToMarks?: boolean | undefined) => number | undefined;
17
+ export declare const getKeyboardValue: (event: React.KeyboardEvent, value: number, step: number, stepMultiplier: number, max: number, min: number, restrictToMarks?: boolean | undefined, marks?: {
18
+ label: string;
19
+ value: number;
20
+ }[] | undefined) => number;