/* ============================================================ */
/* ZL-Portal: 3-Spalten-Layout, kein Seiten-Scroll               */
/* ============================================================ */


/* ============================================================ */
/* Farb-Variablen (fuer Darkmode)                                */
/* -- ALLE Farben im Rest der Datei laufen ueber diese Variablen  */
/* (var(--name)), NICHT mehr als feste Hex-Werte. Der zweite      */
/* Block (html[data-theme="dark"]) ueberschreibt dieselben Namen  */
/* mit den dunklen Gegenstuecken -- der Rest der Datei muss dafuer */
/* NICHT angefasst werden. Umschalter siehe details_ansicht.php   */
/* (eigenes Profil) + js.js: darkmode_umschalten()/darkmode_init(). */
/* Manche Farben (z.B. weisse Schrift auf einem kraeftig-blauen/   */
/* -roten Button, oder die Label-Farbe aus der DB) bleiben BEWUSST */
/* als fester Wert im Code stehen -- die betroffene Flaeche bleibt */
/* in beiden Modi gleich kraeftig eingefaerbt, eine Variable waere */
/* dort nur unnoetiger Umweg. -- */
/* ============================================================ */
:root
{
  /* -- Flaechen -- */
  --bg: #fff;              /* Karten/Popups/Eingabefelder + Seiten-Hintergrund (siehe body weiter unten) */
  --bg_subtle: #eee;       /* feststehende Kopf-/Fussleisten (Header links, Chat-Kopf, Eingabe-Bereich, ...) */
  --bg_hover: #f5f5f5;     /* Zeilen-Hover + Ruhezustand der runden Icon-Buttons */
  --bg_strong: #f0f0f0;    /* Nachrichten-Bubble (fremd), Trenner-Zeile, staerkerer Hover */
  --bg_btn_hover: #ececec; /* Hover der grauen Text-Buttons (Block/Loeschen/Verschieben/...) */
  --bg_kbd: #f8f8f8;       /* <kbd>-Tasten in der Tastenkombinationen-Uebersicht */
  --bg_active: #eef4ff;    /* aktive Zeile links, aktive Reaktion */
  --bg_chip: #eef4fb;      /* Empfaenger-Chip, Drag&Drop-Hervorhebung */
  --bg_own_msg: #dcf1ff;   /* eigene Nachrichten-Bubble */
  --bg_warn_soft: #fffbe6; /* Betreff-Zeile "Thema erstellen" */
  --bg_marked: #ffe9a8;    /* markierte Nachricht (Mehrfachauswahl) */
  --marked_outline: #f0b400;

  /* -- Schrift -- */
  --text: #333;            /* Standard-Text */
  --text_secondary: #666;
  --text_muted: #999;
  --text_faint: #888;
  --text_dim: #555;
  --text_dimmer: #aaa;
  --strong: #000;          /* hoechster Kontrast (Ungelesen-Badge/-Text) -- kippt im Dark Mode auf weiss */
  --strong_contrast: #fff; /* Gegenfarbe zu --strong (Text AUF dem --strong-Badge) */

  /* -- Rahmen -- */
  --border: #eee;          /* duenne Trennlinien (Zeilen, Popups) */
  --border_input: #ccc;    /* Eingabefelder/Buttons */
  --border_column: #ddd;   /* Spaltenraender, Kopf-/Fussleisten-Rahmen */
  --trenner_border: #e0e0e0;

  /* -- Akzentfarbe (Senden-Button, Links, Fortschrittsbalken) -- */
  --accent: #0078d4;
  --accent_hover: #005fa3;

  /* -- Fehler/Loeschen (rot) -- */
  --err: #c00;
  --err_border: #f3c2c2;
  --err_bg: #fff0f0;
  --err_bg_hover: #ffe1e1;
  --close: #900;           /* X-Buttons (Popup schliessen, Chip entfernen, ...) */

  /* -- Warnung/Stummgeschaltet/Wiedervorlage (gelb-braun) -- */
  --warn: #a06e00;
  --warn_border: #f0d9a0;
  --warn_bg: #fff8e8;
  --warn_bg_hover: #fff0cc;

  /* -- Erfolg/Hinzugefuegt (gruen) -- bisher nur fuers Versions-Diff (siehe
     #zl_diff_popup) gebraucht, eingefuegte Zeilen -- */
  --success: #2e7d32;
  --success_bg: #eaf7ea;

  --prio: #e02020;         /* Prio-Badge (kraeftiges Rot, bewusst anders als --err) */

  --overlay: rgba(0,0,0,0.4); /* Abdunkler hinter Popups */

  color-scheme: light; /* -- Gegenstueck zu color-scheme:dark weiter unten -- */
}

/* -- Dark-Werte fuer GENAU dieselben Variablennamen -- Umschaltung passiert
   rein ueber das data-theme-Attribut an <html>, siehe h.php (frueher Inline-
   Read gegen Aufblitzen im hellen Modus) + js.js -- */
html[data-theme="dark"]
{
  --bg: #1a1a1a;
  --bg_subtle: #262626;
  --bg_hover: #2e2e2e;
  --bg_strong: #333333;
  --bg_btn_hover: #3a3a3a;
  --bg_kbd: #2a2a2a;
  --bg_active: #16324a;
  --bg_chip: #1c3a52;
  --bg_own_msg: #123a52;
  --bg_warn_soft: #3a3410;
  --bg_marked: #5c4a12;
  --marked_outline: #f0b400;

  --text: #e6e6e6;
  --text_secondary: #b3b3b3;
  --text_muted: #999999;
  --text_faint: #9a9a9a;
  --text_dim: #bdbdbd;
  --text_dimmer: #888888;
  --strong: #fff;
  --strong_contrast: #000;

  --border: #333333;
  --border_input: #555555;
  --border_column: #3d3d3d;
  --trenner_border: #3d3d3d;

  --accent: #3b9eff;
  --accent_hover: #2f86d6;

  --err: #ff6b6b;
  --err_border: #5c2b2b;
  --err_bg: #3a1f1f;
  --err_bg_hover: #4a2626;
  --close: #d9534f;

  --warn: #e0b84d;
  --warn_border: #5c4a1f;
  --warn_bg: #3a3315;
  --warn_bg_hover: #4a4020;

  --success: #6fcf73;
  --success_bg: #163a1a;

  --prio: #ff4d4d;

  --overlay: rgba(0,0,0,0.6);

  /* -- sagt dem Browser selbst Bescheid (native Scrollbars, Formular-Chrome
     ohne eigenes CSS wie das Erstanmeldungs-Formular in h.php) -- */
  color-scheme: dark;
}





*
{
  box-sizing: border-box;
  font-family: arial;
}

html
{
  height: 100%;
  margin: 0;
  padding: 0;
  overscroll-behavior-x: none; /* kein Browser-Zurueck bei zu weit links wischen, kein Vorwaerts bei zu weit rechts */
  overscroll-behavior-y: auto; /* PTR (Pull-to-Refresh) erhalten */
}

body
{
  /* 100dvh: schrumpft dynamisch wenn Tastatur kommt -- iOS kann Body dann nicht hochscrollen */
  height: 100%;          /* Fallback fuer aeltere Browser */
  height: 100dvh;
  margin: 0;
  padding: 0;
  /* kein overflow:hidden hier -- PTR (native Pull-to-Refresh) muss durch body laufen koennen */

  /* -- Grundfarbe der ganzen Seite (fuer Darkmode): alle Bereiche OHNE eigenen
     background (z.B. #liste_bereich/#topic_ansicht/#details_ansicht) zeigen
     dadurch automatisch die richtige Flaeche durch, ohne dort jeweils extra
     etwas setzen zu muessen -- */
  background: var(--bg);
  color: var(--text);
}

/* -- Eingabefelder/Textareas/Selects OHNE eigene Hintergrundfarbe (z.B.
   .profil_textarea/.profil_api_url_input, .popup_suche) wuerden sonst beim nativen
   Browser-Weiss bleiben, obendrein bekommen Formularfelder Text-/
   Hintergrundfarbe NICHT zuverlaessig von body vererbt -- deshalb hier
   EIN gemeinsamer Grundstand fuer alle. Selektoren mit eigener background-
   Angabe (z.B. #suche_input) ueberschreiben das ganz normal per Spezifitaet
   -- ergibt in beiden Faellen denselben, schon vorhandenen hellen Wert, im
   Dark Mode wird dadurch aber WIRKLICH jedes Feld mit umgefaerbt -- */
input, textarea, select
{
  background: var(--bg);
  color: var(--text);
}

/* -- Farbwaehler (Labels: Hintergrund-/Schriftfarbe, Editor: Text-/BG-Farbe) --
   nativer <input type=color> ist im Browser-Standard recht klein (~ 44x23px),
   die aktuell gewaehlte Farbe darin ist dadurch kaum zu erkennen -- deutlich
   groesseres Klickfeld dafuer -- */
input[type="color"]
{
  width: 3em;
  height: 2.2em;
  padding: 2px;
  cursor: pointer;
}

/* -- Aeusserer Rahmen: nimmt exakt die volle Viewport-Hoehe ein -- */
#spalten
{
  display: flex;
  flex-direction: row;
  height: 100vh;               /* Fallback fuer aeltere Browser */
  height: 100dvh;              /* dvh: dynamisch — schrumpft wenn Tastatur aufgeht oder Browser-Chrome ein-/ausgeblendet wird */
  width: 100%;
  overflow-x: auto;            /* mobil: horizontal wischbar */
  /* KEIN overflow-y hier gesetzt (= visible): #spalten hat selbst keinen vertikalen Ueberlauf
     (Hoehe ist fix), das eigentliche Scrollen passiert in #liste_bereich/#topic_ansicht.
     So bleibt vertikales Overscroll komplett nativ -- fuer Pull-to-Refresh wichtig! */
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain; /* verhindert NUR horizontal, dass Wischen in der Snap-Zeile Browser-Vor/Zurueck ausloest */
}

/* ============================================================ */
/* Mobil: jede Spalte = 1 Bildschirmbreite, Snap-Punkt          */
/* ============================================================ */
#spalte_topics, #spalte_chat, #spalte_editor, #spalte_details
{
  scroll-snap-align: start;
  scroll-snap-stop: always;
  flex: 0 0 100%;
  height: 100%;
  border-right: 1px solid var(--border_column);
  /* KEIN overflow-y hier (= visible): kein eigener vertikaler Ueberlauf noetig,
     damit natives Pull-to-Refresh ungehindert bis zum Body durchlaufen kann */
  overflow-x: hidden; /* -- Absicherung auf Spalten-Ebene: KEINE Spalte darf jemals selbst
     horizontal scrollbar sein (haerteste Grenze -- faengt z.B. auch ein zu breites
     natives <select> im Kopfbereich ab, nicht nur .topic_zeile weiter unten) --
     beeinflusst NICHT overflow-y, das bleibt wie oben beschrieben bewusst "visible" */
}

#spalte_chat, #spalte_editor
{
  display: flex;
  flex-direction: column;
}

#spalte_details
{
  border-right: none;
  display: flex;
  flex-direction: column;
}

/* ============================================================ */
/* Desktop: 25 % links / 50 % Mitte (gerendert) / 25 % rechts (Details) --
   Standardverteilung OHNE Editor-Spalte (kein Schreibrecht fuer den
   aktuell geoeffneten ZL, siehe zl_ansicht.php: $darf_schreiben) --
   "dann nur 3 Tabs wie bisher" (Anforderung). #spalte_editor bleibt hier
   unsichtbar (siehe index.php: style="display:none", per JS gesteuert). */
/* ============================================================ */
@media (min-width: 900px)
{
  #spalten
  {
    overflow-x: hidden;
    scroll-snap-type: none;
  }

  #spalte_topics,
  #spalte_details
  {
    flex: 0 0 25%;
    width: 25%;
  }

  #spalte_chat
  {
    flex: 0 0 50%;
    width: 50%;
  }

  /* -- Mit Editor-Spalte (Schreibrecht, Anforderung: "gerendert UND Editor
     GLEICHZEITIG sichtbar"): 15 % Liste / 35 % gerendert / 35 % Editor /
     15 % Details -- js.js schaltet die Klasse "mit_editor" auf #spalten
     um, GENAU wie #spalte_editor selbst (display), siehe dort. Eigene
     Regeln statt die Basiswerte oben zu ueberschreiben, damit auf einen
     Blick klar bleibt, welche Verteilung zusammengehoert -- */
  #spalten.mit_editor #spalte_topics,
  #spalten.mit_editor #spalte_details
  {
    flex: 0 0 15%;
    width: 15%;
  }

  #spalten.mit_editor #spalte_chat,
  #spalten.mit_editor #spalte_editor
  {
    flex: 0 0 35%;
    width: 35%;
  }
}

/* ============================================================ */
/* Linke Spalte: Kopfzeile (Nameauswahl + Suche) + scrollbare Liste */
/* ============================================================ */
#spalte_topics
{
  display: flex;
  flex-direction: column;
}

#topics_header
{
  flex: 0 0 auto;              /* haengt oben, schrumpft nicht */
  padding: 8px;
  border-bottom: 1px solid var(--border_column);
  background: var(--bg_subtle); /* -- etwas dunkler als der Rest, hebt alle feststehenden
                        (nicht scrollenden) Bereiche optisch ab, siehe auch
                        #topic_kopf_bereich/#chat_eingabe_bereich -- */
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* Verbindungsstatus-Kugel: sitzt IN der #name_auswahl_zeile rechts neben dem
   Zahnrad und fuellt dort den restlichen Platz rechtsbuendig aus (statt eine
   eigene Zeile zu belegen) -- #sse_status ist nur noch der positionierende
   Wrapper, .sse_kugel selbst ist klein und rund (Anforderung: "Kugel statt
   Uhrzeit-Text"), siehe js.js: sse_kugel_aktualisieren()/sse_status_anzeigen(). */
#sse_status
{
  flex: 1;
  min-width: 0;
  text-align: right;
  padding: 0 2px;
}

.sse_kugel
{
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  border: none;
  padding: 0;
  cursor: pointer;
  vertical-align: middle;
  background: var(--text_dimmer); /* neutral, solange noch kein SSE-Tick/-Fehler da war */
}
.sse_kugel.online  { background: var(--success); }
.sse_kugel.offline { background: var(--err); }

/* Sortierung + Suche in einer Zeile */
#sort_suche_zeile
{
  display: flex;
  gap: 6px;
  align-items: center;
}

/* Filter (Freigabe+Label, EIN gemeinsames Popup) + Sortierung der ZL-Liste: zwei
   kleine Icon-Buttons vor der Suche, oeffnen jeweils ein Popup (siehe index.php +
   js.js: zl_filter_popup_oeffnen()/sort_popup_oeffnen()) */
#zl_filter_btn,
#sort_btn
{
  flex: 0 0 auto;
  padding: 4px 8px;
  font-size: 15px;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  background: var(--bg);
  cursor: pointer;
  position: relative; /* -- Ankerpunkt fuer #zl_filter_badge, siehe unten -- */
}

#label_filter_btn:hover,
#kategorie_filter_btn:hover,
#sort_btn:hover
{
  background: var(--bg_hover);
}

/* Roter Punkt auf #zl_filter_btn (Anforderung: "damit man sieht, dass Filter
   gesetzt sind") -- js.js: zl_filter_badge_sync() blendet ihn ein/aus */
#zl_filter_badge
{
  position: absolute;
  top: -3px;
  right: -3px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--err);
  border: 1px solid var(--bg);
}

/* vom Label-/Kategorie-Filter ausgeblendete ZL-Zeilen, siehe js.js:
   liste_filter_anwenden() -- MUSS als zusammengesetzter Selektor (Klasse+Klasse)
   geschrieben werden: ein alleinstehendes ".liste_gefiltert{display:none}" haette
   dieselbe Spezifitaet wie ".topic_zeile{display:block}" -- bei GLEICHER
   Spezifitaet gewinnt die Regel, die im Stylesheet WEITER UNTEN steht (hier:
   .topic_zeile), das display:none wuerde also stillschweigend NICHT greifen.
   Der zusammengesetzte Selektor hat hoehere Spezifitaet und gewinnt IMMER,
   unabhaengig von der Reihenfolge (echter Bug gewesen, siehe User-Ruecksprache) --
   */
.topic_zeile.liste_gefiltert
{
  display: none;
}

/* -- Wrapper UM jedes Suchfeld im Projekt (hier + .popup_suche): ermoeglicht
     den ueberlagerten "X"-Loeschen-Button (siehe .such_x_btn
     weiter unten, js.js: such_x_sync()/suche_input_leeren()). flex:1/min-width:0
     wirken NUR innerhalb eines Flex-Containers (hier: #sort_suche_zeile) -- im
     anderen (nicht-flex) Kontext, z.B. zl_details.php: #zl_freigabe_bereich,
     einfach wirkungslos, das <div> ist dort ganz normal block-level und fuellt
     die Breite --*/
.such_feld
{
  position: relative;
  flex: 1;
  min-width: 0;
}

/* -- "X"-Button: ueberlagert das jeweilige Suchfeld rechts, nur sichtbar (.sichtbar),
     wenn gerade Text drinsteht -- siehe js.js: such_x_sync() --*/
.such_x_btn
{
  display: none;
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  border: none;
  background: none;
  color: var(--text_muted);
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  padding: 6px;
}

.such_x_btn:hover
{
  color: var(--text);
}

.such_x_btn.sichtbar
{
  display: block;
}

/* -- alle Suchfelder sind type="search" (statt "text"): bringt in Chrome/Safari/Edge
   von sich aus ein natives "X" UND Esc-Loeschen mit (spart dort quasi Code) -- ABER
   Firefox zeigt dieses native "X" nicht zuverlaessig an (bekannte Cross-Browser-Luecke),
   daher bleibt .such_x_btn oben als GARANTIERT ueberall gleiches, eigenes "X" bestehen.
   Das native WebKit/Blink-"X" wird deshalb ausgeblendet, sonst wuerden in Chrome/Safari/
   Edge ZWEI X-Buttons uebereinanderliegen -- Esc-Loeschen funktioniert dort trotzdem
   weiterhin nativ (betrifft nur das Aussehen, nicht die Tastatur-Funktion) --*/
input[type="search"]::-webkit-search-cancel-button
{
  -webkit-appearance: none;
  appearance: none;
}

#suche_input
{
  width: 100%;
  /* -- rechts Platz fuer den ueberlagerten "X"-Button lassen (siehe .such_x_btn oben) -- */
  padding: 5px 28px 5px 10px;
  border: 1px solid var(--border_input);
  border-radius: 14px;
  font-size: 14px;
  outline: none;
  background: var(--bg);
}

/* Namensauswahl + Profil-Button in einer Zeile */
#name_auswahl_zeile
{
  display: flex;
  gap: 6px;
  align-items: center;
}

#name_auswahl_select
{
  flex: 0 0 auto; /* -- bewusst NICHT mehr flex:1 -- die Auswahl soll schmal sein,
                      der SSE-Status daneben fuellt den restlichen Platz -- */
  width: 40%; /* -- Anforderung: SSE-Sekundenzahl wurde bei 50% auf dem Desktop abgeschnitten -- */
  min-width: 0;
  padding: 4px 6px;
  font-size: 14px;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  background: var(--bg);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Kopf-Symbol (oeffnet das eigene Profil der aktuell gewaehlten Identitaet
   rechts) + "+"-Button (legt sofort einen neuen ZL an, siehe js.js:
   zl_neu_anlegen()) -- identisches Aussehen, daher zusammengefasst */
#eigenes_profil_btn,
#zl_neu_btn
{
  flex: 0 0 auto;
  padding: 4px 8px;
  font-size: 16px;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  background: var(--bg);
  cursor: pointer;
}

#eigenes_profil_btn:hover,
#zl_neu_btn:hover
{
  background: var(--bg_strong);
}

/* "Mitmachen"-Link: ersetzt Namensauswahl+Zahnrad+Plus OHNE eigene Identitaet
   (Anforderung: anonymer Zugriff, siehe index.php + h.php: willkommen_popup_
   oeffnen()) -- fuellt bewusst den ganzen verbleibenden Platz (flex:1, GENAU wie
   sonst #name_auswahl_select) und ist deutlich als klickbarer Haupt-Auslöser
   erkennbar, nicht nur ein schmaler Link zwischen anderen Elementen. */
.mitmachen_link
{
  flex: 1;
  min-width: 0;
  padding: 6px 10px;
  font-size: 14px;
  font-weight: bold;
  text-align: center;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  background: var(--bg_strong);
  color: var(--text);
  text-decoration: none;
  cursor: pointer;
}

.mitmachen_link:hover
{
  background: var(--bg);
}

/* Liste scrollt innerhalb des verbleibenden Platzes */
#liste_bereich
{
  flex: 1;
  min-height: 0;    /* WICHTIG: ohne diesen Wert kann Flex-Shrink nicht unter die Content-Hoehe -- dadurch wuerde die Liste die Suchzeile verdraengen wenn Tastatur aufgeht */
  overflow-y: auto;
  overflow-x: hidden; /* Absicherung: hier soll NIE horizontal gescrollt werden koennen, egal was fuer Inhalt reinkommt */
}

/* ============================================================ */
/* Linke Spalte: Topic-Zeilen                                    */
/* ============================================================ */
.topic_zeile
{
  /* -- WICHTIG fuers mobile Breiten-Problem: <button> bekommt auf manchen mobilen
     Browsern (v.a. iOS Safari) noch das native Erscheinungsbild samt eigener
     Breitenberechnung, wodurch width:100% ignoriert und stattdessen auf die
     Inhaltsbreite gewachsen wird -- die zu breite Zeile reisst dadurch die ganze
     Seite horizontal auf (scrollbar). appearance:none schaltet das native
     Rendering ab, min-width:0 verhindert zusaetzlich ein Wachsen ueber die
     Inhaltsbreite hinaus -- */
  appearance: none;
  -webkit-appearance: none;
  display: block;
  width: 100%;
  min-width: 0;
  text-align: left;
  padding: 10px;
  border: none;
  border-bottom: 1px solid var(--border);
  background: none;
  cursor: pointer;
  /* -- jetzt ein <a href> statt <button> (Anforderung, SEO -- siehe
     zl_liste.php), braucht deshalb zusaetzlich die frueher vom Button
     automatisch mitgebrachten Resets: Links sind sonst unterstrichen/blau
     und "vererben" ihre Textfarbe nicht an Kind-Elemente -- */
  text-decoration: none;
  color: inherit;
}

.topic_zeile:visited
{
  /* -- :visited hat in manchen Browsern hoehere Spezifitaet als eine reine
     Klasse -- ohne diese explizite Regel koennte ein bereits besuchter Link
     trotz "color:inherit" oben wieder in der Standard-Linkfarbe erscheinen -- */
  color: inherit;
}

.topic_zeile:hover
{
  background: var(--bg_hover);
}

.topic_zeile.aktiv
{
  background: var(--bg_active);
}

/* Label-Pillen ueber dem Namen (nur wenn welche gesetzt sind, siehe zl_liste.php) */
.liste_label_zeile
{
  margin-bottom: 3px;
}

/* Name + Lese-Rechte-Icon in EINER Zeile, Icon rechtsbuendig (Anforderung) */
.zl_zeile_titel_zeile
{
  display: flex;
  align-items: baseline;
  gap: 6px;
}

.zl_zeile_titel_zeile .betreff
{
  font-weight: bold;
  flex: 1;
  min-width: 0;
  /* -- ein langer String OHNE Leerzeichen wird sonst nicht umgebrochen und
     reisst die Zeile leicht ueber die Breite hinaus -- */
  overflow-wrap: anywhere;
  word-break: break-word;
}

.zl_lese_icon
{
  flex-shrink: 0;
  font-size: 13px;
}

/* Erstellt-/Geaendert-Zeitpunkt als Icon+Datum -- linksbuendig/rechtsbuendig
   auf DERSELBEN Zeile (Anforderung), Erklaerung jeweils per title-Tag */
.zl_zeiten_zeile
{
  display: flex;
  justify-content: space-between;
  gap: 6px;
  margin-top: 2px;
}

.zl_zeit
{
  color: var(--text_muted);
  font-size: 12px;
  white-space: nowrap;
}

/* farbiger Punkt fuer das Label in der Topic-Liste */
.liste_label_pille
{
  display: inline-block;
  color: #fff;
  text-shadow: 0 1px 1px rgba(0,0,0,0.25); /* -- Lesbarkeit bei hellen Label-Farben -- */
  border-radius: 10px;
  padding: 0 6px;
  font-size: 11px;
  font-weight: bold;
  line-height: 16px;
  margin-right: 3px;
  vertical-align: middle;
  max-width: 120px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  flex-shrink: 0;
}

/* Wiedervorlage-Badge in der ZL-Liste, siehe zl_liste.php --
   .faellig (Zeitpunkt schon erreicht/vergangen) faerbt es zur Betonung um */
.liste_wiedervorlage_badge
{
  display: inline-block;
  background: var(--warn_bg);
  color: var(--warn);
  border: 1px solid var(--warn_border);
  border-radius: 10px;
  padding: 0 5px;
  font-size: 11px;
  font-weight: bold;
  margin-right: 3px;
  vertical-align: middle;
}

.liste_wiedervorlage_badge.faellig
{
  background: var(--err_bg);
  color: var(--err);
  border-color: var(--err_border);
}

/* ============================================================ */
/* Rechte Spalte: Topic-Kopfzeile (nur noch Betreff)             */
/* Fix ausserhalb des scrollbaren Bereichs -- genau wie links    */
/* #topics_header (fix) + #liste_bereich (scrollbar) aufgebaut.  */
/* Label- und Prio-Auswahl stehen jetzt in #details_ansicht,     */
/* siehe dort weiter unten.                                      */
/* ============================================================ */
/* -- GENAU dieselbe Regel wie #zl_editor_kopf_bereich (Editor-Spalte, siehe
   dort) und #details_kopf_bereich (rechte Spalte, siehe dort) -- alle drei
   sind fix ausserhalb ihres scrollbaren Bereichs, siehe #topics_header links --*/
#zl_kopf_bereich,
#zl_editor_kopf_bereich,
#details_kopf_bereich
{
  flex: 0 0 auto;              /* haengt oben, schrumpft nicht -- wie #topics_header links */
  border-bottom: 1px solid var(--border_column);
  background: var(--bg_subtle); /* -- siehe #topics_header: alle feststehenden Bereiche einheitlich -- */
}

/* kein Rahmen, solange der jeweilige Bereich noch leer ist (nichts gewaehlt) */
#zl_kopf_bereich:empty,
#zl_editor_kopf_bereich:empty,
#details_kopf_bereich:empty
{
  border-bottom: none;
}

#zl_kopf
{
  padding: 6px 14px;
}

/* Name + Bearbeiten-Stift in EINER Zeile, Stift rechtsbuendig (Anforderung) */
.zl_kopf_zeile
{
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Groessere Ueberschrift NUR in der Mitte oben (Anforderung) -- der ZL-Name
   soll sich deutlich vom sonstigen Text abheben. .details_titel selbst bleibt
   fuer die dritte Spalte (Profil-Ueberschrift) unveraendert bei 16px, siehe
   dort -- deshalb hier extra ueberschrieben statt .details_titel direkt
   anzufassen */
.zl_kopf_zeile .details_titel
{
  flex: 1;
  min-width: 0;
  overflow-wrap: anywhere;
  font-size: 22px;
}

/* Name-Eingabefeld -- steht NICHT mehr ueber der gerenderten Ansicht (Anforderung:
   "Name soll nicht ueber dem gerenderten div aenderbar sein"), sondern als eigene
   Zeile ueber der Editor-Formatierungsleiste (siehe zl_ansicht.php: erstes Kind
   von #zl_editor_kopf) -- flex:1 1 100% zwingt es dort (der Elterncontainer ist
   ein flex-wrap-Zeile, siehe .chat_format_leiste) auf eine eigene, volle Zeile
   VOR den Formatierungs-Buttons. */
.zl_name_input
{
  flex: 1 1 100%;
  min-width: 0;
  font-size: 16px;
  font-weight: bold;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 4px 8px;
  font-family: inherit;
  margin-bottom: 4px;
}

/* Stift + TOC-Menue-Button rechtsbuendig ALS GRUPPE oben neben dem Namen
   (Anforderung TOC-Button: "oben neben dem ZL-Namen rechtsbuendig") -- ein
   gemeinsamer margin-left:auto auf dem Wrapper statt auf .betreff_stift selbst,
   damit die Gruppe als Ganzes rechts andockt, unabhaengig davon, ob gerade
   einer, beide oder keiner der beiden Buttons sichtbar ist. */
.zl_kopf_rechts
{
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
  flex-shrink: 0;
}

.betreff_stift
{
  cursor: pointer;
  flex-shrink: 0;
  font-size: 15px;
}

/* ============================================================ */
/* Mittlere Spalte: ZL-Inhalt (Editor/Ansicht)                   */
/* ============================================================ */
/* display:flex + flex-direction:column, damit #zl_text/#zl_gerendert (beide
   flex:1, siehe dort) von Anfang an die komplette verfuegbare Hoehe ausnutzen
   koennen (Anforderung) statt erst mit dem Inhalt zu wachsen */
#zl_ansicht
{
  flex: 1;
  min-height: 0;    /* WICHTIG: erlaubt Schrumpfen wenn Tastatur aufgeht -- ohne diesen Wert wuerde der Editor-Bereich nach unten rausschieben */
  overflow-y: auto;
  overflow-x: hidden; /* Absicherung: hier soll NIE horizontal gescrollt werden koennen, egal was fuer Inhalt reinkommt */
  padding: 8px 14px 50px; /* Abstand vom Rand -- unten bewusst deutlich mehr (Anforderung: "immer 50px unten"), damit das Ende eines laengeren ZL nicht direkt an der Unterkante klebt */
  display: flex;
  flex-direction: column;
}

#zl_gerendert
{
  flex: 1;
}

/* ============================================================ */
/* NEUE Spalte: Markdown-Editor (Anforderung: gerendert + Quelltext        */
/* GLEICHZEITIG sichtbar) -- #zl_editor_kopf_bereich (fix, Format-/        */
/* Speichern-Leiste) + #zl_editor_ansicht (scrollbar, Textarea) sind       */
/* GENAU wie #zl_kopf_bereich + #zl_ansicht links davon aufgebaut, siehe   */
/* js.js: zl_ansicht_einsetzen()/zl_initial_aktivieren() fuer das          */
/* Herausloesen aus der AJAX-Antwort.                                      */
/* ============================================================ */
/* -- Styling siehe #zl_kopf_bereich (identische Regel fuer alle drei
   "fixen Kopfbereiche", dort zusammengefasst) -- */

/* KEIN Padding (Anforderung: "Textarea im Editor Bereich komplett ohne
   Margin") -- die #zl_ansicht (gerenderte Seite) daneben behaelt ihr Padding
   unveraendert, nur der Editor soll randlos sein. Der sichtbare Abstand kam
   nie von der Textarea selbst (die hatte nie einen eigenen margin), sondern
   ausschliesslich von diesem Padding hier. */
#zl_editor_ansicht
{
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 0;
  display: flex;
  flex-direction: column;
}

/* -- #toast kommt aus dem extern geladenen toast.js (siehe h.php) und hat dort
   selbst KEIN z-index (nur position:fixed) -- festes, hohes z-index (ueber
   dem Popup-Overlay 200 und dem Bild-Vollbild 250), damit der Toast immer
   ganz oben bleibt -- */
#toast
{
  z-index: 300;
}

.hinweis
{
  padding: 20px;
  color: var(--text_muted);
  text-align: center;
}

.zl_alte_version_hinweis
{
  margin: 8px 0;
  padding: 8px 12px;
  border-radius: 6px;
  background: var(--warn_bg);
  color: var(--warn);
  border: 1px solid var(--warn_border);
  font-size: 13px;
}

.zl_alte_version_hinweis a
{
  color: var(--warn);
}

/* ============================================================ */
/* Dritte Spalte: Ueberschrift (ZL-Name/Profil) -- fix ausserhalb des         */
/* scrollbaren Bereichs, genau wie links #topics_header (fix) +              */
/* #liste_bereich (scrollbar) bzw. in der Mitte #zl_kopf_bereich +           */
/* #zl_ansicht aufgebaut. Wird per JS (details_ansicht_einsetzen())          */
/* aus der Antwort von details_ansicht.php herausgeloest. So bleibt sie      */
/* sichtbar, auch wenn der Rest scrollen muss (z.B. langer Profiltext,       */
/* viele Einstellungen).                                                     */
/* ============================================================ */
/* -- Styling siehe #zl_kopf_bereich (identische Regel fuer alle drei
   "fixen Kopfbereiche", dort zusammengefasst) -- */

#details_kopf
{
  padding: 10px 14px;
}

.details_titel
{
  font-size: 16px;
  font-weight: bold;
  margin: 0;
}

/* ============================================================ */
/* Dritte Spalte: Details (Profil bzw. Thema-Infos)              */
/* ============================================================ */
#details_ansicht
{
  flex: 1;
  min-height: 0;    /* WICHTIG: erlaubt Schrumpfen, siehe #topic_ansicht */
  overflow-y: auto;
  padding: 12px 14px;
}

.details_untertitel
{
  font-size: 12px;
  font-weight: bold;
  color: var(--text_muted);
  text-transform: uppercase;
  margin: 14px 0 6px 0;
}

/* Label- und Prio-Auswahl: oberhalb von "Thema verlassen" (siehe details_ansicht.php) */
.label_auswahl
{
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 14px;
}

/* -- "Label:"/"Prio:" VOR der jeweiligen Box, siehe details_ansicht.php -- */
.auswahl_beschriftung
{
  font-size: 13px;
  color: var(--text_secondary);
  flex-shrink: 0;
}

/* -- "Verfasst von"/"Letzte Änderung" ueber den Berechtigungen (Anforderung),
   siehe zl_details.php -- schlichte, kleine Info-Zeile wie .auswahl_beschriftung --*/
.zl_autor_zeile
{
  font-size: 13px;
  color: var(--text_secondary);
  margin-bottom: 4px;
}

/* -- Selects innerhalb von .label_auswahl (Wer darf lesen/bearbeiten, siehe
     zl_details.php) -- schlichter, einheitlicher Select-Stil -- */
.label_auswahl select
{
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 3px 5px;
  font-size: 13px;
  background: var(--bg);
}

/* -- Einheitlicher Feld-Look fuer einzelne Eingabefelder AUSSERHALB der
     grossen Formulare (z.B. Wiedervorlage-Datumsfeld, zl_details.php)
     -- die globale "input, textarea, select"-Regel weiter oben setzt
     BEWUSST nur Hintergrund-/Textfarbe (Darkmode-Grundstand), OHNE eigene
     Klasse faellt ein Feld sonst auf den nativen Browser-Style zurueck
     (bei datetime-local: eingelassener "3D"-Rahmen + kleinere Schrift) --
     gleiche Werte wie .label_auswahl select, fuer einheitliches Aussehen --
*/
.details_input
{
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 3px 5px;
  font-size: 13px;
  font-family: inherit;
  background: var(--bg);
  color: var(--text);
}

/* Wiedervorlage-Zeile + Versions-Auswahl: einfacher Abstand nach unten, siehe
   zl_details.php: .details_edit_zeile */
.details_edit_zeile
{
  margin-bottom: 10px;
  display: flex;
  gap: 6px;
  align-items: center;
}

#zl_versionen_select
{
  display: block;
  width: 100%;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 5px 8px;
  font-size: 13px;
  background: var(--bg);
  margin-bottom: 14px;
}

.details_blindtext
{
  color: var(--text_dim);
  font-size: 13px;
  line-height: 1.5;
}

/* Profiltext einer ANDEREN Identitaet im Lese-Popup (siehe index.php:
   #fremdes_profil_popup, js.js: fremdes_profil_oeffnen()) -- white-space:
   pre-wrap zeigt vom Nutzer selbst getippte Zeilenumbrueche/Leerzeichen an,
   OHNE sie erst manuell in <br> umwandeln zu muessen (GENAU wie die eigene
   Profil-Textarea das nativ tut) --*/
.fremdes_profil_text
{
  white-space: pre-wrap;
}

/* ============================================================ */
/* Einstellungen-Akkordeon (eigenes Profil, Zahnrad-Icon, Anforderung:        */
/* "aufgeraeumt, Hauptpunkte farblich hinterlegt, Pfeil der beim Aufklappen   */
/* nach unten wechselt") -- natives <details>/<summary>, siehe zl_details.php.*/
/* ============================================================ */
.einstellung_akkordeon
{
  margin-bottom: 8px;
  border: 1px solid var(--border_column);
  border-radius: 6px;
  overflow: hidden; /* -- rundet die Ecken der Kopfzeile optisch mit ab -- */
}

/* -- Kopfzeile: farblich hinterlegt (Anforderung), eigener Pfeil statt dem
   nativen Dreieck-Marker (der ist je nach Browser unterschiedlich gestylt/
   schwer einheitlich einzufaerben) -- list-style:none + die WebKit-spezifische
   ::-webkit-details-marker-Regel blenden den nativen Marker in allen gaengigen
   Browsern zuverlaessig aus (Firefox/Chrome/Safari) -- */
.einstellung_akkordeon summary
{
  list-style: none;
  cursor: pointer;
  padding: 10px 14px;
  background: var(--bg_subtle);
  font-weight: bold;
  display: flex;
  align-items: center;
  gap: 8px;
  user-select: none;
}

.einstellung_akkordeon summary::-webkit-details-marker
{
  display: none;
}

/* -- eigener Pfeil: zeigt rechts (zu, Anforderung), dreht sich beim Aufklappen
   nach unten -- [open] ist ein normaler CSS-Attribut-Selektor, den <details>
   selbst automatisch setzt/entfernt, KEIN JS dafuer noetig -- */
.einstellung_akkordeon summary::before
{
  content: '▶';
  font-size: 11px;
  color: var(--text_secondary);
  transition: transform 0.15s ease;
}

.einstellung_akkordeon[open] summary::before
{
  transform: rotate(90deg);
}

.einstellung_akkordeon summary:hover
{
  background: var(--bg_hover);
}

.einstellung_inhalt
{
  padding: 12px 14px;
}

/* -- Radio-Zeilen (Push-Mitteilungen/Darkmode, Anforderung: Radio-Buttons
   statt Checkbox) -- eigene Zeile pro Option, GENAU wie die alte .pushs_zeile --*/
.einstellung_radio_zeile
{
  display: flex;
  align-items: center;
  gap: 6px;
  cursor: pointer;
  margin-bottom: 6px;
}

.einstellung_radio_zeile input
{
  width: auto;
}

/* Profiltext-Zeile: Anzeige + Stift-Button zum Aendern (Stift nur im eigenen Profil).
   align-items:flex-start statt center (wie bei .details_api_url_zeile), da der
   Profiltext -- anders als die einzeilige API-URL -- mehrzeilig sein kann */
.details_profil_zeile
{
  display: flex;
  align-items: flex-start;
  gap: 6px;
}

/* Bearbeiten-Modus: gleiches Aussehen wie die Anzeige, waechst mit dem Text (siehe chat_textarea_resize) */
.profil_textarea
{
  display: block;
  width: 100%;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 6px 8px;
  font-family: inherit;
  resize: none;
  overflow-y: hidden;
}

/* API-URL: gleiches Eingabefeld-Aussehen wie das Profil-Textfeld, aber einzeilig */
.profil_api_url_input
{
  display: block;
  width: 100%;
  box-sizing: border-box;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 6px 8px;
  font-family: inherit;
  margin-top: 8px;
}

/* API-URL-Zeile: Anzeige + Stift-Button zum Aendern (nur im eigenen Profil sichtbar) */
.details_api_url_zeile
{
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 4px;
}

.details_api_url_anzeige
{
  color: var(--text_faint);
  font-size: 12px;
  word-break: break-all;
  flex: 1;
  min-width: 0;
}

/* Generischer kleiner Stift-Button (Name historisch von der API-URL-Zeile --
   wird jetzt genauso fuer den Profiltext-Stift in .details_profil_zeile benutzt) */
.api_url_edit_btn
{
  flex: 0 0 auto;
  border: none;
  background: none;
  cursor: pointer;
  font-size: 14px;
  color: var(--text_faint);
  padding: 2px 4px;
}

.api_url_edit_btn:hover
{
  color: var(--text);
}

/* Speichern/Abbrechen-Zeile UNTER dem Profil-Textfeld */
.profil_edit_btn_zeile
{
  display: flex;
  gap: 8px;
  margin-top: 8px;
}

.profil_edit_btn_zeile .block_btn
{
  width: auto;
  flex: 1;
  margin: 0;
}

/* ============================================================ */
/* Generische Popup-Basis: wird von "Empfaenger hinzufuegen"      */
/* (To/CC/BCC, siehe index.php + js.js) UND "Nachrichtendetails"  */
/* (Kurzklick auf eine Nachricht) gemeinsam genutzt.               */
/* ============================================================ */
.popup_overlay
{
  position: fixed;
  inset: 0;
  background: var(--overlay);
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
}

.popup_box
{
  background: var(--bg);
  border-radius: 8px;
  width: 100%;
  max-width: 320px;
  max-height: 70vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

/* -- breitere Variante ZUSAETZLICH zu .popup_box (siehe #zl_diff_popup) --
   ueberschreibt NUR max-width, Rahmen/Farbe/Hoehe kommen weiterhin von
   .popup_box selbst. Der Standardwert (320px) waere fuer eine Versions-
   Diff-Ansicht viel zu schmal -- */
.popup_box_breit
{
  max-width: 720px;
}

/* -- Versions-Diff (#zl_diff_popup, js.js: zl_diff_html_erzeugen()): reiner
   zeilenweiser Text-Vergleich der GEWAEHLTEN alten Version gegen die aktuelle.
   white-space:pre-wrap erhaelt Original-Einrueckung/Mehrfach-Leerzeichen 1:1
   (ein ehrlicher Diff darf das nicht wegkollabieren), word-break verhindert
   Ueberlauf bei langen Woertern/URLs -- */
.zl_diff_zeile
{
  display: flex;
  align-items: flex-start;
  gap: 6px;
  padding: 1px 4px;
  white-space: pre-wrap;
  word-break: break-word;
  font-size: 13px;
}

.zl_diff_praefix
{
  flex: 0 0 auto;
  width: 14px;
  text-align: center;
  font-weight: bold;
  color: var(--text_muted);
}

/* -- flex:1 + min-width:0 noetig, sonst nimmt der Flex-Item-Standard nur den
   Inhalt in voller (unumgebrochener) Breite ein -- min-width:0 hebt dabei
   die implizite Flex-Mindestbreite (= Inhaltsbreite) auf, ohne die white-
   space:pre-wrap-Umbrueche oben wuerde eine lange Zeile sonst die Popup-Box
   seitlich sprengen statt zu umbrechen -- */
.zl_diff_text
{
  flex: 1 1 auto;
  min-width: 0;
}

.zl_diff_entfernt { background: var(--err_bg); }
.zl_diff_entfernt .zl_diff_praefix { color: var(--err); }

.zl_diff_eingefuegt { background: var(--success_bg); }
.zl_diff_eingefuegt .zl_diff_praefix { color: var(--success); }

.zl_diff_gleich { color: var(--text_secondary); }

/* -- Trenner fuer zusammengefasste, unveraenderte Zeilenbloecke (Anforderung:
   bei langen ZL soll die Diff-Ansicht nicht ausufern) -- */
.zl_diff_trenner
{
  text-align: center;
  color: var(--text_muted);
  font-size: 12px;
  padding: 4px 0;
  background: var(--bg_subtle);
}

.popup_kopf
{
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 14px;
  border-bottom: 1px solid var(--border);
  font-weight: bold;
}

.popup_x
{
  border: none;
  background: none;
  cursor: pointer;
  font-size: 14px;
  color: var(--close);
}

/* Suchfeld ueber der Kontaktliste im Empfaenger-Popup, siehe js.js: empfaenger_popup_filtern() */
.popup_suche
{
  display: block;
  width: 100%;
  /* -- rechts Platz fuer den ueberlagerten "X"-Button lassen (siehe .such_x_btn) -- */
  padding: 8px 32px 8px 14px;
  border: none;
  border-bottom: 1px solid var(--border);
  outline: none;
  font-size: 14px;
}

.popup_liste
{
  overflow-y: auto;
  /* -- gleiches Padding wie .popup_kopf (Anforderung: einheitliches Padding
     im Inhaltsbereich aller Popups) -- .label_pillen_liste (Label-/Kategorie-
     Filter-Popups) hat bereits ihr eigenes, identisches Padding und ueberschreibt
     das hier (steht weiter unten in der Datei, siehe dort) --*/
  padding: 10px 14px;
}

.popup_zeile
{
  display: block;
  width: 100%;
  text-align: left;
  padding: 8px 14px;
  border: none;
  background: none;
  cursor: pointer;
  font-size: 14px;
}

/* -- Passwort-Popup (siehe index.php: #zl_pw_popup, js.js: zl_pw_popup_anzeigen())
   -- einziges Popup im Projekt mit MEHREREN gestapelten .popup_suche-Feldern,
   die brauchen dafuer sichtbaren Abstand -- betrifft NUR dieses Popup, .popup_suche
   selbst bleibt fuer alle anderen (einzelnen) Suchfelder unangetastet -- */
#zl_pw_popup_inhalt input[type="password"]
{
  margin-bottom: 8px;
  border: 1px solid var(--border_input);
  border-radius: 6px;
}

#zl_pw_popup_inhalt .block_btn
{
  width: 100%;
  margin-top: 4px;
}

.popup_zeile:hover
{
  background: var(--bg_hover);
}

/* ============================================================ */
/* Push-Modal (siehe h.php: #push_banner, push.js): bewusst auffaelliger */
/* als die anderen Popups -- soll nicht uebersehen werden koennen.      */
/* ============================================================ */
.push_modal_box
{
  max-width: 360px;
}

.push_modal_inhalt
{
  padding: 16px 18px 18px;
  text-align: center;
}

.push_modal_inhalt p
{
  margin: 0 0 16px;
  font-size: 15px;
  line-height: 1.4;
}

.push_modal_buttons
{
  display: flex;
  flex-direction: column;
  gap: 8px;
}

/* -- Gemeinsame Basis fuer alle "Akzent"-CTA-Buttons im Projekt (aktivieren/
   bestaetigen/einfuegen) -- Hintergrund/Schrift/Cursor/Hover EINMAL hier, siehe
   auch .format_dropdown_tabelle_menu button.format_dropdown_tabelle_einfuegen_btn
   weiter unten (Tabelle-Dropdown-Button) -- Groesse/Rahmen/Ausrichtung bleiben
   je Einsatzort in der jeweils eigenen Regel (unterschiedliche Kontexte: hier
   volle Breite im Popup, dort schmal im Dropdown) --*/
.push_modal_btn_ja,
.format_dropdown_tabelle_menu button.format_dropdown_tabelle_einfuegen_btn
{
  background: var(--accent);
  color: #fff;
  font-weight: bold;
  cursor: pointer;
}

.push_modal_btn_ja:hover,
.format_dropdown_tabelle_menu button.format_dropdown_tabelle_einfuegen_btn:hover
{
  background: var(--accent_hover);
}

.push_modal_btn_ja
{
  padding: 10px;
  border: none;
  border-radius: 6px;
  font-size: 14px;
}

.push_modal_btn_nein
{
  padding: 10px;
  border: none;
  border-radius: 6px;
  background: none;
  color: var(--text_secondary);
  font-size: 13px;
  cursor: pointer;
}

/* Tastenkombinationen-Popup, siehe tastenkombis.php + tastenkombis_oeffnen() in js.js */
.tastenkombis_tabelle
{
  width: 100%;
  border-collapse: collapse;
}

.tastenkombis_tabelle td
{
  padding: 8px 4px;
  border-bottom: 1px solid var(--border);
  font-size: 13px;
  color: var(--text);
}

.tastenkombis_tabelle td:first-child
{
  white-space: nowrap;
  padding-right: 14px;
}

.tastenkombis_tabelle kbd
{
  display: inline-block;
  padding: 2px 7px;
  border: 1px solid var(--border_input);
  border-bottom-width: 2px;
  border-radius: 4px;
  background: var(--bg_kbd);
  font-family: monospace;
  font-size: 12px;
  color: var(--text);
}

.mitglieder_liste
{
  list-style: none;
  margin: 0;
  padding: 0;
}

.mitglieder_liste li
{
  padding: 5px 0;
  border-bottom: 1px solid var(--border);
  font-size: 14px;
  cursor: pointer;
}

.mitglieder_liste li:hover
{
  background: var(--bg_hover);
}

/* "Labels verwalten"-Popup, siehe labels_verwalten.php */
.label_verwalten_zeile
{
  padding: 8px 0;
  border-bottom: 1px solid var(--border);
}

.label_verwalten_anzeige
{
  display: flex;
  align-items: center;
  gap: 6px;
}

.label_verwalten_edit
{
  margin-top: 8px;
}

.label_verwalten_name
{
  flex: 1;
  min-width: 0;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  padding: 5px 8px;
  font-size: 13px;
}

/* Push-Checkbox im eigenen Profil: direkt ueber "Profil bearbeiten" */
.pushs_zeile
{
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 0 0 10px 0;
  font-size: 13px;
  color: var(--text);
  cursor: pointer;
}

.pushs_zeile input
{
  cursor: pointer;
}

/* Block-Button in der Profil-Ansicht: zwischen Namen und Blindtext */
.block_btn
{
  display: block;
  width: 100%;
  padding: 7px 10px;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  background: var(--bg_hover);
  color: var(--text);
  font-size: 13px;
  cursor: pointer;
  margin: 0 0 10px 0;
}

.block_btn:hover
{
  background: var(--bg_btn_hover);
}

/* "ZL löschen"/"ZL verlassen" (siehe zl_details.php) -- bewusst rot abgesetzt
   von den neutralen .block_btn, damit diese "gefaehrliche Zone" auffaellt */
.danger_btn
{
  display: block;
  width: 100%;
  padding: 7px 10px;
  border: 1px solid var(--err_border);
  border-radius: 4px;
  background: var(--err_bg);
  color: var(--err);
  font-size: 13px;
  cursor: pointer;
  margin: 14px 0 0 0;
}

.danger_btn:hover
{
  background: var(--err_bg_hover);
}

/* ============================================================ */
/* Mittlere Spalte: Format-/Speichern-Leiste des Editors         */
/* ============================================================ */

/* Namenssuche-Vorschlaege bei "nur ich und diese User" (ZL-Freigabe, siehe
   zl_details.php + js.js: zl_freigabe_suchen()) */
.empfaenger_vorschlag
{
  display: block;
  width: 100%;
  text-align: left;
  padding: 6px 8px;
  border: none;
  border-bottom: 1px solid var(--border);
  background: none;
  cursor: pointer;
  font-size: 13px;
  color: var(--text);
}

.empfaenger_vorschlag:hover
{
  background: var(--bg_hover);
}

/* Label-/Kategorie-Filter-Popups (siehe index.php) + Label-Auswahl in
   zl_details.php: anklickbare Pillen, Mehrfachauswahl */
.label_pillen_liste
{
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 10px 14px;
}

.filter_pille
{
  padding: 5px 10px;
  border: 1px solid var(--border_input);
  border-radius: 14px;
  background: var(--bg_hover);
  color: var(--text);
  font-size: 12px;
  cursor: pointer;
}

.filter_pille:hover
{
  background: var(--bg_btn_hover);
}


.filter_pille.aktiv
{
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}

/* Bild-Vorschau + Fortschrittsbalken im Editor, siehe js.js:
   composer_bild_ausgewaehlt() -- per JS auf "flex" gestellt sobald ein Bild
   ausgewaehlt/gezogen wurde */
.composer_bild_vorschau
{
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border);
}

#composer_bild_vorschau_img
{
  width: 44px;
  height: 44px;
  object-fit: cover;
  border-radius: 6px;
  flex-shrink: 0;
  background: var(--bg_subtle);
}

/* -- Datei-Upload (Anforderung): GENAU dieselbe Vorschau-Zeile wie beim Bild-
   Upload (.composer_bild_vorschau, .composer_bild_status, die Fortschritts-
   leiste und .composer_bild_fehler werden 1:1 mitgenutzt, siehe zl_ansicht.php)
   -- nur das Bild-Thumbnail ist hier durch ein einfaches Symbol ersetzt (ein
   ZIP/PDF laesst sich ja nicht sinnvoll als Bild anzeigen), plus der
   Dateiname als eigene Zeile darueber im Fortschrittsbereich (bei einem Bild
   reicht die Vorschau selbst, ein Dateiname braucht es dort nicht extra) -- */
.composer_datei_symbol
{
  width: 44px;
  height: 44px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
  border-radius: 6px;
  background: var(--bg_subtle);
}

.composer_datei_name
{
  display: block;
  font-size: 13px;
  color: var(--text_secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin-bottom: 4px;
}

.composer_bild_status
{
  flex: 1;
  min-width: 0;
}

.composer_bild_fortschritt_leiste
{
  height: 6px;
  border-radius: 3px;
  background: var(--bg_subtle);
  overflow: hidden;
}

.composer_bild_fortschritt_balken
{
  height: 100%;
  width: 0%;
  background: var(--accent);
  transition: width 0.2s ease;
}

.composer_bild_fehler
{
  display: block;
  margin-top: 3px;
  font-size: 12px;
  color: var(--err);
}

/* -- "Bitte warten"-Popup waehrend Bild-/Datei-Upload (siehe zl_ansicht.php:
   #upload_warten_popup, js.js: upload_warten_popup_zeigen()) -- nutzt fuer
   Hintergrund/Box bewusst die vorhandenen .popup_overlay/.popup_box (siehe
   weiter unten in dieser Datei), hier nur der eigene Inhalt (Text/Prozent) --*/
.upload_warten_box
{
  padding: 24px 20px;
  text-align: center;
  max-width: 260px;
}

.upload_warten_box p
{
  margin: 0 0 14px;
  color: var(--text);
  font-size: 14px;
}

.upload_warten_prozent
{
  display: block;
  margin-top: 8px;
  font-size: 13px;
  color: var(--text_muted);
}

.composer_bild_entfernen_btn
{
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid var(--border_input);
  background: var(--bg_hover);
  cursor: pointer;
  font-size: 12px;
  line-height: 1;
}

/* Bild-Vollbild-Popup (Klick auf ein Bild im gerenderten Markdown), siehe js.js:
   msg_bild_vollbild() -- bewusst KEIN .popup_box (kein weisser Rahmen), das
   Bild soll den ganzen Bildschirm fuellen koennen */
.bild_vollbild_popup
{
  position: fixed;
  inset: 0;
  z-index: 250;
  background: rgba(0,0,0,0.9);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
}

.bild_vollbild_popup img
{
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

.bild_vollbild_x
{
  position: absolute;
  top: 14px;
  right: 14px;
  color: #fff;
  font-size: 18px;
  background: rgba(255,255,255,0.15);
  width: 36px;
  height: 36px;
  border-radius: 50%;
}

/* Editor-Textarea -- direktes Flex-Kind von #zl_editor_ansicht (display:flex/
   column, siehe dort), traegt deshalb flex:1 (fuellt von Anfang an die
   komplette verfuegbare Hoehe aus, waechst NICHT erst mit dem Inhalt).
   BEWUSST KEIN eigenes min-height mehr (Anforderung) -- eine feste
   Untergrenze wuerde genau dann greifen, wenn am wenigsten Platz da ist
   (Tastatur offen auf kleinem Screen). BEWUSST OHNE Zeilennummern-Gutter
   (Anforderung: "wegen Verzoegerung beim Tippen auf dem Handy raus") --
   bricht ganz normal am Zeilenende um. */
#zl_text
{
  font-family: 'Courier New';
  display: block;
  flex: 1;
  min-height: 0; /* WICHTIG: ohne diesen Wert kann ein Flex-Item per Default nicht unter seine Content-Hoehe schrumpfen */
  border: 1px solid var(--border_input);
  border-radius: 6px;
  padding: 10px 12px;
  font-size: 14px;
  resize: none;
  overflow-y: auto;
  line-height: 1.4;
  outline: none;
}

/* Formatierungs-/Speichern-Leiste ueber dem Editor, siehe zl_ansicht.php:
   #zl_editor_kopf -- wrapped bei Bedarf auf mehrere Zeilen um, da recht
   viele Buttons (deckt praktisch alles ab, was markdown.js rendern kann).
   IMMER sichtbar (display:flex, KEIN JS-Toggle mehr): seit die Editor-Spalte
   permanent neben der gerenderten Ansicht steht (Anforderung), gibt es
   keinen separaten "Bearbeiten-Modus" mehr, der sie ein-/ausblenden muesste
   -- die ganze Leiste steckt server-seitig ohnehin nur im DOM, wenn
   Schreibrecht besteht (siehe zl_ansicht.php: $darf_schreiben) --*/
.chat_format_leiste
{
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border);
}

.format_btn
{
  padding: 4px 8px;
  border: 1px solid var(--border_input);
  border-radius: 12px;
  background: var(--bg_hover);
  color: var(--text);
  font-size: 12px;
  cursor: pointer;
  white-space: nowrap;
}

.format_btn:hover
{
  background: var(--bg_btn_hover);
}

/* -- aktive Vorschau optisch hervorheben (wie ein "gedrueckter" Button), siehe
   js.js: chat_vorschau_umschalten() -- gilt hier ueber .format_btn.aktiv statt
   einer eigenen ID-Regel, da #chat_vorschau_btn jetzt selbst ein ganz normaler
   .format_btn INNERHALB der Formatierungs-Leiste ist (siehe index.php) -- */
.format_btn.aktiv
{
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
}

/* -- Gruppierte Format-Buttons (Bild/Link/Farbe/Liste/Ueberschrift/Code,
   Anforderung: "Buttons zusammenfassen und in einem Untermenue genauer
   fragen") -- .format_dropdown ist der positionierte Rahmen um Auswahl-Button
   + aufklappbares Menue, siehe js.js: format_dropdown_umschalten() --
   display:inline-flex statt inline-block, damit der Rahmen exakt so hoch wie
   der Button selbst ist (kein zusaetzlicher Abstand innerhalb des
   flex-wrap der uebergeordneten Leiste) --*/
.format_dropdown
{
  position: relative;
  display: inline-flex;
}

/* -- Aufklappmenue: standardmaessig unsichtbar, per JS auf 'flex' gestellt --
   position:absolute HAENGT am .format_dropdown-Rahmen (relative, s.o.), liegt
   also unabhaengig vom Scroll-/Zeilenumbruch der Formatierungs-Leiste immer
   direkt UNTER dem zugehoerigen Auswahl-Button --*/
.format_dropdown_menu
{
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 20;
  flex-direction: column;
  gap: 2px;
  margin-top: 2px;
  padding: 4px;
  min-width: 170px;
  background: var(--bg);
  border: 1px solid var(--border_input);
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.2);
}

/* -- Eintraege im Aufklappmenue: eigener, schlichterer Stil als .format_btn
   (keine Pillenform, linksbuendig, volle Breite -- typisches Dropdown-Menue) --*/
.format_dropdown_menu button
{
  padding: 6px 10px;
  border: none;
  border-radius: 4px;
  background: none;
  color: var(--text);
  font-size: 13px;
  text-align: left;
  white-space: nowrap;
  cursor: pointer;
}

.format_dropdown_menu button:hover
{
  background: var(--bg_hover);
}

/* -- Zeilen-/Spalten-Eingabe im Tabelle-Dropdown (siehe zl_ansicht.php:
   #format_dropdown_tabelle, js.js: composer_format_tabelle_einfuegen()) --
   eigene Regel noetig, weil .format_dropdown_menu button oben NUR fuer
   <button> gilt, nicht fuer die <label>/<input type=number> hier drin --*/
.format_dropdown_tabelle_menu label
{
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 4px 6px;
  font-size: 13px;
  color: var(--text);
}

.format_dropdown_tabelle_menu input[type="number"]
{
  width: 50px;
  padding: 3px 6px;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  background: var(--bg);
  color: var(--text);
  font-size: 13px;
}

/* -- "Einfuegen"-Button im Tabelle-Dropdown: eigener Button-Look (Rahmen,
   zentriert) statt des generischen .format_dropdown_menu button (linksbuendig,
   kein Rahmen/Hintergrund -- sieht dort wie reiner Text aus, nicht als Button
   erkennbar -- Bugreport). Hintergrund/Schrift/Hover kommen aus der
   gemeinsamen .push_modal_btn_ja-Regel weiter oben (dieselbe Klasse steht dort
   in der Selektor-Liste), hier nur noch Groesse/Rahmen/Ausrichtung, die sich
   vom breiten Popup-Button unterscheiden. Hoehere Selektor-Spezifitaet
   (2 Klassen + Element) noetig, damit es .format_dropdown_menu button
   zuverlaessig ueberschreibt --*/
.format_dropdown_tabelle_menu button.format_dropdown_tabelle_einfuegen_btn
{
  margin-top: 4px;
  padding: 6px 10px;
  border: 1px solid var(--border_input);
  border-radius: 4px;
  font-size: 13px;
  text-align: center;
  white-space: nowrap;
}

/* -- Speichern: letzter Button IN DERSELBEN Formatierungs-Leiste (Anforderung:
   keine eigene Zeile mehr), aber rechtsbuendig -- margin-left:auto schiebt ihn
   innerhalb seiner eigenen Zeile des flex-wrap ganz nach rechts (frisst den
   gesamten uebrigen Platz VOR sich auf), ohne die vorherigen Buttons
   umzubauen. Faellt die Leiste um (schmaler Bildschirm), rutscht er ganz
   natuerlich als erster in die naechste Zeile und steht dort weiterhin ganz
   rechts -- funktioniert unabhaengig davon, wie viele Buttons/Zeilen es sind --*/
#zl_speichern_btn
{
  margin-left: auto;
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  font-weight: bold;
}

#zl_speichern_btn:hover
{
  background: var(--accent_hover);
}
