/* =============================================================================
   EmKater WWS - Oberflaeche
   Bewusst dicht gesetzt: die Anwender arbeiten mit Barcodescanner und
   Tastatur an langen Listen, nicht mit der Maus an Kacheln.

   Farben laufen ausschliesslich ueber die Merkmale (Custom Properties) unten.
   Es gibt genau zwei Saetze: Hellthema und Dunkelthema.

     - ohne Zutun:            Hellthema
     - Systemeinstellung:     @media (prefers-color-scheme: dark)
     - Handauswahl gewinnt:   <html data-theme="light"> bzw. "dark"
                              (setzt public/assets/theme.js)

   Der Dunkelsatz steht zweimal im Quelltext (einmal fuer die Handauswahl,
   einmal fuer die Systemeinstellung). Beide Bloecke muessen gleich sein -
   `php bin/kontrast-pruefung.php` prueft das mit und rechnet zusaetzlich
   alle Vordergrund-/Hintergrundpaare nach WCAG durch.
   ============================================================================= */

/* --- Hellthema (Vorgabe) --------------------------------------------------- */

:root {
  color-scheme: light;

  /* Marke und Signale */
  --gruen:        #5a9c00;   /* Markenflaeche, immer mit --auf-gruen beschriftet */
  --gruen-dunkel: #3f6d00;   /* dunkles Gruen fuer Rahmen, Punkte UND Schrift */
  --gruen-hover:  #529000;   /* Hoverflaeche der Primaertaste, traegt --auf-gruen */
  --gruen-text:   #3f6d00;   /* gruene Schrift und Symbole */
  --auf-gruen:    #10190a;   /* Schrift auf gruener Flaeche */
  --rot:          #c0392b;
  --rot-text:     #b02a1c;
  --auf-rot:      #ffffff;
  --gelb:         #c07a00;
  --gelb-text:    #8a5200;
  --auf-gelb:     #1e1400;
  --blau:         #2a6ebb;
  --blau-text:    #1f5fa8;
  --auf-blau:     #ffffff;

  /* Schrift */
  --schrift:      #1b1d1a;
  --schrift-hell: #5b6157;   /* Hilfs- und Nebentexte */

  /* Flaechen */
  --flaeche:       #ffffff;   /* Karten, Tabellenkoerper, Eingaben */
  --flaeche-alt:   #eff3e9;   /* Seitengrund, Nur-Lesen-Felder, flache Reiter */
  --flaeche-hover: #e2e9d6;   /* Zeilen- und Tastenhover */
  --zebra:         #f3f7ec;   /* jede zweite Tabellenzeile */
  --tabellenkopf:  #eaefe1;

  /* Linien */
  --linie:       #dfe3d9;   /* schmueckende Trennung */
  --linie-hell:  #ecefe7;
  --linie-stark: #848c7d;   /* Rahmen von Bedienelementen, mind. 3:1 */

  /* Eingabefelder */
  --feld-flaeche:        #ffffff;
  --platzhalter:         #6c7367;
  --deaktiviert-flaeche: #eceee8;
  --deaktiviert-schrift: #5b6157;
  --fokus:               #2f6a00;   /* Fokusrahmen bei Tastaturbedienung */

  /* Kopfzeile (in beiden Themen dunkel) */
  --kopf:               #1b1d1a;
  --kopf-schrift:       #f4f6f1;
  --kopf-schrift-leise: #b8c0b1;
  --kopf-feld:          #2a2e27;
  --kopf-feld-rand:     #767f6f;
  --kopf-platzhalter:   #a8b1a1;
  --kopf-hover:         #33382f;

  /* Meldungen */
  --erfolg-flaeche:  #edf6e0;
  --erfolg-schrift:  #2c5200;
  --hinweis-flaeche: #e6eff9;
  --hinweis-schrift: #14487f;
  --fehler-flaeche:  #fbeae8;
  --fehler-schrift:  #96241a;

  /* Trefferhervorhebung */
  --mark-flaeche: #ffe680;
  --mark-schrift: #33290a;
  --mark-rand:    #b07f00;   /* Unterstrich, damit der Treffer nicht nur farbig ist */

  /* --- Abstandsleiter -------------------------------------------------------
     Sieben Stufen, sonst nichts. Wer einen Abstand braucht, nimmt die
     naechstliegende Stufe und erfindet keinen Zwischenwert. Begruendung und
     Zuordnung stehen in docs/GESTALTUNG.md.

       0   2px   Haaransatz: Zeile unter Zeile im selben Block
       1   4px   Beschriftung ueber Feld, Symbol an Text
       2   8px   Geschwister nebeneinander: Tasten, Marken, Felder
       3  12px   Innenrand kleiner Bausteine (Kennzahl, Suchleiste, Zelle)
       4  16px   Innenrand Karte, Abstand zwischen zwei Bausteinen
       5  24px   Abstand zwischen Abschnitten
       6  32px   Abstand zwischen grossen Bloecken, Leerzustaende          */
  --abstand-0:  2px;
  --abstand-1:  4px;
  --abstand-2:  8px;
  --abstand-3: 12px;
  --abstand-4: 16px;
  --abstand-5: 24px;
  --abstand-6: 32px;

  /* Innenrand der Inhaltsspalte. Steht als Merkmal, weil die Bereichsreiter
     sich mit einem negativen Rand genau darauf zurueckziehen (layout.css) -
     zwei getrennte Zahlen sind dort schon einmal auseinandergelaufen. */
  --inhalt-y: var(--abstand-4);
  --inhalt-x: var(--abstand-5);

  /* --- Schriftleiter --------------------------------------------------------
     Sieben Stufen mit fester Aufgabe. Andere Groessen gibt es nicht.
     Ausgenommen sind Zeichen, die nur in ihr Kaestchen passen muessen
     (Hilfemarke, Aufklappwinkel) - das ist Feinstellung, keine Rangfolge. */
  --text-mini:  11px;   /* Marke, Zaehler in der Marke, Kleinstzusatz */
  --text-klein: 12px;   /* Feldbeschriftung, Hilfstext, Nebenzeile */
  --text-liste: 13px;   /* Tabellen und dichte Listen */
  --text-grund: 14px;   /* Grundschrift */
  --text-titel: 16px;   /* Ueberschrift im Baustein (h2, h3) */
  --text-gross: 20px;   /* Seitentitel (h1) */
  --text-zahl:  24px;   /* Kennzahl, Kachelwert */

  /* --- Rundung, Linie, Schatten --------------------------------------------
     Je eine Entscheidung. Rundung: klein fuer Bedienelemente, gross fuer
     Behaelter, Pille fuer Marken. Linie: immer 1px; die Farbe traegt die
     Aussage, nicht die Staerke. Schatten: nur was ueber der Seite schwebt -
     Karten und Tabellen tragen eine Linie, keinen Schatten. */
  --radius:       6px;
  --radius-gross: 10px;
  --radius-marke: 999px;
  --linie-breite: 1px;

  --kopfhoehe:    46px;
  --schatten:     0 1px 2px rgba(20, 30, 10, .06);
  --schatten-hoch: 0 6px 20px rgba(20, 30, 10, .14);
  --schriftfamilie: system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --mono: ui-monospace, "Cascadia Mono", Consolas, "Liberation Mono", monospace;
}

/* --- Dunkelthema, Handauswahl --------------------------------------------- */

:root[data-theme="dark"] {
  color-scheme: dark;

  --gruen:        #72c000;
  --gruen-dunkel: #6fb800;
  --gruen-hover:  #5fa300;
  --gruen-text:   #9ada2b;
  --auf-gruen:    #10190a;
  --rot:          #e0574a;
  --rot-text:     #ff9384;
  --auf-rot:      #240906;
  --gelb:         #e2a02c;
  --gelb-text:    #f0b74a;
  --auf-gelb:     #241800;
  --blau:         #4f8fd8;
  --blau-text:    #7fb7f0;
  --auf-blau:     #06182b;

  --schrift:      #e7eae2;
  --schrift-hell: #a6ad9d;

  --flaeche:       #1e231c;
  --flaeche-alt:   #171b15;
  --flaeche-hover: #30362c;
  --zebra:         #262c24;
  --tabellenkopf:  #262c23;

  --linie:       #363c32;
  --linie-hell:  #272c24;
  --linie-stark: #737c6c;

  --feld-flaeche:        #141811;
  --platzhalter:         #9aa291;
  --deaktiviert-flaeche: #22261f;
  --deaktiviert-schrift: #a6ad9d;
  --fokus:               #8ed000;

  --kopf:               #12150f;
  --kopf-schrift:       #e7eae2;
  --kopf-schrift-leise: #a6ad9d;
  --kopf-feld:          #22271f;
  --kopf-feld-rand:     #6b7464;
  --kopf-platzhalter:   #9aa291;
  --kopf-hover:         #2a3026;

  --erfolg-flaeche:  #1b2a10;
  --erfolg-schrift:  #b7e06a;
  --hinweis-flaeche: #132436;
  --hinweis-schrift: #9ec9f2;
  --fehler-flaeche:  #331714;
  --fehler-schrift:  #ffa79a;

  --mark-flaeche: #5d4d00;
  --mark-schrift: #ffeda6;
  --mark-rand:    #d9b400;

  --schatten:      0 1px 2px rgba(0, 0, 0, .5);
  --schatten-hoch: 0 6px 20px rgba(0, 0, 0, .6);
}

/* --- Dunkelthema, Systemeinstellung (nur ohne gegenteilige Handauswahl) ---- */

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;

    --gruen:        #72c000;
    --gruen-dunkel: #6fb800;
    --gruen-hover:  #5fa300;
    --gruen-text:   #9ada2b;
    --auf-gruen:    #10190a;
    --rot:          #e0574a;
    --rot-text:     #ff9384;
    --auf-rot:      #240906;
    --gelb:         #e2a02c;
    --gelb-text:    #f0b74a;
    --auf-gelb:     #241800;
    --blau:         #4f8fd8;
    --blau-text:    #7fb7f0;
    --auf-blau:     #06182b;

    --schrift:      #e7eae2;
    --schrift-hell: #a6ad9d;

    --flaeche:       #1e231c;
    --flaeche-alt:   #171b15;
    --flaeche-hover: #30362c;
    --zebra:         #262c24;
    --tabellenkopf:  #262c23;

    --linie:       #363c32;
    --linie-hell:  #272c24;
    --linie-stark: #737c6c;

    --feld-flaeche:        #141811;
    --platzhalter:         #9aa291;
    --deaktiviert-flaeche: #22261f;
    --deaktiviert-schrift: #a6ad9d;
    --fokus:               #8ed000;

    --kopf:               #12150f;
    --kopf-schrift:       #e7eae2;
    --kopf-schrift-leise: #a6ad9d;
    --kopf-feld:          #22271f;
    --kopf-feld-rand:     #6b7464;
    --kopf-platzhalter:   #9aa291;
    --kopf-hover:         #2a3026;

    --erfolg-flaeche:  #1b2a10;
    --erfolg-schrift:  #b7e06a;
    --hinweis-flaeche: #132436;
    --hinweis-schrift: #9ec9f2;
    --fehler-flaeche:  #331714;
    --fehler-schrift:  #ffa79a;

    --mark-flaeche: #5d4d00;
    --mark-schrift: #ffeda6;
    --mark-rand:    #d9b400;

    --schatten:      0 1px 2px rgba(0, 0, 0, .5);
    --schatten-hoch: 0 6px 20px rgba(0, 0, 0, .6);
  }
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  font-family: var(--schriftfamilie);
  font-size: var(--text-grund);
  line-height: 1.45;
  color: var(--schrift);
  background: var(--flaeche-alt);
  -webkit-text-size-adjust: 100%;
}

a { color: var(--blau-text); text-decoration: none; }
a:hover { text-decoration: underline; }

/* Ein einziger, deutlich sichtbarer Fokusrahmen fuer die Tastaturbedienung.
   Zwei Ringe: aussen die Themafarbe, innen die Flaeche - so bleibt er auf
   hellem wie auf dunklem Grund erkennbar. */
:focus-visible {
  outline: 2px solid var(--fokus);
  outline-offset: 2px;
  border-radius: 2px;
}
.kopf :focus-visible { outline-color: var(--gruen); }

::selection { background: var(--gruen); color: var(--auf-gruen); }

/* --- Kopfzeile ------------------------------------------------------------ */

.kopf {
  display: flex;
  align-items: center;
  gap: var(--abstand-4);
  min-height: var(--kopfhoehe);
  background: var(--kopf);
  color: var(--kopf-schrift);
  /* Die Hoehe bestimmt --kopfhoehe, nicht der Innenrand: an ihr haengen die
     klebenden Tabellenkoepfe und die Seitenspalte. */
  padding: var(--abstand-1) var(--abstand-4);
  position: sticky;
  top: 0;
  z-index: 20;
}

.marke { display: flex; align-items: center; gap: var(--abstand-2); color: var(--kopf-schrift); }
.marke:hover { text-decoration: none; }
.marke-m {
  background: var(--gruen);
  color: var(--auf-gruen);
  font-weight: 800;
  width: 26px; height: 26px;
  display: grid; place-items: center;
  border-radius: var(--radius);
}
.marke-text { font-weight: 700; letter-spacing: -.02em; line-height: 1.1; }
.marke-text small { display: block; font-weight: 500; font-size: var(--text-mini); color: var(--gruen); letter-spacing: .06em; }

.schnellsuche { flex: 1; display: flex; gap: var(--abstand-2); max-width: 620px; }
.schnellsuche input {
  flex: 1;
  padding: var(--abstand-2) var(--abstand-3);
  border: var(--linie-breite) solid var(--kopf-feld-rand);
  border-radius: var(--radius);
  background: var(--kopf-feld);
  color: var(--kopf-schrift);
  font-size: var(--text-grund);
}
.schnellsuche input::placeholder { color: var(--kopf-platzhalter); opacity: 1; }
.schnellsuche input:focus { outline: 2px solid var(--gruen); outline-offset: 0; border-color: var(--gruen); }
.schnellsuche button {
  padding: var(--abstand-2) var(--abstand-4);
  border: var(--linie-breite) solid var(--gruen); border-radius: var(--radius);
  background: var(--gruen); color: var(--auf-gruen); font-weight: 600; cursor: pointer;
}
.schnellsuche button:hover { background: var(--gruen-hover); border-color: var(--gruen-hover); }

.kopf-rechts { display: flex; align-items: center; gap: var(--abstand-3); margin-left: auto; }
.benutzer { text-align: right; line-height: 1.2; }
.benutzer small { display: block; color: var(--kopf-schrift-leise); font-size: var(--text-mini); }
.btn-schlicht {
  background: transparent; border: var(--linie-breite) solid var(--kopf-feld-rand); color: var(--kopf-schrift);
  padding: var(--abstand-2) var(--abstand-3); border-radius: var(--radius); cursor: pointer;
  font: inherit;
}
.btn-schlicht:hover { background: var(--kopf-hover); }

/* Umschalter Hell/Dunkel. Wird von theme.js eingehaengt, wenn im Markup
   kein Element mit [data-thema-schalter] vorhanden ist. */
.thema-schalter {
  display: inline-flex; align-items: center; gap: var(--abstand-2);
  white-space: nowrap;
}
.thema-schalter .thema-zeichen { display: inline-flex; }
.thema-schalter .sym { color: currentColor; width: 16px; height: 16px; vertical-align: 0; }
.thema-schalter .thema-text { font-size: var(--text-klein); }

/* Auf Seiten ohne Kopfzeile (Anmeldung, Fehlerseiten) legt theme.js den
   Schalter frei oben rechts ab - dort gelten die Seitenfarben, nicht die
   der dunklen Kopfzeile. */
.thema-schalter-frei {
  position: fixed;
  top: var(--abstand-3); right: var(--abstand-3);
  z-index: 40;
  background: var(--flaeche);
  border-color: var(--linie-stark);
  color: var(--schrift);
  box-shadow: var(--schatten);
}
.thema-schalter-frei:hover { background: var(--flaeche-hover); }

@media (max-width: 760px) {
  .thema-schalter .thema-text { display: none; }
}

/* --- Rumpf / Navigation --------------------------------------------------- */

.rumpf { display: flex; align-items: flex-start; min-height: calc(100vh - var(--kopfhoehe)); }

.navi {
  width: 232px;
  flex: 0 0 232px;
  background: var(--flaeche);
  border-right: var(--linie-breite) solid var(--linie);
  padding: var(--abstand-2) 0 var(--abstand-6);
  position: sticky;
  top: var(--kopfhoehe);
  max-height: calc(100vh - var(--kopfhoehe));
  overflow-y: auto;
}

.navi details { border-bottom: var(--linie-breite) solid var(--linie-hell); }
.navi summary {
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  padding: var(--abstand-2) var(--abstand-3);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.navi summary::-webkit-details-marker { display: none; }
.navi summary::after {
  content: "";
  width: 6px; height: 6px;
  margin-left: auto;
  border-right: 1.6px solid var(--schrift-hell);
  border-bottom: 1.6px solid var(--schrift-hell);
  transform: rotate(-45deg);
  transition: transform .15s ease;
}
.navi details[open] > summary::after { transform: rotate(45deg); }
.navi summary:hover { background: var(--flaeche-hover); }
.navi summary .navi-titel { flex: 1; min-width: 0; }
.navi details[open] > summary { color: var(--gruen-text); }

.navi ul { list-style: none; margin: 0; padding: 0 0 var(--abstand-2); }
.navi li a {
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  /* Der linke Einzug richtet den Text an der Beschriftung der Gruppe aus
     (3px Streifen + 12px Rand + 17px Symbol + 8px Luecke) - Feinstellung. */
  padding: var(--abstand-1) var(--abstand-3) var(--abstand-1) 40px;
  color: var(--schrift);
  border-left: 3px solid transparent;
}
.navi li a > span:first-child { flex: 1; min-width: 0; }
.navi li a:hover { background: var(--flaeche-hover); text-decoration: none; }
.navi li a.aktiv { border-left-color: var(--gruen-dunkel); background: var(--flaeche-hover); font-weight: 600; }

.navi-start {
  display: flex; align-items: center; gap: var(--abstand-2);
  padding: var(--abstand-2) var(--abstand-3); font-weight: 600; color: var(--schrift);
  border-bottom: var(--linie-breite) solid var(--linie-hell);
  border-left: 3px solid transparent;
}
.navi-start:hover { background: var(--flaeche-hover); text-decoration: none; }
.navi-start.aktiv { border-left-color: var(--gruen-dunkel); background: var(--flaeche-hover); }

/* --- Symbole --------------------------------------------------------------- */

.sym {
  width: 1.15em; height: 1.15em;
  flex: 0 0 auto;
  vertical-align: -.2em;
  color: var(--schrift-hell);
}
.navi summary .sym, .navi-start .sym { width: 17px; height: 17px; }
.navi details[open] > summary .sym, .navi-start.aktiv .sym { color: var(--gruen-text); }
.seitenkopf h1 .sym { color: var(--gruen-text); width: 20px; height: 20px; margin-right: 6px; }
.btn .sym { margin-right: 5px; color: inherit; }
.kachel h3 .sym { margin-right: 5px; }

.sym-in-feld {
  position: absolute; margin-left: var(--abstand-3); color: var(--kopf-platzhalter); pointer-events: none;
  width: 15px; height: 15px; align-self: center;
}
.schnellsuche { position: relative; align-items: stretch; }
/* Linker Rand + Lupe + Luecke: der Text setzt hinter dem Symbol an. */
.schnellsuche input { padding-left: calc(var(--abstand-3) + 15px + var(--abstand-2)); }

/* --- Marke: die kleine Zahl oder das kurze Wort neben einer Beschriftung ---
   Baustein "Marke". Traegt einen Zaehler (offene Vorgaenge) oder ein einzelnes
   Wort ("storniert"). Nie mehr als zwei Woerter - laenger gehoert es in den
   Fliesstext. Der Name der Klasse ist `.marker`; `.marke` ist etwas anderes,
   naemlich die Wortmarke in der Kopfzeile. */

.marker {
  display: inline-block;
  min-width: 19px;
  padding: 1px var(--abstand-2);
  border-radius: var(--radius-marke);
  background: var(--gruen);
  color: var(--auf-gruen);
  font-size: var(--text-mini);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  text-align: center;
  line-height: 1.45;
}
/* Vier Aussagen, mehr nicht: neutral zaehlt, gruen ist erledigt, gelb will
   angesehen werden, rot verlangt einen Eingriff. */
.marker-neutral { background: var(--linie);         color: var(--schrift); }
.marker-erfolg  { background: var(--gruen);         color: var(--auf-gruen); }
.marker-warnung { background: var(--gelb);          color: var(--auf-gelb); }
.marker-fehler  { background: var(--rot);           color: var(--auf-rot); }

.navi li a .marker { background: var(--linie); color: var(--schrift); }
.navi li a.aktiv .marker, .navi summary .marker { background: var(--gruen); color: var(--auf-gruen); }

.inhalt { flex: 1; padding: var(--inhalt-y) var(--inhalt-x) calc(2 * var(--abstand-6)); min-width: 0; }
.inhalt-anonym { max-width: 380px; margin: 8vh auto; padding: 0 var(--abstand-4); }

/* --- Seitenkopf ----------------------------------------------------------- *
   Baustein "Seitenkopf". Genau ein h1 je Seite, daneben die Zahl, die den
   Umfang nennt, rechts die Werkzeuge. Keine Erklaerzeile - die gehoert an
   den Baustein, ueber den sie etwas sagt.                                   */

.seitenkopf {
  display: flex; align-items: center; gap: var(--abstand-3); flex-wrap: wrap;
  margin-bottom: var(--abstand-4);
}
.seitenkopf h1 { font-size: var(--text-gross); margin: 0; font-weight: 700; letter-spacing: -.01em; }
.seitenkopf .zaehler { color: var(--schrift-hell); font-size: var(--text-liste); font-variant-numeric: tabular-nums; }
.seitenkopf .werkzeuge { margin-left: auto; display: flex; gap: var(--abstand-2); flex-wrap: wrap; align-items: flex-end; }

/* --- Meldungen ------------------------------------------------------------ *
   Vier Arten, mehr gibt es nicht: erfolg / hinweis / warnung / fehler.
   Die Art steht im Streifen links, nicht in einer Farbflaeche ueber die
   ganze Zeile.                                                              */

.meldung {
  padding: var(--abstand-3) var(--abstand-4); margin-bottom: var(--abstand-3);
  border-radius: var(--radius); border-left: 4px solid var(--linie-stark);
  background: var(--flaeche);
  color: var(--schrift);
}
.meldung-erfolg  { border-color: var(--gruen-dunkel); background: var(--erfolg-flaeche);  color: var(--erfolg-schrift); }
.meldung-hinweis { border-color: var(--blau);         background: var(--hinweis-flaeche); color: var(--hinweis-schrift); }
.meldung-fehler  { border-color: var(--rot);          background: var(--fehler-flaeche);  color: var(--fehler-schrift); }
/* Warnung: etwas laeuft, ist aber noch nicht falsch. Bewusst ohne getoente
   Flaeche - fuer Gelb gibt es kein Flaechenpaar, das in beiden Themen sicher
   4,5:1 traegt. Die Aussage steht im Streifen und in der Schriftfarbe;
   beide sind in bin/kontrast-pruefung.php als Paar hinterlegt. */
.meldung-warnung { border-color: var(--gelb);         background: var(--flaeche);         color: var(--gelb-text); }

/* --- Karte ----------------------------------------------------------------- *
   Baustein "Karte". Ein Behaelter fuer einen Sachverhalt, der zusammengehoert:
   Stammdaten eines Kunden, ein Formular, eine Gruppe von Kennzahlen. Eine
   Linie, kein Schatten, keine Farbflaeche. Der Titel ist ein h2.

   Wann Karte, wann Tabelle: Karte fuer EINEN Gegenstand mit benannten Feldern,
   Tabelle fuer VIELE gleichartige Zeilen. Nie eine Karte je Listenzeile.     */

.karte {
  background: var(--flaeche);
  border: var(--linie-breite) solid var(--linie);
  border-radius: var(--radius-gross);
  padding: var(--abstand-4);
  margin-bottom: var(--abstand-4);
}
.karte > h2 { margin: 0 0 var(--abstand-3); font-size: var(--text-titel); }

/* Kartenkopf: Titel links, Werkzeuge rechts, eine Linie darunter. Fuer Karten,
   die eine eigene Bedienung tragen (Bearbeiten, Drucken, Aufklappen). */
.karte-kopf {
  display: flex; align-items: baseline; gap: var(--abstand-3); flex-wrap: wrap;
  margin: 0 0 var(--abstand-3);
  padding-bottom: var(--abstand-2);
  border-bottom: var(--linie-breite) solid var(--linie-hell);
}
.karte-kopf > h2, .karte-kopf > h3 { margin: 0; font-size: var(--text-titel); }
.karte-kopf .werkzeuge { margin-left: auto; display: flex; gap: var(--abstand-2); flex-wrap: wrap; }
/* Karte mit Kartenkopf braucht ueber dem Kopf keinen doppelten Abstand. */
.karte > .karte-kopf:first-child { margin-top: 0; }

.feldgruppe { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: var(--abstand-3) var(--abstand-4); }
.feld { display: flex; flex-direction: column; gap: var(--abstand-1); }
.feld label { font-size: var(--text-klein); color: var(--schrift-hell); font-weight: 600; }
.feld input, .feld select, .feld textarea {
  padding: var(--abstand-2) var(--abstand-3);
  border: var(--linie-breite) solid var(--linie-stark);
  border-radius: var(--radius);
  background: var(--feld-flaeche);
  color: var(--schrift);
  font: inherit;
  width: 100%;
}
.feld input:focus, .feld select:focus, .feld textarea:focus {
  outline: 2px solid var(--fokus); outline-offset: -1px; border-color: var(--fokus);
}
.feld textarea { min-height: 62px; resize: vertical; }
.feld .fehler { color: var(--rot-text); font-size: var(--text-klein); }
.feld input[readonly] { background: var(--flaeche-alt); color: var(--schrift-hell); }
.feld-breit { grid-column: 1 / -1; }

/* Eingabe direkt in einer Listenzeile. Wer zehn Kassendifferenzen erklaert,
   soll nicht zehnmal in eine eigene Maske und zurueck. Die Eingabe erbt das
   Aussehen der Formularfelder, bleibt aber flach in der Zeile. */
.zeilenform { display: flex; gap: var(--abstand-2); align-items: center; min-width: 22ch; }
.zeilenform input {
  flex: 1 1 auto; min-width: 14ch;
  padding: var(--abstand-1) var(--abstand-2);
  border: var(--linie-breite) solid var(--linie-stark);
  border-radius: var(--radius);
  background: var(--feld-flaeche);
  color: var(--schrift);
  font: inherit;
}
.zeilenform input:focus {
  outline: 2px solid var(--fokus); outline-offset: -1px; border-color: var(--fokus);
}
.zeilenform .btn { flex: 0 0 auto; }

/* Platzhalter sind Hinweise, kein Ersatz fuer die Beschriftung - sie duerfen
   trotzdem nicht verblassen. */
input::placeholder, textarea::placeholder { color: var(--platzhalter); opacity: 1; }

/* Deaktivierte Bedienelemente bleiben lesbar, wirken aber flach.
   Zwei Eigenheiten der Browser muessen dafuer abgeraeumt werden:
   Chrome legt auf <select disabled> von sich aus opacity .7, Safari
   ueberschreibt die Schriftfarbe ueber -webkit-text-fill-color. Beides
   drueckt den gemessenen Kontrast unter 4,5:1. */
input:disabled, select:disabled, textarea:disabled,
button:disabled, .btn:disabled, .btn[aria-disabled="true"] {
  background: var(--deaktiviert-flaeche);
  color: var(--deaktiviert-schrift);
  border-color: var(--linie);
  cursor: not-allowed;
  opacity: 1;
  -webkit-text-fill-color: var(--deaktiviert-schrift);
}
select:disabled option { color: var(--deaktiviert-schrift); }
label:has(input:disabled), .feld:has(input:disabled) label,
.feld:has(select:disabled) label, .feld:has(textarea:disabled) label {
  color: var(--deaktiviert-schrift);
}

.zahl { text-align: right; font-variant-numeric: tabular-nums; }
.mono { font-family: var(--mono); }

/* --- Schaltflaeche --------------------------------------------------------- *
   Baustein "Schaltflaeche". Drei Formen, mehr nicht:
     .btn            das Uebliche - Rahmen, keine Flaeche
     .btn.btn-primaer  die eine Handlung, die die Seite meint (hoechstens eine
                     je Bildschirm), gruen
     .btn.btn-gefahr   Loeschen, Stornieren, Ausgleichen - roter Rahmen, rote
                     Flaeche erst beim Zeigen
   .btn-klein verkleinert eine davon fuer Listenzeilen.
   Ein Verweis, der wie eine Taste aussieht, traegt dieselben Klassen.       */

.btn {
  display: inline-block;
  padding: var(--abstand-2) var(--abstand-4);
  border: var(--linie-breite) solid var(--linie-stark);
  border-radius: var(--radius);
  background: var(--flaeche);
  color: var(--schrift);
  font: inherit; font-weight: 600;
  cursor: pointer;
}
.btn:hover { background: var(--flaeche-hover); text-decoration: none; }
.btn-primaer { background: var(--gruen); border-color: var(--gruen-dunkel); color: var(--auf-gruen); }
.btn-primaer:hover { background: var(--gruen-hover); color: var(--auf-gruen); }
.btn-gefahr { border-color: var(--rot); color: var(--rot-text); }
.btn-gefahr:hover { background: var(--rot); color: var(--auf-rot); }
.btn-klein { padding: var(--abstand-1) var(--abstand-3); font-size: var(--text-klein); font-weight: 600; }
.aktionen { display: flex; gap: var(--abstand-2); margin-top: var(--abstand-4); flex-wrap: wrap; }
form.inline { display: inline; }

/* --- Liste ----------------------------------------------------------------- *
   Baustein "Liste". Viele gleichartige Zeilen. Immer im .tabellenrahmen,
   sonst laeuft sie auf schmalen Geraeten aus dem Bild. Zahlenspalten tragen
   .zahl (rechtsbuendig, Tabellenziffern), sonst stehen die Stellen nicht
   untereinander und man kann die Spalte nicht ueberfliegen.                 */

.tabellenrahmen {
  overflow-x: auto;
  background: var(--flaeche);
  border: var(--linie-breite) solid var(--linie);
  border-radius: var(--radius-gross);
}

table.liste { width: 100%; border-collapse: collapse; font-size: var(--text-liste); }
table.liste th, table.liste td {
  padding: var(--abstand-2) var(--abstand-3);
  border-bottom: var(--linie-breite) solid var(--linie-hell);
  text-align: left;
  white-space: nowrap;
}
table.liste th {
  background: var(--tabellenkopf);
  color: var(--schrift);
  font-weight: 600;
  position: sticky; top: var(--kopfhoehe); z-index: 2;
  border-bottom: var(--linie-breite) solid var(--linie);
}
table.liste th a { color: var(--schrift); }
/* Zebra: zurueckhaltend, aber genug, um in breiten Listen die Zeile zu halten. */
table.liste tbody tr:nth-child(even) > td { background: var(--zebra); }
table.liste tbody tr:hover > td { background: var(--flaeche-hover); }
table.liste td.zahl, table.liste th.zahl { text-align: right; font-variant-numeric: tabular-nums; }
table.liste td.breit { white-space: normal; min-width: 240px; }
table.liste tfoot td { font-weight: 700; background: var(--tabellenkopf); border-top: 2px solid var(--linie); }
table.liste tfoot tr:hover > td { background: var(--tabellenkopf); }
table.liste .leer { text-align: center; color: var(--schrift-hell); padding: var(--abstand-6); background: var(--flaeche); }

/* Paartabelle: Bezeichnung links, Wert rechts. Fuer die Stammdaten EINES
   Gegenstands in einer Karte - nicht fuer Listen. */
table.paare { border-collapse: collapse; }
table.paare th { text-align: left; font-weight: 600; color: var(--schrift-hell); padding: var(--abstand-1) var(--abstand-4) var(--abstand-1) 0; vertical-align: top; }
table.paare td { padding: var(--abstand-1) 0; }

/* Treffer der Volltextsuche. Die Tintung allein traegt zu wenig Kontrast,
   deshalb zusaetzlich ein Unterstrich. */
mark {
  background: var(--mark-flaeche);
  color: var(--mark-schrift);
  padding: 0 2px;
  border-radius: 2px;
  box-shadow: inset 0 -2px 0 var(--mark-rand);
}

/* Statusfarben
   Die Familie hatte kein Rot, obwohl es den Zustand gibt: „Eingriff noetig"
   in einer Listenzeile. Die Masken unter Recht haben ihn deshalb mit
   style="color:var(--rot-text)" von Hand gesetzt - feste Farben in der
   Vorlage, genau das, was docs/GESTALTUNG.md 2.3 verbietet. Jetzt als
   regulaeres Glied der Familie. */
.st-offen  { color: var(--blau-text); font-weight: 600; }
.st-arbeit { color: var(--gelb-text); font-weight: 600; }
.st-fertig { color: var(--gruen-text); font-weight: 600; }
.st-warte  { color: var(--gelb-text); font-weight: 600; }
.st-fehler { color: var(--rot-text); font-weight: 600; }
.st-storno { color: var(--schrift-hell); text-decoration: line-through; }

.ampel { display: inline-block; width: 13px; height: 13px; border-radius: 50%; vertical-align: -2px; }
.ampel-gruen { background: var(--gruen-dunkel); }
.ampel-gelb  { background: var(--gelb); }
.ampel-rot   { background: var(--rot); }

/* --- Suchleiste ----------------------------------------------------------- *
   Baustein "Suchleiste". Steht ueber der Liste, die sie filtert, und traegt
   nur Felder, die diese Liste betreffen. Das freie Suchfeld bekommt
   .feld-suche und waechst; die uebrigen bleiben schmal. Der Absendeknopf ist
   .btn.btn-primaer und steht rechts vom letzten Feld.                       */

.suchleiste {
  display: flex; gap: var(--abstand-3); align-items: flex-end; flex-wrap: wrap;
  background: var(--flaeche);
  border: var(--linie-breite) solid var(--linie);
  border-radius: var(--radius-gross);
  padding: var(--abstand-3) var(--abstand-4);
  margin-bottom: var(--abstand-4);
}
.suchleiste .feld { min-width: 170px; }
.suchleiste .feld-suche { flex: 1; min-width: 240px; }

/* --- Blaetterung ---------------------------------------------------------- */

.blaettern {
  display: flex; align-items: center; gap: var(--abstand-3); flex-wrap: wrap;
  padding: var(--abstand-3) 0; font-size: var(--text-liste); color: var(--schrift-hell);
  font-variant-numeric: tabular-nums;
}
.blaettern .seiten { display: flex; gap: var(--abstand-1); margin-left: auto; }
.blaettern a, .blaettern span.aktuell {
  padding: var(--abstand-1) var(--abstand-3); border: var(--linie-breite) solid var(--linie-stark); border-radius: var(--radius);
  background: var(--flaeche); color: var(--schrift);
}
.blaettern span.aktuell { background: var(--gruen); border-color: var(--gruen-dunkel); color: var(--auf-gruen); font-weight: 700; }
.blaettern a:hover { background: var(--flaeche-hover); text-decoration: none; }

/* --- Reiter ---------------------------------------------------------------- *
   Baustein "Reiter". Sichten auf denselben Gegenstand, zwischen denen man
   hin und her springt (Bons / Positionen / Abschluesse). Kein Ersatz fuer
   die Navigation und kein Arbeitsablauf - dafuer ist der Faltabschnitt da.
   Hoechstens sieben Reiter; darueber wird es eine Liste.                    */

.reiter { display: flex; gap: var(--abstand-0); border-bottom: var(--linie-breite) solid var(--linie); margin-bottom: -1px; flex-wrap: wrap; }
.reiter a {
  padding: var(--abstand-2) var(--abstand-4);
  border: var(--linie-breite) solid var(--linie); border-bottom: 0;
  border-radius: var(--radius) var(--radius) 0 0;
  background: var(--flaeche-alt); color: var(--schrift);
}
.reiter a:hover { background: var(--flaeche-hover); text-decoration: none; }
.reiter a.aktiv {
  background: var(--flaeche); font-weight: 700;
  border-bottom: var(--linie-breite) solid var(--flaeche);
  box-shadow: inset 0 2px 0 var(--gruen-dunkel);
}

/* --- Kacheln (Kassenuebersicht) -------------------------------------------- *
   Aeltere Bauform der Kennzahl mit Platz fuer mehr als eine Zahl. Fuer neue
   Masken die .kennzahl aus layout.css nehmen; .kachel bleibt fuer die
   Kassenuebersicht, wo je Kasse mehrere Werte in einem Block stehen.        */

.kacheln { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--abstand-4); }
.kachel {
  background: var(--flaeche); border: var(--linie-breite) solid var(--linie);
  border-radius: var(--radius-gross); padding: var(--abstand-4);
}
.kachel h3 { margin: 0 0 var(--abstand-2); font-size: var(--text-grund); }
.kachel .wert { font-size: var(--text-zahl); font-weight: 700; font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.kachel .zusatz { color: var(--schrift-hell); font-size: var(--text-klein); }

/* --- Aufgabenliste in einer Kachel ---------------------------------------- *
   Eine Kachel, die keine Zahl traegt, sondern Wege: „Was moechten Sie tun?"
   auf der Kassenstartseite. Die Beschriftung ist der Weg, der Zusatz darunter
   nennt den technischen Begriff oder sagt, wann man das tut - damit die
   Beschriftung selbst kurz bleiben kann und trotzdem niemand raten muss.

   Der Zusatz steht in einer eigenen Zeile und nicht hinter dem Verweis: als
   Nachsatz in derselben Zeile bricht er bei schmalem Fenster mitten in den
   Verweis hinein, und dann sieht die Zeile aus wie zwei halbe.               */

.aufgabenliste { list-style: none; margin: var(--abstand-3) 0 0; padding: 0; }
.aufgabenliste li { padding: var(--abstand-2) 0; border-top: var(--linie-breite) solid var(--linie); }
.aufgabenliste li:first-child { border-top: 0; }
.aufgabenliste a { font-weight: 600; }
.aufgabenliste .hinweistext { display: block; }

/* --- Scanfeld ------------------------------------------------------------- *
   Die eine Stelle, an der eine Farbflaeche bzw. ein starker Rahmen erlaubt
   ist: der Scanner schreibt blind hinein, deshalb muss ohne Suchen
   erkennbar sein, wo der Strichcode landet.                                 */

.scanfeld {
  display: flex; gap: var(--abstand-2); align-items: center;
  background: var(--flaeche); border: 2px solid var(--gruen-dunkel);
  border-radius: var(--radius-gross); padding: var(--abstand-3); margin-bottom: var(--abstand-4);
}
.scanfeld input {
  flex: 1; font-size: var(--text-gross); font-family: var(--mono);
  padding: var(--abstand-2) var(--abstand-3); border: var(--linie-breite) solid var(--linie-stark); border-radius: var(--radius);
  background: var(--feld-flaeche); color: var(--schrift);
}
.scanfeld input::placeholder { color: var(--platzhalter); opacity: 1; }
.scanfeld label { font-weight: 700; }

/* --- Anmeldung ------------------------------------------------------------ */

.anmeldung { background: var(--flaeche); border: var(--linie-breite) solid var(--linie); border-radius: var(--radius-gross); padding: var(--abstand-5); }
.anmeldung h1 { margin: 0 0 var(--abstand-1); font-size: var(--text-gross); }
.anmeldung p.unter { margin: 0 0 var(--abstand-5); color: var(--schrift-hell); font-size: var(--text-liste); }
.anmeldung .feld { margin-bottom: var(--abstand-3); }
.anmeldung .btn { width: 100%; padding: var(--abstand-3); }

/* --- Fahrrad-Schaubild ----------------------------------------------------- */

.radgrafik {
  position: relative;
  max-width: 560px;
  margin: 0 auto 6px;
  color: var(--schrift-hell);
}
.radgrafik svg { width: 100%; height: auto; display: block; }

.radpunkt {
  position: absolute;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  padding: 3px 9px 3px 3px;
  border-radius: var(--radius-marke);
  background: var(--flaeche);
  border: var(--linie-breite) solid var(--linie-stark);
  color: var(--schrift);
  font-size: var(--text-klein);
  font-weight: 600;
  white-space: nowrap;
  box-shadow: var(--schatten);
  transition: border-color .12s ease, background .12s ease;
}
.radpunkt:hover { text-decoration: none; border-color: var(--gruen-dunkel); background: var(--flaeche-hover); }
.radpunkt:focus-visible { outline: 2px solid var(--fokus); outline-offset: 2px; }

.radpunkt-zeichen {
  display: grid;
  place-items: center;
  width: 21px; height: 21px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: var(--gruen);
  color: var(--auf-gruen);
  font-size: 15px;
  font-weight: 700;
  line-height: 1;
}
.radpunkt-text small {
  display: inline-block;
  margin-left: var(--abstand-1);
  padding: 0 5px;
  border-radius: var(--radius-marke);
  background: var(--linie);
  color: var(--schrift);
  font-size: var(--text-mini);
  font-weight: 700;
}
.radpunkt.aktiv {
  border-color: var(--gruen-dunkel);
  background: var(--gruen);
  color: var(--auf-gruen);
}
.radpunkt.aktiv .radpunkt-zeichen { background: var(--auf-gruen); color: var(--gruen); }
.radpunkt.aktiv .radpunkt-text small { background: rgba(255, 255, 255, .28); color: var(--auf-gruen); }

.radlegende { display: flex; gap: var(--abstand-2); justify-content: center; flex-wrap: wrap; margin-bottom: var(--abstand-3); }

@media (max-width: 620px) {
  .radpunkt { padding: 2px; }
  .radpunkt-text { display: none; }
}

/* --- Vorschlagsliste (AW-Suche) -------------------------------------------- */

.mit-vorschlag { position: relative; }

.vorschlaege {
  position: absolute;
  z-index: 30;
  left: 0; right: 0; top: calc(100% + 3px);
  max-height: 340px;
  overflow-y: auto;
  background: var(--flaeche);
  border: var(--linie-breite) solid var(--linie-stark);
  border-radius: var(--radius);
  box-shadow: var(--schatten-hoch);
}
.vorschlaege:empty { display: none; }

.vorschlag {
  display: flex;
  align-items: baseline;
  gap: var(--abstand-2);
  width: 100%;
  padding: var(--abstand-2) var(--abstand-3);
  border: 0;
  border-bottom: var(--linie-breite) solid var(--linie-hell);
  background: transparent;
  color: var(--schrift);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.vorschlag:last-child { border-bottom: 0; }
.vorschlag:hover, .vorschlag.markiert { background: var(--flaeche-hover); }
.vorschlag .v-code { font-family: var(--mono); font-size: var(--text-klein); color: var(--schrift-hell); flex: 0 0 40px; }
.vorschlag .v-text { flex: 1; min-width: 0; }
.vorschlag .v-gruppe { font-size: var(--text-mini); color: var(--schrift-hell); }
.vorschlag .v-aw { font-weight: 700; font-variant-numeric: tabular-nums; }
.vorschlag .v-preis { color: var(--schrift-hell); font-variant-numeric: tabular-nums; min-width: 68px; text-align: right; }

/* --- Radtyp-Auswahl -------------------------------------------------------- */

.typwahl { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: var(--abstand-2); }
.typwahl label {
  display: block;
  padding: var(--abstand-3);
  border: var(--linie-breite) solid var(--linie-stark);
  border-radius: var(--radius);
  cursor: pointer;
  background: var(--flaeche);
}
.typwahl label:hover { border-color: var(--gruen-dunkel); }
.typwahl input { position: absolute; opacity: 0; pointer-events: none; }
.typwahl input:checked + .typ-inhalt { color: var(--gruen-text); }
.typwahl label:has(input:checked) { border-color: var(--gruen-dunkel); background: var(--flaeche-hover); }
.typwahl label:has(input:focus-visible) { outline: 2px solid var(--fokus); outline-offset: 1px; }
.typ-titel { display: block; font-weight: 700; }
.typ-hinweis { display: block; font-size: var(--text-mini); color: var(--schrift-hell); margin-top: 1px; }

/* --- Kleinkram ------------------------------------------------------------ */

.hinweistext { color: var(--schrift-hell); font-size: var(--text-klein); }
.abstand-oben { margin-top: var(--abstand-4); }
.nowrap { white-space: nowrap; }

/* =============================================================================
   Nachtrag zum Baukasten
   Bausteine, die in den Vorlagen schon benutzt, aber nirgends festgelegt
   waren - sie waren dort unsichtbar und damit ein Fehler. Sie stehen hier,
   damit sie an einer Stelle definiert sind. docs/GESTALTUNG.md fuehrt die
   vollstaendige Liste samt Herkunft.
   ============================================================================= */

/* Nur fuer Vorleseprogramme. Eine Spaltenueberschrift, die auf dem Bildschirm
   nichts zu suchen hat (Aktionsspalte), braucht trotzdem einen Namen. */
.nur-vorleser {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --- Leerzustand ------------------------------------------------------------
   Eine leere Liste ist kein Fehler, sondern ein Zustand. Sie sagt, was hier
   stuende und was zu tun ist - nicht "keine Daten".                         */
.leerzustand {
  padding: var(--abstand-6) var(--abstand-4);
  text-align: center;
  color: var(--schrift-hell);
}
.leerzustand .btn { margin-top: var(--abstand-3); }
/* Dieselbe Aussage in einer Zeile, wenn kein eigener Block hineinpasst. */
.leer-text { color: var(--schrift-hell); }

/* --- Zustand einer Zeile ----------------------------------------------------
   .status haelt das Statuswort mit seiner Farbe (.st-*) zusammen und
   verhindert, dass es umbricht.                                            */
.status { white-space: nowrap; font-weight: 600; }

/* Zeile, die angesehen werden will (fehlende Zuordnung, unklarer Bestand).
   Wie .zeile-korrigiert ein Streifen statt einer Farbflaeche: die Zeile
   bleibt lesbar und im Ausdruck erkennbar. */
tr.warn > td:first-child, .karte.warn { border-left: 3px solid var(--gelb); }
tr.warn > td { background: color-mix(in srgb, var(--gelb) 7%, transparent); }

/* Dieselbe Bauform eine Stufe schaerfer: hier laeuft gerade etwas schief.
   `.karte.warn` gab es schon, das rote Gegenstueck fehlte - eine Karte, die
   einen laufenden Ausfall traegt, ist kein "bitte ansehen". */
.karte.fehler { border-left: 3px solid var(--rot); }

/* Dublettenpaar in der Zusammenfuehrung. Unsicher heisst: die Maschine
   vermutet nur, ein Mensch muss entscheiden. */
.karte.dublette { border-left: 3px solid var(--linie-stark); }
.karte.dublette.unsicher { border-left-color: var(--gelb); }

/* Textmarke ausserhalb einer Zaehlung. Traegt bewusst die vollen Angaben,
   weil sie in den Vorlagen zusammen mit .marke (der Wortmarke der Kopfzeile)
   steht und deren Schriftfarbe sonst weiss auf weiss laege. */
.marke-gruen, .marke-grau {
  display: inline-block;
  padding: 1px var(--abstand-2);
  border-radius: var(--radius-marke);
  font-size: var(--text-mini);
  font-weight: 700;
  line-height: 1.45;
  white-space: nowrap;
}
.marke-gruen { background: var(--gruen); color: var(--auf-gruen); }
.marke-grau  { background: var(--linie); color: var(--schrift); }

/* Gruene Taste ohne .btn davor - kommt in den Kassenvorlagen vor. Bekommt
   deshalb das vollstaendige Aussehen der Primaertaste. */
.btn-gruen {
  display: inline-block;
  padding: var(--abstand-2) var(--abstand-4);
  border: var(--linie-breite) solid var(--gruen-dunkel);
  border-radius: var(--radius);
  background: var(--gruen);
  color: var(--auf-gruen);
  font: inherit; font-weight: 600;
  cursor: pointer;
}
.btn-gruen:hover { background: var(--gruen-hover); color: var(--auf-gruen); text-decoration: none; }

/* Strichcode-Grafik aus src/Support/Barcode.php. */
svg.barcode { display: block; max-width: 100%; height: auto; }

@media (max-width: 900px) {
  /* Schmaler Innenrand der Inhaltsspalte. Die Bereichsreiter in layout.css
     rechnen mit demselben Merkmal und ziehen sich automatisch mit. */
  :root { --inhalt-x: var(--abstand-3); }

  .rumpf { flex-direction: column; }
  .navi { width: 100%; flex: none; position: static; max-height: none; border-right: 0; border-bottom: var(--linie-breite) solid var(--linie); }
  .schnellsuche { max-width: none; }
  .kopf { flex-wrap: wrap; }
  table.liste th { top: 0; }
}

/* --- Touchkassen und Tablets ----------------------------------------------- *

   An der Theke wird mit dem Finger bedient, nicht mit der Maus. Die Grundmasse
   dieser Datei sind fuer den Schreibtisch gemacht und dafuer zu knapp:

     .btn          38 px hoch
     .btn-klein    27 px hoch
     .reiter a     37 px hoch
     Listenzeile   36 px hoch

   Ueblich sind mindestens 44 px; das Projekt setzt in formular.css bereits
   40 px an. `.btn-klein` traegt auf der Kassenuebersicht die Knoepfe "Bons"
   und "Abschluesse" sowie die Zeitraum-Schnellwahl (heute / gestern / Woche /
   Monat) - also genau die haeufigste Bedienung - und ist mit 27 px kaum
   halb so gross wie noetig.

   Warum `pointer: coarse` und keine Breitenabfrage: eine Touchkasse hat oft
   1280 px und mehr. Nach Breite zu schalten wuerde sie wie einen Schreibtisch
   behandeln und gleichzeitig ein schmales Mausfenster unnoetig aufblasen.
   Gefragt ist das Zeigegeraet, nicht die Fenstergroesse.

   Die Schriftgroessen bleiben unberuehrt - vergroessert werden nur die
   Trefferflaechen. Wer die Zahlen groesser braucht, hat dafuer den Zoom des
   Browsers; eine hier fest verdrahtete Schrift wuerde ihm dabei im Weg stehen.
   Ausnahme sind Eingabefelder: unter 16 px zoomt iOS beim Antippen hinein und
   die Maske springt (dieselbe Begruendung wie in formular.css).            */

@media (pointer: coarse) {
  /* Die Werte sind im Browser gemessen, nicht gerechnet: sie ergeben
     44 / 43 / 46 px Trefferhoehe (vorher 36 / 25 / 36). */
  .btn        { padding: 11px 17px; }
  .btn-klein  { padding: 11px 15px; font-size: 13px; }
  .btn-schlicht { padding: 10px 15px; }

  /* Reiterleiste: auf den Kassenseiten der Hauptweg zwischen Tagesuebersicht,
     Bons, Positionen und Abschluessen. */
  .reiter a { padding: 12px 18px; }

  /* Menue links. Ein Fehlgriff hier fuehrt in einen anderen Bereich - das
     kostet an der Kasse mehr Zeit als eine zu grosse Schaltflaeche Platz. */
  .navi a { padding-top: 10px; padding-bottom: 10px; }

  /* Felder: 16 px gegen das Hineinzoomen von iOS. */
  input, select, textarea { min-height: 40px; font-size: 16px; }
  input[type="checkbox"], input[type="radio"] { min-height: 0; width: 20px; height: 20px; }

  /* Listenzeilen bekommen Luft, damit der richtige Bon getroffen wird. Nur
     senkrecht - waagerecht wuerde die Tabelle sonst aus dem Bild laufen. */
  table.liste th, table.liste td { padding-top: 11px; padding-bottom: 11px; }

  /* Blaetterleiste unter langen Listen. */
  .blaettern a, .blaettern span.aktuell { padding: 10px 15px; }
}

@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; animation: none !important; }
}

@media print {
  :root {
    color-scheme: light;
    --schrift: #000; --schrift-hell: #333;
    --flaeche: #fff; --flaeche-alt: #fff; --flaeche-hover: #fff; --zebra: #fff;
    --tabellenkopf: #fff; --feld-flaeche: #fff;
    --linie: #999; --linie-hell: #ccc; --linie-stark: #666;
    --mark-flaeche: transparent; --mark-schrift: #000;
  }
  .kopf, .navi, .werkzeuge, .blaettern, .suchleiste { display: none !important; }
  body { background: #fff; color: #000; }
  .inhalt { padding: 0; }
  .tabellenrahmen { border: 0; }
  table.liste th { position: static; }
}

/* --- Ausgeglichene Kassenabschlüsse --------------------------------------
   Rot heißt hier nicht "Fehler", sondern "hier wurde eingegriffen". Die Zeile
   bleibt in der Liste stehen — ein Ausgleich, der den Satz verschwinden ließe,
   wäre nicht mehr nachvollziehbar (§ 146 Abs. 4 AO). Deshalb ein Rand statt
   einer Flächenfüllung: auffällig, aber weiter lesbar, auch im Ausdruck. */
.zeile-korrigiert > td:first-child,
.karte.zeile-korrigiert  { border-left: 3px solid var(--rot); }
.zeile-korrigiert        { background: color-mix(in srgb, var(--rot) 7%, transparent); }
.zeile-korrigiert s      { color: var(--rot-text); }

/* --- Erklärungen im Mouseover statt im Fließtext --------------------------

   Der Betriebsinhaber hat sich gegen die vielen stehenden Erklärtexte
   ausgesprochen: sie machen die Maske unübersichtlich. Der Inhalt bleibt
   vollständig erhalten, nur die Darstellung ändert sich — die Aussage steht
   sichtbar, die Begründung hängt als `title` an der Überschrift oder an einer
   Hilfemarke, oder sie liegt in einem zugeklappten <details>.

   Damit niemand raten muss, wo eine Erklärung steckt, bekommt jedes Element
   mit einer solchen Erklärung den Fragezeichen-Zeiger und eine gepunktete
   Unterlinie.                                                              */

th[title], td[title], .mitgrund[title] { cursor: help; }
th[title], td[title], .mitgrund[title] {
  text-decoration: underline dotted var(--linie-stark);
  text-underline-offset: 3px;
}

/* Hilfemarke: ein kleines Fragezeichen hinter einer Aussage. Der `title`
   trägt die vollständige Begründung — sie ist also nicht gelöscht, sondern
   nur eingeklappt. Als <abbr> ausgezeichnet, damit Vorleseprogramme den
   title ansagen; tabindex="0" im Markup macht sie auch mit der Tastatur
   erreichbar. */
abbr.hilfemarke {
  display: inline-grid;
  place-items: center;
  width: 15px;
  height: 15px;
  margin-left: 4px;
  border: 1px solid var(--linie-stark);
  border-radius: 50%;
  background: var(--flaeche-alt);
  color: var(--schrift-hell);
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  text-decoration: none;
  vertical-align: 1px;
  cursor: help;
  user-select: none;
}
abbr.hilfemarke:hover,
abbr.hilfemarke:focus-visible { border-color: var(--schrift-hell); color: var(--schrift); }

/* Im Ausdruck hilft kein Mouseover — Papier bekommt die Marke gar nicht
   erst zu sehen; die Druckvorlagen tragen ihren Text ohnehin ausgeschrieben. */
@media print {
  abbr.hilfemarke { display: none; }
  th[title], td[title], .mitgrund[title] { text-decoration: none; }
}

/* --- Vorzeichen als Farbe (Kassenfehlbuchungen) ---------------------------
   Auf Wunsch des Betriebs: die Richtung der Abweichung soll man sehen, nicht
   lesen müssen. Minus rot, Plus gelb, Null blau — und die Zelle mit der
   Abweichung leicht hinterlegt, damit das Auge sie in einer breiten Zeile
   findet.

   Bewusst blass: die Zahl bleibt der Träger der Aussage, die Fläche ist nur
   der Wegweiser dahin. Und nie Farbe allein — das Vorzeichen steht am Betrag,
   sonst ginge die Aussage im Ausdruck und für Farbenblinde verloren. */
.wert-minus  { background: color-mix(in srgb, var(--rot)  12%, transparent); }
.wert-plus   { background: color-mix(in srgb, var(--gelb) 16%, transparent); }
.wert-null   { background: color-mix(in srgb, var(--blau) 12%, transparent); }

.wert-minus, .wert-plus, .wert-null {
  border-radius: var(--radius);
  padding: 1px var(--abstand-1);
  font-variant-numeric: tabular-nums;
}

/* Die Spalte, in der die Abweichung steht, hebt sich vom Rest der Zeile ab. */
td.abweichung { background: color-mix(in srgb, var(--rot) 5%, transparent); }

@media print {
  .wert-minus, .wert-plus, .wert-null, td.abweichung { background: none; }
}

/* --- Fußnote: Erklärung als hochgestellte Ziffer am Objekt -----------------
   GESTALTUNG 3.11. Gebaut von `fussnote()` (src/Support/helpers.php), die
   Liste dazu von templates/partials/fussnoten.php.

   Die Marke ist ein Verweis, kein Schmuck: sie springt zur Erklärung, die
   Erklärung springt zurück. Sie muss klein bleiben — sie steht mitten in einer
   Überschrift oder an einer Kennzahl — und trotzdem mit dem Finger zu treffen
   sein. Deshalb eine kleine Ziffer mit großzügigem Innenabstand statt einer
   Pille: die Zeile bleibt ruhig, die Trefferfläche wächst.

   Farbe trägt hier keine Aussage. Eine Fußnote erklärt; was jemand tun muss,
   steht in einer `.meldung` und bleibt sichtbar. */

.fussmarke {
  font-size: var(--text-mini);
  line-height: 0;
  vertical-align: super;
  margin-left: 1px;
}
.fussmarke a {
  display: inline-block;
  min-width: 14px;
  padding: 0 3px;
  border-radius: var(--radius);
  background: var(--flaeche-alt);
  color: var(--schrift-hell);
  font-weight: 700;
  text-align: center;
  text-decoration: none;
  cursor: help;
}
.fussmarke a:hover,
.fussmarke a:focus-visible {
  background: var(--flaeche-hover);
  color: var(--schrift);
}

/* Die Liste am Seitenende. Abgesetzt, aber nicht als Karte: sie ist Anhang,
   kein eigener Gegenstand. */
.fussnoten {
  margin-top: var(--abstand-6);
  padding-top: var(--abstand-3);
  border-top: 1px solid var(--linie);
}
.fussnoten .fn-titel {
  margin: 0 0 var(--abstand-2);
  font-size: var(--text-klein);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--schrift-hell);
}
.fussnoten .fn-liste { list-style: none; margin: 0; padding: 0; }
.fussnoten .fn-liste li {
  display: grid;
  grid-template-columns: 22px 1fr;
  gap: var(--abstand-2);
  padding: var(--abstand-1) 0;
  font-size: var(--text-klein);
  color: var(--schrift-hell);
}
.fussnoten .fn-nr {
  justify-self: start;
  min-width: 18px;
  padding: 0 var(--abstand-1);
  border-radius: var(--radius);
  background: var(--flaeche-alt);
  color: var(--schrift-hell);
  font-size: var(--text-mini);
  font-weight: 700;
  text-align: center;
  text-decoration: none;
}
.fussnoten a.fn-nr:hover,
.fussnoten a.fn-nr:focus-visible { background: var(--flaeche-hover); color: var(--schrift); }
.fussnoten .fn-text > a { margin-left: var(--abstand-1); }

/* Das angesprungene Ziel kurz hervorheben — sonst weiß man nach dem Sprung
   nicht, welche der zwölf Zeilen gemeint war. */
.fussnoten .fn-liste li:target { background: var(--flaeche-hover); border-radius: var(--radius); }

/* Auf Papier hilft kein Zeigen und kein Springen. Die Ziffer bleibt trotzdem
   stehen — die Erklärung steht ja ausgeschrieben am Seitenende, und ohne
   Ziffer fände man nicht, wozu sie gehört. */
@media print {
  .fussmarke a { background: none; color: inherit; padding: 0; }
  .fussnoten { break-inside: avoid; }
  .fussnoten .fn-nr { background: none; }
}
