Ribbon-UI Phase 1: datengetriebene Tab-Leiste (2D/3D/BIM/Ansichten), additiv unter TopBar

This commit is contained in:
2026-07-05 17:00:09 +02:00
parent ace0dc62a8
commit 9d6e86d4c0
8 changed files with 488 additions and 1 deletions
+22
View File
@@ -70,6 +70,7 @@ import { ResourceManager } from "./ui/ResourceManager";
import type { ResourceManagerHandlers } from "./ui/ResourceManager";
import { HatchSwatch } from "./ui/hatchPreview";
import { TopBar } from "./ui/TopBar";
import { RibbonBar } from "./ui/ribbon/RibbonBar";
import { Dropdown } from "./ui/Dropdown";
import type { DropdownItem } from "./ui/Dropdown";
import { TextEditorDialog } from "./ui/TextEditorDialog";
@@ -810,6 +811,16 @@ export default function App() {
setActiveTool(id);
};
// Ribbon-Befehl (Ändern-Gruppe u. a.): startet einen Engine-Befehl OHNE
// eigenes Werkzeug (kein ToolId). Läuft über DIESELBE Engine wie das Tippen des
// Befehls; das Werkzeug-Highlight fällt auf „Auswahl" zurück, das Aktiv-
// Highlight des Ribbon-Befehls spiegelt der laufende Befehl (engineView).
const onRunCommand = (name: string) => {
engine.start(name);
setActiveTool("select");
requestAnimationFrame(() => commandLineRef.current?.focus());
};
// 3D-Viewport als Erstellungs-Fläche: der Viewport projiziert den Cursor auf
// die Geschoss-Arbeitsebene und liefert einen rohen Modell-`Vec2`; wir füttern
// ihn in DIESELBE ansichts-agnostische CommandEngine wie PlanView (move/pick).
@@ -3244,6 +3255,17 @@ export default function App() {
textTarget={textTarget}
/>
{/* Ribbon-Oberleiste (2D · 3D · BIM · Ansichten) — additiv unter der TopBar.
Teilt sich denselben Aktivierungs-Pfad wie die Werkzeug-Sidebar; die
Sidebar bleibt vorerst erhalten (Plan-Doc Phase 3 entfernt sie). */}
<RibbonBar
activeTool={activeTool}
activeCommand={engineView.commandName}
toolsEnabled={activeLevel.kind === "floor"}
onSelectTool={onSelectTool}
onRunCommand={onRunCommand}
/>
<div className="body">
{/* Linkes Dock: gestapelte Gruppen (Werkzeuge oben, Zeichnungsebenen/
Ebenen unten). Jede Gruppe baut über buildHost ihren eigenen