:root {
  /* Blau/Orange-Farbschema: Blau als strukturierende Farbe (Sidebar, Kopfzeile, Überschriften),
     Orange als Aktionsfarbe (Buttons, aktive Zustände, Hervorhebungen). Der Lesebereich (Cards,
     Tabellen) bleibt durchgängig weiß, siehe --card. */
  --primary: #1a1a1a;
  --primary-light: #3a3a3a;
  --primary-dark: #000000;
  --accent: #e30613;
  --accent-dark: #b1050f;
  /* Von Stephan gewünscht: Haupthintergrundfarbe auf #f0ede7 geändert (vorher #f4f6fa). */
  --bg: #f0ede7;
  --card: #ffffff;
  --border: #dfe3ea;
  --text: #222;
  --text-muted: #666;
  --success: #2e7d32;
  --warning: #b8860b;
  --danger: #c02b3f;
  --radius: 8px;
}

/* Punkt 2 (Software-Liste Runde AG): Erkennung von Browser-Autofill per CSS-Trick. Manche Browser
   (v.a. Chrome/Edge, wenn eine komplette gespeicherte Adresse auf einmal in ein leeres Formular
   eingetragen wird - z.B. beim neuen Auftrag anlegen) lösen dabei KEIN input/change-Event pro Feld
   aus, wodurch z.B. die PLZ->Ort-Automatik nie greift. Eine leere CSS-Animation, die nur bei
   :-webkit-autofill (Chrome/Edge/Safari) aktiv wird, lässt sich per "animationstart"-JS-Event
   trotzdem zuverlässig erkennen - rein technischer Trick ohne sichtbaren visuellen Effekt.
   Siehe views/projects/form.ejs und views/projects/show.ejs (PLZ-Feld). */
@keyframes whtk-autofill-detect { from {} to {} }
input:-webkit-autofill { animation-name: whtk-autofill-detect; animation-duration: 0.001s; }

* { box-sizing: border-box; }

/* Schriftart Archivo (von Stephan aus der Schriften-Vorschau vom 14.08.2026
   ausgewählt). Wird mit der App ausgeliefert (public/fonts/, woff2 mit vollem deutschen
   Zeichensatz inkl. Umlaute/ß/€) - kein Download/keine Installation für die Nutzer nötig,
   kein externer Dienst (funktioniert auch offline). Der SemiBold-Schnitt ist zusätzlich für
   font-weight 700 registriert, damit "bold" nicht künstlich verbreitert wird. */
/* Pfade RELATIV zur CSS-Datei (../fonts/ -> /public/fonts/): die App liefert statische Dateien
   unter /public aus (server.js express.static) - ein absoluter /fonts/-Pfad liefe ins Leere (404)
   und die Schrift bliebe unsichtbar (Browser fällt still auf die Systemschrift zurück). */
@font-face {
  font-family: 'Archivo';
  src: url('../fonts/Archivo-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Archivo';
  src: url('../fonts/Archivo-SemiBold.woff2') format('woff2');
  font-weight: 600 700;
  font-style: normal;
  font-display: swap;
}

body {
  margin: 0;
  font-family: 'Archivo', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  background: var(--bg);
  color: var(--text);
  min-height: 100vh;
}

a { color: var(--primary-light); text-decoration: none; }
a:hover { text-decoration: underline; }

/* ============================================================
   Layout: linke Sidebar + obere Kopfzeile mit globaler Suche
   ============================================================ */

:root {
  --sidebar-width: 230px;
  --sidebar-width-collapsed: 64px;
  --header-height: 58px;
}

.sidebar {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  width: var(--sidebar-width);
  background: linear-gradient(180deg, var(--primary), var(--primary-dark));
  color: #fff;
  display: flex;
  flex-direction: column;
  z-index: 60;
  overflow-y: auto;
}
.sidebar .brand {
  display: flex;
  align-items: center;
  gap: 10px;
  color: #fff;
  padding: 16px 16px;
  font-weight: 700;
  font-size: 0.92rem;
  line-height: 1.25;
  border-bottom: 1px solid rgba(255,255,255,0.1);
}
.sidebar .brand:hover { text-decoration: none; }
.sidebar .brand-icon { width: 32px; height: 32px; border-radius: 8px; flex-shrink: 0; }
.sidebar .brand-text { font-size: 1.1rem; letter-spacing: 0.02em; }
/* Von Stephan gewünscht ("Navigationsleiste, den Abstand zwischen den verschiedenen Blöcken
   belassen, nur innerhalb den Abstand verringern"): die Einträge INNERHALB eines Blocks rücken
   enger zusammen (Zeilenabstand 2 -> 1 px, Innenabstand je Eintrag 10 -> 6 px). Der Abstand
   ZWISCHEN den Blöcken bleibt exakt gleich - dafür sind die Werte bei .sidenav-heading und
   .sidenav-divider unten genau um das erhöht, was die Einträge jetzt weniger brauchen. */
.sidenav { display: flex; flex-direction: column; padding: 10px 8px; gap: 1px; flex: 1; }
.sidenav a {
  display: flex;
  align-items: center;
  gap: 10px;
  color: #c3cde0;
  padding: 6px 12px;
  border-radius: var(--radius);
  font-size: 0.88rem;
  white-space: nowrap;
}
.sidenav a .ic { font-size: 1rem; width: 20px; text-align: center; flex-shrink: 0; }
.sidenav a:hover, .sidenav a.active {
  background: rgba(255,255,255,0.12);
  color: #fff;
  text-decoration: none;
}
.sidenav a.active { background: var(--accent); color: #fff; font-weight: 600; }
/* Abstand zum Block darüber/darunter bewusst von 8 auf 13 px erhöht - genau um die 5 px, die die
   Einträge oben durch den kleineren Innenabstand verloren haben. Der sichtbare Abstand zwischen
   den Blöcken bleibt dadurch derselbe wie vorher. */
.sidenav-divider { height: 1px; background: rgba(255,255,255,0.12); margin: 13px 10px; }
/* Punkt 5 (Software-Liste): Gruppen-Überschriften zwischen den Navigationsblöcken. */
.sidenav-heading {
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: rgba(255,255,255,0.45);
  /* Oben 14 -> 19 px: gleicht die 5 px aus, die die Einträge durch den kleineren Innenabstand
     verloren haben, damit der Abstand zwischen den Blöcken unverändert bleibt. */
  padding: 19px 12px 4px;
  font-weight: 600;
}
.sidenav-heading:first-child { padding-top: 4px; }
.sidenav-footer {
  padding: 12px 16px;
  border-top: 1px solid rgba(255,255,255,0.1);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.sidenav-footer .user-name { color: #d9dee8; font-size: 0.82rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidenav-footer-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.sidenav-footer-link { color: #d9dee8; font-size: 0.78rem; text-decoration: none; opacity: 0.85; }
.sidenav-footer-link:hover, .sidenav-footer-link.active { color: #fff; opacity: 1; text-decoration: underline; }
.sidenav-version { color: #8791a3; font-size: 0.7rem; margin-top: 6px; }
/* Von Stephan gewünscht: der Teil nach dem Punkt eine Stufe kleiner und kursiv. */
.sidenav-version-klein { font-size: 0.62rem; font-style: italic; }
/* Abmelden in eigener Zeile unter den Fußzeilen-Links (von Stephan so gewählt, nachdem die Zeile
   mit dem vierten Eintrag "Unterschrift" zu breit wurde und der Knopf aus der Leiste ragte). */
.btn-mini-breit { width: 100%; text-align: center; }
.btn-mini {
  background: rgba(255,255,255,0.15);
  border: none;
  color: #fff;
  padding: 6px 10px;
  border-radius: var(--radius);
  cursor: pointer;
  font-size: 0.8rem;
  flex-shrink: 0;
}
.btn-mini:hover { background: rgba(255,255,255,0.25); }

.topheader {
  position: fixed;
  top: 0;
  left: var(--sidebar-width);
  right: 0;
  height: var(--header-height);
  background: linear-gradient(90deg, var(--primary), var(--primary-light));
  border-bottom: 1px solid var(--primary-dark);
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 20px;
  z-index: 55;
}
.menu-toggle {
  display: none;
  background: none;
  border: none;
  font-size: 1.3rem;
  cursor: pointer;
  color: #fff;
  padding: 4px 6px;
}
.topheader-title {
  color: #fff;
  font-weight: 600;
  font-size: 1rem;
  white-space: nowrap;
  flex-shrink: 0;
}
.topheader-title-link { color: inherit; text-decoration: none; }
.topheader-title-link:hover { text-decoration: underline; opacity: 0.9; }
/* Von Stephan gewünscht: Breadcrumb-Kopfzeile (siehe views/partials/nav.ejs) - die aktuelle Seite
   (letzte, nicht verlinkte Station) darf lang sein (z.B. ein Bauvorhaben-Titel), daher hier per
   Ellipsis gekürzt statt den Header zu sprengen/das Suchfeld zu verdrängen. */
.topheader-breadcrumb { display: inline-flex; align-items: center; gap: 4px; min-width: 0; max-width: 100%; }
.topheader-breadcrumb-sep { opacity: 0.6; flex-shrink: 0; }
.topheader-title-current { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 320px; }
/* Punkt 1 (Software-Liste): Suchfeld oben rechts in der Ecke statt mittig gestreckt -
   "margin-left:auto" schiebt es im Flex-Header (.topheader) ganz nach rechts, "flex:0 0 auto" statt
   des bisherigen "flex:1" verhindert das Strecken über die Restbreite. */
/* Die Suche schrumpft mit, wenn der Platz knapp wird. Vorher war sie starr (flex: 0 0 auto) und
   drückte den Notizbuch-Knopf rechts aus der Leiste heraus (von Stephan gemeldet). */
/* Notizbuch-Knopf und Suche stehen zusammen in .topheader-rechts - dieser Block wandert als
   Ganzes nach rechts. Vorher hatten Knopf und Suche je ein margin-left:auto und teilten sich den
   Freiraum, dadurch stand die Suche mitten in der Leiste (von Stephan gemeldet). */
.topheader-rechts { display: flex; align-items: center; gap: 12px; margin-left: auto; flex: 0 0 auto; }
.topheader-search { position: relative; flex: 0 0 auto; max-width: none; margin-left: 0; }
/* Von Stephan (15.08.2026): "Suche im blauen Feld oben dem Standard anpassen. Sie soll genauso
   aussehen wie auf der Seite" - die globale Suche in der Kopfleiste sieht jetzt exakt aus wie das
   Suchfeld der Listen (.al2 .suche in listen.css): weißes Feld, 6px Radius, gleicher Rahmen,
   gleiche Schriftgröße und dasselbe SVG-Lupensymbol links. Das alte Emoji entfällt dafür. */
.search-form { display: flex; align-items: center; background: transparent; border: 0; border-radius: 0; padding: 0; }
.search-icon { display: none; }
.search-form input[type="search"] {
  border: 1px solid #cdd3db;
  border-radius: 6px;
  padding: 6px 10px 6px 28px;
  font: inherit;
  font-size: 0.82rem;
  box-shadow: none;
  color: #1f2733;
  width: 260px;
  min-width: 230px;
  background: #fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a93a0' stroke-width='2'><circle cx='11' cy='11' r='7'/><path d='M20 20l-3.5-3.5'/></svg>") no-repeat 7px center/14px;
}
.search-form input[type="search"]::placeholder { color: #8a93a0; }
.search-form input[type="search"]:focus { outline: none; }
.search-results {
  display: none;
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  right: 0;
  min-width: 340px;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 12px 30px rgba(20,40,80,0.15);
  max-height: 420px;
  overflow-y: auto;
  padding: 6px 0;
}
.search-results.open { display: block; }
.search-group-title { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--text-muted); padding: 8px 14px 4px; }
.search-results a { display: flex; flex-direction: column; padding: 7px 14px; color: var(--text); font-size: 0.88rem; }
.search-results a:hover { background: var(--bg); text-decoration: none; }
.search-results .sr-sub { font-size: 0.75rem; color: var(--text-muted); }
.search-empty { padding: 14px; color: var(--text-muted); font-size: 0.85rem; }
.sidebar-overlay { display: none; }

.container {
  /* Kein festes max-width mehr, damit sich die Anzeige immer der Bildschirmbreite anpasst
     (schmale Notebooks bis große Ultrawide-Monitore) statt in der Mitte eines breiten
     Bildschirms schmal stehen zu bleiben. WICHTIG: width muss die Sidebar-Breite abziehen,
     da margin-left sonst zusätzlich zu 100% Breite addiert und über den Bildschirmrand
     hinausragt (führte zu horizontalem Overflow).
  */
  width: calc(100% - var(--sidebar-width));
  margin-left: var(--sidebar-width);
  padding: calc(var(--header-height) + 24px) 28px 60px;
  /* Bugfix (von Stephan gemeldet: "warum scrollt sie mit? warum ist sie nicht fixiert?"):
     Hier stand "overflow-x: auto". Der Browser macht daraus automatisch auch "overflow-y: auto" -
     damit ist der Container ein eigener Scrollkasten, und eine fixierte Tabellenkopfzeile klebt an
     diesem Kasten statt am Fenster. Genau deshalb scrollte die Überschrift mit.
     "clip" begrenzt weiterhin seitlich (breite Tabellen laufen also nicht aus der Seite), macht den
     Container aber NICHT zum Scrollkasten - die Kopfzeile klebt dadurch wieder am Fenster.
     Im Browser nachgemessen: die feste blaue Kopfleiste ist 58 px hoch, siehe --header-height. */
  overflow-x: clip;
  overflow-clip-margin: 8px;
}

/* Bugfix (von Stephan gemeldet, Baustellen-Übersicht auf TV-Bildschirm "sieht nicht sauber aus"):
   .topheader/.container reservieren oben immer --sidebar-width für die linke Navigationsleiste -
   für Benutzer mit nur_baustellen_dashboard=1 wird diese aber komplett ausgeblendet (siehe
   views/partials/nav.ejs), wodurch links ein leerer, ungenutzter Streifen stehen blieb. Die Klasse
   "no-sidebar" (siehe Toggle ganz oben in nav.ejs) hebt den Versatz für genau diesen Fall auf. */
html.no-sidebar .topheader { left: 0; }
html.no-sidebar .container { width: 100%; margin-left: 0; }

@media (max-width: 900px) {
  .sidebar {
    transform: translateX(-100%);
    transition: transform 0.2s ease;
    box-shadow: 4px 0 20px rgba(0,0,0,0.2);
  }
  body.sidebar-open .sidebar { transform: translateX(0); }
  .topheader { left: 0; }
  .menu-toggle { display: inline-block; }
  .container { width: 100%; margin-left: 0; padding-left: 16px; padding-right: 16px; }
  body.sidebar-open .sidebar-overlay {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(10,15,30,0.45);
    z-index: 59;
  }
}

.page-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 18px;
  flex-wrap: wrap;
  gap: 10px;
}
.page-header h1 { margin: 0; font-size: 1.4rem; }
.page-header-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* Auftragsstatus-Stepper (siehe partials/project-status-stepper.ejs): Punkte mit verbindender
   Linie direkt unter der Bezeichnung, Klick speichert den Status sofort per AJAX. */
.status-stepper {
  display: flex;
  align-items: flex-start;
  gap: 0;
  margin: -6px 0 18px;
  overflow-x: auto;
  padding: 4px 2px 8px;
}
.status-stepper.is-saving { opacity: 0.6; pointer-events: none; }
.status-step {
  display: flex;
  flex-direction: column;
  align-items: center;
  flex: 1;
  min-width: 84px;
  position: relative;
}
.status-step:not(:last-child)::after {
  content: '';
  position: absolute;
  top: 8px;
  left: calc(50% + 12px);
  right: calc(-50% + 12px);
  height: 2px;
  background: var(--border);
}
.status-step.is-past:not(:last-child)::after { background: #b9c0cc; }
.status-step-dot {
  width: 18px;
  height: 18px;
  border-radius: 50%;
  border: 2px solid var(--border);
  background: #fff;
  cursor: pointer;
  padding: 0;
  z-index: 1;
  transition: transform 0.1s ease;
}
.status-step-dot:hover { transform: scale(1.15); }
.status-step.is-current .status-step-dot { box-shadow: 0 0 0 3px rgba(240,124,46,0.15); }
/* "Aktiviert"/"Aktiviert o. Gen."-Abzweigung (von Stephan gewünscht, siehe
   partials/project-status-stepper.ejs) - zwei Punkte an derselben Stelle statt zweier
   aufeinanderfolgender Schritte in der Reihenfolge, der zweite (kleinere) Punkt steht für die
   Alternative "ohne Genehmigung". */
.status-step-branch { display: flex; align-items: center; gap: 5px; }
.status-step-dot-branch {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  border: 2px solid var(--border);
  background: #fff;
  cursor: pointer;
  padding: 0;
  z-index: 1;
  transition: transform 0.1s ease;
}
.status-step-dot-branch:hover { transform: scale(1.2); }
.status-step-sublabel {
  margin-top: 1px;
  font-size: 0.62rem;
  color: var(--text-muted);
  white-space: nowrap;
}
.status-step-label {
  margin-top: 6px;
  font-size: 0.72rem;
  color: var(--text-muted);
  text-align: center;
  line-height: 1.2;
  padding: 0 4px;
}

/* Einstellungen-Übersicht: farbige Kategorie-Kacheln als Schnellnavigation über den eigentlichen
   (weiter unten liegenden) Detail-Karten, damit die lange Einstellungsseite übersichtlicher wirkt. */
.settings-overview {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
  margin-bottom: 28px;
}
@media (max-width: 900px) {
  .settings-overview { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 600px) {
  .settings-overview { grid-template-columns: 1fr; }
}
.settings-cat {
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid var(--border);
  background: var(--card);
  box-shadow: 0 1px 2px rgba(20,30,50,0.04);
}
.settings-cat-header {
  padding: 12px 16px;
  font-weight: 700;
  font-size: 0.95rem;
}
.settings-cat-body {
  display: flex;
  flex-direction: column;
  padding: 10px 16px 14px;
}
.settings-cat-body a {
  padding: 6px 0;
  color: var(--text);
  text-decoration: none;
  font-size: 0.88rem;
  border-bottom: 1px solid #f0f1f4;
}
.settings-cat-body a:last-child { border-bottom: none; }
.settings-cat-body a:hover { color: var(--accent); text-decoration: underline; }
.settings-cat.cat-neutral .settings-cat-header { background: #f3f4f6; color: #1f2937; }
.settings-cat.cat-teal .settings-cat-header { background: #0f9b8e; color: #fff; }
.settings-cat.cat-indigo .settings-cat-header { background: #828282; color: #fff; }
.settings-cat.cat-purple .settings-cat-header { background: #7c3aed; color: #fff; }
.settings-cat.cat-slate .settings-cat-header { background: #334155; color: #fff; }

/* Auftragsformular: Auto-Save-Statusanzeige (siehe views/projects/show.ejs) statt eines
   "Speichern"-Buttons. */
.autosave-status { font-size: 0.82rem; color: var(--text-muted); }
.autosave-status.is-saving { color: var(--text-muted); }
.autosave-status.is-saved { color: var(--success); font-weight: 600; }
.autosave-status.is-error { color: var(--danger); font-weight: 600; }

.import-card { max-width: 640px; }
.import-dropzone {
  border: 2px dashed var(--border);
  border-radius: var(--radius);
  padding: 24px;
  text-align: center;
  margin-bottom: 16px;
}
.import-result { padding: 12px 14px; border-radius: var(--radius); margin-bottom: 16px; font-size: 0.92rem; }
.import-result.ok { background: #e9f7ef; border: 1px solid #a3d9b6; color: #1e6b3c; }
.import-result.error { background: #fbeaec; border: 1px solid #e3a3ac; color: #8a2331; }
.import-columns-hint { font-size: 0.85rem; color: var(--text-muted); margin-top: 4px; }

.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 20px;
  margin-bottom: 20px;
}

/* Von Stephan gewünscht (Screenshot Auftragsseite: "Dokumente"-Übersichtskarte wird bei vielen
   E-Mail-Anhängen sehr lang) - begrenzt die Liste auf eine feste Höhe mit eigenem Scrollbalken,
   damit die Karte nicht mehr die ganze Seite in die Länge zieht. Wird u.a. in
   views/projects/show.ejs bei der oberen "Dokumente"-Karte verwendet. */
.card-scroll-list {
  max-height: 260px;
  overflow-y: auto;
  padding-right: 4px;
}
/* Bugfix (echter Fehler, von Stephan gemeldet: "Und Menü sieht man nicht"): die Schnellauswahl des
   Angebotsstatus in der Angebote-Karte klappt nach unten auf - der eigene Scrollbalken dieser Liste
   (overflow-y: auto) hat das Klappmenü aber am unteren Rand abgeschnitten, bei nur einem Angebot war
   praktisch nichts davon zu sehen. Solange ein Menü offen ist, darf die Liste deshalb überstehen -
   exakt dasselbe Vorgehen wie bei den Aufgabenblöcken (siehe .aufgaben-block:has(details[open])). */
.card-scroll-list:has(details[open]) { overflow: visible; max-height: none; }
/* Eine Zeile der Angebote- bzw. Debitoren/Kreditoren-Karte: Beleg-Link, Status-Schnellauswahl und
   Briefumschlag stehen nebeneinander auf einer Höhe (siehe views/projects/show.ejs und
   views/deals/show.ejs).
   Von Stephan nachgereicht ("Button unter Button setzen, es soll gleichmäßig aussehen - der Button
   von Gutschrift soll genau unter Button Rechnung sein" und "Mail Button bei Angebot und
   Debitoren/Kreditoren-Kachel ebenfalls sauber untereinander in einer Reihe"): deshalb ein RASTER
   statt einer einfachen Reihe - der Beleg-Link nimmt die erste, mitwachsende Spalte ein, Status und
   Briefumschlag stehen in eigenen, festen Spalten. Dadurch beginnen die Knöpfe in jeder Zeile an
   exakt derselben Stelle, egal wie lang "Angebot 2026-001", "Rechnung 2026-014" oder
   "Gutschrift 26-001" gerade ist. */
/* Von Stephan gewünscht ("Hinterlege je Eintrag in der Kachel einen Hintergrund - selbe
   Hintergrundfarbe wie bei Aufgaben-Kachel. Also Hintergrund Eintrag, nicht Hintergrund Kachel"):
   jeder Eintrag liegt jetzt als eigene helle Karte in der Kachel - exakt dieselben Werte wie eine
   Aufgabenzeile (siehe .aufgaben-block-inhalt .task-row.task-row-kompakt weiter unten: Fläche
   #faf8f4, Rahmen #ece7de, 5 px Radius). Eine Zeile umfasst dabei genau das, was Stephan benannt
   hat: "Angebot 2026-001" + Status-Knopf + Mail-Knopf. Gilt für die Angebote- und die
   Debitoren/Kreditoren-Kachel (dort auch für die Eingangsrechnungs- und Bestellzeilen, damit die
   Kachel einheitlich aussieht). */
/* Von Stephan gewünscht ("Neues Feld für Eingangsrechnung - Feld setzen (Größe 7 Zeichen, 26-120)
   neben Belegnummer. Belegnummer Feld Größe anpassen, dass es eine Zeile ist. Name Interne BH
   Nr."): Beleg-Nr. und die neue interne Nummer stehen gemeinsam in EINER Zeile - die Beleg-Nr.
   nimmt den freien Platz ein, das BH-Feld ist genau 7 Zeichen breit und wächst nicht mit.
   Eingebunden in views/projects/show.ejs, views/deals/show.ejs und views/businessFolders/show.ejs. */
/* Von Stephan gemeldet ("Interne BH Nr. und Belegnummer ist verrutscht"): die beiden Felder lagen
   in einer flex-Zeile, deren rechtes Element eine eigene Beschriftung mitbrachte - dadurch saßen
   Beschriftung und Eingabefeld auf unterschiedlichen Höhen. Jetzt ein Raster mit zwei Spalten:
   links die Beleg-Nr. über die volle Restbreite, rechts das feste BH-Feld; beide Beschriftungen
   stehen exakt auf einer Linie, beide Felder ebenso. */
.erg-beleg-felder {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px;
  align-items: end;
}
.erg-beleg-felder .erg-belegnummer { width: 100%; min-width: 0; }
.erg-bh-nr-label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin: 0;
  font-size: 0.72rem;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
/* Von Stephan korrigiert ("Interne BH Nummer sollte 7 Zeichen breit sein und nicht 6"): Platz für
   volle 7 Zeichen plus Innenabstand und Rahmen des Feldes. */
.erg-bh-nr { width: calc(7ch + 22px); flex: none; }

/* Von Stephan gemeldet ("Feld Lieferant / Behörde / Beleg-Nr. / Interne BH Nr. nicht in einer
   Zeile"): eigene Zeile mit drei echten Spalten - die beiden Textfelder teilen sich den Platz,
   die interne Nummer steht rechts in fester Breite. Auf schmalen Fenstern bricht die Zeile
   geordnet um, statt die Felder zu quetschen. */
.erg-kopf-zeile {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
  gap: 16px;
  align-items: start;
}
.erg-kopf-zeile .form-row { margin-bottom: 12px; min-width: 0; }
@media (max-width: 900px) { .erg-kopf-zeile { grid-template-columns: minmax(0, 1fr); } }

/* Von Stephan gewünscht ("Feld vor Freigabe Sachliche Prüfung: Fällig am (Datumsfeld). Freigabe
   Sachliche Prüfung in der Breite anpassen, sodass alles in einer Zeile ist"): Datumsfeld schmal,
   die Prüfer-Auswahl nimmt den Rest der Zeile ein. */
.erg-faellig-zeile {
  display: grid;
  grid-template-columns: 170px minmax(0, 1fr);
  gap: 14px;
  align-items: start;
}
.erg-faellig-zeile .form-row { margin-bottom: 0; }
.erg-faellig-zeile .erg-pruefer-feld select { width: 100%; }

/* Von Stephan gewünscht ("Fällig am Spalte in /eingangsrechnungen nach Beschreibung. Schrift
   Kursiv."). */
.erg-faellig-spalte { font-style: italic; }

/* Von Stephan gemeldet ("Spalte wird 2-zeilig, da Lieferantenname zu lang ist"): der Lieferantenname
   bleibt einzeilig und wird bei Bedarf mit … gekürzt - sonst wächst die gesamte Tabellenzeile in die
   Höhe, sobald ein einziger langer Name dabei ist. Der vollständige Name steht im Tooltip.
   Die Begrenzung sitzt auf .erg-lieferant-text INNERHALB der Zelle (siehe dort) - eine Tabellenzelle
   selbst darf dafür nicht umgestellt werden. */

/* Balken der Speicherplatz-Übersicht (siehe views/settings/speicherplatz.ejs). Ampel: bis 75 %
   grün, bis 90 % gelb, darüber rot - so ist auf einen Blick klar, ob es eng wird. */
.speicher-balken {
  height: 22px;
  border-radius: 4px;
  background: #e6eaf0;
  border: 1px solid var(--border);
  overflow: hidden;
}
.speicher-balken-fuellung { height: 100%; }
.speicher-gruen { background: linear-gradient(180deg, #63c07a, #2e7d32); }
.speicher-gelb  { background: linear-gradient(180deg, #ffc75a, #e8a11a); }
.speicher-rot   { background: linear-gradient(180deg, #ef6a7c, #c02b3f); }
/* Bugfix (von Stephan gemeldet: "Lieferanten Spalte ist absolut nicht in der Zeile und komplett
   verrutscht"): Hier stand vorher display:block AUF DER ZELLE. Damit ist die Zelle keine
   Tabellenzelle mehr - sie fällt aus der Zeile heraus und schiebt alle folgenden Spalten
   durcheinander. Das Kürzen langer Lieferantennamen passiert deshalb jetzt in einem eigenen
   Element INNERHALB der Zelle; die Zelle selbst bleibt eine ganz normale Tabellenzelle. */
.erg-lieferant-text {
  display: block;
  max-width: 190px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Rückfrage-Fenster des BH-Knopfes (von Stephan gewünscht: "Kannst du das Popup in Mauszeiger-Nähe
   öffnen?"): das Fenster wird per JavaScript direkt neben den Zeiger gesetzt (siehe
   partials/erg-bh-knopf.ejs) - die sonst übliche Zentrierung und der Innenabstand der
   Overlay-Ebene würden dabei stören, deshalb hier ausgeschaltet. Der abdunkelnde Hintergrund
   bleibt, damit klar ist, dass eine Antwort erwartet wird. */
.erg-bh-frage-overlay { padding: 0; align-items: flex-start; justify-content: flex-start; }
.erg-bh-frage-box { box-shadow: 0 12px 40px rgba(0,0,0,0.35); }

/* Buchhaltungs-Vermerk (von Stephan gewünscht: grüner Haken / rotes Kreuz hinter dem Papierkorb) -
   ein Umschalt-Knopf, siehe partials/erg-bh-knopf.ejs. Die Farbe steckt im Symbol selbst; hier nur
   feste Breite, damit die Knopfreihe beim Umschalten nicht springt, und ein deutlicherer
   Mauszeiger-Hinweis. */
.erg-bh-knopf { width: 24px; text-align: center; line-height: 1; }
.erg-bh-knopf:disabled { opacity: 0.5; cursor: default; }
/* Eigene schmale Spalte für den Download-Haken (von Stephan gewünscht: "Setze für den Download-
   Haken folgende Überschrift - Symbol Pfeil nach oben"). Feste Breite, damit die Spalte bei
   gesetztem wie bei leerem Haken gleich breit bleibt. */
.erg-dl-spalte { width: 28px; text-align: center; }

/* Von Stephan gewünscht ("in der Kachel Debitoren/Kreditoren: wenn Beleg angezeigt wird, dann Text
   in Kursiv 'Beleg in der BH am 12.08.2026' und Datum in Grün färben"): Hinweiszeile unter dem
   Belegnamen in der Debitoren/Kreditoren-Kachel (siehe views/projects/show.ejs). */
/* Von Stephan nachgereicht ("Text hinter Beleg"): steht in derselben Zeile direkt hinter dem
   Belegnamen, nicht mehr als eigene Zeile darunter. */
.erg-bh-hinweis {
  font-style: italic;
  font-size: 0.72rem;
  color: var(--text-muted);
  margin-left: 6px;
  white-space: nowrap;
}
.erg-bh-hinweis-datum { color: var(--success); font-weight: 600; font-style: italic; }

.kachel-eintrag {
  background: #faf8f4;
  border: 1px solid #ece7de;
  border-radius: 5px;
  padding: 5px 8px;
  margin: 0 0 4px;
}
.kachel-eintrag:last-child { margin-bottom: 0; }
.angebot-kachel-zeile {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 132px 28px;
  align-items: center;
  gap: 8px;
  margin: 0 0 4px;
}
.angebot-kachel-zeile > a:first-child {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Der Status füllt seine Rasterspalte komplett aus - dadurch sind die Knöpfe aller Zeilen exakt
   gleich breit und stehen bündig untereinander. */
.angebot-kachel-zeile .status-picker { min-width: 0; }
.angebot-kachel-zeile .status-picker summary .badge {
  width: 100%;
  height: 24px;
  padding: 0 8px;
  border-radius: 4px;
  box-sizing: border-box;
}
.angebot-kachel-zeile > .btn-icon { justify-self: center; }

.grid { display: grid; gap: 16px; }
/* .grid-5 (Software-Liste, "Vorname/Nachname statt einem Namensfeld"): für das Ansprechpartner-
   Formular in views/customers/show.ejs, das durch die Aufteilung von "Name" in Vorname/Nachname
   jetzt eine Spalte mehr braucht. */
/* .grid-6 (von Stephan gewünscht, /kunden/159): zusätzliches "Mobil"-Feld im selben Ansprechpartner-
   Formular - eine Spalte mehr als .grid-5. */
/* .grid-7 (von Stephan gewünscht: "auch bei Ansprechpartner Herr und Frau Hinzufügen"): zusätzliches
   Anrede-Feld im selben Ansprechpartner-Formular - eine Spalte mehr als .grid-6. */
.grid-7 { grid-template-columns: repeat(7, 1fr); }
.grid-6 { grid-template-columns: repeat(6, 1fr); }
.grid-5 { grid-template-columns: repeat(5, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
@media (max-width: 900px) {
  .grid-7, .grid-6, .grid-5, .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr 1fr; }
}

/* Punkt 2 (Software-Liste): frei anordenbare Dashboard-Kacheln, siehe utils/dashboardWidgets.js +
   views/dashboard.ejs. 12-Spalten-Raster, jede Kachel belegt "span" Spalten (Klasse dw-span-N). */
.dashboard-grid { display: grid; grid-template-columns: repeat(12, 1fr); gap: 16px; margin-bottom: 20px; }
.dashboard-widget { min-width: 0; position: relative; }
.dashboard-widget > .card, .dashboard-widget > .stat-card { margin-bottom: 0; height: 100%; }
.dw-span-3 { grid-column: span 3; }
.dw-span-4 { grid-column: span 4; }
.dw-span-6 { grid-column: span 6; }
.dw-span-12 { grid-column: span 12; }
@media (max-width: 900px) {
  .dw-span-3, .dw-span-4, .dw-span-6, .dw-span-12 { grid-column: span 12; }
}

/* Von Stephan gewünscht: feste erste Kachelzeile im VSS Dashboard (Umsatz-/OPOS-Kennzahlen, siehe
   views/dashboard-vss.ejs) - bewusst eigenes 5-Spalten-Raster statt des dw-span-Systems oben, da
   diese Zeile NICHT per Drag & Drop anpassbar/entfernbar ist. */
.vss-kpi-row { display: grid; grid-template-columns: repeat(5, 1fr); gap: 16px; margin-bottom: 20px; }
@media (max-width: 1100px) { .vss-kpi-row { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 700px) { .vss-kpi-row { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px) { .vss-kpi-row { grid-template-columns: 1fr; } }

/* Punkt 1 (Software-Liste Runde AS): kompakter Monats-Kalender in der "Kalender"-Kachel des
   Baustellen-Dashboards, siehe views/dashboard-baustellen.ejs. */
.dashboard-mini-calendar { border-collapse: collapse; width: 100%; }
.dashboard-mini-calendar th { font-size: 0.72rem; font-weight: 600; color: var(--muted); text-align: center; padding: 4px 2px; }
.dashboard-mini-calendar td { text-align: center; padding: 1px; }
.dashboard-mini-calendar-day {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  width: 100%; aspect-ratio: 1; border-radius: 6px; text-decoration: none; color: inherit;
  font-size: 0.78rem; position: relative;
}
.dashboard-mini-calendar-day:hover { background: rgba(20,40,80,0.06); }
.dashboard-mini-calendar-day.is-outside { color: var(--muted); opacity: 0.5; }
.dashboard-mini-calendar-day.is-today { background: var(--accent, #8e8e8e); color: #fff; font-weight: 700; }
.dashboard-mini-calendar-day .day-dot {
  width: 4px; height: 4px; border-radius: 50%; background: var(--accent, #8e8e8e); margin-top: 2px;
}
.dashboard-mini-calendar-day.is-today .day-dot { background: #fff; }

/* Punkt 4 (Software-Liste Runde AU): Wochen-Kalender-Kachel im Baustellen-Dashboard (ersetzt den
   bisherigen Monats-Mini-Kalender, siehe views/dashboard-baustellen.ejs) - zeigt die Verkehrs-
   sicherung-Aufträge der aktuellen Woche inkl. Kunde. "min-width: 0" auf den Spalten aus demselben
   Grund wie bei .cal-cell (siehe Bugfix Punkt 5 oben) - verhindert, dass ein langer Auftragsname
   trotz Ellipsis eine einzelne Spalte breiter zieht als die übrigen 6.
*/
/* Von Stephan gewünscht (Baustellen-Dashboard, Beispielbild): Einträge je Tag nicht mehr als
   schmale einzeilige Badges, sondern als größere, farbige Balken mit Adresse (fett), Kunde
   (kursiv) und Beginn-Uhrzeit (groß, rechtsbündig) - siehe views/dashboard-baustellen.ejs. Die
   Kachel darf dafür insgesamt etwas höher sein ("Fenster kann etwas größer nach unten skaliert
   werden") - min-height/max-height gegenüber vorher deutlich vergrößert, mit Scrollbalken als
   Sicherheitsnetz für sehr volle Tage. */
/* Von Stephan gewünscht ("Kalender Vorschau bitte auf 14 Tage erweitern. Bitte anpassen, sodass
   alles auf dem Bildschirm draufpasst" - Baustellen-Übersicht auf einem Fernseher): 14 Tage werden
   als zwei Reihen à sieben Tage dargestellt. Die Tageskacheln waren mit min-height 260px auf zwei
   Reihen viel zu hoch (über 520px allein für den Kalender) - jetzt deutlich flacher, sie wachsen
   aber weiterhin mit, wenn an einem Tag mehrere Aufträge liegen. Die Wochentagsbezeichnung steht
   einmal als Kopfzeile darüber (siehe .dashboard-week-weekdays) statt in jeder Kachel. */
.dashboard-week-weekdays {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin-top: 10px; margin-bottom: 4px;
}
.dashboard-week-weekdays span {
  font-size: 0.68rem; font-weight: 700; text-transform: uppercase; color: var(--muted); padding-left: 6px;
}
.dashboard-week-calendar { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
.dashboard-week-day {
  min-width: 0; box-sizing: border-box; border: 1px solid var(--border); border-radius: var(--radius);
  padding: 6px; display: flex; flex-direction: column; gap: 4px; min-height: 64px;
}
.dashboard-week-day.is-today { background: #ffeaed; border-color: var(--accent, #8e8e8e); }
.dashboard-week-day-header { display: flex; align-items: baseline; justify-content: space-between; }
.dashboard-week-day-header .weekday { font-size: 0.68rem; font-weight: 700; text-transform: uppercase; color: var(--muted); }
.dashboard-week-day-header .daynum { font-size: 0.85rem; font-weight: 700; }
.dashboard-week-day.is-today .daynum { color: var(--accent, #8e8e8e); }
.dashboard-week-day-items { display: flex; flex-direction: column; gap: 4px; overflow-y: auto; overflow-x: hidden; max-height: 220px; min-width: 0; }
.dashboard-week-badge {
  display: flex; align-items: center; justify-content: space-between; gap: 6px; min-width: 0; max-width: 100%;
  box-sizing: border-box; background: #f2a71b; color: #1a1a1a; border-radius: 6px; padding: 6px 8px;
  text-decoration: none;
}
.dashboard-week-badge:hover { background: #e0980f; }
/* Von Stephan gewünscht ("Wenn Kunde monea im Kalender angezeigt wird, dann bitte die Farbe auf
   #e5bbf6 als Hintergrund setzen"): eigene Hintergrundfarbe für Aufträge dieses Kunden im
   Baustellen-Kalender. Die dunkle Schrift der Kachel bleibt unverändert - auf dem hellen Flieder
   ist sie gut lesbar; die Hover-Farbe ist eine Spur kräftiger, damit die Kachel auch hier
   erkennbar reagiert. */
.dashboard-week-badge.badge-monea { background: #e5bbf6; }
.dashboard-week-badge.badge-monea:hover { background: #d79fee; }
.dashboard-week-badge-text { min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.dashboard-week-badge-adresse { font-weight: 700; font-size: 0.72rem; line-height: 1.2; overflow-wrap: break-word; }
.dashboard-week-badge-kunde { font-style: italic; font-size: 0.66rem; opacity: 0.85; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dashboard-week-badge-zeit { font-weight: 700; font-size: 0.82rem; white-space: nowrap; flex-shrink: 0; }
@media (max-width: 900px) {
  /* Auf schmalen Geräten bleiben die sieben Spalten erhalten und werden waagerecht scrollbar - die
     Wochentags-Kopfzeile muss dabei mitscrollen, sonst stünde sie über den falschen Tagen. */
  .dashboard-week-calendar,
  .dashboard-week-weekdays { grid-template-columns: repeat(7, minmax(140px, 1fr)); overflow-x: auto; }
}

/* Von Stephan gewünscht (Baustellen-Dashboard): "Aktive Aufträge - Verkehrssicherung/Halteverbot"
   und "Anstehende Aufbauten" stehen jetzt nebeneinander (je dw-span-4) statt untereinander - siehe
   views/dashboard-baustellen.ejs. Die bisherige breite 4-Spalten-Tabelle (Bezeichnung/Kunde/
   Beginn/Ende) passt in ein Drittel der Breite nicht mehr sauber, daher hier eine kompakte,
   zweizeilige Listen-Darstellung je Auftrag statt einer Tabelle - "der Größe angepasst", wie von
   Stephan gewünscht. Über den optionalen "compact"-Parameter der partials/dashboard-widgets/
   aktive_vs.ejs/aktive_hv.ejs aktiviert, damit das Standard-Dashboard (dort weiterhin volle Breite/
   Tabelle) unverändert bleibt. */
.dash-compact-list { display: flex; flex-direction: column; gap: 2px; margin-top: 8px; }
.dash-compact-row {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 7px 4px; border-bottom: 1px solid var(--border); text-decoration: none; color: inherit;
  min-width: 0;
}
.dash-compact-row:last-child { border-bottom: none; }
.dash-compact-row:hover { background: rgba(20,40,80,0.05); }
.dash-compact-main { min-width: 0; flex: 1; }
.dash-compact-title {
  display: block; font-weight: 600; font-size: 0.86rem; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.dash-compact-sub { display: block; font-size: 0.74rem; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dash-compact-meta { flex-shrink: 0; text-align: right; font-size: 0.74rem; color: var(--muted); white-space: nowrap; }
.dash-compact-meta .badge { font-size: 0.68rem; padding: 2px 7px; }
.dashboard-widget-handle {
  display: none;
  align-items: center;
  justify-content: space-between;
  background: rgba(20,40,80,0.06);
  border-radius: var(--radius) var(--radius) 0 0;
  padding: 4px 10px;
  font-size: 0.85rem;
}
.dw-drag { cursor: grab; opacity: 0.6; }
.dw-remove { background: none; border: none; cursor: pointer; color: var(--danger); font-size: 0.85rem; padding: 2px 6px; }
.dashboard-widget.dw-editing { outline: 2px dashed var(--border); border-radius: var(--radius); }
.dashboard-widget.dw-editing[draggable="true"] { cursor: grab; }
@media (max-width: 600px) {
  .grid-7, .grid-6, .grid-5, .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr; }
  .topbar-inner { gap: 8px; }
}

.stat-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px;
}
.stat-card .label { color: var(--text-muted); font-size: 0.85rem; }
.stat-card .value { font-size: 1.6rem; font-weight: 700; color: var(--primary); }

table { width: 100%; border-collapse: collapse; font-size: 0.92rem; }
th, td { text-align: left; padding: 10px 8px; border-bottom: 1px solid var(--border); }
th { color: var(--text-muted); font-weight: 600; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.02em; }
tr:hover td { background: #fcfcfc; }

/* Von Stephan gewünscht ("Überall wo die Leiste Erstellt Titel Lieferant Netto MwSt Brutto Status
   ist, hier eine Sortierfunktion einbauen, aufsteigend, absteigend. wie bei Rechnungen. Das soll
   immer Standard eingebaut werden! überall bitte aktualisieren"): klickbare Spaltenüberschriften.
   Optik der Überschrift bleibt unverändert - nur Mauszeiger, Unterstreichung beim Überfahren und
   der Richtungspfeil kommen dazu (genau wie in der Rechnungsliste, .sort-th-link). */
.sortier-kopf { cursor: pointer; user-select: none; }
.sortier-kopf:hover { text-decoration: underline; }
.sortier-pfeil { font-size: 0.85em; }

.btn {
  display: inline-block;
  background: var(--primary);
  color: #fff;
  border: none;
  padding: 9px 16px;
  border-radius: var(--radius);
  cursor: pointer;
  font-size: 0.9rem;
  text-align: center;
}
.btn:hover { background: var(--primary-light); text-decoration: none; }
.btn-secondary { background: #fff; color: var(--primary); border: 1px solid var(--primary); }
.btn-secondary:hover { background: #eef1f7; }
.btn-danger { background: var(--danger); }
.btn-sm { padding: 5px 10px; font-size: 0.82rem; }
/* Stift-Knopf neben den Antrags-Knöpfen ("alle Werte vor dem Erstellen anpassen"). Vorher ein
   Emoji in einem eigenen kleinen Kasten - von Stephan bemängelt. Jetzt derselbe Rahmen und dieselbe
   Höhe wie der Knopf daneben, nur schmaler, mit gezeichnetem Stift statt Emoji. */
.btn-stift {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 5px 9px;
}
.btn-stift svg { width: 14px; height: 14px; display: block; }
.btn-accent { background: var(--accent); color: #fff; }
.btn-accent:hover { background: var(--accent-dark); }
/* "Kunde sperren"/"Entsperren"-Button: bewusst schwarz mit weißer Schrift, unterscheidet sich
   damit klar von den übrigen (blauen/roten) Aktions-Buttons - siehe views/customers/show.ejs. */
.btn-sperren { background: #111; color: #fff; }
.btn-sperren:hover { background: #000; }

form .form-row { margin-bottom: 14px; }
form label { display: block; margin-bottom: 5px; font-size: 0.85rem; color: var(--text-muted); font-weight: 600; }
input, select, textarea {
  width: 100%;
  padding: 9px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-size: 0.92rem;
  font-family: inherit;
  background: #fff;
}
textarea { resize: vertical; min-height: 70px; }
.form-actions { display: flex; gap: 10px; margin-top: 20px; }

.badge {
  display: inline-block;
  padding: 3px 9px;
  border-radius: 100px;
  font-size: 0.75rem;
  font-weight: 600;
}
/* Größerer, eckiger Status-Badge speziell für Aufgaben (statt der sonst runden Pill-Badges) */
.badge.badge-task { border-radius: 4px; padding: 6px 14px; font-size: 0.9rem; font-weight: 700; }
.badge-gray { background: #e5e7eb; color: #444; }
.badge-green { background: #dcf3df; color: var(--success); }
.badge-yellow { background: #fdf1d6; color: var(--warning); }
.badge-red { background: #fbdde1; color: var(--danger); }
.badge-blue { background: #ebebeb; color: var(--primary-light); }
.badge-accent { background: #fdd0d6; color: var(--accent-dark); }
/* "Gesperrt"/"Deaktiviert"-Hinweis: schwarz mit weißer Schrift (analog zum Sperren-Button),
   damit der Status im Kunden-/Lieferanten-Titel sofort ins Auge fällt. */
.badge-gesperrt { background: #111; color: #fff; margin-left: 6px; }

/* Item 9 (Software-Liste, "Rechnungen: Status-Badges fetter/Viereck-Stil"): kräftigerer,
   eckigerer "Chip"-Stil statt der sonst üblichen leichten Pill-Badges - bewusst eine eigene
   Modifier-Klasse (statt .badge global zu ändern), da .badge auch in vielen anderen Modulen
   (Aufträge, Angebote, Aufgaben, Antragsstatus, Gutschriften) im bisherigen Pill-Stil verwendet
   wird; wird gezielt nur bei den Rechnungs-Status-Badges eingebunden (views/invoices/list.ejs +
   show.ejs, partials/status-picker.ejs badgeClass-Parameter). Schriftgröße bleibt unverändert,
   nur Deckkraft/Sättigung des Hintergrunds, Eckenradius und Schriftgewicht ändern sich. */
.badge.badge-solid { border-radius: 4px; padding: 4px 10px; font-weight: 700; }
.badge-solid.badge-green { background: var(--success); color: #fff; }
.badge-solid.badge-yellow { background: var(--warning); color: #fff; }
.badge-solid.badge-red { background: var(--danger); color: #fff; }
.badge-solid.badge-blue { background: var(--primary-light); color: #fff; }
.badge-solid.badge-accent { background: var(--accent-dark); color: #fff; }
.badge-solid.badge-gray { background: #6b7280; color: #fff; }

/* Item 8 (Software-Liste, "Rechnungen: überfällige Zeilen komplett rot"): gesamte Zeile (nicht nur
   die Fälligkeits-Spalte) in der Rechnungsübersicht rot einfärben, wenn die Rechnung noch offen und
   bereits überfällig ist (siehe views/invoices/list.ejs <tr> + routes/invoices.js istUeberfaellig
   - bereits bezahlte/stornierte Rechnungen werden dort bewusst ausgenommen). Höhere Spezifität als
   das globale "a { color: ... }" (siehe oben), daher wirkt es auch auf verlinkte Zellen (Nr.,
   Auftrag) mit.
     Der Status-Badge selbst behält seine eigene Farbe (Badges setzen ihre Farbe inline/über eigene
   Klassen mit höherer Spezifität als diese Zeilenregel). */
tr.row-overdue td { color: var(--danger); }

/* Bugfix (echter Fehler, von Stephan gemeldet): neuer Rechnungsstatus "Ausgebucht" (siehe
   views/invoices/list.ejs <tr> + routes/invoices.js) - die Rechnung bleibt in der Liste sichtbar,
   wird aber visuell durchgestrichen und abgeblendet dargestellt (analog zu row-overdue oben).
   Letzte Spalte (Aktionen: PDF-Button/⋮-Menü) bewusst ausgenommen, damit deren Buttons nicht
   ebenfalls durchgestrichen wirken. */
tr.row-ausgebucht td:not(:last-child) { text-decoration: line-through; color: var(--text-muted); opacity: 0.75; }

/* Auftragsstatus-Farbverwaltung (Einstellungen -> Auftragsstatus): Farbpalette + Hex-Code-Feld
   neben dem nativen Farbwähler, siehe views/settings.ejs. */
.project-status-preview { white-space: nowrap; }
.color-field { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.color-field input[type="color"] { width: 34px; height: 30px; padding: 2px; border: 1px solid var(--border); border-radius: 4px; cursor: pointer; background: none; }
.color-field input[type="text"] { font-family: monospace; }
.color-palette { display: flex; gap: 4px; flex-wrap: wrap; max-width: 190px; }
.color-swatch {
  width: 18px; height: 18px; border-radius: 4px; border: 1px solid rgba(0,0,0,0.15);
  cursor: pointer; padding: 0;
}
.color-swatch:hover { transform: scale(1.15); box-shadow: 0 0 0 2px rgba(0,0,0,0.1); }

/* Status-Schnellauswahl: klickbarer Badge (details/summary), Popup mit den übrigen
   Status-Optionen zum direkten Umschalten per Klick (siehe partials/status-picker.ejs). */
.status-picker { display: inline-block; position: relative; }
.status-picker summary { list-style: none; cursor: pointer; }
.status-picker summary::-webkit-details-marker { display: none; }
/* Von Stephan gewünscht ("Statusbutton in gleicher Breite anzeigen lassen. Keine Veränderung der
   Breite. Selbige bei Antrag in Aufträge"): die Status-Badges in den Listenübersichten (Aufträge
   Status/Antrag, Angebote, Rechnungen, Gutschriften) waren bisher exakt so breit wie ihr jeweiliger
   Text - je nach Status (z.B. "Offen" vs. "In Beantragung") ergaben sich dadurch unterschiedlich
   breite, unruhig wirkende Badges innerhalb derselben Spalte. Jetzt feste, einheitliche Breite,
   Text zentriert; ein (z.B. individuell umbenannter, ungewöhnlich langer) Status wird zur
   Sicherheit abgeschnitten (Ellipsis) statt die Breite zu sprengen.
   .status-picker summary .badge: aufklappbare Schnellauswahl (Angebote/Rechnungen/Gutschriften).
   td[data-col] .badge: reine Anzeige-Badges ohne Popup (Aufträge Status/Antrag, siehe
   partials/project-status-badge.ejs bzw. antrag-status-badge.ejs in views/projects/list.ejs). */
.status-picker summary .badge {
  display: inline-flex; align-items: center; justify-content: center; gap: 3px;
  width: 128px; box-sizing: border-box;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Von Stephan gemeldet ("/auftraege - und Status Button wie offen einheitlich machen"): die Breite
   war zwar schon einheitlich, Höhe und Innenabstand aber nicht - der Auftragsstatus kommt als
   einfacher Badge (partials/project-status-badge.ejs, Innenabstand 3px/9px, 21 px hoch), der
   Antragsstatus dagegen als "badge-solid" bzw. als aufklappbare Schnellauswahl (4px/10px, 22-23 px
   hoch). Nebeneinander in derselben Zeile fielen die unterschiedlich hohen Kästchen sofort auf.
   Beide Spalten bekommen deshalb jetzt exakt dieselbe Box: gleiche Breite, gleiche Höhe, Text
   mittig - unabhängig davon, welcher der beiden Bausteine die Farbe liefert. */
/* Von Stephan gemeldet ("Status Button, Antrag Button solltest du anpassen. Die müssen eckiger
   werden, einheitlich wie der Offen Button. Es sieht alles bunt und durcheinander aus"):
   gemessen war der Auftragsstatus eine RUNDE Pille (Eckenradius 100 px, 21 px hoch,
   Schriftstärke 600), der Antragsstatus daneben ein ECKIGER Kasten (Radius 4 px, 22-23 px hoch,
   Schriftstärke 700) - zwei verschiedene Formen direkt nebeneinander in derselben Zeile.
   Auf Rückfrage festgelegt: beide eckig wie der "Offen"-Knopf in der Antrag-Spalte. Gleiche Form,
   gleiche Höhe, gleiche Schriftstärke, gleiche Breite. Gilt ausdrücklich NUR in dieser Tabelle -
   die Badges in Angebots-, Rechnungs- und Gutschriftlisten bleiben unverändert. */
td[data-col="status"] .badge, td[data-col="antrag"] .badge {
  display: inline-flex; align-items: center; justify-content: center; gap: 3px;
  /* Füllt die fest zugeteilte Spaltenbreite aus - dadurch sind beide Knöpfe in jeder Zeile exakt
     gleich groß, egal wie breit das Fenster ist. */
  width: 100%; max-width: 140px; height: 24px; padding: 0 8px; box-sizing: border-box;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  text-align: center; line-height: 1;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
td[data-col="antrag"] .status-picker { display: block; }
/* Die Schnellauswahl in der Antrag-Spalte sitzt in einem <summary> - damit die Box dort identisch
   bleibt, gilt dieselbe Höhe auch für den darin liegenden Badge (siehe .status-picker summary
   .badge oben, das nur die Breite setzt). */
td[data-col="antrag"] .status-picker summary .badge { height: 24px; padding: 0 10px; }
/* Von Stephan gewünscht ("Haken, wenn nicht gedownloadet wurde dann leer lassen. Wenn die Datei
   gedownloadet wurde einen Haken"): kleines, fest breites Häkchen-Symbol vor dem PDF-Button in
   Angebote/Rechnungen (siehe views/quotes/list.ejs, views/invoices/list.ejs) - feste Breite, damit
   der PDF-Button nicht je nach gesetztem/leerem Haken seine Position verschiebt. */
.pdf-downloaded-check {
  display: inline-block; width: 16px; text-align: center; color: var(--success); font-weight: 700;
}
/* Von Stephan gewünscht ("neben Download haken E-Mail Symbol einbauen"): analog zum Download-Haken
   oben, feste Breite damit nachfolgende Buttons nicht springen. Nur sichtbar, wenn die Rechnung
   tatsächlich per E-Mail versendet wurde (siehe views/invoices/list.ejs). */
.email-versendet-check {
  display: inline-block; width: 16px; text-align: center;
}
.status-picker-caret { font-size: 0.65em; opacity: 0.7; }
.status-picker-menu {
  position: absolute;
  top: calc(100% + 4px);
  left: 0;
  z-index: 30;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 4px;
  min-width: 150px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.14);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
/* Bugfix (Software-Liste Runde AU, Punkt 2): das Aktionsmenü (⋮) bei Zeilen nahe dem unteren
   Fensterrand - z.B. die letzten Zeilen einer langen Tabelle in Angebote/Lieferscheine/
   Rechnungen/Eingangsrechnungen - ragte nach unten aus dem sichtbaren Fenster bzw. wurde vom
   umgebenden ".container" (overflow-x:auto, siehe oben im Layout-Abschnitt) abgeschnitten, da
   dort unterhalb der Tabelle kein Platz mehr war. Die vorherige Korrektur (Punkt 142, Runde AS)
   hatte nur das horizontale Abschneiden am rechten Rand behoben (siehe .task-menu-picker /
   .assignee-picker-menu unten), nicht dieses vertikale Problem. Die Klasse "flip-up" wird per
   JavaScript (siehe partials/nav.ejs, Status-Schnellauswahl-Skript) automatisch gesetzt, sobald
   beim Öffnen nicht genug Platz nach unten vorhanden ist - dasselbe Menü klappt dann stattdessen
   nach oben auf. Zentral hier definiert, damit alle status-picker-menu-Varianten (Aktionsmenü,
   einfache Status-Auswahl, Mitarbeiter-/Deadline-Picker) automatisch denselben Mechanismus nutzen. */
.status-picker-menu.flip-up { top: auto; bottom: calc(100% + 4px); }
/* Von Stephan gewünscht ("Dropdown-Menü bei Rechnungen geht über den Fensterrand hinaus"): analog
   zu .flip-up oben, aber für die horizontale Richtung - wird per JavaScript (siehe partials/nav.ejs,
   selbe Status-Schnellauswahl-Toggle-Logik) automatisch gesetzt, sobald das Menü beim Öffnen über
   den RECHTEN Fensterrand hinausragen würde (z.B. Status-Spalte in der breiten Rechnungen-/Angebote-/
   Gutschriften-Tabelle, die je nach Fensterbreite/Zoomstufe nah am rechten Rand liegt). Klappt dann
   stattdessen rechtsbündig zum Auslöser auf (nach links), statt vom umgebenden ".container"
   (overflow-x:auto) oder dem Fensterrand abgeschnitten/unsichtbar zu werden. */
.status-picker-menu.flip-left { left: auto; right: 0; }
.status-picker-menu form { margin: 0; }
.status-picker-menu button {
  display: block;
  width: 100%;
  background: none;
  border: none;
  padding: 5px 6px;
  cursor: pointer;
  border-radius: 4px;
  text-align: left;
}
.status-picker-menu button:hover { background: var(--bg); }

.flash {
  padding: 12px 16px;
  border-radius: var(--radius);
  margin-bottom: 16px;
  font-size: 0.9rem;
}
.flash-error { background: #fbdde1; color: var(--danger); }
.flash-success { background: #dcf3df; color: var(--success); }

.login-wrap {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, var(--primary), var(--primary-light));
}
/* Von Stephan gewünscht: eigenes Hintergrundbild NUR auf der eigentlichen Login-Seite (views/
   login.ejs) - NICHT auf views/set-password.ejs ("Passwort erstellen" über den Einladungslink),
   das denselben .login-wrap-Grundcontainer wiederverwendet. Daher eine eigene, nur dort gesetzte
   Zusatzklasse statt die Regel direkt an .login-wrap zu hängen. "Selbst skalieren" = background-
   size: cover füllt die komplette Fläche unabhängig von der Bildschirmgröße, background-position:
   center sorgt dafür, dass dabei immer der Bildmittelpunkt (hier: das VSS-Logo) sichtbar bleibt
   statt zufällig ab- oder weggeschnitten zu werden. */
/* WHTK (19.08.2026, Stephans Vorgabe "Hintergrund wie im Screenshot"): derselbe dunkle
   Radialverlauf wie auf whtk.de (Elementor-Hero: #0a1a2e innen nach #050a14 außen) statt des
   bisherigen Hintergrundbilds - dadurch entfällt auch das Laden des JPG. */
.login-wrap.login-bg {
  background-image: radial-gradient(at center center, #0a1a2e 0%, #050a14 150%);
}
/* Breites Kirsten-Logo auf der Anmeldeseite (statt des quadratischen App-Symbols). */
.login-logo.login-logo-breit { width: 232px; height: auto; border-radius: 0; }
.login-untertitel { font-size: 0.82rem; color: var(--text-muted); text-align: center; margin-top: -2px; }
.login-box {
  background: #fff;
  padding: 36px;
  border-radius: 12px;
  width: 100%;
  max-width: 380px;
  box-shadow: 0 12px 40px rgba(0,0,0,0.2);
}
.login-box h1 { margin-top: 0; font-size: 1.3rem; text-align: center; color: var(--primary); }
.login-brand { display: flex; flex-direction: column; align-items: center; gap: 10px; margin-bottom: 8px; }
.login-logo { width: 64px; height: 64px; border-radius: 14px; }
.login-brand h1 { margin: 0; }

.item-table input { padding: 6px 8px; }
.item-table td { vertical-align: top; }
.remove-row { color: var(--danger); cursor: pointer; background: none; border: none; font-size: 1.1rem; }
.edit-row { color: var(--primary-light); cursor: pointer; background: none; border: none; font-size: 1rem; margin-right: 6px; }
/* Von Stephan gewünscht: Positionen (Angebote/Rechnungen/Gutschriften/Angebotsvorlagen) sollen sich
   per Klick 1:1 duplizieren lassen - eigene Farbe (Akzent-Orange) zur klaren Unterscheidung von
   Bearbeiten (Blau) und Löschen (Rot), siehe duplicatePositionRow() in public/js/artikel-suche.js. */
.duplicate-row { color: var(--accent-dark); cursor: pointer; background: none; border: none; font-size: 1rem; margin-right: 6px; }

/* Positionen per Drag & Drop sortierbar (Angebote/Rechnungen/Aufgabenvorlagen), siehe
   makeItemsSortable() in public/js/item-table.js. */
.item-table td.drag-handle { width: 22px; text-align: center; color: var(--text-muted); cursor: grab; user-select: none; padding: 6px 2px; }
.item-table td.drag-handle:active { cursor: grabbing; }
.item-table tr.dragging-row { opacity: 0.4; }

/* Zusatztext-Vorschau unter der Position (Angebote/Rechnungen/Gutschriften/Vorlagen), siehe
   updateRowBeschreibungPreview() in public/js/item-table.js. */
.beschreibung-zusatz-preview { font-size: 10px; color: var(--text-muted); margin-top: 3px; white-space: pre-line; }
/* Von Stephan gewünscht ("Vorschau Zusatztext 10 Zeilen anzeigen lassen sonst mehr anzeigen button
   klickbar machen"): Link zum Aus-/Einklappen bei mehr als 10 Zeilen Zusatztext, siehe
   renderBeschreibungPreviewText() in public/js/item-table.js. */
.beschreibung-zusatz-preview-toggle { font-size: 10px; color: var(--primary); text-decoration: underline; cursor: pointer; display: inline-block; margin-top: 2px; }

/* Zusatztext-Live-Vorschau im "Position bearbeiten"-Popup (Angebote), siehe public/js/artikel-suche.js */
.pos-zusatztext-preview {
  margin-top: 6px; font-size: 0.82rem; color: var(--text-muted); background: var(--bg);
  border-radius: var(--radius); padding: 6px 10px; white-space: pre-wrap;
}
.pos-zusatztext-preview-label { font-weight: 700; text-transform: uppercase; font-size: 0.7rem; letter-spacing: 0.02em; }

.chat-wrap { display: flex; gap: 20px; height: 70vh; }
.chat-channels { width: 220px; border-right: 1px solid var(--border); padding-right: 16px; overflow-y: auto; }
.chat-channels a { display: block; padding: 8px 10px; border-radius: var(--radius); margin-bottom: 4px; color: var(--text); }
.chat-channels a.active, .chat-channels a:hover { background: var(--bg); text-decoration: none; }
.chat-main { flex: 1; display: flex; flex-direction: column; }
.chat-messages { flex: 1; overflow-y: auto; padding: 10px; background: var(--bg); border-radius: var(--radius); margin-bottom: 12px; }
.chat-msg { margin-bottom: 12px; }
.chat-msg .meta { font-size: 0.78rem; color: var(--text-muted); margin-bottom: 2px; }
.chat-msg .bubble { background: #fff; border: 1px solid var(--border); border-radius: 10px; padding: 8px 12px; display: inline-block; max-width: 80%; }
.chat-msg.own .bubble { background: var(--primary); color: #fff; border-color: var(--primary); }
.chat-form { display: flex; gap: 8px; }
/* Punkt 6 (Software-Liste Runde AU): Löschen-Icon je eigener Nachricht (bzw. jeder Nachricht für
   Nutzer mit dem Recht "loeschen"), siehe views/chat/index.ejs. */
.chat-msg-delete {
  background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 0.9rem;
  padding: 0 3px; margin-left: 4px; line-height: 1; vertical-align: middle;
}
.chat-msg-delete:hover { color: #ef445b; }

/* Punkt 6 (Software-Liste Runde AU): blinkender Punkt neben "Chat" in der Seitenleiste, solange der
   Mitarbeiter eine @Mention hat, die er noch nicht gesehen hat (siehe server.js
   res.locals.unreadMentionCount, db/schema.sql mention_notifications, routes/chat.js). Bewusst eine
   eigene, auffällige Animation statt eines statischen Badges, da es aktuell keine andere sichtbare
   Benachrichtigungs-Anzeige in der App gibt, die man stattdessen mitnutzen könnte. */
.chat-mention-dot {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #ef445b;
  margin-left: 6px; vertical-align: middle; animation: whtk-mention-blink 1.1s ease-in-out infinite;
}

/* Von Stephan gewünscht ("zusätzlich zur Chat Erwähnung Sprechblasen mit Ausrufezeichen Symbol links
   neben Suche aufblinken lassen"): zweiter, größerer Hinweis auf ungelesene Chat-Erwähnungen direkt
   im Kopfbereich neben der Suche - nutzt dieselbe whtk-mention-blink-Animation wie .chat-mention-dot
   oben, damit beide Indikatoren optisch im Gleichklang blinken. */
.mention-alert-icon {
  font-size: 20px; line-height: 1; margin-right: 10px; text-decoration: none; cursor: pointer;
  animation: whtk-mention-blink 1.1s ease-in-out infinite;
}

/* Von Stephan gewünscht (Rechnungssperre/Freigabe-Workflow, siehe routes/invoices.js): Zähler-Badge
   neben "Rechnungen" im Menü, nur für Admin/Buchhaltung sichtbar - zeigt die Anzahl offener
   Freigabe-Anfragen (invoices.freigabe_status = 'angefragt'), analog zum Blink-Punkt bei "Chat",
   aber als Zahl statt reinem Hinweispunkt, da hier mehrere Anfragen gleichzeitig offen sein können. */
.nav-count-badge {
  display: inline-block; min-width: 16px; padding: 0 4px; height: 16px; line-height: 16px;
  border-radius: 8px; background: #ef445b; color: #fff; font-size: 10px; font-weight: 700;
  text-align: center; margin-left: 6px; vertical-align: middle;
}

/* Von Stephan gewünscht ("Freigabe anfrage für Admin und buchhalter auch in der Rechnungsliste mit
   rotem Kreis und ausrufezeichen anzeigen lassen"): Zeilen-Indikator neben der Rechnungsnummer in
   views/invoices/list.ejs - bewusst statisch (kein Blinken) wie andere dauerhafte Status-Hinweise in
   Listen (z.B. row-overdue), da es sich um viele gleichzeitig sichtbare Zeilen statt eine einzelne
   Benachrichtigung handelt. */
.freigabe-alert-dot {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%; background: #ef445b; color: #fff;
  font-size: 11px; font-weight: 700; margin-left: 6px; vertical-align: middle;
}
@keyframes whtk-mention-blink {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.3; transform: scale(0.7); }
}

.photo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; margin-top: 10px; }
.photo-grid img { width: 100%; height: 110px; object-fit: cover; border-radius: var(--radius); border: 1px solid var(--border); }
.photo-item { position: relative; }
.photo-item form { position: absolute; top: 4px; right: 4px; margin: 0; }
.photo-item .photo-delete { background: rgba(255,255,255,0.9); }

.mobile-capture { max-width: 480px; margin: 0 auto; padding: 20px; }
.mobile-capture h1 { font-size: 1.2rem; }

/* Punkt 2 (Software-Liste Runde AF): Mini-Vorschau-Kacheln für Aufgaben-Dokumente (views/tasks/
   form.ejs) - kompakter als .photo-grid, da hier auch Nicht-Bild-Dateien (PDF etc.) mit generischem
   Symbol dargestellt werden müssen. */
.doc-mini-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); gap: 10px; margin-top: 4px; }
.doc-mini-item { border: 1px solid var(--border); border-radius: var(--radius); padding: 6px; text-align: center; }
.doc-mini-thumb { display: flex; align-items: center; justify-content: center; height: 70px; background: var(--bg); border-radius: 4px; overflow: hidden; margin-bottom: 6px; }
.doc-mini-thumb img { width: 100%; height: 100%; object-fit: cover; }
.doc-mini-icon { font-size: 1.8rem; }
.doc-mini-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 4px; }
.doc-mini-actions { display: flex; align-items: center; justify-content: center; gap: 8px; }
.doc-mini-actions form { margin: 0; }
.btn-icon-sm { border: none; background: none; cursor: pointer; color: var(--danger); font-size: 0.9rem; padding: 0; }
.camera-preview { width: 100%; border-radius: var(--radius); border: 1px solid var(--border); margin-bottom: 12px; background: #000; }

/* Sammelrechnung: Titelzeile (Auftrags-Betreff) über den Positionen eines Angebots */
.invoice-heading-row td {
  background: #e8e8e8;
  color: #111111;
  font-weight: 700;
  font-size: 0.85rem;
}
.invoice-heading-row:hover td { background: #e8e8e8; }

.totals-box { max-width: 320px; margin-left: auto; }
.totals-box .row { display: flex; justify-content: space-between; padding: 4px 0; font-size: 0.9rem; }
.totals-box .row.total { font-weight: 700; font-size: 1.05rem; border-top: 1px solid var(--border); padding-top: 8px; margin-top: 4px; }

/* Ausgaben-Übersicht (Lieferanten/Behörden-Detailseite): 3 Spalten - Gesamt / aktuelles Jahr /
   Vorjahr, siehe views/suppliers/show.ejs. */
.expenses-col { border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 14px; }
.expenses-col-title { font-size: 0.8rem; font-weight: 700; color: var(--text-muted); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.02em; }
.expenses-col-row { display: flex; justify-content: space-between; padding: 3px 0; font-size: 0.9rem; }

.muted { color: var(--text-muted); }
.text-right { text-align: right; }
.mt-0 { margin-top: 0; }
.small { font-size: 0.82rem; }

/* ============================================================
   "Auftrag für Halteverbot"-Fensteroptik, angelehnt an klassische
   Formularmasken (emis.halteverbot) – Titelleiste, hellblaue
   Kästen, Checklisten, kompakte Icon-Buttons, Korrespondenztabelle
   ============================================================ */

.hv-window {
  background: #e8e8e8;
  border: 1px solid #7f93b8;
  border-radius: 4px;
  padding: 0 0 14px;
  margin-bottom: 20px;
  box-shadow: 0 2px 10px rgba(30,50,90,0.12);
}
.hv-titlebar {
  background: linear-gradient(180deg, #818181, #575757);
  color: #fff;
  padding: 8px 14px;
  border-radius: 3px 3px 0 0;
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 0.95rem;
  font-weight: 600;
}
.hv-titlebar .hv-titlebar-fields {
  display: flex;
  gap: 16px;
  align-items: center;
  flex: 1;
  font-weight: 400;
  font-size: 0.78rem;
}
.hv-titlebar .hv-titlebar-fields label { color: #e3e3e3; text-transform: uppercase; font-size: 0.65rem; letter-spacing: 0.03em; display: block; margin-bottom: 2px; }
.hv-titlebar .hv-titlebar-fields input {
  background: #fff;
  border: 1px solid #111111;
  border-radius: 2px;
  padding: 3px 6px;
  font-size: 0.8rem;
  color: #111111;
}
.hv-body { padding: 12px 14px 0; }

.fieldset-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
  margin-bottom: 12px;
  align-items: start;
}
@media (max-width: 1100px) { .fieldset-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .fieldset-grid { grid-template-columns: 1fr; } }

.fieldset-box {
  border: 1px solid #97a9c8;
  border-radius: 3px;
  background: #f4f4f4;
  padding: 8px 10px 10px;
  margin: 0;
  min-width: 0;
}
.fieldset-box legend {
  font-size: 0.72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: #575757;
  padding: 0 6px;
  display: flex;
  align-items: center;
  gap: 6px;
}

/* Auftraggeber / Sachbearbeiter+Routenplanung / Behörde sollen gleich hoch sein, die Maßnahmen
   Details daneben aber NICHT mitgestreckt werden (von Stephan so verlangt). Deshalb liegen die
   ersten drei Spalten in einer eigenen Gruppe: innerhalb der Gruppe richten sie sich aneinander
   aus, nach außen zählt die Gruppe als eine Zelle. Die Spaltenbreiten bleiben exakt gleich, weil
   die Gruppe drei der vier Rasterspalten samt der beiden Abstände dazwischen einnimmt. */
.fieldset-dreiergruppe {
  grid-column: span 3;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  align-items: stretch;
  min-width: 0;
}
/* Die mittlere Spalte trägt zwei Kästen untereinander (Sachbearbeiter, Routenplanung). */
.fieldset-spalte { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.fieldset-spalte > .fieldset-box:first-child { flex: 1; }

@media (max-width: 1100px) {
  .fieldset-dreiergruppe { grid-column: span 2; grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 600px) {
  .fieldset-dreiergruppe { grid-column: span 1; grid-template-columns: 1fr; }
}

/* Logo statt Überschrift in der Routenplanungs-Kachel (von Stephan gewünscht: 20 px hoch). */
.xrouten-logo { height: 20px; width: auto; display: block; }
/* Gelber Knopf mit schwarzer Schrift (von Stephan für "Abbau in Xrouten einplanen" gewünscht). */
/* Das xRouten-Zeichen ersetzt in den drei Einplanen-Knöpfen das bisherige Kalender-Symbol
   (von Stephan mit der Bilddatei vorgegeben). */
.xrouten-knopf-icon { height: 14px; width: 14px; object-fit: contain; vertical-align: -2px; }
.btn-gelb { background: #f2c200; color: #1c1c1c; border-color: #d8ae00; }
.btn-gelb:hover { background: #dcb000; color: #1c1c1c; }
.hv-xrouten-status { font-size: 0.72rem; margin: 2px 0 4px; line-height: 1.35; }
.fieldset-box .form-row { margin-bottom: 6px; }
.fieldset-box label { font-size: 0.65rem; margin-bottom: 2px; color: #4c5f80; text-transform: uppercase; letter-spacing: 0.02em; }
.fieldset-box input,
.fieldset-box select,
.fieldset-box textarea {
  padding: 3px 6px;
  font-size: 0.78rem;
  border-radius: 2px;
  border: 1px solid #9fb0cc;
  background: #fff;
  box-shadow: inset 1px 1px 2px rgba(20,40,80,0.08);
}
.fieldset-box textarea { min-height: 40px; }
.fieldset-box .readonly-line { font-size: 0.78rem; margin-bottom: 6px; word-break: break-word; }
.fieldset-box .readonly-line strong { display: block; font-size: 0.82rem; }
.fieldset-actions { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 6px; }

/* Checklisten (angehakte Arbeitsschritte je Bereich) */
.hv-checklist { list-style: none; margin: 6px 0; padding: 0; border-top: 1px solid #d8d8d8; padding-top: 6px; }
.hv-checklist li { margin-bottom: 3px; }
.hv-checklist label {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: 0.72rem;
  text-transform: none;
  color: #33425e;
  cursor: pointer;
}
.hv-checklist input[type="checkbox"] { width: auto; box-shadow: none; margin: 0; }

/* Kleine quadratische Icon-Buttons statt großer Textbuttons */
.btn-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border-radius: 3px;
  border: 1px solid #9fb0cc;
  background: #fff;
  color: var(--primary);
  cursor: pointer;
  font-size: 0.8rem;
  text-decoration: none;
  line-height: 1;
}
.btn-icon:hover { background: var(--bg); text-decoration: none; }
/* Von Stephan gewünscht (Aufgabenstatus-Sortierung "einheitlich aussehen lassen"): deaktivierte
   Auf/Ab-Buttons (erster/letzter Status) bleiben sichtbar (feste Spaltenbreite/Ausrichtung),
   wirken aber klar unklickbar statt wie ein normaler Button. */
.btn-icon:disabled { opacity: 0.3; cursor: default; }
.btn-icon:disabled:hover { background: #fff; }
.btn-icon.btn-icon-accent { background: var(--accent); border-color: var(--accent); color: #fff; }
.btn-icon.btn-icon-danger { color: var(--danger); border-color: #f2bfc6; }

/* Von Stephan gewünscht ("Buttons anderster Anordnung, Spalte wird zu hoch"): mehrere Icon-Buttons
   in einer schmalen Tabellenspalte (z.B. Eingangsrechnungen-Zeile, siehe views/projects/show.ejs)
   sollen nebeneinander bleiben statt umzubrechen und dadurch die Zeile aufzublähen. */
.er-row-actions { display: flex; gap: 4px; justify-content: flex-end; flex-wrap: nowrap; white-space: nowrap; }

/* Gold-Buttons für PDF-Antrag / Negativlisten / Schildzettel etc. */
.btn-gold {
  display: inline-block;
  background: linear-gradient(180deg, #f6d382, #e0a83a);
  border: 1px solid #a97c22;
  color: #4a3510;
  font-size: 0.72rem;
  font-weight: 600;
  padding: 4px 9px;
  border-radius: 3px;
  cursor: pointer;
  text-decoration: none;
}
.btn-gold:hover { background: linear-gradient(180deg, #f8dc9c, #eab84f); text-decoration: none; }

/* Roter Knopf, der NICHTS mit Löschen zu tun hat (für "BAST in Xrouten einplanen").
   Wichtig: nicht .btn-danger verwenden - die Regel weiter unten blendet für Rollen ohne
   Löschrecht sämtliche .btn-danger aus, weil Rot dort für "Löschen" steht. Von Stephan gemeldet:
   "bei sachbearbeiter fehlt BAST in Xrouten einplanen?" - genau das war der Grund. */
.btn-rot { background: var(--danger); color: #fff; }
.btn-rot:hover { background: var(--danger); filter: brightness(1.08); color: #fff; }

/* Gleiche Form wie der goldene Knopf daneben, nur in Blau (von Stephan für "Online-Antrag"
   gewünscht: "Blauer Hintergrund und Form wie der Orangene"). */
.btn-blau {
  display: inline-block;
  background: linear-gradient(180deg, #969696, #575757);
  border: 1px solid #414141;
  color: #fff;
  font-size: 0.72rem;
  font-weight: 600;
  padding: 4px 9px;
  border-radius: 3px;
  cursor: pointer;
  text-decoration: none;
}
.btn-blau:hover { background: linear-gradient(180deg, #a4a4a4, #646464); color: #fff; text-decoration: none; }

/* Von Stephan vorgegeben ("BAST Online Antrag - Button Farbe Orange Verlauf"): gleiche Form und
   Größe wie der blaue HV-Knopf daneben, nur im orangen Verlauf - dieselbe Machart wie .btn-gold,
   damit die Knopfreihe einheitlich wirkt. */
.btn-orange {
  display: inline-block;
  background: linear-gradient(180deg, #ffb04a, #e81a35);
  border: 1px solid #b41026;
  color: #fff;
  font-size: 0.72rem;
  font-weight: 600;
  padding: 4px 9px;
  border-radius: 3px;
  text-decoration: none;
  line-height: 1.35;
}
.btn-orange:hover { background: linear-gradient(180deg, #ffc06a, #f28f26); color: #fff; text-decoration: none; }

/* Kompakte Tabelle für die Historie ("Tabelle der Korrespondenz") */
.table-compact th, .table-compact td { padding: 5px 8px; font-size: 0.8rem; }
.table-compact td.col-betreff { font-weight: 600; }
.table-compact td.col-inhalt { color: var(--text-muted); max-width: 420px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.corr-table { background: #fff; border: 1px solid #b9c2d0; border-radius: 3px; overflow: hidden; }
.corr-table th { background: #f4f4f4; color: #33425e; }

/* Von Stephan gewünscht ("Umsatzanzeige erstellen gemäß Bild"): Kategorie-x-Monat-Tabelle (14
   Spalten) braucht horizontales Scrollen auf schmalen Bildschirmen, siehe
   views/partials/dashboard-widgets/umsatzanzeige.ejs. */
.table-responsive { overflow-x: auto; }
.umsatz-tabelle { min-width: 900px; }
.umsatz-summenzeile { font-weight: 600; background: #f4f6fa; }
.umsatz-chart-titel { margin: 18px 0 10px; font-size: 0.95rem; }
/* Reines CSS-Balkendiagramm (bewusst ohne Chart.js/CDN, siehe Kommentar im Partial) für den
   Jahresvergleich 2024/2025/2026. */
.umsatz-chart { display: flex; align-items: flex-end; gap: 6px; height: 160px; padding: 0 4px; border-bottom: 1px solid var(--border); }
.umsatz-chart-monat { flex: 1; display: flex; flex-direction: column; align-items: center; height: 100%; justify-content: flex-end; }
.umsatz-chart-balken { display: flex; align-items: flex-end; gap: 2px; height: 100%; width: 100%; justify-content: center; }
.umsatz-chart-balken-jahr { width: 8px; min-height: 0; border-radius: 2px 2px 0 0; }
.umsatz-chart-jahr-0 { background: #b7c3d6; }
.umsatz-chart-jahr-1 { background: var(--primary-light); }
.umsatz-chart-jahr-2 { background: var(--accent); }
.umsatz-chart-label { font-size: 0.7rem; color: var(--text-muted); margin-top: 4px; }
.umsatz-chart-legende { display: flex; gap: 14px; margin-top: 8px; font-size: 0.8rem; color: var(--text-muted); }
.umsatz-chart-legende-eintrag { display: flex; align-items: center; gap: 5px; }
.umsatz-chart-legende-farbe { display: inline-block; width: 10px; height: 10px; border-radius: 2px; }

/* Historie / Verlauf */
.quick-actions {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
/* Bugfix (Software-Liste, "Erledigte Aufträge einklappbar"): eigener, per Klick auf-/zuklappbarer
   Bereich für archivierte ("erledigt") Aufträge unten in der Kundenauftragsliste. */
.customer-erledigt-details {
  margin-top: 14px;
  border-top: 1px solid var(--border);
  padding-top: 10px;
}
.customer-erledigt-summary {
  list-style: none;
  cursor: pointer;
  font-weight: 600;
  color: var(--text-muted, #6b7280);
  user-select: none;
}
.customer-erledigt-summary::-webkit-details-marker { display: none; }
.customer-erledigt-summary::before {
  content: '▶';
  display: inline-block;
  margin-right: 6px;
  font-size: 0.7em;
  transition: transform 0.15s ease;
}
.customer-erledigt-details[open] .customer-erledigt-summary::before {
  transform: rotate(90deg);
}
/* Von Stephan gewünscht (/kunden/149): "Aufträge/Baustellen"-Kachel auf der Kontaktseite auf 10
   sichtbare Zeilen begrenzen und darüber hinaus scrollen lassen statt die Karte beliebig lang
   werden zu lassen - Kopfzeile (~38px) + 10 Datenzeilen (~40px) ergibt die max-height unten. */
.customer-projects-scroll {
  max-height: 438px;
  overflow-y: auto;
}
/* Von Stephan gewünscht (/kunden/159): "Angebote"- und "Rechnungen"-Kacheln auf der Kontaktseite
   ebenso wie .customer-projects-scroll oben auf sichtbare Zeilen begrenzen und scrollbar machen -
   hier 8 Zeilen statt 10 (Kopfzeile ~38px + 8 Datenzeilen ~40px). */
.customer-list-scroll-8 {
  max-height: 358px;
  overflow-y: auto;
}
/* Von Stephan gewünscht (/suche?q=...): alle Ergebnis-Kacheln der Suchergebnisseite auf 5 sichtbare
   Zeilen begrenzen und darüber hinaus scrollbar machen (gleiches Muster wie
   .customer-projects-scroll/.customer-list-scroll-8 oben) - bei häufigen Suchbegriffen (z.B.
   Firmennamen, die in vielen Aufträgen/Rechnungen vorkommen) wurde die Seite sonst sehr lang.
   Etwas kompakter als die 8-Zeilen-Variante, da views/search.ejs' Tabellen ohne <thead> auskommen
   und .table-compact eine kleinere Zeilenhöhe hat (siehe .table-compact th/td padding). */
.search-result-scroll {
  max-height: 190px;
  overflow-y: auto;
}
/* Von Stephan gewünscht (/lieferanten/147): "Eingangsrechnungen"-Kachel auf der Lieferanten-/
   Behörden-Seite auf 20 sichtbare Zeilen begrenzen und scrollbar machen (gleiches Muster wie
   .customer-list-scroll-8 oben) - .table-compact-Zeilen sind mit ~38px etwas niedriger als normale
   Tabellenzeilen (40px), siehe Kommentar bei .search-result-scroll. Kopfzeile ~38px + 20 Datenzeilen
   ~38px. */
.supplier-purchase-invoices-scroll {
  max-height: 798px;
  overflow-y: auto;
}
/* Von Stephan gewünscht (/lieferanten/147): "Verwendung"-Kachel (zwei einfache Link-Listen statt
   einer Tabelle, daher EIN kartenweiter Scrollbereich statt je Liste) auf rund 10 sichtbare Zeilen
   begrenzt und scrollbar - <p class="small"> ist mit Standard-Absatzabstand etwas höher als eine
   Tabellenzeile, daher hier 40px je Zeile angesetzt (10 * 40px). */
.supplier-usage-scroll {
  max-height: 400px;
  overflow-y: auto;
}
.quick-actions details {
  position: relative;
}
.quick-actions summary {
  list-style: none;
  cursor: pointer;
}
.quick-actions summary::-webkit-details-marker { display: none; }
.quick-action-form {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: 20;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px;
  width: 340px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.12);
}

.timeline { display: flex; flex-direction: column; gap: 4px; }
.timeline-item {
  display: flex;
  gap: 12px;
  padding: 12px 4px;
  border-bottom: 1px solid var(--border);
}
.timeline-item:last-child { border-bottom: none; }
.timeline-icon {
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: var(--bg);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1rem;
}
.timeline-body { flex: 1; min-width: 0; }
.timeline-meta { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
.timeline-date { margin-left: auto; }
.timeline-subject { font-weight: 600; margin-top: 2px; }
.timeline-content { color: var(--text-muted); margin-top: 2px; white-space: pre-wrap; }
.timeline-item.type-system .timeline-subject,
.timeline-item.type-system .timeline-content { color: var(--text-muted); font-style: italic; }

/* ============================================================
   E-Mail-Ablage: eigenes Postfach durchsuchen und Nachrichten
   bei Aufträgen/Kunden/Lieferanten ablegen
   ============================================================ */
.mailbox-tabs { display: flex; flex-wrap: wrap; gap: 4px; border-bottom: 1px solid var(--border); margin-bottom: 16px; }
.mailbox-tab {
  padding: 8px 14px;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--text-muted);
  text-decoration: none;
  border-bottom: 2px solid transparent;
  white-space: nowrap;
}
.mailbox-tab:hover { color: var(--text); }
.mailbox-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
.mailbox-tab-add { color: var(--primary); opacity: 0.75; }
.mail-wrap { display: flex; gap: 16px; align-items: flex-start; }
.mail-list-pane { width: 340px; flex-shrink: 0; }
.mail-list-pane .form-row { margin-bottom: 8px; }
.mail-list {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--card);
  max-height: 70vh;
  overflow-y: auto;
}
.mail-item {
  padding: 10px 12px;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
}
.mail-item:last-child { border-bottom: none; }
.mail-item:hover { background: var(--bg); }
.mail-item.active { background: #ebebeb; }
.mail-item-from { font-weight: 600; font-size: 0.85rem; }
.mail-item-subject { font-size: 0.85rem; color: var(--text); margin-top: 2px; }
.mail-item-abgelegt { font-size: 0.8em; }
.mail-item-date { font-size: 0.75rem; color: var(--text-muted); margin-top: 2px; }
.mail-preview-pane { flex: 1; min-width: 0; }
.mail-preview-pane .card { max-height: 75vh; overflow-y: auto; }
.mail-body { font-size: 0.9rem; line-height: 1.5; word-wrap: break-word; }
.mail-body img { max-width: 100%; }

/* ============================================================
   Historie-Tab-Leiste (Neue Notiz / E-Mail / Brief / Anruf / Besuch / Mehr)
   ============================================================ */
.corr-tabs {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  margin-bottom: 20px;
  background: #fff;
}
.corr-tabs-header {
  background: #f0ede8;
  padding: 8px 16px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.corr-tabs-title { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: #57534e; display: flex; align-items: center; gap: 6px; }
.corr-tabs-icons { color: #78716c; font-size: 0.9rem; display: flex; gap: 10px; }
.corr-tabs-nav {
  display: flex;
  border-bottom: 1px solid var(--border);
  overflow-x: auto;
}
.corr-tab {
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  padding: 12px 20px;
  font-size: 0.78rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: #57534e;
  cursor: pointer;
  white-space: nowrap;
}
.corr-tab:hover { color: var(--primary); }
.corr-tab.active { color: var(--primary-light); border-bottom-color: var(--primary-light); }
.corr-panel { padding: 18px 20px; }
.corr-panel.hidden { display: none; }
/* !important, da diese Utility-Klasse jede andere display-Regel überstimmen soll, egal ob sie
   im Stylesheet vorher oder nachher deklariert wird (z.B. Overlays, die selbst "display: flex"
   setzen und sonst - bei gleicher CSS-Spezifität - je nach Reihenfolge im Stylesheet gewinnen
   und das Element trotz "hidden"-Klasse sichtbar lassen würden). */
.hidden { display: none !important; }
.corr-row-clickable { cursor: pointer; }
.corr-row-clickable:hover { background: var(--hover, rgba(0,0,0,0.03)); }
.mail-view-overlay {
  position: fixed; inset: 0; background: rgba(10,15,30,0.45);
  display: flex; align-items: center; justify-content: center; z-index: 200;
}
.mail-view-box {
  background: var(--card); border-radius: var(--radius); padding: 24px;
  width: 100%; max-width: 640px; max-height: 80vh; overflow-y: auto;
  box-shadow: 0 12px 40px rgba(0,0,0,0.25);
  overscroll-behavior: contain;
}
.mail-view-box .mail-view-meta { color: var(--muted, #667); font-size: 0.85rem; margin-bottom: 4px; }
.mail-view-box .mail-view-subject { font-weight: 600; font-size: 1.05rem; margin: 4px 0 14px; }
.mail-view-box .mail-view-body { white-space: pre-wrap; line-height: 1.5; border-top: 1px solid var(--border, #e2e2e2); padding-top: 14px; }

.corr-field { margin-bottom: 18px; }
.corr-field label { display: block; font-size: 0.75rem; color: var(--text-muted); margin-bottom: 4px; }
.corr-field input[type="text"],
.corr-field input[type="email"],
.corr-field select,
.corr-field textarea {
  width: 100%;
  border: none;
  border-bottom: 1px solid var(--border);
  border-radius: 0;
  padding: 6px 2px;
  background: transparent;
  box-shadow: none;
}
.corr-field input[type="text"]:focus,
.corr-field input[type="email"]:focus,
.corr-field textarea:focus { outline: none; border-bottom-color: var(--primary-light); }
.corr-field-row { display: flex; align-items: center; gap: 10px; }
.corr-field-row .corr-field { flex: 1; margin-bottom: 0; }
.corr-links { display: flex; gap: 14px; }
.corr-links a { font-size: 0.78rem; color: var(--text-muted); cursor: pointer; }
.corr-links a:hover { color: var(--primary); text-decoration: underline; }

.corr-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 4px; }
.corr-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: #f4f4f4;
  color: var(--primary);
  border-radius: 100px;
  padding: 3px 6px 3px 10px;
  font-size: 0.8rem;
}
.corr-chip button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 0.8rem;
  line-height: 1;
  padding: 2px;
}

/* Gruppen-Chip-Auswahl (Mitarbeiter -> mehrere Rollen/Gruppen, siehe views/users/form.ejs) */
.chip-toggle-wrap { display: inline-block; }
.chip-toggle {
  display: inline-flex;
  align-items: center;
  background: #f4f4f4;
  color: var(--primary);
  border: 1px solid #e9e9e9;
  border-radius: 100px;
  padding: 5px 14px;
  font-size: 0.82rem;
  cursor: pointer;
  user-select: none;
}
.chip-toggle-wrap input:checked + .chip-toggle {
  background: var(--primary);
  color: #fff;
  border-color: var(--primary);
}
.chip-toggle-group { display: flex; flex-wrap: wrap; gap: 8px; }

.override-table select { width: auto; min-width: 130px; }
.override-table td, .override-table th { padding: 6px 10px; }

/* Bedienleiste der Rich-Text-Editoren. Von Stephan gewünscht ("Überall wo das Fenster ist,
   gleichmäßig einfügen"): das Markup kommt aus dem gemeinsamen Partial
   views/partials/rich-toolbar.ejs, die Logik aus public/js/rich-editor.js - dieses CSS gilt damit
   für alle fünf Stellen (Auftrag, Aufgabe, Deal, E-Mail-Ablage, Postfach-Signatur).
   flex-wrap, damit die jetzt längere Leiste in schmalen Fenstern (E-Mail-Ablage-Popup) umbricht
   statt über den Rand zu laufen. */
.corr-editor-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px;
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
  margin-bottom: 10px;
}
.corr-editor-toolbar button {
  background: none;
  border: none;
  width: 28px;
  height: 28px;
  border-radius: 3px;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 0.85rem;
  padding: 0;
  flex-shrink: 0;
}
.corr-editor-toolbar button:hover { background: var(--bg); color: var(--text); }
/* Knopf mit längerer Beschriftung ({{BEARBEITER}} in der Signatur) darf breiter werden. */
.corr-editor-toolbar button.corr-editor-breit { width: auto; padding: 0 8px; font-size: 0.72rem; }
.corr-editor-toolbar .corr-editor-groesse { width: auto; height: 28px; padding: 0 4px; font-size: 0.78rem; }
/* Gezeichnete Symbole in der Leiste (Ausrichtung) - nehmen die Farbe des Knopfes an, siehe
   Bugfix-Kommentar in views/partials/rich-toolbar.ejs. */
.corr-editor-toolbar .rt-sym { width: 14px; height: 14px; fill: currentColor; display: block; margin: 0 auto; }
/* Senkrechter Strich zwischen den Gruppen (Schrift / Ausrichtung / Listen / Einfügen). */
.corr-editor-trenner {
  width: 1px;
  align-self: stretch;
  margin: 2px 3px;
  background: var(--border);
  flex-shrink: 0;
}
/* Farbknopf: "A" mit farbigem Balken darunter, damit er sich von den übrigen abhebt. */
.rich-farb-knopf .rich-farb-buchstabe {
  display: inline-block;
  font-weight: 700;
  line-height: 1;
  border-bottom: 3px solid var(--accent);
  padding-bottom: 1px;
}

/* Auswahlfenster für die Schriftfarbe (siehe richEditorFarbFenster in public/js/rich-editor.js).
   Von Stephan verlangt: eine richtige Farbpalette - Farbfeld (Sättigung waagerecht, Helligkeit
   senkrecht) mit Farbtonleiste daneben, dazu Vorschau, Hex-Eingabe und ein paar Standardfarben.
   Hängt direkt am <body> und wird per JavaScript am Knopf ausgerichtet, dadurch kann es auch aus
   Popups heraus nicht abgeschnitten werden. z-index über den Modal-Ebenen (100/130). */
.rich-farb-fenster {
  position: absolute;
  z-index: 200;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 12px 34px rgba(0, 0, 0, 0.22);
  padding: 10px;
  width: 262px;
}
.rich-farb-oben { display: flex; gap: 8px; margin-bottom: 9px; }
/* Farbfeld: Grundfarbe wird per JavaScript gesetzt (Farbton), darüber liegen zwei Verläufe -
   von links nach rechts weiß -> durchsichtig (Sättigung) und von unten nach oben schwarz ->
   durchsichtig (Helligkeit). */
.rich-farb-flaeche {
  position: relative;
  flex: 1;
  height: 152px;
  border: 1px solid var(--border);
  border-radius: 4px;
  cursor: crosshair;
  touch-action: none;
}
.rich-farb-marke {
  position: absolute;
  width: 12px; height: 12px;
  margin: -6px 0 0 -6px;
  border: 2px solid #fff;
  border-radius: 50%;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.55);
  pointer-events: none;
}
.rich-farb-ton {
  position: relative;
  width: 22px;
  height: 152px;
  flex-shrink: 0;
  border: 1px solid var(--border);
  border-radius: 4px;
  cursor: pointer;
  touch-action: none;
  /* Wichtig: Die Reihenfolge muss GENAU der Berechnung in rich-editor.js entsprechen
     (Farbton = Position von oben nach unten x 360 Grad), sonst zeigt die Leiste eine andere Farbe
     an, als beim Klick herauskommt. Also aufsteigend: Rot 0, Gelb 60, Grün 120, Türkis 180,
     Blau 240, Magenta 300, Rot 360. */
  background: linear-gradient(to bottom,
    #ff0022 0%, #ffff00 16.667%, #00ff00 33.333%, #00ffff 50%,
    #808080 66.667%, #ff00ff 83.333%, #ff0022 100%);
}
.rich-farb-tonmarke {
  position: absolute;
  left: -3px; right: -3px;
  height: 6px;
  margin-top: -3px;
  border: 2px solid #fff;
  border-radius: 3px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.55);
  pointer-events: none;
}
.rich-farb-zeile { display: flex; gap: 6px; align-items: center; }
.rich-farb-vorschau {
  width: 30px; height: 30px; flex-shrink: 0;
  border: 1px solid var(--border); border-radius: 4px;
}
.rich-farb-hex {
  flex: 1; min-width: 0; height: 30px; padding: 0 7px; font-size: 0.8rem;
  border: 1px solid var(--border); border-radius: 4px; font-family: inherit;
}
.rich-farb-hex-fehler { border-color: var(--danger); background: #fdeaed; }
.rich-farb-zeile .btn { flex-shrink: 0; padding: 5px 9px; font-size: 0.75rem; }
.rich-farb-standard { display: flex; gap: 5px; margin-top: 9px; }
.rich-farb-feld {
  flex: 1; height: 18px; padding: 0;
  border: 1px solid var(--border); border-radius: 3px; cursor: pointer;
}
.rich-farb-feld:hover { outline: 2px solid var(--primary-light); outline-offset: 1px; }

.corr-editor-body {
  min-height: 140px;
  padding: 4px 2px;
  font-size: 0.92rem;
  /* Von Stephan gemeldet ("die Zeilenhöhe von Text zu Text ist viel zu weit auseinander"):
     1,5 war für Fließtext zu luftig, jetzt 1,35 - dasselbe Maß, das auch E-Mail-Programme
     üblicherweise verwenden. */
  line-height: 1.35;
  outline: none;
}
/* Der eigentliche Grund für die großen Lücken: Browser setzen um JEDEN Absatz einen Leerraum von
   einer Zeilenhöhe - oben UND unten. Bei einer Signatur aus vielen kurzen Absätzen (Firma, Straße,
   Ort, Telefon ...) klaffen dadurch Lücken, als wäre überall eine Leerzeile. Absätze bekommen
   deshalb nur noch einen kleinen Abstand nach unten; die vom Editor selbst erzeugten <div>-Zeilen
   (jede neue Zeile per Enter) stehen ohnehin dicht. */
.corr-editor-body p { margin: 0 0 5px; }
.corr-editor-body p:last-child { margin-bottom: 0; }
.corr-editor-body div { margin: 0; }
.corr-editor-body li { margin: 0; }
.corr-editor-body:empty:before { content: attr(data-placeholder); color: #9ca3af; }

/* Von Stephan gewünscht ("Aufgaben System anpassen. 3 Blöcke: Genehmigung, Dispo, Buchhaltung.
   Die Blöcke sollen farblich hinterlegt werden #ff9500. Die Blöcke haben alle feste Breiten. Die
   Aufgaben kompakter anzeigen lassen ... die Blöcke können 5 Aufgaben anzeigen."):
   Feste Breite je Block, orange hinterlegte Kopfzeile, Inhalt genau 5 Zeilen hoch - darüber hinaus
   wird INNERHALB des Blocks gescrollt, damit keine Aufgabe verschwindet. "Allgemein" ist der vierte
   Block für den Altbestand (siehe utils/aufgabenKategorien.js). */
/* Von Stephan vorgegeben ("die 4 Blöcke verteilt im Browserfenster sein aber feste Breiten"):
   die Blöcke verteilen sich über die volle Breite und sind dabei alle exakt gleich breit. Die
   Spalten INNERHALB einer Zeile haben feste Breiten (siehe .task-row.task-row-kompakt weiter unten), damit
   sich nichts verschiebt, sobald eine Deadline dazukommt. */
.aufgaben-bloecke { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; align-items: start; }
@media (max-width: 1500px) { .aufgaben-bloecke { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 800px) { .aufgaben-bloecke { grid-template-columns: minmax(0, 1fr); } }
.aufgaben-block {
  min-width: 0;
  border: 1px solid #e8c48f;
  border-radius: var(--radius);
  background: #fff;
  overflow: hidden;
}
.aufgaben-block-kopf {
  background: #ff9500;
  color: #fff;
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  padding: 7px 10px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.aufgaben-block-anzahl {
  background: rgba(255,255,255,0.35);
  border-radius: 20px;
  padding: 1px 8px;
  font-size: 0.72rem;
  font-weight: 700;
}
/* Genau 5 kompakte Zeilen hoch (5 x 46 px + Innenabstand), danach Rollbalken im Block. */
/* Genau 5 flache Zeilen hoch (5 x 30 px inkl. Abstand), danach Rollbalken im Block. */
/* Genau 5 flache Zeilen hoch (5 x 28 px inkl. Abstand), danach Rollbalken im Block. */
/* Genau 5 Zeilen sichtbar: 5 x (36 px Zeile + 3 px Abstand) + Innenabstand. */
/* Genau 5 Zeilen sichtbar: 5 x (43 px Zeile + 3 px Abstand) + Innenabstand. */
.aufgaben-block-inhalt { max-height: 238px; overflow-y: auto; padding: 4px; }
.aufgaben-block-leer { margin: 6px 4px; }
/* Die Popups (Zuweisen, Deadline, Status, ⋮-Menü) schweben wie überall sonst über der Seite -
   Bugfix zu Stephans Meldung "Menü ist immer noch zu hoch": vorher standen sie fest im Block und
   haben ihn beim Aufklappen in die Höhe gezogen. Damit der Rollbalken des Blocks sie nicht
   abschneidet, macht der Block seinen Überlauf sichtbar, solange ein Popup offen ist. */
.aufgaben-block:has(details[open]) { overflow: visible; }
.aufgaben-block-inhalt:has(details[open]) { overflow: visible; }
.aufgaben-block .status-picker-menu { min-width: 190px; }
/* Kompaktes Menü: schmalere Einträge als in der normalen Liste. */
.aufgaben-block .status-picker-menu button,
.aufgaben-block .status-picker-menu a { padding: 5px 9px; font-size: 0.78rem; }
/* Kompakte Zeile - von Stephan vorgegeben ("Logischerweise musst du alles anpassen wenn du es
   kompakter machst ... die Spalten brauchen feste Breiten, da wenn Deadline-Datum hinzukommt
   wieder alles verschiebt"): feste Spaltenbreiten für Benutzer, Deadline und Menü, der Titel nimmt
   den Rest und wird bei Bedarf mit … abgekürzt. Dadurch stehen die Spalten in allen Zeilen exakt
   untereinander, egal ob eine Deadline gesetzt ist oder nicht. */
.task-row.task-row-kompakt {
  display: flex;
  align-items: center;
  gap: 8px;
  /* Von Stephan gemeldet ("die Höhe der Aufgabe ist viel viel viel zu hoch"): flache Zeile, die
     Deadline steht einzeilig nur als Datum (die Beschriftung "Deadline" entfällt hier). */
  /* Von Stephan in Pixeln vorgegeben: Zeilenhöhe 43 px, Schrift 12 px. */
  padding: 0 8px;
  min-height: 43px;
  font-size: 12px;
  line-height: 1.3;
}
/* Der Titelbereich ist das einzige Element, das mitwächst und schrumpft. */
.task-row.task-row-kompakt > div:not(.task-row-right) { min-width: 0; overflow: hidden; }
.task-row.task-row-kompakt .task-title {
  display: block;
  font-size: 12px;
  line-height: 1.3;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.task-row.task-row-kompakt .small.muted { font-size: 0.68rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; }
/* Feste Spalten: Benutzer 26 px, Deadline 62 px, Menü 24 px. */
.task-row.task-row-kompakt .task-row-right {
  display: grid;
  grid-template-columns: 28px 56px 66px 24px;
  align-items: center;
  gap: 6px;
  flex: none;
}
.task-row.task-row-kompakt .task-avatar { width: 28px; height: 28px; font-size: 0.7rem; }
.task-row.task-row-kompakt .task-deadline {
  font-size: 10px;
  line-height: 1.2;
  min-width: 0;
  width: 54px;
  text-align: right;
  white-space: nowrap;
}
/* Von Stephan gemeldet ("Mache den Menüpunkt kleiner, der Hintergrund wurde von dir entfernt"):
   das ⋮ ist jetzt kleiner UND hat wieder sein weißes Kästchen mit Rahmen wie überall sonst. */
.task-row.task-row-kompakt .btn-icon {
  width: 22px;
  height: 22px;
  font-size: 0.9rem;
  line-height: 1;
  background: transparent;
  border: 1px solid transparent;
  color: var(--text-muted);
  border-radius: 3px;
  padding: 0;
}
/* Kästchen erst beim Überfahren - so bleibt die Zeile flach und das ⋮ trotzdem erkennbar. */
.task-row.task-row-kompakt .btn-icon:hover { background: #fff; border-color: #9fb0cc; color: var(--primary); }
/* Von Stephan gewünscht ("die Aufgaben sollen einen helleren Hintergrund erhalten wie der
   Haupthintergrund"): jede Aufgabenzeile liegt als eigene helle Karte im Block - heller als der
   Seitenhintergrund (#f0ede7), damit sich die Zeilen klar voneinander abheben. */
.aufgaben-block-inhalt .task-row.task-row-kompakt {
  background: #faf8f4;
  border: 1px solid #ece7de;
  border-top: 1px solid #ece7de;
  border-radius: 5px;
  margin-bottom: 3px;
}
.aufgaben-block-inhalt .task-row.task-row-kompakt:last-child { margin-bottom: 0; }
/* Von Stephan gemeldet ("Status ist weg"): der Status steht wieder in der Zeile - als schmaler
   Knopf mit FESTER Breite (60 px), damit sich beim Umschalten nichts verschiebt. Längere
   Statusnamen werden abgeschnitten, der volle Name steht im Tooltip. */
.task-row.task-row-kompakt .task-status-picker { display: block; min-width: 0; }
.task-row.task-row-kompakt .task-status-picker summary { display: block; }
/* Von Stephan vorgegeben: das Statusfeld ist 33 px hoch. Breite bleibt fest, damit sich beim
   Umschalten nichts verschiebt. */
.task-row.task-row-kompakt .task-status-picker summary .badge {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 66px;
  height: 33px;
  padding: 0 4px;
  font-size: 10px;
  line-height: 1.2;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.task-row.task-row-kompakt .status-picker-caret { display: none; }
/* Punkt links zeigt die Statusfarbe und bleibt anklickbar (öffnet dieselbe Statusauswahl). */
.task-row.task-row-kompakt .task-bullet { width: 9px; height: 9px; border-width: 2px; flex: none; }
.task-row.task-row-kompakt .kompakt-status { display: inline-block; }
.task-row.task-row-kompakt .kompakt-status summary { list-style: none; cursor: pointer; }
.task-row.task-row-kompakt .kompakt-status-punkt {
  display: block;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  border: 2px solid #b7c0d1;
}

/* Von Stephan gewünscht ("Karteikartensystem einbauen (über Kalkulation und unter Status)"):
   Reiterleiste auf der Auftragsseite. Logik: public/js/karteikarten.js */
.karten-reiter {
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
  margin: 0 0 16px;
  border-bottom: 2px solid var(--border);
}
.karten-reiter-knopf {
  background: none;
  border: none;
  border-bottom: 3px solid transparent;
  margin-bottom: -2px;
  padding: 9px 18px;
  font-size: 0.86rem;
  font-weight: 600;
  color: var(--text-muted);
  cursor: pointer;
  border-radius: var(--radius) var(--radius) 0 0;
}
.karten-reiter-knopf:hover { background: rgba(0,0,0,0.04); color: var(--text); }
.karten-reiter-knopf.aktiv { color: var(--primary); border-bottom-color: var(--accent); background: #fff; }

/* Von Stephan gewünscht: Kalkulation sowie Angebote, Dokumente und die Nachbarblöcke kompakter -
   weniger Innenabstand, engere Zeilen, etwas kleinere Schrift. Inhaltlich bleibt alles sichtbar,
   die Seite wird dadurch deutlich kürzer. */
#kalkulation { padding: 12px 14px; }
#kalkulation .grid-4 { gap: 10px; }
#kalkulation .stat-card { padding: 10px 12px; }
#kalkulation .stat-card .label { font-size: 0.76rem; }
#kalkulation .stat-card .value { font-size: 1.25rem; }
.bloecke-kompakt .card { padding: 12px 14px; }
.bloecke-kompakt .card h3 { font-size: 0.95rem; margin-bottom: 8px; }
.bloecke-kompakt td, .bloecke-kompakt th { padding: 5px 6px; font-size: 0.82rem; }
.bloecke-kompakt p { margin: 4px 0; }

/* Monatsübersicht im Reiter "Kalender" - zeigt nur die Termine dieses Auftrags. */
.monat-wochentage { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-bottom: 4px; }
.monat-wochentage span { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.03em;
  color: var(--text-muted); text-align: center; font-weight: 600; }
.monat-gitter { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.monat-tag { min-height: 74px; border: 1px solid var(--border); border-radius: 6px; padding: 4px 5px;
  background: #fff; display: flex; flex-direction: column; gap: 2px; }
.monat-tag-leer { background: transparent; border-color: transparent; }
.monat-tag-zahl { font-size: 0.75rem; color: var(--text-muted); font-weight: 600; }
.monat-tag.ist-heute { border-color: var(--accent); }
.monat-tag.ist-heute .monat-tag-zahl { color: var(--accent-dark); }
.monat-tag.hat-termin { background: #f4f4f4; }
.monat-termin { font-size: 0.7rem; line-height: 1.25; background: var(--primary); color: #fff;
  border-radius: 4px; padding: 2px 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* E-Mail-Kachel: zugeklappte Kopfzeile sowie die zweispaltige Aufteilung "Schreiben | So wird
   gesendet". Von Stephan vorgegeben: links der Schreibbereich OHNE Signatur, rechts grau
   hinterlegt die fertige Mail MIT Signatur, feste Höhe mit eigenem Rollbalken - damit die Signatur
   die Seite weder in die Breite noch in die Höhe zieht. Logik: public/js/mail-kachel.js. */
/* Von Stephan vorgegeben: "Überschrift E-Mail wo ich es aufklappen kann, bitte blauen Hintergrund
   hinterlegen, da der Header im Fenster untergeht. Schriftgröße E-Mail größer machen 14 Pixel.
   Mail-Symbol an Schriftgröße anpassen." - der Kopf hebt sich damit klar vom Rest ab. */
.mail-kachel-kopf { cursor: pointer; user-select: none; background: #646464; }
.mail-kachel-kopf .corr-tabs-title { color: #fff; font-size: 14px; text-transform: none;
  letter-spacing: 0; line-height: 1.2; }
.mail-kachel-kopf .corr-tabs-icons { color: #fff; }
.mail-kachel-kopf .btn-icon { color: #fff; }
.mail-kachel-pfeil { font-size: 14px; color: #e0e0e0; margin-right: 2px; }
/* Von Stephan vorgegeben: neben "E-Mail" kursiv in Grau der Hinweis "Zum Schreiben bitte klicken !" */
.mail-kachel-hinweis { font-size: 12px; font-style: italic; font-weight: 400; color: #c3cdd8;
  text-transform: none; letter-spacing: 0; margin-left: 4px; }

/* Zwei Kacheln nebeneinander: links das vollständige Formular, rechts die Vorschau - beide
   gleich hoch (align-items: stretch + flex:1 auf der Vorschau). */
.mail-spalten { display: flex; gap: 16px; align-items: stretch; }
/* Von Stephan vorgegeben: beide Kacheln gleich groß - gleiche Breite (je die Hälfte) und durch
   align-items: stretch oben auch gleiche Höhe. */
.mail-spalte-schreiben { flex: 1 1 0; min-width: 0; }
.mail-spalte-vorschau { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; }
.mail-spalte-schreiben .corr-editor-body { min-height: 220px; }
.mail-vorschau {
  flex: 1;
  background: #f4f2ee;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 12px;
  overflow-y: auto;
  font-size: 0.82rem;
  line-height: 1.35;
  color: var(--text);
}
.mail-vorschau p { margin: 0 0 5px; }
.mail-vorschau div { margin: 0; }
.mail-vorschau img { max-width: 100%; height: auto; }
/* Auf schmalen Fenstern untereinander statt nebeneinander. */
@media (max-width: 1100px) {
  .mail-spalten { display: block; }
  .mail-spalte-vorschau { margin-top: 14px; }
  .mail-vorschau { height: 240px; }
}
/* Eingefügte Bilder nie breiter als der Schreibbereich (zusätzlich zur Begrenzung direkt am Bild,
   siehe richEditorInsertImage) - greift auch für per Copy & Paste eingefügte Bilder. */
.corr-editor-body img { max-width: 100%; height: auto; }
.corr-editor-body table { border-collapse: collapse; }
.corr-editor-body ul, .corr-editor-body ol { padding-left: 24px; margin: 6px 0; }

/* Punkt (Software-Liste): kleine Vorschau-Chips (Dokument-Icon + Dateiname) für Mail-Anhänge im
   E-Mail-Fenster (Angebot/Label/Antrag automatisch + manuell hochgeladene Dateien), siehe
   #emailAttachmentPreview in views/projects/show.ejs und views/deals/show.ejs. */
.email-attachment-preview { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.email-attachment-chip {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 5px 10px 5px 6px;
  background: #fafafa;
  border: 1px solid #e2e8f0;
  border-radius: 7px;
  font-size: 0.78rem;
  color: #374151;
  max-width: 240px;
}
.email-attachment-chip span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Bugfix (Software-Liste, "Mail-Anhang anklickbar machen"): Chip ist jetzt anklickbar und öffnet
   die PDF-Vorschau (window.openPdfViewer(), siehe partials/nav.ejs) - siehe renderAttachmentPreview()
   in views/projects/show.ejs bzw. views/deals/show.ejs. */
.email-attachment-chip.clickable { cursor: pointer; }
.email-attachment-chip.clickable:hover { background: #f6f6f6; border-color: #e2e2e2; }

.corr-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 14px;
}
.corr-actions-left { display: flex; gap: 10px; }
.corr-actions-right { display: flex; gap: 12px; color: var(--text-muted); font-size: 0.95rem; }

.ablegen-overlay {
  position: fixed; inset: 0; background: rgba(10,15,30,0.45);
  display: flex; align-items: center; justify-content: center; z-index: 200;
}
.ablegen-box {
  background: var(--card); border-radius: var(--radius); padding: 24px;
  width: 100%; max-width: 420px; box-shadow: 0 12px 40px rgba(0,0,0,0.25);
  max-height: 90vh; overflow-y: auto; overscroll-behavior: contain;
}

/* Punkte 1+4 (Software-Liste Runde AD): einheitliche dunkle Titelleiste für ALLE E-Mail-Ablage-
   Dialoge/Popups (Ablegen, Antworten/Schreiben in .ablegen-box, sowie der äußere iframe-Wrapper
   .modal-box in partials/email-ablage-modal.ejs) - macht das Ablage-System optisch einheitlich und
   gibt jedem dieser Dialoge einen klar sichtbaren Schließen-Button in der Titelleiste, statt ihn nur
   unten im Formular zu verstecken. Negative Margins lassen die Leiste bis an die abgerundeten Ecken
   der jeweiligen Box heranreichen (Box selbst hat padding:24px bzw. 0, siehe .ablegen-box/.modal-box).
   -mb (margin-bottom) wird pro Einsatzort passend gesetzt (siehe inline style im jeweiligen Dialog). */
.dialog-header-bar {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  background: var(--primary); color: #fff;
  padding: 14px 20px; margin: -24px -24px 18px -24px;
  border-radius: var(--radius) var(--radius) 0 0;
}
.dialog-header-bar h3 { margin: 0; color: #fff; font-size: 1.05rem; }
.dialog-header-bar .btn-icon { color: #fff; border-color: rgba(255,255,255,0.4); }
.dialog-header-bar .btn-icon:hover { background: rgba(255,255,255,0.18); }
.dialog-header-bar .btn-sm.btn-secondary { background: rgba(255,255,255,0.15); color: #fff; border-color: rgba(255,255,255,0.4); }
.dialog-header-bar .btn-sm.btn-secondary:hover { background: rgba(255,255,255,0.28); }
.dialog-header-bar-actions { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }

/* Punkt 5 (Software-Liste Runde AD): Aufgaben-Übersicht mit Schnellfilter-Sidebar + Suche +
   Sortierung, angelehnt an den mitgeschickten Referenz-Screenshot. */
.aufgaben-layout { display: flex; gap: 20px; align-items: flex-start; }
.aufgaben-filter-sidebar {
  width: 230px; flex-shrink: 0; background: var(--card-bg, #fff);
  border: 1px solid var(--border); border-radius: var(--radius); padding: 14px;
}
.aufgaben-filter-sidebar h4 { margin: 0 0 8px; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--muted); }
.aufgaben-filter-sidebar .filter-group { margin-bottom: 16px; }
.aufgaben-filter-sidebar .filter-group:last-child { margin-bottom: 0; }
.aufgaben-filter-link {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 6px 8px; border-radius: 6px; color: var(--text, #222); text-decoration: none; font-size: 0.92rem;
}
.aufgaben-filter-link:hover { background: var(--hover-bg, #f2f4f7); text-decoration: none; }
.aufgaben-filter-link.active { background: var(--primary); color: #fff; font-weight: 600; }
.aufgaben-filter-link .count { font-size: 0.8rem; opacity: 0.75; }
.aufgaben-filter-badge { font-size: 0.78rem; padding: 3px 9px; }
.aufgaben-main { flex: 1; min-width: 0; }
.aufgaben-toolbar { display: flex; gap: 10px; align-items: center; margin-bottom: 14px; flex-wrap: wrap; }
.aufgaben-toolbar input[type="search"] { flex: 1; min-width: 200px; }
.aufgaben-toolbar select { width: auto; }
@media (max-width: 800px) {
  .aufgaben-layout { flex-direction: column; }
  .aufgaben-filter-sidebar { width: 100%; }
}
@media (max-width: 900px) {
  .mail-wrap { flex-direction: column; }
  .mail-list-pane { width: 100%; }
}

/* Punkt 1 (Software-Liste Runde AC): Antworten-Dialog (siehe views/emailAblage/index.ejs
   #composeOverlay) - beim Antworten deutlich breiter (statt der schmalen 420-560px Standard-
   Dialogbreite) und zweispaltig, damit die vorangegangene E-Mail direkt daneben lesbar ist, ohne
   den Antwort-Dialog zu verlassen. Beim "Neu schreiben" (kein Bezug zu einer vorherigen Nachricht)
   bleibt die schmale, einspaltige Standardbreite bestehen (Klasse .compose-box-reply wird dafür
   nicht gesetzt, siehe JS openCompose()/openComposeReply()). */
.compose-box {
  background: var(--card); border-radius: var(--radius); padding: 24px;
  width: 100%; max-width: 640px; max-height: 90vh; overflow-y: auto;
  box-shadow: 0 12px 40px rgba(0,0,0,0.25);
  /* Punkt 1 (Software-Liste Runde AE): verhindert, dass zu Ende gescrollter Dialog-Inhalt den
     Mausrad-Scroll an die Seite im Hintergrund "durchreicht" (Scroll-Chaining) - siehe ausführliche
     Erklärung bei .artikel-overlay weiter unten. */
  overscroll-behavior: contain;
}
.compose-box-reply { max-width: 1300px; width: 92vw; }
.compose-layout { display: flex; gap: 26px; align-items: flex-start; }
.compose-layout-main { flex: 1 1 55%; min-width: 0; }
.compose-layout-prev {
  flex: 1 1 45%; min-width: 0; max-height: 80vh; overflow-y: auto;
  border-left: 1px solid var(--border); padding-left: 22px;
  overscroll-behavior: contain;
}
.compose-prev-header { margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
.compose-prev-header h4 { margin: 0 0 4px; }
@media (max-width: 1050px) {
  .compose-layout { flex-direction: column; }
  .compose-layout-prev {
    border-left: none; border-top: 1px solid var(--border);
    padding-left: 0; padding-top: 16px; margin-top: 16px; max-height: 40vh;
  }
  .compose-box-reply { width: 96vw; }
}

/* Artikel-Suchen-Dialog (Angebotserstellung) */
.artikel-overlay {
  position: fixed; inset: 0; background: rgba(10,15,30,0.45);
  display: flex; align-items: flex-start; justify-content: center; z-index: 300;
  overflow-y: auto; padding: 40px 16px;
  /* Punkt 1 (Software-Liste Runde AE): Der Artikel-Suchen-Dialog ist bei vielen Suchergebnissen
     bzw. Warengruppen höher als der sichtbare Bereich - ohne "overscroll-behavior: contain" reicht
     der Browser das Mausrad-Scrollen, sobald der Dialog (bzw. die Artikelliste darin) sein Ende
     erreicht hat, an die Seite dahinter weiter ("Scroll-Chaining"), wodurch es so aussieht, als sei
     der Dialog selbst gar nicht scrollbar. "contain" beendet das Scrollen am Dialogrand, statt es
     an den Hintergrund weiterzugeben. Aus demselben Grund auch bei .artikel-list, .modal-overlay,
     .ablegen-box, .mail-view-box und .compose-box/.compose-layout-prev ergänzt (identisches Problem
     überall, wo ein Dialog höher als der Viewport werden kann). */
  overscroll-behavior: contain;
}
.artikel-box {
  background: var(--card); border-radius: var(--radius); overflow: hidden;
  width: 100%; max-width: 820px; box-shadow: 0 12px 40px rgba(0,0,0,0.3);
}
.artikel-box-header {
  background: var(--primary, #7a1638); color: #fff; padding: 14px 20px;
  font-weight: 600; display: flex; align-items: center; gap: 10px;
}
.artikel-box-header button { background: none; border: none; color: #fff; font-size: 1.1rem; cursor: pointer; margin-left: auto; }
.artikel-box-body { padding: 18px 20px; }
.artikel-search-input {
  width: 100%; padding: 10px 12px; border: 1px solid var(--border, #d8dce3);
  border-radius: 6px; font-size: 0.95rem; margin-bottom: 14px;
}
.artikel-search-layout { display: flex; gap: 24px; align-items: flex-start; }
.artikel-list-col { flex: 1; min-width: 0; }
.artikel-filter-col { width: 220px; flex-shrink: 0; }
.artikel-filter-col h4 { margin: 0 0 8px; font-size: 0.8rem; text-transform: uppercase; color: var(--text-muted); }
.artikel-filter-option {
  display: flex; align-items: center; gap: 6px; padding: 4px 0; font-size: 0.88rem; cursor: pointer;
}
.artikel-filter-option input { width: auto; }
.artikel-filter-option.disabled { color: #b7bcc6; cursor: default; }
.artikel-list { max-height: 380px; overflow-y: auto; overscroll-behavior: contain; }
.artikel-list-item {
  display: flex; align-items: center; gap: 10px; padding: 9px 4px;
  border-bottom: 1px solid var(--border, #eee); font-size: 0.92rem; position: relative;
}
.artikel-list-item .artikel-name { flex: 1; }
.artikel-list-item .artikel-preis { color: var(--text-muted); width: 90px; text-align: right; }
.artikel-list-item .artikel-auswaehlen {
  display: none; position: absolute; right: 90px; top: 50%; transform: translateY(-50%);
}
.artikel-list-item:hover .artikel-auswaehlen { display: inline-flex; }
.artikel-list-item:hover .artikel-name { opacity: 0.35; }
.artikel-empty { color: var(--text-muted); font-size: 0.9rem; padding: 16px 4px; }
.artikel-box-footer {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 20px; border-top: 1px solid var(--border, #eee);
}
.artikel-neu-form { display: none; margin-top: 14px; padding-top: 14px; border-top: 1px dashed var(--border, #ddd); }
.artikel-neu-form.open { display: block; }
.artikel-neu-grid { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 10px; }

/* Position bearbeiten (Schritt 2) */
/* Sub-Navigation über der Rechnungen-/Gutschriften-Tabelle */
.invoice-subnav {
  display: flex; gap: 4px; margin-bottom: 14px; border-bottom: 1px solid var(--border);
}
.invoice-subnav a {
  padding: 8px 16px; font-size: 0.86rem; font-weight: 600; color: var(--text-muted);
  border-bottom: 2px solid transparent;
}
.invoice-subnav a:hover { color: var(--primary); text-decoration: none; }
.invoice-subnav a.active { color: var(--primary); border-bottom-color: var(--accent); }

/* ============================================================
   Kalender: Monatsansicht der Aufträge
   ============================================================ */
.cal-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 20px; border-bottom: 1px solid var(--border);
}
.cal-legend { display: flex; gap: 16px; font-size: 0.8rem; color: var(--text-muted); }
.cal-legend-item { display: flex; align-items: center; gap: 6px; }
.cal-dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }
/* Von Stephan gemeldet ("hier fehlt noch die Anpassung"): Die Punkte hatten eigene Farben
   (--accent orange, --primary-light blau) und zeigten damit noch den Stand vor Stephans
   Farbvorgaben - im Kalender war Halteverbot längst hellblau und Verkehrssicherung orange, in der
   Legende genau umgekehrt. Jetzt greifen die Punkte auf dieselbe Palette zu wie die Einträge im
   Kalender (siehe :root --cal-* weiter unten), eine Abweichung ist damit ausgeschlossen. */
.cal-dot-hv { background: var(--cal-hv); }
.cal-dot-vs { background: var(--cal-vs); }
.cal-dot-monea { background: var(--cal-monea); }
.cal-dot-werbetechnik { background: var(--cal-werbetechnik); }
.cal-dot-sonstige { background: var(--cal-sonstige); }
.cal-dot-termin { background: var(--cal-termin); }
.cal-dot-aufgabe { background: var(--cal-aufgabe); }
.cal-dot-urlaub { background: var(--cal-urlaub); }
/* Freizeitausgleich mit rotem Rahmen wie der Eintrag im Kalender - der Punkt wird dafür minimal
   kleiner gezeichnet, damit er mit Rahmen dieselbe Gesamtgröße behält wie die übrigen. */
.cal-dot-fza { background: var(--cal-fza); border: 1px solid var(--cal-fza-rahmen); width: 7px; height: 7px; }
.cal-dot-krank { background: var(--cal-krank); }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); }
.cal-grid-weekdays {
  border-bottom: 1px solid var(--border); background: var(--bg);
}
.cal-grid-weekdays div {
  padding: 8px 10px; font-size: 0.72rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.03em; color: var(--text-muted);
}
.cal-cell {
  /* Bugfix (Runde AU, Punkt 5): ohne "min-width: 0" berechnet CSS Grid die automatische
     Mindestbreite einer "1fr"-Spalte u.a. aus dem intrinsischen Inhalt der Zelle (min-content) -
     ein langer, nicht umbrechender Event-Titel (siehe .cal-badge white-space: nowrap) konnte
     dadurch trotz overflow:hidden/text-ellipsis die betroffene Spalte breiter ziehen als die
     übrigen 6 Spalten in derselben Zeile, was auf Screenshots als "uneinheitliche Kachelbreiten"
     auffiel. "min-width: 0" erzwingt, dass die Spaltenbreite ausschließlich von grid-template-
     columns (repeat(7, 1fr), siehe .cal-grid) bestimmt wird, nie vom Zeileninhalt. */
  min-width: 0; max-width: 100%; box-sizing: border-box;
  min-height: 110px; border-right: 1px solid var(--border); border-bottom: 1px solid var(--border);
  padding: 6px 6px 8px; display: flex; flex-direction: column; gap: 4px;
}
.cal-cell:nth-child(7n) { border-right: none; }
.cal-cell-outside { background: #fcfcfc; color: var(--text-muted); }
.cal-cell-outside .cal-cell-date { color: #b7bcc6; }
.cal-cell-today { background: #ffeaed; }
.cal-cell-today .cal-cell-date {
  background: var(--accent); color: #fff; border-radius: 50%;
  width: 22px; height: 22px; display: flex; align-items: center; justify-content: center;
}
.cal-cell-date { font-size: 0.82rem; font-weight: 600; }
/* Bugfix (Runde AU, Punkt 5): Tage mit vielen Einträgen (Aufträge+Termine+Aufgaben, je bis zu 3
   plus "+N mehr", siehe views/calendar/_month.ejs) sollen die Zeilenhöhe nicht mehr unbegrenzt
   aufblähen und dadurch die komplette Kalenderzeile uneinheitlich hoch wirken lassen - stattdessen
   scrollt eine einzelne Zelle ab einer festen Maximalhöhe intern. */
.cal-cell-items { display: flex; flex-direction: column; gap: 3px; overflow-y: auto; overflow-x: hidden; max-height: 118px; min-width: 0; }
.cal-badge {
  display: block; font-size: 0.7rem; padding: 2px 6px; border-radius: 4px; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; max-width: 100%;
  box-sizing: border-box;
}
.cal-badge:hover { opacity: 0.85; text-decoration: none; }

/* Von Stephan gemeldet ("hier fehlt noch die Anpassung - Halteverbot, Verkehrssicherung, Termin,
   Aufgabe (Deadline)"): Die Farbpunkte in der Legende über dem Kalender zeigten noch die alten
   Farben, weil sie ihre eigenen Werte mitbrachten. Jede Farbänderung musste an zwei Stellen
   nachgezogen werden - und genau das ist zuletzt untergegangen.
   Deshalb steht die Kalenderpalette ab hier EINMAL an einer Stelle. Sowohl die Einträge im Kalender
   (.cal-badge-*) als auch die Punkte in der Legende (.cal-dot-*) greifen darauf zu. Eine neue Farbe
   wird nur noch hier geändert, die Legende zieht automatisch mit und kann nicht mehr abweichen. */
:root {
  --cal-hv: #808080;          /* Halteverbot */
  --cal-vs: #ffc000;          /* Verkehrssicherung = Baustelle */
  --cal-monea: #e5bbf6;       /* Verkehrssicherung für den Kunden Monea */
  --cal-werbetechnik: #00ff40;
  --cal-sonstige: var(--primary-light); /* alle übrigen Auftragsarten, z.B. VRG */
  --cal-termin: #3a3f4b;
  --cal-aufgabe: #c3c3c3;
  --cal-urlaub: #00ffe1;
  --cal-fza: #7cd1ec;         /* Freizeitausgleich */
  --cal-fza-rahmen: #e24c60;  /* roter Rahmen, unterscheidet ihn vom Urlaub */
  --cal-krank: #ee7686;       /* Krank - Farbe und Schriftfarbe von Stephan vorgegeben */
  --cal-krank-schrift: #eff0b7;
  /* Endtag einer Maßnahme (Abbau) - Farbe von Stephan vorgegeben ("nehme die Hintergrundfarbe für
     den Abbau #e7f623"). Deutlich heller und grünstichiger als das Orange der Verkehrssicherung
     (--cal-vs), die beiden sind dadurch im Kalender auseinanderzuhalten. Der dunklere Rahmen grenzt
     den Eintrag zusätzlich ab. */
  --cal-ende: #e7f623;
  --cal-ende-rahmen: #b5c400;
}

/* Von Stephan gewünscht ("Halteverbot bitte in einem helleren Blau und Verkehrssicherung in Orange
   mit schwarzer Schrift"): Halteverbot hellblau, Verkehrssicherung orange mit dunkler Schrift - auf
   dem hellen Orange wäre Weiß schlecht lesbar. Welche Auftragsart welche Klasse bekommt, entscheidet
   jetzt der Name der Art (siehe kalenderFarbklasse() in routes/calendar.js) und nicht mehr das
   Merkmal "ist Halteverbot-artig", das bei beiden gesetzt ist. */
.cal-badge-hv { background: var(--cal-hv); color: #1c1c1c; }
.cal-badge-vs { background: var(--cal-vs); color: #1c1c1c; }
/* Kunde Monea bei der Verkehrssicherung - dieselbe Farbe wie im Baustellen-Dashboard. */
.cal-badge-monea { background: var(--cal-monea); color: #3d2a46; }
/* Alle übrigen Auftragsarten (VRG ...) - neutral, damit sie nicht mit Halteverbot oder
   Verkehrssicherung verwechselt werden. Für diese hat Stephan noch keine Farbe genannt. */
.cal-badge-sonstige { background: var(--cal-sonstige); color: #fff; }
/* Von Stephan vorgegeben: Werbetechnik grün mit schwarzer Schrift. Für VRG hat er ausdrücklich
   keine Farbe vergeben - diese Art bleibt neutral (siehe .cal-badge-sonstige oben). */
.cal-badge-werbetechnik { background: var(--cal-werbetechnik); color: #1c1c1c; }
/* Terminkategorie Urlaub - Farbe von Stephan vorgegeben, schwarze Schrift, weil das helle Türkis
   weiße Schrift unlesbar machen würde. */
.cal-badge-urlaub { background: var(--cal-urlaub); color: #1c1c1c; }
.cal-appt-urlaub { border-left: 3px solid var(--cal-urlaub); }
/* Freizeitausgleich, von Stephan festgelegt: "#7cd1ec mit rotem Rahmen". Der Rahmen unterscheidet
   ihn zusätzlich zur Farbe vom Urlaub - die beiden Töne liegen dicht beieinander. */
.cal-badge-fza { background: var(--cal-fza); color: #1c1c1c; border: 1px solid var(--cal-fza-rahmen); }
.cal-appt-fza { border-left: 3px solid var(--cal-fza); }
/* Krank, von Stephan vorgegeben: "#ee7686 als Farbe mit #eff0b7 Schrift". */
.cal-badge-krank { background: var(--cal-krank); color: var(--cal-krank-schrift); }
.cal-appt-krank { border-left: 3px solid var(--cal-krank); }
.cal-more { font-size: 0.7rem; color: var(--text-muted); padding: 0 4px; }
.cal-cell-header { display: flex; align-items: center; justify-content: space-between; }
.cal-cell-add {
  width: 18px; height: 18px; border-radius: 4px; border: 1px solid var(--border); background: #fff;
  color: var(--text-muted); cursor: pointer; font-size: 0.8rem; line-height: 1; padding: 0;
  display: flex; align-items: center; justify-content: center;
}
.cal-cell-add:hover { background: var(--bg); color: var(--primary); }
.cal-badge-termin { background: var(--cal-termin); }
/* Aufgaben-Deadline im Kalender (Punkt 1, Software-Liste Runde AK). */
/* Farbe von Stephan vorgegeben. Schwarze Schrift, weil das helle Grau weiße Schrift unlesbar
   machen würde. */
.cal-badge-aufgabe { background: var(--cal-aufgabe); color: #1c1c1c; }
@media (max-width: 900px) {
  .cal-cell { min-height: 70px; }
  .cal-legend { display: none; }
}

/* Kalender: Toolbar (Navigation, Ansichts-Umschalter, Mitarbeiter-Filter, Termin anlegen) */
.cal-toolbar {
  display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap;
  gap: 12px; margin-bottom: 16px;
}
.cal-toolbar-left { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.cal-toolbar-right { display: flex; align-items: center; gap: 10px; }
.cal-toolbar-right select { width: auto; min-width: 170px; }
.cal-nav { display: flex; align-items: center; gap: 8px; }
.cal-title { font-size: 1.15rem; font-weight: 700; color: var(--primary); min-width: 180px; }
.cal-view-switch {
  display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden;
}
.cal-view-switch a {
  padding: 7px 14px; font-size: 0.85rem; color: var(--text); background: #fff; border-right: 1px solid var(--border);
}
.cal-view-switch a:last-child { border-right: none; }
.cal-view-switch a:hover { background: var(--bg); text-decoration: none; }
.cal-view-switch a.active { background: var(--primary); color: #fff; }

/* Kalender: Wochen-/Tagesansicht mit Stundenraster */
.cal-week-wrap { border: 1px solid var(--border); border-radius: var(--radius); }
.cal-week-grid { display: grid; }
.cal-week-corner, .cal-week-rowlabel, .cal-week-hourlabel {
  border-right: 1px solid var(--border); border-bottom: 1px solid var(--border);
  font-size: 0.72rem; color: var(--text-muted); padding: 6px 8px; background: var(--bg);
}
.cal-week-daylabel {
  border-right: 1px solid var(--border); border-bottom: 1px solid var(--border);
  padding: 8px 6px; text-align: center; background: var(--bg);
}
.cal-week-daylabel:last-child { border-right: none; }
.cal-week-dayname { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; color: var(--text-muted); }
.cal-week-daynum { font-size: 1rem; font-weight: 700; }
.cal-week-daylabel.cal-cell-today .cal-week-daynum { color: var(--accent); }
.cal-week-allday, .cal-week-hourcell {
  border-right: 1px solid var(--border); border-bottom: 1px solid var(--border);
  padding: 4px 6px; min-height: 40px; display: flex; flex-direction: column; gap: 3px;
}
.cal-week-allday:last-of-type, .cal-week-hourcell:last-of-type { border-right: none; }
.cal-week-allday.cal-cell-today, .cal-week-hourcell.cal-cell-today { background: #ffeaed; }
.cal-appt {
  background: #eef1f7; border-left: 3px solid var(--primary); border-radius: 3px;
  padding: 3px 6px; font-size: 0.75rem; display: flex; align-items: center; gap: 6px;
}
.cal-appt-time { font-weight: 700; color: var(--primary); }
.cal-appt-del {
  background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 0.9rem;
  margin-left: auto; padding: 0 2px; line-height: 1;
}
.cal-appt-del:hover { color: var(--danger); }

/* Kalender: Jahresansicht (Mini-Monate) */
.cal-year-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
@media (max-width: 1100px) { .cal-year-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 700px) { .cal-year-grid { grid-template-columns: repeat(2, 1fr); } }
.cal-year-month { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); padding: 10px; }
.cal-year-month-title { font-weight: 700; font-size: 0.9rem; margin-bottom: 6px; text-align: center; }
.cal-year-month-title a { color: var(--primary); }
.cal-year-weekdays, .cal-year-days { display: grid; grid-template-columns: repeat(7, 1fr); }
.cal-year-weekdays div { font-size: 0.62rem; color: var(--text-muted); text-align: center; padding: 2px 0; }
.cal-year-day {
  font-size: 0.68rem; text-align: center; padding: 3px 0; color: var(--text); border-radius: 3px; position: relative;
}
.cal-year-day:hover { background: var(--bg); text-decoration: none; }
.cal-year-day.outside { color: #c6cad2; }
.cal-year-day.today { background: var(--accent); color: #fff; font-weight: 700; }
.cal-year-day.has-entries::after {
  content: ''; position: absolute; bottom: 1px; left: 50%; transform: translateX(-50%);
  width: 4px; height: 4px; border-radius: 50%; background: var(--primary-light);
}
.cal-year-day.today.has-entries::after { background: #fff; }

/* Kalender: Termin-Modal */
.modal-overlay {
  position: fixed; inset: 0; background: rgba(20,30,50,0.45); z-index: 100;
  display: flex; align-items: flex-start; justify-content: center; padding: 40px 16px; overflow-y: auto;
  overscroll-behavior: contain;
}
.modal-box {
  background: var(--card); border-radius: var(--radius); padding: 22px; width: 100%; max-width: 520px;
  box-shadow: 0 20px 60px rgba(0,0,0,0.25);
}
.modal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
/* Bugfix (von Stephan gemeldet, Screenshot "Anschrift bearbeiten"): die Klasse ".modal-close" (u.a.
   Ansprechpartner/Abweichende-Anschrift/Eingangsrechnung-Bearbeiten-Popups) hatte bisher GAR KEINE
   eigene Regel und blieb dadurch als unstylisierter Standard-Browser-Button stehen - je nach
   Browser/Betriebssystem ein "weißes Kästchen" ohne klar sichtbares ×-Zeichen. Analog zu den
   bereits funktionierenden Schließen-Buttons (siehe .btn-icon/.chat-msg-delete/.cal-appt-del
   weiter unten) jetzt mit explizitem Rahmen/Hintergrund/Farbe/Schriftgröße, damit das × in jedem
   Browser garantiert gut sichtbar ist. */
.modal-close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  border: none;
  background: none;
  border-radius: 4px;
  color: var(--text-muted, #6b7280);
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
}
.modal-close:hover { background: var(--bg); color: var(--text); }

/* Bugfix (echter Fehler, von Stephan gemeldet, Screenshot mit rot/grün markiertem Fenster): siehe
   ausführlicher Kommentar in views/partials/email-ablage-modal.ejs - blendet beim "Per E-Mail
   senden" aus Rechnung/Angebot/Gutschrift (composePrefill-Modus) die äußere Modal-Chrome komplett
   aus, damit einzig das innere Compose-Fenster (mit eigener Titelleiste) sichtbar bleibt. Der
   dunkle Hintergrund-Tint kommt dann allein vom inneren Compose-Overlay (.ablegen-overlay in der
   eingebetteten Seite) - ohne diese Regel gäbe es zwei übereinanderliegende, sichtbar
   unterschiedliche Rahmen/Titelleisten. */
#emailAblageModalOverlay.email-ablage-bare { background: transparent; padding: 0; align-items: stretch; }
#emailAblageModalOverlay.email-ablage-bare .modal-box.email-ablage-bare {
  max-width: none; width: 100%; height: 100vh; box-shadow: none; border-radius: 0; background: transparent;
}
#emailAblageModalOverlay.email-ablage-bare .modal-box.email-ablage-bare #emailAblageModalHeaderBar { display: none; }
#emailAblageModalOverlay.email-ablage-bare .modal-box.email-ablage-bare iframe { height: 100vh; }
.cal-type-filter { display: flex; gap: 14px; flex-wrap: wrap; margin-bottom: 4px; }
.cal-type-option { display: flex; align-items: center; gap: 5px; font-size: 0.85rem; font-weight: 400; text-transform: none; color: var(--text); }
.cal-type-option input { width: auto; }
.cal-employee-checks { display: flex; flex-direction: column; gap: 6px; max-height: 160px; overflow-y: auto; border: 1px solid var(--border); border-radius: var(--radius); padding: 8px 10px; }
.cal-employee-check { display: flex; align-items: center; gap: 8px; font-size: 0.88rem; font-weight: 400; text-transform: none; color: var(--text); }
.cal-employee-check input { width: auto; }

.position-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 14px; align-items: end; margin-bottom: 14px; }
.position-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; align-items: end; margin-bottom: 14px; }
.position-calc-hint { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }
.position-gewinn { font-weight: 600; }
.position-gewinn.negativ { color: #b31e32; }
.position-gewinn.positiv { color: #1a7f37; }

/* Rabatt je Position (Angebote/Rechnungen, siehe public/js/artikel-suche.js) */
.pos-rabatt-row { margin: -6px 0 14px; }
.pos-rabatt-row a { font-size: 0.85rem; }
.position-grid-rabatt { grid-template-columns: 1fr 1fr 1fr 1fr; background: #fafafa; border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 14px; }

/* Größerer runder Icon-Button (z.B. "+ Neue Aufgabe" oben rechts in der Aufgabenübersicht) */
.btn-icon-lg { width: 38px; height: 38px; border-radius: 50%; font-size: 1.3rem; }

/* Aufgaben: flache Liste (siehe partials/aufgaben-liste.ejs + partials/aufgabe-zeile.ejs).
   Kein overflow:hidden hier (würde die Status-/Zuweisen-/Deadline-Popups, die als Dropdown unter
   der jeweiligen Zeile aufklappen, abschneiden und unsichtbar machen). */
.task-list { border: 1px solid var(--border); border-radius: var(--radius); }
.task-row {
  display: flex; align-items: center; gap: 14px; padding: 15px 18px;
  border-top: 1px solid var(--border); font-size: 1.02rem;
}
.task-list .task-row:first-child { border-top: none; }
.task-bullet {
  width: 12px; height: 12px; border-radius: 50%; flex: none;
  border: 2px solid #b7c0d1; background: transparent;
}
.task-bullet.done { border-color: #1a7f37; background: #1a7f37; }
.task-title { color: var(--text); text-decoration: none; flex: 1; min-width: 0; font-weight: 600; }
.task-title:hover { text-decoration: underline; }
.task-title.done { text-decoration: line-through; color: var(--text-muted); }
/* Von Stephan gewünscht (neuer Auftragsstatus "Storno"): "Wenn Status ausgewählt wird, dann soll
   der Auftrag durchgestrichen werden" - auf Auftragsname/-titel angewendet, wo immer ein Auftrag
   als Zeile/Karte/Überschrift dargestellt wird (siehe views/projects/list.ejs, views/projects/show.ejs). */
.status-storno-strike { text-decoration: line-through; }
.task-row-right { display: flex; align-items: center; gap: 16px; flex: none; }
.task-avatar {
  width: 36px; height: 36px; border-radius: 50%; flex: none; color: #fff; font-size: 0.85rem; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
}
.task-deadline { font-size: 0.82rem; color: var(--text-muted); text-align: right; line-height: 1.3; min-width: 64px; cursor: pointer; }
.task-deadline.overdue { color: var(--danger); font-weight: 700; }
.task-avatar-empty { background: #d7dce4; color: #6b7280; font-size: 1rem; }
.task-row .btn-icon { width: 30px; height: 30px; font-size: 1rem; }
/* Von Stephan gewünscht ("Feste Spalten. Bei Auswahl des Status verschiebt sich der Avatar nach
   links soll nicht so sein"): Mitarbeiter-Avatar und Deadline dürfen in der Aufgabenzeile
   (.task-row-right, z.B. im Aufgaben-Kärtchen auf der Auftragsseite) nie mehr schrumpfen, wenn der
   Status-Badge daneben durch einen längeren Namen breiter wird - vorher konnten beide als normale
   Flex-Kinder ohne flex-shrink:0 zusammengedrückt werden, was wie ein Sprung des Avatars nach
   links aussah. */
.task-row-right .assignee-picker, .task-row-right .deadline-picker { flex: none; }
/* Der Status-Badge selbst bekommt eine feste Breite mit Ellipsis für den Namenstext, damit er beim
   Wechsel auf einen längeren/kürzeren Status nie die Spaltenbreite ändert - macht dieselbe Zeile
   in der schmaleren Auftragsseiten-Karte genauso "sauber" wie in der breiten globalen
   Aufgabenübersicht (siehe Anfrage, Vergleichsbild). */
.task-row-right .task-status-picker { flex: none; }
/* Bugfix (von Stephan gemeldet, Screenshot: Text sollte zentriert sein statt an den Rändern zu
   kleben, Kästchen etwas höher): justify-content von "space-between" (Name links, Pfeil rechts) auf
   "center" umgestellt - Name+Pfeil wandern dadurch als Einheit in die Mitte. Zusätzliche vertikale
   Innenabstand-Erhöhung gegenüber dem sonst schon etwas höheren .badge-task (padding: 6px 14px) für
   ein spürbar höheres Kästchen. */
.task-status-picker summary .badge { width: 150px; box-sizing: border-box; justify-content: center; padding: 9px 14px; }
.task-status-picker-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: inline-block; max-width: 110px; vertical-align: middle; text-align: center; }
/* Das Auswahl-Popup selbst war bisher recht eng (padding:4px, Buttons padding:5px 6px) - "sieht
   extrem gepresst aus" (Zitat). Hier eigens für den Aufgabenstatus großzügiger dimensioniert
   (mehr Innenabstand, größere Mindestbreite, etwas größere Schrift), ohne die vielen anderen
   .status-picker-menu-Varianten (Mitarbeiter/Deadline/Aktionen) mit zu verändern. */
.task-status-picker .status-picker-menu { min-width: 220px; padding: 8px; gap: 5px; }
/* Bugfix (von Stephan gemeldet, Screenshot: Menüpunkte sollen alle die gleiche Breite/Höhe haben
   und der Text soll zentriert sein): die Status-Badges im Popup waren bisher "display:inline-block"
   (geerbt von .badge) und damit je nach Textlänge unterschiedlich breit ("Wartend" schmaler als "in
   Bearbeitung"), obwohl der umgebende Button schon volle Breite hatte. display:block + width:100%
   lässt jeden Badge die komplette Button-Breite ausfüllen, text-align:center zentriert den Text
   darin - Höhe ist durch das einheitliche padding ohnehin bereits für alle Einträge identisch. */
.task-status-picker .status-picker-menu button { padding: 9px 12px; text-align: center; }
.task-status-picker .status-picker-menu .badge { display: block; width: 100%; box-sizing: border-box; font-size: 0.95rem; padding: 9px 16px; text-align: center; }

/* Aufgaben: Mitarbeiter-/Deadline-Schnellauswahl-Popups (siehe partials/aufgabe-zeile.ejs) - auf
   Basis des .status-picker-Popup-Musters (Details/Summary), damit Öffnen/Schließen/Klick-außerhalb
   automatisch über die bestehende globale Steuerung in partials/nav.ejs mitläuft. */
.assignee-picker summary, .deadline-picker summary { list-style: none; cursor: pointer; }
.assignee-picker summary::-webkit-details-marker, .deadline-picker summary::-webkit-details-marker { display: none; }
/* Bugfix (Software-Liste Runde AS, Punkt 2): der Mitarbeiter-Filter sitzt praktisch überall rechts
   im Toolbar/Header (page-header-actions, Kalender-Toolbar usw.) - mit dem geerbten "left:0" von
   .status-picker-menu ragte das Menü rechts über den Fensterrand hinaus. right:0 lässt das Menü
   stattdessen nach links aufklappen (analog zur bereits bestehenden .task-menu-picker-Regel unten). */
.assignee-picker-menu { left: auto; right: 0; min-width: 200px; max-height: 260px; overflow-y: auto; padding: 4px; }
/* Bugfix (von Stephan gemeldet, Screenshot): der Mitarbeiter-Avatar in der ERSTEN Datenspalte der
   Auftragsliste-Spaltenansicht (siehe views/projects/list.ejs) sitzt nahe am LINKEN Fensterrand -
   anders als die übrigen .assignee-picker-Vorkommen (rechte Seite einer Zeile/eines Headers, siehe
   Kommentar oben), lässt hier "right:0" das Popup über den linken Rand hinaus/unter die Sidebar
   rutschen. Linksbündig aufklappen lassen (nach rechts) behebt das gezielt nur für diesen Fall. */
.assignee-picker-list-col .assignee-picker-menu { left: 0; right: auto; }
/* Bugfix (von Stephan gemeldet, Screenshot: Dropdown "geht aus dem Fenster"): derselbe Effekt wie
   oben beim Avatar in der ersten Tabellenspalte - der "Mitarbeiter:"-Schnellfilter im erweiterten
   Filter (partials/erweiterter-filter.ejs) sitzt ebenfalls ganz links direkt neben der Sidebar, in
   allen 5 Modulen (Aufträge/Rechnungen/Angebote/Beweislisten/Eingangsrechnungen) - "right:0" ließ
   das Popup dort unter die Sidebar rutschen. Eigene, klarer benannte Klasse (statt der
   "-list-col"-Klasse zweckzuentfremden), die dieselbe Linksbündig-Korrektur anwendet. */
.assignee-picker-left .assignee-picker-menu { left: 0; right: auto; }
.assignee-picker-menu form { margin: 0; }
.assignee-picker-option {
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  padding: 6px 10px; border: none; background: none; border-radius: var(--radius); cursor: pointer; font-size: 0.85rem;
  color: var(--text);
}
.assignee-picker-option:hover { background: var(--bg); text-decoration: none; }
.assignee-picker-option.active { background: #f4f4f4; font-weight: 600; }
/* Von Stephan gewünscht (Kalender-Kategorie-Dropdown, Software-Liste Runde BA): trennt die
   Kategorie-Checkboxen optisch von den nachgestellten "Aufgaben"/"Termine"-Anzeigeoptionen. */
.status-picker-menu-divider { height: 1px; background: var(--border); margin: 4px 6px; }
/* Bugfix (von Stephan gemeldet: "Das Dropdownmenü sieht absolut scheiße aus"): der Auslöser-
   Button des Kalender-Kategorie-Filters bekommt jetzt eine eigene, saubere Button-Optik (statt
   eines innen verschachtelten .btn-Elements ohne eigene Fassung) - fixe Breite, klarer Rahmen wie
   .btn-secondary, dezenter Zähler-Badge statt lang umbrechender Kategorie-Namen. */
.cal-kategorie-summary {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 12px;
  border: 1px solid var(--primary);
  border-radius: var(--radius);
  background: #fff;
  color: var(--primary);
  font-size: 0.82rem;
  white-space: nowrap;
}
.cal-kategorie-summary:hover { background: #eef1f7; }
.cal-kategorie-summary-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 999px;
  background: var(--accent);
  color: #fff;
  font-size: 0.7rem;
  font-weight: 600;
}
.cal-kategorie-menu { min-width: 240px; }
.cal-kategorie-menu-heading {
  padding: 6px 10px 2px;
  font-size: 0.72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--text-muted);
}
/* Von Stephan gewünscht ("Neue Aufgabe" -> Auftrag*-Textsuche, Software-Liste Runde BA): markiert
   das Suchfeld rot, wenn beim Absenden noch kein Auftrag aus der Trefferliste ausgewählt wurde. */
.input-invalid { border-color: var(--danger) !important; }
.deadline-picker-menu { padding: 12px; }
.deadline-picker-form { display: flex; flex-direction: column; gap: 8px; }

/* Aufgaben-Zeile: ⋮-Aktionsmenü (Öffnen/Bearbeiten/Verschieben/Duplizieren/Löschen), ersetzt den
   früheren einzelnen Löschen-Button. Öffnet nach rechts (right:0) statt nach links, da es das
   letzte/rechteste Element der Zeile ist und sonst über den Seitenrand hinausragen könnte. */
.task-menu-picker summary { list-style: none; cursor: pointer; }
.task-menu-picker summary::-webkit-details-marker { display: none; }
.task-menu-picker .status-picker-menu { left: auto; right: 0; min-width: 170px; }

/* Bugfix (Software-Liste): "Aufgaben aus Vorlage anlegen"-Dropdown (📋-Button neben "+" im
   Aufgaben-Kartenkopf, views/projects/show.ejs) sitzt wie das ⋮-Aktionsmenü oben ganz rechts im
   Kartenkopf - mit dem geerbten "left:0" von .status-picker-menu ragte es über den rechten
   Fensterrand hinaus und war dadurch teilweise unsichtbar/nicht klickbar. Gleiche Lösung wie bei
   .task-menu-picker/.assignee-picker-menu oben: rechtsbündig aufklappen. */
.task-vorlage-picker .status-picker-menu { left: auto; right: 0; min-width: 220px; }
.task-menu a, .task-menu button {
  display: block; width: 100%; text-align: left; padding: 6px 10px; border: none; background: none;
  border-radius: 4px; cursor: pointer; font-size: 0.85rem; color: var(--text); text-decoration: none;
}
.task-menu form { margin: 0; }
.task-menu a:hover, .task-menu button:hover { background: var(--bg); }
.task-menu-danger { color: var(--danger) !important; }

/* Historie als Feed mit Vorschau (siehe partials/historie-eintragen.ejs + views/tasks/form.ejs) -
   im Unterschied zur kompakten Korrespondenz-Tabelle auf der Auftragsseite: größer, mit Avatar,
   Betreff/Absender in einer Kopfzeile. Der Inhalt ist standardmäßig auf 3 Zeilen begrenzt
   (-webkit-line-clamp) und klappt per Klick auf den Text bzw. den "Mehr anzeigen"-Link auf/zu
   (siehe partials/historie-feed.ejs). */
.hist-feed { display: flex; flex-direction: column; gap: 10px; }
.hist-feed-item {
  display: flex; gap: 12px; background: #fff; border: 1px solid var(--border);
  border-radius: var(--radius); padding: 14px 16px;
}
.hist-feed-avatar {
  position: relative; flex: none; width: 38px; height: 38px; border-radius: 50%; color: #fff;
  font-size: 0.75rem; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.hist-feed-icon {
  position: absolute; bottom: -3px; right: -3px; width: 18px; height: 18px; border-radius: 50%;
  background: #fff; border: 1px solid var(--border); font-size: 0.65rem; line-height: 16px; text-align: center;
}
.hist-feed-body { flex: 1; min-width: 0; }
.hist-feed-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.hist-feed-summary { font-size: 0.9rem; color: var(--text); }
.hist-feed-summary b { font-weight: 700; }
.hist-feed-summary a { color: var(--primary-light); }
.hist-feed-time { font-size: 0.75rem; color: var(--text-muted); white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; }
/* Von Stephan gewünscht ("Löschfunktion für Einträge"): dezenter Papierkorb neben dem Zeitstempel,
   erst beim Hover über den ganzen Eintrag sichtbar - fällt in der Liste nicht störend auf, ist
   aber schnell erreichbar, siehe partials/historie-feed.ejs. */
.hist-feed-delete { background: none; border: none; padding: 0; font-size: 0.85rem; line-height: 1; cursor: pointer; opacity: 0; transition: opacity 0.15s; }
.hist-feed-item:hover .hist-feed-delete { opacity: 0.6; }
.hist-feed-delete:hover { opacity: 1 !important; }
.hist-feed-delete:disabled { opacity: 0.3; cursor: default; }
.hist-feed-preview-wrap { margin-top: 6px; }
.hist-feed-preview {
  font-size: 0.85rem; color: var(--text); white-space: pre-wrap; line-height: 1.5; cursor: pointer;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
/* Anhang-Leiste am unteren Rand des "E-Mail"-Fensters auf der Auftragsseite (siehe
   #emailKachelDetailAnhaenge in views/projects/show.ejs). Von Stephan gewünscht ("Ich möchte nicht
   scrollen nach ganz unten um Anlagen zu sehen, sondern dass diese einfach unten drunter stehen"):
   die Leiste liegt außerhalb des scrollenden Textbereichs und bleibt dadurch immer sichtbar,
   unabhängig davon wie lang die Mail ist. */
.mail-anhaenge {
  flex-shrink: 0;
  border-top: 1px solid var(--border);
  background: #f7f8fa;
  padding: 11px 16px;
}
.mail-anhaenge-titel {
  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em;
  color: var(--text-muted); margin-bottom: 7px;
}
.mail-anhang-chips { display: flex; flex-wrap: wrap; gap: 7px; }
.mail-anhang-chip {
  display: inline-flex; align-items: center; gap: 4px;
  background: var(--card); border: 1px solid var(--border); border-radius: 20px;
  padding: 5px 13px 5px 9px; font-size: 0.8rem; color: var(--text); text-decoration: none;
  cursor: pointer;
}
.mail-anhang-chip:hover { border-color: var(--primary-light); background: #f8f8f8; }
.mail-anhang-icon { font-size: 0.95rem; }
.mail-anhang-groesse { color: var(--text-muted); font-size: 0.72rem; }
/* Anhänge, die im Eintrag vermerkt sind, von denen aber keine Datei mehr vorliegt (Mails aus der
   Zeit vor dem dauerhaften Speichern der Anhänge) - ausgegraut statt anklickbar. */
.mail-anhaenge-fehlt { font-size: 0.78rem; color: var(--text-muted); font-style: italic; }
/* Anklickbare Anhang-Chips in der E-Mail-Ablage (Vorschau einer Nachricht aus dem Postfach). */
.email-attachment-chip.clickable { cursor: pointer; text-decoration: none; color: var(--text); }
.email-attachment-chip.clickable:hover { border-color: var(--primary-light); background: #f8f8f8; }

/* Vorschaufenster für einen einzelnen Anhang (PDF oder Bild) - liegt über dem E-Mail-Fenster,
   siehe #anhangVorschauOverlay in views/projects/show.ejs. Gleiche Maße wie die PDF-Vorschau in
   partials/nav.ejs, damit sich beide Fenster gleich anfühlen. */
.anhang-vorschau-box {
  max-width: 900px; padding: 0; overflow: hidden;
  display: flex; flex-direction: column; height: 86vh;
}
.anhang-vorschau-frame { flex: 1; width: 100%; border: 0; background: #525659; }

/* Icon im "Maps"-Knopf neben der Aufstellanschrift (siehe views/projects/show.ejs). Die Datei
   public/icons/maps.png liegt in dreifacher Auflösung vor (63x45), damit sie auf Retina-Displays
   scharf bleibt - angezeigt wird sie mit 15px Höhe, die Breite ergibt sich aus dem
   Seitenverhältnis. Von Stephan gewünscht ("Die Größe verkleinern"). */
.maps-btn-icon {
  height: 15px;
  width: auto;
  vertical-align: -3px;
  margin-right: 2px;
}

.hist-feed-preview.expanded { -webkit-line-clamp: unset; display: block; overflow: visible; }
/* Von Stephan gemeldet ("Wenn ich auf E-Mail klicke dann wird mir nicht die Mail angezeigt. Ich
   würde gerne die Mail sehen"): im eigenständigen "E-Mail"-Detailfenster (#emailKachelDetailBody,
   siehe views/projects/show.ejs) ist die Kürzung auf drei Zeilen unsinnig - das Fenster hat genau
   den einen Zweck, diese Mail zu zeigen. Dort steht der Text deshalb immer vollständig, der
   "Mehr anzeigen"-Link entfällt. Im Einträge-Feed selbst bleibt die Kürzung wie bisher. */
#emailKachelDetailBody .hist-feed-preview {
  -webkit-line-clamp: unset; display: block; overflow: visible; cursor: auto;
}
#emailKachelDetailBody .hist-feed-toggle { display: none !important; }
/* Im Detailfenster steht nur EIN Eintrag - Avatar und Kopfzeile dürfen daher etwas mehr Luft
   bekommen, und der Mailtext wird eine Spur größer gesetzt als in der Listenvorschau. */
#emailKachelDetailBody .hist-feed-preview { font-size: 0.9rem; }
#emailKachelDetailBody .hist-feed-item { padding: 0; border: 0; }
.hist-feed-toggle { display: none; margin-top: 4px; font-size: 0.75rem; color: var(--primary-light); text-decoration: none; }
.hist-feed-toggle.visible { display: inline-block; }
.hist-feed-toggle:hover { text-decoration: underline; }
.hist-feed-attachment { margin-top: 8px; font-size: 0.8rem; color: var(--text-muted); }
.hist-feed-actions { display: flex; gap: 14px; margin-top: 8px; }
.hist-feed-action { font-size: 0.78rem; color: var(--primary-light); text-decoration: none; }
.hist-feed-action:hover { text-decoration: underline; }
.hist-feed-empty { color: var(--text-muted); font-size: 0.85rem; padding: 10px 0; }
/* Von Stephan gewünscht ("Einträge nur 15 Stück anzeigen, scrollbar machen, neuester oben"): fixe
   Höhe fürs Einträge-Feed auf der Auftragsseite (Route liefert bereits nur die letzten 15
   Einträge, siehe routes/projects.js) - eigener Scrollbalken statt die ganze Seite unnötig lang
   werden zu lassen. Auch von der neuen "E-Mail"-Kachel darunter mitgenutzt (email-kachel-liste). */
/* Von Stephan präzisiert (14.08.2026): Einträge auf 7 sichtbare Zeilen begrenzen, danach
   Scrollbalken. Die feste max-height ist der Rückfallwert; die exakte 7-Einträge-Grenze setzt das
   Script in partials/historie-feed.ejs (whtkHistFeedBegrenzen) anhand der echten Zeilenhöhen. */
.hist-feed-scroll { max-height: 640px; overflow-y: auto; padding-right: 4px; }
/* Kurzes Hervorheben des Ziel-Eintrags, wenn von der "E-Mail"-Kachel aus dorthin gesprungen wird
   (siehe scrollToHistItem() in views/projects/show.ejs). */
.hist-feed-item-highlight { animation: hist-feed-flash 1.6s ease; }
@keyframes hist-feed-flash {
  0% { background: #fff6d8; }
  100% { background: #fff; }
}
/* Von Stephan gewünscht: eigene "E-Mail"-Kachel unter der Historie (siehe views/projects/show.ejs) -
   kompakte Liste aus abgelegten E-Mails mit Von/An, Betreff (verlinkt auf den vollen Eintrag oben
   im Einträge-Feed) und Datum. */
/* Von Stephan festgelegt ("zweizeilig" + "Höhe auf 8 E-Mails"): jede Mail hat exakt zwei Zeilen -
   Zeile 1 Kopf (Von/An + Datum, 18px), Zeile 2 Betreff links + kursiver Abgelegt/Gesendet/
   Beantwortet-Vermerk rechts (20px, +3px Abstand). Mit 16px Innenabstand und 2px Rahmen sind das
   59px je Mail; acht Mails plus sieben 8px-Lücken = 528px - ab der neunten scrollt die Liste. */
.email-kachel-liste { display: flex; flex-direction: column; gap: 8px; max-height: 528px; overflow-y: auto; }
/* Von Stephan festgelegt ("zweizeilig"): Zeile 2 trägt links den Betreff und rechts - unter dem
   Datum aus Zeile 1 - kursiv, wer die Mail abgelegt/gesendet/beantwortet hat. */
.email-kachel-zeile2 { display: flex; align-items: baseline; gap: 10px; margin-top: 3px; }
.email-kachel-zeile2 .email-kachel-betreff { flex: 1; min-width: 0; margin-top: 0; }
.email-kachel-aktion {
  font-style: italic;
  font-size: 0.78rem;
  line-height: 20px;
  color: var(--text-muted);
  white-space: nowrap;
  flex: none;
}
.email-kachel-item {
  border: 1px solid var(--border); border-radius: var(--radius); padding: 8px 12px; background: #fff;
  flex: none;
}
.email-kachel-head { display: flex; align-items: baseline; gap: 6px; flex-wrap: nowrap; font-size: 0.78rem; line-height: 18px; color: var(--text-muted); }
.email-kachel-datum { white-space: nowrap; }
.email-kachel-betreff { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 20px; }
.email-kachel-richtung { font-weight: 700; color: var(--text); }
.email-kachel-gegenstelle { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.email-kachel-datum { white-space: nowrap; }
.email-kachel-betreff { display: block; margin-top: 3px; font-size: 0.87rem; color: var(--primary-light); text-decoration: none; }
.email-kachel-betreff:hover { text-decoration: underline; }

/* PDF-Vorschau-Popup (siehe partials/nav.ejs, openPdfViewer) - großes Modal fast über die ganze
   Seite, damit im eingebetteten (nativen) Browser-PDF-Viewer noch genug Platz zum Lesen/Zoomen bleibt. */
/* Bugfix (von Stephan gemeldet: "Bitte Fensterbreite so breit machen wie wenn die Datei auf 100%
   wäre"): 1100px reichte nicht, um eine Seite im eingebetteten Browser-PDF-Viewer bei 100% Zoom
   samt dessen eigener Thumbnail-Seitenleiste vollständig ohne Abschneiden darzustellen - analog zur
   bereits großzügiger dimensionierten .modal-box in partials/email-ablage-modal.ejs (max-width
   1500px) hier ebenfalls verbreitert. */
/* Bugfix (echter Fehler, von Stephan gemeldet: Angebot -> "Per E-Mail senden" -> Klick auf den
   Anhang zeigt nichts): das PDF-Vorschaufenster (#pdfViewerOverlay, siehe partials/nav.ejs) ist
   eine ganz normale .modal-overlay-Ebene (z-index 100) und steht im Quelltext GANZ OBEN im Body -
   wird es aus einem anderen, später im Body stehenden Popup heraus geöffnet (E-Mail-Fenster, siehe
   partials/email-ablage-modal.ejs), lag es bei gleichem z-index zwangsläufig DAHINTER und war nicht
   zu sehen. Das Vorschaufenster ist immer die oberste Ebene (es wird stets aus einer anderen Ansicht
   heraus aufgerufen und über seinen eigenen Schließen-Button wieder verlassen), daher hier
   ausdrücklich eine Ebene darüber. */
#pdfViewerOverlay { z-index: 200; }
.pdf-viewer-box { max-width: 1500px; width: 96vw; padding: 0; overflow: hidden; display: flex; flex-direction: column; height: 92vh; }
.pdf-viewer-header { padding: 12px 18px; border-bottom: 1px solid var(--border); margin-bottom: 0; flex: none; }
.pdf-viewer-header h3 { margin: 0; font-size: 0.95rem; }
.pdf-viewer-frame { flex: 1; width: 100%; border: 0; display: block; }

/* Bugfix (Software-Liste, "sauberes Mail-Popup"): die kleine <details>-Dropdown-Box zum Versenden
   von Angeboten/Rechnungen/Gutschriften (siehe views/quotes|invoices|creditNotes/show.ejs) war zu
   schmal, ließ sich nicht schließen und zeigte keinen Anhang - jetzt ein richtiges, breites Modal
   (siehe partials/email-modal.ejs), analog zum bestehenden Muster von .pdf-viewer-box oben. */
.email-modal-box { max-width: 680px; width: 96%; max-height: 92vh; overflow-y: auto; }
.email-modal-box textarea#emailModalBody { min-height: 220px; resize: vertical; }
.email-modal-toggle-row { display: flex; gap: 14px; margin: -6px 0 14px; }
.email-modal-toggle-row button {
  border: none; background: none; padding: 0; color: var(--primary); font-size: 0.82rem;
  cursor: pointer; text-decoration: underline;
}

/* Bugfix (Software-Liste, "Aufgabenvorlagen: Mitarbeiter-Auswahl") - Checkbox-Liste mit
   Mitarbeiter-Avataren, siehe views/taskTemplates/form.ejs. */
.employee-avatar-picker { display: flex; flex-wrap: wrap; gap: 10px; }
.employee-avatar-check {
  display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px 6px 8px;
  border: 1px solid var(--border); border-radius: 20px; cursor: pointer; font-weight: 400;
  text-transform: none; font-size: 0.85rem; color: var(--text); background: #fff;
}
.employee-avatar-check:has(input:checked) { border-color: var(--primary); background: #f6f6f6; }
.employee-avatar-check input { width: auto; margin: 0; }
.employee-avatar-circle {
  width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center;
  justify-content: center; color: #fff; font-size: 0.62rem; font-weight: 700; flex: none;
}

/* @Mention-Autocomplete (siehe partials/nav.ejs, initMentionTextarea) - fest positioniertes
   Dropdown direkt unter der Cursor-Position im Textfeld. */
.mention-dropdown {
  position: fixed;
  z-index: 3000;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 6px;
  box-shadow: 0 4px 16px rgba(0,0,0,0.15);
  min-width: 160px;
  max-height: 220px;
  overflow-y: auto;
  padding: 4px 0;
}
.mention-dropdown-item { padding: 7px 14px; font-size: 0.88rem; cursor: pointer; }
.mention-dropdown-item:hover { background: var(--bg-hover, #f0f2f5); }

/* E-Mail-Empfänger-Dropdown (siehe partials/nav.ejs, initRecipientPicker) - Kontaktbuch/
   Ansprechpartner-Auswahl mit Avatar-Kürzel/Gebäude-Icon statt der schlichten Browser-Datalist. */
.recipient-dropdown {
  position: fixed;
  z-index: 3000;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: 0 4px 16px rgba(0,0,0,0.15);
  max-height: 300px;
  overflow-y: auto;
  padding: 4px 0;
}
.recipient-dropdown-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; cursor: pointer; }
.recipient-dropdown-item:hover { background: var(--bg-hover, #f0f2f5); }
.recipient-avatar {
  flex: none;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.02em;
}
.recipient-avatar.recipient-avatar-firma { background: #6b7280; border-radius: 7px; font-size: 0.95rem; }
.recipient-info { display: flex; flex-direction: column; overflow: hidden; min-width: 0; }
.recipient-name { font-size: 0.86rem; font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.recipient-sub { font-size: 0.74rem; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Rechte-System (siehe middleware/auth.js + partials/nav.ejs): Sachbearbeiter sehen keine
   Löschen-Buttons/-Icons - serverseitig ist das Löschen ohnehin über requireNotSachbearbeiter
   gesperrt, dies blendet die dafür nutzlosen Buttons zusätzlich aus der Oberfläche aus. */
html.role-sachbearbeiter .btn-danger,
html.role-sachbearbeiter .btn-icon-danger,
html.role-sachbearbeiter .task-menu-danger,
html.role-sachbearbeiter .cal-appt-del {
  display: none !important;
}

/* Behörden-Antrag Feld-Designer (siehe views/authorityTemplates/designer.ejs) */
.designer-layout { display: flex; gap: 20px; align-items: flex-start; flex-wrap: wrap; }
.designer-canvas-wrap { flex: 1; min-width: 320px; overflow-x: auto; }
.designer-toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 12px; }
.designer-toolbar select, .designer-toolbar input[type="text"] { width: auto; }
.designer-fields-list { width: 280px; flex: none; }
.designer-fields-ul { list-style: none; padding: 0; margin: 0; border: 1px solid var(--border); border-radius: var(--radius); max-height: 500px; overflow-y: auto; }
.designer-fields-ul li { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; border-top: 1px solid var(--border); font-size: 0.85rem; }
.designer-fields-ul li:first-child { border-top: none; }

/* Aufträge: Ansichts-Umschalter (Spaltenansicht/Pipeline) + Pipeline-Kanban-Board
   (siehe views/projects/list.ejs, routes/projects.js) */
.view-toggle { display: flex; align-items: center; gap: 6px; margin-bottom: 14px; flex-wrap: wrap; }
.spalten-anpassen { position: relative; }
.spalten-anpassen summary { list-style: none; cursor: pointer; }
.spalten-anpassen summary::-webkit-details-marker { display: none; }
.spalten-anpassen-menu {
  position: absolute; right: 0; top: calc(100% + 4px); z-index: 20; min-width: 180px;
  padding: 10px 12px; display: flex; flex-direction: column; gap: 6px; box-shadow: 0 4px 14px rgba(0,0,0,0.14);
}
.spalten-anpassen-menu label { display: flex; align-items: center; gap: 8px; font-size: 0.85rem; font-weight: 400; }
.spalten-anpassen-menu input[type="checkbox"] { width: auto; }

.pipeline-board { display: flex; gap: 14px; overflow-x: auto; padding-bottom: 10px; align-items: flex-start; }
.pipeline-column {
  flex: 0 0 260px; width: 260px; background: #f8f8f8; border-radius: var(--radius);
  display: flex; flex-direction: column; max-height: calc(100vh - 260px);
}
.pipeline-column-header {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 10px 12px; border-top: 3px solid #8a94a6; border-radius: var(--radius) var(--radius) 0 0;
  background: #fff;
}
.pipeline-column-title { font-weight: 700; font-size: 0.88rem; }
.pipeline-column-count {
  background: #e3e7ee; color: var(--text-muted); border-radius: 10px; padding: 1px 8px; font-size: 0.78rem; font-weight: 700;
}
.pipeline-column-sum { padding: 4px 12px; background: #fff; }
.pipeline-column-body {
  flex: 1; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; min-height: 60px;
}
.pipeline-column-body.drag-over { background: #f0f0f0; outline: 2px dashed var(--primary, #8b8b8b); outline-offset: -2px; }
.pipeline-card {
  display: block; background: #fff; border-radius: var(--radius); padding: 10px 12px;
  box-shadow: 0 1px 2px rgba(0,0,0,0.08); text-decoration: none; color: var(--text); cursor: grab;
  border: 1px solid var(--border);
}
.pipeline-card:hover { box-shadow: 0 2px 6px rgba(0,0,0,0.12); }
.pipeline-card.dragging { opacity: 0.4; }
.pipeline-card-title { font-weight: 700; font-size: 0.88rem; margin-bottom: 2px; }
.pipeline-card-sub { line-height: 1.4; }
.pipeline-card-footer { display: flex; align-items: center; justify-content: space-between; margin-top: 8px; }
.pipeline-card-amount { font-size: 0.8rem; font-weight: 700; color: var(--text-muted); }

/* Sortierbare Spaltenüberschriften der Auftragsübersicht (von Stephan gewünscht:
   "sortierfunktion Aufsteigend und Absteigend in der Überschriften Zeile"). Die Überschrift bleibt
   optisch eine Überschrift - nur der Mauszeiger und der kleine Pfeil zeigen, dass sie klickbar ist. */
th .sort-link {
  color: inherit;
  text-decoration: none;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 3px;
}
th .sort-link:hover { text-decoration: underline; }
.sort-pfeil-inaktiv { opacity: 0.28; font-size: 0.75em; }
.sort-pfeil-aktiv { color: var(--primary, #111111); font-size: 0.75em; }

/* Kurzübersicht der Suchpräfixe rechts neben dem Suchfeld in der blauen Kopfzeile (von Stephan
   gewünscht: "Nur als Text damit man nachlesen kann was die Suche kann"). Bewusst sehr klein und
   zurückhaltend, damit sie die Kopfzeile nicht dominiert; auf schmalen Fenstern ausgeblendet. */
.search-hotkeys {
  font-size: 8pt;
  line-height: 1.25;
  color: rgba(255, 255, 255, 0.72);
  white-space: nowrap;
  margin-left: 10px;
}
.search-hotkeys b { color: #fff; font-weight: 600; }
@media (max-width: 1400px) { .search-hotkeys { display: none; } }

/* Selbst vergebene Überschriften in der Aufgabenliste (von Stephan gewünscht: "ich würde gerne
   Überschriften haben wollen ... damit es übersichtlicher wird"). Bewusst schlicht: eine kleine,
   halbfette Zeile mit Trennlinie über der jeweiligen Aufgabengruppe. */
.task-ueberschrift {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--primary, #111111);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  padding: 12px 2px 5px;
  margin-top: 4px;
  border-bottom: 1px solid var(--border, #dcdcdc);
}
.task-list > .task-ueberschrift:first-child { margin-top: 0; padding-top: 2px; }
.task-ueberschrift-anzahl {
  font-weight: 400;
  color: #8a8a8a;
  letter-spacing: 0;
}

/* Hoch/Runter-Pfeile je Aufgabenzeile (von Stephan gewünscht: "Und die Aufgaben verschiebbar
   machen"). Sehr schmal gehalten, damit die Zeile nicht breiter wird als bisher. */
.task-sortier-pfeile { display: inline-flex; flex-direction: column; line-height: 0.8; margin-right: 2px; }
.task-sortier-pfeile form { display: block; margin: 0; }
.task-sortier-pfeile .btn-icon { font-size: 9px; padding: 0 3px; height: 12px; min-height: 0; opacity: 0.55; }
.task-sortier-pfeile .btn-icon:hover { opacity: 1; }

/* Hoch/Runter-Pfeile in den Positions-/Aufgabentabellen (Aufgabenvorlagen) - Ergänzung zum
   Ziehen per Maus, siehe zeileVerschieben() in views/taskTemplates/form.ejs. */
.item-table td.zeile-pfeile { width: 26px; padding: 4px 2px; text-align: center; white-space: nowrap; }
.item-table td.zeile-pfeile .btn-icon { display: block; font-size: 10px; padding: 0 3px; height: 13px; min-height: 0; opacity: 0.6; }
.item-table td.zeile-pfeile .btn-icon:hover { opacity: 1; }

/* Belege von Eingangsrechnungen in den Kacheln "Rechnungen" und "Dokumente" (von Stephan
   gewünscht: "Eingangsrechnung bitte rote Schrift") - deutlich von den eigenen Ausgangsrechnungen
   abgesetzt, da es sich um Kosten und nicht um Umsatz handelt. */
a.eingangsrechnung-link, a.eingangsrechnung-link:visited { color: var(--danger, #c02b3f); }
a.eingangsrechnung-link:hover { color: var(--danger, #c02b3f); text-decoration: underline; }

/* Anwesenheits-Übersicht (Einstellungen -> Protokoll -> Anwesenheit), siehe utils/anwesenheit.js.
   Farbpunkt statt Text, damit der Zustand auf einen Blick erfassbar ist. */
.anwesend-punkt { display: inline-block; width: 9px; height: 9px; border-radius: 50%; vertical-align: middle; }
.anwesend-online { background: #2e9e4f; }
.anwesend-abwesend { background: #e0a91a; }
.anwesend-offline { background: #bdbdbd; }
/* Summenzeile der Anwesenheits-Tabelle. */
tr.anwesenheit-summe td { border-top: 2px solid var(--border, #dcdcdc); background: #f7f8fa; }

/* Jahresübersicht der Anwesenheitsseite: zwölf Monatsspalten, rechts abgesetzt die Jahreszahlen.
   Jede Monatszelle enthält alle drei Werte (Zeit/Aufträge/Angebote) - sichtbar ist immer nur der
   über den Umschalter gewählte, gesteuert über die Klasse "zeigt-..." an der Tabelle. */
.jahres-scroll { overflow-x: auto; }
.jahres-tabelle th, .jahres-tabelle td { white-space: nowrap; }
.jahres-tabelle .monat-spalte { text-align: right; }
.jahres-tabelle .monat-aktiv { background: #f2f4f8; }
.jahres-tabelle .jahr-spalte { text-align: right; border-left: 2px solid var(--border, #dcdcdc); }
.jahres-tabelle .wert { display: none; }
.jahres-tabelle.zeigt-zeit .wert-zeit,
.jahres-tabelle.zeigt-auftraege .wert-auftraege,
.jahres-tabelle.zeigt-angebote .wert-angebote { display: inline; }
.anwesenheit-umschalter { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Kreditor-Zeile unter dem Belegnamen in der Kachel "Debitoren/Kreditoren" (von Stephan gewünscht:
   eigene Zeile, eine Schriftgröße kleiner als der Dateiname darüber). */
.kreditor-hinweis { font-size: 0.78rem; }
/* Angeheftete Aufträge in der Auftragsübersicht (von Stephan gewünscht: "Projekte oben anpinnen").
   Die Nadel ist im Normalzustand blass und wird erst beim Überfahren deutlich - angeheftet ist sie
   dauerhaft farbig, damit die oberen Zeilen auf einen Blick als angeheftet erkennbar sind. */
.anheft-spalte { text-align: center; padding-left: 0; padding-right: 0; }
.anheft-spalte form { margin: 0; }
.anheft-knopf { opacity: 0.25; filter: grayscale(100%); font-size: 0.9rem; }
.anheft-knopf:hover { opacity: 0.7; filter: none; }
.anheft-knopf.ist-angeheftet { opacity: 1; filter: none; }
tr:has(.anheft-knopf.ist-angeheftet) > td { background: #fdf6ec; }
/* Von Stephan gewünscht (/kunden/196): "Kundenspezifische Preise" auf 15 sichtbare Zeilen begrenzen
   und darüber hinaus scrollbar machen - gleiches Muster wie .customer-list-scroll-8 weiter oben.
   Kopfzeile ~38px + 15 Datenzeilen à ~38px (.table-compact). */
.kundenpreise-scroll {
  max-height: 608px;
  overflow-y: auto;
}


/* ============================================================
   Meine Unterschrift (siehe views/unterschrift/index.ejs) - Zeichenfeld für den Prüfstempel
   der Eingangsrechnungen.
   ============================================================ */
.unterschrift-feld { position: relative; max-width: 600px; }
.unterschrift-feld canvas {
  width: 100%;
  height: 200px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #fff;
  cursor: crosshair;
  touch-action: none;
  display: block;
}
/* Hilfslinie wie auf einem Formular - macht klar, wo unterschrieben wird. */
.unterschrift-linie {
  position: absolute;
  left: 24px; right: 24px; bottom: 46px;
  border-bottom: 1px dashed #c3cbd8;
  pointer-events: none;
}
.unterschrift-vorhanden {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 10px 12px;
  background: #fcfcfc;
  margin-bottom: 16px;
  max-width: 600px;
}
.unterschrift-bild { display: block; max-height: 80px; max-width: 100%; margin-top: 6px; }

/* Rechnungsprüfung der Eingangsrechnungen (siehe views/projects/show.ejs) */
.er-pruefung { line-height: 1.35; }
.er-pruef-frei { color: var(--success); font-weight: 600; }
.er-pruef-wartet { color: #8a6d00; }
.er-pruef-abgelehnt { color: var(--danger); }
.erg-pruef-vorschau {
  width: 100%;
  height: 460px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #f4f6fa;
  margin-bottom: 12px;
}

/* Schnellfilter der Eingangsrechnungen (Alle / Wartend / Freigegeben) */
.pruef-filter { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.pruef-filter-knopf {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 12px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: #fff;
  color: var(--text);
  font-size: 0.82rem;
  text-decoration: none;
  transition: background 0.12s, border-color 0.12s;
}
.pruef-filter-knopf:hover { background: #f6f6f6; text-decoration: none; }
.pruef-filter-knopf.is-active { background: var(--primary); border-color: var(--primary); color: #fff; }
.pruef-filter-zahl {
  background: rgba(0, 0, 0, 0.08);
  border-radius: 999px;
  padding: 1px 7px;
  font-size: 0.74rem;
  font-weight: 600;
}
.pruef-filter-knopf.is-active .pruef-filter-zahl { background: rgba(255, 255, 255, 0.25); }

/* Stempel platzieren (siehe views/partials/stempel-platzieren.ejs).
   Von Stephan bemängelt ("Das Popup ist mega klein ich kann darauf nix erkennen") - das Fenster
   nimmt jetzt fast den ganzen Bildschirm ein und die Seite wird so groß wie möglich gezeigt. */
.stempel-platz-box {
  width: 96vw;
  max-width: 1500px;
  height: 94vh;
  display: flex;
  flex-direction: column;
}
.stempel-platz-leiste { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
.stempel-platz-trenner { flex: 1; }
/* Die Bühne nimmt den restlichen Platz ein; die Seite wird darin zentriert. */
.stempel-platz-rahmen {
  flex: 1;
  min-height: 0;
  overflow: auto;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #e7ebf2;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding: 12px;
}
.stempel-platz-buehne { position: relative; display: inline-block; box-shadow: 0 2px 14px rgba(0,0,0,0.18); }
.stempel-platz-buehne canvas { display: block; cursor: pointer; background: #fff; }
/* Der Stempel liegt sichtbar über der Seite - kräftiger Rahmen, damit klar ist, was verschoben
   wird, und leicht durchscheinend, damit man sieht, was darunter liegt. */
.stempel-platz-marke {
  position: absolute;
  display: none;
  cursor: grab;
  border: 3px solid #e80c29;
  box-shadow: 0 0 0 3px rgba(232,114,12,0.3), 0 4px 14px rgba(0,0,0,0.3);
  background: #fff center/100% 100% no-repeat;
  z-index: 5;
}
.stempel-platz-marke:active { cursor: grabbing; }
/* Das Stempelbild kommt als Hintergrund (siehe Skript) - so bleibt der Kasten immer sichtbar,
   auch falls das Bild einmal nicht lädt. */
/* Kleines Etikett am Stempel, damit sofort klar ist: das hier wird gesetzt. */
.stempel-platz-marke::after {
  content: 'Prüfstempel – hier ziehen';
  position: absolute;
  left: 0; top: -22px;
  background: #e80c29;
  color: #fff;
  font-size: 0.72rem;
  font-weight: 600;
  padding: 3px 8px;
  border-radius: 3px;
  white-space: nowrap;
}
.stempel-platz-fertig { display: flex; align-items: center; gap: 10px; }
/* Die Zoom-Knöpfe tragen nur ein Zeichen - feste Breite, damit sie gleich groß sind. */
.stempel-platz-leiste .btn-sm[title="Kleiner"],
.stempel-platz-leiste .btn-sm[title="Größer"] {
  min-width: 34px;
  font-weight: 700;
  font-size: 1rem;
  line-height: 1;
  padding: 5px 8px;
}

/* Kontakte: Typ-Auswahl als Punkte statt Dropdown (von Stephan gewünscht) sowie die Zeile für das
   Logo/Bild im Formular. */
.kontakt-typ-wahl { display: flex; gap: 22px; align-items: center; flex-wrap: wrap; padding: 2px 0 4px; }
.kontakt-typ-opt { display: inline-flex; align-items: center; gap: 7px; margin: 0; cursor: pointer;
  font-size: 0.92rem; font-weight: 400; color: var(--text); }
.kontakt-typ-opt input[type="radio"] { width: auto; margin: 0; accent-color: var(--accent); cursor: pointer; }
.kontakt-logo-zeile { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.kontakt-logo-vorschau { width: 48px; height: 48px; border: 1px solid var(--border); border-radius: 6px;
  background: #fff; display: flex; align-items: center; justify-content: center; overflow: hidden; flex: none; }

/* Kontaktseite: Kopfzeile mit Bild sowie die überarbeitete Kachel "Kontaktdaten". */
.kontakt-kopf { display: flex; align-items: center; gap: 14px; }
.kontakt-kopf-bild { width: 52px; height: 52px; border: 1px solid var(--border); border-radius: 8px;
  background: #fff; display: flex; align-items: center; justify-content: center; overflow: hidden; flex: none; }
.kontakt-nr { font-size: 14pt; font-style: italic; line-height: 1.2; }
.kontakt-nr-firma { color: #1f6b3b; }
.kontakt-nr-privat { color: #b50f25; }
/* Von Stephan vorgegeben: dieselbe Kopfzeile bei Lieferanten und Behörden - Lieferant lila,
   Behörde (und "Lieferant & Behörde") blau, beide rund 30 % heller als der erste Entwurf. */
.kontakt-nr-lieferant { color: #8c71ab; }
.kontakt-nr-behoerde { color: #5d80a5; }
.kontakt-adressblock { background: var(--bg); border-radius: var(--radius); padding: 12px 14px;
  margin-bottom: 12px; position: relative; }
.kontakt-adressblock p { margin: 0; font-size: 0.92rem; line-height: 1.55; }
.kontakt-adressblock .kontakt-karte-link { position: absolute; right: 10px; top: 10px; font-size: 0.78rem; }
.kontakt-zeile { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-top: 1px solid var(--border); }
.kontakt-zeile:first-of-type { border-top: none; }
.kontakt-zeile-sym { width: 20px; text-align: center; flex: none; color: var(--text-muted); font-size: 0.95rem; }
.kontakt-zeile-bez { width: 118px; flex: none; font-size: 0.78rem; color: var(--text-muted); }
.kontakt-zeile-wert { font-size: 0.92rem; word-break: break-word; }
.kontakt-notiz { margin-top: 14px; padding: 10px 12px; background: #fdf6e3; border-radius: var(--radius); }
.kontakt-notiz p { margin: 0; font-size: 0.85rem; line-height: 1.5; color: #7a5c05; }
.kontakt-notiz span { display: block; font-size: 0.7rem; font-weight: 600; margin-bottom: 3px; }

/* Kontaktliste: Bildspalte, Kundennummer und offene Posten. */
.kunden-bild { width: 26px; height: 26px; border: 1px solid var(--border); border-radius: 5px; background: #fff;
  display: flex; align-items: center; justify-content: center; overflow: hidden; }
.kunden-nr { font-style: italic; white-space: nowrap; }
.kunden-nr-firma { color: #1f6b3b; }
.kunden-nr-privat { color: #b50f25; }
/* Gleiche Bildspalte und farbige Nummer in der Lieferanten-/Behördenliste. */
.kunden-nr-lieferant { color: #8c71ab; }
.kunden-nr-behoerde { color: #5d80a5; }
.kunden-anzahl { display: inline-block; min-width: 24px; text-align: center; background: var(--bg);
  border-radius: 20px; padding: 2px 8px; font-weight: 600; font-size: 0.78rem; }
/* Von Stephan vorgegeben: eine Schriftgröße kleiner als die Tabelle, kursiv und rot. */
.kunden-op { font-size: 0.72rem; font-style: italic; color: #e01d37; white-space: nowrap; }
.kunden-op-null { font-size: 0.72rem; color: var(--text-muted); }
.kunden-treffer { display: block; font-size: 0.72rem; color: var(--text-muted); margin-top: 2px; }
.kunden-treffer mark { background: #fdf0c8; color: #6b4b02; border-radius: 3px; padding: 0 3px; }
/* Zeilenmenü mit Öffnen/Bearbeiten - ohne eigenes Skript, allein über <details>. */
.kunden-menue { position: relative; display: inline-block; }
.kunden-menue > summary { list-style: none; cursor: pointer; }
.kunden-menue > summary::-webkit-details-marker { display: none; }
.kunden-menue-inhalt { position: absolute; right: 0; top: calc(100% + 4px); z-index: 20; min-width: 132px;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: 0 6px 18px rgba(0,0,0,0.12); padding: 4px; text-align: left; }
.kunden-menue-inhalt a { display: block; padding: 7px 10px; border-radius: 5px; font-size: 0.85rem;
  color: var(--text); text-decoration: none; white-space: nowrap; }
.kunden-menue-inhalt a:hover { background: var(--bg); }

/* Feld-Designer: gesetzte Felder maßstabsgetreu.
   Vorgeschichte: erst Punkte (Stephan: "das mit den Punkten ist schlecht, da ich nicht sehe wo ich
   was hinpacke"), dann beschriftete Kästchen - die aber ihre eigene Größe hatten und um Rahmen und
   Innenabstand neben dem Klickpunkt lagen (Stephan: "es ist alles verzogen ... wie soll ich denn
   das perfekt positionieren?").
   Jetzt gilt: Höhe = Versalhöhe der gedruckten Schrift, Breite = gemessene Textbreite, linke Kante
   = Textanfang, senkrechte Mitte = Klickpunkt. Beides wird in designer.ejs aus fontSize und dem
   Darstellungsmaßstab berechnet, hier steht nur das Aussehen. Der Kasten bleibt durchscheinend,
   damit die Linie des Formulars darunter sichtbar bleibt. */
.designer-feld {
  position: absolute;
  display: flex;
  align-items: center;
  box-sizing: content-box;
  background: rgba(224, 121, 26, 0.10);
  border: 1px dashed rgba(224, 121, 26, 0.85);
  color: #1a1a1a;
  font-family: Helvetica, Arial, sans-serif;
  line-height: 1;
  white-space: nowrap;
  cursor: grab;
  z-index: 4;
}
.designer-feld:hover { background: rgba(224, 121, 26, 0.20); }
.designer-feld:active { cursor: grabbing; }
/* Das ausgewählte Feld ist deutlich hervorgehoben - alle anderen bleiben zurückhaltend, damit die
   Vorlage lesbar bleibt und nicht mit Kästen zugepflastert ist. */
.designer-feld.ist-gewaehlt {
  background: rgba(224, 121, 26, 0.18);
  border: 1px solid #e01a34;
  box-shadow: 0 0 0 1px rgba(224, 121, 26, 0.35);
  z-index: 6;
}
.designer-feld-text {
  pointer-events: none;
  overflow: visible;
}
/* Beschriftung als kleine Fahne über dem Kasten - nur beim Überfahren und beim ausgewählten Feld. */
.designer-feld-fahne {
  position: absolute;
  bottom: 100%;
  left: -1px;
  margin-bottom: 2px;
  display: none;
  padding: 1px 5px;
  background: #e01a34;
  color: #fff;
  font-family: inherit;
  font-size: 0.68rem;
  line-height: 1.35;
  border-radius: 2px;
  white-space: nowrap;
  pointer-events: none;
  z-index: 7;
}
.designer-feld:hover .designer-feld-fahne,
.designer-feld.ist-gewaehlt .designer-feld-fahne { display: block; }

/* Fadenkreuz quer über die ganze Seite: damit ein Wert genau auf einer Linie des Formulars oder in
   einer Tabellenspalte sitzt. */
.designer-hilfslinie {
  position: absolute;
  display: none;
  background: rgba(0, 122, 204, 0.55);
  pointer-events: none;
  z-index: 5;
}
.designer-hilfslinie-quer { left: 0; right: 0; height: 1px; }
.designer-hilfslinie-hoch { top: 0; bottom: 0; width: 1px; }

/* Einstellungen zum ausgewählten Feld (rechte Spalte). */
.designer-auswahl {
  margin-top: 12px;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #fcfcfc;
}
.designer-auswahl-titel { font-weight: 700; font-size: 0.9rem; margin-bottom: 8px; }
.designer-auswahl-hinweis { margin-top: 6px; line-height: 1.4; }
.designer-auswahl .btn { margin-top: 10px; }
.designer-inline-label {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 0;
  font-size: 0.8rem;
  color: var(--text-muted);
  font-weight: 600;
}
.designer-inline-label input[type="number"] { width: 72px; margin: 0; }
.designer-fields-ul li.ist-gewaehlt { background: rgba(224, 121, 26, 0.12); }
.designer-listen-name { cursor: pointer; }
.designer-listen-name:hover { text-decoration: underline; }
.designer-canvas-wrap { min-width: 0; }
.designer-toolbar .btn-sm[title="Kleiner"],
.designer-toolbar .btn-sm[title="Größer"] { min-width: 34px; font-weight: 700; font-size: 1rem; line-height: 1; padding: 5px 8px; }


/* Bestellungen (siehe routes/purchaseOrders.js). Filter als schmales Ausklappmenü, Status als
   farbiges Schild, archivierte Zeilen durchgestrichen - alles von Stephan so vorgegeben. */
.bestell-filter { width: 190px; max-width: 190px; height: 30px; padding: 0 8px; font-size: 0.72rem; }
.bestell-status { display: inline-block; font-size: 0.68rem; font-weight: 600; padding: 2px 8px;
  border-radius: 20px; white-space: nowrap; }
.bestell-status-offen { background: #eceff3; color: #4a5568; }
.bestell-status-wartet { background: #fdf1d6; color: #7a5c05; }
.bestell-status-frei { background: #e6f4ea; color: #1e7d43; }
.bestell-status-abgelehnt { background: #fbe8eb; color: #b31e32; }
.bestell-status-bestellt { background: #f0f0f0; color: #5e5e5e; }
.bestell-status-geliefert,
.bestell-status-erledigt { background: #eceff3; color: #7a8290; }
.bestell-archiv td { text-decoration: line-through; color: var(--text-muted); }
.bestell-archiv td .bestell-status { text-decoration: none; }


/* ==========================================================================
   Von Stephan gewünscht ("Dann bitte alle Buttons eckiger machen nicht so rund. Alle Eingabefelder
   ebenfalls eckig machen und nicht so rund."): Knöpfe und Eingabefelder bekommen nur noch eine
   leichte Kantenrundung von 3 px statt der bisherigen 8 px (--radius). Karten, Kacheln und Popups
   behalten ihre Rundung, damit die Seite nicht kantig wirkt.
   Steht bewusst am Ende der Datei, damit es die weiter oben stehenden Einzelregeln überstimmt.
   ========================================================================== */
.btn,
.btn-sm,
.btn-mini,
.btn-icon,
.btn-icon-sm,
button,
input,
select,
textarea,
.status-picker summary .badge,
.karten-reiter-knopf {
  border-radius: 3px;
}
/* Runde Elemente, die rund bleiben MÜSSEN (Avatare, Punkte, Zähler-Pillen). */
.task-avatar,
.task-bullet,
.kunden-anzahl,
.aufgaben-block-anzahl,
.corr-chip,
input[type="checkbox"],
input[type="radio"] {
  border-radius: 50%;
}
.kunden-anzahl, .aufgaben-block-anzahl, .corr-chip { border-radius: 20px; }

/* Von Stephan gewünscht ("Ebenfalls die Blöcke Angebot, Rechnungen etc. etwas höher machen, so als
   ob 3 Dokumente angezeigt werden"): die vier kompakten Blöcke unter der Kalkulation bekommen eine
   Mindesthöhe, die drei Zeilen Platz lässt - dadurch stehen sie auch bei leerem Inhalt gleich hoch
   nebeneinander. */
.bloecke-kompakt .card { min-height: 168px; }

/* Drag & Drop der Aufgaben (siehe public/js/aufgaben-dnd.js). */
.task-row.task-row-kompakt { cursor: grab; }
.task-row.task-row-kompakt.wird-gezogen { opacity: 0.45; cursor: grabbing; }
.aufgaben-block-inhalt.dnd-ziel { background: #fff6e8; outline: 2px dashed #ff9500; outline-offset: -2px; }


/* Von Stephan gewünscht ("bitte die Buttons einheitlich gestalten" und "du sollst den Farbverlauf
   in die Buttons einfügen"): alle Knöpfe einheitlich im Verlaufsstil. WHTK (19.08.2026): der
   Verlauf ist jetzt das Kirsten-Rot (Aktionsfarbe des Schwarz/Rot-Schemas) statt des VeMa-Blaus.
   Löschen bleibt als deutlich dunkleres Weinrot erkennbar, Sperren bleibt schwarz.
   Steht am Ende der Datei, damit es die weiter oben stehenden Einzelregeln überstimmt. */
.btn,
.btn-sm,
.btn-secondary,
.btn-mini,
.btn-blau,
.btn-gold {
  background: linear-gradient(180deg, #f2545c, #c40510);
  border: 1px solid #96040d;
  color: #fff;
  text-shadow: none;
}
.btn:hover,
.btn-sm:hover,
.btn-secondary:hover,
.btn-mini:hover,
.btn-blau:hover,
.btn-gold:hover {
  background: linear-gradient(180deg, #f76b72, #d90612);
  border-color: #96040d;
  color: #fff;
  text-decoration: none;
}
/* Ausnahmen: Löschen als dunkles Weinrot klar vom roten Standardknopf unterscheidbar,
   Sperren bleibt schwarz - jeweils im selben Verlaufsstil. */
.btn-danger { background: linear-gradient(180deg, #8f1e2c, #5f0a14); border-color: #4a0710; color: #fff; }
.btn-danger:hover { background: linear-gradient(180deg, #a32b3a, #73101c); border-color: #4a0710; color: #fff; }
/* Von Stephan gemeldet ("Kunde sperren bitte noch schwarzen Button mit Verlauf anpassen"): der
   Knopf war ursprünglich schwarz (siehe .btn-sperren weiter oben), wurde hier bei der Umstellung
   aller Knöpfe auf Farbverläufe aber versehentlich in Gold geändert. Jetzt wieder schwarz - mit
   Verlauf wie die übrigen Knöpfe. */
.btn-sperren { background: linear-gradient(180deg, #4a4a4a, #111111); border-color: #000; color: #fff; }
.btn-sperren:hover { background: linear-gradient(180deg, #5f5f5f, #262626); border-color: #000; color: #fff; }
/* Deaktivierte Knöpfe bleiben erkennbar ausgegraut. */
.btn:disabled, .btn-sm:disabled, .btn-secondary:disabled, .btn-mini:disabled {
  background: linear-gradient(180deg, #c4c4c4, #a0a0a0); border-color: #949494; color: #f4f4f4; cursor: default;
}
/* In der kompakten Aufgabenzeile bleibt das ⋮ dezent - ein blauer Knopf je Zeile wäre zu unruhig. */
.task-row.task-row-kompakt .btn-icon {
  background: transparent; background-image: none; border-color: transparent; color: var(--text-muted);
}
.task-row.task-row-kompakt .btn-icon:hover {
  background: linear-gradient(180deg, #969696, #575757); border-color: #414141; color: #fff;
}

/* Bugfix (von Stephan gemeldet, /kalender: "Dropdownmenü bitte noch fixen. Soll alles sauber
   untereinander sein"): im Kategorie-Menü stehen die Häkchen in <label>-Zeilen. Die allgemeine
   Regel "input { width: 100% }" hat auch die Auswahlkästchen auf volle Breite gezogen - dadurch
   rutschte die Beschriftung nach rechts und jede Zeile sah anders aus. Die Kästchen bekommen hier
   ihre feste Größe zurück, Kästchen und Text stehen linksbündig nebeneinander. */
.cal-kategorie-menu label.assignee-picker-option {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  text-align: left;
  padding: 6px 10px;
  white-space: normal;
}
.cal-kategorie-menu input[type="checkbox"] {
  width: 16px;
  height: 16px;
  flex: none;
  margin: 0;
  padding: 0;
}



/* Monatsansicht der Anwesenheit (siehe views/settings/anwesenheit.ejs). */
.tag-spalte { min-width: 44px; text-align: center; }
.tag-wochentag { font-size: 0.62rem; color: var(--text-muted); font-weight: 400; }
.tag-wochenende { background: #f6f4f0; }


/* Bugfix (von Stephan gemeldet, mit Screenshots): die reinen Symbol-Knöpfe (📍 Maps, ✉, ↗, 🗑 und
   die Häkchen-Kästchen daneben) hatten durch die Verlaufsregel oben plötzlich große blaue Flächen -
   das Symbol war darin kaum noch zu erkennen. Sie bekommen ihr dezentes Aussehen zurück: weißer
   Grund, dünner blauer Rand, blaues Symbol. Der Farbverlauf gilt damit nur noch für die richtigen
   Knöpfe mit Beschriftung. */
.btn-icon, .btn-icon-sm {
  background: #fff;
  background-image: none;
  border: 1px solid #9fb0cc;
  color: var(--primary);
  text-shadow: none;
}
.btn-icon:hover, .btn-icon-sm:hover {
  background: #eef1f7;
  background-image: none;
  border-color: var(--primary);
  color: var(--primary);
}
/* Häkchen-Kästchen bleiben eckig und in Systemgröße - rund sahen sie wie Knöpfe aus. */
input[type="checkbox"], input[type="radio"] { border-radius: 2px; }
input[type="radio"] { border-radius: 50%; }


/* Mitarbeiter-Formular: Zusatzgruppen zugeklappt hinter "Erweitert" (siehe views/users/form.ejs). */
.zusatzrollen { border: 1px solid var(--border); border-radius: var(--radius); padding: 10px 12px; }
.zusatzrollen-titel { cursor: pointer; font-size: 0.82rem; font-weight: 600; color: var(--text-muted);
  list-style: none; display: flex; align-items: center; gap: 8px; }
.zusatzrollen-titel::-webkit-details-marker { display: none; }
.zusatzrollen-titel::before { content: '▸'; font-size: 0.7rem; }
.zusatzrollen[open] .zusatzrollen-titel::before { content: '▾'; }
.zusatzrollen-hinweis { background: var(--accent); color: #fff; border-radius: 20px; padding: 1px 8px;
  font-size: 0.68rem; font-weight: 700; }

/* Von Stephan gemeldet ("/einstellungen/rechte - der Style ist ungenau"): saubere Ausrichtung der
   Rechtetabellen - Häkchen und Auswahlfelder mittig, einheitliche Zeilenhöhe, ruhigere Trennlinien,
   erste Spalte beim seitlichen Scrollen stehend. Der Aufbau der Seite bleibt unverändert. */
.rechte-tabelle td, .rechte-tabelle th { padding: 7px 10px; vertical-align: middle; }
.rechte-tabelle th { white-space: nowrap; }
.rechte-tabelle td:first-child, .rechte-tabelle th:first-child {
  position: sticky; left: 0; background: #fff; z-index: 2; text-align: left; min-width: 220px;
}
.rechte-tabelle thead th:first-child { background: #f7f5f1; z-index: 3; }
.rechte-tabelle input[type="checkbox"] { width: 16px; height: 16px; margin: 0; display: inline-block; }
.rechte-tabelle td.mittig, .rechte-tabelle th.mittig { text-align: center; }
.rechte-tabelle select { width: auto; min-width: 120px; }
.rechte-tabelle tbody tr:nth-child(even) td { background: #fbfaf8; }
.rechte-tabelle tbody tr:nth-child(even) td:first-child { background: #fbfaf8; }


/* Von Stephan gewünscht ("die Zeile Überschrift soll fest im Fenster bleiben"): Die
   Spaltenüberschriften der Auftragsliste bleiben beim Herunterscrollen oben stehen. Zusätzlich
   bleiben angeheftete Aufträge direkt darunter sichtbar, statt nach oben aus dem Bild zu laufen -
   man sieht sie also immer, egal wie weit man scrollt. */
/* Wichtig: mit "border-collapse: collapse" ignorieren Browser das Feststellen der Kopfzeile.
   Deshalb hier getrennte Rahmen - das Aussehen bleibt gleich, die Linien kommen über box-shadow. */
.auftragsliste { border-collapse: separate; border-spacing: 0; }
.auftragsliste th, .auftragsliste td { border-bottom: none; box-shadow: inset 0 -1px 0 var(--border); }
/* Von Stephan gewünscht ("/auftraege - Ansicht optisch anpassen - Spalten gleichmäßiger in der
   Breite verteilen"): die Tabelle verteilte die Breite bisher automatisch nach Inhalt. Dadurch zog
   "Bauvorhaben" mit seinen langen Bezeichnungen fast ein Drittel der gesamten Breite an sich,
   während kurze Spalten wie "Hausnummer" trotzdem breit dastanden und zwischen Straße und Ort
   große Lücken blieben. Mit fester Aufteilung (table-layout: fixed) bekommt jede Spalte einen
   festen Anteil, der zur tatsächlichen Inhaltslänge passt - unabhängig davon, wie lang eine
   einzelne Bezeichnung gerade ist. Die Anteile ergeben zusammen 100 %, die Tabelle bleibt also
   exakt so breit wie das Fenster.
   Zu lange Inhalte werden mit … abgekürzt statt die Spalte zu sprengen; der vollständige Text
   steht weiterhin im Auftrag selbst (und im title-Tooltip, siehe views/projects/list.ejs).
   Die drei schmalen Spalten am Anfang (Auswahl-Häkchen, Nadel, Ersteller-Avatar) behalten ihre
   festen Pixelbreiten aus dem Template. */
.auftragsliste { table-layout: fixed; width: 100%; }
.auftragsliste thead th, .auftragsliste tbody td { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.auftragsliste tbody td a { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; white-space: nowrap; }
/* Von Stephan mehrfach nachgeschärft, zuletzt: "Beginn schneidet den Text vom Bauvorhaben ab" und
   "Wenn Spalten ausgewählt werden, dann skaliert die Breite nicht gleichmäßig".
   Aufteilung in zwei Gruppen, an den ECHTEN Inhalten der Liste ausgemessen (156 Aufträge, 12 px
   Schrift) - anschließend im Browser nachgemessen, dass keine einzige Zelle mehr abgeschnitten wird:
   1. Alles mit fester Länge bekommt feste Pixel, exakt auf Inhaltsbreite: Häkchen/Nadel/Avatar,
      P-Nr., Beginn/Ende (TT.MM.JJJJ), Hnr., PLZ, Status/Antrag (Knopf) und die Aktionsspalte
      (Öffnen + Bearbeiten). Damit sind die großen Lücken zwischen Straße/Hnr., PLZ/Ort und
      Beginn/Ende weg.
   2. Nur die vier echten Textspalten teilen sich den Rest: Bauvorhaben 56 %, Kunde 17 %,
      Straße 15 %, Ort 12 %. Das Bauvorhaben ist die mit Abstand längste Spalte und bekommt deshalb
      den größten Anteil - genau die wurde vorher abgeschnitten.
   WICHTIG (in Chrome nachgemessen): eine Breite der Form calc((100% - X) * Faktor) wird bei
   table-layout:fixed NICHT angewendet - die betroffenen Spalten fallen dann auf "gleich breit"
   zurück, was das Bauvorhaben erneut abgeschnitten hätte. Eine reine Prozentangabe funktioniert
   dagegen einwandfrei. Die vier Anteile unten sind daher nur der Startwert für den Seitenaufbau;
   den exakten Prozentwert (und die Neuberechnung beim Ein-/Ausblenden einer Spalte sowie beim
   Ändern der Fensterbreite) setzt spaltenBreitenSetzen() in views/projects/list.ejs. */
/* Von Stephan auf Rückfrage festgelegt und danach auf 13 px nachjustiert ("/auftraege -
   Schriftgröße auf 13 px setzen"): Tabellenschrift 13 px statt der ursprünglichen 14,72 px,
   Spaltenüberschriften 11 px. Gilt nur für diese Tabelle. */
.auftragsliste tbody td { font-size: 13px; line-height: 1.35; }
.auftragsliste thead th { font-size: 11px; }
.auftragsliste tbody td.small, .auftragsliste tbody td .small { font-size: 13px; }
.auftragsliste {
  --sp-auswahl: 34px;
  --sp-pin: 30px;
  --sp-avatar: 42px;
  --sp-pnr: 78px;
  --sp-beginn: 92px;
  --sp-ende: 92px;
  --sp-hausnummer: 68px;
  --sp-plz: 60px;
  --sp-status: 112px;
  --sp-antrag: 112px;
  --sp-aktionen: 196px;
}
.auftragsliste thead th:nth-child(1) { width: var(--sp-auswahl); }
.auftragsliste thead th:nth-child(2) { width: var(--sp-pin); }
.auftragsliste thead th:nth-child(3) { width: var(--sp-avatar); }
.auftragsliste thead th[data-col="pnr"]         { width: var(--sp-pnr); }
.auftragsliste thead th[data-col="beginn"]      { width: var(--sp-beginn); }
.auftragsliste thead th[data-col="ende"]        { width: var(--sp-ende); }
.auftragsliste thead th[data-col="hausnummer"]  { width: var(--sp-hausnummer); }
.auftragsliste thead th[data-col="plz"]         { width: var(--sp-plz); }
.auftragsliste thead th[data-col="status"]      { width: var(--sp-status); }
.auftragsliste thead th[data-col="antrag"]      { width: var(--sp-antrag); }
.auftragsliste thead th[data-col="aktionen"]    { width: var(--sp-aktionen); }
/* Startwerte, bis spaltenBreitenSetzen() in views/projects/list.ejs den genauen Wert einsetzt. */
.auftragsliste thead th[data-col="bauvorhaben"] { width: 30%; }
.auftragsliste thead th[data-col="kunde"]       { width: 12%; }
.auftragsliste thead th[data-col="strasse"]     { width: 10%; }
.auftragsliste thead th[data-col="ort"]         { width: 8%; }
/* Die Nadel steht damit direkt neben dem Auswahl-Häkchen statt mittig in einer breiten Spalte. */
.auftragsliste td.anheft-spalte { padding-left: 0; padding-right: 0; text-align: center; }
/* Die blaue Kopfleiste von WHTK steht fest ganz oben (--header-height). Die Tabellenüberschrift
   muss deshalb DARUNTER einrasten - bei top:0 verschwand sie hinter der Leiste, deshalb sah es aus,
   als würde sie gar nicht kleben. */
.auftragsliste thead th {
  position: sticky;
  top: var(--header-height, 58px);
  z-index: 5;
  background: #f7f5f1;
  box-shadow: inset 0 -1px 0 var(--border), 0 2px 4px rgba(0,0,0,0.06);
}
.auftragsliste tbody tr.ist-angepinnt > td {
  position: sticky;
  /* Höhe der Kopfzeile plus der bereits darüber stehenden angehefteten Zeilen (siehe --pin-oben
     in views/projects/list.ejs), damit mehrere Angeheftete sauber untereinander stehen bleiben. */
  top: calc(var(--header-height, 58px) + var(--pin-oben, 38px));
  z-index: 4;
  background: #fff7ec;
  box-shadow: 0 1px 0 var(--border);
}

/* Von Stephan gemeldet ("/aufgaben - warum wird die Seite nur mit 5-Zeilen-Blöcken erstellt, ich
   habe eine ganze Seite frei?"): Die Höhenbegrenzung auf 5 Zeilen ist für den Aufgaben-Block im
   Auftrag gedacht, wo darunter noch Auftragsdaten, Beweislisten und mehr stehen. Auf der eigenen
   Aufgabenübersicht gibt es diese Begrenzung nicht - die Blöcke werden so hoch wie nötig und die
   Seite scrollt wie gewohnt. */
.aufgaben-voll .aufgaben-block-inhalt { max-height: none; overflow: visible; }
/* Von Stephan gewünscht ("https://vsswhtk.de/aufgaben - Die Blöcke untereinander Auflisten
   lassen"): Genehmigung/Dispo/Buchhaltung/Allgemein stehen auf der eigenen Aufgabenübersicht jetzt
   untereinander statt nebeneinander - jeder Block über die volle Breite, dadurch bleibt bei langen
   Auftragsbezeichnungen nichts mehr abgeschnitten. Die nebeneinander liegende Vierer-Aufteilung
   (.aufgaben-bloecke oben) bleibt für den Aufgaben-Block IM AUFTRAG und in der Dealsphase
   unverändert bestehen - dort ist sie ausdrücklich so gewünscht. */
.aufgaben-voll .aufgaben-bloecke { grid-template-columns: minmax(0, 1fr); }

/* Von Stephan vorgegeben ("/aufgaben - Überschrift eine Schriftgröße größer, etwas kompakter,
   Beschreibung als kleineren Text in Grau, Projekt in Kursiv in Grau ganz unten, Angelegt von ()
   auch in Kursiv hinten dran, Statusbalken etwas breiter"): gilt AUSSCHLIESSLICH für die eigene
   Aufgabenübersicht (.aufgaben-voll, siehe views/tasks/list.ejs) - die schmalen Aufgabenkacheln im
   Auftrag und in der Dealsphase behalten unverändert ihre bisherige, engere Darstellung. */
.aufgaben-voll .task-row.task-row-kompakt {
  /* "Etwas kompakter, nicht viel": die feste Mindesthöhe entfällt, die Zeile richtet sich nach
     ihrem Inhalt (Titel + ggf. Beschreibung + Fußzeile) und bekommt nur noch schmale Luft. */
  min-height: 0;
  padding: 4px 8px;
  align-items: center;
}
.aufgaben-voll .task-row.task-row-kompakt .task-title {
  /* Von Stephan zweimal je eine Stufe angehoben: 12 px -> 13 px -> 14 px. */
  font-size: 14px;
  line-height: 1.25;
}
/* Beschreibung ("Bemerkung"): grau und kleiner als die Überschrift, eine Zeile - längere Texte
   werden mit … abgekürzt, damit die Zeilenhöhe gleich bleibt. Der volle Text steht weiterhin im
   Bearbeiten-Popup. Von Stephan nachgereicht ("Bemerkung auch 1 Größer"): 10,5 px -> 11,5 px.
   Die Fußzeile darunter (Auftrag + Angelegt von) bleibt ausdrücklich unverändert ("Auftrag
   lassen"). */
.aufgaben-voll .task-row.task-row-kompakt .task-beschreibung {
  display: block;
  font-size: 11.5px;
  line-height: 1.25;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* Fußzeile ganz unten: Auftrag und "Angelegt von (…)" nebeneinander, beides kursiv und grau. */
.aufgaben-voll .task-row.task-row-kompakt .task-fusszeile {
  display: flex;
  gap: 8px;
  align-items: baseline;
  min-width: 0;
  font-size: 10.5px;
  line-height: 1.25;
  font-style: italic;
  color: var(--text-muted);
}
.aufgaben-voll .task-row.task-row-kompakt .task-fuss-projekt {
  color: var(--text-muted);
  text-decoration: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.aufgaben-voll .task-row.task-row-kompakt .task-fuss-projekt:hover { text-decoration: underline; }
.aufgaben-voll .task-row.task-row-kompakt .task-fuss-ersteller { white-space: nowrap; flex: none; }
/* Statusbalken etwas breiter (bisher 66 px) - die Spaltenbreite rechts zieht mit, damit weiterhin
   alle Zeilen exakt untereinander stehen. */
.aufgaben-voll .task-row.task-row-kompakt .task-row-right { grid-template-columns: 28px 56px 92px 24px; }
.aufgaben-voll .task-row.task-row-kompakt .task-status-picker summary .badge { width: 92px; }

/* Von Stephan gewünscht: zwei Zähler neben der Überschrift der Baustellen-Übersicht -
   Halteverbote blau, Baustellen orange. */
.dash-zaehler-reihe { display: flex; gap: 10px; flex-wrap: wrap; }
.dash-zaehler { display: inline-flex; align-items: center; gap: 10px; padding: 7px 14px;
  border-radius: 3px; color: #fff; font-size: 0.86rem; font-weight: 600; text-decoration: none; }
.dash-zaehler:hover { text-decoration: none; filter: brightness(1.08); color: #fff; }
.dash-zaehler-wert { background: rgba(255,255,255,0.28); border-radius: 20px; padding: 1px 10px; font-weight: 700; }
.dash-zaehler-hv { background: linear-gradient(180deg, #969696, #575757); border: 1px solid #414141; }
.dash-zaehler-bs { background: linear-gradient(180deg, #ffab3d, #e08000); border: 1px solid #b86800; }
/* Seit das Dashboard im Listen-Stil (.al2) läuft, überschreibt dessen Verweis-Farbe die weiße
   Schrift der beiden Zähler - sie wirkten dadurch grau (Stephan, 16.08.2026: "Aktive Halteverbote
   im Button muss weiß sein, genauso wie Aktive Baustellen"). Diese Regel ist genauer und gewinnt. */
.al2 .dash-zaehler,
.al2 .dash-zaehler:hover,
.al2 .dash-zaehler:visited,
.al2 .dash-zaehler .dash-zaehler-wert { color: #fff; }

/* Von Stephan gewünscht ("BAST-Button in einem Rotverlauf setzen, Abbau-Button in einem Gelbverlauf
   mit schwarzer Schrift"): die beiden xRouten-Knöpfe im Auftrag bekommen einen Farbverlauf wie die
   übrigen Knöpfe, nur in ihrer eigenen Farbe. Steht am Ende der Datei, damit es die allgemeine
   Knopf-Regel weiter oben überstimmt. */
.btn-rot, .btn.btn-rot, .btn-sm.btn-rot {
  background: linear-gradient(180deg, #e24c60, #a51c2e);
  border: 1px solid #8d1626;
  color: #fff;
}
.btn-rot:hover, .btn.btn-rot:hover, .btn-sm.btn-rot:hover {
  background: linear-gradient(180deg, #ec6174, #b82639);
  border-color: #8d1626;
  color: #fff;
}
.btn-gelb, .btn.btn-gelb, .btn-sm.btn-gelb {
  background: linear-gradient(180deg, #ffd851, #e0a800);
  border: 1px solid #c08f00;
  color: #1c1c1c;
}
.btn-gelb:hover, .btn.btn-gelb:hover, .btn-sm.btn-gelb:hover {
  background: linear-gradient(180deg, #ffe273, #eeb600);
  border-color: #c08f00;
  color: #1c1c1c;
}

/* Von Stephan gewünscht ("Ebenfalls möchte das bei Anwesenheit, der Erste Login und der letzte
   Logout angezeigt wird bei Mitarbeitern. Je Tag."): kleine zweite Zeile unter der Online-Zeit in
   der Monatsansicht (siehe views/settings/anwesenheit.ejs). Bewusst sehr klein gehalten, damit die
   Tagesspalten nicht breiter werden - es sind bis zu 31 nebeneinander. */
.anwesenheit-zeitspanne {
  display: block;
  font-size: 0.62rem;
  line-height: 1.2;
  color: var(--text-muted);
  white-space: nowrap;
}

/* Bugfix (von Stephan gemeldet, Screenshot der Seite Einstellungen -> Rechte: "Hier bitte die
   Ansicht fixen"): die Rechte-Matrix hat je Rolle eine eigene Spalte und wird dadurch breiter als
   ihre Karte. Ohne eigenen Rollbereich lief sie sichtbar über den Kartenrand hinaus - und ließ
   sich auch nicht erreichen, weil .container waagerecht abschneidet (overflow-x: clip, nötig für
   die feste Kopfzeile der Auftragsliste). Die Tabellen stehen deshalb jetzt in einem Bereich, der
   bei Bedarf waagerecht rollt. Die erste Spalte bleibt dabei stehen (position: sticky, siehe
   .rechte-tabelle oben), sodass die Bezeichnung des Rechts beim Rollen immer sichtbar bleibt. */
.rechte-scroll {
  overflow-x: auto;
  /* Sonst würde die feststehende erste Spalte am oberen/unteren Rand abgeschnitten. */
  overflow-y: visible;
  max-width: 100%;
}

/* Von Stephan gewünscht: persönliche Chats mit frei wählbaren Teilnehmern (siehe routes/chat.js).
   Die Auswahlliste kann bei vielen Mitarbeitern lang werden und bekommt deshalb eine feste Höhe
   mit eigenem Rollbalken, damit die Kanalliste darüber nicht aus dem Bild geschoben wird. */
.chat-mitglieder-wahl {
  max-height: 160px;
  overflow-y: auto;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 6px 8px;
  background: #fff;
}
.chat-mitglied {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.82rem;
  font-weight: 500;
  color: var(--text);
  margin: 0 0 3px;
  cursor: pointer;
}
.chat-mitglied input[type="checkbox"] { width: 15px; height: 15px; margin: 0; flex: none; }
/* Hinweis in der Kanalliste, wer einen fremden Chat angelegt hat (nur für den Admin sichtbar). */
.chat-kanal-hinweis { display: block; font-size: 0.68rem; font-style: italic; opacity: 0.75; }
.chat-teilnehmer-leiste {
  padding: 8px 12px;
  border-bottom: 1px solid var(--border);
  font-size: 0.82rem;
  color: var(--text-muted);
  background: #f7f5f1;
}
.chat-teilnehmer-leiste .chat-kanal-hinweis { display: inline; }

/* Von Stephan gewünscht ("wenn neue Chatnachrichten geschrieben werden dann bitte die
   Benachrichtigung auffälliger machen"): aus dem 8px-Punkt neben "Chat" ist ein roter Zähler
   geworden. Er nennt die Anzahl, ist deutlich größer als der bisherige Punkt und pulsiert
   kräftiger (Größenwechsel statt nur Ein-/Ausblenden), damit er im Blickfeld auffällt. */
.chat-mention-badge {
  display: inline-block; min-width: 18px; height: 18px; padding: 0 5px; margin-left: 7px;
  border-radius: 100px; background: #ef445b; color: #fff; font-size: 0.7rem; font-weight: 800;
  line-height: 18px; text-align: center; vertical-align: middle;
  box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7);
  animation: whtk-chat-puls 1.4s ease-out infinite;
}
@keyframes whtk-chat-puls {
  0%   { transform: scale(1);    box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7); }
  70%  { transform: scale(1.15); box-shadow: 0 0 0 8px rgba(239, 68, 68, 0); }
  100% { transform: scale(1);    box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); }
}
/* Zähler im Sprechblasen-Symbol oben neben der Suche. */
.mention-alert-icon { position: relative; }
.mention-alert-zahl {
  position: absolute; top: -4px; right: -8px; min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: 100px; background: #ef445b; color: #fff; font-size: 0.62rem; font-weight: 800;
  line-height: 16px; text-align: center; font-family: system-ui, sans-serif;
}

/* Von Stephan gewünscht ("ein weiterer Chat: WHTK Support ... Diesen Chat bitte rot hinterlegen und
   ganz nach oben über Allgemein"): der Support-Kanal hebt sich in der Kanalliste rot ab. Der
   Hinweistext darunter erklärt, wofür der Kanal da ist - bewusst klein und in der Liste selbst,
   damit er beim Melden eines Problems direkt im Blick ist. */
.chat-channels a.chat-kanal-support {
  background: #e24c60;
  color: #fff;
  border-color: #a51c2e;
}
.chat-channels a.chat-kanal-support:hover { background: #cf4053; }
.chat-channels a.chat-kanal-support.active { background: #a51c2e; }
.chat-kanal-support-text {
  display: block;
  font-size: 0.66rem;
  line-height: 1.35;
  font-weight: 400;
  margin-top: 4px;
  opacity: 0.95;
}

/* Von Stephan gewünscht ("Das Benachrichtigungssymbol noch mit Text versehen 'DU HAST EINE
   CHATNACHRICHT' und aufblinken lassen"): rotes Hinweisfeld mit Klartext oben neben der Suche,
   statt des bisherigen kleinen Symbols. Es blinkt deutlich - Deckkraft UND Hintergrund wechseln,
   damit es auch auf dem Fernseher im Büro aus einigen Metern Entfernung auffällt.
   Erscheint nur, solange ungelesene Chatnachrichten vorliegen (siehe views/partials/nav.ejs). */
.mention-alert-banner {
  display: inline-flex; align-items: center; gap: 8px; margin-right: 12px;
  padding: 6px 14px; border-radius: 100px; text-decoration: none;
  background: #ef445b; color: #fff; font-size: 0.72rem; font-weight: 800; letter-spacing: 0.03em;
  white-space: nowrap; border: 1px solid #b91c31;
  animation: whtk-chat-alarm 1.2s ease-in-out infinite;
}
.mention-alert-banner:hover { background: #dc263e; }
.mention-alert-banner .mention-alert-symbol { font-size: 15px; line-height: 1; }
.mention-alert-banner .mention-alert-zahl {
  position: static; background: #fff; color: #b91c31; min-width: 18px; height: 18px;
  line-height: 18px; border-radius: 100px; padding: 0 5px; font-size: 0.68rem; font-weight: 800;
}
@keyframes whtk-chat-alarm {
  0%, 100% { background: #ef445b; opacity: 1; }
  50%      { background: #7f1d2a; opacity: 0.55; }
}
/* Auf schmalen Fenstern nimmt der Text zu viel Platz - dort bleibt das Symbol mit der Zahl. */
@media (max-width: 1100px) {
  .mention-alert-banner .mention-alert-text { display: none; }
}

/* Auftragseingang aus dem Shop mainhalteverbot.de (Stephan, 16.08.2026: "Es gibt eine
   Benachrichtigung, ein blinkendes Symbol in Orange. Auftrags Eingang MH.de"). Gleiche Form und
   Größe wie der rote Chat-Hinweis daneben (Regel 6: gleichmäßig), nur in der Orange-Ton des Shops.
   Erscheint nur, solange ein Eingang offen ist - siehe views/partials/nav.ejs. */
.mh-alert-banner {
  display: inline-flex; align-items: center; gap: 8px; margin-right: 12px;
  padding: 6px 14px; border-radius: 100px; text-decoration: none;
  background: #f59e0b; color: #3b2500; font-size: 0.72rem; font-weight: 800; letter-spacing: 0.03em;
  white-space: nowrap; border: 1px solid #b45309;
  animation: whtk-mh-alarm 1.2s ease-in-out infinite;
}
.mh-alert-banner:hover { background: #d97706; color: #fff; }
.mh-alert-banner .mention-alert-symbol { font-size: 15px; line-height: 1; }
.mh-alert-banner .mention-alert-zahl {
  position: static; background: #fff; color: #b45309; min-width: 18px; height: 18px;
  line-height: 18px; border-radius: 100px; padding: 0 5px; font-size: 0.68rem; font-weight: 800;
}
@keyframes whtk-mh-alarm {
  0%, 100% { background: #f59e0b; opacity: 1; }
  50%      { background: #7c4a03; opacity: 0.55; }
}
@media (max-width: 1100px) {
  .mh-alert-banner .mention-alert-text { display: none; }
}

/* Von Stephan gewünscht ("die Schriftgröße von Allgemein, Informationen, Buchhaltung, Stephan,
   Testuser bitte verkleinern und kompakter anzeigen lassen"): die Kanalliste war mit 8px Polsterung
   je Eintrag und normaler Schriftgröße sehr luftig - bei mehreren persönlichen Chats passte kaum
   noch etwas ins Bild. Kleinere Schrift, weniger Abstand, gleiche Bedienbarkeit. */
.chat-channels a {
  padding: 5px 8px;
  margin-bottom: 2px;
  font-size: 0.8rem;
  line-height: 1.3;
}
/* Der Hinweistext unter dem Support-Kanal darf dabei nicht mitschrumpfen, sonst wird er unlesbar. */
.chat-channels a.chat-kanal-support .chat-kanal-support-text { font-size: 0.64rem; }

/* Support-Kanal: Kopfleiste mit Hinweistext und dem Schalter für erledigte Meldungen. */
.chat-support-leiste {
  display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap;
  padding: 8px 12px; margin-bottom: 10px; border-radius: var(--radius);
  background: #fbdde1; color: #7d222e; font-size: 0.78rem; line-height: 1.4;
}
.chat-support-schalter { color: #7d222e; font-weight: 700; white-space: nowrap; }

/* Erledigte Meldungen (nur sichtbar, wenn ausdrücklich eingeblendet) treten deutlich zurück. */
.chat-msg.ist-erledigt { opacity: 0.55; }
.chat-msg.ist-erledigt .bubble { background: #f1f2f4; }
.chat-erledigt-marke { color: var(--success); font-weight: 700; margin-left: 6px; }
/* Kennzeichnung, zu wessen Meldung ein Eintrag gehört - nur in der Ansicht der Administration. */
.chat-strang {
  margin-left: 6px; padding: 1px 7px; border-radius: 100px;
  background: #ebebeb; color: var(--primary-light); font-size: 0.7rem; font-weight: 700;
}
.chat-msg-aktionen { margin-top: 4px; display: flex; gap: 6px; }
.chat-erledigt-knopf { background: #2fae60; border-color: #17703c; color: #fff; }

/* Antwort-Hinweis über dem Eingabefeld (Administration antwortet in einen bestimmten Strang). */
.chat-antwort-hinweis {
  display: flex; align-items: center; gap: 8px; margin-bottom: 6px; padding: 5px 10px;
  border-radius: var(--radius); background: #ebebeb; color: var(--primary); font-size: 0.78rem;
}

/* Bilder im Chat (Drag & Drop, jedes Bild eine eigene Nachricht). */
.chat-bild-link { display: inline-block; margin-bottom: 4px; }
.chat-bild {
  max-width: 260px; max-height: 220px; border-radius: 10px; border: 1px solid var(--border);
  display: block; background: #fff;
}
.chat-messages.bild-ziel { outline: 2px dashed var(--primary-light); outline-offset: -6px; background: #f6f6f6; }
.chat-bild-hinweis { margin-top: 6px; font-size: 0.72rem; color: var(--text-muted); }
.chat-bild-waehlen { color: var(--primary-light); font-weight: 700; cursor: pointer; margin-left: 6px; }

/* Von Stephan gewünscht: Begrüßung im "Neu in Version"-Fenster beim Start der finalen Version
   (siehe utils/changelog.js willkommen + views/partials/nav.ejs). */
.changelog-willkommen { margin-bottom: 18px; }
.changelog-willkommen h2 { margin: 0 0 2px; font-size: 1.4rem; color: var(--primary); }
.changelog-untertitel { margin: 0 0 14px; color: var(--text-muted); font-weight: 600; }
.changelog-willkommen p { margin: 0 0 10px; line-height: 1.55; }
.changelog-schlusssatz {
  margin-top: 14px !important; font-style: italic; font-weight: 700; color: var(--primary);
  border-top: 2px solid var(--accent); padding-top: 10px;
}
.changelog-support {
  background: #fbdde1; border-left: 4px solid #e24c60; border-radius: var(--radius);
  padding: 12px 14px; margin: 14px 0;
}
.changelog-support-titel { font-weight: 800; color: #a51c2e; margin-bottom: 6px; }
.changelog-support p { margin: 0 0 8px; font-size: 0.9rem; }
.changelog-support-beispiel { margin-top: 10px; }
.changelog-support-beispiel-hinweis {
  display: block; font-size: 0.74rem; color: #7d222e; font-weight: 700; margin-bottom: 5px;
}
/* Zeigt den Kanal-Eintrag wie in der echten Kanalliste - dieselbe Klasse, damit beides
   zwangsläufig gleich aussieht. */
.changelog-kanal-beispiel { display: block; width: 240px; border: none; padding: 0; }
.changelog-kanal-beispiel a { display: block; text-decoration: none; }

/* Von Stephan gewünscht ("Kalenderanzeige bitte Uhrzeit in 30-min-Takt"): Die halben Stunden sind
   optisch zurückgenommen - schwächere Trennlinie, blassere Beschriftung -, damit die volle Stunde
   weiterhin die Orientierung im Raster gibt und die Ansicht nicht unruhig wirkt. */
.cal-week-hourlabel.cal-halbe { color: var(--text-muted); font-size: 0.68rem; }
/* Von Stephan korrigiert ("keine gestrichelte Linie in fett"): Die Zellen haben bereits unten eine
   Trennlinie - meine zusätzliche Linie OBEN an der halben Stunde ergab daher einen doppelten,
   kräftig wirkenden Strich. Jetzt gar keine Zusatzlinie mehr: Alle Zeilen sehen gleich aus, die
   halbe Stunde ist allein an der kleineren, blasseren Uhrzeit links zu erkennen.
   Zeilenhöhe zugleich von 40 auf 26 Pixel: Bei doppelt so vielen Zeilen wäre der Kalender sonst
   doppelt so hoch geworden und hätte nicht mehr auf den Bildschirm gepasst. */
/* Von Stephan gemeldet ("wenn von bis, dann soll der Termin den Balken von 09:00 - 10:30
   anzeigen") und danach präzisiert ("die Höhe wie der angezeigte Balken, nicht einfach Striche von
   oben nach unten", mit Bildbeispiel):
   Ein Termin ist jetzt EIN zusammenhängender Block, dessen Höhe seiner Dauer entspricht - so wie
   man es aus Outlook, Apple Kalender und Co. kennt. Mein erster Versuch, in jeder Folgezelle einen
   schmalen Streifen zu zeichnen, sah aus wie eine gestrichelte Linie und genau das wollte Stephan
   nicht.
   Damit sich die Höhe ausrechnen lässt, muss jede Halbstundenzeile GENAU gleich hoch sein - daher
   feste Höhe statt min-height. --cal-slot ist die eine Stelle, an der sich das ändern lässt; die
   Vorlagen (views/calendar/_week.ejs und _day.ejs) rechnen mit demselben Wert. */
:root { --cal-slot: 26px; }
.cal-week-hourcell { height: var(--cal-slot); position: relative; }
/* Die Zeile mit Urlaub/FZA/Krank ist bewusst höher und darf weiterhin mitwachsen. */
.cal-week-hourcell.cal-urlaub-zelle { height: auto; }

.cal-appt-block {
  position: absolute; top: 1px; left: 2px; right: 2px; z-index: 3;
  background: #eef1f7; border-left: 3px solid var(--primary); border-radius: 4px;
  padding: 2px 5px; font-size: 0.7rem; line-height: 1.25; overflow: hidden;
  display: flex; flex-direction: column; gap: 0;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.12);
}
.cal-appt-block .cal-appt-time { font-weight: 700; color: var(--primary); font-size: 0.68rem; }
.cal-appt-block .cal-appt-titel {
  font-weight: 600; color: #1c1c1c; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cal-appt-block .cal-appt-zusatz {
  color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Der Löschknopf sitzt im Block oben rechts und tritt erst beim Überfahren hervor - sonst nimmt
   das × in einem schmalen Block zu viel Platz weg. */
.cal-appt-block .cal-appt-del { position: absolute; top: 0; right: 2px; margin: 0; }
/* Liegen mehrere Termine zur selben Anfangszeit, teilen sie sich die Breite nebeneinander -
   die Vorlage setzt dafür left/width als Inline-Angabe. */
.cal-appt-block.cal-appt-geteilt { right: auto; }

/* Von Stephan gewünscht ("Termine, die ich eingetragen habe, sind fest - ich kann keinen Termin
   bearbeiten oder löschen"): Bearbeiten- und Löschen-Knopf an selbst angelegten Terminen. Beide
   treten erst beim Überfahren hervor, damit die Kacheln im Ruhezustand aufgeräumt bleiben.
   Auftrags- und Aufgabeneinträge bekommen diese Knöpfe bewusst nicht - die werden aus dem Auftrag
   gesteuert (so von Stephan festgelegt). */
.cal-appt-edit {
  background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 0.75rem;
  padding: 0 2px; line-height: 1;
}
.cal-appt-edit:hover { color: var(--primary); }
/* Von Stephan gemeldet ("Löschbutton nicht sichtbar im Kalender"): Bearbeiten und Löschen waren
   nur beim Überfahren mit der Maus sichtbar. Das war meine Idee, aufgeräumt zu wirken - in der
   Praxis findet man Knöpfe so nicht. Beide stehen jetzt dauerhaft da. */
.cal-appt-block .cal-appt-edit { position: absolute; top: 0; right: 16px; }

/* Badge mit Knöpfen (Urlaub/FZA/Krank sowie ganztägige Termine): Text links, Knöpfe rechts. */
.cal-badge.cal-badge-mit-aktion {
  display: flex; align-items: center; gap: 4px; justify-content: space-between; white-space: normal;
}
.cal-badge-mit-aktion > span:first-child {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
/* Ebenfalls dauerhaft sichtbar, nicht erst beim Überfahren (von Stephan gemeldet). */
.cal-badge-aktionen { display: inline-flex; align-items: center; gap: 0; flex: 0 0 auto; }
.cal-badge-aktionen form { display: inline; }
.cal-badge-aktionen .cal-appt-del, .cal-badge-aktionen .cal-appt-edit { margin: 0; color: inherit; }

/* Der Monatsbalken bekommt seine Knöpfe rechts außen. */
.cal-urlaub-balken { display: flex; align-items: center; justify-content: space-between; gap: 6px; }

/* Termin-Badge in der Monatsansicht: sieht aus wie bisher, ist aber ein Knopf (öffnet das
   Bearbeiten-Fenster). Ohne diese Regel brächte der Browser seinen eigenen Knopf-Stil mit. */
.cal-badge.cal-badge-knopf {
  border: none; cursor: pointer; text-align: left; font: inherit; font-size: 0.7rem; width: 100%;
}

/* Von Stephan gewünscht ("Urlaub unter 19:30 Uhr als eigene Zeile setzen, Zeilenhöhe höher als die
   anderen"): eigene Zeile ganz unten im Wochen- und Tagesraster. Höher als die Stundenzeilen, weil
   dort bei mehreren Mitarbeitern mehrere Einträge untereinander stehen. */
.cal-week-hourcell.cal-urlaub-zelle { min-height: 58px; height: auto; background: #f4fffd; }
.cal-week-rowlabel.cal-urlaub-label { font-weight: 700; color: #0f766e; }
/* Freizeitausgleich (von Stephan gewünscht: "selbe Struktur wie Urlaub") - eigene Zeile direkt
   unter dem Urlaub, gleiche Höhe. Der Zellenhintergrund ist eine sehr helle Variante der
   Balkenfarbe #7cd1ec, damit die Zeile schon vor dem ersten Eintrag zuzuordnen ist.
   "Freizeitausgleich" ist zu lang für die 70 Pixel breite Spalte, deshalb bricht die Beschriftung
   dort um (weiches Trennzeichen im Text, siehe views/calendar/_week.ejs). */
.cal-week-hourcell.cal-fza-zelle { min-height: 58px; background: #f8f8f8; }
/* Krank - dieselbe Zeile wie Urlaub und Freizeitausgleich, Hintergrund als sehr helle Variante
   der Balkenfarbe #ee7686. */
.cal-week-hourcell.cal-krank-zelle { min-height: 58px; background: #fdf4f5; }
.cal-week-rowlabel.cal-urlaub-label { line-height: 1.2; word-break: break-word; hyphens: auto; }

/* Von Stephan gewünscht: Urlaubsübersicht über der Wochentagszeile im Monat - je Person eine Zeile
   mit "Name = Zeitraum". In derselben Farbe wie die Urlaubseinträge im Kalender, damit der
   Zusammenhang sofort erkennbar ist. */
.cal-urlaub-monat {
  padding: 8px 12px; display: flex; flex-direction: column; gap: 4px;
  border-bottom: 1px solid var(--border); background: var(--surface-1, #fff);
}
/* Je Person ein eigener Balken - so bleibt bei mehreren Urlauben erkennbar, wo einer aufhört und
   der nächste anfängt (von Stephan gewünscht: "wenn mehrere in Urlaub sind, dann mehrere
   untereinander"). */
.cal-urlaub-balken {
  background: #00ffe1; color: #1c1c1c;
  /* Schmale rote Umrandung, von Stephan gewünscht - hebt den Balken vom hellen Türkis ab. */
  border: 1px solid #e24c60;
  /* Von Stephan korrigiert ("Balken bitte eckiger machen"): aus der Pillenform ist ein Balken mit
     leicht gebrochenen Ecken geworden. */
  border-radius: 3px; padding: 4px 12px;
  font-size: 0.82rem; line-height: 1.4;
}
/* Freizeitausgleich im selben Balken, nur in seiner eigenen Farbe (von Stephan festgelegt:
   #7cd1ec mit rotem Rahmen) - der rote Rahmen kommt aus der Regel darüber. */
.cal-urlaub-balken.cal-balken-fza { background: var(--cal-fza); }
/* Krank: Stephan hat hier nur Hintergrund- und Schriftfarbe vorgegeben. Der rote Rahmen aus der
   Regel darüber würde auf dem Rot untergehen, deshalb bekommt dieser Balken den Rahmen in seiner
   eigenen Schriftfarbe - gleiche Form wie die übrigen, aber sichtbar abgegrenzt. */
.cal-urlaub-balken.cal-balken-krank {
  background: var(--cal-krank); color: var(--cal-krank-schrift); border-color: var(--cal-krank-schrift);
}

/* Von Stephan gewünscht ("ziehe eine Linie zum Abgrenzen zwischen Länge in m und Zusatz und Fahrbahn
   und Gehweg - blaue dicke Linie"): waagerechte Trennlinie innerhalb der Maßnahmen-Details, oberhalb
   der Sperrungen (Fahrbahn/Gehweg/Radweg/Parkstreifen). Eingesetzt in views/deals/show.ejs und
   views/projects/show.ejs. */
.mass-trennlinie {
  border-top: 3px solid var(--primary);
  margin: 14px 0 16px;
}

/* Von Stephan gewünscht ("Maßnahme Ende eines Auftrags soll Gelb hinterlegt werden"): Jeder Auftrag
   steht im Kalender zweimal - am Beginn und am Ende der Maßnahme. Der Endtag (Abbau) hebt sich jetzt
   gelb ab. Zwei Klassen im Selektor, damit diese Regel die Farbe der jeweiligen Auftragsart
   (.cal-badge-hv, .cal-badge-vs ...) sicher übersteuert. Schwarze Schrift, weil weiße auf Gelb nicht
   lesbar wäre. Gesetzt wird die Klasse in views/calendar/_month|_week|_day.ejs anhand von
   istEndeTag (siehe projekteFuerTag() in routes/calendar.js). */
.cal-badge.cal-badge-ende {
  background: var(--cal-ende);
  color: #1c1c1c;
  border: 1px solid var(--cal-ende-rahmen);
}
/* Von Stephan geliefertes Symbol (roter Kreis mit weißem Pfeil nach links) vor dem Text des
   Endtags - "nur Ende Maßnahme", der Beginn bleibt ohne Symbol. Die Grundlinie wird leicht
   angehoben (vertical-align), damit das Symbol mittig zur Schrift sitzt. */
.cal-badge-ende-icon {
  width: 11px;
  height: 11px;
  vertical-align: -1px;
  margin-right: 4px;
  flex: none;
}

/* Von Stephan gewünscht ("Füge noch Text hinzu Symbol ABBAU: Straße Hnr, PLZ Ort"): Vor der Adresse
   des Abbautags steht das Wort ABBAU. Halbfett, damit es sich von der Adresse dahinter abhebt -
   der Eintrag bleibt einzeilig, zu langer Text wird wie bisher mit … gekürzt. */
.cal-badge-ende-wort { font-weight: 700; }

/* Von Stephan gewünscht ("Wenn Chatnachricht aufblinkt, dann bitte auch ein rotes Ausrufezeichen
   neben dem Chat, wo eine neue Nachricht drin ist"): rotes Ausrufezeichen vor dem Kanalnamen in der
   Kanalliste (views/chat/index.ejs). Aussehen wie der Freigabe-Hinweis in der Rechnungsliste
   (.freigabe-alert-dot), aber blinkend im selben Takt wie der Hinweis oben neben der Suche
   (whtk-mention-blink) - beide gehören zusammen: oben steht, DASS etwas da ist, hier steht, WO.
   Die eigene [hidden]-Regel ist nötig, weil display:inline-flex das Standardverhalten von
   hidden sonst übersteuert. */
.chat-kanal-neu {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%; background: #ef445b; color: #fff;
  font-size: 11px; font-weight: 700; margin-right: 6px; vertical-align: middle;
  animation: whtk-mention-blink 1.1s ease-in-out infinite;
}
.chat-kanal-neu[hidden] { display: none; }
/* Im roten Support-Kanal wäre Rot auf Rot nicht zu erkennen - dort weiß mit rotem Zeichen. */
.chat-channels a.chat-kanal-support .chat-kanal-neu { background: #fff; color: #a51c2e; }

/* Von Stephan gemeldet (Bild /eingangsrechnungen: "wird auf der Seite schlecht dargestellt" -
   Zeilen wurden durch umbrechende Auftrags-/Kunden-/Prüfungstexte 4-5-zeilig hoch): die Textspalten
   sind jetzt einzeilig, Überlänge wird mit ... gekürzt, der volle Text steht im Tooltip. WICHTIG:
   das Kürzen sitzt immer auf einem Span IN der Zelle, nie auf <td> selbst - display:block auf einer
   Tabellenzelle wirft sie aus der Zeile (der Fehler von heute Vormittag). */
.erg-einzeilig {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.erg-auftrag-text { max-width: 210px; }
.erg-kunde-text { max-width: 130px; }
.erg-beschreibung-text { max-width: 150px; }
.erg-pruefer-text { max-width: 140px; }

/* Von Stephan gemeldet (Bild /eingangsrechnungen: "geht über meinen Monitor hinaus"): festes
   Spaltenraster für die Eingangsrechnungs-Liste. Schmale Spalten fest in Pixeln, die vier
   Textspalten (Lieferant, Auftrag, Kunde, Beschreibung) teilen sich den Rest in einfachen
   Prozentwerten - calc() wird von Chrome unter table-layout:fixed ignoriert (Erfahrung aus der
   Auftragsliste), einfache Prozente funktionieren. Zusammen mit width:100% ist die Tabelle exakt
   fensterbreit; die Texte kürzen einzeilig (siehe .erg-einzeilig). Schrift 13px wie in der
   Auftragsliste. */
.erg-tabelle { table-layout: fixed; width: 100%; font-size: 13px; }
.erg-tabelle th, .erg-tabelle td { overflow: hidden; }
.erg-tabelle th:nth-child(1)  { width: 34px; }   /* Ersteller-Avatar */
.erg-tabelle th:nth-child(2)  { width: 76px; }   /* Datum */
.erg-tabelle th:nth-child(3)  { width: 100px; }  /* Beleg-Nr. */
.erg-tabelle th:nth-child(4)  { width: 64px; }   /* Interne BH Nr. */
.erg-tabelle th:nth-child(5)  { width: 10%; }    /* Lieferant */
.erg-tabelle th:nth-child(6)  { width: 50px; }   /* P-Nr. */
.erg-tabelle th:nth-child(7)  { width: 14%; }    /* Auftrag */
.erg-tabelle th:nth-child(8)  { width: 8%; }     /* Kunde */
.erg-tabelle th:nth-child(9)  { width: 10%; }    /* Beschreibung */
.erg-tabelle th:nth-child(10) { width: 80px; }   /* Fällig am */
.erg-tabelle th:nth-child(11) { width: 74px; }   /* Netto */
.erg-tabelle th:nth-child(12) { width: 46px; }   /* MwSt */
.erg-tabelle th:nth-child(13) { width: 78px; }   /* Brutto */
.erg-tabelle th:nth-child(14) { width: 120px; }  /* Prüfung */
.erg-tabelle th:nth-child(15) { width: 76px; }   /* BH am */
.erg-tabelle th:nth-child(16) { width: 76px; }   /* Auftrag Beginn */
.erg-tabelle th:nth-child(17) { width: 76px; }   /* Auftrag Ende */
.erg-tabelle th:nth-child(18) { width: 26px; }   /* Download-Haken */
.erg-tabelle th:nth-child(19) { width: 92px; }   /* Aktionen */
/* Beträge und Daten niemals umbrechen - "15,00 €" bleibt eine Zeile. */
.erg-tabelle td:nth-child(2), .erg-tabelle td:nth-child(10), .erg-tabelle td:nth-child(11),
.erg-tabelle td:nth-child(12), .erg-tabelle td:nth-child(13), .erg-tabelle td:nth-child(15),
.erg-tabelle td:nth-child(16), .erg-tabelle td:nth-child(17) { white-space: nowrap; }
/* Im festen Raster begrenzt die Spalte selbst - die Einzel-Obergrenzen der Kürz-Spans würden die
   Spalten sonst schmaler machen, als das Raster ihnen zugesteht. */
.erg-tabelle .erg-lieferant-text, .erg-tabelle .erg-auftrag-text, .erg-tabelle .erg-kunde-text,
.erg-tabelle .erg-beschreibung-text, .erg-tabelle .erg-pruefer-text { max-width: none; }

/* Von Stephan gemeldet ("/angebote, /rechnungen, /behoerden - die Seite geht über den Rand
   hinaus"): dieselbe Technik wie bei der Eingangsrechnungs-Liste (.erg-tabelle oben): festes
   Spaltenraster, schmale Spalten in Pixeln, Textspalten in einfachen Prozenten (kein calc() unter
   table-layout:fixed!). Gekürzt wird direkt auf der Zelle - das ist hier erlaubt, weil die Zelle
   ihre display-Art behält (das Verbot gilt nur für display:block auf <td>). Die Status- und
   Aktionsspalten bleiben ohne overflow:hidden, damit ihre Aufklappmenüs nicht abgeschnitten
   werden. */
.angebote-tabelle, .rechnungen-tabelle, .lieferanten-tabelle { table-layout: fixed; width: 100%; font-size: 13px; }

/* Angebote: 13 Spalten. */
.angebote-tabelle th:nth-child(1)  { width: 26px; }  /* Auswahl */
.angebote-tabelle th:nth-child(2)  { width: 34px; }  /* Ersteller */
.angebote-tabelle th:nth-child(3)  { width: 88px; }  /* Nr. */
.angebote-tabelle th:nth-child(4)  { width: 52px; }  /* P-Nr. */
.angebote-tabelle th:nth-child(5)  { width: 15%; }   /* Kunde */
.angebote-tabelle th:nth-child(6)  { width: 80px; }  /* Datum */
.angebote-tabelle th:nth-child(7)  { width: 80px; }  /* Gültig bis */
.angebote-tabelle th:nth-child(8)  { width: 88px; }  /* Netto */
.angebote-tabelle th:nth-child(9)  { width: 110px; } /* Status */
.angebote-tabelle th:nth-child(10) { width: 24%; }   /* Auftrag / Deal */
.angebote-tabelle th:nth-child(11) { width: 78px; }  /* Auftrag Beginn */
.angebote-tabelle th:nth-child(12) { width: 78px; }  /* Auftrag Ende */
.angebote-tabelle th:nth-child(13) { width: 120px; } /* Aktionen */
.angebote-tabelle td:nth-child(5), .angebote-tabelle td:nth-child(10) {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.angebote-tabelle td:nth-child(6), .angebote-tabelle td:nth-child(7),
.angebote-tabelle td:nth-child(11), .angebote-tabelle td:nth-child(12) { white-space: nowrap; }

/* Rechnungen: 17 Spalten. */
.rechnungen-tabelle th:nth-child(1)  { width: 28px; }  /* Auswahl */
.rechnungen-tabelle th:nth-child(2)  { width: 34px; }  /* Ersteller */
.rechnungen-tabelle th:nth-child(3)  { width: 76px; }  /* Datum */
.rechnungen-tabelle th:nth-child(4)  { width: 68px; }  /* Typ */
.rechnungen-tabelle th:nth-child(5)  { width: 92px; }  /* Nr. */
.rechnungen-tabelle th:nth-child(6)  { width: 52px; }  /* P-Nr. */
.rechnungen-tabelle th:nth-child(7)  { width: 16%; }   /* Titel */
.rechnungen-tabelle th:nth-child(8)  { width: 12%; }   /* Kunde / Projekt */
.rechnungen-tabelle th:nth-child(9)  { width: 84px; }  /* Netto */
.rechnungen-tabelle th:nth-child(10) { width: 84px; }  /* Brutto */
.rechnungen-tabelle th:nth-child(11) { width: 84px; }  /* Offen */
.rechnungen-tabelle th:nth-child(12) { width: 78px; }  /* Fällig am */
.rechnungen-tabelle th:nth-child(13) { width: 70px; }  /* Fällig in */
.rechnungen-tabelle th:nth-child(14) { width: 108px; } /* Status */
.rechnungen-tabelle th:nth-child(15) { width: 76px; }  /* Auftrag Beginn */
.rechnungen-tabelle th:nth-child(16) { width: 76px; }  /* Auftrag Ende */
.rechnungen-tabelle th:nth-child(17) { width: 108px; } /* Aktionen */
.rechnungen-tabelle td:nth-child(7), .rechnungen-tabelle td:nth-child(8) {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rechnungen-tabelle td:nth-child(3), .rechnungen-tabelle td:nth-child(9), .rechnungen-tabelle td:nth-child(10),
.rechnungen-tabelle td:nth-child(11), .rechnungen-tabelle td:nth-child(12), .rechnungen-tabelle td:nth-child(15),
.rechnungen-tabelle td:nth-child(16) { white-space: nowrap; }

/* Lieferanten/Behörden: 9 Spalten - gilt für BEIDE Seiten, sie teilen sich diese Liste. */
.lieferanten-tabelle th:nth-child(1) { width: 34px; }  /* Bild */
.lieferanten-tabelle th:nth-child(2) { width: 64px; }  /* Nr. */
.lieferanten-tabelle th:nth-child(3) { width: 22%; }   /* Name */
.lieferanten-tabelle th:nth-child(4) { width: 92px; }  /* Typ */
.lieferanten-tabelle th:nth-child(5) { width: 14%; }   /* Ansprechpartner */
.lieferanten-tabelle th:nth-child(6) { width: 12%; }   /* Ort */
.lieferanten-tabelle th:nth-child(7) { width: 120px; } /* Telefon */
.lieferanten-tabelle th:nth-child(8) { width: 18%; }   /* E-Mail */
.lieferanten-tabelle th:nth-child(9) { width: 88px; }  /* Aktionen */
.lieferanten-tabelle td:nth-child(3), .lieferanten-tabelle td:nth-child(5),
.lieferanten-tabelle td:nth-child(6), .lieferanten-tabelle td:nth-child(8) {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lieferanten-tabelle td:nth-child(7) { white-space: nowrap; }

/* Von Stephan gewünscht (TO DO / Reminder / Info am Auftrag und am Deal, Vorlage: sein
   Beispielbild, "Feld und Schrift gemäß Style WHTK anpassen"): heller Block unter den
   Auftraggeber-/Sachbearbeiter-/Behörden-Fieldsets. Einträge als flache Zeilen mit dem Meta-Text
   kursiv rechts, der Anlege-Knopf als runder oranger Punkt oben rechts (Farbe wie .btn-orange). */
.todo-fieldset {
  position: relative;
  /* Von Stephan positioniert ("genau wie im Bild"): eigene Zeile INNERHALB der Dreiergruppe,
     unter Auftraggeber und Sachbearbeiter/xRouten - also die ersten beiden der drei Spalten.
     Die Fläche unter der Behörde bleibt frei, wie in seiner Vorlage. */
  grid-column: 1 / 3;
  min-height: 200px;
  padding-right: 46px;
}
@media (max-width: 1100px) { .todo-fieldset { grid-column: 1 / -1; } }
.todo-eintrag {
  display: flex;
  align-items: baseline;
  gap: 10px;
  background: #f4f6f9;
  border: 1px solid #e6eaf0;
  border-radius: 4px;
  padding: 6px 10px;
  margin-bottom: 6px;
  font-size: 13px;
}
.todo-eintrag-text { min-width: 0; overflow-wrap: anywhere; }
.todo-eintrag-meta {
  margin-left: auto;
  font-style: italic;
  color: var(--text-muted);
  font-size: 11px;
  white-space: nowrap;
}
.todo-loeschen {
  background: none;
  border: none;
  cursor: pointer;
  font-size: 0.9rem;
  padding: 0 2px;
  line-height: 1;
}
.todo-plus {
  position: absolute;
  top: 8px;
  right: 10px;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: linear-gradient(180deg, #f0454f, #e30613);
  border: 1px solid #b1050f;
  color: #fff;
  font-size: 18px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
}
.todo-plus:hover { background: linear-gradient(180deg, #ffc06a, #f28f26); }

/* Von Stephan gemeldet ("Im Kalender bei Urlaub und Krank ist der Papierkorb nicht sichtbar"):
   der Löschknopf an den Abwesenheits-Balken/-Badges (Urlaub, Freizeitausgleich, Krank) war ein
   kleines ×, das auf dem Türkis bzw. Rot der Balken optisch unterging. Jetzt ein Papierkorb-Emoji
   mit fester Größe - es bringt seine eigenen Farben mit und ist auf jedem Untergrund sichtbar.
   Die übrigen ×-Knöpfe normaler Termine bleiben unverändert. Für Sachbearbeiter weiterhin
   ausgeblendet (html.role-sachbearbeiter .cal-appt-del oben). */
.cal-abwesenheit-del { font-size: 0.8rem; }

/* Von Stephan gewünscht ("Einträge von der Höhe anpassen, wie E-Mail und Historie zusammen
   ergeben"): das Zweispalten-Raster unten streckt beide Spalten (align-items:stretch im Markup),
   die Einträge-Karte füllt ihre Spalte und der Verlauf darin scrollt - so ist sie exakt so hoch
   wie E-Mail-Kachel + Historie links zusammen. Gilt für Auftrag und Deal. */
.eintraege-voll-hoehe {
  display: flex;
  flex-direction: column;
}
.eintraege-voll-hoehe #historieFeedContainer {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  max-height: none;
  padding-right: 4px;
}

/* Von Stephan gewünscht ("Senden-Button und Abbrechen fest im Popup verankern unten"): die
   Aktionsleiste des Schreiben-Dialogs klebt am unteren Rand des scrollenden Dialogs - bei langen
   Mails muss niemand mehr nach unten scrollen, um zu senden. Weißer Hintergrund + Trennlinie,
   damit dahinter durchlaufender Text nicht durchscheint. */
.compose-actions-fest {
  position: sticky;
  bottom: -24px;            /* gleicht das padding der .compose-box aus - liegt damit ganz unten auf */
  background: var(--card);
  padding: 10px 0;
  margin-bottom: -24px;
  border-top: 1px solid var(--border);
  z-index: 5;
}

/* Von Stephan gewünscht ("Antworten und Weiterleiten fest im Popup verankern unten"): feste
   Fußleiste des E-Mail-Detailfensters, Gegenstück zur Anhang-Leiste - der Text darüber scrollt,
   die Knöpfe bleiben stehen (siehe partials/email-kachel-detail.ejs). */
.email-detail-fussleiste {
  display: flex;
  gap: 8px;
  padding: 10px 22px;
  border-top: 1px solid var(--border);
  background: var(--card);
  flex: none;
}

/* ---------------------------------------------------------------------------------------------
   Kompakte Neu-Formulare Auftrag/Deal (von Stephan freigegebene Vorschau, 14.08.2026):
   4 Karten (Grunddaten / Maßnahmen Details / Behörde / Beschreibung) nebeneinander im 2x2-Raster,
   gleich breit und gleich hoch ("optisch EIN Block", die Karten bleiben aber getrennt) - auf dem
   10-Zoll-Tablet hochkant springt das Raster auf eine Spalte. */
.fk-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; align-items: stretch; }
.fk-grid > .card { margin-bottom: 0; display: flex; flex-direction: column; }
.fk-grid > .card > textarea { flex: 1; min-height: 120px; }
.fk-line { display: grid; gap: 8px 10px; margin-bottom: 10px; align-items: end; }
.fk-line:last-child { margin-bottom: 0; }
.fk-line .form-row { margin: 0; min-width: 0; }
@media (max-width: 820px) { .fk-grid { grid-template-columns: 1fr; } }
/* Gesperrte (automatisch befüllte) Felder + berechnete Anzeige-Felder (Dauer/Vorlaufzeit) */
.fk-ro input { background: #f1eee8; color: #555; border-style: dashed; pointer-events: none; }
.fk-calc input { background: #f4f4f4; color: var(--primary); font-weight: 600; pointer-events: none; }
/* Sachbearbeiter als Avatar-Dropdown rechts oben in der Titelzeile - ohne Rahmen/Pfeil/
   Beschriftung, Klick auf Avatar/Name öffnet die Liste. */
.sb-dd { position: relative; width: 260px; }
.sb-btn { display: flex; align-items: center; gap: 10px; width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; background: transparent; font-family: inherit; font-size: 14px; cursor: pointer; text-align: left; color: var(--text); }
.sb-btn:hover { background: rgba(0,0,0,.06); }
.sb-avatar { width: 34px; height: 34px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; color: #fff; font-size: 13px; font-weight: 600; flex: none; }
.sb-list { display: none; position: absolute; top: calc(100% + 3px); left: 0; right: 0; z-index: 60; background: #fff; border: 1px solid var(--border); border-radius: 6px; box-shadow: 0 6px 16px rgba(0,0,0,.14); max-height: 280px; overflow-y: auto; }
.sb-list > div { display: flex; align-items: center; gap: 10px; padding: 8px 12px; font-size: 14px; cursor: pointer; }
.sb-list > div:hover { background: #f5f5f5; }
.sb-dd.open .sb-list { display: block; }
/* Straßen-Vorschläge aus dem PLZ-Gebiet (ab 3 Buchstaben, siehe routes/strassen.js) */
.strassen-liste { display: none; position: absolute; top: 100%; left: 0; right: 0; z-index: 60; background: #fff; border: 1px solid var(--border); border-radius: 6px; box-shadow: 0 6px 16px rgba(0,0,0,.14); max-height: 240px; overflow-y: auto; }
.strassen-liste > div { padding: 8px 12px; font-size: 13px; cursor: pointer; }
.strassen-liste > div:hover { background: #f5f5f5; }

/* ---------------------------------------------------------------------------------------------
   Belegformulare Angebot/Rechnung (Vorgabe Stephan 14.08.2026): eine Schriftgröße kleiner und
   aufgeräumter ("professioneller"), Anordnung unverändert. Dazu EP/GP-Spalten in der
   Positionen-Tabelle und der Netto/Brutto-Umschalter. */
.beleg-formular { font-size: 0.85rem; }
.beleg-formular input, .beleg-formular select, .beleg-formular textarea { font-size: 0.85rem; }
.beleg-formular label { font-size: 0.72rem; letter-spacing: .2px; }
.beleg-formular h3 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: .4px; color: var(--primary); }
.beleg-formular .item-table th { font-size: 0.7rem; text-transform: uppercase; letter-spacing: .3px; color: var(--text-muted); border-bottom: 2px solid var(--border); padding: 6px 6px; text-align: left; }
.beleg-formular .item-table td { border-bottom: 1px solid var(--border); padding: 5px 4px; }
.beleg-formular .item-table input[type="number"] { text-align: right; }
/* GP = Menge x EP: reine Text-Zelle ohne Eingabekasten, rechtsbündig, nicht bearbeitbar. */
.item-table th.gp-kopf { text-align: right; }
.item-table td.gp-zelle { text-align: right; white-space: nowrap; font-weight: 600; color: var(--primary); vertical-align: middle; padding: 6px 8px; min-width: 90px; }
/* Netto/Brutto-Umschalter neben "Positionen" */
.preis-modus { display: inline-flex; border: 1px solid var(--border); border-radius: 6px; overflow: hidden; }
.preis-modus .pm-btn { font-family: inherit; font-size: 0.72rem; font-weight: 600; padding: 4px 12px; border: 0; background: #fff; color: var(--text-muted); cursor: pointer; }
.preis-modus .pm-btn.aktiv { background: var(--primary); color: #fff; }

/* Nachbesserungen kompakte Neu-Formulare (von Stephan gemeldet, 14.08.2026):
   - fk-seite: Formular nicht mehr über die komplette Monitorbreite, sondern wie die Vorschau auf
     max. 1240px begrenzt.
   - Typografie wie in der freigegebenen Vorschau (kleinere, graue Beschriftungen, kompaktere
     Felder, Karten-Überschriften in Versalien).
   - fk-line jetzt oben ausgerichtet (align-items:start statt end): dadurch stehen Kunde und
     Auftragstyp sauber in EINER Zeile, auch wenn unter dem Kunden-Feld der "+ Neuer Kunde"-Knopf
     steht. */
.fk-seite .page-header, .fk-seite form { max-width: 1240px; }
.fk-seite .form-row label { font-size: 0.72rem; font-weight: 600; color: var(--text-muted); letter-spacing: .2px; }
.fk-seite input, .fk-seite select, .fk-seite textarea { font-size: 0.85rem; }
.fk-seite .card > h3 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: .4px; color: var(--primary); }
.fk-line { align-items: start; }

/* ---------------------------------------------------------------------------------------------
   Listen-Paket (von Stephan freigegebene Vorschau, 15.08.2026): kompakte Listen (Kunden/
   Lieferanten/Behörden), Filter-Chips der erweiterten Kundensuche, grüner "Verwendet"-Zähler der
   Behördenliste und der ⚙️-Spalten-Umschalter der Auftrags-Pipeline. */
table.liste-kompakt { font-size: 0.8rem; }
table.liste-kompakt th { font-size: 0.68rem; text-transform: uppercase; letter-spacing: .3px; color: var(--text-muted); }
table.liste-kompakt td { padding: 5px 8px; }
.kunden-filterzeile { display: flex; gap: 8px 10px; flex-wrap: wrap; align-items: end; margin-bottom: 14px; }
.filter-chip { display: inline-flex; align-items: center; font-size: 0.78rem; font-weight: 600; padding: 6px 14px; border: 1px solid var(--border); border-radius: 15px; background: #fff; color: var(--text-muted); cursor: pointer; user-select: none; }
.filter-chip input { display: none; }
.filter-chip.aktiv { background: var(--primary); border-color: var(--primary); color: #fff; }
.verwendet-anzahl { display: inline-block; min-width: 34px; text-align: center; background: var(--success); color: #fff; font-weight: 700; font-size: 0.82rem; padding: 3px 8px; border-radius: 6px; }
.sp-dd { position: relative; display: inline-block; }
.sp-btn { font-family: inherit; font-size: 0.8rem; font-weight: 600; padding: 6px 12px; border: 1px solid var(--border); border-radius: 6px; background: #fff; cursor: pointer; }
.sp-liste { display: none; position: absolute; right: 0; top: calc(100% + 4px); z-index: 60; background: #fff; border: 1px solid var(--border); border-radius: 6px; box-shadow: 0 6px 16px rgba(0,0,0,.14); padding: 8px 12px; min-width: 200px; max-height: 320px; overflow-y: auto; }
.sp-dd.open .sp-liste { display: block; }
.sp-liste label { display: flex; gap: 8px; align-items: center; font-size: 0.82rem; padding: 3px 0; cursor: pointer; white-space: nowrap; }

/* =================================================================================================
   Neue Auftragsliste (von Stephan, 15.08.2026 - Vorschau-Runden 1-9 freigegeben):
   Tabelle, gruppierte Ansicht und Terminplan unter /auftraege.
   ============================================================================================== */

/* Kennzahlenleiste über der Liste */
.auftrag-kennzahlen { display:grid; grid-template-columns:repeat(auto-fit, minmax(170px, 1fr)); gap:10px; margin:0 0 14px; }
.auftrag-kennzahlen .kennzahl { background:#fff; border:1px solid #e3e6ea; border-radius:9px; padding:10px 13px;
  position:relative; overflow:hidden; }
.auftrag-kennzahlen .kennzahl::before { content:""; position:absolute; left:0; top:0; bottom:0; width:3px; background:#1a1a1a; }
.auftrag-kennzahlen .kz-rot::before { background:#c02b3f; }
.auftrag-kennzahlen .kz-gelb::before { background:#b8860b; }
.auftrag-kennzahlen .kz-lila::before { background:#7a4b9e; }
.auftrag-kennzahlen .kz-grau::before { background:#8a93a0; }
.auftrag-kennzahlen .kz-bez { font-size:0.72rem; color:#5a6472; text-transform:uppercase; letter-spacing:.04em; font-weight:700; }
.auftrag-kennzahlen .kz-wert { font-size:1.4rem; font-weight:700; line-height:1.15; font-variant-numeric:tabular-nums; }
.auftrag-kennzahlen .kz-zusatz { font-size:0.72rem; color:#8a93a0; }

/* Tabelle */
.auftragsliste-neu td { vertical-align:top; }
.auftragsliste-neu .zentriert, .auftragsliste-neu th.zentriert { text-align:center; }
/* Von Stephan gewünscht: kompletter Titel, bricht um statt abzuschneiden */
.auftragsliste-neu .bv-zelle { white-space:normal; min-width:210px; font-weight:600; line-height:1.3; }
.auftragsliste-neu .kunde-zelle { white-space:normal; min-width:170px; line-height:1.35; }
.auftragsliste-neu .typ-symbol { width:28px; height:28px; display:inline-block; vertical-align:middle; }
.auftragsliste-neu .stand-plakette { display:inline-block; border-radius:5px; padding:2px 7px; font-size:0.72rem; font-weight:600; white-space:nowrap; }
.auftragsliste-neu .stand-gruen { background:#e6f2e7; color:#2e7d32; }
.auftragsliste-neu .stand-gelb { background:#fbf1d8; color:#b8860b; }
.auftragsliste-neu .stand-grau { background:#eef0f3; color:#5a6472; }
/* Beantragungszeit + Aufgaben */
.haken-gruen { color:#2e7d32; font-size:1.05rem; font-weight:700; line-height:1; }
.vorlauf { font-size:0.76rem; font-weight:600; white-space:nowrap; color:#5a6472; }
.vorlauf-eng { color:#c02b3f; }
.vorlauf-knapp { color:#b8860b; }
.aufgaben-warnung { display:inline-flex; align-items:center; gap:3px; font-size:0.8rem; font-weight:700;
  color:#c02b3f; text-decoration:none; white-space:nowrap; }
.aufgaben-warnung:hover { text-decoration:underline; }

/* Gruppierte Ansicht: Zwischenzeile je Status (dieselbe Tabelle, damit die Spalten stehen bleiben) */
.auftragsliste-neu tr.gruppenzeile td { background:#eef1f5; border-top:1px solid #cdd3db; border-bottom:1px solid #cdd3db;
  padding:8px 10px; cursor:pointer; user-select:none; position:sticky; top:0; z-index:3; }
.auftragsliste-neu tr.gruppenzeile .gruppenzeile-inhalt { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.auftragsliste-neu tr.gruppenzeile .gruppen-pfeil { color:#8a93a0; font-size:0.75rem; display:inline-block; transition:transform .15s; }
.auftragsliste-neu tr.gruppenzeile.zugeklappt .gruppen-pfeil { transform:rotate(-90deg); }
.auftragsliste-neu tr.gruppenzeile .gruppen-anzahl { background:#fff; border:1px solid #cdd3db; border-radius:11px;
  padding:1px 9px; font-size:0.74rem; font-weight:700; color:#5a6472; }
.auftragsliste-neu tr.gruppenzeile .gruppen-kennzahlen { margin-left:auto; display:flex; gap:18px; align-items:center;
  font-size:0.78rem; color:#5a6472; flex-wrap:wrap; }
.auftragsliste-neu tr.gruppenzeile .gruppen-kennzahlen b { color:#1c2129; }

/* Terminplan */
.terminplan { border:1px solid #e3e6ea; border-radius:10px; overflow:hidden; background:#fff; }
.terminplan .tp-kopf, .terminplan .tp-zeile, .terminplan .tp-fuss { display:grid; grid-template-columns:340px 1fr; }
.terminplan .tp-kopf { background:#f7f8fa; border-bottom:1px solid #cdd3db; }
.terminplan .tp-fuss { background:#f7f8fa; border-top:1px solid #cdd3db; }
.terminplan .tp-links { padding:8px 12px; display:flex; align-items:center; gap:9px; min-width:0; }
.terminplan .tp-kopf .tp-links, .terminplan .tp-fuss .tp-links { font-size:0.71rem; font-weight:700;
  text-transform:uppercase; letter-spacing:.05em; color:#5a6472; }
.terminplan .tp-tage, .terminplan .tp-last { display:grid; grid-template-columns:repeat(14, 1fr); }
.terminplan .tp-tag { padding:5px 2px; text-align:center; font-size:0.7rem; color:#5a6472; border-left:1px solid #e3e6ea; }
.terminplan .tp-tag .tp-wt { display:block; font-size:0.62rem; color:#8a93a0; text-transform:uppercase; }
.terminplan .tp-tag.ist-we { background:#f0f2f5; color:#8a93a0; }
.terminplan .tp-tag.ist-heute { background:#1a1a1a; color:#fff; }
.terminplan .tp-tag.ist-heute .tp-wt { color:rgba(255,255,255,.8); }
.terminplan .tp-zeile { border-bottom:1px solid #e3e6ea; align-items:center; }
.terminplan .tp-zeile:hover { background:#fafafa; }
.terminplan .tp-titel { font-weight:600; font-size:0.84rem; line-height:1.25; }
.terminplan .tp-titel a { color:#1c2129; }
.terminplan .tp-sub { line-height:1.25; }
.terminplan .tp-rechts { margin-left:auto; text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
.terminplan .tp-gitter { position:relative; display:grid; grid-template-columns:repeat(14, 1fr); height:54px; align-items:center; }
.terminplan .tp-zelle { border-left:1px solid #e3e6ea; height:100%; }
.terminplan .tp-zelle.ist-we { background:#fafbfc; }
.terminplan .tp-balken { position:absolute; height:26px; border-radius:5px; display:flex; align-items:center;
  padding:0 9px; font-size:0.73rem; font-weight:600; color:#fff; white-space:nowrap; overflow:hidden;
  box-shadow:0 1px 2px rgba(0,0,0,.14); text-decoration:none; }
.terminplan .tp-balken:hover { text-decoration:none; filter:brightness(1.06); }
.terminplan .tp-balken .tp-aufbau { position:absolute; left:0; top:0; bottom:0; width:5px; background:rgba(255,255,255,.55); }
.terminplan .tp-balken.tp-warnung { background:repeating-linear-gradient(45deg,#c02b3f,#c02b3f 7px,#a92637 7px,#a92637 14px); }
.terminplan .tp-last div { border-left:1px solid #e3e6ea; text-align:center; padding:5px 1px; font-size:0.73rem; font-weight:600; }
.terminplan .tp-last div.ist-we { background:#f0f2f5; color:#8a93a0; }
.terminplan .tp-last div.ist-eng { background:#fbe3e6; color:#c02b3f; }
.terminplan .tp-last div.ist-voll { background:#fbf1d8; color:#b8860b; }

/* Die neue Auftragsliste teilt ihre Breite selbst ein - die feste Aufteilung der alten Tabelle
   (table-layout:fixed + --sp-*) passte nur zu den früheren Spalten. */
.auftragsliste.auftragsliste-neu { table-layout: auto; }
.auftragsliste.auftragsliste-neu thead th { width: auto !important; }

/* Von Stephan gemeldet (15.08.2026): "Ihr Zeichen" wurde in der neuen Liste fett dargestellt -
   die Zelle ist fett, die Zusatzzeile darunter soll es aber wie in der Vorlage NICHT sein. */
.auftragsliste-neu .bv-zelle .small,
.auftragsliste-neu .bv-zelle .muted,
.auftragsliste-neu .kunde-zelle .small,
.auftragsliste-neu .kunde-zelle .muted { font-weight: 400; }

/* Von Stephan gemeldet: der Status sah nicht aus wie in der Vorschau. In der neuen Auftragsliste
   bekommt der Status-Badge deshalb die Form aus der Vorlage - eckig, kräftig, mit Rahmen. Die
   Farben bleiben die unter Einstellungen -> Auftragsstatus gewählten. Gilt bewusst NUR in dieser
   Tabelle, überall sonst bleiben die Badges unverändert. */
/* Status-Plakette im Stil der freigegebenen Vorschau: eckig, kräftig, heller Hintergrund mit
   Rahmen (Farben kommen je Status aus den Einstellungen, siehe partials/project-status-badge.ejs). */
.badge.badge-hell {
  border-radius: 5px;
  padding: 3px 10px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: .02em;
}

/* Von Stephan gemeldet (15.08.2026): "das Feld springt außerhalb des Monitors" - die neue
   Auftragsliste hat deutlich mehr Spalten. Sie steht deshalb in einem eigenen Rahmen, der bei
   Bedarf waagerecht scrollt (statt die ganze Seite zu verbreitern), und die Zellen sind kompakter. */
.auftragsliste-rahmen { overflow-x: auto; max-width: 100%; }
.auftragsliste.auftragsliste-neu { font-size: 0.83rem; }
.auftragsliste.auftragsliste-neu th,
.auftragsliste.auftragsliste-neu td { padding: 6px 8px; }
.auftragsliste.auftragsliste-neu .bv-zelle { min-width: 190px; max-width: 300px; }
.auftragsliste.auftragsliste-neu .kunde-zelle { min-width: 150px; max-width: 250px; }
.auftragsliste.auftragsliste-neu td[data-col="behoerde"] { max-width: 120px; white-space: normal; }
.auftragsliste.auftragsliste-neu .btn-icon { font-size: 1rem; padding: 2px 5px; text-decoration: none; }
/* Aktionsspalte braucht dadurch nur noch einen Bruchteil der bisherigen Breite. */
.auftragsliste.auftragsliste-neu thead th[data-col="aktionen"] { width: 72px; }

/* -------------------------------------------------------------------------------------------
   Korrekturen nach Stephans Screenshot vom 15.08.2026 (neue Auftragsliste).
   ---------------------------------------------------------------------------------------- */

/* 1. Angeheftete Zeilen klebten über der Kopfzeile und überlagerten die erste Datenzeile.
      In der neuen Liste stehen sie einfach oben in der Sortierung - ohne Sticky-Effekt. */
.auftragsliste.auftragsliste-neu tbody tr.ist-angepinnt > td { position: static; top: auto; z-index: auto; }

/* 2. Die Liste lief über die gesamte Monitorbreite. Sie bekommt jetzt - wie die Formulare -
      eine sinnvolle Höchstbreite und steht mittig. */
.auftragsliste-rahmen { max-width: 1900px; }
/* Breitenbegrenzung entfernt: die Auftragsliste nutzt wie in der Vorschau die volle Breite. */

/* 3. Antragsstatus war ein großer, knallbunter Block. Wie in der freigegebenen Vorschau:
      kleine helle Plakette mit farbiger Schrift und Rahmen. */
.auftragsliste-neu td[data-col="antrag"] .badge {
  border-radius: 5px !important;
  padding: 3px 9px !important;
  font-size: 0.75rem !important;
  font-weight: 700 !important;
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .14);
  filter: saturate(.55) brightness(1.32);
}
.auftragsliste-neu td[data-col="antrag"] .status-picker-caret { opacity: .5; font-size: .7em; }

/* 4. Kopfzeile der Tabelle etwas ruhiger, Zeilen klarer getrennt. */
.auftragsliste.auftragsliste-neu thead th { background: #f4f6f8; color: #5a6472; }
.auftragsliste.auftragsliste-neu tbody tr:hover { background: #fafafa; }

/* -------------------------------------------------------------------------------------------
   Stephans Gestaltungsregel (15.08.2026, wörtlich in CLAUDE.md Abschnitt 6):
   "Buttons sollen immer gleichmäßig aussehen. Immer selbe Breite und Höhe, keine Verschiebung.
    Wenn die Schrift zu lang ist, dann soll die Schrift kleiner werden, aber niemals das Format."
   Umgesetzt für die Auftragsliste: alle Plaketten und Knöpfe einer Spalte haben identische
   Maße; zu langer Text wird über die Stufen .badge-text-s / .badge-text-xs kleiner gesetzt.
   ---------------------------------------------------------------------------------------- */
.badge.badge-text-s  { font-size: 0.68rem; letter-spacing: 0; }
.badge.badge-text-xs { font-size: 0.60rem; letter-spacing: -.01em; }

/* Status- und Antragsplakette: exakt gleiche Kachel in jeder Zeile. */
.auftragsliste-neu td[data-col="status"] .badge,
.auftragsliste-neu td[data-col="antrag"] .badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 122px;
  height: 26px;
  padding: 0 8px !important;
  white-space: nowrap;
  overflow: hidden;
}
.auftragsliste-neu td[data-col="status"],
.auftragsliste-neu td[data-col="antrag"] { width: 138px; }
/* Rechnungsstand in derselben Kachelgröße, damit die Spalte nicht springt. */
.auftragsliste-neu td[data-col="rechnung"] .stand-plakette {
  display: inline-flex; align-items: center; justify-content: center;
  box-sizing: border-box; width: 86px; height: 24px; padding: 0 6px;
}
/* Beantragungszeit und Aufgaben: feste Kachelbreite, mittig - kein Springen je nach Text. */
.auftragsliste-neu td[data-col="beantragung"] .vorlauf,
.auftragsliste-neu td[data-col="beantragung"] .haken-gruen,
.auftragsliste-neu td[data-col="aufgaben"] .aufgaben-warnung,
.auftragsliste-neu td[data-col="aufgaben"] .haken-gruen {
  display: inline-flex; align-items: center; justify-content: center;
  box-sizing: border-box; min-width: 96px; height: 24px;
}
.auftragsliste-neu td[data-col="aufgaben"] .aufgaben-warnung,
.auftragsliste-neu td[data-col="aufgaben"] .haken-gruen { min-width: 54px; }
/* Auftragstyp-Symbol und Bearbeiter-Avatar immer gleich groß und mittig. */
.auftragsliste-neu td[data-col="typ"] { width: 54px; }
.auftragsliste-neu .typ-symbol { width: 28px; height: 28px; object-fit: contain; }

/* Knöpfe auf der Auftragsseite: identische Höhe, keine Verschiebung. */
.auftraege-seite .btn,
.auftraege-seite .btn-sm {
  display: inline-flex; align-items: center; justify-content: center;
  height: 32px; box-sizing: border-box; white-space: nowrap;
}
/* Kategorie-Schnellfilter: alle gleich breit. */
.auftraege-seite .kategorie-filter .btn-sm { min-width: 150px; }
/* Aktionssymbole am Zeilenende: gleiche Fläche wie ein Knopf, ohne die Zeile zu verbreitern. */
.auftragsliste-neu td[data-col="aktionen"] .btn-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; padding: 0;
}

/* ---------------------------------------------------------------------------------------------
   Erinnerungen & Notizen (von Stephan gewünscht, 15.08.2026): Symbol in der Kopfleiste mit Zähler
   und der Hinweis, wenn eine eigene Erinnerung fällig wird. Die Seite selbst bringt ihr eigenes
   Stylesheet mit (public/css/notizbuch.css) - hier steht nur, was innerhalb von WHTK sichtbar ist.
   --------------------------------------------------------------------------------------------- */
/* Von Stephan geändert (16.08.2026): "Position gefällt mir nicht und sieht auch nicht cool aus,
   vielleicht ein Notizbuch als Icon" - der Knopf sitzt jetzt ganz rechts am Ende der Kopfleiste,
   deutlich abgesetzt, rund und mit einem gezeichneten Notizbuch statt eines Emojis. */
/* Notizbuch-Knopf in der Kopfleiste (Stephan, 16.08.2026, wörtlich: "Kein blauer Hintergrund.
   Der Knopf sitzt im Suchfeld. Weißer Hintergrund, roter Rahmen, schwarzes Notizbuch. Spalt
   zwischen Suchfeld und Button setzen. Suche nicht verrutschen").
   Umgesetzt: weiße Fläche, roter Rahmen als echter border (kein box-shadow - der ragte über den
   Knopf hinaus und schob sich optisch ins Suchfeld), schwarzes Symbol. Den Abstand zum Suchfeld
   hält der gemeinsame Block über gap, nicht der Knopf selbst - dadurch kann die Suche nicht
   verrutschen. */
.notizbuch-icon {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 34px;
  border-radius: 6px;
  border: 2px solid #d64558;
  background: #fff;
  color: #111;
  text-decoration: none;
  flex: 0 0 36px;
  box-shadow: none;
}
.notizbuch-icon:hover { background: #f4f6f9; text-decoration: none; }
.notizbuch-icon svg { display: block; }
/* Liegt etwas an, wird der rote Rahmen kräftiger - Farbe und Form bleiben gleich. */
.notizbuch-icon.faellig { border-color: #c6283d; }
.notizbuch-zahl {
  position: absolute; top: -7px; right: -7px; min-width: 17px; height: 17px; padding: 0 4px;
  border-radius: 9px; background: #d64558; color: #fff; font-size: 0.68rem; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center; border: 1px solid #fff;
}
.erinnerung-hinweis {
  position: fixed; right: 18px; bottom: 18px; z-index: 120; width: 320px; max-width: calc(100vw - 36px);
  background: #fff; border: 1px solid #f3bbc2; border-left: 4px solid #d64558; border-radius: 10px;
  box-shadow: 0 8px 24px rgba(20,30,45,.18); padding: 12px 14px; font-size: 0.85rem;
}
.erinnerung-hinweis-kopf { display: flex; align-items: center; gap: 8px; font-weight: 700; color: #8f2231; margin-bottom: 6px; }
.erinnerung-hinweis-zu { margin-left: auto; border: 0; background: none; font-size: 1.1rem; line-height: 1; cursor: pointer; color: #8f2231; width: auto; }
.erinnerung-hinweis-zeile { padding: 3px 0; border-top: 1px solid #f4dfe2; }
.erinnerung-hinweis-zeile:first-child { border-top: 0; }
.erinnerung-hinweis-link { display: inline-block; margin-top: 8px; font-size: 0.8rem; }

/* Knopf "AB" in der Kachel Auftraggeber (Stephan, 16.08.2026: "Nenne den Button AB. Der kann in
   derselben Höhe wie das Telefon sein"). Er trägt Text statt eines Symbols - Größe und Höhe
   bleiben exakt die der übrigen Symbolknöpfe (Regel 6: gleichmäßig, nichts verrutscht), nur die
   Schrift wird kleiner gesetzt, damit "AB" hineinpasst. */
.btn-icon.btn-icon-text {
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: .02em;
}

/* =============================================================================================
   Maßnahmen Details, enger gesetzt (Stephan, 16.08.2026: "der Abstand zwischen Länge und Zusatz
   schmaler machen, sowie der Abstand zwischen Länge und Zusatz zu Regelplan").
   Betrifft ausschließlich dieses eine Raster - alle übrigen Formulare behalten ihre Abstände.
   ============================================================================================= */
.grid.mass-raster-eng {
  column-gap: 10px;   /* zwischen Länge und Zusatz bzw. Regelplan und Material */
  row-gap: 6px;       /* zwischen der Regelplan-Zeile und der Länge-Zeile */
}
/* Halteverbot geht über die ganze Breite und sitzt dicht unter Länge/Zusatz. */
.form-row.mass-eng { margin-top: 6px; }

/* Vermerk "AB an den Kunden gesendet ..." in der Kachel Auftraggeber (Stephan, 16.08.2026).
   Steht dort, wo früher das Häkchen "AB an Kunden" war - ruhig gesetzt, in Grün als Bestätigung,
   dass die Auftragsbestätigung wirklich raus ist. */
.ab-vermerk {
  font-size: 0.78rem;
  color: #1e7a3e;
  background: #e6f6ea;
  border: 1px solid #bde5c8;
  border-radius: 4px;
  padding: 4px 8px;
  margin-bottom: 6px;
}

/* Kachel "Planumsatz" in der Kalkulation eines Auftrags (Stephan, 16.08.2026). Sie zeigt eine
   Erwartung, keinen erzielten Umsatz - deshalb bewusst zurückhaltend abgesetzt, damit sie nicht
   mit der Kachel "Umsatz" daneben verwechselt wird. Größe und Höhe bleiben identisch (Regel 6). */
.stat-card.stat-plan { border-left: 3px solid #9fb0cc; }
.stat-card.stat-plan .value { color: #636363; }

/* Fläche je Bereich in den Maßnahmen Details (Stephan, 16.08.2026: "zu jedem Feld muss unten
   drunter noch L x B = QM"). Sitzt direkt unter dem jeweiligen Auswahlfeld, bleibt schmal und
   ändert die Höhe der Zeile nur um eine Zeile - Fahrbahn, Gehweg, Radweg und Parkstreifen sehen
   dadurch weiterhin gleich aus (Regel 6). */
.mass-flaeche {
  display: flex;
  align-items: center;
  gap: 5px;
  margin-top: 4px;
  font-size: 0.78rem;
  color: var(--muted);
}
/* Von Stephan gewünscht (16.08.2026): "Die Felder Fahrbahn, Parkstreifen, Radweg, Gehweg,
   Grünanlage, Busspur und Fußgängerzone im Auftragstyp Halteverbot und Mainhalteverbot in grau
   hinterlegten Hintergrund, aber auswählbar lassen. Also der Hintergrund der Felder."
   Nachgeschärft am selben Tag: "nein nicht umkehren, ich rede von Feld Hintergrund" - gemeint ist
   also das EINGABEFELD selbst (Auswahl und die beiden Maßfelder), nicht der Kasten drumherum.

   Es ist ausdrücklich KEINE Sperre: kein "disabled", kein "readonly", kein pointer-events. Bei
   einem Halteverbot werden diese Bereiche selten gebraucht - es gibt sie aber, etwa wenn ein
   Gehweg mitgesperrt wird. Beim Hineinklicken wird das Feld weiß, damit sichtbar ist, dass es
   benutzbar ist und gerade benutzt wird. */
.form-row.bereich-blau > select,
.form-row.bereich-blau .mass-flaeche input {
  background: #f3f3f3;
}
.form-row.bereich-blau > select:focus,
.form-row.bereich-blau .mass-flaeche input:focus {
  background: #fff;
}
.form-row.bereich-blau > label {
  color: var(--muted);
}

/* Von Stephan gewünscht (16.08.2026): "Den Text in den Feldern L x B bei Fahrbahn, Gehweg, Radweg,
   Parkstreifen bitte zentriert einfügen. Und die Felder etwas kleiner machen."
   Zentriert statt rechtsbündig, weil in diesen Feldern kurze Maße stehen (15, 1,5) und keine
   Beträge, die untereinander auf dem Komma stehen müssten. */
.mass-flaeche input {
  width: 50px;
  height: 24px;
  padding: 2px 4px;
  font-size: 0.78rem;
  text-align: center;
}
.mass-flaeche .mass-qm {
  font-weight: 700;
  color: var(--primary);
  min-width: 56px;
}

/* Stoppschild als Symbol im Menü, im blinkenden Balken und in der Überschrift des
   Auftragseingangs (von Stephan geliefert, 16.08.2026: "Bitte das Icon nehmen wie im Anhang").
   Bewusst dasselbe Bild an allen drei Stellen, damit der Weg dorthin wiedererkennbar ist. */
/* .sidenav a ist ein Flex-Kasten mit gap:10px - deshalb hier KEIN eigener Außenabstand und kein
   vertical-align, sonst stünde dieser eine Eintrag weiter eingerückt als alle anderen (Regel 6). */
.sidenav .nav-symbol { width: 15px; height: 15px; flex: none; }
.mh-alert-banner .mh-alert-schild { width: 16px; height: 16px; display: block; flex: none; }
.seitenkopf-schild { width: 20px; height: 20px; vertical-align: -3px; margin-right: 8px; }

/* Interne Buchhaltungsnummer der Eingangsrechnungen (Spalte "Int. Nr.").
   Von Stephan vorgegeben (17.08.2026): "Die interne Buchungsnummer soll neben dem Mitarbeiter-Avatar
   mit einem hellblauen Kreis und schwarzer Schrift, dick, 14 angezeigt werden."
   Voll abgerundet statt exakt kreisrund: bei "08-112" wäre ein echter Kreis so groß, dass er die
   Zeilenhöhe sprengt - bei kurzen Nummern sieht die Form identisch aus. */
.bh-nr-kreis {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 30px; height: 30px; padding: 0 9px; border-radius: 999px;
  background: #dddddd; color: #000; font-weight: 700; font-size: 14px; line-height: 1;
  white-space: nowrap;
}
/* Mitarbeiter-Avatar in der kompakten Zeile - kleiner als der 36px-Avatar der Aufgabenliste. */
.erg-mitarbeiter {
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px; border-radius: 50%; flex: none;
  font-size: 0.7rem; font-weight: 700;
}
.bh-nr-zelle { display: flex; align-items: center; gap: 6px; }

/* Farbiges Briefumschlag-Symbol (views/partials/mail-symbol.ejs). Von Stephan festgelegt
   (18.08.2026): Kontakte grün, Lieferanten lila, Behörden blau, Antragsmail gelb, Kontakt-Knopf
   der Behörde rot. Ersetzt das Emoji "✉️", das je nach installierter Schrift blass bis unsichtbar
   dargestellt wurde. */
.mail-symbol { display: inline-block; vertical-align: middle; }
.kontakt-zeile-sym .mail-symbol { vertical-align: -3px; }

/* Behördenliste im Auftrag (Stephan, 18.08.2026, Vorschlag 3). Die Kachel steht in einer schmalen
   Spalte, deshalb je Behörde ein eigener Block statt einer Tabelle: Punkt links, Name und Rolle
   daneben, E-Mail klein darunter. Die Zeile mit dem Punkt ist die Behörde, an die der Antrag geht -
   hellgrün hinterlegt, damit auf einen Blick klar ist, wohin PDF-Antrag, Online-Antrag und
   Antragsmail laufen. */
.behoerden-liste { display: flex; flex-direction: column; gap: 3px; margin-top: 4px; }
.behoerden-zeile {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  padding: 5px 7px;
  border: 1px solid var(--border, #d9dee6);
  border-radius: var(--radius);
  background: #fff;
  cursor: pointer;
}
.behoerden-zeile:hover { background: #f6f8fb; }
/* Die Zeile ist ein <label>, damit ein Klick irgendwo darauf den Punkt setzt. Damit erbt sie die
   Beschriftungs-Optik der Kachel (Großbuchstaben, grau, fett) - hier zurückgestellt, sonst stünden
   Behördenname und Adresse in Versalien und wären kaum zu lesen (im Browser gesehen). */
.behoerden-zeile, .behoerden-zeile * {
  text-transform: none;
  letter-spacing: normal;
  font-weight: 400;
  color: var(--text);
  margin-bottom: 0;
}
.behoerden-zeile b { font-weight: 600; }
.behoerden-zeile .muted { color: var(--text-muted); }
/* Wichtig: die globale Regel "input, select, textarea { width: 100% }" weiter oben gilt auch für
   ein Auswahlfeld. Ohne diese Maße zieht der Punkt die ganze Zeilenbreite an sich, bekommt das
   Feld-Innenabstandsmaß dazu und schiebt Name und E-Mail aus der Kachel (im Browser gesehen). */
.behoerden-zeile > input[type="radio"] {
  width: 16px;
  height: 16px;
  min-width: 16px;
  padding: 0;
  margin: 3px 0 0 0;
  flex: 0 0 auto;
}
.behoerden-text { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; }
/* Schriftgroessen wie im Rest der Kachel (Stephan, 18.08.2026: "baue sie doch in dem Stil wie die
   Seite ist"): Behoerdenname eine Spur groesser als Rolle und Adresse darunter. */
.behoerden-zeile { font-size: 0.78rem; }
.behoerden-zeile .small { font-size: 0.72rem; }
/* Lange Behördennamen und Adressen umbrechen lassen statt die Kachel aufzuweiten. */
.behoerden-text > * { overflow-wrap: anywhere; }
.behoerden-mail { font-size: 0.7rem; }
.behoerde-antragszeile { background: #e8f5ec; border-color: #a8d3ba; box-shadow: inset 3px 0 0 #4a9b68; }
.behoerde-antragszeile:hover { background: #e0f0e6; }

/* Zeile "Der Antrag geht an ..." unter der Behördenliste. Von Stephan vorgegeben (18.08.2026):
   "Warum ist die Schrift so groß, muss nicht sein. Hinterlege es mit einem dunkelgrauen
   Hintergrund und weißer Schrift und passe die Schriftgröße an die an, die wir immer verwenden."
   Die Größe kommt deshalb aus der Klasse "small" (0,82 rem) wie überall sonst in der Kachel. */
/* Nachtrag Stephan (18.08.2026): "ES GEHT UM DIE GROESSE ... baue sie doch in dem Stil wie die
   Seite ist" und "den grauen Kasten eckig machen wie alles andere".
   Groesse deshalb 0,72 rem - dieselbe wie die Beschriftungen NAME / E-MAIL / ANTRAGSSTATUS in
   dieser Kachel (.fk-seite .form-row label weiter oben). Die Klasse "small" (0,82 rem) war noch
   eine Stufe zu gross. Ecken ohne Rundung, damit der Balken nicht als Pille aus der Kachel
   heraussticht. Die Schriftgroesse steht hier und nicht in der Ansicht, damit sie an EINER Stelle
   gepflegt wird. */
.antragsziel-leiste {
  background: #4a4f57;
  color: #fff;
  font-size: 0.72rem;
  line-height: 1.45;
  padding: 5px 8px;
  border-radius: 0;
  margin-top: 5px;
  overflow-wrap: anywhere;
}
.antragsziel-leiste b { color: #fff; font-weight: 600; }

/* Auswahl aus dem Behördenstamm beim Knopf "+ Behörde" (Stephan, 18.08.2026: "hier soll eine
   Auswahl aus dem Behördenstamm erfolgen mit Textsuche und Behördennummer"). */
.behoerde-neu {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin-top: 6px;
  padding: 8px;
  border: 1px dashed var(--border, #d9dee6);
  border-radius: var(--radius);
  background: #fcfcfc;
}
.behoerde-neu-knoepfe { display: flex; gap: 6px; }
.behoerde-neu-knoepfe .btn { flex: 1; }

/* Die beiden Abrufe in der Seitenleiste und in den Einstellungen auseinanderhalten
   (Stephan, 18.08.2026: "Digitaler Abruf Schriftfarbe rot, Digitaler Belegabruf in grün").
   Sie heißen fast gleich - der eine holt Aufträge aus dem Shop, der andere Belege aus der
   Belegerfassung. Die Farbe gilt auch im aktiven Zustand, sonst verschwände genau dann die
   Unterscheidung, wenn man auf der Seite steht. */
/* Nur in der Seitenleiste einfärben - in den Einstellungen bleiben die Einträge unauffällig
   (Stephan, 18.08.2026). Die Farbe gilt auch im aktiven Zustand, sonst verschwände die
   Unterscheidung genau dann, wenn man auf der Seite steht. Rot und Grün sind auf dem dunklen
   Grund der Leiste aufgehellt, damit sie lesbar bleiben. */
.sidenav a.nav-auftragsabruf, .sidenav a.nav-auftragsabruf.active { color: #ff7b8d; }
.sidenav a.nav-belegabruf, .sidenav a.nav-belegabruf.active { color: #6fd79b; }

/* "Zugang für die Belegerfassung zu WHTK": Werte zum Herauskopieren, keine Eingabe
   (Stephan, 18.08.2026: "ich kann nichts eintragen" - die Felder sahen aus wie Formularfelder,
   waren aber gesperrt). Deshalb sichtbar als Kasten mit fester Schrift statt als Eingabefeld. */
.beleg-zugang { display: flex; flex-direction: column; gap: 8px; max-width: 760px; }
.beleg-zugang > div { display: flex; flex-direction: column; gap: 2px; }
.beleg-zugang-bez { font-size: 0.72rem; font-weight: 600; color: var(--text-muted); letter-spacing: .2px; }
/* Der Kopieren-Knopf soll nur so breit sein wie sein Text - in .form-actions läuft er sonst
   über die volle Breite und wirkt wie der Hauptknopf der Seite. */
.beleg-zugang .form-actions { display: flex; align-items: center; gap: 10px; }
.beleg-zugang .form-actions .btn { width: auto; flex: 0 0 auto; }
.beleg-zugang code {
  display: block;
  background: #f2f5f9;
  border: 1px solid var(--border, #d9dee6);
  border-radius: var(--radius);
  padding: 8px 10px;
  font-size: 0.82rem;
  overflow-wrap: anywhere;
  user-select: all;
}
