From c794feef9eae9b0ae492e9781d34f5dfe18f87ef Mon Sep 17 00:00:00 2001 From: Karim Date: Sun, 5 Jul 2026 14:48:37 +0200 Subject: [PATCH] Layout: Befehlszeile in die Mitte-Spalte (nur Viewport-breit, Docks gewinnen Hoehe) --- src/App.tsx | 100 +++++++++++++++++++++++++------------------------ src/styles.css | 12 ++++++ 2 files changed, 64 insertions(+), 48 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 25eb859..5fb2e3e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3168,6 +3168,10 @@ export default function App() { /> )} + {/* Mitte-Spalte: Hauptansicht + Befehlszeile DARUNTER. So ist die + Befehlszeile nur so breit wie der Viewport (nicht die ganze App), + und die Docks nehmen die volle Body-Höhe ein (inkl. der Zeile). */} +
{/* Hauptansicht (Mitte) — füllt den verbleibenden Platz. Die Plan- Ansicht meldet Cursor + Zoom an die Status-/Oberleiste und nimmt das Zoom-Handle entgegen. */} @@ -3232,6 +3236,54 @@ export default function App() { onEdit3dWallTop={onEdit3dWallTop} onEdit3dEnd={onEdit3dEnd} /> + {/* Command-Line (Rhino-artig) UNTER dem Viewport — nur Viewport-breit. + Prompt + klickbare Inline-Optionen + Texteingabe + Autocomplete. */} + { + if (gripEdit) { + const v = parseFloat(text.replace(",", ".")); + if (isFinite(v)) submitGripEditValue(v); + return; + } + if (activeTransform) { + const v = parseFloat(text.replace(",", ".")); + if (isFinite(v)) submitTransformValue(v); + return; + } + engine.submitText(text); + }} + onOption={(id) => + activeTransform ? onTransformMode(id as CopyMode) : engine.chooseOption(id) + } + onCycleField={() => + gripEdit ? cycleGripEditField() : activeTransform ? undefined : engine.cycleField() + } + onCancel={() => + gripEdit ? setGripEdit(null) : activeTransform ? cancelTransform() : engine.cancel() + } + suggest={(prefix) => engine.suggest(prefix)} + /> +
{/* Rechtes Dock: standardmäßig leer (Ressourcen ist ein schwebendes Fenster). Nur gerendert, wenn es Gruppen hat — sonst nutzt die Mitte @@ -3300,54 +3352,6 @@ export default function App() { {/* Drag-Overlay (Geist + Tab-Einfüge-Caret) während eines Tab-Ziehens. */} - {/* Command-Line (Rhino-artig) ÜBER der Statusleiste: Prompt + klickbare - Inline-Optionen + Texteingabe + Autocomplete. Tab fokussiert sie. */} - { - if (gripEdit) { - const v = parseFloat(text.replace(",", ".")); - if (isFinite(v)) submitGripEditValue(v); - return; - } - if (activeTransform) { - const v = parseFloat(text.replace(",", ".")); - if (isFinite(v)) submitTransformValue(v); - return; - } - engine.submitText(text); - }} - onOption={(id) => - activeTransform ? onTransformMode(id as CopyMode) : engine.chooseOption(id) - } - onCycleField={() => - gripEdit ? cycleGripEditField() : activeTransform ? undefined : engine.cycleField() - } - onCancel={() => - gripEdit ? setGripEdit(null) : activeTransform ? cancelTransform() : engine.cancel() - } - suggest={(prefix) => engine.suggest(prefix)} - /> - {/* Footer / Status-Leiste (unten). Werte rein aus Modell + View-State. Cursor/Zoom nur, wenn eine Plan-Ansicht aktiv ist (sonst „—"). */}