Range Slider

Range Slider is a component that allows you to select a range between two values.

Source
Theme Source
pnpm dlx dreamy add range-slider
<RangeSlider.Root>
	<RangeSlider.Track maxW="xs">
		<RangeSlider.FilledTrack />
		<RangeSlider.Thumb index={0} />
		<RangeSlider.Thumb index={1} />
	</RangeSlider.Track>
</RangeSlider.Root>

You can change the max, min, and step of the Range Slider by using the max, min, and step props.

Range: 0 - 25

function MaxMinRangeSlider() {
    const [value, setValue] = useState<[number, number]>([0, 25]);
 
    return (
        <>
            <Text>
                Range: {value[0]} - {value[1]}
            </Text>
 
            <RangeSlider.Root
                min={0}
                max={50}
                step={5}
                value={value}
                onChangeValue={setValue}
                >
                <RangeSlider.Track maxW="xs">
                    <RangeSlider.FilledTrack />
                    <RangeSlider.Thumb index={0} />
                    <RangeSlider.Thumb index={1} />
                </RangeSlider.Track>
            </RangeSlider.Root>
        </>
    );
}

You can change the size of the Range Slider by using the size prop. This adjusts both the track height/width and the thumb size.

<VStack w="full" gap={10}>
	<RangeSlider.Root size='sm'>
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root size='md'>
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root size='lg'>
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
</VStack>

You can change the scheme of the Range Slider by using the scheme prop.

<VStack w="full" gap={10}>
	<RangeSlider.Root scheme="primary">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root scheme="secondary">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root scheme="info">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root scheme="success">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root scheme="warning">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root scheme="error">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root scheme="none">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
</VStack>

You can change the orientation of the Range Slider by using the orientation prop.

<RangeSlider.Root orientation="vertical" h="200px">
	<RangeSlider.Track maxW="xs">
		<RangeSlider.FilledTrack />
		<RangeSlider.Thumb index={0} />
		<RangeSlider.Thumb index={1} />
	</RangeSlider.Track>
</RangeSlider.Root>

You can reverse the Range Slider by using the isReversed prop.

<RangeSlider.Root isReversed>
	<RangeSlider.Track maxW="xs">
		<RangeSlider.FilledTrack />
		<RangeSlider.Thumb index={0} />
		<RangeSlider.Thumb index={1} />
	</RangeSlider.Track>
</RangeSlider.Root>

You can set a custom thumb size by using the thumbSize prop (in pixels). This is useful when you need precise control over the thumb size beyond the predefined size variants.

<VStack w="full" gap={10}>
	<RangeSlider.Root thumbSize={16}>
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root thumbSize={32}>
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
	<RangeSlider.Root thumbSize={48} scheme="info">
		<RangeSlider.Track maxW="xs">
			<RangeSlider.FilledTrack />
			<RangeSlider.Thumb index={0} />
			<RangeSlider.Thumb index={1} />
		</RangeSlider.Track>
	</RangeSlider.Root>
</VStack>

You can control the Range Slider by using the value prop.

Range: 25 - 75

function ControlledRangeSlider() {
    const [value, setValue] = useState<[number, number]>([25, 75]);
 
    return (
        <>
            <Text>
                Range: {value[0]} - {value[1]}
            </Text>
 
            <RangeSlider.Root value={value} onChangeValue={setValue}>
                <RangeSlider.Track maxW="xs">
                    <RangeSlider.FilledTrack />
                    <RangeSlider.Thumb index={0} />
                    <RangeSlider.Thumb index={1} />
                </RangeSlider.Track>
            </RangeSlider.Root>
        </>
    );
}