diff --git a/PENDENZEN.md b/PENDENZEN.md index 243353c..bd0a6e7 100644 --- a/PENDENZEN.md +++ b/PENDENZEN.md @@ -39,7 +39,7 @@ ## ⏭️ Als Nächstes -- [ ] **Ribbon-UI + modulare Bars** (Nutzer-Vision 2026-07-05, bestätigt: Tab-Schema **2D·3D·BIM·Ansichten**). Voller Plan + datengetriebene Architektur: **[docs/design/ribbon-ui-plan.md](docs/design/ribbon-ui-plan.md)**. Ribbon-Oberleiste mit Tabs ersetzt die Werkzeug-Sidebar; datengetriebene Registry (RibbonItem = tool|command|action) ermöglicht auch eine **modulare Custom-Bar** (gleiche Items, vom Nutzer gewählt). Attribute bekommen volle Höhe, Objektinfo darunter gemergt; XYZ-Box oben rechts bleibt. **Phasen:** ~~(1) Gerüst + 2D/BIM-Tab~~ ✅ (`9d6e86d`), ~~(2) TopBar → Ansichten-Tab mergen~~ ✅ (`85011cb`), ~~(2b) Tabs in die TopBar-Zeile~~ ✅ (`456ebc8`), ~~(2c) OCS-Chrome (kleine Wortmarke + Quick-Access-Icons statt Burger, Zeile 26px)~~ ✅ (`4e3b074`), ~~(2d) Text + Ansichten auf eine Leiste, „Ansichten" als Standard-Tab zuerst~~ ✅ (`fe22cbf`), (3) Sidebar raus + Panel-Merge (Attribute volle Höhe, Objektinfo drunter), (4) modulare Custom-Bar. **Offen:** 3D-Tab füllen (aktuell leer; ggf. 3D-spezifisch statt Doppelung mit Ansichten), Band-Höhe/Abstände + 26px-Zeile visuell im Tauri abnehmen, Dauer-Zoom-Anzeige (Statusleiste?) klären. ✅ Vorarbeit: Eigenschaften-Grid im OCS-Stil (`00733d8`), Kreis+Bogen-Werkzeuge (`e454eab`/`bd2b12b`). **Nächster Schritt: im Tauri visuell prüfen (Band-Höhe, Icons, Aktiv-Highlight), dann Phase 2/3.** +- [ ] **Ribbon-UI + modulare Bars** (Nutzer-Vision 2026-07-05, bestätigt: Tab-Schema **2D·3D·BIM·Ansichten**). Voller Plan + datengetriebene Architektur: **[docs/design/ribbon-ui-plan.md](docs/design/ribbon-ui-plan.md)**. Ribbon-Oberleiste mit Tabs ersetzt die Werkzeug-Sidebar; datengetriebene Registry (RibbonItem = tool|command|action) ermöglicht auch eine **modulare Custom-Bar** (gleiche Items, vom Nutzer gewählt). Attribute bekommen volle Höhe, Objektinfo darunter gemergt; XYZ-Box oben rechts bleibt. **Phasen:** ~~(1) Gerüst + 2D/BIM-Tab~~ ✅ (`9d6e86d`), ~~(2) TopBar → Ansichten-Tab mergen~~ ✅ (`85011cb`), ~~(2b) Tabs in die TopBar-Zeile~~ ✅ (`456ebc8`), ~~(2c) OCS-Chrome (kleine Wortmarke + Quick-Access-Icons statt Burger, Zeile 26px)~~ ✅ (`4e3b074`), ~~(2d) Text + Ansichten auf eine Leiste, „Ansichten" als Standard-Tab zuerst~~ ✅ (`fe22cbf`), (3) **teilweise** ✅: Werkzeug-Sidebar aus Default-Layout raus + Attribute volle linke Höhe + Wandtyp-/Deckentyp-Picker ins Attribute-Panel verschoben (Nutzer-Entscheid), `LAYOUT_VERSION`→8; **offen:** Objektinfo unter Attribute mergen (großer Panel-Umbau, XYZ-Box-Platzierung — visuell iterieren), (4) modulare Custom-Bar. **Offen:** 3D-Tab füllen (aktuell leer; ggf. 3D-spezifisch statt Doppelung mit Ansichten), Band-Höhe/Abstände + 26px-Zeile visuell im Tauri abnehmen, Dauer-Zoom-Anzeige (Statusleiste?) klären. ✅ Vorarbeit: Eigenschaften-Grid im OCS-Stil (`00733d8`), Kreis+Bogen-Werkzeuge (`e454eab`/`bd2b12b`). **Nächster Schritt: im Tauri visuell prüfen (Band-Höhe, Icons, Aktiv-Highlight), dann Phase 2/3.** - [x] ~~**SPIKE — Bild-Texturen in `render3d`**~~ — **erledigt `0ca3b1d`** (verifiziert 2026-07-05): `RenderStyle::Textured` real, prozedurales 256×256-Schachbrett (kein Asset/`image`-Crate), UVs planar in Metern, Textur-Bind-Group group 1, `MESH_TEXTURED_WGSL` (gleiche Beleuchtung, Albedo aus `textureSample`), `spike3d` per `T` umschaltbar. Alt-Vertexpfad `[pos,normal,color]` bitgleich (Regressionstest). `cargo test` 58 grün (59 mit `--features render`, inkl. naga-Test); `spike3d`-Build sauber; keine neuen Deps, Default-Build unverändert. Auftrag: [SPIKE_TEXTUR_render3d.md](SPIKE_TEXTUR_render3d.md). **Lücken bis „richtig gutes" Texturing → siehe 3D-REST unten.** @@ -107,6 +107,7 @@ _Nur jüngste Session; ältere Historie siehe `git log` und HANDOVER-Narrative._ +- [x] 2026-07-05 **Ribbon Phase 3 (Teil): Werkzeug-Sidebar raus** — `DEFAULT_LEFT_GROUPS` nur noch `attributes` (volle linke Höhe), `LAYOUT_VERSION` 7→8 (gespeicherte Layouts fallen auf neuen Default zurück → sichtbar). Wandtyp-/Deckentyp-Picker von `ToolsPanel` ins `AttributesPanel` verschoben (Nutzer-Entscheid „ins Attribute-Panel") — erscheint bei aktivem Wand-/Decken-Werkzeug (Sektion „Neues Bauteil", auch ohne Auswahl), Host-State unverändert. `ToolsPanel` bleibt registriert (per Fenster-Menü andockbar), `Dropdown`-Import dort entfernt. tsc + Suite 334 grün. **Offen:** Objektinfo unter Attribute mergen. - [x] 2026-07-05 **Fix: gezeichnete/importierte Kreise+Bögen im WebGL unsichtbar** — der WebGL-Compiler (`glPlan/glPlanCompile.ts`, Default-Renderer) dispatchte `polygon`/`line`/`arc`, aber NICHT `drawingCircle`/`drawingArc` → seit `4ac99d3` (Kreise als echtes `drawingCircle`-Primitiv statt 64-Eck-Polygon) fielen sie im GL still raus (SVG-/WASM-Pfad hatten sie, GL nicht). Zweig ergänzt: bildschirm-adaptive Tessellierung wie beim `arc`-Primitiv (Kreis geschlossen + optionale Vollton-Füllung, Bogen a0..a1 offen). tsc + Suite 334 grün. **Nutzer-Report** („zeichne Kreis, bleibt nicht sichtbar"). - [x] 2026-07-05 **Textur-Spike verifiziert erledigt** (`0ca3b1d`) — bei der Backlog-Abarbeitung festgestellt, dass die render3d-Textur-Spike (`RenderStyle::Textured`, Schachbrett, planare Meter-UVs, `MESH_TEXTURED_WGSL` group 1, `spike3d`-`T`-Toggle) bereits vollständig umgesetzt + committet war; `cargo test` 58/59 grün, keine neuen Deps, Alt-Pfad bitgleich. „Als Nächstes"-Eintrag war veraltet → abgehakt; PBR-Restlückenliste (~18–29 PT) in 3D-REST übernommen. - [x] 2026-07-05 **Ribbon-Feinschliff (OCS-Zeile)** — Tabs in die TopBar-Zeile verlegt (`456ebc8`, eine Leiste Chrome+Tabs, Inhalt darunter; Tab-State in App); OCS-Chrome: kleine Wortmarke „dossier." + Quick-Access-Icons für ALLE Datei-/Export-Aktionen statt Burger-Menü, Zeile auf 26px (`4e3b074`); Text-/Font-Formatierung mit der Ansichts-/Zoom-Steuerung auf EINE Leiste gelegt, „Ansichten" als Standard-Tab zuerst + initial aktiv (`fe22cbf`). Alle tsc + 331 Tests grün. Visuelle Abnahme (26px, Icon-Sitz) noch offen. diff --git a/src/i18n/de.ts b/src/i18n/de.ts index a57b977..4253697 100644 --- a/src/i18n/de.ts +++ b/src/i18n/de.ts @@ -221,6 +221,7 @@ export const de = { // Attribute-Palette (AttributesPanel) "attr.title": "Attribute", "attr.empty": "Keine Auswahl", + "attr.newComponent": "Neues Bauteil", "attr.stroke": "Stift", "attr.color": "Farbe", "attr.weight": "Strichstärke (mm)", diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 58e2540..ad79cd3 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -220,6 +220,7 @@ export const en: Record = { // Attribute-Palette (AttributesPanel) "attr.title": "Attributes", "attr.empty": "No selection", + "attr.newComponent": "New component", "attr.stroke": "Pen", "attr.color": "Color", "attr.weight": "Line weight (mm)", diff --git a/src/panels/AttributesPanel.tsx b/src/panels/AttributesPanel.tsx index 31881d0..c525dc9 100644 --- a/src/panels/AttributesPanel.tsx +++ b/src/panels/AttributesPanel.tsx @@ -47,11 +47,38 @@ export function AttributesPanel() { const sel = host.selection; const { project } = host; - // Leerzustand: kompakter Hinweis, wenn nichts (Sinnvolles) selektiert ist. + // Wandtyp-/Deckentyp-Wahl für das NEUE Bauteil (was gezeichnet wird) — früher + // in der Werkzeug-Sidebar (ToolsPanel), seit deren Entfernung hier. Erscheint + // nur bei aktivem Wand-/Decken-Werkzeug (unabhängig von einer Auswahl); Wand und + // Decke teilen sich denselben Aufbau-Typ (WallType) + Host-State. + const drawingComponent = + host.activeTool === "wall" || host.activeTool === "ceiling"; + const typeSection = drawingComponent ? ( + <> +
{t("attr.newComponent")}
+
+ + {t(host.activeTool === "wall" ? "tool.wallType" : "tool.ceilingType")} + + + host.onActiveWallTypeId(v)} + options={project.wallTypes.map((wt) => ({ value: wt.id, label: wt.name }))} + /> + +
+ + ) : null; + + // Leerzustand: der Typ-Picker (falls ein Bauteil-Werkzeug aktiv ist), sonst ein + // kompakter Hinweis. if (sel === null) { return (
-
{t("attr.empty")}
+ {typeSection} + {!typeSection &&
{t("attr.empty")}
}
); } @@ -158,6 +185,8 @@ export function AttributesPanel() { return (
+ {/* Typ-Picker für das neue Bauteil (nur bei aktivem Wand-/Decken-Werkzeug). */} + {typeSection} {/* EIN durchgehendes Grid über alle Sektionen — dieselben zwei Spalten (Label | Wert) für Stift/Füllung/Maße, damit die Wertfelder überall bündig in EINER Spalte stehen. Sektion-Balken spannen beide Spalten. */} diff --git a/src/panels/ToolsPanel.tsx b/src/panels/ToolsPanel.tsx index 4dc87b7..d9cbc00 100644 --- a/src/panels/ToolsPanel.tsx +++ b/src/panels/ToolsPanel.tsx @@ -13,7 +13,6 @@ import { t } from "../i18n"; import { usePanelHost } from "./host"; import type { ToolId } from "./host"; import { TOOL_ORDER, getTool } from "../tools/tools"; -import { Dropdown } from "../ui/Dropdown"; // ── Icons ────────────────────────────────────────────────────────────────── // Keine echten Asset-Icons vorhanden: schlichte Inline-SVG-Glyphen je Werkzeug @@ -162,44 +161,9 @@ export function ToolsPanel() { ); })} -
- - {/* Wandtyp-Auswahl — nur sichtbar, wenn das Wand-Werkzeug aktiv ist. */} - {host.activeTool === "wall" && ( - - )} - - {host.activeTool === "wall" &&
} - - {/* Deckentyp-Auswahl — nur sichtbar, wenn das Decken-Werkzeug aktiv ist. - Nutzt denselben Aufbau-Typ (WallType) wie die Wand. */} - {host.activeTool === "ceiling" && ( - - )} - - {host.activeTool === "ceiling" &&
} + {/* Wandtyp-/Deckentyp-Auswahl ist ins Attribute-Panel gewandert (Ribbon-UI + Phase 3: Werkzeug-Sidebar nicht mehr im Default-Layout). Der Picker + erscheint dort bei aktivem Wand-/Decken-Werkzeug. */}
); } diff --git a/src/panels/layout.ts b/src/panels/layout.ts index 37c7dea..e05ae55 100644 --- a/src/panels/layout.ts +++ b/src/panels/layout.ts @@ -31,7 +31,10 @@ import type { * der rechten unteren Gruppe. Das Hochzählen verwirft alt gespeicherte Layouts * sauber auf den neuen Standard (kein Migrationspfad über die Strukturgrenze). */ -export const LAYOUT_VERSION = 7; +// v8: Werkzeug-Sidebar aus dem Default-Layout entfernt (Ribbon-UI Phase 3) → +// Version-Bump, damit gespeicherte Layouts auf den neuen Standard zurückfallen +// (Attribute volle linke Höhe statt Werkzeug-Palette oben). +export const LAYOUT_VERSION = 8; /** localStorage-Schlüssel des zuletzt benutzten Layouts. */ const CURRENT_KEY = "cad.layout"; @@ -55,9 +58,12 @@ const NAMED_PREFIX = "cad.layouts."; * OBEN, Zeichnungsebenen + Ebenen als Tab-Stapel UNTEN. (Ressourcen bleibt ein * schwebendes Fenster.) Jede Gruppe trägt ein Höhen-Gewicht. */ +// Ribbon-UI Phase 3: die Werkzeug-Sidebar ("tools") ist NICHT mehr im Default- +// Layout — die Werkzeuge liegen im Ribbon, der Wandtyp-/Deckentyp-Picker im +// Attribute-Panel. `ToolsPanel` bleibt registriert (per Fenster-Menü andockbar), +// nur nicht mehr per Default sichtbar → Attribute bekommt die volle linke Höhe. const DEFAULT_LEFT_GROUPS: DockGroup[] = [ - { tabs: ["tools"], activeTab: "tools", weight: 1 }, - { tabs: ["attributes"], activeTab: "attributes", weight: 1.1 }, + { tabs: ["attributes"], activeTab: "attributes", weight: 1 }, ]; const DEFAULT_RIGHT_GROUPS: DockGroup[] = [ { tabs: ["object-info", "room-balance"], activeTab: "object-info", weight: 1 }, @@ -86,9 +92,10 @@ function cloneGroups(groups: DockGroup[]): DockGroup[] { // ── Standard ──────────────────────────────────────────────────────────────── /** - * Liefert den eingebauten Startzustand: links zwei Gruppen (Werkzeuge oben, - * Zeichnungsebenen/Ebenen unten), rechts LEER. Jeder Aufruf erzeugt frische - * Objekte/Arrays, damit Aufrufer das Ergebnis gefahrlos mutieren können. + * Liefert den eingebauten Startzustand: links das Attribute-Panel (volle Höhe), + * rechts Objektinfo/Raumbilanz oben + Zeichnungsebenen/Ebenen/Umgebung unten. + * Die Werkzeuge liegen im Ribbon (keine Sidebar mehr). Jeder Aufruf erzeugt + * frische Objekte/Arrays, damit Aufrufer das Ergebnis gefahrlos mutieren können. */ export function defaultLayout(): LayoutState { return {