/* ══ Hausschriften ═══════════════════════════════════════════════════════════════════════════
   ZWEI Schriften mit zwei Aufgaben (mj, 27.09.2026):

     JetBrains Mono  - alles Kurze und alles zur Bedienung: Navigation, Knöpfe, Filter,
                       Gruppen-Label, Absender, Uhrzeiten, Zähler, Namen. Dazu Pfade und Code.
     IBM Plex Sans   - alles, was man LIEST: Betreff, Vorschau, Nachrichtentext, Hilfetexte,
                       Beschreibungen, Leer-Hinweise.

   Warum zweigeteilt: Festbreite ordnet Spalten und macht Pfade lesbar, kostet aber ein Fünftel
   Breite und liest sich auf langen Absätzen langsamer. Erst Saira Condensed für alles war schlecht
   lesbar, JetBrains Mono für alles war es besser - aber der Fließtext ist die Stelle, an der eine
   Proportionalschrift wirklich gewinnt.

   MITGELIEFERT unter fonts/, nicht von Google geholt. Ein <link> auf fonts.googleapis.com wäre bei
   jedem Start ein Zugriff nach draußen; ohne Internet - und das Labor steht im Haus - fiele er aus,
   und die Oberfläche wechselte still auf die Systemschrift. Ein Fehler, den niemand meldet, weil
   nichts kaputt aussieht.

   Nur latin und latin-ext, Schnitte 400/500/600. Im Auslieferungsstand sind das 356 kB; GEHOLT wird
   pro Besucher nur, was er braucht - dafür stehen die unicode-range-Blöcke.

   Beide unter SIL Open Font License 1.1, siehe fonts/OFL-*.txt.
   ══════════════════════════════════════════════════════════════════════════════════════════ */

@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('fonts/jetbrains-mono-400-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('fonts/jetbrains-mono-400-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('fonts/jetbrains-mono-500-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('fonts/jetbrains-mono-500-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('fonts/jetbrains-mono-600-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('fonts/jetbrains-mono-600-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}


@font-face {
    font-family: 'IBM Plex Sans';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('fonts/ibm-plex-sans-400-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'IBM Plex Sans';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('fonts/ibm-plex-sans-400-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'IBM Plex Sans';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('fonts/ibm-plex-sans-500-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'IBM Plex Sans';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('fonts/ibm-plex-sans-500-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'IBM Plex Sans';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('fonts/ibm-plex-sans-600-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'IBM Plex Sans';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('fonts/ibm-plex-sans-600-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Shell-Design nach dem Architektur-Mockup (netbits-world/architecture/mockups/netbits-flow.html).
   Die CSS-Variablen schalten über die dark/light-Klasse am html-Element um (ThemeService);
   MudBlazor-Komponenten laufen parallel über das MudTheme mit denselben Tokens. */

/* Die Farben selbst stehen NICHT hier, sondern in design-vorgaben.css - erzeugt aus dem Designkatalog
   (ADR-0211). Hier steht nur, was daraus zusammengesetzt wird. Ein Farbwert in einer Regel nimmt dem
   Designer genau die Stelle, an der er ihn ändern könnte; UiBasisTests hält das fest. */
:root {
  --schatten: 0 10px 28px var(--schatten-farbe);
}

/* Die Rollen als Variablen. Wer eine davon umstellen will, stellt sie HIER um - eine Schriftart
   im Einzelfall einzutragen nimmt genau diese Möglichkeit wieder weg.

   Die Namen sagen, wonach entschieden wird: BEDIENEN oder LESEN. Nicht „gross/klein" und nicht
   „Titel/Text" - beim Betreff in der Liste wäre sonst nicht klar, wohin er gehört. Er wird gelesen,
   also Plex.

   „bedienen" ist die Grundeinstellung am body. Wer eine Lesefläche baut und nichts tut, bekommt
   also Mono - deshalb steht weiter unten EINE Regel, die alle Leseflächen aufzählt. */
/* Die Vorgaben der drei Rollen stehen in design-vorgaben.css (aus Designschriften erzeugt). */

/* Die Schriftprobe im Designer. Ihre Schrift kommt ABSICHTLICH vom Element (--nb-probe, aus dem
   Katalog) - sie soll zeigen, was gewählt ist, nicht was gerade gilt. */
.nb-schriftprobe {
    font-family: var(--nb-probe, inherit);
    padding: 6px 9px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--nb-radius-eintrag);
    background: var(--mud-palette-background);
    font-size: 14px;
}

/* ── Die Leseflächen: EINE Regel, EINE Liste ─────────────────────────────────────────────────
   Grundeinstellung am body ist „bedienen" (Mono). Alles, was man LIEST, steht hier - und nur hier.

   Warum als eine Liste und nicht als font-family an jeder Stelle: Sonst wäre die Regel „Fließtext
   ist Plex" über zwanzig Blöcke verteilt, und der einundzwanzigste würde vergessen. Verteilte
   Regeln sind in diesem Haus schon fünfmal auseinandergelaufen.

   Wer eine neue Lesefläche baut, hängt ihren Selektor HIER an oder schreibt der Fläche die Klasse
   .nb-lesen. Beides ist eine Zeile. */
.nb-lesen,

/* Betreff und Vorschau in der Liste - der Betreff wird gelesen, nicht bedient */
.nb-pf-zeile .betreff,
.nb-pf-zeile .auszug,
.nb-entwurfszeile .betreff,
.nb-entwurfszeile .auszug,

/* Der grosse Betreff im Lesebereich und der Nachrichtentext selbst */
.nb-vorgangskopf .betreff,
.nb-pf-koerper,
.nb-antwort-vorschau,

/* Hilfetexte und Beschreibungen - die längsten Absätze im ganzen Portal */
.nb-hilfe,
.nb-fensterraster .einzelheit .beschreibung,

/* Leer-Hinweise. Das sind ganze Sätze („Noch keine Gruppen.“), keine Bedienelemente. */
.nb-glocke .leer,
.nb-erkennung .gelesen .leer,
.nb-pf-liste .leer,
.nb-pf-inhalt .leer,
.nb-sp-liste .leer,
.nb-sp-inhalt .leer,
.nb-aufgabenspalte .leer,
.nb-aufgabenflaeche .leer,
.nb-kd-anm .txt.leer,
.nb-fensterraster .leer,

/* Erklärende Hinweise unter Feldern und Flächen */
.nb-rail .hinweis,
.nb-vorschau-hinweis,
.nb-signaturpflege .bild .hinweis {
    font-family: var(--nb-schriftart-lesen);
}

/* Code bleibt Code, auch mitten im Hilfetext. Ohne diese Zeile erbt <code> Plex und ein Pfad
   sieht aus wie ein Wort. */
.nb-hilfe code,
.nb-lesen code {
    font-family: var(--nb-schriftart-code);
}

* { box-sizing: border-box; }
html, body, #app { margin: 0; height: 100%; }
body {
  font-family: var(--nb-schriftart-bedienen);
  background: var(--bg); color: var(--t1); font-size: 14px; -webkit-font-smoothing: antialiased;
}
/* ===== Tastatur-Fokus =====
   Der Standard-Ring des Browsers ist im Dunkelmodus grellweiß und dominiert die halbe Fläche.
   Er läuft stattdessen in der Markenfarbe (--pri), die ohnehin mit hell/dunkel umschaltet - eine
   eigene Einstellung dafür wäre eine Stellschraube mehr, die niemand findet.

   Nur :focus-visible, nicht :focus - sonst umrahmt jeder Mausklick das Angeklickte. Der Browser
   entscheidet damit selbst, ob der Fokus per Tastatur kam. */
:focus-visible {
  outline: 2px solid var(--pri);
  outline-offset: 2px;
  border-radius: 4px;
}

/* Das Seitenfenster bekommt den Fokus beim Öffnen programmgesteuert - damit die Tastatur darin
   beginnt, nicht weil es selbst bedienbar wäre. Ein Ring um den ganzen Rahmen sagt darum nichts
   und stört nur. Die Bedienelemente darin behalten ihren. */
.nb-modalfenster .mud-dialog:focus, .nb-modalfenster .mud-dialog:focus-visible { outline: none; }
/* Ein Modalfenster in einem anderen Fenster (Chatfenster → „Aufgabe aus Chat“): MudBlazors
   Öffnungsanimation lässt ein transform am äußeren Dialog stehen, und darunter bezieht sich
   „position: fixed“ auf ihn statt auf den Bildschirm - das innere Fenster säße eingesperrt und
   abgeschnitten darin. !important schlägt den Animationswert, ohne die Animation neu abzuspielen. */
.mud-dialog:has(.nb-modalfenster) { transform: none !important; }

/* Gerenderte Hilfetexte: Der Markdown kommt fertig vom Server, hier bekommt er nur Maß. */
.nb-hilfe p { margin: 0 0 .6em; line-height: 1.55; }
.nb-hilfe p:last-child { margin-bottom: 0; }
.nb-hilfe ul, .nb-hilfe ol { margin: 0 0 .6em; padding-left: 1.2em; }
.nb-hilfe li { margin: .2em 0; }
.nb-hilfe code {
  background: var(--surf2); border: 1px solid var(--line);
  border-radius: 4px; padding: 1px 5px; font-size: .92em;
}

/* Puls des KI-Betriebs: zwoelf Saeulen statt einer Zahl. Ob der Durchsatz steigt, faellt oder
   steht, sieht man an der Form - an einem Mittelwert nicht. */
.nb-puls { display: flex; align-items: flex-end; gap: 3px; height: 46px; min-width: 180px; }
.nb-puls .saeule {
  display: block; width: 10px; border-radius: 2px 2px 0 0; background: var(--pri); opacity: .85;
}

/* ===== Bildlaufleisten =====
   Der Griff bekam schon die Linienfarbe, die Schiene blieb aber hell: Ohne color-scheme weiss der
   Browser nichts vom Dunkelmodus und zeichnet seinen eigenen Teil - Schiene, Pfeile, Ecke - in
   Hell. Das Bekenntnis steht deshalb an html.dark/html.light (siehe oben) und gilt zugleich fuer
   alles andere, was der Browser selbst malt: Auswahlfelder, Datumswaehler, Autofill.

   Der Griff traegt einen durchsichtigen Rand und zeichnet nur in seinen Inhaltsbereich: So
   schwebt er in der Schiene, statt sie randlos auszufuellen. */
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--line2); border-radius: 99px;
  border: 3px solid transparent; background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: var(--t3); background-clip: content-box; }
::-webkit-scrollbar-corner { background: transparent; }
/* Firefox kennt die Einzelteile nicht, nur Breite und zwei Farben. */
html { scrollbar-width: thin; scrollbar-color: var(--line2) transparent; }

/* ===== Kopfleiste (Mockup .appbar) ===== */
/* Ladebalken: ganz oben, über allem, ohne Platz zu nehmen - er soll sagen „es passiert etwas",
   nicht die Seite verschieben. */
.nb-ladebalken {
  position: fixed; top: 0; left: 0; right: 0; z-index: 2000; pointer-events: none;
}
.nb-appbar {
  height: 58px; background: var(--bg2); border-bottom: 1px solid var(--line);
  display: flex; align-items: center; gap: 5px; padding: 0 16px;
}
.nb-brand {
  display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 15px;
  letter-spacing: -.3px; margin-right: 16px; cursor: pointer; white-space: nowrap; color: var(--t1);
  text-decoration: none;
}
/* Das Zeichen (Shared/FlowZeichen): Fläche, Rahmen, Punkt - die Farben aus dem Designkatalog. */
.nb-flowzeichen { display: block; flex: none; }
.nb-flowzeichen .flaeche { fill: var(--nb-zeichen-flaeche); }
.nb-flowzeichen .rahmen { fill: none; stroke: var(--nb-zeichen-rahmen); stroke-width: 8; }
.nb-flowzeichen.klein .rahmen { stroke-width: 14; }
.nb-flowzeichen .punkt { fill: var(--nb-zeichen-punkt); }
/* Mandantenname neben der Marke: Wer mehrere Instanzen betreut, muss ohne Blick in die
   Adresszeile sehen, wessen Daten vor ihm liegen. */
.nb-mandant {
  display: flex; align-items: center; gap: 6px; margin-right: 14px; padding: 4px 10px;
  border-radius: 8px; background: var(--surf2); color: var(--t2); font-size: 12.5px;
  font-weight: 600; white-space: nowrap; max-width: 220px; overflow: hidden;
  text-overflow: ellipsis;
}
.nb-mnav { display: flex; gap: 1px; flex: 1; overflow-x: auto; }
.nb-mnav a {
  padding: 8px 12px; border-radius: 9px; font-size: 13.5px; color: var(--t2); cursor: pointer;
  display: flex; align-items: center; gap: 7px; white-space: nowrap; text-decoration: none;
}
.nb-mnav a:hover { background: var(--surf2); color: var(--t1); }
.nb-mnav a.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }
.nb-hico {
  width: 36px; height: 36px; border-radius: 10px; display: grid; place-items: center;
  cursor: pointer; color: var(--t2); font-size: 15px; flex: 0 0 36px; border: none; background: transparent;
}
.nb-hico:hover { background: var(--surf2); color: var(--t1); }
.nb-userbtn {
  display: flex; align-items: center; gap: 9px; padding: 4px 11px 4px 4px; border-radius: 99px;
  cursor: pointer; margin-left: 2px; border: none; background: transparent; color: var(--t1); font: inherit;
}
.nb-userbtn:hover { background: var(--surf2); }
.nb-userbtn .nm { font-size: 12.5px; font-weight: 600; line-height: 1.25; white-space: nowrap; }
/* Angemeldeter Benutzer samt Statuszeile in der Kopfzeile (ADR-0131, Abnahme-Fund Schritt 3).
   Der Präsenzpunkt braucht eine eigene positionierte Hülle - im MudAvatar säße er ohne
   positionierten Vorfahren irgendwo, nur nicht an der Ecke. */
.nb-avatarhuelle { position: relative; display: inline-flex; }
.nb-userinfo { display: flex; flex-direction: column; align-items: flex-start; text-align: left; }
.nb-userinfo .rl { font-size: 10.5px; color: var(--t3); line-height: 1.2; white-space: nowrap;
  max-width: 220px; overflow: hidden; text-overflow: ellipsis; }

/* ===== Bühne: Rail + Inhalt (Mockup .shell) ===== */
.nb-stage { height: calc(100vh - 58px); display: grid; grid-template-columns: var(--nb-rail-w, 238px) minmax(0, 1fr); }
.nb-stage.ohne-rail { grid-template-columns: minmax(0, 1fr); }
.nb-rail {
  background: var(--bg2); border-right: 1px solid var(--line); padding: 12px 9px; overflow-y: auto;
  position: relative;
}

/* Griff zum Ziehen der Spaltenbreite - liegt auf der Trennlinie, nicht daneben, damit er die
   Aufteilung des Rasters nicht verändert. Sichtbar wird er erst beim Darüberfahren: Eine ständig
   eingefärbte Linie wäre eine zweite Trennlinie neben der echten. */
/* Der Griff liegt INNEN an der Kante, nicht auf ihr: Drei Pixel darueber hinaus, und die Spalte
   hatte etwas zu scrollen - eine waagrechte Bildlaufleiste unter einer Navigation, die gar nicht
   breiter ist als ihre Spalte. */
.nb-griff {
  position: absolute; top: 0; right: 0; width: 7px; height: 100%;
  cursor: col-resize; z-index: 5; background: transparent;
  transition: background .12s;
}
.nb-griff:hover, .nb-griff:active { background: var(--pri-w); }
/* Am Chat-Panel sitzt der Griff an der LINKEN Kante - die Breite wächst nach links (ADR-0131). */
.nb-griff.kante-links { right: auto; left: 0; cursor: ew-resize; }
/* Waagrechter Griff der geteilten Chat-Fläche: liegt als eigene Rasterzeile zwischen Liste und
   Unterhaltung, nicht absolut - er trägt die Trennlinie selbst. */
.nb-griff.waagrecht {
  position: relative; top: auto; right: auto; width: auto; height: 7px;
  cursor: row-resize; border-top: 1px solid var(--line);
}
/* Am angedockten Antwortbereich liegt der Griff auf dessen Oberkante - absolut, weil der Bereich
   selbst schon die Trennlinie traegt. */
.nb-griff.waagrecht.kante-oben {
  position: absolute; top: -3px; left: 0; right: 0; height: 7px;
  border-top: none;
}
.nb-rail .kopf {
  padding: 4px 11px 10px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3);
  display: flex; align-items: center; gap: 6px;
}
.nb-rail a {
  display: flex; align-items: center; gap: 9px; padding: 8px 11px; border-radius: 9px;
  font-size: 13.5px; color: var(--t2); cursor: pointer; text-decoration: none; margin-bottom: 1px;
  /* Ein langer Name bricht um, statt die Spalte zu verbreitern: Sonst waere die Spalte auf einmal
     breiter als ihr Platz, und darunter staende eine waagrechte Bildlaufleiste. */
  min-width: 0; overflow: hidden;
}
.nb-rail a:hover { background: var(--surf2); color: var(--t1); }
.nb-rail a.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }
/* Der stille Zaehler am Menuepunkt (flow-agent-031): rechts, gedeckt, kein Signalrot - er soll
   da sein, nicht stoeren. */
.nb-menuezahl {
  margin-left: auto; min-width: 18px; padding: 0 6px; border-radius: 9px; text-align: center;
  font-size: 11px; font-weight: 600; line-height: 18px; background: var(--surf2); color: var(--t2);
}
.nb-arbeit { display: flex; flex-direction: column; min-width: 0; min-height: 0; position: relative; }
.nb-inhalt { overflow-y: auto; padding: 20px; flex: 1; min-height: 0; }

/* Aktionsleiste (ADR-0089, Nachtrag 13): ein Band unter der Navigation, von der Modul-Spalte
   bis zum Chat-Panel. Sie scrollt NICHT mit - was man tun kann, soll nicht davonwandern. */
.nb-aktionsleiste {
  display: flex; align-items: center; gap: 2px; flex: 0 0 auto; overflow-x: auto;
  height: 41px; padding: 0 10px; background: var(--bg2); border-bottom: 1px solid var(--line);
}
/* "Nach der ersten Spalte" heisst nicht immer dasselbe: Hat die Gruppe nur einen Eintrag, faellt
   die aeussere Rail weg - dann IST die Modul-Spalte der Seite die erste, und das Band gehoert
   NEBEN sie. Darum liegt es hier ausserhalb des Flusses: Im Fluss schoebe es die Navigation der
   Seite um seine Hoehe nach unten, und die gehoert an den oberen Rand. Die Breite kommt aus
   derselben Variablen, die der Spaltengriff setzt - so wandert das Band beim Ziehen mit. */
.nb-stage.ohne-rail .nb-aktionsleiste.hinter-rail {
  position: absolute; top: 0; right: 0; left: var(--nb-modul-rail-w, 238px); z-index: 3;
}
.nb-akt {
  display: flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: 8px;
  border: none; background: transparent; color: var(--t2); font: inherit; font-size: 13px;
  white-space: nowrap; cursor: pointer;
}
.nb-akt:hover:not(:disabled) { background: var(--surf2); color: var(--t1); }
/* Blass, aber lesbar: Ein Knopf, den man nicht mehr entziffert, ist so gut wie versteckt -
   und genau das Verstecken wollten wir nicht. */
.nb-akt:disabled { color: var(--t3); opacity: .55; cursor: not-allowed; }
.nb-akt.wichtig { color: var(--pri); font-weight: 600; }
.nb-akt.ab { margin-left: 10px; border-left: 1px solid var(--line); padding-left: 14px; border-radius: 0 8px 8px 0; }

/* ===== Modul-eigene Rail (Mockup: railK etc.) - Seiten rendern ihre eigene linke Spalte ===== */
.nb-modul { display: grid; grid-template-columns: var(--nb-modul-rail-w, 238px) minmax(0, 1fr); margin: -20px; height: calc(100vh - 58px - var(--nb-leiste-h, 0px)); }
.nb-modul > .nb-rail { height: 100%; }
.nb-modul-inhalt { overflow-y: auto; padding: 20px; padding-top: calc(20px + var(--nb-leiste-schweb, 0px)); }
/* Seiten, die die Flaeche selbst in Spalten teilen: Die Polsterung wuerde ihre erste Spalte
   hineinruecken, und dann sieht sie aus wie ein Kasten IN der Flaeche statt wie eine Spalte
   DER Flaeche. */
.nb-modul-inhalt.randlos { padding: 0; padding-top: var(--nb-leiste-schweb, 0px); }
.nb-rail .sect {
  padding: 16px 11px 6px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3); display: flex; align-items: center; gap: 6px;
}

/* Alle Knoepfe an den rechten Rand - eine Flucht, wie die Zaehler an den Zeilen darunter.
   Zwischen Beschriftung und Knopf zu stehen hiess: Der Knopf springt mit der Laenge des Namens,
   und das Auge findet ihn nicht wieder (Abnahme mj, 20.09.2026).

   An einer EIGENEN Huelle festgemacht und nicht an MudBlazors Klassen: Deren Aufbau kann sich
   mit der naechsten Fassung aendern, und dann stuenden die Knoepfe wieder mitten drin. */
.nb-rail .kopf .rechts,
.nb-rail .sect .rechts { margin-left: auto; display: inline-flex; align-items: center; }
/* Die Zahl bleibt VOR dem Knopf, mit Abstand: Sie gehoert zur Gruppe, nicht zum Einstellen. */
.nb-rail .sect .n { margin-left: auto; }
.nb-rail .sect .n + .rechts, .nb-rail .sect .n ~ .rechts { margin-left: 4px; }
/* Der kleine Pfeil an „Meine Arbeit": Der Eintrag fuehrt aus dem Modul heraus, und das soll man
   sehen, bevor man klickt. */
.nb-rail a .hin { margin-left: 4px; opacity: .5; }
.nb-rail a .n {
  margin-left: auto; font-size: 11px; color: var(--t3); background: var(--surf3);
  border-radius: 99px; padding: 1px 7px;
}
.nb-rail a.on .n { color: var(--pri-t); background: transparent; }
/* Die Zahl mit dem Zahnrad dahinter (Leistenzahl, mj 12.10.2026): beim Überfahren des Eintrags wird die Zahl zum
   Zahnrad. Auf Geräten ohne Maus steht das Zahnrad am gewählten Eintrag immer da - sonst käme man nie hin. */
.nb-rail a .nb-leistenzahl { margin-left: auto; display: inline-flex; align-items: center; position: relative; }
.nb-rail a .nb-leistenzahl .n { margin-left: 0; }
.nb-rail a .nb-leistenzahl .rad {
  display: none; border: none; background: transparent; color: var(--t2); padding: 0 2px; cursor: pointer; line-height: 0;
}
.nb-rail a .nb-leistenzahl .rad:hover { color: var(--pri-t); }
.nb-rail a:hover .nb-leistenzahl.mit-rad .n,
.nb-rail a:focus-within .nb-leistenzahl.mit-rad .n { display: none; }
.nb-rail a:hover .nb-leistenzahl.mit-rad .rad,
.nb-rail a:focus-within .nb-leistenzahl.mit-rad .rad { display: inline-flex; }
@media (hover: none) {
  .nb-rail a.on .nb-leistenzahl.mit-rad .rad { display: inline-flex; }
}
/* Ein Punkt, solange eine Einstellung etwas weglässt. */
.nb-rail a .nb-leistenzahl.wirkt::after {
  content: ""; position: absolute; top: -2px; right: -4px; width: 6px; height: 6px; border-radius: 50%;
  background: var(--mud-palette-primary);
}
/* Bereichsangabe an einem Rail-Eintrag: rechtsbündig und zurückgenommen, damit sie den Namen
   nicht verdrängt. Gezeigt wird sie nur, wenn die Liste mehrere Bereiche umfasst - derselbe
   Baumname darf je Bereich einmal vorkommen. */
.nb-rail a .nb-bereich {
  margin-left: auto; font-size: 11px; color: var(--t3); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; max-width: 45%;
}
.nb-rail a.on .nb-bereich { color: var(--pri-t); opacity: .8; }
.nb-neu-btn {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  margin: 4px 2px 10px; padding: 9px; border-radius: 9px; width: calc(100% - 4px);
  background: var(--pri); color: var(--auf-pri); font-weight: 600; cursor: pointer; border: none; font: inherit;
}
.nb-neu-btn:hover { filter: brightness(1.1); }

/* ---- Kalender-Modul im Design des Auftraggebers (04.10.2026) ------------------------------
   Gemessen am Entwurf: Stunde 48 px, Kalenderfarben aus Kalenderfarben.Palette (Server).
   Hinterlegung und Rand werden aus der Kalenderfarbe GEMISCHT, nicht frei gewählt: 17 % bzw.
   32 % auf --kal-basis trifft die gemessenen Werte (#1d2a40, #3a2f1f, #19332d) und trägt auch eine
   frei gewählte Farbe und den hellen Modus. Flächen und Linien aus den Tokens - der Kalender
   folgt dem Design des Bereichs wie jede andere Seite. */
.nb-kal { --kal-gruen: 17%; --kal-rand: 32%; }
html.light .nb-kal { --kal-gruen: 14%; --kal-rand: 40%; }
.nb-modul.nb-kal { grid-template-columns: var(--nb-modul-rail-w, 238px) 320px minmax(0, 1fr); }
.nb-modul.nb-kal.leiste-zu { grid-template-columns: 320px minmax(0, 1fr); }
.nb-modul.nb-kal.liste-zu { grid-template-columns: var(--nb-modul-rail-w, 238px) minmax(0, 1fr); }
.nb-modul.nb-kal.leiste-zu.liste-zu { grid-template-columns: minmax(0, 1fr); }

/* Leiste */
.nb-kal-neu { display: flex; gap: 8px; align-items: center; margin: 2px 2px 14px; }
.nb-kal-neu .neu { flex: 1; }
.nb-kal-neu .neu .mud-button-root:first-child { flex: 1; }
/* EINE HÖHE FÜR ALLE DREI (gemessen mj, 04.10.2026): Der Pfeil war 31 px hoch, der Knopf daneben
   35 px - MudBlazor setzt .mud-menu auf align-self: center, damit sitzt das Menü in der Gruppe mittig
   statt gestreckt. Gruppe und Einklapp-Knopf teilen sich deshalb eine feste Höhe. */
.nb-kal-neu { --nb-kal-neu-hoehe: 36px; }
.nb-kal-neu .neu { height: var(--nb-kal-neu-hoehe); }
.nb-kal-neu .neu > .mud-button-root { height: 100%; }
.nb-kal-neu .neu > .mud-menu { align-self: stretch; display: inline-flex; width: auto; }
.nb-kal-neu .neu > .mud-menu .mud-icon-button {
  height: 100%; padding: 0 6px;
  border-radius: 0 var(--mud-default-borderradius) var(--mud-default-borderradius) 0;
}
.nb-kal-klapp { width: var(--nb-kal-neu-hoehe); height: var(--nb-kal-neu-hoehe); border-radius: 8px; border: 1px solid var(--line2); background: transparent; color: var(--t2); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
.nb-kal-klapp:hover { background: var(--surf2); color: var(--t1); }
.nb-kal-mini { padding: 0 6px 6px; }
.nb-kal-mini .mkopf { display: flex; align-items: center; gap: 4px; font-size: 13px; font-weight: 600; color: var(--t1); margin-bottom: 6px; }
.nb-kal-mini .mkopf span { flex: 1; }
.nb-kal-mini .mkopf button { background: none; border: none; color: var(--t2); cursor: pointer; font-size: 16px; width: 24px; }
.nb-kal-mini .mraster { display: grid; grid-template-columns: repeat(7, 1fr); row-gap: 2px; column-gap: 0; }
.nb-kal-mini .mwt { font-size: 10.5px; color: var(--t3); text-align: center; padding: 2px 0; }
.nb-kal-mini .mtag { background: none; border: none; color: var(--t1); font: inherit; font-size: 12px; padding: 5px 0; border-radius: 6px; cursor: pointer; }
.nb-kal-mini .mtag:hover { background: var(--surf2); }
.nb-kal-mini .mtag.fremd { color: var(--t3); }
/* Ein Band über die sichtbaren Tage, ohne Lücke - rund nur an seinen Enden (siehe BandKlasse). */
.nb-kal-mini .mtag.sichtbar { background: var(--pri-w); border-radius: 0; }
.nb-kal-mini .mtag.sichtbar.anfang { border-top-left-radius: 6px; border-bottom-left-radius: 6px; }
.nb-kal-mini .mtag.sichtbar.ende { border-top-right-radius: 6px; border-bottom-right-radius: 6px; }
.nb-kal-mini .mtag.heute { background: var(--pri); color: var(--auf-pri); font-weight: 700; }
.nb-rail a.nb-kal-wahl { gap: 10px; }
.nb-kal-wahl .tx { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Der Stift steht immer leise da - nur beim Darüberfahren sichtbar, fand ihn niemand (mj, 04.10.2026). */
.nb-kal-wahl .bearb, .nb-kal-wahl .art { opacity: .35; display: inline-flex; color: var(--t3); }
.nb-kal-wahl:hover .bearb { opacity: .9; }
/* Die Palette für die eigene Farbe - leise wie der Stift, deutlich beim Darüberfahren. */
.nb-kal-wahl .farbe { display: inline-flex; opacity: .35; }
.nb-kal-wahl:hover .farbe { opacity: .9; }
.nb-kal-wahl .farbe .mud-icon-button { padding: 2px; color: var(--t3); }
.nb-farbmenue { padding: 12px 14px; max-width: 260px; }
.nb-farbmenue .titel { font-size: 13px; font-weight: 600; color: var(--t1); }
.nb-farbmenue .hinweis { font-size: 12px; color: var(--t3); }
.nb-kal-wahl .art { opacity: .55; }
/* Ein Abo, das nicht nachkommt (kalender-028): ein Zeichen statt still veralteter Einträge. */
.nb-kal-wahl .warnung { display: inline-flex; color: var(--mud-palette-warning); }
.nb-abo-stand { font-size: 13px; color: var(--t2); display: flex; flex-direction: column; gap: 2px; }

/* Die Farbwahl eines Kalenders: die Palette des Servers, „automatisch" und eine eigene Farbe. */
.nb-farbwahl .punkte { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 2px; }
.nb-farbwahl .punkt {
  width: 24px; height: 24px; border-radius: 50%; padding: 0; cursor: pointer; position: relative;
  background: var(--kf); border: 2px solid transparent; box-shadow: inset 0 0 0 1px var(--line2);
  display: inline-flex; align-items: center; justify-content: center; color: var(--t2);
  font: inherit; font-size: 11px; font-weight: 700;
}
.nb-farbwahl .punkt.an { border-color: var(--t1); }
.nb-farbwahl .punkt.auto { background: var(--surf2); }
.nb-farbwahl .punkt.frei input { position: absolute; inset: 0; opacity: 0; cursor: pointer; width: 100%; height: 100%; }
.nb-kal-chk { width: 15px; height: 15px; border-radius: 4px; border: 2px solid var(--kf); flex: none; position: relative; box-sizing: border-box; }
.nb-kal-chk.an { background: var(--kf); }
.nb-kal-chk.an::after { content: ""; position: absolute; left: 3px; top: 0; width: 4px; height: 8px; border: solid var(--bg2); border-width: 0 2px 2px 0; transform: rotate(45deg); }

/* Spalte „Termine" - die nächsten sieben Tage */
.nb-kal-liste { background: var(--surf); border-right: 1px solid var(--line); overflow-y: auto; height: 100%; padding: 0 0 16px; }
.nb-kal-liste .lkopf { display: flex; align-items: center; gap: 2px; padding: 12px 10px 8px 16px; position: sticky; top: 0; background: var(--surf); z-index: 2; }
.nb-kal-liste .lkopf .titel { flex: 1; font-size: 15px; font-weight: 700; color: var(--t1); }
.nb-kal-liste .lsuche { padding: 0 12px 8px; }
.nb-kal-liste .lsect { display: flex; justify-content: space-between; padding: 6px 16px 8px; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: var(--t3); }
.nb-kal-liste .lsect span:last-child { text-transform: none; letter-spacing: 0; }
.nb-kal-liste .ltag { display: grid; grid-template-columns: 52px minmax(0, 1fr); padding: 6px 10px 10px 6px; border-bottom: 1px solid var(--line); }
.nb-kal-liste .ldatum { display: flex; flex-direction: column; align-items: center; padding-top: 4px; }
.nb-kal-liste .ldatum .wt { font-size: 10px; color: var(--t3); letter-spacing: .5px; }
.nb-kal-liste .ldatum .nr { font-size: 22px; font-weight: 700; color: var(--t1); line-height: 1.1; }
.nb-kal-liste .ldatum .mo { font-size: 11px; color: var(--t3); }
.nb-kal-liste .leintraege { display: flex; flex-direction: column; gap: 2px; }
.nb-kal-liste .leintrag { display: flex; gap: 9px; padding: 6px 9px; border-radius: 8px; cursor: pointer; }
.nb-kal-liste .leintrag:hover { background: var(--surf2); }
.nb-kal-liste .leintrag.ganztags { background: color-mix(in srgb, var(--kf) var(--kal-gruen), var(--kal-basis)); }
.nb-kal-liste .leintrag .punkt { width: 7px; height: 7px; border-radius: 50%; background: var(--kf); flex: none; margin-top: 6px; }
.nb-kal-liste .leintrag .lt { font-size: 14px; font-weight: 600; color: var(--t1); }
.nb-kal-liste .leintrag .lz { font-size: 12px; color: var(--t2); }
.nb-kal-liste .lleer { padding: 12px 16px; color: var(--t3); font-size: 13px; }

/* Arbeitsbereich: Kopfzeile und Raster */
.nb-kal-inhalt { background: var(--surf); display: flex; flex-direction: column; }
.nb-kal-kopf { display: flex; align-items: center; gap: 6px; padding: 10px 16px; border-bottom: 1px solid var(--line); position: sticky; top: 0; background: var(--surf); z-index: 3; }
.nb-kal-kopf .mud-typography-h4 { font-size: 20px; font-weight: 700; margin: 0 4px 0 8px; white-space: nowrap; }
.nb-kal-kopf .kw { font-size: 11px; color: var(--t2); background: var(--surf2); border-radius: 6px; padding: 2px 8px; white-space: nowrap; }
.nb-kal-ansichten { display: inline-flex; gap: 2px; padding: 3px; border-radius: 9px; background: var(--bg2); border: 1px solid var(--line); margin-right: 4px; }
.nb-kal-ansichten button { width: 34px; height: 28px; border: none; border-radius: 6px; background: transparent; color: var(--t2); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.nb-kal-ansichten button:hover { color: var(--t1); }
.nb-kal-ansichten button.on { background: var(--surf3); color: var(--t1); }
.nb-kal-ansichten .kal-ic { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 15px; border: 1.5px solid currentColor; border-top-width: 3.5px; border-radius: 3px; font-size: 8.5px; font-weight: 700; line-height: 1; box-sizing: border-box; }

.nb-kal-woche { display: grid; background: var(--surf2); gap: 0 1px; }
.nb-kal-woche .kopfzelle { background: var(--surf); padding: 10px 10px 8px; display: flex; align-items: center; gap: 8px; }
.nb-kal-woche .kopfzelle .wt { font-size: 11px; color: var(--t3); letter-spacing: .5px; }
.nb-kal-woche .kopfzelle .nr { font-size: 18px; font-weight: 700; color: var(--t1); min-width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; }
.nb-kal-woche .kopfzelle.heute .nr { background: var(--pri); color: var(--auf-pri); }
.nb-kal-woche .kopfzelle.zeitlabel { font-size: 10px; color: var(--t3); justify-content: flex-end; padding: 8px 6px; }
.nb-kal-woche .ganztags { background: color-mix(in srgb, var(--surf) 88%, var(--bg2)); min-height: 34px; padding: 4px; display: flex; flex-direction: column; gap: 3px; border-bottom: 1px solid var(--line2); cursor: pointer; }
.nb-kal-spalte { position: relative; background: var(--surf); }
.nb-kal-stunde { height: 48px; border-top: 1px solid var(--surf2); box-sizing: border-box; }
.nb-kal-zeitspalte .nb-kal-stunde { font-size: 10.5px; color: var(--t3); text-align: right; padding-right: 8px; padding-top: 3px; border-top-color: transparent; }
.nb-kal-block { position: absolute; border-radius: 6px; padding: 4px 7px; overflow: hidden; cursor: pointer; box-sizing: border-box;
  background: color-mix(in srgb, var(--kf) var(--kal-gruen), var(--kal-basis));
  border: 1px solid color-mix(in srgb, var(--kf) var(--kal-rand), var(--kal-basis)); color: var(--t1); }
.nb-kal-block:hover { filter: brightness(1.12); z-index: 2; }

/* ── Ziehen (kalender-008) ───────────────────────────────────────────────────────────────────
   Ziehbar ist, was der Server als änderbar meldet. touch-action: none, damit der Finger am Tablet
   den Termin zieht und nicht die Seite; user-select, damit kein Text markiert wird. */
.nb-kal-block.ziehbar, .nb-kal-zeile.ziehbar, .nb-kal-chip.ziehbar { cursor: grab; touch-action: none; user-select: none; }
.nb-kal-block .griff { position: absolute; left: 0; right: 0; bottom: 0; height: 7px; cursor: ns-resize; }
.nb-kal-block .griff:hover { background: color-mix(in srgb, var(--kf) 45%, transparent); }
.nb-kal-block.gezogen, .nb-kal-zeile.gezogen, .nb-kal-chip.gezogen { opacity: .35; }
.nb-kal-woche.zieht, .nb-kal-monat.zieht { cursor: grabbing; user-select: none; }
/* Der Schatten fängt keine Maus - sonst bekäme die Spalte darunter das Eintreten nicht mit. */
.nb-kal-block.geist { pointer-events: none; z-index: 4; border-style: dashed; border-width: 2px; box-shadow: 0 6px 18px color-mix(in srgb, var(--schatten-farbe) 65%, transparent); }
.nb-kal-block.geist.gesperrt { border-color: var(--bad); }
.nb-kal-block.geist .bh { font-size: 11px; color: var(--t2); margin-top: 2px; }
.nb-kal-tag.ziel { outline: 2px dashed var(--pri); outline-offset: -2px; }
.nb-kal-tag.ziel.gesperrt { outline-color: var(--bad); }
.nb-kal-block .bt { font-size: 13px; font-weight: 600; line-height: 1.25; }
.nb-kal-block .bz { font-size: 11px; color: var(--kf); }
.nb-kal-block .bo { font-size: 11px; color: var(--t2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nb-kal-block.frei { border-style: dashed; }
.nb-kal-jetzt { position: absolute; left: 0; right: 0; height: 2px; background: var(--bad); z-index: 4; pointer-events: none; }
.nb-kal-jetzt::before { content: ""; position: absolute; left: -5px; top: -4px; width: 10px; height: 10px; border-radius: 50%; background: var(--bad); }
.nb-kal-chip { font-size: 11.5px; font-weight: 600; padding: 2px 7px; border-radius: 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer;
  background: color-mix(in srgb, var(--kf) var(--kal-gruen), var(--kal-basis));
  border: 1px solid color-mix(in srgb, var(--kf) var(--kal-rand), var(--kal-basis)); color: var(--t1); }

.nb-kal-monat { display: grid; grid-template-columns: 48px repeat(7, minmax(0, 1fr)); background: var(--surf2); gap: 1px; }
.nb-kal-monat .kw-kopf, .nb-kal-monat .kw-zelle { background: var(--surf); }
.nb-kal-monat .kw-zelle { font-size: 10px; color: var(--t3); padding: 10px 6px; }
.nb-kal-wt { background: var(--surf); padding: 8px 10px; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: var(--t3); }
.nb-kal-tag { background: var(--surf); min-height: 150px; padding: 6px 7px; cursor: pointer; display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.nb-kal-tag:hover { background: color-mix(in srgb, var(--surf) 92%, var(--t1)); }
.nb-kal-tag .tkopf { display: flex; justify-content: flex-end; align-items: center; gap: 6px; min-height: 24px; }
.nb-kal-tag .nr { font-size: 13px; color: var(--t2); padding: 2px 6px; border-radius: 999px; white-space: nowrap; }
.nb-kal-tag.fremd .nr { color: var(--t3); }
.nb-kal-tag.fremd .nb-kal-chip, .nb-kal-tag.fremd .nb-kal-zeile { opacity: .6; }
.nb-kal-tag.heute .nr { background: var(--pri); color: var(--auf-pri); font-weight: 700; min-width: 24px; text-align: center; }
.nb-kal-zeile { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--t1); white-space: nowrap; overflow: hidden; cursor: pointer; padding: 1px 2px; border-radius: 4px; }
.nb-kal-zeile:hover { background: var(--surf2); }
.nb-kal-zeile .punkt { width: 6px; height: 6px; border-radius: 50%; background: var(--kf); flex: none; }
.nb-kal-zeile .zeit { color: var(--t2); flex: none; }
.nb-kal-zeile .nb-lesen { overflow: hidden; text-overflow: ellipsis; }
.nb-kal-tag .weitere { background: none; border: none; padding: 1px 2px; text-align: left; color: var(--pri-t); font: inherit; font-size: 12px; cursor: pointer; }
.nb-kal-eintrag { font-size: 11px; line-height: 1.35; padding: 1px 6px; border-radius: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nb-kal-eintrag.abgeleitet { background: transparent; color: var(--t2); }

/* Liste (Agenda, kalender-007) */
.nb-kal-agenda { display: flex; flex-direction: column; gap: 12px; padding: 16px; }
.nb-kal-agenda .tag { border: 1px solid var(--line); border-radius: 12px; background: var(--surf); overflow: hidden; }
.nb-kal-agenda .tag h3 { margin: 0; padding: 6px 12px; font-size: 12px; font-weight: 600; color: var(--t2); background: var(--bg2); display: flex; gap: 8px; align-items: center; }
.nb-kal-agenda .tag.heute h3 { color: var(--pri-t); }
.nb-kal-agenda .tag.ueberfaellig h3 { color: var(--bad); }
.nb-kal-agenda .zeile { display: grid; grid-template-columns: 110px 1fr auto; gap: 12px; padding: 6px 12px; border-top: 1px solid var(--line); border-left: 3px solid var(--kf, var(--pri)); font-size: 13px; cursor: pointer; }
.nb-kal-agenda .zeile:hover { background: var(--surf2); }
.nb-kal-agenda .zeile .zeit { color: var(--t2); font-variant-numeric: tabular-nums; }
.nb-kal-agenda .zeile .hinweis { color: var(--t3); font-size: 12px; }
.nb-kal-agenda .leer { padding: 6px 12px; color: var(--t3); font-size: 12px; border-top: 1px solid var(--line); }
.nb-kal-punkt { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 6px; background: var(--pri); flex: none; }

/* Arbeitsfreie Tage und Arbeitszeit im Kalenderraster */
.nb-kal-tag.arbeitsfrei { background: color-mix(in srgb, var(--surf) 94%, var(--pri) 6%); opacity: .68; }
.nb-kal-tag.arbeitsfrei:hover { opacity: 1; }
.nb-kal-tag.arbeitsfrei.hat-eintraege { opacity: 1; }
.nb-kal-frei-label { font-size: 9px; color: var(--t3); text-transform: uppercase; letter-spacing: .04em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nb-kal-sperre { position: absolute; left: 0; right: 0; background: repeating-linear-gradient(-45deg, transparent 0 6px, color-mix(in srgb, var(--t3) 12%, transparent) 6px 7px); pointer-events: none; }

/* Kommunikations-Modul: Chatverlauf */
.nb-chat { display: flex; flex-direction: column; height: calc(100vh - 58px - 40px); }
.nb-chat-verlauf { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; padding: 4px 2px; }
/* Die Unterhaltung als Spalte in der Mitte (mj, 09.10.2026): Auf breiten Flächen klebten die Beiträge an beiden Rändern,
   und das Auge sprang hin und her. Höchstens 860 px breit, der Rand wächst mit - als Innenabstand, damit die
   Bildlaufleiste außen bleibt. Eingabe und die Leisten darüber stehen in derselben Spalte. */
.nb-mf-unterhaltung { --nb-chat-rand: max(12px, calc((100% - 860px) / 2)); }
.nb-mf-unterhaltung > .nb-chat-verlauf,
.nb-mf-unterhaltung > .nb-chat-eingabe,
.nb-mf-unterhaltung > .nb-chat-antwort-leiste,
.nb-mf-unterhaltung > .nb-chat-bearbeiten-leiste,
.nb-mf-unterhaltung > .nb-chat-erwaehnen,
.nb-mf-unterhaltung > .nb-chat-anhaenge-offen,
.nb-mf-unterhaltung > .nb-chat-aufnahme,
.nb-mf-unterhaltung > .nb-chat-aus-sprache,
.nb-mf-unterhaltung > .nb-tippt,
.nb-mf-unterhaltung > .nb-ki-status { padding-left: var(--nb-chat-rand); padding-right: var(--nb-chat-rand); }
.nb-chat-beitrag { max-width: 72%; padding: 8px 12px; border-radius: 12px; background: var(--surf2); align-self: flex-start; }
.nb-chat-beitrag.eigener { background: var(--pri-w); color: var(--pri-t); align-self: flex-end; }
.nb-chat-beitrag .meta { font-size: 10px; color: var(--t3); margin-bottom: 2px; }
/* kommunikation-017: Ändern und Löschen am eigenen Beitrag - leise, erst beim Überfahren deutlich. */
.nb-chat-beitrag .nb-chat-beitrag-aktionen { margin-left: 6px; opacity: .35; }
.nb-chat-beitrag:hover .nb-chat-beitrag-aktionen { opacity: 1; }
.nb-chat-beitrag-aktionen button { background: none; border: 0; padding: 0 2px; color: var(--t3); cursor: pointer; vertical-align: middle; }
.nb-chat-beitrag-aktionen button:hover { color: var(--t1); }
.nb-chat-beitrag .text.geloescht { font-style: italic; color: var(--t3); }
/* kommunikation-018: das Zitat über einer Antwort - ein Klick springt zum Beitrag. */
.nb-chat-zitat { display: block; width: 100%; text-align: start; font: inherit; font-size: 12px; background: var(--nb-hover);
  border: 0; border-left: 3px solid var(--pri); border-radius: 6px; padding: 3px 8px; margin: 2px 0 4px; cursor: pointer;
  color: var(--t2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-chat-zitat b { color: var(--t1); font-weight: 600; margin-right: 4px; }
.nb-chat-beitrag.angesprungen { outline: 2px solid var(--pri); transition: outline-color .4s; }
.nb-chat-antwort-leiste { display: flex; align-items: center; gap: 6px; padding: 4px 12px 0; font-size: 12px; color: var(--t2); }
.nb-chat-antwort-leiste .an { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* kommunikation-019: Vorschläge zum „@…“ über der Eingabe. */
.nb-chat-beitrag .text .nb-erwaehnung { color: var(--pri-t); font-weight: 600; background: var(--pri-w); border-radius: 4px; padding: 0 2px; }
/* Interne Verweise als Chip (kommunikation-035) - überall, wo Nachrichtentext gezeichnet wird. */
.nb-verweis-chip { display: inline-flex; align-items: center; padding: 0 8px; border-radius: 10px; border: 1px solid var(--line);
    background: var(--surf2); color: var(--pri-t); font-size: .92em; text-decoration: none; white-space: nowrap; }
a.nb-verweis-chip:hover { background: var(--pri-w); }
.nb-verweis-chip.ohne-ziel { color: var(--t2); }
/* Was ein Kollege an dieser Unterhaltung schreibt (kommunikation-030) - ein Hinweis über dem Verlauf. */
.nb-fremder-entwurf { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 6px 0; padding: 6px 10px;
    border: 1px dashed var(--line2); border-radius: 6px; background: var(--surf2); color: var(--t2); font-size: 13px; }
.nb-fremder-entwurf .text { flex-basis: 100%; color: var(--t1); padding-top: 4px; }
/* KI-Vorschläge in der Unterhaltung (kommunikation-029) */
.nb-ki-vorschlaege { margin: 6px 0; padding: 8px 10px; border: 1px solid var(--line); border-left: 3px solid var(--pri); border-radius: 6px; background: var(--surf2); }
.nb-ki-vorschlaege > .kopf { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--t2); text-transform: uppercase; letter-spacing: .04em; }
.nb-ki-vorschlaege > .kopf .nb-ki-alle { margin-left: auto; }
.nb-ki-vorschlag { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px solid var(--line); }
.nb-ki-vorschlaege > .kopf + .nb-ki-vorschlag { border-top: none; }
.nb-ki-vorschlag .art { color: var(--pri); flex: none; }
.nb-ki-vorschlag .mitte { flex: 1; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
.nb-ki-vorschlag .mitte.felder .nb-ki-titel { flex: 2 1 240px; }
.nb-ki-vorschlag .mitte.felder .nb-ki-gruppe, .nb-ki-vorschlag .mitte.felder .nb-ki-faellig { flex: 1 1 140px; }
.nb-ki-vorschlag .titel { color: var(--t1); }
.nb-ki-vorschlag .stelle { flex-basis: 100%; color: var(--t2); font-size: 12.5px; font-style: italic; }
.nb-pf-ki-vorschlag { color: var(--pri); }
/* „Weitere“ in der Leiste der Kommunikation: die seltenen Sichten eingerückt darunter */
.nb-rail .nb-pf-weitere-liste a { padding-left: 28px; }
/* Stummgeschaltete Unterhaltungen: Zeichen am Namen, die Zahl leise. */
.nb-chatzeile .stumm { color: var(--t3); vertical-align: middle; }
.nb-chatzeile .ung.leise { background: var(--surf3); color: var(--t2); }
/* Sprachnachrichten: die Aufnahme über der Eingabe, der Abspieler im Beitrag. */
.nb-chat-aufnahme { display: flex; align-items: center; gap: 8px; padding-top: 6px; font-size: 12.5px; color: var(--t2); }
.nb-chat-aufnahme .punkt { width: 10px; height: 10px; border-radius: 50%; background: var(--bad); animation: nb-aufnahme 1.2s infinite; }
@keyframes nb-aufnahme { 50% { opacity: .3; } }
.nb-chat-beitrag audio.nb-chat-ton { display: block; width: 260px; max-width: 100%; height: 36px; }
/* Die Mitschrift einer Sprachnachricht - nur auf Verlangen, leise unter dem Abspieler. */
.nb-chat-beitrag .nb-chat-mitschreiben { padding: 4px 0 0; font-size: 12px; }
.nb-chat-beitrag .nb-chat-mitschreiben:disabled { color: var(--t3); cursor: default; text-decoration: none; }
.nb-chat-mitschrift { max-width: 260px; padding-top: 4px; font-size: 12.5px; font-style: italic; color: var(--t2); white-space: pre-wrap; }
/* „Neu erzeugen“ an der letzten KI-Antwort - leise in der Modellzeile. */
.nb-ki-neu { font: inherit; font-size: inherit; color: var(--pri-t); background: none; border: 0; padding: 0 0 0 6px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 2px; }
.nb-ki-neu:hover { text-decoration: underline; }
.nb-chat-aus-sprache { display: flex; align-items: center; gap: 6px; padding-top: 6px; font-size: 12px; color: var(--pri-t); }
.nb-chat-erwaehnen { display: flex; flex-wrap: wrap; gap: 4px; padding: 4px 12px 0; }
.nb-chat-erwaehnen button { font: inherit; font-size: 12px; border: 1px solid var(--line2); background: var(--surf); color: var(--t1);
  border-radius: 99px; padding: 2px 9px; cursor: pointer; }
.nb-chat-erwaehnen button:hover { background: var(--pri-w); color: var(--pri-t); }
/* kommunikation-020: wer den Raum verwaltet. */
.nb-raum-verwalter { display: block; font-size: 11px; color: var(--pri-t); }
.nb-chat-bearbeiten-leiste { display: flex; align-items: center; gap: 6px; padding: 4px 12px 0; font-size: 12px; color: var(--pri-t); }
.nb-chat-beitrag.eigener .meta { color: var(--pri-t); opacity: .7; }
.nb-chat-beitrag .text { font-size: 13px; word-break: break-word; }
/* Kein pre-wrap mehr: Der Text wird als Markdown dargestellt, Absätze sind jetzt <p> - beides
   zusammen ergäbe doppelte Leerzeilen. Einzelne Umbrüche bleiben erhalten (harte Umbrüche in
   der Pipeline), deshalb geht durch den Wechsel nichts verloren. */
.nb-chat-beitrag .text > :first-child { margin-top: 0; }
.nb-chat-beitrag .text > :last-child { margin-bottom: 0; }
.nb-chat-beitrag .text p { margin: 0 0 .5em; }
.nb-chat-beitrag .text ul, .nb-chat-beitrag .text ol { margin: .25em 0 .5em; padding-left: 1.2em; }
.nb-chat-beitrag .text li { margin: .15em 0; }
.nb-chat-beitrag .text code { font-size: 12px; padding: 1px 4px; border-radius: 4px;
  background: color-mix(in srgb, var(--t2) 18%, transparent); }
.nb-chat-beitrag .text pre { margin: .4em 0; padding: 8px 10px; border-radius: 8px; overflow-x: auto;
  background: color-mix(in srgb, var(--t2) 14%, transparent); }
.nb-chat-beitrag .text pre code { background: none; padding: 0; }
.nb-chat-beitrag .text blockquote { margin: .4em 0; padding-left: 8px; border-left: 2px solid var(--line);
  opacity: .85; }
.nb-chat-beitrag .text h1, .nb-chat-beitrag .text h2, .nb-chat-beitrag .text h3,
.nb-chat-beitrag .text h4, .nb-chat-beitrag .text h5, .nb-chat-beitrag .text h6 {
  font-size: 13px; font-weight: 600; margin: .5em 0 .25em; }
.nb-chat-beitrag .text table { border-collapse: collapse; margin: .4em 0; }
.nb-chat-beitrag .text th, .nb-chat-beitrag .text td { border: 1px solid var(--line); padding: 2px 6px; }
.nb-chat-beitrag.gewaehlt { outline: 2px solid var(--pri); }
/* Ältere Beiträge nachladen (kommunikation-016): leise oben im Verlauf, meldet sich beim Hochrollen selbst. */
.nb-chat-aelter { display: block; margin: 0 auto 8px; font: inherit; font-size: 11.5px; color: var(--t3); background: none;
  border: 0; padding: 4px 10px; border-radius: 99px; cursor: pointer; }
.nb-chat-aelter:hover { background: var(--nb-hover); color: var(--t2); }
.nb-chat-neu-linie { display: flex; align-items: center; gap: 8px; color: var(--pri-t); font-size: 11px; }
.nb-chat-neu-linie::before, .nb-chat-neu-linie::after { content: ""; flex: 1; border-top: 1px solid var(--pri); opacity: .5; }
.nb-chat-eingabe { display: flex; gap: 8px; padding-top: 10px; align-items: flex-end; }

/* Chat-Fenster aus der Glocke (kommunikation-014): feste Höhe, damit Verlauf und Eingabe ihren Platz
   haben, statt dass das Fenster mit jeder Nachricht wächst. */
.nb-chatfenster { height: min(80vh, 760px); }
.nb-chatfenster .nb-chat-verlauf { padding: 10px 12px; }
.nb-chatfenster .nb-chat-eingabe { padding: 8px 12px 12px; }

/* Kein Tooltip darf das Dokument breiter machen. Ein Tooltip ist ein absolut positionierter
   Popover: Steht sein Anker am rechten Rand (Chat-Panel) und ist der Text lang, ragt er über den
   Viewport hinaus, das Dokument bekommt eine waagrechte Bildlaufleiste, das Layout rutscht - und
   damit rutscht der Zeiger vom Anker weg, der Tooltip schließt, die Leiste verschwindet, es
   rutscht zurück, der Zeiger steht wieder am Anker: ein Flattern, das erst mit dem Zeiger endet.
   Die Grenze gilt global, weil auch der Quellen-Schnipsel der KI beliebig lang sein kann. */
.mud-tooltip { max-width: 320px; text-align: start; overflow-wrap: anywhere; }

/* Messenger-Fläche (ADR-0131): der wirtsneutrale Inhalt - eine Unterhaltung. Die Liste führt der Wirt
   (Kommunikation → Chats, ADR-0212). */
.nb-mf { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.nb-mf .nb-mf-unterhaltung { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.nb-prow.on { background: var(--pri-w); }
/* Die KI steht oben in der Liste, vor Personen und Gruppen (ADR-0131) - abgesetzt, weil sie
   weder Person noch Raum ist. */
.nb-prow.ki { border-bottom: 1px solid var(--line); }
.nb-prow .grpico.ki { background: var(--pri-w); color: var(--pri-t); }
/* Was eine Antwort belegt, steht darunter - fehlen die Chips, war nichts zu finden. */
.nb-ki-quellen { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.nb-ki-modell { font-size: 10.5px; color: var(--t3); margin-top: 4px; }
.nb-ki-warnung { margin: 0 12px 6px; padding: 7px 10px; border-radius: 8px; font-size: 11.5px;
  background: color-mix(in srgb, var(--bad) 16%, transparent); color: var(--bad); border: 1px solid var(--bad); }

/* Glocke der Kopfzeile (ADR-0131): Liste der Benachrichtigungen, Ungelesenes hervorgehoben. */
.nb-glocke { min-width: 340px; max-width: 420px; max-height: 60vh; overflow-y: auto; }
.nb-glocke .leer { padding: 18px 15px; font-size: 12.5px; color: var(--t3); }
.nb-glocke .zeile { display: flex; gap: 10px; align-items: flex-start; padding: 9px 15px;
  cursor: pointer; border-bottom: 1px solid var(--line); }
.nb-glocke .zeile:hover { background: var(--surf2); }
/* Ungelesenes trägt einen Balken statt einer Flächenfarbe - eine eingefärbte Zeile las sich
   wie eine Auswahl, nicht wie „neu". */
.nb-glocke .zeile.neu { border-left: 3px solid var(--pri); padding-left: 12px; }
/* Schlummern an der Erinnerung (kalender-030) - in der Glocke und im Fenster gleich. */
.nb-schlummern { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; margin-top: 6px; }
.nb-schlummern .was { font-size: 12px; color: var(--t3); margin-right: 2px; }
.nb-schlummern button { font: inherit; font-size: 12px; padding: 2px 8px; border-radius: 6px; cursor: pointer;
  border: 1px solid var(--line2); background: transparent; color: var(--t2); }
.nb-schlummern button:hover { background: var(--surf2); color: var(--t1); }
.nb-erinnerung { display: flex; flex-direction: column; }
.nb-glocke .txt { flex: 1; min-width: 0; }
.nb-glocke .txt b { font-size: 12.5px; font-weight: 600; display: block; }
.nb-glocke .txt span { font-size: 11.5px; color: var(--t3); display: block;
  overflow: hidden; text-overflow: ellipsis; }
.nb-glocke .mal { margin-left: 6px; color: var(--pri-t); font-weight: 700; }
.nb-glocke .zt { font-size: 10.5px; color: var(--t3); white-space: nowrap; }

/* Präsenzpunkt (ADR-0131): sitzt an der Ecke des Avatars bzw. als kleiner Punkt im Menü.
   Farbe = Status; der Text daneben sagt, WOHER der Status kommt. */
.nb-pres {
  position: absolute; right: -2px; bottom: -2px; width: 10px; height: 10px;
  border-radius: 50%; border: 2px solid var(--bg2); box-sizing: content-box;
}
.nb-pres.frei { background: var(--ok); }
.nb-pres.busy { background: var(--warn); }
.nb-pres.dnd { background: var(--bad); }
.nb-pres.weg { background: var(--t3); }
.nb-pres.nb-pres-menu { position: static; display: inline-block; width: 9px; height: 9px;
  border: 0; margin-right: 8px; vertical-align: baseline; }
.nb-prow .grpico { position: relative; }
.nb-chatkopf { display: flex; align-items: center; gap: 8px; padding: 11px 14px; border-bottom: 1px solid var(--line); }
.nb-chatkopf .t2 { flex: 1; font-size: 12px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--t3); }
.nb-chatkopf .ic2 { cursor: pointer; color: var(--t3); font-size: 14px; background: none; border: none; padding: 2px; }
.nb-chatkopf .ic2:hover, .nb-chatkopf .ic2.an { color: var(--pri-t); }
.nb-prow { display: flex; align-items: center; gap: 10px; padding: 8px 14px; cursor: pointer; }
.nb-prow:hover { background: var(--surf2); }
.nb-prow .grpico { width: 30px; height: 30px; border-radius: 10px; background: var(--surf3, var(--surf2));
  display: grid; place-items: center; font-size: 12px; color: var(--t2); flex: 0 0 30px; }
.nb-prow .nm3 { flex: 1; min-width: 0; }
.nb-prow .nm3 b { font-size: 12.5px; font-weight: 600; display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-prow .nm3 span { font-size: 10.5px; color: var(--t3); display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-prow .ung { background: var(--pri); color: var(--auf-pri); border-radius: 99px; font-size: 10px; font-weight: 700; padding: 1px 6px; }
.nb-crailh { padding: 13px 15px 8px; border-bottom: 1px solid var(--line); display: flex; align-items: center; gap: 9px; }
.nb-crailh .t { font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: var(--t3); flex: 1; }
.nb-chattop { display: flex; align-items: center; gap: 8px; padding: 9px 12px; border-bottom: 1px solid var(--line); }
.nb-chattop .zur { cursor: pointer; color: var(--t3); font-size: 17px; }
.nb-chattop .zur:hover { color: var(--pri-t); }
.nb-chattop .titel { flex: 1; font-weight: 650; font-size: 13.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-appbar .nb-hico { position: relative; }
.nb-appbar .nb-hico .ung { position: absolute; top: 2px; right: 0; background: var(--pri); color: var(--auf-pri);
  border-radius: 99px; font-size: 9px; font-weight: 700; padding: 0 4px; line-height: 13px; }

/* ---------- Modale Fenster (generelles UI-Design) ----------
   1) Deutlich vom Hintergrund abgehoben: Primärfarbener Rahmen mit weichem Leuchten.
   2) Reiter: Luft zwischen Reiterzeile und Inhalt sowie zwischen den Reitern.
   3) Feste Höhe mit innerem Scrollen (nb-modal-fest) - kein Springen beim Reiterwechsel. */
/* MudDialog-basierte Fenster (KI-Fortschritt u. a.) tragen denselben Look. */
.mud-dialog {
    border: 1px solid var(--mud-palette-primary);
    border-radius: 10px;
    box-shadow:
        0 0 18px color-mix(in srgb, var(--mud-palette-primary) 45%, transparent),
        0 24px 64px var(--schatten-farbe);
}

.nb-modal {
    border: 1px solid var(--mud-palette-primary);
    border-radius: 10px;
    box-shadow:
        0 0 18px color-mix(in srgb, var(--mud-palette-primary) 45%, transparent),
        0 24px 64px var(--schatten-farbe);
}

.nb-modal .mud-tabs-toolbar { margin-bottom: 18px; }
.nb-modal .mud-tab { margin-right: 10px; }
.mud-tabs-panels { padding-top: 10px; }

.nb-modal-fest { height: 64vh; display: flex; flex-direction: column; }
.nb-modal-fest .mud-tabs { flex: 1 1 auto; display: flex; flex-direction: column; min-height: 0; }
.nb-modal-fest .mud-tabs-panels { flex: 1 1 auto; overflow-y: auto; min-height: 0; }

html.nb-glow-aus .nb-modal,
html.nb-glow-aus .mud-dialog {
    box-shadow: 0 24px 64px var(--schatten-farbe);
}

/* Wer die nächste Frage beantwortet - über der Eingabe, nicht erst unter der Antwort (ADR-0134). */
.nb-ki-antwortet { font-size: 11px; color: var(--t3); padding: 4px 2px 0; }
/* Vermerk an einer Antwort ohne Hausunterlagen: „keine Quellen" heißt hier nicht
   „nichts gefunden", sondern „nicht gesucht". */
.nb-ki-ohnehaus { margin-left: 4px; color: var(--warn); }

/* Laufende KI-Frage: Die eigene Frage steht sofort da, blass, bis der Server sie geschrieben hat. */
.nb-chat-beitrag.vorlaeufig { opacity: .6; }
/* Die Statuszeile liegt ÜBER der Eingabe, nicht im Verlauf: Im Verlauf wäre sie bei längerem
   Gespräch unterhalb der sichtbaren Kante - da war der bisherige Ladebalken. */
.nb-ki-status { display: flex; align-items: center; gap: 8px; padding: 6px 2px 0;
  font-size: 12px; color: var(--t2); }

/* Das Fragezeichen eines Reiters im Einstellungs-Fenster steht rechts über dem Inhalt. */
.nb-einst-kopf { display: flex; justify-content: flex-end; margin-top: -8px; }

/* „Anna schreibt …" - über der Eingabe, damit es beim Tippen im Blick liegt. */
.nb-tippt { font-size: 11px; color: var(--t3); padding: 4px 2px 0; font-style: italic; }

/* Der KI-Entwurf: sichtbar abgesetzt, weil ihn außer dem Fragenden noch niemand sieht. */
.nb-ki-entwurf { border: 1px dashed var(--pri); border-radius: 10px; padding: 8px 10px; margin: 6px 2px 0;
  background: color-mix(in srgb, var(--pri) 6%, transparent); }
.nb-ki-entwurf .kopf { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--t2); }
.nb-ki-entwurf .kopf .modell { opacity: .8; }
.nb-ki-entwurf .knoepfe { display: flex; gap: 8px; margin-top: 6px; }
/* „eingestellt von … · bearbeitet" neben Name und Zeit. */
.nb-ki-quelle-vermerk { opacity: .8; }

/* Die Leiste unter der Eingabe: Womit die KI antwortet, gehört dorthin, wo man schreibt. */
.nb-eingabeleiste { display: flex; align-items: center; gap: 6px; padding: 2px 2px 0;
  font-size: 11px; color: var(--t3); }
.nb-eingabeleiste .wer, .nb-eingabeleiste .token { white-space: nowrap; }

/* Postfach: drei Spalten wie in jedem Mailprogramm - wer antwortet, will die Frage daneben sehen. */
/* Kategorien: die Gliederung, die Mailordner ersetzt (ADR-0093). Eine schmale Spalte links -
   sie ist Wegweiser, nicht Inhalt. */
.nb-postfach { display: grid; grid-template-columns: 180px minmax(260px, 360px) 1fr;
  gap: var(--nb-spalt, 12px);
  height: calc(100vh - 190px - var(--nb-leiste-h, 0px)); }
/* Ohne Kategorienspalte: Die Gliederung steht seit dem Umbau in der Modul-Leiste links. */
/* Ohne Seitenkopf laeuft die Flaeche ueber die ganze Modulhoehe - der Kopf steht jetzt IN der
   Spalte, so wie ueber einer Rail. */
/* Ohne Luecke zwischen den Spalten: Die Listenspalte traegt eine Trennlinie und einen eigenen
   Hintergrund - das trennt genug. Die Luecke liess dagegen einen Streifen Hintergrund neben dem
   angedockten Antwortbereich stehen, und ein negativer Rand half nicht: Die Inhaltsspalte
   schneidet ihn ab (overflow: hidden), sonst wuerde der rollende Verlauf darunter hervorlaufen. */
/* Die dritte Spalte nimmt nur, was sie braucht: „auto" heisst zugeklappt ein Griff, aufgeklappt
   ihre Breite - die Nachricht behaelt den Rest. */
.nb-postfach.zwei.mit-aufgaben {
  grid-template-columns: var(--nb-nachrichten-w, 340px) minmax(0, 1fr) auto;
}
.nb-postfach.zwei { grid-template-columns: var(--nb-nachrichten-w, 340px) minmax(0, 1fr); gap: 0;
  height: calc(100vh - 58px - var(--nb-leiste-h, 0px) - var(--nb-leiste-schweb, 0px)); }
.nb-kat-leiste { overflow-y: auto; font-size: 13px; }
.nb-kat-leiste .titel { font-size: 11px; text-transform: uppercase; letter-spacing: .4px;
  color: var(--t3); margin: 4px 0 6px 6px; display: flex; align-items: center; gap: 4px; }
.nb-kat-zeile { display: flex; align-items: center; gap: 7px; padding: 5px 8px; border-radius: 8px;
  cursor: pointer; color: var(--t2); }
.nb-kat-zeile:hover { background: var(--surf2); }
.nb-kat-zeile.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }
.nb-kat-zeile .sym { width: 14px; text-align: center; }
.nb-kat-zeile .nm { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-kat-zeile .anz { color: var(--t3); font-size: 11px; }
.nb-kat-zeile.fremd .nm { font-style: italic; }
/* Farb- und Symbolwahl im Formular */
.nb-kat-symbol { width: 26px; height: 26px; display: grid; place-items: center; border-radius: 6px;
  cursor: pointer; border: 1px solid var(--line); }
.nb-kat-symbol.on { border-color: var(--pri); color: var(--pri); }
/* Die Spalte selbst - Kopf oben fest, Liste darunter scrollend. Farbe und Trennlinie wie bei
   einer Rail-Spalte: Sie ist eine Spalte der Flaeche, kein Kasten darin. */
.nb-pf-spalte {
  display: flex; flex-direction: column; min-height: 0; position: relative;
  background: var(--bg2); border-right: 1px solid var(--line);
  /* Platz fuer den Griff an der Kante: Ohne ihn laege die Bildlaufleiste der Liste genau
     darunter, und wer sie ziehen wollte, veraenderte die Spaltenbreite. */
  padding-right: 7px;
}
.nb-pf-spalte > .kopf {
  display: flex; align-items: center; gap: 6px; flex: 0 0 auto;
  padding: 14px 14px 8px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3);
}
/* Suchfeld ueber der Liste, darunter der Satz, was gesucht wird (ADR-0147, Punkt 7). Der Satz
   steht DAUERHAFT da und nicht erst im Fehlerfall: Wer nichts findet, liest sonst „es gibt das
   nicht" - die schlimmste Antwort, weil sie falsch ist und sicher klingt. */
.nb-pf-suche { flex: 0 0 auto; padding: 0 14px 8px; }
.nb-pf-suche .mud-input-control { margin-top: 0; }
.nb-pf-suche .hinweis {
  display: block; margin-top: 2px; font-size: 11px; color: var(--t3); line-height: 1.4;
}
/* Die Erklaerung zur leeren Trefferliste darf nicht wie eine Fehlermeldung aussehen - es ist
   kein Fehler passiert, die Suche hat nur Grenzen. */
/* „gefunden in Rechnung.pdf" - die Erklärung, warum diese Zeile im Ergebnis steht. Zurückhaltend
   gesetzt: Sie beantwortet eine Frage, sie ist nicht der Inhalt der Zeile. */
/* Der Stand des Anhangs-Durchsuchens in der Kontenzeile. Zurückhaltend: Es ist eine Auskunft
   über einen Hintergrundlauf, keine Handlungsaufforderung. */
/* Der Editor IN der Fläche, nicht darüber (ADR-0150). Er füllt den Inhaltsbereich; die Rail
   daneben bleibt stehen, damit der Weg zurück sichtbar ist. */
.nb-editorflaeche {
  display: flex; flex-direction: column; min-height: 0; height: 100%;
  background: var(--bg2);
}
.nb-editorflaeche .kopf {
  display: flex; align-items: center; gap: 8px; flex: 0 0 auto;
  padding: 6px 8px; border-bottom: 1px solid var(--line); background: var(--bg2);
}
.nb-editorflaeche .kopf .name { font-weight: 600; }
.nb-editorflaeche .kopf .hinweis { font-size: 11px; opacity: .6; }
.nb-editorflaeche iframe { flex: 1; border: 0; width: 100%; min-height: 0; }

/* Im Vollbild sitzt der Kasten direkt auf dem Bildschirm - ohne den Hintergrund der Fläche
   sähe man durch ihn hindurch. */
.nb-editorflaeche.voll { background: var(--bg); }
.nb-editorflaeche:fullscreen { background: var(--bg); }

@media (max-width: 900px) {
  /* Auf schmalem Schirm ist der Hinweis das Erste, was weichen darf. */
  .nb-editorflaeche .kopf .hinweis { display: none; }
}

/* Der Office-Editor im Fenster: Er braucht Platz, sonst arbeitet man durch ein Schlüsselloch. */
.nb-editor { height: 78vh; display: flex; }
.nb-editor iframe { flex: 1; border: 0; width: 100%; height: 100%; }

/* Sichtprüfung: links das Original, rechts der gelesene Text. Nebeneinander, weil man eine Zeile
   auf dem Beleg mit derselben Zeile im Ergebnis vergleicht - untereinander müsste man scrollen
   und dabei behalten, was oben stand. */
/* Das Fenster steht, gerollt wird NUR in den beiden Hälften.
   Abnahme-Fund mj: Rechts rollte der Text das ganze Fenster mit - und damit wanderte links das
   PDF samt seiner Werkzeugleiste aus dem Bild. Zum Vergleichen taugt das nicht: Man will eine
   Zeile rechts suchen und dabei links stehenbleiben. */
.nb-pruefen { height: 88vh; display: flex; flex-direction: column; }
.nb-pruefen-inhalt {
  flex: 1; min-height: 0; overflow: hidden; display: flex; flex-direction: column;
}

.nb-erkennung {
  display: grid; grid-template-columns: 1fr 1fr; gap: 12px;
  flex: 1; min-height: 0;
}
.nb-erkennung > div {
  display: flex; flex-direction: column; min-height: 0;
  border: 1px solid var(--line); border-radius: 8px; overflow: hidden;
}
.nb-erkennung .kopf {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 6px 10px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3); border-bottom: 1px solid var(--line);
}
.nb-erkennung .kopf .zaehler { font-weight: 400; letter-spacing: 0; text-transform: none; }
.nb-erkennung .original { background: var(--bg2); }
.nb-erkennung .original img,
.nb-erkennung .original object {
  flex: 1; min-height: 0; width: 100%; object-fit: contain; border: 0;
}
.nb-erkennung .kein-bild {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 8px; flex: 1; color: var(--t3); font-size: 13px; text-align: center; padding: 16px;
}
/* Der gelesene Text in Festbreite: Eine Rechnungsnummer liest man zeichenweise, und in einer
   Proportionalschrift sehen 1 und l gleich aus - genau da steckt der Fehler, den man sucht. */
.nb-erkennung .gelesen pre {
  margin: 0; padding: 10px; overflow: auto; flex: 1; white-space: pre-wrap;
  word-break: break-word; font-size: 12.5px; line-height: 1.5;
  font-family: var(--nb-schriftart-code);
}
.nb-erkennung .gelesen .leer { padding: 16px; color: var(--t3); font-size: 13px; }

@media (max-width: 900px) {
  /* Auf schmalem Schirm geht nebeneinander nicht mehr - dann lieber untereinander als winzig.
     Dann rollt auch wieder das Fenster: Zwei Hälften übereinander, die je für sich rollen,
     hiessen zwei Fensterchen von je einer Handbreit. */
  .nb-pruefen { height: auto; }
  .nb-pruefen-inhalt { overflow: auto; }
  .nb-erkennung { grid-template-columns: 1fr; }
  .nb-erkennung > div { min-height: 55vh; }
}

/* Der Stand der Verarbeitung selbst - zwei Angaben nebeneinander, ohne Kasten im Kasten. */
.nb-engine { display: flex; flex-wrap: wrap; gap: 6px 22px; align-items: center; }

.nb-anhangsstand {
  display: flex; align-items: center; flex-wrap: wrap; gap: 4px;
  margin-top: 4px; font-size: .75rem; opacity: .75;
}
.nb-anhangsstand .mud-icon-root { font-size: 15px; }
.nb-anhangsstand .scan, .nb-anhangsstand .huelle { cursor: help; }

.nb-pf-fund {
  display: flex; align-items: center; gap: 4px;
  margin-top: 2px; font-size: 11px; color: var(--t3);
}
.nb-pf-fund .mud-icon-root { font-size: 13px; }

.nb-pf-nichts { line-height: 1.55; }
.nb-pf-nichts p { margin: 10px 0 4px; }
.nb-pf-nichts ul { margin: 0; padding-left: 18px; }
.nb-pf-nichts li { margin-bottom: 6px; }

.nb-pf-liste { overflow-y: auto; flex: 1; min-height: 0; }
/* Die Inhaltsspalte teilt sich: Oben rollt der Verlauf, unten haengt der Antwortbereich fest.
   Mitzurollen hiess, beim Nachlesen genau das Feld zu verlieren, in dem man gerade schreibt. */
.nb-pf-inhalt { display: flex; flex-direction: column; min-height: 0; overflow: hidden; padding: 0; }
.nb-pf-lauf { flex: 1; min-height: 0; overflow-y: auto; padding: 16px; }
.nb-pf-liste .leer, .nb-pf-inhalt .leer { padding: 16px; color: var(--t3); font-size: 13px; }
/* Tagestrenner: Eine Liste ohne sie liest sich wie eine Tabelle - alle Zeilen gleich weit weg.
   Mitlaufend am oberen Rand, damit beim Scrollen nicht der Bezug verlorengeht - und deshalb mit
   DECKENDEM Hintergrund: Ein durchsichtiger stünde über den Zeilen, die darunter wegscrollen.
   (Genau das passierte mit einem Farbwert, den es nicht gibt - CSS fällt dann still auf
   durchsichtig zurück, und der Fehler sieht aus wie ein Fehler im Layout.) */
.nb-pf-tag {
  font-size: 11px; font-weight: 700; letter-spacing: 1.1px; color: var(--t3);
  text-transform: uppercase; padding: 10px 12px 6px; position: sticky; top: 0;
  background: var(--bg2); border-bottom: 1px solid var(--line); z-index: 2;
}
/* Zeile im Stil der schmalen Leiste (ADR-0089 Nachtrag 13): gerundet, durch Luft getrennt statt
   durch Linien - und innen nach dem Entwurf gebaut. Vier Zeilen in fester Ordnung: wer, worum es
   geht, wie es anfaengt, und woran man ist. Der Auszug ist der eigentliche Gewinn: Ein Betreff
   wie "Ihre Anfrage" sagt nichts, der erste Satz fast alles. */
.nb-pf-zeile {
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px; align-items: start;
  padding: 9px 10px; margin: 0 6px 3px; border-radius: 10px; cursor: pointer;
}
.nb-pf-zeile:hover { background: var(--surf2); }
.nb-pf-zeile.on { background: var(--pri-w); }
/* Das Symbolfeld haelt den linken Rand: Ohne es beginnt jede Zeile ein paar Pixel woanders,
   weil der Name mal kurz und mal lang ist. */
/* „horcht" in der Postfachliste - klein und ruhig: Es ist der Normalzustand, kein Alarm. Sein
   Fehlen ist die Auskunft, und die sucht man dann auch. */
.nb-horcht {
  display: inline-flex; align-items: center; gap: 3px; margin-left: 8px;
  font-size: 11px; color: var(--ok);
}

/* Das Kontextmenue der Liste. Fest positioniert und nicht im Fluss: Es steht, wo geklickt wurde,
   und die Liste darunter rollt nicht mit ihm weg. */
/* „horcht" in der Postfachliste - klein und ruhig: Es ist der Normalzustand, kein Alarm. Sein
   Fehlen ist die Auskunft, und die sucht man dann auch. */
.nb-horcht {
  display: inline-flex; align-items: center; gap: 3px; margin-left: 8px;
  font-size: 11px; color: var(--ok);
}

/* Wie ein Postfach bedient wird - klein unter dem Abrufzeitpunkt. „horcht" ist der Normalfall
   und deshalb ruhig; sein Fehlen ist die Auskunft, die man sucht. */
.nb-abrufart { display: flex; align-items: center; font-size: 11px; color: var(--t3); margin-top: 2px; }
.nb-abrufart .horcht { display: inline-flex; align-items: center; gap: 3px; color: var(--ok); }
.nb-abrufart .still { display: inline-flex; align-items: center; gap: 3px; color: var(--t3); }

/* Wie ein Postfach bedient wird - klein unter dem Abrufzeitpunkt. „horcht" ist der Normalfall
   und deshalb ruhig; sein Fehlen ist die Auskunft, die man sucht. */
.nb-abrufart { display: flex; align-items: center; font-size: 11px; color: var(--t3); margin-top: 2px; }
.nb-abrufart .horcht { display: inline-flex; align-items: center; gap: 3px; color: var(--ok); }
.nb-abrufart .still { display: inline-flex; align-items: center; gap: 3px; color: var(--t3); }

/* Die dritte Spalte: Aufgaben zur Unterhaltung (ADR-0135). Einklappbar, weil sie nicht immer
   gebraucht wird - und weil eine Spalte, die man nicht wegbekommt, auf schmalen Schirmen die
   Nachricht verdraengt, um die es eigentlich geht. Zugeklappt bleibt nur der Griff stehen: Er
   traegt die Zahl, und ohne ihn wuesste niemand, dass es die Spalte gibt. */
.nb-aufgabenspalte {
  display: flex; border-left: 1px solid var(--line); background: var(--bg2);
  min-width: 0; overflow: hidden;
}
.nb-aufgabenspalte .griff {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  padding: 8px 6px; background: none; border: 0; cursor: pointer; color: var(--t3);
}
.nb-aufgabenspalte .griff:hover { color: var(--t1); }
.nb-aufgabenspalte .griff .zahl {
  font-size: 10px; background: var(--pri-w); color: var(--pri-t);
  border-radius: 8px; padding: 0 5px;
}
.nb-aufgabenspalte .inhalt { width: 260px; padding: 8px 10px 12px 2px; overflow-y: auto; }
.nb-aufgabenspalte .kopf {
  display: flex; align-items: center; justify-content: space-between;
  font-size: 11px; text-transform: uppercase; letter-spacing: .4px; color: var(--t3);
  margin-bottom: 6px;
}
.nb-aufgabenspalte .leer { font-size: 12px; color: var(--t3); line-height: 1.5; }
.nb-aufgabe {
  border: 1px solid var(--line); border-radius: 9px; padding: 7px 9px; margin-bottom: 6px;
  background: var(--surf);
}
/* Ueberfaellig: ein Rand, keine Flaeche. Eine rote Kachel schreit; ein roter Rand sagt es. */
.nb-aufgabe.faellig { border-color: var(--bad); }
.nb-aufgabe.faellig .frist { color: var(--bad); font-weight: 600; }
.nb-aufgabe .zeile1 { display: flex; align-items: center; gap: 6px; font-size: 11px; }
.nb-aufgabe .nr { color: var(--t3); }
.nb-aufgabe .st { color: var(--t2); }
.nb-aufgabe .st.erledigt { color: var(--ok); }
.nb-aufgabe .st.verworfen { color: var(--t3); text-decoration: line-through; }
.nb-aufgabe .titel { font-size: 13px; color: var(--t1); margin: 2px 0 3px; line-height: 1.35; }
.nb-aufgabe .zeile2 {
  display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--t3);
}
.nb-aufgabe .grund { font-size: 11px; color: var(--t3); margin-top: 3px; font-style: italic; }
.nb-aufgabe .zeit { color: var(--t2); font-variant-numeric: tabular-nums; }
.nb-aufgabe .projekt {
  display: flex; align-items: center; gap: 4px; margin-top: 3px;
  font-size: 11px; color: var(--t3);
}
/* Die Knoepfe sitzen rechts in der Zeile - die Angaben links, die Handlung rechts. */
.nb-aufgabe .zeile2 .mud-icon-button { margin-left: auto; }

/* Die Klappgriffe in der Leiste: klein und stumm - sie sind Bedienung, keine Auskunft. */
.nb-rail .sect .klapp {
  background: none; border: 0; padding: 0 2px 0 0; cursor: pointer; color: var(--t3);
  display: inline-flex; align-items: center;
}
.nb-rail .sect .klapp:hover { color: var(--t1); }
.nb-rail .hinweis { font-size: 11px; color: var(--t3); padding: 2px 8px 6px; line-height: 1.4; }

/* Die eigene Marke in der Zeile: rund statt eckig, ohne Symbol. Eine Kategorie sagt, worum es
   geht; eine Marke, was ICH damit vorhabe - gleich auszusehen hiesse, beides zu verwechseln. */
.nb-pf-zeile .eigen {
  font-size: 10px; padding: 1px 7px; border-radius: 999px;
  border: 1px solid var(--f, var(--line2)); color: var(--f, var(--t2));
  white-space: nowrap;
}

/* Die Farbwahl der Marke: eine feste Auswahl, kein Farbwaehler - ein freier braechte Farben
   hervor, die auf dunklem Grund nicht mehr zu sehen sind. */
/* Eine Zeile je Marke im Verwaltungsfenster: Name links, Zahl daneben, Handlungen rechts. */
.nb-markenzeile {
  display: flex; align-items: center; gap: 8px; padding: 4px 0;
}
.nb-markenzeile .punkt { width: 12px; height: 12px; border-radius: 50%; flex: none; }
.nb-markenzeile .name { flex: 1; min-width: 0; }
/* Die Zahl ist die Folge, die beim Loeschen zaehlt - deshalb steht sie immer da, nicht erst in
   der Rueckfrage. */
.nb-markenzeile .anzahl { font-size: 11px; color: var(--t3); white-space: nowrap; }
.nb-markenzeile .farben { display: flex; gap: 4px; }


/* Der Bestand in der Kopfzeile der Liste: ruhig, weil er sich nicht bewegt - anders als die
   Zahl in der Leiste, die sagt, was auf einen wartet. */
.nb-pf-spalte .kopf .bestand {
  font-size: 11px; color: var(--t3); font-variant-numeric: tabular-nums;
}

/* Eine Seite, die in der Gruppenspalte des Rahmens steht und KEINE eigene braucht: Sie fuellt
   die Buehne und bringt ihre Hoehe selbst mit. Ohne das landete sie in einem zweiten Raster mit
   leerer erster Spalte - und die Liste stand in einer Rinne. */
.nb-flaeche {
  height: calc(100vh - 58px - var(--nb-leiste-h, 0px));
  padding-top: var(--nb-leiste-schweb, 0px);
  margin: -20px; overflow: hidden;
  /* Liste und Detailspalte nebeneinander - die Liste nimmt, was uebrig bleibt. */
  display: flex; min-width: 0;
}
.nb-flaeche > .nb-aufgabenflaeche { flex: 1; min-width: 0; }

/* Die gewählte Aufgabe im Aufgabenfenster, Abschnitte außer „Aufgabe“ (mj, 13.10.2026: ein Fenster statt Seitenfenster). */
.nb-aufgabendetail { padding: 2px 0; }
.nb-aufgabe-nachrichtinhalt { border-top: 1px solid var(--line); padding-top: 8px; font-size: 12px; }
.nb-aufgabe-nachrichtinhalt .kopf { color: var(--t3); margin-bottom: 4px; }
.nb-aufgabe-nachrichtinhalt .text { white-space: pre-wrap; color: var(--t1); }
.nb-aufgabendetail .kopf {
  display: flex; align-items: center; gap: 8px; margin-bottom: 10px;
}
.nb-aufgabendetail .kopf .nr { font-size: 11px; color: var(--t3); }
.nb-aufgabendetail .kopf .titel { font-size: 14px; color: var(--t1); }
.nb-aufgabendetail .feld {
  display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: 12px;
}
.nb-aufgabendetail .feld .k { width: 70px; flex: none; color: var(--t3); }
.nb-aufgabendetail .antwort { margin-top: 14px; border-top: 1px solid var(--line); padding-top: 10px; }

/* Das Projekt über einen Monat (Block 3, 11.10.2026): Kopf, Summen nebeneinander, Tabellen mit rechtsbündigen Zahlen. */
.nb-projekt-kopf { display: flex; gap: 8px; align-items: center; font-size: 12px; }
.nb-projekt-kopf .marke { padding: 1px 8px; border: 1px solid var(--line2); border-radius: 999px; color: var(--t2); }
.nb-projekt-kopf .leise { color: var(--t3); }
.nb-projekt-summen { display: flex; gap: 24px; }
.nb-projekt-summen > div { display: flex; flex-direction: column; }
.nb-projekt-summen .k { font-size: 11px; color: var(--t3); }
.nb-projekt-summen b { font-size: 18px; color: var(--t1); }
.nb-projektdetail td.zahl, .nb-projektdetail th.zahl { text-align: right; white-space: nowrap; }
.nb-projekt-aufgabe { cursor: pointer; }
.nb-projekt-aufgabe:hover { background: var(--surf2); }

/* Die Zeit an der Aufgabe (Block 2, 11.10.2026): Uhr, Summe, Buchungen. Eigene Zeilen lassen sich öffnen. */
.nb-aufgabenzeit-block { margin: 10px 0; border-top: 1px solid var(--line); padding-top: 10px; font-size: 12px; }
.nb-zeit-kopf { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.nb-zeit-kopf .k { width: 70px; flex: none; color: var(--t3); }
.nb-zeit-laeuft { color: var(--pri-t); }
.nb-zeit-summe { margin: 8px 0 4px; color: var(--t2); }
.nb-zeit-leer { margin-top: 6px; color: var(--t3); }
.nb-buchung {
  display: flex; align-items: baseline; gap: 8px; padding: 4px 6px; border-radius: 4px; color: var(--t2);
}
.nb-buchung.eigene { cursor: pointer; }
.nb-buchung.eigene:hover { background: var(--surf2); }
.nb-buchung .wann { flex: none; width: 108px; }
.nb-buchung .dauer { flex: none; width: 52px; text-align: right; color: var(--t1); }
.nb-buchung .wer { flex: none; color: var(--t3); }
.nb-buchung .text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-buchung .marke { flex: none; font-size: 11px; color: var(--t3); }
.nb-buchung .marke.nb-buchung-gekappt { color: var(--warn); }
.nb-aufgabenflaeche .filter .nb-filter-projekt,
.nb-aufgabenflaeche .filter .nb-filter-bearbeiter { max-width: 180px; }
.nb-aufgabendetail .antwort .k {
  font-size: 11px; color: var(--t3); margin-bottom: 6px; display: block;
}

/* Die Aufgabenflaeche (ADR-0135, Nachtrag). Eine Spalte der Flaeche, kein Kasten darin - wie die
   Kommunikation daneben. */
.nb-aufgabenflaeche { display: flex; flex-direction: column; height: 100%; overflow-y: auto; }
.nb-aufgabenflaeche > .kopf {
  display: flex; align-items: center; gap: 8px; padding: 10px 14px;
  border-bottom: 1px solid var(--line); position: sticky; top: 0; background: var(--bg); z-index: 2;
  font-size: 11px; text-transform: uppercase; letter-spacing: .4px; color: var(--t3);
}
.nb-aufgabenflaeche > .kopf .bestand { font-variant-numeric: tabular-nums; }
.nb-aufgabenflaeche > .kopf .suche { max-width: 220px; text-transform: none; }
.nb-aufgabenflaeche .leer { padding: 16px; color: var(--t3); font-size: 13px; }
/* Die Einengungen als Reihe statt als Spalte - fuenf Knoepfe sind keine Gliederung, und eine
   Spalte kostet Platz, den die Liste braucht. */
.nb-aufgabenflaeche .filter {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  padding: 8px 14px; border-bottom: 1px solid var(--line);
}
.nb-aufgabenflaeche .filter button {
  display: inline-flex; align-items: center; gap: 5px; padding: 4px 10px;
  background: none; border: 1px solid var(--line2); border-radius: 999px; cursor: pointer;
  color: var(--t2); font-size: 12px;
}
.nb-aufgabenflaeche .filter button:hover { background: var(--surf2); }
.nb-aufgabenflaeche .filter button.on {
  background: var(--pri-w); border-color: var(--pri); color: var(--pri-t);
}
.nb-aufgabenflaeche .filter button .n {
  font-size: 10px; opacity: .75; font-variant-numeric: tabular-nums;
}
.nb-aufgabenflaeche .filter .trenner {
  width: 1px; height: 18px; background: var(--line2); margin: 0 4px;
}

.nb-aufgabenzeile {
  padding: 9px 14px; border-bottom: 1px solid var(--line); cursor: pointer;
}
.nb-aufgabenzeile:hover { background: var(--surf2); }
/* Ueberfaellig: ein Streifen am Rand, keine rote Flaeche. Eine Flaeche schreit, und wer den
   ganzen Tag draufsieht, sieht sie irgendwann nicht mehr. */
.nb-aufgabenzeile.faellig { border-left: 3px solid var(--bad); padding-left: 11px; }
.nb-aufgabenzeile.faellig .frist { color: var(--bad); font-weight: 600; }
.nb-aufgabenzeile .zeile1 { display: flex; align-items: center; gap: 8px; }
.nb-aufgabenzeile .nr { font-size: 11px; color: var(--t3); font-variant-numeric: tabular-nums; }
.nb-aufgabenzeile .titel { font-size: 14px; color: var(--t1); }
.nb-aufgabenzeile .frist { font-size: 11px; color: var(--t2); white-space: nowrap; }
.nb-aufgabenzeile .zeile2 {
  display: flex; align-items: center; gap: 10px; margin-top: 3px;
  font-size: 11px; color: var(--t3);
}
.nb-aufgabenzeile .zeile2 .projekt,
.nb-aufgabenzeile .zeile2 .zeit { display: inline-flex; align-items: center; gap: 3px; }
.nb-aufgabenzeile .zeile2 .zeit { font-variant-numeric: tabular-nums; }
.nb-aufgabenzeile .zeile2 .mud-icon-button { margin-left: auto; }
/* Sichtbar nur als Vertretung (kalender-010) - die Marke sagt, für wen. */
.nb-aufgabenzeile .zeile2 .nb-vertretungsmarke { color: var(--pri-t); font-style: italic; }

.nb-vorhang { position: fixed; inset: 0; z-index: 1400; }
.nb-kontextmenue {
  position: fixed; z-index: 1401; padding: 4px;
  background: var(--surf); border: 1px solid var(--line2); border-radius: 10px;
  box-shadow: 0 10px 30px color-mix(in srgb, var(--schatten-farbe) 65%, transparent);
  /* Bleibt im Bild, auch wenn unten oder rechts geklickt wurde. */
  max-height: 80vh; overflow: auto;
  transform: translate(0, 0);
  /* Das Menue waechst mit seinem laengsten Eintrag, statt ihn umbrechen zu lassen: „Noch zu
     Lesen" stand ueber zwei Zeilen, und zwei Zeilen lesen sich wie zwei Eintraege (Abnahme mj,
     21.09.2026). Die Obergrenze verhindert, dass ein langer Markenname das halbe Fenster
     einnimmt - dann wird er abgeschnitten und der Titel nennt ihn ganz. */
  min-width: 210px; width: max-content; max-width: 22rem;
}
/* „flex-start" ausdruecklich: Ohne das zentriert eine geerbte Knopfregel den Inhalt, und dann
   stehen genau die Eintraege mittig, die KEINEN Pfeil tragen - der Pfeil schiebt die anderen mit
   „margin-left:auto" nach links. Das Menue sah dadurch aus wie zwei verschiedene Listen. */
.nb-kontextmenue button {
  display: flex; align-items: center; justify-content: flex-start; gap: 8px;
  width: 100%; padding: 7px 10px;
  background: none; border: 0; border-radius: 7px; cursor: pointer;
  color: var(--t2); font-size: 13px; text-align: left;
}
/* Die Beschriftung nimmt den Platz - sonst haengt sie am Symbol und der Pfeil bestimmt, wo sie
   steht. */
.nb-kontextmenue button > span {
  flex: 1; text-align: left;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nb-kontextmenue button:hover:not(:disabled) { background: var(--surf2); }
.nb-kontextmenue button:disabled { opacity: .45; cursor: default; }
.nb-kontextmenue button .pfeil { margin-left: auto; opacity: .6; }
/* „Zurueck" unten und abgesetzt: Es fuehrt aus dem Zweig heraus und ist keine Handlung an der
   Nachricht - stuende es zwischen ihnen, klickte man es versehentlich statt der ersten. */
.nb-kontextmenue button.zurueck {
  margin-top: 4px; border-top: 1px solid var(--line); border-radius: 0 0 7px 7px; color: var(--t3);
}

/* Die Kopfzeilen im Original: Feste Schrift, weil dort Ausrichtung Bedeutung traegt - ein
   Empfangsvermerk ist nach Spalten gebaut. Umbruch erlaubt, sonst schiebt eine einzige lange
   DKIM-Signatur die ganze Spalte auf. */
.nb-kopfzeilen {
  font-family: var(--nb-schriftart-code); font-size: 11px;
  line-height: 1.45; white-space: pre-wrap; word-break: break-all;
  background: var(--surf2); border: 1px solid var(--line); border-radius: 8px;
  padding: 8px 10px; margin: 6px 0 0; max-height: 40vh; overflow: auto; color: var(--t2);
}
.nb-mini { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--pri-t); }

/* Der Druckbogen steht am Bildschirm nicht im Weg. */
#nb-druck { display: none; }

/* Drucken: Nicht der Bildschirm, sondern ein Schriftstueck.
   Der Bogen haengt fuer die Dauer des Druckens als KOPIE unmittelbar am Dokument (drucken.js).
   Alles andere unmittelbar unter <body> faellt weg - nicht ueber eine Liste von Klassen, denn
   die muesste jede Flaeche kennen, die es gibt, und die naechste neue druckte wieder mit.

   Und zwar mit „display", nicht mit „visibility": Unsichtbar heisst NICHT platzlos. Die
   ausgeblendete Flaeche belegte weiter ihre Hoehe, der Bogen begann darunter - und der Ausdruck
   war eine leere Seite mit dem Text irgendwo dahinter. */
@media print {
  body > *:not(#nb-druckbogen) { display: none !important; }

  /* Die Flaeche setzt feste Hoehen und sperrt das Rollen - auf Papier gibt es beides nicht. */
  html, body {
    height: auto !important; overflow: visible !important;
    background: var(--papier) !important; margin: 0 !important;
  }

  #nb-druckbogen {
    display: block !important; position: static; width: 100%;
    background: var(--papier); color: var(--papier-text); font-size: 11pt; line-height: 1.5;
  }
  #nb-druckbogen h1 { font-size: 15pt; margin: 0 0 12pt; }
  /* Je Nachricht ein Block - und der Umbruch DAVOR, damit ein Faden nicht als Fliessband
     herauskommt. Der erste bekommt keinen, sonst begaenne der Ausdruck mit einer leeren Seite. */
  #nb-druckbogen section { break-before: page; page-break-before: always; padding-top: 6pt; }
  #nb-druckbogen section:first-of-type { break-before: auto; page-break-before: auto; }
  #nb-druckbogen .kopf {
    border-bottom: 1px solid var(--papier-linie); padding-bottom: 6pt; margin-bottom: 8pt; font-size: 10pt;
  }
  #nb-druckbogen .koerper pre { white-space: pre-wrap; font-family: inherit; }
  #nb-druckbogen img { max-width: 100% !important; }
  /* Verweise mit ihrer Adresse: Auf Papier ist ein blaues Wort nichts wert. */
  #nb-druckbogen a::after { content: " (" attr(href) ")"; font-size: 9pt; color: var(--papier-leise); }
  /* Der Wochenplan (kalender-024): je Tag ein Block, der nicht über die Seite bricht; die Art als
     Form, damit es in Graustufen lesbar bleibt. */
  #nb-druckbogen .legende { font-size: 9pt; margin-bottom: 8pt; display: flex; gap: 12pt; }
  #nb-druckbogen .tag { break-inside: avoid; border-top: 1px solid var(--papier-linie); padding: 4pt 0; }
  #nb-druckbogen .tag .datum { font-weight: 700; }
  #nb-druckbogen .eintrag { display: flex; gap: 6pt; font-size: 10pt; }
  #nb-druckbogen .eintrag .zeit { min-width: 70pt; }
  #nb-druckbogen .eintrag .ort { color: var(--papier-leise); }
  #nb-druckbogen .leer { color: var(--papier-leise); }
  /* Der Bogen ist die Seite - was im Browserfenster rollt, hat hier keine Bedeutung. */
  @page { margin: 18mm 15mm; }
}

/* Die Trennlinie im Verlauf: „ab hier ist es neu". Eine Linie mit Wort statt einer Faerbung der
   Blasen - Farbe traegt im Verlauf schon eine Bedeutung (wer hat gesprochen), und zwei
   Bedeutungen auf einem Mittel liest niemand auseinander. */
.nb-chat-neu {
  display: flex; align-items: center; gap: 8px; margin: 10px 0 4px; color: var(--pri-t);
  font-size: 11px; text-transform: uppercase; letter-spacing: .08em;
}
.nb-chat-neu::before, .nb-chat-neu::after {
  content: ""; flex: 1; height: 1px; background: var(--pri-t); opacity: .45;
}
/* Die Marke am Listenende - sie traegt nur Hoehe, damit der Beobachter etwas zu sehen bekommt. */
.nb-pf-mehr {
  min-height: 28px; display: grid; place-items: center;
  font-size: 11px; color: var(--t3);
}
.nb-pf-zeile .sym {
  width: 30px; display: flex; flex-direction: column; align-items: center; gap: 2px;
  color: var(--t3);
}
.nb-pf-zeile .sym .feld {
  width: 30px; height: 30px; border-radius: 8px; background: var(--surf2);
  display: grid; place-items: center;
}
/* Die Bueroklammer unter dem Brief: kleiner und blasser, weil sie eine Beigabe meldet und nicht
   die Zeile anfuehrt. Die Zahl steht nur ab zwei daneben - bei einem Anhang ist sie eine
   ueberfluessige „1". */
.nb-pf-zeile .sym .klammer {
  display: flex; align-items: center; gap: 1px; font-size: 10px; line-height: 1; opacity: .8;
}
.nb-pf-zeile .sym .klammer .mud-icon-root { font-size: 14px; }
.nb-pf-zeile.on .sym { color: var(--pri-t); }
.nb-pf-zeile .kopf { display: flex; align-items: center; gap: 6px; min-width: 0; }
.nb-pf-zeile .kopf .wer {
  font-size: 13px; font-weight: 600; color: var(--t2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-pf-zeile .kopf .zeichen { margin-left: auto; display: flex; align-items: center; gap: 4px; color: var(--t3); }
.nb-pf-zeile .kopf .zeichen .mud-icon-root { font-size: 15px; }
.nb-pf-zeile .kopf .zeit { font-size: 11px; color: var(--t3); white-space: nowrap; }
.nb-pf-zeile .betreff {
  font-size: 15px; color: var(--t2); margin-top: 1px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Ungelesen steht in der Schrift, nicht in einem Abzeichen vor dem Betreff: Das Abzeichen schob
   den Text jeder zweiten Zeile nach rechts - damit war der linke Rand keiner mehr. */
.nb-pf-zeile.neu .kopf .wer, .nb-pf-zeile.neu .betreff { color: var(--t1); font-weight: 700; }
.nb-pf-zeile .auszug {
  font-size: 14px; color: var(--t3); margin-top: 2px; min-height: 1.35em; line-height: 1.4;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-pf-zeile .marken { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-top: 6px; }
.nb-pf-zeile .mk, .nb-pf-zeile .kat {
  display: inline-flex; align-items: center; gap: 4px; padding: 1px 8px; border-radius: 99px;
  font-size: 11px; white-space: nowrap; line-height: 17px;
}
.nb-pf-zeile .mk { background: var(--surf3); color: var(--t2); }
.nb-pf-zeile .mk .mud-icon-root { font-size: 13px; }
/* Wer die Sache hat, ist die eine Auskunft, die Doppelarbeit verhindert - sie darf auffallen. */
.nb-pf-zeile .mk.mir { background: var(--pri); color: var(--auf-pri); font-weight: 600; }
.nb-pf-zeile .mk.erledigt { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }

/* Der Stand der Aufgabe in der Zeile.

   Farbig, weil man ihn im Vorbeisehen erfassen soll: „wartet" und „in Arbeit" unterscheiden
   sich im Wort um zwei Buchstaben, in der Farbe sofort. „Neu" bleibt absichtlich unauffaellig -
   es ist der Normalfall und soll nicht wie eine Warnung aussehen. */
.nb-pf-zeile .mk.st { font-weight: 600; }
.nb-pf-zeile .mk.st.inarbeit { background: color-mix(in srgb, var(--pri) 18%, transparent); color: var(--pri); }
.nb-pf-zeile .mk.st.wartet { background: color-mix(in srgb, var(--warn) 20%, transparent); color: var(--warn); }
.nb-pf-zeile .mk.st.erledigt { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }
.nb-pf-zeile .mk.st.verworfen { opacity: .6; text-decoration: line-through; }

/* Der Stand im geoeffneten Faden ist anklickbar - das muss man ihm ansehen. */
.nb-aufgabe .st.waehlbar {
  display: inline-flex; align-items: center; gap: 2px; cursor: pointer;
  border: 1px solid transparent;
}
.nb-aufgabe .st.waehlbar:hover { border-color: var(--line); }
.nb-pf-zeile .mk.neu { background: var(--pri); color: var(--auf-pri); font-weight: 600; }
/* Die Kategorie in ihrer eigenen Farbe, aber gedaempft hinterlegt: Eine volle Flaeche in
   Signalfarbe zoege das Auge von der Nachricht auf die Etikette. */
.nb-pf-zeile .kat { color: var(--f, var(--t2)); background: color-mix(in srgb, var(--f, var(--t3)) 18%, transparent); }
.nb-pf-mailkopf { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--t2); }
.nb-pf-versand { font-size: 11px; color: var(--t3); margin-top: 2px; }
/* Rückmeldungen am Block im Raster (kalender-013): klein, rechts neben dem Titel. */
.nb-kal-block .nb-rueckmeldung { float: right; margin-left: 4px; font-size: 11px; color: var(--t2); }
.nb-kal-block .nb-rueckmeldung.abgesagt { color: var(--bad); font-weight: 600; }
/* Antworten von außen im Terminfenster (kalender-013). */
.nb-externstand { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--t2); margin-top: 2px; }
/* Schalter „Auch am Desktop melden“ in der Glocke. */
.nb-glocke .nb-systemmeldung { padding: 2px 12px 6px; border-bottom: 1px solid var(--line); }
.nb-glocke .nb-systemmeldung .hinweis { display: block; font-size: 11px; color: var(--bad); }
/* Chats in der Glocke (kommunikation-014): je Unterhaltung Kopf, letzter Beitrag, Kurzantwort. */
.nb-glocke-chats { border-bottom: 1px solid var(--line); }
.nb-glocke-chat { padding: 9px 15px; border-left: 3px solid var(--pri); padding-left: 12px; border-bottom: 1px solid var(--line); }
.nb-glocke-chat:last-child { border-bottom: none; }
.nb-glocke-chat .kopf { display: flex; gap: 10px; align-items: baseline; cursor: pointer; }
.nb-glocke-chat .kopf b { flex: 1; min-width: 0; font-size: 12.5px; font-weight: 600; }
.nb-glocke-chat .letzt { font-size: 11.5px; color: var(--t2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 2px; }
.nb-glocke-chat .antwort { display: flex; gap: 6px; align-items: center; margin-top: 6px; }
.nb-glocke-chat .antwort .feld { flex: 1; margin: 0; }
/* Einladung an der Nachricht (kalender-012): eine Karte wie eine Beilage, nicht wie Text. */
.nb-einladungskarte {
  display: flex; gap: 10px; align-items: flex-start; margin: 8px 0; padding: 8px 10px;
  border: 1px solid var(--line); border-left: 3px solid var(--pri); border-radius: 6px; background: var(--surf2);
}
.nb-einladungskarte.abgesagt, .nb-einladungskarte.veraltet { border-left-color: var(--line2); opacity: .8; }
.nb-einladungskarte .inhalt { flex: 1 1 auto; min-width: 0; font-size: 12.5px; color: var(--t2); }
.nb-einladungskarte .titel { font-size: 14px; color: var(--t1); font-weight: 600; }
.nb-einladungskarte .stand { margin-top: 4px; color: var(--t3); }
.nb-einladungskarte .hinweis { color: var(--bad); }
.nb-einladungskarte .knoepfe { display: flex; flex-direction: column; gap: 6px; align-items: flex-end; }
/* ===== Verlauf als Unterhaltung =====
   Eingegangenes links, Eigenes rechts, Internes in der Mitte. Die Stelle beantwortet „wer hat das
   gesagt", bevor man den Namen liest - eine Reihe gleich aussehender Kaesten tut das nicht. */
/* ── Kopf und Reiter einer Unterhaltung (Mockup, Stufe 2) ───────────────────────────────────
   Der Kopf beantwortet, was man VOR dem Lesen wissen will: worum, mit wem, seit wann, bei wem.
   Aus einzelnen Blasen zusammengereimt hat das bisher jeder selbst gemacht. */
/* Kopf und Reiter stehen fest, nur der Verlauf rollt: Wer beim Lesen nach unten kommt, verliert
   sonst die Auskunft, worum es ueberhaupt geht. */
.nb-vorgangskopf {
  flex: 0 0 auto; padding: 12px 16px 8px; border-bottom: 1px solid var(--line);
}
/* Marken neben dem Betreff statt darunter - das spart eine ganze Zeile, und gewonnene Hoehe ist
   hier Nachricht. Der Betreff darf schrumpfen, die Marken nicht. */
.nb-vorgangskopf .betreffzeile {
  display: flex; align-items: flex-start; gap: 12px;
}
.nb-vorgangskopf .betreffzeile .betreff { flex: 1; min-width: 0; }
.nb-vorgangskopf .betreffzeile .marken {
  flex: 0 1 auto; justify-content: flex-end; margin-top: 0; max-width: 55%;
}
.nb-vorgangskopf .betreff {
  font-size: 16px; font-weight: 600; color: var(--t1); line-height: 1.3;
  word-break: break-word;
}
.nb-vorgangskopf .zeile {
  margin-top: 3px; font-size: 12px; color: var(--t3);
  display: flex; flex-wrap: wrap; gap: 5px; align-items: center;
}
.nb-vorgangskopf .zeile .trenn { color: var(--line2); }
.nb-vorgangskopf .marken {
  margin-top: 7px; display: flex; flex-wrap: wrap; gap: 4px; align-items: center;
}
/* Die Signatur im Schreibbereich: zu, weil man weiss, was unten steht. Der Name bleibt
   sichtbar - dass die falsche gewaehlt ist, muss man merken, ohne aufzuklappen. */
.nb-signaturblock > .kopf {
  appearance: none; background: none; border: none; width: 100%; cursor: pointer;
  display: flex; align-items: center; gap: 6px; padding: 4px 2px; font: inherit;
  font-size: 11px; color: var(--t3); text-align: left;
}
.nb-signaturblock > .kopf:hover { color: var(--t1); }
.nb-signaturblock .kopf .welche { color: var(--t2); font-weight: 600; }
.nb-signaturblock .kopf .pfeil { margin-left: auto; }
/* Der Waehler sitzt neben dem Kopf, nicht darin: Er ist eine eigene Handlung und darf das
   Auf- und Zuklappen nicht ausloesen. */
.nb-signaturblock .waehler { position: absolute; right: 22px; margin-top: -26px; }
.nb-signaturblock { position: relative; }

/* Eine Entwurfszeile: kein Absender, kein Verlauf, keine Gegenseite - deshalb eine eigene
   Zeile und keine geliehene. Schraeg, damit man sie im Vorbeigehen von einer Nachricht
   unterscheidet: Was hier steht, ist noch nicht hinausgegangen. */
.nb-entwurfszeile .wer { font-style: italic; opacity: .85; }
.nb-entwurfszeile .betreff { font-weight: 600; }
.nb-entwurfszeile .auszug {
  font-size: 12px; color: var(--t3); overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap;
}

/* Der Fuss einer Einstellungsspalte - „Speichern" sitzt am Ende der Felder, nicht im
   Fensterfuss: Dort gehoerte er zum Fenster, nicht zu dem, was man gerade bearbeitet. */
.nb-felder-fuss { display: flex; justify-content: flex-end; padding-top: 6px; }

/* Wenn links nichts ist - ein Satz statt eines leeren Rahmens. */

/* Die Rueckfrage nimmt die Stelle der Einstellungen ein, damit die Zahl nicht untergeht. */
.nb-kat-loeschfrage {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 10px; text-align: center; height: 100%; padding: 20px;
}

/* Die Unterhaltungen an einer Aufgabe (Block A): Betreff als Sprung, dahinter leise wer und wann. */
.nb-aufgabe-nachricht .wer { color: var(--t3); font-size: var(--nb-schrift-beiwerk); }
.nb-aufgabe-nachricht + .nb-aufgabe-nachricht { margin-top: 2px; }
/* „An Aufgabe hängen“ (Block A): die Aufgaben zur Wahl - eine Zeile je Aufgabe, die gewählte wie eine gewählte Verwaltungszeile. */
.nb-anhaengen-aufgabe { display: block; width: 100%; text-align: left; padding: 6px 8px; border: none; border-radius: 6px;
    background: transparent; color: var(--t1); cursor: pointer; }
.nb-anhaengen-aufgabe:hover { background: var(--surf2); }
.nb-anhaengen-aufgabe.gewaehlt { background: var(--surf2); font-weight: 600; }

/* Die Rueckfrage vor dem Loeschen einer Kategorie - im Fuss des Fensters, mit den Zahlen.
   Ein zweites Fenster darueber waere ein Dialog im Dialog, und die Zahl ginge unter. */
.nb-kat-loeschen {
  display: flex; align-items: flex-start; gap: 8px; flex: 1; min-width: 0;
  font-size: 12px; line-height: 1.45; color: var(--t2); padding-right: 12px;
}
.nb-kat-loeschen .mud-icon-root { color: var(--bad); flex: 0 0 auto; margin-top: 1px; }

/* Der Stift an einer Kategoriezeile: sichtbar beim Darueberfahren, sonst aus dem Weg. Zwoelf
   Zeilen mit staendig sichtbarem Symbol waeren zwoelf Symbole, die niemand braucht. */
.nb-rail a .stift {
  appearance: none; background: none; border: none; cursor: pointer; color: var(--t3);
  padding: 1px; line-height: 0; border-radius: 4px; margin-left: auto; opacity: 0;
}
.nb-rail a:hover .stift { opacity: 1; }
.nb-rail a .stift:hover { color: var(--t1); background: var(--surf2); }
/* Mit der Tastatur erreichbar bleiben - sonst waere er fuer manche gar nicht da. */
.nb-rail a .stift:focus-visible { opacity: 1; outline: 2px solid var(--pri-t); }

/* Der Weg zurueck an der Ueberschrift: Er hebt JEDE Einengung auf, nicht nur die der Leiste. */
.nb-pf-spalte .kopf .weg {
  appearance: none; background: none; border: none; cursor: pointer; color: var(--t3);
  padding: 2px; line-height: 0; border-radius: 6px;
}
.nb-pf-spalte .kopf .weg:hover { color: var(--t1); background: var(--surf2); }

/* Suchfeld und Zahnrad in EINER Zeile: Die beiden Schalter lagen darunter und kosteten zwei
   Zeilen Liste - bei einer Liste, die die ganze Spalte traegt, ist das der teuerste Platz der
   Seite (Abnahme mj, 22.09.2026). Das Feld nimmt den Rest, das Zahnrad bleibt schmal. */
.nb-pf-suche .feld { display: flex; align-items: center; gap: 2px; }
.nb-pf-suche .feld .mud-input-control { flex: 1 1 auto; min-width: 0; }
.nb-pf-suche .feld .mud-menu { flex: 0 0 auto; }

/* Die zwei Schalter unter „Meine Arbeit" - nur dort sichtbar, deshalb eingerückt und klein.
   Sie sind eine Verfeinerung der Sicht, kein eigener Eintrag der Leiste. */
.nb-arbeitfilter {
  display: flex; align-items: center; gap: 2px; padding: 2px 0 6px 30px; font-size: 11px;
}
.nb-arbeitfilter button {
  appearance: none; background: none; border: 1px solid transparent; cursor: pointer;
  color: var(--t3); padding: 1px 7px; border-radius: 999px; font: inherit;
}
.nb-arbeitfilter button:hover { color: var(--t1); }
.nb-arbeitfilter button.on { color: var(--t1); border-color: var(--line2); background: var(--surf2); }
.nb-arbeitfilter .trenn { width: 1px; height: 11px; background: var(--line); margin: 0 5px; }

/* Wer schon hingesehen hat - der Punkt beantwortet „antwortet da gerade jemand anderer?" */
.nb-gelesen {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--surf3); color: var(--t2);
  font-size: 10px; font-weight: 600; letter-spacing: .3px;
}
.nb-pf-reiter {
  display: flex; gap: 2px; border-bottom: 1px solid var(--line);
  flex: 0 0 auto; padding: 0 16px;
}
.nb-pf-reiter button {
  appearance: none; background: none; border: none; cursor: pointer;
  padding: 7px 12px; font-size: 12.5px; color: var(--t3);
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.nb-pf-reiter button:hover { color: var(--t1); }
.nb-pf-reiter button.an { color: var(--pri-t); border-bottom-color: var(--pri); font-weight: 600; }
.nb-pf-reiter .luecke { flex: 1; }

/* Eine Verwaltungsseite. Der Kopf braucht keine eigene Klasse mehr: Er ist dasselbe MudStack wie
   auf den uebrigen Seiten (docs/oberflaeche.md, Punkt 1). */
.nb-page { display: block; width: 100%; }

/* Eine Kopfzeile IN einem Reiter - sie muss die volle Breite nehmen, sonst schiebt der
   Zwischenraum nichts an den rechten Rand, und „Filter" steht mitten im Nichts. */
.nb-reiterkopf { width: 100%; }

/* Reiter einer SEITE - groesser als die schmale Leiste in der Nachrichtenflaeche. Dort sitzen
   sie ueber einer Liste und sollen wenig Platz nehmen; hier gliedern sie die ganze Seite und
   muessen auf den ersten Blick als Reiter zu erkennen sein (mj, 18.09.2026) - dieselbe Anmutung
   wie unter System → Dateien. */
.nb-seitenreiter { gap: 4px; padding: 0; }

.nb-seitenreiter button {
  padding: 12px 18px;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  border-bottom-width: 2px;
}

.nb-seitenreiter button:hover { background: var(--nb-hover); }

.nb-seitenreiter button.an { font-weight: 600; }
/* Das Zeichen einer Kategorie im Menue - so breit wie ein Symbol, damit die Namen fluchten. */
.nb-akt-zeichen { display: inline-block; width: 20px; text-align: center; margin-right: 6px; }

/* Auch im Menueband bleibt ein Eintrag EINZEILIG.

   „Noch zu Lesen" brach dort ueber zwei Zeilen - und zwei Zeilen lesen sich wie zwei Eintraege
   (Abnahme mj, 21.09.2026). Das Menue waechst stattdessen mit seinem laengsten Namen; wird es
   zu breit, schneidet es ab und der Titel nennt den Namen ganz. */
.nb-aktionsleiste + .mud-popover .mud-list-item,
.mud-popover .mud-list-item.nb-akt-eintrag {
  white-space: nowrap;
}
.mud-popover .mud-list-item-text,
.mud-popover .mud-typography {
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Die Sortierung ist kein Reiter - sie darf auch nicht wie einer aussehen. */
.nb-pf-reiter button.sortierung {
  border-bottom: none; font-size: 11.5px; display: inline-flex; align-items: center; gap: 4px;
}
.nb-pf-reiter button.sortierung .mud-icon-root { font-size: 15px; }
/* Eine Zahl am Reiter: Wie viele Sendungen gescheitert sind, muss man sehen, ohne hinzugehen -
   sonst schaut niemand nach, und genau so bleibt ein kaputter Versand wochenlang unbemerkt. */
.nb-pf-zahl {
  display: inline-block; margin-left: 6px; padding: 0 6px; border-radius: 9px;
  background: var(--bad); color: var(--auf-pri); font-size: 11px; font-weight: 600;
}
/* Der Grund ist oft lang - in der Zeile gekuerzt, vollstaendig im Tooltip. */
.nb-ausgang-grund {
  display: inline-block; max-width: 320px; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; vertical-align: bottom; color: var(--bad); font-size: 12px;
}

/* Die Spur: was geschehen ist, aelteste oben. Bewusst schmucklos - sie wird gelesen, wenn etwas
   geklaert werden muss, nicht im Vorbeigehen. */
.nb-spur { list-style: none; margin: 0; padding: 0; }
.nb-spur li {
  display: flex; gap: 10px; align-items: baseline; padding: 6px 0 6px 12px;
  border-left: 2px solid var(--line); font-size: 12.5px; color: var(--t2);
}
.nb-spur li .zeit { flex: 0 0 auto; color: var(--t3); font-size: 11.5px; font-variant-numeric: tabular-nums; }
.nb-spur li .was { flex: 1; min-width: 0; }
.nb-spur li .wer { flex: 0 0 auto; color: var(--t3); font-size: 11.5px; }
/* Was schiefging, faellt auf - der Rest nicht. */
.nb-spur li.versandfehler { border-left-color: var(--bad); color: var(--bad); }
.nb-spur li.uebernommen, .nb-spur li.zugewiesen { border-left-color: var(--pri); }

/* Details: Merkzeilen wie im Entwurf - Bezeichnung links, Wert rechts. */
.nb-merkblock {
  border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; margin-bottom: 10px;
  background: var(--surf);
}
.nb-merkblock .kopf {
  font-size: 12px; font-weight: 600; color: var(--t1); margin-bottom: 6px;
  padding-bottom: 6px; border-bottom: 1px solid var(--line);
}
.nb-merkblock .zeile {
  display: flex; gap: 10px; align-items: baseline; padding: 3px 0; font-size: 12.5px;
}
.nb-merkblock .zeile .k { flex: 0 0 130px; color: var(--t3); }
.nb-merkblock .zeile b { flex: 1; min-width: 0; color: var(--t1); font-weight: 500; word-break: break-word; }
.nb-merkblock .zeile b.mono { font-family: var(--nb-schriftart-code); font-size: 11.5px; }

/* ── Antwortbereich (Mockup, Stufe 3) ───────────────────────────────────────────────────────
   Er steht UNTER dem Verlauf, nicht an seiner Stelle: Beim Antworten sieht man nach, was der
   andere geschrieben hat. */
.nb-antwort {
  margin-top: 12px; border: 1px solid var(--line); border-radius: 10px;
  background: var(--surf); overflow: hidden;
}
/* Angedockt geht er von Kante zu Kante - ohne Rand, ohne Ecken, ohne Abstand: Er ist kein Kasten
   IN der Spalte, sondern deren unterer Teil. */
.nb-antwort.angedockt {
  position: relative; margin: 0; border-radius: 0; border: none;
  border-top: 1px solid var(--line);
  flex: 0 0 var(--nb-antwort-h, 260px); min-height: 0;
  display: flex; flex-direction: column;
}
.nb-antwort.angedockt .nb-antwort-feld,
.nb-antwort.angedockt .nb-antwort-vorschau { flex: 1; min-height: 0; overflow-y: auto; resize: none; }
.nb-kanalreiter { display: flex; gap: 2px; border-bottom: 1px solid var(--line); padding: 0; }
.nb-kanalreiter button {
  appearance: none; background: none; border: none; cursor: pointer;
  padding: 8px 12px; font-size: 12.5px; color: var(--t3);
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.nb-kanalreiter button.an { color: var(--pri-t); border-bottom-color: var(--pri); font-weight: 600; }
/* Die Notiz sieht anders aus als alles, was nach draussen geht - der Unterschied ist zu gross,
   um ihn nur im Text zu behaupten. */
.nb-kanalreiter button.intern.an { color: var(--warn); border-bottom-color: var(--warn); }

.nb-antwort-kopf {
  display: flex; align-items: center; gap: 10px;
  padding: 4px 12px; border-bottom: 1px solid var(--line); font-size: 12.5px;
}
.nb-antwort-kopf .k { flex: 0 0 64px; color: var(--t3); }
/* „+ Cc" und „+ Bcc" stehen neben dem Betreff, nicht als eigene Zeile: Zwei leere Felder bei
   jeder Antwort kosten Platz und fragen nach einer Entscheidung, die fast nie ansteht. */
.nb-mehrfeld {
  appearance: none; background: none; border: none; cursor: pointer;
  color: var(--t3); font-size: 12px; padding: 2px 6px; border-radius: 5px; flex: 0 0 auto;
}
.nb-mehrfeld:hover { background: var(--surf3); color: var(--t1); }

/* Empfaenger als Marken statt als Zeichenkette mit Kommas: Wer fuenf eingetragen hat, sieht
   fuenf Dinge - und nimmt jedes einzeln wieder weg. In einer Zeichenkette sucht man das Komma,
   hinter dem die falsche Adresse steht. */
.nb-empfaenger {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 4px 12px; border-bottom: 1px solid var(--line); font-size: 12.5px;
}
.nb-empfaenger .k { flex: 0 0 64px; color: var(--t3); padding-top: 7px; }
.nb-empfaenger .marken {
  flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
}
.nb-adresse {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--surf3); border-radius: 12px; padding: 2px 4px 2px 9px;
  font-size: 12px; color: var(--t1); max-width: 100%;
}
.nb-adresse button {
  appearance: none; background: none; border: none; cursor: pointer;
  color: var(--t3); font-size: 12px; line-height: 1; padding: 2px 4px; border-radius: 50%;
}
.nb-adresse button:hover { background: var(--bad); color: var(--auf-pri); }
.nb-adresseingabe { flex: 1; min-width: 160px; }
.nb-antwort-kopf .mud-input { flex: 1; }
.nb-antwort-kopf.intern { background: color-mix(in srgb, var(--warn) 10%, transparent); padding: 8px 12px; }
.nb-antwort-kopf .warnung { margin-left: auto; color: var(--warn); font-weight: 600; }

.nb-tbar {
  display: flex; align-items: center; gap: 1px; flex-wrap: wrap;
  padding: 4px 8px; border-bottom: 1px solid var(--line); background: var(--bg2);
}
.nb-tbar button {
  appearance: none; background: none; border: none; cursor: pointer; border-radius: 5px;
  padding: 4px 7px; color: var(--t2); font-size: 12px; line-height: 1;
  display: inline-flex; align-items: center;
}
.nb-tbar button:hover:not(:disabled) { background: var(--surf3); color: var(--t1); }
.nb-tbar button.an { background: var(--surf3); color: var(--pri-t); }
/* Ausgegraut statt versteckt: Ein Knopf, der fehlt, wirft die Frage auf, ob man ihn uebersehen
   hat - einer, der aus ist, sagt mit seinem Tooltip auch warum. */
.nb-tbar button.aus { opacity: .35; cursor: not-allowed; }
.nb-tbar .luecke { flex: 1; }
/* Der KI-Knopf zeigt seinen Stand: Er dreht sich, solange gerechnet wird, und traegt einen Punkt,
   wenn ein Vorschlag wartet. */
.nb-tbar button.nb-ki-text { position: relative; }
.nb-tbar button.nb-ki-text .dreht { width: 16px !important; height: 16px !important; }
.nb-tbar button.nb-ki-text .punkt {
  position: absolute; top: 2px; right: 2px; width: 7px; height: 7px; border-radius: 50%;
  background: var(--pri);
}

/* Das Fenster zum Textvorschlag. */
.nb-textvorschlag { display: flex; flex-direction: column; gap: 16px; }
.nb-textvorschlag .zugang.lokal {
  display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--t2);
}
.nb-textvorschlag .lauf { display: flex; align-items: center; gap: 12px; }
.nb-textvorschlag .lauf .klein { font-size: 12px; color: var(--t2); margin-top: 2px; }
.nb-textvorschlag .vorschlag {
  border: 1px solid var(--line2); border-radius: 10px; background: var(--surf2); overflow: hidden;
}
/* pre-wrap: Der Vorschlag hat Absaetze - als ein Block gelesen waere er nicht zu beurteilen. */
.nb-textvorschlag .vorschlag .text {
  white-space: pre-wrap; padding: 12px 14px; max-height: 45vh; overflow: auto;
  font-size: 15px; line-height: 1.55; color: var(--t1);
}
.nb-textvorschlag .vorschlag .herkunft {
  display: flex; align-items: center; gap: 6px; padding: 6px 14px;
  border-top: 1px solid var(--line); font-size: 12px; color: var(--t2);
}
.nb-visitenkarte-wahl { display: flex; flex-direction: column; gap: 12px; }

/* Komponenten und Software im Gerätesteckbrief. */
.nb-komponenten { display: flex; flex-direction: column; gap: 12px; }
.nb-komponenten .kopf { display: flex; align-items: center; }
.nb-komponenten .erklaerung { color: var(--t2); margin: 0; }
.nb-komponenten .nb-unterkopf { font-size: 15px; font-weight: 600; margin: 12px 0 0; }
.nb-komponententabelle td.art { color: var(--t2); white-space: nowrap; }
.nb-komponententabelle td.modell { font-weight: 600; }
.nb-hinzufuegen .nb-schmal { max-width: 180px; }
.nb-anschluesse td.gegen { white-space: nowrap; }
/* Feste Spaltenbreiten (mj, 03.10.2026): Sonst richtet sich jede Spalte nach ihrem Inhalt, und eine
   Auswahl wie „Art" schrumpft auf drei Buchstaben. Die Breiten stehen im <colgroup> der Tabelle. */
.nb-feste-spalten table { table-layout: fixed; width: 100%; }
.nb-feste-spalten td { overflow: hidden; }
.nb-anschluesse td.gegen .kabel { color: var(--t2); font-size: 12px; margin-left: 6px; }
.nb-anschluesse td.gegen .klein { color: var(--t3); font-size: 12px; }

/* Die Rackansicht: zwei Seiten nebeneinander, 24 px je Höheneinheit. */
.nb-rack-seiten { display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; }
.nb-rack-seite { flex: 1 1 360px; max-width: 560px; }
.nb-rack-seite .titel { font-size: 13px; font-weight: 600; color: var(--t2); margin-bottom: 6px; }
.nb-rack { border: 2px solid var(--line2); border-radius: 8px; padding: 4px; background: var(--surf2); }
.nb-rack .feld { position: relative; display: flex; align-items: stretch; border-bottom: 1px dashed var(--line); box-sizing: border-box; }
.nb-rack .feld .he { width: 28px; flex: none; font-size: 10px; color: var(--t3); text-align: right; padding: 4px 6px 0 0; }
.nb-rack .feld.frei.ziel { background: var(--pri-w); }
.nb-rack .feld.geraet .inhalt {
  flex: 1; margin: 1px 0; padding: 2px 8px; border-radius: 6px; background: var(--surf3);
  border: 1px solid var(--line2); cursor: grab; overflow: hidden; display: flex; flex-wrap: wrap;
  align-items: center; gap: 2px 8px;
}
.nb-rack .feld.geraet.gezogen .inhalt { opacity: .5; }
.nb-rack .feld.geraet .name { font-size: 12px; font-weight: 600; color: var(--t1); text-decoration: none; }
.nb-rack .feld.geraet .modell { font-size: 11px; color: var(--t2); }
.nb-rack .ports { display: flex; flex-wrap: wrap; gap: 2px; }
.nb-rack .port {
  width: 9px; height: 9px; padding: 0; border-radius: 2px; border: 1px solid var(--t3);
  background: transparent; cursor: pointer;
}
.nb-rack .port.belegt { background: var(--pri); border-color: var(--pri); }
.nb-rack .port.an { outline: 2px solid var(--t1); outline-offset: 1px; }
.nb-rack-port {
  display: flex; align-items: center; gap: 8px; margin-bottom: 12px; padding: 6px 10px;
  border-radius: 8px; background: var(--surf2); border: 1px solid var(--line2); font-size: 13px;
}
.nb-rack-port .kabel, .nb-rack-port .frei { color: var(--t2); }
.nb-visitenkarte-wahl .hinweis { color: var(--t2); }

/* Textbausteine (Block 9): die Vorschläge zu „/kürzel“ direkt unter dem Feld - der erste ist der, den Enter nimmt. */
.nb-bausteinwahl { display: flex; flex-wrap: wrap; gap: 4px; margin: 4px 0; }
.nb-bausteinwahl button { border: 1px solid var(--line2); border-radius: 4px; background: transparent; color: inherit; padding: 2px 8px; font-size: 13px; cursor: pointer; }
.nb-bausteinwahl button:first-child { border-color: var(--mud-palette-primary); }
.nb-bausteinwahl button code { color: var(--pri-t); }
.nb-bausteinwahl button span { opacity: .75; }

.nb-antwort-feld {
  display: block; width: 100%; box-sizing: border-box; resize: vertical;
  border: none; outline: none; padding: 10px 12px; min-height: 120px;
  background: transparent; color: var(--t1); font: inherit; font-size: 13px; line-height: 1.55;
}
.nb-antwort-vorschau { padding: 10px 12px; min-height: 120px; font-size: 13px; }
/* Der HTML-Bereich: Was man sieht, ist was hinausgeht. Weisser Grund mit dunkler Schrift, auch
   in der dunklen Ansicht - beim Empfaenger ist es genauso, und eine Hervorhebung, die hier
   passt und dort nicht, ist keine. */
/* Mit dem Vorfahren davor, damit die Regel nicht gegen .nb-antwort-feld verliert - dort steht
   „transparent", und in der dunklen Ansicht saehe der Editor dann aus wie ein Textfeld. */
.nb-antwort .nb-antwort-feld/* Mit dem Vorfahren davor, damit die Regel nicht gegen .nb-antwort-feld verliert - dort steht
   „transparent", und in der dunklen Ansicht saehe der Editor dann aus wie ein Textfeld. */
.nb-antwort .nb-antwort-feld.nb-editor {
  background: var(--papier); color: var(--papier-text); outline: none; overflow-y: auto;
}
/* Ohne offene Unterhaltung fuellt der Bereich die Flaeche: Wer etwas Neues verfasst, hat nichts,
   worauf er nebenher schauen muesste. */
/* Ohne offene Unterhaltung fuellt der Bereich die Flaeche - und der leere Laufbereich darueber
   darf ihm nichts wegnehmen. */
/* Ueber dem Verfassen-Bereich: Ohne Unterhaltung daneben sagt sonst nichts, was gerade
   geschieht - und der Platz stand ohnehin leer. */
.nb-verfassenkopf {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 16px 10px; border-bottom: 1px solid var(--line);
  font-size: 14px; font-weight: 600; color: var(--t1); flex: 0 0 auto;
}
.nb-verfassenkopf .mud-icon-root { font-size: 18px; color: var(--t3); }

.nb-antwort.voll {
  margin: 0; border-radius: 0; border: none; flex: 1; min-height: 0;
  display: flex; flex-direction: column;
}
.nb-pf-inhalt:has(> .nb-antwort.voll) > .nb-pf-lauf { flex: 0 0 auto; }
.nb-antwort.voll .nb-antwort-feld,
.nb-antwort.voll .nb-antwort-vorschau { flex: 1; min-height: 0; overflow-y: auto; resize: none; }
/* Der Hinweis kommt aus dem Element, nicht aus der Stilvorlage: Ob gerade eine Antwort oder
   eine neue Nachricht entsteht, weiss nur die Flaeche. */
.nb-editor:empty::before {
  content: attr(data-platzhalter); color: var(--papier-leise);
}
.nb-editor p { margin: 0 0 8px; }
.nb-editor h1, .nb-editor h2, .nb-editor h3 { margin: 10px 0 6px; font-size: 15px; }
.nb-editor ul, .nb-editor ol { margin: 0 0 8px; padding-left: 22px; }
.nb-editor blockquote {
  margin: 6px 0; padding-left: 10px; border-left: 3px solid var(--papier-linie); color: var(--papier-leise);
}
.nb-editor code { background: color-mix(in srgb, var(--papier-linie) 15%, var(--papier)); border-radius: 3px; padding: 0 3px; }
.nb-editor a { color: var(--papier-verweis); }
/* Die Farbprobe im Menue - so breit wie ein Wort, damit man den Ton wirklich sieht. */
.nb-ton {
  display: inline-block; min-width: 42px; text-align: center; border-radius: 4px;
  padding: 1px 6px; margin-right: 8px; font-size: 12px;
}
.nb-antwort-fuss {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 12px; border-top: 1px solid var(--line); font-size: 12px; color: var(--t3);
}
.nb-antwort-fuss .zuviel { color: var(--bad); font-weight: 600; }
.nb-antwort-hinweis { padding: 0 12px 9px; font-size: 11.5px; color: var(--t3); }

.nb-chat-zeile { display: flex; margin-bottom: 10px; }
.nb-chat-zeile.eingehend { justify-content: flex-start; }
.nb-chat-zeile.ausgehend { justify-content: flex-end; }
/* Die interne Notiz steht RECHTS wie alles, was von uns kommt - sie ist unser Beitrag, nur nicht
   fuer draussen. Mittig hatte sie eine dritte Spur aufgemacht und die Seitenlogik verwaessert. */
.nb-chat-zeile.intern { justify-content: flex-end; }
/* Zwei Drittel, nicht vier Fuenftel: Erst wenn eine Blase sichtbar KURZ vor dem anderen Rand
   endet, sieht man auf einen Blick, von welcher Seite sie kommt. Bei 82 % fuellen beide Seiten
   fast dieselbe Flaeche, und die Unterscheidung lebt nur noch von ein paar Pixeln. */
.nb-chat-blase {
  max-width: 66%; min-width: 0; padding: 10px 12px; border-radius: 12px;
  background: var(--surf); border: 1px solid var(--line);
}
.nb-chat-zeile.ausgehend .nb-chat-blase { background: var(--pri-w); border-color: var(--pri-w); }
/* Die interne Notiz ist keine Nachricht nach draussen - sie darf auch nicht so aussehen. */
.nb-chat-zeile.intern .nb-chat-blase {
  background: color-mix(in srgb, var(--warn) 12%, transparent);
  border-color: color-mix(in srgb, var(--warn) 40%, transparent);
}
/* Zitat und Signatur: da, aber zusammengefaltet. */
.nb-chat-falt { margin-top: 6px; font-size: 12px; color: var(--t3); }
.nb-chat-falt summary { cursor: pointer; user-select: none; }
.nb-chat-falt pre {
  white-space: pre-wrap; word-break: break-word; font-family: inherit; margin: 6px 0 0;
  padding-left: 8px; border-left: 2px solid var(--line2);
}
/* Anhaenge an der Nachricht: Sie sind oft das Eigentliche - „siehe Anhang" ist ein ganzer Satz. */
.nb-beilagen { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 6px; }
.nb-beilage {
  display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
  border: 1px solid var(--line); border-radius: 8px; padding: 4px 9px;
  font-size: 12px; color: var(--t1); background: var(--surf2);
}
.nb-beilage .nm {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: inherit; text-decoration: none;
}
/* Der Name ist ein KNOPF und kein Link: Ein nackter Link in einen neuen Tab traegt kein
   Bearer-Zeichen und stirbt mit 401. Aussehen soll er trotzdem wie Text, nicht wie ein Knopf. */
.nb-beilage button.nm {
  appearance: none; background: none; border: none; padding: 0; cursor: pointer;
  font: inherit; text-align: left;
}
.nb-beilage button.nm:hover { text-decoration: underline; background: none; }
.nb-beilage .gr { color: var(--t3); font-size: 11px; flex: 0 0 auto; }
.nb-beilage .mud-icon-root { font-size: 15px; color: var(--t3); }
/* Im Antwortbereich traegt die Beilage einen Wegnehmen-Knopf - anders als im Verlauf, wo sie
   eine Tatsache ist und keine Wahl. */
.nb-antwort-beilagen { padding: 6px 12px 0; }
.nb-beilage button {
  appearance: none; background: none; border: none; cursor: pointer;
  color: var(--t3); font-size: 12px; line-height: 1; padding: 2px 4px; border-radius: 50%;
}
.nb-beilage button:hover { background: var(--bad); color: var(--auf-pri); }


/* Alle Dateien einer Unterhaltung, im festen Kopf.

   Eingeklappt EINE Zeile mit den ersten Namen: Der Kopf kostet Hoehe, die sonst Nachricht waere -
   und „3 Dateien" allein beantwortet die Frage nicht, die man stellt, naemlich ob ein bestimmter
   Name dabei ist. */
.nb-vorgangsdateien { margin-top: 6px; }
.nb-vorgangsdateien .griff {
  appearance: none; background: var(--surf2); border: 1px solid var(--line);
  border-radius: 8px; cursor: pointer; width: 100%;
  display: flex; align-items: center; gap: 7px; padding: 4px 9px;
  font-size: 12px; color: var(--t2); text-align: left;
}
.nb-vorgangsdateien .griff:hover { border-color: var(--line2); color: var(--t1); }
.nb-vorgangsdateien .griff .mud-icon-root { font-size: 15px; color: var(--t3); flex: 0 0 auto; }
.nb-vorgangsdateien .griff .zahl { font-weight: 600; color: var(--t1); flex: 0 0 auto; }
.nb-vorgangsdateien .griff .namen {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--t3);
}
.nb-vorgangsdateien .griff .mehr { flex: 0 0 auto; color: var(--t3); }
.nb-vorgangsdateien .griff .pfeil { margin-left: auto; }
.nb-vorgangsdateien.auf .griff {
  border-bottom-left-radius: 0; border-bottom-right-radius: 0; border-bottom-color: transparent;
}

/* Aufgeklappt bekommt jede Datei eine Zeile - und die Liste eine eigene Hoehengrenze: Eine
   Unterhaltung mit dreissig Anhaengen schoebe den Verlauf sonst ganz aus dem Bild. */
.nb-vorgangsdateien .liste {
  border: 1px solid var(--line); border-top: 0;
  border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;
  max-height: 34vh; overflow: auto; background: var(--surf2);
}
.nb-vorgangsdateien .zeile {
  display: flex; align-items: center; gap: 8px; padding: 5px 9px;
  border-top: 1px solid var(--line);
}
.nb-vorgangsdateien .zeile:first-child { border-top: 0; }
.nb-vorgangsdateien .zeile:hover { background: var(--surf3, var(--bg2)); }
.nb-vorgangsdateien .zeile > .mud-icon-root { font-size: 17px; color: var(--t3); flex: 0 0 auto; }
.nb-vorgangsdateien .wer { flex: 1; min-width: 0; }
.nb-vorgangsdateien .wer .nm {
  font-size: 12.5px; color: var(--t1);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-vorgangsdateien .wer .her { font-size: 11px; color: var(--t3); }
.nb-vorgangsdateien .wer .her .trenn { color: var(--line2); margin: 0 3px; }
.nb-vorgangsdateien .zeile button {
  appearance: none; background: none; border: 1px solid transparent; cursor: pointer;
  color: var(--t3); padding: 3px; border-radius: 6px; line-height: 0; flex: 0 0 auto;
}
.nb-vorgangsdateien .zeile button:hover { border-color: var(--line2); color: var(--t1); }
/* Schon uebernommen: ein ruhiges Haekchen, kein Knopf - es gibt nichts mehr zu tun. */
.nb-vorgangsdateien .drin { color: var(--ok); }
.nb-vorgangsdateien .wartet { color: var(--t3); opacity: .6; }

.nb-chat-fuss { margin-top: 6px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
/* Der Hinweis, warum etwas ausbleibt - ruhig, aber nicht unsichtbar: Eine zurueckgehaltene
   Nachricht, von der niemand weiss, ist schlimmer als eine, die nachlaedt. */
.nb-chat-hinweis {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 11px; color: var(--t3);
}
.nb-chat-hinweis .mud-icon-root { font-size: 14px; }
/* Auch das Original bleibt in der Blase: Volle Breite hat den Verlauf zu einer Reihe gleich
   breiter Kaesten gemacht, und dann sieht man nicht mehr, von welcher Seite etwas kam. Ein
   breiter Newsletter bekommt stattdessen einen eigenen Rollbalken - und in voller Breite gibt es
   ihn auf Knopfdruck im eigenen Fenster. */
.nb-chat-zeile.weit .nb-pf-koerper.nb-eingebettet { overflow: auto; }
/* Im Verlauf immer hell: Dort ist kein Platz fuer einen Schalter, und heller Grund ist der Fall,
   fuer den Post gebaut wird. Wer es anders braucht, oeffnet das eigene Fenster. */
.nb-pf-koerper.nb-eingebettet {
  max-height: 60vh; overflow: auto; background: var(--papier); color: var(--papier-text);
  border: 1px solid var(--line); border-radius: 8px; padding: 8px;
}
/* Das Original im Fenster darf so breit sein, wie es gebaut wurde. */
.nb-pf-koerper.nb-original { max-height: 70vh; overflow: auto; border-radius: 6px; padding: 8px; }
/* Post ist fast immer fuer hellen Grund gebaut - in der dunklen Ansicht stuende sonst dunkler
   Text auf dunklem Grund. Umschaltbar, weil es auch den umgekehrten Fall gibt. */
.nb-pf-koerper.nb-original.hell { background: var(--papier); color: var(--papier-text); }
.nb-pf-koerper.nb-original.dunkel { background: var(--bg2); color: var(--t1); }

/* Der Stand der Einordnung an der Nachricht - eine Randnotiz, kein Signal: Sie beantwortet eine
   Frage, die man nur stellt, wenn etwas nicht stimmt. */
.nb-pf-einordnung {
  display: flex; align-items: center; gap: 6px; margin-top: 6px;
  font-size: 11px; color: var(--t3);
}
.nb-pf-einordnung .mud-icon-root { font-size: 14px; }
/* Fremdes HTML bleibt in seinem Kasten: Eine Mail mit 900px breiter Tabelle darf die Seite nicht
   auseinanderziehen. */
.nb-pf-koerper { margin-top: 8px; font-size: 13px; overflow-x: auto; }
.nb-pf-koerper img { max-width: 100%; height: auto; }
.nb-pf-koerper pre { white-space: pre-wrap; word-break: break-word; font-family: inherit; margin: 0; }
/* Der Deckel fuer lange Nachrichten: etwa eine halbe Bildschirmhoehe, darunter ein Verlauf ins
   Nichts, damit man SIEHT, dass es weitergeht - eine harte Kante liest sich wie ein Ende. */
.nb-pf-koerper.gedeckelt { max-height: 45vh; overflow: hidden; position: relative; }
.nb-pf-koerper.gedeckelt::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 56px;
  background: linear-gradient(to bottom, transparent, var(--surf));
  pointer-events: none;
}
.nb-chat-zeile.ausgehend .nb-pf-koerper.gedeckelt::after {
  background: linear-gradient(to bottom, transparent, var(--pri-w));
}
.nb-chat-zeile.intern .nb-pf-koerper.gedeckelt::after {
  background: linear-gradient(to bottom, transparent,
    color-mix(in srgb, var(--warn) 12%, var(--surf)));
}
.nb-mehr {
  appearance: none; background: none; border: none; cursor: pointer; padding: 6px 0 0;
  font-size: 12px; color: var(--pri-t); font-weight: 600;
}
.nb-mehr:hover { text-decoration: underline; }
/* Gewandeltes Markdown in der Blase: Die Abstaende muessen kleiner sein als im Fliesstext -
   sonst steht in einer Blase mit drei Saetzen mehr Luft als Inhalt. */
.nb-md > :first-child { margin-top: 0; }
.nb-md > :last-child { margin-bottom: 0; }
.nb-md p { margin: 0 0 8px; }
.nb-md ul, .nb-md ol { margin: 0 0 8px; padding-left: 20px; }
.nb-md li { margin: 2px 0; }
.nb-md h1, .nb-md h2, .nb-md h3, .nb-md h4, .nb-md h5, .nb-md h6 {
  margin: 10px 0 6px; font-size: 14px; font-weight: 600; line-height: 1.3;
}
.nb-md blockquote {
  margin: 6px 0; padding-left: 10px;
  border-left: 2px solid var(--line2); color: var(--t3);
}
.nb-md code { background: var(--surf3); border-radius: 3px; padding: 0 3px; font-size: .9em; }
.nb-md pre code { background: none; padding: 0; }
.nb-md hr { border: none; border-top: 1px solid var(--line); margin: 10px 0; }
.nb-md a { color: var(--pri); word-break: break-word; }
.nb-md table { border-collapse: collapse; }
.nb-md td, .nb-md th { border: 1px solid var(--line); padding: 2px 6px; }
/* Verhuellte Zeile: Was nicht im Vorbeigehen mitgelesen werden soll, steht auch nicht im Auszug. */
.nb-pf-zeile .betreff.verhuellt { display: flex; align-items: center; gap: 6px; color: var(--t3); font-style: italic; }
.nb-pf-zeile .betreff.verhuellt .mud-icon-root { font-size: 15px; }
/* Entschaerfte Nachricht: Der Linktext bleibt lesbar, sein Ziel steht daneben - und nichts
   davon ist anklickbar. Genau dort sieht man, dass „Ihre Bank" woanders hinzeigt. */
.nb-pf-koerper.entschaerft .nb-link-tot { text-decoration: underline dotted; color: var(--t2); }
.nb-pf-koerper.entschaerft .nb-link-ziel {
  display: inline-block; margin: 0 4px; padding: 0 5px; border-radius: 4px;
  background: var(--surf3); color: var(--bad); font-family: var(--nb-schriftart-code); font-size: .85em;
  word-break: break-all;
}

/* ── Liste links, Gewaehltes rechts ─────────────────────────────────────────────────────────
   Dasselbe Raster wie in der Kommunikation, nur unter neutralem Namen: „pf" heisst Postfach,
   und ein Behaelterwort hat in einer Kontaktflaeche nichts zu suchen. Die Kommunikation behaelt
   ihre alten Klassen, bis sie ohnehin angefasst wird - ein Zweitname kostet ein paar Zeilen
   hier und keine einzige in Nachrichten.razor. */
.nb-zweispalt {
  display: grid; grid-template-columns: var(--nb-liste-w, 340px) minmax(0, 1fr);
  height: calc(100vh - 58px - var(--nb-leiste-h, 0px) - var(--nb-leiste-schweb, 0px));
}
.nb-sp-spalte {
  display: flex; flex-direction: column; min-height: 0; position: relative;
  background: var(--bg2); border-right: 1px solid var(--line);
  /* Platz fuer den Griff an der Kante - sonst laege die Bildlaufleiste genau darunter. */
  padding-right: 7px;
}
.nb-sp-spalte > .kopf {
  display: flex; align-items: center; gap: 6px; flex: 0 0 auto;
  padding: 14px 14px 8px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3);
}
.nb-sp-spalte > .suche { flex: 0 0 auto; padding: 0 14px 8px; }
.nb-sp-liste { overflow-y: auto; flex: 1; min-height: 0; }
.nb-sp-inhalt { overflow-y: auto; padding: 16px; min-width: 0; }
.nb-sp-liste .leer, .nb-sp-inhalt .leer { padding: 16px; color: var(--t3); font-size: 13px; }

/* Der Fuss traegt das Blaettern. Fest unten statt mitscrollend: Wer auf Seite 7 ist, will nicht
   erst ans Listenende scrollen, um auf Seite 8 zu kommen. */
.nb-sp-fuss {
  flex: 0 0 auto; display: flex; align-items: center; gap: 6px;
  padding: 6px 10px 6px 14px; border-top: 1px solid var(--line);
  font-size: 11px; color: var(--t3); white-space: nowrap;
}
.nb-sp-fuss .stand { margin-right: auto; }
.nb-sp-fuss select {
  background: var(--surf2); color: var(--t2); border: 1px solid var(--line);
  border-radius: 6px; padding: 2px 4px; font-size: 11px; cursor: pointer;
}
.nb-sp-fuss button {
  background: none; border: none; color: var(--t2); cursor: pointer; padding: 2px 6px;
  border-radius: 6px; font-size: 13px; line-height: 1;
}
.nb-sp-fuss button:hover:not(:disabled) { background: var(--surf2); }
.nb-sp-fuss button:disabled { opacity: .3; cursor: default; }

/* ── Kontaktdetail: Kopf, Reiter, Kontextspalte ─────────────────────────────────────────────
   Nach dem Entwurf (netbits.world.docu/mockups/netbits-flow.html, Kontaktpanel): Was man
   DURCHSIEHT steht in Reitern links, was man NEBENBEI IM BLICK hat rechts. Vorher lag beides
   als Kachelbahn untereinander - man scrollte an den Wegen vorbei, um die Notiz zu lesen. */
.nb-kd { display: flex; flex-direction: column; height: 100%; min-width: 0; }
.nb-kd-kopf { flex: 0 0 auto; padding: 4px 4px 10px; border-bottom: 1px solid var(--line); }
.nb-kd-kopf .zeile { display: flex; align-items: center; gap: 10px; min-width: 0; }
.nb-kd-kopf .marken { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.nb-kd-kopf .uid { font-size: 12px; color: var(--t3); }

/* Das Rund mit den Initialen - es traegt den linken Rand, damit der Name bei kurzem und langem
   Namen an derselben Stelle beginnt. */
.nb-kd-avatar {
  flex: 0 0 42px; width: 42px; height: 42px; border-radius: 10px;
  display: grid; place-items: center; font-weight: 700; font-size: 15px; color: var(--auf-pri);
}

.nb-kd-kern { flex: 1; min-height: 0; display: grid; gap: 14px; grid-template-columns: minmax(0, 1fr); }
/* Erst mit Kontextspalte wird geteilt - ohne sie nimmt der Hauptbereich alles. */
.nb-kd-kern.mit-seite { grid-template-columns: minmax(0, 1fr) var(--nb-kd-seite-w, 320px); }
.nb-kd-main { min-width: 0; overflow-y: auto; }
.nb-kd-side { min-width: 0; overflow-y: auto; position: relative; padding-right: 2px; }

.nb-kd-block { border: 1px solid var(--line); border-radius: 10px; margin-bottom: 12px; background: var(--surf); }
.nb-kd-block > .kopf {
  display: flex; align-items: center; gap: 6px; padding: 9px 11px;
  font-size: 11px; font-weight: 700; letter-spacing: .9px; text-transform: uppercase; color: var(--t3);
}
.nb-kd-block > .inhalt { padding: 0 11px 11px; }
.nb-kd-block .zeile { display: flex; gap: 8px; font-size: 12.5px; padding: 3px 0; }
.nb-kd-block .zeile .k { flex: 0 0 96px; color: var(--t3); }
.nb-kd-block .zeile .w { font-weight: 600; min-width: 0; overflow-wrap: anywhere; }

/* Anmerkungen: zwei Bereiche, und die Beschriftung sagt, wer mitliest. Ohne den Unterschied
   schreibt jemand hier hinein, was er fuer sich behalten wollte - und merkt es nie. */
.nb-kd-anm { border-radius: 8px; padding: 8px 10px; background: var(--surf2); }
.nb-kd-anm + .nb-kd-anm { margin-top: 9px; }
.nb-kd-anm .kopf {
  display: flex; align-items: center; gap: 6px; font-size: 10.5px; font-weight: 700;
  letter-spacing: .7px; text-transform: uppercase; color: var(--t3); margin-bottom: 5px;
}
.nb-kd-anm .sicht { font-size: 9.5px; padding: 1px 6px; border-radius: 999px; }
.nb-kd-anm .sicht.alle { background: color-mix(in srgb, var(--ok) 20%, transparent); color: var(--ok); }
.nb-kd-anm .sicht.ich { background: color-mix(in srgb, var(--warn) 22%, transparent); color: var(--warn); }
.nb-kd-anm .txt { font-size: 12.5px; white-space: pre-wrap; overflow-wrap: anywhere; }
.nb-kd-anm .txt.leer { color: var(--t3); font-style: italic; }
.nb-kd-anm .wer { font-size: 10.5px; color: var(--t3); margin-top: 2px; }
.nb-kd-anm .eintrag + .eintrag { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--line); }

/* Zeitleiste der Aktivitaet - der Punkt links haelt die Spur, die Linie verbindet sie. */
.nb-kd-zeit { position: relative; padding-left: 22px; }
.nb-kd-zeit::before {
  content: ""; position: absolute; left: 5px; top: 6px; bottom: 6px; width: 1px; background: var(--line);
}
.nb-kd-zeit .schritt { position: relative; padding: 0 0 16px; }
.nb-kd-zeit .schritt::before {
  content: ""; position: absolute; left: -20px; top: 5px; width: 9px; height: 9px;
  border-radius: 50%; background: var(--pri); box-shadow: 0 0 0 3px var(--surf);
}
.nb-kd-zeit .wann { font-size: 11px; color: var(--t3); }
.nb-kd-zeit .was { font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.nb-kd-zeit .dazu { font-size: 12px; color: var(--t2); margin-top: 2px; overflow-wrap: anywhere; }
.nb-kd-zeit .herkunft {
  font-size: 9.5px; padding: 1px 6px; border-radius: 999px; background: var(--surf3);
  color: var(--t2); text-transform: none; letter-spacing: 0; font-weight: 500;
}

/* Formularbahn in einer breiten Spalte: Die Reiterleiste darueber nimmt die ganze Breite - sonst
   schiebt MudBlazor die hinteren Reiter in eine Bildlaufleiste, und ein Reiter, den man nicht
   sieht, ist einer, den man nicht ausfuellt. Die FELDER bleiben schmaler: Eine Eingabezeile ueber
   1500 Pixel liest niemand besser, und das Auge verliert den Bezug zur Beschriftung links. */
.nb-formularbahn { max-width: 900px; }

/* Die Zeile. Zweizeilig statt tabellarisch: In 340 Pixel stehen Name, Wege und Kategorien
   nicht nebeneinander - untereinander schon. */
.nb-sp-zeile {
  display: flex; gap: 9px; padding: 8px 10px 8px 14px; cursor: pointer;
  border-bottom: 1px solid var(--line); min-width: 0;
}
.nb-sp-zeile:hover { background: var(--surf2); }
.nb-sp-zeile.on { background: var(--pri-w); }
.nb-sp-zeile > .sym {
  flex: 0 0 22px; display: flex; justify-content: center; padding-top: 2px; color: var(--t3);
}
.nb-sp-zeile.on > .sym { color: var(--pri-t); }
.nb-sp-zeile > .feld { flex: 1; min-width: 0; }
.nb-sp-zeile .kopf { display: flex; align-items: center; gap: 6px; min-width: 0; }
.nb-sp-zeile .kopf .nm {
  font-weight: 600; color: var(--t1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-sp-zeile .kopf .rf { font-size: 11px; color: var(--t3); }
.nb-sp-zeile .kopf .rechts { margin-left: auto; display: flex; align-items: center; gap: 2px; }
.nb-sp-zeile .kopf .rechts .mud-icon-root { font-size: 15px; }
.nb-sp-zeile .weg {
  font-size: 12px; color: var(--t3); overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; margin-top: 1px;
}
.nb-sp-zeile .marken { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-top: 5px; }
.nb-sp-zeile .mk {
  font-size: 10px; padding: 1px 6px; border-radius: 999px;
  background: var(--surf3); color: var(--t2);
}

/* ===== Schmale Flächen: Handy und sehr schmale Fenster (ADR-0098) =====
   Am Handy zeigt die Kopfleiste nicht dieselben Dinge wie am Desktop, nur kleiner - sie zeigt
   weniger. Was hier verschwindet, ist nicht verloren: Die Menügruppen wandern in die untere
   Leiste, Name und Status stehen im Avatar-Menü, der Mandant in dessen Kopfzeile.

   Ohne das war die Leiste breiter als der Bildschirm, und die ganze Seite ließ sich seitlich
   schieben - der Inhalt darunter gleich mit. */
@media (max-width: 760px) {
  /* Die Hauptnavigation ersetzt die untere Leiste (ADR-0098): zwei Wege zum selben Ort wären
     einer zu viel, und quer scrollen musste man dafür auch noch. */
  .nb-mnav { display: none; }

  /* Der Mandant steht am Handy nicht dauerhaft in der Leiste - bei einer Instanz mit einem
     Mandanten ist er ohnehin immer derselbe. */
  .nb-mandant { display: none; }

  /* Vom Benutzerknopf bleibt der Avatar; Name und Statuszeile kosteten die halbe Breite. */
  .nb-userbtn .nb-userinfo { display: none; }

  /* Vom Bereichsfilter bleibt das Symbol. */
  .nb-bereichstext { display: none; }

  /* Enger zusammen: Bei vier Symbolen nebeneinander zählt jeder Pixel. */
  .nb-appbar { padding: 0 8px; gap: 2px; }
  .nb-brand { margin-right: 4px; }

  /* Die untere Leiste tritt an die Stelle der Menügruppen. Fest am unteren Rand, weil der
     Daumen dort ist - und über der Gestenleiste, die sonst auf den Zielflächen läge. */
  .nb-untenleiste {
    display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 1200;
    background: var(--bg2); border-top: 1px solid var(--line);
    padding-bottom: env(safe-area-inset-bottom);
  }
  .nb-untenleiste a,
  .nb-untenleiste button {
    flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 2px; padding: 7px 2px 6px; position: relative;
    background: none; border: 0; cursor: pointer;
    font-size: 10.5px; line-height: 1.1; color: var(--t3); text-decoration: none;
    /* Fünf Ziele auf einer Handybreite: Unter etwa 56px wird die Fläche unzuverlässig. */
    min-height: 54px;
  }
  .nb-untenleiste .on { color: var(--pri); }
  /* Der Zähler sitzt am Symbol, nicht an der Beschriftung - sonst wandert er beim Umbruch. */
  .nb-untenleiste .ung {
    position: absolute; top: 4px; left: 50%; margin-left: 2px;
    background: var(--pri); color: var(--auf-pri); font-size: 9px; font-weight: 700;
    min-width: 15px; height: 15px; border-radius: 999px; padding: 0 4px;
    display: flex; align-items: center; justify-content: center;
  }

  /* Die Modul-Spalte belegte eine feste Grid-Spalte von 238px. Auf Handybreite blieb für den
     Inhalt zu wenig übrig, er sprengte das Raster, und die Seite ließ sich seitlich schieben.
     Sie wird deshalb zum Ausklappfach hinter dem Symbol links in der Kopfleiste - dieselben
     Einträge, nur auf Abruf. */
  .nb-stage,
  .nb-stage.ohne-rail { grid-template-columns: minmax(0, 1fr); }
  .nb-stage > .nb-rail { display: none; }

  /* Nur hier gibt es Symbol und Fächer - am Desktop steht alles offen daneben. */
  .nb-railknopf { display: inline-flex; }
  .nb-fachschatten { display: block; }

  /* Die beiden Fächer: außerhalb des Bildes geparkt, auf Abruf hereingefahren. Dasselbe
     Muster wie das Chat-Panel - fest positioniert und per transform bewegt, damit nichts
     das Layout darunter verschiebt. */
  .nb-railfach {
    display: block; transform: translateX(-100%);
    padding-top: calc(12px + env(safe-area-inset-top));
  }
  .nb-mehrfach {
    display: block; transform: translateY(100%);
    padding-bottom: calc(8px + env(safe-area-inset-bottom));
  }
  .nb-railfach.auf, .nb-mehrfach.auf { transform: none; }

  /* Die eigene Spalte der Seite (Kategorien, Adressbücher) wird zum selben Fach. Sie bleibt im
     Markup der Seite stehen - nur ihre Darstellung wechselt, sodass keine Seite etwas vom
     Handy-Layout wissen muss. Das Raster darunter wird einspaltig, sonst bliebe ihre Spur als
     Lücke stehen. */
  .nb-modul { grid-template-columns: minmax(0, 1fr); margin: 0; height: 100%; }
  .nb-modul > .nb-rail {
    position: fixed; top: 0; bottom: 0; left: 0; width: min(78vw, 300px); z-index: 260;
    transform: translateX(-100%);
    transition: transform .22s cubic-bezier(.25,.8,.3,1);
    box-shadow: 12px 0 34px color-mix(in srgb, var(--schatten-farbe) 65%, transparent);
    padding-top: calc(12px + env(safe-area-inset-top));
    overscroll-behavior: contain;
  }
  .seitenrail-auf .nb-modul > .nb-rail { transform: none; }

  /* Der Griff zum Breitenziehen ist eine Maus-Angelegenheit. */
  .nb-modul > .nb-rail .nb-griff { display: none; }

  /* ===== Eine Ansicht nach der anderen =====
     Zwei Spalten nebeneinander brauchen Breite, die es hier nicht gibt: Die Liste allein ist am
     Desktop 340px breit, daneben soll noch ein Kontakt stehen. Auf Handybreite gequetscht wird
     beides unbrauchbar, und das Raster läuft seitlich aus dem Bild.
     Stattdessen bekommt jeweils eine der beiden die ganze Fläche - Liste, bis man jemanden
     auswählt, danach der Kontakt. Welche, sagt die Klasse detail-offen, die die Seite aus ihrem
     eigenen Zustand setzt. */
  .nb-zweispalt { grid-template-columns: minmax(0, 1fr); }
  .nb-zweispalt > .nb-sp-inhalt { display: none; }
  .nb-zweispalt.detail-offen > .nb-sp-spalte { display: none; }
  .nb-zweispalt.detail-offen > .nb-sp-inhalt { display: block; }

  /* Der Rückweg steht über dem Inhalt und bleibt beim Rollen stehen - wer unten in einem langen
     Kontakt steht, soll nicht erst hochscrollen müssen, um herauszukommen. */
  .nb-zurueck {
    position: sticky; top: 0; z-index: 2; display: flex; align-items: center; gap: 6px;
    width: 100%; margin: -16px -16px 8px; padding: 10px 16px; min-height: 44px;
    background: var(--bg2); border: 0; border-bottom: 1px solid var(--line);
    color: var(--t2); font-size: 13.5px; font-weight: 600; cursor: pointer;
  }
  /* Der Trenngriff zwischen den Spalten hat ohne zweite Spalte nichts zu trennen. */
  .nb-zweispalt > .nb-griff { display: none; }

  /* Das Fluchtventil „Mehr": von unten, mit denselben Zeilen wie die Kopfleiste am Desktop. */
  .nb-mehr .kopf {
    padding: 14px 16px 8px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
    text-transform: uppercase; color: var(--t3);
  }
  .nb-mehr a {
    display: flex; align-items: center; gap: 10px; padding: 12px 16px;
    color: var(--t2); text-decoration: none; font-size: 14px;
  }
  .nb-mehr a.on { color: var(--pri); background: var(--pri-w); font-weight: 600; }
}

/* Über der Handybreite gibt es sie nicht: Dort trägt die Kopfleiste die Menügruppen, und zwei
   Wege zum selben Ort wären einer zu viel (ADR-0092, „genau einmal"). */
@media (min-width: 761px) {
  .nb-untenleiste { display: none; }
}

/* Seitlich schieben lässt sich hier grundsätzlich nichts: Eine Ansicht, die quer wegläuft, ist
   am Handy verloren - man findet sie nicht zurück, weil es keinen Anhaltspunkt gibt. Läuft etwas
   über, ist das ein Fehler im Layout und soll auffallen, statt sich wegschieben zu lassen. */
html, body { max-width: 100%; overflow-x: hidden; }

/* Das Symbol für die Modul-Spalte ist eine reine Handy-Angelegenheit: Am Desktop steht die
   Spalte offen daneben, ein Knopf zum Ausklappen wäre dort ohne Wirkung. */
.nb-railknopf { display: none; }

/* ===== Ausklappfächer des Handy-Layouts =====
   Am Desktop gibt es sie nicht - dort tragen Kopfleiste und Modul-Spalte ihre Einträge offen.
   Deshalb steht das display:none hier außerhalb jeder Bedingung und wird erst im
   Handy-Breakpoint aufgehoben: Ein Fach, das am Desktop nur zufällig unsichtbar wäre, stünde
   beim nächsten Stilfehler mitten im Bild. */
.nb-railfach, .nb-mehrfach, .nb-fachschatten { display: none; }

.nb-railfach, .nb-mehrfach {
  position: fixed; z-index: 260; background: var(--bg2);
  transition: transform .22s cubic-bezier(.25,.8,.3,1);
  overflow-y: auto; overscroll-behavior: contain;
}
.nb-railfach {
  top: 0; bottom: 0; left: 0; width: min(78vw, 300px);
  border-right: 1px solid var(--line); box-shadow: 12px 0 34px color-mix(in srgb, var(--schatten-farbe) 65%, transparent);
  padding: 12px 9px;
}
.nb-mehrfach {
  left: 0; right: 0; bottom: 0; max-height: 70vh;
  border-top: 1px solid var(--line); box-shadow: 0 -12px 34px color-mix(in srgb, var(--schatten-farbe) 65%, transparent);
  border-radius: 14px 14px 0 0;
}
.nb-railfach .kopf, .nb-mehrfach .kopf {
  padding: 4px 11px 10px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3);
}
.nb-mehrfach .kopf { padding: 14px 16px 8px; }
/* Die Zwischenueberschrift eines Abschnitts - dieselbe wie in der Spalte am Desktop, damit das
   Fach am Handy nicht anders gegliedert aussieht als die Spalte, die es ersetzt. */
.nb-railfach .sect {
  padding: 16px 11px 6px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--t3);
}
.nb-railfach a, .nb-mehrfach a {
  display: flex; align-items: center; gap: 10px;
  color: var(--t2); text-decoration: none; border-radius: 8px;
}
.nb-railfach a { padding: 9px 11px; font-size: 13px; }
.nb-mehrfach a { padding: 12px 16px; font-size: 14px; border-radius: 0; }
.nb-railfach a.on, .nb-mehrfach a.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }

/* Die Verdunkelung liegt unter den Fächern und über allem anderen. */
.nb-fachschatten {
  position: fixed; inset: 0; z-index: 259; background: var(--veil);
}

/* Der Rückweg aus dem Inhalt zur Liste ist eine Handy-Angelegenheit: Am Desktop stehen beide
   nebeneinander, ein Knopf „zurück zur Liste" führte dort nirgendwohin. */
.nb-zurueck { display: none; }

/* Signaturen (ADR-0144) -------------------------------------------------- */

/* Der Block unter dem Eingabefeld: sichtbar, aber erkennbar NICHT das Feld. Er ist gedaempft und
   hat keinen Cursor - wer hineinklickt, soll merken, dass hier nicht geschrieben wird. */
.nb-signaturblock {
    margin: 8px 0 0;
    padding: 8px 10px;
    border-left: 3px solid var(--nb-rand, var(--line2));
    background: var(--nb-hover);
    border-radius: 0 6px 6px 0;
    opacity: .85;
    user-select: none;
}

.nb-signaturblock .kopf {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    opacity: .7;
}

.nb-signaturblock pre {
    margin: 4px 0 0;
    font: inherit;
    white-space: pre-wrap;
    word-break: break-word;
}

.nb-signaturblock img { max-width: 240px; max-height: 90px; margin-top: 4px; }

/* Die gestaltete Fassung im Verfassen-Bereich: gezeigt, nicht als Quelltext abgedruckt. Der
   Rahmen bleibt gedaempft - es ist eine Vorschau, kein Eingabefeld. */
.nb-signaturblock .gestaltet { margin-top: 4px; overflow-x: auto; }

.nb-signaturblock .gestaltet table { border-collapse: collapse; }

/* Der Editor der Vorlage - wie das Textfeld, nur mit Inhalt statt Zeilen. */
.nb-signaturpflege .nb-editor {
    min-height: 220px;
    overflow-y: auto;
}

.nb-signaturpflege .nb-editor table { border-collapse: collapse; }

.nb-farbprobe { padding: 1px 8px; border-radius: 4px; }

/* Hell schreiben, obwohl das Programm dunkel laeuft ------------------------
   Es geht um die ANSICHT, nicht um die Nachricht: Was hinausgeht, traegt keinen Hintergrund. Der
   Schalter beantwortet „wie sieht das beim Empfaenger aus" - und die Frage stellt sich, seit die
   Signatur gestaltet sein darf. Dunkelgraue Schrift aus einer Agenturvorlage sieht im dunklen
   Flow richtig aus und ist auf weissem Grund kaum zu lesen.

   Gesetzt wird BEIDES, Grund und Schrift: Nur den Grund zu wechseln ergaebe helles Weiss mit
   hellgrauer Schrift - genau der Fehler, den der Schalter sichtbar machen soll. */
.nb-antwort.hell .nb-antwort-feld,
.nb-antwort.hell .nb-signaturblock,
.nb-antwort.hell .nb-antwort-vorschau {
    background: var(--papier);
    color: var(--papier-text);
    color-scheme: light;
}

.nb-antwort.hell .nb-antwort-feld a,
.nb-antwort.hell .nb-signaturblock a { color: var(--papier-verweis); }

.nb-antwort.hell .nb-signaturblock {
    border-left-color: var(--papier-linie);
    opacity: 1;
}

.nb-antwort.hell .nb-signaturblock .kopf { color: var(--papier-leise); }

.nb-signaturpflege .nb-tbar button.an { background: color-mix(in srgb, var(--t2) 20%, transparent); }

/* Die Pflege: eine Zeile je Signatur, das Formular klappt darunter auf. */
.nb-signaturpflege .zeile {
    border: 1px solid var(--line2);
    border-radius: 6px;
    margin-bottom: 6px;
}

.nb-signaturpflege .kopf {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 8px;
    cursor: pointer;
}

.nb-signaturpflege .kopf .name { font-weight: 600; }

.nb-signaturpflege .art {
    font-size: .72rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    opacity: .6;
}

.nb-signaturpflege .formular { padding: 0 8px 10px; }

.nb-signaturpflege .bild { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

.nb-signaturpflege .bild img { max-width: 180px; max-height: 70px; }

.nb-signaturpflege .bild .hinweis { font-size: .75rem; opacity: .6; }

.nb-signaturpflege .knoepfe { display: flex; gap: 8px; }

.nb-signaturpflege .wo { font-size: .75rem; opacity: .55; }

/* Das Textfeld der Vorlage: dieselbe Anmutung wie der Antwortbereich, damit die Leiste darueber
   erkennbar dazugehoert. */
.nb-signaturfeld {
    width: 100%;
    margin-top: 6px;
    padding: 8px 10px;
    border: 1px solid var(--line2);
    border-radius: 6px;
    background: transparent;
    color: inherit;
    font: inherit;
    resize: vertical;
}

/* Die Platzhalter zum Klicken - „{NAME}" abzuschreiben ist genau die Stelle fuer einen
   Tippfehler, den erst der Empfaenger sieht. */
.nb-signaturpflege .platzhalter {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    margin-top: 6px;
}

.nb-signaturpflege .platzhalter .k { font-size: .75rem; opacity: .6; }

.nb-signaturpflege .platzhalter button {
    border: 1px solid var(--line2);
    border-radius: 4px;
    background: transparent;
    color: inherit;
    font: inherit;
    font-size: .78rem;
    padding: 1px 6px;
    cursor: pointer;
}

.nb-signaturpflege .platzhalter button:hover { background: color-mix(in srgb, var(--t2) 12%, transparent); }

/* Ein Abschnitt als KARTE (mj, 18.09.2026, nach dem Vorbild von Jira): Ueberschrift, Erklaerung
   und Inhalt gehoeren sichtbar zusammen. Vorher standen drei Abschnitte untereinander, nur durch
   eine Linie getrennt - und die Ueberschrift sah aus wie der Text darunter. */
.nb-abschnitt {
  border: 1px solid var(--line2);
  border-radius: 8px;
  padding: 14px 16px 16px;
  margin-bottom: 18px;
}

/* Ueberschrift und Anlegen-Knopf in EINER Zeile - der Knopf sitzt oben rechts, wie ueberall
   sonst im Haus (mj, 18.09.2026). */
.nb-abschnitt > .kopf {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 2px;
}

.nb-abschnitt h2 {
  margin: 0 0 2px;
  font-size: 15px;
  font-weight: 700;
  letter-spacing: .01em;
}

.nb-abschnitt > .kopf h2 { margin-bottom: 0; }

/* Die Erklaerung traegt die Begruendung und wird einmal gelesen - sie darf nicht so laut sein
   wie die Ueberschrift darueber. */
.nb-abschnitt > .erklaerung {
  margin: 0 0 12px;
  font-size: 13px;
  opacity: .7;
  line-height: 1.45;
}

/* Wer unterschreibt womit - eine Zeile je Zuweisung, gelesen von links nach rechts. */
.nb-zuweisungen .zeile {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 8px;
    border-bottom: 1px solid var(--line);
}

.nb-zuweisungen .zeile .ziel { font-weight: 600; min-width: 180px; }

.nb-zuweisungen .zeile .art {
    font-size: .72rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    opacity: .6;
}

.nb-zuweisungen .neu {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    margin-top: 10px;
}

.nb-zuweisungen .neu .mud-input-control { min-width: 220px; max-width: 320px; }

/* „Filter" steht neben dem Feld, nicht darin - und buendig mit dem rechten Tabellenrand.

   „margin-left:auto" statt eines Zwischenraums, und „flex:0 0 auto" ist das Entscheidende: Der
   Rahmen eines MudSelect traegt „flex: 1 1 auto" und nimmt in einer Flex-Zeile den ganzen Rest.
   Das sichtbare Feld bleibt darin links stehen - es sah aus, als klebte der Filter mitten in der
   Zeile, obwohl die Zeile sehr wohl bis zum Rand ging. */
.nb-pf-filter {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
  margin-left: auto;
}

.nb-pf-filter .mud-input-control { flex: 0 0 auto; width: 220px; }

.nb-pf-filterwort { font-size: 13px; opacity: .7; white-space: nowrap; }

/* Der Bedingungs-Baukasten (Entwurf mj, 21.09.2026) - heute im Quellfilter der Ablage.
   Die Einrückung mit farbiger Kante ist der Ersatz für Klammern: Man sieht die Schachtelung,
   ohne sie lesen zu müssen. */
/* Jede Ebene eine Spur heller als die darüber.

   Das ist keine Verzierung: Ohne Farbunterschied muss man die Einrückung ABZÄHLEN, um zu
   sehen, welche Zeile zu welchem „oder" gehört - und bei drei Ebenen zählt niemand mehr
   richtig. Mit der Staffelung sieht man es, ohne hinzusehen (Entwurf mj, 21.09.2026).

   Gemischt wird gegen die Primärfarbe, nicht gegen Weiß: Im dunklen Erscheinungsbild wird es
   damit heller, im hellen kräftiger - in beiden Fällen unterscheidbar. Gegen Weiß gemischt
   wäre im hellen Bild ab der zweiten Ebene nichts mehr zu erkennen. */
.nb-regelgruppe {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 3px;
    padding: .5rem;
    /* Rückfall für Browser ohne color-mix: einfarbig, aber nie ohne Hintergrund. */
    background: var(--mud-palette-surface);
    background: color-mix(
        in srgb,
        var(--mud-palette-primary) calc(4% + var(--stufe, 0) * 4%),
        var(--mud-palette-surface));
}

.nb-regelgruppe:not(.oben) {
    margin: .4rem 0;
    /* Die Kante trägt die Schachtelung zusätzlich zur Farbe - wer Farben schlecht
       unterscheidet, sieht die Zugehörigkeit trotzdem. */
    border-left: 3px solid var(--mud-palette-primary);
}

/* Die Zeilen selbst bleiben neutral: Läge über dem getönten Grund noch eine zweite Tönung,
   verschwämme der Unterschied zwischen „Zeile" und „Gruppe". Neutral heißt seit 06.10.2026 die
   Feldfarbe, die überall gilt - sonst stünde im Feld ein zweifarbiger Kasten. */
.nb-regelzeile .mud-input-slot {
    background: var(--feld);
}

.nb-regelgruppe > .kopf {
    display: flex;
    align-items: center;
    gap: .6rem;
    margin-bottom: .4rem;
}

.nb-regelgruppe > .kopf .verknuepfung {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    font: inherit;
    font-weight: 600;
    font-size: .8rem;
    letter-spacing: .04em;
    padding: .2rem .55rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 3px;
    background: var(--mud-palette-background);
    color: inherit;
    cursor: pointer;
}

.nb-regelgruppe > .kopf .verknuepfung:hover {
    border-color: var(--mud-palette-primary);
}

.nb-regelgruppe > .kopf .erklaerung {
    font-size: .8rem;
    opacity: .7;
}

.nb-regelgruppe .rechts {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: .4rem;
}

/* Die Zahl je Zeile: rechtsbündig und in gleicher Breite, damit die Spalte steht. */
.nb-regelgruppe .zahl {
    min-width: 4.5rem;
    text-align: right;
    font-size: .8rem;
    font-variant-numeric: tabular-nums;
    opacity: .75;
    padding: .15rem .4rem;
    background: var(--mud-palette-background-grey);
    border-radius: 2px;
}

.nb-regelgruppe > .zeilen {
    padding-left: .5rem;
}

.nb-regelzeile {
    display: flex;
    align-items: center;
    gap: .5rem;
    margin-bottom: .3rem;
}

.nb-regelzeile .feld { max-width: 15rem; flex: 1 1 15rem; }
.nb-regelzeile .op { max-width: 12rem; flex: 1 1 12rem; }
.nb-regelzeile .wert { max-width: 14rem; flex: 1 1 14rem; }
.nb-regelzeile .wert.zahl { max-width: 7rem; flex: 0 0 7rem; }
.nb-regelzeile .einheit { max-width: 6.5rem; flex: 0 0 6.5rem; }

.nb-regelgruppe > .zeilen > .fuss {
    display: flex;
    gap: .5rem;
    margin-top: .4rem;
}

/* Die Aufgaben im Reiter - waagrecht statt in einer Spalte.

   Eine eigene Spalte kostete dauerhaft Breite fuer meist EINE Aufgabe, und wer „Meine Arbeit"
   offen hat, sieht seine Aufgaben ohnehin links (Abnahme mj, 21.09.2026). */
.nb-aufgabenleiste {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding-bottom: 10px; border-bottom: 1px solid var(--line); margin-bottom: 12px;
}

.nb-aufgabenleiste .karte {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 10px; border: 1px solid var(--line); border-radius: 6px;
  background: var(--surf2); color: var(--t1); font: inherit; font-size: 12.5px;
  cursor: pointer; max-width: 22rem;
}
.nb-aufgabenleiste .karte:hover { border-color: var(--pri); }
/* Die gewaehlte traegt den Rahmen, nicht nur eine andere Fuellung: Bei zwei Karten
   nebeneinander ist eine Fuellung allein schwer auszumachen. */
.nb-aufgabenleiste .karte.gewaehlt { border-color: var(--pri); box-shadow: 0 0 0 1px var(--pri); }
.nb-aufgabenleiste .karte.faellig .nr { color: var(--bad); font-weight: 700; }
.nb-aufgabenleiste .karte .nr { font-variant-numeric: tabular-nums; opacity: .8; }
.nb-aufgabenleiste .karte .titel {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-aufgabenleiste .karte .st { font-size: 11px; padding: 1px 6px; border-radius: 10px; }
.nb-aufgabenleiste .karte .st.inarbeit { background: color-mix(in srgb, var(--pri) 20%, transparent); color: var(--pri); }
.nb-aufgabenleiste .karte .st.wartet { background: color-mix(in srgb, var(--warn) 22%, transparent); color: var(--warn); }
.nb-aufgabenleiste .karte .st.erledigt { background: color-mix(in srgb, var(--ok) 20%, transparent); color: var(--ok); }
.nb-aufgabenleiste .karte .st.verworfen { opacity: .6; text-decoration: line-through; }

.nb-aufgabenfelder { max-width: 46rem; }

/* Die Zahl am Reiter - dieselbe Anmutung wie die Zaehler in der Leiste. */
.nb-pf-reiter button .anzahl {
  margin-left: 5px; padding: 0 5px; border-radius: 9px;
  background: var(--surf3); font-size: 11px; font-variant-numeric: tabular-nums;
}

/* Wer die Aufgabe hat - in der Karte der Leiste.
   „noch niemand" gedaempft: Es ist eine Auskunft, aber keine Person. */
.nb-aufgabenleiste .karte .wer {
  display: inline-flex; align-items: center; gap: 2px;
  font-size: 11.5px; opacity: .85; white-space: nowrap;
}
.nb-aufgabenleiste .karte .wer.offen { opacity: .55; font-style: italic; }

/* Mehrere Zeilen auf einmal (Abnahme mj, 21.09.2026).

   Das Briefsymbol IST die Auswahl - ein eigener Umschalter „Mehrfachauswahl" waere ein Knopf,
   den man erst findet, wenn man weiss, dass es ihn gibt, und danach vergisst auszuschalten. */
.nb-pf-zeile .sym .feld { position: relative; cursor: pointer; border-radius: 4px; }
.nb-pf-zeile .sym .feld .haken { display: none; }

/* Beim Darueberfahren tritt der leere Kasten an die Stelle des Briefs - so sieht man, dass hier
   etwas zu waehlen ist, ohne dass ein zweites Zeichen die Zeile verbreitert. */
.nb-pf-zeile .sym .feld:hover > .mud-icon-root:first-child { display: none; }
.nb-pf-zeile .sym .feld:hover .haken { display: inline-flex; }
.nb-pf-zeile .sym .feld.gewaehlt { color: var(--pri); }
.nb-pf-zeile .sym .feld.gewaehlt:hover > .mud-icon-root:first-child { display: inline-flex; }
.nb-pf-zeile .sym .feld.gewaehlt:hover .haken { display: none; }

/* Die Zahl bleibt stehen, auch wenn man die gewaehlten Zeilen weggescrollt hat. Der Hinweis auf die
   Loeschvorschlaege (ADR-0133) ist dieselbe Art Leiste: eine Aussage ueber die ganze Liste darunter. */
.nb-pf-auswahl, .nb-pf-vorschlag {
  display: flex; align-items: center; gap: 8px;
  padding: 4px 10px; font-size: 12.5px;
  background: color-mix(in srgb, var(--pri) 14%, transparent);
  border-bottom: 1px solid var(--line);
}

/* Dateivorschau: feste Fenstergröße, damit der Rahmen nicht bei jeder Datei springt. Wer drei
   Anhänge nacheinander ansieht, soll den Schließen-Knopf immer an derselben Stelle finden.

   Die Höhe steht am PAPIER, nicht am Inhalt: „mud-dialog-content" ist „flex: 1 1 auto" und
   nimmt damit die Höhe seines Inhalts - ein <object> ohne Höhe sind 150px, und genau so sah das
   Fenster beim ersten Versuch auch aus. */
/* Seit flow-design-006 trägt die Fensterhülle die feste Höhe (groß); die Fläche füllt ihre Spalte. */
.nb-vorschau .nb-bogen-links > * { flex: 1 1 auto; min-height: 0; }

.nb-vorschau-inhalt {
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

.nb-vorschau-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nb-vorschau-bild {
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
    margin: auto;
}

.nb-vorschau-pdf {
    width: 100%;
    flex: 1;
    border: 0;
}

.nb-vorschau-text {
    flex: 1;
    overflow: auto;
    margin: 0;
    white-space: pre-wrap;
    word-break: break-word;
    font-size: .85rem;
}

.nb-vorschau-mitte {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    opacity: .7;
    text-align: center;
}

.nb-vorschau-hinweis {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .4rem .6rem;
    font-size: .8rem;
    opacity: .75;
}

/* Wer hinter einer Nachricht steht (Schritt A). Neben der Adresse, nicht statt ihr: Die Adresse
   ist die Tatsache, der Kontakt die Zuordnung dazu. */
.nb-kontaktzeile {
    gap: .4rem;
    flex-wrap: wrap;
}

.nb-kontaktchip {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .1rem .5rem .1rem .35rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 999px;
    background: none;
    color: inherit;
    font: inherit;
    cursor: pointer;
}

.nb-kontaktchip:hover {
    background: var(--mud-palette-action-default-hover);
}

/* Merklich leiser als der Rest der Zeile: „Niemand zugeordnet" ist eine Auskunft, aber keine,
   die man beim Lesen als Erstes braucht. */
.nb-kein-kontakt {
    opacity: .45;
    font-style: italic;
}

/* Der Kontaktvorschlag aus einer Signatur (Schritt C). Gestrichelt und mit dem Funken-Zeichen:
   Er muss ANDERS aussehen als eine Zuordnung. Ein Vorschlag, der wie eine Tatsache aussieht,
   wird zur Tatsache, sobald ihn jemand einmal überliest. */
.nb-vorschlagchip {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .1rem .5rem .1rem .35rem;
    border: 1px dashed var(--mud-palette-warning);
    border-radius: 999px;
    background: none;
    color: inherit;
    font: inherit;
    cursor: pointer;
}

.nb-vorschlagchip:hover {
    background: var(--mud-palette-action-default-hover);
}

.nb-vorschlagchip .pruefen {
    font-size: .7rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    opacity: .7;
}

.nb-vorschlag-hinweis {
    display: flex;
    align-items: flex-start;
    gap: .4rem;
    padding: .5rem .6rem;
    border-radius: var(--mud-default-borderradius);
    background: var(--mud-palette-action-default-hover);
    font-size: .85rem;
}

.nb-vorschlag-tabelle {
    width: 100%;
    border-collapse: collapse;
}

.nb-vorschlag-tabelle td {
    padding: .3rem .5rem .3rem 0;
    vertical-align: top;
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

.nb-vorschlag-tabelle .feld {
    width: 8rem;
    opacity: .6;
    font-size: .85rem;
}

.nb-vorschlag-tabelle .wert {
    word-break: break-word;
}

/* ── Ablauf-Designer (ADR-0159) ─────────────────────────────────────────────────────────────
   Drei Spalten: Palette, Leinwand, Eigenschaften. Die Leinwand nimmt, was übrig bleibt - eine
   feste Breite wäre auf einem kleinen Bildschirm eine Briefmarke und auf einem großen Verschwendung.
   Die Farben kommen aus MudBlazors Variablen, damit hell und dunkel ohne zweite Pflege gelten. */
/* Die ganze Seite ist eine Spalte mit fester Höhe - und die Leinwand nimmt, was übrig bleibt.
   Vorher stand an der Leinwand eine gerechnete Höhe (100vh minus geschätzter Kopf). Sobald der
   Probe-Streifen aufging, wuchs die Seite darüber hinaus und bekam einen eigenen Scrollbalken:
   Man scrollte die Seite, wo man die Leinwand schieben wollte (mj, 26.09.2026). */
.nb-designer-seite {
    display: flex;
    flex-direction: column;
    gap: .5rem;

    /* Die Höhe des Bereichs, den das Layout uns gibt - nicht die des Fensters. */
    height: 100%;
    min-height: 0;
    overflow: hidden;
}

/* min-height: 0 ist der Punkt: Ohne das wächst ein Flex-Kind über seinen Anteil hinaus, statt zu
   schrumpfen - und genau daraus entsteht der Scrollbalken, den es nicht geben soll. */
/* Die Leinwand bekommt die Breite (ADR-0159, Runde 6). Die Palette war 200 Pixel, die
   fest dastanden - benutzt wird sie beim Einfügen, nicht beim Verdrahten. Sie ist jetzt ein
   Bereich, der sich öffnet und wieder schließt.

   Die rechte Spalte bleibt noch; sie wird in A4 zum Fenster. Beides in einem Zug hätte die
   Einstellungen zwischen zwei Commits ohne Ort gelassen. */
/* EINE Spalte. Die 300 px rechts waren eine Eigenschaftsmaske, die immer dastand - auf einem
   1366er Laptop fast ein Viertel der Breite für etwas, das man selten braucht. Sie ist jetzt ein
   Fenster (A4, 27.09.2026). */
.nb-designer {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: .75rem;
    flex: 1 1 auto;
    min-height: 0;
}

/* Der Probe-Streifen nimmt höchstens ein Drittel und scrollt in sich - nicht die Seite. */
.nb-probe {
    flex: 0 0 auto;
    max-height: 33vh;
    overflow: auto;
}

.nb-designer > div {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    background: var(--mud-palette-surface);
    overflow: auto;
}

/* ── Das Fensterraster ──────────────────────────────────────────────────────────────────────
   DIE HUELLE JEDES ARBEITSFENSTERS, aus der UI-Basis (oben): Seitenleiste 210, Inhalt flexibel,
   Detail 320. Zuerst gab es sie nur bei der Bausteinwahl; beim zweiten Fenster derselben Art
   wäre eine Abschrift entstanden, und Abschriften laufen auseinander (mj, 29.09.2026: „das
   möchte ich überall").

   FESTE HOEHE, NICHT MITWACHSEND. Ein Fenster, das sich nach seinem Inhalt richtet, springt bei
   jedem Filter in eine andere Größe - man klickt eine Zeile an und der Knopf darunter ist
   woanders. Gescrollt wird INNERHALB der Spalten, jede für sich.

   Alle Farben und Maße kommen aus Variablen: Eine feste Farbe hier nähme dem Farb-Designer die
   Stelle, an der er sie ändern könnte. */
.nb-fensterraster {
    display: grid;
    grid-template-columns: var(--nb-breite-seitenleiste) minmax(0, 1fr) var(--nb-breite-detail);
    gap: 0;

    height: 50vh;
    min-height: 380px;
    margin: -.5rem -1rem;
    border-top: 1px solid var(--mud-palette-lines-default);
}

/* Ohne Leiste zweispaltig: ob links etwas hingehört, entscheidet das Fenster (mj, 10.10.2026). */
.nb-fensterraster.ohne-leiste { grid-template-columns: minmax(0, 1fr) var(--nb-breite-detail); }

/* Formulare: Felder stehen untereinander, dafür braucht es mehr Höhe als eine Auswahl - fest, nicht mitwachsend. */
.nb-fensterraster.formular { height: min(72vh, 760px); }

/* Ein Zeichen als Symbol (Kategorien: ◆ ★ ▲) braucht die Größe, die ein Bild-Symbol von selbst hat. */
.nb-fensterraster .symbol { font-size: 1.05rem; line-height: 1; }
.nb-fensterraster .symbol.gross { font-size: 1.6rem; }

/* Beschriftungen von Häkchen und Schaltern in der Bedienschrift - MudBlazor nimmt sonst die Textgröße. */
.nb-fensterraster .mitte .mud-checkbox .mud-typography,
.nb-fensterraster .mitte .mud-switch .mud-typography,
.nb-fensterraster .einzelheit .mud-switch .mud-typography { font-size: var(--nb-schrift-bedienung); }

/* Leise Nebenaktionen (Löschen, Zurücksetzen) über dem Primärknopf - links, nie gefüllt. */
.nb-fensterraster .einzelheit .nebenaktionen { display: flex; flex-wrap: wrap; gap: .25rem; margin-top: var(--nb-abstand-gruppen); }

/* Unter 900 px rutschen Leiste und Einzelheit unter die Mitte, statt alle drei unlesbar schmal zu machen. */
@media (max-width: 900px) {
    .nb-fensterraster, .nb-fensterraster.ohne-leiste { grid-template-columns: minmax(0, 1fr); height: auto; max-height: 86vh; }
}

/* Die Hülle um Felder, in denen Enter schon etwas bedeutet (EnterImFeld.razor): ohne eigenen Kasten - das Feld steht
   im Raster, in der Zeile, in der Spalte wie ohne sie. Die Primärknopf-Regeln weiter unten lesen deshalb ohne „>“. */
.nb-enter-im-feld { display: contents; }

/* Jede Spalte scrollt für sich - nicht das Fenster als Ganzes. */
.nb-fensterraster > * { overflow-y: auto; padding: var(--nb-abstand-fenster); }

.nb-fensterraster .filter {
    background: color-mix(in srgb, var(--mud-palette-background) 55%, var(--mud-palette-surface));
    border-right: 1px solid var(--mud-palette-lines-default);
}

/* Spalte in Flussrichtung, damit der Primär-Knopf unten stehen bleiben kann (UI-Basis, Punkt 5). */
.nb-fensterraster .einzelheit {
    display: flex;
    flex-direction: column;
    background: color-mix(in srgb, var(--mud-palette-background) 35%, var(--mud-palette-surface));
    border-left: 1px solid var(--mud-palette-lines-default);
}

.nb-fensterraster .gruppentitel {
    font-family: var(--nb-schriftart-bedienen);
    margin: var(--nb-abstand-gruppen) 0 .35rem;
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-gruppenlabel);
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.nb-fensterraster .gruppentitel:first-child { margin-top: 0; }

/* ── Die Filterzeilen der linken Spalte ───────────────────────────────────────────────────────
   Gehören zur Hülle, nicht zu einem einzelnen Fenster: Eine Zeile mit Name und Zahl sieht in
   jedem dieser Fenster gleich aus, und zwei Fassungen davon wären zwei Arten, dasselbe zu tun.

   JUSTIFY-CONTENT AUSDRÜCKLICH: Ein <button> ist im Browser-Stilblatt mittig ausgerichtet, und
   das gilt auch, wenn man ihn zu einem Flex-Kasten macht. Ohne diese Zeile stand der Inhalt
   jeder Zeile woanders - je nach Textlänge (mj, 27.09.2026). */
.nb-fensterraster .filterzeile {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: .5rem;
    width: 100%;
    padding: .45rem .6rem;
    margin-bottom: var(--nb-abstand-eintraege);
    border: none;
    border-radius: var(--nb-radius-knopf);
    background: transparent;
    color: var(--mud-palette-text-secondary);
    font: inherit;
    font-size: var(--nb-schrift-bedienung);
    text-align: left;
    cursor: pointer;
}

.nb-fensterraster .filterzeile:hover { background: var(--nb-hover); }

.nb-fensterraster .filterzeile.an {
    background: var(--nb-aktiv);
    color: var(--mud-palette-text-primary);
    font-weight: 600;
}

.nb-fensterraster .filterzeile .name { flex: 1 1 auto; min-width: 0; }

/* Die Zahl sagt, dass es dort etwas gibt - ohne dass man klicken muss. */
.nb-fensterraster .filterzeile .zahl {
    flex: 0 0 auto;
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
    font-weight: 400;
}

/* ── Der Detailbereich und die Leermeldung ────────────────────────────────────────────────────
   Ebenfalls Hülle: Überschrift, erklärender Absatz, Leerhinweis und genau EIN Primär-Knopf
   unten rechts. */
.nb-fensterraster .leer { padding: 1rem .25rem; }

.nb-fensterraster .einzelheit .detailtitel {
    font-family: var(--nb-schriftart-bedienen);
    font-size: var(--nb-schrift-detailtitel);
    font-weight: 600;
    line-height: 1.3;
}

.nb-fensterraster .einzelheit .beschreibung {
    font-size: var(--nb-schrift-text);
    line-height: 1.55;
    color: var(--mud-palette-text-secondary);
}

/* Genau ein Primär-Knopf je Fenster, und er steht dort, wo die Wahl beschrieben wird (UI-Basis,
   Punkt 5): unten im Detailbereich. */
.nb-fensterraster .einzelheit .primaer {
    height: 44px;
    border-radius: var(--nb-radius-knopf);
    text-transform: none;
    font-size: var(--nb-schrift-bedienung);
    font-weight: 600;
}

/* ── Die Bausteinwahl ───────────────────────────────────────────────────────────────────────
   Die Hülle steht oben im Fensterraster; hier stehen nur noch die Eigenheiten. Alle Farben und
   Maße kommen aus Variablen - eine feste Farbe hier nähme dem Farb-Designer die Stelle, an der
   er sie ändern könnte. */
.nb-fensterraster .filterzeile .punkt {
    flex: 0 0 auto;
    width: .45rem;
    height: .45rem;
    border-radius: 50%;
    background: var(--nb-kategorie, var(--nb-kat-neutral));
}

/* ── Die Farbe je Kategorie ───────────────────────────────────────────────────────────────────
   Eine Zuordnung für Punkt, Symbol, Untertitel und Marke. Eine Kategorie, die an vier Stellen
   anders aussieht, muss man viermal lernen. */
.nb-bausteinwahl .ausloeser { --nb-kategorie: var(--nb-kat-ausloeser); }
.nb-bausteinwahl .verarbeitung { --nb-kategorie: var(--nb-kat-verarbeitung); }
.nb-bausteinwahl .logik { --nb-kategorie: var(--nb-kat-logik); }
.nb-bausteinwahl .aktion { --nb-kategorie: var(--nb-kat-logik); }
.nb-bausteinwahl .ausgabe { --nb-kategorie: var(--nb-kat-ausgabe); }
.nb-bausteinwahl .ki { --nb-kategorie: var(--nb-kat-verarbeitung); }

/* ── Die Trefferliste ─────────────────────────────────────────────────────────────────────── */
.nb-fensterraster .eintrag {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: .75rem;
    width: 100%;
    padding: .6rem .7rem;
    margin-bottom: var(--nb-abstand-eintraege);
    text-align: left;
    border: 1px solid transparent;
    border-radius: var(--nb-radius-eintrag);
    background: transparent;
    color: var(--mud-palette-text-primary);
    font: inherit;
    cursor: pointer;
}

.nb-fensterraster .eintrag:hover { background: var(--nb-hover); }

.nb-fensterraster .eintrag.an {
    border-color: var(--mud-palette-primary);
    background: var(--pri-w);
}

.nb-fensterraster .symbol {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 2.1rem;
    height: 2.1rem;
    border-radius: var(--nb-radius-eintrag);
    background: color-mix(in srgb, var(--nb-kategorie, var(--mud-palette-primary)) var(--nb-kat-flaeche), transparent);
    color: var(--nb-kategorie, var(--mud-palette-primary));
}

.nb-fensterraster .symbol.gross { width: 3.2rem; height: 3.2rem; border-radius: var(--nb-radius-marke); }

.nb-fensterraster .eintrag .text {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    min-width: 0;
}

.nb-fensterraster .eintrag .titel {
    font-family: var(--nb-schriftart-bedienen);
    font-weight: 600;
    font-size: var(--nb-schrift-eintrag);
}

/* Kein abgeschnittener Text in Listen: Name und Kategorie, mehr nicht - die volle Beschreibung
   gehört ins Detail (UI-Basis, Punkt 5). */
.nb-fensterraster .eintrag .unter {
    font-size: var(--nb-schrift-beiwerk);
    color: var(--nb-kategorie, var(--mud-palette-text-secondary));
}


.nb-fensterraster .marken { display: flex; flex-wrap: wrap; gap: .35rem; }

/* Die Kategorie-Marke in ihrer Farbe, alles andere neutral (UI-Basis, Punkt 4). */
.nb-fensterraster .marke {
    padding: .15rem .55rem;
    border-radius: var(--nb-radius-marke);
    font-size: var(--nb-schrift-beiwerk);
    background: color-mix(in srgb, var(--nb-kategorie, var(--nb-kat-neutral)) var(--nb-kat-flaeche), transparent);
    color: var(--nb-kategorie, var(--nb-kat-neutral));
}

.nb-fensterraster .marke.sparte {
    background: var(--nb-hover);
    color: var(--mud-palette-text-secondary);
}


/* ── Der Nachrichtenfilter ──────────────────────────────────────────────────────────────────
   Zweites Fenster im Fensterraster (ADR-0165). Hier stehen nur die Wahlzeilen: eine Zeile mit
   Häkchen, Farbpunkt, Name und Zahl. Alles andere - Raster, Spalten, Detailbereich, Primär-
   Knopf - kommt aus der Hülle. */
.nb-nachrichtenfilter .wahlzeile {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: .35rem;
    width: 100%;
    padding: .15rem .5rem;
    margin-bottom: var(--nb-abstand-eintraege);
    border: none;
    border-radius: var(--nb-radius-knopf);
    background: transparent;
    color: var(--mud-palette-text-primary);
    font: inherit;
    font-size: var(--nb-schrift-bedienung);
    text-align: left;
    cursor: pointer;
}

.nb-nachrichtenfilter .wahlzeile:hover { background: var(--nb-hover); }

/* Weggenommenes bleibt LESBAR, nur blass: Ausgegraut bis zur Unkenntlichkeit sähe aus wie
   „gesperrt", und man soll ja gerade sehen können, was man sich wegnimmt. */
.nb-nachrichtenfilter .wahlzeile.aus .name,
.nb-nachrichtenfilter .wahlzeile.aus .zahl { color: var(--mud-palette-text-disabled); }
.nb-nachrichtenfilter .wahlzeile.aus .punkt { opacity: .4; }

.nb-nachrichtenfilter .wahlzeile .name { flex: 1 1 auto; min-width: 0; }

.nb-nachrichtenfilter .wahlzeile .zahl {
    flex: 0 0 auto;
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
}

/* Der Ring statt eines Punktes: „Unsortiert" ist keine Kategorie, sondern deren Fehlen - es
   traegt deshalb auch keine Farbe, sondern dasselbe Zeichen wie in der Leiste. */
.nb-nachrichtenfilter .wahlzeile .ring {
    flex: 0 0 auto;
    width: .5rem;
    line-height: 1;
    color: var(--mud-palette-warning);
    font-size: var(--nb-schrift-beiwerk);
}

.nb-nachrichtenfilter .wahlzeile.aus .ring { opacity: .4; }

.nb-nachrichtenfilter .wahlzeile .punkt {
    flex: 0 0 auto;
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
}

/* Das Häkchen ist Anzeige, nicht Bedienelement - geklickt wird die ganze Zeile. Ohne das
   Abschalten der Zeigerereignisse fängt die Box den Klick ab und die Zeile daneben tut nichts. */
.nb-nachrichtenfilter .wahlzeile .mud-checkbox { pointer-events: none; margin: 0; }

.nb-nachrichtenfilter .mitte .hinweis {
    margin-top: .5rem;
    font-size: var(--nb-schrift-beiwerk);
    color: var(--mud-palette-text-secondary);
}

.nb-nachrichtenfilter .bilanz { margin: .5rem 0 0; padding-left: 1.1rem; }

.nb-nachrichtenfilter-fenster .mud-dialog-content {
    overflow: hidden;
    padding-bottom: 0;
}

.nb-designer .leinwand { position: relative; overflow: hidden; }
.nb-designer .leinwand .diagram-canvas { width: 100%; height: 100%; }

/* Untereinander, nicht nebeneinander: Der Satz erklärt, der Knopf handelt - in einer Zeile
   liest man beides als eine Zeile und übersieht, dass der zweite Teil anklickbar ist. */
.nb-designer .nichts {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .75rem;
    height: 100%;
    padding: 1rem;
    text-align: center;
    color: var(--mud-palette-text-secondary);
    font-size: .85rem;
}

/* ════════════════════════════════════════════════════════════════════════════════════════════
   UI-BASIS — die Werte, aus denen sich jedes Fenster zusammensetzt (Entwurf mj, 27.09.2026)

   WAS HIER STEHT UND WAS NICHT: Flächen, Text, Linien und die Akzentfarbe stehen in
   NetbitsTheme.cs, weil MudBlazor daraus die --mud-palette-*-Variablen erzeugt und der
   Design-Manager je Bereich darauf aufsetzt. Hier stehen nur die Werte, für die MudBlazor
   keinen Platz hat - Kategorienfarben, Zustände und die Maße.

   WARUM ÜBERHAUPT VARIABLEN: Damit ein Farb-Designer später eine Stelle überschreibt statt
   fünfzig. Wer eine Farbe fest in eine Regel schreibt, nimmt ihm genau diese Möglichkeit.

   EINE FARBE JE KATEGORIE, KEINE ZWEITE FÜR HELL: Die Werte sind mitteltonig und tragen auf
   beiden Untergründen. Ihre Flächen entstehen mit color-mix aus der jeweils geltenden
   Oberfläche - so passen sie sich an, ohne dass es eine zweite Liste gäbe.
   ════════════════════════════════════════════════════════════════════════════════════════════ */
:root {
    /* ── Kategorien: Farbe transportiert Bedeutung, nie Dekoration ────────────────────────── */
    /* Die Farben der Kategorien stehen im Designkatalog (design-vorgaben.css). Aktion und KI hatten
       dieselben Werte wie Logik und Verarbeitung und sind darin aufgegangen; Fehler ist das Fehlerrot. */
    --nb-kat-neutral: var(--t2);

    /* Wie kräftig die Fläche einer Kategorie unter ihrer Farbe liegt. */
    --nb-kat-flaeche: 16%;

    /* ── Zustände: --nb-hover und --nb-aktiv im Designkatalog, „gewählt“ ist --pri-w ───────────── */

    /* ── Maße: 4er-Raster ─────────────────────────────────────────────────────────────────── */
    --nb-abstand-fenster: 20px;
    --nb-abstand-eintraege: 4px;
    --nb-abstand-gruppen: 20px;

    --nb-radius-knopf: 8px;
    --nb-radius-eintrag: 10px;
    --nb-radius-marke: 12px;
    --nb-radius-fenster: 14px;

    /* ── Schriftgrößen: im Designkatalog (design-vorgaben.css), einstellbar je Bereich ─────────── */

    /* ── Breiten aus dem Fenster-Aufbau ───────────────────────────────────────────────────── */
    --nb-breite-seitenleiste: 260px; /* mj, 13.10.2026: „spalte links größer“ - Abschnittsnamen in einer Zeile */
    --nb-breite-detail: 320px;
}


/* ── Abläufe verwalten (A8, Entwurf mj 28.09.2026) ──────────────────────────────────────────
   ZWEI SPALTEN: links WO (nur Ordner), rechts WAS. Ein einziger Baum aus beidem hieße scrollen,
   um einen Ordner zu finden, der drei Abläufe weiter unten steht. */
/* DIE FLÄCHEN WIE IN DER BAUSTEINWAHL: Die Spalte mit den Ordnern liegt tiefer als der Inhalt
   daneben, randlos bis an die Fensterkante. Zwei Fenster mit derselben Aufgabe und zwei
   Farbwelten liest man wie zwei verschiedene Werkzeuge (mj, 28.09.2026). */
.nb-ablaufverwaltung {
    display: grid;

    /* Die Ordnerspalte darf mitwachsen, hört aber bei einem Fünftel auf: Ein Ordnername ist kurz,
       und jede Spalte, die breiter ist als ihr Inhalt, nimmt der Liste daneben den Platz. */
    grid-template-columns: minmax(230px, 20%) minmax(0, 1fr);
    gap: 0;
    height: 52vh;
    min-height: 340px;

    /* Bis an die Kanten: Das Fenster polstert waagrecht mit 24 px (gemessen in MudBlazor.min.css),
       nicht mit 16 - mit -1rem blieb links und rechts ein Streifen stehen. */
    margin: -.5rem -1.5rem;
    border-top: 1px solid var(--mud-palette-lines-default);
    font-family: var(--nb-schriftart-bedienen);
    font-size: var(--nb-schrift-bedienung);
}

.nb-ablaufverwaltung > * { overflow-y: auto; padding: var(--nb-abstand-fenster); }

.nb-ablaufverwaltung .ordnerspalte {
    background: color-mix(in srgb, var(--mud-palette-background) 55%, var(--mud-palette-surface));
    border-right: 1px solid var(--mud-palette-lines-default);
}

.nb-ablaufverwaltung .ueberschrift,
.nb-ablaufverwaltung .spalten {
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-gruppenlabel);
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.nb-ablaufverwaltung .ueberschrift { margin-bottom: .4rem; }

.nb-ablaufverwaltung .inhalt { display: flex; flex-direction: column; min-width: 0; }

.nb-ablaufverwaltung .kopf {
    display: flex;
    align-items: center;
    gap: .6rem;
    margin-bottom: .75rem;
}

.nb-ablaufverwaltung .kopf .wo {
    font-size: var(--nb-schrift-detailtitel);
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nb-ablaufverwaltung .ebene { white-space: nowrap; }
.nb-ablaufverwaltung .kopf .mud-button-root { white-space: nowrap; }

/* Die Ebene steht dabei, weil es eine Grenze gibt - sie erst beim Anlegen zu nennen käme zu spät. */
.nb-ablaufverwaltung .ebene {
    padding: 1px 8px;
    border-radius: var(--nb-radius-marke);
    background: var(--nb-hover);
    color: var(--mud-palette-text-secondary);
    font-size: var(--nb-schrift-beiwerk);
}

/* ── Die Liste rechts ─────────────────────────────────────────────────────────────────────── */
.nb-ablaufverwaltung .spalten,
.nb-ablaufverwaltung .zeile {
    display: grid;

    /* Der Name bekommt den Rest, der Status nur, was er braucht. Eine feste Statusbreite ließ bei
       schmalem Fenster vom Namen ein „Te…" übrig. */
    grid-template-columns: minmax(0, 1fr) max-content 36px;
    align-items: center;
    gap: .5rem;
    padding: .35rem .5rem;
}

.nb-ablaufverwaltung .spalten { border-bottom: 1px solid var(--mud-palette-lines-default); }

/* Das Sinnbild sitzt IN der Namensspalte, damit die Spaltenkanten über alle Zeilen fluchten. */
.nb-ablaufverwaltung .zeile .sinnbild {
    grid-column: 1;
    grid-row: 1;
    justify-self: start;
    font-size: 1.05rem;
    color: var(--mud-palette-text-secondary);
}

.nb-ablaufverwaltung .zeile .sinnbild.ablauf { color: var(--mud-palette-primary); }

.nb-ablaufverwaltung .zeile .name {
    grid-column: 1;
    grid-row: 1;
    margin-left: 1.7rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nb-ablaufverwaltung .zeile {
    border-radius: var(--nb-radius-eintrag);
    cursor: pointer;
}

.nb-ablaufverwaltung .zeile:hover { background: var(--nb-hover); }
.nb-ablaufverwaltung .zeile.offen { background: var(--pri-w); }
.nb-ablaufverwaltung .zeile.offen .name { color: var(--mud-palette-primary); }
.nb-ablaufverwaltung .zeile .status { color: var(--mud-palette-text-secondary); }

/* Die Zeile zum Anlegen: Feld, Haken, Kreuz - und der Hinweis auf die Tasten. */
/* Die Eingabezeile - dieselbe fürs Anlegen wie fürs Umbenennen. Sie steht an genau der Stelle,
   an der das Ergebnis erscheint; ein Fenster darüber verdeckte den Zusammenhang, in dem man
   gerade arbeitet. */
.nb-ablaufverwaltung .zeile.eingabe { grid-template-columns: auto minmax(0, 1fr) auto auto auto; }
.nb-ablaufverwaltung .zeile.eingabe .sinnbild { grid-column: auto; grid-row: auto; }
.nb-ablaufverwaltung .zeile.eingabe .hinweis {
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
    white-space: nowrap;
}

/* Das Menü erscheint erst beim Überfahren - drei Punkte in jeder Zeile machen die Liste unruhig. */
.nb-ablaufverwaltung .menue { justify-self: end; opacity: 0; }
.nb-ablaufverwaltung .zeile:hover .menue,
.nb-ablaufverwaltung .menue:focus-within { opacity: 1; }

.nb-ablaufverwaltung .leer {
    padding: 1rem .5rem;
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
}

/* KEIN ZWEITER SCROLLBALKEN. Die Flächen reichen mit negativen Rändern bis an die Fensterkante;
   dadurch sind sie breiter als der Inhaltsbereich, und der Browser hängt einen Balken an das
   Fenster - obwohl drinnen jede Spalte schon ihren eigenen hat. Gescrollt wird in den Spalten,
   nicht im Fenster (mj, 28.09.2026). */
.nb-ablaufverwaltung-fenster .mud-dialog-content,
.nb-bausteinwahl-fenster .mud-dialog-content,

/* AM PAPIER WIRD NICHT GESCROLLT - gescrollt wird INNEN, in den beiden Spalten.

   GEMESSEN (mj, 29.09.2026): MudBlazor gibt `.mud-dialog` ein `overflow-y: auto`. Damit kann
   `overflow-x` nicht mehr `visible` bleiben - der Browser rechnet es auf `auto` um, und jede
   Zeile, die breiter ist als das Papier, erzeugt einen waagrechten Balken. Der kostet Höhe, und
   dann kommt der senkrechte gleich mit. Beide standen im Labor da. */
/* DIE KLASSE STEHT AM PAPIER SELBST, nicht an einem Vorfahren (gemessen mj, 29.09.2026):
   `<MudDialog Class="…">` hängt sie an das `.mud-dialog`. Meine erste Fassung schrieb
   `.nb-…-fenster .mud-dialog` - eine Nachfahren-Auswahl, die nichts trifft. Die Regel war tot,
   und der Wächter darüber prüfte toten Stil.

   AM PAPIER WIRD NICHT GESCROLLT: MudBlazor gibt `.mud-dialog` ein `overflow-y: auto`; damit kann
   `overflow-x` nicht mehr `visible` bleiben, und jede zu breite Zeile erzeugt beide Balken. */
.mud-dialog.nb-ablaufverwaltung-fenster,
.mud-dialog.nb-bausteinwahl-fenster,
.mud-dialog.nb-knoteneinstellungen-fenster,
.mud-dialog.nb-fenster {
    overflow: hidden;
}

/* SIEBZIG PROZENT BREIT. Drei Spalten in einem mittelbreiten Fenster sind drei schmale Streifen -
   die Auswahllisten schnitten ihre eigenen Beschriftungen ab. Zwei Klassen schlagen dabei
   MudBlazors `.mud-dialog-width-full` (eine Klasse), das sonst `calc(100% - 64px)` setzt. */
.mud-dialog.nb-knoteneinstellungen-fenster {
    width: 70vw;
    max-width: 70vw;
}

@media (max-width: 1100px) {
    .mud-dialog.nb-knoteneinstellungen-fenster { width: 96vw; max-width: 96vw; }
}

.nb-knoteneinstellungen-fenster .mud-dialog-content {
    overflow: hidden;
    padding-bottom: 0;
}

/* ── Der Ordnerbaum - zweimal gebraucht ───────────────────────────────────────────────────── */
.nb-ordnerbaum .zeile {
    display: flex;
    align-items: center;
    gap: .35rem;
    padding: .25rem .4rem;
    padding-left: calc(.4rem + var(--nb-ebene, 0) * 1rem);
    border-radius: var(--nb-radius-eintrag);
    cursor: pointer;
    user-select: none;
}

/* DIE BEIDEN WURZELN TRAGEN IHRE FARBE - was dem Bereich gehört und was mir, sind zwei
   verschiedene Dinge, und der Unterschied entscheidet, wer es sieht. Eine Beschriftung allein
   übersieht man beim Überfliegen (Entwurf mj, 28.09.2026). */
.nb-ordnerbaum .zeile.wurzel {
    margin-top: .35rem;
    padding-left: .4rem;
    border-left: 3px solid var(--nb-wurzel);
    font-weight: 600;
}

.nb-ordnerbaum .zeile.wurzel .sinnbild { color: var(--nb-wurzel); }
.nb-ordnerbaum .zeile.wurzel.bereich { --nb-wurzel: var(--nb-kat-verarbeitung); }
.nb-ordnerbaum .zeile.wurzel.persoenlich { --nb-wurzel: var(--nb-kat-ausgabe); }

/* Die Ordner darunter erben die Farbe blass - so sieht man auch tief unten noch, in welcher der
   beiden Welten man steht. */
.nb-ordnerbaum .zeile.bereich { --nb-wurzel: var(--nb-kat-verarbeitung); }
.nb-ordnerbaum .zeile.persoenlich { --nb-wurzel: var(--nb-kat-ausgabe); }
.nb-ordnerbaum .zeile:not(.wurzel) .sinnbild {
    color: color-mix(in srgb, var(--nb-wurzel) 55%, var(--mud-palette-text-secondary));
}

.nb-ordnerbaum .zeile:hover { background: var(--nb-hover); }
/* Dieselben Zustandsflächen wie in der Bausteinwahl: --nb-hover beim Überfahren, --nb-aktiv für
   das Gewählte. Eine eigene Farbe hier hieße, dass „gewählt" in zwei Fenstern verschieden
   aussieht. */
.nb-ordnerbaum .zeile.gewaehlt {
    background: var(--nb-aktiv);
    color: var(--mud-palette-text-primary);
}
.nb-ordnerbaum .zeile.gewaehlt .name { font-weight: 600; }

/* Ein Platzhalter statt keines Knopfes: Sonst rückt jede Zeile ohne Unterordner um die
   Knopfbreite nach links, und die Ebenen sind nicht mehr abzulesen. */
.nb-ordnerbaum .klappe {
    flex: 0 0 auto;
    width: 1rem;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--mud-palette-text-secondary);
    font: inherit;
    cursor: pointer;
}

.nb-ordnerbaum .klappe.leer { cursor: default; }
.nb-ordnerbaum .sinnbild { font-size: 1rem; color: var(--mud-palette-text-secondary); }
.nb-ordnerbaum .name { flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.nb-ordnerbaum .zahl,
.nb-ordnerbaum .haken { color: var(--mud-palette-text-disabled); font-size: var(--nb-schrift-beiwerk); }
.nb-ordnerbaum .haken { color: var(--mud-palette-primary); }

.nb-ordnerbaum .marke {
    padding: 1px 8px;
    border-radius: var(--nb-radius-marke);
    background: var(--nb-hover);
    color: var(--mud-palette-text-secondary);
    font-size: var(--nb-schrift-beiwerk);
}

/* ── Das Fenster „Verschieben nach …" ─────────────────────────────────────────────────────── */
.nb-ordnerwahl-fenster .baum {
    max-height: 32vh;
    overflow: auto;
    padding: .35rem;
    background: color-mix(in srgb, var(--mud-palette-background) 55%, var(--mud-palette-surface));
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--nb-radius-eintrag);
}

/* Das Ziel ausgeschrieben: „Entwicklung" allein sagt nicht, WELCHES - denselben Namen darf es an
   mehreren Stellen geben. */
.nb-ordnerwahl-fenster .ziel {
    display: flex;
    align-items: center;
    gap: .6rem;
    margin-top: .75rem;
    padding: .5rem .65rem;
    background: var(--nb-hover);
    border-radius: var(--nb-radius-eintrag);
    font-size: var(--nb-schrift-beiwerk);
}

.nb-ordnerwahl-fenster .ziel .wort { color: var(--mud-palette-text-disabled); }
.nb-ordnerwahl-fenster .ziel .pfad { color: var(--mud-palette-primary); }

/* ── Das Fenster „Ordner löschen?" ────────────────────────────────────────────────────────── */
.nb-ordnerloeschen-fenster .zeichen {
    display: flex;
    padding: .5rem;
    border-radius: var(--nb-radius-eintrag);
    background: color-mix(in srgb, var(--bad) var(--nb-kat-flaeche), transparent);
    color: var(--bad);
}

.nb-ordnerloeschen-fenster .umzug {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .4rem .6rem;
    margin-bottom: .25rem;
    background: var(--nb-hover);
    border-radius: var(--nb-radius-eintrag);
    font-size: var(--nb-schrift-bedienung);
}

.nb-ordnerloeschen-fenster .umzug .name { flex: 1 1 auto; }
.nb-ordnerloeschen-fenster .umzug .ziel { color: var(--mud-palette-text-disabled); }
.nb-ordnerloeschen-fenster .sinnbild { color: var(--mud-palette-primary); font-size: 1rem; }

/* ── Die flache Trefferliste der Suche ────────────────────────────────────────────────────── */
.nb-suchtreffer {
    height: 52vh;
    min-height: 340px;
    overflow: auto;
    margin: -.5rem -1rem;
    padding: var(--nb-abstand-fenster);
    border-top: 1px solid var(--mud-palette-lines-default);
}

.nb-suchtreffer .zeile {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .35rem .5rem;
    border-radius: var(--nb-radius-eintrag);
    cursor: pointer;
}

.nb-suchtreffer .zeile:hover { background: var(--nb-hover); }
.nb-suchtreffer .worte { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.nb-suchtreffer .sinnbild.ablauf { color: var(--mud-palette-primary); }

/* Bei der Suche steht der Pfad dabei: Zwei Abläufe dürfen gleich heißen, wenn sie in
   verschiedenen Ordnern liegen. */
.nb-suchtreffer .pfad { color: var(--mud-palette-text-disabled); font-size: var(--nb-schrift-beiwerk); }
.nb-suchtreffer .leer { padding: 1rem .5rem; color: var(--mud-palette-text-disabled); }

/* ── Der Zustand, überall gleich ──────────────────────────────────────────────────────────── */
.nb-ablaufverwaltung .zustand,
.nb-suchtreffer .zustand,
.nb-ordnerloeschen-fenster .zustand {
    --nb-zustand: var(--nb-kat-neutral);
    padding: 1px 8px;
    border-radius: var(--nb-radius-marke);
    font-size: var(--nb-schrift-beiwerk);
    background: color-mix(in srgb, var(--nb-zustand) var(--nb-kat-flaeche), transparent);
    color: var(--nb-zustand);
}

.nb-ablaufverwaltung .zustand.laeuft,
.nb-suchtreffer .zustand.laeuft,
.nb-ordnerloeschen-fenster .zustand.laeuft { --nb-zustand: var(--nb-kat-ausgabe); }

.nb-ablaufverwaltung .zustand.geaendert,
.nb-suchtreffer .zustand.geaendert,
.nb-ordnerloeschen-fenster .zustand.geaendert { --nb-zustand: var(--nb-kat-verarbeitung); }

.nb-ablaufverwaltung .zustand.aus,
.nb-suchtreffer .zustand.aus,
.nb-ordnerloeschen-fenster .zustand.aus { --nb-zustand: var(--bad); }

/* ── Die Reiterleiste (A6) ──────────────────────────────────────────────────────────────────
   Ein Blatt je offenem Ablauf. Sie sitzt unter der Werkzeugleiste und nimmt eine Zeile - dafür
   entfällt das ständige Umschalten über die Auswahl, bei dem der Entwurf jedes Mal verlorenging. */
.nb-reiterleiste {
    display: flex;
    align-items: stretch;
    gap: 2px;
    overflow-x: auto;
    margin-bottom: .5rem;
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

.nb-reiterleiste .blatt {
    display: flex;
    align-items: center;
    gap: .4rem;
    flex: 0 0 auto;
    max-width: 240px;
    padding: .3rem .25rem .3rem .6rem;
    border: 1px solid transparent;
    border-bottom: none;
    border-radius: var(--nb-radius-knopf) var(--nb-radius-knopf) 0 0;
    color: var(--mud-palette-text-secondary);
    font-family: var(--nb-schriftart-bedienen);
    font-size: var(--nb-schrift-bedienung);
    cursor: pointer;
    user-select: none;
}

.nb-reiterleiste .blatt:hover { background: var(--nb-hover); }

/* Das aktive Blatt hängt an der Fläche darunter: Rand oben und an den Seiten, unten offen. */
.nb-reiterleiste .blatt.aktiv {
    background: var(--nb-aktiv);
    border-color: var(--mud-palette-lines-default);
    color: var(--mud-palette-text-primary);
    margin-bottom: -1px;
}

.nb-reiterleiste .blatt .sinnbild { font-size: 1rem; }

.nb-reiterleiste .blatt .titel {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Punkt und Kreuz liegen ÜBEREINANDER an derselben Stelle. Nebeneinander wanderte der Titel beim
   Darüberfahren um ein paar Pixel, und die ganze Leiste zappelt. */
.nb-reiterleiste .blatt .schalter {
    position: relative;
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
}

/* Die Werkzeuge des aktiven Ablaufs - eine eigene Zeile unter den Reitern. */
.nb-designer-werkzeuge {
    padding: .35rem 0 .1rem;
}

.nb-designer-werkzeuge .trenner {
    flex: 0 0 auto;
    width: 1px;
    height: 1.25rem;
    margin: 0 .35rem;
    background: var(--mud-palette-lines-default);
}

/* DER PUNKT TRÄGT DEN ZUSTAND (mj, 29.09.2026). Vorher stand er für „ungespeichert" und der
   Zustand als Chip über der Leiste - einmal, für den aktiven Ablauf. Bei fünf offenen Reitern sah
   man vier davon nicht an, ob sie laufen. */
.nb-reiterleiste .blatt .punkt {
    position: absolute;
    inset: 5px;
    border-radius: 50%;
    background: var(--nb-kat-verarbeitung);
}

/* Entwurf: nie ausgespielt - gedämpft, denn es läuft nichts. */
.nb-reiterleiste .blatt .punkt.entwurf { background: var(--mud-palette-text-disabled); }

/* Läuft, aber der Entwurf ist weiter - der Fall, der eine Farbe verdient. */
.nb-reiterleiste .blatt .punkt.geaendert { background: var(--mud-palette-warning); }

.nb-reiterleiste .blatt .punkt.laeuft { background: var(--mud-palette-success); }

/* Der Ring: Was auf dem Schirm steht, läuft so nicht - ungespeichert oder nicht ausgespielt.
   Getrennt von der Farbe, weil ein nie ausgespielter Entwurf IMMER „Entwurf" ist und man ihm
   sonst nicht ansähe, ob die letzte halbe Stunde Arbeit schon gesichert ist. */
.nb-reiterleiste .blatt .punkt.offen {
    box-shadow: 0 0 0 2px var(--mud-palette-warning);
}

/* Aus: hohl statt gefüllt. Ein ausgeschalteter Ablauf ist da, tut aber nichts - und das sieht man
   an einem Ring schneller als an einem weiteren Farbton. */
.nb-reiterleiste .blatt .punkt.aus {
    background: transparent;
    border: 1px solid var(--mud-palette-text-disabled);
}

.nb-reiterleiste .blatt .zu {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: transparent;
    color: inherit;
    font: inherit;
    line-height: 1;
    cursor: pointer;
    opacity: 0;
}

/* Im Ruhezustand zeigt ein offenes Blatt den Punkt, erst beim Darüberfahren das Kreuz. Andersherum
   sieht man beim Zumachen nicht, dass man etwas wegwirft - und genau dann klickt man am schnellsten. */
.nb-reiterleiste .blatt:hover .zu,
.nb-reiterleiste .blatt .zu:focus-visible { opacity: 1; }
.nb-reiterleiste .blatt:hover .punkt { opacity: 0; }
.nb-reiterleiste .blatt .zu:hover { background: var(--nb-hover); }

.nb-reiterleiste .neu {
    flex: 0 0 auto;
    align-self: center;
    margin-left: .25rem;
    padding: 0 .5rem;
    border: none;
    background: transparent;
    color: var(--mud-palette-text-secondary);
    font: inherit;
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
}

.nb-reiterleiste .neu:hover { color: var(--mud-palette-text-primary); }

/* ── Das Einstellfenster eines Knotens (A4) ─────────────────────────────────────────────────
   ZWEI SPALTEN: links die Maske, rechts das Dokument des letzten Laufs. Nebeneinander und nicht
   untereinander - der ganze Sinn ist, den Pfad im Feld mit dem Dokument daneben zu vergleichen.
   Untereinander müsste man scrollen und hätte immer nur eines von beiden im Blick. */
/* Zwei Spalten für alles, was keine Weiche ist - die dritte hätte dort nichts zu zeigen. */
.nb-knoteneinstellungen { grid-template-columns: minmax(0, 1fr) 6px minmax(0, 1.4fr); }

/* Der Griff: schmal, aber greifbar. Er trägt die Trennlinie, damit sie nicht zweimal dasteht. */
.nb-knoteneinstellungen > .griff {
    padding: 0;
    overflow: visible;
    cursor: col-resize;
    background: linear-gradient(
        to right, transparent 2px, var(--mud-palette-lines-default) 2px 3px, transparent 3px);
}

.nb-knoteneinstellungen > .griff:hover {
    background: linear-gradient(
        to right, transparent 1px, var(--mud-palette-primary) 1px 4px, transparent 4px);
}

@media (max-width: 1100px) {
    .nb-knoteneinstellungen > .griff { display: none; }
}

@media (max-width: 860px) {
    .nb-knoteneinstellungen { grid-template-columns: minmax(0, 1fr); }
}

/* DAS RASTER DER BAUSTEINWAHL (mj, 29.09.2026): feste Höhe, Trennlinien, und gescrollt wird in
   den Spalten - nicht im Fenster. Ein Fenster, das mit seinem Inhalt wächst, springt beim Tippen,
   und die Knöpfe unten wandern mit.

   DIE MITTE IST DIE BREITESTE: Dort wird gearbeitet. Links steht zum Nachsehen, rechts zum
   Nachlesen; beide dürfen schmaler sein. */
.nb-knoteneinstellungen.dreispaltig {
    grid-template-columns: minmax(0, 1fr) 6px minmax(0, 1.8fr) 6px minmax(0, 1fr);
}

@media (max-width: 1100px) {
    .nb-knoteneinstellungen.dreispaltig { grid-template-columns: minmax(0, 1fr); }
}

.nb-knoteneinstellungen .ergebnis {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.nb-knoteneinstellungen .ergebnis .zeile {
    margin-bottom: .5rem;
    padding: .4rem .5rem;
    border-radius: var(--nb-radius-eintrag);
    border-left: 3px solid var(--mud-palette-lines-default);
    background: color-mix(in srgb, var(--mud-palette-background) 55%, var(--mud-palette-surface));
}

.nb-knoteneinstellungen .ergebnis .zeile.feuert { border-left-color: var(--mud-palette-success); }
.nb-knoteneinstellungen .ergebnis .zeile.uebersprungen { border-left-color: var(--mud-palette-warning); }

.nb-knoteneinstellungen .ergebnis .kopf {
    display: flex;
    align-items: baseline;
    gap: .5rem;
    font-family: var(--nb-schriftart-bedienen);
}

.nb-knoteneinstellungen .ergebnis .port { font-weight: 600; }

.nb-knoteneinstellungen .ergebnis .stand,
.nb-knoteneinstellungen .ergebnis .warum {
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
}

.nb-knoteneinstellungen .ergebnis .warum { margin-top: .2rem; word-break: break-word; }

/* ── Der Eingang als Baum - zum Anklicken ──────────────────────────────────────────────────── */
/* Die Auswahllisten im Fenster: Ihre Einträge stehen in einem Popover, der sich an der Breite des
   Feldes orientiert - ohne diese Zeile schneidet er „enthält nicht" auf „ent…". */
.nb-knoteneinstellungen .mud-select .mud-input-slot,
.nb-knoteneinstellungen .mud-select-input { min-width: 0; }

.nb-knoteneinstellungen .mud-list-item-text { white-space: nowrap; }

/* ══ EINE SCHRIFT IM GANZEN FENSTER (mj, 29.09.2026) ═════════════════════════════════════════
   Alles, was man liest oder einstellt, steht hier in derselben Schrift und Größe wie der Satz
   über der Maske: Leseschrift, 14 px. Vorher liefen drei Größen und zwei Familien durcheinander -
   die Felder in Festbreite und MudBlazors Vorgabegröße (16 px), die Beschriftungen kleiner, die
   Listeneinträge wieder anders. Das liest sich wie drei Flächen in einer.

   DAS DOKUMENT BLEIBT FESTBREITE. Es ist Code; ein Pfad in einer Proportionalschrift ist nicht
   mehr abzulesen, und genau dafür steht er da. */
.nb-knoteneinstellungen,
.nb-knoteneinstellungen .mud-input,
.nb-knoteneinstellungen .mud-input-root,
.nb-knoteneinstellungen .mud-input-label,
.nb-knoteneinstellungen .mud-select-input,
.nb-knoteneinstellungen .mud-button-root,
.nb-knoteneinstellungen .mud-typography,
.nb-auswahlliste .mud-list-item,
.nb-auswahlliste .mud-list-item-text,
.nb-auswahlliste .mud-typography {
    font-family: var(--nb-schriftart-lesen);
    font-size: var(--nb-schrift-bedienung);
}

/* Die schwebende Beschriftung sitzt im Feld und darf kleiner sein - sonst überdeckt sie beim
   Hochklappen den Rahmen. */
.nb-knoteneinstellungen .mud-input-label { font-size: var(--nb-schrift-beiwerk); }

.nb-auswahlliste .mud-list-item { min-height: 2rem; }

/* Code bleibt Code: der Eingang, die Kennungen der Zweige und die gelesenen Werte. */
.nb-knoteneinstellungen .dokument,
.nb-knoteneinstellungen .nb-dokumentbaum,
.nb-knoteneinstellungen .port,
.nb-knoteneinstellungen .ergebnis .port {
    font-family: var(--nb-schriftart-code);
}

.nb-dokumentbaum {
    flex: 1 1 auto;
    min-height: 0;
    max-height: 42vh;
    overflow: auto;
    font-family: var(--nb-schriftart-code);
    font-size: var(--nb-schrift-beiwerk);
}

.nb-dokumentbaum .leer {
    color: var(--mud-palette-text-disabled);
    font-family: var(--nb-schriftart-lesen);
    font-size: var(--nb-schrift-bedienung);
    line-height: 1.5;
}

.nb-dokumentbaum .ast { padding-left: .6rem; }
.nb-dokumentbaum > .ast { padding-left: 0; }

.nb-dokumentbaum .zweig {
    padding: .15rem 0;
    color: var(--mud-palette-text-secondary);
    font-weight: 600;
}

/* Ein Blatt ist ein Knopf: Es wird angeklickt, und das soll man ihm ansehen. */
.nb-dokumentbaum .blatt {
    display: flex;
    gap: .5rem;
    width: 100%;
    padding: .15rem .3rem;
    border: none;
    border-radius: var(--nb-radius-eintrag);
    background: none;
    color: inherit;
    font: inherit;
    text-align: left;
    cursor: pointer;
}

.nb-dokumentbaum .blatt:hover { background: var(--nb-hover); }
.nb-dokumentbaum .blatt.gewaehlt { background: var(--nb-aktiv); }
.nb-dokumentbaum .blatt .name { flex: 0 0 auto; }

.nb-dokumentbaum .blatt .wert {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--mud-palette-text-disabled);
}

/* Der Typ färbt den Wert - man sieht im Vorbeigehen, ob „größer als" hier überhaupt etwas ergibt. */
.nb-dokumentbaum .wert.zahl { color: var(--nb-kat-ausgabe); }
.nb-dokumentbaum .wert.ja_nein { color: var(--nb-kat-logik); }
.nb-dokumentbaum .wert.liste { color: var(--nb-kat-verarbeitung); }

/* ── Die Zweige einer Weiche ───────────────────────────────────────────────────────────────── */
/* DIE LUFT UM DIE BEDIENELEMENTE (mj, 29.09.2026). Sie steht an eigenen Kästen: Ein Rand am
   MudSelect oder am Knopf kommt zwischen deren eigenen Rändern kaum an - gemessen blieben von
   zwanzig Pixeln ein paar übrig, und die Zeilen klebten aneinander. */
.nb-weichenfelder .luft.verteilung { margin: 1.75rem 0 1.5rem; }
.nb-weichenfelder .luft.neuerzweig { margin: 1.25rem 0 1.75rem; }

/* Die beiden erklärenden Sätze darüber brauchen auch Platz - sie stehen sonst als Block da. */
.nb-knoteneinstellungen .maske > .mud-typography { margin-bottom: 1rem; line-height: 1.55; }

.nb-weichenfelder .zweig {
    margin-bottom: 1.25rem;
    padding: .75rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 3px solid var(--nb-kat-logik);
    border-radius: var(--nb-radius-eintrag);
}

/* Die Farbe der Sparte „Logik" - dieselbe wie an der Kachel und in der Bausteinwahl. Eine Sache,
   die an drei Stellen anders aussieht, muss man dreimal lernen. */
.nb-weichenfelder .zweig.sonst { border-left-color: var(--mud-palette-lines-default); }

.nb-weichenfelder .zweig.feuert { border-left-color: var(--mud-palette-success); }
.nb-weichenfelder .zweig.uebersprungen { border-left-color: var(--mud-palette-warning); }
.nb-weichenfelder .zweig.sonst { background: color-mix(in srgb, var(--mud-palette-background) 55%, var(--mud-palette-surface)); }

.nb-weichenfelder .kopf {
    display: flex;
    align-items: center;
    gap: .5rem;
    margin-bottom: .6rem;
    font-family: var(--nb-schriftart-bedienen);
}

.nb-weichenfelder .wort { font-weight: 600; }

/* Das Namensfeld sieht nicht aus wie ein Feld, sondern wie eine Überschrift, die man ändern kann -
   es ist der Name des Ausgangs, keine Einstellung. */
.nb-weichenfelder .zweigname { flex: 1 1 auto; min-width: 6rem; max-width: 18rem; }
.nb-weichenfelder .zweigname .mud-input { font-weight: 600; }

.nb-weichenfelder .port,
.nb-weichenfelder .erklaerung,
.nb-weichenfelder .zweigbefund {
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
}

.nb-weichenfelder .zweigbefund.feuert { color: var(--mud-palette-success); }
.nb-weichenfelder .zweigbefund.uebersprungen { color: var(--mud-palette-warning); }

/* Die aktive Zeile ist der Empfänger für ein angeklicktes Feld - das muss man sehen. */
.nb-bedingungen .zeile.aktiv {
    outline: 1px solid var(--mud-palette-primary);
    outline-offset: 2px;
    border-radius: var(--nb-radius-eintrag);
}

/* Der EINGANG steht links, die Maske rechts - dieselbe Leserichtung wie auf der Leinwand, wo
   die Eingänge links und die Ausgänge rechts sitzen (mj, 29.09.2026). */
.nb-knoteneinstellungen .rueckschau {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

@media (max-width: 860px) {
    .nb-knoteneinstellungen .rueckschau,
    .nb-knoteneinstellungen .ergebnis {
        border-right: none;
        border-left: none;
        border-bottom: 1px solid var(--mud-palette-lines-default);
    }
}

.nb-knoteneinstellungen .ueberschrift {
    margin-bottom: .5rem;
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-gruppenlabel);
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
}

/* Das Dokument in Festbreite - es ist Code, kein Fließtext. Und umbrechend statt scrollend in der
   Breite: Ein waagrechter Balken versteckt das rechte Ende eines Wertes, und genau den vergleicht
   man. */
.nb-knoteneinstellungen .dokument {
    flex: 1 1 auto;
    min-height: 0;
    max-height: 42vh;
    overflow: auto;
    margin: 0;
    padding: .5rem .65rem;
    background: var(--mud-palette-background);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--nb-radius-eintrag);
    font-family: var(--nb-schriftart-code);
    font-size: var(--nb-schrift-beiwerk);
    line-height: 1.5;
    white-space: pre-wrap;
    word-break: break-word;
}

/* ── Knoten auf der Leinwand ────────────────────────────────────────────────────────────────
   Eigene Darstellung (Ablaufknotenansicht): Titel, Untertitel, und die Ports MIT NAMEN am Kasten.
   Ohne die Namen zieht man eine Kante vom falschen Ausgang, und der Ablauf nimmt still den
   anderen Zweig.

   Die Farben kommen aus MudBlazors Variablen und gelten in hell wie dunkel - der Vorgabe-Knoten
   der Bibliothek war hell und auf dunklem Grund unlesbar (mj, 26.09.2026). */
.nb-designer .nb-knoten {
    /* Die Kachel ist der Knoten. Name und Beschreibung stehen darunter, AUSSERHALB - so darf der
       Text breiter sein als die Kachel, ohne sie zu verzerren (Entwurf mj, 27.09.2026, nach n8n). */
    --nb-kachel: 62px;
    --nb-kategorie: var(--nb-kat-neutral);

    /* DIE WIRKLICHE HÖHE - einmal gerechnet, zweimal gebraucht: für die Kachel und für den
       Abstand des Textes darunter. Als der Text noch von --nb-kachel ausging, rutschte er bei
       „Wenn" in die gewachsene Kachel hinein (mj, 28.09.2026). Dieselbe Größe darf nicht an zwei
       Stellen ausgerechnet werden.

       --nb-ports setzt die Knotenansicht am Element; ohne sie bleibt es bei der Grundhöhe. */
    --nb-hoehe: max(var(--nb-kachel), calc(var(--nb-ports, 1) * 30px + 16px));

    position: relative;
    width: var(--nb-kachel);
    font-size: .8rem;
    line-height: 1.3;
}

.nb-designer .nb-knoten.ausloeser { --nb-kategorie: var(--nb-kat-ausloeser); }
.nb-designer .nb-knoten.verarbeitung { --nb-kategorie: var(--nb-kat-verarbeitung); }
.nb-designer .nb-knoten.logik { --nb-kategorie: var(--nb-kat-logik); }
.nb-designer .nb-knoten.ausgabe { --nb-kategorie: var(--nb-kat-ausgabe); }
.nb-designer .nb-knoten.aktion { --nb-kategorie: var(--nb-kat-logik); }
.nb-designer .nb-knoten.ki { --nb-kategorie: var(--nb-kat-verarbeitung); }
.nb-designer .nb-knoten.ablaeufe { --nb-kategorie: var(--nb-kat-logik); }

/* DIE FARBE LIEGT AUF DEM RAHMEN, nicht als Fläche. Ein voll gesättigter Streifen leuchtete auf
   dunklem Grund durch (mj, 27.09.2026); als Rahmen ordnet dieselbe Farbe, ohne zu blenden. */
.nb-designer .nb-knoten .kachel {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: var(--nb-kachel);

    /* Höhe nach der Zahl der Anschlüsse: Bei zwei Ausgängen drängten sich beide auf 62 px
       zusammen, und ihre Namen lagen übereinander (mj, 27.09.2026). */
    height: var(--nb-hoehe);
    background: var(--mud-palette-surface);
    border: 2px solid var(--nb-kategorie);
    border-radius: 12px;
    box-shadow: var(--mud-elevation-2);
}

.nb-designer .nb-knoten.gewaehlt .kachel {
    border-color: var(--mud-palette-primary);
    box-shadow: 0 0 0 3px var(--mud-palette-primary-hover);
}

/* Eine Art, die dieses System nicht kennt - nach einem Import. Sie bleibt stehen und sagt es. */
.nb-designer .nb-knoten.fremd .kachel {
    border-style: dashed;
    border-color: var(--mud-palette-warning);
}

.nb-designer .nb-knoten .sinnbild {
    font-size: 1.7rem;
    color: var(--nb-kategorie);
}

.nb-designer .nb-knoten.fremd .sinnbild { color: var(--mud-palette-warning); }

.nb-designer .nb-knoten .mangel {
    position: absolute;
    top: -7px;
    right: -7px;
    width: 16px;
    height: 16px;
    line-height: 16px;
    text-align: center;
    border-radius: 50%;
    background: var(--mud-palette-warning);
    color: var(--mud-palette-warning-text);
    font-size: .68rem;
    font-weight: 700;
}

/* ── Name und Beschreibung, unter der Kachel ────────────────────────────────────────────────
   Absolut gesetzt und mittig: So bleibt die Kachel das Maß des Knotens, und ein langer Name
   schiebt die Nachbarn nicht auseinander. */
.nb-designer .nb-knoten .worte {
    position: absolute;
    top: calc(var(--nb-hoehe) + 6px);
    left: 50%;
    transform: translateX(-50%);
    width: 160px;
    text-align: center;
    pointer-events: none;
}

.nb-designer .nb-knoten .titel {
    font-family: var(--nb-schriftart-bedienen);
    font-weight: 600;
    color: var(--mud-palette-text-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Zwei Zeilen, dann abgeschnitten. Unbegrenzt liefe der Text in den Knoten darunter. */
.nb-designer .nb-knoten .unter {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    color: var(--mud-palette-text-secondary);
    font-size: .7rem;
}

/* ── Mehrere Bedingungen an einer Weiche (B1) ───────────────────────────────────────────────
   Eine Zeile je Prüfung, in einer Reihe: Stelle, Vergleich, Wert, Papierkorb. Untereinander
   gestapelt wäre bei drei Zeilen nicht mehr zu sehen, was zu was gehört. */
/* MEHR LUFT (mj, 29.09.2026): Vier Felder in einer Reihe, dicht an dicht, liest niemand. Und der
   Vergleich bekommt die breiteste Spalte - „ist nicht leer" ist länger als jede Stelle, die man
   in der Praxis anklickt, und abgeschnitten heißt er wie sein Gegenteil. */
.nb-bedingungen .zeile {
    display: grid;
    grid-template-columns: minmax(0, 1.2fr) minmax(8.5rem, 1.1fr) minmax(0, 1fr) auto auto;
    gap: .6rem;
    align-items: center;
    margin-bottom: .6rem;
}

/* Auf schmalen Spalten untereinander - drei gequetschte Felder sind alle drei unbenutzbar. */
@media (max-width: 1400px) {
    .nb-bedingungen .zeile {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto auto;
    }

    .nb-bedingungen .zeile .stelle { grid-column: 1 / -1; }
}

/* Der Befund je Zeile: ein Haken oder ein Kreuz, gegen den letzten Eingang gerechnet. */
.nb-bedingungen .befund.ja { color: var(--mud-palette-success); }
.nb-bedingungen .befund.nein { color: var(--mud-palette-text-disabled); }
.nb-bedingungen .befund.leer { width: 24px; }

.nb-bedingungen .wert.leer { min-height: 1px; }

/* ── Das Probe-Fenster ──────────────────────────────────────────────────────────────────────
   Eine echte Nachricht statt getippter JSON: Ein von Hand geschriebenes Dokument ist eine
   Behauptung darüber, wie eine Nachricht ankommt - und genau die will man prüfen. */
.nb-probe-fenster .liste {
    height: 34vh;
    min-height: 220px;
    overflow: auto;
    padding: .25rem;
    background: color-mix(in srgb, var(--mud-palette-background) 55%, var(--mud-palette-surface));
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--nb-radius-eintrag);
}

.nb-probe-fenster .zeile {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .35rem .5rem;
    border-radius: var(--nb-radius-eintrag);
    cursor: pointer;
}

.nb-probe-fenster .zeile:hover { background: var(--nb-hover); }
.nb-probe-fenster .zeile.gewaehlt { background: var(--nb-aktiv); }
.nb-probe-fenster .sinnbild { color: var(--mud-palette-primary); font-size: 1.05rem; }

.nb-probe-fenster .worte {
    display: flex;
    flex-direction: column;
    min-width: 0;
    flex: 1 1 auto;
    font-family: var(--nb-schriftart-bedienen);
}

.nb-probe-fenster .betreff {
    font-size: var(--nb-schrift-bedienung);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nb-probe-fenster .wer,
.nb-probe-fenster .wann {
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
    white-space: nowrap;
}

.nb-probe-fenster .hinweis {
    display: block;
    margin-top: .5rem;
    color: var(--mud-palette-text-disabled);
    font-family: var(--nb-schriftart-lesen);
    line-height: 1.4;
}

.nb-probe-fenster .leer {
    padding: 1rem .5rem;
    color: var(--mud-palette-text-disabled);
    font-size: var(--nb-schrift-beiwerk);
}

/* ── Die Färbung eines Laufs (A10) ──────────────────────────────────────────────────────────
   Ein ausgespielter Ablauf und einer, der jedes Mal in den falschen Zweig geht, sehen auf der
   Fläche gleich aus. Erst die Färbung macht sie unterscheidbar.

   NUR WENN EIN LAUF GEZEIGT WIRD. Eine Färbung, die immer da ist, sagt nichts mehr - deshalb
   trägt der Knoten ohne Lauf gar keine Klasse. */
.nb-designer .nb-knoten.gelaufen .kachel {
    border-color: var(--nb-kat-ausgabe);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--nb-kat-ausgabe) 22%, transparent);
}

/* Übersprungen heisst: im Probelauf beschrieben, nicht ausgeführt. Ihn wie einen gelaufenen zu
   färben hiesse zu behaupten, die Post sei verschickt. */
.nb-designer .nb-knoten.uebersprungen .kachel {
    border-style: dashed;
    border-color: var(--warn);
}

/* Wo der Lauf aufgehört hat - die Stelle, an der man nachsieht, wenn etwas nicht weiterging. */
.nb-designer .nb-knoten.laufende .kachel {
    border-color: var(--mud-palette-primary);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--mud-palette-primary) 28%, transparent);
}

/* Was NICHT gelaufen ist, tritt zurück. Der Weg ist nur zu sehen, wenn der Rest leiser wird. */
.nb-designer:has(.nb-knoten.gelaufen) .nb-knoten:not(.gelaufen):not(.uebersprungen):not(.laufende) {
    opacity: .45;
}

/* ── Anschlüsse ─────────────────────────────────────────────────────────────────────────────
   Auf den Rändern der Kachel, senkrecht verteilt. Die Namen stehen NACH AUSSEN - in der Kachel
   ist kein Platz, und zwischen zwei Knoten schon. */
.nb-designer .nb-knoten .spalte {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    display: flex;
    flex-direction: column;
    gap: .55rem;
    z-index: 1;
}

.nb-designer .nb-knoten .spalte.links { right: 100%; align-items: flex-end; }
.nb-designer .nb-knoten .spalte.rechts { left: 100%; align-items: flex-start; }

.nb-designer .nb-knoten .nb-port {
    display: flex;
    align-items: center;
    gap: .3rem;
    cursor: crosshair;
}

/* Der Griffpunkt sitzt MITTIG auf dem Rand der Kachel: Dort sucht ihn die Hand, und dort endet
   auch die Kante. */
/* DIE BESCHRIFTUNG ZEIGT NACH AUSSEN, der Griffpunkt zur Kachel. Vorher war es genau andersherum,
   und „wahr"/„sonst" lagen auf der Kachel statt neben ihr (mj, 27.09.2026).

   Links also: Text, dann Punkt. Rechts: Punkt, dann Text. */
.nb-designer .nb-knoten .spalte.links .nb-port {
    flex-direction: row-reverse;
    margin-right: -7px;
}

.nb-designer .nb-knoten .spalte.rechts .nb-port { margin-left: -7px; }

/* EINGANG ECKIG, AUSGANG RUND. Die Form sagt die Richtung, noch bevor man den Namen liest - und
   Farbe täte das nicht: Sie ist bei beiden dieselbe, sobald eine Kante hängt. */
.nb-designer .nb-knoten .nb-port::before {
    content: "";
    flex: 0 0 auto;
    width: 12px;
    height: 12px;
    background: var(--mud-palette-background-gray);
    border: 2px solid var(--mud-palette-lines-inputs);
}

.nb-designer .nb-knoten .nb-port.ausgang::before { border-radius: 50%; }
.nb-designer .nb-knoten .nb-port.eingang::before { border-radius: 3px; }

.nb-designer .nb-knoten .nb-port:hover::before,
.nb-designer .nb-knoten .nb-port.has-links::before {
    background: var(--mud-palette-primary);
    border-color: var(--mud-palette-primary);
}

.nb-designer .nb-knoten .marke {
    font-size: .68rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;

    /* Sie liegt zwischen zwei Knoten, wo auch die Linie läuft. Ein wenig Grund darunter hält sie
       lesbar, ohne einen Kasten zu ziehen. */
    padding: 0 .15rem;
    background: color-mix(in srgb, var(--mud-palette-background) 80%, transparent);
    border-radius: 3px;
}

/* Die Pfeilspitze am Ziel (LinkMarker.Arrow). Ohne Einfärbung zeichnet die Bibliothek sie
   schwarz - auf dunklem Grund unsichtbar, und dann sieht eine Kante wieder richtungslos aus. */
.nb-designer .diagram-canvas .diagram-link .marker-target,
.nb-designer .diagram-canvas .diagram-link marker path {
    fill: var(--mud-palette-lines-inputs);
    stroke: none;
}

.nb-designer .diagram-canvas .diagram-link.selected .marker-target,
.nb-designer .diagram-canvas .diagram-link.selected marker path {
    fill: var(--mud-palette-primary);
}

.nb-designer .diagram-canvas .default-node {
    background: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    padding: .4rem .75rem;
    min-width: 120px;
    font-size: .85rem;
    box-shadow: var(--mud-elevation-2);
}

.nb-designer .diagram-canvas .default-node.selected {
    border-color: var(--mud-palette-primary);
    box-shadow: 0 0 0 2px var(--mud-palette-primary-hover);
}

/* Die Ports sichtbar machen - sonst trifft man beim Verbinden nichts. */
/* NUR die Vorgabe-Ports. Unsere benannten Ports (.nb-port) tragen dieselbe Bibliotheks-Klasse -
   eine feste Breite von 12px schnitt dort die Beschriftung ab (mj, 27.09.2026). */
.nb-designer .diagram-canvas .diagram-port:not(.nb-port) {
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: var(--mud-palette-background-gray);
    border: 2px solid var(--mud-palette-lines-inputs);
}

.nb-designer .diagram-canvas .diagram-port:not(.nb-port):hover,
.nb-designer .diagram-canvas .diagram-port:not(.nb-port).has-links {
    background: var(--mud-palette-primary);
    border-color: var(--mud-palette-primary);
}

/* Die Ortsauswahl: der Weg grau, der Ort selbst kräftig, die Art klein dahinter. */
.nb-ortwahl-zeile { display: flex; align-items: baseline; gap: 0; min-width: 0; }
.nb-ortwahl-zeile .weg { color: var(--t3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 0 1 auto; }
.nb-ortwahl-zeile .name { color: var(--t1); font-weight: 600; white-space: nowrap; }
.nb-ortwahl-zeile .art { color: var(--t3); font-size: 11px; margin-left: 8px; white-space: nowrap; }

/* Der Ortsbaum: Suche, Klappen, klickbare Zeilen, Treffer hervorgehoben. */
.nb-ortsuche { max-width: 280px; }
.nb-ortsbaum tr.klickbar { cursor: pointer; }
.nb-ortsbaum tr.treffer td { background: var(--pri-w); }
.nb-ortsbaum .nb-ortsbaum-klappe { margin: -4px 0; }
.nb-ortsbaum .nb-ortsbaum-klappe-leer { display: inline-block; width: 30px; }

/* Die Verknüpfung der Bedingungen: zwei Knöpfe über den Zeilen, das Bindewort dazwischen. */
.nb-bedingungen .verknuepfung { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; font-size: 13px; }
.nb-bedingungen .verknuepfung .erklaerung { color: var(--t2); margin-right: 4px; }
.nb-bedingungen .verknuepfung button {
  border: 1px solid var(--line2); background: transparent; color: var(--t2); border-radius: 6px;
  padding: 2px 10px; font: inherit; cursor: pointer;
}
.nb-bedingungen .verknuepfung button.an { border-color: var(--mud-palette-primary); color: var(--t1); background: var(--pri-w); }
.nb-bedingungen .bindewort { font-size: 11px; font-weight: 600; color: var(--mud-palette-primary); text-transform: uppercase; letter-spacing: .06em; margin: 2px 0 2px 4px; }

/* Der Zustand eines Ports: abgeschaltet blass und gestrichelt, defekt rot - in Tabelle und Rack. */
.nb-anschluesse tr.zustand-abgeschaltet td:not(:last-child) { opacity: .55; }
.nb-anschluesse tr.zustand-defekt td:first-child { box-shadow: inset 3px 0 0 var(--mud-palette-error); }
.nb-rack .port.abgeschaltet { border-style: dashed; opacity: .45; }
.nb-rack .port.defekt { border-color: var(--mud-palette-error); background: transparent; box-shadow: inset 0 0 0 2px var(--mud-palette-error); }
.nb-rack-port .zustand.abgeschaltet { color: var(--t3); }
.nb-rack-port .zustand.defekt { color: var(--mud-palette-error); font-weight: 600; }

/* Ein Verwaltungsport: rund statt eckig - auf einen Blick vom Datenport zu unterscheiden. */
.nb-rack .port.mgmt { border-radius: 50%; }

/* Das Gerätesymbol vor dem Namen: in der Liste und im Rack. */
.nb-geraetename { display: inline-flex; align-items: center; gap: 6px; }
.nb-rack .feld.geraet .symbol { font-size: 16px; color: var(--mud-palette-primary); }

/* Die Zugänge eines Geräts: je Zweck eine Zeile. */
.nb-zugangsliste td.zweck { width: 90px; font-weight: 600; }
.nb-zugangsliste td.aktionen { width: 1%; white-space: nowrap; text-align: right; }
.nb-zugangsliste .klein { color: var(--t3); font-size: 12px; }

/* Die Einstellungen der Netzinventur: Quellen mit Hinweis darunter, ausgegraut, wenn aus. */
.nb-netzinventur .quellen.aus { opacity: .55; }
.nb-netzinventur .quelle { display: flex; flex-direction: column; margin-bottom: 4px; }
.nb-netzinventur .quelle .hinweis { color: var(--t3); font-size: 12px; margin: -6px 0 4px 44px; }
.nb-netzinventur .empfaenger { margin-top: 6px; display: flex; flex-wrap: wrap; gap: 4px; }
.nb-netzinventur .klein { color: var(--t3); font-size: 12px; }

/* Das Netz eines Kunden: Kabelvorschläge mit Stand, Funde mit Adresse in fester Breite. */
.nb-netz .klein { color: var(--t3); font-size: 12px; }
.nb-kabelvorschlaege td.pfeil { width: 24px; text-align: center; color: var(--t3); }
.nb-kabelvorschlaege td.aktionen { width: 1%; white-space: nowrap; text-align: right; }
.nb-kabelvorschlaege .stand { font-size: 12px; font-weight: 600; padding: 1px 6px; border-radius: 4px; border: 1px solid var(--line2); }
.nb-kabelvorschlaege tr.stand-neu .stand { border-color: var(--mud-palette-primary); color: var(--mud-palette-primary); }
.nb-kabelvorschlaege tr.stand-vorhanden .stand { color: var(--mud-palette-success); border-color: var(--mud-palette-success); }
.nb-kabelvorschlaege tr.stand-widerspricht .stand { color: var(--mud-palette-error); border-color: var(--mud-palette-error); }
.nb-netzfunde td.mac { font-family: var(--nb-schriftart-code); font-size: 12px; }

/* Am Gerät steht sein Netz (GeraetNetz.razor) */
.nb-geraet-netz .erklaerung { margin: 0; }
.nb-geraet-netz .weg { margin: 6px 0 0; }
.nb-geraet-netz .netze table { table-layout: fixed; }
.nb-geraet-netz .netze tr.verwaltung td { font-weight: 600; }

/* ── Das Formularfenster (Formularfenster, EinladungenDialog) ────────────────────────────────
   Wie „+ Baustein“, nur ohne Seitenleiste und Detail: Kopfzeile, darunter eine Fläche, die für sich
   scrollt - am Papier selbst wird nicht gescrollt (siehe oben). Höchstens drei Viertel der Höhe,
   damit Kopf und Kreuz immer sichtbar bleiben. */
/* Noch für die Kalenderfenster ohne Hülle (Einladungen, Eintrag lesen) - flow-design-012 stellt sie um. */
.mud-dialog.nb-formular-fenster { overflow: hidden; }
.nb-formular-fenster .mud-dialog-content { overflow: hidden; padding: 0; }
.nb-formular-flaeche {
    max-height: 75vh;
    overflow-y: auto;
    padding: var(--nb-abstand-fenster);
    border-top: 1px solid var(--mud-palette-lines-default);
}
.nb-einladung { padding: 12px 14px; border-radius: var(--nb-radius-eintrag); background: var(--surf2); }
.nb-einladung .titel { font-weight: 600; color: var(--t1); }
.nb-einladung .wann { font-size: var(--nb-schrift-beiwerk); color: var(--t2); margin-top: 2px; }
.nb-einladung .fuer { font-size: var(--nb-schrift-beiwerk); color: var(--pri-t); font-weight: 600; }
/* Anhänge im Terminfenster (kalender-027): Verweise als Chips, darunter Datei und Nachricht. */
.nb-terminanhaenge { margin-top: 12px; }
.nb-terminanhaenge .kopf { font-size: var(--nb-schrift-beiwerk); color: var(--t2); margin-bottom: 4px; }
.nb-terminanhaenge .anhang .oeffnen { cursor: pointer; }
.nb-terminanhaenge .anhang .oeffnen:hover { text-decoration: underline; }

/* ── Das Terminfenster (TerminDialog, Entwurf mj, 06.10.2026) ────────────────────────────────
   Bearbeitungsfenster mit Lesespalte (oberflaeche.md): links Wann/Wo/Wer, rechts Nachricht, Notiz,
   Anhänge; Kopf und Fuß trägt das Formular selbst. NUR HAUSVARIABLEN - keine eigenen Farbwerte
   (Wunsch mj): Gemessen am Entwurf entsprechen Fläche --surf, Eingabefeld --bg, Rand --line,
   Reiterstrich --pri-t; die etwas dunklere rechte Spalte und der Fuß sind daraus gemischt. */
.nb-terminbogen .tb-titel {
    display: block; width: 100%; margin: 2px 0 4px; padding: 0; border: none; outline: none; background: transparent;
    font: inherit; font-size: 22px; font-weight: 600; color: var(--t1);
}
.nb-terminbogen .tb-titel::placeholder { color: var(--t3); }
.nb-terminbogen .tb-pille {
    display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 14px;
    border: 1px solid var(--line2); border-radius: 18px; background: var(--surf); color: var(--t1); font: inherit; font-size: 13px; cursor: pointer;
}
.nb-terminbogen .tb-pille .punkt, .tb-menupunkt { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--kf); }
.mud-menu.tb-kalenderwahl.mud-disabled .tb-pille { cursor: default; }


.nb-terminbogen .tb-abschnitt { padding: 14px 0; border-bottom: 1px solid var(--line); }
.nb-terminbogen .tb-abschnittkopf {
    display: flex; align-items: center; gap: 8px; margin-bottom: 10px;
    font-size: 12px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--t2);
}
.nb-terminbogen .tb-abschnittkopf .mud-switch { margin: 0; }
.nb-terminbogen .tb-abschnittkopf .mud-switch .mud-typography { font-size: 13px; text-transform: none; letter-spacing: 0; font-weight: 500; }
.nb-terminbogen .tb-raum { flex: 1 1 auto; }
.nb-terminbogen .tb-zaehler { font-size: 12px; text-transform: none; letter-spacing: 0; font-weight: 500; color: var(--t3); }

.nb-terminbogen .tb-zeitzeile { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.nb-terminbogen .tb-zeitzeile > label { flex: 0 0 56px; font-size: 13px; color: var(--t2); }
.nb-terminbogen .tb-zeitzeile .tb-datum { flex: 1 1 auto; }
.nb-terminbogen .tb-zeitzeile .tb-uhrzeit { flex: 0 0 116px; }
/* Abstand zur Personenliste darüber; die Beschriftung bleibt einzeilig. */
.nb-terminbogen .tb-einladenaus { margin-top: 12px; }
.nb-terminbogen .tb-einladenaus > label { flex-basis: 96px; white-space: nowrap; }
.nb-terminbogen .tb-zwei { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 8px; padding-left: 64px; }
.nb-terminbogen .tb-abschnitt:not(:first-child) .tb-zwei { padding-left: 0; }
.nb-terminbogen .tb-zwei label, .nb-terminbogen .tb-feldlabel { display: block; margin: 4px 0 4px; font-size: 13px; color: var(--t2); }
/* Gleich hoch, ob mit Hilfe-Knopf oder ohne - sonst stehen die Felder daneben versetzt. */
.nb-terminbogen .tb-zwei label { display: flex; align-items: center; gap: 4px; height: 28px; margin: 0 0 4px; }
.nb-terminbogen .tb-hinweis { margin-top: 4px; font-size: 12px; color: var(--t3); }
.nb-terminbogen .tb-leise { font-size: 12px; color: var(--t3); }
.nb-terminbogen .tb-marke {
    flex: 0 0 auto; padding: 2px 8px; border-radius: 8px; background: var(--surf2); border: 1px solid var(--line);
    font-size: 12px; color: var(--t2);
}
.nb-terminbogen .tb-feld { margin-top: 0; margin-bottom: 8px; }
.nb-terminbogen .tb-mitknopf { display: flex; gap: 8px; align-items: flex-start; }
.nb-terminbogen .tb-mitknopf .tb-feld { flex: 1 1 auto; }
.nb-terminbogen .tb-knopf { border: 1px solid var(--line); border-radius: 8px; width: 40px; height: 40px; background: var(--bg); }

/* Füllung, Rand und Schrift der Felder kommen aus der allgemeinen Regel „Eingabefelder“; hier nur die Höhe. */
.nb-terminbogen .mud-input-control.mud-input-control-margin-dense { margin: 0; }
.nb-terminbogen .mud-input.mud-input-outlined.mud-input-margin-dense { min-height: 40px; }

.nb-terminbogen .tb-segmente {
    display: inline-flex; padding: 2px; border: 1px solid var(--line); border-radius: 8px; background: var(--bg);
    text-transform: none; letter-spacing: 0;
}
.nb-terminbogen .tb-segmente button, .nb-terminbogen .tb-tage button {
    border: none; background: transparent; color: var(--t2); font: inherit; font-size: 12.5px; font-weight: 500;
    padding: 5px 10px; border-radius: 6px; cursor: pointer;
}
.nb-terminbogen .tb-segmente button.an, .nb-terminbogen .tb-tage button.an { background: var(--pri-w); color: var(--pri-t); }
.nb-terminbogen .tb-tage { display: flex; gap: 4px; margin: 8px 0 0 64px; }
.nb-terminbogen .tb-tage button { border: 1px solid var(--line); }
.nb-terminbogen .tb-serienwahl { margin-top: 10px; font-size: 13px; color: var(--t2); }
.nb-terminbogen .tb-serienwahl .mud-radio-group { display: flex; flex-wrap: wrap; }

.nb-terminbogen .tb-personen { display: flex; flex-direction: column; gap: 6px; }
.nb-terminbogen .tb-person {
    display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 10px;
    background: var(--surf2); border: 1px solid var(--line);
}
/* Treffer und Auswahleinträge stehen in der Aufklappliste - außerhalb des Fensters, also ohne .nb-terminbogen. */
.tb-treffer { display: flex; align-items: center; gap: 10px; }
.tb-treffername, .tb-auswahl { display: flex; flex-direction: column; min-width: 0; line-height: 1.3; }
.tb-trefferadresse { font-size: calc(var(--nb-schrift-eingabe) - 2px); color: var(--t3); }
.tb-kuerzel {
    flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%;
    background: var(--pri-w); color: var(--pri-t); font-size: 11px; font-weight: 600;
}
.tb-kuerzel.extern { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }
.nb-terminbogen .tb-personname { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; font-size: 14px; color: var(--t1); }
.nb-terminbogen .tb-status { flex: 0 0 auto; padding: 2px 9px; border-radius: 10px; font-size: 11.5px; font-weight: 600; background: var(--surf3); color: var(--t2); }
.nb-terminbogen .tb-status.organisator { background: var(--pri-w); color: var(--pri-t); }
.nb-terminbogen .tb-status.zugesagt { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }
.nb-terminbogen .tb-status.abgesagt { background: color-mix(in srgb, var(--bad) 18%, transparent); color: var(--bad); }
.nb-terminbogen .tb-status.offen, .nb-terminbogen .tb-status.vorbehalt { background: color-mix(in srgb, var(--warn) 18%, transparent); color: var(--warn); }
.nb-terminbogen .tb-folge { display: flex; gap: 8px; align-items: flex-start; margin-top: 8px; font-size: 12.5px; color: var(--t2); }
.nb-terminbogen .tb-folge.warnung .mud-icon-root { color: var(--warn); }
.nb-terminbogen .tb-schalter { display: flex; align-items: center; gap: 8px; padding: 12px 0; flex-wrap: wrap; }

.nb-terminbogen .tb-reiterleiste {
    position: sticky; top: 0; z-index: 1; display: flex; align-items: center; gap: 4px; padding: 10px 0 0;
    border-bottom: 1px solid var(--line); background: inherit;
}
.nb-terminbogen .tb-reiterleiste > button {
    border: none; background: transparent; color: var(--t2); font: inherit; font-size: 14px; font-weight: 500;
    padding: 8px 12px 10px; border-bottom: 2px solid transparent; cursor: pointer;
}
.nb-terminbogen .tb-reiterleiste > button.an { color: var(--t1); border-bottom-color: var(--pri-t); }
.nb-terminbogen .tb-zahl { margin-left: 6px; padding: 0 6px; border-radius: 8px; background: var(--pri-w); color: var(--pri-t); font-size: 11px; }

.nb-terminbogen .tb-karte { margin-top: 8px; border: 1px solid var(--line); border-radius: 12px; background: var(--surf2); }
.nb-terminbogen .tb-kartenkopf { display: flex; gap: 10px; align-items: flex-start; padding: 14px 16px 6px; }
.nb-terminbogen .tb-betreff { padding: 0 16px 10px 56px; font-weight: 600; color: var(--t1); border-bottom: 1px solid var(--line); }
.nb-terminbogen .tb-text { padding: 12px 16px 12px 56px; font-size: 14px; line-height: 1.55; color: var(--t1); overflow-wrap: anywhere; min-width: 0; }
.nb-terminbogen .tb-karte.tb-text { padding: 12px 16px; }
.nb-terminbogen .tb-text pre, .nb-terminbogen .tb-frueher pre { margin: 0; white-space: pre-wrap; font: inherit; }
.nb-terminbogen .tb-verlaufknopf {
    margin: 0 16px 10px 56px; padding: 4px 10px; border: 1px solid var(--line); border-radius: 12px; background: transparent;
    color: var(--t2); font: inherit; font-size: 12px; cursor: pointer;
}
.nb-terminbogen .tb-frueher { margin: 0 16px 8px 56px; padding: 8px 10px; border-left: 2px solid var(--line2); font-size: 13px; color: var(--t2); }
.nb-terminbogen .tb-beilagen { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 10px 16px; border-top: 1px solid var(--line); }
.nb-terminbogen .tb-beilage {
    display: flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 10px;
    background: var(--surf); color: var(--t1); font: inherit; text-align: left; cursor: pointer; min-width: 0;
}
.nb-terminbogen .tb-beilagename { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; font-size: 13px; }
.nb-terminbogen .tb-kartenfuss { display: flex; align-items: center; gap: 4px; padding: 6px 10px; border-top: 1px solid var(--line); }

.nb-terminbogen .tb-anhaenge { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.nb-terminbogen .tb-anhang {
    display: flex; align-items: center; gap: 8px; padding: 6px 6px 6px 10px; border: 1px solid var(--line); border-radius: 10px; background: var(--surf2);
}
.nb-terminbogen .tb-anhang.vorgemerkt { border-style: dashed; }
.nb-terminbogen .tb-anhangname { flex: 1 1 auto; min-width: 0; border: none; background: transparent; color: var(--t1); font: inherit; text-align: left; cursor: pointer; overflow-wrap: anywhere; }
.nb-terminbogen .tb-leerflaeche {
    display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 28px 16px; margin-top: 8px;
    border: 1px dashed var(--line2); border-radius: 12px; color: var(--t2); text-align: center; cursor: pointer;
}
.nb-terminbogen .tb-leerflaeche b { color: var(--t1); }
.nb-terminbogen .tb-leerflaeche.laeuft { opacity: .6; }
.nb-terminbogen .tb-ablagefeld { width: 100%; }

@media (max-width: 1100px) {
    .nb-terminbogen .tb-zwei { padding-left: 0; }
    .nb-terminbogen .tb-tage { margin-left: 0; }
}

/* ═══ Die Fensterhülle (Bearbeitungsfenster, flow-design-006) ═══════════════════════════════════
   Aufgebaut wie das Terminfenster (Entwurf mj, 06.10.2026): Kopf, links einstellen / rechts lesen,
   Fuß mit EINEM Primärknopf. Gilt für jedes Bearbeitungsfenster - was hier steht, steht nicht noch
   einmal je Fenster. Nur Variablen: Fläche --surf, Lesespalte und Fuß aus --surf und --bg gemischt.

   Drei Größen statt freier Breiten (ADR-0089). „groß“ hat eine feste Höhe, gescrollt wird INNEN, je
   Spalte für sich - ein Fenster, das mit seinem Inhalt wächst, springt bei jeder neuen Zeile. */
.mud-dialog.nb-fenster { border: 1px solid var(--line2); border-radius: var(--nb-radius-fenster); }
.mud-dialog.nb-fenster .mud-dialog-content { padding: 0; margin: 0; overflow: hidden; }
/* FESTE ANTEILE DES BILDSCHIRMS (mj, 13.10.2026: „bei der Fensterbreite und Höhe immer fixe Prozentteile vom Bildschirm
   verwenden. Es stört sehr, wenn sich das Fenster in der Höhe oder Breite verändert!“). Breite UND Höhe hängen nur an der
   Größe des Fensters, nie am Inhalt oder am gewählten Abschnitt - keine Pixel-Obergrenzen, kein Mitwachsen. Gescrollt
   wird innen, je Spalte. Die drei Größen stehen hier und nur hier (FenstergroessenTests). */
.mud-dialog.nb-fenster-klein { width: 40vw; max-width: 40vw; }
.mud-dialog.nb-fenster-mittel { width: 60vw; max-width: 60vw; }
/* Kopf und Kreuz bringt die Hülle - MudBlazors eigene Titelzeile (sie erscheint mit CloseButton auch
   ohne Titel) stünde als zweiter Kopf darüber. */
.mud-dialog.nb-fenster > .mud-dialog-title { display: none; }
.mud-dialog.nb-fenster-gross { width: 80vw; max-width: 80vw; }

.nb-bogen { display: flex; flex-direction: column; background: var(--surf); }
.nb-bogen-klein { height: 55vh; }
.nb-bogen-mittel { height: 75vh; }
.nb-bogen-gross { height: 85vh; }
/* Im Fenster füllt das Raster die Höhe des Fensters - es bringt keine eigene mit. Vorher war ein Formular-Raster
   min(72vh, 760px) hoch, eine Auswahl 50vh: Das Aufgabenfenster sprang beim Wechsel von „Aufgabe“ zu „Stand“. */
.nb-bogen .nb-fensterraster { height: auto; min-height: 0; flex: 1 1 auto; }

.nb-bogen-kopf {
    display: flex; align-items: flex-start; gap: 12px; padding: 18px 22px 14px;
    border-bottom: 1px solid var(--line);
}
.nb-bogen-farbe { flex: 0 0 auto; width: 12px; height: 12px; margin-top: 6px; border-radius: 3px; background: var(--kf); }
.nb-bogen-titelblock { flex: 1 1 auto; min-width: 0; }
.nb-bogen-art {
    font-size: var(--nb-schrift-gruppenlabel); font-weight: 600; letter-spacing: .08em;
    text-transform: uppercase; color: var(--t3);
}
.nb-bogen-titel { margin: 2px 0 4px; font-size: var(--nb-schrift-detailtitel); font-weight: 600; color: var(--t1); }
.nb-bogen-zusammenfassung { font-size: var(--nb-schrift-beiwerk); color: var(--t2); }

.nb-bogen-koerper {
    flex: 1 1 auto; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
}
.nb-bogen-koerper.einspaltig { grid-template-columns: minmax(0, 1fr); }
.nb-bogen-links { overflow-y: auto; padding: 4px 22px 16px; }
.nb-bogen-koerper:not(.einspaltig) .nb-bogen-links { border-right: 1px solid var(--line); }
.nb-bogen-rechts {
    overflow-y: auto; padding: 0 20px 16px; display: flex; flex-direction: column; gap: 8px;
    background: color-mix(in srgb, var(--surf) 70%, var(--bg));
}

/* Die Auswahl- und Verwaltungsflächen reichten mit negativen Rändern über MudBlazors Polsterung bis
   an die Fensterkante. In der randlosen Hülle gibt es diese Polsterung nicht - die Ränder würden
   die Fläche über die Kante schieben. Die Linie oben zieht der Kopf der Hülle. */
.nb-bogen-koerper.randlos .nb-fensterraster,
.nb-bogen-koerper.randlos .nb-ablaufverwaltung,
.nb-bogen-koerper.randlos .nb-suchtreffer { margin: 0; border-top: none; }
.nb-bogen-koerper.randlos .nb-bogen-links { padding: 0; overflow: hidden; display: flex; flex-direction: column; min-height: 0; }
/* Ein Titel, den das Fenster selbst baut (Symbol, Zusatz): Schrift und Größe kommen vom Bogen. */
.nb-bogen-titel { display: flex; align-items: center; gap: 8px; }
.nb-bogen-titel .mud-typography { font-size: inherit; font-weight: inherit; line-height: inherit; margin: 0; }

.nb-bogen-fuss {
    display: flex; align-items: center; gap: 10px; padding: 12px 22px;
    border-top: 1px solid var(--line); background: color-mix(in srgb, var(--surf) 60%, var(--bg));
}
.nb-bogen-raum { flex: 1 1 auto; }
.nb-bogen-hinweis { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }

/* Schmaler als ein Laptop: die Lesespalte rutscht unter die Einstellungen (Entscheidung mj, 06.10.2026). */
@media (max-width: 1100px) {
    .mud-dialog.nb-fenster-klein, .mud-dialog.nb-fenster-mittel, .mud-dialog.nb-fenster-gross { width: 96vw; max-width: 96vw; }
    .nb-bogen-klein, .nb-bogen-mittel, .nb-bogen-gross { height: 90vh; }
    .nb-bogen-koerper { display: block; overflow-y: auto; }
    .nb-bogen-links, .nb-bogen-rechts { overflow: visible; }
    .nb-bogen-koerper:not(.einspaltig) .nb-bogen-links { border-right: none; }
}

/* ── Ressource: Service (ressourcen-002) ───────────────────────────────────────────────────── */
.nb-faellig { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: var(--nb-schrift-bedienung); color: var(--t2); }
.nb-faellig .art { font-weight: 600; color: var(--t1); min-width: 110px; }
/* Überfälliges wirkt über das Symbol, nicht über eine rote Fläche (kalender.md, „Farbe“). */
.nb-faellig.ueberfaellig .mud-icon-root { color: var(--bad); }
.nb-beleg { min-height: 36px; display: flex; align-items: center; }
/* Einwilligungstext: Absätze und Aufzählung wie getippt (ressourcen-005). */
.nb-einwilligungstext { white-space: pre-wrap; font-size: var(--nb-schrift-bedienung); line-height: 1.5; }

/* ═══ Eingabefelder und Aufklapplisten - überall gleich (Entscheidung mj, 06.10.2026) ═══════════
   Ein Feld muss man sehen, ohne es zu suchen: eigene Füllung (--feld), deutlicher Rand, eine
   Schriftgröße für alle (--nb-schrift-eingabe). Beides stellt der Design-Manager je Bereich ein.
   Der Rand läuft über MudBlazors eigene Variable - so greifen Hover, Fokus und „gesperrt“ weiter,
   ohne !important. */
.mud-input.mud-input-outlined {
    background: var(--feld);
    --mud-palette-lines-inputs: var(--feld-rand);
}
.mud-input.mud-input-outlined:focus-within { box-shadow: 0 0 0 3px var(--pri-w); border-radius: var(--mud-default-borderradius); }
.mud-input.mud-input-outlined.mud-disabled { background: transparent; }
.mud-input-control .mud-input, .mud-select .mud-input { font-size: var(--nb-schrift-eingabe); }

/* Aufklapplisten (Auswahl, Vorschläge, Menüs): eigener Grund, Rand und Schatten - vorher hatten sie
   die Farbe der Fläche darunter und waren kaum vom Fenster zu unterscheiden. */
/* Der Rand ist ein Schattenring, kein border: Die Liste darin erbt die Maximalhöhe des Rahmens
   (max-height: inherit) - mit 2 px Rand wurde sie höher als sein Inneres, und es gab zwei Scrollbalken. */
.mud-popover:has(> .mud-list) {
    background-color: var(--aufklapper);
    box-shadow: 0 0 0 1px var(--feld-rand), var(--schatten);
}
/* Der Eintragstext trägt MudBlazors body1 (1rem = 16 px) - die Größe muss an die Schrift selbst, nicht an den Eintrag. */
.mud-popover .mud-list-item, .mud-popover .mud-list-item .mud-typography { font-size: var(--nb-schrift-eingabe); }

/* Lesefenster für Einträge, die nicht in Flow leben (Abos). */
.nb-eintrag-lesen .nb-lesen-zeile { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; color: var(--t1); }
.nb-eintrag-lesen .nb-lesen-zeile.leise { color: var(--t3); font-size: var(--nb-schrift-beiwerk); }
.nb-eintrag-lesen .nb-eintrag-beschreibung { margin: 12px 0 0; white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; color: var(--t1); }

/* Startort (kalender-016): was gerade gilt, darunter die Suche nach einer anderen Anschrift. */
.nb-startort .nb-startort-jetzt { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px; border-radius: 10px; background: var(--surf2); border: 1px solid var(--line); }
.nb-startort .nb-startort-jetzt span { color: var(--t2); font-size: var(--nb-schrift-beiwerk); }

/* Anfahrt vor einem Termin (kalender-016, Wunsch mj 06.10.2026): Der Block reicht von der Abfahrt, der
   Teil vor dem Beginn ist gestrichelt und schraffiert; Grund und Rand des Termins beginnen erst darunter.
   Rot, wenn sich die Reisekette nicht ausgeht. */
.nb-kal-block.mit-anfahrt {
    border-color: transparent; padding-top: calc(var(--anfahrt) + 4px);
    background: linear-gradient(to bottom, transparent var(--anfahrt), color-mix(in srgb, var(--kf) var(--kal-gruen), var(--kal-basis)) var(--anfahrt));
}
.nb-kal-block.mit-anfahrt::before, .nb-kal-block.mit-anfahrt::after { content: ""; position: absolute; left: 0; right: 0; box-sizing: border-box; pointer-events: none; }
.nb-kal-block.mit-anfahrt::before {
    top: 0; height: var(--anfahrt); border: 1px dashed color-mix(in srgb, var(--kf) 75%, var(--kal-basis)); border-bottom: none; border-radius: 6px 6px 0 0;
    background: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--kf) 16%, transparent) 0 5px, transparent 5px 10px);
}
.nb-kal-block.mit-anfahrt::after {
    top: var(--anfahrt); bottom: 0; border: 1px solid color-mix(in srgb, var(--kf) var(--kal-rand), var(--kal-basis)); border-radius: 0 0 6px 6px;
}
.nb-kal-block.anfahrt-eng::before { border-color: var(--bad); background: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--bad) 20%, transparent) 0 5px, transparent 5px 10px); }
.nb-kal-block .ba { font-size: 10.5px; color: var(--t2); }
.nb-kal-block.anfahrt-eng .ba { color: var(--bad); }

/* Der ganze Tag im eigenen Scrollbereich (Wunsch mj, 06.10.2026): Wochentage und Ganztägiges bleiben
   stehen. Die Kopfzeile hat eine feste Höhe, damit die Ganztägig-Zeile genau darunter haftet. */
.nb-kal-wochenrahmen { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.nb-kal-wochenrahmen .nb-kal-woche > .kopfzelle:not(.zeitlabel) { position: sticky; top: 0; z-index: 5; height: 48px; box-sizing: border-box; }
.nb-kal-wochenrahmen .nb-kal-woche > .kopfzelle.zeitlabel,
.nb-kal-wochenrahmen .nb-kal-woche > .ganztags { position: sticky; top: 48px; z-index: 5; }

/* ═══ Planungs-Modus (kalender-018) ═══════════════════════════════════════════════════════════════
   Links der Vorrat, rechts Menschen und Ressourcen über die Woche; je Zelle ein Band von 6 bis 20 Uhr
   und die Auslastung gegen das eigene Arbeitszeitmodell. */
.nb-modul.nb-planung { grid-template-columns: var(--nb-modul-rail-w, 260px) minmax(0, 1fr); }
.nb-planung-vorrat { display: flex; flex-direction: column; gap: 6px; padding: 12px; overflow-y: auto; background: var(--bg2); }
.nb-planung-vorrat .kopf { display: flex; align-items: center; gap: 8px; }
.nb-planung-vorrat .kopf .titel { font-weight: 700; color: var(--t1); }
.nb-planung-vorrat .kopf .n { font-size: 11px; color: var(--t2); background: var(--surf2); border-radius: 8px; padding: 1px 7px; }
.nb-planung-vorrat .hinweis, .nb-planung-vorrat .leer { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-planung-vorrat .aufgabe { padding: 8px 10px; border-radius: 8px; background: var(--surf); border: 1px solid var(--line); cursor: grab; }
.nb-planung-vorrat .aufgabe { touch-action: pan-x pan-y; user-select: none; -webkit-touch-callout: none; }
.nb-planung-vorrat .aufgabe.gezogen { opacity: .45; border-style: dashed; }
.nb-planung.zieht { cursor: grabbing; user-select: none; }
.nb-planung-vorrat .aufgabe:hover { border-color: var(--line2); }
.nb-planung-vorrat .aufgabe.gewaehlt { border-color: var(--pri); box-shadow: 0 0 0 2px var(--pri-w); }
.nb-planung-vorrat .aufgabe .t { color: var(--t1); font-size: var(--nb-schrift-bedienung); }
.nb-planung-vorrat .aufgabe .f { color: var(--t2); font-size: 11.5px; }
.nb-planung-vorrat .aufgabe.ueberfaellig .f { color: var(--bad); }
.nb-planung-raster { display: grid; gap: 1px; background: var(--line); margin: 0 12px; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
.nb-planung-raster .kopfzelle { background: var(--surf2); padding: 8px 10px; font-size: 12px; color: var(--t2); }
.nb-planung-raster .kopfzelle.heute { color: var(--pri-t); font-weight: 700; }
.nb-planung-raster .abschnitt { background: var(--surf2); padding: 6px 10px; font-size: 11px; color: var(--t3); text-transform: uppercase; letter-spacing: .06em; }
.nb-planung-raster .name { background: var(--surf); padding: 8px 10px; display: flex; align-items: center; gap: 6px; color: var(--t1); font-size: var(--nb-schrift-bedienung); }
.nb-planung-raster .name.gesperrt { color: var(--t2); }
.nb-planung-raster .zelle { background: var(--surf); padding: 6px 8px; display: flex; flex-direction: column; gap: 4px; min-height: 52px; }
.nb-planung-raster .zelle.planbar { cursor: copy; }
.nb-planung-raster .zelle.ziel:hover { background: var(--pri-w); }
.nb-planung-raster .zelle.gesperrt { background: color-mix(in srgb, var(--surf) 85%, var(--bg)); }
.nb-planung-raster .band { position: relative; height: 18px; border-radius: 4px; background: var(--bg); }
.nb-planung-raster .band .block { position: absolute; top: 2px; bottom: 2px; border-radius: 3px; }
.nb-planung-raster .block.termin, .nb-planung-legende .block.termin { background: color-mix(in srgb, var(--pri) 65%, transparent); }
.nb-planung-raster .block.aufgabe, .nb-planung-legende .block.aufgabe { background: color-mix(in srgb, var(--ok) 60%, transparent); }
.nb-planung-raster .block.abwesenheit, .nb-planung-legende .block.abwesenheit { background: color-mix(in srgb, var(--warn) 55%, transparent); }
.nb-planung-raster .block.anfahrt, .nb-planung-legende .block.anfahrt { background: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--pri) 45%, transparent) 0 3px, transparent 3px 6px); }
.nb-planung-raster .block.anfahrt.eng { background: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--bad) 60%, transparent) 0 3px, transparent 3px 6px); }
.nb-planung-raster .auslastung { position: relative; height: 16px; border-radius: 4px; background: var(--surf2); overflow: hidden; font-size: 10.5px; }
.nb-planung-raster .auslastung .balken { position: absolute; left: 0; top: 0; bottom: 0; background: color-mix(in srgb, var(--ok) 35%, transparent); }
.nb-planung-raster .auslastung.voll .balken { background: color-mix(in srgb, var(--warn) 45%, transparent); }
.nb-planung-raster .auslastung.ueber .balken { background: color-mix(in srgb, var(--bad) 45%, transparent); }
.nb-planung-raster .auslastung .text { position: relative; padding: 0 6px; color: var(--t2); line-height: 16px; }
.nb-planung-raster .auslastung.frei { background: none; }
.nb-planung-legende { display: flex; gap: 16px; align-items: center; margin: 8px 12px 16px; font-size: 11.5px; color: var(--t2); }
.nb-planung-legende i.block { display: inline-block; width: 14px; height: 10px; border-radius: 2px; margin-right: 5px; vertical-align: middle; }
.nb-planung-legende .leise { color: var(--t3); }

/* ═══ Musterfläche des Designers (Designmuster, flow-design-007) ═════════════════════════════════
   Alle Werte kommen aus den Variablen, die DesignVerwalter.MusterStil am Container setzt - deshalb
   steht hier keine Farbe, und deshalb zeigt die Fläche den Entwurf und nicht das Gespeicherte. */
.nb-muster {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px;
    padding: 18px; background: var(--bg); color: var(--t1); border-radius: var(--nb-radius-fenster);
}
.nb-muster-block {
    position: relative; display: flex; flex-direction: column; gap: 10px; padding: 14px;
    border: 1px solid var(--line); border-radius: var(--nb-radius-marke); background: var(--surf); cursor: pointer;
}
.nb-muster-block:hover { border-color: var(--pri); }
.nb-muster-block.flaechen, .nb-muster-block.fenster { grid-column: 1 / -1; }
.nb-muster-marke {
    font-size: var(--nb-schrift-gruppenlabel); font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--t3);
}
.nb-muster-reihe { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

.nb-muster-app { display: grid; grid-template-columns: 200px minmax(0, 1fr); border: 1px solid var(--line); border-radius: var(--nb-radius-eintrag); overflow: hidden; }
.nb-muster-leiste { display: flex; flex-direction: column; gap: 2px; padding: 8px; background: var(--bg2); border-right: 1px solid var(--line); }
.nb-muster-leiste .gruppe { padding: 10px 8px 4px; font-size: var(--nb-schrift-gruppenlabel); font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--t3); }
.nb-muster-leiste a { display: flex; align-items: center; padding: 6px 8px; border-radius: var(--nb-radius-knopf); color: var(--t2); font-size: var(--nb-schrift-bedienung); }
.nb-muster-leiste a.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }
.nb-muster-leiste .zahl { margin-left: auto; padding: 0 6px; border-radius: 99px; background: var(--pri); color: var(--auf-pri); font-size: 10px; font-weight: 700; }
.nb-muster-liste { display: flex; flex-direction: column; background: var(--surf); }
.nb-muster-liste .zeile { display: grid; grid-template-columns: 1fr auto; gap: 2px 8px; padding: 10px 12px; border-bottom: 1px solid var(--line); }
.nb-muster-liste .zeile.gewaehlt { background: var(--pri-w); }
.nb-muster-liste .zeile.hover { background: var(--nb-hover); }
.nb-muster-liste .name { font-weight: 600; color: var(--t1); }
.nb-muster-liste .zeit { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-muster-liste .betreff { grid-column: 1 / -1; color: var(--t1); font-size: var(--nb-schrift-eintrag); }
.nb-muster-liste .auszug { grid-column: 1 / -1; color: var(--t2); font-size: var(--nb-schrift-beiwerk); }

.nb-muster-felder { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.nb-muster-aufklapper {
    align-self: flex-start; min-width: 180px; padding: 4px 0; border-radius: var(--mud-default-borderradius);
    background: var(--aufklapper); box-shadow: 0 0 0 1px var(--feld-rand), var(--schatten);
}
.nb-muster-aufklapper .eintrag { padding: 6px 12px; font-size: var(--nb-schrift-eingabe); color: var(--t1); }
.nb-muster-aufklapper .eintrag.an { background: var(--pri-w); color: var(--pri-t); }

.nb-muster-zustand { padding: 2px 9px; border-radius: 10px; font-size: var(--nb-schrift-beiwerk); font-weight: 600; }
.nb-muster-zustand.ok { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }
.nb-muster-zustand.warn { background: color-mix(in srgb, var(--warn) 18%, transparent); color: var(--warn); }
.nb-muster-zustand.bad { background: color-mix(in srgb, var(--bad) 18%, transparent); color: var(--bad); }
.nb-muster-zustand.info { background: color-mix(in srgb, var(--info) 18%, transparent); color: var(--info); }

.nb-muster-knoten {
    padding: 6px 10px; border-radius: var(--nb-radius-eintrag); font-size: var(--nb-schrift-bedienung); color: var(--t1);
    border: 1px solid var(--nb-kategorie); background: color-mix(in srgb, var(--nb-kategorie) var(--nb-kat-flaeche), transparent);
}

.nb-muster-monat { display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
.nb-muster-monat .tag { display: flex; flex-direction: column; gap: 2px; min-height: 48px; padding: 4px; background: var(--kal-basis); }
.nb-muster-monat .nr { font-size: var(--nb-schrift-beiwerk); color: var(--t2); }
.nb-muster-monat .heute .nr { align-self: flex-start; padding: 0 5px; border-radius: 99px; background: var(--pri); color: var(--auf-pri); font-weight: 700; }
.nb-muster-monat .eintrag {
    padding: 1px 4px; border-radius: 4px; font-size: 10px; color: var(--t1);
    background: color-mix(in srgb, var(--kf) 17%, var(--kal-basis)); border-left: 2px solid var(--kf);
}

.nb-muster-balken { display: flex; align-items: flex-end; gap: 10px; height: 90px; }
.nb-muster-balken span { flex: 1; height: var(--h); border-radius: 4px 4px 0 0; background: var(--kf); }

.nb-muster-papier { padding: 14px 18px; border-radius: var(--nb-radius-eintrag); background: var(--papier); color: var(--papier-text); }
.nb-muster-papier blockquote { margin: 6px 0; padding-left: 10px; border-left: 3px solid var(--papier-linie); color: var(--papier-leise); }
.nb-muster-papier a { color: var(--papier-verweis); }

.nb-muster-block.fenster .nb-bogen { border: 1px solid var(--line2); border-radius: var(--nb-radius-fenster); overflow: hidden; }
.nb-muster-notiz { padding: 10px 0; color: var(--t1); }

/* ═══ Der Designer (DesignManager, flow-design-009) - aufgebaut wie der Kalender ═══════════════════ */
.nb-design-leiste .kopf { display: flex; align-items: center; gap: 6px; }
.nb-design-steuerung { display: flex; flex-direction: column; gap: 8px; padding: 6px 11px 4px; }
.nb-design-gruppe { display: flex; align-items: center; cursor: pointer; }
.nb-design-gruppe .n {
    margin-left: auto; padding: 0 6px; border-radius: 99px; background: var(--surf3);
    font-size: var(--nb-schrift-beiwerk); color: var(--t2);
}
.nb-design-inhalt { display: flex; flex-direction: column; gap: 12px; }
.nb-design-kopf { display: flex; align-items: center; gap: 12px; }
.nb-design-stand { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-design-modus { display: inline-flex; padding: 2px; border: 1px solid var(--line); border-radius: var(--nb-radius-knopf); background: var(--bg); }
.nb-design-modus button {
    border: none; background: transparent; color: var(--t2); font: inherit; font-size: var(--nb-schrift-bedienung);
    padding: 5px 12px; border-radius: 6px; cursor: pointer;
}
.nb-design-modus button.an { background: var(--pri-w); color: var(--pri-t); }
.nb-design-warnungen { display: flex; flex-direction: column; gap: 4px; }
.nb-design-warnungen .warnung {
    display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: var(--nb-radius-eintrag);
    background: color-mix(in srgb, var(--warn) 14%, transparent); color: var(--t1); font-size: var(--nb-schrift-bedienung);
}
.nb-design-warnungen .warnung .mud-icon-root { color: var(--warn); }

.nb-design-farben { display: flex; flex-direction: column; }
.nb-design-zeile {
    display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) minmax(0, 1fr); gap: 10px; align-items: center;
    padding: 10px 0; border-bottom: 1px solid var(--line);
}
.nb-design-zeile.kopf {
    padding: 12px 0 6px; font-size: var(--nb-schrift-gruppenlabel); font-weight: 600; letter-spacing: .08em;
    text-transform: uppercase; color: var(--t3);
}
.nb-design-zeile .gemeinsam { grid-column: 2 / -1; }
.nb-design-zeile .name { font-weight: 600; color: var(--t1); }
.nb-design-zeile .wo, .nb-design-schrift .wo, .nb-design-groesse .wo { font-size: var(--nb-schrift-beiwerk); color: var(--t2); }
.nb-design-zeile .herkunft { margin-top: 2px; font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-design-farbfeld { display: flex; align-items: center; gap: 6px; }
.nb-design-farbfeld input[type="color"] {
    flex: 0 0 auto; width: 34px; height: 30px; padding: 0; border: 1px solid var(--feld-rand);
    border-radius: var(--nb-radius-knopf); background: transparent; cursor: pointer;
}
.nb-design-farbfeld .wert { flex: 1 1 auto; }
.nb-design-farbfeld.standard .wert input { color: var(--t3); }

.nb-design-schriften { display: flex; flex-direction: column; gap: 14px; padding-top: 12px; }
.nb-design-schrift { display: flex; flex-direction: column; gap: 4px; }
.nb-design-groesse { display: grid; grid-template-columns: minmax(0, 1fr) 200px 56px; align-items: center; gap: 12px; }
.nb-design-groesse .name { display: flex; flex-direction: column; color: var(--t1); }
.nb-design-groesse .px { font-size: var(--nb-schrift-beiwerk); color: var(--t2); text-align: right; }
.nb-design-fensterkopf {
    display: flex; align-items: center; justify-content: space-between; padding: 12px 0 4px;
    font-size: var(--nb-schrift-gruppenlabel); font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--t3);
}
.nb-design-fenster .nb-muster { grid-template-columns: minmax(0, 1fr); padding: 10px; }

/* Dateien im Chat (flow-mobile-034): Bilder in fester Höchstgröße, damit ein Foto den Verlauf nicht sprengt. */
.nb-chat-dateien { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
/* Bitte um einen Screenshot im Support-Chat (ADR-0216): die Knöpfe stehen unter dem Text. */
.nb-chat-screenshotbitte { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.nb-chat-screenshotbitte .hinweis { font-size: 12.5px; color: var(--t2); }
/* Die Rückfrage (kommunikation-027): die Nachricht, die Frage, die Knöpfe - als Karte, nicht als Text. */
.nb-rueckfragekarte { margin-top: 4px; padding: 8px 10px; border: 1px solid var(--line); border-left: 3px solid var(--pri);
    border-radius: 6px; background: var(--surf); max-width: 460px; }
.nb-rueckfragekarte.beantwortet { border-left-color: var(--ok); }
.nb-rueckfragekarte .kopf { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--t2); text-transform: uppercase; letter-spacing: .04em; }
.nb-rueckfragekarte .nachricht { display: flex; flex-wrap: wrap; gap: 6px; font-size: 12.5px; color: var(--t2); margin-top: 4px; }
.nb-rueckfragekarte .nachricht .absender { color: var(--t1); font-weight: 600; }
.nb-rueckfragekarte .frage { margin-top: 6px; color: var(--t1); white-space: pre-wrap; }
.nb-rueckfragekarte .knoepfe { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.nb-rueckfragekarte .antwort, .nb-rueckfragekarte .hinweis { margin-top: 8px; font-size: 13px; color: var(--t2); }
.nb-rueckfragekarte .wann { color: var(--t3); }
.nb-rueckfrage-option { display: grid; grid-template-columns: 1fr 220px auto; gap: 8px; align-items: center; margin-top: 4px; }
.nb-rueckfrage-nachrichten .nachricht { padding: 10px 0; border-bottom: 1px solid var(--line); }
.nb-rueckfrage-nachrichten .nachricht.intern { background: var(--surf2); padding: 10px; }
.nb-rueckfrage-nachrichten .kopf { font-size: 12.5px; color: var(--t2); margin-bottom: 4px; }
.nb-rueckfrage-nachrichten .text { white-space: pre-wrap; color: var(--t1); }
/* Freigabe einer Unterhaltung (kommunikation-031) */
.nb-freigabe-laufend { display: flex; align-items: center; gap: 8px; padding: 4px 0; border-bottom: 1px solid var(--line); }
.nb-freigabe-laufend .wer { color: var(--t1); font-weight: 600; }
.nb-freigabe-laufend .bis { color: var(--t2); font-size: 12.5px; flex: 1; }
.nb-freigabe-zeile { display: flex; flex-direction: column; gap: 2px; padding: 8px 12px; border-bottom: 1px solid var(--line); color: var(--t1); cursor: pointer; }
.nb-freigabe-zeile.on { background: var(--surf2); }
.nb-freigabe-zeile .von { color: var(--t2); font-size: 12.5px; }
.nb-freigaben-inhalt { overflow-y: auto; padding: 12px 16px; }
.nb-freigabesicht .leer { color: var(--t3); padding: 12px; }
/* Die Vorschau zeigt das ganze Bild, nie beschnitten. */
.nb-screenshot-vorschau .nb-screenshot-bild { display: block; max-width: 100%; max-height: 62vh; margin: 0 auto; object-fit: contain;
    border: 1px solid var(--line); border-radius: 6px; }
.nb-chat-bild-knopf { padding: 0; border: 0; background: none; cursor: pointer; }
.nb-chat-bild { max-width: 240px; max-height: 180px; border-radius: var(--nb-radius-eintrag); display: block; }
.nb-chat-anhaenge-offen { display: flex; flex-wrap: wrap; gap: 4px; padding: 0 8px; }

/* Chat-Archiv (flow-mobile-034): Suche, Funde, Ausschnitt */
.nb-chat-archivsuche { border-bottom: 1px solid var(--line); padding: 8px 14px; max-height: 300px; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; }
.nb-chat-archiv-treffer { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; text-align: left; background: none; border: 0; border-radius: var(--nb-radius-eintrag); padding: 6px 8px; cursor: pointer; color: var(--t1); font: inherit; }
.nb-chat-archiv-treffer:hover { background: var(--nb-hover); }
.nb-chat-archiv-treffer .meta { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-chat-archiv-leer { font-size: var(--nb-schrift-beiwerk); color: var(--t3); padding: 4px 8px; }
.nb-chat-archiv-linie { text-align: center; font-size: var(--nb-schrift-beiwerk); color: var(--t3); padding: 4px 0; }
.nb-chat-archiv-linie button { background: none; border: 0; padding: 0; color: var(--pri-t); cursor: pointer; font: inherit; text-decoration: underline; }
.nb-chat-ausschnitt-leiste { display: flex; align-items: center; justify-content: space-between; padding: 4px 14px; border-bottom: 1px solid var(--line); font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-chat-beitrag.fundstelle { outline: 2px solid var(--pri); outline-offset: 2px; }

/* „Chats“ in der Kommunikation (ADR-0212): eine Zeile je Unterhaltung, Filter-Chips statt weiterer Leisten-Zeilen. */
.nb-chatsicht-suche { padding: 8px 12px 0; }
.nb-chatsicht-suche .mud-input-control { margin: 0; }
.nb-chatsicht-chips { display: flex; flex-wrap: wrap; gap: 5px; padding: 6px 12px 8px; border-bottom: 1px solid var(--line); }
.nb-chatsicht-chips button { font: inherit; font-size: 11.5px; padding: 3px 9px; border-radius: 99px; border: 0;
  background: var(--surf2); color: var(--t2); cursor: pointer; }
.nb-chatsicht-chips button.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }
.nb-chatsicht-raum { display: flex; gap: 6px; align-items: center; padding: 6px 12px; border-bottom: 1px solid var(--line); }
/* Das Zahnrad an „Chats“ (kommunikation-015): Gruppen-Chats wählen, offenen Gruppen schreiben. */
.nb-chatsicht-gruppen { padding: 6px 12px 8px; border-bottom: 1px solid var(--line); }
.nb-chatsicht-gruppen .titel { font-size: 11px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase; color: var(--t3); margin: 6px 0 2px; }
.nb-chatsicht-gruppen .leer { font-size: 12px; color: var(--t3); padding: 4px 0; }
.nb-chatsicht-gruppen .fremd { display: flex; align-items: center; justify-content: space-between; font-size: 13px; }
.nb-chatzeile { display: flex; gap: 10px; align-items: center; padding: 9px 12px; border-bottom: 1px solid var(--line);
  cursor: pointer; position: relative; }
.nb-chatzeile:hover { background: var(--nb-hover); }
.nb-chatzeile.on { background: var(--pri-w); }
.nb-chatzeile .bild { width: 32px; height: 32px; flex: 0 0 32px; border-radius: 10px; background: var(--surf3); color: var(--t2);
  display: grid; place-items: center; font-size: 12px; font-weight: 700; position: relative; }
.nb-chatzeile .bild.raum { border-radius: 50%; }
.nb-chatzeile .bild.gruppe, .nb-chatzeile .bild.ki { background: var(--pri-w); color: var(--pri-t); }
/* Netbits-Support und Support-Fälle (ADR-0216): Symbol statt Buchstabe, abgesetzt wie die KI. */
.nb-chatzeile .bild.support, .nb-chatzeile .bild.supportfall { background: var(--pri-w); color: var(--pri-t); }
.nb-chatzeile .bild.supportfall { border-radius: 50%; }
.nb-chatzeile .bild .nb-pres { position: absolute; right: -2px; bottom: -2px; }
.nb-chatzeile .mitte { flex: 1; min-width: 0; }
.nb-chatzeile .oben { display: flex; align-items: baseline; gap: 6px; }
.nb-chatzeile .oben b { font-size: 13px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nb-chatzeile .art { font-size: var(--nb-schrift-beiwerk); color: var(--t3); border: 1px solid var(--line); border-radius: 5px; padding: 0 4px; }
.nb-chatzeile .zeit { margin-left: auto; font-size: var(--nb-schrift-beiwerk); color: var(--t3); white-space: nowrap; }
.nb-chatzeile .text { font-size: 12px; color: var(--t2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
.nb-chatzeile .ung { background: var(--pri); color: var(--auf-pri); font-size: 10px; font-weight: 700; border-radius: 99px; padding: 1px 6px; }
/* Die Nadel erscheint beim Darüberfahren - angeheftet steht sie immer da, damit man sieht, warum die Zeile oben steht. */
.nb-chatzeile .anheften { border: 0; background: transparent; color: var(--t3); cursor: pointer; padding: 2px; opacity: 0; }
.nb-chatzeile:hover .anheften, .nb-chatzeile .anheften.an { opacity: 1; }
.nb-chatzeile .anheften.an { color: var(--pri-t); }
/* Der Verlauf füllt die Inhaltsspalte - die Fläche bringt Kopf, Verlauf und Eingabe selbst mit. */
.nb-chatsicht .nb-pf-inhalt > .nb-mf { height: 100%; }

/* Kontakte importieren (datenuebernahme-001): Spaltenzuordnung, Liste mit Vorschlag je Kontakt, Bericht. */
.nb-import-spalten { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; margin-bottom: 12px; }
.nb-import-spalten > .mud-typography { grid-column: 1 / -1; }
.nb-import-neu-lesen { grid-column: 1 / -1; justify-self: start; }
.nb-import-liste { display: flex; flex-direction: column; border-top: 1px solid var(--line); }
.nb-import-zeile { display: flex; gap: 12px; align-items: center; padding: 8px 4px; border-bottom: 1px solid var(--line); }
.nb-import-zeile .name { flex: 1; min-width: 0; }
.nb-import-zeile .firma { color: var(--t2); }
.nb-import-zeile .wege, .nb-import-zeile .hinweis { font-size: 12px; color: var(--t2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-import-zeile .hinweis { color: var(--pri-t); }
/* Ampel (Auftraggeber, 09.10.2026): der Streifen links sagt, wie genau man hinsehen muss. */
.nb-import-zeile { border-left: 4px solid transparent; }
.nb-import-zeile.stufe-rot { border-left-color: var(--bad); }
.nb-import-zeile.stufe-gelb { border-left-color: var(--warn); }
.nb-import-zeile.stufe-gruen { border-left-color: var(--ok); }
.nb-import-zeile.stufe-grau { border-left-color: var(--line); }
.nb-import-zeile.stufe-rot .hinweis, .nb-import-zeile.stufe-rot .ergebnis { color: var(--bad); }
.nb-import-legende { display: flex; gap: 16px; font-size: 12px; color: var(--t2); margin-bottom: 6px; }
.nb-import-legende span { border-left: 4px solid var(--line); padding-left: 6px; }
.nb-import-legende .stufe-rot { border-left-color: var(--bad); }
.nb-import-legende .stufe-gelb { border-left-color: var(--warn); }
.nb-import-legende .stufe-gruen { border-left-color: var(--ok); }
.nb-import-kategorien { margin-bottom: 12px; }
.nb-import-zeile .aktion { max-width: 280px; }
.nb-import-zeile .ergebnis { font-size: 12px; color: var(--t2); white-space: nowrap; }
.nb-import-stand { color: var(--t2); margin-bottom: 8px; }

/* ── Umbau Referenzfenster: Paket B ── */
/* Versionen eines Dokuments: Einträge wie die Treffer der Bausteinwahl, aber ohne Wahl - der Knopf darin lädt herunter. */
.nb-dokument-fenster .eintrag { cursor: default; }
.nb-dokument-fenster .eintrag .symbol { font-size: var(--nb-schrift-beiwerk); font-weight: 600; }

/* ── Umbau Referenzfenster: Paket D ── */
/* Terminfenster im Fensterraster: Titel und Kalender stehen über jedem Abschnitt, mit Linie darunter. */
.nb-terminbogen .tb-titelzeile {
    display: flex; align-items: center; gap: 10px; padding-bottom: 10px; border-bottom: 1px solid var(--line);
}
.nb-terminbogen .tb-titelzeile .tb-titel { flex: 1 1 auto; min-width: 0; }
/* Nur der Wann-Abschnitt rückt die Zeilen unter seine Beschriftungen ein - jetzt steht jeder Abschnitt allein. */
.nb-terminbogen .tb-abschnitte > .tb-abschnitt { border-bottom: none; }
.nb-terminbogen .tb-abschnitte > .tb-abschnitt:not(.tb-wann) .tb-zwei { padding-left: 0; }
.nb-terminbogen .tb-abschnitte > .tb-abschnitt.tb-wann .tb-zwei { padding-left: 64px; }
/* Was vor dem Speichern zu sehen sein muss, steht rechts - die Warnungen dort ohne eigene Spaltenbreite. */
.nb-terminbogen .einzelheit .nb-raumkonflikt .mud-alert-message { overflow-wrap: anywhere; }
@media (max-width: 1100px) {
    .nb-terminbogen .tb-abschnitte > .tb-abschnitt.tb-wann .tb-zwei { padding-left: 0; }
}
/* Der Kalendername in der Pille bricht nicht um - sonst wird sie zweizeilig und höher als der Titel. */
.nb-terminbogen .tb-titelzeile .tb-pille { white-space: nowrap; }
/* Arbeitszeiten: Tag, „frei“, Von, Bis in festen Spalten - untereinander bündig, die Uhrzeit nie abgeschnitten. */
.nb-arbeitszeit .nb-az-zeile { display: grid; grid-template-columns: 34px 80px 140px 140px; gap: 8px; align-items: center; }

/* ── Umbau Referenzfenster: Paket G ── */

/* Abläufe verwalten steht jetzt IM Fensterraster. Die alten Maße der eigenen Fläche (zwei Spalten, 52vh, negative
   Ränder) gälten sonst weiter und nähmen der Einzelheit die dritte Spalte. */
.nb-fensterraster.nb-ablaufverwaltung {
    grid-template-columns: var(--nb-breite-seitenleiste) minmax(0, 1fr) var(--nb-breite-detail);
    height: 50vh;
    min-height: 380px;
    margin: 0;
}
.nb-fensterraster.nb-ablaufverwaltung .ordnerspalte { background: none; border-right: none; }
.nb-fensterraster.nb-ablaufverwaltung .nb-suchtreffer { height: auto; min-height: 0; margin: 0; padding: 0; border-top: none; overflow: visible; }
.nb-fensterraster.nb-ablaufverwaltung .eintrag .zustand { margin-left: auto; }
@media (max-width: 900px) {
    .nb-fensterraster.nb-ablaufverwaltung { grid-template-columns: minmax(0, 1fr); height: auto; }
}

/* Die Knoteneinstellungen sind die Mitte des Rasters: Eingang | Maske (| Ergebnis) mit Griffen, jede Spalte scrollt
   für sich. Die Mitte selbst polstert und scrollt deshalb nicht. */
.nb-fensterraster.nb-knotenraster > .mitte { padding: 0; overflow: hidden; }
.nb-knoteneinstellungen { display: grid; height: 100%; min-height: 0; }
.nb-knoteneinstellungen > * { overflow-y: auto; min-height: 0; padding: var(--nb-abstand-fenster); }

/* ── Umbau Referenzfenster: Paket E ── */

/* Die Rückfrage vor dem Löschen steht oben in der Mitte, nicht mittig in einer leeren Fläche. */
.nb-fensterraster .mitte .nb-kat-loeschfrage { height: auto; padding-top: 2rem; }

/* Lesefenster, deren Inhalt die ganze Mitte füllt (Chat, Dateivorschau, Original): hoch wie ein Formular, der
   Inhalt füllt die Spalte. Der Chat ohne Innenabstand - die Messenger-Fläche bringt ihren eigenen mit. */
.nb-fensterraster.nb-chatraster,
.nb-fensterraster.nb-vorschauraster,
.nb-fensterraster.nb-originalraster { height: min(76vh, 820px); }
.nb-fensterraster.nb-chatraster .mitte { padding: 0; }
.nb-fensterraster.nb-chatraster .mitte,
.nb-fensterraster.nb-vorschauraster .mitte { display: flex; flex-direction: column; overflow: hidden; }
.nb-fensterraster.nb-chatraster .mitte > .nb-mf,
.nb-fensterraster.nb-vorschauraster .mitte > * { flex: 1 1 auto; min-height: 0; }
.nb-bogen.nb-chatfenster { height: auto; }
.nb-fensterraster .einzelheit .nb-vorschau-detailname { overflow-wrap: anywhere; }
.nb-fensterraster .einzelheit .nb-textvorschlag { gap: .75rem; }

/* ── Umbau Referenzfenster: Paket F ── */

/* Importfenster (Shared/Importraster): Zeilen sind lang - die Höhe eines Formulars, fest, nicht mitwachsend. */
.nb-fensterraster.nb-importraster { height: min(72vh, 760px); }

/* Die Ampel färbt Symbol, Marke und Unterzeile über dieselbe Variable wie die Kategorien der Referenz. */
.nb-importraster .stufe-rot { --nb-kategorie: var(--bad); }
.nb-importraster .stufe-gelb { --nb-kategorie: var(--warn); }
.nb-importraster .stufe-gruen { --nb-kategorie: var(--ok); }
.nb-importraster .stufe-grau { --nb-kategorie: var(--t3); }
/* Der Hinweis ist das, was zu prüfen ist (Labor 10.10.2026: „Man sieht nicht, wo das Problem liegt“) - als Kasten in
   der Farbe der Ampel, der Text selbst in normaler Schrift, damit er sich lesen lässt. */
.nb-importraster .nb-importhinweis {
    color: var(--mud-palette-text-primary);
    border-left: 3px solid var(--nb-kategorie, var(--t3));
    background: color-mix(in srgb, var(--nb-kategorie, var(--t3)) 12%, transparent);
    border-radius: 4px;
    padding: .5rem .75rem;
}

/* Vor dem Lesen stehen Wahl und Dateiknopf in der Leiste untereinander. */
.nb-importwahl { display: flex; flex-direction: column; gap: .5rem; }

/* Was für den ganzen Import gilt, steht über dem Primärknopf - als Block, nicht als Knopfreihe. */
.nb-importraster .einzelheit .nebenaktionen:has(> .nb-importgesamt) { display: block; }
.nb-importgesamt { display: flex; flex-direction: column; gap: .35rem; }
.nb-importgesamt .nb-import-stand { margin: 0; font-size: var(--nb-schrift-beiwerk); }

/* Eine Angabe der gewählten Zeile: Name klein darüber, der Wert ganz - nichts abgeschnitten. */
.nb-importangabe { display: flex; flex-direction: column; margin-bottom: .55rem; }
.nb-importangabe .name { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-importangabe .wert { overflow-wrap: anywhere; white-space: pre-line; }

/* Einträge, die nur zeigen (Rückfrage „Ordner löschen?“): aussehen wie die Liste, aber nicht klickbar wirken. */
.nb-fensterraster .eintrag.nb-nur-lesen { cursor: default; }
.nb-fensterraster .eintrag.nb-nur-lesen:hover { background: transparent; }
.nb-fensterraster .eintrag .zustand { margin-left: auto; }

/* Zustandsfarben für Symbol und Marke in der Einzelheit - nur Variablen. */
.nb-fensterraster .nb-symbol-loeschen,
.nb-fensterraster .nb-lauf-fehler,
.nb-fensterraster .nb-ki-gescheitert { --nb-kategorie: var(--bad); }
.nb-fensterraster .nb-lauf-offen,
.nb-fensterraster .nb-guete-unsicher { --nb-kategorie: var(--warn); }
.nb-fensterraster .nb-ki-fertig,
.nb-fensterraster .nb-guete-gut { --nb-kategorie: var(--ok); }
.nb-fensterraster .beschreibung.nb-lauf-fehler { color: var(--bad); }
.nb-ki-seit { opacity: .75; font-size: var(--nb-schrift-beiwerk); margin-top: .25rem; }

/* Eine volle Einzelheit scrollt - sie darf dabei den Primärknopf und die Nebenaktionen nicht zusammendrücken
   (gemessen 10.10.2026: „Durchspielen“ und „2 übernehmen“ waren nur noch ein Strich). */
.nb-fensterraster .einzelheit .primaer,
.nb-fensterraster .einzelheit > .nebenaktionen { flex-shrink: 0; }
/* Und er bleibt unten sichtbar, während die Einzelheit darüber scrollt - halb abgeschnitten fände ihn niemand. */
.nb-fensterraster .einzelheit .primaer {
    position: sticky;
    bottom: 0;
    box-shadow: 0 calc(var(--nb-abstand-fenster) * -1) 0 0 color-mix(in srgb, var(--mud-palette-background) 35%, var(--mud-palette-surface)),
                0 var(--nb-abstand-fenster) 0 0 color-mix(in srgb, var(--mud-palette-background) 35%, var(--mud-palette-surface));
}

/* Leiste einrichten: die Handgriffe rechts am Eintrag, ausgeblendete Gruppen durchgestrichen. */
.nb-leisteneinrichtung .griffe { display: flex; margin-left: auto; flex: none; }
.nb-leisteneinrichtung .eintrag .text { flex: 1; min-width: 0; align-items: stretch; }
.nb-leisteneinrichtung .eintrag .titel, .nb-leisteneinrichtung .eintrag .unter { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-leisteneinrichtung .nb-leiste-start { margin-bottom: 12px; }
.nb-leisteneinrichtung .griffe .platzhalter { width: 27px; flex: none; }
/* Ziehen in der Leiste der Kommunikation (Shared/Leistenzugflaeche, Ziehplatz): blass, was gezogen wird; umrandet, wohin. */
.nb-leistenzug.zieht { cursor: grabbing; }
.nb-ziehplatz { user-select: none; -webkit-user-select: none; border-radius: 9px; }
.nb-ziehplatz.gezogen { opacity: .4; }
.nb-ziehplatz.ziel { outline: 2px dashed var(--pri); outline-offset: -2px; }
.nb-ziehplatz.gehalten { outline: 2px solid var(--pri); outline-offset: -2px; }
.nb-leisteneinrichtung .leer { color: var(--t3); padding: 12px; }
.nb-leisteneinrichtung .eintrag.aus .titel { text-decoration: line-through; color: var(--t3); }

/* Die Hilfe der Einstellungen steht in der Einzelheit unter der Beschreibung, nicht rechts oben im Abschnitt. */
.nb-fensterraster .einzelheit .nb-einst-kopf { justify-content: flex-start; margin-top: var(--nb-abstand-gruppen); }

/* „Neuer Ordner“ über dem Primärknopf: das Feld nimmt die ganze Breite, die leisen Knöpfe darunter. */
.nb-ordnerwahl-neu { flex: 1 1 100%; }

/* Die Sichtprüfung braucht Höhe für Original und Text nebeneinander; die Mitte reicht sie an den Vergleich weiter. */
.nb-fensterraster.nb-erkennungsraster { height: min(80vh, 900px); }
.nb-erkennungsraster .mitte { display: flex; flex-direction: column; }

/* ── Stammdaten-Import (Kategorien, Markierungen, Abläufe) ── */
/* Die Farbe einer Zeile als Punkt - der Wert ist ein Datum aus der Datei, kein Farbwert im Code. */
.nb-importfarbe { display: flex; align-items: center; gap: .4rem; font-size: var(--nb-schrift-beiwerk); color: var(--mud-palette-text-secondary); }
.nb-importfarbe .punkt { width: .6rem; height: .6rem; border-radius: 50%; background: var(--nb-kategorie, var(--nb-kat-neutral)); }

/* Die Fenster-Probe der Designer-Musterfläche: dasselbe Raster wie jedes Fenster, nur niedrig und schmal. */
.nb-fensterraster.nb-muster-raster { height: 180px; min-height: 0; grid-template-columns: 110px minmax(0, 1fr) 140px; }
.nb-muster-raster .nb-muster-primaer {
    display: flex; align-items: center; justify-content: center; height: 32px; border-radius: var(--nb-radius-knopf);
    background: var(--mud-palette-primary); color: var(--mud-palette-primary-text);
    font-size: var(--nb-schrift-beiwerk); font-weight: 600;
}

/* Neue Fassung am Server: ein schmales Band über der Arbeitsfläche, mit Knopf zum Neuladen. */
.nb-neue-fassung { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 6px 12px;
    background: var(--pri-w); color: var(--pri-t); border-bottom: 1px solid var(--line); font-size: 13px; }

/* Einstellungen „Priorisiert“ (ADR-0219): Briefing, wichtige Kontakte, Probe an echten Mails. */
.nb-prio .nb-leise { color: var(--t3); }
.nb-prio-mails { display: flex; flex-direction: column; gap: 2px; max-height: 360px; overflow-y: auto; }
.nb-prio-mail { display: grid; grid-template-columns: auto 1fr; align-items: start; column-gap: 4px; }
.nb-prio-mail-text { padding-top: 8px; font-size: var(--nb-schrift-beiwerk); }
.nb-prio-mail-text .marke { margin-left: 6px; }
.nb-prio-ergebnis { grid-column: 2; padding-bottom: 6px; font-size: var(--nb-schrift-beiwerk); color: var(--t2); }
.nb-prio-ergebnis .marke { margin-left: 6px; }

/* „Priorisiert“ an der Zeile (ADR-0219): die Note als kleine Zahl, der Satz darunter. */
.nb-pf-note { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px;
    padding: 0 4px; border-radius: 999px; font-size: 10px; font-weight: 600; border: 1px solid var(--line2); color: var(--t2); }
.nb-pf-note.n1 { border-color: var(--pri); color: var(--pri-t); }
.nb-pf-prio-grund .nb-pf-prio-bei, .nb-pf-prio-grund .nb-pf-prio-frist { margin-right: 6px; }
.nb-pf-prio-grund .marke { margin-left: 6px; }

/* Die fünf Noten an der Mail (ADR-0219, Punkt 2). */
.nb-mailnote { display: flex; align-items: center; gap: 4px; margin-top: 6px; font-size: var(--nb-schrift-beiwerk); }
.nb-mailnote .titel { color: var(--t3); margin-right: 4px; }
.nb-mailnote button, button.nb-note { min-width: 24px; height: 22px; padding: 0 6px; border: 1px solid var(--line2); border-radius: 999px;
    background: transparent; color: var(--t2); cursor: pointer; }
.nb-mailnote button.an, button.nb-note.an { border-color: var(--pri); color: var(--pri-t); background: var(--pri-w); }
/* Die Note in der Aufgabenliste - dieselbe Marke wie die gewählte Note, nur nicht klickbar. */
span.nb-aufgabe-note { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 18px;
    padding: 0 5px; margin-right: 6px; border: 1px solid var(--pri); border-radius: 999px; color: var(--pri-t); background: var(--pri-w);
    font-size: var(--nb-schrift-beiwerk); }
.nb-mailnote .trenn { width: 1px; height: 16px; background: var(--line2); margin: 0 6px; }
.nb-mailnote-grund { margin-top: 2px; font-size: var(--nb-schrift-beiwerk); color: var(--t3); }
.nb-mailnote-grund .marke { margin-left: 6px; }
.nb-mailnote-warum { display: flex; align-items: center; gap: 6px; margin-top: 4px; max-width: 520px; }
.nb-prio-filter .nb-prio-filterknopf { font-size: inherit; }
.nb-pfilter-neu > div { display: flex; align-items: center; gap: 4px; }
.nb-mailnote-zeitbezug { display: flex; align-items: center; gap: 8px; margin-top: 2px; font-size: var(--nb-schrift-beiwerk); color: var(--t2); }
.nb-mailnote-zeitbezug .wortlaut { color: var(--t3); }
.nb-mailnote-zeitbezug button { border: none; background: transparent; color: var(--t3); text-decoration: underline; cursor: pointer; font-size: inherit; }

/* Wiedervorlage (Block 5): Schnellwahl beim Warten. */
.nb-warten-wahl { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
.nb-warten-wahl .k { color: var(--t3); margin-right: 4px; font-size: var(--nb-schrift-beiwerk); }
.nb-warten-wahl button { padding: 2px 8px; border: 1px solid var(--line2); border-radius: 999px; background: transparent;
    color: var(--t2); cursor: pointer; font-size: var(--nb-schrift-beiwerk); }
.nb-warten-wahl button.an { border-color: var(--pri); color: var(--pri-t); background: var(--pri-w); }
.nb-warten-hinweis { font-size: var(--nb-schrift-beiwerk); color: var(--t3); }

/* Serien (Block 7): Intervall, Monatsart, übernommene Regel. */
.tb-intervall { display: flex; align-items: center; gap: 6px; margin-top: 6px; }
.tb-intervall .tb-intervall-zahl { max-width: 72px; }
.tb-fremde-regel { margin-top: 6px; font-size: var(--nb-schrift-beiwerk); color: var(--t2); }
.tb-fremde-regel code { color: var(--t1); }

/* „Zu prüfen“ je Kontakt (Block D): Kopf mit Name und Befund, darunter seine Adressen. */
.nb-zu-pruefen-kontakt { border-bottom: 1px solid var(--line); padding: 8px 4px; }
.nb-zu-pruefen-kontakt .kopf { display: flex; align-items: center; gap: 8px; cursor: pointer; }
.nb-zu-pruefen-zeile { display: flex; align-items: center; gap: 12px; padding-left: 16px; font-size: 12px; color: var(--t2); }
.nb-zu-pruefen-zeile .adresse { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.nb-zu-pruefen-zeile .zustand, .nb-zu-pruefen-zeile .seit { color: var(--t3); }

/* Die Zeitleiste unter „Wann“ (Block E): der Tag des Termins - Namen links, je Zeile eine Spur mit den Belegungen,
   „Alle frei“ zuletzt. Die Klickfläche liegt im Raster über allen Spuren - ein Feld je Rasterschritt. Linien darüber
   und darunter trennen sie von Beginn/Ende und von Wiederholung/Erinnerung. Farben nur aus dem Katalog. */
.nb-zeitleiste { margin: 12px 0; padding: 12px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
.nb-zl-kopf { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.nb-zl-kopf .nb-zl-tag { font-weight: 600; color: var(--t1); min-width: 13rem; text-align: center; }
.nb-zl-kopf .nb-zl-stand { margin-left: auto; font-size: 12.5px; }
.nb-zl-kopf .nb-zl-stand.frei { color: var(--ok); }
.nb-zl-kopf .nb-zl-stand.belegt { color: var(--bad); }
.nb-zl-fuss { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; margin-top: 12px; }
.nb-zl { display: grid; grid-template-columns: 9rem 1fr; column-gap: 10px; row-gap: 6px; position: relative; }
.nb-zl-name, .nb-zl-gruppe { grid-column: 1; }
.nb-zl-skala, .nb-zl-spur { grid-column: 2; }
.nb-zl-name { font-size: 13px; color: var(--t1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; align-self: center; }
.nb-zl-name.alle { font-weight: 600; }
.nb-zl-gruppe { font-size: 11px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--t3); margin-top: 6px; }
.nb-zl-skala { position: relative; height: 18px; border-bottom: 1px solid var(--line); }
.nb-zl-skala span { position: absolute; transform: translateX(-50%); font-size: 11px; color: var(--t3); }
.nb-zl-spur { position: relative; height: 26px; border-radius: 6px; background: var(--surf2); overflow: hidden; }
.nb-zl-spur.konflikt { box-shadow: inset 0 0 0 2px var(--bad); }
.nb-zl-block { position: absolute; top: 0; bottom: 0; }
.nb-zl-block.termin { background: color-mix(in srgb, var(--pri) 55%, transparent); }
.nb-zl-block.abwesend { background: color-mix(in srgb, var(--warn) 55%, transparent); }
.nb-zl-block.arbeitszeit, .nb-zl-block.arbeitsfrei, .nb-zl-block.vorbei { background: color-mix(in srgb, var(--t3) 30%, transparent); }
.nb-zl-block.frei { background: color-mix(in srgb, var(--ok) 45%, transparent); }
.nb-zl-legende { display: flex; flex-wrap: wrap; gap: 16px; font-size: 12px; color: var(--t2); }
.nb-zl-legende span { display: inline-flex; align-items: center; gap: 6px; }
.nb-zl-legende .nb-zl-block { position: static; display: inline-block; width: 14px; height: 10px; border-radius: 2px; }
.nb-zl-wahl { position: absolute; top: 0; bottom: 0; box-shadow: inset 0 0 0 2px var(--pri); border-radius: 4px; pointer-events: none; }
.nb-zl-felder { grid-column: 2; display: flex; z-index: 1; user-select: none; }

.nb-zl-feld { flex: 1 1 0; border: none; padding: 0; background: transparent; cursor: pointer; }
.nb-zl-feld:hover { background: color-mix(in srgb, var(--pri) 12%, transparent); }
.nb-zl-feld.frei:hover { background: color-mix(in srgb, var(--ok) 20%, transparent); }

/* E3 (mj, 13.10.2026): die eigene Antwort am Eintrag - offen gestrichelt und blasser, mit Vorbehalt gestreift.
   Zugesagt sieht aus wie jeder Termin, abgesagt kommt nicht an. Die Farbe bleibt die des Kalenders (--kf). */
.nb-kal-block.antwort-offen, .nb-kal-chip.antwort-offen, .nb-kal-zeile.antwort-offen,
.leintrag.antwort-offen, .zeile.antwort-offen { opacity: .72; outline: 1px dashed var(--kf); outline-offset: -1px; }
.nb-kal-block.antwort-vorbehalt, .nb-kal-chip.antwort-vorbehalt, .nb-kal-zeile.antwort-vorbehalt,
.leintrag.antwort-vorbehalt, .zeile.antwort-vorbehalt {
    background-image: repeating-linear-gradient(135deg, transparent 0 6px, color-mix(in srgb, var(--kf) 28%, transparent) 6px 12px); }
/* Die eigene Antwort im Terminfenster, unter dem Titel. */
.nb-terminbogen .tb-meine-antwort { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 10px; }
/* E4: „Beitreten“ am Termin - im Raster unter der Zeit, in der Liste rechts; die Einwahl im Terminfenster in einer Zeile. */
.nb-beitreten { display: inline-block; margin-top: 2px; padding: 1px 7px; border-radius: 10px; font-size: 11px; font-weight: 600;
    color: var(--kf); border: 1px solid color-mix(in srgb, var(--kf) 60%, transparent); text-decoration: none; }
.nb-beitreten:hover { background: color-mix(in srgb, var(--kf) 18%, transparent); }
.nb-kal-liste .leintrag .nb-beitreten { margin-left: auto; align-self: center; }
.nb-terminbogen .tb-einwahl { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.nb-terminbogen .tb-einwahl .nb-einwahl-nummer { flex: 2 1 0; }
.nb-terminbogen .tb-einwahl .nb-einwahl-id { flex: 1.4 1 0; }
.nb-terminbogen .tb-einwahl .nb-einwahl-pin { flex: 1 1 0; }
.nb-terminbogen a.tb-knopf { display: inline-flex; align-items: center; color: var(--t2); padding: 4px; border-radius: 6px; }
.nb-terminbogen a.tb-knopf:hover { background: var(--surf2); color: var(--t1); }

/* ---- Meine Aufgaben (ADR-0221, Entwurf vom 13.10.2026): Liste nach Fälligkeit, Schnelleingabe, Aufgabe rechts. ---- */
.nb-meine-liste > .kopf { text-transform: none; letter-spacing: 0; font-size: 12px; }
.nb-meine-liste > .kopf .nb-meine-titel { font-size: 18px; font-weight: 600; color: var(--t1); }
.nb-meine-liste > .kopf .nb-meine-anzahl {
  padding: 1px 8px; border-radius: var(--nb-radius-marke, 999px); background: var(--pri-w); color: var(--pri-t);
  font-variant-numeric: tabular-nums;
}
.nb-meine-liste > .kopf .nb-filter-kunde { max-width: 180px; }
.nb-meine-liste > .kopf .nb-meine-gruppieren { max-width: 200px; }
.nb-meine-filterknopf.on { color: var(--pri-t); }
.nb-schnelleingabe {
  display: flex; align-items: center; gap: 8px; margin: 10px 14px; padding: 8px 12px;
  border: 1px dashed var(--line2); border-radius: var(--nb-radius-eintrag, 6px); color: var(--t3);
}
.nb-schnelleingabe:focus-within { border-color: var(--pri); }
.nb-schnelleingabe-feld {
  flex: 1; min-width: 0; background: none; border: 0; outline: 0; color: var(--t1); font: inherit; font-size: 13px;
}
.nb-schnelleingabe-vorschau { font-size: 11px; color: var(--pri-t); white-space: nowrap; }
.nb-schnelleingabe .taste { font-size: 11px; opacity: .6; }
.nb-meine-tabelle { padding: 0 6px 20px; }
.nb-meine-spalten, .nb-meine .nb-aufgabenzeile {
  display: grid; grid-template-columns: 32px minmax(0, 1fr) 96px 92px 104px 48px; align-items: center; gap: 8px;
}
.nb-meine-spalten {
  padding: 6px 8px; font-size: 10px; letter-spacing: .5px; text-transform: uppercase; color: var(--t3);
  border-bottom: 1px solid var(--line);
}
.nb-meine-gruppe {
  display: flex; align-items: center; gap: 6px; width: 100%; padding: 12px 8px 6px; background: none; border: 0;
  cursor: pointer; font-size: 11px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase; color: var(--t2);
}
.nb-meine-gruppe .n { color: var(--t3); font-weight: 400; }
.nb-meine-gruppe.g-ueberfaellig { color: var(--bad); }
.nb-meine-gruppe.g-heute { color: var(--warn); }
.nb-meine .nb-aufgabenzeile { padding: 6px 8px; border-radius: var(--nb-radius-eintrag, 6px); border-bottom: 0; }
.nb-meine .nb-aufgabenzeile.on { background: var(--pri-w); outline: 1px solid var(--pri); }
.nb-meine .nb-aufgabenzeile.faellig { border-left: 0; padding-left: 8px; }
.nb-meine .nb-aufgabenzeile .aufgabe { display: flex; align-items: center; gap: 8px; min-width: 0; }
.nb-meine .nb-aufgabenzeile .titel {
  font-size: 13px; font-weight: 500; color: var(--t1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-meine .nb-aufgabenzeile .pfad, .nb-aufgabe-rechts .pfadzeile .pfad {
  display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: var(--t3); white-space: nowrap;
}
.nb-meine .punkt, .nb-aufgabe-rechts .punkt { width: 8px; height: 8px; border-radius: 2px; flex: none; background: var(--t3); }
.nb-meine .punkt.kenn-1, .nb-aufgabe-rechts .punkt.kenn-1 { background: var(--nb-kenn-1); }
.nb-meine .punkt.kenn-2, .nb-aufgabe-rechts .punkt.kenn-2 { background: var(--nb-kenn-2); }
.nb-meine .punkt.kenn-3, .nb-aufgabe-rechts .punkt.kenn-3 { background: var(--nb-kenn-3); }
.nb-meine .punkt.kenn-4, .nb-aufgabe-rechts .punkt.kenn-4 { background: var(--nb-kenn-4); }
.nb-meine .punkt.kenn-5, .nb-aufgabe-rechts .punkt.kenn-5 { background: var(--nb-kenn-5); }
.nb-meine .punkt.kenn-6, .nb-aufgabe-rechts .punkt.kenn-6 { background: var(--nb-kenn-6); }
.nb-meine .nb-aufgabenzeile .prio { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; }
.nb-meine .prio.hoch { color: var(--bad); }
.nb-meine .prio.mittel { color: var(--warn); }
.nb-meine .prio.niedrig { color: var(--t3); }
.nb-meine .nb-aufgabenzeile .frist { font-size: 12px; color: var(--t2); }
.nb-meine .nb-aufgabenzeile.faellig .frist { color: var(--bad); font-weight: 600; }
.nb-meine .nb-aufgabenzeile .teile { font-size: 12px; color: var(--t3); font-variant-numeric: tabular-nums; }
.nb-statusmarke {
  display: inline-block; padding: 1px 8px; border-radius: var(--nb-radius-marke, 4px); font-size: 11px;
  background: var(--surf2); color: var(--t2);
}
.nb-statusmarke.st-inarbeit { background: color-mix(in srgb, var(--warn) 18%, transparent); color: var(--warn); }
.nb-statusmarke.st-geplant { background: color-mix(in srgb, var(--info) 18%, transparent); color: var(--info); }
.nb-statusmarke.st-review { background: var(--pri-w); color: var(--pri-t); }
.nb-statusmarke.st-erledigt { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }
.nb-marke-wartet {
  font-size: 10px; padding: 0 6px; border-radius: var(--nb-radius-marke, 4px); border: 1px solid var(--line2); color: var(--t3);
}

.nb-aufgabe-rechts {
  flex: none; width: var(--nb-breite-aufgabe, 440px); border-left: 1px solid var(--line); overflow-y: auto;
  padding: 14px 18px; display: flex; flex-direction: column; gap: 10px; background: var(--bg);
}
.nb-aufgabe-rechts .pfadzeile { display: flex; align-items: center; gap: 6px; }
.nb-aufgabe-rechts > .titel { font-size: 18px; font-weight: 600; color: var(--t1); line-height: 1.3; }
.nb-aufgabe-rechts .felder {
  display: grid; grid-template-columns: 90px minmax(0, 1fr); align-items: center; gap: 6px 10px; font-size: 13px;
}
.nb-aufgabe-rechts .felder .k { color: var(--t3); font-size: 12px; }
.nb-aufgabe-rechts .felder .faellig { color: var(--bad); }
.nb-aufgabe-rechts .felder .aufwand { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.nb-aufgabe-rechts .beschreibung { font-size: 13px; color: var(--t2); white-space: pre-wrap; }
.nb-aufgabe-rechts .abschnitt {
  margin-top: 6px; font-size: 10px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase; color: var(--t3);
}
.nb-verknuepft {
  display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 10px; background: var(--surf);
  border: 1px solid var(--line); border-radius: var(--nb-radius-eintrag, 6px); color: var(--t1); cursor: pointer;
  font-size: 12px; text-align: left;
}
.nb-verknuepft:hover { background: var(--surf2); }
.nb-verknuepft .text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-verknuepft .art { color: var(--t3); font-size: 11px; }

/* Die Hauptspalte der Aufgaben (ADR-0221): „Neue Aufgabe“ oben, darunter die Ansichten, dann „Kunden & Projekte“. */
.nb-rail .nb-neue-aufgabe { margin: 4px 8px 10px; width: calc(100% - 16px); }
.nb-projektbaum { display: flex; flex-direction: column; gap: 2px; margin-top: 10px; }
.nb-projektbaum-kopf { display: flex; align-items: center; gap: 2px; }
.nb-projektbaum-suche {
  margin: 4px 8px; padding: 5px 8px; background: var(--feld, var(--surf)); border: 1px solid var(--line2);
  border-radius: var(--nb-radius-eintrag, 6px); color: var(--t1); font: inherit; font-size: 12px; outline: 0;
}
.nb-projektbaum-suche:focus { border-color: var(--pri); }
.nb-projektbaum-filter { display: flex; gap: 4px; margin: 2px 8px 6px; }
.nb-projektbaum-filter button {
  flex: 1; padding: 3px 6px; background: none; border: 1px solid var(--line2); border-radius: var(--nb-radius-knopf, 6px);
  color: var(--t2); font-size: 11px; cursor: pointer;
}
.nb-projektbaum-filter button.on { background: var(--pri-w); border-color: var(--pri); color: var(--pri-t); }
.nb-projektbaum-filter .n { opacity: .7; }
.nb-projektbaum-kunde {
  display: flex; align-items: center; gap: 4px; padding: 4px 8px; background: none; border: 0; cursor: pointer;
  color: var(--t1); font-size: 12px; font-weight: 600; text-align: left;
}
.nb-projektbaum-kunde .name, .nb-rail .nb-projektbaum-projekt .name {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nb-projektbaum-kunde .n, .nb-rail .nb-projektbaum-projekt .n { font-size: 11px; color: var(--t3); font-weight: 400; }
.nb-rail .nb-projektbaum-projekt { display: flex; align-items: center; gap: 8px; padding-left: 30px; font-size: 12px; }
.nb-projektbaum-projekt .punkt { width: 8px; height: 8px; border-radius: 2px; flex: none; background: var(--t3); }
.nb-projektbaum-projekt .punkt.kenn-1 { background: var(--nb-kenn-1); }
.nb-projektbaum-projekt .punkt.kenn-2 { background: var(--nb-kenn-2); }
.nb-projektbaum-projekt .punkt.kenn-3 { background: var(--nb-kenn-3); }
.nb-projektbaum-projekt .punkt.kenn-4 { background: var(--nb-kenn-4); }
.nb-projektbaum-projekt .punkt.kenn-5 { background: var(--nb-kenn-5); }
.nb-projektbaum-projekt .punkt.kenn-6 { background: var(--nb-kenn-6); }
.nb-projektbaum-leer { padding: 4px 8px; font-size: 12px; color: var(--t3); }

/* Aufwand gegen Schätzung und die Unteraufgaben rechts (ADR-0221). */
.nb-aufgabe-rechts .aufwand .balken {
  display: inline-block; width: 70px; height: 4px; border-radius: 2px; background: var(--surf3); overflow: hidden;
}
.nb-aufgabe-rechts .aufwand .balken > span { display: block; height: 100%; background: var(--pri); }
.nb-aufgabe-rechts .aufwand .balken.ueber > span { background: var(--warn); }
.nb-aufgabe-rechts .nb-aufgabe-schaetzung { max-width: 110px; }
.nb-aufgabe-rechts .abschnitt .n { float: right; font-weight: 400; }
.nb-schritte { display: flex; flex-direction: column; gap: 1px; }
.nb-schritt { display: flex; align-items: center; gap: 4px; font-size: 13px; color: var(--t1); }
.nb-schritt .text { flex: 1; min-width: 0; }
.nb-schritt.erledigt .text { text-decoration: line-through; color: var(--t3); }
.nb-schritt .nb-schritt-weg { visibility: hidden; }
.nb-schritt:hover .nb-schritt-weg { visibility: visible; }
.nb-schritt-neu {
  margin: 4px 0 0 34px; padding: 4px 6px; background: none; border: 0; border-bottom: 1px dashed var(--line2);
  color: var(--t1); font: inherit; font-size: 12px; outline: 0;
}
.nb-schritt-neu:focus { border-bottom-color: var(--pri); }

/* Aktivität und Kommentare an der Aufgabe (ADR-0221). */
.nb-aktivitaet { display: flex; flex-direction: column; gap: 8px; }
.nb-aktivitaet-zeile { display: flex; gap: 8px; font-size: 12px; }
.nb-aktivitaet-zeile .kuerzel {
  flex: none; width: 24px; height: 24px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
  font-size: 10px; font-weight: 600; background: var(--surf2); color: var(--t2);
}
.nb-aktivitaet-zeile .inhalt { flex: 1; min-width: 0; }
.nb-aktivitaet-zeile .kopf { color: var(--t3); }
.nb-aktivitaet-zeile .kopf b { color: var(--t2); font-weight: 600; }
.nb-aktivitaet-zeile.kommentar .text { color: var(--t1); font-size: 13px; white-space: pre-wrap; }
.nb-aktivitaet-zeile.ereignis .text { color: var(--t3); }
.nb-kommentar { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
.nb-kommentar .zeile {
  display: flex; align-items: center; gap: 4px; padding: 4px 4px 4px 6px; border: 1px solid var(--line2);
  border-radius: var(--nb-radius-eintrag, 6px); background: var(--surf);
}
.nb-kommentar .zeile:focus-within { border-color: var(--pri); }
.nb-kommentar-feld { flex: 1; min-width: 0; background: none; border: 0; outline: 0; color: var(--t1); font: inherit; font-size: 13px; }

/* Projektformular (ADR-0221): Meilensteine als Zeilen wie die Schritte einer Aufgabe, Mitglieder als Chips. */
.nb-meilenstein { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--t1); }
.nb-meilenstein .name { flex: 1; min-width: 0; }
.nb-meilenstein .datum { color: var(--t2); font-variant-numeric: tabular-nums; }
.nb-meilenstein.erreicht .name { text-decoration: line-through; color: var(--t3); }
.nb-meilenstein-neu { display: grid; grid-template-columns: 1fr 160px auto; gap: 8px; align-items: center; }
.nb-pf-mitglieder-liste { display: flex; flex-wrap: wrap; gap: 4px; min-height: 28px; align-items: center; }
.nb-pf-mitglieder-liste .leise { color: var(--t3); font-size: 13px; }

/* Projektseite (ADR-0221, Entwurf „Board“): Kopf, Reiter, Board, Übersicht. */
.nb-projektkopf { display: flex; align-items: center; gap: 18px; padding: 4px 0 10px; flex-wrap: wrap; }
.nb-projektkopf > .symbol {
  display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; flex: none;
  border-radius: var(--nb-radius-eintrag, 6px); background: var(--pri-w); color: var(--pri-t);
}
.nb-projektkopf .wer { min-width: 0; }
.nb-projektkopf .pfad { font-size: 12px; color: var(--t3); }
.nb-projektkopf .pfad a { color: inherit; text-decoration: none; }
.nb-projektkopf .pfad a:hover { color: var(--t1); }
.nb-projektkopf .name { display: flex; align-items: center; gap: 10px; }
.nb-projektkopf .unterzeile { font-size: 13px; color: var(--t2); }
.nb-projektart {
  font-size: 11px; padding: 1px 8px; border-radius: var(--nb-radius-marke, 4px); border: 1px solid var(--line2); color: var(--t2);
}
.nb-projektkopf .zahl { display: flex; flex-direction: column; align-items: flex-end; padding-right: 18px; border-right: 1px solid var(--line); }
.nb-projektkopf .zahl .k, .nb-projektkopf .fortschritt .k { font-size: 12px; color: var(--t3); }
.nb-projektkopf .zahl b { font-size: 18px; color: var(--t1); font-variant-numeric: tabular-nums; }
.nb-projektkopf .fortschritt { display: flex; flex-direction: column; gap: 6px; width: 220px; }
.nb-projektkopf .fortschritt .k { display: flex; justify-content: space-between; }
.nb-projektkopf .fortschritt .k span:last-child { color: var(--t1); font-variant-numeric: tabular-nums; }
.nb-projektkopf .balken, .nb-board-karte .balken {
  display: block; height: 4px; border-radius: 2px; background: var(--surf2); overflow: hidden; flex: 1;
}
.nb-projektkopf .balken { flex: none; }
.nb-projektkopf .balken > span { display: block; height: 100%; background: var(--pri); }
.nb-board-karte .balken > span { display: block; height: 100%; background: var(--ok); }
.nb-projektkopf .mitglieder { display: flex; gap: 2px; }
.nb-projektkopf .kuerzel, .nb-board-karte .kuerzel, .nb-projektliste .kuerzel, .nb-mitglied .kuerzel {
  display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%;
  background: var(--surf2); color: var(--t2); font-size: 10px; font-weight: 600; flex: none;
}
.nb-projektreiter { display: flex; gap: 4px; border-bottom: 1px solid var(--line); margin-bottom: 12px; }
.nb-projektreiter a {
  padding: 8px 14px; color: var(--t2); text-decoration: none; font-size: 14px; border-bottom: 2px solid transparent;
  margin-bottom: -1px;
}
.nb-projektreiter a:hover { color: var(--t1); }
.nb-projektreiter a.on { color: var(--t1); font-weight: 600; border-bottom-color: var(--pri); }

.nb-projektaufgaben-filter { display: flex; align-items: center; gap: 8px; justify-content: flex-end; margin-bottom: 10px; }
.nb-projektaufgaben-filter .mud-select { max-width: 170px; }
.nb-pa-suche {
  width: 240px; padding: 6px 10px; background: var(--feld, var(--surf)); border: 1px solid var(--line2);
  border-radius: var(--nb-radius-eintrag, 6px); color: var(--t1); font: inherit; font-size: 13px; outline: 0;
}
.nb-pa-suche:focus { border-color: var(--pri); }

.nb-board { display: grid; grid-template-columns: repeat(5, minmax(220px, 1fr)); gap: 12px; align-items: start; overflow-x: auto; }
.nb-board-spalte {
  display: flex; flex-direction: column; gap: 8px; min-height: 240px; padding: 10px; background: var(--surf);
  border: 1px solid var(--line); border-radius: var(--nb-radius-karte, 8px);
}
.nb-board-spalte.ziel { border-color: var(--pri); background: var(--pri-w); }
.nb-board-spalte .kopf { display: flex; align-items: center; gap: 8px; font-weight: 600; font-size: 13px; color: var(--t1); }
.nb-board-spalte .kopf .name { flex: 1; }
.nb-board-spalte .kopf .n {
  font-size: 11px; font-weight: 500; padding: 0 7px; border-radius: 10px; background: var(--surf2); color: var(--t2);
}
.nb-board-spalte .kopf .n.ueber { background: color-mix(in srgb, var(--warn) 22%, transparent); color: var(--warn); }
.nb-board-spalte .punkt { width: 8px; height: 8px; border-radius: 50%; background: var(--t3); }
.nb-board-spalte.st-geplant .punkt { background: var(--info); }
.nb-board-spalte.st-inarbeit .punkt { background: var(--warn); }
.nb-board-spalte.st-review .punkt { background: var(--pri); }
.nb-board-spalte.st-erledigt .punkt { background: var(--ok); }
.nb-board-neu-feld {
  padding: 8px 10px; background: var(--feld, var(--bg)); border: 1px solid var(--pri); border-radius: var(--nb-radius-eintrag, 6px);
  color: var(--t1); font: inherit; font-size: 13px; outline: 0;
}
.nb-board-karte {
  display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; background: var(--bg); cursor: grab;
  touch-action: pan-x pan-y; user-select: none; -webkit-touch-callout: none;
  border: 1px solid var(--line); border-radius: var(--nb-radius-eintrag, 6px);
}
.nb-board-karte:hover { border-color: var(--line2); }
.nb-board.zieht { cursor: grabbing; user-select: none; }
.nb-board-karte.gezogen { opacity: .45; border-style: dashed; }
/* Der Geist beim Ziehen (Shared/Zuggeist) - am Zeiger, ohne Zeigerereignisse; Board, Planung, Rackansicht. */
.nb-zuggeist {
  position: fixed; z-index: 2000; pointer-events: none; cursor: grabbing; padding: 8px 12px; max-width: 280px;
  background: var(--surf); border: 1px solid var(--pri); border-radius: var(--nb-radius-eintrag, 6px); color: var(--t1);
  font-size: 13px; box-shadow: 0 8px 24px color-mix(in srgb, var(--bg) 60%, transparent); transform: rotate(2deg);
}
.nb-zuggeist.nb-board-karte { width: 240px; background: var(--bg); }
.nb-board-karte.faellig { border-color: color-mix(in srgb, var(--bad) 45%, transparent); }
.nb-board-karte .titel { font-size: 13px; font-weight: 600; color: var(--t1); line-height: 1.35; }
.nb-board-karte.erledigt .titel { text-decoration: line-through; color: var(--t3); }
.nb-board-karte .teile { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--t3); font-variant-numeric: tabular-nums; }
.nb-board-karte .fuss { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--t2); }
.nb-board-karte .prio.hoch { color: var(--bad); }
.nb-board-karte .prio.mittel { color: var(--warn); }
.nb-board-karte .prio.niedrig { color: var(--t3); }
.nb-board-karte .frist { display: inline-flex; align-items: center; gap: 3px; padding: 0 4px; border-radius: var(--nb-radius-marke, 4px); }
.nb-board-karte .frist.ueberfaellig { color: var(--bad); background: color-mix(in srgb, var(--bad) 15%, transparent); }
.nb-board-karte .frist.bald { color: var(--warn); background: color-mix(in srgb, var(--warn) 15%, transparent); }
.nb-board-weitere { background: none; border: 0; color: var(--pri-t); cursor: pointer; font: inherit; font-size: 12px; padding: 4px; }
.nb-board-wip { font-size: 11px; color: var(--t3); }
.nb-board-wip.ueber { color: var(--warn); font-weight: 600; }
.nb-projektliste .nb-meine-spalten, .nb-projektliste .nb-aufgabenzeile { grid-template-columns: 32px minmax(0, 1fr) 96px 92px 104px 48px; }
.nb-projektliste .leer { padding: 20px 8px; color: var(--t3); font-size: 13px; }

.nb-projektuebersicht { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; }
.nb-projektuebersicht .karte {
  display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; background: var(--surf);
  border: 1px solid var(--line); border-radius: var(--nb-radius-karte, 8px);
}
.nb-projektuebersicht .abschnitt { font-size: 10px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase; color: var(--t3); }
.nb-projektuebersicht .text { font-size: 13px; color: var(--t2); white-space: pre-wrap; }
.nb-projektuebersicht .felder { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: 6px 10px; font-size: 13px; }
.nb-projektuebersicht .felder .k { color: var(--t3); font-size: 12px; }
.nb-mitglied { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--t1); }

/* Zeitplan (ADR-0221, Entwurf „Zeitplan“): links Kunde/Projekt, Art, Stunden des Monats; rechts die Achse. Balken, Bänder,
   Rauten und die Heute-Linie liegen alle auf derselben Achse (Zeitachse.cs). */
.nb-zeitplan { display: flex; flex-direction: column; min-height: 0; }
.nb-zp-leiste { display: flex; align-items: center; gap: 10px; padding: 8px 4px 12px; flex-wrap: wrap; }
.nb-zp-leiste .titel { font-size: 22px; font-weight: 600; color: var(--t1); }
.nb-zp-leiste .spanne { font-size: 13px; color: var(--t3); }
.nb-zp-leiste .nb-zp-kunde { max-width: 180px; }
.nb-zp-spannen { display: flex; border: 1px solid var(--line2); border-radius: var(--nb-radius-knopf, 6px); overflow: hidden; }
.nb-zp-spannen button { padding: 5px 12px; background: none; border: 0; color: var(--t2); cursor: pointer; font: inherit; font-size: 13px; }
.nb-zp-spannen button.on { background: var(--pri-w); color: var(--pri-t); font-weight: 600; }
.nb-zp-raster { display: flex; flex-direction: column; overflow: auto; border-top: 1px solid var(--line); }
.nb-zp-zeile {
  display: grid; grid-template-columns: 210px 90px 70px minmax(600px, 1fr); align-items: center; min-height: 40px;
  border-bottom: 1px solid var(--line); font-size: 13px; color: var(--t1);
}
.nb-zp-zeile > span { padding: 0 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-zp-zeile .zeit { position: relative; align-self: stretch; border-left: 1px solid var(--line); min-height: 40px; }
.nb-zp-zeile .zeit::after {
  content: ""; position: absolute; top: 0; bottom: 0; left: var(--nb-heute); width: 2px; background: var(--bad); opacity: .7;
  pointer-events: none;
}
.nb-zp-zeile.kopf { min-height: 52px; font-size: 10px; letter-spacing: .5px; text-transform: uppercase; color: var(--t3); }
.nb-zp-zeile.kopf .monat { position: absolute; top: 6px; padding-left: 6px; font-size: 12px; text-transform: none; color: var(--t1); font-weight: 600; }
.nb-zp-zeile.kopf .woche { position: absolute; bottom: 6px; padding-left: 6px; font-size: 11px; text-transform: none; white-space: nowrap; }
.nb-zp-zeile.kopf .heute-marke {
  position: absolute; top: 0; left: var(--nb-heute); padding: 0 4px; font-size: 10px; text-transform: none;
  background: var(--bad); color: var(--bg); border-radius: 0 0 var(--nb-radius-marke, 4px) var(--nb-radius-marke, 4px);
}
.nb-zp-zeile.kunde { font-weight: 600; cursor: pointer; }
.nb-zp-zeile.kunde .name { display: inline-flex; align-items: center; gap: 4px; }
.nb-zp-zeile .art { color: var(--t3); font-size: 12px; font-weight: 400; }
.nb-zp-zeile .art.laufend { color: var(--ok); }
.nb-zp-zeile .h { text-align: right; font-variant-numeric: tabular-nums; }
.nb-zp-zeile .monatszahl { position: absolute; top: 50%; transform: translateY(-50%); padding-left: 10%; font-size: 12px; color: var(--t3); white-space: nowrap; }
.nb-zp-zeile.projekt { cursor: pointer; }
.nb-zp-zeile.projekt:hover { background: var(--surf); }
.nb-zp-zeile.projekt .name { display: inline-flex; align-items: center; gap: 8px; padding-left: 26px; }
.nb-zp-zeile .punkt { width: 8px; height: 8px; border-radius: 2px; flex: none; background: var(--t3); }
.nb-zp-zeile .balken, .nb-zp-zeile .band {
  position: absolute; top: 9px; bottom: 9px; border-radius: var(--nb-radius-marke, 4px); overflow: hidden;
  border: 1px solid var(--line2); background: var(--surf2);
}
.nb-zp-zeile .balken .fuellung, .nb-zp-zeile .band .fuellung { position: absolute; top: 0; bottom: 0; left: 0; opacity: .55; background: var(--pri); }
.nb-zp-zeile .band { background: repeating-linear-gradient(135deg, var(--surf2) 0 6px, var(--surf) 6px 12px); border-color: var(--ok); }
.nb-zp-zeile .band .fuellung { background: var(--ok); opacity: .35; }
.nb-zp-zeile .band.ueber { border-color: var(--warn); }
.nb-zp-zeile .band.ueber .fuellung { background: var(--warn); }
.nb-zp-zeile .balken .text, .nb-zp-zeile .band .text {
  position: relative; padding: 0 8px; font-size: 11px; font-weight: 600; line-height: 20px; white-space: nowrap; color: var(--t1);
}
.nb-zp-zeile .gekuendigt { position: absolute; top: 50%; transform: translateY(-50%); padding-left: 8px; font-size: 12px; color: var(--bad); white-space: nowrap; }
.nb-zp-zeile.meilenstein { min-height: 32px; color: var(--t2); }
.nb-zp-zeile.meilenstein .name { display: inline-flex; align-items: center; gap: 6px; padding-left: 42px; }
.nb-zp-zeile.meilenstein.erreicht .name { text-decoration: line-through; color: var(--t3); }
.nb-zp-zeile .raute { width: 10px; height: 10px; transform: rotate(45deg); background: var(--pri); flex: none; display: inline-block; }
.nb-zp-zeile .raute-marke {
  position: absolute; top: 50%; transform: translate(-5px, -50%); display: inline-flex; align-items: center; gap: 8px;
  font-size: 12px; font-weight: 600; white-space: nowrap;
}
.nb-zp-zeile .kenn-1.balken .fuellung, .nb-zp-zeile .raute.kenn-1, .nb-zp-zeile .punkt.kenn-1 { background: var(--nb-kenn-1); }
.nb-zp-zeile .kenn-2.balken .fuellung, .nb-zp-zeile .raute.kenn-2, .nb-zp-zeile .punkt.kenn-2 { background: var(--nb-kenn-2); }
.nb-zp-zeile .kenn-3.balken .fuellung, .nb-zp-zeile .raute.kenn-3, .nb-zp-zeile .punkt.kenn-3 { background: var(--nb-kenn-3); }
.nb-zp-zeile .kenn-4.balken .fuellung, .nb-zp-zeile .raute.kenn-4, .nb-zp-zeile .punkt.kenn-4 { background: var(--nb-kenn-4); }
.nb-zp-zeile .kenn-5.balken .fuellung, .nb-zp-zeile .raute.kenn-5, .nb-zp-zeile .punkt.kenn-5 { background: var(--nb-kenn-5); }
.nb-zp-zeile .kenn-6.balken .fuellung, .nb-zp-zeile .raute.kenn-6, .nb-zp-zeile .punkt.kenn-6 { background: var(--nb-kenn-6); }
.nb-zp-leer { padding: 24px 8px; color: var(--t3); font-size: 13px; }

/* Reiter Monat eines Projekts (ADR-0221, Entwurf „Monat“): Kennzahlen, zwölf Säulen gegen das Kontingent,
   Zeiterfassung; rechts offene Aufgaben und der Vertrag. */
.nb-monatsflaeche { display: grid; grid-template-columns: minmax(0, 1fr) 460px; gap: 14px; align-items: start; }
.nb-monatsflaeche > .links, .nb-monatsflaeche > .rechts { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
@media (max-width: 1300px) { .nb-monatsflaeche { grid-template-columns: minmax(0, 1fr); } }
.nb-kennzahlen { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; }
.nb-kennzahlen .karte, .nb-monatskarte {
  display: flex; flex-direction: column; gap: 6px; padding: 14px 16px; background: var(--surf);
  border: 1px solid var(--line); border-radius: var(--nb-radius-karte, 8px);
}
.nb-kennzahlen .k { font-size: 12px; color: var(--t2); }
.nb-kennzahlen .wert b { font-size: 24px; color: var(--t1); font-variant-numeric: tabular-nums; }
.nb-kennzahlen .wert small { font-size: 12px; color: var(--t3); }
.nb-kennzahlen .wert.gut b { color: var(--ok); }
.nb-kennzahlen .wert.ueber b { color: var(--warn); }
.nb-kennzahlen .unter { font-size: 11px; color: var(--t3); }
.nb-kennzahlen .unter b { color: var(--t2); font-weight: 500; }
.nb-kennzahlen .balken { display: block; height: 4px; border-radius: 2px; background: var(--surf2); overflow: hidden; }
.nb-kennzahlen .balken > span { display: block; height: 100%; background: var(--ok); }
.nb-monatskarte .kopf { display: flex; align-items: center; gap: 10px; font-size: 13px; color: var(--t1); }
.nb-monatskarte .kopf .n { font-size: 11px; padding: 0 7px; border-radius: 10px; background: var(--surf2); color: var(--t2); }
.nb-monatskarte .leise, .nb-monatskarte td.leise { color: var(--t3); font-size: 12px; }
.nb-monatsverlauf .legende { font-size: 11px; color: var(--t2); display: inline-flex; align-items: center; gap: 5px; }
.nb-monatsverlauf .legende::before { content: ""; width: 9px; height: 9px; border-radius: 2px; }
.nb-monatsverlauf .legende.im::before { background: var(--ok); }
.nb-monatsverlauf .legende.darueber::before { background: var(--warn); }
.nb-monatsverlauf .legende.linie::before { height: 0; border-top: 2px dashed var(--t3); border-radius: 0; }
.nb-monatsverlauf .saeulen {
  position: relative; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 10px; height: 220px;
  padding-bottom: 22px; margin-top: 8px;
}
.nb-monatsverlauf .saeule { position: relative; display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch; }
.nb-monatsverlauf .saeule .zahl { text-align: center; font-size: 11px; color: var(--t2); padding-bottom: 3px; }
.nb-monatsverlauf .saeule .im { background: var(--ok); border-radius: 0 0 2px 2px; }
.nb-monatsverlauf .saeule .darueber { background: var(--warn); border-radius: 2px 2px 0 0; }
.nb-monatsverlauf .saeule.aktuell .im {
  background: repeating-linear-gradient(135deg, var(--ok) 0 6px, color-mix(in srgb, var(--ok) 55%, transparent) 6px 12px);
  outline: 2px solid var(--pri); outline-offset: 1px;
}
.nb-monatsverlauf .saeule .monat {
  position: absolute; bottom: -20px; left: 0; right: 0; text-align: center; font-size: 11px; color: var(--t3);
}
.nb-monatsverlauf .saeule.aktuell .monat { color: var(--t1); font-weight: 600; }
.nb-monatsverlauf .saeulen { background: linear-gradient(to top, transparent calc(var(--nb-kontingent, -10%) - 1px),
  var(--t3) calc(var(--nb-kontingent, -10%) - 1px), var(--t3) var(--nb-kontingent, -10%), transparent var(--nb-kontingent, -10%))
  0 0 / 100% calc(100% - 22px) no-repeat; }
.nb-projekt-buchungen td.datum { white-space: nowrap; font-variant-numeric: tabular-nums; color: var(--t2); }
.nb-projekt-buchungen tr.intern td { color: var(--t3); }
.nb-projekt-buchungen .kuerzel, .nb-monat-aufgabe .kuerzel {
  display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%;
  background: var(--surf2); color: var(--t2); font-size: 10px; font-weight: 600;
}
.nb-monat-aufgabe {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; align-items: center; gap: 10px; width: 100%;
  padding: 9px 10px; background: var(--bg); border: 1px solid var(--line); border-radius: var(--nb-radius-eintrag, 6px);
  color: var(--t1); font: inherit; font-size: 13px; text-align: left; cursor: pointer;
}
.nb-monat-aufgabe:hover { border-color: var(--line2); }
.nb-monat-aufgabe .titel { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-monat-aufgabe .frist { font-size: 12px; color: var(--t3); }
.nb-monat-vertrag .felder { display: grid; grid-template-columns: 130px minmax(0, 1fr); gap: 6px 10px; font-size: 13px; }
.nb-monat-vertrag .felder .k { color: var(--t3); font-size: 12px; }

/* Labels an Aufgaben (ADR-0221): die Kategorien der Nachrichten, in ihrer Farbe (--f aus der Kategorie). */
.nb-label {
  display: inline-flex; align-items: center; padding: 0 6px; border-radius: var(--nb-radius-marke, 4px); font-size: 10px;
  font-weight: 600; line-height: 18px; white-space: nowrap; color: var(--f, var(--t2));
  background: color-mix(in srgb, var(--f, var(--t3)) 18%, transparent);
}
.mud-chip.nb-label { height: 20px; margin: 0; }
.nb-board-karte .marken { display: flex; flex-wrap: wrap; gap: 4px; }
.nb-aufgabe-labels { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
.nb-meine .nb-aufgabenzeile .aufgabe .nb-label { flex: none; }

/* Wiederkehrende Aufgaben (ADR-0221): ↻ an der Aufgabe, im Monat je Reihe ein Kästchen je Termin. */
.nb-wiederkehrend { color: var(--pri-t); font-size: 12px; margin-left: 4px; }
.nb-aufgabe-wiederholung { display: flex; flex-direction: column; gap: 2px; }
.nb-aufgabe-wiederholung .leise { font-size: 11px; color: var(--t3); }
.nb-serie { display: grid; grid-template-columns: minmax(0, 1fr) auto 48px; align-items: center; gap: 10px; padding: 6px 0;
  border-bottom: 1px solid var(--line); }
.nb-serie:last-child { border-bottom: 0; }
.nb-serie .wer { display: flex; flex-direction: column; min-width: 0; }
.nb-serie .titel { font-size: 13px; color: var(--t1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-serie .leise { font-size: 11px; color: var(--t3); }
.nb-serie .termine { display: flex; gap: 3px; }
.nb-serie .termin { width: 11px; height: 11px; border-radius: 2px; border: 1px solid var(--line2); }
.nb-serie .termin.erledigt { background: var(--ok); border-color: var(--ok); }
.nb-serie .termin.verpasst { border-color: var(--warn); }
.nb-serie .zahl { text-align: right; font-size: 12px; color: var(--t2); font-variant-numeric: tabular-nums; }

/* Rackansicht: gezogen wird mit dem Zeiger (Shared/Zeigerzug). */
.nb-rack .feld.geraet { touch-action: pan-x pan-y; user-select: none; -webkit-touch-callout: none; cursor: grab; }
.nb-rack-seiten.zieht { cursor: grabbing; user-select: none; }

/* Am Handy gehalten (Zeigerzug.HaeltFest): das Element hebt sich ab - jetzt zieht der Finger, statt zu scrollen. */
.nb-board-karte.gehalten, .nb-planung-vorrat .aufgabe.gehalten, .nb-rack .feld.geraet.gehalten {
  outline: 2px solid var(--pri); outline-offset: 1px; transform: scale(1.02);
}

/* Projektformular: ein Abschnitt, der (noch) nichts zu tun hat, sagt warum - statt gesperrt dazustehen. */
.nb-pf-hinweis { font-size: 13px; color: var(--t2); line-height: 1.5; padding: 10px 12px; border: 1px dashed var(--line2);
  border-radius: var(--nb-radius-eintrag, 6px); }
.nb-pf-als-laufend { align-self: flex-start; }
