@@ -42,7 +42,7 @@ function findClosest(values: number[], currentValue: number) {
4242 ( acc , value : number , index : number ) => {
4343 const distance = Math . abs ( currentValue - value ) ;
4444
45- if ( acc == null || distance < acc . distance || distance == = acc . distance ) {
45+ if ( acc == null || distance <= acc . distance ) {
4646 return {
4747 distance,
4848 index,
@@ -109,31 +109,18 @@ function roundValueToStep(value: number, step: number, min: number) {
109109 return Number ( nearest . toFixed ( getDecimalPrecision ( step ) ) ) ;
110110}
111111
112- function setValueIndex ( {
113- values,
114- newValue,
115- index,
116- } : {
117- values : number [ ] ;
118- newValue : number ;
119- index : number ;
120- } ) {
112+ function setValueIndex ( values : number [ ] , newValue : number , index : number ) {
121113 const output = values . slice ( ) ;
122114 output [ index ] = newValue ;
123115 return output . sort ( asc ) ;
124116}
125117
126- function focusThumb ( {
127- sliderRef,
128- activeIndex,
129- setActive,
130- focusVisible,
131- } : {
132- sliderRef : React . RefObject < any > ;
133- activeIndex : number ;
134- setActive ?: ( ( num : number ) => void ) | undefined ;
135- focusVisible ?: boolean | undefined ;
136- } ) {
118+ function focusThumb (
119+ sliderRef : React . RefObject < any > ,
120+ activeIndex : number ,
121+ setActive ?: ( ( num : number ) => void ) | undefined ,
122+ focusVisible ?: boolean | undefined ,
123+ ) {
137124 const doc = ownerDocument ( sliderRef . current ) ;
138125 if (
139126 ! sliderRef . current ?. contains ( doc . activeElement ) ||
@@ -271,21 +258,38 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
271258
272259 const range = Array . isArray ( valueDerived ) ;
273260 const values = React . useMemo ( ( ) => {
274- const raw = range ? ( valueDerived as number [ ] ) . slice ( ) . sort ( asc ) : [ valueDerived as number ] ;
275- return raw . map ( ( value ) => ( value == null ? min : clamp ( value , min , max ) ) ) ;
276- } , [ valueDerived , range , min , max ] ) ;
277-
278- const marks = React . useMemo < readonly Mark [ ] > (
279- ( ) =>
280- marksProp === true && step != null
281- ? [ ...Array ( Math . floor ( ( max - min ) / step ) + 1 ) ] . map ( ( _ , index ) => ( {
282- value : min + step * index ,
283- } ) )
284- : ( ( marksProp || EMPTY_MARKS ) as readonly Mark [ ] ) ,
285- [ marksProp , step , min , max ] ,
286- ) ;
261+ if ( ! Array . isArray ( valueDerived ) ) {
262+ return [ valueDerived == null ? min : clamp ( valueDerived , min , max ) ] ;
263+ }
264+
265+ const values = valueDerived . slice ( ) . sort ( asc ) ;
266+ for ( let i = 0 ; i < values . length ; i += 1 ) {
267+ const value = values [ i ] ;
268+ values [ i ] = value == null ? min : clamp ( value , min , max ) ;
269+ }
270+
271+ return values ;
272+ } , [ valueDerived , min , max ] ) ;
273+
274+ const marks = React . useMemo < readonly Mark [ ] > ( ( ) => {
275+ if ( marksProp === true && step != null ) {
276+ const marks = new Array < Mark > ( Math . floor ( ( max - min ) / step ) + 1 ) ;
277+ for ( let i = 0 ; i < marks . length ; i += 1 ) {
278+ marks [ i ] = { value : min + step * i } ;
279+ }
280+ return marks ;
281+ }
282+
283+ return Array . isArray ( marksProp ) ? marksProp : EMPTY_MARKS ;
284+ } , [ marksProp , step , min , max ] ) ;
287285
288- const marksValues = React . useMemo ( ( ) => marks . map ( ( mark ) => mark . value ) , [ marks ] ) ;
286+ const marksValues = React . useMemo ( ( ) => {
287+ const values = new Array < number > ( marks . length ) ;
288+ for ( let i = 0 ; i < marks . length ; i += 1 ) {
289+ values [ i ] = marks [ i ] . value ;
290+ }
291+ return values ;
292+ } , [ marks ] ) ;
289293
290294 const [ focusedThumbIndex , setFocusedThumbIndex ] = React . useState ( - 1 ) ;
291295
@@ -336,11 +340,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
336340 }
337341
338342 const previousValue = newValue ;
339- newValue = setValueIndex ( {
340- values,
341- newValue,
342- index,
343- } ) ;
343+ newValue = setValueIndex ( values , newValue , index ) ;
344344
345345 let activeIndex = index ;
346346
@@ -349,7 +349,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
349349 activeIndex = newValue . indexOf ( previousValue ) ;
350350 }
351351
352- focusThumb ( { sliderRef, activeIndex } ) ;
352+ focusThumb ( sliderRef , activeIndex ) ;
353353 }
354354
355355 setValueState ( newValue ) ;
@@ -530,11 +530,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
530530 }
531531
532532 const previousValue = newValue ;
533- newValue = setValueIndex ( {
534- values,
535- newValue,
536- index : activeIndex ,
537- } ) ;
533+ newValue = setValueIndex ( values , newValue , activeIndex ) ;
538534
539535 // Potentially swap the index if needed.
540536 if ( ! ( disableSwap && isDragging ) ) {
@@ -573,12 +569,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
573569 return ;
574570 }
575571
576- focusThumb ( {
577- sliderRef,
578- activeIndex : newFingerValue . activeIndex ,
579- setActive,
580- focusVisible : false ,
581- } ) ;
572+ focusThumb ( sliderRef , newFingerValue . activeIndex , setActive , false ) ;
582573 lastUsedThumbIndexRef . current = newFingerValue . activeIndex ;
583574 setValueState ( newFingerValue . newValue ) ;
584575
@@ -656,12 +647,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
656647 previousIndexRef . current = - 1 ;
657648 const newFingerValue = getValueAtFinger ( finger ) ;
658649 if ( newFingerValue ) {
659- focusThumb ( {
660- sliderRef,
661- activeIndex : newFingerValue . activeIndex ,
662- setActive,
663- focusVisible : false ,
664- } ) ;
650+ focusThumb ( sliderRef , newFingerValue . activeIndex , setActive , false ) ;
665651 lastUsedThumbIndexRef . current = newFingerValue . activeIndex ;
666652
667653 setValueState ( newFingerValue . newValue ) ;
@@ -745,11 +731,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
745731 cancelFocusFrame ( ) ;
746732 focusFrameRef . current = requestAnimationFrame ( ( ) => {
747733 focusFrameRef . current = null ;
748- focusThumb ( {
749- sliderRef,
750- activeIndex : newFingerValue . activeIndex ,
751- focusVisible : false ,
752- } ) ;
734+ focusThumb ( sliderRef , newFingerValue . activeIndex , undefined , false ) ;
753735 } ) ;
754736 }
755737
@@ -785,10 +767,10 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
785767 const getRootProps = < ExternalProps extends Record < string , unknown > = { } > (
786768 externalProps : ExternalProps = { } as ExternalProps ,
787769 ) : UseSliderRootSlotProps < ExternalProps > => {
788- const externalHandlers = extractEventHandlers ( externalProps ) ;
770+ const externalHandlers = extractEventHandlers ( externalProps ) || EMPTY_OBJ ;
789771
790772 const ownEventHandlers = {
791- onPointerDown : createHandlePointerDown ( externalHandlers || EMPTY_OBJ ) ,
773+ onPointerDown : createHandlePointerDown ( externalHandlers ) ,
792774 } ;
793775
794776 const mergedEventHandlers = {
@@ -821,11 +803,11 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
821803 const getThumbProps = < ExternalProps extends Record < string , unknown > = { } > (
822804 externalProps : ExternalProps = { } as ExternalProps ,
823805 ) : UseSliderThumbSlotProps < ExternalProps > => {
824- const externalHandlers = extractEventHandlers ( externalProps ) ;
806+ const externalHandlers = extractEventHandlers ( externalProps ) || EMPTY_OBJ ;
825807
826808 const ownEventHandlers = {
827- onMouseOver : createHandleMouseOver ( externalHandlers || EMPTY_OBJ ) ,
828- onMouseLeave : createHandleMouseLeave ( externalHandlers || EMPTY_OBJ ) ,
809+ onMouseOver : createHandleMouseOver ( externalHandlers ) ,
810+ onMouseLeave : createHandleMouseLeave ( externalHandlers ) ,
829811 } ;
830812
831813 return {
@@ -846,6 +828,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
846828 } else if ( active === index ) {
847829 zIndex = 1 ;
848830 }
831+
849832 return {
850833 // So the non active thumb doesn't show its label on hover.
851834 pointerEvents : active !== - 1 && active !== index ? 'none' : undefined ,
@@ -861,13 +844,13 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
861844 const getHiddenInputProps = < ExternalProps extends Record < string , unknown > = { } > (
862845 externalProps : ExternalProps = { } as ExternalProps ,
863846 ) : UseSliderHiddenInputProps < ExternalProps > => {
864- const externalHandlers = extractEventHandlers ( externalProps ) ;
847+ const externalHandlers = extractEventHandlers ( externalProps ) || EMPTY_OBJ ;
865848
866849 const ownEventHandlers = {
867- onChange : createHandleHiddenInputChange ( externalHandlers || EMPTY_OBJ ) ,
868- onFocus : createHandleHiddenInputFocus ( externalHandlers || EMPTY_OBJ ) ,
869- onBlur : createHandleHiddenInputBlur ( externalHandlers || EMPTY_OBJ ) ,
870- onKeyDown : createHandleHiddenInputKeyDown ( externalHandlers || EMPTY_OBJ ) ,
850+ onChange : createHandleHiddenInputChange ( externalHandlers ) ,
851+ onFocus : createHandleHiddenInputFocus ( externalHandlers ) ,
852+ onBlur : createHandleHiddenInputBlur ( externalHandlers ) ,
853+ onKeyDown : createHandleHiddenInputKeyDown ( externalHandlers ) ,
871854 } ;
872855
873856 const mergedEventHandlers = {
0 commit comments