ERP-node/frontend/components/ui/slider.tsx

53 lines
2.2 KiB
TypeScript

"use client";
import * as React from "react";
import { cn } from "@/lib/utils";
interface SliderProps extends React.InputHTMLAttributes<HTMLInputElement> {
value?: number[];
onValueChange?: (value: number[]) => void;
min?: number;
max?: number;
step?: number;
className?: string;
}
const Slider = React.forwardRef<HTMLInputElement, SliderProps>(
({ className, value = [0], onValueChange, min = 0, max = 100, step = 1, ...props }, ref) => {
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const newValue = parseFloat(e.target.value);
onValueChange?.([newValue]);
};
return (
<div className={cn("relative flex w-full touch-none items-center select-none", className)}>
<input
ref={ref}
type="range"
min={min}
max={max}
step={step}
value={value[0]}
onChange={handleChange}
className={cn(
"relative h-2 w-full cursor-pointer appearance-none rounded-lg bg-gray-200 outline-none",
"focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none",
"disabled:cursor-not-allowed disabled:opacity-50",
// WebKit 스타일
"[&::-webkit-slider-track]:h-2 [&::-webkit-slider-track]:rounded-lg [&::-webkit-slider-track]:bg-gray-200",
"[&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-0 [&::-webkit-slider-thumb]:bg-blue-600 [&::-webkit-slider-thumb]:shadow-sm",
// Firefox 스타일
"[&::-moz-range-track]:h-2 [&::-moz-range-track]:rounded-lg [&::-moz-range-track]:border-0 [&::-moz-range-track]:bg-gray-200",
"[&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:bg-blue-600 [&::-moz-range-thumb]:shadow-sm",
)}
{...props}
/>
</div>
);
},
);
Slider.displayName = "Slider";
export { Slider };