MCPcopy Create free account
hub / github.com/DavidHDev/react-bits / Slider

Function Slider

src/tailwind/Components/ElasticSlider/ElasticSlider.jsx:31–171  ·  view source on GitHub ↗
({ defaultValue, startingValue, maxValue, isStepped, stepSize, leftIcon, rightIcon })

Source from the content-addressed store, hash-verified

29}
30
31function Slider({ defaultValue, startingValue, maxValue, isStepped, stepSize, leftIcon, rightIcon }) {
32 const [value, setValue] = useState(defaultValue);
33 const sliderRef = useRef(null);
34 const [region, setRegion] = useState('middle');
35 const clientX = useMotionValue(0);
36 const overflow = useMotionValue(0);
37 const scale = useMotionValue(1);
38
39 useEffect(() => {
40 setValue(defaultValue);
41 }, [defaultValue]);
42
43 useMotionValueEvent(clientX, 'change', latest => {
44 if (sliderRef.current) {
45 const { left, right } = sliderRef.current.getBoundingClientRect();
46 let newValue;
47
48 if (latest < left) {
49 setRegion('left');
50 newValue = left - latest;
51 } else if (latest > right) {
52 setRegion('right');
53 newValue = latest - right;
54 } else {
55 setRegion('middle');
56 newValue = 0;
57 }
58
59 overflow.jump(decay(newValue, MAX_OVERFLOW));
60 }
61 });
62
63 const handlePointerMove = e => {
64 if (e.buttons > 0 && sliderRef.current) {
65 const { left, width } = sliderRef.current.getBoundingClientRect();
66 let newValue = startingValue + ((e.clientX - left) / width) * (maxValue - startingValue);
67
68 if (isStepped) {
69 newValue = Math.round(newValue / stepSize) * stepSize;
70 }
71
72 newValue = Math.min(Math.max(newValue, startingValue), maxValue);
73 setValue(newValue);
74 clientX.jump(e.clientX);
75 }
76 };
77
78 const handlePointerDown = e => {
79 handlePointerMove(e);
80 e.currentTarget.setPointerCapture(e.pointerId);
81 };
82
83 const handlePointerUp = () => {
84 animate(overflow, 0, { type: 'spring', bounce: 0.5 });
85 };
86
87 const getRangePercentage = () => {
88 const totalRange = maxValue - startingValue;

Callers

nothing calls this directly

Calls 3

decayFunction · 0.70
getRangePercentageFunction · 0.70
animateFunction · 0.50

Tested by

no test coverage detected