slider.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { Slider as SliderPrimitive } from '@base-ui/react/slider';
  2. import { cn } from '@/lib/utils';
  3. function Slider({
  4. className,
  5. defaultValue,
  6. value,
  7. min = 0,
  8. max = 100,
  9. ...props
  10. }: SliderPrimitive.Root.Props) {
  11. const _values = Array.isArray(value)
  12. ? value
  13. : Array.isArray(defaultValue)
  14. ? defaultValue
  15. : [min, max];
  16. return (
  17. <SliderPrimitive.Root
  18. className={cn('data-horizontal:w-full data-vertical:h-full', className)}
  19. data-slot="slider"
  20. defaultValue={defaultValue}
  21. value={value}
  22. min={min}
  23. max={max}
  24. thumbAlignment="edge"
  25. {...props}
  26. >
  27. <SliderPrimitive.Control className="data-vertical:min-h-40 relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:w-auto data-vertical:flex-col">
  28. <SliderPrimitive.Track
  29. data-slot="slider-track"
  30. className="bg-muted rounded-full data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1 relative grow overflow-hidden select-none"
  31. >
  32. <SliderPrimitive.Indicator
  33. data-slot="slider-range"
  34. className="bg-primary select-none data-horizontal:h-full data-vertical:w-full"
  35. />
  36. </SliderPrimitive.Track>
  37. {Array.from({ length: _values.length }, (_, index) => (
  38. <SliderPrimitive.Thumb
  39. data-slot="slider-thumb"
  40. key={index}
  41. className="border-ring ring-ring/50 relative size-3 rounded-full border bg-white transition-[color,box-shadow] after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 block shrink-0 select-none disabled:pointer-events-none disabled:opacity-50"
  42. />
  43. ))}
  44. </SliderPrimitive.Control>
  45. </SliderPrimitive.Root>
  46. );
  47. }
  48. export { Slider };