@veeqo/ui 13.11.2 → 13.12.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/dist/components/Slider/Slider.cjs +71 -109
- package/dist/components/Slider/Slider.cjs.map +1 -1
- package/dist/components/Slider/Slider.d.ts +6 -2
- package/dist/components/Slider/Slider.js +72 -110
- package/dist/components/Slider/Slider.js.map +1 -1
- package/dist/components/Slider/Slider.module.scss.cjs +9 -0
- package/dist/components/Slider/Slider.module.scss.cjs.map +1 -0
- package/dist/components/Slider/Slider.module.scss.js +7 -0
- package/dist/components/Slider/Slider.module.scss.js.map +1 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.cjs +26 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.cjs.map +1 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.d.ts +7 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.js +20 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.js.map +1 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.module.scss.cjs +9 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.module.scss.cjs.map +1 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.module.scss.js +7 -0
- package/dist/components/Slider/components/SliderHandle/SliderHandle.module.scss.js.map +1 -0
- package/dist/components/Slider/components/SliderHandle/index.d.ts +1 -0
- package/dist/components/Slider/components/SliderHandle/types.d.ts +19 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.cjs +18 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.cjs.map +1 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.d.ts +7 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.js +12 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.js.map +1 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.module.scss.cjs +9 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.module.scss.cjs.map +1 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.module.scss.js +7 -0
- package/dist/components/Slider/components/SliderTrack/SliderTrack.module.scss.js.map +1 -0
- package/dist/components/Slider/components/SliderTrack/index.d.ts +1 -0
- package/dist/components/Slider/components/SliderTrack/types.d.ts +6 -0
- package/dist/components/Slider/hooks/index.d.ts +2 -0
- package/dist/components/Slider/hooks/types.d.ts +24 -0
- package/dist/components/Slider/hooks/useSliderDrag.cjs +85 -0
- package/dist/components/Slider/hooks/useSliderDrag.cjs.map +1 -0
- package/dist/components/Slider/hooks/useSliderDrag.d.ts +11 -0
- package/dist/components/Slider/hooks/useSliderDrag.js +83 -0
- package/dist/components/Slider/hooks/useSliderDrag.js.map +1 -0
- package/dist/components/Slider/hooks/useSliderKeyboard.cjs +85 -0
- package/dist/components/Slider/hooks/useSliderKeyboard.cjs.map +1 -0
- package/dist/components/Slider/hooks/useSliderKeyboard.d.ts +9 -0
- package/dist/components/Slider/hooks/useSliderKeyboard.js +83 -0
- package/dist/components/Slider/hooks/useSliderKeyboard.js.map +1 -0
- package/dist/components/Slider/types.d.ts +7 -8
- package/dist/components/Slider/utils/calculateSliderValue.cjs +32 -0
- package/dist/components/Slider/utils/calculateSliderValue.cjs.map +1 -0
- package/dist/components/Slider/utils/calculateSliderValue.d.ts +5 -0
- package/dist/components/Slider/utils/calculateSliderValue.js +30 -0
- package/dist/components/Slider/utils/calculateSliderValue.js.map +1 -0
- package/dist/components/Slider/utils/index.d.ts +1 -0
- package/dist/components/Slider/utils/types.d.ts +7 -0
- package/package.json +1 -1
- package/dist/components/Slider/styled.cjs +0 -23
- package/dist/components/Slider/styled.cjs.map +0 -1
- package/dist/components/Slider/styled.d.ts +0 -8
- package/dist/components/Slider/styled.js +0 -14
- package/dist/components/Slider/styled.js.map +0 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
var styled = require('./styled.cjs');
|
|
5
4
|
var buildClassnames = require('../../utils/buildClassnames.cjs');
|
|
5
|
+
var SliderHandle = require('./components/SliderHandle/SliderHandle.cjs');
|
|
6
|
+
var SliderTrack = require('./components/SliderTrack/SliderTrack.cjs');
|
|
7
|
+
var useSliderDrag = require('./hooks/useSliderDrag.cjs');
|
|
8
|
+
var useSliderKeyboard = require('./hooks/useSliderKeyboard.cjs');
|
|
9
|
+
var Slider_module = require('./Slider.module.scss.cjs');
|
|
6
10
|
|
|
7
11
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
12
|
|
|
@@ -15,102 +19,60 @@ const generateClassNames = (prefix) => ({
|
|
|
15
19
|
startSlider: prefix ? `${prefix}-start-slider` : undefined,
|
|
16
20
|
endSlider: prefix ? `${prefix}-end-slider` : undefined,
|
|
17
21
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Slider component for selecting a single value or a range of values.
|
|
24
|
+
* Supports value labels on hover/drag, disabled state, and optional fill visualization.
|
|
25
|
+
*/
|
|
26
|
+
const Slider = ({ id, value, min, max, step = 1, onChange, className, e2eClassName, showFill = false, showValueLabel = false, disabled = false, ariaLabel = 'Slider', ariaLabelledBy, onSlideStart = () => { }, onSlideEnd = () => { }, }) => {
|
|
27
|
+
// Track which handle is being hovered/focused for value label display
|
|
28
|
+
const [hoveredHandle, setHoveredHandle] = React.useState(null);
|
|
29
|
+
const [focusedHandle, setFocusedHandle] = React.useState(null);
|
|
30
|
+
// DOM reference for drag calculations
|
|
21
31
|
const containerRef = React.useRef(null);
|
|
22
|
-
|
|
23
|
-
const
|
|
32
|
+
// DOM references for focus during keyboard navigation
|
|
33
|
+
const startHandleRef = React.useRef(null);
|
|
34
|
+
const endHandleRef = React.useRef(null);
|
|
24
35
|
const classNames = generateClassNames(className);
|
|
25
36
|
const e2eClassNames = generateClassNames(e2eClassName);
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
else {
|
|
66
|
-
resultValue = newValue;
|
|
67
|
-
}
|
|
68
|
-
onChange(resultValue);
|
|
69
|
-
if (Array.isArray(resultValue) && resultValue[0] === resultValue[1]) {
|
|
70
|
-
if (draggingSliderIndex === 0)
|
|
71
|
-
setDraggingSliderIndex(1);
|
|
72
|
-
if (draggingSliderIndex === 1)
|
|
73
|
-
setDraggingSliderIndex(0);
|
|
74
|
-
}
|
|
75
|
-
}, [draggingSliderIndex, isDragging, max, min, onChange, step, value]);
|
|
76
|
-
const handleMouseUp = React.useCallback(() => {
|
|
77
|
-
setIsDragging(false);
|
|
78
|
-
onSlideEnd();
|
|
79
|
-
}, [onSlideEnd]);
|
|
80
|
-
const handleMouseDown = React.useCallback((e, index) => {
|
|
81
|
-
setIsDragging(true);
|
|
82
|
-
onSlideStart();
|
|
83
|
-
if (typeof index === 'number')
|
|
84
|
-
setDraggingSliderIndex(index);
|
|
85
|
-
e.preventDefault();
|
|
86
|
-
}, [onSlideStart]);
|
|
87
|
-
React.useEffect(() => {
|
|
88
|
-
const handleStartSliderMouseDown = (e) => handleMouseDown(e, Array.isArray(value) ? 0 : 1);
|
|
89
|
-
const handleEndSliderMouseDown = (e) => handleMouseDown(e, 1);
|
|
90
|
-
const startSliderEl = startSliderRef.current;
|
|
91
|
-
const endSliderEl = endSliderRef.current;
|
|
92
|
-
startSliderEl === null || startSliderEl === undefined ? undefined : startSliderEl.addEventListener('mousedown', handleStartSliderMouseDown);
|
|
93
|
-
endSliderEl === null || endSliderEl === undefined ? undefined : endSliderEl.addEventListener('mousedown', handleEndSliderMouseDown);
|
|
94
|
-
document.addEventListener('mousemove', handleMouseMove);
|
|
95
|
-
document.addEventListener('mouseup', handleMouseUp);
|
|
96
|
-
return () => {
|
|
97
|
-
startSliderEl === null || startSliderEl === undefined ? undefined : startSliderEl.removeEventListener('mousedown', handleStartSliderMouseDown);
|
|
98
|
-
endSliderEl === null || endSliderEl === undefined ? undefined : endSliderEl.removeEventListener('mousedown', handleEndSliderMouseDown);
|
|
99
|
-
document.removeEventListener('mousemove', handleMouseMove);
|
|
100
|
-
document.removeEventListener('mouseup', handleMouseUp);
|
|
101
|
-
};
|
|
102
|
-
}, [handleMouseDown, handleMouseMove, handleMouseUp, value]);
|
|
103
|
-
const renderSlider = (left, valueNow, index) => {
|
|
104
|
-
let sliderClassName;
|
|
105
|
-
if (typeof index === 'number') {
|
|
106
|
-
sliderClassName = buildClassnames.buildClassnames(index === 0
|
|
107
|
-
? [classNames === null || classNames === undefined ? undefined : classNames.startSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.startSlider]
|
|
108
|
-
: [classNames === null || classNames === undefined ? undefined : classNames.endSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.endSlider]);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
sliderClassName = buildClassnames.buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.slider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.slider]);
|
|
112
|
-
}
|
|
113
|
-
return (React__default.default.createElement(styled.SliderDiv, { role: "slider", ref: index === 1 ? endSliderRef : startSliderRef, className: sliderClassName, left: left, "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": valueNow }));
|
|
37
|
+
const { isDraggingHandle, handleMouseDown } = useSliderDrag.useSliderDrag({
|
|
38
|
+
containerRef,
|
|
39
|
+
value,
|
|
40
|
+
min,
|
|
41
|
+
max,
|
|
42
|
+
step,
|
|
43
|
+
disabled,
|
|
44
|
+
onChange,
|
|
45
|
+
onSlideStart,
|
|
46
|
+
onSlideEnd,
|
|
47
|
+
});
|
|
48
|
+
const { handleKeyDown } = useSliderKeyboard.useSliderKeyboard({
|
|
49
|
+
value,
|
|
50
|
+
min,
|
|
51
|
+
max,
|
|
52
|
+
step,
|
|
53
|
+
disabled,
|
|
54
|
+
onChange,
|
|
55
|
+
setFocusedHandle,
|
|
56
|
+
startHandleRef,
|
|
57
|
+
endHandleRef,
|
|
58
|
+
});
|
|
59
|
+
const renderSlider = (horizontalPosition, valueNow, handle) => {
|
|
60
|
+
const isActive = isDraggingHandle === handle;
|
|
61
|
+
const sliderClassName = handle === 'start'
|
|
62
|
+
? buildClassnames.buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.startSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.startSlider])
|
|
63
|
+
: buildClassnames.buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.endSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.endSlider]);
|
|
64
|
+
const isHovered = hoveredHandle === handle;
|
|
65
|
+
const isFocused = focusedHandle === handle;
|
|
66
|
+
const showLabel = showValueLabel && !disabled && (isActive || isHovered || isFocused);
|
|
67
|
+
return (React__default.default.createElement(SliderHandle.SliderHandle, { ref: handle === 'start' ? startHandleRef : endHandleRef, horizontalPosition: horizontalPosition, value: valueNow, min: min, max: max, disabled: disabled, isActive: isActive, showLabel: showLabel, className: sliderClassName, ariaLabel: ariaLabel, ariaLabelledBy: ariaLabelledBy, onMouseDown: handleMouseDown(handle), onMouseEnter: () => {
|
|
68
|
+
if (disabled)
|
|
69
|
+
return;
|
|
70
|
+
setHoveredHandle(handle);
|
|
71
|
+
}, onMouseLeave: () => setHoveredHandle(null), onFocus: () => {
|
|
72
|
+
if (disabled)
|
|
73
|
+
return;
|
|
74
|
+
setFocusedHandle(handle);
|
|
75
|
+
}, onBlur: () => setFocusedHandle(null), onKeyDown: handleKeyDown(handle) }));
|
|
114
76
|
};
|
|
115
77
|
const renderRangeSlider = (rangeSliderValue) => {
|
|
116
78
|
// handle value used to get slider position relative to container from value
|
|
@@ -118,29 +80,29 @@ const Slider = ({ id, value, min, max, step = 1, onChange, className, e2eClassNa
|
|
|
118
80
|
const handleValueEnd = ((rangeSliderValue[1] > max ? 100 : rangeSliderValue[1] - min) * 100) / (max - min);
|
|
119
81
|
const rangeWidth = handleValueEnd - handleValueStart;
|
|
120
82
|
return (React__default.default.createElement(React__default.default.Fragment, null,
|
|
121
|
-
React__default.default.createElement(
|
|
122
|
-
renderSlider(handleValueStart, rangeSliderValue[0],
|
|
123
|
-
renderSlider(handleValueEnd, rangeSliderValue[1],
|
|
83
|
+
React__default.default.createElement(SliderTrack.SliderTrack, { left: handleValueStart, width: rangeWidth, disabled: disabled, className: buildClassnames.buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.sliderRange, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.sliderRange]) }),
|
|
84
|
+
renderSlider(handleValueStart, rangeSliderValue[0], 'start'),
|
|
85
|
+
renderSlider(handleValueEnd, rangeSliderValue[1], 'end')));
|
|
124
86
|
};
|
|
125
87
|
const renderSingleSlider = (sliderValue) => {
|
|
126
|
-
if (Array.isArray(value))
|
|
127
|
-
return renderRangeSlider(value);
|
|
128
88
|
let handleValue;
|
|
129
|
-
if (
|
|
89
|
+
if (sliderValue > max)
|
|
130
90
|
handleValue = 100;
|
|
131
|
-
else if (
|
|
91
|
+
else if (sliderValue < min)
|
|
132
92
|
handleValue = 0;
|
|
133
93
|
else
|
|
134
94
|
handleValue = ((sliderValue - min) * 100) / (max - min);
|
|
135
|
-
return
|
|
95
|
+
return (React__default.default.createElement(React__default.default.Fragment, null,
|
|
96
|
+
showFill && (React__default.default.createElement(SliderTrack.SliderTrack, { left: 0, width: handleValue, disabled: disabled, className: buildClassnames.buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.sliderRange, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.sliderRange]) })),
|
|
97
|
+
renderSlider(handleValue, sliderValue, 'end')));
|
|
136
98
|
};
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
React__default.default.createElement(
|
|
99
|
+
const render = Array.isArray(value) ? renderRangeSlider(value) : renderSingleSlider(value);
|
|
100
|
+
return (React__default.default.createElement("div", { className: buildClassnames.buildClassnames([
|
|
101
|
+
Slider_module.container,
|
|
102
|
+
classNames === null || classNames === undefined ? undefined : classNames.container,
|
|
103
|
+
e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.container,
|
|
104
|
+
]), id: id, ref: containerRef },
|
|
105
|
+
React__default.default.createElement("div", { className: Slider_module.track }),
|
|
144
106
|
render));
|
|
145
107
|
};
|
|
146
108
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slider.cjs","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { SliderContainer, SliderTrack, SliderRange, SliderDiv } from './styled';\nimport { SliderComponentPropTypes, DraggingSliderIndex, ClassNamesReturnPayload } from './types';\nimport { buildClassnames } from '../../utils/buildClassnames';\n\nconst generateClassNames = (prefix: string | undefined): ClassNamesReturnPayload => ({\n container: prefix ? `${prefix}-slider-container` : undefined,\n sliderRange: prefix ? `${prefix}-slider-range` : undefined,\n slider: prefix ? `${prefix}-slider` : undefined,\n startSlider: prefix ? `${prefix}-start-slider` : undefined,\n endSlider: prefix ? `${prefix}-end-slider` : undefined,\n});\n\nexport const Slider = ({\n id,\n value,\n min,\n max,\n step = 1,\n onChange,\n className,\n e2eClassName,\n onSlideStart = () => {},\n onSlideEnd = () => {},\n}: SliderComponentPropTypes) => {\n const [isDragging, setIsDragging] = useState(false);\n const [draggingSliderIndex, setDraggingSliderIndex] = useState<DraggingSliderIndex>(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const startSliderRef = useRef<HTMLDivElement>(null);\n const endSliderRef = useRef<HTMLDivElement>(null);\n const classNames = generateClassNames(className);\n const e2eClassNames = generateClassNames(e2eClassName);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !containerRef.current) return;\n const sliderValue: number =\n draggingSliderIndex > -1 ? (value as number[])[draggingSliderIndex] : (value as number);\n const containerSize = containerRef.current.getBoundingClientRect();\n // slider position relative to the container in percents\n const handleValue = ((e.pageX - containerSize.x) * 100) / containerSize.width;\n // current value by slider position\n let newValue = (max - min) * (handleValue / 100) + min;\n\n const diff = sliderValue - newValue;\n\n // use to apply step to new value\n if (diff > 0) {\n newValue = sliderValue + Math.ceil(newValue / step - sliderValue / step) * step;\n }\n if (diff < 0) {\n newValue = sliderValue + Math.floor(newValue / step - sliderValue / step) * step;\n }\n\n if (sliderValue === newValue) return;\n if (newValue > max) newValue = max;\n if (newValue < min) newValue = min;\n\n if (Array.isArray(value)) {\n if (draggingSliderIndex === 0 && newValue > value[1]) [, newValue] = value;\n if (draggingSliderIndex === 1 && newValue < value[0]) [newValue] = value;\n }\n\n // used to fix 0.30000000000000004 problem\n const decimalPlaces = step.toString().includes('.')\n ? step.toString().split('.').pop()?.length\n : 0;\n newValue = Number(newValue.toFixed(decimalPlaces));\n\n let resultValue;\n if (Array.isArray(value)) {\n resultValue = draggingSliderIndex === 0 ? [newValue, value[1]] : [value[0], newValue];\n } else {\n resultValue = newValue;\n }\n\n onChange(resultValue);\n\n if (Array.isArray(resultValue) && resultValue[0] === resultValue[1]) {\n if (draggingSliderIndex === 0) setDraggingSliderIndex(1);\n if (draggingSliderIndex === 1) setDraggingSliderIndex(0);\n }\n },\n [draggingSliderIndex, isDragging, max, min, onChange, step, value],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n onSlideEnd();\n }, [onSlideEnd]);\n const handleMouseDown = useCallback(\n (e: Event, index: DraggingSliderIndex) => {\n setIsDragging(true);\n onSlideStart();\n if (typeof index === 'number') setDraggingSliderIndex(index);\n e.preventDefault();\n },\n [onSlideStart],\n );\n\n useEffect(() => {\n const handleStartSliderMouseDown = (e: Event) =>\n handleMouseDown(e, Array.isArray(value) ? 0 : 1);\n const handleEndSliderMouseDown = (e: Event) => handleMouseDown(e, 1);\n\n const startSliderEl = startSliderRef.current;\n const endSliderEl = endSliderRef.current;\n\n startSliderEl?.addEventListener('mousedown', handleStartSliderMouseDown);\n endSliderEl?.addEventListener('mousedown', handleEndSliderMouseDown);\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n startSliderEl?.removeEventListener('mousedown', handleStartSliderMouseDown);\n endSliderEl?.removeEventListener('mousedown', handleEndSliderMouseDown);\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseDown, handleMouseMove, handleMouseUp, value]);\n\n const renderSlider = (left: number, valueNow: number, index?: 0 | 1) => {\n let sliderClassName;\n\n if (typeof index === 'number') {\n sliderClassName = buildClassnames(\n index === 0\n ? [classNames?.startSlider, e2eClassNames?.startSlider]\n : [classNames?.endSlider, e2eClassNames?.endSlider],\n );\n } else {\n sliderClassName = buildClassnames([classNames?.slider, e2eClassNames?.slider]);\n }\n\n return (\n <SliderDiv\n role=\"slider\"\n ref={index === 1 ? endSliderRef : startSliderRef}\n className={sliderClassName}\n left={left}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={valueNow}\n />\n );\n };\n\n const renderRangeSlider = (rangeSliderValue: number[]) => {\n // handle value used to get slider position relative to container from value\n const handleValueStart =\n ((rangeSliderValue[0] < min ? 0 : rangeSliderValue[0] - min) * 100) / (max - min);\n const handleValueEnd =\n ((rangeSliderValue[1] > max ? 100 : rangeSliderValue[1] - min) * 100) / (max - min);\n\n const rangeWidth = handleValueEnd - handleValueStart;\n\n return (\n <>\n <SliderRange\n className={buildClassnames([classNames?.sliderRange, e2eClassNames?.sliderRange])}\n left={handleValueStart}\n width={rangeWidth}\n />\n {renderSlider(handleValueStart, rangeSliderValue[0], 0)}\n {renderSlider(handleValueEnd, rangeSliderValue[1], 1)}\n </>\n );\n };\n\n const renderSingleSlider = (sliderValue: number) => {\n if (Array.isArray(value)) return renderRangeSlider(value as number[]);\n\n let handleValue: number;\n\n if (value > max) handleValue = 100;\n else if (value < min) handleValue = 0;\n else handleValue = ((sliderValue - min) * 100) / (max - min);\n\n return renderSlider(handleValue, sliderValue);\n };\n\n let render;\n if (Array.isArray(value)) render = renderRangeSlider(value);\n else render = renderSingleSlider(value);\n\n return (\n <SliderContainer\n className={buildClassnames([classNames?.container, e2eClassNames?.container])}\n id={id}\n ref={containerRef}\n >\n <SliderTrack />\n {render}\n </SliderContainer>\n );\n};\n"],"names":["useState","useRef","useCallback","useEffect","buildClassnames","React","SliderDiv","SliderRange","SliderContainer","SliderTrack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Slider.cjs","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport { SliderComponentProps, ClassNamesReturnPayload, DraggingHandle } from './types';\nimport { buildClassnames } from '../../utils/buildClassnames';\nimport { SliderHandle } from './components/SliderHandle';\nimport { SliderTrack } from './components/SliderTrack';\nimport { useSliderDrag, useSliderKeyboard } from './hooks';\nimport styles from './Slider.module.scss';\n\nconst generateClassNames = (prefix: string | undefined): ClassNamesReturnPayload => ({\n container: prefix ? `${prefix}-slider-container` : undefined,\n sliderRange: prefix ? `${prefix}-slider-range` : undefined,\n slider: prefix ? `${prefix}-slider` : undefined,\n startSlider: prefix ? `${prefix}-start-slider` : undefined,\n endSlider: prefix ? `${prefix}-end-slider` : undefined,\n});\n\n/**\n * Slider component for selecting a single value or a range of values.\n * Supports value labels on hover/drag, disabled state, and optional fill visualization.\n */\nexport const Slider = ({\n id,\n\n value,\n min,\n max,\n step = 1,\n onChange,\n\n className,\n e2eClassName,\n\n showFill = false,\n showValueLabel = false,\n disabled = false,\n ariaLabel = 'Slider',\n ariaLabelledBy,\n\n onSlideStart = () => {},\n onSlideEnd = () => {},\n}: SliderComponentProps) => {\n // Track which handle is being hovered/focused for value label display\n const [hoveredHandle, setHoveredHandle] = useState<DraggingHandle>(null);\n const [focusedHandle, setFocusedHandle] = useState<DraggingHandle>(null);\n\n // DOM reference for drag calculations\n const containerRef = useRef<HTMLDivElement>(null);\n // DOM references for focus during keyboard navigation\n const startHandleRef = useRef<HTMLDivElement>(null);\n const endHandleRef = useRef<HTMLDivElement>(null);\n\n const classNames = generateClassNames(className);\n const e2eClassNames = generateClassNames(e2eClassName);\n\n const { isDraggingHandle, handleMouseDown } = useSliderDrag({\n containerRef,\n value,\n min,\n max,\n step,\n disabled,\n onChange,\n onSlideStart,\n onSlideEnd,\n });\n\n const { handleKeyDown } = useSliderKeyboard({\n value,\n min,\n max,\n step,\n disabled,\n onChange,\n setFocusedHandle,\n startHandleRef,\n endHandleRef,\n });\n\n const renderSlider = (horizontalPosition: number, valueNow: number, handle: 'start' | 'end') => {\n const isActive = isDraggingHandle === handle;\n\n const sliderClassName =\n handle === 'start'\n ? buildClassnames([classNames?.startSlider, e2eClassNames?.startSlider])\n : buildClassnames([classNames?.endSlider, e2eClassNames?.endSlider]);\n\n const isHovered = hoveredHandle === handle;\n const isFocused = focusedHandle === handle;\n const showLabel = showValueLabel && !disabled && (isActive || isHovered || isFocused);\n\n return (\n <SliderHandle\n ref={handle === 'start' ? startHandleRef : endHandleRef}\n horizontalPosition={horizontalPosition}\n value={valueNow}\n min={min}\n max={max}\n disabled={disabled}\n isActive={isActive}\n showLabel={showLabel}\n className={sliderClassName}\n ariaLabel={ariaLabel}\n ariaLabelledBy={ariaLabelledBy}\n onMouseDown={handleMouseDown(handle)}\n onMouseEnter={() => {\n if (disabled) return;\n setHoveredHandle(handle);\n }}\n onMouseLeave={() => setHoveredHandle(null)}\n onFocus={() => {\n if (disabled) return;\n setFocusedHandle(handle);\n }}\n onBlur={() => setFocusedHandle(null)}\n onKeyDown={handleKeyDown(handle)}\n />\n );\n };\n\n const renderRangeSlider = (rangeSliderValue: number[]) => {\n // handle value used to get slider position relative to container from value\n const handleValueStart =\n ((rangeSliderValue[0] < min ? 0 : rangeSliderValue[0] - min) * 100) / (max - min);\n const handleValueEnd =\n ((rangeSliderValue[1] > max ? 100 : rangeSliderValue[1] - min) * 100) / (max - min);\n\n const rangeWidth = handleValueEnd - handleValueStart;\n\n return (\n <>\n <SliderTrack\n left={handleValueStart}\n width={rangeWidth}\n disabled={disabled}\n className={buildClassnames([classNames?.sliderRange, e2eClassNames?.sliderRange])}\n />\n {renderSlider(handleValueStart, rangeSliderValue[0], 'start')}\n {renderSlider(handleValueEnd, rangeSliderValue[1], 'end')}\n </>\n );\n };\n\n const renderSingleSlider = (sliderValue: number) => {\n let handleValue: number;\n\n if (sliderValue > max) handleValue = 100;\n else if (sliderValue < min) handleValue = 0;\n else handleValue = ((sliderValue - min) * 100) / (max - min);\n\n return (\n <>\n {showFill && (\n <SliderTrack\n left={0}\n width={handleValue}\n disabled={disabled}\n className={buildClassnames([classNames?.sliderRange, e2eClassNames?.sliderRange])}\n />\n )}\n {renderSlider(handleValue, sliderValue, 'end')}\n </>\n );\n };\n\n const render = Array.isArray(value) ? renderRangeSlider(value) : renderSingleSlider(value);\n\n return (\n <div\n className={buildClassnames([\n styles.container,\n classNames?.container,\n e2eClassNames?.container,\n ])}\n id={id}\n ref={containerRef}\n >\n <div className={styles.track} />\n {render}\n </div>\n );\n};\n"],"names":["useState","useRef","useSliderDrag","useSliderKeyboard","buildClassnames","React","SliderHandle","SliderTrack","styles"],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { SliderComponentProps } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Slider component for selecting a single value or a range of values.
|
|
5
|
+
* Supports value labels on hover/drag, disabled state, and optional fill visualization.
|
|
6
|
+
*/
|
|
7
|
+
export declare const Slider: ({ id, value, min, max, step, onChange, className, e2eClassName, showFill, showValueLabel, disabled, ariaLabel, ariaLabelledBy, onSlideStart, onSlideEnd, }: SliderComponentProps) => React.JSX.Element;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import React__default, { useState, useRef
|
|
2
|
-
import { SliderContainer, SliderTrack, SliderRange, SliderDiv } from './styled.js';
|
|
1
|
+
import React__default, { useState, useRef } from 'react';
|
|
3
2
|
import { buildClassnames } from '../../utils/buildClassnames.js';
|
|
3
|
+
import { SliderHandle } from './components/SliderHandle/SliderHandle.js';
|
|
4
|
+
import { SliderTrack } from './components/SliderTrack/SliderTrack.js';
|
|
5
|
+
import { useSliderDrag } from './hooks/useSliderDrag.js';
|
|
6
|
+
import { useSliderKeyboard } from './hooks/useSliderKeyboard.js';
|
|
7
|
+
import styles from './Slider.module.scss.js';
|
|
4
8
|
|
|
5
9
|
const generateClassNames = (prefix) => ({
|
|
6
10
|
container: prefix ? `${prefix}-slider-container` : undefined,
|
|
@@ -9,102 +13,60 @@ const generateClassNames = (prefix) => ({
|
|
|
9
13
|
startSlider: prefix ? `${prefix}-start-slider` : undefined,
|
|
10
14
|
endSlider: prefix ? `${prefix}-end-slider` : undefined,
|
|
11
15
|
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Slider component for selecting a single value or a range of values.
|
|
18
|
+
* Supports value labels on hover/drag, disabled state, and optional fill visualization.
|
|
19
|
+
*/
|
|
20
|
+
const Slider = ({ id, value, min, max, step = 1, onChange, className, e2eClassName, showFill = false, showValueLabel = false, disabled = false, ariaLabel = 'Slider', ariaLabelledBy, onSlideStart = () => { }, onSlideEnd = () => { }, }) => {
|
|
21
|
+
// Track which handle is being hovered/focused for value label display
|
|
22
|
+
const [hoveredHandle, setHoveredHandle] = useState(null);
|
|
23
|
+
const [focusedHandle, setFocusedHandle] = useState(null);
|
|
24
|
+
// DOM reference for drag calculations
|
|
15
25
|
const containerRef = useRef(null);
|
|
16
|
-
|
|
17
|
-
const
|
|
26
|
+
// DOM references for focus during keyboard navigation
|
|
27
|
+
const startHandleRef = useRef(null);
|
|
28
|
+
const endHandleRef = useRef(null);
|
|
18
29
|
const classNames = generateClassNames(className);
|
|
19
30
|
const e2eClassNames = generateClassNames(e2eClassName);
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
else {
|
|
60
|
-
resultValue = newValue;
|
|
61
|
-
}
|
|
62
|
-
onChange(resultValue);
|
|
63
|
-
if (Array.isArray(resultValue) && resultValue[0] === resultValue[1]) {
|
|
64
|
-
if (draggingSliderIndex === 0)
|
|
65
|
-
setDraggingSliderIndex(1);
|
|
66
|
-
if (draggingSliderIndex === 1)
|
|
67
|
-
setDraggingSliderIndex(0);
|
|
68
|
-
}
|
|
69
|
-
}, [draggingSliderIndex, isDragging, max, min, onChange, step, value]);
|
|
70
|
-
const handleMouseUp = useCallback(() => {
|
|
71
|
-
setIsDragging(false);
|
|
72
|
-
onSlideEnd();
|
|
73
|
-
}, [onSlideEnd]);
|
|
74
|
-
const handleMouseDown = useCallback((e, index) => {
|
|
75
|
-
setIsDragging(true);
|
|
76
|
-
onSlideStart();
|
|
77
|
-
if (typeof index === 'number')
|
|
78
|
-
setDraggingSliderIndex(index);
|
|
79
|
-
e.preventDefault();
|
|
80
|
-
}, [onSlideStart]);
|
|
81
|
-
useEffect(() => {
|
|
82
|
-
const handleStartSliderMouseDown = (e) => handleMouseDown(e, Array.isArray(value) ? 0 : 1);
|
|
83
|
-
const handleEndSliderMouseDown = (e) => handleMouseDown(e, 1);
|
|
84
|
-
const startSliderEl = startSliderRef.current;
|
|
85
|
-
const endSliderEl = endSliderRef.current;
|
|
86
|
-
startSliderEl === null || startSliderEl === undefined ? undefined : startSliderEl.addEventListener('mousedown', handleStartSliderMouseDown);
|
|
87
|
-
endSliderEl === null || endSliderEl === undefined ? undefined : endSliderEl.addEventListener('mousedown', handleEndSliderMouseDown);
|
|
88
|
-
document.addEventListener('mousemove', handleMouseMove);
|
|
89
|
-
document.addEventListener('mouseup', handleMouseUp);
|
|
90
|
-
return () => {
|
|
91
|
-
startSliderEl === null || startSliderEl === undefined ? undefined : startSliderEl.removeEventListener('mousedown', handleStartSliderMouseDown);
|
|
92
|
-
endSliderEl === null || endSliderEl === undefined ? undefined : endSliderEl.removeEventListener('mousedown', handleEndSliderMouseDown);
|
|
93
|
-
document.removeEventListener('mousemove', handleMouseMove);
|
|
94
|
-
document.removeEventListener('mouseup', handleMouseUp);
|
|
95
|
-
};
|
|
96
|
-
}, [handleMouseDown, handleMouseMove, handleMouseUp, value]);
|
|
97
|
-
const renderSlider = (left, valueNow, index) => {
|
|
98
|
-
let sliderClassName;
|
|
99
|
-
if (typeof index === 'number') {
|
|
100
|
-
sliderClassName = buildClassnames(index === 0
|
|
101
|
-
? [classNames === null || classNames === undefined ? undefined : classNames.startSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.startSlider]
|
|
102
|
-
: [classNames === null || classNames === undefined ? undefined : classNames.endSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.endSlider]);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
sliderClassName = buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.slider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.slider]);
|
|
106
|
-
}
|
|
107
|
-
return (React__default.createElement(SliderDiv, { role: "slider", ref: index === 1 ? endSliderRef : startSliderRef, className: sliderClassName, left: left, "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": valueNow }));
|
|
31
|
+
const { isDraggingHandle, handleMouseDown } = useSliderDrag({
|
|
32
|
+
containerRef,
|
|
33
|
+
value,
|
|
34
|
+
min,
|
|
35
|
+
max,
|
|
36
|
+
step,
|
|
37
|
+
disabled,
|
|
38
|
+
onChange,
|
|
39
|
+
onSlideStart,
|
|
40
|
+
onSlideEnd,
|
|
41
|
+
});
|
|
42
|
+
const { handleKeyDown } = useSliderKeyboard({
|
|
43
|
+
value,
|
|
44
|
+
min,
|
|
45
|
+
max,
|
|
46
|
+
step,
|
|
47
|
+
disabled,
|
|
48
|
+
onChange,
|
|
49
|
+
setFocusedHandle,
|
|
50
|
+
startHandleRef,
|
|
51
|
+
endHandleRef,
|
|
52
|
+
});
|
|
53
|
+
const renderSlider = (horizontalPosition, valueNow, handle) => {
|
|
54
|
+
const isActive = isDraggingHandle === handle;
|
|
55
|
+
const sliderClassName = handle === 'start'
|
|
56
|
+
? buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.startSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.startSlider])
|
|
57
|
+
: buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.endSlider, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.endSlider]);
|
|
58
|
+
const isHovered = hoveredHandle === handle;
|
|
59
|
+
const isFocused = focusedHandle === handle;
|
|
60
|
+
const showLabel = showValueLabel && !disabled && (isActive || isHovered || isFocused);
|
|
61
|
+
return (React__default.createElement(SliderHandle, { ref: handle === 'start' ? startHandleRef : endHandleRef, horizontalPosition: horizontalPosition, value: valueNow, min: min, max: max, disabled: disabled, isActive: isActive, showLabel: showLabel, className: sliderClassName, ariaLabel: ariaLabel, ariaLabelledBy: ariaLabelledBy, onMouseDown: handleMouseDown(handle), onMouseEnter: () => {
|
|
62
|
+
if (disabled)
|
|
63
|
+
return;
|
|
64
|
+
setHoveredHandle(handle);
|
|
65
|
+
}, onMouseLeave: () => setHoveredHandle(null), onFocus: () => {
|
|
66
|
+
if (disabled)
|
|
67
|
+
return;
|
|
68
|
+
setFocusedHandle(handle);
|
|
69
|
+
}, onBlur: () => setFocusedHandle(null), onKeyDown: handleKeyDown(handle) }));
|
|
108
70
|
};
|
|
109
71
|
const renderRangeSlider = (rangeSliderValue) => {
|
|
110
72
|
// handle value used to get slider position relative to container from value
|
|
@@ -112,29 +74,29 @@ const Slider = ({ id, value, min, max, step = 1, onChange, className, e2eClassNa
|
|
|
112
74
|
const handleValueEnd = ((rangeSliderValue[1] > max ? 100 : rangeSliderValue[1] - min) * 100) / (max - min);
|
|
113
75
|
const rangeWidth = handleValueEnd - handleValueStart;
|
|
114
76
|
return (React__default.createElement(React__default.Fragment, null,
|
|
115
|
-
React__default.createElement(
|
|
116
|
-
renderSlider(handleValueStart, rangeSliderValue[0],
|
|
117
|
-
renderSlider(handleValueEnd, rangeSliderValue[1],
|
|
77
|
+
React__default.createElement(SliderTrack, { left: handleValueStart, width: rangeWidth, disabled: disabled, className: buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.sliderRange, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.sliderRange]) }),
|
|
78
|
+
renderSlider(handleValueStart, rangeSliderValue[0], 'start'),
|
|
79
|
+
renderSlider(handleValueEnd, rangeSliderValue[1], 'end')));
|
|
118
80
|
};
|
|
119
81
|
const renderSingleSlider = (sliderValue) => {
|
|
120
|
-
if (Array.isArray(value))
|
|
121
|
-
return renderRangeSlider(value);
|
|
122
82
|
let handleValue;
|
|
123
|
-
if (
|
|
83
|
+
if (sliderValue > max)
|
|
124
84
|
handleValue = 100;
|
|
125
|
-
else if (
|
|
85
|
+
else if (sliderValue < min)
|
|
126
86
|
handleValue = 0;
|
|
127
87
|
else
|
|
128
88
|
handleValue = ((sliderValue - min) * 100) / (max - min);
|
|
129
|
-
return
|
|
89
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
90
|
+
showFill && (React__default.createElement(SliderTrack, { left: 0, width: handleValue, disabled: disabled, className: buildClassnames([classNames === null || classNames === undefined ? undefined : classNames.sliderRange, e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.sliderRange]) })),
|
|
91
|
+
renderSlider(handleValue, sliderValue, 'end')));
|
|
130
92
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
React__default.createElement(
|
|
93
|
+
const render = Array.isArray(value) ? renderRangeSlider(value) : renderSingleSlider(value);
|
|
94
|
+
return (React__default.createElement("div", { className: buildClassnames([
|
|
95
|
+
styles.container,
|
|
96
|
+
classNames === null || classNames === undefined ? undefined : classNames.container,
|
|
97
|
+
e2eClassNames === null || e2eClassNames === undefined ? undefined : e2eClassNames.container,
|
|
98
|
+
]), id: id, ref: containerRef },
|
|
99
|
+
React__default.createElement("div", { className: styles.track }),
|
|
138
100
|
render));
|
|
139
101
|
};
|
|
140
102
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slider.js","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { SliderContainer, SliderTrack, SliderRange, SliderDiv } from './styled';\nimport { SliderComponentPropTypes, DraggingSliderIndex, ClassNamesReturnPayload } from './types';\nimport { buildClassnames } from '../../utils/buildClassnames';\n\nconst generateClassNames = (prefix: string | undefined): ClassNamesReturnPayload => ({\n container: prefix ? `${prefix}-slider-container` : undefined,\n sliderRange: prefix ? `${prefix}-slider-range` : undefined,\n slider: prefix ? `${prefix}-slider` : undefined,\n startSlider: prefix ? `${prefix}-start-slider` : undefined,\n endSlider: prefix ? `${prefix}-end-slider` : undefined,\n});\n\nexport const Slider = ({\n id,\n value,\n min,\n max,\n step = 1,\n onChange,\n className,\n e2eClassName,\n onSlideStart = () => {},\n onSlideEnd = () => {},\n}: SliderComponentPropTypes) => {\n const [isDragging, setIsDragging] = useState(false);\n const [draggingSliderIndex, setDraggingSliderIndex] = useState<DraggingSliderIndex>(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const startSliderRef = useRef<HTMLDivElement>(null);\n const endSliderRef = useRef<HTMLDivElement>(null);\n const classNames = generateClassNames(className);\n const e2eClassNames = generateClassNames(e2eClassName);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !containerRef.current) return;\n const sliderValue: number =\n draggingSliderIndex > -1 ? (value as number[])[draggingSliderIndex] : (value as number);\n const containerSize = containerRef.current.getBoundingClientRect();\n // slider position relative to the container in percents\n const handleValue = ((e.pageX - containerSize.x) * 100) / containerSize.width;\n // current value by slider position\n let newValue = (max - min) * (handleValue / 100) + min;\n\n const diff = sliderValue - newValue;\n\n // use to apply step to new value\n if (diff > 0) {\n newValue = sliderValue + Math.ceil(newValue / step - sliderValue / step) * step;\n }\n if (diff < 0) {\n newValue = sliderValue + Math.floor(newValue / step - sliderValue / step) * step;\n }\n\n if (sliderValue === newValue) return;\n if (newValue > max) newValue = max;\n if (newValue < min) newValue = min;\n\n if (Array.isArray(value)) {\n if (draggingSliderIndex === 0 && newValue > value[1]) [, newValue] = value;\n if (draggingSliderIndex === 1 && newValue < value[0]) [newValue] = value;\n }\n\n // used to fix 0.30000000000000004 problem\n const decimalPlaces = step.toString().includes('.')\n ? step.toString().split('.').pop()?.length\n : 0;\n newValue = Number(newValue.toFixed(decimalPlaces));\n\n let resultValue;\n if (Array.isArray(value)) {\n resultValue = draggingSliderIndex === 0 ? [newValue, value[1]] : [value[0], newValue];\n } else {\n resultValue = newValue;\n }\n\n onChange(resultValue);\n\n if (Array.isArray(resultValue) && resultValue[0] === resultValue[1]) {\n if (draggingSliderIndex === 0) setDraggingSliderIndex(1);\n if (draggingSliderIndex === 1) setDraggingSliderIndex(0);\n }\n },\n [draggingSliderIndex, isDragging, max, min, onChange, step, value],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n onSlideEnd();\n }, [onSlideEnd]);\n const handleMouseDown = useCallback(\n (e: Event, index: DraggingSliderIndex) => {\n setIsDragging(true);\n onSlideStart();\n if (typeof index === 'number') setDraggingSliderIndex(index);\n e.preventDefault();\n },\n [onSlideStart],\n );\n\n useEffect(() => {\n const handleStartSliderMouseDown = (e: Event) =>\n handleMouseDown(e, Array.isArray(value) ? 0 : 1);\n const handleEndSliderMouseDown = (e: Event) => handleMouseDown(e, 1);\n\n const startSliderEl = startSliderRef.current;\n const endSliderEl = endSliderRef.current;\n\n startSliderEl?.addEventListener('mousedown', handleStartSliderMouseDown);\n endSliderEl?.addEventListener('mousedown', handleEndSliderMouseDown);\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n startSliderEl?.removeEventListener('mousedown', handleStartSliderMouseDown);\n endSliderEl?.removeEventListener('mousedown', handleEndSliderMouseDown);\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseDown, handleMouseMove, handleMouseUp, value]);\n\n const renderSlider = (left: number, valueNow: number, index?: 0 | 1) => {\n let sliderClassName;\n\n if (typeof index === 'number') {\n sliderClassName = buildClassnames(\n index === 0\n ? [classNames?.startSlider, e2eClassNames?.startSlider]\n : [classNames?.endSlider, e2eClassNames?.endSlider],\n );\n } else {\n sliderClassName = buildClassnames([classNames?.slider, e2eClassNames?.slider]);\n }\n\n return (\n <SliderDiv\n role=\"slider\"\n ref={index === 1 ? endSliderRef : startSliderRef}\n className={sliderClassName}\n left={left}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={valueNow}\n />\n );\n };\n\n const renderRangeSlider = (rangeSliderValue: number[]) => {\n // handle value used to get slider position relative to container from value\n const handleValueStart =\n ((rangeSliderValue[0] < min ? 0 : rangeSliderValue[0] - min) * 100) / (max - min);\n const handleValueEnd =\n ((rangeSliderValue[1] > max ? 100 : rangeSliderValue[1] - min) * 100) / (max - min);\n\n const rangeWidth = handleValueEnd - handleValueStart;\n\n return (\n <>\n <SliderRange\n className={buildClassnames([classNames?.sliderRange, e2eClassNames?.sliderRange])}\n left={handleValueStart}\n width={rangeWidth}\n />\n {renderSlider(handleValueStart, rangeSliderValue[0], 0)}\n {renderSlider(handleValueEnd, rangeSliderValue[1], 1)}\n </>\n );\n };\n\n const renderSingleSlider = (sliderValue: number) => {\n if (Array.isArray(value)) return renderRangeSlider(value as number[]);\n\n let handleValue: number;\n\n if (value > max) handleValue = 100;\n else if (value < min) handleValue = 0;\n else handleValue = ((sliderValue - min) * 100) / (max - min);\n\n return renderSlider(handleValue, sliderValue);\n };\n\n let render;\n if (Array.isArray(value)) render = renderRangeSlider(value);\n else render = renderSingleSlider(value);\n\n return (\n <SliderContainer\n className={buildClassnames([classNames?.container, e2eClassNames?.container])}\n id={id}\n ref={containerRef}\n >\n <SliderTrack />\n {render}\n </SliderContainer>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Slider.js","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport { SliderComponentProps, ClassNamesReturnPayload, DraggingHandle } from './types';\nimport { buildClassnames } from '../../utils/buildClassnames';\nimport { SliderHandle } from './components/SliderHandle';\nimport { SliderTrack } from './components/SliderTrack';\nimport { useSliderDrag, useSliderKeyboard } from './hooks';\nimport styles from './Slider.module.scss';\n\nconst generateClassNames = (prefix: string | undefined): ClassNamesReturnPayload => ({\n container: prefix ? `${prefix}-slider-container` : undefined,\n sliderRange: prefix ? `${prefix}-slider-range` : undefined,\n slider: prefix ? `${prefix}-slider` : undefined,\n startSlider: prefix ? `${prefix}-start-slider` : undefined,\n endSlider: prefix ? `${prefix}-end-slider` : undefined,\n});\n\n/**\n * Slider component for selecting a single value or a range of values.\n * Supports value labels on hover/drag, disabled state, and optional fill visualization.\n */\nexport const Slider = ({\n id,\n\n value,\n min,\n max,\n step = 1,\n onChange,\n\n className,\n e2eClassName,\n\n showFill = false,\n showValueLabel = false,\n disabled = false,\n ariaLabel = 'Slider',\n ariaLabelledBy,\n\n onSlideStart = () => {},\n onSlideEnd = () => {},\n}: SliderComponentProps) => {\n // Track which handle is being hovered/focused for value label display\n const [hoveredHandle, setHoveredHandle] = useState<DraggingHandle>(null);\n const [focusedHandle, setFocusedHandle] = useState<DraggingHandle>(null);\n\n // DOM reference for drag calculations\n const containerRef = useRef<HTMLDivElement>(null);\n // DOM references for focus during keyboard navigation\n const startHandleRef = useRef<HTMLDivElement>(null);\n const endHandleRef = useRef<HTMLDivElement>(null);\n\n const classNames = generateClassNames(className);\n const e2eClassNames = generateClassNames(e2eClassName);\n\n const { isDraggingHandle, handleMouseDown } = useSliderDrag({\n containerRef,\n value,\n min,\n max,\n step,\n disabled,\n onChange,\n onSlideStart,\n onSlideEnd,\n });\n\n const { handleKeyDown } = useSliderKeyboard({\n value,\n min,\n max,\n step,\n disabled,\n onChange,\n setFocusedHandle,\n startHandleRef,\n endHandleRef,\n });\n\n const renderSlider = (horizontalPosition: number, valueNow: number, handle: 'start' | 'end') => {\n const isActive = isDraggingHandle === handle;\n\n const sliderClassName =\n handle === 'start'\n ? buildClassnames([classNames?.startSlider, e2eClassNames?.startSlider])\n : buildClassnames([classNames?.endSlider, e2eClassNames?.endSlider]);\n\n const isHovered = hoveredHandle === handle;\n const isFocused = focusedHandle === handle;\n const showLabel = showValueLabel && !disabled && (isActive || isHovered || isFocused);\n\n return (\n <SliderHandle\n ref={handle === 'start' ? startHandleRef : endHandleRef}\n horizontalPosition={horizontalPosition}\n value={valueNow}\n min={min}\n max={max}\n disabled={disabled}\n isActive={isActive}\n showLabel={showLabel}\n className={sliderClassName}\n ariaLabel={ariaLabel}\n ariaLabelledBy={ariaLabelledBy}\n onMouseDown={handleMouseDown(handle)}\n onMouseEnter={() => {\n if (disabled) return;\n setHoveredHandle(handle);\n }}\n onMouseLeave={() => setHoveredHandle(null)}\n onFocus={() => {\n if (disabled) return;\n setFocusedHandle(handle);\n }}\n onBlur={() => setFocusedHandle(null)}\n onKeyDown={handleKeyDown(handle)}\n />\n );\n };\n\n const renderRangeSlider = (rangeSliderValue: number[]) => {\n // handle value used to get slider position relative to container from value\n const handleValueStart =\n ((rangeSliderValue[0] < min ? 0 : rangeSliderValue[0] - min) * 100) / (max - min);\n const handleValueEnd =\n ((rangeSliderValue[1] > max ? 100 : rangeSliderValue[1] - min) * 100) / (max - min);\n\n const rangeWidth = handleValueEnd - handleValueStart;\n\n return (\n <>\n <SliderTrack\n left={handleValueStart}\n width={rangeWidth}\n disabled={disabled}\n className={buildClassnames([classNames?.sliderRange, e2eClassNames?.sliderRange])}\n />\n {renderSlider(handleValueStart, rangeSliderValue[0], 'start')}\n {renderSlider(handleValueEnd, rangeSliderValue[1], 'end')}\n </>\n );\n };\n\n const renderSingleSlider = (sliderValue: number) => {\n let handleValue: number;\n\n if (sliderValue > max) handleValue = 100;\n else if (sliderValue < min) handleValue = 0;\n else handleValue = ((sliderValue - min) * 100) / (max - min);\n\n return (\n <>\n {showFill && (\n <SliderTrack\n left={0}\n width={handleValue}\n disabled={disabled}\n className={buildClassnames([classNames?.sliderRange, e2eClassNames?.sliderRange])}\n />\n )}\n {renderSlider(handleValue, sliderValue, 'end')}\n </>\n );\n };\n\n const render = Array.isArray(value) ? renderRangeSlider(value) : renderSingleSlider(value);\n\n return (\n <div\n className={buildClassnames([\n styles.container,\n classNames?.container,\n e2eClassNames?.container,\n ])}\n id={id}\n ref={containerRef}\n >\n <div className={styles.track} />\n {render}\n </div>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ___$insertStyle = require('../../_virtual/____insertStyle.cjs');
|
|
4
|
+
|
|
5
|
+
___$insertStyle("._container_qqnkn_1 {\n --track-height: var(--sizes-1);\n --slider-size: var(--sizes-3);\n --additional-padding: calc(var(--sizes-1) / 2);\n --border-size: var(--sizes-1);\n min-width: var(--sizes-20);\n display: inline-block;\n position: relative;\n padding: calc(var(--slider-size) / 2 + var(--additional-padding)) 0;\n}\n\n._track_qqnkn_12 {\n background: var(--colors-neutral-grey-base);\n height: var(--track-height);\n border-radius: var(--radius-base);\n}");
|
|
6
|
+
var styles = {"container":"_container_qqnkn_1","track":"_track_qqnkn_12"};
|
|
7
|
+
|
|
8
|
+
module.exports = styles;
|
|
9
|
+
//# sourceMappingURL=Slider.module.scss.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.module.scss.cjs","sources":["../../../src/components/Slider/Slider.module.scss"],"sourcesContent":[".container {\n --track-height: var(--sizes-1);\n --slider-size: var(--sizes-3);\n --additional-padding: calc(var(--sizes-1) / 2);\n --border-size: var(--sizes-1);\n\n min-width: var(--sizes-20);\n display: inline-block;\n position: relative;\n padding: calc(var(--slider-size) / 2 + var(--additional-padding)) 0;\n}\n\n.track {\n background: var(--colors-neutral-grey-base);\n height: var(--track-height);\n border-radius: var(--radius-base);\n}\n"],"names":[],"mappings":";;;;AACE,eAAA,CAAA,2dAAA;AACA,aAAA,CAAA,WAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,iBAAA;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import insertStyle from '../../_virtual/____insertStyle.js';
|
|
2
|
+
|
|
3
|
+
insertStyle("._container_qqnkn_1 {\n --track-height: var(--sizes-1);\n --slider-size: var(--sizes-3);\n --additional-padding: calc(var(--sizes-1) / 2);\n --border-size: var(--sizes-1);\n min-width: var(--sizes-20);\n display: inline-block;\n position: relative;\n padding: calc(var(--slider-size) / 2 + var(--additional-padding)) 0;\n}\n\n._track_qqnkn_12 {\n background: var(--colors-neutral-grey-base);\n height: var(--track-height);\n border-radius: var(--radius-base);\n}");
|
|
4
|
+
var styles = {"container":"_container_qqnkn_1","track":"_track_qqnkn_12"};
|
|
5
|
+
|
|
6
|
+
export { styles as default };
|
|
7
|
+
//# sourceMappingURL=Slider.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.module.scss.js","sources":["../../../src/components/Slider/Slider.module.scss"],"sourcesContent":[".container {\n --track-height: var(--sizes-1);\n --slider-size: var(--sizes-3);\n --additional-padding: calc(var(--sizes-1) / 2);\n --border-size: var(--sizes-1);\n\n min-width: var(--sizes-20);\n display: inline-block;\n position: relative;\n padding: calc(var(--slider-size) / 2 + var(--additional-padding)) 0;\n}\n\n.track {\n background: var(--colors-neutral-grey-base);\n height: var(--track-height);\n border-radius: var(--radius-base);\n}\n"],"names":["___$insertStyle"],"mappings":";;AACEA,WAAA,CAAA,2dAAA;AACA,aAAA,CAAA,WAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,iBAAA;;;;"}
|