/* ==========================================================================
   Online Ticketing HausNotruf – Remastered 2026
   Design-System (CSS Custom Properties)
   --------------------------------------------------------------------------
   WICHTIG: Alle bestehenden Klassennamen unterhalb bleiben unveraendert
   erhalten (keine Umbenennung, keine Entfernung) - nur Eigenschaftswerte
   (Farbe/Schrift/Abstand) wurden modernisiert. Keine HTML-Struktur, keine
   IDs, keine name-Attribute werden durch dieses Stylesheet beeinflusst.
   ========================================================================== */

:root {
	/* Corporate-Farbwelt, wiedererkennbar (bestehende Markenfarben) */
	--color-primary: #2F4592;        /* Dunkelblau - bestehende LinkText-/Nav-Farbe */
	--color-primary-dark: #22346E;
	--color-secondary: #AC163C;      /* Dunkelrot/Bordeaux - bestehende UeberschriftMittel-/Footer-Farbe */
	--color-accent: #2F4592;
	--color-success: #1E7B34;        /* neu: fuer Online-/Erfolgsstatus */
	--color-warning: #B8860B;        /* neu: kontrolliertes Gelb/Amber fuer Hinweise */
	--color-warning-subtle: #FFF6DC;
	--color-danger: #C0272D;         /* neu: kontrolliertes Rot fuer kritische Aktionen */
	--color-danger-strong: #E30613;  /* bestehendes kraeftiges Eskalations-Rot */
	--color-danger-subtle: #FDECEC;  /* Kartenoptimierung Runde 3: dezenter hellroter Hintergrund
	                                     fuer Kontakthinweis-Kennzeichnung, analog --color-warning-subtle */
	--color-park: #1565C0;           /* neu (Phase D.4): "Blau = Parken"-Semantik, ersetzt frueheres Gelb */
	--color-park-subtle: #E3F0FC;
	--color-priority: #FFCC00;        /* Kartenoptimierung: benannt statt hartcodiert - bestehende
	                                      "Hohe Dringlichkeit"-Farbe (unveraendert, nur als Token
	                                      gefasst), siehe Punkt 2/10 des Auftrags. */
	--color-priority-text: #7A5B00;   /* bestehende, bereits verwendete dunkle Textfarbe auf Gelb */
	--color-info-subtle: #E8EEFB;     /* neu (Phase E, Schritt 3): neutraler Info-Hinweis (z. B.
	                                      "weitere aktive Tickets zum Kontakt") - bewusst NICHT
	                                      --color-park/-park-subtle wiederverwendet, da das eine
	                                      andere, bereits belegte Bedeutung ("Geparkt") traegt; auch
	                                      NICHT --color-priority (Auftrag Punkt 18: Info ungleich
	                                      Prioritaet). Farbton an --color-primary angelehnt. */
	--color-personal: #6E4A9E;        /* neu (Auftrag "Persönliche Notizen", 21.09.2026): eigener
	                                      Violett-Ton fuer "privat/persoenlich" - bewusst NICHT Rot/
	                                      Gelb (laesst sonst wie eine Warnung/Fehlermeldung wirken,
	                                      siehe Auftrag Punkt 4: "nicht wie eine Warn- oder
	                                      Fehlermeldung aussehen") und bislang semantisch unbelegt. */
	--color-personal-subtle: #F1ECFB;
	--color-personal-dark: #4E3470;   /* Textfarbe auf --color-personal-subtle, Kontrast >6:1 */

	/* Container-Kopfleisten (20.08.2026, "Ticket-Detailansicht optisch
	   vereinheitlichen"): dunkle Variante je Farbfamilie, urspruenglich fuer
	   den vollflaechigen Titelbereich gedacht (seit 21.08.2026 nur noch als
	   Textfarbe/--panel-title genutzt, siehe .tc-detail-value--.../
	   .tc-detail-notes). Werte bewusst NICHT rein mathematisch abgedunkelt,
	   sondern einzeln so gewaehlt, dass Text/Icons zuverlaessig gut lesbar
	   bleiben (Kontrastverhaeltnis jeweils > 6:1) und der Eindruck ruhig/
	   professionell bleibt, nicht grell (Auftrag Punkt 5). --color-primary-
	   dark (Blau, Termin) existierte bereits und wird hier wiederverwendet.
	   --color-neutral-dark wird seit "Ticketfarbe als durchgaengige
	   Akzentfarbe" (21.08.2026) im normalen/neutralen Fall NICHT mehr
	   verwendet (dort greift jetzt --ticket-accent-dark, siehe
	   .tc-ticket-area) - bewusst nicht geloescht, falls irgendwo weiterhin
	   ein rein neutraler (nicht ticketfarbabhaengiger) dunkler Grauton
	   gebraucht wird. */
	--color-neutral-dark: #4B5563;    /* aktuell ungenutzt, siehe Kommentar oben */
	--color-success-dark: #155A26;    /* Textfarbe Wert gutgeschrieben */
	--color-danger-dark: #8B1E22;     /* Textfarbe Wert entwertet */
	--color-warning-dark: #6B4E00;    /* Textfarbe Interne Notizen/Hinweise */

	--color-background: #F3F4F6;     /* neutrale helle Flaeche statt kraeftiger Farbflaechen */
	--color-surface: #FFFFFF;
	--color-border: #D7D9DD;
	--color-border-strong: #B9BCC2;
	--color-text: #1F2328;
	--color-text-muted: #5B6270;
	--color-text-on-dark: #FFFFFF;

	--radius-small: 4px;
	--radius-medium: 8px;
	--radius-large: 14px;

	--shadow-small: 0 1px 2px rgba(20, 20, 30, 0.06);
	--shadow-medium: 0 4px 14px rgba(20, 20, 30, 0.10);

	--spacing-xs: 4px;
	--spacing-sm: 8px;
	--spacing-md: 16px;
	--spacing-lg: 24px;
	--spacing-xl: 40px;

	/* Korrektur (12.08.2026): der vorherige Kommentar hier behauptete faelschlich,
	   --app-max-width werde von keiner Regel konsumiert - das war zum Zeitpunkt
	   des Schreibens bereits ueberholt. --app-max-width wird aktiv verwendet
	   (siehe "body > table" weiter unten, Abschnitt "Layout-Grundueberarbeitung") -
	   es zentriert/begrenzt die aeusserste Seitentabelle bereits seit Phase B.
	   --sidebar-left-width bleibt weiterhin ein reiner Design-Token ohne aktiven
	   Verbraucher: die linke Navigationsspalte (159px) ist als HTML-<td width=
	   "...">-Attribut in jeder einzelnen Seite hart codiert, nicht zentral
	   (siehe Facelift_Analyse_und_Plan.md). --sidebar-right-width dagegen hat
	   seit dem Feinschliff vom 01.09.2026 (Auftrag "Neue Hauptnavigation und
	   Seitenlayout weiter anpassen", Punkt 4: strukturelle Vorbereitung einer
	   kuenftigen rechten Sidebar) wieder einen echten Verbraucher - siehe weiter
	   unten die :last-child-Regel auf der rechten Rahmenzelle. Max-Breite von
	   1600px auf 1700px (Layout-Grundueberarbeitung 12.08.2026) und jetzt auf
	   1900px angehoben (Feinschliff 01.09.2026) - die zusaetzlichen 200px
	   entsprechen genau --sidebar-right-width, damit die neue rechte Spalte auf
	   grossen Monitoren nicht zu Lasten der bisherigen Arbeitsbereichsbreite
	   geht, sondern den dort ohnehin ungenutzten Rand sinnvoll fuellt; auf
	   sehr breiten (2560px+) Bildschirmen bleiben Zeilen weiterhin nicht
	   unlesbar lang, da die Tabelle insgesamt weiterhin begrenzt ist. */
	--sidebar-left-width: 200px;
	/* Statusleiste ueberarbeiten (03.09.2026): von 200px auf 260px angehoben
	   (samt --app-max-width entsprechend von 1900px auf 1960px) - die neue
	   permanente Statusleiste (framework/Statusleiste/Default.php) zeigt
	   deutlich groessere Kennzahlen als die vorherige, rein leere
	   Reservierung, dafuer braucht es etwas mehr Platz/Innenabstand. */
	--sidebar-right-width: 260px;
	--app-max-width: 1960px;

	--font-system: system-ui, "Segoe UI", Arial, sans-serif;
}

/* ==========================================================================
   Dunkle Darstellung (29.09.2026, Auftrag "Persistente Benutzerfilter ...
   Dark-/Light-Mode"): dieselben Design-Tokens wie oben, nur mit dunklen
   Werten - gesetzt ueber data-theme="dunkel" auf <html> (siehe
   tc_pref_theme_bootstrap() in includes/tc_praeferenzen.php, laeuft im
   <head> vor dem ersten Rendern). Statusfarben behalten ihre Bedeutung
   (Gelb = Prioritaet, Rot = Eskalation/kritisch, Blau = Parken, Gruen =
   Erfolg), nur Flaechen/Text/Rahmen und die "-subtle"/"-dark"-Varianten
   werden an den dunklen Hintergrund angepasst. Hart kodierte Restfarben
   werden gesammelt im Abschnitt "Dunkle Darstellung - Korrekturen" am
   Dateiende behandelt.
   ========================================================================== */
:root[data-theme="dunkel"] {
	color-scheme: dark;
	--color-primary: #5B78D6;
	--color-primary-dark: #8FA7F2;
	--color-secondary: #E0567A;
	--color-accent: #5B78D6;
	--color-success: #3FAE5E;
	--color-warning: #D9A62B;
	--color-warning-subtle: #3A3214;
	--color-danger: #E0484F;
	--color-danger-strong: #FF3B45;
	--color-danger-subtle: #3E1F22;
	--color-park: #4D93E8;
	--color-park-subtle: #17293F;
	--color-priority: #FFCC00;
	--color-priority-text: #3A2C00;
	--color-info-subtle: #1C2642;
	--color-personal: #A07ED6;
	--color-personal-subtle: #2B2338;
	--color-personal-dark: #D4C1F2;
	--color-neutral-dark: #C3C8D0;
	--color-success-dark: #7DD694;
	--color-danger-dark: #F4A3A6;
	--color-warning-dark: #F0D27A;
	--color-background: #11151B;
	--color-surface: #1B2029;
	--color-border: #333A46;
	--color-border-strong: #4A5261;
	--color-text: #E4E7EC;
	--color-text-muted: #A3ABB8;
	--color-text-on-dark: #FFFFFF;
	--shadow-small: 0 1px 2px rgba(0, 0, 0, 0.45);
	--shadow-medium: 0 4px 14px rgba(0, 0, 0, 0.55);
}


/* ==========================================================================
   Bestehende Basis-Selektoren - Werte modernisiert, Namen unveraendert
   ========================================================================== */

.TextNormal {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	text-decoration: none;
}

.ZitatinRahmen {
	font-family: var(--font-system);
	font-size: 15px;
	font-style: italic;
	color: var(--color-text-muted);
}

body {
	background-color: var(--color-background);
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
}



.TextFett {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	font-weight: bold;
	text-decoration: none;
}

a:hover {
	text-decoration: none;
	border: none;
	background-color: var(--color-primary);
	color: #FFF;
	border-radius: var(--radius-small);
}
.UeberschriftText {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	font-weight: bold;
	text-decoration: none;

}
.TextTabelle {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	background-color: var(--color-background);
}
.UeberschriftMittel {
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-text-on-dark);
	background-color: var(--color-secondary); /* Phase B: Hauptnav bleibt in der wiedererkennbaren Bordeaux-Farbwelt */
	text-decoration: none;
	font-weight: 600;
	letter-spacing: .01em;


}
/* Phase B: Hover-/Active-/Focus-States der Hauptnavigation. .active-nav wird
   rein visuell in framework/Kopfzeile/Default.php anhand von $_SERVER['SCRIPT_NAME']
   vergeben - keine URL-/Funktionsaenderung. */
a.UeberschriftMittel {
	display: block;
	padding: 12px 4px;
	transition: background-color .12s ease;
}
a.UeberschriftMittel:hover {
	background-color: var(--color-primary);
	color: #FFF;
	border: none;
	border-radius: 0;
}
a.UeberschriftMittel:focus-visible {
	outline: 2px solid #FFF;
	outline-offset: -3px;
}
a.UeberschriftMittel.active-nav {
	background-color: var(--color-primary-dark);
	box-shadow: inset 0 -3px 0 0 #FFF;
}
.LinkText {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-primary);
	text-decoration: none;
	font-weight: bold;

}
.EingabeFeld {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	background-color: var(--color-surface);
	text-decoration: none;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 8px 10px;
	min-height: 38px;
	box-sizing: border-box;
}
.EingabeButton {
	font-family: var(--font-system);
	font-size: 15px;
	color: #FFF;
	font-weight: 600;
	background-color: var(--color-primary);
	border: 1px solid var(--color-primary-dark);
	border-radius: var(--radius-small);
	padding: 8px 18px;
	min-height: 38px;
	cursor: pointer;

}
.EingabeButton:hover {
	background-color: var(--color-primary-dark);
}
.LinkTextKlein {

	font-family: var(--font-system);
	font-size: 13px;
	color: var(--color-primary);
	text-decoration: none;
}
.LinkTextDuenn {
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-primary);
	text-decoration: none;
	font-weight: normal;
}
.UeberschriftSeite {
	font-family: var(--font-system);
	font-size: 20px;
	color: var(--color-text);
	font-weight: 700;
	text-decoration: none;

}
.LinkTextDuennBlau {

	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-primary);
	text-decoration: none;
	font-weight: normal;
}
.TabelleLinieUnten {
	font-family: var(--font-system);
	font-size: 14px;
	color: #FFFFFF;
	text-decoration: none;
	font-weight: bold;
	background-color: var(--color-primary);
	border: none;
}
.TabelleLinieUntenTEXT {
	font-family: var(--font-system);
	font-size: 14px;
	color: #FFFFFF;
	text-decoration: none;
	font-weight: bold;
	background-color: var(--color-primary);
}
.LinieUntenTextNormal {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	border-bottom-width: 1px;
	border-bottom-style: solid;
	border-bottom-color: var(--color-border-strong);
}
.LinieRundumTextNormal {
	font-family: var(--font-system);
	font-size: 15px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	color: var(--color-text);
	background-color: var(--color-surface);
}

.LinkaufGrau { font-family: var(--font-system); font-size: 14px; font-style: normal; font-weight: bold; font-variant: normal; color: var(--color-primary); text-decoration: none }
.UeberschriftaufGrau {  font-family: var(--font-system); font-size: 16px; font-style: normal; font-weight: bold; font-variant: normal; color: var(--color-text); text-decoration: none}

.TextKommentar {
	font-family: var(--font-system);
	font-size: 13px;
	color: var(--color-text-muted);
	text-decoration: none;
	font-style: normal;
}



.LinkaufRot {
font-family: var(--font-system); font-size: 14px; font-style: normal; font-weight: bold; font-variant: normal; color: var(--color-primary); text-decoration: none
}
.UeberschriftaufSW {
	font-family: var(--font-system);
	font-size: 22px;
	color: var(--color-primary);
	font-weight: 700;
	text-decoration: none;
}
.ZitatTitel {
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-text-muted);
	background-color: transparent;
	text-decoration: none;
	font-style: italic;
	font-weight: normal;
}
.BildSW {
	filter: Gray;
}
.EingabeButtonKlein {
	font-family: var(--font-system);
	font-size: 14px;
	color: #FFF;
	font-weight: 600;
	background-color: var(--color-primary);
	border: 1px solid var(--color-primary-dark);
	border-radius: var(--radius-small);
	padding: 6px 14px;
	min-height: 36px;
	cursor: pointer;
}
.EingabeButtonKlein:hover {
	background-color: var(--color-primary-dark);
}
.EingabeFeldKlein {
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-text);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 6px 10px;
	min-height: 36px;
	box-sizing: border-box;
}
.TextKommentar2 {
	font-family: var(--font-system);
	font-size: 12px;
	color: var(--color-text-muted);
	text-decoration: none;
	font-style: normal;
}
.Eskaliert {
	font-family: var(--font-system);
	font-size: 24px;
	color: #FFF;
	font-weight: 700;
	text-decoration: none; /* frueher "blink" - bewusst entfernt: weiterhin deutlich rot, aber ruhig */
	background-color: var(--color-danger-strong);
	border-radius: var(--radius-small);
}
.SchnellButton {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	font-weight: bold;
	background-color: var(--color-surface);
	height: 40px;
	width: 180px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	text-decoration: none;
}
.EingabeFeldExtraGross {
	font-family: var(--font-system);
	font-size: 16px;
	color: var(--color-text);
	background-color: var(--color-surface);
	text-decoration: none;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 8px 10px;
}

/* ==========================================================================
   Neu: Zusaetzliche Klassen fuer den App-Rahmen (Kopf-/Fusszeile, Gutter)
   Werden NUR zusaetzlich zu bestehenden bgcolor-Attributen vergeben, um
   diese optisch zu ueberschreiben, ohne bgcolor/Tabellenstruktur zu entfernen.
   ========================================================================== */

.app-rahmen-kante {
	background-color: var(--color-border-strong) !important;
}
.app-rahmen-gutter {
	background-color: var(--color-background) !important;
}
.app-header-flaeche {
	background-color: var(--color-surface) !important;
	/* Fehlerrunde (24.09.2026), Punkt 3 "Header kompakter": Trennlinie zog
	   bisher unter der GESAMTEN Zeile durch, also auch unter Logo/Wortmarke/
	   SMS-/E-Mail-Badges - siehe .app-header-rechtsbereich weiter unten, das
	   die Linie jetzt gezielt unter dem gesamten rechten Bereich (inkl. Logo)
	   ueberdeckt und dadurch nur noch unter dem linken Bereich
	   (Ticketaktion/Schnellsuche) sichtbar bleibt. Linie selbst zieht deshalb
	   jetzt auf .app-header-flex um (siehe dort), nicht mehr hier. */
}
.app-adminleiste {
	background-color: var(--color-warning-subtle) !important;
	color: var(--color-text) !important;
}
/* Feinschliff (01.09.2026, Auftrag "Neue Hauptnavigation und Seitenlayout
   weiter anpassen", Punkt 5): der Footer war bisher ein kraeftiger
   Bordeaux-Balken (var(--color-secondary), die alte Hauptnav-Farbe) - ein
   deutlich sichtbares Ueberbleibsel des alten Designs, das zur jetzt hellen/
   ruhigen Navigation nicht mehr passte. Jetzt eine dezente, helle Flaeche
   (dieselbe --color-background-Toenung wie die uebrigen "Gutter"-Bereiche
   des Layouts) mit oberer Trennlinie statt einer kraeftigen Farbflaeche -
   modern, kompakt, ruhig, ohne neue Farbe einzufuehren. */
.app-footer-flaeche {
	background-color: var(--color-background) !important;
	color: var(--color-text-muted) !important;
	font-size: 12.5px;
	padding: 14px 24px;
	border-top: 1px solid var(--color-border);
}
.app-footer-copyright {
	color: var(--color-text) !important;
	text-decoration: none;
	font-weight: 700;
}
.app-footer-copyright:hover,
.app-footer-copyright:focus-visible {
	color: var(--color-primary) !important;
	text-decoration: underline;
}
/* Release-Notes-/Impressum-Link in der Fusszeile - schlichte Inline-Links
   in der neuen, dezenten Fusszeilen-Schrift statt der frueheren weissen
   Schrift auf rotem Grund. */
.app-footer-link {
	color: var(--color-text-muted);
	text-decoration: none;
	font-weight: 600;
	letter-spacing: .01em;
	transition: color .12s ease;
}
.app-footer-link:hover,
.app-footer-link:focus-visible {
	color: var(--color-primary);
	text-decoration: underline;
}
.app-statusleiste-dunkel {
	/* Phase A: frueher bgcolor="#000000" mit dunkelgrauem Text (.TextKommentar) -
	   schlechter Kontrast. Phase-B-Nacharbeit: dunkles Blau-Grau statt Nahe-Schwarz
	   bzw. statt des in Phase B zwischenzeitlich hellen Tons - kompakt, klar vom
	   Hauptinhalt abgesetzt, aber nicht staerker wirkend als die Hauptnavigation. */
	background-color: #1F2937 !important;
	color: #F3F4F6 !important;
	padding: 5px 10px;
	font-size: 12px;
	border-top: none;
}
.app-statusleiste-dunkel a,
.app-statusleiste-dunkel .TextKommentar,
.app-statusleiste-dunkel strong {
	color: #F3F4F6 !important;
}
.app-statusleiste-dunkel a:hover {
	color: #FFFFFF !important;
	background-color: var(--color-primary) !important;
	border-radius: var(--radius-small);
}
.app-statusleiste-dunkel a:focus-visible {
	outline: 2px solid #FFFFFF;
	outline-offset: 1px;
}

/* Phase-B-Nacharbeit: Zweite Navigationsebene - dezenter als die Hauptnavigation,
   Padding leicht reduziert (Vorgabe Abschnitt 4: "kompakt, aber nicht klein") */
.TextTabelle a.LinkTextDuenn {
	display: inline-block;
	padding: 6px 4px;
}
.TextTabelle a.LinkTextDuenn:hover {
	background-color: var(--color-surface);
	border-radius: var(--radius-small);
	text-decoration: underline;
}

/* Phase-B-Nacharbeit: Dritte Navigations-/Funktionszeile (Admin-Leiste) - ruhige
   helle Flaeche statt Gelb-Flaeche, Gelb nur noch als schmaler oberer Akzent */
.app-adminleiste {
	background-color: #F4F5F7 !important;
	border-top: 3px solid var(--color-warning);
	border-bottom: 1px solid var(--color-border);
	color: var(--color-primary-dark) !important;
	padding: 6px 4px;
}
.app-adminleiste a.LinkText,
.app-adminleiste a.LinkTextDuenn {
	color: var(--color-primary-dark);
}
.app-adminleiste a:hover {
	background-color: #E9ECF2;
	border-radius: var(--radius-small);
	text-decoration: underline;
}
.app-status-label {
	display: inline-block;
	font-size: 11px;
	font-weight: 600;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .02em;
}

/* Phase-B-Nacharbeit: Online-/Offline-Statuskennzeichnung - kompakter Punkt statt
   altem GIF-Icon, reines CSS, keine externe Abhaengigkeit (Vorgabe Abschnitt 2) */
.app-status-gut,
.app-status-gut a {
	color: var(--color-success) !important;
}
.app-status-schlecht,
.app-status-schlecht a {
	color: var(--color-danger) !important;
}
.app-status-gut img,
.app-status-schlecht img {
	display: none;
}
.app-status-gut a::before,
.app-status-schlecht a::before {
	content: "";
	display: inline-block;
	width: 8px;
	height: 8px;
	border-radius: 50%;
	margin-right: 5px;
	vertical-align: middle;
}
.app-status-gut a::before {
	background-color: var(--color-success);
}
.app-status-schlecht a::before {
	background-color: var(--color-danger);
}

/* Phase-B-Nacharbeit: Schnellsuche im Header/Zweitnavigation - kompaktere,
   vertikal zentrierte Ausrichtung von Feld und Button (Vorgabe Abschnitt 5).
   Ueber die Formular-ID #schnellsuche gescoped, damit die allgemeinen
   .EingabeFeldKlein/.EingabeButtonKlein-Klassen anderswo unangetastet bleiben. */
#schnellsuche {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}
#schnellsuche input.EingabeFeldKlein {
	min-height: 30px;
	padding: 4px 8px;
	font-size: 13px;
}
#schnellsuche input.EingabeButtonKlein {
	min-height: 30px;
	padding: 4px 12px;
}

/* ==========================================================================
   Phase B: Header - Flex-Ausrichtung "Neues Ticket erstellen" (links) /
   Wortmarke (rechts), nur innerhalb der bestehenden Kopfzeilen-Zelle, keine
   Aenderung an der umgebenden Tabellenstruktur.
   ========================================================================== */

.app-header-flaeche {
	/* Fehlerrunde (24.09.2026), Punkt 3: Innenabstand/Mindesthoehe reduziert -
	   spart ein paar Pixel Kopfzeilenhoehe auf jeder Seite, ohne Logo/Text/
	   Badges vertikal zu eng wirken zu lassen. */
	padding: 10px 24px;
	min-height: 52px;
	box-sizing: border-box;
}
.app-header-flex {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--spacing-md);
	width: 100%;
	/* Fehlerrunde (24.09.2026), Punkt 3: Trennlinie zur Hauptnavigation sitzt
	   jetzt hier statt auf .app-header-flaeche (siehe dortiger Kommentar) -
	   dieselbe Position/Optik, aber .app-header-rechtsbereich kann sie durch
	   eigenen Hintergrund gezielt unter Logo/Wortmarke/Badges ueberdecken. */
	border-bottom: 1px solid var(--color-border);
}
.app-header-aktion {
	display: inline-flex;
}
.app-header-cta {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	background-color: var(--color-primary);
	color: #FFF !important;
	font-size: 15px;
	font-weight: 600;
	padding: 10px 20px;
	border-radius: var(--radius-small);
	text-decoration: none !important;
	transition: background-color .12s ease;
}
.app-header-cta:hover {
	background-color: var(--color-primary-dark);
	color: #FFF !important;
}
.app-header-cta:focus-visible {
	outline: 2px solid var(--color-primary-dark);
	outline-offset: 2px;
}
.app-header-cta .tc-icon {
	stroke-width: 1.8;
	vertical-align: -1px;
}
/* Kopfnavigation und Header optimieren (01.09.2026, Auftrag Punkt 2):
   HausNotruf-Bildlogo + "Remastered 2026" vollstaendig entfernt (kein
   Bild/keine Logo-Grafik mehr an dieser Stelle) - ersetzt durch eine
   schlichte, zweizeilige Textdarstellung ("Online Ticketing" /
   "BeWo Telehealthcare GmbH"), rein per CSS gestapelt statt inline
   nebeneinander. Ersetzt die vormals dreiteilige Wortmarke (.app-header-
   marke-online/-akzent + .app-header-subtitle fuer "Remastered 2026",
   beide jetzt entfernt, da ersatzlos aus der Kopfzeile verschwunden - siehe
   framework/Kopfzeile/Default.php). */
.app-header-marke {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	line-height: 1.3;
	gap: 1px;
}
.app-header-marke-titel {
	font-family: var(--font-system);
	font-size: 16px;
	font-weight: 700;
	letter-spacing: .01em;
	color: var(--color-text);
}
.app-header-marke-untertitel {
	font-family: var(--font-system);
	font-size: 11.5px;
	font-weight: 500;
	letter-spacing: .01em;
	color: var(--color-text-muted);
}

/* Auftrag "Logo-Verwaltung in Grundeinstellungen" (18.09.2026): optionales
   Logo rechts in der Kopfzeile, ersetzt an dieser Stelle den Text-Schriftzug
   (.app-header-marke) - siehe tc_logo_markup_header(), includes/main.php.
   Feste Hoehe statt fester Breite, damit beliebige Seitenverhaeltnisse ohne
   Verzerrung (object-fit: contain) in die Kopfzeile passen. */
.app-header-logo {
	display: block;
	/* Fehlerrunde (24.09.2026), Punkt 3 "Header kompakter": Logo moderat
	   verkleinert (80px -> 60px, Breite im selben Verhaeltnis mitreduziert) -
	   passt zur insgesamt niedrigeren Kopfzeile, bleibt weiterhin gut lesbar/
	   erkennbar. */
	height: 60px;
	max-width: 330px;
	width: auto;
	object-fit: contain;
}

/* Logo in Druck-/Ausgabeansichten (Ticket-Druckansicht, Stunden-/
   Wertnachweis, Reports, Dashboard-Vollbild) - einheitlich oben rechts,
   druckfreundlich klein, siehe tc_logo_markup_druck(). */
.tc-druck-logo {
	display: block;
	position: absolute;
	top: 16px;
	right: 16px;
	height: 72px;
	max-width: 400px;
	width: auto;
	object-fit: contain;
}
@media print {
	.tc-druck-logo {
		position: fixed;
	}
}

/* Dashboard-Vollbildansicht: Logo als normales Element im bereits
   bestehenden Flex-Kopfbereich (.tc-dash-vollbild-kopf) statt frei
   positioniert - dort waere position:absolute (siehe .tc-druck-logo)
   unpassend, da Titel/Live-Status im selben Kopfbereich stehen. */
.tc-dash-vollbild-logo {
	display: block;
	height: 64px;
	max-width: 360px;
	width: auto;
	object-fit: contain;
}


/* Kurzer dynamischer Hinweistext links neben SMS-/E-Mail-Statuswidget im
   Header (Auftrag 20.09.2026, "Header-Ueberwachung fuer SMS und E-Mail
   erweitern") - nur sichtbar bei Stoerung oder neuen SMS (siehe [hidden]
   in framework/Kopfzeile/Default.php), sonst kein zusaetzlicher Platzbedarf. */
.app-header-status-hinweis {
	font-family: var(--font-system);
	font-size: 12px;
	font-weight: 600;
	color: var(--color-text-muted);
	white-space: nowrap;
}
.app-header-status-hinweis[hidden] {
	display: none;
}
.app-header-status-hinweis--fehler {
	color: var(--color-warning);
}

/* SMS-Anzeige im Header (Nutzerauftrag 18.09.2026, "Thema SMS aus der
   Seitenleiste zentriert im Header unterbringen"): ersetzt den bisherigen
   SMS-Abschnitt in der persoenlichen Statusleiste (framework/Statusleiste/
   Default.php) - dezent im Normalzustand (kein data-status/data-hat-neue-
   Sonderfall), auffaellig/"laut" bei neuen SMS (data-hat-neue="true") ODER
   einem Empfangsfehler (data-status="fehler"/"kritisch", siehe includes/
   tc_sms.php) - reine Attributselektoren, keine Klassenumschaltung noetig
   (siehe js/tc-start-live.js).
   Nachbesserung (18.09.2026, "SMS-Status-Bubble im Header verschieben"):
   vormals absolut in der geometrischen Mitte der GESAMTEN Kopfzeile
   positioniert (unabhaengig von Suchfeld-/Wortmarken-Breite) - jetzt
   normaler Teil des Flex-Ablaufs innerhalb von .app-header-rechtsbereich,
   direkt links neben der Wortmarke, nie ueberlappend mit ihr oder anderen
   Kopfzeilen-Inhalten. */
.app-header-sms {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 14px;
	border-radius: 999px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	color: var(--color-text-muted);
	font-family: var(--font-system);
	font-size: 12.5px;
	font-weight: 600;
	text-decoration: none !important;
	white-space: nowrap;
	transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.app-header-sms:hover {
	border-color: var(--color-primary);
	color: var(--color-primary) !important;
}
.app-header-sms .tc-icon {
	stroke-width: 1.8;
	flex-shrink: 0;
}
.app-header-sms-punkt {
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background-color: var(--color-text-muted);
	flex-shrink: 0;
}
.app-header-sms-badge {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 18px;
	height: 18px;
	padding: 0 5px;
	border-radius: 999px;
	background-color: var(--color-text-muted);
	color: #FFF;
	font-size: 11px;
	font-weight: 700;
	line-height: 1;
}
.app-header-sms-badge[hidden] {
	display: none;
}
/* Laut/auffaellig: neue SMS vorhanden - deutlich sichtbare Akzentfarbe +
   Puls (dieselbe Puls-Animation wie das bestehende Dashboard-/SMS-
   Lebenszeichen, siehe @keyframes tc-dash-puls weiter unten). */
.app-header-sms[data-hat-neue="true"] {
	background-color: var(--color-primary);
	border-color: var(--color-primary);
	color: #FFF;
	animation: tc-dash-puls 1.8s ease-in-out infinite;
}
.app-header-sms[data-hat-neue="true"]:hover {
	color: #FFF !important;
}
.app-header-sms[data-hat-neue="true"] .app-header-sms-badge {
	background-color: #FFF;
	color: var(--color-primary);
}
.app-header-sms[data-hat-neue="true"] .app-header-sms-punkt {
	background-color: #FFF;
}
/* Laut/auffaellig: SMS-Empfang hat einen Fehler - unabhaengig davon, ob
   gerade neue SMS vorliegen (Nutzerauftrag: "auch wenn der SMS-Empfang
   einen Fehler hat"). Nach "fehler"/"kritisch" im Quelltext platziert,
   damit bei gleichzeitig neuen SMS UND einem Fehler die Fehlerfarbe
   Vorrang hat (ein technischer Ausfall ist dringlicher als eine einzelne
   ungelesene Nachricht). */
.app-header-sms[data-status="fehler"] {
	background-color: var(--color-warning);
	border-color: var(--color-warning);
	color: #FFF;
}
.app-header-sms[data-status="fehler"]:hover {
	color: #FFF !important;
}
.app-header-sms[data-status="fehler"] .app-header-sms-badge {
	background-color: #FFF;
	color: var(--color-warning);
}
.app-header-sms[data-status="fehler"] .app-header-sms-punkt {
	background-color: #FFF;
}
.app-header-sms[data-status="kritisch"] {
	background-color: var(--color-danger-strong, #C0392B);
	border-color: var(--color-danger-strong, #C0392B);
	color: #FFF;
	animation: tc-dash-puls 1.2s ease-in-out infinite;
}
.app-header-sms[data-status="kritisch"]:hover {
	color: #FFF !important;
}
.app-header-sms[data-status="kritisch"] .app-header-sms-badge {
	background-color: #FFF;
	color: var(--color-danger-strong, #C0392B);
}
.app-header-sms[data-status="kritisch"] .app-header-sms-punkt {
	background-color: #FFF;
}
/* Nutzerauftrag (18.09.2026, "SMS-Status im Header auch signalisieren
   lassen, wenn SMS-API aus"): bewusst NEUTRAL (kein Rot/Orange - eine
   Deaktivierung ist kein Fehler), aber optisch klar von "laeuft normal"
   unterscheidbar (gestrichelter Rahmen + reduzierte Deckkraft), damit ein
   deaktivierter Zustand nicht mit dem Normalbetrieb verwechselt wird. */
.app-header-sms[data-status="deaktiviert"] {
	opacity: .55;
	border-style: dashed;
}
.app-header-sms[data-status="deaktiviert"] .app-header-sms-punkt {
	background-color: transparent;
	border: 1.5px solid var(--color-text-muted);
}

/* Nutzerauftrag (18.09.2026, "Bitte auch einen SMTP-Status in den
   Header"): gleiche Basisoptik wie .app-header-sms, absichtlich separat
   gehalten (kein gemeinsames Umbenennen/Refactoring der bereits
   produktiven SMS-Bubble) - kein Neu-Zaehler/Puls, da SMTP kein
   "neue Nachricht"-Konzept hat. */
.app-header-smtp {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 14px;
	border-radius: 999px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	color: var(--color-text-muted);
	font-family: var(--font-system);
	font-size: 12.5px;
	font-weight: 600;
	text-decoration: none !important;
	white-space: nowrap;
	transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.app-header-smtp:hover {
	border-color: var(--color-primary);
	color: var(--color-primary) !important;
}
.app-header-smtp .tc-icon {
	stroke-width: 1.8;
	flex-shrink: 0;
}
.app-header-smtp-punkt {
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background-color: var(--color-text-muted);
	flex-shrink: 0;
}
.app-header-smtp[data-status="fehler"] {
	background-color: var(--color-warning);
	border-color: var(--color-warning);
	color: #FFF;
}
.app-header-smtp[data-status="fehler"]:hover {
	color: #FFF !important;
}
.app-header-smtp[data-status="fehler"] .app-header-smtp-punkt {
	background-color: #FFF;
}
.app-header-smtp[data-status="deaktiviert"] {
	opacity: .55;
	border-style: dashed;
}
.app-header-smtp[data-status="deaktiviert"] .app-header-smtp-punkt {
	background-color: transparent;
	border: 1.5px solid var(--color-text-muted);
}
/* Nachbesserung (18.09.2026, "SMS-Status-Bubble im Header verschieben"):
   gemeinsamer rechter Bereich fuer SMS-Bubble + Wortmarke - haelt beide
   zusammen am rechten Rand der Kopfzeile (dieselbe justify-content:
   space-between-Aufteilung von .app-header-flex wie zuvor zwischen
   .app-header-linksbereich und der (nun hier enthaltenen) Wortmarke
   allein), damit die Bubble bei umbrechendem Flex-Layout auf schmalen
   Bildschirmen sauber MIT der Wortmarke zusammen umbricht statt
   unabhaengig irgendwo anders zu stehen. */
.app-header-rechtsbereich {
	display: flex;
	align-items: center;
	gap: var(--spacing-md);
	flex-wrap: wrap;
	justify-content: flex-end;
	/* Fehlerrunde (24.09.2026), Punkt 3 "Header kompakter": auf volle
	   Zeilenhoehe strecken + eigener Hintergrund - ueberdeckt dadurch die auf
	   .app-header-flex liegende Trennlinie exakt unter dem gesamten rechten
	   Bereich (SMS-/E-Mail-Badges, Wortmarke, Logo). Die Linie bleibt so nur
	   noch links sichtbar (Ticketaktion/Schnellsuche) - "beginnt optisch erst
	   seitlich ab dem Logo", unabhaengig von der tatsaechlichen Logo-Breite,
	   da hier keine feste Pixelbreite noetig ist. */
	align-self: stretch;
	background-color: var(--color-surface);
}

/* Kopfnavigation und Header optimieren (01.09.2026, Auftrag Punkt 4/5):
   "Neues Ticket erstellen" und die aus der vormaligen dritten Kopfzeile
   (Technik-Pool/Schnellsuche, jetzt vollstaendig entfernt) hierher
   verschobene Ticketschnellsuche bilden gemeinsam einen linken
   Funktionsbereich - dadurch entfaellt eine komplette Tabellenzeile
   zwischen Navigation und Hauptinhalt. Die Suche ist bewusst dezenter als
   die primaere Aktion "Neues Ticket erstellen" gehalten (helle Flaeche
   statt Farbflaeche, duennerer Rahmen), harmoniert aber ueber gleiche
   Hoehe/Rundung/Abstaende mit dem CTA-Button daneben - keine zusaetzliche
   Werkzeugleiste. */
.app-header-linksbereich {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
}
.app-header-suche {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	padding: 5px 6px 5px 10px;
	transition: border-color .12s ease, box-shadow .12s ease;
}
.app-header-suche .tc-icon {
	width: 15px;
	height: 15px;
	color: var(--color-text-muted);
	flex-shrink: 0;
}
.app-header-suche:focus-within {
	border-color: var(--color-primary);
	box-shadow: 0 0 0 2px rgba(47, 69, 146, 0.12);
}
/* Eingabefeld bewusst nicht unnoetig breit (Vorgabe Punkt 4) - reicht fuer
   einen Suchbegriff, ohne den linken Funktionsbereich zu dominieren.
   Ueberschreibt die allgemeine .EingabeFeldKlein-Rahmung/-Flaeche, da das
   Feld hier optisch Teil der umgebenden .app-header-suche-Flaeche ist,
   nicht ein eigenstaendiges Formularfeld. */
.app-header-suche-feld.EingabeFeldKlein {
	border: none !important;
	background: transparent !important;
	box-shadow: none !important;
	min-height: 26px;
	padding: 2px 0;
	font-size: 13px;
	width: 148px;
}
.app-header-suche-feld.EingabeFeldKlein:focus {
	outline: none;
}
.app-header-suche-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 26px;
	min-height: 26px;
	padding: 0 8px;
	border: none;
	border-radius: var(--radius-small);
	background-color: var(--color-surface);
	color: var(--color-text-muted);
	font-family: var(--font-system);
	font-weight: 700;
	font-size: 13px;
	cursor: pointer;
	transition: background-color .12s ease, color .12s ease;
}
/* Auftrag "Kartendarstellung Phase I/II visuell korrigieren", 03.09.2026,
   Punkt 14: sichtbares ">>"-Textsymbol im Such-Button durch das bereits
   im Suchfeld verwendete Icon 'suche' ersetzt (siehe
   framework/Kopfzeile/Default.php). Ohne diese Regel wuerde die
   allgemeinere ".app-header-suche .tc-icon"-Farbregel (siehe oben) auch
   fuer das Icon IM Button gelten und dessen Weiss-Faerbung bei :hover
   ueberschreiben - hier bewusst wieder auf die Button-eigene Farbe
   (inkl. Hover-Wechsel) zurueckgesetzt. */
.app-header-suche-button .tc-icon {
	width: 13px;
	height: 13px;
	color: inherit;
}
.app-header-suche-button:hover {
	background-color: var(--color-primary);
	color: #FFF;
}
.app-header-suche-button:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}

/* ==========================================================================
   Kopfnavigation und Header optimieren (01.09.2026, Auftrag "Kopfnavigation
   und Header gezielt weiter optimieren", Punkt 6/7): Sticky-Kopfbereich +
   klarere Trennung zum Hauptinhalt.
   --------------------------------------------------------------------------
   "position: sticky" sitzt bewusst auf dem <thead> selbst (siehe
   framework/Kopfzeile/Default.php), das jetzt beide verbleibenden
   Kopfzeilen (Marken-/Aktionszeile + Hauptnavigation) umschliesst - dadurch
   bleibt der GESAMTE Kopfbereich als ein zusammenhaengender Block am oberen
   Fensterrand stehen, ohne dass fuer die zweite Zeile ein fester Pixel-
   Versatz (= Hoehe der ersten Zeile) berechnet werden muesste. Das waere
   bei der responsiv umbrechenden Navigation (siehe Media Queries weiter
   unten) fragil, da sich die Hoehe der ersten Zeile je nach Fensterbreite/
   Zoom aendern kann. <thead> traegt in jeder der ~370 Einzelseiten
   automatisch ein implizites <tbody> fuer alle nachfolgenden Zeilen
   (Platzhalterzeile/Hauptinhalt/Fusszeile) - gueltiges HTML5, keine der
   Einzelseiten musste dafuer angepasst werden.
   z-index 15 haelt den Kopfbereich ueber dem normalen Seiteninhalt (der
   ueberwiegend ohne z-index oder mit 1/2/5 auskommt), bleibt aber bewusst
   UNTER den im Projekt durchgaengig genutzten Popover-/Dropdown-Ebenen
   (z-index 20-30), damit ein Popover in Kopfbereichsnaehe nicht verdeckt
   wird. Native <dialog>-Modals (siehe js/ticket-aktion-modal.js) rendern
   ohnehin im Browser-eigenen Top-Layer, unabhaengig vom z-index hier.
   Trennung zum Inhalt bewusst als Kombination aus feiner Border (statisch)
   und Schlagschatten (staerker beim Scrollen, siehe .app-kopfbereich--
   gescrollt / das winzige Skript am Ende von framework/Kopfzeile/
   Default.php) - keine dicke schwarze Linie, weiterhin modern/ruhig, aber
   sichtbarer als der vorherige rein 1px helle Rahmen. */
.app-kopfbereich-sticky {
	position: sticky;
	top: 0;
	z-index: 15;
	background-color: var(--color-surface);
	box-shadow: 0 1px 0 var(--color-border-strong);
	transition: box-shadow .15s ease;
}
.app-kopfbereich--gescrollt {
	box-shadow: 0 6px 16px rgba(20, 20, 30, 0.16);
}
/* Kopfbereich ueberarbeitet (01.09.2026, Auftrag "Kopfbereiche Protokoll/
   Tickets/Ticket-Detail ueberarbeiten", Punkt 7): wird der Filterkopf auf
   Protokoll/Tickets angepinnt (siehe js/tc-listenkopf-pin.js), faehrt die
   Marken-/Aktions-/Suchzeile des globalen Headers hier ein - sichtbar
   bleibt nur noch die Hauptnavigation darunter, der angepinnte
   Filterkopf dockt direkt daran an. Bewusst KEIN Versuch, die <tr>-Hoehe
   selbst zu animieren (in Tabellen browseruebergreifend unzuverlaessig) -
   stattdessen transitioniert das <td>-Padding (numerischer Start-/
   Endwert, in Tabellenzellen zuverlaessig animierbar) gemeinsam mit
   Opacity/max-height des inneren Inhalts. max-height der Ruhezustaende
   bewusst grosszuegig (500px) gewaehlt, damit auch bei umbrechendem
   Inhalt auf sehr schmalen/gezoomten Ansichten nichts abgeschnitten wird -
   nur der EINGEFAHRENE Zielwert ist 0. Diese Regel ist fuer alle anderen
   Seiten (~368 von 370) folgenlos, da die Modifier-Klasse ausschliesslich
   von der neuen Pin-JS gesetzt wird, die nur auf Protokoll/Tickets
   eingebunden ist. */
.app-header-flaeche {
	transition: padding .15s ease;
}
.app-header-flex {
	max-height: 500px;
	transition: opacity .15s ease, max-height .15s ease;
}
.app-kopfbereich--eingefahren .app-header-flaeche {
	padding-top: 0;
	padding-bottom: 0;
	min-height: 0;
	overflow: hidden;
}
.app-kopfbereich--eingefahren .app-header-flex {
	opacity: 0;
	max-height: 0;
	overflow: hidden;
	pointer-events: none;
}

/* ==========================================================================
   Neue zentrale Kopfnavigation (31.08.2026, Auftrag "Neue zentrale
   Kopfnavigation vorbereiten und schrittweise migrieren"). Eigenstaendiger,
   ruhiger Navigationsstreifen direkt unter der Kopfzeile, bewusst schlanker
   als die bestehende Hauptnavigation (.UeberschriftMittel, s. u.) - kein
   voller Farbblock, kompakte Chips mit Icon + Text, klare Hover-/Aktiv-
   Zustaende. Eintraege/Aktiv-Logik sind zentral in includes/main.php
   (tc_hauptnav_eintraege() / tc_hauptnav_ist_aktiv()) definiert, hier nur
   das Aussehen. Die bestehende Hauptnavigation bleibt unveraendert bestehen
   und wird durch diesen Block weder ueberdeckt noch verschoben.
   ========================================================================== */
.app-hauptnav-zelle {
	/* Fehlerrunde (24.09.2026), Punkt 3: minimal reduziert (12px -> 10px) -
	   Beitrag zur insgesamt kompakteren Kopfzeile, Navigationskacheln selbst
	   (.app-hauptnav-link) bewusst unveraendert. */
	padding: 10px 24px;
	min-height: auto;
	/* Feinschliff (01.09.2026, Auftrag "Neue Hauptnavigation und
	   Seitenlayout weiter anpassen", Punkt 3/6): frueher trug diese Zelle
	   selbst border-bottom + Schlagschatten fuer die Trennung zur
	   Inhaltsflaeche. Seit dem Sticky-Header-Umbau (01.09.2026, Auftrag
	   "Kopfnavigation und Header gezielt weiter optimieren", Punkt 6/7)
	   uebernimmt das gemeinsame <thead> (.app-kopfbereich-sticky, siehe
	   unten) diese Trennung fuer den GESAMTEN Kopfbereich als ein
	   zusammenhaengender Block - hier bewusst nichts mehr doppelt.
	*/
}
.app-hauptnav-liste {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.app-hauptnav-item {
	display: block;
}
/* Feinschliff (01.09.2026, Auftrag Punkt 3): die Navigationspunkte sollen
   "wie eine Reihe kompakter moderner Navigationskacheln bzw. kraeftiger
   Tabs" wirken statt wie eine Werkzeugleiste - deutlich groesserer
   Innenabstand, groesseres Icon (via width/height ueberschrieben, die
   tc_icon()-SVGs selbst tragen feste width="14"/height="14"-Attribute, die
   eine CSS-Regel wie diese zuverlaessig ueberschreibt), groessere/fettere
   Beschriftung, dezente eigene Hintergrundflaeche je Kachel (statt
   transparent) fuer klare Abgrenzung der einzelnen Punkte, aber bewusst
   kein kraeftiger Rahmen/Buttonlook. */
.app-hauptnav-link {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	padding: 12px 18px;
	border-radius: var(--radius-medium);
	font-family: var(--font-system);
	font-size: 14.5px;
	font-weight: 700;
	letter-spacing: .01em;
	color: var(--color-text-muted);
	text-decoration: none;
	background-color: var(--color-background);
	border: 1px solid transparent;
	transition: background-color .15s ease, color .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.app-hauptnav-link .tc-icon {
	width: 18px;
	height: 18px;
	stroke-width: 1.7;
	flex-shrink: 0;
}
.app-hauptnav-link:hover {
	background-color: var(--color-surface);
	border-color: var(--color-border-strong);
	color: var(--color-primary);
	box-shadow: var(--shadow-small);
}
.app-hauptnav-link:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.app-hauptnav-link--aktiv,
.app-hauptnav-link--aktiv:hover {
	background-color: var(--color-primary);
	border-color: var(--color-primary);
	color: #FFF;
	box-shadow: var(--shadow-medium);
}

/* Navigation ausbauen/Altnavigation zurueckbauen (31.08.2026, Auftrag "Neue
   Hauptnavigation vervollstaendigen und alte Navigation konsequent
   zurueckbauen"): Benutzeranzeige + Logout (Punkt 1/2) rechts in derselben
   Navigationszeile, sowie die kompakte Login-Variante fuer nicht angemeldete
   Besucher. <nav> traegt jetzt selbst das Flex-Layout (vorher nur die <ul>),
   damit die <ul> und der neue Benutzerblock als zwei Geschwister links/
   rechts auseinanderlaufen koennen. */
.app-hauptnav {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 12px;
	width: 100%;
}
.app-hauptnav-user-block {
	display: flex;
	align-items: center;
	gap: 6px;
	flex-shrink: 0;
}
/* Statusleiste ueberarbeiten (03.09.2026): .app-hauptnav-user (Link auf
   "Mein Profil" im Kopfbereich) und die Logout-Haelfte der folgenden Regel
   entfallen ersatzlos - beides ist in die neue permanente Statusleiste
   umgezogen (framework/Statusleiste/Default.php). .app-hauptnav-login
   (Gast-Anmeldelink) bleibt unveraendert bestehen. */
.app-hauptnav-login {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 10px 14px;
	border-radius: var(--radius-medium);
	font-family: var(--font-system);
	font-size: 14px;
	font-weight: 700;
	color: var(--color-text-muted);
	text-decoration: none;
	white-space: nowrap;
	transition: background-color .15s ease, color .15s ease;
}
.app-hauptnav-login .tc-icon {
	width: 16px;
	height: 16px;
	stroke-width: 1.7;
}
.app-hauptnav-login:hover {
	background-color: var(--color-background);
	color: var(--color-danger);
}
.app-hauptnav-login:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
/* Kompakte Login-Zeile bei nicht angemeldetem Besucher (Auftrag Punkt 2) -
   dieselbe Kopfzeilen-Zelle wie die normale Navigation, aber ohne <ul>. */
.app-hauptnav--gast {
	justify-content: flex-start;
}

/* Ehemalige Uebergangszeile Technik-Pool + Schnellsuche (Auftrag Punkt
   10/13/14-17) - seit 01.09.2026 (Auftrag "Kopfnavigation und Header
   gezielt weiter optimieren", Punkt 3/5) vollstaendig entfernt: Technik-
   Pool ist ersatzlos aus der Navigation entfernt, die Schnellsuche ist in
   den oberen Header umgezogen (siehe .app-header-suche* weiter oben). Die
   zugehoerigen .app-resttools-*-Klassen werden nirgends mehr referenziert
   (framework/Kopfzeile/Default.php) und wurden deshalb im selben Schritt
   mit entfernt statt als toter Code stehen zu bleiben. */

/* ==========================================================================
   Layout-Grundueberarbeitung (12.08.2026): responsives App-Shell fuer die
   AEUSSERSTE Seitentabelle. Betrifft weiterhin ausschliesslich diese eine
   zentrale Regel - keine der ~370 Einzelseiten muss dafuer angefasst werden,
   ihr HTML-Tabellengeruest (Kopfzeile/Platzhalterzeile/Inhalt/Fusszeile)
   bleibt unveraendert.
   --------------------------------------------------------------------------
   URSACHE der nach Entfernung der rechten Statistikspalte weiterhin
   sichtbaren grauen Restflaeche (siehe Auftrag Punkt 3): body > table hatte
   bereits eine max-width, aber die inneren <td>-Spalten sind per HTML-
   Attribut auf feste Pixelwerte fixiert (6/159/10/825px) - NUR die beiden
   aeussersten "Rahmenkante"-Zellen (bgcolor="#666666", je Seite ohne eigenes
   width-Attribut kopiert) hatten KEINE feste Breite. Ein <table> im
   Standard-table-layout:auto verteilt bei width:100% jede ueber die Summe
   der festen Spalten hinausgehende Breite auf genau diese unfixierten
   Spalten - dadurch wuchsen BEIDE duennen Rahmenspalten zu breiten grauen
   Flaechen, WAEHREND der eigentliche Hauptinhalt bei seiner festen Breite
   (frueher 660px, zuletzt 825px) verharrte. Im Rendertest (1920px
   Fensterbreite) reproduziert und bestaetigt, bevor diese Regeln ergaenzt
   wurden.
   ========================================================================== */
body > table {
	width: 100%;
	max-width: var(--app-max-width);
	margin: 0 auto;
	background-color: var(--color-surface);
	box-shadow: var(--shadow-small);
}
/* Fix: die duennen Rahmenkanten-Zellen auf eine winzige feste Breite
   sperren, damit sie den von max-width freigegebenen Platz nicht mehr
   absorbieren - dieselbe projektweite Attribut-Selektor-Technik wie die
   bereits bestehende Farb-Regel oben (kein Anfassen einzelner Seiten). */
body > table > tbody > tr > td[bgcolor="#666666" i] {
	width: 2px;
}
/* Fix: die Hauptinhaltsspalte (die feste width="660"/"825"-Zelle der
   unsichtbaren Platzhalterzeile jeder Seite) wird stattdessen flexibel -
   sie erhaelt dadurch automatisch den kompletten, jetzt nicht mehr von den
   Rahmenkanten absorbierten Restplatz. Die HTML-Attribute bleiben in den
   Einzeldateien unveraendert stehen (Fallback ohne CSS), diese Regel
   ueberschreibt sie nur visuell. */
body > table td[width="660" i],
body > table td[width="825" i] {
	width: auto;
}

/* Feinschliff (01.09.2026, Auftrag "Neue Hauptnavigation und Seitenlayout
   weiter anpassen", Punkt 4; KORRIGIERT 01.09.2026, Auftrag "Korrigiere
   die zuletzt umgesetzte rechte Seitenbegrenzung" - siehe dortiger
   Fehlerbericht): rechts wieder einen bewusst reservierten, strukturellen
   Bereich schaffen - "nicht einfach nur durch zufaelligen Margin", sondern
   als eigene, immer vorhandene Tabellenspalte. Analyse vom 01.09.2026
   bestaetigt: das aeussere Seiten-Tabellengeruest ist ueber alle ~370
   Einzelseiten (Kopfzeile/Platzhalterzeile/Hauptinhalt/Fusszeile)
   byte-identisch, und JEDE Zeile (auch die der Kopf-/Fusszeile!) endet
   bereits heute mit genau derselben rechten Rahmenzelle
   (<td bgcolor="#666666">&nbsp;</td>, aktuell per Regel oben ueberall auf
   2px gezwungen).
   FEHLER der ersten Fassung: die Regel griff ueber ":last-child" - das
   trifft die letzte Zelle JEDER Zeile, also auch die der Kopfzeile
   (Logo-/Markenzeile, Hauptnavigationszeile, Technik-Pool-/Suchzeile) und
   der Fusszeile, nicht nur die des eigentlichen Seiteninhalts. Dadurch
   entstand faelschlich ein durchgehender leerer Balken auch NEBEN Kopf-
   und Navigationszeile.
   KORREKTUR: statt rein auf ":last-child" wird jetzt zusaetzlich verlangt,
   dass die Zelle DAVOR weder ein "width"- noch ein "class"-Attribut
   traegt. Das trifft ausschliesslich auf die Inhaltszelle des Hauptbereichs
   zu (<td align="left" valign="top"> ohne width/class, direkt gefolgt von
   der schliessenden Rahmenzelle) - alle Kopf-/Fusszeilen-Zeilen haben vor
   ihrer schliessenden Rahmenzelle stattdessen eine Zelle MIT width- und/
   oder class-Attribut (z. B. <td width="5" ... class="app-rahmen-gutter">
   in der Hauptnavigationszeile, oder <td colspan="..." class="...">in
   Marken-/Technik-Pool-/Fusszeilen-Zeile) und werden dadurch zuverlaessig
   ausgeschlossen. Diese eine, garantiert vorhandene, inhaltsleere Zelle
   wird - nur auf ausreichend breiten Bildschirmen - zu einer echten
   rechten Spalte verbreitert und hell eingefaerbt, statt eine neue <td> in
   370 Dateien zu ergaenzen. Nutzt dafuer die bereits bestehende, bisher
   ungenutzte Design-Variable --sidebar-right-width (siehe :root) statt
   einer neuen Zahl. Bleibt ABSICHTLICH inhaltsleer (nur "&nbsp;") - eine
   spaetere Befuellung mit echten Kennzahlen (siehe dafuer bereits
   vorbereitet, aber seit der Layout-Ueberarbeitung vom 12.08.2026 ohne
   eigene Spalte: framework/Statusanzeige/Default.php + die zugehoerigen
   .sidebar-*-Klassen weiter unten in dieser Datei) ist NICHT Teil dieser
   Aufgabe.
   --app-max-width bleibt bei 1900px (von 1700px angehoben) - das war nicht
   Teil des gemeldeten Fehlers, sondern sorgt weiterhin dafuer, dass die
   neue Spalte auf grossen Monitoren nicht zu Lasten der bisherigen
   Arbeitsbereichsbreite geht: die Kopf-/Navigationszeilen nutzen dank der
   Korrektur oben wieder die VOLLE Tabellenbreite (jetzt 1900px statt vorher
   1700px), waehrend nur die Inhaltszeile darunter die letzten
   --sidebar-right-width davon fuer die kuenftige rechte Spalte reserviert. */
@media (min-width: 1600px) {
	body > table > tbody > tr > td:not([width]):not([class]) + td[bgcolor="#666666" i] {
		width: var(--sidebar-right-width) !important;
		background-color: var(--color-background) !important;
		border-left: 1px solid var(--color-border) !important;
		vertical-align: top;
	}
}

/* Phase B: Die Rahmen-/Gutter-Farben #666666 (duenne Aussenkante) und #CCCCCC
   (Gutter neben Nav/Statuspanel) sind Teil des immer gleichen, kopierten
   Seitengeruests auf praktisch jeder Seite (siehe Facelift_Analyse_und_Plan.md,
   Abschnitt 1/10). Per Attribut-Selektor global abgemildert, ohne dass eine der
   ~370 Einzelseiten angefasst werden muss. Betrifft nur die Hintergrundfarbe,
   keine Breite/Struktur. */
td[bgcolor="#666666" i]:not(.app-statusleiste-dunkel), tr[bgcolor="#666666" i]:not(.app-statusleiste-dunkel) {
	background-color: var(--color-border-strong) !important;
}
td[bgcolor="#CCCCCC" i]:not(.app-statusleiste-dunkel), tr[bgcolor="#CCCCCC" i]:not(.app-statusleiste-dunkel) {
	background-color: var(--color-background) !important;
}

/* Responsive: Bei kleineren Breiten/hohem Zoom duerfen Kopf-/Navigationsbereiche
   umbrechen, statt Inhalte abzuschneiden oder zu ueberlagern (Vorgabe Abschnitt 8). */
/* Feinschliff (01.09.2026, Auftrag Punkt 3/6): mit neun moeglichen
   Navigationspunkten plus Benutzerblock brauchen die jetzt groesseren
   Kacheln eine zusaetzliche, sanftere Zwischenstufe, bevor bei 1100px die
   deutlich kompaktere Darstellung greift - sonst waere der Sprung von
   "gross" auf "sehr klein" zu abrupt. */
@media (max-width: 1500px) {
	.app-hauptnav-link {
		padding: 10px 14px;
		font-size: 13.5px;
		gap: 8px;
	}
	.app-hauptnav-login {
		padding: 9px 12px;
		font-size: 13px;
	}
}
@media (max-width: 1100px) {
	.app-header-flex {
		justify-content: flex-start;
	}
	a.UeberschriftMittel {
		font-size: 13px;
		padding: 10px 2px;
	}
	.app-hauptnav-zelle {
		padding: 8px 12px;
	}
	.app-hauptnav-liste {
		gap: 5px;
	}
	.app-hauptnav-link {
		padding: 7px 10px;
		font-size: 12.5px;
		gap: 6px;
	}
	.app-hauptnav-link .tc-icon {
		width: 16px;
		height: 16px;
	}
	.app-hauptnav-login {
		padding: 7px 10px;
		font-size: 12.5px;
	}
	.app-hauptnav-login .tc-icon {
		width: 15px;
		height: 15px;
	}
}
/* Kopfnavigation und Header optimieren (01.09.2026, Auftrag Punkt 7):
   Ticketschnellsuche darf bei wenig Platz schmaler werden statt den linken
   Funktionsbereich zu sprengen - dieselbe Zwischenstufe wie oben fuer die
   Navigationskacheln. */
@media (max-width: 1100px) {
	.app-header-suche-feld.EingabeFeldKlein {
		width: 100px;
	}
}
@media (max-width: 640px) {
	.app-header-suche-feld.EingabeFeldKlein {
		width: 80px;
	}
}

/* ==========================================================================
   Neu: Formularelemente projektweit modernisieren (rein additiv, betrifft
   ALLE bestehenden Formulare automatisch, ohne dass name/id/action geaendert
   werden muessen)
   ========================================================================== */

input[type="text"],
input[type="password"],
input[type="email"],
input[type="number"],
input[type="tel"],
input[type="date"],
input[type="search"],
select,
textarea {
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 8px 10px;
	min-height: 38px;
	box-sizing: border-box;
}

textarea {
	min-height: 90px;
	padding: 10px;
	line-height: 1.4;
}

input[type="text"]:focus,
input[type="password"]:focus,
input[type="email"]:focus,
input[type="number"]:focus,
input[type="tel"]:focus,
input[type="date"]:focus,
input[type="search"]:focus,
select:focus,
textarea:focus,
button:focus,
input[type="submit"]:focus,
input[type="button"]:focus,
a:focus {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}

input[type="checkbox"],
input[type="radio"] {
	accent-color: var(--color-primary);
	width: 16px;
	height: 16px;
	vertical-align: middle;
}

input[type="submit"],
input[type="button"],
button {
	font-family: var(--font-system);
	font-size: 15px;
	min-height: 38px;
	padding: 8px 18px;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-primary-dark);
	background-color: var(--color-primary);
	color: #FFF;
	cursor: pointer;
}
input[type="submit"]:hover,
input[type="button"]:hover,
button:hover {
	background-color: var(--color-primary-dark);
}

/* ==========================================================================
   Neu: Button-System (additiv, optional per class="..." nutzbar)
   ========================================================================== */

.button {
	display: inline-block;
	font-family: var(--font-system);
	font-size: 15px;
	font-weight: 600;
	min-height: 38px;
	padding: 8px 18px;
	border-radius: var(--radius-small);
	border: 1px solid transparent;
	text-decoration: none;
	cursor: pointer;
	text-align: center;
}
.button-primary   { background-color: var(--color-primary);  border-color: var(--color-primary-dark); color: #FFF; }
.button-primary:hover   { background-color: var(--color-primary-dark); }
.button-secondary { background-color: var(--color-surface); border-color: var(--color-border-strong); color: var(--color-text); }
.button-secondary:hover { background-color: var(--color-background); }
.button-success   { background-color: var(--color-success); border-color: var(--color-success); color: #FFF; }
.button-warning   { background-color: var(--color-warning); border-color: var(--color-warning); color: #FFF; }
.button-danger    { background-color: var(--color-danger);  border-color: var(--color-danger);  color: #FFF; }
/* Nacharbeit (24.08.2026, "Termin loeschen..."): erste tatsaechliche
   Verwendung von .button-danger im Projekt (Termin-Sicherheitsabfrage,
   siehe .tc-termin-confirm-actions weiter unten) - Hover/Fokus-Zustand
   war im bisher rein additiven, ungenutzten Button-System noch nicht
   ausdefiniert. */
.button-danger:hover { background-color: var(--color-danger-dark); }
.button:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 1px; }
.button-small     { font-size: 13px; min-height: 32px; padding: 6px 12px; }
.button-icon      { padding: 8px 12px; }

/* ==========================================================================
   Neu: Status-Badges (additiv, optional; .Eskaliert bleibt fuehrend fuer
   Eskalationen, diese Badges ergaenzen fuer die uebrigen Statuswerte)
   ========================================================================== */

.badge {
	display: inline-block;
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	padding: 3px 10px;
	border-radius: var(--radius-large);
	line-height: 1.6;
}
.badge-verfuegbar  { background-color: #E4EDFB; color: var(--color-primary-dark); }
.badge-in-arbeit   { background-color: #E7F3E9; color: var(--color-success); }
.badge-geparkt     { background-color: #F1F2F4; color: var(--color-text-muted); }
.badge-eskaliert   { background-color: var(--color-danger-strong); color: #FFF; }
.badge-geschlossen { background-color: #EDEDED; color: var(--color-text-muted); }

/* ==========================================================================
   Neu: Karten/Panels (additiv)
   ========================================================================== */

.card {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	padding: var(--spacing-md);
}

/* ==========================================================================
   Datentabellen (echte tabellarische Listen) - modernes Tabellenstyling,
   Struktur unveraendert
   ========================================================================== */

table.LinieRundumTextNormal td,
table.LinieRundumTextNormal th {
	padding: 8px 10px;
}
table.LinieRundumTextNormal tr:hover {
	background-color: var(--color-background);
}

/* ==========================================================================
   PHASE C: Sidebar-Designsystem (linke Aktionsleiste, rechtes Statuspanel)
   --------------------------------------------------------------------------
   Betroffene Dateien: ticketing/anzeigen/show.php (linke Aktionsleiste, per
   additive class="..." an bestehenden Tags), framework/Statusanzeige/Default.php
   (komplett auf div-Karten umgestellt - diese Datei ist zu 100% self-contained,
   enthaelt keine Links/IDs/JS-Hooks, siehe Facelift_Analyse_und_Plan.md Abschnitt 11).
   Die Spaltenbreite der linken Navigations-/Aktionsspalte (width="159" in
   show.php) wurde bewusst NICHT geaendert - siehe Abschnitt 11.3 der Analyse-
   Datei fuer die Begruendung (Risiko ohne visuelle Verifikation mit echtem Login).
   ========================================================================== */

.sidebar-card {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	padding: var(--spacing-sm);
	margin-bottom: var(--spacing-md);
}

/* Linke Aktionsleiste (show.php): die beiden bestehenden Tabellen bekommen
   zusaetzlich .sidebar-card - die Struktur/Formulare/Radios bleiben Tabellen,
   nur die Optik wird per CSS modernisiert. */
table.sidebar-action-panel {
	border: none;
	box-shadow: var(--shadow-small);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
	/* Schritt 2: cellspacing-Attribute (2/4px, je nach Tabelle) der HTML-Vorlage
	   ueberschreiben, damit die Zeilenabstaende einheitlich per CSS gesteuert
	   werden - kompaktere Wirkung wie gefordert, keine Strukturaenderung. */
	border-spacing: 0;
}
table.sidebar-action-panel td {
	padding: 4px 6px;
}
.sidebar-card-title {
	display: block;
	font-family: var(--font-system);
	font-size: 12px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	color: var(--color-text-muted);
	padding: 4px 2px 6px 2px !important;
	border-bottom: 1px solid var(--color-border);
	margin-bottom: 4px;
}
/* Aktions-Buttons (bestehende .SchnellButton-Klasse) - nur innerhalb der
   Sidebar-Karten ueberschrieben, damit andere Verwendungsstellen von
   .SchnellButton (z.B. terminiert/*) unangetastet bleiben. */
.sidebar-action-panel .SchnellButton {
	width: 100%;
	height: auto;
	min-height: 40px;
	padding: 10px 12px;
	white-space: normal;
	line-height: 1.3;
	border-radius: var(--radius-small);
	box-sizing: border-box;
	/* AP14 (16.09.2026, "Linke Aktionsleiste ausrichten"): bisher nur
	   ueber den Browser-Default fuer <button>/<input type=submit>
	   zentriert - explizit gesetzt, damit es unabhaengig vom
	   Elementtyp/Browser garantiert zentriert bleibt. */
	text-align: center;
}
.sidebar-action-panel .SchnellButton:hover {
	background-color: var(--color-background);
	border-color: var(--color-primary);
}
.sidebar-action-panel .SchnellButton:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}

/* Schritt 2 (17.08.2026): dezente visuelle Gewichtung innerhalb der
   Hauptaktionen - nur additive Klasse, keine Aenderung an name/id/value.
   Bewusst nur EIN zusaetzlicher Akzent-Ton (Marken-Blau, ausgefuellt) fuer die
   drei Aktionen, die ein Ticket im Regelfall aktiv voranbringen bzw.
   abschliessen (Uebernehmen/Schliessen/Freigeben) - alle anderen Aktionen
   (Status-Notiz/Kapern/Zuweisen/Weiterleiten) bleiben in einer bewusst
   zurueckhaltenden, umrandeten Grundoptik. Keine "bunte Knopfsammlung": Blau
   bleibt die einzige Akzentfarbe, es entsteht lediglich ausgefuellt vs.
   umrandet.
   Hinweis: die sitweite Grundregel input[type="submit"]{background:...blau}
   (siehe weiter unten, "Formularelemente projektweit modernisieren") wuerde
   sonst JEDEN .SchnellButton blau einfaerben (gleiche Spezifitaet, spaeter in
   der Datei) - die neutrale Stufe braucht daher eine eigene, bewusst
   spezifischere Gegenregel. */
.sidebar-action-panel .SchnellButton.sidebar-action-primary {
	background-color: var(--color-primary);
	border-color: var(--color-primary-dark);
	color: #FFF;
}
.sidebar-action-panel .SchnellButton.sidebar-action-primary:hover {
	background-color: var(--color-primary-dark);
}
.sidebar-action-panel .SchnellButton:not(.sidebar-action-primary) {
	background-color: var(--color-surface);
	border-color: var(--color-border-strong);
	color: var(--color-text);
}
.sidebar-action-panel .SchnellButton:not(.sidebar-action-primary):hover {
	background-color: var(--color-background);
	border-color: var(--color-primary);
}

/* AP6 (Gesamtauftrag "BeWo Ticketsystem 2026", 13.09.2026, "Linke
   Aktionsleiste aufraeumen"): die Radio-Zeilen/Options-/Submit-Styles
   fuer das alte "Spezial-Funktionen"-Formular (actionButton() in
   show.php) sind ersatzlos entfernt - das Formular wurde durch direkte
   Links ersetzt (.sidebar-link-action, siehe unten), keine dieser
   Klassen wird projektweit noch verwendet (per Grep geprueft). */
/* Bereinigungsrunde (17.08.2026, Auftrag Punkt 7): die vier bisher in der
   alten "zweiten Seitenleiste" stehenden Aktionen (Folge-Ticket/Beziehung/
   Zur Kenntnis/Beobachten) sind hierher, in die bereits modernisierte linke
   Aktionsspalte, umgezogen - eigene sidebar-card mit einfachen Links statt
   Tabellenzeilen. */
.sidebar-link-card {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.sidebar-link-action {
	display: flex;
	align-items: center;
	/* AP14 (16.09.2026, "Linke Aktionsleiste ausrichten"): explizit
	   linksbuendig (bisher nur impliziter Flex-Default) + einheitliche
	   Mindesthoehe/Box-Groesse, damit Icon-Position, Textstart, Breite
	   und Hoehe unabhaengig von Icon-/Textlaenge fuer jeden Eintrag
	   garantiert gleich sind - analog zu .sidebar-action-panel
	   .SchnellButton oben. */
	justify-content: flex-start;
	min-height: 40px;
	box-sizing: border-box;
	gap: 10px;
	padding: 9px 10px;
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-text);
	border-radius: var(--radius-small);
}
.sidebar-link-action:hover,
.sidebar-link-action:focus-visible {
	background-color: var(--color-background);
	color: var(--color-primary-dark);
}
.sidebar-link-action:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.sidebar-link-action .tc-icon {
	flex-shrink: 0;
	color: var(--color-text-muted);
	width: 16px;
	height: 16px;
}
/* Bugfix (13.09.2026, direkt gemeldet: "Ticket verbinden" - jetzt ein
   <button>, siehe "Ticket verbinden optimieren" - wurde blau auf blau
   angezeigt und war nur bei Hover lesbar): alle anderen Eintraege dieser
   Aktionsleiste sind <a>-Links ohne jede UA-Button-Optik, wodurch die
   allgemeine projektweite <button>-Basisformatierung (siehe "button {...}"
   weiter oben, fuer echte CTA-Buttons gedacht) hier bisher nie ins Gewicht
   fiel. Der neue <button class="sidebar-link-action"> erbte davon einen
   dunkelblauen Hintergrund (var(--color-primary)) samt Rahmen, waehrend
   die eigene, dunkle Textfarbe (color: var(--color-text) oben) im
   Ruhezustand zwar bereits korrekt griff, auf dem dunkelblauen Hintergrund
   aber kaum lesbar war - erst bei :hover ueberschreibt die bestehende
   Regel .sidebar-link-action:hover BEIDE Farben explizit und war dadurch
   lesbar. Setzt fuer <button>-Varianten dieselbe schlichte Optik wie bei
   den <a>-Geschwistern zurueck (kein Hintergrund/Rahmen im Ruhezustand). */
button.sidebar-link-action {
	width: 100%;
	background-color: transparent;
	border: none;
	min-height: 0;
	cursor: pointer;
	/* Bugfix (18.09.2026, "Ticket verbinden linksbuendig ausrichten"): die
	   projektweite Basisformatierung fuer <button> setzt KEIN text-align,
	   die Browser-eigene UA-Formatierung tut es aber (Standard: center).
	   justify-content: flex-start (siehe .sidebar-link-action oben)
	   positioniert nur die Flex-Box des Textes selbst links, NICHT die
	   Ausrichtung mehrzeilig umgebrochenen Textes darin - bei "Ticket
	   verbinden" bricht der Text in der schmalen Seitenleiste auf zwei
	   Zeilen um und stand dadurch weiterhin zentriert, waehrend die
	   <a>-Geschwister (kein UA-text-align) bereits linksbuendig umbrachen. */
	text-align: left;
}

/* AP9 (16.09.2026, "Linke Aktionsleiste vereinheitlichen"): "Loeschen"
   (admin-only, ganz unten in der Aktionsleiste) ist nur Administratoren
   sichtbar (Rechtepruefung in show.php unveraendert) und darf deshalb
   bewusst deutlich/kritisch aussehen - voller roter Hintergrund + weisser
   Text statt nur roter Textfarbe (vorher). Etwas Abstand nach oben, damit
   die destruktive Aktion sich zusaetzlich von den neutralen Eintraegen
   absetzt. */
.sidebar-link-action--danger,
button.sidebar-link-action--danger { /* 02.10.2026: button.sidebar-link-action setzte den Hintergrund transparent -> weisse Schrift unsichtbar bis Hover */
	margin-top: 6px;
	background-color: var(--color-danger-strong);
	color: #FFFFFF;
}
.sidebar-link-action--danger,
.sidebar-link-action--danger .tc-icon {
	color: #FFFFFF;
}
.sidebar-link-action--danger:hover,
.sidebar-link-action--danger:focus-visible {
	background-color: var(--color-danger);
	color: #FFFFFF;
}
.sidebar-link-action--danger:hover .tc-icon,
.sidebar-link-action--danger:focus-visible .tc-icon {
	color: #FFFFFF;
}

/* Rechtes Statuspanel (framework/Statusanzeige/Default.php) */
.sidebar-statuspanel {
	text-align: center;
}
.sidebar-section-title {
	font-family: var(--font-system);
	font-size: 12px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	color: var(--color-text-muted);
	margin: 0 0 var(--spacing-sm) 0;
	text-align: left;
}
.sidebar-stat {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: var(--spacing-sm) var(--spacing-xs);
	border-radius: var(--radius-small);
	margin-bottom: var(--spacing-sm);
	background-color: var(--color-background);
}
.sidebar-stat-label {
	font-size: 12px;
	font-weight: 600;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .02em;
}
.sidebar-stat-value {
	font-size: 30px;
	font-weight: 700;
	color: var(--color-text);
	line-height: 1.25;
}
/* Eskaliert nur bei Anzahl > 0 (PHP-seitig entschieden, keine neue Statuslogik,
   siehe framework/Statusanzeige/Default.php) deutlich als Warnung markiert -
   bei 0 bleibt die neutrale .sidebar-stat-Optik, kein unnoetiger Alarm. */
.sidebar-stat-danger {
	background-color: #FCEBEC;
	border-top: 3px solid var(--color-danger-strong);
}
.sidebar-stat-danger .sidebar-stat-value {
	color: var(--color-danger-strong);
}
.sidebar-divider {
	height: 1px;
	background-color: var(--color-border);
	margin: var(--spacing-xs) 0 var(--spacing-md) 0;
}
.sidebar-stat-row {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding: 6px 2px;
	font-size: 14px;
	border-bottom: 1px solid var(--color-border);
}
.sidebar-stat-row:last-child {
	border-bottom: none;
}
.sidebar-stat-row-label {
	color: var(--color-text-muted);
}
.sidebar-stat-row-value {
	font-weight: 700;
	font-size: 16px;
	color: var(--color-text);
}

/* Barrierefreiheit: Fokus-Sichtbarkeit fuer alle Sidebar-Interaktionselemente */
.sidebar-card a:focus-visible,
.sidebar-action-panel input:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}

/* ==========================================================================
   PHASE D: Ticketlisten / Kartenansicht
   --------------------------------------------------------------------------
   Betrifft 12 Dateien (verfuegbar, geschlossen, geparkt, eskaliert, uebernommen,
   terminiert, meinetickets, cobracrm, suche/index, suche/schnellsuche,
   suche/doppelte_tickets, suche/suchnummer) - siehe Facelift_Analyse_und_Plan.md
   Abschnitt 12. In jeder Datei wurden nur die beiden aeusseren Tabellen (Karte
   bzw. Liste) um je eine zusaetzliche Klasse ergaenzt; die PHP-Umschaltlogik
   ($_GET['liste']) sowie alle Links/IDs/Formulare bleiben unveraendert.

   WICHTIG zur Spezifitaet: Phase A definiert bereits "table.LinieRundumTextNormal
   td/th { padding: 8px 10px }" (Spezifitaet 0,0,1,2). Damit die hier folgenden
   Overrides sicher greifen, wird konsequent der Tag-Selektor "table.ticket-..."
   verwendet (gleiche oder hoehere Spezifitaet).
   ========================================================================== */

/* Kartenansicht: eigenstaendige Karten mit kleinem, aber sichtbarem Abstand
   zueinander (Vorgabe: 8-12px, keine grossen Dashboard-Abstaende) */
table.ticket-card-view {
	border: 1px solid var(--color-border);
	border-radius: 6px;
	box-shadow: none;
	margin-bottom: 10px;
}
table.ticket-card-view td,
table.ticket-card-view th {
	padding: 6px 10px;
}
/* Dringlichkeitshinweis ("Hohe Dringlichkeit!") kompakter, nur innerhalb der
   Kartenansicht - ueber das bereits vorhandene bgcolor-Attribut gescoped,
   keine Datei musste dafuer angefasst werden. */
table.ticket-card-view td[bgcolor="#FFCC00"] {
	padding: 4px 8px !important;
}
table.ticket-card-view td[bgcolor="#FFCC00"] .UeberschriftSeite {
	font-size: 13px;
	display: inline-block;
}

/* Listenansicht: bewusst dichter als die Kartenansicht, kein Card-Look,
   keine Aussenabstaende zwischen Zeilen (Vorgabe: kompakt, viele Tickets
   gleichzeitig sichtbar) */

/* ==========================================================================
   Vereinheitlichung Runde 7 (12.08.2026): EINE zentrale Ticket-Listenzeile
   fuer alle Ansichten (includes/ticket_list_head.php + ticket_list_row.php +
   ticket_list_foot.php) statt 11 fast identischer, aber leicht auseinander-
   laufender Kopien. Spaltenzahl von sechs auf vier reduziert: Art | Ticket/
   Kontakt | Informationen | Status. Der Kontaktbereich in Spalte 2 (Firma/
   Kundennummer/Ansprechpartner/Telefon/Aufklapper) verwendet dieselben
   Klassen wie die Kartenansicht (.tc-contact*, unten definiert, nicht auf
   .ticket-card-view gescoped) - keine zweite Kontaktlogik fuer die Liste.
   ========================================================================== */
.tc-list-scroll {
	/* Punkt 26: horizontales Scrollen statt Zusammenquetschen auf schmalen
	   Viewports - die Tabelle selbst behaelt eine Mindestbreite. */
	overflow-x: auto;
}
/* Runde 10: Ursache des bisherigen Scrollbalkens auf normaler Desktopbreite -
   der Hauptinhaltsbereich des bestehenden Seitenlayouts ist an ~370 Stellen
   fest auf 660px codiert (siehe <td width="660"> in jeder Listendatei,
   Facelift_Analyse_und_Plan.md Abschnitt "Bekannte Einschraenkungen"), die
   Tabelle verlangte aber min-width:760px - schon das allein erzwang den
   Scrollbalken, unabhaengig von allen anderen Breiten/Paddings. Neuer Wert
   liegt sicher unterhalb der 660px, das Scrollen bleibt fuer echte
   Schmalbildschirme (z. B. eingebettete/schmalere Kontexte) als Fallback
   erhalten. */
table.ticket-list-view {
	width: 100%;
	min-width: 600px;
	table-layout: fixed;
	border-collapse: collapse;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	background-color: var(--color-surface);
	margin-bottom: 0;
	/* Nutzerauftrag (19.09.2026, "Protokoll -> Ticketaktivitäten:
	   horizontalen Scrollbalken beseitigen"): width:100% + border zaehlte
	   bei der Tabelle selbst (im Gegensatz zu den Zellen, die bereits
	   box-sizing:border-box haben) zum Standard-content-box-Modell - die
	   Tabelle wurde dadurch um die Randbreite breiter als der scrollende
	   Wrapper (.tc-log-scroll/.tc-list-scroll), was genau diesen
	   ueberfluessigen horizontalen Scrollbalken erzwang. */
	box-sizing: border-box;
}
/* Klickbare sortierbare Spaltenkoepfe (Auftrag 20.09.2026, Punkte 9+21,
   js/tc-tabelle-sortierbar.js) - dezenter Pfeil erscheint erst bei aktiver
   Sortierrichtung, sonst kein zusaetzlicher optischer Ballast. */
.tc-sortier-th {
	cursor: pointer;
	user-select: none;
	white-space: nowrap;
}
.tc-sortier-th:hover {
	color: var(--color-primary);
}
.tc-sortier-pfeil {
	display: inline-block;
	width: 1em;
	margin-left: 4px;
	font-size: 11px;
	opacity: .7;
}
.tc-sortier-th[data-sort-richtung="asc"] .tc-sortier-pfeil::after {
	content: "↑";
}
.tc-sortier-th[data-sort-richtung="desc"] .tc-sortier-pfeil::after {
	content: "↓";
}

table.ticket-list-view td,
table.ticket-list-view th {
	/* Punkt 2: etwas weniger horizontales Padding als zuvor (10px -> 8px),
	   traegt zusammen mit der korrigierten min-width zur Scrollbalken-
	   Beseitigung bei. */
	padding: 8px 8px;
	font-size: 14px;
	/* Punkt 20: nur eine dezente horizontale Trennung zwischen Tickets, keine
	   vertikalen Linien mehr (kein Excel-Raster). */
	border-bottom: 1px solid var(--color-border);
	border-right: none;
	vertical-align: top;
	box-sizing: border-box;
}
table.ticket-list-view tr:last-child td {
	border-bottom: none;
}
/* Punkt 19: Gruppenfarbe bleibt die dominante Zeilenfarbe - helle Toenung +
   kraeftiger linker Rand. --tc-color wird inline mit demselben Wert wie das
   bestehende bgcolor-Fallback auf <tr> gesetzt (dieselbe bestehende Daten-
   quelle, keine neue Farblogik). */
table.ticket-list-view tr[data-ticket-url] {
	cursor: pointer;
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 12%, var(--color-surface));
}
/* Fehlerrunde (24.09.2026), Punkt 5: generisches Gegenstueck zu
   data-ticket-url (siehe js/ticket-click.js) fuer alle NICHT-Ticket-Tabellen
   (Warenwirtschaft, Koop, Adminlisten usw.) - bewusst ohne die
   ticketspezifische Gruppenfarb-/Randgestaltung obiger Regel, nur der
   Cursor als Klickbarkeits-Hinweis. Greift ueberall dort, wo eine Zeile
   dieses Attribut traegt, unabhaengig von der jeweiligen Tabellenklasse. */
[data-tc-zeile-url] {
	cursor: pointer;
}
table.ticket-list-view tr[data-ticket-url] td:first-child {
	border-left: 14px solid var(--tc-color, var(--color-border-strong));
}
/* Wertkonto (Auftrag "Wertkonto auf Basis von Tickets/Protokoll/Aufgaben
   ueberarbeiten"): manuelle Buchungen (includes/konto_list_row.php) haben
   bewusst KEIN data-ticket-url (kein echtes Ticket dahinter) - die
   Zugang/Abgang-Farbtoenung soll trotzdem greifen, nur der Pointer-Cursor
   (impliziert Klickbarkeit) bewusst nicht. Gleiche Werte wie oben, nur an
   die Klasse statt an das Attribut gebunden - fuer alle anderen
   .tc-log-row (haben ohnehin immer data-ticket-url) rechnerisch identisch,
   keine Verhaltensaenderung dort. */
table.ticket-list-view tr.tc-log-row {
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 12%, var(--color-surface));
}
table.ticket-list-view tr.tc-log-row td:first-child {
	border-left: 14px solid var(--tc-color, var(--color-border-strong));
}
/* Hohe Prioritaet zusaetzlich als linke/rechte Einfassung der ganzen Zeile
   (Nacharbeit 21.08.2026, Auftrag Punkt 2/4): ergaenzt die bestehende
   Ticketgruppenfarbe (siehe :first-child-Regel oben), ersetzt sie NICHT.
   Der linke Streifen sitzt bewusst NICHT auf derselben Zelle (die traegt
   bereits die Gruppenfarbe UND das kleine Art-Icon - ein zusaetzlicher
   14px-Rand auf genau dieser schmalen Spalte wuerde das Icon verdraengen),
   sondern als border-left auf der ZWEITEN Zelle (der breiten Betreffspalte)
   - in einer border-collapse:collapse-Tabelle liegen beide Raender direkt
   nebeneinander und lesen sich optisch als EIN zusammengehoeriges,
   zweifarbiges Band (aussen Gruppe, innen Prioritaet). Rechts genuegt ein
   einfacher border-right auf der letzten Zelle (Statusspalte), dort war
   bisher keine border-right-Farbe vergeben. */
table.ticket-list-view tr.tc-row-priority td:nth-child(2) {
	border-left: 12px solid var(--color-priority);
}
table.ticket-list-view tr.tc-row-priority td:last-child {
	border-right: 12px solid var(--color-priority);
}
/* Protokollansicht (zweite Feinschliff-Runde, 25.08.2026, "Spaltenreihen-
   folge aendern"): dort ruckt Zeitpunkt auf Platz 2, wodurch die generische
   Regel oben (fuer normale Ticketlisten gedacht, dort Platz 2 = Betreff)
   in der Protokolltabelle die falsche Spalte traefe - eigene, spezifischere
   Regel auf die tatsaechliche Ticket-Zelle (.tc-log-ticket) statt auf die
   Position, gewinnt per hoeherer Selektor-Spezifitaet gegen die Regel oben. */
table.ticket-list-view tr.tc-log-row.tc-row-priority td:nth-child(2) {
	border-left: none;
}
table.ticket-list-view tr.tc-log-row.tc-row-priority td.tc-log-ticket {
	border-left: 12px solid var(--color-priority);
}
/* Nutzerauftrag (21.09.2026, "Zeilen-Hover fehlt bei Ticket-Gruppen/
   -Arten/Benutzer/Aufgaben-Verwaltung/SMS/Reporting/E-Mail-Vorlagen"):
   die bisherige Regel setzte filter:brightness() auf das <tr> selbst -
   per getComputedStyle als aktiv nachweisbar, aber im Rendertest (Vorher-/
   Nachher-Pixelvergleich per Hover) auf KEINER der betroffenen Tabellen
   sichtbar. <tr>/<td> bilden im Tabellen-Layout-Algorithmus eigene,
   anonyme Boxen, auf denen filter auf Zeilenebene in Chromium
   nachweislich nicht gemalt wird. Ersetzt durch background-color direkt
   auf den <td>-Zellen (dieselbe zuverlaessige Technik wie beim Protokoll,
   .tc-history-row:hover, s. o. in dieser Datei) - color-mix() mit der
   je Zeile ohnehin bereits gesetzten --tc-color-Variable (siehe
   includes/ticket_list_row.php u. a., vererbt sich automatisch auf die
   Zellen) erhaelt dabei die Gruppenfarbe farbiger Zeilen (Ticketlisten/
   Protokoll/Konto) und dunkelt sie nur ab, waehrend ungefaerbte Zeilen
   (Ticket-Gruppen/-Arten/Benutzer/Aufgaben-Verwaltung/SMS/Reporting/
   E-Mail-Vorlagen) denselben hellgrauen Hover-Ton wie das Protokoll
   erhalten (Fallback auf --color-border-strong, praktisch nicht von
   --color-background unterscheidbar). */
table.ticket-list-view tr:hover td,
table.pp-tabelle--zeilen tbody tr:hover td {
	/* 01.10.2026: dieselbe Zeilen-Hover-Regel auch fuer die Vorgangslisten
	   des Partnerportals (Startseite + Vorgaenge), keine zweite Regel. */
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 28%, var(--color-background));
}

/* Eigene, dedizierte Tabellenkopf-Klasse statt der zweckentfremdeten
   Hauptnav-Klasse ".UeberschriftMittel" (Bordeaux) - diese Farbe bleibt der
   Hauptnavigation vorbehalten (Phase B) und wird hier nicht angefasst. */
.tc-list-head td {
	background-color: var(--color-background);
	color: var(--color-text);
	font-family: var(--font-system);
	font-size: 11px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .04em;
	padding: 9px 10px;
	border-bottom: 2px solid var(--color-border-strong);
	vertical-align: middle;
}

/* Spalte 1 - ART: ausschliesslich das Ticketart-Bild, zentriert, kompakt.
   Kein Gruppenbild, kein Gruppentext, kein Art-Text mehr (Punkt 2) - die
   Ticketgruppe bleibt ueber die Zeilentoenung + den linken Farbstreifen
   erkennbar (Punkt 19), Gruppe/Art stehen stattdessen im Tooltip (Punkt 3). */
/* Nacharbeit (24.08.2026, "Bilddarstellung ueberarbeiten", Auftrag Punkt 2):
   vorher ein kleines 30px-Vorschaubild mittig in einer 7%-breiten Spalte -
   jetzt ein volles, quadratisches Bildfeld ueber die GESAMTE Zeilenhoehe.
   width:64px passt zur festen Spaltenbreite in includes/ticket_list_head.php
   (dieselbe Zahl, siehe dortiger Kommentar) - die Zeilenhoehe selbst bleibt
   weiterhin inhaltsabhaengig (kein CSS erzwingt eine Mindesthoehe), das
   Bildfeld ist dadurch fuer die allermeisten (kompakten) Zeilen bereits
   quadratisch bzw. sehr nah dran; bei ungewoehnlich hohen Zeilen (z. B.
   aufgeklappter Kontaktbereich/mehrzeiliger Betreff) streckt sich das
   Bildfeld ueber die dann groessere Zeilenhoehe (wird dabei zu einem
   hochformatigen statt quadratischen Rechteck - technisch nicht anders
   loesbar, da eine table-layout:fixed-Spalte fuer ALLE Zeilen dieselbe
   Breite hat, waehrend die Zeilenhoehe je Zeile variiert). padding:0
   laesst das Bildfeld bis an die Zellenkanten bleeden - den bestehenden
   Gruppenfarb-Akzent (border-left auf genau dieser ersten Zelle, siehe
   tr[data-ticket-url] td:first-child weiter unten) betrifft das nicht
   (Border liegt ausserhalb der Padding-Box). position:relative macht die
   Zelle zum Bezugsrahmen fuer das absolut positionierte Bildfeld (siehe
   .tc-list-art-image-wrap) - siehe dortigen Kommentar, warum eine reine
   Prozent-Hoehe hier NICHT zuverlaessig funktioniert. */
table.ticket-list-view td.tc-list-art {
	/* table.ticket-list-view td weiter oben setzt bereits padding:8px 8px
	   mit hoeherer Spezifitaet als eine reine Klassenregel - hier bewusst
	   ueber denselben Selektor-Aufbau (table.ticket-list-view + Element)
	   erneut aufgegriffen, damit padding:0 zuverlaessig greift. */
	width: 64px;
	padding: 0;
	position: relative;
	text-align: center;
}
/* Bild als CSS-Hintergrund statt <img> (siehe includes/ticket_list_row.php),
   absolut positioniert mit allen vier Kanten auf 0 statt ueber
   width/height:100%: eine Prozent-Hoehe wird in einer Tabellenzelle mit
   "auto"-Hoehe NICHT zuverlaessig gegen die tatsaechliche (aus dem
   Zeileninhalt resultierende) Zellenhoehe aufgeloest - im Rendertest
   bestaetigt (sowohl mit <img height:100%> als auch mit einer leeren
   <span height:100%> kollabierte das Bildfeld auf nahezu 0px Hoehe statt
   die Zeile zu fuellen). Ein absolut positioniertes Element mit
   top/right/bottom/left:0 bezieht seine Groesse dagegen IMMER direkt aus
   der Padding-Box des positionierten Vorfahren (hier die Zelle selbst,
   siehe position:relative oben) - unabhaengig von den "Prozenthoehe
   braucht explizite Elternhoehe"-Einschraenkungen reiner Fluss-Elemente,
   und dadurch zuverlaessig ueber alle Zeilenhoehen hinweg. background-
   size:cover verhaelt sich wie object-fit:cover (kein Verzerren, sauberes
   Zuschneiden auf beliebige Seitenverhaeltnisse). Diese Klasse traegt im
   Markup zusaetzlich die generische .tc-tip-Klasse (Tooltip, siehe weiter
   unten) - die setzt selbst position:relative auf demselben Element, mit
   gleicher Selektor-Spezifitaet. Deshalb hier ueber
   table.ticket-list-view zusaetzlich verstaerkt, damit position:absolute
   zuverlaessig gewinnt, unabhaengig von der Reihenfolge im Stylesheet.
   Der Tooltip selbst (.tc-tip::after, positioniert relativ zur eigenen
   Box) funktioniert davon unberuehrt weiter - er braucht lediglich IRGEND
   ein positioniertes Element als Bezugsrahmen, relative und absolute
   erfuellen das gleichermassen. */
table.ticket-list-view .tc-list-art-image-wrap {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	background-color: var(--color-background);
	background-size: cover;
	background-position: center;
	border-bottom: 3px solid var(--tc-art-color, transparent);
}

/* Punkt 3/23/24/25: schlanker CSS-Tooltip ohne JavaScript/neue Abhaengigkeit.
   Sichtbar per Hover UND Tastaturfokus (:focus-visible) - die eigentliche
   Bedeutung fuer Screenreader kommt zusaetzlich ueber aria-label, da der
   ::after-Inhalt (attr(data-tip)) von Screenreadern nicht vorgelesen wird.
   tabindex="0" auf dem jeweiligen Element macht es fokussierbar. */
.tc-tip {
	position: relative;
	display: inline-flex;
	/* Nutzerauftrag (19.09.2026, "Protokoll -> Ticketaktivitäten:
	   horizontalen Scrollbalken beseitigen"): tatsaechliche Ursache war
	   NICHT die Tabelle selbst (siehe box-sizing-Fix bei
	   table.ticket-list-view), sondern das per position:absolute zentrierte
	   Tooltip (.tc-tip::after) - obwohl nur bei :hover sichtbar, zaehlte
	   sein volles (oft breites) Rechteck bereits im Ruhezustand zur
	   scrollbaren Breite des naechsten Vorfahren mit overflow-x:auto
	   (.tc-log-scroll auf der Protokoll-Seite). "contain: layout" isoliert
	   die Layout-/Ueberlaufberechnung dieses Elements von aussenstehenden
	   Vorfahren, OHNE das Tooltip selbst optisch zu beschneiden (nur
	   "contain: paint" wuerde das zusaetzlich abschneiden) - das Tooltip
	   bleibt beim Hovern weiterhin normal sichtbar. */
	contain: layout;
}
.tc-tip::after {
	content: attr(data-tip);
	position: absolute;
	bottom: 100%;
	left: 50%;
	transform: translate(-50%, -6px);
	background-color: var(--color-text);
	color: #FFFFFF;
	font-family: var(--font-system);
	font-size: 11px;
	font-weight: 500;
	line-height: 1.4;
	white-space: pre-line;
	text-align: left;
	padding: 6px 9px;
	border-radius: var(--radius-small);
	box-shadow: var(--shadow-medium);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity .12s ease;
	z-index: 30;
	width: max-content;
	max-width: 220px;
}
.tc-tip:hover::after,
.tc-tip:focus-visible::after {
	opacity: 1;
	visibility: visible;
}
.tc-tip:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
	border-radius: var(--radius-small);
}

/* Spalte 2 - TICKET / KONTAKT: die Hauptspalte (Punkt 4/21). */
.tc-list-subject {
	width: 46%;
}
/* Runde 9: Betreff + Prioritaets-Icon + Hinweis-Icon + Aufklapp-Pfeil stehen
   jetzt alle in EINER Flex-Zeile (Vorgabe Punkt 4: Pfeil "nicht irgendwo
   losgelöst am Rand", sondern direkt beim Betreff). align-items:flex-start
   sorgt dafuer, dass Icon/Pfeil an der ERSTEN Betreffzeile ausgerichtet
   bleiben, auch wenn der Betreff auf 2 Zeilen umbricht. */
.tc-list-title-row {
	display: flex;
	align-items: flex-start;
	gap: 6px;
}
/* "Hohe Prioritaet" vereinheitlicht (Nacharbeit 21.08.2026): das bisherige
   einzelne Warn-Dreieck (nur Icon, Text nur per Tooltip erreichbar) wirkte
   laut Nutzer-Feedback "deutlich zu unauffaellig" und ist ersetzt durch
   dieselbe Icon+Text-Kennzeichnung wie Karten-/Detailansicht (siehe
   .tc-priority-badge/.tc-priority-pill), als eigene, kompakte Zeile
   OBERHALB des Betreffs statt inline davor - faellt dadurch beim
   Ueberfliegen sofort auf, ohne die Zeile bei normalen Tickets zu vergroessern
   (nur Tickets mit hoher Prioritaet bekommen die zusaetzliche Zeile). */
.tc-list-priority-badge {
	margin-bottom: 4px;
}
.tc-list-title {
	flex: 1 1 auto;
	/* Punkt 3: ungefaehr die bisherige Firmennamen-Groesse (.UeberschriftaufGrau
	   = 16px) statt der vorherigen 15px - der Betreff ist jetzt die einzige
	   Information, die im geschlossenen Zustand sofort ins Auge fallen muss. */
	font-size: 16px;
	font-weight: 700;
	line-height: 1.35;
	color: var(--color-text);
	/* bewusst KEIN white-space:nowrap/ellipsis - der Betreff darf umbrechen,
	   die Spaltenbreite verhindert bereits ein Verquetschen. */
}
/* .tc-contact-toggle ist bereits generisch aus der Kartenansicht
   (margin-left:auto schiebt ihn innerhalb der Flex-Zeile automatisch ganz
   nach rechts) - hier nur eine minimale Ausrichtungskorrektur an der ersten
   Betreffzeile, keine neue Toggle-Logik. */
.tc-list-title-row .tc-contact-toggle {
	margin-top: 1px;
}
/* Punkt 2/5/18: Firma/Kundennummer/Ansprechpartner/Telefon/Adresse/Fax/
   E-Mail/Webseite/Kontakthinweise/Ticketwert stehen jetzt VOLLSTAENDIG im
   aufklappbaren Bereich (bisher war nur ein Teil eingeklappt) - dieselbe
   generische .tc-contact-details-Klasse wie in der Kartenansicht, nur die
   Spaltenzahl beim Aufklappen ist wegen der schmaleren Listenspalte
   reduziert. */
.tc-list-contact-details.tc-open {
	grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
}

/* Spalte 3 - INFORMATIONEN (Runde 9, kehrt zurueck): nur noch Erstellt-Zeit
   + Ticketnummer - keine Altersangabe mehr (Punkt 8: "vor N Tag(en)"
   vollstaendig aus der Liste entfernt, die Kartenansicht behaelt diese
   Angabe unveraendert). */
.tc-list-info {
	/* Nacharbeit (24.08.2026, "Wert-Spalte ergaenzen"): 21% -> 20%, siehe
	   Breitenverteilung in includes/ticket_list_head.php. */
	width: 20%;
}
.tc-list-info-row {
	display: flex;
	align-items: center;
	gap: 5px;
	margin-bottom: 4px;
}
.tc-list-info-row:last-child {
	margin-bottom: 0;
}
.tc-list-info-row .tc-icon {
	color: var(--color-text-muted);
	flex-shrink: 0;
}
/* Punkt 5: Ticketnummer jetzt in derselben Schriftgroesse wie Datum/Uhrzeit
   (vorher 11px, deutlich kleiner) - bleibt nur ueber die Farbe dezenter,
   nicht mehr ueber die Groesse. */
.tc-list-info-ticketnumber {
	color: var(--color-text-muted);
	overflow-wrap: anywhere;
}
.tc-list-info-owner {
	font-weight: 600;
}
/* Termine hervorheben (18.08.2026): Erstellt bleibt bewusst die unauffaellige
   Metainformation (Auftrag Punkt 1/2) - eigenes neutrales Icon ('erstellt'),
   aber unveraendert dezente Farbe/Gewichtung wie zuvor. */
.tc-list-info-erstellt {
	color: var(--color-text-muted);
}
/* Ticket-Termine Teil B (18.08.2026, verstaerkt "Termine hervorheben"):
   Terminindikator - nur sichtbar, wenn tatsaechlich ein Termin vorhanden ist
   (siehe $tc_list_hat_termin in includes/ticket_list_row.php). Deutlich
   staerker hervorgehoben als eine reine Textzeile (dezenter Rahmen +
   Hintergrundtoenung als kleines Badge), aber bewusst zurueckhaltender als
   die vollflaechigen Status-/Eskaliert-/Geparkt-Badges (Auftrag Punkt 7:
   "wichtiger als Erstellungsdatum, aber nicht wichtiger als Status/
   Eskalation"). Farbe bewusst --color-primary/--color-info-subtle (bereits
   bestehendes Marken-Blau bzw. dessen dezente Toenung) statt --color-park
   oder --color-danger - unterscheidet sich damit klar von Parkstatus/
   Eskalation (Auftrag Punkt 15). */
.tc-list-info-termin {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	font-weight: 700;
	color: var(--color-primary-dark);
	background-color: var(--color-info-subtle);
	border: 1px solid var(--color-primary);
	border-radius: var(--radius-small);
	padding: 3px 8px 3px 6px;
	margin-bottom: 4px;
}
.tc-list-info-termin .tc-icon {
	color: var(--color-primary);
}
.tc-list-info-termin-text {
	white-space: nowrap;
}
/* Termingrund-Info-Symbol (24.08.2026, "Termingrund in Karten-, Listen- und
   Detailansicht ergaenzen", Auftrag Punkt 3/9): nutzt die bestehende
   .tc-tip-Tooltip-Komponente unveraendert (kein neues Tooltip-System) -
   nur Icon-Farbe/Cursor ergaenzt, damit erkennbar ist, dass hier weitere
   Information per Hover/Tastaturfokus abrufbar ist. Wird in PHP nur
   gerendert, wenn tatsaechlich ein Termingrund vorhanden ist. */
.tc-list-info-termin-grund {
	cursor: help;
}
.tc-list-info-termin-grund .tc-icon {
	color: var(--color-primary);
}

/* Spalte 4 - STATUS (Runde 10): EIN zusammenhaengendes Status-Badge, das
   Eskaliert/Geparkt als farbigen "Flag"-Teilbereich direkt integriert
   (Punkt 7-10 - keine separate Markierung/Spalte mehr, schliessen sich
   fachlich weiterhin aus). Besitzer darunter. Der Ticketwert steht nicht
   mehr hier, sondern nur noch im aufklappbaren Bereich. */
.tc-list-status {
	/* Nacharbeit (24.08.2026, "Wert-Spalte ergaenzen"): 26% -> 24%, siehe
	   Breitenverteilung in includes/ticket_list_head.php - das bereits
	   vereinheitlichte 236px-Statusbadge selbst (.ticket-status--compact)
	   ist unveraendert, die Spalte bleibt damit weiterhin deutlich breiter
	   als das Badge braucht. */
	width: 24%;
}
/* Neue Wert-Spalte (24.08.2026, "Listen- und Kartenansicht um Wochentag,
   Wert-Spalte und Informationsreihenfolge ergaenzen", Auftrag Punkt 3/6/7):
   bewusst kompakt (12%, siehe Breitenverteilung in includes/
   ticket_list_head.php) - Inhalt ist kurz (Icon + Betrag bzw. kurzer
   Statustext). Dieselbe .tc-list-info-row-Typografie wie die uebrigen
   Informationszeilen (Auftrag Punkt 6: "gut lesbar, aber nicht dominanter
   als der Status"), bestehende format_eur()-Formatierung unveraendert
   weiterverwendet - hier nur Position/Breite/Ausrichtung. */
.tc-list-wert {
	width: 12%;
	vertical-align: middle;
}
.tc-list-wert-row {
	font-weight: 600;
	color: var(--color-text);
}
/* Wichtig: display:flex sitzt bewusst auf einem inneren <div>, NICHT direkt
   auf dem <td> selbst - siehe Analyse: flex direkt auf einer Tabellenzelle
   innerhalb einer table-layout:fixed-Tabelle mit <colgroup> fuehrte in
   Chromium zu einem Layoutfehler (Badges wurden zusammengequetscht). */
.tc-list-status-inner {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 5px;
}
/* Punkt 6: deutlich groessere Schrift/Innenabstand/Hoehe als zuvor (12px/
   5px 6px -> 14px/7px 10px), damit der Status beim Ueberfliegen sofort ins
   Auge faellt. overflow:hidden + border-radius auf dem AEUSSEREN Badge
   sorgt dafuer, dass der innere Flag-Teilbereich (falls vorhanden) optisch
   in dieselbe abgerundete Pille "eingegossen" wirkt, statt wie ein
   zweites, loses Element daneben (Punkt 7/8: "wie EINE gemeinsame
   Statusanzeige, nicht wie zwei lose Badges"). Bewusst keine feste Breite
   mehr (vorher 118px) - die Pille passt sich der Statuslaenge an, dadurch
   braucht "Verfuegbar" weniger Platz als "Wieder geoeffnet". */
.tc-list-status-badge {
	display: inline-flex;
	align-items: stretch;
	max-width: 100%;
	border-radius: var(--radius-large);
	overflow: hidden;
	border: 1px solid rgba(0, 0, 0, .08);
	box-shadow: var(--shadow-small);
}
/* .tc-list-status-text wurde durch die zentrale Komponente ".ticket-status
   .ticket-status--compact" ersetzt (Facelift-Nacharbeit 14.08.2026, siehe
   Abschnitt "Einheitliche Ticket-Statuskomponente" weiter unten) - Werte
   1:1 uebernommen, nur zentralisiert. */
/* Punkt 7-10: der Flag-Teilbereich fuer Eskaliert/Geparkt sitzt INNERHALB
   desselben Badges (erstes Kind, direkt links vom Statustext) statt als
   eigenes, separat positioniertes Element - dieselben Farben wie die
   Kartenansicht (--color-danger-strong/--color-park), Tooltip/aria-label
   uebernehmen weiterhin die Textinformation ("Eskaliert"/"Geparkt bis...")
   fuer Maus, Tastaturfokus und Screenreader. */
.tc-list-status-flag {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 26px;
	font-size: 13px;
	font-weight: 800;
	color: #FFFFFF;
}
.tc-list-status-flag-eskaliert {
	background-color: var(--color-danger-strong);
}
/* .tc-list-status-flag-geparkt entfernt (17.08.2026, UX-Anpassung
   "Geparkte Tickets korrekt darstellen"): der fruehere separate "P"-Flag
   neben dem unveraendert weiter sichtbaren letzter_status war redundant zur
   jetzt eingefuehrten vollstaendigen GEPARKT-Statuspille (siehe
   includes/ticket_list_row.php) und wurde durch diese ersetzt. */

/* ==========================================================================
   PHASE D.2: Ticketkarten-Redesign (nur verfuegbar/geschlossen/uebernommen)
   --------------------------------------------------------------------------
   Diese drei Dateien haben identische Kartenansicht-Struktur (Copy-Paste,
   siehe Facelift_Analyse_und_Plan.md Abschnitt 13) und wurden von der
   verschachtelten <table class="ticket-card-view"> auf eine semantische
   <div class="ticket-card-view"> mit CSS Grid umgestellt. Die uebrigen 9
   Listen-/Kartendateien behalten die Tabellenstruktur aus Phase D bei -
   die Regeln "table.ticket-card-view" oben bleiben dafuer unveraendert
   bestehen. "div.ticket-card-view" (dieser Block) betrifft ausschliesslich
   die 3 umgebauten Dateien, "table.ticket-list-view" bleibt in ALLEN 12
   Dateien unveraendert die kompakte Listenansicht - siehe Abschnitt 12/13.
   ========================================================================== */

/* Phase D.6: --tc-color traegt jetzt die TICKETGRUPPEN-Farbe (primaere
   Ticketidentifikation, wie in der Listenansicht) statt der Ticketart-Farbe -
   siehe Analyse in der Dokumentation. Die Gruppenfarbe bestimmt die Basis der
   gesamten Karte (leichte Toenung, Nacharbeit Punkt 1/2), der linke Rand zeigt
   sie zusaetzlich in voller Staerke als Akzent. Die Ticketart-Farbe bleibt
   ausschliesslich lokal hinter dem Ticketart-Bild (.tc-images, Punkt 4). */
div.ticket-card-view {
	display: grid;
	/* Nacharbeit (24.08.2026, "Bilddarstellung ueberarbeiten", Auftrag Punkt
	   3): erste Spalte von 50px auf 108px verbreitert, damit das jetzt
	   deutlich groessere Artenbild (100px, siehe .tc-image) Platz hat.
	   Nacharbeit (24.08.2026, "Kartenansicht auf dreispaltiges
	   Informationslayout umbauen", Auftrag Punkt 7): neuer Grid-Bereich
	   "info" zwischen "main" und "side" (siehe .tc-info weiter unten) -
	   images(108px, fest)+main zusammen bilden weiterhin die "linke Spalte"
	   (Bild+Betreff+Kontakt, Zielgewichtung ca. 55-60% der Kartenbreite),
	   "info" die neue mittlere Spalte (ca. 20-25%, Termin/Erstellt/Alter/
	   Ticketnummer), "side" bleibt wie bisher auto-breit (~20%, unveraendert
	   dimensioniert - Auftrag Punkt 7: "Status behaelt seine bereits
	   vereinheitlichte Breite"). minmax(180px, ...) (im Rendertest von
	   150px auf 180px angehoben, siehe .tc-info-termin weiter unten)
	   verhindert, dass die mittlere Spalte bei sehr breiten Karten zu
	   schmal fuer den Termin-Datum/Uhrzeit-Text wird und dieser dadurch in
	   die rechte Statusspalte hineinueberlaeuft.
	   Nacharbeit (24.08.2026, "Termingrund ergaenzen"): oberes Limit von
	   1fr auf ein festes 260px umgestellt. Ein "1fr"-Maximum gilt fuer die
	   CSS-Grid-Spuralgorithmus-Zwecke als unbegrenzt waechst waehrend der
	   "Resolve intrinsic track sizes"-Phase auf die MAX-CONTENT-Breite
	   ihres Inhalts, sobald irgendein Nachfahre (hier: der neue, laengere
	   Termingrund-Text in .tc-termin-grund) ungebrochen breiter sein
	   moechte - im Rendertest sprengte ein laengerer Termingrund dadurch
	   die gesamte Karte, statt wie gewuenscht innerhalb der Spalte
	   umzubrechen. Ein festes Maximum kappt die Spurbreite hart, wodurch
	   der Browser den Inhalt stattdessen zwingend umbricht (siehe
	   overflow-wrap:anywhere/flex-wrap:wrap an den betroffenen Elementen). */
	/* Nacharbeit (24.08.2026, "Wert-Spalte ergaenzen"): kurzzeitig eine
	   fuenfte Spur "wert" rechts neben "side" eingefuehrt - auf
	   ausdruecklichen Nutzerwunsch direkt danach wieder zurueckgebaut, der
	   Ticketwert steht in der Kartenansicht wieder wie zuvor INNERHALB von
	   .tc-side, direkt unter dem Besitzer (siehe dort). Wieder die
	   urspruengliche Vierspalten-Aufteilung. */
	grid-template-columns: 108px minmax(0, 2fr) minmax(180px, 260px) auto;
	grid-template-areas:
		"header header header header"
		"urgent urgent urgent urgent"
		"images main info side";
	column-gap: var(--spacing-sm);
	row-gap: 6px;
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 7%, var(--color-surface));
	border: 1px solid var(--color-border);
	/* Ticketgruppen-Farbe in voller Staerke als Rand/Akzent - eigener Rahmen statt
	   Vollflaechen-Hintergrund, damit Text lesbar bleibt (Phase D.3 Abschnitt 4/6,
	   seit D.6 auf Gruppenfarbe umgestellt). Phase D.7: auf Nutzerwunsch 3-4x
	   breiter (6px -> 20px) fuer eine deutlich staerkere Praesenz der Farbe. */
	border-left: 20px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	box-shadow: none;
	margin-bottom: 10px;
	padding: 8px 12px;
	/* Kartenoptimierung: Bezugsrahmen fuer die absolut positionierte Eck-Markierung
	   (.tc-corner-ribbon, Punkt 1) - reine Positionierungsgrundlage, kein
	   Einfluss auf die bestehende Grid-Anordnung/Optik der Karte. */
	position: relative;
	transition: background-color .1s ease, border-color .1s ease, border-left-width .1s ease, box-shadow .15s ease;
}
/* Phase D.6: Karte/Zeile als Ganzes klickbar (Nacharbeit Punkt 11/19) - Cursor
   und Fokus-Zustand nur, wenn tatsaechlich eine Ticket-URL hinterlegt ist. */
/* Hohe Prioritaet zusaetzlich als linke/rechte Einfassung (Nacharbeit
   21.08.2026, Auftrag Punkt 3/4): ergaenzt die bestehende Ticketgruppen-/
   Ticketartfarbe, ersetzt sie NICHT - der linke Gruppenfarb-Rahmen (siehe
   border-left oben) bleibt unveraendert bestehen. Rechts genuegt ein
   einfaches border-right (die Karte hatte dort zuvor nur die duenne 1px-
   Basisfarbe aus dem "border"-Shorthand, unproblematisch zu ueberschreiben).
   Links kann die Farbe NICHT ueber border-left gesetzt werden (dort steht
   bereits die Gruppenfarbe) - stattdessen ein Pseudo-Element: position:
   absolute bezieht sich per Spezifikation auf die PADDING-Box des bereits
   position:relative gesetzten Kartencontainers, "left:0" beginnt also
   automatisch erst NACH dem bestehenden Gruppenfarb-Rahmen, nie darueber -
   dadurch entsteht genau das gewuenschte "aeusserer Rahmen = Gruppe, innen
   liegender Streifen = Prioritaet"-Bild, ohne dass die Gruppenfarbe jemals
   ueberschrieben wird. */
div.ticket-card-view.tc-card-priority {
	border-right: 12px solid var(--color-priority);
}
div.ticket-card-view.tc-card-priority::before {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	width: 12px;
	background-color: var(--color-priority);
}
div.ticket-card-view[data-ticket-url] {
	cursor: pointer;
}
div.ticket-card-view[data-ticket-url]:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
/* EIN einziger Hover-Zustand fuer die gesamte Karte - siehe Punkt 2 der
   Nacharbeit "Karte muss wie EIN Ticket wirken". Alle Unterbereiche (Bild,
   Dringlichkeit, Status, Kontakt) haben bewusst KEINEN eigenen Hover/Schatten/
   Hintergrund mehr - nur diese eine Regel. Der linke Rand behaelt beim Hover
   bewusst seine Ticketgruppen-Farbe (border-left-color wird NICHT ueberschrieben,
   nur etwas breiter = "Akzent etwas deutlicher") - Gruppenfarbe und Hover-Zustand
   sind zwei unterschiedliche Informationen, die sich nicht gegenseitig
   verdraengen duerfen. Die Flaechentoenung wird beim Hover zusaetzlich etwas
   staerker (Nacharbeit Punkt 19 - "Akzent etwas deutlicher"). */
div.ticket-card-view:hover {
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 11%, var(--color-surface));
	border-top-color: var(--color-primary);
	border-right-color: var(--color-primary);
	border-bottom-color: var(--color-primary);
	border-left-width: 24px;
	box-shadow: var(--shadow-small);
}
/* Innerhalb der Karte keinen eigenen Link-Hover-Hintergrund mehr (der
   generische a:hover weiter unten in dieser Datei wuerde sonst Titel-/
   Ticketnummer-Link separat aufblitzen lassen, unabhaengig vom Karten-Hover -
   genau das "Umspringen zwischen Unterbereichen", das vermieden werden soll). */
div.ticket-card-view a:hover {
	background-color: transparent;
	color: var(--color-primary-dark);
	text-decoration: underline;
	border: none;
}

/* Phase D.5/D.6: Header wird zum eindeutig erkennbaren Kartenkopf - bleedet bis
   an die Kartenkanten (negative Margin = Card-Innenabstand, siehe
   div.ticket-card-view padding: 8px 12px) und traegt eine etwas kraeftigere
   Toenung derselben dynamischen Ticketgruppen-Farbe wie die restliche Karte
   (--tc-color, inline gesetzt zusammen mit border-left-color - dieselbe
   bestehende Quelle, keine neue Farblogik). color-mix() degradiert bei
   fehlender Browser-Unterstuetzung sicher auf "kein Hintergrund" (kein Bruch). */
.tc-header {
	grid-area: header;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--spacing-sm);
	margin: -8px -12px 0 -12px;
	padding: 10px 12px 11px 12px;
	border-radius: var(--radius-small) var(--radius-small) 0 0;
	border-bottom: 1px solid var(--color-border);
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 16%, var(--color-surface));
}
/* Kartenoptimierung Runde 2 (12.08.2026), Punkt 1/2: reserviert Platz rechts im
   Kopfbereich, damit die Eck-Markierung (.tc-corner-ribbon, absolut positioniert
   auf der Karte, jetzt breiter/groesser) nie die Gruppen-/Art-Bezeichnung
   ueberdeckt - die Klasse wird nur gesetzt, wenn tatsaechlich eine Ribbon
   gerendert wird (eskaliert ODER geparkt). Wert an die neue feste Ribbon-Breite
   (siehe .tc-corner-ribbon) angepasst. */
.tc-has-ribbon .tc-header {
	padding-right: 210px;
}
/* Kartenoptimierung Runde 2, Punkt 1/2: Gruppe und Art jetzt auf zwei Zeilen
   statt einer gemeinsamen Zeile - die Art ist fachlich die wichtigere
   Information (Vorgabe) und wird deshalb mindestens gleich gross, hier per
   Farbnuance (bestehendes --color-primary-dark, kein neues Farbsystem) und
   Icon staerker betont als die Gruppe. Bleibt reiner Text/Icon, kein neues
   Badge/Kasten. */
.tc-category {
	font-family: var(--font-system);
	display: flex;
	flex-direction: column;
	gap: 1px;
	flex: 1 1 auto;
	min-width: 0;
}
.tc-category-gruppe {
	font-size: 12px;
	font-weight: 700;
	color: var(--color-text);
	text-transform: uppercase;
	letter-spacing: .03em;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.tc-category-art {
	display: flex;
	align-items: center;
	gap: 4px;
	font-size: 14px;
	font-weight: 700;
	color: var(--color-primary-dark);
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.tc-category-art .tc-icon {
	flex-shrink: 0;
	color: var(--color-primary-dark);
	opacity: .8;
}

/* Phase D.4: Gruppenbild wandert in den Kartenkopf (statt doppelter Anzeige mit
   dem Bild der Ticketart im Hauptbereich) - dient der schnellen Gruppenzuordnung,
   das Ticketart-Bild bleibt separat im Hauptbereich (.tc-image). */
.tc-header-left {
	display: flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
	overflow: hidden;
}
/* Nacharbeit (24.08.2026, "Bilddarstellung ueberarbeiten", Auftrag Punkt 3):
   Gruppenbild im Kartenkopf deutlich groesser (30px -> 46px) - bleibt
   bewusst kleiner als das Artenbild (siehe .tc-image weiter unten, jetzt
   100px), damit die Groessenhierarchie "Artenbild = Hauptbild,
   Gruppenbild = ergaenzendes Kennzeichen" erhalten bleibt. Wirkt auch
   ausserhalb der Kartenansicht (Basisregel), betrifft aber nur die
   Kartenansicht tatsaechlich sichtbar - die Detailseite ueberschreibt
   diese Groesse ohnehin eigenstaendig (siehe .tc-detail-head-media weiter
   unten). */
.tc-header-image {
	width: 46px;
	height: 46px;
	object-fit: cover;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-border);
	flex-shrink: 0;
	display: block;
}

/* Phase D.4: Eskalation ist keine Status-Variante, sondern eine eigene,
   deutlich staerker hervorgehobene Warnebene - daher eigener Badge oben rechts
   im Kartenkopf, unabhaengig vom (weiterhin separat sichtbaren) Ticketstatus.
   Kartenoptimierung Punkt 1 (12.08.2026): Der Badge im Kopfbereich sowie das
   frueherer "GEPARKT bis..."-Badge im Statusbereich (.tc-side) entfallen - beide
   Zustaende wandern in eine gemeinsame, deutlich sichtbare Eck-Markierung oben
   rechts an der GESAMTEN Karte (nicht nur im Kopfbereich). Eskaliert/Geparkt
   koennen fachlich nie gleichzeitig zutreffen (PHP-seitig als if/elseif
   umgesetzt) - es gibt daher immer nur eine Ribbon pro Karte. Absolut
   positioniert auf .ticket-card-view (siehe position:relative dort), daher OHNE
   eigene Grid-Area - nimmt keinen Platz im Grid ein, ueberlagert nur die obere
   rechte Ecke. .tc-has-ribbon reserviert dafuer Platz im Kopfbereich (oben). */
/* Kartenoptimierung Runde 2, Punkt 3 (12.08.2026): Schrift/Icons sichtbar
   vergroessert (12px -> 16px) und beide Varianten (Eskaliert/Geparkt) tragen
   jetzt dieselbe feste Breite (min(), degradiert auf schmalen Karten sicher
   auf die verfuegbare Breite) statt einer inhaltsabhaengigen max-width - das
   kuerzere "Eskaliert" bekommt dadurch denselben Platzbedarf wie das laengere
   "Geparkt bis ..." (einheitliches Erscheinungsbild ueber mehrere Karten
   hinweg, Vorgabe). white-space:normal statt nowrap/ellipsis, damit das
   Parkdatum IMMER vollstaendig lesbar bleibt (notfalls zweizeiliger Umbruch
   innerhalb der festen Breite, statt es wie zuvor bei schmalen Karten
   auszublenden). */
.tc-corner-ribbon {
	position: absolute;
	top: 0;
	right: 0;
	z-index: 2;
	display: inline-flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 2px 6px;
	width: min(230px, calc(100% - 20px));
	padding: 8px 16px 8px 22px;
	font-size: 16px;
	font-weight: 700;
	color: #FFFFFF;
	line-height: 1.25;
	white-space: normal;
	text-align: left;
	/* Diagonal angeschnittene linke Kante = klar erkennbare "Eck-Ribbon"-Form,
	   Text bleibt dabei vollstaendig horizontal/waagerecht und damit lesbar
	   (bewusst KEINE 45-Grad-Rotation - Lesbarkeit hat Vorrang, siehe Auftrag
	   Punkt 1: "darf den restlichen Inhalt nicht unleserlich machen"). */
	clip-path: polygon(18px 0, 100% 0, 100% 100%, 0 100%);
	border-radius: 0 var(--radius-small) 0 0;
	box-shadow: 0 1px 3px rgba(0, 0, 0, .2);
}
.tc-corner-ribbon-eskaliert {
	background-color: var(--color-danger-strong);
}
.tc-corner-ribbon-geparkt {
	background-color: var(--color-park);
}
.tc-corner-ribbon .tc-icon {
	flex-shrink: 0;
	width: 18px;
	height: 18px;
}
.tc-corner-ribbon .tc-park-icon {
	display: inline-block;
	flex-shrink: 0;
	font-weight: 800;
	line-height: 1.2;
	border: 2px solid #FFFFFF;
	border-radius: 3px;
	padding: 0 4px;
	margin-right: 2px;
}
.tc-corner-ribbon .tc-corner-date {
	/* flex-basis:100% erzwingt bei flex-wrap:wrap einen Umbruch auf eine neue
	   Zeile INNERHALB der festen Ribbon-Breite, statt das Datum abzuschneiden
	   oder auszublenden (Vorgabe: "muss vollstaendig lesbar bleiben"). Der
	   linke Einzug richtet das Datum unter dem Wort "Geparkt" statt unter dem
	   Icon aus (Icon-Breite 18px + Abstand 6px). */
	flex-basis: 100%;
	margin-left: 24px;
	font-weight: 500;
	font-size: 13px;
}
/* Deeskalieren-Symbol direkt im Eskaliert-Ribbon (Nacharbeit 20.08.2026,
   Auftrag Punkt 1): .tc-corner-ribbon ist bereits ein Flex-Container -
   margin-left:auto schiebt diesen zusaetzlichen Kind-Link an den rechten
   Rand der bestehenden Zeile, ohne die Ribbon-Form/-Breite/-Farbe
   anzufassen. Dezenter halbtransparenter Kreis statt vollem Weiss, damit
   das Symbol nicht staerker wirkt als der Ribbon-Text selbst. */
.tc-corner-ribbon-action {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	margin-left: auto;
	width: 26px;
	height: 26px;
	/* min-height:0 hebt das projektweite Formularelement-Grundstyling
	   ("input[type=submit], input[type=button], button { min-height:38px;
	   padding:8px 18px; ... }" weiter oben in dieser Datei) auf - seit
	   Nacharbeit 20.08.2026 ("ohne Formular-Zwischenseite") ist dieses
	   Element ein <button> statt eines <a>, faellt also erstmals unter
	   dieses generische Grundstyling. */
	min-height: 0;
	padding: 0;
	border: none;
	border-radius: var(--radius-small);
	background-color: rgba(255, 255, 255, .2);
	color: #FFFFFF;
	cursor: pointer;
}
.tc-corner-ribbon-action:hover,
.tc-corner-ribbon-action:focus-visible {
	background-color: rgba(255, 255, 255, .35);
}
.tc-corner-ribbon-action:focus-visible {
	outline: 2px solid #FFFFFF;
	outline-offset: 1px;
}
.tc-corner-ribbon-action .tc-icon {
	width: 15px;
	height: 15px;
}
/* Nacharbeit (20.08.2026, "Eskalieren/Deeskalieren/Reaktivieren/Wieder
   oeffnen ohne Formular-Zwischenseite" + "Nicht beobachten"): Deeskalieren/
   Eskalieren/Reaktivieren/Wieder oeffnen/Nicht beobachten POSTen jetzt
   direkt an die jeweils bereits bestehende Verarbeitungsdatei (kein
   sichtbares Formular mehr dazwischen), technisch aber weiterhin ueber ein
   echtes <form method="post">, damit die Aktion (wie zuvor) ein POST bleibt
   und nicht zu einem ungeschuetzten GET-Link herabgestuft wird. display:
   contents nimmt das <form> komplett aus dem Layout-Baum heraus, sodass der
   darin enthaltene <button> optisch/strukturell exakt wie zuvor der
   direkte <a>-Link als Kind seines jeweiligen Flex-Containers wirkt - keine
   sichtbare Aenderung an Position/Abstand/Ausrichtung. */
.tc-inline-action-form {
	display: contents;
}

/* Dringlichkeit - Verlauf: urspruenglich eine einzelne Bubble/Pille (bis
   11.08.2026), dann (Punkt 2, 12.08.2026) ein durchgehender horizontaler
   Warnbalken ueber die volle Kartenbreite. Nacharbeit (21.08.2026, "Hohe
   Prioritaet weiter vereinheitlichen"): der volle Balken wirkte im Vergleich
   zur inzwischen etablierten Listenansicht zu dominant/raumgreifend - jetzt
   wieder kompakt (Auftrag: "aehnlich zur Darstellung in der Listenansicht"),
   .tc-urgent ist nur noch ein schlichter Flex-Layoutcontainer OHNE eigene
   Flaeche/Bleed, die Warnfarbe sitzt stattdessen auf dem Badge selbst (siehe
   .tc-priority-pill unten) - dieselbe Technik wie in der Liste. Markup in
   allen 12 Kartendateien bewusst unveraendert, nur diese Regel angepasst. */
.tc-urgent {
	grid-area: urgent;
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: var(--spacing-sm);
}
/* Vereinheitlichung "Hohe Prioritaet" (Nacharbeit 21.08.2026, Auftrag
   "einheitlich und deutlich darstellen"): .tc-urgent-badge (Icon+Text,
   bislang nur hier definiert) ist jetzt Teil der gemeinsamen Basisregel
   .tc-priority-badge, die Listen- und Detailansicht ebenfalls verwenden -
   dieselbe Optik (Warnsymbol + sichtbarer Text + fette Schrift), ohne dass
   Karten-, Listen- und Detailansicht drei getrennte CSS-Regeln pflegen.
   .tc-priority-pill ergaenzt dieselbe eigene Hintergrundflaeche wie in der
   Liste - seit der Nacharbeit 21.08.2026 auch fuer .tc-urgent-badge noetig,
   da der umgebende Warnbalken (.tc-urgent) selbst keine Flaeche mehr traegt. */
.tc-urgent-badge,
.tc-priority-badge {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 13px;
	font-weight: 700;
	color: var(--color-priority-text);
	white-space: nowrap;
	flex-shrink: 0;
}
.tc-priority-pill,
.tc-urgent-badge {
	padding: 3px 9px;
	border-radius: var(--radius-small);
	background-color: var(--color-priority);
}
/* .tc-meta-time-row/.tc-meta-time entfallen (Nacharbeit 24.08.2026,
   "Kartenansicht auf dreispaltiges Informationslayout umbauen", Auftrag
   Punkt 4): die bisherige Zwischenzeile "Ticket wurde erstellt am ... -
   Vor ... Tag(en)" ist ersatzlos aus dem Markup entfernt (siehe .tc-info
   weiter unten) - beide Klassen werden dadurch nirgends mehr verwendet. */

.tc-body {
	display: contents;
}

/* Bildspalte: keine eigene abgerundete Box mehr, nur die admin-konfigurierte
   Artenfarbe bleibt als flache Flaeche erhalten (Information bleibt, wirkt
   aber nicht mehr wie eine eigenstaendige Kachel). Phase D.6: dies ist die
   EINZIGE Stelle in der Kartenansicht, an der die Ticketart-Farbe (sekundaer,
   $row_artensatz['hgfarbe']) sichtbar bleibt - unveraendert seit Phase D.2,
   bewusst NICHT auf die Gruppenfarbe umgestellt (Nacharbeit Punkt 4). */
.tc-images {
	grid-area: images;
	display: flex;
	flex-direction: column;
	gap: 3px;
	align-items: center;
	align-self: start;
	padding-top: 1px;
}
/* Kartenoptimierung Punkt 4 (12.08.2026): Ticketart-Bild ca. 20% groesser
   (44px -> 53px). Nacharbeit (24.08.2026, "Bilddarstellung ueberarbeiten",
   Auftrag Punkt 3): nochmals deutlich vergroessert (53px -> 100px, in etwa
   das gewuenschte "gut Doppelte" der vorherigen optischen Wirkung) - das
   Artenbild bleibt damit klar das dominante Hauptbild der Karte, das
   Gruppenbild im Kopfbereich (.tc-header-image, jetzt 46px) bleibt
   sichtbar kleiner. Die Grid-Spalte "images" (siehe div.ticket-card-view
   weiter oben/unten) ist entsprechend mitgewachsen. */
.tc-image {
	width: 100px;
	height: 100px;
	object-fit: cover;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-border);
	display: block;
}

/* ==========================================================================
   Phase E, Schritt 1 (13.08.2026), Nacharbeit (14.08.2026): Ticketkopf auf
   der Ticket-Detailseite (ticketing/anzeigen/show.php) - siehe dokumentation/
   Facelift_Analyse_und_Plan.md Abschnitt 19.12, Schritt 1. Rein additiv:
   ersetzt weiterhin noch KEINEN bestehenden Bereich der Seite (alter
   Betreff/Ticketnummer, altes Eskaliert-Banner, alter Gruppe/Art-Block,
   alter Statusbereich, alter Prioritaets-Banner bleiben unveraendert bestehen
   - siehe Kommentar in show.php). Nutzt weiterhin dieselben Klassen/
   Farbwerte wie die Karten-/Listenansicht (.tc-corner-ribbon/.tc-park-icon/
   .tc-corner-date, .tc-urgent/.tc-urgent-badge, .tc-header-image,
   .tc-images/.tc-image) fuer identische Statusfarblogik - Groessen/Abstaende
   wurden nach Nutzer-Feedback ("wirkt wie eine weitere Karte, nicht wie der
   zentrale Kopf der Detailseite") deutlich vergroessert. Gruppe/Art-
   Beschriftung und Status-Badge sind auf der Detailseite eigene, groessere
   Klassen (.tc-detail-category-* und .tc-detail-status-*) statt
   Wiederverwendung der kompakten Karten-Pendants (.tc-category-* und
   .tc-status-badge) - gleiche Farb-/Statuslogik, nur deutlich groessere
   Darstellung. */
.tc-detail-head {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 8px;
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 12%, var(--color-surface));
	border: 1px solid var(--color-border);
	/* Kopf-Optimierungsrunde (17.08.2026, Auftrag Punkt 2): der vorherige
	   26px breite Akzentrand (Phase E, Schritt 1) nahm unnoetig viel
	   horizontalen Platz ein - auf einen schmaleren, weiterhin kraeftigen
	   Streifen reduziert. Gruppenfarbe bleibt Hauptfarbe (voller Farbwert
	   auf dem Rand + dezente Flaechentoenung), Ticketart-Akzent bleibt am
	   Artbild (.tc-images background-color) - Farbkonzept unveraendert. */
	border-left: 8px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	padding: 16px 22px;
	margin-bottom: var(--spacing-lg);
	box-shadow: var(--shadow-small);
}
.tc-detail-head-top {
	display: flex;
	align-items: flex-start;
	gap: var(--spacing-lg);
	flex-wrap: wrap;
}
/* Nacharbeit (24.08.2026, "Bilddarstellung ueberarbeiten", Auftrag Punkt 1):
   vorher eine Zeile nebeneinander mit UNTERSCHIEDLICHER Groesse
   (Gruppenbild 46px, Artbild 68px) - wirkte uneinheitlich/gequetscht.
   Jetzt untereinander (Nutzerpraeferenz "eher untereinander als
   nebeneinander") und BEIDE exakt gleich gross (siehe .tc-header-image/
   .tc-image-Ueberschreibung weiter unten) - ruhiger, klar als
   zusammengehoeriges Bildpaar erkennbar statt zweier verschieden grosser
   Einzelbilder. */
.tc-detail-head-media {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 6px;
	flex-shrink: 0;
}
/* Gruppenbild/Artbild auf der Detailseite spuerbar groesser als in der
   Karte - es steht mehr Platz zur Verfuegung (Auftrag Punkt 13). object-
   fit:cover erhaelt weiterhin das Seitenverhaeltnis ohne Verzerrung.
   Nacharbeit (24.08.2026): beide jetzt auf dieselbe Groesse (60px)
   vereinheitlicht statt vorher 46px/68px - Auftrag Punkt 1: "Gruppenbild
   und Artenbild sollen dieselbe Groesse haben". */
.tc-detail-head-media .tc-header-image {
	width: 60px;
	height: 60px;
}
.tc-detail-head-media .tc-images {
	padding: 3px;
}
.tc-detail-head-media .tc-image {
	width: 60px;
	height: 60px;
}
.tc-detail-head-main {
	flex: 1 1 320px;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
	box-sizing: border-box;
}
/* Reserviert Platz rechts NUR fuer die Kategorie-/Betreffspalte, solange
   eine Eck-Ribbon angezeigt wird - die Ribbon ist absolut positioniert und
   nimmt daher selbst keinen Platz im Flex-Layout ein; ohne diese Reservierung
   waere die Gruppe-/Art-Zeile (Kartenkopf oben, auf derselben Hoehe wie die
   Ribbon) trotz Ellipsis-Regel nicht schmal genug, um nicht unter die Ribbon
   zu laufen (Ellipsis greift nur, wenn die Spalte selbst schon schmal genug
   ist). Das Statusdisplay (siehe .tc-has-ribbon .tc-detail-head-status)
   braucht diese Reservierung NICHT, da es ohnehin per margin-top unter die
   Ribbon rutscht. */
.tc-has-ribbon .tc-detail-head-main {
	padding-right: 280px;
}
@media (max-width: 700px) {
	.tc-has-ribbon .tc-detail-head-main {
		padding-right: 0;
	}
}
/* Gruppe/Art: eigene, deutlich groessere Klassen fuer die Detailseite -
   gleiche Hierarchie wie in der Karte (Art mindestens so betont wie Gruppe,
   Auftrag Punkt 4/5), aber keine "winzige Schrift" mehr (Auftrag Punkt 16). */
.tc-detail-category {
	display: flex;
	flex-direction: column;
	gap: 1px;
	/* Ohne min-width:0 wuerde dieses verschachtelte Flex-Element (Kind eines
	   ebenfalls flexiblen .tc-detail-head-main) nicht unter seine
	   Inhaltsbreite schrumpfen - die folgende Ellipsis-Begrenzung liefe sonst
	   ins Leere und der Text liefe stattdessen ueber die Spalte (und ggf.
	   unter die Eck-Ribbon) hinaus. */
	min-width: 0;
}
.tc-detail-category-gruppe {
	display: block;
	font-family: var(--font-system);
	/* Kopf-Optimierungsrunde (17.08.2026, Auftrag Punkt 4): Ticketgruppe
	   bewusst zurueckhaltender als Betreff UND als Ticketart gestaltet
	   (kleiner, gedeckte statt volle Textfarbe) - Ticketart bleibt klar
	   erkennbar (.tc-detail-category-art, primaerfarben/fett). */
	font-size: 13px;
	font-weight: 700;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .02em;
	/* Bei sehr langen Gruppennamen sauber abschneiden statt unter die
	   Eck-Ribbon zu laufen - gleiche Technik wie .tc-category-gruppe in der
	   Kartenansicht. */
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.tc-detail-category-art {
	display: flex;
	align-items: center;
	gap: 5px;
	font-family: var(--font-system);
	font-size: 18px;
	font-weight: 700;
	color: var(--color-primary-dark);
	min-width: 0;
}
.tc-detail-category-art .tc-icon {
	flex-shrink: 0;
	width: 18px;
	height: 18px;
	color: var(--color-primary-dark);
	opacity: .85;
}
.tc-detail-category-art-text {
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
/* Betreff = eigentliche Ueberschrift des geoeffneten Tickets (Auftrag
   Punkt 6) - deutlich groesser als Gruppe/Art, orientiert an einer
   H1/H2-Groesse innerhalb der Anwendung (bestehende .UeberschriftSeite
   liegt bei 20px; hier bewusst darueber, da dies der zentrale Seitentitel
   der Detailseite ist, nicht nur eine Kartenzeile). */
.tc-detail-title {
	font-family: var(--font-system);
	/* Kopf-Optimierungsrunde (17.08.2026, Auftrag Punkt 1/5): moderat
	   kompakter (26px->24px, Abstaende verringert) - bleibt bewusst deutlich
	   groesser als Gruppe/Art, Mehrzeilenumbruch weiterhin ueber
	   overflow-wrap:break-word moeglich, keine Abschneidung. */
	font-size: 24px;
	font-weight: 700;
	color: var(--color-text);
	line-height: 1.3;
	margin: 4px 0 2px 0;
	overflow-wrap: break-word;
}
/* Kopf-Optimierungsrunde (17.08.2026, Auftrag Punkt 6): kompakte Metazeile
   Ticketnummer + Besitzer unterhalb des Betreffs - deutlich zurueckhaltender
   als der Betreff, aber gut lesbar (nicht die vorherige 14px-Mikroschrift
   in Isolation, sondern als zusammengehoerige Zeile mit Trennpunkt). */
.tc-detail-meta {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
	margin-top: 2px;
}
.tc-detail-ticketnumber {
	font-size: 13px;
	color: var(--color-text-muted);
	font-weight: 600;
}
.tc-detail-meta-sep {
	color: var(--color-border-strong);
	font-weight: 700;
}
.tc-detail-meta-owner {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 13px;
	font-weight: 600;
	color: var(--color-text-muted);
}
.tc-detail-meta-owner .tc-icon {
	flex-shrink: 0;
	width: 13px;
	height: 13px;
}
.tc-detail-meta-owner a {
	color: var(--color-text-muted);
}
.tc-detail-meta-owner a:hover {
	color: var(--color-primary-dark);
}
/* Prioritaetsanzeige im Ticketkopf - Verlauf: urspruenglich ein voller
   Warnbalken direkt unter Gruppe/Art/Betreff, am 20.08.2026 ("Ticketkopf
   visuell nachjustieren") zu einem kompakten Chip INNERHALB der Metazeile
   verkleinert (druekte sonst den Statusbereich Richtung Mitte). Nutzer-
   Feedback 21.08.2026: dieser Chip war "zu leicht zu uebersehen" - jetzt
   wieder ein eigener, schmaler Balken (.tc-detail-priority-bar), diesmal
   aber erst NACH .tc-detail-head-top eingefuegt (siehe show.php) statt
   daneben/darin - dadurch entsteht NICHT erneut der 20.08.2026-Effekt
   (Status/Betreff werden nicht verdraengt, da die Leiste erst UNTER dem
   fertigen Kopf-/Statusbereich folgt). Bleedet wie .tc-detail-section-head
   bis an die Kanten von .tc-detail-head (negative Margin = dessen eigenes
   Padding) und rundet nur die UNTEREN Ecken - die Ticketgruppen-/
   Ticketartfarbe (Rahmen/Flaechentoenung auf .tc-detail-head selbst) bleibt
   dadurch unberuehrt, nur der Innenbereich wird an dieser Stelle ueberdeckt.
   Gleiche Farbtoken wie immer (--color-priority/-priority-text), Inhalt
   (Icon+Text) nutzt die mit der Kartenansicht geteilte .tc-priority-badge-
   Regel (siehe .tc-urgent-badge weiter oben) - "Hohe Prioritaet" sieht
   dadurch ueberall gleich aus. */
.tc-detail-priority-bar {
	/* Kein zusaetzlicher margin-top noetig - .tc-detail-head ist bereits ein
	   Flex-Container mit gap:8px, der automatisch denselben Abstand wie
	   zwischen den uebrigen Kopf-Kindelementen erzeugt. */
	display: flex;
	align-items: center;
	margin: 0 -22px -16px -22px;
	padding: 7px 22px;
	background-color: var(--color-priority);
	border-radius: 0 0 var(--radius-medium) var(--radius-medium);
}
.tc-detail-priority-bar .tc-priority-badge {
	font-size: 13px;
}
.tc-detail-head-status {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	flex-shrink: 0;
	/* Nacharbeit (20.08.2026, "Ticketkopf visuell nachjustieren", Auftrag
	   Punkt 4): margin-left:auto verankert diesen Bereich auch dann noch am
	   rechten Rand, wenn .tc-detail-head-top (flex-wrap:wrap) auf schmaleren
	   Breiten umbricht - vorher konnte ein umgebrochener Statusbereich auf
	   der eigenen Zeile faelschlich am LINKEN Rand landen (Flex-Standard),
	   was den vom Nutzer gemeldeten "Status wandert Richtung Mitte"-Effekt
	   miterklaert. Max-Breite von 230px auf 300px angehoben (Auftrag Punkt
	   2/4): seit Parken/Eskalieren direkt am Status andocken (Nacharbeit
	   20.08.2026) braucht diese Spalte spuerbar mehr Platz als nur die reine
	   Statusbox - 230px war zu eng und liess Status+Aktionen sichtbar
	   ueberlaufen/zusammenquetschen (Hauptursache der gemeldeten Schieflage).
	   Die urspruengliche Schutzfunktion (siehe alter Kommentar: verhindert,
	   dass ein ausuferndes <select> diese Spalte aufblaeht) bleibt bestehen -
	   das betroffene <select> ist inzwischen ohnehin per [hidden] unsichtbar
	   und nimmt keinen Platz mehr ein, die Obergrenze schuetzt aber weiterhin
	   defensiv vor unerwartet breitem Inhalt.
	   Nacharbeit (24.08.2026, "Einheitliche Breite aller Statusanzeigen"):
	   erneut angehoben (300px -> 360px), weil .ticket-status--large jetzt
	   selbst eine feste Breite von 260px hat (vorher variable min-width,
	   die im ungeparkten/nicht-editierbaren Fall meist deutlich unter
	   260px blieb) - zusammen mit den maximal zwei gleichzeitig moeglichen
	   Symbolaktionen (Parken+Eskalieren, siehe $tc_kann_*-Bedingungen in
	   show.php - Wiedereroeffnen schliesst sich mit beiden fachlich aus,
	   nie mehr als zwei Aktionen gleichzeitig) braucht die Spalte jetzt bis
	   zu ca. 260+2x44=348px, sonst ueberlaeuft die Kombination sichtbar
	   ueber den vorherigen 300px-Rahmen hinaus (im Rendertest bestaetigt). */
	max-width: 360px;
	margin-left: auto;
}
/* Kopf-Optimierungsrunde (17.08.2026, Auftrag Punkt 8/9), Nacharbeit
   (20.08.2026, Auftrag Punkt 9): dieser Wrapper lieferte urspruenglich einen
   EIGENEN Rahmen/Hintergrund um das Statusmodul - zusammen mit dem
   eigenen Rahmen/Schatten von .ticket-status--large und den frueher
   ebenfalls eigens umrandeten .tc-status-quick-action-Buttons ergab das
   genau die vom Nutzer bemaengelten "drei unabhaengigen Rahmen". Die
   eigentliche Kontur/der Schatten des Statusmoduls sitzt jetzt EINMAL auf
   .tc-status-row (siehe dort) - dieser Wrapper ist nur noch ein unsichtbarer
   Layout-Container (Ausrichtung/Breite), kein eigenes sichtbares Element
   mehr. */
.tc-detail-status-card {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	width: 100%;
}
/* Steht eine Eck-Ribbon (Eskaliert/Geparkt), wandert das Statusdisplay
   sichtbar UNTER die Ribbon (siehe Zielbild im Auftrag) - dadurch entfaellt
   die vorherige horizontale Platzreservierung (padding-right) und damit auch
   die Ueberlappungsgefahr bei langen Statustexten ("Wieder geoeffnet"), die
   in der ersten Fassung aufgetreten war. Nacharbeit (14.08.2026, Punkt 6):
   spuerbar mehr Abstand (58px -> 64px), damit das jetzt deutlich groessere
   Statusdisplay nicht an der Ribbon "klebt". */
.tc-has-ribbon .tc-detail-head-status {
	margin-top: 64px;
}
/* Statusdisplay selbst: siehe die zentrale Komponente ".ticket-status" /
   ".ticket-status--large" weiter unten (Abschnitt "Einheitliche Ticket-
   Statuskomponente") - die fruehere eigene .tc-detail-status-box/-label/
   -sub-Definition wurde dorthin aufgeloest, damit Liste/Karte/Detailseite
   dieselbe Komponente in unterschiedlichen Groessen verwenden. */
/* Eck-Ribbon auf der Detailseite darf groesser/vollstaendig lesbar sein
   (Auftrag Punkt 9) - es steht mehr Platz zur Verfuegung als auf der
   schmalen Karte. Gleiche Farben/Klassen (.tc-corner-ribbon-eskaliert/
   -geparkt), nur Schrift/Breite angepasst. */
.tc-detail-head .tc-corner-ribbon {
	width: min(300px, calc(100% - 24px));
	padding: 10px 22px 10px 30px;
	font-size: 18px;
}
.tc-detail-head .tc-corner-ribbon .tc-icon {
	width: 22px;
	height: 22px;
}
/* Historischer Hinweis ueberholt (Stand 21.08.2026): der volle
   Prioritaets-Balken ist zurueck, allerdings unter dem neuen Klassennamen
   .tc-detail-priority-bar (siehe oben) statt der frueheren .tc-detail-head
   .tc-detail-priority/.tc-urgent-Kombination - die alten Klassen
   .tc-detail-priority/.tc-urgent werden auf dieser Seite weiterhin nicht
   verwendet. */
@media (max-width: 700px) {
	.tc-detail-head-top {
		flex-direction: column;
	}
	.tc-has-ribbon .tc-detail-head-status {
		margin-top: 0;
	}
	.tc-detail-head-status {
		align-items: flex-start;
		width: 100%;
	}
	.tc-detail-head-status .ticket-status--large {
		align-items: flex-start;
		min-width: 0;
		width: 100%;
	}
	.tc-detail-head-status .ticket-status-label,
	.tc-detail-head-status .ticket-status-sub {
		text-align: left;
	}
}

/* ==========================================================================
   Uebergeordnete farbliche Ticket-Klammer (17.08.2026). Zwei getrennte
   Elemente (.ticket-detail-modern und der neue Wrapper vor "Detail-
   Informationen", siehe show.php) tragen beide diese Klasse - sie
   entsprechen den zwei bestehenden <tr><td>-Zeilen der aeusseren Zentraler-
   Anzeigebereich-Tabelle (Kopf/Werkzeuge/Termin/Kontakt einerseits,
   Detail-Informationen bis Statushistorie andererseits). Optisch sollen
   beide wie EINE durchgehende Flaeche wirken (Auftrag: "ein uebergeordneter
   durchgehender Farbakzent", keine Karten-fuer-Karte-Streifen).
   Farbe/Toenung kommen ausschliesslich aus der bereits vorhandenen
   $tc_farbe-Variable (identisch zum eingefrorenen Ticket-Kopf, keine neue
   Berechnung/Query) ueber die geerbte CSS-Variable --tc-color.
   ========================================================================== */
.tc-ticket-area {
	position: relative;
	/* Verhindert, dass die untere Randlinie (margin-bottom) der jeweils
	   letzten Karte durch diesen Wrapper "durchschlaegt" (CSS-Margin-
	   Collapsing) - ohne dies wuerde die Toenung/der Streifen knapp vor dem
	   tatsaechlichen Ende des Karteninhalts aufhoeren. Rein layouttechnisch,
	   keine sichtbare Veraenderung der Karten selbst. */
	display: flow-root;
	/* Exakt dieselbe Formel/Staerke (12%) wie die bereits bestehende Toenung
	   des Ticket-Kopfes (.tc-detail-head) - Auftrag Punkt 2: "nicht staerker
	   als im Ticket-Kopf". */
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 12%, var(--color-surface));
	/* Ticketfarbe als durchgaengige Akzentfarbe (21.08.2026): leitet aus der
	   bereits vorhandenen, inline auf demselben Element gesetzten
	   --tc-color/--tc-color-dark (siehe show.php, unveraendert dieselbe
	   Ticketgruppenfarbe wie am Ticketkopf) vier wiederverwendbare Varianten
	   her - werden von .tc-detail-card/.tc-detail-contact & Co. weiter unten
	   als NEUTRALER STANDARDWERT (Prioritaet 2: "Ticketfarbe", siehe Auftrag
	   Punkt 8) fuer --panel-accent/--panel-accent-soft/--panel-border/
	   --panel-title gelesen. Container mit eigener fachlicher Bedeutung
	   (Termin/Wert gutgeschrieben/entwertet/Interne Notizen) setzen ihre
	   --panel-*-Variablen weiterhin direkt selbst (Prioritaet 1) und
	   ueberschreiben diesen Standardwert automatisch - keine zusaetzliche
	   Prioritaetslogik noetig, das ergibt sich allein aus der CSS-Kaskade
	   (lokal gesetzte Custom Property vor geerbtem Fallback). --tc-color
	   selbst besitzt bereits einen sicheren Fallback (--color-border-strong),
	   dieser wirkt automatisch als Prioritaet 3 ("neutral"), falls ein
	   Container ausserhalb jeder .tc-ticket-area liegen sollte. */
	--ticket-accent: var(--tc-color, var(--color-border-strong));
	--ticket-accent-dark: var(--tc-color-dark, var(--color-text));
	--ticket-accent-soft: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 10%, var(--color-surface));
	--ticket-accent-border: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 28%, var(--color-border));
}
/* Durchgehender linker Farbstreifen: dieselbe Breite/Farbe wie der bereits
   bestehende .tc-detail-head-Rand (8px, --tc-color). Bewusst NICHT als
   echter border-left auf .tc-ticket-area selbst umgesetzt (das wuerde beim
   Ticket-Kopf zu einem sichtbar DOPPELT breiten Streifen fuehren, da der
   Kopf seinen eigenen 8px-Rand behaelt) - stattdessen ein absolut
   positioniertes Element ueber die volle Hoehe, das exakt hinter/unter dem
   vorhandenen Kopf-Rand liegt (gleiche Farbe, gleiche Breite, gleiche
   Position = keine sichtbare Naht) und unterhalb des Kopfes nahtlos
   fortgesetzt wird, wo noch kein eigener Rand existiert. */
.tc-ticket-area::before {
	content: "";
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	width: 8px;
	background-color: var(--tc-color, var(--color-border-strong));
}
/* Abgerundete Ecke NUR ganz oben (passend zur bestehenden Kopf-Ecke) bzw.
   NUR ganz unten (Ende des Ticketinhalts) - an der Beruehrungsstelle beider
   Flaechen in der Mitte (Ende Kontakt/Anfang Detail-Informationen) bleibt der
   Streifen bewusst eckig, damit dort keine sichtbare Unterbrechung entsteht. */
.tc-ticket-area--start::before {
	border-top-left-radius: var(--radius-medium);
}
.tc-ticket-area--end::before {
	border-bottom-left-radius: var(--radius-medium);
}
/* Die aeussere Tabelle (cellpadding="3") wuerde zwischen den zwei <tr><td>-
   Zeilen sonst eine 6px breite ungetoente Luecke sichtbar machen (3px
   Innenabstand jeder der beiden Zellen an der jeweiligen Beruehrungskante).
   Nur genau diese eine beruehrende Seite wird entfernt, alle anderen Seiten
   (oben an der ersten, unten an der zweiten Zelle) bleiben unveraendert. */
.tc-ticket-cell--kopf {
	padding-bottom: 0;
}
.tc-ticket-cell--inhalt {
	padding-top: 0;
}

/* ==========================================================================
   Phase E, Schritt 2 (14.08.2026): sekundaere Ticket-Werkzeugleiste
   (Druckansicht/VCF-Uebergabe/Daten senden/SMS senden), unmittelbar unter
   dem Ticketkopf. Bewusst zurueckhaltend gehalten (Auftrag Punkt 3/8): kein
   Button-Look, keine Statusfarben/Gruppenfarbe - neutraler heller
   Hintergrund, kleine Icon+Text-Aktionen mit dezentem Hover. */
.tc-detail-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 2px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 6px;
	margin-bottom: var(--spacing-lg);
}
.tc-detail-toolbar-action {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 7px 12px;
	border-radius: var(--radius-small);
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-primary);
	text-decoration: none !important;
	white-space: nowrap;
	/* "Nicht beobachten" (Nacharbeit 20.08.2026, "ohne Formular-
	   Zwischenseite") rendert diese Klasse jetzt auf einem <button> statt
	   einem <a> - background/border/min-height explizit neutralisiert,
	   damit das projektweite Formularelement-Grundstyling nicht
	   durchschlaegt (die anderen, weiterhin per <a> gerenderten Eintraege
	   dieser Werkzeugleiste waren davon nie betroffen und bleiben optisch
	   unveraendert, da <a> nicht Ziel dieses Grundstylings ist). */
	background: none;
	border: none;
	min-height: 0;
	cursor: pointer;
}
.tc-detail-toolbar-action:hover {
	background-color: var(--color-surface);
	color: var(--color-primary-dark);
	box-shadow: var(--shadow-small);
}
.tc-detail-toolbar-action:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-detail-toolbar-action .tc-icon {
	flex-shrink: 0;
	color: var(--color-text-muted);
}
.tc-detail-toolbar-action:hover .tc-icon {
	color: var(--color-primary-dark);
}
@media (max-width: 700px) {
	.tc-detail-toolbar-action {
		font-size: 12px;
		padding: 6px 9px;
	}
}

/* Nacharbeit (17.08.2026, "Kommunikationsfunktionen neu einordnen"): "Zur
   Kenntnis senden" und "Beobachten"/"Nicht beobachten" sind aus der linken
   Seitenleiste hierher gewandert (siehe show.php, $tc_werkzeuge). Rein
   optische Gruppierung ("Ausgabe/Export" | "Kommunikation" | "Ticket
   verfolgen") ohne sichtbare Zwischenueberschrift - nur ein zusaetzlicher
   Abstand vor dem jeweils ersten Eintrag einer neuen Gruppe. Bewusst kein
   eigenes Trennelement (z. B. eine vertikale Linie), da ein 1px-Element bei
   flex-wrap bei kleinen Breiten allein umbrechen und unschoen wirken koennte -
   ein reiner Randabstand bleibt beim Umbruch unauffaellig. */
.tc-detail-toolbar-action--gruppenstart {
	margin-left: 10px;
}
@media (max-width: 700px) {
	.tc-detail-toolbar-action--gruppenstart {
		margin-left: 6px;
	}
}

/* Nacharbeit (24.08.2026, "Kopf-Funktionen des Tickets direkter und
   moderner machen", Auftrag Punkt 6): "Nicht beobachten" zeigt dezent an,
   dass das Ticket gerade vom angemeldeten Benutzer beobachtet wird -
   bewusst kein Warnton (kein --color-danger/--color-warning), sondern
   dieselbe helle blaeuliche Toenung wie der bestehende Info-Hinweis
   (--color-info-subtle). Hover bleibt ueber die etwas kraeftigere
   --color-primary-dark-Textfarbe klar von diesem Ruhezustand unterscheidbar. */
.tc-detail-toolbar-action--aktiv {
	background-color: var(--color-info-subtle);
	color: var(--color-primary-dark);
}
.tc-detail-toolbar-action--aktiv .tc-icon {
	color: var(--color-primary-dark);
}
.tc-detail-toolbar-action--aktiv:hover {
	background-color: color-mix(in srgb, var(--color-info-subtle) 60%, var(--color-surface));
}

/* Popover fuer "Beobachten" (optionale Notiz) und "Nicht beobachten"
   (Ja/Nein-Sicherheitsabfrage) in der Ticket-Werkzeugleiste (Auftrag
   Punkt 2/3/7). Dasselbe Positionierungs-Grundmuster wie die bereits
   bestehende Termin-Sicherheitsabfrage (.tc-termin-confirm-widget/
   -popover, siehe oben) - bewusst als eigene, separat benannte Komponente
   umgesetzt statt jene wiederzuverwenden, um die dortige bereits
   getestete Funktion nicht anzufassen. "Ja"/"Beobachten"-Buttons nutzen
   wie dort das bestehende allgemeine Button-System. */
.tc-toolbar-popover-widget {
	position: relative;
	display: inline-flex;
}
.tc-toolbar-popover {
	position: absolute;
	top: 100%;
	right: 0;
	z-index: 20;
	margin-top: 6px;
	width: max-content;
	max-width: 260px;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
	padding: 10px;
}
.tc-toolbar-popover[hidden] {
	display: none;
}
.tc-toolbar-popover-frage,
.tc-toolbar-popover-titel {
	margin: 0 0 8px 0;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-text);
}
.tc-toolbar-popover-label {
	display: block;
	margin-bottom: 4px;
	font-size: 0.8rem;
	font-weight: 600;
	color: var(--color-text-muted);
}
.tc-toolbar-popover-textarea {
	display: block;
	width: 100%;
	min-width: 220px;
	max-width: 100%;
	box-sizing: border-box;
	resize: vertical;
	font-family: var(--font-system);
	font-size: 0.85rem;
	margin-bottom: 8px;
}
.tc-toolbar-popover-actions {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
}

/* ==========================================================================
   Nacharbeit (14.08.2026): Ticketbesitzer + Statusbearbeitung im Ticketkopf,
   Terminbereich als eigene Sektion vor dem Kontaktbereich. Ticketkopf selbst
   (Groessen/Bilder/Gruppe-Art/Betreff/Statusdisplay/Ribbon/Prioritaetsbalken)
   bewusst NICHT angefasst - siehe show.php-Kommentare an den jeweiligen
   Stellen fuer die genaue Herkunft/Verschiebung. */
/* .tc-detail-owner (zweite Besitzeranzeige unter der Statuskarte) wurde
   entfernt (17.08.2026, Strukturkorrektur) - Besitzer/"Noch offen" stehen
   weiterhin in der Metazeile unterhalb des Betreffs (siehe
   .tc-detail-meta-owner). Diese Regel ist dadurch ungenutzt und wurde
   entfernt. */
/* Nacharbeit (20.08.2026, "Status-/Eskalations-/Parken-Bereich
   zusammenfuehren"): die vorherigen .tc-detail-status-action(s)/
   -parkgrund-Regeln (separate Buttonzeile unter dem Statusfeld) sind
   komplett entfallen - Parken/Eskalieren/Wiedereroeffnen sitzen jetzt als
   kompakte Symbolaktionen UNMITTELBAR am Statusfeld (.tc-status-row/
   .tc-status-quick-actions), Deeskalieren im Eskaliert-Ribbon
   (.tc-corner-ribbon-action) und Reaktivieren direkt im geparkten
   Statusfeld selbst (.tc-status-inline-action) - siehe jeweils dort.
   Auftrag Punkt 17: "ein Status zeigt seinen direkten Bedienweg gleich
   mit an" statt verstreuter Zusatzbuttons. */
/* Nacharbeit (20.08.2026, "Ticketkopf visuell nachjustieren", Auftrag Punkt
   5/8/9): .tc-status-row traegt jetzt die EINZIGE gemeinsame Aussenkontur
   (Schatten) des ganzen Statusmoduls - vorher hatten Statusbox UND jeder
   Symbolaction-Button noch ihren eigenen Rahmen/Schatten/Radius, was wie
   "drei unabhaengige Rahmen" wirkte. box-shadow ist hier bewusst rein additiv
   (kein overflow:hidden!) - .tc-status-widget enthaelt das bestehende
   Status-Auswahlmenue (.tc-status-menu, position:absolute, oeffnet sich
   UNTERHALB der Statusflaeche); ein overflow:hidden auf .tc-status-row wuerde
   dieses Menue abschneiden. Die Rundung sitzt stattdessen direkt auf den
   sichtbaren Randflaechen selbst (aussen links: .ticket-status--large/
   .tc-status-chevron, aussen rechts: :last-child der Symbolaktionen, siehe
   :has()-Regel weiter unten) - dadurch entsteht ein glatter Uebergang ganz
   ohne Clipping-Bedarf. */
.tc-status-row {
	display: flex;
	align-items: stretch;
	gap: 0;
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-small);
}
/* Hohe Prioritaet direkt am Statusblock (Nacharbeit 21.08.2026, "Hohe
   Prioritaet weiter vereinheitlichen", Auftrag Punkt 1): .tc-status-block
   umschliesst .tc-status-row + das neue Prioritaetsband als EINEN
   geschlossenen Block - display:inline-flex schrumpft den Wrapper auf die
   tatsaechliche (variable) Breite von .tc-status-row (Statusflaeche +
   Statusfunktionen zusammen), flex-direction:column mit dem Default
   align-items:stretch sorgt automatisch dafuer, dass das Band darunter
   exakt dieselbe Breite bekommt - unabhaengig von Statustext-Laenge/Anzahl
   Symbolaktionen, ohne dass beide Breiten manuell synchronisiert werden
   muessen. Der gemeinsame Schatten wandert vom Statusfeld (siehe
   box-shadow:none unten) auf diesen Wrapper, damit EIN Schatten beide
   Teile umgibt statt zwei getrennte. Nur vorhanden, wenn tatsaechlich hohe
   Prioritaet vorliegt (siehe show.php) - ohne Prioritaet bleibt
   .tc-status-row unveraendert direktes Kind von .tc-detail-status-card,
   exakt wie vor dieser Nacharbeit (kein Regressionsrisiko fuer den
   Normalfall). */
.tc-status-block--priority {
	display: inline-flex;
	flex-direction: column;
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-small);
}
.tc-status-block--priority .tc-status-row {
	box-shadow: none;
}
/* Der Statusblock (Status + ggf. Symbolaktionen) rundet normalerweise seine
   AEUSSERSTEN unteren Ecken (siehe .ticket-status--large/.tc-status-chevron/
   .tc-status-quick-action--last weiter unten) - bei angehaengtem
   Prioritaetsband muessen genau diese unteren Ecken flach werden, sonst
   wuerde die Rundung sichtbar gegen die harte Kante des Bandes stossen.
   Pauschal auf alle drei moeglichen Trägerelemente angewendet (nicht jedes
   ist in jeder Statuskombination vorhanden - ungenutzte Deklarationen sind
   wirkungslos, nicht falsch). */
.tc-status-block--priority .ticket-status--large,
.tc-status-block--priority .tc-status-chevron,
.tc-status-block--priority .tc-status-quick-action--last {
	border-bottom-left-radius: 0;
	border-bottom-right-radius: 0;
}
.tc-detail-priority-band {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 6px 14px;
	background-color: var(--color-priority);
	border-radius: 0 0 var(--radius-large) var(--radius-large);
}
.tc-detail-priority-band .tc-priority-badge {
	font-size: 12px;
}
/* Symbolaktionen (Parken/Eskalieren/Wiedereroeffnen) sitzen unmittelbar,
   OHNE Abstand/eigenen Rahmen am Statusfeld an (Auftrag Punkt 5/9: "keine
   sichtbaren Luecken", "keine drei unabhaengigen Rahmen") - die einzige
   Trennung zwischen Statusflaeche und erster Aktion bzw. zwischen zwei
   Aktionen ist eine dezente vertikale Linie (border-left je Button), keine
   eigene Box je Aktion mehr. */
.tc-status-quick-actions {
	display: flex;
	align-items: stretch;
	flex-shrink: 0;
	margin-left: 0;
	gap: 0;
}
/* Auftrag Punkt 8: kompakter/nahezu quadratisch statt hoher schmaler
   Buttons (40px Breite blieb bei der jetzt groesseren Statusflaeche
   optisch zu schmal/technisch) - 44px orientiert sich an der ueblichen
   Mindest-Klickflaeche (Auftrag Punkt 18), align-items:stretch (siehe
   .tc-status-row/.tc-status-quick-actions) sorgt automatisch fuer exakt
   dieselbe Gesamthoehe wie die Statusflaeche daneben, ohne feste Hoehe
   hart zu codieren. */
.tc-status-quick-action {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 44px;
	font-family: var(--font-system);
	font-weight: 800;
	font-size: 15px;
	border: none;
	border-left: 1px solid rgba(0, 0, 0, .16);
	text-decoration: none;
	/* min-height:0/padding:0 heben das projektweite Formularelement-
	   Grundstyling auf - Eskalieren/Wiedereroeffnen sind seit Nacharbeit
	   20.08.2026 ("ohne Formular-Zwischenseite") <button>-Elemente statt
	   <a>-Links (Parken bleibt unveraendert ein <a>, da diese Aktion
	   weiterhin ein Datumsfeld benoetigt und daher nicht Teil dieser
	   Nacharbeit ist). */
	min-height: 0;
	padding: 0;
	background: none;
	cursor: pointer;
}
/* Rundung nur an der aeussersten rechten Kante des gesamten Statusmoduls
   (Auftrag Punkt 9: "Rundungen nur aussen links und aussen rechts").
   Bewusst NICHT per :last-child geloest: Eskalieren/Wiedereroeffnen stecken
   seit der Nacharbeit 20.08.2026 in einem eigenen, unsichtbaren
   <form class="tc-inline-action-form"> (display:contents, siehe dort) -
   :last-child wuerde dadurch gegen die Geschwister INNERHALB des jeweiligen
   Formulars pruefen (dort immer "letztes Kind", unabhaengig von der
   tatsaechlichen visuellen Position unter .tc-status-quick-actions), nicht
   gegen die anderen Symbolaktionen. Stattdessen bestimmt PHP explizit,
   welche Aktion tatsaechlich als letzte gerendert wird (siehe
   $tc_quick_action_letzte in show.php) und vergibt dafuer diese Klasse. */
.tc-status-quick-action--last {
	border-top-right-radius: var(--radius-large);
	border-bottom-right-radius: var(--radius-large);
}
.tc-status-quick-action:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: -2px;
	position: relative;
	z-index: 1;
}
.tc-status-quick-action .tc-icon {
	width: 17px;
	height: 17px;
}
/* Farbabstufung (Auftrag Punkt 6/7): "Aktion moeglich" = helle Toenung der
   Funktionsfarbe, deutlich zurueckhaltender als der kraeftige Zustand selbst
   (z. B. Ticket bereits geparkt = kraeftiges Blau am Status, siehe
   .ticket-status--large-Inline-Style). Hover vertieft dieselbe Funktionsfarbe
   spuerbar (color-mix, bereits an anderer Stelle in dieser Datei verwendete
   Technik, z. B. .tc-detail-head/.tc-ticket-area), statt wie zuvor auf eine
   neutrale graue Hover-Flaeche zu wechseln - dadurch bleibt die Funktion
   (Parken=Blau/Eskalieren=Rot) auch im Hover-Zustand eindeutig erkennbar. */
.tc-status-quick-action--park {
	color: var(--color-park);
	background-color: var(--color-park-subtle);
}
.tc-status-quick-action--park:hover,
.tc-status-quick-action--park:focus-visible {
	background-color: color-mix(in srgb, var(--color-park) 22%, var(--color-park-subtle));
}
.tc-status-quick-action--eskalieren {
	color: var(--color-danger-strong);
	background-color: var(--color-danger-subtle);
}
.tc-status-quick-action--eskalieren:hover,
.tc-status-quick-action--eskalieren:focus-visible {
	background-color: color-mix(in srgb, var(--color-danger-strong) 22%, var(--color-danger-subtle));
}
.tc-status-quick-action--reaktivieren {
	color: var(--color-park);
	background-color: var(--color-park-subtle);
}
/* AP10 (16.09.2026, "Beobachten als Schnellfunktion integrieren"): dieselbe
   Groesse/Grundstruktur wie Parken/Eskalieren/Wiedereroeffnen. Ruhezustand
   ("Beobachten" verfuegbar) bewusst neutral/zurueckhaltend, da es sich - im
   Unterschied zu Parken/Eskalieren - um keine kritische Statusaenderung
   handelt. Der aktive Zustand ("Nicht mehr beobachten", ich beobachte
   bereits) nutzt dieselbe Info-Farbfamilie wie zuvor die entsprechend
   markierte Werkzeugleisten-Aktion (.tc-detail-toolbar-action--aktiv). */
.tc-status-quick-action--beobachten {
	color: var(--color-text-muted);
	background-color: var(--color-background);
}
.tc-status-quick-action--beobachten:hover,
.tc-status-quick-action--beobachten:focus-visible {
	background-color: var(--color-border);
	color: var(--color-text);
}
.tc-status-quick-action--beobachten.tc-status-quick-action--aktiv {
	color: var(--color-primary-dark);
	background-color: var(--color-info-subtle);
}
.tc-status-quick-action--beobachten.tc-status-quick-action--aktiv:hover,
.tc-status-quick-action--beobachten.tc-status-quick-action--aktiv:focus-visible {
	background-color: color-mix(in srgb, var(--color-info-subtle) 60%, var(--color-primary) 15%);
}
.tc-status-quick-action--reaktivieren:hover,
.tc-status-quick-action--reaktivieren:focus-visible {
	background-color: color-mix(in srgb, var(--color-park) 22%, var(--color-park-subtle));
}
/* Sind Symbolaktionen vorhanden (.tc-status-quick-actions als Geschwister
   von .ticket-status--large bzw. .tc-status-widget), entfaellt die rechte
   Rundung der Statusflaeche - die sichtbare Rundung wandert dadurch an die
   neue aeusserste rechte Kante (:last-child der Symbolaktionen, siehe oben).
   .tc-status-chevron gehoert zum editierbaren Statuswechsel-Button
   (.tc-status-trigger) und hat exakt dieselbe rechte Kante wie
   .ticket-status--large darunter - beide muessen deshalb gemeinsam
   flach werden, sonst wuerde ein Widerspruch zwischen abgerundeter Statusbox
   und quadratischem Chevron entstehen (Auftrag Punkt 9: "Rundungen nur
   aussen links und aussen rechts"). Ohne Symbolaktionen (z. B. Geschlossen-
   Status ohne weitere Aktion) bleibt die volle Rundung auf allen vier Ecken
   erhalten - siehe Basisdefinition weiter unten. */
.tc-status-row:has(.tc-status-quick-actions) .ticket-status--large,
.tc-status-row:has(.tc-status-quick-actions) .tc-status-chevron {
	border-top-right-radius: 0;
	border-bottom-right-radius: 0;
}
/* Reaktivieren-Symbol INNERHALB des geparkten Statusfelds (Auftrag Punkt
   9) - .ticket-status--large ist ausschliesslich auf der Ticketdetailseite
   im Einsatz (siehe Analyse), position:relative daher hier gefahrlos
   ergaenzbar, ohne Karten-/Listenansicht zu beeinflussen. */
.ticket-status--large {
	position: relative;
}
.tc-status-inline-action {
	position: absolute;
	top: 8px;
	right: 8px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	/* border/padding/min-height explizit neutralisiert - Reaktivieren ist
	   seit Nacharbeit 20.08.2026 ("ohne Formular-Zwischenseite") ein
	   <button> statt eines <a>, faellt also erstmals unter das
	   projektweite Formularelement-Grundstyling. */
	border: none;
	padding: 0;
	min-height: 0;
	border-radius: var(--radius-small);
	background-color: rgba(255, 255, 255, .2);
	color: inherit;
	cursor: pointer;
}
.tc-status-inline-action:hover,
.tc-status-inline-action:focus-visible {
	background-color: rgba(255, 255, 255, .35);
}
.tc-status-inline-action:focus-visible {
	outline: 2px solid #FFFFFF;
	outline-offset: 1px;
}
.tc-status-inline-action .tc-icon {
	width: 16px;
	height: 16px;
}
/* "Geparkt von .../Grund: ..." (Auftrag Punkt 7/8): kleiner/dezenter als
   Label und Sub-Zeile, damit die Hierarchie (Status > Zeitraum > Details)
   erhalten bleibt - keine zusaetzlichen Labels ausser den im Auftrag
   ausdruecklich genannten ("Geparkt von"/"Grund:"). */
.ticket-status-parkinfo {
	display: block;
	font-size: 11px;
	font-weight: 500;
	text-transform: none;
	letter-spacing: normal;
	opacity: .75;
}
/* ==========================================================================
   Nacharbeit (14.08.2026): Statuswechsel-Bedienung modernisiert - das
   sichtbare <select>+Button-Paar (.tc-detail-status-form/-select/-submit,
   siehe Runde zuvor) wurde durch ein kompaktes Auswahlmenue direkt am
   Statusdisplay ersetzt (Auftrag: "Statusdisplay bleibt zentrale Anzeige,
   Wechsel ueber kleines Bedienelement/Klick statt Dropdown+Button"). Das
   bestehende Formular (.tc-status-hidden-form) bleibt technisch
   unveraendert bestehen, nur visuell verborgen - siehe
   js/ticket-status-menu.js fuer die Interaktion. */
.tc-status-widget {
	position: relative;
	display: inline-block;
	max-width: 100%;
}
.tc-status-trigger {
	position: relative;
	display: block;
	width: 100%;
	padding: 0;
	border: none;
	background: none;
	/* Das projektweite Formularelement-Grundstyling (siehe "input[type=submit],
	   button { color:#FFF; ... }" weiter oben in dieser Datei) setzt fuer JEDES
	   <button>-Element weisse Schrift - ohne diese Ueberschreibung war der
	   Chevron (erbt seine Farbe vom umschliessenden Button) weiss auf hellem/
	   gelbem Untergrund praktisch unsichtbar. */
	color: var(--color-text);
	font: inherit;
	text-align: inherit;
	cursor: pointer;
}
.tc-status-trigger:hover {
	background: none;
}
.tc-status-trigger .ticket-status--large {
	/* Platz fuer die verbreiterte, jetzt sichtbare Dropdown-Zone rechts
	   (siehe .tc-status-chevron) - vorher 34px fuer den fast unsichtbaren
	   kleinen Pfeil, jetzt mehr Raum, damit der Statustext nicht unter die
	   Zone laeuft (Auftrag "Auffaellige Aufklapp-/Dropdown-Bedienelemente"). */
	padding-right: 48px;
}
/* Auftrag Punkt 10: kein zusaetzlicher grosser Button, sondern der rechte
   Bereich der ohnehin schon vollflaechig klickbaren Statusflaeche liest
   sich jetzt eindeutig als eigene Dropdown-Zone - eigene, leicht abgesetzte
   Flaeche mit Trennlinie und deutlich groesserem Pfeil statt eines kaum
   sichtbaren 12px-Chevrons. Die gesamte Flaeche (.tc-status-trigger) bleibt
   unveraendert vollstaendig klickbar. */
.tc-status-chevron {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	width: 40px;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: rgba(255, 255, 255, .4);
	border-left: 1px solid rgba(0, 0, 0, .12);
	border-radius: 0 var(--radius-large) var(--radius-large) 0;
	transition: background-color .15s ease;
}
.tc-status-trigger:hover .tc-status-chevron,
.tc-status-trigger:focus-visible .tc-status-chevron {
	background-color: rgba(255, 255, 255, .65);
}
.tc-status-chevron .tc-icon {
	/* Das wiederverwendete 'chevron'-Icon (siehe tc_icon() in includes/main.php,
	   bereits fuer Auf-/Zuklapp-Pfeile im Kontaktbereich im Einsatz) zeigt
	   nativ nach rechts - 90deg gedreht zeigt es im Ruhezustand nach unten. */
	width: 18px;
	height: 18px;
	display: block;
	color: var(--color-text);
	transform: rotate(90deg);
	transition: transform .15s ease;
}
.tc-status-trigger[aria-expanded="true"] .tc-status-chevron .tc-icon {
	transform: rotate(-90deg);
}
.tc-status-trigger:focus-visible .ticket-status--large {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
/* Tooltip "Status aendern" - bewusst NICHT ueber die generische .tc-tip-
   Klasse (die setzt display:inline-flex, was die volle rechteckige
   Klickflaeche des Buttons zerstoeren wuerde), sondern eine eigene, am
   gleichen Blasen-Aussehen orientierte Regel (Auftrag Punkt 12). Kein
   aria-label auf dem Button selbst, damit der Screenreader weiterhin den
   tatsaechlichen Statustext als Namen vorliest statt eines generischen
   "Status aendern" (siehe Abschlussbericht). */
.tc-status-trigger[data-tip]::after {
	content: attr(data-tip);
	position: absolute;
	bottom: 100%;
	right: 8px;
	transform: translateY(-6px);
	background-color: var(--color-text);
	color: #FFFFFF;
	font-family: var(--font-system);
	font-size: 11px;
	font-weight: 500;
	line-height: 1.4;
	white-space: pre-line;
	text-align: left;
	padding: 6px 9px;
	border-radius: var(--radius-small);
	box-shadow: var(--shadow-medium);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity .12s ease;
	z-index: 5;
}
.tc-status-trigger[data-tip]:hover::after,
.tc-status-trigger[data-tip]:focus-visible::after {
	opacity: 1;
	visibility: visible;
}
.tc-status-menu {
	position: absolute;
	top: 100%;
	right: 0;
	z-index: 20;
	margin-top: 6px;
	min-width: 200px;
	max-width: 260px;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
	padding: 4px;
}
.tc-status-menu[hidden] {
	display: none;
}
.tc-status-menu-item {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 8px 10px;
	border: none;
	background: none;
	text-align: left;
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 500;
	color: var(--color-text);
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-status-menu-item span:first-child {
	flex: 1 1 auto;
	min-width: 0;
	overflow-wrap: break-word;
}
.tc-status-menu-item:hover,
.tc-status-menu-item:focus-visible {
	background-color: var(--color-background);
	outline: none;
}
.tc-status-menu-item[aria-checked="true"] {
	font-weight: 700;
	color: var(--color-primary-dark);
}
.tc-status-menu-check {
	flex-shrink: 0;
	color: var(--color-success);
	font-weight: 700;
}
/* Bestehendes Formular bleibt funktionsfaehig, aber unsichtbar - [hidden]
   reicht bereits (UA-Stylesheet), diese Regel ist nur eine defensive
   Absicherung gegen andere, allgemeinere Selektoren in dieser Datei. */
.tc-status-hidden-form[hidden] {
	display: none !important;
}

/* Terminbereich: eigene Informationskarte (Auftrag "Termine hervorheben",
   18.08.2026) - vertikal aufgebaut statt horizontal: oben ein
   Informationsblock (.tc-detail-termin-main, Datum/Uhrzeit+Notiz), darunter
   durch einen dezenten Trennstrich klar abgesetzt die Aktionen
   (.tc-detail-termin-actions). Keine feste Hoehe - die Karte waechst
   natuerlich mit Notiz-Laenge.
   Container-Redesign (20.08.2026, "Ticket-Detailansicht optisch
   vereinheitlichen", Auftrag Punkt 4/6/8; verfeinert 21.08.2026, "leichter/
   moderner/weniger massiv"): traegt zusaetzlich .tc-detail-card (Rahmen/
   Radius/Schatten/Aussenabstand/Grundpadding kommen von dort, hier nur noch
   der interne Flex-Aufbau) und setzt die drei gemeinsamen --panel-*-
   Variablen (siehe .tc-detail-card weiter unten fuer die vollstaendige
   Erklaerung des Farbsystems) auf die Blau-Familie - einheitlich in beiden
   Zustaenden (mit/ohne eingetragenen Termin). Icon+Bezeichnung "Termin"
   sitzen im gemeinsamen .tc-detail-section-head statt in einem eigenen
   .tc-detail-termin-icon/-label (siehe show.php) - beide Klassen sind
   dadurch entfallen. */
.tc-detail-termin {
	display: flex;
	flex-direction: column;
	--panel-accent: var(--color-primary);
	--panel-accent-soft: var(--color-info-subtle);
	--panel-border: color-mix(in srgb, var(--color-primary) 30%, var(--color-border));
	--panel-title: var(--color-primary-dark);
	/* Nutzerauftrag (21.09.2026, "Termin-Widget kompakter machen"): der
	   frueher hier gesetzte gap:14px kam ZUSAETZLICH zum bereits
	   bestehenden margin-bottom:16px von .tc-detail-section-head hinzu
	   (beide wirken zwischen Kopf- und Inhaltsbereich) - macht zusammen
	   30px Abstand, obwohl nur einer der beiden Werte gebraucht wird.
	   gap entfernt, stattdessen reduziertes Kartenpadding unten (der Kopf
	   deckt sein eigenes oberes Padding bereits per negativem Margin ab,
	   siehe .tc-detail-section-head). */
	padding-bottom: 14px;
}
/* AP6 (16.09.2026, "Termin-Container kompakter gestalten"): Terminblock
   (links) und die Funktionsbuttons (rechts, siehe .tc-detail-termin-actions
   weiter unten) stehen jetzt NEBENEINANDER statt der Funktionsbuttons in
   einer eigenen Zeile darunter - deutlich weniger Kartenhoehe. Unterhalb
   520px faellt das auf eine Spalte zurueck (Buttons unter dem Terminblock),
   damit auf schmalen Bildschirmen kein zu enges Raster entsteht. */
.tc-detail-termin-body {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
}
@media (max-width: 520px) {
	.tc-detail-termin-body {
		flex-direction: column;
		align-items: stretch;
	}
}
.tc-detail-termin-info {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
/* ==========================================================================
   Gemeinsame Termin-Datumskomponente (Nacharbeit 24.08.2026, "Terminanzeige
   in Details und Kartenansicht vereinheitlichen"): bisher .tc-detail-
   termin-when/-weekday/-datetime/-date/-time, nur in der Ticket-
   Detailansicht verwendet - jetzt auf generische Klassennamen (.tc-termin-*)
   umbenannt und zusaetzlich in der Kartenansicht wiederverwendet, damit
   beide Ansichten dieselbe Optik ohne doppelte Parallelregeln bekommen. Die
   Listenansicht (includes/ticket_list_row.php) verwendet diese Klassen
   bewusst NICHT - dort bleibt die bisherige einzeilige Darstellung
   unveraendert (ausdruecklicher Auftrag). Grundmasse hier sind die der
   Ticket-Detailansicht (grosszuegig); die Kartenansicht (.tc-info-termin,
   Nacharbeit "dreispaltiges Informationslayout", siehe .tc-info weiter
   unten) verwendet seit 24.08.2026 dieselbe volle Groesse unveraendert
   (vorher kurzzeitig in .tc-side-row-termin auf eine verkleinerte Variante
   skaliert, seit der Spaltenumstellung nicht mehr noetig - die neue
   Info-Spalte hat genug Platz).
   Wochentag links ueber die volle Hoehe des Blocks, rechts daneben
   zweizeilig Datum/Uhrzeit - align-items:stretch (Flex-Default) sorgt
   dafuer, dass .tc-termin-weekday automatisch auf dieselbe Hoehe wie die
   beiden rechten Zeilen zusammen waechst, ohne eine feste Pixelhoehe
   vorgeben zu muessen. Nacharbeit Punkt 1/2: Datum und Uhrzeit jetzt exakt
   gleich gross/gleich stark (vorher Uhrzeit sichtbar kleiner/gedaempft und
   dadurch wie eine Nebeninformation), Wochentag deutlich vergroessert
   (1.05rem -> 1.65rem). */
.tc-termin-when {
	/* Nacharbeit (24.08.2026, "Terminanzeige visuell zusammenfassen", Auftrag
	   Punkt 1/2): Wochentag/Datum-Uhrzeit/Grund tragen jetzt EINE gemeinsame
	   Hintergrundflaeche (vorher hatte nur .tc-termin-weekday eine eigene
	   Flaeche, Datum/Uhrzeit/Grund standen auf transparentem Grund daneben -
	   das wirkte wie ein isolierter Wochentag-Chip neben zwei separaten
	   Texten statt wie EIN Termin). border-radius+overflow:hidden auf dem
	   gemeinsamen Wrapper statt auf jedem Teilbereich einzeln, damit nur die
	   AEUSSEREN Ecken der Gesamtflaeche gerundet werden. Interne Gliederung
	   jetzt ueber Innenabstand + dezente Trennlinien an Datum/Uhrzeit und
	   Grund (siehe dort), nicht mehr ueber einen Abstand (gap) zwischen
	   getrennten Elementen. */
	display: flex;
	align-items: stretch;
	flex-wrap: wrap;
	background-color: var(--panel-accent-soft, var(--color-info-subtle));
	border-radius: var(--radius-medium);
	overflow: hidden;
}
.tc-termin-weekday {
	/* Eigene Hintergrundflaeche entfaellt (jetzt Teil der gemeinsamen
	   .tc-termin-when-Flaeche, siehe oben) - Groesse/Farbe/Gewicht
	   unveraendert, nur der Innenabstand ersetzt das vorherige gap. */
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 2.4em;
	padding: 10px 14px;
	font-family: var(--font-system);
	/* AP6 (16.09.2026, "Termin-Container kompakter gestalten"): Wochentag/
	   Datum/Uhrzeit etwas groesser - der Container ist durch das 2x2-
	   Funktionsraster daneben insgesamt kompakter, die Kerninfo darf dadurch
	   etwas mehr Gewicht bekommen. */
	font-size: 1.8rem;
	font-weight: 800;
	letter-spacing: .02em;
	color: var(--panel-accent, var(--color-primary));
}
.tc-termin-datetime {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 2px;
	padding: 8px 14px;
	border-left: 1px solid color-mix(in srgb, var(--panel-accent, var(--color-primary)) 18%, transparent);
	font-family: var(--font-system);
}
.tc-termin-date,
.tc-termin-time {
	/* Beide Zeilen bewusst mit identischer Typografie (Auftrag Punkt 1:
	   "optisch gleichwertig") - vorher hatte .tc-detail-termin-time eine
	   kleinere Schriftgroesse/gedaempfte Farbe und wirkte dadurch wie eine
	   untergeordnete Zusatzinfo. */
	font-size: 1.25rem;
	font-weight: 800;
	line-height: 1.25;
	color: var(--color-text);
}
/* Termingrund (24.08.2026, "Termingrund in Karten-, Listen- und
   Detailansicht ergaenzen"/"...dynamisch skalieren"): dritte Spalte rechts
   neben Datum/Uhrzeit, Teil derselben gemeinsamen .tc-termin-when-
   Komponente wie Wochentag/Datum/Uhrzeit (Kartenansicht UND
   Detailansicht). Grundgroesse gegenueber der vorherigen Fassung
   angehoben (0.85rem/500/gedaempfte Farbe -> 0.95rem/600/normale
   Textfarbe) - weiterhin sichtbar zurueckhaltender als Datum/Uhrzeit,
   aber nicht mehr wie eine Fussnote (Auftrag Punkt 3). display:flex +
   align-items:center zentriert den Text vertikal ueber die volle, durch
   align-items:stretch am Elternelement vorgegebene Blockhoehe (Auftrag:
   "vertikal gut zentriert", "auf Hoehe des gesamten Terminblocks
   ausgerichtet"). flex:1 1 <basis> + min-width statt einer festen Breite,
   damit laengere Gruende mehrzeilig umbrechen (overflow-wrap:anywhere,
   kein Abschneiden) statt die Karte/den Block seitlich zu sprengen -
   flex-wrap:wrap am Elternelement (.tc-termin-when) laesst diese Spalte
   bei zu wenig Platz zusaetzlich komplett unter Wochentag/Datum
   umbrechen (Auftrag Punkt 9/responsive). Dezenter linker Trennstrich
   (dieselbe Farbformel wie .tc-termin-datetime oben) statt einer eigenen
   Flaeche - bleibt Teil desselben Blocks statt wie ein eigener Kasten zu
   wirken. Nur gerendert, wenn tatsaechlich ein Termingrund gespeichert
   ist (kein leerer Platzhalter). */
.tc-termin-grund {
	/* box-sizing:border-box (24.08.2026, Nachbesserung waehrend der
	   Verifikation): ohne dieses wird Padding/Rahmen zusaetzlich zum
	   flex-basis-Wert (110px/70px) addiert, bevor der Browser entscheidet,
	   ob alle drei Bereiche in eine Zeile passen - im Kartenrendertest fuehrte
	   das bei knappem Restplatz zu einem Umbruch, obwohl rechnerisch genug
	   Platz vorhanden war. Mit border-box zaehlt Padding/Rahmen zum
	   angegebenen Basiswert dazu, statt ihn zu vergroessern. */
	box-sizing: border-box;
	display: flex;
	align-items: center;
	flex: 1 1 110px;
	min-width: 70px;
	padding: 8px 14px;
	border-left: 1px solid color-mix(in srgb, var(--panel-accent, var(--color-primary)) 18%, transparent);
	font-size: 0.95rem;
	font-weight: 600;
	line-height: 1.3;
	color: var(--color-text);
	overflow-wrap: anywhere;
}
/* Dynamische Groesse anhand der Zeichenlaenge (24.08.2026, "Termingrund
   dynamisch skalieren", Auftrag Punkt 4/5) - Klasse wird serverseitig per
   tc_termin_grund_groesse() (includes/main.php) zugewiesen, rein auf Basis
   von mb_strlen() des bereits vorhandenen Termingrund-Textes, keine neue
   Berechnung/kein JavaScript. "--xl" (1-3 Zeichen, z. B. "NA"/"AU") wirkt
   fast so praesent wie der Wochentag (dieselbe Akzentfarbe/aehnliches
   Gewicht) - bewusst nicht IDENTISCH gross, damit der Wochentag optisch
   weiterhin die "erste" Information bleibt. "--l" (4-15 Zeichen, z. B.
   "Neuanschluss") liegt dazwischen: deutlich lesbarer als die Basisgroesse,
   aber klar unter Datum/Uhrzeit. Laengere Texte (>15 Zeichen) bleiben
   bewusst bei der obigen Basisgroesse - dort ist der mehrzeilige Umbruch
   (siehe .tc-termin-grund) wichtiger als eine groessere Schrift. */
.tc-termin-grund--l {
	font-size: 1.05rem;
	font-weight: 700;
}
.tc-termin-grund--xl {
	font-size: 1.5rem;
	font-weight: 800;
	letter-spacing: .02em;
	color: var(--panel-accent, var(--color-primary));
}
/* .tc-detail-termin-notiz (Termingrund UNTERHALB von Wochentag/Datum/
   Uhrzeit) ist entfallen (24.08.2026, "Termingrund in Karten-, Listen- und
   Detailansicht ergaenzen", Auftrag Punkt 6) - derselbe Termingrund
   erscheint jetzt stattdessen RECHTS im Kopfbereich selbst, siehe
   .tc-termin-grund weiter unten (Teil der gemeinsamen .tc-termin-when-
   Komponente, dritte Spalte nach Wochentag und Datum/Uhrzeit). Keine
   doppelte Anzeige. .tc-detail-termin-empty ("Kein Termin eingetragen") ist
   seit AP6 (16.09.2026) ebenfalls entfallen - der leere Zustand zeigt nur
   noch den Kartenkopf mit "+"-Button (siehe .ticket-edit-action--icon in
   show.php), kein Inhaltsbereich mehr. */
/* AP6 (16.09.2026): 2x2-Funktionsraster statt einer Buttonreihe -
   grid-auto-flow packt vorhandene Buttons (1 bis 4, je nach Bedingungen)
   automatisch zeilenweise, kein leerer Platz bei weniger als 4 Aktionen. */
.tc-detail-termin-actions {
	display: grid;
	grid-template-columns: repeat(2, auto);
	grid-auto-rows: auto;
	gap: 6px;
	flex-shrink: 0;
}
@media (max-width: 520px) {
	.tc-detail-termin-actions {
		grid-template-columns: repeat(4, auto);
		padding-top: 10px;
		border-top: 1px solid var(--color-border);
	}
}
.tc-detail-termin-edit {
	/* Nacharbeit (24.08.2026, "Terminanzeige visuell zusammenfassen", Auftrag
	   Punkt 6): von einer beschrifteten Funktionsflaeche auf eine reine,
	   kompakte Icon-Flaeche umgestellt (Text jetzt nur noch als Tooltip/
	   aria-label, siehe show.php) - dieselbe Klickflaechen-Groesse/-Optik
	   wie die bereits etablierte .ticket-edit-action--icon-Komponente
	   (transparent bis Hover/Fokus), damit die Funktionsleiste insgesamt
	   kleiner/ruhiger wirkt und die Termininformation darueber optisch
	   wichtiger bleibt (Auftrag: "Ziel der Funktionsleiste"). */
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 32px;
	min-height: 32px;
	box-sizing: border-box;
	padding: 0;
	color: var(--color-primary-dark);
	text-decoration: none !important;
	background-color: transparent;
	border: 1px solid transparent;
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-detail-termin-edit:hover,
.tc-detail-termin-edit:focus-visible {
	background-color: var(--color-background);
	border-color: var(--color-border);
	color: var(--color-primary-dark);
}
.tc-detail-termin-edit:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-detail-termin-edit .tc-icon {
	flex-shrink: 0;
	width: 18px;
	height: 18px;
}
/* Phase E, Schritt 3 (14.08.2026, Auftrag Punkt 14): "Termindaten kopieren"
   aus dem alten Kontaktblock hierher verschoben - weiterhin bewusst nicht so
   betont wie .tc-detail-termin-edit (Auftrag Punkt 13: "Termindaten kopieren
   als sekundaere Aktion"). Nacharbeit (21.08.2026): steht jetzt kompakt
   NEBEN statt untereinander mit der Bearbeiten-Aktion (keine volle Breite
   mehr), passend zur uebrigen Funktionszeile. */
.tc-detail-termin-copy {
	/* Nacharbeit (24.08.2026, "Terminanzeige visuell zusammenfassen", Auftrag
	   Punkt 6): ebenfalls auf reine, kompakte Icon-Flaeche umgestellt
	   (Text jetzt nur noch als Tooltip/aria-label, siehe show.php) -
	   dieselbe Klickflaechen-Groesse wie .tc-detail-termin-edit direkt
	   darueber, damit beide Funktionen in der Zeile einheitlich wirken. */
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 32px;
	min-height: 32px;
	box-sizing: border-box;
	padding: 0;
	color: var(--color-text-muted);
	border: 1px solid transparent;
	border-radius: var(--radius-small);
}
.tc-detail-termin-copy:hover,
.tc-detail-termin-copy:focus-visible {
	background-color: var(--color-background);
	border-color: var(--color-border);
	color: var(--color-primary);
}
.tc-detail-termin-copy:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-detail-termin-copy .tc-icon {
	width: 17px;
	height: 17px;
}
/* Sicherheitsabfrage "Termin wirklich entfernen?" (24.08.2026, "Termin
   loeschen, Outlook-Export und vollstaendige Protokollierung ergaenzen",
   Auftrag Punkt 3): dasselbe Positionierungs-Grundmuster wie das
   bestehende Statuswechsel-Menue (.tc-status-widget/.tc-status-menu) -
   Trigger + relativ positionierter Wrapper, Popover absolut daran
   ausgerichtet. "Ja"/"Nein" nutzen das bereits vorhandene, bislang
   ungenutzte allgemeine Button-System (.button/.button-danger/
   .button-secondary/.button-small, siehe weiter oben in dieser Datei) -
   keine neuen Button-Stile noetig. */
.tc-termin-confirm-widget {
	position: relative;
	display: inline-flex;
}
.tc-termin-confirm-popover {
	position: absolute;
	top: 100%;
	right: 0;
	z-index: 20;
	margin-top: 6px;
	width: max-content;
	max-width: 220px;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
	padding: 10px;
}
.tc-termin-confirm-popover[hidden] {
	display: none;
}
.tc-termin-confirm-frage {
	margin: 0 0 8px 0;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-text);
}
.tc-termin-confirm-actions {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
}
/* Ersetzt die alte Inline-Loesung (style="width:1px;height:1px") fuer die
   technisch notwendigen, aber visuell nicht sichtbaren Zwischenablage-
   <textarea>-Elemente (siehe js oben: InZwischenablage()/InZwischenablageCal()
   greifen per globaler ID-Referenz darauf zu, Position/Sichtbarkeit ist
   fuer die Funktion irrelevant). */
.tc-sr-only-field {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	opacity: 0;
	pointer-events: none;
}
/* ==========================================================================
   Phase E, Schritt 3 (14.08.2026): Kontaktbereich auf der Ticket-Detailseite
   modernisiert (Auftrag "Kontaktbereich modernisieren"). Reine Darstellung -
   siehe show.php fuer die unveraendert erhaltene Datenherkunft/Berechtigung.
   Wiederverwendet bewusst dieselbe Designsprache wie Karten-/Listenansicht
   (tc_icon(), .tc-contact-group-title, Farbtoken) statt eigener
   Parallel-Komponenten, wo die bestehende Klasse bereits exakt passt. */
.tc-detail-contact {
	background-color: color-mix(in srgb, var(--panel-accent, var(--ticket-accent)) 4%, var(--color-surface));
	border: 1px solid var(--panel-border, var(--ticket-accent-border));
	border-left-width: 4px;
	border-left-color: var(--panel-accent, var(--ticket-accent));
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-small);
	padding: 20px 24px;
	/* overflow:hidden clippt die bis an den Kartenrand "bleedende"
	   Titelleiste (siehe .tc-detail-section-head) sauber auf denselben
	   Eckenradius wie die Karte selbst (20.08.2026, "Container
	   vereinheitlichen") - der Eck-Ribbon (absolut positioniert, aber
	   vollstaendig INNERHALB der Kartenflaeche) ist davon nicht betroffen. */
	overflow: hidden;
	/* Bezugsrahmen fuer den absolut positionierten Eck-Ribbon
	   (.tc-corner-ribbon-weitere, Nacharbeit 19.08.2026) - gleiches Prinzip
	   wie div.ticket-card-view/.tc-detail-head. */
	position: relative;
}
/* Nacharbeit (19.08.2026, angepasst 20.08.2026 fuer die bleedende
   Titelleiste): Platz oben reservieren, damit der Eck-Ribbon (siehe unten)
   den Kopfbereich (Titel + "Bearbeiten") nicht ueberdeckt - gleiches
   Prinzip wie .tc-has-ribbon .tc-detail-head-status anderswo auf der
   Seite. margin-top ersetzt hier bewusst den negativen Bleed-Wert der
   Titelleiste (siehe .tc-detail-section-head) komplett, statt ihn nur zu
   ergaenzen - die Zeile wandert dadurch als Ganzes 46px nach unten, ohne
   weiterhin bis an die Kartenoberkante zu bleeden. */
.tc-detail-contact.tc-has-ribbon .tc-detail-section-head {
	margin-top: 46px;
}
/* ==========================================================================
   Einheitliche Titelleiste aller Inhaltscontainer (20.08.2026, "Ticket-
   Detailansicht optisch vereinheitlichen"; grundlegend verfeinert
   21.08.2026, "leichter/moderner/weniger massiv" - die urspruengliche
   Fassung nutzte eine vollflaechige DUNKLE Titelleiste mit weissem Text,
   das wirkte zu massiv/blockartig). Farbe kommt jetzt ausschliesslich ueber
   ein kleines, gemeinsames Variablen-System (Auftrag Punkt 15), an EINER
   Stelle definiert (hier + auf .tc-detail-card weiter unten als neutraler
   Standardwert) und von den einzelnen fachlichen Klassen (.tc-detail-termin/
   .tc-detail-value--gutgeschrieben/--entwertet/.tc-detail-notes) nur noch
   GESETZT, nie erneut dupliziert:
     --panel-accent       kraeftigste Farbe - linker Kartenrand + Icon +
                          Ueberschrift (Auftrag Punkt 3: "Akzent statt
                          Vollflaeche", Punkt 8: "Icon als Farborientierung")
     --panel-accent-soft  sehr helle Toenung, ausschliesslich Hintergrund der
                          Titelleiste selbst (Auftrag Punkt 2)
     --panel-border       duenner (1px), heller Rahmenton fuer die gesamte
                          Karte (Auftrag Punkt 9: "kein starker Rahmen UND
                          starker Balken gleichzeitig")
     --panel-title        Textfarbe der Ueberschrift (dunkel/gut lesbar,
                          Auftrag Punkt 4) - bei farbigen Containern die
                          bereits vorhandene "dunkle" Variante derselben
                          Farbfamilie, bei neutralen Containern die normale
                          Fliesstextfarbe.
   Die Titelleiste selbst bleedet weiterhin per negativem Margin bis an den
   Rand der Karte (.tc-detail-card ODER .tc-detail-contact - identisches
   Padding), jetzt aber nur noch leicht getoent statt vollflaechig dunkel,
   und durch eine duenne Trennlinie (border-bottom) statt durch einen reinen
   Hell-Dunkel-Kontrast vom Inhalt abgesetzt. Kompaktere Massse (Auftrag
   Punkt 6: Zielhoehe ca. 42-48px) und Schriftgewicht 600 statt 700
   (Auftrag Punkt 7). */
.tc-detail-section-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--spacing-sm);
	margin: -20px -24px 16px -24px;
	padding: 11px 20px;
	background-color: var(--panel-accent-soft, var(--ticket-accent-soft));
	/* Nacharbeit (16.09.2026, siehe .tc-detail-card): etwas kraeftigere
	   Trennlinie zwischen Titelleiste und Karteninhalt fuer klareren
	   Kopf/Inhalt-Kontrast, ohne zur alten vollflaechig dunklen Optik
	   zurueckzukehren. */
	border-bottom: 1px solid color-mix(in srgb, var(--panel-border, var(--ticket-accent-border)) 60%, var(--color-border-strong) 40%);
}
/* Mehrere Aktions-Buttons in EINER Kopfleiste (Auftrag "Persönliche
   Notizen", 21.09.2026, Punkt 1: "Neuer Eintrag" + "Persönliche Notiz"
   direkt nebeneinander) - haelt beide als EIN Flex-Element auf der rechten
   Seite von .tc-detail-section-head zusammen. */
.tc-detail-section-actions {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
}
@media (max-width: 640px) {
	.tc-detail-contact .tc-detail-section-head {
		margin: -16px -18px 16px -18px;
		padding: 10px 16px;
	}
}
.tc-detail-section-title {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
	/* Optimierungsrunde (14.08.2026, Auftrag Punkt 2/21): rem statt px,
	   damit kuenftige zentrale Schriftgroessen-Skalierung (Barrierefreiheit,
	   noch nicht implementiert - siehe Auftrag Punkt 21) an EINER Stelle
	   (Root-font-size) greifen kann, ohne jede Regel einzeln anzufassen. */
	font-size: 1.05rem;
	font-weight: 600;
	color: var(--panel-title, var(--ticket-accent-dark));
	line-height: 1.3;
}
.tc-detail-section-title .tc-icon {
	width: 17px;
	height: 17px;
	flex-shrink: 0;
	color: var(--panel-accent, var(--ticket-accent));
}
/* "Bearbeiten"/"Neuer Eintrag" (Kontakt/Detail-Informationen/Ergaenzungen):
   die Titelleiste ist jetzt selbst hell, daher reicht die ganz normale,
   bereits bestehende .ticket-edit-action-Optik (heller/transparenter
   Button mit dezentem Rahmen) unveraendert aus - keine eigene, dunkle
   Sonderoptik mehr noetig (Auftrag Punkt 11: "Bearbeiten ist eine
   sekundaere Funktion, soll nicht mit dem Titel konkurrieren"). Die
   vorherige weisse Kontrast-Variante wurde ersatzlos entfernt. */
.tc-detail-edit-link {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 0.9rem;
	font-weight: 600;
	color: var(--color-primary);
	white-space: nowrap;
}
.tc-detail-edit-link:hover {
	text-decoration: underline;
}

/* ==========================================================================
   Bearbeiten-Aktionen modernisieren (18.08.2026): eine gemeinsame Komponente
   fuer alle "Bearbeiten"-Aktionen in der Ticketdetailansicht, ersetzt das
   alte Rastergrafik-Icon bilder/edit_button.jpg + Textlink-Optik
   (.tc-detail-edit-link/.tc-detail-field-edit, siehe oben/unten - bleiben
   fuer die davon unabhaengige "Quellticket oeffnen"-Aktion bzw. als
   Abstandsregel bestehen, wurden hier bewusst NICHT geaendert/entfernt).
   Zwei Varianten ueber dieselbe Basisklasse:
   - .ticket-edit-action           = Bereichsaktion (Icon+Text), z. B.
     Kontakt/Detail-Informationen bearbeiten.
   - .ticket-edit-action--icon     = Einzelfeld-Aktion (nur Icon), z. B.
     Betreff bearbeiten - Tooltip/aria-label benennen den Kontext.
   Klickflaeche/Icon-Groesse orientieren sich bewusst an der bereits
   etablierten Kopieren-Icon-Komponente (.tc-detail-contact-copy) fuer eine
   einheitliche Symbolsprache. */
.ticket-edit-action {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	min-height: 32px;
	padding: 6px 12px;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-primary-dark);
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	white-space: nowrap;
	text-decoration: none !important;
	cursor: pointer;
}
.ticket-edit-action:hover,
.ticket-edit-action:focus-visible {
	background-color: var(--color-border);
	border-color: var(--color-border-strong);
	color: var(--color-primary-dark);
}
.ticket-edit-action:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.ticket-edit-action .tc-icon {
	width: 16px;
	height: 16px;
	flex-shrink: 0;
}
/* Persönliche Notiz (Auftrag "Persönliche Notizen", 21.09.2026, Punkt 1):
   eigene Farbvariante, DEUTLICH abweichend vom normalen "Neuer Eintrag"-
   Button, damit schon vor dem Öffnen klar ist, dass hier ein privater
   Inhalt entsteht - siehe --color-personal in :root. */
.ticket-edit-action--persoenlich {
	color: var(--color-personal-dark);
	background-color: var(--color-personal-subtle);
	border-color: color-mix(in srgb, var(--color-personal) 45%, var(--color-border));
}
.ticket-edit-action--persoenlich:hover,
.ticket-edit-action--persoenlich:focus-visible {
	background-color: color-mix(in srgb, var(--color-personal) 22%, var(--color-personal-subtle));
	border-color: var(--color-personal);
	color: var(--color-personal-dark);
}
.ticket-edit-action--persoenlich:focus-visible {
	outline-color: var(--color-personal);
}
/* Einzelfeld-Variante: kompakte, quadratische Klickflaeche ohne sichtbaren
   Text - Rahmen/Hintergrund nur bei Hover/Focus, damit das Icon direkt am
   Wert nicht dauerhaft wie ein Button wirkt, aber die Klickflaeche (32x32,
   Auftrag Punkt 4: "mindestens ca. 30-34px") trotzdem immer vorhanden ist. */
.ticket-edit-action--icon {
	min-width: 32px;
	padding: 0;
	gap: 0;
	background-color: transparent;
	border-color: transparent;
}
.ticket-edit-action--icon:hover,
.ticket-edit-action--icon:focus-visible {
	background-color: var(--color-background);
	border-color: var(--color-border);
}
.ticket-edit-action--icon .tc-icon {
	width: 17px;
	height: 17px;
}

/* Zusatzdaten modernisieren (18.08.2026, Auftrag Punkt 6/18): Loeschen-
   Aktion nach demselben Klickflaechen-/Fokus-Muster wie .ticket-edit-
   action--icon, aber in Warnfarbe - Loeschen bleibt jederzeit (nicht nur
   bei Hover) als destruktive Aktion erkennbar, siehe Auftrag Punkt 6. */
.ticket-delete-action {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 32px;
	min-height: 32px;
	padding: 0;
	color: var(--color-danger);
	background-color: transparent;
	border: 1px solid transparent;
	border-radius: var(--radius-small);
	cursor: pointer;
	text-decoration: none !important;
}
.ticket-delete-action:hover,
.ticket-delete-action:focus-visible {
	background-color: var(--color-danger-subtle);
	border-color: var(--color-danger);
}
.ticket-delete-action:focus-visible {
	outline: 2px solid var(--color-danger);
	outline-offset: 1px;
}
.ticket-delete-action .tc-icon {
	width: 17px;
	height: 17px;
}

/* Punkt 4/5/6/7/8 (Kontaktbereich), Optimierungsrunde Punkt 2 (Schriftgroesse
   angehoben, 14px->1rem/16px): die vier wichtigsten Angaben (Firma+Zusatz,
   Kundennummer, Ansprechpartner, primaere Telefonnummer) prominent und OHNE
   Aufklapper - anders als Karte/Liste darf die Detailseite ausfuehrlich sein
   (Auftrag Punkt 1). Groessenorientierung jetzt naeher an Ticketkopf/Karte,
   wie in der Optimierungsrunde (Punkt 2) gefordert. */
.tc-detail-contact-primary {
	display: flex;
	flex-direction: column;
	gap: 8px;
	margin-bottom: 14px;
}
.tc-detail-contact-item {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 9px;
	font-size: 1rem;
	color: var(--color-text);
}
.tc-detail-contact-item .tc-icon {
	color: var(--color-text-muted);
	flex-shrink: 0;
	width: 18px;
	height: 18px;
}
/* Kontaktbereich-Optimierung (18.08.2026, Auftrag Punkt 8/9): Firma und
   Zusatz sind jetzt zwei eigene Zeilen statt Klammerzusatz auf einer Zeile -
   der Zusatz bleibt sichtbar, aber erkennbar weniger dominant als die Firma
   (Punkt 8). Der Block existiert nur, wenn ueberhaupt eine Firma vorhanden
   ist (siehe show.php-Bedingung) - kein Platzhalter/keine Luecke bei
   Privatkunden (Punkt 2/13). */
.tc-detail-contact-firma-block {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.tc-detail-contact-firma {
	font-size: 1.2rem;
	font-weight: 700;
}
.tc-detail-contact-zusatz {
	font-size: 0.9rem;
	font-weight: 500;
	color: var(--color-text-muted);
	margin-left: 27px;
}
/* Punkt 4/17: der Ansprechpartner-Name ist bei BEIDEN Kontaktarten eine
   "sehr wichtige" Identifikationsangabe, genau wie Firma und Kundennummer -
   deshalb jetzt ebenfalls fett statt normalgewichtig (vorher optisch nicht
   von Telefonnummer/Adresse unterscheidbar). */
.tc-detail-contact-name {
	font-size: 1.05rem;
	font-weight: 700;
}
/* Feinschliff (18.08.2026, Auftrag Punkt 1): das Textlabel "Kundennr."
   entfaellt (Icon + Position im Kontaktbereich reichen zur Einordnung) -
   die vorherige .tc-detail-contact-nummer-label-Regel ist damit
   ersatzlos entfernt (keine Markup-Stelle nutzt die Klasse mehr). Die
   Zahl bleibt weiterhin visuell gewichtiger als Telefonnummer/Adresse
   (fett statt normalgewichtig). */
.tc-detail-contact-nummer-value {
	font-size: 1.05rem;
	font-weight: 700;
	color: var(--color-text);
}
/* Punkt 5/6/7: kompakte Kopieren-Schnellaktion direkt an der Kundennummer -
   bewusst ein kleines Icon-Symbol statt eines Textbuttons (Punkt 5), aber
   mit ausreichend grosser Klickflaeche (30x30px, Punkt 7). */
.tc-detail-contact-copy-wrap {
	position: relative;
	display: inline-flex;
}
/* Feinschliff (18.08.2026, Auftrag Punkt 1/11): die kompakte Adresse-
   kopieren-Aktion sitzt jetzt inline direkt hinter PLZ/Ort im Fliesstext
   der Adresse statt als eigene Zeile im Aktionsbereich - kleiner
   Abstand zum vorangehenden Text, mittig zur Textzeile ausgerichtet. */
.tc-detail-contact-copy-wrap--inline {
	margin-left: 6px;
	vertical-align: middle;
}
.tc-detail-contact-copy {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	padding: 0;
	color: var(--color-text-muted);
	background-color: transparent;
	border: 1px solid transparent;
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-detail-contact-copy:hover,
.tc-detail-contact-copy:focus-visible {
	color: var(--color-primary-dark);
	background-color: var(--color-background);
	border-color: var(--color-border);
}
.tc-detail-contact-copy:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-detail-contact-copy .tc-icon {
	width: 16px;
	height: 16px;
}
/* Punkt 6/10: Feedback nach dem Kopieren - Icon wechselt kurz auf einen
   Haken (kein Alert-Popup, keine grosse Meldungsbox), zusaetzlich
   kleiner Tooltip "Kopiert" unterhalb des Symbols. Beide Zustaende werden
   ausschliesslich ueber die Wrapper-Modifier-Klasse gesteuert (siehe
   TcKopieren() in show.php), kein :hover-Trick noetig.
   Feinschliff (18.08.2026, Auftrag Punkt 2/10): die Selektoren sind jetzt
   auf den WRAP statt auf .tc-detail-contact-copy gescoped, damit dasselbe
   Icon-Wechsel-Feedback auch fuer die neue, groessere/beschriftete
   "Adresskopf kopieren"-Aktion greift (die .tc-detail-contact-action statt
   .tc-detail-contact-copy als Basis-Optik nutzt, siehe Adressblock unten) -
   fuer die drei bestehenden kompakten Icon-Buttons aendert sich dadurch
   nichts (sie liegen ausnahmslos innerhalb von .tc-detail-contact-copy-wrap). */
.tc-detail-contact-copy-wrap .tc-icon-haken {
	display: none;
	color: var(--color-success);
}
.tc-detail-contact-copy-wrap--done .tc-icon-kopieren {
	display: none;
}
.tc-detail-contact-copy-wrap--done .tc-icon-haken {
	display: inline-flex;
}
.tc-detail-contact-copy-tooltip {
	position: absolute;
	top: 100%;
	left: 50%;
	transform: translateX(-50%) translateY(4px);
	margin-top: 2px;
	background-color: var(--color-text);
	color: #FFFFFF;
	font-size: 0.72rem;
	font-weight: 600;
	padding: 3px 8px;
	border-radius: var(--radius-small);
	white-space: nowrap;
	opacity: 0;
	pointer-events: none;
	transition: opacity .15s ease;
	z-index: 1;
}
.tc-detail-contact-copy-wrap--done .tc-detail-contact-copy-tooltip {
	opacity: 1;
}
/* Punkt 10: TN-Nr./Koop-Nr.-Suche sind eigenstaendige, WEITERFUEHRENDE
   Aktionen - jetzt eine eigene Zeile unter der Kundennummer statt Teil
   derselben Zeile/desselben Elements (vorher .tc-detail-contact-nummer-links
   inline INNERHALB der Kundennummer-Zeile). */
.tc-detail-contact-nummer-links {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin-left: 27px;
}

/* Optimierungsrunde (14.08.2026, Auftrag Punkt 10/11/12): gemeinsame
   Mini-Button-Komponente fuer ALLE kontaktbezogenen Aktionen (TN-/Koop-Nr.-
   Suche, Maps, Adresse/Termindaten kopieren, E-Mail, Webseite) - Icon+Text,
   eigene klar umrissene Klickflaeche, dezenter Hover, bewusst KEIN grosser
   Button (Punkt 12). Bleibt bei der bisherigen fachlichen Zuordnung direkt
   an der jeweiligen Information (Punkt 10) statt eines zentralen Pools -
   diese Klasse ist nur die gemeinsame OPTIK, keine neue Struktur. */
/* Auftrag (20.09.2026, "Ticketdetails: Links zu neuem Tab kennzeichnen",
   Punkt 19): dezentes Kennzeichen am Ende der Beschriftung fuer Links, die
   tatsaechlich einen neuen Tab/ein neues Fenster oeffnen - kleiner/blasser
   als das fuehrende Funktions-Icon, damit die Beschriftung selbst im
   Vordergrund bleibt. */
.tc-icon-extern {
	width: 11px;
	height: 11px;
	opacity: .6;
	flex-shrink: 0;
}
.tc-detail-contact-action {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 4px 10px;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-primary-dark);
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	white-space: nowrap;
}
.tc-detail-contact-action:hover,
.tc-detail-contact-action:focus-visible {
	background-color: var(--color-border);
	border-color: var(--color-border-strong);
	text-decoration: none;
}
.tc-detail-contact-action:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-detail-contact-action .tc-icon {
	width: 14px;
	height: 14px;
}
/* Punkt 10/17: weiterfuehrende Aktionen (TN-Nr./Koop-Nr. suchen) duerfen
   zurueckhaltender wirken als die direkte Kundennummer-Kopieren-Aktion und
   als Adresse/Termindaten kopieren - dieselbe Grundkomponente, nur ohne
   Flaechenfarbe/Rahmen und mit gedaempfter statt betonter Textfarbe. */
.tc-detail-contact-action--quiet {
	color: var(--color-text-muted);
	background-color: transparent;
	border-color: transparent;
	font-weight: 500;
}
.tc-detail-contact-action--quiet:hover,
.tc-detail-contact-action--quiet:focus-visible {
	color: var(--color-primary-dark);
	background-color: var(--color-background);
	border-color: var(--color-border);
}
/* E-Mail/Webseite duerfen laenger sein (ganze Adresse/URL) - eigene Zeile
   statt nebeneinander, damit lange Werte nicht abgeschnitten wirken. */
.tc-detail-contact-action-digital {
	display: inline-flex;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.tc-detail-contact-action-digital + .tc-detail-contact-action-digital {
	margin-top: 6px;
}

/* Punkt 9/18/19/21 (Optimierungsrunde: dichter, aber weiterhin responsiv):
   sekundaere Kontaktinformationen als responsives Raster - auto-fit sorgt
   (wie schon im Kartenkontaktbereich) dafuer, dass sich die Spaltenzahl
   automatisch nach verfuegbarer Breite UND tatsaechlich vorhandenen Gruppen
   richtet, keine festen 400/500px-Bloecke. Mindestbreite/Abstand leicht
   vergroessert (200px->220px), damit die jetzt groessere Schrift nicht zu
   schnell umbricht. */
.tc-detail-contact-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: 14px 28px;
	padding-top: 14px;
	border-top: 1px solid var(--color-border);
}
.tc-detail-contact-group {
	min-width: 0;
	/* Optimierungsrunde Punkt 2: 13px->0.95rem - "Adresse"/"Weitere
	   Kontakte" muessen genauso gut lesbar sein wie der obere Block. */
	font-size: 0.95rem;
	color: var(--color-text);
	line-height: 1.5;
}
.tc-detail-contact-group a {
	word-break: break-all;
}
.tc-detail-contact-actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 8px;
	margin-top: 6px;
}

/* Punkt 13/15/16: Warnwirkung noch etwas deutlicher als in der Vorrunde -
   groessere Ueberschrift/Icon/Text, mehr Innenabstand, klarer roter Akzent
   (linker Rand zusaetzlich zum umlaufenden Rahmen) - aber weiterhin die
   helle Warnbox-Grundidee (KEINE dunkelrote Vollflaeche). Nutzt weiterhin
   --color-danger-subtle wie die Karten-/Listenansicht (.tc-contact-group-hint). */
.tc-detail-contact-hint {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	margin-top: 16px;
	padding: 14px 16px;
	background-color: var(--color-danger-subtle);
	border: 1px solid var(--color-danger);
	border-left: 4px solid var(--color-danger);
	border-radius: var(--radius-small);
	color: var(--color-text);
}
.tc-detail-contact-hint .tc-icon {
	flex-shrink: 0;
	color: var(--color-danger);
	margin-top: 2px;
	width: 22px;
	height: 22px;
}
.tc-detail-contact-hint-title {
	display: block;
	font-size: 1.05rem;
	font-weight: 700;
	color: var(--color-danger);
	margin-bottom: 3px;
}
.tc-detail-contact-hint-text {
	font-size: 0.95rem;
}

/* Neustrukturierung (16.09.2026, Auftrag "Kontakt-Container komplett neu
   strukturieren", AP3): zweispaltiges Grid - links die eigentlichen
   Kontaktdaten (.tc-detail-contact-data, schmaler), rechts alle Kontakt-/
   Suchfunktionen plus Hinweisbox (.tc-detail-contact-tools, breiter, da die
   Funktionsbuttons dort als volle Zeilen dargestellt werden). Unterhalb
   860px eine Spalte (Daten zuerst, Funktionen danach). */
.tc-detail-contact-columns {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(240px, 1fr);
	gap: 20px 28px;
	padding-top: 14px;
	border-top: 1px solid var(--color-border);
}
@media (max-width: 860px) {
	.tc-detail-contact-columns {
		grid-template-columns: 1fr;
	}
}
.tc-detail-contact-data {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-width: 0;
}
/* Adresse kann mehrzeilig umbrechen (Strasse/PLZ+Ort) - Icon soll dabei
   oben an der ersten Zeile bleiben statt vertikal zu zentrieren. */
.tc-detail-contact-item.tc-detail-contact-adresse {
	align-items: flex-start;
}
.tc-detail-contact-item.tc-detail-contact-adresse .tc-icon {
	margin-top: 2px;
}
.tc-detail-contact-tools {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-width: 0;
}
/* Einheitliche, volle Zeilenbreite fuer alle Kontaktfunktionen (Auftrag:
   "Die Funktionen sollen optisch einheitlich aufgebaut sein") - ersetzt die
   vorherige Mischung aus normaler und "--quiet"-Optik. */
.tc-detail-contact-tools .tc-detail-contact-copy-wrap {
	display: flex;
	width: 100%;
}
.tc-detail-contact-tools .tc-detail-contact-action {
	width: 100%;
	justify-content: flex-start;
	padding: 8px 12px;
}

/* Kontaktbereich Nacharbeit (19.08.2026): "Weitere aktive Tickets" steht
   jetzt als echter Eck-Ribbon (.tc-corner-ribbon, dieselbe Komponente wie
   Eskaliert/Geparkt), nicht mehr als eigene Badge-Pille. Farbe Blau
   (--color-primary) statt Rot/Orange. Bewusst als <a> (nicht <span
   role="status"> wie Eskaliert/Geparkt), da hier - anders als dort -
   tatsaechlich eine Aktion dahinter steht. text-decoration/Hover/Fokus
   ergaenzt, da die Basis-.tc-corner-ribbon-Regel bisher nur fuer
   nicht-klickbare <span> gedacht war. */
.tc-corner-ribbon-weitere {
	/* Breiter als der Basiswert (230px) - der Kontaktbereich hat genug Platz,
	   damit der Text ohne Umbruch auf einer Zeile bleibt (Nutzerkorrektur
	   19.08.2026). calc(100% - 24px) bleibt als Sicherheitsnetz erhalten,
	   falls die Karte selbst schmaler als 504px ist. */
	width: min(480px, calc(100% - 24px));
	background-color: var(--color-primary);
	text-decoration: none;
	cursor: pointer;
}
.tc-corner-ribbon-weitere:hover,
.tc-corner-ribbon-weitere:focus-visible {
	background-color: var(--color-primary-dark);
	color: #FFFFFF;
	text-decoration: none;
}
.tc-corner-ribbon-weitere:focus-visible {
	outline: 2px solid #FFFFFF;
	outline-offset: -4px;
}
/* Anzahl weiterer offener Tickets (Nacharbeit 20.08.2026, Auftrag Punkt
   11-14; vereinfacht 21.08.2026, Auftrag Punkt 9-14): steht rechts auf
   derselben Zeile wie der Hinweistext - margin-left:auto schiebt sie an den
   rechten Rand. Die frueher zusaetzliche, per flex-basis:100% erzwungene
   CTA-Zeile ("Tickets anzeigen") ist ersatzlos entfallen, das Badge ist
   dadurch jetzt durchgehend einzeilig (kein eigener Link mehr noetig - das
   umschliessende <a> war bereits vorher die komplette Klickflaeche).
   Kreisfoermiges Badge, deutlich groesser als der Fliesstext, aber ohne
   Warnfarbe (Auftrag Punkt 13: "nicht dominant wie eine Warnmeldung"). */
.tc-corner-ribbon-count {
	flex-shrink: 0;
	margin-left: auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 26px;
	height: 26px;
	padding: 0 7px;
	border-radius: 999px;
	background-color: rgba(255, 255, 255, .25);
	font-size: 16px;
	font-weight: 800;
}
@media (max-width: 640px) {
	.tc-detail-contact {
		padding: 16px 18px;
	}
}

/* ==========================================================================
   Bereinigungsrunde (17.08.2026): unterer Ticketinhalt (Detail-Informationen
   bis Statushistorie) - vorher alte graue Tabellenblöcke, jetzt dieselbe
   Kartensprache wie Ticketkopf/Werkzeuge/Termin/Kontakt/Status. Ein
   gemeinsamer Grundbaustein (.tc-detail-card) fuer alle Abschnitte, damit
   Radius/Rahmen/Schatten/Abstaende konsistent bleiben - Abschnitte
   unterscheiden sich nur durch ihren Inhalt, nicht durch die Kartenoptik.
   ========================================================================== */
.tc-detail-card {
	/* Nacharbeit (21.08.2026, "leichter/moderner/weniger massiv", dann
	   "Ticketfarbe als durchgaengige Akzentfarbe"): Farbe kommt
	   ausschliesslich ueber das gemeinsame --panel-*-System (siehe
	   ausfuehrliche Erklaerung bei .tc-detail-section-head). Die
	   Fallback-Werte hier (nach dem Komma) greifen, wenn keine fachliche
	   Klasse (.tc-detail-termin/.tc-detail-value--.../.tc-detail-notes)
	   eigene --panel-*-Variablen setzt (Prioritaet 1, siehe Auftrag Punkt
	   8) - in diesem Fall wird stattdessen die --ticket-accent*-Variable
	   verwendet, also die Akzentfarbe DIESES Tickets (Prioritaet 2,
	   identisch zur Farbe am Ticketkopf/in der Karten-/Listenansicht,
	   siehe .tc-ticket-area). Kartenflaeche selbst bleibt dadurch fast
	   weiss (nur 4% Farbanteil) statt vollflaechig getoent - Farbe wirkt
	   bewusst ueberwiegend am linken Rand/im Icon/in der Ueberschrift,
	   nicht als grosse Flaeche (Auftrag Punkt 3/4/13: "lieber fuenf kleine
	   Wiederholungen als eine grosse Flaeche"). */
	background-color: color-mix(in srgb, var(--panel-accent, var(--ticket-accent)) 4%, var(--color-surface));
	/* Nacharbeit (16.09.2026, Auftrag "Container und Bereiche visuell
	   klarer trennen"): Rahmen und Schatten der Karte kalibriert
	   verstaerkt (staerkerer Grauanteil im Rahmen, --shadow-medium statt
	   --shadow-small), damit sich Nachbarcontainer klarer voneinander
	   abheben - bewusst weiterhin ohne zusaetzliche Farbe/Flaeche, siehe
	   Begruendung "lieber Wiederholung als grosse Flaeche" oben. */
	border: 1px solid color-mix(in srgb, var(--panel-border, var(--ticket-accent-border)) 65%, var(--color-border-strong) 35%);
	/* Linker Akzentrand (Auftrag Punkt 3: "die linke Linie ist die
	   staerkste Farbe") - deutlich kraeftiger als der sehr duenne,
	   helle Rahmen auf den uebrigen drei Seiten. */
	border-left-width: 4px;
	border-left-color: var(--panel-accent, var(--ticket-accent));
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-medium);
	padding: 20px 24px;
	margin-bottom: calc(var(--spacing-lg) + 4px);
	/* overflow:hidden clippt die bis an den Kartenrand bleedende Titelleiste
	   (siehe .tc-detail-section-head) auf denselben Eckenradius wie die
	   Karte - unbedenklich, da keine der bestehenden Karteninhalte ueber die
	   Kartenflaeche hinaus ragende Elemente (Dropdowns o. Ae.) enthaelt. */
	overflow: hidden;
}
.tc-detail-card:last-child {
	margin-bottom: 0;
}

/* ==========================================================================
   Responsives 2-Spalten-Raster (17.08.2026, Strukturkorrektur 17.08.2026):
   Kontakt/Detail-Informationen bis Quell-Ticket liegen in einem
   uebergeordneten CSS-Grid-Container (.tc-detail-grid) mit genau ZWEI
   Kindern: .tc-grid-col-left und .tc-grid-col-right. Statushistorie bleibt
   bewusst AUSSERHALB, weiterhin volle Breite. Bevorzugtes Spaltenverhaeltnis
   ca. 2/3 zu 1/3, keine starre Pixelbreite fuer die Hauptspalte.
   Wichtig (Strukturkorrektur): die vorherige Fassung setzte die Platzierungs-
   klassen direkt auf JEDE einzelne Karte, wodurch alle Karten (links UND
   rechts) sich denselben impliziten Grid-Zeilenraster teilten - eine sehr
   hohe Karte in einer Spalte konnte dadurch die Zeilenhoehe/Position von
   Karten in der jeweils ANDEREN Spalte beeinflussen. Jetzt gibt es pro
   Spalte genau EINEN Grid-Container (.tc-grid-col-left/--right), der seine
   Karten intern per eigenstaendigem Flex-Stack anordnet - beide Spalten
   haben dadurch keinerlei gemeinsame Zeilenzuordnung mehr und wachsen
   vollstaendig unabhaengig voneinander. Reine Positionierung/Breiten-
   verteilung - keine der bestehenden Karten wird hier selbst veraendert.
   ========================================================================== */
.tc-detail-grid {
	display: grid;
	grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr);
	gap: var(--spacing-lg);
	align-items: start;
}
.tc-grid-col-left,
.tc-grid-col-right {
	display: flex;
	flex-direction: column;
	gap: var(--spacing-lg);
	/* Verhindert, dass eine breite Karte (z. B. eine lange Tabelle/Zeile in
	   Detail-Informationen) die Spalte ueber ihre Grid-Zellenbreite hinaus
	   aufdrueckt - Standardverhalten von Grid-/Flex-Kindern ohne min-width:0
	   ist min-width:auto, was bei sehr breitem Inhalt zu Ueberlauf fuehren
	   kann. Keine feste Hoehe, keine min-height - siehe Auftrag. */
	min-width: 0;
}
/* .tc-detail-card bringt normalerweise sein eigenes margin-bottom mit (fuer
   den Einsatz ausserhalb eines Spalten-Stacks, z. B. Interne Notizen/
   Statushistorie oberhalb bzw. unterhalb dieses Rasters) - innerhalb der
   Spalten-Stacks uebernimmt ausschliesslich der Flex-"gap" den Abstand,
   sonst waere er doppelt so gross. Gezielt nur fuer Karten innerhalb der
   beiden Spalten-Stacks ueberschrieben, alle anderen Verwendungen von
   .tc-detail-card bleiben unveraendert. */
.tc-grid-col-left > .tc-detail-card,
.tc-grid-col-right > .tc-detail-card {
	margin-bottom: 0;
}
/* Unterhalb dieser Breite wird das Raster wieder einspaltig (Auftrag Punkt 9)
   - .tc-grid-col-left/--right werden dabei einfach zu normalen block-weiten
   Flex-Stacks untereinander (kein grid-column-Reset mehr noetig, da die
   Spalten jetzt eigene Elemente statt einzelner Karten-Klassen sind). Die
   Reihenfolge im HTML entspricht bereits der gewuenschten mobilen Reihenfolge
   (linke Spalte komplett, dann rechte Spalte komplett), keine Duplizierung
   noetig. Breite so gewaehlt, dass die rechte Spalte (min. 280px) nicht
   schon vorher gequetscht wird - siehe Rendertests bei mittleren Breiten. */
@media (max-width: 1100px) {
	.tc-detail-grid {
		grid-template-columns: 1fr;
	}
}
.tc-detail-card-body {
	font-size: 1rem;
	line-height: 1.5;
	color: var(--color-text);
}
.tc-detail-empty-text {
	margin: 0;
	font-size: 0.9rem;
	font-style: italic;
	color: var(--color-text-muted);
}

/* Interne Notizen - Container-Redesign (20.08.2026, Auftrag Punkt 4/8;
   verfeinert 21.08.2026 auf das gemeinsame --panel-*-System, siehe
   .tc-detail-section-head): Gelb/Amber-Familie, dieselbe Bedeutung
   (Hinweis/Aufmerksamkeit), die die einzelnen Notiz-Zeilen (.tc-note-row)
   bereits vorher hatten - jetzt zusaetzlich auf den Container selbst
   ausgeweitet statt nur auf die Zeilen darin. */
.tc-detail-notes {
	--panel-accent: var(--color-warning);
	--panel-accent-soft: var(--color-warning-subtle);
	--panel-border: color-mix(in srgb, var(--color-warning) 30%, var(--color-border));
	--panel-title: var(--color-warning-dark);
}
.tc-note-row {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 10px 12px;
	background-color: var(--color-warning-subtle);
	border-left: 3px solid var(--color-warning);
	border-radius: var(--radius-small);
}
.tc-note-row + .tc-note-row {
	margin-top: 8px;
}
.tc-note-meta {
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-text-muted);
}
/* @Erwähnungsfunktion (20.09.2026): deutlich abgesetzt von den beiden
   bestehenden, eher neutralen Hinweisen ("Unter Beobachtung seit"/"Zur
   Kenntnis gesendet am") - eine direkte @Erwähnung ist die persönlichste
   der drei Benachrichtigungsarten, daher Akzentfarbe statt gedecktem Grau. */
.tc-note-meta--erwaehnung {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--color-primary);
}
.tc-note-text {
	font-size: 0.95rem;
	color: var(--color-text);
}
/* @Erwähnungsfunktion (20.09.2026): Chip-Darstellung einer @Erwähnung
   sowohl im RTF-Ticket-Inhalt (echtes <span>, siehe
   tc_mention_html_normalisieren()) als auch in Ergänzungen (aus einem
   Text-Platzhalter aufgelöst, siehe tc_mention_text_ersetzen()) - bewusst
   IDENTISCHE Optik an beiden Stellen. contenteditable="false" (nur im
   RTF-Editor gesetzt) macht die Markierung dort zu einem atomaren, nicht
   zerschneidbaren Block - siehe js/ticket-inhalt-editor.js. */
/* @Erwähnungsfunktion (20.09.2026): Dropdown für die Ergänzungen-
   Benutzersuche (js/tc-mention-erwaehnung.js) - bewusst in normalem
   Dokumentfluss direkt unter dem Textfeld statt frei positioniert/
   überlappend, damit es innerhalb eines <dialog>-Modals (eigener
   Stacking-Kontext) immer zuverlässig sichtbar bleibt. */
.tc-mention-dropdown {
	margin-top: 4px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small, 6px);
	background-color: var(--color-surface);
	box-shadow: var(--shadow-small);
	max-height: 180px;
	overflow-y: auto;
}
.tc-mention-dropdown-eintrag {
	display: block;
	width: 100%;
	text-align: left;
	padding: 6px 10px;
	border: none;
	background: none;
	font: inherit;
	font-size: 0.88rem;
	cursor: pointer;
	color: var(--color-text);
}
.tc-mention-dropdown-eintrag:hover,
.tc-mention-dropdown-eintrag--aktiv {
	background-color: var(--color-info-subtle, #E8EEFC);
	color: var(--color-primary);
}
.tc-mention-dropdown-leer {
	padding: 6px 10px;
	font-size: 0.85rem;
	color: var(--color-text-muted);
}
.tc-mention-vorschau {
	margin: 4px 0 0;
	font-size: 0.82rem;
	color: var(--color-text-muted);
}
.tc-mention {
	display: inline-block;
	padding: 1px 7px;
	border-radius: 999px;
	background-color: var(--color-info-subtle, #E8EEFC);
	color: var(--color-primary);
	font-weight: 600;
	white-space: nowrap;
}

/* Detail-Informationen/Quell-Ticket modernisiert (18.08.2026, Auftrag
   "Detail-Informationen modernisieren"): explizit maximal 2 Spalten
   (vorher auto-fit, das auf sehr breiten Karten theoretisch auch 3
   Spalten haette erzeugen koennen) statt einer sich selbst ergebenden
   Spaltenzahl - "Desktop grundsaetzlich 2 Spalten" (Auftrag Punkt 6/14).
   Volle vs. halbe Breite wird nicht mehr per Feldtyp, sondern per PHP-
   Hilfsfunktion tc_feld_ist_lang() anhand des tatsaechlichen Inhalts
   entschieden (siehe show.php) - die CSS-Klasse .tc-detail-field--full
   selbst ist unveraendert (grid-column:1/-1), nur WANN sie gesetzt wird,
   hat sich geaendert. Bewusst weiterhin relative Einheiten (fr, minmax)
   statt fester Pixelbreiten, plus ein schmaler werdender Fallback auf 1
   Spalte (Auftrag Punkt 14 - "spaeter problemlos responsiv"), im
   selben Muster wie die uebrigen Breakpoints dieser Datei. */
/* Aeussere Aufteilung Betreff/Inhalt (links) | Zusatzfelder (rechts) -
   Auftrag "Checkbox-Darstellung korrigieren + Ticketdaten vereinheitlichen",
   03.09.2026, Teil 3: dieselbe links/rechts-Logik wie bei Ticket-Erfassung/
   -Bearbeitung, hier rein lesend. Jede Seite bleibt intern ein eigenes
   .tc-detail-fields-grid (2-spaltige Feld-Packung bleibt unveraendert
   bestehen, wirkt jetzt nur innerhalb der jeweils schmaleren Haelfte).
   align-items:start bewusst statt stretch - die beiden Seiten sollen sich
   NICHT gegenseitig in der Hoehe angleichen (anders als das wachsende
   Inhaltsfeld in der Ticket-Erfassung), da hier reine Lesedarstellung
   unterschiedlich langer Inhalte gezeigt wird. */
/* AP4 (16.09.2026, "Detail-Informationen - Anzeige analog zur
   Bearbeitung"): Inhalt (links) bekommt spuerbar mehr Breite, die
   Zusatzfelder (rechts) stehen ohnehin nur noch einspaltig untereinander
   (siehe .tc-detail-fields-grid--dynfelder) und brauchen daher weniger
   Platz - asymmetrisches Verhaeltnis statt vorher 1:1, angelehnt an
   .tc-neu-form-columns--asym in der Ticket-Bearbeitung/-Erfassung. */
.tc-detail-fields-columns {
	display: grid;
	grid-template-columns: minmax(0, 1.6fr) minmax(260px, 1fr);
	gap: 16px 32px;
	align-items: start;
}
@media (max-width: 900px) {
	.tc-detail-fields-columns {
		grid-template-columns: 1fr;
	}
}
.tc-detail-fields-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 16px 24px;
}
@media (max-width: 560px) {
	.tc-detail-fields-grid {
		grid-template-columns: 1fr;
	}
}
/* Zusatzfelder-Spalte: immer EINE Spalte (Feld 1..20 strikt
   untereinander), unabhaengig von der Kartenbreite - im Gegensatz zur
   allgemeinen .tc-detail-fields-grid-Basisregel oben (die u. a. weiterhin
   fuer Quell-Ticket/Folgeticket-Detailpanels als 2-Spalten-Packung gilt). */
.tc-detail-fields-grid--dynfelder {
	grid-template-columns: 1fr;
}
.tc-detail-field {
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.tc-detail-field--full {
	grid-column: 1 / -1;
}
.tc-detail-field-label {
	font-size: 0.8rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
	color: var(--color-text-muted);
	/* Auftrag "HTML-Formatierung in dynamischen Feldueberschriften",
	   03.09.2026, Punkt 10.5: siehe .tc-neu-dynfeld-name - lange
	   leerzeichenlose Sternchen-Trennzeilen sollen sauber umbrechen. */
	overflow-wrap: anywhere;
}
/* Punkt 10: der Feldwert soll "etwas staerker im Fokus" stehen als
   zuvor (war zuvor optisch kaum von Fliesstext zu unterscheiden) -
   deshalb jetzt medium statt normalgewichtig, bewusst deutlich leichter
   als das fette Label (kein Konkurrenzverhaeltnis der beiden Ebenen). */
.tc-detail-field-value {
	font-size: 1rem;
	font-weight: 500;
	color: var(--color-text);
	overflow-wrap: break-word;
}
.tc-detail-field-edit {
	margin-left: 4px;
}
/* Rich-Text-Ticketinhalt (16.09.2026, Auftrag "Ticket-Inhalte formatierbar
   machen"): eingefuegte Bilder duerfen den Inhaltsbereich nie sprengen -
   skalieren responsiv auf die verfuegbare Breite, Seitenverhaeltnis bleibt
   dabei automatisch erhalten (nur width gesetzt, height:auto). Absaetze/
   Listen bekommen etwas Abstand, damit mehrere Absaetze nicht wie ein
   einziger Textblock wirken (das div selbst traegt bereits
   .tc-detail-field-value, Schriftgroesse/-farbe kommen von dort). */
.tc-ticket-inhalt-html img {
	max-width: 100%;
	height: auto;
	border-radius: var(--radius-small);
	display: block;
	margin: 4px 0;
}
.tc-ticket-inhalt-html p,
.tc-ticket-inhalt-html ul,
.tc-ticket-inhalt-html ol {
	margin: 0 0 8px 0;
}
.tc-ticket-inhalt-html p:last-child,
.tc-ticket-inhalt-html ul:last-child,
.tc-ticket-inhalt-html ol:last-child {
	margin-bottom: 0;
}
.tc-ticket-inhalt-html ul,
.tc-ticket-inhalt-html ol {
	padding-left: 22px;
}
/* Bestehende, fachlich begruendete Warnmarkierung einzelner Felder (siehe
   PHP: Hausnotrufpaket/Amtsholung/Tagestaste-Sonderregeln) - vorher
   inline style="border:2px solid red", jetzt konsistent mit der uebrigen
   Warnfarben-Sprache (--color-danger). */
.tc-detail-field--warn {
	padding: 8px 10px;
	background-color: var(--color-danger-subtle);
	border: 1px solid var(--color-danger);
	border-radius: var(--radius-small);
}

/* "Hervorheben"-Eigenschaft fuer variable Felder (Auftrag "Variable Felder
   erweitern", 20.09.2026, Punkt 1): gilt fuer ALLE Feldtypen gleichermassen,
   umschliesst Beschriftung + Wert als EIN Block - dasselbe Rahmen+Tönungs-
   Muster wie .tc-detail-field--warn oben, nur mit der neutralen Info-/
   Akzentfarbe statt Gefahrenfarbe (kein Fehlerzustand, reine Betonung). */
.tc-detail-field--hervorgehoben {
	padding: 8px 10px;
	background-color: var(--color-info-subtle);
	border: 1px solid var(--color-primary);
	border-radius: var(--radius-small);
}

/* Neuer Feldtyp "Checkliste" (Auftrag "Variable Felder erweitern",
   20.09.2026, Punkt 2/3/5): sowohl die rein lokale Formular-Variante
   (Neuanlage/Bearbeiten, ".tc-checkliste--eingabe" ueber
   tc_zusatzfeld_eingabe_rendern()) als auch die Lese-/Live-Varianten in der
   Ticketdetailansicht (".tc-checkliste--anzeige"/".tc-checkliste--live")
   teilen sich dieselben Grundklassen. */
.tc-checkliste {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.tc-checkliste-eintrag {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	text-align: left;
	cursor: pointer;
	overflow-wrap: anywhere;
}
.tc-checkliste-eintrag input[type="checkbox"] {
	/* Haertung (identisch zu .tc-neu-checkbox-optionen label input[type=
	   "checkbox"] weiter unten, Nachtrag 21.09.2026 - Fund von Roman:
	   ohne diese Regel setzt ".tc-neu-field input" (projektweit
	   width:100%) in Verbindung mit flex-basis:auto die Checkbox auf die
	   volle Zeilenbreite, wodurch sie mittig/riesig erscheint und der
	   Labeltext aus dem Rahmen herausgedraengt wird - trat bislang nur im
	   Bearbeiten-/Erstellen-Formular auf, nicht in der reinen
	   Ticketdetail-Anzeige, da dort kein .tc-neu-field-Vorfahre existiert). */
	flex: 0 0 auto;
	width: auto;
	margin-top: 3px;
}
/* Durchgestrichene Darstellung erledigter Punkte (Punkt 5) rein per CSS -
   funktioniert identisch fuer die Formular-Variante UND die interaktive
   Live-Variante in der Ticketdetailansicht (beide nutzen dieselbe
   Eintrags-/Checkbox-Struktur), ganz ohne dass JS die Klasse dafuer setzen
   muesste (siehe bereits bestehendes :has()-Muster im Projekt, u. a.
   .tc-status-row:has(...) weiter oben). js/tc-checkliste.js setzt die
   Klasse tc-checkliste-eintrag--erledigt zusaetzlich explizit direkt nach
   einem erfolgreichen AJAX-Umschalten, damit es beim Fallback ohne
   :has()-Unterstuetzung ebenfalls funktioniert. */
.tc-checkliste-eintrag:has(input:checked),
.tc-checkliste-eintrag--erledigt {
	text-decoration: line-through;
	color: var(--color-text-muted);
}
/* Read-only-Darstellung (includes/ticket_zusatzfelder.php, nicht-Besitzer in
   show.php) - kein <input>, daher eigenes Symbol statt einer echten
   Checkbox. */
.tc-checkliste-punkt {
	display: flex;
	align-items: flex-start;
	gap: 8px;
}
.tc-checkliste-symbol {
	flex-shrink: 0;
}
.tc-checkliste-punkt--erledigt {
	text-decoration: line-through;
	color: var(--color-text-muted);
}
/* Vollstaendig abgeschlossene Checkliste (Punkt 7): eigene Kennzeichnung des
   GESAMTEN Feldblocks, dieselbe Erfolgsfarbe wie an anderer Stelle im
   Projekt bereits fuer "erledigt"/"gutgeschrieben" verwendet
   (--color-success*). Bleibt mit .tc-detail-field--hervorgehoben
   kombinierbar (Auftrag Punkt 9) - der Fertig-Rahmen gewinnt dabei bewusst,
   da "vollstaendig erledigt" die staerkere Aussage ist.
   :not(.tc-detail-field--hervorgehoben) sorgt bei einer Kombination dafuer,
   dass nicht zwei unterschiedliche Rahmenfarben gleichzeitig sichtbar
   werden. */
.tc-detail-field--checkliste-fertig {
	background-color: color-mix(in srgb, var(--color-success) 12%, var(--color-surface));
	border: 1px solid var(--color-success);
	border-radius: var(--radius-small);
	padding: 8px 10px;
}
.tc-detail-field--checkliste-fertig.tc-detail-field--hervorgehoben {
	border-color: var(--color-success);
	background-color: color-mix(in srgb, var(--color-success) 12%, var(--color-info-subtle));
}
.tc-detail-field--checkliste-fertig .tc-checkliste-marker,
.tc-detail-field--checkliste-fertig .tc-checkliste-erledigt-wort {
	color: var(--color-success-dark);
	font-weight: 700;
}
.tc-checkliste-fehler {
	margin-top: 4px;
	font-size: 0.85rem;
	color: var(--color-danger);
}

/* Ergaenzungen/Zusatzdaten: bei leerem Inhalt bewusst kompakter
   (Auftrag Punkt 2 - "keine unnoetig grosse Leerflaeche"). */
.tc-detail-additions--empty {
	padding-top: 14px;
	padding-bottom: 14px;
}

/* Ergaenzungen modernisiert (18.08.2026): chronologischer Verlauf statt
   einem einzigen unformatierten Textblock - dasselbe Grundmuster wie die
   bereits bestehende Aufgaben-Liste (.tc-task-row, siehe unten): kompakte
   Zeilen, NUR ein dezenter Trennstrich zwischen aufeinanderfolgenden
   Eintraegen, keine eigene Kachel/kein Hintergrund pro Eintrag (Auftrag
   Punkt 2/13 - "keine farbige Kachelwueste"). Autor/Zeitpunkt als kleine,
   gedaempfte Metazeile ueber dem eigentlichen Text (Auftrag Punkt 3). */
.tc-additions-list {
	display: flex;
	flex-direction: column;
}
/* Nacharbeit (16.09.2026, AP5 "Ergaenzungen - zweispaltige chronologische
   Darstellung"): links eine kompakte Meta-Spalte (Datum/Uhrzeit/Benutzer
   untereinander), rechts der eigentliche Ergaenzungstext mit dem groesseren
   Platzanteil - vorher stand die Meta-Zeile ueber dem Text. Sortierung
   bleibt unveraendert aelteste-zuerst (siehe tc_ergaenzungen_parsen()). */
.tc-addition-entry {
	display: grid;
	/* Nutzerkorrektur (16.09.2026): breit genug, damit Datum und Uhrzeit auf
	   EINER Zeile stehen (siehe .tc-addition-datumzeit unten), statt wie
	   zunaechst umgesetzt jeweils in einer eigenen Zeile. */
	grid-template-columns: 172px minmax(0, 1fr);
	gap: 4px 20px;
	padding: 14px 0;
}
@media (max-width: 640px) {
	.tc-addition-entry {
		grid-template-columns: 1fr;
	}
}
.tc-addition-entry:first-child {
	padding-top: 0;
}
.tc-addition-entry + .tc-addition-entry {
	border-top: 1px solid var(--color-border);
}
.tc-addition-meta {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 4px;
	font-size: 0.85rem;
	font-weight: 700;
	color: var(--color-text-muted);
}
.tc-addition-datumzeit {
	display: flex;
	align-items: center;
	flex-wrap: nowrap;
	gap: 8px;
	white-space: nowrap;
}
.tc-addition-autor,
.tc-addition-datum,
.tc-addition-uhrzeit {
	display: inline-flex;
	align-items: center;
	gap: 5px;
}
.tc-addition-autor .tc-icon,
.tc-addition-datum .tc-icon {
	color: var(--color-text-muted);
	width: 14px;
	height: 14px;
}
.tc-addition-text {
	font-size: 1rem;
	color: var(--color-text);
	line-height: 1.5;
	overflow-wrap: break-word;
}

/* Persönliche Notiz innerhalb der Ergänzungen-Zeitleiste (Auftrag
   "Persönliche Notizen", 21.09.2026, Punkt 4): der gesamte Notizblock wird
   hervorgehoben (nicht nur Meta oder nur Text) - eigene Violett-Toenung
   (--color-personal*), damit klar von normalen Ergaenzungen UND von der
   blauen "Hervorheben"-Markierung der Zusatzfelder unterschieden. Bewusst
   KEIN Rot/Gelb, damit es nicht wie eine Warnung wirkt. */
.tc-addition-entry--notiz {
	grid-template-columns: 1fr;
	background-color: var(--color-personal-subtle);
	border: 1px solid color-mix(in srgb, var(--color-personal) 35%, var(--color-border));
	border-radius: var(--radius-small);
	padding: 12px 14px;
}
.tc-addition-entry--notiz.tc-addition-entry + .tc-addition-entry {
	border-top: none;
}
.tc-addition-entry--notiz .tc-addition-meta {
	flex-direction: row;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
}
.tc-addition-notiz-badge {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	font-size: 0.78rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
	color: var(--color-personal-dark);
}
.tc-addition-notiz-badge .tc-icon {
	width: 13px;
	height: 13px;
}
.tc-addition-notiz-bearbeitet {
	font-size: 0.78rem;
	font-weight: 400;
	font-style: italic;
	color: var(--color-text-muted);
	text-transform: none;
}
.tc-addition-entry--notiz .tc-addition-text {
	margin-top: 6px;
}
.tc-addition-notiz-aktionen {
	display: flex;
	gap: 14px;
	margin-top: 10px;
}
.tc-addition-notiz-aktion {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	background: none;
	border: none;
	padding: 0;
	font-size: 0.82rem;
	font-weight: 600;
	color: var(--color-personal-dark);
	cursor: pointer;
	text-decoration: underline;
	text-underline-offset: 2px;
}
.tc-addition-notiz-aktion:hover,
.tc-addition-notiz-aktion:focus-visible {
	color: var(--color-primary-dark);
}
.tc-addition-notiz-aktion .tc-icon {
	width: 13px;
	height: 13px;
}
.tc-addition-notiz-aktion--loeschen:hover,
.tc-addition-notiz-aktion--loeschen:focus-visible {
	color: var(--color-danger);
}

/* Aufgaben (Feinschliff 18.08.2026, "Aufgabenbereich optimieren"): jede
   Aufgabe jetzt auf eine klare Hauptzeile reduziert - [Status] Titel
   .......... [Info][Aktionen] (Auftrag Punkt 4/17). Die frueher dauerhaft
   sichtbare Beschreibung/Rueckmeldung/Datum-Zeile ist NICHT entfernt,
   sondern in den Info-Tooltip gewandert (.tc-task-info, Punkt 5/6/7) - nur
   ein Trennstrich zwischen Zeilen, keine schweren Einzelkarten. Die ganze
   Zeile hebt sich bei Hover dezent hervor (Punkt 15, gleiches
   filter:brightness()-Muster wie bereits bei den Zusatzdaten-Zeilen), loest
   dabei aber bewusst KEINE Aktion aus (Punkt 16 - anders als Zusatzdaten) -
   deshalb kein Stretched-Link, nur ein reiner Hover-Effekt ohne Klick. */
/* AP8 (16.09.2026, "Aufgaben visuell besser hervorheben"): jede Aufgabe ist
   jetzt eine eigenstaendige, kompakte Bubble/Card statt einer losen, nur
   durch eine Trennlinie abgesetzten Textzeile - eigener Hintergrund/Rahmen/
   Radius je Aufgabe, dezenter Abstand zwischen mehreren Aufgaben. Farbgebung
   bewusst neutral (--color-background/--color-border, kein grelles
   Eigenfarbschema) - die Statusfarbe (siehe .tc-task-status--* weiter unten)
   bleibt das eigentliche Signal je Aufgabe. */
.tc-task-row {
	/* Nacharbeit (19.08.2026, "Aufgabenbereich zweizeilig vervollstaendigen"):
	   feste 2-Spalten/2-Zeilen-Grid-Struktur statt Flexbox mit zufaelligem
	   Umbruch - Status links (Spalte 1) spannt beide Zeilen (grid-row:
	   span 2), Titel (Zeile 1) und Aktionen (Zeile 2) liegen beide in
	   Spalte 2 uebereinander (Auftrag Punkt 1/2/3). grid-auto-rows:auto
	   sorgt dafuer, dass die Statusflaeche automatisch mit der tatsaechlichen
	   Zeilenhoehe mitwaechst (mehrzeiliger Aufgabentext -> hoehere
	   Statusflaeche) - bewusst KEINE feste Pixelhoehe irgendwo im Block. */
	display: grid;
	grid-template-columns: 34px 1fr;
	grid-auto-rows: auto;
	column-gap: 12px;
	row-gap: 6px;
	padding: 10px 12px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	margin-bottom: 8px;
	/* Nacharbeit (25.08.2026, "Aufgabenbereich: Sicherheitsabfragen
	   vereinheitlichen"): Positionierungskontext fuer die neue
	   .tc-task-confirm-popover - ohne Auswirkung auf das Grid selbst
	   (position:relative aendert weder Spalten/Zeilen noch Groessen). Die
	   Sicherheitsabfrage haengt sich dadurch an die GESAMTE Zeilenbreite
	   statt an das schmale 32px-Ausloeser-Element, siehe dort. */
	position: relative;
	transition: background-color .1s ease, box-shadow .1s ease, border-color .1s ease;
}
.tc-task-row:last-child {
	margin-bottom: 0;
}
/* Hover: Rahmen/Flaeche heben sich zusaetzlich leicht ab - Statusfarbe
   bleibt dadurch unveraendert klar erkennbar. Loest weiterhin bewusst KEINE
   Aktion aus (kein Stretched-Link, anders als Zusatzdaten). */
.tc-task-row:hover {
	border-color: var(--color-border-strong);
	box-shadow: var(--shadow-small);
}
/* Statussymbol (Auftrag Punkt 2): kompaktes, quadratisches Symbolfeld -
   grid-row:span 2 laesst es automatisch ueber Titel- UND Aktionszeile
   reichen (Punkt 1/3), das Grid-Standardverhalten align-items:stretch
   dehnt die Zelle bereits auf die volle gemeinsame Hoehe, Symbol bleibt
   dabei per flex mittig. Funktioniert hauptsaechlich ueber Farbe + Symbol,
   die Wortbedeutung (Noch nicht/Offen/Erledigt) steht im Tooltip/ARIA-Label
   (.tc-tip, per Hover UND Tastaturfokus erreichbar, gleiches Muster wie die
   Prioritaets-Kennzeichnung in der Listenansicht). */
.tc-task-status {
	grid-column: 1;
	grid-row: 1 / span 2;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	/* AP8 (16.09.2026): die Aufgaben-Bubble selbst nutzt jetzt
	   --color-background als eigene Flaeche (siehe .tc-task-row) - das
	   Statussymbol braucht daher einen davon abweichenden Ton (Kartenweiss),
	   um weiterhin als eigenes Element erkennbar zu bleiben. */
	background-color: var(--color-surface);
	cursor: default;
}
.tc-task-status .tc-icon {
	width: 18px;
	height: 18px;
}
.tc-task-status--offen {
	color: var(--color-priority-text);
	background-color: var(--color-priority);
}
.tc-task-status--abgeschlossen {
	color: #FFFFFF;
	background-color: var(--color-success);
}
/* Titel (Zeile 1, Spalte 2) bleibt die wichtigste, dauerhaft sichtbare
   Information (Punkt 4 der vorherigen Runde) - darf umbrechen (keine
   abgeschnittenen Aufgabennamen, keine horizontale Scrollleiste), die
   Aktionszeile darunter bleibt davon unberuehrt (eigene Grid-Zeile statt
   gemeinsamer Flex-Zeile). */
.tc-task-title {
	grid-column: 2;
	grid-row: 1;
	min-width: 0;
	font-size: 1rem;
	font-weight: 700;
	color: var(--color-text);
	overflow-wrap: break-word;
}
/* Aktionszeile (Zeile 2, Spalte 2, Auftrag Punkt 3/4): festes Grid mit
   sechs Spuren - vier gleich breite Aktionsspalten (Start/Erledigen/
   Wiederholen/Stornieren), eine flexible Luecke, dann Info als letzte,
   ebenfalls feste Spalte ganz rechts (siehe .tc-task-info, das explizit in
   Spalte 6 platziert wird). Nicht verfuegbare Aktionen werden als leerer
   .tc-task-action-slot gerendert (siehe includes/aufgaben_liste.php) statt
   einfach wegzulassen - die vier Aktionsspalten behalten dadurch ihre
   Position unabhaengig vom Inhalt, "Info ganz rechts" bleibt trotzdem
   erhalten, ohne die restlichen Spalten zu sprengen. */
.tc-task-actions {
	grid-column: 2;
	grid-row: 2;
	display: grid;
	grid-template-columns: repeat(4, 32px) 1fr 32px;
	align-items: center;
	gap: 4px;
}
.tc-task-action-slot {
	width: 32px;
	height: 32px;
}
/* AJAX-Ladezustand (Auftrag Punkt 5): Symbol wird waehrend der Anfrage
   ausgeblendet und durch einen kleinen rotierenden Ring ersetzt (currentColor,
   funktioniert dadurch automatisch in allen Aktionsfarben), Klick wird per
   aria-disabled + pointer-events:none zusaetzlich zur JS-Sperre verhindert
   (Mehrfachklick-Schutz). */
.tc-task-action-link--busy {
	position: relative;
	pointer-events: none;
	opacity: .55;
}
.tc-task-action-link--busy .tc-icon {
	visibility: hidden;
}
.tc-task-action-link--busy::after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	width: 14px;
	height: 14px;
	margin: -7px 0 0 -7px;
	border: 2px solid currentColor;
	border-right-color: transparent;
	border-radius: 50%;
	animation: tc-task-spin .6s linear infinite;
}
@keyframes tc-task-spin {
	to {
		transform: rotate(360deg);
	}
}
/* Fehlermeldung bei fehlgeschlagener AJAX-Aktion (Auftrag Punkt 5): eigene,
   volle Breite ueber beide Spalten (grid-column:1/-1) unterhalb von Status/
   Titel/Aktionen, verschwindet automatisch nach kurzer Zeit wieder (siehe
   js/aufgaben-ajax.js). */
.tc-task-error {
	grid-column: 1 / -1;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-danger);
}
/* Info-Symbol (Punkt 5/6/7/8 der vorherigen Runde): steht explizit in der
   letzten (6.) Spalte der Aktionszeile, damit es unabhaengig von der
   flexiblen Luecke (siehe .tc-task-actions) immer ganz rechts bleibt.
   Nutzt die bestehende .tc-tip-Komponente (Tooltip per Hover UND
   Tastaturfokus, siehe oben), aber mit breiterem Tooltip als deren
   Standardwert (220px) - die zusammengefasste Aufgabenbeschreibung/
   Rueckmeldung/Zeitangabe braucht mehr Platz als ein kurzer Ein-Wort-
   Hinweis (Punkt 8: "keine winzige einzeilige Browser-Tooltip-Wurst"). */
.tc-task-info {
	grid-column: 6;
}
.tc-task-info::after {
	max-width: 320px;
}
/* Erledigen-Aktion (Punkt 13): bewusst umrandet/transparent statt
   vollflaechig gruen, damit die AKTION optisch klar vom bereits
   ausgefuellten gruenen STATUS-Badge (.tc-task-status--abgeschlossen)
   unterscheidbar bleibt - gleiches Klickflaechen-/Fokus-Muster wie
   .ticket-delete-action, nur in Erfolgsfarbe statt Warnfarbe. */
.tc-task-complete-action {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 32px;
	min-height: 32px;
	padding: 0;
	color: var(--color-success);
	background-color: transparent;
	border: 1px solid var(--color-success);
	border-radius: var(--radius-small);
	cursor: pointer;
	text-decoration: none !important;
}
.tc-task-complete-action:hover,
.tc-task-complete-action:focus-visible {
	background-color: #E7F3E9;
}
.tc-task-complete-action:focus-visible {
	outline: 2px solid var(--color-success);
	outline-offset: 1px;
}
.tc-task-complete-action .tc-icon {
	width: 17px;
	height: 17px;
}

/* Nacharbeit (25.08.2026, "Aufgabenbereich: Sicherheitsabfragen
   vereinheitlichen + Statistik im Kopf", Auftrag Punkt 2): kompakte
   Aufgabenstatistik direkt hinter der Ueberschrift "Aufgaben" - bewusst
   ALS TEIL von .tc-detail-section-title (nicht als zweites, per
   justify-content:space-between an den rechten Rand gedruecktes Element
   wie z. B. der "Bearbeiten"-Link im Kontaktbereich), damit sie wirklich
   direkt neben dem Wort "Aufgaben" steht statt am anderen Ende der
   Kopfleiste. Zurueckhaltend (kleinere, gedaempfte Schrift, kein Badge/
   keine Flaeche) - reiner Text neben der ohnehin schon fetten Ueberschrift. */
.tc-task-stats {
	font-size: 0.8rem;
	font-weight: 500;
	color: var(--color-text-muted);
	white-space: nowrap;
}

/* Aufgabenbereich: Ja/Nein-Sicherheitsabfrage vor "Aufgabe erneut
   anfragen" und "Aufgabe stornieren" (25.08.2026, Auftrag Punkt 1).
   Dasselbe Popover-Grundmuster/dieselbe Optik wie die bereits bestehende
   Termin-Sicherheitsabfrage (.tc-termin-confirm-*) bzw. die Werkzeugleisten-
   Popover (.tc-toolbar-popover-*) - bewusst als eigene, separat benannte
   Klassen (siehe js/aufgaben-confirm.js fuer die Begruendung: hier wird
   ereignisdelegiert statt je Element initialisiert, da die Aktionszeile
   nach jeder Aktion per AJAX komplett neu gerendert wird). Der Trigger
   ersetzt in der Aktionszeile lediglich den bisherigen direkten Link an
   exakt derselben 32px-Grid-Spalte - .tc-task-confirm-widget uebernimmt
   dafuer bewusst Groesse/Zentrierung der bisherigen Klickflaeche, damit
   sich am festen 6-Spalten-Aktionsraster (.tc-task-actions) nichts
   verschiebt. */
.tc-task-confirm-widget {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
}
.tc-task-confirm-popover {
	/* Nacharbeit (25.08.2026): bewusst NICHT an das schmale 32px-
	   Ausloeser-Element verankert (siehe .tc-task-confirm-widget, das
	   dafuer absichtlich KEIN position:relative traegt), sondern an die
	   gesamte Aufgabenzeile (.tc-task-row, position:relative) - "Aufgabe
	   erneut anfragen"/"Aufgabe stornieren" sitzen im festen 6-Spalten-
	   Aktionsraster an dritter/vierter statt letzter Stelle; ein am
	   Ausloeser selbst verankertes, rechts- oder linksbuendiges Popover
	   ragte je nach Kartenbreite ueber den Karten- oder sogar Seitenrand
	   hinaus. left/right relativ zur vollen Zeilenbreite garantiert, dass
	   die Sicherheitsabfrage unabhaengig von der Kartenbreite immer
	   innerhalb der Karte bleibt. */
	position: absolute;
	top: 100%;
	left: 34px;
	right: 0;
	z-index: 20;
	margin-top: 6px;
	width: auto;
	max-width: none;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
	padding: 10px;
	text-align: left;
	white-space: normal;
}
.tc-task-confirm-popover[hidden] {
	display: none;
}
.tc-task-confirm-frage {
	margin: 0 0 8px 0;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-text);
}
.tc-task-confirm-actions {
	display: flex;
	gap: 8px;
	justify-content: flex-end;
}

/* Verbundene Tickets / Quell-Ticket / Folgetickets (19.08.2026,
   "Ticketbeziehungen ueberarbeiten"): einheitliche kompakte Darstellung fuer
   alle drei Karten (.tc-detail-relations) - standardmaessig nur Ticketnummer
   + Betreff sichtbar, weitere Informationen (Notiz bzw. Zusatzfelder) ueber
   denselben Aufklapp-Mechanismus wie an anderer Stelle im Projekt (aria-
   controls/aria-expanded/Klasse "tc-open", siehe js/ticket-beziehungen.js) -
   keine neue abweichende Bedienlogik (Auftrag Punkt 7/16). Mehrere Zeilen
   (Verbundene Tickets/Folgetickets) durch einen dezenten oberen Trennstrich
   voneinander abgesetzt, dasselbe Muster wie zuvor. */
.tc-relation-row {
	padding: 8px 0;
}
.tc-relation-row + .tc-relation-row {
	border-top: 1px solid var(--color-border);
}
.tc-relation-summary {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px 10px;
}
.tc-relation-link {
	font-weight: 700;
	color: var(--color-primary-dark);
}
.tc-relation-link:hover {
	text-decoration: underline;
}
.tc-relation-subject {
	flex: 1 1 auto;
	min-width: 0;
	font-size: 0.9rem;
	color: var(--color-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-relation-toggle {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	margin-left: auto;
	padding: 0;
	background: none;
	border: none;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	cursor: pointer;
}
.tc-relation-toggle:hover,
.tc-relation-toggle:focus-visible {
	background-color: var(--color-border);
	color: var(--color-text);
	outline: none;
}
.tc-relation-toggle .tc-icon {
	transition: transform .15s ease;
}
.tc-relation-toggle[aria-expanded="true"] .tc-icon {
	transform: rotate(90deg);
}
.tc-relation-details {
	margin-top: 8px;
	padding-top: 8px;
	border-top: 1px dashed var(--color-border);
	font-size: 0.9rem;
	color: var(--color-text);
}
.tc-relation-details.tc-detail-fields-grid {
	border-top: none;
	padding-top: 0;
}
/* Bugfix waehrend der Verifikation: .tc-detail-fields-grid setzt bereits
   unbedingt display:grid - das gewinnt als Autorenregel gegen die
   UA-Standardregel [hidden]{display:none} (Autor- schlaegt UA-Herkunft,
   unabhaengig von Spezifitaet), wodurch die Zusatzfelder trotz gesetztem
   hidden-Attribut sichtbar blieben. Explizite eigene Regel mit hoeherer
   Spezifitaet (Klasse+Attribut) erzwingt das Ausblenden zuverlaessig. */
.tc-relation-details[hidden] {
	display: none;
}
.tc-relation-detail-label {
	font-weight: 700;
	color: var(--color-text-muted);
}

/* Eigenschaften: kompakte Metainformationen statt mehrzeiligem Fliesstext -
   dieselben bereits vorhandenen Werte, nur als klare Label/Wert-Paare. */
.tc-detail-properties-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: 12px 24px;
}
.tc-property-row {
	display: flex;
	flex-direction: column;
	gap: 3px;
}
.tc-property-row--full {
	grid-column: 1 / -1;
}
.tc-property-label {
	font-size: 0.8rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
	color: var(--color-text-muted);
}
.tc-property-value {
	font-size: 0.95rem;
	color: var(--color-text);
}

/* Wert-Container ueberarbeitet (19.08.2026, "Ticket-Wert-Container
   ueberarbeiten"): Betrag bleibt der optische Mittelpunkt (Punkt 4), Zustand
   (normal/gutgeschrieben/entwertet, Punkt 7) zeigt sich sowohl an einem
   runden Status-Icon VOR dem Betrag als auch an einem dezenten linken
   Akzent/leicht getoenter Titelleiste (Nacharbeit 21.08.2026, "leichter/
   moderner" - ueber dasselbe --panel-*-System wie alle anderen Container,
   siehe .tc-detail-section-head; "normal" bleibt bewusst beim neutralen
   Standardwert, keine eigene Regel noetig). Aktionen (Punkt 5/6) rechts
   ueber die bereits etablierten .ticket-edit-action--icon/
   .ticket-delete-action-Komponenten - dieselbe Symbolsprache wie
   Aufgaben-/Zusatzdaten-Bereich statt neuer Optik. */
.tc-detail-value--gutgeschrieben {
	--panel-accent: var(--color-success);
	--panel-accent-soft: color-mix(in srgb, var(--color-success) 14%, var(--color-surface));
	--panel-border: color-mix(in srgb, var(--color-success) 30%, var(--color-border));
	--panel-title: var(--color-success-dark);
}
.tc-detail-value--entwertet {
	--panel-accent: var(--color-danger);
	--panel-accent-soft: var(--color-danger-subtle);
	--panel-border: color-mix(in srgb, var(--color-danger) 30%, var(--color-border));
	--panel-title: var(--color-danger-dark);
}
.tc-value-row {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 12px;
}
.tc-value-status {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 28px;
	height: 28px;
	border-radius: 50%;
	cursor: default;
}
.tc-value-status--ok {
	color: #FFFFFF;
	background-color: var(--color-success);
}
.tc-value-status--void {
	color: #FFFFFF;
	background-color: var(--color-danger);
}
.tc-value-status .tc-icon {
	width: 15px;
	height: 15px;
}
.tc-value-amount {
	font-size: 1.5rem;
	font-weight: 800;
	color: var(--color-text);
	letter-spacing: -.01em;
}
.tc-value-actions {
	display: flex;
	align-items: center;
	gap: 4px;
	margin-left: auto;
}
/* Nachtrag (17.09.2026, Auftrag "Wertkonto/Zeitkonto - kombiniertes
   Abrechnungssystem"): Zeit-Block im bestehenden "Wert"-Bereich der
   Ticketdetailseite (siehe includes/wert_container.php) - dieselbe
   ruhige, kompakte Darstellung wie der Euro-Teil, eigene Klassen analog zu
   .tc-value-*. */
.tc-zeit-row {
	display: flex;
	align-items: flex-start;
	flex-wrap: wrap;
	gap: 12px;
}
.tc-zeit-felder {
	margin: 0;
	display: grid;
	grid-template-columns: max-content 1fr;
	gap: 3px 10px;
	font-size: .92rem;
}
.tc-zeit-felder dt {
	color: var(--color-text-muted);
	font-weight: 600;
}
.tc-zeit-felder dd {
	margin: 0;
	color: var(--color-text);
}
.tc-value-row--aktionen {
	margin-top: 4px;
}
/* AP7 (Gesamtauftrag "BeWo Ticketsystem 2026", 13.09.2026, "Wertkonto-
   Aktionen ueberarbeiten"): Aktionen-Spalte der Wertkonto-Bewegungsliste
   (Zurueckbuchen-Shortcut/manuelle Loeschung) - .tc-inline-action-form
   selbst ist display:contents (siehe oben), die Buttons brauchen daher
   hier ihr eigenes Flex-Layout. */
.tc-log-aktionen {
	display: flex;
	align-items: center;
	gap: 4px;
}
/* Ticketwert-Schnelländerung (19.08.2026, "Ticketwert direkt erhoehen/
   vermindern"): kompakte Chips/Bubbles statt grosser klassischer Buttons
   (Auftrag Punkt 1) - eigene, spezifische Klassen (.tc-value-bubble*),
   bewusst KEINE generischen Namen wie .badge/.button/.actions, damit der
   eingefrorene Aufgabenbereich unberuehrt bleibt (Auftrag Punkt 13). Plus/
   Minus optisch nur ueber eine dezente Randfarbe unterschieden, kein
   volltoniger Hintergrund - Container bleibt dadurch ruhig statt bunt. */
.tc-value-quick-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin-top: 10px;
}
.tc-value-bubble {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 5px 10px;
	font-family: inherit;
	font-size: 0.8rem;
	font-weight: 700;
	color: var(--color-text);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: 999px;
	cursor: pointer;
	white-space: nowrap;
}
.tc-value-bubble--plus {
	color: var(--color-success);
	border-color: var(--color-success);
}
.tc-value-bubble--minus {
	color: var(--color-danger);
	border-color: var(--color-danger);
}
.tc-value-bubble--plus:hover,
.tc-value-bubble--plus:focus-visible {
	background-color: color-mix(in srgb, var(--color-success) 12%, var(--color-surface));
}
.tc-value-bubble--minus:hover,
.tc-value-bubble--minus:focus-visible {
	background-color: var(--color-danger-subtle);
}
.tc-value-bubble:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
/* Ladezustand (Auftrag Punkt 10): Text unsichtbar (color:transparent, da
   reiner Textinhalt ohne eigenes Icon-Element), kleiner rotierender Ring
   ersetzt ihn, Klick wird zusaetzlich per aria-disabled + pointer-events:none
   verhindert (Mehrfachklick-Schutz - "aus 25 EUR darf durch Doppelklick
   nicht ploetzlich 75 EUR werden"). */
.tc-value-bubble--busy {
	position: relative;
	pointer-events: none;
	color: transparent !important;
}
.tc-value-bubble--busy::after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	width: 12px;
	height: 12px;
	margin: -6px 0 0 -6px;
	border: 2px solid var(--color-text-muted);
	border-right-color: transparent;
	border-radius: 50%;
	animation: tc-value-spin .6s linear infinite;
}
@keyframes tc-value-spin {
	to {
		transform: rotate(360deg);
	}
}
/* Fehlermeldung bei fehlgeschlagener Wertaenderung (Auftrag Punkt 11): der
   bisherige Wert bleibt sichtbar (kein DOM-Austausch bei Fehlschlag), diese
   Zeile erscheint zusaetzlich darunter und verschwindet automatisch wieder
   (siehe js/wert-ajax.js). */
.tc-value-error {
	margin-top: 8px;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-danger);
}

/* Statushistorie modernisiert (19.08.2026, "Fokusansicht statt vollem
   Protokoll"): Filter-/Werkzeugleiste jetzt zweiteilig - Hauptumschalter
   Fokus/Alles links, Suche rechts (Auftrag Punkt 5/12). Die frueheren zwei
   Checkboxen + Absenden-Formular entfallen (siehe js/statushistorie.js -
   Fokus/Alles/Chips/Suche laufen jetzt clientseitig ohne Reload), die
   Tabelle bleibt eine echte <table> (Auftrag Punkt 7), nur kompakter. */
.tc-history-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	margin-bottom: 12px;
}
.tc-history-view-toggle {
	display: inline-flex;
	gap: 2px;
	padding: 3px;
	background-color: var(--color-background);
	border-radius: var(--radius-medium);
}
/* Neue zentrale Seite "Tickets", Feinschliff (31.08.2026, Auftrag Punkt 1):
   Karten-/Listenumschalter steht jetzt direkt neben der Seitenueberschrift
   "Tickets" statt in der Filterzeile - wiederverwendet dieselbe
   .tc-history-view-toggle/-btn-Komponente (kompakter Segment-Schalter, kein
   Satz normaler Buttons), nur neu platziert. */
.tc-tickets-headline-row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
}
.tc-tickets-ansicht-toggle {
	font-size: 14px;
}
/* Kopfbereich ueberarbeitet (01.09.2026, Auftrag "Kopfbereiche Protokoll/
   Tickets/Ticket-Detail ueberarbeiten", Punkt 12): rechte Gruppe der
   Titelzeile - Karten-/Listenumschaltung + "Filter zuruecksetzen" bilden
   jetzt gemeinsam den zweiten Flex-Block von .tc-tickets-headline-row
   (dessen justify-content:space-between sorgt fuer den Abstand zur
   Titelgruppe links). */
.tc-tickets-headline-rechts {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 14px;
}
.tc-history-view-btn {
	font-size: 0.85rem;
	font-weight: 700;
	color: var(--color-text-muted);
	background-color: transparent;
	border: none;
	padding: 6px 14px;
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-history-view-btn:hover {
	color: var(--color-text);
}
.tc-history-view-btn--active {
	color: #FFFFFF;
	background-color: var(--color-primary);
}
.tc-history-view-btn--active:hover {
	color: #FFFFFF;
}
.tc-history-view-btn:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
/* Vierte Feinschliff-Runde (25.08.2026, Auftrag Punkt 3): deutlich
   verkleinert (vorher 220-320px). Getestet per Screenshot: 170px schnitt
   den Platzhaltertext "Protokoll durchsuchen" sichtbar ab (nicht mehr
   "gut lesbar", Auftrag Punkt 3) - 210px ist der kleinste Wert, bei dem
   Icon + kompletter Platzhaltertext noch ohne Abschneiden Platz finden,
   und liegt damit näher an "ungefähr halbiert" als an der ursprünglichen
   Breite. Gilt nur im Protokollbereich (.tc-log-toolbar-rechts) - dieselbe
   Klasse an anderer Stelle (z. B. Ticket-Statushistorie) bleibt in ihrer
   bisherigen Breite unverändert. */
.tc-history-search-wrap {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	flex: 1 1 220px;
	max-width: 320px;
	padding: 6px 10px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	color: var(--color-text-muted);
}
.tc-log-toolbar-rechts .tc-history-search-wrap {
	flex: 0 1 210px;
	max-width: 210px;
}
.tc-history-search-wrap:focus-within {
	border-color: var(--color-primary);
	color: var(--color-text-muted);
}
.tc-history-search-wrap .tc-icon {
	flex-shrink: 0;
}
.tc-history-search {
	flex: 1 1 auto;
	min-width: 0;
	border: none;
	background: none;
	font-size: 0.9rem;
	color: var(--color-text);
}
.tc-history-search:focus {
	outline: none;
}
/* Chips (Auftrag Punkt 4/6/13/14): nur tatsaechlich im Ticket vorkommende
   Gruppen werden ueberhaupt gerendert (siehe show.php), Anzahl je Chip
   direkt sichtbar. Einzelauswahl - .tc-history-chip--active markiert den
   aktuell aktiven Zusatzfilter (siehe js/statushistorie.js). */
.tc-history-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin-bottom: 12px;
}
.tc-history-chip {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	font-size: 0.8rem;
	font-weight: 600;
	color: var(--color-text);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	padding: 5px 10px;
	border-radius: 999px;
	cursor: pointer;
}
.tc-history-chip:hover {
	border-color: var(--color-border-strong);
}
.tc-history-chip:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-history-chip--active {
	color: #FFFFFF;
	background-color: var(--color-primary);
	border-color: var(--color-primary);
}
.tc-history-chip-count {
	font-size: 0.75rem;
	font-weight: 700;
	color: var(--color-text-muted);
	background-color: var(--color-background);
	padding: 0 6px;
	border-radius: 999px;
}
/* Mehrfach-Abteilungen (Auftrag "Mehrfach-Abteilungen"): kleine, rein
   anzeigende Badges statt eines rohen ";"-getrennten Strings - siehe
   tc_abteilungen_badges_html() in includes/main.php. Bewusst nicht
   klickbar (kein Filter, reine Anzeige), daher kein Chip-Cursor/-Hover.
   .tc-abteilung-badges ist ein einzelnes flex-wrap-Element, damit mehrere
   Badges innerhalb von .tc-detail-field (flex-direction:column) in EINER
   Zeile nebeneinander umbrechen statt je Badge eine eigene Zeile zu
   belegen. */
.tc-abteilung-badges {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
}
.tc-abteilung-badge {
	display: inline-flex;
	align-items: center;
	font-size: 0.8rem;
	font-weight: 600;
	color: var(--color-text);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	padding: 3px 9px;
	border-radius: 999px;
}
.tc-detail-field-value--leer {
	color: var(--color-text-muted);
	font-style: italic;
}
/* Abteilungsauswahl im Benutzerformular (Auftrag "Benutzerverwaltung und
   Abteilungsauswahl verbessert"): links Checkboxliste der vorhandenen
   Abteilungen, rechts das Freitextfeld fuer eine neue Abteilung - nutzt
   den ohnehin freien Platz neben der (meist nicht sehr hohen)
   Checkboxliste statt darunter einen eigenen Block anzuhaengen. Bricht
   auf schmalen Bildschirmen automatisch untereinander um. */
.tc-abteilungsauswahl {
	display: flex;
	gap: 16px;
	flex-wrap: wrap;
	align-items: flex-start;
}
.tc-abteilungsauswahl-vorhanden {
	flex: 1 1 260px;
	min-width: 220px;
}
.tc-abteilungsauswahl-neu {
	flex: 1 1 200px;
	min-width: 200px;
}
.tc-history-chip--active .tc-history-chip-count {
	color: #FFFFFF;
	background-color: rgba(255, 255, 255, .25);
}
.tc-history-scroll {
	overflow-x: auto;
}
.tc-history-table {
	width: 100%;
	border-collapse: collapse;
}
.tc-history-head {
	padding: 6px 10px;
	font-size: 0.8rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
	text-align: left;
	color: var(--color-text-muted);
	border-bottom: 2px solid var(--color-border-strong);
	white-space: nowrap;
}
/* Zeilen deutlich kompakter (Auftrag Punkt 7: "sehr viel vertikale Flaeche")
   - Padding reduziert, dezenter Zeilen-Hover ueber die komplette Zeile
   (Auftrag Punkt 18), Statusnotiz/Zur-Kenntnis behalten ihre Grundfarbe
   dabei (eigene Regeln unten, hoehere Spezifitaet durch die zusaetzliche
   Gruppenklasse). */
.tc-history-row {
	transition: background-color .1s ease;
}
.tc-history-row:hover {
	background-color: var(--color-background);
}
.tc-history-cell {
	padding: 5px 10px;
	font-size: 0.85rem;
	color: var(--color-text);
	border-bottom: 1px solid var(--color-border);
	vertical-align: top;
}
.tc-history-cell--status {
	font-weight: 700;
	white-space: nowrap;
}
/* Nacharbeit (19.08.2026, "Reihenfolge/Zeitformat/IP-Symbol"): Zeitpunkt
   jetzt einzeilig ohne Sekunden (Auftrag Punkt 4) - Spalte dafuer schmal,
   aber ausreichend breit gehalten; Benutzerspalte durch das Entfernen der
   permanent sichtbaren IP-Adresse (Auftrag Punkt 5) inhaltlich schmaler,
   der dadurch gewonnene Platz kommt automatisch (kein table-layout:fixed,
   keine feste Breite auf Status/Benutzer) der Bemerkungen-Spalte zugute
   (Auftrag Punkt 7). */
.tc-history-head--zeit,
.tc-history-cell--zeit {
	white-space: nowrap;
	width: 150px;
}
.tc-history-head--benutzer {
	white-space: nowrap;
}
/* Korrektur (Verfeinerung "Aufgaben-Seite gezielt weiterentwickeln", Punkt
   7): "nowrap" liess einen langen Benutzernamen + das danebenstehende
   Zaehler-/IP-Badge in der (bei Aufgaben nicht letzten, sondern von der
   Aktionsspalte gefolgten) Benutzerspalte optisch in die Nachbarspalte
   hineinlaufen - bei table-layout:fixed wird ueberlaufender Inhalt einer
   Zelle nicht automatisch abgeschnitten, sondern bleibt sichtbar ausserhalb
   ihrer Breite stehen. "normal" laesst den Namen bei Bedarf sauber
   umbrechen, bleibt dadurch garantiert innerhalb der eigenen Spalte -
   betrifft Protokoll (letzte Spalte, dort bisher nur unauffaellig ueber den
   Tabellenrand hinaus) und Aufgaben gleichermassen, jeweils eine reine
   Verbesserung ohne Regressionsrisiko. */
.tc-history-cell--benutzer {
	white-space: normal;
	overflow-wrap: anywhere;
}
.tc-log-benutzer-name {
	display: inline-block;
	/* Nutzerauftrag (21.09.2026, "einheitliche Höhen/vertikale Ausrichtung"):
	   ohne vertical-align landet der Name auf der Standard-Basislinie und
	   wirkt gegenüber Avatar (vertical-align:middle, .tc-avatar) und
	   IP-Info-Symbol (vertical-align:-3px, .tc-history-ip-info) leicht
	   versetzt - "middle" wie der Avatar sorgt fuer eine einheitliche Zeile. */
	vertical-align: middle;
}
/* IP-Adresse jetzt nur noch ueber ein dezentes Info-Symbol erreichbar
   (Auftrag Punkt 6) - wiederverwendet die bestehende .tc-tip-Komponente
   (Hover/Tastaturfokus) statt einer neuen Tooltip-Loesung; ein <button>
   ist nativ per Klick/Tap fokussierbar, deckt damit auch "oder Klick" ab,
   ohne zusaetzliches JavaScript. Bewusst klein und farblich zurueckhaltend,
   damit die Benutzerspalte nicht dominiert wird. */
.tc-history-ip-info {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 18px;
	height: 18px;
	margin-left: 3px;
	padding: 0;
	vertical-align: -3px;
	background-color: transparent;
	border: none;
	color: var(--color-text-muted);
	cursor: pointer;
}
.tc-history-ip-info:hover,
.tc-history-ip-info:focus-visible {
	color: var(--color-text);
}
/* Wichtige Eintraege dezent hervorheben (Auftrag Punkt 9) - bewusst sehr
   helle Toenungen statt kraeftiger Farben, kleine Markerpunkte statt
   grosser Badges. Eigene, spezifische Klassen (.tc-history-row--*), keine
   Aenderung an generischen Tabellen-/Zeilen-Klassen. */
.tc-history-row--statusnotiz {
	background-color: color-mix(in srgb, var(--color-priority) 12%, var(--color-surface));
}
.tc-history-row--kenntnisnahme {
	background-color: var(--color-info-subtle);
}
.tc-history-marker {
	display: inline-flex;
	margin-right: 4px;
	vertical-align: -2px;
}
.tc-history-marker--notiz {
	color: var(--color-priority-text);
}
.tc-history-marker--kenntnis {
	color: var(--color-primary);
}
/* Bemerkungen (Auftrag Punkt 7/8): standardmaessig auf eine Zeile begrenzt
   (-webkit-line-clamp funktioniert dabei auch bei durch historische
   "<br>"-Marker erzeugten Zeilenumbruechen zuverlaessig, nicht nur bei
   umgebrochenem Fliesstext), Aufklapp-Pfeil nur vorhanden, wenn tatsaechlich
   mehr Inhalt existiert (siehe js/statushistorie.js). */
.tc-history-cell--bemerkung {
	display: flex;
	align-items: flex-start;
	gap: 6px;
}
.tc-history-bemerkung-text {
	flex: 1 1 auto;
	min-width: 0;
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 1;
	overflow: hidden;
	overflow-wrap: break-word;
}
.tc-history-bemerkung--offen .tc-history-bemerkung-text {
	-webkit-line-clamp: unset;
	overflow: visible;
}
.tc-history-expand {
	flex-shrink: 0;
	display: none;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	padding: 0;
	background-color: transparent;
	border: none;
	color: var(--color-text-muted);
	cursor: pointer;
}
.tc-history-expand--sichtbar {
	display: inline-flex;
}
.tc-history-expand:hover,
.tc-history-expand:focus-visible {
	color: var(--color-text);
}
.tc-history-expand:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-history-expand[aria-expanded="true"] .tc-icon {
	transform: rotate(90deg);
}
.tc-history-empty {
	padding: 16px 10px;
	font-size: 0.9rem;
	color: var(--color-text-muted);
	text-align: center;
}

/* ==========================================================================
   Protokollbereich modernisiert (25.08.2026, "Protokoll optisch an moderne
   Ticketlisten, funktional an die Ticket-Statushistorie anlehnen"). Die
   Tabelle selbst nutzt bewusst dieselbe Klasse table.ticket-list-view wie
   jede Ticketliste (Rahmen/Radius/Hover/Gruppenfarb-Rand an Spalte 1/
   Prioritaets-Rand an Spalte 2+letzte Spalte kommen dadurch unveraendert
   mit, siehe weiter oben) - nur die hier folgenden, wirklich NEUEN Elemente
   (Doppel-Bildfeld, Ticket-Zelle, Prioritaets-Hinweis in der Statusspalte)
   bekommen eigene, mit "tc-log-" praefixierte Klassen. Status-/Bemerkungs-/
   Zeitpunkt-/Benutzer-Zellen nutzen bewusst dieselben .tc-history-cell--*/
   .tc-history-marker/.tc-history-bemerkung*/.tc-history-expand/
   .tc-history-ip-info-Klassen wie die Ticket-Statushistorie (oben in dieser
   Datei) - keine zweite, abweichende Fassung dieser bereits vorhandenen
   Bausteine. */
.tc-log-bilder {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 3px;
	padding: 4px !important;
}
/* Bewusst FESTE Pixelgroesse statt height:100% (siehe Lektion bei
   .tc-list-art-image-wrap oben bzw. Facelift-Erfahrung "Prozenthoehe in
   Tabellenzelle mit auto-Hoehe kollabiert") - zwei kompakte Swatches
   (Ticketgruppe + Ticketart) statt eines einzigen zeilenfuellenden Bildes,
   deshalb hier die einfachere feste Groesse statt der aufwendigeren
   absolut-positionierten Technik. */
.tc-log-bild {
	flex-shrink: 0;
	width: 22px;
	height: 22px;
	border-radius: var(--radius-small);
	background-color: var(--color-background);
	background-size: cover;
	background-position: center;
	border: 1px solid var(--color-border);
}
.tc-log-status {
	white-space: normal;
}
.tc-log-prio {
	margin-left: 4px;
	color: var(--color-priority-text);
	cursor: default;
}
/* Ticket-Zelle (Auftrag Punkt "Ticket"): Betreff ist die wichtigste
   Information der Zeile (groesser/kraeftiger), Ticketnummer dezent
   darunter - dieselbe Betreff-Typografie wie table.ticket-list-view
   .tc-list-title, damit beide Listen gleich wirken. */
.tc-log-ticket-betreff {
	display: block;
	font-weight: 700;
	color: var(--color-text);
	overflow-wrap: break-word;
}
.tc-log-ticket-nummer {
	display: block;
	margin-top: 2px;
	font-size: 0.78rem;
	color: var(--color-text-muted);
}
/* Tabellen-Wrapper der Ergebnisliste - dieselbe horizontale
   Scroll-Absicherung wie .tc-list-scroll (Ticketlisten), eigener
   Klassenname nur, damit js/protokoll.js sie eindeutig per Selektor
   findet. */
.tc-log-scroll {
	overflow-x: auto;
}

/* Aufgaben-Seite modernisiert (Auftrag "Aufgaben-Seite auf Basis von
   Tickets/Protokoll ueberarbeiten"): zwei neue, bisher unbenoetigte
   Elemente ohne Entsprechung bei Tickets/Protokoll. Anfragezaehler neben
   dem zustaendigen Benutzer nutzt dasselbe .tc-tip-Muster wie
   .tc-history-ip-info (dezenter Zusatzhinweis, keine neue
   Tooltip-Loesung). Die "Erledigt"-Aktion ist ein Pillen-Button statt
   eines reinen Icons, da ihr Linktext aus der individuellen
   Aufgaben-Vorlage stammt (cms_ticket_aufgaben.antwort, siehe
   includes/aufgaben_list_row.php) und dadurch unterschiedlich lang sein
   kann. */
.tc-log-zaehler-badge {
	display: inline-flex;
	align-items: center;
	gap: 2px;
	margin-left: 4px;
	font-size: 0.78rem;
	color: var(--color-text-muted);
	cursor: default;
}
.tc-log-aktion {
	white-space: normal;
	position: relative;
}
.tc-log-aufgabengruppe {
	overflow-wrap: anywhere;
}
.tc-log-erledigt-btn {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 4px 10px;
	border: none;
	border-radius: 999px;
	background-color: var(--color-primary);
	color: #fff;
	font-family: inherit;
	font-size: 0.78rem;
	font-weight: 600;
	text-decoration: none;
	line-height: 1.3;
	cursor: pointer;
}
.tc-log-erledigt-btn:hover,
.tc-log-erledigt-btn:focus-visible {
	filter: brightness(0.92);
}
.tc-log-erledigt-btn .tc-icon {
	flex-shrink: 0;
}
/* Klar nach Status unterscheiden (Verfeinerung "Aufgaben-Seite gezielt
   weiterentwickeln", Punkt 8): eine bereits erledigte Aufgabe zeigt
   weiterhin ihr Ergebnis (derselbe Antworttext/dasselbe Haken-Icon), ist
   aber bewusst nicht mehr klickbar - gedaempfte statt Primaerfarbe, kein
   Hover-Effekt, kein Pointer-Cursor. Wird als <span> statt <button>/<a>
   gerendert (siehe includes/aufgaben_list_row.php), :hover/:focus-visible
   hier trotzdem vorsorglich neutralisiert. */
.tc-log-erledigt-btn--fertig {
	background-color: var(--color-background);
	color: var(--color-text-muted);
	cursor: default;
}
.tc-log-erledigt-btn--fertig:hover,
.tc-log-erledigt-btn--fertig:focus-visible {
	filter: none;
}
/* Nacharbeit (08.09.2026, "Filter um Bereich 'Aufgaben' erweitern" +
   Rueckmeldung "Button deaktivieren statt Seite verlinken"): fehlt einem
   Benutzer das passende Aufgabengruppen-Recht, ist der jeweilige
   Trigger-Button jetzt disabled statt weiterhin anklickbar (vorher fuehrte
   ein Klick zu einer serverseitigen 403-Antwort bzw. - beim Listenzeilen-
   Button, der bislang kein .tc-task-action-link war - direkt zu einer
   vollen Seitennavigation ins Leere). EIN gemeinsames Selektor-Set statt
   je Basisklasse (.ticket-edit-action/.ticket-delete-action/
   .tc-task-complete-action/.tc-log-erledigt-btn), da alle betroffenen
   Buttons die Klasse tc-task-confirm-trigger tragen. */
.tc-task-confirm-trigger:disabled {
	opacity: .4;
	cursor: not-allowed;
	filter: none;
}
.tc-task-confirm-trigger:disabled:hover,
.tc-task-confirm-trigger:disabled:focus-visible {
	filter: none;
}
/* Wertkonto (Auftrag "Wertkonto auf Basis von Tickets/Protokoll/Aufgaben
   ueberarbeiten", Punkt 11): Wert-Text zusaetzlich zur Zeilentoenung
   (--tc-color, siehe .tc-log-row weiter oben) kraeftiger eingefaerbt -
   gleiche Tokens/Technik wie das bereits bestehende
   .tc-detail-value--gutgeschrieben/--entwertet auf der Ticketdetailseite,
   keine neue Farbfamilie. Ersetzt die bisherigen Inline-bgcolor-Attribute
   ("#FFCC00"/"#E9E9E9") vollstaendig. */
.tc-konto-wert--positiv {
	color: var(--color-success-dark);
	font-weight: 700;
}
.tc-konto-wert--negativ {
	color: var(--color-danger-dark);
	font-weight: 700;
}
/* Sicherheitsabfrage vor "Aufgabe erledigen" in der Liste (Punkt 9) -
   wiederverwendet .tc-task-confirm-widget/-popover (Aufgabenbereich der
   Ticketdetailseite) 1:1 inkl. js/aufgaben-confirm.js, hier zusaetzlich mit
   dieser Modifikatorklasse: der Ausloeser ist die variabel breite Bubble
   .tc-log-erledigt-btn statt eines festen 32px-Icon-Quadrats, das Popover
   haengt daher rechtsbuendig (nicht linksbuendig) am Ausloeser, damit es in
   der rechten Aktionsspalte nicht ueber den Tabellenrand hinausragt. */
.tc-task-confirm-widget.tc-task-confirm-widget--liste {
	display: inline-block;
	width: auto;
	height: auto;
	position: relative;
}
.tc-task-confirm-popover.tc-task-confirm-popover--liste {
	left: auto;
	right: 0;
	min-width: 220px;
}
/* Korrektur (Nutzerfeedback: "Ja/Nein-Abfrage erscheint hinter der Bubble
   der Zeile darunter"): das Popover ragt ueber die untere Kante seiner
   eigenen Tabellenzeile hinaus in den Bereich der naechsten Zeile. Weder
   die Zeile selbst noch .tc-task-confirm-widget--liste (bewusst ohne
   eigenes z-index) bilden einen eigenen Stapelkontext - das Popover-
   z-index (20) wirkt dadurch erst im naechsten Vorfahren, der tatsaechlich
   einen Stapelkontext bildet, und die normal fliessende naechste
   Tabellenzeile kann optisch darueber liegen. Fix: die Zeile mit dem
   gerade sichtbaren Popover bekommt selbst einen eigenen, hoeheren
   Stapelkontext, sobald ihr Popover sichtbar ist - :has() ist im Projekt
   bereits etabliert (siehe Button-Leisten-Erkennung im Ticketaktions-
   Bereich), keine JS-Aenderung noetig. */
.tc-log-row:has(.tc-task-confirm-popover--liste:not([hidden])) {
	position: relative;
	z-index: 5;
}

/* Aufklappbarer Filterbereich (Auftrag Punkt 8): natives <details>/<summary>
   statt eigener JavaScript-Aufklapplogik - funktioniert ohne JavaScript,
   Standardzustand (offen/geschlossen) wird serverseitig anhand aktiver
   Filter gesetzt (siehe protokoll/index.php). */
/* Kopfbereich ueberarbeitet (01.09.2026, Auftrag "Kopfbereiche Protokoll/
   Tickets/Ticket-Detail ueberarbeiten", Punkt 4/5): der Ausloeser
   "Erweiterter Filter" ist von <details>/<summary> auf einen
   eigenstaendigen Button umgestellt (siehe initErweiterterFilter() in
   js/protokoll-filter.js) und steht jetzt direkt neben den Filter-Chips
   (.tc-log-chips-und-filter) statt in einer eigenen Zeile - .tc-log-filter
   ist dadurch nicht mehr die gemeinsame Rahmenbox von Titel+Panel,
   sondern ausschliesslich noch das (bei Bedarf sichtbare) Panel selbst.
   [hidden] muss hier explizit deklariert werden, da ein normales <div>
   anders als <details> kein eingebautes Ein-/Ausblendverhalten hat. */
.tc-log-chips-und-filter {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	margin-bottom: 12px;
}
.tc-log-chips-und-filter .tc-history-chips {
	margin-bottom: 0;
}
/* Korrektur (Verfeinerung "Aufgaben-Seite gezielt weiterentwickeln", Punkt
   3): bei Tickets/Protokoll druecken die links stehenden Filter-Chips den
   "Erweiterter Filter"-Button ueber justify-content:space-between bereits
   automatisch nach rechts. Aufgaben hat in dieser Zeile keine Chips mehr
   (die Aufgabengruppen sind eigene Bubbles im Sticky-Kopf, siehe dort) -
   ohne zweites Flex-Kind haette der Button sonst links gestanden. Explizites
   margin-left:auto wirkt in beiden Faellen identisch (bei vorhandenen Chips
   verbraucht es denselben Rest-Abstand, den space-between ohnehin schon
   vergeben haette). */
.tc-log-filter-titel-gruppe {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	margin-left: auto;
}
.tc-log-filter {
	margin-bottom: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
	padding: 10px 14px;
}
.tc-log-filter[hidden] {
	display: none;
}
/* Drei klar unterscheidbare Zustaende (Auftrag Punkt 5) - ausschliesslich
   vorhandene Systemfarben, kein Warnrot: neutral (zu, keine aktiven
   Filter), dezent getoent (zu, aber Filter aktiv - color-mix() bereits an
   anderer Stelle in dieser Datei verwendete Technik), kraeftig (Panel
   geoeffnet, unabhaengig vom Filterzustand - dieselbe Optik wie
   .tc-history-view-btn--active). */
.tc-log-filter-titel {
	display: inline-flex;
	align-items: center;
	padding: 8px 14px;
	font-family: var(--font-system);
	font-size: 0.9rem;
	font-weight: 700;
	color: var(--color-text-muted);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	cursor: pointer;
	transition: background-color .12s ease, border-color .12s ease, color .12s ease;
}
.tc-log-filter-titel:hover {
	border-color: var(--color-border-strong);
	color: var(--color-text);
}
.tc-log-filter-titel--aktiv {
	background-color: color-mix(in srgb, var(--color-primary) 10%, var(--color-surface));
	border-color: color-mix(in srgb, var(--color-primary) 35%, var(--color-border));
	color: var(--color-primary-dark);
}
.tc-log-filter-titel--offen,
.tc-log-filter-titel--offen:hover {
	background-color: var(--color-primary);
	border-color: var(--color-primary);
	color: #FFF;
}
.tc-log-filter-titel--offen .tc-log-filter-badge {
	color: #FFF;
}
.tc-log-filter-form {
	display: flex;
	flex-direction: column;
	gap: 14px;
	padding: 6px 0 14px;
}
/* Vierte Feinschliff-Runde (25.08.2026, Auftrag Punkt 5/8/9): Hauptzeile
   jetzt als CSS-Grid statt flex-wrap, damit die Schnellzeitraum-Chips
   gezielt UNTER der Von-Spalte platziert werden können (grid-column,
   siehe weiter unten) - mit reinem Flexbox-Wrap wäre diese exakte
   Spaltenausrichtung vom jeweiligen Umbruchverhalten der Nachbarelemente
   abhängig und nicht zuverlässig garantierbar. 5 Spalten: Benutzer,
   Ticketgruppe/Ticketart, Von, Bis, Aktion ("Filter anwenden" - steht
   dadurch rechtsbündig auf derselben Zeile/Höhe wie die Datumsfelder,
   align-items:end richtet alle Felder an ihrer Unterkante aus). Auf
   schmaleren Breiten (siehe @media weiter unten) faellt das Grid auf
   normales Umbrechen zurueck - die exakte Von-Ausrichtung der Chips ist
   dort laut Auftrag ausdruecklich nicht erforderlich ("darf sinnvoll
   umbrechen"). */
.tc-log-filter-hauptzeile {
	display: grid;
	grid-template-columns: minmax(170px, 1.1fr) minmax(210px, 1.5fr) minmax(140px, 0.8fr) minmax(140px, 0.8fr) auto;
	column-gap: 14px;
	row-gap: 10px;
	align-items: end;
}
.tc-log-filter-zeile {
	display: flex;
	flex-direction: column;
	gap: 4px;
	min-width: 0;
}
.tc-log-filter-aktionen {
	display: flex;
	align-items: center;
	gap: 12px;
}
/* Schnellzeiträume beginnen bündig unter der Von-Spalte (Auftrag Punkt 5) -
   dieselbe Spalte, in der auch das Von-Datumsfeld steht (3. Grid-Spalte),
   über die Bis-Spalte hinweg (Auftrag Punkt 9: zweizeilige Struktur,
   Chips folgen sauber horizontal daneben). */
.tc-log-filter-hauptzeile > .tc-log-schnellzeitraum {
	grid-column: 3 / span 2;
	margin: 0;
}
/* Neue zentrale Seite "Tickets", Feinschliff (31.08.2026, Auftrag "Zentrale
   Ticketseite um Schnellfilter, Ansichtsumschalter und erweiterte Filter
   ergaenzen", Punkt 3-5/12): zweite, eigene Filterzeile fuer Termine/Offene
   Aufgaben/Ticketwert - bewusst NICHT in das bestehende 5-spaltige Grid der
   Hauptzeile gequetscht (dort feste Spaltenbreiten fuer Benutzer/
   Ticketgruppe-Ticketart/Von/Bis/Aktionen), sondern eine eigene, gleichmaessig
   verteilte Zeile mit dezenter Trennlinie darueber. flex:1 1 180px verteilt
   die drei Felder gleichmaessig und erlaubt bei wenig Platz sauberes
   Umbrechen statt Zusammenquetschen. */
.tc-log-filter-zweite-zeile {
	display: flex;
	flex-wrap: wrap;
	gap: 14px;
	margin-top: 14px;
	padding-top: 14px;
	border-top: 1px solid var(--color-border);
}
.tc-log-filter-zweite-zeile > .tc-log-filter-zeile {
	flex: 1 1 180px;
	min-width: 160px;
}
@media (max-width: 900px) {
	.tc-log-filter-hauptzeile {
		display: flex;
		flex-wrap: wrap;
	}
	.tc-log-filter-hauptzeile > .tc-log-filter-zeile {
		min-width: 160px;
	}
	.tc-log-filter-hauptzeile > .tc-log-filter-zeile--datumsfeld {
		min-width: 140px;
	}
	.tc-log-filter-hauptzeile > .tc-log-filter-aktionen {
		margin-left: auto;
	}
	.tc-log-filter-hauptzeile > .tc-log-schnellzeitraum {
		width: 100%;
	}
}

/* Filterüberarbeitung (25.08.2026, "Filterstruktur vereinfachen"): "aktiv"-
   Kennzeichnung neben dem <summary>-Titel (Auftrag Punkt 3) - reine
   CSS-Tooltip-Wiederverwendung (.tc-tip, bereits an vielen Stellen im
   Projekt genutzt), keine neue Tooltip-Technik. --tc-tip-breit ergaenzt
   die vorhandene .tc-tip::after-Regel um eine groessere max-width, da der
   Inhalt hier mehrzeilig/strukturiert ist statt eines kurzen Hinweistexts. */
.tc-log-filter-badge {
	margin-left: 8px;
	font-size: 0.78rem;
	font-weight: 700;
	color: var(--color-primary);
}
.tc-log-filter-info {
	margin-left: 4px;
	vertical-align: -2px;
	color: var(--color-text-muted);
}
.tc-log-filter-info.tc-tip::after {
	max-width: 320px;
}

/* Obere Steuerzeile (Auftrag Punkt 12/17/25 der ersten Runde). Vierte
   Feinschliff-Runde (Auftrag Punkt 1-2): bewusst wieder ZWEI Unterblöcke
   (links = fachliche Schnellfilter, rechts = technische Listensteuerung),
   nachdem die vorherige Runde ALLE Elemente in einer einzigen, flachen
   Zeile gleichrangig behandelt hatte - dort fehlte die hier ausdrücklich
   gewünschte klare optische Lücke zwischen beiden Funktionsbereichen.
   .tc-log-toolbar-rechts wandert als GANZES per margin-left:auto an den
   rechten Rand, "Filter zurücksetzen" bildet als letztes Kind darin den
   rechten Abschluss. Bei zu wenig Platz darf die rechte Gruppe gemäß
   Auftrag sinnvoll umbrechen (kein erzwungenes Einzeiligkeits-Korsett mehr
   wie in der Vorrunde). */
.tc-log-toolbar-row {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
}
.tc-log-toolbar-rechts {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin-left: auto;
}
/* "Nur meine Eintraege" ist bewusst KEIN vierter, sich gegenseitig
   ausschliessender Reiter (anders als Fokus/Aktionen/Alles), sondern ein
   unabhaengiger Ein/Aus-Schalter, der mit jedem der drei kombinierbar
   bleibt (Auftrag Punkt 6) - deshalb optisch abgesetzt statt Teil der
   .tc-history-view-toggle-Gruppe.
   Nacharbeit (Feinschliff-Runde, Auftrag Punkt 5: "denselben klaren
   Aktivzustand wie bei den anderen Hauptfiltern verwenden"): der aktive
   Zustand nutzt jetzt bewusst dieselbe var(--color-primary)-Flaeche wie
   .tc-history-view-btn--active (blauer Hintergrund + weisser Text) - eine
   fruehere Fassung hatte hier absichtlich einen abweichenden, dezenteren
   Aktivzustand, um Verwechslung mit einem vierten Ansicht-Reiter zu
   vermeiden; das wurde durch den Auftrag ausdruecklich revidiert. Die
   strukturelle Trennung (eigener, abgesetzter Button statt Teil der
   Dreier-Gruppe) bleibt bestehen, nur die Aktiv-FARBE ist jetzt identisch. */
.tc-log-meine-btn {
	display: inline-flex;
	align-items: center;
	font-size: 0.85rem;
	font-weight: 700;
	color: var(--color-text-muted);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	padding: 7px 14px;
	border-radius: var(--radius-medium);
	cursor: pointer;
}
.tc-log-meine-btn:hover {
	color: var(--color-text);
	border-color: var(--color-border-strong);
}
.tc-log-meine-btn--active {
	color: #FFFFFF;
	background-color: var(--color-primary);
	border-color: var(--color-primary);
	font-weight: 700;
}
.tc-log-meine-btn--active:hover {
	color: #FFFFFF;
}
.tc-log-toolbar-select {
	font-family: var(--font-system);
	font-size: 0.85rem;
	padding: 7px 10px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	background-color: var(--color-surface);
	color: var(--color-text);
}
/* Kompakte Steuerbereich-Felder (Auftrag Punkt 8/9/12 der Feinschliff-
   Runde): "Einträge:"/"Sortieren nach:" als kurze Inline-Beschriftung +
   ein <select>, dessen Breite sich (kein width:100% mehr wie
   .tc-modal-select im erweiterten Filter) am tatsaechlichen Inhalt
   orientiert - width:auto reicht dafuer nicht zuverlaessig aus (haengt
   vom jeweiligen Browser-UA-Stylesheet ab), deshalb eine bewusst kurze,
   aber ausreichende max-width. */
.tc-log-compact-feld {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 0.85rem;
	color: var(--color-text-muted);
}
.tc-log-compact-label {
	white-space: nowrap;
}
/* Kompakte Trefferzahl (01.09.2026, Auftrag "Kopfbereiche Protokoll/
   Tickets/Ticket-Detail ueberarbeiten", Punkt 1/10): ersetzt die frueher
   eigene Zeile "Anzahl der gefundenen Eintraege/Tickets: ..." - rein
   informativer Text, deshalb bewusst ohne Rahmen/Hintergrund, gleiche
   Optik wie die uebrige kompakte Steuerzeilen-Beschriftung daneben. */
.tc-log-treffer-kompakt {
	font-size: 0.85rem;
	color: var(--color-text-muted);
	white-space: nowrap;
}
.tc-log-toolbar-select--kompakt {
	width: auto;
	max-width: 130px;
}
/* Sortierrichtung als eigener, sehr kompakter Umschalter (Auftrag Punkt
   10) - derselbe Link-Mechanismus wie die Spaltenkopf-Sortierung
   (tc_protokoll_sort_url() in protokoll/index.php), hier nur als kurzer
   Pfeil statt Textlink dargestellt. */
.tc-log-sort-richtung-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	font-size: 1rem;
	font-weight: 700;
	color: var(--color-text);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
}
.tc-log-sort-richtung-btn:hover {
	border-color: var(--color-primary);
	color: var(--color-primary);
}
/* Dauerhaft im oberen Steuerbereich erreichbares "Filter zuruecksetzen"
   (Auftrag Punkt 6 der ersten Runde) - bewusst dezenter als Suche/
   Hauptfilter (kein Rahmen/keine Flaeche), damit es die sehr haeufig
   genutzten Aktionen daneben nicht dominiert. Dritte Feinschliff-Runde
   (Auftrag Punkt 2): Symbol + Text als zwei eigene <span>-Elemente, damit
   bei wenig Platz (siehe @media weiter unten) nur der Text ausgeblendet
   werden kann - das Symbol allein bleibt zusammen mit dem title-Attribut
   (native Tooltip-Beschriftung) immer erreichbar. */
.tc-log-reset-link {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 0.82rem;
	color: var(--color-text-muted);
	white-space: nowrap;
}
.tc-log-reset-link:hover {
	color: var(--color-text);
}
/* Kopfbereich ueberarbeitet (01.09.2026, Auftrag "Kopfbereiche Protokoll/
   Tickets/Ticket-Detail ueberarbeiten", Punkt 2/3/11/12): Titelzeile
   traegt jetzt zusaetzlich Suche + "Filter zuruecksetzen" (bei Tickets
   ausserdem die Karten-/Listenumschaltung, siehe .tc-tickets-headline-row
   weiter unten, die dasselbe Rezept nutzt). Titelgruppe (Ueberschrift +
   Suche) waechst links, "Filter zuruecksetzen" wird per margin-left:auto
   an den rechten Rand gedrueckt - dasselbe Idiom wie
   .tc-log-toolbar-rechts. */
/* Korrektur (01.09.2026, Nachtrag "Sticky-Verhalten im angepinnten Zustand
   korrigieren"): Titelzeile und Hauptfilterzeile (Fokus/Aktionen/Alles
   bzw. Verfuegbar/In Arbeit/... + Nur-meine-.../Termine-heute/
   Beobachtung) bilden gemeinsam GENAU EINEN Sticky-Block, wenn angepinnt
   - beide Zeilen zusammen, nicht der uebrige Filterbereich darunter. Im
   Ruhezustand ist dieser Wrapper ein ganz normaler Block ohne eigene
   Optik. */
.tc-listenkopf-sticky-block.tc-listenkopf--angepinnt {
	position: sticky;
	top: var(--tc-kopf-hoehe, 0px);
	z-index: 14;
	background-color: var(--color-surface);
	padding-top: 8px;
	padding-bottom: 10px;
	box-shadow: 0 4px 10px rgba(20, 20, 30, 0.08);
}
.tc-listenkopf-titelzeile {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
	margin-bottom: 10px;
}
/* Hauptfilterzeile (Fokus/Aktionen/Alles bzw. Verfuegbar/In Arbeit/...) -
   bis 01.09.2026 Teil der Steuerzeile weiter unten (.tc-log-toolbar-links),
   jetzt Teil der Titelzeile/des Sticky-Blocks (siehe Kommentar oben).
   Gleiche Optik wie zuvor. */
.tc-listenkopf-hauptfilterzeile {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
}
/* Aufgabengruppen-Bubbles als dritte Zeile des Sticky-Kopfs (Verfeinerung
   "Aufgaben-Seite gezielt weiterentwickeln", Punkt 1/2/13) - liegt als
   weiteres Kind INNERHALB .tc-listenkopf-sticky-block, wird beim Anpinnen
   dadurch automatisch mit sticky (keine JS-Anpassung noetig). Wiederverwendet
   .tc-history-chips fuer die Bubbles selbst (bereits flex-wrap:wrap, damit
   bei vielen Gruppen ohne weiteres Zutun mehrzeilig statt abgeschnitten -
   Punkt 13). Eigener kleiner Abstand zur Zeile darueber, da
   .tc-listenkopf-hauptfilterzeile (anders als bei Tickets/Protokoll, wo sie
   die letzte Zeile ist) hier keinen eigenen unteren Rand hat. */
.tc-listenkopf-gruppenzeile {
	margin-top: 10px;
}
.tc-listenkopf-gruppenzeile .tc-history-chips {
	margin-bottom: 0;
}
.tc-listenkopf-titelgruppe {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
}
/* Korrektur (Verfeinerung "Aufgaben-Seite gezielt weiterentwickeln", Punkt
   12): die Titelzeile (Tickets/Protokoll/Aufgaben teilen sich diese eine
   Klasse) steht seit der Kopfbereich-Ueberarbeitung nicht mehr in der alten
   "UeberschriftSeite"-Zelle (20px/fett), sondern im normalen Inhaltsbereich
   ("TextNormal", 15px/normal) - der Seitentitel wirkte dadurch optisch
   nicht mehr wie eine Hauptueberschrift. Eigene, vom umgebenden Container
   unabhaengige Schriftgroesse/-staerke fuer alle drei Bereiche gleichzeitig. */
.tc-listenkopf-titel {
	display: inline-block;
	font-size: 1.4rem;
	font-weight: 700;
	color: var(--color-text);
	white-space: nowrap;
}
.tc-listenkopf-suche-form {
	display: inline-flex;
}
.tc-listenkopf-suche-form .tc-history-search-wrap {
	flex: 0 1 220px;
	max-width: 220px;
}
.tc-listenkopf-reset {
	margin-left: auto;
}
/* Kopfbereich ueberarbeitet (01.09.2026, Auftrag "Kopfbereiche Protokoll/
   Tickets/Ticket-Detail ueberarbeiten", Punkt 22): Titelzeilen-Suchfeld
   darf bei wenig Platz schmaler werden statt die Zeile zu sprengen -
   dieselbe Zwischenstufe/Endstufe wie das analoge Suchfeld im globalen
   Header (siehe .app-header-suche-feld). Titelzeile/Steuerzeile/Chips-
   Zeile tragen bereits flex-wrap:wrap (siehe Basisregeln oben) - bei
   echtem Platzmangel brechen alle betroffenen Zeilen dadurch bereits
   sinnvoll um, ohne dass hier zusaetzliche Umbruchregeln noetig waeren. */
@media (max-width: 1100px) {
	.tc-listenkopf-suche-form .tc-history-search-wrap {
		flex-basis: 160px;
		max-width: 160px;
	}
}
@media (max-width: 640px) {
	.tc-listenkopf-suche-form .tc-history-search-wrap {
		flex-basis: 120px;
		max-width: 120px;
	}
}
/* Anpinnen-Funktion (01.09.2026, Auftrag "Kopfbereiche Protokoll/Tickets/
   Ticket-Detail ueberarbeiten", Punkt 6-8/14/15): Buerklammer-Button
   (Logik in js/tc-listenkopf-pin.js, gemeinsam fuer Protokoll und
   Tickets). Neutral im geloesten, kraeftig eingefaerbt im angepinnten
   Zustand (ueber [aria-pressed="true"], keine zweite Icon-Variante
   noetig - dasselbe Buerklammer-Symbol wirkt durch die Kontrastfarbe
   bereits eindeutig "aktiv"). */
.tc-listenkopf-pin {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	padding: 0;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	color: var(--color-text-muted);
	cursor: pointer;
	transition: background-color .12s ease, border-color .12s ease, color .12s ease;
}
.tc-listenkopf-pin:hover {
	border-color: var(--color-border-strong);
	color: var(--color-text);
}
.tc-listenkopf-pin[aria-pressed="true"] {
	background-color: var(--color-primary);
	border-color: var(--color-primary);
	color: #FFF;
}
.tc-listenkopf-pin .tc-icon {
	width: 16px;
	height: 16px;
}
@media (max-width: 700px) {
	.tc-log-reset-link-text {
		display: none;
	}
}
/* Schnellzeitraum-Chips (Auftrag Punkt 3) - bewusst dieselbe
   .tc-history-chip-Komponente wie die Ereigniskategorien (keine zweite
   Chip-Optik), nur in einer eigenen Zeile innerhalb des Zeitraum-Blocks
   im erweiterten Filter. */
.tc-log-schnellzeitraum {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin: 4px 0 8px;
}

/* Sortierbare Spaltenkoepfe (Auftrag Punkt 15/16): ganze Kopfzelle ist ein
   Link (groessere Trefferflaeche als nur der Pfeil), das 'sortieren'-Icon
   (includes/main.php) zeigt per Modifikatorklasse die aktive Richtung -
   dieselbe .tc-icon-Basis wie ueberall im Projekt, keine zweite
   Pfeil-Technik. */
.tc-log-sort-link {
	display: inline-flex;
	align-items: center;
	gap: 3px;
	color: inherit;
}
.tc-log-sort-link:hover {
	color: var(--color-primary);
}
.tc-log-sort-link .tc-icon-sortieren path {
	opacity: .35;
}
.tc-log-sort-link--asc .tc-icon-sortieren path:last-child,
.tc-log-sort-link--desc .tc-icon-sortieren path:first-child {
	opacity: .35;
}
.tc-log-sort-link--asc .tc-icon-sortieren path:first-child,
.tc-log-sort-link--desc .tc-icon-sortieren path:last-child {
	opacity: 1;
	stroke-width: 2.4;
}
.tc-log-sort-link--asc,
.tc-log-sort-link--desc {
	color: var(--color-primary);
}

/* Multi-Select-Popover (Benutzer, Auftrag Punkt 7) - Popover-Grundmuster
   wie js/ticket-toolbar-popover.js (Trigger + absolut positioniertes
   Panel, siehe js/protokoll-filter.js fuer die hier eigenstaendige,
   analoge Umsetzung), keine zweite Popover-Technik. */
.tc-filter-multiselect,
.tc-filter-tree {
	position: relative;
	min-width: 200px;
}
.tc-filter-multiselect-trigger {
	width: 100%;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 6px;
	text-align: left;
	cursor: pointer;
}
.tc-filter-multiselect-trigger .tc-icon {
	flex-shrink: 0;
	color: var(--color-text-muted);
}
.tc-filter-multiselect-summary {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-filter-multiselect-popover {
	position: absolute;
	top: calc(100% + 4px);
	left: 0;
	z-index: 20;
	width: max-content;
	min-width: 100%;
	max-width: 340px;
	max-height: 280px;
	overflow-y: auto;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
	padding: 8px;
}
.tc-filter-multiselect-suche {
	width: 100%;
	box-sizing: border-box;
	margin-bottom: 6px;
	position: sticky;
	top: 0;
}
.tc-filter-multiselect-item {
	display: flex;
	align-items: center;
	gap: 7px;
	padding: 4px 4px;
	font-size: 0.85rem;
	color: var(--color-text);
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-filter-multiselect-item:hover {
	background-color: var(--color-background);
}
/* Dritte Feinschliff-Runde (25.08.2026, Auftrag Punkt 6): eigentlicher
   Grund, warum die Benutzer-/Gruppen-/Artensuche trotz korrekt gesetztem
   [hidden]-Attribut (js/protokoll-filter.js) visuell NIE etwas ausblendete
   - "display: flex" oben hat exakt dieselbe CSS-Spezifitaet wie die
   UA-Regel "[hidden] { display: none }", und bei gleicher Spezifitaet
   gewinnt die Autoren- immer vor der User-Agent-Regel, unabhaengig von der
   Reihenfolge im eigenen Stylesheet. Das [hidden]-Attribut wurde dadurch
   bisher schlicht ignoriert. Eigene [hidden]-Regel mit hoeherer
   Spezifitaet (Klasse + Attribut) behebt das zuverlaessig - betrifft
   ebenso .tc-filter-tree-art-label weiter unten. */
.tc-filter-multiselect-item[hidden] {
	display: none;
}
.tc-filter-multiselect-empty {
	padding: 8px 4px;
	font-size: 0.82rem;
	color: var(--color-text-muted);
}

/* Hierarchischer Gruppen-/Artenfilter (Auftrag Punkt 8/9) - eigene Klassen
   fuer die Baumstruktur, teilt sich aber Trigger/Popover-Grundgeruest mit
   dem Benutzer-Multi-Select oben. */
.tc-filter-tree-gruppe {
	border-bottom: 1px solid var(--color-border);
	padding: 4px 0;
}
.tc-filter-tree-gruppe:last-child {
	border-bottom: none;
}
/* Dieselbe [hidden]-vs-Autorenregel-Spezifitaetsfalle wie bei
   .tc-filter-multiselect-item oben - hier zwar kein eigenes "display" auf
   .tc-filter-tree-gruppe gesetzt, aber zur Sicherheit ebenfalls explizit
   abgesichert, falls hier je eine display-Regel ergaenzt wird. */
.tc-filter-tree-gruppe[hidden] {
	display: none;
}
.tc-filter-tree-gruppe-label {
	display: flex;
	align-items: center;
	gap: 7px;
	padding: 3px 4px;
	font-size: 0.85rem;
	font-weight: 700;
	color: var(--color-text);
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-filter-tree-gruppe-label:hover {
	background-color: var(--color-background);
}
.tc-filter-tree-gruppe-label em {
	font-weight: 400;
	font-style: normal;
	font-size: 0.75rem;
	color: var(--color-text-muted);
}
.tc-filter-tree-arten {
	margin-left: 22px;
}
.tc-filter-tree-art-label {
	display: flex;
	align-items: center;
	gap: 7px;
	padding: 3px 4px;
	font-size: 0.83rem;
	color: var(--color-text);
	border-radius: var(--radius-small);
	cursor: pointer;
}
.tc-filter-tree-art-label:hover {
	background-color: var(--color-background);
}
.tc-filter-tree-art-label:has(input:disabled) {
	color: var(--color-text-muted);
	cursor: default;
}
/* Siehe Erklaerung bei .tc-filter-multiselect-item[hidden] weiter oben -
   dieselbe Spezifitaetsfalle betraf auch die einzelnen Artenzeilen und war
   die eigentliche Ursache, warum ein Artentreffer bisher trotzdem alle
   Geschwisterarten weiter anzeigte. */
.tc-filter-tree-art-label[hidden] {
	display: none;
}

.tc-main {
	grid-area: main;
	min-width: 0;
}
.tc-title {
	font-size: 15px;
	line-height: 1.25;
	margin-bottom: 0;
}
.tc-title .UeberschriftSeite {
	font-size: 15px;
}
/* .tc-ticketnumber entfaellt (Nacharbeit 24.08.2026, "Kartenansicht auf
   dreispaltiges Informationslayout umbauen", Auftrag Punkt 3): die
   Ticketnummer ist aus der rechten Statusspalte in die neue mittlere
   Informationsspalte gewandert (siehe .tc-info-row/.tc-info-value weiter
   unten) - die Klasse wird dadurch nirgends mehr verwendet. */
/* Runde 2, Punkt 8-16 (12.08.2026): ersetzt .tc-info-grid/.tc-info-block -
   die bisherigen Ueberschriften "Nummer:"/"Kontaktdaten:"/"Name:"/"Adresse:"
   entfallen, Bedeutung wird stattdessen durch Icon + Position + .tc-sr-only
   vermittelt (Punkt 15). Standardmaessig sichtbar: Nummer, Telefon (jeweils
   falls vorhanden/berechtigt), Firma+Kontaktname. Adresse + uebrige
   Kontaktdetails (Fax/E-Mail/Bemerkungen) wandern in .tc-contact-details
   (Punkt 11/12, einklappbar) - reduziert die Standardhoehe der Karte deutlich. */
.tc-contact {
	margin-top: 4px;
	font-size: 13px;
}
.tc-contact-line {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px 12px;
	min-height: 19px;
}
.tc-contact-line-name {
	margin-top: 4px;
	flex-wrap: nowrap;
}
.tc-contact-item {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	min-width: 0;
	color: var(--color-text);
}
.tc-contact-item .tc-icon {
	color: var(--color-text-muted);
}
.tc-contact-item-name {
	flex: 1 1 auto;
	min-width: 0;
}
.tc-contact-item-name > span {
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

/* Punkt 12/13: Aufklapp-Button fuer sekundaere Kontaktdetails (Adresse usw.).
   Bewusst ein echtes <button>-Element (keine dekorative Textpfeil-Loesung) -
   dadurch automatisch von der Ganzflaechen-Klick-Navigation der Karte
   ausgenommen (js/ticket-click.js INTERACTIVE_SELECTOR enthaelt "button")
   UND nativ per Tastatur (Enter/Leertaste) bedienbar, ohne eigenen
   Tastatur-Code. */
.tc-contact-toggle {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	padding: 0;
	margin: 0 0 0 auto;
	background: none;
	border: none;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	cursor: pointer;
}
.tc-contact-toggle:hover,
.tc-contact-toggle:focus-visible {
	background-color: var(--color-border);
	color: var(--color-text);
	outline: none;
}
.tc-contact-toggle .tc-icon {
	transition: transform .15s ease;
}
.tc-contact-toggle[aria-expanded="true"] .tc-icon {
	transform: rotate(90deg);
}

/* Auftrag "Auffaellige, einheitliche Aufklapp- und Dropdown-Bedienelemente"
   (14.08.2026): gemeinsame, deutlich sichtbare Optik fuer alle Aufklapp-
   Bedienelemente (bisher hier nur 22px, randlos, kaum erkennbar - Punkt 3/4
   des Auftrags fordert mindestens ~32px Klickflaeche und einen erkennbaren
   Rahmen/Hintergrund). Ergaenzt die bestehende(n) Klasse(n) NUR um Optik -
   .tc-contact-toggle bleibt unveraendert im Markup stehen, weil
   js/ticket-click.js exakt danach sucht (event.target.closest('.tc-contact-toggle')).
   Normvariante fuer Karten (~36px), .ticket-expand-control--compact fuer die
   schmalere Listenspalte (~32px, Punkt 8). */
.ticket-expand-control {
	width: 36px;
	height: 36px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	color: var(--color-text);
}
.ticket-expand-control:hover,
.ticket-expand-control:focus-visible {
	background-color: var(--color-border);
	border-color: var(--color-text-muted);
	color: var(--color-text);
	box-shadow: var(--shadow-small);
	outline: none;
}
.ticket-expand-control:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.ticket-expand-control .tc-icon {
	width: 18px;
	height: 18px;
}
.ticket-expand-control--compact {
	width: 32px;
	height: 32px;
}

/* Runde 3, Punkt 9/12 (12.08.2026): Kontakthinweise (Bemerkungen) haben hohe
   operative Bedeutung und duerfen nie ausschliesslich im aufgeklappten
   Bereich stehen - diese Zeile erscheint deshalb bereits in der GESCHLOSSENEN
   Karte, sobald ein Hinweis vorhanden ist. Traegt zusaetzlich den Aufklapp-
   Button (falls ueberhaupt etwas zum Aufklappen da ist) - margin-left:auto
   auf .tc-contact-toggle sorgt dafuer, dass er auch ohne den Hinweis-Badge
   als einzelnes Element rechts ausgerichtet bleibt. */
.tc-contact-hint-row {
	justify-content: space-between;
}
.tc-contact-hint {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 2px 9px;
	background-color: var(--color-danger-subtle);
	color: var(--color-danger);
	border-radius: var(--radius-small);
	font-weight: 600;
	font-size: 12px;
}
.tc-contact-hint .tc-icon {
	color: var(--color-danger);
}

/* max-height statt hidden-Attribut, damit der Auf-/Zuklappvorgang dezent
   animiert werden kann (Vorgabe Punkt 12) - 520px ist ein grosszuegiger
   Deckel, der den realistischen Inhalt (Adresse/weitere Kontakte/E-Mail-
   Webseite/Kontakthinweise, auch einspaltig auf schmalen Karten) nicht
   abschneidet, ohne eine aufwendige Hoehenberechnung per JS zu benoetigen. */
.tc-contact-details {
	max-height: 0;
	overflow: hidden;
	transition: max-height .2s ease;
}
/* Runde 3, Punkt 11/15: mehrspaltige Gruppen (Adresse/Weitere Kontakte/
   E-Mail+Webseite/Kontakthinweise) statt einer einzelnen Liste - auto-fit
   sorgt dafuer, dass sich die Spaltenzahl automatisch nach verfuegbarer
   Breite UND tatsaechlich vorhandenen Gruppen richtet (keine leeren Spalten,
   da jede Gruppe ohnehin nur bei vorhandenem Inhalt gerendert wird). */
.tc-contact-details.tc-open {
	max-height: 520px;
	margin-top: 6px;
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
	gap: 10px 20px;
}
.tc-contact-group {
	min-width: 0;
	color: var(--color-text-muted);
	font-size: 12px;
}
.tc-contact-group-title {
	display: flex;
	align-items: center;
	gap: 5px;
	font-weight: 600;
	color: var(--color-text);
	margin-bottom: 3px;
}
.tc-contact-group a {
	word-break: break-all;
}
/* Kontakthinweise bleiben auch im aufgeklappten Zustand deutlich rot
   hervorgehoben (Vorgabe: Warnwirkung erhalten) - dieselbe Farblogik wie
   .tc-contact-hint oben, nur als vollflaechiger Block statt kompaktem Badge. */
.tc-contact-group-hint {
	background-color: var(--color-danger-subtle);
	border-left: 3px solid var(--color-danger);
	border-radius: var(--radius-small);
	padding: 6px 8px;
	color: var(--color-text);
}
.tc-contact-group-hint .tc-contact-group-title {
	color: var(--color-danger);
}

/* Phase D.4 (Beobachtungsliste): hervorgehobener Hinweisblock fuer "Ihre interne Notiz"/
   "Zur Kenntnis" - nutzt das bestehende Warnfarben-Token, damit der Hinweis auffaellt,
   aber Teil der Karte bleibt statt eines eigenstaendigen Widgets (Vorgabe D.2-Nacharbeit). */
.tc-notiz {
	margin-top: 6px;
	padding: 6px 10px;
	background-color: var(--color-warning-subtle);
	border-left: 3px solid var(--color-warning);
	border-radius: var(--radius-small);
}
.tc-notiz-label {
	display: block;
	font-weight: 600;
	color: var(--color-warning);
	margin-bottom: 2px;
}

/* ==========================================================================
   Mittlere Informationsspalte (Nacharbeit 24.08.2026, "Kartenansicht auf
   dreispaltiges Informationslayout umbauen"): fasst Termin (falls
   vorhanden, ganz oben/prominent - Auftrag Punkt 1/9), Erstellungsdatum/
   -zeit, Ticketalter und Ticketnummer zusammen - vorher verstreut auf die
   Kopf-Zwischenzeile (.tc-meta-time-row/-urgent) und die rechte Status-
   spalte (.tc-ticketnumber/.tc-side-row-termin). Bewusst KEINE eigene
   Hintergrundflaeche wie .tc-side (Auftrag Punkt 8: "keine drei schweren,
   isolierten Kaesten") - nur ein duenner linker Trennstrich als
   zurueckhaltende visuelle Grenze zur linken Spalte, die Karte bleibt
   dadurch optisch EIN zusammenhaengender Block. align-items:flex-start
   (statt zentriert) verankert den Inhalt am oberen Rand (Auftrag Punkt 9). */
.tc-info {
	grid-area: info;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 6px;
	padding: 6px 0 6px 14px;
	border-left: 1px solid var(--color-border);
	min-width: 0;
}
/* Persoenlicher Hinweis (Beobachtungsnotiz/Zur-Kenntnisnahme) des aktuell
   angemeldeten Benutzers (24.08.2026, "Interne Hinweise in allen
   Kartenansichten in die mittlere Spalte verschieben") - ganz oben in
   .tc-info, noch vor dem Termin (Auftrag Punkt: Reihenfolge Hinweis ->
   Termin -> Erstellt -> Alter -> Ticketnummer). Dieselbe Gelb/Amber-Familie
   wie .tc-detail-notes/.tc-note-row auf der Ticketdetailseite, hier
   kompakter fuer die schmalere Kartenspalte. align-self:stretch statt einer
   festen Breite, damit die Flaeche unabhaengig von der tatsaechlichen,
   durch das Grid bestimmten Spaltenbreite immer die volle Spalte einnimmt
   (.tc-info selbst richtet seine Kinder per align-items:flex-start NICHT
   automatisch auf volle Breite aus). Kein weisse-space:nowrap/keine
   max-height - laengere Notizen duerfen die Karte vergroessern (Auftrag
   Punkt 4), Text wird nie abgeschnitten. */
.tc-info-hinweis {
	align-self: stretch;
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	padding: 6px 8px;
	background-color: var(--color-warning-subtle);
	border-left: 3px solid var(--color-warning);
	border-radius: var(--radius-small);
	margin-bottom: 2px;
}
.tc-info-hinweis-row + .tc-info-hinweis-row {
	margin-top: 6px;
	padding-top: 6px;
	border-top: 1px solid color-mix(in srgb, var(--color-warning) 30%, transparent);
}
.tc-info-hinweis-meta {
	display: block;
	font-size: 11px;
	font-weight: 700;
	color: var(--color-warning-dark);
}
.tc-info-hinweis-text {
	display: block;
	font-size: 12px;
	color: var(--color-text);
	overflow-wrap: anywhere;
}
.tc-info-termin {
	/* Auftrag Punkt 1: "die prominenteste Information in dieser Spalte" -
	   nutzt dieselbe gemeinsame Termin-Komponente wie die Ticket-
	   Detailansicht (.tc-termin-when/-weekday/-datetime/-date/-time, siehe
	   weiter oben). Im Rendertest lief die dortige volle Schriftgroesse
	   (1.65rem Wochentag/1.15rem Datum+Uhrzeit) bei der ca. 180-220px
	   breiten Info-Spalte ueber den rechten Rand in die Statusspalte
	   hinein ("22.09.2026" wurde zu "22.09.2" abgeschnitten) - deshalb
	   hier maessig verkleinert (deutlich groesser/praesenter als das
	   fruehere winzige .tc-side-row-termin, aber schmal genug fuer die
	   Spaltenbreite).
	   Nacharbeit (24.08.2026, "Termingrund ergaenzen"): width:100% + min-
	   width:0 noetig geworden, seit .tc-termin-when durch den neuen dritten
	   Termingrund-Bereich (siehe .tc-termin-grund weiter oben) bei laengeren
	   Gruenden umbrechen soll (flex-wrap:wrap, siehe dort) - .tc-info selbst
	   setzt align-items:flex-start, ohne eigene Breitenvorgabe waechst ein
	   Flex-Kind sonst auf die von seinem INHALT bevorzugte (ungebrochene)
	   Breite, statt auf die tatsaechliche Spaltenbreite begrenzt zu werden;
	   das sprengte im Rendertest bei einem laengeren Grund die gesamte
	   Karte, statt wie gewuenscht umzubrechen. */
	width: 100%;
	min-width: 0;
	box-sizing: border-box;
	margin-bottom: 2px;
}
.tc-info-termin .tc-termin-weekday {
	font-size: 1.2rem;
	min-width: 2em;
	padding: 7px 10px;
}
.tc-info-termin .tc-termin-datetime {
	padding: 6px 10px;
}
.tc-info-termin .tc-termin-date,
.tc-info-termin .tc-termin-time {
	font-size: 0.95rem;
}
/* Termingrund in der schmaleren Kartenspalte (24.08.2026, "Termingrund in
   Karten-, Listen- und Detailansicht ergaenzen"/"...dynamisch skalieren",
   Auftrag Punkt 2/7): kleinere Mindestbreite/Schriftgroesse als in der
   Detailansicht, damit die ohnehin knappe .tc-info-Spalte nicht gesprengt
   wird - bei zu wenig Platz rutscht der Grund dank flex-wrap am
   Elternelement (.tc-termin-when, siehe weiter oben) automatisch in eine
   eigene Zeile unter Wochentag/Datum, statt die Karte in der Breite zu
   vergroessern. Dieselbe dynamische --l/--xl-Groessenstaffelung wie in der
   Detailansicht, hier proportional kompakter (Auftrag Punkt 7: "dieselbe
   Designsprache, darf aber kompakter sein"). */
.tc-info-termin .tc-termin-grund {
	flex: 1 1 70px;
	min-width: 50px;
	padding: 6px 10px;
	font-size: 0.78rem;
	line-height: 1.25;
}
.tc-info-termin .tc-termin-grund--l {
	/* Nachbesserung waehrend der Verifikation: ohne einen groesseren
	   min-width quetschte sich ein mittellanger, einzelner Begriff ohne
	   Leerzeichen (z. B. "Neuanschluss") im knappen Restplatz der
	   Kartenspalte in eine sehr schmale Box und brach dadurch haesslich
	   MITTEN im Wort um (z. B. "Neuansc"/"hluss"), statt als Ganzes
	   umzubrechen. Ein hoeherer min-width sorgt dafuer, dass der Browser
	   in diesem Fall stattdessen den GESAMTEN Termingrund-Bereich unter
	   Wochentag/Datum umbricht (flex-wrap:wrap am Elternelement, siehe
	   .tc-termin-when), wo genug Breite fuer eine saubere einzeilige
	   Darstellung vorhanden ist. */
	font-size: 0.88rem;
	min-width: 90px;
}
.tc-info-termin .tc-termin-grund--xl {
	font-size: 1.15rem;
}
.tc-info-row {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 12px;
	color: var(--color-text-muted);
}
.tc-info-row .tc-icon {
	color: var(--color-text-muted);
	flex-shrink: 0;
}
.tc-info-value {
	color: var(--color-text);
	font-weight: 600;
	overflow-wrap: anywhere;
}
/* Phase D.5: keine harte vertikale Linie mehr (wirkte wie eine Tabellenspalte,
   Nacharbeit Punkt 8) - statt der Trennlinie ein eigener, dezent getoenter
   Meta-Bereich mit Innenabstand, der klar zur Karte gehoert statt angehaengt zu
   wirken. Neutrale Hintergrundfarbe (kein Bezug zur Ticketfarbe), damit die
   Statusflaeche nicht mit der Ticketart-Identitaet verwechselt wird (Punkt 12).
   Nacharbeit (24.08.2026, "Kartenansicht auf dreispaltiges Informationslayout
   umbauen", Auftrag Punkt 5): enthaelt jetzt ausschliesslich noch Status/
   Besitzer/Wert - Ticketnummer und Termin sind in die neue .tc-info-Spalte
   gewandert (siehe oben).
   Nacharbeit (24.08.2026, "Wert-Spalte ergaenzen", direkt danach auf
   ausdruecklichen Nutzerwunsch wieder zurueckgebaut): der Ticketwert war
   kurzzeitig in eine eigene .tc-wert-Spalte ausgelagert - steht jetzt
   wieder wie urspruenglich hier, direkt unter dem Besitzer. Nur die
   Sichtbarkeitsbedingung (tc_wert_sichtbar() statt der vorherigen reinen
   wertanzeige-Pruefung, siehe includes/main.php) bleibt aus jener Runde
   erhalten - "Bereits gutgeschrieben"/"Ticket wurde entwertet"/
   "Dauer-Ticket" weiterhin immer sichtbar, der reine Geldbetrag nur bei
   wert > 0. */
.tc-side {
	grid-area: side;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	text-align: right;
	gap: 5px;
	padding: 6px 10px;
	background-color: var(--color-background);
	border-radius: var(--radius-small);
	/* Runde 4: von 130px auf 140px angehoben, damit die jetzt deutlich
	   groessere Statusanzeige (siehe .tc-status-badge) genug Raum hat. */
	min-width: 140px;
}
/* ==========================================================================
   Einheitliche Ticket-Statuskomponente (Facelift-Nacharbeit, 14.08.2026)
   --------------------------------------------------------------------------
   Ersetzt drei zuvor getrennt gepflegte Implementierungen (Kartenansicht:
   .tc-status-badge/.tc-status-sub; Listenansicht: .tc-list-status-text;
   Ticket-Detailseite: .tc-detail-status-box/-label/-sub) durch EINE
   gemeinsame Komponente ".ticket-status" mit drei Groessenvarianten
   (--compact/--standard/--large). Grundprinzip laut Auftrag: die GESAMTE
   Flaeche traegt die Statusfarbe (bestehendes style="background-color:..."
   bleibt inline auf dem Wurzelelement der Komponente, unveraendert aus der
   Geschaeftslogik uebernommen - hier wird nur Form/Groesse/Typografie
   zentral definiert, KEINE neue Farblogik). Bewusst KEIN Textumbruch-Verbot
   (kein white-space:nowrap) - bei sehr langen Statustexten darf die Hoehe
   wachsen, statt den Text abzuschneiden.
   ========================================================================== */
.ticket-status {
	display: inline-flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	font-family: var(--font-system);
	font-weight: 800;
	text-transform: uppercase;
	letter-spacing: .02em;
	text-align: center;
	color: var(--color-text);
	line-height: 1.25;
}
.ticket-status-label {
	display: block;
}
.ticket-status-sub {
	display: block;
	font-weight: 500;
	text-transform: none;
	letter-spacing: normal;
	opacity: .8;
}
/* Heller Text fuer kuenftige, dunkle Statusfarben - aktuell bewusst
   ungenutzt (alle bestehenden Statusfarben Gelb/Gruen/Blau sind hell genug
   fuer dunklen Text, siehe Auftrag Punkt 12), Klasse bleibt als vorbereitete
   Kontrast-Option erhalten (Nachfolger von .tc-status-badge-light). */
.ticket-status--light {
	color: #FFFFFF;
}

/* COMPACT (Listenansicht, includes/ticket_list_row.php): lebt INNERHALB von
   .tc-list-status-badge, das bereits die Pillenform/den Radius/die
   Eskaliert-Geparkt-Flag-Integration liefert (Runde 10) - hier daher bewusst
   KEIN eigener Radius/Schatten, nur Groesse/Innenabstand.
   Nacharbeit (24.08.2026, "Einheitliche Breite aller Statusanzeigen"): war
   bewusst als "passt sich der Statuslaenge an" eingefuehrt (siehe
   Git-Historie/Runde 10-Kommentar) - genau das sollte laut aktuellem
   Auftrag rueckgaengig gemacht werden ("Verfuegbar" und "Wieder
   geoeffnet" sollen gleich breit sein). flex:1 1 auto ersetzt durch eine
   feste Breite (box-sizing:border-box, damit Padding nicht zusaetzlich
   addiert wird) - 236px deckt "Wieder geoeffnet" (gemessene 229px) mit
   Puffer ab, laengere Statusbezeichnungen duerfen zweizeilig umbrechen
   statt die Breite zu sprengen. flex-shrink:0 verhindert, dass der
   umgebende Flex-Wrapper (.tc-list-status-badge) diese Breite bei
   vorhandenem Eskaliert-Flag (.tc-list-status-flag, eigener Bereich
   DANEBEN, siehe dort) wieder zusammenstaucht - der Flag-Bereich kommt
   dadurch immer ZUSAETZLICH zur festen Statusbreite hinzu, statt sie zu
   verkleinern. max-width:100% sorgt fuer sinnvolles Verhalten auf sehr
   schmalen Viewports (Auftrag Punkt 6). */
.ticket-status--compact {
	box-sizing: border-box;
	width: 236px;
	max-width: 100%;
	flex-shrink: 0;
	padding: 7px 10px;
}
.ticket-status--compact .ticket-status-label {
	font-size: 14px;
}

/* STANDARD (Kartenansicht, 12 Kartendateien): ist selbst die vollstaendige
   Pille - Werte unveraendert aus der bisherigen .tc-status-badge-Regel
   uebernommen (Runde 4), nur umbenannt. */
.ticket-status--standard {
	width: 128px;
	padding: 7px 10px;
	margin: 2px 0;
	border-radius: var(--radius-large);
	border: 1px solid rgba(0, 0, 0, .08);
	box-shadow: var(--shadow-small);
}
.ticket-status--standard .ticket-status-label {
	font-size: 15px;
}
.ticket-status--standard .ticket-status-sub {
	font-size: 10px;
}
/* Geparkt-bis-Datum deutlich groesser/praesenter (24.08.2026, "Darstellung
   geparkter Tickets optimieren", Auftrag Punkt 1/6): nur fuer den Geparkt-
   Status (.ticket-status-sub--geparkt, siehe show.php/Kartendateien), alle
   anderen Sub-Texte (z. B. "seit X Stunden" bei Verfuegbar) bleiben bei der
   bisherigen, kleineren Groesse. Listenansicht (.ticket-status--compact)
   bewusst ausgenommen (Auftrag Punkt 7 - dort unveraendert). */
.ticket-status--standard .ticket-status-sub--geparkt {
	font-size: 13px;
	font-weight: 700;
	opacity: 1;
}

/* LARGE (Ticket-Detailseite): deutlich praesenter (Auftrag Punkt 5).
   Nacharbeit (24.08.2026, "Einheitliche Breite aller Statusanzeigen"):
   die vorherige min-width liess jeden Statuswert individuell so breit
   werden, wie sein Text es brauchte ("Uebernommen" 220px, "Wieder
   geoeffnet" 251px, "Warte auf Abmeldung" 328px, alle einzeilig, aber
   sichtbar unterschiedlich breit) - das wirkte gerade NEBENEINANDER
   (Karten-/Listen-Ueberblick gibt es hier zwar nicht, aber Vorher/Nachher-
   Vergleich beim Statuswechsel) unruhig. Jetzt eine feste Breite (per
   box-sizing:border-box IMMER die volle sichtbare Breite, unabhaengig von
   Padding-Sonderfaellen wie der Chevron-Zone in .tc-status-trigger
   .ticket-status--large weiter unten) - 260px deckt "Wieder geoeffnet"
   (gemessene 251px) mit Puffer ab; deutlich laengere, admin-frei
   vergebene Statusbezeichnungen (z. B. "Warte auf Abmeldung") duerfen
   dafuer zweizeilig umbrechen (Auftrag Punkt 2: "Breite fest, Hoehe
   flexibel", kein Font-Downscaling). max-width:100% verhindert Overflow
   auf sehr schmalen Viewports (Auftrag Punkt 6). */
.ticket-status--large {
	/* Kopf-Optimierungsrunde (17.08.2026, Auftrag Punkt 1/7): moderat
	   kompakter (72px->64px Mindesthoehe, weniger Innenabstand) - Status
	   bleibt die groesste/wichtigste Flaeche im Kopf, nur nicht mehr
	   ueberdimensioniert.
	   Nacharbeit (20.08.2026, Auftrag Punkt 9): eigener Rahmen/Schatten
	   entfallen - beides sitzt jetzt gebuendelt auf .tc-status-row (siehe
	   dort), damit Statusflaeche und angedockte Symbolaktionen wie EIN
	   Element wirken statt wie zwei uebereinandergelegte Boxen. */
	box-sizing: border-box;
	width: 260px;
	max-width: 100%;
	min-height: 64px;
	gap: 3px;
	padding: 12px 20px;
	border-radius: var(--radius-large);
}
.ticket-status--large .ticket-status-label {
	font-size: 22px;
}
.ticket-status--large .ticket-status-sub {
	font-size: 13px;
}
/* Geparkt-bis-Datum deutlich groesser/praesenter (24.08.2026, "Darstellung
   geparkter Tickets optimieren", Auftrag Punkt 1/5): siehe ausfuehrliche
   Begruendung bei .ticket-status--standard .ticket-status-sub--geparkt
   weiter oben - hier dieselbe Modifikator-Klasse fuer die Ticket-
   Detailseite, entsprechend groesser skaliert. */
.ticket-status--large .ticket-status-sub--geparkt {
	font-size: 18px;
	font-weight: 700;
	opacity: 1;
}
.tc-side-value {
	font-size: 13px !important;
}
/* Runde 2, Punkt 6/7: "TICKET-BESITZER"/"TICKETWERT"-Ueberschriften entfallen -
   stattdessen kompakte Icon+Wert-Zeile. Der eigentliche Beschriftungstext
   bleibt fuer Screenreader ueber .tc-sr-only erhalten (siehe Punkt 15). */
.tc-side-row {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	margin-top: 2px;
}
.tc-side-row .tc-icon {
	color: var(--color-text-muted);
}
/* .tc-side-row-termin (Termine hervorheben, 18.08.2026) entfaellt (Nacharbeit
   24.08.2026, "Kartenansicht auf dreispaltiges Informationslayout umbauen",
   Auftrag Punkt 5): der Termin ist aus der rechten Statusspalte in die neue
   mittlere Informationsspalte gewandert (siehe .tc-info-termin weiter oben,
   nutzt dort die volle statt eine verkleinerte Variante der gemeinsamen
   .tc-termin-when-Komponente) - alle .tc-side-row-termin-Regeln werden
   dadurch nirgends mehr verwendet. */

/* Runde 2, Punkt 15: rein visuell verborgene, aber fuer Screenreader/
   Assistive Technologien weiterhin vorhandene Beschriftung - ersetzt die
   entfernten sichtbaren Ueberschriften ("Nummer:", "Name:", "Kontaktdaten:",
   "Adresse:", "Ticket-Besitzer", "Ticketwert", "Aktueller Status"), damit die
   Bedeutung der neuen Icons weiterhin zugaenglich bleibt, ohne dass der Text
   sichtbar Platz beansprucht. Standard-Screenreader-only-Technik (bewusst
   KEIN display:none/visibility:hidden, da diese von Screenreadern ignoriert
   wuerden). */
.tc-sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
}

/* Runde 2, Punkt 4-16 gemeinsames Icon-System (12.08.2026): Da im Projekt bisher
   kein wiederverwendbares Icon-System existierte (siehe Analyse), werden hier
   kleine, einheitliche Inline-SVGs (ueber tc_icon() in includes/main.php)
   eingefuehrt - Strichzeichnungen in currentColor, damit sie ueber die
   Textfarbe des jeweiligen Kontexts eingefaerbt werden, keine zusaetzlichen
   Bilddateien/Icon-Fonts/Abhaengigkeiten. */
.tc-icon {
	fill: none;
	stroke: currentColor;
	stroke-width: 1.4;
	stroke-linecap: round;
	stroke-linejoin: round;
	flex-shrink: 0;
	vertical-align: -2px;
}

@media (max-width: 900px) {
	div.ticket-card-view {
		/* Nacharbeit (24.08.2026, "Bilddarstellung ueberarbeiten"): dieselbe
		   Spaltenbreite wie im Desktop-Layout (108px statt vorher 46px) -
		   das Artenbild soll auf schmaleren Bildschirmen nicht kleiner
		   werden, nur die Gesamtanordnung (Seitenspalte wandert nach unten).
		   Nacharbeit (24.08.2026, "Kartenansicht auf dreispaltiges
		   Informationslayout umbauen", Auftrag Punkt 10): die neue
		   Info-Spalte wird bei wenig Platz ebenfalls zu einer eigenen
		   vollen Zeile gestapelt statt eine dritte, immer schmaler werdende
		   Spalte zu erzwingen - dasselbe Prinzip wie bereits bei "side". */
		grid-template-columns: 108px minmax(0, 1fr);
		grid-template-areas:
			"header header"
			"urgent urgent"
			"images main"
			"info info"
			"side side";
	}
	.tc-info {
		flex-direction: row;
		flex-wrap: wrap;
		align-items: center;
		border-top: 1px solid var(--color-border);
		border-left: none;
		padding: 6px 0 0 0;
	}
	.tc-side {
		flex-direction: row;
		align-items: center;
		justify-content: flex-start;
		border-top: 1px solid var(--color-border);
		padding: 6px 0 0 0;
		flex-wrap: wrap;
		min-width: 0;
	}
	.tc-contact-line-name {
		flex-wrap: wrap;
	}
}

/* Kartenoptimierung Punkt 8 (Responsive): auf sehr schmalen Breiten wird die
   Eck-Ribbon insgesamt etwas kompakter, das Parkdatum bleibt aber IMMER
   vollstaendig lesbar (Vorgabe Runde 2, Punkt 3) - notfalls zweizeilig
   innerhalb der (jetzt schmaleren) festen Breite, siehe .tc-corner-date
   flex-basis:100% oben. Reservierter Platz im Kopfbereich wird entsprechend
   kleiner. */
@media (max-width: 480px) {
	.tc-corner-ribbon {
		width: min(170px, calc(100% - 16px));
		font-size: 13px;
		padding: 6px 12px 6px 18px;
	}
	.tc-has-ribbon .tc-header {
		padding-right: 158px;
	}
	/* Punkt 15: auf sehr schmalen Karten immer genau eine Spalte, unabhaengig
	   davon, wie viele Gruppen (Adresse/Kontakte/E-Mail/Hinweise) vorhanden
	   sind - auto-fit alleine wuerde bei zwei kurzen Gruppen unter Umstaenden
	   noch 2 Spalten versuchen. */
	.tc-contact-details.tc-open {
		grid-template-columns: 1fr;
	}
}

/* ==========================================================================
   AP11 (Gesamtauftrag "BeWo Ticketsystem 2026", 13.09.2026, "Zusatzdaten
   als reine Dateiverwaltung neu bauen"): ersetzt die bisherige, auf sieben
   generische Inhaltsarten ausgelegte Darstellung (Bild/Link/Datei/Widget/
   Text/Randnotiz/Tabelle, siehe Git-Historie) durch eine einfache
   Datei-Kartenliste (includes/zusatzinhalt_dateien.php). */
.tc-zusatzdaten-liste {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.tc-zusatzdaten-datei {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px 12px;
	padding: 8px;
	border-radius: var(--radius-small);
}
.tc-zusatzdaten-datei + .tc-zusatzdaten-datei {
	border-top: 1px solid var(--color-border);
}
.tc-zusatzdaten-datei--hervorgehoben {
	background-color: var(--color-info-subtle);
	border-top: none;
}
.tc-zusatzdaten-datei-link {
	display: flex;
	align-items: center;
	gap: 8px;
	font-weight: 600;
	color: var(--color-text);
}
.tc-zusatzdaten-datei-link:hover,
.tc-zusatzdaten-datei-link:focus-visible {
	color: var(--color-primary-dark);
}
.tc-zusatzdaten-datei-link .tc-icon {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	color: var(--color-text-muted);
}
.tc-zusatzdaten-datei-beschreibung {
	flex-basis: 100%;
	font-size: 0.85rem;
	color: var(--color-text-muted);
}
.tc-zusatzdaten-datei-aktionen {
	display: flex;
	align-items: center;
	gap: 4px;
	margin-left: auto;
}
.tc-zusatzdaten-leer {
	margin: 0 0 8px;
	color: var(--color-text-muted);
	font-size: 0.9rem;
}
/* Global/ticketindividuell gliedern (Auftrag Punkt 1-3): kleine,
   dezente Gruppenueberschrift + Abstand zwischen den beiden Gruppen -
   bewusst kein eigenes zweites Kartendesign, nur Gliederung innerhalb
   derselben Karte. */
.tc-zusatzdaten-group + .tc-zusatzdaten-group {
	margin-top: 18px;
	padding-top: 14px;
	border-top: 1px solid var(--color-border);
}
.tc-zusatzdaten-group-title {
	display: block;
	margin-bottom: 6px;
	font-size: 0.78rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	color: var(--color-text-muted);
}

/* ==========================================================================
   Ticketaktionen modernisieren (20.08.2026, "aktion.php und alle damit
   verbundenen Aktionsdateien visuell anpassen") - AUSDRUECKLICH nur
   Darstellung, keine Funktionsaenderung. Betroffen: ticketing/aktion.php
   (neue Kopf-/Kontextkarte, siehe dort) sowie die 34 Formular-Dateien in
   ticketing/aktions_formulare/*.php, die aktion.php je nach $_GET['aktion']
   per include() einbindet.

   Strategie (Analyse vor der Umsetzung, siehe Abschlussbericht): 30 der 34
   Formular-Dateien folgen praktisch identisch demselben alten Muster -
   <form><table class="LinieRundumTextNormal"><tr><td bgcolor="#FFFF99">...
   Die alten Klassen (LinieRundumTextNormal/EingabeFeld/EingabeButtonKlein/
   TextNormal/TextKommentar/UeberschriftSeite/...) wurden schon in einer
   frueheren Facelift-Phase projektweit auf die aktuellen Design-Tokens
   (var(--color-*) usw.) umgestellt - die Formulare erben dadurch bereits
   Farben/Radius/Schrift automatisch. Was noch fehlte, war die STRUKTUR:
   die alten bgcolor="#FFFF99"-Zellen wirkten wie ein durchgehendes gelbes
   Formularfeld statt einer ruhigen, in Abschnitte gegliederten Karte
   (Auftrag Punkt 18 - "keine Kartenlandschaft, aber auch keine gelbe
   Flaeche"). Deshalb hier eine zentrale CSS-Ueberschreibung, SCOPED auf
   .tc-action-body (neuer Wrapper NUR um die include()-Ausgabe in
   aktion.php) - betrifft dadurch ausschliesslich diese Seite, keine
   anderen Verwendungen derselben Alt-Klassen im Projekt. Keine der 34
   Dateien selbst musste dafuer angefasst werden (Auftrag Punkt 20/21 -
   "gemeinsame Komponenten statt 34x fast identisches CSS"). Individuelle
   HTML-Anpassungen gab es nur dort, wo die Struktur wirklich abweicht
   (siehe Abschlussbericht: geloescht.php, gefaehrliche Aktionen).
   ========================================================================== */

/* --- Kopf-/Kontextbereich (in aktion.php selbst) --------------------------- */
.tc-action-page {
	max-width: 900px;
}
/* Nachtrag (17.09.2026, Fund vom 16.09.2026 "RTF-Editor Breite+Vollbild",
   erweitert auf "kontakt" nach Nutzerauftrag "gleiche Breite/Spalten-
   verteilung wie Ticket-Erstellung"): die beiden bereits an
   ticketing/neu/phase4.php bzw. phase3.php angelehnten Formulare
   (aktions_formulare/bearbeitet.php - "Fachliche Angaben" zweispaltig,
   aktions_formulare/kontakt.php - .tc-neu-contact-columns) bekommen
   dieselbe Breite wie ihre jeweiligen Vorbilder (.tc-neu-page). Die
   uebrigen ~32 einfachen Aktionsformulare (Status setzen, Bestaetigungen
   usw.) behalten bewusst 900px - fuer ein einzelnes Bemerkungsfeld waere
   volle Breite nur unnoetig ausgefranst.
*/
.tc-action-page--breit {
	max-width: 1360px;
}
.tc-action-back {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	margin-bottom: 12px;
	font-family: var(--font-system);
	font-size: 0.9rem;
	font-weight: 600;
	color: var(--color-text-muted);
	text-decoration: none;
}
.tc-action-back .tc-icon {
	transform: rotate(180deg);
}
.tc-action-back:hover,
.tc-action-back:focus-visible {
	color: var(--color-text);
}
.tc-action-context {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-small);
	padding: 16px 20px;
	margin-bottom: 20px;
}
.tc-action-context-ticketnummer {
	display: block;
	font-family: var(--font-system);
	font-size: 0.78rem;
	font-weight: 700;
	letter-spacing: .03em;
	text-transform: uppercase;
	color: var(--color-text-muted);
}
.tc-action-context-betreff {
	display: block;
	font-family: var(--font-system);
	font-size: 1.15rem;
	font-weight: 700;
	color: var(--color-text);
	margin-top: 2px;
}
.tc-action-context-meta {
	display: flex;
	flex-wrap: wrap;
	gap: 4px 18px;
	margin-top: 8px;
	font-family: var(--font-system);
	font-size: 0.88rem;
	color: var(--color-text-muted);
}
.tc-action-context-meta strong {
	color: var(--color-text);
	font-weight: 600;
}

/* --- Formularbereich (in den 34 eingebundenen Dateien, unveraendertes
   HTML/PHP) - reine Attribut-/Klassen-Ueberschreibung, siehe Kommentar oben --- */
.tc-action-body table.LinieRundumTextNormal {
	width: 100%;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-small);
	border-collapse: separate;
	border-spacing: 0;
	overflow: hidden;
	margin-bottom: 20px;
}
/* Verschachtelte Tabellen (z. B. kontakt.php: Label/Feld-Zeilen in einer
   inneren Tabelle) sollen NICHT nochmal wie eine eigene Karte wirken -
   nur die AEUSSERE Tabelle bekommt Rahmen/Schatten/Radius. */
.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal {
	border: none;
	box-shadow: none;
	border-radius: 0;
	margin-bottom: 0;
}
.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal > tbody > tr > td:first-child,
.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal > tr > td:first-child {
	width: 170px;
	font-weight: 600;
	color: var(--color-text-muted);
	white-space: nowrap;
	vertical-align: middle;
}
/* Die alten knalligen bgcolor-Werte (#FFFF99 durchgaengig, #FFCC99 im
   Zusatzbereich von bearbeitet.php) weichen einer ruhigen, einheitlichen
   Flaeche - Info-Spalte (terminiert.php, #99CCFF) bekommt bewusst
   weiterhin eine EIGENE, dezente Farbe (siehe weiter unten), daher die
   spezifischere Regel danach. */
.tc-action-body td[bgcolor] {
	background-color: transparent !important;
}
.tc-action-body td[bgcolor="#FFCC99"] {
	background-color: var(--color-background) !important;
}
.tc-action-body td[bgcolor="#99CCFF"] {
	background-color: var(--color-info-subtle) !important;
	border-radius: var(--radius-medium);
}
.tc-action-body td[bgcolor="#E9E9E9"] {
	background-color: var(--color-background) !important;
}
/* Zeilenabstand: jede <tr><td> wird zu einer klar getrennten Formularzeile
   mit ruhigem vertikalem Rhythmus statt dicht gedraengter Altansicht. */
.tc-action-body table.LinieRundumTextNormal > tbody > tr > td,
.tc-action-body table.LinieRundumTextNormal > tr > td {
	padding: 14px 20px;
	border-bottom: 1px solid var(--color-border);
	vertical-align: top;
}
.tc-action-body table.LinieRundumTextNormal > tbody > tr:last-child > td,
.tc-action-body table.LinieRundumTextNormal > tr:last-child > td {
	border-bottom: none;
}
/* Erste Zeile (Titel + Beschreibungstext, "Aktion: ..."): etwas kompakter
   und optisch als kurzer Vorspann abgesetzt statt als eigenes Formularfeld. */
.tc-action-body table.LinieRundumTextNormal > tbody > tr:first-child > td,
.tc-action-body table.LinieRundumTextNormal > tr:first-child > td {
	padding-bottom: 12px;
}
.tc-action-body .UeberschriftSeite {
	display: block;
	font-size: 1.05rem;
	margin-bottom: 4px;
}
/* Labelzeilen (TextKommentar/TextFett direkt vor einem Eingabefeld) etwas
   Luft zum darunterliegenden Feld geben, statt direkt am Text zu kleben. */
.tc-action-body .TextKommentar,
.tc-action-body .TextFett {
	display: block;
	margin-bottom: 6px;
}
/* Button-Leiste: rechtsbuendig, dezent abgesetzter Hintergrund, Abstand
   zwischen mehreren Buttons/Links (Auftrag Punkt 14 - klare Priorisierung
   Primaer-/Sekundaeraktion). Erkennung ueber :has(input[type="submit"])
   statt :last-child - Testfund: bearbeitet.php hat NACH dem eigentlichen
   Speichern-Button noch weitere Zeilen (Ticket-Einstellungen-Ein-/
   Ausklapper), :last-child hätte dort faelschlich die aeussere,
   umschliessende Einstellungen-Zeile getroffen statt der echten
   Button-Zeile. Bewusst KEIN display:flex auf dem <td> selbst (bekannte
   Chromium-Eigenart bei Tabellenzellen, siehe Facelift-Lektion) - reines
   text-align + Button-Abstand reicht. */
.tc-action-body table.LinieRundumTextNormal > tbody > tr:has(input[type="submit"]) > td,
.tc-action-body table.LinieRundumTextNormal > tr:has(input[type="submit"]) > td {
	background-color: var(--color-background) !important;
	border-top: 1px solid var(--color-border);
	text-align: right;
}
.tc-action-body input[type="submit"],
.tc-action-body input[type="button"],
.tc-action-body a.tc-action-link-button {
	margin-left: 8px;
}
.tc-action-body textarea {
	width: 100%;
	max-width: 640px;
	box-sizing: border-box;
}
.tc-action-body select {
	max-width: 420px;
}

/* --- Gefaehrliche/weitreichende Aktionen (Auftrag Punkt 15): rein visuelle
   Kennzeichnung ueber eine zusaetzliche Klasse auf der bestehenden Tabelle
   (geloescht.php/geschlossen.php/entwertet.php/zurueckgebucht.php) - kein
   neuer Bestaetigungsdialog, keine neue Sicherheitslogik. --- */
.tc-action-body table.tc-action-gefahr {
	border-color: var(--color-danger);
	border-width: 2px;
}
/* :not(.Eskaliert) - geloescht.php hat in der ersten Zeile eine eigene,
   bereits bestehende Warnbanner-Zelle (class="Eskaliert", kraeftiges Rot
   mit weisser Schrift) - ohne diesen Ausschluss wuerde das helle
   danger-subtle-Rot hier die weisse Schrift fast unlesbar machen. */
.tc-action-body table.tc-action-gefahr > tbody > tr:first-child > td:not(.Eskaliert),
.tc-action-body table.tc-action-gefahr > tr:first-child > td:not(.Eskaliert) {
	background-color: var(--color-danger-subtle) !important;
}
.tc-action-body table.tc-action-gefahr input[type="submit"] {
	background-color: var(--color-danger);
	border-color: var(--color-danger);
}
.tc-action-body table.tc-action-gefahr input[type="submit"]:hover {
	background-color: #A01F24;
}
/* geloescht.php: alte GIF-Bild-Buttons durch echte, im neuen Stil
   gehaltene Textlinks ersetzt (Auftrag Punkt 5 - "Buttons" gehoert zu den
   erlaubten visuellen Aenderungen) - href/Ziel/Logik dabei unveraendert. */
.tc-action-body a.tc-action-link-button {
	display: inline-block;
	font-family: var(--font-system);
	font-size: 15px;
	font-weight: 600;
	min-height: 38px;
	line-height: 22px;
	padding: 8px 18px;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-primary-dark);
	background-color: var(--color-primary);
	color: #FFF !important;
	text-decoration: none;
}
.tc-action-body a.tc-action-link-button:hover {
	background-color: var(--color-primary-dark);
}
.tc-action-body a.tc-action-link-button--sekundaer {
	background-color: var(--color-surface);
	border-color: var(--color-border-strong);
	color: var(--color-text) !important;
}
.tc-action-body a.tc-action-link-button--sekundaer:hover {
	background-color: var(--color-background);
}
.tc-action-body a.tc-action-link-button--gefahr {
	background-color: var(--color-danger);
	border-color: var(--color-danger);
}
.tc-action-body a.tc-action-link-button--gefahr:hover {
	background-color: #A01F24;
}

@media (max-width: 700px) {
	.tc-action-page {
		max-width: 100%;
	}
	.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal > tbody > tr > td:first-child,
	.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal > tr > td:first-child {
		width: auto;
		display: block;
		white-space: normal;
	}
	.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal > tbody > tr > td,
	.tc-action-body table.LinieRundumTextNormal table.LinieRundumTextNormal > tr > td {
		display: block;
		width: auto;
	}
}

/* ==========================================================================
   Release Notes (24.08.2026, "Release-Notes-System ohne Datenbank
   einfuehren und rueckwirkend aus Git-Historie aufbauen"). Kompakte,
   ruhige Liste im Stil des uebrigen Redesigns - eigene, scoped Klasse
   .tc-release-page, damit die alten Legacy-Klassen der umgebenden Seite
   (UeberschriftSeite/TextNormal, siehe release-notes/index.php) nicht
   hineinwirken. Jede Zeile ist ein natives <details>/<summary>-Element
   (Auftrag Punkt 5: "Popover / kleines Popup / aufklappbarer Bereich" -
   aufklappbar gewaehlt, da voellig ohne JavaScript auskommend, nativ
   tastaturbedienbar und robust bei beliebig vielen Eintraegen). */
.tc-release-page {
	/* 780px -> 1040px (Nutzerfeedback 03.09.2026: "Titel sollen einzeilig
	   bleiben") - bei 780px brachen laengere, aber weiterhin einzeilig
	   gedachte Ueberschriften in der Zeilenansicht um. */
	max-width: 1040px;
}
.tc-release-intro {
	color: var(--color-text-muted);
	font-size: 0.9rem;
	margin: 0 0 var(--spacing-md) 0;
}
.tc-release-leer {
	color: var(--color-text-muted);
}
.tc-release-liste {
	border-top: 1px solid var(--color-border);
}
.tc-release-entry {
	border-bottom: 1px solid var(--color-border);
}
.tc-release-row {
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 10px 8px;
	cursor: pointer;
	list-style: none;
}
/* Browser-eigenes Aufklapp-Dreieck ausblenden - die eigene .tc-release-info
   (Info-Symbol) uebernimmt diese Rolle optisch bereits. */
.tc-release-row::-webkit-details-marker {
	display: none;
}
.tc-release-row::marker {
	content: '';
}
.tc-release-row:hover {
	background-color: var(--color-background);
}
.tc-release-row:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: -2px;
}
.tc-release-id {
	/* Eindeutige, fortlaufende Kennung je Eintrag (Format OTS-0001,
	   aufsteigend - siehe release-notes-data.php) - rein informativ/zum
	   Referenzieren einzelner Aenderungen, kein Link/keine Funktion. */
	flex: 0 0 78px;
	color: var(--color-text-muted);
	font-size: 0.8rem;
	font-family: Consolas, Monaco, monospace;
	font-variant-numeric: tabular-nums;
}
.tc-release-datum {
	flex: 0 0 150px;
	color: var(--color-text-muted);
	font-size: 0.85rem;
	font-variant-numeric: tabular-nums;
}
.tc-release-titel {
	flex: 1 1 auto;
	min-width: 0;
	font-weight: 600;
	color: var(--color-text);
	/* Harte Garantie fuer "Titel bleiben einzeilig" unabhaengig von der
	   tatsaechlichen Laenge - die verbreiterte .tc-release-page (oben)
	   deckt bereits alle bisherigen Titel ab, dies ist zusaetzliche
	   Absicherung fuer einen einzelnen, spaeter versehentlich zu lang
	   geratenen Titel (dann Auslassungspunkte statt Umbruch). */
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.tc-release-info {
	flex: 0 0 auto;
	display: inline-flex;
	color: var(--color-text-muted);
}
.tc-release-entry[open] .tc-release-info {
	color: var(--color-primary);
}
.tc-release-beschreibung {
	margin: 0 0 14px 0;
	padding: 0 8px 0 260px;
	color: var(--color-text);
	font-size: 0.9rem;
	line-height: 1.5;
}
@media (max-width: 700px) {
	.tc-release-row {
		flex-wrap: wrap;
		gap: 4px 16px;
	}
	.tc-release-id {
		order: 1;
	}
	.tc-release-titel {
		order: 2;
		/* Im gestapelten Mobil-Layout darf der Titel wieder normal
		   umbrechen (eigene volle Zeile ohnehin schon vorhanden) - die
		   Einzeiligkeit mit Auslassungspunkten ist nur fuer die breite
		   Zeilenansicht gedacht (siehe .tc-release-titel oben). */
		white-space: normal;
		overflow: visible;
		text-overflow: clip;
	}
	.tc-release-datum {
		flex-basis: 100%;
		order: 3;
	}
	.tc-release-info {
		order: 4;
	}
	.tc-release-beschreibung {
		padding-left: 8px;
	}
}

/* ==========================================================================
   Gemeinsame Modal-Komponente (24.08.2026, "Verbliebene Aktionsformulare
   als Pop-up/Modal direkt im Ticket ausfuehren"). Natives <dialog> -
   Zentrierung/::backdrop/ESC-Verhalten kommen dadurch bereits vom Browser,
   hier nur Redesign-Optik + Formularelemente im bestehenden Stil (Auftrag
   Punkt 6). Bewusst eigene, neue Komponente statt Wiederverwendung von
   .tc-toolbar-popover-* (dort fuer kleine, am Ausloeser verankerte
   Einblendungen gedacht, hier fuer echte zentrierte Dialoge mit mehr
   Inhalt/Formularfeldern).
   ========================================================================== */
dialog.tc-modal {
	width: min(480px, 92vw);
	margin: auto;
	padding: 0;
	border: none;
	border-radius: var(--radius-medium);
	overflow: hidden; /* Nachbesserung 18.09.2026: haelt den eckigen
		.tc-modal-header innerhalb der abgerundeten Dialog-Ecken (siehe
		"Ticket-Dialoge Grundlayout vereinheitlichen"). */
	box-shadow: var(--shadow-medium);
	background-color: var(--color-surface);
	color: var(--color-text);
}
/* Bugfix (24.09.2026, Fehlerrunde Punkt 2, Nutzerfund "Layer erscheint dort,
   wo er nicht hingehoert"): die responsive Flex-Anpassung (siehe unten) war
   zunaechst auf dem unconditional "dialog.tc-modal"-Selektor untergebracht -
   das ueberschrieb die UA-Standardregel "dialog:not([open]) { display:none }"
   fuer JEDEN .tc-modal-Dialog im gesamten Projekt, wodurch geschlossene
   Dialoge (z. B. beide Bestaetigungs-Dialoge in der Datenbankpflege)
   permanent sichtbar im normalen Seitenfluss standen statt korrekt verborgen
   zu bleiben. Ab jetzt ausschliesslich fuer den TATSAECHLICH offenen Zustand
   (dialog[open], von HTMLDialogElement.showModal()/.show() gesetzt) -
   geschlossene Dialoge bleiben wie zuvor vollstaendig unsichtbar/nicht im
   Layout. Wirkt sich weiterhin auf ALLE .tc-modal-Dialoge aus (Auftrag:
   "systemweit alle vergleichbaren Dialoge"): .tc-modal-header/-actions
   bleiben aussen (flex: 0 0 auto), ausschliesslich .tc-modal-body wird bei
   Bedarf scrollbar (siehe dort). .tc-modal--bild (Bild-Grossansicht, andere
   Struktur ohne Header/Actions) setzt display weiter unten bewusst wieder
   zurueck - ebenfalls [open]-gebunden, siehe dortiger Kommentar. */
dialog.tc-modal[open] {
	display: flex;
	flex-direction: column;
	max-height: min(640px, 90vh);
}
/* Bugfix (27.09.2026, Roman-Fund "Speichern-Button bei langem Modal-Inhalt
   nicht mehr erreichbar", Warenwirtschaft/traegerspezifische Konditionen,
   betrifft aber JEDEN .tc-modal mit <form>-Wrapper systemweit): das
   Flex-Column+max-height-Geruest oben gilt nur fuer die UNMITTELBAREN
   Kind-Elemente von <dialog> - bei Dialogen ohne <form> sind das direkt
   .tc-modal-header/-body/-actions (funktioniert dort bereits korrekt),
   bei jedem Dialog MIT <form class="tc-modal-form"> (der weit
   ueberwiegenden Mehrzahl - jedes Formular, das per echtem POST speichert)
   ist aber das <form> selbst das unmittelbare Kind, und dafuer fehlte
   bisher jede eigene Flex-Regel. Das <form> wurde dadurch nur nach seinem
   Inhalt gross, unabhaengig von der max-height des <dialog> - der
   umschliessende "overflow:hidden" auf dialog.tc-modal (siehe oben)
   schnitt ueberschuessigen Inhalt dadurch UNWIEDERBRINGLICH ab (nicht nur
   optisch, auch fuer Scrollen unerreichbar), statt dass wie beabsichtigt
   NUR .tc-modal-body scrollbar wird. Bisher nie aufgefallen, weil kein
   bisheriger Formular-Dialog genug Inhalt hatte, um die max-height zu
   ueberschreiten - jede kuenftige inhaltsreichere Erweiterung eines
   bestehenden Formular-Dialogs waere ebenso betroffen gewesen. */
dialog.tc-modal[open] > form {
	display: flex;
	flex-direction: column;
	min-height: 0;
	flex: 1 1 auto;
	width: 100%;
}
dialog.tc-modal::backdrop {
	background-color: rgba(17, 24, 39, 0.55);
}
/* Bestaetigungs-Popup "Offene Tickets vorhanden" (Phase IV, Auftrag "Phase
   III/IV weiter optimieren", 03.09.2026, Teil C4) - dieselbe gedeckte
   Warnfarbe wie die bereits bestehende .tc-neu-duplicate-warning-Karte
   (keine Panikfarbe/kein Rot), nur als eigene Modal-Variante. */
dialog.tc-modal--warnung {
	border-top: 3px solid var(--color-warning);
}
/* Bild-Grossansicht (16.09.2026, "Ticket-Inhalte formatierbar machen",
   optionaler Klick-fuer-Grossansicht) - deutlich breiter als der
   Standard-.tc-modal (der ist fuer Formulare/Textdialoge gedacht), das Bild
   bestimmt seine Groesse selbst bis zu einer Bildschirm-Obergrenze. Der
   Schliessen-Knopf schwebt oben rechts ueber dem Bild statt in einem
   eigenen .tc-modal-header (hier kein Titeltext noetig). */
dialog.tc-modal--bild[open] {
	display: block; /* setzt die neue Flex-Spalte der Basisregel .tc-modal
		zurueck - diese Variante hat keinen .tc-modal-header/-actions, nur
		ein einzelnes <img>, siehe Kommentar oben. Bugfix 24.09.2026: an
		[open] gebunden, siehe Kommentar bei dialog.tc-modal[open] oben -
		sonst blieb auch dieser Dialog im geschlossenen Zustand sichtbar. */
	width: auto;
	max-width: 92vw;
	max-height: 92vh;
	padding: 0;
	background-color: transparent;
	box-shadow: none;
	position: relative;
}
.tc-modal--bild img {
	display: block;
	max-width: 92vw;
	max-height: 92vh;
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
}
.tc-modal--bild .tc-modal-schliessen {
	position: absolute;
	top: 8px;
	right: 8px;
	background-color: var(--color-surface);
	box-shadow: var(--shadow-small);
}
.tc-modal-warn-head {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 6px;
}
.tc-modal-warn-icon {
	flex: 0 0 auto;
	color: var(--color-warning);
}
.tc-modal-warn-icon svg {
	width: 28px;
	height: 28px;
}
/* Nachbesserung (18.09.2026, Auftrag "Ticket-Dialoge Grundlayout
   vereinheitlichen"): der Abschlussdialog "Ticket schließen" ist die neue
   Designreferenz fuer ALLE Ticket-Aktionsdialoge - dunkler roter
   Kopfbereich (dieselbe Farbe wie der bestehende rote Button "Ticket
   schließen", siehe .button-danger unten), weisse Ueberschrift, weisses
   Schliessen-X. Bewusst als Basisregel auf .tc-modal-header selbst (nicht
   mehr nur fuer die "gefahr"-Variante) - gilt dadurch automatisch fuer
   jeden bestehenden und kuenftigen Ticket-Dialog ohne Einzelanpassung
   (Auftrag Punkt 2/8, "gemeinsame wiederverwendbare Komponente"). */
.tc-modal-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	padding: 14px 16px;
	background-color: var(--color-danger);
	color: #FFF;
	flex: 0 0 auto; /* Folgeauftrag 24.09.2026: bleibt fest, siehe .tc-modal */
}
.tc-modal-titel {
	margin: 0;
	font-size: 1.05rem;
	font-weight: 700;
	color: #FFF;
}
.tc-modal-schliessen {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	padding: 0;
	background: none;
	border: none;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	cursor: pointer;
}
.tc-modal-schliessen:hover {
	background-color: var(--color-background);
	color: var(--color-text);
}
.tc-modal-schliessen:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
/* Weisses/kontrastreiches X NUR innerhalb des roten Kopfbereichs - die
   Basisregel oben bleibt fuer den freischwebenden Schliessen-Knopf der
   Bild-Grossansicht (.tc-modal--bild, heller Hintergrund, kein Header)
   unveraendert dezent. */
.tc-modal-header .tc-modal-schliessen {
	color: rgba(255, 255, 255, 0.85);
}
.tc-modal-header .tc-modal-schliessen:hover {
	background-color: rgba(255, 255, 255, 0.18);
	color: #FFF;
}
.tc-modal-header .tc-modal-schliessen:focus-visible {
	outline-color: #FFF;
}
.tc-modal-body {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 16px;
	/* Folgeauftrag 24.09.2026: einziger scrollbarer Bereich des Dialogs,
	   siehe Kommentar bei .tc-modal. min-height:0 ist noetig, damit ein
	   Flex-Kind in einem hoehenbegrenzten Flex-Container ueberhaupt
	   schrumpfen und dadurch overflow:auto/Scrollen greifen kann (sonst
	   wuerde es sich auf seine natuerliche Inhaltshoehe aufblaehen und den
	   Elternrahmen sprengen). */
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
}
/* Bugfix (25.09.2026, Roman-Fund "Notiz-Dialog zeigt alle Buttons auf
   einmal"): dieselbe [hidden]-vs-Autorenregel-Spezifitaetsfalle wie bei
   .tc-modal-abschnitt/.tc-modal-karte weiter unten - "display: flex" oben
   ueberschreibt sonst das [hidden]-Attribut (gleiche Selektor-Spezifitaet,
   Autoren-Regel gewinnt gegen die UA-Standardregel [hidden]{display:none}).
   Betraf konkret den zweistufigen "Persoenliche Notiz erstellen"-Dialog
   (ticketing/anzeigen/show.php): Eingabe- und Auswahl-Bereich/-Aktionen
   blieben trotz per JS gesetztem hidden-Attribut gleichzeitig sichtbar. */
.tc-modal-body[hidden] {
	display: none;
}
/* Bugfix (28.09.2026, Browser-Rendertest "Ungeklaerter Altbestand"): die
   Detailtabelle im Bestandskonflikt-Dialog (warenwirtschaft/
   ticket_erfassung/b2b.php) erbte das min-width:600px von
   table.ticket-list-view - breiter als der 480px-Dialog, Werte wurden
   abgeschnitten + horizontaler Scrollbalken. Bewusst nur fuer diesen
   Dialog aufgehoben, andere Listen/Dialoge bleiben unveraendert. */
#tc-wwi-bestandskonflikt-modal table.ticket-list-view {
	min-width: 0;
}
#tc-wwi-bestandskonflikt-modal table.ticket-list-view td {
	overflow-wrap: anywhere;
}
.tc-modal-hinweis {
	margin: 0 0 8px 0;
	padding: 8px 10px;
	background-color: var(--color-background);
	border-radius: var(--radius-small);
	font-size: 0.85rem;
	color: var(--color-text-muted);
}
.tc-modal-hinweis--gefahr {
	background-color: var(--color-danger-subtle);
	color: var(--color-danger-dark);
}
.tc-modal-hinweis--warnung {
	background-color: var(--color-warning-subtle);
	color: var(--color-warning-dark);
	font-size: 0.92rem;
}
/* Nachbesserung (18.09.2026, Auftrag "Ticket-Dialoge Grundlayout
   vereinheitlichen"): zentrale, wiederverwendbare Bausteine fuer ALLE
   Ticket-Dialoge (Auftrag Punkt 3/8) - Bereichskarten (.tc-modal-abschnitt,
   z. B. Zeiterfassung/Bemerkungen/Termin) und Auswahlkarten mit
   Schiebeschalter (.tc-modal-karte + .tc-switch, z. B. "Ticket
   entwerten"). Bewusst hier zentral definiert statt je Dialog neu, damit
   kuenftige Dialoge dieselbe Optik ohne eigenes CSS erhalten. */
.tc-modal-abschnitt {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 12px;
	margin: 4px 0;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-background);
}
/* Bugfix (18.09.2026, per Live-Test gefunden - bereits bekanntes Muster
   aus den Kennwortfeldern): "display: flex" oben ueberschreibt sonst das
   [hidden]-Attribut (gleiche Selektor-Spezifitaet, Autoren-Regel gewinnt
   gegen die UA-Standardregel [hidden]{display:none}) - der Zeit-
   Erfassungsbereich blieb dadurch beim Aktivieren von "Ticket entwerten"
   trotz gesetztem hidden-Attribut sichtbar. */
.tc-modal-abschnitt[hidden] {
	display: none;
}
.tc-modal-abschnitt-titel {
	margin: 0;
	font-size: 0.78rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	color: var(--color-text-muted);
}
.tc-modal-abschnitt .tc-modal-select,
.tc-modal-abschnitt .tc-modal-textarea,
.tc-modal-abschnitt .tc-modal-input {
	background-color: var(--color-surface);
}

/* Auswahlkarte mit Schiebeschalter (z. B. "Ticket entwerten") - dieselbe
   Bereichskarten-Optik wie .tc-modal-abschnitt, nur als kompakte Zeile
   (Icon + Text + Schalter) statt eines vertikalen Formularblocks. */
.tc-modal-karte {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 12px;
	margin: 4px 0;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-background);
}
/* Vorbeugend dieselbe [hidden]-Absicherung wie .tc-modal-abschnitt oben,
   falls eine Karte kuenftig bedingt versteckt wird. */
.tc-modal-karte[hidden] {
	display: none;
}
.tc-modal-karte-icon {
	display: inline-flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	background-color: var(--color-surface);
	color: var(--color-text-muted);
}
.tc-modal-karte-icon .tc-icon {
	width: 16px;
	height: 16px;
}
.tc-entwerten-karte .tc-modal-karte-icon {
	color: var(--color-danger);
}
.tc-modal-karte-text {
	display: flex;
	flex-direction: column;
	gap: 1px;
	flex: 1 1 auto;
	min-width: 0;
}
.tc-modal-karte-titel {
	font-size: .88rem;
	font-weight: 600;
	color: var(--color-text);
}
.tc-modal-karte-beschreibung {
	font-size: .78rem;
	color: var(--color-text-muted);
}

/* Schiebeschalter (natives <input type="checkbox">, visuell als Schieber
   dargestellt) - ersetzt einfache Ja/Nein-Buttons fuer echte Zustands-
   Optionen (Auftrag Punkt 4), z. B. "Ticket entwerten". Volle Tastatur-/
   Screenreader-Semantik kommt kostenlos vom nativen Checkbox-Element,
   siehe js/tc-entwerten-toggle.js. */
.tc-switch {
	position: relative;
	display: inline-flex;
	flex-shrink: 0;
	align-items: center;
	width: 42px;
	height: 24px;
	cursor: pointer;
}
.tc-switch-input {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	opacity: 0;
	cursor: pointer;
}
.tc-switch-schieber {
	position: absolute;
	inset: 0;
	background-color: var(--color-border-strong);
	border-radius: 999px;
	transition: background-color .15s ease;
}
.tc-switch-schieber::before {
	content: "";
	position: absolute;
	top: 3px;
	left: 3px;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background-color: #FFF;
	box-shadow: var(--shadow-small);
	transition: transform .15s ease;
}
.tc-switch-input:checked + .tc-switch-schieber {
	background-color: var(--color-danger);
}
.tc-switch-input:checked + .tc-switch-schieber::before {
	transform: translateX(18px);
}
.tc-switch-input:focus-visible + .tc-switch-schieber {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}

/* Nachbesserung (18.09.2026, "Augen-Symbol bei Kennwort aendern" +
   "Live-Anzeige der Kennwortanforderungen" + "Kennwortstaerke anzeigen"):
   EIN gemeinsames Komponentenpaar fuer Kennwortfelder, projektweit
   verwendbar (bisher gab es die Sichtbarkeits-Umschaltung nur lokal in
   pwrecovery/reset.php als eigene .tc-auth-*-Klassen/eigenes Inline-Skript
   - hier bewusst in css/styles.css statt css/login.css, da css/styles.css
   auf JEDER Seite geladen wird, waehrend login.css nur den drei
   eigenstaendigen Auth-Seiten vorbehalten ist). Siehe js/tc-kennwort-
   sichtbarkeit.js und js/tc-kennwort-anforderungen.js fuer die zugehoerige
   Logik - reine Client-Komfortfunktionen, die serverseitige Pruefung
   (passwort_erfuellt_richtlinie(), includes/main.php) bleibt unveraendert
   massgeblich. */
.tc-kennwort-wrapper {
	position: relative;
}
.tc-kennwort-wrapper input {
	padding-right: 42px;
	box-sizing: border-box;
	width: 100%;
}
.tc-kennwort-sichtbar-btn {
	position: absolute;
	right: 4px;
	top: 50%;
	transform: translateY(-50%);
	background: none;
	border: none;
	cursor: pointer;
	color: var(--color-text-muted);
	padding: 6px 8px;
	line-height: 1;
	font-size: 1.05rem;
}
.tc-kennwort-sichtbar-btn:hover {
	color: var(--color-text);
}

.tc-kennwort-regel-liste {
	list-style: none;
	margin: 6px 0 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 3px;
	font-size: .82rem;
	color: var(--color-text-muted);
}
.tc-kennwort-regel {
	display: flex;
	align-items: center;
	gap: 6px;
}
.tc-kennwort-regel::before {
	content: "";
	flex-shrink: 0;
	width: 14px;
	height: 14px;
	border-radius: 50%;
	border: 1.5px solid var(--color-border-strong);
	box-sizing: border-box;
}
.tc-kennwort-regel--erfuellt {
	color: var(--color-success-dark);
}
.tc-kennwort-regel--erfuellt::before {
	border-color: var(--color-success);
	background-color: var(--color-success);
	background-image: linear-gradient(45deg, transparent 40%, #FFF 40%, #FFF 45%, transparent 45%, transparent 55%, #FFF 55%, #FFF 65%, transparent 65%);
}

.tc-kennwort-staerke {
	margin-top: 8px;
	display: flex;
	align-items: center;
	gap: 8px;
}
/* Bugfix (18.09.2026, per Live-Test gefunden): "display: flex" oben
   ueberschreibt sonst das [hidden]-Attribut (gleiche Selektor-Spezifitaet,
   Autoren-Regel gewinnt immer gegen die UA-Standardregel [hidden]{display:
   none}) - die Staerkeanzeige blieb dadurch bei leerem Kennwortfeld
   sichtbar, obwohl js/tc-kennwort-anforderungen.js sie korrekt "hidden"
   setzt. */
.tc-kennwort-staerke[hidden] {
	display: none;
}
.tc-kennwort-staerke-balken {
	flex: 1 1 auto;
	height: 5px;
	border-radius: 999px;
	background-color: var(--color-border);
	overflow: hidden;
}
.tc-kennwort-staerke-balken > span {
	display: block;
	height: 100%;
	width: 0;
	border-radius: 999px;
	background-color: var(--color-danger);
	transition: width .15s ease, background-color .15s ease;
}
.tc-kennwort-staerke-label {
	flex-shrink: 0;
	font-size: .78rem;
	font-weight: 600;
	color: var(--color-text-muted);
	min-width: 3.6em;
	text-align: right;
}
.tc-kennwort-staerke[data-staerke="schwach"] .tc-kennwort-staerke-balken > span { width: 25%; background-color: var(--color-danger); }
.tc-kennwort-staerke[data-staerke="mittel"] .tc-kennwort-staerke-balken > span { width: 50%; background-color: var(--color-warning); }
.tc-kennwort-staerke[data-staerke="gut"] .tc-kennwort-staerke-balken > span { width: 75%; background-color: var(--color-primary); }
.tc-kennwort-staerke[data-staerke="stark"] .tc-kennwort-staerke-balken > span { width: 100%; background-color: var(--color-success); }
.tc-kennwort-staerke[data-staerke="schwach"] .tc-kennwort-staerke-label { color: var(--color-danger); }
.tc-kennwort-staerke[data-staerke="mittel"] .tc-kennwort-staerke-label { color: var(--color-warning); }
.tc-kennwort-staerke[data-staerke="gut"] .tc-kennwort-staerke-label { color: var(--color-primary); }
.tc-kennwort-staerke[data-staerke="stark"] .tc-kennwort-staerke-label { color: var(--color-success-dark); }

.tc-modal-label {
	font-size: 0.8rem;
	font-weight: 600;
	color: var(--color-text-muted);
	margin-top: 8px;
}
.tc-modal-select,
.tc-modal-textarea,
.tc-modal-input {
	width: 100%;
	box-sizing: border-box;
	font-family: var(--font-system);
	font-size: 0.9rem;
	padding: 8px 10px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	background-color: var(--color-surface);
	color: var(--color-text);
}
.tc-modal-select:focus-visible,
.tc-modal-textarea:focus-visible,
.tc-modal-input:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-modal-textarea {
	resize: vertical;
}
.tc-modal-actions {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
	padding: 12px 16px 16px;
	flex: 0 0 auto; /* Folgeauftrag 24.09.2026: bleibt fest, siehe .tc-modal */
}
/* Bugfix (25.09.2026): dieselbe [hidden]-Absicherung wie bei .tc-modal-body
   oben - betrifft dieselbe Stelle (zweistufiger "Persoenliche Notiz
   erstellen"-Dialog, beide Aktionsleisten sonst gleichzeitig sichtbar). */
.tc-modal-actions[hidden] {
	display: none;
}
.tc-modal-confirm {
	padding: 0 16px 16px;
}
.tc-modal-confirm-frage {
	margin: 0 0 10px 0;
	font-size: 0.9rem;
	font-weight: 600;
	color: var(--color-danger-dark);
}
/* Nacharbeit (24.08.2026, "Termin erstellen, Termin bearbeiten und
   Tickets parken direkt im Ticket", Auftrag Punkt 10): Fehlermeldung bei
   ungueltigem Datum/ungueltiger Uhrzeit direkt im Modal (js/ticket-datum-
   modal.js schaltet [hidden] um) statt einer alarm()-Box oder eines
   Seitenwechsels. */
.tc-modal-fehler {
	margin: 4px 0 0 0;
	padding: 8px 10px;
	background-color: var(--color-danger-subtle);
	border-radius: var(--radius-small);
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--color-danger-dark);
}
@media (max-width: 560px) {
	.tc-modal-header,
	.tc-modal-body,
	.tc-modal-actions,
	.tc-modal-confirm {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* "Ticket verbinden" optimieren (13.09.2026): bisherige volle
   Seitennavigation (ticketing/aktion.php?aktion=beziehung, alte bgcolor-
   Tabellen-Optik) durch ein Modal direkt im Ticket ersetzt - Suche/Auswahl
   laeuft unveraendert ueber die bestehende aktionen/beziehung/{start,
   suchen}.php-Logik in einem eingebetteten iframe, nur die Optik drumherum
   ist jetzt modern. Breiter als der Standard-.tc-modal (dort reicht die
   Breite fuer die Ticket-Ergebnisliste nicht). */
dialog.tc-modal--gross {
	width: min(720px, 95vw);
}
.tc-modal-body--beziehung {
	gap: 10px;
}
.tc-modal-beziehung-suche {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.tc-modal-beziehung-suchzeile {
	display: flex;
	gap: 8px;
}
.tc-modal-beziehung-suchzeile .tc-modal-input {
	flex: 1 1 auto;
}
.tc-modal-iframe {
	width: 100%;
	height: 420px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	background-color: var(--color-surface);
}
@media (max-width: 560px) {
	.tc-modal-iframe {
		height: 320px;
	}
}

/* AP12 (Gesamtauftrag "BeWo Ticketsystem 2026", 13.09.2026, "Neue
   Druckansicht mit Auswahl-Popup"): Checkbox-/Radio-Gruppen im
   Druckauswahl-Modal (modal-druckauswahl, ticketing/anzeigen/show.php). */
.tc-druckauswahl-gruppe {
	display: flex;
	flex-wrap: wrap;
	gap: 6px 16px;
	padding: 8px 0;
}
.tc-druckauswahl-gruppe + .tc-druckauswahl-gruppe {
	border-top: 1px solid var(--color-border);
}
.tc-druckauswahl-option {
	display: flex;
	align-items: center;
	gap: 6px;
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-text);
	cursor: pointer;
}
.tc-druckauswahl-untergruppe {
	display: flex;
	flex-wrap: wrap;
	gap: 6px 16px;
	padding: 4px 0 4px 24px;
}

/* ==========================================================================
   Ticketerstellung modernisiert (02.09.2026, Auftrag "Ticketerstellung /
   Neues Ticket erstellen analysieren und Frontend modernisieren")
   --------------------------------------------------------------------------
   Betrifft ausschliesslich ticketing/neu/phase1-4.php + kontaktsuche.php +
   includes/navs/nav_ticket_neu.php. Reine Layout-/Darstellungsschicht -
   keine der hier gestylten Klassen ersetzt einen Formularnamen, ein Hidden-
   Feld oder eine Pruefung; die Ausgangsdateien behalten Form-Actions,
   Feldnamen, Suchlogik etc. unveraendert. hgfarbe/eyecatcher (Gruppe/Art)
   bleiben funktional gleich bedeutend (analog --ticket-accent bei Tickets:
   Farbe als dezenter linker Rand statt Vollflaeche), damit ihre bestehende
   Bedeutung erhalten bleibt statt entfernt zu werden.
   ========================================================================== */

.tc-neu-page {
	display: flex;
	flex-direction: column;
	gap: var(--spacing-lg);
	/* Auftrag "Phase IV im Stil von Phase III ueberarbeiten", 03.09.2026,
	   Punkt 1: phase4.php verwendet fuer den Kontaktbereich dieselben
	   .tc-detail-contact*-Klassen wie die Ticket-Detailansicht. Diese lesen
	   --ticket-accent/-dark/-soft/-border, die sonst AUSSCHLIESSLICH
	   innerhalb von .tc-ticket-area definiert werden (siehe dort) - ausserhalb
	   davon sind sie schlicht nicht registriert, nicht bloss "nicht gesetzt
	   mit Fallback". var(--panel-accent, var(--ticket-accent)) wird dadurch
	   insgesamt ungueltig (kein zweiter Fallback vorhanden) und die
	   betroffenen Deklarationen (Hintergrund/Rahmen) fielen komplett aus
	   (Hintergrund wurde unsichtbar/transparent). Hier daher dieselbe
	   neutrale Fallback-Formel wie in .tc-ticket-area selbst, aber OHNE
	   dessen Eigen-Hintergrund/::before-Randstreifen (die sind an die
	   Tabellen-/Kopfzeilen-Struktur der Ticket-Detailseite gebunden und
	   passen nicht zum Formular-Layout hier) - .tc-neu-page ist ohnehin
	   bereits der gemeinsame Wrapper von Phase III/IV, daher hier verankert,
	   nicht an .tc-ticket-area selbst geaendert (keine Auswirkung auf die
	   Ticket-Detailseite). */
	--ticket-accent: var(--color-border-strong);
	--ticket-accent-dark: var(--color-text);
	--ticket-accent-soft: color-mix(in srgb, var(--color-border-strong) 10%, var(--color-surface));
	--ticket-accent-border: color-mix(in srgb, var(--color-border-strong) 28%, var(--color-border));
	/* 1100px -> 1360px (Auftrag "Phase I/II gezielt optimieren",
	   03.09.2026): die Gruppen-/Artenkarten sollen auf breiten Bildschirmen
	   fuenf statt vier pro Zeile zeigen koennen (siehe .tc-neu-card-grid) -
	   bei 1100px waeren fuenf Spalten zu schmal fuer Bild+Text gewesen.
	   Wirkt sich auch auf Phase III/IV aus (mehr Luft fuer die dortigen
	   Formulare), dort aber ohne Nachteil, da deren Grids ohnehin auf
	   min(0,1fr)-Spalten basieren. */
	max-width: 1360px;
}

/* -- Kopf: Titel + Ticketnummer-Chip -------------------------------------- */
.tc-neu-head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--spacing-sm);
}
.tc-neu-lead {
	margin: 0;
	font-family: var(--font-system);
	font-size: 15px;
	color: var(--color-text-muted);
	font-style: italic;
}
.tc-neu-ticketnummer {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 12px;
	border-radius: var(--radius-large);
	background-color: var(--color-info-subtle);
	color: var(--color-primary-dark);
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	white-space: nowrap;
}
.tc-neu-ticketnummer-label {
	font-weight: 400;
	color: var(--color-text-muted);
}

/* -- Schritt-Navigation (linke Spalte, ersetzt die alte Phase-Textliste) -- */
.tc-neu-steps {
	display: flex;
	flex-direction: column;
	gap: 2px;
	font-family: var(--font-system);
}
.tc-neu-step {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 7px 6px;
	border-radius: var(--radius-small);
	font-size: 13px;
	line-height: 1.25;
	color: var(--color-text-muted);
	text-decoration: none;
}
a.tc-neu-step:hover {
	background-color: rgba(47, 69, 146, 0.08);
	color: var(--color-primary-dark);
}
.tc-neu-step-marker {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 11px;
	font-weight: 700;
	border: 2px solid var(--color-border-strong);
	color: var(--color-text-muted);
	background-color: var(--color-surface);
}
.tc-neu-step-marker svg {
	width: 11px;
	height: 11px;
}
.tc-neu-step--done .tc-neu-step-marker {
	border-color: var(--color-success);
	background-color: var(--color-success);
	color: #fff;
}
.tc-neu-step--done {
	color: var(--color-text);
}
.tc-neu-step--active {
	color: var(--color-primary-dark);
	font-weight: 700;
}
.tc-neu-step--active .tc-neu-step-marker {
	border-color: var(--color-primary);
	color: var(--color-primary);
	box-shadow: 0 0 0 3px var(--color-info-subtle);
}
.tc-neu-step--upcoming {
	color: var(--color-text-muted);
	opacity: 0.75;
}

/* -- Karten (Gruppen-/Artenauswahl) --------------------------------------- */
.tc-neu-picker {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
	padding: var(--spacing-md);
	margin-bottom: var(--spacing-md);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
}
.tc-neu-picker-label {
	font-family: var(--font-system);
	font-size: 14px;
	font-weight: 600;
	color: var(--color-text);
	white-space: nowrap;
}
.tc-neu-picker select {
	flex: 1 1 220px;
}

/* Kartengroesse/-raster, 2. Feinschliffrunde (Auftrag "Kartendarstellung
   Phase I/II weiter optimieren", 03.09.2026): Karte ist jetzt ein reines
   <div> (nicht mehr selbst der Link) mit einem "gestreckten Link" als
   Klickflaeche (.tc-neu-card-link::before deckt per position:absolute;
   inset:0 die GESAMTE Karte ab, siehe unten) - dadurch kann der Chevron-
   Button als eigenstaendiges, nicht verschachteltes <button> daneben
   sitzen (ein <button> darf laut HTML-Spezifikation nicht in einem <a>
   verschachtelt sein) und per hoeherem z-index eigene Klicks abfangen,
   ohne dass Kartenklick und Chevron-Klick sich gegenseitig stoeren.
   Spaltenzahl jetzt mobile-first (min-width) gestaffelt, Standard-
   Maximum 4 Spalten (Auftrag Punkt 4: "in Ordnung, wenn nur noch 4"),
   5 Spalten nur noch als Erweiterung ab sehr breiten Bildschirmen, per
   Render-Test mit realen (auch langen) Bezeichnungen als weiterhin gut
   lesbar bestaetigt. */
.tc-neu-card-grid {
	display: grid;
	grid-template-columns: 1fr;
	gap: 12px;
	/* Verhindert, dass eine aufgeklappte Beschreibung in EINER Karte die
	   Grid-Zeile (und damit alle Nachbarkarten) mit in die Hoehe zieht
	   (Auftrag: "Die uebrigen Karten duerfen dabei unveraendert bleiben") -
	   jede Karte behaelt ihre eigene, intrinsische Hoehe. */
	align-items: start;
}
@media (min-width: 620px) {
	.tc-neu-card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 950px) {
	.tc-neu-card-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (min-width: 1300px) {
	.tc-neu-card-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (min-width: 1700px) {
	.tc-neu-card-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}

.tc-neu-card {
	position: relative;
	display: flex;
	align-items: stretch;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	cursor: pointer;
	transition: box-shadow 0.15s ease, transform 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;
}
/* Nutzerauftrag (21.09.2026, "Ticketerstellung: Schnellfilter für Gruppen
   und Arten"): die obige display:flex-Regel überschreibt sonst das native
   [hidden]-Verhalten des Browsers (dessen UA-Regel hat eine niedrigere
   Spezifität als diese Klasse) - js/ticket-neu-karten.js filtert Karten
   ausschließlich über das hidden-Attribut, ohne diese Regel bliebe eine
   "ausgeblendete" Karte trotzdem sichtbar. */
.tc-neu-card[hidden] {
	display: none;
}
/* Hover/Fokus/"Selected" auf ganzer Kartenflaeche (Auftrag "Hover-/Focus-/
   Selected-Darstellung korrigieren", 03.09.2026).
   --------------------------------------------------------------------------
   URSACHE des gemeldeten Fehlers ("nur der Titel faerbt sich"): eine
   GLOBALE, projektweite Regel "a:hover { background-color: var(--color-
   primary); color: #FFF; ... }" (siehe weiter oben in dieser Datei, Basis-
   Selektorenblock) greift auf JEDES <a>-Element - also auch auf
   .tc-neu-card-link. Da :hover auch dann greift, wenn der Zeiger ueber
   einem NACHFAHREN des Elements steht, wurde diese globale Regel bereits
   ausgeloest, sobald der Zeiger ueber dem Linktext (Titel) stand, und
   malte dort eine eigene, kraeftige Flaeche - unabhaengig von der
   deutlich dezenteren .tc-neu-card:hover-Regel auf dem AEUSSEREN
   Container. Ebenso setzte eine globale "a:focus { outline: ... }"-Regel
   einen zweiten, kleinen Fokusring nur um den Linktext. Analog: bereits
   .tc-neu-summary-chip (Zusammenfassungs-Chips) war in der Vorrunde aus
   genau diesem Grund betroffen (siehe dortiger Fix) - hier nun derselbe
   Fehler am eigentlichen Kartenlink behoben, gezielt durch spezifischere
   Kartenregeln ueberschrieben statt die globalen Linkregeln selbst
   anzutasten (die werden an anderer Stelle im Projekt weiterhin gebraucht).
   --------------------------------------------------------------------------
   Es gibt keinen dauerhaft gemerkten Auswahlzustand (jede Karte navigiert
   sofort weiter, nichts wird serverseitig zwischengespeichert) - "Selected"
   wird daher als CSS :active (Klick/Ausloese-Moment, kurz vor dem
   Seitenwechsel) interpretiert: dieselbe Farbfamilie wie Hover/Fokus,
   aber dunklerer Farbton + dauerhaft sichtbarer Check-Hinweis statt nur
   angedeutet, damit sich beide Zustaende nicht widersprechen. */
.tc-neu-card:hover,
.tc-neu-card:has(.tc-neu-card-link:focus-visible),
.tc-neu-card--fokussiert,
.tc-neu-card:has(.tc-neu-card-link:active) {
	background-color: var(--color-primary);
	border-color: var(--tc-neu-accent, var(--color-primary-dark));
	box-shadow: var(--shadow-medium);
	transform: translateY(-1px);
}
.tc-neu-card:has(.tc-neu-card-link:active) {
	background-color: var(--color-primary-dark);
}
/* Der Link selbst darf keine eigene, abweichende Hover-/Fokus-Flaeche mehr
   zeigen (siehe Ursachenerklaerung oben) - er ist optisch vollstaendig
   Teil der Karte, nicht mehr als Element erkennbar. */
.tc-neu-card-link,
.tc-neu-card-link:hover,
.tc-neu-card-link:active {
	background-color: transparent;
	text-decoration: none;
	border-radius: 0;
}
/* Akzentflaeche (Auftrag Punkt 5, 3. Feinschliffrunde): schmaler als in
   der vorigen Runde (10px -> 6px), damit sie als Kennzeichnung erkennbar
   bleibt, ohne wie ein fremder Balken zu wirken. Eigenes Element statt
   border-left, damit die Eckenrundung der Karte exakt mitgezogen werden
   kann. Bleibt bei Hover/Fokus/Selected sichtbar (eigene Randfarbe der
   Karte uebernimmt ohnehin bereits denselben Farbton, siehe oben). */
.tc-neu-card-accent {
	flex: 0 0 6px;
	background-color: var(--tc-neu-accent, var(--color-border-strong));
	border-top-left-radius: var(--radius-medium);
	border-bottom-left-radius: var(--radius-medium);
}
/* .tc-neu-card-main/-head/-desc (Auftrag Punkt 3, 3. Feinschliffrunde):
   das Bild gehoert jetzt in einen eigenen FESTEN Kopfbereich
   (.tc-neu-card-head), getrennt von der aufklappbaren Beschreibung
   (.tc-neu-card-desc) - beide sind vertikal gestapelte Geschwister
   innerhalb von .tc-neu-card-main, NICHT mehr Teil derselben
   align-items:stretch-Zeile wie das Bild. Dadurch kann die Beschreibung
   wachsen, ohne dass das Bild dabei mitgezogen/gestreckt wird (vorheriger
   Fehler: Bild und Textspalte waren direkte Geschwister EINER Flex-Zeile,
   ein hoeherer Textbereich stretchte automatisch auch das Bild).
   WICHTIG: .tc-neu-card-main bleibt bewusst OHNE eigenes position, sonst
   wuerde es (statt .tc-neu-card) zum Bezugsrahmen fuer
   .tc-neu-card-link::before werden (siehe Kommentar dort - derselbe
   Fehler wie zuvor bei .tc-neu-card-body, per Klicktest gefunden). */
.tc-neu-card-main {
	min-width: 0;
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
}
.tc-neu-card-head {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 10px;
}
/* Fester Bildbereich (Auftrag Punkt 4): feste Breite UND Hoehe, unabhaengig
   vom Auf-/Zuklappen der Beschreibung. object-fit:contain (statt cover)
   verzerrt/beschneidet unterschiedlichste Bildformate/-seitenverhaeltnisse
   nie - ein dezenter Flaechenhintergrund faengt das dadurch moegliche
   Letterboxing bei nicht-quadratischen Bildern auf. */
.tc-neu-card-image-wrap {
	position: relative;
	flex: 0 0 auto;
	width: 56px;
	height: 56px;
	border-radius: var(--radius-small);
	background-color: var(--color-background);
	overflow: hidden;
	display: flex;
	align-items: center;
	justify-content: center;
}
.tc-neu-card-image {
	max-width: 100%;
	max-height: 100%;
	object-fit: contain;
	display: block;
}
/* Optionaler "Check"-Hinweis (Auftrag Punkt 12B): erscheint nur bei
   Hover/Tastaturfokus der Karte als kleiner Zusatzhinweis "das hier
   waere Ihre Auswahl" - kein Dauerelement, daher keine Konkurrenz zu
   Titel/Bild (Auftrag Punkt 10/12D: die muessen visuell wichtiger
   bleiben). */
.tc-neu-card-select-hint {
	position: absolute;
	right: -4px;
	bottom: -4px;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background-color: var(--tc-neu-accent, var(--color-primary));
	color: #fff;
	display: flex;
	align-items: center;
	justify-content: center;
	opacity: 0;
	transform: scale(0.7);
	box-shadow: var(--shadow-small);
	transition: opacity 0.15s ease, transform 0.15s ease;
}
.tc-neu-card-select-hint .tc-icon {
	width: 9px;
	height: 9px;
	stroke-width: 2.6;
}
.tc-neu-card:hover .tc-neu-card-select-hint,
.tc-neu-card:has(.tc-neu-card-link:focus-visible) .tc-neu-card-select-hint,
.tc-neu-card--fokussiert .tc-neu-card-select-hint {
	opacity: 1;
	transform: scale(1);
}
/* "Selected" (:active): Check-Hinweis dauerhaft eingeblendet statt nur
   angedeutet (Auftrag Punkt 5/12B) - selbe Position/Farbe, damit Hover
   und Selected sich nicht widersprechen, nur der Zustand "endgueltiger"
   wirkt. Eigene helle Kontur, da der Hinweis jetzt auf dem bereits
   dunklen Kartenbild-Hintergrund sitzt. */
.tc-neu-card:has(.tc-neu-card-link:active) .tc-neu-card-select-hint {
	opacity: 1;
	transform: scale(1);
	background-color: #fff;
	color: var(--color-primary-dark);
}
.tc-neu-card-title-row {
	min-width: 0;
	flex: 1 1 auto;
	display: flex;
	align-items: flex-start;
	gap: 6px;
}
.tc-neu-card-link {
	display: block;
	min-width: 0;
	flex: 1 1 auto;
	/* Auftrag Punkt 7: bewusst OHNE jede klassische Linkoptik (keine
	   Unterstreichung, keine eigene Linkfarbe) - die ganze Karte ist die
	   Interaktionsflaeche, der Link selbst soll optisch unsichtbar sein. */
	text-decoration: none;
	color: inherit;
}
/* "Gestreckter Link": deckt per Pseudo-Element die GESAMTE Karte ab
   (positioniert sich gegen .tc-neu-card, den naechsten Vorfahren mit
   position:relative - .tc-neu-card-link selbst bleibt bewusst OHNE
   eigenes position, sonst wuerde sich das Pseudo-Element nur auf den
   Titeltext strecken). So bleibt "Klick auf die Karte waehlt aus" exakt
   erhalten, obwohl der Link nur noch den Titeltext umschliesst. */
.tc-neu-card-link::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}
/* Titel (Auftrag Punkt 1): Schriftgroesse beibehalten, Schriftstaerke
   deutlich reduziert (800 -> 600) - dominant genug fuer schnelle
   Erkennung, aber nicht mehr "klobig". */
.tc-neu-card-title {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
	font-family: var(--font-system);
	font-size: 18px;
	font-weight: 600;
	line-height: 1.25;
	color: var(--color-text);
	transition: color 0.15s ease;
}
/* Chevron-Button (Auftrag Punkt 9): kleiner/randlos statt eines zweiten,
   rund umrahmten Hauptbuttons - bleibt trotzdem gut klickbar (24x24px
   Klickflaeche bei nur 11px sichtbarem Icon). Eigenstaendiges <button>,
   KEIN Kind des Links (siehe Kommentar oben an .tc-neu-card-grid) - liegt
   dank z-index ueber dem gestreckten Link und faengt eigene Klicks/
   ENTER/LEERTASTE ab, ohne dass ein <a> ein <button> enthalten muesste. */
.tc-neu-card-chevron {
	position: relative;
	z-index: 2;
	flex: 0 0 auto;
	width: 24px;
	height: 24px;
	padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: transparent;
	border: none;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	cursor: pointer;
	transition: color 0.15s ease;
}
/* Eigene, dezente Hervorhebung beim direkten Hover UEBER dem Chevron
   selbst (Auftrag Punkt 7) - unabhaengig davon, ob die Karte gerade
   dunkel eingefaerbt ist (siehe Regel darunter) oder nicht: hellgrau im
   normalen, halbtransparent-weiss im dunklen Kartenzustand. Loest dabei
   NIE die Kartenauswahl aus (eigenstaendiges <button>, siehe oben). */
.tc-neu-card-chevron:hover {
	background-color: var(--color-background);
	color: var(--color-text);
}
.tc-neu-card:hover .tc-neu-card-chevron:hover,
.tc-neu-card:has(.tc-neu-card-link:focus-visible) .tc-neu-card-chevron:hover,
.tc-neu-card--fokussiert .tc-neu-card-chevron:hover,
.tc-neu-card:has(.tc-neu-card-link:active) .tc-neu-card-chevron:hover {
	background-color: rgba(255, 255, 255, 0.25);
	color: #fff;
}
.tc-neu-card-chevron:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 1px;
}
.tc-neu-card-chevron .tc-icon {
	/* Chevron-Icon zeigt nativ nach rechts - im Ruhezustand (zugeklappt)
	   90deg gedreht = zeigt nach unten ("zum Aufklappen"), analog zum
	   bereits bestehenden Muster bei .tc-status-chevron. */
	width: 11px;
	height: 11px;
	transform: rotate(90deg);
	transition: transform 0.15s ease;
}
.tc-neu-card-chevron[aria-expanded="true"] .tc-icon {
	transform: rotate(-90deg);
}
/* Beschreibung (Auftrag Punkt 2/8): eigener Aufklappbereich UNTERHALB des
   festen Kopfes (nicht mehr in dessen Flex-Zeile), mit feiner Trennlinie
   nur im geoeffneten Zustand, groesserer/besser lesbarer Schrift (12px ->
   14px, line-height 1.45) und etwas mehr Innenabstand. Standardmaessig
   eingeklappt (Auftrag Punkt 3) - rein CSS-basiert per max-height/opacity,
   damit der Ausgangszustand auch ohne/vor JS-Ausfuehrung bereits korrekt
   "zu" ist (kein Aufblitzen). */
.tc-neu-card-desc {
	display: block;
	margin: 0;
	max-height: 0;
	overflow: hidden;
	opacity: 0;
	padding: 0 12px;
	border-top: 0 solid var(--color-border);
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-text-muted);
	line-height: 1.45;
	transition: max-height 0.2s ease, opacity 0.18s ease, padding 0.2s ease, color 0.15s ease, border-color 0.15s ease;
}
.tc-neu-card-desc--offen {
	max-height: 320px;
	opacity: 1;
	padding: 10px 12px 12px 12px;
	border-top-width: 1px;
}
/* Ziffern-Schnellauswahl-Badge (Auftrag Punkt 10): weiterhin klein/dezent,
   deutlich unauffaelliger als Titel/Bild. Liegt (wie der Chevron) ueber
   dem gestreckten Link, damit sein eigener Hover-Tooltip ("Taste N zur
   Auswahl") zuverlaessig erscheint. aria-hidden im Markup, da rein
   visueller Zusatzhinweis - TAB/ENTER/LEERTASTE funktionieren ohnehin
   unabhaengig davon. */
.tc-neu-card-key {
	position: absolute;
	z-index: 2;
	top: 4px;
	right: 4px;
	min-width: 15px;
	height: 15px;
	padding: 0 3px;
	border-radius: 999px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border-strong);
	color: var(--color-text-muted);
	font-family: var(--font-system);
	font-size: 9px;
	font-weight: 700;
	line-height: 13px;
	text-align: center;
	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
/* Textinversion bei Hover/Fokus/Selected (Auftrag Punkt 2/8/9): Titel,
   ggf. geoeffnete Beschreibung (inkl. Trennlinie) und Ziffern-Badge
   bekommen auf der jetzt dunklen Kartenflaeche helle/weisse Farben, damit
   nirgends dunkler Text auf dunklem Grund entsteht. Chevron-Grundfarbe
   ebenso (die eigene, zusaetzliche Hover-Kontur des Chevrons selbst steht
   weiter oben). */
.tc-neu-card:hover .tc-neu-card-title,
.tc-neu-card:has(.tc-neu-card-link:focus-visible) .tc-neu-card-title,
.tc-neu-card--fokussiert .tc-neu-card-title,
.tc-neu-card:has(.tc-neu-card-link:active) .tc-neu-card-title {
	color: #fff;
}
.tc-neu-card:hover .tc-neu-card-desc,
.tc-neu-card:has(.tc-neu-card-link:focus-visible) .tc-neu-card-desc,
.tc-neu-card--fokussiert .tc-neu-card-desc,
.tc-neu-card:has(.tc-neu-card-link:active) .tc-neu-card-desc {
	color: rgba(255, 255, 255, 0.92);
	border-top-color: rgba(255, 255, 255, 0.3);
}
.tc-neu-card:hover .tc-neu-card-chevron,
.tc-neu-card:has(.tc-neu-card-link:focus-visible) .tc-neu-card-chevron,
.tc-neu-card--fokussiert .tc-neu-card-chevron,
.tc-neu-card:has(.tc-neu-card-link:active) .tc-neu-card-chevron {
	color: #fff;
}
.tc-neu-card:hover .tc-neu-card-key,
.tc-neu-card:has(.tc-neu-card-link:focus-visible) .tc-neu-card-key,
.tc-neu-card--fokussiert .tc-neu-card-key,
.tc-neu-card:has(.tc-neu-card-link:active) .tc-neu-card-key {
	background-color: rgba(255, 255, 255, 0.9);
	border-color: rgba(255, 255, 255, 0.9);
	color: var(--color-primary-dark);
}
/* Deutlich sichtbarer, layoutneutraler Tastaturfokus (nur bei
   Tastaturbedienung, nicht bei Mausklick - :focus-visible). In Browsern
   OHNE :has()-Unterstuetzung faellt dies auf einen kleinen Ring direkt um
   den Linktext zurueck (besser als gar keiner); alle gaengigen aktuellen
   Browser unterstuetzen :has() und zeigen stattdessen NUR den grossen,
   ganzkartigen Ring (siehe @supports) - kein doppelter Ring. Outline statt
   Groessen-/Abstandsaenderung, damit sich nichts verschiebt. */
.tc-neu-card-link:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
@supports selector(:has(a)) {
	.tc-neu-card-link:focus-visible {
		outline: none;
	}
}
.tc-neu-card:has(.tc-neu-card-link:focus-visible),
.tc-neu-card--fokussiert {
	outline: 3px solid var(--tc-neu-accent, var(--color-primary-dark));
	outline-offset: 2px;
}

/* -- Zusammenfassungsleiste (Phase III/IV: Gruppe/Art/Kontakt) ------------ */
.tc-neu-summary {
	display: flex;
	flex-wrap: wrap;
	gap: var(--spacing-sm);
	margin-bottom: var(--spacing-md);
}
/* Korrektur (Auftrag "Kartendarstellung Phase I/II visuell korrigieren",
   03.09.2026, Punkt 13): das gesamte Chip-Element ist bei Gruppe/Art ein
   <a> (siehe phase2.php/phase3.php), bekam aber bisher KEINE eigene
   color/text-decoration - dadurch schlug die Browser-Grundformatierung
   fuer <a> (blaue Unterstreichung) durch, obwohl die vormalige Regel
   ".tc-neu-summary-chip a.tc-neu-summary-chip-value" das eigentlich
   verhindern sollte (sie griff nie, da .tc-neu-summary-chip-value in der
   Markup-Seite immer ein <span>, nie ein <a> ist). Jetzt direkt am Chip
   selbst neutralisiert plus als modernes Chip/Badge mit dezentem
   Hover-Zustand gestaltet statt klassischem Link. */
.tc-neu-summary-chip {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 6px 12px;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-left: 4px solid var(--tc-neu-accent, var(--color-border-strong));
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	font-family: var(--font-system);
	font-size: 13px;
	text-decoration: none;
	color: inherit;
	transition: box-shadow 0.15s ease, border-color 0.15s ease;
}
a.tc-neu-summary-chip:hover {
	border-color: var(--tc-neu-accent, var(--color-border-strong));
	box-shadow: var(--shadow-medium);
}
a.tc-neu-summary-chip:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-neu-summary-chip img {
	width: 22px;
	height: 22px;
	border-radius: var(--radius-small);
	object-fit: cover;
}
.tc-neu-summary-chip-label {
	color: var(--color-text-muted);
	margin-right: 2px;
}
.tc-neu-summary-chip-value {
	font-weight: 600;
	color: var(--color-text);
}

/* -- Allgemeine Panel/Card-Bausteine --------------------------------------- */
.tc-neu-panel {
	padding: var(--spacing-md);
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
}
.tc-neu-panel + .tc-neu-panel {
	margin-top: var(--spacing-md);
}
.tc-neu-panel-title {
	margin: 0 0 10px 0;
	font-family: var(--font-system);
	font-size: 15px;
	font-weight: 700;
	color: var(--color-text);
}
/* Panel-Kopfzeile mit optionaler Zusatzaktion rechts (Auftrag "Phase III
   gezielt ueberarbeiten", 03.09.2026, Punkt 6) - z. B. der Button "Meine
   Benutzerdaten eintragen" neben der Ueberschrift "Neue Kontaktdaten
   aufnehmen". */
.tc-neu-panel-head {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	margin-bottom: 10px;
}
.tc-neu-panel-head .tc-neu-panel-title {
	margin-bottom: 0;
}
/* Bewusst zurueckhaltender ("Komfortfunktion", Auftrag Punkt 13) als der
   eigentliche Absenden-Button (.EingabeButtonKlein) - aber sichtbar
   hinterlegt statt der vormals fast weissen Umriss-Optik (Auftrag "Phase
   III weiter optimieren", 03.09.2026, Punkt A4: "wirkt zu blass", "muss
   sich klar vom weissen Hintergrund abheben, darf aber nicht staerker
   wirken als die Hauptaktion"). Dezenter blauer Hintergrundton
   (--color-info-subtle) + blaue Umrandung/Schrift statt Vollflaeche -
   bleibt dadurch klar als sekundaere Aktion neben dem vollflaechig blauen
   "Diesem Ticket zuordnen" erkennbar.
*/
.tc-neu-panel-action {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 12px;
	background-color: var(--color-info-subtle);
	border: 1px solid var(--color-primary);
	border-radius: var(--radius-small);
	color: var(--color-primary-dark);
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	cursor: pointer;
	white-space: nowrap;
}
.tc-neu-panel-action:hover {
	background-color: var(--color-primary);
	border-color: var(--color-primary-dark);
	color: #FFF;
}
.tc-neu-panel-action:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}

/* -- Phase III: Kontaktspalten (Suche | Neu/Quellticket) ------------------ */
.tc-neu-contact-columns {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: var(--spacing-md);
	/* AP1 (Gesamtauftrag "BeWo Ticketsystem 2026", 13.09.2026,
	   "Ticketerstellung Schritt 3"): "align-items: start" liess beide
	   Panels auf ihre eigene Inhaltshoehe schrumpfen - je nach
	   Suchergebnis-/Formularlaenge endeten beide Karten sichtbar auf
	   unterschiedlicher Hoehe. "stretch" (Grid-Standardverhalten) laesst
	   beide Panels auf die Hoehe der jeweils hoeheren Spalte anwachsen;
	   damit auch der Inhalt (insbesondere das Ergebnis-iframe links)
	   tatsaechlich mitwaechst statt nur der leere Kartenrahmen, werden
	   beide .tc-neu-panel hier zusaetzlich zu einer Flex-Spalte (siehe
	   unten) - bewusst nur innerhalb dieser Spaltenansicht gescopt, damit
	   die sonst project­weit genutzte .tc-neu-panel-Basisklasse
	   unveraendert bleibt. */
	align-items: stretch;
}
.tc-neu-contact-columns .tc-neu-panel {
	display: flex;
	flex-direction: column;
}
.tc-neu-contact-columns .tc-neu-search-results {
	flex: 1 1 auto;
	display: flex;
}
.tc-neu-contact-columns .tc-neu-search-results iframe {
	flex: 1 1 auto;
	height: 100%;
}
.tc-neu-search-hint {
	margin: 4px 0 10px 0;
	font-family: var(--font-system);
	font-size: 12px;
	color: var(--color-text-muted);
}
.tc-neu-search-row {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin-bottom: 10px;
}
.tc-neu-search-row input[type="text"] {
	flex: 1 1 180px;
}
.tc-neu-search-filters {
	display: flex;
	flex-wrap: wrap;
	gap: 4px 14px;
	font-family: var(--font-system);
	font-size: 13px;
	color: var(--color-text-muted);
}
.tc-neu-search-filters label {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	cursor: pointer;
}
.tc-neu-search-results {
	margin-top: 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	overflow: hidden;
	background-color: var(--color-background);
}
.tc-neu-search-results iframe {
	display: block;
	width: 100%;
	min-height: 320px;
	border: 0;
}

/* Ergebniskarten innerhalb von kontaktsuche.php (im iframe gerendert),
   ueberarbeitet Auftrag "Phase III gezielt ueberarbeiten" (03.09.2026,
   Punkt 1/2/3): die Karte ist jetzt direkt das <form> selbst (statt eines
   umschliessenden <div> um ein <form>) und optisch klar in Kopf-
   (Name/Firma, Nummer, Herkunft-Badge) und Inhaltsbereich (Ansprech-
   partner, Kontaktdaten, Adresse) gegliedert, damit Treffer schnell
   erfassbar sind statt als ein langer Textblock zu wirken. Die gesamte
   Karte ist per js/ticket-neu-suchergebnis.js klickbar/absendbar (siehe
   dort) - Auswahlmechanik/Feldnamen/Formular-Ziel bleiben dabei exakt
   unveraendert, nur die Ausloesung per Klick auf die gesamte Flaeche
   kommt hinzu. */
.tc-neu-result-card {
	display: block;
	position: relative;
	padding: 9px 14px;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	font-family: var(--font-system);
	cursor: pointer;
	transition: box-shadow 0.15s ease, border-color 0.15s ease, background-color 0.15s ease;
}
.tc-neu-result-card:hover,
.tc-neu-result-card:focus-within {
	border-color: var(--color-primary);
	box-shadow: var(--shadow-medium);
	background-color: color-mix(in srgb, var(--color-primary) 4%, var(--color-surface));
}
/* "Phase III weiter optimieren" (03.09.2026, Punkt C5): sichtbarer Fokus-
   Rahmen fuer Tastaturbedienung - die Karte ist seit diesem Auftrag selbst
   per tabindex="0" fokussierbar (der zuvor sichtbare Button entfaellt,
   siehe kontaktsuche.php). Zusaetzlich ein kurzer "Aktiv"-Zustand beim
   Anklicken/Ausloesen (:active), damit die Auswahl auch optisch spuerbar
   ist, bevor die Seite weiterleitet. */
.tc-neu-result-card:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-neu-result-card:active {
	background-color: color-mix(in srgb, var(--color-primary) 9%, var(--color-surface));
}
.tc-neu-result-card + .tc-neu-result-card {
	margin-top: 9px;
}
.tc-neu-result-head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 10px;
	padding-bottom: 7px;
	margin-bottom: 7px;
	border-bottom: 1px solid var(--color-border);
}
.tc-neu-result-name {
	font-size: 14px;
	font-weight: 700;
	color: var(--color-text);
}
.tc-neu-result-meta {
	flex: 0 0 auto;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 4px;
}
.tc-neu-result-nummer {
	font-size: 12px;
	color: var(--color-text-muted);
}
.tc-neu-result-badge {
	display: inline-block;
	padding: 2px 8px;
	border-radius: 999px;
	background-color: var(--color-info-subtle);
	color: var(--color-primary-dark);
	font-size: 11px;
	font-weight: 600;
	white-space: nowrap;
}
/* Kontaktsuche-Ueberarbeitung (19.09.2026): dezente Hervorhebung der
   gefundenen Suchbegriffe innerhalb eines Treffers - bewusst nur farbliche
   Unterlegung, keine zusaetzliche Umrandung/Fettung, um die ohnehin schon
   kompakten Karten nicht zu ueberladen. */
.tc-neu-result-treffer {
	background-color: var(--color-warning-subtle);
	border-radius: 3px;
	padding: 0 1px;
}
.tc-neu-result-body {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: 5px 14px;
	font-size: 13px;
}
.tc-neu-result-row--full {
	grid-column: 1 / -1;
}
.tc-neu-result-label {
	display: block;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var(--color-text-muted);
	margin-bottom: 2px;
}
/* Ersetzt den vormals sichtbaren Submit-Button innerhalb der Karte (Punkt
   C1) - das <input type="submit"> bleibt technisch im Formular vorhanden
   (identische POST-Daten wie zuvor, kein Funktionsverlust), ist aber
   visuell entfernt und ueber tabindex="-1"/aria-hidden aus Tab-Reihenfolge
   und Screenreader-Ausgabe genommen, da die Karte selbst diese Rolle jetzt
   uebernimmt. Klassisches "sr-only"/visuell-verstecken-Muster statt
   display:none, falls ein Formular-Submit ohne vorhandenen Button in
   Ausnahmefaellen (aeltere Browser) doch einen Submitter erwartet. */
.tc-neu-result-submit-sr {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}
.tc-neu-result-count {
	font-family: var(--font-system);
	font-size: 13px;
	color: var(--color-text-muted);
	margin: 0 0 10px 0;
}

/* -- Formularabschnitte (Kontakt neu / Quellticket / Ticketdaten) --------- */
.tc-neu-field-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 8px 12px;
}
.tc-neu-field-grid--full > * {
	grid-column: 1 / -1;
}
.tc-neu-field {
	display: flex;
	flex-direction: column;
	gap: 3px;
	min-width: 0;
}
/* Kompaktere Feldhoehe/-innenabstaende NUR innerhalb der neu gegliederten
   Formularabschnitte (Punkt A3: "wirkt zu gross und zu weich") - bewusst
   scoped statt am global geteilten .EingabeFeld/.EingabeFeldKlein, damit
   keine andere Seite im Projekt mitbetroffen ist (auch der unveraenderte
   Quellticket-Zweig unten auf dieser Seite bleibt dadurch unangetastet). */
.tc-neu-form-section .EingabeFeld,
.tc-neu-form-section select.EingabeFeld {
	min-height: 32px;
	padding: 6px 9px;
	font-size: 14px;
}
.tc-neu-field--wide {
	grid-column: 1 / -1;
}
.tc-neu-field label,
.tc-neu-field-label {
	font-family: var(--font-system);
	/* Auftrag "Freifeld-Schriftgroessen" (13.09.2026): auf die Groesse der
	   normalen Eingabefelder (.EingabeFeld, 15px) angehoben - vorher 12px,
	   damit deutlich kleiner als der eigentliche Feldinhalt. */
	font-size: 15px;
	font-weight: 600;
	color: var(--color-text-muted);
}
.tc-neu-field input,
.tc-neu-field select,
.tc-neu-field textarea {
	width: 100%;
	box-sizing: border-box;
}
/* Mehrzeilige Freitextfelder (Auftrag "Phase III/IV weiter optimieren",
   03.09.2026, Punkt A1/B2): Bemerkungen (Phase III) und Inhalt (Phase IV)
   sollen als echte, ausreichend hohe Textareas statt einzeiliger Felder
   wirken - vertikal vergroesserbar (wie das bereits bestehende
   .tc-modal-textarea-Vorbild), Breitenanpassung bewusst nicht erlaubt
   (haette bei width:100% aus .tc-neu-field textarea/select/input sonst
   ein seitliches Herausziehen ueber den Container hinaus ermoeglicht).
   Zusaetzliche, mit .tc-neu-form-section praefixierte Regel noetig, da die
   dortige Feld-Kompaktierung (.tc-neu-form-section .EingabeFeld,
   min-height:32px) sonst per hoeherer Spezifitaet (zwei Klassen) gewinnen
   und diese Textareas wieder auf 32px zusammenstauchen wuerde. */
.tc-neu-textarea-mehrzeilig {
	min-height: 78px;
	resize: vertical;
	line-height: 1.4;
}
.tc-neu-form-section .tc-neu-textarea-mehrzeilig {
	min-height: 78px;
}
.tc-neu-field-plz-ort {
	display: flex;
	gap: 8px;
}
.tc-neu-field-plz-ort input:first-child {
	flex: 0 0 90px;
}
.tc-neu-field-plz-ort input:last-child {
	flex: 1 1 auto;
}
.tc-neu-checkbox-list {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-family: var(--font-system);
	font-size: 14px;
	color: var(--color-text);
}
.tc-neu-checkbox-list label {
	display: flex;
	align-items: center;
	gap: 6px;
	cursor: pointer;
}
.tc-neu-actions {
	margin-top: var(--spacing-md);
	display: flex;
	justify-content: flex-end;
}

/* -- Formularabschnitte "Neue Kontaktdaten aufnehmen" (Auftrag "Phase III
   gezielt ueberarbeiten", 03.09.2026, Punkt 4/14/15; verdeutlicht im
   Folgeauftrag "Phase III weiter optimieren", 03.09.2026, Punkt A1-A3):
   gliedert die vormals flache Feldliste in benannte Abschnitte
   (Basisdaten/Organisation/Adresse/Kontaktdaten/Sonstiges), ohne
   Feldnamen/Reihenfolge/Formularziel zu aendern - reine Struktur-/
   Optikgliederung. Jeder Abschnitt ist jetzt eine eigene, sichtbar
   hinterlegte Flaeche (statt nur einer duennen oberen Trennlinie), damit
   sich die Bloecke klar vom weissen Formularhintergrund UND
   voneinander abheben ("nicht alles weiss auf weiss") - kompaktere
   Innenabstaende/Abstaende zwischen den Abschnitten als zuvor. */
.tc-neu-form-section {
	padding: 12px 14px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
}
.tc-neu-form-section + .tc-neu-form-section {
	margin-top: var(--spacing-sm);
}
.tc-neu-form-section-title {
	margin: 0 0 8px 0;
	padding-bottom: 6px;
	border-bottom: 1px solid var(--color-border-strong);
	font-family: var(--font-system);
	font-size: 12.5px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--color-primary-dark);
}
/* Zweispaltiger Bereich Adresse | Kontaktdaten (Punkt B/B2) - zwei
   gleichrangige Abschnittskarten nebeneinander, wenn die Breite reicht;
   Umbruch siehe Responsive-Media-Query weiter unten. */
.tc-neu-form-columns {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: var(--spacing-sm);
}
.tc-neu-form-columns .tc-neu-form-section {
	margin-top: 0;
}
/* Asymmetrischer zweispaltiger Ticketdatenbereich in Phase IV (Auftrag
   "Phase III/IV weiter optimieren", 03.09.2026, Punkt B1/B6): links das
   grosse Freitextfeld "Inhalt" (+ "Ticket-Einstellungen" darunter),
   rechts die ticketartspezifischen Zusatzfelder - links bewusst breiter
   (ca. 58/42), damit das Inhaltsfeld grosszuegig wirkt, ohne die rechte
   Spalte zu quetschen. Modifikator auf der bereits bestehenden
   .tc-neu-form-columns-Basisklasse (Adresse/Kontaktdaten in Phase III
   nutzen weiterhin die gleichrangige 1:1-Aufteilung ohne diese Klasse) -
   der bestehende Umbruch auf 1 Spalte unter 900px greift automatisch mit,
   da dort weiterhin ueber die Basisklasse .tc-neu-form-columns selektiert
   wird (siehe Responsive-Media-Query weiter unten). */
.tc-neu-form-columns--asym {
	grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
	/* align-items bewusst NICHT auf "start" gesetzt (frueherer Stand) -
	   der CSS-Grid-Standardwert "stretch" wird jetzt gebraucht, damit die
	   linke Spalte auf die tatsaechlich gerenderte Hoehe der rechten
	   Spalte gestreckt wird (Feinjustierung "Phase IV noch einmal gezielt
	   feinjustieren", 03.09.2026, Punkt 2-6: Inhaltsfeld soll dynamisch mit
	   der rechten Spalte mitwachsen). Rein deklarativ ueber CSS Grid/
	   Flexbox geloest statt per JS/ResizeObserver - reagiert dadurch von
	   selbst auf jede Neuberechnung (unterschiedliche Ticketarten,
	   Fenstergroessenaenderung, Schriftgroessen-Zoom) ohne eigenen Code,
	   ohne Timing-Problematik und ohne Resize-Endlosschleifen-Risiko. */
}
/* Linke Spalte ist kein einzelner .tc-neu-form-section mehr, sondern ein
   schlichter Stapel aus Betreff-Abschnitt, Beschreibung-Abschnitt und der
   separaten, weiterhin eigenstaendigen Ticket-Einstellungen-Ausklappkarte
   (.tc-neu-settings-panel behaelt ihre eigene Ein-/Ausblende-Funktion
   unveraendert - siehe phase4.php) - deshalb flex-Stapel statt eines
   eigenen Kartenrahmens um alles herum. Da .tc-neu-form-columns--asym
   diese Spalte jetzt auf die Hoehe der rechten Spalte streckt (siehe
   oben), bekommt genau EIN Kind hier (der Beschreibung-Abschnitt,
   .tc-neu-form-section--inhalt) das Wachstum zugewiesen (flex-grow) -
   Betreff-Abschnitt und Einstellungen-Karte behalten ihre natuerliche
   Groesse. */
.tc-neu-form-column-left {
	display: flex;
	flex-direction: column;
	gap: var(--spacing-sm);
	min-width: 0;
}
/* Nimmt den kompletten, durch das Strecken der Spalte entstandenen
   Hoehenzuwachs auf (min-height:0 ist hier zwingend noetig - ohne das
   wuerde der Flex-Kindstandardwert min-height:auto verhindern, dass
   dieser Block ueberhaupt kleiner/groesser als sein natuerlicher Inhalt
   werden kann, ein bekannter Flexbox-Stolperstein). */
.tc-neu-form-section--inhalt {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	min-height: 0;
}
.tc-neu-form-section--inhalt .tc-neu-field-grid {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	min-height: 0;
}
.tc-neu-form-section--inhalt .tc-neu-field {
	flex: 1 1 auto;
	min-height: 0;
}
/* Das grosse Inhalt-Feld soll "grosszuegig wirken" (Punkt B2) - deutlich
   hoeher als die uebrige Mehrzeilig-Grundgroesse von
   .tc-neu-textarea-mehrzeilig; 220px bleibt dabei die GARANTIERTE
   Mindesthoehe (min-height wirkt immer als Untergrenze, auch wenn
   height/flex-basis rechnerisch kleiner waeren) - height:100% + flex:1
   lassen das Feld zusaetzlich bis zur Hoehe seines (ggf. gestreckten)
   Eltern-Kettenglieds mitwachsen, sobald die rechte Spalte hoeher ist.
   Im schmalen/umgebrochenen Layout (siehe Responsive-Media-Query weiter
   unten) greift KEIN Strecken (jede Spalte bildet dort ihre eigene
   Grid-Zeile mit genau einem Element), wodurch das Feld automatisch nur
   auf seiner Mindesthoehe bleibt, ohne eigene Media-Query-Sonderregel. */
.tc-neu-form-section .tc-neu-textarea-inhalt {
	min-height: 220px;
	height: 100%;
	flex: 1 1 auto;
}
/* Reihe Anrede | Vorname | Nachname (Punkt B1) - eigene 3-spaltige
   Variante des bestehenden Feldrasters, Nummer bleibt darueber als
   eigene, volle Zeile (bereits per .tc-neu-field--wide). */
.tc-neu-field-grid--3col {
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
}
.tc-neu-required {
	color: var(--color-danger);
	margin-left: 2px;
}
.tc-neu-field-error {
	font-family: var(--font-system);
	font-size: 12px;
	font-weight: 600;
	color: var(--color-danger);
}
.tc-neu-field--invalid input {
	border-color: var(--color-danger);
}

/* -- Pflichtfeld-Fehlermeldung "Nachname fehlt" (Punkt 5) ----------------- */
.tc-neu-error-banner {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 14px;
	margin-bottom: var(--spacing-md);
	background-color: var(--color-danger-subtle);
	border: 1px solid var(--color-danger);
	border-radius: var(--radius-medium);
	color: var(--color-danger-dark);
	font-family: var(--font-system);
	font-size: 14px;
	font-weight: 600;
}

/* -- Duplikat-/Andere-offene-Tickets-Warnung ------------------------------ */
.tc-neu-warning {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 14px;
	margin-bottom: var(--spacing-md);
	background-color: var(--color-warning-subtle);
	border: 1px solid var(--color-warning);
	border-radius: var(--radius-medium);
	color: var(--color-warning-dark);
	font-family: var(--font-system);
}
.tc-neu-warning-icon {
	flex: 0 0 auto;
	color: var(--color-warning);
}
.tc-neu-warning-icon svg {
	width: 20px;
	height: 20px;
}
.tc-neu-warning-text {
	flex: 1 1 auto;
	font-size: 14px;
	font-weight: 600;
}
.tc-neu-warning .tc-neu-warning-link {
	flex: 0 0 auto;
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-warning-dark);
	background-color: var(--color-surface);
	border: 1px solid var(--color-warning);
	border-radius: var(--radius-small);
	padding: 6px 12px;
	text-decoration: none;
	white-space: nowrap;
}
.tc-neu-warning .tc-neu-warning-link:hover {
	background-color: var(--color-warning-subtle);
}

/* -- Doppelticket-Pruefkarte (Phase IV, "Andere offene Tickets zum Kontakt
   gefunden") - eigene, deutlich staerkere Stufe als die schmale
   .tc-neu-warning-Zeile oben (Auftrag "Phase IV im Stil von Phase III
   ueberarbeiten", 03.09.2026, Punkt 3-6): fachlich wichtig genug, um nicht
   uebersehen zu werden, daher volle Breite, grosses Warnsymbol, groessere
   Ueberschrift, erklaerender Zusatztext und ein deutlich sichtbarer,
   knopffoermiger "Tickets anzeigen"-Button statt eines schmalen Links.
   Bewusst weiterhin die bestehende Warnfarbe (--color-warning*, gedecktes
   Gelb/Ocker) statt einer Panik-/Gefahrenfarbe, wie ausdruecklich
   gefordert. NUR fuer diese eine Pruefkarte - .tc-neu-warning bleibt als
   leichtere, allgemeine Hinweiszeile fuer andere Faelle unveraendert. */
.tc-neu-duplicate-warning {
	display: flex;
	align-items: flex-start;
	gap: 16px;
	padding: 18px 22px;
	margin-bottom: var(--spacing-md);
	background-color: var(--color-warning-subtle);
	border: 1px solid var(--color-warning);
	border-left: 6px solid var(--color-warning);
	border-radius: var(--radius-medium);
	color: var(--color-warning-dark);
	font-family: var(--font-system);
}
.tc-neu-duplicate-warning-icon {
	flex: 0 0 auto;
	color: var(--color-warning);
}
.tc-neu-duplicate-warning-icon svg {
	width: 32px;
	height: 32px;
}
.tc-neu-duplicate-warning-body {
	flex: 1 1 auto;
	min-width: 0;
}
.tc-neu-duplicate-warning-title {
	display: block;
	font-size: 17px;
	font-weight: 700;
	color: var(--color-warning-dark);
	margin-bottom: 4px;
}
.tc-neu-duplicate-warning-text {
	display: block;
	font-size: 14px;
	color: var(--color-warning-dark);
}
.tc-neu-duplicate-warning-actions {
	flex: 0 0 auto;
	align-self: center;
}
.tc-neu-duplicate-warning-button {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	padding: 10px 20px;
	background-color: var(--color-warning-dark);
	border: 1px solid var(--color-warning-dark);
	border-radius: var(--radius-small);
	color: #FFF;
	font-family: var(--font-system);
	font-size: 14px;
	font-weight: 700;
	white-space: nowrap;
	text-decoration: none;
}
.tc-neu-duplicate-warning-button:hover {
	background-color: color-mix(in srgb, var(--color-warning-dark) 85%, black);
}
.tc-neu-duplicate-warning-button:focus-visible {
	outline: 2px solid var(--color-warning-dark);
	outline-offset: 2px;
}

/* -- Quellticket-Anzeige (Folge-Ticket-Klon) ------------------------------- */
.tc-neu-quelle-head {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 8px;
	margin-bottom: 8px;
}
.tc-neu-quelle-feld {
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
	font-family: var(--font-system);
	font-size: 13px;
}
.tc-neu-quelle-feld:last-child {
	border-bottom: 0;
}

/* -- Dynamische Art-Felder (1..20) + Ticket-Einstellungen ------------------ */
.tc-neu-dynfeld {
	margin-bottom: 10px;
}
.tc-neu-dynfeld-name {
	display: block;
	margin-bottom: 4px;
	font-family: var(--font-system);
	/* Auftrag "Freifeld-Schriftgroessen" (13.09.2026): auf die Groesse der
	   normalen Eingabefelder (.EingabeFeld, 15px) angehoben - vorher 13px. */
	font-size: 15px;
	font-weight: 600;
	color: var(--color-text);
	/* Auftrag "HTML-Formatierung in dynamischen Feldueberschriften",
	   03.09.2026, Punkt 10.5: einzelne konfigurierte Ueberschriften
	   enthalten lange, leerzeichenlose Sternchen-Trennzeilen
	   (z. B. "****...****") - ohne dies wuerden sie am Container-Rand
	   nicht umbrechen und eine horizontale Ueberbreite erzeugen. */
	overflow-wrap: anywhere;
}
/* Auftrag "Checkbox-Darstellung korrigieren + Ticketdaten vereinheitlichen",
   03.09.2026, Teil 1: eine Option je eigener Zeile, Checkbox und Label auf
   fester linker Achse, lange Labels brechen unter dem Text (nicht unter der
   Checkbox) um. Diese Klasse wird jetzt an drei Stellen verwendet
   (Ticket-Erfassung, Ticket-Bearbeiten, siehe dort) - identische Regel,
   keine Sonderfaelle. */
.tc-neu-checkbox-optionen {
	display: flex;
	flex-direction: column;
	gap: 8px;
	font-family: var(--font-system);
	/* Auftrag "Freifeld-Schriftgroessen" (13.09.2026): auf die Groesse der
	   normalen Eingabefelder (.EingabeFeld, 15px) angehoben - vorher 14px. */
	font-size: 15px;
}
.tc-neu-checkbox-optionen label {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	text-align: left;
	cursor: pointer;
	overflow-wrap: anywhere;
}
.tc-neu-checkbox-optionen label input[type="checkbox"] {
	flex: 0 0 auto;
	/* Haertung (04.09.2026, Zusatzfeld-Auftrag): .tc-neu-field input setzt
	   projektweit width:100% - bei flex-basis:auto (flex:0 0 auto) wird
	   diese Breite zur flex-basis, wodurch die Checkbox die gesamte Zeile
	   beansprucht hatte und der Labeltext in eine winzige Restspalte
	   gequetscht wurde. Explizites width:auto neutralisiert das. */
	width: auto;
	/* Richtet die Checkbox optisch an der ersten Textzeile aus, statt am
	   vertikalen Zentrum des gesamten (ggf. mehrzeiligen) Labeltextes -
	   wichtig bei langen, umbrechenden Beschriftungen (Punkt 1.4). */
	margin-top: 3px;
}

/* Radiobuttons (04.09.2026, neuer Zusatzfeld-Typ) - identisches Muster wie
   .tc-neu-checkbox-optionen direkt darueber, nur fuer type="radio". */
.tc-neu-radio-optionen {
	display: flex;
	flex-direction: column;
	gap: 8px;
	font-family: var(--font-system);
	/* Auftrag "Freifeld-Schriftgroessen" (13.09.2026): auf die Groesse der
	   normalen Eingabefelder (.EingabeFeld, 15px) angehoben - vorher 14px. */
	font-size: 15px;
}
.tc-neu-radio-optionen label {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	text-align: left;
	cursor: pointer;
	overflow-wrap: anywhere;
}
.tc-neu-radio-optionen label input[type="radio"] {
	flex: 0 0 auto;
	width: auto;
	margin-top: 3px;
}

/* Ticket-Einstellungen als natives <details>-Element (Auftrag "Ticket-
   Einstellungen umbauen, Leerraum beseitigen", 03.09.2026) - ersetzt die
   alte MM_showHideLayers()/visibility:hidden-Technik. Deren Problem: ein
   per visibility:hidden "eingeklapptes" Element bleibt weiterhin Teil des
   Layouts und beansprucht seine volle Hoehe, obwohl es unsichtbar ist -
   dadurch entstand ein deutlicher Leerraum, obwohl fuer den Betrachter
   "nichts da" war. <details> reserviert im geschlossenen Zustand
   ueberhaupt keinen Platz fuer seinen Inhalt (nur die <summary>-Kopfzeile
   ist sichtbar) und faltet sich erst beim Anklicken aus - vollstaendig
   nativ, ohne eigenes JavaScript. */
.tc-neu-settings-panel {
	margin-top: 10px;
}
.tc-neu-settings-panel[open] {
	padding-top: var(--spacing-md);
	border-top: 1px solid var(--color-border);
}
.tc-neu-settings-summary {
	display: flex;
	align-items: center;
	gap: 6px;
	cursor: pointer;
	font-family: var(--font-system);
	font-size: 13px;
	font-weight: 600;
	color: var(--color-primary);
	list-style: none;
}
/* Browser-eigenes Aufklapp-Dreieck ausblenden - der eigene, rotierende
   Chevron (siehe unten) uebernimmt diese Rolle bereits. */
.tc-neu-settings-summary::-webkit-details-marker {
	display: none;
}
.tc-neu-settings-summary::marker {
	content: '';
}
.tc-neu-settings-summary:hover {
	color: var(--color-primary-dark);
}
.tc-neu-settings-summary:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-neu-settings-summary svg {
	width: 12px;
	height: 12px;
}
.tc-neu-settings-chevron svg {
	transition: transform 0.15s ease;
}
.tc-neu-settings-panel[open] .tc-neu-settings-chevron svg {
	transform: rotate(90deg);
}
.tc-neu-settings-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 10px var(--spacing-md);
	margin-top: var(--spacing-md);
}

/* -- Responsive -------------------------------------------------------------- */
@media (max-width: 900px) {
	.tc-neu-contact-columns,
	.tc-neu-field-grid,
	.tc-neu-settings-grid,
	.tc-neu-result-body,
	.tc-neu-form-columns {
		grid-template-columns: 1fr;
	}
	/* Adresse/Kontaktdaten stehen bei dieser Breite nicht mehr nebeneinander -
	   der Abstand zwischen den beiden Abschnittskarten muss dann wieder wie
	   bei allen anderen Abschnitten wirken (Punkt B2: "sauber untereinander
	   umbrechen"). */
	.tc-neu-form-columns .tc-neu-form-section + .tc-neu-form-section {
		margin-top: var(--spacing-sm);
	}
}
@media (max-width: 700px) {
	.tc-neu-picker {
		flex-direction: column;
		align-items: stretch;
	}
	.tc-neu-warning,
	.tc-neu-error-banner {
		flex-wrap: wrap;
	}
	.tc-neu-panel-head {
		align-items: flex-start;
	}
	.tc-neu-panel-action {
		width: 100%;
		justify-content: center;
	}
	.tc-neu-duplicate-warning {
		flex-direction: column;
	}
	.tc-neu-duplicate-warning-actions {
		align-self: stretch;
	}
	.tc-neu-duplicate-warning-button {
		width: 100%;
		justify-content: center;
	}
}

/* Kartenraster-Spaltenzahl: siehe die mobile-first (min-width) gestaffelten
   Regeln direkt bei .tc-neu-card-grid weiter oben (2. Feinschliffrunde,
   03.09.2026, ersetzt die vormals hier stehenden max-width-Regeln). */

/* ==========================================================================
   Startcenter-Modernisierung (03.09.2026, Auftrag "Startcenter/Startseite
   analysieren und modernisieren"): moderne Kartenkacheln fuer
   startseite/index.php (Willkommensbereich, Aktuelle-Meldungen-Karten,
   Terminmeldungen-/Archiv-/Release-Notes-Kacheln), startseite/archiv.php,
   startseite/termine.php. Nutzt ausschliesslich bestehende Design-Tokens
   (--color-*, --radius-*, --shadow-*, --spacing-*) - kein neues
   Farbsystem, keine neuen Buttons (Wiederverwendung .app-header-cta fuer
   "+ Neue Meldung", analog "+ Neues Ticket erstellen" im Kopfbereich).
   ========================================================================== */

.tc-start-head {
	margin-bottom: var(--spacing-md);
}
.tc-start-head-titel {
	font-size: 1.3rem;
	font-weight: 700;
	color: var(--color-text);
	margin: 0;
}
.tc-start-head-untertitel {
	font-size: .92rem;
	color: var(--color-text-muted);
	margin-top: 2px;
}

/* Zweispaltiges Layout: links die Aktuelle-Meldungen-Karten (breiter),
   rechts die kompakten Kacheln (Termine/Release Notes/Archiv). Faellt ab
   Tablet-Breite auf eine Spalte zurueck (Punkt 14: keine horizontalen
   Scrollbereiche). */
.tc-start-layout {
	display: grid;
	grid-template-columns: 1fr;
	gap: var(--spacing-lg);
	align-items: start;
}
@media (min-width: 980px) {
	.tc-start-layout {
		grid-template-columns: minmax(0, 2.1fr) minmax(0, 1fr);
	}
}

.tc-start-abschnitt {
	margin-bottom: var(--spacing-lg);
}
.tc-start-abschnitt-kopf {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: var(--spacing-sm);
	margin-bottom: var(--spacing-sm);
}
.tc-start-abschnitt-kopf h2 {
	font-size: 1.05rem;
	font-weight: 700;
	color: var(--color-text);
	margin: 0;
}
.tc-start-zaehler {
	font-weight: 400;
	color: var(--color-text-muted);
	font-size: .9rem;
}

/* "Heute"-Banner (jaehrlich wiederkehrende Terminmeldung, z. B.
   Betriebsjubilaeum - Datenlogik/Jahreszaehler unveraendert aus
   startseite/index.php uebernommen) - bewusst als eigene, schmale
   Hervorhebung ueber dem Kartenraster, nicht als normale Karte, da es
   sich um EINEN tagesaktuellen Hinweis handelt. */
.tc-start-heute-banner {
	display: flex;
	align-items: flex-start;
	gap: var(--spacing-sm);
	background-color: var(--color-park-subtle);
	border: 1px solid var(--color-park);
	border-radius: var(--radius-medium);
	padding: var(--spacing-sm) var(--spacing-md);
	margin-bottom: var(--spacing-md);
}
.tc-start-heute-banner .tc-icon {
	color: var(--color-park);
	flex: 0 0 auto;
	margin-top: 3px;
}
.tc-start-heute-banner-inhalt {
	min-width: 0;
}
.tc-start-heute-banner-titel {
	font-weight: 700;
	color: var(--color-text);
}

/* Kartenraster fuer "Aktuelle Meldungen" (Punkt 4: 2-3 Spalten Desktop,
   2 Tablet, 1 Mobil - keine feste Hoehe, Karten passen sich dem Inhalt
   an). Bewusst eigenstaendige Klasse statt Wiederverwendung von
   .tc-neu-card-grid: dort faerbt Hover die GESAMTE Karte in
   --color-primary ein (passend fuer eine einzelne grosse Klickflaeche bei
   der Ticket-Gruppenauswahl) - bei einer Inhaltskarte mit mehreren eigenen
   Interaktionselementen (Titel-Link, Bearbeiten/Loeschen, Fusslink,
   eingebettete Links im Inhalt) waere das irritierend.
   Nachtrag (Nutzerfeedback 03.09.2026, "Beitraege schmaler gestalten"):
   von festen 1/2/3-Spalten-Stufen auf auto-fill mit einer Mindestbreite je
   Karte umgestellt - passt die Spaltenzahl automatisch an den verfuegbaren
   Platz an (mehr, schmalere Karten auf breiten Bildschirmen statt weniger,
   breiter Karten) statt starrer Breakpoints. "Top"-Meldungen spannen dabei
   NICHT mehr ueber die volle Breite (vorheriger Zustand, ebenfalls im
   selben Feedback als zu breit bemaengelt) - sie bleiben im normalen
   Raster, ihre Sonderstellung zeigt weiterhin der "Wichtig"-Badge plus
   Akzentrand. */
.tc-start-karten-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: var(--spacing-md);
	align-items: start;
}

.tc-start-karte {
	position: relative;
	display: flex;
	flex-direction: column;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-left: 4px solid var(--tc-start-karte-akzent, var(--color-border));
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	overflow: hidden;
}
.tc-start-karte--top {
	border-left-color: var(--tc-start-karte-akzent, var(--color-priority));
}
.tc-start-karte-bild {
	width: 100%;
	max-height: 180px;
	overflow: hidden;
	background-color: var(--color-background);
}
.tc-start-karte-bild img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.tc-start-karte-textbereich {
	padding: var(--spacing-md);
	display: flex;
	flex-direction: column;
	gap: 6px;
	min-width: 0;
}
.tc-start-karte-kopf {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: var(--spacing-sm);
}
.tc-start-karte-titel-link {
	text-decoration: none;
	color: inherit;
	min-width: 0;
}
.tc-start-karte-titel-link:hover .tc-start-karte-titel,
.tc-start-karte-titel-link:hover {
	background-color: transparent;
	color: var(--color-primary);
}
.tc-start-karte-titel {
	display: block;
	font-weight: 700;
	color: var(--color-text);
	line-height: 1.3;
}
.tc-start-karte-datum {
	display: block;
	font-size: .8rem;
	font-weight: 400;
	color: var(--color-text-muted);
	margin-top: 2px;
}
.tc-start-karte-aktionen {
	display: flex;
	gap: 2px;
	flex: 0 0 auto;
}
.tc-start-karte-aktion {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 26px;
	height: 26px;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	text-decoration: none;
}
.tc-start-karte-aktion:hover {
	background-color: var(--color-background);
	color: var(--color-primary);
}
.tc-start-karte-aktion--loeschen:hover {
	color: var(--color-danger);
}
.tc-start-karte-inhalt {
	font-size: .9rem;
	color: var(--color-text);
	line-height: 1.45;
	word-break: break-word;
}
/* Eingebettete Links im Freitext (z. B. mehrere interne/externe
   Kalenderlinks, siehe Auftrag Punkt 9) automatisch als kompakte,
   dezente Pillen darstellen statt als reine unterstrichene Textlinks -
   wirkt ohne Aenderung an der bestehenden Dateninhalt-/HTML-Struktur
   (sanitize_admin_html() erlaubt weiterhin dieselben Tags). */
.tc-start-karte-inhalt a {
	display: inline-flex;
	align-items: center;
	background-color: var(--color-info-subtle);
	color: var(--color-primary-dark);
	border-radius: var(--radius-small);
	padding: 2px 8px;
	margin: 2px 2px 2px 0;
	text-decoration: none;
	font-size: .85rem;
}
.tc-start-karte-inhalt a:hover {
	background-color: var(--color-primary);
	color: #FFF;
}
.tc-start-karte-mehr {
	color: var(--color-primary);
	text-decoration: none;
	font-weight: 600;
	white-space: nowrap;
}
.tc-start-karte-mehr:hover {
	text-decoration: underline;
}
.tc-start-karte-fuss {
	margin-top: 2px;
}
.tc-start-karte-fuss-link {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	font-size: .85rem;
	font-weight: 600;
	color: var(--color-primary);
	text-decoration: none;
}
.tc-start-karte-fuss-link:hover {
	color: var(--color-primary-dark);
	text-decoration: underline;
}

/* Meldungstyp-Kennzeichnung (Punkt 8) - dezente kleine Bubble, kein neues
   Farbsystem: "Termin" nutzt dieselbe Parkfarbe wie an anderer Stelle im
   Projekt (--color-park, z. B. Geparkt-Status), "Wichtig" die bestehende
   Prioritaetsfarbe (--color-priority). */
.tc-start-badge {
	position: absolute;
	top: var(--spacing-sm);
	right: var(--spacing-sm);
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: .72rem;
	font-weight: 700;
	padding: 3px 8px;
	border-radius: 999px;
	z-index: 1;
}
.tc-start-badge--termin {
	background-color: var(--color-park-subtle);
	color: var(--color-park);
}
.tc-start-badge--top {
	background-color: var(--color-warning-subtle);
	color: var(--color-priority-text);
}

.tc-start-leer {
	color: var(--color-text-muted);
	font-size: .9rem;
	padding: var(--spacing-md);
	text-align: center;
	background-color: var(--color-background);
	border-radius: var(--radius-medium);
}

/* Seitenspalten-Kacheln (Terminmeldungen/Release Notes/Archiv). */
.tc-start-kachel {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	padding: var(--spacing-md);
	margin-bottom: var(--spacing-md);
}
.tc-start-kachel-kopf {
	display: flex;
	align-items: center;
	gap: 8px;
	font-weight: 700;
	color: var(--color-text);
	margin-bottom: var(--spacing-sm);
}
/* Persoenliche Arbeitsuebersichten (Auftrag "Startcenter um persoenliche
   Arbeitsuebersichten erweitern", 16.09.2026): drei gleich aufgebaute
   Kacheln (Verfuegbare Tickets fuer mich/Meine Aufgaben/Meine beobachteten
   Tickets) - links grosse Kennzahl, rechts bis zu drei Vorschauzeilen. Die
   drei Kacheln liegen selbst in einem responsiven Grid (analog zu
   .tc-admin-hub-grid), damit sie auf breiten Bildschirmen nebeneinander,
   auf schmalen automatisch untereinander stehen. */
.tc-start-uebersichten {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
	gap: var(--spacing-md);
	margin-bottom: var(--spacing-md);
}
.tc-start-kennzahl-kachel {
	margin-bottom: 0;
	display: flex;
	flex-direction: column;
}
.tc-start-kennzahl-inhalt {
	display: flex;
	gap: var(--spacing-md);
	align-items: flex-start;
	flex: 1 1 auto;
}
.tc-start-kennzahl-zahl-block {
	flex: 0 0 auto;
	text-align: center;
	min-width: 64px;
}
.tc-start-kennzahl-zahl {
	font-size: 2.2rem;
	font-weight: 700;
	line-height: 1;
	color: var(--color-primary);
}
.tc-start-kennzahl-label {
	font-size: .78rem;
	color: var(--color-text-muted);
	margin-top: 2px;
}
.tc-start-kennzahl-vorschau {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.tc-start-kennzahl-zeile {
	display: block;
	min-width: 0;
	padding: 6px 8px;
	border-radius: var(--radius-small);
	color: var(--color-text);
	text-decoration: none;
}
.tc-start-kennzahl-zeile:hover {
	background-color: var(--color-background);
}
.tc-start-kennzahl-zeile-art {
	display: block;
	font-size: .72rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
	color: var(--color-text-muted);
}
.tc-start-kennzahl-zeile-titel {
	display: block;
	font-size: .88rem;
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.tc-start-kennzahl-zeile-alter {
	display: block;
	font-size: .78rem;
	color: var(--color-text-muted);
}
.tc-start-kachel-kopf .tc-icon {
	color: var(--color-primary);
}
.tc-start-kachel-zaehler {
	font-weight: 400;
	color: var(--color-text-muted);
	font-size: .85rem;
	margin-left: auto;
}
.tc-start-kachel-termin-eintrag {
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
	font-size: .88rem;
}
.tc-start-kachel-termin-eintrag:last-of-type {
	border-bottom: none;
}
.tc-start-kachel-termin-datum {
	color: var(--color-text-muted);
	font-size: .8rem;
}
.tc-start-kachel-fuss {
	margin-top: var(--spacing-sm);
	text-align: right;
}
.tc-start-kachel-link {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	font-size: .88rem;
	font-weight: 600;
	color: var(--color-primary);
	text-decoration: none;
}
.tc-start-kachel-link:hover {
	color: var(--color-primary-dark);
	text-decoration: underline;
}
.tc-start-kachel-releasetitel {
	font-weight: 700;
	color: var(--color-text);
	margin-bottom: 2px;
}
.tc-start-kachel-releasedatum {
	font-size: .82rem;
	color: var(--color-text-muted);
	margin-bottom: 4px;
}
.tc-start-neu-pille {
	display: inline-flex;
	align-items: center;
	background-color: var(--color-danger);
	color: #FFF;
	font-size: .68rem;
	font-weight: 700;
	padding: 1px 7px;
	border-radius: 999px;
	margin-left: 6px;
	vertical-align: middle;
}

/* Kompakter Rueckkehr-Link (ersetzt die alte 3-Punkte-Navigation
   includes/navs/nav_startseite.php auf den Verwaltungsseiten
   startseite/verwaltung/{neu,aendern,sicher}.php - siehe dortige,
   unveraenderte Einbindung derselben Datei). */
.tc-start-zurueck-link {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	color: var(--color-text-muted);
	text-decoration: none;
	font-size: .9rem;
}
.tc-start-zurueck-link:hover {
	color: var(--color-primary);
	text-decoration: underline;
}

/* ==========================================================================
   Startcenter-Modernisierung, Nachtrag (03.09.2026, Nutzerauftrag "auch die
   Seiten fuer Neu, Aendern und Loeschen modernisieren, insbesondere die
   Upload-Methodik der Bilder"): startseite/verwaltung/{neu,aendern,sicher}.php
   sowie includes/neu/bilder.php, includes/aendern/bilder_global.php,
   includes/{neu,aendern}/hintergrundfarbe.php, includes/loeschen/
   sicherheitsabfrage.php. Feldnamen/-typen und die dahinterliegende
   Verarbeitungslogik (includes/{neu,aendern}/speichern_cms_aktuelles.php,
   includes/loeschen/loeschen_cms_aktuelles.php) bleiben unveraendert - rein
   die Darstellung wurde modernisiert.
   ========================================================================== */

.tc-form-card {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	padding: var(--spacing-lg);
	max-width: 860px;
	box-sizing: border-box;
}
/* Nacharbeit (16.09.2026, "SMS-Seite ueber die gesamte Breite nutzen",
   Roman): .tc-form-card ist fuer schmale Formulare gedacht (max-width oben)
   - der SMS-Bereich (sms/index.php) nutzt dieselbe Karten-/Rahmenoptik aber
   fuer seine Eingang/Ausgang-LISTE, die wie jede andere Ticketliste die
   volle Breite ausnutzen soll (vorher blieb rechts unnoetig Leerraum, wo
   frueher das inzwischen durch ein Modal ersetzte Inline-Sendeformular
   stand). Eigene Modifier-Klasse statt die Basisregel zu aendern - jede
   andere .tc-form-card-Seite bleibt unveraendert schmal. */
.tc-form-card--breit {
	max-width: none;
}
/* Auftrag "Konfigurationsseiten kontrastreicher trennen und klarer
   strukturieren", 09.09.2026: dashboard/bearbeiten.php (Dashboard-
   Einstellungen) und dashboard/widget_bearbeiten.php (Widget-
   Einstellungen) reihen mehrere .tc-form-card-Abschnitte hintereinander -
   projektweit die einzigen Seiten mit dieser Mehrfachkarten-Struktur
   (jede andere .tc-form-card-Seite nutzt genau eine Karte). Der
   Standard-Schatten (--shadow-small) ist fuer eine EINZELNE Karte gedacht
   und dort ausreichend - bei mehreren, nur wenig Abstand habenden Karten
   braucht es zusaetzlich einen kraeftigeren Rand/Schatten, damit jeder
   Abschnitt klar als eigener Block erkennbar bleibt (siehe auch
   .tc-dash-editor-formular-spalte/#tc-dash-formular fuer den dazugehoerigen
   Kartenabstand). Bewusst NUR fuer diese beiden Seiten skaliert, nicht
   global auf .tc-form-card - andere Seiten sollen unveraendert bleiben. */
#tc-dash-formular .tc-form-card,
.tc-dash-editor-formular-spalte .tc-form-card {
	border-color: var(--color-border-strong);
	box-shadow: var(--shadow-medium);
}
#tc-dash-formular {
	display: flex;
	flex-direction: column;
	/* Fehlerrunde (24.09.2026), Punkt 9, Abschnitt 1 "zu grosse vertikale
	   Abstaende reduzieren": von 24px auf 16px - nur diese Seite betroffen
	   (ID-Selektor), .tc-dash-editor-formular-spalte (Widget-Editor)
	   unveraendert. */
	gap: var(--spacing-md, 16px);
}
/* Nachbesserung (24.09.2026, "Dashboard-Maske zweispaltig gestalten"):
   zwei gleichwertige, unabhaengig hohe Spalten (jede eine eigene
   Flex-Spalte mit ihren .tc-form-card-Kindern) statt einer langen
   Einzelspalte - macht die auf breiten Bildschirmen ungenutzte rechte
   Haelfte nutzbar, ohne die einzelnen Karten selbst zu aendern. Bricht bei
   schmaleren Fenstern (< ca. 760px Gesamtbreite der beiden Spalten
   zusammen) automatisch auf eine Spalte um, dieselbe min-width/flex-wrap-
   Technik wie die bereits bestehenden .tc-formular-2spalten/.tc-nachweis-
   auswahl im Projekt. */
.tc-dash-formular-spalten {
	display: flex;
	gap: var(--spacing-md, 16px);
	align-items: flex-start;
	flex-wrap: wrap;
}
.tc-dash-formular-spalte {
	flex: 1 1 360px;
	min-width: 320px;
	display: flex;
	flex-direction: column;
	gap: var(--spacing-md, 16px);
}
/* Fehlerrunde (24.09.2026), Punkt 10: dashboard/widget_bearbeiten.php blendet
   ganze .tc-form-card-Karten kontextbezogen per JS aus (z. B. Gruppierung
   bei Warenwirtschaft/Wertkonto/Zeitkonto komplett) - blieb dabei eine
   Spalte OHNE sichtbares Kind uebrig, wirkte die Zeile asymmetrisch (leere
   Spalte neben der verbleibenden). Kollabiert eine Spalte automatisch,
   sobald keines ihrer direkten .tc-form-card-Kinder mehr sichtbar ist -
   die andere Spalte nutzt dank flex-wrap dann automatisch die volle
   Breite. Ohne Effekt auf dashboard/bearbeiten.php (dort wird nie eine
   ganze Karte in einer Spalte versteckt). */
.tc-dash-formular-spalte:not(:has(> .tc-form-card:not([hidden]))) {
	display: none;
}

.tc-form-abschnitt-titel {
	font-size: 1rem;
	font-weight: 700;
	color: var(--color-text);
	padding-top: var(--spacing-md);
	padding-bottom: 6px;
	border-bottom: 1px solid var(--color-border);
	margin-bottom: 4px;
}
.tc-form-card > table > tbody > tr:first-child .tc-form-abschnitt-titel,
.tc-form-abschnitt-titel--erste {
	padding-top: 0;
}

/* Bild-Upload: klassisches "type=file" unsichtbar, aber ueber die volle
   Flaeche des sichtbaren Buttons gelegt (Standardmuster) - funktioniert
   ohne zusaetzliches Klick-Weiterleitungs-JS, name-Attribut/Feldsemantik
   unveraendert. */
.tc-form-upload {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
}
.tc-form-upload-button {
	position: relative;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	background-color: var(--color-background);
	border: 1px dashed var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 8px 14px;
	cursor: pointer;
	font-size: .88rem;
	color: var(--color-text);
	overflow: hidden;
	transition: border-color .12s ease, background-color .12s ease;
}
.tc-form-upload-button:hover {
	border-color: var(--color-primary);
	background-color: var(--color-info-subtle);
}
.tc-form-upload-button input[type="file"] {
	position: absolute;
	inset: 0;
	opacity: 0;
	cursor: pointer;
	width: 100%;
}
.tc-form-upload-dateiname {
	font-size: .85rem;
	color: var(--color-text-muted);
}

/* Bugfix (24.09.2026, Fehlerrunde Punkt 10): dieselbe display-vs-[hidden]-
   Falle wie bei .tc-dash-checkbox-eintrag oben - .tc-form-radio-karte
   traegt u. a. die Kennzahl-Typ-Radiokarten im Widget-Editor
   (.tc-dash-typ-radio-label, dashboard/widget_bearbeiten.php), die per JS
   (js/dashboard-widget-editor.js) hidden=true/false je nach gewaehltem
   Auswertungstyp gesetzt bekommen - blieben durch das unconditional
   "display:flex" trotzdem sichtbar. An :not([hidden]) gebunden; alle
   anderen, nie versteckten Verwendungsstellen (Sichtbarkeit in
   dashboard/bearbeiten.php, Warenwirtschaft-Ticket-Widgets-Modusauswahl
   usw.) unveraendert, da dort kein hidden-Attribut vorkommt. */
.tc-form-radio-karte:not([hidden]) {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	padding: 8px 12px;
	margin-bottom: 6px;
	font-size: .88rem;
	background-color: var(--color-surface);
}
.tc-form-radio-karte:has(input:checked) {
	border-color: var(--color-primary);
	background-color: var(--color-info-subtle);
}
.tc-form-radio-karte input {
	margin-top: 3px;
	flex: 0 0 auto;
}
.tc-form-radio-karte-inhalt {
	min-width: 0;
}
/* Warenwirtschaft-Ticket-Widgets (22.09.2026): Modus-Auswahl (Ausgang/
   Eingang) nebeneinander statt untereinander - reine Zeilenanordnung,
   die einzelnen .tc-form-radio-karte-Elemente bleiben unveraendert. */
.tc-form-radio-karte-zeile {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.tc-form-radio-karte-zeile .tc-form-radio-karte {
	margin-bottom: 0;
}
.tc-wwi-widget-liste {
	margin: 0 0 var(--spacing-md);
	padding-left: 20px;
	font-size: .9rem;
}
.tc-wwi-widget-form .tc-form-abschnitt-titel:first-child {
	margin-top: 0;
}

.tc-form-bildvorschau {
	max-width: 130px;
	max-height: 90px;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-border);
	display: block;
	margin-bottom: 6px;
	object-fit: cover;
}

/* Statusleiste ueberarbeiten (03.09.2026): kleiner, dezenter Hinweistext
   unter einem Formularfeld (z. B. zulaessige Avatar-Formate/Groesse) -
   ergaenzt die bereits bestehende .tc-form-*-Familie um einen bisher
   fehlenden Baustein. */
.tc-form-hinweis {
	font-size: .78rem;
	color: var(--color-text-muted);
	margin-top: 4px;
}

/* Farbwahl - ersetzt eine ~280 Zeilen lange, hartkodierte Farbpalette durch
   den nativen Browser-Farbwaehler; dieselbe Textspalte "hgfarbe" bleibt
   Quelle der Wahrheit (per JS synchronisiert), damit die Verarbeitung
   unveraendert bleibt (leerer Wert = keine eigene Farbe, wie zuvor). */
.tc-form-farbe {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
}
.tc-form-farbe input[type="color"] {
	width: 42px;
	height: 32px;
	padding: 2px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	cursor: pointer;
	background: none;
}
.tc-form-farbe-zuruecksetzen {
	font-size: .85rem;
	color: var(--color-text-muted);
	text-decoration: none;
	cursor: pointer;
	background: none;
	border: none;
	padding: 0;
}
.tc-form-farbe-zuruecksetzen:hover {
	color: var(--color-primary);
	text-decoration: underline;
}

/* Feste Dashboard-Farbpalette (Auftrag 20.09.2026, "Dashboard-Farben",
   Punkt 4) - Radiogruppe mit Farbkreisen statt freiem Farbwaehler, siehe
   tc_dashboard_farb_palette(). */
.tc-dash-farbwahl {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}
.tc-dash-farbwahl-eintrag {
	cursor: pointer;
}
.tc-dash-farbwahl-eintrag input[type="radio"] {
	position: absolute;
	opacity: 0;
	width: 1px;
	height: 1px;
}
.tc-dash-farbwahl-swatch {
	display: block;
	width: 28px;
	height: 28px;
	border-radius: 50%;
	border: 2px solid var(--color-border-strong);
	box-sizing: border-box;
}
.tc-dash-farbwahl-swatch--keine {
	background: repeating-linear-gradient(45deg, var(--color-background), var(--color-background) 4px, var(--color-border) 4px, var(--color-border) 5px);
}
.tc-dash-farbwahl-eintrag input[type="radio"]:checked + .tc-dash-farbwahl-swatch {
	border-color: var(--color-text);
	box-shadow: 0 0 0 2px var(--color-background), 0 0 0 4px var(--color-text);
}
.tc-dash-farbwahl-eintrag input[type="radio"]:focus-visible + .tc-dash-farbwahl-swatch {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}

/* Dezente Farbtoenung der Dashboard-/Report-Karte (Auftrag 20.09.2026,
   Punkt 4) - duenner linker Akzentstreifen + sehr helle Hintergrundtoenung
   ueber color-mix(), niemals eine Vollflaeche. Farbe kommt als Inline-
   Custom-Property --tc-dash-akzent (siehe dashboard/index.php), Kontrast/
   Lesbarkeit bleibt unabhaengig von der Wahl erhalten, da nur der Text auf
   dem UNVERAENDERTEN hellen Kartenhintergrund steht. */
.tc-dash-karte[style*="--tc-dash-akzent"] {
	border-left: 4px solid var(--tc-dash-akzent);
	background-color: color-mix(in srgb, var(--tc-dash-akzent) 6%, var(--color-surface, #FFF));
}

/* Loeschbestaetigung (includes/loeschen/sicherheitsabfrage.php). */
.tc-form-loeschen-card {
	max-width: 480px;
}
.tc-form-loeschen-hinweis {
	background-color: var(--color-danger-subtle);
	color: var(--color-danger);
	border: 1px solid var(--color-danger);
	border-radius: var(--radius-small);
	padding: 10px 12px;
	font-size: .9rem;
	margin-bottom: var(--spacing-md);
}
.tc-form-loeschen-aktionen {
	display: flex;
	gap: 10px;
	margin-top: var(--spacing-md);
}

/* ==========================================================================
   Startcenter-Erweiterung (03.09.2026, mehrere Runden):
   - .tc-agenda-*: Ticket-Termine-Agenda (Gestern/Heute/Morgen umschaltbar,
     "Nur meine Termine"-Filter, "Jetzt"-Linie, verstrichene Termine
     ausgegraut) - die persoenlichen Ticketkennzahlen und der direkte
     "Mein Profil bearbeiten"-Button sind ersatzlos entfallen (stehen
     bereits dauerhaft in der rechten Statusleiste, siehe
     framework/Statusleiste/Default.php, .tc-statusleiste* weiter unten in
     dieser Datei).
   - .tc-live-*: sanfte Zahlen-Hervorhebung bei Hintergrundaktualisierung
   ========================================================================== */

.tc-start-head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: var(--spacing-sm);
}
.tc-start-head-text {
	min-width: 0;
}

/* Werkzeugleiste (Tag-Umschalter + "Nur meine Termine") oberhalb der Liste. */
.tc-agenda-werkzeugleiste {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: var(--spacing-sm);
	margin-bottom: var(--spacing-sm);
}
.tc-agenda-tage {
	display: inline-flex;
	gap: 2px;
	background-color: var(--color-background);
	border-radius: var(--radius-small);
	padding: 3px;
}
.tc-agenda-tag-link {
	display: inline-block;
	padding: 5px 12px;
	border-radius: var(--radius-small);
	font-size: .82rem;
	font-weight: 600;
	color: var(--color-text-muted);
	text-decoration: none;
}
/* Neutralisiert bewusst die globale "a:hover"-Regel (blauer Block, siehe
   Ursachenerklaerung bei .tc-neu-card-link weiter oben in dieser Datei) -
   dieselbe ruhige Tab-Optik soll auch im Hover-/Aktiv-Zustand bestehen
   bleiben, kein flaechiger Farbwechsel. */
.tc-agenda-tag-link:hover,
.tc-agenda-tag-link:focus-visible {
	background-color: var(--color-surface);
	color: var(--color-text);
}
.tc-agenda-tag-link--aktiv,
.tc-agenda-tag-link--aktiv:hover {
	background-color: var(--color-surface);
	color: var(--color-primary-dark);
	box-shadow: var(--shadow-small);
}
.tc-agenda-filter-form {
	display: flex;
	align-items: center;
}
.tc-agenda-nurmeine {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: .82rem;
	color: var(--color-text-muted);
	cursor: pointer;
	user-select: none;
}
.tc-agenda-nurmeine input {
	cursor: pointer;
}

/* Terminagenda-Liste - breiter als die uebrigen Kacheln (lebt in der
   Hauptspalte statt der schmalen Seitenspalte). Jede Zeile fuehrt jetzt
   direkt zum Ticket (Nutzerauftrag: "nur die eine Info-Zeile lassen",
   "statt mit dem Pfeil zu erweitern soll direkt zum Ticket gesprungen
   werden") - keine Aufklappfunktion mehr. */
.tc-agenda-liste {
	list-style: none;
	margin: 0;
	padding: 0;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-small);
	overflow: hidden;
}
.tc-agenda-eintrag {
	border-bottom: 1px solid var(--color-border);
}
.tc-agenda-eintrag:last-child {
	border-bottom: none;
}
.tc-agenda-zeile {
	display: flex;
	align-items: center;
	gap: var(--spacing-sm);
	width: 100%;
	padding: 10px var(--spacing-md);
	text-decoration: none;
	font: inherit;
	color: var(--color-text);
	box-sizing: border-box;
}
/* Hover-Korrektur (derselbe Fehlertyp/dieselbe Loesung wie bereits bei
   .tc-statusleiste-kennzahl/.tc-neu-card-link dokumentiert): die globale
   "a:hover"-Regel wuerde sonst einen kraeftigen blauen Block ueber eine
   ganze Zeile der Agenda-Liste legen - bewusst durch dieselbe ruhige,
   helle Hover-Flaeche ersetzt, die diese Zeile schon als <button> hatte,
   bevor sie zu einem direkten Link wurde. */
.tc-agenda-zeile:hover,
.tc-agenda-zeile:focus-visible {
	background-color: var(--color-background);
	color: var(--color-text);
}
.tc-agenda-zeit {
	flex: 0 0 auto;
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	color: var(--color-primary-dark);
	min-width: 42px;
}
.tc-agenda-art {
	flex: 0 0 auto;
	font-size: .76rem;
	font-weight: 700;
	color: var(--color-primary-dark);
	background-color: var(--color-info-subtle);
	border-radius: 999px;
	padding: 2px 9px;
	white-space: nowrap;
}
.tc-agenda-titel {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-agenda-besitzer {
	flex: 0 0 auto;
	font-size: .85rem;
	color: var(--color-text-muted);
	max-width: 160px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-agenda-eskaliert-flag {
	flex: 0 0 auto;
	color: var(--color-danger-strong);
	font-weight: 700;
}
/* Verstrichene Termine ausgrauen (nur am "Heute"-Tag relevant, siehe
   data-tc-agenda-heute in startseite/index.php/js/tc-start-live.js) - beim
   Hover wieder voll sichtbar, damit klar bleibt, dass die Zeile weiterhin
   anklickbar ist. */
.tc-agenda-vergangen {
	opacity: .55;
}
.tc-agenda-vergangen:hover {
	opacity: 1;
}
/* "Jetzt"-Linie - reine Orientierungshilfe, kein eigener Ticket-Eintrag
   (aria-hidden). Nutzt die bestehende Primaerfarbe statt einer neuen
   Farbe (Vorgabe: "keine neue Farbwelt einfuehren"). */
.tc-agenda-jetzt-linie {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px var(--spacing-md);
	background-color: var(--color-info-subtle);
}
.tc-agenda-jetzt-linie::before {
	content: "";
	flex: 1 1 auto;
	height: 2px;
	border-radius: 1px;
	background-color: var(--color-primary);
}
.tc-agenda-jetzt-linie span {
	flex: 0 0 auto;
	font-size: .72rem;
	font-weight: 700;
	color: var(--color-primary-dark);
	white-space: nowrap;
}
.tc-agenda-fuss {
	padding: 10px var(--spacing-md);
	text-align: right;
	border-top: 1px solid var(--color-border);
}
@media (max-width: 620px) {
	.tc-agenda-besitzer { display: none; }
}

/* Sanfte Live-Aktualisierung (Auftrag Punkt 13): kurzer, dezenter
   Hintergrund-Puls statt Blinken/Aufploppen - reine Aufmerksamkeitslenkung,
   keine aggressive Animation. */
@keyframes tc-live-puls {
	0% { background-color: var(--color-info-subtle); }
	100% { background-color: transparent; }
}
.tc-live-aktualisiert {
	animation: tc-live-puls 1.2s ease-out;
	border-radius: var(--radius-small);
}

/* ==========================================================================
   Statusleiste ueberarbeiten (03.09.2026): die vorherige Kennzahlen-Zeile
   unter der Hauptnavigation (.app-status-live) entfaellt - ersetzt durch
   eine permanente persoenliche Statusleiste im bereits strukturell
   reservierten rechten Bereich (--sidebar-right-width). Macht die
   Kopfzeile wieder eine Zeile niedriger (Auftrag Punkt 2/20).
   ========================================================================== */

/* Avatar mit Initialen-Fallback (Auftrag Punkt 9-10) - siehe
   tc_avatar_markup()/tc_avatar_initialen() in includes/main.php: entweder
   ein rundes Bild (object-fit: cover, keine Verzerrung) oder ein
   Initialen-Kreis. */
.tc-avatar {
	border-radius: 50%;
	object-fit: cover;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	/* Nutzerfeedback (03.09.2026, Wertkonto: "Bild und Benutzername zu dicht
	   aneinander"): Standardabstand nach rechts, da tc_avatar_markup()
	   ueberall direkt vor einem Namenstext steht (Ticketlisten/-karten,
	   Protokoll, Wertkonto, Startcenter-Agenda). Kontexte, in denen der
	   Avatar freistehend/zentriert ist (Statusleiste-Kopf, Umschaltknopf),
	   ueberschreiben den Abstand gezielt selbst (siehe weiter unten). */
	margin-right: 6px;
	vertical-align: middle;
}
.tc-avatar-initialen {
	background-color: var(--color-primary);
	color: #FFF;
	font-weight: 700;
	line-height: 1;
}

/* Kompakter Avatar-Umschaltknopf in der Kopfzeile - nur unterhalb 1600px
   sichtbar (dort ist die Statusleiste selbst ausgeblendet, siehe unten),
   oeffnet sie stattdessen als volles Overlay (Auftrag Punkt 21). */
.app-statusleiste-umschalter {
	display: none;
	align-items: center;
	justify-content: center;
	background: none;
	border: none;
	padding: 2px;
	border-radius: 50%;
	cursor: pointer;
}
.app-statusleiste-umschalter .tc-avatar {
	margin-right: 0;
}
.app-statusleiste-umschalter:hover,
.app-statusleiste-umschalter:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
@media (max-width: 1599px) {
	.app-statusleiste-umschalter { display: inline-flex; }
}

/* Die eigentliche Leiste - "position: fixed" statt eine der ~370 Seiten
   anzufassen: der reservierte Streifen ergibt sich rein rechnerisch daraus,
   dass die Haupttabelle bereits um --sidebar-right-width schmaler ist als
   --app-max-width (siehe :root sowie die @media(min-width:1600px)-Regel
   weiter oben, die die letzte Rahmenzelle jeder Seite entsprechend
   verbreitert) - "right: 0" trifft dadurch sowohl bei voller
   Fensterbreite (Tabelle = 100% = Fensterbreite) als auch oberhalb von
   --app-max-width (Tabelle zentriert, der reservierte Streifen bleibt
   rechts frei) exakt denselben Bereich, ganz ohne JavaScript-Vermessung.
   top/height nutzen die bereits bestehende --tc-kopf-hoehe-Variable
   (siehe framework/Kopfzeile/Default.php), damit die Leiste immer exakt
   unterhalb des (ggf. beim Scrollen einfahrenden) Kopfbereichs beginnt. */
.tc-statusleiste {
	position: fixed;
	top: var(--tc-kopf-hoehe, 0px);
	right: 0;
	width: var(--sidebar-right-width);
	height: calc(100vh - var(--tc-kopf-hoehe, 0px));
	overflow-y: auto;
	background-color: var(--color-background);
	border-left: 1px solid var(--color-border);
	padding: var(--spacing-md) var(--spacing-sm);
	box-sizing: border-box;
	z-index: 40;
	display: flex;
	flex-direction: column;
	gap: var(--spacing-sm);
}
/* Unterhalb 1600px kein reservierter Streifen mehr (siehe Aufloesung oben)
   - die Leiste ist dort standardmaessig unsichtbar und wird ausschliesslich
   ueber den Avatar-Umschaltknopf als volles Overlay eingeblendet (Auftrag
   Punkt 21: "Leiste darf einklappbar werden"). Bewusst dieselbe 1600px-
   Schwelle wie die bestehende Spaltenreservierung - ein Wert statt zwei. */
@media (max-width: 1599px) {
	.tc-statusleiste {
		display: none;
		top: 0;
		height: 100vh;
		width: min(320px, 88vw);
		box-shadow: -6px 0 20px rgba(0, 0, 0, .18);
		z-index: 60;
	}
	.tc-statusleiste.tc-statusleiste--offen {
		display: flex;
	}
}

.tc-statusleiste-section {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: var(--spacing-sm);
	flex: 0 0 auto;
}
.tc-statusleiste-section-titel {
	font-size: .7rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .04em;
	color: var(--color-text-muted);
	margin-bottom: 8px;
}

/* Schliessen-Knopf - nur im schmalen Overlay-Modus sichtbar (siehe
   framework/Statusleiste/Default.php: dort deckt die Leiste die gesamte
   Bildschirmhoehe inkl. Kopfzeile ab, der Umschaltknopf selbst waere sonst
   nicht mehr erreichbar). */
.tc-statusleiste-schliessen {
	display: none;
}
@media (max-width: 1599px) {
	.tc-statusleiste-schliessen {
		display: block;
		margin-left: auto;
		background: none;
		border: none;
		font-size: 1.1rem;
		line-height: 1;
		color: var(--color-text-muted);
		cursor: pointer;
		padding: 6px;
		align-self: flex-end;
	}
	.tc-statusleiste-schliessen:hover {
		color: var(--color-text);
	}
}

.tc-statusleiste-benutzer {
	text-align: center;
}
.tc-statusleiste-benutzer .tc-avatar {
	margin: 0 auto 8px;
}
/* Feinschliff (03.09.2026, Auftrag Punkt 6): Avatar zusaetzlich als eigene,
   dezent interaktive Flaeche auf "Mein Profil bearbeiten" - bewusst sehr
   zurueckhaltend (leichtes Abdunkeln + duenner Ring), kein kraeftiger
   Flaechenwechsel wie bei den uebrigen Links. Neutralisiert dafuer
   ausdruecklich die globale "a:hover"-Regel (blauer Block, siehe
   Ursachenerklaerung weiter oben bei .tc-neu-card-link), die auf einer
   runden Flaeche unpassend wirken wuerde. */
.tc-statusleiste-avatar-link {
	display: inline-block;
	border-radius: 50%;
	line-height: 0;
}
.tc-statusleiste-avatar-link:hover,
.tc-statusleiste-avatar-link:focus-visible {
	background-color: transparent;
	box-shadow: 0 0 0 3px var(--color-info-subtle);
}
.tc-statusleiste-avatar-link:hover .tc-avatar {
	filter: brightness(.92);
}
.tc-statusleiste-avatar-link:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-statusleiste-benutzer-name {
	font-weight: 700;
	font-size: .95rem;
	margin-bottom: 8px;
	overflow-wrap: break-word;
}
.tc-statusleiste-benutzer-aktionen {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.tc-statusleiste-benutzer-aktionen a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	font-size: .82rem;
	font-weight: 600;
	color: var(--color-text-muted);
	text-decoration: none;
	padding: 6px 8px;
	border-radius: var(--radius-small);
}
.tc-statusleiste-benutzer-aktionen a .tc-icon {
	width: 15px;
	height: 15px;
}
.tc-statusleiste-benutzer-aktionen a:hover {
	background-color: var(--color-background);
	color: var(--color-primary);
}

/* "Meine Tickets" (Feinschliff 03.09.2026, Auftrag Punkt 1/2/3/4): zentriert
   statt linksbuendig, Eskaliert-Angabe jetzt in derselben Zeile wie die
   Hauptzahl statt darunter. Die Zahl bleibt der visuelle Schwerpunkt
   (Punkt 4/8), deutlich groesser als die vorherige Kopfzeilen-Anzeige, aber
   kompakter als die grossen Startcenter-Kacheln. */
.tc-statusleiste-kennzahl {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	text-decoration: none;
	color: inherit;
	padding: 10px 4px;
	border-bottom: 1px solid var(--color-border);
	border-radius: var(--radius-small);
}
.tc-statusleiste-kennzahl:last-child {
	border-bottom: none;
}
.tc-statusleiste-kennzahl-hauptzeile {
	display: inline-flex;
	align-items: baseline;
	gap: 6px;
}
.tc-statusleiste-kennzahl-zahl {
	font-size: 1.7rem;
	font-weight: 700;
	line-height: 1.1;
	color: var(--color-text);
	transition: color .15s ease;
}
.tc-statusleiste-kennzahl-label {
	display: block;
	font-size: .82rem;
	color: var(--color-text-muted);
	margin-top: 2px;
}
.tc-statusleiste-kennzahl-eskaliert {
	display: inline-flex;
	align-items: center;
	gap: 2px;
	font-size: 1rem;
	font-weight: 700;
	color: var(--color-danger-strong);
}
/* Hover-Korrektur (Auftrag Punkt 3/13): die gesamte Kennzahl IST der Link
   (<a>), die bereits bestehende GLOBALE Regel "a:hover" (siehe
   Basis-Selektorenblock weiter oben in dieser Datei) faerbt ihn dadurch
   automatisch blau ein - Zahl/Beschriftung/Eskaliert-Wert haben aber alle
   eigene, davon abweichende Textfarben gesetzt, die NICHT automatisch vom
   Elternelement erben (derselbe bereits einmal dokumentierte Fehlertyp wie
   bei .tc-neu-card-link, siehe dortige Ursachenerklaerung) - deshalb hier
   fuer alle sichtbaren Kindelemente explizit auf eine helle Farbe
   umgeschaltet, sobald der blaue Hintergrund aktiv ist. */
.tc-statusleiste-kennzahl:hover .tc-statusleiste-kennzahl-zahl,
.tc-statusleiste-kennzahl:hover .tc-statusleiste-kennzahl-label,
.tc-statusleiste-kennzahl:hover .tc-statusleiste-kennzahl-eskaliert {
	color: #FFF;
}

/* "Mein Wertkonto" (Feinschliff 03.09.2026, Auftrag Punkt 7): jetzt groesser
   und zentriert, optisch naeher an einer Kennzahl - bewusst trotzdem
   kleiner als die Ticketzahlen (1.55rem vs. 1.7rem), damit der Betrag
   auffaellt, aber nicht dominiert. */
.tc-statusleiste-wertkonto {
	display: block;
	text-align: center;
	text-decoration: none;
	color: var(--color-text);
	font-size: 1.55rem;
	font-weight: 700;
	padding: 4px;
	border-radius: var(--radius-small);
}
/* Hover-Korrektur - derselbe Fehlertyp/dieselbe Loesung wie bei den
   Ticketkennzahlen oben (globale "a:hover" liefert den blauen Hintergrund,
   die eigene Textfarbe muss dabei explizit auf hell wechseln). */
.tc-statusleiste-wertkonto:hover {
	color: #FFF;
}

/* "Sitzung" (Feinschliff 03.09.2026, Auftrag Punkt 9/10): Label+Wert je
   Zeile statt eines Fliesstextsatzes, die genaue Ablaufuhrzeit nur noch
   als kleine Nebeninfo - die verbleibende Restzeit ist die fuer den
   Benutzer wichtigere Angabe (Auftrag-Begruendung) und steht deshalb
   optisch vorne/groesser. */
.tc-statusleiste-sitzung-zeile {
	display: flex;
	justify-content: space-between;
	align-items: baseline;
	gap: 8px;
	font-size: .82rem;
	margin-bottom: 4px;
}
.tc-statusleiste-sitzung-label {
	color: var(--color-text-muted);
}
.tc-statusleiste-sitzung-wert {
	font-weight: 700;
	color: var(--color-text);
	white-space: nowrap;
}
.tc-statusleiste-sitzung-nebeninfo {
	font-size: .72rem;
	color: var(--color-text-muted);
	text-align: right;
}

/* ==========================================================================
   Administration Ticketgruppen/Ticketarten/Ticketaktionen/Ticketaufgaben
   modernisieren (04.09.2026): letzter grosser, bislang unmodernisierter
   Backend-Bereich - Dreamweaver-Tabellenoptik durch die bestehende 2026er
   Designsprache ersetzt (.tc-form-card/.ticket-list-view/tc_icon()/
   .app-header-cta bereits vorhanden und wiederverwendet). Diese neuen
   Klassen decken nur das ab, wofuer es noch keine passende Komponente gab:
   kompakter Listenkopf, Status-/Farbanzeige, Zeilen-Aktionslinks,
   Erfolg/Fehler-Meldungsbanner sowie der neue Kontextkopf mit Tab-Leiste
   fuer Ticketart/Aktionen/Aufgaben/Anhaenge. Keine Datenbankaenderung. */

.tc-admin-kopf {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--spacing-md);
	margin-bottom: var(--spacing-md);
}
.tc-admin-kopf-titel {
	font-size: 1.3rem;
	font-weight: 700;
	color: var(--color-text);
	margin: 0;
}
/* Ebenen-Kennzeichnung (Auftrag "Konfigurationsseiten kontrastreicher
   trennen und klarer strukturieren", 09.09.2026): dashboard/bearbeiten.php
   (Dashboard-Ebene) und dashboard/widget_bearbeiten.php (Widget-Ebene)
   sehen sich strukturell sehr aehnlich (gleicher .tc-admin-kopf, gleiche
   .tc-form-card-Abschnitte) - dieses kleine, farblich unterschiedene
   Etikett macht auf den ersten Blick klar, auf welcher der beiden Ebenen
   man sich gerade befindet, ohne den Seitentitel selbst umformulieren zu
   muessen. */
.tc-dash-ebene-label {
	display: inline-flex;
	align-items: center;
	margin-bottom: 6px;
	padding: 2px 9px;
	border-radius: 999px;
	font-size: .7rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
}
.tc-dash-ebene-label--dashboard {
	background-color: color-mix(in srgb, var(--color-primary) 16%, transparent);
	color: var(--color-primary);
}
.tc-dash-ebene-label--widget {
	background-color: color-mix(in srgb, var(--color-success) 16%, transparent);
	color: var(--color-success);
}
.tc-admin-kopf-untertitel {
	font-size: .88rem;
	color: var(--color-text-muted);
	margin-top: 2px;
}

/* Erfolg-/Fehlermeldung nach einer Aktion (Anlegen/Aendern/Loeschen) - bisher
   projektweit nur als nackter LinkText-Satz vorhanden, hier erstmals als
   dezenter Banner. Farben von der bereits vorhandenen
   .tc-form-loeschen-hinweis uebernommen (Fehler) bzw. den bestehenden
   --color-success*-Variablen (Erfolg), kein neues Farbsystem. */
.tc-admin-meldung {
	border-radius: var(--radius-small);
	padding: 10px 12px;
	font-size: .9rem;
	margin-bottom: var(--spacing-md);
	border: 1px solid;
}
.tc-admin-meldung--fehler {
	background-color: var(--color-danger-subtle);
	color: var(--color-danger);
	border-color: var(--color-danger);
}
.tc-admin-meldung--erfolg {
	background-color: color-mix(in srgb, var(--color-success) 12%, var(--color-surface));
	color: var(--color-success-dark);
	border-color: var(--color-success);
}
.tc-admin-meldung--warnung {
	background-color: var(--color-warning-subtle, #FFF6DC);
	color: var(--color-warning-dark, #6B4E00);
	border-color: var(--color-warning, #B8860B);
}

.tc-admin-status-badge {
	display: inline-flex;
	align-items: center;
	padding: 3px 10px;
	border-radius: var(--radius-large);
	font-size: .78rem;
	font-weight: 600;
	white-space: nowrap;
}
.tc-admin-status-badge--aktiv {
	background-color: color-mix(in srgb, var(--color-success) 16%, var(--color-surface));
	color: var(--color-success-dark);
}
.tc-admin-status-badge--inaktiv {
	background-color: var(--color-border);
	color: var(--color-text-muted);
}
/* Benutzerverwaltung (04.09.2026): cms_benutzer.status kennt vier statt nur
   zwei Zustaende (Neu/Aktiv/Gesperrt/Verteiler) - zwei zusaetzliche
   Auspraegungen desselben Badge-Bausteins. */
.tc-admin-status-badge--gesperrt {
	background-color: color-mix(in srgb, var(--color-danger) 14%, var(--color-surface));
	color: var(--color-danger);
}
.tc-admin-status-badge--neu {
	background-color: color-mix(in srgb, var(--color-warning) 16%, var(--color-surface));
	color: var(--color-warning);
}
/* Kooperationspartner-Ticket-Widget (Folgeauftrag 23.09.2026): Eigentums-
   kennzeichnung "BeWo-Geraet" vs. "Kooperationspartner-Geraet" muss laut
   Auftrag "auf einen Blick erkennbar" sein - zwei weitere, klar
   unterscheidbare Auspraegungen desselben Badge-Bausteins. */
.tc-admin-status-badge--bewo {
	background-color: color-mix(in srgb, var(--color-primary) 14%, var(--color-surface));
	color: var(--color-primary-dark);
}
.tc-admin-status-badge--partner {
	background-color: color-mix(in srgb, var(--color-warning) 16%, var(--color-surface));
	color: var(--color-warning-dark);
}

.tc-admin-farbchip {
	display: inline-block;
	width: 14px;
	height: 14px;
	border-radius: 4px;
	border: 1px solid rgba(0, 0, 0, .15);
	vertical-align: middle;
	margin-right: 7px;
	flex-shrink: 0;
}

.tc-admin-aktionen {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
}
/* Auftrag (20.09.2026, "Benutzerverwaltung optisch aufräumen", Punkt 12):
   in den Spalten "Ticket-Einstellungen"/"Grundeinstellungen" stehen die
   Funktionen pro Benutzer untereinander statt nebeneinander, damit
   längere Bezeichnungen ("Freischaltung aufheben", "Kennwort
   zurücksetzen") nicht mehr umbrechen/zusammengedrängt wirken - nur diese
   beiden Spalten, die globale .tc-admin-aktionen-Regel bleibt fuer alle
   anderen Verwendungsstellen unveraendert. */
.tc-admin-aktionen--spalte {
	flex-direction: column;
	align-items: flex-start;
	gap: 6px;
}
.tc-admin-aktion-link {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--color-text-muted);
	text-decoration: none;
	font-size: .85rem;
	white-space: nowrap;
}
.tc-admin-aktion-link:hover {
	color: var(--color-primary);
	text-decoration: underline;
}
.tc-admin-aktion-link--loeschen:hover {
	color: var(--color-danger);
}
/* Korrekturauftrag (24.09.2026, "systemweite Kontrast-/
   Lesbarkeitspruefung"): Root-Cause-Fix statt Einzelstellen-Flickerei -
   ein <button class="tc-admin-aktion-link"> OHNE den (bisher separaten,
   oft vergessenen) Modifikator --als-button behielt den globalen
   Blau-Hintergrund fuer <button>-Elemente (siehe input[type=submit]/
   input[type=button]/button weiter oben), waehrend :hover oben die
   Textfarbe auf denselben Blauton setzt wie dieser verbliebene
   Hintergrund - Text und Hintergrund wurden identisch blau und damit
   unlesbar (konkret gemeldeter Bug, an mehreren Stellen aufgetreten).
   Der Reset gilt deshalb jetzt IMMER automatisch fuer jedes <button>/
   <input>-Element mit dieser Klasse, unabhaengig davon, ob --als-button
   zusaetzlich gesetzt wurde - <a>-Elemente sind unberuehrt (hatten nie
   einen Hintergrund). --als-button bleibt als expliziter, weiterhin
   gueltiger Alias bestehen (Rueckwaertskompatibilitaet, keine
   Markup-Aenderung noetig). */
button.tc-admin-aktion-link,
input.tc-admin-aktion-link,
.tc-admin-aktion-link--als-button {
	min-height: 0;
	padding: 0;
	border: none;
	background: none;
	font: inherit;
	cursor: pointer;
}

.tc-admin-leer {
	color: var(--color-text-muted);
	font-size: .9rem;
	padding: var(--spacing-lg);
	text-align: center;
}

/* Benutzerverwaltung (04.09.2026): kleiner grauer Zusatztext unter einem
   Namen (z. B. der Anmeldename unter dem echten Namen in der Liste). */
.tc-admin-untertext {
	display: block;
	font-size: .78rem;
	color: var(--color-text-muted);
	margin-top: 2px;
}

/* Kontextkopf (Ticketart/Aktionen/Aufgaben/Anhaenge, siehe
   includes/admin_ticket_kontextkopf.php): zeigt jederzeit Gruppe > Ticketart
   plus eine Tab-Leiste fuer den aktuellen Unterbereich - vorher gab es
   dafuer laut Analyse gar keine gemeinsame Stelle. */
.tc-admin-kontext {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: var(--spacing-md) var(--spacing-lg);
	margin-bottom: var(--spacing-md);
}
.tc-admin-kontext-pfad {
	font-size: .95rem;
	color: var(--color-text);
	margin-bottom: 8px;
}
.tc-admin-kontext-pfad-gruppe {
	color: var(--color-text-muted);
}
.tc-admin-kontext-pfad-art {
	font-weight: 700;
}
.tc-admin-tabs {
	display: flex;
	gap: 4px;
	flex-wrap: wrap;
	border-top: 1px solid var(--color-border);
	padding-top: 10px;
}
.tc-admin-tab {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 7px 14px;
	border-radius: var(--radius-small);
	color: var(--color-text-muted);
	text-decoration: none;
	font-size: .88rem;
	font-weight: 600;
}
.tc-admin-tab:hover {
	background-color: var(--color-background);
	color: var(--color-text);
}
.tc-admin-tab--aktiv,
.tc-admin-tab--aktiv:hover {
	background-color: var(--color-primary);
	color: #FFF;
}

/* Kompakte, wiederholte Kartenreihe fuer die 20 Ticketart-Zusatzfelder
   (bisher eine ~500 Zeilen lange Formularstrecke) - Feldnamen/Verhalten
   unveraendert, nur die Anordnung wird uebersichtlicher. Vier Spalten:
   laufende Nummer, Name, Feldart, Inhalt (Vorbelegung/Optionsliste je nach
   Feldart) - faellt unterhalb von ~900px auf zwei Spalten zurueck, damit
   die Eingabefelder nicht zusammengequetscht werden. */
.tc-admin-zusatzfeld-karte {
	display: grid;
	grid-template-columns: 28px 1fr 140px 1fr;
	gap: 10px;
	align-items: start;
	padding: 8px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	margin-bottom: 6px;
}
@media (max-width: 900px) {
	.tc-admin-zusatzfeld-karte {
		grid-template-columns: 28px 1fr;
	}
}
.tc-admin-zusatzfeld-nr {
	color: var(--color-text-muted);
	font-size: .8rem;
	font-weight: 700;
	text-align: center;
	padding-top: 8px;
}
.tc-admin-zusatzfeld-label {
	display: block;
	font-size: .72rem;
	color: var(--color-text-muted);
	margin-bottom: 2px;
}

/* ==========================================================================
   Ticketgruppen/Ticketarten: Live-Suche, Vorschaubilder, Aktiv/Inaktiv-
   Sortierung, vollstaendiges Duplizieren (04.09.2026) - reine Ergaenzung,
   keine bestehenden Klassen veraendert. */

.tc-admin-suche {
	position: relative;
	margin-bottom: var(--spacing-md);
	max-width: 360px;
}
.tc-admin-suche-eingabe,
input.tc-admin-suche-eingabe { /* 02.10.2026: Spezifitaet gegen input[type="search"] (Innenabstand fuer die Lupe) */
	width: 100%;
	box-sizing: border-box;
	padding: 8px 12px 8px 34px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	font-size: .9rem;
	background-color: var(--color-surface);
	color: var(--color-text);
}
.tc-admin-suche-icon {
	position: absolute;
	left: 10px;
	top: 50%;
	transform: translateY(-50%);
	color: var(--color-text-muted);
	pointer-events: none;
}
.tc-admin-suche-keine-treffer {
	color: var(--color-text-muted);
	font-size: .9rem;
	padding: var(--spacing-md);
	text-align: center;
}

/* Benutzerverwaltung weiter modernisieren (05.09.2026): Gruppen-Bubbles
   (.tc-history-view-toggle/-btn, bereits projektweit etabliert) +
   Schnellfilter "Nur aktive Benutzer"/"Nur Verteilerlisten"
   (.tc-log-meine-btn, ebenfalls bereits etabliert) - hier nur die neue
   Suchzeile, die Suchfeld (behaelt seine eigene max-width) und die beiden
   Toggle-Buttons nebeneinander in eine gemeinsame, umbrechende Zeile stellt. */
.tc-admin-suchzeile {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--spacing-sm, 8px);
	margin-bottom: var(--spacing-md);
}
.tc-admin-suchzeile .tc-admin-suche {
	margin-bottom: 0;
	flex: 1 1 240px;
}

/* Aktionsleiste neben "Benutzerprofile" (Auftrag Punkt 9): "+ Neuer Benutzer"
   bleibt die primaere .app-header-cta, die drei neu integrierten Alt-
   Funktionen (Massenfilter/Filter definieren/Filter duplizieren) nutzen
   dieselbe Form als zurueckhaltendere Sekundaervariante - keine neue
   Button-Komponente, nur ein Farb-Modifier. */
.tc-admin-kopf-aktionen {
	display: flex;
	flex-wrap: wrap;
	gap: var(--spacing-sm, 8px);
}
.app-header-cta--sekundaer {
	background-color: var(--color-surface);
	color: var(--color-text) !important;
	border: 1px solid var(--color-border-strong);
}
.app-header-cta--sekundaer:hover {
	background-color: var(--color-surface-hover, var(--color-border));
	color: var(--color-text) !important;
}

/* Vorschaubild - feste Groesse fuer Bild UND Platzhalter, damit die Zeile
   nie umspringt (Auftrag: "Layout darf nicht verrutschen"). */
.tc-admin-vorschaubild {
	display: inline-block;
	border-radius: var(--radius-small);
	vertical-align: middle;
	margin-right: 8px;
	object-fit: cover;
	flex-shrink: 0;
}
.tc-admin-vorschaubild-platzhalter {
	border: 1px solid rgba(0, 0, 0, .08);
}

/* Aktiv/Inaktiv-Trennung: dezente Abschnittszeile plus leicht ausgegraute
   inaktive Zeilen - Trennung hat Vorrang vor der alphabetischen
   Sortierung innerhalb der beiden Bloecke (bereits serverseitig sortiert,
   diese Klassen sind rein optisch). */
table.ticket-list-view tr.tc-admin-trenner td {
	background-color: var(--color-background);
	color: var(--color-text-muted);
	font-size: .78rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	padding-top: 6px;
	padding-bottom: 6px;
}
table.ticket-list-view tr.tc-admin-row--inaktiv {
	opacity: .6;
}

/* Korrekturauftrag (24.09.2026), Abschnitt 13: Mindestbestands-
   Warnzeile - deutlich rotes Zeilenhintergrund PLUS Warnsymbol/-text im
   Badge (siehe warenwirtschaft/bestaende/lagerbestand.php), damit die
   Warnung nie ausschliesslich ueber Farbe vermittelt wird. Heller
   Rotton (--color-danger-subtle) mit unveraenderter, ohnehin bereits
   dunkler Standard-Textfarbe der Zeile - bewusst KEIN dunkler/farbiger
   Hintergrund mit ebenfalls farbigem Text (siehe Fund "blaue Schrift auf
   blauem Grund" desselben Auftrags, Abschnitt 1). */
table.ticket-list-view tr.tc-wwi-mindestbestand-warnung {
	background-color: var(--color-danger-subtle);
}
table.ticket-list-view tr.tc-wwi-mindestbestand-warnung:hover td {
	background-color: color-mix(in srgb, var(--color-danger-subtle) 70%, var(--color-surface));
}

/* Fehlerrunde (24.09.2026), Punkt 6 "Warenwirtschaft: Geraetebewegungen
   kompakter" (warenwirtschaft/bewegungsuebersicht/index.php): schmalere
   Zellen-Innenabstaende nur fuer diese Tabelle (nicht global, um Ticket-/
   Protokoll-/Kontolisten unveraendert zu lassen) sowie eine Kuerzungs-Zelle
   fuer potenziell lange Objekt-/Von-/Nach-Inhalte - volle Werte bleiben ueber
   das title-Tooltip auf derselben Zelle abrufbar. */
table.tc-wwi-kompakt-tabelle th,
table.tc-wwi-kompakt-tabelle td {
	padding: 6px 6px;
	font-size: 13px;
}
.tc-wwi-kompakt-zelle {
	max-width: 0;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.tc-wwi-kein-ticket {
	color: var(--color-text-muted);
}

/* Kompakte Bewegungsdarstellung (28.09.2026): zentrale Richtungs-Symbolik
   (tc_wwi_richtung_symbol_html()) und praefixfreie Ortsanzeige mit Typ-
   Symbol (tc_wwi_ort_kompakt_html()) - gemeinsam fuer Bewegungsuebersicht,
   Geraete-/Materialdetails und Bewegungserfassung. Farben zusaetzlich zur
   Form, nie als alleiniges Unterscheidungsmerkmal (Tooltip/Screenreader-Text
   nennen die Richtung immer ausgeschrieben). */
.tc-wwi-richtung {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	vertical-align: middle;
	white-space: nowrap;
}
.tc-wwi-richtung .tc-icon {
	width: 16px;
	height: 16px;
	flex: 0 0 auto;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.6;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.tc-wwi-richtung--eingang { color: var(--color-success); }
.tc-wwi-richtung--ausgang { color: var(--color-danger); }
.tc-wwi-richtung--umbuchung { color: var(--color-primary); }
.tc-wwi-richtung--storno { opacity: .55; }
.tc-wwi-richtung--storno .tc-icon { stroke-dasharray: 2 1.5; }
.tc-wwi-richtung-text { color: var(--color-text); }
.tc-wwi-richtung-filter .tc-icon {
	fill: none;
	stroke: currentColor;
	stroke-width: 1.6;
	stroke-linecap: round;
	stroke-linejoin: round;
	vertical-align: -2px;
}
.tc-wwi-ort .tc-icon {
	width: 12px;
	height: 12px;
	margin-right: 4px;
	vertical-align: -1px;
	fill: none;
	stroke: var(--color-text-muted);
	stroke-width: 1.4;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.tc-wwi-ort--unbekannt {
	color: var(--color-text-muted);
}
table.tc-wwi-kompakt-tabelle .tc-wwi-benutzer-anzeige {
	white-space: nowrap;
}
.tc-wwi-nebenzeile {
	display: block;
	font-size: 11px;
	color: var(--color-text-muted);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
/* Kopfzeile ueber gefilterten Bewegungslisten in Geraete-/Materialdetails -
   dieselben Bausteine wie die Bewegungsuebersicht (Richtungsumschalter,
   Trefferzahl, Sortierrichtungs-Pfeil), nur ohne Sticky/Pin. */
.tc-wwi-historie-kopf {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 8px 16px;
	margin-bottom: 8px;
}
/* Storno-/Wertstellungs-Popover in der Geraete-Bewegungshistorie liegen im
   horizontal scrollenden .tc-list-scroll - overflow-x:auto erzwingt dort
   auch vertikales Abschneiden (innerer Scrollbalken statt sichtbarem
   Popover). Solange ein Popover offen ist, bekommt nur dieser Container
   Platz nach unten; alle anderen Listen bleiben unveraendert. */
.tc-list-scroll:has(> table.tc-wwi-kompakt-tabelle .tc-toolbar-popover:not([hidden])) {
	padding-bottom: 140px;
}
.tc-wwi-historie-kopf-rechts {
	display: flex;
	align-items: center;
	gap: 8px;
}

/* Deaktivierte Zeilen-Aktion (Loeschen bei noch vorhandenen Tickets) -
   dieselbe Grundoptik wie .tc-admin-aktion-link, aber ohne Klickbarkeit. */
.tc-admin-aktion-link--deaktiviert {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--color-text-muted);
	opacity: .5;
	font-size: .85rem;
	white-space: nowrap;
	cursor: not-allowed;
}

/* ==========================================================================
   Dynamische Formular-Zusatzfelder: modernisierter Formular-Builder
   (04.09.2026, Auftrag "Dynamische Formular-Zusatzfelder der Ticketarten
   grundlegend modernisieren und erweitern") - ersetzt die bisher immer
   sichtbaren 20 Karten (.tc-admin-zusatzfeld-karte) durch eine
   eingeklappte Kartenliste mit progressiver Offenlegung. Reine
   Praesentationsschicht - js/admin-zusatzfeld-builder.js steuert
   sichtbar/eingeklappt/aufgeklappt, die tatsaechlichen Formularfelder
   (N_name/N_art/N_inhalt) bleiben unveraendert. */
.tc-zf-builder {
	max-width: 100%;
}
.tc-zf-karte {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	margin-bottom: 8px;
	background-color: var(--color-surface);
}
.tc-zf-karte-kopf {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 12px;
}
.tc-zf-karte-nr {
	color: var(--color-text-muted);
	font-size: .82rem;
	font-weight: 700;
	flex: 0 0 auto;
}
.tc-zf-karte-zusammenfassung {
	flex: 1 1 auto;
	min-width: 0;
	font-size: .88rem;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-zf-karte-zusammenfassung .tc-zf-zusammenfassung-name {
	font-weight: 600;
}
.tc-zf-karte-zusammenfassung .tc-zf-zusammenfassung-meta {
	color: var(--color-text-muted);
}
.tc-zf-karte-aktionen {
	display: flex;
	gap: 4px;
	flex: 0 0 auto;
}
.tc-zf-karte-aktionen button {
	background-color: var(--color-background);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 4px 8px;
	font-size: .78rem;
	cursor: pointer;
	color: var(--color-text);
}
.tc-zf-karte-aktionen button:hover {
	border-color: var(--color-primary);
	background-color: var(--color-info-subtle);
}
.tc-zf-karte-aktionen button:disabled {
	opacity: .4;
	cursor: not-allowed;
}
.tc-zf-btn-loeschen:hover {
	border-color: var(--color-danger, #c0392b);
	color: var(--color-danger, #c0392b);
}
.tc-zf-karte-details {
	padding: 4px 12px 12px 12px;
	border-top: 1px solid var(--color-border);
}
.tc-zf-zeile {
	margin-top: 8px;
}
.tc-zf-zeile--typreihe {
	display: flex;
	align-items: center;
	gap: 14px;
	flex-wrap: wrap;
}
.tc-zf-zeile--typreihe .tc-zf-typ {
	flex: 1 1 220px;
}
.tc-zf-pflicht-label,
.tc-zf-hervorheben-label {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: .85rem;
	white-space: nowrap;
}
.tc-zf-optionen-editor {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.tc-zf-options-zeile {
	display: flex;
	align-items: center;
	gap: 6px;
}
.tc-zf-options-zeile input[type="text"] {
	flex: 1 1 auto;
}
.tc-zf-options-zeile button {
	flex: 0 0 auto;
	background-color: var(--color-background);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 3px 7px;
	font-size: .78rem;
	cursor: pointer;
	color: var(--color-text);
}
.tc-zf-options-zeile button:hover {
	border-color: var(--color-primary);
	background-color: var(--color-info-subtle);
}
.tc-zf-options-zeile button:disabled {
	opacity: .4;
	cursor: not-allowed;
}
.tc-zf-options-hinweis {
	font-size: .78rem;
	color: var(--color-danger, #c0392b);
	margin-top: 2px;
	min-height: 1em;
}
.tc-zf-btn-option-hinzufuegen {
	align-self: flex-start;
	background-color: var(--color-background);
	border: 1px dashed var(--color-border-strong);
	border-radius: var(--radius-small);
	padding: 5px 10px;
	font-size: .82rem;
	cursor: pointer;
	margin-top: 2px;
	color: var(--color-text);
}
.tc-zf-btn-option-hinzufuegen:hover {
	border-color: var(--color-primary);
	background-color: var(--color-info-subtle);
}
.tc-zf-fuss {
	display: flex;
	align-items: center;
	gap: 14px;
	margin-top: 4px;
}
.tc-zf-zaehler {
	font-size: .82rem;
	color: var(--color-text-muted);
}
.tc-zf-btn-hinzufuegen {
	background-color: var(--color-primary);
	color: #FFF;
	border: none;
	border-radius: var(--radius-small);
	padding: 7px 14px;
	font-size: .85rem;
	cursor: pointer;
}
.tc-zf-btn-hinzufuegen:disabled {
	background-color: var(--color-border-strong);
	cursor: not-allowed;
}
.tc-zf-voll-hinweis {
	font-size: .82rem;
	color: var(--color-text-muted);
}

/* Vorschau-Bereich fuer die oben konfigurierten Zusatzfelder (Auftrag
   "Vorschau-Bereich fuer Zusatzfelder", 21.09.2026): zwei gleich breite
   Spalten (Bearbeitung/Ansicht), reine Anzeige mit Beispielwerten - siehe
   js/admin-zusatzfeld-builder.js fuer die Befuellung. Struktur/Klassen der
   Vorschau-Felder selbst sind bewusst identisch zu den echten
   .tc-neu-field-/.tc-detail-field-Elementen (siehe dort), damit keine
   zusaetzlichen, parallel zu pflegenden Feld-Stile noetig sind. */
.tc-zf-vorschau {
	margin-top: var(--spacing-md);
	padding-top: var(--spacing-md);
	border-top: 1px solid var(--color-border);
}
.tc-zf-vorschau-titel {
	font-family: var(--font-system);
	font-size: 1rem;
	font-weight: 700;
	color: var(--color-text);
	margin: 0 0 2px 0;
}
.tc-zf-vorschau-spalten {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: 16px 24px;
	margin-top: 10px;
}
@media (max-width: 900px) {
	.tc-zf-vorschau-spalten {
		grid-template-columns: 1fr;
	}
}
.tc-zf-vorschau-spalte {
	min-width: 0;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	padding: 10px;
}
.tc-zf-vorschau-spalten-titel {
	font-family: var(--font-system);
	font-size: .82rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
	color: var(--color-text-muted);
	margin: 0 0 8px 0;
}
/* Eingabeelemente in der Vorschau sind bewusst deaktiviert (siehe JS) -
   dieselbe optische Sprache wie anderswo im Projekt fuer nicht bedienbare
   Formularelemente. */
.tc-zf-vorschau .EingabeFeld:disabled,
.tc-zf-vorschau input:disabled {
	background-color: var(--color-background);
	cursor: default;
}
.tc-zf-vorschau-platzhalter {
	font-style: italic;
	color: var(--color-text-muted);
}
.tc-zf-vorschau .tc-neu-field-grid {
	display: flex;
	flex-direction: column;
	gap: 10px;
}

/* ==========================================================================
   Ticketsystem-Rechte-Matrix (04.09.2026, Auftrag "Benutzerverwaltung
   modernisieren"): ersetzt 19 gleichrangige Ja/Nein-Dropdown-Zeilen durch
   thematisch gruppierte Karten mit Toggle-Checkboxen. Die zugrunde liegenden
   Formularfelder/-werte ("Ja"/"Nein" je Recht) bleiben fuer den
   unveraenderten Speicher-Handler exakt gleich - siehe benutzerprofile/
   berechtigungen/aendern.php fuer das Hidden-Feld+Checkbox-Muster. */
.tc-rechte-gruppen {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
	gap: var(--spacing-md);
	margin: var(--spacing-md) 0;
}
.tc-rechte-gruppe {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: var(--spacing-md);
	background-color: var(--color-surface);
}
.tc-rechte-gruppe-titel {
	font-size: .85rem;
	font-weight: 700;
	color: var(--color-text);
	margin: 0 0 var(--spacing-sm) 0;
	padding-bottom: 6px;
	border-bottom: 1px solid var(--color-border);
}
.tc-rechte-liste {
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.tc-rechte-toggle {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: .88rem;
	cursor: pointer;
}
.tc-rechte-toggle input[type="checkbox"] {
	flex: 0 0 auto;
	width: 34px;
	height: 19px;
	appearance: none;
	-webkit-appearance: none;
	background-color: var(--color-border-strong);
	border-radius: 10px;
	position: relative;
	cursor: pointer;
	transition: background-color .12s ease;
}
.tc-rechte-toggle input[type="checkbox"]::before {
	content: "";
	position: absolute;
	top: 2px;
	left: 2px;
	width: 15px;
	height: 15px;
	border-radius: 50%;
	background-color: #FFF;
	transition: transform .12s ease;
}
.tc-rechte-toggle input[type="checkbox"]:checked {
	background-color: var(--color-success);
}
.tc-rechte-toggle input[type="checkbox"]:checked::before {
	transform: translateX(15px);
}

/* Rechtematrix (Filter definieren/duplizieren) - Konzept-Ueberarbeitung
   07.09.2026, Auftrag "Filtervergabe und Filter duplizieren konzeptionell
   verbessern": ersetzt die frueher hier eingebundene, unveraendert
   gebliebene Alt-Tabelle (siehe Git-Historie filter_neu/index.php vor
   diesem Commit) durch eine Gruppen-Akkordeon-Darstellung. Farben (hgfarbe)
   bewusst nur noch als kleiner Chip/Streifen statt Tabellenhintergrund -
   siehe Auftrag "keine grossflaechigen Neon-Hintergruende mehr". Nutzt
   durchgehend bestehende Tokens/Komponenten (tc-admin-suche, tc-log-meine-
   btn, tc-admin-status-badge, tc-form-card, tc-admin-meldung, app-header-
   cta) - keine neue isolierte Designwelt.
*/
.tc-rm-steuerung {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--spacing-sm);
	margin-bottom: var(--spacing-md);
}
.tc-rm-steuerung .tc-admin-suche {
	flex: 1 1 220px;
	min-width: 180px;
}
.tc-rm-steuerung-trenner {
	width: 1px;
	align-self: stretch;
	background-color: var(--color-border);
	margin: 0 2px;
}
.tc-rm-aufklapp-btn {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 6px 12px;
	border-radius: var(--radius-large);
	border: 1px solid var(--color-border-strong);
	background-color: var(--color-surface);
	color: var(--color-text);
	font-size: .82rem;
	cursor: pointer;
	white-space: nowrap;
}
.tc-rm-aufklapp-btn:hover {
	background-color: var(--color-background);
}
.tc-rm-aufklapp-btn--gefahr {
	color: var(--color-danger);
	border-color: var(--color-danger);
}
.tc-rm-aufklapp-btn--gefahr:hover {
	background-color: color-mix(in srgb, var(--color-danger) 10%, var(--color-surface));
}

/* Schnellaktionen-Zeile (Nachfrage 07.09.2026, "Alle gefilterten Einträge
   aktivieren/deaktivieren je Spalte, Alle Filter entfernen, oben je Spalte
   x/y gesetzt") - nutzt dasselbe Spaltenraster wie die Rechtematrix
   darunter (.tc-rm-raster), damit die Aktionen optisch exakt ueber ihrer
   jeweiligen Spalte stehen. */
.tc-rm-raster--aktionen {
	background-color: var(--color-background);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	margin-bottom: var(--spacing-sm);
}
.tc-rm-schnellaktion {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 3px;
}
.tc-rm-schnellaktion-zahl {
	font-size: .74rem;
	font-weight: 700;
	color: var(--color-text);
	white-space: nowrap;
}
.tc-rm-schnellaktion-btns {
	display: flex;
	gap: 4px;
}
.tc-rm-schnell-an,
.tc-rm-schnell-aus {
	width: 22px;
	height: 22px;
	line-height: 20px;
	padding: 0;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-border-strong);
	background-color: var(--color-surface);
	cursor: pointer;
	font-size: .78rem;
}
.tc-rm-schnell-an {
	color: var(--color-success);
}
.tc-rm-schnell-an:hover {
	background-color: color-mix(in srgb, var(--color-success) 14%, var(--color-surface));
}
.tc-rm-schnell-aus {
	color: var(--color-danger);
}
.tc-rm-schnell-aus:hover {
	background-color: color-mix(in srgb, var(--color-danger) 12%, var(--color-surface));
}

.tc-rm-leer-hinweis {
	padding: var(--spacing-md);
	text-align: center;
	color: var(--color-text-muted);
	font-size: .88rem;
}

.tc-rm-gruppen {
	display: flex;
	flex-direction: column;
	/* Nachfrage (07.09.2026, "Abgrenzung zwischen den Gruppen deutlicher
	   machen"): groesserer Abstand statt --spacing-sm, damit jede
	   Ticketgruppe klar als eigener Block erkennbar bleibt. */
	gap: var(--spacing-md);
	/* Platz fuer die sticky Speicherleiste, damit die letzte Gruppe nicht
	   dahinter verschwindet. */
	padding-bottom: 72px;
}
.tc-rm-gruppe {
	position: relative;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
	box-shadow: 0 1px 3px rgba(20, 20, 30, .08);
	overflow: hidden;
}
.tc-rm-gruppe[hidden] {
	display: none;
}
.tc-rm-gruppe-kopf {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--spacing-sm);
	padding: 10px 18px;
}
.tc-rm-gruppe-oeffner {
	display: flex;
	align-items: center;
	gap: 8px;
	flex: 1 1 240px;
	min-width: 0;
	background: none;
	border: none;
	padding: 2px;
	text-align: left;
	cursor: pointer;
	color: inherit;
	font: inherit;
}
.tc-rm-gruppe-chevron {
	flex-shrink: 0;
	color: var(--color-text-muted);
	transition: transform .12s ease;
}
.tc-rm-gruppe[data-offen="1"] .tc-rm-gruppe-chevron {
	transform: rotate(90deg);
}
.tc-rm-gruppe-titel {
	min-width: 0;
}
.tc-rm-gruppe-name {
	font-weight: 700;
	font-size: .95rem;
	color: var(--color-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-rm-gruppe-meta {
	font-size: .78rem;
	color: var(--color-text-muted);
	margin-top: 2px;
}
.tc-rm-gruppe-koerper {
	padding: 0 18px 8px;
}
.tc-rm-gruppe-koerper[hidden] {
	display: none;
}

/* Korrekturauftrag (07.09.2026, Punkt 1/3/8 - "Rechte immer horizontal,
   Spalten fest ausrichten"): EIN gemeinsames CSS-Grid-Spaltenraster fuer
   Spaltenkopf, die immer sichtbare "Gesamte Gruppe"-Zeile UND jede
   Ticketart-Zeile - garantiert identische Spaltenbreiten/-positionen ueber
   alle Gruppen hinweg (eine einzige Stelle, --tc-rm-spalten, statt
   mehrfach gepflegter fester Pixelwerte). Name-Spalte flexibel (mit
   Ellipsis bei langen Namen, siehe .tc-rm-zeile-name-text), die drei
   Rechtespalten fest und gleich breit - unabhaengig von der Namenslaenge. */
.tc-rm-wurzel {
	/* Nachfrage (07.09.2026): erste, schmale Spalte fuer die Gruppenfarbe
	   (.tc-rm-farbspalte) ergaenzt - auf .tc-rm-wurzel definiert (statt nur
	   .tc-rm-gruppen), damit die Schnellaktionen-Zeile (s.u.) dieselbe
	   Spaltendefinition nutzen kann. Folgeauftrag (25.09.2026), Abschnitt
	   10-13: mittlere Rechtespalte ("Anzeigen") verbreitert - traegt seither
	   ein dreistufiges <select> (z. B. "Nur selbst erstellte") statt einer
	   einzelnen Checkbox, die schmalen 74px reichten dafuer nicht.
	   Erstellen/Informieren (Checkboxen) unveraendert schmal. */
	--tc-rm-spalten: 8px minmax(0, 1fr) 74px 150px 84px;
}
.tc-rm-raster {
	display: grid;
	grid-template-columns: var(--tc-rm-spalten);
	column-gap: 10px;
	align-items: center;
	padding: 7px 18px;
}
.tc-rm-farbspalte {
	align-self: stretch;
	border-radius: 3px;
}
/* Nachfrage (07.09.2026, "übersichtlich tabellarisch, Erklärung welche
   Checkbox was bedeutet - aktuell drei Kästchen ohne klare Beschriftung"):
   die Spaltenkoepfe deutlich als Tabellenkopf abgesetzt (Hintergrund +
   Trennlinie), plus senkrechte Trennlinien zwischen ALLEN Spalten
   (.tc-rm-raster-feld, s.u.) - dieselbe Trennlinie in Kopf- UND Datenzeilen,
   dadurch liest sich die Gruppe wie eine echte Tabelle statt einzelner,
   lose wirkender Kaestchen. Zusaetzlich hat jeder Schalter jetzt ein
   title-Attribut (echter Hover-Tooltip) mit einer kurzen Erklaerung, was
   das jeweilige Recht bedeutet (siehe includes/rechtematrix_render.php).
*/
.tc-rm-raster--kopf {
	background-color: var(--color-background);
	border-bottom: 1px solid var(--color-border-strong);
	font-size: .72rem;
	font-weight: 700;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .03em;
}
.tc-rm-raster-name {
	padding-left: 2px;
}
.tc-rm-raster-feld {
	text-align: center;
	/* Nachfrage (07.09.2026, "Spalten mit den Options-Schaltern auch durch
	   spaltenfolgendes Layout" abgrenzen): deutlichere Trennlinie
	   (--color-border-strong statt --color-border) - da Kopf-, "Gesamte
	   Gruppe"- und alle Ticketart-Zeilen luecken- und randlos direkt
	   untereinanderstehen (kein Abstand/Rahmen dazwischen), ergibt dieselbe
	   Linie in jeder Zeile optisch eine durchgehende senkrechte Spaltenlinie
	   von der Kopfzeile bis zur letzten Ticketart. */
	border-left: 1px solid var(--color-border-strong);
	cursor: help;
}
.tc-rm-zeile {
	border-bottom: 1px solid var(--color-border);
}
.tc-rm-gruppe-koerper .tc-rm-zeile:last-child {
	border-bottom: none;
}
.tc-rm-gruppe-koerper .tc-rm-zeile:nth-child(even) {
	background-color: var(--color-background);
}
.tc-rm-zeile:hover {
	background-color: var(--color-background);
}
.tc-rm-zeile[hidden] {
	display: none;
}
.tc-rm-zeile--gruppe {
	background-color: var(--color-background);
	font-weight: 600;
	border-bottom: none;
}
.tc-rm-zeile--gruppe:hover {
	background-color: var(--color-background);
}
.tc-rm-zeile-name {
	display: flex;
	align-items: center;
	gap: 7px;
	min-width: 0;
}
.tc-rm-zeile-name-text {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-size: .87rem;
}
.tc-rm-zeile-hinweis {
	color: var(--color-text-muted);
	font-weight: 400;
	font-size: .8rem;
	cursor: help;
}

/* Kompakter Schiebeschalter (Korrekturauftrag Punkt 2: "dieselben
   kompakten Toggle-/Schiebeschalter wie im Bereich Berechtigungen") -
   dieselbe Bauweise/Farbgebung wie .tc-rechte-toggle (siehe oben), nur
   etwas kleiner ("kompakt bleiben"), UND mit zusaetzlichem
   :indeterminate-Zustand fuer den Gruppen-Sammelschalter (Punkt 3:
   Tri-State AUS/TEILWEISE/AN). */
.tc-rm-schalter {
	appearance: none;
	-webkit-appearance: none;
	flex: 0 0 auto;
	width: 30px;
	height: 17px;
	margin: 0;
	border-radius: 10px;
	background-color: var(--color-border-strong);
	position: relative;
	cursor: pointer;
	transition: background-color .12s ease;
}
.tc-rm-schalter::before {
	content: "";
	position: absolute;
	top: 2px;
	left: 2px;
	width: 13px;
	height: 13px;
	border-radius: 50%;
	background-color: #FFF;
	transition: transform .12s ease;
}
.tc-rm-schalter:checked {
	background-color: var(--color-success);
}
.tc-rm-schalter:checked::before {
	transform: translateX(13px);
}
.tc-rm-schalter:indeterminate {
	background-color: var(--color-warning);
}
.tc-rm-schalter:indeterminate::before {
	transform: translateX(6.5px);
}
.tc-rm-schalter:disabled {
	opacity: .4;
	cursor: not-allowed;
}
.tc-rm-schalter:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}

/* Folgeauftrag (25.09.2026), Abschnitt 10-13: dreistufiges "Anzeigen"-
   <select> (Keine Ansicht/Nur selbst erstellte/Alle anzeigen) - eigene,
   schmalere Variante von .EingabeFeld statt des Schiebeschalter-Aussehens
   von .tc-rm-schalter (dessen appearance:none/eigene ::before-Blende
   waere auf einem <select> falsch). Volle Spaltenbreite (siehe
   --tc-rm-spalten), kleinere Schrift/Innenabstand fuer die begrenzte
   Spaltenbreite. */
.tc-rm-schalter-auswahl,
.tc-rm-art-auswahl {
	width: 100%;
	min-height: 30px;
	padding: 4px 6px;
	font-size: .8rem;
}

/* Sticky Speicherleiste (Auftrag "sticky Aktionsleiste ... auch beim
   Scrollen sichtbar") - Grundmuster wie die bereits bestehende
   position:fixed-Statusleiste (siehe dortiger Kommentar), hier aber nur
   sichtbar, solange ungespeicherte Aenderungen vorliegen. */
.tc-rm-speicherleiste {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 40;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: var(--spacing-md);
	flex-wrap: wrap;
	padding: 10px var(--spacing-md);
	background-color: var(--color-surface);
	border-top: 1px solid var(--color-border-strong);
	box-shadow: var(--shadow-medium);
}
.tc-rm-speicherleiste[hidden] {
	display: none;
}
.tc-rm-speicherleiste-text {
	font-size: .88rem;
	font-weight: 600;
	color: var(--color-text);
}
.tc-rm-speicherleiste-aktionen {
	display: flex;
	gap: var(--spacing-sm);
}

/* Korrekturauftrag Punkt 9 ("Responsive Verhalten"): auf normalen
   Desktop-Breiten bleibt die Matrix immer horizontal (siehe --tc-rm-spalten
   oben, gilt unveraendert) - erst bei wirklich schmalen Ansichten werden
   die drei Rechtespalten selbst schmaler (nicht: untereinander gestapelt),
   damit auch dort noch alle drei nebeneinander passen. */
@media (max-width: 640px) {
	.tc-rm-wurzel {
		--tc-rm-spalten: 5px minmax(0, 1fr) 46px 46px 54px;
	}
	.tc-rm-raster {
		column-gap: 4px;
		padding: 6px 10px;
	}
	.tc-rm-raster--kopf {
		font-size: .6rem;
	}
	.tc-rm-gruppe-kopf {
		padding-left: 14px;
	}
	.tc-rm-gruppe-koerper {
		padding: 0 10px 8px;
	}
}

/* Bereich "Aufgaben" (Auftrag "Filter um Bereich 'Aufgaben' erweitern",
   08.09.2026, js/admin-aufgaben-filter.js): flache Liste (keine Gruppe>Art-
   Verschachtelung wie bei den Ticketfiltern noetig, da Aufgabengruppen ein
   einfaches Freitextfeld ohne weitere Unterebene sind), deshalb ein
   deutlich einfacheres eigenes Grid statt Wiederverwendung von
   --tc-rm-spalten. Die Schalter selbst nutzen bewusst die bestehende
   .tc-rm-schalter-Optik (rein visuelle Klasse, keine Kopplung an
   js/admin-rechtematrix.js). */
.tc-af-wurzel {
	--tc-af-spalten: minmax(0, 1fr) 90px 90px;
}
.tc-af-raster {
	display: grid;
	grid-template-columns: var(--tc-af-spalten);
	column-gap: 10px;
	align-items: center;
	padding: 7px 18px;
}
.tc-af-raster--kopf {
	background-color: var(--color-background);
	border-bottom: 1px solid var(--color-border-strong);
	font-size: .72rem;
	font-weight: 700;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .03em;
}
.tc-af-raster-name {
	padding-left: 2px;
	font-size: .87rem;
}
.tc-af-raster-feld {
	text-align: center;
	border-left: 1px solid var(--color-border-strong);
	cursor: help;
}
.tc-af-zeile {
	border-bottom: 1px solid var(--color-border);
}
.tc-af-zeile:last-child {
	border-bottom: none;
}
.tc-af-zeile:nth-child(even) {
	background-color: var(--color-background);
}
.tc-af-zeile:hover {
	background-color: var(--color-background);
}
.tc-af-zeile--alle {
	background-color: var(--color-background);
	font-weight: 600;
}
.tc-af-speicherleiste {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: var(--spacing-md);
	flex-wrap: wrap;
	padding: 10px 18px;
	border-top: 1px solid var(--color-border-strong);
}
.tc-af-speicherleiste[hidden] {
	display: none;
}
.tc-af-speicherleiste-text {
	font-size: .88rem;
	font-weight: 600;
	color: var(--color-text);
	margin-right: auto;
}

/* "Filter übernehmen von" (07.09.2026, ersetzt die vorherige eigene Seite
   "Filter duplizieren"): dasselbe suchbare Personen-Auswahlfeld wie zuvor
   fuer den Zielbenutzer, jetzt fuer die Vorlagen-Auswahl wiederverwendet
   (navigiert statt ein Hidden-Feld zu setzen, siehe js/admin-
   rechtematrix.js initFilterVorlage()). */
.tc-rm-personenwahl-anzeige {
	display: flex;
	align-items: center;
	gap: var(--spacing-sm);
	padding: 8px 12px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
}
.tc-rm-personenwahl-suche-bereich {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 10px;
}
.tc-rm-personenwahl-liste {
	max-height: 220px;
	overflow-y: auto;
	margin-top: 8px;
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.tc-rm-personenwahl-eintrag {
	display: block;
	width: 100%;
	box-sizing: border-box;
	text-align: left;
	padding: 6px 8px;
	border: none;
	border-radius: var(--radius-small);
	background: none;
	font-size: .87rem;
	color: var(--color-text);
	cursor: pointer;
}
.tc-rm-personenwahl-eintrag:hover {
	background-color: var(--color-background);
}
.tc-rm-personenwahl-eintrag[hidden] {
	display: none;
}
.tc-rm-personenwahl-eintrag small {
	display: block;
	color: var(--color-text-muted);
	font-size: .78rem;
}

/* ============================================================
   DASHBOARD-SYSTEM (Auftrag "Dashboards - erste funktionale
   Erweiterung", 09.09.2026) - dashboard/*.php, includes/
   dashboard_widget_render.php, js/dashboard-*.js
   ============================================================ */

/* -- Uebersicht (dashboard/index.php): Karten je Dashboard -------- */
.tc-dash-abschnitt {
	margin-bottom: var(--spacing-lg, 24px);
}
.tc-dash-raster {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
	gap: var(--spacing-md, 16px);
}
.tc-dash-karte {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium, 8px);
	padding: 14px 16px;
	display: flex;
	flex-direction: column;
	gap: 6px;
	/* Feinschliff-Runde 1, Punkt 26: Anker fuer .tc-task-confirm-popover
	   (siehe dessen Kommentar) - ohne einen positionierten Vorfahren
	   irgendwo auf der Karte positioniert sich das Popover relativ zum
	   naechsten weiter aussen liegenden positionierten Element (bzw. dem
	   Seiten-Wurzelelement) und erschien dadurch am unteren Bildschirmrand
	   statt neben der Loeschen-Aktion. */
	position: relative;
	transition: box-shadow 0.15s ease, border-color 0.15s ease;
}
/* Dezenter Hover (Auftrag "übersichtlicher gestalten", 09.09.2026): die
   Karte selbst ist jetzt über ihren Titel klickbar (gestreckter Link,
   s. u.) - eine leichte Anhebung signalisiert das, ohne wie bei den
   .tc-neu-card-Auswahlkarten die ganze Fläche einzufärben (hier stehen
   Beschreibung/Metadaten/Aktionen weiterhin in normaler Textfarbe
   daneben). */
.tc-dash-karte:has(.tc-dash-karte-titel-link:hover),
.tc-dash-karte:has(.tc-dash-karte-titel-link:focus-visible) {
	box-shadow: var(--shadow-medium);
	border-color: var(--color-border-strong);
}
/* Sichtbarer Fokusring auf Tastaturbedienung (nicht bei Mausklick) -
   dasselbe :has()-Muster wie bei .tc-neu-card-link (s. o.), inkl.
   Fallback fuer Browser ohne :has()-Unterstuetzung (dann Ring nur um den
   Linktext statt um die ganze Karte - immer noch besser als keiner). */
.tc-dash-karte-titel-link:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
@supports selector(:has(a)) {
	.tc-dash-karte-titel-link:focus-visible {
		outline: none;
	}
}
.tc-dash-karte:has(.tc-dash-karte-titel-link:focus-visible) {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-dash-karte-kopf {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 8px;
}
.tc-dash-karte-kopf-badges {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	min-width: 0;
}
.tc-dash-badge {
	display: inline-block;
	padding: 2px 9px;
	border-radius: 999px;
	font-size: .72rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .02em;
}
.tc-dash-badge--privat { background-color: var(--color-background); color: var(--color-text-muted); }
.tc-dash-badge--oeffentlich { background-color: color-mix(in srgb, var(--color-success) 18%, transparent); color: var(--color-success); }
.tc-dash-badge--geteilt { background-color: color-mix(in srgb, var(--color-primary) 18%, transparent); color: var(--color-primary); }
/* Kennzahl-Kategorie-Kennzeichnung (Auftrag "Kennzahlen-Auswahl
   übersichtlicher", 10.09.2026: "Kategorien bilden - Werte zu Tickets/
   Aktivitäten/Aufgaben/Benutzern/Ticket-Details") - kleines Etikett vor
   dem Kennzahl-Namen im Dashboard-Widget-Editor (Schritt 2) und vor
   jeder Kennzahlen-Gruppe im Report-Editor (Schritt 6). */
.tc-dash-kategorie-badge {
	display: block;
	margin-bottom: 3px;
	font-size: .68rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	color: var(--color-primary);
}
.tc-rp-kennzahl-kategorie-titel {
	font-size: .82rem;
	font-weight: 700;
	margin: 10px 0 4px;
	color: var(--color-text-muted);
}
.tc-rp-kennzahl-kategorie-titel:first-child {
	margin-top: 0;
}
.tc-dash-eigentuemer-hinweis {
	font-size: .72rem;
	color: var(--color-text-muted);
}
/* Gestreckter Link (Auftrag "übersichtlicher gestalten", 09.09.2026):
   ersetzt den vorherigen eigenen "Öffnen"-Textlink - dasselbe etablierte
   Muster wie .tc-neu-card-link (s. o.), hier bewusst schlanker (kein
   Farbumschlag der ganzen Karte, siehe .tc-dash-karte:has()-Hover oben),
   da die Karte neben dem Titel noch Beschreibung/Metadaten zeigt, die
   nicht mitfärben sollen. */
.tc-dash-karte-titel-link,
.tc-dash-karte-titel-link:hover,
.tc-dash-karte-titel-link:active {
	/* Ueberschreibt bewusst die globale "a:hover"-Regel weiter oben in
	   dieser Datei (kraeftige Primaerfarben-Flaeche) - derselbe, bereits
	   einmal an .tc-neu-card-link behobene Fehlertyp: ohne diese Regel
	   faerbt sich beim Hover NUR der Titeltext kraeftig ein, waehrend der
	   Rest der Karte unveraendert bleibt. */
	display: block;
	background-color: transparent;
	text-decoration: none;
	color: inherit;
	border-radius: 0;
}
.tc-dash-karte-titel-link::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}
.tc-dash-karte-titel {
	font-weight: 700;
	font-size: 1rem;
	margin: 0;
}
.tc-dash-karte-beschreibung {
	margin: 0;
	color: var(--color-text-muted);
	font-size: .85rem;
}
.tc-dash-karte-meta {
	display: flex;
	align-items: center;
	gap: 5px;
	margin: 2px 0 0;
	font-size: .78rem;
	color: var(--color-text-muted);
}
.tc-dash-karte-meta .tc-icon { flex-shrink: 0; }
/* Auftrag (20.09.2026, "Dashboard-Übersicht optisch überarbeiten", Punkt
   4): Aktionsleiste steht jetzt im Kartenfuss statt im Kartenkopf -
   margin-top:auto schiebt sie auch bei unterschiedlich hohen Karten
   (kurze/lange Beschreibung) verlaesslich ganz nach unten, rechtsbuendig. */
.tc-dash-karte-fuss {
	display: flex;
	justify-content: flex-end;
	margin-top: auto;
	padding-top: 6px;
}

/* -- Grundeinstellungen-/Widget-Editor-Formulare -------------------- */
.tc-form-zeile {
	display: flex;
	flex-direction: column;
	gap: 4px;
	margin-bottom: 12px;
}
.tc-form-zeile label {
	font-size: .82rem;
	font-weight: 600;
	color: var(--color-text-muted);
}
/* Nachbesserung (18.09.2026, Auftrag "Wert-/Zeitlogik - Runde 3", Punkte
   7/10/11): wiederverwendbare Bausteine fuer eine kompaktere Zeit-
   Erfassung ("Zeit von [Uhrzeit] bis [Uhrzeit]" in EINER Zeile statt
   zweier getrennter Felder) und die Wochentag-Anzeige neben Datumsfeldern
   - zentral hier definiert, damit Abschlussdialog, manuelle Zeitbuchung
   und Bearbeiten-Modal exakt dieselbe Darstellung verwenden statt
   mehrfacher Sonderloesungen. */
.tc-zeitspanne-zeile {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
}
.tc-zeitspanne-zeile .tc-modal-input,
.tc-zeitspanne-zeile .EingabeFeld {
	width: auto;
}
/* Nachbesserung (18.09.2026, Auftrag "Ticket-Dialoge Grundlayout
   vereinheitlichen"): kompakte Von/Bis/Dauer-Zellen mit eigenem kleinem
   Label je Feld (statt "von"/"bis" als Fliesstext) - additiv zur
   bestehenden .tc-zeitspanne-zeile, betrifft NUR Ticket-Dialoge, die
   diese neuen Unter-Elemente tatsaechlich verwenden (siehe includes/
   main.php, tc_zeit_erfassung_felder_html()); die aeltere, schlichtere
   Nutzung von .tc-zeitspanne-zeile (z. B. manuelle Wert-/Zeitbuchung
   ausserhalb der Ticket-Dialoge) bleibt davon unberuehrt. */
.tc-zeitspanne-feld {
	display: flex;
	flex-direction: column;
	gap: 3px;
}
.tc-zeitspanne-feld-label {
	font-size: .72rem;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: .02em;
	color: var(--color-text-muted);
}
.tc-zeitspanne-dauer-wert {
	display: inline-block;
	padding: 8px 0 0;
	font-size: .9rem;
	font-weight: 600;
	color: var(--color-text);
}
.tc-modal-input--schmal,
input.tc-modal-input--schmal,
input.EingabeFeld.tc-modal-input--schmal {
	width: 108px;
	flex: 0 0 auto;
}
/* Bugfix (28.09.2026, Nutzerauftrag): native Datumsfelder brauchen neben
   "TT.MM.JJJJ" zusaetzlich Platz fuer das Kalendersymbol - mit 108px wurde
   die Jahreszahl abgeschnitten (Termin/Parken/Zeiterfassung/Wertkonto/
   Altbestand-Stichtag). Gleiche Spezifitaet wie oben, steht danach. */
input[type="date"].tc-modal-input--schmal {
	width: 150px;
}
.tc-wochentag-hinweis {
	font-size: .82rem;
	color: var(--color-text-muted);
	margin-left: 8px;
}
.tc-wochentag-hinweis:empty {
	display: none;
}
/* Zweispaltige Formulare (Punkte 6/7/8: manuelle Wert-/Zeitbuchung
   kompakter, Bemerkung rechts groesser) - links die eigentlichen Felder,
   rechts ein groesseres Bemerkungsfeld, das den verfuegbaren Platz
   ausnutzt. Bricht auf schmalen Bildschirmen einspaltig um. */
.tc-formular-2spalten {
	display: flex;
	gap: 28px;
	align-items: flex-start;
	flex-wrap: wrap;
}
.tc-formular-2spalten-links {
	flex: 1 1 320px;
	min-width: 280px;
}
.tc-formular-2spalten-rechts {
	flex: 1 1 320px;
	min-width: 280px;
	display: flex;
	flex-direction: column;
}
.tc-formular-2spalten-rechts .EingabeFeld,
.tc-formular-2spalten-rechts textarea {
	flex: 1 1 auto;
	min-height: 160px;
}
/* Zweispaltige Nachweis-Auswahlseite (Punkte 1/2: Stundennachweis/
   Wertnachweis) - links eine hohe Checkbox-Liste der Benutzer, rechts
   der Zeitraum. Dieselbe Struktur fuer beide Nachweise. */
.tc-nachweis-auswahl {
	display: flex;
	gap: 32px;
	align-items: flex-start;
	flex-wrap: wrap;
}
.tc-nachweis-auswahl-benutzer {
	flex: 1 1 320px;
	min-width: 280px;
}
.tc-nachweis-auswahl-zeitraum {
	flex: 0 1 260px;
	min-width: 220px;
}
.tc-nachweis-benutzerliste {
	max-height: 480px;
	overflow-y: auto;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	padding: 10px 14px;
	background-color: var(--color-surface);
}
.tc-nachweis-benutzerliste label {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 5px 2px;
	font-size: .9rem;
	font-weight: 400;
	color: var(--color-text);
	cursor: pointer;
}
.tc-nachweis-benutzerliste input[type="checkbox"] {
	flex-shrink: 0;
}
/* Regulaere Zurueck-Navigation (Punkte 1/6): bewusst KEINE neue Klasse -
   die bereits projektweit etablierte .tc-start-zurueck-link (siehe
   css/styles.css, ~30 bestehende Verwendungsstellen, z. B. reporting/
   anzeigen.php, dashboard/anzeigen.php) wird hier unveraendert
   wiederverwendet (Auftrag: "sich optisch an den vorhandenen Zurück-
   Funktionen im System orientieren"). */
.tc-dash-radio-gruppe {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-bottom: 10px;
}
.tc-dash-benutzerwahl {
	margin-top: 10px;
	padding-top: 10px;
	border-top: 1px solid var(--color-border);
}
.tc-dash-benutzer-liste {
	max-height: 220px;
	overflow-y: auto;
	display: flex;
	flex-direction: column;
	gap: 4px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, 6px);
	padding: 8px 10px;
}
.tc-dash-benutzer-eintrag {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: .88rem;
}
.tc-dash-zeitraum-frei,
#tc-dash-zeitraum-eigen-bereich {
	margin-top: 10px;
}
/* Bugfix (24.09.2026, Fehlerrunde Punkt 9, im Zuge der Dashboard-Masken-
   Ueberarbeitung entdeckt): "display: flex" stand bisher unconditional auf
   diesen Selektoren und ueberschrieb damit die UA-Standardregel
   "[hidden] { display:none }" - die Von-/Bis-Felder (bzw. beim Widget-
   Editor der "eigener Zeitraum"-Bereich) blieben dadurch IMMER sichtbar,
   unabhaengig vom [hidden]-Attribut, das js/dashboard-editor.js bzw.
   js/dashboard-widget-editor.js korrekt setzt/entfernt. Betraf alle drei
   Verwendungsstellen (dashboard/bearbeiten.php, dashboard/
   widget_bearbeiten.php, reporting/bearbeiten.php - gemeinsame Klasse/IDs).
   Jetzt an :not([hidden]) gebunden, analog zum selben Fehlerbild bei
   dialog.tc-modal weiter oben in dieser Datei. */
.tc-dash-zeitraum-frei:not([hidden]),
#tc-dash-zeitraum-eigen-bereich:not([hidden]) {
	display: flex;
	flex-wrap: wrap;
	gap: 14px;
}
.tc-dash-mehrfachauswahl {
	margin-bottom: 14px;
}
.tc-dash-mehrfachauswahl-titel {
	font-weight: 700;
	font-size: .82rem;
	margin: 0 0 6px;
}
/* Bugfix (24.09.2026, Fehlerrunde Punkt 10, bei der Widget-Masken-
   Ueberarbeitung entdeckt): dieselbe display-vs-[hidden]-Falle wie bereits
   bei dialog.tc-modal und .tc-dash-zeitraum-frei in dieser Datei behoben -
   "display:flex" stand unconditional auf dieser Klasse und ueberschrieb
   damit die UA-Standardregel "[hidden] { display:none }". Betraf konkret
   die Kennzahl-Status-Checkboxen im Widget-Editor (js/dashboard-widget-
   editor.js setzt data-tc-dash-status-fuer-Labels aller NICHT zum
   aktuellen Kennzahl-Typ passenden Eintraege auf hidden=true) - diese
   blieben trotzdem sichtbar, wodurch ALLE ~30 Kennzahlen aller Typen
   gleichzeitig angezeigt wurden statt nur die zum gewaehlten Typ
   passenden. Das war vermutlich die technische Hauptursache fuer den
   gemeldeten "chaotischen Sammelbereich" (Auftrag Abschnitt C). Ein
   zusaetzliches "disabled" auf der Checkbox selbst verhinderte zwar
   bereits das versehentliche Mitspeichern falscher Werte, aber eben nicht
   die falsche Sichtbarkeit. */
.tc-dash-checkbox-eintrag:not([hidden]) {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: .88rem;
	padding: 3px 0;
}
/* Fehlerrunde (24.09.2026), Punkt 10 "Dashboard-Widgets: Maske komprimiert,
   dynamisch und kontextbezogen optimieren", Abschnitt C "Kennzahlenbereich
   grundsaetzlich ueberarbeiten": vorher ragged flex-wrap (jede Zeile so
   breit wie ihr laengster Eintrag) - wirkte bei laengeren Listen (z. B.
   Warenwirtschaft mit 12, Ticket-Ereignisse mit 12 Eintraegen) wie ein
   unstrukturierter Haufen. Jetzt ein echtes, sauber ausgerichtetes Raster -
   dieselbe Klasse, keine Markup-Aenderung an den Aufrufstellen noetig. */
.tc-dash-status-optionen {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
	gap: 4px 18px;
}

/* -- Viewer (dashboard/anzeigen.php) --------------------------------- */
.tc-dash-viewer-kopf {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
	margin-bottom: var(--spacing-md, 16px);
}
.tc-dash-viewer-titel {
	font-size: 1.3rem;
	font-weight: 700;
	margin: 0;
}
.tc-dash-viewer-beschreibung {
	margin: 2px 0 0;
	color: var(--color-text-muted);
	font-size: .9rem;
}
.tc-dash-viewer-aktionen {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
}
.tc-dash-live-status {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: .82rem;
	font-weight: 600;
	padding: 4px 10px;
	border-radius: 999px;
	background-color: var(--color-background);
	color: var(--color-text-muted);
}
.tc-dash-live-punkt {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background-color: var(--color-text-muted);
	flex-shrink: 0;
}
.tc-dash-live-status[data-status="live"] {
	color: var(--color-success);
}
.tc-dash-live-status[data-status="live"] .tc-dash-live-punkt {
	background-color: var(--color-success);
	animation: tc-dash-puls 2s ease-in-out infinite;
}
.tc-dash-live-status[data-status="fehler"] {
	color: var(--color-warning);
}
.tc-dash-live-status[data-status="fehler"] .tc-dash-live-punkt {
	background-color: var(--color-warning);
}
/* Dritte Ampel-Stufe (Auftrag "SMS-Bereich weiterentwickeln", 16.09.2026,
   Abschnitt 25: "ROT/FEHLER" fuer einen anhaltenden Ausfall, zusaetzlich
   zum bereits bestehenden "fehler"=Gelb/Warnung) - additiv, bestehende
   "live"/"fehler"-Zustaende bleiben unveraendert. */
.tc-dash-live-status[data-status="kritisch"] {
	color: var(--color-danger-strong, #C0392B);
}
.tc-dash-live-status[data-status="kritisch"] .tc-dash-live-punkt {
	background-color: var(--color-danger-strong, #C0392B);
}
@keyframes tc-dash-puls {
	0%, 100% { opacity: 1; }
	50% { opacity: .35; }
}

.tc-dash-raster--widgets {
	display: grid;
	/* Auftrag "Dashboard-Baukasten fachlich überarbeiten", Punkt 17
	   (09.09.2026): 12 statt vormals 4 Spalten (siehe
	   tc_dashboard_raster_spalten() in includes/main.php, die diesen Wert
	   spiegelt) - erlaubt feinere Breiten und mehrere Diagramme
	   nebeneinander. Die Zeilenhoehe bleibt bewusst GROEBER (siehe
	   tc_dashboard_raster_max_hoehe(), max. 6 Einheiten). */
	grid-template-columns: repeat(12, 1fr);
	grid-auto-rows: minmax(120px, auto);
	gap: var(--spacing-md, 16px);
	align-items: stretch;
}
.tc-dash-widget {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium, 8px);
	padding: 14px 16px;
	/* Fallback, falls ausnahmsweise kein inline grid-column/-row gesetzt
	   ist (siehe includes/dashboard_widget_render.php) - im Normalfall
	   bestimmt IMMER das inline style aus der tatsächlichen
	   Rasterposition/-größe des Widgets die Fläche. */
	grid-column: span 6;
	/* Punkt 21/22/33 ("Inhalte müssen die tatsächliche Widget-Fläche
	   ausnutzen"): Widget als Flex-Spalte über die volle, vom Grid
	   zugewiesene Zellenhöhe (align-items:stretch oben) - Kopf bleibt
	   kompakt, der Inhaltsbereich füllt den Rest und zentriert seinen
	   Inhalt (siehe .tc-dash-widget-inhalt unten). */
	display: flex;
	flex-direction: column;
	/* Gemeinsame Skalierungslogik (Punkt 34): EINE Gruppe von Custom
	   Properties je Größenklasse (siehe .tc-dash-widget--* weiter unten),
	   von allen Inhaltstypen (KPI/Tabelle/Diagramm/Legende) gleich
	   konsumiert, statt verstreuter Einzelregeln je Diagrammtyp. Werte
	   hier = Basis "mittel". */
	--tc-dash-kpi-groesse: 2.3rem;
	--tc-dash-kpi-mehrfach-groesse: 1.5rem;
	--tc-dash-tabelle-groesse: .82rem;
	--tc-dash-tabelle-padding: 5px 8px;
	--tc-dash-legende-groesse: .78rem;
	--tc-dash-chart-max-hoehe: 190px;
	--tc-dash-chart-kreis-groesse: 150px;
	--tc-dash-donut-mitte-groesse: 16px;
	--tc-dash-mini-chart-min: 170px;
	--tc-dash-kachel-zahl-groesse: 1.4rem;
}
.tc-dash-widget--klein {
	--tc-dash-kpi-groesse: 1.7rem;
	--tc-dash-kpi-mehrfach-groesse: 1.1rem;
	--tc-dash-tabelle-groesse: .74rem;
	--tc-dash-legende-groesse: .72rem;
	--tc-dash-chart-max-hoehe: 150px;
	--tc-dash-chart-kreis-groesse: 110px;
	--tc-dash-donut-mitte-groesse: 13px;
	--tc-dash-mini-chart-min: 130px;
	--tc-dash-kachel-zahl-groesse: 1.2rem;
}
.tc-dash-widget--gross {
	--tc-dash-kpi-groesse: 3.2rem;
	--tc-dash-kpi-mehrfach-groesse: 2rem;
	--tc-dash-tabelle-groesse: 1rem;
	--tc-dash-tabelle-padding: 9px 14px;
	--tc-dash-legende-groesse: .95rem;
	--tc-dash-chart-max-hoehe: 340px;
	--tc-dash-chart-kreis-groesse: 270px;
	--tc-dash-donut-mitte-groesse: 28px;
	--tc-dash-mini-chart-min: 220px;
	--tc-dash-kachel-zahl-groesse: 2rem;
}
.tc-dash-widget--breit {
	--tc-dash-kpi-groesse: 3.4rem;
	--tc-dash-kpi-mehrfach-groesse: 2.1rem;
	--tc-dash-tabelle-groesse: 1rem;
	--tc-dash-tabelle-padding: 9px 14px;
	--tc-dash-legende-groesse: .95rem;
	--tc-dash-chart-max-hoehe: 300px;
	--tc-dash-chart-kreis-groesse: 240px;
	--tc-dash-donut-mitte-groesse: 26px;
	--tc-dash-mini-chart-min: 220px;
	--tc-dash-kachel-zahl-groesse: 2rem;
}
/* "Sehr groß" (Punkt 15, neu): fuer Widgets mit vielen Gruppen/Benutzern -
   deutlich groessere Werte, damit auch mehrere Teil-Diagramme im selben
   Widget noch lesbar bleiben. */
.tc-dash-widget--sehr_gross {
	--tc-dash-kpi-groesse: 4.4rem;
	--tc-dash-kpi-mehrfach-groesse: 2.6rem;
	--tc-dash-tabelle-groesse: 1.15rem;
	--tc-dash-tabelle-padding: 10px 16px;
	--tc-dash-legende-groesse: 1.05rem;
	--tc-dash-chart-max-hoehe: 520px;
	--tc-dash-chart-kreis-groesse: 420px;
	--tc-dash-donut-mitte-groesse: 42px;
	--tc-dash-mini-chart-min: 260px;
	--tc-dash-kachel-zahl-groesse: 2.6rem;
}
/* Unterhalb von ca. 900px ist eine 12-spaltige Fein-Rasterung mit
   absoluten, im Editor gesetzten Positionen nicht mehr sinnvoll
   handhabbar - alle Widgets werden dann untereinander gestapelt
   (!important überschreibt bewusst das inline style aus
   includes/dashboard_widget_render.php). */
@media (max-width: 900px) {
	.tc-dash-raster--widgets { grid-template-columns: 1fr; }
	.tc-dash-widget { grid-column: 1 !important; grid-row: auto !important; }
}
.tc-dash-widget-kopf {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 8px;
	margin-bottom: 8px;
	flex: 0 0 auto;
}
.tc-dash-widget-kopf-text {
	min-width: 0;
	flex: 1 1 auto;
}
.tc-dash-widget-titel {
	font-weight: 700;
	font-size: .95rem;
	margin: 0;
}
.tc-dash-widget-untertitel {
	margin: 2px 0 0;
	font-size: .78rem;
	color: var(--color-text-muted);
}
.tc-dash-widget-zeitraum {
	margin: 2px 0 0;
	font-size: .72rem;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .02em;
}
.tc-dash-widget-gesperrt,
.tc-dash-widget-gesperrt-hinweis,
.tc-dash-widget-leer {
	color: var(--color-text-muted);
	font-size: .85rem;
	font-style: italic;
}
.tc-dash-widget--gesperrt {
	background-color: var(--color-background);
}
/* Editiermodus (Punkt 20, 09.09.2026): gestrichelter Rahmen macht in
   dashboard/anzeigen.php sichtbar, dass diese Ansicht - anders als
   dashboard/vollbild.php - Bearbeitungsfunktionen zeigt. */
.tc-dash-widget--editierbar {
	border-style: dashed;
	border-color: var(--color-border-strong, #94a3b8);
}
.tc-dash-editiermodus-hinweis {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: .82rem;
	color: var(--color-text-muted);
	margin: 0 0 12px;
}
.tc-dash-editiermodus-hinweis .tc-icon { width: 14px; height: 14px; }
.tc-dash-schloss {
	display: inline-flex;
	vertical-align: -3px;
	margin-right: 4px;
	color: var(--color-text-muted);
}
.tc-dash-schloss .tc-icon { width: 14px; height: 14px; }
/* Aktionsleiste (Auftrag Punkt 19, 09.09.2026, erweitert 09.09.2026 auf
   die Dashboard-Übersicht "Administration an Widget-Darstellung
   anpassen"): EINE gemeinsame, kompakte Icon-Leiste - am Widget-Kopf
   selbst (includes/dashboard_widget_render.php, statt vorher als vom
   Widget getrenntes, frei im Raster fließendes Grid-Item) UND an der
   Dashboard-Kachel selbst (dashboard/index.php, statt vorher einer
   eigenen Zeile mit 6 ausgeschriebenen Text-Links) - dieselbe Klasse
   sorgt für dieselbe Optik an beiden Stellen. z-index:2 haelt die Buttons
   auf der Dashboard-Kachel über dem "gestreckten Link" des Kartentitels
   (siehe .tc-dash-karte-titel-link, z-index 1), damit ein Klick auf einen
   Button nicht stattdessen die Karte öffnet. */
.tc-dash-aktionsleiste {
	display: flex;
	gap: 2px;
	flex-shrink: 0;
	position: relative;
	z-index: 2;
}
.tc-dash-aktion-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 26px;
	height: 26px;
	border-radius: var(--radius-small, 6px);
	color: var(--color-text-muted);
	background-color: transparent;
	text-decoration: none;
}
.tc-dash-aktion-btn:hover {
	background-color: var(--color-background);
	color: var(--color-text);
}
.tc-dash-aktion-btn .tc-icon { width: 15px; height: 15px; }
/* Punkt 26 (siehe .tc-dash-karte weiter oben fuer die Begruendung). */
.tc-dash-admin-loeschen-zelle {
	position: relative;
}

/* -- Kennzahlen-Darstellungen (js/dashboard-charts.js) ----------------
   Auftrag "Dashboard-Baukasten fachlich überarbeiten", Punkt 21/22/34
   (09.09.2026): der Inhaltsbereich füllt jetzt die tatsächliche
   Widget-Fläche (Flex, siehe .tc-dash-widget weiter oben) und zentriert
   seinen Inhalt, statt oben-links klein stehen zu bleiben - alle
   Schrift-/Diagrammgrößen kommen aus den dort definierten Custom
   Properties (EINE gemeinsame Skalierungslogik statt Einzel-Tweaks je
   Diagrammtyp). */
.tc-dash-widget-inhalt {
	flex: 1 1 auto;
	min-height: 0;
	display: flex;
	flex-direction: column;
	justify-content: center;
}
.tc-dash-widget-inhalt > * { flex: 1 1 auto; min-height: 0; }
.tc-dash-kpi {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: center;
	gap: 2px;
}
.tc-dash-kpi-zahl {
	font-size: var(--tc-dash-kpi-groesse, 2.3rem);
	font-weight: 800;
	line-height: 1.1;
}
/* Klick-Drilldown (Auftrag "Klick auf einen Wert -> Suche auf betroffene
   Tickets/Protokolleintraege", 10.09.2026, siehe js/dashboard-charts.js
   mitWertLink()) - erbt bewusst Farbe/Schriftgroesse der jeweiligen
   Darstellung (KPI/Tabelle/Kacheln/Balken/Legende), damit ein klickbarer
   Wert nicht wie ein generischer blauer Weblink aus dem Chart heraussticht.
   Bewusst OHNE Unterstreichung (Nutzerauftrag 10.09.2026) - nur der
   Hover-Effekt zeigt die Klickbarkeit an; 0-Werte werden von
   mitWertLink() bereits gar nicht erst verlinkt. */
.tc-dash-wert-link {
	color: inherit;
	text-decoration: none;
	cursor: pointer;
}
.tc-dash-wert-link:hover,
.tc-dash-wert-link:focus-visible {
	background-color: var(--color-info-subtle);
	border-bottom-style: solid;
}
.tc-dash-kpi-einheit {
	font-size: .45em;
	font-weight: 600;
	color: var(--color-text-muted);
}
.tc-dash-kpi-label {
	color: var(--color-text-muted);
	font-size: .85rem;
}
.tc-dash-kpi--gruen .tc-dash-kpi-zahl { color: var(--color-success); }
.tc-dash-kpi--gelb .tc-dash-kpi-zahl { color: var(--color-warning); }
.tc-dash-kpi--rot .tc-dash-kpi-zahl { color: var(--color-danger, #ef4444); }
.tc-dash-kpi-mehrfach {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	align-content: center;
}
.tc-dash-kpi-mehrfach-eintrag {
	display: flex;
	flex-direction: column;
}
/* Punkt 10 (zwei Gruppierungsebenen): der "Gesamt"-Chip fasst die
   nachfolgende Aufschlüsselung optisch ab, siehe kpiReiheHtml() in
   js/dashboard-charts.js. */
.tc-dash-kpi-mehrfach-eintrag--gesamt {
	padding-right: 16px;
	margin-right: 4px;
	border-right: 1px solid var(--color-border);
}
.tc-dash-kpi-mehrfach-zahl {
	font-size: var(--tc-dash-kpi-mehrfach-groesse, 1.5rem);
	font-weight: 800;
}
.tc-dash-kpi-mehrfach-label {
	color: var(--color-text-muted);
	font-size: .78rem;
}
.tc-dash-kpi-gesamt {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 2px;
	padding-bottom: 10px;
	margin-bottom: 10px;
	border-bottom: 1px solid var(--color-border);
	flex: 0 0 auto;
}
.tc-dash-kpi-gesamt .tc-dash-kpi-zahl { font-size: calc(var(--tc-dash-kpi-groesse, 2.3rem) * .8); }
/* Gruppierte KPI-Blöcke (Punkt 7-10, neu): ein vollständiger, mit
   Überschrift versehener Kennzahlenblock je Gruppe, untereinander
   ("darunter", siehe Auftragsbeispiel) statt einer einzigen verschmolzenen
   Liste. */
.tc-dash-kpi-bloecke {
	display: flex;
	flex-direction: column;
	gap: 16px;
	width: 100%;
}
.tc-dash-kpi-block {
	padding-bottom: 14px;
	border-bottom: 1px solid var(--color-border);
}
.tc-dash-kpi-block:last-child {
	padding-bottom: 0;
	border-bottom: none;
}
.tc-dash-kpi-block-titel {
	margin: 0 0 8px;
	font-weight: 700;
	font-size: .95rem;
}
.tc-dash-tabelle-rahmen {
	overflow-x: auto;
	width: 100%;
}
.tc-dash-tabelle {
	width: 100%;
	border-collapse: collapse;
	font-size: var(--tc-dash-tabelle-groesse, .82rem);
}
.tc-dash-tabelle th,
.tc-dash-tabelle td {
	padding: var(--tc-dash-tabelle-padding, 5px 8px);
	text-align: right;
	border-bottom: 1px solid var(--color-border);
	white-space: nowrap;
}
.tc-dash-tabelle thead th {
	color: var(--color-text-muted);
	font-weight: 600;
}
.tc-dash-tabelle tbody th {
	text-align: left;
	font-weight: 600;
}
.tc-dash-kacheln {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
	gap: 8px;
	align-content: center;
}
.tc-dash-kachel-mini {
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, 6px);
	padding: 8px 10px;
}
.tc-dash-kachel-mini-titel {
	margin: 0 0 2px;
	font-size: .74rem;
	color: var(--color-text-muted);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.tc-dash-kachel-mini-zahl {
	margin: 0;
	font-size: var(--tc-dash-kachel-zahl-groesse, 1.4rem);
	font-weight: 800;
}
.tc-dash-kachel-mini-liste {
	display: flex;
	flex-direction: column;
	gap: 2px;
	font-size: .76rem;
}
.tc-dash-tabelle-gesamt {
	margin: 8px 0 0;
	font-size: .82rem;
	color: var(--color-text-muted);
	flex: 0 0 auto;
}
.tc-dash-chart-donut-mitte {
	font-size: var(--tc-dash-donut-mitte-groesse, 16px);
	font-weight: 800;
	fill: var(--color-text);
}
.tc-dash-ampel {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: center;
	gap: 4px;
}
.tc-dash-ampel-punkt {
	width: 22px;
	height: 22px;
	border-radius: 50%;
	display: block;
	margin-bottom: 4px;
}
/* Eskalationshinweis (Auftrag Punkt 6/37, 09.09.2026): kleiner
   Warn-Zusatzwert INNERHALB einer bereits dargestellten Kennzahl (siehe
   eskalationBadgeHtml() in js/dashboard-charts.js) - bewusst KEINE eigene
   Farbe/Fläche wie eine zweite Kennzahl, nur ein auffälliges "!N". */
.tc-dash-eskalation-badge {
	display: inline-flex;
	align-items: baseline;
	font-weight: 700;
	font-size: .48em;
	color: var(--color-danger, #ef4444);
}
.tc-dash-chart {
	width: 100%;
	height: auto;
	max-height: var(--tc-dash-chart-max-hoehe, 190px);
}
.tc-dash-chart-wert {
	font-size: 8px;
	fill: var(--color-text);
	font-weight: 700;
}
.tc-dash-chart-label {
	font-size: 7px;
	fill: var(--color-text-muted);
}
.tc-dash-balken-horizontal {
	display: flex;
	flex-direction: column;
	gap: 10px;
	justify-content: center;
	width: 100%;
}
.tc-dash-balken-horizontal-zeile {
	display: grid;
	grid-template-columns: minmax(90px, 25%) 1fr auto;
	align-items: center;
	gap: 10px;
	font-size: var(--tc-dash-legende-groesse, .82rem);
}
.tc-dash-balken-horizontal-label {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--color-text-muted);
}
.tc-dash-balken-horizontal-spur {
	background-color: var(--color-background);
	border-radius: 999px;
	height: .9em;
	overflow: hidden;
}
.tc-dash-balken-horizontal-fuellung {
	display: block;
	height: 100%;
	border-radius: 999px;
}
.tc-dash-balken-horizontal-wert {
	text-align: right;
	font-weight: 700;
	white-space: nowrap;
}
.tc-dash-gestapelt-balken {
	display: flex;
	width: 100%;
	height: 22px;
	border-radius: 999px;
	overflow: hidden;
	background-color: var(--color-background);
	flex: 0 0 auto;
}
.tc-dash-gestapelt-segment {
	display: block;
	height: 100%;
}
.tc-dash-legende {
	display: flex;
	flex-wrap: wrap;
	gap: 8px 14px;
	margin-top: 8px;
	font-size: var(--tc-dash-legende-groesse, .78rem);
	color: var(--color-text-muted);
	flex: 0 0 auto;
}
.tc-dash-legende-eintrag {
	display: inline-flex;
	align-items: center;
	gap: 4px;
}
.tc-dash-legende-punkt {
	width: .7em;
	height: .7em;
	border-radius: 50%;
	display: inline-block;
	flex-shrink: 0;
}
.tc-dash-kreis-bereich {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 18px;
	flex-wrap: wrap;
	width: 100%;
}
.tc-dash-chart--kreis {
	width: var(--tc-dash-chart-kreis-groesse, 150px);
	height: var(--tc-dash-chart-kreis-groesse, 150px);
	max-height: none;
	flex-shrink: 0;
}
/* Legenden-Anordnung (Punkt 24): kleine/mittlere Widgets zeigen die
   Legende weiterhin umlaufend UNTER dem Diagramm, größere Widgets - wo
   genug Breite vorhanden ist - als vertikale Liste RECHTS daneben statt
   einer winzigen, weit verstreuten Legende. */
.tc-dash-widget--gross .tc-dash-kreis-bereich,
.tc-dash-widget--breit .tc-dash-kreis-bereich,
.tc-dash-widget--sehr_gross .tc-dash-kreis-bereich {
	flex-wrap: nowrap;
}
.tc-dash-widget--gross .tc-dash-legende,
.tc-dash-widget--breit .tc-dash-legende,
.tc-dash-widget--sehr_gross .tc-dash-legende {
	flex-direction: column;
	align-items: flex-start;
	gap: 10px;
	margin-top: 0;
}
/* Small Multiples bei Gruppierung (Punkt 11-13/35, neu): ein eigenes
   Mini-Diagramm je Gruppe/Benutzer/Ticketart, "auto-fit" verteilt sie
   automatisch passend zur tatsächlich verfügbaren Widget-Breite (3
   nebeneinander, 6 als 3x2, 8 als 4x2 je nach Fläche - ohne fest codierte
   Fallunterscheidung), siehe kleinMultiplesHtml() in js/dashboard-charts.js. */
.tc-dash-multi-chart-raster {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(var(--tc-dash-mini-chart-min, 170px), 1fr));
	gap: var(--spacing-md, 16px);
	width: 100%;
	align-content: center;
}
.tc-dash-mini-chart {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	padding: 10px;
	border-radius: var(--radius-small, 6px);
	background-color: var(--color-background);
	min-width: 0;
}
.tc-dash-mini-chart-titel {
	margin: 0 0 8px;
	font-weight: 600;
	font-size: .85rem;
	color: var(--color-text);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	max-width: 100%;
}
.tc-dash-mini-chart .tc-dash-kreis-bereich { flex-wrap: wrap; justify-content: center; }
.tc-dash-mini-chart .tc-dash-legende { flex-direction: row; }
.tc-dash-linie-kopf {
	display: flex;
	align-items: baseline;
	gap: 8px;
	margin-bottom: 4px;
	flex: 0 0 auto;
}

/* -- Vollbild-/Kioskmodus (dashboard/vollbild.php) -------------------- */
.tc-dash-vollbild-body {
	margin: 0;
	background-color: var(--color-background);
	color: var(--color-text);
}
.tc-dash-vollbild {
	padding: 20px 28px;
	min-height: 100vh;
	box-sizing: border-box;
}
.tc-dash-vollbild-kopf {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 12px;
	margin-bottom: 20px;
}
.tc-dash-vollbild-status {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
}
.tc-dash-live-zeit {
	font-size: .8rem;
	color: var(--color-text-muted);
}
.tc-dash-vollbild-btn {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border-strong);
	color: var(--color-text);
	border-radius: var(--radius-small, 6px);
	padding: 6px 14px;
	cursor: pointer;
	font-size: .82rem;
}
.tc-dash-vollbild-btn:hover {
	background-color: var(--color-background);
}
.tc-dash-raster--vollbild {
	/* Größeres Basisraster als die Kartenansicht (Punkt 21/32: "wirklich
	   wie eine Wall-/Leitstanddarstellung", "24-Zoll-Monitor aus einiger
	   Entfernung lesbar") - 12 Spalten wie .tc-dash-raster--widgets. */
	grid-template-columns: repeat(12, 1fr);
	grid-auto-rows: minmax(160px, auto);
}
.tc-dash-vollbild-leer {
	color: var(--color-text-muted);
	font-style: italic;
}
.tc-dash-vollbild:fullscreen,
.tc-dash-vollbild:-webkit-full-screen {
	overflow-y: auto;
	height: 100vh;
	background-color: var(--color-background);
}

/* Auftrag "Dashboard-Baukasten fachlich überarbeiten", Punkt 21-34
   (09.09.2026): "im schlimmsten Fall auf einem normalen 24-Zoll-Monitor an
   einer Wand aus einiger Entfernung lesbar" - NUR in der Vollbild-/
   Kiosk-Ansicht werden dieselben Skalierungs-Custom-Properties wie die
   Kartenansicht (siehe .tc-dash-widget weiter oben) auf deutlich größere
   Werte gesetzt (höhere Selektor-Spezifität gewinnt automatisch) - EIN
   gemeinsamer Mechanismus statt Einzelregeln je Diagrammtyp, die normale
   Kartenansicht (dashboard/anzeigen.php) bleibt unveraendert kompakter. */
.tc-dash-vollbild .tc-dash-widget { padding: 24px 28px; }
.tc-dash-vollbild .tc-dash-widget-titel { font-size: 1.25rem; }
.tc-dash-vollbild .tc-dash-widget-untertitel,
.tc-dash-vollbild .tc-dash-widget-zeitraum { font-size: .95rem; }
.tc-dash-vollbild .tc-dash-kpi-label { font-size: 1.05rem; }
.tc-dash-vollbild .tc-dash-chart-wert { font-size: 11px; }
.tc-dash-vollbild .tc-dash-chart-label { font-size: 9px; }
.tc-dash-vollbild .tc-dash-kachel-mini-titel { font-size: .95rem; }
.tc-dash-vollbild .tc-dash-ampel-punkt { width: 36px; height: 36px; }
.tc-dash-vollbild .tc-dash-widget {
	--tc-dash-kpi-groesse: 3.4rem;
	--tc-dash-kpi-mehrfach-groesse: 2.1rem;
	--tc-dash-tabelle-groesse: 1.05rem;
	--tc-dash-tabelle-padding: 10px 16px;
	--tc-dash-legende-groesse: .95rem;
	--tc-dash-chart-max-hoehe: 280px;
	--tc-dash-chart-kreis-groesse: 220px;
	--tc-dash-donut-mitte-groesse: 26px;
	--tc-dash-mini-chart-min: 220px;
	--tc-dash-kachel-zahl-groesse: 2.1rem;
}
.tc-dash-vollbild .tc-dash-widget--klein {
	--tc-dash-kpi-groesse: 2.4rem;
	--tc-dash-kpi-mehrfach-groesse: 1.5rem;
	--tc-dash-tabelle-groesse: .92rem;
	--tc-dash-legende-groesse: .85rem;
	--tc-dash-chart-max-hoehe: 220px;
	--tc-dash-chart-kreis-groesse: 170px;
	--tc-dash-donut-mitte-groesse: 20px;
	--tc-dash-mini-chart-min: 170px;
	--tc-dash-kachel-zahl-groesse: 1.6rem;
}
.tc-dash-vollbild .tc-dash-widget--gross {
	--tc-dash-kpi-groesse: 4.6rem;
	--tc-dash-kpi-mehrfach-groesse: 2.8rem;
	--tc-dash-tabelle-groesse: 1.25rem;
	--tc-dash-tabelle-padding: 12px 18px;
	--tc-dash-legende-groesse: 1.1rem;
	--tc-dash-chart-max-hoehe: 460px;
	--tc-dash-chart-kreis-groesse: 360px;
	--tc-dash-donut-mitte-groesse: 40px;
	--tc-dash-mini-chart-min: 260px;
	--tc-dash-kachel-zahl-groesse: 2.6rem;
}
.tc-dash-vollbild .tc-dash-widget--breit {
	--tc-dash-kpi-groesse: 4.8rem;
	--tc-dash-kpi-mehrfach-groesse: 2.9rem;
	--tc-dash-tabelle-groesse: 1.25rem;
	--tc-dash-tabelle-padding: 12px 18px;
	--tc-dash-legende-groesse: 1.1rem;
	--tc-dash-chart-max-hoehe: 420px;
	--tc-dash-chart-kreis-groesse: 340px;
	--tc-dash-donut-mitte-groesse: 38px;
	--tc-dash-mini-chart-min: 260px;
	--tc-dash-kachel-zahl-groesse: 2.6rem;
}
.tc-dash-vollbild .tc-dash-widget--sehr_gross {
	--tc-dash-kpi-groesse: 6rem;
	--tc-dash-kpi-mehrfach-groesse: 3.6rem;
	--tc-dash-tabelle-groesse: 1.4rem;
	--tc-dash-tabelle-padding: 14px 20px;
	--tc-dash-legende-groesse: 1.25rem;
	--tc-dash-chart-max-hoehe: 720px;
	--tc-dash-chart-kreis-groesse: 560px;
	--tc-dash-donut-mitte-groesse: 56px;
	--tc-dash-mini-chart-min: 300px;
	--tc-dash-kachel-zahl-groesse: 3.4rem;
}

/* -- Widget-Editor: zweispaltiges Layout mit Live-Vorschau (Punkt 10) - */
.tc-dash-editor-layout {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 300px;
	gap: var(--spacing-lg, 24px);
	align-items: start;
}
.tc-dash-editor-formular-spalte {
	min-width: 0;
	/* Erlaubt den beiden "order-toggle"-Karten (Ticketgruppen/-arten vs.
	   Benutzer), sich per JS je nach Auswertungstyp umzusortieren (Auftrag
	   "Dashboard-Baukasten fachlich überarbeiten", Punkt 4 vs. 5) - "order"
	   wirkt nur innerhalb eines Flex-/Grid-Containers. */
	display: flex;
	flex-direction: column;
	/* Auftrag "Konfigurationsseiten kontrastreicher trennen", 09.09.2026:
	   dashboard/bearbeiten.php UND widget_bearbeiten.php sind projektweit
	   die EINZIGEN Seiten, die mehrere .tc-form-card-Abschnitte
	   HINTEREINANDER stapeln (jede andere Seite mit .tc-form-card nutzt
	   genau EINE Karte für das ganze Formular) - ohne Abstand berührten
	   sich die Kartenränder direkt, wodurch mehrere fachlich getrennte
	   Abschnitte wie ein einziger, unstrukturierter Block wirkten. */
	gap: var(--spacing-lg, 24px);
}
.tc-dash-auswertungstyp-auswahl {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: 10px;
}
.tc-dash-auswertungstyp-karte {
	display: flex;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium, 8px);
	padding: 12px 14px;
	cursor: pointer;
	background-color: var(--color-surface);
}
.tc-dash-auswertungstyp-karte:has(input:checked) {
	border-color: var(--color-primary);
	background-color: var(--color-info-subtle);
}
.tc-dash-auswertungstyp-karte input {
	position: absolute;
	opacity: 0;
	pointer-events: none;
}
.tc-dash-auswertungstyp-karte-inhalt {
	display: flex;
	flex-direction: column;
	gap: 3px;
}
.tc-dash-auswertungstyp-untertitel {
	font-size: .82rem;
	color: var(--color-text-muted);
}
.tc-dash-editor-vorschau-spalte {
	position: sticky;
	top: 16px;
}
.tc-dash-vorschau-hinweis {
	margin: 0 0 10px;
	font-size: .78rem;
	color: var(--color-text-muted);
	font-style: italic;
}
.tc-dash-vorschau-rahmen {
	background-color: var(--color-background);
	border: 1px dashed var(--color-border);
	border-radius: var(--radius-medium, 8px);
	padding: 14px;
}
@media (max-width: 900px) {
	.tc-dash-editor-layout { grid-template-columns: 1fr; }
	.tc-dash-editor-vorschau-spalte { position: static; }
}

/* -- Dashboard-Layoutverwaltung (Fehlerrunde 24.09.2026, Punkt 16/17/18:
   "Neue Dashboard-Layoutverwaltung"/"Live-Layout/Drag & Drop/Resize",
   dashboard/layout.php + js/dashboard-layout-editor.js) --------------------
   Ersetzt die fruehere, hier vormals stehende Groessen-Presets-/
   Positionierungs-Miniatur-Optik aus dashboard/widget_bearbeiten.php (Punkt
   15: Position/Groesse sind kein Bestandteil der Widget-Maske mehr). */
.tc-dash-raster--layout-editor {
	display: grid;
	grid-template-columns: repeat(var(--tc-dash-mini-spalten, 12), 1fr);
	/* Feste Zeilenhoehe (anders als .tc-dash-raster--widgets mit
	   minmax(120px, auto)) - der Editor braucht eine eindeutige, waehrend
	   des Ziehens vorhersehbare Pixel-je-Rasterzeile-Umrechnung (siehe
	   ZEILENHOEHE_PX in js/dashboard-layout-editor.js, muss zu diesem Wert
	   passen). */
	grid-auto-rows: 60px;
	gap: 16px;
	background-color: var(--color-background);
	background-image: repeating-linear-gradient(to bottom, var(--color-border) 0, var(--color-border) 1px, transparent 1px, transparent 76px);
	padding: 12px;
	border-radius: var(--radius-medium, 8px);
	border: 1px solid var(--color-border);
}
.tc-dash-layout-kachel {
	position: relative;
	display: flex;
	flex-direction: column;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium, 8px);
	box-shadow: var(--shadow-small, 0 1px 2px rgba(0,0,0,.06));
	overflow: hidden;
	user-select: none;
}
.tc-dash-layout-kachel--zieht,
.tc-dash-layout-kachel--skaliert {
	border-color: var(--color-primary);
	box-shadow: var(--shadow-medium, 0 4px 14px rgba(0,0,0,.18));
	z-index: 5;
}
.tc-dash-layout-kachel-kopf {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 8px 10px;
	background-color: var(--color-background);
	border-bottom: 1px solid var(--color-border);
	cursor: grab;
	flex: 0 0 auto;
}
.tc-dash-layout-kachel--zieht .tc-dash-layout-kachel-kopf {
	cursor: grabbing;
}
.tc-dash-layout-kachel-titel {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-size: .88rem;
	font-weight: 600;
}
.tc-dash-layout-kachel-bearbeiten {
	flex: 0 0 auto;
	display: inline-flex;
	color: var(--color-text-muted);
}
.tc-dash-layout-kachel-bearbeiten:hover {
	color: var(--color-primary);
}
.tc-dash-layout-kachel-groesse {
	margin: auto 10px 8px;
	font-size: .76rem;
	color: var(--color-text-muted);
}
.tc-dash-layout-resize-griff {
	position: absolute;
	right: 2px;
	bottom: 2px;
	width: 16px;
	height: 16px;
	cursor: nwse-resize;
	border-right: 2px solid var(--color-text-muted);
	border-bottom: 2px solid var(--color-text-muted);
	opacity: .55;
}
.tc-dash-layout-resize-griff:hover {
	opacity: 1;
	border-color: var(--color-primary);
}
@media (max-width: 900px) {
	.tc-dash-raster--layout-editor { grid-template-columns: 1fr; background-image: none; }
	.tc-dash-layout-kachel { grid-column: 1 !important; grid-row: auto !important; }
}

/* Fehlerrunde (24.09.2026), Punkt 10, Abschnitt D "Filterbereiche
   kontextbezogen": Firma/Standort/Abteilung nebeneinander statt
   untereinander gestapelt - alle drei sind einzeilige Multiselects, volle
   Breite je Zeile war unnoetig lang. Bricht auf schmalen Bildschirmen
   automatisch um (dieselbe min-width/flex-wrap-Technik wie
   .tc-dash-formular-spalte). */
.tc-dash-orgfilter-raster {
	display: flex;
	flex-wrap: wrap;
	gap: var(--spacing-md, 16px);
}
.tc-dash-orgfilter-raster > .tc-log-filter-zeile {
	flex: 1 1 220px;
	min-width: 200px;
}
/* Breite/Hoehe bei "Eigene Groesse" (Abschnitt G): nebeneinander statt
   untereinander - .tc-form-zeile stapelt seine Kinder standardmaessig
   (flex-direction:column), hier bewusst als eigene Zeile mit zwei
   kompakten Feldern. */
.tc-dash-eigene-groesse-zeile {
	display: flex;
	flex-wrap: wrap;
	gap: var(--spacing-md, 16px);
}
.tc-dash-eigene-groesse-zeile label {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: .82rem;
	font-weight: 600;
	color: var(--color-text-muted);
}

/* ==================================================================== *
 * REPORTING (Auftrag "Reporting", 09.09.2026)
 * Weitestgehend Wiederverwendung der Dashboard-Bausteine (.tc-dash-*) -
 * hier nur die reportspezifischen Ergaenzungen: Kopfbereich mit Typ-/
 * Zeitraumangabe, Zusatzabschnitte (Durchlaufzeit/Struktur/Vergleich/
 * Trend/Detailfelder aus reporting/anzeigen.php + druckansicht.php ueber
 * includes/report_widget_render.php) sowie ein echter @media print-Block
 * (im Projekt bisher nirgends vorhanden - das alte Druckansicht-Muster,
 * siehe ticketing/anzeigen/show_print.php, hat nie eines besessen).
 * ==================================================================== */
.tc-rp-kopf {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 14px;
	margin-bottom: var(--spacing-md, 16px);
}
.tc-rp-typ-badge {
	margin: 0;
	font-size: .78rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	padding: 3px 10px;
	border-radius: 999px;
	background-color: var(--color-info-subtle);
	color: var(--color-primary);
}
.tc-rp-zeitraum {
	margin: 0;
	font-size: .88rem;
	color: var(--color-text-muted);
}
.tc-rp-hauptdarstellung {
	margin-bottom: var(--spacing-md, 16px);
	min-height: 260px;
}
.tc-rp-zusatzabschnitt {
	margin-top: var(--spacing-md, 16px);
}
.tc-rp-differenz-plus {
	color: var(--color-success);
	font-weight: 600;
}
.tc-rp-differenz-minus {
	color: var(--color-danger, #dc2626);
	font-weight: 600;
}

/* -- Druckansicht (reporting/druckansicht.php) ----------------------- */
.tc-rp-druck-kopf {
	display: flex;
	justify-content: space-between;
	align-items: flex-start;
	gap: var(--spacing-md, 16px);
	border-bottom: 2px solid var(--color-border);
	padding-bottom: 12px;
	margin-bottom: var(--spacing-md, 16px);
}
.tc-rp-druck-titel {
	margin: 0;
	font-size: 1.5rem;
	font-weight: 700;
}
.tc-rp-druck-beschreibung {
	margin: 4px 0 0;
	color: var(--color-text-muted);
}
.tc-rp-druck-meta {
	margin: 0;
	font-size: .82rem;
	color: var(--color-text-muted);
	text-align: right;
	white-space: nowrap;
}
.tc-rp-druck-drucken-btn {
	margin-bottom: var(--spacing-md, 16px);
}

@media print {
	/* Kein Werkzeug im Projekt erzeugt hieraus eine PDF-Datei serverseitig
	   - der Anwender nutzt bewusst den Browser-Druckdialog ("Als PDF
	   speichern"), siehe reporting/anzeigen.php ("Als PDF ausgeben"). Diese
	   Regeln sorgen dafuer, dass dabei weder Bedienelemente mitgedruckt
	   werden noch Diagramme/Tabellen an Seitenraendern abgeschnitten
	   werden (Auftrag: "keine abgeschnittenen Inhalte, keine unlesbaren
	   Mini-Diagramme"). */
	.tc-rp-druck-drucken-btn,
	.tc-druck-drucken-btn,
	.tc-dash-viewer-aktionen,
	.tc-start-zurueck-link {
		display: none !important;
	}
	/* AP12 (Gesamtauftrag "BeWo Ticketsystem 2026", 13.09.2026, "Neue
	   Druckansicht mit Auswahl-Popup"): dieselben Grundregeln fuer die neue
	   Ticket-Druckansicht (ticketing/anzeigen/show_print.php) - reine
	   .tc-form-card-Karten wie im uebrigen Projekt, kein eigenes Markup. */
	.tc-form-card {
		break-inside: avoid;
		page-break-inside: avoid;
	}
	body {
		background-color: #fff !important;
	}
	.tc-rp-hauptdarstellung {
		border: none !important;
		box-shadow: none !important;
		break-inside: avoid;
	}
	.tc-rp-zusatzabschnitt {
		break-inside: avoid;
		page-break-inside: avoid;
	}
	.tc-dash-chart,
	.tc-dash-chart--kreis {
		max-width: 100% !important;
		height: auto !important;
	}
	.tc-list-scroll {
		overflow: visible !important;
	}
	table {
		break-inside: auto;
	}
	tr {
		break-inside: avoid;
	}
}

/* -- Preisliste (warenwirtschaft/preisliste/druckansicht.php, Folgeauftrag
   28.09.2026) - wiederholt die Tabellenkoepfe auf jeder Folgeseite beim
   Drucken (thead als eigene "table-header-group", Standardverhalten der
   meisten Browser-Druck-Engines beim Seitenumbruch innerhalb einer
   Tabelle) und verhindert abgeschnittene Zeilen (break-inside: avoid je
   Zeile, wie bereits oben fuer die Report-Druckansicht etabliert). Seiten-
   zahlen kommen bewusst NICHT aus eigenem CSS, sondern aus der bereits
   vorhandenen Kopf-/Fusszeile des Browser-Druckdialogs ("Als PDF
   speichern" mit aktivierten Kopf-/Fusszeilen) - keine neue PDF-Technik
   noetig (Auftrag: "bestehende PDF-Technik verwenden"). -- */
.tc-pl-tabelle thead {
	display: table-header-group;
}
.tc-pl-tabelle tr {
	break-inside: avoid;
}
@media print {
	.tc-pl-tabelle thead {
		display: table-header-group;
	}
	.tc-pl-tabelle tr {
		break-inside: avoid;
	}
}

/* Nutzerauftrag (28.09.2026, Preisliste-Layout): kompakte, einzeilige
   Positionen (weniger vertikales Padding als die Standard-Listenansicht,
   white-space:nowrap fuer Kennung/Kondition/Betraege/Steuer, damit lange
   Inhalte nicht umbrechen), Gruppierung mehrerer Konditionen desselben
   Artikels ueber Hintergrundschattierung statt Trennlinien (border-bottom
   je Zeile bewusst entfernt) - macht sichtbar "gleicher Artikel,
   verschiedene Konditionen" statt wie eine Dublette zu wirken. Der
   Artikelname selbst darf weiterhin umbrechen (lange Bezeichnungen), nur
   die uebrigen, kurzen Spalten bleiben einzeilig. Nutzerauftrag-Praezisierung:
   "Umbruch ist ok, wenn dabei alles buendig bleibt" - vertical-align:top
   HIER explizit (nicht nur ueber die geerbte .ticket-list-view-Basisregel)
   gesetzt, damit alle Spaltenwerte einer Zeile IMMER an der ersten
   (oberen) Zeile ausgerichtet bleiben, auch wenn die Artikel-Spalte durch
   einen langen Namen mehrzeilig wird - keine "springenden"/vertikal
   zentrierten Werte in den Nachbarspalten. */
.tc-pl-tabelle td,
.tc-pl-tabelle th {
	padding: 5px 8px;
	border-bottom: none;
	vertical-align: top;
}
.tc-pl-tabelle td:nth-child(2),
.tc-pl-tabelle td:nth-child(3),
.tc-pl-tabelle td:nth-child(4),
.tc-pl-tabelle td:nth-child(5),
.tc-pl-tabelle td:nth-child(6) {
	white-space: nowrap;
}
.tc-pl-gruppe-a {
	background-color: var(--color-surface);
}
.tc-pl-gruppe-b {
	background-color: color-mix(in srgb, var(--color-border) 22%, var(--color-surface));
}
.tc-pl-druck-untertitel {
	margin: 2px 0 0;
	font-size: 1.15rem;
	font-weight: 600;
}
@media print {
	.tc-pl-gruppe-a {
		background-color: #fff;
	}
	.tc-pl-gruppe-b {
		background-color: #eee;
		-webkit-print-color-adjust: exact;
		print-color-adjust: exact;
	}
}

/* ADMINISTRATION-UEBERSICHT (Facelift-Auftrag, 10.09.2026): einfache
   Kachel-Navigation zu den Unterbereichen (Ticket-Gruppen/Cobra-Import/
   Seitenstatus/Datensicherung/Benutzerverwaltung).
   Nutzerauftrag (21.09.2026, "Zeilen-Hover fehlt bei ... Admin-Navigation
   (Ganze Kacheln)"): die gesamte Kachel soll jetzt beim Hover erkennbar
   reagieren, nicht nur der Titeltext. Dasselbe bereits etablierte,
   sichere Muster wie .tc-dash-karte/.tc-dash-karte-titel-link (s. u. in
   dieser Datei, Dashboard-Uebersicht) statt .tc-neu-card (die ist
   speziell fuer den Ticketart-Bildkarten-Picker gebaut und faerbt die
   GANZE Flaeche ein, hier reicht ein dezentes Anheben - siehe
   [gestreckter-Link-Positionsfalle]-Lektion): .tc-form-card erhaelt
   position:relative als alleinigen, direkten positionierten Vorfahren
   (keine dazwischenliegenden Wrapper mit eigenem position - Ursache der
   frueheren Falle), .tc-admin-hub-titel a::before spannt sich per
   position:absolute; inset:0 unsichtbar ueber die GESAMTE Karte auf und
   macht sie so komplett klickbar/hoverbar, waehrend :has() ausschliesslich
   Rahmen/Schatten der Karte anhebt - der Titeltext behaelt dabei seine
   eigene Linkfarbe statt der kraeftigen globalen a:hover-Flaeche
   (background-color:var(--color-primary); color:#fff), siehe dortige
   explizite Neutralisierung weiter unten (derselbe Lesbarkeits-Fehlertyp
   wie beim [css_custom_property_wrapper_falle]-Nachbarthema). */
.tc-admin-hub-grid {
	display: grid;
	grid-template-columns: 1fr;
	gap: 16px;
}
@media (min-width: 620px) {
	.tc-admin-hub-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
.tc-admin-hub-grid .tc-form-card {
	position: relative;
	transition: box-shadow .15s ease, border-color .15s ease;
}
.tc-admin-hub-grid .tc-form-card:has(.tc-admin-hub-titel a:hover),
.tc-admin-hub-grid .tc-form-card:has(.tc-admin-hub-titel a:focus-visible) {
	box-shadow: var(--shadow-medium);
	border-color: var(--color-border-strong);
}
.tc-admin-hub-titel a::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}
.tc-admin-hub-titel a:focus-visible {
	outline: none;
}
.tc-admin-hub-grid .tc-form-card:has(.tc-admin-hub-titel a:focus-visible) {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-admin-hub-titel {
	font-family: var(--font-system);
	font-size: 1.05rem;
	font-weight: 700;
	margin: 0 0 6px;
}
/* Auftrag "Admin-Themen mit Eyecatcher-Symbolen versehen" (11.09.2026):
   ein Icon je Kachel, deutlich groesser/kraeftiger als die sonst uebliche
   14px-Inline-Verwendung von .tc-icon, damit es tatsaechlich als
   Eyecatcher wirkt statt nur als kleines Deko-Element neben dem Text. */
.tc-admin-hub-titel .tc-icon {
	width: 20px;
	height: 20px;
	margin-right: 8px;
	vertical-align: -5px;
	color: var(--color-primary);
}
.tc-admin-hub-titel a {
	color: var(--color-primary-dark);
	text-decoration: none;
}
.tc-admin-hub-titel a:hover,
.tc-admin-hub-titel a:focus-visible {
	text-decoration: underline;
	background-color: transparent;
	color: var(--color-primary-dark);
}
.tc-admin-hub-beschreibung {
	margin: 0;
	color: var(--color-text-muted);
	font-size: 0.92rem;
}

/* ==========================================================================
   Zentrale Bild-Upload-/Bearbeitungskomponente (js/tc-bildeditor.js)
   Auftrag "Bild-Upload systemweit modernisieren und vereinheitlichen"
   (11.09.2026) - EIN Editor-Modal fuer alle Bild-Upload-Stellen im Projekt.
   ========================================================================== */
dialog.tc-bildeditor-dialog {
	max-width: 640px;
	width: 92vw;
}
.tc-bildeditor-body {
	display: flex;
	gap: 24px;
	flex-wrap: wrap;
	align-items: flex-start;
}
.tc-bildeditor-hauptbereich {
	display: flex;
	flex-direction: column;
	gap: 14px;
	flex: 1 1 320px;
}
.tc-bildeditor-buehne {
	position: relative;
	overflow: hidden;
	/* Folgeauftrag 24.09.2026: die tatsaechliche Pixelgroesse wird per JS
	   inline gesetzt und berechnet sich jetzt aus der verfuegbaren
	   Viewport-Groesse statt einer festen Konstante (js/tc-bildeditor.js,
	   rahmenBasisGroesse()) - bewusst KEIN CSS max-width hier, das wuerde
	   nur die Breite kappen und damit das von JS berechnete
	   Seitenverhaeltnis der Buehne verzerren. */
	/* Folgeauftrag (24.09.2026, "Logo-/Bild-Upload verbessern"): vorher
	   #1a1a1a - im neuen "einpassen"-Modus (contain statt cover, siehe
	   js/tc-bildeditor.js) bleibt bei nicht passendem Seitenverhaeltnis
	   Rahmenflaeche neben dem Bild sichtbar; hell/weiss entspricht der
	   tatsaechlichen weissen Auffuellung, die der Server erzeugt
	   (tc_bild_zuschneiden_und_skalieren() in includes/tc_bild.php) - die
	   Vorschau zeigt damit dasselbe Ergebnis, das spaeter gespeichert wird.
	   In allen bisherigen (cover-)Verwendungen unveraendert unsichtbar, da
	   das Bild dort immer die gesamte Buehne deckt. */
	background-color: #f4f4f5;
	border-radius: 6px;
	margin: 0 auto;
	touch-action: none;
	cursor: grab;
}
.tc-bildeditor-buehne:active {
	cursor: grabbing;
}
.tc-bildeditor-dreh-wrapper {
	position: absolute;
	top: 50%;
	left: 50%;
}
.tc-bildeditor-bild {
	display: block;
	max-width: none;
	max-height: none;
	user-select: none;
	-webkit-user-drag: none;
}
.tc-bildeditor-raster {
	position: absolute;
	inset: 0;
	pointer-events: none;
	background-image:
		linear-gradient(to right, rgba(255,255,255,0.35) 1px, transparent 1px),
		linear-gradient(to bottom, rgba(255,255,255,0.35) 1px, transparent 1px);
	background-size: 33.34% 33.34%;
}
.tc-bildeditor-fokus-handle {
	position: absolute;
	width: 22px;
	height: 22px;
	margin-left: -11px;
	margin-top: -11px;
	border-radius: 50%;
	border: 2px solid #FFF;
	background-color: rgba(0,0,0,0.35);
	box-shadow: 0 0 0 1px rgba(0,0,0,0.4);
	cursor: move;
	touch-action: none;
}
.tc-bildeditor-ratio-buttons {
	display: flex;
	gap: 6px;
	flex-wrap: wrap;
}
.tc-bildeditor-regler {
	display: flex;
	flex-direction: column;
	gap: 10px;
}
.tc-bildeditor-regler-zeile {
	display: flex;
	align-items: center;
	gap: 10px;
	font-size: 0.9rem;
	color: var(--color-text-muted);
}
.tc-bildeditor-regler-zeile input[type="range"] {
	flex: 1 1 auto;
}
.tc-bildeditor-dreh-buttons {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}
.tc-bildeditor-vorschau-spalte {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	flex: 0 0 auto;
}
.tc-bildeditor-vorschau-label {
	font-size: 0.85rem;
	color: var(--color-text-muted);
}
.tc-bildeditor-vorschau-rund {
	border-radius: 50%;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
}
.tc-bildeditor-fehler {
	flex-basis: 100%;
}
@media (max-width: 480px) {
	.tc-bildeditor-body {
		gap: 16px;
	}
}

/* Grosse, rechteckige Profilbild-Darstellung (tc_profilbild_markup(),
   includes/main.php) - Portraetformat, siehe Auftrag "Bild-Upload
   systemweit modernisieren" Abschnitt 2. */
.tc-profilbild {
	aspect-ratio: 3 / 4;
	object-fit: cover;
	border-radius: 8px;
	display: block;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
}
.tc-profilbild-initialen {
	aspect-ratio: 3 / 4;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: 8px;
	background-color: var(--color-primary);
	color: #FFF;
	font-weight: 700;
}

/* System-Protokoll (Auftrag "System-Protokoll im Adminbereich", 11.09.2026):
   kleine farbige Pille je Rubrik (Ticketing/Profile/Aktuelles/Zusatzinhalt/
   Sicherheit/Dashboard/Sonstiges) - Farbe kommt inline als --tc-color,
   analog zur bestehenden Ticketgruppen-Farbe in der Ticket-Historie. */
.tc-systemprotokoll-rubrik-chip {
	display: inline-block;
	font-size: 0.78rem;
	font-weight: 600;
	padding: 3px 9px;
	border-radius: 999px;
	color: var(--tc-color, var(--color-text));
	background-color: color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 16%, var(--color-surface));
	border: 1px solid color-mix(in srgb, var(--tc-color, var(--color-border-strong)) 40%, transparent);
	white-space: nowrap;
}

/* Auftrag "Wartungsmodus optisch vereinheitlichen" (13.09.2026): EINE
   zentrale Darstellung fuer den gesamten Wartungsmodus - genutzt sowohl von
   der seitenweiten Wartungsansicht (framework/Wartungsmodus/Seite.php,
   eingebunden ueber framework/Kopfzeile/Default.php fuer alle normalen
   Seiten) als auch von login.php (dort zusaetzlich mit Administrator-
   Zugang darunter, siehe .tc-wartung-admin-zugang). Hier statt in einer
   eigenen Datei, weil css/styles.css ohnehin von JEDER Seite bereits vor
   dem Zeitpunkt geladen wird, an dem die seitenweite Ansicht rendert (siehe
   Kommentar in Seite.php: <head> ist zu diesem Zeitpunkt bereits
   geschlossen, ein zusaetzlicher <link> waere dort nur ausserhalb von
   <head> moeglich gewesen). Nutzt ausschliesslich bestehende Design-Tokens
   (--color-*, --radius-*, --shadow-*, --spacing-*) - kein neues
   Farbsystem. Die Ebene "Online-Ticketsystem"/"BeWo Telehealthcare GmbH"
   nutzt bewusst dieselben .tc-auth-marke*-Klassen wie login.php (siehe
   css/login.css) statt einer Kopie, damit beide Ansichten exakt gleich
   wirken. */
.tc-wartung-seite {
	background-color: var(--color-background);
	min-height: 100vh;
	margin: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--spacing-md);
	box-sizing: border-box;
	font-family: var(--font-system);
}

.tc-wartung-karte {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-large);
	box-shadow: var(--shadow-medium);
	padding: var(--spacing-lg);
	width: 100%;
	max-width: 600px;
	box-sizing: border-box;
}

.tc-wartung-panel {
	background-color: var(--color-warning-subtle);
	color: var(--color-warning-dark);
	border: 1px solid var(--color-warning);
	border-radius: var(--radius-medium);
	padding: var(--spacing-md);
	margin-bottom: var(--spacing-md);
}

.tc-wartung-panel-titel {
	display: flex;
	align-items: center;
	gap: 8px;
	font-weight: 700;
	font-size: 1.05rem;
	margin: 0 0 8px 0;
}

.tc-wartung-panel-titel .tc-icon {
	width: 18px;
	height: 18px;
	flex-shrink: 0;
}

.tc-wartung-beschreibung {
	margin: 0 0 8px 0;
	line-height: 1.5;
}

.tc-wartung-grund {
	margin: 0;
	padding-top: 8px;
	border-top: 1px solid color-mix(in srgb, var(--color-warning) 40%, transparent);
	line-height: 1.5;
	overflow-wrap: anywhere;
}

.tc-wartung-panel:has(.tc-wartung-grund) .tc-wartung-beschreibung {
	margin-bottom: 8px;
}

.tc-wartung-zeit,
.tc-wartung-kontakt {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 10px 0;
	border-top: 1px solid var(--color-border);
}

.tc-wartung-zeit .tc-icon,
.tc-wartung-kontakt .tc-icon {
	width: 18px;
	height: 18px;
	flex-shrink: 0;
	margin-top: 2px;
	color: var(--color-text-muted);
}

.tc-wartung-zeit > div,
.tc-wartung-kontakt > div {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.tc-wartung-zeit-label,
.tc-wartung-kontakt-label {
	font-size: .82rem;
	color: var(--color-text-muted);
}

.tc-wartung-zeit-wert,
.tc-wartung-kontakt-name {
	font-weight: 600;
	color: var(--color-text);
	overflow-wrap: anywhere;
}

.tc-wartung-kontakt-zeile {
	font-size: .9rem;
	color: var(--color-text);
	overflow-wrap: anywhere;
}

.tc-wartung-kontakt-zeile a {
	color: var(--color-primary);
	text-decoration: none;
}

.tc-wartung-kontakt-zeile a:hover {
	text-decoration: underline;
}

.tc-wartung-admin-zugang {
	margin-top: var(--spacing-md);
	text-align: center;
	font-size: .88rem;
}

.tc-wartung-admin-zugang a,
.tc-wartung-admin-zugang summary {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	color: var(--color-text-muted);
	text-decoration: none;
	cursor: pointer;
	list-style: none;
}

.tc-wartung-admin-zugang summary::-webkit-details-marker {
	display: none;
}

.tc-wartung-admin-zugang .tc-icon {
	width: 15px;
	height: 15px;
}

.tc-wartung-admin-zugang a:hover,
.tc-wartung-admin-zugang summary:hover {
	color: var(--color-primary);
	text-decoration: underline;
}

.tc-wartung-admin-formular {
	margin-top: var(--spacing-md);
	text-align: left;
}

@media (max-width: 480px) {
	.tc-wartung-seite {
		padding: 16px;
	}
	.tc-wartung-karte {
		padding: var(--spacing-md);
		border-radius: var(--radius-medium);
	}
}

/* Hinweiszeile fuer Administratoren im Kopfbereich (framework/Kopfzeile/
   Default.php), solange der Wartungsmodus aktiv ist - Administratoren
   umgehen die Wartung und sehen sonst keinen Hinweis darauf. */
.app-wartung-hinweis {
	background-color: var(--color-warning-subtle);
	color: var(--color-warning-dark);
	border-top: 1px solid var(--color-warning);
	border-bottom: 1px solid var(--color-warning);
	padding: 8px 16px;
	font-size: .85rem;
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
}

.app-wartung-hinweis .tc-icon {
	width: 15px;
	height: 15px;
	flex-shrink: 0;
}

.app-wartung-hinweis a {
	color: inherit;
	font-weight: 600;
	text-decoration: underline;
	margin-left: auto;
}

/* ==========================================================================
   WYSIWYG-Mail-Editor (Auftrag "WYSIWYG-Mail-Editor", 14.09.2026) -
   administration/mailvorlagen/aendern.php, siehe js/mailvorlagen-wysiwyg.js.
   ========================================================================== */

.tc-modus-umschalter {
	display: inline-flex;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	overflow: hidden;
}
.tc-modus-umschalter button {
	border: none;
	background: var(--color-surface);
	color: var(--color-text-muted);
	padding: 6px 14px;
	font-size: 0.85rem;
	cursor: pointer;
}
.tc-modus-umschalter button + button {
	border-left: 1px solid var(--color-border);
}
.tc-modus-umschalter button[aria-pressed="true"] {
	background: var(--color-primary);
	color: #fff;
	font-weight: 600;
}

/* ==========================================================================
   SMS-Bereich (Auftrag "SMS-Bereich weiterentwickeln", 16.09.2026) -
   sms/index.php, sms/sms_modal_senden.php, sms/sms_modal_zuordnen.php.
   ========================================================================== */

.tc-empfaenger-ergebnis {
	padding: 6px 0;
	border-bottom: 1px solid var(--color-border);
}
.tc-empfaenger-ergebnis:last-child {
	border-bottom: none;
}
.tc-ticket-suchergebnis:hover,
.tc-ticket-suchergebnis:focus-visible {
	border-color: var(--color-primary) !important;
	background: var(--color-surface-hover, #f4f6fb) !important;
}

#tc-html-editor-mount {
	margin-bottom: var(--spacing-sm, 8px);
}

#html {
	width: 100%;
	box-sizing: border-box;
	min-height: 600px;
	font-family: monospace;
	font-size: 12px;
}

/* Kompaktes Variablen-/Referenz-Popover (Betreff-Feld + "Zusatzfelder je
   Ticketart"-Info) - eigenstaendige Klassen statt .tc-toolbar-popover-*
   Wiederverwendung, da Inhalt hier dynamisch per JS aufgebaut wird und
   deutlich mehr Eintraege/Gruppen enthalten kann (scrollbar). */
.tc-platzhalter-widget {
	position: relative;
	display: inline-block;
}
.tc-platzhalter-panel {
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 30;
	margin-top: 6px;
	width: max-content;
	min-width: 280px;
	max-width: 420px;
	max-height: 60vh;
	overflow-y: auto;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium);
	padding: 10px;
}
.tc-platzhalter-panel[hidden] {
	display: none;
}
.tc-platzhalter-gruppentitel {
	margin: 10px 0 4px 0;
	font-size: 0.8rem;
	font-weight: 700;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: 0.02em;
}
.tc-platzhalter-gruppentitel:first-child {
	margin-top: 0;
}
.tc-platzhalter-liste {
	list-style: none;
	margin: 0;
	padding: 0;
}
.tc-platzhalter-eintrag {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 10px;
	width: 100%;
	box-sizing: border-box;
	border: none;
	background: none;
	text-align: left;
	padding: 5px 6px;
	border-radius: var(--radius-small, 4px);
	cursor: pointer;
	font-size: 0.85rem;
	color: var(--color-text);
}
.tc-platzhalter-eintrag:hover,
.tc-platzhalter-eintrag:focus-visible {
	background-color: var(--color-surface-hover, #f4f5f7);
}
.tc-platzhalter-label {
	flex: 1 1 auto;
}
.tc-platzhalter-code {
	flex: 0 0 auto;
	color: var(--color-text-muted);
	font-size: 0.78rem;
}
.tc-zusatzfelder-info-art {
	margin: 2px 0;
}
.tc-zusatzfelder-info-art summary {
	cursor: pointer;
	font-size: 0.85rem;
	padding: 3px 2px;
}
.tc-zusatzfelder-info-art .tc-platzhalter-liste {
	padding-left: 10px;
}

/* ==========================================================================
   E-Mail-Vorlagen-Uebersicht (Auftrag "WYSIWYG-Mail-Editor, Feinschliff",
   14.09.2026): deutliche Abgrenzung der Vorlagen-Gruppen (Eskaliert, Neu,
   Geschlossen usw.) - eigene, spezifischere Regel statt die geteilte
   .tc-admin-trenner-Basisregel zu veraendern (wird auch von
   administration/ticketarten/ und administration/ticketgruppen/ genutzt).
   ========================================================================== */
#tc-admin-liste-mailvorlagen tr.tc-admin-trenner td {
	background-color: var(--color-primary-subtle, #eef1fa);
	color: var(--color-primary);
	border-top: 2px solid var(--color-primary);
	font-size: 0.8rem;
}
#tc-admin-liste-mailvorlagen tr.tc-admin-trenner:first-child td {
	border-top: none;
}

.tc-admin-liste-beschreibung {
	margin-top: 2px;
}
.tc-admin-liste-beschreibung summary {
	cursor: pointer;
	font-size: 0.78rem;
	color: var(--color-text-muted);
	list-style-position: outside;
}
.tc-admin-liste-beschreibung[open] summary {
	margin-bottom: 2px;
}

/* ==========================================================================
   Datenbankpflege (Auftrag 16.09.2026) - Sequenzielle Pruefpunkt-Liste fuer
   Analyse UND Bereinigung (gleiche Optik, per data-Attribut gesteuert,
   siehe js/datenbankpflege.js). Status-Punkt analog zum bestehenden
   .tc-dash-live-punkt-Muster (dashboard/SMS-Lebenszeichen), hier mit
   zusaetzlicher "laeuft"-Rotation statt Puls (Auftrag Abschnitt 2: klar
   erkennbarer aktiver Zustand waehrend der Pruefung).
   ========================================================================== */
.tc-dbpflege-liste {
	display: flex;
	flex-direction: column;
	gap: 2px;
}
.tc-dbpflege-punkt {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
}
.tc-dbpflege-punkt + .tc-dbpflege-punkt {
	margin-top: 8px;
}
.tc-dbpflege-punkt-kopf {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 14px;
	flex-wrap: wrap;
}
.tc-dbpflege-status {
	width: 20px;
	height: 20px;
	border-radius: 50%;
	flex-shrink: 0;
	border: 2px solid var(--color-border);
	position: relative;
	box-sizing: border-box;
}
.tc-dbpflege-status[data-status="laeuft"] {
	border-color: var(--color-primary);
	border-top-color: transparent;
	animation: tc-dbpflege-rotieren .8s linear infinite;
}
.tc-dbpflege-status[data-status="ok"] {
	border-color: var(--color-success);
	background-color: var(--color-success);
}
.tc-dbpflege-status[data-status="ok"]::after {
	content: "";
	position: absolute;
	left: 5px;
	top: 2px;
	width: 5px;
	height: 9px;
	border: solid #fff;
	border-width: 0 2px 2px 0;
	transform: rotate(45deg);
}
.tc-dbpflege-status[data-status="warnung"] {
	border-color: var(--color-warning);
	background-color: var(--color-warning);
}
.tc-dbpflege-status[data-status="warnung"]::after {
	content: "!";
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	font-weight: 700;
	font-size: .78rem;
}
.tc-dbpflege-status[data-status="fehler"] {
	border-color: var(--color-danger-strong, #C0392B);
	background-color: var(--color-danger-strong, #C0392B);
}
.tc-dbpflege-status[data-status="fehler"]::after {
	content: "×";
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	font-weight: 700;
	font-size: .9rem;
	line-height: 1;
}
@keyframes tc-dbpflege-rotieren {
	to { transform: rotate(360deg); }
}
.tc-dbpflege-punkt-titel {
	font-weight: 600;
	flex: 0 0 auto;
}
.tc-dbpflege-punkt-ergebnis {
	color: var(--color-text-muted);
	font-size: .88rem;
	flex: 1 1 auto;
}
.tc-dbpflege-punkt-auswahl {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: .85rem;
	cursor: pointer;
	flex: 0 0 auto;
}
.tc-dbpflege-punkt-details-toggle {
	border: 1px solid var(--color-border);
	background: #fff;
	border-radius: var(--radius-small, 4px);
	font-size: .8rem;
	padding: 3px 10px;
	cursor: pointer;
	flex: 0 0 auto;
	/* 02.10.2026: Schriftfarbe explizit - eine globale button-Regel setzte
	   sie auf Weiss (weiss auf weiss, nur im Hover sichtbar). */
	color: var(--color-text, #1F2328);
}
.tc-dbpflege-punkt-details-toggle:hover,
.tc-dbpflege-punkt-details-toggle:focus-visible {
	background: var(--color-primary, #2F4A9E);
	border-color: var(--color-primary, #2F4A9E);
	color: #fff;
}
.tc-dbpflege-punkt-details {
	border-top: 1px solid var(--color-border);
	padding: 10px 14px;
	font-size: .85rem;
}
.tc-dbpflege-punkt-details table {
	width: 100%;
	border-collapse: collapse;
	font-size: .82rem;
}
.tc-dbpflege-punkt-details th,
.tc-dbpflege-punkt-details td {
	text-align: left;
	padding: 4px 8px;
	border-bottom: 1px solid var(--color-border);
	vertical-align: top;
}
.tc-dbpflege-punkt-hinweis {
	margin-top: 6px;
	color: var(--color-text-muted);
	font-style: italic;
}
.tc-dbpflege-zusammenfassung {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
	gap: 10px;
	margin: 12px 0;
}
.tc-dbpflege-kennzahl {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 10px 12px;
	background-color: var(--color-background);
}
.tc-dbpflege-kennzahl-wert {
	font-size: 1.4rem;
	font-weight: 700;
	display: block;
}
.tc-dbpflege-kennzahl-label {
	font-size: .78rem;
	color: var(--color-text-muted);
}
.tc-dbpflege-aktionen {
	display: flex;
	gap: 10px;
	align-items: center;
	flex-wrap: wrap;
	margin-top: 14px;
}

/* Nachtrag (Auftrag "Datenbankpflege: mehr Details bei Hover + manuelle
   Entfernung einzeln/alle", 17.09.2026). */
.tc-dbpflege-hover-zeile {
	cursor: default;
}
.tc-dbpflege-hover-symbol {
	color: var(--color-text-muted);
	font-size: .85em;
	margin-left: 3px;
}
.tc-dbpflege-hover-tooltip {
	position: absolute;
	z-index: 30;
	max-width: 420px;
	max-height: 320px;
	overflow-y: auto;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	box-shadow: var(--shadow-medium, var(--shadow-small));
	padding: 10px 12px;
	font-size: .8rem;
}
.tc-dbpflege-hover-tooltip-titel {
	margin: 0 0 6px;
	font-weight: 700;
}
.tc-dbpflege-hover-tooltip-hinweis {
	margin: 6px 0 0;
	color: var(--color-text-muted);
	font-style: italic;
}
.tc-dbpflege-hover-tooltip + .tc-dbpflege-hover-tooltip {
	margin-top: 6px;
}
.tc-dbpflege-felder {
	margin: 0 0 8px;
	display: grid;
	grid-template-columns: max-content 1fr;
	gap: 2px 10px;
}
.tc-dbpflege-felder:last-child {
	margin-bottom: 0;
}
.tc-dbpflege-felder dt {
	color: var(--color-text-muted);
	font-weight: 600;
}
.tc-dbpflege-felder dd {
	margin: 0;
	word-break: break-word;
}
.tc-dbpflege-manuell-bereich {
	margin-top: 12px;
	border-top: 1px dashed var(--color-border);
	padding-top: 10px;
}
.tc-dbpflege-manuell-gruppe + .tc-dbpflege-manuell-gruppe {
	margin-top: 16px;
}
.tc-dbpflege-manuell-tabelle-wrapper {
	max-height: 280px;
	overflow-y: auto;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, var(--radius-medium));
}
.tc-dbpflege-manuell-tabelle {
	width: 100%;
	border-collapse: collapse;
	font-size: .8rem;
}
.tc-dbpflege-manuell-tabelle th,
.tc-dbpflege-manuell-tabelle td {
	text-align: left;
	padding: 4px 8px;
	border-bottom: 1px solid var(--color-border);
	vertical-align: top;
}
.tc-dbpflege-manuell-tabelle thead th {
	position: sticky;
	top: 0;
	background-color: var(--color-background);
}
.tc-dbpflege-manuell-aktionen {
	display: flex;
	gap: 8px;
	margin-top: 8px;
	flex-wrap: wrap;
}

/* ==========================================================================
   Kooperationspartner: einheitliche Informationsarchitektur in Anzeige UND
   Bearbeitung (Folgeauftrag 23.09.2026) - beide Seiten
   (kooperationspartner/detail.php, administration/kooperationspartner/
   aendern.php) gliedern sich jetzt in dieselben neun Themenbereiche und
   verwenden dafuer .tc-detail-card/.tc-detail-section-head/-title (siehe
   dort), damit die Anzeige "wie eine strukturierte Wissensseite" statt
   einer langen Feld:Wert-Liste wirkt. Diese Klassen lesen
   --panel-*/--ticket-accent*-Variablen, die ausserhalb von .tc-ticket-area
   nicht registriert sind (sonst faellt Hintergrund/Randfarbe komplett aus,
   siehe ausfuehrliche Erklaerung bei .tc-neu-page) - .tc-kopartner-page
   setzt daher dieselbe neutrale Fallback-Formel wie .tc-neu-page.
   ========================================================================== */
.tc-kopartner-page {
	--ticket-accent: var(--color-border-strong);
	--ticket-accent-dark: var(--color-text);
	--ticket-accent-soft: color-mix(in srgb, var(--color-border-strong) 10%, var(--color-surface));
	--ticket-accent-border: color-mix(in srgb, var(--color-border-strong) 28%, var(--color-border));
}
/* Externe Read-only-Ansicht (Auftrag "Externe Zugriffe / Cobra CRM Plus",
   24.09.2026, external/index.php) - die Seite hat bewusst KEIN normales
   Framework-Kopf-/Fusszeilen-Geruest (externe Systeme sollen keine interne
   Navigation/Kopfzeile sehen), braucht deshalb einen eigenen, einfachen
   Seitenrahmen um den sonst unveraendert wiederverwendeten
   ".tc-kopartner-page"-Inhalt. */
.tc-extern-seite {
	max-width: 900px;
	margin: 0 auto;
	padding: var(--spacing-lg, 24px) var(--spacing-md, 16px);
}
/* Folgeauftrag (24.09.2026, "Architektur noch allgemeiner aufbauen"):
   Dashboard-/Report-Ressourcen brauchen die volle Rasterbreite wie ihre
   internen Vorbilder (dashboard/anzeigen.php, reporting/anzeigen.php),
   nicht die schmale, fliesstext-orientierte Breite der Koop-Ansicht. */
.tc-extern-seite--breit {
	max-width: 1400px;
}
/* Sprungnavigation im Bereich "Uebersicht" zu den uebrigen Themenbereichen -
   nur tatsaechlich vorhandene Bereiche werden von der jeweiligen Seite
   verlinkt (siehe $tc_nav in detail.php/aendern.php). */
.tc-kopartner-nav {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin-top: var(--spacing-sm);
}

/* Wiederholbare Datensaetze (Adressen, Ansprechpartner, IK-Nummern,
   Nummernkreise, Geraetetypen, Hinweise) in der Bearbeitungsmaske: zunaechst
   kompakt als Zusammenfassungszeile dargestellt, oeffnet sich erst ueber
   Klick zum vollstaendigen Formular (Auftrag: "nicht dauerhaft als grosse
   Eingabeblöcke, sondern zunaechst kompakt anzeigen und über
   Hinzufügen/Bearbeiten öffnen"). Natives <details>/<summary> - bewusst wie
   bei .tc-release-row/.tc-neu-settings-summary bereits im Projekt etabliert,
   funktioniert vollstaendig ohne eigenes JavaScript und bleibt daher mit dem
   bestehenden js/kopartner-editor.js (Klonen/Entfernen per
   data-kp-zeile/data-kp-entfernen, unveraendert) kompatibel - data-kp-zeile
   sitzt einfach auf dem <details>-Element statt auf einem <div>. Neu per
   Vorlage hinzugefuegte Zeilen tragen das open-Attribut bereits im
   <template>-Markup, damit ein frisch hinzugefuegter, noch leerer Datensatz
   sofort ausgefuellt werden kann. */
.tc-kp-zeile {
	margin-top: var(--spacing-sm);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium, 8px);
	background-color: var(--color-surface);
}
.tc-kp-zeile-kopf {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 8px 12px;
	cursor: pointer;
	list-style: none;
	font-size: 0.92rem;
}
.tc-kp-zeile-kopf::-webkit-details-marker {
	display: none;
}
.tc-kp-zeile-kopf::marker {
	content: '';
}
.tc-kp-zeile-kopf:hover {
	background-color: var(--color-background);
}
.tc-kp-zeile-kopf:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: -2px;
}
.tc-kp-zeile-kopf .tc-icon-chevron {
	flex-shrink: 0;
	transition: transform 0.15s ease;
}
.tc-kp-zeile[open] > .tc-kp-zeile-kopf .tc-icon-chevron {
	transform: rotate(90deg);
}
.tc-kp-zeile-kopf span {
	display: flex;
	align-items: center;
	gap: 6px;
}
.tc-kp-zeile-inhalt {
	padding: 4px 12px 12px 12px;
	border-top: 1px solid var(--color-border);
}

/* Kooperationspartner-Ticket-Widget (Folgeauftrag 23.09.2026): Kopfbereich
   mit Logo (Auftrag Punkt 3: "nicht riesig, aber auch nicht zu klein,
   proportional skaliert, nicht verzerrt, drueckt den Rest nicht nach
   unten") - object-fit:contain verhindert Verzerrung, max-height haelt die
   Karte kompakt. Ohne Logo entfaellt das <img> serverseitig komplett (kein
   leerer Platzhalter), wodurch der Name durch den fehlenden Flex-Nachbarn
   automatisch nach oben ruckt. */
.tc-wwikp-kopf {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 8px;
}
.tc-wwikp-logo {
	max-height: 44px;
	max-width: 110px;
	object-fit: contain;
	flex-shrink: 0;
}
.tc-wwikp-name strong {
	font-size: 1.02rem;
	color: var(--color-text);
}
.tc-wwikp-name span {
	display: block;
}
/* Nummernkreise/Geraete (Auftrag Punkte 6/7): kompakte Liste statt Tabelle,
   damit die schmale rechte Spalte nicht ueberladen wirkt. */
.tc-wwikp-nummernkreise,
.tc-wwikp-geraete {
	list-style: none;
	margin: 0 0 8px 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 0.88rem;
}
.tc-wwikp-nummernkreise li,
.tc-wwikp-geraete li {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	flex-wrap: wrap;
}
/* Getroffener Nummernkreis (Auftrag Punkt 6: "visuell besonders
   kennzeichnen") - Fettdarstellung UND kleines "passend"-Kennzeichen
   (siehe .tc-admin-status-badge--aktiv im Markup), bewusst ohne zusaetzliche
   Flaechenfarbe, damit die Liste nicht ueberladen wirkt. */
.tc-wwikp-nk--treffer {
	font-weight: 600;
}
.tc-wwikp-geraet-name {
	font-weight: 500;
}

/* Folgeauftrag (24.09.2026, "Ja/Nein-Merkmale der Einrichtung besser
   darstellen"): eine Zeile je Merkmal statt kommagetrennter Fliesstext -
   Bedeutung ueber Text ("Ja"/"Nein") UND Badge-Farbe, nie nur Farbe allein
   (Abschnitt 7: "darf nicht ausschliesslich ueber Farbe vermittelt
   werden"). Wiederverwendet in Ticket-Widget UND Einrichtungs-Detailseite. */
.tc-wwikp-merkmale {
	list-style: none;
	margin: 0 0 8px 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: 0.88rem;
}
.tc-wwikp-merkmale li {
	display: flex;
	align-items: center;
	gap: 8px;
}

/* Folgeauftrag (24.09.2026, "Einrichtungen in der Koop-Detailansicht als
   Container darstellen"): responsives Kartenraster statt Tabellen-/
   Textliste - jede Einrichtung ein eigener, klar abgegrenzter
   .tc-form-card-Container (dieselbe Kartenoptik wie ueberall sonst im
   Projekt), Nummernkreis fett hervorgehoben (fachlich am wichtigsten). */
.tc-kopartner-einrichtungen-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
	gap: var(--spacing-md);
}
.tc-kopartner-einrichtung-karte {
	margin-bottom: 0;
	/* Bugfix (24.09.2026, Fehlerrunde): .tc-admin-hub-titel a::before nutzt
	   projektweit einen "gestreckten Link" (position:absolute;inset:0) fuer
	   die ganze Karte klickbar zu machen - das erfordert zwingend einen
	   positionierten Vorfahren, sonst ballooniert der unsichtbare Link ueber
	   die gesamte Seite und faengt fremde Klicks ab (siehe gleiches Problem
	   in administration/datenbankpflege/index.php). Hier fehlte position:relative. */
	position: relative;
}

/* Einrichtungen: Mehrfachauswahl der Geraetetypen des Partners (Folgeauftrag
   24.09.2026 Abschnitt 19) - einfache Checkbox-Liste statt Tabelle, damit
   sie sich in schmale wie breite Formularspalten einfuegt. */
.tc-kp-geraete-checkboxen {
	display: flex;
	flex-direction: column;
	gap: 6px;
	margin: 4px 0;
}
.tc-kp-geraete-checkboxen label {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 0.92rem;
}

/* ==========================================================================
   Kooperationspartner als Informationsakte (28.09.2026, Auftrag "UX-
   Neugestaltung der Kooperationspartner-Verwaltung und Leseansichten").
   Gemeinsam fuer interne Leseansicht (kooperationspartner/detail.php,
   einrichtung_detail.php), externe Leseansicht (external/...) und die
   Bearbeitungsmasken (administration/kooperationspartner/...). Baut
   ausschliesslich auf bestehenden Bausteinen auf: .tc-detail-card/
   .tc-detail-section-head (Container), .tc-switch (Ja/Nein), .tc-modal
   (Pop-ups), .tc-admin-status-badge (Status), .tc-history-search-wrap
   (Suche), .tc-detail-contact-action (Sprungnavigation).
   ========================================================================== */

/* -- Kopf ("Akte") ---------------------------------------------------- */
.tc-kp-akte-kopf {
	display: flex;
	align-items: center;
	gap: var(--spacing-md);
	flex-wrap: wrap;
	margin-bottom: var(--spacing-md);
}
.tc-kp-akte-logo {
	width: 72px;
	height: 72px;
	object-fit: contain;
	flex: 0 0 auto;
	background-color: #FFF;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 4px;
	box-sizing: border-box;
}
.tc-kp-akte-titelblock {
	flex: 1 1 280px;
	min-width: 0;
}
.tc-kp-akte-titel {
	margin: 0;
	font-size: 1.35rem;
	font-weight: 700;
	line-height: 1.25;
	color: var(--color-text);
	overflow-wrap: anywhere;
}
.tc-kp-akte-oberzeile {
	margin: 0 0 2px;
	font-size: .85rem;
	color: var(--color-text-muted);
}
.tc-kp-akte-zusatz {
	margin: 2px 0 0;
	color: var(--color-text-muted);
}
.tc-kp-akte-fakten {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 14px;
	margin-top: 8px;
	font-size: .88rem;
	color: var(--color-text-muted);
}
.tc-kp-akte-fakten strong {
	color: var(--color-text);
	font-weight: 600;
}
.tc-kp-akte-aktionen {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
	align-items: center;
}

/* -- Suche + Sprungnavigation ---------------------------------------- */
.tc-kp-suchleiste {
	display: flex;
	flex-direction: column;
	gap: 8px;
	margin-bottom: var(--spacing-md);
}
.tc-kp-suchleiste .tc-history-search-wrap {
	flex: 0 0 auto;
	max-width: 460px;
}
.tc-kp-suchleiste .tc-history-search {
	width: 100%;
}
.tc-kp-suchleiste-status {
	font-size: .82rem;
	color: var(--color-text-muted);
	min-height: 1.2em;
	margin: 0;
}
.tc-kp-nav-chip[aria-disabled="true"] {
	opacity: .4;
	pointer-events: none;
}
.tc-kp-nav-zahl {
	margin-left: 2px;
	font-size: .75rem;
	color: var(--color-text-muted);
}
mark.tc-kp-treffer {
	background-color: #FFE58A;
	color: inherit;
	border-radius: 2px;
	padding: 0 1px;
}

/* -- Einklappbare Themencontainer (natives <details>) ---------------- */
details.tc-kp-container > summary {
	list-style: none;
	cursor: pointer;
}
details.tc-kp-container > summary::-webkit-details-marker { display: none; }
details.tc-kp-container > summary::marker { content: ""; }
details.tc-kp-container:not([open]) > summary {
	margin-bottom: -20px;
	border-bottom: 0;
}
details.tc-kp-container > summary:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: -2px;
}
.tc-kp-container-kopf-rechts {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	color: var(--color-text-muted);
	font-size: .82rem;
	font-weight: 400;
}
.tc-kp-container-kopf-rechts .tc-icon-chevron {
	transition: transform .15s ease;
}
details.tc-kp-container[open] > summary .tc-kp-container-kopf-rechts .tc-icon-chevron {
	transform: rotate(90deg);
}
.tc-kp-container--wichtig {
	border-left: 4px solid var(--color-danger);
}
.tc-kp-intern-marke {
	display: inline-block;
	margin-left: 6px;
	padding: 0 6px;
	font-size: .7rem;
	font-weight: 600;
	line-height: 1.6;
	border-radius: 999px;
	background-color: var(--color-warning-subtle);
	color: #6B4E00;
	vertical-align: middle;
}
.tc-kp-untertitel {
	margin: var(--spacing-md) 0 6px;
	font-size: .78rem;
	font-weight: 700;
	letter-spacing: .02em;
	text-transform: uppercase;
	color: var(--color-text-muted);
}
.tc-kp-untertitel:first-child { margin-top: 0; }
.tc-kp-fliesstext {
	margin: 0;
	white-space: pre-line;
	overflow-wrap: anywhere;
}

/* -- Informations-Felder (Detailansicht statt Formularoptik) ---------- */
.tc-kp-felder {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	gap: 12px 24px;
	margin: 0;
}
.tc-kp-feld {
	margin: 0;
	min-width: 0;
}
.tc-kp-feld--breit {
	grid-column: 1 / -1;
}
.tc-kp-feld dt {
	font-size: .76rem;
	color: var(--color-text-muted);
	margin: 0 0 2px;
}
.tc-kp-feld dd {
	margin: 0;
	font-weight: 500;
	overflow-wrap: anywhere;
}
.tc-kp-leer {
	color: var(--color-text-muted);
	font-weight: 400;
}

/* -- Karten (Ansprechpartner, Geraete, Einrichtungen, Adressen) ------- */
.tc-kp-karten {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
	gap: 12px;
}
.tc-kp-karte {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
	padding: 10px 12px;
	min-width: 0;
	transition: border-color .12s ease, box-shadow .12s ease;
}
.tc-kp-karte:hover {
	border-color: var(--color-border-strong);
	box-shadow: var(--shadow-small);
}
.tc-kp-karte-kopf {
	display: flex;
	align-items: flex-start;
	gap: 10px;
}
.tc-kp-karte-kopf > div { min-width: 0; flex: 1 1 auto; }
.tc-kp-karte-rolle {
	margin: 0;
	font-size: .72rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .03em;
	color: var(--color-primary);
}
.tc-kp-karte-titel {
	margin: 0;
	font-weight: 600;
	overflow-wrap: anywhere;
}
.tc-kp-karte-sub {
	margin: 0;
	font-size: .86rem;
	color: var(--color-text-muted);
	overflow-wrap: anywhere;
}
.tc-kp-kontakt {
	list-style: none;
	margin: 6px 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
	font-size: .88rem;
}
.tc-kp-kontakt li {
	display: flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
	overflow-wrap: anywhere;
}
.tc-kp-kontakt .tc-icon {
	flex: 0 0 auto;
	color: var(--color-text-muted);
}
.tc-kp-kontakt-typ {
	font-size: .72rem;
	color: var(--color-text-muted);
}

/* Nummernkreise besonders gut lesbar */
.tc-kp-nk {
	display: inline-flex;
	align-items: baseline;
	gap: 6px;
	padding: 3px 10px;
	border-radius: var(--radius-small);
	background-color: color-mix(in srgb, var(--color-primary) 8%, var(--color-surface));
	border: 1px solid color-mix(in srgb, var(--color-primary) 25%, var(--color-border));
	font-variant-numeric: tabular-nums;
	font-weight: 700;
	color: var(--color-primary);
	white-space: nowrap;
}
.tc-kp-nk-bez {
	font-weight: 400;
	font-size: .82rem;
	color: var(--color-text-muted);
	white-space: normal;
}
.tc-kp-nk-gruppe {
	display: inline-flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px 8px;
	min-width: 0;
}
.tc-kp-nk-liste {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.tc-kp-nk-tabelle {
	width: 100%;
	border-collapse: collapse;
}
.tc-kp-nk-tabelle td {
	padding: 5px 10px 5px 0;
	border-bottom: 1px solid var(--color-border);
	vertical-align: middle;
}
.tc-kp-nk-tabelle tr:last-child td { border-bottom: 0; }

/* Merkmale einer Einrichtung (nur aktive) */
.tc-kp-merkmale {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	list-style: none;
	margin: 6px 0 0;
	padding: 0;
}
.tc-kp-merkmal {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 1px 8px;
	font-size: .78rem;
	border-radius: 999px;
	background-color: color-mix(in srgb, var(--color-success) 10%, var(--color-surface));
	color: var(--color-success);
	border: 1px solid color-mix(in srgb, var(--color-success) 30%, var(--color-border));
}
.tc-kp-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	margin-top: 6px;
}
.tc-kp-chip {
	display: inline-block;
	padding: 1px 8px;
	font-size: .78rem;
	border-radius: 999px;
	background-color: color-mix(in srgb, var(--color-border) 35%, var(--color-surface));
	border: 1px solid var(--color-border);
	color: var(--color-text);
}
.tc-kp-einrichtung-bild {
	width: 48px;
	height: 48px;
	object-fit: contain;
	flex: 0 0 auto;
	background-color: #FFF;
	border-radius: var(--radius-small);
	border: 1px solid var(--color-border);
}
details.tc-kp-mehr {
	margin-top: 8px;
	font-size: .88rem;
}
details.tc-kp-mehr > summary {
	cursor: pointer;
	color: var(--color-primary);
	font-weight: 600;
}
details.tc-kp-mehr > div {
	margin-top: 6px;
}
details.tc-kp-mehr > div > p { margin: 0 0 6px; }

/* Hinweise - weiterhin einzeln aufklappbar */
details.tc-kp-hinweis {
	border: 1px solid var(--color-border);
	border-left: 4px solid var(--color-success);
	border-radius: var(--radius-small);
	padding: 6px 10px;
	background-color: var(--color-surface);
}
details.tc-kp-hinweis + details.tc-kp-hinweis { margin-top: 6px; }
details.tc-kp-hinweis--wichtig {
	border-left-color: var(--color-danger);
	background-color: var(--color-danger-subtle);
}
details.tc-kp-hinweis > summary {
	cursor: pointer;
	font-weight: 600;
	overflow-wrap: anywhere;
}
details.tc-kp-hinweis > div {
	margin-top: 4px;
}
.tc-kp-hinweis-meta {
	font-size: .78rem;
	color: var(--color-text-muted);
	font-weight: 400;
}

/* -- Bearbeitungsmaske: kompaktes, zweispaltiges Raster --------------- */
.tc-kp-formgrid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 10px 18px;
	align-items: start;
}
.tc-kp-formgrid + .tc-kp-formgrid { margin-top: 10px; }
.tc-kp-formgrid--3 {
	grid-template-columns: repeat(3, minmax(0, 1fr));
}
.tc-kp-formfeld {
	display: flex;
	flex-direction: column;
	gap: 3px;
	min-width: 0;
}
.tc-kp-formfeld--breit {
	grid-column: 1 / -1;
}
.tc-kp-formfeld > label,
.tc-kp-formfeld > .tc-kp-formfeld-label {
	font-size: .8rem;
	font-weight: 600;
	color: var(--color-text-muted);
}
.tc-kp-formfeld .EingabeFeld,
.tc-kp-formfeld select,
.tc-kp-formfeld textarea {
	width: 100%;
	box-sizing: border-box;
	max-width: none;
}
.tc-kp-formfeld-reihe {
	display: flex;
	gap: 8px;
	min-width: 0;
}
.tc-kp-formfeld-reihe > * { min-width: 0; }
.tc-kp-formfeld-reihe > .tc-kp-schmal { flex: 0 0 110px; }
.tc-kp-formfeld-reihe > .tc-kp-flex { flex: 1 1 auto; }
@media (max-width: 760px) {
	.tc-kp-formgrid,
	.tc-kp-formgrid--3 {
		grid-template-columns: minmax(0, 1fr);
	}
}
.tc-kp-hinweistext {
	margin: 0 0 8px;
	font-size: .84rem;
	color: var(--color-text-muted);
}
.tc-kp-adressblock {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 10px 12px;
	min-width: 0;
}
.tc-kp-adressblock-titel {
	margin: 0 0 8px;
	font-size: .8rem;
	font-weight: 700;
	color: var(--color-text);
}

/* Ja/Nein als kompakte Schalter (bestehender .tc-switch) - neutrale
   "Ja"-Farbe statt des roten "Entwerten"-Zustands. */
.tc-switch--ja .tc-switch-input:checked + .tc-switch-schieber {
	background-color: var(--color-success);
}
.tc-kp-schalter-liste {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
	gap: 10px 18px;
}
.tc-kp-schalter {
	display: flex;
	align-items: center;
	gap: 10px;
	cursor: pointer;
	font-size: .92rem;
	min-width: 0;
}

/* Kompakte Eintragskarten mit Aendern/Entfernen (Bearbeitung ueber Pop-up) */
.tc-kp-eintraege {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
	gap: 10px;
	margin-bottom: 8px;
}
.tc-kp-eintraege--liste {
	grid-template-columns: minmax(0, 1fr);
	gap: 6px;
}
.tc-kp-eintrag {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	gap: 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 8px 10px;
	background-color: var(--color-surface);
	min-width: 0;
}
.tc-kp-eintrag:hover { border-color: var(--color-border-strong); }
.tc-kp-eintraege--liste .tc-kp-eintrag {
	flex-direction: row;
	align-items: center;
}
.tc-kp-eintrag-inhalt { min-width: 0; }
.tc-kp-eintrag-inhalt p { margin: 0; overflow-wrap: anywhere; }
.tc-kp-eintrag-aktionen {
	display: flex;
	gap: 12px;
	flex-wrap: wrap;
	flex: 0 0 auto;
}
.tc-kp-leer-hinweis {
	margin: 0 0 8px;
	font-size: .88rem;
	font-style: italic;
	color: var(--color-text-muted);
}
.tc-kp-bildzeile {
	display: flex;
	align-items: center;
	gap: 14px;
	flex-wrap: wrap;
}
.tc-kp-bildzeile-vorschau {
	width: 72px;
	height: 72px;
	object-fit: contain;
	background-color: #FFF;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	padding: 4px;
	box-sizing: border-box;
}
.tc-kp-bildzeile-leer {
	width: 72px;
	height: 72px;
	display: flex;
	align-items: center;
	justify-content: center;
	border: 1px dashed var(--color-border-strong);
	border-radius: var(--radius-medium);
	font-size: .75rem;
	color: var(--color-text-muted);
	text-align: center;
	box-sizing: border-box;
}
.tc-kp-bildzeile-aktionen {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.tc-kp-bildzeile-status {
	font-size: .82rem;
	color: var(--color-text-muted);
}
.tc-kp-bildzeile-status--aenderung {
	color: #8A5A00;
	font-weight: 600;
}
.tc-kp-radios-versteckt {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
}
.tc-kp-speicherleiste {
	position: sticky;
	bottom: 0;
	z-index: 5;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
	margin-top: var(--spacing-md);
	padding: 10px 14px;
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	box-shadow: 0 -2px 8px rgba(0, 0, 0, .06);
}
.tc-kp-speicherleiste-hinweis {
	font-size: .84rem;
	color: var(--color-text-muted);
}
.tc-kp-speicherleiste-hinweis--geaendert {
	color: #8A5A00;
	font-weight: 600;
}
/* [hidden] gegen display-setzende Button-Klassen absichern (sonst bliebe
   z. B. "Rückgängig" trotz hidden sichtbar - bekannte Spezifitaetsfalle). */
.tc-kopartner-page [hidden] {
	display: none !important;
}

/* Nutzerwunsch (28.09.2026): Bereichsueberschriften der Akte/Bearbeitung
   deutlich erkennbar und per Schattierung voneinander getrennt. */
.tc-kopartner-page .tc-kp-container {
	border: 1px solid var(--color-border);
	box-shadow: 0 2px 6px rgba(20, 20, 30, 0.08), 0 1px 2px rgba(20, 20, 30, 0.06);
	overflow: hidden;
	margin-bottom: var(--spacing-md);
}
.tc-kopartner-page .tc-kp-container > summary.tc-detail-section-head {
	background: linear-gradient(180deg,
		color-mix(in srgb, var(--color-primary) 11%, var(--color-surface)) 0%,
		color-mix(in srgb, var(--color-primary) 6%, var(--color-surface)) 100%);
	border-bottom: 1px solid color-mix(in srgb, var(--color-primary) 28%, var(--color-border));
	box-shadow: 0 2px 4px -2px rgba(20, 20, 30, 0.14);
}
.tc-kopartner-page .tc-kp-container > summary.tc-detail-section-head:hover {
	background: color-mix(in srgb, var(--color-primary) 14%, var(--color-surface));
}
.tc-kopartner-page .tc-kp-container > summary .tc-detail-section-title {
	color: var(--color-primary);
	font-weight: 700;
}
.tc-kopartner-page .tc-kp-container--wichtig > summary.tc-detail-section-head {
	background: linear-gradient(180deg,
		color-mix(in srgb, var(--color-danger) 14%, var(--color-surface)) 0%,
		color-mix(in srgb, var(--color-danger) 7%, var(--color-surface)) 100%);
	border-bottom-color: color-mix(in srgb, var(--color-danger) 30%, var(--color-border));
}
.tc-kopartner-page .tc-kp-container--wichtig > summary .tc-detail-section-title {
	color: var(--color-danger);
}
.tc-kp-speicherleiste a.button,
.tc-kp-speicherleiste input.button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 38px;
	box-sizing: border-box;
	text-decoration: none;
}

/* ==========================================================================
   Zentrales Kartenmodul (28.09.2026, karte/index.php + js/tc-karte.js).
   Markerarten primaer ueber Symbol unterschieden (Ticket/Partner/
   Einrichtung/Geraet), Farbe nur als zusaetzliches Merkmal.
   ========================================================================== */
.tc-karte-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	text-decoration: none;
	color: inherit;
}
.tc-karte-button--aus {
	opacity: .45;
	cursor: not-allowed;
}
.tc-karte-titelzeile {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 6px 16px;
	margin: 4px 0 8px;
}
.tc-karte-titel {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
	font-size: 1.3rem;
}
.tc-karte-status {
	margin: 0;
	font-size: .9rem;
	color: var(--color-text-muted);
}
.tc-karte-werkzeuge,
.tc-karte-adressarten {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px 12px;
	margin-bottom: 8px;
}
.tc-karte-adressarten {
	padding: 8px 10px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
}
.tc-karte-werkzeug-label {
	font-size: .82rem;
	font-weight: 600;
	color: var(--color-text-muted);
}
.tc-karte-suche {
	flex: 0 1 320px;
	max-width: 320px;
}
.tc-karte-check {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: .88rem;
	cursor: pointer;
}
.tc-karte-select {
	width: auto;
	max-width: 240px;
}
.tc-karte-typen {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
}
.tc-karte-typ {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 3px 10px;
	border: 1px solid var(--color-border);
	border-radius: 999px;
	background-color: var(--color-surface);
	font-size: .82rem;
	min-height: 0;
	color: var(--color-text);
	cursor: pointer;
}
.tc-karte-typ:hover {
	background-color: var(--color-bg, #f4f6f9);
}
.tc-karte-typ[aria-pressed="false"] {
	opacity: .45;
	text-decoration: line-through;
}
.tc-karte-typ-zahl {
	font-size: .75rem;
	color: var(--color-text-muted);
}
.tc-karte-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
}
.tc-karte-icon .tc-icon {
	width: 16px;
	height: 16px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.5;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.tc-karte-fortschritt {
	height: 4px;
	margin-bottom: 8px;
	background-color: var(--color-border);
	border-radius: 2px;
	overflow: hidden;
}
.tc-karte-fortschritt span {
	display: block;
	height: 100%;
	width: 0;
	background-color: var(--color-primary);
	transition: width .3s ease;
}
.tc-karte-layout {
	display: grid;
	grid-template-columns: 300px minmax(0, 1fr);
	gap: 10px;
	height: 70vh;
	min-height: 460px;
}
.tc-karte-layout--ohne-liste {
	grid-template-columns: minmax(0, 1fr);
}
.tc-karte-layout--ohne-liste .tc-karte-liste {
	display: none;
}
.tc-karte-liste {
	display: flex;
	flex-direction: column;
	min-height: 0;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	background-color: var(--color-surface);
}
.tc-karte-liste-kopf {
	margin: 0;
	padding: 8px 10px;
	font-size: .82rem;
	font-weight: 600;
	border-bottom: 1px solid var(--color-border);
	color: var(--color-text-muted);
}
.tc-karte-liste-eintraege {
	list-style: none;
	margin: 0;
	padding: 0;
	overflow-y: auto;
	flex: 1 1 auto;
}
.tc-karte-eintrag + .tc-karte-eintrag {
	border-top: 1px solid var(--color-border);
}
.tc-karte-eintrag-btn {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	width: 100%;
	padding: 7px 10px;
	border: 0;
	background: none;
	text-align: left;
	font: inherit;
	cursor: pointer;
	color: inherit;
}
.tc-karte-eintrag-btn:hover,
.tc-karte-eintrag--aktiv .tc-karte-eintrag-btn {
	background-color: color-mix(in srgb, var(--color-primary) 10%, var(--color-surface));
}
.tc-karte-eintrag--ohne .tc-karte-eintrag-btn {
	opacity: .6;
	cursor: default;
}
.tc-karte-eintrag-text {
	display: flex;
	flex-direction: column;
	min-width: 0;
}
.tc-karte-eintrag-titel {
	font-weight: 600;
	font-size: .88rem;
	overflow-wrap: anywhere;
}
.tc-karte-eintrag-sub {
	font-size: .78rem;
	color: var(--color-text-muted);
	overflow-wrap: anywhere;
}
.tc-karte-map {
	position: relative;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium);
	overflow: hidden;
	background-color: #E8EAED;
	min-height: 0;
}
.tc-karte-map-laden {
	margin: 0;
	padding: 20px;
	color: var(--color-text-muted);
}
@media (max-width: 900px) {
	.tc-karte-layout {
		grid-template-columns: minmax(0, 1fr);
		grid-template-rows: 40vh minmax(0, 1fr);
		height: auto;
	}
	.tc-karte-map { min-height: 60vh; }
}
/* Marker (Advanced Marker, HTML-Inhalt) - Symbol je Objekttyp */
.tc-karte-pin {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	border-radius: 50% 50% 50% 0;
	transform: rotate(-45deg);
	background-color: var(--color-primary);
	border: 2px solid #FFF;
	box-shadow: 0 2px 4px rgba(0, 0, 0, .35);
	color: #FFF;
}
.tc-karte-pin .tc-karte-icon { transform: rotate(45deg); }
.tc-karte-pin--ticket { background-color: #2F4592; }
.tc-karte-pin--partner { background-color: #1E7B34; }
.tc-karte-pin--einrichtung { background-color: #8A4F9E; }
.tc-karte-pin--geraet { background-color: #B8560B; }
.tc-karte-pin--gemischt { background-color: #4A5160; }
.tc-karte-pin--ungenau { border-style: dashed; }
.tc-karte-pin-zahl {
	position: absolute;
	top: -8px;
	right: -8px;
	transform: rotate(45deg);
	min-width: 18px;
	height: 18px;
	padding: 0 4px;
	border-radius: 999px;
	background-color: #FFF;
	color: #222;
	font-size: 11px;
	font-weight: 700;
	line-height: 18px;
	text-align: center;
	box-shadow: 0 1px 2px rgba(0, 0, 0, .3);
}
/* Pop-up */
.tc-karte-info {
	max-width: 320px;
	max-height: 320px;
	overflow-y: auto;
	font-size: 13px;
	line-height: 1.4;
}
.tc-karte-info p { margin: 0; }
.tc-karte-info-kopf {
	font-weight: 700;
	margin-bottom: 6px !important;
}
.tc-karte-info-gruppe {
	display: flex;
	align-items: center;
	gap: 5px;
	margin-top: 8px !important;
	font-size: 11px;
	font-weight: 700;
	text-transform: uppercase;
	color: #5B6270;
}
.tc-karte-info-eintrag {
	padding: 6px 0;
	border-bottom: 1px solid #E3E5E8;
}
.tc-karte-info-eintrag:last-child { border-bottom: 0; }
.tc-karte-info-titel {
	display: flex;
	align-items: center;
	gap: 5px;
	font-weight: 600;
}
.tc-karte-info-label { color: #5B6270; }
.tc-karte-info-link {
	display: inline-block;
	margin-top: 4px;
	font-weight: 600;
}
.tc-karte-info-hinweis {
	margin-top: 6px !important;
	font-size: 12px;
	color: #8A5A00;
}
.tc-karte-fehlliste { margin-top: 10px; }
.tc-karte-fehlliste summary { cursor: pointer; font-weight: 600; }
.tc-karte-fehlliste ul { margin: 8px 0 0; padding-left: 20px; font-size: .88rem; }
.tc-karte-warnung p { margin: 0 0 8px; }
/* Gemeinsame Adressaktionen (Koop/Einrichtungen): kompakte Zeile mit
   Umbruch statt der vollbreiten Spalte des Ticket-Kontaktbereichs -
   in schmalen Karten sonst Ueberlauf ueber den Kartenrand. */
.tc-detail-contact-tools.tc-adress-aktionen {
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	gap: 6px;
	margin-top: 6px;
}
.tc-detail-contact-tools.tc-adress-aktionen .tc-detail-contact-copy-wrap { width: auto; }
.tc-detail-contact-tools.tc-adress-aktionen .tc-detail-contact-action {
	width: auto;
	padding: 4px 10px;
	font-size: .8rem;
}
.tc-karte-untertitel {
	font-size: .9rem;
	font-weight: 400;
	color: var(--color-text-muted);
}

/* ==========================================================================
   Eingehende Ticket-API (29.09.2026) - Administration + Ticketherkunft
   ========================================================================== */
.tc-detail-meta-herkunft {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 13px;
	font-weight: 600;
	color: var(--color-primary-dark);
}
.tc-detail-meta-herkunft .tc-icon { width: 13px; height: 13px; flex-shrink: 0; }
.tc-api-checkliste { list-style: none; margin: 10px 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.tc-api-checkliste li { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: .92rem; }
.tc-api-checkliste li.ok .tc-icon { color: #15803d; }
.tc-api-checkliste li.offen .tc-icon { color: #b45309; }
.tc-api-ips { margin: 8px 0 12px; }
.tc-api-ips summary { cursor: pointer; font-weight: 600; }
.tc-api-kopfaktionen { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin: 10px 0; }
.tc-api-profile { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; }
.tc-api-profil {
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small);
	background-color: var(--color-surface);
	padding: 12px;
	box-shadow: 0 1px 2px rgba(15, 23, 42, .06);
}
.tc-api-profil--fehler { border-color: #dc2626; box-shadow: 0 0 0 1px rgba(220, 38, 38, .25); }
.tc-api-profil--archiv { opacity: .6; }
.tc-api-profil-kopf { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.tc-api-profil-name { margin: 0; font-weight: 700; font-size: 1rem; flex: 1 1 auto; }
.tc-api-badge-fehler { background-color: #fee2e2; color: #991b1b; border-color: #fecaca; }
.tc-api-profil-daten { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 12px; margin: 10px 0; font-size: .86rem; }
.tc-api-profil-daten div { min-width: 0; }
.tc-api-profil-daten dt { color: var(--color-text-muted); font-size: .78rem; }
.tc-api-profil-daten dd { margin: 0; overflow-wrap: anywhere; }
.tc-api-profil-daten-breit { grid-column: 1 / -1; }
.tc-api-probleme { margin: 6px 0; padding-left: 18px; color: #991b1b; font-size: .86rem; }
.tc-api-profil-aktionen { display: flex; gap: 4px 10px; flex-wrap: wrap; align-items: center; border-top: 1px solid var(--color-border); padding-top: 8px; }
.tc-api-feldtabelle { border-collapse: collapse; font-size: .88rem; }
.tc-api-feldtabelle th { border-bottom: 2px solid var(--color-border); color: var(--color-text-muted); font-weight: 600; }
.tc-api-feldtabelle td { border-bottom: 1px solid var(--color-border); vertical-align: top; }
.tc-api-feldgruppe td { background-color: var(--color-background); font-weight: 700; padding-top: 10px; }
.tc-api-feldtabelle select.EingabeFeld, .tc-api-feldtabelle input.EingabeFeld { max-width: 100%; min-width: 0; }
.tc-api-key-prefix { color: var(--color-text-muted); font-family: monospace; font-size: .82rem; }
.tc-api-key-feld { width: 170px; font-family: monospace; }
.tc-api-festwert--aus { opacity: .45; }
.tc-api-mehrfach { display: block; font-weight: normal; }
.tc-api-pflicht { color: #dc2626; font-weight: 700; }
.tc-api-doku-dl { display: grid; grid-template-columns: 170px 1fr; gap: 6px 14px; margin: 0; }
.tc-api-doku-dl dt { font-weight: 600; color: var(--color-text-muted); }
.tc-api-doku-dl dd { margin: 0; overflow-wrap: anywhere; }
.tc-api-werte { margin: 4px 0 0; padding-left: 18px; }
.tc-api-beispiel { margin-bottom: 14px; }
.tc-api-beispiel-kopf { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 4px; }
.tc-api-code {
	background-color: #0f172a;
	color: #e2e8f0;
	border-radius: var(--radius-small);
	padding: 10px 12px;
	font-family: Consolas, "Courier New", monospace;
	font-size: .82rem;
	white-space: pre-wrap;
	overflow-wrap: anywhere;
	margin: 0;
}
textarea.tc-api-code { width: 100%; box-sizing: border-box; }
.tc-api-testwarnung { font-size: .9rem; }
.tc-api-roh { margin: 10px 0; }
.tc-api-roh summary { cursor: pointer; font-weight: 600; }
.tc-api-filter { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: flex-end; }
.tc-api-filter label { display: flex; flex-direction: column; gap: 2px; font-size: .82rem; font-weight: 600; color: var(--color-text-muted); }
.tc-api-tabelle-scroll { overflow-x: auto; }
.tc-api-protokoll td { white-space: nowrap; }
.tc-api-protokoll td.tc-api-meldung { white-space: normal; min-width: 220px; }
@media (max-width: 700px) {
	.tc-api-doku-dl { grid-template-columns: 1fr; }
	.tc-api-profil-daten { grid-template-columns: 1fr; }
}
@media print {
	.tc-api-nicht-drucken, .tc-api-kopfaktionen { display: none !important; }
	.tc-api-code { background: #fff; color: #000; border: 1px solid #999; }
}

/* ==========================================================================
   Hell/Dunkel-Schalter im Header (29.09.2026)
   ========================================================================== */
button.app-header-theme {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	min-height: 0;
	padding: 0;
	border-radius: 999px;
	background-color: var(--color-background);
	border: 1px solid var(--color-border);
	color: var(--color-text-muted);
	cursor: pointer;
	transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
button.app-header-theme:hover,
button.app-header-theme:focus-visible {
	background-color: var(--color-surface);
	border-color: var(--color-border-strong);
	color: var(--color-text);
}
button.app-header-theme svg { fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
button.app-header-theme .app-header-theme-mond { fill: currentColor; stroke: none; }
button.app-header-theme .app-header-theme-sonne { display: none; }
:root[data-theme="dunkel"] button.app-header-theme .app-header-theme-mond { display: none; }
:root[data-theme="dunkel"] button.app-header-theme .app-header-theme-sonne { display: inline; }

/* Mein Profil -> Meine Ansicht & Darstellung (29.09.2026) */
.tc-meine-ansicht fieldset { border: 0; padding: 0; margin: 0 0 6px; display: flex; flex-wrap: wrap; gap: 6px 18px; }
.tc-meine-ansicht legend { font-weight: 600; margin-bottom: 6px; padding: 0; }
.tc-meine-ansicht fieldset label { display: inline-flex; align-items: center; gap: 6px; font-weight: normal; cursor: pointer; }
.tc-meine-ansicht-aktionen { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.tc-meine-ansicht-tabelle { border-collapse: collapse; font-size: .9rem; margin-top: 6px; }
.tc-meine-ansicht-tabelle th { border-bottom: 2px solid var(--color-border); color: var(--color-text-muted); font-weight: 600; }
.tc-meine-ansicht-tabelle td { border-bottom: 1px solid var(--color-border); }

/* ==========================================================================
   Dunkle Darstellung - Korrekturen (29.09.2026)
   Die Oberflaeche arbeitet ueberwiegend mit den Design-Tokens aus :root
   (siehe dunkle Token-Werte am Dateianfang). Hier stehen nur die wenigen
   Stellen, die feste helle Farben verwenden: einzelne Regeln, alte
   bgcolor-Attribute aus den Dreamweaver-Vorlagen und Inline-Styles mit
   weissem Hintergrund. Statusfarben (Prioritaet/Eskalation/Parken/Erfolg)
   behalten bewusst ihre Bedeutung. Druckansichten, E-Mails und die externe
   Ansicht bleiben hell (kein Theme-Bootstrap dort).
   ========================================================================== */
:root[data-theme="dunkel"] body { background-color: var(--color-background); color: var(--color-text); }
:root[data-theme="dunkel"] a:not([class]) { color: var(--color-primary-dark); }

/* Alte bgcolor-Attribute (Tabellenvorlagen) */
:root[data-theme="dunkel"] td[bgcolor="#FFFFFF" i], :root[data-theme="dunkel"] tr[bgcolor="#FFFFFF" i], :root[data-theme="dunkel"] table[bgcolor="#FFFFFF" i] { background-color: var(--color-surface) !important; }
:root[data-theme="dunkel"] td[bgcolor="#E9E9E9" i], :root[data-theme="dunkel"] tr[bgcolor="#E9E9E9" i] { background-color: var(--color-background) !important; }
:root[data-theme="dunkel"] td[bgcolor="#FFFF99" i], :root[data-theme="dunkel"] tr[bgcolor="#FFFF99" i] { background-color: var(--color-warning-subtle) !important; color: var(--color-text); }
:root[data-theme="dunkel"] td[bgcolor="#FFCC99" i], :root[data-theme="dunkel"] tr[bgcolor="#FFCC99" i] { background-color: #3A2A18 !important; color: var(--color-text); }
:root[data-theme="dunkel"] td[bgcolor="#99CCFF" i], :root[data-theme="dunkel"] tr[bgcolor="#99CCFF" i] { background-color: var(--color-park-subtle) !important; color: var(--color-text); }
:root[data-theme="dunkel"] td[bgcolor="#FFFF00" i], :root[data-theme="dunkel"] td[bgcolor="#FFCC00" i] { color: #1F2328; }

/* Inline-Styles mit fest weissem Hintergrund (kleine Buttons, Suchlisten) */
:root[data-theme="dunkel"] [style*="background:#fff" i], :root[data-theme="dunkel"] [style*="background: #fff" i],
:root[data-theme="dunkel"] [style*="background-color:#fff" i], :root[data-theme="dunkel"] [style*="background-color: #fff" i] {
	background: var(--color-surface) !important;
	color: var(--color-text);
	border-color: var(--color-border-strong) !important;
}
:root[data-theme="dunkel"] [style*="background-color:#F4F5F7" i], :root[data-theme="dunkel"] [style*="background-color: #F4F5F7" i],
:root[data-theme="dunkel"] [style*="background-color:#F4F7FF" i], :root[data-theme="dunkel"] [style*="background-color: #F4F7FF" i] { background-color: var(--color-background) !important; }
:root[data-theme="dunkel"] [style*="background-color:#FFF6DD" i], :root[data-theme="dunkel"] [style*="background-color: #FFF6DD" i] { background-color: var(--color-warning-subtle) !important; color: var(--color-warning-dark) !important; }
:root[data-theme="dunkel"] [style*="color:#1F2328" i], :root[data-theme="dunkel"] [style*="color: #1F2328" i] { color: var(--color-text) !important; }
:root[data-theme="dunkel"] [style*="color:#6B5900" i], :root[data-theme="dunkel"] [style*="color: #6B5900" i] { color: var(--color-warning-dark) !important; }

/* Einzelne Regeln mit fest heller Flaeche */
:root[data-theme="dunkel"] .app-adminleiste { background-color: var(--color-surface); }
:root[data-theme="dunkel"] .app-adminleiste a:hover { background-color: var(--color-background); }
:root[data-theme="dunkel"] .badge-verfuegbar { background-color: #1C2A45; }
:root[data-theme="dunkel"] .badge-in-arbeit { background-color: #17301F; }
:root[data-theme="dunkel"] .badge-geparkt, :root[data-theme="dunkel"] .badge-geschlossen { background-color: #262C36; }
:root[data-theme="dunkel"] .sidebar-stat-danger { background-color: var(--color-danger-subtle); }
:root[data-theme="dunkel"] .tc-task-complete-action:hover, :root[data-theme="dunkel"] .tc-task-complete-action:focus-visible { background-color: #17301F; }
:root[data-theme="dunkel"] .tc-pl-gruppe-a, :root[data-theme="dunkel"] .tc-dbpflege-punkt-details-toggle { background-color: var(--color-surface); }
:root[data-theme="dunkel"] .tc-bildeditor-buehne { background-color: var(--color-background); }
:root[data-theme="dunkel"] .tc-api-badge-fehler { background-color: var(--color-danger-subtle); color: var(--color-danger-dark); border-color: var(--color-danger); }
:root[data-theme="dunkel"] mark.tc-kp-treffer { color: #1F2328; }
:root[data-theme="dunkel"] .tc-karte-map { background-color: var(--color-background); }

/* Logos/Bilder bleiben auf hellem Grund (transparente PNGs mit dunkler
   Schrift waeren sonst unsichtbar). */
:root[data-theme="dunkel"] .tc-kp-akte-logo, :root[data-theme="dunkel"] .tc-kp-einrichtung-bild, :root[data-theme="dunkel"] .tc-kp-bildzeile-vorschau { background-color: #FFFFFF; }
.tc-meine-ansicht-verwaltung { margin-top: 10px; border-top: 1px solid var(--color-border); padding-top: 8px; }
.tc-meine-ansicht-verwaltung > summary { display: flex; align-items: center; gap: 10px; cursor: pointer; list-style: none; font-size: .88rem; color: var(--color-text-muted); padding: 4px 0; }
.tc-meine-ansicht-verwaltung > summary::-webkit-details-marker { display: none; }
.tc-meine-ansicht-verwaltung > summary::before { content: "\25B8"; font-size: .8rem; transition: transform .15s ease; }
.tc-meine-ansicht-verwaltung[open] > summary::before { transform: rotate(90deg); }
.tc-meine-ansicht-verwaltung > summary:hover { color: var(--color-text); }
.tc-meine-ansicht-zaehler { font-size: .78rem; padding: 1px 8px; border-radius: 999px; background-color: var(--color-background); border: 1px solid var(--color-border); }
.tc-meine-ansicht-verwaltung-inhalt { padding: 6px 0 2px 16px; }
.tc-meine-ansicht-verwaltung .tc-meine-ansicht-aktionen { gap: 4px 16px; margin-top: 8px; }

/* ==========================================================================
   Partnerportal - interne Ansichten (30.09.2026): Partnerkommunikation in
   der Ticket-Detailansicht (includes/pp_ticket_widget_intern.php) und die
   Verwaltungsseiten administration/kooperationspartner/partnerportal*.php /
   administration/ticketarten/partnerportal.php. Das externe Portal selbst
   nutzt css/partnerportal.css.
   ========================================================================== */
.tc-pp-intern { border-left: 4px solid var(--color-primary); }
.tc-pp-intern-hinweis { color: var(--color-text-muted); font-size: 12.5px; margin: 0 0 var(--spacing-sm); }
.tc-pp-intern-aktionen { display: flex; flex-wrap: wrap; gap: var(--spacing-sm); margin: var(--spacing-sm) 0; }
.tc-pp-inline { display: inline; margin: 0; }
.tc-pp-muted { color: var(--color-text-muted); }
.tc-pp-nowrap { white-space: nowrap; }
.tc-pp-klein { width: 170px; }
.tc-pp-badge { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 11.5px; font-weight: 600; background: var(--color-info-subtle); color: var(--color-primary-dark); white-space: nowrap; }
.tc-pp-badge--an, .tc-pp-badge--partner { background: #E7F4EA; color: var(--color-success-dark); }
.tc-pp-badge--aus { background: #EEF0F3; color: #3F4652; }
.tc-pp-badge--offen { background: var(--color-warning-subtle); color: var(--color-warning-dark); }
.tc-pp-badge--intern { background: var(--color-info-subtle); color: var(--color-primary-dark); }
/* 01.10.2026: Partnerkommunikation intern im selben Messenger-Stil wie im
   Partnerportal (css/partnerportal.css .pp-verlauf*): Blasen mit max. 88 %
   Breite, eigene Seite (hier BeWo/intern) rechtsbuendig in Blau, Gegenseite
   (Kooperationspartner) links neutral, Rueckfragen gelb mit linkem Rand.
   Farben ueber Tokens (Dunkelmodus). */
.tc-pp-verlauf { list-style: none; margin: 0 0 var(--spacing-sm); padding: 0; display: flex; flex-direction: column; gap: 10px; }
.tc-pp-verlauf-eintrag { border: 1px solid var(--color-border); border-radius: var(--radius-medium); padding: 10px 14px; background: var(--color-background); max-width: 88%; box-sizing: border-box; margin-right: auto; }
.tc-pp-verlauf-eintrag--intern, .tc-pp-verlauf-eintrag--system { margin-left: auto; margin-right: 0; background: var(--color-info-subtle); border-color: color-mix(in srgb, var(--color-primary) 25%, var(--color-info-subtle)); }
.tc-pp-typ--rueckfrage { border-left: 4px solid var(--color-warning); background: var(--color-warning-subtle); }
.tc-pp-verlauf-kopf { font-size: 12.5px; color: var(--color-text-muted); margin-bottom: 4px; }
.tc-pp-verlauf-text { overflow-wrap: anywhere; }
@media (max-width: 640px) { .tc-pp-verlauf-eintrag { max-width: 100%; } }
.tc-pp-unterabschnitt { font-weight: 600; margin: var(--spacing-md) 0 var(--spacing-xs); }
.tc-pp-dateiliste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.tc-pp-tabelle { min-width: 0 !important; width: 100%; }
.tc-pp-tabelle td { vertical-align: top; }
.tc-pp-hinweisliste { margin: 6px 0 0; padding-left: 18px; }
.tc-ppm-farben { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0; }.tc-ppm-farbe { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 6px; border: 1px solid rgba(0, 0, 0, .15); cursor: pointer; font-size: .9rem; }.tc-ppm-farbe--frei { background: var(--color-surface); }.tc-ppm-farbe input[type=color] { width: 36px; height: 24px; padding: 0; border: 1px solid var(--color-border); }.tc-ppm-vorschau { border-radius: 4px 4px 4px 12px; padding: 8px 10px; box-shadow: 0 1px 4px rgba(0, 0, 0, .12); margin-bottom: 4px; overflow-wrap: anywhere; }.tc-ppm-partnertabelle { max-height: 260px; display: block; overflow-y: auto; }.tc-pp-feld-voll { display: flex; flex-direction: column; gap: 4px; margin-top: var(--spacing-sm, 8px); }.tc-pp-textarea { width: 100%; box-sizing: border-box; }
.tc-pp-audit td.tc-pp-text { max-width: 260px; overflow-wrap: anywhere; font-size: 12px; }
.tc-pp-raster { display: grid; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); gap: var(--spacing-md); align-items: start; }
.tc-pp-kopf-status { display: flex; gap: var(--spacing-sm); align-items: center; flex-wrap: wrap; }
.tc-pp-schalter { display: block; margin: var(--spacing-sm) 0; }
.tc-pp-gruppe { font-weight: 600; margin: var(--spacing-md) 0 4px; color: var(--color-text-muted); font-size: 12.5px; text-transform: uppercase; letter-spacing: .03em; }
.tc-pp-recht { display: block; margin: 2px 0; }
.tc-pp-recht--vorbereitet { color: var(--color-text-muted); }
.tc-pp-rechteliste { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2px 16px; }
.tc-pp-felder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--spacing-sm) var(--spacing-md); margin: var(--spacing-sm) 0; }
.tc-pp-felder--breit { grid-template-columns: 1fr; }
.tc-pp-felder label { display: flex; flex-direction: column; gap: 3px; font-weight: 600; font-size: 12.5px; }
.tc-pp-felder .EingabeFeld { width: 100%; box-sizing: border-box; }
.tc-pp-aktionen { margin-top: var(--spacing-md); display: flex; gap: var(--spacing-sm); }
.tc-pp-zellaktionen { display: flex; flex-wrap: wrap; gap: 4px; }
.tc-pp-benutzerformular { border-top: 1px solid var(--color-border); margin-top: var(--spacing-md); padding-top: var(--spacing-sm); }
.tc-pp-filter { display: flex; flex-wrap: wrap; gap: var(--spacing-sm) var(--spacing-md); align-items: flex-end; }
.tc-pp-filter label { display: flex; flex-direction: column; gap: 3px; font-size: 12.5px; font-weight: 600; }
.tc-pp-veroeffentlichen { background: var(--color-info-subtle); border-radius: var(--radius-small); padding: 8px 10px; }
.tc-pp-intern-aktionen .SchnellButton { white-space: nowrap; }
.tc-pp-toolbar { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: var(--spacing-sm); margin-bottom: var(--spacing-sm); }
.tc-pp-toolbar-form { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 12px; margin: 0; }
.tc-pp-toolbar-form .tc-log-compact-feld { display: inline-flex; align-items: center; gap: 4px; }
.tc-pp-reiter { display: flex; width: 100%; margin: var(--spacing-sm) 0 var(--spacing-md); padding-bottom: var(--spacing-sm); border-bottom: 1px solid var(--color-border); }

/* Koop-Liste (01.10.2026): Partnerportal-Symbole, Kopfaktionen, Nummernkreisliste */
.tc-kp-liste-aktionen { display: flex; gap: var(--spacing-sm); flex-wrap: wrap; margin-left: auto; }
.tc-kp-portal { display: inline-flex; align-items: center; gap: 3px; font-size: 12.5px; font-weight: 600; }
.tc-kp-portal svg { width: 14px; height: 14px; }
.tc-kp-portal--aktiv { color: var(--color-success-dark); }
.tc-kp-portal--inaktiv { color: var(--color-warning-dark); }
.tc-kp-portal--ohne { color: var(--color-text-muted); }
.tc-kp-portal-zahl { margin-left: 4px; }
.tc-kp-portal-link { text-decoration: none; }
.tc-nk-druck-aktionen { display: flex; gap: var(--spacing-sm); flex-wrap: wrap; margin-bottom: var(--spacing-md); }
.tc-nk-druck-aktionen a.EingabeButton { text-decoration: none; display: inline-block; }
.tc-nk-tabelle { min-width: 0 !important; width: 100%; }
.tc-nk-tabelle td.tc-nk-nummer { font-family: ui-monospace, Consolas, monospace; white-space: nowrap; }
.tc-nk-zeile--haupt td { background: var(--color-info-subtle); border-top: 2px solid var(--color-border-strong); }
.tc-nk-zeile--unter td:nth-child(3) { padding-left: 28px; }
.tc-nk-zeile--unter td.tc-nk-nummer { color: var(--color-text-muted); padding-left: 18px; }
.tc-nk-art { display: inline-block; font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; padding: 1px 6px; border-radius: 4px; margin-right: 6px; }
.tc-nk-art--haupt { background: var(--color-primary); color: #fff; }
.tc-nk-art--unter { background: #EEF0F3; color: #3F4652; }
.tc-nk-einzug { color: var(--color-text-muted); margin-right: 4px; }
.tc-nk-klein { color: var(--color-text-muted); font-size: 12px; }
@media print {
  .tc-nk-druck-aktionen { display: none; }
  .tc-nk-zeile--haupt td { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  .tc-nk-tabelle tr { page-break-inside: avoid; }
}

/* ---------------------------------------------------------------------
   Auftrag 01.10.2026: Kooperationspartner-Parameter (Vererbung),
   Textvorlagen, Dokumente, "Oeffnen"-Menue, Partnerportal-Sichtbarkeit,
   Administration > Kooperationspartner.
   --------------------------------------------------------------------- */
.tc-kp-parameter { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--spacing-md, 14px); }
.tc-kp-parameter-gruppe { margin: 0; padding: 0; border: 0; min-width: 0; }
.tc-kp-parameter--formular .tc-kp-parameter-gruppe { border: 1px solid var(--color-border, #D7D9DD); border-radius: var(--radius-medium, 8px); padding: 10px 12px; }
.tc-kp-parameter-gruppe-titel { display: flex; align-items: center; gap: 6px; font-weight: 600; margin: 0 0 6px; font-size: .92rem; color: var(--color-text, #1F2328); }
.tc-kp-parameter-gruppe-titel svg { width: 16px; height: 16px; }
.tc-kp-parameter-liste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.tc-kp-parameter-eintrag { display: flex; align-items: center; gap: 6px; font-size: .9rem; flex-wrap: wrap; }
.tc-kp-parameter-symbol { display: inline-flex; width: 18px; height: 18px; border-radius: 50%; align-items: center; justify-content: center; flex: 0 0 18px; }
.tc-kp-parameter-symbol svg { width: 12px; height: 12px; }
.tc-kp-parameter-eintrag--an .tc-kp-parameter-symbol { background: color-mix(in srgb, var(--color-success, #1E7B34) 15%, transparent); color: var(--color-success-dark, #155A26); }
.tc-kp-parameter-eintrag--aus { color: var(--color-text-muted, #5B6270); }
.tc-kp-parameter-eintrag--aus .tc-kp-parameter-symbol { background: #EEF0F3; color: #8A909A; }
.tc-kp-parameter-herkunft { font-size: .72rem; padding: 1px 7px; border-radius: 999px; background: #EEF0F3; color: var(--color-text-muted, #5B6270); }
.tc-kp-parameter-herkunft--eigen { background: var(--color-info-subtle, #E8EEFB); color: var(--color-primary-dark, #22346E); font-weight: 600; }
.tc-kp-parameter-zeile { display: grid; grid-template-columns: minmax(130px, 40%) 1fr; gap: 8px; align-items: center; margin-bottom: 6px; font-size: .9rem; }
.tc-kp-parameter-text { display: flex; gap: 6px; flex-wrap: wrap; }
.tc-kp-parameter-text .EingabeFeld { flex: 1 1 140px; }
.tc-kp-textvorlagen { margin-top: var(--spacing-sm, 8px); }
.tc-kp-textvorlagen-kategorie { font-weight: 600; font-size: .85rem; margin: 8px 0 4px; color: var(--color-text-muted, #5B6270); }
.tc-kp-textvorlagen-liste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.tc-kp-textvorlage { display: flex; gap: 8px; align-items: flex-start; background: var(--color-background, #F6F7F9); border: 1px solid var(--color-border, #D7D9DD); border-radius: var(--radius-small, 6px); padding: 8px 10px; }
.tc-kp-textvorlage-text { flex: 1 1 auto; white-space: normal; overflow-wrap: anywhere; font-size: .9rem; }
.tc-kp-textvorlage-kopieren { flex: 0 0 auto; border: 1px solid var(--color-border, #D7D9DD); background: var(--color-surface, #fff); border-radius: var(--radius-small, 6px); padding: 4px 6px; cursor: pointer; color: var(--color-primary, #2F4A9E); }
.tc-kp-textvorlage-kopieren:hover, .tc-kp-textvorlage-kopieren:focus-visible { border-color: var(--color-primary, #2F4A9E); }
.tc-kp-textvorlage-bearbeiten { display: grid; grid-template-columns: minmax(140px, 28%) 1fr auto; gap: 8px; align-items: start; margin-bottom: 8px; }
@media (max-width: 720px) { .tc-kp-textvorlage-bearbeiten { grid-template-columns: 1fr; } .tc-kp-parameter-zeile { grid-template-columns: 1fr; } }
.tc-kp-dokumente { list-style: none; margin: 0 0 10px; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.tc-kp-dokument { display: flex; gap: 10px; align-items: flex-start; flex-wrap: wrap; border-bottom: 1px solid var(--color-border, #D7D9DD); padding-bottom: 8px; }
.tc-kp-dokument-name { flex: 1 1 220px; min-width: 0; overflow-wrap: anywhere; }
.tc-kp-dokument-aktionen { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.tc-kp-dokument-upload { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-top: 6px; }
.tc-kp-dokument-upload .EingabeFeld { max-width: 280px; }
.tc-kp-karte-aktionen { margin-top: 8px; }
.tc-oeffnen-menue { position: relative; display: inline-block; }
.tc-oeffnen-menue > summary { list-style: none; cursor: pointer; }
.tc-oeffnen-menue > summary::-webkit-details-marker { display: none; }
.tc-oeffnen-menue-pfeil { font-size: .75em; margin-left: 2px; }
.tc-oeffnen-menue-liste { position: absolute; z-index: 20; top: calc(100% + 4px); left: 0; min-width: 220px; background: var(--color-surface, #fff); border: 1px solid var(--color-border, #D7D9DD); border-radius: var(--radius-medium, 8px); box-shadow: 0 8px 24px rgba(0, 0, 0, .14); padding: 6px; display: flex; flex-direction: column; gap: 2px; }
.tc-oeffnen-menue-liste .tc-adress-aktionen { display: flex; flex-direction: column; gap: 2px; margin: 0; }
.tc-oeffnen-menue-liste .tc-detail-contact-action { display: flex; align-items: center; gap: 6px; padding: 6px 8px; border-radius: var(--radius-small, 6px); width: 100%; box-sizing: border-box; text-align: left; }
.tc-oeffnen-menue-liste .tc-detail-contact-action:hover { background: var(--color-background, #F6F7F9); }
.tc-pp-sichtbar-hinweis { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 var(--spacing-md, 14px); padding: 10px 14px; border-radius: var(--radius-medium, 8px); border: 1px solid #C7D3F2; border-left: 4px solid var(--color-primary, #2F4A9E); background: var(--color-info-subtle, #E8EEFB); color: var(--color-primary-dark, #22346E); }
.tc-pp-sichtbar-hinweis svg { width: 18px; height: 18px; }
/* 02.10.2026: Aus-/Einblenden direkt am Sichtbarkeitshinweis (rechtsbuendig, bricht bei wenig Platz um). */
.tc-pp-sichtbar-aktion { margin-left: auto; flex: 0 0 auto; }
.tc-pp-sichtbar-aktion .SchnellButton { white-space: nowrap; width: auto; }
.tc-pp-sichtbar-hinweis > span { flex: 1 1 240px; min-width: 0; }
.tc-pp-sichtbar-hinweis--aus { border-color: var(--color-border-strong, #B9BCC2); border-left-color: var(--color-text-muted, #6B7280); background: var(--color-surface, #fff); color: var(--color-text, #1F2937); }
.tc-pp-sichtbar-hinweis > .tc-pp-sichtbar-meldung { flex: 0 0 100%; font-size: .85rem; color: var(--color-success, #1E7B4A); }
.tc-pp-vorgang { border-left: 4px solid var(--color-primary, #2F4A9E); }
.tc-pp-tabelle--matrix select { min-width: 150px; max-width: 220px; }
.tc-z-logo-vorschau { max-height: 60px; max-width: 220px; border: 1px solid var(--color-border, #D7D9DD); border-radius: var(--radius-small, 6px); padding: 4px; background: #fff; }
.tc-nkf-uebernahme { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.tc-nkf-uebernahme .EingabeFeld { max-width: 220px; }

/* 01.10.2026: gemeinsame Massenbearbeitung (js/tc-massenbearbeitung.js) -
   Ticket-Widgets, Partnerportal-Konfiguration, Partnerbenutzer-Rechte. */
.tc-massen-leiste { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-sm); margin: 0 0 var(--spacing-sm); }
.tc-massen-anzahl { font-size: 13px; color: var(--color-text-muted); }
.tc-massen-schnellwahl { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 var(--spacing-sm); }
.tc-massen-felder { min-width: 0 !important; width: 100%; margin-bottom: var(--spacing-sm); }
.tc-massen-felder td { vertical-align: middle; }
.tc-massen-felder td:last-child { width: 1%; white-space: nowrap; }
.tc-massen-gruppe-titel td { font-weight: 700; background: var(--color-background); }
.tc-massen-zusammenfassung { border: 1px solid var(--color-border); border-left: 4px solid var(--color-primary); border-radius: var(--radius-medium); padding: 8px 12px; background: var(--color-info-subtle); margin: 0 0 var(--spacing-sm); font-size: 13px; }
.tc-massen-zusammenfassung ul { margin: 4px 0 0; padding-left: 18px; }
.tc-massen-zusammenfassung-kopf { margin: 0; font-weight: 700; }
.tc-massen-zusammenfassung-leer { margin: 4px 0 0; color: var(--color-text-muted); }
.tc-massen-bestaetigung { display: flex; gap: 8px; align-items: flex-start; font-size: 13px; }
.tc-modal--breit { max-width: min(900px, 96vw); width: 900px; }
/* 01.10.2026: Herkunft eines Portalvorgangs + Partnerdateien in den Zusatzdaten */
.tc-pp-herkunft { margin: -4px 0 var(--spacing-sm); font-size: 13px; color: var(--color-text-muted); display: flex; align-items: center; gap: 6px; }
.tc-zusatzdaten-datei--partner .tc-pp-badge { justify-self: start; margin: 2px 0; }
/* 01.10.2026: gemeinsame Sitzungswarnung (js/tc-sitzung-restzeit.js) */
.tc-sitzung-warnung { max-width: min(460px, 94vw); }
.tc-sitzung-warnung-text { margin: 0 0 8px; font-size: 15px; }
.tc-sitzung-warnung-fehler { margin: 8px 0 0; color: var(--color-danger-dark, #8A1C14); font-weight: 600; }
/* 01.10.2026: Administration > Systemstatus */
.tc-ss-abschnitt { margin-bottom: var(--spacing-md); }
.tc-ss-tabelle { min-width: 0 !important; width: 100%; }
.tc-ss-zweispaltig { display: grid; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); gap: var(--spacing-md); }
.tc-ss-bestand { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: var(--spacing-md); }
.tc-ss-bestand-gruppe { border: 1px solid var(--color-border); border-radius: var(--radius-medium); padding: 10px 14px; background: var(--color-background); }
.tc-ss-bestand-titel { margin: 0 0 6px; font-weight: 700; }
.tc-ss-bestand dl { margin: 0; }
.tc-ss-bestand-zeile { display: flex; justify-content: space-between; gap: 12px; padding: 3px 0; border-bottom: 1px dashed var(--color-border); font-size: 13px; }
.tc-ss-bestand-zeile:last-child { border-bottom: 0; }
.tc-ss-bestand-zeile dd { margin: 0; font-weight: 700; font-variant-numeric: tabular-nums; }

/* 01.10.2026: Ergaenzungen der gemeinsamen Rechte-Toggle-Komponente
   (.tc-rechte-*), genutzt von der internen Rechteverwaltung UND der
   Partnerportal-Konfiguration je Kooperationspartner. */
/* Tastaturfokus sichtbar (vorher kein eigener Fokus-Zustand). */
.tc-rechte-toggle input[type="checkbox"]:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
/* Deaktiviert: blass, nicht klickbar - zusaetzlich zur Farbe ueber Text
   ("noch nicht verfuegbar") und Mauszeiger erkennbar. */
.tc-rechte-toggle input[type="checkbox"]:disabled,
.tc-rechte-toggle--nicht-verfuegbar { cursor: not-allowed; }
.tc-rechte-toggle input[type="checkbox"]:disabled { opacity: .45; }
.tc-rechte-toggle--nicht-verfuegbar > span { color: var(--color-text-muted); }
.tc-rechte-toggle-hinweis {
	display: inline-block;
	margin-left: 4px;
	padding: 0 6px;
	border: 1px dashed var(--color-border-strong);
	border-radius: 8px;
	font-size: .72rem;
	color: var(--color-text-muted);
	white-space: nowrap;
}
/* Hover-Rueckmeldung wie bei anderen Bedienelementen. */
.tc-rechte-toggle:hover input[type="checkbox"]:not(:disabled) { box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent); }
/* Mehrspaltige Variante: thematische Karten in bis zu 3 Spalten (Hoehen
   gleichen sich wie in einer Zeitung aus), automatisch 2 bzw. 1 Spalte bei
   weniger Platz - ohne horizontales Scrollen. */
.tc-rechte-gruppen--spalten {
	display: block;
	columns: 3 230px;
	column-gap: var(--spacing-md);
}
.tc-rechte-gruppen--spalten > .tc-rechte-gruppe {
	break-inside: avoid;
	margin: 0 0 var(--spacing-md);
}
/* Karten als <fieldset>/<legend> (korrekte Formular-Gruppierung). */
fieldset.tc-rechte-gruppe { min-width: 0; margin-left: 0; margin-right: 0; }
fieldset.tc-rechte-gruppe > legend.tc-rechte-gruppe-titel { float: left; width: 100%; padding-left: 0; padding-right: 0; }
fieldset.tc-rechte-gruppe > .tc-rechte-liste { clear: both; }
/* Hauptschalter (Portal-Aktivierung) prominent ueber den Funktionen. */
.tc-pp-hauptschalter { margin: 0 0 var(--spacing-md); border-left: 4px solid var(--color-primary); }
.tc-pp-hauptschalter .tc-form-hinweis { margin: 6px 0 0 42px; }
.tc-rechte-toggle--gross { font-size: .95rem; }

/* ===================================================================
   02.10.2026: Mehrfachauswahl in der Ticketuebersicht (tickets/index.php,
   js/tc-ticket-massen.js). Ohne aktivierte Mehrfachauswahl ist nichts davon
   sichtbar (keine Checkboxen, keine Leiste) - nur Farb-Tokens, dadurch
   automatisch Hell-/Dunkelmodus.
   =================================================================== */
.tc-massen-auswahl { display: none; }
/* Checkbox steht im Auswahlmodus links VOR der Zeile bzw. Karte in einem
   eigenen Rand (Nutzerwunsch 02.10.2026). Technisch bleibt sie in der
   ersten Zelle bzw. in der Karte (keine zusaetzliche Tabellenspalte - die
   Gruppenfarb-/Prioritaetsbaender haengen an :first-child/:nth-child(2)),
   wird aber absolut in den Rand verschoben. */
body.tc-massen-modus .tc-massen-auswahl {
	display: flex;
	align-items: center;
	justify-content: center;
	position: absolute;
	top: 50%;
	width: 34px;
	height: 34px;
	margin: 0;
	transform: translateY(-50%);
	z-index: 2;
	cursor: pointer;
	border-radius: var(--radius-small, 4px);
}
body.tc-massen-modus .tc-massen-auswahl:hover { background: color-mix(in srgb, var(--color-primary) 12%, transparent); }
/* Liste: Rand im Scrollcontainer; Bezug ist die (bereits relativ
   positionierte) erste Zelle, deren linker Rand 14px breit ist. */
body.tc-massen-modus .tc-list-scroll { padding-left: 42px; }
body.tc-massen-modus .tc-list-art .tc-massen-auswahl { left: -52px; }
/* Karten: Rand vor jeder Karte (Karte ist bereits relativ positioniert). */
body.tc-massen-modus div.ticket-card-view { margin-left: 46px; }
body.tc-massen-modus div.ticket-card-view > .tc-massen-auswahl { left: -62px; } /* 20px Kartenrand + 8px Abstand + 34px Feld */
.tc-massen-checkbox { width: 20px; height: 20px; margin: 0; cursor: pointer; accent-color: var(--color-primary); }
.tc-massen-checkbox:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }
body.tc-massen-modus .tc-massen-gewaehlt { outline: 2px solid var(--color-primary); outline-offset: -2px; }
body.tc-massen-modus tr.tc-massen-gewaehlt > td { background-color: color-mix(in srgb, var(--color-primary) 9%, var(--color-surface)); }
body.tc-massen-modus .ticket-card-view.tc-massen-gewaehlt { box-shadow: 0 0 0 2px var(--color-primary), var(--shadow-medium); }
.tc-massen-umschalter svg { width: 14px; height: 14px; vertical-align: -2px; }

#tc-massen { position: sticky; bottom: 0; z-index: 40; margin-top: var(--spacing-md, 14px); }
.tc-massen-leiste {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 10px;
	padding: 10px 14px;
	border: 1px solid var(--color-border);
	border-left: 4px solid var(--color-primary);
	border-radius: var(--radius-medium, 8px);
	background: var(--color-surface);
	box-shadow: var(--shadow-medium);
}
.tc-massen-zaehler { font-weight: 600; margin-right: auto; }
.tc-massen-zaehler--laedt { opacity: .65; }
.tc-massen-link { background: none; border: 0; padding: 0; color: var(--color-primary); text-decoration: underline; cursor: pointer; font: inherit; font-weight: 600; }
.tc-massen-menue { position: relative; }
.tc-massen-menue > .tc-log-meine-btn svg { width: 12px; height: 12px; vertical-align: -1px; }
.tc-massen-aktionen-btn[disabled] { opacity: .5; cursor: not-allowed; }
.tc-massen-popover {
	position: absolute;
	bottom: calc(100% + 6px);
	right: 0;
	min-width: 240px;
	max-height: 60vh;
	overflow-y: auto;
	padding: 6px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-medium, 8px);
	background: var(--color-surface);
	box-shadow: var(--shadow-medium);
	z-index: 50;
}
.tc-massen-popover > button {
	display: block;
	width: 100%;
	text-align: left;
	padding: 8px 10px;
	border: 0;
	border-radius: var(--radius-small, 4px);
	background: transparent;
	color: var(--color-text);
	font: inherit;
	cursor: pointer;
}
.tc-massen-popover > button:hover,
.tc-massen-popover > button:focus-visible { background: var(--color-primary); color: #fff; }
.tc-massen-popover > button.tc-massen-gefahr { color: var(--color-danger); border-top: 1px solid var(--color-border); margin-top: 4px; }
.tc-massen-popover > button.tc-massen-gefahr:hover,
.tc-massen-popover > button.tc-massen-gefahr:focus-visible { background: var(--color-danger); color: #fff; }
.tc-massen-popover-leer { margin: 6px 8px; color: var(--color-text-muted); font-size: .88rem; }
.tc-massen-hinweis { margin: 6px 0 0; font-size: .85rem; color: var(--color-text-muted); }
.tc-massen-datumzeile { display: flex; gap: 8px; flex-wrap: wrap; }
.tc-massen-fehler { color: var(--color-danger); font-weight: 600; }
.tc-massen-warnung-gross { font-size: 1rem; }
.tc-massen-fortschritt { height: 10px; border-radius: 5px; background: var(--color-border); overflow: hidden; margin: 10px 0; }
.tc-massen-fortschritt-balken { height: 100%; width: 0; background: var(--color-primary); transition: width .2s; }
.tc-massen-ergebnis { margin: 8px 0 0; padding-left: 18px; }
.tc-massen-ergebnis li { margin: 6px 0; }
.tc-massen-ergebnis--ok { color: var(--color-success, #1E7B4A); }
.tc-massen-ergebnis--fehler { color: var(--color-danger); }
.tc-massen-nummern { font-size: .8rem; color: var(--color-text-muted); word-break: break-all; }
@media (max-width: 640px) {
	.tc-massen-zaehler { width: 100%; }
	.tc-massen-popover { right: auto; left: 0; }
}

/* ===================================================================
   02.10.2026: Drag & Drop fuer Datei-Uploads (js/tc-datei-ablage.js).
   Dezente Zone um das bestehende Dateifeld (das Feld selbst bleibt
   unveraendert sichtbar und bedienbar), Hervorhebung beim Darueberziehen.
   Auch im Partnerportal genutzt (laedt styles.css).
   =================================================================== */
.tc-ablage {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 6px;
	max-width: 100%;
	padding: 8px 10px;
	border: 1.5px dashed var(--color-border-strong, #B9BCC2);
	border-radius: var(--radius-medium, 8px);
	background: var(--color-surface);
	transition: border-color .15s, background-color .15s;
}
.tc-ablage > input[type=file] { max-width: 100%; }
.tc-ablage-hinweis { display: flex; align-items: center; gap: 6px; font-size: .82rem; color: var(--color-text-muted); }
.tc-ablage-symbol { font-size: .95rem; line-height: 1; color: var(--color-primary); }
.tc-ablage-text-aktiv { display: none; font-weight: 600; color: var(--color-primary); }
.tc-ablage--aktiv,
.tc-ablage-bereich.tc-ablage--aktiv {
	border-color: var(--color-primary) !important;
	background-color: color-mix(in srgb, var(--color-primary) 8%, var(--color-surface)) !important;
}
.tc-ablage--aktiv .tc-ablage-text { display: none; }
.tc-ablage--aktiv .tc-ablage-text-aktiv { display: inline; }
.tc-ablage-liste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.tc-ablage-liste li { display: flex; align-items: center; gap: 8px; padding: 4px 6px; border-radius: var(--radius-small, 4px); background: color-mix(in srgb, var(--color-primary) 5%, var(--color-surface)); font-size: .85rem; }
.tc-ablage-datei-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.tc-ablage-datei-groesse { color: var(--color-text-muted); white-space: nowrap; }
.tc-ablage-entfernen { border: 0; background: none; padding: 2px 4px; color: var(--color-danger); font: inherit; font-size: .8rem; cursor: pointer; text-decoration: underline; }
.tc-ablage-meldung { font-size: .82rem; color: var(--color-danger); font-weight: 600; }
/* Ganze Bereiche (z. B. Zusatzdaten-Karte) als Ablageziel. */
.tc-ablage-bereich { position: relative; }
.tc-ablage-bereich-hinweis {
	display: none;
	position: absolute;
	inset: 0;
	z-index: 5;
	align-items: center;
	justify-content: center;
	padding: 12px;
	border: 2px dashed var(--color-primary);
	border-radius: inherit;
	background: color-mix(in srgb, var(--color-primary) 10%, var(--color-surface));
	color: var(--color-primary);
	font-weight: 700;
	text-align: center;
	pointer-events: none;
}
.tc-ablage-bereich.tc-ablage--aktiv > .tc-ablage-bereich-hinweis { display: flex; }
.tc-ablage-bereich > .tc-ablage-bereich-meldung { margin: 6px 12px; }
@media (max-width: 640px), (hover: none) {
	.tc-ablage { padding: 6px 8px; }
	.tc-ablage-hinweis { font-size: .78rem; }
}

/* 02.10.2026: Daumen hoch/runter in der Partnerkommunikation (intern + Partnerportal,
   includes/tc_pp_feedback.php, js/tc-pp-feedback.js). Grosse Klickflaechen,
   gedrueckter Zustand deutlich (gefuellt + Rand), nicht nur ueber Farbe. */
.tc-fb { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; margin-top: 8px; font-size: 13px; }
.tc-fb-label { font-weight: 600; color: var(--color-text-muted); }
.tc-fb-knopf { display: inline-flex; align-items: center; justify-content: center; min-width: 38px; min-height: 34px; padding: 0 10px; border: 2px solid var(--color-border-strong, #B8C0CC); border-radius: 999px; background: var(--color-surface, #fff); color: var(--color-text-muted); cursor: pointer; transition: transform .15s ease, background-color .15s ease, border-color .15s ease, color .15s ease; }
.tc-fb-knopf:hover, .tc-fb-knopf:focus-visible { transform: translateY(-1px); background: var(--color-background, #F4F6F9); }
.tc-fb-knopf:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }
.tc-fb-knopf--hoch:hover, .tc-fb-knopf--hoch:focus-visible { border-color: var(--color-success, #1E7B45); color: var(--color-success, #1E7B45); }
.tc-fb-knopf--runter:hover, .tc-fb-knopf--runter:focus-visible { border-color: var(--color-danger, #C0272D); color: var(--color-danger, #C0272D); }
.tc-fb-knopf--hoch[aria-pressed="true"] { background: var(--color-success, #1E7B45); border-color: var(--color-success, #1E7B45); color: #fff; }
.tc-fb-knopf--runter[aria-pressed="true"] { background: var(--color-danger, #C0272D); border-color: var(--color-danger, #C0272D); color: #fff; }
.tc-fb-icon { display: block; }
.tc-fb-icon--runter { transform: rotate(180deg); }
.tc-fb-hinweis { color: var(--color-text-muted); font-size: 12.5px; }
.tc-fb-hinweis--fehler { color: var(--color-danger, #C0272D); font-weight: 600; }
.tc-fb--fest .tc-fb-wert { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 999px; font-weight: 700; }
.tc-fb-wert--hoch { background: var(--color-success-subtle, #E3F4EA); color: var(--color-success-dark, #145A32); }
.tc-fb-wert--runter { background: var(--color-danger-subtle, #FBE7E8); color: var(--color-danger-dark, #8E1B20); }
.tc-fb-meta { color: var(--color-text-muted); font-size: 12px; }
@media (prefers-reduced-motion: reduce) { .tc-fb-knopf { transition: none; } .tc-fb-knopf:hover { transform: none; } }

/* 02.10.2026: Eingabefeld direkt in der internen Partnerkommunikation (statt Knopf + Dialog). */
.tc-pp-antwort { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; padding: 12px; border: 1px solid var(--color-border); border-radius: var(--radius-medium, 8px); background: var(--color-background, #F4F6F9); }
.tc-pp-antwort-label { font-weight: 700; font-size: 13.5px; }
.tc-pp-antwort-text { width: 100%; box-sizing: border-box; min-height: 74px; resize: vertical; background: var(--color-surface, #fff); }
.tc-pp-antwort-optionen { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 20px; }
.tc-pp-antwort-empfaenger summary { cursor: pointer; font-size: 13px; color: var(--color-primary-dark); font-weight: 600; }
.tc-pp-antwort-empfaenger[open] { flex-basis: 100%; }
.tc-pp-antwort-fuss { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; font-size: 12.5px; }

/* Monats-/Jahresauswahl statt Von-bis (03.10.2026, includes/tc_monatsauswahl.php):
   Monat und Jahr nebeneinander, bei schmaler Breite umbrechend. */
.tc-monatsauswahl {
	display: inline-flex;
	flex-wrap: wrap;
	gap: var(--spacing-sm, 8px);
	align-items: flex-end;
}
.tc-monatsauswahl-feld {
	display: inline-flex;
	flex-direction: column;
	gap: 2px;
	min-width: 120px;
}
.tc-monatsauswahl-label {
	font-size: .8rem;
	color: var(--color-text-muted);
}
.tc-monatsauswahl select {
	min-width: 120px;
}

/* Persoenliche Schnellbausteine (03.10.2026, js/tc-schnellbausteine.js):
   Leiste unter dem Textfeld mit Schnellbaustein-Knopf + Merken-Schalter. */
.tc-sb-leiste {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 14px;
	margin-top: 6px;
	font-size: .85rem;
}
.tc-sb-knopf-wrap {
	position: relative;
}
.tc-sb-knopf {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 10px;
	border: 1px solid var(--color-border-strong);
	border-radius: 999px;
	background: var(--color-surface);
	color: var(--color-text);
	font: inherit;
	cursor: pointer;
	transition: background-color .15s ease, border-color .15s ease;
}
.tc-sb-knopf:hover,
.tc-sb-knopf[aria-expanded="true"] {
	border-color: var(--color-primary);
	background: var(--color-background);
}
.tc-sb-knopf:focus-visible,
.tc-sb-eintrag-text:focus-visible,
.tc-sb-eintrag-entfernen:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
.tc-sb-knopf-zaehler {
	min-width: 18px;
	padding: 0 5px;
	border-radius: 999px;
	background: var(--color-primary);
	color: #fff;
	font-size: .75rem;
	text-align: center;
}
.tc-sb-popover {
	/* fixed + per JS positioniert (js/tc-schnellbausteine.js positionieren()) */
	position: fixed;
	z-index: 1000;
	top: 0;
	left: 0;
	width: min(460px, 80vw);
	max-height: 280px;
	overflow-y: auto;
	padding: 8px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small, 6px);
	background: var(--color-surface);
	color: var(--color-text);
	box-shadow: var(--shadow-medium, 0 6px 18px rgba(0, 0, 0, .18));
}
.tc-sb-popover-titel {
	margin: 0 0 6px;
	font-size: .78rem;
	font-weight: 600;
	color: var(--color-text-muted);
	text-transform: uppercase;
	letter-spacing: .03em;
}
.tc-sb-liste {
	list-style: none;
	margin: 0;
	padding: 0;
}
.tc-sb-eintrag {
	display: flex;
	align-items: flex-start;
	gap: 4px;
	border-top: 1px solid var(--color-border);
}
.tc-sb-eintrag:first-child {
	border-top: 0;
}
.tc-sb-eintrag-text {
	flex: 1 1 auto;
	padding: 7px 6px;
	border: 0;
	background: transparent;
	color: var(--color-text);
	font: inherit;
	text-align: left;
	line-height: 1.35;
	cursor: pointer;
	border-radius: 4px;
}
.tc-sb-eintrag-text:hover {
	background: var(--color-background);
}
.tc-sb-eintrag-entfernen {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	margin-top: 3px;
	border: 0;
	border-radius: 4px;
	background: transparent;
	color: var(--color-text-muted);
	font-size: 1.1rem;
	line-height: 1;
	cursor: pointer;
}
.tc-sb-eintrag-entfernen:hover {
	background: var(--color-danger-light, rgba(200, 30, 30, .12));
	color: var(--color-danger, #b3261e);
}
.tc-sb-merken {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	color: var(--color-text-muted);
	cursor: pointer;
}
@media (prefers-reduced-motion: reduce) {
	.tc-sb-knopf { transition: none; }
}

/* Konfiguration zuruecksetzen (03.10.2026, meinprofil/konfiguration.php) */
.tc-meine-ansicht-konfig {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 10px 16px;
	margin-top: var(--spacing-md, 14px);
	padding-top: var(--spacing-md, 14px);
	border-top: 1px solid var(--color-border);
}
.tc-meine-ansicht-konfig-titel {
	margin: 0;
	font-weight: 600;
}
.tc-konfig-karte {
	margin-bottom: var(--spacing-md, 14px);
}
.tc-konfig-sb-bereich {
	margin: 12px 0;
	padding: 10px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, 4px);
}
.tc-konfig-sb-kopf {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 12px;
	margin-bottom: 6px;
}
.tc-konfig-sb-liste {
	list-style: none;
	margin: 0;
	padding: 0;
}
.tc-konfig-sb-liste li {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 12px;
	padding: 7px 0;
	border-top: 1px solid var(--color-border);
}
.tc-konfig-sb-text {
	flex: 1 1 auto;
	word-break: break-word;
}

/* Kommunikationsvorlagen / E-Mail-Versand-Widget (03.10.2026) */
.tc-kv-vorlagen {
	display: flex;
	flex-direction: column;
	gap: 6px;
}
.tc-kv-vorlage-knopf {
	display: flex;
	align-items: center;
	gap: 8px;
	width: 100%;
	padding: 8px 10px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small, 4px);
	background: var(--color-surface);
	color: var(--color-text);
	font: inherit;
	text-align: left;
	cursor: pointer;
	transition: border-color .15s ease, background-color .15s ease;
}
.tc-kv-vorlage-knopf:hover {
	border-color: var(--color-primary);
	background: var(--color-background);
}
.tc-kv-vorlage-knopf:focus-visible {
	outline: 2px solid var(--color-primary);
	outline-offset: 2px;
}
dialog.tc-modal.tc-modal--breit {
	width: min(860px, 96vw);
	max-width: 96vw;
}
.tc-kv-empfaenger-felder {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: 8px;
	margin-top: 8px;
}
.tc-kv-empfaenger-felder label {
	display: flex;
	flex-direction: column;
	gap: 3px;
	font-size: .85rem;
	color: var(--color-text-muted);
}
.tc-kv-vorschau-frame {
	width: 100%;
	min-height: 360px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, 4px);
	background: #fff;
}
.tc-kv-vorschau-status--fehler {
	color: var(--color-danger, #b3261e);
	font-weight: 600;
}
.tc-kv-ausgang-link {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	margin-left: 8px;
	font-size: .85rem;
}
@media (prefers-reduced-motion: reduce) {
	.tc-kv-vorlage-knopf { transition: none; }
}

/* Servicebericht (03.10.2026, ticketing/servicebericht/, js/tc-servicebericht.js) */
.tc-sbr-schritte {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	list-style: none;
	margin: 0 0 var(--spacing-md, 14px);
	padding: 0;
	counter-reset: sbrschritt;
}
.tc-sbr-schritte li {
	counter-increment: sbrschritt;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 12px;
	border: 1px solid var(--color-border-strong);
	border-radius: 999px;
	background: var(--color-surface);
	color: var(--color-text-muted);
	font-size: .85rem;
	cursor: default;
}
.tc-sbr-schritte li::before {
	content: counter(sbrschritt);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 20px;
	height: 20px;
	border-radius: 50%;
	background: var(--color-background);
	font-weight: 600;
}
.tc-sbr-schritte li.tc-sbr-schritt--erledigt { color: var(--color-text); cursor: pointer; }
.tc-sbr-schritte li.tc-sbr-schritt--erledigt::before { content: '✓'; background: var(--color-primary); color: #fff; }
.tc-sbr-schritte li.tc-sbr-schritt--aktiv { border-color: var(--color-primary); color: var(--color-text); font-weight: 600; }
.tc-sbr-schritte li.tc-sbr-schritt--aktiv::before { background: var(--color-primary); color: #fff; }
.tc-sbr-schritt { margin-bottom: var(--spacing-md, 14px); }
.tc-sbr-auswahlgitter {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 8px;
	margin-bottom: 10px;
}
.tc-sbr-kachel {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	padding: 10px 12px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-small, 4px);
	background: var(--color-surface);
	cursor: pointer;
}
.tc-sbr-kachel:has(input:checked) { border-color: var(--color-primary); background: var(--color-background); box-shadow: inset 3px 0 0 var(--color-primary); }
.tc-sbr-kachel:focus-within { outline: 2px solid var(--color-primary); outline-offset: 2px; }
.tc-sbr-daten {
	margin: 10px 0;
	padding: 10px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, 4px);
}
.tc-sbr-daten legend { font-weight: 600; padding: 0 6px; }
.tc-sbr-daten-tabelle { width: 100%; border-collapse: collapse; }
.tc-sbr-daten-tabelle th, .tc-sbr-daten-tabelle td { padding: 4px 6px; text-align: left; vertical-align: middle; }
.tc-sbr-daten-tabelle thead th { font-size: .8rem; color: var(--color-text-muted); }
.tc-sbr-daten-tabelle tbody th { width: 28%; font-weight: normal; }
.tc-sbr-daten-tabelle input { width: 100%; box-sizing: border-box; }
.tc-sbr-position {
	margin-bottom: 8px;
	padding: 10px 12px;
	border: 1px solid var(--color-border);
	border-left: 3px solid var(--color-primary);
	border-radius: var(--radius-small, 4px);
	background: var(--color-surface);
}
.tc-sbr-position-kopf { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 6px; }
.tc-sbr-position-felder { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 8px; }
.tc-sbr-pos-feld { display: flex; flex-direction: column; gap: 3px; font-size: .85rem; color: var(--color-text-muted); }
.tc-sbr-positionen-neu { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px; }
.tc-sbr-pruefung {
	margin: 0 0 10px;
	padding: 8px 12px;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-small, 4px);
}
.tc-sbr-pruefung legend { font-weight: 600; padding: 0 6px; }
.tc-sbr-pflicht { color: var(--color-danger, #b3261e); }
.tc-sbr-antworten { display: flex; flex-wrap: wrap; gap: 6px 18px; }
.tc-sbr-folge { display: flex; align-items: flex-start; gap: 10px; margin: 8px 0; }
.tc-sbr-uebersicht { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 10px; margin-bottom: 12px; }
.tc-sbr-ueb-abschnitt { padding: 8px 12px; border: 1px solid var(--color-border); border-radius: var(--radius-small, 4px); }
.tc-sbr-ueb-abschnitt h3 { margin: 0 0 4px; font-size: .9rem; }
.tc-sbr-ueb-abschnitt ul { margin: 0; padding-left: 18px; }
.tc-sbr-bestaetigung { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border: 2px solid var(--color-primary); border-radius: var(--radius-small, 4px); }
.tc-sbr-aktionen { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; margin: var(--spacing-md, 14px) 0; }
.tc-sbr-widget-liste { list-style: none; margin: 0 0 10px; padding: 0; }
.tc-sbr-widget-liste li { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; padding: 8px 0; border-bottom: 1px solid var(--color-border); }
.tc-sbr-widget-titel { font-weight: 600; }
.tc-sbr-widget-meta { flex-basis: 100%; font-size: .82rem; color: var(--color-text-muted); }
.tc-sbr-widget-aktionen { display: inline-flex; gap: 10px; }
.tc-sbr-status { padding: 1px 8px; border-radius: 999px; font-size: .75rem; background: var(--color-background); border: 1px solid var(--color-border-strong); }
.tc-sbr-status--abgeschlossen { border-color: var(--color-success, #2e7d32); color: var(--color-success, #2e7d32); }
.tc-sbr-aufgabe-info { display: inline-flex; flex-wrap: wrap; gap: 4px 10px; margin-left: 8px; font-size: .8rem; color: var(--color-text-muted); font-weight: normal; }
.tc-sbr-aufgabe-info a { display: inline-flex; align-items: center; gap: 3px; }
.tc-sbr-prio--hoch, .tc-sbr-prio--dringend { color: var(--color-danger, #b3261e); font-weight: 600; }
.tc-sbr-aenderungen { margin: 0; padding-left: 16px; }
@media print {
	.tc-no-print, .app-kopfbereich-sticky, .tc-sbr-aktionen { display: none !important; }
}
/* hidden-Attribut gegen display-Regeln der Buttons/Karten durchsetzen (Servicebericht-Assistent) */
.tc-sbr-form [hidden] { display: none !important; }

/* Ticketimport (03.10.2026, administration/ticketimport/) - Schrittanzeige
   nutzt die Servicebericht-Schritte (.tc-sbr-schritte). */
.tc-imp-karte { margin-bottom: var(--spacing-md, 14px); }
.tc-imp-h { margin: 0 0 8px; font-size: 1.1rem; font-weight: 600; color: var(--color-text); }
details > summary.tc-imp-h { cursor: pointer; }
.tc-imp-h3 { margin: 12px 0 6px; font-size: 1rem; }
.tc-imp-hinweis { color: var(--color-text-muted); font-size: .88rem; }
.tc-imp-auswahl { min-width: 240px; max-width: 100%; padding: 6px 8px; font-size: 1rem; }
.tc-imp-eingabe { width: 100%; max-width: 320px; padding: 6px 8px; box-sizing: border-box; }
.tc-imp-eingabe--breit { max-width: 560px; }
.tc-imp-feldgruppe { margin: 0 0 12px; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: var(--radius-small, 4px); }
.tc-imp-feldgruppe legend { font-weight: 600; padding: 0 6px; }
.tc-imp-radio { display: block; margin: 4px 0; }
.tc-imp-fest-gitter { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 0 16px; }
.tc-imp-tabelle td { vertical-align: top; }
.tc-imp-beispiele { color: var(--color-text-muted); font-size: .85rem; max-width: 360px; }
.tc-imp-zeile--fehler td { background: color-mix(in srgb, var(--color-danger) 8%, transparent); }
.tc-imp-fehler { margin: 4px 0 0; padding-left: 16px; font-size: .82rem; }
.tc-imp-badge { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: .78rem; border: 1px solid var(--color-border-strong); background: var(--color-background); white-space: nowrap; }
.tc-imp-badge--ok, .tc-imp-badge--abgeschlossen { border-color: var(--color-success, #2e7d32); color: var(--color-success, #2e7d32); }
.tc-imp-badge--fehler, .tc-imp-badge--fehlgeschlagen { border-color: var(--color-danger); color: var(--color-danger); }
.tc-imp-badge--warnung, .tc-imp-badge--laeuft, .tc-imp-badge--teilweise_zurueckgenommen { border-color: var(--color-warning, #b26a00); color: var(--color-warning, #b26a00); }
.tc-imp-kennzahlen { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 10px; margin: 6px 0 12px; }
.tc-imp-kennzahl { padding: 10px 12px; border: 1px solid var(--color-border); border-left-width: 5px; border-radius: var(--radius-small, 4px); font-size: .88rem; }
.tc-imp-kennzahl span { display: block; font-size: 1.6rem; font-weight: 700; color: var(--color-text); }
.tc-imp-kennzahl--ok { border-left-color: var(--color-success, #2e7d32); }
.tc-imp-kennzahl--fehler { border-left-color: var(--color-danger); }
.tc-imp-kennzahl--warnung { border-left-color: var(--color-warning, #b26a00); }
.tc-imp-fehlerliste { max-height: 420px; overflow: auto; }
.tc-imp-zusammenfassung { margin: 4px 0 8px; padding-left: 18px; }
.tc-imp-vorlage-leiste { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: var(--spacing-md, 14px); }
.tc-imp-progress { width: 100%; height: 22px; accent-color: var(--color-primary); }
.tc-imp-fortschritt-text { font-size: 1.4rem; font-weight: 700; margin: 4px 0 8px; }
.tc-imp-start .tc-sbr-bestaetigung { margin-bottom: 4px; }
.tc-imp-bestaetigung--gefahr { border-color: var(--color-danger); }
.app-header-cta.tc-imp-gefahr { background: var(--color-danger); border-color: var(--color-danger); color: #fff; }
.tc-imp-inline-form { display: inline; }
.tc-imp-link-knopf { background: none; border: 0; padding: 0; cursor: pointer; font: inherit; }
.tc-imp-form [hidden] { display: none !important; }

/* ==========================================================================
   Gesamtauftrag 03.10.2026, Teil 4: gemeinsame Bedien-Komponente fuer
   Hauptnavigation (.app-hauptnav-link), Ticketdetail-Aktionsleiste links
   (.sidebar-link-action, .sidebar-action-panel .SchnellButton) und den
   Header-Button "Neues Ticket erstellen" (.app-header-cta--hero).
   EIN Satz Variablen fuer Bewegung, Fokusring und Akzentflaeche - keine
   drei getrennten Designsysteme. Reine Optik: Markup, Reihenfolge,
   Berechtigungen und Funktionen bleiben unveraendert.
   - Zustaende klar unterscheidbar: Hover (Anhebung/Akzentlinie), Fokus
     (deutlicher doppelter Ring), aktiv/gedrueckt (Einsinken), aktueller
     Bereich (gefuellte Akzentflaeche + Markierungsbalken).
   - Dunkelmodus: eigene, etwas dunklere Akzentflaeche, damit weisse Schrift
     ausreichend Kontrast behaelt (#5B78D6 waere fuer kleine Schrift knapp).
   - prefers-reduced-motion: Bewegungen/Animationen entfallen, Farbwechsel
     bleiben (Zustaende bleiben erkennbar).
   ========================================================================== */
:root {
	--tc-ui-dauer: .18s;
	--tc-ui-kurve: cubic-bezier(.2, .7, .3, 1);
	--tc-ui-akzentflaeche: var(--color-primary);
	--tc-ui-akzentflaeche-hover: var(--color-primary-dark);
	--tc-ui-fokusring: 0 0 0 2px var(--color-surface, #fff), 0 0 0 4px var(--color-primary);
	--tc-ui-hebung: 0 4px 12px rgba(31, 46, 99, .18);
}
:root[data-theme="dunkel"] {
	--tc-ui-akzentflaeche: #3B56B8;
	--tc-ui-akzentflaeche-hover: #4A66CC;
	--tc-ui-fokusring: 0 0 0 2px var(--color-background), 0 0 0 4px #8FA7F2;
	--tc-ui-hebung: 0 4px 14px rgba(0, 0, 0, .5);
}

/* --- 4.1 Hauptnavigation ------------------------------------------------ */
.app-hauptnav-link {
	position: relative;
	transition: background-color var(--tc-ui-dauer) ease, color var(--tc-ui-dauer) ease, border-color var(--tc-ui-dauer) ease,
		box-shadow var(--tc-ui-dauer) ease, transform var(--tc-ui-dauer) var(--tc-ui-kurve);
}
.app-hauptnav-link .tc-icon { transition: transform .25s var(--tc-ui-kurve), color var(--tc-ui-dauer) ease; }
/* Markierungsbalken unten: waechst beim Hover von der Mitte, bleibt beim aktiven Bereich stehen */
.app-hauptnav-link::after {
	content: '';
	position: absolute;
	left: 18px;
	right: 18px;
	bottom: 5px;
	height: 3px;
	border-radius: 3px;
	background: currentColor;
	transform: scaleX(0);
	transition: transform .22s var(--tc-ui-kurve);
	pointer-events: none;
}
.app-hauptnav-link:hover {
	transform: translateY(-2px);
	box-shadow: var(--tc-ui-hebung);
}
.app-hauptnav-link:hover::after { transform: scaleX(.6); }
.app-hauptnav-link:hover .tc-icon { transform: translateY(-1px) scale(1.15); }
.app-hauptnav-link:active { transform: translateY(0); box-shadow: none; }
.app-hauptnav-link:focus-visible {
	outline: none;
	box-shadow: var(--tc-ui-fokusring);
}
.app-hauptnav-link:focus-visible::after { transform: scaleX(.6); }
.app-hauptnav-link--aktiv,
.app-hauptnav-link--aktiv:hover {
	background-color: var(--tc-ui-akzentflaeche);
	border-color: var(--tc-ui-akzentflaeche);
	color: #FFF;
}
.app-hauptnav-link--aktiv::after,
.app-hauptnav-link--aktiv:hover::after { transform: scaleX(1); opacity: .85; }
.app-hauptnav-link--aktiv:focus-visible { box-shadow: var(--tc-ui-fokusring); }

/* --- 4.2 Ticketdetail: Aktionsleiste links --------------------------- */
.sidebar-link-action,
.sidebar-action-panel .SchnellButton {
	transition: background-color var(--tc-ui-dauer) ease, color var(--tc-ui-dauer) ease, border-color var(--tc-ui-dauer) ease,
		box-shadow var(--tc-ui-dauer) ease, transform var(--tc-ui-dauer) var(--tc-ui-kurve);
}
.sidebar-link-action .tc-icon { transition: transform var(--tc-ui-dauer) var(--tc-ui-kurve), color var(--tc-ui-dauer) ease; }
/* einheitlich ohne Unterstreichung (bisher nur die <a>-Eintraege unterstrichen, die <button>-Eintraege nicht) */
a.sidebar-link-action, a.sidebar-link-action:hover, a.sidebar-link-action:focus-visible { text-decoration: none; }
/* Hover/Fokus: Akzentlinie links + Icon rueckt leicht nach rechts und nimmt die Akzentfarbe an */
.sidebar-link-action:hover,
.sidebar-link-action:focus-visible {
	box-shadow: inset 3px 0 0 var(--color-primary);
}
.sidebar-link-action:hover .tc-icon,
.sidebar-link-action:focus-visible .tc-icon {
	color: var(--color-primary);
	transform: translateX(2px);
}
:root[data-theme="dunkel"] .sidebar-link-action:hover .tc-icon,
:root[data-theme="dunkel"] .sidebar-link-action:focus-visible .tc-icon { color: #8FA7F2; }
.sidebar-link-action:focus-visible {
	outline: none;
	box-shadow: inset 3px 0 0 var(--color-primary), var(--tc-ui-fokusring);
}
.sidebar-link-action:active,
.sidebar-action-panel .SchnellButton:active { transform: scale(.98); }
.sidebar-link-action--danger:hover,
.sidebar-link-action--danger:focus-visible { box-shadow: inset 3px 0 0 rgba(255, 255, 255, .7); }
.sidebar-link-action--danger:focus-visible { box-shadow: inset 3px 0 0 rgba(255, 255, 255, .7), var(--tc-ui-fokusring); }
.sidebar-link-action--danger:hover .tc-icon,
.sidebar-link-action--danger:focus-visible .tc-icon { color: #FFF; }
.sidebar-action-panel .SchnellButton:hover {
	transform: translateY(-1px);
	box-shadow: var(--tc-ui-hebung);
}
.sidebar-action-panel .SchnellButton:focus-visible {
	outline: none;
	box-shadow: var(--tc-ui-fokusring);
}
.sidebar-action-panel .SchnellButton.sidebar-action-primary {
	background-color: var(--tc-ui-akzentflaeche);
	border-color: var(--tc-ui-akzentflaeche);
}
.sidebar-action-panel .SchnellButton.sidebar-action-primary:hover {
	background-color: var(--tc-ui-akzentflaeche-hover);
}

/* --- 4.3 "Neues Ticket erstellen" ----------------------------------- */
.app-header-cta--hero {
	position: relative;
	overflow: hidden;
	gap: 10px;
	padding: 9px 22px 9px 10px;
	font-size: 15.5px;
	border-radius: 999px;
	background: linear-gradient(135deg, var(--tc-ui-akzentflaeche) 0%, var(--tc-ui-akzentflaeche-hover) 100%);
	box-shadow: var(--tc-ui-hebung), inset 0 1px 0 rgba(255, 255, 255, .18);
	transition: transform var(--tc-ui-dauer) var(--tc-ui-kurve), box-shadow var(--tc-ui-dauer) ease;
}
/* Plus-Symbol in eigenem Kreis - dreht sich beim Hover um 90 Grad */
.app-header-cta--hero .tc-icon {
	box-sizing: content-box;
	width: 16px;
	height: 16px;
	padding: 5px;
	border-radius: 50%;
	background: rgba(255, 255, 255, .2);
	stroke-width: 2.4;
	vertical-align: middle;
	transition: transform .3s var(--tc-ui-kurve), background-color var(--tc-ui-dauer) ease;
}
/* dezenter Lichtstreifen, der beim Hover einmal ueber den Button laeuft */
.app-header-cta--hero::after {
	content: '';
	position: absolute;
	top: 0;
	bottom: 0;
	left: -60%;
	width: 40%;
	background: linear-gradient(100deg, transparent, rgba(255, 255, 255, .28), transparent);
	transform: skewX(-20deg);
	pointer-events: none;
	opacity: 0;
}
.app-header-cta--hero:hover {
	background: linear-gradient(135deg, var(--tc-ui-akzentflaeche-hover) 0%, var(--tc-ui-akzentflaeche) 100%);
	transform: translateY(-2px);
	box-shadow: 0 8px 20px rgba(31, 46, 99, .28), inset 0 1px 0 rgba(255, 255, 255, .18);
}
.app-header-cta--hero:hover .tc-icon {
	transform: rotate(90deg);
	background: rgba(255, 255, 255, .32);
}
.app-header-cta--hero:hover::after {
	opacity: 1;
	animation: tc-ui-glanz .7s ease-out 1 forwards;
}
.app-header-cta--hero:active { transform: translateY(0) scale(.98); }
.app-header-cta--hero:focus-visible {
	outline: none;
	box-shadow: var(--tc-ui-fokusring), var(--tc-ui-hebung);
}
@keyframes tc-ui-glanz {
	from { left: -60%; }
	to { left: 130%; }
}
@media (max-width: 700px) {
	.app-header-cta--hero { padding: 8px 16px 8px 8px; font-size: 14.5px; }
}

/* --- Reduzierte Bewegung ------------------------------------------------ */
@media (prefers-reduced-motion: reduce) {
	.app-hauptnav-link,
	.app-hauptnav-link .tc-icon,
	.app-hauptnav-link::after,
	.sidebar-link-action,
	.sidebar-link-action .tc-icon,
	.sidebar-action-panel .SchnellButton,
	.app-header-cta--hero,
	.app-header-cta--hero .tc-icon { transition: none; }
	.app-hauptnav-link:hover,
	.app-hauptnav-link:hover .tc-icon,
	.sidebar-link-action:hover .tc-icon,
	.sidebar-link-action:focus-visible .tc-icon,
	.sidebar-link-action:active,
	.sidebar-action-panel .SchnellButton:hover,
	.sidebar-action-panel .SchnellButton:active,
	.app-header-cta--hero:hover,
	.app-header-cta--hero:active,
	.app-header-cta--hero:hover .tc-icon { transform: none; }
	.app-header-cta--hero:hover::after { animation: none; opacity: 0; }
}

/* 03.10.2026: Pflichtfeld-Hinweis in Ticket-Modals (Status-Notiz) */
.tc-modal-pflicht { color: var(--color-danger); font-weight: 600; font-size: .9em; }

/* 03.10.2026: Dialoge "Neue Datei hinzufuegen" / "Datei bearbeiten"
   (Zusatzdaten, includes/zusatzinhalt_dateien.php) ohne Scrollbalken:
   breiter und zweispaltig (Art | Datei, Titel | Beschreibung), Schalter und
   Meldungen ueber die volle Breite. Schmale Bildschirme: einspaltig wie bisher. */
dialog.tc-modal.tc-modal--zi { width: min(780px, 94vw); }
.tc-modal--zi .tc-modal-body {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 4px 22px;
	align-items: start;
}
.tc-modal--zi .tc-modal-body > .tc-zi-schalter,
.tc-modal--zi .tc-modal-body > .tc-admin-meldung { grid-column: 1 / -1; }
.tc-modal--zi .tc-modal-body > .tc-form-zeile { margin-top: 0; }
.tc-modal--zi .tc-modal-body .tc-modal-textarea { min-height: 84px; }
@media (max-width: 640px) {
	.tc-modal--zi .tc-modal-body { grid-template-columns: 1fr; }
}

/* ==========================================================================
   Ticket verbinden (03.10.2026, #modal-beziehung, js/tc-ticket-verbinden.js)
   Feste Dialoghoehe (kein Springen beim Tippen), Suchzeile oben, NUR die
   Trefferliste scrollt, Auswahl/Notiz und Knoepfe bleiben sichtbar.
   ========================================================================== */
dialog.tc-modal.tc-tv { width: min(860px, 96vw); }
dialog.tc-modal.tc-tv[open] { height: min(780px, 92vh); max-height: min(780px, 92vh); }
.tc-tv .tc-tv-body { overflow: hidden; gap: 8px; }
.tc-tv-suchzeile { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.tc-tv-suchsymbol { position: absolute; margin-left: 12px; color: var(--color-text-muted); pointer-events: none; display: inline-flex; }
.tc-tv-suchsymbol .tc-icon { width: 18px; height: 18px; }
.tc-tv input.tc-tv-sucheingabe[type="search"] {
	flex: 1 1 320px;
	min-width: 0;
	box-sizing: border-box;
	padding: 12px 14px 12px 40px;
	font-size: 16px;
	border: 2px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	background: var(--color-surface);
	color: var(--color-text);
}
.tc-tv input.tc-tv-sucheingabe[type="search"]:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--tc-ui-fokusring, 0 0 0 3px rgba(47, 69, 146, .25)); }
.tc-tv-offen { white-space: nowrap; }
.tc-tv-hinweis { margin: 0; font-size: .85rem; color: var(--color-text-muted); }
.tc-tv-status { margin: 2px 0 0; font-weight: 600; font-size: .9rem; min-height: 1.2em; }
.tc-tv-ergebnisse {
	flex: 1 1 auto;
	min-height: 120px;
	overflow-y: auto;
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 2px 4px 2px 2px;
}
.tc-tv-ergebnisse[aria-busy="true"] { opacity: .6; }
.tc-tv-karte {
	position: relative;
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 10px 40px 10px 12px;
	border: 1px solid var(--color-border);
	border-left: 6px solid var(--tc-tv-farbe, var(--color-border-strong));
	border-radius: var(--radius-small, 6px);
	background: var(--color-surface);
	cursor: pointer;
	transition: border-color var(--tc-ui-dauer, .15s) ease, box-shadow var(--tc-ui-dauer, .15s) ease, background-color var(--tc-ui-dauer, .15s) ease;
}
.tc-tv-karte:hover { border-color: var(--color-primary); box-shadow: var(--tc-ui-hebung, var(--shadow-small)); }
.tc-tv-karte:has(input:checked) {
	border-color: var(--color-primary);
	background: color-mix(in srgb, var(--color-primary) 9%, var(--color-surface));
	box-shadow: 0 0 0 2px var(--color-primary);
}
.tc-tv-karte:has(input:focus-visible) { box-shadow: var(--tc-ui-fokusring, 0 0 0 3px var(--color-primary)); }
.tc-tv-karte input[type="radio"] { margin-top: 3px; width: 18px; height: 18px; accent-color: var(--color-primary); flex-shrink: 0; }
.tc-tv-karte--verbunden { cursor: default; opacity: .7; }
.tc-tv-karte--verbunden:hover { border-color: var(--color-border); box-shadow: none; }
.tc-tv-karte-inhalt { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
.tc-tv-karte-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.tc-tv-betreff { font-weight: 700; font-size: 1rem; color: var(--color-text); overflow-wrap: anywhere; }
.tc-tv-meta { display: flex; flex-wrap: wrap; gap: 2px 14px; font-size: .84rem; color: var(--color-text-muted); }
.tc-tv-nr { font-family: var(--font-mono, ui-monospace, monospace); color: var(--color-text); }
.tc-tv-kontakt { color: var(--color-text); }
.tc-tv-karte mark { background: color-mix(in srgb, var(--color-warning) 35%, transparent); color: inherit; border-radius: 2px; padding: 0 1px; }
.tc-tv-badge { flex-shrink: 0; padding: 2px 10px; border-radius: 999px; font-size: .78rem; font-weight: 600; border: 1px solid var(--color-border-strong); white-space: nowrap; }
.tc-tv-badge--offen { border-color: var(--color-primary); color: var(--color-primary); }
:root[data-theme="dunkel"] .tc-tv-badge--offen { border-color: #8FA7F2; color: #8FA7F2; }
.tc-tv-badge--eskaliert { border-color: var(--color-danger); color: var(--color-danger); }
.tc-tv-badge--geparkt { border-color: var(--color-warning); color: var(--color-warning); }
.tc-tv-badge--geschlossen { color: var(--color-text-muted); }
.tc-tv-chip { padding: 0 8px; border-radius: 999px; background: var(--color-background); border: 1px solid var(--color-border); font-size: .76rem; color: var(--color-text); }
.tc-tv-chip--verbunden { border-color: var(--color-success); color: var(--color-success); }
.tc-tv-oeffnen {
	position: absolute;
	top: 8px;
	right: 8px;
	width: 26px;
	height: 26px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 50%;
	text-decoration: none;
	color: var(--color-text-muted);
	font-weight: 700;
}
.tc-tv-oeffnen:hover, .tc-tv-oeffnen:focus-visible { background: var(--color-background); color: var(--color-primary); }
.tc-tv-auswahl { flex: 0 0 auto; border-top: 1px solid var(--color-border); padding-top: 8px; }
.tc-tv-auswahl-titel { margin: 0 0 6px; font-size: .95rem; }
.tc-tv-form [hidden] { display: none !important; }
#tc-tv-verbinden:disabled { opacity: .5; cursor: not-allowed; }
@media (max-width: 640px) {
	.tc-tv-karte-kopf { flex-direction: column; align-items: flex-start; }
}
@media (prefers-reduced-motion: reduce) {
	.tc-tv-karte { transition: none; }
}

/* 03.10.2026: Koop Tarif/Paket - Eingabefeld fuer einen neuen Tarif unter der Auswahlliste */
.tc-kp-formfeld .tc-kp-tarif-neu { margin-top: 6px; }
.tc-kp-formfeld .tc-kp-tarif-neu[hidden] { display: none !important; }

/* 03.10.2026: Mein Profil - drei zentrale Aktionen (Profil bearbeiten,
   Kennwort aendern, Einstellungen) und Sprungleiste der Seite Einstellungen. */
.tc-profil-aktionen { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; margin: 0 0 var(--spacing-md, 14px); }
.tc-profil-aktion {
	display: grid;
	grid-template-columns: auto 1fr;
	align-items: center;
	column-gap: 12px;
	padding: 16px 18px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--radius-medium);
	background: var(--color-surface);
	color: var(--color-text);
	font: inherit;
	font-size: 1.05rem;
	font-weight: 700;
	text-align: left;
	text-decoration: none;
	cursor: pointer;
	transition: border-color var(--tc-ui-dauer, .15s) ease, box-shadow var(--tc-ui-dauer, .15s) ease, transform var(--tc-ui-dauer, .15s) ease;
}
.tc-profil-aktion .tc-icon { grid-row: span 2; width: 26px; height: 26px; padding: 9px; border-radius: 50%; background: color-mix(in srgb, var(--color-primary) 12%, transparent); color: var(--color-primary); }
:root[data-theme="dunkel"] .tc-profil-aktion .tc-icon { color: #8FA7F2; }
.tc-profil-aktion small { grid-column: 2; font-size: .82rem; font-weight: 400; color: var(--color-text-muted); }
.tc-profil-aktion:hover { border-color: var(--color-primary); box-shadow: var(--tc-ui-hebung, var(--shadow-small)); transform: translateY(-1px); color: var(--color-text); text-decoration: none; }
.tc-profil-aktion:focus-visible { outline: none; box-shadow: var(--tc-ui-fokusring, 0 0 0 3px var(--color-primary)); }
.tc-einst-nav { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 var(--spacing-md, 14px); }
.tc-einst-nav a { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border: 1px solid var(--color-border-strong); border-radius: 999px; background: var(--color-surface); color: var(--color-text); font-weight: 600; text-decoration: none; }
.tc-einst-nav a:hover { border-color: var(--color-primary); color: var(--color-primary); text-decoration: none; }
.tc-einst-nav a:focus-visible { outline: none; box-shadow: var(--tc-ui-fokusring, 0 0 0 3px var(--color-primary)); }
.tc-einst-zahl { min-width: 20px; padding: 0 6px; border-radius: 999px; background: var(--color-background); font-size: .8rem; text-align: center; }
.tc-konfig-karte { scroll-margin-top: 170px; }
.tc-einst-reset-liste { list-style: none; margin: 8px 0 0; padding: 0; }
.tc-einst-reset-liste li { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 0; border-top: 1px solid var(--color-border); }
@media (prefers-reduced-motion: reduce) { .tc-profil-aktion { transition: none; } .tc-profil-aktion:hover { transform: none; } }
.tc-profil-aktion:not(:has(small)) .tc-icon { grid-row: auto; }
.tc-einst-gitter { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); grid-auto-flow: row dense; gap: var(--spacing-md, 14px); align-items: start; max-width: 1200px; }
.tc-einst-gitter > .tc-form-card { max-width: none; margin: 0; }
.tc-einst-gitter > .tc-einst-voll { grid-column: 1 / -1; }
@media (max-width: 900px) { .tc-einst-gitter { grid-template-columns: 1fr; } }
/* 03.10.2026 (Nutzerfund): <button class="tc-profil-aktion"> erbte beim Hover
   den dunkelblauen Hintergrund der globalen Regel "button:hover" bei dunkler
   Schrift -> unlesbar. Eigene Buttons muessen bei :hover/:active Hintergrund
   UND Schriftfarbe selbst setzen. */
.tc-profil-aktion:hover,
.tc-profil-aktion:active,
.tc-profil-aktion:focus-visible { background-color: var(--color-surface); color: var(--color-text); }

/* ==========================================================================
   Hover-Kontrast-Korrekturen (03.10.2026, Nutzerfund "Buttons bei Hover mit
   schwarzer Schrift, nicht lesbar" - wiederkehrender Fehler).
   URSACHE: zwei alte globale Regeln weiter oben in dieser Datei:
     button:hover { background-color: var(--color-primary-dark) }   (Schrift bleibt!)
     a:hover      { background-color: var(--color-primary); color: #FFF }
   Eigene Klassen, deren :hover nur Schrift ODER nur Hintergrund setzt,
   kombinieren sich damit zu unlesbaren Paaren (dunkel auf dunkel bzw.
   weiss auf hell / blau auf blau).
   REGEL FUER NEUE KOMPONENTEN: eigene Buttons/Link-Buttons setzen bei
   :hover (und :active) IMMER background-color UND color selbst.
   Pruefwerkzeug: docker/tests/hover_kontrast_pruefung.js (Browser-Konsole).
   ========================================================================== */
.tc-statusleiste-schliessen:hover,
.tc-kennwort-sichtbar-btn:hover { background: none; color: var(--color-text); }
.tc-log-meine-btn:not(.tc-log-meine-btn--active):hover { background-color: var(--color-surface); color: var(--color-text); }
.tc-filter-multiselect-trigger:hover { background-color: var(--color-surface); color: var(--color-text); }
.tc-history-view-btn:not(.tc-history-view-btn--active):hover { background-color: var(--color-background); color: var(--color-text); }
.tc-history-chip:not(.tc-history-chip--active):hover { background-color: var(--color-surface); color: var(--color-text); }
.tc-log-sort-richtung-btn:hover { background-color: var(--color-surface); color: var(--color-primary); }
.tc-admin-aktion-link:hover,
.tc-admin-aktion-link--loeschen:hover { background-color: transparent; }
.button-secondary:hover { color: var(--color-text); }
button.SchnellButton:not(.sidebar-action-primary):hover { background-color: var(--color-background); color: var(--color-text); border-color: var(--color-primary); }
:root[data-theme="dunkel"] .tc-log-sort-richtung-btn:hover { color: #8FA7F2; }

/* 03.10.2026: Administration > Responsive Vorschau (administration/responsive_vorschau/,
   js/tc-responsive-vorschau.js) - neue Klassen, keine Aenderung bestehender Komponenten. */
.tc-rv-leiste { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px 12px; margin: 0 0 10px; padding: 12px; border: 1px solid var(--color-border); border-radius: var(--radius-medium); background: var(--color-surface); }
.tc-rv-feld { display: flex; flex-direction: column; gap: 3px; font-size: .82rem; font-weight: 600; color: var(--color-text-muted); }
.tc-rv-feld input { min-height: 36px; padding: 6px 10px; font-size: .95rem; width: 96px; box-sizing: border-box; }
.tc-rv-feld--url { flex: 1 1 280px; }
.tc-rv-feld--url input { width: 100%; }
.tc-rv-geraete { display: flex; flex-wrap: wrap; gap: 6px; }
.tc-rv-geraet { min-height: 36px; padding: 6px 12px; border: 1px solid var(--color-border-strong); border-radius: 999px; background-color: var(--color-surface); color: var(--color-text); font: inherit; font-size: .88rem; font-weight: 600; cursor: pointer; }
.tc-rv-geraet:hover, .tc-rv-geraet:active { background-color: var(--color-background); color: var(--color-text); border-color: var(--color-primary); }
.tc-rv-geraet--aktiv, .tc-rv-geraet--aktiv:hover { background-color: var(--tc-ui-akzentflaeche, var(--color-primary)); border-color: var(--tc-ui-akzentflaeche, var(--color-primary)); color: #FFF; }
.tc-rv-geraet:focus-visible { outline: none; box-shadow: var(--tc-ui-fokusring, 0 0 0 3px var(--color-primary)); }
.tc-rv-schalter { display: inline-flex; align-items: center; gap: 6px; min-height: 36px; font-weight: 600; }
.tc-rv-info { margin: 0 0 8px; font-weight: 700; }
.tc-rv-buehne { position: relative; overflow: hidden; padding: 12px; border-radius: var(--radius-medium); background: repeating-linear-gradient(45deg, var(--color-background), var(--color-background) 10px, var(--color-surface) 10px, var(--color-surface) 20px); border: 1px solid var(--color-border); }
.tc-rv-rahmen { transform-origin: 0 0; box-shadow: 0 6px 24px rgba(0, 0, 0, .25); border-radius: 6px; overflow: hidden; background: #FFF; }
.tc-rv-rahmen iframe { display: block; border: 0; background: #FFF; }
