/* ==========================================================================
   Theorietrainer — 00 Basis
   Designsystem „Der Rasterbogen". Verbindliche Quelle: DESIGN.md im
   Wurzelverzeichnis. Bei Widerspruch zwischen DESIGN.md, den Konzeptpapieren
   und dem Prototyp gilt DESIGN.md.

   Eigentuemer: Design-Lead. Kein Slice-Worker schreibt in diese Datei.
   Inhalt: Schriften, Marken, Reset, Typografieskala, Fokus, Bewegung, Druck.

   Ladereihenfolge in base.html:
     00-basis  ->  10-bausteine  ->  20-pruefung  ->  30-admin
                                  -> 40-lernen-konten
   Die befristete Schicht 15-uebergang ist nach P3 entfallen.
   ========================================================================== */

/* == Schriften ==========================================================
   Selbst gehostet unter static/fonts/, WOFF2, Untermengen latin und
   latin-ext, Lizenz SIL OFL 1.1 (static/fonts/OFL.txt).

   Kein fremdes CDN: die Anwendung fuehrt Nutzerkonten, und eine Einbindung
   von fonts.googleapis.com uebertraegt die IP-Adresse jedes Besuchers an
   einen Dritten (LG Muenchen I, 3 O 17493/20). Die Sicherheits-Kopfzeile in
   app.py ist entsprechend eng gezogen: weder googleapis noch gstatic.

   Paket: 8 Schnitte, 198 KB. Budget laut Plan 200 KB. Nach der dort
   festgelegten Rueckfallkette entfallen Mono 500 und der kursive Schnitt;
   latin-ext wird nur fuer Fira Sans 400 mitgeliefert, weil dort die
   Eigennamen stehen. Der font-family-Stapel behaelt eine Rueckfallkette,
   damit ein fehlendes Paket die Seite nicht unlesbar macht.
   ====================================================================== */

@font-face {
  font-family: "Fira Mono";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/firamono-400-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Fira Mono";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/firamono-700-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Fira Sans";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/firasans-400-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Fira Sans";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/firasans-400-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Fira Sans";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("../fonts/firasans-500-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Fira Sans Condensed";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("../fonts/firasanscond-500-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Fira Sans Condensed";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("../fonts/firasanscond-600-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Fira Sans Condensed";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/firasanscond-700-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* == Marken ============================================================= */

:root {
  color-scheme: light;

  /* -- Papier ------------------------------------------------------- */
  --papier:        #FBFAF7;   /* Blattflaeche */
  --papier-rand:   #F0EDE6;   /* Seitengrund, Tabellen- und Feldkoepfe */
  --papier-tief:   #E6E2D8;   /* gewaehlte Zeile, inaktive Flaeche */
  --linie:         #D8D3C8;   /* Zellen- und Zeilenlinien */
  --linie-stark:   #B4AE9F;   /* Rahmen ruhender Flaechen: Feldblock, Tabelle */

  /* Rahmen BEDIENBARER Elemente. Getrennt von --linie-stark, weil WCAG 1.4.11
     dort 3:1 verlangt und --linie-stark nur 2.12:1 auf Papier und 1.89:1 auf
     dem Seitengrund erreicht (Befund B-2). Dieser Ton kommt aus derselben
     warmen Reihe, nur dunkler: 3.81:1 auf Papier, 3.41:1 auf Seitengrund,
     3.08:1 auf der tiefen Flaeche. Die Palette bleibt sonst unangetastet. */
  --linie-kontrast: #867F6E;

  /* -- Tinte: Text und zugleich die primaere Aktion ------------------ */
  --tinte:         #1A1A18;
  --tinte-schwach: #5C5A54;

  /* -- Rangfolge der Flaechen -----------------------------------------
     design-spec-v2.md §5.1, Befunde B-1 und B-3.

     Das System hatte genau ein strukturelles Mittel (1px Rahmen rundum) und
     hat es fuer jede Art von Gruppierung benutzt — um Formulare, um Tabellen,
     um Antwortlisten, um Anmerkungen, und diese ineinander. Gemessen traegt
     dieses Mittel kaum Information:

         --papier gegen --papier-rand   1.12:1
         --linie      auf --papier      1.43:1
         --linie-stark auf --papier     2.12:1
         --tinte      auf --papier     16.70:1   <- das einzige, was auf einem
                                                    Handy bei Sonne noch traegt

     Deshalb drei benannte Raenge statt eines namenlosen Rahmens. Die Marken
     sind zugleich das Pruefmittel: wer eine Gliederung baut, benutzt einen
     Rang; ein roher border-Wert fuer Struktur faellt im Review auf.

     Rang A  Seitenteilung   waagerecht, Tinte      hoechstens 3 je Seite
     Rang B  Objektteilung   waagerecht, --linie    beliebig oft
     Rang C  Feldgruppe      rundum, --linie-stark  NUR um Eingabefeldgruppen,
                                                    nie geschachtelt, nie um
                                                    Tabelle/Antwortliste/
                                                    Anmerkung */
  --rang-a: 1px solid var(--tinte);
  --rang-b: 1px solid var(--linie);
  --rang-c: 1px solid var(--linie-stark);

  /* -- Messing: markiert Zustaende. Nie Aktion, nie Urteil. ---------- */
  --messing:       #A8781F;   /* Flaechen, Linien, Typo ab 24px */
  --messing-text:  #7A5610;   /* dieselbe Rolle als Text, AA auf Papier */
  --messing-weich: #F6EDDA;

  /* -- Dunkle Leiste: die Admin-Registerleiste steht auf Tinte und
     braucht darauf eigene Abstufungen. Sie stehen hier, damit sich auch
     diese Farben an einer Stelle aendern lassen. -------------------- */
  --leiste-text:    #B9B5AC;   /* Beschriftung auf Tinte */
  --leiste-schwach: #8A867E;   /* Nebenangabe auf Tinte */
  --leiste-linie:   #3A3833;   /* Trennlinie auf Tinte */

  /* Ueberfahren-Zustand der Hauptaktion: eine Stufe unter --tinte. Als
     eigene Marke, damit nicht zwei verschiedene Schwarz nebeneinander
     stehen, von denen eines fest verdrahtet ist. */
  --tinte-tief:     #000000;

  /* -- Urteil: ausschliesslich Antwort-Feedback ---------------------- */
  --richtig:       #2E5E43;
  --richtig-weich: #E4EDE6;
  --falsch:        #8E2F26;
  --falsch-weich:  #F5E3E0;

  /* Textfarbe auf den gefuellten Urteilsflaechen (Buchstabenzelle der
     Antwortzeile). Steht hier und nicht als #fff in der Baustein-Datei:
     danach fuehrt das Bildschirm-CSS ausserhalb dieses Blocks keinen
     Farbwert mehr, und ein spaeterer Dunkelmodus waere eine zweite
     Wertetabelle statt eines Umbaus. Gebaut wird er NICHT — DESIGN.md und
     STATUS.md legen "kein Dunkelmodus" protokolliert fest; die Aktivierung
     braucht eine Entscheidung des Auftraggebers plus Protokolleintrag.
     Kein neuer Farbwert: #FFFFFF stand vorher zweimal in 10-bausteine.css,
     es bekommt hier nur einen Namen. */
  --urteil-text: #FFFFFF;

  /* -- Schrift: eine Superfamilie, drei Schnitte, drei Aufgaben ------
     Die Rueckfallkette nennt keine der benannten Ersatzschriften (Inter,
     Roboto, Arial, Helvetica, Open Sans, Lato, Montserrat, Poppins, Space
     Grotesk, Atkinson Hyperlegible, IBM Plex Mono, Archivo).

     system-ui steht hier bewusst und widerspricht der Verbotsliste nicht:
     verboten ist es als ANZEIGESCHRIFT, also als gewaehlte Schrift des
     Systems. Als letztes Glied einer Rueckfallkette ist es das Gegenteil
     einer Wahl — es greift nur, wenn das Schriftpaket fehlt, und genau
     diesen Rueckfall verlangt DESIGN.md ("Der font-family-Stapel behaelt
     eine Rueckfallkette, damit ein fehlendes Paket die Seite nicht
     unlesbar macht"). */
  --schrift:      "Fira Sans", system-ui, sans-serif;
  --schrift-eng:  "Fira Sans Condensed", "Fira Sans", system-ui, sans-serif;
  --schrift-zahl: "Fira Mono", ui-monospace, monospace;

  /* -- Groessen -------------------------------------------------------
     Groesster Text der Anwendung: 26px, in Fira Sans Condensed.
     Der einzige groessere Wert ist der Punktstand der Auswertung (48px);
     er wird ausschliesslich in 20-pruefung.css definiert (Worker A). */
  --t-xs:    0.6875rem;  /* 11  Zustandszeichen, Tormarken */
  --t-sm:    0.8125rem;  /* 13  Feldbeschriftungen, Legenden, Tabellenkoepfe */
  --t-md:    0.9375rem;  /* 15  Tabellenzellen, Knoepfe, Nebentext */
  --t-txt:   1rem;       /* 16  Fliesstext, Antworten */
  --t-frage: 1.1875rem;  /* 19  WAR 17 — die Frage ist der Grund, warum es
                                die Anwendung gibt. 19 gegen 16 ist ein
                                lesbarer Rang, 17 gegen 16 ist keiner */
  --t-lg:    1.3125rem;  /* 21  WAR 20 — Abschnittstitel gegen Fragetext */
  --t-xl:    1.625rem;   /* 26  Seitentitel, Hoechstwert, unveraendert */

  /* -- Abstaende, Grundeinheit 4px ----------------------------------- */
  --a1: 4px;  --a2: 6px;  --a3: 8px;  --a4: 12px;
  --a5: 16px; --a6: 20px; --a7: 24px; --a8: 32px;

  /* -- Masse ---------------------------------------------------------- */
  --spalte: 44rem;   /* Satzbreite fuer Fragen und Fliesstext */
  --rand:   16rem;   /* Randspalte */
  --breite: 72rem;   /* Blattbreite */
  --leiste-unten: 56px;   /* Zellenhoehe der unteren Zellenleiste, nur
                             unter 36rem sichtbar (design-spec-v2.md §5.4b) */

  /* -- Bewegung: nur Zustandswechsel, nie laenger als 160ms ---------- */
  --zeit-kurz: 110ms;
  --zeit-lang: 160ms;
}

/* == Reset ==============================================================
   Die einzige border-radius-Angabe des gesamten Stylesheets, und sie setzt
   auf null. Es gibt in diesem System keinen von null verschiedenen Radius:
   das Wagenrad der Wortmarke ist ein SVG, kein gerundetes Kaestchen.
   ====================================================================== */

*, *::before, *::after {
  box-sizing: border-box;
  border-radius: 0;
}

/* Das Ausblenden ueber das hidden-Attribut ist die vom System vorgesehene
   Art, ein Element voruebergehend zu entfernen (z.B. static/js/admin.js
   setzt es auf das Massenformular, statt eine eigene Klasse zu fuehren).
   Die Browservorgabe dafuer ist selbst nur eine Autorenregel mit
   Spezifitaet (0,1,0) — jede eigene display-Regel auf demselben Element
   schlaegt sie, ohne dass !important im Spiel waere (Befund P8e: .massen
   traegt display:flex und liess sich per hidden nicht ausblenden). Diese
   Wiederholung im Reset macht [hidden] wieder verlaesslich: Wer selbst ein
   display auf ein Element legt, das auch hidden tragen kann, braucht ein
   eigenes [hidden]-Gegenstueck (siehe #lern-feedback[hidden] in
   40-lernen-konten.css als Beispiel). */
[hidden] { display: none; }

html {
  -webkit-text-size-adjust: 100%;
  /* Die mitlaufende Fussleiste des Pruefungsbogens verdeckte beim Tabben das
     gerade fokussierte Feld. WCAG 2.2 AA 2.4.11 Focus Not Obscured; der Wert
     liegt ueber der Hoehe der Leiste. Befund Slice A.
     Der Wert deckt seit der unteren Zellenleiste (R-02/R-03) zwei Leisten,
     nicht nur die .bogenfuss: 5rem = 80px deckt beide (Bogenfuss ~72px,
     Zellenleiste 56px + Safe Area). Der Wert selbst bleibt unveraendert. */
  scroll-padding-bottom: 5rem;
}

body {
  margin: 0;
  background: var(--papier-rand);
  color: var(--tinte);
  font-family: var(--schrift);
  font-size: var(--t-txt);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}



img, svg { max-width: 100%; height: auto; }

/* == Typografie ========================================================= */

h1, h2, h3, h4, h5, h6 {
  font-family: var(--schrift-eng);
  font-weight: 600;
  letter-spacing: normal;
  line-height: 1.2;
  margin: 0;
}
h1 { font-size: var(--t-xl); }   /* 26px, Hoechstwert */
h2 { font-size: var(--t-lg); }
h3 { font-size: var(--t-frage); }
h4, h5, h6 { font-size: var(--t-md); }

p { margin: 0 0 var(--a4); }

a {
  color: var(--tinte);
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-thickness: 1px;
}
a:hover { text-decoration-color: var(--messing); }

code, kbd, samp, pre { font-family: var(--schrift-zahl); font-size: 0.9em; }

kbd {
  border: 1px solid var(--linie-stark);
  border-bottom-width: 2px;
  padding: 0 var(--a1);
  background: var(--papier);
}

/* Zahlen, die sich untereinander vergleichen lassen sollen */
.zahl {
  font-family: var(--schrift-zahl);
  font-variant-numeric: tabular-nums;
}

/* == Fokus ==============================================================
   Sichtbar auf jedem bedienbaren Element, 2px Tinte, 2px Versatz, ohne
   Radius. Wird nirgends entfernt.
   ====================================================================== */

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--tinte);
  outline-offset: 2px;
}

/* Auf tintenfarbenen Flaechen waere derselbe Ring unsichtbar — 1.00:1 gegen
   den Untergrund, und der Versatz schiebt ihn nicht heraus, weil die Flaeche
   ringsum ebenfalls Tinte ist (Befund B-1). Dort ein Ring in Papier: 16.70:1.
   Bewusst nach der Grundregel und ohne hoehere Spezifitaet als noetig.
   Die aktive Zelle der unteren Zellenleiste ist derselbe Fall: Tintenflaeche,
   Standardring waere unsichtbar. */
.adminleiste :where(a, button, [tabindex]):focus-visible,
.massen :where(a, button, select, input, [tabindex]):focus-visible,
.leiste-unten .zelle[aria-current]:focus-visible {
  outline-color: var(--papier);
}

/* Fuer Bildschirmleser da, fuer das Auge nicht. Tabellenbeschriftungen und
   Spaltenkoepfe ohne sichtbaren Text brauchen das; angefordert von Slice A,
   gebraucht auch von B und C. Bewusst nicht display:none — das nimmt das
   Element auch dem Bildschirmleser weg. */
.verborgen {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Sprungmarke, erstes fokussierbares Element der Seite */
.zum-inhalt {
  position: absolute;
  top: -9999px;
  left: 0;
}
.zum-inhalt:focus {
  position: static;
  display: inline-block;
  background: var(--tinte);
  color: var(--papier);
  font-family: var(--schrift-eng);
  padding: var(--a2) var(--a4);
}


/* == Bewegung =========================================================== */

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

/* == Druckgrundlage =====================================================
   Der Druck ist erstklassige Ausgabe, kein Anhang: die Anwendung erzeugt
   Turnierboegen. Der bogenspezifische Kopf gehoert zu 20-pruefung.css.
   ====================================================================== */

@page {
  size: A4;
  margin: 18mm 16mm;
}

@media print {
  html, body {
    background: #fff;
    color: #000;
    font-size: 11pt;
    print-color-adjust: economy;
    -webkit-print-color-adjust: economy;
  }

  /* Bedienung wird nicht gedruckt */
  .kopfleiste,
  .adminleiste,
  .datenzeile,
  .werkzeug,
  .massen,
  .aktionen,
  .randspalte,
  .meldungen,
  .zum-inhalt,
  .parcours,
  .legende,
  .leiste-unten,
  nav {
    display: none !important;
  }

  main {
    max-width: none;
    margin: 0;
    padding: 0;
    border: 0;
    background: #fff;
  }

  a { text-decoration: none; color: #000; }

  /* Eine Frage wird nie ueber einen Seitenumbruch zerrissen */
  .frage,
  .antwortzeile,
  tr {
    page-break-inside: avoid;
    break-inside: avoid;
  }

  /* Ankreuzfeld auf Papier: 14px Quadrat in Tinte */
  .antwortzeile .k i {
    width: 14px;
    height: 14px;
    border: 1px solid #000;
    background: #fff;
  }

  .tab, .buch { font-size: 10pt; }
  .tab th, .buch th { background: #fff; }
}
