/* Erscheinungsbild nach DOSSIER ("RAPPORT": Creme + Neutralgrau), inkl. Dark Mode. Der linke Navigator (Zeichnungsebenen + Ebenen-Baum) übernimmt das DOSSIER-Look: aktive Zeile als neutrale Pille, nicht-aktive gedimmt, ausgeblendete grau; Augen-Schalter, Farbtupfer, eingerückte Kinder. */ /* Hell (Standard) ist der feste Startzustand; Dunkel ist Opt-in über `[data-theme="dark"]`, gesetzt/persistiert per Umschalter in den Einstellungen (src/theme/themeMode.ts) — unabhängig von OS/Browser- Präferenz, damit die App nicht je nach Umgebung unterschiedlich startet. */ :root { color-scheme: light; --bg: #e0dbd4; --panel: #e0dbd4; --panel-2: #d4cfc8; --input: #ece8e2; --line: #d4cfc8; --border: #c8c2ba; /* --sheet bleibt bewusst hell (#f0f0f0): das Zeichenblatt ist immer „Papier", unabhängig vom UI-Theme (Wunsch des Nutzers). */ --sheet: #faf6ee; --ink: #1a1a18; --ink-2: #555550; --muted: #8a8580; --label: #1a1a18; /* Akzent NEUTRAL (kein Petrol-Grün, Nutzer-Vorgabe). */ --accent: #4a453e; --accent-light: #6b655c; --accent-dim: #f5f2ec; --accent-border: rgba(58, 53, 46, 0.2); --active: #3f3a33; --active-light: #5c564d; --active-dim: rgba(58, 53, 46, 0.12); /* Helle, randlose Feldfläche (Dropdowns/Pillen der Oberleiste, Mockup- Konvention) — bewusst heller als --panel/--input, damit Felder als eigene Fläche erkennbar sind, OHNE Rahmen zu brauchen. */ --field-bg: #f5f2ec; --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); --font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; --font-mono: "DM Mono", ui-monospace, "SF Mono", monospace; } /* Dunkel-Palette als Opt-in (Einstellungen → Darstellung → Dunkelmodus). */ :root[data-theme="dark"] { color-scheme: dark; /* Gestufte Elevations-Palette: Tiefster Grund hinten, Flächen werden nach vorn schrittweise heller — leicht kühl-neutral. --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) */ --bg: #0e0e0e; --panel: #1d1d1d; --panel-2: #262626; --input: #0a0a0a; --line: #2b2b2b; --border: #383838; --sheet: #faf6ee; --ink: #ededed; --ink-2: #a8a8a8; --muted: #6e6e6e; --label: #c8c8c8; --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); /* Helle, randlose Feldfläche (Dropdowns/Pillen der Oberleiste) — angehoben gegenüber --panel-2, analog zur hellen Palette. */ --field-bg: #2a2a2a; --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); } * { 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; /* EINE Zeile für Chrome + Ansichts-Controls (Mockup) — hoch genug für die 24px-Pillen der View-/Zoom-/Text-Steuerung. */ height: 40px; 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; /* Die Leiste selbst scrollt NICHT — nur der mittlere View-Controls-Block (.ribbon-views) scrollt bei schmalen Fenstern. So bleiben Marke, Menü und die rechte Gruppe (Datei-Aktionen + Projekt) IMMER sichtbar. */ overflow: visible; white-space: nowrap; } /* 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: 88px; } /* 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) — flache Pille ohne Rahmen (Mockup-Konvention): gefüllte Fläche in --field-bg, kein Rand. */ .tb-select { border: none; background: var(--field-bg); color: var(--ink); font-family: inherit; font-size: 11px; font-weight: 600; padding: 3px 7px; border-radius: 6px; cursor: pointer; } .tb-select:hover { background: var(--accent-dim); } .tb-select:disabled { opacity: 0.45; cursor: default; } .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): flache, randlose Pille in --field-bg, Text/Rand-Akzent bei Hover (Mockup-Konvention — kein „stets dunkler" Sonderlook mehr). */ .tb-btns { display: inline-flex; gap: 6px; } .tb-btn { display: inline-flex; align-items: center; border: none; background: var(--field-bg); color: var(--ink-2); font-family: inherit; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; padding: 3px 10px; border-radius: 8px; cursor: pointer; outline: none; transition: background-color 0.14s, color 0.14s, box-shadow 0.14s; } .tb-btn:hover:not(:disabled) { background: var(--accent-dim); color: var(--ink); } .tb-btn:focus-visible { box-shadow: 0 0 0 2px var(--accent-border); } .tb-btn:disabled { opacity: 0.45; 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) — randlos, --field-bg. */ .tb-toggle { border: none; background: var(--field-bg); color: var(--ink-2); 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; } .tb-toggle:hover { background: var(--accent-dim); color: var(--ink); } .tb-toggle.active { background: var(--accent); color: #fff; } /* ── DOSSIER-Grundprimitive: Segmentpille · Icon-Knopf · Zoom-Cluster ──────── */ /* Segmentpille (3er/4er): randloser Cluster OHNE interne Trennstriche (Mockup-Konvention) — die Zellen sitzen als kleine Pillen auf --field-bg, aktive Zelle in accent-dim. Gleiche 24px-Höhe wie die Dropdowns. */ .tb-seg { display: inline-flex; align-items: stretch; height: 24px; box-sizing: border-box; border: none; border-radius: 8px; overflow: hidden; background: var(--field-bg); padding: 2px; gap: 1px; flex: 0 0 auto; } /* Akzent-Rand, wenn ein Text-Ziel selektiert ist (Auswahl-Bewusstsein). */ .tb-seg-accent { box-shadow: inset 0 0 0 1px var(--accent); } .tb-seg-cell { display: inline-flex; align-items: center; justify-content: center; flex: 1 1 0; min-width: 22px; padding: 0 6px; border: none; border-radius: 5px; background: transparent; color: var(--ink-2); cursor: pointer; transition: background 0.14s, color 0.14s; } .tb-seg-cell:hover:not(:disabled) { background: var(--accent-dim); color: var(--ink); } .tb-seg-cell.active { background: var(--accent-dim); color: var(--ink); } .tb-seg-cell:disabled { opacity: 0.4; cursor: default; } /* Quadratischer Icon-Knopf (BarButton) — randlos, --field-bg. */ .tb-iconbtn { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; box-sizing: border-box; padding: 0; border: none; border-radius: 8px; background: var(--field-bg); color: var(--ink-2); cursor: pointer; transition: background 0.14s, color 0.14s; } .tb-iconbtn:hover:not(:disabled) { background: var(--accent-dim); color: var(--ink); } .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; } /* Mockup: Massstab/Zoom als zwei kompakte, nebeneinanderliegende Readout-Pillen (1:100 · 142%) statt einer grossen 2-zeiligen Stat-Kachel. */ .tb-stat { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 9px; box-sizing: border-box; border: none; border-radius: 6px; background: var(--field-bg); box-shadow: 0 0 0 1.5px transparent; transition: box-shadow 0.25s ease; } .tb-stat-scale { font-family: var(--font-mono); font-size: 11px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; } .tb-stat-zoom { font-family: var(--font-mono); font-size: 11px; color: var(--ink-2); font-variant-numeric: tabular-nums; } /* „am Massstab" (Live == gewählter Massstab): dezenter Akzent-Ring. */ .tb-stat-atscale { box-shadow: 0 0 0 1.5px var(--accent-border); } .tb-zoomcluster-right { display: inline-flex; flex-direction: row; align-items: center; gap: 6px; } /* ── Text-Gruppe (Mockup: EINE kompakte inline Zeile) ─────────────────────── */ .tb-textgroup { flex-direction: row; align-items: center; 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: none; border-radius: 8px; overflow: hidden; background: var(--field-bg); 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: var(--ink-2); cursor: pointer; transition: background 0.14s, color 0.14s; } .tb-lineheight-btn:hover { background: var(--accent-dim); color: var(--ink); } .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: var(--ink); border-left: 1px solid var(--border); border-right: 1px solid var(--border); } /* 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