import { useRef } from 'react' import { formatKeyframeStrength, nudgeKeyframeStrength, strengthFromPointer, } from '../lib/keyframe-strength' interface KeyframeStrengthRailProps { strength: number label: string onStrengthChange: (strength: number) => void } export function KeyframeStrengthRail({ strength, label, onStrengthChange, }: KeyframeStrengthRailProps) { const railRef = useRef(null) const draggingRef = useRef(false) const clamped = Math.min(1, Math.max(0, strength)) const percent = formatKeyframeStrength(strength) const applyFromClientY = (clientY: number) => { const rect = railRef.current?.getBoundingClientRect() if (!rect) return onStrengthChange(strengthFromPointer(clientY, rect)) } return (
{ event.preventDefault() event.stopPropagation() draggingRef.current = true event.currentTarget.setPointerCapture(event.pointerId) applyFromClientY(event.clientY) }} onPointerMove={(event) => { if (!draggingRef.current) return event.stopPropagation() applyFromClientY(event.clientY) }} onPointerUp={(event) => { draggingRef.current = false event.stopPropagation() }} onPointerCancel={() => { draggingRef.current = false }} onLostPointerCapture={() => { draggingRef.current = false }} onKeyDown={(event) => { if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return event.preventDefault() event.stopPropagation() onStrengthChange(nudgeKeyframeStrength(strength, event.key === 'ArrowUp' ? 1 : -1)) }} >
) }