/* Erscheinungsbild nach DOSSIER ("RAPPORT": Creme + Petrol-Grün), inkl. Dark Mode. Der linke Navigator (Zeichnungsebenen + Ebenen-Baum) übernimmt das DOSSIER-Look: aktive Zeile als Petrol-Pille, nicht-aktive gedimmt, ausgeblendete grau; Augen-Schalter, Farbtupfer, eingerückte Kinder. */ /* Dark ist der feste Standard (Nutzer-Wunsch, unabhängig von OS/Browser- Präferenz — vorher hing das an `prefers-color-scheme` und zeigte je nach Umgebung fälschlich Light). Light bleibt als Opt-in erhalten (`[data-theme= "light"]`) für ein späteres manuelles Umschalt-Feature. */ :root { color-scheme: dark; /* Gestufte Elevations-Palette (Wunsch: dunkler + mehr Tiefe). Tiefster Grund hinten, Flächen werden nach vorn schrittweise heller — leicht kühl-neutral, harmoniert mit dem Petrol-Akzent. --bg Ebene 0 — App-Grund / Rinnen hinter allem (am dunkelsten) --panel Ebene 1 — Oberleiste, Docks, Panel-Körper --panel-2 Ebene 2 — angehobene Flächen: Panel-Köpfe, Hover-Zeilen --input versenkt — Eingabefelder (dunkler als die Fläche → Inset) */ /* Zwei-Ton-Grundlage (Nutzer-Vorgabe): Fast-Schwarz hinten, dunkles Neutralgrau für die Flächen. Neutral (kein Blaustich), mit dezenten Elevations-Schritten für Tiefe. */ --bg: #0e0e0e; --panel: #1d1d1d; --panel-2: #262626; --input: #0a0a0a; --line: #2b2b2b; --border: #383838; /* --sheet bleibt bewusst hell (#f0f0f0): das Zeichenblatt ist immer „Papier", unabhängig vom UI-Theme (Wunsch des Nutzers). */ --sheet: #f0f0f0; --ink: #ededed; --ink-2: #a8a8a8; --muted: #6e6e6e; --label: #c8c8c8; /* Akzent NEUTRAL (kein Petrol-Grün, Nutzer-Vorgabe): helles Neutralgrau für aktive/ausgewählte Flächen; weiße Schrift darauf bleibt lesbar. Hover/Dim sind dezente weiße Aufhellungen. */ --accent: #4d4d4d; --accent-light: #5e5e5e; --accent-dim: rgba(255, 255, 255, 0.07); --accent-border: rgba(255, 255, 255, 0.22); --active: #6a6a6a; --active-light: #7d7d7d; --active-dim: rgba(255, 255, 255, 0.1); --wall: #c8ccd2; --swing: #7e8794; --danger: #c85050; --danger-light: #d86060; /* Tiefere Schatten für klare Schichtung auf dunklem Grund. */ --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.5); --shadow-2: 0 3px 12px rgba(0, 0, 0, 0.55); --shadow-3: 0 12px 34px rgba(0, 0, 0, 0.62); --overlay: rgba(0, 0, 0, 0.62); --font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; --font-mono: "DM Mono", ui-monospace, "SF Mono", monospace; } /* Light-Palette als Opt-in (aktuell von nichts gesetzt — bereit für einen künftigen manuellen Theme-Umschalter in den Einstellungen). */ :root[data-theme="light"] { color-scheme: light; --bg: #e0dbd4; --panel: #e0dbd4; --panel-2: #d4cfc8; --input: #ece8e2; --line: #d4cfc8; --border: #c8c2ba; --sheet: #f0f0f0; --ink: #1a1a18; --ink-2: #555550; --muted: #8a8580; --label: #1a1a18; --accent: #2f5d54; --accent-light: #4a8a7c; --accent-dim: #e6efed; --accent-border: rgba(47, 93, 84, 0.35); --active: #1a655a; --active-light: #2f8275; --active-dim: rgba(26, 101, 90, 0.12); --wall: #2b3039; --swing: #9aa3b2; --danger: #8a1a1a; --danger-light: #b03030; --shadow-1: 0 1px 2px rgba(26, 26, 24, 0.08); --shadow-2: 0 2px 8px rgba(26, 26, 24, 0.14); --shadow-3: 0 6px 24px rgba(26, 26, 24, 0.18); --overlay: rgba(26, 26, 24, 0.36); } * { box-sizing: border-box; } html, body, #root { height: 100%; margin: 0; /* Dokument selbst NIE scrollen/bouncen: das Zoom-Wheel im Viewport darf die App-Chrome nicht mitziehen (macOS-Overscroll/Rubberband). Interne Panels scrollen weiterhin über ihre eigenen overflow-Container. */ overflow: hidden; overscroll-behavior: none; } /* Native-App-Verhalten: KEINE Textauswahl / „Alles markieren" in der App-Chrome. user-select global aus; nur in echten Eingaben wieder an, damit Tippen und Markieren im Feld weiter funktioniert. (Ctrl+A außerhalb von Eingaben wird in main.tsx zusätzlich unterbunden.) */ html, body, #root { -webkit-user-select: none; user-select: none; /* Kein Browser-eigenes Antippen/Highlight auf Touch. */ -webkit-tap-highlight-color: transparent; } input, textarea, [contenteditable], [contenteditable] * { -webkit-user-select: text; user-select: text; } body { font-family: var(--font); color: var(--ink); background: var(--bg); -webkit-font-smoothing: antialiased; } .app { display: flex; flex-direction: column; height: 100%; } /* ── Oberleiste ──────────────────────────────────────────────────────── */ /* Gruppen links nach rechts mit Trennern; die rechte Gruppe (Layout/ Ressourcen/Projekt) wird per margin-left:auto an den Rand geschoben. Bei sehr schmalen Fenstern darf die Leiste horizontal scrollen, statt zu brechen. */ .topbar { display: flex; align-items: center; gap: 8px; padding: 0 10px; height: 26px; border-bottom: 1px solid var(--line); /* Oberleiste auf Ebene 1 (angehoben über dem App-Grund) + weicher Schatten nach unten → trennt sich klar von der Zeichenfläche (Tiefe). */ background: var(--panel); box-shadow: var(--shadow-1); position: relative; z-index: 2; overflow-x: auto; overflow-y: hidden; white-space: nowrap; /* Dezente, normalerweise unsichtbare Scrollleiste (Firefox). */ scrollbar-width: thin; scrollbar-color: transparent transparent; } /* Tauri/macOS: native Ampeln (titleBarStyle "Overlay") liegen oben links über dem Inhalt → Zeile links einrücken, damit `dossier.` frei bleibt (~3 Ampeln + Rand). */ .topbar.topbar-native-inset { padding-left: 78px; } /* Sehr ruhige eigene Scrollleiste (WebKit/Blink): Thumb nur beim Scrollen (`is-scrolling`, von TopBar gesetzt) oder beim Überfahren sichtbar. */ .topbar::-webkit-scrollbar { height: 6px; } .topbar::-webkit-scrollbar-track { background: transparent; } .topbar::-webkit-scrollbar-thumb { background: transparent; border-radius: 3px; transition: background 0.25s ease; } .topbar.is-scrolling { scrollbar-color: rgba(140, 140, 140, 0.45) transparent; } .topbar.is-scrolling::-webkit-scrollbar-thumb, .topbar:hover::-webkit-scrollbar-thumb { background: rgba(140, 140, 140, 0.4); } /* Eine Werkzeug-Gruppe der Oberleiste. */ .tb-group { display: inline-flex; align-items: center; gap: 8px; flex: 0 0 auto; } /* Vertikaler Trenner zwischen Gruppen. */ .tb-sep { flex: 0 0 auto; width: 1px; height: 22px; background: var(--border); } /* Beschriftetes Feld (Label + Control) in der Oberleiste. */ .tb-field { display: inline-flex; align-items: center; gap: 6px; } .tb-label { font-size: 11px; font-weight: 600; letter-spacing: 0.03em; color: var(--muted); } /* Kompaktes Dropdown der Oberleiste (Detailgrad, Massstab). */ .tb-select { border: 1px solid var(--border); background: var(--input); color: var(--ink); font-family: inherit; font-size: 11px; font-weight: 600; padding: 3px 6px; border-radius: 6px; cursor: pointer; } .tb-select:hover { border-color: var(--accent-border); } .tb-scale { font-family: var(--font-mono); min-width: 78px; } /* Gruppe aus Knöpfen (Zoom). */ /* Aktions-Pillen (100 % · Einpassen · Auswahl · PDF) — optisch eine Familie mit den Dropdown-Triggern (.tb-dd-trigger): jede Aktion ist eine eigene gerahmte, abgesetzte dunkle Pill mit demselben Akzent-Hover (Rand → accent-border, Fläche → accent-dim, Text → accent). Sie bleiben Buttons (Aktion ≠ Auswahl); nur die Optik ist angeglichen. */ .tb-btns { display: inline-flex; gap: 6px; } .tb-btn { display: inline-flex; align-items: center; /* Gleiche stets-dunkle Fläche wie .tb-dd-trigger — einheitlicher Pillen- Look über die ganze Oberleiste. */ border: 1px solid #4a4a4a; background: #2c2c2c; color: #e8e8e8; font-family: inherit; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; padding: 3px 10px; border-radius: 8px; cursor: pointer; outline: none; transition: border-color 0.14s, background-color 0.14s, color 0.14s, box-shadow 0.14s; } .tb-btn:hover:not(:disabled) { border-color: var(--accent-border); background-color: rgba(255, 255, 255, 0.1); color: var(--accent); } .tb-btn:focus-visible { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-dim); } .tb-btn:disabled { color: #8a8a8a; opacity: 0.55; cursor: default; } /* Live-Zoom-Anzeige in der Oberleiste (monospace, fixe Breite). */ .tb-zoom { font-family: var(--font-mono); font-size: 12px; font-weight: 600; color: var(--ink-2); min-width: 44px; text-align: right; } /* LIVE-Massstab 1:N + Zoom% kompakt übereinander (platzsparend). */ .tb-zoomstack { display: inline-flex; flex-direction: column; align-items: flex-end; justify-content: center; gap: 1px; line-height: 1.1; } .tb-zoomstack .tb-live-scale, .tb-zoomstack .tb-zoom { font-size: 11px; min-width: 0; } /* Live-Papier-Massstab „1:N" in der Oberleiste (Akzent, monospace). Hebt sich vom gewählten Massstab im Dropdown ab — dies ist der aktuelle Ist-Massstab. */ .tb-live-scale { font-family: var(--font-mono); font-size: 12px; font-weight: 700; color: var(--accent); min-width: 56px; text-align: right; } /* Pillen-Toggle der Oberleiste (Referenzlinien). */ .tb-toggle { border: 1px solid #4a4a4a; background: #2c2c2c; color: #e8e8e8; font-family: inherit; font-size: 11px; font-weight: 600; letter-spacing: 0.03em; padding: 6px 12px; border-radius: 8px; cursor: pointer; transition: background 0.14s, color 0.14s, border-color 0.14s; } .tb-toggle:hover { background: rgba(255, 255, 255, 0.1); border-color: var(--accent-border); color: var(--accent); } .tb-toggle.active { background: var(--accent); border-color: var(--accent); color: #fff; } /* ── DOSSIER-Grundprimitive: Segmentpille · Icon-Knopf · Zoom-Cluster ──────── */ /* Segmentpille (3er/4er): Aussencontainer rund, Zellen gleich hoch, interne Trenner über border-left. Genutzt für Zoom-Aktionen, B/I/U, L/C/R. Gleiche stets-dunkle Fläche wie .tb-dd-trigger/.tb-btn (einheitlicher Pillen-Look). */ .tb-seg { display: inline-flex; align-items: stretch; height: 24px; box-sizing: border-box; border: 1px solid #4a4a4a; border-radius: 8px; overflow: hidden; background: #2c2c2c; flex: 0 0 auto; } /* Akzent-Rand, wenn ein Text-Ziel selektiert ist (Auswahl-Bewusstsein). */ .tb-seg-accent { border-color: var(--accent); } .tb-seg-cell { display: inline-flex; align-items: center; justify-content: center; flex: 1 1 0; min-width: 26px; padding: 0 6px; border: none; border-left: 1px solid #4a4a4a; background: transparent; color: #b0b0b0; cursor: pointer; transition: background 0.14s, color 0.14s; } .tb-seg-cell:first-child { border-left: none; } .tb-seg-cell:hover:not(:disabled) { background: rgba(255, 255, 255, 0.1); color: #f0f0f0; } .tb-seg-cell.active { background: var(--accent); color: #fff; } .tb-seg-cell:disabled { opacity: 0.4; cursor: default; } /* Quadratischer Icon-Knopf (BarButton). */ .tb-iconbtn { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; box-sizing: border-box; padding: 0; border: 1px solid #4a4a4a; border-radius: 8px; background: #2c2c2c; color: #b0b0b0; cursor: pointer; transition: background 0.14s, color 0.14s, border-color 0.14s; } .tb-iconbtn:hover:not(:disabled) { background: rgba(255, 255, 255, 0.1); border-color: var(--accent-border); color: var(--accent); } .tb-iconbtn:disabled { opacity: 0.4; cursor: default; } /* Massstab/Zoom-Cluster (2×2-Raster): Stat-Pille links über beide Zeilen. */ .tb-zoomcluster { /* Einfaches Flex: links die Stat-Pille, rechts der gestapelte (Massstab-Dropdown + Zoom-Segment) Flex-Container. Früher ein 2-Zeilen-Grid mit `grid-row: 1/span 2` an der Stat-Pille — das erzeugte aber eine leere Phantom-Zeile (die rechte Seite ist EIN Flex-Container, keine zwei Grid- Zeilen) und damit +6px Höhe, wodurch der Cluster höher war als die übrigen zweizeiligen Kombos. */ display: inline-flex; align-items: center; gap: 6px; } .tb-stat { display: flex; flex-direction: column; justify-content: center; align-items: center; width: 70px; height: 50px; box-sizing: border-box; border: 1px solid var(--border); border-radius: 14px; background: var(--input); /* Ring (Box-Shadow statt Border) für „am Massstab" — startet unsichtbar (Alpha 0) und blendet weich ein/aus, statt die Fläche aufzuhellen. */ box-shadow: 0 0 0 1.5px rgba(255, 255, 255, 0); transition: box-shadow 0.25s ease; } .tb-stat-scale { font-family: var(--font-mono); font-size: 11px; font-weight: 700; line-height: 1.3; color: var(--accent); width: 100%; text-align: center; border-bottom: 1px solid var(--border); } .tb-stat-zoom { font-family: var(--font-mono); font-size: 11px; line-height: 1.3; color: var(--ink-2); width: 100%; text-align: center; } /* „am Massstab" (Live == gewählter Massstab): weisser Ring statt aufgehellter Fläche — blendet dynamisch ein/aus (s. transition oben), Fläche bleibt unverändert. */ .tb-stat-atscale { box-shadow: 0 0 0 1.5px rgba(255, 255, 255, 0.9); } .tb-zoomcluster-right { display: inline-flex; flex-direction: column; align-items: stretch; gap: 6px; } /* ── Text-Gruppe (immer sichtbar, 3×2) ───────────────────────────────────── */ .tb-textgroup { flex-direction: column; align-items: stretch; gap: 6px; } .tb-textgroup-row { display: inline-flex; align-items: center; gap: 6px; } /* „+ Text"-Knopf: Pille mit Icon + Label. */ /* Zeilenhöhe-Regler (ersetzt den früheren „+ Text"-Knopf — Text wird ein eigenständiges Zeichenwerkzeug, AUDIT B1). Gleiche dunkle Pillen-Optik wie die übrigen Oberleisten-Controls (.tb-dd-trigger/.tb-seg). */ .tb-lineheight { display: inline-flex; align-items: stretch; height: 24px; width: 80px; box-sizing: border-box; border: 1px solid #4a4a4a; border-radius: 8px; overflow: hidden; background: #2c2c2c; flex: 0 0 auto; } .tb-lineheight-btn { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 22px; border: none; background: transparent; color: #b0b0b0; cursor: pointer; transition: background 0.14s, color 0.14s; } .tb-lineheight-btn:hover { background: rgba(255, 255, 255, 0.1); color: #f0f0f0; } .tb-lineheight-value { flex: 1 1 auto; display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 11px; color: #e8e8e8; border-left: 1px solid #4a4a4a; border-right: 1px solid #4a4a4a; } /* Marken-Gruppe: Wortmarke + kleiner Icon-Stapel daneben (Settings/Ressourcen), wie im DOSSIER-Rhino-Plugin (ToolbarApp.jsx: Logo + vertikal gestapelte Settings-Icons direkt daneben, vor dem ersten Trenner). */ .tb-brandgroup { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; } .brand { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; line-height: 1; } .brand-word { /* Als