/* ============================================================
 * KCS Medical — Custom Chatwoot Branding & UI Overrides
 * ============================================================
 * Wird via Nginx sub_filter in das Chatwoot-Dashboard injiziert.
 *
 * Chatwoot v4.10.1 nutzt Radix Colors + Tailwind mit
 * hardcodierten Farbwerten (rgb(39, 129, 246) = Chatwoot-Blau).
 * Die --blue-* CSS-Variablen decken nur Utility-Klassen ab,
 * .bg-n-brand etc. sind zur Build-Zeit kompiliert.
 *
 * Strategie: Beide Ebenen überschreiben:
 * 1. --blue-* Variablen (fuer Utility-Klassen)
 * 2. .bg-n-brand etc. direkt (fuer kompilierte Tailwind-Klassen)
 *
 * BEI CHATWOOT-UPDATE PRUEFEN:
 * 1. Dashboard oeffnen -> Farben korrekt (Orange)?
 * 2. DevTools -> .bg-n-brand Background-Color pruefen
 * 3. Neue Farbklassen suchen die nicht ueberschrieben werden
 * ============================================================ */

/* --- KCS Medical Brand Color: #fa851e (Orange) --- */
/* RGB-Kanaele: 250 133 30 */

/* 1. Radix --blue-* Variablen ueberschreiben (Utility-Klassen) */
:root {
  --blue-9: 250 133 30;   /* Primaer — war 39 129 246 */
  --blue-10: 224 118 15;  /* Hover — war 21 116 231 */
  --blue-11: 253 181 118; /* Text on dark bg */
  --blue-12: 254 224 194; /* Lightest text */
}

/* 2. Kompilierte Tailwind-Klassen direkt ueberschreiben */

/* Primaer-Buttons (Einloggen, Senden, etc.) */
.bg-n-brand,
.checked\:bg-n-brand:checked,
.indeterminate\:bg-n-brand:indeterminate,
.before\:bg-n-brand::before {
  background-color: #fa851e !important;
}

.hover\:enabled\:brightness-110:enabled:hover {
  filter: brightness(1.1);
}

/* Hover-States */
.hover\:bg-n-brand\/80:hover {
  background-color: rgba(250, 133, 30, 0.8) !important;
}

.hover\:bg-n-brand\/10:hover,
.hover\:enabled\:bg-n-brand\/20:enabled:hover {
  background-color: rgba(250, 133, 30, 0.1) !important;
}

/* Focus-States */
.focus-visible\:bg-n-brand\/20:focus-visible {
  background-color: rgba(250, 133, 30, 0.2) !important;
}

/* Transparente Brand-Hintergruende (nur Light Mode!)
 * WICHTIG: !important ueberschreibt sonst dark:bg-n-background auf der Login-Seite
 * und erzeugt einen Orange-Tint im Dark Mode.
 * .dark wird von Tailwind auf <html> gesetzt (Selector Strategy).
 * MUSS html:not(.dark) sein — ":not(.dark)" allein matched <body> als Vorfahren! */
html:not(.dark) .bg-n-brand\/5 {
  background-color: rgba(250, 133, 30, 0.05) !important;
}

html:not(.dark) .bg-n-brand\/10 {
  background-color: rgba(250, 133, 30, 0.1) !important;
}

/* Dark Mode Varianten */
.dark\:bg-n-brand\/10:is(.dark *) {
  background-color: rgba(250, 133, 30, 0.1) !important;
}

.dark\:bg-n-brand\/20:is(.dark *) {
  background-color: rgba(250, 133, 30, 0.2) !important;
}

.dark\:bg-n-brand\/30:is(.dark *) {
  background-color: rgba(250, 133, 30, 0.3) !important;
}

.dark\:checked\:bg-n-brand:checked:is(.dark *) {
  background-color: #fa851e !important;
}

/* Focus-Ring / Outline in Brand-Farbe */
.focus\:outline-n-brand:focus,
.dark\:focus\:outline-n-brand:focus:is(.dark *) {
  outline-color: #fa851e !important;
}

/* --- Chatwoot Branding ausblenden --- */
.branding--footer,
.brand-name,
[class*="branding"] {
  display: none !important;
}

/* --- FOUC-Prevention: Component-level .dark Wrapper verstecken ---
 * Vue-Komponenten (z.B. Login-Seite) rendern mit eigener "dark"-Klasse
 * auf einem Wrapper-Div, unabhaengig von <html>. Unser Inline-Script
 * entfernt .dark von <html> sofort, aber Vue-Komponenten erst per
 * setInterval (~100ms). Ohne dieses CSS blitzt der dunkle Kasten kurz auf.
 *
 * visibility:hidden verhindert das Aufblitzen, behaelt aber das Layout.
 * Sobald JS .dark vom Wrapper entfernt, matched der Selektor nicht
 * mehr und das Element wird automatisch sichtbar.
 *
 * NUR aktiv wenn html KEIN .dark hat (= Light Mode). Im Dark Mode
 * werden .dark-Wrapper normal gerendert. */
html:not(.dark) .dark {
  visibility: hidden;
}

/* --- Custom Font (optional, deaktiviert) --- */
/*
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
body, .app-wrapper {
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;
}
*/

/* --- Sidebar Logo ersetzen (optional, deaktiviert) --- */
/*
.sidebar .logo--thumbnail {
  background-image: url('/kcs-logo.svg') !important;
  background-size: contain !important;
}
*/

/* ============================================================
 * UI-Element Hiding — Snoozed-Status ausblenden
 * ============================================================
 * KCS Medical nutzt nur Agent (open) und Zoe (pending).
 * Snoozed-Status wird nicht verwendet und wird ausgeblendet.
 *
 * STRATEGIE:
 * CSS allein kann keine Elemente nach Text-Inhalt verstecken.
 * Chatwoot v4.10.1 rendert Status-Filter als <button> ohne
 * data-Attribute, daher ist JS-basiertes Hiding notwendig.
 *
 * CSS Pre-Hiding (hier): Verhindert kurzes Aufblitzen (FOUC)
 * fuer Elemente mit bekannten Selektoren.
 * JS Hiding (kcs-overrides.js): Text-basiertes Matching fuer
 * alle dynamischen Elemente per MutationObserver.
 *
 * BEI CHATWOOT-UPDATE PRUEFEN:
 * 1. Pruefen ob neue Snooze-Buttons an anderen Stellen erscheinen
 * 2. Fluent-Icon-Namen validieren (snooze, alarm-clock-minus)
 * 3. kcs-overrides.js Textmuster ggf. anpassen
 * ============================================================ */

/* Kontext-Menu: Snooze-Option hat fluent-icon "snooze" */
/* MenuItem-Container ist Eltern von fluent-icon[icon="snooze"] */
.menu:has(fluent-icon[icon="snooze"]) {
  display: none !important;
}

/* Kontext-Menu: Trennlinie vor Snooze-Option (optional, wird per JS bereinigt) */

/* ============================================================
 * Navigation-Hiding — Ungenutzte Menuepunkte ausblenden
 * ============================================================
 * KCS Medical nutzt Mentions, Captain, Help Center sowie die
 * persoenliche "Inbox" und die vordefinierten Konversations-
 * Ansichten ("Alle Konversationen" / "Unbeaufsichtigt") nicht.
 * Diese Sidebar-Eintraege werden per CSS :has() ausgeblendet.
 *
 * HINTERGRUND (KCS-103): Die Ansichten "Inbox", "Alle
 * Konversationen", "Erwaehnungen" und "Unbeaufsichtigt" zeigen
 * Konversationen nur temporaer an — sobald eine Konversation
 * woanders gelesen oder neu zugewiesen wird, "verschwindet" sie
 * aus diesen Listen. Das verwirrt (Bewerbungen scheinbar weg).
 * Auffindbar bleiben uebergebene Bewerbungen ueber die Team-
 * Filter (SIDEBAR.CUSTOM_VIEWS_FOLDER, in "Gespraeche" umbenannt).
 *
 * Die uebergeordnete "Gespraeche"-Gruppe (i-lucide-message-circle)
 * bleibt erhalten — sie ist der Container/Expander fuer die
 * weiterhin genutzten Unterpunkte Filter, Teams, Kanaele, Labels.
 *
 * WARUM NUR CSS (kein JS wie beim Snooze-Hiding):
 * Sidebar-Elemente sind statisch im DOM ab dem initialen Render.
 * CSS :has() ist deklarativ und greift automatisch bei Re-Renders.
 * Snooze brauchte JS wegen dynamischer Dropdowns/Modals/Shadow DOM.
 *
 * HINWEIS: Nur visuelles Hiding! Routen sind weiterhin per URL
 * erreichbar. Fuer echte Zugriffskontrolle: Feature Flags nutzen.
 *
 * COLLAPSED SIDEBAR: Captain, Help Center (Icon-Match) und Inbox
 * (href-Match, Struktur li > div.relative > a) werden auch im
 * eingeklappten Modus versteckt.
 * Die Konversations-Ansichten liegen im Collapsed-Popover
 * (Teleport-DOM) — dort bleiben sie sichtbar, niedriger Impact
 * (kleines Team). Im Expanded-Modus (Default) sind sie versteckt.
 *
 * ACHTUNG Icon-Anker allgemein: Icons sind in der Sidebar NICHT
 * eindeutig (i-lucide-inbox: Top-Level-Inbox + Settings-Posteingaenge;
 * i-woot-captain: Captain-Gruppe + upstream auskommentierter
 * Settings-Captain-Leaf). Neue Hiding-Regeln daher bevorzugt via
 * href-Endung (Route) ankern, Icon-Match nur eng gescoped (> div).
 *
 * BEI CHATWOOT-UPDATE PRUEFEN:
 * 1. i-woot-captain nur an der Captain-Gruppe? Rendert der Gruppen-
 *    Header (ohne "to") weiterhin als direktes div-Kind des li
 *    (Expanded) bzw. li > div.relative (Collapsed)? Wurde der
 *    auskommentierte "Settings Captain"-Eintrag reaktiviert?
 * 2. i-lucide-library-big Icon-Klasse noch vorhanden und nur am
 *    Help-Center-Top-Level (nicht in Settings-Kindern)?
 * 3. Route-Pfad "inbox-view" (Top-Level "Meine Inbox") stabil?
 * 4. child-item CSS-Klasse auf SidebarGroupLeaf.vue?
 * 5. Sidebar-Struktur: nav > ul > li Hierarchie intakt?
 * 6. Rendert SidebarGroupLeaf die Leaves weiterhin als <a href>
 *    (router-link), nicht als <div>/Custom-Link ohne href?
 *    Sonst greifen die drei href-Regeln unten lautlos nicht mehr.
 * 7. Router-Link href-Segmente stabil: "/mentions",
 *    "/unattended/conversations", "All"-Leaf endet weiterhin auf
 *    "/dashboard" (route "home", Account-Root-Redirect)?
 *    Die "/dashboard"-Endung ist die fragilste Regel — Upstream
 *    hat den Root-Redirect-Pfad in der Vergangenheit geaendert.
 * ============================================================ */

/* Inbox (Top-Level, "Meine Inbox") — via URL-Pattern (Route "inbox_view").
 * Nachfahren-Match OHNE ">"-Anker vor dem <a>: Expanded rendert
 * li > a (SidebarGroupHeader, router-link als Root), Collapsed
 * li > div.relative > a — der Nachfahren-Match deckt beide Modi ab.
 *
 * BEWUSST NICHT mehr via .i-lucide-inbox (Bugfix 2026-07-03):
 * Dasselbe Icon haengt auch am Settings-Unterpunkt "Posteingaenge"
 * ("Settings Inboxes", Sidebar.vue). SidebarGroup rendert die
 * Settings-Kinder per v-show — sie sind fuer Administratoren IMMER
 * im DOM (auch zugeklappt), und :has() matcht auch display:none-
 * Elemente. Der Icon-Match versteckte daher das komplette
 * "Einstellungen"-Menue fuer Admins (Agents unbetroffen: ohne
 * zugreifbare Settings-Kinder rendert SidebarGroup das gesamte
 * Settings-li gar nicht erst, Root-v-if hasAccessibleChildren —
 * darum blieb der Bug beim Test als Agent unsichtbar). Auf Chatwoot
 * develop traegt zusaetzlich "All Conversations" i-lucide-inbox —
 * der Icon-Match wuerde nach einem Update die ganze "Gespraeche"-
 * Gruppe fuer ALLE User verstecken. */
nav > ul > li:has(a[href$="/inbox-view"]) {
  display: none !important;
}

/* "Alle Konversationen" (Kind von Gespraeche) — via URL-Pattern */
/* Route "home" => href endet auf "/dashboard". Endungsanker ($=)  */
/* verhindert Fehltreffer auf andere Pfade, die "/dashboard" enthalten. */
li.child-item:has(> a[href$="/dashboard"]) {
  display: none !important;
}

/* "Erwaehnungen" (Kind von Gespraeche) — via URL-Pattern */
/* Sprachunabhaengig: router-link href enthaelt immer "/mentions" */
li.child-item:has(> a[href*="/mentions"]) {
  display: none !important;
}

/* "Unbeaufsichtigt" (Kind von Gespraeche) — via URL-Pattern */
li.child-item:has(> a[href*="/unattended/conversations"]) {
  display: none !important;
}

/* "Beteiligt" (Kind von Gespraeche) — via URL-Pattern (KCS-124)
 * Route "conversation_participating" => href-Segment
 * "/participating/conversations". In vanilla v4.11.1 rendert die
 * Next-Sidebar diesen Leaf NICHT (kein menuItems-Eintrag), die Route
 * existiert aber (conversation.routes.js). Regel ist defensiv: greift
 * lautlos, falls der Eintrag (wieder) erscheint — analog Mentions. */
li.child-item:has(> a[href*="/participating/conversations"]) {
  display: none !important;
}

/* ============================================================
 * SubGroup-Zwischenueberschriften ausblenden (KCS-124)
 * ============================================================
 * Die Next-Sidebar rendert innerhalb der "Gespraeche"-Gruppe
 * mehrere SubGroups (Folders, Teams, Kanaele, Labels). Jede
 * SubGroup hat eine nicht-interaktive Zwischenueberschrift
 * (SidebarGroupSeparator.vue): ein <div ... text-n-slate-10
 * select-none pointer-events-none> mit Icon-<span> + Label.
 *
 * 1) "Gespraeche"-Zeile (Folders-Separator): Der Folders-SubGroup-
 *    Kopf traegt den umbenannten Label CUSTOM_VIEWS_FOLDER
 *    ("Gespraeche", KCS-103) + i-lucide-folder. Direkt unter dem
 *    Top-Level-"Gespraeche"-Header ist er redundant -> ausblenden.
 *    Nur der Separator wird versteckt, die Folder-Kinder (All,
 *    Team-Filter etc.) bleiben sichtbar.
 *
 * 2) "Kanaele" (Channels-SubGroup): Separator (i-lucide-mailbox)
 *    UND die direkt folgende Kinder-<ul> (Inbox-Leaves) ausblenden.
 *    Anders als Top-Level-Gruppen hat ein SubGroup KEIN
 *    umschliessendes <li> — Separator und Kinder-<ul> sind
 *    Geschwister (SidebarSubGroup.vue). Daher zwei Selektoren:
 *    der Separator via :has(> Icon) und die Liste via "+ ul".
 *    Zusaetzlich blenden wir die Inbox-Leaves per href-Muster aus
 *    ("/inbox/:id", Route inbox_dashboard) — das ist der robuste
 *    Fallback, falls "+ ul" bricht: Ist eine Inbox vorhanden, aber
 *    fuer den Agenten nicht zugreifbar, entfernt SidebarSubGroup den
 *    Separator per v-if (hasAccessibleItems=false) und der "+ ul"-
 *    Anker faellt weg. Das href-Muster trifft die Leaves direkt.
 *    Abgrenzung: Die Top-Level-"Meine Inbox" nutzt "/inbox-view"
 *    (kein Treffer), Reports→Posteingang "inboxes_overview" (kein
 *    Treffer) — nur Kanal-Inboxes matchen "/inbox/".
 *
 * WARUM :has(> .i-lucide-*): Der Separator rendert das Icon als
 * DIREKTES Kind-<span> (Icon.vue mit class="size-4"). pointer-
 * events-none grenzt sicher gegen interaktive Leaves ab; der
 * Scroll-Gradient-Div in SidebarSubGroup traegt zwar auch
 * pointer-events-none, aber KEIN i-lucide-Icon -> kein Fehltreffer.
 *
 * BEI CHATWOOT-UPDATE PRUEFEN:
 * 1. Rendert SidebarGroupSeparator weiterhin <div ... pointer-
 *    events-none> mit dem Icon als direktem Kind?
 * 2. Icon-Klassen stabil: Folders=i-lucide-folder,
 *    Kanaele=i-lucide-mailbox?
 * 3. Kanaele: Bleibt die Kinder-<ul> der direkte naechste
 *    Geschwister-Knoten des Separators ("+ ul")? Bleibt das
 *    Inbox-href-Muster "/inbox/:id" (Route inbox_dashboard)?
 * ============================================================ */

/* "Gespraeche"-Zwischenueberschrift (Folders-Separator) ausblenden */
nav .pointer-events-none:has(> .i-lucide-folder) {
  display: none !important;
}

/* "Kanaele"-SubGroup: Zwischenueberschrift + Inbox-Kinderliste ausblenden */
nav .pointer-events-none:has(> .i-lucide-mailbox),
nav .pointer-events-none:has(> .i-lucide-mailbox) + ul {
  display: none !important;
}

/* Kanal-Inbox-Leaves zusaetzlich per href (robuster Fallback, s.o.) */
nav li.child-item:has(> a[href*="/inbox/"]) {
  display: none !important;
}

/* Captain (Top-Level) — via Icon im direkten Header-Kind (> div).
 * Expanded: Gruppen-Header ohne "to" rendert als div (direktes
 * li-Kind, Icon darin); Collapsed: li > div.relative > button > Icon
 * — beide Modi abgedeckt. Der "> div"-Anker ist die Haertung gegen
 * den i-lucide-inbox-Bugmechanismus (s.o.): Upstream liegt ein
 * auskommentierter "Settings Captain"-Leaf mit i-woot-captain
 * (Sidebar.vue). Reaktiviert laege dessen Icon unter li > ul > ...
 * — ein ungescoped :has() wuerde dann wieder das komplette
 * "Einstellungen"-Menue verstecken. Mit "> div" matcht nur der
 * Gruppen-Header; Fail-Mode ist offen (Captain wird sichtbar),
 * nicht destruktiv (fremdes Menue verschwindet). */
nav > ul > li:has(> div .i-woot-captain) {
  display: none !important;
}

/* Help Center (Top-Level) — via Icon im direkten Header-Kind (> div).
 * Gleiche Haertung wie Captain (s.o.): Die Portals-Gruppe hat wie
 * Captain kein "to" + children -> Expanded li > div, Collapsed
 * li > div.relative > button. Aktuell ist i-lucide-library-big zwar
 * nur 1x vergeben, der "> div"-Anker schuetzt aber praeventiv gegen
 * kuenftige Icon-Wiederverwendung in Settings-Kindern (Policy oben:
 * Icon-Match nur eng gescoped). */
nav > ul > li:has(> div .i-lucide-library-big) {
  display: none !important;
}

/* ============================================================
 * Icon-Override: "Ordner/Filter" Sidebar-Icon ersetzen
 * ============================================================
 * Chatwoot v4.11.1 nutzt i-lucide-folder fuer das "Folders"
 * SubGroup in der Gespraeche-Sidebar. KCS Medical benennt
 * diesen Punkt in "Gespraeche" um (via i18n-Patch, KCS-103) und
 * ersetzt das Ordner-Icon durch das Lucide "funnel" Icon.
 * (Der Punkt buendelt die vordefinierten Team-Filter — nach dem
 * Ausblenden der Standard-Ansichten die zentrale Konversations-
 * liste, ueber die uebergebene Bewerbungen auffindbar bleiben.)
 *
 * Technik: @egoist/tailwindcss-icons generiert Mask-Mode-CSS
 * mit --svg Custom Property. Wir ueberschreiben nur --svg,
 * alle anderen Properties (mask-image, background-color etc.)
 * bleiben intakt.
 *
 * Scope: nav-Selektor begrenzt Override auf Sidebar.
 * i-lucide-folder wird nur in Sidebar.vue verwendet (1 Stelle).
 *
 * BEI CHATWOOT-UPDATE PRUEFEN:
 * 1. Wird i-lucide-folder noch fuer Folders verwendet?
 * 2. Liegt die Sidebar noch in einem <nav>?
 * 3. Nutzt Tailwind-Icons noch --svg Custom Property?
 * ============================================================ */
nav .i-lucide-folder {
  --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z'/%3E%3C/svg%3E") !important;
}

/* ============================================================
 * "Kontakt blockieren/entsperren" im Konversations-Dropdown
 * ============================================================
 * MoreActions.vue: 3-Punkt-Menu in der Konversation-Header-Leiste.
 * Chatwoot nennt die Mute-Funktion irrefuehrend "Block Contact"
 * / "Kontakt blockieren". Lt. Meeting-Beschluss wird der Button
 * komplett versteckt — nur "Transkript senden" bleibt.
 *
 * Icon-Klassen: i-lucide-volume-off (mute) / i-lucide-volume-1 (unmute)
 * Scope: .actions--container (einmalig in MoreActions.vue)
 * Pattern: Gleich wie Captain/Help-Center Hiding (icon-basiert)
 *
 * BEI CHATWOOT-UPDATE PRUEFEN:
 * 1. .actions--container Klasse noch in MoreActions.vue?
 * 2. Icon-Klassen i-lucide-volume-off / i-lucide-volume-1 noch korrekt?
 * 3. DropdownMenu rendert Items noch als <button>?
 * ============================================================ */
.actions--container button:has(.i-lucide-volume-off),
.actions--container button:has(.i-lucide-volume-1) {
  display: none !important;
}

/* ============================================================
 * KCS-62: Max. 1 Label pro Konversation (Sidebar, kosmetisch)
 * ============================================================
 * Nach dem Setzen des ersten Konversations-Labels soll kein
 * zweites hinzugefuegt werden (konsistente Klassifikation:
 * 1 Konversation = genau 1 Kategorie "Bewerber"/"Mitarbeiter"/
 * "Kunde"). Umsetzung: Sobald >=1 Label gesetzt ist, wird der
 * "Label hinzufuegen"-Trigger ausgeblendet.
 *
 * KORREKTUR BLEIBT MOEGLICH: Das Entfernen-X (.label-close--button)
 * am Label-Chip bleibt sichtbar -> Label wechseln = erst entfernen
 * (X), dann neu setzen (Add-Button erscheint bei 0 Labels wieder).
 *
 * Bedingung ">=1 Label" = .label-wrap:has(.label). Die Klasse
 * .label haengt NUR an gesetzten Label-Chips, nie am Add-Trigger
 * (<button>) oder am Dropdown-Panel (<div>) — live verifiziert
 * gegen v4.14.1 (DOM: .label-wrap > button[Add] + div.label[Chip]
 * + div[Panel, geschlossen .hidden]).
 *
 * SCOPE-HINWEIS (bewusst kosmetisch, Ticket-Scope "Frontend"):
 * Greift NUR in der Konversations-Sidebar. NICHT abgedeckt
 * (technisch umgehbar): Command Bar (Cmd+K, Shadow DOM),
 * Rechtsklick-Kontextmenue & Bulk-Aktionen (additive API),
 * sowie REST-API/n8n/Automation Rules/Mobile-App. Zoe (n8n)
 * setzt Labels via API (Replace-Semantik) und ist NICHT betroffen.
 *
 * BEI CHATWOOT-UPDATE PRUEFEN (aktuell: v4.14.1-ce):
 * 1. .label-wrap Container in LabelBox.vue noch vorhanden?
 * 2. Gesetzte Labels noch als Kind div.label gerendert?
 * 3. Add-Trigger noch <button> mit <span class="i-lucide-plus">?
 * 4. Dropdown-Panel noch direktes div-Kind (geschlossen .hidden)?
 * 5. Sidebar noch ueber Legacy LabelBox.vue (nicht components-next)?
 * ============================================================ */

/* 1. "Label hinzufuegen"-Button ausblenden sobald >=1 Label gesetzt.
 *    Auf .label-wrap gescoped -> trifft NICHT die anderen 2 globalen
 *    .i-lucide-plus-Vorkommen (live verifiziert: 1 Treffer). */
.label-wrap:has(.label) > button:has(.i-lucide-plus) {
  display: none !important;
}

/* 2. Dropdown-Panel ebenfalls unterdruecken. Schliesst das Loch,
 *    dass das Label-Dropdown per Tastatur-Shortcut "L" (v4.14.1)
 *    trotz verstecktem Button geoeffnet werden koennte.
 *    Anker: das Panel ist das einzige absolut positionierte
 *    direkte div-Kind (Overlay). div.absolute:not(.label) trifft
 *    NUR das Panel — Chips (.label) und Add-Button (kein div)
 *    bleiben unberuehrt, und ein evtl. kuenftiges Inline-div
 *    (z.B. Hinweis/Fehler) wird nicht kollateral versteckt.
 *    FALLBACK falls Panel mal kein .absolute mehr traegt:
 *    auf ".label-wrap:has(.label) > div:not(.label)" ausweichen. */
.label-wrap:has(.label) > div.absolute:not(.label) {
  display: none !important;
}

/* ============================================================
 * KCSZ-101: "Schliessen" aus dem Konversations-Kontextmenue
 * ============================================================
 * Rechtsklick auf eine Konversation in der Konversationsliste
 * oeffnet das Karten-Kontextmenue (contextMenu/Index.vue). Dort
 * lag bisher "Schliessen" (= Status resolved) direkt neben
 * "An Zoe uebergeben" — Recruiter klickten versehentlich darauf.
 *
 * FOLGE (Ticket-Begruendung): Eine geschlossene Konversation wird
 * bei der naechsten Bewerber-Nachricht nicht wieder aufgemacht,
 * sondern Chatwoot legt eine NEUE Konversation am selben Kontakt
 * an -> derselbe Bewerber taucht mehrfach in der Liste auf.
 *
 * SCOPE: Nur dieser eine Menuepunkt. Das Schliessen bleibt ueber
 * den bewussten Weg im Konversations-Header erreichbar
 * (ResolveAction.vue, "Schliessen"-Button) — dort ist es eine
 * gezielte Aktion, kein Fehlklick im Rechtsklick-Menue.
 *
 * ACHTUNG — HAEUFIGE FEHLANNAHME (hier einmal reingelaufen):
 * `<fluent-icon icon="checkmark">` im Vue-Template ist KEIN
 * HTML-Element, sondern eine global registrierte Vue-Komponente
 * (entrypoints/dashboard.js Z.95 -> FluentIcon/DashboardIcon.vue).
 * Im fertigen DOM existiert weder das Tag <fluent-icon> noch ein
 * icon-Attribut — gerendert wird ausschliesslich:
 *   <svg width="14" height="14" viewBox="0 0 24 24" class="flex-shrink-0">
 *     <path d="M4.53 12.97a…" fill="currentColor" />
 *   </svg>
 * Ein Selektor auf `fluent-icon[icon=…]` matcht daher NIE.
 * (Aus demselben Grund ist die Snooze-CSS-Regel weiter oben tot —
 *  das Snooze-Hiding leistet faktisch allein das JS per Text-Match.)
 *
 * SELEKTOR-HERLEITUNG (gegen das GERENDERTE DOM, nicht das Template):
 * menuItem.vue erzeugt pro Eintrag
 *   <div class="menu …" role="button">
 *     <svg …><path d="…"/></svg>
 *     <p class="menu-label">Schliessen</p>
 *   </div>
 * Einzige verlaessliche Icon-Kennung im DOM ist der SVG-Pfad.
 *
 * WARUM DIESER SELEKTOR KEINE FEHLTREFFER ERZEUGT — 3 Anker:
 * 1. `.menu[role="button"]`: Die Klasse "menu" existiert in
 *    v4.14.1 an 4 Stellen, aber nur menuItem.vue setzt zusaetzlich
 *    role="button". Die anderen drei (DropdownMenu.vue,
 *    MentionBox.vue, TagAgents.vue) sind <ul class="dropdown menu
 *    vertical">-Container ohne role.
 * 2. `> svg > path` (direkte Kinder): Haelt auch dann, falls eine
 *    der <ul>-Varianten spaeter role="button" bekaeme — deren
 *    direkte Kinder sind <li>, nie ein <svg>.
 * 3. Pfad-Praefix `M4.53 12.97a`: In dashboard-icons.json (204
 *    Icons) traegt ihn ausschliesslich checkmark-outline, und im
 *    Kontextmenue nutzt nur statusMenuConfig[RESOLVED] dieses Icon
 *    (Index.vue Z.103). Das Haekchen an einem bereits zugewiesenen
 *    Label ist kein fluent-icon, sondern <Icon i-lucide-check>
 *    (= <span> mit Mask-CSS, kein <svg><path>) -> unberuehrt.
 *
 * ZWEITER, UNABHAENGIGER WEG: kcs-overrides.js versteckt denselben
 * Eintrag zusaetzlich per Text-Match (gescoped auf
 * div.menu[role="button"] > p.menu-label). Bricht einer der beiden
 * Wege bei einem Update, greift der andere weiter. Beide sind
 * fail-open: im Zweifel wird der Eintrag sichtbar, nie etwas
 * anderes versteckt.
 *
 * KEINE VERWAISTE TRENNLINIE: Die Status-Gruppe zeigt immer
 * mindestens einen weiteren Eintrag — Index.vue blendet per
 * show(key) genau den Eintrag aus, der dem aktuellen Status
 * entspricht, nie zwei. Die <hr> bleibt also nie allein stehen.
 *
 * BEKANNTE LUECKE (bewusst, Ticket-Scope "Kontextmenue"):
 * Command Bar (Cmd+K), Bulk-Aktionen bei Mehrfachauswahl sowie
 * REST-API/n8n koennen weiterhin schliessen. Fuer echte
 * Zugriffskontrolle waeren Rollen/Feature-Flags noetig.
 *
 * BEI CHATWOOT-UPDATE PRUEFEN (aktuell: v4.14.1-ce):
 * 1. Rendert menuItem.vue den Eintrag noch als
 *    <div class="menu" role="button">?
 * 2. Ist das Icon von statusMenuConfig[RESOLVED] noch "checkmark"?
 * 3. Beginnt checkmark-outline in dashboard-icons.json noch mit
 *    "M4.53 12.97a"? (Icon-Set-Update aendert den Pfad!)
 * 4. Rendert Icon.vue weiterhin <svg> mit <path> als direktem Kind?
 * ============================================================ */
.menu[role='button']:has(> svg > path[d^='M4.53 12.97a']) {
  display: none !important;
}
