Browser-BIM (cad): semantisches Modell, abgeleitete 2D/3D-Sichten, Zeichenwerkzeuge
Standalone-Browser-Port von DOSSIER. Enthaelt das semantische Modell mit Plan-/3D-Ableitung, Zeichen- und Editierwerkzeuge, Rhino-artiges Befehlssystem, dockbares Panel-System, Resource-Manager, DXF/.lin/.pat-Import, i18n (de/en) sowie Projektdokumentation und Probe-Harness.
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
import { StrictMode } from "react";
|
||||
import { createRoot } from "react-dom/client";
|
||||
import App from "./App";
|
||||
import { ErrorBoundary } from "./ui/ErrorBoundary";
|
||||
import { getLanguage, setLanguage } from "./i18n";
|
||||
import type { Language } from "./i18n";
|
||||
import "./styles.css";
|
||||
|
||||
// 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 {
|
||||
interface Window {
|
||||
__i18n: { getLanguage: () => Language; setLanguage: (lang: Language) => void };
|
||||
}
|
||||
}
|
||||
window.__i18n = { getLanguage, setLanguage };
|
||||
|
||||
// ── Native-App-Verhalten (kein Browser-Standard) ─────────────────────────────
|
||||
// Die App soll sich wie ein natives Programm anfühlen. Diese globalen Hooks
|
||||
// laufen einmal beim Start (außerhalb von React, am document) — sie greifen
|
||||
// app-weit und stören die eigenen React-Handler (z. B. unser ContextMenu) nicht.
|
||||
|
||||
/** Prüft, ob ein Element eine echte Texteingabe ist (Input/Textarea/CE). */
|
||||
const isTextEntry = (el: EventTarget | null): boolean => {
|
||||
if (!(el instanceof HTMLElement)) return false;
|
||||
const tag = el.tagName;
|
||||
return (
|
||||
tag === "INPUT" ||
|
||||
tag === "TEXTAREA" ||
|
||||
el.isContentEditable
|
||||
);
|
||||
};
|
||||
|
||||
// 1) Browser-Kontextmenü global unterdrücken. Unser eigenes ContextMenu wird
|
||||
// über React-onContextMenu-Handler geöffnet (die preventDefault separat
|
||||
// aufrufen); auf Flächen ohne eigenes Menü passiert hier nur das Verhindern
|
||||
// des Browser-Menüs — sonst nichts.
|
||||
document.addEventListener("contextmenu", (e) => e.preventDefault());
|
||||
|
||||
// 2) Ctrl/Cmd+A („Alles markieren") außerhalb echter Eingaben unterbinden.
|
||||
// In Eingaben bleibt es das normale Markieren des Feldinhalts.
|
||||
document.addEventListener("keydown", (e) => {
|
||||
if ((e.ctrlKey || e.metaKey) && (e.key === "a" || e.key === "A")) {
|
||||
if (!isTextEntry(document.activeElement)) e.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
// 3) Browser-Drag-Gesten unterbinden (Bild-/Element-Drag, Text-Drag). Echte
|
||||
// Eingaben bleiben unberührt, damit Auswahl-Drag im Feld weiter funktioniert.
|
||||
document.addEventListener("dragstart", (e) => {
|
||||
if (!isTextEntry(e.target)) e.preventDefault();
|
||||
});
|
||||
|
||||
createRoot(document.getElementById("root")!).render(
|
||||
<StrictMode>
|
||||
<ErrorBoundary>
|
||||
<App />
|
||||
</ErrorBoundary>
|
||||
</StrictMode>,
|
||||
);
|
||||
Reference in New Issue
Block a user