/* GradeGrid Website - bewusst eine einzige, kleine Datei.
   Kein Framework, kein Build-Schritt: Was hier steht, laeuft auf jedem Webspace.

   Diese Datei traegt ALLE fuenf Seiten. start.css kommt auf der Startseite
   zusaetzlich dazu und darf nur ergaenzen, nicht die Grundlagen umwerfen. */

:root {
  color-scheme: light dark;
  --grund: #ffffff;
  --flaeche: #f5f6f7;
  --text: #1a1c1e;
  --gedaempft: #5a6169;
  --linie: #dfe3e6;
  --marke: #0f6f7a;          /* Petrol, wie in der App */
  --marke-hell: #14929f;
  --auf-marke: #ffffff;      /* Schrift auf Petrol-Flaeche */
  --warnung-grund: #fff6e5;
  --warnung-linie: #e0a800;
  --warnung-text: #6b4d00;

  /* Ab hier klappt die Navigation zum Menue zusammen. 46rem sind 736 Pixel:
     Die Startseite braucht mit fuenf Punkten und der Wortmarke rund 540
     Pixel, bei 736 bleiben 696 - also Luft. Darunter wird es eng, lange
     bevor etwas ueberlaeuft. Bewusst NICHT 768: Ein iPad mini (744) und ein
     iPad (820) im Hochformat sollen die echte Zeile behalten, sie haben den
     Platz dafuer. Der Wert steht hier als Erinnerung - Media-Queries koennen
     keine Variablen lesen, die Zahl steht unten noch einmal woertlich. */
  --menue-breite: 46rem;
}

@media (prefers-color-scheme: dark) {
  :root {
    --grund: #14171a;
    --flaeche: #1c2024;
    --text: #e8eaed;
    --gedaempft: #a3abb3;
    --linie: #2c3238;
    --marke: #4ec5d3;
    --marke-hell: #7bd8e3;
    /* Im Dunkelmodus ist Petrol die HELLE Flaeche - weisse Schrift darauf waere
       kaum lesbar. Deshalb dreht sich das Verhaeltnis hier um. */
    --auf-marke: #08272b;
    --warnung-grund: #2e2612;
    --warnung-linie: #a37c00;
    --warnung-text: #f0d99a;
  }
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--grund);
  color: var(--text);
  font: 17px/1.65 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  -webkit-text-size-adjust: 100%;

  /* Lange Woerter brechen, statt die Seite breiter zu machen. Anlass
     (31.08.2026): "apple.com/legal/internet-services/itunes/dev/stdeula" in
     den Nutzungsbedingungen ist rund 430 Pixel breit, bei 320 Pixern stehen
     280 zur Verfuegung. Ob ein Browser nach einem Schraegstrich umbricht,
     ist Auslegungssache - das hier ist keine. */
  overflow-wrap: break-word;

  /* Sicherheitsnetz gegen waagrechtes Scrollen. clip statt hidden, weil
     hidden auf <body> die klebende Kopfzeile der Startseite kaputt macht.
     Aeltere Browser ignorieren die Zeile; sie ersetzt kein sauberes
     Layout, sie faengt nur den Rest. */
  overflow-x: clip;
}

/* Bilder sprengen nie den Rahmen. Gilt auch fuer alles, was spaeter
   dazukommt, ohne dass jemand daran denken muss. */
img, video { max-width: 100%; height: auto; }

.rahmen { max-width: 44rem; margin: 0 auto; padding: 0 1.25rem; }

/* ---------- Fuer Bildschirmleser da, fuer das Auge nicht ----------
   Nicht display:none: Das naehme das Element aus der Tabfolge, und genau
   das Gegenteil ist gewollt. */
.visuell-versteckt {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip-path: inset(50%);
  overflow: hidden;
  white-space: nowrap;
}

/* Sprungmarke fuer die Tastatur: erste Station auf jeder Seite, sichtbar
   nur, solange sie den Fokus hat. Ohne sie muss man sich vor jedem Inhalt
   erst durch das ganze Menue tippen. */
.ueberspringen {
  position: absolute;
  left: 0.75rem;
  top: -4rem;
  z-index: 100;
  background: var(--marke);
  color: var(--auf-marke);
  text-decoration: none;
  padding: 0.7rem 1.1rem;
  border-radius: 10px;
  font-size: 0.95rem;
}
@media (prefers-reduced-motion: no-preference) {
  .ueberspringen { transition: top 0.15s ease; }
}
.ueberspringen:focus {
  top: 0.75rem;
  color: var(--auf-marke);
}

/* Sichtbarer Fokus ueberall. Ein Menue, das man mit der Tastatur bedienen
   kann, aber dabei nicht sieht, ist nicht bedienbar. */
a:focus-visible,
button:focus-visible,
summary:focus-visible {
  outline: 2px solid var(--marke);
  outline-offset: 3px;
  border-radius: 4px;
}

/* ============================================================
   Kopfzeile und Menue
   ============================================================

   Fund 31.08.2026: Von den 15 Media-Queries der Startseite fasste keine
   einzige <header> oder <nav> an, und diese Datei hatte genau eine. Auf
   dem Telefon lief die Navigation dadurch zweizeilig um, mit rund 25
   Pixel hohen Trefferflaechen - Apple verlangt 44.

   Der Aufklapper laeuft OHNE Skript. Ein verstecktes, aber fokussierbares
   Kontrollkaestchen haelt den Zustand, das CSS zeigt das Menue daran.
   Warum nicht <details>/<summary>? Weil dessen Inhalt vom Browser selbst
   versteckt wird und sich nicht zuverlaessig quer ueber alle Engines
   wieder einblenden laesst - genau das braeuchte man aber, um dieselbe
   Liste breit als Zeile zu zeigen. Das Kaestchen ist vollstaendig durch
   CSS steuerbar und mit der Leertaste bedienbar.

   Das Skript auf den Seiten spiegelt nur aria-expanded und schliesst nach
   dem Antippen eines Links. Faellt es aus, bleibt das Menue bedienbar. */

header {
  position: relative;          /* Anker fuer das aufgeklappte Menue */
  border-bottom: 1px solid var(--linie);
  background: var(--flaeche);
}
header .rahmen {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem 1.5rem;
  padding-block: 1.1rem;
}

.wortmarke {
  /* Gewicht und Faerbung wie in der App (Sources/Features/Logo.swift, LogoWortmarke):
     semibold, "Grade" in der Textfarbe, "Grid" in Petrol. */
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  font-size: 1.35rem; font-weight: 600; letter-spacing: -0.005em;
  color: var(--text); text-decoration: none;
  flex: 0 1 auto;
  min-width: 0;
}
/* Fund 31.08.2026: Diese Regel stand als <style>-Block in den vier
   Rechtsseiten - und fehlte auf der Startseite. Ein eingebettetes <svg>
   ohne width/height faellt dort auf die Ersatzgroesse zurueck, also rund
   300 Pixel im Quadrat: Auf dem Telefon war das Logo breiter als der
   halbe Bildschirm. Deshalb steht die Regel jetzt hier, einmal fuer alle. */
.wortmarke svg { width: 1.35em; height: 1.35em; color: var(--marke); flex: none; }
/* Der Schriftzug ist EIN Flex-Kind. Stuende "Grade" als nackter Textknoten neben
   dem <span>, setzte die gap-Regel des Kopfes einen Abstand mitten in das Wort. */
.wortmarke > b { font-weight: inherit; white-space: nowrap; }
.wortmarke span { color: var(--marke); }

/* ---------- Display-Schrift ----------

   Die Seite lief bis zum 31.08.2026 vollstaendig auf der Systemschrift: eine
   Familie, kein Unterschied zwischen Ueberschrift und Text. Das ist die
   Vorgabe, nicht eine Entscheidung - und damit genau das, wovor die
   Gestaltungsregel warnt, an der wir uns messen ("pair display and body
   typefaces deliberately, avoid defaults").

   SELBST GEHOSTET, und das ist Pflicht, kein Geschmack: Ein Aufruf bei Google
   Fonts zur Laufzeit uebertraegt die IP-Adresse jedes Besuchers an Google. Das
   deutsche Urteil dazu ist der Grund, warum diese Seite ueberhaupt keine
   fremden Adressen anspricht. Die Datei liegt deshalb neben der Seite, der
   Lizenztext (SIL Open Font License) daneben - die OFL verlangt seine
   Mitlieferung.

   Nur fuer die grossen Aussagen. Fliesstext, Listen und kleine Ueberschriften
   bleiben auf der Systemschrift: die ist auf jedem Geraet fuer Lesegroessen
   optimiert, laedt nicht nach und kann nicht blitzen. */
@font-face {
  font-family: "GG Display";
  src: url("schrift/bricolage-latin-600-800.woff2") format("woff2");
  font-weight: 600 800;
  font-style: normal;
  font-display: swap;      /* nie unsichtbarer Text - lieber kurz die Systemschrift */
}
:root { --schrift-display: "GG Display", "Helvetica Neue", Arial, sans-serif; }

.held h1, .aussage, .werte b, .wortmarke {
  font-family: var(--schrift-display);
}

nav { display: flex; flex-wrap: wrap; gap: 0.5rem 1.25rem; margin-left: auto; }
/* Der Rand innen vergroessert die Trefferflaeche, der negative Rand aussen nimmt sie
   der Kopfzeile wieder weg - die Leiste bleibt also gleich hoch. Anlass 31.08.2026:
   gemessen waren die Links 23 Pixel hoch, und ab 736 Pixeln zeigt auch ein iPad im
   Hochformat diese Leiste und nicht das eingeklappte Menue. */
nav a {
  color: var(--gedaempft); text-decoration: none; font-size: 0.95rem; white-space: nowrap;
  display: inline-flex; align-items: center; min-height: 32px;
  padding-block: 0.3rem; margin-block: -0.3rem;
}
nav a:hover, nav a:focus-visible { color: var(--marke); text-decoration: underline; }
nav a[aria-current="page"] { color: var(--text); font-weight: 600; }

/* Das Kaestchen traegt den Zustand. Im schmalen Layout bleibt es fokussierbar -
   deshalb dort kein display:none - und ist nur optisch weg; der Fokusring wird am
   Knopf daneben gezeigt.
   Gegengelesen 31.08.2026: Im BREITEN Layout gibt es keinen Knopf (.menue-knopf ist
   dort display:none). Ein nur optisch verstecktes Kaestchen waere dann ein Tabstopp
   ohne sichtbares Ziel, und weil sein Name im ausgeblendeten Label steckt, meldete
   eine Sprachausgabe ein namenloses Kontrollkaestchen. Deshalb ist es hier ganz weg
   und wird erst im Mobilzweig eingeblendet. */
.menue-schalter {
  display: none;
  position: absolute;
  width: 1px; height: 1px;
  margin: 0; padding: 0; border: 0;
  clip-path: inset(50%);
  overflow: hidden;
  white-space: nowrap;
}
.menue-knopf {
  display: none;               /* nur im schmalen Layout sichtbar */
  width: 44px; height: 44px;   /* Apples Mindestmass, nicht verhandelbar */
  margin-left: auto;
  flex: none;
  align-items: center;
  justify-content: center;
  border-radius: 11px;
  color: var(--text);
  cursor: pointer;
  position: relative;          /* haelt den versteckten Namen "Menü" bei sich */
  -webkit-tap-highlight-color: transparent;
}
.menue-knopf:hover { background: color-mix(in srgb, var(--text) 7%, transparent); }
.menue-schalter:focus-visible + .menue-knopf {
  outline: 2px solid var(--marke);
  outline-offset: 2px;
}
.menue-strich, .menue-strich::before, .menue-strich::after {
  display: block;
  width: 20px; height: 2px;
  border-radius: 2px;
  background: currentColor;
}
.menue-strich { position: relative; }
.menue-strich::before, .menue-strich::after { content: ""; position: absolute; left: 0; }
.menue-strich::before { transform: translateY(-6px); }
.menue-strich::after  { transform: translateY(6px); }
/* Offen: aus den drei Strichen wird ein Kreuz. */
.menue-schalter:checked + .menue-knopf .menue-strich { background: transparent; }
.menue-schalter:checked + .menue-knopf .menue-strich::before { transform: rotate(45deg); }
.menue-schalter:checked + .menue-knopf .menue-strich::after  { transform: rotate(-45deg); }

@media (prefers-reduced-motion: no-preference) {
  .menue-strich, .menue-strich::before, .menue-strich::after {
    transition: transform 0.22s ease, background-color 0.22s ease;
  }
}

main { padding-block: 2.5rem 4rem; }

h1 { font-size: 2rem; line-height: 1.2; margin: 0 0 0.75rem; letter-spacing: -0.02em; }
h2 { font-size: 1.25rem; margin: 2.5rem 0 0.6rem; letter-spacing: -0.01em; }
h3 { font-size: 1.05rem; margin: 1.75rem 0 0.4rem; }
p, ul, ol { margin: 0 0 1rem; }
ul, ol { padding-left: 1.4rem; }
li { margin-bottom: 0.35rem; }

.vorspann { font-size: 1.1rem; color: var(--gedaempft); margin-bottom: 2rem; }

a { color: var(--marke); }
a:hover { color: var(--marke-hell); }

dl { margin: 0 0 1rem; }
dt { font-weight: 600; margin-top: 0.9rem; }
dd { margin: 0.15rem 0 0; color: var(--gedaempft); }

.kasten {
  background: var(--flaeche);
  border: 1px solid var(--linie);
  border-radius: 12px;
  padding: 1rem 1.25rem;
  margin: 1.5rem 0;
}

/* Sichtbare Warnung fuer alles, was vor dem Livegang noch zu tun ist.
   deploy.sh bricht ab, solange ein PLATZHALTER im Text steht - diese Kaesten
   sind also nie oeffentlich zu sehen, sondern nur beim lokalen Ansehen. */
.entwurf {
  background: var(--warnung-grund);
  border: 1px solid var(--warnung-linie);
  color: var(--warnung-text);
  border-radius: 12px;
  padding: 1rem 1.25rem;
  margin: 0 0 2rem;
}
.entwurf strong { display: block; margin-bottom: 0.35rem; }
/* Der Platzhaltername darf die Seite nicht breiter machen als den Bildschirm. */
.entwurf code, code { overflow-wrap: anywhere; }

footer {
  border-top: 1px solid var(--linie);
  color: var(--gedaempft);
  font-size: 0.9rem;
  padding-block: 1.5rem 2.5rem;
}
footer .rahmen { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 1.25rem; }
footer a { color: var(--gedaempft); }

/* ============================================================
   Schmale Geraete
   ============================================================ */

/* Das Menue klappt zusammen. 46rem = 736 Pixel, siehe --menue-breite. */
@media (max-width: 46rem) {

  header .rahmen {
    flex-wrap: nowrap;
    gap: 0.75rem;
    padding-block: 0.7rem;
  }

  /* Erst hier wird das Kaestchen wieder Teil des Tabflusses - zusammen mit dem
     Knopf, der ihm seinen Namen gibt. */
  .menue-schalter { display: block; }
  .menue-knopf { display: inline-flex; }

  /* Das Menue haengt unter der Kopfzeile statt in ihr. So schiebt das
     Aufklappen den Inhalt nicht nach unten - mitten im Scrollen waere das
     der unangenehmste Moment dafuer. */
  nav {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    flex-wrap: nowrap;
    gap: 0;
    margin: 0;
    padding: 0.25rem 1.25rem 0.75rem;
    background: var(--grund);
    border-bottom: 1px solid var(--linie);
    box-shadow: 0 20px 40px -30px rgba(0, 0, 0, 0.55);
    /* Quer gehaltenes Telefon: lieber im Menue scrollen als abgeschnitten. */
    max-height: calc(100vh - 5rem);
    max-height: calc(100svh - 5rem);
    overflow-y: auto;
    overscroll-behavior: contain;
  }
  /* Die Flaeche neben dem Menue. Sie beginnt bei top:100%, also genau unter der
     Kopfzeile - so bleibt das Schliesskreuz oben antippbar, und die Kopfzeile wird
     nicht abgedunkelt. 100svh statt 100vh, weil auf dem Telefon sonst die
     Adressleiste mitgerechnet wird und unten ein Streifen frei bliebe. */
  .menue-hintergrund {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    height: 100vh;
    height: 100svh;
    background: rgba(0, 0, 0, 0.35);
    border: 0;
    margin: 0;
    padding: 0;
  }
  .menue-schalter:checked ~ .menue-hintergrund { display: block; }
  .menue-schalter:checked ~ nav { display: flex; }

  nav a {
    display: flex;
    align-items: center;
    min-height: 48px;          /* mit Rand darueber und darunter klar ueber 44 */
    font-size: 1.05rem;
    color: var(--text);
    border-bottom: 1px solid var(--linie);
  }
  nav a:last-child { border-bottom: 0; }
  /* Der Fokusring liegt INNEN: Das Menue hat wegen overflow-y ein
     Scrollfeld, ein aussen liegender Ring wuerde es waagrecht anstossen. */
  nav a:hover, nav a:focus-visible { text-decoration: none; color: var(--marke); }
  nav a:focus-visible { outline-offset: -3px; }
  nav a[aria-current="page"] { color: var(--marke); }

  /* Auch die Fusszeile wird angetippt, nicht angeklickt. */
  footer .rahmen { gap: 0 1.1rem; }
  footer a { display: inline-flex; align-items: center; min-height: 44px; }
}

@media (max-width: 44rem) {
  body { font-size: 16px; }
  h1 { font-size: 1.6rem; }
  /* Deutsche Komposita bei 320 Pixern: "Festplattenverschluesselung" misst
     rund 225 Pixel, "Verbraucherschlichtungsstelle" rund 240 - bei 280
     Pixern Textbreite steht davon eine Zeile fast leer daneben. Trennen
     statt fluchen. Nur im Fliesstext, nicht in Ueberschriften. */
  p, li, dd { -webkit-hyphens: auto; hyphens: auto; }
}

@media (max-width: 26rem) {
  .rahmen { padding: 0 1rem; }
  nav { padding-inline: 1rem; }   /* buendig mit dem schmaleren Rahmen */
  h1 { font-size: 1.45rem; }
  .vorspann { font-size: 1.03rem; }
}
