Schnittebenen 2D↔3D Phase 1+2, native Fenster, Hell/Dunkel-Theme, SWISSIMAGE-Import

- Schnittebenen: 3D-Live-Schnitt folgt der gewählten Grundriss-Schnittlinie
  (section3dCutId/sectionPlaneFromLevel), Schalter "Im 3D schneiden" im
  Objekt-Info, Doppelklick auf Schnittlinie springt in 2D-Schnittansicht,
  unsichtbare Ebenen blenden ihre Führungslinie aus
- Eigene native Tauri-Fenster für Kontext-Import/Zeichnungsebenen/
  Ebenen-Einstellungen/Ressourcen/Einstellungen + klassische Menüleiste
  (AppMenuBar) neben der Wortmarke
- Hell/Dunkel-Umschalter (Einstellungen → Darstellung), persistiert,
  flackerfrei vor erstem Render gesetzt
- SWISSIMAGE-Luftbild-Import (swisstopo WMS) als Kontext-Hintergrundebene
- UI-Politur: Werkzeug-Panel Symbole/Liste umschaltbar, Topbar-Quick-Access-
  Icons entfernt, Zahnrad→Einstellungen in Panel-Köpfen, Footerbar/
  Snap-Marker/Maß-HUD auf helle Pillen-Sprache umgestellt
- Neues Dachziegel-Material (RoofingTiles013A)
This commit is contained in:
2026-07-20 10:51:37 +02:00
parent 51e57c368b
commit b9e330ecb7
89 changed files with 7723 additions and 1848 deletions
+28 -1
View File
@@ -1,12 +1,30 @@
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
import { ResourceWindowApp } from "./native/ResourceWindowApp";
import { SettingsWindowApp } from "./native/SettingsWindowApp";
import { DrawingLevelsWindowApp } from "./native/DrawingLevelsWindowApp";
import { LayerSettingsWindowApp } from "./native/LayerSettingsWindowApp";
import { ContextImportWindowApp } from "./native/ContextImportWindowApp";
import { ErrorBoundary } from "./ui/ErrorBoundary";
import { getLanguage, setLanguage } from "./i18n";
import type { Language } from "./i18n";
import { applyThemeMode, getStoredThemeMode } from "./theme/themeMode";
import "./styles.css";
import "./text/fonts.css";
// Hell/Dunkel VOR dem ersten Render setzen (jedes native Fenster ist ein
// eigenes Dokument und mountet über dieselbe main.tsx) — verhindert einen
// Hell/Dunkel-Flackerer beim Laden.
applyThemeMode(getStoredThemeMode());
/** Eigenes natives Nebenfenster statt der Haupt-App? Steuert per URL-Query,
* welcher Root gemountet wird (siehe native/resourceWindow.ts bzw.
* native/settingsWindow.ts, die die URL so setzen). `?window=resources`/
* `?window=settings` → nur der jeweilige Manager/Dialog, ohne den ganzen
* App-Baum (eigener Prozesskontext, kein gemeinsamer Store). */
const windowKind = new URLSearchParams(window.location.search).get("window");
// Sprach-Naht für Werkzeuge/Tests (und einen späteren Umschalter): die i18n-
// Steuerung am window verfügbar machen. Identifier englisch; Werte übersetzbar.
declare global {
@@ -52,10 +70,19 @@ document.addEventListener("dragstart", (e) => {
if (!isTextEntry(e.target)) e.preventDefault();
});
function RootByWindowKind() {
if (windowKind === "resources") return <ResourceWindowApp />;
if (windowKind === "settings") return <SettingsWindowApp />;
if (windowKind === "drawing-levels") return <DrawingLevelsWindowApp />;
if (windowKind === "layer-settings") return <LayerSettingsWindowApp />;
if (windowKind === "context-import") return <ContextImportWindowApp />;
return <App />;
}
createRoot(document.getElementById("root")!).render(
<StrictMode>
<ErrorBoundary>
<App />
<RootByWindowKind />
</ErrorBoundary>
</StrictMode>,
);