import React, { DetailedHTMLProps, InputHTMLAttributes, useEffect, useRef, } from "react"; import Stack from "./Stack"; import Typography from "./Typography"; import classNames from "./lib/classNames"; export interface CustomSliderProps { labels?: string[]; } export interface SliderProps extends DetailedHTMLProps< InputHTMLAttributes, HTMLInputElement >, CustomSliderProps {} export default function Slider({ className, labels, ...rest }: SliderProps) { const slider = useRef(null); useEffect(() => { if (slider) { setBackgroundSize(slider.current!); slider.current?.addEventListener("input", () => setBackgroundSize(slider.current!) ); } function setBackgroundSize(input: HTMLInputElement) { input.style.setProperty( "--background-size", `${getBackgroundSize(input)}%` ); } function getBackgroundSize(input: HTMLInputElement) { const min = +input.min || 0; const max = +input.max || 100; const value = +input.value; return ((value - min) / (max - min)) * 100; } }, [slider]); return ( {labels?.length ? ( {labels.map((label) => (
{label} ))} ) : null} ); }