/* comparxis Website — Layout auf Basis von Styleguide.css */

/* Die Gesamthöhe der Kopfzeile an einer Stelle: 66 + 48 plus je eine
   Trennlinie. Alles, was unter der fixierten Leiste stehenbleiben muss –
   der Kopf des Direktvergleichs, das Sichtprobe-Band, jedes Sprungziel –
   rechnet damit, statt die Zahl an sechs Stellen zu wiederholen. */
:root {
  --cx-kopf: 116px;
  /* LESEBREITE für Fließtext. In ch, nicht in Pixeln: ch ist an die
     Schriftgröße des Elements gebunden, und die reicht hier von 14,5 px
     (Herkunftszeile) bis 18 px (Hero). Eine feste Pixelbreite ergäbe je
     Schriftgröße eine andere Zeichenzahl.

     Gemessen am 10.09.2026: 1ch ist rund 1,35-mal so breit wie ein
     Durchschnittszeichen dieser Schrift – über alle vier verwendeten Größen
     hinweg gleich. 60ch sind damit rund 81 Zeichen je Zeile und liegen im
     Bereich, den Typografen als gut lesbar ansehen (65 bis 90).

     Vorher stand eine Begrenzung nur an .cx-hero-sub (660 px, 76 Zeichen);
     die übrigen Fließtexte liefen über die volle Breite – auf der Startseite
     141 Zeichen je Zeile, bei den Merkmalslisten im Steckbrief bis 166. */
  --cx-lesebreite: 60ch;

  /* Füllfarbe für Knöpfe mit WEISSER Schrift (seit 1.139.1). Nicht --cx-blue:
     Weiss darauf erreicht nur 4,16:1 und liegt damit unter der Schwelle von
     4,5 für Text unter 18,66 px. Gerechnet, nicht geschätzt:
                       weiss drauf   gegen dunkel   gegen hell
       --cx-blue        4,16              4,79         3,81   Text zu schwach
       #1a6fe0          4,78              4,17         4,38   gewählt
       --cx-blue-deep   6,65              2,99         6,10   Fläche zu schwach
     Ein Knopf muss beides können: lesbaren Text tragen UND sich vom Grund
     abheben – in hell wie dunkel. Deshalb der Wert dazwischen. */
  --cx-blue-knopf: #1a6fe0;
}

html {
  /* Sprungziele nicht unter die Kopfzeile schieben: gilt für Anker, für
     scrollIntoView und für den Tastaturfokus gleichermaßen. Deshalb hier am
     Scrollbereich und nicht als scroll-margin an jedem einzelnen Ziel. */
  scroll-padding-top: calc(var(--cx-kopf) + 16px);
  /* PLATZ FÜR DIE SCROLLLEISTE IMMER RESERVIEREN, auch wenn die Seite kurz
     genug ist, um ohne auszukommen. Sonst wird das Fenster in dem Moment um
     die Leistenbreite breiter – auf Windows rund 15 px – und alles Zentrierte
     rutscht um die Hälfte davon zur Seite. Beim Wechsel zwischen einer langen
     und einer kurzen Seite sprang die ganze Oberfläche deshalb seitlich hin
     und her. Auf Systemen mit überlagernden Leisten (macOS-Standard) ändert
     diese Zeile nichts, weil dort ohnehin keine Breite verlorengeht. */
  scrollbar-gutter: stable;
}

main { max-width: 1200px; margin: 0 auto; padding: 0 24px 80px; }

/* --- Kopfzeile: zwei Ebenen ----------------------------------------------
   Oben die Marke mit Suche und Konto, darunter das Navigationsband. Vorher
   teilten sich Menü, Suche und Konto-Kachel eine Zeile; weil nur die
   Navigation schrumpfen durfte, wurde ab etwa 1.150 px immer die Suche
   abgeschnitten. Mit eigener Zeile kann das nicht mehr passieren – und die
   Leiste verträgt weitere Menüpunkte, ohne dass rechts etwas verlorengeht.

   SIE BLEIBT STEHEN. Der Grund ist nicht Bequemlichkeit, sondern ein
   sichtbarer Sprung: Beim Seitenwechsel setzt die Ansicht auf 0 zurück.
   Solange die Leiste mitscrollte, war sie im gescrollten Zustand ein Stück
   nach oben gewandert – wer aus der 24.000 px langen Herstellerliste heraus
   auf „Bereiche“ klickte, sah Logo und Menüband um bis zu 116 px wegrutschen.
   Fixiert stehen beide immer an derselben Stelle. Der Hintergrund muss dabei
   deckend sein, sonst läuft der Inhalt sichtbar durch die Leiste. */
.cx-header {
  display: block;
  position: sticky; top: 0; z-index: 50;
  background: var(--cx-carbon);
}
.cx-kopf-marke { border-bottom: 1px solid var(--cx-border); }
.cx-kopf-navband { background: var(--cx-graphite); border-bottom: 1px solid var(--cx-border); }
.cx-kopf-innen {
  max-width: 1200px; margin: 0 auto; padding: 0 24px;
  display: flex; align-items: center; gap: 20px;
}
.cx-kopf-marke .cx-kopf-innen { height: 66px; }
.cx-kopf-navband .cx-kopf-innen { height: 48px; gap: 0; }
/* Querfassung statt gestapelt: Bei 40 px Gesamthöhe wäre die Wortmarke im
   gestapelten Logo noch rund 7 px hoch – lesbar ist das nicht. */
.cx-logo { height: 40px; width: auto; display: block; }
.cx-logo-link { flex: none; display: block; line-height: 0; }

/* --- Suche: ein Feld, kein Knopf ------------------------------------------
   Getippt wird trotzdem in der Palette – das hier ist ein <button>, der so
   aussieht wie ein Feld. Ein echtes Eingabefeld hätte zwei Sucheingaben auf
   derselben Seite ergeben (die zweite steht in der Herstellerliste) und die
   Frage aufgeworfen, welche wofür zuständig ist. */
.cx-suchfeld {
  flex: 1 1 auto; min-width: 0; max-width: 460px; margin: 0 auto;
  display: flex; align-items: center; gap: 10px; cursor: pointer;
  font-family: var(--cx-font-body); font-size: 14.5px; text-align: left;
  padding: 9px 14px; border-radius: var(--cx-radius-sm);
  color: var(--cx-steel); background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
  transition: border-color .15s, color .15s;
}
.cx-suchfeld:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-suchfeld-text {
  flex: 1 1 auto; min-width: 0; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}
.cx-kopf-navband .cx-suchfeld { background: var(--cx-carbon); }

/* --- Konto als Aufklappmenü -----------------------------------------------
   Zugeklappt 38 px statt der 175 px der alten Kachel; aufgeklappt zeigt es
   mehr als vorher. Der Anmeldestatus bleibt die Antwort auf „warum sehe ich
   hier keine Konditionen?“ – deshalb steht er ganz oben in der Karte und
   nicht als weiterer Menüpunkt daneben. */
.cx-konto { position: relative; flex: none; }
.cx-konto-knopf-haupt {
  display: flex; align-items: center; gap: 9px; cursor: pointer;
  font-family: var(--cx-font-body); color: var(--cx-text);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: 999px; padding: 5px 12px 5px 5px;
  transition: border-color .15s;
}
.cx-konto-knopf-haupt:hover { border-color: var(--cx-blue); }
.cx-konto.offen .cx-konto-knopf-haupt { border-color: var(--cx-blue); }
.cx-avatar {
  position: relative; flex: none; width: 30px; height: 30px; border-radius: 50%;
  display: grid; place-items: center; color: #fff;
  font-family: var(--cx-font-display); font-size: 12px; font-weight: 700;
  background: var(--cx-gradient-flaeche);
}
/* Der Statuspunkt sitzt auf dem Avatar statt daneben – er gehört zur Person,
   nicht in die Zeile. Grün heißt hier „angemeldet“, nicht „gut“. */
.cx-avatar::after {
  content: ''; position: absolute; right: -1px; bottom: -1px;
  width: 10px; height: 10px; border-radius: 50%;
  border: 2px solid var(--cx-carbon); background: var(--cx-steel);
}
.cx-avatar.an::after    { background: #3FD68C; }
.cx-avatar.probe::after { background: var(--cx-warn); }
.cx-avatar.aus { background: var(--cx-border); color: var(--cx-steel); }
.cx-konto-kurz { display: grid; text-align: left; line-height: 1.2; min-width: 0; }
.cx-konto-kurz b { font-size: 13.5px; font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 140px; }
.cx-konto-kurz small { font-size: 11.5px; color: var(--cx-steel); }
.cx-konto-pfeil { font-size: 13px; color: var(--cx-steel); transition: transform .15s; }
.cx-konto.offen .cx-konto-pfeil { transform: rotate(180deg); }
/* Zugeklappt muss man sehen, dass etwas wartet – sonst verstiege das Menü
   genau die Meldung, für die das Neuigkeiten-Feld gedacht ist. */
.cx-konto-marke {
  min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; flex: none;
  display: grid; place-items: center; font-size: 11.5px; font-weight: 700;
  background: var(--cx-blue-flaeche); color: #fff;
}
/* [hidden] muss ausdrücklich stehen: Das Attribut wirkt über display:none aus
   dem Browser-Standard, und jede eigene display-Regel gewinnt dagegen – ohne
   diese Zeile stünde die Karte dauerhaft offen. */
.cx-konto-karte[hidden] { display: none; }
.cx-konto-karte {
  position: absolute; right: 0; top: calc(100% + 9px); width: 310px; z-index: 40;
  display: grid; gap: 12px; padding: 16px 18px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); box-shadow: 0 18px 44px rgba(0,0,0,.5);
}
html[data-theme="light"] .cx-konto-karte { box-shadow: 0 16px 40px rgba(20,23,28,.14); }
.cx-konto-status { display: flex; align-items: flex-start; gap: 10px; }
.cx-konto-punkt {
  flex: none; width: 9px; height: 9px; border-radius: 50%; margin-top: 5px;
}
/* Grün heißt hier tatsächlich „es läuft“ – der einzige Ort auf der Seite, an
   dem eine Ampelfarbe einen Zustand meldet und nicht eine Bewertung. */
.cx-konto-punkt.an  { background: #3FD68C; box-shadow: 0 0 0 3px rgba(63,214,140,.18); }
.cx-konto-punkt.aus { background: var(--cx-steel); box-shadow: 0 0 0 3px rgba(139,146,155,.15); }
.cx-konto-text { display: grid; gap: 1px; min-width: 0; }
.cx-konto-text b { font-size: 14px; }
.cx-konto-mail {
  font-size: 12.5px; color: var(--cx-text-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-konto-rolle { font-size: 11.5px; color: var(--cx-steel); }
.cx-konto-darstellung {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding-top: 12px; border-top: 1px solid var(--cx-border);
}
.cx-konto-label { font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--cx-steel); }
.cx-konto-knoepfe { display: flex; gap: 8px; }
.cx-konto-knopf {
  flex: 1; text-align: center; cursor: pointer; white-space: nowrap;
  font-family: var(--cx-font-body); font-size: 13px; font-weight: 600;
  padding: 8px 12px; border-radius: var(--cx-radius-sm);
  color: var(--cx-text-muted); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
  transition: border-color .15s, color .15s;
}
.cx-konto-knopf:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-konto-knopf.an { border-color: var(--cx-blue); color: var(--cx-blue-light); }
.cx-konto-knopf.aus:hover { border-color: #E06A6A; color: #E06A6A; }
html[data-theme="light"] .cx-konto-knopf.an { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-konto-knopf.aus:hover { border-color: #C0392B; color: #C0392B; }

/* min-width/overflow statt fester Breite: Sobald die Menüpunkte nicht mehr in
   die Zeile passen, scrollt die LEISTE in sich selbst. Ohne das schiebt sie die
   ganze Seite seitlich – zwischen rund 730 und 1050 px war das der Fall, also
   auf jedem Tablet im Hochformat und in jedem halbbreiten Fenster. */
.cx-nav {
  display: flex; align-items: center; gap: 2px;
  min-width: 0; max-width: 100%; height: 100%;
  overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
}
.cx-nav::-webkit-scrollbar { display: none; }
/* Im eigenen Band tragen die Punkte ihre Fläche selbst, statt an einer
   Unterkante zu hängen: Die Bandkante darunter übernimmt die Trennung, eine
   zweite Linie am aktiven Punkt wäre eine Linie zu viel. */
.cx-nav a {
  color: var(--cx-text-muted); font-weight: 600; font-size: 15px;
  padding: 7px 12px; border-radius: var(--cx-radius-sm);
  white-space: nowrap; transition: background .13s, color .13s;
}
.cx-nav a:hover { color: var(--cx-text); background: var(--cx-carbon); }
.cx-nav a.active { color: var(--cx-text); background: var(--cx-carbon); }
/* Trennt öffentlich von intern. Er steht auch dann im Markup, wenn die
   internen Punkte ausgeblendet sind – dann hinge er allein am Ende, deshalb
   blendet ihn die Regel darunter mit aus. */
.cx-nav-trenn {
  flex: none; width: 1px; height: 20px; margin: 0 10px;
  background: var(--cx-border);
}
.cx-nav-trenn:last-child { display: none; }
#nav-count { color: var(--cx-accent); font-size: 13px; }

/* --- Kopfzeile auf dem Handy ----------------------------------------------
   Die Suche wird zum Symbol und der Konto-Knopf verliert seinen Text: Für
   beides nebeneinander ist bei 375 px kein Platz, und das Logo soll bleiben.
   Kein Menü hinter drei Strichen – bei fünf Punkten versteckt das genau die
   Navigation, um die es geht; das Band scrollt stattdessen seitlich. */
@media (max-width: 720px) {
  /* 58 + 44 plus die beiden Trennlinien – die Leiste ist hier flacher, also
     rückt auch alles darunter Fixierte entsprechend höher. */
  :root { --cx-kopf: 104px; }
  .cx-kopf-innen { padding: 0 16px; gap: 12px; }
  .cx-kopf-marke .cx-kopf-innen { height: 58px; }
  .cx-kopf-navband .cx-kopf-innen { height: 44px; padding: 0 16px; }
  .cx-logo { height: 30px; }
  .cx-suchfeld {
    flex: none; margin: 0 0 0 auto; max-width: none; width: 40px;
    justify-content: center; padding: 9px 0;
  }
  .cx-suchfeld .cx-suchfeld-text, .cx-suchfeld .cx-suche-kbd { display: none; }
  .cx-konto-kurz { display: none; }
  .cx-konto-knopf-haupt { padding: 5px 8px 5px 5px; gap: 5px; }
  /* Die Karte hängt sonst halb außerhalb des Bildschirms. */
  .cx-konto-karte { width: min(310px, calc(100vw - 32px)); }
}

/* --- Hero --- */
.cx-hero { padding: 40px 0 16px; }
.cx-hero h1 { font-size: clamp(34px, 5vw, 52px); }
/* Keine Lesebreite mehr (12.09.2026): Diese Unterzeile steht auf JEDER Seite
   unter der Überschrift, und die Überschrift darüber läuft über die volle
   Spaltenbreite. Gemessen blieben rechts 638 px weiß, während H1 und alle
   Abschnitte darunter bündig bei 1.200 px standen – derselbe Versatz, den
   1.127.1 auf den Steckbriefen beseitigt hat. Der Vorspann ist zwei bis vier
   Zeilen lang; das ist kurz genug für die volle Breite. */
.cx-hero-sub { font-size: 18px; }
.cx-toolbar { display: flex; gap: var(--cx-gap); margin-top: 20px; flex-wrap: wrap; }
.cx-toolbar input {
  flex: 1; min-width: 260px; max-width: 520px;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 12px 18px; font-family: var(--cx-font-body); font-size: 16px;
}
.cx-toolbar input:focus { outline: none; border-color: var(--cx-blue); }
.cx-toolbar select {
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 12px 16px; font-family: var(--cx-font-body); font-size: 15px;
}
.cx-treffer { font-size: 13.5px; color: var(--cx-steel); margin-top: 14px; }
.cx-treffer b { color: var(--cx-text); }

/* --- Werkzeugleiste der Herstellerliste ----------------------------------
   Vorher standen 17 Bereichs- und 45 Plattform-Schaltflächen offen
   untereinander – rund 880 px, bevor der erste Hersteller zu sehen war.
   Jetzt zwei Aufklappknöpfe, Suche, Sortierung und der Ansicht-Umschalter in
   EINER Zeile. Sie bleibt beim Scrollen unter der Kopfzeile stehen, damit die
   Auswahl auf einer 24.000 px langen Seite jederzeit erreichbar ist. */
.cx-wz {
  position: sticky; top: var(--cx-kopf); z-index: 18;
  display: flex; gap: 9px; align-items: center; flex-wrap: wrap;
  padding: 13px 0 12px; margin-top: 18px;
  background: var(--cx-carbon); border-bottom: 1px solid var(--cx-border);
}
/* KEIN eigener Positionierungsrahmen: Das Menü darunter soll sich an der
   ganzen Leiste ausrichten, nicht am schmalen Knopf. Bezugsrahmen ist damit
   .cx-wz – position:sticky wirkt dafür wie relative. */
.cx-wz-huelle { position: static; }
.cx-wz-knopf {
  display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  padding: 10px 14px; border-radius: var(--cx-radius-sm);
  font: 600 14.5px var(--cx-font-body);
  border: 1px solid var(--cx-border); background: var(--cx-graphite);
  color: var(--cx-text-muted); transition: border-color .15s, color .15s;
}
.cx-wz-knopf:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-wz-knopf.hat { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-wz-pfeil { color: var(--cx-steel); font-size: 11px; }
.cx-wz-n {
  background: var(--cx-blue-flaeche); color: #fff; border-radius: 99px;
  padding: 1px 7px; font-size: 11.5px;
}
/* Feste Breite, KEINE Prozentangabe: Bezugsrahmen ist der schmale Knopf
   daneben – 90 % davon wären rund 100 px und die Chips stünden einzeln
   untereinander. */
/* Über die volle Breite der Leiste statt in einer schmalen Säule: Bei 45
   Schwerpunkten passten in 560 px nur gut die Hälfte ins Bild, der Rest lag
   hinter einer Scrollleiste – man musste im Menü suchen, statt zu sehen.
   Über 1.200 px stehen alle auf einmal da. */
.cx-wz-menue {
  position: absolute; z-index: 40; left: 0; right: 0; top: 100%; margin-top: 7px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); padding: 16px 18px;
  box-shadow: 0 20px 50px rgba(0,0,0,.45);
}
html[data-theme="light"] .cx-wz-menue { box-shadow: 0 20px 50px rgba(20,23,28,.16); }
.cx-wz-menue[hidden] { display: none; }
.cx-wz-menue-kopf { font-size: 12.5px; color: var(--cx-steel); margin-bottom: 11px; }
/* Keine feste Deckelung mehr – über die volle Breite stehen selbst die 45
   Schwerpunkte in vier Zeilen. Die Begrenzung bleibt nur als Notbremse für
   sehr flache Fenster; im Alltag greift sie nicht. */
.cx-wz-menue-liste {
  display: flex; flex-wrap: wrap; gap: 8px;
  max-height: min(56vh, 420px); overflow-y: auto;
}
/* Kombinationen, die auf null Treffer führen, sind unbedienbar statt still
   ins Leere zu laufen. */
.cx-wz-leer { opacity: .32; cursor: not-allowed; }
.cx-wz-leer:hover { border-color: var(--cx-border); color: var(--cx-text-muted); }
.cx-wz-such {
  flex: 1 1 230px; min-width: 170px; max-width: 340px;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 10px 14px; font-family: var(--cx-font-body); font-size: 14.5px;
}
.cx-wz-such:focus { outline: none; border-color: var(--cx-blue); }
.cx-wz-sort {
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 10px 13px; font-family: var(--cx-font-body); font-size: 14px;
}
.cx-wz-um {
  margin-left: auto; display: flex; padding: 3px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: 99px;
}
.cx-wz-um button {
  border: 0; background: transparent; cursor: pointer; color: var(--cx-steel);
  font: 600 13.5px var(--cx-font-body); padding: 7px 14px; border-radius: 99px;
}
.cx-wz-um button:hover { color: var(--cx-text); }
.cx-wz-um button[aria-pressed="true"] { background: var(--cx-blue-flaeche); color: #fff; }
.cx-wz-aktiv { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; padding: 13px 0 0; }
.cx-wz-weg {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer; border: 0;
  padding: 5px 11px; border-radius: 99px; font: 600 13px var(--cx-font-body);
  background: rgba(30,123,232,.14); color: var(--cx-blue-light);
}
.cx-wz-weg:hover { background: rgba(30,123,232,.24); }
html[data-theme="light"] .cx-wz-weg { background: rgba(13,80,216,.10); color: var(--cx-blue-deep); }
.cx-wz-alles {
  background: transparent; border: 0; cursor: pointer; color: var(--cx-steel);
  font: 600 13px var(--cx-font-body); text-decoration: underline;
}
.cx-wz-alles:hover { color: var(--cx-text); }

/* --- Ein gesetzter Filter darf nicht nur in einer grauen Zahl stehen -------
   Bis 1.70 verriet sich die Einschränkung durch zwei unauffällige Zeilen:
   den Zähler und ein unterstrichenes „✕ Auswahl aufheben“ ganz rechts hinter
   dem Ansichtsumschalter. Wer über das Menü zurück auf „Hersteller“ kam, sah
   33 statt 201 Herstellern und nichts, was das erklärte.

   Die Zeile sitzt bewusst IN der Werkzeugleiste: Die klebt unter der
   Kopfzeile (position:sticky), und die Herstellerseite springt beim Betreten
   nicht an den Anfang – ein Hinweis weiter oben wäre also oft gar nicht im
   Bild. Ohne gesetzten Filter fällt die Zeile ganz weg; die Seite wird nur
   dann höher, wenn es etwas zu melden gibt.

   Die Tönung liegt ÜBER einer deckenden Fläche, nicht statt ihr: Die Leiste
   ist sticky, und durch ein halbtransparentes Blau liefe der Inhalt sichtbar
   hindurch. */
.cx-wz-gefiltert {
  background: linear-gradient(90deg, rgba(30,123,232,.13), transparent 62%),
              var(--cx-carbon);
}
html[data-theme="light"] .cx-wz-gefiltert {
  background: linear-gradient(90deg, rgba(13,80,216,.10), transparent 62%),
              var(--cx-carbon);
}
/* width:100% erzwingt im umbrechenden Flex-Container eine eigene Zeile. */
.cx-wz-fzeile {
  display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
  width: 100%; padding: 11px 0 1px; margin-top: 2px;
  border-top: 1px dashed var(--cx-border);
}
.cx-wz-fwort {
  display: inline-flex; align-items: center; gap: 7px;
  font: 700 12.5px var(--cx-font-body); letter-spacing: .09em;
  text-transform: uppercase; color: var(--cx-blue-light);
}
html[data-theme="light"] .cx-wz-fwort { color: var(--cx-blue-deep); }
/* Ein Trichter im selben 24er-Raster wie die Bereichs- und Plattformzeichen. */
.cx-fzeichen { width: 15px; height: 15px; flex: none; }
.cx-wz-weg-x { opacity: .7; font-weight: 700; }
.cx-wz-falles { margin-left: auto; }

/* --- Wettbewerbs-Radar ---------------------------------------------------
   Der gewählte Hersteller in der Mitte, seine Wettbewerber ringsum. Die
   Knoten sitzen in Prozent statt in Pixeln, damit das Feld ohne Umrechnung
   im Skript mit der Fensterbreite mitgeht; aus dem Kreis wird dabei eine
   liegende Ellipse, was die Fläche besser nutzt. */
.cx-rad { margin-top: 20px; }
.cx-rad-kontext {
  display: flex; gap: 12px; align-items: center; flex-wrap: wrap;
  padding: 4px 0 14px; font-size: 13px; color: var(--cx-steel);
}
.cx-rad-kontext b { color: var(--cx-text); }
.cx-rad-teilung { display: grid; grid-template-columns: 1fr 360px; gap: 20px; align-items: start; }
.cx-rad-such { position: relative; max-width: 340px; margin-bottom: 12px; }
.cx-rad-such input {
  width: 100%; background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 10px 14px; font-family: var(--cx-font-body); font-size: 14px;
}
.cx-rad-such input:focus { outline: none; border-color: var(--cx-blue); }
.cx-rad-tref-liste {
  position: absolute; z-index: 30; left: 0; right: 0; top: calc(100% + 5px);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); overflow: hidden;
  box-shadow: 0 16px 40px rgba(0,0,0,.42);
}
html[data-theme="light"] .cx-rad-tref-liste { box-shadow: 0 16px 40px rgba(20,23,28,.15); }
.cx-rad-tref {
  display: flex; width: 100%; gap: 9px; align-items: center; padding: 7px 11px;
  background: 0; border: 0; cursor: pointer; color: var(--cx-text);
  font: 600 13.5px var(--cx-font-body); text-align: left;
}
.cx-rad-tref:hover { background: rgba(30,123,232,.12); }
.cx-rad-tref .cx-logoplate { width: 62px; height: 26px; padding: 3px; flex: none; }
.cx-rad-tref-n { margin-left: auto; color: var(--cx-steel); font-size: 12px; font-weight: 600; }
.cx-rad-buehne {
  position: relative; height: 540px;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: radial-gradient(circle at 50% 50%, rgba(30,123,232,.09), transparent 62%),
              var(--cx-graphite);
}
.cx-rad-feld { position: absolute; inset: 0; }
.cx-rad-feld svg { position: absolute; inset: 0; width: 100%; height: 100%; }
/* Ohne non-scaling-stroke würden die Linien mit dem verzerrten viewBox
   unterschiedlich dick – waagerechte dünner als senkrechte. */
.cx-rad-feld line {
  stroke: var(--cx-border); stroke-width: 1.5; vector-effect: non-scaling-stroke;
}
.cx-rad-feld line.an { stroke: var(--cx-blue); stroke-width: 2; }
.cx-rad-feld line.ab { opacity: .25; }

/* --- Was zwischen zwei Herstellern steht, in drei Zuständen ---------------
   Bis 1.71 sah jede Speiche gleich aus, weil im Kreis ohnehin nur stand, wen
   das Zentrum NENNT. Mit der frei bestückbaren Aufstellung kommen zwei
   weitere Fälle dazu: die einseitige Nennung und – der eigentliche Grund für
   diese Ansicht – gar keine Aussage.

   Die Farbwerte sind auf der Kartenfläche nachgerechnet, nicht geschätzt:
   Mint 11,55:1, Bernstein 9,00:1, Grau 5,00:1. Das Grau war zuerst dunkler
   (#5A626C) und kam nur auf 3,06:1 – als Linie gerade noch zulässig, als
   Matrixzeichen „·“ aber Text, und dafür verlangt die Norm 4,5:1. */
:root {
  --cx-bz-beide: #35E0DA;
  --cx-bz-eins:  #E5A83B;
  --cx-bz-keine: #7C848F;
}
html[data-theme="light"] {
  /* Auf Weiß erreicht #35E0DA nur 1,6:1 und #E5A83B 2,0:1 – dieselben
     Familien, abgedunkelt: Petrol 5,47:1, Bernstein 5,93:1, Grau 5,68:1. */
  --cx-bz-beide: #0F766E;
  --cx-bz-eins:  #8A5A00;
  --cx-bz-keine: #5F686F;
}
.cx-rad-feld line.st-beide { stroke: var(--cx-bz-beide); stroke-width: 2; }
.cx-rad-feld line.st-eins  { stroke: var(--cx-bz-eins); stroke-dasharray: 7 5; }
.cx-rad-feld line.st-keine { stroke: var(--cx-bz-keine); stroke-dasharray: 2 6; opacity: .75; }
/* Der Fokus schlägt den Zustand: Wer gerade angeklickt ist, muss sich vom
   Rest abheben, egal was zwischen ihm und dem Zentrum steht. */
.cx-rad-feld line.an { stroke: var(--cx-blue); stroke-width: 2.5; stroke-dasharray: none; opacity: 1; }

/* Angeheftet: steht im Ring, obwohl nichts hinterlegt ist. Ein Wort statt
   einer Vermutung – sonst hält man die fehlende Linie für einen Fehler. */
.cx-rad-lose {
  display: block; font: 700 10px var(--cx-font-body); letter-spacing: .1em;
  text-transform: uppercase; color: var(--cx-bz-keine); font-style: normal;
}
.cx-rad-node.angeheftet .cx-logoplate { border: 1px dashed var(--cx-bz-keine); }

.cx-rad-legende {
  display: flex; gap: 18px; flex-wrap: wrap; align-items: center;
  font-size: 12.5px; color: var(--cx-text-muted); margin: 0 0 12px;
}
.cx-rad-legende span { display: inline-flex; align-items: center; gap: 7px; }
.cx-rad-ls { width: 26px; height: 0; border-top: 2px solid; flex: none; }
.cx-rad-ls.st-beide { border-color: var(--cx-bz-beide); }
.cx-rad-ls.st-eins  { border-color: var(--cx-bz-eins); border-top-style: dashed; }
.cx-rad-ls.st-keine { border-color: var(--cx-bz-keine); border-top-style: dotted; }
.cx-rad-node {
  position: absolute; transform: translate(-50%, -50%); width: 108px;
  background: 0; border: 0; padding: 0; cursor: pointer; color: var(--cx-text);
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  transition: opacity .15s;
}
.cx-rad-node .cx-logoplate { width: 98px; height: 42px; padding: 6px; }
.cx-rad-node small {
  font: 600 11.5px var(--cx-font-body); color: var(--cx-steel);
  max-width: 108px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cx-rad-node:hover .cx-logoplate { outline: 1px solid var(--cx-blue); }
.cx-rad-node.an .cx-logoplate { outline: 2px solid var(--cx-blue); outline-offset: 1px; }
.cx-rad-node.an small { color: var(--cx-text); }
/* Gestrichelt = im Katalog (noch) ohne eigenen Steckbrief. Weggelassen wird
   niemand: Wer im Kundengespräch fällt, gehört ins Bild. */
.cx-rad-node.fremd .cx-logoplate { background: var(--cx-carbon); border: 1px dashed var(--cx-border); }
.cx-rad-node.fremd .cx-logo-ersatz { font-size: 10.5px; color: var(--cx-steel); }
.cx-rad-node.ab { opacity: .28; }
.cx-rad-node.unklar { opacity: .55; }
.cx-rad-mitte {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 156px; display: flex; flex-direction: column; align-items: center; gap: 6px;
}
.cx-rad-mitte .cx-logoplate {
  width: 146px; height: 60px; padding: 10px;
  border: 2px solid var(--cx-blue); box-shadow: 0 12px 34px rgba(30,123,232,.28);
}
.cx-rad-mitte small { font: 700 13px var(--cx-font-display); color: var(--cx-text); }
.cx-rad-panel {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite); padding: 16px;
}
.cx-rad-panel .cx-logoplate { width: 140px; height: 52px; padding: 8px; }
.cx-rad-panel h3 { font: 700 18px var(--cx-font-display); margin: 11px 0 3px; }
.cx-rad-text { font-size: 13px; color: var(--cx-text-muted); line-height: 1.55; margin: 9px 0; }
.cx-rad-abgrenzung { border-top: 1px solid var(--cx-border); margin-top: 14px; padding-top: 12px; }
.cx-rad-abgrenzung h4 {
  margin: 0 0 7px; font-size: 11px; letter-spacing: .12em;
  text-transform: uppercase; color: var(--cx-steel);
}
.cx-rad-vs { font: 700 14.5px var(--cx-font-display); }
.cx-rad-gegen { color: var(--cx-steel); font-weight: 600; }
.cx-rad-knoepfe { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
.cx-rad-quelle { margin-top: 14px; font-size: 11.5px; color: var(--cx-steel); line-height: 1.5; }
/* Der Radar-Knopf auf der Karte: sichtbar, aber leiser als „Steckbrief →“ –
   der Steckbrief bleibt der Hauptweg. */
.cx-vendor-fuss-rechts { display: flex; align-items: center; gap: 10px; }
.cx-rad-ab {
  border: 1px solid var(--cx-border); background: transparent; cursor: pointer;
  color: var(--cx-steel); font: 600 12px var(--cx-font-body);
  padding: 4px 10px; border-radius: 99px;
}
.cx-rad-ab:hover { border-color: var(--cx-blue); color: var(--cx-text); }

@media (max-width: 900px) {
  .cx-rad-teilung { grid-template-columns: 1fr; }
  .cx-rad-buehne { height: 460px; }
  .cx-rad-ablage-kopf .cx-wz-alles { margin-left: 0; }
  .cx-mx-oben { height: 96px; width: 42px; }
  .cx-mx-zelle { width: 42px; height: 38px; }
  .cx-rad-node { width: 88px; }
  .cx-rad-node .cx-logoplate { width: 80px; height: 34px; padding: 4px; }
  .cx-rad-node small { max-width: 88px; font-size: 10.5px; }
  .cx-rad-mitte { width: 124px; }
  .cx-rad-mitte .cx-logoplate { width: 116px; height: 48px; }
}
@media (max-width: 720px) {
  /* Der Umschalter rutscht in die nächste Zeile, statt Suche und Sortierung
     zusammenzuquetschen – dieselbe Lehre wie bei der Kopfzeile. */
  .cx-wz-um { margin-left: 0; }
  .cx-wz-falles { margin-left: 0; }
  .cx-wz-such { max-width: none; }
  /* Keine eigene Breite mehr nötig: left/right ziehen das Menü ohnehin auf
     die Leistenbreite. Hier bekommt die Liste nur mehr Höhe, weil die Chips
     auf 375 px in viele Zeilen umbrechen. */
  .cx-wz-menue-liste { max-height: min(64vh, 460px); }
}

/* --- Hersteller-Grid --- */
.cx-grid {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  margin-top: 24px;
}
.cx-vendor {
  display: flex; flex-direction: column; gap: 13px;
  color: inherit; font-weight: 400; transition: border-color .15s, transform .15s;
}
.cx-vendor:hover { border-color: var(--cx-blue); transform: translateY(-2px); color: inherit; }
/* Die Karte ist kein Link mehr, sondern enthält einen: Im Fuß sitzt jetzt
   neben „Steckbrief →“ auch der Radar-Knopf, und ein Knopf im Link wäre
   verschachtelte Interaktion – ungültiges Markup und mit der Tastatur nicht
   sauber bedienbar. Der Link deckt weiterhin die ganze obere Kartenfläche. */
.cx-vendor-link {
  display: flex; flex-direction: column; gap: 13px;
  color: inherit; font-weight: 400; text-decoration: none;
}
.cx-vendor-link:hover { color: inherit; }
.cx-vendor-link:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: 3px; border-radius: 8px; }

/* Logo-Platte: helle Fläche, damit dunkle Logos auf dunklem Grund sichtbar sind */
.cx-logoplate {
  background: var(--cx-silver-light);
  border-radius: var(--cx-radius-sm);
  height: 84px; display: flex; align-items: center; justify-content: center;
  padding: 14px;
}
.cx-logoplate img { max-height: 52px; max-width: 80%; }
.cx-compare-col .cx-logoplate img { max-height: 36px; }

/* Logo-Ersatz für Gäste: Herstellerlogos erscheinen erst nach der Anmeldung.
   Der Name füllt die Platte, damit das Kartenraster nicht springt. */
.cx-logo-ersatz {
  font-family: var(--cx-font-display); font-weight: 600;
  font-size: 17px; line-height: 1.25; text-align: center;
  color: #6B7280; letter-spacing: .01em;
  padding: 0 8px; overflow-wrap: anywhere;
}
.cx-detail-head .cx-logo-ersatz { font-size: 20px; }
.cx-compare-col .cx-logo-ersatz { font-size: 14px; }

.cx-vendor h3 { margin: 0; font-size: 19px; }
.cx-vendor .cx-pos { font-size: 15px; flex: 1; margin: 0; }
.cx-vendor-foot {
  display: flex; justify-content: space-between; align-items: center;
  font-size: 14px; margin-top: 2px;
}
.cx-produkt-count { color: var(--cx-steel); }
.cx-mehr { color: var(--cx-blue-light); font-weight: 600; }

.cx-footnote { font-size: 13px; color: var(--cx-steel); margin-top: 44px; }
.cx-empty { color: var(--cx-steel); margin-top: 24px; }

/* Bereichs-Tags auf Herstellerkarten */
.cx-bereich-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.cx-tag {
  font-size: 11.5px; color: var(--cx-silver);
  border: 1px solid var(--cx-border); border-radius: 99px;
  padding: 3px 10px; white-space: nowrap;
}

/* Portfolio-Gliederung auf der Herstellerseite */
.cx-bereich { margin-top: 26px; }
.cx-bereich:first-of-type { margin-top: 6px; }
.cx-bereich-titel {
  display: flex; align-items: baseline; gap: 12px;
  font-size: 18px; margin-bottom: 12px;
  padding-bottom: 8px; border-bottom: 1px solid var(--cx-border);
}
.cx-bereich-anzahl { font-family: var(--cx-font-body); font-size: 13px; font-weight: 400; color: var(--cx-steel); }

.cx-kontext { font-family: var(--cx-font-body); font-size: 14px; font-weight: 400; color: var(--cx-steel); }
.cx-hinweis-klein { font-size: 14px; margin-top: 12px; }
.cx-nutzen-card h2 { color: var(--cx-accent); }

/* Vergleich: Bereichs-/Hersteller-Auswahl */
.cx-select-label {
  font-size: 13px; letter-spacing: .18em; text-transform: uppercase;
  color: var(--cx-steel); margin: 26px 0 10px;
}
/* Die Beschriftungszeile trägt rechts den Zurücksetzen-Knopf. flex statt
   float, damit er auf schmalen Geräten unter die Beschriftung rutscht,
   statt in sie hineinzulaufen. */
.cx-select-label:has(.cx-vgl-reset) {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; flex-wrap: wrap;
}
.cx-vgl-reset {
  font: inherit; font-size: 12px; letter-spacing: .06em; text-transform: none;
  color: var(--cx-steel); background: none; cursor: pointer;
  border: 1px solid var(--cx-border); border-radius: 999px;
  padding: 4px 12px; transition: color .15s, border-color .15s;
}
.cx-vgl-reset:hover, .cx-vgl-reset:focus-visible {
  color: var(--cx-text); border-color: var(--cx-steel);
}
/* DIE DECKKRAFT FÄLLT ERSATZLOS WEG – KEINE feste Farbe an ihre Stelle
   (1.178.2). Mit opacity .65 stand die Zahl bei 2,98:1. Der erste Versuch
   setzte --cx-steel und machte es SCHLIMMER (1,03:1): Ein AKTIVER Chip trägt
   weiße Schrift auf farbigem Grund, ein ruhender dunkle auf hellem – eine
   feste Farbe kann nur einen der beiden Fälle treffen. Das geringere Gewicht
   setzt die Zahl ohnehin ab. */
.cx-chip-count { font-weight: 400; margin-left: 4px; }
.cx-chip.disabled {
  opacity: .35; cursor: not-allowed; text-decoration: line-through;
}
.cx-cmp-produkt { margin-bottom: 14px; }
.cx-cmp-produkt p { margin: 3px 0 0; }
.cx-cmp-nutzen { color: var(--cx-steel); font-size: 13px; }
.cx-col-leer { opacity: .75; }

/* --- Hersteller-Detailseite --- */
.cx-breadcrumb { padding: 22px 0 0; font-size: 15px; }
.cx-detail-head {
  display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap;
  padding: 22px 0 6px;
}
/* Das Logo saß zentriert, was stimmte, solange die Herkunftszeile zwei oder
   drei Zeilen hoch war. Seit die Knöpfe eine eigene Zeile haben, läuft der
   Text über die ganze Breite – bei guardsix sind das vierzehn Zeilen, und
   das Logo schwebte in deren Mitte. Oben bündig steht es auf einer Linie
   mit dem Herstellernamen. */
.cx-detail-head .cx-logoplate { width: 200px; height: 92px; flex: none; }
.cx-detail-title { flex: 1; min-width: 260px; }
.cx-detail-title h1 { font-size: clamp(28px, 4vw, 40px); margin-bottom: 6px; }
.cx-meta { font-size: 14.5px; color: var(--cx-steel); }

.cx-cmp-toggle {
  font-family: var(--cx-font-body); font-size: 15px; font-weight: 600;
  background: transparent; color: var(--cx-text);
  border: 1px solid #2A3038; border-radius: var(--cx-radius-sm);
  padding: 11px 22px; cursor: pointer;
}

/* --- Die Knopfreihe im Steckbriefkopf ---
   Vier Knöpfe nebeneinander, und sie sollen gleich aussehen. Hier stand bis
   1.114.0 gar keine Regel: Die Knöpfe hingen als inline-flex an der
   Textgrundlinie, und weil .cx-cmp-toggle höher ist als .cx-merk, saßen sie
   versetzt. Gemessen am 10.09.2026: 42 px gegen 36,8 px Höhe, Oberkante
   18 px gegen 22 px.

   Die Größe steht HIER und nicht an .cx-cmp-toggle selbst: Derselbe Knopf
   sitzt auch auf den Kacheln der Übersicht und in der Vergleichsliste, wo er
   allein steht und größer bleiben soll. */
.cx-detail-actions {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  /* EIGENE ZEILE, immer: flex-basis:100% zwingt den Umbruch im Kopf, auch
     wenn rechnerisch noch Platz wäre. Vorher teilte sich die Reihe die
     Zeile mit dem Titel und nahm ihm die Breite weg – bei guardsix stand
     die Herkunftszeile deshalb 20 Zeilen hoch in einer schmalen Spalte,
     während daneben Platz frei blieb. Jetzt läuft der Text über die ganze
     Breite und die Knöpfe stehen darunter.
     margin-top statt des 24px-Abstands der Kopfzeile: Die Knöpfe gehören
     enger an den Text, zu dem sie handeln. */
  flex-basis: 100%; margin-top: -6px;
}
.cx-detail-actions > button {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  font-size: 14px; font-weight: 500; padding: 9px 16px;
  /* Die feste Zeilenhöhe ist der eigentliche Angleich. Ohne sie stand
     „+ Vergleichen“ 5,4 px niedriger als seine Nachbarn: Die drei anderen
     Knöpfe tragen ein Emoji, und ein Emoji zieht die Zeilenbox höher als
     reiner Text. Gemessen 37 px gegen 42,4 px. */
  line-height: 1.45;
}
.cx-cmp-toggle:hover { border-color: var(--cx-blue); color: var(--cx-blue-light); }
.cx-cmp-toggle.active { border-color: var(--cx-accent); color: var(--cx-accent); }

.cx-section { margin-top: 30px; }
.cx-section h2 { font-size: 24px; margin-bottom: 14px; }
.cx-section.cx-card h2 { font-size: 19px; }
.cx-positionierung { font-size: 17px; max-width: 860px; }

.cx-pitch {
  background: var(--cx-gradient-flaeche); border-radius: var(--cx-radius-sm);
  padding: 18px 22px; color: #fff; font-size: 16px;
  max-width: 860px; margin-top: 18px;
}
.cx-pitch .cx-eyebrow { display: block; color: rgba(255,255,255,.75); margin-bottom: 6px; }

/* Produkt-Karten */
.cx-produkt-grid {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
}
.cx-produkt { display: flex; flex-direction: column; gap: 8px; }
.cx-produkt h3 { margin: 0; font-size: 17px; color: var(--cx-blue-light); }
.cx-produkt p { font-size: 15px; margin: 0; flex: 1; }
.cx-nutzen {
  border-top: 1px solid var(--cx-border); padding-top: 10px;
  font-size: 14.5px; color: var(--cx-text-muted);
}
.cx-nutzen .cx-eyebrow { display: block; font-size: 11px; margin-bottom: 3px; }

.cx-two-col {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  margin-top: 30px;
}
.cx-two-col .cx-section { margin-top: 0; }

table.cx-table { width: 100%; border-collapse: collapse; font-size: 15px; }
.cx-table th {
  text-align: left; font-family: var(--cx-font-display); font-size: 12px;
  letter-spacing: .12em; text-transform: uppercase; color: var(--cx-steel);
  padding: 8px 12px 8px 0; border-bottom: 1px solid var(--cx-border);
}
.cx-table td {
  padding: 10px 12px 10px 0; border-bottom: 1px solid var(--cx-border);
  color: var(--cx-text-muted); vertical-align: top;
}
.cx-table td:first-child { color: var(--cx-text); font-weight: 600; min-width: 180px; }

ul.cx-list { margin: 0; padding-left: 20px; color: var(--cx-text-muted); font-size: 15px; }
ul.cx-list li { margin-bottom: 7px; }

/* --- Vergleichsseite --- */
.cx-chips { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
.cx-chip {
  font-family: var(--cx-font-body); font-size: 14.5px; font-weight: 600;
  background: var(--cx-graphite); color: var(--cx-text-muted);
  border: 1px solid var(--cx-border); border-radius: 99px;
  padding: 9px 18px; cursor: pointer;
}
.cx-chip:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-chip.active {
  background: var(--cx-gradient-flaeche); border-color: transparent; color: #fff;
}

.cx-compare-grid { display: grid; gap: var(--cx-gap); margin-top: 26px; }
.cx-compare-grid.n2 { grid-template-columns: repeat(2, 1fr); }
.cx-compare-grid.n3 { grid-template-columns: repeat(3, 1fr); }
.cx-compare-col .cx-logoplate { height: 66px; margin-bottom: 12px; }
.cx-compare-col h4 { font-family: var(--cx-font-display); font-size: 17px; margin: 0 0 10px; }
.cx-compare-col h4 a { color: var(--cx-text); }
.cx-compare-col h4 a:hover { color: var(--cx-blue-light); }
.cx-compare-col h5 {
  font-family: var(--cx-font-display); font-size: 11px; letter-spacing: .2em;
  text-transform: uppercase; color: var(--cx-steel); margin: 16px 0 6px;
}
.cx-compare-col p, .cx-compare-col li { font-size: 14px; }
.cx-compare-col p { margin: 0; }
.cx-compare-col ul { padding-left: 18px; margin: 0; color: var(--cx-text-muted); }
.cx-compare-col li { margin-bottom: 4px; }

@media (max-width: 900px) {
  .cx-compare-grid.n2, .cx-compare-grid.n3 { grid-template-columns: 1fr; }
}

/* --- Einstieg über Bereiche / Plattformen --- */
.cx-bereich-card h3 { margin: 0; font-size: 19px; }

/* Hinweis auf das, was der Gast nicht sieht. Bewusst als ruhige Zeile und nicht
   als Werbebanner: Sie erklärt eine Lücke, sie bewirbt nichts. */
.cx-teaser-rest {
  margin: 10px 0 0; font-size: 14px; color: var(--cx-steel);
}

/* Sinnbild je Bereich: Das Zeichen sitzt in einer eigenen Fläche, damit die
   Kachel auch beim Überfliegen erkennbar bleibt – siebzehn gleich gebaute
   Textblöcke unterscheidet das Auge sonst erst beim Lesen. */
.cx-bereich-kopf {
  display: flex; align-items: center; gap: 12px; margin-bottom: 4px;
}
.cx-bereich-zeichen {
  flex: none; width: 42px; height: 42px; border-radius: 11px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(30, 123, 232, .13);
  border: 1px solid rgba(30, 123, 232, .22);
  color: var(--cx-blue-light);
}
.cx-bereich-zeichen svg { width: 23px; height: 23px; display: block; }
/* Beim Überfahren der Kachel zieht das Zeichen mit – es gehört zur Fläche,
   nicht als Verzierung daneben. */
.cx-bereich-card:hover .cx-bereich-zeichen {
  background: rgba(30, 123, 232, .2); border-color: rgba(30, 123, 232, .4);
}

/* Auf der Bereichsseite steht dasselbe Zeichen neben der Überschrift und
   bestätigt beim Wechsel, dass man im richtigen Bereich gelandet ist. */
.cx-bereich-titel { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.cx-bereich-titel .cx-bereich-zeichen {
  width: 54px; height: 54px; border-radius: 14px;
}
.cx-bereich-titel .cx-bereich-zeichen svg { width: 30px; height: 30px; }

/* Hellmodus: Das helle Blau trägt auf hellem Grund nicht – gemessen 1,77:1 auf
   der gemischten Kartenfläche. Zeichen und Rahmen gehen deshalb auf Tiefblau. */
.cx-light .cx-bereich-zeichen {
  background: rgba(13, 80, 216, .09);
  border-color: rgba(13, 80, 216, .2);
  color: var(--cx-blue-deep);
}
.cx-light .cx-bereich-card:hover .cx-bereich-zeichen {
  background: rgba(13, 80, 216, .15); border-color: rgba(13, 80, 216, .35);
}
.cx-bereich-vendor { margin-bottom: 18px; }
.cx-bereich-vendor-head {
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin-bottom: 14px;
}
.cx-bereich-vendor-head .cx-logoplate { width: 170px; height: 76px; flex: none; }
.cx-bereich-vendor-head > div { flex: 1; min-width: 220px; }
.cx-bereich-vendor-head h3 { margin: 0 0 2px; }
.cx-bereich-vendor-head h3 a { color: var(--cx-text); }
.cx-bereich-vendor-head h3 a:hover { color: var(--cx-blue-light); }
.cx-bereich-vendor-head .cx-pos { margin: 0; font-size: 14.5px; }

/* --- Footer --- */
.cx-footer {
  max-width: 1180px; margin: 40px auto 0; padding: 22px 28px 34px;
  border-top: 1px solid var(--cx-border);
  display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;
  font-size: 13.5px; color: var(--cx-steel);
}
/* wrap: Mit dem fünften Eintrag („Version“) passte die Zeile auf dem Telefon
   nicht mehr – sie schob die GANZE Seite um 53 px seitlich, was auf jeder
   Unterseite zu sehen war, nicht nur in der Fußzeile. */
.cx-footer nav { display: flex; gap: 18px; flex-wrap: wrap; }
.cx-footer a { color: var(--cx-text-muted); font-weight: 500; }
.cx-footer a:hover { color: var(--cx-blue-light); }

/* --- Hinweis-Banner (lokale Speicherung) --- */
.cx-consent {
  position: fixed; left: 16px; right: 16px; bottom: 16px; z-index: 60;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); padding: 14px 20px;
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
  box-shadow: 0 12px 40px rgba(0,0,0,.5);
}
.cx-consent p { margin: 0; flex: 1; min-width: 260px; font-size: 14px; }
.cx-consent .cx-btn { padding: 9px 22px; font-size: 14.5px; }

/* --- Interner Bereich / Login --- */
.cx-nav-intern { white-space: nowrap; }
.cx-intern-hinweis {
  font-size: 14.5px; color: var(--cx-steel);
  border: 1px dashed var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 12px 18px;
}
.cx-intern { border-color: var(--cx-accent); }
.cx-intern h3 { margin-top: 18px; font-size: 16px; }
.cx-intern-badge {
  font-family: monospace; font-size: 11.5px; color: var(--cx-accent);
  border: 1px solid var(--cx-accent); border-radius: 99px;
  padding: 3px 10px; vertical-align: middle; margin-left: 8px;
}
.cx-login-card { max-width: 420px; }
.cx-login-card label { display: block; font-weight: 600; margin-bottom: 8px; }
.cx-login-card input {
  width: 100%; box-sizing: border-box; margin-bottom: 14px;
  background: var(--cx-carbon); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 11px 14px; font-size: 16px;
}
/* Mehrzeilig, für die Domainliste einer Partnerfirma: dieselbe Optik wie die
   einzeiligen Felder, damit die Maske nicht zusammengestückelt wirkt. */
.cx-login-card textarea {
  width: 100%; box-sizing: border-box; margin-bottom: 14px;
  background: var(--cx-carbon); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 11px 14px; font-size: 15px; font-family: var(--cx-font-body);
  line-height: 1.5; resize: vertical;
}
/* Auswahlfelder gibt es hier seit dem Kontoantrag: Gesellschaft und gewünschte
   Rolle. Sie müssen dieselben Maße tragen wie die Eingabefelder darüber –
   ein <select> in Browser-Grundgestaltung neben einem gestalteten <input>
   sieht aus, als gehörte es nicht zum Formular. Der Aufklapp-Pfeil bleibt der
   des Browsers: Er ist auf jedem Gerät der, den die Leute kennen. */
.cx-login-card select {
  width: 100%; box-sizing: border-box; margin-bottom: 14px;
  background: var(--cx-carbon); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 11px 14px; font-size: 16px; font-family: var(--cx-font-body);
}
.cx-login-card input:focus,
.cx-login-card select:focus,
.cx-login-card textarea:focus { outline: none; border-color: var(--cx-blue); }
/* Unveränderbar (die Kennung einer bestehenden Firma oder eines Hauses) soll
   auch so aussehen – gestrichelt statt durchgezogen, Schrift zurückgenommen. */
.cx-login-card input[readonly],
.cx-input[readonly], .cx-input:disabled, .cx-select:disabled {
  color: var(--cx-steel); background: none; border-style: dashed; cursor: default;
}
/* Erklärung gehört zum Feld darüber, nicht zum Label darunter – sonst kleben
   Hinweis und nächste Beschriftung aneinander. */
.cx-login-card .cx-pflege-hilfe { margin: -8px 0 16px; }
/* Ankreuzfeld: die Block- und Breitenregeln oben würden es auf Kartenbreite
   ziehen. Die Selektoren sind bewusst genauer statt mit !important. */
.cx-login-card .cx-check {
  display: flex; align-items: center; gap: 9px; margin: 4px 0 14px;
}
.cx-login-card .cx-check input {
  width: auto; margin: 0; accent-color: var(--cx-blue);
}
.cx-login-fehler { color: #ff7b7b; margin: 12px 0 0; }
.cx-logout { margin-left: 12px; padding: 8px 18px; font-size: 14px; }

/* --- Fenster „Passwort vergessen" ---------------------------------------
   Ein echtes <dialog>: Abdunkeln, Fokusfalle, Schließen mit Esc und die Ansage
   an Bildschirmleser bringt der Browser mit, hier kommt nur das Aussehen dazu.
   ::backdrop ist die Fläche dahinter – ohne eigene Regel bleibt sie in manchen
   Browsern fast durchsichtig, und dann steht das Fenster im Nichts. */
.cx-dialog {
  width: min(430px, calc(100vw - 32px)); box-sizing: border-box;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  padding: 26px 28px; box-shadow: 0 24px 60px rgba(0, 0, 0, .55);
}
.cx-dialog::backdrop { background: rgba(4, 6, 10, .72); }
.cx-dialog h2 { margin: 0 0 10px; font-size: 21px; }
.cx-dialog label { display: block; font-weight: 600; margin-bottom: 8px; }
.cx-dialog input {
  width: 100%; box-sizing: border-box; margin-bottom: 14px;
  background: var(--cx-carbon); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 11px 14px; font-size: 16px;
}
.cx-dialog input:focus { outline: none; border-color: var(--cx-blue); }
.cx-dialog-knoepfe { display: flex; gap: 10px; flex-wrap: wrap; }
.cx-dialog-meldung { margin: 0 0 14px; font-size: 14px; line-height: 1.5; }
.cx-dialog-meldung.ok { color: var(--cx-accent); }
.cx-dialog-meldung.fehler { color: #ff7b7b; }
/* Absagen im hellen Modus (seit 1.156.2): #ff7b7b ist auf dunklen Grund
   gerechnet und kommt auf dem hellen Seitengrund nur auf 2,3:1 – eine
   abgelehnte Anmeldung las sich wie ausgegraut und fiel kaum auf. Dasselbe Rot
   wie --cx-qc-rot im hellen Modus: 4,8:1 auf #F4F5F8, 5,2:1 auf Weiß. */
html[data-theme="light"] .cx-login-fehler,
html[data-theme="light"] .cx-dialog-meldung.fehler { color: #C43B3B; }

/* --- Impressum --- */
.cx-impressum h3 { margin-top: 20px; font-size: 16px; }

/* --- Verwaltung / Partner --- */
.cx-verwaltung-form { max-width: 560px; }
.cx-btn-secondary.cx-mini { padding: 6px 12px; font-size: 13px; margin: 2px 4px 2px 0; }
.cx-hinweis-klein-inline { font-size: 12px; color: var(--cx-steel); font-weight: 400; }
.cx-intern-teil {
  margin-top: 26px !important; padding-top: 14px;
  border-top: 1px solid var(--cx-border); color: var(--cx-accent);
}
.cx-login-card .cx-btn-secondary { margin-left: 10px; padding: 11px 22px; font-size: 15px; }

/* --- Anmeldeseite: eine Kachel mit zwei Zuständen ------------------------
   Vorher standen Anmeldung und Kontoantrag als zwei gleich große Kacheln
   nebeneinander. Gleich groß heißt gleich wichtig, und weil nichts sagte,
   welche für wen ist, klickten Leute in die falsche. Jetzt steht die
   Anmeldung allein da; „Noch kein Konto“ tauscht sie gegen den Antrag. */
.cx-anmeldung { max-width: 470px; margin-top: 30px; }
.cx-anmeldung .cx-section { margin-top: 0; }
/* Die Karte darf hier die volle Spaltenbreite nehmen – die 420px aus
   .cx-login-card stammen aus der Zeit, als zwei davon nebeneinander standen. */
.cx-anmeldung .cx-login-card { max-width: none; }

/* Die beiden Knöpfe nebeneinander. flex-wrap ist kein Beiwerk: Unter etwa
   400px Kartenbreite passen sie nicht mehr in eine Zeile und müssen
   umbrechen, statt aus der Karte zu laufen. */
.cx-knopfzeile { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
/* Hebt die margin-left-Regel von .cx-login-card .cx-btn-secondary auf – hier
   macht den Abstand das gap, sonst steht er beim Umbruch an der falschen Stelle. */
.cx-knopfzeile .cx-btn-secondary { margin-left: 0; padding: 12px 22px; }

/* Die Erklärung gehört zum Knopf daneben, nicht zum Formular darüber. Der
   Trennstrich sagt das, ohne dass es jemand schreiben muss. */
.cx-anmelde-erklaerung {
  margin: 18px 0 0; padding-top: 15px; border-top: 1px solid var(--cx-border);
  font-size: 14px; color: var(--cx-text-muted); line-height: 1.55;
}
.cx-anmelde-erklaerung b { color: var(--cx-text); }

/* Der Rückweg aus dem Antragsformular. Steht ÜBER der Überschrift: Wer sich
   verklickt hat, sucht oben, nicht unten. */
.cx-zurueck-knopf {
  display: block; margin-bottom: 12px; text-decoration: none; font-weight: 600;
}
.cx-zurueck-knopf:hover { text-decoration: underline; }

/* --- Der dritte Weg: Systemhäuser ----------------------------------------
   Bernstein und nicht Rot: Hier zu landen ist kein Fehler, sondern ein
   anderer Fall – dieselbe Lesart wie beim „kein Angebot“-Hinweis im
   Vergleich. Der Knopf bleibt eine Umrandung, damit er neben dem gefüllten
   „Anmelden“ als das Nachrangige erkennbar ist. */
.cx-systemhaus {
  margin-top: 24px; padding: 16px 20px; border-radius: var(--cx-radius-sm);
  border: 1px solid var(--cx-border); border-left: 3px solid var(--cx-warn);
  background: var(--cx-graphite);
  display: flex; gap: 18px; align-items: center; flex-wrap: wrap;
}
.cx-systemhaus-text { flex: 1 1 320px; font-size: 14px; color: var(--cx-text-muted); line-height: 1.55; }
.cx-systemhaus-text b { color: var(--cx-text); font-size: 15px; }
.cx-systemhaus-text > b { display: block; margin-bottom: 2px; }
.cx-systemhaus-marke {
  display: block; margin-bottom: 5px;
  font-family: var(--cx-font-display); font-size: 11px; letter-spacing: .14em;
  text-transform: uppercase; color: var(--cx-warn);
}
.cx-systemhaus .cx-btn-secondary { margin-left: 0; padding: 10px 20px; font-size: 15px; white-space: nowrap; }
/* Auf der Systemhaus-Seite zeigt dasselbe Band in die Gegenrichtung – dorthin,
   wo die Leute eigentlich hinwollten. Blau, weil es keine Einschränkung ist,
   sondern der kürzere Weg. */
.cx-systemhaus-blau { border-left-color: var(--cx-blue); max-width: 760px; }
.cx-systemhaus-blau .cx-systemhaus-marke { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-systemhaus-blau .cx-systemhaus-marke { color: var(--cx-blue-deep); }

/* Der Hinweis im Zugangsformular, wenn die Domain schon einer Partnerfirma
   gehört. Warnend, aber nicht sperrend – der Absendeknopf bleibt bedienbar. */
.cx-schon-partner {
  margin: 4px 0 0; padding: 12px 16px; font-size: 14.5px; line-height: 1.55;
  border-left: 3px solid var(--cx-warn); border-radius: 0 8px 8px 0;
  background: color-mix(in srgb, var(--cx-warn) 10%, transparent);
  color: var(--cx-text-muted);
}
.cx-schon-partner b { color: var(--cx-text); }

/* --- Battle Card: zugeklappter Zusatzabschnitt ---------------------------
   Kommt UNTER den Spaltenvergleich, nicht an seine Stelle. Die Spalten sind
   der Steckbrief-Auszug je Hersteller; die Battle Card beantwortet die andere
   Frage – dieselbe Rubrik über alle Anbieter auf einer Höhe, dazu die
   gegenseitige Abgrenzung, die in den Spalten nicht vorkommt.

   Zugeklappt, weil die Spalten die Hauptansicht bleiben. details/summary
   statt eigener Logik: Tastaturbedienung, Ansage für Vorlesesoftware und der
   geöffnete Zustand kommen vom Browser. */
.cx-battle { margin-top: 40px; }
.cx-battle-summary {
  display: flex; align-items: center; gap: 16px; cursor: pointer;
  padding: 16px 20px; border-radius: var(--cx-radius);
  border: 1px solid var(--cx-border); background: var(--cx-graphite);
  transition: border-color .15s;
  list-style: none;
}
.cx-battle-summary::-webkit-details-marker { display: none; }
.cx-battle-summary:hover { border-color: var(--cx-blue); }
.cx-battle-summary:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: 2px; }
.cx-battle[open] .cx-battle-summary {
  border-color: var(--cx-blue);
  border-radius: var(--cx-radius) var(--cx-radius) 0 0;
  margin-bottom: 0;
}
.cx-battle-kopf { display: grid; gap: 3px; min-width: 0; }
.cx-battle-h {
  font-family: var(--cx-font-display); font-size: 21px; font-weight: 700;
  color: var(--cx-text);
}
.cx-vgl-intro { margin: 0; font-size: 14px; color: var(--cx-steel); max-width: 760px; }
/* Ein gezeichnetes Winkelzeichen statt eines Schriftzeichens: dreht sich
   sauber mit und sieht in jeder Schriftart gleich aus. */
.cx-battle-pfeil {
  flex: none; margin-left: auto; width: 11px; height: 11px;
  border-right: 2px solid var(--cx-steel); border-bottom: 2px solid var(--cx-steel);
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform .18s ease, border-color .15s;
}
.cx-battle-summary:hover .cx-battle-pfeil { border-color: var(--cx-blue-light); }
html[data-theme="light"] .cx-battle-summary:hover .cx-battle-pfeil { border-color: var(--cx-blue-deep); }
.cx-battle[open] .cx-battle-pfeil { transform: rotate(-135deg) translate(-3px, -3px); }
.cx-battle[open] .cx-vgl { margin-top: 0; }
.cx-battle[open] .cx-vgl-kopfleiste { border-radius: 0; }
@media (prefers-reduced-motion: reduce) { .cx-battle-pfeil { transition: none; } }

/* Der Weg zum Blatt: ein Band zwischen Aufklapper und Gegenüberstellung.
   Bewusst flächenbündig ohne eigene Ecken – Aufklapper, Band und Kopfleiste
   bilden einen Stapel, und eine abgesetzte Kachel dazwischen sähe aus wie
   ein Fremdkörper. Der Knopf steht hier und nicht im <summary>: Ein
   <button> darin würde beim Klick die Karte zuklappen. */
.cx-battle-werkzeug {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px 20px; flex-wrap: wrap;
  padding: 12px 20px;
  background: var(--cx-graphite);
  border: 1px solid var(--cx-border); border-top: 0;
}
.cx-battle-werkzeug p {
  flex: 1 1 300px; margin: 0; min-width: 0;
  font-size: 13.5px; line-height: 1.45; color: var(--cx-steel);
}
.cx-battle-werkzeug .cx-btn { flex: none; margin: 0; }

/* ===== Direktvergleich als Gegenüberstellung ==============================
   Vorher standen die Hersteller in unabhängigen Spalten, jede ein eigener
   Steckbrief-Auszug. Weil die Produktlisten unterschiedlich lang sind, lagen
   „Positionierung" und „Lizenzierung" um bis zu 414 px versetzt – quer lesen
   war damit unmöglich, und genau das ist der Zweck eines Vergleichs.

   Jetzt ein durchgehendes Raster: eine Rubrikenspalte links, je Hersteller
   eine Spalte. Dieselbe Frage liegt zwangsläufig auf einer Höhe.
   Die Auswahl darüber (Chips für Bereich und Hersteller) bleibt unverändert. */
/* --- Die Gegenüberstellung ---
   Zwei Raster mit derselben Spaltendefinition: die Kopfleiste bleibt beim
   Scrollen stehen, der Körper läuft darunter durch. Ein einziges Raster mit
   overflow:hidden (für die Rundung) hätte position:sticky ausgehebelt. */
.cx-vgl {
  --vgl-spalten: 168px repeat(var(--vgl-n, 2), minmax(0, 1fr));
  margin-top: 30px;
}
.cx-vgl-kopfleiste {
  display: grid; grid-template-columns: var(--vgl-spalten);
  /* Unter der Kopfleiste, nicht dahinter: seit die Leiste stehenbleibt, wäre
     top:0 unsichtbar geworden. */
  position: sticky; top: var(--cx-kopf); z-index: 25;
  background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius) var(--cx-radius) 0 0;
}
/* Trennlinien konsequent als border-LEFT der Herstellerspalten: Die Zahl der
   Spalten steckt in einer Variablen, „die letzte Zelle einer Zeile" lässt sich
   damit per :nth-child nicht treffen. Von links gezogen entsteht die Linie
   zwischen den Spalten von selbst – und außen rechts eben keine. */
.cx-vgl-eck {
  display: flex; align-items: center; padding: 12px 15px;
  font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  font-weight: 700; color: var(--cx-steel);
}
.cx-vgl-kopf {
  display: flex; align-items: center; gap: 11px; padding: 10px 15px; min-width: 0;
  border-left: 1px solid var(--cx-border);
}
.cx-vgl-kopf .cx-logoplate { flex: none; width: 56px; height: 36px; margin: 0; }
.cx-vgl-kopf .cx-logoplate img { max-height: 24px; }
.cx-vgl-kopf .cx-logo-ersatz { font-size: 11px; }
.cx-vgl-kopf-name {
  font-weight: 700; font-size: 15px; color: var(--cx-text);
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-vgl-kopf-name:hover { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-vgl-kopf-name:hover { color: var(--cx-blue-deep); }

.cx-vgl-koerper {
  display: grid; grid-template-columns: var(--vgl-spalten);
  border: 1px solid var(--cx-border); border-top: 0;
  border-radius: 0 0 var(--cx-radius) var(--cx-radius);
  overflow: hidden;
}
.cx-vgl-rubrik, .cx-vgl-zelle {
  padding: 14px 15px; border-top: 1px solid var(--cx-border);
}
.cx-vgl-rubrik {
  background: var(--cx-graphite);
  font-size: 12.5px; font-weight: 700; color: var(--cx-text-muted);
}
.cx-vgl-rubrik.cx-vgl-hell { background: rgba(30, 123, 232, .09); color: var(--cx-blue-light); }
html[data-theme="light"] .cx-vgl-rubrik.cx-vgl-hell { color: var(--cx-blue-deep); }
.cx-vgl-rubrik-sub {
  display: block; margin-top: 3px;
  font-size: 11px; font-weight: 500; color: var(--cx-steel);
}
/* Gleicher Fall wie bei der aktiven Bereichskachel: auf dem blauen Grund
   der Abgrenzungszeile reicht Steel im hellen Modus nicht (4,16:1). */
.cx-vgl-rubrik.cx-vgl-hell .cx-vgl-rubrik-sub { color: var(--cx-text-muted); }
.cx-vgl-zelle {
  border-left: 1px solid var(--cx-border);
  font-size: 13.5px; line-height: 1.6; color: var(--cx-text-muted);
}
.cx-vgl-zelle p { margin: 0; }
.cx-vgl-zelle ul { margin: 0; padding-left: 17px; }
.cx-vgl-zelle li { margin-bottom: 5px; }
.cx-vgl-zelle li:last-child { margin-bottom: 0; }
.cx-vgl-leer { color: var(--cx-steel); font-style: italic; }
.cx-vgl-produkt { margin-bottom: 12px; }
.cx-vgl-produkt:last-child { margin-bottom: 0; }
.cx-vgl-produkt b { color: var(--cx-text); font-size: 13.5px; }
.cx-vgl-produkt a:hover b { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-vgl-produkt a:hover b { color: var(--cx-blue-deep); }
.cx-vgl-produkt p { margin-top: 2px; font-size: 12.5px; color: var(--cx-steel); }
.cx-vgl-mehr-link { display: inline-block; margin-top: 4px; font-size: 12.5px; font-weight: 600; }
.cx-vgl-ueber { margin-bottom: 14px; }
.cx-vgl-ueber:last-child { margin-bottom: 0; }
.cx-vgl-wer {
  display: block; margin-bottom: 4px;
  font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase;
  font-weight: 700; color: var(--cx-steel);
}
.cx-vgl-stamm { color: var(--cx-text); font-weight: 600; }
.cx-vgl-stamm-sub { margin-top: 3px; font-size: 12.5px; color: var(--cx-steel); }

/* Gekürzt, aber nie abgeschnitten: Beide Fassungen stehen im Dokument. */
.cx-vgl-lang { display: none; }
.cx-vgl-auf .cx-vgl-kurz { display: none; }
.cx-vgl-auf .cx-vgl-lang { display: block; }
.cx-vgl-mehr-knopf {
  display: block; margin-top: 9px; padding: 0; cursor: pointer;
  border: 0; background: none; text-align: left;
  font-family: var(--cx-font-body); font-size: 12px; font-weight: 600;
  color: var(--cx-blue-light); text-decoration: underline;
}
html[data-theme="light"] .cx-vgl-mehr-knopf { color: var(--cx-blue-deep); }

.cx-vgl-weiter { margin-top: 16px; font-size: 14px; color: var(--cx-steel); }
.cx-vgl-weiter a { font-weight: 600; margin-right: 12px; }


/* Auf schmalen Geräten läuft der Vergleich in sich seitlich – die Rubriken
   bleiben dabei stehen, sonst weiß man nach dem ersten Wischen nicht mehr,
   welche Zeile man liest. */
@media (max-width: 860px) {
  .cx-vgl { overflow-x: auto; }
  .cx-vgl-kopfleiste, .cx-vgl-koerper { min-width: 620px; }
  .cx-vgl-eck, .cx-vgl-rubrik {
    position: sticky; left: 0; z-index: 5; background: var(--cx-graphite);
  }
  .cx-vgl-kopfleiste { position: static; }
  .cx-vgl { --vgl-spalten: 128px repeat(var(--vgl-n, 2), minmax(220px, 1fr)); }
}

/* --- Theme-Umschalter & heller Modus ------------------------------------
   Styleguide.css definiert die dunkle Marken-Palette auf :root und bleibt
   unangetastet; der helle Modus überschreibt nur die Variablen.
   html[data-theme] wird vom Inline-Skript in index.html bzw. app.js gesetzt. */
.cx-theme-switch {
  position: relative; display: grid; grid-template-columns: repeat(3, 1fr);
  background: var(--cx-graphite);
  border: 1px solid var(--cx-border); border-radius: 99px;
  padding: 2px;
}
.cx-theme-switch .cx-theme-thumb {
  position: absolute; top: 2px; left: 2px;
  width: calc((100% - 4px) / 3); height: calc(100% - 4px);
  border-radius: 99px; background: var(--cx-gradient);
  transition: transform .22s ease;
}
.cx-theme-switch[data-aktiv="dark"]  .cx-theme-thumb { transform: translateX(100%); }
.cx-theme-switch[data-aktiv="light"] .cx-theme-thumb { transform: translateX(200%); }
.cx-theme-switch button {
  position: relative; z-index: 1;
  font-family: var(--cx-font-body); font-size: 11.5px; font-weight: 600;
  color: var(--cx-text-muted); background: none; border: none;
  padding: 4px 10px; border-radius: 99px; cursor: pointer; white-space: nowrap;
  transition: color .18s ease;
}
.cx-theme-switch button:hover { color: var(--cx-text); }
.cx-theme-switch button[aria-checked="true"] { color: #fff; }
@media (prefers-reduced-motion: reduce) {
  .cx-theme-switch .cx-theme-thumb { transition: none; }
}

/* ===================== Direktvergleich: Auswahl ===========================
   Der Bereich gibt das Thema vor, die Liste beantwortet, wer dort etwas
   anbietet. Vorher stand hier eine Wand aus 144 Namen. */

:root {
  /* Warnfarbe für „hier fehlt etwas“ – bewusst kein Rot: Ein Hersteller ohne
     Angebot in einem Bereich ist kein Fehler, sondern eine Eigenschaft, die
     man im Gespräch sogar zeigen will. Bernstein auf der Kartenfläche: 9,0:1. */
  --cx-warn: #E5A83B;
}

/* Für Vorlesesoftware sichtbar, für das Auge nicht – das Filterfeld trägt
   sein Label im Platzhalter, braucht aber trotzdem eins. */
.cx-visuell-versteckt {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}

/* --- Die drei Plätze --- */
.cx-vgl-slots {
  display: grid; gap: 12px; margin: 6px 0 18px;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
}
.cx-vgl-slot {
  display: flex; align-items: center; gap: 12px; min-height: 74px;
  padding: 10px 12px; border-radius: var(--cx-radius-sm);
}
.cx-vgl-slot.leer {
  border: 1px dashed var(--cx-border); color: var(--cx-steel);
  font-size: 13.5px; justify-content: center; text-align: center;
}
.cx-vgl-slot-plus { font-size: 18px; font-weight: 700; margin-right: 2px; }
.cx-vgl-slot.voll {
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-vgl-slot-platte {
  flex: none; width: 62px; height: 44px; border-radius: 8px;
  background: var(--cx-silver-light);
  display: flex; align-items: center; justify-content: center; padding: 5px;
}
.cx-vgl-slot-platte img { max-width: 100%; max-height: 34px; }
.cx-vgl-slot-platte .cx-logo-ersatz {
  font-size: 10.5px; font-weight: 700; color: var(--cx-ink);
  text-align: center; line-height: 1.15;
}
.cx-vgl-slot-text { display: grid; gap: 2px; min-width: 0; flex: 1; }
.cx-vgl-slot-text b {
  font-size: 14.5px; font-family: var(--cx-font-display);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-vgl-slot-sub { font-size: 12px; color: var(--cx-steel); }
.cx-vgl-slot-warn { font-size: 12px; font-weight: 600; color: var(--cx-warn); }
.cx-vgl-slot-weg {
  flex: none; width: 26px; height: 26px; border-radius: 50%; cursor: pointer;
  background: none; border: 1px solid var(--cx-border); color: var(--cx-steel);
  font-size: 12px; line-height: 1; transition: color .15s ease, border-color .15s ease;
}
.cx-vgl-slot-weg:hover { color: #E5484D; border-color: #E5484D; }

.cx-vgl-leitsatz { color: var(--cx-steel); font-size: 13.5px; margin: -8px 0 16px; }
.cx-vgl-meldung {
  margin: -6px 0 14px; padding: 8px 12px; border-radius: var(--cx-radius-sm);
  font-size: 13px; font-weight: 600; color: var(--cx-warn);
  background: rgba(229,168,59,.10); border: 1px solid rgba(229,168,59,.35);
}

/* --- Auswahl aus einer anderen Frage --------------------------------------
   Wer Proxmox in „Virtualisierung“ auswählt und dann über das Menü in den
   Direktvergleich geht, landet im ersten Produktbereich – und findet dort
   einen Hersteller vor, den er für DIESE Frage nie gewählt hat. Das ist
   keine Fehlbedienung, sieht aber danach aus.

   Das Band erklärt die Herkunft, statt sie nur zu behaupten, und nennt den
   Fall beim Namen, der wirklich stört: einen Gewählten, der hier gar nichts
   anbietet. Es erscheint NUR für mitgebrachte Hersteller; wer auf dieser
   Seite selbst wählt, bekommt weiterhin den schlanken Knopf in der
   Beschriftungszeile. Beides zugleich stünde für dieselbe Sache zweimal. */
.cx-hinband {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  padding: 11px 15px; margin: 0 0 14px;
  background: rgba(30,123,232,.13); border: 1px solid rgba(63,169,255,.38);
  border-radius: var(--cx-radius-sm);
}
html[data-theme="light"] .cx-hinband {
  background: rgba(13,80,216,.10); border-color: rgba(13,80,216,.30);
}
/* Dieselbe Bauform in Bernstein: für den Fall, dass die Gewählten keinen
   gemeinsamen Produktbereich haben. Bewusst kein Rot – es ist kein Fehler,
   sondern eine Eigenschaft der Auswahl, dieselbe Regel wie beim fehlenden
   Angebot in der Spalte. */
.cx-hinband.warn {
  background: rgba(229,168,59,.13); border-color: rgba(229,168,59,.40);
}
html[data-theme="light"] .cx-hinband.warn {
  background: rgba(138,90,0,.10); border-color: rgba(138,90,0,.32);
}
.cx-hinband.warn .cx-hinband-zeichen {
  background: var(--cx-warn); color: var(--cx-carbon);
  font-size: 16px; font-weight: 700; line-height: 1;
}
html[data-theme="light"] .cx-hinband.warn .cx-hinband-zeichen {
  background: var(--cx-warn); color: #fff;
}
.cx-hinband.warn .cx-hinband-text strong { color: var(--cx-warn); }
/* Helles Zeichen auf dunklem Grund und umgekehrt – ein Farbwert bedient nie
   beide Modi: Weiß auf #3FA9FF käme auf 2,2:1 und wäre im Dunkelmodus kaum
   zu erkennen. */
.cx-hinband-zeichen {
  flex: none; width: 30px; height: 30px; border-radius: 8px;
  background: var(--cx-blue-light); color: var(--cx-carbon);
  display: flex; align-items: center; justify-content: center;
}
html[data-theme="light"] .cx-hinband-zeichen {
  background: var(--cx-blue-deep); color: #fff;
}
.cx-hinband-zeichen .cx-fzeichen { width: 17px; height: 17px; }
.cx-hinband-text { flex: 1 1 300px; min-width: 0; line-height: 1.45; }
.cx-hinband-text strong {
  display: block; font: 700 14.5px var(--cx-font-display);
  color: var(--cx-blue-light);
}
html[data-theme="light"] .cx-hinband-text strong { color: var(--cx-blue-deep); }
.cx-hinband-text > span { color: var(--cx-text-muted); font-size: 13.5px; }
.cx-hinband-text b { color: var(--cx-text); font-weight: 700; }
/* Nicht --cx-blue: Weiß darauf erreicht nur 4,16:1, die Norm verlangt 4,5:1.
   Das tiefere Blau des Farbverlaufs kommt auf 6,65:1 – dieselbe Familie,
   dieselbe Regel wie bei den Fristenbalken der Zertifikatsseite. */
.cx-hinband-knopf {
  flex: none; cursor: pointer; border: 0; border-radius: 99px;
  padding: 8px 17px; font: 700 13.5px var(--cx-font-body);
  background: var(--cx-blue-deep); color: #fff;
  transition: background-color .15s;
}
.cx-hinband-knopf:hover, .cx-hinband-knopf:focus-visible { background: #0A44B8; }

/* --- Das Auswahl-Panel --- */
.cx-vgl-panel {
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); padding: 16px 16px 18px;
}
.cx-vgl-panel-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 10px;
}
.cx-vgl-panel-kopf h4 {
  margin: 0; font-family: var(--cx-font-display); font-size: 15px;
}
.cx-vgl-zaehler { margin: 0; font-size: 12.5px; color: var(--cx-steel); }
.cx-vgl-filter { display: block; margin-bottom: 12px; }
.cx-vgl-filter input {
  width: 100%; padding: 9px 12px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-text); font-family: var(--cx-font-body); font-size: 14px;
}
.cx-vgl-filter input::placeholder { color: var(--cx-steel); }
.cx-vgl-filter input:focus-visible {
  outline: 2px solid var(--cx-blue); outline-offset: 1px; border-color: var(--cx-blue);
}

.cx-vgl-raster {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(148px, 1fr));
}
.cx-vgl-kachel {
  position: relative; display: grid; gap: 6px; justify-items: center;
  padding: 12px 10px 10px; cursor: pointer; text-align: center;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); color: var(--cx-text);
  font-family: var(--cx-font-body);
  transition: border-color .15s ease, transform .15s ease;
}
.cx-vgl-kachel:hover { border-color: var(--cx-blue); transform: translateY(-1px); }
.cx-vgl-kachel:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: 2px; }
.cx-vgl-kachel.an { border-color: var(--cx-blue); box-shadow: 0 0 0 1px var(--cx-blue); }
.cx-vgl-kachel.gedimmt { opacity: .55; }
.cx-vgl-kachel.gedimmt:hover { opacity: 1; }
.cx-vgl-kachel-platte {
  width: 100%; height: 40px; border-radius: 7px; background: var(--cx-silver-light);
  display: flex; align-items: center; justify-content: center; padding: 5px;
}
.cx-vgl-kachel-platte img { max-width: 100%; max-height: 30px; }
.cx-vgl-kachel-platte .cx-logo-ersatz {
  font-size: 10px; font-weight: 700; color: var(--cx-ink); line-height: 1.15;
}
.cx-vgl-kachel-name {
  font-size: 13px; font-weight: 600; line-height: 1.2;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%;
}
.cx-vgl-kachel-n { font-size: 11.5px; color: var(--cx-steel); }
.cx-vgl-kachel-haken {
  position: absolute; top: 6px; right: 6px; width: 18px; height: 18px;
  border-radius: 50%; background: var(--cx-blue-flaeche); color: #fff;
  font-size: 11px; line-height: 18px; opacity: 0; transition: opacity .15s ease;
}
.cx-vgl-kachel.an .cx-vgl-kachel-haken { opacity: 1; }
.cx-vgl-nix { grid-column: 1 / -1; margin: 4px 0; color: var(--cx-steel); font-size: 13px; }

/* --- Die Ohne-Angebot-Gruppe: da, aber nicht im Weg --- */
.cx-vgl-ohne { margin-top: 14px; border-top: 1px solid var(--cx-border); padding-top: 12px; }
.cx-vgl-ohne summary {
  cursor: pointer; font-size: 12.5px; color: var(--cx-steel);
  list-style: none; display: flex; align-items: baseline; gap: 7px;
}
.cx-vgl-ohne summary::-webkit-details-marker { display: none; }
.cx-vgl-ohne summary::before {
  content: '▸'; font-size: 10px; transition: transform .15s ease; flex: none;
}
.cx-vgl-ohne[open] summary::before { transform: rotate(90deg); }
.cx-vgl-ohne summary:hover { color: var(--cx-text); }
.cx-vgl-ohne .cx-vgl-raster { margin-top: 12px; }

/* --- Das Hinweis-Band: der Ausweg statt der Sackgasse --- */
.cx-vgl-band {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap; margin: 18px 0 4px;
  padding: 14px 16px; border-radius: var(--cx-radius);
  background: rgba(53,224,218,.07); border: 1px solid rgba(53,224,218,.30);
  border-left: 3px solid var(--cx-accent);
}
.cx-vgl-band p { margin: 0; font-size: 14px; }
.cx-vgl-band b { color: var(--cx-accent); }
.cx-vgl-band .cx-btn { flex: none; }

/* --- Die Lücke als Aussage, nicht als Strich --- */
.cx-vgl-luecke { margin: 0 0 6px; color: var(--cx-steel); font-size: 13.5px; }
.cx-vgl-luecke-sub { margin: 0; color: var(--cx-steel); font-size: 12.5px; line-height: 1.45; }

@media (prefers-reduced-motion: reduce) {
  .cx-vgl-kachel, .cx-vgl-kachel-haken, .cx-vgl-ohne summary::before,
  .cx-vgl-slot-weg { transition: none; }
  .cx-vgl-kachel:hover { transform: none; }
}

@media (max-width: 640px) {
  .cx-vgl-slots { grid-template-columns: 1fr; }
  .cx-vgl-raster { grid-template-columns: repeat(auto-fill, minmax(124px, 1fr)); }
  .cx-vgl-band { flex-direction: column; align-items: flex-start; }
}

/* ===================== SSL/TLS-Zertifikate ================================
   Die Seite hat eine Zahlenreihe im Zentrum – 398 → 200 → 100 → 47 Tage.
   Alles Weitere ordnet sich dieser Reihe unter. */

.cx-zert-frage {
  font-family: var(--cx-font-display); font-size: 19px; font-weight: 600;
  color: var(--cx-blue-light); margin: 14px 0 18px;
}
html[data-theme="light"] .cx-zert-frage { color: var(--cx-blue-deep); }

/* --- Der Ausweis ---
   Die Zeichnung stand bis 1.133.2 auf 460 px in einem 1.150 px breiten Kasten.
   Ich hatte sie beim Breitenlauf zu 1.133.1 als einzige stehen lassen – eine
   Grafik werde über die volle Breite nicht lesbarer, nur größer. Stefans
   Antwort darauf war „auch größer machen", und damit ist es entschieden.
   Über die volle Breite ist der Ausweis 1.150 × 575 px; das Seitenverhältnis
   kommt aus der viewBox (420 × 210) und bleibt erhalten. Wer ihn wieder
   kleiner will, setzt hier max-width zurück – 460 px war der alte Wert,
   760 px wären ein Mittelweg (dann 380 px hoch). */
.cx-zert-bild { margin: 0 0 20px; }
.cx-zert-bild svg { width: 100%; height: auto; display: block; margin: 0 auto; }
.cx-zert-karte { fill: var(--cx-carbon); stroke: var(--cx-border); stroke-width: 1.5; }
.cx-zert-trenner { stroke: var(--cx-border); stroke-width: 1.5; }
.cx-zert-kopf {
  fill: var(--cx-steel); font-family: var(--cx-font-body); font-size: 12px;
  font-weight: 700; letter-spacing: .18em;
}
.cx-zert-portrait rect { fill: none; stroke: var(--cx-border); stroke-width: 1.5; }
.cx-zert-portrait circle, .cx-zert-portrait path {
  fill: none; stroke: var(--cx-steel); stroke-width: 2;
}
.cx-zert-zeilen text {
  fill: var(--cx-steel); font-family: var(--cx-font-body); font-size: 11px;
}
.cx-zert-zeilen text.wert {
  fill: var(--cx-text); font-size: 14px; font-weight: 600;
}
.cx-zert-siegel circle { fill: none; stroke: var(--cx-accent); stroke-width: 2; }
.cx-zert-siegel path { fill: none; stroke: var(--cx-accent); stroke-width: 3;
  stroke-linecap: round; stroke-linejoin: round; }

.cx-zert-zusagen { display: grid; gap: 12px; margin: 18px 0 14px; }
.cx-zert-zusage { display: flex; gap: 12px; align-items: flex-start; }
.cx-zert-zusage p { margin: 2px 0 0; color: var(--cx-text-muted); font-size: 14px; }
.cx-zert-haken {
  flex: none; width: 22px; height: 22px; border-radius: 50%; margin-top: 1px;
  background: rgba(53,224,218,.14); color: var(--cx-accent);
  display: flex; align-items: center; justify-content: center; font-size: 12px;
}
html[data-theme="light"] .cx-zert-haken { background: rgba(15,118,110,.10); }
.cx-zert-ohne {
  margin: 0; padding: 12px 14px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border-left: 3px solid var(--cx-warn);
  font-size: 14px; color: var(--cx-text-muted);
}

/* --- Ablauf und Prüfungen --- */
.cx-zert-fluss { display: grid; justify-items: center; gap: 6px; margin: 18px 0 22px; }
.cx-zert-fluss-schritt {
  display: grid; justify-items: center; gap: 2px; padding: 10px 18px;
  border-radius: var(--cx-radius-sm); background: var(--cx-graphite);
  border: 1px solid var(--cx-border); min-width: 260px; text-align: center;
}
.cx-zert-fluss-schritt b { font-size: 13px; }
.cx-zert-fluss-schritt span { font-size: 13px; color: var(--cx-text-muted); }
.cx-zert-fluss-pfeil { color: var(--cx-steel); font-size: 15px; line-height: 1; }

.cx-zert-pruefungen, .cx-zert-punkte, .cx-zert-wege,
.cx-zert-schritte, .cx-zert-clients, .cx-zert-faelle {
  display: grid; gap: 14px; margin-top: 16px;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.cx-zert-pruefung, .cx-zert-punkt, .cx-zert-weg,
.cx-zert-schritt, .cx-zert-client { padding: 16px 18px; }
.cx-zert-pruefung b, .cx-zert-punkt b, .cx-zert-weg b,
.cx-zert-schritt b, .cx-zert-client b {
  display: block; font-family: var(--cx-font-display); font-size: 15px; margin-bottom: 6px;
}
.cx-zert-pruefung p, .cx-zert-punkt p, .cx-zert-weg p,
.cx-zert-schritt p, .cx-zert-client p {
  margin: 0; font-size: 14px; color: var(--cx-text-muted); line-height: 1.55;
}
.cx-zert-nr {
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px; border-radius: 50%; margin-bottom: 8px;
  background: var(--cx-blue-flaeche); color: #fff; font-size: 12.5px; font-weight: 700;
}
.cx-zert-kern {
  padding: 16px 18px; border-left: 3px solid var(--cx-blue); margin: 16px 0;
}
.cx-zert-kern p { margin: 0; font-size: 16px; font-weight: 600; }
.cx-zert-quelle { font-size: 13px; color: var(--cx-steel); margin-top: 12px; }

/* --- Die Fristenleiste: das Herzstück --- */
.cx-zert-fristen { padding: 18px 20px; display: grid; gap: 16px; }
.cx-zert-frist { display: grid; gap: 5px; }
.cx-zert-frist-ab {
  font-family: var(--cx-font-display); font-size: 14px; font-weight: 600;
}
.cx-zert-frist-bahn {
  height: 34px; border-radius: 8px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); overflow: hidden;
}
.cx-zert-frist-balken {
  height: 100%; display: flex; align-items: center; padding-left: 12px;
  border-radius: 7px 0 0 7px; background: var(--cx-steel);
  transition: width .35s ease;
}
.cx-zert-frist-balken span {
  font-size: 13px; font-weight: 700; color: var(--cx-carbon); white-space: nowrap;
}
/* Abgelöst blass, geltend blau, kommend im Akzent – die Farbe sagt, wo man steht. */
.cx-zert-frist.alt .cx-zert-frist-balken { background: var(--cx-border); }
/* --cx-silver statt --cx-steel: Der abgelöste Balken soll zurücktreten, aber
   lesbar bleiben. Steel auf der hellen Rahmenfläche kommt nur auf 3,92:1. */
.cx-zert-frist.alt .cx-zert-frist-balken span { color: var(--cx-silver); }
.cx-zert-frist.alt .cx-zert-frist-ab { color: var(--cx-steel); }
/* Nicht --cx-blue: Weiß darauf erreicht nur 4,16:1, die Norm verlangt 4,5:1
   für Text dieser Größe. Das tiefere Blau des Farbverlaufs kommt auf 6,65:1
   und bleibt dieselbe Farbfamilie. */
.cx-zert-frist.gilt .cx-zert-frist-balken { background: var(--cx-blue-deep); }
.cx-zert-frist.gilt .cx-zert-frist-balken span { color: #fff; }
.cx-zert-frist.kommt .cx-zert-frist-balken { background: var(--cx-accent); }
.cx-zert-frist.kommt .cx-zert-frist-balken span { color: var(--cx-carbon); }
html[data-theme="light"] .cx-zert-frist.kommt .cx-zert-frist-balken span { color: #fff; }
.cx-zert-frist-note { font-size: 12.5px; color: var(--cx-steel); }
.cx-zert-frist-note b { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-zert-frist-note b { color: var(--cx-blue-deep); }

/* --- Missbrauchsfenster: zwei Bahnen im selben Maßstab --- */
.cx-zert-risiko {
  display: grid; gap: 16px; margin: 18px 0 6px;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}
.cx-zert-bahn {
  padding: 16px 18px; border-radius: var(--cx-radius);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-zert-bahn-kopf {
  font-family: var(--cx-font-display); font-size: 15px; font-weight: 600; margin-bottom: 10px;
}
.cx-zert-bahn-spur {
  height: 12px; border-radius: 6px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); overflow: hidden; margin-bottom: 10px;
}
.cx-zert-bahn-fuell { height: 100%; border-radius: 5px 0 0 5px; }
.cx-zert-bahn.lang .cx-zert-bahn-fuell { background: var(--cx-warn); }
.cx-zert-bahn.kurz .cx-zert-bahn-fuell { background: var(--cx-accent); }
.cx-zert-bahn p { margin: 0; font-size: 14px; color: var(--cx-text-muted); line-height: 1.55; }

/* --- Takt: wie oft im Jahr --- */
.cx-zert-takt { padding: 18px 20px; display: grid; gap: 12px; }
.cx-zert-takt-zeile {
  display: grid; grid-template-columns: 92px 1fr auto; gap: 14px; align-items: center;
}
.cx-zert-takt-wann { font-size: 13.5px; color: var(--cx-steel); }
.cx-zert-takt-punkte {
  color: var(--cx-blue); font-size: 13px; letter-spacing: .32em; overflow: hidden;
}
/* Die Punktreihe trägt eine Information – wie oft etwas fällig wird –, also
   gilt für sie die Textnorm. Auf der weißen Karte kommt --cx-blue nur auf
   4,16:1; das tiefe Blau erreicht 6,65:1. Im dunklen Modus bleibt es beim
   Elektroblau, dort steht es mit 4,55:1 gegen die Karte richtig. */
html[data-theme="light"] .cx-zert-takt-punkte { color: var(--cx-blue-deep); }
.cx-zert-takt-oft { font-size: 13.5px; font-weight: 600; white-space: nowrap; }
.cx-zert-kette {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-top: 6px; padding-top: 14px; border-top: 1px solid var(--cx-border);
}
.cx-zert-kette span {
  padding: 5px 11px; border-radius: 99px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); font-size: 12.5px;
}
.cx-zert-kette em { color: var(--cx-steel); font-style: normal; }

/* --- Kosten, Merksätze, Warnung --- */
.cx-zert-kosten { padding: 20px 22px; }
.cx-zert-kosten h2 { margin-top: 0; }
.cx-zert-antwort {
  font-family: var(--cx-font-display); font-size: 30px; font-weight: 700;
  color: var(--cx-accent); margin: 0 0 10px;
}
.cx-zert-merksatz {
  font-family: var(--cx-font-display); font-size: 16px; font-weight: 600;
  color: var(--cx-blue-light); margin: 14px 0 0;
}
html[data-theme="light"] .cx-zert-merksatz { color: var(--cx-blue-deep); }
.cx-zert-warnung {
  padding: 14px 16px; border-left: 3px solid var(--cx-warn); margin-top: 16px;
}
.cx-zert-warnung p { margin: 0; font-size: 14px; }

/* --- Die Rechnung --- */
.cx-zert-rechnung { padding: 20px 22px; display: grid; gap: 16px; }
.cx-zert-posten { display: grid; gap: 8px; }
.cx-zert-posten > div { display: flex; align-items: baseline; gap: 12px; font-size: 14px; }
.cx-zert-zahl {
  font-family: var(--cx-font-display); font-size: 20px; font-weight: 700;
  color: var(--cx-blue-light); min-width: 44px;
}
html[data-theme="light"] .cx-zert-zahl { color: var(--cx-blue-deep); }
.cx-zert-zahl.gross { font-size: 34px; }
.cx-zert-summe {
  display: flex; align-items: baseline; gap: 12px;
  padding-top: 14px; border-top: 1px solid var(--cx-border);
}
.cx-zert-formel {
  display: flex; flex-wrap: wrap; align-items: center; gap: 12px;
  padding: 14px 16px; border-radius: var(--cx-radius-sm); background: var(--cx-carbon);
  font-size: 14px;
}
.cx-zert-formel em { color: var(--cx-steel); font-style: normal; font-size: 17px; }
.cx-zert-formel b { color: var(--cx-accent); font-size: 15px; }

/* --- VPN: gilt / gilt nicht --- */
.cx-zert-fall { padding: 16px 18px; }
.cx-zert-fall.gilt { border-left: 3px solid var(--cx-warn); }
.cx-zert-fall.frei { border-left: 3px solid var(--cx-accent); }
.cx-zert-marke {
  display: inline-block; margin-bottom: 8px; padding: 3px 9px; border-radius: 99px;
  font-size: 11px; font-weight: 700; letter-spacing: .04em;
}
.cx-zert-fall.gilt .cx-zert-marke { background: rgba(229,168,59,.14); color: var(--cx-warn); }
.cx-zert-fall.frei .cx-zert-marke { background: rgba(53,224,218,.14); color: var(--cx-accent); }
html[data-theme="light"] .cx-zert-fall.gilt .cx-zert-marke { background: rgba(138,90,0,.10); }
html[data-theme="light"] .cx-zert-fall.frei .cx-zert-marke { background: rgba(15,118,110,.10); }

/* --- Tabellen: scrollen in sich, nicht die Seite --- */
.cx-tabelle-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; margin-top: 16px; }
.cx-zert-tabelle { width: 100%; border-collapse: collapse; min-width: 620px; }
.cx-zert-tabelle th {
  text-align: left; padding: 10px 14px; font-size: 11.5px; font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase; color: var(--cx-steel);
  border-bottom: 1px solid var(--cx-border);
}
.cx-zert-tabelle td {
  padding: 13px 14px; font-size: 14px; vertical-align: top;
  border-bottom: 1px solid var(--cx-border); line-height: 1.55;
}
.cx-zert-tabelle td:first-child { font-weight: 600; white-space: nowrap; }
.cx-zert-tabelle a { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-zert-tabelle a { color: var(--cx-blue-deep); }
.cx-zert-art { color: var(--cx-steel); font-size: 13px; white-space: nowrap; }

/* --- Fazit --- */
.cx-zert-fazit { padding: 22px 24px; }
.cx-zert-fazit h2 { margin-top: 0; }
.cx-zert-fazit h3 { font-size: 15px; margin: 20px 0 8px; }
.cx-zert-fragen { margin: 0; padding-left: 20px; }
.cx-zert-fragen li { margin-bottom: 7px; font-size: 14.5px; }

@media (prefers-reduced-motion: reduce) {
  .cx-zert-frist-balken { transition: none; }
}
@media (max-width: 640px) {
  .cx-zert-takt-zeile { grid-template-columns: 74px 1fr; }
  .cx-zert-takt-oft { grid-column: 2; font-size: 12.5px; }
  .cx-zert-antwort { font-size: 26px; }
  .cx-zert-fluss-schritt { min-width: 0; width: 100%; }
}

/* ===================== Suche über alles (⌘K) ==============================
   Die Schaltfläche steht am Ende der Menüzeile und soll dort NICHT wie ein
   sechster Menüpunkt wirken – sie führt nicht auf eine Seite, sie öffnet ein
   Werkzeug. Deshalb Rahmen statt Unterstrich. */

/* Die Suchfläche selbst steht oben bei der Kopfzeile (.cx-suchfeld). Hier
   bleiben nur Lupe und Tastenkürzel – beide werden dort weiterverwendet. */
.cx-suchfeld:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: 2px; }
.cx-suche-lupe { font-size: 16px; line-height: 1; flex: none; }
.cx-suche-kbd {
  font-family: var(--cx-font-body); font-size: 10.5px; padding: 1px 5px;
  border-radius: 5px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); color: var(--cx-steel);
}

/* --- Das Palettenfenster --- */
.cx-palette {
  width: min(620px, calc(100vw - 32px)); padding: 0; overflow: hidden;
  margin-top: 12vh;  /* nicht mittig: das Auge sucht oben, und die Trefferliste
                        wächst nach unten, ohne dass das Fenster springt */
}
.cx-pal-kopf {
  display: flex; align-items: center; gap: 10px;
  padding: 12px 14px; border-bottom: 1px solid var(--cx-border);
}
.cx-pal-lupe { font-size: 19px; color: var(--cx-steel); line-height: 1; }
.cx-palette input#cx-pal-feld {
  flex: 1; margin: 0; border: none; background: none; padding: 4px 0;
  font-size: 16px; color: var(--cx-text);
}
.cx-palette input#cx-pal-feld:focus { outline: none; }
.cx-pal-zu {
  flex: none; cursor: pointer; padding: 3px 8px; border-radius: 6px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-steel); font-family: var(--cx-font-body); font-size: 11px;
}
.cx-pal-zu:hover { color: var(--cx-text); }

.cx-pal-liste { max-height: min(52vh, 460px); overflow-y: auto; padding: 6px; }
.cx-pal-gruppe + .cx-pal-gruppe { margin-top: 4px; }
.cx-pal-gruppe-titel {
  padding: 8px 10px 4px; font-size: 10.5px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-pal-zeile {
  display: flex; align-items: center; gap: 11px; width: 100%; cursor: pointer;
  padding: 8px 10px; border: none; border-radius: var(--cx-radius-sm);
  background: none; color: var(--cx-text); text-align: left;
  font-family: var(--cx-font-body);
}
/* Der blaue Balken links macht die Auswahl auch dann erkennbar, wenn die
   Flächentönung bei hohem Umgebungslicht untergeht. */
.cx-pal-zeile.aktiv {
  background: rgba(30,123,232,.14);
  box-shadow: inset 3px 0 0 var(--cx-blue);
}
.cx-pal-zeile:hover { background: rgba(30,123,232,.08); }
.cx-pal-platte {
  flex: none; width: 46px; height: 32px; border-radius: 6px;
  background: var(--cx-silver-light);
  display: flex; align-items: center; justify-content: center; padding: 4px;
}
.cx-pal-platte img { max-width: 100%; max-height: 24px; }
.cx-pal-platte .cx-logo-ersatz {
  font-size: 8.5px; font-weight: 700; color: var(--cx-ink); line-height: 1.1;
  text-align: center;
}
.cx-pal-zeichen {
  flex: none; width: 46px; height: 32px; border-radius: 6px;
  display: flex; align-items: center; justify-content: center;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-steel); font-size: 14px; font-weight: 700;
}
.cx-pal-text { display: grid; gap: 1px; min-width: 0; }
.cx-pal-text b {
  font-size: 14px; font-family: var(--cx-font-display); font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-pal-text span {
  font-size: 12px; color: var(--cx-steel);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-pal-nix { margin: 0; padding: 22px 12px; text-align: center;
  color: var(--cx-steel); font-size: 13.5px; }
.cx-pal-fuss {
  display: flex; gap: 16px; flex-wrap: wrap;
  padding: 9px 14px; border-top: 1px solid var(--cx-border);
  background: var(--cx-carbon); font-size: 11.5px; color: var(--cx-steel);
}
.cx-pal-fuss kbd {
  font-family: var(--cx-font-body); font-size: 10.5px; padding: 1px 5px;
  margin-right: 3px; border-radius: 4px; background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
}

@media (prefers-reduced-motion: reduce) {
  .cx-suchfeld, .cx-pal-zu { transition: none; }
}
@media (max-width: 640px) {
  .cx-palette { margin-top: 6vh; }
}

html[data-theme="light"] {
  --cx-carbon:      #F4F5F8;  /* Seitenhintergrund hell */
  --cx-graphite:    #FFFFFF;  /* Kartenflächen hell */
  --cx-border:      #DFE3E9;
  --cx-steel:       #64707D;
  --cx-silver:      #4A545F;
  --cx-text:        #14171C;
  --cx-text-muted:  #3C4550;
  /* Akzent abgedunkelt: das Cyan #35E0DA erreicht auf Weiß nur 1,64:1 und ist
     damit faktisch unlesbar. Dieses Petrol bleibt in derselben Farbfamilie,
     kommt aber auf 5,47:1 und erfüllt damit die Norm für Fließtext (4,5:1).
     Bewusst kein Blau: Das ist hier die Linkfarbe – sonst sähen die Unterzeilen
     im Glossar aus wie anklickbare Verweise. */
  --cx-accent:      #0F766E;
  /* Dasselbe Problem beim Bernstein: #E5A83B kommt auf Weiß nur auf 2,1:1.
     Dieses dunklere Ocker bleibt dieselbe Farbfamilie und erreicht 5,9:1. */
  --cx-warn:        #8A5A00;
}
/* Warn- und Hinweisflächen tragen im hellen Modus eigene Tönungen: Die
   Wash-Werte oben sind auf dunklen Grund gerechnet und verschwinden auf Weiß
   praktisch spurlos. */
html[data-theme="light"] .cx-vgl-meldung {
  background: rgba(138,90,0,.07); border-color: rgba(138,90,0,.30);
}
html[data-theme="light"] .cx-vgl-band {
  background: rgba(15,118,110,.06); border-color: rgba(15,118,110,.28);
}
/* --- Textblau im hellen Modus -------------------------------------------
   --cx-blue-light (#3FA9FF) erreicht auf dem hellen Grund #F4F5F8 nur 2,5:1;
   die Norm verlangt 4,5:1 für Fließtext. Die Variable selbst lässt sich nicht
   umdefinieren – sie steckt auch im Farbverlauf der aktiven Filter-Chips, der
   dadurch seine Leuchtkraft verlöre. Deshalb gezielt für Text, in derselben
   Machart wie die schon vorhandenen Einzelregeln weiter unten.

   Bewusst NICHT als nacktes `html[data-theme="light"] a`: Diese Spezifität
   (0,1,1) schlüge auch `.cx-chip` (0,1,0) und färbte die Filterknöpfe blau. */
html[data-theme="light"] .cx-mehr,
html[data-theme="light"] .cx-glossar-link,
html[data-theme="light"] .cx-produkt h3,
html[data-theme="light"] .cx-cmp-produkt a strong,
html[data-theme="light"] .cx-mitre-begriffe h3,
html[data-theme="light"] .cx-mitre-nutzen h3,
html[data-theme="light"] .cx-raid-empfehlung h3,
html[data-theme="light"] .cx-raid-abk span,
html[data-theme="light"] .cx-version-schema b,
html[data-theme="light"] .cx-version-regel li b,
html[data-theme="light"] .cx-ip-netzteil,
html[data-theme="light"] .cx-rp-hervor,
html[data-theme="light"] .cx-rp-regel code,
html[data-theme="light"] .cx-breadcrumb a,
html[data-theme="light"] .cx-quellen a,
html[data-theme="light"] .cx-meta a { color: var(--cx-blue-deep); }

/* Zweite Runde, gemessen statt geraten. Zwei weitere Ursachen:
   1. Kacheln SIND Links – ihre Überschriften erben damit --cx-blue-light
      (2,5:1 auf Weiß). Blau bleibt, nur eine Stufe dunkler.
   2. --cx-blue selbst (#1E7BE8) kommt auf hellem Grund nur auf 3,8:1; das
      reicht für 12-px-Ziffern nicht. Betrifft die durchnummerierten Elemente
      in ATT&CK, WAF, IP und der Versionsliste. */
html[data-theme="light"] .cx-card h3,
html[data-theme="light"] .cx-card h4,
html[data-theme="light"] .cx-kette-nr,
html[data-theme="light"] .cx-version-nr,
html[data-theme="light"] .cx-mitre-schritt,
html[data-theme="light"] .cx-mitre-marke,
html[data-theme="light"] .cx-ip-weg-nr,
html[data-theme="light"] .cx-raid-minimum-zahl { color: var(--cx-blue-deep); }
/* Steel auf der hellblauen Fläche: 4,46:1 – knapp unter der Schwelle. */
html[data-theme="light"] .cx-ip-wer,
html[data-theme="light"] .cx-ip-rechnung i,
html[data-theme="light"] .cx-ip-nat-kasten i,
html[data-theme="light"] .cx-bq-chip em { color: var(--cx-text-muted); }

/* Dritte Runde: Links OHNE eigene Klasse – Herstellerverweise in den
   Know-how-Seiten, Quellenangaben, Fußnoten. Sie erben --cx-blue-light aus
   Styleguide.css und stehen damit bei 2,3:1.

   Bewusst auf `main a` begrenzt (Spezifität 0,1,2) statt auf `a`: Kopfzeile,
   Menü und Fußzeile haben eigene, geprüfte Farben und sollen sie behalten.
   Die Ausnahmen darunter stellen wieder her, was innerhalb von main eine
   eigene Farbe hatte – sonst würde diese Regel sie mit übermalen. */
html[data-theme="light"] main a { color: var(--cx-blue-deep); }
html[data-theme="light"] main a.cx-chip { color: var(--cx-text-muted); }
html[data-theme="light"] main a.cx-chip.active { color: #fff; }
html[data-theme="light"] main a.cx-card,
html[data-theme="light"] main a.cx-logoplate { color: inherit; }
/* Die Knöpfe brauchen ihre EIGENE Farbe zurück, nicht die geerbte: `inherit`
   holt die Fließtextfarbe des Elternelements (#3C4550) – auf dem blauen
   Verlauf des Hauptknopfs sind das 1,46:1, praktisch unlesbar. Im dunklen
   Modus fiel das nie auf, weil dort keine Regel die Knopfschrift überschreibt.
   Beim Chip daneben stand die Lösung schon richtig da: die Farbe nennen. */
html[data-theme="light"] main a.cx-btn { color: #fff; }
html[data-theme="light"] main a.cx-btn-secondary { color: var(--cx-text); }
html[data-theme="light"] main a.cx-card h3,
html[data-theme="light"] main a.cx-card h4 { color: var(--cx-blue-deep); }


html[data-theme="light"] body { background: var(--cx-carbon); color: var(--cx-text); }
/* ---- Logo-Platten im hellen Modus (1.93.1) -----------------------------
   Gemeldet: „Im hellen Modus kommen die Logos nicht richtig rüber." Gemessen
   und bestätigt – die Platte grenzt sich vom Grund praktisch nicht ab:

     Steckbriefkopf   Platte #F2F4F7 auf Seitengrund #F4F5F8 =  1,01:1
     Herstellerkarte  Platte #F2F4F7 auf Kartenfläche #FFFFFF =  1,10:1
     Rahmen bisher    #DFE3E9 gegen die beiden Gründe         =  1,18 / 1,29

   Unter 1,3:1 trennt ein Auge nichts mehr; im Steckbriefkopf schwebt das Logo
   damit scheinbar frei auf der Seite. Drei Messungen haben die Lösung bestimmt:

   1. DIE FLÄCHE TRÄGT HIER FAST NICHTS. Selbst eine deutlich graue Platte
      (#D5DCE6) käme nur auf 1,27 gegen den Seitengrund – und würde zugleich
      alle Logos schwächen. Dasselbe Ergebnis wie 1.90.2 bei den Startseiten-
      Karten: In diesem hellen Design ist Fläche gegen Fläche kein Mittel.
   2. DER RAHMEN TRÄGT. #C9CFD8 erreicht 1,44 gegen den Seitengrund und 1,57
      gegen die Kartenfläche. Der Ton ist im Projekt schon in Gebrauch (helle
      Sekundärknöpfe), also kein neuer Farbwert.
   3. WEISS IST DER BESTE PLATTENGRUND. Von den 237 tatsächlich verwendeten
      Logos sind 204 dunkel (128 sehr dunkel, 76 dunkel), im Canvas bei 74 px
      Anzeigehöhe durchgemessen. Reines Weiß hebt sie am stärksten heraus
      (17,4:1 statt 15,8:1 bei einem #1A1A1A-Logo) und macht die Platte im
      Steckbriefkopf zur hellen Insel statt zu gar nichts. Die sieben hellen
      Logofassungen im Ordner („-weiss", „-hell") sind NICHT verdrahtet –
      geprüft: kein Hersteller verweist darauf.

   Der Schatten bleibt den großen Platten vorbehalten: Auf einer weißen Karte
   ist die weiße Platte sonst nur ein Rahmen, und das wirkt flach. */
html[data-theme="light"] .cx-logoplate {
  background: #FFFFFF;
  border: 1px solid #C9CFD8;
  box-shadow: 0 1px 2px rgba(20, 23, 28, .07);
}
/* Die vier kleinen Platten hatten bisher GAR KEINEN Rahmen und stehen auf
   content-box – ein Rahmen ohne border-box würde jede um 2 px wachsen lassen
   und Raster verschieben. Deshalb hier ausdrücklich, und nur hier: Bei
   .cx-logoplate bleibt content-box, weil dort schon ein Rahmen sitzt und sich
   an der Größe nichts ändern soll. */
html[data-theme="light"] .cx-vgl-slot-platte,
html[data-theme="light"] .cx-vgl-kachel-platte,
html[data-theme="light"] .cx-pal-platte,
html[data-theme="light"] .cx-rad-chip-platte {
  background: #FFFFFF;
  border: 1px solid #C9CFD8;
  box-sizing: border-box;
}
/* Ausnahme: Der Radar-Knoten für Wettbewerber OHNE eigenen Steckbrief soll
   zurücktreten – gestrichelter Rahmen, gedämpfte Fläche. Seine eigene Regel
   gewinnt bei Fläche und Rahmen über die Spezifität (0,3,0 gegen 0,2,1), beim
   Schatten hatte sie aber keine Konkurrenz: Gemessen bekam die gestrichelte
   Platte den Schatten mit und wurde damit hervorgehoben statt zurückgenommen.
   Nur im hellen Modus nötig, weil es den Schatten nur dort gibt. */
html[data-theme="light"] .cx-rad-node.fremd .cx-logoplate { box-shadow: none; }
html[data-theme="light"] .cx-btn-secondary,
html[data-theme="light"] .cx-cmp-toggle { border-color: #C9CFD8; }
/* Beim ÜBERFAHREN im hellen Modus: --cx-blue-light (#3FA9FF) kommt auf der
   weißen Kartenfläche auf 2,52:1 – die Beschriftung verschwindet fast, sobald
   der Zeiger draufsteht. --cx-blue-deep erreicht 6,65:1. Nachgerechnet, nicht
   angesehen: Der Zustand entsteht erst durch die Maus und ist auf keinem
   Bildschirmfoto zu sehen.

   Dasselbe Mittel wenden die Regeln für Fußzeile, Vergleichskopf, Marktzeilen
   und sieben weitere Stellen längst an; hier fehlte es noch. Betrifft alle
   Sekundärknöpfe der Website – seit 1.68.0 steht einer davon prominent auf der
   Anmeldeseite („Noch kein Konto“). */
html[data-theme="light"] .cx-btn-secondary:hover,
html[data-theme="light"] .cx-cmp-toggle:hover,
html[data-theme="light"] .cx-mz-leise:hover { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-consent { box-shadow: 0 12px 40px rgba(20,23,28,.18); }
html[data-theme="light"] .cx-card { box-shadow: 0 1px 3px rgba(20,23,28,.06); }

/* --- Teaser: Sperrflächen für nicht angemeldete Gäste --------------------
   Die Inhalte sind serverseitig gar nicht erst ausgeliefert – diese Flächen
   erklären nur, was hinter der Anmeldung liegt.
   Der Erklärtext lief bis 1.130.2 gegen eine Deckelung von 720 px in einem
   1.152 px breiten Kasten. Er ist die Antwort auf die Überschrift darüber
   und keine Randnotiz; bei 17 px passt er jetzt auf eine Zeile statt zwei. */
.cx-gesperrt {
  background: var(--cx-graphite);
  border: 1px dashed var(--cx-border);
  border-radius: var(--cx-radius);
  padding: 22px 24px;
  position: relative;
}
.cx-gesperrt h2 { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; }
.cx-gesperrt .cx-btn,
.cx-gesperrt .cx-btn-secondary { margin: 8px 10px 0 0; padding: 10px 22px; font-size: 15px; }
.cx-schloss {
  font-family: monospace; font-size: 11.5px; font-weight: 400;
  color: var(--cx-steel); border: 1px solid var(--cx-border);
  border-radius: 99px; padding: 3px 12px;
}
.cx-pos-gesperrt { color: var(--cx-steel); font-style: italic; }
.cx-produkt-teaser, .cx-produkt-mehr { opacity: .8; }
.cx-produkt-mehr h3 { color: var(--cx-steel); }
.cx-login-ok { color: var(--cx-accent); margin: 12px 0 0; }

/* --- Glossar: Abkürzungen kurz und alltagssprachlich erklärt --------------
   Zwei Spalten, damit sich beim Überfliegen viele Begriffe auf einmal
   erfassen lassen; Querverweise sind Buttons, weil ein echter Anker mit dem
   Hash-Routing kollidieren würde. */
.cx-glossar {
  display: grid; gap: var(--cx-gap);
  /* min(): sonst bleibt die Spalte auch auf schmalen Displays 360 px breit
     und die Seite läuft seitlich über. */
  grid-template-columns: repeat(auto-fill, minmax(min(360px, 100%), 1fr));
  margin-top: 24px;
  /* stretch (Vorgabe) statt start: sonst richtet sich jede Kachel nach ihrem
     eigenen Textumfang und die Reihe wird unterschiedlich hoch. */
  align-items: stretch;
}
/* Kein eigenes scroll-margin mehr: Das steht jetzt als scroll-padding am
   Scrollbereich und würde sich sonst zum dortigen Wert addieren. */
.cx-glossar-eintrag {
  transition: border-color .2s, box-shadow .2s;
  display: flex; flex-direction: column;
}
.cx-glossar-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; flex-wrap: wrap;
}
.cx-glossar-kopf h3 { margin: 0; font-size: 21px; letter-spacing: .01em; }
.cx-glossar-kopf .cx-tag { flex: none; }
.cx-glossar-lang {
  margin: 4px 0 10px; font-size: 14px; color: var(--cx-accent); font-weight: 500;
}
/* flex: 1 füllt die Resthöhe der Kachel, damit die Trennlinie und die
   Querverweise in einer Reihe auf gleicher Höhe stehen. Der Text selbst
   bleibt oben, nur die Box wächst. */
.cx-glossar-text { margin: 0; font-size: 15px; line-height: 1.62; flex: 1; }
.cx-glossar-siehe {
  margin: 14px 0 0; padding-top: 12px; border-top: 1px solid var(--cx-border);
  font-size: 13px; color: var(--cx-steel);
}
.cx-glossar-link {
  background: none; border: none; cursor: pointer; padding: 2px 4px;
  margin-left: 4px; font: inherit; color: var(--cx-blue); text-decoration: underline;
  text-underline-offset: 2px;
}
.cx-glossar-link:hover { color: var(--cx-accent); }
.cx-glossar-treffer { border-color: var(--cx-accent); box-shadow: 0 0 0 2px rgba(53,224,218,.20); }
html[data-theme="light"] .cx-glossar-treffer { box-shadow: 0 0 0 2px rgba(20,23,28,.10); }

/* --- Know-How: die Auswahlseite in drei Bändern ---------------------------
   Zehn Beiträge in einem flachen Raster sagen nur, DASS es sie gibt. Die
   Bänder sagen, WANN man sie braucht – und das ist die Frage, mit der man
   herkommt. Das Kachelmaß bleibt bewusst breit (420 px Mindestbreite): Die
   Kacheln sollen wie Türen wirken, nicht wie der Anfang einer langen Liste. */
.cx-wissen-band { margin-top: 40px; }
.cx-wissen-band:first-of-type { margin-top: 26px; }
.cx-wissen-bandkopf {
  display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
  padding-bottom: 12px; border-bottom: 1px solid var(--cx-border);
}
.cx-wissen-bandkopf h2 { font-size: 21px; margin: 0; }
.cx-wissen-anzahl {
  font-size: 12.5px; color: var(--cx-steel); font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase; white-space: nowrap;
}
/* Die Erklärzeile darf umbrechen, aber erst als Letztes – deshalb eine große
   Grundbreite: Bei mittleren Fenstern rutscht sie unter Titel und Zahl,
   statt beide auseinanderzureißen. */
.cx-wissen-bandkopf p { margin: 0; color: var(--cx-text-muted); font-size: 14px; flex: 1 1 340px; }
/* DREI SPALTEN seit 1.139.0 (vorher 420px -> zwei). Bei 1.152 px nutzbarer
   Breite ergeben 320 px Mindestbreite drei Spalten zu je 373 px; darunter
   fällt das Gitter von selbst auf zwei und dann auf eine. */
.cx-wissen-grid { grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr)); margin-top: 14px; gap: 14px; }

/* Die Kachel ist seit 1.57 KEIN <a> mehr, weil die Bereichs-Chips darin
   eigene Verweise sind – ein Link im Link ist ungültiges HTML und wird vom
   Browser auseinandergerissen. Stattdessen spannt der Titellink über die
   ganze Fläche (::after), und die Chips liegen mit z-index darüber. Für den
   Anwender ändert sich nichts: Die Kachel bleibt vollflächig anklickbar. */
.cx-wissen-card { display: flex; flex-direction: column; position: relative; }
.cx-wissen-card:hover { border-color: var(--cx-blue); }
.cx-wissen-card h3 { margin: 0; font-size: 17px; line-height: 1.3; }
/* Bewusst OHNE eigene Farbe: Der Titel war bisher blau, weil die ganze Kachel
   ein Link war. Jetzt trägt der Titel selbst den Link – und erbt damit
   dieselben geprüften Blautöne, hell wie dunkel. Eine Farbe hier würde die
   Kontrastregel für den hellen Modus (weiter oben) überstimmen. */
.cx-wissen-card h3 a { text-decoration: none; }
.cx-wissen-card h3 a::after { content: ''; position: absolute; inset: 0; border-radius: var(--cx-radius); }
.cx-wissen-card h3 a:focus-visible::after { outline: 2px solid var(--cx-blue); outline-offset: 2px; }
/* Das eine Maß, das alle zehn Beiträge vergleichbar macht. Vorher standen hier
   sieben verschiedene Zähleinheiten nebeneinander – „16 Kapitel“ wirkte größer
   als „234 Abkürzungen“. Die charakteristische Zahl steht weiterhin darunter,
   sie ist die Substanz; die Lesezeit ordnet sie nur ein. */
.cx-wissen-mass {
  font-size: 12.5px; font-weight: 700; color: var(--cx-steel);
  white-space: nowrap; font-variant-numeric: tabular-nums;
}
.cx-wissen-card .cx-pos { margin: 6px 0 0; font-size: 13px; font-weight: 600; color: var(--cx-accent); }
.cx-wissen-text { margin: 8px 0 12px; font-size: 13.5px; line-height: 1.55; flex: 1; color: var(--cx-text-muted); }


/* Fristen: der eigentliche Anlass, warum jemand NIS2, DORA, Zertifikate oder
   FIDO aufschlägt. „gilt“ nimmt die Warnfarbe (läuft bereits), „kommt“ das
   Blau (Termin steht bevor), „Pflicht“ bleibt neutral – dort gibt es kein
   Datum, und eines zu erfinden wäre schlimmer als keines zu zeigen. */
.cx-frist {
  display: inline-flex; align-items: center; font-size: 12px; font-weight: 700;
  padding: 4px 11px; border-radius: 99px; letter-spacing: .02em; white-space: nowrap;
}
.cx-frist-gilt { background: rgba(229,168,59,.14); color: var(--cx-warn); border: 1px solid rgba(229,168,59,.4); }
.cx-frist-kommt { background: rgba(30,123,232,.12); color: var(--cx-blue-light); border: 1px solid rgba(30,123,232,.4); }
.cx-frist-pflicht { color: var(--cx-steel); border: 1px solid var(--cx-border); font-weight: 600; }
.cx-frist-akut { background: rgba(229,72,77,.12); color: #FF8D90; border: 1px solid rgba(229,72,77,.45); font-weight: 600; }
.cx-frist-entwurf { background: rgba(53,224,218,.10); color: var(--cx-accent); border: 1px solid rgba(53,224,218,.38); }
html[data-theme="light"] .cx-frist-akut { background: rgba(180,35,40,.10); color: #B42328; border-color: rgba(180,35,40,.38); }
html[data-theme="light"] .cx-frist-entwurf { color: #0E7C78; border-color: rgba(14,124,120,.38); }
html[data-theme="light"] .cx-frist-gilt { background: rgba(138,90,0,.10); border-color: rgba(138,90,0,.35); }
html[data-theme="light"] .cx-frist-kommt { color: var(--cx-blue-deep); }

/* Die Brücke ans Ende: Jeder Beitrag endet in einem Produktbereich – und von
   dort führt der Weg in den Katalog, für den comparXIS eigentlich gebaut ist.
   Genau dieser Schritt fehlte bis 1.56 vollständig. */
.cx-wissen-bruecke {
  margin-top: 44px; padding: 26px 28px;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: linear-gradient(180deg, rgba(30,123,232,.08), transparent);
}
.cx-wissen-bruecke h2 { font-size: 21px; margin: 0 0 6px; }
.cx-wissen-bruecke > p { margin: 0 0 18px; color: var(--cx-text-muted); font-size: 14.5px; max-width: 80ch; }
.cx-wissen-wege { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); gap: 14px; }
.cx-wissen-weg {
  display: block; padding: 15px 17px; text-decoration: none;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  background: var(--cx-graphite);
}
.cx-wissen-weg:hover { border-color: var(--cx-blue); }
.cx-wissen-weg b { display: block; font-family: var(--cx-font-display); font-size: 15px; color: var(--cx-text); margin-bottom: 3px; }
.cx-wissen-weg small { display: block; color: var(--cx-steel); font-size: 12.5px; line-height: 1.5; }
.cx-wissen-weg i { display: block; margin-top: 7px; font-style: normal; font-size: 13px; font-weight: 600; color: var(--cx-blue-light); }
html[data-theme="light"] .cx-wissen-weg i { color: var(--cx-blue-deep); }

@media (max-width: 620px) {
  .cx-wissen-bruecke { padding: 20px 18px; }
}

/* --- Die Ablage: wer steht in der Aufstellung? ---------------------------
   Bis 1.71 stand hier eine Zeile „Weitere ins Zentrum stellen“ – sie
   beantwortete die Frage „16 Anbieter oben, sieben Knoten im Bild, wie komme
   ich an die anderen?“ mit: man stellt sie ins Zentrum. Das reichte nicht.
   In den Kreis kam ein Hersteller nur, wenn ein Steckbrief ihn NENNT, und
   zwei Drittel aller Paare sind einseitig, viele gar nicht gepflegt. Broadcom
   und Hornetsecurity nennen einander nicht – sie konnten deshalb nie zusammen
   im Bild sein, egal wer in der Mitte stand.
   Jetzt schaltet ein Klick den Hersteller in die Aufstellung, der Zielknopf
   daneben macht ihn zum Zentrum. Eine Liste statt zweier. */
.cx-rad-ablage { margin: 0 0 14px; }
.cx-rad-ablage-kopf {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-bottom: 10px;
}
.cx-rad-ablage-titel {
  font: 700 11px var(--cx-font-body); letter-spacing: .13em;
  text-transform: uppercase; color: var(--cx-steel);
}
.cx-rad-ablage-zahl { font-size: 12.5px; color: var(--cx-steel); }
.cx-rad-ablage-kopf .cx-wz-alles { margin-left: auto; }
.cx-rad-ablage-liste { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.cx-rad-ablage-rest { font-size: 12.5px; color: var(--cx-steel); }
/* Ein Chip, zwei Aktionen: Der breite Teil schaltet den Hersteller in die
   Aufstellung, der Zielknopf rechts macht ihn zum Zentrum. Vorher standen
   dafür zwei fast gleiche Listen untereinander. */
.cx-rad-chip {
  display: inline-flex; align-items: stretch; border-radius: 99px;
  border: 1px solid var(--cx-border); background: var(--cx-graphite);
  overflow: hidden;
}
.cx-rad-chip:hover { border-color: var(--cx-blue); }
.cx-rad-chip.an { border-color: var(--cx-blue); background: rgba(30,123,232,.14); }
html[data-theme="light"] .cx-rad-chip.an { background: rgba(13,80,216,.10); }
.cx-rad-chip-haupt {
  display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  padding: 5px 10px 5px 6px; border: 0; background: transparent;
  color: var(--cx-text-muted); font: 600 13px var(--cx-font-body);
}
.cx-rad-chip.an .cx-rad-chip-haupt { color: var(--cx-text); }
.cx-rad-chip-platte {
  width: 40px; height: 26px; border-radius: 6px; flex: none; padding: 3px;
  background: var(--cx-silver-light);
  display: flex; align-items: center; justify-content: center;
}
.cx-rad-chip-platte img { max-width: 100%; max-height: 20px; }
.cx-rad-chip-n {
  font-style: normal; font-size: 11px; font-weight: 700;
  color: var(--cx-steel); background: var(--cx-carbon);
  border-radius: 99px; padding: 1px 6px;
}
.cx-rad-chip-mitte {
  border: 0; border-left: 1px solid var(--cx-border); background: transparent;
  color: var(--cx-steel); cursor: pointer; padding: 0 10px; font-size: 14px;
}
.cx-rad-chip-mitte:hover { color: var(--cx-blue-light); background: rgba(30,123,232,.12); }
html[data-theme="light"] .cx-rad-chip-mitte:hover { color: var(--cx-blue-deep); }

/* Die Trefferliste des Suchfelds trägt jetzt zwei Knöpfe statt einer
   Klickfläche – dazunehmen und ins Zentrum stellen sind zwei Absichten. */
.cx-btn-mini {
  border: 1px solid var(--cx-border); background: var(--cx-carbon);
  color: var(--cx-text-muted); border-radius: 99px; cursor: pointer;
  padding: 4px 11px; font: 600 12px var(--cx-font-body); white-space: nowrap;
}
.cx-btn-mini:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-rad-tref-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* --- Matrix: dieselbe Aufstellung als Tabelle ----------------------------
   Der Stern beantwortet „wer steht gegen das Zentrum?“, die Matrix „wer steht
   gegen wen?“ – und zeigt als einzige Ansicht auch die Leerstellen. */
.cx-mx-huelle { overflow-x: auto; margin-bottom: 16px; }
table.cx-mx { border-collapse: collapse; font-size: 13px; }
table.cx-mx th, table.cx-mx td { border: 1px solid var(--cx-border); padding: 0; text-align: center; }
table.cx-mx .cx-mx-eck { background: transparent; border: 0; }
/* MIT table.cx-mx davor, nicht ohne: Die Grundregel oben setzt für alle th
   und td padding:0 und text-align:center und hat mit 0,1,2 die höhere
   Spezifität als eine blosse Klasse (0,1,0). Ohne den Zusatz gewinnt sie –
   die Zeilenköpfe standen deshalb zentriert statt links, und das Polster
   fehlte ganz. Reihenfolge im Stilblatt hilft dagegen nicht. */
table.cx-mx th.cx-mx-oben {
  height: 112px; width: 48px; vertical-align: bottom; padding: 0 0 8px;
  background: var(--cx-graphite); font-weight: 600;
}
/* Senkrecht gesetzt, weil sonst zwölf Spalten mit „Schwachstellen- &
   Exposure-Management“ breiter wären als jeder Bildschirm. */
.cx-mx-oben span {
  writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;
  font-size: 12.5px; color: var(--cx-text-muted);
}
table.cx-mx th.cx-mx-links {
  text-align: left; padding: 6px 14px 6px 8px; background: var(--cx-graphite);
  font: 600 13px var(--cx-font-body); color: var(--cx-text); white-space: nowrap;
}
.cx-mx-links .cx-logoplate {
  display: inline-flex; width: 40px; height: 24px; padding: 3px;
  margin-right: 8px; vertical-align: middle; border-radius: 6px;
}
.cx-mx-links .cx-logoplate img { max-height: 18px; }
.cx-mx-zelle { width: 48px; height: 42px; }
.cx-mx-zelle button {
  width: 100%; height: 100%; border: 0; background: transparent; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.cx-mx-zelle:hover { background: rgba(30,123,232,.14); }
html[data-theme="light"] .cx-mx-zelle:hover { background: rgba(13,80,216,.10); }
.cx-mx-zelle.an { background: rgba(30,123,232,.22); outline: 1px solid var(--cx-blue); }
html[data-theme="light"] .cx-mx-zelle.an { background: rgba(13,80,216,.14); }
/* Die Diagonale ist keine leere Zelle, sondern eine, die es nicht geben kann –
   schraffiert statt weiß, damit sie nicht als „nichts hinterlegt“ gelesen wird. */
.cx-mx-selbst {
  background: repeating-linear-gradient(45deg, transparent, transparent 4px,
              var(--cx-border) 4px, var(--cx-border) 5px);
}
.cx-mx-z { font-size: 15px; font-weight: 700; line-height: 1; }
.cx-mx-z.st-beide { color: var(--cx-bz-beide); }
.cx-mx-z.st-eins  { color: var(--cx-bz-eins); }
.cx-mx-z.st-keine { color: var(--cx-bz-keine); font-size: 13px; }
.cx-mx-kasten { max-width: 760px; }
.cx-mx-kasten .cx-rad-abgrenzung { margin-top: 0; }

/* --- Merkzettel: gefundene Lücken sammeln --------------------------------
   Die Matrix zeigt, wo nichts hinterlegt ist – bei 8 bis 12 % Abdeckung ist
   das viel. Wer die Lücken im Gespräch findet, soll sie mitnehmen können,
   ohne sie auf Papier zu notieren. Gepflegt wird weiterhin in hersteller.json;
   der Zettel liefert den fertigen Text dorthin. */
.cx-merk {
  margin-top: 22px; max-width: 760px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); padding: 16px 18px 18px;
}
.cx-merk-kopf {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-bottom: 10px;
}
.cx-merk-titel {
  font: 700 11px var(--cx-font-body); letter-spacing: .13em;
  text-transform: uppercase; color: var(--cx-steel);
}
.cx-merk-zahl { font-size: 12.5px; color: var(--cx-bz-eins); font-weight: 700; }
.cx-merk-kopf .cx-wz-alles { margin-left: auto; }
.cx-merk-liste { list-style: none; margin: 0 0 12px; padding: 0; }
.cx-merk-liste li {
  display: flex; align-items: center; gap: 10px;
  padding: 5px 0; border-bottom: 1px solid var(--cx-border); font-size: 14px;
}
.cx-merk-liste li:last-child { border-bottom: 0; }
.cx-merk-liste i { color: var(--cx-steel); font-style: normal; font-weight: 400; }
.cx-merk-weg {
  margin-left: auto; flex: none; width: 24px; height: 24px; border-radius: 50%;
  background: none; border: 1px solid var(--cx-border); color: var(--cx-steel);
  cursor: pointer; font-size: 11px; line-height: 1;
}
.cx-merk-weg:hover { color: #E5484D; border-color: #E5484D; }
.cx-merk-hinweis { font-size: 13px; color: var(--cx-text-muted); margin: 0 0 10px; }
.cx-merk-feld { display: block; margin-bottom: 12px; }
.cx-merk-feld textarea {
  width: 100%; resize: vertical; padding: 12px 14px;
  border-radius: var(--cx-radius-sm); border: 1px solid var(--cx-border);
  background: var(--cx-carbon); color: var(--cx-text);
  font: 13px ui-monospace, "SF Mono", Menlo, Consolas, monospace; line-height: 1.5;
}
.cx-merk-quittung { font-size: 13px; color: var(--cx-bz-beide); font-weight: 600; }
.cx-rad-sackgasse {
  margin: 14px 0 0; padding: 11px 14px; font-size: 13.5px; line-height: 1.5;
  color: var(--cx-text-muted); border-left: 3px solid var(--cx-warn);
  background: rgba(229,168,59,.07); border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
html[data-theme="light"] .cx-rad-sackgasse { background: rgba(138,90,0,.07); }

/* --- Know-How: das Fragenband über den Bändern -----------------------------
   Wer die Seite aufschlägt, hat meistens keine Themenfrage, sondern eine
   Satzfrage. Sie steht deshalb VOR den Kacheln – und führt nicht auf den
   Beitragsanfang, sondern in das Kapitel, das sie beantwortet. Dass das
   funktioniert, ist die stille Folge der Suchreparatur aus 1.55.1. */
.cx-wissen-fragen {
  margin-top: 30px; padding: 22px 24px 20px;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite);
}
.cx-wissen-fragen h2 { font-size: 19px; margin: 0 0 3px; }
/* Die Zeilen ragen bewusst in den Innenabstand hinein: So bleibt der Text
   linksbündig zur Gruppenüberschrift, die Hover-Fläche ist trotzdem breiter
   als der Text – ein Ziel, das man auch mit ungenauem Zeigen trifft. */
/* Seit 1.139.0 zweispaltig: Frage links, Ziel rechts. Der Pfeil sitzt am
   Ziel und nicht mehr vor der Frage – im Klappinhalt stehen die Zeilen
   untereinander, und ein Pfeil je Zeile am linken Rand ergab eine Spalte
   Pfeile ohne Aussage. */
.cx-wissen-frage {
  display: flex; align-items: baseline; justify-content: space-between; gap: 16px;
  padding: 8px 12px; margin: 0 -12px; border-radius: var(--cx-radius-sm);
  font-size: 14.5px; line-height: 1.45; color: var(--cx-text); text-decoration: none;
}
.cx-wissen-frage:hover { background: var(--cx-carbon); }
html[data-theme="light"] .cx-wissen-frage { color: var(--cx-text); }
html[data-theme="light"] .cx-wissen-frage:hover { background: var(--cx-carbon); }
.cx-wissen-frage small {
  flex: none; font-size: 12px; font-weight: 600; color: var(--cx-steel); white-space: nowrap;
}

/* --- Know-How-Übersicht: Werkzeuge, Klappfragen, Filter (seit 1.139.0) ----
   Der Umbau hat drei Gründe, alle gemessen: Die Seite war 8.361 px hoch
   (13,6 Bildschirmseiten), das Fragenband stand mit 2.443 px VOR der ersten
   Kachel, und die Bänder trugen 2, 6, 7 und 9 Beiträge – das erste sah neben
   dem letzten wie ein Versehen aus.

   KEINE max-width auf Fließtext in diesem Block. Die Deckelungen auf den
   Know-How-Seiten sind mit 1.133.1/1.133.2 gefallen, und hier kommt keine
   neue dazu: Der Text nutzt die Breite seines Kastens. */

/* Das Band für den mitgebrachten Filter (seit 1.139.1). Es steht über den
   Werkzeugen, weil pageKnowhow() nach oben scrollt: Die Filterleiste mit ihren
   blauen Chips liegt dann unter Hero, Werkzeugen und Fragen und beantwortet
   die Frage nicht, die sich beim Betreten stellt – warum hier statt 22 nur
   sechs Beiträge stehen.
   Die Warnfarbe wäre falsch: Ein gemerkter Filter ist kein Fehler, sondern
   der Zustand, den der Betrachter selbst hinterlassen hat. Deshalb das Blau
   der Bedienelemente und ein Rahmen statt einer Fläche. */
.cx-kh-mitgebracht {
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  margin-top: 22px; padding: 12px 18px;
  border: 1px solid var(--cx-blue); border-left-width: 3px;
  border-radius: var(--cx-radius); background: var(--cx-graphite);
}
.cx-kh-mgtext { flex: 1 1 420px; font-size: 14px; color: var(--cx-text-muted); line-height: 1.5; }
.cx-kh-mgtext b { color: var(--cx-text); }
.cx-kh-mgknopf {
  flex: none; background: var(--cx-blue-knopf); border: 1px solid var(--cx-blue-knopf); color: #fff;
  border-radius: 999px; padding: 6px 16px; font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
}
.cx-kh-mgknopf:hover { background: var(--cx-blue-deep); border-color: var(--cx-blue-deep); }

/* Die zwei Werkzeuge: Glossar und MITRE. Bewusst ANDERS als eine Kachel –
   sie werden nicht gelesen, sondern bedient. Der Farbstreifen links ist das
   einzige Zeichen dafür und kostet keine Höhe. */
.cx-kh-werkzeuge {
  display: grid; grid-template-columns: 1.15fr 1fr; gap: 16px; margin-top: 26px;
}
.cx-kh-werkzeug { display: flex; flex-direction: column; gap: 12px; position: relative; overflow: hidden; }
.cx-kh-werkzeug::before {
  content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 3px;
  background: linear-gradient(180deg, var(--cx-blue-light), var(--cx-accent));
}
.cx-kh-wkopf { display: flex; align-items: baseline; gap: 11px; flex-wrap: wrap; }
.cx-kh-wkopf h2 { margin: 0; font-size: 19px; }
.cx-kh-wzahl { font-size: 12.5px; font-weight: 600; color: var(--cx-accent); font-variant-numeric: tabular-nums; }
.cx-kh-wrolle {
  margin-left: auto; font-size: 11px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--cx-steel); border: 1px solid var(--cx-border); border-radius: 999px; padding: 2px 10px;
}
.cx-kh-wtext { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); }
.cx-kh-wfuss { margin-top: auto; font-size: 13.5px; font-weight: 600; }

/* Das Glossarfeld sucht an Ort und Stelle – im Termin will niemand erst eine
   Seite öffnen und dort noch einmal suchen. */
.cx-kh-gfeld {
  display: flex; gap: 10px; align-items: center; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm); padding: 10px 14px;
}
.cx-kh-gfeld:focus-within { border-color: var(--cx-blue); }
.cx-kh-gfeld input {
  flex: 1; background: none; border: 0; color: var(--cx-text); font: inherit; font-size: 15px; outline: none;
}
.cx-kh-gfeld input::placeholder { color: var(--cx-steel); }
.cx-kh-lupe { color: var(--cx-steel); font-size: 15px; }
/* 252 px sind gemessen, nicht geschätzt: Die vier Startvorschläge brauchen
   250 px. Wer tippt, bekommt bis zu sechs Treffer – dann scrollt der Kasten,
   statt die Seite auseinanderzuschieben. */
.cx-kh-gtreffer { display: flex; flex-direction: column; gap: 1px; max-height: 252px; overflow-y: auto; }
.cx-kh-gtreffer a {
  display: block; padding: 8px 12px; border-radius: var(--cx-radius-sm);
  text-decoration: none; position: relative; z-index: 1;
}
.cx-kh-gtreffer a:hover, .cx-kh-gtreffer a:focus-visible { background: var(--cx-carbon); outline: none; }
.cx-kh-gtreffer b { display: block; font-size: 14.5px; color: var(--cx-text); }
.cx-kh-gtreffer b span { font-weight: 400; font-size: 12.5px; color: var(--cx-steel); }
.cx-kh-gtreffer > a > span { display: block; font-size: 12.5px; color: var(--cx-steel); line-height: 1.45; }
.cx-kh-gleer { margin: 6px 12px; font-size: 12.5px; color: var(--cx-steel); line-height: 1.5; }
.cx-kh-gchips { display: flex; gap: 6px; flex-wrap: wrap; }
.cx-kh-gchips a {
  font-size: 12px; font-weight: 500; border: 1px solid var(--cx-border); border-radius: 999px;
  padding: 4px 11px; color: var(--cx-text-muted); text-decoration: none;
}
.cx-kh-gchips a:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-kh-mehrchip { color: var(--cx-steel) !important; }

/* Die MITRE-Kette: neun Schritte, jeder springt in seinen Abschnitt. */
.cx-kh-kette { display: flex; flex-direction: column; gap: 2px; }
.cx-kh-kette a {
  display: grid; grid-template-columns: 24px 1fr 16px; gap: 10px; align-items: center;
  padding: 5px 10px; border-radius: var(--cx-radius-sm); text-decoration: none;
  font-size: 13.5px; font-weight: 400; color: var(--cx-text-muted);
}
.cx-kh-kette a:hover, .cx-kh-kette a:focus-visible { background: var(--cx-carbon); color: var(--cx-text); outline: none; }
.cx-kh-knr {
  width: 22px; height: 22px; border-radius: 50%; border: 1px solid var(--cx-border);
  display: grid; place-items: center; font-size: 11.5px; font-weight: 700;
  color: var(--cx-accent); font-variant-numeric: tabular-nums;
}
.cx-kh-kpfeil { color: var(--cx-steel); text-align: right; font-size: 12px; }

/* Die Fragen: vier zugeklappte Zeilen statt 2.443 px offener Liste. */
.cx-kh-fragenkopf { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; margin-bottom: 12px; }
.cx-kh-fragenkopf h2 { margin: 0; }
.cx-kh-fragenkopf p { margin: 0; font-size: 13px; color: var(--cx-steel); flex: 1 1 320px; }
.cx-kh-klapp {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  margin-bottom: 8px; overflow: hidden; background: var(--cx-carbon);
}
.cx-kh-klapp > summary {
  padding: 11px 16px; cursor: pointer; font-weight: 600; font-size: 14.5px;
  display: flex; align-items: center; gap: 10px; list-style: none;
}
.cx-kh-klapp > summary::-webkit-details-marker { display: none; }
.cx-kh-klapp > summary::after { content: '▾'; color: var(--cx-steel); font-size: 12px; }
.cx-kh-klapp[open] > summary::after { content: '▴'; }
.cx-kh-klapp[open] > summary { border-bottom: 1px solid var(--cx-border); }
.cx-kh-klappzahl {
  margin-left: auto; color: var(--cx-steel); font-weight: 400; font-size: 13px;
  font-variant-numeric: tabular-nums;
}
.cx-kh-klappinhalt { padding: 6px 16px 12px; }

/* Die Filterleiste klebt beim Scrollen unter der Kopfzeile: Wer unten in der
   Kabelkunde steht und auf „Pflichten“ umschalten will, soll nicht erst
   zurückscrollen müssen. */
.cx-kh-filter {
  display: flex; gap: 7px; flex-wrap: wrap; align-items: center;
  padding: 13px 0; margin: 26px 0 4px;
  border-top: 1px solid var(--cx-border); border-bottom: 1px solid var(--cx-border);
  position: sticky; top: var(--cx-kopf); z-index: 30; background: var(--cx-carbon);
}
.cx-kh-fgr {
  font-size: 11px; color: var(--cx-steel); text-transform: uppercase;
  letter-spacing: .08em; margin: 0 2px 0 10px;
}
.cx-kh-fgr:first-child { margin-left: 0; }
.cx-kh-filter button {
  background: none; border: 1px solid var(--cx-border); border-radius: 999px;
  padding: 5px 13px; color: var(--cx-text-muted); font: inherit; font-size: 13px;
  font-weight: 500; cursor: pointer;
}
.cx-kh-filter button:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-kh-filter button.an { background: var(--cx-blue-knopf); border-color: var(--cx-blue-knopf); color: #fff; font-weight: 600; }
.cx-kh-zuruck { border-color: transparent !important; text-decoration: underline; color: var(--cx-steel) !important; }
.cx-kh-fzahl { margin-left: auto; font-size: 13px; color: var(--cx-steel); font-variant-numeric: tabular-nums; }

/* Die Fußzeile der Kachel: Lesezeit, Bereichszahl, Frist – in einer Zeile
   statt im eigenen Kasten mit Überschrift. Der Bereichsverweis braucht
   z-index, weil der Titellink über die ganze Kachel spannt. */
.cx-wissen-fuss {
  display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
  margin-top: auto; padding-top: 10px; font-size: 12px; color: var(--cx-steel);
  font-variant-numeric: tabular-nums;
}
.cx-wissen-ber {
  position: relative; z-index: 1; border: 1px solid var(--cx-border); border-radius: 999px;
  padding: 2px 9px; font-size: 11.5px; font-weight: 500; color: var(--cx-steel); text-decoration: none;
}
.cx-wissen-ber:hover { border-color: var(--cx-blue); color: var(--cx-text); }

@media (max-width: 900px) {
  .cx-kh-werkzeuge { grid-template-columns: 1fr; }
  .cx-kh-filter { position: static; }
}

/* --- MITRE ATT&CK: eine Geschichte, keine Matrix -------------------------
   Die Seite erzählt einen Angriff. Deshalb sitzt die Bedienung in der
   Angriffskette, nicht in einer Tabelle: neun Glieder, seitlich gewischt statt
   umgebrochen – die Reihenfolge IST die Aussage, ein Umbruch zerlegt sie. */
/* ==== 1.133.1 · Die Erklärseiten nutzen ihre Kastenbreite ================
   Zehn Deckelungen zwischen 760 und 820 px sind hier weggefallen – sie
   standen über fünfzehn Know-How-Seiten verteilt und ließen in einem
   1.152 px breiten Kasten bis zu 440 px leer.

   DAS WAR EINE BEWUSSTE ENTSCHEIDUNG, UND SIE WURDE ZURÜCKGENOMMEN. Beim
   Messlauf zu 1.130.3 hatte ich diese Regeln ausdrücklich als „Lesestrecke,
   so lassen" eingeordnet und Stefan so vorgelegt; über 1.150 px trägt eine
   Zeile bei 16 px rund 155 Zeichen statt der 90, die als bequem gelten.
   Sein Befund am 13.09.2026 war das Gegenteil, zum zweiten Mal an derselben
   Sorte Stelle – und damit ist es entschieden. Wer die Zeilenlänge wieder
   begrenzen will, setzt die Werte hier zurück; sie standen bei 760 px
   (mitre-intro, mitre-gross, mitre-fazit, raid-einstieg, raid-warnung),
   780 px (ip-vorspann, ip-anatomie-text), 800 px (nis-bild, nis-fall) und
   820 px (raid-backup, dora-nis2).

   DIE EINE AUSNAHME VON DAMALS IST MIT 1.133.2 AUCH GEFALLEN: .cx-zert-bild svg
   stand auf 460 px, mit dem Argument, eine Zeichnung werde über die volle
   Breite nicht lesbarer. Stefan wollte sie trotzdem größer – die Begründung
   steht jetzt an der Regel selbst. Damit ist auf den Know-How-Seiten keine
   Deckelung mehr übrig. */
.cx-mitre-intro p { font-size: 16px; line-height: 1.65; }
.cx-mitre-gross { font-size: 19px; line-height: 1.55; }
.cx-mitre-fragen { margin: 14px 0 0; padding-left: 20px; }
.cx-mitre-fragen li { font-size: 16px; margin-bottom: 6px; color: var(--cx-text); }
.cx-mitre-satz h3 { margin: 22px 0 8px; font-size: 18px; }
.cx-mitre-einbruch { margin: 10px 0 16px; padding-left: 22px; }
.cx-mitre-einbruch li { margin-bottom: 4px; font-size: 15px; }

.cx-mitre-begriffe { grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr)); }
.cx-mitre-begriffe h3 { margin: 0 0 2px; font-size: 21px; color: var(--cx-blue-light); }
.cx-mitre-frage { margin: 0 0 10px; font-size: 14px; color: var(--cx-steel); }
.cx-mitre-begriffe ul { margin: 10px 0 0; padding-left: 20px; font-size: 14.5px; }
.cx-mitre-begriffe li { margin-bottom: 3px; }
.cx-mitre-merksatz {
  margin: 14px 0 0; padding-top: 12px; border-top: 1px solid var(--cx-border);
  color: var(--cx-accent); font-weight: 600; font-size: 15px;
}

/* Das Mailzitat trägt den Fall – es muss wie eine echte Mail aussehen, sonst
   bleibt „gefälschte Rechnung“ eine Behauptung. */
.cx-mitre-mail {
  margin: 16px 0; padding: 16px 20px; border-left: 3px solid var(--cx-blue);
  background: var(--cx-carbon); border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
  font-size: 15.5px; line-height: 1.6; color: var(--cx-text-muted);
}
.cx-mitre-auffordern { margin: 14px 0 0; font-size: 14.5px; color: var(--cx-steel); }
.cx-mitre-vorspann { max-width: var(--cx-lesebreite); font-size: 15.5px; margin-bottom: 4px; }

/* --- Die Angriffskette ---------------------------------------------------- */
.cx-mitre-kette-titel { margin-bottom: 14px; }
.cx-mitre-kette {
  display: flex; align-items: stretch; gap: 6px; margin-bottom: var(--cx-gap);
  overflow-x: auto; scrollbar-width: none; padding-bottom: 4px;
}
.cx-mitre-kette::-webkit-scrollbar { display: none; }
.cx-kette-glied {
  flex: none; display: flex; align-items: center; gap: 9px; cursor: pointer;
  padding: 9px 14px; border-radius: 99px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  font-family: var(--cx-font-body); font-size: 14px; color: var(--cx-text-muted);
  transition: border-color .15s, color .15s, background .15s;
}
.cx-kette-glied:hover { border-color: var(--cx-blue); color: var(--cx-text); }
/* EIGENER VERLAUF STATT --cx-gradient (1.178.2). Der gemeinsame Verlauf
   beginnt bei #3FA9FF, und weiße Schrift trägt darauf nur 2,52:1 – in BEIDEN
   Modi, denn der Verlauf ist in beiden derselbe. --cx-blue-knopf gibt es seit
   1.139.1 genau für Flächen mit weißer Schrift; auf ihm stehen 4,78:1, am
   dunklen Ende 6,65:1. Der Verlauf bleibt ein Verlauf, er beginnt nur eine
   Stufe tiefer. */
.cx-kette-glied[aria-selected="true"] {
  border-color: var(--cx-blue); color: var(--cx-white);
  background: linear-gradient(135deg, var(--cx-blue-knopf), var(--cx-blue-deep));
  font-weight: 600;
}
html[data-theme="light"] .cx-kette-glied[aria-selected="true"] { color: #fff; }
.cx-kette-nr {
  flex: none; width: 22px; height: 22px; border-radius: 50%;
  display: grid; place-items: center; font-size: 12px; font-weight: 600;
  font-variant-numeric: tabular-nums;
  background: var(--cx-carbon); color: var(--cx-blue); border: 1px solid var(--cx-border);
}
/* Der eigene Grund hellte den Verlauf darunter auf und drückte die weiße
   Ziffer auf 3,30:1 (1.178.2). Abdunkeln statt aufhellen: Der Kreis hebt sich
   weiterhin ab, die Ziffer steht aber auf dem dunkleren Ton. */
.cx-kette-glied[aria-selected="true"] .cx-kette-nr {
  background: rgba(0,0,0,.20); color: #fff; border-color: transparent;
}
.cx-kette-text { white-space: nowrap; }
.cx-kette-pfeil { align-self: center; color: var(--cx-steel); font-size: 13px; flex: none; }

/* --- Die Karte zum gewählten Schritt -------------------------------------- */
.cx-mitre-kopf { display: flex; align-items: center; gap: 16px; }
.cx-mitre-kopf h3 { margin: 0; font-size: 22px; }
.cx-mitre-schritt {
  flex: none; width: 42px; height: 42px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 17px; font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--cx-blue); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-mitre-orig { margin: 2px 0 0; font-size: 13px; color: var(--cx-steel); }
.cx-mitre-text { margin: 0 0 10px; font-size: 15.5px; line-height: 1.62; }
.cx-mitre-detail ul { margin: 0 0 10px; padding-left: 20px; font-size: 15px; line-height: 1.6; }
.cx-mitre-detail li { margin-bottom: 4px; }
.cx-mitre-label {
  margin: 20px 0 8px; font-size: 11px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--cx-steel);
}
/* Der Alltagsvergleich ist der Kern der Seite und muss ins Auge springen –
   er ist das, was jemand nach dem Lesen weitererzählt. */
.cx-mitre-einfach {
  margin: 16px 0 0; padding: 12px 16px; border-radius: var(--cx-radius-sm);
  background: rgba(30,123,232,.10); border: 1px solid rgba(30,123,232,.30);
  font-size: 16px; line-height: 1.55; font-style: italic;
}
.cx-mitre-ziel { margin: 12px 0 0; font-size: 15px; }

/* MITRE-Kennungen bewusst NACH der Erklärung und optisch ruhiger als diese. */
.cx-mitre-zuordnung { display: flex; flex-wrap: wrap; gap: 8px; }
.cx-mitre-taktik-chip, .cx-mitre-technik-chip {
  display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 7px 12px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 14px; line-height: 1.35;
}
.cx-mitre-taktik-chip { border-color: var(--cx-blue); }
.cx-mitre-tid {
  display: inline-block; padding: 1px 7px; border-radius: 6px;
  font-size: 12px; font-variant-numeric: tabular-nums; color: var(--cx-steel);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-mitre-spalten { margin-top: 0; }
.cx-mitre-spalten .cx-mitre-label { margin-top: 20px; }

/* --- Überblick, Nutzen, Fazit --------------------------------------------- */
.cx-mitre-ueberblick { grid-template-columns: repeat(auto-fill, minmax(min(280px, 100%), 1fr)); }
.cx-mitre-ueber-karte { display: flex; gap: 14px; align-items: flex-start; }
.cx-mitre-ueber-karte h3 { margin: 0 0 4px; font-size: 17px; }
.cx-mitre-ueber-karte p { margin: 0; font-size: 14.5px; line-height: 1.55; }
.cx-mitre-nutzen { grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr)); }
.cx-mitre-nutzen h3 { margin: 0 0 8px; font-size: 17px; color: var(--cx-blue-light); }
.cx-mitre-nutzen p { margin: 0; font-size: 14.5px; line-height: 1.55; }
.cx-mitre-fazit p { font-size: 16px; line-height: 1.65; }
.cx-mitre-frage-alt {
  font-family: var(--cx-font-display); font-size: 22px; color: var(--cx-steel);
  margin: 18px 0;
}

/* --- Anhang: die Matrix, zusammengeklappt --------------------------------- */
.cx-mitre-matrix summary {
  cursor: pointer; list-style: none; display: flex; align-items: center; gap: 10px;
}
.cx-mitre-matrix summary::-webkit-details-marker { display: none; }
.cx-mitre-matrix summary h2 { display: inline; margin: 0; font-size: 21px; }
.cx-mitre-matrix summary::after {
  content: "▾"; color: var(--cx-blue); font-size: 15px; transition: transform .2s;
}
.cx-mitre-matrix[open] summary::after { transform: rotate(180deg); }
.cx-mitre-taktiken {
  grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr));
  margin-top: 18px;
}
.cx-mitre-taktik h3 { margin: 0; font-size: 17px; }
.cx-mitre-taktik-kopf { display: flex; align-items: baseline; gap: 10px; justify-content: space-between; }
.cx-mitre-taktik .cx-mitre-text { font-size: 14px; margin: 10px 0 12px; }
/* Die neun Taktiken aus der Geschichte tragen den Akzentrahmen – das ist der
   Rückweg vom Anhang in die Erzählung. */
.cx-mitre-taktik.im-szenario { border-color: var(--cx-blue); }
.cx-mitre-marke {
  flex: none; font-size: 11px; padding: 2px 8px; border-radius: 99px;
  background: rgba(30,123,232,.14); border: 1px solid rgba(30,123,232,.35);
  color: var(--cx-blue-light); white-space: nowrap;
}
/* Bereichs-Chip als Link: dieselbe Optik wie ein Tag, aber klickbar – das ist
   die Brücke vom Angriffsschritt zu den Herstellern, die ihn adressieren. */
.cx-tag-link { text-decoration: none; transition: border-color .15s, color .15s; }
.cx-tag-link:hover { border-color: var(--cx-accent); color: var(--cx-accent); }

@media (max-width: 620px) {
  .cx-mitre-kopf { align-items: flex-start; }
  .cx-mitre-frage-alt { font-size: 19px; }
  .cx-mitre-mail { padding: 12px 14px; font-size: 14.5px; }
}

/* --- RAID einfach erklärt -------------------------------------------------
   Die Schemata sind Inline-SVG aus app.js. Die Farben stehen deshalb HIER und
   nicht im Bild: So stimmen sie in hell wie dunkel, und ein neues RAID-Level
   erbt sie automatisch. Ampelfarben werden bewusst sparsam eingesetzt – Grün
   und Rot gibt es nur bei Vorteil/Nachteil, nicht im Schema selbst. */
.cx-raid-einstieg p { font-size: 16px; line-height: 1.65; }
.cx-raid-einstieg h3 { margin: 22px 0 8px; font-size: 18px; }
.cx-raid-abk {
  margin: 18px 0; padding: 12px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 15px;
}
.cx-raid-abk span { font-family: var(--cx-font-display); color: var(--cx-blue-light); }
.cx-raid-warnung {
  margin-top: 18px; padding: 14px 18px; border-radius: var(--cx-radius-sm);
  background: rgba(240,180,40,.10); border: 1px solid rgba(240,180,40,.42);
}
.cx-raid-warnung p { margin: 0; font-size: 15px; line-height: 1.6; }
.cx-raid-warnung-satz { font-weight: 600; font-size: 16px !important; margin-bottom: 6px !important; }

/* --- Reiterleiste der Level ----------------------------------------------- */
.cx-raid-wahl {
  display: flex; gap: 8px; margin-bottom: var(--cx-gap);
  overflow-x: auto; scrollbar-width: none; padding-bottom: 4px;
}
.cx-raid-wahl::-webkit-scrollbar { display: none; }
.cx-raid-reiter {
  flex: none; display: flex; flex-direction: column; gap: 2px; cursor: pointer;
  padding: 10px 18px; border-radius: var(--cx-radius-sm); text-align: left;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  font-family: var(--cx-font-body); color: var(--cx-text-muted);
  transition: border-color .15s, color .15s, background .15s;
}
.cx-raid-reiter:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-raid-reiter[aria-selected="true"] {
  border-color: transparent; background: var(--cx-gradient-flaeche); color: #fff;
}
.cx-raid-reiter-name { font-family: var(--cx-font-display); font-size: 17px; font-weight: 600; }
/* 3,73:1 in beiden Modi; auch hier wechselt die Erbfarbe mit dem Zustand
   des Reiters, also nur die Deckkraft weg. */
.cx-raid-reiter-kurz { font-size: 12px; white-space: nowrap; }

/* --- Detailkarte ----------------------------------------------------------- */
.cx-raid-detail-kopf { display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; }
.cx-raid-detail-kopf > div:first-child { flex: 1; min-width: 260px; }
.cx-raid-detail-kopf h3 { margin: 0 0 8px; font-size: 22px; }
.cx-raid-minimum {
  flex: none; display: flex; align-items: center; gap: 10px;
  padding: 10px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 12px; color: var(--cx-steel); line-height: 1.3;
}
.cx-raid-minimum-zahl {
  font-family: var(--cx-font-display); font-size: 30px; font-weight: 600;
  color: var(--cx-blue); font-variant-numeric: tabular-nums;
}

/* --- Das Schema ----------------------------------------------------------- */
.cx-raid-figur {
  margin: 20px 0 0; padding: 18px 16px 12px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  /* Bei vier Platten ist das SVG breiter als ein schmales Display – es wird
     gewischt, statt die Seite seitlich zu sprengen. */
  overflow-x: auto;
}
.cx-raid-figur figcaption {
  margin-top: 12px; font-size: 13.5px; color: var(--cx-steel); line-height: 1.5;
}
.cx-raid-svg { display: block; width: 100%; height: auto; }
.cx-raid-kopf {
  fill: var(--cx-steel); font-family: var(--cx-font-body); font-size: 12px;
  text-anchor: middle;
}
.cx-raid-linie { stroke: var(--cx-border); stroke-width: 1; }
.cx-raid-block { stroke-width: 1; }
.cx-raid-block-text {
  fill: var(--cx-text); font-family: var(--cx-font-body); font-size: 13px;
  font-weight: 600; text-anchor: middle;
}
.cx-raid-d { fill: rgba(30,123,232,.20); stroke: rgba(30,123,232,.65); }
.cx-raid-p { fill: rgba(53,224,218,.16); stroke: rgba(53,224,218,.55); }
.cx-raid-q { fill: rgba(240,180,40,.14); stroke: rgba(240,180,40,.55); }
.cx-raid-paar {
  fill: none; stroke: var(--cx-steel); stroke-width: 1; stroke-dasharray: 5 4;
}
html[data-theme="light"] .cx-raid-p { fill: rgba(15,118,110,.14); stroke: rgba(15,118,110,.55); }
html[data-theme="light"] .cx-raid-q { fill: rgba(190,120,20,.14); stroke: rgba(190,120,20,.55); }

.cx-raid-legende {
  display: flex; flex-wrap: wrap; gap: 6px 20px; margin-top: 12px;
  font-size: 12.5px; color: var(--cx-steel);
}
.cx-raid-legende span { display: inline-flex; align-items: center; gap: 7px; }
.cx-raid-punkt {
  width: 13px; height: 13px; border-radius: 4px; display: inline-block;
  background: rgba(30,123,232,.20); border: 1px solid rgba(30,123,232,.65);
}
i.cx-raid-p { background: rgba(53,224,218,.16); border-color: rgba(53,224,218,.55); }
i.cx-raid-q { background: rgba(240,180,40,.14); border-color: rgba(240,180,40,.55); }
i.cx-raid-spiegel { background: none; border: 1px dashed var(--cx-steel); }
html[data-theme="light"] i.cx-raid-p { background: rgba(15,118,110,.14); border-color: rgba(15,118,110,.55); }
html[data-theme="light"] i.cx-raid-q { background: rgba(190,120,20,.14); border-color: rgba(190,120,20,.55); }

/* --- Vorteile / Nachteile ------------------------------------------------- */
.cx-raid-spalten, .cx-raid-gegenueber { margin-top: 0; }
.cx-raid-ja ul, .cx-raid-nein ul { margin: 0; padding-left: 20px; font-size: 15px; line-height: 1.6; }
.cx-raid-ja li { margin-bottom: 5px; }
.cx-raid-nein li { margin-bottom: 5px; }
.cx-raid-ja li::marker { color: var(--cx-accent); }
.cx-raid-nein li::marker { color: #E06A6A; }
html[data-theme="light"] .cx-raid-nein li::marker { color: #C0392B; }

/* --- Kapazitätsbalken: warum aus 16 TB plötzlich 8 werden ----------------- */
.cx-raid-balken { margin: 0 0 4px; }
.cx-raid-balken-spur {
  height: 16px; border-radius: 99px; overflow: hidden;
  background: repeating-linear-gradient(135deg,
    var(--cx-carbon) 0 6px, var(--cx-graphite) 6px 12px);
  border: 1px solid var(--cx-border);
}
.cx-raid-balken-nutz { height: 100%; background: var(--cx-gradient); }
.cx-raid-balken-text { margin: 7px 0 0; font-size: 13.5px; color: var(--cx-steel); }
.cx-raid-rechenbeispiel { margin: 10px 0 0; font-size: 14.5px; color: var(--cx-text-muted); }
.cx-raid-rechnung { display: grid; gap: 18px; margin-top: 8px; }
.cx-raid-rechnung-zeile { display: grid; grid-template-columns: 90px 1fr; gap: 16px; align-items: start; }
.cx-raid-rechnung-level {
  font-family: var(--cx-font-display); font-weight: 600; font-size: 15px; padding-top: 1px;
}

/* --- Empfehlungen, Begriffe, Backup-Abschnitt ----------------------------- */
.cx-raid-empfehlung, .cx-raid-begriffe {
  grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr));
}
.cx-raid-fuer { margin: 0; font-size: 12.5px; color: var(--cx-steel); }
.cx-raid-empfehlung h3 { margin: 4px 0 8px; font-size: 21px; color: var(--cx-blue-light); }
.cx-raid-empfehlung p:last-child { margin: 0; font-size: 14.5px; line-height: 1.55; }
.cx-raid-begriffe h3 { margin: 0 0 8px; font-size: 17px; }
.cx-raid-begriffe p { margin: 0; font-size: 14.5px; line-height: 1.55; }
.cx-raid-backup p { font-size: 16px; line-height: 1.65; }
.cx-raid-kernsatz {
  font-family: var(--cx-font-display); font-size: 24px; font-weight: 600;
  color: var(--cx-accent); margin: 14px 0 18px;
}
.cx-raid-hinweis { border-color: rgba(240,180,40,.42); }
.cx-raid-hinweis h2 { color: #F0B428; }
html[data-theme="light"] .cx-raid-hinweis h2 { color: #8A5D00; }

/* Die Vergleichstabelle hat fünf Spalten und muss auf dem Telefon wischbar
   sein – sonst schiebt sie die ganze Seite seitlich. */
.cx-tabelle-rahmen { overflow-x: auto; margin-top: 8px; }
.cx-raid-tabelle { min-width: 720px; }
.cx-raid-zahl { text-align: right; font-variant-numeric: tabular-nums; }

@media (max-width: 620px) {
  .cx-raid-rechnung-zeile { grid-template-columns: 1fr; gap: 6px; }
  .cx-raid-kernsatz { font-size: 20px; }
  .cx-raid-minimum { padding: 8px 12px; }
}

/* --- Versionsangabe und Versionsseite -------------------------------------
   Die Nummer steht dort, wo vorher „Stand TT.MM.JJJJ“ stand – als Link, weil
   eine Zahl allein nichts erklärt. Ein Klick führt in den Verlauf. */
.cx-version-link { color: var(--cx-steel); text-decoration: underline; text-underline-offset: 2px; }
.cx-version-link:hover { color: var(--cx-accent); }
.cx-version-regel ul { margin: 12px 0 0; padding-left: 20px; font-size: 15px; line-height: 1.7; }
.cx-version-schema {
  font-family: var(--cx-font-display); font-size: 34px; font-weight: 600;
  margin: 6px 0 0; letter-spacing: .02em;
}
/* Drei Farben, drei Bedeutungen – die Legende darunter braucht dann keine
   Wiederholung der Zahlen, das Auge stellt die Zuordnung selbst her. */
.cx-version-schema b, .cx-version-regel li b { color: var(--cx-blue-light); }
.cx-version-schema span, .cx-version-regel li span { color: var(--cx-accent); }
.cx-version-schema i, .cx-version-regel li i { color: var(--cx-steel); font-style: normal; }
.cx-version-regel li b, .cx-version-regel li span, .cx-version-regel li i { font-weight: 600; }

.cx-version-liste { display: grid; gap: var(--cx-gap); margin-top: 24px; }
.cx-version-eintrag.aktuell { border-color: var(--cx-blue); }
.cx-version-kopf { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; }
.cx-version-kopf h3 { margin: 0; font-size: 19px; }
.cx-version-nr {
  font-family: var(--cx-font-display); font-size: 15px; font-weight: 600;
  font-variant-numeric: tabular-nums; color: var(--cx-blue);
  padding: 3px 10px; border-radius: 99px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-version-marke {
  font-size: 11px; padding: 2px 9px; border-radius: 99px; color: var(--cx-accent);
  background: rgba(53,224,218,.12); border: 1px solid rgba(53,224,218,.35);
}
html[data-theme="light"] .cx-version-marke {
  background: rgba(15,118,110,.10); border-color: rgba(15,118,110,.35);
}
.cx-version-eintrag p { margin: 12px 0 0; font-size: 15px; line-height: 1.62; max-width: 820px; }

/* --- IP-Adressen: Anatomie, Rechner, Wegkette -----------------------------
   Die Seite ist lang, deshalb oben eine Kapitelleiste. Kernstück ist der
   Rechner: Netzanteil blau, Geräteanteil cyan – dieselbe Zuordnung gilt in der
   Bitleiste, in den Adressvergleichen und in der 254er-Aufteilung, damit die
   Farbe überall dasselbe bedeutet. */
.cx-ip-kapitel { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
.cx-ip-kapitel a {
  font-size: 13px; color: var(--cx-text-muted); padding: 5px 12px; border-radius: 99px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  transition: border-color .15s, color .15s;
}
.cx-ip-kapitel a:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-ip-vorspann { font-size: 17px; line-height: 1.65; color: var(--cx-text-muted); }
.cx-ip-chips { margin-top: 16px; }

/* --- Adress-Anatomie ------------------------------------------------------ */
.cx-ip-anatomie { margin-top: 20px; }
.cx-ip-adresse-gross {
  display: flex; align-items: flex-end; gap: 6px; flex-wrap: wrap;
  padding-bottom: 6px;
}
.cx-ip-block {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  padding: 12px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-zahl {
  font-family: var(--cx-font-display); font-size: 30px; font-weight: 600;
  color: var(--cx-blue-light); font-variant-numeric: tabular-nums; line-height: 1;
}
.cx-ip-bin {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px; letter-spacing: .12em; color: var(--cx-steel);
}
.cx-ip-blocknr { font-size: 10.5px; color: var(--cx-steel); letter-spacing: .04em; }
.cx-ip-punkt-gross {
  font-family: var(--cx-font-display); font-size: 30px; font-weight: 600;
  color: var(--cx-steel); padding-bottom: 26px;
}
.cx-ip-anatomie-text { margin: 18px 0 0; font-size: 15px; line-height: 1.62; }
.cx-ip-rechnung {
  display: inline-flex; align-items: center; gap: 10px; margin-top: 16px;
  padding: 8px 16px; border-radius: 99px;
  background: rgba(30,123,232,.10); border: 1px solid rgba(30,123,232,.30);
  font-size: 15px;
}
.cx-ip-rechnung i { color: var(--cx-steel); font-style: normal; }
.cx-ip-rechnung b { color: var(--cx-blue-light); font-size: 17px; }

.cx-ip-warum, .cx-ip-welten, .cx-ip-router, .cx-ip-gruende { margin-top: 20px; }
.cx-ip-strasse { display: flex; align-items: baseline; gap: 12px; margin: 6px 0; }
.cx-ip-strasse b {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 17px; color: var(--cx-blue-light);
}
.cx-ip-strasse span { font-size: 13px; color: var(--cx-steel); }

/* --- DNS ------------------------------------------------------------------ */
.cx-ip-dns { margin-top: 20px; }
.cx-ip-dialog { display: grid; gap: 10px; margin-bottom: 18px; }
.cx-ip-sprech {
  padding: 12px 16px; border-radius: var(--cx-radius-sm); max-width: 560px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-sprech.antwort {
  margin-left: auto; border-color: rgba(30,123,232,.45); background: rgba(30,123,232,.10);
}
.cx-ip-wer { font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--cx-steel); }
.cx-ip-sprech p { margin: 4px 0 0; font-size: 15.5px; }
.cx-ip-telefonbuch {
  display: grid; gap: 8px; margin: 18px 0; padding: 14px 16px;
  border-radius: var(--cx-radius-sm); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-ip-telefonbuch > div { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.cx-ip-tb-name { min-width: 150px; font-weight: 600; }
.cx-ip-tb-pfeil { color: var(--cx-steel); }
.cx-ip-tb-nr {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--cx-accent);
}

/* --- Privat / öffentlich -------------------------------------------------- */
.cx-ip-privat { border-color: rgba(53,224,218,.35); }
.cx-ip-oeffentlich { border-color: rgba(30,123,232,.45); }
.cx-ip-bereichsliste { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; }
.cx-ip-bereichsliste code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13.5px;
  padding: 6px 10px; border-radius: 8px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-knappheit {
  margin-top: var(--cx-gap); display: flex; gap: 28px; align-items: center; flex-wrap: wrap;
}
.cx-ip-knappheit > div:first-child { flex: 1; min-width: 280px; }
.cx-ip-knappheit h3 { margin: 0 0 6px; font-size: 17px; }
.cx-ip-knappheit h3 + p { margin: 0 0 16px; font-size: 15px; line-height: 1.62; }
.cx-ip-zahl-gross {
  flex: none; text-align: center; padding: 20px 28px; border-radius: var(--cx-radius);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-zahl-gross b {
  display: block; font-family: var(--cx-font-display); font-size: 40px;
  color: var(--cx-blue-light); line-height: 1;
}
.cx-ip-zahl-gross span {
  display: block; margin-top: 8px; font-variant-numeric: tabular-nums;
  font-size: 17px; color: var(--cx-text);
}
.cx-ip-zahl-gross i { display: block; margin-top: 2px; font-size: 12px; color: var(--cx-steel); font-style: normal; }

/* --- Der Rechner ---------------------------------------------------------- */
.cx-ip-rechner { margin-top: 20px; }
.cx-ip-rechner-kopf { display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; }
.cx-ip-rechner-kopf > div:first-child { flex: 1; min-width: 260px; }
.cx-ip-rechner-kopf h3 { margin: 0 0 6px; font-size: 19px; }
.cx-ip-rechner-kopf p { margin: 0; font-size: 14.5px; line-height: 1.55; }
.cx-ip-eingabe { display: flex; align-items: flex-end; gap: 10px; }
.cx-ip-eingabe label { display: flex; flex-direction: column; gap: 5px; font-size: 12px; color: var(--cx-steel); }
.cx-ip-eingabe input {
  width: 170px; padding: 9px 12px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); color: var(--cx-text); border: 1px solid var(--cx-border);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 16px;
}
.cx-ip-eingabe input:focus { outline: none; border-color: var(--cx-blue); }
.cx-ip-eingabe input.fehler { border-color: #E06A6A; }
.cx-ip-praefix-anzeige {
  font-family: var(--cx-font-display); font-size: 22px; color: var(--cx-accent); padding-bottom: 4px;
}
.cx-ip-fehler { margin: 8px 0 0; font-size: 13px; color: #E06A6A; min-height: 18px; }
html[data-theme="light"] .cx-ip-fehler { color: #C0392B; }
.cx-ip-beispiele { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 20px; }

/* Bitleiste: 32 Schalter. Die Grenze zwischen Netz und Gerät ist eine echte
   Linie, kein Farbwechsel allein – sie ist der Kern der ganzen Erklärung. */
.cx-ip-bits {
  display: flex; align-items: flex-start; gap: 4px; flex-wrap: wrap;
  padding: 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-oktett { display: flex; flex-direction: column; align-items: center; gap: 6px; }
.cx-ip-bitreihe { display: flex; gap: 2px; }
.cx-ip-bit {
  width: 19px; height: 26px; display: grid; place-items: center;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px;
  border-radius: 4px; border: 1px solid transparent;
}
.cx-ip-bit.netz { background: rgba(30,123,232,.22); color: var(--cx-blue-light); border-color: rgba(30,123,232,.45); }
.cx-ip-bit.host { background: rgba(53,224,218,.12); color: var(--cx-accent); border-color: rgba(53,224,218,.30); }
.cx-ip-bit.grenze { box-shadow: -3px 0 0 0 var(--cx-accent); }
.cx-ip-dezimal {
  font-family: var(--cx-font-display); font-size: 17px; font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.cx-ip-punkt { align-self: center; color: var(--cx-steel); padding-bottom: 22px; }
.cx-ip-legende { display: flex; gap: 20px; flex-wrap: wrap; margin-top: 12px; font-size: 12.5px; color: var(--cx-steel); }
.cx-ip-legende span { display: inline-flex; align-items: center; gap: 7px; }
.cx-ip-punkt-legende { width: 13px; height: 13px; border-radius: 4px; display: inline-block; }
.cx-ip-punkt-legende.netz { background: rgba(30,123,232,.22); border: 1px solid rgba(30,123,232,.45); }
.cx-ip-punkt-legende.host { background: rgba(53,224,218,.12); border: 1px solid rgba(53,224,218,.30); }

.cx-ip-regler { display: flex; align-items: center; gap: 14px; margin: 20px 0; flex-wrap: wrap; }
.cx-ip-regler > span:first-child { font-size: 13px; color: var(--cx-steel); }
.cx-ip-regler input[type="range"] { flex: 1; min-width: 220px; accent-color: var(--cx-blue); }
.cx-ip-regler-wert {
  font-family: var(--cx-font-display); font-size: 19px; color: var(--cx-accent);
  min-width: 46px; text-align: right;
}
.cx-ip-werte {
  display: grid; gap: 8px; grid-template-columns: repeat(auto-fit, minmax(min(230px, 100%), 1fr));
}
.cx-ip-wert {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  padding: 10px 14px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-wert span { font-size: 12.5px; color: var(--cx-steel); }
.cx-ip-wert b {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 15px;
  font-variant-numeric: tabular-nums;
}
.cx-ip-wert.netz b { color: var(--cx-blue-light); }
.cx-ip-wert.bcast b { color: var(--cx-accent); }
.cx-ip-wert.gross b { font-family: var(--cx-font-display); font-size: 20px; }
.cx-ip-einordnung { margin: 16px 0 0; font-size: 14.5px; color: var(--cx-text-muted); }

.cx-ip-warum254 { margin-top: var(--cx-gap); }
.cx-ip-warum254 h3 { margin: 0 0 8px; font-size: 18px; }
.cx-ip-254 { display: flex; margin-top: 16px; border-radius: var(--cx-radius-sm); overflow: hidden; }
.cx-ip-254-teil {
  padding: 10px 8px; font-size: 12.5px; text-align: center; white-space: nowrap;
  border: 1px solid var(--cx-border);
}
.cx-ip-254-teil.netz { background: rgba(30,123,232,.22); color: var(--cx-blue-light); }
.cx-ip-254-teil.host { flex: 1; background: rgba(53,224,218,.12); color: var(--cx-accent); }
.cx-ip-254-teil.bcast { background: rgba(240,180,40,.14); color: #F0B428; }
html[data-theme="light"] .cx-ip-254-teil.bcast { color: #8A5D00; }

/* --- Subnetting ----------------------------------------------------------- */
.cx-ip-teilung { margin-top: 20px; }
.cx-ip-teilung-zeile { display: flex; align-items: center; gap: 14px; }
.cx-ip-teilung-marke { flex: none; width: 62px; font-size: 12px; color: var(--cx-steel); }
.cx-ip-balken { flex: 1; display: flex; gap: 4px; }
.cx-ip-balken-ganz {
  flex: 1; padding: 16px; text-align: center; border-radius: var(--cx-radius-sm);
  background: rgba(30,123,232,.14); border: 1px solid rgba(30,123,232,.40);
  font-size: 14.5px;
}
.cx-ip-balken-teil {
  flex: 1; padding: 12px 8px; border-radius: var(--cx-radius-sm); text-align: center;
  background: rgba(53,224,218,.10); border: 1px solid rgba(53,224,218,.32);
}
.cx-ip-balken-teil b { display: block; font-size: 14px; }
.cx-ip-balken-teil span {
  display: block; margin-top: 3px; font-size: 11.5px; color: var(--cx-steel);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
.cx-ip-balken-teil i { display: block; margin-top: 2px; font-size: 11px; color: var(--cx-accent); font-style: normal; }
.cx-ip-pfeil-runter { text-align: center; color: var(--cx-steel); font-size: 20px; margin: 10px 0; padding-left: 62px; }

/* --- Gateway-Entscheidung ------------------------------------------------- */
.cx-ip-entscheidung { margin-top: 20px; }
.cx-ip-entscheidung h3 { margin: 0 0 8px; font-size: 18px; }
.cx-ip-fall {
  margin-top: 16px; padding: 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  display: grid; gap: 12px;
}
.cx-ip-fall.gleich { border-color: rgba(53,224,218,.40); }
.cx-ip-fall.fremd { border-color: rgba(240,180,40,.42); }
.cx-ip-fall-adressen { display: grid; gap: 6px; }
.cx-ip-fall-zeile {
  display: flex; align-items: baseline; gap: 10px;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 16px;
}
.cx-ip-fall-zeile i {
  font-family: var(--cx-font-body); font-style: normal; font-size: 12px;
  color: var(--cx-steel); min-width: 108px;
}
.cx-ip-netzteil { color: var(--cx-blue-light); font-weight: 600; }
.cx-ip-hostteil { color: var(--cx-steel); }
.cx-ip-trenner { color: var(--cx-steel); }
.cx-ip-fall-ergebnis { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.cx-ip-fall-marke {
  font-size: 11px; padding: 3px 10px; border-radius: 99px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); color: var(--cx-steel);
}
.cx-ip-fall.gleich .cx-ip-fall-ergebnis b { color: var(--cx-accent); }
.cx-ip-fall.fremd .cx-ip-fall-ergebnis b { color: #F0B428; }
html[data-theme="light"] .cx-ip-fall.fremd .cx-ip-fall-ergebnis b { color: #8A5D00; }
.cx-ip-fall p { margin: 0; font-size: 14.5px; color: var(--cx-text-muted); }

/* --- NAT ------------------------------------------------------------------ */
.cx-ip-nat { display: flex; align-items: center; gap: 8px; margin-top: 16px; flex-wrap: wrap; }
.cx-ip-nat-kasten {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 10px 14px; border-radius: var(--cx-radius-sm);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-nat-kasten i {
  font-family: var(--cx-font-body); font-style: normal; font-size: 10.5px; color: var(--cx-steel);
}
.cx-ip-nat-kasten.privat { border-color: rgba(53,224,218,.35); }
.cx-ip-nat-kasten.router { border-color: rgba(30,123,232,.45); background: rgba(30,123,232,.10); }
.cx-ip-nat-kasten.oeffentlich { border-color: rgba(30,123,232,.45); }
.cx-ip-nat-pfeil { color: var(--cx-steel); }

/* --- Helfer, Wegkette, Begriffe ------------------------------------------- */
.cx-ip-helfer, .cx-ip-begriffe {
  grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr));
}
.cx-ip-helfer-kopf { display: flex; align-items: baseline; gap: 10px; }
.cx-ip-helfer-kopf h3 { margin: 0; font-size: 16px; }
.cx-ip-helfer-kurz {
  font-family: var(--cx-font-display); font-size: 15px; font-weight: 600; color: var(--cx-blue-light);
  padding: 2px 10px; border-radius: 99px;
  background: rgba(30,123,232,.12); border: 1px solid rgba(30,123,232,.32);
}
.cx-ip-helfer p { font-size: 14.5px; line-height: 1.58; margin: 12px 0 0; }
.cx-ip-helfer-beispiel {
  display: inline-block; margin-top: 12px; padding: 5px 10px; border-radius: 8px;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px;
  color: var(--cx-accent); background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-begriffe h3 { margin: 0 0 6px; font-size: 16px; }
.cx-ip-begriffe p { margin: 0; font-size: 14px; line-height: 1.55; }

.cx-ip-weg { list-style: none; margin: 20px 0 0; padding: 0; display: grid; gap: 10px; }
.cx-ip-weg > li {
  display: flex; gap: 14px; align-items: flex-start;
  padding: 12px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-ip-weg-nr {
  flex: none; width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center;
  font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--cx-blue); background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-ip-weg b { font-size: 14.5px; }
.cx-ip-weg p { margin: 2px 0 0; font-size: 14.5px; color: var(--cx-text-muted); line-height: 1.55; }

/* Heller Modus: --cx-blue-light (#3FA9FF) erreicht auf den hellblauen Flächen
   nur 1,77:1 und ist damit faktisch unlesbar – nachgemessen an der gemischten
   Hintergrundfarbe, nicht geschätzt. --cx-blue-deep kommt auf 4,67:1 und
   erfüllt die AA-Anforderung. Betrifft alle Stellen, an denen der Netzanteil
   blau auf blau steht; im dunklen Modus bleibt es beim helleren Ton. */
html[data-theme="light"] .cx-ip-bit.netz,
html[data-theme="light"] .cx-ip-254-teil.netz,
html[data-theme="light"] .cx-ip-netzteil,
html[data-theme="light"] .cx-ip-wert.netz b,
html[data-theme="light"] .cx-ip-helfer-kurz,
html[data-theme="light"] .cx-ip-strasse b,
html[data-theme="light"] .cx-ip-zahl,
html[data-theme="light"] .cx-ip-zahl-gross b,
html[data-theme="light"] .cx-ip-rechnung b { color: var(--cx-blue-deep); }

@media (max-width: 620px) {
  .cx-ip-bit { width: 15px; height: 22px; font-size: 10px; }
  .cx-ip-dezimal { font-size: 14px; }
  .cx-ip-zahl { font-size: 24px; }
  .cx-ip-teilung-zeile { flex-direction: column; align-items: stretch; gap: 8px; }
  .cx-ip-teilung-marke { width: auto; }
  .cx-ip-pfeil-runter { padding-left: 0; }
  .cx-ip-balken.vier { flex-direction: column; }
  .cx-ip-eingabe { width: 100%; }
  .cx-ip-eingabe input { width: 100%; }
}

/* --- NIS2: Analogie, zehn Pflichten, Lösungsbrücke ------------------------
   Die Seite lebt vom Vergleich mit dem Brandschutz. Deshalb bekommt die
   Gegenüberstellung eine eigene, ruhige Darstellung – sie ist das Bild, das
   nach dem Lesen hängen bleibt. */
.cx-nis-bild { margin-top: 8px; }
.cx-nis-bild p, .cx-nis-fall p { font-size: 16px; line-height: 1.65; }
.cx-nis-kernsatz {
  margin: 18px 0 0; padding: 14px 18px; border-radius: var(--cx-radius-sm);
  background: rgba(30,123,232,.10); border: 1px solid rgba(30,123,232,.32);
  font-family: var(--cx-font-display); font-size: 18px; line-height: 1.45;
}
/* Der nachgestellte Hinweis unter einem Abschnitt – Rechtshinweis, Abgrenzung,
   Stand der Angaben. 16-mal über acht Know-How-Seiten. Bis 1.130.4 auf 510 px
   gedeckelt; das war Kleingedrucktes in einem 1.200 px breiten Feld und damit
   dieselbe Bauart wie die Fußnote und der Randnotizen-Text aus 1.130.2.
   ZWEI DER SECHZEHN BLEIBEN SCHMAL, und zwar von selbst: Sie stehen im
   Fazit-Kasten, wo .cx-mitre-fazit p mit höherer Spezifität 760 px setzt.
   Das ist gewollt – dort ist es Fließtext zum Lesen, kein Hinweis. */
.cx-nis-hinweis { margin-top: 16px; font-size: 13.5px; color: var(--cx-steel);
                  line-height: 1.6; }

.cx-nis-abk { margin-top: 18px; }
.cx-nis-abk-zeile { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.cx-nis-abk-kurz {
  font-family: var(--cx-font-display); font-size: 30px; font-weight: 600;
  color: var(--cx-blue-light); padding: 6px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-nis-abk-zeile b { display: block; font-size: 17px; }
.cx-nis-abk-zeile span { display: block; margin-top: 2px; font-size: 14px; color: var(--cx-steel); }
.cx-nis-abk p { margin: 14px 0 0; font-size: 14.5px; color: var(--cx-text-muted); }
html[data-theme="light"] .cx-nis-abk-kurz { color: var(--cx-blue-deep); }

.cx-nis-warum, .cx-nis-warumloesung { margin-top: 18px; }
.cx-nis-warum ul { margin: 0; padding-left: 20px; font-size: 15px; line-height: 1.7; }
.cx-nis-warum li::marker { color: #F0B428; }
.cx-nis-zitat { display: flex; flex-direction: column; justify-content: center; }
.cx-nis-zitat p {
  margin: 0; font-family: var(--cx-font-display); font-size: 22px; line-height: 1.4;
  color: var(--cx-accent);
}
.cx-nis-zitat span { margin-top: 10px; font-size: 13px; color: var(--cx-steel); }
.cx-nis-branchen { margin-top: 16px; }
.cx-nis-branchen .cx-tag { font-size: 13px; padding: 5px 13px; }

/* --- Brandschutz-Gegenüberstellung --------------------------------------- */
.cx-nis-brand { margin-top: 18px; }
.cx-nis-brand-kopf, .cx-nis-brand-zeile {
  display: grid; grid-template-columns: 1fr 40px 1fr; align-items: center; gap: 10px;
}
.cx-nis-brand-kopf {
  padding-bottom: 10px; margin-bottom: 4px; border-bottom: 1px solid var(--cx-border);
  font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-nis-brand-kopf span:last-child { text-align: right; }
.cx-nis-brand-zeile { padding: 9px 0; border-bottom: 1px solid var(--cx-border); font-size: 15px; }
.cx-nis-brand-zeile:last-of-type { border-bottom: none; }
.cx-nis-brand-links { color: var(--cx-text-muted); }
.cx-nis-brand-pfeil { text-align: center; color: var(--cx-steel); }
.cx-nis-brand-rechts { text-align: right; color: var(--cx-blue-light); font-weight: 600; }
html[data-theme="light"] .cx-nis-brand-rechts { color: var(--cx-blue-deep); }

/* --- Die zehn Pflichten --------------------------------------------------- */
.cx-nis-pflichten { grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr)); }
.cx-nis-pflicht { display: flex; flex-direction: column; gap: 10px; }
.cx-nis-pflicht-kopf { display: flex; align-items: center; gap: 14px; }
.cx-nis-pflicht-kopf h3 { margin: 0; font-size: 18px; }
.cx-nis-pflicht > p { margin: 0; font-size: 15px; line-height: 1.6; }
/* Das Beispiel ist der Teil, den man weitererzählt – abgesetzt, damit es beim
   Überfliegen als eigener Gedanke erkennbar bleibt. */
.cx-nis-beispiel {
  padding: 10px 14px; border-radius: var(--cx-radius-sm); flex: 1;
  background: var(--cx-carbon); border-left: 3px solid var(--cx-border);
  font-size: 14.5px; line-height: 1.55; color: var(--cx-text-muted); font-style: italic;
}

/* --- Lösungstabelle: die Brücke in den Katalog ---------------------------- */
.cx-nis-tabelle { min-width: 640px; }
.cx-nis-tabelle td:last-child { text-align: right; }

/* --- Fallbeispiel --------------------------------------------------------- */
.cx-nis-fall { margin-top: 8px; }
.cx-nis-fragen { margin: 14px 0 4px; padding-left: 22px; font-size: 15.5px; line-height: 1.75; }
.cx-nis-massnahmen { list-style: none; margin: 0 0 18px; padding: 0; display: grid; gap: 8px; }
.cx-nis-massnahmen > li {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 9px 14px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border); font-size: 15px;
}
.cx-nis-massnahmen > li > span:nth-child(2) { flex: 1; min-width: 200px; }
.cx-nis-haken { flex: none; color: var(--cx-accent); font-weight: 700; }

@media (max-width: 620px) {
  .cx-nis-brand-kopf, .cx-nis-brand-zeile { grid-template-columns: 1fr; gap: 2px; text-align: left; }
  .cx-nis-brand-kopf span:last-child, .cx-nis-brand-rechts { text-align: left; }
  .cx-nis-brand-pfeil { display: none; }
  .cx-nis-brand-zeile { padding: 12px 0; }
  .cx-nis-kernsatz { font-size: 16px; }
  .cx-nis-zitat p { font-size: 19px; }
}

/* --- DORA: Kette, Zielbild, Zielgruppen, Merkhilfe ------------------------
   Baut auf den NIS2-Klassen auf (Karten, Beispielkästen, Tabelle) und ergänzt
   nur, was hier eigenes Gewicht hat. */
.cx-dora-kette {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 14px;
  font-size: 13px;
}
.cx-dora-kette span {
  padding: 6px 12px; border-radius: 99px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border); color: var(--cx-text-muted);
}
/* Das schwache Glied ist gestrichelt – eine Kette reißt dort, nicht überall. */
.cx-dora-kette span.schwach {
  border-style: dashed; border-color: #F0B428; color: #F0B428;
}
html[data-theme="light"] .cx-dora-kette span.schwach { border-color: #8A5D00; color: #8A5D00; }
.cx-dora-kette i { color: var(--cx-steel); font-style: normal; }

.cx-dora-nis2 { margin-top: var(--cx-gap); border-color: rgba(30,123,232,.42); }
.cx-dora-nis2 h3 { margin: 0 0 8px; font-size: 18px; }
.cx-dora-nis2 p { margin: 0 0 10px; font-size: 15px; line-height: 1.62; }

.cx-dora-gruppen { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
.cx-dora-gruppe {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 14px; border-radius: 99px; font-size: 14px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-dora-gruppe i { font-style: normal; font-size: 16px; line-height: 1; }
.cx-dora-dienstleister { margin-top: var(--cx-gap); border-color: rgba(240,180,40,.42);
  /* Nachtrag zu 1.118.0: hier lief ein Absatz mit 151 Zeichen je Zeile. */
  max-width: var(--cx-lesebreite);
}
.cx-dora-dienstleister p { margin: 0 0 12px; font-size: 15.5px; line-height: 1.62; }

/* --- „Nicht … sondern“: der Kern der Verordnung ---------------------------- */
.cx-dora-ziel { margin-top: 18px; }
.cx-dora-nicht, .cx-dora-sondern { display: flex; align-items: flex-start; gap: 14px; margin-bottom: 12px; }
.cx-dora-nicht p, .cx-dora-sondern p {
  margin: 0; font-family: var(--cx-font-display); font-size: 19px; line-height: 1.45;
}
.cx-dora-nicht p { color: var(--cx-steel); text-decoration: line-through; text-decoration-thickness: 1px; }
.cx-dora-sondern p { color: var(--cx-accent); }
.cx-dora-marke {
  flex: none; margin-top: 3px; font-size: 11px; letter-spacing: .06em; text-transform: uppercase;
  padding: 3px 10px; border-radius: 99px; border: 1px solid var(--cx-border); color: var(--cx-steel);
}
.cx-dora-marke.sondern { border-color: rgba(53,224,218,.40); color: var(--cx-accent); }
html[data-theme="light"] .cx-dora-marke.sondern { border-color: rgba(15,118,110,.40); }
.cx-dora-begriff {
  margin: 18px 0 12px; padding-top: 14px; border-top: 1px solid var(--cx-border);
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
}
.cx-dora-begriff b { font-family: var(--cx-font-display); font-size: 21px; color: var(--cx-blue-light); }
.cx-dora-begriff span { font-size: 14px; color: var(--cx-steel); }
html[data-theme="light"] .cx-dora-begriff b { color: var(--cx-blue-deep); }

/* --- Vorher / Nachher ----------------------------------------------------- */
.cx-dora-vergleich { margin-top: 18px; }
/* Die Überschrift nach dem Vergleich stand direkt auf der Unterkante der Karte:
   Styleguide.css setzt h3 global auf margin-top 0, und ein Grid bringt keinen
   eigenen Abstand mit. 26px sind bewusst mehr als die 18px oberhalb des Grids –
   so gehört die Zeile sichtbar zum folgenden Text und nicht zum Kartenrahmen. */
.cx-dora-vergleich + h3 { margin: 26px 0 8px; }
.cx-dora-vorher { border-color: rgba(224,106,106,.35); }
.cx-dora-vorher p {
  margin: 0; font-family: var(--cx-font-display); font-size: 19px; line-height: 1.45;
  color: var(--cx-steel);
}
.cx-dora-nachher { border-color: rgba(53,224,218,.35); }
.cx-dora-nachher .cx-nis-massnahmen { margin-bottom: 0; }
.cx-dora-nachher .cx-nis-massnahmen > li { padding: 7px 12px; font-size: 14.5px; }

/* --- Merkhilfe S-T-A-R-K -------------------------------------------------- */
.cx-dora-stark { margin-top: 18px; display: grid; gap: 4px; }
.cx-dora-stark-zeile {
  display: flex; align-items: center; gap: 18px;
  padding: 12px 0; border-bottom: 1px solid var(--cx-border);
}
.cx-dora-stark-zeile:last-of-type { border-bottom: none; }
/* Der Buchstabe trägt die Merkhilfe – deshalb groß, monospaced ausgerichtet
   und in der Akzentfarbe, damit die Senkrechte S-T-A-R-K sofort lesbar ist. */
.cx-dora-stark-b {
  flex: none; width: 52px; text-align: center;
  font-family: var(--cx-font-display); font-size: 34px; font-weight: 600; line-height: 1;
  color: var(--cx-blue-light);
}
html[data-theme="light"] .cx-dora-stark-b { color: var(--cx-blue-deep); }
.cx-dora-stark-zeile b { font-size: 16px; }
.cx-dora-stark-zeile p { margin: 2px 0 0; font-size: 14.5px; color: var(--cx-text-muted); line-height: 1.55; }
.cx-dora-stark-schluss {
  margin: 16px 0 0; padding-top: 16px; border-top: 1px solid var(--cx-border);
  font-size: 15px; line-height: 1.62; max-width: 820px;
}

@media (max-width: 620px) {
  .cx-dora-stark-b { width: 38px; font-size: 27px; }
  .cx-dora-stark-zeile { gap: 12px; }
  .cx-dora-nicht p, .cx-dora-sondern p, .cx-dora-vorher p { font-size: 17px; }
}

/* --- Schmale Displays: Navigation seitlich scrollbar statt abgeschnitten ---
   Mit inzwischen sechs Menüpunkten passt die Leiste auf dem Smartphone nicht
   mehr in eine Zeile. Wischen ist hier die verlässlichere Lösung als Umbruch,
   weil die Kopfzeile sonst die halbe Seite einnimmt. */
@media (max-width: 720px) {
  .cx-nav { gap: 18px; }
  .cx-glossar-kopf .cx-tag { font-size: 11px; }
}

/* ================= Startseite (Landing Page) =================
   Eigene Klassen statt der Listen-Layouts: die Startseite erklärt die
   Plattform, sie zeigt keine Daten. Alles baut auf den Variablen aus
   Styleguide.css auf, damit heller und dunkler Modus mitlaufen. */

/* Keine eigene Breite mehr: Der Hero war mit 780 px der einzige Abschnitt der
   Startseite, der nicht die Spaltenbreite von 1.200 px nutzte. Darunter beginnt
   sofort das Kennzahlenband über die volle Breite – gemessen am 12.09.2026
   sprang die Kante um 420 px nach rechts, und genau diesen Versatz sieht man
   als Erstes auf der Seite. Die Überschrift bricht trotzdem zweizeilig um: Der
   Umbruch vor „Entscheiden." steht als <br> im Markup, nicht in der Breite. */
.cx-start-hero { padding: 56px 0 12px; }
.cx-start-hero h1 {
  font-size: clamp(38px, 6vw, 62px);
  line-height: 1.08;
  margin: 0 0 18px;
}
.cx-start-cta { display: flex; flex-wrap: wrap; gap: 12px; margin: 26px 0 0; }
.cx-start-cta .cx-btn, .cx-start-cta .cx-btn-secondary { margin: 0; }

/* Kennzahlenband: auto-fit, damit aus vier Feldern auf schmalen Displays
   zwei Reihen zu zwei werden statt einer gequetschten Zeile.
   Abstand und Rundung wie bei allen anderen Karten der Startseite – vier
   einzelne Kästchen, kein durchgehender Block mit Haarlinien dazwischen. */
.cx-kpi-band {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(190px, 100%), 1fr));
  margin: 44px 0 8px;
}
.cx-kpi-feld {
  background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius);
  padding: 22px 20px;
  text-align: center;
  /* Gleich hoch und mittig: sonst hängt die einzeilige Unterschrift oben,
     während die zweizeilige daneben tiefer geht. */
  display: flex; flex-direction: column; justify-content: center;
}
.cx-kpi-feld b {
  display: block; font-family: var(--cx-font-display);
  font-size: 34px; line-height: 1.1; color: var(--cx-text);
}
.cx-kpi-feld span {
  display: block; margin-top: 6px; font-size: 13.5px;
  color: var(--cx-steel); line-height: 1.45;
}

.cx-start-section { margin: 64px 0 0; }
.cx-start-section > h2 {
  font-size: clamp(26px, 3.4vw, 34px); margin: 0 0 14px;
}
/* Der Vorspann steht UNTER seiner Überschrift, nicht daneben, und läuft über
   die volle Breite. Die frühere Deckelung auf 720 px ließ rechts 480 px weiß –
   auf einer Seite, die überflogen und nicht gelesen wird, ist das der
   schlechtere Tausch. Die Absätze sind kurz genug dafür: zwei bis vier Zeilen. */
.cx-start-intro {
  font-size: 17px; line-height: 1.65;
  color: var(--cx-text-muted); margin: 0 0 26px;
}

.cx-start-grid {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr));
  align-items: stretch;
}
/* Vier Karten: schmalere Mindestbreite, damit sie auf dem Desktop in eine
   Reihe passen statt 3 + 1 zu brechen. */
.cx-start-grid-vier {
  grid-template-columns: repeat(auto-fit, minmax(min(250px, 100%), 1fr));
}
.cx-start-karte h3 {
  margin: 0 0 10px; font-size: 18px; line-height: 1.35;
}
.cx-start-karte p {
  margin: 0; font-size: 15px; line-height: 1.62; color: var(--cx-text-muted);
}

/* Der Systemhaus-Abschnitt ist der eigentliche Verkaufsteil der Seite und
   darf sich vom Rest absetzen. */
.cx-start-systemhaus {
  background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius);
  padding: 34px 32px 30px;
}
.cx-start-systemhaus > h2 { margin-top: 4px; }
.cx-start-liste { margin: 0; padding: 0; list-style: none; display: grid; gap: 14px; }
.cx-start-liste li {
  position: relative; padding-left: 26px; font-size: 15.5px;
  line-height: 1.6; color: var(--cx-text-muted); max-width: 760px;
}
.cx-start-liste li::before {
  content: ""; position: absolute; left: 4px; top: 9px;
  width: 8px; height: 8px; border-radius: 50%; background: var(--cx-blue);
}
.cx-start-liste li b { color: var(--cx-text); font-weight: 600; }
/* Der Zugangshinweis läuft über die ganze Kastenbreite – er ist die Antwort
   auf den Abschnitt darüber und nicht die Randnotiz, als die ihn eine
   Deckelung auf 780 px erscheinen ließ. */
.cx-start-hinweis {
  margin: 26px 0 0; padding: 16px 18px;
  border-left: 3px solid var(--cx-blue);
  background: rgba(30,123,232,.07);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
  font-size: 15px; line-height: 1.62; color: var(--cx-text-muted);
}
.cx-start-hinweis b { color: var(--cx-text); }
/* Der Knopf steht mittig unter dem Hinweis, den er beantwortet. Gestapelt und
   nicht nebeneinander zentriert: Sonst schöbe der Zusatz rechts daneben den
   Knopf um gut 120 px aus der Mitte – zentriert wäre dann die Gruppe, nicht
   der Knopf, und genau den sucht das Auge. */
.cx-start-cta-mitte {
  flex-direction: column; align-items: center; gap: 10px;
}

.cx-zugang-grid {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
  align-items: stretch;
}
.cx-zugang { display: flex; flex-direction: column; }
.cx-zugang h3 { margin: 0 0 4px; font-size: 19px; }
.cx-zugang-wer {
  margin: 0 0 14px; font-size: 13px; color: var(--cx-steel);
  text-transform: uppercase; letter-spacing: .06em;
}
.cx-zugang ul { margin: 0; padding-left: 18px; display: grid; gap: 8px; }
.cx-zugang li { font-size: 14.5px; line-height: 1.55; color: var(--cx-text-muted); }
/* Die mittlere Stufe ist das Ziel der Seite – ein Rahmen reicht als Hinweis,
   ohne dass es nach Preistabelle aussieht. */
.cx-zugang-hervor { border-color: var(--cx-blue); }

.cx-start-abschluss {
  margin: 70px 0 0; padding: 40px 32px;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite); text-align: center;
}
.cx-start-abschluss h2 {
  margin: 0 0 10px; font-size: clamp(24px, 3.2vw, 32px);
}
/* Der Absatz lief bis 1.130.3 gegen 560 px in einem 1.136 px breiten Kasten.
   Anders als die drei Randnotizen aus 1.130.2 sah das nicht nach Fehler aus –
   der ganze Kasten ist zentriert, es fehlte also links wie rechts gleich viel.
   Ohne die Deckelung steht der Satz jetzt aber auf EINER Zeile statt auf zwei
   und damit so breit wie die Überschrift darüber. Zentriert bleibt er über
   text-align des Kastens; die auto-Ränder wären ohne Deckelung wirkungslos. */
.cx-start-abschluss > p {
  margin: 0; font-size: 16px;
  line-height: 1.6; color: var(--cx-text-muted);
}
.cx-start-abschluss .cx-start-cta { justify-content: center; }

html[data-theme="light"] .cx-kpi-feld,
html[data-theme="light"] .cx-start-systemhaus,
html[data-theme="light"] .cx-start-abschluss { background: var(--cx-white); }
/* Die Kennzahlenfelder sind jetzt einzelne Kästchen und brauchen im hellen
   Modus denselben leichten Schatten wie die übrigen Karten. */
html[data-theme="light"] .cx-kpi-feld { box-shadow: 0 1px 3px rgba(20,23,28,.06); }
html[data-theme="light"] .cx-start-hinweis { background: rgba(30,123,232,.06); }

/* --- Die Breite der Seite auch nutzen -------------------------------------
   Auf dem Desktop stand alles in einer linken Spalte, rechts blieben bis zu
   540 px weiß. Dagegen hilft hier nicht das Nebeneinanderstellen – Stefan will
   die Bausteine untereinander, in der gewohnten Reihenfolge: Überschrift,
   Vorspann, Rest; das Kennzahlenband über die ganze Seite, der Zugangshinweis
   über die ganze Kastenbreite und sein Knopf mittig darunter.

   Genutzt wird die Fläche stattdessen, indem die Absätze über die volle Breite
   laufen statt bei 720 px zu stoppen. Nur die Aufzählung im Systemhaus-Kasten
   steht zweispaltig – dort sind es vier kurze Punkte, keine Lesestrecke. */
@media (min-width: 1000px) {
  /* auto-fit statt fester zwei Spalten: Wird der Kasten zu schmal, fällt die
     Aufzählung von selbst wieder auf eine Spalte zurück. Die Deckelung auf
     760 px an den Punkten darf dabei stehen bleiben – zweispaltig sind sie
     ohnehin schmaler, einspaltig greift sie wie bisher. */
  .cx-start-liste-zwei {
    grid-template-columns: repeat(auto-fit, minmax(min(430px, 100%), 1fr));
    gap: 18px 40px;
  }
}

@media (max-width: 720px) {
  .cx-start-hero { padding-top: 34px; }
  .cx-start-systemhaus { padding: 26px 20px 24px; }
  .cx-start-abschluss { padding: 32px 20px; }
  /* box-sizing gehört zwingend dazu: Die Knöpfe sind content-box, also käme zu
     den 100 % noch 2 × 28 px Innenabstand hinzu – 56 px, die auf einem 375er
     Display seitlich hinausragen. Nebeneinander fiel das nie auf, weil ein
     Flex-Element in der Hauptachse schrumpfen darf; gestapelt tut es das nicht. */
  .cx-start-cta .cx-btn, .cx-start-cta .cx-btn-secondary {
    width: 100%; box-sizing: border-box; text-align: center;
  }
}

/* ============================================================
   Bezugsquellen und Pflege (interner Bereich)
   ============================================================ */

.cx-bq-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 10px; }
.cx-bq-chip {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 5px 11px; border-radius: 999px; font-size: 13.5px;
  background: rgba(30,123,232,.12); border: 1px solid rgba(30,123,232,.35);
}
.cx-bq-chip strong { font-weight: 600; color: var(--cx-text); }
.cx-bq-chip em, .cx-bq-vendor em {
  font-style: normal; font-size: 12px; color: var(--cx-steel);
}
/* Sekundäre Quellen treten zurück, Direktbezug bekommt die Akzentfarbe:
   auf einen Blick erkennbar, ohne die Reihenfolge zu bewerten. */
.cx-bq-chip.cx-bq-sekundaer { background: rgba(139,146,155,.12); border-color: var(--cx-border); }
.cx-bq-chip.cx-bq-direkt { background: rgba(53,224,218,.12); border-color: rgba(53,224,218,.4); }
/* Noch nicht bestätigt: gestrichelter Rahmen statt Farbfläche. Ein Rahmen, der
   nicht durchgezogen ist, liest sich als „noch offen“ – ohne Warnrot, denn es
   ist kein Fehler, sondern ein Stand. Der Hinweistext steht ohnehin daneben. */
.cx-bq-chip.cx-bq-unbestaetigt {
  background: none; border-style: dashed; border-color: rgba(224,169,106,.5);
}
.cx-bq-chip.cx-bq-unbestaetigt em { color: rgb(214,158,95); }
.cx-bq-kdnr { font-size: 12px; color: var(--cx-steel); font-variant-numeric: tabular-nums; }

.cx-bq-status {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 5px 11px; border-radius: 999px; font-size: 13.5px; font-weight: 600;
  background: rgba(53,224,218,.1); border: 1px solid rgba(53,224,218,.35);
  color: var(--cx-text);
}
.cx-bq-status em { font-style: normal; font-weight: 400; font-size: 12px; color: var(--cx-steel); }
.cx-bq-status.cx-bq-laeuft-ab { background: rgba(240,180,40,.14); border-color: rgba(240,180,40,.5); }
.cx-bq-status.cx-bq-abgelaufen { background: rgba(224,64,64,.14); border-color: rgba(224,64,64,.5); }
.cx-bq-laeuft-ab { color: #E8B23C; font-weight: 600; }
.cx-bq-abgelaufen { color: #F06A6A; font-weight: 600; }

/* Ansprechpartner: beide Tabellen mit derselben Spaltenaufteilung, damit sie
   untereinander in einer Flucht stehen. Ohne table-layout: fixed bemisst jede
   Tabelle ihre Spalten nach dem eigenen Inhalt – dann sitzt „Rolle“ in der
   zweiten Tabelle ein Stück versetzt. Die Prozentwerte müssen 100 ergeben. */
.cx-kontakt-tabelle { table-layout: fixed; }
.cx-kontakt-tabelle th:nth-child(1), .cx-kontakt-tabelle td:nth-child(1) { width: 24%; }
.cx-kontakt-tabelle th:nth-child(2), .cx-kontakt-tabelle td:nth-child(2) { width: 26%; }
.cx-kontakt-tabelle th:nth-child(3), .cx-kontakt-tabelle td:nth-child(3) { width: 28%; }
.cx-kontakt-tabelle th:nth-child(4), .cx-kontakt-tabelle td:nth-child(4) { width: 22%; }
/* Feste Breiten heißt: lange Adressen müssen umbrechen dürfen, sonst laufen sie
   in die Nachbarspalte. */
.cx-kontakt-tabelle td { overflow-wrap: anywhere; }
/* Die allgemeine Mindestbreite der ersten Spalte würde die feste Aufteilung
   wieder aushebeln. */
.cx-kontakt-tabelle td:first-child { min-width: 0; }

/* Auf dem Telefon passen vier Spalten nicht nebeneinander. Statt die Inhalte zu
   quetschen oder die ganze Seite seitlich scrollen zu lassen, scrollt die
   Tabelle in sich selbst – die Karte behält ihre Breite. */
@media (max-width: 720px) {
  .cx-kontakt-tabelle { display: block; overflow-x: auto; white-space: nowrap; }
  .cx-kontakt-tabelle th, .cx-kontakt-tabelle td { width: auto; }
  .cx-kontakt-tabelle td { overflow-wrap: normal; }
}

.cx-bq-bemerkungen { font-size: 14px; margin-top: 4px; }
.cx-bq-haus { display: block; font-size: 12px; color: var(--cx-steel); }
/* Zu welcher Partnerfirma gehört dieser Kontakt? Sieht nur der Admin – alle
   anderen bekommen ohnehin nur die eigenen und bräuchten das Kennzeichen nicht. */
.cx-bq-firma {
  display: inline-block; margin-left: 6px; padding: 1px 7px;
  border: 1px solid var(--cx-line); border-radius: 999px;
  font-size: 11px; color: var(--cx-steel); vertical-align: middle;
}
.cx-bq-tel { display: block; font-size: 13px; color: var(--cx-steel); font-variant-numeric: tabular-nums; }
.cx-bq-dealreg { display: flex; flex-wrap: wrap; gap: 8px 18px; align-items: center; font-size: 14px; }
.cx-bq-herkunft { font-size: 12.5px; color: var(--cx-steel); margin: 14px 0 0; }
.cx-intern-teil { margin-top: 22px; }

.cx-datei-liste { list-style: none; padding: 0; margin: 4px 0 0; }
.cx-datei-liste li {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 12px;
  padding: 8px 0; border-bottom: 1px solid var(--cx-border);
}
.cx-datei-art {
  font-size: 11.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--cx-accent); min-width: 92px;
}
.cx-datei-meta { font-size: 12.5px; color: var(--cx-steel); }

/* --- Seite „Bezugsquellen“ --- */
.cx-bq-haus-karte h3 { margin-top: 20px; }
.cx-bq-haus-meta { font-size: 14px; color: var(--cx-steel); margin-bottom: 6px; }
.cx-bq-bemerkung { font-size: 14px; }
.cx-bq-vendorliste { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 8px; }
.cx-bq-vendor {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 6px 12px; border-radius: var(--cx-radius-sm); font-size: 14px;
  background: rgba(30,123,232,.1); border: 1px solid rgba(30,123,232,.3);
  color: var(--cx-text); font-weight: 500;
}
.cx-bq-vendor:hover { border-color: var(--cx-blue-light); }
.cx-bq-vendor.cx-bq-sekundaer { background: rgba(139,146,155,.1); border-color: var(--cx-border); }
.cx-bq-vendor.cx-bq-offen { background: none; border-style: dashed; color: var(--cx-steel); }
.cx-bq-vendor.cx-bq-unbestaetigt {
  background: none; border-style: dashed; border-color: rgba(224,169,106,.5);
}
.cx-bq-vendor.cx-bq-unbestaetigt em { color: rgb(214,158,95); }
/* Im Hellmodus trägt derselbe Amberton auf weißer Karte nur 2,36:1 – gemessen,
   nicht geschätzt. rgb(150,92,25) kommt auf 5,47:1 und bleibt als Amber
   erkennbar. Gilt für beide Chip-Bauformen und die Hinweiszeile. */
html[data-theme="light"] .cx-bq-vendor.cx-bq-unbestaetigt em,
html[data-theme="light"] .cx-bq-chip.cx-bq-unbestaetigt em { color: rgb(150,92,25); }
html[data-theme="light"] .cx-bq-vendor.cx-bq-unbestaetigt,
html[data-theme="light"] .cx-bq-chip.cx-bq-unbestaetigt { border-color: rgba(150,92,25,.55); }
html[data-theme="light"] .cx-bq-unbestaetigt-hinweis { border-left-color: rgba(150,92,25,.55); }
/* Eine Zeile je Haus statt an jedem einzelnen Chip – die Begründung ist für
   alle dieselbe und würde sonst dreißigmal danebenstehen. */
.cx-bq-unbestaetigt-hinweis {
  margin: 2px 0 10px; font-size: 13.5px; line-height: 1.55; color: var(--cx-steel);
  border-left: 2px solid rgba(224,169,106,.5); padding-left: 10px;
}

/* 'gefuehrt' ist die Zuordnung OHNE Bewertung: Das Haus führt den Hersteller,
   mehr steht dort nicht. Deshalb ein neutraler Grund und keine der drei
   Rangfarben – Blau wie bei 'primaer' behauptete einen ersten Weg, den in
   dieser Ansicht niemand gelesen hat. */
.cx-bq-chip.cx-bq-gefuehrt,
.cx-bq-vendor.cx-bq-gefuehrt,
.cx-bq-mini.cx-bq-gefuehrt {
  background: rgba(139,146,155,.12); border-color: var(--cx-border);
}

/* --- Was das HAUS führt: die zweite Liste ---------------------------------
   Eigene Optik, weil es eine andere Aussage ist als ein Bezugsweg. Kein Rahmen
   in einer der Rangfarben – die stünden für primär, sekundär, direkt und
   sagten damit etwas über den eigenen Bezug, was hier niemand behauptet.
   Stattdessen ein gepunkteter Rahmen ohne Füllung: sichtbar, aber erkennbar
   schwächer als jede Zeile darüber. Vom gestrichelten 'unbestaetigt'
   unterscheidbar, weil das eine Bewertung trägt und dieses hier nicht.
   Der Rahmen nimmt Steel und nicht --cx-border: gemessen käme der Linienton
   nur auf 1,16 : 1 gegen die Karte, ein gepunkteter Rahmen wäre damit
   Dekoration, die niemand sieht. Ausgeschriebenes rgba() statt color-mix()
   mit einer Variablen – im Dunkelmodus lieferte das einen Ton, der sich vom
   Kartengrund nicht mehr abhob (1,06 : 1, nachgemessen). Zwei Werte, weil ein
   Grauton nicht gegen fast Schwarz UND gegen Weiß arbeiten kann. Die
   Deckkraft ist so gewählt, dass beide über 3 : 1 gegen die Karte liegen –
   die Schwelle für Bauteilkanten. */
.cx-bq-vendor.cx-bq-fuehrt {
  background: none; border-style: dotted; border-color: rgba(139,146,155,.7);
  color: var(--cx-text-muted);
}
.cx-bq-vendor.cx-bq-fuehrt:hover { border-color: var(--cx-steel); }
.cx-bq-chip.cx-bq-nurfuehrt {
  background: none; border-style: dotted; border-color: rgba(139,146,155,.7);
}
html[data-theme="light"] .cx-bq-vendor.cx-bq-fuehrt,
html[data-theme="light"] .cx-bq-chip.cx-bq-nurfuehrt {
  border-color: rgba(100,112,125,.75);
}
.cx-bq-chip.cx-bq-nurfuehrt strong { color: var(--cx-text-muted); }
/* Eine Zeile je Gruppe, nicht je Chip – wie beim Hinweis zu 'unbestaetigt'. */
.cx-bq-fuehrt-hinweis {
  margin: 2px 0 10px; font-size: 13.5px; line-height: 1.55; color: var(--cx-steel);
  border-left: 2px solid var(--cx-border); padding-left: 10px;
}
.cx-bq-auchda { margin-top: 10px; }

/* Der Hinweis steht EINMAL oben auf der Seite und nicht an jedem Chip: Die
   Begründung ist überall dieselbe. Kante in der Farbe des internen Bereichs,
   weil es um eine Freischaltung geht und nicht um einen Fehler. */
.cx-bq-nurzuordnung {
  margin-top: 0; padding: 14px 18px;
  border-left: 3px solid var(--cx-accent);
  background: color-mix(in srgb, var(--cx-accent) 7%, transparent);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
.cx-bq-nurzuordnung p { margin: 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-bq-nurzuordnung strong { color: var(--cx-text); }

/* Dasselbe Bauteil für eine Firma ohne eigene Bezugswege. Es erklärt, warum
   die Zahlen im Verzeichnis etwas anderes zählen als bei jemandem, der schon
   gepflegt hat – ohne diese Zeile hielte man sie für die eigenen. Beide
   Bänder können nebeneinander stehen; das ist kein Widerspruch, sondern zwei
   verschiedene Gründe für zwei verschiedene Einschränkungen. */
.cx-bq-marktblick {
  margin-top: 0; padding: 14px 18px;
  border-left: 3px solid var(--cx-steel);
  background: color-mix(in srgb, var(--cx-steel) 7%, transparent);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
.cx-bq-marktblick p { margin: 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-bq-marktblick strong { color: var(--cx-text); }

/* --- Bezugsquellen: Auskunftsschalter (oben) --------------------------------
   Ein Feld, eine Antwort. Die Vorschlagsliste schwebt über dem Verzeichnis,
   deshalb braucht die Feldbox ihren eigenen Stapelkontext. */
.cx-bq-schalter { padding-bottom: 22px; }
.cx-bq-schalter > h2 { margin-top: 0; }
.cx-bq-feldbox { position: relative; z-index: 30; max-width: 620px; margin-bottom: 4px; }
.cx-bq-feldbox input[type="search"] {
  width: 100%; padding: 15px 20px; font-size: 16.5px; border-radius: 99px;
  border: 1px solid var(--cx-border); background: var(--cx-carbon); color: var(--cx-text);
  font-family: inherit;
}
.cx-bq-feldbox input[type="search"]:focus {
  outline: none; border-color: var(--cx-blue); box-shadow: 0 0 0 3px rgba(30,123,232,.18);
}
.cx-bq-vorschlaege {
  position: absolute; left: 0; right: 0; top: calc(100% + 6px);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); overflow: hidden;
  box-shadow: 0 18px 40px rgba(0,0,0,.45);
}
html[data-theme="light"] .cx-bq-vorschlaege { box-shadow: 0 18px 40px rgba(20,23,28,.14); }
.cx-bq-vorschlaege button {
  display: flex; align-items: center; gap: 11px; width: 100%; text-align: left;
  border: 0; cursor: pointer; background: transparent; color: var(--cx-text);
  padding: 9px 14px; font: 400 14.5px/1.4 var(--cx-font-body);
  border-bottom: 1px solid rgba(139,146,155,.13);
}
.cx-bq-vorschlaege button:last-child { border-bottom: 0; }
.cx-bq-vorschlaege button:hover,
.cx-bq-vorschlaege button[aria-selected="true"] { background: rgba(30,123,232,.12); }
.cx-bq-vname { font-weight: 600; }
.cx-bq-vrand { margin-left: auto; font-size: 12px; color: var(--cx-steel); }

/* Logos stehen auf weißen Plättchen – auch im Dunkelmodus, Marken brauchen
   ihren hellen Grund. Dasselbe Maß wie auf der Bereichsseite. */
.cx-bq-logo {
  flex: none; width: 74px; height: 30px; background: #fff; border-radius: 7px;
  padding: 4px 7px; display: inline-flex; align-items: center; justify-content: center;
}
.cx-bq-logo img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
.cx-bq-logo .cx-logo-ersatz {
  font: 700 11px/1 var(--cx-font-display); color: #14171C; text-align: center;
}

.cx-bq-antwortkopf { display: flex; align-items: center; gap: 14px; margin: 22px 0 2px; }
.cx-bq-antwortkopf h3 { margin: 0; font-size: 20px; }
.cx-bq-antwortkopf .cx-btn-secondary { margin-left: auto; }
.cx-bq-satz { font-size: 16px; margin: 10px 0 16px; color: var(--cx-text-muted); }
.cx-bq-satz strong { color: var(--cx-text); font-weight: 600; }

/* Ein Bezugsweg als Zeile: Rang, Haus, Ansprechpartner. Die Nummer sagt, in
   welcher Reihenfolge man es versucht – das ist die eigentliche Auskunft. */
.cx-bq-weg {
  display: flex; align-items: center; gap: 16px; padding: 14px 18px; margin-bottom: 8px;
  border-radius: var(--cx-radius); border: 1px solid var(--cx-blue);
  background: rgba(63,169,255,.10);
}
html[data-theme="light"] .cx-bq-weg {
  border-color: var(--cx-blue-deep); background: rgba(13,80,216,.07);
}
.cx-bq-weg-offen {
  border-style: dashed; border-color: rgba(224,169,106,.6); background: rgba(224,169,106,.09);
}
html[data-theme="light"] .cx-bq-weg-offen {
  border-color: rgba(150,92,25,.55); background: rgba(150,92,25,.07);
}
.cx-bq-rang {
  width: 32px; height: 32px; border-radius: 50%; flex: none; display: grid;
  place-items: center; background: var(--cx-blue-flaeche); color: #fff;
  font: 700 15px/1 var(--cx-font-display);
}
.cx-bq-weg-offen .cx-bq-rang { background: rgb(190,132,68); }
html[data-theme="light"] .cx-bq-weg-offen .cx-bq-rang { background: rgb(150,92,25); }
.cx-bq-wegtext { flex: 1; min-width: 0; }
.cx-bq-wegtext strong { display: block; font-size: 16.5px; font-weight: 600; }
.cx-bq-wegtext span { font-size: 13px; color: var(--cx-steel); }
.cx-bq-weg-offen .cx-bq-wegtext span { color: rgb(214,158,95); font-weight: 600; }
html[data-theme="light"] .cx-bq-weg-offen .cx-bq-wegtext span { color: rgb(150,92,25); }
.cx-bq-wegtext em {
  display: block; font-style: normal; font-size: 12.5px; color: var(--cx-steel); margin-top: 3px;
}
.cx-bq-wegkontakt { text-align: right; font-size: 13px; color: var(--cx-steel); flex: none; }
.cx-bq-wegkontakt strong { display: block; color: var(--cx-text); font-weight: 600; }
.cx-bq-wegkontakt a { display: block; font-weight: 400; }

.cx-bq-hinweis {
  margin: 10px 0 0; padding: 13px 16px; border-radius: var(--cx-radius-sm);
  border: 1px dashed var(--cx-border); background: var(--cx-carbon);
  font-size: 14px; color: var(--cx-text-muted);
}
/* Der Leerzustand ist Absicht, kein Ladehinweis: Die Seite trifft keine
   Vorauswahl, weil ein vorausgewählter Hersteller wie eine Antwort aussieht. */
.cx-bq-leer { font-size: 14.5px; color: var(--cx-steel); margin: 16px 0 0; }

/* --- Bezugsquellen: Verzeichnis (unten) ------------------------------------ */
.cx-bq-richtung {
  display: flex; gap: 4px; background: var(--cx-graphite); padding: 4px;
  border: 1px solid var(--cx-border); border-radius: 99px; flex-wrap: wrap;
}
.cx-bq-richtung button {
  border: 0; background: transparent; color: var(--cx-steel); cursor: pointer;
  font: 600 13.5px/1 var(--cx-font-body); padding: 9px 15px; border-radius: 99px;
}
.cx-bq-richtung button:hover { color: var(--cx-text); }
.cx-bq-richtung button[aria-pressed="true"] { background: var(--cx-blue-flaeche); color: #fff; }
.cx-bq-filter {
  border: 1px solid var(--cx-border); background: var(--cx-graphite); color: var(--cx-steel);
  cursor: pointer; border-radius: 99px; padding: 4px 12px;
  font: 600 12.5px/1.4 var(--cx-font-body);
}
.cx-bq-filter:hover { color: var(--cx-text); border-color: var(--cx-blue); }
.cx-bq-filter[aria-pressed="true"] {
  color: var(--cx-text); border-color: var(--cx-blue); background: rgba(30,123,232,.14);
}

/* Das Band über der Liste, wenn sie auf einen Bezug eingeschränkt ist. Es sagt
   in einem Satz, warum die Liste kurz ist, und hat den Weg zurück gleich dabei –
   eine gefilterte Liste ohne diese Zeile sieht aus wie ein Datenverlust. */
.cx-bq-bezugband {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin: 0 0 14px; padding: 9px 10px 9px 15px; border-radius: var(--cx-radius-sm);
  background: rgba(30,123,232,.10); border: 1px solid rgba(30,123,232,.32);
  font-size: 13.5px; color: var(--cx-text-muted);
}
.cx-bq-bezugband strong { color: var(--cx-text); font-weight: 600; }
.cx-bq-bezugband button {
  margin-left: auto; border: 1px solid var(--cx-border); background: var(--cx-graphite);
  color: var(--cx-steel); cursor: pointer; border-radius: 99px; padding: 5px 13px;
  font: 600 12.5px/1.4 var(--cx-font-body); white-space: nowrap;
}
.cx-bq-bezugband button:hover { color: var(--cx-text); border-color: var(--cx-blue); }

.cx-bq-zwei { display: grid; grid-template-columns: 326px 1fr; gap: 20px; align-items: start; }
.cx-bq-spalte {
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); overflow: hidden;
}
.cx-bq-liste { max-height: 64vh; overflow: auto; }
.cx-bq-eintrag {
  display: block; width: 100%; text-align: left; border: 0; background: transparent;
  cursor: pointer; padding: 11px 14px; color: var(--cx-text);
  font: 400 14.5px/1.5 var(--cx-font-body);
  border-bottom: 1px solid rgba(139,146,155,.12);
}
.cx-bq-eintrag:hover { background: rgba(30,123,232,.08); }
.cx-bq-eintrag[aria-current="true"] {
  background: rgba(30,123,232,.14); box-shadow: inset 3px 0 0 var(--cx-blue-light);
}
html[data-theme="light"] .cx-bq-eintrag[aria-current="true"] {
  background: rgba(13,80,216,.10); box-shadow: inset 3px 0 0 var(--cx-blue-deep);
}
.cx-bq-ekopf { display: flex; align-items: baseline; gap: 8px; }
.cx-bq-enam { font-weight: 600; }
.cx-bq-ezahl {
  margin-left: auto; font-size: 12.5px; color: var(--cx-steel);
  font-variant-numeric: tabular-nums;
}
/* Anteilsbalken. Blau = genehmigt, Orange = noch nicht – dieselben Töne wie
   bei den Chips. Gemessen gegen das Bett (rgba(139,146,155,.16) auf dem
   Kartengrund): dunkel 6,0 : 1 blau und 6,4 : 1 orange, hell 5,7 : 1 und
   4,7 : 1. Ein gemeinsamer Ton je Rolle geht hier nicht – gegen das fast
   schwarze Bett trägt das helle Blau, gegen das weiße das tiefe. */
.cx-bq-ebett {
  display: flex; height: 5px; border-radius: 3px; margin-top: 7px; overflow: hidden;
  background: rgba(139,146,155,.16);
}
.cx-bq-ebett i { height: 100%; background: var(--cx-blue-light); }
html[data-theme="light"] .cx-bq-ebett i { background: var(--cx-blue-deep); }
.cx-bq-ebett i.cx-bq-eoffen { background: rgb(214,158,95); }
html[data-theme="light"] .cx-bq-ebett i.cx-bq-eoffen { background: rgb(150,92,25); }
/* Was das Haus führt, ohne dass die eigene Firma dort einen Weg hat: Grau,
   weil es keine Rolle trägt. Es ersetzt den Balken nur bei einer Firma ganz
   ohne eigene Bezugswege – sonst stünden zwei Maßstäbe nebeneinander. */
.cx-bq-ebett i.cx-bq-efuehrt { background: var(--cx-steel); }
.cx-bq-erand { display: block; font-size: 12px; color: var(--cx-steel); margin-top: 4px; }

.cx-bq-blatt { padding: 22px 24px; }
.cx-bq-blatt > h2 {
  margin: 0 0 4px; font-size: 21px; display: flex; align-items: center; gap: 12px;
}
.cx-bq-blatt > h2 .cx-intern-badge { margin-left: 0; }
.cx-bq-blatt h3 { margin-top: 22px; }
.cx-bq-blatt > h3:first-of-type { margin-top: 16px; }

@media (max-width: 1080px) {
  .cx-bq-zwei { grid-template-columns: 1fr; }
  .cx-bq-liste { max-height: 340px; }
}
@media (max-width: 620px) {
  .cx-bq-weg { flex-wrap: wrap; }
  .cx-bq-wegkontakt { text-align: left; width: 100%; padding-left: 48px; }
}

/* --- Produktportfolio ------------------------------------------------------
   Zwei Seiten teilen sich diese Bausteine: die Anzeige unter #/portfolio und
   die Pflegemaske unter #/verwaltung/portfolio. Die Karten sind bewusst
   dieselben – wer eingestellt hat, soll das Ergebnis wiedererkennen. */

/* Die Business Unit in der Konto-Karte. Eigene Zeile statt Anhängsel hinter
   der Firma: In 310 px Kartenbreite bricht „Axians · Networks & Solutions ·
   Partner“ ohnehin um, und dann steht die Rolle allein in der zweiten Zeile. */
.cx-konto-einheit {
  display: flex; align-items: baseline; gap: 6px; margin-top: 3px;
  font-size: 11.5px; color: var(--cx-text-muted); min-width: 0;
}
.cx-konto-einheit b { font-weight: 600; color: var(--cx-text); }
.cx-konto-etikett {
  flex: none; font-size: 9.5px; letter-spacing: .05em; text-transform: uppercase;
  color: var(--cx-steel); border: 1px solid var(--cx-border); border-radius: 4px;
  padding: 1px 5px; background: var(--cx-carbon);
}

/* Das Produktportfolio hatte kurzzeitig einen Knopf in der Konto-Karte. Es
   steht jetzt in der Navigationsleiste neben den Bezugsquellen – dort, wo die
   anderen internen Seiten stehen. Die Karte verwaltet das Konto; ein Weg zu
   einer Inhaltsseite gehört nicht hinein. Das flex-wrap bleibt: Es schadet
   nichts und trägt die Knöpfe, sobald einmal ein vierter dazukommt. */
.cx-konto-knoepfe { flex-wrap: wrap; }

/* Hinweis, dass die gezeigte Liste der Firma gehört und nicht der Einheit.
   Ohne ihn hielte ein Konto mit Einheit die geerbte Liste für seine eigene. */
.cx-pf-erbe {
  margin: 24px 0 0; padding: 12px 18px;
  border-radius: var(--cx-radius-sm); font-size: 14px; color: var(--cx-text-muted);
  border: 1px dashed var(--cx-border); background: var(--cx-graphite);
}
.cx-pf-erbe strong { color: var(--cx-text); }

.cx-pf-zahlen {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px;
}
.cx-pf-kachel {
  display: grid; gap: 3px; padding: 16px 18px; border-radius: var(--cx-radius);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-pf-wert {
  font: 700 30px/1 var(--cx-font-display); color: var(--cx-text);
  font-variant-numeric: tabular-nums;
}
.cx-pf-was { font-size: 12.5px; color: var(--cx-steel); }
/* Die Lückenkachel trägt denselben Orangeton wie die offenen Bezugswege.
   Gemessen gegen den Kartengrund: 8,0 : 1 dunkel, 5,5 : 1 hell. Ein einziger
   Farbwert kann beide Gründe nicht bedienen, deshalb zwei. */
.cx-pf-kachel.warn { border-color: rgba(224,169,106,.45); }
.cx-pf-kachel.warn .cx-pf-wert { color: rgb(214,158,95); }
html[data-theme="light"] .cx-pf-kachel.warn { border-color: rgba(150,92,25,.4); }
html[data-theme="light"] .cx-pf-kachel.warn .cx-pf-wert { color: rgb(150,92,25); }

.cx-pf-leiste {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin-bottom: 18px;
}
.cx-pf-leiste input[type="search"] { flex: 1 1 260px; max-width: 420px; margin: 0; }
.cx-pf-treffer { font-size: 13px; color: var(--cx-steel); }
.cx-pf-offen { color: rgb(214,158,95); font-weight: 700; }
html[data-theme="light"] .cx-pf-offen { color: rgb(150,92,25); }
.cx-pf-hinweis { font-size: 14.5px; color: var(--cx-text-muted); margin: 0 0 18px; }

.cx-pf-gruppe { margin-bottom: 26px; }
.cx-pf-gkopf {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding-bottom: 8px; margin-bottom: 12px; border-bottom: 1px solid var(--cx-border);
}
.cx-pf-gkopf > a, .cx-pf-gkopf > span:first-child {
  display: flex; align-items: center; gap: 9px;
  font: 600 16.5px/1.3 var(--cx-font-display); color: var(--cx-text);
}
.cx-pf-gkopf > a:hover { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-pf-gkopf > a:hover { color: var(--cx-blue-deep); }
/* Das Bereichszeichen ist eine 42-px-Kachel; in einer Zeilenüberschrift
   wäre das zu groß und drückte die Zeilenhöhe auseinander. */
.cx-pf-gkopf .cx-bereich-zeichen { width: 30px; height: 30px; border-radius: 8px; }
.cx-pf-gkopf .cx-bereich-zeichen svg { width: 17px; height: 17px; }
.cx-pf-gzahl {
  flex: none; display: flex; align-items: center; gap: 10px;
  font-size: 12.5px; color: var(--cx-steel); font-variant-numeric: tabular-nums;
}
.cx-pf-gzahl b { color: var(--cx-text); font-weight: 600; }
.cx-pf-alle {
  border: 1px solid var(--cx-border); background: var(--cx-graphite);
  color: var(--cx-steel); cursor: pointer; border-radius: 99px; padding: 3px 11px;
  font: 600 12px/1.4 var(--cx-font-body);
}
.cx-pf-alle:hover { color: var(--cx-text); border-color: var(--cx-blue); }

.cx-pf-raster {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(148px, 1fr));
}
/* Dieselben Maße wie die Kacheln der Vergleichsauswahl – es ist dieselbe
   Handlung (einen Hersteller aus dem Katalog greifen) und soll auch so
   aussehen. Als <a> in der Anzeige, als <button> in der Pflege. */
.cx-pf-karte {
  position: relative; display: grid; gap: 5px; justify-items: center;
  padding: 12px 10px 10px; text-align: center;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); color: var(--cx-text);
  font: 400 13px/1.35 var(--cx-font-body);
  transition: border-color .15s ease, transform .15s ease;
}
/* ZWEITE REGEL FÜR HELL, und sie ist nicht redundant: In der Anzeige ist die
   Karte ein <a>. Im hellen Modus gewinnt html[data-theme="light"] a (0,1,2)
   gegen .cx-pf-karte (0,1,0) und färbt jeden Herstellernamen blau – im dunklen
   greift nur das schwächere a und verliert. Ein Unterschied, den man erst
   sieht, wenn man beide Modi nebeneinanderlegt. */
html[data-theme="light"] .cx-pf-karte { color: var(--cx-text); }
.cx-pf-karte.waehlbar { cursor: pointer; }
.cx-pf-karte:hover { border-color: var(--cx-blue); transform: translateY(-1px); }
.cx-pf-karte:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: 2px; }
.cx-pf-karte.an { border-color: var(--cx-blue); box-shadow: 0 0 0 1px var(--cx-blue); }
/* Ungewählte Karten in der Pflege treten zurück – bei 188 Kacheln muss auf
   einen Blick erkennbar sein, was drin ist und was nicht. */
.cx-pf-karte.waehlbar:not(.an) { opacity: .58; }
.cx-pf-karte.waehlbar:not(.an):hover { opacity: 1; }
.cx-pf-platte {
  width: 100%; height: 40px; display: flex; align-items: center; justify-content: center;
  background: #fff; border-radius: 6px; padding: 5px 8px;
}
/* max-height: 30px stand hier fest – und war die Ursache dafür, dass das
   f5-Logo „daneben" aussah: Ein fast quadratisches Zeichen nimmt die vollen
   30 px Höhe und ist trotzdem nur 33 px breit (979 px²), während eine
   Wortmarke wie Microsoft auf 141 × 30 kommt (4.217 px²). Faktor 5,8 bei
   gleich großen Kacheln – gemessen an 34 Herstellern.

   Jetzt deckelt nur noch die Platte, und logoAusgleich() verteilt die FLÄCHE
   gleichmäßig. Ohne JavaScript bleibt es beim alten Verhalten, nur mit den
   vollen 40 px Höhe statt 30. */
.cx-pf-platte img { max-width: 100%; max-height: 100%; object-fit: contain; }
.cx-pf-platte .cx-logo-ersatz {
  font: 700 11px/1.2 var(--cx-font-display); color: #14171C; text-align: center;
}
.cx-pf-name { font-weight: 600; }
.cx-pf-n { font-size: 11.5px; color: var(--cx-steel); }
.cx-pf-bem {
  font-size: 11.5px; color: rgb(214,158,95); font-weight: 600;
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
html[data-theme="light"] .cx-pf-bem { color: rgb(150,92,25); }
.cx-pf-haken {
  position: absolute; top: 6px; right: 7px; width: 17px; height: 17px;
  border-radius: 50%; display: grid; place-items: center;
  background: var(--cx-blue-flaeche); color: #fff; font-size: 10px; font-weight: 700;
  opacity: 0; transform: scale(.7); transition: opacity .12s, transform .12s;
}
.cx-pf-karte.an .cx-pf-haken { opacity: 1; transform: scale(1); }

/* Die Lücken: Bereiche, in denen das Haus gar nichts führt. Kein Fehler,
   sondern eine Vertriebsauskunft – deshalb ruhig gehalten und nicht rot. */
.cx-pf-luecken {
  display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(258px, 1fr));
}
.cx-pf-luecke {
  display: flex; align-items: center; gap: 12px; padding: 13px 16px;
  border-radius: var(--cx-radius-sm); color: var(--cx-text);
  border: 1px dashed rgba(224,169,106,.5); background: rgba(224,169,106,.07);
  font: 400 14px/1.35 var(--cx-font-body);
}
html[data-theme="light"] .cx-pf-luecke {
  border-color: rgba(150,92,25,.45); background: rgba(150,92,25,.06);
}
.cx-pf-luecke:hover { border-style: solid; }
.cx-pf-luecke .cx-bereich-zeichen { width: 34px; height: 34px; border-radius: 9px; }
.cx-pf-luecke .cx-bereich-zeichen svg { width: 19px; height: 19px; }
.cx-pf-luecke-name { flex: 1; font-weight: 600; }
.cx-pf-luecke-n {
  flex: none; font-size: 12px; color: var(--cx-steel);
  font-variant-numeric: tabular-nums;
}

/* --- Pflegemaske ---------------------------------------------------------- */

.cx-pf-ebenen {
  display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  margin-top: 16px;
}
.cx-pf-ebene {
  display: grid; gap: 3px; text-align: left; cursor: pointer; padding: 13px 16px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); color: var(--cx-text);
  font-family: var(--cx-font-body); transition: border-color .15s;
}
.cx-pf-ebene:hover { border-color: var(--cx-blue); }
.cx-pf-ebene.an {
  border-color: var(--cx-blue); box-shadow: 0 0 0 1px var(--cx-blue);
  background: rgba(30,123,232,.10);
}
html[data-theme="light"] .cx-pf-ebene.an { background: rgba(13,80,216,.07); }
.cx-pf-ename { font: 600 15px/1.3 var(--cx-font-display); }
.cx-pf-esub { font-size: 12px; color: var(--cx-steel); }
.cx-pf-ezahl {
  margin-top: 4px; font-size: 12.5px; color: var(--cx-text-muted);
  font-variant-numeric: tabular-nums;
}
.cx-pf-ezahl em {
  font-style: normal; color: var(--cx-steel); font-size: 11.5px;
}

.cx-pf-kopf {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap; margin-bottom: 6px;
}
.cx-pf-kopf h2 { margin: 0; }
.cx-pf-aktionen { display: flex; gap: 8px; flex: none; }
.cx-pf-aktionen .cx-btn:disabled, .cx-pf-aktionen .cx-btn-secondary:disabled {
  opacity: .4; cursor: default; transform: none;
}

.cx-pf-bemliste { display: grid; gap: 8px; }
.cx-pf-bemzeile {
  display: grid; grid-template-columns: 210px 1fr; gap: 12px; align-items: center;
}
.cx-pf-bemname { font-size: 14px; font-weight: 600; color: var(--cx-text); }
.cx-pf-bemzeile input { margin: 0; }

/* --- Teilen-Schalter und Hausansicht (1.144.0) -----------------------------
   Eine Gesellschaft gibt ihre Liste für die Schwestern derselben Firma frei.
   Der Schalter steht in der Pflegemaske, das Ergebnis unter #/portfolio.

   ZU DEN FARBEN: --cx-blue-light ist im hellen Modus NICHT umdefiniert und
   erreicht dort auf Weiß nur 2,52:1 (siehe 1.143.1). Alles, was hier Text
   trägt, nimmt deshalb entweder --cx-accent (im hellen Modus auf Petrol
   umdefiniert) oder --cx-blue-deep. */
.cx-pf-teilen {
  display: flex; gap: 16px; align-items: flex-start; flex-wrap: wrap;
  margin-top: 16px; padding: 15px 18px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm);
}
.cx-pf-teilen-txt { flex: 1 1 320px; }
.cx-pf-teilen-txt b { font-size: 15px; color: var(--cx-text); }
.cx-pf-teilen-txt p { margin: 4px 0 0; font-size: 13.5px; color: var(--cx-steel); }
.cx-pf-teilen-txt strong { color: var(--cx-text-muted); }

/* Der Schalter selbst. Bewusst mit WORT daneben: Ein Kippschalter allein sagt
   nicht, ob er den Zustand zeigt oder die Handlung anbietet. */
.cx-schalter {
  display: inline-flex; align-items: center; gap: 10px; flex: none;
  background: none; border: 0; padding: 0; cursor: pointer;
  font: inherit; color: var(--cx-text);
}
.cx-schalter:disabled { opacity: .45; cursor: default; }
.cx-schalter-bahn {
  width: 46px; height: 26px; border-radius: 999px; flex: none; position: relative;
  background: var(--cx-border); border: 1px solid var(--cx-border);
  transition: background .16s, border-color .16s;
}
.cx-schalter-bahn::after {
  content: ''; position: absolute; top: 2px; left: 2px; width: 20px; height: 20px;
  border-radius: 50%; background: var(--cx-steel);
  transition: transform .16s, background .16s;
}
.cx-schalter.an .cx-schalter-bahn {
  background: var(--cx-blue-knopf); border-color: var(--cx-blue-knopf);
}
.cx-schalter.an .cx-schalter-bahn::after { transform: translateX(20px); background: #fff; }
.cx-schalter-wort { font-size: 14px; font-weight: 600; min-width: 96px; text-align: left; }
.cx-schalter:focus-visible { outline: 2px solid var(--cx-blue-knopf); outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) {
  .cx-schalter-bahn, .cx-schalter-bahn::after { transition: none; }
}

/* Die Umschaltgruppe A–Z / nach Bereichen in der Anhakleiste (1.145.0).
   Sie steht zwischen Suchfeld und Zähler und bleibt auch dann bedienbar, wenn
   die Leiste umbricht. */
.cx-pf-sort { display: flex; gap: 6px; flex: none; }

/* --- Was das Haus führt --- */
.cx-pfh-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
}
.cx-pfh-kopf h2 { margin: 0; }
.cx-pfh-schalter { display: flex; gap: 8px; flex: none; }

.cx-pfh-karten {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr));
  gap: 14px; margin-top: 16px;
}
.cx-pfh-karte {
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); padding: 15px 17px;
}
.cx-pfh-karte.meine { border-color: var(--cx-blue-knopf); }
/* ZWEI FESTE ZEILEN FÜR DEN NAMEN (1.158.1). Vorher standen Name, Zahl und
   Etiketten in EINER umbrechenden Zeile. „Axians Networks & Solutions GmbH"
   brauchte davon zwei, schob Zahl und Etikett in eine dritte – und damit begann
   das Logoband dieser Karte 26 px tiefer als bei den Nachbarn: eine Karte im
   Raster, die aus der Reihe fällt. Jetzt bekommt der Name die volle Breite
   (flex-basis 100 %) und IMMER die Höhe von zwei Zeilen, auch wenn er nur eine
   braucht; Zahl und Etiketten stehen darunter und liegen dadurch in jeder Karte
   auf derselben Linie. Gemessen an den sechs Axians-Gesellschaften, Abstand von
   der Kartenoberkante bis zum Logoband: vorher 84/84/84/110 px, jetzt 97 überall.
   Der Preis sind 13 px Höhe je Karte – billiger als die Unruhe. */
.cx-pfh-kkopf { display: flex; align-items: baseline; gap: 6px 9px; flex-wrap: wrap; }
.cx-pfh-kkopf b {
  font-size: 16px; font-family: var(--cx-font-display);
  flex: 1 1 100%; line-height: 1.3; min-height: 2.6em;
}
.cx-pfh-n {
  font-size: 13px; font-weight: 700; color: var(--cx-accent);
  font-variant-numeric: tabular-nums;
}
.cx-pfh-etikett {
  font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; font-weight: 700;
  border: 1px solid var(--cx-border); border-radius: 999px; padding: 2px 9px;
  color: var(--cx-steel);
}
.cx-pfh-etikett.ich { color: var(--cx-blue-deep); border-color: rgba(13,80,216,.35); }
html[data-theme="dark"] .cx-pfh-etikett.ich,
html:not([data-theme]) .cx-pfh-etikett.ich {
  color: var(--cx-blue-light); border-color: rgba(63,169,255,.4);
}
.cx-pfh-etikett.geteilt { color: var(--cx-accent); border-color: currentColor; }
.cx-pfh-zu { margin: 9px 0 0; font-size: 13.5px; color: var(--cx-steel); }
.cx-pfh-zu strong { color: var(--cx-text-muted); }
.cx-pfh-liste {
  margin: 10px 0 0; padding: 0; list-style: none;
  display: flex; flex-wrap: wrap; gap: 6px;
}
.cx-pfh-liste li {
  font-size: 12.5px; background: var(--cx-graphite);
  border: 1px solid var(--cx-border); border-radius: 999px; padding: 3px 10px;
}
.cx-pfh-liste li.mehr { color: var(--cx-steel); border-style: dashed; }

/* Die Umkehrung: Zeilen sind Hersteller, Spalten Gesellschaften. Bei fünf
   Gesellschaften wird das breit – deshalb scrollt die Tabelle in sich selbst
   und nicht die ganze Seite. */
.cx-pfh-tabwrap { overflow-x: auto; margin-top: 12px; }
.cx-pfh-tab { width: 100%; border-collapse: collapse; font-size: 14.5px; }
.cx-pfh-tab th, .cx-pfh-tab td {
  text-align: left; padding: 9px 12px; border-bottom: 1px solid var(--cx-border);
}
.cx-pfh-tab th {
  font-size: 12px; letter-spacing: .07em; text-transform: uppercase;
  color: var(--cx-steel); font-weight: 700; white-space: nowrap;
}
.cx-pfh-tab td.mit, .cx-pfh-tab th.mit { text-align: center; }
.cx-pfh-therbt {
  display: block; font-size: 10px; letter-spacing: .06em; font-weight: 600;
  color: var(--cx-steel); text-transform: none;
}
.cx-pfh-tab tbody tr:hover { background: rgba(30,123,232,.07); }
.cx-pfh-ja { color: var(--cx-accent); font-weight: 800; }
/* Der Strich sagt „führt nicht" und soll nicht schreien – aber lesbar bleiben:
   --cx-border erreicht gegen die Fläche nur 1,2:1, --cx-steel dagegen 4,6:1. */
.cx-pfh-nein { color: var(--cx-steel); }
.cx-pfh-unbekannt { color: var(--cx-steel); font-weight: 700; cursor: help; }

/* ===== 1.147.0 – Logos statt Namensschnipsel ==============================

   STEFANS BEFUND: „Zwar schön, dass ich die Gesellschaften sehe, aber ich sehe
   nicht alle Hersteller." Die Karte zeigte acht Namen und dann „+ 34 weitere".
   Jetzt steht dort ein LOGOBAND mit allen – und wo es zu viel wird, scrollt
   die Karte in sich selbst, nicht die Seite.

   Warum Logos und nicht mehr Namen: Ein Herstellerlogo erkennt man im
   Vorbeigehen, einen Namen muss man lesen. Bei 43 Einträgen ist das der
   Unterschied zwischen einem Blick und einer Minute. */
.cx-pfh-band {
  /* 80 px und nicht 62: Bei 62 blieben nur 50 px Innenbreite, und eine sehr
     breite Wortmarke (ThreatLocker steht bei 11:1) bekam davon 50 × 4,5 px –
     Fläche 226 gegen 901 beim quadratischen Nachbarn, also Faktor 2,9 trotz
     Ausgleich. Hier begrenzt die BREITE, nicht die Höhe; der einzige Hebel ist
     die Zelle. Mit 80 px sinkt die Spanne auf 1,3, und das Band scrollt dafür
     ein paar Zeilen mehr – was es ohnehin tut. */
  display: grid; gap: 6px; grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
  margin-top: 11px;
  /* Die Karte scrollt, nicht die Seite: Bei 43 Herstellern wären das sonst
     acht Zeilen Logos, und die Karte daneben stünde halb leer. */
  max-height: 236px; overflow-y: auto; padding-right: 4px;
}
/* Dasselbe weiße Plättchen wie überall sonst im Katalog – viele Logos sind
   für hellen Grund gezeichnet und verschwinden sonst im dunklen Modus. */
.cx-pfh-bl {
  height: 34px; background: #fff; border-radius: 6px;
  display: grid; place-items: center; padding: 4px 6px;
}
/* max-height in PIXELN, nicht in Prozent. Ein zentriertes Bild in einem Grid
   mit place-items:center hat keine aufgelöste Bezugshöhe – die Prozentangabe
   wird dann stillschweigend ignoriert, und das Bild wächst über die Platte
   hinaus. Sichtbar wurde das in der Tabelle darunter (siehe .cx-pfh-hplatte);
   hier hielt bisher nur logoAusgleich() dagegen, und zwar erst NACH dem Laden
   des Bildes. */
.cx-pfh-bl img { max-width: 100%; max-height: 26px; object-fit: contain; }
html[data-theme="light"] .cx-pfh-bl { border: 1px solid var(--cx-border); }

/* --- Bänder statt Karten (1.164.0) ---------------------------------------
   Sechs Karten nebeneinander, jede mit eigenem Scrollbalken, waren Stefans
   Befund: „unübersichtlich zum Thema: Welche Hersteller haben meine anderen
   BUs?" Jetzt liegt je Gesellschaft ein BAND untereinander, gebaut aus
   denselben Teilen wie der Marktplan im Bereich (.cx-fk-*). Hier stehen nur
   die Ergänzungen – Zeilenraster, Balken, Logostreifen und Pfeil kommen von
   dort und bleiben damit automatisch in Form. */
.cx-pfh-werkzeug {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 14px;
}
.cx-pfh-rechts { margin-left: auto; display: flex; gap: 8px; }
.cx-pfh-baender {
  --bf: var(--cx-band0); margin-top: 12px;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite); overflow: hidden;
}
/* Die eigene Gesellschaft ist der Maßstab, an dem die anderen gelesen werden –
   ein Streifen an der Kante sagt das, ohne eine weitere Farbe in die Zeile zu
   tragen. Das Etikett „meine" steht ohnehin daneben. */
.cx-pfh-meine { box-shadow: inset 3px 0 0 var(--cx-blue-knopf); }
/* Wer nichts zeigt, lässt sich nicht aufklappen: kein Zeiger, blasser Pfeil. */
.cx-pfh-still .cx-fk-kopf { cursor: default; }
.cx-pfh-still .cx-fk-pfeil { opacity: .25; }
.cx-pfh-marken { display: inline-flex; gap: 5px; margin-left: 9px; vertical-align: middle; }
.cx-pfh-satz { padding: 0 20px 12px; margin: 0; }
/* Aufgeklappt stehen dieselben Karten wie im Bereich (.cx-fk-karte) – hier
   braucht es nur die Rücknahme für das, was die eigene Gesellschaft ohnehin
   führt. Übrig bleibt sichtbar, was man sich holen könnte. */
.cx-fk-karte.cx-pfh-auch { opacity: .45; }
.cx-fk-karte.cx-pfh-auch:hover { opacity: 1; }

/* ===== 1.167.0 – Die Auswertung ==========================================

   Dritte Ansicht neben Bändern und Matrix. Tragend ist, was es schon gibt:
   das Kennzahlenband der Startseite (.cx-kpi-*), die Tabelle des
   Hausportfolios (.cx-pfh-tab), die Werkzeugleiste (.cx-pfh-werkzeug) und die
   Herstellerkarten des Marktplans (.cx-fk-karte). Hier steht nur, was
   dazukommt – im Wesentlichen die Zellenfärbung und zwei Listenformen. */
.cx-pfa-kopf { display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap; }
.cx-pfa-kopf .cx-pflege-hilfe { flex: 1 1 340px; margin: 0; }
.cx-pfa-kpi { margin: 16px 0 10px; }
/* Was aus der Rechnung herausfällt, steht direkt unter den Zahlen – nicht am
   Seitenende, wo es niemand mit ihnen zusammenbringt. */
.cx-pfa-fussnote {
  margin: 0; font-size: 13px; line-height: 1.55; color: var(--cx-steel); max-width: 90ch;
}
.cx-pfa-block { margin-top: 28px; }
.cx-pfa-block > h3 { margin: 0 0 4px; font-size: 17px; }

/* --- Bereiche als Kreuztabelle --- */
/* 99 % auf die erste Spalte: Damit nimmt sie allen Platz, der übrig bleibt,
   und die Zahlenspalten ziehen sich auf ihren Inhalt zusammen. Ohne das
   verteilt die Tabelle gleichmäßig – bei drei Ebenen stünde eine einstellige
   Zahl mitten in einer 180 px breiten Zelle. */
.cx-pfa-tab th:first-child, .cx-pfa-tab td:first-child { width: 99%; }
.cx-pfa-tab td:first-child { color: var(--cx-text); font-weight: 600; min-width: 200px; }
.cx-pfa-tab th.cx-pfa-ich, .cx-pfa-tab td.cx-pfa-ich { background: rgba(30,123,232,.07); }
.cx-pfa-tab th.cx-pfa-ich { color: var(--cx-blue-light); }
.cx-pfa-tab tr.cx-pfa-luecke td:first-child { color: var(--cx-warn); }
.cx-pfa-tab td { padding: 5px 12px; }
.cx-pfa-markt {
  display: block; font-size: 11.5px; font-weight: 400; color: var(--cx-warn); margin-top: 1px;
}
/* Die Zelle ist ein Knopf, weil hinter jeder Zahl eine Liste steckt.
   DIE STUFEN SIND FEST und nicht je Zeile skaliert: Zuerst waren sie relativ
   zum Zeilenmaximum – dann bekam „CRM: 1 Hersteller" denselben kräftigen Ton
   wie „Netzwerk & Firewall: 18", weil 1 dort das Maximum war. Farbe wird über
   die ganze Tabelle hinweg verglichen, also muss sie überall dasselbe heißen. */
.cx-pfa-z {
  display: inline-grid; place-items: center; width: 38px; height: 28px; border: 0;
  border-radius: 8px; font: 600 14px/1 var(--cx-font-body); color: var(--cx-text);
  background: transparent; cursor: pointer; font-variant-numeric: tabular-nums;
}
.cx-pfa-z:hover { outline: 1px solid var(--cx-blue); }
.cx-pfa-z:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: 1px; }
.cx-pfa-z.s1 { background: rgba(30,123,232,.12); }
.cx-pfa-z.s2 { background: rgba(30,123,232,.22); }
.cx-pfa-z.s3 { background: rgba(30,123,232,.34); }
.cx-pfa-z.s4 { background: rgba(30,123,232,.46); }
.cx-pfa-z.haus { font-weight: 800; }
.cx-pfa-z.an { outline: 2px solid var(--cx-blue); outline-offset: 1px; }
/* Der Strich sagt „führt nicht" und soll nicht schreien – aber lesbar
   bleiben: --cx-border erreicht gegen die Fläche nur 1,2:1, --cx-steel 4,6:1. */
.cx-pfa-z.null { color: var(--cx-steel); cursor: default; font-weight: 400; }

/* --- Bereiche als Balken --- */
.cx-pfa-legende { margin: 12px 0 2px; font-size: 12.5px; color: var(--cx-steel); }
.cx-pfa-legende strong { color: var(--cx-text); }
.cx-pfa-balken { margin-top: 10px; }
.cx-pfa-bz { display: flex; align-items: center; gap: 12px; padding: 2px 0; }
.cx-pfa-bname {
  flex: 0 0 300px; text-align: left; background: transparent; border: 0; padding: 4px 6px;
  border-radius: 7px; font: 600 13.5px/1.35 var(--cx-font-body); color: var(--cx-text);
  cursor: pointer;
}
.cx-pfa-bname:hover { background: rgba(30,123,232,.10); }
.cx-pfa-bname:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: -2px; }
.cx-pfa-bname.an { background: rgba(30,123,232,.16); }
.cx-pfa-bz.cx-pfa-luecke .cx-pfa-bname { color: var(--cx-warn); cursor: default; }
.cx-pfa-bname small {
  display: block; font-weight: 400; font-size: 11.5px; color: var(--cx-warn);
}
.cx-pfa-bspur { flex: 1; height: 15px; min-width: 0; display: block; }
.cx-pfa-bhaus {
  display: block; height: 100%; border-radius: 4px; background: rgba(30,123,232,.42);
}
.cx-pfa-bmeine {
  display: block; height: 100%; border-radius: 4px; background: var(--cx-blue-flaeche);
}
/* Eine Lücke bekommt KEINEN Balken über die volle Breite – der sähe aus wie
   ein voller. Eine gestrichelte Grundlinie sagt „hier ist die Zeile, und sie
   ist leer", ohne eine Größe zu behaupten. */
.cx-pfa-bnichts {
  display: block; height: 100%; border-bottom: 1px dashed var(--cx-warn);
}
.cx-pfa-bzahl {
  flex: 0 0 46px; text-align: right; font-size: 13px; color: var(--cx-text);
  font-variant-numeric: tabular-nums;
}

/* --- die aufgeschlagene Zelle --- */
.cx-pfa-detail {
  margin-top: 14px; border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 14px 16px; background: var(--cx-carbon);
}
.cx-pfa-dkopf { display: flex; align-items: center; gap: 12px; }
.cx-pfa-dkopf h4 { margin: 0; font-size: 15px; flex: 1; }
.cx-pfa-zu { flex: none; }
.cx-pfa-detail > p { margin: 2px 0 12px; font-size: 12.5px; color: var(--cx-steel); }

/* --- Block 3: was die eigene Ebene nicht führt --- */
.cx-pfa-lz {
  display: flex; align-items: flex-start; gap: 14px; flex-wrap: wrap;
  padding: 11px 0; border-bottom: 1px solid var(--cx-border);
}
.cx-pfa-lz:last-child { border-bottom: 0; }
.cx-pfa-lname { flex: 1 1 260px; }
.cx-pfa-lname b { display: block; font-size: 14.5px; color: var(--cx-text); }
.cx-pfa-lname small {
  display: block; font-size: 12.5px; color: var(--cx-steel); line-height: 1.5;
}
.cx-pfa-traeger { display: flex; flex-wrap: wrap; gap: 6px; flex: 2 1 360px; }
.cx-pfa-traeger span {
  font-size: 12.5px; padding: 3px 9px; border-radius: 99px; border: 1px solid var(--cx-border);
  color: var(--cx-text-muted); white-space: nowrap;
}
.cx-pfa-traeger span i { font-style: normal; color: var(--cx-steel); }
.cx-pfa-traeger span.keine { color: var(--cx-warn); border-color: currentColor; }

@media (max-width: 760px) {
  .cx-pfa-bname { flex-basis: 150px; }
  .cx-pfa-bzahl { flex-basis: 34px; }
}

/* Die Namen hinter der vierten Kennzahl. Fließtext statt Kachelraster: Ein
   Dutzend Namen liest man in einer Zeile schneller als in zwölf Plättchen. */
.cx-pfa-gemeinsam {
  margin: 0 0 8px; font-size: 13.5px; line-height: 1.6; color: var(--cx-text-muted);
  max-width: 100ch;
}
.cx-pfa-gemeinsam strong { color: var(--cx-text); }

/* ===== Das Blatt gegen die Website abschirmen (1.173.2) ==================
   Styleguide.css färbt zwei Elemente pauschal, ohne Klasse:
   `p { color: var(--cx-text-muted) }` und `a { color: var(--cx-blue-light) }`.
   Eine Regel auf dem Element schlägt jede VERERBUNG – `.cx-blatt { color:
   #14171C }` kommt an einem <p> also nie an, so hoch die Spezifität des
   Blattes auch ist. Auf weißem Papier stand der Fließtext damit in der
   Textfarbe für DUNKLEN Grund: #B9BFC7 auf Weiß sind 1,85:1. Im hellen Modus
   fiel es nicht auf (#3C4550, 9,73:1) – der Fehler hing am Anzeigemodus der
   Website, nicht am Blatt. Gefunden am 25.09.2026 an der Entscheidungsvorlage.

   `inherit` statt einer festen Farbe: Die Zeile führt nichts Neues ein, sie
   stellt nur den Normalfall wieder her – auf dem Blatt erbt ein Absatz seine
   Farbe vom Umfeld wie jedes andere Element auch.

   DIESE ZEILE MUSS VOR ALLEN BLATT-KLASSENREGELN STEHEN. Sie hat dieselbe
   Spezifität (0,1,0) wie .cx-bc-atext oder .cx-ev-nutzen; bei Gleichstand
   gewinnt die spätere Regel. Steht sie vorn, darf jede Klasse sie
   überschreiben – steht sie hinten, überfährt sie der Reihe nach alles. */
.cx-blatt :where(p, a) { color: inherit; }

/* ===== 1.167.0 – Das Blatt der Auswertung ================================
   Feste Farben, keine Variablen: Das Blatt ist weiß, im hellen wie im
   dunklen Modus, und muss auf Papier stimmen. Maße in Millimetern, wie beim
   Portfolio-Blatt – was hier in Pixeln stünde, wäre beim Drucken raten. */
.cx-bl-inhalt {
  flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 5mm; padding-top: 5mm;
}
.cx-bl-kpi { flex: none; display: flex; gap: 3mm; }
.cx-bl-kpi > div {
  flex: 1; border: .3mm solid #D9DEE7; border-radius: 2.5mm; padding: 3.4mm 2.5mm;
  text-align: center;
}
.cx-bl-kpi b {
  display: block; font: 700 7.6mm/1 var(--cx-font-display); color: #0B0E14;
}
.cx-bl-kpi span {
  display: block; margin-top: 1.6mm; font-size: 2.9mm; line-height: 1.3; color: #55606F;
}
.cx-bl-tab {
  width: 100%; border-collapse: collapse; table-layout: fixed; font-size: 3.2mm; color: #14171C;
}
.cx-bl-tab.eng { font-size: 2.9mm; }
/* ZEILENHÖHE AUSGERECHNET, NICHT GESCHÄTZT – ZWEIMAL.

   Erster Anlauf: ohne feste Zeilenhöhe kam eine Zeile auf 9,5 mm, 22 Bereiche
   auf 217,8 mm. Ein Blatt kann nicht scrollen, also schob sich die Tabelle
   über die Fußzeile – sichtbar erst beim Nachmessen, nicht im Bild.

   Zweiter Anlauf: Mit der Liste „diese Hersteller führen alle" darüber
   (1.167.1) wurde es wieder zu eng, Unterkante 280,1 mm gegen eine Fußzeile
   ab 277,9 mm. Die Rechnung steht jetzt hier, damit der nächste Zusatz sie
   nachrechnen kann: 228 mm Inhaltshöhe, davon 24 für das Kennzahlenband,
   10 für zwei Abstände und bis zu 20 für die Namensliste in ihrer längsten
   Fassung (Überschrift plus drei Zeilen, bei 24 Namen) – bleiben 174 mm für
   23 Tabellenzeilen, also höchstens 7,5 mm je Zeile. Bei 0,85 mm
   Innenabstand und 1,25 Zeilenhöhe sind es 7,2 mm. */
.cx-bl-tab th, .cx-bl-tab td {
  padding: .85mm 1mm; line-height: 1.25; border-bottom: .2mm solid #E4E8EE;
  text-align: center;
}
.cx-bl-tab th {
  font-size: 2.7mm; line-height: 1.2; color: #55606F; font-weight: 700; vertical-align: bottom;
  padding-bottom: 2mm; border-bottom-color: #C3CAD4;
}
.cx-bl-tab th:first-child, .cx-bl-tab td:first-child { text-align: left; }
.cx-bl-tab td:first-child { font-weight: 600; }
.cx-bl-tab td.zahl { font-variant-numeric: tabular-nums; }
.cx-bl-tab td.haus { font-weight: 700; }
/* Der Strich für „führt hier niemand“. Blass, aber lesbar: #9AA3AE brachte
   auf Papier nur 2,55:1 und verschwand im Laserdruck – #6B7280 ist derselbe
   Nebenton wie Kopf- und Fußzeile und schafft 4,83:1 (1.173.2). */
.cx-bl-tab .leer { color: #6B7280; }
.cx-bl-tab tr.luecke td:first-child { color: #8A5A00; }
.cx-bl-tab .markt { font-weight: 400; font-size: 2.6mm; color: #8A5A00; }
/* Dieselben vier Stufen wie am Bildschirm, nur auf Papier abgestimmt: Die
   dunkelste muss schwarze Schrift noch tragen, die hellste im Laserdruck
   überhaupt sichtbar bleiben. */
.cx-bl-zelle {
  display: inline-block; min-width: 7mm; padding: .5mm 1mm; border-radius: 1.2mm;
}
.cx-bl-zelle.s1 { background: #EDF4FD; }
.cx-bl-zelle.s2 { background: #D7E7FA; }
.cx-bl-zelle.s3 { background: #BBD5F5; }
.cx-bl-zelle.s4 { background: #9CC2F0; }
.cx-bl-gem { flex: none; }
.cx-bl-gem h2 {
  margin: 0 0 1.4mm; font: 700 3.9mm/1.25 var(--cx-font-display); color: #0B0E14;
  border: 0; padding: 0;
}
.cx-bl-gem p { margin: 0; font-size: 3.2mm; line-height: 1.45; color: #343C47; }
.cx-bl-gem em { font-style: normal; color: #6B7280; }

.cx-bl-hinweis {
  flex: none; margin: 3mm 0 0; font-size: 2.9mm; line-height: 1.4; color: #6B7280;
}
.cx-bl-vorspann { margin: 0; font-size: 3.4mm; line-height: 1.45; color: #4C5563; }
.cx-bl-lz {
  display: flex; align-items: baseline; gap: 5mm; padding: 2.6mm 0;
  border-bottom: .2mm solid #E4E8EE;
}
.cx-bl-lname { flex: 1 1 60mm; }
.cx-bl-lname b { display: block; font-size: 3.6mm; color: #14171C; }
.cx-bl-lname small { display: block; font-size: 2.9mm; color: #6B7280; line-height: 1.35; }
.cx-bl-ltraeger { flex: 1 1 80mm; display: flex; flex-wrap: wrap; gap: 1.6mm; }
.cx-bl-ltraeger span {
  font-size: 2.9mm; padding: .6mm 2.2mm; border-radius: 99mm; border: .2mm solid #D9DEE7;
  color: #4C5563; white-space: nowrap;
}
/* Die Zahl im Träger-Plättchen: bewusst blasser als der Name daneben
   (#4C5563), aber nicht unter der Schwelle – 3,84:1 wurden 4,83:1 (1.173.2). */
.cx-bl-ltraeger span i { font-style: normal; color: #6B7280; }
.cx-bl-ltraeger span.keine { color: #8A5A00; border-color: currentColor; }

/* --- Das Logo in der Tabellenzeile --- */
.cx-pfh-hz { display: flex; align-items: center; gap: 10px; }
.cx-pfh-hplatte {
  width: 78px; height: 30px; flex: none; background: #fff; border-radius: 6px;
  display: grid; place-items: center; padding: 3px 6px;
}
/* DER F5-FEHLER, ZWEITE AUFLAGE (1.149.1). In 1.148.0 habe ich den
   Flächenausgleich an drei Stellen eingebaut und diese vierte übersehen –
   ausgerechnet die Tabelle, in der die Logos untereinander stehen und ein
   Ausreißer am stärksten auffällt. Gemessen an 37 Zeilen: fünf Logos ragten
   aus ihrer Platte heraus, Apple um 62,8 px und f5 um 38,6 px, und die
   Flächenspanne lag bei 13,6.

   Zwei Ursachen, beide behoben: `max-height: 100%` greift hier nicht, weil
   ein zentriertes Grid-Item keine aufgelöste Bezugshöhe hat – deshalb jetzt
   30 px in Pixeln. Und der Ausgleich fehlte – er steht jetzt in
   pfHausBedienung(). */
.cx-pfh-hplatte img { max-width: 100%; max-height: 30px; object-fit: contain; }
html[data-theme="light"] .cx-pfh-hplatte { border: 1px solid var(--cx-border); }

/* Gefüllte Felder statt freistehender Zeichen: Ein Haken in einer leeren Zelle
   sieht aus wie ein Staubkorn, sobald die Tabelle vier Spalten breit ist. */
.cx-pfh-zelle {
  display: inline-grid; place-items: center; width: 26px; height: 26px;
  border-radius: 7px; font-size: 14px;
}
.cx-pfh-zelle.ja { background: rgba(30,123,232,.18); color: var(--cx-blue-light); font-weight: 700; }
html[data-theme="light"] .cx-pfh-zelle.ja { background: rgba(13,80,216,.13); color: var(--cx-blue-deep); }
.cx-pfh-zelle.nein  { color: var(--cx-steel); }
.cx-pfh-zelle.frage { color: var(--cx-steel); font-weight: 700; border: 1px dashed var(--cx-border); }

/* Zeilen, die MEHR ALS EINE Gesellschaft führt – im Termin sind genau das die
   interessanten. Die Tönung ist absichtlich schwach: --cx-steel liegt im
   hellen Modus bei 4,79:1 gegen Weiß und hat nur 0,29 Luft bis zur Schwelle;
   bei rgba(13,80,216,.025) bleiben 4,71:1. */
.cx-pfh-tab tbody tr.mehrere td { background: rgba(30,123,232,.06); }
html[data-theme="light"] .cx-pfh-tab tbody tr.mehrere td { background: rgba(13,80,216,.025); }

/* --- Die Auswahl am PDF-Knopf ---

   SEIT 1.148.0 EIN FENSTER, KEIN KLAPPMENÜ. Stefans Befund zur ersten
   Fassung: „Nein, das gefällt mir nicht mit der Ansicht des PDFs. Ich würde
   gern folgende Regelung haben: Wenn ich als PDF drucke, geht ein kleines
   Fenster auf, wo man dann die Auswahl machen kann."

   Er hat recht, und der Grund ist im Bildschirmausschnitt zu sehen: Das Menü
   hing über dem Raster und verdeckte sechs Herstellerkacheln. Ein <dialog>
   legt sich mit eigenem Hintergrund über die Seite, fängt die Tastatur ein und
   schließt mit Escape – dasselbe Bauteil wie bei „Passwort vergessen" und der
   Sichtprobe. */
/* DAS „DISPLAY" GILT NUR IM GEÖFFNETEN ZUSTAND – sonst steht das Fenster für
   immer da. Stefan am 15.09.2026: „Wenn ich das PDF bei dem Portfolio
   anfordern möchte, dann bleibt, wenn ich die kompakte Startseite wieder lade,
   unten das Auswahlmenü für das PDF hängen."

   Ein geschlossenes <dialog> blendet der Browser über seine eigene Regel
   `dialog:not([open]) { display: none }` aus. Die steht im
   USER-AGENT-Stylesheet, und jede Autorenregel schlägt sie – unabhängig von
   der Spezifität, denn die Kaskade entscheidet erst nach Ursprung. Ein
   schlichtes `display: grid` auf der Klasse hat sie also stillschweigend außer
   Kraft gesetzt. Gemessen: nach dem ersten Öffnen stand das GESCHLOSSENE
   Fenster (open = false) mit 582 px Höhe als letztes Kind von <body> unter
   jeder weiteren Seite. Auf der langen Portfolioseite blieb es unter dem
   Rand verborgen, auf der kurzen Startseite war es sofort zu sehen. */
.cx-pf-pdfdialog { width: min(520px, calc(100vw - 32px)); gap: 6px; }
.cx-pf-pdfdialog[open] { display: grid; }
.cx-pf-pdfdialog h2 { margin: 0; }
.cx-pf-pdfdialog > p.cx-dialog-meldung { margin: 0 0 6px; color: var(--cx-text-muted); }
.cx-pf-pdfkopf {
  font-size: 11px; letter-spacing: .07em; text-transform: uppercase; font-weight: 700;
  color: var(--cx-steel); padding: 4px 8px 2px;
}
.cx-pf-pdfw {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  padding: 9px 11px; border-radius: 9px; border: 1px solid var(--cx-border);
  background: var(--cx-carbon); color: var(--cx-text); cursor: pointer;
  font: 400 13.5px/1.4 var(--cx-font-body);
}
.cx-pf-pdfw:hover:not(:disabled) { border-color: var(--cx-blue); }
.cx-pf-pdfw:disabled { opacity: .45; cursor: not-allowed; }
.cx-pf-pdfw .wer { flex: 1; }
.cx-pf-pdfw .zahl { color: var(--cx-steel); font-size: 12.5px; font-variant-numeric: tabular-nums; }
/* Das ganze Haus ist die neue Möglichkeit und darf sich das ansehen lassen. */
.cx-pf-pdfw.haus { border-color: var(--cx-blue); background: rgba(30,123,232,.08); }
html[data-theme="light"] .cx-pf-pdfw.haus { background: rgba(13,80,216,.06); }
/* Auf der getönten Zeile trägt --cx-steel nicht mehr (4,21:1), und die Zahl
   ist hier ohnehin eine Auskunft und kein Beiwerk. */
.cx-pf-pdfw.haus .zahl { color: var(--cx-text); font-weight: 700; }
.cx-pf-pdftrenn { height: 1px; background: var(--cx-border); margin: 6px 2px 3px; }
.cx-pf-pdfhilfe {
  font-size: 12.5px; color: var(--cx-steel); padding: 4px 2px 0; line-height: 1.5;
  margin: 0;
}
.cx-pf-pdfdialog .cx-dialog-knoepfe { margin-top: 10px; justify-content: flex-end; }

@media (max-width: 620px) {
  .cx-pfh-karten { grid-template-columns: 1fr; }
  /* Eine Spalte: Es gibt keine Nachbarkarte, an der etwas auszurichten wäre –
     die zweite Namenszeile wäre hier nur Leerraum. */
  .cx-pfh-kkopf b { min-height: 0; }
  .cx-pfh-kopf { flex-direction: column; align-items: stretch; }
  .cx-pfh-schalter .cx-bq-filter { flex: 1; }
}

@media (max-width: 900px) {
  .cx-pf-zahlen { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 620px) {
  .cx-pf-raster { grid-template-columns: repeat(auto-fill, minmax(124px, 1fr)); }
  .cx-pf-bemzeile { grid-template-columns: 1fr; gap: 4px; }
  .cx-pf-kopf { flex-direction: column; align-items: stretch; }
  .cx-pf-aktionen .cx-btn, .cx-pf-aktionen .cx-btn-secondary { flex: 1; }
}

/* --- Nachrichten in der Verwaltung (1.63.0) --------------------------------
   Das Formular steht als Raster, nicht als Spalte: „An wen" und der Empfänger
   gehören nebeneinander, denn sie sind EINE Angabe in zwei Schritten. Text und
   Datum darunter über die ganze Breite. */
.cx-na-form {
  display: grid; gap: 14px 16px; align-items: end;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  margin-bottom: 14px;
}
.cx-na-form .cx-feld { margin: 0; }
.cx-na-form .cx-na-text { grid-column: 1 / -1; }
.cx-na-form textarea { resize: vertical; min-height: 74px; line-height: 1.45; }
/* Der Zähler sitzt in der Beschriftung, nicht unter dem Feld: Dort steht er
   dem Text nicht im Weg und ist trotzdem im Blick, während man tippt. */
.cx-na-form .cx-feld em {
  float: right; font-style: normal; font-weight: 400;
  color: var(--cx-steel); font-variant-numeric: tabular-nums;
}
.cx-na-aktionen { grid-column: 1 / -1; display: flex; gap: 10px; }

.cx-na-liste { display: grid; gap: 12px; }
.cx-na-zeile {
  display: grid; gap: 7px; padding: 14px 16px;
  border-radius: var(--cx-radius); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
/* Abgelaufene bleiben stehen, aber zurückgenommen: Sie sind kein Fehler,
   sondern erledigt – und man will sehen, was man einmal geschrieben hat. */
/* ABGELAUFEN WIRD ÜBER DIE FARBE GEZEIGT (1.178.2). Die 0,6 auf der ganzen
   Zeile drückten den Hinweistext auf 4,37:1 dunkel und 3,13:1 hell und die
   Fußzeile sogar auf 2,43:1 – ausgerechnet dort, wo steht, WARUM die Zeile
   zurückgenommen ist. --cx-steel trägt 10,52:1 beziehungsweise 5,05:1. */
.cx-na-zeile.alt .cx-na-text,
.cx-na-zeile.alt .cx-na-fuss,
.cx-na-zeile.alt .cx-na-fuss .cx-pf-offen { color: var(--cx-steel); }
.cx-na-kopf { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.cx-na-wer { font: 600 15px/1.3 var(--cx-font-display); color: var(--cx-text); }
.cx-na-art {
  font-size: 9.5px; letter-spacing: .05em; text-transform: uppercase;
  color: var(--cx-steel); border: 1px solid var(--cx-border);
  border-radius: 4px; padding: 1px 6px;
}
.cx-na-zeile .cx-na-text {
  margin: 0; font-size: 14px; line-height: 1.5; color: var(--cx-text-muted);
  overflow-wrap: anywhere;
}
.cx-na-fuss {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  font-size: 12px; color: var(--cx-steel);
}
.cx-na-fuss button { margin-left: auto; }

@media (max-width: 620px) {
  .cx-na-fuss button { margin-left: 0; width: 100%; }
}

/* --- Das Blatt für die Präsentation ---------------------------------------
   Ein Portfolio will irgendwann in eine Folie. Statt eines zweiten Werkzeugs
   bekommt der Browser hier ein Blatt hingelegt, das wirklich 210 × 297 mm
   misst – der PDF-Export ist dann seiner.

   Auf dem Bildschirm wird dasselbe Blatt verkleinert gezeigt, mit transform
   statt mit zoom: transform rechnet Millimeter zuverlässig um und lässt sich
   im Druck mit einer Zeile wieder abschalten. Die Hülle trägt die
   verkleinerte Größe, sonst stünde die Vorschau in einer riesigen
   Leerfläche – ein transform verändert den Platzbedarf nicht. */

.cx-pf-pdf { margin-left: auto; flex: none; }

.cx-druck-huelle {
  --cx-bl-z: 1;
  position: fixed; inset: 0; z-index: 120;
  overflow: auto; overscroll-behavior: contain;
  padding: 0 24px 32px; background: rgba(4, 6, 10, .92);
  backdrop-filter: blur(3px);
}
html[data-theme="light"] .cx-druck-huelle { background: rgba(20, 23, 28, .88); }

.cx-druck-leiste {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin: 0 -24px 22px; padding: 14px 24px;
  background: var(--cx-graphite); border-bottom: 1px solid var(--cx-border);
}
.cx-druck-text { flex: 1 1 340px; min-width: 0; display: grid; gap: 3px; }
.cx-druck-text strong { font: 600 15px/1.3 var(--cx-font-display); color: var(--cx-text); }
.cx-druck-text span { font-size: 12.5px; line-height: 1.45; color: var(--cx-steel); }
.cx-druck-text em { font-style: normal; font-weight: 600; color: var(--cx-text-muted); }
.cx-druck-leiste .cx-btn, .cx-druck-leiste .cx-btn-secondary { flex: none; margin: 0; }

/* Regler und Häkchen sind Werkzeuge der VORSCHAU. Dass sie den Ausdruck nicht
   erreichen, ist keine Frage von display:none an dieser Stelle, sondern der
   Druckregeln weiter unten: Die ganze Leiste verschwindet, und das transform
   am Blatt wird zurückgesetzt. Ein Blatt auf 40 % kommt als volles A4 aus dem
   Drucker – das ist die Zusage, an der dieser Regler hängt. */
.cx-druck-zoom, .cx-druck-wahl {
  flex: none; display: flex; align-items: center; gap: 9px;
  font-size: 12.5px; color: var(--cx-steel); cursor: pointer;
}
.cx-druck-zoom input[type="range"] { width: 150px; margin: 0; accent-color: var(--cx-blue); }
.cx-druck-zoom b {
  min-width: 44px; text-align: right; font-weight: 600;
  font-variant-numeric: tabular-nums; color: var(--cx-text-muted);
}
.cx-druck-wahl { align-items: flex-start; max-width: 230px; }
.cx-druck-wahl input { flex: none; margin: 2px 0 0; accent-color: var(--cx-blue); }
.cx-druck-wahl span { display: grid; gap: 1px; line-height: 1.35; color: var(--cx-text); }
.cx-druck-wahl b { font-weight: 400; font-size: 11.5px; color: var(--cx-steel); }

/* Der Messplatz. Hier werden die Blätter gefüllt und ausgemessen, bevor sie
   auf die Bühne kommen. Außerhalb des Sichtfelds statt display:none – ohne
   Layout gibt es nichts zu messen. */
.cx-druck-lager {
  position: fixed; left: -20000px; top: 0;
  visibility: hidden; pointer-events: none; z-index: -1;
}

/* `safe center` ist hier kein Feinschliff, sondern Bedingung dafür, dass der
   Regler über 100 % gehen darf: Ein zentrierter Inhalt, der breiter ist als
   sein Kasten, überläuft nach BEIDEN Seiten – und links kommt man nicht mehr
   hin, weil scrollLeft bei 0 anfängt. Bei 200 % lag die Blattkante gemessen
   bei -389 px und blieb es. `safe` fällt bei Überlauf auf start zurück.
   Die Zeile darüber bleibt als Rückfall für Browser ohne `safe` stehen. */
.cx-druck-buehne {
  display: grid; gap: 22px;
  justify-content: center;
  justify-content: safe center;
}
.cx-bl-huelle {
  width: calc(210mm * var(--cx-bl-z));
  height: calc(297mm * var(--cx-bl-z));
  box-shadow: 0 18px 50px rgba(0, 0, 0, .55);
}

.cx-blatt {
  box-sizing: border-box; position: relative; overflow: hidden;
  width: 210mm; height: 297mm; padding: 15mm 15mm 11mm;
  transform: scale(var(--cx-bl-z)); transform-origin: top left;
  display: flex; flex-direction: column;
  background: #FFFFFF; color: #14171C; font-family: var(--cx-font-body);
  /* Ohne diese Zeile spart Chrome die Flächen im Druck weg und die
     Logoplättchen kommen weiß in weiß aus dem Drucker. */
  -webkit-print-color-adjust: exact; print-color-adjust: exact;
}
.cx-blatt * { box-sizing: border-box; }

.cx-bl-band {
  position: absolute; top: 0; left: 0; right: 0; height: 4.5mm;
  background: linear-gradient(90deg, #3FA9FF 0%, #1E7BE8 45%, #0D50D8 80%, #35E0DA 100%);
}

.cx-bl-kopf {
  flex: none; display: flex; align-items: flex-end; justify-content: space-between;
  gap: 10mm; padding-bottom: 5mm; border-bottom: .4mm solid #D9DEE7;
}
/* Nicht das Elektroblau der Website (#1E7BE8): Auf weißem Papier bringt es
   nur 4,2 : 1, und die Vorzeile ist mit 3,1 mm kleine Schrift. Das Tiefblau
   des Verlaufs schafft 6,7 : 1 und ist dieselbe Marke. */
.cx-bl-ober {
  font: 600 3.1mm/1 var(--cx-font-body); letter-spacing: .16em;
  text-transform: uppercase; color: #0D50D8;
}
.cx-bl-firma {
  margin-top: 2.6mm; font: 700 8.4mm/1.1 var(--cx-font-display); color: #0B0E14;
}
/* Firma und Einheit stehen nebeneinander wie im Briefkopf: „Bechtle Cloud
   Services“ liest sich als ein Name, bleibt aber sichtbar zweistufig. Trägt
   die Einheit den Firmennamen schon selbst, steht sie allein – die Regel
   dazu in app.js unter pfBlattName(). */
.cx-bl-firma span { font-weight: 400; color: #4C5563; }
.cx-bl-meta { margin-top: 2.2mm; font-size: 3.4mm; color: #6B7280; }

.cx-bl-raster {
  flex: 1; display: flex; flex-direction: column; justify-content: center;
  gap: 4mm; padding: 5mm 0;
}
.cx-bl-zeile { display: flex; justify-content: center; gap: 4mm; }
/* Derselbe Plättchengrund wie im Katalog. Das ist keine Geschmacksfrage:
   Auf genau diesem Ton sind alle Logos einmal durchgemessen worden – auf
   reinem Weiß verschwände das eine oder andere. Das Innenmaß in Prozent,
   damit es bei 42 mm und bei 19 mm Kachelbreite gleich gut sitzt. */
/* Das Innenmaß kommt als fester Wert aus app.js, nicht als Prozentangabe:
   Ein padding in Prozent bezieht sich auf die Breite des ELTERNTEILS – in
   einer Zeile also auf die ganzen 180 mm statt auf die Kachel. Das ergab
   12,6 mm Rand in einer 23,5 mm hohen Kachel, und das Logo war weg. */
.cx-bl-kachel {
  flex: none; width: var(--kb); height: var(--kh); padding: var(--kp);
  display: flex; align-items: center; justify-content: center;
  overflow: hidden; break-inside: avoid;
  background: #F2F4F7; border: .3mm solid #E3E8F0; border-radius: 2mm;
}
.cx-bl-kachel img { max-width: 100%; max-height: 100%; object-fit: contain; }
.cx-bl-kachel .cx-logo-ersatz { padding: 0; font-size: 3.2mm; color: #55606F; }

/* Die Fußzeile ist mit 2,7 mm die kleinste Schrift auf dem Blatt und braucht
   deshalb mehr Kontrast, nicht weniger: derselbe Grauton wie die Kopfzeile,
   4,8 : 1 statt der 3,1 : 1 eines helleren Grau. */
.cx-bl-fuss {
  flex: none; display: flex; justify-content: space-between; gap: 8mm;
  padding-top: 3.5mm; border-top: .3mm solid #EBEEF3;
  font-size: 2.7mm; color: #6B7280;
}
/* Der Herkunftshinweis steht hier unten und nicht mehr oben im Kopf. Dort
   stand bis 1.66.4 die gesetzte Wortmarke (.cx-bl-marke, 6,4 mm, mit blauem
   X) rechts neben dem Firmennamen – auf einem Blatt, das beim Kunden auf dem
   Tisch liegt. Der Kopf gehört dem Haus, dessen Portfolio das Blatt zeigt.
   Bewusst OHNE die Markenfarben – bei 2,7 mm Schriftgröße wird ein blaues X
   zum Fleck, und werben soll die Zeile nicht. Nur etwas fetter, damit der
   Name als Name lesbar bleibt. */
.cx-bl-fuss .cx-bl-fussmarke { font-weight: 600; color: #4C5563; }

/* --- Die Battle Card als Blatt ---
   Alle Maße in Millimetern wie beim Portfolio-Blatt: Ein Blatt ist ein Blatt,
   und was hier in Pixeln stünde, wäre auf Papier eine Zufallsgröße. Dieselben
   Farben, aus demselben Grund – Tiefblau #0D50D8 statt des Elektroblaus der
   Website, das auf weißem Papier nur 4,2 : 1 erreicht. */
.cx-bc-marke { display: flex; align-items: center; gap: 5mm; min-width: 0; }
.cx-bc-titel {
  margin-top: 2.2mm; font: 700 6.4mm/1.15 var(--cx-font-display); color: #0B0E14;
}
.cx-bc-seite { flex: none; font-size: 3mm; color: #6B7280; white-space: nowrap; }
/* „Kein Angebot in diesem Bereich.“ – eine Aussage, keine Randnotiz.
   #98A0AC waren 2,64:1; #6B7280 schafft 4,83:1, kursiv bleibt sie (1.173.2). */
.cx-bc-leer { color: #6B7280; font-style: italic; }

/* Dasselbe Plättchen wie im Katalog, nur in Millimetern. Weiß statt des
   grauen Katalogtons: Auf dem Blatt steht es allein und nicht im Raster,
   und ein grauer Kasten sähe dort aus wie ein Druckfehler. */
.cx-bc-plate {
  flex: none; display: flex; align-items: center; justify-content: center;
  width: 26mm; height: 9mm; padding: 1.2mm; overflow: hidden;
  background: #FFFFFF; border: .3mm solid #E3E8F0; border-radius: 1.4mm;
}
.cx-bc-plate.gross { width: 34mm; height: 13mm; }
.cx-bc-plate img { max-width: 100%; max-height: 100%; object-fit: contain; }
.cx-bc-plate .cx-logo-ersatz { padding: 0; font-size: 3mm; color: #55606F; }

/* Die Übersichtsseite: zwei oder drei Spalten nebeneinander, jede so hoch wie
   das Blatt. grid-template-rows: minmax(0,1fr) ist dabei der Kern – ohne diese
   Zeile nähme sich die Rasterzeile die Höhe ihres INHALTS. Die Spalte liefe
   dann über die Blattkante hinaus, ohne dass es beim Messen auffiele: Sie wäre
   ja immer genau so hoch wie das, was in ihr steht. */
.cx-bc-raster {
  flex: 1; min-height: 0; display: grid; gap: 0 5mm; padding-top: 4mm;
  grid-template-columns: repeat(var(--bc-n, 3), 1fr);
  grid-template-rows: minmax(0, 1fr);
}
.cx-bc-sp {
  display: flex; flex-direction: column; overflow: hidden;
  padding-right: 4mm; border-right: .25mm solid #EDF0F5;
}
/* Nicht schrumpfen dürfen: Ein Flex-Kind macht sich sonst kleiner als sein
   Inhalt. Genau das hebelte die Messung aus – die Spalte sähe passend aus und
   der Text stünde trotzdem übereinander. */
.cx-bc-sp > * { flex: none; }
.cx-bc-sp:last-child { padding-right: 0; border-right: 0; }
.cx-bc-kopf { display: flex; flex-direction: column; gap: 1.8mm; margin-bottom: 2.6mm; }
.cx-bc-name { font: 700 4.4mm/1.15 var(--cx-font-display); color: #0B0E14; }
/* Der Kernsatz. Er trägt die Spalte und steht deshalb im Kasten – der erste
   Satz der POSITIONIERUNG, nicht der Abgrenzung: In der Spalte eines Anbieters
   hat kein Satz zu stehen, der einen anderen lobt. */
.cx-bc-satz {
  margin-bottom: 2.8mm; padding: 1.9mm 2.3mm;
  background: #F5F8FC; border-left: .7mm solid #3FA9FF;
  border-radius: 0 1.2mm 1.2mm 0;
  font-size: 2.95mm; line-height: 1.4; color: #232830;
}
.cx-bc-rub {
  margin: 2.2mm 0 1.1mm; font-size: 2.5mm; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: #0D50D8;
}
.cx-bc-liste { margin: 0; padding-left: 3.6mm; font-size: 2.8mm; line-height: 1.4; }
.cx-bc-liste li { margin-bottom: 1.1mm; }
.cx-bc-prod { list-style: none; margin: 0; padding: 0; }
.cx-bc-prod li { margin-bottom: 1.4mm; font-size: 2.85mm; line-height: 1.3; }
.cx-bc-prod b { display: block; font-weight: 600; }
.cx-bc-prod span { display: block; font-size: 2.4mm; color: #6B7280; }
/* Was beim Kürzen wegfiel, steht als Zeile da statt zu verschwinden. */
.cx-bc-rest { list-style: none; font-style: italic; color: #6B7280; }
.cx-bc-liste .cx-bc-rest { margin-left: -3.6mm; }
.cx-bc-fuss {
  margin-top: auto; padding-top: 2.5mm; border-top: .25mm solid #EDF0F5;
  font-size: 2.5mm; line-height: 1.4; color: #4C5563;
}
.cx-bc-fuss b { color: #0D50D8; }

/* Der Anhang – ein Hersteller, so viele Seiten wie seine Texte brauchen.
   overflow:hidden ist hier Messgerät und Schutz zugleich: Es hält scrollHeight
   ehrlich und lässt einen Text, der doch einmal übersteht, nicht in die
   Fußzeile laufen. */
.cx-bc-koerper { flex: 1; min-height: 0; overflow: hidden; padding-top: 3.6mm; }
.cx-bc-block { break-inside: avoid; }
.cx-bc-block + .cx-bc-block { margin-top: 2.2mm; }
.cx-bc-block:not(:first-child) > .cx-bc-arub { margin-top: 1.6mm; }
.cx-bc-arub {
  margin: 0 0 1.4mm; padding-bottom: .8mm; border-bottom: .25mm solid #E3E8F0;
  font-size: 2.7mm; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: #0D50D8;
}
.cx-bc-atext { margin: 0; font-size: 3mm; line-height: 1.46; color: #232830; }
.cx-bc-aliste { margin: 0; padding-left: 4.2mm; font-size: 3mm; line-height: 1.46; color: #232830; }
.cx-bc-aliste li { margin-bottom: 1.2mm; }
.cx-bc-aprod b { font-size: 3.2mm; }
.cx-bc-aprod p { margin: .5mm 0 0; font-size: 2.9mm; line-height: 1.44; color: #232830; }
.cx-bc-klasse {
  display: block; margin-top: .3mm;
  font-size: 2.5mm; font-weight: 600; color: #0D50D8;
}
.cx-bc-agegen p { margin: 0; font-size: 2.9mm; line-height: 1.44; color: #232830; }
.cx-bc-wer {
  display: block; margin-bottom: .5mm; font-size: 2.4mm; font-weight: 700;
  letter-spacing: .07em; text-transform: uppercase; color: #0D50D8;
}

/* Gedruckt wird nur das Blatt. Der Wächter ist die Klasse am <html>: Ohne
   sie gilt keine dieser Regeln – ein gewöhnliches Strg+P auf irgendeiner
   Seite soll weiterhin die Seite drucken und nicht leeres Papier. */
@media print {
  html.cx-druckt, html.cx-druckt body {
    background: #fff !important; margin: 0 !important; padding: 0 !important;
    height: auto !important; overflow: visible !important;
  }
  html.cx-druckt body > *:not(.cx-druck-huelle) { display: none !important; }
  html.cx-druckt .cx-druck-huelle {
    position: static !important; overflow: visible !important;
    padding: 0 !important; background: none !important;
  }
  html.cx-druckt .cx-druck-leiste { display: none !important; }
  html.cx-druckt .cx-druck-buehne { display: block !important; }
  /* Ausdrücklich 210 mm, nicht auto: Ein Block nimmt sich die Breite seines
     Umfelds, und wenn die aus irgendeinem Grund größer ist als die Seite,
     schiebt der Drucker den Überstand auf ein zweites, fast leeres Blatt. */
  html.cx-druckt .cx-bl-huelle {
    width: 210mm !important; height: auto !important; margin: 0 auto !important;
    box-shadow: none !important; break-after: page;
  }
  html.cx-druckt .cx-bl-huelle:last-child { break-after: auto; }
  html.cx-druckt .cx-blatt { transform: none !important; }
}

@media (max-width: 620px) {
  .cx-druck-leiste { padding: 12px 16px; margin: 0 -16px 16px; }
  .cx-druck-huelle { padding: 0 16px 24px; }
  .cx-druck-leiste .cx-btn, .cx-druck-leiste .cx-btn-secondary { flex: 1; }
  /* Auf dem Handy nahm die Leiste ein Drittel der Bildschirmhöhe – und sie
     bleibt beim Scrollen stehen, also fehlt der Platz durchgehend. Weg
     kommt der Hinweis auf den Druckdialog: Er beschreibt Einstellungen
     („Ränder → Keine“), die es auf dem Telefon so nicht gibt. Regler und
     Häkchen bleiben, sie bekommen je eine eigene Zeile. */
  .cx-druck-text span { display: none; }
  .cx-druck-zoom, .cx-druck-wahl { flex: 1 1 100%; max-width: none; }
  .cx-druck-zoom input[type="range"] { flex: 1; width: auto; }
}

/* --- Verwaltung --- */
.cx-verw-tabs {
  display: flex; flex-wrap: wrap; gap: 4px;
  border-bottom: 1px solid var(--cx-border); margin: 8px 0 4px;
}
.cx-verw-tabs a {
  padding: 10px 16px; font-size: 15px; color: var(--cx-steel);
  border-bottom: 2px solid transparent; font-weight: 500;
}
.cx-verw-tabs a:hover { color: var(--cx-text); }
.cx-verw-tabs a.active { color: var(--cx-text); border-bottom-color: var(--cx-blue); }

/* Die Filterleisten nutzen .cx-toolbar; die Auswahlfelder dürfen dort nicht
   auf 100 % gehen, sonst sprengt ein Label die Zeile. */
.cx-pflege-filter, .cx-bq-toolbar { gap: 12px 18px; align-items: end; }
.cx-pflege-filter .cx-select, .cx-bq-toolbar .cx-select { width: auto; min-width: 170px; }
.cx-pflege-filter .cx-treffer, .cx-bq-toolbar .cx-treffer { margin-top: 0; align-self: center; }
.cx-pflege-filter label {
  display: flex; flex-direction: column; gap: 4px;
  font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-pflege-meldung { margin: 10px 0 0; font-weight: 600; }
.cx-pflege-tabelle td { vertical-align: top; }
/* KEINE DECKKRAFT MEHR – die Farbe trägt die Zurücknahme allein (1.177.2).
   Bis hierher stand hier zusätzlich opacity: .7, und das drückte --cx-steel
   von 6,34:1 auf 3,59:1 (dunkel) beziehungsweise von 8,92:1 auf 2,68:1 (hell).
   Am 26.09. bekam die eine Fundstelle im Konto-Blatt eine Ausnahme, am 27.09.
   fiel die nächste auf: „führt keine Skillmatrix · 24 Personen warten" unter
   Verwaltung → Skillmatrix – ausgerechnet der Satz, der die Frage beantwortet,
   warum niemand etwas sieht. ZWEI AUSNAHMEN VON DERSELBEN REGEL HEISSEN, DASS
   DIE REGEL FALSCH IST: --cx-steel ist ein gemessener, bereits zurückgenommener
   Ton (10,52:1 dunkel, 8,92:1 hell gegen die Kartenfläche) und braucht keine
   zweite Dämpfung. An 40 Fundstellen wird der Text damit lesbar, ohne seine
   Nebenrolle zu verlieren. */
.cx-pflege-offen { color: var(--cx-steel); }
/* Kopfhinweis der Pflegemaske für Konten einer Gesellschaft (1.159.2): Seit
   1.160.0 sagt er, für wen gilt, was dort gespeichert wird – für die ganze
   Firma, außer bei dem, was die Gesellschaft selbst pflegt. Blasser als eine
   Meldung, aber nicht so blass wie .cx-pflege-offen. */
.cx-pflege-erbt {
  margin: 14px 0 4px; padding: 10px 14px; font-size: 14.5px; line-height: 1.55;
  border-left: 3px solid var(--cx-blue); border-radius: 0 8px 8px 0;
  background: color-mix(in srgb, var(--cx-blue) 8%, transparent);
}

/* Die Ebene der Pflegemaske (1.161.0): Firma oder Gesellschaft. Steht über
   dem Formular und sagt, wofür gespeichert wird – mit Auswahl, wo es mehr als
   eine gibt. Gleiche Bauart wie .cx-pflege-erbt, weil es dieselbe Art Auskunft
   ist, aber als Kasten: Die Auswahl darin ist ein Bedienelement. */
.cx-pflege-ebene {
  display: grid; gap: 8px;
  margin: 14px 0 4px; padding: 12px 16px 13px; font-size: 14.5px; line-height: 1.55;
  border: 1px solid var(--cx-border); border-left: 3px solid var(--cx-blue);
  border-radius: 0 10px 10px 0;
  background: color-mix(in srgb, var(--cx-blue) 8%, transparent);
}
.cx-pflege-ebene .cx-feld { margin: 0; max-width: 460px; }
.cx-pflege-ebene .cx-select { text-transform: none; letter-spacing: normal; }
.cx-pflege-ebene-name { margin: 0; }
.cx-pflege-ebene-text { margin: 0; max-width: 78ch; color: var(--cx-text-muted); }

/* Was eine Gesellschaft von der Firma erbt – über ihren eigenen Angaben, nur
   zum Lesen. Gestrichelt, damit es nicht wie ein Eingabefeld aussieht. */
.cx-pflege-geerbt {
  margin: 10px 0 12px; padding: 9px 13px; font-size: 13.5px; line-height: 1.5;
  color: var(--cx-text-muted);
  border: 1px dashed var(--cx-border); border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon);
}
.cx-pflege-geerbt b { color: var(--cx-text); }
.cx-pflege-geerbt p { margin: 4px 0 0; white-space: pre-line; }
.cx-pflege-geerbt-liste { margin: 5px 0 0; padding-left: 18px; }
.cx-pflege-geerbt-liste li { margin: 2px 0; }
.cx-pflege-geerbt-liste strong { color: var(--cx-text); font-weight: 600; }

/* Ein gesperrter Knopf muss gesperrt AUSSEHEN. Ohne diese Regel behält der
   Hauptknopf seinen blauen Verlauf und den Zeigefinger – er sieht aus wie eine
   Einladung und tut beim Klick nichts. Aufgefallen an der Nachrichten-Maske in
   der Sichtprobe; die Regel gilt bewusst für alle Knöpfe, nicht nur für die
   eine Stelle. */
.cx-btn:disabled, .cx-btn-secondary:disabled, button:disabled.cx-mini {
  opacity: .45; cursor: not-allowed; filter: grayscale(.6);
}
.cx-bq-mini {
  display: inline-block; padding: 2px 8px; border-radius: 999px;
  font-size: 12px; background: rgba(30,123,232,.12); border: 1px solid rgba(30,123,232,.3);
}
.cx-bq-mini.cx-bq-sekundaer { background: rgba(139,146,155,.12); border-color: var(--cx-border); }
.cx-bq-mini.cx-bq-direkt { background: rgba(53,224,218,.12); border-color: rgba(53,224,218,.35); }

/* Eingabefelder: es gab bisher keine – deshalb hier einmal zentral.
   box-sizing ist hier Pflicht, nicht Geschmack: Ohne die Zeile meint width:100%
   nur den INHALT, und Innenabstand (2 × 11 px) plus Rahmen (2 × 1 px) kommen
   obendrauf. Jedes Feld stand damit 24 px über seine Rasterspalte hinaus – bei
   14 px Spaltenabstand also 10 px im Nachbarfeld. Bei <select> fiel es nicht
   auf, weil Browser dort von sich aus border-box rechnen. */
.cx-input, .cx-select {
  font-family: var(--cx-font-body); font-size: 14.5px; color: var(--cx-text);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); padding: 9px 11px; width: 100%;
  box-sizing: border-box;
}
.cx-input:focus, .cx-select:focus {
  outline: none; border-color: var(--cx-blue); box-shadow: 0 0 0 3px rgba(30,123,232,.18);
}
.cx-input::placeholder { color: var(--cx-steel); opacity: .75; }
textarea.cx-input { resize: vertical; line-height: 1.55; }
.cx-select.cx-mini { padding: 5px 8px; font-size: 13px; width: auto; }
.cx-feld {
  display: flex; flex-direction: column; gap: 5px; margin-bottom: 12px;
  font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-feld .cx-input { text-transform: none; letter-spacing: normal; }

.cx-pflege-form .cx-section { margin-top: 18px; }
.cx-pflege-hilfe { font-size: 13px; color: var(--cx-steel); margin: 8px 0 0; }

/* Herstellerportfolio eines Hauses: 205 Zeilen wollen weder als lange Seite
   noch als Mehrfachauswahlfeld gepflegt werden. Ein eigenes Rollfeld mit
   fester Höhe hält das Formular kurz, und die Spalten füllen die Breite –
   bei einer einspaltigen Liste läge rechts die halbe Karte brach. */
.cx-dh-suche { max-width: 340px; margin: 10px 0 8px; }
.cx-dh-liste {
  max-height: 320px; overflow-y: auto;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 8px 10px; columns: 3; column-gap: 22px;
}
.cx-dh-zeile {
  display: flex; align-items: center; gap: 8px; padding: 3px 0;
  font-size: 13.5px; line-height: 1.4; cursor: pointer;
  /* Ohne break-inside zerreißt der Spaltenumbruch Haken und Namen. */
  break-inside: avoid;
}
.cx-dh-zeile input { flex: none; margin: 0; }
.cx-dh-zeile:hover span { color: var(--cx-text); }
@media (max-width: 900px) { .cx-dh-liste { columns: 2; } }
@media (max-width: 620px) { .cx-dh-liste { columns: 1; max-height: 260px; } }
.cx-pflege-zeile {
  display: grid; gap: 8px; margin-bottom: 8px; align-items: center;
  grid-template-columns: minmax(140px, 1.1fr) minmax(110px, .7fr)
                         minmax(120px, .9fr) minmax(160px, 1.6fr) 40px;
}
.cx-pflege-zeile .cx-btn-secondary { padding: 8px 0; text-align: center; }
/* Auf der Ebene einer Firma mit Gesellschaften trägt jede Bezugsquelle einen
   Haken „für alle Gesellschaften“ (1.161.0) – eine Spalte mehr. Steht hinter
   .cx-pflege-zeile und vor der Regel für schmale Anzeigen, damit die eine
   überstimmt und die andere gewinnt. */
.cx-pflege-zeile-frei {
  grid-template-columns: minmax(140px, 1.1fr) minmax(110px, .7fr)
                         minmax(110px, .8fr) minmax(140px, 1.4fr) auto 40px;
}
.cx-bq-frei {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  font-size: 12.5px; color: var(--cx-text-muted); cursor: pointer;
}
.cx-bq-frei input { margin: 0; accent-color: var(--cx-blue); }
.cx-bq-frei:has(input:disabled) { cursor: default; opacity: .75; }

/* Ein Ansprechpartner hat sechs bis sieben Felder. Nebeneinander bleiben davon
   rund 160 Pixel je Feld übrig – dann steht in „E-Mail“ nur noch
   „markus.gapp@securev“. Deshalb bricht die Zeile um: drei Felder je Reihe,
   jedes beschriftet. Die Beschriftung ist hier nicht Zierde, sondern nötig:
   sobald ein Feld gefüllt ist, verschwindet der Platzhalter, und dann ist
   „+49 151 …“ nicht mehr von Telefon oder Mobil zu unterscheiden. */
/* Der Löschknopf steht oben statt mittig: bei zwei oder drei Reihen je Kontakt
   schwebt er sonst irgendwo zwischen den Feldern und man sieht ihm nicht an,
   zu welchem Block er gehört. */
.cx-pflege-kontakt {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 14px 0; border-top: 1px solid var(--cx-border);
}
.cx-pflege-kontakt:first-child { border-top: 0; padding-top: 4px; }
.cx-kontakt-felder {
  flex: 1; min-width: 0;                  /* ohne min-width sprengt ein langer
                                             Wert die Flex-Zeile nach rechts */
  display: grid; gap: 10px 14px;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cx-kontakt-felder .cx-feld { margin-bottom: 0; font-size: 11px; }
/* Sieben oder acht Felder gehen in Dreierreihen nicht auf – übrig bliebe ein
   einzelnes Feld in der letzten Zeile. Deshalb stehen die Zuordnungsfelder
   (Firma, Hersteller, Distributor) in einer eigenen ersten Zeile, und die
   eigentlichen Kontaktdaten beginnen darunter mit einer neuen: dann sind alle
   Datenzeilen voll und die kurze Zeile steht oben, wo sie als Überschrift
   gelesen wird. */
.cx-kontakt-felder .cx-neue-zeile { grid-column-start: 1; }
/* Freitext braucht mehr als ein Drittel – etwa die Notiz einer Firma zu einem
   Distributor. Auf schmalen Anzeigen greift die Spaltenzahl darunter. */
.cx-kontakt-felder .cx-feld-breit { grid-column: span 2; }
@media (max-width: 620px) { .cx-kontakt-felder .cx-feld-breit { grid-column: span 1; } }
.cx-zeile-weg { flex: none; width: 40px; padding: 8px 0; text-align: center; }

@media (max-width: 900px) {
  .cx-kontakt-felder { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
  .cx-kontakt-felder { grid-template-columns: 1fr; }
}
.cx-datei-form { grid-template-columns: minmax(120px, .7fr) minmax(160px, 1.4fr)
                                        minmax(140px, .8fr) minmax(180px, 1.4fr) auto; }
.cx-pflege-aktionen { display: flex; flex-wrap: wrap; gap: 12px; margin: 22px 0 0; align-items: center; }
/* Das feste #F06A6A trug im hellen Modus nur 3,01:1. --cx-qc-rot gibt es
   seit 1.168.0 für genau diesen Zweck in beiden Modi (#E06A6A dunkel,
   #C43B3B hell) – die Farbe aus der Nachbarschaft nehmen, nicht neu wählen. */
.cx-loeschen { border-color: rgba(224,64,64,.45); color: var(--cx-qc-rot); }
.cx-loeschen:hover { border-color: #F06A6A; }
.cx-pflege-kopf { padding-bottom: 4px; }
/* Gesperrter Löschknopf in der Firmentabelle: Er sagt am Zeiger, was im Weg
   steht, statt eine Rückfrage zu stellen, die der Server danach absagt. Der
   Titel sitzt am umschließenden span – ein deaktivierter Knopf zeigt in
   mehreren Browsern keinen eigenen Tooltip. */
.cx-firma-weg-sperre { display: inline-block; cursor: not-allowed; }
.cx-loeschen:disabled {
  border-color: var(--cx-border); color: var(--cx-steel);
  opacity: .55; pointer-events: none;
}


/* --- Zugangsanfrage (#/zugang) ------------------------------------------
   Bewusst NICHT .cx-login-card: dort gilt max-width 420px und eine eigene
   Feldoptik über den Elementselektor .cx-login-card input, die .cx-input
   überstimmt. Zwei Spalten statt drei, damit die vier Felder in zwei vollen
   Zeilen aufgehen und nicht eines allein stehen bleibt. */
.cx-zugang-karte { max-width: 720px; }
.cx-zugang-karte label {
  display: block; font-weight: 600; font-size: 14px; margin-bottom: 6px;
}
.cx-zugang-felder { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Muss sein, obwohl .cx-kontakt-felder weiter oben schon eine Regel für schmale
   Anzeigen hat: Die steht VOR dieser Zeile und wird bei gleicher Gewichtung von
   ihr überstimmt. Ohne die Wiederholung blieben auf dem Smartphone zwei Spalten
   von je 131 px stehen. */
@media (max-width: 620px) { .cx-zugang-felder { grid-template-columns: 1fr; } }
.cx-zugang-karte .cx-btn { margin-top: 22px; }
.cx-pflicht { color: var(--cx-accent); }
.cx-optional { color: var(--cx-steel); font-weight: 400; font-size: 12px; }
.cx-zugang-preis {
  margin: 26px 0 0; padding: 14px 18px;
  border: 1px solid var(--cx-border); border-left: 3px solid var(--cx-accent);
  border-radius: var(--cx-radius-sm); background: var(--cx-carbon);
}
.cx-cta-zusatz { align-self: center; color: var(--cx-steel); font-size: 14px; }

/* Honigtopf. display:none oder hidden wäre falsch: Ein Teil der Formular-Bots
   überspringt genau das. Abseits geschoben ist das Feld für Menschen unsichtbar,
   für den Bot aber ein ganz normales Eingabefeld – und wer es ausfüllt, verrät
   sich. Für Bildschirmleser trägt der Container aria-hidden. */
.cx-honig {
  position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;
}

/* Filter in der Spaltenüberschrift. Sichtbar ist nur ein Pfeil neben dem
   Spaltennamen – ein Kasten mit der gewählten Firma wäre doppelt gemoppelt,
   weil die Spalte darunter dieselbe Auskunft gibt. Das Auswahlfeld liegt
   durchsichtig über der ganzen Überschrift: Der Browser klappt seine eigene
   Liste auf, zu sehen ist aber unser Pfeil. */
.cx-kopf-filter {
  position: relative; display: inline-flex; align-items: baseline; gap: 6px;
  cursor: pointer;
}
/* Etwas größer als die Beschriftung, damit auch schmale Finger treffen. */
.cx-kopf-filter > select {
  position: absolute; inset: -6px -8px; opacity: 0; cursor: pointer;
  appearance: none; border: 0; padding: 0;
  font-family: var(--cx-font-body); font-size: 14px;
  letter-spacing: 0; text-transform: none;
  color: var(--cx-text); background: var(--cx-carbon);
}
.cx-kopf-pfeil { font-size: 11px; line-height: 1; color: var(--cx-steel); }
.cx-kopf-filter:hover .cx-spalte-name,
.cx-kopf-filter:hover .cx-kopf-pfeil { color: var(--cx-text); }
/* Tastatur: Das Feld selbst ist unsichtbar, die Marke muss also am Rumpf
   erscheinen – sonst sieht niemand, wo er gerade steht. */
.cx-kopf-filter:focus-within {
  outline: 2px solid var(--cx-blue); outline-offset: 4px;
  border-radius: var(--cx-radius-sm);
}
/* Gefiltert: Die Spalte bekommt eine Marke, damit eine verkürzte Liste nicht
   für den vollständigen Bestand gehalten wird. */
.cx-spalte-filter.aktiv .cx-spalte-name,
.cx-spalte-filter.aktiv .cx-kopf-pfeil { color: var(--cx-blue); }
/* Ankreuzfeld über einer Tabelle (Willkommensgruß beim Freischalten). Die
   Beschriftung erklärt BEIDE Zustände: Ein Haken, der nur sagt, was er tut,
   lässt offen, was ohne ihn passiert – und hier ist das eine Mail, die jemand
   erwartet. Ausrichtung oben, damit das Kästchen bei zwei Zeilen Text nicht
   in der Mitte schwebt. */
.cx-check-zeile {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 0 0 16px; max-width: 760px;
  font-size: 14px; line-height: 1.5; color: var(--cx-text-muted); cursor: pointer;
}
.cx-check-zeile input {
  width: auto; margin: 2px 0 0; flex: none; accent-color: var(--cx-blue);
}
.cx-check-zeile strong { color: var(--cx-text); }

/* Ergebnis der Mailprüfung: ein abgesetzter Kasten, weil es eine Auskunft ist
   und keine Bedienfläche. Grün/rot nur für das eine Wort, das zählt. */
.cx-mail-test {
  margin: 4px 0 0; padding: 14px 16px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm);
  font-size: 14px; line-height: 1.6; color: var(--cx-text-muted);
  max-width: 760px;
}
.cx-mail-test p { margin: 0 0 10px; }
.cx-mail-test p:last-child { margin-bottom: 0; }
.cx-mail-test code { font-size: 13px; }
.cx-login-ok-inline { color: var(--cx-accent); }
.cx-filter-hinweis { margin: 16px 0 0; color: var(--cx-steel); font-size: 14px; }
.cx-link-knopf {
  background: none; border: 0; padding: 0; font: inherit;
  color: var(--cx-blue); cursor: pointer; text-decoration: underline;
}

/* Freischaltmaske: klappt als eigene Zeile unter der Anfrage auf, zu der sie
   gehört. Eigene Fläche und ein Balken links, damit sie nicht als weitere
   Tabellenzeile missverstanden wird. */
.cx-frei-zeile > td { padding: 0 !important; }
.cx-frei-maske {
  padding: 16px 18px; margin: 4px 0 10px;
  background: var(--cx-carbon); border-left: 3px solid var(--cx-blue);
  border-radius: var(--cx-radius-sm);
}
.cx-frei-maske label { display: block; font-weight: 600; font-size: 13px; margin-bottom: 5px; }
.cx-frei-maske .cx-hinweis-klein { margin: 0 0 14px; }
.cx-frei-maske .cx-pflege-aktionen { margin-top: 16px; }
.cx-btn.cx-mini { padding: 8px 16px; font-size: 14px; }

/* Freitext in der Anfragenliste: umbrechen statt die Tabelle sprengen. */
.cx-anfrage-text {
  max-width: 320px; white-space: pre-line; color: var(--cx-steel); font-size: 14px;
}

/* Helles Thema: Flächen und Rahmen nachziehen. */
:root[data-theme="light"] .cx-input,
:root[data-theme="light"] .cx-select {
  background: var(--cx-white); border-color: #DDE1E7;
}
:root[data-theme="light"] .cx-bq-chip strong,
:root[data-theme="light"] .cx-bq-vendor,
:root[data-theme="light"] .cx-bq-status,
:root[data-theme="light"] .cx-input, :root[data-theme="light"] .cx-select { color: var(--cx-ink); }
:root[data-theme="light"] .cx-datei-art { color: var(--cx-blue-deep); }

@media (max-width: 860px) {
  .cx-pflege-zeile, .cx-datei-form { grid-template-columns: 1fr; }
  .cx-pflege-zeile .cx-btn-secondary { width: 100%; }
}

/* =========================================================================
   Reverse Proxy erklärt (#/reverseproxy)
   Die Seite lebt von einem Gegensatz: „vier offene Türen“ gegen „eine Tür mit
   Empfang“. Deshalb ein durchgehendes Farbsignal – die ungeschützte Variante
   trägt Amber und gestrichelte Linien (offen, noch nichts dazwischen), die
   geschützte Blau und durchgezogene (der Weg ist geführt). Kein Rot: Ein
   Aufbau ohne Reverse Proxy ist nicht falsch, nur ungeschützter.
   ========================================================================= */

/* --- Das Bild: drei Rollen im Bürogebäude --------------------------------- */
.cx-rp-rollen {
  display: grid; gap: 12px; margin: 18px 0 20px;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.cx-rp-rolle {
  padding: 14px 16px; border-radius: var(--cx-radius-sm, 10px);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  display: flex; flex-direction: column; gap: 3px;
}
.cx-rp-rolle i { font-style: normal; font-size: 22px; line-height: 1.2; }
.cx-rp-rolle b { font-size: 15px; }
.cx-rp-rolle span { font-size: 13.5px; color: var(--cx-steel); }
/* Die technische Entsprechung ist die eigentliche Pointe des Bildes. */
.cx-rp-rolle em {
  font-style: normal; font-size: 13.5px; margin-top: 5px;
  color: var(--cx-blue-light); font-weight: 600;
}
.cx-rp-fragen { margin: 0 0 14px; padding-left: 20px; }
.cx-rp-fragen li { color: var(--cx-text-muted); font-size: 15px; line-height: 1.7; }

/* --- Schemazeichnung: Quelle → (Station) → Ziele --------------------------
   Von mehreren Erklärseiten genutzt (Reverse Proxy, WAF), deshalb neutral
   benannt: cx-fluss statt cx-rp-*. Wer hier etwas ändert, ändert es auf allen. */
.cx-fluss {
  margin: 16px 0; padding: 18px 14px; border-radius: 12px;
  background: rgba(30,123,232,.05); border: 1px solid var(--cx-border);
  display: flex; flex-direction: column; align-items: center; gap: 0;
}
.cx-fluss.klein { padding: 14px 10px; }
.cx-fluss-knoten {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 8px 16px; border-radius: 8px; font-size: 13.5px; font-weight: 600;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  text-align: center;
}
.cx-fluss-quelle { color: var(--cx-text-muted); }
/* Der Proxy ist der Punkt, um den es geht – als einziger Knoten farbig. */
.cx-fluss-station {
  border-color: rgba(30,123,232,.55); color: var(--cx-blue-light);
  background: rgba(30,123,232,.10);
}
.cx-fluss-ziel { color: var(--cx-text-muted); font-weight: 500; }
.cx-fluss-pfeil {
  width: 1px; height: 22px; background: var(--cx-border); position: relative;
}
.cx-fluss-pfeil::after {
  content: ''; position: absolute; left: 50%; bottom: 0;
  transform: translateX(-50%);
  border-left: 4px solid transparent; border-right: 4px solid transparent;
  border-top: 5px solid var(--cx-border);
}
.cx-fluss-ziele { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }

/* Ohne Proxy: die Linie führt direkt durch – gestrichelt und amber, weil hier
   nichts dazwischensteht. Dasselbe Gestaltungsmittel wie bei den noch nicht
   bestätigten Bezugswegen: gestrichelt heißt „offen“, nicht „falsch“. */
.cx-fluss.offen { background: rgba(240,180,40,.05); }
.cx-fluss.offen .cx-fluss-pfeil { background: none; border-left: 1px dashed #F0B428; }
.cx-fluss.offen .cx-fluss-pfeil::after { border-top-color: #F0B428; }
.cx-fluss.offen .cx-fluss-ziel { border-color: rgba(240,180,40,.42); }

/* --- Gegenüberstellung ohne/mit ------------------------------------------- */
.cx-rp-vergleich { gap: var(--cx-gap); align-items: stretch; }
.cx-rp-ohne { border-color: rgba(240,180,40,.35); }
.cx-rp-mit  { border-color: rgba(30,123,232,.42); }
.cx-rp-vergleich h2 { font-size: 19px; margin: 0 0 10px; }
.cx-rp-vergleich p { font-size: 15px; line-height: 1.62; }
.cx-rp-liste { list-style: none; margin: 12px 0 0; padding: 0; display: grid; gap: 8px; }
.cx-rp-liste li { display: flex; gap: 10px; font-size: 14.5px; color: var(--cx-text-muted); }
.cx-rp-liste.minus li > span:first-child { flex: none; color: #F0B428; font-weight: 700; }

/* --- Ablauf einer Anfrage -------------------------------------------------- */
.cx-rp-adresse { margin: 0 0 16px; }
.cx-rp-adresse code {
  display: inline-block; padding: 8px 14px; border-radius: 8px; font-size: 14.5px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  color: var(--cx-blue-light);
}
.cx-rp-schritte { list-style: none; margin: 0 0 18px; padding: 0; display: grid; gap: 12px; }
.cx-rp-schritte li { display: flex; gap: 14px; align-items: flex-start; }
.cx-rp-schritte li > div { flex: 1; }
.cx-rp-schritte p { margin: 0; font-size: 15px; line-height: 1.62; }
/* Eine Regel ist immer „von → nach“. Als Zeile gesetzt, nicht als Fließtext:
   So sieht man die Zuordnung, statt sie aus einem Satz herauszulesen. */
.cx-rp-regel {
  display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-top: 8px; padding: 7px 12px; border-radius: 8px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  font-size: 13.5px;
}
.cx-rp-regel code { color: var(--cx-blue-light); font-size: 13px; }
.cx-rp-regel b { color: var(--cx-text); font-size: 13.5px; }
.cx-rp-regel i { color: var(--cx-steel); font-style: normal; }
.cx-rp-zuordnung { display: flex; flex-direction: column; gap: 8px; align-items: flex-start; }

/* --- Nutzen: Angriffe, Ausfälle -------------------------------------------- */
.cx-rp-angriffe { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0 4px; }
.cx-rp-angriffe span {
  padding: 5px 11px; border-radius: 99px; font-size: 12.5px;
  background: rgba(240,180,40,.08); border: 1px solid rgba(240,180,40,.35);
  color: #F0B428;
}
.cx-rp-zustand { display: grid; gap: 6px; margin: 12px 0 4px; }
.cx-rp-zustand span {
  display: flex; align-items: center; gap: 9px; font-size: 13.5px;
  padding: 7px 12px; border-radius: 8px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-rp-zustand i { font-style: normal; font-weight: 700; }
.cx-rp-zustand em { font-style: normal; margin-left: auto; color: var(--cx-steel); font-size: 12.5px; }
.cx-rp-zustand .ok i { color: var(--cx-accent); }
.cx-rp-zustand .aus { border-color: rgba(224,106,106,.42); }
.cx-rp-zustand .aus i { color: #E06A6A; }

/* --- Tabellen: leere Zelle, hervorgehobene Spalte -------------------------- */
.cx-rp-leer { color: var(--cx-steel); }
.cx-rp-hervor { color: var(--cx-blue-light); font-weight: 600; }
/* Die Reverse-Spalte ist die, um die es auf dieser Seite geht. */
.cx-rp-forward th:last-child { color: var(--cx-blue-light); }

/* --- Einsatzbereiche ------------------------------------------------------- */
.cx-rp-einsatz { display: flex; flex-wrap: wrap; gap: 8px; }
.cx-rp-einsatz span {
  padding: 8px 14px; border-radius: 99px; font-size: 13.5px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  color: var(--cx-text-muted);
}

/* --- Lösungen: Open Source und Enterprise ---------------------------------- */
.cx-rp-gruppe { margin-top: 26px; }
.cx-rp-gruppe h3 { margin: 0 0 4px; font-size: 20px; }
.cx-rp-gruppe-text { margin: 0 0 16px; font-size: 15px; color: var(--cx-steel); }
.cx-rp-produkte { grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); }
.cx-rp-produkt h4 { margin: 0 0 8px; font-size: 17px; }
.cx-rp-produkt p { font-size: 14.5px; line-height: 1.6; margin: 0 0 12px; }
.cx-rp-ideal { margin-bottom: 12px; }
.cx-rp-ideal b {
  display: block; font-size: 11.5px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--cx-steel); margin-bottom: 6px;
}
.cx-rp-ideal div { display: flex; flex-wrap: wrap; gap: 6px; }
.cx-rp-ideal span {
  padding: 4px 10px; border-radius: 99px; font-size: 12.5px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-text-muted);
}
/* Konzernzugehörigkeiten stehen klein darunter – sie erklären, warum ein Name
   im Katalog unter einer anderen Marke auftaucht. */
.cx-rp-notiz {
  margin: 12px 0 0 !important; padding-top: 10px; border-top: 1px solid var(--cx-border);
  font-size: 13px; color: var(--cx-steel);
}

/* --- Heller Modus: gemessene Werte, keine geschätzten --------------------- */
html[data-theme="light"] .cx-rp-rolle em { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-fluss-station { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-rp-adresse code,
html[data-theme="light"] .cx-rp-regel code,
html[data-theme="light"] .cx-rp-hervor,
html[data-theme="light"] .cx-rp-forward th:last-child { color: var(--cx-blue-deep); }
/* Amber auf Weiß trägt nicht: #F0B428 kommt gegen die helle Karte nur auf
   rund 2:1. Derselbe Fall wie bei den unbestätigten Bezugswegen – deshalb
   hier dieselbe abgedunkelte Fassung. */
html[data-theme="light"] .cx-rp-angriffe span,
html[data-theme="light"] .cx-rp-liste.minus li > span:first-child { color: rgb(150,92,25); }
html[data-theme="light"] .cx-rp-zustand .aus i { color: #C0392B; }
html[data-theme="light"] .cx-fluss-knoten,
html[data-theme="light"] .cx-rp-einsatz span,
html[data-theme="light"] .cx-rp-zustand span,
html[data-theme="light"] .cx-rp-regel { background: var(--cx-white); }
html[data-theme="light"] .cx-rp-ideal span { background: #F4F6F9; }
html[data-theme="light"] .cx-fluss-quelle,
html[data-theme="light"] .cx-fluss-ziel,
html[data-theme="light"] .cx-rp-regel b { color: var(--cx-ink); }

@media (max-width: 860px) {
  .cx-rp-vergleich { grid-template-columns: 1fr; }
}
@media (max-width: 620px) {
  .cx-rp-schritte li { gap: 10px; }
  .cx-fluss { padding: 14px 8px; }
  .cx-fluss-knoten { font-size: 12.5px; padding: 7px 12px; }
}

/* =========================================================================
   Web Application Firewall erklärt (#/waf)
   Zwei Farben tragen die ganze Seite: Grün heißt „durchgelassen“, Rot heißt
   „geblockt“. Anders als beim Reverse Proxy ist Rot hier richtig – ein
   Angriffsversuch IST ein Fehlerfall, kein offener Punkt. Farbe steht nie
   allein: Jede Ampel trägt zusätzlich Haken oder Kreuz.
   ========================================================================= */

/* --- Das Schaubild: Zaun und Türsteher ------------------------------------ */
.cx-waf-haus { margin: 20px 0 22px; }
.cx-waf-haus svg { width: 100%; height: auto; display: block; }
/* Alle Linien erben die Textfarbe, damit der Themenwechsel ohne zweite
   Farbliste funktioniert. Nur die beiden Wächter sind eigens gefärbt. */
.cx-waf-haus svg { color: var(--cx-steel); }
.cx-waf-gast, .cx-waf-gebaeude {
  fill: none; stroke: currentColor; stroke-width: 2.5;
  stroke-linecap: round; stroke-linejoin: round;
}
.cx-waf-gast circle { fill: none; }
.cx-waf-weg { stroke: currentColor; stroke-width: 2; stroke-dasharray: 6 7; fill: none; }
.cx-waf-zaun {
  fill: none; stroke: var(--cx-blue-light); stroke-width: 3; stroke-linecap: round;
}
.cx-waf-steher { fill: none; stroke: #F0B428; stroke-width: 2.8; stroke-linecap: round; }
.cx-waf-steher circle { fill: rgba(240,180,40,.16); }
.cx-waf-tuer { fill: rgba(240,180,40,.12); stroke: #F0B428; stroke-width: 2.5; }
.cx-waf-linie { stroke: currentColor; stroke-width: 1; stroke-dasharray: 3 4; fill: none; }
.cx-waf-marke text { font-family: inherit; }
.cx-waf-name { font-size: 15px; font-weight: 700; }
.cx-waf-name.zaun { fill: var(--cx-blue-light); }
.cx-waf-name.tuer { fill: #F0B428; }
.cx-waf-svg-frage { font-size: 13px; font-weight: 500; fill: var(--cx-steel); }

.cx-waf-rollen {
  display: grid; gap: 12px; margin: 0 0 18px;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.cx-waf-rolle {
  padding: 14px 16px; border-radius: 10px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  display: flex; flex-direction: column; gap: 3px;
}
.cx-waf-rolle.zaun { border-color: rgba(30,123,232,.42); }
.cx-waf-rolle.tuer { border-color: rgba(240,180,40,.42); }
.cx-waf-rolle b { font-size: 16px; }
.cx-waf-rolle span { font-size: 13.5px; color: var(--cx-steel); }
.cx-waf-rolle em { font-style: normal; font-size: 14px; margin-top: 6px; color: var(--cx-text-muted); }

/* --- Die fünf Prüffragen --------------------------------------------------- */
.cx-waf-pruefungen { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.cx-waf-pruefung { display: flex; gap: 14px; align-items: flex-start; }
.cx-waf-pruefung b { display: block; font-size: 15px; margin-bottom: 5px; }
.cx-waf-pruefung p { margin: 0; font-size: 14px; line-height: 1.6; }

/* --- Ampel: durchgelassen oder geblockt ------------------------------------ */
.cx-waf-ausgang, .cx-waf-faelle, .cx-waf-sichten { gap: var(--cx-gap); align-items: stretch; }
.cx-waf-fall {
  padding: 16px 18px; border-radius: 12px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-waf-fall.ok    { border-color: rgba(47,191,113,.42); }
.cx-waf-fall.block { border-color: rgba(224,106,106,.45); }
.cx-waf-fall-kopf { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.cx-waf-fall-kopf b { font-size: 16px; }
.cx-waf-fall p { margin: 0; font-size: 14.5px; line-height: 1.6; }
.cx-waf-marke-ok, .cx-waf-marke-block {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 99px; flex: none;
  font-weight: 700; font-size: 14px;
}
.cx-waf-marke-ok    { background: rgba(47,191,113,.14);  color: var(--cx-accent); }
.cx-waf-marke-block { background: rgba(224,106,106,.14); color: #E06A6A; }
/* Die Anfrage selbst: als Code gesetzt, mit Umbruch – eine Angriffs-URL ist
   lang und darf die Karte nicht sprengen. */
.cx-waf-anfrage {
  display: block; margin: 0 0 12px; padding: 10px 12px; border-radius: 8px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 13px; line-height: 1.5; word-break: break-all;
}
.cx-waf-fall.ok    .cx-waf-anfrage { color: var(--cx-accent); }
.cx-waf-fall.block .cx-waf-anfrage { color: #E06A6A; }
.cx-waf-befund { margin: 0 0 12px; padding-left: 20px; }
.cx-waf-befund li { font-size: 13.5px; line-height: 1.7; color: var(--cx-text-muted); }
.cx-waf-ergebnis { font-weight: 600; }
.cx-waf-erklaerung {
  margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--cx-border);
  font-size: 14.5px; line-height: 1.65;
}
.cx-waf-erklaerung code {
  padding: 2px 6px; border-radius: 5px; font-size: 13px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border); color: #E06A6A;
}

/* --- Zwei Sichten auf dieselbe Anfrage ------------------------------------- */
.cx-waf-sicht.ok    { border-color: rgba(30,123,232,.35); }
.cx-waf-sicht.block { border-color: rgba(224,106,106,.45); }
.cx-waf-sicht > b { display: block; font-size: 16px; margin-bottom: 12px; }
.cx-waf-sieht { display: grid; gap: 6px; margin-bottom: 14px; }
.cx-waf-sieht code {
  padding: 8px 12px; border-radius: 8px; font-size: 13px; word-break: break-all;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-text-muted);
}
.cx-waf-urteil { display: flex; align-items: center; gap: 10px; margin: 0; font-size: 15px; }
.cx-waf-sicht.block .cx-waf-sieht code { color: #E06A6A; }

/* --- Vier Wächter ---------------------------------------------------------- */
.cx-waf-waechter { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.cx-waf-waechter-karte { display: flex; flex-direction: column; gap: 6px; }
.cx-waf-waechter-karte i { font-style: normal; font-size: 26px; line-height: 1.2; }
.cx-waf-waechter-karte b { font-size: 16px; }
.cx-waf-waechter-karte p { margin: 0; font-size: 14.5px; line-height: 1.55; }
.cx-waf-ebene {
  align-self: flex-start; margin-top: 6px;
  padding: 4px 10px; border-radius: 99px; font-size: 11.5px;
  letter-spacing: .06em; text-transform: uppercase;
  background: var(--cx-carbon); border: 1px solid var(--cx-border); color: var(--cx-steel);
}

/* --- Virtuelles Patching: der Zeitvergleich -------------------------------- */
.cx-waf-zeit { display: grid; gap: 10px; margin: 14px 0 4px; }
.cx-waf-zeit-zeile {
  padding: 12px 14px; border-radius: 10px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-waf-zeit-zeile.kurz { border-color: rgba(47,191,113,.42); }
.cx-waf-zeit-zeile b { display: block; font-size: 13.5px; margin-bottom: 8px; }
.cx-waf-zeit-schritte { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
/* Die Schritte als Kette: Der Pfeil kommt aus dem CSS, nicht aus den Daten. */
.cx-waf-zeit-schritte span {
  padding: 4px 10px; border-radius: 6px; font-size: 12.5px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  color: var(--cx-text-muted);
}
.cx-waf-zeit-schritte span + span::before {
  content: '→'; margin-right: 8px; margin-left: -4px; color: var(--cx-steel);
}
.cx-waf-zeit-zeile em {
  display: block; margin-top: 8px; font-style: normal; font-size: 13px; font-weight: 600;
  color: #F0B428;
}
.cx-waf-zeit-zeile.kurz em { color: var(--cx-accent); }
.cx-waf-regeln { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0 4px; }

/* --- Vor Ort oder Cloud ---------------------------------------------------- */
.cx-waf-betrieb { gap: var(--cx-gap); align-items: stretch; }
.cx-waf-betrieb h2 { font-size: 19px; margin: 0 0 4px; }
.cx-waf-unter { font-size: 13.5px; color: var(--cx-steel); margin: 0 0 14px; }
.cx-waf-kette {
  margin: 0 0 16px; padding: 16px 12px; border-radius: 12px;
  background: rgba(30,123,232,.05); border: 1px solid var(--cx-border);
  display: flex; flex-direction: column; align-items: center; gap: 4px;
}
.cx-waf-kette i { font-style: normal; color: var(--cx-steel); font-size: 13px; line-height: 1; }

/* --- Fazit: vier Fragen nebeneinander -------------------------------------- */
.cx-waf-fragen { display: grid; gap: 8px; margin: 16px 0; }
.cx-waf-frage-zeile {
  display: grid; grid-template-columns: 170px 1fr; gap: 14px; align-items: baseline;
  padding: 10px 14px; border-radius: 8px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-waf-frage-zeile b { font-size: 14.5px; }
.cx-waf-frage-zeile span { font-size: 14.5px; color: var(--cx-text-muted); }

/* --- Heller Modus: gemessene Werte ---------------------------------------- */
html[data-theme="light"] .cx-waf-haus svg { color: #6B7280; }
html[data-theme="light"] .cx-waf-zaun { stroke: var(--cx-blue-deep); }
html[data-theme="light"] .cx-waf-name.zaun { fill: var(--cx-blue-deep); }
/* Zwei Werte lagen mit 4,67 und 4,83 knapp über der Schwelle – bei Schrift
   unter 13 px ist das zu wenig Reserve. Beide abgedunkelt auf über 5,5:1. */
html[data-theme="light"] .cx-waf-svg-frage { fill: #565D68; }
html[data-theme="light"] .cx-waf-ebene { color: #565D68; }
/* Amber trägt auf Weiß nicht – dieselbe abgedunkelte Fassung wie überall. */
html[data-theme="light"] .cx-waf-steher,
html[data-theme="light"] .cx-waf-tuer { stroke: rgb(150,92,25); }
html[data-theme="light"] .cx-waf-name.tuer { fill: rgb(150,92,25); }
html[data-theme="light"] .cx-waf-zeit-zeile em { color: rgb(150,92,25); }
html[data-theme="light"] .cx-waf-marke-block,
html[data-theme="light"] .cx-waf-fall.block .cx-waf-anfrage,
html[data-theme="light"] .cx-waf-sicht.block .cx-waf-sieht code,
html[data-theme="light"] .cx-waf-erklaerung code { color: #C0392B; }
html[data-theme="light"] .cx-waf-fall,
html[data-theme="light"] .cx-waf-rolle,
html[data-theme="light"] .cx-waf-frage-zeile,
html[data-theme="light"] .cx-waf-zeit-schritte span { background: var(--cx-white); }
html[data-theme="light"] .cx-waf-anfrage,
html[data-theme="light"] .cx-waf-sieht code,
html[data-theme="light"] .cx-waf-erklaerung code,
html[data-theme="light"] .cx-waf-ebene,
html[data-theme="light"] .cx-waf-zeit-zeile { background: #F4F6F9; }

@media (max-width: 860px) {
  .cx-waf-ausgang, .cx-waf-faelle, .cx-waf-sichten, .cx-waf-betrieb {
    grid-template-columns: 1fr;
  }
}
@media (max-width: 620px) {
  .cx-waf-frage-zeile { grid-template-columns: 1fr; gap: 2px; }
  .cx-waf-haus { margin-left: -8px; margin-right: -8px; }
}

/* --- Produktseite: Anreicherung ab 1.17 -----------------------------------
   Alle Bausteine sind optional. Ein Produkt ohne die neuen Felder rendert
   genau wie vorher – deshalb steht hier nichts, was den Bestand verändert. */

/* Einordnungsband direkt unter dem Kopf: sagt in einer Zeile, was für ein
   Ding das ist. Der erste Chip ist hervorgehoben (die Produktrolle), der Rest
   ist Beiwerk – dieselbe Optik wie die Filter-Chips, nur nicht klickbar. */
.cx-p-einordnung { margin-top: 4px; margin-bottom: 4px; }
.cx-p-einordnung .cx-chip { cursor: default; }
.cx-p-einordnung .cx-chip:hover { border-color: var(--cx-border); color: var(--cx-muted); }
.cx-p-einordnung .cx-chip.active:hover { color: var(--cx-white); }

/* „Was die Lösung abdeckt“ und „Worauf du achten solltest“ stehen nebeneinander
   in cx-two-col.
   Die Aufzählung ist enger gesetzt als Fließtext – es sind Stichpunkte, keine
   Absätze, und beide Karten sollen auf gleicher Höhe enden. */
.cx-p-liste { margin: 0; padding-left: 18px; }
.cx-p-liste li { margin-bottom: 7px; color: var(--cx-muted); line-height: 1.55; }
.cx-p-liste li:last-child { margin-bottom: 0; }

/* Betriebstabelle: schmale Merkmalsspalte, damit die Werte auf einer Kante
   beginnen. Ohne feste Breite rutscht sie je nach längstem Begriff. */
.cx-p-betrieb td:first-child {
  width: 210px; font-weight: 600; color: var(--cx-text);
}
@media (max-width: 620px) {
  .cx-p-betrieb td:first-child { width: 40%; }
}

/* Funktionsklasse über der Vergleichstabelle. Sie erklärt, warum dort nicht
   mehr der ganze Bereich steht – ohne diesen Satz wirkt die kurze Liste wie
   ein Datenfehler. */
.cx-p-klasse { margin-top: -2px; margin-bottom: 14px; }

/* Alternativen-Tabelle: die Abgrenzung ist der eigentliche Inhalt und bekommt
   den Platz. Hersteller und Produkt bleiben schmal und umbruchsicher. */
.cx-p-alternativen th:first-child, .cx-p-alternativen td:first-child { width: 130px; }
.cx-p-alternativen th:nth-child(2), .cx-p-alternativen td:nth-child(2) { width: 235px; }
.cx-p-alternativen td:last-child { line-height: 1.55; }

/* Der eingeklappte Rest derselben Funktionsklasse. */
.cx-p-weitere { margin-top: 18px; }
.cx-p-weitere > summary {
  cursor: pointer; color: var(--cx-blue); font-weight: 600; font-size: 14.5px;
  padding: 8px 0; list-style: none;
}
.cx-p-weitere > summary::-webkit-details-marker { display: none; }
.cx-p-weitere > summary::before {
  content: '▸'; display: inline-block; margin-right: 8px;
  transition: transform .15s;
}
.cx-p-weitere[open] > summary::before { transform: rotate(90deg); }
.cx-p-weitere > summary:hover { color: var(--cx-accent); }
/* Hell: dieselbe Tiefblau-Regel wie bei den übrigen Links. --cx-blue kommt auf
   der hellen Fläche nur auf 3,81:1 und liegt damit unter der Lesbarkeitsgrenze;
   --cx-blue-deep erreicht 6,10:1. */
html[data-theme="light"] .cx-p-weitere > summary { color: var(--cx-blue-deep); }
.cx-p-weitere .cx-table { margin-top: 10px; }

@media (max-width: 860px) {
  .cx-p-alternativen th:first-child, .cx-p-alternativen td:first-child,
  .cx-p-alternativen th:nth-child(2), .cx-p-alternativen td:nth-child(2) { width: auto; }
}

/* ===================== Sichtprobe ========================================
   Der Betreiber sieht die Seite mit den Augen eines anderen Kontos. Zwei
   Dinge muss die Gestaltung leisten, sonst wird die Funktion gefährlich:

   1. UNÜBERSEHBAR. Wer vergisst, dass er fremd unterwegs ist, hält fehlende
      interne Daten für einen Fehler der Seite – und meldet ihn. Das Band
      steht deshalb über allem, klebt beim Scrollen mit und trägt eine Farbe,
      die sonst nirgends vorkommt.
   2. NICHT ALS ALARM. Es ist kein Fehler, sondern ein Betriebszustand.
      Bernstein statt Rot, dieselbe Überlegung wie bei --cx-warn im
      Direktvergleich. */

.cx-sicht-band {
  /* Klebt direkt unter der Kopfzeile und bleibt darunter: über dem Inhalt,
     aber nicht über der Leiste (die liegt auf 50). */
  position: sticky; top: var(--cx-kopf); z-index: 45;
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  padding: 9px clamp(14px, 4vw, 34px);
  /* Die einfachen Werte stehen zuerst als Rückfall: color-mix() kennen ältere
     Browser nicht, und ein Band ohne Hintergrund wäre genau das Gegenteil
     dessen, was es leisten soll. */
  background: #F1E6CE;
  background: color-mix(in srgb, var(--cx-warn) 16%, var(--cx-graphite));
  border-bottom: 1px solid #C9A24A;
  border-bottom-color: color-mix(in srgb, var(--cx-warn) 55%, transparent);
  color: var(--cx-text); font-size: 13px; line-height: 1.45;
}
.cx-sicht-marke {
  flex: none; padding: 3px 9px; border-radius: 999px;
  background: var(--cx-warn); color: #14171C;
  font-size: 10.5px; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase;
}
.cx-sicht-text { flex: 1 1 260px; min-width: 0; }
.cx-sicht-text em { font-style: normal; font-weight: 600; }
.cx-sicht-knoepfe { flex: none; display: flex; gap: 8px; flex-wrap: wrap; }
.cx-sicht-knopf {
  font: inherit; font-size: 12px; cursor: pointer;
  padding: 5px 12px; border-radius: 999px;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid #C9A24A;
  border-color: color-mix(in srgb, var(--cx-warn) 60%, transparent);
  transition: background .15s, border-color .15s;
}
.cx-sicht-knopf:hover { background: var(--cx-carbon); }
.cx-sicht-knopf.zurueck {
  background: var(--cx-text); color: var(--cx-graphite); border-color: var(--cx-text);
}
.cx-sicht-knopf.zurueck:hover { opacity: .88; }

/* Der Punkt in der Konto-Kachel, solange die Probe läuft. */
.cx-konto-punkt.probe {
  background: var(--cx-warn);
  box-shadow: 0 0 0 3px rgba(229, 168, 59, .22);
}

/* --- Auswahlfenster --- */
.cx-sicht-dialog { width: min(560px, calc(100vw - 32px)); padding: 0; overflow: hidden; }
.cx-sicht-kopf {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 16px 18px 12px; border-bottom: 1px solid var(--cx-border);
}
.cx-sicht-kopf h3 { margin: 0; font-size: 17px; }
.cx-sicht-hinweis {
  margin: 0; padding: 12px 18px; font-size: 12.5px; line-height: 1.5;
  color: var(--cx-text-muted); background: var(--cx-carbon);
  border-bottom: 1px solid var(--cx-border);
}
.cx-sicht-feld {
  display: block; width: calc(100% - 36px); margin: 14px 18px 8px;
  box-sizing: border-box; padding: 9px 12px; font: inherit; font-size: 14px;
  background: var(--cx-carbon); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-sicht-feld:focus { outline: none; border-color: var(--cx-blue); }
.cx-sicht-liste { max-height: min(48vh, 420px); overflow-y: auto; padding: 4px 10px 14px; }
.cx-sicht-eintrag {
  display: grid; gap: 2px; width: 100%; text-align: left; cursor: pointer;
  padding: 9px 11px; border: 1px solid transparent;
  border-radius: var(--cx-radius-sm); background: none; color: var(--cx-text);
  font: inherit;
}
.cx-sicht-eintrag:hover, .cx-sicht-eintrag:focus-visible {
  background: var(--cx-carbon); border-color: var(--cx-border); outline: none;
}
.cx-sicht-eintrag.gast { border-bottom: 1px solid var(--cx-border); border-radius: 0; margin-bottom: 6px; }
.cx-sicht-eintrag.gesperrt .cx-sicht-mail { text-decoration: line-through; }
.cx-sicht-mail { font-size: 14px; font-weight: 600; }
.cx-sicht-meta { font-size: 12px; color: var(--cx-steel); }
.cx-sicht-leer { margin: 10px 11px; font-size: 13px; color: var(--cx-steel); }

@media (max-width: 700px) {
  .cx-sicht-band { font-size: 12.5px; gap: 10px; }
  .cx-sicht-knoepfe { width: 100%; }
}

/* ===================== Neuigkeiten in der Konto-Kachel ====================
   Zwei Dinge warten auf eine Entscheidung des Betreibers: ein Konto, das
   freigeschaltet werden will, und eine Zugangsanfrage von der Startseite.
   Beides löst eine Mail aus – aber eine Mail kann im Spam landen, und dann
   wartet jemand tagelang, ohne dass es auffällt.

   Deshalb dieselbe Farbe wie bei der Sichtprobe: Bernstein für „hier wartet
   etwas“, kein Rot. Ein Kontoantrag ist kein Fehler. */

#konto-neues { display: contents; }   /* der Wrapper soll das Grid nicht stören */
.cx-konto-neues {
  display: grid; gap: 7px;
  padding-top: 12px; border-top: 1px solid var(--cx-border);
}
.cx-neues-zeile {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 8px; margin: 0 -8px;
  border-radius: var(--cx-radius-sm);
  color: var(--cx-text); text-decoration: none;
  transition: background .15s;
}
.cx-neues-zeile:hover { background: var(--cx-carbon); }
.cx-neues-zahl {
  flex: none; min-width: 22px; height: 22px; padding: 0 6px;
  display: grid; place-items: center;
  border-radius: 999px; background: var(--cx-warn); color: #14171C;
  font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums;
}
.cx-neues-text { font-size: 12.5px; line-height: 1.35; }
.cx-neues-text em {
  display: block; font-style: normal; font-size: 11.5px; color: var(--cx-steel);
}
.cx-neues-nichts { font-size: 12.5px; color: var(--cx-steel); }

/* --- Hinterlassene Nachrichten (1.63.0) ------------------------------------
   Die Zeilen darüber sind GERECHNET („2 Konten warten"); hier steht, was ein
   Mensch GESCHRIEBEN hat. Deshalb sehen sie anders aus: eigener Grund, kein
   Zähler, dafür ein Knopf zum Wegklicken. Ein Hinweis, den jemand getippt hat,
   soll nicht wie eine Systemmeldung wirken – man liest ihn sonst als Zahl. */
.cx-neues-nachricht {
  display: grid; gap: 5px;
  padding: 9px 10px; margin: 0 -2px;
  border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-neues-woher {
  display: flex; align-items: baseline; gap: 7px;
  font-size: 10.5px; letter-spacing: .05em; text-transform: uppercase;
  color: var(--cx-blue-light); font-weight: 600;
}
html[data-theme="light"] .cx-neues-woher { color: var(--cx-blue-deep); }
.cx-neues-woher em {
  font-style: normal; letter-spacing: 0; text-transform: none;
  font-weight: 400; color: var(--cx-steel);
}
/* Die Nachricht selbst ist der Inhalt und darf umbrechen, so lang sie ist –
   500 Zeichen sind vier Zeilen, und abzuschneiden hieße, den Sinn zu
   verstecken. */
.cx-neues-nachricht p {
  margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--cx-text);
  overflow-wrap: anywhere;
}
.cx-neues-quitt {
  justify-self: start; margin-top: 2px;
  padding: 3px 11px; border-radius: 999px; cursor: pointer;
  background: transparent; border: 1px solid var(--cx-border);
  color: var(--cx-text-muted); font: 600 11.5px/1.5 var(--cx-font-body);
}
.cx-neues-quitt:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-neues-quitt:disabled { opacity: .45; cursor: default; }

/* Die Aufforderung zum Passwortwechsel ist keine Nachricht, sondern ein
   Zustand des Kontos – sie lässt sich nicht wegklicken und steht deshalb
   ohne Knopf, aber mit dem Warnton der übrigen offenen Punkte. */
.cx-neues-pw { border-left: 3px solid var(--cx-warn); padding-left: 9px; }
.cx-neues-pw strong { color: var(--cx-text); }

/* ═══════════════════════════════ Business Units und Konto-Blatt (1.45.0) ═══ */

/* Anklickbare Zeile in der Kontenliste. Der Pfeil sitzt am ZEILENENDE und
   nicht hinter der Mailadresse – dort bricht er bei langen Adressen um. */
.cx-table-klick tbody tr { cursor: pointer; }
.cx-table-klick tbody tr:hover,
.cx-table-klick tbody tr:focus-visible { background: rgba(30, 123, 232, .09); }
.cx-table-klick tbody tr:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: -2px; }
.cx-table-klick tbody td:last-child { position: relative; padding-right: 24px; }
.cx-table-klick tbody td:last-child::after {
  content: "›"; position: absolute; right: 8px; top: 50%;
  transform: translateY(-50%); opacity: .4; font-weight: 700; font-size: 17px;
}
/* Ein freigeschaltetes Konto, in dem nie jemand war – das soll auffallen. */
/* DIE KURSIVE TRÄGT DIE ZURÜCKNAHME, NICHT DIE DECKKRAFT (1.177.2). Mit
   opacity: .55 stand „noch nie" bei 3,83:1 (dunkel) und 2,88:1 (hell) –
   ausgerechnet die Auskunft, dass sich jemand noch nie angemeldet hat.
   Dieselbe Falle wie bei .cx-pflege-offen, im selben Lauf gefunden. */
.cx-nie { color: var(--cx-steel); font-style: italic; }

.cx-zurueck { font-size: 13.5px; opacity: .75; margin: 0 0 6px; }
.cx-klein   { display: block; font-size: 12.5px; opacity: .62; margin-top: 2px; }

.cx-konto-stamm {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 16px 24px; padding: 0 0 20px; border-bottom: 1px solid var(--cx-border);
}
.cx-konto-stamm label {
  display: block; font-size: 11.5px; letter-spacing: .07em;
  text-transform: uppercase; opacity: .55; margin: 0 0 6px;
}
.cx-konto-fest { font-size: 15px; padding-top: 4px; }

/* Woher die Rechte kommen: geerbt oder eigens gesetzt. */
.cx-erbzeile {
  display: flex; flex-wrap: wrap; gap: 12px 26px;
  padding: 14px 16px; margin: 0 0 18px; font-size: 14.5px;
  border: 1px solid var(--cx-border); border-left: 4px solid #E8A31E;
  border-radius: 10px;
}
.cx-erbzeile label { display: flex; gap: 8px; align-items: flex-start; cursor: pointer; }
.cx-erbzeile input { margin-top: 3px; flex: 0 0 auto; }

.cx-hakenraster {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
  gap: 2px 30px;
}
.cx-haken {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 10px 0; border-bottom: 1px solid var(--cx-border); font-size: 14.5px;
}
.cx-haken input { margin-top: 3px; flex: 0 0 auto; accent-color: var(--cx-blue); }
/* Gilt die Vorgabe der Einheit, sind die Haken nicht bedienbar – aber der
   Zustand MUSS sichtbar bleiben. Ein disabled-Kästchen zeichnet der Browser
   im dunklen Modus so blass, dass angehakt und leer gleich aussehen. */
.cx-haken-aus { opacity: .72; pointer-events: none; }

/* Breite Tabellen scrollen in sich selbst statt die ganze Seite zu kippen. */
.cx-scroll-x { overflow-x: auto; }
.cx-scroll-x table.cx-table { min-width: 860px; }
/* Dasselbe ohne Mindestbreite (seit 1.156.0): Die Tabelle scrollt erst, wenn
   sie wirklich nicht passt – auf dem Telefon –, statt schon bei 860 px. */
.cx-scroll-weich { overflow-x: auto; }

/* --- Was ein Konto pflegen darf (Konto-Blatt, seit 1.161.0) ----------------
   Links die Freigaben des Betreibers als Zeilen mit Kippschalter, rechts, was
   daraus folgt. Schmal untereinander. Die Schalter sind .cx-schalter vom
   Teilen des Portfolios – dieselbe Bedienung, dasselbe Blau. */
.cx-pflegerecht-raster {
  display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  gap: 18px 26px; align-items: start;
}
@media (max-width: 900px) { .cx-pflegerecht-raster { grid-template-columns: 1fr; } }
.cx-pflegerecht {
  border: 1px solid var(--cx-border); border-radius: 12px; padding: 4px 18px 6px;
}
.cx-pflegerecht-zeile {
  display: flex; gap: 18px; align-items: center; justify-content: space-between;
  padding: 13px 0; border-bottom: 1px solid var(--cx-border);
}
.cx-pflegerecht-zeile:last-child { border-bottom: 0; }
.cx-pflegerecht-zeile b { font-size: 15px; }
.cx-pflegerecht-zeile p { margin: 3px 0 0; font-size: 13px; line-height: 1.5; color: var(--cx-steel); }
.cx-pflegerecht-zeile .cx-schalter-wort { min-width: 30px; }
/* Das Basisrecht: kein Schalter, ein fester Haken – nicht abwählbar. */
.cx-pflegerecht-fest {
  justify-content: flex-start; margin: 10px -8px 6px; padding: 11px 10px;
  border: 0; border-radius: 8px;
  background: color-mix(in srgb, var(--cx-blue) 10%, transparent);
}
.cx-pflegerecht-marke {
  flex: none; width: 22px; text-align: center; font-weight: 700; color: var(--cx-accent);
}
/* Hängt an der Firma: eingerückt, damit man die Abhängigkeit sieht. */
.cx-pflegerecht-unter { padding-left: 20px; }
.cx-pflegerecht-bus {
  margin: 0 0 12px; padding: 6px 14px 2px;
  border: 1px dashed var(--cx-border); border-radius: 8px;
}
.cx-pflegerecht-bus legend {
  padding: 0 6px; font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--cx-steel);
}
.cx-pflegerecht-bus .cx-haken:last-child { border-bottom: 0; }
@media (max-width: 520px) {
  /* Schalter unter den Text – außer beim Basisrecht: Dort steht der Haken
     vor dem Text und soll dort bleiben. */
  .cx-pflegerecht-zeile:not(.cx-pflegerecht-fest) { flex-direction: column; align-items: flex-start; }
}

/* Der wirksame Pflegebereich: die Firma oben, ihre Business Units darunter. */
.cx-pfb { border: 1px solid var(--cx-border); border-radius: 12px; padding: 16px 18px; }
.cx-pfb h3 { margin: 0 0 14px; font-size: 15px; }
.cx-pfb-firma, .cx-pfb-knoten {
  display: flex; flex-direction: column; gap: 2px; text-align: center;
  padding: 9px 12px; border-radius: 10px;
  border: 1px dashed var(--cx-border); color: var(--cx-text-muted);
}
.cx-pfb-firma { max-width: 360px; margin: 0 auto; }
.cx-pfb-firma.an, .cx-pfb-knoten.an {
  border: 1px solid var(--cx-blue-knopf); color: var(--cx-text);
  background: color-mix(in srgb, var(--cx-blue) 12%, transparent);
}
.cx-pfb-name { font-weight: 600; font-size: 14px; }
.cx-pfb-art { font-size: 12px; color: var(--cx-steel); }
.cx-pfb-einheiten {
  list-style: none; position: relative;
  margin: 16px 0 0; padding: 16px 0 0; border-top: 1px solid var(--cx-border);
  display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;
}
.cx-pfb-einheiten::before {
  content: ''; position: absolute; top: -17px; left: 50%; height: 16px;
  border-left: 1px solid var(--cx-border);
}
.cx-pfb-knoten { flex: 0 1 190px; min-width: 0; }
.cx-pfb-satz { margin: 16px 0 0; font-size: 13.5px; line-height: 1.55; color: var(--cx-text-muted); }

/* Gruppierte Haken im Einheiten-Formular. */
.cx-fieldset {
  border: 1px solid var(--cx-border); border-radius: 12px;
  padding: 14px 18px 6px; margin: 18px 0;
}
.cx-fieldset legend {
  padding: 0 8px; font-size: 12.5px; letter-spacing: .06em;
  text-transform: uppercase; opacity: .7;
}

/* --- Kontoantrag: „Erkannt: Axians" --------------------------------------
   Eine Rückmeldung, keine Meldung: Sie bestätigt nur, dass die Domain zu einer
   hinterlegten Firma gehört, und steht deshalb ruhig da – grüner Balken links
   statt farbigem Kasten. Wer sich vertippt, sieht dass sie ausbleibt. */
.cx-reg-erkannt {
  margin: 14px 0 4px; padding: 9px 14px; font-size: 14.5px;
  border-left: 3px solid var(--cx-accent); border-radius: 0 8px 8px 0;
  background: color-mix(in srgb, var(--cx-accent) 8%, transparent);
}

/* --- Erster Antrag einer Firma (seit 1.156.0) ------------------------------
   Im Formular steht statt der Rollenwahl eine Ansage. Blau wie die übrigen
   Hinweiskästen: Es ist eine Auskunft, keine Warnung. In der Antragsliste des
   Betreibers steht die Begründung als eigene Zeile unter dem Antrag; die Zeile
   darüber verliert dafür ihre Trennlinie, beide sind leicht getönt und lesen
   sich so als ein Eintrag. */
.cx-reg-erster {
  margin: 12px 0 4px; padding: 10px 14px; font-size: 14px; line-height: 1.55;
  border-left: 3px solid var(--cx-blue); border-radius: 0 8px 8px 0;
  background: rgba(30,123,232,.07); color: var(--cx-text-muted);
}
.cx-reg-erster strong { color: var(--cx-text); }
/* Die Anfrage im Antragsformular ist ein Kästchen (seit 1.156.1). Die Karte
   gestaltet jedes input als breites Feld und jedes label als Block – beides
   muss hier weichen, sonst steht das Kästchen als Balken über dem Text. */
.cx-login-card label.cx-check-zeile {
  display: flex; font-weight: 400; margin: 14px 0 4px;
}
.cx-login-card .cx-check-zeile input {
  width: auto; margin: 3px 0 0; padding: 0; border: 0; background: none;
}
/* Offene Anfragen auf der Kontenseite des Partner-Admins: eine Auskunft wie
   die übrigen blauen Kästen, nur kompakter, weil sie über einer Tabelle steht. */
.cx-fk-anfragen {
  margin: 4px 0 16px; padding: 10px 14px; font-size: 14px; line-height: 1.55;
  border-left: 3px solid var(--cx-blue); border-radius: 0 8px 8px 0;
  background: rgba(30,123,232,.07); color: var(--cx-text-muted);
}
.cx-fk-anfragen strong { color: var(--cx-text); }
/* Die Anfrage-Marke trägt einen blauen Rand – sie verlangt eine Entscheidung,
   anders als „wartet auf Freischaltung“. Die Schrift bleibt beim Stahlgrau. */
.cx-wunsch.cx-anfrage { border-color: var(--cx-blue); }
.cx-table tr.cx-mit-erster td { border-bottom: none; background: rgba(30,123,232,.05); }
.cx-table tr.cx-antrag-erster td {
  padding: 2px 14px 12px 12px; font-size: 13.5px; line-height: 1.55;
  font-weight: 400; color: var(--cx-text-muted); background: rgba(30,123,232,.05);
  box-shadow: inset 3px 0 0 var(--cx-blue);
}
.cx-table tr.cx-mit-erster td:first-child { box-shadow: inset 3px 0 0 var(--cx-blue); padding-left: 12px; }
/* Der lange Text darf die Spalten nicht verbreitern – sonst rutschen darüber
   „Freischalten“ und „Löschen“ untereinander. contain nimmt ihn aus der
   Breitenrechnung der Tabelle; auf Tabellenzellen selbst wirkt es nicht,
   deshalb sitzt es am inneren Block. */
.cx-table tr.cx-antrag-erster td > div { contain: inline-size; }
.cx-table tr.cx-antrag-erster td strong { color: var(--cx-text); }
.cx-table tr.cx-antrag-erster .cx-achtung { color: var(--cx-warn); }

/* Sammel-Anlage der Einheiten: das Feld für die Liste aus der Mail. Feste
   Schriftbreite, weil untereinanderstehende Zeilen so als Liste lesbar sind
   und nicht als Fließtext. */
.cx-sammel textarea {
  width: 100%; min-height: 130px; resize: vertical;
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 14px; line-height: 1.6;
}

/* Hinweis im Steckbrief, welche Abschnitte das eigene Konto nicht sieht.
   Zurückhaltend: Es ist eine Fußnote zum Block, keine Warnung – gesperrt zu
   sein ist der eingestellte Normalfall und kein Fehler.

   NICHT .cx-gesperrt nennen, die Klasse ist oben schon vergeben: Sie trägt den
   großen Sperrkasten für Gäste („anmelden, um das zu sehen“). Ein zweiter
   Block mit demselben Namen hätte dessen Innenabstand, Rahmen und Schriftgröße
   überschrieben – und die Sperrseite für alle Besucher entstellt. */
.cx-nicht-frei {
  margin: 18px 0 0; padding: 8px 0 0; font-size: 13.5px;
  color: var(--cx-steel); border-top: 1px dashed var(--cx-border);
  max-width: var(--cx-lesebreite);
}

/* Wunschrolle in der Antragsliste – ein Wunsch, keine Tatsache, deshalb
   kleiner und in Anführungszeichen gesetzter Ton statt Abzeichen-Optik. */
.cx-wunsch {
  display: inline-block; margin-left: 8px; padding: 1px 8px;
  font-size: 12.5px; border: 1px dashed var(--cx-border); border-radius: 999px;
  color: var(--cx-steel);
  /* Seit neben ihr die Rollenwahl steht (1.155.1), rutscht sie in schmalen
     Fenstern darunter – als Ganzes, statt in der Pille umzubrechen. */
  white-space: nowrap;
}
/* Unter den aktiven Konten steht die Marke UNTER der Rolle (1.155.1). Neben
   ihr machte sie die Spalte so breit, dass Datum und Adressen umbrachen. */
/* display: block mit fit-content statt display: table – eine Tabelle erbte in
   der Kontenliste border-collapse: collapse und verlor damit ihren Innenabstand;
   der Text klebte am Rand (gefunden 1.156.1). */
.cx-wunsch.cx-wunsch-unter { display: block; width: fit-content; margin: 4px 0 0; }

/* ===================================================================
   FIDO, FIDO2 und FIPS (Know-How)
   Eigenes Präfix cx-fido-, weil die Seite Bausteine braucht, die es so
   noch nicht gab: die zeilenweise Gegenüberstellung und die Stufenleiter.
   Alles Übrige – Tabellen, Flussdiagramm, Kernaussage, Warnkasten –
   greift bewusst auf die vorhandenen cx-zert-Klassen zurück; ein zweites
   Aussehen für dieselbe Sache wäre nur Pflegeaufwand.
   =================================================================== */

/* --- Die Gegenüberstellung FIDO / FIPS --- */
/* Zwei Spalten, die auf dem Handy untereinander rutschen. Der farbige
   Streifen oben ist der einzige Unterschied zwischen beiden Karten –
   sie sollen sich gleichen, damit der INHALT den Unterschied macht. */
.cx-fido-gegenueber {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 18px;
}
.cx-fido-gegen { padding: 20px 22px; border-top: 3px solid var(--cx-border); }
.cx-fido-gegen.fido { border-top-color: var(--cx-accent); }
.cx-fido-gegen.fips { border-top-color: var(--cx-warn); }
.cx-fido-gegen-kopf { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.cx-fido-gegen-kurz { font-size: 22px; font-weight: 800; letter-spacing: .02em; }
.cx-fido-gegen.fido .cx-fido-gegen-kurz { color: var(--cx-accent); }
.cx-fido-gegen.fips .cx-fido-gegen-kurz { color: var(--cx-warn); }
.cx-fido-gegen-lang { font-size: 13px; color: var(--cx-steel); }
.cx-fido-gegen-frage {
  margin: 12px 0 16px; font-size: 17px; font-weight: 600; line-height: 1.4;
}
.cx-fido-gegen-liste { margin: 0; display: grid; gap: 10px; }
.cx-fido-gegen-liste dt {
  font-size: 11.5px; font-weight: 700; letter-spacing: .05em;
  text-transform: uppercase; color: var(--cx-steel);
}
.cx-fido-gegen-liste dd { margin: 2px 0 0; font-size: 14px; line-height: 1.55; }
.cx-fido-gegen-beispiel {
  margin: 16px 0 0; padding-top: 12px; border-top: 1px solid var(--cx-border);
  font-size: 13.5px; color: var(--cx-text-muted); font-style: italic;
}

/* --- Die Phishing-Kette und die Nachteile der FIPS-Ausführung --- */
.cx-fido-kette {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 14px; margin-top: 18px;
}
.cx-fido-kette-glied { padding: 16px 18px; }
.cx-fido-kette-glied b { display: block; margin-bottom: 6px; font-size: 15px; }
.cx-fido-kette-glied p { margin: 0; font-size: 14px; line-height: 1.55; }
.cx-fido-loesung {
  padding: 18px 20px; border-left: 3px solid var(--cx-accent); margin-top: 16px;
}
.cx-fido-loesung p { margin: 0; font-size: 15px; line-height: 1.6; }

/* --- Zeitleiste der FIDO-Familie --- */
/* Die Jahreszahl steht in einer eigenen schmalen Spalte, damit die Karten
   links bündig beginnen. Ohne feste Spalte würde jede Karte anders
   einrücken, sobald eine Jahreszahl vierstellig und die nächste kürzer ist. */
.cx-fido-zeitleiste { display: grid; gap: 12px; margin-top: 18px; }
.cx-fido-station { display: grid; grid-template-columns: 74px 1fr; gap: 14px; align-items: start; }
.cx-fido-jahr {
  padding-top: 16px; font-size: 17px; font-weight: 800; color: var(--cx-steel);
  text-align: right;
}
.cx-fido-station-karte { padding: 16px 18px; }
.cx-fido-station-karte b { font-size: 16px; }
.cx-fido-station-karte p { margin: 8px 0 0; font-size: 14px; line-height: 1.6; }
.cx-fido-status {
  display: inline-block; margin-left: 10px; padding: 2px 9px; border-radius: 99px;
  font-size: 11.5px; font-weight: 600; background: rgba(100,112,125,.14);
  color: var(--cx-steel);
}

/* --- WebAuthn und CTAP2 nebeneinander --- */
.cx-fido-teile {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 18px 0;
}
.cx-fido-teil { padding: 18px 20px; }
.cx-fido-teil > b { font-size: 18px; }
.cx-fido-teil-lang { display: block; margin: 2px 0 14px; font-size: 13px; color: var(--cx-steel); }
.cx-fido-teil > p { margin: 12px 0 0; font-size: 14px; line-height: 1.6; }
.cx-fido-protokoll {
  display: inline-block; margin-top: 6px; padding: 1px 8px; border-radius: 99px;
  font-size: 11px; font-weight: 700; letter-spacing: .04em;
  background: rgba(15,118,110,.13); color: var(--cx-accent);
}

/* --- Registrierung und Anmeldung nebeneinander --- */
.cx-fido-doppel { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 18px 0 26px; }
.cx-fido-halb { display: grid; gap: 12px; align-content: start; }
.cx-fido-halb h3 { margin: 0 0 4px; font-size: 17px; }
/* Kein Einzug für die Nummer: .cx-zert-nr ist inline-flex und steht damit im
   Fluss über dem Titel, nicht absolut positioniert daneben. */
.cx-fido-schritt { padding: 14px 16px; }
.cx-fido-schritt b { display: block; margin-bottom: 5px; font-size: 14.5px; }
.cx-fido-schritt p { margin: 0; font-size: 13.5px; line-height: 1.55; }

/* --- Das Origin-Binding-Bild --- */
.cx-fido-bild { margin: 20px 0; }
.cx-fido-bild svg { width: 100%; height: auto; }
.cx-fido-weg rect { fill: none; stroke: var(--cx-border); stroke-width: 1.5; }
.cx-fido-weg text {
  fill: var(--cx-text); font-size: 15px; font-weight: 600; text-anchor: middle;
}
.cx-fido-weg text.klein { fill: var(--cx-steel); font-size: 12px; font-weight: 400; }
.cx-fido-weg .pfeil { stroke: var(--cx-steel); stroke-width: 1.5; marker-end: none; }
.cx-fido-weg.gut rect { stroke: var(--cx-accent); }
.cx-fido-weg.gut .cx-fido-ziel rect { fill: rgba(15,118,110,.12); }
.cx-fido-weg.gut .cx-fido-ziel text { fill: var(--cx-accent); }
.cx-fido-weg.schlecht rect { stroke: var(--cx-warn); stroke-dasharray: 5 4; }
.cx-fido-weg.schlecht .cx-fido-ziel rect { fill: rgba(229,168,59,.14); stroke-dasharray: none; }
.cx-fido-weg.schlecht .cx-fido-ziel text { fill: var(--cx-warn); }
.cx-fido-notiz { fill: var(--cx-steel); font-size: 13px; text-anchor: middle; font-style: italic; }

/* --- Passkeys: die zwei Sorten --- */
.cx-fido-sorten { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 18px; }
.cx-fido-sorte { padding: 18px 20px; }
.cx-fido-sorte.gebunden { border-left: 3px solid var(--cx-accent); }
.cx-fido-sorte.synchronisiert { border-left: 3px solid var(--cx-steel); }
.cx-fido-sorte > b { display: block; margin-bottom: 12px; font-size: 17px; }
.cx-fido-sorte .cx-zert-marke { background: rgba(100,112,125,.14); color: var(--cx-steel); }
/* 4,23:1 im hellen Modus – dieselbe Rechnung wie bei .cx-fido-status. */
html[data-theme="light"] .cx-fido-sorte .cx-zert-marke { color: var(--cx-text-muted); }
.cx-fido-plus, .cx-fido-minus {
  margin: 0 0 10px; padding-left: 22px; position: relative;
  font-size: 14px; line-height: 1.55;
}
.cx-fido-plus > span, .cx-fido-minus > span {
  position: absolute; left: 0; top: 0; font-weight: 800;
}
.cx-fido-plus > span { color: var(--cx-accent); }
.cx-fido-minus > span { color: var(--cx-warn); }
.cx-fido-eignung { margin: 12px 0 0; font-size: 13.5px; color: var(--cx-text-muted); }
.cx-fido-neu { padding: 18px 20px; margin-top: 16px; }
.cx-fido-neu b { display: block; margin-bottom: 8px; font-size: 15.5px; }
.cx-fido-neu p { margin: 0 0 8px; font-size: 14px; line-height: 1.6; }

/* --- Die Stufenleitern (FIDO L1–L3+ und FIPS 140-3 Level 1–4) --- */
/* Bewusst dieselbe Darstellung für beide, obwohl der Text davor warnt, sie
   zu verwechseln: Erst wenn man sieht, wie ähnlich zwei Zahlenreihen
   aussehen können, versteht man, warum die Verwechslung so verbreitet ist.
   Der Farbverlauf über --stufe macht die Steigerung sichtbar, ohne dass
   je Stufe eine eigene Klasse gepflegt werden müsste. */
.cx-fido-leiter { display: grid; gap: 10px; margin: 18px 0; }
.cx-fido-sprosse {
  display: grid; grid-template-columns: 76px 1fr; gap: 16px; align-items: start;
  padding: 14px 18px; border-radius: 10px;
  border: 1px solid var(--cx-border);
  background: color-mix(in srgb, var(--cx-accent) calc(var(--stufe) * 9%), var(--cx-graphite));
}
.cx-fido-sprosse-nr {
  font-size: 19px; font-weight: 800; color: var(--cx-accent); text-align: center;
  padding-top: 1px;
}
.cx-fido-sprosse-text b { display: block; margin-bottom: 5px; font-size: 15px; }
.cx-fido-sprosse-text p { margin: 0; font-size: 14px; line-height: 1.55; }
.cx-fido-sprosse-bsp {
  display: block; margin-top: 7px; font-size: 13px; color: var(--cx-steel);
  font-style: italic;
}

/* --- Die FIPS-Nummernserie --- */
/* Nur eine der Nummern ist prüfbar. Diese Zeile bekommt einen Rahmenakzent,
   damit sie beim Überfliegen der Tabelle nicht untergeht – sie ist der
   einzige Grund, warum die Tabelle überhaupt da steht. */
.cx-fido-nummern tr.ist-pruefbar td { background: rgba(15,118,110,.07); }
.cx-fido-nummern tr.ist-pruefbar td:first-child { box-shadow: inset 3px 0 0 var(--cx-accent); }
.cx-fido-marke {
  display: inline-block; margin-left: 6px; padding: 1px 8px; border-radius: 99px;
  font-size: 10.5px; font-weight: 700; letter-spacing: .04em;
  background: rgba(15,118,110,.15); color: var(--cx-accent);
}
.cx-fido-genau { padding: 18px 20px; margin-top: 16px; border-left: 3px solid var(--cx-accent); }
.cx-fido-genau b { display: block; margin-bottom: 8px; font-size: 15.5px; }
.cx-fido-genau p { margin: 0 0 10px; font-size: 14px; line-height: 1.6; }

/* --- Die Frist zum 21.09.2026 --- */
.cx-fido-frist { padding: 20px 22px; display: grid; gap: 2px; margin-top: 18px; }
.cx-fido-frist-zeile {
  display: grid; grid-template-columns: 168px 1fr; gap: 16px; align-items: baseline;
  padding: 12px 0; border-bottom: 1px solid var(--cx-border);
}
.cx-fido-frist-zeile:last-child { border-bottom: none; }
.cx-fido-frist-wann { font-size: 14.5px; font-weight: 700; color: var(--cx-steel); }
.cx-fido-frist-was { font-size: 14.5px; line-height: 1.55; }
.cx-fido-frist-zeile.letzte .cx-fido-frist-wann { color: var(--cx-warn); }
.cx-fido-frist-zeile.letzte .cx-fido-frist-was { font-weight: 600; }
.cx-fido-wahrheit { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 16px; }
.cx-fido-wahr { padding: 18px 20px; }
.cx-fido-wahr.wahr { border-left: 3px solid var(--cx-accent); }
.cx-fido-wahr.unwahr { border-left: 3px solid var(--cx-warn); }
.cx-fido-wahr b { display: block; margin-bottom: 10px; font-size: 15.5px; }
.cx-fido-wahr ul { margin: 0; padding-left: 20px; display: grid; gap: 8px; }
.cx-fido-wahr li { font-size: 14px; line-height: 1.55; }

/* --- Die AAL-Stufen --- */
.cx-fido-aal {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 16px; margin-top: 18px;
}
.cx-fido-aal-karte { padding: 18px 20px; }
.cx-fido-aal-nr {
  display: inline-block; margin-bottom: 10px; padding: 3px 11px; border-radius: 99px;
  font-size: 13px; font-weight: 800; letter-spacing: .03em;
  background: rgba(15,118,110,.14); color: var(--cx-accent);
}
.cx-fido-aal-karte > b { display: block; margin-bottom: 8px; font-size: 15.5px; line-height: 1.4; }
.cx-fido-aal-karte > p { margin: 0 0 14px; font-size: 14px; line-height: 1.55; }
.cx-fido-knack { padding: 20px 22px; margin-top: 18px; border-left: 3px solid var(--cx-warn); }
.cx-fido-knack b { display: block; margin-bottom: 10px; font-size: 16px; }
.cx-fido-knack p { margin: 0 0 10px; font-size: 14.5px; line-height: 1.6; }
.cx-fido-folge { font-weight: 600; }

/* --- Braucht ein deutscher Kunde FIPS? --- */
.cx-fido-frage { padding: 22px 24px; margin-bottom: 18px; }
.cx-fido-antwort {
  margin: 6px 0 14px; font-size: 20px; font-weight: 800; color: var(--cx-accent);
}
.cx-fido-frage p:last-child { margin: 0; font-size: 15px; line-height: 1.6; }
.cx-fido-wege {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 14px; margin: 14px 0 18px;
}
.cx-fido-weg-karte { padding: 16px 18px; }
.cx-fido-weg-karte b { display: block; margin-bottom: 6px; font-size: 15px; }
.cx-fido-weg-karte p { margin: 0; font-size: 13.5px; line-height: 1.55; }

/* --- Anbietergruppen --- */
.cx-fido-gruppe { margin: 24px 0 12px; font-size: 17px; }

/* --- Handy --- */
@media (max-width: 860px) {
  .cx-fido-gegenueber, .cx-fido-teile, .cx-fido-doppel,
  .cx-fido-sorten, .cx-fido-wahrheit { grid-template-columns: 1fr; }
  .cx-fido-station { grid-template-columns: 56px 1fr; gap: 10px; }
  .cx-fido-jahr { font-size: 15px; padding-top: 15px; }
  .cx-fido-sprosse { grid-template-columns: 54px 1fr; gap: 10px; padding: 13px 15px; }
  .cx-fido-frist-zeile { grid-template-columns: 1fr; gap: 4px; }
}

/* ==== 1.50.0 · Bereiche als Marktzeilen ================================== */
/* Eine Zeile je Bereich: links Name und Zahlen, in der Mitte der Balken mit
   den stärksten Anbietern, rechts die Absprünge. Sortierung und Balkenlänge
   folgen der Herstellerzahl – der ganze Markt auf einer Bildschirmhöhe. */
.cx-mz-liste { display: flex; flex-direction: column; }
.cx-mz-zeile {
  display: grid; grid-template-columns: 300px 1fr 150px; gap: 16px;
  align-items: center; padding: 10px 12px;
  border-bottom: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-mz-zeile:hover { background: var(--cx-graphite); }
.cx-mz-kopf { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cx-mz-kopf > a {
  display: flex; align-items: center; gap: 9px;
  color: var(--cx-text); font-weight: 600; font-size: 14.5px; line-height: 1.35;
}
.cx-mz-kopf > a:hover { color: var(--cx-blue-light); }
.cx-mz-kopf .cx-bereich-zeichen { width: 30px; height: 30px; border-radius: 8px; }
.cx-mz-kopf .cx-bereich-zeichen svg { width: 17px; height: 17px; }
.cx-mz-zahl { font-size: 12px; color: var(--cx-steel); padding-left: 39px; }
.cx-mz-bett {
  position: relative; display: block; height: 48px;
  border: 1px solid var(--cx-border); border-radius: 10px;
  background: var(--cx-graphite); overflow: hidden;
}
.cx-mz-zeile:hover .cx-mz-bett { background: var(--cx-carbon); }
/* 1.58.3 – der Balken war kaum zu erkennen. Drei Ursachen, drei Antworten:
   Das Bett ist jetzt 48 px hoch statt 38. Das Logoplättchen misst 38 px
   (30 px Inhalt plus 2 × 4 px Innenabstand) und schloss damit vorher exakt
   bündig ab – oben und unten war vom Balken buchstäblich nichts zu sehen,
   er lugte nur links und rechts an den Plättchen vorbei. Jetzt stehen oben
   und unten je 5 px frei, und die Zeile liest sich als Balken.
   Der Verlauf lief nach rechts ins Nichts: im Dunkelmodus stand das
   Balkenende bei 1,27:1 gegen sein Bett, im hellen bei 1,15:1 – beides
   unterhalb der Wahrnehmungsschwelle. Jetzt 1,89:1 bzw. 1,70:1.
   Die Blautöne sind je Modus verschieden, weil ein Wert nicht beides kann:
   gegen das fast schwarze Bett trägt das helle Blau, gegen das weiße das
   tiefe. Ein gemeinsamer Ton hätte den einen Modus auf Kosten des anderen
   verbessert – gemessen: --cx-blue hätte hell von 2,38 auf 2,11 gedrückt.
   Die Kante am rechten Ende (4,5:1) macht die Länge exakt ablesbar. Ohne sie
   verläuft der Balken ins Ungefähre, und genau das Vergleichen der Bereiche
   ist der Zweck dieser Seite. */
.cx-mz-balken {
  position: absolute; inset: 0 auto 0 0; border-radius: 9px;
  background: linear-gradient(90deg, rgba(63, 169, 255, .48), rgba(63, 169, 255, .34));
  box-shadow: inset -2px 0 0 var(--cx-blue);
}
html[data-theme="light"] .cx-mz-balken {
  background: linear-gradient(90deg, rgba(13, 80, 216, .62), rgba(13, 80, 216, .32));
}
.cx-mz-logos {
  position: absolute; inset: 0; display: flex; align-items: center;
  gap: 6px; padding: 0 8px; overflow: hidden;
}
/* Logos stehen auf weißen Plättchen – auch im Dunkelmodus, Marken brauchen
   ihren hellen Grund. Fehlt ein Logo, übernimmt der Kurzname im Plättchen. */
.cx-mz-logo {
  flex: none; height: 30px; min-width: 44px; max-width: 74px;
  background: #fff; border-radius: 7px; padding: 4px 7px;
  display: inline-flex; align-items: center; justify-content: center;
}
.cx-mz-logo img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
.cx-mz-logo .cx-logo-ersatz {
  color: #14171C; font-size: 10.5px; font-weight: 700; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; max-width: 60px; padding: 0;
}
.cx-mz-mehr { font-size: 11.5px; color: var(--cx-steel); font-weight: 700; margin-left: 2px; }
.cx-mz-aktion {
  display: flex; flex-direction: column; gap: 3px; align-items: flex-end;
  font-size: 13.5px;
}
.cx-mz-leise { color: var(--cx-steel); font-weight: 400; font-size: 12.5px; }
.cx-mz-leise:hover { color: var(--cx-blue-light); }
.cx-mz-fuss { margin: 14px 4px 0; color: var(--cx-steel); font-size: 13px; max-width: 90ch; }

/* ==== 1.50.0 · Schwerpunkte in Gruppen =================================== */
/* Drei benannte Gruppen tragfähiger Schwerpunkte; Kleinst-Schlagworte stehen
   als Randnotizen unten – auffindbar, aber nicht gleichwertig. */
.cx-sp-gruppe { margin-top: 26px; }
.cx-sp-gruppe h2, .cx-sp-rand h2 { font-size: 19px; margin: 0 0 4px; }
.cx-sp-gruppe h2 em, .cx-sp-rand h2 em {
  font-style: normal; font-weight: 400; color: var(--cx-steel);
  font-size: 13.5px; margin-left: 8px;
}
.cx-sp-gruppe .cx-grid { margin-top: 12px; }
.cx-sp-note { margin: 0; font-size: 12.5px; color: var(--cx-steel); line-height: 1.5; }
/* Ausgeschriebene Bedeutung der Abkürzung, direkt unter der Überschrift.
   Bewusst --cx-text-muted statt --cx-steel wie beim Abgrenzungshinweis darunter:
   Diese Zeile ist für Einsteiger die WICHTIGSTE der Kachel und darf nicht die
   leiseste sein. Gerechnet statt geschätzt – dunkel 10,21 zu 1, hell 8,83 zu 1
   auf dem Kartengrund, beide weit über der Norm. */
.cx-sp-lang {
  margin: 0 0 2px; font-size: 13px; line-height: 1.5;
  color: var(--cx-text-muted);
}
.cx-sp-langgross {
  margin: 10px 0 9px; max-width: 92ch; font-size: 15px; line-height: 1.55;
  color: var(--cx-text-muted);
}
.cx-sp-rand { margin-top: 34px; padding-top: 20px; border-top: 1px solid var(--cx-border); }
.cx-sp-randtext { color: var(--cx-text-muted); font-size: 13.5px; margin: 0 0 12px; }
.cx-sp-randzeile { display: flex; flex-wrap: wrap; gap: 7px; }
.cx-sp-rchip {
  font-size: 12px; padding: 5px 11px; border-radius: 99px;
  border: 1px solid var(--cx-border); color: var(--cx-steel); font-weight: 500;
}
.cx-sp-rchip:hover { border-color: var(--cx-blue); color: var(--cx-text); }
/* 3,59:1 dunkel und 3,43:1 hell; der Chip wechselt beim Überfahren die
   Schriftfarbe, deshalb auch hier nur die Deckkraft weg. */
.cx-sp-rchip i { font-style: normal; margin-left: 4px; }

@media (max-width: 900px) {
  .cx-mz-zeile { grid-template-columns: 200px 1fr 120px; gap: 10px; }
}
@media (max-width: 720px) {
  .cx-mz-zeile { grid-template-columns: 1fr; gap: 7px; padding: 12px 10px; }
  .cx-mz-zahl { padding-left: 0; }
  .cx-mz-aktion { flex-direction: row; gap: 14px; align-items: center; justify-content: flex-start; }
}

/* ==== 1.52.0 · Steckbrief: eine Bahn von oben nach unten ==================

   Die Seite hatte bisher zwei Sorten Kästen: den Fließtext ohne Rahmen oben
   und die Karten-Paare unten. Dazwischen ein Raster aus Produktkacheln, in
   denen jeweils zwei Zeilen standen und alles Weitere hinter „Details →“ lag.

   Jetzt eine durchlaufende Bahn: volle Breite für das, was für die ganze
   Firma gilt (Positionierung, Pitch, Wettbewerb, Bezugsquellen), 1/3 zu 2/3
   für die Produkte, 50/50 für die Argumentenpaare. Kein Kasten schwebt allein
   in einer halben Zeile.

   Die Maße stehen hier zusammen und nicht verteilt, weil sie voneinander
   abhängen: Wer die Produktspalte ändert, verschiebt die Kachel daneben. */

.cx-sb-zeit, .cx-sb-pos, .cx-sb-prod, .cx-sb-mb { margin-top: 30px; }
.cx-sb-zeit h2, .cx-sb-pos h2, .cx-sb-prod h2, .cx-sb-mb h2 { font-size: 24px; margin-bottom: 14px; }
.cx-sb-prod h2 em {
  font-style: normal; font-weight: 400; color: var(--cx-steel);
  font-size: 14px; margin-left: 10px;
}

/* --- Herkunft & Übernahmen ---------------------------------------------
   Die Jahreszahl ist die Sprungmarke, der Text die Erklärung. Farbe trennt
   die beiden Richtungen: Wer selbst zukauft (blau), verhält sich anders am
   Markt als wer einem Investor gehört (orange). */
.cx-sb-zeit { margin-top: 26px; }
.cx-sb-zeit h2 { font-size: 19px; margin-bottom: 10px; }
.cx-sb-zb { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }
.cx-sb-zs {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  background: var(--cx-graphite); padding: 12px 14px 14px;
}
.cx-sb-zs b { font-family: var(--cx-font-display); font-size: 19px; color: var(--cx-accent); }
.cx-sb-zs.aktiv b  { color: var(--cx-blue-light); }
.cx-sb-zs.passiv b { color: var(--cx-warn); }
.cx-sb-zs p { margin: 5px 0 0; font-size: 13px; color: var(--cx-text-muted); line-height: 1.5; }
.cx-sb-zpfeil {
  display: inline-block; margin-top: 8px; font-size: 10.5px; letter-spacing: .06em;
  text-transform: uppercase; font-weight: 700; color: var(--cx-steel);
  border: 1px solid var(--cx-border); border-radius: 99px; padding: 2px 9px;
}
.cx-sb-zs.aktiv  .cx-sb-zpfeil { color: var(--cx-blue-light); border-color: rgba(63,169,255,.4); }
.cx-sb-zs.passiv .cx-sb-zpfeil { color: var(--cx-warn);       border-color: rgba(229,168,59,.45); }

/* --- Positionierung und Pitch, beide über die volle Breite ---------------
   Der Pitch war bisher ein 860 px breiter Kasten mit weißer Schrift auf
   vollem Blau. Er ist das Wichtigste auf der Seite und bekommt jetzt die
   ganze Breite – aber als heller blauer Grund mit normalem Text, weil vier
   Zeilen Weiß-auf-Blau anstrengend zu lesen sind. */
.cx-sb-pos p { font-size: 17px; margin: 0; color: var(--cx-text-muted); }
.cx-sb-pitch {
  margin-top: 18px; padding: 18px 22px;
  border: 1px solid rgba(30,123,232,.45); border-radius: var(--cx-radius);
  background: rgba(30,123,232,.11);
}
.cx-sb-pitchmarke {
  display: block; font-size: 11px; letter-spacing: .09em; text-transform: uppercase;
  font-weight: 700; color: var(--cx-blue-light);
}
.cx-sb-pitch p { margin: 9px 0 0; font-size: 19px; line-height: 1.55; color: var(--cx-text); }

/* Derselbe Kasten am Produkt (ab 1.75). Er steht auf der Produktseite
   zwischen den Chips und den beiden Textspalten und braucht Luft nach beiden
   Seiten. Eine Spur kleiner gesetzt als der Herstellerpitch: Er steht dort
   unter einer h1 und soll ihr nicht die Schau stehlen.

   Seit 1.76.1 nur noch dort. Die Regel für den Fall „erstes Element im Reiter
   der Produktkachel" ist mit dem Kasten selbst entfallen – auf der
   Herstellerseite erscheint er nicht mehr. */
.cx-p-pitch p { font-size: 18px; }
main > .cx-p-pitch { margin: 16px 0 4px; }

/* --- Produkte: links wählen, rechts steht alles dazu ---------------------
   1fr zu 2fr, nicht 300px zu 1fr: Die Namensspalte soll mitwachsen, sonst
   brechen lange Produktnamen auf breiten Schirmen dreizeilig um, während
   daneben Platz frei bleibt.

   Die Liste bleibt beim Scrollen stehen (sticky). Bei 55 Produkten – so viele
   hat Microsoft – wäre sie sonst längst aus dem Bild, wenn man unten in der
   Kachel liest und das nächste Produkt wählen will. Der Abstand nach oben ist
   die Höhe der fixierten Kopfzeile plus Luft. */
.cx-sb-teilung { display: grid; grid-template-columns: 1fr 2fr; gap: 18px; align-items: start; }
.cx-sb-liste {
  display: grid; gap: 6px; align-content: start;
  position: sticky; top: calc(var(--cx-kopf) + 14px);
  /* Die feste Obergrenze neben der Fensterhöhe ist kein Schönheitsmaß: Bei
     einem Vollseiten-Screenshot und beim Drucken setzt der Browser die
     Fensterhöhe auf die Dokumenthöhe – 100vh wird dann riesig, und die Liste
     klappt über die ganze Seite aus. Mit min() bleibt sie auch dort gedeckelt. */
  max-height: min(calc(100vh - var(--cx-kopf) - 28px), 860px);
  overflow: auto; padding-right: 2px;
}
.cx-sb-suche {
  width: 100%; padding: 9px 12px; border-radius: var(--cx-radius-sm);
  border: 1px solid var(--cx-border); background: var(--cx-carbon);
  color: var(--cx-text); font: 400 13.5px var(--cx-font-body); margin-bottom: 4px;
}
.cx-sb-suche:focus { outline: none; border-color: var(--cx-blue); }
/* Die Bereichszeile ist ein Klappknopf. Sie sieht aus wie eine Überschrift und
   verhält sich wie ein Schalter – deshalb der Pfeil davor, der die Richtung
   zeigt, und die Zahl dahinter, die sagt, was sich dahinter verbirgt. */
.cx-sb-gruppe {
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  font: 700 11px/1.4 var(--cx-font-body); letter-spacing: .07em; text-transform: uppercase;
  color: var(--cx-steel); padding: 12px 2px 5px; margin: 0;
  background: transparent; border: 0; cursor: pointer;
}
.cx-sb-gruppe:first-child { padding-top: 2px; }
.cx-sb-gruppe:hover { color: var(--cx-text); }
.cx-sb-gruppe::before {
  content: '▸'; font-size: 10px; letter-spacing: 0; flex: none;
  transition: transform .12s ease; transform-origin: 45% 50%;
}
.cx-sb-gruppe[aria-expanded="true"]::before { transform: rotate(90deg); }
.cx-sb-gruppe i {
  font-style: normal; margin-left: auto; letter-spacing: 0; font-size: 11px;
  color: var(--cx-steel); background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: 99px; padding: 1px 8px; flex: none;
}
/* Zugeklappt, obwohl der Filter hier Treffer hat: Die Zahl wird blau, damit
   niemand an einer Fundstelle vorbeiliest, nur weil sie zu ist. */
.cx-sb-gruppe.leer i { color: var(--cx-blue-light); border-color: var(--cx-blue); }
.cx-sb-eintrag {
  text-align: left; width: 100%; border: 1px solid var(--cx-border);
  background: var(--cx-graphite); color: var(--cx-text-muted);
  border-radius: var(--cx-radius-sm); padding: 11px 14px; cursor: pointer; font: inherit;
}
.cx-sb-eintrag b { display: block; font-size: 14px; color: var(--cx-text); line-height: 1.35; }
.cx-sb-eintrag span { font-size: 11.5px; color: var(--cx-steel); }
.cx-sb-eintrag:hover { border-color: var(--cx-blue); }
.cx-sb-eintrag.an { border-color: var(--cx-blue); background: rgba(30,123,232,.12); }
.cx-sb-eintrag.an b { color: var(--cx-blue-light); }
.cx-sb-eintrag.weg, .cx-sb-gruppe.weg { display: none; }
/* HELLER MODUS FÜR DIE AUSGEWÄHLTE PRODUKTKACHEL (1.178.1). --cx-blue-light
   (#3FA9FF) wird im hellen Modus nicht umdefiniert – auf dem blassblauen
   Kachelgrund stand der Produktname deshalb bei 2,00:1, die Klassenzeile
   darunter bei 4,01:1. Beide Ersatzfarben auf diesem Grund nachgerechnet:
   --cx-blue-deep 5,73:1, --cx-text-muted 8,37:1. --cx-steel reicht hier NICHT
   (4,35:1) – der Grund ist leicht eingefärbt und kostet den Rest. */
html[data-theme="light"] .cx-sb-eintrag.an b    { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-sb-eintrag.an span { color: var(--cx-text-muted); }
.cx-sb-mehr { cursor: default; border-style: dashed; }
.cx-sb-mehr:hover { border-color: var(--cx-border); }

.cx-sb-kachel {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite); padding: 22px 26px; min-width: 0;
}
.cx-sb-kkopf { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.cx-sb-kkopf h3 { font-family: var(--cx-font-display); font-size: 21px; margin: 0; }
.cx-sb-ktags { font-size: 12.5px; color: var(--cx-accent); font-weight: 600; }
.cx-sb-kzahl { margin-left: auto; font-size: 12px; color: var(--cx-steel); white-space: nowrap; }
.cx-sb-kbereich { font-size: 12.5px; color: var(--cx-steel); margin: 6px 0 4px; }
.cx-sb-kbereich a { margin-left: 10px; font-size: 12.5px; }

/* Reiter statt Untereinander: Ein angereichertes Produkt bringt Beschreibung,
   Nutzen, Merkmale, Grenzen, Betriebstabelle und Alternativen mit. Am Stück
   wäre die Kachel dreimal so hoch wie die Namensliste daneben – und der
   Vergleich zweier Produkte hieße wieder Scrollen statt Klicken. */
.cx-sb-reiter {
  display: flex; gap: 3px; border-bottom: 1px solid var(--cx-border);
  margin: 12px 0 4px; flex-wrap: wrap;
}
.cx-sb-reiter button {
  border: 0; background: transparent; color: var(--cx-steel); cursor: pointer;
  font: 600 13px var(--cx-font-body); padding: 8px 13px;
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
/* Die Zahl im Reiter des Steckbriefs stand bei 3,53:1 dunkel und 2,82:1 hell.
   Der Reiter wechselt im aktiven Zustand die Schriftfarbe, deshalb fällt die
   Deckkraft ersatzlos weg statt einer festen Farbe zu weichen (1.178.2). */
.cx-sb-reiter button i { font-style: normal; font-size: 11.5px; }
.cx-sb-reiter button:hover { color: var(--cx-text); }
.cx-sb-reiter button[aria-selected="true"] { color: var(--cx-text); border-bottom-color: var(--cx-blue); }
.cx-sb-teil { display: none; padding-top: 10px; }
.cx-sb-teil.an { display: block; }
.cx-sb-teil p { margin: 0 0 10px; font-size: 14.5px; color: var(--cx-text-muted); line-height: 1.65; }
.cx-sb-teil p:last-child { margin-bottom: 0; }
.cx-sb-kachel h4 {
  font-size: 11.5px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--cx-steel); margin: 16px 0 6px; font-weight: 700;
}
.cx-sb-einordnung { display: flex; gap: 7px; flex-wrap: wrap; }
.cx-sb-einordnung span {
  font-size: 12px; border: 1px solid var(--cx-border); border-radius: 99px;
  padding: 4px 11px; color: var(--cx-text-muted); background: var(--cx-carbon);
}
.cx-sb-punkte { margin: 0; padding-left: 20px; font-size: 14px; color: var(--cx-text-muted); }
.cx-sb-punkte li { margin: 5px 0; line-height: 1.6; }
.cx-sb-punkte li::marker { color: var(--cx-accent); }
.cx-sb-punkte.grenzen li::marker { color: var(--cx-warn); }
.cx-sb-betrieb { margin-top: 4px; }
.cx-sb-betrieb td:first-child { width: 34%; color: var(--cx-steel); }
.cx-sb-alt { display: flex; gap: 8px; flex-wrap: wrap; }
.cx-sb-alt a {
  font-size: 12.5px; border: 1px solid var(--cx-border); border-radius: 99px;
  padding: 5px 12px; color: var(--cx-text-muted); font-weight: 400; background: var(--cx-carbon);
}
.cx-sb-alt a:hover { border-color: var(--cx-blue); color: var(--cx-text); }
.cx-sb-alt a b { color: var(--cx-text); font-weight: 600; }
.cx-sb-althinweis { margin: 10px 0 0; font-size: 12.5px; color: var(--cx-steel); }

/* --- Paare zu je 50 % ---------------------------------------------------- */
.cx-sb-paare { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 30px; }
.cx-sb-pk {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite); padding: 18px 20px;
}
.cx-sb-pk h2 { font-size: 19px; margin: 0 0 10px; }
.cx-sb-pk p { margin: 0; font-size: 14.5px; color: var(--cx-text-muted); line-height: 1.65; }

/* --- Wettbewerb über die volle Breite ------------------------------------
   Vorher eine Tabelle mit zwei Spalten. Die Logos sind der schnellere
   Zugriff: Im Kundengespräch fällt der Name des Mitbewerbers, und das Auge
   findet die Marke vor dem Wort. */
.cx-sb-mbliste { display: grid; gap: 9px; }
.cx-sb-mbk {
  display: flex; gap: 14px; align-items: flex-start;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  background: var(--cx-graphite); padding: 12px 14px;
}
.cx-sb-mblogo {
  width: 84px; height: 40px; padding: 5px 8px; flex: none; margin: 0;
  display: inline-flex; align-items: center; justify-content: center;
}
.cx-sb-mblogo img { max-height: 30px; max-width: 100%; }
.cx-sb-mblogo.fremd {
  background: var(--cx-carbon); border: 1px dashed var(--cx-border);
  color: var(--cx-steel); font: 700 13px var(--cx-font-display);
}
.cx-sb-mbtext { flex: 1 1 auto; min-width: 0; }
.cx-sb-mbtext b { font-size: 14.5px; }
.cx-sb-mbtext p { margin: 3px 0 0; font-size: 13px; color: var(--cx-text-muted); line-height: 1.55; }
.cx-sb-mbvgl {
  margin-left: auto; flex: none; border: 1px solid var(--cx-border);
  background: transparent; color: var(--cx-blue-light); cursor: pointer;
  font: 600 12.5px var(--cx-font-body); padding: 7px 13px; border-radius: 99px;
}
.cx-sb-mbvgl:hover { border-color: var(--cx-blue); background: rgba(30,123,232,.12); }
/* Derselbe Fall auf weißem Grund: 2,52:1 mit --cx-blue-light, 6,65:1 mit
   --cx-blue-deep. */
html[data-theme="light"] .cx-sb-mbvgl { color: var(--cx-blue-deep); }
.cx-sb-mbohne { margin-left: auto; flex: none; font-size: 12px; color: var(--cx-steel); }

/* Der interne Bereich schließt die Bahn ab und trägt deshalb die volle
   Breite – bis 1.51 stand er als Karte mitten im Fluss. */
.cx-sb-prod + .cx-gesperrt, .cx-sb-paare + .cx-intern-hinweis { margin-top: 30px; }

html[data-theme="light"] .cx-sb-pitchmarke { color: var(--cx-blue-deep); }
/* Im Hellmodus reicht ein Umfärben der Jahreszahl NICHT: Die allgemeine
   Regel hat dieselbe Spezifität wie .aktiv/.passiv und steht später – damit
   bekamen beide Richtungen dieselbe Farbe, und „wurde übernommen“ sah aus
   wie „hat übernommen“. Deshalb hier alle drei Fälle einzeln. */
html[data-theme="light"] .cx-sb-zs b { color: #0F766E; }
html[data-theme="light"] .cx-sb-zs.aktiv b { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-sb-zs.passiv b { color: var(--cx-warn); }
/* Und dieselben drei Fälle noch einmal für die Marke darunter – genau die
   wurde beim Umfärben der Jahreszahl vergessen (gefunden 14.09.2026, 1.143.1).
   Die ORANGE Richtung war nie betroffen: --cx-warn ist im Hellmodus auf
   #8A5A00 umdefiniert und kommt damit auf 5,93:1. --cx-blue-light (#3FA9FF)
   ist es NICHT – „HAT ÜBERNOMMEN" stand auf Weiß bei 2,52:1, und das bei
   10,5 px in Fettschrift. Jetzt dieselbe Farbe wie die Jahreszahl der Karte:
   --cx-blue-deep (#0D50D8) = 6,65:1. Der Rahmen zieht mit, sonst umrandet
   ein hellblauer Ring dunkelblaue Schrift. Betroffen waren 126 Steckbriefe. */
html[data-theme="light"] .cx-sb-zs.aktiv  .cx-sb-zpfeil { color: var(--cx-blue-deep); border-color: rgba(13,80,216,.35); }
html[data-theme="light"] .cx-sb-zs.passiv .cx-sb-zpfeil { border-color: rgba(138,90,0,.35); }
html[data-theme="light"] .cx-sb-punkte li::marker { color: #0F766E; }
html[data-theme="light"] .cx-sb-ktags { color: #0F766E; }
html[data-theme="light"] .cx-sb-mblogo { border: 1px solid var(--cx-border); }

@media (max-width: 980px) {
  .cx-sb-teilung, .cx-sb-paare { grid-template-columns: 1fr; }
  .cx-sb-liste { position: static; max-height: none; }
  .cx-sb-kachel { padding: 18px 18px; }
}
@media (max-width: 680px) {
  .cx-sb-pitch p { font-size: 16.5px; }
  .cx-sb-mbk { flex-wrap: wrap; }
  .cx-sb-mbvgl, .cx-sb-mbohne { margin-left: 98px; }
}

/* ==== 1.54.0 · Werkzeugleiste: ein Wert je Menü ==========================
   Der Knopf trägt jetzt die Auswahl, nicht mehr nur die Zahl der gewählten
   Filter: links die Beschriftung („Bereich"), rechts der Wert („Alle
   Bereiche" oder der gewählte). Lange Bereichsnamen wie „Schwachstellen- &
   Exposure-Management" würden die Leiste sonst auseinanderziehen – deshalb
   die Kürzung mit Auslassungspunkten statt Umbruch. */
.cx-wz-was { color: var(--cx-steel); font-weight: 600; }
.cx-wz-knopf.hat .cx-wz-was { color: var(--cx-text-muted); }
.cx-wz-wert {
  color: var(--cx-text); font-weight: 700; max-width: 21ch;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-wz-knopf.hat .cx-wz-wert { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-wz-knopf.hat .cx-wz-wert { color: var(--cx-blue-deep); }
/* Der erste Eintrag im Menü ist „Alle" und trennt sich sichtbar vom Rest –
   er hebt die Auswahl auf, statt eine weitere zu treffen. */
.cx-wz-menue-liste > .cx-chip:first-child {
  border-style: dashed; margin-right: 6px;
}
@media (max-width: 680px) { .cx-wz-wert { max-width: 12ch; } }

/* Entweder-oder: Solange der eine Filter gesetzt ist, ruht der andere. Nicht
   gesperrt – ein Klick dort übernimmt und setzt diesen hier zurück –, aber
   sichtbar zurückgenommen, damit niemand eine Kombination erwartet. */
.cx-wz-knopf.ruht { opacity: .55; }
.cx-wz-knopf.ruht:hover { opacity: 1; }

/* ===================== Produktbereich: Marktplan und Werkbank =============
   Die Seite trug bis 1.64 alle Hersteller eines Bereichs alphabetisch
   untereinander – bei IT-Management & Monitoring 68 Karten auf 71.543 px.
   Jetzt zwei Ansichten über derselben Menge: der MARKTPLAN gliedert nach
   Funktionsklassen, die WERKBANK bleibt bei den Herstellern, verdichtet sie
   aber zu filterbaren Zeilen. Beide benutzen die vorhandene Werkzeugleiste
   (.cx-wz) der Herstellerseite – gleiche Bauteile, keine zweite Formsprache. */

:root {
  /* Fünf Bandfarben für die Themengruppen. Sie kommen aus der bestehenden
     Palette (Blau, Petrol, Bernstein) und ergänzen zwei Töne, die sich davon
     hinreichend unterscheiden. Nachgerechnet auf Karten- UND Seitenfläche:
     der schwächste Wert ist Violett mit 5,57:1, alle über der Norm von 4,5:1.
     Nachgerechnet und nicht angesehen, weil ein Farbwert hell und dunkel nie
     beide bedient – deshalb stehen unten eigene Werte für den Hellmodus. */
  --cx-band0: #3FA9FF;
  --cx-band1: #35E0DA;
  --cx-band2: #8B7BF0;
  --cx-band3: #E5A83B;
  --cx-band4: #5FD08A;
}
html[data-theme="light"] {
  /* Dieselben Familien, abgedunkelt: Auf Weiß erreicht #3FA9FF nur 2,5:1,
     #35E0DA sogar 1,6:1. Der schwächste Wert hier ist Grün mit 4,63:1. */
  --cx-band0: #0D50D8;
  --cx-band1: #0F766E;
  --cx-band2: #5B3FC4;
  --cx-band3: #8A5A00;
  --cx-band4: #2E7D4F;
}

/* Die Leiste steht auf diesen Seiten über einer Liste, nicht über einem Raster –
   sie darf umbrechen, statt die Felder zusammenzuquetschen. Die Schwerpunkt-
   seite (.cx-sp-wz) benutzt dieselbe Leiste; getrennte Klassen gibt es nur,
   damit ein Klick daneben das richtige Menü schließt. */
.cx-br-wz, .cx-sp-wz { flex-wrap: wrap; }
.cx-br-wz .cx-wz-such, .cx-sp-wz .cx-wz-such { min-width: 260px; }
/* Auf der Herstellerseite steht der Ansichtsumschalter am Ende der Leiste und
   wird mit margin-left:auto dorthin geschoben. Hier ist er das erste Element
   und bestimmt, was die Seite überhaupt zeigt – bliebe das auto stehen, würde
   er die ganze Leiste an den rechten Rand drücken. */
.cx-br-wz .cx-wz-um, .cx-sp-wz .cx-wz-um { margin-left: 0; }
.cx-br-wz .cx-wz-alles:first-of-type,
.cx-sp-wz .cx-wz-alles:first-of-type { margin-left: auto; }

/* --- Themenbänder --- */
.cx-fk-plan { margin-top: 4px; }
.cx-fk-gruppe {
  margin-bottom: 16px; border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); background: var(--cx-graphite); overflow: hidden;
}
.cx-fk-g0 { --bf: var(--cx-band0); }
.cx-fk-g1 { --bf: var(--cx-band1); }
.cx-fk-g2 { --bf: var(--cx-band2); }
.cx-fk-g3 { --bf: var(--cx-band3); }
.cx-fk-g4 { --bf: var(--cx-band4); }
.cx-fk-gruppenkopf {
  margin: 0; padding: 14px 20px; font-size: 17px; font-weight: 700;
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  border-bottom: 1px solid var(--cx-border);
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--bf) 13%, transparent), transparent 58%);
}
.cx-fk-punkt { width: 9px; height: 9px; border-radius: 99px; background: var(--bf); flex: none; }
.cx-fk-gruppenkopf em {
  font-style: normal; font-weight: 400; font-size: 13.5px; color: var(--cx-steel);
}
.cx-fk-zahl { margin-left: auto; font-size: 12.5px; font-weight: 600; color: var(--cx-steel); }

/* --- Eine Funktionszeile --- */
.cx-fk-zeile { border-bottom: 1px solid var(--cx-border); }
.cx-fk-zeile:last-child { border-bottom: 0; }
.cx-fk-kopf {
  width: 100%; display: grid;
  grid-template-columns: minmax(210px, 1.3fr) 112px minmax(140px, 1fr) 22px;
  gap: 16px; align-items: center; padding: 10px 20px;
  background: transparent; border: 0; color: inherit; text-align: left;
  font: inherit; cursor: pointer;
}
.cx-fk-kopf:hover { background: rgba(30, 123, 232, .06); }
.cx-fk-kopf:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: -2px; }
/* min-width:0 ist im Raster Pflicht: Eine Grid-Spalte schrumpft sonst nie unter
   ihr längstes unteilbares Wort. Bei 375 px schob „Beobachtbarkeitsplattform“
   (188 px) die Zeile 19 px über den Rand und schnitt den Aufklapp-Pfeil ab –
   sichtbar erst auf dem Handy, weil die Seite selbst nicht mitwandert. */
.cx-fk-name {
  font-weight: 600; font-size: 14.5px; min-width: 0;
  /* hyphens vor overflow-wrap: Das Dokument ist lang="de", also trennt der
     Browser „Anwendungs-überwachung“ an der richtigen Stelle. anywhere greift
     nur da, wo auch das nicht reicht – sonst stünde „Anwendungsüberwac|hung“. */
  hyphens: auto; overflow-wrap: anywhere;
}
.cx-fk-name small {
  display: block; font-weight: 400; font-size: 12.5px; color: var(--cx-steel);
}
.cx-fk-balken { display: flex; align-items: center; gap: 8px; }
.cx-fk-schiene {
  flex: 1; height: 7px; border-radius: 99px;
  background: rgba(139, 146, 155, .18); overflow: hidden;
}
/* display:block ist Pflicht: Ein inline-span nimmt keine Prozentbreite an –
   der Balken bliebe unsichtbar, obwohl die Breite im Markup steht. */
.cx-fk-fuell { display: block; height: 100%; border-radius: 99px; background: var(--bf); }
.cx-fk-balken i {
  font-style: normal; font-size: 12.5px; color: var(--cx-steel);
  min-width: 20px; text-align: right;
}
.cx-fk-logos { display: flex; gap: 4px; align-items: center; overflow: hidden; }
/* min-height zurücksetzen: .cx-logoplate bringt 84px mit, gedacht für die
   große Kachel auf der Herstellerseite. */
.cx-fk-logo {
  width: 34px; height: 24px; min-height: 0; padding: 2px; border-radius: 6px; flex: none;
}
.cx-fk-logo img { max-height: 18px; }
.cx-fk-mehr { font-size: 12px; color: var(--cx-steel); font-weight: 600; white-space: nowrap; }
/* Namenschip statt Plättchen, wo der Server kein Logo mitliefert (Gastansicht). */
.cx-fk-nam {
  font-size: 11px; max-width: 96px; overflow: hidden; text-overflow: ellipsis; flex: none;
}
.cx-fk-pfeil { color: var(--cx-steel); font-size: 13px; transition: transform .18s ease; }
.cx-fk-zeile[data-offen="1"] .cx-fk-pfeil,
.cx-hl-zeile[data-offen="1"] .cx-fk-pfeil { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .cx-fk-pfeil { transition: none; } }

/* --- Aufgeklappte Funktionszeile --- */
.cx-fk-inhalt { padding: 2px 20px 18px; }
.cx-fk-hinweis {
  margin: 0 0 12px; padding: 10px 14px; font-size: 13.5px; color: var(--cx-text-muted);
  border-left: 3px solid var(--cx-warn); background: rgba(229, 168, 59, .08);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
.cx-fk-karten {
  display: grid; gap: 12px;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
.cx-fk-karte {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  padding: 12px 14px; background: var(--cx-carbon);
  display: flex; gap: 12px; align-items: flex-start;
}
.cx-fk-karte .cx-logoplate {
  width: 56px; height: 38px; padding: 4px; flex: none; border-radius: 8px;
}
.cx-fk-karte .cx-logoplate img { max-height: 28px; }
.cx-fk-karte h3 { margin: 0 0 2px; font-size: 14.5px; font-weight: 700; }
.cx-fk-karte h3 a { color: inherit; }
.cx-fk-karte h3 a:hover { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-fk-karte h3 a:hover { color: var(--cx-blue-deep); }
.cx-fk-meta { margin: 0; font-size: 12px; color: var(--cx-steel); }
.cx-fk-produkte { margin: 6px 0 0; font-size: 13px; color: var(--cx-text-muted); }
.cx-fk-gesperrt { color: var(--cx-steel); font-style: italic; }
.cx-fk-fuss { margin: 14px 0 0; font-size: 13px; color: var(--cx-steel); }

/* --- Werkbank: Herstellerzeilen --- */
.cx-hl {
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  background: var(--cx-graphite); overflow: hidden; margin-top: 4px;
}
.cx-hl-zeile { border-bottom: 1px solid var(--cx-border); }
.cx-hl-zeile:last-child { border-bottom: 0; }
.cx-hl-kopf {
  width: 100%; display: grid;
  grid-template-columns: 60px minmax(150px, 1.05fr) minmax(170px, 1.4fr) 92px 92px 22px;
  gap: 14px; align-items: center; padding: 9px 16px;
  background: transparent; border: 0; color: inherit; text-align: left;
  font: inherit; cursor: pointer;
}
.cx-hl-kopf:hover { background: rgba(30, 123, 232, .06); }
.cx-hl-kopf:focus-visible { outline: 2px solid var(--cx-blue); outline-offset: -2px; }
.cx-hl-logo {
  width: 60px; height: 38px; min-height: 0; padding: 3px; flex: none; border-radius: 7px;
}
.cx-hl-logo img { max-height: 28px; }
/* Ohne Logo steht hier der Kurzname – .cx-logo-ersatz bringt 17px mit, die in
   ein 60-px-Plättchen nicht passen und den Namen in Fetzen umbrechen würden. */
.cx-hl-logo .cx-logo-ersatz {
  font-size: 10px; font-weight: 700; color: #14171C; line-height: 1.15;
  padding: 0 2px; text-align: center; overflow: hidden;
}
.cx-hl-name { font-weight: 700; font-size: 14.5px; min-width: 0; overflow-wrap: anywhere; }
/* Der Sitz wird schon in app.js gekürzt; hier steht die zweite Sicherung für
   den Fall, dass auch die Kurzform noch zu breit ist. */
.cx-hl-name small {
  display: block; font-weight: 400; font-size: 12px; color: var(--cx-steel);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cx-hl-klassen { display: flex; gap: 5px; flex-wrap: wrap; }
.cx-tag-leise { opacity: .62; }
.cx-hl-zahl { font-size: 13px; color: var(--cx-text-muted); text-align: right; }
.cx-hl-zahl b { color: var(--cx-text); font-size: 15px; font-family: var(--cx-font-display); }
.cx-hl-anteil { display: flex; align-items: center; gap: 7px; }
.cx-hl-schiene {
  flex: 1; height: 6px; border-radius: 99px;
  background: rgba(139, 146, 155, .18); overflow: hidden;
}
.cx-hl-fuell { display: block; height: 100%; border-radius: 99px; background: var(--cx-blue); }
html[data-theme="light"] .cx-hl-fuell { background: var(--cx-blue-deep); }
.cx-hl-anteil i { font-style: normal; font-size: 11.5px; color: var(--cx-steel); }
.cx-hl-inhalt { padding: 2px 16px 16px 90px; }
.cx-hl-inhalt .cx-pos { margin: 0 0 10px; max-width: 96ch; }
.cx-hl-fuss {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-top: 12px;
}

/* --- Schmale Fenster --- */
@media (max-width: 1080px) {
  .cx-fk-kopf { grid-template-columns: 1fr 100px 22px; }
  .cx-fk-logos { display: none; }
  .cx-hl-kopf { grid-template-columns: 60px minmax(120px, 1fr) 84px 22px; }
  .cx-hl-klassen, .cx-hl-anteil { display: none; }
}
@media (max-width: 720px) {
  .cx-fk-gruppenkopf { font-size: 15.5px; padding: 12px 14px; }
  .cx-fk-zahl { margin-left: 0; flex-basis: 100%; }
  .cx-fk-kopf { padding: 10px 14px; gap: 10px; }
  .cx-fk-inhalt { padding: 2px 14px 16px; }
  .cx-fk-karten { grid-template-columns: 1fr; }
  /* minmax(0,1fr) statt minmax(120px,1fr): Die 120 px Mindestbreite ergaben mit
     Logo, Zahl, Pfeil, drei Abständen und dem Innenrand zusammen 328 px – drei
     mehr, als ein 375-px-Gerät hergibt. Der Pfeil rechts wurde angeschnitten. */
  .cx-hl-kopf { padding: 9px 12px; gap: 10px;
                grid-template-columns: 60px minmax(0, 1fr) 84px 22px; }
  .cx-hl-inhalt { padding: 2px 12px 14px; }
  .cx-br-wz .cx-wz-such, .cx-sp-wz .cx-wz-such { min-width: 0; width: 100%; }
}

/* ===================== Schwerpunkt: Marktplan und Werkbank ================
   Dieselben Bauteile wie beim Produktbereich (.cx-fk-* für den Marktplan,
   .cx-hl-* für die Werkbank, .cx-wz-* für die Leiste) – die Schwerpunktseite
   ordnet nur nach einer anderen Achse: Ihre Bänder sind die Produktbereiche.
   Hier steht deshalb nur, was daraus folgt. */

/* Das Bereichszeichen im Bandkopf. Es nimmt die Bandfarbe an, statt beim
   blauen Grundton zu bleiben: Sonst stünde ein blaues Plättchen in einem
   grünen Band, und die Farbe hörte auf, etwas zu bedeuten. Die Regel steht
   nach .cx-light .cx-bereich-zeichen und schlägt sie bei gleicher
   Spezifität – im Hellmodus nachgesehen, nicht angenommen. */
.cx-fk-gruppenkopf .cx-bereich-zeichen {
  width: 28px; height: 28px; border-radius: 8px;
  background: color-mix(in srgb, var(--bf) 15%, transparent);
  border-color: color-mix(in srgb, var(--bf) 34%, transparent);
  color: var(--bf);
}
.cx-fk-gruppenkopf .cx-bereich-zeichen svg { width: 16px; height: 16px; }
.cx-sp-band { display: flex; align-items: center; gap: 10px; }

/* Der Querverweis in den Bereich. Die beiden Einstiege – Bereich und
   Schwerpunkt – waren einander bisher fremd; wer über „Microsoft 365“ in
   E-Mail Security landet, will von dort oft weiter in den ganzen Bereich. */
.cx-sp-bandlink {
  font-size: 12.5px; font-weight: 500; color: var(--cx-steel);
  border: 1px solid var(--cx-border); border-radius: 99px;
  padding: 3px 10px; white-space: nowrap;
}
.cx-sp-bandlink:hover { color: var(--cx-text); border-color: var(--cx-blue); }
/* Die frühere Hell-Regel setzte hier --cx-steel; auf dem halbtransparenten
   Verlaufsband reichte das mit 4,12:1 nicht. Der Wert steht jetzt weiter
   unten im Sammelblock auf --cx-text-muted – diese Zeile wäre nur noch eine
   Regel, die von der späteren überschrieben wird, und damit irreführend. */
html[data-theme="light"] .cx-sp-bandlink:hover {
  color: var(--cx-blue-deep); border-color: var(--cx-blue-deep);
}

/* Wo ein Schwerpunkt einem Bereich zum Verwechseln nahekommt, stand die Notiz
   bisher nur auf der Übersichtskachel – gerade auf der Detailseite fehlte sie,
   wo die Trefferzahlen auseinandergehen. */
.cx-sp-hinweis {
  margin: 12px 0 0; max-width: 92ch; font-size: 13.5px; line-height: 1.55;
  color: var(--cx-text-muted);
  border-left: 3px solid var(--cx-blue); padding: 6px 0 6px 14px;
}
html[data-theme="light"] .cx-sp-hinweis { border-left-color: var(--cx-blue-deep); }

@media (max-width: 720px) {
  /* In der Enge zählt der Bereichsname, nicht der Weg dorthin – den gibt es
     eine Zeile weiter unten an jeder Herstellerkarte ohnehin. */
  .cx-sp-bandlink { display: none; }
  .cx-fk-gruppenkopf .cx-bereich-zeichen { width: 24px; height: 24px; border-radius: 7px; }
  .cx-fk-gruppenkopf .cx-bereich-zeichen svg { width: 14px; height: 14px; }
}

/* Ansprechpartner: ein Block je Organisation. Eine durchgehende Tabelle mit
   einer Spalte „Haus“ hatte zwei Nachteile – dieselbe Zeile stand zehnmal
   untereinander, und wer beim HERSTELLER sitzt, ging zwischen den Leuten des
   Distributors unter. Der Name des Hauses steht jetzt einmal über seinem Block
   statt in jeder Zeile. */
/* Luft zwischen den Blöcken – das war der Punkt: Zu eng gesetzt lesen sich
   zwei Organisationen wie eine Belegschaft. */
.cx-bq-kgruppe { margin-top: 26px; }
.cx-bq-kgruppe:first-of-type { margin-top: 10px; }
.cx-bq-kgruppe h4 {
  margin: 0 0 8px; font-size: 14px; font-weight: 700;
  display: flex; align-items: center; gap: 9px;
  padding-left: 11px; border-left: 3px solid var(--cx-blue);
}
.cx-bq-kgruppe h4 span {
  font-weight: 500; font-size: 12px; color: var(--cx-steel);
  border: 1px solid var(--cx-border); border-radius: 99px; padding: 1px 8px;
}
/* Der Hersteller bekommt eine andere Kante als die Häuser: Er ist keines.
   --cx-accent ist die Farbe des internen Bereichs und in beiden Modi schon
   nachgerechnet – Cyan im Dunkeln, Petrol im Hellen. */
.cx-bq-kgruppe-h h4 { border-left-color: var(--cx-accent); }
.cx-bq-ktabelle { margin-top: 0; }
.cx-bq-ktabelle td .cx-bq-haus { display: block; }

/* Auf dem Telefon stapeln statt spalten. Drei Spalten mit Name, Rolle und
   Mailadresse brauchen 556 px – ein 375-px-Gerät ließ sich dadurch seitlich
   schieben. Das galt schon für die Kontakttabelle der Distributorsicht, lange
   vor den Gruppen; deshalb greift die Regel für beide. */
@media (max-width: 720px) {
  .cx-bq-blatt table thead { display: none; }
  .cx-bq-blatt table,
  .cx-bq-blatt table tbody,
  .cx-bq-blatt table tr,
  .cx-bq-blatt table td { display: block; width: auto; }
  .cx-bq-blatt table tr {
    padding: 11px 0; border-bottom: 1px solid var(--cx-border);
  }
  .cx-bq-blatt table tr:last-child { border-bottom: 0; }
  .cx-bq-blatt table td { padding: 0; border: 0; }
  .cx-bq-blatt table td:empty { display: none; }
  /* Die zweite Spalte ist die Rolle beziehungsweise das Haus – als eigene
     Zeile darunter, leiser gesetzt als der Name darüber. */
  .cx-bq-blatt table td:nth-child(2) {
    color: var(--cx-steel); font-size: 13px; margin-top: 1px;
  }
  .cx-bq-blatt table td:nth-child(3) { margin-top: 3px; }
}

/* ======================================================================
   Firmenzugang (1.90.0): Beratung, Merkliste/Watchlist, Schnellcheck,
   Neuigkeiten, Anfragen, Einladungen, Anforderungskatalog.
   ====================================================================== */

/* --- Beratung & Bezug (Herstellerseite, Rolle Firma) --- */
.cx-sb-beratung {
  margin: 26px 0; padding: 20px 22px;
  background: color-mix(in srgb, var(--cx-blue) 7%, var(--cx-carbon));
  border: 1px solid var(--cx-border); border-left: 3px solid var(--cx-blue);
  border-radius: var(--cx-radius);
}
.cx-beratung-kopf h2 { margin: 0 0 6px; }
.cx-beratung-kopf p { margin: 0 0 14px; color: var(--cx-text-muted); }
.cx-beratung-mail { color: var(--cx-steel); font-size: 13px; }
.cx-beratung-form textarea {
  width: 100%; resize: vertical; padding: 10px 12px;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  font: inherit;
}
.cx-beratung-fuss {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-top: 10px; flex-wrap: wrap;
}
.cx-beratung-bezug { color: var(--cx-steel); font-size: 13px; }
.cx-beratung-meldung { margin: 10px 0 0; color: var(--cx-blue-light); }
.cx-beratung-meldung.fehler { color: var(--cx-warn); }

/* --- Merken-, Beobachten- und PDF-Knöpfe --- */
.cx-merk, .cx-watch, .cx-sb-pdf {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 12px; cursor: pointer; font: inherit; font-size: 13px;
  background: var(--cx-carbon); color: var(--cx-text-muted);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  /* NAMENSKOLLISION, und sie ist echt: .cx-merk heißt weiter oben auch der
     Kasten der Merkliste (margin-top:22px, max-width:760px). Gleiche
     Spezifität, also gewinnt hier die spätere Regel – aber nur bei den
     Eigenschaften, die sie selbst nennt. Ohne diese beiden Zeilen erbt der
     KNOPF den Abstand des Kastens und stand 4 px tiefer als seine Nachbarn. */
  margin-top: 0; max-width: none;
}
.cx-merk:hover, .cx-watch:hover, .cx-sb-pdf:hover {
  color: var(--cx-text); border-color: var(--cx-steel);
}
.cx-merk.an, .cx-watch.an {
  color: var(--cx-blue-light); border-color: var(--cx-blue);
  background: color-mix(in srgb, var(--cx-blue) 12%, var(--cx-carbon));
}

/* ==== 1.131.0 · Beobachtete Bereiche =====================================
   Der Beobachten-Knopf ist von der Hersteller- auf die Bereichsseite gewandert
   und steht zusätzlich in zwei Listen: auf der Bereichsübersicht und auf der
   Seite „Beobachtet“. In Listen ist er die Nebensache neben dem Bereichsnamen,
   deshalb eine kleinere Fassung. */
.cx-watch-klein {
  padding: 4px 9px; font-size: 12px; gap: 4px;
}
/* Auf der Bereichsübersicht sitzt er in einer rechtsbündigen Spalte unter zwei
   Textlinks – ohne diese Zeile stünde er mittig darunter und zöge die Spalte
   auseinander. */
.cx-mz-aktion .cx-watch-klein { margin-top: 3px; }

/* Die Zeile im Hero der Bereichsseite: Knopf und eine Erklärung daneben. Der
   Text steht bewusst dabei – „Beobachten“ allein beantwortet nicht, was danach
   passiert, und die Antwort („beim nächsten Besuch, ohne Mail“) ist genau die,
   die über das Anklicken entscheidet. */
.cx-bereich-aktion {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin-top: 14px;
}
.cx-bereich-aktion-text {
  color: var(--cx-steel); font-size: 13px; line-height: 1.5;
}

/* Die Liste auf der Seite „Beobachtet“ – dieselbe Bauart wie die Merkliste,
   nur ohne Logo: Ein Bereich hat keines, er hat ein Sinnbild, und das sitzt
   schon im Titel. */
.cx-beob-liste, .cx-beob-offen { display: grid; gap: 10px; }
.cx-beob-zeile {
  display: grid; grid-template-columns: 1fr auto auto; gap: 14px;
  align-items: center; padding: 12px 16px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius);
}
.cx-beob-kopf {
  display: flex; align-items: center; gap: 10px;
  font-weight: 600; font-size: 15.5px; color: var(--cx-text); min-width: 0;
}
.cx-beob-kopf:hover { color: var(--cx-blue-light); }
.cx-beob-kopf span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cx-beob-zahl {
  color: var(--cx-steel); font-size: 13px; white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
/* Die noch nicht gewählten Bereiche stehen im selben Raster, aber gedämpft –
   sie sind ein Angebot und keine Liste, die man abarbeiten muss. */
.cx-beob-offen .cx-beob-zeile { background: transparent; }
.cx-beob-offen .cx-beob-kopf { font-weight: 500; color: var(--cx-text-muted); }
.cx-beob-offen .cx-beob-kopf:hover { color: var(--cx-blue-light); }

.cx-beob-ereignisse { display: grid; gap: 14px; }
/* Was seit dem letzten Besuch dazugekommen ist, trägt eine Marke und einen
   blauen Streifen. Beides, weil Farbe allein bei Rot-Grün-Schwäche nichts
   sagt und eine Marke allein im Überfliegen untergeht. */
.cx-neu-frisch { border-left: 3px solid var(--cx-blue); padding-left: 13px; }
.cx-neu-marke {
  display: inline-block; margin-left: 8px; padding: 1px 7px;
  border-radius: 99px; font-size: 10.5px; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--cx-blue-light);
  background: color-mix(in srgb, var(--cx-blue) 16%, transparent);
  border: 1px solid color-mix(in srgb, var(--cx-blue) 40%, transparent);
}

@media (max-width: 620px) {
  /* Auf dem Telefon passen Name, Zahlen und Knopf nicht nebeneinander. Die
     Zahlen wandern unter den Namen, der Knopf bleibt rechts – er ist das
     Bedienelement der Zeile. */
  .cx-beob-zeile { grid-template-columns: 1fr auto; }
  .cx-beob-zahl { grid-column: 1; grid-row: 2; }
}

/* ==== 1.132.0 · Kabelkunde (HDMI, USB/Thunderbolt) =======================
   Zwei Seiten mit demselben Aufbau. Sie nutzen die vorhandenen cx-nis-*- und
   cx-reg-*-Klassen weiter – hier steht nur, was es dort nicht gibt: die
   Zahlenspalten der Tabellen, die Kabelklassen-Karten und die Begriffsgitter.
   Präfix cx-kk-, weil cx-kabel- zu nah an cx-karte- läge. */

/* In diesen Tabellen stehen Bandbreiten und Watt untereinander. Ohne
   tabular-nums tanzen die Ziffern, weil die Schrift proportionale Zahlen
   hat – bei „18 Gbit/s" über „96 Gbit/s" fällt das sofort auf. */
.cx-kk-tabelle { font-size: 14px; }
.cx-kk-zahl { font-variant-numeric: tabular-nums; white-space: nowrap; }
.cx-kk-tabelle td:first-child { min-width: 9ch; }

/* Die Kabelklassen: je Karte ein Name, die Bandbreite als Marke und zwei
   Zeilen Beschreibung. Auto-fit statt fester Spalten – bei fünf Klassen
   ergibt das auf dem Schreibtisch drei plus zwei, auf dem Telefon eine. */
.cx-kk-karten {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--cx-gap); margin-top: 16px;
}
.cx-kk-karte { display: flex; flex-direction: column; gap: 10px; }
.cx-kk-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; flex-wrap: wrap;
}
.cx-kk-kopf b { font-size: 15px; }
.cx-kk-band {
  font-variant-numeric: tabular-nums; white-space: nowrap;
  font-size: 12.5px; font-weight: 600; padding: 3px 10px; border-radius: 99px;
  color: var(--cx-blue-light); border: 1px solid var(--cx-border);
  background: color-mix(in srgb, var(--cx-blue) 10%, transparent);
}
/* 2,01:1 im hellen Modus auf dem schwach blauen Band; --cx-blue-deep 5,42:1. */
html[data-theme="light"] .cx-kk-band { color: var(--cx-blue-deep); }
/* Definitionsliste statt Tabelle: zwei Angaben je Karte, die immer dieselben
   Beschriftungen tragen – dafür ist dl das passende Element. */
.cx-kk-liste { display: grid; grid-template-columns: auto 1fr; gap: 3px 12px; margin: 0; }
.cx-kk-liste dt {
  font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;
  color: var(--cx-steel); white-space: nowrap;
}
.cx-kk-liste dd { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); }
.cx-kk-karte > p { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); line-height: 1.55; }

/* Die Frage unter dem Namen einer Ebene – sie ersetzt eine Zwischenüberschrift
   und soll deshalb schwerer wiegen als der Fließtext darunter. */
.cx-kk-frage { margin: 2px 0 6px; font-weight: 600; color: var(--cx-text); }

.cx-kk-fragen { margin: 10px 0 0; padding-left: 22px; }
.cx-kk-fragen li { margin-bottom: 6px; line-height: 1.55; }

.cx-kk-faelle {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--cx-gap); margin-top: 16px;
}
.cx-kk-fall { display: flex; flex-direction: column; gap: 8px; }
.cx-kk-fall b { font-size: 14.5px; line-height: 1.4; }
.cx-kk-fall p { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); line-height: 1.55; }
/* Die Empfehlung ist die Antwort auf die Situation darüber und trägt deshalb
   die Akzentfarbe – sie ist das, was man mitnimmt. */
.cx-kk-empfehlung { color: var(--cx-blue-light) !important; font-weight: 600; }
/* 2,52:1 auf heller Karte; --cx-blue-deep bringt 6,65:1. Das !important der
   Grundregel verlangt hier dasselbe Gewicht. */
html[data-theme="light"] .cx-kk-empfehlung { color: var(--cx-blue-deep) !important; }

.cx-kk-begriffe {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 12px; margin-top: 16px;
}
.cx-kk-begriff { padding: 14px 16px; }
.cx-kk-begriff b { display: block; margin-bottom: 4px; color: var(--cx-blue-light); }
.cx-kk-begriff p { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); line-height: 1.55; }

/* Die Adaptermatrix auf der DVI-Seite beantwortet eine Ja-Nein-Frage, und die
   Antwort soll beim Überfliegen zu finden sein. Das „nein" steht deshalb in
   voller Textfarbe und fett, das „ja" bleibt gedämpft – gesucht wird fast
   immer das Nein.
   BEWUSST KEINE SIGNALFARBE: --cx-accent ist im Haus die Farbe des internen
   Bereichs (Cyan im Dunkeln, Petrol im Hellen), --cx-warn die der Warnungen.
   Beides wäre hier falsch – dass ein Adapter Elektronik braucht, ist eine
   sachliche Auskunft und keine Warnung. Der Unterschied im Schriftgewicht
   trägt die Unterscheidung allein und funktioniert in beiden Modi. */
.cx-kk-ja   { color: var(--cx-text-muted); white-space: nowrap; }
.cx-kk-nein { color: var(--cx-text); font-weight: 700; white-space: nowrap; }

/* Die Aderfarben am Laufwerksstrom sind keine Wertung, sondern ein Merkmal:
   Wer im Gehäuse steht, sucht die orange Ader und nicht das Wort „3,3 Volt".
   Der Punkt steht deshalb NEBEN der Farbbezeichnung und ersetzt sie nicht –
   die Auskunft muss auch ohne Farbsehen ankommen.

   DER RAHMEN TRÄGT DIE SICHTBARKEIT, NICHT DIE FÜLLUNG, und zwar aus einem
   gerechneten Grund: Gegen den Zellengrund erreicht der gelbe Punkt im HELLEN
   nur 1,62:1, der schwarze im DUNKLEN nur 1,41:1. Eine Füllfarbe kann beide
   Modi nicht bedienen – bei einem Farbchip ist das auch nicht ihre Aufgabe,
   denn die Farbe IST die Auskunft und darf nicht verbogen werden.
   --cx-steel schafft als Rahmen 4,64:1 im Hellen und 6,34:1 im Dunklen; damit
   ist die Scheibe in beiden Modi als Objekt zu sehen, auch wenn ihre Füllung
   im jeweiligen Grund fast verschwindet. --cx-border wäre zu schwach (1,18
   beziehungsweise 1,22:1). */
.cx-kk-ader {
  display: inline-block; width: 10px; height: 10px; border-radius: 50%;
  margin-right: 7px; vertical-align: -1px;
  border: 1px solid var(--cx-steel);
}
.cx-kk-ader[data-ader="orange"]  { background: #e8871a; }
.cx-kk-ader[data-ader="rot"]     { background: #d1362b; }
.cx-kk-ader[data-ader="gelb"]    { background: #e4c020; }
.cx-kk-ader[data-ader="schwarz"] { background: #2b2b30; }


/* Quellen im Stil der Steckbriefquellen: klein, gedämpft, ohne Aufzählungs-
   punkte – sie werden gelesen, wenn jemand nachprüfen will, sonst nicht. */
.cx-kk-quellen { list-style: none; padding: 0; margin: 10px 0 0; }
.cx-kk-quellen li {
  font-size: 13px; color: var(--cx-steel); line-height: 1.6;
  padding-left: 14px; position: relative;
}
.cx-kk-quellen li::before { content: "·"; position: absolute; left: 2px; }

/* --- Sicherheits-Schnellcheck --- */
.cx-check-schritt { margin: 26px 0; }
.cx-check-schritt h2 { margin-bottom: 12px; }
.cx-check-groessen { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; }
.cx-check-groesse {
  padding: 14px 16px; text-align: left; cursor: pointer; font: inherit;
  background: var(--cx-carbon); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  display: grid; gap: 3px;
}
.cx-check-groesse span { color: var(--cx-text-muted); font-size: 13px; }
.cx-check-groesse.active { border-color: var(--cx-blue); background: color-mix(in srgb, var(--cx-blue) 12%, var(--cx-carbon)); }
.cx-check-urteil {
  margin: 26px 0; padding: 20px 22px; border-radius: var(--cx-radius);
  border: 1px solid var(--cx-border); border-left: 4px solid var(--cx-warn);
  background: color-mix(in srgb, var(--cx-warn) 8%, var(--cx-carbon));
}
.cx-check-urteil.frei { border-left-color: var(--cx-blue); background: color-mix(in srgb, var(--cx-blue) 7%, var(--cx-carbon)); }
.cx-check-urteil h2 { margin: 0 0 8px; }
.cx-check-urteil p { margin: 0; color: var(--cx-text-muted); }
.cx-check-haken { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; }
.cx-check-hk {
  display: grid; grid-template-columns: auto 1fr; grid-template-rows: auto auto;
  column-gap: 10px; padding: 12px 14px; cursor: pointer;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); align-items: start;
}
.cx-check-hk input { grid-row: span 2; margin-top: 3px; accent-color: var(--cx-blue); }
.cx-check-hk b { font-size: 14px; }
.cx-check-hk span { color: var(--cx-text-muted); font-size: 13px; grid-column: 2; }
.cx-check-hk.an { border-color: var(--cx-blue); }
.cx-check-ampeln { margin: 30px 0; }
.cx-check-ampelliste { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; margin-top: 12px; }
.cx-check-ampel {
  padding: 14px 16px; display: grid; gap: 4px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius); border-left-width: 4px;
}
.cx-check-ampel.gruen { border-left-color: #3fa96b; }
.cx-check-ampel.gelb  { border-left-color: var(--cx-warn); }
.cx-check-ampel.rot   { border-left-color: #d05252; }
.cx-check-ampel span { color: var(--cx-text-muted); font-size: 13px; }
.cx-check-ampel a { font-size: 13px; }
.cx-check-fazit { margin-top: 16px; color: var(--cx-text-muted); }
.cx-check-hinweis p { color: var(--cx-text-muted); }

/* --- Was ist neu im Markt --- */
.cx-neu-liste { display: grid; gap: 14px; margin: 26px 0; }
.cx-neu {
  display: grid; grid-template-columns: 110px 1fr; gap: 16px;
  padding: 18px 20px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-neu-datum { color: var(--cx-steel); font-size: 13px; padding-top: 3px; }
.cx-neu-text h2 { margin: 0 0 6px; font-size: 17px; }
.cx-neu-text p { margin: 0; color: var(--cx-text-muted); }
.cx-neu-links { margin-top: 10px; display: flex; gap: 8px; flex-wrap: wrap; }
.cx-neu-links a {
  font-size: 12.5px; padding: 3px 10px; border: 1px solid var(--cx-border);
  border-radius: 99px; color: var(--cx-blue-light);
}
@media (max-width: 620px) {
  .cx-neu { grid-template-columns: 1fr; gap: 4px; }
}

/* ---- Marktlage: Themenfilter, Bereichsverweise, Quelle (1.94.0) ---------
   Die Seite zeigte alle Einträge flach untereinander. Bei dreizehn ging das;
   ab wöchentlichem Zuwachs nicht mehr. Der Filter steht deshalb ÜBER der
   Liste und trägt je Chip die Trefferzahl – so sieht man vor dem Klick, ob
   sich einer lohnt, und nach dem Klick, wie viel man ausgeblendet hat. */
.cx-neu-filter {
  display: flex; flex-wrap: wrap; gap: 8px; margin: 22px 0 18px;
}
.cx-neu-chip {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 7px 14px; border-radius: 99px; cursor: pointer;
  font: inherit; font-size: 13.5px;
  color: var(--cx-text-muted); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-neu-chip span {
  font-size: 12px; font-variant-numeric: tabular-nums; color: var(--cx-steel);
}
.cx-neu-chip:hover { color: var(--cx-text); border-color: var(--cx-steel); }
.cx-neu-chip.aktiv {
  color: var(--cx-text); border-color: var(--cx-band0); font-weight: 600;
  background: rgba(63,169,255,.10);
}
.cx-neu-chip.aktiv span { color: var(--cx-band0); }
html[data-theme="light"] .cx-neu-chip.aktiv { background: rgba(13,80,216,.07); }

/* Hersteller und Bereiche stehen in EINER Fußzeile, aber sichtbar getrennt:
   Die Herstellerverweise führen auf einen Steckbrief, die Bereichs-Chips in
   den Katalog. Wer sie gleich gestaltet, klickt den falschen. */
.cx-neu-fuss {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; margin-top: 12px;
}
.cx-neu-bereiche { display: flex; flex-wrap: wrap; gap: 6px; }
.cx-neu-quelle {
  margin: 10px 0 0 !important; padding-top: 9px;
  border-top: 1px solid var(--cx-border);
  font-size: 12.5px; line-height: 1.5; color: var(--cx-steel) !important;
  overflow-wrap: anywhere;
}

@media (max-width: 620px) {
  .cx-neu-chip { font-size: 13px; padding: 6px 12px; }
}

/* --- Merkliste --- */
.cx-hero-aktionen { margin-top: 16px; }
.cx-merk-liste { display: grid; gap: 10px; margin: 20px 0; }
.cx-merk-zeile {
  display: grid; grid-template-columns: auto 1fr auto; gap: 14px;
  align-items: center; padding: 12px 16px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius);
}
.cx-merk-logo { width: 52px; height: 52px; }
.cx-merk-text { display: grid; gap: 2px; min-width: 0; }
.cx-merk-text span { color: var(--cx-text-muted); font-size: 13px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* --- Anfragen und Einladungen --- */
.cx-anf-liste { display: grid; gap: 12px; margin: 20px 0; }
.cx-anf {
  padding: 16px 18px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  border-left: 3px solid var(--cx-blue);
}
.cx-anf.erledigt { border-left-color: var(--cx-border); opacity: .75; }
.cx-anf-kopf { display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap; }
.cx-anf-kopf span { color: var(--cx-steel); font-size: 13px; }
.cx-anf-status {
  padding: 1px 9px; border-radius: 99px; font-size: 12px;
  border: 1px solid var(--cx-border);
}
.cx-anf-bezug { color: var(--cx-text-muted); font-size: 13.5px; margin-top: 4px; }
.cx-anf p { margin: 8px 0; white-space: pre-line; }
.cx-anf-fuss { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
.cx-einladen {
  margin: 26px 0; padding: 20px 22px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-einladen p { color: var(--cx-text-muted); margin: 6px 0 14px; }
.cx-einladen-form { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.cx-einladen-form input[type="text"], .cx-einladen-form input[type="email"] {
  flex: 1 1 200px; padding: 9px 12px; font: inherit;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-einladen-haken { display: inline-flex; gap: 7px; align-items: center;
  color: var(--cx-text-muted); font-size: 13.5px; cursor: pointer; }
.cx-einladen-haken input { accent-color: var(--cx-blue); }
.cx-einladen-meldung { flex-basis: 100%; margin: 6px 0 0; color: var(--cx-blue-light); }
.cx-einladen-meldung.fehler { color: var(--cx-warn); }
.cx-einladen-link {
  display: block; margin-top: 6px; padding: 8px 10px; user-select: all;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); font-size: 13px; word-break: break-all;
}
.cx-einladen-liste { margin-top: 16px; display: grid; gap: 8px; }
.cx-einladen-zeile {
  display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap;
  padding: 9px 12px; border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm); font-size: 14px;
}
.cx-einladen-zeile span { color: var(--cx-text-muted); font-size: 13px; }
.cx-einladen-zeile.eingeloest { opacity: .7; }
.cx-einladen-zeile .cx-btn { margin-left: auto; }

/* --- Einladung einlösen --- */
.cx-einladung-form-halter { max-width: 430px; margin: 10px 0 30px; }
.cx-einladung-form { display: grid; gap: 10px; }
.cx-einladung-form input {
  padding: 11px 13px; font: inherit;
  background: var(--cx-graphite); color: var(--cx-text);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-einladung-meldung { margin: 4px 0 0; }
.cx-einladung-meldung.fehler { color: var(--cx-warn); }

/* --- Anforderungskatalog (Vergleich + Druckblatt) --- */
.cx-vgl-katalog {
  display: flex; gap: 14px; align-items: center; justify-content: space-between;
  flex-wrap: wrap; margin: 18px 0; padding: 14px 18px;
  background: var(--cx-carbon); border: 1px dashed var(--cx-border);
  border-radius: var(--cx-radius);
}
.cx-vgl-katalog p { margin: 0; color: var(--cx-text-muted); }
.cx-kat-kopfzeile, .cx-kat-zeile {
  display: grid; grid-template-columns: 64px 64px 1fr; gap: 8px;
  align-items: center; padding: 4px 0;
}
.cx-kat-zeile { border-bottom: 1px solid #d8dce2; }
.cx-kat-kasten {
  width: 14px; height: 14px; margin: 0 auto;
  border: 1.5px solid #6b7280; border-radius: 3px;
}
.cx-kat-kk { font-size: 10px; text-align: center; color: #6b7280;
  text-transform: uppercase; letter-spacing: .04em; }
.cx-kat-text { font-size: 12px; line-height: 1.35; }

/* --- Entscheidungsvorlage (Druckblatt) --- */
.cx-ev-block h3 { margin: 0 0 4px; font-size: 14px; }
.cx-ev-block h3 small { color: #6b7280; font-weight: 400; margin-left: 6px; }
.cx-ev-block p { margin: 3px 0; font-size: 11.5px; line-height: 1.4; }
.cx-ev-nutzen { color: #374151; }
.cx-ev-t { display: block; margin: 7px 0 2px; font-size: 10.5px;
  text-transform: uppercase; letter-spacing: .05em; color: #6b7280; }
.cx-ev-block ul { margin: 0 0 4px 16px; padding: 0; font-size: 11.5px; }
.cx-ev-block li { margin: 1px 0; }
.cx-ev-betrieb { border-collapse: collapse; margin-top: 5px; font-size: 11px; }
.cx-ev-betrieb th { text-align: left; padding: 1.5px 10px 1.5px 0;
  color: #6b7280; font-weight: 500; vertical-align: top; white-space: nowrap; }
.cx-ev-betrieb td { padding: 1.5px 0; }

/* --- Startseite und Zugang: Firmen-Bausteine --- */
.cx-start-firmen { border-top: 1px solid var(--cx-border); padding-top: 28px; }
.cx-zugang-firma-weiche { margin-top: 10px; }

/* Der Wettbewerbs-Abschnitt hat seit der Bereichs-Korrektur einen festen
   Container, dessen Inhalt beim Produktwechsel getauscht wird. Bietet der
   Bereich keine Gegner, bleibt er leer – dann darf er auch keinen Abstand
   und keine Trennlinie hinterlassen. */
.cx-sb-mb:empty { display: none; }

.cx-sb-mbrest { margin: 12px 0 0; color: var(--cx-text-muted); font-size: 13.5px; }

/* ============================================================
   Die zwei Türen auf der Startseite (1.90.2)
   ============================================================
   Seit es neben dem Partner- auch einen Unternehmenszugang gibt, standen
   beide Angebote untereinander, ohne dass irgendwo stand, welches für wen
   ist. Schlimmer noch: Die Übersichtstabelle kannte den zweiten Zugang gar
   nicht und beschrieb unter „Für Mitarbeitende registrierter Firmen“ Inhalte,
   die ein Firmen-Konto nie zu sehen bekommt.

   Die Farbe ist hier kein Schmuck, sondern die Klammer: Dieselbe Marke trägt
   die Türkarte oben, der zugehörige Abschnitt in der Mitte und die Spalte in
   der Tabelle unten. Blau für den Vertriebsweg (die Hausfarbe), Petrol für
   den Einkaufsweg – beide aus der vorhandenen Bandpalette, die für hell und
   dunkel getrennt nachgerechnet ist. Als Balken und Rahmen eingesetzt, nie
   als Textfarbe: So hängt die Lesbarkeit nicht am Farbwert. */

.cx-tuer-partner { --cx-tuer: var(--cx-blue); }
.cx-tuer-firma   { --cx-tuer: var(--cx-band1); }

/* Der Strich am Etikett verbindet Abschnitt und Türkarte. Nur an den beiden
   Startseiten-Abschnitten, damit kein anderes Etikett der Anwendung ihn
   ungewollt erbt. */
.cx-start-systemhaus > .cx-eyebrow::before,
.cx-start-firmen > .cx-eyebrow::before {
  content: ""; display: inline-block; width: 22px; height: 3px;
  border-radius: 2px; margin-right: 9px; vertical-align: middle;
  position: relative; top: -1px; background: var(--cx-tuer);
}

.cx-tueren-grid {
  display: grid; gap: var(--cx-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(330px, 100%), 1fr));
  align-items: stretch;
}
/* Die Karte ist eine Tür: oben die Marke, unten der Knopf. Flex mit
   margin-top:auto am Knopf hält die Knöpfe beider Karten auf einer Höhe,
   auch wenn die Aufzählungen ungleich lang werden. */
.cx-tuer {
  display: flex; flex-direction: column;
  border-top: 3px solid var(--cx-tuer);
}
.cx-tuer h3 { margin: 0 0 4px; font-size: 20px; line-height: 1.3; }
.cx-tuer-wer {
  margin: 0 0 16px; font-size: 13px; color: var(--cx-steel);
  text-transform: uppercase; letter-spacing: .05em; line-height: 1.5;
}
.cx-tuer ul { margin: 0 0 20px; padding-left: 18px; display: grid; gap: 9px; }
.cx-tuer li { font-size: 15px; line-height: 1.55; color: var(--cx-text-muted); }
.cx-tuer-knopf { margin-top: auto; align-self: flex-start; }
.cx-tueren-fuss {
  margin: 18px 0 0; font-size: 14.5px; line-height: 1.6;
  color: var(--cx-text-muted);
}

/* --- Die Tabelle mit vier Spalten ---------------------------------------
   Bei vier Karten reicht die Mindestbreite von 280 px der Dreier-Fassung
   nicht: Auf einem 1280er Fenster ergäbe das vier 300-px-Spalten, in denen
   jede Zeile umbricht. Deshalb 240 px, was ab rund 1080 px vier Spalten
   trägt und darunter sauber auf 2 × 2 fällt statt auf 3 + 1. */
/* FESTE SPALTENZAHLEN, kein auto-fit: Mit minmax(240px, 1fr) passten bei
   860 px genau drei Spalten – die vierte rutschte allein in die zweite Zeile.
   Ein 3+1-Umbruch liest sich wie „die vierte gehört nicht dazu“, und genau
   das soll die Tabelle ja nicht sagen. Vier oder zwei mal zwei oder eine. */
/* Die vierte Spalte bekommt weniger Breite (0.78fr statt 1fr). Das ist der
   eigentliche Träger der Aussage „nachrangig“ – die Dämpfung über die Fläche
   allein trägt sie nicht: Kartenfarbe und Seitenfarbe unterscheiden sich um
   1,05:1 im Dunkel- und 1,09:1 im Hellmodus, gemessen, nicht geschätzt. Wer
   sich auf sie verlässt, hat vier gleich aussehende Spalten und wundert sich,
   warum niemand merkt, dass eine davon keine Tür ist. Breite dagegen sieht
   man sofort, und sie kostet keinen Kontrast. */
.cx-zugang-grid-vier { grid-template-columns: repeat(3, minmax(0, 1fr)) 0.78fr; }
@media (max-width: 1099px) {
  .cx-zugang-grid-vier { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 619px) {
  .cx-zugang-grid-vier { grid-template-columns: 1fr; }
}
.cx-zugang-grid-vier > .cx-zugang {
  border-top: 3px solid var(--cx-border);
}
.cx-zugang-firma  { --cx-tuer: var(--cx-band1); }
.cx-zugang-hervor { --cx-tuer: var(--cx-blue); }
.cx-zugang-grid-vier .cx-zugang-firma  { border-top-color: var(--cx-band1); }
/* Die Dreier-Fassung färbte beim Partnerzugang den ganzen Rahmen – das war
   die Hervorhebung der EINEN Zielspalte. Jetzt gibt es zwei gleichwertige
   Türen, also trägt auch der Partner nur noch den Balken oben. Die höhere
   Spezifität ist Absicht und überschreibt .cx-zugang-hervor. */
.cx-zugang-grid-vier .cx-zugang-hervor {
  border-color: var(--cx-border); border-top-color: var(--cx-blue);
}
/* In der Tabelle ein Textlink, kein Knopf. In einer 240 px schmalen Spalte
   bricht „Zugang beantragen“ im Knopf auf drei Zeilen und steht dann 25 px
   höher als der Nachbar – gemessen bei 1080 px. Der Link bricht auch, fällt
   dabei aber nicht auf. Gehandelt wird ohnehin oben an der Weiche; hier ist
   der Weg dorthin nur die Abkürzung für den, der bis hierher gelesen hat. */
.cx-zugang-link {
  margin-top: auto; padding-top: 4px; align-self: flex-start;
  font-size: 14.5px; font-weight: 600; line-height: 1.5;
  text-decoration: none;
}
/* NICHT --cx-blue und nicht --cx-tuer: Als Balken taugt die Hausfarbe, als
   TEXT auf der Kartenfläche erreicht sie im Dunkelmodus nur 4,55:1 – über der
   Norm, aber ohne Reserve. Die Bandfarben sind für beide Modi getrennt
   nachgerechnet, deshalb stehen sie hier. Nachgerechnet, nicht angesehen:
   Ein Farbwert bedient hell und dunkel nie beide. */
.cx-zugang-firma .cx-zugang-link  { color: var(--cx-band1); }
.cx-zugang-hervor .cx-zugang-link { color: var(--cx-band0); }
.cx-zugang-link:hover { text-decoration: underline; }
.cx-zugang-grid-vier .cx-zugang ul { margin-bottom: 18px; }
/* „Intern“ ist die einzige Spalte, die niemand beantragen kann. Sie tritt
   zurück, ohne dass die Schrift darunter leidet: KEINE opacity auf der Karte.
   Die dämpft den Text mit, und weil gedämpft ja gewollt aussieht, fällt im
   Bild nicht auf, dass die Zielgruppenzeile damit auf 2,96:1 rutscht – unter
   jeder Norm. Zurück tritt sie deshalb über die FLÄCHE: keine eigene
   Kartenfarbe, gestrichelter Rand. Das liest sich als „Auskunft, kein
   Angebot“, und jeder Buchstabe behält seinen vollen Kontrast.
   Weggelassen wird die Spalte trotzdem nicht – die Frage „und was sieht der
   Vertrieb?“ kommt sonst im Gespräch. */
.cx-zugang-still {
  background: transparent;
  border-style: dashed;
  box-shadow: none;
}
/* Der obere Rand bleibt 3 px breit und wird nur gestrichelt – NICHT auf 1 px
   verschmälert. Sonst säße die vierte Überschrift zwei Pixel höher als die
   drei anderen, und ein Innenabstand, der das ausgleicht, müsste den Wert
   aus .cx-card kennen: Ändert der sich, verrutscht die Spalte wieder, ohne
   dass jemand hier nachsieht. Gemessen war der Versatz genau da (3623 /
   3623 / 3623 / 3621).
   Der Schatten braucht im Hellmodus eine eigene Zeile: Dort setzt ihn
   html[data-theme="light"] .cx-card, und diese Auswahl ist spezifischer als
   eine einzelne Klasse – der box-shadow: none oben lief ins Leere. Im
   Dunkelmodus gibt es keinen Schatten, deshalb fiel es dort nicht auf. */
html[data-theme="light"] .cx-zugang-still {
  box-shadow: none; background: transparent;
}
/* --cx-text-muted statt --cx-steel: Die Karte trägt opacity .72, und die
   dämpft den Text MIT. Steel kam damit auf 3,62:1 und lag unter der Norm –
   im Bild sieht man das nicht, weil gedämpft ja gewollt aussieht. */
.cx-zugang-fuss {
  margin: auto 0 0; padding-top: 14px; font-size: 13.5px;
  line-height: 1.5; color: var(--cx-text-muted); font-style: italic;
}

@media (max-width: 720px) {
  /* Wie bei den übrigen Startseiten-Knöpfen: content-box plus 100 %, sonst
     ragen die 2 × 28 px Innenabstand seitlich hinaus. */
  .cx-tuer-knopf {
    width: 100%; box-sizing: border-box; text-align: center;
  }
}

/* ---- „So stellen Sie eine Anfrage" (1.90.6) -----------------------------
   Die Anfragenseite nannte den Weg in einem Nebensatz und hatte keinen
   einzigen Link; wer noch nie angefragt hatte, musste raten. Nummeriert ist
   sie, weil hier wirklich eine Reihenfolge gilt – erst der Hersteller, dann
   der Kasten auf dem Steckbrief, dann die Anzeige hier. Die Scheibe greift
   die Form der MITRE-Schritte auf, eine Nummer kleiner. */
.cx-wie-schritte {
  margin: 0; padding: 0; list-style: none;
  display: grid; gap: 20px; counter-reset: cx-wie;
}
.cx-wie-schritte > li {
  position: relative; padding-left: 50px;
  font-size: 15.5px; line-height: 1.62; color: var(--cx-text-muted);
}
.cx-wie-schritte > li::before {
  counter-increment: cx-wie; content: counter(cx-wie);
  position: absolute; left: 0; top: -2px;
  width: 34px; height: 34px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--cx-blue); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-wie-schritte > li b { color: var(--cx-text); font-weight: 600; }
.cx-wie-knoepfe { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 12px; }
.cx-wie-kurz {
  margin: 18px 0 0; padding: 12px 16px;
  border-left: 3px solid var(--cx-blue);
  background: rgba(30,123,232,.07);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
  font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted);
}
.cx-wie-kurz b { color: var(--cx-text); }
html[data-theme="light"] .cx-wie-kurz { background: rgba(30,123,232,.06); }

@media (max-width: 720px) {
  .cx-wie-knoepfe .cx-btn-secondary { width: 100%; box-sizing: border-box; text-align: center; }
}

/* ---- Quantencomputer erklärt (1.91.0) -----------------------------------
   Zwei Rechner tragen diesen Beitrag: die Zustandskugel und der Zähler.
   Beide sind keine Zierde – die Frage „Was ist ein Qubit, wenn nicht 0 oder
   1?" lässt sich in Prosa nicht beantworten, weil die Antwort zwei
   voneinander unabhängige Größen hat. Farbig geführt sind deshalb genau
   drei Dinge: der Zeiger (der Zustand), das Lot (die Neigung, also die
   Wahrscheinlichkeit) und die Drehung am Boden (die Phase). Alles andere
   bleibt Linienzeichnung, sonst konkurrieren die Farben mit der Aussage. */

/* -- Die drei Rollen im Einstiegsbild: Schalter, Münze, Tisch ------------- */
.cx-qc-rollen {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px; margin: 22px 0 18px;
}
.cx-qc-rolle {
  padding: 16px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-top: 3px solid var(--cx-border);
  display: flex; flex-direction: column; gap: 4px;
}
.cx-qc-rolle.r0 { border-top-color: var(--cx-steel); }
.cx-qc-rolle.r1 { border-top-color: var(--cx-band1); }
.cx-qc-rolle.r2 { border-top-color: var(--cx-band2); }
.cx-qc-rolle-wer {
  font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--cx-text-muted); font-weight: 600;
}
.cx-qc-rolle b { font-size: 16px; }
.cx-qc-rolle-bild { font-size: 14px; color: var(--cx-text-muted); line-height: 1.5; }
.cx-qc-rolle em {
  margin-top: 6px; font-size: 14px; color: var(--cx-band0); font-style: italic;
}

/* -- Zwei wiederkehrende Kästen: die Einschränkung und die Randnotiz ------
   „irrtum" trägt die Sätze, die ein Missverständnis geradeziehen; „notiz"
   das Beiwerk, das man mitnehmen kann, aber nicht muss. Sie sehen bewusst
   verschieden aus – ein Leser, der quer liest, soll die Einschränkungen
   finden, ohne alles zu lesen. */
.cx-qc-irrtum, .cx-qc-notiz {
  margin: 20px 0; padding: 16px 20px;
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
  font-size: 14.5px; line-height: 1.65;
}
.cx-qc-irrtum {
  border-left: 3px solid var(--cx-band3);
  background: rgba(229,168,59,.09);
}
.cx-qc-notiz {
  border-left: 3px solid var(--cx-border);
  background: var(--cx-carbon);
}
.cx-qc-irrtum b, .cx-qc-notiz b {
  display: block; margin-bottom: 6px; font-size: 15px; color: var(--cx-text);
}
.cx-qc-irrtum p, .cx-qc-notiz p { margin: 0; color: var(--cx-text-muted); }
.cx-qc-irrtum p + p, .cx-qc-notiz p + p { margin-top: 10px; }
.cx-qc-irrtum.gross { padding: 20px 24px; }
.cx-qc-zitat {
  font-size: 16px; font-style: italic; color: var(--cx-text) !important;
  margin-bottom: 10px !important;
}
html[data-theme="light"] .cx-qc-irrtum { background: rgba(138,90,0,.07); }

/* -- Zwischenüberschrift innerhalb eines Kapitels ------------------------ */
.cx-qc-unter {
  margin: 30px 0 10px; font-size: 18px; font-weight: 600; color: var(--cx-text);
}
.cx-qc-bildsatz {
  margin: 8px 0 20px; font-size: 17px; font-style: italic;
  color: var(--cx-band1); font-weight: 500;
}

/* -- Der Rechner-Rahmen (beide Rechner teilen ihn) ----------------------- */
.cx-qc-rechner { padding: 24px 26px; margin: 22px 0; }
.cx-qc-rechner-text {
  margin: 6px 0 18px; font-size: 14.5px; line-height: 1.6;
  color: var(--cx-text-muted);
}
.cx-qc-rechner-grid {
  display: grid; grid-template-columns: 280px minmax(0, 1fr);
  gap: 26px; align-items: start;
}
.cx-qc-regler { margin-bottom: 14px; }

/* -- Die Zustandskugel ---------------------------------------------------
   Die Ellipse des Äquators ist keine Zierperspektive: Nur durch die
   Verkürzung sieht man, dass die Drehung eine zweite Achse ist. In einer
   flachen Kreisdarstellung fielen Neigung und Phase optisch zusammen –
   und genau deren Unterschied ist der Punkt des Kapitels. */
.cx-qc-kugel { margin: 0; }
.cx-qc-kugel svg { width: 100%; height: auto; display: block; overflow: visible; }
/* Umriss und Äquator auf --cx-steel und NICHT auf --cx-border: Gegen die
   leicht blaue Kugelfläche kommt der Rahmenton auf 1,23:1 – unter 1,3:1
   trennt ein Auge nichts mehr, die Kugel war in der Sichtprobe nur zu
   erahnen. Steel erreicht 4,69:1 dunkel und 4,84:1 hell und bleibt dem
   Zeiger (7,03:1) trotzdem klar untergeordnet. */
.cx-qc-huelle {
  fill: rgba(63,169,255,.05); stroke: var(--cx-steel); stroke-width: 1;
}
.cx-qc-aequator {
  fill: none; stroke: var(--cx-steel); stroke-width: 1; stroke-dasharray: 4 4;
}
.cx-qc-achse { fill: none; stroke: var(--cx-steel); stroke-width: 1; }
.cx-qc-pol { fill: var(--cx-steel); }
.cx-qc-pollabel {
  fill: var(--cx-text-muted); font-size: 12.5px; font-weight: 600;
}
.cx-qc-zeiger {
  stroke: var(--cx-band0); stroke-width: 2.5; stroke-linecap: round;
}
.cx-qc-spitze { fill: var(--cx-band0); }
/* Lot und Drehung sind Hilfslinien und dürfen den Zeiger nicht überstimmen:
   dünner, gestrichelt, und die Drehung in der Farbe des Phasenreglers. */
.cx-qc-lot {
  stroke: var(--cx-steel); stroke-width: 1.2; stroke-dasharray: 3 3;
}
.cx-qc-fuss { fill: var(--cx-band2); }
.cx-qc-drehung {
  stroke: var(--cx-band2); stroke-width: 1.6; stroke-dasharray: 5 3;
}

/* -- Wahrscheinlichkeitsbalken ------------------------------------------- */
.cx-qc-balken { display: grid; gap: 10px; margin: 18px 0 14px; }
.cx-qc-balken-zeile {
  display: grid; grid-template-columns: 150px minmax(0, 1fr) 62px;
  align-items: center; gap: 12px; font-size: 14px; color: var(--cx-text-muted);
}
.cx-qc-balken-zeile > b:last-child {
  text-align: right; color: var(--cx-text); font-variant-numeric: tabular-nums;
}
.cx-qc-schiene {
  height: 12px; border-radius: 99px; overflow: hidden;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-qc-schiene i {
  display: block; height: 100%; width: 0;
  background: var(--cx-band0); transition: width .12s linear;
}
.cx-qc-schiene i.eins { background: var(--cx-band2); }
.cx-qc-deutung {
  margin: 0 0 14px; padding: 12px 14px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 14px; line-height: 1.6; color: var(--cx-text-muted);
  min-height: 72px;
}

/* -- Sprungmarken unter beiden Reglern ----------------------------------- */
.cx-qc-marken { display: flex; flex-wrap: wrap; gap: 8px; }
.cx-qc-marke {
  padding: 7px 13px; border-radius: 99px; cursor: pointer;
  font: inherit; font-size: 13px;
  color: var(--cx-text-muted);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-qc-marke:hover { color: var(--cx-text); border-color: var(--cx-steel); }

/* -- Der Zählregler ------------------------------------------------------ */
.cx-qc-zahl {
  margin: 16px 0 18px; padding: 18px 20px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-qc-zahl-vor {
  display: block; font-size: 12px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--cx-text-muted); font-weight: 600;
}
.cx-qc-zahl b {
  display: block; margin: 4px 0 2px;
  font-size: 30px; line-height: 1.15; color: var(--cx-band0);
  font-variant-numeric: tabular-nums; word-break: break-word;
}
.cx-qc-zahl b sup { font-size: .55em; }
.cx-qc-zahl-nach { font-size: 14.5px; color: var(--cx-text-muted); }

/* -- Die zwei Wellenbilder zur Phase -------------------------------------
   Die Summenkurve steht unter den beiden Ausgangswellen und liegt auf der
   Nulllinie, wenn sie sich auslöschen. Dass dort dann NICHTS zu sehen ist,
   ist die Aussage – deshalb bleibt die Nulllinie in beiden Fällen sichtbar,
   sonst wäre der rechte Fall nur eine leere Fläche. */
.cx-qc-fall { padding: 20px 22px; }
.cx-qc-fall.plus  { border-color: rgba(47,191,113,.42); }
.cx-qc-fall.minus { border-color: rgba(139,123,240,.45); }
.cx-qc-fall-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; margin-bottom: 12px;
}
.cx-qc-fall-kopf b { font-size: 16px; }
.cx-qc-fall-marke {
  font-size: 12.5px; font-weight: 600; letter-spacing: .04em;
  padding: 3px 10px; border-radius: 99px;
}
.cx-qc-fall.plus  .cx-qc-fall-marke { background: rgba(47,191,113,.14);  color: var(--cx-accent); }
.cx-qc-fall.minus .cx-qc-fall-marke { background: rgba(139,123,240,.16); color: var(--cx-band2); }
.cx-qc-fall p { margin: 12px 0 0; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-qc-welle { width: 100%; height: auto; display: block; }
.cx-qc-welle path { fill: none; stroke-width: 2; stroke-linecap: round; }
.cx-qc-welle-a { stroke: var(--cx-band0); }
.cx-qc-welle-b { stroke: var(--cx-band2); }
.cx-qc-welle-null { stroke: var(--cx-border); stroke-width: 1; stroke-dasharray: 4 4; }
.cx-qc-welle-summe.plus  { stroke: var(--cx-accent); stroke-width: 2.6; }
.cx-qc-welle-summe.minus { stroke: var(--cx-steel); stroke-width: 2.6; }

/* -- Die zwei verschränkten Würfel --------------------------------------- */
.cx-qc-wuerfel { padding: 22px 24px; margin: 18px 0; }
.cx-qc-wuerfel h3 { margin: 0 0 8px; font-size: 17px; }
.cx-qc-wuerfel > p { margin: 0; font-size: 14.5px; line-height: 1.65; color: var(--cx-text-muted); }
.cx-qc-wuerfel-paar {
  display: flex; align-items: center; justify-content: center;
  gap: 18px; margin-top: 18px; flex-wrap: wrap;
}
.cx-qc-wuerfel-stein { font-size: 44px; line-height: 1; color: var(--cx-band1); }
.cx-qc-wuerfel-band {
  font-size: 13px; letter-spacing: .04em; color: var(--cx-text-muted);
  padding: 5px 14px; border-radius: 99px;
  border: 1px dashed var(--cx-border);
}

/* -- Was er kann: die Einordnung steht ÜBER dem Titel -------------------- */
.cx-qc-kann article { display: flex; flex-direction: column; }
.cx-qc-kann-wie {
  font-size: 12px; letter-spacing: .05em; text-transform: uppercase;
  font-weight: 600; color: var(--cx-band1);
}
.cx-qc-kann h3 { margin: 6px 0 8px; font-size: 16.5px; }
.cx-qc-kann p { margin: 0; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-qc-nicht { margin-top: 12px; }

/* Rot für „das bricht wirklich": Der aus der WAF übernommene Ton #E06A6A
   erreicht im Hellmodus auf Weiß nur 3,26:1 und wäre als Wort damit fahl.
   Dieselbe Familie, abgedunkelt: 5,20:1 auf Weiß, 4,77:1 auf der
   Seitenfläche. Nachgerechnet, weil ein Screenshot Kontrastverhältnisse
   nicht zeigt und „gedämpft" wie Absicht aussieht. */
:root { --cx-qc-rot: #E06A6A; }
html[data-theme="light"] { --cx-qc-rot: #C43B3B; }

/* -- Die zwei Angriffe: Shor und Grover ---------------------------------- */
.cx-qc-angriff { padding: 22px 24px; }
.cx-qc-angriff.schwer { border-color: rgba(224,106,106,.45); }
.cx-qc-angriff.leicht { border-color: rgba(229,168,59,.42); }
.cx-qc-angriff-kopf {
  display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px;
}
.cx-qc-angriff-kopf b { font-size: 20px; }
.cx-qc-angriff.schwer .cx-qc-angriff-kopf b { color: var(--cx-qc-rot); }
.cx-qc-angriff.leicht .cx-qc-angriff-kopf b { color: var(--cx-band3); }
.cx-qc-angriff-kopf span { font-size: 13px; color: var(--cx-text-muted); font-variant-numeric: tabular-nums; }
.cx-qc-angriff h3 { margin: 0 0 10px; font-size: 16px; line-height: 1.4; }
.cx-qc-angriff p { margin: 0; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }
.cx-qc-angriff-was {
  display: block; margin: 16px 0 6px; font-size: 12px; letter-spacing: .06em;
  text-transform: uppercase; font-weight: 600; color: var(--cx-text-muted);
}
.cx-qc-betrifft { margin: 0 0 14px; padding-left: 20px; }
.cx-qc-betrifft li { font-size: 13.5px; line-height: 1.7; color: var(--cx-text-muted); }
.cx-qc-angriff-folge {
  padding-top: 12px; border-top: 1px solid var(--cx-border);
  color: var(--cx-text) !important; font-weight: 500;
}
.cx-qc-ernte { margin: 24px 0; }
.cx-qc-ernte h3 { margin: 6px 0 12px; font-size: 19px; }

/* -- Die Rechnung mit drei Zahlen (Mosca) -------------------------------- */
.cx-qc-mosca { display: grid; gap: 12px; margin: 18px 0; }
.cx-qc-mosca-teil {
  display: flex; gap: 14px; align-items: flex-start;
  padding: 16px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-qc-mosca-zeichen {
  flex: none; width: 34px; height: 34px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 15px; font-weight: 700;
  color: var(--cx-band0); background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
}
.cx-qc-mosca-teil b { font-size: 15px; }
.cx-qc-mosca-teil p { margin: 3px 0 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }

/* -- Die vier NIST-Standards --------------------------------------------- */
.cx-qc-standard { display: flex; flex-direction: column; }
.cx-qc-norm {
  align-self: flex-start; padding: 3px 10px; border-radius: 99px;
  font-size: 12px; font-weight: 600; letter-spacing: .04em;
  color: var(--cx-band0); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-qc-standard h3 { margin: 10px 0 2px; font-size: 18px; }
.cx-qc-zweck { font-size: 13.5px; color: var(--cx-band1); font-weight: 600; }
.cx-qc-standard p { margin: 10px 0 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-qc-aus {
  margin-top: auto; padding-top: 12px;
  font-size: 12.5px; color: var(--cx-text-muted); font-style: italic;
}
.cx-qc-laeuft { margin-top: 12px; }

/* -- Die zwei Herstellergruppen ------------------------------------------ */
.cx-qc-gruppe { margin-bottom: 26px; }
.cx-qc-gruppe-text {
  margin: 0 0 14px; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted);
}

/* -- Die drei Sätze für den Termin --------------------------------------- */
.cx-qc-saetze { display: grid; gap: 14px; margin: 14px 0 20px; }
.cx-qc-satz {
  padding: 16px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-qc-satz b { display: block; font-size: 13.5px; color: var(--cx-text-muted); font-weight: 600; }
.cx-qc-satz p { margin: 6px 0 0; font-size: 15.5px; line-height: 1.6; color: var(--cx-text); }

/* -- Schmale Fenster ----------------------------------------------------
   Bei 860 px hat jede Seite ohnehin eine Scrollleiste; die Kugel darf
   deshalb nicht auf einer festen Spaltenbreite bestehen. Ab 960 px rutscht
   sie über die Anzeige, ab 720 px werden aus drei Rollen eine Spalte. */
@media (max-width: 960px) {
  .cx-qc-rechner-grid { grid-template-columns: minmax(0, 1fr); }
  .cx-qc-kugel { max-width: 300px; margin: 0 auto; }
}
@media (max-width: 720px) {
  .cx-qc-rollen { grid-template-columns: minmax(0, 1fr); }
  .cx-qc-balken-zeile { grid-template-columns: 116px minmax(0, 1fr) 56px; gap: 8px; }
  .cx-qc-rechner { padding: 18px 16px; }
  .cx-qc-zahl b { font-size: 24px; }
  .cx-qc-deutung { min-height: 0; }
}

/* ---- Verschlüsselte E-Mail erklärt (1.92.0) -----------------------------
   Zwei Bilder tragen diesen Beitrag, und beide leben davon, dass zwei
   Zustände NEBENEINANDER stehen: die Wegzeile (mit TLS / mit Zertifikat)
   und die Demo (beim Empfänger / beim Mitleser). Deshalb sind sie im
   schmalen Fenster untereinander gestapelt und NICHT gescrollt – ein
   Vergleich, den man wegschieben muss, ist keiner.

   Zustände stehen überall doppelt da: als Farbe UND als Zeichen. Rot gegen
   Grün allein trägt die Aussage nicht, wenn jemand die beiden nicht
   unterscheidet – und hier hängt der ganze Erklärwert daran. */

/* -- Die drei Stufen im Einstiegsbild ------------------------------------ */
.cx-sm-stufen {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px; margin: 22px 0 18px;
}
.cx-sm-stufe {
  padding: 16px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-top: 3px solid var(--cx-border);
  display: flex; flex-direction: column; gap: 5px;
}
.cx-sm-stufe.offen  { border-top-color: var(--cx-qc-rot); }
.cx-sm-stufe.siegel { border-top-color: var(--cx-band3); }
.cx-sm-stufe.zu     { border-top-color: var(--cx-band4); }
.cx-sm-stufe-marke {
  align-self: flex-start; padding: 3px 10px; border-radius: 99px;
  font-size: 11.5px; font-weight: 600; letter-spacing: .04em;
  border: 1px solid var(--cx-border);
}
.cx-sm-stufe.offen  .cx-sm-stufe-marke { color: var(--cx-qc-rot); }
.cx-sm-stufe.siegel .cx-sm-stufe-marke { color: var(--cx-band3); }
.cx-sm-stufe.zu     .cx-sm-stufe-marke { color: var(--cx-band4); }
.cx-sm-stufe b { font-size: 16px; margin-top: 4px; }
.cx-sm-stufe-wer { font-size: 13px; color: var(--cx-text-muted); font-style: italic; }
.cx-sm-stufe p { margin: 4px 0 0; font-size: 14px; line-height: 1.55; color: var(--cx-text-muted); }

.cx-sm-bildsatz {
  margin: 4px 0 18px; font-size: 16px; font-style: italic;
  color: var(--cx-band1); line-height: 1.55;
}

/* -- Die Wegzeile: sieben Stationen, zweimal ----------------------------
   Die Spalten müssen in beiden Zeilen exakt übereinanderstehen, sonst
   vergleicht das Auge die falschen Paare. Deshalb ein gemeinsames Raster
   mit fester Spaltenzahl statt zweier unabhängiger Flex-Zeilen. */
.cx-sm-weg { padding: 22px 24px; margin: 18px 0; display: grid; gap: 18px; }
.cx-sm-weg-zeile {
  display: grid; grid-template-columns: 190px minmax(0, 1fr);
  gap: 18px; align-items: center;
}
.cx-sm-weg-zeile + .cx-sm-weg-zeile { padding-top: 18px; border-top: 1px solid var(--cx-border); }
.cx-sm-weg-name b { display: block; font-size: 15px; }
.cx-sm-weg-name span { font-size: 12.5px; color: var(--cx-text-muted); line-height: 1.45; }
.cx-sm-weg-punkte {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px;
}
.cx-sm-weg-punkt { display: flex; flex-direction: column; align-items: center; gap: 4px; text-align: center; }
.cx-sm-weg-ort {
  font-size: 11px; color: var(--cx-text-muted); line-height: 1.25;
  overflow-wrap: anywhere;
}
.cx-sm-stat {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  width: 100%; padding: 8px 2px; border-radius: var(--cx-radius-sm);
  border: 1px solid var(--cx-border); font-size: 15px;
}
.cx-sm-stat svg { display: block; }
.cx-sm-stat em { font-size: 10.5px; font-style: normal; font-weight: 600; letter-spacing: .02em; }
/* Die Farbe sitzt am Container und NICHT am <em>: Nur so erbt das Zeichen
   sie über currentColor mit. Am <em> gesetzt blieb der Strich auf der
   allgemeinen Textfarbe – im Bild sah das ordentlich aus, trug die Aussage
   aber nicht mit, und der Kommentar im Code behauptete das Gegenteil. */
.cx-sm-stat.dicht {
  background: rgba(95,208,138,.10); border-color: rgba(95,208,138,.40);
  color: var(--cx-band4);
}
.cx-sm-stat.klar {
  background: rgba(224,106,106,.10); border-color: rgba(224,106,106,.40);
  color: var(--cx-qc-rot);
}
html[data-theme="light"] .cx-sm-stat.dicht { background: rgba(46,125,79,.08); }
html[data-theme="light"] .cx-sm-stat.klar  { background: rgba(196,59,59,.07); }

.cx-sm-stationen {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 12px; margin: 18px 0;
}
.cx-sm-station {
  padding: 13px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-sm-station b { font-size: 14px; }
.cx-sm-station p { margin: 3px 0 0; font-size: 13.5px; line-height: 1.55; color: var(--cx-text-muted); }

/* -- Signieren gegen Verschlüsseln --------------------------------------- */
.cx-sm-vorgang { padding: 22px 24px; }
.cx-sm-vorgang.signieren     { border-color: rgba(229,168,59,.42); }
.cx-sm-vorgang.verschluesseln{ border-color: rgba(95,208,138,.42); }
.cx-sm-vorgang-name { display: block; font-size: 19px; }
.cx-sm-vorgang.signieren      .cx-sm-vorgang-name { color: var(--cx-band3); }
.cx-sm-vorgang.verschluesseln .cx-sm-vorgang-name { color: var(--cx-band4); }
.cx-sm-vorgang-frage {
  margin: 4px 0 12px !important; font-size: 15.5px; font-style: italic;
  color: var(--cx-text) !important;
}
.cx-sm-vorgang p { margin: 0 0 10px; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }
.cx-sm-braucht {
  padding: 9px 13px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-text) !important; font-weight: 500; font-size: 14px !important;
}
.cx-sm-nicht {
  margin: 12px 0 0 !important; padding-top: 12px;
  border-top: 1px solid var(--cx-border);
}
.cx-sm-nicht b { color: var(--cx-band3); }

/* -- Die Demo: zwei Blickwinkel auf dieselbe Nachricht -------------------
   Die rechte Spalte ist die eigentliche Aussage der Seite, deshalb trägt
   nur sie eine Farbmarke am Kopf. Zwei gleich gestaltete Spalten würden
   das Bild in „zweimal dasselbe" verwandeln. */
.cx-sm-demo { margin-top: 24px; }
.cx-sm-demo-knoepfe { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.cx-sm-demo-knopf {
  padding: 9px 16px; border-radius: 99px; cursor: pointer; font: inherit; font-size: 14px;
  color: var(--cx-text-muted); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-sm-demo-knopf:hover { color: var(--cx-text); border-color: var(--cx-steel); }
.cx-sm-demo-knopf.aktiv {
  color: var(--cx-text); border-color: var(--cx-band0); font-weight: 600;
  background: rgba(63,169,255,.10);
}
html[data-theme="light"] .cx-sm-demo-knopf.aktiv { background: rgba(13,80,216,.07); }
.cx-sm-demo-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px;
}
.cx-sm-demo-seite { display: flex; flex-direction: column; }
.cx-sm-demo-kopf {
  font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  font-weight: 600; margin-bottom: 8px;
}
.cx-sm-demo-kopf.empfaenger { color: var(--cx-text-muted); }
.cx-sm-demo-kopf.mitleser   { color: var(--cx-qc-rot); }
.cx-sm-mail {
  border-radius: var(--cx-radius-sm); border: 1px solid var(--cx-border);
  background: var(--cx-graphite); overflow: hidden;
}
.cx-sm-mail-kopf { padding: 12px 14px; border-bottom: 1px solid var(--cx-border); display: grid; gap: 4px; }
.cx-sm-mail-kopf > div { display: grid; grid-template-columns: 62px minmax(0, 1fr); gap: 8px; font-size: 13px; }
.cx-sm-mail-kopf span { color: var(--cx-text-muted); }
.cx-sm-mail-kopf b { font-weight: 500; overflow-wrap: anywhere; }
.cx-sm-siegel {
  display: flex; gap: 9px; align-items: flex-start;
  padding: 9px 14px; font-size: 12.5px; line-height: 1.45;
  background: rgba(95,208,138,.10); color: var(--cx-band4);
  border-bottom: 1px solid rgba(95,208,138,.30);
}
html[data-theme="light"] .cx-sm-siegel { background: rgba(46,125,79,.08); }
.cx-sm-mail-text {
  margin: 0; padding: 14px; font-size: 13px; line-height: 1.6;
  white-space: pre-wrap; overflow-wrap: anywhere;
  font-family: var(--cx-font-body); color: var(--cx-text-muted);
  max-height: 230px; overflow-y: auto;
}
/* Der Zeichensalat: bewusst als Schreibmaschinenschrift und gedämpft –
   er soll als „hier steht nichts Lesbares" erkennbar sein, ohne dass man
   ihn zu entziffern versucht. */
.cx-sm-mail.chiffre .cx-sm-mail-text {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 11.5px; letter-spacing: .02em; color: var(--cx-steel);
}
.cx-sm-demo-note {
  margin: 10px 0 0; font-size: 13.5px; line-height: 1.6; color: var(--cx-text-muted);
}
.cx-sm-demo-note.warn {
  padding: 11px 14px; border-radius: var(--cx-radius-sm);
  border-left: 3px solid var(--cx-qc-rot); background: rgba(224,106,106,.08);
}
html[data-theme="light"] .cx-sm-demo-note.warn { background: rgba(196,59,59,.06); }
.cx-sm-demo-fazit {
  margin: 18px 0 0; padding-top: 14px; border-top: 1px solid var(--cx-border);
  font-size: 15.5px; font-weight: 500; color: var(--cx-text);
}

/* -- Die zwei Schlüsselhälften ------------------------------------------- */
.cx-sm-haelfte { padding: 20px 22px; }
.cx-sm-haelfte.privat      { border-color: rgba(224,106,106,.42); }
.cx-sm-haelfte.oeffentlich { border-color: rgba(63,169,255,.42); }
.cx-sm-haelfte > b { font-size: 17px; }
.cx-sm-regel {
  display: block; margin: 4px 0 12px; font-size: 13px; font-weight: 600;
  letter-spacing: .02em;
}
.cx-sm-haelfte.privat      .cx-sm-regel { color: var(--cx-qc-rot); }
.cx-sm-haelfte.oeffentlich .cx-sm-regel { color: var(--cx-band0); }
.cx-sm-haelfte .cx-qc-betrifft { margin-bottom: 0; }

/* -- Prüfstufen-Tabelle: die Aussagekraft als Marke ---------------------- */
.cx-sm-wert {
  display: inline-block; padding: 3px 11px; border-radius: 99px;
  font-size: 12.5px; font-weight: 600; white-space: nowrap;
  border: 1px solid var(--cx-border);
}
.cx-sm-wert.wenig  { color: var(--cx-qc-rot); }
.cx-sm-wert.mittel { color: var(--cx-band3); }
.cx-sm-wert.hoch   { color: var(--cx-band4); }

/* -- Vier Zusagen -------------------------------------------------------- */
.cx-sm-zusage { display: flex; flex-direction: column; }
.cx-sm-zusage h3 { margin: 0 0 2px; font-size: 17px; }
.cx-sm-zusage-frage { font-size: 14px; font-style: italic; color: var(--cx-band0); }
.cx-sm-zusage p { margin: 10px 0 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-sm-gegen {
  margin-top: auto; padding-top: 12px; font-size: 12.5px;
  color: var(--cx-text-muted); font-style: italic;
}

/* -- Die drei Auswege aus dem Henne-Ei-Problem --------------------------- */
.cx-sm-ausweg { position: relative; padding-top: 20px; }
.cx-sm-ausweg-nr {
  position: absolute; top: 16px; right: 18px;
  width: 28px; height: 28px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--cx-band0); background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-sm-ausweg h3 { margin: 0 40px 8px 0; font-size: 16.5px; }
.cx-sm-ausweg p { margin: 0 0 8px; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-sm-gut b    { color: var(--cx-band4); }
.cx-sm-grenze b { color: var(--cx-band3); }
.cx-sm-grenze   { margin-bottom: 0 !important; }

/* -- Die neun Schwierigkeiten, nach Gewicht sortiert --------------------- */
.cx-sm-huerden { display: grid; gap: 14px; margin: 18px 0; }
.cx-sm-huerde { padding: 18px 20px; }
.cx-sm-huerde.hoch   { border-left: 3px solid var(--cx-qc-rot); }
.cx-sm-huerde.mittel { border-left: 3px solid var(--cx-band3); }
.cx-sm-huerde.leicht { border-left: 3px solid var(--cx-border); }
.cx-sm-huerde-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 14px; margin-bottom: 8px; flex-wrap: wrap;
}
.cx-sm-huerde-kopf b { font-size: 16px; }
.cx-sm-schwere {
  font-size: 11.5px; font-weight: 600; letter-spacing: .04em;
  padding: 3px 10px; border-radius: 99px; white-space: nowrap;
  border: 1px solid var(--cx-border);
}
.cx-sm-schwere.hoch   { color: var(--cx-qc-rot); }
.cx-sm-schwere.mittel { color: var(--cx-band3); }
.cx-sm-schwere.leicht { color: var(--cx-text-muted); }
.cx-sm-huerde p { margin: 0; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }
.cx-sm-loesung {
  margin-top: 10px !important; padding-top: 10px;
  border-top: 1px solid var(--cx-border);
}
.cx-sm-loesung b { color: var(--cx-band4); }

/* -- Die zwei Bauweisen -------------------------------------------------- */
.cx-sm-bauweise { padding: 22px 24px; }
.cx-sm-bauweise.client  { border-color: rgba(63,169,255,.42); }
.cx-sm-bauweise.gateway { border-color: rgba(95,208,138,.42); }
.cx-sm-bauweise-name { display: block; font-size: 19px; }
.cx-sm-bauweise-unter {
  display: block; margin: 2px 0 10px; font-size: 13.5px; font-weight: 600;
}
.cx-sm-bauweise.client  .cx-sm-bauweise-unter { color: var(--cx-band0); }
.cx-sm-bauweise.gateway .cx-sm-bauweise-unter { color: var(--cx-band4); }
.cx-sm-bauweise > p { margin: 0 0 14px; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted); }
/* Die Kette wird umbrechend gesetzt, nicht gescrollt: Sie hat sechs kurze
   Glieder und soll auf dem Telefon vollständig sichtbar bleiben. */
.cx-sm-kette {
  margin: 0 0 14px; display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
}
.cx-sm-kette i { color: var(--cx-steel); font-style: normal; font-size: 13px; }
.cx-sm-kette-glied {
  padding: 5px 11px; border-radius: 99px; font-size: 12.5px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-text-muted);
}
.cx-sm-kette-glied.zu {
  background: rgba(95,208,138,.12); border-color: rgba(95,208,138,.40);
  color: var(--cx-band4); font-weight: 600;
}
html[data-theme="light"] .cx-sm-kette-glied.zu { background: rgba(46,125,79,.08); }

/* -- Womit man anfängt --------------------------------------------------- */
.cx-sm-reihenfolge { display: grid; gap: 12px; margin: 16px 0; }
.cx-sm-schritt {
  display: flex; gap: 16px; align-items: flex-start;
  padding: 16px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-sm-schritt-nr {
  flex: none; min-width: 76px; padding: 5px 12px; border-radius: 99px;
  text-align: center; font-size: 12.5px; font-weight: 600;
  color: var(--cx-band0); background: var(--cx-graphite);
  border: 1px solid var(--cx-border);
}
.cx-sm-schritt b { font-size: 15.5px; }
.cx-sm-schritt p { margin: 3px 0 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }

/* -- Nummer vor der Rollen-Überschrift ----------------------------------- */
.cx-sm-rolle-nr {
  display: inline-grid; place-items: center; vertical-align: -3px;
  width: 24px; height: 24px; margin-right: 8px; border-radius: 50%;
  font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--cx-band0); background: var(--cx-carbon); border: 1px solid var(--cx-border);
}

/* -- Schmale Fenster ----------------------------------------------------
   Beide Vergleiche werden GESTAPELT, nicht seitlich scrollbar: Ein
   Vergleich, den man wegschieben muss, vergleicht nichts mehr. In der
   Wegzeile rutschen die sieben Stationen deshalb in ein 4er- und dann in
   ein 2er-Raster – die Spalten stehen weiterhin untereinander. */
@media (max-width: 1099px) {
  .cx-sm-weg-zeile { grid-template-columns: minmax(0, 1fr); gap: 10px; }
  .cx-sm-weg-name { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
}
@media (max-width: 860px) {
  .cx-sm-weg-punkte { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; }
  .cx-sm-demo-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 720px) {
  .cx-sm-stufen { grid-template-columns: minmax(0, 1fr); }
  .cx-sm-weg { padding: 18px 14px; }
  .cx-sm-weg-punkte { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .cx-sm-schritt { flex-direction: column; gap: 8px; }
  .cx-sm-demo-knopf { width: 100%; box-sizing: border-box; text-align: center; }
}

/* -- Störungsberater: „Der Kunde kann die Mail nicht lesen" (1.93.0) -----
   Neun Fälle als <details> und nicht als Knopfleiste: Bei neun Einträgen
   wäre eine Leiste eine Wand, und im Termin überfliegt man die Symptome,
   statt sich durchzuklicken. <details> funktioniert außerdem ohne
   JavaScript und wird von Vorlesesoftware richtig angesagt – dieselbe
   Bauweise wie bei der Battle Card und dem Matrix-Anhang. */
.cx-sm-erst { margin: 16px 0 8px; }
.cx-sm-erstfrage { position: relative; padding-top: 20px; }
.cx-sm-erst-nr {
  position: absolute; top: 16px; right: 18px;
  width: 26px; height: 26px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--cx-band0); background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-sm-erstfrage b { display: block; margin-right: 38px; font-size: 15.5px; line-height: 1.4; }
.cx-sm-erstfrage p { margin: 8px 0 0; font-size: 14px; line-height: 1.6; color: var(--cx-text-muted); }

.cx-sm-faelle { display: grid; gap: 10px; margin: 16px 0 8px; }
.cx-sm-fall {
  border-radius: var(--cx-radius-sm); border: 1px solid var(--cx-border);
  background: var(--cx-graphite); overflow: hidden;
}
.cx-sm-fall > summary {
  display: flex; align-items: center; justify-content: space-between;
  gap: 14px; padding: 14px 18px; cursor: pointer; list-style: none;
  font-size: 15.5px; font-weight: 500;
}
.cx-sm-fall > summary::-webkit-details-marker { display: none; }
/* Das Dreieck selbst zeichnen: Der Standardmarker steht je nach Browser
   woanders und lässt sich nicht ausrichten. */
.cx-sm-fall > summary::before {
  content: '▸'; flex: none; color: var(--cx-steel); font-size: 13px;
  transition: transform .15s ease;
}
.cx-sm-fall[open] > summary::before { transform: rotate(90deg); }
.cx-sm-fall > summary:hover { background: var(--cx-carbon); }
.cx-sm-fall-symptom { flex: 1 1 auto; }
.cx-sm-haeufig {
  flex: none; padding: 3px 10px; border-radius: 99px; white-space: nowrap;
  font-size: 11.5px; font-weight: 600; letter-spacing: .03em;
  border: 1px solid var(--cx-border);
}
.cx-sm-haeufig.sehr   { color: var(--cx-qc-rot); }
.cx-sm-haeufig.oft    { color: var(--cx-band3); }
.cx-sm-haeufig.selten { color: var(--cx-text-muted); }
.cx-sm-fall-inhalt {
  padding: 4px 18px 18px; display: grid; gap: 12px;
  border-top: 1px solid var(--cx-border);
}
.cx-sm-fall-zeile > span, .cx-sm-sagen > span {
  display: block; font-size: 11.5px; letter-spacing: .06em;
  text-transform: uppercase; font-weight: 600; color: var(--cx-text-muted);
}
.cx-sm-fall-zeile p { margin: 4px 0 0; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }
.cx-sm-fall-zeile.abhilfe p { color: var(--cx-text); }
/* Der Satz zum Vorlesen ist der Grund, warum es dieses Kapitel gibt –
   er steht deshalb abgesetzt und nicht als dritter Spiegelstrich. */
.cx-sm-sagen {
  padding: 14px 16px; border-radius: var(--cx-radius-sm);
  border-left: 3px solid var(--cx-band4);
  background: rgba(95,208,138,.08);
}
.cx-sm-sagen > span { color: var(--cx-band4); }
.cx-sm-sagen p {
  margin: 6px 0 0; font-size: 15.5px; line-height: 1.6;
  color: var(--cx-text); font-style: italic;
}
html[data-theme="light"] .cx-sm-sagen { background: rgba(46,125,79,.06); }
.cx-sm-vorbeugen { margin-top: 14px; }

@media (max-width: 720px) {
  .cx-sm-fall > summary { flex-wrap: wrap; font-size: 15px; }
  .cx-sm-fall-symptom { flex: 1 1 100%; order: 2; }
  .cx-sm-haeufig { order: 1; }
  .cx-sm-erstfrage b { margin-right: 0; }
  .cx-sm-erst-nr { position: static; margin-bottom: 8px; }
}

/* ---- Firewall erklärt (1.93.0) -----------------------------------------
   Das Regelwerk zum Durchspielen lebt von DREI Zuständen je Zeile, nicht
   von zweien: getroffen, vorher geprüft und nicht gepasst, und – der
   entscheidende – gar nicht mehr angesehen. Genau dieser dritte Zustand
   ist die Aussage des Kapitels: Eine Regel unterhalb der getroffenen wird
   nie erreicht, egal was darin steht. Als zwei Zustände (an/aus) wäre das
   Bild nicht zu unterscheiden von „passt nicht". */

/* -- Vier Rollen im Einstiegsbild ---------------------------------------- */
.cx-fw-quer {
  margin: 14px 0 0; padding: 11px 15px; border-radius: var(--cx-radius-sm);
  border-left: 3px solid var(--cx-band0); background: rgba(63,169,255,.07);
  font-size: 14px; line-height: 1.6; color: var(--cx-text-muted);
}
html[data-theme="light"] .cx-fw-quer { background: rgba(13,80,216,.06); }
.cx-fw-rollen {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: 13px; margin: 20px 0 18px;
}
.cx-fw-rolle {
  padding: 15px 17px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-fw-rolle-wer {
  display: block; font-size: 11.5px; letter-spacing: .06em; text-transform: uppercase;
  font-weight: 600; color: var(--cx-band0);
}
.cx-fw-rolle b { display: block; margin: 4px 0 5px; font-size: 15.5px; }
.cx-fw-rolle p { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--cx-text-muted); }
.cx-fw-irrtuemer .cx-qc-irrtum { margin: 12px 0; }

/* -- Die fünf Spalten einer Regel ---------------------------------------- */
.cx-fw-spalten {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
  gap: 13px; margin: 18px 0;
}
.cx-fw-spalte { padding: 16px 18px; display: flex; flex-direction: column; gap: 5px; }
.cx-fw-spalte > b { font-size: 15.5px; }
.cx-fw-spalte-frage { font-size: 13.5px; color: var(--cx-band0); }
.cx-fw-spalte code {
  display: block; margin: 4px 0; padding: 7px 10px; border-radius: 7px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 12.5px; overflow-wrap: anywhere; color: var(--cx-text);
}
.cx-fw-spalte p { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--cx-text-muted); }
.cx-fw-aktion { padding: 20px 22px; }
.cx-fw-aktion-kopf { display: flex; align-items: baseline; gap: 9px; margin-bottom: 8px; }
.cx-fw-aktion-kopf b { font-size: 17px; }
.cx-fw-aktion-kopf span { font-size: 13px; color: var(--cx-text-muted); font-style: italic; }
.cx-fw-aktion p { margin: 0 0 8px; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-fw-aktion-wann { margin-bottom: 0 !important; }
.cx-fw-aktion-wann b { color: var(--cx-band0); }

/* -- Das Regelwerk zum Durchspielen -------------------------------------- */
.cx-fw-demo { margin: 20px 0; }
.cx-fw-versuche { display: grid; gap: 8px; margin-bottom: 16px; }
.cx-fw-versuch {
  text-align: left; padding: 11px 16px; border-radius: var(--cx-radius-sm);
  cursor: pointer; font: inherit; font-size: 14.5px;
  color: var(--cx-text-muted); background: var(--cx-carbon);
  border: 1px solid var(--cx-border);
}
.cx-fw-versuch:hover { color: var(--cx-text); border-color: var(--cx-steel); }
.cx-fw-versuch.aktiv {
  color: var(--cx-text); border-color: var(--cx-band0); font-weight: 600;
  background: rgba(63,169,255,.10);
}
html[data-theme="light"] .cx-fw-versuch.aktiv { background: rgba(13,80,216,.07); }
.cx-fw-paket {
  margin-bottom: 14px; padding: 13px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
}
.cx-fw-paket-kopf {
  display: block; margin-bottom: 7px; font-size: 11.5px; letter-spacing: .06em;
  text-transform: uppercase; font-weight: 600; color: var(--cx-text-muted);
}
.cx-fw-paket-felder { display: flex; flex-wrap: wrap; gap: 10px; }
.cx-fw-paket-felder span {
  padding: 6px 12px; border-radius: 99px; font-size: 13.5px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-fw-paket-felder em { font-style: normal; color: var(--cx-text-muted); margin-right: 5px; }

/* KEIN transition auf color: Gemessen bleibt eine animierte Farbe, die aus
   einer CSS-Variablen kommt, beim Umschalten des Themes am Startwert hängen –
   die Tabelle behielt im hellen Modus die Farben des dunklen und fiel damit
   auf 2,25:1. Die Notiz daneben, die keinen Übergang hat, schaltet korrekt.
   Für einen Wechsel zwischen fünf diskreten Versuchen bringt die Animation
   ohnehin nichts; Hintergrund und Durchstreichung tragen den Zustand. */
.cx-fw-nr { font-variant-numeric: tabular-nums; font-weight: 600; width: 34px; }
.cx-fw-regelwerk tr.treffer td {
  background: rgba(63,169,255,.13); font-weight: 500;
}
.cx-fw-regelwerk tr.treffer .cx-fw-nr { color: var(--cx-band0); }
html[data-theme="light"] .cx-fw-regelwerk tr.treffer td { background: rgba(13,80,216,.08); }
.cx-fw-regelwerk tr.treffer.warnung td { background: rgba(224,106,106,.13); }
.cx-fw-regelwerk tr.treffer.warnung .cx-fw-nr { color: var(--cx-qc-rot); }
html[data-theme="light"] .cx-fw-regelwerk tr.treffer.warnung td { background: rgba(196,59,59,.08); }
/* Geprüft und nicht gepasst: normal. Gar nicht mehr angesehen: durchgestrichen
   und in Steel. KEIN opacity – gemessen fiel der Text damit auf 3,99:1 im
   hellen Modus, und ausgerechnet diese Zeilen muss man lesen können: Bei der
   Falle ist die übersprungene Regel 3 die entscheidende. Die Linie trägt den
   Zustand ohnehin allein; die Farbe unterstützt nur. Steel misst 10,52:1
   dunkel und 8,92:1 hell und bleibt dem normalen Text trotzdem nachgeordnet. */
.cx-fw-regelwerk tr.ungesehen td {
  color: var(--cx-steel); text-decoration: line-through;
}
.cx-fw-regelwerk tr.ungesehen .cx-fw-aktion-marke { text-decoration: none; }
.cx-fw-aktion-marke {
  display: inline-block; padding: 3px 10px; border-radius: 99px;
  font-size: 12.5px; font-weight: 600; white-space: nowrap;
  border: 1px solid var(--cx-border);
}
.cx-fw-aktion-marke.ja   { color: var(--cx-band4); }
.cx-fw-aktion-marke.nein { color: var(--cx-qc-rot); }

.cx-fw-notizen { margin: 14px 0; display: grid; gap: 7px; }
.cx-fw-notiz {
  margin: 0; padding: 9px 13px; border-radius: var(--cx-radius-sm);
  font-size: 13.5px; line-height: 1.55; color: var(--cx-steel);
  border-left: 3px solid transparent;
}
.cx-fw-notiz.aktiv {
  border-left-color: var(--cx-band0);
  background: var(--cx-carbon); color: var(--cx-text);
}
.cx-fw-notiz b { color: var(--cx-text); }

.cx-fw-ergebnis {
  margin-top: 16px; padding: 16px 20px; border-radius: var(--cx-radius-sm);
  border-left: 3px solid var(--cx-border); background: var(--cx-carbon);
}
.cx-fw-ergebnis.ja      { border-left-color: var(--cx-band4); }
.cx-fw-ergebnis.nein    { border-left-color: var(--cx-steel); }
.cx-fw-ergebnis.warnung { border-left-color: var(--cx-qc-rot); background: rgba(224,106,106,.08); }
html[data-theme="light"] .cx-fw-ergebnis.warnung { background: rgba(196,59,59,.06); }
.cx-fw-ergebnis-kopf {
  display: flex; align-items: baseline; gap: 12px; margin-bottom: 8px; flex-wrap: wrap;
}
.cx-fw-ergebnis-kopf b { font-size: 15.5px; }
.cx-fw-ergebnis-marke {
  padding: 3px 11px; border-radius: 99px; font-size: 12px; font-weight: 600;
  letter-spacing: .04em; white-space: nowrap; border: 1px solid var(--cx-border);
}
.cx-fw-ergebnis.ja      .cx-fw-ergebnis-marke { color: var(--cx-band4); }
.cx-fw-ergebnis.nein    .cx-fw-ergebnis-marke { color: var(--cx-text-muted); }
.cx-fw-ergebnis.warnung .cx-fw-ergebnis-marke { color: var(--cx-qc-rot); }
.cx-fw-ergebnis p { margin: 0; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }

/* -- Die drei Generationen ----------------------------------------------- */
.cx-fw-beispiel {
  margin: 6px 0 18px; padding: 12px 16px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  font-size: 15px; font-style: italic; color: var(--cx-text);
}
.cx-fw-stufen {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px; margin: 18px 0;
}
.cx-fw-stufe { padding: 20px 22px; display: flex; flex-direction: column; }
.cx-fw-stufe.alt    { border-color: var(--cx-border); }
.cx-fw-stufe.mittel { border-color: rgba(229,168,59,.42); }
.cx-fw-stufe.neu    { border-color: rgba(95,208,138,.45); }
.cx-fw-stufe-kopf { margin-bottom: 12px; }
.cx-fw-stufe-kopf b { display: block; font-size: 16.5px; line-height: 1.3; }
.cx-fw-stufe-kopf span { font-size: 12.5px; color: var(--cx-text-muted); }
.cx-fw-sieht-kopf {
  display: block; margin-bottom: 6px; font-size: 11.5px; letter-spacing: .06em;
  text-transform: uppercase; font-weight: 600; color: var(--cx-text-muted);
}
.cx-fw-sieht { margin: 0 0 12px; padding: 0; list-style: none; display: grid; gap: 5px; }
.cx-fw-sieht li {
  padding: 6px 11px; border-radius: 7px; font-size: 13px; line-height: 1.4;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  color: var(--cx-text-muted); overflow-wrap: anywhere;
}
.cx-fw-urteil { margin: 0 0 10px; font-size: 14.5px; font-weight: 500; }
.cx-fw-stufe.alt    .cx-fw-urteil { color: var(--cx-text-muted); }
.cx-fw-stufe.mittel .cx-fw-urteil { color: var(--cx-band3); }
.cx-fw-stufe.neu    .cx-fw-urteil { color: var(--cx-band4); }
.cx-fw-grenze {
  margin: auto 0 0; padding-top: 11px; border-top: 1px solid var(--cx-border);
  font-size: 13.5px; line-height: 1.55; color: var(--cx-text-muted);
}
.cx-fw-grenze b { color: var(--cx-text); }

/* -- Die fünf Zusatzfunktionen ------------------------------------------- */
.cx-fw-funktionen { display: grid; gap: 13px; margin: 18px 0; }
.cx-fw-funktion { padding: 18px 20px; }
.cx-fw-funktion-kopf { display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
.cx-fw-funktion-kopf b { font-size: 16.5px; }
.cx-fw-funktion-kopf span { font-size: 12.5px; color: var(--cx-band0); font-style: italic; }
.cx-fw-funktion p { margin: 0; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }
.cx-fw-preis {
  margin-top: 10px !important; padding-top: 10px;
  border-top: 1px solid var(--cx-border);
}
.cx-fw-preis b { color: var(--cx-band3); }

/* -- Zonen: die Reihenfolge ist die Aussage ------------------------------ */
.cx-fw-zonen { display: grid; gap: 9px; margin: 18px 0; }
.cx-fw-zone {
  padding: 14px 18px; border-radius: var(--cx-radius-sm);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-left: 4px solid var(--cx-border);
}
.cx-fw-zone.z0 { border-left-color: var(--cx-qc-rot); }
.cx-fw-zone.z1 { border-left-color: var(--cx-band3); }
.cx-fw-zone.z2 { border-left-color: var(--cx-band0); }
.cx-fw-zone.z3 { border-left-color: var(--cx-band4); }
.cx-fw-zone.z4 { border-left-color: var(--cx-band2); }
.cx-fw-zone.z5 { border-left-color: var(--cx-steel); }
.cx-fw-zone-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.cx-fw-zone-kopf b { font-size: 15.5px; }
.cx-fw-vertrauen { font-size: 12.5px; color: var(--cx-text-muted); white-space: nowrap; }
.cx-fw-zone p { margin: 5px 0 0; font-size: 14px; line-height: 1.58; color: var(--cx-text-muted); }

/* -- Nord-Süd gegen Ost-West --------------------------------------------- */
.cx-fw-richtung { padding: 20px 22px; }
.cx-fw-richtung.ns { border-color: rgba(63,169,255,.42); }
.cx-fw-richtung.ow { border-color: rgba(224,106,106,.42); }
.cx-fw-richtung > b { font-size: 18px; }
.cx-fw-richtung.ns > b { color: var(--cx-band0); }
.cx-fw-richtung.ow > b { color: var(--cx-qc-rot); }
.cx-fw-richtung p { margin: 8px 0 0; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-fw-wer { color: var(--cx-text) !important; font-weight: 500; }
.cx-fw-anteil {
  display: inline-block; margin-top: 12px; padding: 4px 12px; border-radius: 99px;
  font-size: 12.5px; color: var(--cx-text-muted);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
}

/* -- Warum das wichtig ist ----------------------------------------------- */
.cx-fw-gruende { display: grid; gap: 13px; margin: 18px 0; }
.cx-fw-grund { padding: 18px 20px; }
.cx-fw-gewicht {
  display: inline-block; margin-bottom: 7px; padding: 3px 11px; border-radius: 99px;
  font-size: 11.5px; font-weight: 600; letter-spacing: .04em;
  color: var(--cx-band0); background: var(--cx-carbon); border: 1px solid var(--cx-border);
}
.cx-fw-grund b { display: block; font-size: 16.5px; }
.cx-fw-grund p { margin: 7px 0 0; font-size: 14.5px; line-height: 1.62; color: var(--cx-text-muted); }
.cx-fw-ohne li > div > p { margin: 0; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted); }
.cx-fw-durchsicht { margin-top: 18px; }
.cx-fw-kauf .cx-card.warnung { border-color: rgba(229,168,59,.45); }

@media (max-width: 960px) {
  .cx-fw-stufen { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 720px) {
  .cx-fw-demo { padding: 18px 15px; }
  .cx-fw-versuch { font-size: 14px; }
  .cx-fw-zone-kopf { flex-direction: column; gap: 3px; }
}

/* ═══════════════════════════ Regulierungsseiten: CRA und CADA (1.120.0) ═══
   Zwei Erklärseiten nach dem Muster von NIS2 und DORA, aber mit drei
   Bausteinen, die es dort nicht gibt: der Rollenfrage (wer ist Hersteller?),
   dem Zeitstrahl mit Status je Frist und den vier Souveränitätsstufen.
   Alles Übrige nutzt die vorhandenen .cx-nis-*-Klassen weiter – zwei Seiten
   mit demselben Aufbau sollen nicht verschieden aussehen. */
.cx-reg-stand {
  font-size: 13.5px; color: var(--cx-steel); margin: 10px 0 0;
  max-width: var(--cx-lesebreite);
}
.cx-reg-entwurf { color: var(--cx-accent); font-weight: 600; }
.cx-reg-unter { font-size: 19px; margin: 26px 0 12px; }

/* Die Abgrenzung CRA gegen NIS2 und DORA – drei Karten nebeneinander. */
.cx-reg-abgrenzung, .cx-reg-rollen, .cx-reg-fristen, .cx-reg-stufen, .cx-reg-zeit {
  display: grid; gap: 12px; margin-top: 14px;
}
.cx-reg-abgrenzung { grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
.cx-reg-rollen     { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.cx-reg-fristen    { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
.cx-reg-zeit       { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.cx-reg-stufen     { grid-template-columns: 1fr; }

.cx-reg-abg b, .cx-reg-rolle b { font-size: 16px; display: block; margin-bottom: 6px; }
.cx-reg-abg p, .cx-reg-rolle p { margin: 4px 0 0; font-size: 14px; color: var(--cx-text-muted); }
.cx-reg-frage { color: var(--cx-blue-light); font-weight: 600; }
.cx-reg-adressat, .cx-reg-wer { font-style: italic; }

/* Die Meldefristen. Die Zeitangabe ist die Botschaft, nicht die Überschrift –
   „24 Stunden“ liest sich anders als „Frühwarnung“. */
.cx-reg-frist b { display: block; font-size: 22px; color: var(--cx-blue-light); line-height: 1.2; }
/* 2,52:1 auf heller Karte – die Frist ist die Hauptaussage der Kachel und
   stand am blassesten da. --cx-blue-deep bringt 6,65:1 (1.178.2). */
html[data-theme="light"] .cx-reg-frist b { color: var(--cx-blue-deep); }
.cx-reg-frist span { display: block; font-size: 13px; color: var(--cx-steel);
                     text-transform: uppercase; letter-spacing: .06em; margin: 2px 0 8px; }
.cx-reg-frist p { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); }

/* Der Zeitstrahl. Der Status steckt in der Klasse, nicht in einem Symbol:
   erledigt tritt zurück, laeuft wird hervorgehoben, offen bleibt neutral. */
.cx-reg-zeitpunkt b { display: block; font-size: 15px; }
.cx-reg-zeitpunkt span { display: block; font-weight: 600; margin: 4px 0 6px; }
.cx-reg-zeitpunkt p { margin: 0; font-size: 13.5px; color: var(--cx-text-muted); }
/* ERLEDIGT WIRD ÜBER DIE FARBE GEKENNZEICHNET, NICHT ÜBER DIE DECKKRAFT
   (1.178.2). Die 0,62 auf der ganzen Karte drückten das Datum auf 3,03:1
   dunkel und 2,45:1 hell – und mit ihm jede Zeile darin. --cx-steel trägt
   auf der Kartenfläche 10,52:1 beziehungsweise 5,05:1 und nimmt die Karte
   sichtbar zurück, ohne sie unlesbar zu machen. */
.cx-reg-zeitpunkt.erledigt b,
.cx-reg-zeitpunkt.erledigt span,
.cx-reg-zeitpunkt.erledigt p { color: var(--cx-steel); }
.cx-reg-zeitpunkt.laeuft { border-color: rgba(229,72,77,.5); background: rgba(229,72,77,.07); }
.cx-reg-zeitpunkt.laeuft b { color: #FF8D90; }
.cx-reg-zeitpunkt.offen b { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-reg-zeitpunkt.laeuft b { color: #B42328; }
/* DIE DRITTE STELLE DERSELBEN FAMILIE im Regelwerksabschnitt: Auch die
   Frage-Zeile und das Datum eines noch offenen Zeitpunkts standen mit
   --cx-blue-light bei 2,52:1 auf heller Karte. Für „läuft" gab es die
   Hell-Regel schon (Zeile darüber) – die anderen beiden fehlten. */
html[data-theme="light"] .cx-reg-frage,
html[data-theme="light"] .cx-reg-zeitpunkt.offen b { color: var(--cx-blue-deep); }

/* Die vier Souveränitätsstufen: Nummer links, Inhalt rechts – dieselbe Form
   wie die nummerierten Pflichten, damit beide Seiten zusammengehören. */
.cx-reg-stufe { display: flex; gap: 16px; align-items: flex-start; }
.cx-reg-stufenr {
  flex: none; width: 42px; height: 42px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--cx-font-display); font-size: 19px; font-weight: 700;
  background: rgba(30,123,232,.14); color: var(--cx-blue-light);
  border: 1px solid rgba(30,123,232,.4);
}
/* DIE BEIDEN NUMMERNKREISE IM HELLEN MODUS (1.178.2). Auf dem blassblauen
   Grund (rgba(30,123,232,.14) über #F4F5F8) trägt --cx-blue-light nur
   1,95:1 – die Ziffer war praktisch unsichtbar. --cx-blue-deep bringt dort
   5,16:1. Beide Kreise stehen in verschiedenen Abschnitten (Regelwerks-
   stufen und NIS2-Punkte), tragen aber dieselbe Gestaltung. */
html[data-theme="light"] .cx-reg-stufenr,
html[data-theme="light"] .cx-nis-nr { color: var(--cx-blue-deep); }
.cx-reg-stufe b { font-size: 16px; display: block; margin-bottom: 4px; }
.cx-reg-stufe p { margin: 4px 0 0; font-size: 14px; color: var(--cx-text-muted); }

/* Der akute Kasten – die Meldepflicht beim CRA, der Verfahrensstand beim
   CADA. Beide sagen dasselbe: Hier hängt etwas an einem Datum. */
.cx-reg-akut { border-left: 3px solid var(--cx-blue); }
.cx-reg-merk { margin-top: 16px; border-left: 3px solid var(--cx-accent); }
.cx-reg-warnung { border-color: rgba(229,168,59,.45); }
.cx-reg-merk h3, .cx-reg-akut h3 { font-size: 16px; margin: 14px 0 6px; }

/* Fließtext in den Karten beider Seiten auf Lesebreite. Ohne diese Regel läuft
   ein Absatz in einer breiten Karte über die ganze Kartenbreite – gemessen am
   11.09.2026 bis 147 Zeichen je Zeile, also weit über dem, was 1.118.0 für die
   übrige Seite festgelegt hat. Gezielt über die Abschnitts-IDs, damit keine
   fremde Seite mitgezogen wird; Tabellenzellen bleiben ausgenommen, sie
   bringen ihre eigene Spaltenbreite mit. */
/* GENERISCH statt je Seite: Fließtext in einer Karte hält Lesebreite, egal
   auf welcher Seite die Karte steht. Die Regel ist ungefährlich, weil sie nur
   dort wirkt, wo die Karte BREITER ist als die Lesebreite – in einer schmalen
   Karte oder Rasterzelle begrenzt die Karte ohnehin schon.

   Anlass war der 11.09.2026: Die Stichprobe von 1.118.0 umfasste zwölf Routen
   und hat dabei ausgerechnet die inhaltsreichsten Erklärseiten nicht erwischt.
   Auf der Firewall-Seite standen 20 Absätze mit bis zu 168 Zeichen je Zeile,
   auf der S/MIME-Seite 16 – doppelt so viel wie lesbar. Einzelne Klassen
   nachzupflegen hätte den nächsten Beitrag wieder durchrutschen lassen. */
/* ENTFERNT am 11.09.2026 (1.127.1). Die Regel stand genau einen Tag. Sie war
   für die Know-How-Seiten gedacht, und für die Know-How-Seiten wurde sie mit
   .cx-lesestrecke noch am selben Tag wieder aufgehoben – gewirkt hat sie
   danach nur noch dort, wofür sie nie gemeint war: auf den Steckbriefen.
   Gemessen auf der Microsoft-Seite standen 23 Absätze und Listenpunkte auf
   642 px in einem 1.109 px breiten Abschnitt; rechts blieben im Mittel 449 px
   leer. Stefans Befund dazu: „auf den Herstellerseiten ist die Anordnung
   wieder falsch“.
   Wo Lesebreite gewollt ist, steht sie jetzt AN DER EINZELNEN KLASSE – das
   ist mehr Schreibarbeit, aber man sieht der Klasse an, was sie tut. */

/* ═══════════════════ Lesestrecken nutzen die ganze Breite ═════════════════
   Die Erklärseiten unter Know-How sind Lesestrecken, keine Katalogseiten.
   Dort steht Text ohne Logos, Tabellen oder Auswahlflächen daneben, und die
   Begrenzung auf Lesebreite ließ zwei Drittel der Fläche leer – der Text
   klebte links an der Kante.

   Die Breite zurückzugeben heißt aber nicht, Zeilen von 175 Zeichen zu
   erlauben. Deshalb der Satz in ZWEI SPALTEN, wie in jeder Zeitung: Der
   Kasten nimmt die volle Breite, jede Spalte behält ihre 80 Zeichen.
   Überschrift und Kernsatz laufen über beide Spalten, damit der Kasten als
   Einheit lesbar bleibt.

   Unter 1.000 px fällt alles auf eine Spalte zurück – zwei Spalten auf einem
   schmalen Bildschirm wären Zeilen von vierzig Zeichen, und der Leser müsste
   innerhalb des Kastens hoch und runter springen. */
/* Die ersten vier Selektoren dieser Liste sind mit 1.127.1 weggefallen: Sie
   hoben eine Sammelregel auf, die es nicht mehr gibt. Übrig bleiben die
   Klassen, die ihre Lesebreite selbst mitbringen. cx-wissen-bruecke kam
   hinzu – sie war 1.123.0 übersehen worden und stand auf der Know-How-
   Startseite als einzige noch auf 731 px in einem 1.109 px breiten Feld.
   Zwei weitere sind seither weggefallen, weil ihre Klassen die Deckelung
   überall verloren haben und hier nichts mehr aufzuheben war: cx-hero-sub
   mit 1.130.1, cx-footnote mit 1.130.2. */
.cx-lesestrecke .cx-mitre-vorspann, .cx-lesestrecke .cx-reg-stand,
.cx-lesestrecke .cx-wissen-bruecke > p {
  max-width: none;
}
.cx-lesestrecke .cx-nis-bild, .cx-lesestrecke .cx-nis-abk,
.cx-lesestrecke .cx-reg-akut, .cx-lesestrecke .cx-reg-merk,
.cx-lesestrecke .cx-nis-fall, .cx-lesestrecke .cx-nis-zitat,
.cx-lesestrecke [id] > .cx-card {
  max-width: none;
}

/* KEIN SPALTENSATZ. Zwischen 1.122.0 und 1.123.0 lief langer Fließtext hier
   zweispaltig, um die Breite zu nutzen, ohne die Zeile zu verlängern. Das war
   ein Fehlgriff: Wo `columns` am Absatz selbst sitzt, teilt er seinen EIGENEN
   Text – und dann endet die linke Spalte mitten im Satz („… ohne dass“) und
   die rechte beginnt mit dem Rest. Am Bildschirm liest das niemand; im
   Gegensatz zur Zeitung kann man den Blick nicht zwischen zwei Spalten
   führen, die verschieden hoch enden.

   Fließtext bleibt deshalb einspaltig und nimmt die ganze Breite. Die Zeile
   wird dadurch lang – das ist Stefans ausdrückliche Entscheidung, zweimal
   bestätigt, nachdem er beide Varianten gesehen hat. Wer daran wieder dreht,
   sollte vorher fragen. */
/* Ausgenommen: Tabellen bringen ihre Spaltenbreite mit, Chips-Zeilen sind
   keine Fließtexte, und zentrierte Kästen würden links kleben. */
.cx-card td p, .cx-card th p, .cx-card .cx-bereich-tags,
.cx-card .cx-tag, .cx-card figcaption { max-width: none; }

/* ═══════════════ Erklärseiten: den Platz nutzen statt ihn zu lassen ═══════
   1.118.0 hat den Fließtext auf Lesebreite gebracht – richtig für die Zeile,
   aber die KARTEN blieben volle Breite. Ergebnis: 1.200 px Karte mit 540 px
   Text darin, der Rest leer. Gemessen am 11.09.2026 lag die Flächennutzung
   bei 44 bis 54 Prozent, und der Text klebte links an der Kante.

   Die Antwort ist nicht, den Text wieder breiter zu machen – 80 Zeichen je
   Zeile bleiben die Obergrenze. Sondern: schmale Inhalte NEBENEINANDER
   setzen, statt sie untereinander in breite Kästen zu legen. Aus vierzehn
   Punkten übereinander werden sieben Zeilen zu zweit, und die Seite wird
   dabei nicht nur voller, sondern auch kürzer. */

/* Nummerierte Punkte – NIS2, DORA, CRA und CADA teilen sich diese Klasse.
   minmax(400px, …) ist mit Absicht großzügig: Darunter wird die Zeile zu
   schmal für einen Absatz mit Nummer daneben, dann ist einspaltig besser. */
.cx-nis-punkte {
  display: grid; gap: 12px; margin-top: 16px;
  grid-template-columns: 1fr;
  /* stretch, nicht start: Nebeneinanderliegende Kacheln sollen gleich hoch
     sein. Mit „start“ endete jede auf ihrer eigenen Höhe – bei den vier
     CADA-Bausteinen klaffte die Zeile um 23 px auseinander, bei den
     Reverse-Proxy-Karten um 244. Für Raster aus Beschriftung UND Inhalt
     (Nummer links, Text rechts) bleibt „start“ dagegen richtig; dort soll
     die Beschriftung oben stehen und nicht mitwachsen. */
  align-items: stretch;
}
/* Genau ZWEI Spalten, nicht auto-fit: Bei 1.400 px Inhaltsbreite entstanden
   sonst drei, und dann bleiben von der Spalte nach Nummer und Abständen rund
   390 px – zu wenig für einen Absatz mit Beispielzeile darunter. Zwei Spalten
   sind außerdem ruhiger zu lesen als drei. */
@media (min-width: 900px) {
  .cx-nis-punkte { grid-template-columns: 1fr 1fr; gap: 14px; }
}
.cx-nis-punkt { display: flex; gap: 14px; align-items: flex-start; }
.cx-nis-punkt > div:last-child { min-width: 0; }
.cx-nis-punkt b { display: block; margin-bottom: 4px; }
.cx-nis-punkt p { margin: 4px 0 0; font-size: 14px; color: var(--cx-text-muted); }
.cx-nis-nr {
  flex: none; width: 34px; height: 34px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--cx-font-display); font-size: 16px; font-weight: 700;
  background: rgba(30,123,232,.14); color: var(--cx-blue-light);
  border: 1px solid rgba(30,123,232,.4);
}
.cx-nis-beispiel { font-style: italic; color: var(--cx-steel) !important; }

/* Die Chips am Fuß der Kachel, nicht direkt unter dem Text. Erst dadurch
   wirken gleich hohe Kacheln auch ausgerichtet: Sonst steht die Schlagwort-
   zeile in jeder Kachel auf einer anderen Höhe, und das Auge sieht die
   Unordnung, obwohl die Rahmen bündig sind. */
.cx-nis-punkt > div:last-child { display: flex; flex-direction: column; height: 100%; }
.cx-nis-punkt > div:last-child > .cx-bereich-tags { margin-top: auto; padding-top: 10px; }

/* Die vier Souveränitätsstufen: zu zweit statt untereinander. Sie bauen
   aufeinander auf, deshalb bleibt die Lesereihenfolge links-rechts-links. */
.cx-reg-stufen { grid-template-columns: 1fr; }
@media (min-width: 900px) { .cx-reg-stufen { grid-template-columns: 1fr 1fr; } }

/* Einzelne Fließtext-Karten bekommen eine Breite, die zu ihrem Inhalt passt.
   Eine Karte, die doppelt so breit ist wie ihr Text, sieht aus wie ein
   Versehen – und ist eines. Der Zuschlag deckt Innenabstand und Rahmen. */
.cx-nis-bild, .cx-nis-abk, .cx-reg-akut, .cx-reg-merk, .cx-nis-zitat,
[id^="cra-"] > .cx-card, [id^="cada-"] > .cx-card {
  max-width: 820px;
}
/* Ausgenommen: Karten, die ein Raster oder eine Tabelle tragen – die brauchen
   ihre Breite, und ihr Inhalt füllt sie auch. Für die Tabellen gilt die
   vorhandene .cx-tabelle-scroll; eine eigene Hülle dafür wäre eine zweite
   Lösung für dasselbe Problem gewesen. */
.cx-nis-fall, .cx-tabelle-scroll, [id^="cra-"] > .cx-tabelle-scroll,
[id^="cada-"] > .cx-tabelle-scroll { max-width: none; }
.cx-nis-fall { max-width: 980px; }
/* Eine Tabelle darf schmaler nicht umbrechen, sondern muss in ihrer Hülle
   scrollen – sonst schiebt sie bei 390 px die ganze Seite zur Seite
   (gemessen: 638 px Tabelle in einem 390-px-Fenster). */
[id^="cra-"] .cx-table, [id^="cada-"] .cx-table { min-width: 560px; }

/* Trennlinie im Kontomenü – seit 1.174.0, wo die persönlichen Skill-Seiten
   über „Mein Konto" stehen und sich von den Verwaltungseinträgen absetzen.

   `flex: 0 0 100%` ist hier nicht Geschmack, sondern Bedingung: Die Leiste ist
   ein umbrechendes Flex-Feld (.cx-konto-knoepfe), und ein leeres Element darin
   schrumpft auf NULL Breite – am Prüfstand gemessen 0 × 1 px. Die Linie war da
   und trotzdem unsichtbar. Mit voller Breite nimmt sie eine eigene Zeile und
   drückt die folgenden Knöpfe darunter, was genau der Zweck ist. */
.cx-konto-trenn {
  flex: 0 0 100%; height: 1px; background: var(--cx-border); margin: 4px 0;
}

/* --- Thema aus dem Produktkatalog wählen (1.175.0) --- */
/* BREITE, NICHT MAX-WIDTH. `.cx-dialog` setzt `width: min(430px, …)` – ein
   max-width darüber bleibt wirkungslos, und der Dialog stand bei 430 px:
   Die Trefferzeilen brachen dann dreizeilig um. Gemessen am 26.09.2026. */
.cx-sk-wahl { width: min(660px, calc(100vw - 32px)); max-width: none; }
.cx-sk-wsuche {
  display: flex; align-items: center; gap: 10px; background: var(--cx-carbon);
  border: 1px solid var(--cx-blue); border-radius: 999px; padding: 10px 16px;
}
/* Und dasselbe eine Ebene tiefer: `.cx-dialog input` bringt width:100%,
   margin-bottom und 11 px Innenabstand mit. In einer Flex-Zeile ergab das ein
   109 px hohes Suchfeld mit der Lupe darüber statt daneben. Beide Regeln
   wiegen gleich schwer (0,1,1) – diese hier gewinnt, weil sie später steht. */
.cx-sk-wsuche input {
  flex: 1; width: auto; margin: 0; padding: 0; border: 0; background: none;
  color: var(--cx-text); font: inherit; font-size: 15px; outline: none;
}
.cx-sk-wreiter { display: flex; gap: 6px; flex-wrap: wrap; margin: 12px 0 8px; }
/* Die Trefferliste rollt, das Fenster nicht: Bei 2.297 Produkten wäre ein
   Dialog, der mit der Liste wächst, nach drei Zeichen höher als der Bildschirm. */
.cx-sk-wliste {
  max-height: 340px; overflow-y: auto; margin: 0 -6px; padding: 0 6px;
  display: grid; gap: 2px;
}
.cx-sk-wtreffer {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  background: none; border: 1px solid transparent; border-radius: var(--cx-radius-sm);
  padding: 9px 11px; font: inherit; color: var(--cx-text); cursor: pointer;
}
.cx-sk-wtreffer:hover:not(:disabled) {
  background: color-mix(in srgb, var(--cx-blue) 8%, transparent); border-color: var(--cx-border);
}
.cx-sk-wtreffer:disabled { opacity: .5; cursor: default; }
.cx-sk-wlogo {
  flex: none; width: 64px; height: 30px; padding: 3px 6px; border-radius: 6px;
}
.cx-sk-wtext { flex: 1; min-width: 0; display: grid; }
.cx-sk-wname { font-size: 14.5px; font-weight: 600; }
.cx-sk-wunter { font-size: 12.5px; color: var(--cx-steel); }
/* EINE ZEILE JE ANGABE, auch wenn der Text länger ist. Eine Auswahlliste wird
   gescannt, nicht gelesen: Umbrechende Produktklassen machten aus 12 Treffern
   eine Liste mit Zeilen zwischen 63 und 106 px, und das Auge verliert dabei
   die Spur. Was nicht passt, steht am Zeiger. Gilt nur INNERHALB eines
   Treffers – der Erklärtext unter der Überschrift trägt dieselbe Klasse und
   soll dort weiterhin umbrechen. */
.cx-sk-wtext .cx-sk-wname,
.cx-sk-wtext .cx-sk-wunter {
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cx-sk-wmarke {
  flex: none; font-size: 11px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; padding: 3px 9px; border-radius: 999px;
  border: 1px solid var(--cx-border); color: var(--cx-steel); white-space: nowrap;
}
/* „im Portfolio" ist die Auskunft, die die Reihenfolge erklärt – diese Treffer
   stehen oben, weil dort der Bedarf liegt. */
.cx-sk-wmarke.drin { color: var(--band-4-flaeche); border-color: var(--band-4-rand); }
.cx-sk-wleer { padding: 24px 12px; text-align: center; color: var(--cx-steel); font-size: 14.5px; }
.cx-sk-wleer b { display: block; margin-bottom: 6px; font-size: 15px; color: var(--cx-text); }
.cx-sk-wmehr { margin: 8px 0 0; text-align: center; font-size: 12.5px; color: var(--cx-steel); }
.cx-sk-wgewaehlt {
  display: flex; align-items: center; gap: 12px; margin: 0 0 14px; padding: 12px 14px;
  background: var(--cx-carbon); border: 1px solid var(--cx-blue);
  border-radius: var(--cx-radius-sm);
}
.cx-sk-weigen {
  margin: 12px 0 0; padding: 15px 17px; background: var(--cx-carbon);
  border: 1px dashed var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-sk-weigen h3 { margin: 0 0 6px; font-size: 14px; }
.cx-sk-weigen > p { margin: 0 0 10px; font-size: 13px; color: var(--cx-steel); }
.cx-sk-wzwei { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (max-width: 620px) { .cx-sk-wzwei { grid-template-columns: 1fr; } }

/* --- Skillmatrix-Freigabe je Firma (1.175.0) --- */
.cx-sk-freigabe {
  display: grid; gap: 12px; margin: 0 0 20px; padding: 17px 19px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-left: 3px solid var(--cx-accent);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
.cx-sk-freigabe h3 { margin: 0; font-size: 15.5px; }
.cx-sk-freigabe p { margin: 0; font-size: 14px; line-height: 1.55; color: var(--cx-text-muted); }
.cx-sk-freigabe .cx-pflege-hilfe { margin: 0; }
.cx-sk-freigabe-zeile { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.cx-sk-freigabe-zeile .cx-pflege-offen { font-size: 13.5px; }
/* Freigegeben und gefüllt – der Normalfall. */
.cx-sk-frei { color: var(--cx-accent); font-weight: 600; }
/* Freigegeben und LEER. Kein Fehler, aber der stille Fall, in dem jemand eine
   leere Seite öffnet und anruft: bernstein wie jede andere Auskunft, die eine
   Handlung nahelegt, ohne dass etwas kaputt wäre. */
.cx-sk-leerfrei { color: var(--cx-warn); font-weight: 600; }

/* ===== Skillmatrix (ab 1.174.0) ==========================================
   Aufbau und Farben aus `Mockup Skillmatrix.html`. Die Klassen dort stehen
   ohne Präfix (.zeile, .person, .stufe) – das ginge in der echten App nicht
   gut, weil die Namen längst vergeben sind. Hier heißen sie durchweg
   cx-sk-*, der Rest ist übernommen.

   DIE STUFENSKALA IST EINE FARBFAMILIE, KEINE AMPEL. Von Tiefblau (wenig)
   bis Akzent-Cyan (sehr gut). Pastellrot und -grün, wie sie das Quellsystem
   verwendet, verschwinden auf --cx-graphite – und „wenig Kenntnis" ist kein
   Fehler, sondern eine Auskunft. Dieselbe Überlegung, aus der die Warnfarbe
   in comparXIS bernstein ist und nicht rot.

   Sechs Bänder, an der Notenskala ausgerichtet: b1 mangelhaft (1–3),
   b2 ausreichend (4–6), b3 befriedigend (7–9), b4 gut (10–12), b5 sehr gut
   (13–15); b0 ist „keine Kenntnis", bp „geplant". */
:root {
  --band-0-flaeche: transparent;  --band-0-text: #8B929B;  --band-0-rand: #1C2027;
  --band-1-flaeche: #16324F;      --band-1-text: #9EC5F0;  --band-1-rand: #1E4670;
  --band-2-flaeche: #1C4E8C;      --band-2-text: #D3E5FB;  --band-2-rand: #2A64AB;
  --band-3-flaeche: #1C6BE4;      --band-3-text: #FFFFFF;  --band-3-rand: #1C6BE4;
  --band-4-flaeche: #1FA5C9;      --band-4-text: #04222B;  --band-4-rand: #1FA5C9;
  --band-5-flaeche: #35E0DA;      --band-5-text: #06282B;  --band-5-rand: #35E0DA;
  --band-plan-text: #3FA9FF;      --band-plan-rand: #2A64AB;
}
html[data-theme="light"] {
  --band-0-flaeche: transparent;  --band-0-text: #64707D;  --band-0-rand: #DFE3E9;
  --band-1-flaeche: #E7F0FC;      --band-1-text: #1B4C86;  --band-1-rand: #C4DAF5;
  --band-2-flaeche: #C6DDF8;      --band-2-text: #123E75;  --band-2-rand: #9CC2EE;
  --band-3-flaeche: #1C6BE4;      --band-3-text: #FFFFFF;  --band-3-rand: #1C6BE4;
  /* NICHT #0E8FAE wie im Mockup: Weiß darauf bringt nur 3,78 : 1, und die
     Prüfliste verlangt 4,5 für Text auf der Plakette. #0B7891 ist derselbe
     Türkiston, nur dunkler – 5,11 : 1, und von b3 (Blau) wie b5 (Cyan)
     weiterhin klar zu unterscheiden. Am Prüfstand nachgemessen. */
  --band-4-flaeche: #0B7891;      --band-4-text: #FFFFFF;  --band-4-rand: #0B7891;
  --band-5-flaeche: #35E0DA;      --band-5-text: #06282B;  --band-5-rand: #17B9B3;
  --band-plan-text: #0D50D8;      --band-plan-rand: #9CC2EE;
}

/* display:flex sticht das eingebaute [hidden] aus – ohne diese Zeile bliebe
   die Reiterleiste auf den persönlichen Seiten stehen. Steckte schon als
   Hinweis im Mockup. */
.cx-verw-tabs[hidden] { display: none; }

.cx-sk-leiste {
  display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin: 22px 0 14px;
}
.cx-sk-suche {
  flex: 1 1 260px; display: flex; align-items: center; gap: 10px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: 999px; padding: 9px 16px;
}
.cx-sk-suche input {
  flex: 1; background: none; border: 0; color: var(--cx-text);
  font: inherit; font-size: 14.5px; outline: none;
}
.cx-sk-suche input::placeholder { color: var(--cx-steel); }
.cx-sk-karte {
  background: var(--cx-graphite); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius);
}
.cx-sk-leer { padding: 22px 20px; color: var(--cx-steel); font-size: 14.5px; }

.cx-sk-gruppe { display: flex; align-items: baseline; gap: 10px; padding: 19px 20px 8px; }
.cx-sk-gruppe h3 { font-size: 16px; margin: 0; }
.cx-sk-gruppe .cx-sk-zahl {
  font-size: 12.5px; color: var(--cx-steel); font-variant-numeric: tabular-nums;
}

/* --- Fremdsicht: je Thema eine Zeile, Personen als Plaketten --- */
.cx-sk-thema {
  display: grid; grid-template-columns: minmax(200px, 1fr) minmax(320px, 2.1fr) 132px;
  gap: 10px 18px; align-items: center; padding: 12px 20px;
  border-top: 1px solid var(--cx-border);
}
.cx-sk-thema:hover { background: color-mix(in srgb, var(--cx-blue) 6%, transparent); }
.cx-sk-name { font-size: 14.5px; font-weight: 600; }
.cx-sk-art { display: block; font-size: 12px; color: var(--cx-steel); font-weight: 400; }
.cx-sk-koennen { display: flex; gap: 8px; flex-wrap: wrap; }
.cx-sk-stand {
  text-align: right; font-size: 12.5px; color: var(--cx-steel);
  font-variant-numeric: tabular-nums;
}
.cx-sk-person {
  display: inline-flex; align-items: center; gap: 8px; padding: 4px 6px 4px 12px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border); border-radius: 999px;
  font: inherit; font-size: 13.5px; color: var(--cx-text); cursor: pointer;
}
.cx-sk-person:hover { border-color: var(--cx-blue); }
.cx-sk-stufe {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 30px; height: 24px; padding: 0 7px; border-radius: 999px;
  font-size: 12.5px; font-weight: 700; font-variant-numeric: tabular-nums;
  background: var(--b-flaeche); color: var(--b-text); border: 1px solid var(--b-rand);
}
/* Die eigene Zeile ist keine Einladung, sich selbst anzuschreiben. */
.cx-sk-person.ich { border-color: var(--cx-accent); cursor: default; }
.cx-sk-person.ich .cx-sk-wer::after {
  content: 'Sie'; margin-left: 8px; font-size: 10.5px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--cx-accent);
}
.cx-sk-b0 { --b-flaeche: var(--band-0-flaeche); --b-text: var(--band-0-text); --b-rand: var(--band-0-rand); }
.cx-sk-b1 { --b-flaeche: var(--band-1-flaeche); --b-text: var(--band-1-text); --b-rand: var(--band-1-rand); }
.cx-sk-b2 { --b-flaeche: var(--band-2-flaeche); --b-text: var(--band-2-text); --b-rand: var(--band-2-rand); }
.cx-sk-b3 { --b-flaeche: var(--band-3-flaeche); --b-text: var(--band-3-text); --b-rand: var(--band-3-rand); }
.cx-sk-b4 { --b-flaeche: var(--band-4-flaeche); --b-text: var(--band-4-text); --b-rand: var(--band-4-rand); }
.cx-sk-b5 { --b-flaeche: var(--band-5-flaeche); --b-text: var(--band-5-text); --b-rand: var(--band-5-rand); }
.cx-sk-bp .cx-sk-stufe {
  background: none; color: var(--band-plan-text); border: 1px dashed var(--band-plan-rand);
}
.cx-sk-legende {
  display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin: 16px 0 0;
  font-size: 12.5px; color: var(--cx-steel);
}
.cx-sk-legende .cx-sk-stufe { min-width: 36px; }

/* --- Selbstpflege: eine Zeile je Thema mit Stufenleiter --- */
.cx-sk-zeile {
  display: grid; grid-template-columns: minmax(180px, 1fr) auto minmax(250px, 340px);
  gap: 8px 18px; align-items: center; padding: 9px 20px;
  border-top: 1px solid var(--cx-border);
  /* ZWEI BESCHREIBUNGSZEILEN RESERVIERT. Ohne diese Höhe springt die Liste
     beim Überfahren der Stufen zwischen ein- und zweizeilig – im
     Quellsystem am 18.09.2026 genau deswegen nachgebessert. */
  min-height: 62px;
}
.cx-sk-zeile:hover { background: color-mix(in srgb, var(--cx-blue) 6%, transparent); }
.cx-sk-leiter { display: flex; gap: 3px; align-items: center; }
.cx-sk-band { display: flex; gap: 2px; padding: 0 4px; border-right: 1px solid var(--cx-border); }
.cx-sk-band:last-of-type { border-right: 0; }
.cx-sk-knopf {
  width: 27px; height: 27px; border-radius: 8px; border: 1px solid var(--cx-border);
  background: var(--cx-carbon); color: var(--cx-text-muted);
  font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer;
  font-variant-numeric: tabular-nums;
}
.cx-sk-knopf:hover { border-color: var(--cx-blue-light); color: var(--cx-text); }
.cx-sk-knopf.gewaehlt {
  background: var(--b-flaeche); color: var(--b-text); border-color: var(--b-rand);
}
.cx-sk-einschaetzung { display: flex; align-items: center; gap: 10px; min-width: 0; }
.cx-sk-eintext { display: grid; min-width: 0; }
.cx-sk-einstufe { font-size: 12.5px; font-weight: 700; }
/* DREI ZEILEN RESERVIERT, NICHT ZWEI. Das Mockup sah 2.6em vor – das hält
   die Liste ruhig, solange die Beschreibung zweizeilig bleibt. Gemessen an
   der echten Skala reicht es nicht: Der längste Text („Das Thema interessiert
   mich — wenn ein Projekt kommt, möchte ich einsteigen", 75 Zeichen) braucht
   in der 146 px schmalen Textspalte drei Zeilen, und die Zeile sprang beim
   Durchklicken der Stufen zwischen 81 und 86 px. Mit 3.9em bleibt sie auf
   86 px stehen – über alle 17 Stufen nachgemessen. */
.cx-sk-einbeschr {
  min-height: 3.9em; font-size: 12px; line-height: 1.3; color: var(--cx-steel);
}
.cx-sk-vorschau .cx-sk-einstufe,
.cx-sk-vorschau .cx-sk-einbeschr { color: var(--cx-blue-light); }
.cx-sk-fussnote { font-size: 12.5px; color: var(--cx-steel); margin: 14px 0 0; }

/* --- Zertifikate --- */
.cx-sk-zert {
  display: flex; gap: 12px; align-items: center; padding: 13px 20px;
  border-top: 1px solid var(--cx-border); flex-wrap: wrap;
}
.cx-sk-zert .cx-sk-name { flex: 1 1 260px; }
.cx-sk-marke {
  font-size: 11.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  padding: 3px 10px; border-radius: 999px; border: 1px solid var(--cx-border);
  color: var(--cx-steel); white-space: nowrap;
}
.cx-sk-marke.gueltig { color: var(--band-5-flaeche); border-color: var(--band-5-rand); }
.cx-sk-marke.offen { color: var(--cx-warn); border-color: var(--cx-warn); }

/* --- Kontaktanfrage --- */
.cx-sk-dialog { max-width: 560px; }
.cx-sk-vorschau-liste {
  margin: 14px 0 0; padding: 14px 16px; background: var(--cx-carbon);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm); font-size: 13.5px;
}
.cx-sk-vorschau-liste dt {
  font-size: 11.5px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--cx-steel); font-weight: 700;
}
.cx-sk-vorschau-liste dd { margin: 2px 0 10px; color: var(--cx-text); }
.cx-sk-vorschau-liste dd:last-of-type { margin-bottom: 0; }

@media (max-width: 900px) {
  .cx-sk-thema { grid-template-columns: 1fr; }
  .cx-sk-stand { text-align: left; }
  .cx-sk-zeile {
    grid-template-columns: minmax(0, 1fr) minmax(220px, 320px);
    grid-template-areas: 'name ein' 'leiter leiter'; padding-block: 12px;
  }
  .cx-sk-zeile .cx-sk-name { grid-area: name; }
  .cx-sk-leiter { grid-area: leiter; flex-wrap: wrap; }
  .cx-sk-einschaetzung { grid-area: ein; }
}

/* ===== Verwaltung → Skillmatrix (1.176.0) ================================
   Eine Karte je Gesellschaft mit zwei Schaltern. Warum Karten und keine
   Tabellenzeilen: Zwei Schalter, zwei Spuren und zwei Zahlen je Gesellschaft
   sprengen jede Zelle, und der erklärende Satz, der bei einer Freigabe über
   Personendaten dazugehört, hätte dort keinen Platz.

   Die Schalter selbst sind .cx-schalter aus 1.144.0 – dieselbe Bedienung wie
   beim Teilen des Produktportfolios, weil es dieselbe Art Entscheidung ist. */

/* Nur die Trennlinie. GRÖSSE UND ABSTAND KOMMEN AUS DEM HAUS: `.cx-section.cx-card h2`
   wiegt (0,2,1) und `.cx-section h2` (0,1,1) – eine Klassenregel (0,1,0) kommt
   dagegen nicht an. Gemessen am 26.09.2026: 19px und 14px unten, nicht die hier
   zuerst geschriebenen 17px/16px. Die beiden Angaben stehen deshalb nicht mehr
   da, statt unwirksam herumzuliegen und den nächsten Leser in die Irre zu
   führen. Wer sie doch braucht, muss die Spezifität mitliefern. */
.cx-skv-firmentitel {
  padding-bottom: 10px; border-bottom: 1px solid var(--cx-border);
}

.cx-skv-karte {
  margin: 0 0 16px; padding: 16px 18px;
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-radius: var(--cx-radius-sm);
}
.cx-skv-karte:last-child { margin-bottom: 0; }
/* Eine inaktive Gesellschaft bleibt bedienbar – sie wird nur zurückgenommen,
   damit sie die aktiven nicht überstrahlt. */
.cx-skv-still { opacity: .72; }

.cx-skv-kopf {
  display: flex; gap: 14px; align-items: baseline; justify-content: space-between;
  flex-wrap: wrap; margin-bottom: 14px;
}
.cx-skv-kopf h3 { margin: 0; font-size: 16px; }
.cx-skv-stand { margin: 0; font-size: 13.5px; }

/* Die beiden Schalterzeilen. Getrennt durch eine Linie statt durch Abstand:
   Es sind zwei verschiedene Entscheidungen, und die zweite gilt nur, wenn die
   erste gesetzt ist. */
.cx-skv-zeile {
  display: flex; gap: 16px; align-items: flex-start; flex-wrap: wrap;
  padding: 13px 0 0; border-top: 1px solid var(--cx-border);
}
.cx-skv-zeile + .cx-skv-zeile { margin-top: 13px; }
.cx-skv-txt { flex: 1 1 340px; }
.cx-skv-txt b { font-size: 14.5px; color: var(--cx-text); }
.cx-skv-txt p { margin: 4px 0 0; font-size: 13.5px; line-height: 1.55; color: var(--cx-steel); }
.cx-skv-txt strong { color: var(--cx-text-muted); }
/* Die Spur steht im selben Absatz, aber abgesetzt: Sie ist eine Fußnote zum
   Satz darüber, kein eigener Gedanke. */
/* Farbe statt Deckkraft, dritter Fall derselben Familie (1.177.2): Die .85
   auf der geerbten Textfarbe ergaben im hellen Modus 3,49:1. Sichtbar wird
   die Zeile erst, wenn ein Schalter umgelegt wurde – deshalb fiel sie in den
   früheren Läufen nicht auf, bei denen nichts freigeschaltet war. */
.cx-skv-spur { display: block; margin-top: 5px; font-size: 12.5px; color: var(--cx-steel); }

/* Fehlende Ergänzung und fehlendes Firmendach: beides Hinweise, die eine
   Handlung nahelegen, ohne dass etwas kaputt ist – deshalb bernstein und nicht
   rot, wie überall im Projekt. */
.cx-skv-fehlt, .cx-skv-dach, .cx-skv-ohne {
  margin: 0 0 18px; padding: 12px 15px; font-size: 13.5px; line-height: 1.6;
  color: var(--cx-text-muted);
  background: var(--cx-carbon); border: 1px solid var(--cx-border);
  border-left: 3px solid var(--cx-warn);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
.cx-skv-ohne { margin: 4px 0 0; }
.cx-skv-fehlt code, .cx-skv-dach code { font-size: 12.5px; }
/* Firmen ohne Gesellschaften – kein Schalter, nur eine Auskunft. */
.cx-skv-txt-frei {
  margin: 0 0 12px; font-size: 13.5px; line-height: 1.6; color: var(--cx-steel);
}
.cx-skv-firmenliste {
  margin: 0; padding: 0; list-style: none; display: grid; gap: 7px;
}
.cx-skv-firmenliste li { font-size: 13.5px; color: var(--cx-text-muted); }
.cx-skv-firmenliste b { color: var(--cx-text); }

/* ===== Das Rechtebild (1.177.0) =========================================
   Drei Ansichten auf dieselbe Frage: die Zeile im Konto-Blatt (wer sieht was
   und warum), die Matrix (wer sieht was in der ganzen Firma) und die Kette
   (wo hängt es). Dazu das Protokoll.

   DIE FARBEN SIND NICHT DEKORATION, SIE SIND DIE AUSKUNFT:
     blau       am Konto selbst gesetzt
     silbergrau geerbt – von der Gesellschaft oder der Plattform
     bernstein  der Haken steht und wirkt trotzdem nicht
   Deshalb trägt jeder Zustand ZUSÄTZLICH ein eigenes Zeichen (✓ – !) und ein
   Wort: Wer Farben nicht unterscheiden kann, liest dieselbe Auskunft. */

/* ---------- Die Rechtezeile im Konto-Blatt ---------- */
/* EIGENER CONTAINER, nicht .cx-hakenraster: Jenes ist ein mehrspaltiges Grid
   für die alten Haken-Kacheln. Die Zeilen hier sind selbst ein Grid und
   brauchen die volle Breite – ineinander lag am 26.09.2026 der Text übereinander. */
.cx-rzliste { display: block; }
.cx-rzliste .cx-rz { border-top: 1px solid var(--cx-border); }
.cx-rzliste .cx-rz:first-child { border-top: 0; }
/* Die Zeile mit dem wirkungslosen Haken tritt NICHT zurück, sie fällt auf:
   Sie ist der Fall, um den es geht. */
.cx-rz-gestoppt { background: rgba(229,168,59,.05); border-radius: 8px; }

.cx-rz-kopf {
  display: grid; align-items: center; gap: 14px;
  grid-template-columns: 24px minmax(0,1fr) 195px 118px;
  padding: 11px 10px; cursor: pointer; margin: 0;
}
.cx-rz-kopf input[type="checkbox"] { margin: 0; }
.cx-rz-name b { display: block; font-size: 14.5px; font-weight: 600; color: var(--cx-text); }
.cx-rz-name span { display: block; font-size: 12.5px; color: var(--cx-steel); }

.cx-rz-herkunft { font-size: 12.5px; line-height: 1.4; }
.cx-rz-herkunft b { display: block; font-weight: 600; }
.cx-rz-herkunft span { display: block; color: var(--cx-steel); }
.cx-rz-eigen b { color: var(--cx-blue-light); }
.cx-rz-erbt  b { color: var(--cx-steel); }

.cx-rz-w { font-size: 12.5px; font-weight: 600; display: inline-flex; align-items: center; gap: 7px; }
.cx-rz-w::before { content: ''; width: 8px; height: 8px; border-radius: 50%; flex: none; }
.cx-rz-ja           { color: var(--cx-accent); }
.cx-rz-ja::before   { background: var(--cx-accent); }
.cx-rz-nein         { color: var(--cx-steel); }
.cx-rz-nein::before { background: var(--cx-steel); }
.cx-rz-block        { color: var(--cx-warn); }
.cx-rz-block::before{ background: var(--cx-warn); }

.cx-rz-grund {
  margin: -2px 10px 10px 48px; padding: 9px 12px;
  font-size: 12.5px; line-height: 1.55; color: var(--cx-warn);
  background: rgba(229,168,59,.09);
  border-left: 2px solid var(--cx-warn); border-radius: 0 6px 6px 0;
}
.cx-rz-grund a { color: var(--cx-warn); }
.cx-rz-kette {
  font-family: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer;
  margin-left: 6px; padding: 2px 9px; border-radius: 99px;
  background: transparent; color: var(--cx-warn);
  border: 1px solid rgba(229,168,59,.45);
}
.cx-rz-fuss { margin: 12px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--cx-steel); }
.cx-rz-fuss-alt { color: var(--cx-warn); }

/* Im Erbmodus sind die Haken gesperrt – die AUSKUNFT daneben bleibt lesbar,
   denn sie gilt weiter. Deshalb wirkt cx-haken-aus nur auf das Bedienelement. */
.cx-haken-aus .cx-rz-kopf { cursor: default; }
.cx-haken-aus .cx-rz-kopf input[type="checkbox"] { pointer-events: none; opacity: .5; }

/* ---------- Die Freigabekette (Dialog) ---------- */
/* .cx-dialog setzt width: min(430px, …) – ein max-width darüber ist
   wirkungslos (Lehre vom 26.09.2026). Deshalb die Breite direkt. */
.cx-kette-dialog { width: min(680px, calc(100vw - 32px)); max-width: none; }
.cx-kette-laedt { margin: 0; color: var(--cx-steel); }
.cx-kette-wer { margin: -6px 0 16px; font-size: 13px; color: var(--cx-steel); }

.cx-kette { display: grid; }
.cx-kglied {
  display: grid; grid-template-columns: 30px minmax(0,1fr) auto; gap: 13px;
  align-items: start; padding: 13px 0; position: relative;
}
.cx-kglied + .cx-kglied { border-top: 1px solid var(--cx-border); }
.cx-kglied:not(:last-child)::before {
  content: ''; position: absolute; left: 14px; top: 38px; bottom: -6px;
  width: 2px; background: var(--cx-border);
}
.cx-kglied.offen:not(:last-child)::before { background: rgba(53,224,218,.4); }

.cx-kmarke {
  width: 30px; height: 30px; border-radius: 50%; display: flex;
  align-items: center; justify-content: center; font-size: 14px; font-weight: 700;
  flex: none; position: relative; z-index: 1;
}
.k-offen { background: rgba(53,224,218,.14); color: var(--cx-accent);
           box-shadow: inset 0 0 0 1.5px rgba(53,224,218,.5); }
.k-zu    { background: rgba(229,168,59,.14); color: var(--cx-warn);
           box-shadow: inset 0 0 0 1.5px rgba(229,168,59,.55); }

.cx-ktext h3 { margin: 0 0 3px; font-size: 14.5px; }
.cx-ktext p  { margin: 0; font-size: 13px; line-height: 1.5; color: var(--cx-steel); }
.cx-kspur { display: block; margin-top: 5px; font-size: 12px; }
/* „Keine Spur" ist eine ehrliche Auskunft und keine Nebensache: Sie sagt, dass
   die Antwort hier NICHT steht, statt eine Lücke wie ein Ergebnis aussehen zu
   lassen. Deshalb sichtbar und nicht abgeblendet. */
.cx-kspur-leer { font-style: italic; }
.cx-kwo { font-size: 11.5px; color: var(--cx-steel); text-align: right;
          white-space: nowrap; padding-top: 2px; }
.cx-kwo b { display: block; color: var(--cx-text-muted); font-size: 12px; }

.cx-kergebnis {
  margin-top: 16px; padding: 14px 16px; border-radius: var(--cx-radius-sm);
  background: rgba(229,168,59,.09); border: 1px solid rgba(229,168,59,.3);
}
.cx-kergebnis.gut { background: rgba(53,224,218,.07); border-color: rgba(53,224,218,.3); }
.cx-kergebnis h3 { margin: 0 0 4px; font-size: 14.5px; color: var(--cx-warn); }
.cx-kergebnis.gut h3 { color: var(--cx-accent); }
.cx-kergebnis p { margin: 0; font-size: 13px; color: var(--cx-text-muted); }
.cx-kette-knoepfe { display: flex; gap: 10px; flex-wrap: wrap; margin: 16px 0 0; }

/* ---------- Die Matrix ---------- */
.cx-rm-unter {
  display: flex; gap: 6px; margin: 0 0 20px; flex-wrap: wrap;
}
.cx-rm-unter a {
  font-size: 13.5px; padding: 6px 14px; border-radius: 99px; text-decoration: none;
  color: var(--cx-steel); border: 1px solid var(--cx-border);
}
.cx-rm-unter a.active {
  background: rgba(30,123,232,.15); color: var(--cx-blue-light);
  border-color: rgba(63,169,255,.45);
}
.cx-rm-firmen { display: flex; gap: 7px; flex-wrap: wrap; margin: 0 0 16px; }
.cx-rm-firmen button {
  font-family: var(--cx-font-body); font-size: 13px; padding: 5px 12px;
  border-radius: 99px; cursor: pointer; border: 1px solid var(--cx-border);
  background: transparent; color: var(--cx-steel);
}
.cx-rm-firmen button.aktiv {
  background: rgba(30,123,232,.15); color: var(--cx-blue-light);
  border-color: rgba(63,169,255,.45);
}
.cx-rm-kopf {
  display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
  flex-wrap: wrap; margin-bottom: 16px;
}
.cx-rm-kopf > span { font-size: 13px; color: var(--cx-steel); }

.cx-rm-huelle { overflow-x: auto; }
.cx-rm-tab { border-collapse: collapse; width: 100%; font-size: 13px; }
.cx-rm-tab th, .cx-rm-tab td { padding: 0; }
.cx-rm-tab thead th {
  text-align: center; vertical-align: bottom; padding: 0 0 10px;
  border-bottom: 1px solid var(--cx-border); font-weight: 600;
}
.cx-rm-tab th.cx-rm-konto, .cx-rm-tab td.cx-rm-konto {
  text-align: left; min-width: 215px; padding-right: 14px;
}
.cx-rm-drehung {
  writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;
  font-family: var(--cx-font-body); font-size: 11.5px; color: var(--cx-steel);
  background: none; border: 0; padding: 6px 2px; cursor: pointer;
}
.cx-rm-drehung:hover { color: var(--cx-text); }
.cx-rm-tab tbody td { border-bottom: 1px solid var(--cx-border); padding: 6px 0; text-align: center; }
.cx-rm-name { text-decoration: none; display: block; }
.cx-rm-name b { display: block; font-size: 13.5px; font-weight: 600; color: var(--cx-text); }
.cx-rm-name span { display: block; font-size: 11.5px; color: var(--cx-steel); }

.cx-rm-z {
  width: 25px; height: 25px; border-radius: 7px; display: inline-flex;
  align-items: center; justify-content: center; font-size: 12.5px; font-weight: 700;
  font-style: normal;
}
.cx-rm-eigen { background: rgba(30,123,232,.20); color: var(--cx-blue-light);
               box-shadow: inset 0 0 0 1px rgba(63,169,255,.45); }
.cx-rm-erbt  { background: rgba(139,146,155,.13); color: var(--cx-silver); }
/* Ein „nein“ ist ein Zustand, keine Leerstelle – eigene Form, eigene Fläche. */
.cx-rm-nein  { background: rgba(139,146,155,.07); color: #969DA6; }
.cx-rm-block { background: rgba(229,168,59,.15); color: var(--cx-warn);
               box-shadow: inset 0 0 0 1px rgba(229,168,59,.4); }

.cx-rm-legende {
  display: flex; gap: 18px; flex-wrap: wrap; margin-top: 16px; padding-top: 14px;
  border-top: 1px solid var(--cx-border); font-size: 12.5px; color: var(--cx-steel);
}
.cx-rm-legende div { display: flex; align-items: center; gap: 8px; }
.cx-rm-hinweis { margin: 14px 0 0; font-size: 13px; color: var(--cx-steel); }
.cx-rm-auskunft {
  margin-top: 14px; padding: 13px 15px; font-size: 13.5px; line-height: 1.55;
  background: rgba(30,123,232,.07); border-left: 2px solid var(--cx-blue);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0; color: var(--cx-text-muted);
}
.cx-rm-auskunft > b { color: var(--cx-text); }
.cx-rm-auskunft p { margin: 4px 0 0; }
.cx-rm-warn { color: var(--cx-warn); }
.cx-rm-liste { margin: 7px 0 0; padding-left: 18px; font-size: 13px; color: var(--cx-warn); }

/* ---------- Das Protokoll ---------- */
.cx-prot-filter { margin-top: 0; }
.cx-prot { list-style: none; margin: 0; padding: 0; }
.cx-prot li {
  display: grid; grid-template-columns: 82px minmax(0,1fr) auto; gap: 14px;
  align-items: start; padding: 12px 0; border-top: 1px solid var(--cx-border);
}
.cx-prot li:first-child { border-top: 0; }
.cx-prot-zeit { font-size: 12.5px; font-weight: 600; color: var(--cx-text-muted);
                font-variant-numeric: tabular-nums; }
.cx-prot-zeit span { display: block; font-weight: 400; color: var(--cx-steel); }
.cx-prot-text b { font-size: 13.5px; }
.cx-prot-feld {
  display: inline-block; margin-left: 8px; padding: 1px 8px; border-radius: 99px;
  font-size: 11.5px; color: var(--cx-steel); border: 1px solid var(--cx-border);
}
.cx-prot-text p { margin: 3px 0 0; font-size: 13px; color: var(--cx-steel); }
.cx-prot-text p b { color: var(--cx-text-muted); font-size: 13px; }
.cx-prot-pfeil { color: var(--cx-blue-light); padding: 0 3px; }
.cx-prot-wer { font-size: 12.5px; color: var(--cx-text-muted); text-align: right;
               white-space: nowrap; }
.cx-prot-wer span { display: block; font-size: 11.5px; color: var(--cx-steel); }
.cx-prot-blaettern {
  display: flex; align-items: center; gap: 12px; margin-top: 16px; padding-top: 14px;
  border-top: 1px solid var(--cx-border); font-size: 13px; color: var(--cx-steel);
}

@media (max-width: 760px) {
  .cx-rz-kopf { grid-template-columns: 24px minmax(0,1fr); }
  .cx-rz-herkunft, .cx-rz-w { grid-column: 2; }
  .cx-prot li { grid-template-columns: 1fr; gap: 5px; }
  .cx-prot-wer { text-align: left; }
}

/* ── Heller Modus für das Rechtebild (nachgereicht in 1.177.2) ────────────────
   --cx-blue-light (#3FA9FF) ist im hellen Modus NICHT umdefiniert – die
   Variable erledigt die Umstellung nur bei --cx-warn und --cx-qc-rot von
   selbst. Beim Bau von 1.177.0 wurde nur im dunklen Modus geprüft; gemessen
   am 27.09.2026 standen die aktive Unterleiste, die aktive Firmenpille und
   die „–“-Zellen bei 2,31 bis 2,74:1 auf hellem Grund. Ersatz aus der
   Nachbarschaft statt neu gewählt: --cx-blue-deep (#0D50D8) und --cx-steel.
   Nachgerechnet auf dem jeweiligen Grund: 5,09:1 und 4,72:1. */
html[data-theme="light"] .cx-rz-eigen b,
html[data-theme="light"] .cx-rm-unter a.active,
html[data-theme="light"] .cx-rm-firmen button.aktiv,
html[data-theme="light"] .cx-rm-eigen,
html[data-theme="light"] .cx-prot-pfeil { color: var(--cx-blue-deep); }
html[data-theme="light"] .cx-rm-nein { color: var(--cx-steel); }


/* ══════════════════════ Heller Modus: knappe Kontraste (1.178.2) ══════════
   Gemeinsames Muster: --cx-steel (#64707D) und --cx-accent (#0F766E) sind
   für sich genommen gut gewählt, aber auf einem LEICHT EINGEFÄRBTEN Grund
   fehlen ihnen die letzten Zehntel. Gemessen auf dem jeweiligen Grund:

       --cx-steel      auf 14 % Grau      4,23:1   ->  --cx-text-muted  8,14:1
       --cx-steel      auf weißer Karte   5,05:1       (dort genügt es)
       --cx-accent     auf 15 % Türkis    4,43:1   ->  #0B5D57          6,26:1

   Deshalb wird hier nicht die Variable umdefiniert – das träfe auch die
   Stellen, an denen sie reicht –, sondern nur die Fundstellen auf gefärbtem
   Grund. */
html[data-theme="light"] .cx-fido-status,
html[data-theme="light"] .cx-zert-art,
html[data-theme="light"] .cx-fido-sprosse-bsp,
html[data-theme="light"] .cx-fk-zahl,
html[data-theme="light"] .cx-fk-gruppenkopf em,
html[data-theme="light"] .cx-sp-bandlink { color: var(--cx-text-muted); }

/* Die türkisen Marken: eine Stufe tiefer als --cx-accent, damit der farbige
   Grund bleiben kann. */
html[data-theme="light"] .cx-fido-marke,
html[data-theme="light"] .cx-fido-aal-nr,
html[data-theme="light"] .cx-zert-fall.frei .cx-zert-marke { color: #0B5D57; }

/* „erlauben" stand bei 4,45:1 – dieselbe Rechnung, eigenes Grün. */
html[data-theme="light"] .cx-fw-aktion-marke.ja { color: #1F6B40; }


/* ═════════════ Heller Modus: die letzten --cx-blue-light-Stellen (1.178.2) ══
   --cx-blue-light (#3FA9FF) wird im hellen Modus NICHT umdefiniert. 89 Regeln
   setzen es als Textfarbe; 71 hatten bereits eine Hell-Regel, diese 17 nicht.
   Ihre Gründe wurden einzeln geprüft – alle hell oder schwach blau, dort
   trägt --cx-blue-deep zwischen 5,16:1 (auf 13 % Blau) und 6,65:1 (auf Weiß),
   während --cx-blue-light bei 1,95 bis 2,52:1 lag.

   Die :hover-Stellen sind mitgenommen: Ein Kontrastlauf sieht sie nicht, weil
   niemand dabei die Maus hält – unlesbar werden sie trotzdem.

   Bewusst NICHT in dieser Liste: die Regel unter html[data-theme="dark"] für
   .cx-pfh-etikett.ich. Sie gilt nur im dunklen Modus und ist dort richtig. */
html[data-theme="light"] .cx-compare-col h4 a:hover,
html[data-theme="light"] .cx-bereich-zeichen,
html[data-theme="light"] .cx-bereich-vendor-head h3 a:hover,
html[data-theme="light"] .cx-footer a:hover,
html[data-theme="light"] .cx-pfa-tab th.cx-pfa-ich,
html[data-theme="light"] .cx-pfa-gemeinsam strong,
html[data-theme="light"] .cx-mz-kopf > a:hover,
html[data-theme="light"] .cx-sb-gruppe.leer i,
html[data-theme="light"] .cx-beratung-meldung,
html[data-theme="light"] .cx-beob-kopf:hover,
html[data-theme="light"] .cx-beob-offen .cx-beob-kopf:hover,
html[data-theme="light"] .cx-neu-marke,
html[data-theme="light"] .cx-kk-begriff b,
html[data-theme="light"] .cx-neu-links a,
html[data-theme="light"] .cx-einladen-meldung,
html[data-theme="light"] .cx-sk-knopf:hover,
html[data-theme="light"] .cx-sk-vorschau .cx-sk-einbeschr { color: var(--cx-blue-deep); }


/* ═══════════════════ Skillmatrix: Neuaufbau (1.179.0) ═════════════════════
   Aus Stefans Wahl „Nimm A mit der Landkarte aus B“ (Mockup Skills A –
   Schnelldurchlauf.html, Mockup Skills B – Kompetenzprofil.html). Die Klassen
   dort standen ohne Präfix; hier heißen sie nach ihrem Reiter:

       cx-skx-*   Rahmen, Blatt, Marken – überall
       cx-skm-*   Matrix              cx-skl-*   Landkarte
       cx-sks-*   Suche               cx-skd-*   Meine Skills
       cx-skz-*   Zertifikate         cx-skv2-*  Verwaltung

   ZWEI FALLEN, DIE HIER ÜBERALL MITGEDACHT SIND:
   1. `html[data-theme="light"] main a` wiegt (0,1,3) und schlägt jede
      einfache Klassenregel für Links. Links in eigenen Farben brauchen
      deshalb zwei Klassen oder ein Attribut (a[href]).
   2. Das Seitenblatt, der Kontaktdialog und die Meldung hängen am <body>,
      NICHT in <main> – die Hell-Regel für Links greift dort gar nicht, und
      --cx-blue-light stünde auf Weiß bei 2,5:1. Sie bekommen eigene Farben.
   Und: --cx-steel reicht auf weißer Karte (5,05:1), aber nicht auf blau
   getöntem Grund. Wo ein Grund getönt ist, steht --cx-text-muted. */

/* --- „Geplant“ als Plakette und in der Stufenleiter ---
   Bisher gab es nur `.cx-sk-bp .cx-sk-stufe` (Nachfahre). skPl() setzt beide
   Klassen aber auf DASSELBE Element – dann fehlten die Farbvariablen, und das
   P stand ohne Rand und ohne Farbe da. */
.cx-sk-bp { --b-flaeche: transparent; --b-text: var(--band-plan-text); --b-rand: var(--band-plan-rand); }
.cx-sk-stufe.cx-sk-bp, .cx-sk-knopf.cx-sk-bp.gewaehlt { border-style: dashed; }

/* --- Rahmen --- */
.cx-skx-inhalt { margin-top: 18px; }
.cx-skx-reiter {
  display: flex; flex-wrap: wrap; gap: 3px; width: fit-content; max-width: 100%;
  margin: 18px 0 0; padding: 4px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: 999px;
}
.cx-skx-reiter a[href] {
  padding: 7px 15px; border-radius: 999px; white-space: nowrap;
  font-size: 14px; font-weight: 600; color: var(--cx-text-muted);
}
.cx-skx-reiter a[href]:hover { color: var(--cx-text); background: color-mix(in srgb, var(--cx-blue) 10%, transparent); }
.cx-skx-reiter a[href].an { background: var(--cx-gradient-flaeche); color: #fff; }

.cx-skx-segment {
  display: inline-flex; flex: none; gap: 2px; padding: 3px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: 999px;
}
.cx-skx-segment button {
  border: 0; background: none; border-radius: 999px; padding: 5px 12px; cursor: pointer;
  font: 600 13px/1.4 var(--cx-font-body); color: var(--cx-text-muted);
}
.cx-skx-segment button:hover { color: var(--cx-text); }
.cx-skx-segment button[aria-pressed="true"] {
  background: color-mix(in srgb, var(--cx-blue) 22%, var(--cx-graphite)); color: var(--cx-text);
}

.cx-skx-inhalt kbd {
  display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 5px;
  font: 700 11px/1 var(--cx-font-body); color: var(--cx-steel);
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-bottom-width: 2px;
  border-radius: 5px;
}

/* --- Personen, Gesellschaften, Logos --- */
.cx-skx-ava {
  flex: none; display: inline-grid; place-items: center; width: 34px; height: 34px;
  border-radius: 50%; font: 700 12.5px/1 var(--cx-font-body); letter-spacing: .02em;
  background: var(--cx-gradient-flaeche); color: #fff;
}
/* Künstlername: gestrichelt, damit man die Schwester auf einen Blick erkennt. */
.cx-skx-ava.pseudo { background: none; border: 1.5px dashed var(--cx-steel); color: var(--cx-text-muted); }
.cx-skx-ava.ich { box-shadow: 0 0 0 2px var(--cx-graphite), 0 0 0 4px var(--cx-accent); }
.cx-skx-ava.klein { width: 26px; height: 26px; font-size: 10.5px; }
.cx-skx-ava.gross { width: 56px; height: 56px; font-size: 18px; }
.cx-skx-ava.eckig { border-radius: 8px; }

.cx-skx-gtag {
  display: inline-flex; align-items: center; padding: 1px 7px; border-radius: 6px;
  border: 1px solid var(--cx-border); color: var(--cx-steel); vertical-align: 1px;
  font: 700 10.5px/1.5 var(--cx-font-body); letter-spacing: .08em; text-transform: uppercase; white-space: nowrap;
}
.cx-skx-gtag.eigen { border-color: color-mix(in srgb, var(--cx-blue) 60%, var(--cx-border)); color: var(--cx-text-muted); }
.cx-skx-kname {
  padding: 1px 6px; border: 1px dashed var(--cx-border); border-radius: 6px; vertical-align: 2px;
  font: 600 11px/1.5 var(--cx-font-body); font-style: normal; color: var(--cx-steel); white-space: nowrap;
}

/* Das Logo-Plättchen aus dem Katalog, klein. Feste Box, Bild eingepasst:
   SVGs ohne eigene Maße (F5) liefen im Entwurf sonst über den Rand. */
.cx-logoplate.cx-skx-logo {
  flex: none; width: 74px; height: 34px; padding: 0; overflow: hidden;
  border: 1px solid #E3E8F0; border-radius: 7px;
}
.cx-logoplate.cx-skx-logo.klein { width: 46px; height: 24px; border-radius: 6px; }
.cx-logoplate.cx-skx-logo.gross { width: 118px; height: 52px; border-radius: 9px; }
.cx-logoplate.cx-skx-logo img {
  width: 84%; height: 68%; max-width: none; max-height: none; object-fit: contain; display: block;
}
/* Ohne Logo steht der Name – auf dem hellen Plättchen in dunkler Schrift, in
   beiden Modi. Die geerbte Textfarbe wäre im dunklen Modus Weiß auf Weiß. */
.cx-skx-logo .cx-logo-ersatz {
  padding: 0 3px; overflow: hidden; text-align: center;
  font: 700 10px/1.1 var(--cx-font-body); color: #14171C;
  word-break: normal; overflow-wrap: normal; hyphens: none;
}
/* Im kleinen Plättchen (46 × 24) brach „ActivCard“ mitten im Wort um. */
.cx-skx-logo.klein .cx-logo-ersatz { padding: 0 2px; font-size: 8px; line-height: 1.05; }

.cx-skx-warn { color: var(--cx-warn); font-weight: 700; }
.cx-skx-hinweis {
  margin: 0 0 16px; padding: 10px 14px; font-size: 13.5px; line-height: 1.55; color: var(--cx-text-muted);
  background: var(--cx-carbon); border: 1px solid var(--cx-border); border-left: 3px solid var(--cx-blue);
  border-radius: 0 var(--cx-radius-sm) var(--cx-radius-sm) 0;
}
.cx-skx-hinweis b { color: var(--cx-text); }
.cx-skx-hinweis.klein { margin: 6px 0 0; padding: 5px 10px; font-size: 12.5px; }
.cx-skx-hinweis.fehler { border-left-color: var(--cx-warn); }
.cx-skx-leg { display: inline-flex; align-items: center; gap: 6px; }
/* In einer Grid-Zelle (.cx-sks-wer > span) würde die Marke sonst gestreckt. */
.cx-skx-kname { justify-self: start; }
/* Die beiden Skill-Dialoge brauchen etwas mehr als die 430 px aus .cx-dialog:
   Bei 430 brachen „Abbrechen“ und „Kontaktdaten anfordern“ untereinander um
   (141 + 10 + 237 px gegen 372 px Innenbreite, gemessen). BREITE, nicht
   max-width – siehe .cx-sk-wahl. */
.cx-dialog.cx-sk-dialog { width: min(520px, calc(100vw - 32px)); }

/* Die Meldung unten – hängt am <body>. */
.cx-skx-meldung {
  position: fixed; left: 50%; bottom: 26px; z-index: 140; opacity: 0; pointer-events: none;
  transform: translate(-50%, 20px); max-width: min(560px, calc(100vw - 32px));
  padding: 9px 18px; border-radius: 999px; box-shadow: 0 12px 30px rgba(0, 0, 0, .35);
  background: var(--cx-text); color: var(--cx-carbon); font: 600 14px/1.4 var(--cx-font-body);
  transition: opacity .2s, transform .2s;
}
.cx-skx-meldung.auf { opacity: 1; transform: translate(-50%, 0); }
.cx-skx-meldung.fehler { background: var(--cx-warn); color: #14171C; }
/* Ocker (#8A5A00) trägt dunkle Schrift nur mit 3,05:1 – Weiß mit 5,93:1. */
html[data-theme="light"] .cx-skx-meldung.fehler { color: #fff; }

/* --- Seitenblatt (Person oder Produkt) – hängt am <body> --- */
.cx-skx-decke {
  position: fixed; inset: 0; z-index: 130; opacity: 0;
  background: rgba(4, 6, 10, .55); transition: opacity .2s;
}
html[data-theme="light"] .cx-skx-decke { background: rgba(20, 23, 28, .28); }
.cx-skx-decke.auf { opacity: 1; }
.cx-skx-blatt {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 131; width: min(560px, 100vw);
  display: flex; flex-direction: column; color: var(--cx-text);
  background: var(--cx-graphite); border-left: 1px solid var(--cx-border);
  box-shadow: -22px 0 60px rgba(0, 0, 0, .45);
  transform: translateX(100%); transition: transform .25s ease;
}
html[data-theme="light"] .cx-skx-blatt { box-shadow: -22px 0 60px rgba(20, 23, 28, .14); }
.cx-skx-blatt.auf { transform: none; }
.cx-skx-blatt a { color: var(--cx-blue-light); }
html[data-theme="light"] .cx-skx-blatt a { color: var(--cx-blue-deep); }
.cx-skx-bkopf {
  display: flex; align-items: flex-start; gap: 14px;
  padding: 22px 22px 16px; border-bottom: 1px solid var(--cx-border);
}
.cx-skx-bkopf > div { min-width: 0; }
.cx-skx-bkopf h2 {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin: 0 0 4px; font-size: 21px; line-height: 1.25;
}
.cx-skx-bkopf p { margin: 0; font-size: 13.5px; color: var(--cx-steel); }
.cx-skx-zu {
  flex: none; margin-left: auto; padding: 2px 8px; border: 0; border-radius: 6px; background: none;
  cursor: pointer; font-size: 24px; line-height: 1; color: var(--cx-steel);
}
.cx-skx-zu:hover { color: var(--cx-text); }
.cx-skx-bkoerper {
  flex: 1; overflow-y: auto; display: grid; gap: 20px; align-content: start;
  padding: 16px 22px 28px;
}
.cx-skx-bkoerper h3 { margin: 0 0 8px; font-size: 14px; letter-spacing: .04em; }
.cx-skx-bkoerper h4 {
  margin: 12px 0 4px; font: 700 11.5px/1.4 var(--cx-font-body);
  letter-spacing: .1em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-skx-bkoerper p { margin: 0; }
.cx-skx-bkoerper .cx-skx-hinweis { margin: 0; }
.cx-skx-bzeile { display: flex; align-items: center; gap: 10px; padding: 5px 0; font-size: 14px; color: var(--cx-text); }
.cx-skx-bzeile > span:not([class]), .cx-skx-bwer > span { flex: 1; min-width: 0; display: grid; }
.cx-skx-bzeile small { font-size: 12px; color: var(--cx-steel); }
.cx-skx-bwer {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; padding: 0;
  border: 0; background: none; text-align: left; cursor: pointer; font: inherit; color: inherit;
}
.cx-skx-bwer:hover > span { text-decoration: underline; text-underline-offset: 3px; }
.cx-skx-kontakt { display: grid; grid-template-columns: auto 1fr; gap: 6px 16px; margin: 0; font-size: 14px; }
.cx-skx-kontakt dt { color: var(--cx-steel); }
.cx-skx-kontakt dd { margin: 0; color: var(--cx-text); overflow-wrap: anywhere; }

/* --- Matrix --- */
.cx-skm-rahmen {
  overflow: auto; max-height: calc(100vh - var(--cx-kopf) - 40px);
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skm { border-collapse: separate; border-spacing: 0; min-width: 100%; font-size: 13.5px; }
.cx-skm th, .cx-skm td { padding: 0; border-bottom: 1px solid var(--cx-border); font-weight: inherit; }
.cx-skm thead th { position: sticky; z-index: 3; background: var(--cx-graphite); }
.cx-skm thead tr.r1 th { top: 0; height: 38px; }
.cx-skm thead tr.r2 th { top: 38px; height: 40px; border-bottom-color: var(--cx-steel); }
.cx-skm .cx-skm-p {
  position: sticky; left: 0; z-index: 2; min-width: 268px; max-width: 268px; text-align: left;
  background: var(--cx-graphite); border-right: 1px solid var(--cx-border);
}
.cx-skm thead .cx-skm-p {
  z-index: 4; padding: 0 14px;
  font: 700 11.5px/1.3 var(--cx-font-body); letter-spacing: .1em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-skm-pz {
  display: flex; align-items: center; gap: 10px; width: 100%; padding: 6px 14px;
  border: 0; background: none; text-align: left; cursor: pointer; font: inherit; color: var(--cx-text);
}
.cx-skm-pz > span { display: grid; min-width: 0; line-height: 1.25; }
.cx-skm-pz b, .cx-skm-pz small { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cx-skm-pz b { font-size: 13.5px; font-weight: 600; }
.cx-skm-pz small { font-size: 11.5px; color: var(--cx-steel); }
.cx-skm-pz:hover b { text-decoration: underline; text-underline-offset: 3px; }
.cx-skm th.cx-skm-gkopf {
  padding: 0 10px; text-align: left; white-space: nowrap; font-size: 12.5px;
  border-left: 1px solid var(--cx-border);
}
.cx-skm-gkopf button, .cx-skm-gkopf b {
  padding: 0; border: 0; background: none; cursor: pointer;
  font: 700 12.5px/1 var(--cx-font-body); color: var(--cx-text);
}
.cx-skm-gkopf b { cursor: default; }
.cx-skm-gkopf span { margin-left: 4px; font-weight: 500; color: var(--cx-steel); }
.cx-skm .cx-skm-kz { width: 32px; min-width: 32px; text-align: center; }
.cx-skm-kz button {
  display: grid; place-items: center; width: 100%; min-height: 38px; padding: 0;
  border: 0; background: none; cursor: pointer;
}
.cx-skm .erst { border-left: 1px solid var(--cx-border); }
.cx-skm .cx-skm-sum {
  width: 78px; min-width: 78px; text-align: center; font-size: 12px;
  color: var(--cx-text-muted); font-variant-numeric: tabular-nums;
}
.cx-skm thead .cx-skm-sum { font-size: 11px; line-height: 1.2; font-weight: 600; color: var(--cx-steel); }
.cx-skm-sum b { color: var(--cx-text); }
.cx-skm .cx-skm-d { width: 170px; min-width: 170px; padding: 0 12px; text-align: left; border-left: 1px solid var(--cx-border); }
.cx-skm thead .cx-skm-d {
  font: 700 11.5px/1.3 var(--cx-font-body); letter-spacing: .1em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-skm td.cx-skm-c { height: 36px; text-align: center; }
.cx-skm td.cx-skm-c[data-sk-person] { cursor: pointer; }
.cx-skm td.cx-skm-c .cx-sk-stufe { min-width: 25px; height: 22px; padding: 0 3px; font-size: 11.5px; }
.cx-skm-punkt {
  display: inline-block; width: 4px; height: 4px; border-radius: 50%;
  background: var(--cx-border); vertical-align: middle;
}
/* Fadenkreuz: die Zeile über :hover, die Spalte über .kreuz aus app.js. Die
   Spaltenregel braucht mehr Gewicht als die Zeilenregel, sonst verschwindet
   der Schnittpunkt. Gruppenzeilen bleiben ungefärbt – auf getöntem Grund hielte
   ihr Grauton die 4,5:1 nicht. */
.cx-skm tbody tr:not(.cx-skm-grp):hover > * { background: color-mix(in srgb, var(--cx-blue) 7%, var(--cx-graphite)); }
.cx-skm tbody tr:not(.cx-skm-grp) > td.kreuz,
.cx-skm thead tr > th.kreuz { background: color-mix(in srgb, var(--cx-blue) 12%, var(--cx-graphite)); }
.cx-skm tr.cx-skm-luecke > .cx-skm-p { box-shadow: inset 3px 0 0 var(--cx-warn); }
.cx-skm tr.cx-skm-grp th { height: 36px; text-align: left; background: var(--cx-carbon); }
/* Sticky IM Kopf der Gruppe: Die Zelle ist so breit wie die Tabelle, sticky an
   ihr bewirkte nichts – der Titel wanderte beim Seitwärtsrollen aus dem Bild. */
.cx-skm-grp button {
  position: sticky; left: 0; display: inline-flex; align-items: center; gap: 10px;
  height: 36px; padding: 0 14px; border: 0; background: none; cursor: pointer;
  font: 700 13.5px/1 var(--cx-font-body); color: var(--cx-text);
}
.cx-skm-grp button > span { font-size: 12.5px; font-weight: 500; color: var(--cx-steel); }
.cx-skm-deck { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--cx-text-muted); white-space: nowrap; }
.cx-skm-deck .eins { color: var(--cx-warn); font-weight: 700; }
.cx-skm-bar, .cx-skd-bahn { display: flex; overflow: hidden; border-radius: 99px; background: var(--cx-border); }
.cx-skm-bar { flex: none; width: 56px; height: 8px; }
.cx-skm-bar i, .cx-skd-bahn i { display: block; height: 100%; background: var(--b-flaeche); }
/* Die beiden unteren Bänder sind im dunklen Modus fast Grund – ihr Rand trägt. */
.cx-skm-bar i.cx-sk-b1, .cx-skd-bahn i.cx-sk-b1 { background: var(--band-1-rand); }
.cx-skm-bar i.cx-sk-b2, .cx-skd-bahn i.cx-sk-b2 { background: var(--band-2-rand); }

/* --- Landkarte --- */
.cx-skl-kopf {
  display: grid; grid-template-columns: auto 1fr auto; gap: 14px 26px; align-items: center;
  margin: 0 0 14px; padding: 18px 22px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skl-zahl { font: 700 40px/1 var(--cx-font-display); font-variant-numeric: tabular-nums; color: var(--cx-text); }
.cx-skl-zahl small { font-size: 18px; font-weight: 600; color: var(--cx-steel); }
.cx-skl-txt { display: grid; gap: 3px; }
.cx-skl-txt > b { font-size: 15px; color: var(--cx-text); }
.cx-skl-txt > span { font-size: 13.5px; color: var(--cx-text-muted); }
.cx-skl-bahn { grid-column: 1 / -1; display: flex; height: 8px; overflow: hidden; border-radius: 99px; background: var(--cx-border); }
.cx-skl-bahn i { display: block; height: 100%; }
.cx-skl-bahn i.voll { background: var(--band-4-flaeche); }
.cx-skl-bahn i.eins { background: var(--cx-warn); }
.cx-skl-legende {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 18px;
  margin: 0 0 14px; font-size: 12.5px; color: var(--cx-steel);
}
.cx-skl-legende span { display: inline-flex; align-items: center; gap: 6px; }
.cx-skl-muster { display: inline-block; width: 22px; height: 14px; border-radius: 4px; border: 1px solid var(--cx-border); }
.cx-skl-muster.h3 { background: color-mix(in srgb, var(--band-4-flaeche) 32%, var(--cx-graphite)); }
.cx-skl-muster.luecke { border: 1.5px dashed var(--cx-warn); }
.cx-skl-karte { columns: 2 440px; column-gap: 16px; }
.cx-skl-bereich {
  break-inside: avoid; display: grid; gap: 12px; margin: 0 0 16px; padding: 16px 16px 12px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skx-inhalt .cx-skl-bereich h3 { margin: 0; font-size: 16px; }
.cx-skl-bereich h3 span { margin-left: 6px; font: 500 12.5px/1 var(--cx-font-body); color: var(--cx-steel); }
.cx-skl-h { display: grid; grid-template-columns: 78px minmax(0, 1fr); gap: 10px; align-items: start; }
.cx-skl-h .cx-skx-logo { margin-top: 4px; }
.cx-skl-kacheln { display: flex; flex-wrap: wrap; gap: 8px; }
.cx-skl-lm { flex: 1 0 100%; font-size: 12px; }
.cx-skl-kachel {
  flex: 1 1 138px; min-width: 138px; max-width: 220px; display: grid; gap: 3px; align-content: start;
  padding: 9px 11px 8px; text-align: left; cursor: pointer; font: inherit; color: var(--cx-text);
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: 12px;
  transition: transform .12s, border-color .12s;
}
.cx-skl-kachel:hover { transform: translateY(-2px); border-color: var(--cx-blue); }
/* Vier feste Stufen, nicht je Bereich normiert: 1 Person sieht überall gleich aus. */
.cx-skl-kachel.h1 { background: color-mix(in srgb, var(--band-4-flaeche) 12%, var(--cx-graphite)); }
.cx-skl-kachel.h2 { background: color-mix(in srgb, var(--band-4-flaeche) 22%, var(--cx-graphite)); }
.cx-skl-kachel.h3 { background: color-mix(in srgb, var(--band-4-flaeche) 32%, var(--cx-graphite)); }
.cx-skl-kachel.h4 { background: color-mix(in srgb, var(--band-4-flaeche) 42%, var(--cx-graphite)); }
html[data-theme="light"] .cx-skl-kachel.h1 { background: color-mix(in srgb, var(--band-4-flaeche) 9%, var(--cx-graphite)); }
html[data-theme="light"] .cx-skl-kachel.h2 { background: color-mix(in srgb, var(--band-4-flaeche) 17%, var(--cx-graphite)); }
html[data-theme="light"] .cx-skl-kachel.h3 { background: color-mix(in srgb, var(--band-4-flaeche) 25%, var(--cx-graphite)); }
html[data-theme="light"] .cx-skl-kachel.h4 { background: color-mix(in srgb, var(--band-4-flaeche) 33%, var(--cx-graphite)); }
.cx-skl-kachel .n { font-size: 13px; font-weight: 700; line-height: 1.25; }
.cx-skl-kachel .z { display: flex; align-items: baseline; gap: 5px; font-size: 11.5px; color: var(--cx-text-muted); }
.cx-skl-kachel .z b { font: 700 22px/1.1 var(--cx-font-display); font-variant-numeric: tabular-nums; color: var(--cx-text); }
.cx-skl-kachel.eins .z b { color: var(--cx-warn); }
.cx-skl-kachel .p { display: flex; flex-wrap: wrap; gap: 3px; min-height: 9px; }
.cx-skl-kachel .p i { width: 9px; height: 9px; border-radius: 50%; background: var(--b-flaeche); border: 1px solid var(--b-rand); }
.cx-skl-kachel .p i.ps { border-style: dashed; }
.cx-skl-kachel .p i.cx-sk-b0 { display: none; }
.cx-skl-h.luecke .cx-skl-kachel { border: 1.5px dashed var(--cx-warn); }

/* --- Suche --- */
.cx-sks-kasten {
  display: grid; gap: 14px; margin: 0 0 18px; padding: 22px 24px;
  background: radial-gradient(120% 140% at 0% 0%, color-mix(in srgb, var(--cx-blue) 14%, transparent), transparent 60%), var(--cx-graphite);
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skx-inhalt .cx-sks-kasten h2 { margin: 0; font-size: 24px; }
.cx-sks-feld { position: relative; }
.cx-sks-eingabe {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 52px; padding: 9px 12px;
  background: var(--cx-carbon); border: 1.5px solid var(--cx-blue); border-radius: 16px;
}
.cx-sks-eingabe:focus-within { box-shadow: 0 0 0 3px color-mix(in srgb, var(--cx-blue) 25%, transparent); }
.cx-sks-eingabe input {
  flex: 1; min-width: 220px; border: 0; outline: none; background: none;
  font: inherit; font-size: 16px; color: var(--cx-text);
}
.cx-sks-eingabe input::placeholder { color: var(--cx-steel); }
.cx-sks-marke {
  display: inline-flex; align-items: center; gap: 7px; padding: 4px 6px 4px 5px;
  font-size: 13.5px; font-weight: 600; color: var(--cx-text);
  background: color-mix(in srgb, var(--cx-blue) 18%, var(--cx-graphite));
  border: 1px solid color-mix(in srgb, var(--cx-blue) 50%, var(--cx-border)); border-radius: 10px;
}
.cx-sks-marke button {
  padding: 0 3px; border: 0; background: none; cursor: pointer;
  font-size: 16px; line-height: 1; color: var(--cx-text-muted);
}
.cx-sks-vorschlaege {
  position: absolute; left: 0; right: 0; top: calc(100% + 6px); z-index: 20;
  max-height: 320px; overflow-y: auto; padding: 6px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
  box-shadow: 0 22px 60px rgba(0, 0, 0, .45);
}
.cx-sks-vorschlaege button {
  display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 10px;
  border: 0; border-radius: 8px; background: none; text-align: left; cursor: pointer;
  font: inherit; font-size: 14px; color: var(--cx-text);
}
.cx-sks-vorschlaege button:hover, .cx-sks-vorschlaege button.aktiv { background: color-mix(in srgb, var(--cx-blue) 14%, transparent); }
.cx-sks-vorschlaege small { margin-left: auto; font-size: 12px; color: var(--cx-text-muted); }
.cx-sks-optionen { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; font-size: 13.5px; color: var(--cx-text-muted); }
.cx-sks-optionen > span:first-child { min-width: 110px; font-weight: 700; color: var(--cx-text); }
.cx-sks-optionen .cx-bq-filter small { font-weight: 500; color: inherit; }
.cx-sks-zertwahl { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; }
.cx-sks-zertwahl input { accent-color: var(--cx-blue-knopf); }
.cx-sks-ergebnis { display: grid; gap: 8px; }
.cx-sks-kopf { display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px; padding: 0 4px 4px; }
.cx-sks-kopf b { font-size: 16px; color: var(--cx-text); }
.cx-sks-kopf span { font-size: 13px; color: var(--cx-steel); }
.cx-sks-treffer {
  display: grid; grid-template-columns: minmax(240px, 1.25fr) minmax(170px, 1fr) minmax(150px, .9fr) auto;
  gap: 14px; align-items: center; padding: 12px 16px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-sks-wer {
  display: flex; align-items: center; gap: 10px; min-width: 0; padding: 0;
  border: 0; background: none; text-align: left; cursor: pointer; font: inherit; color: var(--cx-text);
}
.cx-sks-wer > span { display: grid; min-width: 0; }
.cx-sks-wer b { font-size: 14.5px; }
.cx-sks-wer small { font-size: 12.5px; color: var(--cx-steel); }
.cx-sks-wer:hover b { text-decoration: underline; text-underline-offset: 3px; }
.cx-sks-skills { display: flex; flex-wrap: wrap; gap: 6px; }
.cx-sks-skill {
  display: inline-flex; align-items: center; gap: 6px; padding: 2px 3px 2px 10px;
  font-size: 13px; color: var(--cx-text-muted); border: 1px solid var(--cx-border); border-radius: 999px;
}
.cx-sks-zert { font-size: 12.5px; color: var(--cx-steel); }
.cx-sks-aktion { justify-self: end; }
.cx-sks-summe {
  display: flex; align-items: center; gap: 12px; padding: 12px 16px; font-size: 14px;
  color: var(--cx-text-muted); border: 1px dashed var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-sks-summe b { color: var(--cx-text); }

/* --- Meine Skills: Kopf --- */
.cx-skd-profil {
  display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 18px 28px; align-items: center;
  padding: 20px 22px; background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skd-wer { display: flex; align-items: center; gap: 14px; min-width: 0; }
.cx-skx-inhalt .cx-skd-wer h2 {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 2px; font-size: 21px;
}
.cx-skd-wer p { margin: 0; font-size: 13.5px; color: var(--cx-steel); }
.cx-skd-wer p.cx-skx-hinweis { margin-top: 6px; color: var(--cx-text-muted); }
.cx-skd-zahlen { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; text-align: center; }
.cx-skd-zahlen div { display: grid; }
.cx-skd-zahlen small { font-size: 11.5px; letter-spacing: .04em; color: var(--cx-steel); }
.cx-skd-zahlen b { font: 700 22px/1.2 var(--cx-font-display); font-variant-numeric: tabular-nums; color: var(--cx-text); }
.cx-skd-zahlen b span { font-size: 14px; font-weight: 600; color: var(--cx-steel); }
.cx-skd-vert { grid-column: 2; display: grid; gap: 6px; }
.cx-skd-bahn { height: 10px; }
.cx-skd-bahn i { transition: width .4s ease; }
.cx-skd-leg { display: flex; justify-content: space-between; gap: 6px; font-size: 11.5px; color: var(--cx-steel); font-variant-numeric: tabular-nums; }
.cx-skd-modus { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin: 16px 0 14px; }

/* --- Meine Skills: Schnelldurchlauf --- */
.cx-skd-start { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 12px; }
.cx-skd-wahl {
  position: relative; display: grid; gap: 6px; align-content: start; padding: 18px 18px 16px;
  text-align: left; cursor: pointer; font: inherit; color: var(--cx-text);
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  transition: transform .12s, border-color .12s;
}
.cx-skd-wahl:hover:not(:disabled) { transform: translateY(-2px); border-color: var(--cx-blue); }
.cx-skd-wahl:disabled { cursor: default; opacity: .6; }
.cx-skd-wahl b { padding-right: 56px; font: 700 16px/1.3 var(--cx-font-display); }
.cx-skd-wahl span { font-size: 13.5px; color: var(--cx-text-muted); }
.cx-skd-wahl em {
  position: absolute; top: 16px; right: 18px; font: 700 22px/1 var(--cx-font-display);
  font-style: normal; font-variant-numeric: tabular-nums; color: var(--cx-text);
}
.cx-skd-fortschritt {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; width: min(760px, 100%);
  margin: 0 auto 14px; font-size: 13px; color: var(--cx-steel); font-variant-numeric: tabular-nums;
}
.cx-skd-leiste { flex: 1 1 120px; height: 6px; overflow: hidden; border-radius: 99px; background: var(--cx-border); }
.cx-skd-leiste i { display: block; height: 100%; background: var(--cx-gradient); transition: width .3s; }
.cx-skd-stapel { position: relative; width: min(760px, 100%); margin: 0 auto 30px; }
.cx-skd-geist {
  position: absolute; inset: 0;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skd-geist.g1 { transform: translateY(10px) scale(.975); opacity: .7; }
.cx-skd-geist.g2 { transform: translateY(20px) scale(.95); opacity: .4; }
.cx-skd-karte {
  position: relative; display: grid; gap: 12px; padding: 22px 24px 18px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
  box-shadow: 0 22px 60px rgba(0, 0, 0, .45);
  transition: transform .22s ease, opacity .22s ease;
}
/* Nur die NEUE Karte gleitet herein – nicht jede, die nach der Wahl eines
   Notenbands neu gezeichnet wird. */
.cx-skd-karte.rein { animation: cx-skd-rein .28s ease; }
html[data-theme="light"] .cx-skd-karte { box-shadow: 0 22px 60px rgba(20, 23, 28, .14); }
.cx-skd-karte:focus { outline: none; }
.cx-skd-karte.raus { transform: translateX(-60px) rotate(-3deg); opacity: 0; }
.cx-skd-karte.arbeitet { pointer-events: none; cursor: progress; }
@keyframes cx-skd-rein { from { transform: translateY(12px) scale(.98); opacity: .3; } to { transform: none; opacity: 1; } }
.cx-skd-kk { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
.cx-skd-kk > span:not([class]) { display: grid; }
.cx-skd-kk b { font-size: 14px; color: var(--cx-text); }
.cx-skd-kk small { font-size: 12.5px; color: var(--cx-steel); }
.cx-skd-grund {
  margin-left: auto; padding: 3px 10px; border: 1px solid var(--cx-border); border-radius: 999px;
  font-size: 12px; font-weight: 700; color: var(--cx-text-muted); white-space: nowrap;
}
.cx-skd-grund.alt { color: var(--cx-warn); border-color: color-mix(in srgb, var(--cx-warn) 55%, transparent); }
.cx-skx-inhalt .cx-skd-karte h2 { margin: 0; font-size: 25px; line-height: 1.2; }
.cx-skd-vormals { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0; font-size: 12.5px; color: var(--cx-steel); }
.cx-skd-vormals span { padding: 0 6px; border: 1px dashed var(--cx-border); border-radius: 6px; color: var(--cx-text-muted); }
.cx-skd-karte .cx-skx-hinweis { margin: 0; }
.cx-skd-frage { margin: 4px 0 0; font-size: 14px; font-weight: 700; color: var(--cx-text); }
.cx-skd-baender { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; }
.cx-skd-band {
  position: relative; display: grid; gap: 2px; align-content: start; min-height: 124px;
  padding: 14px 12px 26px; overflow: hidden; text-align: left; cursor: pointer;
  font: inherit; color: var(--cx-text);
  background: var(--cx-carbon); border: 1px solid var(--cx-border); border-radius: 12px;
  transition: transform .12s, border-color .12s;
}
.cx-skd-band::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 5px; background: var(--b-flaeche); }
.cx-skd-band.cx-sk-b1::before { background: var(--band-1-rand); }
.cx-skd-band.cx-sk-b2::before { background: var(--band-2-rand); }
.cx-skd-band:hover { transform: translateY(-2px); border-color: var(--cx-blue); }
.cx-skd-band b { font: 700 16px/1.3 var(--cx-font-display); }
.cx-skd-band span { font-size: 13px; font-weight: 600; color: var(--cx-text-muted); }
.cx-skd-band small { margin-top: 4px; font-size: 12px; line-height: 1.35; color: var(--cx-steel); }
.cx-skd-band em { position: absolute; right: 10px; bottom: 8px; font-size: 11px; font-style: normal; color: var(--cx-steel); font-variant-numeric: tabular-nums; }
.cx-skd-band kbd { position: absolute; top: 12px; right: 9px; }
.cx-skd-feinliste { display: grid; gap: 6px; }
.cx-skd-fein {
  display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center; padding: 10px 12px;
  text-align: left; cursor: pointer; font: inherit; font-size: 14px; color: var(--cx-text-muted);
  background: var(--cx-carbon); border: 1px solid var(--cx-border); border-radius: 12px;
}
.cx-skd-fein:hover { border-color: var(--cx-blue); }
.cx-skd-fein b { margin-right: 6px; color: var(--cx-text); }
.cx-skd-fein .cx-sk-stufe { min-width: 34px; height: 28px; font-size: 13.5px; }
.cx-skd-fuss {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-top: 2px; padding-top: 12px; border-top: 1px solid var(--cx-border);
}
.cx-skd-fuss .cx-sk-stufe { min-width: 22px; height: 20px; margin-right: 4px; padding: 0 5px; font-size: 11px; }
.cx-skd-rechts { display: flex; flex-wrap: wrap; gap: 8px; margin-left: auto; }
.cx-skd-ende {
  display: grid; justify-items: center; gap: 12px; width: min(760px, 100%); margin: 0 auto; padding: 28px;
  text-align: center; background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skx-inhalt .cx-skd-ende h2 { margin: 0; font-size: 28px; }
.cx-skd-ende p { margin: 0; max-width: 60ch; }
.cx-skd-ende p:last-child { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }

/* --- Meine Skills: Liste --- */
.cx-sk-gruppe.cx-skd-lgruppe { padding: 0; background: var(--cx-carbon); border-top: 1px solid var(--cx-border); }
.cx-sk-gruppe.cx-skd-lgruppe:first-child { border-top: 0; border-radius: var(--cx-radius) var(--cx-radius) 0 0; }
.cx-skd-lgruppe button {
  display: flex; align-items: center; gap: 10px; width: 100%; padding: 10px 16px;
  border: 0; background: none; text-align: left; cursor: pointer; font: inherit; color: var(--cx-text);
}
.cx-skd-hname { font: 700 15px/1.3 var(--cx-font-display); }

/* --- Zertifikate --- */
.cx-skx-inhalt .cx-skz-titel { margin: 26px 0 10px; font-size: 19px; }
.cx-skz-meine {
  margin: 0 0 8px; padding: 18px 20px;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skz-mkopf { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 8px; }
.cx-skx-inhalt .cx-skz-mkopf .cx-skz-titel { margin: 0; }
.cx-skz-mein {
  display: grid; grid-template-columns: minmax(200px, 1fr) 150px 160px auto auto; gap: 10px; align-items: center;
  padding: 10px 0; border-top: 1px solid var(--cx-border);
}
.cx-skz-name { display: grid; min-width: 0; font-size: 14px; font-weight: 600; color: var(--cx-text); }
.cx-skz-name small { font-size: 12px; font-weight: 400; color: var(--cx-steel); }
.cx-skz-neu {
  display: grid; grid-template-columns: minmax(220px, 2fr) minmax(130px, 1fr) minmax(140px, 1fr) auto; gap: 10px;
  align-items: end; padding: 14px 0 0; border-top: 1px solid var(--cx-border);
}
.cx-skz-neu .cx-feld { margin: 0; }
.cx-skz-neu > .cx-btn { margin-bottom: 2px; }
.cx-skz-neu .cx-sk-fussnote { grid-column: 1 / -1; margin: 0; }
.cx-select.cx-skz-person { width: auto; min-width: 180px; }
.cx-skz-legende { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 12px; }
.cx-skz-gruppe {
  margin: 0 0 12px; overflow: hidden;
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skx-inhalt .cx-skz-gruppe h3 {
  display: flex; align-items: center; gap: 10px; margin: 0; padding: 10px 16px; font-size: 15px;
  background: var(--cx-carbon); border-bottom: 1px solid var(--cx-border);
}
.cx-skz-gruppe h3 > span:last-child { font: 500 12.5px/1 var(--cx-font-body); color: var(--cx-steel); }
.cx-skz-zeile {
  display: grid; grid-template-columns: minmax(220px, 1fr) 2fr; gap: 14px; align-items: center;
  padding: 10px 16px; border-bottom: 1px solid var(--cx-border);
}
.cx-skz-zeile:last-child { border-bottom: 0; }
.cx-skz-inhaber { display: flex; flex-wrap: wrap; gap: 6px; }
.cx-skz-marke {
  display: inline-flex; align-items: center; gap: 5px; padding: 2px 9px; white-space: nowrap;
  font: 700 12.5px/1.5 var(--cx-font-body); font-variant-numeric: tabular-nums; color: var(--cx-text);
  background: none; border: 1px solid var(--cx-border); border-radius: 999px;
}
button.cx-skz-marke { cursor: pointer; }
button.cx-skz-marke:hover { border-color: var(--cx-blue); }
.cx-skz-marke > span { font-weight: 500; color: var(--cx-text-muted); }
.cx-skz-marke.gueltig::before, .cx-skz-marke.ewig::before, .cx-skz-marke.bald::before {
  content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--cx-accent);
}
.cx-skz-marke.gueltig, .cx-skz-marke.ewig { border-color: color-mix(in srgb, var(--cx-accent) 70%, transparent); }
.cx-skz-marke.bald { border-color: color-mix(in srgb, var(--cx-warn) 70%, transparent); }
.cx-skz-marke.bald::before { background: var(--cx-warn); }
.cx-skz-marke.ab, .cx-skz-marke.ab > span { color: var(--cx-steel); }
.cx-skz-marke.ab > span { text-decoration: line-through; }
.cx-skz-marke.pruef { border-style: dashed; border-color: var(--band-plan-rand); color: var(--band-plan-text); }
.cx-skz-marke.ohne { color: var(--cx-text-muted); }
.cx-skz-marke.pseudo { border-style: dashed; }
.cx-skz-marke.summe { border-style: dotted; color: var(--cx-text-muted); }

/* --- Verwaltung: links die Gesellschaften, rechts Freigaben und Leute --- */
.cx-skv2 { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 18px; align-items: start; }
/* Klebt, aber mit eigener Höhe: Bei 29 Gesellschaften wäre die Spalte höher
   als das Fenster, und ihr Ende käme erst am Seitenende ins Bild. */
.cx-skv2-links {
  position: sticky; top: calc(var(--cx-kopf) + 16px); display: grid; gap: 8px;
  max-height: calc(100vh - var(--cx-kopf) - 32px); overflow-y: auto; padding: 2px;
}
.cx-skv2-label {
  margin: 0; padding: 4px 4px 0;
  font: 700 11.5px/1.4 var(--cx-font-body); letter-spacing: .14em; text-transform: uppercase; color: var(--cx-steel);
}
.cx-skv2-ges {
  display: grid; gap: 3px; width: 100%; padding: 11px 13px; text-align: left; cursor: pointer;
  font: inherit; color: var(--cx-text);
  background: var(--cx-graphite); border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-skv2-ges:hover { border-color: var(--cx-blue); }
.cx-skv2-ges.an { border-color: var(--cx-blue); background: color-mix(in srgb, var(--cx-blue) 9%, var(--cx-graphite)); }
.cx-skv2-ges b { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 14px; }
.cx-skv2-ges small, .cx-skv2-ges .cx-skx-gtag { font-size: 12.5px; color: var(--cx-text-muted); }
.cx-skv2-ges .cx-skx-gtag { font-size: 10.5px; }
.cx-skv2-ges small.cx-skx-warn { color: var(--cx-warn); }
/* Kontaktanfragen: bernsteinfarben gerahmt, solange die Testphase läuft. */
.cx-skv2-firma { padding: 16px 20px; border-color: color-mix(in srgb, var(--cx-warn) 45%, var(--cx-border)); }
.cx-skv2-firma.an { border-color: var(--cx-border); }
.cx-skv2-firma .cx-skv-zeile { padding-top: 0; border-top: 0; align-items: center; }
.cx-skv2-rechts { display: grid; gap: 18px; min-width: 0; }
.cx-skv2-leer {
  padding: 28px 24px; font-size: 14.5px; line-height: 1.6; color: var(--cx-text-muted);
  background: var(--cx-graphite); border: 1px dashed var(--cx-border); border-radius: var(--cx-radius);
}
.cx-skv2-leer b { display: block; margin-bottom: 4px; font-size: 16px; color: var(--cx-text); }
.cx-skv2-form, .cx-skv2-ma { display: grid; gap: 14px; padding: 18px 20px; }
.cx-skx-inhalt .cx-skv2-form h2, .cx-skx-inhalt .cx-skv2-ma h2 { margin: 0; font-size: 19px; }
.cx-skv2-form h2 small { margin-left: 8px; font: 500 13px/1 var(--cx-font-body); color: var(--cx-steel); }
.cx-skv2-form .cx-skv-dach, .cx-skv2-form .cx-skv-txt-frei { margin: 0; }
.cx-skv2-teilen {
  display: grid; gap: 10px; margin: 0; padding: 10px 14px 12px;
  border: 1px solid var(--cx-border); border-radius: var(--cx-radius-sm);
}
.cx-skv2-teilen legend { padding: 0 6px; font-size: 13.5px; font-weight: 700; color: var(--cx-text); }
.cx-skv2-opt {
  display: grid; grid-template-columns: auto 1fr; gap: 2px 10px; align-items: start;
  margin: 0; cursor: pointer; font-size: 14px; color: var(--cx-text);
}
.cx-skv2-opt input { margin: 3px 0 0; accent-color: var(--cx-blue-knopf); }
.cx-skv2-opt small { grid-column: 2; font-size: 12.5px; color: var(--cx-steel); }
.cx-skv2-teilen .cx-skx-hinweis.klein { margin: 2px 0 0; }
.cx-skv2-kurz { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; }
.cx-skv2-kurz .cx-feld { margin: 0; }
.cx-skv2-kurz .cx-input { width: 140px; }
.cx-skv2-kurz .cx-sk-fussnote { margin: 0 0 7px; }
.cx-skv2-form > .cx-sk-fussnote, .cx-skv2-ma > .cx-sk-fussnote { margin: 0; }
.cx-skv2-makopf { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }
.cx-skv2-ma .cx-sk-leiste { margin: 0; }
.cx-skv2-tabrahmen { overflow-x: auto; }
.cx-skv2-tab { font-size: 13.5px; }
.cx-skv2-tab td { vertical-align: middle; }
/* Schmaler als die 180 px aus .cx-table: Der Name ist kurz, der Künstlername
   darunter darf umbrechen. Zusammen mit der dünneren Mailadresse passt die
   Tabelle bei 1.172 px Fensterbreite ohne Querrollen (gemessen: 829 → 749). */
.cx-skv2-tab td:first-child { min-width: 140px; }
.cx-skv2-tab td a[href^="mailto:"] { font-size: 13px; font-weight: 500; }
.cx-skv2-tab td small { display: block; margin-top: 2px; font-size: 12px; font-weight: 400; color: var(--cx-steel); }
.cx-skv2-tab tr.inaktiv td:first-child b { color: var(--cx-text-muted); }
.cx-skv2-stand { display: flex; align-items: center; gap: 8px; }
.cx-skv2-bahn { flex: none; width: 56px; height: 6px; overflow: hidden; border-radius: 99px; background: var(--cx-border); }
.cx-skv2-bahn i { display: block; height: 100%; background: var(--cx-gradient); }
.cx-skv2-zahl { font-size: 12.5px; color: var(--cx-text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.cx-skv2-tag {
  display: inline-block; padding: 1px 7px; border: 1px solid var(--cx-border); border-radius: 6px;
  font-size: 11.5px; font-weight: 700; color: var(--cx-steel); white-space: nowrap;
}
.cx-skv2-tag.frisch { color: var(--cx-accent); border-color: color-mix(in srgb, var(--cx-accent) 50%, transparent); }
.cx-skv2-tag.alt { color: var(--cx-warn); border-color: color-mix(in srgb, var(--cx-warn) 50%, transparent); }
.cx-skv2-einladen {
  padding: 3px 12px; border: 1px dashed var(--cx-blue); border-radius: 999px; background: none; cursor: pointer;
  font: 700 12.5px/1.4 var(--cx-font-body); color: var(--cx-blue-light);
}
html[data-theme="light"] .cx-skv2-einladen { color: var(--cx-blue-deep); }
.cx-skv2-akt { width: 1%; white-space: nowrap; }
/* Untereinander statt nebeneinander: Nebeneinander machten „Skills“ und
   „Bearbeiten“ die Tabelle bei 1.172 px Fensterbreite um 30 px zu breit. */
.cx-skv2-akt > * { display: block; box-sizing: border-box; width: 100%; text-align: center; }
.cx-skv2-akt > * + * { margin-top: 6px; }
.cx-skv2-zwei { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.cx-dialog .cx-skv2-check { display: flex; align-items: flex-start; gap: 8px; font-size: 13.5px; font-weight: 400; }
.cx-dialog .cx-skv2-check input { width: auto; margin: 3px 0 0; }

@media (prefers-reduced-motion: reduce) {
  .cx-skd-karte, .cx-skd-wahl, .cx-skd-band, .cx-skl-kachel, .cx-skx-blatt, .cx-skx-decke, .cx-skx-meldung {
    animation: none; transition: none;
  }
}
@media (max-width: 980px) {
  .cx-skv2 { grid-template-columns: 1fr; }
  .cx-skv2-links { position: static; max-height: none; overflow: visible; }
  .cx-sks-treffer { grid-template-columns: 1fr; }
  .cx-sks-aktion { justify-self: start; }
  .cx-skz-zeile { grid-template-columns: 1fr; }
  .cx-skz-mein { grid-template-columns: 1fr 1fr; }
  .cx-skz-mein .cx-skz-name { grid-column: 1 / -1; }
  .cx-skz-neu { grid-template-columns: 1fr 1fr; }
  .cx-skz-neu .cx-feld:first-child { grid-column: 1 / -1; }
}
@media (max-width: 760px) {
  .cx-skd-profil { grid-template-columns: 1fr; }
  .cx-skd-vert { grid-column: 1; }
  .cx-skd-zahlen { grid-template-columns: repeat(2, 1fr); }
  .cx-skd-baender { grid-template-columns: repeat(2, 1fr); }
  .cx-skd-rechts { margin-left: 0; }
  .cx-skl-kopf { grid-template-columns: auto 1fr; }
  .cx-skl-kopf > .cx-bq-filter { grid-column: 1 / -1; justify-self: start; }
  .cx-skl-h { grid-template-columns: 1fr; }
  .cx-skm .cx-skm-p { min-width: 190px; max-width: 190px; }
  .cx-skv2-zwei { grid-template-columns: 1fr; }
  /* Die fünf Mindeststufen der Suche sind 381 px breit – auf 375 px Fenster
     schoben sie die ganze Seite seitwärts. Hier dürfen sie umbrechen. */
  .cx-skx-segment { flex: 0 1 auto; flex-wrap: wrap; max-width: 100%; border-radius: 14px; }
  .cx-skx-reiter { border-radius: 18px; }
  .cx-sks-optionen > span:first-child { flex-basis: 100%; min-width: 0; }
}
