) => void;
+}
+
+/** Block-text (`^FB`) sub-panel: width / max-lines / justify /
+ * line-spacing plus inline validation hints. Hints are purely
+ * informational — never auto-correct user-set blockLines, since
+ * content can legitimately have fewer lines than max (CSV-bound
+ * rows vary) or more (intentional truncation). The editor surfaces
+ * the mismatch but leaves the choice to the user. */
+export function BlockTextSettings({ props: p, onChange }: Props) {
+ const t = useT();
+ const contentLines = p.content.split("\n").length;
+ const maxLines = p.blockLines ?? 1;
+ const truncates = contentLines > maxLines;
+ return (
+ <>
+
+ onChange({ blockWidth })}
+ />
+ onChange({ blockLines })}
+ />
+
+
+
+
+ onChange({ blockJustify })}
+ />
+
+
onChange({ blockLineSpacing })}
+ />
+
+ {truncates && (
+
+ {t.registry.text.blockLinesExceededFmt
+ .replaceAll("{n}", String(contentLines))
+ .replaceAll("{max}", String(maxLines))}
+
+ )}
+ {!truncates && contentLines < maxLines && (
+
+ {t.registry.text.blockLinesUsageFmt
+ .replaceAll("{n}", String(contentLines))
+ .replaceAll("{max}", String(maxLines))}
+
+ )}
+ >
+ );
+}
diff --git a/src/components/Properties/JustifyButtons.tsx b/src/components/Properties/JustifyButtons.tsx
new file mode 100644
index 0000000..15faed6
--- /dev/null
+++ b/src/components/Properties/JustifyButtons.tsx
@@ -0,0 +1,84 @@
+import type { ReactNode } from "react";
+import { useT } from "../../lib/useT";
+import type { TextProps } from "../../registry/text";
+
+type Justify = NonNullable;
+
+interface Props {
+ value: Justify;
+ onChange: (next: Justify) => void;
+}
+
+/** Inline SVG glyphs for the four justify modes. Stroke uses
+ * `currentColor` so the active/inactive button colour drives the
+ * icon — single source of truth for theming. Inline SVG (vs.
+ * Unicode glyphs) avoids font-fallback tofu on systems without the
+ * niche math/arrow ranges installed. */
+const ICONS: Record = {
+ L: (
+
+ ),
+ C: (
+
+ ),
+ R: (
+
+ ),
+ J: (
+
+ ),
+};
+
+/** ^FB text-justification toggle: 4 icon buttons (left / centre /
+ * right / justified) — same MS Word pattern users already know.
+ * Replaces the legacy `