# Projekt-Konventionen — Browser-BIM (cad) Siehe [ROADMAP.md](ROADMAP.md) für Vision, Architektur und Phasen. ## Code-Konventionen (verbindlich) - **Alle Bezeichner im Code sind ENGLISCH** — Funktionen, Variablen, Typen, Felder, Datei-/Modulnamen. Keine deutschen Bezeichner. (Beispiel: `computeJoins`, nicht `verschneidungBerechnen`.) - **UI-Texte und Kommentare dürfen Deutsch sein** (Nutzeroberfläche ist deutsch). - **Domänen-Begriffe** möglichst nach Vectorworks-Terminologie benennen (englisch): Design Layer, Sheet/Drawing Layer, Component, Class, Hatch, Wall Style, Viewport. - **Einheiten:** intern alles in **Metern** (number). Anzeige via `formatM`. - **Geometrie-Konventionen:** Wand-Normale `n = leftNormal(u) = (-u.y, u.x)`; bei CCW-Wicklung zeigt `+n` nach innen. Schichten werden außen (−T/2) → innen (+T/2) gestapelt. ## Code-Struktur (kein God-Component) - **`App.tsx` bleibt ein dünner Shell** (Store-Provider, Oberleiste, Docks+View-Router, Statusleiste, Floating-Panels, Ressourcen-Overlay) — keine Geschäftslogik darin. - **Globaler Zustand in einem Store** (`src/state/`, Slices: project/selection/view/layout). Komponenten lesen Zustand über Store-Hooks statt Prop-Drilling. - **Features als eigene Module:** `src/views/` (View-Router-Teile), `src/editors/` (Inline-Editoren), `src/menus/` (Kontextmenü-Builder), `src/panels/`, `src/ui/`. - Ziel: modular + parallel bearbeitbar (verschiedene Features ≠ dieselbe Datei). Siehe `docs/design/state-architecture.md`. ## UI-Konventionen - **Listen-/Manager-Ansichten als saubere Tabellen:** eine Kopfzeile mit Spaltentiteln (sticky), darunter kompakte Datenzeilen mit Inline-Edit pro Zelle. KEINE wiederholten Feld-Beschriftungen pro Zeile. Gilt für Component-/Hatch-/ Line-Manager und ähnliche Listen. - Dunkler DOSSIER-Stil; kompakt, ruhig, viel Inhalt pro Fläche. - **UI-Text immer übersetzbar (i18n):** KEINE hartcodierten sichtbaren Strings im JSX. Alle Texte über eine Übersetzungsfunktion `t('key')` aus einem Wörterbuch (Default-Sprache Deutsch). Keys wie bei DOSSIER (`common.delete`, `layers.settings`, `topbar.resources`). Neue Komponenten gleich mit `t(...)` schreiben. Identifier/Keys bleiben englisch; nur die Wörterbuch-Werte sind die übersetzbaren Texte. ## Native-App-Verhalten (kein Browser-Standard) Die App soll sich wie ein natives Programm anfühlen, nicht wie eine Webseite: - **Browser-Kontextmenü global unterdrücken** (`document` `contextmenu` → `preventDefault`). Nur unser eigenes `ContextMenu` erscheint; auf Flächen ohne eigenes Menü passiert nichts. - **Keine Textauswahl / „Alles markieren":** `user-select: none` global; `user-select: text` NUR in echten Eingaben (`input`, `textarea`, `[contenteditable]`). Ctrl+A außerhalb von Eingaben unterbinden. - Bild-/Element-Drag aus (`draggable=false` wo nötig); keine Browser-Drag-Gesten. ## Architektur-Prinzip Ein **semantisches Modell** ist die einzige Wahrheit; jede Ansicht (3D, Grundriss, Schnitt) wird **abgeleitet**. Darstellung (Detailgrad, Stile, Schraffuren) wird beim Rendern angewandt, nie in die Geometrie eingebacken. ## Arbeitsweise (für Beiträge) - Substanzielle, mehrstufige Arbeit schrittweise in isolierten Schritten angehen. - Änderungen verifizieren: `npx tsc -b`, `npm run build`, und Screenshot via `node scripts/probe.mjs` (schreibt `scripts/probe.png`) bzw. `probe-ff*.mjs` für Firefox-Fälle. Screenshot ansehen und Geometrie visuell prüfen. - Dev-Server läuft via `npm run dev` (Vite, Port 5173).