/*
 * Gemeinsames Basis-Stylesheet fuer den internen Bereich (Abschnitt 16:
 * WCAG-2.1-Konformitaet Stufe AA).
 *
 * Maßgebliche Quelle für Regeln und Komponenten: Design-Guide v0.3 (Vault:
 * 6. Projekte/Software-Standards/Design-Guide v0.3.md). Werte ausschließlich
 * aus tokens.css, Bausteine siehe auch komponenten.css (Design-Guide v0.3,
 * Teil 1 Abschnitt 5). Bei Widerspruch zwischen Guide und Code gilt der Guide.
 *
 * Fuenfte Fassung (31.08.2026, praezisiert nach Screenshot-Vergleich):
 * Markus' Rueckmeldung war eindeutig -- die vierte Fassung (Buttons/Karten
 * nur an das alte System ANGELEHNT) sah "ganz und gar nicht identisch" aus.
 * Sein Auftrag wörtlich: "guck dir an wie das Original geschrieben ist ...
 * das komplette Design kannst du ja komplett übernehmen einfach." Deshalb
 * jetzt ein echter, buchstäblicher Import statt einer Neuinterpretation:
 *
 * - tokens.css ist 1:1 aus app.marktmitsystem.de/src/web/static/web/
 *   tokens.css kopiert (siehe webapp/static/webapp/tokens.css, vor dieser
 *   Datei im <head> verlinkt) -- selbe Farben, Schatten, Radien, Abstände,
 *   Typografie-Skala, keine eigene Annäherung mehr.
 * - Die selbstgehostete Schrift "Manrope Variable" (samt Lizenzdatei) ist
 *   1:1 aus demselben Ordner kopiert (webapp/static/webapp/fonts/).
 * - Die Namen unten (--bg, --text, --edeka-blue, --radius, --shadow-card, …)
 *   bleiben als Aliase bestehen, damit nicht jede einzelne Regel umbenannt
 *   werden musste -- sie zeigen jetzt aber direkt auf die echten Tokens
 *   (var(--color-brand-600) statt eines eigenen Hex-Werts), nicht mehr auf
 *   selbst geschätzte Werte.
 * - Button-, Karten-, Aufgaben- und Kennzahlen-Kacheln sind jetzt
 *   buchstäblich dieselbe Eigenschaftsliste wie .btn/.btn--primary/.task/
 *   .stat-card in app.css dort (siehe Kommentare an den jeweiligen Stellen
 *   unten) -- nur die Selektornamen sind andere, weil die Templates hier
 *   auf rohen HTML-Elementen statt auf .btn/.card-Klassen aufbauen.
 *
 * Bewusst NICHT übernommen (siehe Rückmeldung Markus, 31.08.2026 vorher):
 * die linke Sidebar-Navigation des alten Systems -- die Navigation oben
 * ist eine eigene, bereits getroffene UX-Entscheidung, kein Versehen.
 * Ebenso keine Funktionsänderung, nur Aufmachung.
 */

* {
  box-sizing: border-box;
}

html {
  overflow-x: hidden;
  height: 100%;
}

:root {
  /* Aliase auf die echten Design-Tokens aus tokens.css -- Namen bleiben
     bestehen, Werte kommen jetzt 1:1 aus dem alten System. */
  --bg: var(--color-surface);
  --bg-alt: var(--color-surface-alt);
  --bg-card: var(--color-surface);
  --text: var(--color-ink);
  --text-dim: var(--color-ink-muted);
  --edeka-blue: var(--color-brand-600);
  --edeka-blue-dark: var(--color-brand-700);
  --edeka-blue-tint: var(--color-brand-100);
  --border: var(--color-line);
  --border-strong: var(--color-line-strong);
  --button-bg: var(--color-surface);
  --button-bg-hover: var(--color-surface-alt);
  --button-text: var(--color-ink);
  --button-border: var(--color-line-strong);
  --button-primary-bg: var(--color-brand-600);
  --button-primary-bg-hover: var(--color-brand-700);
  --button-primary-text: #ffffff;
  --danger-bg: var(--color-danger-100);
  --danger-text: var(--color-danger-700);
  --danger-border: var(--color-danger-500);
  /* ENTSCHIEDEN 29./30.09.2026 (Markus, Design-Guide v0.3 §5.3): Achtung-
     Hinweis nutzt dasselbe Gold wie Personalakten/Uhr-Symbol statt eines
     eigenen dritten Gelbtons, Schrift Anthrazit OHNE Blaustich (kein
     --color-ink/Navy -- Markus wollte das Marken-Blau bewusst aus dem
     Warnkasten heraushalten). War bis hierher nie aus dem Komponenten-
     katalog-Entwurf in die echte Software uebertragen worden -- reiner
     Nachvollzug einer laengst getroffenen Entscheidung, keine neue. */
  --warn-bg: var(--color-gold-100);
  --warn-text: var(--color-anthrazit);
  --warn-border: var(--color-gold-700);
  /* Ergaenzt 07.09.2026 (UI-Ueberarbeitung Eintrittsvorgang-Detailseite):
     Bis hierhin gab es nur --danger- und --warn-Aliase -- .messages faerbte
     dadurch AUSNAHMSLOS jede Meldung rot, auch messages.success(). Erst
     mit diesen beiden zusaetzlichen Aliasen (dieselbe Namensform,
     dieselbe Tokens.css-Quelle) kann eine Erfolgsmeldung tatsaechlich
     gruen aussehen -- siehe .messages li.success weiter unten.
     GEFUNDEN 29.09.2026 (Nachtschicht): Dieser Kommentar enthielt an dieser
     Stelle woertlich Stern-Schraegstrich hintereinander (in "--danger- Stern
     Schraegstrich --warn-Stern"), was den Kommentar mitten im Text
     vorzeitig beendet hat -- alles bis zum naechsten Semikolon (also
     inklusive der --success-bg-Zeile selbst) wurde dadurch als eine
     einzige ungueltige CSS-Deklaration verworfen. --success-bg war seit
     dem 07.09.2026 in der echten Software immer leer/transparent, jede
     Erfolgsmeldung (.messages li.success) unsichtbar auf weissem Grund.
     Regel fuer jeden kuenftigen Kommentar in CSS-Dateien: Stern und
     Schraegstrich duerfen im Fliesstext nie direkt aufeinander folgen. */
  --success-bg: var(--color-success-100);
  --success-text: var(--color-success-700);
  --success-border: var(--color-success-500);
  --info-bg: var(--color-info-100);
  --info-text: var(--color-info-700);
  --info-border: var(--color-info-500);
  --radius: var(--radius-md);
  --shadow-card: var(--shadow-1);
  --shadow-card-hover: var(--shadow-2);
  --shadow-primary: var(--shadow-brand);
  --transition: var(--dur-2) var(--ease-standard);

  /* Zwei bewusste, lokale Abweichungen vom 1:1-Import (01.09.2026, Auftrag
     Markus) -- tokens.css bleibt dabei unveraendert (bleibt die exakte
     Kopie), nur hier ueberschrieben:
     1. Schrift: kein eigens gehostetes Manrope mehr, sondern der
        Systemschrift-Stapel -- zeigt auf Mac echtes San Francisco, auf
        Windows echtes Segoe UI, ohne eine einzige Schriftdatei
        auszuliefern. Das ist der rechtssichere Weg: Apples San Francisco
        und Microsofts Segoe UI duerfen NICHT als eigene Dateien eingebettet
        werden (beide Lizenzen sind auf die jeweils eigene Plattform
        beschraenkt) -- der Systemschrift-Stapel laedt dagegen gar keine
        Datei, er fragt nur das Betriebssystem nach seiner Standardschrift.
        Rechtlich unbedenklich, siehe Chat-Erklaerung.
     2. Radius: minimal eckiger als das Original (0.75rem -> 0.625rem bei
        Karten, Korrektur 01.09.2026 -- erster Versuch ging in die falsche
        Richtung, weicher statt eckiger). */
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display",
    "Segoe UI", system-ui, Roboto, "Helvetica Neue", Arial, sans-serif;
  --radius-lg: 0.625rem;
}

/* Footer immer am unteren Bildschirmrand statt mitten im Bild auf kurzen
   Seiten (01.09.2026, Auftrag Markus) -- klassisches Sticky-Footer-Muster:
   body ist eine Flex-Spalte ueber die volle Bildschirmhoehe, main waechst
   (flex: 1 0 auto) und schiebt footer damit zuverlaessig ans Ende, egal wie
   wenig Inhalt eine Seite hat. Bei viel Inhalt scrollt die Seite ganz normal
   weiter, der Footer bleibt dann am Seitenende (nicht am Bildschirmrand
   "kleben") -- kein position:fixed, das wuerde Inhalt dauerhaft ueberdecken. */
body {
  font-family: var(--font-sans);
  font-size: var(--text-md);
  line-height: var(--leading-normal);
  color: var(--text);
  background: var(--bg);
  margin: 0;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  min-height: 100dvh;
}

main {
  flex: 1 0 auto;
  max-width: var(--content-max, 64rem);
  margin: 0 auto;
  padding: 1.5rem 1.5rem 3rem 1.5rem;
  width: 100%;
}

/* Kopfzeile: bewusst eigenständig (kein Vorbild im alten System, das dort
   eine linke Sidebar statt einer oberen Leiste hat -- diese UX-Entscheidung
   bleibt unverändert, siehe Dateikopf). Der Verlauf und die Farbwahl sind
   seit 01.09.2026 trotzdem 1:1 aus der Sidebar des alten Systems
   uebernommen (app.css: ".app-sidebar { background: linear-gradient(180deg,
   var(--color-brand-800) 0%, var(--color-brand-900) 55%); }") -- brand-900
   ist laut tokens.css dort ausdruecklich als "tiefste Markenflaeche"
   dokumentiert, brand-800 als "Verlaufspartner". Genau das dunkelste Blau
   aus dem Logo, wie gewuenscht, statt der helleren Leitfarbe brand-600. */
header {
  background: linear-gradient(180deg, var(--color-brand-800) 0%, var(--color-brand-900) 55%);
  padding: 1rem 1.5rem;
  box-shadow: var(--shadow-2);
  /* 01.09.2026, Liquid-Glass-Umbau: explizit angehoben. Die Glaskapseln
     im Menue benutzen backdrop-filter, was wie transform/filter/isolation
     einen eigenen CSS-Stapelkontext erzwingt -- das reicht theoretisch,
     macht die Reihenfolge gegenueber <main> (ein spaeteres, aber
     unpositioniertes Geschwisterelement) in der Praxis aber uneindeutig
     genug, dass das Einstellungen-Dropdown im Test von den Dashboard-
     Kacheln darunter verdeckt wurde. Ein expliziter z-index auf dem
     <header> selbst raeumt jede Zweideutigkeit aus, unabhaengig davon, was
     innerhalb des Headers an Stapelkontexten entsteht. */
  position: relative;
  z-index: 10;
}

header > * {
  max-width: var(--content-max, 64rem);
  margin: 0 auto;
}

header p {
  margin: 0.75rem 0;
  color: var(--color-brand-200);
  font-size: var(--text-sm);
}

footer {
  flex-shrink: 0;
  color: var(--text-dim);
  font-size: var(--text-sm);
  border-top: 1px solid var(--border);
  padding: 1.25rem 1.5rem;
  background: var(--bg-alt);
}

/* Ueberschriften: identische Werte wie h1/h2/h3 in app.css (Abschnitt
   "Reset/Basis") -- Gewicht black statt bold, enge Laufweite, kein
   erzwungener Blauton (der wirkte im Vergleich zu bunt; das Original faerbt
   Ueberschriften nicht extra ein, sie tragen die normale Fliesstextfarbe). */
h1, h2, h3 {
  line-height: var(--leading-tight);
  letter-spacing: var(--tracking-tight);
  color: var(--text);
}

h1 {
  font-size: var(--text-2xl);
  font-weight: var(--weight-black);
  margin: 0 0 var(--space-4);
}

h2 {
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  margin: var(--space-6) 0 var(--space-3);
}

a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-offset);
}

header a:focus-visible,
header button:focus-visible {
  outline-color: #ffffff;
}

.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--edeka-blue);
  color: #ffffff;
  font-weight: 700;
  padding: 0.75rem 1rem;
  border-radius: 0 0 var(--radius-md) 0;
  z-index: var(--z-toast, 100);
}

.skip-link:focus {
  left: 0;
  top: 0;
}

a {
  color: var(--edeka-blue);
  text-underline-offset: 2px;
  transition: color var(--transition);
}

a:hover {
  color: var(--edeka-blue-dark);
}

/* --- Buttons ----------------------------------------------------------- */
/* 31.08.2026: buchstäblich dieselbe Eigenschaftsliste wie .btn/button in
   app.css (Abschnitt "Buttons") -- Grundform neutral/grau, Aktiv-Zustand
   staucht leicht (scale statt Verschiebung, genau wie im Original). Die
   primäre Formular-Aktion (immer type="submit") entspricht .btn--primary
   dort: gefüllte Markenfläche, Schatten, dunklerer Ton beim Hover. */
button,
input[type="submit"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  background: var(--button-bg);
  color: var(--button-text);
  border: 1px solid var(--button-border);
  border-radius: var(--radius-md);
  padding: .55rem 1.05rem;
  font: inherit;
  font-weight: var(--weight-semibold);
  cursor: pointer;
  min-height: 2.5rem;
  box-shadow: var(--shadow-1);
  transition: background-color var(--transition), border-color var(--transition),
    box-shadow var(--transition), transform var(--dur-1) var(--ease-standard);
}

button:hover,
input[type="submit"]:hover {
  background: var(--button-bg-hover);
  border-color: var(--color-ink-subtle);
}

button:active,
input[type="submit"]:active {
  transform: scale(.985);
}

button[type="submit"],
input[type="submit"] {
  background: var(--button-primary-bg);
  color: var(--button-primary-text);
  border-color: var(--edeka-blue-dark);
  font-weight: var(--weight-semibold);
  box-shadow: var(--shadow-1);
}

button[type="submit"]:hover,
input[type="submit"]:hover {
  background: var(--button-primary-bg-hover);
  color: var(--button-primary-text);
  border-color: var(--edeka-blue-dark);
  box-shadow: var(--shadow-brand);
}

.formular-aktionen a {
  display: inline-flex;
  align-items: center;
  min-height: 2.5rem;
  padding: .55rem 1.05rem;
  border: 1px solid var(--button-border);
  border-radius: var(--radius-md);
  background: var(--button-bg);
  color: var(--button-text);
  text-decoration: none;
  font-weight: var(--weight-semibold);
  box-shadow: var(--shadow-1);
  transition: background-color var(--transition), border-color var(--transition), box-shadow var(--transition);
}

.formular-aktionen a:hover {
  background: var(--button-bg-hover);
  border-color: var(--color-ink-subtle);
}

/* --- .knopf: Link, der wie ein Button aussieht -------------------------
   Kiosk-Feinschliff (Markus, 09.10.2026): "wieder Text-Links -- wir haben
   ja eindeutig einen Komponentenkatalog." Die Klasse "knopf" wurde an
   mehreren Stellen bereits VERWENDET (zeiterfassung/start.html,
   kiosk/koppeln.html, geraete/oeffentlich/*.html, kuehlkontrolle/
   oeffentlich/*.html), aber nie fuer interne Seiten definiert -- dort lud
   nichts eine passende Regel, der Link blieb reiner, unformatierter Text.
   Dieselbe Optik wie die bereits bestehende .formular-aktionen a
   (Sekundaer-Button-Look), hier aber als eigenstaendige, ueberall ladbare
   Klasse -- behebt die Luecke an jeder Stelle, an der .knopf schon stand,
   nicht nur im Kiosk-Feinschliff. */
.knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: 2.5rem;
  padding: .55rem 1.05rem;
  border: 1px solid var(--button-border);
  border-radius: var(--radius-md);
  background: var(--button-bg);
  color: var(--button-text);
  text-decoration: none;
  font-weight: var(--weight-semibold);
  box-shadow: var(--shadow-1);
  transition: background-color var(--transition), border-color var(--transition), box-shadow var(--transition);
}

.knopf:hover {
  background: var(--button-bg-hover);
  border-color: var(--color-ink-subtle);
  color: var(--button-text);
}

/* Primaer-Variante: dieselbe Markenflaeche wie button[type="submit"]. */
.knopf--primaer {
  background: var(--button-primary-bg);
  color: var(--button-primary-text);
  border-color: var(--edeka-blue-dark);
}

.knopf--primaer:hover {
  background: var(--button-primary-bg-hover);
  color: var(--button-primary-text);
  border-color: var(--edeka-blue-dark);
  box-shadow: var(--shadow-brand);
}

/* Gefahr-Variante fuer echte, destruktive Aktionen (Loeschen) -- UI-
   Feedback 07.09.2026. Selektor bewusst mit dem Attribut-Selektor
   verdoppelt (statt nur .button--gefahr), damit die Spezifitaet sicher
   ueber der bereits bestehenden button[type="submit"]-Grundfarbe liegt,
   unabhaengig von der Regel-Reihenfolge im Stylesheet. */
button[type="submit"].button--gefahr,
input[type="submit"].button--gefahr {
  background: var(--danger-bg);
  color: var(--danger-text);
  border-color: var(--danger-border);
}

button[type="submit"].button--gefahr:hover,
input[type="submit"].button--gefahr:hover {
  background: var(--danger-border);
  color: #fff;
  border-color: var(--danger-border);
}

/* Sekundaere Formular-Aktion (z. B. "Zwischenspeichern" neben "Weiter")
   -- 15.09.2026, Auftrag Markus Koopmann: die Hauptaktion soll optisch
   sofort ins Auge stechen ("generelles UX Design Element"), eine
   Nebenaktion nicht denselben Flaechenanspruch wie die primaere blaue
   Formularfarbe haben. Faellt zurueck auf dieselbe neutrale Grundfarbe wie
   ein button OHNE type="submit" weiter oben -- kein neues Farbsystem.
   Gleiches Selektor-Verdopplungsmuster wie .button--gefahr, aus demselben
   Grund (Spezifitaet sicher ueber der button[type="submit"]-Grundfarbe,
   unabhaengig von der Regel-Reihenfolge im Stylesheet). */
button[type="submit"].button--sekundaer,
input[type="submit"].button--sekundaer {
  background: var(--button-bg);
  color: var(--button-text);
  border-color: var(--button-border);
  box-shadow: none;
}

button[type="submit"].button--sekundaer:hover,
input[type="submit"].button--sekundaer:hover {
  background: var(--button-bg-hover);
  color: var(--button-text);
  border-color: var(--color-ink-subtle);
}

/* --- Klickbare Tabellenzeile ohne JavaScript ------------------------------
   UI-Feedback 07.09.2026 (Markus: "hier ist tatsächlich nur der Name
   anklickbar"). Reiner CSS-Trick statt onclick-Handler ("stretched link"):
   die Zeile bekommt position:relative als Positionierungskontext, ein
   unsichtbares ::after-Pseudoelement des Links wird per position:absolute;
   inset:0 darueber gelegt -- NICHT der Link selbst. Der Link bleibt dadurch
   ganz normal im Textfluss SEINER EIGENEN Zelle (sichtbarer Name an
   korrekter Stelle, korrekte Zeilenhoehe), nur sein unsichtbares ::after
   spannt sich unabhaengig davon ueber die gesamte Zeile auf.
   Korrektur 07.09.2026, noch am selben Abend: Die erste Fassung setzte
   position:absolute direkt auf den Link -- dessen sichtbarer Text riss
   dadurch aus seiner Spalte heraus und ueberlagerte linksbuendig die ganze
   Zeile (in der Eintrittsvorgaenge-Liste kaum aufgefallen, weil der Link
   dort zufaellig in der ersten Zelle sitzt und der Text fast spaltenbreit
   ist -- bei "Mitarbeiter" mit einer Personalnummer-Spalte davor sofort
   sichtbar als Textueberlagerung). Live auf Staging bemerkt, bevor es
   produktiv ausgerollt wurde.
   Genau EIN echter Link pro Zeile, sein Text ist der zugaengliche Name der
   ganzen Zeile fuer Screenreader -- kein zweiter, separat sichtbarer Link
   noetig. Weitere eigenstaendig klickbare Elemente in derselben Zeile
   (z. B. ein Loeschen-Button) brauchen zusaetzlich die Klasse
   "ueber-zeilen-link", sonst faengt der unsichtbare Zeilen-Link ihren Klick
   ab. */
tr.klickbare-zeile {
  position: relative;
  cursor: pointer;
}

tr.klickbare-zeile:hover {
  background: var(--bg-alt);
}

/* Korrektur 14.09.2026 (Markus, live auf mehreren Listenseiten:
   "der Text ist blau unterstrichen, sieht aus wie ein Textlink, obwohl
   die ganze Box schon zum Anklicken ist" -- .zeilen-link hatte bisher
   KEINE eigene Basis-Regel, nur ::after/:hover/:focus-visible weiter
   unten. Der <a> bekam dadurch ungestylt die Browser-Standardoptik
   (blau, unterstrichen), obwohl er als reines Stretched-Link-Element
   fuer die ganze Zeile gedacht ist, nicht als eigenstaendig erkennbarer
   Link. Systemweiter Fix -- betrifft automatisch jede Stelle, die
   .zeilen-link bereits verwendet (Mitarbeiter-, Beschaeftigungs-,
   Dokumentenliste etc.), kein Einzelfall-Patch. */
tr.klickbare-zeile .zeilen-link {
  color: inherit;
  text-decoration: none;
  font-weight: inherit;
}

tr.klickbare-zeile .zeilen-link::after {
  content: "";
  position: absolute;
  inset: 0;
}

tr.klickbare-zeile .zeilen-link:focus-visible {
  outline: 2px solid var(--edeka-blue);
  outline-offset: -2px;
}

tr.klickbare-zeile .ueber-zeilen-link {
  position: relative;
  z-index: 1;
}

.knopf-loeschen {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  border: 1px solid var(--danger-border);
  border-radius: var(--radius-md);
  background: var(--danger-bg);
  color: var(--danger-text);
  text-decoration: none;
  font-size: var(--text-lg);
  line-height: 1;
}

.knopf-loeschen:hover {
  background: var(--danger-border);
  color: #fff;
}

.kiosk button,
.kiosk input[type="submit"] {
  min-height: 56px;
  min-width: 56px;
  font-size: var(--text-lg);
}

/* Ergaenzt 03.09.2026 (Team-Review, Fund von Pia UND Nina unabhaengig):
   Checkboxen blieben am Kiosk-Touchscreen bei nativer Kleingroesse (1.25rem)
   -- die 56px-Regel oben deckt nur Buttons ab. Vergroessert die Checkbox
   selbst und macht die ganze Label-Zeile klickbar, ohne form.as_p
   anzufassen. */
.kiosk input[type="checkbox"] {
  width: 32px;
  height: 32px;
}

.kiosk form label:has(input[type="checkbox"]) {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-2) 0;
  cursor: pointer;
}

/* Ueberarbeitet 07.09.2026 (Markus' Live-Feedback: "Meilenstein abgehakt"
   erschien in Rot -- eine Bestaetigung muss aber gruen sein, Rot bleibt
   ausschliesslich Fehlern vorbehalten). Vorher hing Farbe/Rahmen fest an
   .messages selbst -- JEDE Meldung sah automatisch wie ein Fehler aus,
   unabhaengig vom tatsaechlichen Level. Django haengt jeder Meldung ueber
   {{ m.tags }} bereits die passende Stufe an (success/error/warning/info/
   debug, siehe MESSAGE_TAGS) -- die Vorlage setzt diese Klasse jetzt direkt
   auf das <li>, hier wird nur noch je Klasse eingefaerbt. */
.messages {
  list-style: none;
  padding: 0;
  margin: 0 0 var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.messages li {
  padding: var(--space-3) var(--space-4);
  border-left: .25rem solid var(--color-line-strong);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  background: var(--bg-alt);
  color: var(--text);
}

.messages li::before {
  font-weight: bold;
}

.messages li.success::before { content: "Erledigt: "; }
.messages li.error::before { content: "Fehler: "; }
.messages li.warning::before { content: "Achtung: "; }
.messages li.info::before,
.messages li.debug::before { content: "Hinweis: "; }

.messages li.success {
  border-left-color: var(--success-border);
  background: var(--success-bg);
  color: var(--success-text);
}

.messages li.error {
  border-left-color: var(--danger-border);
  background: var(--danger-bg);
  color: var(--danger-text);
}

.messages li.warning {
  border-left-color: var(--warn-border);
  background: var(--warn-bg);
  color: var(--warn-text);
}

/* Formular-Warnhinweis (22.09.2026, Austritt-Modul): gleiche Optik wie
   .messages li.warning oben, aber als eigenständiger Block innerhalb eines
   Formulars nutzbar, nicht nur als Django-messages-Eintrag. */
.formular-warnung {
  padding: var(--space-3) var(--space-4);
  margin: 0 0 var(--space-4);
  border-left: .25rem solid var(--warn-border);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  background: var(--warn-bg);
  color: var(--warn-text);
}

.messages li.info,
.messages li.debug {
  border-left-color: var(--info-border);
  background: var(--info-bg);
  color: var(--info-text);
}

.banner-testumgebung {
  background: var(--warn-bg);
  border-bottom: 1px solid var(--warn-border);
  color: var(--warn-text);
  padding: 0.6rem 1rem;
  font-weight: var(--weight-semibold);
  text-align: center;
}

/* Tuerkise Markt-mit-System-Markenfarbe statt der allgemeinen Warnfarbe --
   Markus, 16.09.2026: der Demo-Tour-Banner soll optisch zur Marketing-Demo
   passen (dort --accent:#2fd3c9, siehe "Markt mit System — Tour-Demo"). */
.banner-testumgebung--demo-tour {
  background: #2fd3c9;
  border-bottom: 1px solid #1fa89f;
  color: #04211e;
}

/* Geführter Einstieg fuer leere/neue Konten (seit 28.08.2026) -- EINE klare
   naechste Aktion statt der vollen Kachel-Wand, siehe
   webapp/services.py:compute_onboarding_hint(). Kein Vorbild im alten
   System (das kennt dieses Muster nicht), nur Tokens angeglichen. */
.einstieg {
  background: var(--bg-alt);
  border: 2px solid var(--edeka-blue);
  border-radius: var(--radius-lg);
  padding: var(--space-5) var(--space-6);
  margin: 0 0 var(--space-5);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  box-shadow: var(--shadow-1);
}

.einstieg p {
  margin: 0;
  font-weight: var(--weight-semibold);
  font-size: 1.05rem;
}

.einstieg a {
  display: inline-flex;
  align-items: center;
  min-height: 2.5rem;
  padding: .55rem 1.05rem;
  border: 2px solid var(--edeka-blue);
  border-radius: var(--radius-md);
  background: #ffffff;
  color: var(--edeka-blue);
  text-decoration: none;
  font-weight: var(--weight-bold);
  transition: background-color var(--transition), box-shadow var(--transition);
  white-space: nowrap;
}

.einstieg a:hover {
  background: var(--bg-alt);
  box-shadow: var(--shadow-brand);
}

/* Team-Runde 01.10.2026 (Pia): .einstieg--dauerhaft enthaelt seit heute nur
   noch einen einzelnen Link ("Neue Person aufnehmen", ohne separaten
   Beschreibungstext) -- die schwere .einstieg-Grundoptik (2px-Rahmen,
   Schatten, flex space-between fuer Text+Button nebeneinander) war fuer
   diesen Fall gebaut und wirkte dadurch wie der einmalige Onboarding-
   Hinweis direkt darueber, obwohl beide funktional unterschiedlich sind.
   Jetzt ein einzelner, leichterer Knopf statt einer vollen Karte. */
.einstieg--dauerhaft {
  background: transparent;
  border: none;
  border-radius: 0;
  box-shadow: none;
  padding: 0;
  display: block;
}

.einstieg--dauerhaft a {
  background: var(--edeka-blue);
  color: #ffffff;
  border-color: var(--edeka-blue);
}

.einstieg--dauerhaft a:hover {
  background: var(--color-brand-700, var(--edeka-blue));
}

/* Mitarbeiterereignisse-Hub (seit 28.08.2026) -- kein Vorbild im alten
   System, nur Tokens angeglichen (Karten-Look wie .stat-card dort). */
.ereignis-karten {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
  gap: var(--space-4);
  margin: 0 0 var(--space-5);
}

.ereignis-karte {
  display: block;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: var(--space-5);
  text-decoration: none;
  color: var(--text);
  box-shadow: var(--shadow-1);
  transition: box-shadow var(--transition), transform var(--transition), border-color var(--transition);
}

a.ereignis-karte:hover {
  border-color: var(--edeka-blue);
  box-shadow: var(--shadow-2);
  transform: translateY(-2px);
}

.ereignis-karte h2 {
  margin: 0 0 var(--space-2);
  font-size: 1.05rem;
  font-weight: var(--weight-bold);
  color: var(--edeka-blue);
}

.ereignis-karte p {
  margin: 0;
  color: var(--text-dim);
  font-size: var(--text-sm);
}

.ereignis-karte-geplant {
  opacity: 0.7;
}

.ereignis-karte-geplant h2 {
  color: var(--text-dim);
}

.ereignis-status {
  display: inline-block;
  font-size: var(--text-xs);
  font-weight: var(--weight-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  background: var(--bg-alt);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-pill);
  padding: 0.15rem 0.6rem;
  margin-left: var(--space-2);
  vertical-align: middle;
}

/* --- Badges -------------------------------------------------------------- */
/* Buchstäblich dieselbe Eigenschaftsliste wie .badge in app.css (Abschnitt
   "Badges"): Tönung + Punkt tragen die Farbe, Rahmen bleibt zurück.
   Modifier-Klasse ist direkt der Status-Slug (badge--draft, badge--
   in_progress, ...) -- keine Template-Logik noetig, der Wert kommt 1:1 aus
   OnboardingStatus. */
.badge {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: .15rem .55rem;
  border-radius: var(--radius-pill);
  font-size: var(--text-xs);
  font-weight: var(--weight-semibold);
  line-height: 1.6;
  border: 1px solid transparent;
  white-space: nowrap;
}

.badge::before {
  content: "";
  width: .4rem;
  height: .4rem;
  border-radius: 50%;
  background: currentColor;
  flex: none;
}

.badge--draft, .badge--cancelled, .badge--contact_captured {
  background: var(--color-surface-alt);
  color: var(--color-ink-muted);
  border-color: var(--color-line);
}

.badge--in_progress, .badge--contract_generation {
  background: var(--color-info-100);
  color: var(--color-info-700);
  border-color: var(--color-info-200);
}

.badge--under_review, .badge--changes_requested {
  background: var(--color-warn-100);
  color: var(--color-warn-700);
  border-color: var(--color-warn-200);
}

.badge--approved, .badge--completed, .badge--succeeded {
  background: var(--color-success-100);
  color: var(--color-success-700);
  border-color: var(--color-success-200);
}

.badge--queued {
  background: var(--color-surface-alt);
  color: var(--color-ink-muted);
  border-color: var(--color-line);
}

/* Ueberfaellige Eintrittsvorgaenge (Markus, 16.09.2026, Strategiemeeting
   Punkt 7) -- eigene, auffaellige Farbe statt der Status-Farbtoene oben,
   weil es hier NICHT um den Status selbst geht, sondern um ein separates
   Warnsignal ("hier ist laenger nichts passiert als erwartet"). */
.badge--danger {
  background: var(--danger-bg);
  color: var(--danger-text);
  border-color: var(--danger-border);
}

.badge--running {
  background: var(--color-info-100);
  color: var(--color-info-700);
  border-color: var(--color-info-200);
}

.badge--failed {
  background: var(--color-danger-100);
  color: var(--color-danger-700);
  border-color: var(--color-danger-200);
}

/* AccidentCaseStatus (deutsche Slugs, eigenes Namensschema) */
.badge--entwurf {
  background: var(--color-surface-alt);
  color: var(--color-ink-muted);
  border-color: var(--color-line);
}

.badge--eingereicht {
  background: var(--color-success-100);
  color: var(--color-success-700);
  border-color: var(--color-success-200);
}

/* Mitarbeiterkreis aus dem Pepper-Export (employees/models.py,
   PepperReferenceData) -- Phase 3, Auftrag 03.09.2026. Slug kommt ueber
   den Django-Standardfilter |slugify direkt aus dem Rohwert (z. B.
   "Aushilfen kfm" -> "aushilfen-kfm"), keine eigene Kategorisierung.
   "aushilfen-kfm" ist im echten Datenbestand vom 02.09.2026 der Wert, der
   geringfuegiger Beschaeftigung/Schueler-Aushilfen am naechsten kommt (kein
   Wert "Schueler"/"geringfuegig" im Export selbst vorhanden, siehe
   Vault-Projektnotiz) -- deshalb bewusst hervorgehoben (warn-Farbe), damit
   diese Gruppe in der Liste auf einen Blick auffaellt. Ein noch nicht
   bekannter Mitarbeiterkreis-Wert bekommt einfach keine Farbe (nur der
   neutrale .badge-Rahmen) -- kein Fehler, kein fehlender Text. */
.badge--aushilfen-kfm {
  background: var(--color-warn-100);
  color: var(--color-warn-700);
  border-color: var(--color-warn-200);
}

.badge--stundenloehner-kfm, .badge--auszubildende-kfm {
  background: var(--color-info-100);
  color: var(--color-info-700);
  border-color: var(--color-info-200);
}

.badge--angestellte, .badge--monatsloehner, .badge--leitende-angest {
  background: var(--color-surface-alt);
  color: var(--color-ink-muted);
  border-color: var(--color-line);
}

/* --- Dashboard: Aufgaben vor Kennzahlen ----------------------------------- */
/* Aufbau und Eigenschaften 1:1 aus app.css uebernommen (dort .board-section/
   .task/.stat-card, hier auf den bestehenden Kachel-Klassen von
   webapp/templates/webapp/dashboard.html nachgebaut, weil dort keine .card-
   Klassen verwendet werden). Was zu tun ist, steht oben und traegt Gewicht
   (linker Rand, Icon). Was nur eine Zahl ist, steht darunter, kleiner
   und mit einem schmalen Akzentstrich oben statt links. */

#kacheln {
  padding: 0;
  margin: 0 0 var(--space-5);
  list-style: none;
}

.kachel-abschnitt-label {
  font-size: var(--text-xs);
  font-weight: var(--weight-bold);
  letter-spacing: var(--tracking-wide);
  text-transform: uppercase;
  color: var(--color-ink-subtle);
  margin: var(--space-6) 0 var(--space-3);
}

.kachel-abschnitt-label:first-child {
  margin-top: 0;
}

/* Fund 01.10.2026 (Markus: "Aktuelles" grafisch besser aufarbeiten, Team-
   Runde mit Pia/Nina): Statt bis zu 14 einzelne "0"-Kacheln (reine
   Entwarnung, siehe DashboardTile.clear_when_zero) eine einzige, gruene
   Sammelzeile -- mit vollstaendiger Liste darunter, nichts wird versteckt.
   Bereits vorab als Entwurf gezeigt und von Markus nicht beanstandet
   (UX-Redesign-Runde-Notiz, 01.10.2026). */
/* Vierte Runde 01.10.2026 (Markus: "warum steht das da ueberhaupt, welchen
   Sinn hat es, was waere ein Element mit echtem Nutzen" -- Hinterfrage-
   alles-Schritt vor weiterer Farbkorrektur). Antwort: Die Liste einzelner
   "X ohne Handlungsbedarf"-Bereichsnamen wiederholt nur, was die
   Mengenanzeigen (Badges) im Hauptmenue ohnehin schon zeigen (kein Badge/
   Badge=0 = nichts zu tun dort) -- keine neue Information, kein Klick
   moeglich, reine Redundanz (Wertekern: "Operative Fakten haben genau
   eine massgebliche Quelle", das ist hier das Hauptmenue, nicht diese
   Box). Ersetzt durch eine einzige, schmale Bestaetigungszeile OHNE
   Aufzaehlung, und nur sichtbar, wenn "Ihre Aufgaben" wirklich leer ist
   (sonst reine Ablenkung von dem, was gerade zaehlt). Kein eigener
   Kasten mehr -- passt zum Grundsatz "Reduktion ist der Test". */
.alles-klar-minimal {
  color: var(--color-success-700);
  font-size: var(--text-sm);
  margin: 0 0 var(--space-5);
}

/* "Naechste Termine" auf "Aktuelles" (01.10.2026, Markus: Ausblick auf
   Fristen der naechsten Woche inkl. Geburtstage/Probezeitende). Reine
   Vorschau einer bereits bestehenden Berechnung (wochenuebersicht), bewusst
   schlicht -- keine eigene Kachel-Optik, keine Farbunterscheidung je Art,
   damit es nicht mit "Ihre Aufgaben" konkurriert. */
.termine-ausblick {
  list-style: none;
  padding: 0;
  margin: 0 0 var(--space-3);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.termine-ausblick li {
  display: flex;
  align-items: baseline;
  gap: var(--space-3);
  padding: var(--space-2) 0;
  border-bottom: 1px solid var(--border);
}

.termine-symbol {
  flex-shrink: 0;
  font-size: 1.1rem;
}

.termine-text {
  flex: 1;
  color: var(--text);
}

.termine-wann {
  flex-shrink: 0;
  color: var(--text-dim);
  font-size: var(--text-sm);
}

.termine-alle-link {
  display: inline-block;
  margin: 0 0 var(--space-5);
  font-weight: var(--weight-semibold);
}

.kachel-gruppe {
  display: grid;
  gap: var(--space-3);
  grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
  margin: 0 0 var(--space-2);
}

/* "Ihre Aufgaben": Eigenschaften 1:1 aus .task in app.css.
   Nachtrag 29.09.2026: Die frühere Gold/Rot-Unterscheidung (.task vs.
   .task--alert, 01.09.2026 ergaenzt) ist entfernt -- seit 27.09.2026 gilt
   verbindlich nur eine Warnfarbe (Rot), siehe
   "Regelwerk/3-Betriebsteil-Goecke.md", Abschnitt "Hinweissymbole in der
   Software". Die Zuordnung aus DashboardTile.severity (webapp/services.py)
   bleibt bestehen (steuert weiterhin, welches Symbol/.symbol--alarm
   erscheint), nur die Rahmenfarbe ist jetzt immer Rot. */
.kachel-aufgabe {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  border-left: .3rem solid var(--color-danger-500);
  padding-left: calc(var(--space-4) - .3rem);
}

/* Das frühere .kachel-aufgabe-icon (SVG als Fläche und Zeichen zugleich) ist mit
   Design-Welle 2 durch .symbol in komponenten.css ersetzt und hier entfernt. */

.kachel-aufgabe-inhalt {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: .15rem;
}

.kachel-aufgabe .kachel-wert {
  display: inline;
  font-size: var(--text-xl);
  font-weight: var(--weight-black);
  color: var(--text);
  margin-right: var(--space-2);
}

.kachel-aufgabe h2 {
  display: inline;
  text-transform: none;
  letter-spacing: normal;
  font-size: 1rem;
  font-weight: var(--weight-semibold);
  color: var(--text);
  margin: 0;
}

.kachel-aufgabe-link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  margin-top: .15rem;
  color: var(--edeka-blue);
  font-weight: var(--weight-semibold);
  font-size: var(--text-sm);
  text-decoration: none;
}

.kachel-aufgabe-link:hover {
  text-decoration: underline;
}

/* "Zahlen im Überblick": Eigenschaften 1:1 aus .stat-card in app.css,
   inklusive des schmalen Markenstreifens oben (dort ::before). */
.kachel {
  position: relative;
  overflow: hidden;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: var(--space-4);
  box-shadow: var(--shadow-1);
  transition: box-shadow var(--transition), transform var(--transition), border-color var(--transition);
}

.kachel:not(.kachel-aufgabe)::before {
  content: "";
  position: absolute;
  inset: 0 0 auto;
  height: 3px;
  background: var(--edeka-blue);
}

.kachel-handlungsbedarf:not(.kachel-aufgabe)::before {
  background: var(--color-danger-500);
}

/* Nur Kacheln mit echtem Ziel bekommen einen Hover-Effekt -- alles andere
   waere eine falsche Interaktivitaets-Andeutung (siehe DashboardTile.url
   in webapp/services.py, dort wird die Klasse gesetzt). */
.kachel-verlinkt:hover {
  border-color: var(--edeka-blue-tint);
  box-shadow: var(--shadow-2);
  transform: translateY(-2px);
}

.kachel h2 {
  margin: 0;
  font-size: var(--text-sm);
  font-weight: var(--weight-normal);
  color: var(--text-dim);
}

/* 03.09.2026, Rueckmeldung Markus: Die Organisationsauswahl-Seite
   (organizations/select_active.html) bestand bisher aus einer nackten
   <ul><li>-Liste mit <button type="submit">, ganz ohne Kachel-Klassen --
   dadurch griff nur die allgemeine button[type="submit"]-Regel weiter
   oben (satter Marken-Blau-Button je Zeile, dazu Browser-Aufzaehlungs-
   punkte). Jetzt dasselbe Kachel-Raster wie im Dashboard, nur als Button
   statt als <a>, weil die Auswahl ein POST ist. .kachel liefert bereits
   Hintergrund/Rahmen/Schatten -- hier nur die Button-eigene
   Inline-Zentrierung (button-Elementregel weiter oben) auf eine linksbuendige
   Spalte umgestellt und die Ueberschrift wieder auf normale Textgroesse
   angehoben (die .kachel h2-Regel direkt darueber ist fuer die kleine
   Bildunterschrift der Kennzahlen-Kacheln gedacht, hier ist der
   Organisationsname aber der Hauptinhalt). */
.kachel-org {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-2);
  width: 100%;
  text-align: left;
}

/* Korrektur 14.09.2026 (Markus, live: "da ist schwarze Schrift auf blauem
   Hintergrund, das funktioniert nicht -- die sollen aussehen wie der
   Freigeben-Button, ein blauer Button mit weisser Schrift"). .kachel-org
   wird als <button type="submit"> gerendert (siehe select_active.html) --
   die button[type="submit"]-Grundregel weiter oben setzt bereits einen
   satten blauen Hintergrund, die urspruengliche var(--text)/
   var(--edeka-blue)-Farbwahl hier ging von einer hellen, nicht-Button-
   Flaeche aus und ergab dadurch fast unlesbaren dunklen bzw. blauen Text
   auf blauem Grund. */
.kachel-org h2 {
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--button-primary-text);
  text-transform: none;
  letter-spacing: normal;
}

.kachel-org-link {
  color: var(--button-primary-text);
  font-weight: var(--weight-semibold);
  font-size: var(--text-sm);
}

.kachel-org:hover {
  border-color: var(--edeka-blue-tint);
  box-shadow: var(--shadow-2);
  transform: translateY(-2px);
}

/* 01.09.2026, Rueckmeldung Markus: "wenn man da drueber hovert werden bei
   uns die Symbole blau, im Original wird der komplette Button leicht
   graeulich heller" -- Ursache war genau diese Regel: das fruehere innere
   <a> in der Kachel-Ueberschrift faerbte sich beim Hover blau. Die ganze
   Kachel ist jetzt selbst ein <a> (siehe dashboard.html), das Hover-
   Feedback kommt ausschliesslich ueber .kachel-verlinkt:hover (Rahmen/
   Schatten/Anhebung) -- exakt das Muster aus dem alten Piloten
   (a.stat-card:hover in app.css dort: border-color, box-shadow, transform,
   keine Textfarbaenderung). */
a.kachel {
  display: block;
  color: inherit;
  text-decoration: none;
}

.kachel-wert {
  font-size: var(--text-2xl);
  font-weight: var(--weight-black);
  line-height: 1;
  letter-spacing: var(--tracking-tight);
  margin: 0;
  color: var(--text);
}

.nur-screenreader {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

button:disabled,
input:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}

/* --- Tabellen -------------------------------------------------------------- */
/* Eigenschaften 1:1 aus .table-wrap/table/th/td in app.css. */
table {
  border-collapse: collapse;
  width: 100%;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1);
  overflow: hidden;
}

th, td {
  border-bottom: 1px solid var(--border);
  padding: .6rem var(--space-3);
  text-align: left;
  vertical-align: middle;
}

td {
  font-variant-numeric: tabular-nums;
}

th {
  background: var(--bg-alt);
  font-weight: var(--weight-bold);
  color: var(--text-dim);
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
}

/* Korrigiert 01.10.2026 (Markus, Klarstellung): "Schraffiert" meinte die
   Optik der "Alles ohne Handlungsbedarf"-Box -- flache, getoente Flaeche
   mit duennem Rahmen, KEINE Diagonalstreifen. Die erste Fassung (echte
   repeating-linear-gradient-Streifen) war ein Missverstaendnis meinerseits
   und wird hier zurueckgenommen. Bewusst auf "thead th" beschränkt (nicht
   "th" generell): .punkte-tabelle tbody th[scope="row"] (Zeilenbeschriftung,
   weiter unten) braucht weiterhin einen transparenten Hintergrund. */
thead th {
  background: var(--color-brand-100);
  color: var(--color-brand-700);
}

tbody tr {
  transition: background-color var(--transition);
}

tbody tr:hover {
  background: var(--bg-alt);
}

tbody tr:last-child td {
  border-bottom: none;
}

/* ---------------------------------------------------------------------
   Hauptnavigation -- "Liquid Glass" (01.09.2026, freie gestalterische
   Ueberarbeitung auf ausdruecklichen Wunsch: "entscheide wirklich voellig
   designerisch frei", bewusst unter Verzicht auf alle bisherigen
   Detailvorgaben zu dieser Menueleiste). Referenz: Apples Liquid-Glass-
   Materialsystem (siehe Nina_SPEZIALWISSEN.md, Abschnitt "Referenz Liquid
   Glass") -- drei Prinzipien uebersetzt auf eine serverseitig gerenderte
   Web-Oberflaeche statt ein natives Betriebssystem:

   - Hierarchy:   Bedienelemente tragen im Ruhezustand keine eigene
                  Flaeche, Kontrast erscheint erst bei Hover/aktivem
                  Zustand -- der Inhalt bleibt im Vordergrund.
   - Harmony:     Zwei formal identische, schwebende Glaskapseln
                  (Hauptnavigation, Einstellungen) statt einer
                  durchgehenden Leiste -- Gruppierung nach Funktion.
   - Consistency: Dieselbe Materialsprache (Transluzenz, weicher
                  Schatten, obere Lichtkante) an beiden Kapseln,
                  unterschiedliche Groesse je nach Inhalt.

   Echte Glasphysik (Lichtbrechung, Bewegungsreaktion) ist im Web nicht
   sinnvoll nachbaubar -- uebersetzt in: backdrop-filter (Weichzeichnung
   des Hintergrunds durch das "Glas"), eine duenne obere Lichtkante, ein
   weicher Schlagschatten fuer den Schwebeeffekt, kontextabhaengige
   Deckkraft statt permanenter Flaeche. Mit Fallback fuer Browser ohne
   backdrop-filter-Unterstuetzung und fuer prefers-reduced-transparency --
   ohne Weichzeichner faellt die Kapsel auf eine blickdichte dunkle
   Flaeche zurueck, nie auf unlesbaren/transparenten Text. */
.nav-buehne {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
}

.nav-glas {
  position: relative;
  display: flex;
  align-items: center;
  border-radius: var(--radius-lg);
  padding: 0.3rem;
  background: rgba(255, 255, 255, .08);
  backdrop-filter: blur(20px) saturate(180%);
  -webkit-backdrop-filter: blur(20px) saturate(180%);
  border: 1px solid rgba(255, 255, 255, .16);
  box-shadow:
    0 10px 28px rgba(2, 8, 20, .38),
    inset 0 1px 0 rgba(255, 255, 255, .14);
}
/* Bewusst KEIN isolation:isolate auf der Kapsel: das erzwingt einen
   neuen Stapelkontext genau an dieser Stelle -- das darin liegende
   Einstellungen-Dropdown (.konto-menu, z-index: var(--z-dropdown))
   waere dann nur noch INNERHALB dieser Kapsel oben, nicht mehr
   gegenueber dem Seiteninhalt (<main>) dahinter, der als spaeteres
   Geschwisterelement ohne eigenen Stapelkontext sonst darueber gemalt
   wird. Beim Vorschau-Test auf Staging genau so aufgetreten: Dropdown
   oeffnete sich, wurde aber von den Dashboard-Kacheln darunter verdeckt. */
/* Bewusst KEIN overflow:hidden auf der Kapsel selbst -- das wuerde das
   aufklappende Einstellungen-Menue (.konto-menu, weit ausserhalb der
   Kapselgrenzen positioniert) unsichtbar mitabschneiden. Das Glint
   (.nav-glas::before) braucht das nicht: es ist selbst per inset:0 +
   border-radius:inherit auf die Kapselform begrenzt, unabhaengig vom
   overflow-Verhalten des Elternelements. */

/* Obere Lichtkante -- das "Glint", das eine reine Flaeche optisch von
   einem Glasmaterial unterscheidet. Rein dekorativ, deshalb ohne Inhalt
   und ausserhalb des Accessibility-Baums. */
.nav-glas::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background: linear-gradient(180deg, rgba(255, 255, 255, .18) 0%, rgba(255, 255, 255, 0) 55%);
  pointer-events: none;
}

@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .nav-glas {
    background: rgba(4, 24, 47, .82);
  }
}

@media (prefers-reduced-transparency: reduce) {
  .nav-glas {
    background: rgba(4, 24, 47, .94);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

nav ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.15rem;
  align-items: center;
}

nav li {
  margin: 0;
}

/* Icons deutlich groesser als der Text und mittig darueber (seit
   28.08.2026, Vorbild Microsoft-Store-App-Screenshot: Icon oben,
   Beschriftung klein darunter) -- Layout unveraendert uebernommen, nur
   das Material der Flaeche dahinter hat sich geaendert (siehe .nav-glas
   oben). */
nav a {
  position: relative;
  text-decoration: none;
  color: #ffffff;
  font-weight: var(--weight-medium);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  padding: 0.5rem 0.9rem;
  border-radius: var(--radius-lg);
  transition: background-color var(--transition), transform var(--transition);
}

nav a:hover {
  background: rgba(255, 255, 255, .14);
  color: #ffffff;
  transform: translateY(-1px);
}

nav a[aria-current="page"] {
  background: rgba(255, 255, 255, .20);
  color: #ffffff;
  font-weight: var(--weight-bold);
  text-decoration: none;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22);
}

nav a[aria-current="page"]:hover {
  color: #ffffff;
  transform: translateY(-1px);
}

/* Aktiver Punkt: statt eines harten Farbbalkens (bisherige Fassung) ein
   weich verlaufender Leuchtpunkt in der Markenakzentfarbe -- passt zur
   Glasoptik (Licht, das aus dem Material scheint, statt eines
   aufgemalten Strichs). Farbwert 1:1 aus --color-gold-500 (tokens.css),
   hier als rgba wiederholt, weil box-shadow keine CSS-Variable mit
   eigener Deckkraft mischen kann. */
nav a[aria-current="page"]::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -0.35rem;
  width: 1.6rem;
  height: 0.35rem;
  transform: translateX(-50%);
  border-radius: var(--radius-lg);
  background: var(--color-gold-500);
  box-shadow: 0 0 12px 2px rgba(248, 224, 0, .55);
}

.nav-icon {
  flex-shrink: 0;
}

/* Nachtrag 15.09.2026 (Markus, live: "wie auf meinem iPhone, das ist ja
   Standard" -- klassisches rotes Zaehler-Badge, siehe base.html fuer die
   JS-Logik dahinter). Absolut positioniert relativ zu "nav a"
   (position: relative bereits oben gesetzt), oben rechts am Icon. */
.nav-badge {
  position: absolute;
  top: 0.1rem;
  right: 0.3rem;
  min-width: 1.1rem;
  height: 1.1rem;
  padding: 0 0.3rem;
  border-radius: 999px;
  background: var(--color-danger-500);
  color: #ffffff;
  font-size: 0.65rem;
  font-weight: var(--weight-bold);
  line-height: 1.1rem;
  text-align: center;
  box-shadow: 0 0 0 2px var(--edeka-blue-dark);
}

.nav-label {
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  text-align: center;
  line-height: 1.2;
}

/* Platzhalter-Konvention (Nachtrag 15.09.2026): ein Menuepunkt fuer eine
   bereits angedachte, aber noch nicht fertig gebaute Funktion -- sichtbar
   und anklickbar (fuehrt zu webapp:in_vorbereitung), aber optisch klar als
   "noch nicht fertig" erkennbar. Siehe webapp/views.py,
   in_vorbereitung_view()-Docstring fuer die volle Erklaerung. */
.nav-platzhalter {
  opacity: 0.55;
}

.nav-badge--platzhalter {
  position: absolute;
  top: 0.1rem;
  right: 0.1rem;
  padding: 0 0.35rem;
  border-radius: 999px;
  background: var(--color-neutral-500, #6b7280);
  color: #ffffff;
  font-size: 0.55rem;
  font-weight: var(--weight-bold);
  line-height: 1.3rem;
  text-align: center;
  white-space: nowrap;
  box-shadow: 0 0 0 2px var(--edeka-blue-dark);
}

nav form {
  margin: 0;
}

nav button {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  padding: 0.5rem 0.9rem;
  min-height: 36px;
  box-shadow: none;
}

nav button .nav-label {
  font-size: var(--text-sm);
}

/* Konto-Menue: eigene, kleinere Glaskapsel statt Teil der Hauptleiste --
   eine Nutzhandlung (Einstellungen/Abmelden) ist etwas anderes als die
   vier Arbeitsbereiche links, das Material bleibt trotzdem identisch
   (Harmony-Prinzip). Natives <details>/<summary> statt eigenem
   JavaScript-Dropdown. */
.nav-glas--konto details {
  /* Reset gegen die generische "details"-Regel weiter unten in dieser
     Datei (fuer Aufklapp-Boxen im Seiteninhalt) -- die setzt eigenmaechtig
     einen hellen Untergrund, Rahmen, Innenabstand und eine max-width, was
     hier den Glaseffekt mit einer deckenden hellen Flaeche uebermalt
     haette. Bereits einmal genau so aufgetreten und behoben (01.09.2026,
     siehe Commit-Historie), beim Strukturumbau fuer Liquid Glass hier
     versehentlich nicht mitgenommen worden -- deshalb jetzt wieder da. */
  max-width: none;
  margin: 0;
  border: none;
  border-radius: 0;
  padding: 0;
  background: none;
}

.nav-glas--konto details summary {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  padding: 0.5rem 0.9rem;
  border-radius: var(--radius-lg);
  color: #ffffff;
  list-style: none;
  cursor: pointer;
  transition: background-color var(--transition), transform var(--transition);
}

.nav-glas--konto details summary::-webkit-details-marker {
  display: none;
}

.nav-glas--konto details summary:hover {
  background: rgba(255, 255, 255, .14);
  transform: translateY(-1px);
}

.nav-glas--konto details[open] summary {
  color: #ffffff;
  background: rgba(255, 255, 255, .20);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22);
}

.konto-menu {
  position: absolute;
  right: 0;
  top: calc(100% + 0.6rem);
  background: #ffffff;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-3);
  padding: 0.5rem;
  min-width: 12rem;
  z-index: var(--z-dropdown);
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

.konto-menu a,
.konto-menu button {
  display: block;
  width: 100%;
  text-align: left;
  padding: 0.6rem 0.75rem;
  border: none;
  border-radius: 6px;
  background: none;
  color: var(--text);
  font-weight: var(--weight-medium);
  text-decoration: none;
  min-height: auto;
  box-shadow: none;
  transform: none;
}

.konto-menu a:hover,
.konto-menu button:hover {
  background: var(--bg-alt);
  box-shadow: none;
  transform: none;
}

.konto-menu form {
  margin: 0;
}


.logo {
  height: 2.25rem;
  width: auto;
  display: block;
}

.logo-link {
  display: inline-block;
}

.logo-anonym {
  padding: 1.5rem 1.5rem 0 1.5rem;
  max-width: var(--content-max, 64rem);
  margin: 0 auto;
}

form p {
  margin: 0 0 1.1rem 0;
  max-width: 28rem;
}

form label {
  display: block;
  font-weight: var(--weight-semibold);
  margin-bottom: 0.35rem;
  color: var(--text-dim);
  font-size: var(--text-sm);
}

input[type="text"],
input[type="email"],
input[type="password"],
input[type="date"],
input[type="number"],
select,
textarea {
  font: inherit;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  background: #ffffff;
  color: var(--text);
  width: 100%;
  max-width: 100%;
  min-width: 0;
  box-sizing: border-box;
  transition: border-color var(--transition);
}

/* Ergaenzt 03.09.2026 (Fund Markus Koopmann, mobiler Test, Personal-
   fragebogen): Das native Datumsfeld ("Gewuenschtes Einstellungsdatum")
   ragte auf seinem Handy trotz width:100% teils ueber den Bildschirmrand
   hinaus -- html/body haben bewusst overflow-x:hidden (Sticky-Footer-
   Layout weiter oben), wodurch ein ueberbreites Element nicht scrollbar,
   sondern schlicht abgeschnitten/nicht erreichbar wird. min-width:0 oben
   plus die engere Innenabstand-Regel hier sollen den bekannten Effekt
   abfedern, dass mobile Browser bei sehr schmalen Bildschirmen (< 400px)
   dem nativen Datums-Steuerelement mehr Platz geben wollen, als die
   Formularspalte hergibt. Nicht auf einem echten iPhone nachgestellt --
   bei Markus bitte gegenpruefen, ob das Feld jetzt vollstaendig sichtbar
   bleibt. */
@media (max-width: 400px) {
  input[type="date"] {
    padding: 0.55rem 0.5rem;
    font-size: 0.95rem;
  }
}

input:hover,
select:hover,
textarea:hover {
  border-color: var(--text-dim);
}

input::placeholder,
textarea::placeholder {
  color: var(--text-dim);
}

textarea {
  min-height: 6rem;
}

input[type="checkbox"] {
  width: 1.25rem;
  height: 1.25rem;
  vertical-align: middle;
  accent-color: var(--edeka-blue);
}

/* Ergaenzt 03.09.2026 (Fund Markus Koopmann, Personalfragebogen-Test):
   form.as_p rendert bei einer Checkbox erst das Label als eigene
   Blockzeile, dann darunter die Checkbox samt Hilfetext -- sah
   unaufgeraeumt aus ("Ich bin unter 18 ...", darunter isoliert ein
   kleines Kaestchen mit Grautext daneben). Ohne Python/Template
   anzufassen (form.as_p bleibt unveraendert, siehe Formularkommentar in
   forms.py): Label und Checkbox in der jeweiligen <p> per Flexbox
   nebeneinander, Checkbox zuerst -- :has() wird hier im Projekt bereits
   fuer den Kiosk-Fall genutzt (siehe .kiosk form label:has(...) oben),
   selbes Prinzip auf den normalen Bewerber-Fragebogen uebertragen, wo
   Label und Checkbox NICHT ineinander verschachtelt, sondern Geschwister
   sind. */
form p:has(> input[type="checkbox"]) {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  column-gap: var(--space-3, 0.75rem);
  row-gap: 0.3rem;
}

form p:has(> input[type="checkbox"]) label {
  display: block;
  order: -1;
  flex: 1 1 auto;
  margin-bottom: 0;
  cursor: pointer;
}

form p:has(> input[type="checkbox"]) input[type="checkbox"] {
  order: -2;
  flex: 0 0 auto;
  cursor: pointer;
}

/* Der Hilfetext ("Nur bei Minijob relevant.") stand bisher als nackter
   Grautext direkt neben der Checkbox -- wirkte wie ein zweites,
   unklares Formularfeld statt einer kurzen Einordnung. Jetzt als kleiner,
   deutlich abgesetzter Hinweis-Chip in hellem Markenblau, in eigener
   Zeile unter Label/Checkbox. */
.helptext {
  display: block;
  flex-basis: 100%;
  order: 1;
  width: fit-content;
  margin-top: 0.3rem;
  padding: 0.15rem 0.65rem;
  background: var(--edeka-blue-tint);
  color: var(--edeka-blue-dark);
  border-radius: 999px;
  font-size: var(--text-xs);
  font-weight: var(--weight-semibold);
}

select {
  appearance: auto;
}

ul.errorlist {
  list-style: none;
  padding: 0.6rem 0.85rem;
  margin: 0 0 0.5rem 0;
  border-left: .25rem solid var(--danger-border);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  background: var(--danger-bg);
  color: var(--danger-text);
  max-width: 28rem;
  font-size: var(--text-sm);
}

.hinweis {
  background: var(--bg-alt);
  border: 1px solid var(--border);
  border-left: .25rem solid var(--edeka-blue);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  padding: var(--space-3) var(--space-4);
  margin: 0 0 var(--space-5);
  max-width: 32rem;
  color: var(--text-dim);
}

/* Team-Runde 30.09.2026 (Pia, Komponentenkatalog-Rollout Cluster Onboarding):
   .fehler wurde in neun oeffentlichen Formularseiten (cockpit, demo_tour,
   geraete, kuehlkontrolle, onboarding) fuer Formular-/Validierungsfehler
   verwendet, hatte aber in base.css/komponenten.css NIRGENDS eine eigene
   Regel -- jede dieser Fehlermeldungen rendert seither als unformatierter
   Text ohne jede visuelle Auszeichnung (kein Rahmen, keine Farbe), obwohl
   role="alert" gesetzt ist. Gleiche Optik wie .hinweis, aber mit der
   bereits etablierten Fehlerfarbkombination aus .messages li.error
   (helle Flaeche + dunkler Text, NICHT die volle rote Flaeche mit weisser
   Schrift -- die ist Buttons/.button--gefahr vorbehalten). */
.fehler {
  background: var(--danger-bg);
  border: 1px solid var(--danger-border);
  border-left: .25rem solid var(--danger-border);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  padding: var(--space-3) var(--space-4);
  margin: 0 0 var(--space-5);
  max-width: 32rem;
  color: var(--danger-text);
  font-weight: var(--weight-semibold);
}

/* Fortschrittsbalken fuer mehrstufige Formulare (Bewerberfragebogen,
   Abschnitt 33 der Anforderungsliste) -- 15.09.2026, Auftrag Markus
   Koopmann: der bisherige reine Text "Abschnitt X von Y" gab keine
   visuelle Orientierung. Bewusst schlank im Sinne der Marken-
   Zurueckhaltung (Nina: "Kontur statt Flaeche") -- ein duenner Streifen,
   kein dominantes Balkenelement, das die eigentliche Frage auf der Seite
   ueberstrahlt. Die Breite kommt als Inline-Style vom Template
   ({% widthratio %}), hier nur die reine Optik. */
.fortschritt {
  background: var(--edeka-blue-tint);
  border-radius: var(--radius-md);
  height: .4rem;
  overflow: hidden;
  margin: 0 0 var(--space-3);
  max-width: 32rem;
}

.fortschritt__balken {
  display: block;
  height: 100%;
  background: var(--edeka-blue);
  border-radius: var(--radius-md);
  transition: width var(--transition);
}

/* Vertragstext-Vorschau (Nachtrag 10.09.2026, siehe version_detail.html) --
   einfache, immer verfuegbare Lesbarkeit der Textfassung vor einer
   Freigabe/Zurueckweisung, ohne Word/PDF-Betrachter vorauszusetzen. */
.vertragstext-vorschau {
  background: var(--bg-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: var(--space-4);
  margin: 0 0 var(--space-5);
  max-height: 32rem;
  overflow-y: auto;
  white-space: pre-wrap;
  word-break: break-word;
  font-family: inherit;
  font-size: var(--text-sm);
  line-height: 1.6;
}

/* Formatierte Vertragsvorschau (Nachtrag 10.09.2026) -- rendert die
   tatsaechliche Word-Formatierung (Absaetze, Fettdruck, Ausrichtung,
   Tabellen) direkt auf der Seite, siehe contract_templates.docx_preview.
   Weisser "Papier"-Hintergrund bewusst abgesetzt vom sonstigen
   Seitenhintergrund, damit der Dokumentcharakter erkennbar bleibt. */
.vertragsvorschau-formatiert {
  background: #fff;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: var(--space-6);
  margin: 0 0 var(--space-5);
  max-height: 44rem;
  overflow-y: auto;
  font-size: var(--text-sm);
  line-height: 1.6;
  color: #111;
}
.vertragsvorschau-formatiert p {
  margin: 0 0 0.6em;
}
.vertragsvorschau-seitenumbruch {
  border: none;
  border-top: 1px dashed var(--border);
  margin: var(--space-5) 0;
}
.vertragsvorschau-tabelle {
  border-collapse: collapse;
  width: 100%;
  margin: 0 0 0.6em;
}
.vertragsvorschau-tabelle td {
  border: none;
  vertical-align: top;
  padding: 0 var(--space-4) 0 0;
  width: 50%;
}

/* Pixelgenaue PDF-Vorschau via Gotenberg (Nachtrag 10.09.2026, zweiter
   Schritt nach der formatierten HTML-Vorschau). Feste Hoehe mit eigenem
   Scrollbalken -- ein mehrseitiges Dokument soll die Seite nicht sprengen. */
.vertragsvorschau-pdf {
  width: 100%;
  height: 44rem;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  margin: 0 0 var(--space-5);
}

/* Nachtrag 09.09.2026 (Fall Mevlyde Neziraj, Markus' UI-Feedback zur
   Eintrittsvorgang-Beschaeftigungsseite): strukturierte Formulare mit
   Feldgruppen und kleinen "vom Bewerber ausgefuellt"-Hinweisen statt
   eines rohen {{ form.as_p }}-Dumps. */
fieldset {
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: var(--space-4) var(--space-5);
  margin: 0 0 var(--space-5);
  max-width: 34rem;
}

legend {
  padding: 0 var(--space-2);
  font-weight: 600;
  color: var(--text-dim);
}

.formular-feld {
  margin: 0 0 var(--space-4);
}

.formular-feld label {
  display: block;
  font-weight: 600;
  margin-bottom: var(--space-1);
}

.feld-hinweis {
  display: block;
  color: var(--text-dim);
  font-size: var(--text-sm);
  margin-top: var(--space-1);
}

/* Nachtrag 09.09.2026: Gehalts-Rechnung soll sich vom normalen Hinweistext
   absetzen -- Markus wollte die Zahlen "gegenrechnen" koennen, dafuer
   braucht es etwas mehr Kontrast als der sonstige graue Hinweistext. */
.feld-hinweis--rechnung {
  display: block;
  font-family: var(--font-mono, monospace);
  color: var(--text);
}


.formular-aktionen {
  display: flex;
  /* Nachtrag 15.09.2026 (eigener Fund beim visuellen Gegenpruefen des
     Bewerbungsgespraech-Gates, Abschnitt 33): Ohne flex-wrap bleiben alle
     direkten Kinder in EINER Zeile -- passt ein hoher Hinweis-Block (mehr
     als eine Zeile Text) neben ein kurzes Aktionselement wie "Vorgang
     abbrechen", zentriert align-items:center das kurze Element auf halber
     Hoehe des hohen Blocks statt es sauber darunter/danach zu platzieren.
     wrap loest das, ohne den Normalfall (kurze Buttons in einer Zeile) zu
     veraendern. */
  flex-wrap: wrap;
  gap: var(--space-4);
  align-items: center;
  margin-top: var(--space-5);
  /* Nachtrag 09.09.2026 (Markus' Live-Feedback: "Da fehlt der Platz zu dem
     darunter liegenden Bereich" -- die Angaben-der-Bewerberin-Karte lag
     direkt an der Aktionen-Leiste, weil "details" (siehe weiter unten in
     dieser Datei) margin-top:0 hat und .formular-aktionen bisher nur
     margin-top, kein margin-bottom besass. */
  margin-bottom: var(--space-5);
}

/* Team-Runde 30.09.2026 (Nina, Redesign-Auftrag "alle Seiten überarbeiten"):
   Zwei globale Verbesserungen, die auf jede Seite mit .formular-aktionen
   gleichzeitig wirken, statt sie einzeln in 245 Templates nachzuziehen.

   (1) Auf schmalen Bildschirmen (Handy) nebeneinander umbrechende Buttons
   sehen abgeschnitten/uneben aus. Gestapelt mit voller Breite ist die
   etablierte mobile Konvention. column-reverse sorgt dafür, dass die
   Primäraktion (steht per Konvention als ERSTES Element im Template,
   siehe Anleitung) UNTEN landet, wo der Daumen sie erreicht -- bewusst
   NICHT ueber CSS "order" geloest (das würde die visuelle Reihenfolge von
   der Tab-/Vorlesereihenfolge trennen, ein WCAG-2.4.3-Risiko), sondern
   allein über die Flex-Richtung.
   (2) Eine destruktive Aktion (.button--gefahr) soll nie direkt neben
   Speichern/der Primäraktion kleben (Fehlklick-Risiko) -- margin-left:auto
   schiebt sie in der Desktop-Zeile ans andere Ende. */
@media (max-width: 480px) {
  .formular-aktionen {
    flex-direction: column-reverse;
    align-items: stretch;
  }
  .formular-aktionen > a,
  .formular-aktionen > button,
  .formular-aktionen > form {
    width: 100%;
  }
  .formular-aktionen > a,
  .formular-aktionen > button {
    justify-content: center;
    text-align: center;
  }
}

.formular-aktionen > .button--gefahr,
.formular-aktionen > form:has(.button--gefahr) {
  margin-left: auto;
}

@media (max-width: 480px) {
  .formular-aktionen > .button--gefahr,
  .formular-aktionen > form:has(.button--gefahr) {
    margin-left: 0;
  }
}

/* Team-Runde 30.09.2026 (Pia+Nina): "Link neutral" aus dem visuellen
   Komponentenkatalog (Abschnitt 2) existierte bisher nur als Bild, nicht als
   CSS-Klasse. Für reine Navigation (führt woanders hin, ändert selbst nichts)
   -- Pias Präzisierung vom 14.09.2026 ("Buttons tun etwas, Links führen
   irgendwohin"): sichtbar und eindeutig klickbar, aber eine Stufe unter der
   vollen Button-Fläche von .formular-aktion--primary, damit auf einer Seite
   weiterhin nur EINE Aktion optisch dominiert. */
.link-neutral {
  color: var(--text);
  text-decoration: underline;
  text-decoration-color: var(--color-ink-subtle, var(--border-strong));
  text-underline-offset: .15em;
  font-weight: var(--weight-regular, 400);
}

.link-neutral:hover {
  text-decoration-color: var(--text);
}

/* Eigener Fund direkt danach (30.09.2026, UX-Redesign-Runde): Ohne diese
   Regel verliert .link-neutral (Spezifitaet 0,1,0) gegen die viel aeltere
   ".formular-aktionen a"-Grundregel (Spezifitaet 0,1,1, Zeile ~319) --
   genau in dem Container, fuer den die Klasse gedacht ist (Link neben
   einem echten Button). Ohne diesen Reset haette ein Link-neutral-Element
   still die volle Button-Optik bekommen, obwohl der ganze Zweck der Klasse
   ist, sich davon zu unterscheiden. */
.formular-aktionen a.link-neutral {
  display: inline;
  min-height: 0;
  padding: 0;
  border: none;
  border-radius: 0;
  background: none;
  box-shadow: none;
  font-weight: var(--weight-regular, 400);
}

.formular-aktionen a.link-neutral:hover {
  background: none;
  border-color: transparent;
}

/* Ergaenzt 04.09.2026 (UX-Korrektur Markus, Leistungsbonus-Modul): Es gibt
   in diesem Projekt keine ".btn"/".btn--primary"-Klasse -- das war eine
   falsche Annahme aus einem Vergleich mit einem ANDEREN Projekt
   (app.css, siehe Kommentar oben bei "Buttons"). Die tatsaechliche,
   bereits im ganzen Projekt genutzte Anker-als-Button-Optik ist
   ".formular-aktionen a" oben. Zwei kleine Ergaenzungen dazu, mit
   denselben Variablen wie button[type="submit"], kein neues Farbsystem:
   --inline fuer Aktionslinks MITTEN in einer Zeile (z. B. Mitarbeiter-
   Detailseite) statt als eigene Formular-Fusszeile, --primary fuer eine
   hervorgehobene Aktion ausserhalb eines echten Formularkontexts (wo also
   kein button[type="submit"] zur Verfuegung steht). */
.formular-aktionen--inline {
  display: inline-flex;
  gap: var(--space-3);
  margin-top: 0;
  vertical-align: middle;
}

/* Korrektur 14.09.2026 (Markus, live: der Vertraege-Button in der
   Mitarbeiterliste blieb trotz .formular-aktion--primary weiss/neutral
   statt blau) -- Spezifitaets-Bug, wirkt sich systemweit auf JEDE Stelle
   aus, die --primary innerhalb von .formular-aktionen verwendet (also
   praktisch ueberall): ".formular-aktionen a" (Klasse + Element, Spezifitaet
   0-1-1) uebertrumpft ".formular-aktion--primary" allein (nur Klasse,
   0-1-0) in der CSS-Kaskade, obwohl --primary spaeter im Stylesheet steht
   -- Reihenfolge entscheidet nur bei GLEICHER Spezifitaet. Fix: Spezifitaet
   von --primary ueber einen zusammengesetzten Selektor erhoehen (0-2-1),
   klar über der Basisregel, unabhaengig von der Reihenfolge im Stylesheet.

   Ergaenzung 30.09.2026 (Komponentenkatalog-Rollout, Team-Runde): derselbe
   Bug betrifft auch <button type="submit" class="formular-aktion--primary">
   -- "button[type=\"submit\"]" (Zeile ~302, Spezifitaet 0-1-1) uebertrumpft
   die blosse Klasse genauso wie zuvor "a" es tat. Betraf beim Fund bereits
   12 Seiten (u. a. das komplette verguetung-Modul), rein optisch: der Button
   sah wie ein normales "Speichern" aus statt hervorgehoben blau. Gleicher
   Fix, jetzt auch fuer button[type="submit"] ergaenzt. */
.formular-aktionen a.formular-aktion--primary,
button[type="submit"].formular-aktion--primary,
.formular-aktion--primary {
  background: var(--button-primary-bg);
  color: var(--button-primary-text);
  border-color: var(--edeka-blue-dark);
}

.formular-aktionen a.formular-aktion--primary:hover,
button[type="submit"].formular-aktion--primary:hover,
.formular-aktion--primary:hover {
  background: var(--button-primary-bg-hover);
  color: var(--button-primary-text);
  border-color: var(--edeka-blue-dark);
}

/* Ergaenzt 04.09.2026 (UX-Korrektur Markus, Grundlohnsaetze): reiner
   Farbpunkt zur visuellen Wiedererkennung neben einem Grundlohnsatz-
   Eintrag -- die Farbe selbst ist frei am Datensatz gewaehlt
   (verguetung.Grundlohnsatz.farbe), kein festes Farbsystem hier. */
.farb-badge {
  display: inline-block;
  width: 1rem;
  height: 1rem;
  border-radius: 50%;
  border: 1px solid var(--color-ink-subtle);
  vertical-align: middle;
}

/* Fuer einen Aktions-Button innerhalb einer Tabellenzeile (z. B. "Als
   eingereicht markieren") -- 1:1 aus app.css im alten System uebernommen. */
.inline-form {
  display: inline;
  margin: 0;
}

details {
  max-width: 32rem;
  margin: 0 0 var(--space-5);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: var(--space-3) var(--space-4);
  background: var(--bg-alt);
}

/* Fund 01.10.2026 (Markus, echter Klicktest, "Tickets"/"Eintrittsvorgänge"
   wirkten halbiert/schmal ohne Grund): Die 32rem-Breitenbremse oben ist fuer
   kleine Hinweis-/FAQ-Boxen gedacht, nicht fuer <details>, die eine ganze
   Tabelle einklappen (feedback/report_list.html Geraete-Meldungen,
   onboarding/case_list.html "Andere Wege, eine Person einzutragen",
   onboarding/case_detail.html). Betraf jede Stelle im Projekt mit demselben
   Muster, siehe UX-Redesign-Runde-Notiz, nicht nur die zwei gemeldeten
   Seiten. */
details:has(table) {
  max-width: none;
}

details[open] {
  padding-bottom: 0.25rem;
}

details summary {
  cursor: pointer;
  font-weight: var(--weight-semibold);
  color: var(--edeka-blue);
}

details summary:hover {
  text-decoration: underline;
}

details p {
  margin-top: var(--space-4);
}

dl {
  max-width: 32rem;
}

dt {
  color: var(--text-dim);
  font-size: var(--text-sm);
  font-weight: var(--weight-semibold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  margin-top: 0.9rem;
}

dt:first-child {
  margin-top: 0;
}

dd {
  margin: 0.15rem 0 0 0;
  font-size: 1.05rem;
}

/* --- Abschnitts-Karten: kollabierbare Kontext-Abschnitte -----------------
   (UI-Ueberarbeitung Eintrittsvorgang-Detailseite, 07.09.2026, Markus'
   Live-Feedback: die Seite wirkte "wahnsinnig ueberfordernd", weil alles
   gleichrangig als eigener <h2>-Abschnitt untereinanderstand. Bewerber-
   Angaben und Onboarding-Fortschritt sind ab jetzt <details>-Karten, die
   ihren Zustand schon im geschlossenen Zustand ueber einen Badge zeigen
   (gruen = vollstaendig/kein Handlungsbedarf, rot = braucht noch etwas) --
   nur wer wirklich nachsehen will, klappt sie auf. Das eigentlich zu
   erledigende dieses Schritts (Vertragsvorschau, Aktionen) bleibt bewusst
   AUSSERHALB dieser Karten, immer offen sichtbar. Der allgemeine
   details-Rahmen weiter oben ist mit max-width:32rem fuer kurze Texte
   gedacht -- hier drin stehen Tabellen, deshalb aufgehoben. */
details.abschnitt-karte {
  max-width: none;
  border-left-width: .3rem;
}

details.abschnitt-karte summary {
  display: list-item;
}

details.abschnitt-karte summary .badge {
  margin-left: var(--space-2);
}

details.abschnitt-karte table,
details.abschnitt-karte .vertragsvorschau-liste {
  margin-top: var(--space-4);
}

details.abschnitt-karte--vollstaendig {
  border-left-color: var(--success-border);
}

details.abschnitt-karte--offen {
  border-left-color: var(--danger-border);
}

.badge--vollstaendig {
  background: var(--success-bg);
  color: var(--success-text);
  border-color: var(--success-border);
}

.badge--unvollstaendig {
  background: var(--danger-bg);
  color: var(--danger-text);
  border-color: var(--danger-border);
}

/* --- Vertragsvorschau: Definitionsliste statt Tabelle ---------------------
   Bewusst kein <table> (wie bisher bei "Interne Beschaeftigungsdaten") --
   eine zweispaltige dl liest sich fuer 10-13 einzelne Werte ruhiger, siehe
   Reduktionsgrundsatz aus dem Regelwerk. Eine Zeile, die vom Bewerberwunsch
   abweicht, bekommt eine dezente Warnfarbe statt Rot -- eine Abweichung ist
   hier kein Fehler, nur ein Hinweis zum Gegenlesen. */
.vertragsvorschau-liste {
  max-width: 40rem;
  display: grid;
  grid-template-columns: minmax(10rem, 14rem) 1fr;
  row-gap: var(--space-2);
  column-gap: var(--space-4);
}

.vertragsvorschau-zeile {
  display: contents;
}

.vertragsvorschau-zeile dt,
.vertragsvorschau-zeile dd {
  margin: 0;
  padding: var(--space-2) 0;
  border-bottom: 1px solid var(--border);
}

.vertragsvorschau-zeile dt {
  color: var(--text-dim);
  font-size: var(--text-sm);
  font-weight: var(--weight-semibold);
}

.vertragsvorschau-zeile--abweichend dd {
  color: var(--warn-text);
}

/* --- Fortschrittsbalken: nativer <progress>, gruen eingefaerbt ----------- */
.fortschrittsbalken {
  width: 100%;
  max-width: 24rem;
  height: .6rem;
  border-radius: var(--radius-pill);
  accent-color: var(--success-border);
  vertical-align: middle;
}

.fortschrittsbalken::-webkit-progress-bar {
  background: var(--color-surface-alt);
  border-radius: var(--radius-pill);
}

.fortschrittsbalken::-webkit-progress-value {
  background: var(--success-border);
  border-radius: var(--radius-pill);
}

.zeile-auffaellig {
  background: var(--danger-bg);
  color: var(--danger-text);
}

/* --- Feedback-Schwebeknopf (Abschnitt 21) ---------------------------------
   Auf jeder angemeldeten Seite sichtbar (base.html rendert ihn nur
   innerhalb des is_authenticated-Blocks, damit er im oeffentlichen
   Bewerber-Fragebogen nie auftaucht). Bewusst dezent (kein grelles Rot/Gelb
   fuer 'Fehler melden') -- ein Dauerelement auf jeder Seite darf nicht um
   Aufmerksamkeit konkurrieren, siehe 'Funktion vor Dekoration' in
   Nina_SPEZIALWISSEN.md. */
.feedback-schwebeknopf {
  position: fixed;
  right: 1.25rem;
  bottom: 1.25rem;
  z-index: 30;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.65rem 1rem;
  border-radius: var(--radius-pill);
  background: var(--bg-card);
  color: var(--text);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-3);
  text-decoration: none;
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  transition: transform var(--transition), box-shadow var(--transition);
}

.feedback-schwebeknopf:hover {
  transform: translateY(-2px);
  box-shadow: 0 16px 32px rgba(4, 24, 47, .18);
  color: var(--text);
}

.feedback-schwebeknopf svg {
  color: var(--edeka-blue);
  flex-shrink: 0;
}

/* Ticketsystem-Konzept (03.09.2026), Abschnitt 5: ueberfaellige, noch
   offene Feedback-/Ticket-Zeilen optisch hervorheben -- dieselben
   Farbvariablen wie .messages weiter oben, hier auf Tabellenzeilen
   angewendet statt auf eine Meldungsliste. */
tr.zeile-ueberfaellig td {
  background: var(--danger-bg);
  color: var(--danger-text);
}

.zeile-ueberfaellig-hinweis {
  font-weight: bold;
}

/* Ergaenzt 13.09.2026 (Markus: Mitarbeiterliste als zwei Reiter statt
   einer ungetrennten Liste, Fall Mitarbeiter/Beschaeftigungsverhaeltnisse). */
.reiter {
  display: flex;
  gap: var(--space-3);
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--space-4);
}

.reiter a {
  padding: var(--space-2) var(--space-3);
  text-decoration: none;
  color: var(--text-dim);
  border-bottom: 2px solid transparent;
}

.reiter a.reiter--aktiv {
  color: var(--edeka-blue-dark);
  border-bottom-color: var(--edeka-blue);
  font-weight: 600;
}

/* Leistungspunkte (18.09.2026): Budget-Ampel, breite Punktetabelle, Druckansicht. */
.ampel {
  display: inline-block;
  padding: var(--space-1) var(--space-3);
  border-radius: var(--radius);
  font-weight: 600;
  border: 1px solid transparent;
}

.ampel--gruen { background: var(--success-bg); color: var(--success-text); border-color: var(--success-border); }
.ampel--gelb { background: var(--warn-bg); color: var(--warn-text); border-color: var(--warn-border); }
.ampel--rot { background: var(--danger-bg); color: var(--danger-text); border-color: var(--danger-border); }

/* .tabelle-scroll: seit 30.09.2026 einzig in komponenten.css definiert (das war
   schon vorher die wirksame Quelle, da komponenten.css NACH base.css geladen wird --
   margin-bottom stand hier zusaetzlich, komponenten.css hatte es nicht, jetzt dort
   nachgezogen. Operative Fakten haben eine massgebliche Quelle, siehe Wertekern). */

.punkte-tabelle input[type="number"] {
  width: 4.5em;
}

.punkte-tabelle input[type="text"] {
  width: 14em;
}

.punkte-tabelle .summe {
  font-weight: 600;
}

.punkte-tabelle .zahl {
  text-align: right;
  white-space: nowrap;
}

@media print {
  .nav-buehne,
  .skip-link,
  .feedback-schwebeknopf,
  .banner-testumgebung,
  .formular-aktionen,
  .nicht-drucken {
    display: none !important;
  }

  .tabelle-scroll {
    overflow: visible;
  }

  body {
    background: #ffffff;
  }
}

/* Leistungspunkte: breite Tabellen dürfen die schmale Inhaltsspalte verlassen. */
.punkte-tabelle {
  min-width: 100%;
}

.tabelle-scroll:has(.punkte-tabelle--breit) {
  position: relative;
  left: 50%;
  transform: translateX(-50%);
  width: min(96vw, 1500px);
}

.punkte-tabelle thead th {
  white-space: normal;
  vertical-align: bottom;
  min-width: 6.5em;
}

.punkte-tabelle tbody th[scope="row"] {
  text-transform: none;
  letter-spacing: normal;
  font-size: inherit;
  font-weight: 500;
  background: transparent;
  border-left: 0;
  white-space: nowrap;
}

@media print {
  .tabelle-scroll:has(.punkte-tabelle--breit) {
    position: static;
    transform: none;
    width: auto;
  }
}

.punkte-tabelle thead th small {
  font-weight: 400;
  text-transform: none;
  letter-spacing: normal;
}

.punkte-tabelle--breit thead th {
  width: 9.5em;
  min-width: 0;
  overflow-wrap: normal;
}

.punkte-tabelle--breit thead th:first-child {
  width: 11em;
}

.punkte-tabelle--breit input[type="text"] {
  width: 10em;
}

.punkte-tabelle thead th.zahl {
  white-space: normal;
}


/* Fehlerübersicht über einem Formular (Bewerber-Fragebogen): gut sichtbar, mit Sprungmarken. */
.fehler-uebersicht {
  background: var(--danger-bg);
  color: var(--danger-text);
  border: 1px solid var(--danger-border);
  border-radius: var(--radius);
  padding: var(--space-3) var(--space-4);
  margin: var(--space-4) 0;
}

.fehler-uebersicht:focus {
  outline: 3px solid var(--danger-border);
  outline-offset: 2px;
}

.fehler-uebersicht a {
  color: inherit;
  font-weight: 600;
}

/* Hauptpunkt Team (28.09.2026): Die Personalakte sieht aus wie ein Ordner, damit man sie
   auf einen Blick von einem Ereignis unterscheidet. Laschen-Form oben links, Gold als Rand. */
.ereignis-karte--ordner {
  position: relative;
  margin-top: var(--space-3);
  border-color: var(--color-gold-700, #8a6d00);
  border-top-left-radius: 0;
  background: var(--color-gold-100, #fff8cc);
}

.ereignis-karte--ordner::before {
  content: "";
  position: absolute;
  left: -1px;
  top: calc(-1 * var(--space-3));
  width: 5rem;
  height: var(--space-3);
  background: var(--color-gold-100, #fff8cc);
  border: 1px solid var(--color-gold-700, #8a6d00);
  border-bottom: 0;
  border-radius: var(--radius-lg, 8px) var(--radius-lg, 8px) 0 0;
}

.ordner-symbol {
  display: block;
  font-size: 1.6rem;
  line-height: 1;
  margin-bottom: var(--space-2);
}

/* Fund 01.10.2026 (Markus, echter Klicktest): Der Komponentenkatalog
   (Design-Welle-1/Komponentenkatalog, Abschnitt 4b "Ordner-Familie") zeigt
   fuer jede Team-Kategorie-Kachel eine eigene Farbe + ein eigenes Symbol --
   bisher war das ausschliesslich fuer "Personalakten" umgesetzt
   (.ereignis-karte--ordner oben), "Mitarbeiterereignisse", "Stempeluhr" und
   "Lernpfade" blieben plain-weiss ohne Icon. .kachel-symbol ist das
   generische Gegenstueck zu .ordner-symbol (gleiche Groesse), ohne die
   Ordner-spezifische Lasche (::before oben) -- die bleibt bewusst nur dem
   "Ordner" vorbehalten (Markus: "Ordner-Optik, damit man sie von einem
   Ereignis unterscheidet"). Rot ist bewusst NICHT dabei: Betriebsteil-
   Regelwerk reserviert Rot fuer echte Warnungen, nicht fuer normale
   Navigationskacheln. */
.kachel-symbol {
  display: block;
  font-size: 1.6rem;
  line-height: 1;
  margin-bottom: var(--space-2);
}

.ereignis-karte--blau {
  border-color: var(--color-brand-300);
  background: var(--color-brand-100);
}

.ereignis-karte--blau h2 {
  color: var(--color-brand-700);
}

.ereignis-karte--gruen {
  border-color: var(--color-success-200);
  background: var(--color-success-100);
}

/* Fund direkt beim Klicktest (01.10.2026): "Buchhaltung"/"Tresorbuch"
   (farbe="gold") blieben weiss, weil nur --blau/--gruen/--grau definiert
   waren -- das "gold" aus navigation.py traf ins Leere. Bewusst eine
   eigene, einfache Variante statt --ordner wiederzuverwenden: --ordner hat
   die spezielle Lasche oben (::before), die laut Markus exklusiv dem
   echten "Ordner" (Personalakten) vorbehalten bleibt. */
.ereignis-karte--gold {
  border-color: var(--color-gold-600, #d8be00);
  background: var(--color-gold-100);
}

.ereignis-karte--gold h2 {
  color: var(--color-gold-700);
}

/* Ergaenzt 01.10.2026 (Markus, ausdruecklich erlaubt: "lila orange tuerkis
   ... gedeckte Form"), damit nicht erneut Kacheln ohne Farbe bleiben
   muessen, nur weil die 4 Grundfarben fuer eine Gruppe nicht reichen. */
.ereignis-karte--violet {
  border-color: var(--color-violet-700);
  background: var(--color-violet-100);
}

.ereignis-karte--violet h2 {
  color: var(--color-violet-700);
}

.ereignis-karte--orange {
  border-color: var(--color-orange-700);
  background: var(--color-orange-100);
}

.ereignis-karte--orange h2 {
  color: var(--color-orange-700);
}

.ereignis-karte--tuerkis {
  border-color: var(--color-tuerkis-700);
  background: var(--color-tuerkis-100);
}

.ereignis-karte--tuerkis h2 {
  color: var(--color-tuerkis-700);
}

.ereignis-karte--gruen h2 {
  color: var(--color-success-700);
}

.ereignis-karte--grau {
  border-color: var(--border-strong);
  background: var(--color-surface-alt);
}

.ereignis-karte--grau h2 {
  color: var(--text-dim);
}

/* Reinigungsmittel (28.09.2026): Einsatzbereiche als grosse Kacheln zum Antippen (mindestens 44 px). */
#id_bereiche {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: var(--space-2);
}

#id_bereiche > div > label {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  min-height: 44px;
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg, 8px);
  background: var(--bg-card);
  cursor: pointer;
}

#id_bereiche input[type="checkbox"] {
  width: 1.4rem;
  height: 1.4rem;
  flex: none;
}
