diff --git a/src/Range/Range.tsx b/src/Range/Range.tsx index 56821b78..db1499ef 100644 --- a/src/Range/Range.tsx +++ b/src/Range/Range.tsx @@ -15,10 +15,12 @@ export type RangeProps = Omit< IComponentBaseProps & { color?: ComponentColor size?: ComponentSize + displayTicks?: boolean + ticksStep: number } const Range = forwardRef( - ({ color, size, step, dataTheme, className, ...props }, ref): JSX.Element => { + ({ color, size, step, displayTicks, ticksStep, dataTheme, className, ...props }, ref): JSX.Element => { const classes = twMerge( 'range', className, @@ -37,13 +39,14 @@ const Range = forwardRef( }) ) - const isNumeric = (n: any): n is number => - !isNaN(parseFloat(n)) && isFinite(n) + const calculatedDisplayTicks = displayTicks ?? (step !== undefined); + const calculatedStep = step !== undefined ? Number(step) : 1; // default value per HTML standard + const calculatedTicksStep = ticksStep ?? calculatedStep; + const min = props.min !== undefined ? Number(props.min) : 0; // default value per HTML standard + const max = props.max !== undefined ? Number(props.max) : 100; // default value per HTML standard - const numSteps = useMemo(() => { - const safeStep = Math.max(1, Number(step)) - return Math.ceil(100 / safeStep) ?? 1 - }, [props.max, step]) + // use Math.max to solve multiple issues with negative numbers throwing errors + const numTicks = Math.max(Math.ceil((max - min) / calculatedTicksStep), 1) + 1; return ( <> @@ -55,9 +58,9 @@ const Range = forwardRef( data-theme={dataTheme} className={classes} /> - {isNumeric(step) && ( + {calculatedDisplayTicks && (
- {[...Array(numSteps + 1)].map((_, i) => { + {[...Array(numTicks)].map((_, i) => { return | })}