/** * Paragraph panel of the Properties deck — counterpart of * svx/source/sidebar/paragraph/ParaPropertyPanel.cxx (alignment, lists, * indent, spacing and line spacing). */ import { useEffect, useState } from "react"; import { ToolBarItems, type ToolBarConfigEntry } from "../../../../framework/source/uielement/toolbarmanager"; import { useDispatcher } from "../../../../sfx2/source/control/dispatch"; import { useViewFrame } from "../../../../sfx2/source/view/viewfrm"; const item = (command: string): ToolBarConfigEntry => ({ kind: "item", command }); const sep: ToolBarConfigEntry = { kind: "separator" }; /** A metric field that commits on Enter / blur (vcl MetricField). */ function MetricField({ label, unit, value, step, onCommit, }: { label: string; unit: string; value: number; step: number; onCommit: (v: number) => void; }) { const frame = useViewFrame(); const [text, setText] = useState(String(value)); useEffect(() => setText(String(+value.toFixed(2))), [value]); const commit = () => { const v = parseFloat(text); if (Number.isFinite(v) && v >= 0 && v !== value) onCommit(v); else setText(String(+value.toFixed(2))); }; return (