File size: 1,506 Bytes
80bcac8
 
ffd0276
80bcac8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ffd0276
80bcac8
 
 
ffd0276
80bcac8
 
 
 
 
 
 
 
 
 
 
 
 
 
ffd0276
80bcac8
 
 
 
ffd0276
80bcac8
 
ffd0276
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'use client'

import React, { forwardRef, InputHTMLAttributes } from 'react'
import { cn } from '@/utils/helpers'

export interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {
  label?: string
  min: number
  max: number
  step?: number
  value: number
  onValueChange: (value: number) => void
  showValue?: boolean
  valueFormat?: (value: number) => string
}

export const Slider = forwardRef<HTMLInputElement, SliderProps>(
  ({ className, label, min, max, step = 1, value, onValueChange, showValue = false, valueFormat, ...props }, ref) => {
    const sliderId = label?.toLowerCase().replace(/\s+/g, '-')

    return (
      <div className={cn('w-full', className)}>
        {label && (
          <div className="flex items-center justify-between mb-1">
            <label htmlFor={sliderId} className="text-sm font-medium text-current">
              {label}
            </label>
            {showValue && (
              <span className="text-sm text-current/70 font-mono">
                {valueFormat ? valueFormat(value) : value}
              </span>
            )}
          </div>
        )}
        <input
          ref={ref}
          id={sliderId}
          type="range"
          min={min}
          max={max}
          step={step}
          value={value}
          onChange={(e) => onValueChange(Number(e.target.value))}
          className={cn('clay-slider', className)}
          {...props}
        />
      </div>
    )
  )
)

Slider.displayName = 'Slider'