@@ -57,7 +57,7 @@ export interface SliderProps<ValueType = number | number[]> {
5757 id ?: string ;
5858
5959 // Status
60- disabled ?: boolean ;
60+ disabled ?: boolean | boolean [ ] ;
6161 keyboard ?: boolean ;
6262 autoFocus ?: boolean ;
6363 onFocus ?: ( e : React . FocusEvent < HTMLDivElement > ) => void ;
@@ -131,8 +131,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
131131
132132 id,
133133
134- // Status
135- disabled = false ,
134+ disabled : rawDisabled = false ,
136135 keyboard = true ,
137136 autoFocus,
138137 onFocus,
@@ -188,6 +187,24 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
188187 const handlesRef = React . useRef < HandlesRef > ( null ) ;
189188 const containerRef = React . useRef < HTMLDivElement > ( null ) ;
190189
190+ // ============================ Disabled ============================
191+ const disabled = React . useMemo ( ( ) => {
192+ if ( typeof rawDisabled === 'boolean' ) {
193+ return rawDisabled ;
194+ }
195+ return rawDisabled . every ( ( d ) => d ) ;
196+ } , [ rawDisabled ] ) ;
197+
198+ const isHandleDisabled = React . useCallback (
199+ ( index : number ) => {
200+ if ( typeof rawDisabled === 'boolean' ) {
201+ return rawDisabled ;
202+ }
203+ return rawDisabled [ index ] || false ;
204+ } ,
205+ [ rawDisabled ] ,
206+ ) ;
207+
191208 const direction = React . useMemo < Direction > ( ( ) => {
192209 if ( vertical ) {
193210 return reverse ? 'ttb' : 'btt' ;
@@ -247,6 +264,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
247264 markList ,
248265 allowCross ,
249266 mergedPush ,
267+ isHandleDisabled ,
250268 ) ;
251269
252270 // ============================ Values ============================
@@ -321,7 +339,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
321339 } ) ;
322340
323341 const onDelete = ( index : number ) => {
324- if ( disabled || ! rangeEditable || rawValues . length <= minCount ) {
342+ if ( disabled || ! rangeEditable || rawValues . length <= minCount || isHandleDisabled ( index ) ) {
325343 return ;
326344 }
327345
@@ -348,6 +366,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
348366 offsetValues ,
349367 rangeEditable ,
350368 minCount ,
369+ isHandleDisabled ,
351370 ) ;
352371
353372 /**
@@ -378,10 +397,39 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
378397 let focusIndex = valueIndex ;
379398
380399 if ( rangeEditable && valueDist !== 0 && ( ! maxCount || rawValues . length < maxCount ) ) {
400+ const leftDisabled = isHandleDisabled ( valueBeforeIndex ) ;
401+ const rightDisabled = isHandleDisabled ( valueBeforeIndex + 1 ) ;
402+
403+ if ( leftDisabled && rightDisabled ) {
404+ return ;
405+ }
406+
381407 cloneNextValues . splice ( valueBeforeIndex + 1 , 0 , newValue ) ;
382408 focusIndex = valueBeforeIndex + 1 ;
383409 } else {
410+ if ( isHandleDisabled ( valueIndex ) ) {
411+ let nearestIndex = - 1 ;
412+ let nearestDist = mergedMax - mergedMin ;
413+
414+ rawValues . forEach ( ( val , index ) => {
415+ if ( ! isHandleDisabled ( index ) ) {
416+ const dist = Math . abs ( newValue - val ) ;
417+ if ( dist < nearestDist ) {
418+ nearestDist = dist ;
419+ nearestIndex = index ;
420+ }
421+ }
422+ } ) ;
423+
424+ // If all handles are disabled, do nothing
425+ if ( nearestIndex === - 1 ) {
426+ return ;
427+ }
428+
429+ valueIndex = nearestIndex ;
430+ }
384431 cloneNextValues [ valueIndex ] = newValue ;
432+ focusIndex = valueIndex ;
385433 }
386434
387435 // Fill value to match default 2 (only when `rawValues` is empty)
@@ -443,7 +491,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
443491 const [ keyboardValue , setKeyboardValue ] = React . useState < number > ( null ) ;
444492
445493 const onHandleOffsetChange = ( offset : number | 'min' | 'max' , valueIndex : number ) => {
446- if ( ! disabled ) {
494+ if ( ! disabled && ! isHandleDisabled ( valueIndex ) ) {
447495 const next = offsetValues ( rawValues , offset , valueIndex ) ;
448496
449497 onBeforeChange ?.( getTriggerValue ( rawValues ) ) ;
@@ -546,6 +594,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
546594 ariaValueTextFormatterForHandle,
547595 styles : styles || { } ,
548596 classNames : classNames || { } ,
597+ isHandleDisabled,
549598 } ) ,
550599 [
551600 mergedMin ,
@@ -565,6 +614,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
565614 ariaValueTextFormatterForHandle ,
566615 styles ,
567616 classNames ,
617+ isHandleDisabled ,
568618 ] ,
569619 ) ;
570620
0 commit comments