/*
  brand.css — Der verbindliche Design-Kanon für die Workspace-Oberfläche.

  Kurzbeschreibung (für Laien): Diese Datei legt fest, wie wiederkehrende
  Bausteine im Workspace auszusehen haben — heute Reiterleisten und Suchfelder.
  Statt dass jede Seite ihre Reiter neu erfindet, holt sie sich das Aussehen
  hier. Farbe zentral ändern → alle Seiten ziehen mit.

  Einbinden ganz oben im <head> der Seite:
    <link rel="stylesheet" href="/assets/css/brand.css">

  Die Regeln in Worten (wann was) stehen in BRANDING.md im Repo-Wurzelordner.

  ── Hinweis zu den Farbnamen ────────────────────────────────────────────────
  Die Workspace-Seiten benutzen heute noch drei verschiedene Vokabulare für
  dieselben Farben (workspace.html: --text2/--border · operator-crm.html und
  operator-schedule.html: --muted/--line · _shared.css: --text-muted/--border).
  Bis das vereinheitlicht ist, fragt diese Datei alle Varianten der Reihe nach
  ab. Sobald ein gemeinsames Vokabular steht, fallen die Fallback-Ketten weg.
*/

/* ═══════════════════════════════════════════════════════════════════════════
   §20 Schriftart — EINE Schrift, verbindlich

   Ralph, 13.08.2026: „Die Branding-Funktionsseite gibt den Standard. Alles,
   was da nicht drin steht und trotzdem existiert, soll harmonisiert werden —
   wir haben immer nur ein Design, eine Designvorgabe."

   Gemessen wurde vorher FÜNF Schrift-Stacks nebeneinander: Inter (Workspace,
   Wiki, Team), -apple-system (Planer, Warranty, Durchlaufzeiten, Abrechnung),
   system-ui (Mail, Postfach, Code-Gen, Onboardings, Dok-Vorlagen), 'Segoe UI'
   (Inventory, Prod-Abgleich) und `inherit` (CRM). Auf Windows heißt das:
   Workspace in Inter, CRM daneben in Segoe UI — beim Umschalten sichtbar.

   Inter wird LOKAL ausgeliefert (kein Google-Fonts-Request, DSGVO). Wer den
   Kanon lädt, bekommt die Schrift damit automatisch mit; ein eigener
   <link> auf inter.css ist nicht mehr nötig (schadet aber nicht).
   ═══════════════════════════════════════════════════════════════════════════ */
@import url('/assets/fonts/inter.css');

:root { --a4h-schrift: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif; }

/* `body` und nicht `*`: Formularelemente erben Schriften nicht von selbst,
   deshalb stehen sie ausdrücklich daneben. Alles andere erbt. */
body,
input, textarea, select, button {
  font-family: var(--a4h-schrift);
}

/* ═══════════════════════════════════════════════════════════════════════════
   REITER  (horizontale Blätter — wechselt die Ansicht)

   Für Filter (kürzt eine Liste, die stehen bleibt) NICHT verwenden — die
   bekommen eine eigene Form, sonst sieht man dem Klick nicht mehr an, ob er
   die Seite wechselt oder nur die Liste kürzt.

   Aufbau:
     <div class="a4h-tabs">
       <button class="a4h-tab is-active">
         <span class="a4h-tab-emoji">📊</span>Dashboard
         <span class="a4h-tab-count">3</span>      ← Zähler, optional
         <span class="a4h-tab-dot"></span>          ← roter Punkt, optional
       </button>
       <span class="a4h-tabs-grow"></span>          ← schiebt Folgendes nach rechts
       <label class="a4h-search">…</label>          ← Suchfeld sitzt rechts
     </div>
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-tabs {
  display: flex;
  /* Einzeilig und seitlich scrollend — NIE umbrechend. Die Kopfzeile (§2a) hat
     eine feste Hoehe von 46px; eine zweite Reiterzeile verschwindet dahinter.
     Genau das passierte am 13.08.2026 im Inventory: von neun Reitern waren acht
     unsichtbar. Die Regel galt bis dahin nur unter 760px Fensterbreite. */
  flex-wrap: nowrap;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  align-items: center;
  gap: 4px;
}
.a4h-tabs::-webkit-scrollbar { display: none; }
.a4h-tabs > .a4h-tab { flex: 0 0 auto; }

/* Schiebt alles Nachfolgende (i.d.R. das Suchfeld) an den rechten Rand. */
.a4h-tabs-grow { flex: 1 1 auto; }

.a4h-tab {
  /* --a4h-tab-color: pro Reiter setzbar (Rechtsklick → Farbe). Ohne Wert
     bleibt der Reiter ungefärbt und nutzt die Akzentfarbe der Marke. */
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 16px;
  border: none;
  border-bottom: 2px solid transparent;
  background: transparent;
  /* Graustufe des inaktiven Reiters wird HIER bestimmt, nicht von der Seite
     geerbt: die Seiten definieren ihr „gedämpftes Grau" unterschiedlich
     (rgba(20,20,29,0.66) im CRM, #6b6e7d im Planer) — dieselbe Leiste sah
     dadurch je nach Funktion anders aus. Abgeleitet aus der Textfarbe, damit
     es in hellem und dunklem Theme automatisch passt. */
  color: color-mix(in srgb, var(--text, #14141d) 62%, transparent);
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  transition: color .12s, border-color .12s, background .12s;
}

.a4h-tab:hover { color: var(--text, #14141d); }

/* Aktiv-Markierung: `is-active` ist der Kanon, `active`/`is-on` werden
   mitgeführt, weil die bestehenden Seiten diese Klassen in ihrem JavaScript
   an vielen Stellen setzen. Wer neu baut, nimmt `is-active`. */
.a4h-tab.is-active,
.a4h-tab.active,
.a4h-tab.is-on {
  color: var(--text, #14141d);
  border-bottom-color: var(--a4h-tab-color, var(--accent, #6c63ff));
}

.a4h-tab:focus-visible {
  outline: 2px solid var(--a4h-tab-color, var(--accent, #6c63ff));
  outline-offset: -2px;
  border-radius: 6px 6px 0 0;
}

.a4h-tab:disabled { opacity: .45; cursor: default; }

/* Eingefärbter Reiter (Rechtsklick → Farbe): zarte Fläche + farbiger Unterstrich.
   color-mix hält die Fläche in jedem Theme dezent, egal welche Farbe gewählt ist. */
.a4h-tab[data-tab-color] {
  background: color-mix(in srgb, var(--a4h-tab-color) 10%, transparent);
  border-radius: 6px 6px 0 0;
}
.a4h-tab[data-tab-color].is-active {
  background: color-mix(in srgb, var(--a4h-tab-color) 20%, transparent);
}

/* „+" am Ende einer Reiterleiste: hier lässt sich ein neues Blatt anlegen
   (neuer Terminplan, neue Wissenskarte). Nur das Zeichen, keine Beschriftung —
   der gestrichelte Umriss unterscheidet es von einem Reiter. Gehört immer ans
   ENDE der Leiste und sitzt auf Höhe der Reiter-Beschriftung. */
.a4h-tab-add {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 5px;
  margin-left: 4px;
  padding: 6px 9px;
  border: 1px dashed var(--border-strong, var(--border, var(--line, rgba(15, 15, 30, 0.22))));
  border-radius: var(--a4h-r-s, 6px);
  background: transparent;
  color: var(--text-muted, var(--muted, var(--text2, #8a90a3)));
  font-family: inherit;
  font-size: 12px;
  font-weight: 600;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  transition: color .12s, border-color .12s, background .12s;
}
.a4h-tab-add svg { width: 14px; height: 14px; display: block; }
.a4h-tab-add:hover {
  color: var(--accent, #6c63ff);
  border-color: var(--accent, #6c63ff);
  border-style: solid;
  background: var(--accent-weak, rgba(108, 99, 255, 0.08));
}
.a4h-tab-add:focus-visible {
  outline: 2px solid var(--accent, #6c63ff);
  outline-offset: 1px;
}

/* Kompakte Reiterleiste — für schmale Flächen (Detail-Panels, Seitenleisten),
   wo die volle Höhe die Spalte erdrücken würde. Gleiche Form, kleinere Maße.
   Nicht verwenden, um eine normale Seitenleiste „platzsparender" zu machen. */
.a4h-tabs--compact { gap: 2px; }
.a4h-tabs--compact .a4h-tab { padding: 6px 10px; font-size: 12px; }
.a4h-tabs--compact .a4h-tab-emoji { font-size: 12px; }

/* Emoji im Reiter — jeder Reiter trägt eines (Kanon-Regel). */
.a4h-tab-emoji {
  font-size: 14px;
  line-height: 1;
  flex: 0 0 auto;
  /* Emoji nie einfärben, auch wenn der Reiter grau ist */
  filter: none;
}

/* Zähler im Reiter — eine Form für alle Leisten. */
.a4h-tab-count {
  display: inline-block;
  padding: 2px 8px;
  border-radius: var(--a4h-r-pill, 999px);
  background: var(--badge-bg, rgba(108, 99, 255, 0.18));
  color: var(--badge-text, var(--accent, #6c63ff));
  font-size: 11px;
  font-weight: 600;
  line-height: 1.45;
  font-variant-numeric: tabular-nums;
}

/* Zähler-Varianten: nur für Dringlichkeit, nicht dekorativ einsetzen. */
.a4h-tab-count.is-warn {
  background: color-mix(in srgb, var(--warn, #f0a500) 22%, transparent);
  color: var(--warn, #f0a500);
}
.a4h-tab-count.is-danger {
  background: color-mix(in srgb, var(--danger, var(--err, #d64545)) 20%, transparent);
  color: var(--danger, var(--err, #d64545));
}

/* Roter Punkt = „hier liegt etwas Ungelesenes", ohne Zahl. */
.a4h-tab-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--danger, var(--err, #d64545));
  flex: 0 0 auto;
}

/* Auf schmalen Fenstern seitlich scrollen statt umbrechen — sonst wandert die
   Reiterzeile mehrzeilig und der Inhalt springt. */
@media (max-width: 760px) {
  /* Scrollen und nowrap gelten jetzt generell (siehe oben) — hier bleibt nur
     das engere Polster fuer schmale Fenster. */
  .a4h-tab { flex: 0 0 auto; padding: 11px 13px; }
  .a4h-tabs-grow { display: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   SUCHFELD

   Kanon: Lupe davor, Platzhalter immer nur „Suchen" (keine Aufzählung, was
   durchsucht wird), bewusst schmal, und immer rechtsbündig auf Höhe der
   Reiter / Filter / Überschrift — nie über die volle Breite.

   Aufbau:
     <label class="a4h-search">
       <span class="a4h-search-icon">🔍</span>
       <input type="search" placeholder="Suchen">
     </label>
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-search {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  /* Darf sich stauchen, statt in eine zweite Zeile zu rutschen — in engen
     Leisten ist ein schmaleres Feld besser als ein umgebrochenes. */
  flex: 0 1 220px;
  min-width: 100px;
  max-width: 100%;
  height: 30px;
  padding: 0 10px;
  border: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.12)));
  border-radius: var(--a4h-r-m, 9px);
  background: var(--input-bg, var(--surface, rgba(255, 255, 255, 0.04)));
  transition: border-color .12s, background .12s;
}

.a4h-search:focus-within {
  border-color: var(--accent, #6c63ff);
  background: var(--a4h-flaeche);
}

.a4h-search-icon {
  font-size: 12px;
  line-height: 1;
  flex: 0 0 auto;
  opacity: .75;
  pointer-events: none;
}

.a4h-search input {
  flex: 1 1 auto;
  min-width: 0;
  border: none;
  background: transparent;
  color: var(--text, #14141d);
  font-family: inherit;
  font-size: 13px;
  outline: none;
  padding: 0;
}

.a4h-search input::placeholder {
  color: var(--text-faint, var(--text3, rgba(20, 20, 29, 0.40)));
}

/* Das native „x" von type=search entfernen — es kollidiert optisch mit der
   schmalen Feldhöhe und sieht in jedem Browser anders aus. */
.a4h-search input::-webkit-search-cancel-button { -webkit-appearance: none; }

@media (max-width: 760px) {
  .a4h-search { width: 100%; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ICON-BUTTONS  (Funktionen ohne Text: Speichern, Löschen, Download, Play …)

   Immer als GRUPPE in einer eigenen Leiste, nicht als lose Einzel-Buttons —
   die Leiste fasst zusammen, was zusammengehört, und hält die Fläche ruhig.
   Ohne Beschriftung ist der Tooltip die einzige Erklärung: `title` ist
   deshalb PFLICHT, dazu `aria-label` mit demselben Text.

     <div class="a4h-iconbar">
       <button class="a4h-icon-btn" title="Als PDF exportieren" aria-label="Als PDF exportieren">…svg…</button>
       <button class="a4h-icon-btn" title="Speichern" aria-label="Speichern">…svg…</button>
       <button class="a4h-icon-btn is-danger" title="Löschen" aria-label="Löschen">…svg…</button>
     </div>

   Icons: 16×16, `viewBox="0 0 24 24"`, `fill="none"`, `stroke="currentColor"`,
   `stroke-width="2"`, runde Enden — der Stil, der im Repo überall verwendet
   wird. Nie ein Emoji als Icon-Button (Emojis gehören in Reiter).
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-iconbar {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 3px;
  border-radius: var(--a4h-r-m, 9px);
  background: var(--seg-bg, var(--input-bg, rgba(15, 15, 30, 0.05)));
}

.a4h-icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 30px;
  padding: 0;
  border: none;
  border-radius: var(--a4h-r-s, 6px);
  background: transparent;
  color: var(--text-muted, var(--muted, var(--text2, #8a90a3)));
  cursor: pointer;
  transition: color .12s, background .12s, box-shadow .12s;
}

.a4h-icon-btn svg { width: 16px; height: 16px; display: block; }

/* Angefasst: hebt sich als eigene Fläche heraus — dasselbe Verhalten wie im
   Terminplaner, von dem dieses Muster stammt. */
.a4h-icon-btn:hover {
  color: var(--text, #14141d);
  background: var(--seg-active, var(--surface, #fff));
  box-shadow: 0 1px 2px rgba(20, 20, 40, 0.12);
}

.a4h-icon-btn:focus-visible {
  outline: 2px solid var(--accent, #6c63ff);
  outline-offset: -2px;
}

.a4h-icon-btn:active { box-shadow: none; }

.a4h-icon-btn:disabled,
.a4h-icon-btn[disabled] {
  opacity: .45;
  cursor: default;
  background: transparent;
  box-shadow: none;
}

/* Löschen/Entfernen — dauerhaft rot, nicht erst beim Überfahren. Wer eine
   Fläche mit Löschen drauf sieht, soll es sofort sehen. Pro Leiste höchstens
   ein solcher Button. */
/* Die eine Hauptaktion einer Symbol-Leiste — Senden, Absenden, Starten.
   Wie beim Knopf (§6) gilt: hoechstens EINE pro sichtbarer Flaeche. Ohne diese
   Rolle bauten Flaechen sich ihren gefuellten Senden-Knopf selbst (Workspace,
   13.08.2026). */
.a4h-icon-btn.is-primary {
  background: var(--accent, #6c63ff);
  color: #fff;
}
.a4h-icon-btn.is-primary:hover { filter: brightness(1.08); background: var(--accent, #6c63ff); }
.a4h-icon-btn.is-primary:disabled { opacity: .5; cursor: default; filter: none; }

.a4h-icon-btn.is-danger { color: var(--danger, var(--err, #d64545)); }
.a4h-icon-btn.is-danger:hover {
  color: var(--danger, var(--err, #d64545));
  background: color-mix(in srgb, var(--danger, #d64545) 12%, transparent);
}

/* Starten/Ausführen — grün erst beim Überfahren, damit die Leiste im
   Ruhezustand einfarbig bleibt. */
.a4h-icon-btn.is-play:hover { color: var(--ok, #1ba398); }

/* Laufender Zustand (z.B. Automation aktiv): dauerhaft markiert. */
.a4h-icon-btn.is-active {
  color: var(--accent, #6c63ff);
  background: var(--accent-weak, rgba(108, 99, 255, 0.10));
}

/* ═══════════════════════════════════════════════════════════════════════════
   RECHTSKLICK-MENÜ der Reiter (Umbenennen / Farbe / Emoji / Zurücksetzen)
   Wird von /assets/js/brand-tabs.js erzeugt.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-ctx {
  position: fixed;
  z-index: 3000;
  min-width: 200px;
  /* Ohne Deckel wächst das Menü in die Breite, statt die Farb- und Emoji-Reihe
     umbrechen zu lassen — bei zwei Dutzend Emojis wird es sonst bildschirmbreit. */
  max-width: 268px;
  padding: 6px;
  border: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.12)));
  border-radius: var(--a4h-r-l, 12px);
  background: var(--surface-solid, var(--surface, var(--panel, #fff)));
  box-shadow: 0 10px 28px rgba(0, 0, 0, .20);
  font-family: inherit;
}

.a4h-ctx-row {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  padding: 7px 10px 9px;
  border-bottom: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.12)));
  margin-bottom: 4px;
}

.a4h-ctx-swatch {
  width: 18px;
  height: 18px;
  padding: 0;
  border: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.12)));
  border-radius: 50%;
  cursor: pointer;
  transition: transform .1s;
}
.a4h-ctx-swatch:hover { transform: scale(1.18); }
.a4h-ctx-swatch.is-none { background: var(--surface, transparent); position: relative; }
.a4h-ctx-swatch.is-none::after {
  content: '';
  position: absolute;
  left: 2px; right: 2px; top: 50%;
  height: 1.5px;
  background: var(--danger, var(--err, #d64545));
  transform: rotate(-45deg);
}

.a4h-ctx-emoji {
  width: 26px;
  height: 26px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: var(--a4h-r-s, 6px);
  background: transparent;
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
}
.a4h-ctx-emoji:hover { background: var(--accent-weak, rgba(108, 99, 255, 0.10)); }

/* „Kein Emoji" — durchgestrichenes Feld, dasselbe Zeichen wie „Farbe entfernen“. */
.a4h-ctx-emoji.is-none {
  position: relative;
  border: 1px dashed var(--border, var(--line, rgba(15, 15, 30, 0.22)));
}
.a4h-ctx-emoji.is-none::after {
  content: '';
  position: absolute;
  left: 5px; right: 5px; top: 50%;
  height: 1.5px;
  background: var(--danger, var(--err, #d64545));
  transform: rotate(-45deg);
}

.a4h-ctx-item {
  display: block;
  width: 100%;
  padding: 7px 10px;
  border: none;
  border-radius: var(--a4h-r-s, 6px);
  background: none;
  color: var(--text, #14141d);
  font-family: inherit;
  font-size: 13px;
  text-align: left;
  cursor: pointer;
}
.a4h-ctx-item:hover { background: var(--accent-weak, rgba(108, 99, 255, 0.10)); }
.a4h-ctx-item.is-danger { color: var(--danger, var(--err, #d64545)); }

/* Inline-Umbenennen: der Reiter wird selbst zum Eingabefeld, kein Popup
   (bestehendes Muster aus dem Terminplaner). */
.a4h-tab-input {
  border: none;
  background: transparent;
  color: inherit;
  font: inherit;
  outline: none;
  /* Höhe und Zeilenlage exakt wie der Reitertext. Ein <input> bringt sonst
     seine eigene, größere Zeilenhöhe mit — der Reiter wurde beim Umbenennen
     rund 12px höher und schob die ganze Leiste (und damit den Inhalt
     darunter) nach unten. */
  line-height: 1.2;
  height: 1.2em;
  padding: 0;
  margin: 0;
  box-sizing: content-box;
  vertical-align: baseline;
  /* Breite kommt aus dem Inhalt (per JS gesetzt und beim Tippen nachgeführt).
     Eine feste Breite hier schnitt den Namen ab — man sah beim Umbenennen nur
     einen Ausschnitt. */
  width: auto;
  min-width: 8ch;
  max-width: 40ch;
}

/* ═══════════════════════════════════════════════════════════════════════════
   BUTTONS  (Knöpfe mit Beschriftung)

   Vier Rollen — mehr gibt es nicht. Reine Symbol-Knöpfe fallen NICHT hierunter,
   die regelt der Abschnitt ICON-BUTTONS weiter oben.

     <button class="a4h-btn a4h-btn--primary">Speichern</button>
     <button class="a4h-btn a4h-btn--sec">Abbrechen</button>
     <button class="a4h-btn a4h-btn--danger">Löschen</button>
     <button class="a4h-btn a4h-btn--ghost">Zurück</button>

   Regeln (Begründung in BRANDING.md §6):
     - Höchstens EIN --primary und EIN --danger pro sichtbarer Fläche.
     - Einfarbig, kein Farbverlauf. Der Verlauf lebte nur in workspace.html;
       CRM, Planer und der Pilot-CTA sind einfarbig — er war der Ausreißer.
     - Kein Anheben beim Überfahren: in dichten Werkzeugleisten zappelt sonst
       die ganze Zeile. Der Knopf wird nur heller — wie der Icon-Button.
     - Kein Emoji im Button (Emojis gehören in Reiter).
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 8px 14px;
  border: 1px solid transparent;
  border-radius: 9px;
  background: transparent;
  color: var(--text, #14141d);
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transition: background .12s, border-color .12s, color .12s;
}

/* Zweite und einzige weitere Größe. Alles dazwischen wird nicht erfunden. */
.a4h-btn--sm { padding: 6px 11px; font-size: 12px; border-radius: var(--a4h-r-m, 9px); }

.a4h-btn:disabled,
.a4h-btn[aria-disabled="true"] { opacity: .5; cursor: default; }

/* Hauptsache — einfarbig in der Markenfarbe. */
.a4h-btn--primary {
  background: var(--accent, #6c63ff);
  border-color: var(--accent, #6c63ff);
  color: #fff;
}
.a4h-btn--primary:hover:not(:disabled) {
  background: color-mix(in srgb, var(--accent, #6c63ff) 86%, #fff);
  border-color: color-mix(in srgb, var(--accent, #6c63ff) 86%, #fff);
}

/* Nebensache — sichtbarer Rahmen, damit sie auf der weißen Fläche (§4) steht. */
.a4h-btn--sec {
  border-color: var(--border, var(--line, rgba(15, 15, 30, 0.18)));
  background: var(--surface, transparent);
}
.a4h-btn--sec:hover:not(:disabled) {
  border-color: color-mix(in srgb, var(--text, #14141d) 34%, transparent);
}

/* Zerstörend — dauerhaft rot, nicht erst beim Überfahren (wie .is-danger). */
.a4h-btn--danger {
  background: var(--danger, var(--err, #e5484d));
  border-color: var(--danger, var(--err, #e5484d));
  color: #fff;
}
.a4h-btn--danger:hover:not(:disabled) {
  background: color-mix(in srgb, var(--danger, #e5484d) 86%, #fff);
  border-color: color-mix(in srgb, var(--danger, #e5484d) 86%, #fff);
}

/* Leise — nur Text. Für Abbrechen/Zurück, die nichts anstoßen sollen. */
.a4h-btn--ghost {
  color: color-mix(in srgb, var(--text, #14141d) 62%, transparent);
}
.a4h-btn--ghost:hover:not(:disabled) { color: var(--text, #14141d); }

/* Eine Reihe Knöpfe steht in einer Gruppe, nicht lose nebeneinander. */
.a4h-btnrow { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* ═══════════════════════════════════════════════════════════════════════════
   SCROLL-REGELANZEIGEN  (Scrollbars)

   Global — jede Seite, die brand.css lädt, bekommt sie geschenkt. Vorher gab
   es drei Breiten (5/6/8px) und drei Thumb-Farben nebeneinander.

   Der Thumb wird aus der TEXTFARBE abgeleitet, nicht fest gesetzt — dasselbe
   Verfahren wie beim inaktiven Reiter (62 % aus --text). Dadurch stimmt er in
   hellem und dunklem Theme automatisch, ohne dass eine Seite eigene Grautöne
   definieren muss.

   Sichtbar, sobald etwas scrollt (kein Auto-Ausblenden): in Listen ist die
   Leiste oft der einzige Hinweis, dass unten noch etwas kommt.

   Ausnahme: die Reiterleiste scrollt unsichtbar — dort ist es ein Strich unter
   Text, keine Liste (Regel steht weiter oben bei den REITERN).
   ═══════════════════════════════════════════════════════════════════════════ */

*::-webkit-scrollbar { width: 8px; height: 8px; }

/* Keine graue Wanne — die Rille bleibt leer (§4 Flächen). */
*::-webkit-scrollbar-track { background: transparent; }

*::-webkit-scrollbar-thumb {
  background: color-mix(in srgb, var(--text, #14141d) 18%, transparent);
  /* a4h-ausnahme: halbe Leistenbreite (8px) — die Radien-Leiter aus §13 gilt
     fuer Bedienelemente, nicht fuer die Scroll-Leiste selbst (§7 nennt 4px). */
  border-radius: 4px;
}
*::-webkit-scrollbar-thumb:hover {
  background: color-mix(in srgb, var(--text, #14141d) 32%, transparent);
}

/* Die Ecke zwischen waagerechter und senkrechter Leiste ist sonst ein grauer
   Klotz in der Fensterecke. */
*::-webkit-scrollbar-corner { background: transparent; }

/* Firefox kennt die ::-webkit-Pseudo-Elemente nicht und braucht die
   Standard-Eigenschaften. Die dürfen aber NICHT einfach global danebenstehen:
   sobald `scrollbar-color` gesetzt ist, ignoriert Chrome ab 121 die
   ::-webkit-Regeln vollständig — die 8px oben wären wirkungslos (gemessen:
   Leistenbreite fiel auf 0). Deshalb nur dort, wo es die Pseudo-Elemente
   nicht gibt. `scrollbar-width` vererbt außerdem nicht, daher `*` und nicht
   `html` — auf `html` gesetzt blieb jede innere Liste auf `auto`. */
@supports not selector(::-webkit-scrollbar) {
  * {
    scrollbar-width: thin;
    scrollbar-color: color-mix(in srgb, var(--text, #14141d) 18%, transparent) transparent;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ÜBERSCHRIFTEN

   Vier Stufen, in px (der Workspace ist dicht; rem hängt zusätzlich am
   Nutzer-Zoom und ergab je Seite andere Größen).

     <h1 class="a4h-h1">Kundenverwaltung</h1>   ← genau EINER pro Fenster
     <h2 class="a4h-h2">Offene Vorgänge</h2>
     <h3 class="a4h-h3">Letzter Kontakt</h3>
     <div class="a4h-label">Diese Woche</div>   ← Etikett, KEINE Überschrift

   Kein Emoji in Überschriften — der Reiter darüber trägt schon eines, sonst
   steht es doppelt. Und: Steht der Titel bereits im aktiven Reiter, entfällt
   er im Inhalt (eine Sache, ein Ort).
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-h1, .a4h-h2, .a4h-h3 {
  margin: 0;
  color: var(--text, #14141d);
  font-family: inherit;
  font-weight: 700;
  line-height: 1.25;
}

.a4h-h1 { font-size: 20px; }
.a4h-h2 { font-size: 15px; }
.a4h-h3 { font-size: 13px; }

/* Etikett über einer Liste. Die 11px-„h2", die es an mehreren Stellen schon
   gab, ist in Wahrheit dies hier — sie hört auf, eine Überschrift zu sein. */
.a4h-label {
  font-size: 11px;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--text, #14141d) 55%, transparent);
}

/* ═══════════════════════════════════════════════════════════════════════════
   SUBLINES  (erklärender Zweittext)

   Genau zwei — vorher gab es acht Vokabulare für dasselbe (.description, .sub,
   .desc, .hint, .subtitle, .meta, .note, .lead).

     <h2 class="a4h-h2">Lead-Suche</h2>
     <p class="a4h-sub">Findet Firmen zu deinem Suchbegriff und legt sie als Entwurf an.</p>

     <input …>
     <div class="a4h-hint">Mehrere Adressen mit Komma trennen</div>

   Nicht: eine Subline, die die Überschrift nur umformuliert.
   Nicht: in Listenzeilen und Kacheln — dort ist der Zweittext Inhalt, kein
   Kanon-Baustein, und gehört der Seite.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Der Satz unter einer Überschrift. 62 % — dieselbe Ableitung wie der inaktive
   Reiter, dadurch sind die beiden sichtbar verwandt. Höchstens zwei Sätze. */
.a4h-sub {
  margin: 4px 0 0;
  font-size: 13px;
  line-height: 1.5;
  color: color-mix(in srgb, var(--text, #14141d) 62%, transparent);
}

/* Hilfstext an einem Feld oder Knopf — steht UNTER dem Element, nie daneben. */
.a4h-hint {
  margin-top: 4px;
  font-size: 12px;
  line-height: 1.45;
  color: color-mix(in srgb, var(--text, #14141d) 55%, transparent);
}

/* ═══════════════════════════════════════════════════════════════════════════
   TOOLTIPS

   Der Standard bleibt das native `title`. Für eine reine Beschriftung wird
   KEIN eigener Tooltip gebaut — bei Icon-Buttons ist `title` + `aria-label`
   ohnehin Pflicht.

   Dieser Baustein ist nur für den Fall, dass der Text MEHR ist als eine
   Beschriftung: eine Erklärung, eine Rechenregel, die Bedeutung eines Status.

     <span class="a4h-tip" data-a4h-tip="Summe aller offenen Deals × Wahrscheinlichkeit">Forecast</span>

   Nie `title` UND `data-a4h-tip` am selben Element — sonst zwei Blasen.
   Ein Tooltip trägt nie die einzige Information, die man zum Handeln braucht:
   auf Touch gibt es kein Überfahren.
   Text ohne Schlusspunkt, Verb voran („Löschen", nicht „Hier klicken zum …").
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-tip {
  position: relative;
  /* Zeigt an, dass hier etwas zu holen ist, ohne wie ein Link auszusehen. */
  text-decoration: underline dotted
    color-mix(in srgb, var(--text, #14141d) 35%, transparent);
  text-underline-offset: 3px;
  cursor: help;
}

.a4h-tip::after {
  content: attr(data-a4h-tip);
  position: absolute;
  bottom: calc(100% + 7px);
  /* Bündig mit der LINKEN Kante des Wortes, nicht mittig. Mittig zentriert
     ragte eine 260px-Blase über den linken Rand der Fläche hinaus, sobald das
     Wort am Anfang einer Zeile stand — sie stand dann halb außerhalb der Karte.
     Links angeschlagen wächst sie in die Leserichtung, also dorthin, wo in
     aller Regel noch Platz ist. Am rechten Rand: `is-right`. */
  left: 0;
  z-index: 90;
  width: max-content;
  max-width: 260px;
  padding: 6px 9px;
  border-radius: 6px;
  background: #1c1c26;
  color: #fff;
  font-size: 12px;
  font-weight: 500;
  line-height: 1.4;
  white-space: normal;
  text-align: left;
  text-decoration: none;
  letter-spacing: 0;
  pointer-events: none;
  opacity: 0;
  /* 300 ms Verzögerung: beim bloßen Überqueren soll nichts aufblitzen. */
  transition: opacity .12s .3s;
}

.a4h-tip:hover::after,
.a4h-tip:focus-visible::after { opacity: 1; }

/* Sitzt das Element im oberen Rand einer Fläche, kippt die Blase nach unten. */
.a4h-tip.is-below::after {
  bottom: auto;
  top: calc(100% + 7px);
}

/* Sitzt das Element am rechten Rand, schlägt die Blase rechts an, damit sie
   nach innen wächst statt aus der Fläche heraus. */
.a4h-tip.is-right::after {
  left: auto;
  right: 0;
}

/* ═══════════════════════════════════════════════════════════════════════════
   OVERLAYS UND MODALS

   Vorgefunden waren SIEBEN verschiedene Abdunklungen nebeneinander (0.32 ·
   0.38 · 0.42 · 0.45 · 0.55 · 0.6, dazu getönte Grundfarben rgba(20,20,29,…)
   und rgba(15,23,42,…)). Ein Wert genügt: --a4h-overlay = rgba(0,0,0,0.35) —
   dunkel genug, dass der Hintergrund zurücktritt, hell genug, dass man noch
   sieht, wo man herkommt. EIN Wert für helles und dunkles Theme: die
   Light-Theme-Sonderregeln im Workspace gab es nur, weil die Grundfarbe mit
   0.6 zu dunkel war.

     <div class="a4h-overlay">
       <div class="a4h-modal">
         <div class="a4h-modal-head"><h2 class="a4h-h2">Titel</h2>…</div>
         <div class="a4h-modal-body">…</div>
         <div class="a4h-modal-foot">…Knöpfe rechts…</div>
       </div>
     </div>

   Escape schließt, Klick auf die Abdunklung schließt, nie zwei Modals
   übereinander. Bewusst NICHT im Kanon: Vollflächen-Übernahmen (First-Run,
   Tour) und Ablege-Flächen fürs Hineinziehen von Dateien — die dürfen
   dunkler bzw. getönt sein, weil sie etwas anderes tun als ein Dialog.
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
  --a4h-overlay: rgba(0, 0, 0, 0.35);
  /* §20 nennt vier Vokabulare für dieselbe Farbe. Karte, Modal und Toast
     brauchen eine FLÄCHE — wer nur `var(--surface, #fff)` schreibt, malt sie
     in jeder Seite weiß, die ihre Fläche `--panel` nennt. Genau das machte am
     13.08.2026 die Karten in Code-Gen, Mail und den Onboardings weiß, mit
     hellem Text darauf. Die Kette fragt deshalb alle vier Namen ab. */
  --a4h-flaeche: var(--surface, var(--panel, var(--panel2, var(--bg3, #fff))));
}

.a4h-overlay {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--a4h-sp-4);
  background: var(--a4h-overlay);
}

.a4h-modal {
  width: 100%;
  max-width: 520px;
  max-height: 88vh;
  display: flex;
  flex-direction: column;
  border-radius: var(--a4h-r-l);
  background: var(--a4h-flaeche);
  /* Der Schatten ersetzt die Rahmenlinie — dieselbe Begründung wie §4. */
  box-shadow: 0 18px 50px rgba(10, 10, 25, 0.28);
  overflow: hidden;
}

.a4h-modal-head {
  display: flex;
  align-items: center;
  gap: var(--a4h-sp-2);
  padding: var(--a4h-sp-3) var(--a4h-sp-4);
  border-bottom: 1px solid var(--border-subtle, rgba(15, 15, 30, 0.08));
}
.a4h-modal-head .a4h-h2 { flex: 1 1 auto; min-width: 0; }

.a4h-modal-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: var(--a4h-sp-4);
}

/* Knöpfe im Fuß stehen RECHTS, die Hauptsache ganz außen — die letzte Position
   ist die, auf die die Hand zusteuert. */
.a4h-modal-foot {
  display: flex;
  justify-content: flex-end;
  gap: var(--a4h-sp-2);
  padding: var(--a4h-sp-3) var(--a4h-sp-4);
  border-top: 1px solid var(--border-subtle, rgba(15, 15, 30, 0.08));
}


/* ═══════════════════════════════════════════════════════════════════════════
   Radien- und Abstands-Leiter

   Gemessen sind heute 14 verschiedene Radien im Gebrauch (8px 220×, 6px 135×,
   10px 119×, 7px 88×, 12px 79× …). Vier Stufen genügen; alles andere ist
   Zufall aus dem Moment des Schreibens.
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
  --a4h-r-s: 6px;      /* Kleinteile INNERHALB eines Elements (Zähler, Icon-Fläche) */
  --a4h-r-m: 9px;      /* Knöpfe und Formularfelder — der Alltagswert */
  --a4h-r-l: 12px;     /* Karten, Panels, Modals */
  --a4h-r-pill: 999px; /* Pillen und Filter-Chips */

  --a4h-sp-1: 4px;
  --a4h-sp-2: 8px;
  --a4h-sp-3: 12px;
  --a4h-sp-4: 16px;
  --a4h-sp-5: 24px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   Formularfelder

   Heute drei unabhängige Basisregeln: 6px/8px-Polster mit 6px-Radius (Planer),
   10px mit 6px (Postfach), 6px/10px mit 7px (Durchlaufzeiten). Ein Feld sieht
   damit in jeder Funktion anders aus.

     <label class="a4h-field-label" for="x">Firma</label>
     <input id="x" class="a4h-field" type="text" placeholder="Muster GmbH">
     <div class="a4h-hint">Wie im Handelsregister geschrieben</div>
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-field {
  display: block;
  width: 100%;
  padding: 7px 10px;
  border: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.16)));
  /* Derselbe Radius wie der Knopf — Feld und Knopf stehen ständig nebeneinander. */
  border-radius: var(--a4h-r-m);
  background: var(--input-bg, var(--surface, transparent));
  color: var(--text, #14141d);
  font-family: inherit;
  font-size: 13px;
  line-height: 1.35;
  outline: none;
  transition: border-color .12s, background .12s;
}

/* Fokus wie beim Suchfeld: Rahmen in der Akzentfarbe, kein zusätzlicher Ring. */
.a4h-field:focus { border-color: var(--accent, #6c63ff); }
.a4h-field::placeholder { color: var(--text-faint, var(--text3, rgba(20, 20, 29, 0.40))); }
.a4h-field:disabled { opacity: .55; cursor: default; }

/* Fehlerhaftes Feld: roter Rahmen PLUS ein Satz darunter, nie nur die Farbe —
   Farbe allein ist für Rot-Grün-Blinde keine Information. */
.a4h-field.is-invalid { border-color: var(--danger, var(--err, #e5484d)); }
.a4h-hint.is-danger { color: var(--danger, var(--err, #e5484d)); }

textarea.a4h-field { min-height: 76px; resize: vertical; }

.a4h-field-label {
  display: block;
  margin-bottom: 4px;
  font-size: 12px;
  font-weight: 600;
  color: var(--text, #14141d);
}

/* ═══════════════════════════════════════════════════════════════════════════
   §2c Seitenleisten-Navigation — der Weg zwischen den Werkzeugen

   Der dritte Navigations-Baustein neben Reiter (§1, wechselt die Ansicht
   INNERHALB eines Werkzeugs) und App-Leiste (§2b, benennt das Werkzeug).
   Dieser wechselt das WERKZEUG. Bis 13.08.2026 stand er nur in workspace.html
   und war deshalb in keiner Vorgabe — ein Eintrag sah dort aus wie ein Knopf
   nach §6, war aber keiner (kein Radius-Wechsel bei Aktivierung, keine
   Knopf-Rolle, keine Konkurrenz um den Blick).

   Ein Eintrag: Symbol links, Beschriftung, optional ein Zähler rechts.
   Genau EINER ist aktiv — wie beim Reiter, nur senkrecht.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-nav { display: flex; flex-direction: column; gap: 2px; }

.a4h-nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border: 1px solid transparent;
  border-radius: var(--a4h-r-m);
  background: transparent;
  color: color-mix(in srgb, var(--text, #14141d) 72%, transparent);
  font-size: 14px;
  font-weight: 600;
  text-align: left;
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
/* Wie der Knopf (§6): nur heller, kein Anheben — sonst zappelt die Liste. */
.a4h-nav-item:hover {
  color: var(--text, #14141d);
  background: color-mix(in srgb, var(--text, #14141d) 6%, transparent);
}
/* `active` kommt aus dem Altbestand mit — dieselbe Regel wie beim Reiter (§1):
   Neubauten schreiben `is-active`, vorhandenes JS muss nicht angefasst werden. */
.a4h-nav-item.is-active,
.a4h-nav-item.active {
  color: var(--text, #14141d);
  background: color-mix(in srgb, var(--accent, #6c63ff) 14%, transparent);
}
.a4h-nav-item svg { flex: 0 0 auto; width: 18px; height: 18px; }
.a4h-nav-item .a4h-nav-count { margin-left: auto; }

/* „Neu anlegen" ist kein Werkzeug, sondern der Weg zu einem — abgesetzt durch
   den gestrichelten Umriss, dieselbe Sprache wie das Plus an der Reiterleiste. */
.a4h-nav-item.is-add {
  margin-top: var(--a4h-sp-2);
  border: 1px dashed color-mix(in srgb, var(--accent, #6c63ff) 34%, transparent);
  background: color-mix(in srgb, var(--accent, #6c63ff) 5%, transparent);
}

/* ═══════════════════════════════════════════════════════════════════════════
   §18b Gesprächsblase — was im Chat gesagt wurde

   Kein Fall für §18 (Meldung): eine Meldung sagt dem Nutzer etwas ÜBER das
   System, eine Blase gibt ein Gespräch wieder. Vier Flächen hatten sie
   nachgebaut und kamen auf vier verschiedene Formen (12px/15px im Workspace,
   12px/13px im Prod-Abgleich, 9px/13px in Inventory und Wiki), die
   Nutzer-Blase im Workspace zusätzlich mit Farbverlauf.

   Die abgeknickte Ecke zeigt, von wem die Blase kommt — links unten beim
   Gegenüber, rechts unten bei einem selbst. Das ersetzt jede Beschriftung.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-blase {
  max-width: 78%;
  padding: 10px 14px;
  border-radius: var(--a4h-r-l);
  font-size: 13px;
  line-height: 1.55;
  overflow-wrap: anywhere;
  white-space: pre-wrap;
}
/* Das Gegenüber (Agent, Assistent) — ruhige Fläche mit Rahmen wie eine Karte. */
.a4h-blase.is-fremd {
  background: var(--a4h-flaeche);
  border: 1px solid var(--border-subtle, var(--border, rgba(15, 15, 30, 0.10)));
  color: var(--text, #14141d);
  border-bottom-left-radius: var(--a4h-r-s);
}
/* Man selbst — einfarbig in der Akzentfarbe, kein Verlauf (wie §6/§18). */
.a4h-blase.is-eigen {
  background: var(--accent, #6c63ff);
  color: #fff;
  border-bottom-right-radius: var(--a4h-r-s);
}

/* ═══════════════════════════════════════════════════════════════════════════
   §2b App-Leiste — die Marken-Kopfzeile eines eigenständigen Werkzeugs

   Nicht zu verwechseln mit der Kopfzeile aus §2a: die trägt die REITER eines
   Werkzeugs, diese hier den NAMEN des Werkzeugs samt seiner Aktionen rechts.
   Fünf Flächen hatten sie bereits fast identisch nachgebaut (Inventory,
   Warranty, Durchlaufzeiten, Prod-Abgleich, Wissensgraph) — vier davon mit
   15px/600, eine mit 16px. Sie stand nur in keiner Vorgabe, deshalb driftete
   sie. Ralph, 13.08.2026: „Alles, was existiert und in der Branding-Übersicht
   nicht drin steht, soll harmonisiert oder dort eingebettet werden."

   Der Name ist bewusst KEIN a4h-h1 (§8, 20px): der Fenstertitel benennt die
   Ansicht, die App-Leiste die Anwendung — sie stehen nie in Konkurrenz.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-appbar {
  display: flex;
  align-items: center;
  gap: var(--a4h-sp-4);
  padding: 14px 24px;
  flex-shrink: 0;
  background: var(--a4h-flaeche);
  border-bottom: 1px solid var(--border-subtle, var(--border, rgba(15, 15, 30, 0.10)));
}

.a4h-appbar-titel {
  display: flex;
  align-items: center;
  gap: var(--a4h-sp-2);
  margin: 0;
  font-size: 15px;
  font-weight: 600;
  color: color-mix(in srgb, var(--text, #14141d) 78%, transparent);
  flex-shrink: 0;
}

/* Alles, was rechts in der Leiste sitzt, wandert ans Ende. */
.a4h-appbar-grow { flex: 1 1 auto; }

/* ═══════════════════════════════════════════════════════════════════════════
   Karten

   Auf der weißen Fläche (§4) braucht eine Karte einen sichtbaren Rahmen — über
   Helligkeit kann sie sich dort nicht mehr abheben. Heute existieren 73
   Karten-artige Klassennamen nebeneinander.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-card {
  border: 1px solid var(--border-subtle, var(--border, rgba(15, 15, 30, 0.10)));
  border-radius: var(--a4h-r-l);
  background: var(--a4h-flaeche);
  padding: var(--a4h-sp-3) var(--a4h-sp-4);
}

/* Kopfzeile einer Karte: Titel links, Icon-Leiste (§3) rechts. */
.a4h-card-head {
  display: flex;
  align-items: center;
  gap: var(--a4h-sp-2);
  margin-bottom: var(--a4h-sp-2);
}
.a4h-card-head .a4h-h3 { flex: 1 1 auto; min-width: 0; }

/* Anklickbare Karte hebt sich nur am Rahmen — kein Anheben, kein Schatten,
   sonst hüpft ein Raster aus zwanzig Karten beim Überfahren. */
.a4h-card.is-clickable { cursor: pointer; }
.a4h-card.is-clickable:hover {
  border-color: color-mix(in srgb, var(--accent, #6c63ff) 45%, transparent);
}

/* ═══════════════════════════════════════════════════════════════════════════
   Pillen (Status-Anzeigen)

   Eine Pille SAGT etwas („Offen", „Bezahlt") und tut nichts. Heute sieben
   verschiedene Radien für dieselbe Sache (20px, 10px, 999px, 4px, 8px, 12px,
   100px). Nicht zu verwechseln mit dem Filter-Chip weiter unten, der klickbar
   ist.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-pill {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 9px;
  border-radius: var(--a4h-r-pill);
  background: color-mix(in srgb, var(--text, #14141d) 8%, transparent);
  color: color-mix(in srgb, var(--text, #14141d) 72%, transparent);
  font-size: 11px;
  font-weight: 700;
  line-height: 1.6;
  white-space: nowrap;
}

/* Farbe nur, wenn der Zustand sie verdient — sonst ist die Liste ein Jahrmarkt. */
.a4h-pill.is-ok {
  background: color-mix(in srgb, var(--ok, #3ecf8e) 16%, transparent);
  color: color-mix(in srgb, var(--ok, #3ecf8e) 78%, var(--text, #14141d));
}
.a4h-pill.is-warn {
  background: color-mix(in srgb, var(--warn, #f0a500) 18%, transparent);
  color: color-mix(in srgb, var(--warn, #f0a500) 78%, var(--text, #14141d));
}
.a4h-pill.is-danger {
  background: color-mix(in srgb, var(--danger, #e5484d) 15%, transparent);
  color: color-mix(in srgb, var(--danger, #e5484d) 82%, var(--text, #14141d));
}
.a4h-pill.is-info {
  background: var(--accent-weak, rgba(108, 99, 255, 0.12));
  color: color-mix(in srgb, var(--accent, #6c63ff) 82%, var(--text, #14141d));
}

/* ═══════════════════════════════════════════════════════════════════════════
   Filter-Chips

   §1 verlangt für Filter ausdrücklich eine ANDERE Form als für Reiter — sonst
   sieht man dem Klick nicht an, ob er die Ansicht wechselt oder nur die Liste
   kürzt. Der Unterschied ist damit eindeutig:
     Reiter = Unterstrich, immer genau EINER aktiv, wechselt die Ansicht.
     Chip   = Umriss/Pille, MEHRERE gleichzeitig aktiv, kürzt die Liste.

   Kein Emoji, keine Nutzer-Farbe, kein Rechtsklick-Menü — das bleibt dem
   Reiter vorbehalten (§1).
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }

.a4h-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 11px;
  border: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.18)));
  border-radius: var(--a4h-r-pill);
  background: transparent;
  color: color-mix(in srgb, var(--text, #14141d) 70%, transparent);
  font-family: inherit;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.4;
  white-space: nowrap;
  cursor: pointer;
  transition: background .12s, border-color .12s, color .12s;
}
.a4h-chip:hover { color: var(--text, #14141d); }

/* Aktiv = gefüllt. Der Unterschied muss auf einen Blick lesbar sein, weil
   mehrere Chips gleichzeitig an sein können. */
.a4h-chip.is-on {
  border-color: var(--accent, #6c63ff);
  background: var(--accent, #6c63ff);
  color: #fff;
}

/* „Alle Filter zurücksetzen" steht am Ende der Reihe, nicht als Chip. */
.a4h-chips-clear {
  border: none;
  background: none;
  padding: 4px 6px;
  color: color-mix(in srgb, var(--text, #14141d) 55%, transparent);
  font: inherit;
  font-size: 12px;
  text-decoration: underline;
  cursor: pointer;
}

/* ═══════════════════════════════════════════════════════════════════════════
   Leerzustände

   26 eigene Formen im Bestand (.empty, .empty-state, .conv-empty, .mm-empty,
   .bsp-empty, .outputs-empty …). Ein leerer Zustand sagt ZWEI Dinge: was fehlt
   und was man tun kann. Steht nur „Keine Einträge" da, ist er nutzlos.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--a4h-sp-2);
  padding: var(--a4h-sp-5) var(--a4h-sp-4);
  text-align: center;
  color: color-mix(in srgb, var(--text, #14141d) 55%, transparent);
  font-size: 13px;
  line-height: 1.5;
}

/* Höchstens EIN Symbol, ruhig und groß — kein Emoji-Feuerwerk. */
.a4h-empty-icon { font-size: 22px; line-height: 1; opacity: .65; }
.a4h-empty-text { max-width: 42ch; }

/* ═══════════════════════════════════════════════════════════════════════════
   Meldungen

   Dieselbe Form für den festen Kasten in der Seite und die kurz eingeblendete
   Meldung — nur die Lage unterscheidet sich. Heute: .msg.ok/.msg.err neben
   .toast.success/.toast.error/.toast.warning.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-msg {
  /* Fliesstext, kein Flex-Container: als `display:flex` wurde jedes <b> im
     Meldungstext zu einem eigenen Flex-Element — der Hinweis im Mail-Modul
     brach dadurch Wort fuer Wort um (Befund 13.08.2026). Ein vorangestelltes
     Symbol bekommt seinen Abstand ueber .a4h-msg-icon. */
  display: block;
  padding: 9px 12px;
  border: 1px solid color-mix(in srgb, var(--text, #14141d) 14%, transparent);
  border-radius: var(--a4h-r-m);
  background: color-mix(in srgb, var(--text, #14141d) 5%, transparent);
  color: var(--text, #14141d);
  font-size: 13px;
  line-height: 1.45;
}
.a4h-msg.is-ok {
  border-color: color-mix(in srgb, var(--ok, #3ecf8e) 40%, transparent);
  background: color-mix(in srgb, var(--ok, #3ecf8e) 10%, transparent);
}
.a4h-msg.is-warn {
  border-color: color-mix(in srgb, var(--warn, #f0a500) 42%, transparent);
  background: color-mix(in srgb, var(--warn, #f0a500) 12%, transparent);
}
.a4h-msg.is-danger {
  border-color: color-mix(in srgb, var(--danger, #e5484d) 40%, transparent);
  background: color-mix(in srgb, var(--danger, #e5484d) 10%, transparent);
}

/* Kurz eingeblendet: dieselbe Form, nur fixiert. Unten RECHTS, damit sie den
   Inhalt nicht überdeckt, mit dem man gerade gearbeitet hat. */
.a4h-toast {
  position: fixed;
  right: var(--a4h-sp-4);
  bottom: var(--a4h-sp-4);
  z-index: 110;
  max-width: 380px;
  background: var(--a4h-flaeche);
  box-shadow: 0 10px 30px rgba(10, 10, 25, 0.20);
}

/* ═══════════════════════════════════════════════════════════════════════════
   LADEN  (der eine Ladekreis)

   Überall, wo etwas lädt, läuft oder verarbeitet wird, steht DERSELBE drehende
   Kreis. Wie er aussieht, steht bewusst nur an einer einzigen Stelle — hier
   liegt ausschließlich die BEWEGUNG, die Form kommt aus dem Skript:

     Web-Seiten           <script src="/assets/js/brand-spinner.js"></script>
     Operator-Fenster     desktop/renderer/ui-spinner.js  (im Installer gebündelt,
                          kann die Website-Datei nicht laden — Werte 1:1 gleich)

   Benutzung:
     window.a4hSpinner()            → 14px, für Knopf- und Textzeilen
     window.a4hSpinner(18)          → andere Größe
     window.a4hSpinner(14, true)    → ohne rechten Abstand
     window.a4hLadeZeile(text)      → zentrierte Zeile [Kreis][Text] für Panels
     <div data-a4h-lade="Lade…">    → statischer Platzhalter, wird gefüllt
     window.a4hSpinnerAlias(sel)    → zieht eine Alt-Klasse optisch auf dieselbe
                                      Form, ohne ihr Markup anzufassen

   Nie einen eigenen Kreis aus `border` + `border-top-color` bauen — das ergibt
   eine andere Form (harte Kante statt runder Bogen) und driftet in Tempo und
   Strichstärke auseinander. Genau davon gab es sechs Stück.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Bewusst der Keyframe-Name „spin" — die Ladezustands-Tests prüfen auf
   getComputedStyle(el).animationName === 'spin', und die Operator-Fenster
   benutzen denselben Namen. */
@keyframes spin { to { transform: rotate(360deg); } }

.a4h-spin { animation: spin 0.8s linear infinite; display: inline-block; }

/* Wer im System „weniger Bewegung" eingestellt hat, sieht ihn deutlich ruhiger
   — aber nicht stillstehen: ein stehender Kreis sähe aus wie ein Fehler. */
@media (prefers-reduced-motion: reduce) {
  .a4h-spin { animation-duration: 2.4s; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   Tabellen

   Kein Zebra-Streifen: bei zehn Spalten wird daraus ein Gitter, das vom Inhalt
   ablenkt. Getrennt wird durch eine Linie, Zahlen stehen rechts (nur so kann
   man Größenordnungen untereinander vergleichen).
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}

/* Der Kopf ist ein Etikett, keine Überschrift — dieselbe Optik wie a4h-label. */
.a4h-table thead th {
  padding: 6px 10px;
  border-bottom: 1px solid var(--border, rgba(15, 15, 30, 0.14));
  text-align: left;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--text, #14141d) 55%, transparent);
  white-space: nowrap;
}

.a4h-table tbody td {
  padding: 8px 10px;
  border-bottom: 1px solid var(--border-subtle, rgba(15, 15, 30, 0.07));
  vertical-align: middle;
}

.a4h-table tbody tr:hover td {
  background: color-mix(in srgb, var(--text, #14141d) 3%, transparent);
}

/* Zahlenspalten rechtsbündig und mit gleich breiten Ziffern — sonst tanzen die
   Beträge untereinander. */
.a4h-table .is-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════════════
   KOPFZEILE  (die oberste Leiste eines Werkzeugs)

   Die Reiter sahen in jeder Funktion schon gleich AUS — aber sie standen an
   verschiedenen Stellen: gemessen 0px (Planer), 10px (Wissen), 18px (CRM),
   51px (Organizer) vom oberen Rand. Beim Umschalten sprang die Zeile, und
   genau das liest man als „jedes Werkzeug sieht anders aus".

   Deshalb: EINE Kopfzeile mit fester Hoehe. Die Reiter sitzen auf ihrer
   Grundlinie, ihr Unterstrich faellt mit der Trennlinie der Kopfzeile
   zusammen — dadurch ist der aktive Reiter mit der Flaeche darunter
   verbunden statt darueber zu schweben.

     <div class="a4h-topbar">
       <div class="a4h-tabs">…Reiter…</div>
       <span class="a4h-tabs-grow"></span>
       <label class="a4h-search">…</label>
     </div>

   Wer eine zweite Zeile braucht (Filter, Unterreiter), haengt sie DARUNTER an
   — die Kopfzeile selbst bleibt einzeilig, sonst springt die Hoehe wieder.
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-topbar {
  display: flex;
  align-items: flex-end;
  gap: 12px;
  /* Kein Polster unten: der Reiter reicht bis zur Trennlinie. */
  padding: 8px 16px 0;
  /* FESTE Hoehe, nicht min-height: im Wissen dehnte ein 12px-Meta-Element die
     Zeile auf 49px, im CRM blieb sie bei 46 — die Reiter lagen dadurch 3px
     versetzt (gemessen 11.08.2026). */
  height: 46px;
  box-sizing: border-box;
  border-bottom: 1px solid var(--border, var(--line, rgba(15, 15, 30, 0.10)));
  background: var(--surface, transparent);
}

/* Der Unterstrich des aktiven Reiters liegt AUF der Trennlinie, nicht darueber. */
.a4h-topbar .a4h-tabs { margin-bottom: -1px; }

/* ALLES rechts der Reiter sitzt auf EINER Grundlinie, 8px ueber der
   Trennlinie — Suchfeld, Icon-Leisten, einzelne Knoepfe, Wrapper.
   Vorher galt der Wert nur fuer .a4h-search, jede Flaeche regelte den Rest
   selbst: gemessen am 11.08.2026 lagen im CRM Suchfeld (29), Zahnrad (31,5)
   und Konto-Knopf (34,5) auf drei verschiedenen Unterkanten, im Planer die
   Aktions-Leiste bei 42 — Soll ist ueberall 37. Der Selektor greift nur auf
   DIREKTE Kinder, damit ein Wrapper seinen Inhalt nicht ein zweites Mal
   anhebt.

   `.tabs` ist mit ausgenommen, obwohl Neubauten `.a4h-tabs` heissen: im
   Altbestand tragen Reiterleisten teils noch den alten Namen (Planer,
   Code-Gen, Mail-Stil, Inventory). Ohne die Ausnahme faellt so eine Leiste
   unter „alles rechts", bekommt 8px und loest sich sichtbar von der
   Trennlinie — genau das ist am 11.08.2026 im Planer passiert. Eine
   seitenlokale Gegenregel reicht dagegen NICHT: `.a4h-topbar > .tabs` hat
   die hoehere Spezifitaet und gewinnt. */
.a4h-topbar > *:not(.a4h-tabs):not(.tabs):not(.a4h-tabs-grow) { margin-bottom: 8px; }

/* Ein Wrapper reicht die Grundlinie an seinen Inhalt weiter. Ohne das
   richtet er seine Kinder nach eigener Regel aus (im CRM zentriert) und die
   Unterkanten streuen wieder — die Kopfzeile ist dann nur AUSSEN buendig. */
.a4h-topbar > *:not(.a4h-tabs):not(.tabs) { align-items: flex-end; }

/* ═══════════════════════════════════════════════════════════════════════════
   ZWEITE EBENE  (die Zeile unter der Kopfzeile)

   §2a verlangt: die Kopfzeile bleibt EINZEILIG. Eine zweite Reiterebene,
   Filter oder Werkzeugknoepfe haengen darunter — nie in dieselbe Zeile.
   Passiert das doch, stehen zwei Navigationen und zwei Suchfelder
   nebeneinander und die Zeile wird unlesbar (Befund im CRM, 11.08.2026).

     <div class="a4h-topbar">…oberste Reiter…</div>
     <div class="a4h-subbar">…zweite Ebene…</div>
   ═══════════════════════════════════════════════════════════════════════════ */

.a4h-subbar {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  padding: 8px 16px;
  border-bottom: 1px solid var(--border-subtle, var(--border, rgba(15, 15, 30, 0.07)));
}

/* Die zweite Ebene ist der ersten untergeordnet und zeigt das auch (§1). */
.a4h-subbar .a4h-tabs { gap: 2px; }
.a4h-subbar .a4h-tab { padding: 6px 10px; font-size: 12px; }
.a4h-subbar .a4h-tab-emoji { display: none; }
