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 (
{linked ? ( handleCornerCommit("tl", next)} /> ) : (
handleCornerCommit("tl", next)} /> handleCornerCommit("tr", next)} /> handleCornerCommit("bl", next)} /> handleCornerCommit("br", next)} />
)}
); } function buildRoundedRectPath( w: number, h: number, tl: number, tr: number, br: number, bl: number, ): string { return [ `M ${tl} 0`, `L ${w - tr} 0`, `Q ${w} 0 ${w} ${tr}`, `L ${w} ${h - br}`, `Q ${w} ${h} ${w - br} ${h}`, `L ${bl} ${h}`, `Q 0 ${h} 0 ${h - bl}`, `L 0 ${tl}`, `Q 0 0 ${tl} 0`, "Z", ].join(" "); }