@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.
- package/CHANGELOG.md +49 -0
- package/css/salt-core.css +256 -1
- package/dist-cjs/combo-box/ComboBox.js +4 -1
- package/dist-cjs/combo-box/ComboBox.js.map +1 -1
- package/dist-cjs/dropdown/Dropdown.js +6 -2
- package/dist-cjs/dropdown/Dropdown.js.map +1 -1
- package/dist-cjs/index.js +4 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/list-box/ListBox.js +6 -2
- package/dist-cjs/list-box/ListBox.js.map +1 -1
- package/dist-cjs/list-control/ListControlState.js +6 -5
- package/dist-cjs/list-control/ListControlState.js.map +1 -1
- package/dist-cjs/slider/RangeSlider.js +188 -0
- package/dist-cjs/slider/RangeSlider.js.map +1 -0
- package/dist-cjs/slider/Slider.js +151 -0
- package/dist-cjs/slider/Slider.js.map +1 -0
- package/dist-cjs/slider/internal/SliderThumb.css.js +6 -0
- package/dist-cjs/slider/internal/SliderThumb.css.js.map +1 -0
- package/dist-cjs/slider/internal/SliderThumb.js +141 -0
- package/dist-cjs/slider/internal/SliderThumb.js.map +1 -0
- package/dist-cjs/slider/internal/SliderTooltip.css.js +6 -0
- package/dist-cjs/slider/internal/SliderTooltip.css.js.map +1 -0
- package/dist-cjs/slider/internal/SliderTooltip.js +70 -0
- package/dist-cjs/slider/internal/SliderTooltip.js.map +1 -0
- package/dist-cjs/slider/internal/SliderTrack.css.js +6 -0
- package/dist-cjs/slider/internal/SliderTrack.css.js.map +1 -0
- package/dist-cjs/slider/internal/SliderTrack.js +179 -0
- package/dist-cjs/slider/internal/SliderTrack.js.map +1 -0
- package/dist-cjs/slider/internal/useRangeSliderThumb.js +234 -0
- package/dist-cjs/slider/internal/useRangeSliderThumb.js.map +1 -0
- package/dist-cjs/slider/internal/useSliderThumb.js +162 -0
- package/dist-cjs/slider/internal/useSliderThumb.js.map +1 -0
- package/dist-cjs/slider/internal/utils.js +127 -0
- package/dist-cjs/slider/internal/utils.js.map +1 -0
- package/dist-cjs/switch/Switch.js.map +1 -1
- package/dist-es/combo-box/ComboBox.js +4 -1
- package/dist-es/combo-box/ComboBox.js.map +1 -1
- package/dist-es/dropdown/Dropdown.js +6 -2
- package/dist-es/dropdown/Dropdown.js.map +1 -1
- package/dist-es/index.js +2 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/list-box/ListBox.js +6 -2
- package/dist-es/list-box/ListBox.js.map +1 -1
- package/dist-es/list-control/ListControlState.js +6 -5
- package/dist-es/list-control/ListControlState.js.map +1 -1
- package/dist-es/slider/RangeSlider.js +186 -0
- package/dist-es/slider/RangeSlider.js.map +1 -0
- package/dist-es/slider/Slider.js +149 -0
- package/dist-es/slider/Slider.js.map +1 -0
- package/dist-es/slider/internal/SliderThumb.css.js +4 -0
- package/dist-es/slider/internal/SliderThumb.css.js.map +1 -0
- package/dist-es/slider/internal/SliderThumb.js +139 -0
- package/dist-es/slider/internal/SliderThumb.js.map +1 -0
- package/dist-es/slider/internal/SliderTooltip.css.js +4 -0
- package/dist-es/slider/internal/SliderTooltip.css.js.map +1 -0
- package/dist-es/slider/internal/SliderTooltip.js +68 -0
- package/dist-es/slider/internal/SliderTooltip.js.map +1 -0
- package/dist-es/slider/internal/SliderTrack.css.js +4 -0
- package/dist-es/slider/internal/SliderTrack.css.js.map +1 -0
- package/dist-es/slider/internal/SliderTrack.js +177 -0
- package/dist-es/slider/internal/SliderTrack.js.map +1 -0
- package/dist-es/slider/internal/useRangeSliderThumb.js +232 -0
- package/dist-es/slider/internal/useRangeSliderThumb.js.map +1 -0
- package/dist-es/slider/internal/useSliderThumb.js +160 -0
- package/dist-es/slider/internal/useSliderThumb.js.map +1 -0
- package/dist-es/slider/internal/utils.js +119 -0
- package/dist-es/slider/internal/utils.js.map +1 -0
- package/dist-es/switch/Switch.js.map +1 -1
- package/dist-types/combo-box/useComboBox.d.ts +7 -7
- package/dist-types/index.d.ts +1 -0
- package/dist-types/list-control/ListControlState.d.ts +7 -7
- package/dist-types/slider/RangeSlider.d.ts +99 -0
- package/dist-types/slider/Slider.d.ts +100 -0
- package/dist-types/slider/index.d.ts +2 -0
- package/dist-types/slider/internal/SliderThumb.d.ts +26 -0
- package/dist-types/slider/internal/SliderTooltip.d.ts +6 -0
- package/dist-types/slider/internal/SliderTrack.d.ts +24 -0
- package/dist-types/slider/internal/useRangeSliderThumb.d.ts +30 -0
- package/dist-types/slider/internal/useSliderThumb.d.ts +28 -0
- package/dist-types/slider/internal/utils.d.ts +20 -0
- package/dist-types/switch/Switch.d.ts +7 -7
- 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
|
|
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
|
-
} |
|
|
47
|
+
} | undefined;
|
|
48
48
|
getOptionPageBelow: (start: OptionValue<Item>) => {
|
|
49
49
|
data: OptionValue<Item>;
|
|
50
50
|
element: HTMLElement;
|
|
51
|
-
} |
|
|
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
|
};
|
package/dist-types/index.d.ts
CHANGED
|
@@ -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
|
-
} |
|
|
86
|
+
} | undefined;
|
|
87
87
|
getOptionPageBelow: (start: OptionValue<Item>) => {
|
|
88
88
|
data: OptionValue<Item>;
|
|
89
89
|
element: HTMLElement;
|
|
90
|
-
} |
|
|
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,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,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;
|