2D: Inline-Text-Editor-Nachbesserung (unsichtbarer Anker) + Textspalte als echtes Rechteck

Nutzer-Report nach der Umstellung auf Inline-Editing: beides funktionierte
nicht — "Text" liess sich kein Ankerpunkt setzen, "Textspalte" sollte ein
Rechteck statt nur eine Breite sein.

Root Cause für "Text": `.planview-inline-text` bekam ohne Spaltenbreite
`width: undefined` — bei position:fixed ohne rechten Rand greift shrink-to-
fit-Sizing, das für ein LEERES contentEditable auf ~0px kollabiert. Der Klick
erzeugte tatsächlich ein Element + öffnete den Editor, beides war nur
unsichtbar (eine 0px-Box lässt sich nicht anklicken/fokussieren). Fix: neue
Klasse .planview-inline-text-free (kein wrapWidth) erzwingt `width:
max-content` + `white-space: pre` auf Editor/Surface (Box wächst mit dem
Inhalt statt umzubrechen — "Text" bleibt einzeilig bis Enter, wie gewünscht)
plus eine CSS-Mindestbreite (160px) für den leeren Startzustand.

"Textspalte" (textbox.ts) zeichnet jetzt ein RECHTECK (zwei diagonale Ecken,
beliebige Zugrichtung) statt nur eine horizontale Breitenlinie — die
aufgezogene Höhe wird nicht im Modell gespeichert (das Textformat kennt nur
`width` für den Wortumbruch, keine feste Rahmenhöhe), sondern als
Editor-MINDESThöhe durchgereicht: CommandResult/EngineHost.focusDrawing um
`focusMinHeightM` erweitert (Passthrough wie focusDrawingId), App.tsx hält
sie in einem neuen editTextMinHeightM-State (useContextMenuState.ts),
PlanView nutzt sie als CSS-min-height des Editors — der Rahmen wächst bei
mehr Text darüber hinaus, schrumpft aber nicht darunter (InDesign-Verhalten).
Beim Doppelklick-Editieren bestehender Elemente wird die Mindesthöhe
zurückgesetzt (kein Nachwirken einer vorigen Textspalten-Erstellung).

textbox.test.ts an die neue Rechteck-Geste angepasst (+ Test für beliebige
Zugrichtung). tsc -b / vitest run (919/919) / npm run build grün. Die
eigentliche Sichtbarkeits-Vermutung (CSS-Kollaps) konnte ich nicht
interaktiv im Browser verifizieren (kein Browser-Tool verfügbar) — Nutzer
prüft erneut in der laufenden App.
This commit is contained in:
2026-08-20 21:44:37 +02:00
parent f2d169cc67
commit 73d147b37d
12 changed files with 185 additions and 70 deletions
+7 -2
View File
@@ -51,7 +51,7 @@ export function useMouseSelectionHandlers(opts: {
>;
contextMenuState: Pick<
ReturnType<typeof useContextMenuState>,
"setMenu" | "setStampEditorRoomId" | "editTextId" | "setEditTextId"
"setMenu" | "setStampEditorRoomId" | "editTextId" | "setEditTextId" | "setEditTextMinHeightM"
>;
}) {
const { project, setProject, activeLevelId, visibleCodes, categoryDisplay, selectionState, contextMenuState } = opts;
@@ -80,7 +80,7 @@ export function useMouseSelectionHandlers(opts: {
selectedSectionLineId,
setSelectedSectionLineId,
} = selectionState;
const { setMenu, setStampEditorRoomId, editTextId, setEditTextId } = contextMenuState;
const { setMenu, setStampEditorRoomId, editTextId, setEditTextId, setEditTextMinHeightM } = contextMenuState;
// ── Maus-Schema: Auswahl + Kontextmenü aus Grundriss / 3D ─────────────────
// Links-Klick im Grundriss: genau eine Wand wählen (Menge ersetzen) bzw.
@@ -116,6 +116,10 @@ export function useMouseSelectionHandlers(opts: {
setSelectedRoofIds([]);
setSelectedContextObjectIds([]);
setSelectedSectionLineId(null);
// Bestehendes Element per Doppelklick: keine Rahmen-Mindesthöhe (nur bei
// frisch aufgezogener Textspalte relevant, s. textbox.ts focusMinHeightM)
// — sonst könnte eine vorige Textspalten-Erstellung hier nachwirken.
setEditTextMinHeightM(null);
setEditTextId(drawingId);
};
@@ -155,6 +159,7 @@ export function useMouseSelectionHandlers(opts: {
});
}
setEditTextId(null);
setEditTextMinHeightM(null);
};
// Kategorie-Code des getroffenen Elements (für die Sperr-Prüfung unten) —
// nur die Kanäle, deren Modell-Typ eine categoryCode trägt (ExtrudedSolid/