"use client"; import React from "react"; import clsx from "clsx"; interface CustomSliderProps { label?: string; value: number; min?: number; max?: number; step?: number; onChange?: (value: number) => void; showValue?: boolean; disabled?: boolean; className?: string; labelClassName?: string; sliderClassName?: string; thumbClassName?: string; trackClassName?: string; color?: string; trackColor?: string; renderValue?: (value: number) => React.ReactNode; } const CustomSlider = ({ label, value, min = 0, max = 1, step = 0.01, onChange, showValue = true, disabled = false, className, labelClassName, sliderClassName, color = "#2563eb", trackColor = "#e5e7eb", renderValue, }: CustomSliderProps) => { const percentage = ((value - min) / (max - min)) * 100; return (
{/* Header */} {(label || showValue) && (
{label && ( {label} )} {showValue && ( {renderValue ? renderValue(value) : value} )}
)} {/* Slider */} onChange?.(Number(e.target.value))} className={clsx( ` w-full appearance-none bg-transparent cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed [&::-webkit-slider-runnable-track]:h-2 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-6 [&::-webkit-slider-thumb]:w-6 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:border-4 [&::-webkit-slider-thumb]:shadow-md [&::-webkit-slider-thumb]:-mt-2 [&::-moz-range-track]:h-2 [&::-moz-range-track]:rounded-full [&::-moz-range-thumb]:h-6 [&::-moz-range-thumb]:w-6 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:border-4 `, sliderClassName, )} style={{ background: `linear-gradient(to right, ${color} ${percentage}%, ${trackColor} ${percentage}%)`, }} />
); }; export default CustomSlider;