
  /* ============ Schriftart ============
     Avenir Next LT Pro war lizenzpflichtig und nie wirklich aktiv (dieser
     Block blieb immer auskommentiert, die Fallback-Kette griff). Rafael,
     2026-10-14: "alles in Simplex Web optisch an den neuen Style
     anpassen" (Homepage-Styleguide, style.css/styleguide.html) - der setzt
     auf Poppins (300/600/800) + Instrument Serif Italic als Akzent, beide
     frei über Google Fonts verfügbar (siehe <link> in index.html) statt
     selbst gehostete woff2-Dateien, die dem Styleguide nicht beilagen. */

  :root{
    --font:"Poppins",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
    --font-accent:"Instrument Serif",Georgia,serif;
    /* Markenfarben (Homepage-Styleguide Okt. 2026): Navy var(--brand-dark) trägt
       die Flächen, Hellblau var(--brand) ist reiner Akzent (nicht flächig
       einsetzen), Weiß kontrastiert - beide Werte decken sich 1:1 mit --navy/
       --blue im Styleguide, keine Änderung nötig. Neu dazugekommen: Cyan/Mint
       als weitere Akzentfarben (noch ungenutzt, für künftige Komponenten
       reserviert) sowie nachgeschärfte Erfolgs-/Fehlerfarben und --ink als
       Wert für --muted (Sekundärtext etwas wärmer/dunkler als vorher). */
    --brand:#94C7F9; --brand-dark:#17345F; --brand-soft:#EAF3FE;
    --cyan:#4DB3DC; --cyan-strong:#2FA8DC; --mint:#C9EEE0; --mint-deep:#B4E6DD;
    --card:#F7F9FC; --text:var(--brand-dark); --muted:#4A6285;
    /* --border/--divider/--grid-line: vorher kräftiger hellblau (Sept.-
       Styleguide), jetzt auf die neutralere Graustufen-Linie der Live-
       Seite (--line-on-light rgba(23,52,95,.14), als Flat-Hex-Äquivalent
       über Weiß berechnet statt rgba, damit die Linie über JEDEM
       Kartenhintergrund gleich aussieht statt je nach BG durchzuschimmern). */
    --border:#DEE3ED;
    --ok:#3A9B72; --warn:#CC8F1A; --danger:#B14A41; --newin:#C2456F;
    /* --bg-bot bewusst von --surface-soft entkoppelt (eigener Wert statt
       Alias) - --surface-soft wird an 17 anderen Stellen für kleine
       Flächen (Chart-Raster, Zonen-Leisten) wiederverwendet, die sollen
       unverändert bleiben. Rafael zeigte die Live-Seite im Vergleich:
       deren Flächen-Verlauf wandert sichtbar Richtung Mint/Cyan, hier
       bisher komplett blau - --bg-bot jetzt ein Hauch Mint statt reinem
       Hellblau, bringt die zweite Markenfarbe in den Seitenhintergrund. */
    --bg-top:#EAF3FC; --bg-bot:#EAF7F1;
    /* Live-Seiten-Tokens (assets/design-tokens-simplexfm-live.css, Stand
       2026-10-14): --shadow-card und --gradient-navy 1:1 übernommen -
       weicherer, navy-getönter Kartenschatten statt der alten, stärker
       gestreuten Variante; Button-Verlauf jetzt navy->cyan (90deg) statt
       einfarbig dunkelblau. Dunkelmodus-Schatten bleibt neutral-schwarz,
       dafür liefert der Live-Export keine eigene Variante. */
    --shadow:0 2px 16px 0 rgba(23,52,95,.1);
    --grad-btn:#17345F;
    /* --rail bewusst ein fester Literal-Wert, NICHT var(--brand-dark) - die
       Leiste soll in allen drei Theme-Zuständen gleich dunkel bleiben, aber
       --brand-dark selbst wird im Dunkelmodus heller (siehe unten), damit
       Navy-Text auf dunklen Karten lesbar bleibt. Eine Referenz hier würde
       die Leiste im Dunkelmodus unbeabsichtigt aufhellen. */
    --rail:#17345F; --rail-2:#2E4C77; --rail-txt:#9EC3E3; --rail-line:rgba(255,255,255,.09);
    --rail-w:250px; --rail-w-min:74px;
    /* Zusätzliche, "leise" Flächentöne (Trenner/Hover/Kacheln) - vorher als
       Literal-Hex im ganzen Stylesheet verstreut, jetzt als Token, damit der
       Dunkelmodus (siehe unten) sie an einer Stelle umdefinieren kann. */
    --divider:#F1F3F9; --grid-line:#F1F3F9;
    --tint:#F1F8FD; --tint-2:#F6FBFE; --surface-soft:#F7FBFE;
    --chip-bg:#EAF2F8; --chip-border:#CDE8FA; --thumb-bg:#F4F9FD;
    --ok-soft:#E6F6EF; --ok-soft-border:#B9E6CE;
    --warn-soft:#FFF3DE; --warn-soft-border:#F0E2BE; --warn-soft-text:#8A5A00;
    --danger-soft:#FDECEA; --danger-soft-border:#F3C9BF; --danger-soft-text:#B5341A;

    /* ---------------------------------------------------------------------
       LIVE-SEITEN-TOKENS (assets/design-tokens-simplexfm-live.css, Stand
       2026-10-14), Rafael 2026-10-14: "mach mal alles". Hier additiv als
       eigene Tokens ergänzt statt die bestehenden Werte oben zu ersetzen -
       Radien/Glas/Korall-Glow/Verläufe/Bewegung sind größere stilistische
       Eingriffe, die ohne Bildschirm-Vorschau (Sandbox kann nicht
       screenshotten) nicht blind flächendeckend über alle ~250 Komponenten-
       Regeln gezogen werden sollten. Stattdessen gezielt dort eingesetzt,
       wo es eindeutig passt (Glas: schwebende Modals/Menüs; Korall-Glow:
       Primär-Button-Hover; Easing: bereits vorhandene Hover-Lift-Karten) -
       siehe die jeweiligen Komponenten-Regeln weiter unten. */
    /* Einheitliche Eckenradien (Rafael, 2026-10-18: "einheitliche Eckenradien, sonst ist
       übel"): drei Stufen + Pille/Kreis. sm = kleine Chips/Icons/Badges, md = Buttons,
       Eingaben, Kacheln, Listenzeilen, lg = Karten/Panels/Dialoge/Sidebar. */
    --r-sm:8px; --r-md:12px; --r-lg:20px;
    --radius-xs:1px; --radius-sm:2px; --radius-md:10px; --radius-lg:12px;
    --radius-xl:16px; --radius-2xl:20px; --radius-3xl:26px; --radius-pill:999px;
    --glass-white-55:rgba(255,255,255,.55); --glass-white-72:rgba(255,255,255,.72);
    /* Name "-90" aus den Live-Seiten-Tokens übernommen, Wert aber auf
       Rafaels Wunsch ("alles noch etwas transparenter, soll der
       Website matchen", 2026-10-15) von .90 auf .80 abgesenkt. */
    --glass-white-90:rgba(255,255,255,.80);
    /* --card-glass: eigenes, theme-fähiges Token (im Dunkelmodus unten
       überschrieben) statt --glass-white-90 direkt zu verwenden - sonst
       wären die Karten im Dunkelmodus helles Weiß-Glas auf dunklem BG. */
    /* Website-Glas (Rafael, 2026-10-18: "Kacheln leicht transparent glasig" wie die
       Hero-Karten der Website): deutlich durchsichtiger als vorher (.80),
       heller Rand statt grauer Linie, weicher Navy-Schatten + Lichtkante oben. */
    --card-glass:rgba(246,249,252,.7);
    --card-edge:rgba(23,52,95,.08);
    --card-shadow:0 2px 4px rgba(23,52,95,.08),0 18px 40px -14px rgba(23,52,95,.36),inset 0 1px 0 rgba(255,255,255,.85);
    --overlay-navy-18:rgba(23,52,95,.18); --overlay-navy-25:rgba(23,52,95,.25);
    --shadow-card-raised:0 1px 2px 0 rgba(23,52,95,.06),0 18px 44px -14px rgba(23,52,95,.28);
    --shadow-float:0 10px 30px -10px rgba(23,52,95,.5);
    --glow-coral-outer:0 40px 80px 0 rgba(217,119,87,.24),0 4px 14px 0 rgba(217,119,87,.24);
    --gradient-brand:linear-gradient(115deg,#2FA8DC 0%,#5CC3E6 45%,#72CFAE 100%);
    --gradient-navy:var(--grad-btn);
    --ease-signature:cubic-bezier(0.16,1,0.3,1);
  }
  /* ============ Dunkelmodus ============
     Drei Zustände (siehe js/core/theme.js): "System" folgt prefers-color-scheme
     und setzt KEIN data-theme-Attribut -> nur die Media-Query greift. Eine
     bewusste Wahl (Hell/Dunkel im Umschalter) setzt data-theme="light"/"dark"
     auf <html> und gewinnt in beide Richtungen. Rail bleibt in beiden Themes
     bewusst gleich dunkel (siehe .rail weiter unten) - kein eigenes Token nötig. */
  @media(prefers-color-scheme:dark){
    :root:not([data-theme="light"]){
      --brand:#94C7F9; --brand-dark:#6FA3D8; --brand-soft:#243B5E;
      --card:#1B2B44; --text:#DCE6F0; --muted:#98AEC4; --border:#2F4766;
      --ok:#34C98B; --warn:#F0B33D; --danger:#F0704E; --newin:#F0568E;
      --bg-top:#142238; --bg-bot:#182940;
      --shadow:0 12px 32px rgba(5,12,24,.32);
      --card-glass:rgba(30,46,72,.78); --card-edge:var(--border); --card-shadow:var(--shadow);
      --divider:#2A405E; --grid-line:#25395A;
      --tint:#223654; --tint-2:#263C5C; --surface-soft:#1F3250;
      --chip-bg:#22375A; --chip-border:#35537B; --thumb-bg:#1F3250;
      --ok-soft:rgba(52,201,139,.14); --ok-soft-border:rgba(52,201,139,.38);
      --warn-soft:rgba(240,179,61,.14); --warn-soft-border:rgba(240,179,61,.38); --warn-soft-text:#F0B33D;
      --danger-soft:rgba(240,112,78,.14); --danger-soft-border:rgba(240,112,78,.38); --danger-soft-text:#F0704E;
    }
  }
  :root[data-theme="dark"]{
    --brand:#94C7F9; --brand-dark:#6FA3D8; --brand-soft:#243B5E;
    --card:#1B2B44; --text:#DCE6F0; --muted:#98AEC4; --border:#2F4766;
    --ok:#34C98B; --warn:#F0B33D; --danger:#F0704E; --newin:#F0568E;
    --bg-top:#142238; --bg-bot:#182940;
    --shadow:0 12px 32px rgba(5,12,24,.32);
    --card-glass:rgba(30,46,72,.78); --card-edge:var(--border); --card-shadow:var(--shadow);
    --divider:#2A405E; --grid-line:#25395A;
    --tint:#223654; --tint-2:#263C5C; --surface-soft:#1F3250;
    --chip-bg:#22375A; --chip-border:#35537B; --thumb-bg:#1F3250;
    --ok-soft:rgba(52,201,139,.14); --ok-soft-border:rgba(52,201,139,.38);
    --warn-soft:rgba(240,179,61,.14); --warn-soft-border:rgba(240,179,61,.38); --warn-soft-text:#F0B33D;
    --danger-soft:rgba(240,112,78,.14); --danger-soft-border:rgba(240,112,78,.38); --danger-soft-text:#F0704E;
  }
  *{box-sizing:border-box}
  html,body{height:100%}
  /* font-weight bewusst NICHT auf 300 (wie auf der Homepage) - das Dashboard
     ist ein dichtes Arbeitswerkzeug mit viel Kleinschrift (Tabellen, Labels),
     kein luftiger Marketing-Text; Poppins Regular (400, Browser-Default)
     bleibt hier lesbarer. Die Markentypo selbst (Poppins statt System-Font)
     zieht trotzdem überall durch - fast nichts im Stylesheet setzt
     font-weight:300 explizit (siehe Rafael, 2026-10-14: "optisch an den
     neuen Style anpassen"). */
  /* Rafael, 2026-10-15: echtes Hintergrundbild von der Live-Seite in die
     assets gelegt (assets/Background_Landingpage.jpeg) - der weiche
     Verlauf (Hellblau oben-links -> Mint unten-rechts), den ich in
     Phase 5 nur aus dem Screenshot geschätzt hatte, ist damit jetzt
     pixelgenau statt angenähert. background-color bleibt als
     Fallback/Ladezustand bestehen. Nur im Hellmodus - im Dunkelmodus
     (zwei Overrides direkt im Anschluss) bleibt der bisherige dunkle
     Verlauf, das Bild ist dafür zu hell. */
  body{margin:0;font-family:var(--font);
    background-image:linear-gradient(115deg,rgba(226,234,243,.62) 0%,rgba(222,233,240,.55) 55%,rgba(218,236,232,.5) 100%),url('assets/Background_Landingpage.jpeg');
    background-size:cover;background-position:center;background-repeat:no-repeat;background-attachment:fixed;
    background-color:var(--bg-bot);color:var(--text);height:100vh;overflow:hidden}
  @media(prefers-color-scheme:dark){
    :root:not([data-theme="light"]) body{background-image:none;background:linear-gradient(160deg,var(--bg-top) 0%,var(--bg-bot) 100%)}
  }
  :root[data-theme="dark"] body{background-image:none;background:linear-gradient(160deg,var(--bg-top) 0%,var(--bg-bot) 100%)}

  /* ============ Dämmerung (dritter Modus) ============
     Rafael, 2026-10-18: "dunkler Hintergrund und helle Kacheln" - Seite/Rail/Titel
     dunkel (gedämpftes Navy, nicht das harte Schwarzblau), alle Karten, Dialoge
     und die Ticketliste dagegen in den hellen, abgetönten Karten-Farben. Dafür
     bekommen die Karten-Klassen die HELLEN Tokens lokal zurück (Custom Properties
     erben nach innen), die Seite selbst nutzt die dunklen. */
  :root[data-theme="dusk"]{
    --brand:#94C7F9; --brand-dark:#6FA3D8; --brand-soft:#243B5E;
    --card:#1B2B44; --text:#DCE6F0; --muted:#98AEC4; --border:#2F4766;
    --bg-top:#142238; --bg-bot:#182940;
    --shadow:0 12px 32px rgba(5,12,24,.32);
    --divider:#2A405E; --grid-line:#25395A;
    --tint:#223654; --tint-2:#263C5C; --surface-soft:#1F3250;
    --chip-bg:#22375A; --chip-border:#35537B; --thumb-bg:#1F3250;
    --card-glass:rgba(244,248,252,.93); --glass-white-90:rgba(244,248,252,.95);
    --card-edge:rgba(255,255,255,.55); --card-shadow:0 14px 34px -12px rgba(3,9,20,.55),inset 0 1px 0 rgba(255,255,255,.7);
  }
  :root[data-theme="dusk"] body{background-image:none;background:linear-gradient(160deg,var(--bg-top) 0%,var(--bg-bot) 100%)}
  :root[data-theme="dusk"] :is(.card,.kpi,.qcard,.ph-card,.pane,.hw-form,.hw-side,.kunde-card,.modal,.usermenu,.st-panel,#tkTable tbody td,#tkTable .tblwrap th){
    --brand-dark:#17345F; --brand-soft:#EAF3FE;
    --card:#F7F9FC; --text:#17345F; --muted:#4A6285; --border:#DEE3ED;
    --divider:#F1F3F9; --grid-line:#F1F3F9;
    --tint:#F1F8FD; --tint-2:#F6FBFE; --surface-soft:#F7FBFE;
    --chip-bg:#EAF2F8; --chip-border:#CDE8FA; --thumb-bg:#F4F9FD;
    --ok:#3A9B72; --warn:#CC8F1A; --danger:#B14A41; --newin:#C2456F;
    --ok-soft:#E6F6EF; --ok-soft-border:#B9E6CE;
    --warn-soft:#FFF3DE; --warn-soft-border:#F0E2BE; --warn-soft-text:#8A5A00;
    --danger-soft:#FDECEA; --danger-soft-border:#F3C9BF; --danger-soft-text:#B5341A;
    color:var(--text)}
  /* Seitenüberschrift/Kopfzeilen außerhalb der Karten bleiben hell auf dunkel. */
  :root[data-theme="dusk"] .main{color:var(--text)}
  button,input,textarea{font-family:inherit}
  :focus-visible{outline:2px solid var(--brand-dark);outline-offset:2px;border-radius:var(--r-sm)}

  /* ============ Grundgerüst ============ */
  .shell{display:flex;height:100vh;min-height:0}
  .main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;min-height:0}

  /* ============ Navigationsleiste ============ */
  /* Rafael, 2026-10-15: "die passt in dem dunklen blau halt gar nicht
     mehr" (zur Sidebar, nachdem die Kacheln jetzt Glas-Optik haben) -
     eigener Vorschlag: die Rail ins selbe Glas-Konzept übersetzen statt
     flach-opak zu lassen, damit sie nicht wie ein fremder Block neben
     den neuen transparenten Karten wirkt. Literal-rgba statt var(--rail)/
     var(--rail-2) direkt, weil diese beiden Tokens an anderen Stellen
     (Tooltips, aktive Nav-Textfarbe) weiterhin voll opak gebraucht
     werden. Bewusst nur 90% Transparenz (nicht z.B. 65% wie es die
     Website streckenweise nutzt) - der Nav-Text ist weiß, da darf der
     Kontrast nicht leiden. Rail bleibt wie bisher in beiden Themes
     gleich dunkel (kein data-theme-Override nötig). */
  .rail{flex:0 0 auto;width:var(--rail-w);background:linear-gradient(180deg,rgba(23,52,95,.78) 0%,rgba(46,76,119,.78) 100%);
    backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
    color:#fff;display:flex;flex-direction:column;min-height:0;transition:width .18s ease;z-index:60}
  body.rail-min .rail{width:var(--rail-w-min)}
  /* Floating Glas-Panel (Rafael, 2026-10-18: "wie eine Ebene drauf ... lass uns
     das geil machen"): die Leiste klebt nicht mehr am Rand, sondern schwebt mit
     Abstand und großen Rundungen über dem Farbverlauf (wie die Hero-Karte der
     Website). Nur Desktop - unter 980px bleibt sie die Drawer-Variante. */
  @media(min-width:981px){
    .shell{padding:14px 0 14px 14px;gap:14px;height:100vh}
    .rail{height:100%;border-radius:var(--r-lg);
      background:#17345F;backdrop-filter:none;-webkit-backdrop-filter:none;
      border:1px solid rgba(255,255,255,.22);
      box-shadow:0 24px 60px rgba(23,52,95,.28),0 2px 6px rgba(23,52,95,.18),inset 0 1px 0 rgba(255,255,255,.28);
      overflow:hidden}
  }
  .rail-top{display:flex;align-items:center;gap:15px;padding:22px 18px 18px;flex:0 0 auto}
  /* Kompaktes "S"-Icon -- nur sichtbar, wenn das Rail eingeklappt ist und
     kein Platz für den vollen Schriftzug bleibt (assets/icon-256.png -
     bewusst die PNG, nicht das gleichnamige .webp: das ist trotz Namen
     nur 128x132px statt echter 256px, wirkte dadurch unscharf). */
  .rail-mark{display:none;width:38px;height:38px;flex:0 0 auto;border-radius:var(--r-sm);object-fit:cover;box-sizing:border-box;border:1.5px solid rgba(255,255,255,.75)}
  .rail-top .wm{line-height:1.2;min-width:0}
  /* Sidebar-Schriftzug als Bild (assets/simplexweb-wordmark-white.webp, weiße
     Variante fürs dunkle Rail) statt Nachbau in CSS – exakt die Logo-Datei.
     Höhe angehoben (23->36px, dann 36->46px) - das neue Wordmark ist
     schmaler/gedrungener als das alte (anderes Seitenverhältnis), wirkte
     bei alter Höhe winzig. Rafael, 2026-10-14: erst "das Logo ist zu
     klein", dann "noch etwas größer, oben so 65% Breite" (gemeint war
     die Sidebar, nicht der Login-Screen) - bei 46px Höhe füllt die
     Wortmarke (Seitenverhältnis ~2.99:1) ca. 65% der Rail-Innenbreite
     (250px minus Padding) aus. */
  .wm-logo{display:block;height:46px;width:auto}
  /* Wortmarke auf dem (hellen) Login-Screen: die farbige Variante
     (assets/simplexweb-wordmark-color.webp, Navy+Hellblau) statt der
     weißen – auf der weißen Login-Karte wäre Weiß unsichtbar. Höhe aus
     demselben Grund wie oben angehoben (32->54px). Rafael wollte die
     65%-Breite-Vergrößerung eigentlich für die Sidebar (siehe .wm-logo
     oben), hier zurückgesetzt. */
  .wm-logo-lg{display:block;height:54px;width:auto;margin:0 auto 16px}
  .rail-top .wm-sub{display:block;font-size:11px;line-height:1.35;color:var(--rail-txt);margin-top:7px}
  body.rail-min .rail-top .wm{display:none}
  body.rail-min .rail-mark{display:block}
  .railCollapseBtn{margin-left:auto;flex:0 0 auto;width:26px;height:26px;border:none;border-radius:var(--r-sm);
    background:rgba(255,255,255,.08);color:var(--rail-txt);display:flex;align-items:center;justify-content:center;
    cursor:pointer;transition:background .12s}
  .railCollapseBtn:hover{background:rgba(255,255,255,.16);color:#fff}
  .railCollapseBtn svg{transition:transform .15s}
  body.rail-min .railCollapseBtn svg{transform:rotate(180deg)}
  /* Eingeklappt: Icon + Umschalt-Button nebeneinander sind zu breit für die
     74px schmale Leiste (38px Icon + 15px Abstand + 26px Button > 74px) -
     stattdessen sauber übereinander stapeln. */
  body.rail-min .rail-top{flex-direction:column;justify-content:center;padding:18px 0;gap:10px}
  /* Pfeil-Button übers Icon statt darunter - order statt DOM-Reihenfolge,
     damit die ausgeklappte Ansicht (Button ganz rechts) unangetastet bleibt. */
  body.rail-min .railCollapseBtn{margin-left:0;order:-1}
  body.rail-min .rail-mark{order:0}
  /* Die Tageszeit-Begrüßung (core/user.js renderGreeting()) ist ein ganzer
     Satz - passt in 74px nicht sinnvoll, blendet sich beim Einklappen aus
     (genau wie beim automatischen Einklappen unter 1320px per Media Query). */
  body.rail-min .rail-greet{display:none}
  @media(max-width:1320px){ .railCollapseBtn{display:none} }
  /* Tageszeit-Begrüßung zwischen Logo und Navigation, siehe renderGreeting()
     in js/core/user.js – schafft auch den gewünschten Abstand zum Logo.
     Auf Wunsch "offensichtlicher" gemacht: fast volle Breite (statt
     18px Seitenrand) + kräftigerer Hintergrund + Akzentstreifen, damit
     sie nicht mehr im dunklen Rail untergeht. Rafael, 2026-09-19. */
  .rail-greet{margin:10px 10px 18px;padding:12px 14px;background:rgba(255,255,255,.13);
    border-left:3px solid var(--brand);border-radius:var(--r-md);font-size:13px;font-weight:700;line-height:1.4;color:#fff;
    min-height:17px}
  .rail-nav{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;padding:6px 10px 10px}
  .rail-nav::-webkit-scrollbar{width:6px}
  .rail-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-radius:3px}
  .navlbl{font-size:10.5px;font-weight:700;letter-spacing:.7px;text-transform:uppercase;color:rgba(169,196,210,.72);
    padding:14px 12px 7px;white-space:nowrap}
  body.rail-min .navlbl{opacity:0;height:22px;padding:0;overflow:hidden}
  .nav{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:none;border-radius:var(--r-md);
    color:#fff;text-decoration:none;font-size:14px;font-weight:600;cursor:pointer;text-align:left;transition:background .12s,color .12s;position:relative}
  .nav .ico{width:19px;height:19px;flex:0 0 auto;display:flex}
  .nav .ico svg{width:100%;height:100%}
  .nav .nm{flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .nav .cnt{flex:0 0 auto;font-size:11px;font-weight:700;background:rgba(255,255,255,.12);color:#fff;
    border-radius:999px;padding:2px 8px;min-width:22px;text-align:center}
  .nav .cnt:empty{display:none}
  .nav:hover{background:rgba(255,255,255,.10);color:#fff}
  /* Aktiver Menüpunkt: auf dem Navy-Rail übernimmt Hellblau als Akzent die
     Hervorhebung (Navy-Grad-btn würde auf Navy-Grund untergehen). */
  .nav.active{background:linear-gradient(135deg,rgba(148,199,249,.34),rgba(255,255,255,.16));color:#fff;font-weight:700;
    box-shadow:inset 0 0 0 1px rgba(255,255,255,.34),0 6px 16px rgba(10,25,50,.22)}
  .nav.active .cnt{background:rgba(255,255,255,.26);color:#fff}
  .nav.soon .nm::after{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
    background:rgba(169,196,210,.5);margin-left:8px;vertical-align:middle}
  .nav.active.soon .nm::after{background:rgba(255,255,255,.6)}
  body.rail-min .nav{justify-content:center;padding:11px 0}
  body.rail-min .nav .nm,body.rail-min .nav .cnt{display:none}
  /* Eingeklappt bleibt nur noch das Icon übrig - etwas größer/kräftiger,
     damit es allein gut lesbar ist statt klein zu wirken. Rafael,
     2026-09-19. */
  body.rail-min .nav .ico{width:23px;height:23px}
  body.rail-min .nav .ico svg{stroke-width:2.4}
  /* Tooltip fürs eingeklappte Menü NICHT mehr über ::after/data-tip lösen -
     .rail-nav hat overflow-x:hidden (fürs Scrollen nötig), das hat den
     Tooltip immer unsichtbar abgeschnitten. Stattdessen ein einzelnes,
     per JS positioniertes .rail-tip-Element (siehe nav.js), das als
     position:fixed nicht vom Rail-Overflow betroffen ist. */
  .rail-tip{position:fixed;z-index:500;left:0;top:0;transform:translate(0,-50%);background:var(--rail);color:#fff;
    font-size:12.5px;font-weight:650;padding:6px 11px;border-radius:var(--r-sm);box-shadow:0 10px 24px rgba(23,52,95,.28);
    pointer-events:none;opacity:0;white-space:nowrap;transition:opacity .12s}
  .rail-tip.on{opacity:1}

  /* ---- Benutzerwechsel ---- */

  /* ---- Angeheftete Navigation unten (Einstellungen, …) ---- */
  .rail-pinned{display:flex;flex-direction:column;gap:2px;padding:0 0 8px;margin-bottom:8px;border-bottom:1px solid var(--rail-line)}
  .rail-pinned .nav{font-size:13.5px}
  body.rail-min .rail-pinned{align-items:center}
    .rail-foot{flex:0 0 auto;border-top:1px solid var(--rail-line);padding:10px;position:relative}
  .userbtn{display:flex;align-items:center;gap:10px;width:100%;border:none;background:rgba(255,255,255,.06);
    border-radius:var(--r-md);padding:8px 10px;cursor:pointer;color:#fff;text-align:left;transition:background .12s}
  .userbtn:hover{background:rgba(255,255,255,.14)}
  .av{width:32px;height:32px;border-radius:50%;flex:0 0 auto;display:flex;align-items:center;justify-content:center;
    font-size:13px;font-weight:800;color:#fff;overflow:hidden}
  .av-bot svg{display:block}
  .av-photo{background:var(--border)}
  .av-photo img{width:100%;height:100%;object-fit:cover;display:block}
  .userbtn .ub{flex:1 1 auto;min-width:0;line-height:1.2}
  .userbtn .ub b{display:block;font-size:13.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .userbtn .ub span{display:block;font-size:11px;color:var(--rail-txt)}
  .userbtn .cv{flex:0 0 auto;opacity:.7}
  body.rail-min .userbtn .ub,body.rail-min .userbtn .cv{display:none}
  body.rail-min .userbtn{justify-content:center;padding:8px 0}
  /* Glas-Optik (Live-Seiten-Token --glass-white-90, Stand 2026-10-14):
     schwebt frei über der Seite, kein umgebender Dim-Hintergrund wie bei
     .overlay/.modal - 90% Deckkraft statt var(--card) blieb bewusst fast
     opak, damit der Text drunter nicht durchscheint und lesbar bleibt. */
  .usermenu{position:absolute;left:10px;right:10px;bottom:calc(100% + 8px);
    background:var(--glass-white-90);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    border:1px solid var(--glass-white-55);border-radius:var(--r-md);
    box-shadow:var(--shadow-float);padding:6px;display:none;z-index:80}
  .usermenu.open{display:block}

  /* ---- Benachrichtigungs-Glocke (core/notifications.js) ---- */
  /* Sitzt zwischen Begrüßung und Navigation. War erst ein isoliertes
     kleines Quadrat mit viel Leerraum drumherum ("optisch besser
     einpassen, kacke so"), dann eine Zeile ganz im Nav-Stil - auf Wunsch
     nochmal korrigiert: "nicht als Menüpunkt abheben sondern separat".
     Jetzt eigens eingerahmt (Border + eigener Hintergrund, wie eine
     kleine eigene Box) statt sich optisch in die Nav-Liste einzureihen -
     bleibt aber ansonsten die volle Zeile mit Icon/Label/Zähler.
     Rafael, 2026-09-20. */
  .notif-wrap{margin:0 10px 14px}
  .notif-bell{position:relative;display:flex;align-items:center;gap:12px;width:100%;padding:9px 12px;
    border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);border-radius:var(--r-md);color:#fff;
    font-size:14px;font-weight:600;cursor:pointer;text-align:left;transition:background .12s,border-color .12s}
  .notif-bell:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.22)}
  .notif-bell .ico{width:19px;height:19px;flex:0 0 auto;display:flex}
  .notif-bell .ico svg{width:100%;height:100%}
  .notif-bell .nm{flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .notif-badge{flex:0 0 auto;min-width:20px;height:20px;padding:0 6px;border-radius:999px;
    background:var(--danger);color:#fff;font-size:11px;font-weight:800;line-height:1;
    display:flex;align-items:center;justify-content:center}
  /* [hidden] ist eine Attribut-Selektor-Regel mit geringerer Spezifität als
     .notif-badge{display:flex} oben, gewinnt im Zweifel aber trotzdem nicht
     automatisch gegen eine spätere Klassen-Regel - ohne dieses Override
     blieb der Zähler auch nach updateNotifBadge()'s badge.hidden=true
     sichtbar (die Logik selbst war schon richtig, nur die CSS-Anzeige
     ignorierte "hidden"). Rafael, 2026-09-20. */
  .notif-badge[hidden]{display:none}
  /* Eingeklapptes Rail: wie bei .nav nur noch das Icon, der Zähler wird
     zum kleinen Punkt oben rechts am Icon statt der vollen Pille. */
  body.rail-min .notif-bell{justify-content:center;padding:11px 0}
  body.rail-min .notif-bell .nm{display:none}
  body.rail-min .notif-bell .ico{width:23px;height:23px}
  body.rail-min .notif-badge{position:absolute;top:4px;right:8px;min-width:14px;height:14px;padding:0;
    font-size:0;border:2px solid var(--rail)}
  .notif-panel{position:fixed;width:340px;max-width:calc(100vw - 24px);max-height:70vh;overflow-y:auto;
    background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 22px 50px rgba(0,0,0,.32);
    z-index:300}
  .notif-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;gap:10px;
    padding:14px 16px;border-bottom:1px solid var(--divider);background:var(--card)}
  .notif-head h3{margin:0;font-size:14.5px;font-weight:800}
  .notif-send{border:none;background:var(--grad-btn);color:#fff;width:28px;height:28px;border-radius:50%;
    font-size:16px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;line-height:1}
  .notif-list{padding:4px}
  .notif-item{display:flex;align-items:flex-start;gap:11px;padding:10px 12px;border-radius:var(--r-md)}
  .notif-item:hover{background:var(--surface-soft)}
  .notif-item.unread{background:var(--brand-soft)}
  .notif-icon{flex:0 0 auto;font-size:18px;line-height:1.4}
  .notif-body{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px}
  .notif-body b{font-size:12.5px;font-weight:700}
  .notif-body span{font-size:13px;color:var(--text);line-height:1.4}
  .notif-item.unread .notif-body b{font-weight:800}
  .notif-dot{flex:0 0 auto;width:8px;height:8px;margin-top:6px;border-radius:50%;background:var(--danger)}
  .notif-time{font-size:11px;color:var(--muted)!important}
  body.rail-min .usermenu{left:8px;width:206px;right:auto}
  .umi{display:flex;align-items:center;gap:10px;width:100%;border:none;background:none;border-radius:var(--r-md);
    padding:9px 10px;cursor:pointer;font-size:14px;font-weight:600;color:var(--text);text-align:left}
  .umi:hover{background:var(--brand-soft)}
  .umi.on{background:var(--brand-soft);color:var(--brand-dark)}
  .umi .umu-meta{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;color:var(--muted)}
  .umi .umu-dot{width:7px;height:7px;border-radius:50%;background:#A8B3BC;box-shadow:0 0 0 1px #dbe3e8}
  .umi .umu-meta.active{color:var(--ok)}
  .umi .umu-meta.active .umu-dot{background:#3DDC97;box-shadow:none}
  .umi .umu-meta.pause{color:var(--warn-soft-text)}
  .umi .umu-meta.pause .umu-dot{background:var(--warn);box-shadow:none}
  .umi .chk{margin-left:6px;color:var(--brand-dark);opacity:0}
  .umi.on .chk{opacity:1}
  .umlbl{font-size:10.5px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--muted);padding:8px 10px 5px}

  /* ============ Modul-Kopf ============ */
  .modhead{flex:0 0 auto;display:flex;align-items:center;gap:13px;padding:15px 20px 13px}
  .burger{display:none;width:38px;height:38px;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);
    color:var(--text);cursor:pointer;align-items:center;justify-content:center;flex:0 0 auto}
  .modhead .tt{min-width:0;flex:1 1 auto}
  /* Rafael zeigte die echte Live-Seite (fette Poppins-Überschriften,
     Navy) zum Vergleich, 2026-10-14 - Seitentitel hier entsprechend
     auf ExtraBold angehoben statt Bold, Größe unverändert (schmale
     Kopfzeile, kein Platz für mehr). */
  .modhead h1{margin:0;font-size:18px;font-weight:800;letter-spacing:.2px}
  .modhead p{margin:2px 0 0;font-size:12.5px;color:var(--muted)}
  .headact{display:flex;align-items:center;gap:10px;flex:0 0 auto}
  .stand{font-size:12px;color:var(--muted);white-space:nowrap}
  .reload{border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:8px 14px;font-size:13.5px;font-weight:600;
    color:var(--text);cursor:pointer;transition:border-color .12s;display:flex;align-items:center;gap:7px}
  .reload:hover{border-color:var(--brand);color:var(--brand-dark)}
  .reload svg{width:15px;height:15px}
  /* Sichtbares Feedback beim Aktualisieren - Icon dreht sich, solange der
     Klick-Handler noch lädt (core/nav.js), Button optisch gesperrt. */
  .reload:disabled{opacity:.7;cursor:default}
  .reload.loading svg{animation:reload-spin .7s linear infinite}
  @keyframes reload-spin{to{transform:rotate(360deg)}}
  .modbody{flex:1 1 auto;min-height:0;position:relative}
  .module{position:absolute;inset:0;display:none;min-height:0}
  .module.on{display:flex;flex-direction:column}

  /* ============ gemeinsame Bausteine ============ */
  .scroll{flex:1 1 auto;overflow-y:auto;padding:0 20px 22px}
  /* Radius 18->20px (var(--radius-2xl)) auf den primären Inhaltskarten
     (.card/.st-panel/.kpi/.qcard/.ph-card/.pane/.hw-form/.hw-side/
     .kunde-card) - Rafael zeigte die Live-Seite zum Vergleich: deren
     weiße Karten sind merklich runder. 20px ist der obere Rand der
     dort beobachteten Karten-Spanne (12-20px). Rafael, 2026-10-15: "die
     Kacheln sind auf der Website eher so transparent" - alle acht jetzt
     wie .modal/.usermenu auf var(--card-glass) + Blur statt solidem
     var(--card). Bewusst konservative 90% Deckkraft (nicht 55/72% wie
     die Website es an manchen Stellen nutzt) - bei dichten Tabellen/
     Zahlen soll die Lesbarkeit nicht leiden, nur das Hintergrund-Mint
     darf ganz leicht durchscheinen. */
  .card{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);padding:20px 22px;box-shadow:var(--shadow)}
  .card+.card{margin-top:14px}
  .st-panel{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:14px 0 10px;padding:18px 22px;border:1px solid var(--border);border-radius:var(--r-lg);background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:var(--shadow)}
  .st-panel h3{margin:0;font-size:18px;font-weight:700}
  .st-panel p{margin:.35em 0 0;color:var(--muted);max-width:52ch}
  .st-panel .btn{margin:0;white-space:nowrap}
  .card h2{font-size:11.5px;text-transform:uppercase;letter-spacing:.6px;color:var(--brand-dark);margin:0 0 16px;font-weight:800}
  /* Icon vor der Karten-Überschrift, z.B. Team-Stimmung (core/mood.js) -
     Rahmen/Größe bleiben wie bei jeder anderen Karte, nur ein kleines
     Icon zusätzlich zum Text. */
  .card h2.ico-h2{display:flex;align-items:center;gap:7px}
  .card h2.ico-h2 svg{width:13px;height:13px;flex:0 0 auto}
  .loading{margin:40px auto;text-align:center;color:var(--muted);font-size:13.5px}
  .nores{padding:42px 22px;text-align:center;color:var(--muted);font-size:13.5px;line-height:1.55}
  .nores b{display:block;color:var(--text);font-size:16px;margin-bottom:6px}
  .sbadge{display:inline-block;padding:4px 11px;border-radius:999px;font-size:12px;font-weight:700;white-space:nowrap}
  .sbadge.flownode{background:var(--brand-soft);color:var(--brand-dark);margin-left:6px;font-weight:650;
    max-width:180px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
  .mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-weight:800;color:var(--brand-dark);
    letter-spacing:.4px;white-space:nowrap}
  .dim{color:var(--muted)}
  .btn{border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:9px 15px;font-size:13.5px;font-weight:650;
    color:var(--text);cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:all .13s}
  .btn:hover{border-color:var(--brand);color:var(--brand-dark)}
  .btn svg{width:15px;height:15px}
  .btn.primary{background:var(--grad-btn);color:#fff;box-shadow:0 3px 8px -2px rgba(23,52,95,.3);transition:all .2s var(--ease-signature)}
  /* Korall-Glow (Live-Seiten-Token --glow-coral-outer) als Hover-Akzent
     auf dem wichtigsten Button-Typ - additiv zum bestehenden Schatten. */
  .btn.primary:hover{color:#fff;box-shadow:0 5px 12px -3px rgba(23,52,95,.38);filter:brightness(1.06)}
  /* Prominenter Gelb-Button für "An Rechnungsprüfung übergeben" (an der
     Dokumentzeile im Ticket, ticketrun.js) - bewusst auffälliger als die
     übrigen Aktions-Buttons, damit eine noch offene Übergabe nicht
     übersehen wird. */
  .btn.warn{background:var(--warn);border-color:transparent;color:#3D2600;box-shadow:0 3px 8px -2px rgba(224,162,0,.4);font-weight:750}
  .btn.warn:hover{color:#3D2600;filter:brightness(1.06)}
  .btn:disabled{opacity:.5;cursor:not-allowed}

  /* ============ Dashboard ============ */
  .kpi-section{margin-bottom:18px}
  /* Echter Abschnitts-Trenner statt kleiner bunter Pille (Tickets blau,
     Rechnungen orange sahen nebeneinander inkonsistent aus) - Label +
     Icon links, durchgehende Trennlinie füllt den Rest der Breite, damit
     jeder Bereich klar eigenständig wirkt. Rafael, 2026-09-20: "als
     Trenner gestalten". */
  .kpi-sechead{display:flex;align-items:center;gap:12px;margin:26px 0 13px}
  .kpi-tag{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:800;letter-spacing:.4px;
    text-transform:uppercase;color:var(--text);white-space:nowrap}
  .kpi-tag svg{width:16px;height:16px;flex:0 0 auto;color:var(--brand-dark)}
  .kpi-tag.inv svg{color:var(--warn-soft-text)}
  .kpi-sechead::after{content:"";flex:1 1 auto;height:1px;background:var(--border)}
  .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:14px;margin-bottom:0}
  .kpi{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);padding:17px 19px;box-shadow:var(--shadow);
    border-left:4px solid var(--border)}
  .kpi .n{font-size:30px;font-weight:800;line-height:1.05;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
  .kpi .l{font-size:12.5px;color:var(--muted);margin-top:5px;font-weight:600}
  .kpi .kpi-sub{font-weight:600;opacity:.75}
  .kpi.go{cursor:pointer;transition:transform .25s var(--ease-signature),box-shadow .25s var(--ease-signature)}
  .kpi.go:hover{transform:translateY(-2px);box-shadow:0 20px 46px rgba(23,52,95,.12)}
  .grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px;align-items:stretch}
  .grid2 .card{display:flex;flex-direction:column;height:100%}
  .grid2 .card+.card{margin-top:0}
  .grid2 .dash-card{min-height:258px}
  .donut{display:flex;align-items:center;gap:20px;flex-wrap:wrap}
  .dash-card .donut{flex:1 1 auto;align-content:center}
  .prio-stack{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center}
  .dash-seg{transition:stroke-dasharray .8s ease, stroke-dashoffset .8s ease}
  .center-n{font-size:29px;font-weight:700;fill:var(--text)}
  .center-l{font-size:10.5px;fill:var(--muted);letter-spacing:.5px}
  .lg{list-style:none;padding:0;margin:0;flex:1;min-width:142px}
  .lg li{display:flex;align-items:center;gap:9px;padding:5px 0;font-size:13.5px}
  .lg .d{width:9px;height:9px;border-radius:3px;flex:0 0 auto}
  .lg .l{flex:1;color:var(--text)}
  .lg .v{font-variant-numeric:tabular-nums;font-weight:700}
  .lg .v em{font-style:normal;color:var(--muted);font-weight:600;margin-left:6px;font-size:11.5px}
  .barrow{display:flex;align-items:center;gap:11px;margin-bottom:13px}
  .barrow:last-child{margin-bottom:0}
  .barrow .bl{width:58px;font-size:13px;color:var(--text);flex:0 0 auto}
  .track{flex:1;height:9px;background:var(--divider);border-radius:999px;overflow:hidden}
  .fill{height:100%;border-radius:999px;transition:width .4s ease}
  .barrow .bv{width:26px;text-align:right;font-size:13px;font-weight:700;font-variant-numeric:tabular-nums}
  /* "Zu bearbeitende Mails nach Kunde" - Dashboard-Widget, Rafael,
     2026-09-25: "gerne fancy und cool". Eigene, volle Zeile unter den
     beiden Donuts (siehe dashboard.js) statt in .grid2 gequetscht, damit
     bei vielen Kunden genug Platz für die Balken bleibt. */
  .mail-bykunde{margin-top:0}
  /* Rafael, 2026-09-25: "irgendwie schmaler machen ... nur Kunden und
     Mails als Zahl ... immer 4 Kunden nebeneinander" - Balkenzeilen durch
     ein kompaktes 4er-Grid aus kleinen Chips (Punkt + Name + Zahl) ersetzt. */
  .mkchips{display:grid;grid-template-columns:repeat(4,1fr);gap:9px;margin-top:4px}
  .mkchip{display:flex;align-items:center;gap:7px;padding:9px 11px;border-radius:var(--r-md);cursor:pointer;
    background:var(--tint);border:1px solid var(--border);transition:transform .12s,border-color .12s;min-width:0}
  .mkchip:hover{transform:translateY(-1px);border-color:var(--brand)}
  .mkchip .mkname{flex:1 1 auto;min-width:0;font-size:12.5px;font-weight:600;color:var(--text);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mkchip .mkval{flex:0 0 auto;font-size:14px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--brand-dark)}
  .mk-empty{font-size:13.5px;color:var(--muted);padding:8px 4px}
  .mk-empty.mk-done{color:var(--ok);font-weight:600}
  @media (max-width:720px){ .mkchips{grid-template-columns:repeat(2,1fr)} }
  /* "Neue Tickets"-Trend-Chart (Tag/Woche/Jahr, nach Kunde gestapelt) -
     Rafael, 2026-09-25: "ein Balken pro Tag ... den Balken je nach Kunden
     in den Kundenfarben aufteilen". Reine CSS-Balken (gestapelte Divs)
     statt SVG, damit die Höhen einfach über Prozent-Höhe gehen. */
  .trend-card h2{display:flex;align-items:baseline;flex-wrap:wrap;gap:10px 14px}
  .trend-modes{margin-left:auto;display:flex;gap:6px}
  .trend-mode-btn{border:1px solid var(--border);background:var(--card);color:var(--muted);border-radius:var(--r-sm);
    padding:4px 11px;font-size:11px;font-weight:800;letter-spacing:.2px;text-transform:none;cursor:pointer;transition:all .12s}
  .trend-mode-btn:hover{border-color:var(--brand);color:var(--brand-dark)}
  .trend-mode-btn.on{background:var(--brand);border-color:var(--brand);color:#fff}
  .trend-loading{font-size:13px;color:var(--muted);padding:20px 4px;text-align:center}

  /* Kunden-Filter (Multi-Choice) für "Fristen im Überblick" +
     "Bearbeitungsstatus" - Rafael, 2026-09-25: "ein kleines Dropdown ...
     eine Auswahl für beide Dashboards". */
  .grid2 .dash-card:first-child h2{display:flex;align-items:baseline;flex-wrap:wrap;gap:8px 12px}
  .dkf{position:relative;margin-left:auto}
  .dkf-btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);background:var(--card);
    color:var(--muted);border-radius:var(--r-sm);padding:4px 10px;font-size:11px;font-weight:800;letter-spacing:.2px;
    text-transform:none;cursor:pointer;transition:all .12s}
  .dkf-btn svg:first-child{width:12px;height:12px;flex:0 0 auto}
  .dkf-btn .cv{flex:0 0 auto;opacity:.7}
  .dkf-btn:hover{border-color:var(--brand);color:var(--brand-dark)}
  .dkf-btn.on{background:var(--brand);border-color:var(--brand);color:#fff}
  .dkf-btn.on .cv{opacity:1}
  .dkf-menu{display:none;position:absolute;right:0;top:calc(100% + 6px);z-index:40;min-width:210px;max-height:280px;
    overflow-y:auto;background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 10px 28px rgba(23,52,95,.14);
    padding:8px}
  .dkf-menu.open{display:block}
  .dkf-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--r-sm);cursor:pointer;font-size:12.5px;
    font-weight:600;color:var(--text);white-space:nowrap}
  .dkf-item:hover{background:var(--tint)}
  .dkf-item input{margin:0}
  .dkf-reset{width:100%;margin-top:4px;border:none;background:none;color:var(--brand-dark);font-size:12px;font-weight:700;
    text-align:left;padding:7px 8px;border-radius:var(--r-sm);cursor:pointer}
  .dkf-reset:hover{background:var(--tint)}
  .trend-bars{display:flex;align-items:flex-end;gap:4px;height:150px;padding:8px 2px 0}
  .trend-bar-wrap{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;gap:4px}
  .trend-bar-n{font-size:10px;font-weight:800;color:var(--muted);font-variant-numeric:tabular-nums}
  .trend-bar{width:100%;max-width:22px;flex:0 0 auto;height:100%;display:flex;flex-direction:column-reverse;
    border-radius:4px 4px 2px 2px;overflow:hidden;background:var(--divider)}
  .trend-seg{width:100%;transition:height .5s ease}
  .trend-seg+.trend-seg{border-top:1.5px solid var(--card)}
  .trend-bar-lbl{font-size:9.5px;color:var(--muted);white-space:nowrap;transform:rotate(-40deg) translateX(-4px);
    transform-origin:top right;height:14px}
  .trend-legend{display:flex;flex-wrap:wrap;gap:8px 16px;margin-top:20px;padding-top:12px;border-top:1px solid var(--border)}
  .trend-lg-item{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text)}
  /* Hover-Tooltip über einem Tagesbalken ("Neue Tickets"), gleiches
     Flag-Muster wie .map-flag (Karte, sites.js) - Rafael, 2026-09-27. */
  .trend-chart-wrap{position:relative}
  .trend-flag{position:absolute;top:0;transform:translate(-50%,-100%);background:var(--card);border:1px solid var(--border);
    border-radius:var(--r-md);box-shadow:0 14px 34px rgba(23,52,95,.22);padding:9px 12px;min-width:150px;max-width:220px;
    opacity:0;pointer-events:none;transition:opacity .12s;z-index:5}
  .trend-flag.on{opacity:1}
  .trend-flag::after{content:"";position:absolute;left:50%;bottom:-7px;transform:translateX(-50%);
    border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid var(--card)}
  .trend-flag b{display:block;font-size:13px;font-weight:750;margin:0 0 2px;line-height:1.3}
  .trend-flag .mf-sub{font-size:11.5px;color:var(--muted)}
  .trend-flag-list{list-style:none;margin:8px 0 0;padding:8px 0 0;border-top:1px solid var(--divider);display:flex;flex-direction:column;gap:5px}
  .trend-flag-list li{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text)}
  .trend-flag-list li b{display:inline;margin:0 0 0 auto;font-size:12px;font-variant-numeric:tabular-nums}
  .nextup{list-style:none;margin:0;padding:0}
  .nextup li{border-bottom:1px solid var(--divider);font-size:13.5px}
  .nextup li:last-child{border-bottom:none}
  .nextup li:hover{background:var(--surface-soft)}
  .nextlink{display:flex;align-items:center;gap:11px;padding:10px 0;cursor:pointer;color:inherit;text-decoration:none}
  .nextup .bar{width:3px;height:30px;border-radius:2px;flex:0 0 auto}
  .nextup .t{flex:1 1 auto;min-width:0}
  .nextup .t b{display:block;font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .nextup .t span{font-size:12px;color:var(--muted)}
  .nextup .w{font-size:12px;font-weight:700;white-space:nowrap;flex:0 0 auto}

  /* ============ Ticketliste ============ */
  .tools{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin-bottom:15px}
  .fb{border:1px solid var(--border);background:var(--card);color:var(--text);padding:8px 15px;border-radius:999px;font-size:13px;
    cursor:pointer;font-weight:700;transition:.13s;white-space:nowrap;display:inline-flex;align-items:center;gap:7px}
  .fb svg{width:15px;height:15px;flex:0 0 auto}
  .fb:hover{border-color:var(--brand)}
  .fb.on{background:var(--brand-dark);border-color:var(--brand-dark);color:#fff;box-shadow:0 6px 14px rgba(23,52,95,.3)}
  .fb .n{opacity:.7;margin-left:5px;font-weight:600}
  .fb.mine.on{background:var(--ok);border-color:var(--ok);box-shadow:0 6px 14px rgba(30,158,106,.3)}
  /* News-Filter + blinkende Kennzeichnung */
  .fb.news{display:inline-flex;align-items:center;gap:7px}
  .fb.news .nfdot{width:7px;height:7px;border-radius:50%;background:var(--border);flex:0 0 auto}
  .fb.news.has .nfdot{background:var(--brand);animation:newsBlink 1.05s ease-in-out infinite}
  .fb.news.on{background:var(--brand-dark);border-color:var(--brand-dark);color:#fff;box-shadow:0 6px 14px rgba(23,52,95,.3)}
  .fb.news.on .nfdot{background:var(--card)}
  .newsflag{display:inline-flex;align-items:center;gap:6px;margin-left:9px;padding:2px 9px 2px 7px;border-radius:999px;
    background:var(--brand);color:#fff;font-size:11px;font-weight:800;letter-spacing:.3px;vertical-align:middle;
    animation:newsBlink 1.05s ease-in-out infinite}
  .newsflag .nfdot{width:6px;height:6px;border-radius:50%;background:var(--card)}
  tr.tk-news td{background:rgba(23,52,95,.055)}
  tr.tk-news td:first-child{animation:rowEdge 1.4s ease-in-out infinite}
  @keyframes newsBlink{0%,100%{opacity:1}50%{opacity:.3}}
  @keyframes rowEdge{0%,100%{box-shadow:inset 3px 0 0 var(--brand)}50%{box-shadow:inset 3px 0 0 rgba(23,52,95,.12)}}
  .sfield{flex:1 1 180px;min-width:160px;border:1px solid var(--border);border-radius:var(--r-md);padding:9px 14px;font-size:16px;
    background:var(--card);outline:none;color:var(--text)}
  .sfield:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  #tkTools .sfield{order:2;flex:1 1 100%;min-width:260px}
  .viewpick{order:1;margin-left:auto;display:inline-flex;align-items:center;gap:6px}
  /* Zweite Filterzeile: Priorität/Fälligkeit/Workflow-Schritt + Sortierung, erzwungen auf
     eine eigene Zeile unterhalb der Suche (order höher als #tkTools .sfield). */
  .tools-row2{order:3;flex:1 1 100%;display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:2px}
  .tools-sel{border:1px solid var(--border);border-radius:var(--r-md);padding:8px 30px 8px 13px;font-size:13px;
    background:var(--card) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%236A7E8A" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>') no-repeat right 10px center/13px 13px;
    -webkit-appearance:none;appearance:none;color:var(--text);cursor:pointer;max-width:220px}
  .tools-sel:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .tools-row2-lbl{font-size:12px;color:var(--muted);font-weight:650;white-space:nowrap}
  .tools-row2 .grow{flex:1 1 auto}
  /* Mehrfachauswahl-Filter (Checkboxen statt select multiple) – bleibt beim
     Anklicken einer Checkbox bewusst offen, schließt nur über Klick außerhalb
     oder erneuten Klick auf den Button. */
  .mfilter{position:relative}
  .mfilter-btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);border-radius:var(--r-md);
    padding:8px 12px;font-size:13px;font-weight:650;color:var(--text);background:var(--card);cursor:pointer;transition:border-color .13s}
  .mfilter-btn:hover{border-color:var(--brand)}
  .mfilter.open .mfilter-btn{border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .mfilter-btn svg{width:13px;height:13px;color:var(--muted);flex:0 0 auto}
  .mfilter-badge{display:inline-flex;align-items:center;justify-content:center;min-width:17px;height:17px;padding:0 5px;
    border-radius:999px;background:var(--brand);color:#fff;font-size:10.5px;font-weight:800}
  .mfilter-menu{position:absolute;left:0;top:calc(100% + 6px);z-index:40;background:var(--card);min-width:200px;
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 34px rgba(23,52,95,.16);padding:6px;
    max-height:280px;overflow-y:auto;display:none}
  .mfilter-menu.open{display:block}
  .mfilter-item{width:100%;display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:var(--r-sm);cursor:pointer;
    font-size:13.5px;font-weight:600;color:var(--text)}
  .mfilter-item:hover{background:var(--tint)}
  .mfilter-item input{accent-color:var(--brand);cursor:pointer}
  .mfilter-clear{width:100%;margin-top:2px;padding:7px 9px;border:none;border-top:1px solid var(--border);border-radius:0 0 8px 8px;
    background:none;color:var(--muted);font-size:12.5px;font-weight:650;cursor:pointer;text-align:left}
  .mfilter-clear:hover{color:var(--danger)}
  /* Kunden-Filter im Dashboard-KPI-Kopf */
  .kpi-sechead{display:flex;align-items:center;justify-content:space-between;gap:10px}
  .dash-kunde-sel{max-width:200px}
  /* Sortierbare Tabellenköpfe */
  th[data-sort]{cursor:pointer;user-select:none}
  th[data-sort]:hover{color:var(--brand-dark)}
  /* Paginierung */
  .tkpager{display:flex;align-items:center;gap:14px;justify-content:center;flex-wrap:wrap;padding:16px 0 4px}
  .tkpager-info,.tkpager-page{font-size:12.5px;color:var(--muted);white-space:nowrap}
  .vbtn{width:36px;height:36px;border:1px solid var(--border);background:var(--card);color:var(--text);padding:0;border-radius:var(--r-md);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:all .13s}
  .vbtn svg{width:18px;height:18px}
  .vbtn:hover{border-color:var(--brand);color:var(--brand-dark)}
  .vbtn.on{background:var(--brand-dark);border-color:var(--brand-dark);color:#fff;box-shadow:0 6px 14px rgba(23,52,95,.3)}
  .tkcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}
  /* Karte in drei klar getrennten Zonen (Kopf/Mitte/Fuß) statt einem
     einzigen, textlastigen Block - overflow:hidden lässt Kopf-/Fußfarbe
     an den abgerundeten Ecken sauber enden. */
  .tkcard{display:block;color:inherit;text-decoration:none;border:1px solid var(--border);border-radius:var(--r-md);background:var(--card);overflow:hidden;cursor:pointer;transition:transform .25s var(--ease-signature),box-shadow .25s var(--ease-signature)}
  .tkcard:hover{transform:translateY(-1px);box-shadow:0 14px 30px rgba(23,52,95,.1)}
  .tkcard-zone-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 14px;font-size:12px}
  .tkcard-status{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* Bearbeitungs-Timer: Ampel-Punkt (grün/gelb/rot) + verbleibende bzw.
     negative Zeit (tktimerTick in ticketrun.js zieht data-timer-deadline
     periodisch nach, ohne die Liste neu zu zeichnen). Platzhalter-Logik
     (24h ab Anlage/Statusänderung), bis eine echte Zeitvorgabe kommt. */
  .tktimer{display:inline-flex;align-items:center;gap:6px;font-weight:650;color:rgba(23,52,95,.65);white-space:nowrap;font-variant-numeric:tabular-nums}
  .ampel{display:inline-block;width:9px;height:9px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 0 2px var(--card)}
  .ampel-th,.ampel-td{text-align:center;width:112px}
  /* Eigene schmale Spalte für den Neu-Punkt zwischen Nr. und Titel, statt
     ihn in eine der beiden Textzellen zu quetschen. Kein eigenes Padding
     (würde den .trlink-Negativ-Margin-Trick durcheinanderbringen, siehe
     .trlink weiter oben) - nur schmal + zentriert wie .ampel-td. */
  .newin-th,.newin-td{width:46px;text-align:center}
  .newin-td .newin{margin:0}
  /* Sichtbarer "Neu"-Tag in der Ticketliste (Rafael, 2026-09-25: "in der
     Übersicht auch den Tag Neu hinzufügen") - gleiche Pillenoptik wie
     .msg-tag in mail.js, nur mit der --newin-Farbe statt der Ordnerfarbe.
     Der pulsierende Punkt (.newin) bleibt für die Inline-Stellen (Titel/
     Ticketkopf), hier in der Liste steht zusätzlich der Text. */
  .newin-tag{display:inline-block;font-size:10px;font-weight:800;padding:2px 7px;border-radius:999px;
    background:color-mix(in srgb, var(--newin) 16%, var(--card));color:var(--newin)}
  /* "Neuer Eingang"-Markierung (Mail zugeordnet/Dokument hochgeladen seit
     dem letzten Öffnen, siehe markTicketNewIntake() in core/data.js) -
     kleiner Punkt direkt neben dem Titel, pulsiert (Größe + Deckkraft)
     statt nur zu blinken, damit er deutlicher auffällt. Titel-Tooltip
     trägt weiter den erklärenden Text. Margin auf beiden Seiten, sitzt
     je nach Stelle mal vor, mal hinter dem Titel im Fließtext. */
  .newin{display:inline-block;width:11px;height:11px;border-radius:50%;background:var(--brand);
    flex:0 0 auto;margin:0 7px;vertical-align:middle;box-shadow:0 0 0 2px var(--card);
    animation:newin-blink 1.1s ease-in-out infinite}
  @keyframes newin-blink{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(1.4)}}
  .newin-fb.on{background:var(--newin);border-color:var(--newin)}
  .tkcard-zone-mid{display:flex;gap:12px;align-items:flex-start;padding:13px 14px}
  .tkcard-copy{flex:1 1 auto;min-width:0}
  .tkcard-title{font-size:14.5px;font-weight:700;line-height:1.35;color:var(--text)}
  .tkcard-loc{display:flex;align-items:center;gap:5px;font-size:12.5px;color:var(--muted);margin-top:6px}
  .tkcard-loc svg{width:13px;height:13px;flex:0 0 auto}
  .tkcard-media{position:relative;flex:0 0 auto}
  .tkcard-zone-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:9px 14px;background:var(--surface-soft);border-top:1px solid var(--divider)}
  .tkthumb{width:76px;height:76px;padding:0;border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;background:var(--thumb-bg);display:flex;align-items:center;justify-content:center;cursor:pointer}
  .tkthumb img{width:100%;height:100%;object-fit:cover;display:block}
  .tkthumb.empty svg{width:20px;height:20px;color:var(--muted)}
  .tkthumbn{position:absolute;right:4px;bottom:4px;background:rgba(20,45,60,.75);color:#fff;border-radius:999px;font-size:10px;font-weight:800;padding:2px 6px;line-height:1}
  .tblwrap{overflow-x:auto}
  /* Sticky Tabellenkopf NUR für die Ticketliste (#tkTable) - Rafael,
     2026-09-24: "die Tabellenzeile stehen lassen und beim Runterscrollen
     nur die Tickets drunter scrollen, damit die immer sichtbar bleibt".
     Bewusst per #tkTable gescoped statt generisch auf .tblwrap/table -
     die Standorte-Liste (sites.js) nutzt dieselben generischen Klassen,
     soll davon aber unberührt bleiben. Braucht dafür eine eigene,
     begrenzte Scroll-Höhe statt einfach die ganze Seite scrollen zu
     lassen, sonst hat position:sticky nichts, wogegen es "stehen" kann. */
  #tkTable .tblwrap{max-height:70vh;overflow-y:auto}
  #tkTable .tblwrap th{position:sticky;top:0;background:var(--card);z-index:5}
  table{width:100%;border-collapse:collapse;font-size:13.5px}
  th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);font-weight:800;
    padding:0 12px 11px;border-bottom:1px solid var(--border);white-space:nowrap}
  td{padding:12px;border-bottom:1px solid var(--divider);vertical-align:middle}
  /* Füllt die Zelle exakt aus (negative margin = tds eigenes padding, dann
     dasselbe padding wieder drauf) - dadurch ist die ganze Zelle ein echter
     Link (Rechtsklick "In neuem Tab öffnen" etc.), ohne td selbst
     anzufassen, das auch andere Tabellen im Projekt nutzen. */
  .trlink{display:block;margin:-12px;padding:12px;color:inherit;text-decoration:none}
  tbody tr{cursor:pointer}
  tbody tr:last-child td{border-bottom:none}
  tbody tr:hover{background:var(--surface-soft)}
  /* Erledigte Tickets bleiben sichtbar, treten aber optisch zurück – auf
     Hover wieder voll lesbar, um sie bei Bedarf trotzdem leicht zu prüfen. */
  tr.tk-done,.tkcard.tk-done{opacity:.5;filter:grayscale(.4)}
  tr.tk-done:hover,.tkcard.tk-done:hover{opacity:.9;filter:none}
  .ttl{font-weight:700}
  .pr{font-weight:700;font-size:12.5px}
  .due{display:inline-flex;align-items:center;gap:5px;font-variant-numeric:tabular-nums;color:var(--muted);white-space:nowrap}
  .due svg{width:13px;height:13px;flex:0 0 auto}
  .due.late{color:var(--danger);font-weight:700}
  .who{display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
  .who .av{width:24px;height:24px;font-size:10.5px}
  .cbadge{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;color:var(--muted);font-weight:650;margin-left:8px}
  .cbadge svg{width:13px;height:13px}

  /* ============ Ticket-Detail ============ */
  /* Eigene Karten-Variante nur für den Ticket-Kopf (Rafael, 2026-09-20:
     "etwas übersichtlicher, mehr Grafik, leichte Schatten, Wichtiges
     hervorheben") - Akzentstreifen + etwas mehr Tiefe als die sonst
     recht flachen Standard-.card, ohne das global für JEDE Karte in der
     App zu ändern. */
  .tkdetail-card{border-top:3px solid var(--brand);box-shadow:0 20px 46px rgba(23,52,95,.11);padding-top:18px}
  .dhead{display:flex;align-items:flex-start;gap:14px;flex-wrap:wrap;margin-bottom:var(--tk-gap,18px)}
  .dhead .dt{flex:1 1 260px;min-width:0}
  .dhead .dt h3{margin:8px 0 0;font-size:22px;font-weight:800;line-height:1.28;letter-spacing:-.1px}
  /* Ticket-ID jetzt eine kleine Kapsel statt reinem Fließtext - fällt
     dadurch sofort als eigenständiges Element auf, nicht nur als
     Vorspann vorm Titel. */
  .dhead .dt .mono{display:inline-block;background:var(--brand-soft);color:var(--brand-dark);padding:4px 13px;border-radius:999px;font-size:15px;font-weight:800;letter-spacing:.2px}
  /* Status/Priorität + Timer jetzt direkt bei den Kerndaten oben statt in
     einer eigenen Zeile darunter - gleiche Höhe/Form wie der Stift-Button
     (.btn) daneben, damit alles zusammen wie eine Reihe wirkt. Bekommen
     jetzt zusätzlich einen zur Statusfarbe passenden Hintergrundton (per
     Inline-style aus fieldDdHtml() in ticketrun.js, color-mix mit der
     jeweiligen Status-/Prioritätsfarbe), statt nur über den kleinen Punkt
     erkennbar zu sein - genau das "Wichtiges hervorheben". */
  .dhead-fields{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .dhead-fields .fielddd{width:auto}
  .dhead-fields .fielddd-btn{width:auto;height:38px;box-sizing:border-box;padding:0 13px;font-size:13.5px;font-weight:700;
    border-radius:999px;border-color:transparent;transition:filter .12s,transform .12s}
  .dhead-fields .fielddd-btn:hover{filter:brightness(.96);transform:translateY(-1px)}
  .dhead-fields .fielddd-menu{left:0;right:auto;min-width:190px}
  .dhead-fields .tktimer{height:38px;box-sizing:border-box;padding:0 13px;border:1px solid var(--border);border-radius:999px;
    background:var(--surface-soft)}
  /* "Marie ist auch gerade hier" - Realtime-Präsenz (ticketrun.js), als
     überlappender Avatar-Stapel mit grünem Live-Punkt, sitzt neben dem
     "Zurück zur Liste"-Button (.tkbackrow) - leer, wenn niemand sonst
     gerade im Ticket ist, kollabiert dann von selbst. Doppelklick auf
     eine Kachel = High Five (Easter Egg, siehe sendHighFive()). */
  .tkbackrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:6px}
  /* Direkt neben dem Zurück-Button statt irgendwo rechts im Freien - eigene
     leicht hervorgehobene Kapsel (Rand + Hintergrund), damit es sofort ins
     Auge fällt statt zwischen den übrigen Kopf-Elementen unterzugehen. */
  .tkpresence{display:flex;align-items:center;gap:9px;background:var(--brand-soft);border:1px solid var(--brand-soft-border,var(--border));
    border-radius:999px;padding:6px 14px 6px 6px}
  .tkpresence-avs{display:flex}
  .tkpresence-av{position:relative;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;
    font-size:12.5px;font-weight:800;color:#fff;border:2.5px solid var(--brand-soft);margin-left:-9px;cursor:pointer;
    box-shadow:0 2px 6px rgba(23,52,95,.18);transition:transform .12s}
  .tkpresence-av:hover{transform:translateY(-2px) scale(1.06);z-index:1}
  .tkpresence-av:first-child{margin-left:0}
  .tkpresence-av.tkpresence-more{background:var(--chip-bg);color:var(--muted);font-weight:700;font-size:11px;cursor:default}
  .tkpresence-av.tkpresence-more:hover{transform:none}
  .tkpresence-live{position:absolute;right:-1px;bottom:-1px;width:9px;height:9px;border-radius:50%;background:var(--ok);
    border:2px solid var(--brand-soft);animation:tkpresence-pulse 1.6s ease-in-out infinite}
  .tkpresence-lbl{font-size:13px;font-weight:700;color:var(--brand-dark)}
  @keyframes tkpresence-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.82)}}
  /* High-Five-Easter-Egg: kurzer Emoji-Ausbruch mittig im Fenster. */
  .hifive-burst{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%) scale(.3);font-size:90px;line-height:1;
    pointer-events:none;z-index:500;animation:hifive-pop 3.4s cubic-bezier(.2,1.4,.4,1) forwards}
  @keyframes hifive-pop{
    0%{transform:translate(-50%,-50%) scale(.2) rotate(-15deg);opacity:0}
    9%{transform:translate(-50%,-50%) scale(1.15) rotate(6deg);opacity:1}
    16%{transform:translate(-50%,-50%) scale(1) rotate(0);opacity:1}
    45%{transform:translate(-50%,-53%) scale(1.04) rotate(-3deg);opacity:1}
    70%{transform:translate(-50%,-50%) scale(1) rotate(3deg);opacity:1}
    100%{transform:translate(-50%,-62%) scale(.9) rotate(0);opacity:0}
  }

  /* ============ Good News teilen (core/goodnews.js) ============ */
  .goodnews-fab{position:fixed;right:22px;bottom:22px;width:54px;height:54px;border-radius:50%;
    background:var(--grad-btn);border:none;font-size:24px;cursor:pointer;z-index:150;
    box-shadow:0 10px 26px rgba(23,52,95,.32);display:flex;align-items:center;justify-content:center;
    transition:transform .15s}
  .goodnews-fab:hover{transform:scale(1.08) rotate(-6deg)}
  /* Fliegt rein, bleibt eine Weile lesbar stehen, fliegt dann raus - erst
     zu schnell ("fliegt viel zu schnell"), dann auf Wunsch nochmal länger
     stehend (18s, Rafael 2026-09-19: "lass die good news länger da
     stehen"). Dauer hier UND der setTimeout-Cleanup in
     showGoodNewsFlyby() (goodnews.js) müssen zusammenpassen. */
  .goodnews-fly{position:fixed;top:70px;right:-45%;left:auto;width:max-content;max-width:min(78vw,480px);
    display:flex;align-items:center;gap:10px;background:var(--card);border:1px solid var(--border);
    border-right:4px solid var(--brand);border-radius:999px;padding:11px 16px 11px 18px;
    box-shadow:0 14px 34px rgba(23,52,95,.28);font-size:14px;color:var(--text);z-index:600;
    animation:goodnews-flyby 18s cubic-bezier(.22,.7,.3,1) forwards}
  .goodnews-emoji{font-size:20px;flex:0 0 auto}
  .goodnews-txt{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .goodnews-txt b{font-weight:800}
  /* Reaktions-Buttons - nur bei fremden Nachrichten (siehe showGoodNewsFlyby()). */
  .goodnews-reacts{flex:0 0 auto;display:flex;gap:3px;margin-left:2px}
  .goodnews-react{border:none;background:var(--chip-bg);border-radius:50%;width:26px;height:26px;font-size:13px;
    cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .1s;padding:0}
  .goodnews-react:hover{transform:scale(1.2)}
  .goodnews-react:disabled{opacity:.5;cursor:default;transform:none}
  @keyframes goodnews-flyby{
    0%{right:-45%;opacity:0}
    6%{right:6%;opacity:1}
    92%{right:6%;opacity:1}
    100%{right:110%;opacity:0}
  }
  @media (max-width:520px){
    .goodnews-fly{max-width:88vw}
    .goodnews-fab{right:16px;bottom:16px;width:48px;height:48px;font-size:20px}
  }
  /* Vorgefertigte Good News (Schnellauswahl im Dialog, teilt auf Klick
     sofort - siehe GOODNEWS_PRESETS/openGoodNewsComposer() in goodnews.js). */
  .goodnews-presets{display:flex;flex-direction:column;gap:7px}
  .goodnews-preset{text-align:left;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);
    padding:10px 13px;font:inherit;font-size:13.5px;font-weight:600;color:var(--text);cursor:pointer;
    transition:all .12s}
  .goodnews-preset:hover{border-color:var(--brand);background:var(--brand-soft)}

  /* ============ Tagesstimmung (core/mood.js) ============ */
  .mood-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
  .mood-opt{display:flex;flex-direction:column;align-items:center;gap:6px;padding:16px 8px;
    border:1px solid var(--border);border-radius:var(--r-md);background:var(--card);cursor:pointer;
    font:inherit;font-size:12.5px;font-weight:650;color:var(--text);transition:all .13s}
  .mood-opt:hover{border-color:var(--brand);background:var(--brand-soft);transform:translateY(-2px)}
  .mood-emoji{font-size:28px}
  /* Eigene Stimmungen (immer 6 Kacheln, core/mood.js) - belegte mit
     Stift (Bearbeiten) + "x" (Entfernen) oben rechts, leere als "+" mit
     gestricheltem Rahmen. Rafael, 2026-09-24: "6 Kacheln zum selber
     definieren ... ändern, anlegen und löschen ... per Klicken und
     Popup mit Edit-Button und Löschen-Button". */
  .mood-opt-custom{position:relative}
  .mood-opt-edit,.mood-opt-del{position:absolute;top:4px;width:18px;height:18px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;background:var(--card);color:var(--muted);
    font-size:13px;line-height:1;border:1px solid var(--border)}
  .mood-opt-edit{right:24px}
  .mood-opt-del{right:4px}
  .mood-opt-edit:hover{background:var(--brand-soft);color:var(--brand-dark);border-color:transparent}
  .mood-opt-del:hover{background:var(--danger);color:#fff;border-color:transparent}
  .mood-opt-add{border-style:dashed;color:var(--muted)}
  .mood-opt-add .mood-emoji{font-weight:800;color:var(--brand)}
  /* Formular fürs Anlegen/Bearbeiten einer eigenen Stimmung - die
     Emoji-Palette (Suche + Raster + Kategorien) sitzt jetzt DIREKT im
     Formular statt hinter einem zweiten Klick versteckt. Rafael,
     2026-09-24: "die Emoji-Palette soll auch erst mit dem Popup kommen
     ... Popup beim Klicken von + und dann auswählen und speichern". */
  .mood-custom-form{margin-top:12px;padding:12px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--tint)}
  .mood-custom-row{display:flex;gap:8px;align-items:center;margin-bottom:10px}
  .mood-custom-preview{flex:0 0 auto;width:38px;height:38px;border-radius:var(--r-md);background:var(--card);
    display:flex;align-items:center;justify-content:center;font-size:20px;border:1px solid var(--border)}
  .mood-custom-form input#moodCustomLabel{flex:1 1 auto;min-width:0;padding:9px 11px;border:1px solid var(--border);
    border-radius:var(--r-md);font-size:16px;color:var(--text);background:var(--card)}
  .emoji-pick-search input{width:100%;padding:8px 11px;border:1px solid var(--border);border-radius:var(--r-sm);
    font-size:16px;color:var(--text);background:var(--card);margin-bottom:8px}
  .emoji-pick-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px;max-height:180px;overflow-y:auto;
    padding:2px;background:var(--card);border-radius:var(--r-sm)}
  .emoji-pick-item{width:100%;aspect-ratio:1;display:flex;align-items:center;justify-content:center;
    font-size:18px;border:none;background:none;border-radius:var(--r-sm);cursor:pointer;padding:0}
  .emoji-pick-item:hover{background:var(--tint)}
  .emoji-pick-empty{grid-column:1/-1;text-align:center;font-size:12.5px;padding:14px}
  .emoji-pick-cats{display:flex;gap:2px;overflow-x:auto;margin-top:8px;padding-top:8px;border-top:1px solid var(--border)}
  .emoji-pick-cat{flex:0 0 auto;width:28px;height:28px;display:flex;align-items:center;justify-content:center;
    font-size:15px;border:none;background:none;border-radius:var(--r-sm);cursor:pointer;opacity:.55}
  .emoji-pick-cat:hover{background:var(--card);opacity:1}
  .emoji-pick-cat.on{background:var(--brand-soft);opacity:1}
  .mood-custom-actions{display:flex;gap:8px;margin-top:10px}
  .teammood-row{display:flex;flex-wrap:wrap;gap:14px 18px;margin-top:10px}
  /* Feste statt maximaler Breite - sonst schiebt ein langer Name (z.B.
     "Christoph") die Box breiter als ein kurzer ("Max"), wodurch die
     Avatare trotz gleichem gap ungleichmäßig auseinanderstehen. Rafael,
     2026-09-20: "Abstände bitte gleich". */
  .teammood-chip{display:flex;flex-direction:column;align-items:center;gap:6px;font-size:11.5px;
    color:var(--muted);font-weight:650;width:64px;flex:0 0 64px;text-align:center}
  /* Gleiche Bildsprache wie die Ticket-Präsenz-Kacheln (.tkpresence-av
     weiter oben) - dasselbe Schatten-/Hover-/Live-Punkt-Muster, nur
     größer, weil hier die einzige Kachel statt eines Stapels ist.
     Rafael, 2026-09-19: "im gleichen Style, dass es zusammenpasst".
     Rafael, 2026-09-20: zeigt jetzt das Profilbild (avatar(), core/util.js)
     statt der Stimmungs-Emoji - die Emoji wandert stattdessen als kleines
     Extra-Badge unten an die Seite ("eher so unten an die Seite dran"),
     Status-Punkt bleibt auf der anderen Seite. */
  .teammood-avwrap{position:relative;display:inline-flex}
  .teammood-av{width:42px;height:42px;font-size:19px;font-weight:800;box-shadow:0 2px 6px rgba(23,52,95,.18);transition:transform .12s}
  /* Online-Status-Punkt (Da/Pause) am Avatar - siehe appPresenceState in
     core/mood.js, "im Stimmungsboard gleich den Status anzeigen". */
  .teammood-status{position:absolute;right:-2px;bottom:-2px;width:13px;height:13px;border-radius:50%;
    border:2.5px solid var(--card)}
  .teammood-status-da{background:var(--ok)}
  .teammood-status-pause{background:var(--warn)}
  .teammood-mood{position:absolute;left:-3px;bottom:-3px;width:20px;height:20px;border-radius:50%;background:var(--card);
    display:flex;align-items:center;justify-content:center;font-size:12.5px;box-shadow:0 1px 4px rgba(23,52,95,.25);
    border:2px solid var(--card)}
  /* Eigener Tooltip statt natives title (siehe mood.js) - garantiert
     sichtbar, unabhängig von Verschachtelung/Browser-Eigenheiten. */
  .teammood-mood[data-tip]{cursor:default}
  .teammood-mood[data-tip]::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 8px);
    transform:translateX(-50%) translateY(4px);background:var(--brand-dark);color:#fff;font-size:11.5px;font-weight:700;
    white-space:nowrap;padding:5px 9px;border-radius:var(--r-sm);box-shadow:0 4px 12px rgba(23,52,95,.28);
    opacity:0;pointer-events:none;transition:opacity .12s,transform .12s;z-index:60}
  .teammood-mood[data-tip]::before{content:"";position:absolute;left:50%;bottom:100%;transform:translateX(-50%) translateY(2px);
    border:5px solid transparent;border-top-color:var(--brand-dark);opacity:0;pointer-events:none;transition:opacity .12s;z-index:60}
  .teammood-mood[data-tip]:hover::after{opacity:1;transform:translateX(-50%) translateY(0)}
  .teammood-mood[data-tip]:hover::before{opacity:1}
  /* Doppelklick aufs eigene Bild öffnet die Stimmungsauswahl - der
     Status-Punkt selbst bleibt reine Anzeige, nicht mehr per Klick
     umschaltbar. Rafael, 2026-09-24: "der [Status-Punkt] muss nicht
     änderbar sein durch klicken .. Doppelklick aufs Bild öffnet die
     Emoji-Auswahl". */
  .teammood-avwrap[data-moodself]{cursor:pointer}
  .teammood-avwrap[data-moodself]:hover{transform:translateY(-2px) scale(1.06)}
  /* Fakten-Zeile jetzt als Kachel-Raster statt schmaler Label/Wert-Paare -
     jede Kachel mit leichtem Farbton + eigenem Icon, deutlich schneller
     erfassbar als reiner Fließtext (Rafael, 2026-09-20: "mehr Grafik,
     Wichtiges hervorheben"). Editierbare Werte (Input/Select) sitzen
     unverändert in derselben Kachel wie sonst der <b>-Wert. */
  .dfacts{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:var(--tk-gap,18px);margin-top:var(--tk-gap,18px)}
  .dtile{display:flex;flex-direction:column;gap:6px;min-width:0;background:var(--tint);border-radius:var(--r-md);padding:10px 13px}
  /* Gewerk/Handwerker-Zeile im Ticket: Kacheln bleiben schmal statt sich
     über die ganze Zeile zu strecken - Rafael, 2026-09-27: "die in Zeile 2
     auch schmaler machen, dann haben wir künftig noch Platz für eine
     dritte". */
  .dfacts-tight{grid-template-columns:repeat(auto-fit,minmax(148px,max-content))}
  /* Frist-Kachel: Erstellt/Fällig/Timer untereinander, rechts am Rand der
     Faktenzeile. */
  .dfacts:has(.dtile-frist){display:flex;flex-wrap:wrap}
  .dfacts:has(.dtile-frist)>.dtile{flex:1 1 148px}
  .dfacts>.dtile-frist{flex:0 0 auto;margin-left:auto;min-width:210px}
  .frist-row{display:flex;align-items:center;justify-content:space-between;gap:14px;font-size:14px}
  .frist-row>span{font-size:12px;font-weight:600;color:var(--muted)}
  .frist-row>b,.frist-row>.dfacts-date-input{width:auto;text-align:right}
  .dtile-lbl{display:flex;align-items:center;gap:6px;font-size:11.5px;font-weight:800;text-transform:uppercase;
    letter-spacing:.5px;color:var(--muted)}
  .dtile-lbl svg{width:13px;height:13px;flex:0 0 auto;opacity:.85}
  .dtile b{font-size:14px;font-weight:700;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .dtile select,.dtile .att-tag{width:100%}
  .dfacts-date-input{border:1px solid transparent;background:none;font:inherit;font-weight:700;font-size:16px;
    color:var(--text);text-align:left;padding:0;border-radius:var(--r-sm);cursor:pointer;font-family:inherit;width:100%}
  .dfacts-date-input:hover{border-color:var(--border);background:var(--card)}
  .dfacts-date-input:focus{outline:none;border-color:var(--brand);background:var(--card);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .dfacts-date-input.late{color:var(--danger)}
  /* Beschreibung ist die wichtigste Info im Ticket: etwas größer und leicht fett. */
  .tkdesc{margin-top:var(--tk-gap,18px);padding:14px 16px;background:var(--tint);border-radius:var(--r-md);font-size:15.5px;font-weight:600;line-height:1.55;white-space:pre-wrap;cursor:text}
  .tkdesc.empty{color:var(--muted);font-style:italic;cursor:text}
  .tkdesc-edit{display:block;width:100%;min-height:90px;margin-top:var(--tk-gap,18px);font:inherit;font-size:15.5px;font-weight:600;line-height:1.55;
    border:1px solid var(--border);border-radius:var(--r-sm);padding:10px 12px;resize:vertical;font-family:inherit;color:var(--text)}
  .tkdesc-edit:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  /* Aktionsbuttons (ticketrun.js, tkRunAction()) - Icon jetzt in einer
     eigenen getönten Kapsel statt einfach nur als kleines Symbol vorm
     Text, plus dezenter "Lift" beim Hovern, damit die Buttons als
     eigenständige, klickbare Aktionen wirken statt als reiner Fließtext
     mit Symbol davor. Rafael, 2026-09-20: "mehr Grafik, leichte Schatten". */
  .tkactions{display:flex;gap:10px;flex-wrap:wrap;margin-top:18px}
  .tkactions .btn{padding:8px 16px 8px 8px;border-radius:var(--r-md);gap:10px}
  .tkactions .btn svg{width:16px;height:16px;background:var(--brand-soft);color:var(--brand-dark);border-radius:var(--r-sm);
    padding:6px;box-sizing:content-box}
  .tkactions .btn:hover{transform:translateY(-2px);box-shadow:0 10px 22px rgba(23,52,95,.14);border-color:var(--border)}
  /* Gemeinsame Aktions-Kachel: eine Zeile je Kategorie, farbiges Label links. */
  .tkactions-tile{margin-top:var(--tk-gap,18px);background:var(--tint);border-radius:var(--r-md);padding:2px 12px;display:flex;flex-direction:column}
  .tkact-row{display:flex;align-items:center;gap:10px;padding:6px 0;border-top:1px solid var(--divider)}
  .tkact-row:first-child{border-top:none}
  .tkact-lbl{flex:0 0 96px;display:flex;align-items:center;gap:6px;font-size:10px;font-weight:800;
    text-transform:uppercase;letter-spacing:.5px;color:var(--cat)}
  .tkact-dot{width:7px;height:7px;border-radius:50%;background:var(--cat);flex:0 0 auto}
  .tkact-btns{display:flex;gap:6px;flex-wrap:wrap;flex:1 1 auto;min-width:0}
  .tkact-btns .btn{padding:3px 10px 3px 4px;border-radius:var(--r-sm);gap:6px;font-size:12.5px;font-weight:650;line-height:1.2}
  .tkact-btns .btn svg{width:12px;height:12px;box-sizing:content-box;padding:4px;border-radius:var(--r-sm);
    background:color-mix(in srgb,var(--cat) 16%,var(--card));color:var(--cat)}
  .tkact-btns .btn:hover{transform:translateY(-1px);border-color:var(--cat);box-shadow:0 4px 10px rgba(23,52,95,.12)}
  @media (max-width:640px){.tkact-row{flex-direction:column;align-items:flex-start;gap:4px}.tkact-lbl{flex:0 0 auto}}
  .tkinv-list{display:flex;flex-direction:column;gap:7px;margin-top:14px}
  .tkinv-item{display:flex;align-items:center;gap:9px;border:1px solid var(--border);background:var(--card);
    border-radius:var(--r-md);padding:9px 13px;font:inherit;font-size:13.5px;font-weight:650;color:var(--text);
    cursor:pointer;text-align:left;transition:border-color .13s}
  .tkinv-item:hover{border-color:var(--brand)}
  .tkinv-item svg{flex:0 0 auto;width:16px;height:16px;color:var(--muted)}
  .tkinv-name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .setrow{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:14px}
  .setrow .lbl{font-size:11.5px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);
    width:92px;flex:0 0 auto}
  .pick{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);
    padding:7px 13px;font-size:13.5px;font-weight:650;color:var(--text);cursor:pointer;transition:all .13s}
  .pick:hover{border-color:var(--brand)}
  .pick.on{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 6px 14px rgba(148,199,249,.3)}
  .pick .av{width:22px;height:22px;font-size:10px}
  .pick.on .av{box-shadow:0 0 0 2px var(--card)}
  .pick .d{width:10px;height:10px;border-radius:50%}
  .pick-select{border:1px solid var(--border);background:var(--card) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%236A7E8A" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>') no-repeat right 12px center/15px 15px;
    border-radius:var(--r-md);padding:8px 34px 8px 13px;font-size:16px;font-weight:650;color:var(--text);cursor:pointer;
    -webkit-appearance:none;appearance:none;min-width:220px;max-width:100%}
  .pick-select:hover{border-color:var(--brand)}
  .pick-select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}

  .tk-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px 20px}
  .tk-field label{display:block;font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);margin-bottom:8px}
  .tk-field-wide{grid-column:1/-1}
  .tk-pickrow{display:flex;flex-wrap:wrap;gap:8px}
  .tk-field>.pick,.tk-field>.pick-select{width:100%;min-width:0}

  .fielddd{position:relative}
  .fielddd-btn{width:100%;display:flex;align-items:center;gap:9px;border:1px solid var(--border);background:var(--card);
    border-radius:var(--r-md);padding:7px 10px;cursor:pointer;font-size:13.5px;font-weight:650;color:var(--text);transition:border-color .13s}
  .fielddd-btn:hover{border-color:var(--brand)}
  .fielddd-btn .cv{margin-left:auto;flex:0 0 auto;color:var(--muted)}
  .fielddd-btn .av{width:22px;height:22px;font-size:10px;flex:0 0 auto}
  .fielddd-lbl{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
  .fielddd-dot{width:11px;height:11px;border-radius:50%;flex:0 0 auto}
  .fielddd-menu{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:40;background:var(--card);
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 34px rgba(23,52,95,.16);padding:6px;
    max-height:280px;overflow-y:auto;display:none}
  .fielddd-menu.open{display:block}
  /* Ohne width/height-Attribut rendert ein <svg> ohne eigene CSS-Größe in
     der Default-Größe des Browsers (~300x150px) - Rafael, 2026-09-25,
     Screenshot: "Icons bei Dienstleister immer noch etwas überdimensioniert"
     (Anrufen/E-Mail schreiben im .fielddd-item-Menü, ICONS.phone/ICONS.mail
     direkt ohne eigene Größenklasse eingesetzt). */
  .fielddd-item svg{width:15px;height:15px;flex:0 0 auto}
  .fielddd-item{width:100%;display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--r-sm);
    border:none;background:none;cursor:pointer;font-size:13.5px;font-weight:600;color:var(--text);text-align:left}
  .fielddd-item:hover{background:var(--tint)}
  .fielddd-item.on{background:rgba(23,52,95,.10);color:var(--brand-dark)}
  .fielddd-item .av{width:22px;height:22px;font-size:10px;flex:0 0 auto}

  /* Such-Kombobox für die Standort-Auswahl im "Neues Ticket"-Dialog
     (ticketrun.js, openNewTicketModal()) - gleiche Bildsprache wie
     .fielddd-menu oben, nur an ein Textfeld statt einen Button gekoppelt.
     Rafael, 2026-09-20: "muss auch eine Suche geben". */
  .st-pick{position:relative}
  .st-pick-menu{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:40;background:var(--card);
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 34px rgba(23,52,95,.16);padding:6px;
    max-height:260px;overflow-y:auto}
  .st-pick-item{width:100%;display:flex;flex-direction:column;gap:1px;padding:8px 10px;border-radius:var(--r-sm);
    border:none;background:none;cursor:pointer;text-align:left}
  .st-pick-item:hover{background:var(--tint)}
  .st-pick-item b{font-size:13.5px;font-weight:650;color:var(--text)}
  .st-pick-item span{font-size:12px;color:var(--muted)}
  .st-pick-empty{padding:14px 10px;text-align:center;font-size:13px;color:var(--muted)}

  .ai-summary-card{background:linear-gradient(135deg,var(--tint-2),var(--thumb-bg));border-color:var(--chip-border)}
  .ai-summary-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
  .ai-summary-head .tag{background:var(--card);border:1px solid var(--chip-border)}

  .tk-tabs{display:inline-flex;gap:4px;background:var(--chip-bg);border:1px solid var(--border);border-radius:var(--r-md);padding:4px;margin:14px 0;flex-wrap:wrap}
  .tk-tab{border:none;background:none;border-radius:var(--r-md);padding:9px 18px;font-size:13.5px;font-weight:700;color:var(--muted);cursor:pointer;transition:all .13s}
  .tk-tab:hover{color:var(--brand-dark)}
  .tk-tab.on{background:var(--card);color:var(--brand-dark);box-shadow:0 4px 12px rgba(23,52,95,.10)}

  .hwpick-tabs{display:flex;gap:4px;background:var(--chip-bg);border:1px solid var(--border);border-radius:var(--r-md);padding:4px;margin-bottom:14px;flex-wrap:wrap}
  .hwpick-tab{border:none;background:none;border-radius:var(--r-md);padding:8px 14px;font-size:13px;font-weight:700;color:var(--muted);cursor:pointer;transition:all .13s}
  .hwpick-tab:hover{color:var(--brand-dark)}
  .hwpick-tab.on{background:var(--card);color:var(--brand-dark);box-shadow:0 4px 12px rgba(23,52,95,.10)}

  .tag{display:inline-block;background:var(--brand-soft);color:var(--brand-dark);font-size:12px;font-weight:650;
    border-radius:999px;padding:5px 12px;margin:0 6px 6px 0}
  .tag.tagcc{display:inline-flex;align-items:center;gap:6px;padding-right:7px}
  .tagx{border:none;background:none;color:inherit;opacity:.6;cursor:pointer;font-size:14px;line-height:1;padding:0 2px;font-weight:800}
  .tagx:hover{opacity:1}

  .fld{margin-bottom:14px}
  .fld label{display:block;font-size:13px;font-weight:600;margin-bottom:6px;color:var(--muted)}
  .fld input,.fld textarea,.fld select{width:100%;padding:11px 13px;border:1px solid var(--border);border-radius:var(--r-md);font-size:16px;color:var(--text);background:var(--card)}
  .fld input:focus,.fld textarea:focus,.fld select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  /* Größere, gut sichtbare Farb-Vorschau neben Farbwähler + Hex-Feld -
     Rafael, 2026-09-25: "auch die Farbe als Vorschau anzeigen". */
  .ent-color-preview{display:inline-block;width:26px;height:26px;border-radius:var(--r-sm);vertical-align:middle;
    margin-left:8px;border:1px solid var(--border);box-shadow:inset 0 0 0 2px var(--card)}
  .fld-row{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:14px}
  .fld-row .fld{margin:0;flex:1 1 200px;min-width:180px}
  /* Dokumentenart je Mail-Anhang, schon vor dem Zuordnen wählbar (maOverlay,
     mail.js renderMaAttList()). */
  .ma-att-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}
  .ma-att-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:600}
  .ma-att-row select{width:auto;flex:0 0 auto;padding:6px 10px;font-size:16px}

  .log{list-style:none;margin:0;padding:0}
  .log li{display:flex;gap:12px;padding:0 0 16px}
  .log li:last-child{padding-bottom:0}
  .log .lav{flex:0 0 auto}
  .log .lcbody{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:6px}
  .log .lm{display:flex;align-items:baseline;gap:9px}
  .log .lm b{font-size:13.5px;font-weight:700}
  .log .lm span{font-size:11.5px;color:var(--muted)}
  .log .lt{font-size:13.5px;line-height:1.6;white-space:pre-wrap;word-wrap:break-word;background:var(--surface-soft);
    border:1px solid var(--divider);border-radius:var(--r-md);padding:11px 14px}
  /* Löschkreuz oben rechts in Kommentar-/System-Bubble und Verlauf-Zeile,
     erst beim Drüberfahren deutlich sichtbar (auf Touch immer leicht). */
  .log .lt,.vl-item{position:relative}
  .cmt-del{position:absolute;top:6px;left:6px;width:20px;height:20px;border-radius:50%;border:none;padding:0;
    background:transparent;color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;
    opacity:.45;transition:opacity .13s,background .13s,color .13s}
  .cmt-del svg{width:11px;height:11px}
  .lt:hover>.cmt-del,.vl-item:hover>.cmt-del,.cmt-del:focus-visible{opacity:1}
  .cmt-del:hover{background:var(--danger);color:#fff}
  .log .lt:has(>.cmt-del){padding-left:32px}
  .vl-item>.cmt-del{top:8px;left:auto;right:0}
  .log .ldate{display:block;font-size:10.5px;font-weight:600;color:var(--muted);margin-top:5px;white-space:nowrap}
  .log .sys{font-size:12.5px;color:var(--muted);background:none;border:none;padding:2px 0}
  .log .lt.notif{background:var(--warn-soft);border-color:var(--warn-soft-border);color:var(--warn-soft-text)}
  .log .lt.notif svg{width:14px;height:14px;vertical-align:-2px;margin-right:5px}
  .log .lt.notif b{font-weight:800}
  /* Mail-/Dokument-Zuordnung im Kommentare-Reiter: eigene graue Bubble
     "von der anderen Seite" statt reiner Systemzeile - siehe
     gruppiereLog() in ticketrun.js. */
  .log li.sysbubble{flex-direction:row-reverse}
  .log li.sysbubble .lcbody{align-items:flex-end}
  .log li.sysbubble .lt.sys{background:var(--chip-bg);border:1px solid var(--divider);border-radius:var(--r-md);
    padding:10px 14px;color:var(--muted);font-size:12.5px;max-width:88%}
  .log li.sysbubble .ldate{text-align:right}
  .sysav{width:32px;height:32px;border-radius:50%;background:var(--chip-bg);color:var(--muted);
    display:flex;align-items:center;justify-content:center}
  .sysav svg{width:15px;height:15px}

  /* Verlauf-Reiter: schmale Zeitleiste statt Bubbles, je Änderungsart ein
     eigenfarbiger Punkt mit Icon, verbunden durch eine durchgehende Linie
     (siehe verlaufMarker()/verlaufListHtml() in ticketrun.js). */
  .vl{list-style:none;margin:0;padding:0;position:relative}
  .vl::before{content:"";position:absolute;left:15px;top:6px;bottom:6px;width:2px;background:var(--divider)}
  .vl-item{display:flex;gap:14px;padding:0 0 20px;position:relative}
  .vl-item:last-child{padding-bottom:0}
  .vl-dot{position:relative;z-index:1;flex:0 0 auto;width:32px;height:32px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:0 0 0 4px var(--card)}
  .vl-dot svg{width:15px;height:15px}
  .vl-body{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px;padding-top:6px}
  .vl-text{font-size:13px;color:var(--text);font-weight:600}
  .vl-date{font-size:11px;color:var(--muted);font-weight:600}
  /* Textfeld volle Breite, Speichern-Button darunter in einer eigenen,
     rechtsbündigen Kopfzeile (.tk-doc-head) statt seitlich am Textfeld -
     Rafael, 2026-09-29: "Speichern soll aussehen wie Hochladen/Neue Mail",
     gleiches Muster wie die Dokumente-/Mails-Kachel-Köpfe. */
  .writer{border-top:1px solid var(--divider);padding-top:15px;margin-top:16px}
  .writer textarea{width:100%;box-sizing:border-box;min-height:82px;resize:vertical;border:1px solid var(--border);border-radius:var(--r-md);
    padding:11px 14px;font-size:16px;line-height:1.55;color:var(--text);outline:none}
  .writer textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .writer .tk-doc-head{margin:10px 0 0}

  .attgrid{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:14px}
  .att-img{width:180px;display:flex;flex-direction:column;gap:5px}
  .att-img-frame{position:relative;width:180px;height:180px}
  .att-img-btn{position:relative;display:block;width:180px;height:180px;padding:0;border:1px solid var(--border);border-radius:var(--r-md);
    overflow:hidden;background:var(--thumb-bg);cursor:zoom-in;transition:border-color .13s,transform .1s}
  .att-img-btn:hover{border-color:var(--brand);transform:translateY(-1px)}
  .att-img-btn img{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
  /* Zweizeilig: Dateiname (fett) oben, Datum kleiner darunter - vorher nur
     eine Zeile mit dem Datum allein. */
  .att-img-btn .stampl{position:absolute;left:0;right:0;bottom:0;background:rgba(20,45,60,.72);color:#fff;
    padding:5px 7px;pointer-events:none}
  .att-img-btn .stampl b{display:block;font-size:11px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .att-img-btn .stampl span{display:block;font-size:9.5px;font-weight:600;opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .att-img-del{position:absolute;top:5px;right:5px;width:22px;height:22px;border-radius:50%;border:none;
    background:rgba(20,45,60,.6);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;
    transition:background .13s,transform .1s}
  /* Auswahl-Checkbox oben links auf der Bild-Kachel (pictures.js). */
  .img-check{position:absolute;top:7px;left:7px;width:18px;height:18px;accent-color:var(--brand);cursor:pointer;z-index:2}
  .att-img-del svg{width:12px;height:12px}
  .att-img-cover.on svg{fill:var(--warn);stroke:var(--warn)}
  .att-img-del:hover{background:var(--danger);transform:scale(1.08)}
  /* Eigene, kompaktere Höhe hier - steht unter der 104px schmalen Bild-
     Kachel, nicht neben den .act-Buttons wie die Datei-Zeilen-Variante,
     die 34px hohe Basisregel wäre hier zu klobig. */
  .att-img .att-tag{width:100%;height:24px;padding:0 20px 0 7px;font-size:10px}
  .attlist{list-style:none;margin:0;padding:0}
  .attlist li{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--divider);font-size:13.5px}
  .attlist li:last-child{border-bottom:none}
  .fico{width:38px;height:38px;border-radius:var(--r-md);background:var(--brand-soft);color:var(--brand-dark);flex:0 0 auto;
    display:flex;align-items:center;justify-content:center}
  .fico svg{width:18px;height:18px}
  /* Stern vor dem Namen bei fest zugeordneten Handwerkern (hwRowHtml(),
     ticketrun.js) - ohne eigene Größe rendert das rohe ICONS.star-SVG in
     seiner Instrinsic-Größe (riesig), da es hier nicht wie sonst innerhalb
     von .fico sitzt. */
  .fav-star svg{width:14px;height:14px;vertical-align:-2px}
  .fbody{flex:1 1 auto;min-width:0}
  .fbody b{display:block;font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .inline-edit{display:block;width:100%;max-width:280px;font:inherit;font-weight:650;color:var(--text);
    border:1px solid var(--brand);border-radius:var(--r-sm);padding:1px 6px;outline:none;box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .fbody span{font-size:12px;color:var(--muted)}
  .fact{flex:0 0 auto;display:flex;align-items:center;gap:8px}
  /* height:34px - dieselbe Höhe wie die .act-Buttons daneben (Ansehen/
     Herunterladen/Löschen in der Dokumente-Karte), sonst wirkt die
     Klassifizierung-Auswahl niedriger als die Buttons in derselben Zeile. */
  .att-tag{border:1px solid var(--border);background:var(--card);border-radius:var(--r-sm);padding:0 24px 0 9px;height:34px;font-size:11.5px;font-weight:650;
    color:var(--muted);cursor:pointer;-webkit-appearance:none;appearance:none;
    background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%236A7E8A" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>');
    background-repeat:no-repeat;background-position:right 6px center;background-size:11px 11px}
  .att-tag:hover{border-color:var(--brand);color:var(--brand-dark)}
  /* ".attlist li.mail-item" statt nur ".mail-item": die allgemeinere Regel
     ".attlist li" (Zeile oben) hat durch Element+Klasse höhere Spezifität
     als eine einzelne Klasse - ohne das "li" davor gewann bisher IMMER
     ".attlist li{display:flex}", das "display:block" hier lief ins Leere.
     Dadurch lag die aufgeklappte Vorschau als Flex-Nachbar NEBEN der
     Zeile statt normal darunter. */
  .attlist li.mail-item{display:block;padding:0}
  .mail-row{display:flex;align-items:center;gap:12px;padding:11px 0;cursor:pointer}
  .mail-row:hover .fbody b{color:var(--brand-dark)}
  .mail-expand{display:none;padding:0 0 16px 50px}
  .mail-expand.open{display:block}
  .mail-expand .rd-body{padding:0;font-size:13.5px}
  .attlist li.file-item{display:block;padding:0}   /* Grund siehe .mail-item oben */
  .file-row{display:flex;align-items:center;gap:12px;padding:11px 0;flex-wrap:wrap}
  .doc-check{flex:0 0 auto;width:17px;height:17px;accent-color:var(--brand);cursor:pointer}
  /* Auswahlleiste für "N ausgewählt" + Aktionen (Mail senden, Aufheben) -
     documents.js/pictures.js, Rafael 2026-09-20. */
  .sel-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;background:var(--brand-soft);
    border-radius:var(--r-md);padding:10px 14px;margin-bottom:10px}
  .sel-bar b{font-size:13px;color:var(--brand-dark)}
  /* .btn-ghost hat eigene, größere Standardmaße (siehe dessen Basis-
     Regel) - hier explizit mit angleichen, sonst wirkt "Auswahl
     aufheben" größer als "Per Mail senden". Rafael, 2026-09-20. */
  .sel-bar .btn,.sel-bar .btn-ghost{padding:7px 13px;font-size:13px;border-radius:var(--r-sm);margin:0}
  /* Volle Breite statt (wie vorher) unter dem Text eingerückt - liegt
     unter der ganzen Zeile inkl. Icon und Buttons, nicht nur dem Namen. */
  .file-expand{display:none;margin:8px 0 16px;border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;
    height:min(70vh,780px);background:var(--thumb-bg)}
  .file-expand.open{display:block}
  .file-expand iframe{width:100%;height:100%;border:none;display:block;background:var(--card)}
  .lnk{display:inline-block;border:none;background:none;color:var(--brand-dark);text-decoration:none;font-size:13px;font-weight:700;cursor:pointer;padding:6px 8px;border-radius:var(--r-sm)}
  .lnk:hover{background:var(--brand-soft)}
  .lnk.del{color:var(--muted)}
  .lnk.del:hover{background:var(--danger-soft);color:var(--danger-soft-text)}
  .addrow{display:flex;gap:9px;flex-wrap:wrap;border-top:1px solid var(--divider);padding-top:15px;margin-top:4px}

  /* ============ Workflow (Ticket-Flow) ============ */
  .flowhelp{background:var(--brand-soft);color:var(--text);border-radius:var(--r-md);padding:12px 14px;font-size:13.5px;
    line-height:1.5;margin-bottom:14px}
  .flowhelp.fwarten{display:flex;align-items:center;gap:9px;background:var(--warn-soft);color:var(--warn-soft-text)}
  .flowhelp.fwarten svg{width:16px;height:16px;flex:0 0 auto}
  /* Bisheriger Weg im Workflow als Brotkrumen – ersetzt die frühere lineare Fortschrittsleiste,
     die eine feste Schrittfolge voraussetzte und mit dem Graphen (Verzweigen/Zusammenlaufen)
     nicht mehr zusammenpasst. */
  .fpfad{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin-bottom:14px;font-size:12.5px}
  .fpfad-step{padding:3px 10px;border-radius:999px;background:var(--grid-line);color:var(--muted);font-weight:650}
  .fpfad-step.cur{background:var(--brand-soft);color:var(--brand-dark)}
  .fpfad-sep{color:var(--border);display:inline-flex}
  /* Mehrere gleichzeitig aktive Zweige (und-Verzweigung) stehen als eigene Blöcke
     untereinander, jeweils mit eigenem Hilfetext/Aktionen/Weiter-Button. */
  .fbranch{border:1px solid var(--border);border-radius:var(--r-md);padding:14px;margin-bottom:12px;background:var(--surface-soft)}
  .fbranch:last-child{margin-bottom:0}
  .fbranch .flowhelp,.fbranch .addrow{margin-bottom:0}
  .fbranch .addrow{border-top:none;padding-top:10px}
  .fbranch-tag{font-size:11px;font-weight:800;letter-spacing:.2px;color:var(--brand-dark);margin-bottom:9px}
  .fbranch.end{background:#F4F9F6}
  .flowhelp.fend{display:flex;align-items:center;gap:9px;background:var(--ok-soft);color:var(--ok);margin-bottom:0}
  .flowhelp.fend svg{width:16px;height:16px;flex:0 0 auto}
  /* Betonter Hinweis, nachdem eine Aktion (Mail/Priorität) am Knoten ausgeführt wurde. */
  .fbranch.hint{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
  .fhint{display:flex;align-items:center;gap:8px;background:var(--brand-soft);color:var(--brand-dark);
    border-radius:var(--r-md);padding:9px 12px;font-size:13px;font-weight:650;margin-bottom:12px}
  .fhint svg{width:15px;height:15px;flex:0 0 auto}
  /* Read-only Miniaturansicht des ganzen Workflow-Graphen im Ticket – eigenes, klick­bares
     Links-nach-rechts-Layout (siehe flowAutoLayout in app.js), unabhängig vom Editor. */
  .fgro-wrap{border:1px solid var(--border);border-radius:var(--r-md);overflow:auto;max-height:340px;margin-bottom:10px;
    background:linear-gradient(90deg,var(--grid-line) 1px,transparent 1px) 0 0/22px 22px,linear-gradient(var(--grid-line) 1px,transparent 1px) 0 0/22px 22px,var(--surface-soft)}
  .fgro-inner{position:relative}
  .fgro-svg{position:absolute;left:0;top:0;pointer-events:none}
  .fgro-line{fill:none;stroke:#C7D3DB;stroke-width:2}
  .fgro-node{position:absolute;display:flex;align-items:center;gap:6px;padding:8px 10px;border-radius:var(--r-md);box-sizing:border-box;
    background:var(--card);border:1.5px solid var(--border);font:inherit;font-size:11.5px;font-weight:650;color:var(--muted);
    text-align:left;cursor:pointer;transition:border-color .12s,box-shadow .12s}
  .fgro-node:hover{border-color:var(--brand)}
  .fgro-node svg{width:13px;height:13px;flex:0 0 auto}
  .fgro-node span{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.25}
  .fgro-node.warten{background:var(--warn-soft);border-color:var(--warn-soft-border)}
  .fgro-node.done{color:var(--ok);border-color:var(--ok-soft-border)}
  .fgro-node.active{color:var(--brand-dark);border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);background:var(--card)}
  /* Start/Ende: eigene Kapsel-Form statt Karte, tragen keinen Inhalt. */
  .fgro-node.cap{border-radius:999px;justify-content:center;font-weight:800;letter-spacing:.2px}
  .fgro-node.cap span{-webkit-line-clamp:1;text-align:center}
  .fgro-node.start{background:var(--ok-soft);border-color:var(--ok-soft-border);color:var(--ok)}
  .fgro-node.end{background:#EEF1F4;border-color:#D6DEE4;color:var(--muted)}
  .fgro-node.end.done{background:var(--ok-soft);border-color:var(--ok-soft-border);color:var(--ok)}
  .fgro-now{font-style:normal;font-size:9px;font-weight:800;letter-spacing:.3px;text-transform:uppercase;
    background:var(--brand);color:#fff;border-radius:999px;padding:2px 6px;margin-left:auto;flex:0 0 auto}
  .fgro-detail{border:1px solid var(--border);border-radius:var(--r-md);padding:11px 13px;margin-bottom:12px;
    background:var(--brand-soft);font-size:12.5px}
  .fgro-detail b{display:block;font-size:12.5px;margin-bottom:4px}
  .fgro-mail{color:var(--muted)}

  /* ============ Ticketeingang ============ */
  .qcard{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);
    padding:20px 22px;margin-bottom:14px;transition:opacity .3s,transform .3s}
  .qcard.gone{opacity:0;transform:translateX(40px)}
  .qhead{display:flex;align-items:center;gap:10px;margin-bottom:8px}
  .qref{font-size:12.5px;font-weight:800;color:var(--brand-dark);letter-spacing:.4px}
  .qwhen{font-size:12px;color:var(--muted)}
  .qloc{background:var(--brand-soft);color:var(--brand-dark);font-size:12px;font-weight:700;padding:4px 11px;
    border-radius:999px;margin-left:auto;white-space:nowrap}
  .qcard h3{margin:0 0 7px;font-size:17px;font-weight:700;line-height:1.32}
  .qdesc{margin:0 0 13px;font-size:14px;color:var(--text);line-height:1.55;white-space:pre-wrap}
  .qmeta{border-top:1px solid var(--divider);padding-top:12px;display:grid;
    grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:7px 20px;font-size:13px}
  .qmeta div{display:flex;justify-content:space-between;gap:10px}
  .qmeta span{color:var(--muted);flex:0 0 auto}
  .qmeta b{font-weight:600;text-align:right;word-break:break-word}
  .qgal{margin-top:13px;border-top:1px solid var(--divider);padding-top:12px}
  .glbl{font-size:12px;color:var(--muted);font-weight:700;margin-bottom:9px}
  .tiles{display:flex;flex-wrap:wrap;gap:9px}
  .thumb{position:relative;width:74px;height:74px;padding:0;border:1px solid var(--border);border-radius:var(--r-md);
    overflow:hidden;background:var(--thumb-bg);cursor:zoom-in;transition:border-color .13s,transform .1s}
  .thumb:hover{border-color:var(--brand);transform:translateY(-1px)}
  .thumb img{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
  .thumb .n{position:absolute;bottom:4px;right:4px;background:rgba(20,45,60,.72);color:#fff;font-size:10.5px;
    font-weight:700;padding:1px 6px;border-radius:999px}
  .grp{margin-top:14px}
  .grp.first{border-top:1px solid var(--divider);padding-top:14px}
  .glab{display:flex;align-items:center;gap:8px;font-size:11.5px;font-weight:800;letter-spacing:.4px;
    text-transform:uppercase;color:var(--muted);margin-bottom:8px}
  .gmiss{background:var(--danger-soft);color:var(--danger-soft-text);font-size:10.5px;font-weight:800;padding:2px 8px;border-radius:999px;letter-spacing:.3px}
  .gok{background:var(--ok-soft);color:var(--ok);font-size:10.5px;font-weight:800;padding:2px 8px;border-radius:999px;letter-spacing:.3px}
  .opts{display:flex;flex-wrap:wrap;gap:8px}
  .opt{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);
    padding:9px 15px;font-size:13.5px;font-weight:600;color:var(--text);cursor:pointer;transition:all .13s}
  .opt:hover{border-color:var(--brand)}
  .opt.on{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 6px 14px rgba(148,199,249,.32)}
  .opt .d{width:10px;height:10px;border-radius:50%;flex:0 0 auto}
  .opt.on .d{box-shadow:0 0 0 2px var(--card)}
  .qact{display:flex;gap:10px;align-items:center;margin-top:17px;border-top:1px solid var(--divider);padding-top:15px;flex-wrap:wrap}
  .bt-ok{border:none;background:var(--grad-btn);color:#fff;border-radius:var(--r-md);padding:11px 20px;font-size:14px;
    font-weight:700;cursor:pointer;box-shadow:0 8px 18px rgba(23,52,95,.3);display:flex;align-items:center;gap:8px}
  .bt-ok:disabled{background:#CBDCE6;color:#7B909C;box-shadow:none;cursor:not-allowed}
  .bt-ok svg{width:16px;height:16px}
  .bt-no{border:1px solid var(--border);background:var(--card);color:var(--text);border-radius:var(--r-md);padding:11px 18px;
    font-size:14px;font-weight:650;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .13s}
  .bt-no:hover{border-color:var(--danger);background:var(--danger-soft);color:var(--danger-soft-text)}
  .bt-no svg{width:16px;height:16px}
  .qhint{font-size:12.5px;color:var(--muted);margin-left:auto;text-align:right}

  /* ============ Rechnungspruefung ============ */
  .inv-filter .kchip{font-size:12px;padding:6px 11px}
  /* Kachel-Raster statt schmaler Liste - gleiches Muster wie die
     Standort-Kacheln (.st-grid/.st-card), damit es optisch zum Rest
     der App passt und die volle Breite nutzt. */
  /* ---- Handwerker-Suche (POC, js/modules/vendorfinder.js) ---- */
  /* Gesamttreffer-Zähler über den Kacheln - Rafael, 2026-09-20: "oben die
     Gesamttreffer hervorheben". */
  .vf-total{font-size:22px;font-weight:800;color:var(--brand-dark);margin:0 0 14px}
  .vf-total span{font-size:13px;font-weight:650;color:var(--muted);text-transform:none;margin-left:4px}
  .vf-sechead{margin:0 0 10px;font-size:13px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--text)}
  /* "Beide"-Modus: OSM/KI nebeneinander (50/50) statt untereinander, damit
     man sie direkt vergleichen kann - Rafael, 2026-09-20: "links und
     rechts trennen statt oben und unten". Bricht auf schmalen Screens
     automatisch untereinander um. */
  .vf-compare{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap}
  .vf-col{flex:1 1 320px;min-width:0}
  .vf-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;align-items:stretch}
  /* Gleiche Kachelhöhe je Zeile (Grid-Items stretchen schon von selbst),
     Button unten bündig statt direkt unterm Inhalt - Rafael, 2026-09-20:
     "jede Kachel bitte die gleiche Höhe". */
  .vf-card{padding:15px 16px;display:flex;flex-direction:column;align-self:stretch;height:100%}
  .vf-card-foot{margin-top:auto;padding-top:10px}
  .vf-card-top{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}
  .vf-card-top b{font-size:14.5px;font-weight:750}
  .vf-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
  /* Gesuchte PLZ je Treffer, unterscheidet sich manchmal von der
     tatsächlichen Adress-PLZ (Betrieb liegt im Nachbarort) - Rafael,
     2026-09-20: "in jeder Trefferkachel die gesuchte PLZ als Button". */
  .vf-plz-badge{font-size:10.5px;font-weight:800;padding:3px 9px;border-radius:999px;
    background:var(--chip-bg);color:var(--text)}
  .vf-src{font-size:10.5px;padding:3px 9px}
  .vf-src-osm{background:var(--brand-soft);color:var(--brand-dark)}
  .vf-src-ki{background:var(--warn-soft);color:var(--warn-soft-text)}
  .vf-contacts{display:flex;flex-direction:column;gap:5px;margin-top:10px}
  .vf-contact{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--brand-dark);font-weight:650;
    text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .vf-contact:hover{text-decoration:underline}
  .vf-contact svg{width:13px;height:13px;flex:0 0 auto}
  /* Gezielte Nachrecherche je Treffer, nur sichtbar wenn Webseite bekannt
     aber (noch) keine E-Mail - Rafael, 2026-09-20: "ein Button ... speziell
     für den Handwerker, die Kontaktmail nachzurecherchieren". */
  .vf-email-lookup{display:inline-flex;align-items:center;gap:6px;margin-top:8px;padding:6px 10px;
    font-size:12px;font-weight:650;border-radius:var(--r-sm)}
  .vf-email-lookup svg{width:13px;height:13px;flex:0 0 auto}
  /* ---- Dienstleister (js/modules/dienstleister.js) - eigene Klassen
     statt der .vf-* oben, da vendorfinder.js ein Test ist, der eventuell
     wieder verschwindet, dieses Modul aber bleiben soll.
     Kacheln bewusst in FESTER Höhe/Breite statt auto-fill/minmax(...,1fr) -
     Rafael, 2026-09-24: "unbedingt alle Kacheln gleich hoch! bei den HW
     auf eine fixe Höhe und Breite" - Inhalt, der nicht passt, wird
     abgeschnitten (Ellipsis/line-clamp) statt die Kachel zu strecken. */
  /* align-items/align-content:start explizit - Rafael, 2026-09-24: "die
     erste Kachel immer noch hochgesetzt, bitte alles auf eine Linie"
     (ohne das kann eine Grid-Zeile mit Reste-Platz die Karten je nach
     Browser mittig statt oben ausrichten, sichtbar v. a. bei der letzten
     unvollständigen Zeile). */
  /* Duplikate-Reiter (Dienstleister) - siehe dlPaintDuplikate(). */
  .dl-dup-list{display:flex;flex-direction:column;gap:14px}
  .dl-dup-group{display:flex;flex-direction:column;gap:2px}
  .dl-dup-item{display:flex;align-items:flex-start;gap:11px;padding:10px 8px;border-radius:var(--r-md);cursor:pointer}
  .dl-dup-item:hover{background:var(--tint)}
  .dl-dup-item input[type=radio]{margin-top:4px;flex:0 0 auto}
  .dl-dup-info{display:flex;flex-direction:column;gap:2px;min-width:0}
  .dl-dup-info b{font-size:14px}
  .dl-dup-info span{font-size:12.5px;color:var(--muted)}
  .dl-dup-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}
  .dl-grid{display:grid;grid-template-columns:repeat(auto-fill,268px);gap:14px;justify-content:start;align-items:start;align-content:start}
  .dl-card{width:268px;height:244px;padding:46px 16px 14px;position:relative;overflow:hidden;
    display:flex;flex-direction:column;cursor:pointer;transition:transform .13s,box-shadow .13s}
  /* Bewusst KEIN translateY beim Hover mehr (nur noch Schatten) - eine
     angehobene Kachel wirkt auf Screenshots leicht wie "verrutscht",
     was wiederholt als Layout-Bug gemeldet wurde, obwohl es nur der
     normale Hover-Zustand einer einzelnen Kachel war. Rafael,
     2026-09-24: "Kachel immer noch verschoben". */
  .dl-card:hover{box-shadow:0 20px 46px rgba(23,52,95,.13)}
  .dl-card-name{font-size:14.5px;font-weight:750;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;
    -webkit-box-orient:vertical;overflow:hidden}
  /* Notfall-/Bewährt-Badges aus dem Handwerkerlisten-Import (Rafael,
     2026-09-27) - direkt hinter dem Namen auf Kachel/Tabelle/Detailkopf
     (dlFlagsHtml() in dienstleister.js), daher hier zentral statt an drei
     Stellen einzeln definiert. Bewährt-Badge bewusst ein festes, sattes
     Blau (nicht --ok/grün, nicht das blasse --brand) - Rafael: "ein
     blaues verifiziert Badge wie bei Insta wäre gut", soll optisch klar
     von "erledigt/freigegeben"-Häkchen (die grün sind) unterscheidbar
     bleiben, egal ob Light- oder Dark-Mode. */
  .dl-flag{display:inline-flex;vertical-align:-3px;margin-left:5px;width:15px;height:15px}
  .dl-flag svg{width:100%;height:100%}
  .dl-flag-notfall{color:var(--danger)}
  .dl-flag-approved{color:#3B82F6}
  #dlNotfallToggle,#dlApprovedToggle{display:inline-flex;align-items:center;gap:6px}
  #dlNotfallToggle svg,#dlApprovedToggle svg{width:14px;height:14px;flex:0 0 auto}
  /* Nur der Notfall-Button (reine currentColor-Kontur, ICONS.alert) darf
     im aktiven Zustand auf Weiß springen - das Bewährt-Badge hat eine
     GEFÜLLTE Kreisfläche in currentColor: Weiß hier würde einen weißen
     Haken auf weißem Kreis ergeben (unsichtbar), deshalb bleibt sein Blau
     in jedem Zustand fest (nicht von .fb/.fb.on-Textfarbe abhängig). */
  #dlNotfallToggle.on svg{color:#fff}
  #dlApprovedToggle svg{color:#3B82F6}
  .dl-card-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
  .dl-card-addr{display:block;font-size:12.5px;color:var(--muted);margin-top:8px;white-space:nowrap;
    overflow:hidden;text-overflow:ellipsis}
  .dl-contacts{display:flex;flex-direction:column;gap:5px;margin-top:9px;overflow:hidden}
  .dl-contact{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--brand-dark);font-weight:650;
    text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .dl-contact:hover{text-decoration:underline}
  .dl-contact svg{width:13px;height:13px;flex:0 0 auto}
  /* Score-Badge (VORLÄUFIG, siehe dlScorePct() im JS) - Ring per
     conic-gradient, inneres Kreis-Element mit Kartenfarbe legt sich
     darüber und lässt nur den Ring sichtbar, Zahl in der Mitte. Rafael,
     2026-09-24: "einen Score anzeigen mit einem coolen optischen
     Highlight". */
  .dl-score{position:absolute;top:10px;right:10px;width:44px;height:44px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;padding:4px}
  .dl-score-in{width:100%;height:100%;border-radius:50%;background:var(--card);
    display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px}
  .dl-edit-mini{position:absolute;top:10px;left:10px;width:30px;height:30px;border-radius:var(--r-sm);
    border:1px solid var(--border);background:var(--card);color:var(--muted);display:flex;
    align-items:center;justify-content:center;cursor:pointer;transition:.13s}
  .dl-edit-mini svg{width:14px;height:14px}
  .dl-edit-mini:hover{border-color:var(--brand);color:var(--brand-dark)}
  /* Mindest-Score-Slider (Rafael, 2026-09-24: "Filter der Dienstleister
     auch nach Score mit einem Slider ... Mindest-Score slidern"). */
  .dl-score-filter{display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:650;color:var(--muted)}
  .dl-score-filter label{display:flex;align-items:center;gap:4px;white-space:nowrap}
  .dl-score-filter b{color:var(--text);font-weight:800}
  .dl-score-filter input[type="range"]{width:110px;accent-color:var(--brand-dark);cursor:pointer}
  .dl-req-counts{display:flex;flex-wrap:wrap;gap:16px;font-size:13px;margin-bottom:10px}
  .inv-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:15px}
  .inv-tile{width:100%;text-align:left;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);
    padding:15px 16px;cursor:pointer;box-shadow:var(--shadow);transition:transform .25s var(--ease-signature),box-shadow .25s var(--ease-signature),border-color .12s}
  .inv-tile:hover{transform:translateY(-3px);box-shadow:0 20px 46px rgba(23,52,95,.13);border-color:var(--brand)}
  .inv-tile-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
  .inv-tile b{display:block;font-size:14.5px;font-weight:750;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .inv-tile span{display:block;font-size:12.5px;color:var(--muted);line-height:1.4;margin-top:2px}
  .inv-tile .amt{margin-top:10px;font-size:15px;font-weight:800;color:var(--text)}
  .ki-badge{display:inline-flex;align-items:center;gap:4px;margin-top:9px;padding:3px 9px;border-radius:99px;
    font-size:11px;font-weight:700;line-height:1.3;white-space:nowrap}
  .ki-badge.done{background:color-mix(in srgb, var(--ok) 16%, var(--card));color:var(--ok)}
  .ki-badge.failed{background:color-mix(in srgb, var(--danger) 14%, var(--card));color:var(--danger)}
  .ki-badge.pending{background:color-mix(in srgb, var(--muted) 16%, var(--card));color:var(--muted)}
  .inv-st{font-size:11.5px;font-weight:800;letter-spacing:.3px;text-transform:uppercase}
  .inv-st.ap1{background:var(--chip-bg);color:#436174}
  .inv-st.ap2{background:var(--warn-soft);color:var(--warn-soft-text)}
  .inv-st.done{background:var(--ok-soft);color:var(--ok)}
  .inv-main h2{margin:0;font-size:17px;font-weight:800;text-transform:none;letter-spacing:0;color:var(--text)}
  .inv-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}
  .inv-head p{margin:4px 0 0;font-size:13.5px;color:var(--muted)}
  .inv-head p.inv-fs-filename{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;margin-top:6px}
  .inv-head-right{display:flex;align-items:center;gap:8px}
  .inv-amt{font-size:16px;font-weight:800;color:var(--text)}
  .inv-panel{border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:15px}
  .inv-step{box-shadow:inset 0 0 0 1px var(--chip-bg)}
  .inv-sub{font-size:12.5px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--brand-dark);margin-bottom:10px}
  /* Statuszeile neben "PDF-Vorschau", solange/nachdem der Prüfstempel
     erzeugt wird (siehe buildInvoiceStampPdf() in invoices.js) - bewusst
     nicht fett/großgeschrieben wie .inv-sub selbst, ist nur ein Hinweis. */
  .inv-stamp-note{font-size:11px;font-weight:600;text-transform:none;letter-spacing:0;color:var(--muted);margin-left:6px}

  /* ---- Vollbild-Prüfmodus: eine Rechnung nach der anderen, kompletter
     Platz für die PDF-Seite rechts, alles zum Bearbeiten schmal links.
     #invoiceBody trägt sonst .scroll (overflow-y:auto) - das ID-Selektor
     hier gewinnt automatisch dagegen, kein !important nötig. */
  #invoiceBody.inv-fs{overflow:hidden;padding:0;display:flex;flex-direction:column}
  .inv-fs-bar{flex:0 0 auto;display:flex;align-items:center;gap:18px;padding:13px 20px;border-bottom:1px solid var(--border);background:var(--card)}
  .inv-fs-progress{flex:1 1 auto;display:flex;align-items:center;gap:11px;max-width:420px}
  .inv-fs-progress .track{flex:1 1 auto}
  .inv-fs-count{font-size:12.5px;font-weight:700;color:var(--muted);white-space:nowrap;font-variant-numeric:tabular-nums}
  .inv-fs-nav{display:flex;gap:6px;margin-left:auto}
  .inv-fs-open{margin-left:auto;font-size:13px}
  .inv-fs-bar .inv-fs-open{margin-left:0}
  .inv-fs-body{flex:1 1 auto;display:flex;min-height:0}
  /* "Blättern"-Übergang beim Sprung zur nächsten Rechnung in der geführten
     Prüfung (advanceReview()) - zwei Phasen statt nur Einblenden: erst
     fährt die aktuelle Seite nach links raus (.inv-fs-leave, direkt beim
     Klick auf "Bestätigen"/"Freigeben"), dann - nach kurzer Pause, sobald
     die nächste Rechnung geladen ist - fährt die neue von rechts rein
     (.inv-fs-pop). Ohne das wirkte der Wechsel wie "nichts passiert".
     Rafael, 2026-09-29: "Transition wie ein Blättern". */
  .inv-fs-body.inv-fs-leave{animation:invFsLeave .18s ease forwards}
  @keyframes invFsLeave{to{opacity:0;transform:translateX(-34px) scale(.98)}}
  .inv-fs-body.inv-fs-pop{animation:invFsPop .34s cubic-bezier(.22,.7,.32,1)}
  @keyframes invFsPop{from{opacity:0;transform:translateX(34px) scale(.98)}to{opacity:1;transform:translateX(0) scale(1)}}
  @media(prefers-reduced-motion:reduce){ .inv-fs-body.inv-fs-pop,.inv-fs-body.inv-fs-leave{animation:none} }
  /* Prominente Meldung oben im linken (Bearbeiten-)Panel beim Rechnungs-
     Sprung - der normale, unten zentrierte Toast wird beim Arbeiten auf
     der linken Seite leicht übersehen. Rafael, 2026-09-29: "soll
     prominenter auf der linken Seite sein, damit man das beim Bearbeiten
     sieht". Ergänzt den Toast, ersetzt ihn nicht. */
  .inv-advance-flash{background:var(--grad-btn);color:#fff;font-weight:700;font-size:13.5px;
    padding:12px 16px;border-radius:var(--r-md);margin-bottom:12px;box-shadow:0 10px 26px rgba(23,52,95,.24);
    animation:invAdvanceIn .3s ease,invAdvanceOut .6s ease 2.4s forwards;pointer-events:none}
  @keyframes invAdvanceIn{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}
  @keyframes invAdvanceOut{to{opacity:0}}
  @media(prefers-reduced-motion:reduce){ .inv-advance-flash{animation:none} }
  /* 50/50-Aufteilung statt fester Pixelbreite - skaliert mit der
     Fensterbreite statt bei breiten Monitoren unnötig zu wachsen. */
  .inv-fs-side{width:50%;flex:0 0 50%;min-width:340px;overflow-y:auto;padding:20px;background:var(--card);border-right:1px solid var(--border)}
  .inv-fs-side>*+*{margin-top:12px}
  .inv-fs-pdf{flex:1 1 auto;min-width:0;background:var(--thumb-bg)}
  .inv-fs-pdf iframe{width:100%;height:100%;border:none;display:block}
  .inv-fs-stamp{border-top:1px solid var(--divider);padding-top:12px;margin-top:12px;font-size:13px}
  .inv-fs-stamp .lnk{padding-left:0}
  @media(max-width:980px){
    .inv-fs-body{flex-direction:column}
    .inv-fs-side{width:100%;flex:0 0 auto;max-height:46vh;border-right:none;border-bottom:1px solid var(--border)}
    .inv-fs-pdf{min-height:40vh}
  }

  .inv-form{display:grid;grid-template-columns:1fr 1fr;gap:11px}
  .inv-form label{display:flex;flex-direction:column;gap:6px;font-size:13px;font-weight:700;color:var(--muted)}
  .inv-money-row{grid-column:1 / -1;display:grid;grid-template-columns:45fr 45fr 10fr;gap:9px;align-items:end}
  .inv-money-row > label{min-width:0}
  .inv-currency-lbl{justify-content:flex-end}
  .inv-currency-toggle{width:100%;height:42px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--card);color:var(--text);font-size:13.5px;font-weight:800;cursor:pointer;padding:0 10px;display:flex;align-items:center;justify-content:center;transition:border-color .12s,background .12s,box-shadow .12s;white-space:nowrap}
  .inv-currency-toggle:hover{border-color:var(--brand);background:var(--tint-2)}
  .inv-currency-toggle:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .inv-form input,.inv-panel select{width:100%;padding:10px 11px;border:1px solid var(--border);border-radius:var(--r-md);font-size:16px;color:var(--text);background:var(--card)}
  .inv-form input:focus,.inv-panel select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .inv-panel .btn{margin-top:10px}
  .inv-meta{font-size:13px;color:var(--muted);margin-top:8px}
  .inv-note-lbl{display:block;font-size:13px;font-weight:700;color:var(--muted);margin-top:8px}
  .inv-note-lbl textarea{width:100%;margin-top:6px;min-height:78px;resize:vertical;border:1px solid var(--border);border-radius:var(--r-md);padding:10px 11px;font-size:16px;color:var(--text);background:var(--card)}
  .inv-note-lbl textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .inv-checks{display:grid;grid-template-columns:1fr;gap:8px;margin:0 0 8px}
  .inv-check{display:flex;align-items:center;gap:10px;padding:10px 11px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface-soft);font-size:14px;color:var(--text)}
  .inv-check input{width:17px;height:17px;accent-color:var(--brand-dark);flex:0 0 auto}
  .inv-help p{margin:0 0 8px;font-size:14px}
  .inv-help pre{margin:0 0 10px;padding:11px 12px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface-soft);font-size:13.5px;line-height:1.5;color:var(--text);white-space:pre-wrap}
  .inv-help ul{margin:0;padding-left:18px;font-size:14px;color:var(--text);line-height:1.6}
  .inv-help-top{margin-bottom:12px}
  .inv-flow{grid-column:1 / -1}
  .inv-tl{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
  .inv-tl li{display:flex;gap:10px;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--divider)}
  .inv-tl li:last-child{border-bottom:none}
  .inv-tl .dot{width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;font-size:12px;font-weight:800}
  .inv-tl li.open .dot{background:var(--chip-bg);color:#4A687A}
  .inv-tl li.done .dot{background:var(--ok-soft);color:var(--ok)}
  .inv-tl b{display:block;font-size:14px;color:var(--text)}
  .inv-tl span{display:block;font-size:13px;color:var(--muted);margin-top:2px}

  /* ============ Lightbox ============ */
  .lb{position:fixed;inset:0;background:rgba(8,20,28,.94);z-index:150;display:none;flex-direction:column}
  .lb.on{display:flex}
  .lbbar{display:flex;align-items:center;gap:9px;padding:12px 14px;color:#fff}
  .lbcount{font-size:13px;font-weight:800;letter-spacing:.4px}
  .lbsp{flex:1}
  .lbbtn{border:none;background:rgba(255,255,255,.14);color:#fff;width:40px;height:40px;border-radius:var(--r-md);
    font-size:19px;font-weight:800;line-height:1;cursor:pointer}
  .lbbtn:hover{background:rgba(255,255,255,.26)}
  .lbstage{flex:1;position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:0 6px}
  .lbimg{max-width:100%;max-height:100%;object-fit:contain;user-select:none}
  .lbnav{position:absolute;top:50%;margin-top:-24px;width:48px;height:48px;border-radius:50%;border:none;
    background:rgba(255,255,255,.16);color:#fff;font-size:24px;line-height:1;cursor:pointer}
  .lbnav:hover{background:rgba(255,255,255,.3)}
  .lbprev{left:10px} .lbnext{right:10px}
  .lbcaption{color:#fff;text-align:center;font-size:13.5px;font-weight:650;padding:0 16px;min-height:1.4em}
  .lbcaption:empty{display:none}
  .lbstrip{display:flex;gap:8px;overflow-x:auto;padding:12px 14px 16px}
  .lbthumb{width:56px;height:56px;flex:none;padding:0;border:2px solid transparent;border-radius:var(--r-md);overflow:hidden;
    background:none;opacity:.55;cursor:pointer}
  .lbthumb.act{border-color:#fff;opacity:1}
  .lbthumb img{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}

  /* ============ Platzhalter ============ */
  .ph-card{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);
    padding:34px 30px;max-width:680px;margin:0 auto}
  .ph-ico{width:54px;height:54px;border-radius:var(--r-md);background:var(--brand-soft);color:var(--brand-dark);
    display:flex;align-items:center;justify-content:center;margin-bottom:18px}
  .ph-ico svg{width:26px;height:26px}
  .ph-tag{display:inline-block;font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;
    color:var(--brand-dark);background:var(--brand-soft);border:1px solid var(--chip-border);border-radius:999px;padding:4px 11px;margin-bottom:13px}
  .ph-card h2{margin:0 0 8px;font-size:20px;font-weight:700;text-transform:none;letter-spacing:0;color:var(--text)}
  .ph-card>p{margin:0 0 22px;font-size:14.5px;line-height:1.6;color:var(--muted);max-width:52ch}

  /* ---- Einstellungen: Tab-Leiste ---- */
  .set-tabs{display:inline-flex;gap:4px;background:var(--chip-bg);border:1px solid var(--border);border-radius:var(--r-md);padding:4px;margin:0 0 18px;flex-wrap:wrap}
  .set-tab{border:none;background:none;border-radius:var(--r-md);padding:9px 16px;font-size:13.5px;font-weight:700;color:var(--muted);cursor:pointer;transition:all .13s}
  .set-tab:hover{color:var(--brand-dark)}
  .set-tab.on{background:var(--card);color:var(--brand-dark);box-shadow:0 4px 12px rgba(23,52,95,.10)}
  /* Reiter-Kopf im Ticket (Kommentare/Mails/Verlauf) - ganz links, ohne
     Überschrift davor und ohne die Trennlinie/den Sektionsabstand von
     .kpi-sechead. Rafael, 2026-09-24. */
  /* Im geöffneten Ticket entfällt die Modul-Kopfzeile ("Tickets / Alle
     Aufträge ...") komplett, spart Platz. Auf schmalen Screens bleibt sie,
     weil dort der Burger-Button drinsitzt. Rafael, 2026-09-24. */
  @media(min-width:981px){
    body[data-view="ticketrun"].tk-open .modhead{display:none}
    /* Ersatz für den entfallenen Kopf-Abstand: Luft nach oben wie zwischen den Blöcken */
    body[data-view="ticketrun"].tk-open #mod-ticketrun > .scroll{padding-top:0}
  }
  .tk-reload{margin-left:auto;display:inline-flex;align-items:center;gap:7px}
  @media(max-width:980px){ .tk-reload{display:none} }
  .tk-doc-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px}
  .doc-cluster + .doc-cluster{margin-top:18px}
  .doc-cluster-head{margin:0 0 10px;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--brand-dark)}
  .doc-cluster-head span{margin-left:4px;font-weight:650;color:var(--muted)}
  .tk-logtabs-head{display:flex;align-items:center;justify-content:flex-start}
  .tk-logtabs-head .set-tabs{margin:0 0 14px}
  /* Mails-Kachel unter Kommentare/Verlauf (eigene, immer sichtbare Karte,
     kein Tab, kein Höhen-Deckel - wächst wie die Dokumente-Karte frei mit
     dem Inhalt mit). Rafael, 2026-09-29: nach mehreren Nebeneinander-/
     Scroll-Versuchen zurückgebaut auf untereinander, voll aufklappend. */
  .ph-list{list-style:none;margin:0;padding:0;border-top:1px solid var(--border)}
  .ph-list li{display:flex;gap:12px;align-items:flex-start;padding:13px 2px;border-bottom:1px solid var(--divider);font-size:14px;line-height:1.5}
  .ph-list li:last-child{border-bottom:none}
  .ph-list .bx{width:17px;height:17px;flex:0 0 auto;margin-top:2px;border:1.8px solid var(--border);border-radius:5px}
  .ph-list b{font-weight:650}
  .ph-list span{color:var(--muted)}

  /* ============ Mail-Modul ============ */
  .app{flex:1 1 auto;display:grid;grid-template-columns:242px 348px 1fr;gap:16px;padding:0 20px 20px;min-height:0}
  .pane{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);min-height:0;
    display:flex;flex-direction:column;overflow:hidden}
  .side{padding:16px 14px}
  .compose{width:100%;border:none;background:var(--grad-btn);color:#fff;font-size:15px;font-weight:700;
    padding:13px;border-radius:var(--r-md);cursor:pointer;box-shadow:0 10px 22px rgba(23,52,95,.32);
    display:flex;align-items:center;justify-content:center;gap:9px;transition:transform .08s,box-shadow .15s}
  .compose:hover{box-shadow:0 12px 28px rgba(23,52,95,.42)}
  .compose:active{transform:translateY(1px)}
  .folders{margin-top:16px;overflow-y:auto;flex:1 1 auto}
  .folders .grouplbl{font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--muted);padding:12px 12px 6px}
  .folder{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:var(--r-md);cursor:pointer;
    font-size:14px;font-weight:600;color:var(--text);transition:background .12s,color .12s}
  .folder .ico{width:18px;height:18px;flex:0 0 auto;color:var(--brand-dark);display:flex}
  .folder .nm{flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .folder:hover{background:var(--tint)}
  .folder.active{background:var(--brand);color:#fff;box-shadow:0 6px 14px rgba(148,199,249,.32)}
  .folder.active .ico{color:#fff}
  /* "Zugeordnet"-Unterordner je Kunde/Team (renderFolders() in mail.js) -
     eingerückt + etwas kleiner, damit klar ist, dass er zum Ordner direkt
     darüber gehört. */
  .folder.folder-sub{padding-left:34px;font-size:13px;font-weight:500;color:var(--muted)}
  .folder.folder-sub .ico{width:15px;height:15px}
  .folder.folder-sub.active{color:#fff}
  /* Zähler ("wie viele Mails müssen hier noch bearbeitet werden", siehe
     loadKundenTeamCounts()) - dieselbe Pillenoptik wie .msg-tag/.newin-tag. */
  .fcount{flex:0 0 auto;font-size:10.5px;font-weight:800;padding:2px 7px;border-radius:999px;
    background:var(--brand-soft);color:var(--brand-dark)}
  .folder.active .fcount{background:rgba(255,255,255,.28);color:#fff}
  /* Postfach-Umschalter */
  .mbswitch{position:relative;margin-bottom:12px}
  .mbswitch.mob{display:none}
  .mbbtn{width:100%;display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:var(--r-md);
    border:1px solid var(--border);background:var(--card);cursor:pointer;text-align:left;color:var(--text)}
  .mbbtn:hover{background:var(--tint);border-color:var(--brand)}
  .mbbtn .cv{margin-left:auto;flex:0 0 auto;color:var(--muted)}
  .mbdot{width:12px;height:12px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 0 2px var(--card), 0 0 0 3px rgba(0,0,0,.06)}
  .mbtxt{min-width:0;display:flex;flex-direction:column;line-height:1.2}
  .mbtxt b{font-size:13.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mbtxt span{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mbmenu{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:40;background:var(--card);
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 18px 44px rgba(20,45,60,.20);
    padding:6px;display:none;max-height:340px;overflow-y:auto}
  .mbmenu.open{display:block}
  .mbgrp{font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--muted);padding:8px 10px 6px}
  .mbi{width:100%;display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--r-md);
    border:none;background:none;cursor:pointer;text-align:left;color:var(--text)}
  .mbi:hover{background:var(--tint)}
  .mbi.on{background:rgba(23,52,95,.10)}
  .mbi .chk{margin-left:auto;flex:0 0 auto;color:var(--brand-dark);display:flex}
  .listhead{padding:14px 16px 10px;border-bottom:1px solid var(--border);flex:0 0 auto}
  .listhead .fname{font-size:16px;font-weight:700;margin:0 0 10px;display:flex;align-items:center;gap:8px}
  .search{position:relative}
  .search svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--muted)}
  .search input{width:100%;padding:10px 34px 10px 36px;border:1px solid var(--border);border-radius:var(--r-md);
    font-size:16px;color:var(--text);background:var(--card);box-sizing:border-box}
  .search input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  /* Info-Icon mit Hover-Liste der Suchregeln (matchesSearch()/
     searchHelpHtml(), core/util.js) - rechts im Suchfeld. Basis relativ/
     inline (falls mal ohne .search-Wrapper genutzt, siehe ticketrun.js),
     innerhalb von .search absolut positioniert. */
  .search-help{position:relative;display:inline-flex;width:18px;height:18px;flex:0 0 auto;
    border-radius:50%;align-items:center;justify-content:center;font-size:12px;font-weight:800;
    line-height:1;color:var(--muted);border:1.5px solid var(--border);cursor:help}
  .search .search-help{position:absolute;right:10px;top:50%;transform:translateY(-50%)}
  .search-help:hover,.search-help:focus{border-color:var(--brand);color:var(--brand-dark);outline:none}
  .search-help-pop{display:none;position:absolute;right:-8px;top:calc(100% + 9px);width:230px;
    background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 34px rgba(0,0,0,.2);
    padding:12px 14px;font-size:12.5px;color:var(--text);z-index:60;text-align:left;font-weight:500}
  .search-help:hover .search-help-pop,.search-help:focus .search-help-pop{display:block}
  .search-help-pop b{display:block;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;
    color:var(--muted);margin-bottom:7px}
  .search-help-pop ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:6px}
  .search-help-pop li{display:flex;gap:8px;align-items:baseline}
  .search-help-pop code{flex:0 0 auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;
    font-weight:800;color:var(--brand-dark);background:var(--chip-bg);border-radius:5px;padding:1px 5px}
  .msglist{overflow-y:auto;flex:1 1 auto}
  .msg{padding:13px 16px;border-bottom:1px solid var(--divider);cursor:pointer;display:flex;gap:11px;transition:background .12s}
  .msg:hover{background:var(--tint-2)}
  .msg.active{background:var(--brand-soft)}
  .msg .dot{width:9px;height:9px;border-radius:50%;background:transparent;margin-top:6px;flex:0 0 auto}
  .msg.unread .dot{background:var(--brand-dark)}
  .msg .body{flex:1 1 auto;min-width:0}
  .msg .row1{display:flex;align-items:baseline;gap:8px}
  .msg .from{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}
  .msg.unread .from{font-weight:800}
  .msg .time{font-size:11.5px;color:var(--muted);flex:0 0 auto}
  .msg-tag{flex:0 0 auto;font-size:10.5px;font-weight:800;padding:2px 8px;border-radius:999px;white-space:nowrap}
  .msg .subj{font-size:13.5px;margin:2px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .msg.unread .subj{font-weight:700}
  .msg .snip{font-size:12.5px;color:var(--muted);margin:2px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .read{padding:0}
  .read .empty{margin:auto;text-align:center;color:var(--muted);padding:40px;max-width:320px}
  .read .empty svg{opacity:.5;margin-bottom:14px}
  .read .empty h3{margin:0 0 6px;font-size:16px;color:var(--text)}
  .read .empty p{margin:0;font-size:13.5px;line-height:1.5}
  .rd{display:flex;flex-direction:column;min-height:0;height:100%}
  .rd-head{padding:18px 22px 14px;border-bottom:1px solid var(--border);flex:0 0 auto}
  .rd-subj{font-size:19px;font-weight:700;margin:0 0 12px;line-height:1.3}
  .rd-meta{display:flex;align-items:center;gap:12px}
  .rd-av{width:42px;height:42px;border-radius:50%;background:var(--grad-btn);color:#fff;font-weight:700;
    font-size:16px;display:flex;align-items:center;justify-content:center;flex:0 0 auto}
  .rd-who{flex:1 1 auto;min-width:0}
  .rd-who .n{font-size:14.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .rd-who .e{font-size:12.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .rd-date{font-size:12.5px;color:var(--muted);flex:0 0 auto}
  .rd-actions{display:flex;gap:9px;padding:12px 22px;border-bottom:1px solid var(--border);flex:0 0 auto;flex-wrap:wrap}
  .act{border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:8px 14px;height:34px;font-size:13.5px;
    font-weight:600;color:var(--text);text-decoration:none;cursor:pointer;display:flex;align-items:center;gap:7px;transition:all .12s}
  .act:hover{border-color:var(--brand);background:var(--brand-soft);color:var(--brand-dark)}
  .act svg{width:16px;height:16px}
  .act.primary{background:var(--grad-btn);color:#fff;box-shadow:0 3px 8px -2px rgba(23,52,95,.3);transition:all .2s var(--ease-signature)}
  .act.primary:hover{color:#fff;box-shadow:0 5px 12px -3px rgba(23,52,95,.38);filter:brightness(1.06)}
  /* "Zuordnen" ist die zentrale Aktion dieser App (Mail → Ticket/Standort) -
     eigens hervorgehoben statt als gleichrangiger Button unter Markieren/
     Löschen unterzugehen. Rafael, 2026-09-20: "muss aktiver gehighlightet
     und prominenter platziert sein". */
  .act.assign{background:var(--ok);border-color:transparent;color:#fff;box-shadow:0 6px 14px rgba(37,150,110,.3);font-weight:700}
  .act.assign:hover{color:#fff;filter:brightness(1.06)}
  /* Löschen in der Mailansicht deutlich als Warnaktion kennzeichnen -
     Rafael, 2026-09-25: "den Mülleimer rot einfärben". */
  .act.danger{background:var(--danger);border-color:transparent;color:#fff;box-shadow:0 6px 14px rgba(228,87,46,.3);font-weight:700}
  .act.danger:hover{color:#fff;filter:brightness(1.06)}
  /* Antworten/Weiterleiten jetzt eine eigene, dezentere Zeile unterhalb der
     Quick-Move-Leisten statt oben gleichrangig neben Zuordnen/Löschen -
     Rafael, 2026-09-24: "Antworten und Weiterleiten vielleicht eher unten
     drunter wie oben drüber". Kleinere, blassere Buttons statt der
     Standard-.act-Optik. */
  /* rd-actions-sec jetzt nur noch für die Antworten/Weiterleiten-Leiste
     ganz unten (rd-replybar) - wie eine Chat-Eingabe unter dem Verlauf
     statt darüber. Rafael, 2026-09-25: "wie wenn es so ein Chat-Fenster
     mit Chat wäre". */
  .rd-actions-sec{padding-top:14px;padding-bottom:10px;border-bottom:none;border-top:1px solid var(--border)}
  .rd-actions-sec .act{height:30px;padding:6px 12px;font-size:12.5px;color:var(--muted)}
  .rd-actions-sec .act svg{width:14px;height:14px}
  /* EINE schmale, zentrale Leiste statt zwei getrennter Blöcke - links die
     Schnellverschieben-Chips (der "eigentliche Arbeitsteil"), rechts
     schmal gestapelt Löschen/Ticket zuordnen. Rafael, 2026-09-25: "die
     Aktionsbuttons ... vielleicht 80% der Arbeit und dann rechts daneben
     die zwei Buttons ... dann ist alles in einem Streifen schmal und
     zentral". */
  /* align-items:stretch statt flex-start - die Buttons-Spalte übernimmt so
     dieselbe Höhe wie die Team-/Kunden-Zeilen links und lässt sich per
     justify-content:space-between exakt auf beide Zeilen verteilen
     (Löschen oben ~Team-Zeile, Ticket zuordnen unten ~Kunden-Zeile).
     Rafael, 2026-09-25: "die vertikale Ausrichtung anpassen, Team und
     Kunde in sync bringen mit den Buttons links". */
  .rd-toprow{display:flex;gap:14px;align-items:stretch;padding:12px 22px;border-bottom:1px solid var(--border)}
  .rd-toprow-move{flex:1 1 78%;min-width:0;display:flex;flex-direction:column;justify-content:space-between}
  .rd-toprow-move .mv-quick{padding:0;border-bottom:none;flex:1 1 auto;justify-content:space-between}
  .mv-empty{font-size:12.5px;color:var(--muted);padding:6px 0}
  .rd-toprow-btns{flex:0 0 auto;width:180px;display:flex;flex-direction:column;justify-content:space-between;gap:8px}
  .rd-toprow-btns .act{width:100%;justify-content:center}
  /* Schnellverschieben nach Team/Kunde - Rafael, 2026-09-24: "per zwei
     Button-Leisten mit Usern und Kunden per Klick die Mails verschieben
     können ... dann sind die schon sortiert". Ersetzt die alte
     "Verschieben"-Dropdown-Liste. */
  .mv-quick{padding:2px 22px 12px;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:8px}
  .mv-row{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
  .mv-row-lbl{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);flex:0 0 auto}
  .mv-row-btns{display:flex;flex-wrap:wrap;gap:6px}
  .mv-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);background:var(--card);color:var(--text);
    padding:5px 11px;border-radius:999px;font-size:12.5px;font-weight:650;cursor:pointer;transition:.13s;white-space:nowrap}
  .mv-chip:hover{border-color:var(--brand);background:var(--brand-soft);color:var(--brand-dark)}
  .mv-chip .kdot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
  .rd-body{padding:20px 22px;overflow-y:auto;flex:1 1 auto;font-size:14.5px;line-height:1.62;white-space:pre-wrap;word-wrap:break-word}
  .rd-atts{padding:0 22px 20px;flex:0 0 auto}
  .rd-atts-lbl{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);margin-bottom:10px}
  .rd-atts-list{display:flex;flex-wrap:wrap;gap:10px}
  .rd-att{display:flex;flex-direction:column;align-items:center;gap:6px;width:100px;padding:10px 8px;border:1px solid var(--border);
    border-radius:var(--r-md);background:var(--card);text-align:center;color:inherit;text-decoration:none;transition:border-color .13s}
  .rd-att:hover{border-color:var(--brand)}
  .rd-att img{width:100%;height:56px;object-fit:cover;border-radius:var(--r-sm)}
  .rd-att-ico{width:40px;height:40px;border-radius:var(--r-md);background:var(--brand-soft);color:var(--brand-dark);display:flex;align-items:center;justify-content:center}
  .rd-att-ico svg{width:18px;height:18px}
  .rd-att-name{font-size:11.5px;font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .rd-att-size{font-size:10.5px;color:var(--muted)}
  .tkmenu{min-width:300px}
  .tksearch{padding:6px 8px 8px}
  .tksearch input{width:100%;padding:8px 10px;border:1px solid var(--border);border-radius:var(--r-sm);font-size:16px;color:var(--text)}
  .tksearch input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .tklist{max-height:260px;overflow-y:auto}
  .tkitem{padding:9px 12px;border-radius:var(--r-sm);cursor:pointer}
  .tkitem:hover{background:var(--brand-soft)}
  .tkitem .t1{font-size:13px;font-weight:700;color:var(--text)}
  .tkitem .t2{font-size:11.5px;color:var(--muted);margin-top:1px}
  .tkempty{padding:14px 12px;color:var(--muted);font-size:13px;text-align:center}
  .ticketbadge{display:inline-flex;align-items:center;gap:7px;margin-top:12px;background:var(--brand-soft);color:var(--brand-dark);
    border:1px solid var(--chip-border);border-radius:999px;padding:6px 13px;font-size:12.5px;font-weight:700;cursor:pointer}
  .ticketbadge svg{width:14px;height:14px}
  .ticketbadge .rmv{cursor:pointer;font-size:16px;line-height:1;opacity:.65;margin-left:2px}
  .ticketbadge .rmv:hover{opacity:1}
  .tb-status{display:inline-flex;align-items:center;font-size:10.5px;font-weight:800;letter-spacing:.2px;
    border-radius:999px;padding:2px 9px;margin-left:6px}
  .msg .tktag{display:inline-block;font-size:10.5px;font-weight:700;color:var(--brand-dark);background:var(--brand-soft);
    border-radius:var(--r-sm);padding:1px 7px;margin-top:5px}

  /* ============ Overlays ============ */
  .overlay{position:fixed;inset:0;background:rgba(20,45,60,.42);display:none;align-items:flex-end;justify-content:center;z-index:100}
  .overlay.open{display:flex}
  /* Glas-Optik wie .usermenu: schwebt über dem gedimmten .overlay-Scrim,
     90%-Deckkraft + Blur statt solidem var(--card) - der Scrim dahinter
     sorgt schon für genug Kontrast, Inhalt im Modal bleibt voll lesbar. */
  .modal{background:var(--glass-white-90);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
    border:1px solid var(--glass-white-55);width:100%;max-width:620px;border-radius:var(--r-lg) var(--r-lg) 0 0;box-shadow:var(--shadow-float);
    display:flex;flex-direction:column;max-height:92vh;animation:slideup .22s ease}
  @keyframes slideup{from{transform:translateY(24px);opacity:.6}to{transform:translateY(0);opacity:1}}
  /* Zentrierte Variante (z.B. confirmDialog() in core/util.js) - Dialog
     schwebt mittig statt als Bottom-Sheet von unten reinzurutschen. */
  .overlay.center{align-items:center;padding:20px}
  .overlay.center .modal{border-radius:var(--r-lg);box-shadow:var(--shadow-card-raised);animation:popin .16s ease}
  /* Mail-Klassifizierung: größeres, mittiges Popup statt des schmalen
     Bottom-Sheets - Rafael, 2026-09-26: "ein größeres, mittiges Popup mit
     einer gescheiten Suche nach Tickets", 2026-09-29 nochmal vergrößert
     ("damit ich alles gut sehe und finden kann") und die Standort-Auswahl
     ganz raus - nur noch Ticket zuordnen oder "+ Neues Ticket anlegen". */
  .ma-modal{max-width:760px;width:100%}
  .ma-modal .modal-body{min-height:420px}
  .ma-modal .st-pick-menu{max-height:400px}
  /* Dokument-Vorschau-Popup (z. B. Angebot/Kostenvoranschlag in der
     Rechnungsprüfung) - Rafael, 2026-09-26: "die Vorschau als Popup
     machen" statt neuem Tab. Breiter als normale Popups, damit ein PDF
     lesbar bleibt. */
  .doc-preview-modal{max-width:1200px;width:94vw}
  /* Handwerker-Zuweisen-Dialog (großer Umbau, Rafael 2026-09-27) - gleiche
     Breite wie die Dokument-Vorschau, aber eigener Name, weil hier nichts
     mit Dokumenten zu tun hat. */
  .hw-modal{max-width:820px;width:100%}
  /* Klassifizierungs-Liste bei Mehrfach-Upload (askDocumentTags) - Rafael,
     2026-09-26: "wenn ich mehrere Dokumente hochlade, bitte alle in einem
     Popup als Liste anzeigen zum Zuordnen". */
  .doctags-list{list-style:none;margin:0;padding:0;max-height:60vh;overflow-y:auto}
  .doctags-row{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--border)}
  .doctags-row:last-child{border-bottom:none}
  .doctags-name{flex:1;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
  .doctags-row select{flex:0 0 auto;width:150px;height:34px;border:1px solid var(--border);
    background:var(--card) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%236A7E8A" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>') no-repeat right 10px center/14px 14px;
    border-radius:var(--r-md);padding:0 30px 0 12px;font-size:13.5px;font-weight:650;color:var(--text);cursor:pointer;
    -webkit-appearance:none;appearance:none}
  .doctags-row select:hover{border-color:var(--brand)}
  .doctags-row select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .doctags-row .act[disabled]{opacity:.35;cursor:not-allowed}
  @keyframes popin{from{transform:scale(.96);opacity:0}to{transform:scale(1);opacity:1}}
  .modal-head{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border)}
  .modal-head h2{margin:0;font-size:17px;font-weight:700;text-transform:none;letter-spacing:0;color:var(--text)}
  .modal-head .x{margin-left:auto;background:none;border:none;font-size:24px;line-height:1;color:var(--muted);cursor:pointer;padding:0 4px}
  .modal-body{padding:16px 20px;overflow-y:auto}
  .fld{margin-bottom:14px}
  .fld label{display:block;font-size:13px;font-weight:600;margin-bottom:6px;color:var(--muted)}
  .fld input,.fld textarea{width:100%;padding:12px 13px;border:1px solid var(--border);border-radius:var(--r-md);
    font-size:16px;color:var(--text);background:var(--card)}
  .fld input:focus,.fld textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .fld textarea{resize:vertical;min-height:150px;line-height:1.55}
  /* Einfacher Rich-Text-Editor (Signatur/Mailtext), siehe core/richtext.js -
     Toolbar + contenteditable-Feld im selben Rahmen wie ein normales
     Textfeld (.fld input/textarea), damit es optisch nicht auffällt. */
  .rte{border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;background:var(--card)}
  .rte:focus-within{border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .rte-tools{display:flex;gap:2px;padding:6px;border-bottom:1px solid var(--border);background:var(--surface-soft)}
  .rte-tools button{width:30px;height:30px;border:none;background:none;border-radius:var(--r-sm);font-size:13px;color:var(--text);cursor:pointer;display:flex;align-items:center;justify-content:center}
  .rte-tools button:hover{background:#E7F0FA}
  .rte-body{min-height:150px;max-height:340px;overflow-y:auto;padding:12px 13px;font-size:14.5px;line-height:1.55;color:var(--text)}
  .rte-body:focus{outline:none}
  .rte-body:empty:before{content:attr(placeholder);color:var(--muted);white-space:pre-line}
  .rte-body img{max-width:100%}
  /* Signatur-Editor: Text/HTML-Umschalter + 50/50-Split mit Live-Vorschau
     (siehe renderSignaturen(), settings.js). Rafael, 2026-09-26: "einen
     Switch Text und HTML ... 50/50 links der Editor und rechts die
     Vorschau, egal ob HTML oder Text". */
  .sig-modebar{display:flex;gap:6px;margin-bottom:10px}
  .sig-mode-btn{border:1px solid var(--border);background:var(--card);color:var(--muted);border-radius:var(--r-sm);
    padding:6px 14px;font-size:12.5px;font-weight:800;letter-spacing:.2px;cursor:pointer;transition:all .12s}
  .sig-mode-btn:hover{border-color:var(--brand);color:var(--brand-dark)}
  .sig-mode-btn.on{background:var(--brand);border-color:var(--brand);color:#fff}
  .sig-split{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
  .sig-htmlta{width:100%;min-height:150px;max-height:340px;padding:12px 13px;border:1px solid var(--border);
    border-radius:var(--r-md);background:var(--card);color:var(--text);font:12.5px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical}
  .sig-htmlta:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .sig-previewlbl{font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin-bottom:6px}
  .sig-preview{border:1px solid var(--divider);border-radius:var(--r-md);padding:12px 13px;min-height:150px;max-height:340px;
    overflow-y:auto;font-size:14.5px;line-height:1.55;color:var(--text);background:var(--tint)}
  .sig-preview img{max-width:100%}
  @media (max-width:720px){ .sig-split{grid-template-columns:1fr} }
  .modal-foot{padding:14px 20px;border-top:1px solid var(--border);display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap}
  /* confirmDialog() (core/util.js) mit mehr als 2 Buttons: immer in einer
     Reihe, gleich breit, statt umzubrechen - Buttons schrumpfen dafür
     etwas kompakter (Text bleibt einzeilig, kein Ellipsis nötig). */
  .cf-foot{flex-wrap:nowrap}
  .cf-foot button{flex:1 1 0;min-width:0;padding:11px 8px;font-size:12.8px;justify-content:center;white-space:nowrap}
  .btn-ghost{border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:12px 18px;font-size:14.5px;font-weight:600;color:var(--text);cursor:pointer}
  .btn-ghost:hover{border-color:var(--brand)}
  .btn-send{border:none;background:var(--grad-btn);color:#fff;border-radius:var(--r-md);padding:12px 22px;font-size:14.5px;font-weight:700;
    cursor:pointer;box-shadow:0 10px 22px rgba(23,52,95,.32);display:flex;align-items:center;gap:8px}
  .btn-send:disabled{opacity:.6;cursor:not-allowed}
  .toast{position:fixed;bottom:22px;left:50%;transform:translateX(-50%) translateY(30px);background:var(--brand-dark);color:#fff;
    padding:13px 22px;border-radius:var(--r-md);font-size:14px;font-weight:600;box-shadow:0 12px 30px rgba(23,52,95,.3);
    opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:200;display:flex;align-items:center;gap:9px}
  .toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
  .toast.err{background:var(--danger-soft-text)}
  .toast.ok{background:var(--ok)}
  .backbtn{display:none}
  .mfolders{display:none}
  .fab{display:none}
  .scrim{display:none}


  /* ============ Standorte-Modul ============ */
  .st-tabs{display:inline-flex;gap:4px;background:var(--chip-bg);border:1px solid var(--border);border-radius:var(--r-md);padding:4px;margin:0 0 16px}
  .st-tab{display:inline-flex;align-items:center;gap:8px;border:none;background:none;border-radius:var(--r-md);padding:9px 16px;
    font-size:13.5px;font-weight:700;color:var(--muted);cursor:pointer;transition:all .13s}
  .st-tab .sti{width:16px;height:16px;display:flex}.st-tab .sti svg{width:100%;height:100%}
  .st-tab:hover{color:var(--brand-dark)}
  .st-tab.on{background:var(--card);color:var(--brand-dark);box-shadow:0 4px 12px rgba(23,52,95,.10)}

  .st-toolbar{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:16px}
  /* Sammel-Bearbeiten (Standorte-Liste) - Checkbox-Spalte + Auswahl-Leiste. */
  .st-selth,.st-seltd{width:36px;text-align:center}
  /* Kennung/Name/Ansprechpartner: Doppelklick editiert direkt in der Liste
     (siehe drawTable() in sites.js) - dezenter Hover-Hinweis, damit klar
     wird, dass hier mehr geht als nur "öffnen". */
  .st-inline{display:inline-block;border-radius:var(--r-sm);padding:2px 5px;margin:-2px -5px}
  .st-inline:hover{background:var(--tint)}
  .st-bulkbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;background:var(--brand-soft);
    border:1px solid var(--border);border-radius:var(--r-md);padding:10px 16px;margin:-4px 0 14px;width:100%}
  .st-bulkbar b{font-size:13.5px;color:var(--brand-dark)}
  .st-colslbl{font-size:12px;color:var(--muted);font-weight:650;white-space:nowrap}
  .kchips{display:flex;gap:8px;flex-wrap:wrap;flex:1 1 auto}
  .kchip{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);background:var(--card);color:var(--text);
    padding:7px 13px;border-radius:999px;font-size:13px;font-weight:700;cursor:pointer;transition:.13s;white-space:nowrap}
  .kchip:hover{border-color:var(--brand)}
  .kchip.on{background:var(--rail);border-color:var(--rail);color:#fff}
  .kdot{width:10px;height:10px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 0 2px rgba(255,255,255,.6) inset}
  .kchip .kn{opacity:.65;font-weight:600;margin-left:2px}
  .st-search{flex:0 1 300px;min-width:190px}
  .st-findermeta{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:-4px 0 14px;color:var(--muted)}
  .st-findermeta b{font-size:13px;color:var(--text)}
  .st-findermeta span{font-size:12.5px}

  .vf-list{display:flex;flex-direction:column;gap:10px}
  .vf-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;align-items:center;padding:14px 15px;background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow)}
  .vf-main{display:flex;flex-direction:column;align-items:flex-start;gap:7px;text-align:left;border:none;background:none;padding:0;cursor:pointer;color:inherit;min-width:0}
  .vf-main b{font-size:15px;font-weight:800;line-height:1.25}
  .vf-main span{font-size:12.5px;color:var(--muted);line-height:1.45}
  .vf-badge{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;font-weight:800;padding:4px 10px;border-radius:999px;letter-spacing:.2px}
  .vf-sub{font-size:11px !important;letter-spacing:.4px;text-transform:uppercase}
  .vf-side{display:flex;align-items:flex-end;justify-content:flex-end;flex-direction:column;gap:10px}
  .vf-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}
  .vf-actions .st-act{min-width:112px}
  .vf-row.on{border-color:var(--brand);box-shadow:0 12px 28px rgba(148,199,249,.16);background:var(--tint-2)}
  .multi-row{grid-template-columns:auto minmax(0,1fr) auto;cursor:pointer}
  .multi-row input[type="checkbox"]{width:18px;height:18px;flex:0 0 auto;cursor:pointer}

  /* Handwerker-Bewertung: 0-5 Sterne, optional – wird per Klick gesetzt. */
  .hw-stars{display:inline-flex;gap:1px;align-items:center}
  .hw-stars .hs{border:none;background:none;padding:1px;font-size:16px;line-height:1;color:var(--border);cursor:pointer}
  .hw-stars .hs.on{color:#F0A62B}
  .hw-stars .hs:hover{transform:scale(1.12)}

  .hw-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;align-items:start}
  .hw-form,.hw-side{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:18px}
  .hw-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px;margin-top:12px}
  .hw-grid label{display:flex;flex-direction:column;gap:5px;font-size:12px;font-weight:700;color:var(--muted)}
  .hw-grid input,.hw-grid select,.hw-grid textarea{width:100%;padding:9px 10px;border:1px solid var(--border);border-radius:var(--r-md);font-size:16px;color:var(--text);background:var(--card)}
  .hw-grid textarea{min-height:88px;resize:vertical}
  .hw-grid input:focus,.hw-grid select:focus,.hw-grid textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .hw-wide{grid-column:1 / -1}
  .hw-block{margin-top:14px}
  .hw-select{width:100%;padding:10px 38px 10px 13px;border:1px solid var(--border);border-radius:var(--r-md);font-size:16px;
    color:var(--text);background:var(--card);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236A7E8A' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-repeat:no-repeat;background-position:right 12px center;background-size:16px}
  .hw-select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .hw-select:hover{border-color:var(--brand)}
  .hw-hint{font-size:12px;color:var(--muted);margin-top:8px;line-height:1.5}
  .hw-foot{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px;border-top:1px solid var(--divider);padding-top:14px}
  .hw-context{display:flex;flex-direction:column;gap:4px;padding:12px 13px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface-soft)}
  .hw-context b{font-size:14px}
  .hw-context span{font-size:12.5px;color:var(--muted)}
  .sd-hw{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
  .sd-hw li{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;border:1px solid var(--border);border-radius:var(--r-md);background:var(--card);padding:11px 12px}
  .sd-hw b{display:block;font-size:13.5px;font-weight:800}
  .sd-hw span{display:block;font-size:12px;color:var(--muted);margin-top:2px}
  .sd-hw .hwavail{font-size:11.5px;font-weight:800;color:var(--brand-dark);margin-top:6px;text-align:right}

  .st-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:15px}
  .st-card{display:flex;flex-direction:column;text-align:left;padding:0;overflow:hidden;background:var(--card);
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow);transition:transform .25s var(--ease-signature),box-shadow .25s var(--ease-signature);color:inherit}
  .st-card:hover{transform:translateY(-3px);box-shadow:0 20px 46px rgba(23,52,95,.13)}
  .st-open{display:flex;flex-direction:column;text-align:left;padding:0;border:none;background:none;cursor:pointer;font:inherit;color:inherit;width:100%;flex:1 1 auto}
  .st-actions{display:flex;flex-wrap:wrap;gap:8px;padding:10px 12px 12px;margin-top:auto}
  .st-act{flex:1 1 84px;min-width:84px;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:9px 8px;border-radius:var(--r-md);
    font-size:12.5px;font-weight:700;white-space:nowrap;cursor:pointer;text-decoration:none;border:1px solid var(--border);background:var(--card);color:var(--brand-dark);transition:background .12s,border-color .12s}
  .st-act:hover{background:var(--tint);border-color:var(--brand)}
  .st-act.mail{background:var(--brand);border-color:var(--brand);color:#fff}
  .st-act.mail:hover{filter:brightness(1.05)}
  .st-act.off{opacity:.5;cursor:default;pointer-events:none}
  .sd-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:13px}
  .btn-call,.btn-mail{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border-radius:var(--r-md);
    font-size:13.5px;font-weight:700;cursor:pointer;text-decoration:none;border:1px solid var(--border)}
  .btn-call svg,.btn-mail svg{width:15px;height:15px;flex:0 0 auto}
  .btn-call{background:var(--card);color:var(--brand-dark)}
  .btn-call:hover{background:var(--tint);border-color:var(--brand)}
  .btn-mail{background:var(--brand);border-color:var(--brand);color:#fff}
  .btn-mail:hover{filter:brightness(1.05)}
  /* "Kontaktieren"/"⋯" in der Handwerkerakte (dienstleister.js) sitzen in
     derselben .sd-actions-Zeile wie "Bearbeiten" (.btn-mail) - ohne das
     hier behält .fielddd-btn seine eigene, kleinere Formular-Optik
     (gedacht fürs Ticket-Status-Dropdown) und wirkt neben den anderen
     beiden wie aus einem anderen Baukasten. Rafael, 2026-09-24: "optisch
     ganz wild, bitte passende Buttons machen wie sonst auch überall" -
     gleiche Höhe/Radius/Schrift wie .btn-call/.btn-mail, gleiches Muster
     wie ".dhead-fields .fielddd-btn{width:auto}" für den Ticketkopf. */
  .sd-actions .fielddd-btn{width:auto;height:auto;padding:10px 16px;border-radius:var(--r-md);font-size:13.5px;font-weight:700;gap:8px}
  .sd-actions .fielddd-btn[data-ddbtn="dlmore"]{padding:10px;width:42px;justify-content:center}
  .attach-row{display:flex;flex-wrap:wrap;gap:7px}
  .attach-chip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;padding:6px 8px 6px 12px;
    border-radius:999px;border:1px solid var(--border);background:var(--tint);color:var(--brand-dark)}
  .attach-chip button{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;border-radius:50%;
    background:transparent;color:var(--muted);cursor:pointer;font-size:15px;line-height:1;padding:0}
  .attach-chip button:hover{background:var(--danger-soft);color:var(--danger-soft-text)}
  /* "Vom Gerät"/"Aus Dokumenten" - manuell Anhänge zum Compose-Fenster
     hinzufügen (Rafael, 2026-09-20: "über einen schönen Button ... Anhang
     aus der System-Bibliothek oder Upload vom Gerät"). Gleiche Pillenform
     wie die Anhang-Chips, aber gestrichelter Rand + Plus-artige Optik,
     damit sie klar als "hinzufügen" statt als bestehender Anhang lesbar
     sind. */
  .attach-add{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;padding:6px 12px;
    border-radius:999px;border:1px dashed var(--border);background:none;color:var(--brand-dark);cursor:pointer;transition:all .12s}
  .attach-add:hover{border-color:var(--brand);background:var(--brand-soft)}
  .attach-add svg{width:14px;height:14px}
  .tplrow{display:flex;flex-wrap:wrap;gap:7px}
  .tpl{font-size:12.5px;font-weight:700;padding:7px 12px;border-radius:999px;border:1px solid var(--border);
    background:var(--card);color:var(--brand-dark);cursor:pointer;transition:background .12s,border-color .12s}
  .tpl:hover{background:var(--tint);border-color:var(--brand)}
  .tpl.on{background:var(--brand);border-color:var(--brand);color:#fff}
  .st-thumb{position:relative;display:block;height:132px;background:var(--thumb-bg)}
  .st-thumb img{width:100%;height:100%;object-fit:cover;display:block}
  .st-knum{position:absolute;top:10px;left:10px;background:rgba(20,45,60,.78);color:#fff;font-size:11.5px;
    padding:3px 9px;border-radius:999px;letter-spacing:.4px}
  .st-cbody{display:flex;flex-direction:column;gap:7px;padding:14px 15px 16px}
  .st-kbadge{display:inline-flex;align-items:center;gap:7px;align-self:flex-start;font-size:11.5px;font-weight:800;
    padding:4px 10px;border-radius:999px;letter-spacing:.2px}
  .kbadge-logo{width:16px;height:16px;border-radius:4px;object-fit:contain;background:var(--card);flex:0 0 auto}
  .st-name{font-size:15px;font-weight:750;line-height:1.32}
  .st-addr{font-size:12.5px;color:var(--muted);line-height:1.5}
  .st-tk{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:var(--warn);margin-top:2px}
  .st-tk svg{width:14px;height:14px}
  .st-tk.none{color:var(--muted);font-weight:600}

  /* Kunden-Logo-Upload im Bearbeiten-Dialog */
  .kimg-pick{display:flex;align-items:center;gap:14px}
  .kimg-prev{width:64px;height:64px;border-radius:var(--r-md);object-fit:cover;background:var(--thumb-bg);border:1px solid var(--border);flex:0 0 auto}
  .kimg-prev.empty{display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--muted);text-align:center;padding:4px}

  /* Kunden-Dokumente (Merkblätter etc.) im Bearbeiten-Dialog, siehe
     _wireKundeDocs() - v. a. für den Mailvorlagen-Anhang "Vom Kunden des
     Standorts" (settings.js). */
  .ent-doclist{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}
  .ent-doc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 11px;
    background:var(--tint);border-radius:var(--r-sm);font-size:13px}

  /* Kunden */
  .kunde-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:16px}
  .kunde-card{background:var(--card-glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);overflow:hidden;display:flex;flex-direction:column}
  .kunde-top{display:flex;align-items:center;gap:13px;padding:17px 18px;color:#fff}
  .kunde-mark{width:44px;height:44px;border-radius:var(--r-md);background:rgba(255,255,255,.22);display:flex;align-items:center;
    justify-content:center;font-size:20px;font-weight:800;flex:0 0 auto;overflow:hidden}
  /* Weißer Rahmen ums Logo (Rafael, 2026-09-20: "da Farbe des Kunden auch
     aus Logo abgeleitet und somit gleich wie Icon im Normalfall") - ohne
     den geht das Logo optisch im Farbverlauf unter, wenn die Kartenfarbe
     (meist aus dem Logo abgeleitet) der Logo-eigenen Farbe sehr ähnlich
     ist. */
  .kunde-mark.img{background:var(--card);padding:0;border:2.5px solid #fff;box-shadow:0 2px 8px rgba(0,0,0,.18)}
  .kunde-mark.img img{width:100%;height:100%;object-fit:contain}
  .kunde-h{flex:1 1 auto;min-width:0;line-height:1.25}
  .kunde-h b{display:block;font-size:17px;font-weight:800}
  .kunde-h span{display:block;font-size:12px;opacity:.9}
  .kunde-cnt{flex:0 0 auto;font-size:11.5px;font-weight:800;background:rgba(255,255,255,.24);padding:5px 10px;border-radius:999px}
  /* Stift-Button auf dem Farbverlauf - hatte bisher GAR KEIN eigenes CSS
     und rendert dadurch als reiner Browser-Standard-Button (grauer Kasten)
     mitten auf der Kundenkarte. Rafael, 2026-09-20: "das ist ja übel
     aktuell". Gleiche Bildsprache wie andere Icon-Buttons auf dunklem/
     farbigem Grund in der App (siehe .notif-bell) - dezent, halbtrans-
     parent, erst beim Hovern auffällig. */
  .ent-edit-btn{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:30px;height:30px;
    border:none;background:rgba(255,255,255,.22);border-radius:var(--r-sm);color:#fff;cursor:pointer;transition:background .12s}
  .ent-edit-btn:hover{background:rgba(255,255,255,.36)}
  .ent-edit-btn svg{width:15px;height:15px}
  .kunde-body{padding:16px 18px 18px}
  .kfacts{margin:0}
  .kfacts>div{display:flex;gap:14px;padding:8px 0;border-bottom:1px solid var(--divider);font-size:13px}
  .kfacts>div:first-child{padding-top:0}
  .kfacts dt{flex:0 0 118px;color:var(--muted);margin:0}
  .kfacts dd{flex:1 1 auto;margin:0;font-weight:600;word-break:break-word}
  .khints{margin-top:14px}
  .khl,.sdl{font-size:11px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:var(--brand-dark);margin-bottom:9px}
  .khints ul{list-style:none;margin:0;padding:0}
  .khints li{position:relative;padding:6px 0 6px 20px;font-size:13px;color:var(--text);line-height:1.5}
  .khints li::before{content:"";position:absolute;left:2px;top:12px;width:7px;height:7px;border-radius:2px;background:var(--brand)}
  .kcolorrow{display:flex;align-items:center;gap:11px;flex-wrap:wrap;border-top:1px solid var(--divider);margin-top:14px;padding-top:14px}
  .kcolorrow label{font-size:12.5px;font-weight:700;color:var(--muted)}
  .kcolor{width:40px;height:30px;padding:0;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--card);cursor:pointer}
  /* War früher ein reiner, nicht editierbarer <span> - jetzt ein echtes
     Textfeld zur Hex-Eingabe (Rafael, 2026-09-20: "auch Hex-Wert
     eintragbar machen"), gleiche Optik wie die übrigen kleinen
     Inline-Eingaben in der App. */
  .kcolorhex{width:92px;height:30px;box-sizing:border-box;padding:0 9px;border:1px solid var(--border);border-radius:var(--r-sm);
    background:var(--card);font-family:ui-monospace,Menlo,monospace;font-size:12.5px;font-weight:700;color:var(--text);
    text-transform:uppercase}
  .kcolorhex:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .kgo{margin-left:auto;padding:8px 13px;font-size:13px}

  /* Karte */
  .map-shell{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap}
  .map-shell.finder-map{align-items:stretch}
  /* Rafael, 2026-09-27: "wenn ich den Zoom auf 80% einstelle, soll die Map
     auch wieder fullscreen werden" - die feste max-width:640px hat die
     Karte klein gehalten, egal wie viel Platz der Bildschirm/Zoom sonst
     hergibt. Etwas großzügiger + flex-grow statt fixem Cap, damit sie den
     verfügbaren Platz besser ausnutzt (Legende bleibt separat schmal
     begrenzt) - max-width:1400px/flex:5 (2026-09-27, erster Versuch) war
     danach zu groß ("viel zu groß"), auf 820px/flex:2 zurückgenommen. */
  .map-stage{position:relative;width:100%;max-width:820px;margin:0 auto;flex:2 1 420px;overflow:hidden}
  .map-svg{width:100%;height:auto;display:block;filter:drop-shadow(0 12px 30px rgba(23,52,95,.10))}
  .map-svg-zoom{transform:scale(var(--map-zoom,1));transform-origin:50% 46%;transition:transform .18s ease}
  /* Zoom +/−/Reset über der Karte - Rafael, 2026-09-27: "kannst du einen
     Zoom Knopf noch machen". */
  .map-zoomctl{position:absolute;top:10px;right:10px;display:flex;align-items:center;gap:2px;
    background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow);padding:3px;z-index:4}
  .map-zoomctl button{border:none;background:none;color:var(--text);font-size:15px;font-weight:700;
    width:28px;height:28px;border-radius:var(--r-sm);cursor:pointer;display:flex;align-items:center;justify-content:center}
  .map-zoomctl button:hover{background:var(--tint)}
  .map-zoomctl button:disabled{opacity:.35;cursor:default}
  .map-zoomctl button:disabled:hover{background:none}
  .map-zoomctl .mz-pct{font-size:11px;font-weight:800;width:auto;min-width:40px;color:var(--muted);font-variant-numeric:tabular-nums}
  .map-svg .cty{fill:var(--thumb-bg);stroke:#9EC3DA;stroke-width:1.4;stroke-linejoin:round}
  .map-city{pointer-events:none}
  .map-city circle{fill:var(--muted)}
  .map-city text{fill:var(--muted);font-size:11px;font-weight:600;dominant-baseline:middle}
  .map-dot{cursor:pointer}
  .map-dot .core{transition:transform .1s}
  .map-dot:hover .core{transform:scale(1.25);transform-box:fill-box;transform-origin:center}
  .map-dot.active .core{transform:scale(1.35);transform-box:fill-box;transform-origin:center;stroke:var(--brand-dark)}
  .map-dot.dim{opacity:.13;pointer-events:none}
  /* Gestrichelter Umkreis-Radius-Ring im Dienstleisterfinder (dlfRenderMap(),
     js/modules/dienstleisterfinder.js) - zeigt den eingestellten Radius um
     den gewählten Standort, ohne Füllung, unter den Punkten. Rafael,
     2026-09-29. */
  .dlf-radius-ring{fill:none;stroke:var(--brand-dark);stroke-width:1.6;stroke-dasharray:7 6;opacity:.55;pointer-events:none}
  .map-side{flex:1 1 380px;min-width:320px;display:flex;flex-direction:column;gap:14px;padding:16px 18px 18px}
  .st-maptools{margin-bottom:0;align-items:flex-start}
  .st-maptools .sfield{min-width:0;flex:1 1 160px}
  .map-zoom{display:flex;align-items:center;gap:8px;flex:0 0 auto}
  .map-zoom .btn{padding:8px 12px;min-width:40px;justify-content:center}
  .finder-sites,.finder-hws{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow:auto;padding-right:2px}
  .finder-sites::-webkit-scrollbar,.finder-hws::-webkit-scrollbar{width:6px}
  .finder-sites::-webkit-scrollbar-thumb,.finder-hws::-webkit-scrollbar-thumb{background:rgba(91,155,224,.22);border-radius:3px}
  .finder-site{display:flex;align-items:center;gap:10px;width:100%;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:10px 11px;cursor:pointer;text-align:left;transition:all .13s}
  .finder-site:hover{border-color:var(--brand);box-shadow:0 8px 18px rgba(23,52,95,.06)}
  .finder-site.on{border-color:var(--brand-dark);box-shadow:0 10px 20px rgba(23,52,95,.16)}
  .finder-site .fs-main{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
  .finder-site .fs-main b{font-size:13.5px;font-weight:750;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .finder-site .fs-main span,.finder-site .fs-cnt{font-size:11.5px;color:var(--muted)}
  .finder-site .fs-cnt{white-space:nowrap;max-width:140px;overflow:hidden;text-overflow:ellipsis;text-align:right}
  .finder-site .kdot{flex:0 0 auto}
  .finder-hws .vf-row{margin:0}
  .finder-hws .vf-list{gap:8px}
  .map-flag{position:absolute;transform:translate(-50%,-118%);background:var(--card);border:1px solid var(--border);
    border-radius:var(--r-md);box-shadow:0 14px 34px rgba(23,52,95,.22);padding:9px 12px;min-width:172px;max-width:240px;
    opacity:0;pointer-events:none;transition:opacity .12s;z-index:5}
  .map-flag.on{opacity:1}
  .map-flag::after{content:"";position:absolute;left:50%;bottom:-7px;transform:translateX(-50%);
    border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid var(--card)}
  .map-flag .mf-k{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px}
  .map-flag b{display:block;font-size:13.5px;font-weight:750;margin:3px 0 2px;line-height:1.3}
  .map-flag .mf-sub{font-size:11.5px;color:var(--muted)}
  .map-legend{flex:0 1 190px;min-width:170px;max-width:220px;background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);
    box-shadow:var(--shadow);padding:13px 13px 15px}
  .map-legend .mlh{font-size:10px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:var(--brand-dark);margin-bottom:8px}
  .mleg{display:flex;align-items:center;gap:8px;width:100%;border:none;background:none;padding:7px 6px;border-radius:var(--r-sm);
    font-size:12.5px;font-weight:650;color:var(--text);cursor:pointer;text-align:left;transition:background .12s}
  .mleg:hover{background:var(--brand-soft)}
  .mleg.off{opacity:.42}
  .mleg .mln{margin-left:auto;font-size:11px;font-weight:800;color:var(--muted);font-variant-numeric:tabular-nums}
  .mhint{font-size:10.5px;color:var(--muted);line-height:1.45;margin-top:10px;border-top:1px solid var(--divider);padding-top:10px}
  .map-top{margin-top:14px;padding-top:12px;border-top:1px solid var(--divider)}
  .map-top .mlh{margin-bottom:8px}
  .map-top-row{display:flex;align-items:center;gap:8px;width:100%;padding:7px 6px;border-radius:var(--r-sm);
    text-decoration:none;color:var(--text);font-size:12.5px}
  .map-top-row:hover{background:var(--brand-soft)}
  .map-top-row b{flex:none;min-width:16px;text-align:right;color:var(--danger);font-variant-numeric:tabular-nums}
  .map-top-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

  /* Standort-Detail */
  .backbtn2{display:inline-flex;align-items:center;gap:6px;background:none;border:none;color:var(--brand-dark);
    font-size:14px;font-weight:700;cursor:pointer;padding:2px 2px 14px}
  .backbtn2 svg{width:17px;height:17px}
  .st-detail .sd-head{margin-bottom:16px}
  .sd-name{font-size:22px;font-weight:750;margin:10px 0 5px;text-transform:none;letter-spacing:0;color:var(--text)}
  .sd-sub{font-size:13px;color:var(--muted)}
  .sd-gal{display:grid;grid-template-columns:repeat(3,1fr);gap:11px;margin-bottom:18px}
  .sd-thumb{padding:0;border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;cursor:zoom-in;background:var(--thumb-bg);
    aspect-ratio:16/10;transition:transform .1s,border-color .13s}
  .sd-thumb:hover{border-color:var(--brand);transform:translateY(-2px)}
  .sd-thumb img{width:100%;height:100%;object-fit:cover;display:block}
  .sd-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:9px 24px;
    border-top:1px solid var(--divider);border-bottom:1px solid var(--divider);padding:15px 0;margin-bottom:16px}
  .fct{display:flex;justify-content:space-between;gap:14px;font-size:13.5px}
  .fct span{color:var(--muted);flex:0 0 auto}
  .fct b{font-weight:650;text-align:right;word-break:break-word}
  .sd-block{margin-top:16px}
  .chiprow{display:flex;flex-wrap:wrap;gap:8px}
  .achip{font-size:12.5px;font-weight:650;color:var(--brand-dark);background:var(--brand-soft);border:1px solid var(--chip-border);
    border-radius:999px;padding:6px 12px}
  .sdp{margin:0;font-size:14px;line-height:1.6;color:var(--text)}
  .sd-tickets{list-style:none;margin:0;padding:0}
  .sd-tickets li{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--divider);cursor:pointer}
  .sd-tickets li:last-child{border-bottom:none}
  .sd-tickets li:hover{background:var(--surface-soft)}
  .sd-tickets .dbar{width:3px;height:30px;border-radius:2px;flex:0 0 auto}
  .sd-tickets .dt{flex:1 1 auto;min-width:0}
  .sd-tickets .dt b{display:block;font-weight:650;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .sd-tickets .dt span{font-size:12px;color:var(--muted)}
  .sd-tickets .dempty{cursor:default;color:var(--muted);font-size:13.5px;padding:14px 0}
  .sd-tickets .dempty:hover{background:none}
  @media(max-width:640px){
    .st-tabs{display:flex;width:100%}.st-tab{flex:1 1 0;justify-content:center;padding:9px 8px}
    .map-shell{flex-direction:column}.sd-gal{grid-template-columns:1fr 1fr}
  }

  /* ============ Dunkelmodus: Einzelfall-Korrekturen ============
     Ein paar Stellen im Stylesheet nutzen sehr spezielle Ein-Zweck-Farben
     (Workflow-Graph, Karte, Rechnungsprüfung, deaktivierte Buttons) - dafür
     lohnt sich kein eigenes globales Token, sie werden hier gezielt für
     das dunkle Theme umdefiniert statt an Ort und Stelle. */
  @media(prefers-color-scheme:dark){
    :root:not([data-theme="light"]) .fbranch.end{background:rgba(52,201,139,.08)}
    :root:not([data-theme="light"]) .fgro-line{stroke:#3A5478}
    :root:not([data-theme="light"]) .fgro-node.end{background:var(--surface-soft);border-color:var(--border);color:var(--muted)}
    :root:not([data-theme="light"]) .bt-ok:disabled{background:var(--border);color:var(--muted)}
    :root:not([data-theme="light"]) .inv-st.ap1{color:#8FBEDB}
    :root:not([data-theme="light"]) .inv-tl li.open .dot{color:#8FBEDB}
    :root:not([data-theme="light"]) .map-svg .cty{stroke:#3A5478}
    :root:not([data-theme="light"]) .umi .umu-dot{box-shadow:0 0 0 1px var(--card)}
    :root:not([data-theme="light"]) .kbadge-logo,
    :root:not([data-theme="light"]) .kimg-prev,
    :root:not([data-theme="light"]) .st-thumb,
    :root:not([data-theme="light"]) .kunde-mark.img{background:var(--thumb-bg)}
  }
  :root[data-theme="dark"] .fbranch.end{background:rgba(52,201,139,.08)}
  :root[data-theme="dark"] .fgro-line{stroke:#3A5478}
  :root[data-theme="dark"] .fgro-node.end{background:var(--surface-soft);border-color:var(--border);color:var(--muted)}
  :root[data-theme="dark"] .bt-ok:disabled{background:var(--border);color:var(--muted)}
  :root[data-theme="dark"] .inv-st.ap1{color:#8FBEDB}
  :root[data-theme="dark"] .inv-tl li.open .dot{color:#8FBEDB}
  :root[data-theme="dark"] .map-svg .cty{stroke:#3A5478}
  :root[data-theme="dark"] .umi .umu-dot{box-shadow:0 0 0 1px var(--card)}
  :root[data-theme="dark"] .kbadge-logo,:root[data-theme="dark"] .kimg-prev,:root[data-theme="dark"] .st-thumb,:root[data-theme="dark"] .kunde-mark.img{background:var(--thumb-bg)}

  /* ============ Responsive ============ */
  @media(max-width:1320px){
    :root{--rail-w:var(--rail-w-min)}
    .rail-top .wm,.rail-greet,.navlbl,.nav .nm,.nav .cnt{display:none}
    .rail-mark{display:block}
    .nav{justify-content:center;padding:11px 0}
    .nav .ico{width:23px;height:23px}
    .nav .ico svg{stroke-width:2.4}
    .navlbl{height:22px;padding:0}
    .nav::after{content:attr(data-tip);position:absolute;left:calc(100% + 10px);top:50%;transform:translateY(-50%);
      background:var(--rail);color:#fff;font-size:12.5px;font-weight:600;padding:6px 11px;border-radius:var(--r-sm);white-space:nowrap;
      box-shadow:0 8px 20px rgba(0,0,0,.28);opacity:0;pointer-events:none;transition:opacity .12s;z-index:70}
    .nav:hover::after{opacity:1}
    .userbtn .ub,.userbtn .cv{display:none}
    .userbtn{justify-content:center;padding:8px 0}
    .usermenu{left:8px;width:206px;right:auto}
    .app{grid-template-columns:214px 320px 1fr}
  }
  @media(max-width:1080px){ .grid2{grid-template-columns:1fr} }
  @media(max-width:980px){
    .rail{position:fixed;left:0;top:0;bottom:0;width:250px;transform:translateX(-100%);transition:transform .2s ease}
    body.nav-open .rail{transform:translateX(0)}
    body.nav-open .scrim{display:block;position:fixed;inset:0;background:rgba(20,45,60,.42);z-index:55}
    .rail-top .wm,.rail-greet,.navlbl,.nav .nm,.nav .cnt,.userbtn .ub,.userbtn .cv{display:block}
    .rail-mark{display:none}
    .navlbl{height:auto;padding:14px 12px 7px}
    .nav{justify-content:flex-start;padding:10px 12px}
    .nav::after{display:none}
    .userbtn{justify-content:flex-start;padding:8px 10px}
    .usermenu{left:10px;right:10px;width:auto}
    .burger{display:flex}
    .stand{display:none}
    .scroll{padding:0 12px 16px}
    .card,.qcard{padding:17px 15px}
    .qhint{margin-left:0;text-align:left;width:100%}
    .setrow .lbl{width:100%}
    .app{grid-template-columns:1fr;grid-template-rows:1fr;padding:0 12px 12px}
    .pane{grid-row:1;grid-column:1}
    .side{display:none}
    .listcol{display:flex}
    .read{display:none}
    body.view-read .listcol{display:none}
    body.view-read .read{display:flex}
    .backbtn{display:flex;align-items:center;gap:6px;background:none;border:none;color:var(--brand-dark);
      font-size:14px;font-weight:600;cursor:pointer;padding:0 0 10px}
    .modal{max-width:100%}
    .mbswitch.mob{display:block;padding:8px 12px 4px;margin:0}
    .mbswitch.mob .mbmenu{left:12px;right:12px}
    .mfolders{display:flex;gap:8px;overflow-x:auto;padding:2px 12px 10px;flex:0 0 auto}
    .mfolders .mf{white-space:nowrap;font-size:13px;font-weight:600;padding:7px 14px;border-radius:999px;
      border:1px solid var(--border);background:var(--card);cursor:pointer;color:var(--text)}
    .mfolders .mf.active{background:var(--brand);color:#fff;border-color:var(--brand)}
    body[data-view="mail"] .fab{position:fixed;right:18px;bottom:18px;width:58px;height:58px;border-radius:50%;border:none;
      background:var(--grad-btn);color:#fff;box-shadow:0 12px 26px rgba(23,52,95,.44);cursor:pointer;z-index:50;
      display:flex;align-items:center;justify-content:center}
    .ph-card{padding:26px 20px}
    .inv-form{grid-template-columns:1fr}
  }
  @media(prefers-reduced-motion:reduce){ *{transition:none!important;animation:none!important} }

  /* ============ Login ============ */
  body:not(.authed) .shell,body:not(.authed) .scrim,body:not(.authed) .fab,
  body:not(.authed) .toast,body:not(.authed) .overlay,body:not(.authed) .lb{display:none!important}
  /* Hintergrund: der ovale Marken-Verlauf aus simplexFM_Wallpaper_dunkel_2000,
     als reiner CSS radial-gradient nachgebaut (Farben von dort abgetastet) –
     bewusst OHNE das darin enthaltene Logo, das gäbe zusammen mit dem
     Schriftzug in der .logincard ein doppeltes Logo. Kein Bild-Request,
     kein Data-URI, nur eine CSS-Deklaration. */
  #loginScreen{position:fixed;inset:0;z-index:500;display:none;align-items:center;justify-content:center;
    background:radial-gradient(ellipse at 48% 34%, #2A4D7D 0%, var(--brand-dark) 45%, #0A1729 100%);
    padding:20px}
  body:not(.authed) #loginScreen{display:flex}
  .logincard{width:100%;max-width:360px;background:var(--card);border-radius:var(--r-lg);
    box-shadow:0 24px 60px rgba(10,25,35,.35);padding:34px 30px 30px;text-align:center}
  .logincard p{margin:0 0 22px;font-size:13.5px;color:var(--muted)}
  .logincard .fld{text-align:left}
  /* Mindestens 16px, sonst zoomt iOS Safari beim Fokussieren automatisch
     in das Feld hinein (Browser-Verhalten unterhalb von 16px). */
  .logincard .fld input{font-size:16px}
  .loginerr{min-height:18px;font-size:13px;font-weight:600;color:var(--danger);margin:2px 0 4px}
  .loginmsg{font-size:13px;font-weight:600;color:var(--ok);margin:2px 0 4px}
  .loginmsg:empty{display:none}
  .linkbtn{background:none;border:none;padding:0;margin:8px 0 0;font-size:12.5px;font-weight:650;
    color:var(--brand-dark);cursor:pointer;text-decoration:underline;text-underline-offset:2px}
  .linkbtn:hover{color:var(--brand)}
  #fldPw{position:relative}
  #fldPw .linkbtn{margin:6px 0 0}
  .loginbtn{width:100%;justify-content:center;margin-top:6px}

  /* ---- Abmelden ---- */
  .umlogout{color:var(--danger);border-top:1px solid var(--border);margin-top:4px;padding-top:10px}
  .umlogout:hover{background:rgba(228,87,46,.08)}
  .umlogout svg{display:block}
  .pf-logout{display:inline-flex;align-items:center;gap:8px;color:var(--danger);border-color:var(--danger)}
  .pf-logout:hover{background:rgba(228,87,46,.06)}
  .pf-logout svg{width:16px;height:16px}

  /* ---- Benutzerverwaltung ---- */
  .ub-list{display:flex;flex-direction:column;gap:8px;margin-top:4px}
  .ub-row{display:flex;align-items:center;gap:12px;border:1px solid var(--border);border-radius:var(--r-md);padding:10px 13px}
  .ub-info{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}
  .ub-info b{font-size:14px;font-weight:700}
  .ub-info span{font-size:12.5px;color:var(--muted)}
  .ta-catgroup{display:flex;flex-direction:column;gap:8px}
  .ta-catgroup+.ta-catgroup{margin-top:14px}
  .ta-catlbl{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted)}
  .ta-catlbl .dot{width:9px;height:9px;border-radius:50%;flex:0 0 auto}
  .av-upload{position:relative;flex:0 0 auto;display:block;cursor:pointer;border-radius:50%}
  .av-upload .av-big{width:52px;height:52px;font-size:18px}
  .av-upload-badge{position:absolute;right:-3px;bottom:-3px;width:18px;height:18px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;background:var(--brand-dark);color:#fff;
    box-shadow:0 0 0 2px var(--card)}
  .av-upload-badge svg{width:11px;height:11px}
  .av-upload:hover .av-upload-badge{background:var(--brand)}
  .av-upload.busy{opacity:.55;pointer-events:none}
  .ub-admin{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--brand-dark);
    background:var(--brand-soft);border-radius:999px;padding:4px 10px;flex:0 0 auto}
  .ub-del{color:var(--danger);border-color:var(--danger-soft-border);flex:0 0 auto}
  .ub-del:hover{background:rgba(228,87,46,.06);border-color:var(--danger)}

  /* Eine Karte je Benutzer, als Akkordeon eingeklappt (nur Kopfzeile),
     die Menüpunkte als Häkchen-Chips erscheinen erst beim Aufklappen. */
  .upc+.upc{margin-top:10px}
  .upc{padding:0;overflow:hidden}
  .upc-head{display:flex;align-items:center;gap:12px;width:100%;border:none;background:none;cursor:pointer;
    padding:16px 22px;text-align:left;font-family:inherit;border-radius:var(--r-lg);transition:background .12s}
  .upc-head:hover{background:var(--tint-2)}
  .upc-headtext{flex:1 1 auto;min-width:0}
  .upc-headtext b{display:block;font-size:15px;font-weight:750}
  .upc-headtext span{display:block;font-size:12.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .upc-chev{flex:0 0 auto;width:18px;height:18px;color:var(--muted);transition:transform .18s}
  .upc.open .upc-chev{transform:rotate(180deg)}
  .upc-body{display:none;padding:0 22px 20px;border-top:1px solid var(--divider);margin-top:-1px;padding-top:16px}
  .upc.open .upc-body{display:block}
  .upc-group+.upc-group{margin-top:14px}
  .upc-gname{font-size:10.5px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:var(--muted);margin-bottom:8px}
  .upc-items{display:flex;flex-wrap:wrap;gap:8px}
  .upc-item{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);background:var(--card);
    border-radius:var(--r-md);padding:7px 12px;font-size:13.5px;font-weight:600;color:var(--text);cursor:pointer;transition:all .12s}
  .upc-item:hover{border-color:var(--brand)}
  .upc-item.off{color:var(--muted);background:var(--surface-soft)}
  .upc-item input{width:15px;height:15px;cursor:pointer;accent-color:var(--brand-dark)}

  /* ---- Sichtbarkeits-Umschalter je Person unter einem globalen Mail-Konto ---- */
  .mk-visrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 0 4px}
  .mk-toggles{display:flex;flex-wrap:wrap;gap:8px}

  /* ---- Icon-Auswahl für Ticket-Aktionen (settings.js, Tab "Aktionen") ---- */
  .ta-icon-grid{display:flex;flex-wrap:wrap;gap:7px}
  .ta-icon-opt{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border:1px solid var(--border);
    background:var(--card);color:var(--muted);border-radius:var(--r-md);cursor:pointer;transition:all .12s}
  .ta-icon-opt svg{width:18px;height:18px}
  .ta-icon-opt:hover{border-color:var(--brand);color:var(--brand-dark)}
  .ta-icon-opt.on{background:var(--brand);border-color:var(--brand);color:#fff}

  /* ---- Wochenstunden-Soll je Person (Benutzerverwaltung) ---- */
  .upc-hours{border:1px solid var(--border);background:var(--tint-2);border-radius:var(--r-md);padding:11px 13px;margin-bottom:14px}
  .upc-hours label{display:block;font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);margin-bottom:8px}
  .upc-hours-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .upc-hours-input{width:84px;padding:8px 10px;border:1px solid var(--border);border-radius:var(--r-sm);font-size:16px;font-weight:650;color:var(--text);background:var(--card)}
  .upc-hours-input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .upc-hours-unit{font-size:13px;color:var(--muted)}
  .upc-hours-week{margin-left:auto;font-size:12.5px;color:var(--muted);font-weight:600}

  /* ---- Kommen/Pause/Gehen im Usermenü ---- */
  .umzeit{padding:4px 10px 10px}
  .umzeit-status{font-size:12.5px;color:var(--muted);font-weight:600;margin-bottom:9px}
  .umzeit-actions{display:flex;gap:8px}
  .umzeit-btn{flex:1 1 auto;border:1px solid var(--border);background:var(--card);border-radius:var(--r-md);padding:9px 10px;
    font-size:13px;font-weight:700;color:var(--text);cursor:pointer;transition:all .12s}
  .umzeit-btn:hover{border-color:var(--brand)}
  .umzeit-btn.on{background:var(--grad-btn);color:#fff}
  .umzeit-btn.off{color:var(--danger);border-color:var(--danger-soft-border)}
  .umzeit-btn.off:hover{background:rgba(228,87,46,.06)}
  .umzeit-btn:disabled{opacity:.55;cursor:not-allowed}

  /* ---- Hell-/Dunkel-Umschalter im Usermenü ---- */
  .themepick{padding:4px 10px 10px}
  .themepick-lbl{font-size:10.5px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--muted);padding:8px 0 9px}
  .themepick-actions{display:flex;gap:6px}
  .theme-btn{flex:1 1 auto;display:flex;flex-direction:column;align-items:center;gap:5px;border:1px solid var(--border);
    background:var(--card);border-radius:var(--r-md);padding:9px 6px 8px;font-size:11px;font-weight:700;color:var(--muted);
    cursor:pointer;transition:all .12s;min-width:0}
  .theme-btn span{font-size:10px;white-space:nowrap}
  .themepick-actions{gap:4px}
  .theme-btn svg{width:16px;height:16px}
  .theme-btn:hover{border-color:var(--brand);color:var(--brand-dark)}
  .theme-btn.on{background:var(--grad-btn);color:#fff}

  /* Kleiner Statuspunkt am Avatar, solange eingestempelt */
  .userbtn{position:relative}
  .userbtn.clocked-in .av,.userbtn.clocked-out .av{position:relative}
  .userbtn.clocked-in .av::after,.userbtn.clocked-out .av::after{content:"";position:absolute;right:-1px;top:50%;transform:translate(50%,-50%);width:9px;height:9px;border-radius:50%;
    background:#3DDC97;border:2px solid var(--rail)}
  .userbtn.clocked-in.on-pause .av::after{background:var(--warn)}
  .userbtn.clocked-out .av::after{background:#9AA6AF}

  /* ---- Zeiterfassung-Karte (Profil) ---- */
  .zeit-summary{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:16px}
  .zeit-stat{flex:1 1 140px;border:1px solid var(--border);border-radius:var(--r-md);padding:11px 13px;background:var(--tint-2)}
  .zeit-stat span{display:block;font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);margin-bottom:4px}
  .zeit-stat b{font-size:16px;font-weight:750;color:var(--text)}
  .zeit-stat b.on{color:var(--ok)}
  .zeit-add{display:grid;grid-template-columns:1fr 1fr 1.4fr auto;gap:10px;align-items:end;margin-bottom:18px;
    border-top:1px solid var(--divider);border-bottom:1px solid var(--divider);padding:16px 0}
  .zeit-add .fld{margin:0}
  .zeit-add input{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--r-md);font-size:16px;color:var(--text)}
  .zeit-add input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(148,199,249,.18)}
  .zeit-list{display:flex;flex-direction:column;gap:8px}
  .zeit-row{display:flex;align-items:center;gap:11px;border:1px solid var(--border);border-radius:var(--r-md);padding:10px 13px}
  .zeit-ico{flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:var(--brand)}
  .zeit-ico.manual{background:#8E5FD1}
  .zeit-info{flex:1 1 auto;min-width:0}
  .zeit-info b{display:block;font-size:13.5px;font-weight:700}
  .zeit-info span{display:block;font-size:12px;color:var(--muted)}
  .zeit-hours{flex:0 0 auto;font-size:14px;font-weight:750;color:var(--text)}
  .zeit-del{flex:0 0 auto;border:none;background:none;font-size:19px;line-height:1;color:var(--muted);cursor:pointer;padding:0 2px}
  .zeit-del:hover{color:var(--danger)}
  @media(max-width:720px){ .zeit-add{grid-template-columns:1fr 1fr;} .zeit-add button{grid-column:1 / -1} }

  /* Einheitlicher Abstand zwischen allen Kästen im Ticket (Kopf-Kachel,
     Fakten-Kacheln, Beschreibung, Aktions-Kachel, Kommentar-/Dokument-
     Karten) - Rafael, 2026-09-24: "Abstand gleich machen, alles auf den
     größeren". */
  #tkTabBody{margin-top:18px}
  #tkTabBody>.card+.card{margin-top:18px}

  /* Aktions-Kategorien in den Einstellungen: runder Farbpunkt, Name als
     Text - Doppelklick macht ihn editierbar (wie Titel/Standort im Ticket). */
  .cat-color{flex:0 0 auto;width:34px;height:34px;padding:0;border:2px solid var(--card);border-radius:50%;
    box-shadow:0 0 0 1px var(--border);background:none;cursor:pointer;overflow:hidden}
  .cat-color::-webkit-color-swatch-wrapper{padding:0}
  .cat-color::-webkit-color-swatch{border:none;border-radius:50%}
  .cat-color::-moz-color-swatch{border:none;border-radius:50%}
  .cat-name{display:block;border-radius:var(--r-sm);padding:2px 6px;margin-left:-6px;transition:background .13s}
  .cat-name:hover{background:var(--tint)}
  .ub-info .inline-edit{border-radius:var(--r-sm)}

  /* Titel "Beschreibung" über dem Beschreibungstext - gleicher Look wie die
     Kachel-Beschriftungen (.dtile-lbl). */
  .tkdesc-lbl{display:block;margin-bottom:6px;font-size:10.5px;font-weight:800;text-transform:uppercase;
    letter-spacing:.5px;color:var(--muted);white-space:normal}
  .tkdesc-lbl-edit{margin:var(--tk-gap,18px) 0 6px}
  .tkdesc-lbl-edit+.tkdesc-edit{margin-top:0}

  /* "Neues Ticket" ganz rechts oben in der Ecke der Ticket-Liste: erst
     Überschrift, dann die Trennlinie (füllt den Rest), dann der Button.
     Rafael, 2026-09-24. */
  .kpi-sechead:has(#tkActionBar)::after{order:1}
  .kpi-sechead #tkActionBar{order:2;margin-left:0}

  /* Dokumente: Kategorie-Überschrift links neben den Dateien statt darüber
     (spart Höhe, Breite ist genug da). Rafael, 2026-09-24. */
  .doc-cluster{display:grid;grid-template-columns:150px minmax(0,1fr);column-gap:16px;align-items:start}
  .doc-cluster>.doc-cluster-head{grid-column:1;grid-row:1;margin:10px 0 0}
  .doc-cluster>.attgrid,.doc-cluster>.attlist{grid-column:2}
  @media(max-width:720px){
    .doc-cluster{display:block}
    .doc-cluster>.doc-cluster-head{margin:0 0 10px}
  }

  /* Frist-Kachel ohne Überschrift: Frist (Stunden), Fällig am, Erstellt. */
  .frist-hrs{display:inline-flex;align-items:center;gap:5px}
  .frist-hrs input{width:64px;text-align:right}
  .frist-hrs em{font-style:normal;font-size:12px;font-weight:600;color:var(--muted)}

  /* Ticket-Name im Kopf: statischer Vorspann (Nr | Kunde | Standort |) in
     gedämpfter Farbe, dahinter die editierbare Bezeichnung. */
  .tk-titlepre{color:var(--muted);font-weight:700;white-space:pre-wrap}
  .dhead .dt h3 .inline-edit{display:inline-block;width:min(460px,60%);max-width:none;font-size:inherit;vertical-align:baseline}
  div.tk-titlepre{font-size:14px;margin-bottom:6px}

  /* Frist: Klick auf die Restzeit öffnet ein kleines Popup mit Schnellwahl
     und Handeingabe. */
  .dfacts>.dtile-frist{position:relative}
  .frist-btn{border:1px solid transparent;background:none;padding:2px 6px;margin:-2px -6px;border-radius:var(--r-sm);cursor:pointer;font:inherit}
  .frist-btn:hover{border-color:var(--border);background:var(--card)}
  .frist-btn .tktimer{border:none;padding:0;height:auto;background:none}
  .frist-pop{position:absolute;z-index:30;right:0;top:calc(100% + 6px);width:270px;background:var(--card);
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 18px 40px rgba(23,52,95,.18);padding:12px}
  .frist-pop[hidden]{display:none}
  .frist-pop-lbl{font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin-bottom:8px}
  .frist-presets{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
  .frist-preset{border:1px solid var(--border);background:var(--tint);border-radius:var(--r-sm);padding:7px 4px;font:inherit;
    font-size:12.5px;font-weight:700;color:var(--brand-dark);cursor:pointer;transition:all .13s}
  .frist-preset:hover{background:var(--brand);border-color:var(--brand);color:#fff}
  .frist-manual{display:flex;gap:6px;margin-top:10px}
  .frist-manual input{flex:1 1 60px;min-width:0;border:1px solid var(--border);border-radius:var(--r-sm);padding:6px 9px;font:inherit;font-size:16px;background:var(--card);color:var(--text)}
  .frist-manual select{border:1px solid var(--border);border-radius:var(--r-sm);padding:6px 6px;font:inherit;font-size:16px;background:var(--card);color:var(--text)}
  .frist-manual .btn{padding:6px 12px}

  /* Aktions-Kachel in zwei Spalten: Kategorie-Zeilen paarweise nebeneinander
     (spart Höhe), auf schmalen Fenstern wieder untereinander. */
  .tkactions-tile{display:grid;grid-template-columns:1fr 1fr;column-gap:26px}
  .tkact-row:nth-child(2){border-top:none}
  @media(max-width:1100px){
    .tkactions-tile{grid-template-columns:1fr}
    .tkact-row:nth-child(2){border-top:1px solid var(--divider)}
  }

  /* Frist-Popup: Zahlenfeld ohne Pfeile und breit genug zum Tippen. */
  .frist-pop{width:310px}
  .frist-manual input{flex:1 1 84px;min-width:84px;text-align:center;-moz-appearance:textfield;appearance:textfield}
  .frist-manual input::-webkit-outer-spin-button,.frist-manual input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
  .frist-manual select{flex:0 0 auto}

  /* Beschreibung schmaler, daneben (parallel) die Frist-Kachel; insgesamt
     flachere Kacheln. Rafael, 2026-09-24. */
  .tk-descrow{display:flex;gap:var(--tk-gap,18px);align-items:stretch;margin-top:var(--tk-gap,18px)}
  .tk-descrow>.tkdesc,.tk-descrow>.tk-descedit{flex:1 1 auto;min-width:0;margin-top:0}
  .tk-descrow .tkdesc{padding:10px 14px}
  .tk-descrow .tk-descedit .tkdesc-lbl-edit{margin-top:0}
  .tk-descrow>.dtile-frist{position:relative;flex:0 0 250px;margin:0;justify-content:center}
  .dtile{padding:7px 12px;gap:3px}
  .frist-row{min-height:24px}
  .tkdesc-edit{min-height:64px}
  @media(max-width:900px){
    .tk-descrow{flex-direction:column}
    .tk-descrow>.dtile-frist{flex:0 0 auto}
  }

  /* Frist-Popup: Handeingabe-Zeile bleibt innerhalb des Popups
     (Select war durch eine globale Breite zu breit). */
  .frist-pop{box-sizing:border-box;max-width:calc(100vw - 24px)}
  .frist-manual{flex-wrap:nowrap;align-items:stretch}
  .frist-manual input{flex:1 1 70px;min-width:0;width:auto}
  .frist-manual select{flex:0 0 96px;width:96px;min-width:0}
  .frist-manual .btn{flex:0 0 auto;width:auto;white-space:nowrap}

  /* "Bearbeiten" rechts neben "Aktualisieren" (gleicher .reload-Look). */
  .tk-editbtn{display:inline-flex;align-items:center;gap:7px}
  .tk-editbtn svg{width:15px;height:15px}
  .tk-reload~.tk-editbtn{margin-left:0}
  @media(max-width:980px){ .tk-editbtn{margin-left:auto !important} }

  /* Aktions-Buttons: eigene weiße Karte (nicht mehr getönte Kachel im Kopf). */
  .card.tk-actions-card{margin-top:var(--tk-gap,18px);padding:6px 18px}
  .tk-actions-card .tkactions-tile{margin-top:0;background:none;border-radius:0;padding:0}

  /* "Alle anzeigen" über den Kommentaren (nur die letzten 2 sind Standard). */
  .log li.cmt-more{justify-content:center;padding:0 0 14px}
  .log li.cmt-more .btn{font-size:12.5px;padding:6px 14px}

  /* Standort/Handwerker/Status (intern): Überschrift und Inhalt in EINER
     Zeile, Inhalt größer und besser lesbar. Rafael, 2026-09-24. */
  .dfacts{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
  .dfacts>.dtile{flex-direction:row;align-items:center;gap:12px;padding:9px 14px}
  .dfacts>.dtile>.dtile-lbl{flex:0 0 auto;min-width:104px;font-size:11.5px}
  .dfacts>.dtile>b,.dfacts>.dtile>select,.dfacts>.dtile>.att-tag{flex:1 1 auto;min-width:0}
  .dfacts>.dtile>b{font-size:16px;font-weight:700}
  .dfacts>.dtile>select{font-size:16px}
  /* Melder-Kachel: Name + Mailadresse zusammen sind oft länger als die
     Kachel breit ist - die normale Ellipsis-Kürzung griff nicht sauber,
     sobald ein <a>-Link mit im Text steckt (harter Abschnitt statt "…",
     siehe Rückmeldung). Stattdessen umbrechen lassen statt abschneiden. */
  .dtile-melder>b{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;line-height:1.35}
  /* Melder-Name mit Mailadresse als eigenem CSS-Tooltip beim Hover (siehe
     data-tip in ticketrun.js) - kein natives title (unzuverlässig, siehe
     Team-Stimmung-Bug) und zusätzlich per Klick kopierbar (ein natives
     title ließe sich nicht markieren). Rafael, 2026-09-26: "Melder-Namen
     anzeigen und Mailadresse als Hover-Tooltip zum Kopieren auch". */
  .melder-copy{position:relative;cursor:pointer;border-bottom:1px dashed var(--muted)}
  .melder-copy::after{content:attr(data-tip);position:absolute;left:0;bottom:calc(100% + 8px);
    background:var(--brand-dark);color:#fff;font-size:11.5px;font-weight:700;white-space:nowrap;
    padding:5px 9px;border-radius:var(--r-sm);box-shadow:0 4px 12px rgba(23,52,95,.28);
    opacity:0;pointer-events:none;transition:opacity .12s,transform .12s;transform:translateY(4px);z-index:60}
  .melder-copy:hover::after{opacity:1;transform:translateY(0)}

  /* "Alle anzeigen" rechts in der Reiterzeile der Kommentare (kostet keine Höhe). */
  .tk-logtabs-head{justify-content:space-between}
  .cmt-more-btn{margin:0 0 14px;border:none;background:none;padding:4px 2px;font:inherit;font-size:13px;font-weight:700;
    color:var(--brand-dark);cursor:pointer;text-decoration:underline;text-underline-offset:3px}
  .cmt-more-btn:hover{color:var(--brand)}

  /* Kommentare als Chat: Blasen nur so breit wie ihr Inhalt (mit Mindest-
     und Maximalbreite), eigene Kommentare rechts, die anderer Nutzer links,
     System-Zeilen ("Mail zugeordnet" ...) mittig. Rafael, 2026-09-24. */
  .log .lcbody .lt{width:fit-content;max-width:78%;min-width:170px;box-sizing:border-box}
  .log li.me{flex-direction:row-reverse}
  .log li.me .lcbody{align-items:flex-end}
  .log li.me .lm{justify-content:flex-end}
  .log li.me .lt{background:var(--brand-soft);border-color:transparent}
  .log li.me .ldate{text-align:right}
  .log li.sysbubble{flex-direction:row;justify-content:center}
  .log li.sysbubble .lcbody{flex:0 1 auto;align-items:center}
  .log li.sysbubble .lt.sys{max-width:100%}

  /* Fakten-Kacheln (Standort / Handwerker / Status intern) im Karten-Look:
     weiß mit Rand + feinem Schatten, Symbol in farbigem Kreis, Trennlinie
     zwischen Überschrift und Inhalt. Rafael, 2026-09-24: "hübscher". */
  .dfacts>.dtile{background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);
    box-shadow:0 1px 3px rgba(23,52,95,.06);padding:10px 16px 10px 12px;gap:14px;
    transition:border-color .13s,box-shadow .13s}
  .dfacts>.dtile:hover{border-color:color-mix(in srgb,var(--tk-c,var(--brand)) 45%,var(--border));box-shadow:0 4px 14px rgba(23,52,95,.09)}
  .dfacts>.dtile:nth-child(1){--tk-c:var(--ok)}
  .dfacts>.dtile:nth-child(2){--tk-c:var(--warn)}
  .dfacts>.dtile:nth-child(3){--tk-c:var(--brand)}
  .dfacts>.dtile>.dtile-lbl{gap:10px;min-width:0;padding-right:14px;border-right:1px solid var(--divider);
    font-size:10.5px;letter-spacing:.6px;color:var(--muted);align-self:stretch;align-items:center}
  .dfacts>.dtile>.dtile-lbl svg{width:30px;height:30px;box-sizing:border-box;padding:7px;border-radius:50%;opacity:1;
    background:color-mix(in srgb,var(--tk-c,var(--brand)) 15%,var(--card));color:var(--tk-c,var(--brand-dark))}
  .dfacts>.dtile>b{font-size:16px;font-weight:750;letter-spacing:-.1px}
  .dfacts>.dtile>b[data-editfield]:hover{color:var(--brand-dark);text-decoration:underline dotted;text-underline-offset:4px}

  /* Überschrift (Symbol + Text) und Inhalt der Fakten-Kacheln auf EINER
     gemeinsamen Mittelachse: gleiche Zeilenhöhe, beide vertikal zentriert. */
  .dfacts>.dtile{align-items:center;min-height:52px}
  .dfacts>.dtile>.dtile-lbl{line-height:1.2;align-self:stretch;align-items:center}
  .dfacts>.dtile>b{display:flex;align-items:center;line-height:1.2;align-self:center;height:100%}
  .dfacts>.dtile>select,.dfacts>.dtile>.att-tag{align-self:center}

  /* Abstand zwischen den weißen Karten im Ticket halbiert (18 -> 9 px). */
  .card.tk-actions-card{margin-top:9px}
  #tkTabBody{margin-top:9px}
  #tkTabBody>.card+.card{margin-top:9px}

  /* Kommentare: Zeitstempel klein außerhalb/unter der Blase. */
  .log .cmt{display:flex;flex-direction:column;align-items:flex-start;max-width:78%}
  .log li.me .cmt{align-items:flex-end}
  .log li.sysbubble .cmt{align-items:center;max-width:100%}
  .log .cmt>.lt{max-width:100%}
  .log .cmt>.ldate{margin:2px 6px 0;font-size:10px;font-weight:600;line-height:1.2}

  /* Frist: Popup hängt am Timer-Abzeichen oben rechts (Doppelklick). */
  .frist-wrap{position:relative;display:inline-flex}
  .frist-wrap .frist-pop{right:0;left:auto;top:calc(100% + 8px)}
  /* "Erstellt am" klein unter dem Ticketnamen. */
  .tk-created{margin-top:4px;font-size:11.5px;font-weight:600;color:var(--muted)}

  /* Ticket-Kopfzeile: alle Elemente (Zurück, Präsenz "… ist auch hier",
     Aktualisieren, Bearbeiten) gleich hoch. Rafael, 2026-09-24. */
  .tkbackrow .btn,.tkbackrow .reload,.tkbackrow .tkpresence{height:38px;box-sizing:border-box}
  .tkbackrow .tkpresence{padding-top:0;padding-bottom:0}
  .tkbackrow .tkpresence-av{width:26px;height:26px;font-size:11px}

  /* Handwerker-Status im Handwerker-Feld: farbiger Chip mit Auswahlmenü
     (offen = orange, bestätigt = grün, abgelehnt = rot). */
  .hw-status-wrap{position:relative;flex:0 0 auto}
  .hw-status{display:inline-flex;align-items:center;gap:7px;border:1px solid color-mix(in srgb,var(--hc) 40%,transparent);
    background:color-mix(in srgb,var(--hc) 15%,var(--card));color:var(--hc);border-radius:999px;padding:5px 11px;
    font:inherit;font-size:12.5px;font-weight:800;cursor:pointer;transition:filter .12s}
  .hw-status:hover{filter:brightness(.95)}
  .hw-status .cv{opacity:.8}
  .hw-dot{width:8px;height:8px;border-radius:50%;background:var(--hc);flex:0 0 auto}
  .hw-status-menu{position:absolute;z-index:30;right:0;top:calc(100% + 6px);min-width:170px;background:var(--card);
    border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 34px rgba(23,52,95,.16);padding:5px}
  .hw-status-menu[hidden]{display:none}
  .hw-status-item{display:flex;align-items:center;gap:9px;width:100%;border:none;background:none;border-radius:var(--r-sm);
    padding:8px 10px;font:inherit;font-size:13px;font-weight:700;color:var(--text);cursor:pointer;text-align:left}
  .hw-status-item:hover{background:color-mix(in srgb,var(--hc) 12%,var(--card))}
  .hw-status-item.on{background:color-mix(in srgb,var(--hc) 18%,var(--card));color:var(--hc)}

  /* Löschkreuz dezent: grau, beim Drüberfahren nur etwas dunkler mit
     leichtem Hintergrund (nicht mehr knallrot). Rafael, 2026-09-24. */
  .cmt-del{color:var(--muted);opacity:.5}
  .cmt-del:hover{background:var(--chip-bg,rgba(100,116,139,.16));color:var(--text);opacity:1;transform:scale(1.12)}

  /* "Nicht mehr fragen" im Bestätigungsdialog. */
  .cf-check{display:flex;align-items:center;gap:8px;margin-top:14px;font-size:13px;font-weight:600;color:var(--muted);cursor:pointer}
  .cf-check input{width:16px;height:16px;accent-color:var(--brand);cursor:pointer}

  /* Dokumente unten enger gepackt: kleinere Zeilen, Icons, Buttons und
     Abstände zwischen den Kategorien. Rafael, 2026-09-24. */
  .doc-cluster{column-gap:12px}
  .doc-cluster + .doc-cluster{margin-top:8px;padding-top:8px;border-top:1px solid var(--divider)}
  .doc-cluster>.doc-cluster-head{margin:6px 0 0;font-size:11.5px}
  .attlist li.file-item .file-row{padding:5px 0;gap:10px}
  .file-item .fico{width:30px;height:30px;border-radius:var(--r-sm)}
  .file-item .fico svg{width:15px;height:15px}
  .file-item .fbody b{font-size:13px}
  .file-item .fbody span{font-size:11.5px}
  .file-item .fact .act{height:28px;padding:0 8px !important;border-radius:var(--r-sm)}
  .file-item .fact .act svg{width:14px;height:14px}
  .file-item .fact .att-tag{height:28px;font-size:11px}
  .file-item .fact .btn.warn{padding:4px 12px;font-size:12.5px}
  .doc-cluster .attgrid{margin-bottom:6px;gap:8px}

  /* HTML-Mails: gesicherter iframe, Höhe passt sich dem Inhalt an. */
  .rd-body.rd-html{white-space:normal;padding:8px 14px 14px}
  .mail-expand .rd-body.rd-html{padding:0 0 14px}
  iframe.mailframe{display:block;width:100%;min-height:60px;border:1px solid var(--divider);border-radius:var(--r-md);background:#fff}

  /* Reiter (Kommentare | Mails | Verlauf): schmaler und näher an den Rand
     (links/oben), Höhe wie die Buttons oben. Rafael, 2026-09-24. */
  .tk-logtabs-head .set-tabs{gap:2px;padding:3px;border-radius:var(--r-md);margin:0 0 10px -8px}
  .tk-logtabs-head .set-tab{padding:5px 12px;font-size:12.5px;border-radius:var(--r-sm)}
  #tkTabBody>.card:first-child{padding-top:10px;padding-left:16px;padding-right:16px}
  .cmt-more-btn{margin-bottom:10px}

  /* Rechnungsprüfung: Hilfestellung (links) und KI-Prüfung (rechts) je halbe
     Breite; KI-Checks grün/rot/grau; nur eine Prüfung sichtbar. */
  .inv-toprow{display:flex;gap:12px;align-items:stretch;flex-wrap:wrap}
  .inv-toprow>.inv-panel{flex:1 1 220px;min-width:0;margin:0}
  .ki-checks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
  .ki-checks li{display:flex;align-items:center;gap:9px;font-size:13.5px;font-weight:650;color:var(--text)}
  .ki-ic{flex:0 0 auto;width:20px;height:20px;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;
    font-size:12px;font-weight:900;color:#fff;background:var(--muted)}
  .ki-checks li.ok .ki-ic{background:var(--ok)}
  .ki-checks li.bad .ki-ic{background:var(--danger)}
  .ki-checks li.bad{color:var(--danger)}
  .ki-checks li.na{color:var(--muted)}
  .ki-checks li.ki-clickable{cursor:pointer}
  .ki-checks li.ki-clickable:hover{text-decoration:underline}
  .ki-checks li i{font-style:normal;font-weight:500;color:var(--muted);font-size:12px}
  .inv-actions{display:flex;gap:8px;flex-wrap:wrap}
  .inv-actions .btn{margin-top:6px}
  .inv-reject{margin-top:10px}
  .inv-reject textarea{width:100%;min-height:70px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--r-md);padding:9px 11px;font:inherit;font-size:16px;background:var(--card);color:var(--text)}
  .inv-note-show{margin:0 0 8px;padding:8px 10px;border-radius:var(--r-sm);background:var(--tint);font-size:13px}

  /* Handwerker-Kachel: Status groß und farbig hinterlegt (offen = orange,
     bestätigt = grün, abgelehnt = rot); pulsiert einmal, wenn sich der
     Status im Hintergrund geändert hat. Rafael, 2026-09-24. */
  .dfacts>.dtile.hw-tile{border-width:2px}
  .dfacts>.dtile.hw-offen{background:color-mix(in srgb,var(--warn) 10%,var(--card));border-color:color-mix(in srgb,var(--warn) 45%,var(--border))}
  .dfacts>.dtile.hw-bestaetigt{background:color-mix(in srgb,var(--ok) 13%,var(--card));border-color:color-mix(in srgb,var(--ok) 55%,var(--border))}
  .dfacts>.dtile.hw-abgelehnt{background:color-mix(in srgb,var(--danger) 12%,var(--card));border-color:color-mix(in srgb,var(--danger) 55%,var(--border))}
  .dtile.hw-tile .hw-status{font-size:16px;padding:8px 16px;gap:9px;border-width:2px}
  .dtile.hw-tile .hw-dot{width:11px;height:11px}
  .dtile.hw-pulse{animation:hw-pulse 1.1s ease-in-out 10}
  @keyframes hw-pulse{
    0%,100%{box-shadow:0 0 0 0 rgba(42,155,224,0);transform:scale(1)}
    50%{box-shadow:0 0 0 8px rgba(42,155,224,.35);transform:scale(1.02)}
  }

  /* Handwerker-Status in der Ticketliste: farbiger Punkt + Kurztext. */
  .hw-lp{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:700;color:var(--muted);white-space:nowrap}
  .hw-ld{width:12px;height:12px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 0%,transparent)}
  .hw-none{color:var(--muted);opacity:.5}
  th.hw-th{white-space:nowrap}

  /* Interner Status als Pille mit farbigem Punkt (Farbe über --ic). */
  .intern-pill{display:inline-flex;align-items:center;gap:6px;margin-left:8px;padding:2px 10px 2px 8px;border-radius:999px;
    font-size:11.5px;font-weight:700;white-space:nowrap;vertical-align:middle;color:var(--text);
    background:color-mix(in srgb,var(--ic) 14%,var(--card));border:1px solid color-mix(in srgb,var(--ic) 40%,transparent);
    max-width:100%;min-width:0}
  .intern-dot{width:9px;height:9px;border-radius:50%;background:var(--ic);flex:0 0 auto}
  /* Der eigentliche Text bekommt sein EIGENES Ellipsis - der Punkt daneben
     ist ein zweites Flex-Kind, an dem die Ellipsis des äußeren .dtile b
     sonst wirkungslos verpuffte (Text wurde hart am Kachelrand abgeschnitten
     statt mit "…" zu enden - Rafael, 2026-09-25, Screenshot "Rückfrage beim
     Stand[...]"). Gleiches Prinzip wie .dtile-melder>b weiter unten. */
  .intern-txt{overflow:hidden;text-overflow:ellipsis;min-width:0}
  .dtile b .intern-pill{margin-left:0;font-size:14px;padding:4px 13px 4px 10px}

  td.intern-td .intern-pill{margin-left:0}
  th.intern-th{white-space:nowrap}

  /* Dienstleister: Anfragen-Übersicht je Karte (Zähler + aufklappbare Liste). */
  .dl-reqs{margin-top:10px;border-top:1px solid var(--divider);padding-top:8px;font-size:13px}
  .dl-reqs summary{cursor:pointer;font-weight:600;color:var(--text);list-style:none}
  .dl-reqs summary::-webkit-details-marker{display:none}
  .dl-reqs summary::before{content:"▸ ";color:var(--muted)}
  .dl-reqs[open] summary::before{content:"▾ "}
  .dl-reqs ul{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:2px}
  .dl-req{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:var(--r-sm);color:var(--text);text-decoration:none;font-size:12.5px}
  .dl-req:hover{background:var(--tint)}
  .dl-req b{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:var(--brand-dark)}
  .dl-req-t{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}
  .dl-req-s{font-weight:800;flex:0 0 auto}
  .dl-req-d{flex:0 0 auto;color:var(--muted);font-size:11.5px}

  /* Handwerker-Anfragen-Verlauf (Fenster beim Klick auf die Handwerker-Kachel). */
  .dfacts>.dtile[data-hwtile]{cursor:pointer}
  table.hwh{width:100%;border-collapse:collapse;font-size:13.5px}
  table.hwh th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);padding:6px 8px;border-bottom:1px solid var(--divider)}
  table.hwh td{padding:9px 8px;border-bottom:1px solid var(--divider);vertical-align:top}
  .hwh-cur{margin-left:6px;font-size:10.5px;font-weight:800;color:var(--brand-dark);background:var(--brand-soft);padding:1px 7px;border-radius:999px}
  /* Glas-Kacheln: gemeinsamer Look für alle Karten-Typen (Werte als Tokens, damit der Dunkelmodus
     sie zurückstellen kann). Blur etwas stärker, damit der Hintergrund weich durchscheint. */
  .card,.kpi,.qcard,.ph-card,.pane,.hw-form,.hw-side,.kunde-card{
    border-color:var(--card-edge);box-shadow:var(--card-shadow);
    backdrop-filter:blur(18px) saturate(1.25);-webkit-backdrop-filter:blur(18px) saturate(1.25)}
  .kpi{border-left-color:var(--border)}

  /* Ticketliste als einzelne Glas-Kacheln pro Zeile (Rafael, 2026-10-18: "wie
     einzelne Kacheln, aber als Liste, etwas getrennter voneinander"): Tabelle
     mit Zeilenabstand statt durchgehender Trennlinien, jede Zeile eine
     abgerundete Karte (erste/letzte Zelle tragen die Rundung). */
  #tkTable table{border-collapse:separate;border-spacing:0 10px;margin-top:-4px}
  #tkTable tbody td{background:var(--card-glass);border-top:1px solid var(--card-edge);border-bottom:1px solid var(--card-edge);
    padding:14px 12px;box-shadow:0 8px 14px -10px rgba(23,52,95,.34);transition:background .2s var(--ease-signature)}
  #tkTable tbody td:first-child{border-left:1px solid var(--card-edge);border-radius:var(--r-md) 0 0 var(--r-md);padding-left:16px}
  #tkTable tbody td:last-child{border-right:1px solid var(--card-edge);border-radius:0 var(--r-md) var(--r-md) 0;padding-right:16px}
  #tkTable tbody tr:last-child td{border-bottom:1px solid var(--card-edge)}
  #tkTable tbody tr:hover td{background:var(--card)}
  #tkTable tr.tk-news td{background:color-mix(in srgb,var(--brand) 22%,var(--card-glass))}

  /* Ticketliste: Tabellenkopf als eigene schwebende Pille mit Luft nach oben
     (Rafael, 2026-10-18: "die kleben so oben"). Deckender Hintergrund, damit die
     darunter durchlaufenden Kachel-Zeilen nicht durchscheinen. */
  #tkTable .tblwrap{padding:6px 4px 0;margin-top:10px}
  #tkTable .tblwrap th{top:4px;padding:12px 12px;background:var(--card);border:1px solid var(--card-edge);
    border-left:none;border-right:none;box-shadow:0 8px 16px -10px rgba(23,52,95,.3)}
  #tkTable .tblwrap th:first-child{border-left:1px solid var(--card-edge);border-radius:var(--r-md) 0 0 var(--r-md);padding-left:16px}
  #tkTable .tblwrap th:last-child{border-right:1px solid var(--card-edge);border-radius:0 var(--r-md) var(--r-md) 0;padding-right:16px}
  #tkTable .tblwrap thead tr{filter:none}

  /* "Handwerker zuweisen"-Dialog: jede Trefferzeile als eigene Kachel mit Abstand,
     der Auswählen-Button rückt vom Rand weg und wird etwas größer. Rafael, 2026-10-18. */
  li.file-item:has([data-hwpick]){list-style:none;margin:0 0 8px;padding:0;border:none}
  li.file-item:has([data-hwpick]) .file-row{padding:11px 14px 11px 12px;gap:14px;flex-wrap:nowrap;
    background:var(--card);border:1px solid var(--border);border-radius:var(--r-md);transition:border-color .15s,box-shadow .15s}
  li.file-item:has([data-hwpick]) .file-row:hover{border-color:var(--brand);box-shadow:0 6px 16px -8px rgba(23,52,95,.3)}
  li.file-item:has([data-hwpick]) .fico{width:36px;height:36px;border-radius:var(--r-md)}
  li.file-item:has([data-hwpick]) .fico svg{width:17px;height:17px}
  li.file-item:has([data-hwpick]) .fbody{min-width:0;flex:1 1 auto}
  li.file-item:has([data-hwpick]) .fbody b{font-size:14px}
  li.file-item:has([data-hwpick]) .fbody span{font-size:12px;margin-top:2px}
  li.file-item:has([data-hwpick]) .fact{margin-left:8px}
  li.file-item:has([data-hwpick]) [data-hwpick]{height:34px!important;padding:0 18px!important;border-radius:var(--r-md)}

  /* Augenfreundlicher für den Ganztagseinsatz (Rafael, 2026-10-18): Tabellenköpfe und
     Kachel-Überschriften minimal größer, damit die Großbuchstaben-Labels lesbar bleiben. */
  th{font-size:12px}
  .kpi-tag{font-size:13.5px}

  /* Leere Dokumente-/Mails-Kacheln im Ticket: schlanke Einzeiler statt hoher Blöcke
     (Rafael, 2026-10-18: Platz sparen, nichts anzeigen was leer ist). */
  .tk-empty{padding:12px 18px}
  .tk-empty-docs{display:flex;flex-direction:row-reverse;align-items:center;justify-content:space-between;gap:12px}
  .tk-empty-docs .tk-doc-head{margin:0}
  .tk-empty-docs p.dim{flex:1 1 auto}
  .tk-empty-mails .tk-doc-head{margin-bottom:4px}

  /* Darstellung-Umschalter: 2x2-Raster mit gleich großen Feldern (vorher 4 schmale,
     ungleich breite Knöpfe in einer Reihe). Icon links, Name rechts daneben. */
  .themepick-actions{display:grid;grid-template-columns:1fr 1fr;gap:6px}
  .theme-btn{flex-direction:row;justify-content:flex-start;gap:8px;padding:9px 12px;min-width:0}
  .theme-btn span{font-size:12px}
  .theme-btn svg{flex:0 0 auto}
  .theme-btn span{overflow:hidden;text-overflow:ellipsis}
