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 „—"). */}