import { useCallback, useState } from "react"; import { MetricField } from "./propertyPanelPrimitives"; import { formatNumericValue, parseNumericValue, RESPONSIVE_GRID } from "./propertyPanelHelpers"; type Corner = "tl" | "tr" | "br" | "bl"; interface BorderRadiusEditorProps { tl: number; tr: number; br: number; bl: number; disabled?: boolean; onCommit: (corner: Corner | "all", value: number) => void; } const PREVIEW_W = 72; const PREVIEW_H = 52; const MAX_RADIUS = 26; function clampRadius(v: number): number { return Math.max(0, Math.min(MAX_RADIUS, v)); } function scaleRadius(v: number, maxPx: number): number { if (maxPx <= 0) return 0; return clampRadius(Math.round((v / Math.max(maxPx, 1)) * MAX_RADIUS)); } export function BorderRadiusEditor({ tl, tr, br, bl, disabled, onCommit, }: BorderRadiusEditorProps) { const uniform = tl === tr && tr === br && br === bl; const [linked, setLinked] = useState(uniform); const maxVal = Math.max(tl, tr, br, bl, 1); const sTL = scaleRadius(tl, maxVal); const sTR = scaleRadius(tr, maxVal); const sBR = scaleRadius(br, maxVal); const sBL = scaleRadius(bl, maxVal); const handleCornerCommit = useCallback( (corner: Corner, raw: string) => { const v = parseNumericValue(raw) ?? 0; if (linked) { onCommit("all", v); } else { onCommit(corner, v); } }, [linked, onCommit], ); const handleToggleLinked = useCallback(() => { if (!linked && !uniform) { onCommit("all", tl); } setLinked((l) => !l); }, [linked, uniform, tl, onCommit]); const path = buildRoundedRectPath(PREVIEW_W, PREVIEW_H, sTL, sTR, sBR, sBL); return (