import { useContext, useEffect, useRef } from "react"; import { ListContext } from "../List"; interface SlideRangeProps { className?: string; description?: string; range?: { start?: number; stroke?: number; }; onSlide?: (v: number) => void; value?: number; step?: number; } const margin = 15; export default function SlideRange(props: SlideRangeProps) { const { className = "", description = "", range = {}, value, onSlide, step, } = props; const { start = 0, stroke = 1 } = range; const { rangeClassName, update } = useContext(ListContext); const slideRef = useRef(null); const transformToWidth = (x: number = start) => { const abs = x - start; const maxWidth = (slideRef.current?.clientWidth || 1) - margin * 2; const radio = stroke / maxWidth; return abs / radio; }; const setProperty = (value?: number) => { const initWidth = transformToWidth(value); slideRef.current?.style.setProperty( "--slide-value-size", `${initWidth + margin}px`, ); }; useEffect(() => { setProperty(value); update?.({ type: "range" }); }, []); return (
{!!description && (
{description}
)}
 
{value}
{ setProperty(e.target.valueAsNumber); onSlide?.(e.target.valueAsNumber); }} style={{ marginLeft: margin, marginRight: margin, }} />
); }