Slider
An input where the user selects a value from within a given range.
Installation
Install the following dependencies:
pnpm add @radix-ui/react-slider
Copy and paste the following code into your project.
"use client";
import * as React from "react";
import * as SliderPrimitive from "@radix-ui/react-slider";
import { cn } from "~/utils/tailwind";
const Slider = React.forwardRef<
React.ElementRef<typeof SliderPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
>(({ className, ...props }, ref) => (
<SliderPrimitive.Root
ref={ref}
className={cn(
"relative flex w-full touch-none select-none items-center",
className,
)}
{...props}
>
<SliderPrimitive.Track className="relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20">
<SliderPrimitive.Range className="absolute h-full bg-primary" />
</SliderPrimitive.Track>
{props.children}
</SliderPrimitive.Root>
));
Slider.displayName = SliderPrimitive.Root.displayName;
const SliderThumb = React.forwardRef<
React.ElementRef<typeof SliderPrimitive.Thumb>,
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Thumb>
>(({ className, ...props }, ref) => (
<SliderPrimitive.Thumb
ref={ref}
className={cn(
"block size-4 rounded-full border border-primary/50 bg-background ring-offset-background transition-colors",
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1",
"disabled:pointer-events-none disabled:opacity-50",
className,
)}
{...props}
/>
));
SliderThumb.displayName = SliderPrimitive.Thumb.displayName;
export { Slider, SliderThumb };
Update the import paths to match your project setup.
Usage
import { Slider } from "~/components/ui/Slider";
<Slider defaultValue={[33]} max={100} step={1}>
<SliderThumb />
</Slider>
Examples
Multiple Thumbs
Add a <SliderThumb />
child for each thumb you want to display. The length of the value
array must match the number of thumbs.