| 'use client'; |
|
|
| import { Slider } from '@/components/ui/slider'; |
| import { Label } from '@/components/ui/label'; |
|
|
| export interface RangeInputProps { |
| label: string; |
| value?: number; |
| defaultValue?: number; |
| min: number; |
| max: number; |
| step?: number; |
| onChange: (value: number) => void; |
| className?: string; |
| disabled?: boolean; |
| showValue?: boolean; |
| valueUnit?: string; |
| helpText?: string; |
| } |
|
|
| export default function RangeInput({ |
| label, |
| value, |
| defaultValue = 1, |
| min, |
| max, |
| step = 1, |
| onChange, |
| className = '', |
| disabled = false, |
| showValue = true, |
| valueUnit = '', |
| helpText, |
| }: RangeInputProps) { |
| const currentValue = value ?? defaultValue; |
|
|
| return ( |
| <div className={className}> |
| <Label> |
| {label} |
| </Label> |
| <Slider |
| min={min} |
| max={max} |
| step={step} |
| value={[currentValue]} |
| onValueChange={([val]) => onChange(val)} |
| disabled={disabled} |
| className="mt-2" |
| /> |
| {showValue && ( |
| <div className="text-center text-sm text-muted-foreground mt-1"> |
| {currentValue} {valueUnit} {helpText} |
| </div> |
| )} |
| {!showValue && helpText && ( |
| <div className="text-xs text-muted-foreground mt-1"> |
| {helpText} |
| </div> |
| )} |
| </div> |
| ); |
| } |