Openstatus
www.openstatus.dev
1"use client";
2
3import * as SliderPrimitive from "@radix-ui/react-slider";
4import * as React from "react";
5
6import { cn } from "@/lib/utils";
7
8function Slider({
9 className,
10 defaultValue,
11 value,
12 min = 0,
13 max = 100,
14 ...props
15}: React.ComponentProps<typeof SliderPrimitive.Root>) {
16 const _values = React.useMemo(
17 () =>
18 Array.isArray(value)
19 ? value
20 : Array.isArray(defaultValue)
21 ? defaultValue
22 : [min, max],
23 [value, defaultValue, min, max],
24 );
25
26 return (
27 <SliderPrimitive.Root
28 data-slot="slider"
29 defaultValue={defaultValue}
30 value={value}
31 min={min}
32 max={max}
33 className={cn(
34 "relative flex w-full touch-none select-none items-center data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col data-[disabled]:opacity-50",
35 className,
36 )}
37 {...props}
38 >
39 <SliderPrimitive.Track
40 data-slot="slider-track"
41 className={cn(
42 "relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1.5 data-[orientation=vertical]:h-full data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-1.5",
43 )}
44 >
45 <SliderPrimitive.Range
46 data-slot="slider-range"
47 className={cn(
48 "absolute bg-primary data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full",
49 )}
50 />
51 </SliderPrimitive.Track>
52 {Array.from({ length: _values.length }, (_, index) => (
53 <SliderPrimitive.Thumb
54 data-slot="slider-thumb"
55 key={index}
56 className="block size-4 shrink-0 rounded-full border border-primary bg-background shadow-sm ring-ring/50 transition-[color,box-shadow] hover:ring-4 focus-visible:outline-hidden focus-visible:ring-4 disabled:pointer-events-none disabled:opacity-50"
57 />
58 ))}
59 </SliderPrimitive.Root>
60 );
61}
62
63export { Slider };