"use client";
import { Label } from "@/components/ui/label";
import {
LIGHTNESS_MIN,
clampHsl,
displayToLightness,
lightnessToDisplay,
type HSL,
} from "@/lib/character/color-utils";
import { cn } from "@/lib/utils";
type ColorSliderProps = {
label: string;
value: number;
displayValue?: number;
min: number;
max: number;
gradient?: string;
onChange: (value: number) => void;
};
export function ColorSlider({
label,
value,
displayValue,
min,
max,
gradient,
onChange,
}: ColorSliderProps) {
const shownValue = displayValue ?? value;
return (
);
}
type CharacterColorSlidersProps = {
color: HSL;
onChange: (color: HSL) => void;
};
export function CharacterColorSliders({
color,
onChange,
}: CharacterColorSlidersProps) {
const hueGradient =
"linear-gradient(to right, hsl(0,100%,50%), hsl(60,100%,50%), hsl(120,100%,50%), hsl(180,100%,50%), hsl(240,100%,50%), hsl(300,100%,50%), hsl(360,100%,50%))";
const saturationGradient = `linear-gradient(to right, hsl(${color.h}, 0%, ${color.l}%), hsl(${color.h}, 100%, ${color.l}%))`;
const lightnessGradient = `linear-gradient(to right, hsl(${color.h}, ${color.s}%, ${LIGHTNESS_MIN}%), hsl(${color.h}, ${color.s}%, 50%), hsl(${color.h}, ${color.s}%, 100%))`;
const brightnessDisplay = lightnessToDisplay(color.l);
return (
onChange({ ...color, h })}
/>
onChange({ ...color, s })}
/>
onChange(clampHsl({ ...color, l: displayToLightness(display) }))
}
/>
);
}