Files
vexplor/frontend/components/ui/slider.tsx
DDD1542 4f10b5e42d refactor: 전체 프론트엔드 하드코딩 색상 → CSS 변수 일괄 치환
447+ 파일, 4500+ 줄 변경:
- gray-* → border/bg-muted/text-foreground/text-muted-foreground
- blue-* → primary/ring
- red-* → destructive
- green-* → emerald (일관성)
- indigo-* → primary
- yellow/orange → amber (통일)
- dark mode 변형도 시맨틱 토큰으로 변환

Made-with: Cursor
2026-03-09 14:31:59 +09:00

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-muted/80 outline-none",
"focus:ring-2 focus:ring-ring 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-muted/80",
"[&::-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-primary [&::-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-muted/80",
"[&::-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-primary [&::-moz-range-thumb]:shadow-sm",
)}
{...props}
/>
</div>
);
},
);
Slider.displayName = "Slider";
export { Slider };