/* ==========================================================================
   IDO DNS Service - Designsystem
   --------------------------------------------------------------------------
   Alle Farben, Abstaende und Radien stehen als Variablen am Anfang dieser
   Datei. Wer die Optik an ein anderes IDO-Produkt angleichen will, aendert
   nur diesen Block - an den Bauteilen darunter ist nichts zu tun.

   Drei Erscheinungsbilder werden bedient:
     :root                            hell (Vorgabe)
     @media (prefers-color-scheme)    folgt dem Betriebssystem
     [data-theme="hell"|"dunkel"]     vom Nutzer selbst gewaehlt

   Wichtig: Farben werden NIE direkt in einem @media- oder
   [data-theme]-Block auf ein Bauteil gesetzt, sondern immer nur ueber die
   Variablen. Sonst gilt eine Farbe im nicht gekennzeichneten Zustand gar
   nicht, und man liest dunkle Schrift auf dunklem Grund.
   ========================================================================== */

:root {
  /* Zement - die gemeinsame Neutralskala der IDO-Produktfamilie.
     Farbton 245 bei fast null Saettigung: kuehl genug, um nach Werkstoff
     auszusehen, und neutral genug, um unter jeder der vier Kennfarben zu
     liegen. Eine ins Petrol gezogene Skala haette Patina bevorzugt und
     Messing schmutzig aussehen lassen. */
  --grund:        #F4F7FB;
  --flaeche:      #FFFFFF;
  --flaeche-2:    #E7EEF3;
  --flaeche-3:    #D9E1E8;
  --linie:        #CED7DF;
  --linie-zart:   #E4EAF1;

  --tinte:        #0C151C;
  --tinte-2:      #424F5A;
  --tinte-3:      #5E6A75;

  /* Werkstoff: die Kennfarben der Familie. Alle vier stehen hier, damit
     sich das Stylesheet zwischen den Produkten nur in der Zuweisung von
     --kenn unterscheidet. Gleiche Helligkeit und Saettigung, nur der
     Farbton wechselt - so wirken sie als Satz.
       Patina  Kupfer, das Jahre am Bau war  -> IDO DNS Service
       Messing Klingel- und Namensschild     -> IDO Haustafel (Vorschlag)
       Zink    verzinktes Blech, das Gerippe -> IDO Baukasten (Vorschlag)
       Kobalt  Elektroinstallation           -> IDO Verteiler (Vorschlag) */
  --patina:       #00666C;
  --messing:      #614700;
  --zink:         #315C7F;
  --kobalt:       #365692;
  --patina-2:     #005055;
  --patina-bg:    #DDF2F3;
  --messing-bg:   #F4ECDD;
  --zink-bg:      #E1EFFB;
  --kobalt-bg:    #E5EDFC;

  /* Kennfarbe DIESES Produkts. Ein anderes IDO-Produkt aendert genau
     diese drei Zeilen - an den Bauteilen darunter ist nichts zu tun. */
  --kenn:         var(--patina);
  --kenn-2:       var(--patina-2);
  --kenn-bg:      var(--patina-bg);

  /* Signal. In allen IDO-Produkten identisch und nie dekorativ: Rot
     bedeutet ueberall dasselbe. Getragen wird ein Status immer von
     Punkt UND Text, nie von der Farbe allein. */
  --aktiv:        #28763F;
  --aktiv-bg:     #E4F3E6;
  --verspaetet:   #8F5D00;
  --verspaetet-bg:#F8EDDD;
  --inaktiv:      #A8372E;
  --inaktiv-bg:   #FEE9E6;

  --auf-kenn:     #FFFFFF;
  --schatten:     0 1px 2px rgba(12,21,28,.05), 0 8px 24px -14px rgba(12,21,28,.20);
  --schatten-s:   0 1px 2px rgba(12,21,28,.06);

  /* Schriften */
  --schrift-titel: 'Archivo', 'Helvetica Neue', Arial, sans-serif;
  --schrift-text:  'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --schrift-daten: 'IBM Plex Mono', ui-monospace, Consolas, 'Liberation Mono', monospace;

  /* Abstaende und Radien */
  --r-klein: 5px;
  --r:       8px;
  --r-gross: 12px;
  /* Der aeltere Name - er stand in vier Regeln ohne Definition und lief
     auf den Notwert 10px. */
  --rundung: var(--r-gross);
  /* --breite (1120px) gab es bis zum 09.09.2026. Sie war die Fessel:
     Auf einem 1920er Schirm blieben links und rechts 400 Pixel leer.
     Seitdem nimmt der Inhalt die ganze Flaeche, und die Lesbarkeit
     regeln --lesebreite (Fliesstext) und --doku-breite (Anleitungen)
     dort, wo sie gebraucht wird - nicht als Deckel ueber allem. */
  --breite-schmal: 680px;

  /* DIE WERKBANK: das eine Mass der Arbeitsflaeche (10.09.2026).
     
     Das Gegenteil der alten --breite und trotzdem ihre Wiederkehr -
     deshalb steht hier, was dazwischen passiert ist.
     
     --breite fiel, weil sie ALLES deckelte: auch die Tabelle mit acht
     Spalten, die auf 2560 Pixeln keinen Grund hat, bei 1120
     aufzuhoeren. Danach hatte die Arbeitsflaeche gar kein Mass mehr -
     und was folgte, war schlimmer als die Fessel: Jeder Block brachte
     sein eigenes mit. Auf der Vermittlerseite standen an einem
     Nachmittag SECHS Kanten untereinander: der Hinweiskasten bei 830,
     der Zustandskasten bei 830, die Tabelle bei 1760, der
     Abschnittskopf bei 272, die Feldspalte bei 736, der Seitenkopf bei
     doku-breite. Die Seite war nicht zu breit, sie war ZERFRANST - und
     auf der naechsten Seite franste sie anders.
     
     Die Werkbank ist deshalb kein Deckel ueber den Inhalten, sondern
     EIN Rahmen fuer die Seite: Alles, was direkt in der Arbeitsflaeche
     steht, ist genau so breit - eine linke Kante, eine rechte Kante,
     von Seite zu Seite dieselben. Darunter darf ein Block innen
     gliedern, was er will; nach aussen zeigt er dieselbe Kante wie
     sein Nachbar.
     
     80rem (1280px) ist das Mass, weil eine Tabelle mit acht Spalten
     hineinpasst, ohne dass ein Datensatz auf 1760 Pixel
     auseinandergezogen wird - dort sucht das Auge zwischen Name und
     Zustand den Zusammenhang. Wer mehr braucht, bekommt ihn: Die
     Tabelle rollt in ihrem Rahmen, statt die Seite zu verziehen. */
  --werkbank: 80rem;

  /* DER AUFTRITT: dasselbe fuer die oeffentliche Seite (11.09.2026).

     Aus dem Betrieb: "die oeffentlichen Seiten wirken zu fuellig, mehr
     Platz schaffen und eventuell doch nicht die gesamte Breite nutzen,
     das erschlaegt einen."

     Es ist derselbe Weg wie drinnen, nur ein halbes Jahr spaeter
     gelernt. Am 09.09.2026 fiel --breite mit der Begruendung "immer die
     gesamte Breite nutzen", und das war fuer TABELLEN richtig: Acht
     Spalten haben keinen Grund, bei 1120 aufzuhoeren. Fuer einen
     AUFTRITT ist es falsch. Dort steht keine Tabelle, sondern eine
     Ansprache - und die auf 2560 Pixel zu spannen heisst: Die
     Ueberschrift klebt am linken Rand, das Bild am rechten, dazwischen
     liegt ein Meter Nichts, und vier Karten stehen als Band quer durch
     den Bildschirm. Nicht grosszuegig, sondern laut.

     76rem (1216px) ist knapp unter der Werkbank, und das ist Absicht:
     Der Auftritt traegt keine achtspaltige Tabelle. Was er traegt, sind
     Text, Karten und ein Bild - und die vertragen eine Kante, an der
     das Auge zur Ruhe kommt.

     Ein Deckel ueber allem ist es trotzdem nicht: Wer die volle Flaeche
     braucht - ein Hintergrundband, eine Trennlinie ueber die Seite -,
     steht ausserhalb von .inhalt. */
  --auftritt: 76rem;

  /* ABSTANDSSKALA (Befund 08.09.2026: 47 verschiedene rem-Werte in
     dieser Datei, 680 Inline-Styles in den Vorlagen als Ersatz fuer die
     fehlende Skala). Acht Stufen auf dem 4-Pixel-Raster. Wer einen
     Abstand braucht, nimmt eine Stufe - nicht einen Wert. */
  --a-1: .25rem;   /*  4px  Haarspalt: Marker zu Text */
  --a-2: .5rem;    /*  8px  innerhalb einer Zeile */
  --a-3: .75rem;   /* 12px  Nachsatz unter einem Block */
  --a-4: 1rem;     /* 16px  Absatz, Feldgruppe */
  --a-5: 1.5rem;   /* 24px  Karte innen, Karte zu Karte */
  --a-6: 2rem;     /* 32px  Abschnitt zu Abschnitt (Arbeitsflaeche) */
  --a-7: 3rem;     /* 48px  Abschnitt zu Abschnitt (Auftritt) */
  --a-8: 4rem;     /* 64px  Buehne */

  /* TYPOSKALA. Sieben Grade, dazu das Etikett. Nichts darunter: 11
     Pixel sind die Untergrenze fuer Text, den jemand lesen soll. */
  --t-xs:  .75rem;    /* 12px  Nachsatz, Stand, Fussnote */
  --t-s:   .875rem;   /* 14px  Nebentext, Tabellen, Knoepfe */
  --t-m:   1rem;      /* 16px  Fliesstext */
  --t-l:   1.125rem;  /* 18px  Kartenueberschrift */
  --t-xl:  1.375rem;  /* 22px  Abschnittsueberschrift */
  --t-2xl: 1.75rem;   /* 28px  Seitentitel */
  --t-3xl: 2.25rem;   /* 36px  Buehne */
  --t-etikett: .72rem;/* 11.5px  Versalien-Etikett mit Sperrung */

  /* LESEBREITE. 52ch der Textschrift sind rund 65 bis 70 Zeichen -
     die Zeilenlaenge, bei der das Auge den Zeilenanfang wiederfindet.
     Karten und Hinweiskaesten liefen bis 166 Zeichen je Zeile. */
  --lesebreite: 52ch;
  /* DIE LAUFWEITE EINER DOKUMENTATION (09.09.2026).
     --lesebreite ist das Mass fuer einen Absatz NEBEN etwas anderem -
     eine Erklaerung in einer Karte, ein Nachsatz unter einer Tabelle.
     Eine Anleitung ist anderes: Sie ist der Text, man liest sie am
     Stueck, und sie traegt Befehle und Werte mitten im Satz. Dafuer
     sind 52 Zeichen zu eng und die ganze Fensterbreite zu weit - bei
     1296 px verliert das Auge am Zeilenende die naechste Zeile. */
  --doku-breite: 76ch;

  /* EINGABEFELDER. Der Rahmen einer Karte (--linie) ist als Feldrand
     zu leise: 1,46:1 Kontrast, im Dunkeln kaum zu finden. */
  /* 3:1 GEGEN BEIDE FLAECHEN (Befund 23, 12.09.2026). Der Kommentar an
     der Feldregel sagt "Rahmen mit 3:1" zu - #8C9AA8 lag bei 2,88
     gegen Weiss und 2,68 gegen den Seitengrund. #82909C erreicht 3,27
     und 3,05 und ist optisch derselbe Grauton. Die Zusage haelt jetzt
     auch gegen die hellere der beiden Flaechen; vorher waere sie selbst
     mit 3,0 gegen Weiss auf dem Seitengrund noch darunter geblieben. */
  --linie-stark: #82909C;
  --flaeche-eingabe: #FFFFFF;

  color-scheme: light;
}

/* Dunkel, wenn das Betriebssystem es vorgibt - aber nur, solange der
   Nutzer nicht ausdruecklich "hell" gewaehlt hat. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="hell"]) {
    /* Zement - die gemeinsame Neutralskala der IDO-Produktfamilie.
       Farbton 245 bei fast null Saettigung: kuehl genug, um nach Werkstoff
       auszusehen, und neutral genug, um unter jeder der vier Kennfarben zu
       liegen. Eine ins Petrol gezogene Skala haette Patina bevorzugt und
       Messing schmutzig aussehen lassen. */
    --grund:        #090F14;
    --flaeche:      #131A21;
    --flaeche-2:    #1E262E;
    --flaeche-3:    #29333C;
    --linie:        #313C46;
    --linie-zart:   #202930;
    --linie-stark:  #55636F;
    --flaeche-eingabe: #0E141A;

    --tinte:        #E7EEF3;
    --tinte-2:      #A1AEBA;
    --tinte-3:      #8896A2;

    /* Werkstoff: die Kennfarben der Familie. Alle vier stehen hier, damit
       sich das Stylesheet zwischen den Produkten nur in der Zuweisung von
       --kenn unterscheidet. Gleiche Helligkeit und Saettigung, nur der
       Farbton wechselt - so wirken sie als Satz.
         Patina  Kupfer, das Jahre am Bau war  -> IDO DNS Service
         Messing Klingel- und Namensschild     -> IDO Haustafel (Vorschlag)
         Zink    verzinktes Blech, das Gerippe -> IDO Baukasten (Vorschlag)
         Kobalt  Elektroinstallation           -> IDO Verteiler (Vorschlag) */
    --patina:       #6ECCD1;
    --messing:      #D7BA7D;
    --zink:         #92C0E8;
    --kobalt:       #96BBFE;
    --patina-2:     #8CEAEF;
    --patina-bg:    #052325;
    --messing-bg:   #261D09;
    --zink-bg:      #0F202E;
    --kobalt-bg:    #151E2F;

    /* Kennfarbe DIESES Produkts. Ein anderes IDO-Produkt aendert genau
       diese drei Zeilen - an den Bauteilen darunter ist nichts zu tun. */
    --kenn:         var(--patina);
    --kenn-2:       var(--patina-2);
    --kenn-bg:      var(--patina-bg);

    /* Signal. In allen IDO-Produkten identisch und nie dekorativ: Rot
       bedeutet ueberall dasselbe. Getragen wird ein Status immer von
       Punkt UND Text, nie von der Farbe allein. */
    --aktiv:        #76CF8A;
    --aktiv-bg:     #0F2013;
    --verspaetet:   #F2B458;
    --verspaetet-bg:#251908;
    --inaktiv:      #F38275;
    --inaktiv-bg:   #2A1512;

    --auf-kenn:     #090F14;
    --schatten:     0 1px 2px rgba(0,0,0,.45), 0 10px 30px -16px rgba(0,0,0,.75);
    --schatten-s:   0 1px 2px rgba(0,0,0,.4);

    color-scheme: dark;
  }
}

/* Dunkel, weil der Nutzer es gewaehlt hat - gilt auch bei hellem System. */
:root[data-theme="dunkel"] {
  /* Zement - die gemeinsame Neutralskala der IDO-Produktfamilie.
     Farbton 245 bei fast null Saettigung: kuehl genug, um nach Werkstoff
     auszusehen, und neutral genug, um unter jeder der vier Kennfarben zu
     liegen. Eine ins Petrol gezogene Skala haette Patina bevorzugt und
     Messing schmutzig aussehen lassen. */
  --grund:        #090F14;
  --flaeche:      #131A21;
  --flaeche-2:    #1E262E;
  --flaeche-3:    #29333C;
  --linie:        #313C46;
  --linie-zart:   #202930;
  --linie-stark:  #55636F;
  --flaeche-eingabe: #0E141A;

  --tinte:        #E7EEF3;
  --tinte-2:      #A1AEBA;
  --tinte-3:      #8896A2;

  /* Werkstoff: die Kennfarben der Familie. Alle vier stehen hier, damit
     sich das Stylesheet zwischen den Produkten nur in der Zuweisung von
     --kenn unterscheidet. Gleiche Helligkeit und Saettigung, nur der
     Farbton wechselt - so wirken sie als Satz.
       Patina  Kupfer, das Jahre am Bau war  -> IDO DNS Service
       Messing Klingel- und Namensschild     -> IDO Haustafel (Vorschlag)
       Zink    verzinktes Blech, das Gerippe -> IDO Baukasten (Vorschlag)
       Kobalt  Elektroinstallation           -> IDO Verteiler (Vorschlag) */
  --patina:       #6ECCD1;
  --messing:      #D7BA7D;
  --zink:         #92C0E8;
  --kobalt:       #96BBFE;
  --patina-2:     #8CEAEF;
  --patina-bg:    #052325;
  --messing-bg:   #261D09;
  --zink-bg:      #0F202E;
  --kobalt-bg:    #151E2F;

  /* Kennfarbe DIESES Produkts. Ein anderes IDO-Produkt aendert genau
     diese drei Zeilen - an den Bauteilen darunter ist nichts zu tun. */
  --kenn:         var(--patina);
  --kenn-2:       var(--patina-2);
  --kenn-bg:      var(--patina-bg);

  /* Signal. In allen IDO-Produkten identisch und nie dekorativ: Rot
     bedeutet ueberall dasselbe. Getragen wird ein Status immer von
     Punkt UND Text, nie von der Farbe allein. */
  --aktiv:        #76CF8A;
  --aktiv-bg:     #0F2013;
  --verspaetet:   #F2B458;
  --verspaetet-bg:#251908;
  --inaktiv:      #F38275;
  --inaktiv-bg:   #2A1512;

  --auf-kenn:     #090F14;
  --schatten:     0 1px 2px rgba(0,0,0,.45), 0 10px 30px -16px rgba(0,0,0,.75);
  --schatten-s:   0 1px 2px rgba(0,0,0,.4);

  color-scheme: dark;
}

/* ==========================================================================
   Grundlagen
   ========================================================================== */

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

/* DAS ATTRIBUT "hidden" MUSS AUCH WIRKLICH VERSTECKEN.

   BEFUND AUS DEM BETRIEB (06.09.2026): Der Filter der Anleitungen setzt
   das Attribut, und drei von dreizehn Beitraegen blieben trotzdem
   stehen. Der Grund ist der Rangfolge des Browsers: Seine eigene Regel
   ist nur "[hidden] { display: none }", und jede Regel aus DIESER Datei
   sticht sie - ".karte--klickbar { display: block }" genuegt.

   Das faellt niemandem als Fehler auf: Es sieht aus, als traefe die
   Suche eben mehr. Deshalb steht die Regel hier ganz oben und gilt fuer
   alles, statt sie an jedem Bauteil einzeln nachzuziehen. */
[hidden] { display: none !important; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  background: var(--grund);
  color: var(--tinte);
  font-family: var(--schrift-text);
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

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

a { color: var(--kenn); text-underline-offset: .18em; }
a:hover { color: var(--kenn-2); }

:where(a, button, input, select, textarea, summary):focus-visible {
  outline: 2px solid var(--kenn);
  outline-offset: 2px;
  border-radius: var(--r-klein);
}

/* Sprungmarke fuer Tastatur- und Screenreader-Nutzung. */
.sprungmarke {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--kenn);
  color: var(--auf-kenn);
  padding: .7rem 1.1rem;
  border-radius: 0 0 var(--r) 0;
  z-index: 100;
}
.sprungmarke:focus { left: 0; }

.nur-vorlesen {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%);
  white-space: nowrap;
}

/* ==========================================================================
   Bausteine auf der Skala
   ==========================================================================
   Was hier steht, ersetzt die Inline-Styles der Vorlagen (Befund
   08.09.2026). Reihenfolge der Wahl: erst der Baustein (Karte, Kasten,
   Aufklapper, Befehl), dann eine Variante davon, zuletzt eine der
   Abstandsklassen ganz unten - und nie ein style-Attribut. Der Test
   BausteineTest zaehlt die Reste. */

/* ERSTES UND LETZTES KIND EINER FLAECHE. Der grosse Oberabstand einer
   h2 ist richtig zwischen zwei Abschnitten - in einer Karte, deren
   erstes Element sie ist, stand er 135-mal inline auf 0. */
.karte > :first-child,
.hinweiskasten > :first-child,
.meldung > :first-child,
.falter-inhalt > :first-child,
.aufklapper-inhalt > :first-child,
.tabelle-leer > :first-child,
td > :first-child,
.vabschnitt-kopf > :first-child { margin-top: 0; }
.hinweiskasten > :last-child,
.meldung > :last-child,
.falter-inhalt > :last-child,
.aufklapper-inhalt > :last-child,
td > :last-child { margin-bottom: 0; }

/* KARTENUEBERSCHRIFT: eine Stufe unter dem Abschnitt, in dem die Karte
   steht. Zwoelfmal stand dafuer "font-size:1.05rem" inline. */
.karte > h2 { font-size: var(--t-l); margin-bottom: var(--a-3); }
.karte > h3 { font-size: var(--t-m); margin-bottom: var(--a-2); }
.arbeit-inhalt .karte > h2 { font-size: 1.05rem; }

/* LESEBREITE in Flaechen. Tabellen, Raster und Formulare sind nicht
   betroffen - nur Absaetze und Listen. */
.karte > p, .karte > ul, .karte > ol, .karte > dl,
.hinweiskasten p, .hinweiskasten li,
.meldung { max-width: var(--lesebreite); }
.karte > .lesebreite-frei, .karte > p.lesebreite-frei { max-width: none; }

/* NACHSATZ: die kleine, gedaempfte Zeile unter einem Block. Bisher
   ".klein gedaempft" plus zwanzig verschiedene Inline-Margins. */
/* DAS ETIKETT: die kleine, ruhige Zeile ueber einem Block.
   Das Token --t-etikett gab es seit dem 08.09.2026, die Klasse dazu
   nicht - jede Stelle baute sich ihre eigene (.tarif-name,
   .zugangsdaten dt, .wissen-zahl). Wer eine Beschriftung ueber ein
   Formular oder eine Angabe setzt, nimmt jetzt diese. */
.etikett {
  font-family: var(--schrift-daten);
  font-size: var(--t-etikett);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--tinte-3);
  margin: 0 0 var(--a-2);
}

.nachsatz { font-size: var(--t-xs); color: var(--tinte-3); margin: var(--a-3) 0 0; }
.nachsatz a { color: inherit; }
.karte > .nachsatz:last-child, .hinweiskasten > .nachsatz:last-child { margin-bottom: 0; }

/* AUFKLAPPER: <details> als Baustein. Der Titel traegt Zeiger und
   Gewicht ueber die Klasse, nicht ueber neun Inline-Fassungen. */
/* ==========================================================================
   Der Waehler - was frueher vier gestapelte Aufklapper waren
   --------------------------------------------------------------------------
   Wo sich Varianten GEGENSEITIG AUSSCHLIESSEN - Linux oder QNAP oder
   OPNsense oder Windows -, war die Klappe das falsche Werkzeug: vier
   Dreiecke untereinander, jedes ein Versprechen, dass darunter noch
   etwas kommt, und wer sein System sucht, klappt sich durch. Hier
   waehlt man einmal und sieht seine Fassung.

   Ohne Javascript: Die Schalter sind Radioknoepfe, die Reiter ihre
   Beschriftungen, und ":checked ~" zeigt das passende Blatt. Alle
   Blaetter stehen im Quelltext - Suchen im Browser findet auch, was
   gerade nicht sichtbar ist. Der nav zaehlt bei nth-of-type nicht mit,
   weil er kein div ist; deshalb trifft div.wahl-blatt:nth-of-type(k)
   genau das k-te Blatt.

   Fuenf Plaetze. Wer einen sechsten braucht, ergaenzt hier drei
   Zeilen - und ueberlegt vorher, ob fuenf Varianten nicht eine
   eigene Seite verdienen.
   ========================================================================== */

.wahl { margin: var(--a-5) 0; }
/* Sichtbar fuer die Tastatur, unsichtbar fuer das Auge. display:none
   waere falsch - dann waere der Knopf nicht mehr fokussierbar. */
.wahl-schalter { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.wahl-reiter {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a-2);
  border-bottom: 1px solid var(--linie);
  padding-bottom: var(--a-3);
  margin-bottom: var(--a-5);
}
.wahl-reiter label {
  display: inline-flex; align-items: center; gap: .4rem;
  margin: 0; padding: .42rem .9rem;
  border: 1px solid var(--linie); border-radius: 999px;
  background: var(--flaeche); color: var(--tinte-2);
  font-size: var(--t-s); font-weight: 500; cursor: pointer;
}
.wahl-reiter label:hover { border-color: var(--kenn); color: var(--kenn); }
.wahl > div.wahl-blatt { display: none; }

.wahl > input:nth-of-type(1):checked ~ div.wahl-blatt:nth-of-type(1),
.wahl > input:nth-of-type(2):checked ~ div.wahl-blatt:nth-of-type(2),
.wahl > input:nth-of-type(3):checked ~ div.wahl-blatt:nth-of-type(3),
.wahl > input:nth-of-type(4):checked ~ div.wahl-blatt:nth-of-type(4),
.wahl > input:nth-of-type(5):checked ~ div.wahl-blatt:nth-of-type(5) { display: block; }

.wahl > input:nth-of-type(1):checked ~ .wahl-reiter label:nth-of-type(1),
.wahl > input:nth-of-type(2):checked ~ .wahl-reiter label:nth-of-type(2),
.wahl > input:nth-of-type(3):checked ~ .wahl-reiter label:nth-of-type(3),
.wahl > input:nth-of-type(4):checked ~ .wahl-reiter label:nth-of-type(4),
.wahl > input:nth-of-type(5):checked ~ .wahl-reiter label:nth-of-type(5) {
  background: var(--kenn); border-color: var(--kenn); color: var(--auf-kenn);
}

.wahl > input:nth-of-type(1):focus-visible ~ .wahl-reiter label:nth-of-type(1),
.wahl > input:nth-of-type(2):focus-visible ~ .wahl-reiter label:nth-of-type(2),
.wahl > input:nth-of-type(3):focus-visible ~ .wahl-reiter label:nth-of-type(3),
.wahl > input:nth-of-type(4):focus-visible ~ .wahl-reiter label:nth-of-type(4),
.wahl > input:nth-of-type(5):focus-visible ~ .wahl-reiter label:nth-of-type(5) {
  outline: 2px solid var(--kenn); outline-offset: 2px;
}

@media (pointer: coarse) {
  .wahl-reiter label { min-height: 2.75rem; }
}

/* EINE FORMULARZEILE, DIE IN EINE TABELLENZELLE PASST.
   Feld und Knopf nebeneinander, der Nachsatz darunter. Damit braucht
   ein kleines Aendern-Formular keine Klappe mehr: Es ist eine Zeile
   hoch und steht offen da. Am Telefon bricht es um. */
.zeilenform { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-2); margin: var(--a-2) 0 0; }
.zeilenform > input { flex: 1 1 11rem; min-width: 0; width: auto; }
.zeilenform > .knopf { flex: 0 0 auto; }
.zeilenform > .nachsatz { flex: 1 0 100%; margin: 0; }

.aufklapper { margin: var(--a-4) 0; }
.aufklapper > summary { cursor: pointer; font-weight: 600; }
.aufklapper > summary:hover { color: var(--kenn); }
.aufklapper-inhalt { margin-top: var(--a-3); }
.aufklapper--leise > summary { font-weight: 500; font-size: var(--t-s); color: var(--tinte-2); }
.hinweiskasten > .aufklapper, .karte > .aufklapper:first-child { margin-top: 0; }
.karte > .aufklapper:last-child { margin-bottom: 0; }

.umbruch { overflow-wrap: anywhere; word-break: break-all; }
.vorformatiert { white-space: pre-wrap; overflow-wrap: anywhere; }
.kein-umbruch { white-space: nowrap; }

/* SUCHZEILE: Feld(er) und Knopf in einer Zeile, umbrechend. Die drei
   Inline-Flex-Container der Verwaltung. */
.suchzeile { display: flex; flex-wrap: wrap; gap: var(--a-3); align-items: flex-end; margin-bottom: var(--a-4); }
.suchzeile > * { flex: 1 1 12rem; min-width: 0; margin: 0; }
.suchzeile > .knopf, .suchzeile > .formaktionen { flex: 0 0 auto; margin: 0; }

/* DER ZURUECKSETZER MUSS GEWINNEN (Befund 13.09.2026, aus dem Betrieb:
   "das suchenfeld ist verschoben").

   ".suchzeile > *" hat die Spezifitaet (0,1,0) - genau wie ".feldgruppe"
   mit seinem margin-bottom: 1rem, und das steht 1300 Zeilen WEITER
   UNTEN. Bei gleicher Spezifitaet gewinnt das spaetere: Die Feldgruppe
   behielt ihren Aussenrand von 15 Pixeln.

   Sichtbar wurde das durch align-items: flex-end. Ausgerichtet wird der
   MARGIN-Kasten, nicht der Inhalt - die Unterkante der Gruppe lag also
   15 Pixel unter der Unterkante des Eingabefeldes, und der Knopf stand
   um genau diese 15 Pixel tiefer als das Feld daneben.

   ZWEI SELEKTOREN, WEIL ES ZWEI GEGNER GIBT: ".feldgruppe" (0,1,0) und
   ".arbeit-inhalt .feldgruppe" (0,2,0) - letzteres steht noch einmal
   1000 Zeilen weiter unten und setzt 0,95rem. Der erste Anlauf mit nur
   ".suchzeile > .feldgruppe" (0,2,0) verlor gegen ihn, weil er spaeter
   kommt; genau 15,2 Pixel, und der Versatz blieb unveraendert stehen.

   Beide Faelle stehen deshalb hier, jeder eine Stufe ueber seinem
   Gegner. Ein Zuruecksetzer, der davon abhaengt, WO er in der Datei
   steht, wird beim naechsten Umsortieren wieder ausgehebelt - und das
   faellt niemandem auf, weil nichts kaputtgeht, sondern nur etwas
   verrutscht. */
.suchzeile > .feldgruppe,
.arbeit-inhalt .suchzeile > .feldgruppe { margin: 0; }
/* Im Arbeitsbereich zog "flex: 1 1 12rem" das Suchfeld auf die ganze
   Fensterbreite - 1536 Pixel fuer ein Wort. Ein Suchfeld braucht nicht
   mehr Platz als eine Zeile Suchbegriff. */
.arbeit-inhalt .suchzeile { max-width: 40rem; }

.ton-gefahr  { color: var(--inaktiv); }
.ton-warnung { color: var(--verspaetet); }
.ton-aktiv   { color: var(--aktiv); }
.ton-kenn    { color: var(--kenn); }
.ton-tinte   { color: var(--tinte); }

/* LISTEN in Flaechen. */
.liste-eng { margin: 0; padding-left: 1.1rem; }
.liste-eng li + li { margin-top: var(--a-1); }
.liste-zweispaltig { columns: 2; column-gap: var(--a-5); }
@media (max-width: 640px) { .liste-zweispaltig { columns: 1; } }

/* ABGESETZT: ein Block mit Linie darueber, wie ein Fuss in der Karte. */
.abgesetzt { margin-top: var(--a-5); padding-top: var(--a-4); border-top: 1px solid var(--linie-zart); }

/* QR-CODE: weiss bleibt weiss, auch im Dunkeln - die Kamera braucht
   den Kontrast, nicht das Thema. */
.qr-rahmen { max-width: 16rem; background: #fff; padding: .75rem; border: 1px solid var(--linie-zart); border-radius: var(--r); margin: var(--a-4) 0; }
.qr-rahmen img, .qr-rahmen svg { display: block; width: 100%; height: auto; }

/* SUMME unter einer Betragstabelle (Tarif: "Zusammen je Monat"). Eine
   Stufe groesser als die Posten darueber. */
.betrag-summe { font-size: var(--t-l); }


/* KASTENUEBERSCHRIFT im Hinweiskasten: dieselbe Stufe wie .karte > h2. */
.hinweiskasten > h2 { font-size: var(--t-l); margin-bottom: var(--a-3); }

/* MARKERZEILE: mehrere Marker nebeneinander, umbrechend - unter einem
   Titel im Seitenkopf oder unter dem Namen in einer Tabellenzelle. */
.markerzeile { display: flex; flex-wrap: wrap; gap: var(--a-2); margin-top: var(--a-1); }

/* BETRAGSFELD in einer Tabellenzelle: so breit wie "9.999,99",
   rechtsbuendig wie die Betraege daneben. */
.eingabe-betrag { max-width: 7rem; text-align: right; }

/* TON-KLASSEN GEWINNEN gegen .klein und .gedaempft, die spaeter in der
   Datei stehen - sonst waere <span class="klein ton-warnung"> grau. */
.klein.ton-gefahr, .gedaempft.ton-gefahr   { color: var(--inaktiv); }
.klein.ton-warnung, .gedaempft.ton-warnung { color: var(--verspaetet); }
.klein.ton-aktiv, .gedaempft.ton-aktiv     { color: var(--aktiv); }
.klein.ton-kenn, .gedaempft.ton-kenn       { color: var(--kenn); }
.klein.ton-tinte, .gedaempft.ton-tinte     { color: var(--tinte); }

/* SCHMALE FLAECHEN, BLOCK-LINKS, AUSRICHTUNG. */
.schmal { max-width: 32rem; }
/* Zwischen .schmal und der vollen Flaeche fehlte ein Mass. 32rem sind
   fuer ein Formular MIT Erklaertext oder fuer ein Schreibfeld knapp,
   die volle Breite ist unlesbar. 44rem ist die Breite, die an vier
   Stellen gefehlt hat (Befund 09.09.2026). */
.schmal--weit { max-width: 44rem; }
.lesebreite { max-width: var(--lesebreite); }
.block { display: block; }
.link-still { text-decoration: none; color: inherit; }
.link-still:hover { color: var(--kenn); }
.zentriert { text-align: center; }

/* WER ZENTRIERT, MEINT AUCH DEN KASTEN (Befund 13.09.2026, aus dem
   Betrieb: "Der Text muss Mittig").

   `.karte > p` bekommt seine Lesbarkeitsbreite (Zeile 425) - 52 Zeichen,
   damit ein Absatz nicht ueber die ganze Karte laeuft. Ohne Rand aussen
   klebt dieser schmale Kasten am LINKEN Rand der Karte, und der Text
   darin ist zwar mittig, aber eben mittig in seinem eigenen Kasten. Auf
   einer 1139 Pixel breiten Karte sieht ein 499 Pixel breiter Absatz
   damit aus wie linksbuendig - was er streng genommen nicht ist, und
   genau deshalb faellt es beim Schreiben des CSS nicht auf.

   text-align zentriert Text, nicht Kaesten. Fuer die braucht es den
   automatischen Aussenrand. */
.zentriert > p,
.zentriert > ul,
.zentriert > ol,
.zentriert > dl { margin-left: auto; margin-right: auto; }
.normalgewicht { font-weight: 400; }

/* ABSTANDSKLASSEN - die Rueckfallebene auf der Skala. Nur fuer den
   Rand zwischen zwei Bloecken, nie fuer Innenabstaende. */
.oben-0 { margin-top: 0 !important; }
.oben-2 { margin-top: var(--a-2) !important; }
.oben-3 { margin-top: var(--a-3) !important; }
.oben-4 { margin-top: var(--a-4) !important; }
.oben-5 { margin-top: var(--a-5) !important; }
.oben-6 { margin-top: var(--a-6) !important; }
.unten-0 { margin-bottom: 0 !important; }
.unten-2 { margin-bottom: var(--a-2) !important; }
.unten-3 { margin-bottom: var(--a-3) !important; }
.unten-4 { margin-bottom: var(--a-4) !important; }
.unten-5 { margin-bottom: var(--a-5) !important; }
.rand-0 { margin: 0 !important; }

/* SPRUNGZIELE unter der klebenden Kopfzeile: Wer #kontingent folgt,
   soll die Ueberschrift sehen, nicht die Kopfzeile darueber. */
[id] { scroll-margin-top: 4.5rem; }

/* ==========================================================================
   Aufbau der Seite
   ========================================================================== */

/* DIE GANZE BREITE, AUF JEDEM BILDSCHIRM (Wunsch vom 09.09.2026).
   
   Hier stand eine feste Obergrenze von 1120 px. Auf einem 27-Zoll-
   Bildschirm lag damit rechts und links je ein Drittel der Flaeche
   brach, und die Anwendung sah aus wie eine Seite in einem zu grossen
   Fenster - nicht wie ein Programm, mit dem man arbeitet.
   
   Die Flaeche fuellt jetzt das Fenster; was NICHT mitwaechst, ist die
   Laufweite von Fliesstext: Eine Zeile ueber etwa 90 Zeichen findet
   das Auge am Zeilenende nicht mehr zurueck. Dafuer gibt es
   --lesebreite und die Klasse .lesebreite - die Breite gehoert an den
   Absatz, nicht an die Seite. Was die Flaeche fuellt, sind Raster,
   Tabellen und Karten, die auf breiten Bildschirmen mehr Spalten
   bekommen. */
.inhalt {
  width: 100%;
  max-width: var(--auftritt);
  margin: 0 auto;
  padding: 0 clamp(1rem, 3vw, 2.5rem);
}
.inhalt--schmal { max-width: var(--breite-schmal); }

main { flex: 1 0 auto; padding: clamp(1.6rem, 4vw, 2.8rem) 0 clamp(3rem, 6vw, 4.5rem); }

/* ==========================================================================
   Kopfzeile
   ========================================================================== */

.kopf {
  background: var(--flaeche);
  border-bottom: 1px solid var(--linie);
  position: sticky;
  top: 0;
  z-index: 30;
}
.kopf-innen {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  /* Der Abstand schrumpft mit: auf einem 320-px-Telefon zaehlt jeder
     Millimeter, auf dem Schreibtisch darf die Zeile atmen. */
  gap: clamp(.5rem, 2.2vw, 1.2rem);
  padding-top: .75rem;
  padding-bottom: .75rem;
}

.marke {
  display: inline-flex;
  align-items: baseline;
  gap: .38rem;
  min-width: 0;
  flex: 0 1 auto;
  font-family: var(--schrift-titel);
  font-weight: 700;
  /* Auf dem Telefon teilt sich der Schriftzug die Zeile mit dem
     Erscheinungsbild-Umschalter und dem Menueknopf. Damit nichts aus dem
     Bild laeuft, wird er dort eine Spur kleiner gesetzt. */
  font-size: clamp(.98rem, 3.2vw, 1.08rem);
  letter-spacing: -.015em;
  color: var(--tinte);
  text-decoration: none;
  white-space: nowrap;
}
.marke:hover { color: var(--tinte); }
/* "Service" traegt die Leitfarbe - das ist das Erkennungsmerkmal des
   Schriftzugs und wiederholt sich in allen IDO-Produkten. */
.marke b { color: var(--kenn); font-weight: 700; }
/* NICHT SCHRUMPFEN, WO PLATZ IST (Befund 07.09.2026).

   Auf dem Telefon muss der Schriftzug nachgeben - er teilt sich die
   Zeile mit Umschalter und Menueknopf, dafuer steht oben min-width: 0.
   Ab 900 Pixeln steht das Menue offen daneben, und dort nahm es allen
   Platz: Der Schriftzug wurde auf 123 von 218 Pixeln gequetscht und
   stand mit "white-space: nowrap" quer ueber dem ersten Menuepunkt. */
@media (min-width: 1024px) {
  .marke { min-width: max-content; }
}

/* --- Menue -------------------------------------------------------------
   Auf schmalen Bildschirmen ein Klappmenue, ab 1024 px eine offene
   Navigationsleiste. Getragen von <details>/<summary>, damit es ohne
   JavaScript funktioniert und der Zustand von selbst an Screenreader
   gemeldet wird.

   DIE ZAHL IST ZWEIMAL NACHGEMESSEN WORDEN, und beide Male hat sie
   sich nach oben bewegt:

   900 -> 1000 (08.09.2026): Zwischen 900 und 960 Pixeln verschwand der
   letzte Menuepunkt hinter dem verborgenen Scrollstreifen - "Preise"
   fuer Besucher, "Verwaltung" fuer Verwalter.

   1000 -> 1024 (29.09.2026): Gemessen an zwoelf Breiten von 360 bis
   1440 Pixeln war GENAU bei 1000 die offene Leiste 21 Pixel zu breit
   fuer ihren Platz. Die Seite verschob sich dabei nicht - der
   Scrollstreifen unten faengt das ab, so ist er gedacht -, aber die
   Leiste stand am Umschaltpunkt selbst angeschnitten da. 1024 ist
   ausserdem die Breite, an der die gaengigen Tablets im Querformat
   liegen; dort soll die Leiste stehen und nicht klappen.

   Fuenf Regeln tragen diesen Punkt: .marke, .thema, .menue-knopf mit
   .menue, und .kopf-konto in beiden Richtungen. Wer eine davon
   verschiebt, muss alle verschieben - sonst klappt das Menue bei einer
   Breite, in der die Marke schon ihre Endbreite hat. */

/* Reihenfolge in der Kopfzeile: Marke - (Navigation) - Erscheinungsbild -
   Menueknopf. Der Knopf steht ganz aussen, dort wird er am Handy mit dem
   Daumen erreicht. */
.menue { position: relative; order: 3; }
.thema { order: 2; margin-left: auto; }
@media (min-width: 1024px) {
  .thema { margin-left: 0; }
}

.menue-knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Feste Groesse: das ist die Trefferflaeche fuer den Daumen, sie darf
     im Gedraenge nicht zusammengedrueckt werden. */
  flex: none;
  width: 40px; height: 36px;
  border: 1px solid var(--linie);
  border-radius: var(--r-klein);
  background: var(--flaeche-2);
  color: var(--tinte-2);
  cursor: pointer;
  list-style: none;
}
/* Das Dreieck, das Safari und Firefox von sich aus vor ein summary setzen. */
.menue-knopf::-webkit-details-marker { display: none; }
.menue-knopf::marker { content: ""; }
.menue-knopf:hover { color: var(--tinte); border-color: var(--tinte-3); }
.menue-knopf svg { width: 20px; height: 20px; display: block; }

/* Aus den drei Balken wird beim Aufklappen ein Kreuz. */
.menue-knopf .kreuz { display: none; }
.menue[open] .menue-knopf .balken { display: none; }
.menue[open] .menue-knopf .kreuz { display: block; }
.menue[open] .menue-knopf { background: var(--kenn-bg); color: var(--kenn); border-color: var(--kenn); }

.menue-inhalt {
  position: absolute;
  top: calc(100% + .55rem);
  right: 0;
  min-width: min(17rem, calc(100vw - 2rem));
  background: var(--flaeche);
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  box-shadow: var(--schatten);
  padding: .5rem;
  z-index: 40;
}

.haupt-navigation { display: flex; flex-direction: column; }
.haupt-navigation a {
  font-size: .95rem;
  color: var(--tinte-2);
  text-decoration: none;
  padding: .6rem .7rem;
  border-radius: var(--r-klein);
  border-bottom: none;
}
.haupt-navigation a:hover { color: var(--tinte); background: var(--flaeche-2); }
.haupt-navigation a[aria-current="page"] {
  color: var(--kenn);
  font-weight: 500;
  background: var(--kenn-bg);
}

.menue-fuss {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .5rem;
  margin-top: .4rem;
  padding: .7rem .7rem .3rem;
  border-top: 1px solid var(--linie-zart);
}
.menue-fuss .knopf { flex: 1; }
/* Das Abmelden-Formular soll sich in der Zeile verhalten wie zuvor der
   blanke Knopf - display:contents laesst den Knopf direkt am Flex-Layout
   der Fusszeile teilnehmen. */
.menue-fuss form { display: contents; }

/* Ab hier ist Platz genug: das Menue steht offen in der Kopfzeile. */
@media (min-width: 1024px) {
  .menue-knopf { display: none; }
  .menue { display: contents; }

  /* Zwei Browservorgaben muessen ueberschrieben werden, damit der Inhalt
     eines GESCHLOSSENEN <details> hier sichtbar ist:
       - aeltere Browser blenden ihn mit display:none aus,
       - Chromium ab 131 mit content-visibility:hidden am Pseudoelement
         ::details-content. Ohne die zweite Regel steht die Navigation zwar
         im Baum, ist aber zusammengefallen (Breite 0) - sie war damit auf
         breiten Bildschirmen unsichtbar.
     Browser ohne ::details-content ignorieren die Regel folgenlos. */
  .menue::details-content {
    content-visibility: visible;
    block-size: auto;
    /* UND SCHRUMPFBAR. Seit Chromium 131 steckt der Inhalt eines
       <details> in diesem Pseudoelement - und DAS ist hier das
       Flex-Element, nicht .menue-inhalt. Mit der Vorgabe min-width:
       auto konnte es nicht schmaler werden als seine Menuepunkte; das
       "lieber scrollt die Leiste als die Seite" weiter unten lief
       damit ins Leere, und nachgegeben hat stattdessen der
       Schriftzug. */
    min-width: 0;
  }

  .menue > .menue-inhalt {
    display: flex;
    align-items: center;
    gap: clamp(.9rem, 1.8vw, 1.4rem);
    position: static;
    min-width: 0;
    margin-left: auto;
    padding: 0;
    background: none;
    border: none;
    box-shadow: none;
  }

  .haupt-navigation {
    flex-direction: row;
    align-items: center;
    /* Eine Spur enger als frueher (1,3rem). Ist ein Verwalter
       angemeldet, traegt die Leiste sieben Punkte, daneben Konto,
       Abmelden und den Umschalter - mit dem alten Abstand blieb der
       letzte Punkt um vierzehn Pixel angeschnitten. */
    gap: clamp(.8rem, 1.5vw, 1.05rem);
    /* min-width:0 hebt die Vorgabe min-width:auto fuer Flex-Elemente auf.
       Ohne sie kann die Leiste nicht schmaler werden als ihre Eintraege -
       sie schob dann die ganze Seite nach rechts, statt das
       vorgesehene overflow-x zu nutzen. Der Streifen ist die
       Rueckfallebene: lieber scrollt die Leiste als die Seite. */
    min-width: 0;
    overflow-x: auto;
    scrollbar-width: none;
  }
  .haupt-navigation::-webkit-scrollbar { display: none; }
  .haupt-navigation a {
    padding: .25rem 0;
    border-radius: 0;
    border-bottom: 2px solid transparent;
    font-size: .88rem;
    white-space: nowrap;
  }
  .haupt-navigation a:hover { background: none; }
  .haupt-navigation a[aria-current="page"] {
    color: var(--tinte);
    background: none;
    border-bottom-color: var(--kenn);
  }

  .menue-fuss {
    margin-top: 0;
    padding: 0;
    border-top: none;
    flex-wrap: nowrap;
  }
  .menue-fuss .knopf { flex: none; }
}

/* ==========================================================================
   DIE UNTERLISTE "LEISTUNGEN" (04.10.2026)
   ==========================================================================

   Aus dem Betrieb, schon am 29.09.2026: "Sollte man die Menuestruktur
   optimieren, vielleicht mit Dropdown und in der mobilen Ansicht mit
   Hamburgermenue und statt Dropdown Akkordeon nutzen?" - und heute:
   "redesign und struktur seo neues level genauso menue".

   EIN ELEMENT, ZWEI DARSTELLUNGEN. Auf dem Telefon ist die Unterliste
   ein Akkordeon im Hamburger: Sie klappt nach unten auf und schiebt
   den Rest weiter. Am Schreibtisch ist dasselbe <details> ein
   Klappmenue, das ueber der Seite schwebt. Keine zweite Fassung im
   Quelltext, die mit der ersten auseinanderlaufen koennte.

   DIE FALLE, DIE HIER SCHON VOR DEM BAUEN STAND: .haupt-navigation
   traegt am Schreibtisch overflow-x: auto - die Rueckfallebene fuer
   eine ueberfuellte Leiste. overflow beschneidet aber BEIDE
   Richtungen, sobald es nicht visible ist. Ein Klappmenue darin waere
   unter der Leiste abgeschnitten worden und damit unsichtbar. Die
   Leiste mit Unterliste hat drei Punkte statt sechs und braucht den
   Streifen nicht mehr; die Leiste der Angemeldeten behaelt ihn. */

.unterliste > summary {
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .35rem;
  padding: .6rem .7rem;
  font-size: .95rem;
  color: var(--tinte-2);
  cursor: pointer;
  border-radius: var(--r-klein);
  user-select: none;
}
.unterliste > summary::-webkit-details-marker { display: none; }
.unterliste > summary:hover { color: var(--tinte); background: var(--flaeche-2); }
.unterliste > summary:focus-visible {
  outline: 2px solid var(--kenn);
  outline-offset: 2px;
}
/* Man steht auf einer der Leistungen - die Zeile sagt es, auch zu. */
.unterliste > summary[aria-current] { color: var(--kenn); font-weight: 500; }

.unterliste-pfeil {
  width: 1rem;
  height: 1rem;
  flex: none;
  transition: transform .15s ease;
}
.unterliste[open] > summary .unterliste-pfeil { transform: rotate(180deg); }

.unterliste-inhalt {
  display: flex;
  flex-direction: column;
  padding: 0 0 .3rem .7rem;
}
/* Die Zeile darunter sagt in drei Woertern, was hinter dem Namen
   steckt. "Zertifikate" allein sagt einem, der eine Warnung im Browser
   loswerden will, nichts - "HTTPS ohne Warnung" sagt es. */
.unterliste-inhalt a span {
  display: block;
  font-size: .8rem;
  color: var(--tinte-3);
  font-weight: 400;
  margin-top: .1rem;
}

@media (prefers-reduced-motion: reduce) {
  .unterliste-pfeil { transition: none; }
}

@media (min-width: 1024px) {
  /* Siehe oben: ohne das schneidet die Leiste ihr eigenes Klappmenue
     ab. Nur die Leiste MIT Unterliste - die der Angemeldeten behaelt
     ihren Scrollstreifen. */
  .haupt-navigation:has(.unterliste) { overflow: visible; }

  .unterliste { position: relative; }
  .unterliste > summary {
    padding: .25rem 0;
    font-size: .88rem;
    border-radius: 0;
    border-bottom: 2px solid transparent;
    white-space: nowrap;
    justify-content: flex-start;
  }
  .unterliste > summary:hover { background: none; }
  .unterliste > summary[aria-current] {
    color: var(--tinte);
    border-bottom-color: var(--kenn);
  }

  .unterliste-inhalt {
    position: absolute;
    top: calc(100% + .75rem);
    left: -1rem;
    z-index: 50;
    min-width: 17rem;
    padding: .4rem;
    background: var(--flaeche);
    border: 1px solid var(--linie);
    border-radius: var(--r-gross);
    box-shadow: var(--schatten);
  }

  /* SPEZIFISCHER ALS .haupt-navigation a, und zwar mit Absicht ueber
     den Selektor und nicht ueber !important: Die Leistenregel setzt
     Unterstrich, schmale Polsterung und nowrap - alles richtig fuer die
     Leiste, alles falsch fuer eine Liste in einem Kasten. */
  .haupt-navigation .unterliste-inhalt a {
    padding: .55rem .7rem;
    border-bottom: none;
    border-radius: var(--r-klein);
    white-space: normal;
    font-size: .9rem;
    color: var(--tinte);
    font-weight: 500;
  }
  .haupt-navigation .unterliste-inhalt a:hover { background: var(--flaeche-2); }
  .haupt-navigation .unterliste-inhalt a[aria-current="page"] {
    background: var(--kenn-bg);
    border-bottom: none;
    color: var(--kenn);
  }
}

.kopf-konto {
  font-family: var(--schrift-daten);
  font-size: .72rem;
  color: var(--tinte-3);
  max-width: 22ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Im Klappmenue steht die Adresse immer - dort ist sie die einzige Stelle,
   an der man sieht, mit welchem Konto man angemeldet ist. In der offenen
   Kopfzeile ist sie das erste, was weichen darf: zwischen 900 und 1200 px
   braucht die Navigation den Platz dringender. Wer wissen will, welches
   Konto angemeldet ist, findet es auf /konto. */
@media (min-width: 1024px) {
  .kopf-konto { display: none; }
}
@media (min-width: 1200px) {
  .kopf-konto { display: block; max-width: 18ch; }
}
@media (max-width: 1023px) {
  .kopf-konto { flex: 1 0 100%; margin-bottom: .3rem; max-width: none; }
}
/* Im Arbeitsbereich (Kundenbereich, Verwaltung) steht die Adresse
   immer neben dem Avatar - dort gibt es keine Navigationsleiste, die
   den Platz braeuchte. Unter 720px weicht sie (siehe .arbeit-konto). */
.arbeit-konto .kopf-konto { display: block; flex: none; margin: 0; max-width: 22ch; }

/* Umschalter fuer das Erscheinungsbild */
.thema {
  display: inline-flex;
  flex: none;
  background: var(--flaeche-2);
  border: 1px solid var(--linie);
  border-radius: var(--r-klein);
  padding: 2px;
  gap: 2px;
}
.thema button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: clamp(26px, 7vw, 30px); height: 26px;
  border: none;
  background: transparent;
  color: var(--tinte-3);
  border-radius: 3px;
  cursor: pointer;
  padding: 0;
}
.thema button:hover { color: var(--tinte); }
.thema button[aria-pressed="true"] {
  background: var(--flaeche);
  color: var(--kenn);
  box-shadow: var(--schatten-s);
}
.thema svg { width: 15px; height: 15px; display: block; }

/* ==========================================================================
   Fusszeile
   ========================================================================== */

.fuss {
  flex: none;
  border-top: 1px solid var(--linie);
  background: var(--flaeche);
  padding: 2rem 0 2.4rem;
  font-size: .85rem;
  color: var(--tinte-3);
}
.fuss-innen { display: flex; flex-wrap: wrap; gap: 1rem 2.5rem; justify-content: space-between; }
.fuss-links { display: flex; flex-wrap: wrap; gap: .4rem 1.3rem; }
/* Im Kopf darf der Schriftzug schrumpfen - dort teilt er sich die Zeile
   mit Umschalter und Menueknopf (min-width: 0 bei .marke). Im Fuss steht
   daneben nur die Linkliste, und die nahm sich so viel Platz, dass "IDO
   DNS Service" auf 123 Pixel gequetscht wurde und rechts herauslief. */
.fuss .marke { min-width: max-content; font-size: var(--t-m); }
.fuss a { color: var(--tinte-2); text-decoration: none; }
.fuss a:hover { color: var(--kenn); text-decoration: underline; }

/* DIE KUENDIGUNGSSCHALTFLAECHE (12.09.2026).

   § 312k Abs. 2 BGB verlangt sie "unmittelbar und leicht erreichbar".
   Als zwoelfter Link zwischen elf gleich aussehenden Links waere sie das
   nicht - sie bekommt deshalb einen Rahmen und traegt ihn auch im Fuss
   als das, was sie ist: eine Schaltflaeche. Die Farbe bleibt die des
   Fusses; auffaellig muss sie nicht sein, auffindbar schon. */
.fuss-kuendigen {
  border: 1px solid var(--linie-stark, var(--linie));
  border-radius: var(--r-klein);
  padding: .18rem .6rem;
  margin: -.18rem 0;
}
.fuss-kuendigen:hover { border-color: var(--kenn); text-decoration: none; }

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

/* DER SENKRECHTE ABSTAND, UND ZWAR IN EINEM MASS (11.09.2026).
   
   Aus dem Betrieb: "Luft zwischen Ueberschriften, Boxen, Texte in
   einem gesunden Mass."
   
   ZWEI REGELN, an denen sich das nachrechnen laesst:
   
   1. UEBER EINER UEBERSCHRIFT STEHT RUND DREIMAL SO VIEL LUFT WIE
      DARUNTER. Eine Ueberschrift gehoert zu dem, was FOLGT, nicht zu
      dem, was ueber ihr steht. Sitzt sie in der Mitte, muss das Auge
      raten, welchen Absatz sie benennt - und bei einer Seite aus
      Abschnitten raet es dauernd.
   
   2. DAS MASS HAENGT AN DER SCHRIFTGROESSE, nicht an einer festen
      Zahl. Deshalb "em" und nicht "rem": Eine h2 ist im Auftritt 24
      Pixel gross und in der Arbeitsflaeche 17 - dieselbe feste Zahl
      waere einmal zu wenig und einmal zu viel. Mit em stimmt das
      Verhaeltnis von selbst, an jeder Stelle und auf jedem Schirm.
   
   Vorher stand hier eine feste Zahl fuer alle vier Stufen: .6rem
   Abstand nach unten, gleich ob darueber eine 34 Pixel hohe h1 oder
   eine 17 Pixel hohe h3 stand. Unter der h1 klebte der Text, unter der
   h3 stand er zu weit weg. */
h1, h2, h3, h4 {
  font-family: var(--schrift-titel);
  letter-spacing: -.018em;
  line-height: 1.16;
  text-wrap: balance;
  margin: 0 0 .5em;
  color: var(--tinte);
}
h1 { font-size: clamp(1.6rem, 3.6vw, 2.1rem); font-weight: 700; }
h2 { font-size: clamp(1.25rem, 2.6vw, 1.5rem); font-weight: 600; margin-top: 1.7em; }
h3 { font-size: 1.08rem; font-weight: 600; margin-top: 1.5em; }
h4 {
  font-family: var(--schrift-daten);
  font-size: .72rem;
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
  color: var(--tinte-3);
  margin: 0 0 .8rem;
}

/* EIN ABSATZABSTAND VON RUND VIER FUENFTELN EINER ZEILE.
   
   Vorher 1rem bei einer Zeilenhoehe von 1.6 - also 16 von 25.6 Pixeln,
   nicht einmal zwei Drittel. Zwei Absaetze lesen sich dann als einer
   mit einem Knick darin; der Blick findet beim Zurueckspringen den
   Anfang nicht wieder.
   
   Eine ganze Leerzeile waere das andere Extrem: Dann zerfaellt ein
   Gedankengang in Zettel. Vier Fuenftel sind der Punkt, an dem man
   die Zaesur sieht, ohne dass der Zusammenhang reisst. */
p { margin: 0 0 1.25rem; }
.vorspann { font-size: 1.05rem; color: var(--tinte-2); }
.klein { font-size: var(--t-s); color: var(--tinte-3); }
/* Schluessel, Adressen und Hostnamen kennen keine Leerzeichen. Ohne
   eine Erlaubnis zum Umbruch laeuft "vermittlung.idodns.de:51820" auf
   einem 375-Pixel-Bildschirm einfach aus dem Bild - lieber ein Umbruch
   mitten in der Adresse als eine Seite, die seitlich wegrutscht. */
.mono { font-family: var(--schrift-daten); overflow-wrap: anywhere; }
.zahl { font-family: var(--schrift-daten); font-variant-numeric: tabular-nums; }
/* Der Steuerzusatz unter einem Betrag ("22,61 € brutto") gehoert
   zusammen. In der schmalen Monatsspalte der Preistabelle brach er
   sonst zwischen Zahl und Wort um und stand dreizeilig da.

   NUR EIN SPAN, UND NUR UNMITTELBAR IN DER ZELLE (Befund 07.09.2026:
   "ich moechte keine Scrollbalken links nach rechts"). Als
   Nachfahrenregel galt sie fuer alles Kleingedruckte irgendwo unter
   einer Datenzelle - auch fuer den Aufklapper "Erreichbare Netze" der
   Gegenstellentabelle, der ebenfalls .klein traegt. Fliesstext ohne
   Umbruch macht eine Zelle so breit wie ihr laengster Satz: Die
   Tabelle stand mit 2790 statt 982 Pixeln da, und darunter lag eine
   Bildlaufleiste ueber die ganze Seite.

   "> .klein" allein reicht dafuer nicht: Der Aufklapper ist ein
   direktes Kind der Zelle. Der Zusatz, um den es ging, ist immer ein
   <span> - ein Element, in dem kein Absatz stehen kann. */
.zahl > span.klein { white-space: nowrap; }
.gedaempft { color: var(--tinte-3); }
.betont { font-weight: 600; }

.seitenkopf {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 1rem;
  margin-bottom: 1.4rem;
}
.seitenkopf h1, .seitenkopf h2 { margin-bottom: .15rem; }
/* Der Untertitel unter dem Seitentitel ist ein Satz. Ohne Mass lief er
   ueber die ganze Fensterbreite - je nach Seite 609 bis 1137 Pixel.
   Zentral hier, damit es niemand je Vorlage nachtragen muss.

   Das Mass ist --doku-breite und nicht --lesebreite: Unter dieser
   Ueberschrift steht oft eine Angabenzeile ("Fremdkunde . fremdkunde .
   Netz 10.80.14.0/24 . 3 Gegenstellen"), und die bei 52 Zeichen
   umzubrechen trennt "3" von "Gegenstellen". */
.seitenkopf p { margin: 0; max-width: var(--doku-breite); }

.zurueck {
  display: inline-block;
  font-family: var(--schrift-daten);
  font-size: .78rem;
  color: var(--tinte-3);
  text-decoration: none;
  margin-bottom: .8rem;
}
.zurueck:hover { color: var(--kenn); }

/* Die Brotkrume der Anleitungen. Sie steht dort, wo vorher der
   Rueckwaertspfeil stand, und sagt zusaetzlich, WO man ist - dieselbe
   Auskunft, die auch in den Strukturdaten steht. Umbricht auf dem Handy,
   statt die Seite breiter zu machen. */
.brotkrume {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .35rem;
  font-family: var(--schrift-daten);
  font-size: .78rem;
  color: var(--tinte-3);
  margin-bottom: .8rem;
}
.brotkrume a { color: inherit; text-decoration: none; }
.brotkrume a:hover { color: var(--kenn); }
.brotkrume [aria-current="page"] { color: var(--tinte-2); }

/* ==========================================================================
   Flaechen
   ========================================================================== */

.karte {
  background: var(--flaeche);
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  /* MEHR LUFT (Wunsch vom 09.09.2026: "gerne noch etwas Platz
     lassen"). Die Karte hatte 1.4/1.5rem und 1.2rem Abstand nach
     unten; das war dicht gesetzt und wirkte gedraengt, seit die
     Karten nebeneinander stehen statt untereinander.
     
     RUNDUM GLEICH VIEL (11.09.2026). Bis dahin standen 1.5rem oben
     und unten gegen 1.75rem links und rechts - der Unterschied ist
     klein genug, um nicht als Absicht zu gelten, und gross genug, um
     die Karte oben und unten gedrungen wirken zu lassen. Gleich viel
     auf allen vier Seiten ist die ruhigere Loesung und eine
     Entscheidung weniger.
     
     Die Arbeitsflaeche bleibt dichter - siehe "Dichte der
     Arbeitsflaeche" weiter unten. Dort wird gearbeitet, nicht
     gelesen. */
  padding: 1.75rem;
  margin-bottom: var(--a-6);
}
.karte--eng { padding: 1rem 1.15rem; }
.karte > :last-child { margin-bottom: 0; }

/* KARTENVARIANTEN. Hervorgehoben (die empfohlene, die laufende) und
   Gefahr (Loeschen, Kuendigen) - statt border-color inline. Sie MUESSEN
   hinter .karte stehen, siehe der Block ganz oben in dieser Datei. */
.karte--betont { border-color: var(--kenn); }
.karte--gefahr { border-color: var(--inaktiv); }
.karte--still  { background: var(--flaeche-2); border-color: var(--linie-zart); }

.raster { display: grid; gap: 1rem; }
@media (min-width: 720px) {
  .raster--zwei { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px) {
  .raster--drei { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .raster--vier { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* Ueberschrift ueber einer Kartengruppe. Sie traegt die Trennung
   zwischen zwei Gruppen allein - deshalb der grosse Abstand nach oben
   und der kleine nach unten: Die Ueberschrift gehoert sichtbar zu dem,
   was UNTER ihr steht. */
.gruppentitel {
  font-size: 1.05rem;
  letter-spacing: .02em;
  margin: 2.2rem 0 .9rem;
}
.gruppentitel:first-of-type { margin-top: 0; }

/* Die Gruppen des Wissensspeichers.

   Der Abstand haengt an der GRUPPE und nicht an der Ueberschrift:
   Seit jede Gruppe in einem eigenen <section> steht, ist ihre
   Ueberschrift dort "first-of-type" - und die Regel darueber nahm allen
   den Abstand nach oben. Die dritte Gruppe klebte an der zweiten. */
[data-wissen-gruppe] + [data-wissen-gruppe] { margin-top: 2.6rem; }
[data-wissen-gruppe] .gruppentitel { margin-top: 0; }

/* Das Filterfeld traegt die ganze Karte - ein halbbreites Suchfeld
   sieht aus, als gehoerte etwas daneben. */
.wissen-filter { width: 100%; }

/* DIE SUCHE ALS ERSTES UND GROSS (07.09.2026).

   Vorher eine schmale Zeile zwischen Ueberschrift und Reiterleiste -
   die las sich wie ein Filter fuer die Liste darunter. Wer eine
   Hilfeseite oeffnet, hat aber ein Wort im Kopf und keine Lust, sich
   durch eine fremde Ordnung zu klicken. Also bekommt das Feld das
   Gewicht, das der Sache entspricht. */
.wissen-suchkopf {
  /* UEBER ALLE SPALTEN (09.09.2026). Der Suchkopf steht jetzt im
     Rahmen, ausserhalb des Rasters aus Baum und Inhalt - er nimmt die
     ganze Breite, die die Seite hat. Feld und Knopf in einer Zeile;
     auf dem Telefon bricht der Knopf unter das Feld, statt es auf
     Briefmarkengroesse zu druecken. */
  display: flex;
  flex-wrap: wrap;
  gap: var(--a-3);
  align-items: center;
  margin: 0 0 var(--a-6);
}
.wissen-suchkopf > .wissen-filter { flex: 1 1 18rem; min-width: 0; }
.wissen-suchkopf > .nachsatz { flex: 1 0 100%; margin: 0; }
.wissen-suchknopf { flex: 0 0 auto; }
.wissen-filter--gross { font-size: 1.02rem; padding: .7rem .9rem; }

/* DIE BEREICHE ALS KACHELN.

   Dieselbe Umschaltmechanik wie die Reiterleiste, aber mit dem Satz
   dabei, worum es in einem Bereich geht. Drei Woerter in einer
   Reiterleiste verlangen, dass man raet. */
.wissen-kacheln {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
  gap: .8rem;
  margin: 0 0 1.8rem;
}
.wissen-kacheln a {
  display: block;
  padding: .85rem 1rem;
  border: 1px solid var(--linie);
  border-radius: var(--rundung, 10px);
  background: var(--flaeche);
  color: var(--tinte-2);
  text-decoration: none;
  transition: border-color .15s ease, transform .15s ease;
}
.wissen-kacheln a:hover,
.wissen-kacheln a:focus-visible { border-color: var(--kenn); transform: translateY(-1px); }
.wissen-kacheln a[aria-current="true"] {
  border-color: var(--kenn);
  box-shadow: inset 0 0 0 1px var(--kenn);
}
.wissen-kacheln a[aria-current="true"] strong { color: var(--kenn); }
/* Der empfohlene Einstieg: drei Verweise in einer Zeile. Bewusst
   keine Kaesten - die Bereichskacheln stehen direkt darunter, und zwei
   Dreierreihen uebereinander sind eine Wand. */
.wissen-einstieg { margin: 0 0 .4rem; line-height: 1.9; }
.wissen-einstieg a { font-weight: 600; }
.wissen-trenner { color: var(--tinte-3); margin: 0 .45rem 0 .3rem; }

/* DIE THEMENKACHELN DER HAEUFIGEN FRAGEN.

   Wie die Bereichskacheln der Anleitungen, aber mit einem Symbol: Sechs
   Kacheln untereinander sehen sonst aus wie sechs Absaetze. Das Symbol
   traegt keine Aussage - es gibt dem Auge einen Ankerpunkt, damit man
   die gesuchte Kachel wiederfindet, ohne jedes Mal zu lesen. */
.fragen-kacheln {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
  gap: .8rem;
  margin: 0 0 2.2rem;
}
.fragen-kacheln a {
  display: block;
  padding: .95rem 1.05rem;
  border: 1px solid var(--linie);
  border-radius: var(--rundung, 10px);
  background: var(--flaeche);
  color: var(--tinte-2);
  text-decoration: none;
  transition: border-color .15s ease, transform .15s ease;
}
.fragen-kacheln a:hover,
.fragen-kacheln a:focus-visible { border-color: var(--kenn); transform: translateY(-1px); }
.fragen-kachel-kopf {
  display: flex;
  align-items: center;
  gap: .55rem;
  margin-bottom: .3rem;
}
.fragen-kachel-kopf svg { width: 1.35rem; height: 1.35rem; flex: none; color: var(--kenn); }
.fragen-kachel-kopf strong { color: var(--tinte-1); }
/* Die Zahl rutscht ans Ende der Zeile, nicht neben den Namen. */
.fragen-kachel-kopf .wissen-zahl { margin-left: auto; }

/* EINE FRAGE UND IHRE ANTWORT.

   Die Frage traegt ein Sprungziel, damit der Support auf GENAU eine
   Antwort verweisen kann statt auf die Seite. scroll-margin-top, weil
   sonst die Ueberschrift unter der Kopfzeile klebt, wenn jemand einem
   solchen Verweis folgt. */
.fragen { display: grid; gap: 0 1.6rem; align-items: start; }
.frage {
  scroll-margin-top: 5rem;
  max-width: 60ch;
  border-bottom: 1px solid var(--linie-zart);
}
.frage > summary {
  list-style: none;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: .8rem;
  padding: .85rem 0;
  cursor: pointer;
}
.frage > summary::-webkit-details-marker { display: none; }
.frage > summary::after {
  content: "";
  flex: none;
  width: .55rem;
  height: .55rem;
  margin-top: .35rem;
  border-right: 2px solid var(--tinte-3);
  border-bottom: 2px solid var(--tinte-3);
  transform: rotate(45deg);
  transition: transform .15s ease;
}
.frage[open] > summary::after { transform: rotate(-135deg); margin-top: .55rem; }
.frage > summary:hover h3 { color: var(--kenn); }
.frage > summary:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
.frage h3 { margin: 0; font-size: 1rem; line-height: 1.4; }
.frage p { margin: 0 0 1rem; color: var(--tinte-2); }
@media (prefers-reduced-motion: reduce) { .frage > summary::after { transition: none; } }

.wissen-kachel-kopf {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .5rem;
  margin-bottom: .25rem;
}

/* DER UMSCHALTER ZWISCHEN DEN BEREICHEN.

   WOFUER (06.09.2026): "Stelle dir vor, ich habe nach einem Jahr 100
   Geraete getestet und der Kunde muss scrollen." Ein Bereich auf
   einmal, mit der Zahl daneben - so bleibt die Seite gleich lang,
   egal ob es dreizehn Beitraege sind oder dreihundert.

   Ohne JavaScript sind es Sprungmarken auf die Abschnitte darunter,
   und alle bleiben sichtbar. Die Reiter sind deshalb <a> und keine
   <button>: Ein Knopf, der ohne Skript nichts tut, ist eine Luege. */
.wissen-reiter {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  margin: 0 0 1.6rem;
  border-bottom: 1px solid var(--linie);
  padding-bottom: .7rem;
}
.wissen-reiter a {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  padding: .4rem .8rem;
  border: 1px solid var(--linie);
  border-radius: 999px;
  background: var(--flaeche);
  color: var(--tinte-2);
  font-size: .9rem;
  text-decoration: none;
  transition: border-color .15s ease, color .15s ease;
}
.wissen-reiter a:hover { border-color: var(--kenn); color: var(--kenn); }
.wissen-reiter a[aria-current="true"] {
  border-color: var(--kenn);
  background: var(--kenn);
  color: var(--auf-kenn);
  font-weight: 600;
}
.wissen-zahl {
  font-family: var(--schrift-daten);
  font-size: .74rem;
  padding: .05rem .4rem;
  border-radius: 999px;
  background: var(--flaeche-2);
  color: var(--tinte-3);
}
.wissen-reiter a[aria-current="true"] .wissen-zahl {
  background: var(--flaeche);
  color: var(--kenn);
}

/* Die zweite Reihe - die Gruppen des offenen Bereichs. Leiser als die
   erste: Sie ordnet innerhalb dessen, was schon gewaehlt ist. */
.wissen-reiter--zweit {
  border-bottom: none;
  margin-bottom: 1.1rem;
  padding-bottom: 0;
}
.wissen-reiter--zweit a { padding: .28rem .65rem; font-size: .84rem; }

/* DIE ZWEITE ORDNUNGSEBENE innerhalb eines Bereichs - Hersteller beim
   Fernzugriff, System beim Speicher. Zwanzig Zeilen unter einer
   Ueberschrift liest man; hundert untereinander nicht. */
.wissensgruppe + .wissensgruppe { margin-top: 1.3rem; }
.wissensgruppe h3 {
  font-family: var(--schrift-daten);
  font-size: .72rem;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--tinte-3);
  margin: 0 0 .45rem;
}

/* DIE ANLEITUNGSUEBERSICHT IST EIN INHALTSVERZEICHNIS.

   BEFUND (06.09.2026): "Anleitungen ist voll kagge, die Suche ist toll,
   aber der Rest ist nicht so uebersichtlich und wirkt einfach nur voll."

   Sie war eine Wand aus dreizehn Karten zu je drei Zeilen - jede mit
   Rahmen, jede gleich schwer, ueber achtzehnhundert Pixel. Eine Karte
   wirbt fuer etwas; hier sucht aber jemand, der schon weiss, was er
   will. Der sucht eine ZEILE.

   Also eine Liste: eine Zeile je Beitrag, Titel links, wofuer er gilt
   daneben, alles auf einer Grundlinie. Was sich untereinander
   ausrichtet, laesst sich ueberfliegen; dreizehn Rahmen nicht. */
.wissensliste {
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  background: var(--flaeche);
  overflow: hidden;
  /* MEHRSPALTIG, SOBALD PLATZ IST. Ein Inhaltsverzeichnis ueber die
     ganze Breite verschenkt zwei Drittel davon - und macht aus dreissig
     Eintraegen eine Seite Scrollen. Unter 26rem je Spalte bleibt es
     einspaltig; dann ist es ein Telefon. */
  display: grid;
  /* min(100%, 26rem): Auf einem 375-Pixel-Telefon sind 26rem mehr als
     die Seite breit ist - die Zeilen liefen rechts aus dem Bild
     (Befund 08.09.2026). */
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 26rem), 1fr));
}
.wissenszeile {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .2rem .8rem;
  padding: .7rem 1rem;
  border-top: 1px solid var(--linie-zart);
  color: inherit;
  text-decoration: none;
}
.wissensliste > .wissenszeile:first-child { border-top: none; }
/* In der zweiten Spalte faengt die Liste optisch neu an - dort darf
   die erste Zeile auch keinen Strich tragen. Zwei Spalten sind das
   Uebliche; bei drei bleibt eine Linie zu viel stehen, und das ist
   weniger schlimm als eine fehlende. */
@media (min-width: 56rem) {
  .wissensliste > .wissenszeile:nth-child(2) { border-top: none; }
}
.wissenszeile:hover,
.wissenszeile:focus-visible { background: var(--flaeche-2); }
.wissenszeile:focus-visible { outline: 2px solid var(--kenn); outline-offset: -2px; }
.wissenszeile strong { font-weight: 600; }
/* Wofuer der Beitrag gilt - die Geraete. Sie nehmen den Rest der Zeile
   und rutschen auf schmalen Geraeten unter den Titel. */
.wissenszeile-geraete {
  flex: 1 1 12rem;
  min-width: 0;
  font-size: .86rem;
  color: var(--tinte-3);
}
.wissenszeile-stand { font-size: .78rem; color: var(--tinte-3); font-family: var(--schrift-daten); }

/* ==========================================================================
   Das Wissensportal - Baum, Spalten, Inhaltsverzeichnis
   ==========================================================================

   DER AUFBAU (09.09.2026, docs/wissensportal.md): Anleitungen und
   haeufige Fragen sind ein zusammenhaengendes Nachschlagewerk. Was das
   ausmacht, sind drei Dinge - eine Navigation, die stehen bleibt;
   Themenseiten zwischen Uebersicht und Beitrag; ein Inhaltsverzeichnis
   je Seite. Uebernommen ist diese ORDNUNG, nicht eine fremde Optik:
   Farben, Schrift und Abstaende sind die aus :root, und es kommt kein
   einziger neuer Wert dazu. */

/* SCHMAL IST ES EINE SPALTE. Auf dem Telefon liest man, man navigiert
   nicht - der Baum steht dort eingeklappt ueber dem Text und nicht
   daneben. display:block statt Raster: Was untereinander steht, braucht
   keine Spaltenanweisung, und nichts kann seitlich herauslaufen. */
.wissen-seite { display: block; }

/* Der Aufklapper traegt den Baum NICHT in sich, er steht davor.

   WESHALB: Ein geschlossenes <details> verbirgt seinen Inhalt auf eine
   Art, die sich in aelteren Browsern nicht wieder aufheben laesst -
   derselbe Baum liesse sich auf breiten Bildschirmen dann nur mit
   JavaScript zeigen, und ohne Skript stuende dort gar keine Navigation.
   Als Geschwister genuegt eine Regel: breit ist der Aufklapper weg und
   der Baum steht; schmal steht der Aufklapper, und der Baum erscheint,
   wenn er offen ist. Beides ohne ein einziges Skript. */
.wissen-baum-klapp {
  border: 1px solid var(--linie);
  border-radius: var(--r);
  background: var(--flaeche);
  padding: var(--a-2) var(--a-4);
  margin-bottom: var(--a-4);
}
.wissen-baum-klapp > summary { cursor: pointer; font-weight: 600; font-size: var(--t-s); }
.wissen-baum-klapp > summary:hover { color: var(--kenn); }

@media (max-width: 999px) {
  .wissen-baum-klapp:not([open]) + .wissen-baum { display: none; }
  .wissen-baum { margin-bottom: var(--a-5); }
}

/* BREIT WIRD DARAUS EIN RASTER: links der Baum, rechts der Inhalt.

   15rem fuer den Baum - breit genug fuer "Cloud-Speicher" und den
   laengsten Beitragstitel in zwei Zeilen, schmal genug, dass der Inhalt
   auch neben der Seitenleiste des Kundenbereichs noch eine Spalte und
   keine Rinne ist. Das Verzeichnis steht bis 1400 px OBEN im Inhalt
   (Zeile 1 derselben Spalte) und hat darunter keinen eigenen Platz -
   die Zeile ist leer und damit null hoch, wenn es keines gibt. */
@media (min-width: 1000px) {
  .wissen-seite {
    display: grid;
    grid-template-columns: 15rem minmax(0, 1fr);
    grid-template-areas: "baum inhalt";
    gap: 0 var(--a-6);
    align-items: start;
  }
  .wissen-baum { grid-area: baum; }
  .wissen-hauptspalte { grid-area: inhalt; min-width: 0; }
  .wissen-baum-klapp { display: none; }

  /* Die Leiste bleibt beim Rollen stehen - der Text scrollt, die
     Orientierung nicht. Der Abstand nach oben laesst die feste
     Kopfzeile frei; wird der Baum laenger als der Bildschirm, rollt er
     fuer sich. */
  .wissen-baum {
    position: sticky;
    top: var(--a-8);
    max-height: calc(100vh - var(--a-8) - var(--a-5));
    overflow-y: auto;
  }
}

/* ANGEMELDET STEHT LINKS SCHON EINE LEISTE (Befund 09.09.2026).
   Zwischen 1000 und 1200 Pixeln blieben dem Text neben der
   Seitenleiste des Kundenbereichs UND dem Baum nur gut vierhundert
   Pixel - zu wenig fuer eine Anleitung, in der Befehlszeilen und
   Wertelisten stehen. Dort klappt der Baum deshalb noch zusammen; die
   Orientierung ist einen Klick entfernt, der Text hat seine Breite.

   Gemessen wird das Fenster und nicht die Inhaltsflaeche - eine
   Container-Abfrage waere genauer, aber sie haengt an einem
   `container-type`, das die ganze Arbeitsflaeche zu einem eigenen
   Bezugsrahmen machte und damit an Stellen wirkt, die hier niemand
   geprueft hat. Der Haltepunkt kostet nichts und tut dasselbe. */
@media (min-width: 1000px) and (max-width: 1199px) {
  .arbeit-inhalt .wissen-seite { display: block; }
  .arbeit-inhalt .wissen-baum-klapp { display: block; }
  .arbeit-inhalt .wissen-baum-klapp:not([open]) + .wissen-baum { display: none; }
  .arbeit-inhalt .wissen-baum {
    position: static;
    max-height: none;
    overflow-y: visible;
    margin-bottom: var(--a-5);
  }
}

/* AB 1400 PX HAT DAS VERZEICHNIS EINE EIGENE SPALTE. Darunter waere sie
   eine dritte Rinne neben Baum und Text; darueber ist Platz, und ein
   Verzeichnis, das beim Lesen stehen bleibt, ist genau dann etwas wert,
   wenn die Seite lang ist. */
@media (min-width: 1400px) {
  .wissen-seite {
    grid-template-columns: 15rem minmax(0, 1fr) 15rem;
    grid-template-areas: "baum inhalt verzeichnis";
  }
  .wissen-seite > .wissen-inhalt {
    grid-area: verzeichnis;
    position: sticky;
    top: var(--a-8);
    max-height: calc(100vh - var(--a-8) - var(--a-5));
    overflow-y: auto;
    margin-bottom: 0;
  }
}

/* HIER STAND EINE OBERGRENZE und mit ihr die letzte Bremse (Wunsch vom
   09.09.2026: die ganze Breite nutzen). Sie ist weg: Das Portal fuellt
   das Fenster wie jede andere Seite. Was nicht mitwaechst, ist die
   Laufweite des Fliesstextes - die haengt am Absatz (.lesebreite), und
   die beiden Randspalten stehen ohnehin fest bei 15rem. Auf einem
   breiten Bildschirm wird also der Text breiter, und genau dafuer gibt
   es in einer Anleitung Wertelisten, Befehlsbloecke und Bilder. */

/* DER TEXTKOERPER EINER PORTALSEITE HAT EIN MASS, die Seite nicht.
   
   Die Flaeche fuellt das Fenster; was den Absatz begrenzt, ist der
   Absatz. Alles, was von der Breite lebt, ist ausgenommen: Befehle und
   Ausgaben (sie scrollen lieber, als umzubrechen), Tabellen,
   Wertelisten, Bilder, Karten und Raster - genau die Bausteine, wegen
   derer eine Anleitung ueberhaupt breit sein will. */
.wissen-hauptspalte > p,
.wissen-hauptspalte > ul,
.wissen-hauptspalte > ol,
.wissen-hauptspalte > .karte > p,
.wissen-hauptspalte > .karte > ul,
.wissen-hauptspalte > .karte > ol,
.wissen-hauptspalte section > p,
.wissen-hauptspalte section > ul,
.wissen-hauptspalte section > ol,
.wissen-hauptspalte .hinweiskasten > p {
  max-width: var(--doku-breite);
}

/* DER BAUM. Zwei Ebenen, mehr nicht: Thema und Beitrag. Eine dritte
   waere die Gruppe ("AVM", "Telekom") - in einer 15rem-Spalte waeren
   das drei Einrueckungen und am Ende mehr Struktur als Text. */
.wissen-baum { font-size: var(--t-s); }
.wissen-ast + .wissen-ast { margin-top: var(--a-1); }
.wissen-zweig {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--a-2);
  padding: var(--a-2) var(--a-3);
  border-radius: var(--r-klein);
  border-left: 2px solid transparent;
  color: var(--tinte-2);
  font-weight: 600;
  text-decoration: none;
}
.wissen-zweig:hover { color: var(--tinte); background: var(--flaeche-2); }
/* "hier entlang" (aria-current="true", der offene Zweig) und "hier
   stehen Sie" (aria-current="page") sehen gleich aus: Beides ist der
   Weg, auf dem man ist. Den Unterschied traegt die Vorlesehilfe, nicht
   die Farbe - sichtbar unterschieden waeren es zwei Hervorhebungen
   uebereinander, und dann hebt keine mehr etwas hervor. */
.wissen-zweig[aria-current] {
  color: var(--kenn);
  background: var(--kenn-bg);
  border-left-color: var(--kenn);
}
.wissen-zweig[aria-current] .wissen-zahl { background: var(--flaeche); color: var(--kenn); }

.wissen-blaetter {
  list-style: none;
  margin: var(--a-1) 0 var(--a-3);
  padding: 0;
  /* Die Linie zeigt, was zu welchem Zweig gehoert - ohne sie waeren
     zwei eingerueckte Bloecke untereinander nur zwei Bloecke. */
  border-left: 1px solid var(--linie);
  margin-left: var(--a-3);
}
.wissen-blaetter a {
  display: block;
  padding: var(--a-1) var(--a-3);
  margin-left: -1px;
  border-left: 2px solid transparent;
  color: var(--tinte-3);
  text-decoration: none;
}
.wissen-blaetter a:hover { color: var(--kenn); }
.wissen-blaetter a[aria-current="page"] {
  color: var(--kenn);
  font-weight: 600;
  border-left-color: var(--kenn);
}

/* DAS INHALTSVERZEICHNIS. Es entsteht erst im Browser (wissen.js) - ohne
   Skript bleibt die Seite vollstaendig, nur ohne Verzeichnis. Deshalb
   steht hier auch kein leerer Kasten fuer den Fall, dass keines kommt. */
.wissen-seite .wissen-inhalt {
  border: 1px solid var(--linie);
  border-radius: var(--r);
  background: var(--flaeche);
  padding: var(--a-4);
  margin: 0 0 var(--a-5);
  font-size: var(--t-s);
}
/* Mit .wissen-seite davor, und das ist Absicht: Im Kundenbereich gilt
   sonst .arbeit-inhalt h2 (gleiche Staerke, spaeter in dieser Datei),
   und der Kasten truege den Grad einer Abschnittsueberschrift. */
.wissen-seite .wissen-inhalt h2 {
  font-family: var(--schrift-daten);
  font-size: var(--t-etikett);
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--tinte-3);
  margin: 0 0 var(--a-2);
}
.wissen-seite .wissen-inhalt ol { list-style: none; margin: 0; padding: 0; }
.wissen-seite .wissen-inhalt li + li { margin-top: var(--a-1); }
.wissen-seite .wissen-inhalt a { color: var(--tinte-2); text-decoration: none; }
.wissen-seite .wissen-inhalt a:hover { color: var(--kenn); text-decoration: underline; }

/* DER KOPF EINER THEMENSEITE. Kein .seitenkopf: Der ordnet Titel und
   Knoepfe nebeneinander, und hier gibt es keine Knoepfe - nur den Titel,
   den Satz darunter und den Verweis auf die Leistung. */
.wissen-thema-kopf { margin-bottom: var(--a-5); }
.wissen-thema-kopf h1 { margin-bottom: var(--a-2); }
.wissen-thema-kopf p { margin: 0 0 var(--a-2); }
.wissen-thema-kopf p:last-child { margin-bottom: 0; }

/* Eine Zeile "Zusatzkontingent": links die Erklaerung, rechts das
   Zahlenfeld mit Knopf. Auf schmalen Geraeten untereinander - ein
   Zahlenfeld neben drei Zeilen Text ergaebe dort zwei sehr schmale
   Spalten. */
.zusatz-zeile {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: .8rem;
  padding: .9rem 0;
  border-top: 1px solid var(--linie-zart);
}
.zusatz-zeile:first-of-type { border-top: none; padding-top: .3rem; }
.zusatz-text { flex: 1 1 20rem; min-width: 0; }
.zusatz-form { display: flex; gap: .5rem; align-items: center; margin: 0; flex: 0 0 auto; }
.zusatz-form input[type="number"] { width: 5.5rem; }

.trennlinie { border: none; border-top: 1px solid var(--linie-zart); margin: 1.6rem 0; }

/* ==========================================================================
   Tabellen
   ========================================================================== */

.tabelle-rahmen {
  overflow-x: auto;
  /* BEZUGSPUNKT FUER ALLES ABSOLUT GESETZTE DARIN (Befund 07.09.2026).

     In den Kopfzeilen steht Text nur fuer Vorleseprogramme
     (.nur-vorlesen, position: absolute). Ohne einen gesetzten Vorfahren
     bezog er sich auf die Seite selbst - und weil er in einer breiten
     Tabelle steht, ragte er weit ueber den rechten Rand hinaus. Der
     Rahmen hier scrollt, der Text aber lag ausserhalb von ihm: Die
     GANZE Seite bekam eine waagerechte Bildlaufleiste, auf der
     Preisseite ebenso wie im Kundenbereich.

     Ein Bezugspunkt genuegt. Der Vorlesetext bleibt, wo er hingehoert,
     und wird mit dem Rahmen beschnitten. */
  position: relative;
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  background: var(--flaeche);
  margin-bottom: 1.2rem;
}
table { width: 100%; border-collapse: collapse; font-size: .9rem; }
th, td { text-align: left; padding: .7rem .95rem; border-bottom: 1px solid var(--linie-zart); }
thead th {
  font-family: var(--schrift-daten);
  font-size: var(--t-etikett);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--tinte-3);
  background: var(--flaeche-2);
  border-bottom: 1px solid var(--linie);
  /* UMBRECHEN DUERFEN SIE (Befund 07.09.2026, "keine Scrollbalken links
     nach rechts"). "Gegenstellen je Netz" einzeilig sind 178 Pixel, die
     jede Spalte darunter mitschleppt - bei sieben Spalten hundert
     Pixel, die niemand braucht. Zweizeilige Ueberschriften kosten eine
     Zeile Hoehe und sparen eine Bildlaufleiste. */
  white-space: normal;
}
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover td { background: var(--flaeche-2); }
td.rechts, th.rechts { text-align: right; }

/* GRUPPENZEILE - eine Ueberschrift innerhalb einer Tabelle.

   Gebraucht, seit die Preisuebersicht Tarife und Zusaetze trennt
   (13.09.2026): Der Unterschied ist der wichtigste auf der Seite, und
   eine Spalte, die man Zeile fuer Zeile lesen muss, traegt ihn nicht.

   Bewusst KEINE eigene Flaeche und kein Rahmen: Sie soll die Tabelle
   gliedern, nicht in ihr stehen. Ein Strich oben genuegt - ausser bei
   der ersten, die schon einen vom Tabellenkopf hat. */
tr.gruppenzeile td {
  padding-top: 1.4rem;
  padding-bottom: .45rem;
  border-bottom: 1px solid var(--linie);
  background: none;
}
tr.gruppenzeile:first-child td { padding-top: .7rem; }
tr.gruppenzeile strong { font-size: var(--t-s); letter-spacing: .04em; text-transform: uppercase; }
tr.gruppenzeile span { margin-left: .4rem; }
tr.gruppenzeile:hover td { background: none; }
td.eng { white-space: nowrap; }
/* "Eng" meint den WERT in der Zelle - ein Datum, das nicht zwischen Tag
   und Monat umbrechen soll. Ein Aufklapper darin enthaelt dagegen
   Saetze und ein Formular; ohne Umbruch stand deren laengster Satz
   einzeilig da und ragte weit ueber die Spalte hinaus (283 Pixel
   Inhalt in einer Spalte von 126). */
td.eng details { white-space: normal; }
/* Und ein Eingabefeld darin richtet sich nach der Spalte. Ein
   Datumsfeld bringt seine eigene Wunschbreite mit (rund 130 Pixel) und
   ragte damit aus einer Spalte von neunzig heraus - ueber den Knopf
   daneben und die Zeile darunter. */
td form input, td form select { max-width: 100%; min-width: 0; box-sizing: border-box; }
/* Eine Aktionsspalte traegt einen Knopf oder einen Hinweissatz - nie
   einen Wert, der nicht umbrechen darf. Auf der Tarifseite stand dort
   "zu klein für 4 Kundennetze" einzeilig und machte die Spalte zur
   breitesten der Tabelle: neunzig Pixel, die jede andere Zeile
   mitschleppte. */
td[data-spalte="Aktion"] { white-space: normal; }

.tabelle-leer { padding: 2.2rem 1.2rem; text-align: center; color: var(--tinte-3); font-size: .92rem; }

/* Eine Tabelle soll auf schmalen Bildschirmen seitlich scrollen statt sich
   zusammenzuquetschen: ohne Mindestbreite bricht MySQL-artiger Inhalt wie
   "blaue-eiche-42.idodns.de" in drei Zeilen um und die Spalten verlieren
   ihren Sinn. */
.tabelle-rahmen table { min-width: 32rem; }

/* --- Die Summenzeile einer Tabelle --------------------------------------
   Eine Zeile, die zusammenfasst, was darueber steht - sie traegt deshalb
   den Kennfarbton und eine Linie nach oben. Nicht mehr: Der Wert soll
   auffallen, nicht die Zeile schreien. */
tfoot td {
  background: var(--kenn-zart);
  border-top: 1px solid var(--linie);
  font-weight: 600;
}

/* --- Das Feld zum Selbsteintragen --------------------------------------
   Auf der Seite fuer Systemhaeuser bleibt eine Spalte leer: Dort traegt
   der Leser ein, was er heute zahlt. Wer selbst rechnet, glaubt das
   Ergebnis - wer eine fremde Rechnung vorgesetzt bekommt, prueft sie.

   Die gestrichelte Linie sagt "hier ist Platz", ohne ein Formularfeld
   vorzutaeuschen, das man ausfuellen koennte. Es ist eine gedruckte
   Seite im Browser. */
td.leerfeld {
  color: var(--tinte-3);
  border-bottom: 1px dashed var(--linie);
  min-width: 5.5rem;
}

/* --- Gestapelte Tabellen ------------------------------------------------
   Fuer die Listen, die Kunden am Handy oeffnen. Aus jeder Zeile wird eine
   Karte; die Spaltenueberschrift wandert als Beschriftung vor den Wert
   (ueber data-spalte im HTML). Seitliches Scrollen ist auf dem Telefon eine
   Zumutung - dort ist Untereinander die richtige Anordnung. */
@media (max-width: 719px) {
  .tabelle-rahmen--stapel { border: none; background: none; overflow: visible; }
  .tabelle-rahmen--stapel table { min-width: 0; }
  .tabelle-rahmen--stapel thead { display: none; }
  .tabelle-rahmen--stapel table,
  .tabelle-rahmen--stapel tbody,
  .tabelle-rahmen--stapel tfoot,
  .tabelle-rahmen--stapel tr,
  .tabelle-rahmen--stapel td { display: block; width: 100%; }

  /* Die Summenzeile bleibt auch gestapelt die Summenzeile - sonst sieht
     sie aus wie eine weitere Position. */
  .tabelle-rahmen--stapel tfoot tr { border-color: var(--kenn); }
  .tabelle-rahmen--stapel tfoot td { background: none; border-top: none; }

  /* DIE GRUPPENZEILE FAELLT IM STAPEL WEG (13.09.2026).

     Sie ist eine Ueberschrift ueber Tabellenzeilen. Gestapelt gibt es
     keine Zeilen mehr, sondern Karten - eine Ueberschrift ohne das,
     worueber sie steht, waere dort eine Karte mit einem Wort darin.
     Jede Karte traegt ihre Art ohnehin selbst in der Spalte "Art". */
  .tabelle-rahmen--stapel tr.gruppenzeile { display: none; }

  .tabelle-rahmen--stapel tr {
    background: var(--flaeche);
    border: 1px solid var(--linie);
    border-radius: var(--r-gross);
    padding: .95rem 1.05rem;
    margin-bottom: .7rem;
  }
  .tabelle-rahmen--stapel tr:hover td { background: none; }
  .tabelle-rahmen--stapel td { padding: 0; border: none; }
  /* IPv6-Adressen und Hostnamen sind laenger als ein 320-px-Bildschirm
     breit ist. In der Karte duerfen sie an jeder Stelle umbrechen -
     besser ein Umbruch mitten in der Adresse als eine Seite, die
     seitlich aus dem Bild laeuft. */
  .tabelle-rahmen--stapel td { overflow-wrap: anywhere; }
  .tabelle-rahmen--stapel td.eng { white-space: normal; }

  /* Beschriftung nur dort, wo der Wert allein nicht selbsterklaerend ist.

     NEBEN DEM WERT, NICHT DARUEBER (04.10.2026). Darueber kostete jede
     Angabe zwei Zeilen; drei Hostnamen in der Verwaltung waren 1 500
     Pixel, ein Tag des Funnels eine ganze Bildschirmhoehe. Jetzt steht
     die Beschriftung links in einer schmalen Spalte und der Wert
     daneben - wie in einem Datenblatt. Absolut gesetzt und nicht im
     Raster: Ein Raster machte aus jedem <br> und <span> im Wert eine
     eigene Zelle.

     Mindestens 12 Pixel Schrift - .68rem waren 10,9. */
  .tabelle-rahmen--stapel td[data-spalte]:not(:empty) {
    position: relative;
    padding: .3rem 0 .3rem 7.5rem;
    margin: 0;
    /* SO HOCH WIE EINE ZWEIZEILIGE BESCHRIFTUNG (05.10.2026). Die
       Beschriftung steht absolut und zaehlt nicht zur Hoehe. Bei einem
       einzeiligen Wert neben "ERSETZT / UEBLICHERWEISE" stiess sie
       sonst an die naechste Beschriftung. */
    min-height: 2rem;
  }
  .tabelle-rahmen--stapel td[data-spalte]:not(:empty)::before {
    content: attr(data-spalte);
    position: absolute;
    left: 0;
    top: calc(.3rem + .25em);
    width: 7rem;
    font-family: var(--schrift-daten);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--tinte-3);
    line-height: 1.3;
    overflow-wrap: break-word;
    hyphens: auto;
  }
  /* AUSNAHME: ZELLEN MIT VIEL DARIN. Ein Formular, ein Absatz oder ein
     Befehl in einer Spalte von 200 Pixeln wird zur Schlange - die
     Gegenstellenseite wurde so laenger statt kuerzer. Dort steht die
     Beschriftung wie zuvor darueber, und der Inhalt hat die volle Breite. */
  .tabelle-rahmen--stapel td[data-spalte]:not(:empty):has(form, p, pre, input, select, textarea, .hinweiskasten) {
    padding-left: 0;
  }
  .tabelle-rahmen--stapel td[data-spalte]:not(:empty):has(form, p, pre, input, select, textarea, .hinweiskasten)::before {
    position: static;
    display: block;
    width: auto;
    margin: .4rem 0 .2rem;
  }
  .tabelle-rahmen--stapel td.rechts { text-align: left; }
  .tabelle-rahmen--stapel td.rechts .knopf { width: 100%; margin-top: .9rem; }
  .tabelle-rahmen--stapel .tabelle-leer {
    background: var(--flaeche); border: 1px solid var(--linie); border-radius: var(--r-gross);
  }
}

/* --- Enger gesetzt zwischen Telefon und Tisch ----------------------------

   DER BEFUND (07.09.2026): "seitliches scrollen muss weck". Zwischen 720
   und 900 Pixeln scrollte die Tariftabelle des Fernzugriffs seitlich -
   sieben Spalten brauchten 840 Pixel, und da standen nur 660 zur
   Verfuegung. Unter 720 wird gestapelt, ueber 900 ist Platz; dazwischen
   war die Luecke, und dort steht ein Tablet oder ein halbiertes Fenster.

   Gestapelte Karten waeren hier falsch: Wer fuenf Tarife vergleicht,
   will die Kundennetze aller fuenf untereinander lesen. Also bleibt es
   eine Tabelle und wird enger gesetzt.

   Vier Handgriffe, zusammen 180 Pixel:
     * schmalere Zellenraender (7 Spalten x 2 Seiten);
     * kleinere Kopfzeilenschrift mit weniger Sperrung - "KUNDENNETZE"
       kostet gesperrt allein zwoelf Pixel Laufweite;
     * der Knopf darf umbrechen ("Konto / anlegen") statt die Spalte auf
       seine Zeilenlaenge aufzuspannen;
     * die Bruttozeile darf hinter dem Betrag umbrechen. Der BETRAG
       selbst bleibt zusammen - "22,61" und das Eurozeichen auf zwei
       Zeilen waeren in einer Preisspalte unlesbar; deshalb sitzt das
       nowrap dort auf dem Betrag und nicht auf der ganzen Zeile. */
@media (min-width: 720px) and (max-width: 899px) {
  .tabelle-rahmen th,
  .tabelle-rahmen td { padding-left: .45rem; padding-right: .45rem; }

  .tabelle-rahmen thead th {
    font-size: .68rem;
    letter-spacing: .03em;
    hyphens: auto;
  }

  .tabelle-rahmen td .knopf { white-space: normal; }
  .tabelle-rahmen td.zahl > span.klein { white-space: normal; }
}

/* ==========================================================================
   Formulare
   ========================================================================== */

.feldgruppe { margin-bottom: 1rem; }

/* KURZES FELD: Code aus der App, Anzahl, PLZ - so breit wie sein Inhalt,
   nicht so breit wie die Karte. Hinter .feldgruppe, siehe oben. */
.feldgruppe--kurz { max-width: 12rem; }
.feldgruppe:last-child { margin-bottom: 0; }

label {
  display: block;
  font-size: .84rem;
  font-weight: 500;
  color: var(--tinte-2);
  margin-bottom: .3rem;
}

/* Alle Felder, die Text aufnehmen, tragen dasselbe Kleid. date, number
   und url standen frueher nicht in dieser Liste - die Felder fuer
   "gueltig bis", "Menge" und "Port" hatten deshalb keinen Rahmen und
   keine Rundung, sondern das nackte Aussehen des Browsers. */
input[type="text"], input[type="email"], input[type="password"],
input[type="search"], input[type="tel"], input[type="url"],
input[type="date"], input[type="datetime-local"], input[type="number"],
select, textarea {
  width: 100%;
  padding: .6rem .75rem;
  font-family: var(--schrift-text);
  font-size: .95rem;
  color: var(--tinte);
  background: var(--flaeche-eingabe);
  /* Ein Feld muss als Feld zu erkennen sein: Rahmen mit 3:1, im
     Dunkeln eine Spur tiefer als die Karte (Befund 08.09.2026). */
  border: 1px solid var(--linie-stark);
  border-radius: var(--r-klein);
}
input:hover, select:hover, textarea:hover { border-color: var(--tinte-2); }
/* DER FOKUSRING KAM NIE AN (Befund 23, 12.09.2026).

   Ganz oben steht der gemeinsame Ring:
   :where(a, button, input, select, textarea, summary):focus-visible
   { outline: 2px solid var(--kenn) }. :where() zaehlt mit NULL, die
   Regel hat also nur (0,1,0). "input:focus" hat (0,1,1) und steht
   spaeter - das "outline: none" gewann damit zweifach, und zwar fuer
   jedes Feld der Anwendung.

   Uebrig blieb der Ersatz: ein Rahmenwechsel und ein sehr heller
   Schein. Bei Ankreuz- und Auswahlknoepfen, die keinen sichtbaren
   Rahmen haben, blieb gar nichts - wer mit der Tastatur arbeitet, sah
   nicht, wo er steht.

   Der Ring wird jetzt in DERSELBEN Regel mitgeschrieben, statt ihn
   abzuschalten und auf den Ersatz zu hoffen. Rahmenfarbe und Schein
   bleiben als Zugabe: Sie schaden nicht, sie tragen nur nicht allein.

   ":focus-visible" und nicht ":focus": Ein Mausklick ins Textfeld soll
   keinen Ring ziehen - das ist der Unterschied, den der Browser fuer
   uns macht. */
input:focus, select:focus, textarea:focus {
  border-color: var(--kenn);
  box-shadow: 0 0 0 3px var(--kenn-bg);
}
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: 2px solid var(--kenn);
  outline-offset: 2px;
}
input::placeholder, textarea::placeholder { color: var(--tinte-3); }
input:disabled, select:disabled, textarea:disabled {
  background: var(--flaeche-2);
  color: var(--tinte-3);
  cursor: not-allowed;
}

.feld-hinweis { font-size: .8rem; color: var(--tinte-3); margin: .3rem 0 0; }

/* FARBIGE HINWEISE unter Feldern und in Saetzen - statt color inline.
   Hinter .feld-hinweis, das seinerseits eine Farbe setzt. */
.feld-hinweis--warnung { color: var(--verspaetet); }
.feld-hinweis--gefahr  { color: var(--inaktiv); }

.ankreuz {
  display: flex;
  align-items: flex-start;
  gap: .6rem;
  font-size: .9rem;
  font-weight: 400;
  color: var(--tinte-2);
  cursor: pointer;
  margin-bottom: 0;
}
.ankreuz input[type="checkbox"] {
  width: 1.05rem; height: 1.05rem;
  margin: .22rem 0 0;
  accent-color: var(--kenn);
  flex: none;
  cursor: pointer;
}

.formzeile { display: grid; gap: 1rem; }
@media (min-width: 640px) {
  .formzeile--zwei { grid-template-columns: 1fr 1fr; }
  .formzeile--plz  { grid-template-columns: 8rem 1fr; }
}

.formaktionen {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .7rem;
  margin-top: 1.3rem;
}

/* FORMAKTIONEN: rechtsbuendig fuer die Zeile unter einer Tabelle oder
   am Kartenende; eng, wenn direkt unter einem Feld. Hinter der
   Grundklasse - sie setzt margin-top selbst. */
.formaktionen--rechts { justify-content: flex-end; }
.formaktionen--eng { margin-top: var(--a-2); }

/* EIN SCHMALES FELD NEBEN EINEM KNOPF (13.09.2026).

   Die Bezeichnung eines Sicherungsziels steht in derselben Zeile wie
   Groesse und Kaufknopf. Ein Feld in voller Breite waere dort ein
   Block, der die Zeile sprengt - und eine Bezeichnung ist ohnehin ein
   Wort, kein Satz. */
.formaktionen input.feld-klein {
  width: 12rem;
  max-width: 100%;
  padding: .35rem .5rem;
  font-size: .85rem;
}

/* ==========================================================================
   Schaltflaechen
   ========================================================================== */

.knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .45rem;
  padding: .6rem 1.05rem;
  font-family: var(--schrift-text);
  font-size: .9rem;
  font-weight: 500;
  line-height: 1.3;
  color: var(--auf-kenn);
  background: var(--kenn);
  border: 1px solid var(--kenn);
  border-radius: var(--r-klein);
  cursor: pointer;
  text-decoration: none;
  /* Mobil zuerst: auf schmalen Geraeten darf die Beschriftung umbrechen.
     "Fernwartungssitzung starten" passt bei 390 px in keine Zeile - mit
     nowrap schiebt der Knopf die ganze Seite seitlich aus dem Bild.
     Ab 560 px bleiben Knoepfe einzeilig, damit Werkzeugleisten ruhig
     stehen. */
  white-space: normal;
}
@media (min-width: 560px) {
  .knopf { white-space: nowrap; }
}
.knopf:hover { background: var(--kenn-2); border-color: var(--kenn-2); color: var(--auf-kenn); }
.knopf:disabled, .knopf[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }

.knopf--zweit {
  background: var(--flaeche);
  color: var(--tinte-2);
  border-color: var(--linie);
}
.knopf--zweit:hover { background: var(--flaeche-2); color: var(--tinte); border-color: var(--tinte-3); }

.knopf--gefahr {
  background: transparent;
  color: var(--inaktiv);
  border-color: var(--inaktiv);
}
.knopf--gefahr:hover { background: var(--inaktiv-bg); color: var(--inaktiv); border-color: var(--inaktiv); }

.knopf--schlicht {
  background: transparent;
  border-color: transparent;
  color: var(--tinte-2);
  padding-left: .4rem;
  padding-right: .4rem;
}
.knopf--schlicht:hover { background: var(--flaeche-2); color: var(--tinte); border-color: transparent; }

.knopf--klein { padding: .32rem .65rem; font-size: .8rem; }
.knopf--breit { width: 100%; }

/* ==========================================================================
   Status und Kennzeichnungen
   ========================================================================== */

.status {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  font-size: .82rem;
  white-space: nowrap;
}
.punkt { width: 8px; height: 8px; border-radius: 50%; flex: none; }

.status--aktiv { color: var(--aktiv); }
.status--aktiv .punkt { background: var(--aktiv); box-shadow: 0 0 0 3px var(--aktiv-bg); }
.status--verspaetet { color: var(--verspaetet); }
.status--verspaetet .punkt { background: var(--verspaetet); box-shadow: 0 0 0 3px var(--verspaetet-bg); }
.status--inaktiv { color: var(--inaktiv); }
.status--inaktiv .punkt { background: var(--inaktiv); box-shadow: 0 0 0 3px var(--inaktiv-bg); }
.status--leer { color: var(--tinte-3); }
.status--leer .punkt { background: var(--tinte-3); opacity: .5; }

.marker {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  font-family: var(--schrift-daten);
  font-size: var(--t-etikett);
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  padding: .18rem .5rem;
  border-radius: 4px;
  background: var(--flaeche-2);
  color: var(--tinte-2);
  border: 1px solid var(--linie);
}
/* Der Name "petrol" stand an sechs Stellen ohne wirksame Regel und
   fiel auf Grau zurueck - er ist ein zweiter Name fuer dieselbe
   Gestaltung wie --kenn. Beide hier zusammen, damit es dabei bleibt. */
.marker--kenn,
.marker--petrol { background: var(--kenn-bg); color: var(--kenn); border-color: var(--kenn); }
.marker--messing { background: var(--messing-bg); color: var(--messing); border-color: var(--messing); }
.marker--aktiv   { background: var(--aktiv-bg);   color: var(--aktiv);   border-color: var(--aktiv); }
.marker--warnung { background: var(--verspaetet-bg); color: var(--verspaetet); border-color: var(--verspaetet); }
.marker--gefahr  { background: var(--inaktiv-bg); color: var(--inaktiv); border-color: var(--inaktiv); }

/* --- Erste Schritte ---
   NAMEN MIT VORSILBE, UND ZWAR AUS SCHADEN KLUG (11.09.2026).

   Diese Regeln hiessen zuerst ".schritt", ".schritt-marke",
   ".schrittliste". Die Startseite hat ihre drei Schritte aber seit
   jeher unter genau diesem Namen - und mein ".schritt { display: grid;
   grid-template-columns: 2rem ... }" machte daraus ein zweispaltiges
   Raster: Die Nummer rutschte in eine 2rem schmale Spalte, der Absatz
   in die naechste Zeile derselben Spalte, und auf der Startseite stand
   jedes Wort einzeln untereinander. Gemeldet vom Betreiber, mit Bild:
   "das sieht scheisse aus".

   Ein Name wie ".schritt" gehoert niemandem. Wer einen neuen Baustein
   baut, nimmt die Vorsilbe seines Bereichs dazu - dann kann er ihn
   nicht versehentlich einem anderen wegnehmen. --- ALT: -------------------------------------------------------
   Eine nummerierte Liste, bei der die Nummer selbst der Zustand ist:
   Solange ein Schritt offen ist, steht dort seine Ziffer; ist er
   erledigt, ein Haken. Damit braucht die Zeile kein zweites Zeichen,
   das dasselbe noch einmal sagt.

   Die Nummerierung ist hier KEINE Verzierung - die Schritte bauen
   wirklich aufeinander auf (ohne Kundennetz keine Gegenstelle, ohne
   Anschrift kein Tarif). Wo eine Reihenfolge nur behauptet waere,
   gehoerte sie nicht hin. */
.einstieg-stand { display: flex; align-items: baseline; gap: 1.4rem; flex-wrap: wrap; }
.einstieg-stand > div { flex: 1 1 18rem; min-width: 0; }
.einstieg-zahl {
  font-family: var(--schrift-daten);
  font-size: 1.5rem;
  font-weight: 600;
  color: var(--tinte-2);
  white-space: nowrap;
  margin: 0;
}
.einstieg-stand p:last-child { margin-bottom: 0; }

.einstieg-liste { list-style: none; margin: var(--a-6) 0; padding: 0; }
.einstieg-schritt {
  display: grid;
  grid-template-columns: 2rem minmax(0, 1fr);
  gap: 0 1rem;
  padding: 1.25rem 0;
  border-top: 1px solid var(--linie-zart);
}
.einstieg-schritt:first-child { border-top: none; }
.einstieg-marke {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  border: 1px solid var(--linie);
  background: var(--flaeche-2);
  font-family: var(--schrift-daten);
  font-size: .9rem;
  color: var(--tinte-3);
}
.einstieg-marke svg { width: 1.05rem; height: 1.05rem; }
.einstieg-schritt--fertig .einstieg-marke {
  background: var(--aktiv-bg);
  border-color: var(--aktiv);
  color: var(--aktiv);
}
/* MIT .arbeit-inhalt DAVOR, und das ist Absicht - derselbe Grund wie
   beim Inhaltskasten der Wissensseite weiter oben: Die Erste-Schritte-
   Seite liegt im Kundenbereich, und dort gilt sonst .arbeit-inhalt h2
   (gleiche Staerke, spaeter in dieser Datei). Der Schritt truege dann
   den Grad einer Abschnittsueberschrift und 2,3rem Abstand nach oben -
   die Zeile riss vom Haekchen daneben ab. */
.arbeit-inhalt .einstieg-inhalt h2 {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .55rem;
  margin: .2rem 0 .35rem;
  font-size: 1.02rem;
}
.einstieg-inhalt p { margin: 0 0 .5rem; max-width: var(--lesebreite); }
.einstieg-inhalt > :last-child { margin-bottom: 0; }
/* ERLEDIGT HEISST RUHIG, NICHT DURCHGESTRICHEN. Durchgestrichener Text
   ist schwer zu lesen, und wer nachsehen will, was er getan hat, will
   es lesen koennen. */
.einstieg-schritt--fertig .einstieg-inhalt h2 { color: var(--tinte-2); }
.einstieg-schritt--gesperrt .einstieg-inhalt h2,
.einstieg-schritt--gesperrt .einstieg-inhalt p { color: var(--tinte-3); }

/* --- Der Abschluss einer Leistungsseite -----------------------------------
   Eine Spur abgesetzt, damit das Ende einer langen Seite als Ende
   erkennbar ist - und nicht als der nächste von zwölf Abschnitten.

   Bewusst KEINE Karte mit Rahmen und Schatten: Der Abschnitt steht am
   Fuß einer Seite, die schon aus Karten besteht; noch eine wäre dort
   ein weiteres gleich lautes Objekt. Ein ruhiger Grund und eine Linie
   darüber sagen dasselbe leiser. */
/* ZWEI KLASSEN UND NICHT EINE (Befund beim ersten Blick auf die
   gerenderte Seite): ".abschnitt" setzt "padding: <viel> 0" als
   Kurzform - und die Null an den Seiten schlaegt jedes spaetere
   padding-left gleicher Staerke. Der Kasten stand mit seinem Grund da
   und der Text klebte am Rand.

   ".abschnitt.abschluss" ist staerker als ".abschnitt" und gilt
   unabhaengig davon, wo in dieser Datei die Regel steht. */
.abschnitt.abschluss {
  background: var(--flaeche-2);
  border-radius: var(--r);
  padding: clamp(2rem, 4.5vw, 3.2rem) clamp(1.2rem, 3vw, 2.2rem);
}
.abschluss .abschnitt-kopf { margin-bottom: .6rem; }
.abschluss > p:last-child { margin-bottom: 0; }

/* --- Themenseite: Einordnung und Anschlussweg -----------------------------
   Die Einordnung steht ueber der Beitragsliste und soll gelesen werden
   koennen, ohne die Liste zu verdecken - deshalb Fliesstext im
   Lesemass und kein Kasten. Ein Kasten haette hier gesagt "das ist ein
   Hinweis", und ein Hinweis ueberspringt man.

   Der Anschlussweg steht am Fuss, hinter einer Linie: Er gehoert zum
   Ende der Seite und nicht zwischen die Anleitungen. */
.themen-einordnung { margin: 0 0 var(--a-6); }
.themen-einordnung p { margin-bottom: var(--a-4); }
.themen-einordnung p:last-child { margin-bottom: 0; }

.anschlussweg {
  margin-top: var(--a-7);
  padding-top: var(--a-6);
  border-top: 1px solid var(--linie-zart);
}
.anschlussweg h2 { margin: 0 0 .4rem; font-size: 1.05rem; }
.anschlussweg p { margin-bottom: var(--a-4); }
.anschlussweg > p:last-child { margin-bottom: 0; }

/* --- Vorspann einer Anleitung ---------------------------------------------
   Der eine Absatz unter der Ueberschrift: fuer wen, und was am Ende
   dabei herauskommt. Eine Spur groesser als der Fliesstext und ohne
   Kasten - er ist der Anfang des Textes und kein Hinweis daneben. */
/* MIT .seitenkopf DAVOR, und das ist Absicht: Der Vorspann steht in
   jedem der drei Anleitungsrahmen im Seitenkopf, und dort gilt
   .seitenkopf p (Klasse + Element, also staerker als eine Klasse
   allein). Ohne den Zusatz gewann dessen "margin: 0" - genau die
   Luft, die der Absatz unten begruendet, kam nie an; und dessen
   "max-width: var(--doku-breite)" gewann gegen die Klasse
   "lesebreite" am Element, sodass der Vorspann 76 statt 52 Zeichen
   breit lief. Gefunden bei der Gegenpruefung am 11.09.2026. */
.seitenkopf .anleitung-vorspann {
  font-size: 1.02rem;
  line-height: 1.6;
  color: var(--tinte-2);
  max-width: var(--lesebreite);
  /* Oben Luft zum Stand-Datum: Ohne sie klebte der erste Satz des
     Textes an der Zeile „Zuletzt überarbeitet am ...", und beides las
     sich wie ein Block. */
  margin: var(--a-4) 0 var(--a-6);
}

/* --- Die Sprungleiste oben auf /preise (04.10.2026) -----------------------

   Sie ersetzt an dieser Stelle zwei Uebersichtstabellen, die auf dem
   Telefon bis 2994 Pixel reichten. Eine Zeile Verweise, die umbricht,
   statt einer Tabelle, die man durchscrollt. Die Tabellen stehen jetzt
   am Ende unter "Alles auf einen Blick". */
.sprungleiste {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a-2);
  margin: 0 0 var(--a-6);
}
.sprungleiste a {
  padding: .35rem .8rem;
  border: 1px solid var(--linie);
  border-radius: 999px;
  font-size: var(--t-s);
  color: var(--tinte-2);
  text-decoration: none;
  background: var(--flaeche);
}
.sprungleiste a:hover { border-color: var(--kenn); color: var(--kenn); }
/* Der erste Abschnitt danach braucht weder Abstand noch Trennlinie:
   Beide sind fuer "Abschnitt nach Abschnitt" gedacht. Nach der Leiste
   ergaben sie ein Loch von rund 250 Pixeln - genau an der Stelle, die
   die Leiste freiraeumen sollte. */
.sprungleiste + .abschnitt { margin-top: 0; padding-top: 0; border-top: 0; }

/* --- Der aufklappbare Zahlenvergleich -------------------------------------

   Die Tarifkarten beantworten "welcher bin ich". Wer danach noch
   "und was genau ist der Unterschied" fragt, klappt das hier auf.

   ZUGEKLAPPT UND NICHT WEG: Die Zahlen sind richtig und jemand braucht
   sie - nur nicht an der Stelle, an der entschieden wird. Eine
   zugeklappte Zeile kostet eine Zeile; eine aufgeklappte Tabelle
   kostete den halben Bildschirm vor dem nächsten Angebot. */
.vergleich {
  margin: var(--a-4) 0 var(--a-5);
  border-top: 1px solid var(--linie-zart);
  padding-top: var(--a-3);
}
.vergleich > summary {
  cursor: pointer;
  font-size: var(--t-s);
  color: var(--kenn);
  font-weight: 500;
  padding: var(--a-2) 0;
  /* Der Marker bleibt: Er ist das Einzige, was ohne Text sagt, dass
     hier etwas aufgeht. */
  list-style-position: inside;
}
.vergleich > summary:hover { color: var(--kenn-2); }
.vergleich[open] > summary { margin-bottom: var(--a-3); }

/* ==========================================================================
   TARIFKARTEN - die Stelle, an der entschieden wird (04.10.2026)
   ==========================================================================

   Aus dem Betrieb: "wir bekommen keine registrierungen und keine
   kaeufe, das design ist zu klobig und nicht ansprechend, es muss ein
   redesign her was verkauft."

   GEMESSEN, BEVOR GEBAUT: Auf /preise standen zwölf Knöpfe. Keiner
   davon war ein Hauptknopf; die Kaufknöpfe steckten als
   .knopf--zweit.knopf--klein am rechten Rand einer Tabelle, 1400 Pixel
   vom Tarifnamen entfernt, in derselben Größe wie "Tarife" und
   "Einzelheiten" daneben. Eine Seite, auf der zwölf gleich laute
   Knöpfe stehen, sagt nicht, was zu tun ist.

   WAS EINE KARTE KANN, WAS EINE TABELLENZEILE NICHT KANN: Sie hält
   Name, Preis, Inhalt und Knopf in EINEM Blickfeld zusammen. Der Weg
   vom "das bin ich" zum "hier klicken" ist eine Handbreit statt einer
   Bildschirmbreite.

   DREI DINGE TRAGEN DIE KARTE, und mehr nicht: der Preis (groß), was
   drin ist (kurz), ein Knopf (ganze Breite). Alles Weitere - Zertifikat,
   Kündigungsfrist, Jahreszahlung - steht EINMAL unter der Reihe. In
   jeder Karte wiederholt, ließe es jeden Unterschied verschwinden. */

.tarifkarten {
  list-style: none;
  margin: 0 0 var(--a-5);
  padding: 0;
  display: grid;
  gap: var(--a-4);
  /* AUTO-FIT STATT FESTER SPALTENZAHL: Bei zwei Tarifen stehen zwei
     nebeneinander, bei vier vier - ohne dass eine Zahl im Stylesheet
     erraten muss, wie viele Tarife es gibt. 17rem ist die Breite, unter
     der "Gegenstellen je Netz" zweizeilig wird.

     UND EINE OBERGRENZE JE KARTE (22rem), nicht 1fr. Mit 1fr spannten
     zwei Karten ueber die ganze Werkbank: 600 Pixel je Karte, in denen
     ein Preis und vier kurze Zeilen stehen. Das sah nicht grosszuegig
     aus, sondern leer - und die Augenbewegung vom Preis zum Knopf war
     wieder so weit wie in der Tabelle davor. Zwischen 272 und 352
     Pixeln bleibt eine Karte ein Blickfeld.

     justify-content: center haelt die Reihe dann in der Mitte, statt
     zwei Karten links kleben zu lassen. */
  grid-template-columns: repeat(auto-fit, minmax(17rem, 22rem));
  justify-content: center;
  align-items: stretch;
}

.tarifkarte {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: var(--a-5);
  background: var(--flaeche);
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  /* RELATIVE POSITION FUER DIE FAHNE, die halb über den Rand ragt. */
  position: relative;
}

/* DIE EMPFOHLENE KARTE.

   Sie hebt sich durch die KANTE ab, nicht durch eine Farbfläche: Eine
   petrolfarbene Karte zwischen zwei weißen zieht den Blick so stark,
   dass die beiden anderen wie Ausschuss wirken - und das sind sie
   nicht, sie sind für andere Häuser richtig. Eine kräftigere Linie
   sagt "schau hier zuerst" und nicht "die anderen kannst du
   überspringen". */
.tarifkarte--hervor {
  border-color: var(--kenn);
  box-shadow: var(--schatten);
}

.tarifkarte-fahne {
  position: absolute;
  top: 0;
  left: var(--a-5);
  transform: translateY(-50%);
  margin: 0;
  padding: .15rem .6rem;
  background: var(--kenn);
  color: var(--auf-kenn);
  border-radius: 999px;
  font-size: .72rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
}

/* Im Arbeitsbereich steht alles an der linken Kante - Ueberschrift,
   Satz, Tabelle. Mittig gesetzte Karten wirken dort wie eine
   Werbeseite, die in die Anwendung geraten ist. */
.tarifkarten--links { justify-content: start; }

/* "Ihr Tarif" ist kein Werben, sondern ein Stand - deshalb leiser als
   die Empfehlung daneben. */
.tarifkarte-fahne--leise {
  background: var(--flaeche-2);
  color: var(--tinte-2);
  border: 1px solid var(--linie);
}

/* DER NAME IST EINE UEBERSCHRIFT UND KEIN ETIKETT.

   h4 ist in diesem Stylesheet global ein kleines Versal-Label in
   Monospace (0,72rem, --tinte-3) - fuer Etiketten ueber Datenblocks.
   Semantisch ist h4 hier richtig (die Gliederung steht auf h2/h3),
   optisch ist es das Gegenteil von dem, was ein Tarifname braucht.
   Beim ersten Durchgang stand deshalb "SYSTEMHAUS" in Grau und
   Sperrschrift - es las sich wie eine Spaltenueberschrift.

   Deshalb wird HIER ALLES zurueckgesetzt, was die h4-Regel setzt. Ein
   vergessener Wert (etwa text-transform) genuegt, und der Name
   schreit wieder. */
.tarifkarte-name {
  margin: 0;
  font-family: var(--schrift-titel);
  font-size: var(--t-l);
  font-weight: 600;
  letter-spacing: -.01em;
  text-transform: none;
  color: var(--tinte);
  line-height: 1.2;
}

.tarifkarte-fuerwen {
  margin: var(--a-1) 0 0;
  font-size: var(--t-s);
  color: var(--tinte-3);
  /* Zwei Zeilen reichen; eine dritte schiebt den Preis aus dem Blick,
     und der Preis ist der Grund, weshalb jemand hier steht. */
  min-height: 2.6em;
}

.tarifkarte-preis {
  margin: var(--a-4) 0 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .4rem;
}
.tarifkarte-betrag {
  font-family: var(--schrift-titel);
  /* GROSS, UND ZWAR WIRKLICH: 2rem gegen 1rem Fließtext. Ein Preis in
     Textgröße ist eine Angabe; ein Preis in dieser Größe ist ein
     Angebot. In der Tabelle davor stand er in Textgröße. */
  font-size: 2rem;
  line-height: 1;
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
}
.tarifkarte-takt {
  font-size: var(--t-s);
  color: var(--tinte-3);
}
.tarifkarte-brutto {
  margin: var(--a-1) 0 0;
  font-size: .8rem;
  color: var(--tinte-3);
  font-variant-numeric: tabular-nums;
}

.tarifkarte-liste {
  list-style: none;
  margin: var(--a-4) 0 var(--a-5);
  padding: var(--a-4) 0 0;
  border-top: 1px solid var(--linie-zart);
  display: grid;
  gap: var(--a-2);
  font-size: var(--t-s);
  color: var(--tinte-2);
  /* DIE LISTE SCHIEBT DEN KNOPF NACH UNTEN, damit alle Knöpfe einer
     Reihe auf einer Linie stehen - auch wenn ein Tarif eine Zeile mehr
     hat. Ungleich hohe Knöpfe lesen sich wie ein Fehler. */
  flex: 1 1 auto;
  align-content: start;
}
.tarifkarte-liste strong {
  color: var(--tinte);
  font-variant-numeric: tabular-nums;
}

.tarifkarte-nachsatz {
  margin: var(--a-2) 0 0;
  font-size: .78rem;
  color: var(--tinte-3);
  text-align: center;
}

/* --- Das Symbol einer Leistungskarte --------------------------------------

   Klein, einfarbig, ruhig. Es erklärt nichts — es macht die Kartenreihe
   überfliegbar, damit das Auge von Form zu Form springt, statt fünf
   Überschriften zu lesen (Befund aus dem Betrieb, 01.10.2026: „sind
   überschlagen von Information").

   GEDÄMPFT UND NICHT IN DER KENNFARBE: Fünf petrolfarbene Symbole
   nebeneinander ziehen mehr Aufmerksamkeit als die Überschriften
   darunter, und dann hat man die Reihenfolge der Wahrnehmung
   umgedreht. Beim Überfahren der Karte nimmt es die Kennfarbe an — da
   ist die Entscheidung schon gefallen. */
.leistungssymbol {
  width: 2rem;
  height: 2rem;
  display: block;
  margin-bottom: var(--a-2);
  color: var(--tinte-3);
  transition: color .15s ease;
}
.karte--klickbar:hover .leistungssymbol,
.karte--klickbar:focus-within .leistungssymbol { color: var(--kenn); }

@media (prefers-reduced-motion: reduce) {
  .leistungssymbol { transition: none; }
}

/* --- Die Gabelung in der Bühne --------------------------------------------

   Drei Wege für drei Besucher, jeder in seinen eigenen Worten.

   SIE ERSETZT .buehne-nebenweg (01.10.2026) — eine graue Zeile in
   0,92rem, die am 11.09.2026 mit Absicht leise gemacht wurde. Die
   Überlegung dahinter war richtig (zwei gleich laute Botschaften heißen
   für beide Seiten „hier bin ich falsch"), die Umsetzung aber so leise,
   dass sie niemand fand, der schon beim zweiten Absatz aufgehört hatte.

   LEISE HEISST HIER: kein Kasten, keine Farbfläche, keine Knöpfe, keine
   Aufzählungspunkte. Nur eine Linie darüber und ein kräftiger Anfang je
   Zeile. Das ist auffindbar, ohne mit der Hauptbotschaft zu ringen —
   und genau das war gemeint.

   DIE ZEILE BRICHT AUF DEM TELEFON UM, nicht in eine zweite Spalte:
   Drei Spalten à 11 Zeichen wären auf 375 Pixeln unlesbar. */
.gabelung {
  list-style: none;
  margin: var(--a-5) 0 0;
  padding: var(--a-4) 0 0;
  border-top: 1px solid var(--linie);
  display: grid;
  gap: var(--a-3);
  max-width: 62ch;
  font-size: .95rem;
  color: var(--tinte-3);
}
.gabelung li { margin: 0; }
.gabelung strong {
  color: var(--tinte-1);
  /* Der Anfang trägt die Frage und steht deshalb auf einer eigenen
     Zeile, sobald Platz ist - sonst verschwimmt die Frage mit der
     Antwort zu einem Fließsatz, den man überliest. */
  display: block;
}
.gabelung a { font-weight: 500; }

/* ==========================================================================
   Meldungen
   ========================================================================== */

.meldungen { display: grid; gap: .7rem; margin-bottom: 1.4rem; }
.meldung {
  border: 1px solid var(--linie);
  border-left: 3px solid var(--tinte-3);
  border-radius: var(--r);
  background: var(--flaeche);
  padding: .85rem 1.05rem;
  font-size: .92rem;
  white-space: pre-line;
}
.meldung--erfolg  { border-left-color: var(--aktiv);      background: var(--aktiv-bg); }
.meldung--fehler  { border-left-color: var(--inaktiv);    background: var(--inaktiv-bg); }
.meldung--warnung { border-left-color: var(--verspaetet); background: var(--verspaetet-bg); }
.meldung--info    { border-left-color: var(--kenn);     background: var(--kenn-bg); }

/* --- Verwaltungs-Layout --------------------------------------------------
   Eigene Anwendung im Verteiler-Stil: schmale Kopfleiste, links eine
   weisse Seitenleiste mit Symbolen, rechts der Inhalt auf VOLLER
   Bildschirmbreite - eine Werkbank, keine Broschuere. Unter 900 px
   wird aus der Seitenleiste eine waagerechte, scrollbare Reiterzeile. */
.arbeit-kopf {
  background: var(--flaeche);
  border-bottom: 1px solid var(--linie);
  position: sticky;
  top: 0;
  z-index: 30;
}
.arbeit-kopf-innen {
  display: flex;
  align-items: center;
  gap: clamp(.5rem, 2vw, 1rem);
  padding: .55rem clamp(1rem, 2vw, 1.5rem);
}
.arbeit-chip {
  font-family: var(--schrift-daten);
  font-size: .7rem;
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--kenn);
  background: var(--kenn-bg);
  border: 1px solid var(--kenn);
  border-radius: 999px;
  padding: .18rem .6rem;
  white-space: nowrap;
}
.arbeit-kopf-innen .thema { margin-left: auto; }
/* Der Avatar bleibt auf jeder Breite - er sagt, DASS jemand angemeldet
   ist und wer (erster Buchstabe, voller Name als Tooltip). Die Adresse
   daneben weicht unter 720px. */
.arbeit-konto { display: flex; align-items: center; gap: .5rem; }
@media (max-width: 719px) {
  .arbeit-konto .kopf-konto { display: none; }
}
/* Kreis mit dem ersten Buchstaben des Kontos - das vertraute
   Erkennungszeichen aus den anderen IDO-Verwaltungen. */
.arbeit-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px; height: 26px;
  flex: none;
  border-radius: 50%;
  background: var(--kenn);
  color: var(--auf-kenn);
  font-family: var(--schrift-daten);
  font-size: .72rem;
  font-weight: 600;
  text-transform: uppercase;
}

.arbeit-rumpf {
  flex: 1 0 auto;
  display: grid;
  /* Volle Breite: die Seitenleiste ist fest, der Inhalt nimmt den Rest. */
  grid-template-columns: 14.5rem minmax(0, 1fr);
  gap: 0;
  width: 100%;
}
.arbeit-seite {
  display: flex;
  flex-direction: column;
  gap: .2rem;
  padding: 1.1rem .8rem;
  background: var(--flaeche);
  border-right: 1px solid var(--linie);
}
/* Die Leiste laeuft optisch bis zum Seitenende durch und bleibt beim
   Rollen stehen - der Inhalt scrollt, die Orientierung nicht. */
.arbeit-seite-innen {
  position: sticky;
  top: calc(48px + 1.1rem);
  display: flex;
  flex-direction: column;
  gap: .2rem;
}
.arbeit-seite a {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: .55rem .7rem;
  border-radius: var(--r-klein);
  border-left: 2px solid transparent;
  font-size: .9rem;
  color: var(--tinte-2);
  text-decoration: none;
}
.arbeit-seite a svg { width: 17px; height: 17px; flex: none; opacity: .75; }
.arbeit-seite a:hover { color: var(--tinte); background: var(--flaeche-2); }
.arbeit-seite a[aria-current="page"] {
  color: var(--kenn);
  font-weight: 600;
  background: var(--kenn-bg);
  border-left-color: var(--kenn);
}
.arbeit-seite a[aria-current="page"] svg { opacity: 1; }

.arbeit-inhalt {
  padding: clamp(1.3rem, 2.5vw, 2rem) clamp(1rem, 2.5vw, 2rem) 3rem;
  min-width: 0;
  /* DER RAHMEN DER SEITE (10.09.2026, siehe --werkbank oben).
     
     Ein Raster mit EINER Spalte, und alles, was direkt in der
     Arbeitsflaeche steht, sitzt darin: Seitenkopf, Hinweiskasten,
     Tabelle, Formular, Abschnitt. Eine linke Kante, eine rechte Kante,
     auf jeder Seite dieselben.
     
     Weshalb ein Raster und keine max-width auf jedem Kind: Eine
     max-width muesste jede Vorlage mitbringen, und genau das war der
     Zustand davor - jede brachte eine andere mit. Der Rahmen steht
     EINMAL hier, und keine Vorlage kann ihn versehentlich vergessen.
     
     min(100%, ...) und nicht minmax(0, ...): Ein Rastergleis ohne
     feste Groesse richtet sich nach seinem Inhalt. Eine Seite mit
     einer kurzen Meldung schrumpfte damit auf die Breite der Meldung,
     und die Tabelle darunter zoege sie wieder auf - die Kante waere
     wieder weg. min(100%, --werkbank) ist eine Laenge und steht. */
  display: grid;
  grid-template-columns: min(100%, var(--werkbank));
  justify-content: center;
  align-content: start;
}
/* Die Seitentitel der Verwaltung eine Stufe ruhiger als im Auftritt -
   der Grad steht unten bei "Dichte der Arbeitsflaeche". */
.arbeit-inhalt .seitenkopf { margin-bottom: 1.45rem; }

/* ==========================================================================
   Dichte der Arbeitsflaeche
   ========================================================================== */

/* "Auf Ihr Konto wirkt alles so groß." - und das stimmte.
   
   Die Groessen stammen vom AUFTRITT: Dort hat eine Ueberschrift Platz,
   sie soll wirken, und man liest eine Seite einmal. Hinter der
   Anmeldung wird gearbeitet - dort steht dieselbe Ueberschrift zum
   zwanzigsten Mal, und jeder Millimeter, den sie nimmt, kostet eine
   Zeile Inhalt.
   
   Deshalb gilt das hier NUR fuer .arbeit-inhalt: Kundenbereich und
   Verwaltung werden dichter, die oeffentlichen Seiten bleiben, wie sie
   sind. Ein Schriftgrad, der auf der Startseite gross wirkt, ist dort
   richtig.
   
   Massvoll und nicht gequetscht: Wer eine Zeile nicht mehr liest, hat
   nichts gewonnen.
   
   EINE HALBE STUFE ZURUECK (11.09.2026). Nachdem der Auftritt seine
   Luft bekommen hatte, stand die Arbeitsflaeche daneben spuerbar zu
   eng - aus dem Betrieb: "Kundenbereich auch eine halbe Stufe
   luftiger."
   
   "Halbe Stufe" ist woertlich gemeint und nicht gefuehlt: Jeder Wert
   hier geht die HAELFTE des Weges zum Wert draussen. Aus 1.2rem
   Kartenpolster gegen 1.75 draussen werden 1.45; aus .55rem
   Zeilenpolster in der Tabelle gegen .7 werden .65. Der Bereich
   bleibt damit der dichtere - er hoert nur auf, gequetscht zu wirken.
   
   Die SCHRIFTGROESSEN bleiben, wie sie waren. Gefragt war Luft, nicht
   Groesse - und ein Schriftgrad mehr haette jede Tabellenspalte neu
   umbrechen lassen. */
.arbeit-inhalt { font-size: 15px; line-height: 1.58; }

.arbeit-inhalt h1 { font-size: clamp(1.35rem, 2.6vw, 1.65rem); }
.arbeit-inhalt h2 { font-size: 1.15rem; margin-top: 2.3rem; }
.arbeit-inhalt h3 { font-size: 1rem; margin-top: 1.5rem; }

/* DER ABSATZABSTAND AUCH (11.09.2026). Draussen sind es vier Fuenftel
   einer Zeile - drinnen waere das eine Zeile Inhalt weniger je Absatz,
   und davon gibt es auf einer Arbeitsseite viele. Drei Viertel sind
   die halbe Stufe dazwischen. */
.arbeit-inhalt p { margin-bottom: 1.1rem; }

/* Rundum gleich viel, wie die Karte draussen - nur eine Stufe enger. */
.arbeit-inhalt .karte { padding: 1.45rem; margin-bottom: var(--a-5); }
.arbeit-inhalt .karte--eng { padding: .95rem 1.1rem; }
.arbeit-inhalt .gruppentitel { font-size: 1rem; margin: 2.05rem 0 .85rem; }

/* Zwischen zwei Karten draussen liegen 2rem, hier 1.5 - dazwischen
   1.75. Die Reihe ist der Ort, an dem Dichte am ehesten als Gedraenge
   ankommt: Zwei Karten, die sich fast beruehren, lesen sich als eine. */
.arbeit-inhalt .karten-reihe, .arbeit-inhalt .raster { gap: 1.75rem; }

/* Felder und Knoepfe: Eine Zeile Formular ist hier keine Einladung,
   sondern Werkzeug - aber eine, die man treffen kann. */
.arbeit-inhalt input[type="text"], .arbeit-inhalt input[type="email"],
.arbeit-inhalt input[type="password"], .arbeit-inhalt input[type="search"],
.arbeit-inhalt input[type="tel"], .arbeit-inhalt input[type="date"],
.arbeit-inhalt input[type="number"], .arbeit-inhalt select,
.arbeit-inhalt textarea { padding: .52rem .72rem; font-size: .9rem; }
.arbeit-inhalt label { font-size: .8rem; margin-bottom: .3rem; }
.arbeit-inhalt .feldgruppe { margin-bottom: .95rem; }
.arbeit-inhalt .knopf { padding: .5rem .9rem; font-size: .86rem; }
.arbeit-inhalt .knopf--klein { padding: .34rem .7rem; }

/* --- DAS DRITTE MASS: DAS FELD (10.09.2026) -----------------------------
   
   Damit hat die Arbeitsflaeche genau drei Masse, und jedes beantwortet
   eine eigene Frage:
   
     1. der RAHMEN (--werkbank, 1280) - wie breit ist die Seite?
     2. der SATZ (--doku-breite, ~76 Zeichen) - wie lang ist eine Zeile?
     3. das FELD (34rem) - wie breit ist eine Eingabe?
   
   Mehr braucht es nicht, und weniger geht nicht. Das Feld ist das,
   was zuletzt gefehlt hat: Seit der Rahmen steht, fuellt eine Karte
   ihre Spalte, und ein Feld fuellte die Karte - "Name des Kunden" auf
   900 Pixeln, fuer zwei Woerter. Ein Feld sagt durch seine Laenge
   mit, was hineingehoert; eines, das dreimal so lang ist wie sein
   laengster Inhalt, sagt das Falsche.
   
   34rem sind rund 60 Zeichen - eine E-Mail-Adresse, ein Firmenname,
   ein Serverpreis in der Auswahlliste passen hinein. Wer mehr
   braucht - ein Textfeld, in dem ein Anliegen steht -, bekommt die
   SATZbreite, nicht die Rahmenbreite: Auch geschrieben wird in
   lesbaren Zeilen. Und wer wirklich die ganze Breite braucht, nimmt
   .feld--voll; das ist eine Entscheidung und kein Versehen. */
.arbeit-inhalt input[type="text"], .arbeit-inhalt input[type="email"],
.arbeit-inhalt input[type="password"], .arbeit-inhalt input[type="search"],
.arbeit-inhalt input[type="tel"], .arbeit-inhalt input[type="url"],
.arbeit-inhalt input[type="date"], .arbeit-inhalt input[type="datetime-local"],
.arbeit-inhalt input[type="number"], .arbeit-inhalt select { max-width: 34rem; }
.arbeit-inhalt textarea { max-width: var(--doku-breite); }
.arbeit-inhalt .feld--voll { max-width: none; }

/* EIN TEXTMASS IM ARBEITSBEREICH (10.09.2026).
   
   --lesebreite (52ch) ist das Mass fuer einen Absatz NEBEN etwas
   anderem und stammt vom Auftritt. Hinter der Anmeldung standen damit
   zwei Laufweiten auf derselben Seite: Der Einleitungssatz eines
   Abschnitts brach bei 460 Pixeln um, der Text im Hinweiskasten
   darunter bei 830. Zwei Textkanten sind so unruhig wie zwei
   Blockkanten - nur leiser, weshalb man lange daran vorbeisieht.
   
   Deshalb bedeutet .lesebreite HIER die Arbeitslaufweite. Der Auftritt
   behaelt seine 52 Zeichen: Dort steht ein Absatz oft in einer Spalte
   neben einer zweiten, und dort liest man einmal statt taeglich. */
.arbeit-inhalt .lesebreite { max-width: var(--doku-breite); }

/* DER HINWEIS UNTER EINEM FELD gehoert zum Satz und nicht zum Feld.
   In .feldgruppe--kurz (12rem, fuer eine Minutenzahl) brach er sonst
   nach drei Woertern um - fuenf Zeilen fuer einen Satz, neben einem
   Feld von zwei Zentimetern. */
.arbeit-inhalt .feld-hinweis { max-width: var(--doku-breite); }
.arbeit-inhalt .feldgruppe--kurz { max-width: none; }
.arbeit-inhalt .feldgruppe--kurz input,
.arbeit-inhalt .feldgruppe--kurz select { max-width: 12rem; }

/* Die Faltung und die Tabellen ruecken mit. */
.arbeit-inhalt .falter summary { padding: .65rem .95rem; }
.arbeit-inhalt .falter-inhalt { padding: 0 .95rem .95rem; }
.arbeit-inhalt .zeitraffer-inhalt { padding: 0 .95rem .95rem; }
/* Die Tabellenzeile: .55 gegen .7 draussen - hier die halbe Stufe.
   Auf einer Liste mit zwanzig Zeilen ist das der Unterschied zwischen
   Ablesen und Absuchen. */
.arbeit-inhalt td, .arbeit-inhalt th { padding-top: .65rem; padding-bottom: .65rem; }

/* Der Abstand zwischen zwei Abschnitten war fuer eine Werbeseite
   gedacht - dort traegt Weissraum. Hier trennt schon die Ueberschrift,
   und drei Fingerbreit Leere zwischen zwei Tabellen sind nur Weg. */
.arbeit-inhalt .abschnitt { padding: 2.6rem 0; }
/* Der Zweispalt-Abschnitt ist der haeufigste Block dieser Flaeche -
   er geht denselben halben Schritt mit. */
.arbeit-inhalt .vabschnitt { padding: 1.85rem 0; }

@media (max-width: 899px) {
  .arbeit-rumpf { display: block; }
  .arbeit-seite {
    border-right: none;
    border-bottom: 1px solid var(--linie);
    padding: .45rem clamp(1rem, 3vw, 1.6rem);
  }
  /* ALLE BEREICHE SICHTBAR (Befund 08.09.2026). Die Leiste scrollte
     seitlich mit verborgenem Streifen - auf dem Telefon fehlten vier
     Bereiche, auf dem Tablet drei, darunter "Konto", ohne jeden
     Hinweis. Jetzt bricht sie um: zwei Zeilen Chips zeigen alles. */
  .arbeit-seite-innen {
    position: static;
    flex-direction: row;
    flex-wrap: wrap;
    gap: .25rem .35rem;
  }
  .arbeit-seite a {
    white-space: nowrap;
    border-left: none;
    padding: .4rem .6rem;
    font-size: var(--t-s);
    border: 1px solid transparent;
  }
  .arbeit-seite a[aria-current="page"] { border-left: none; border-color: var(--kenn); }
}

.arbeit-fuss {
  border-top: 1px solid var(--linie-zart);
  padding: .8rem clamp(1rem, 2.5vw, 2rem);
  display: flex;
  gap: 1.2rem;
}
.arbeit-fuss a { font-size: .78rem; color: var(--tinte-3); text-decoration: none; }
.arbeit-fuss a:hover { color: var(--tinte); text-decoration: underline; }

/* --- Datenblock (Datenauskunft) -------------------------------------------
   Eine Seite, die zwanzig Abschnitte untereinander zeigt, braucht eine
   Trennung, die man ueberfliegen kann - und keine Karten. Zwanzig
   Kaesten mit Rahmen, Schatten und Radius nebeneinander waeren zwanzig
   gleich laute Objekte; hier ist der Inhalt die Sache, und die Linie
   sagt nur, wo einer aufhoert.

   Dieselbe Linie und derselbe Abstand wie bei den Einstellungs-
   Abschnitten darunter - nur einspaltig, weil hier keine Felder
   danebenstehen, sondern eine Tabelle darunter. */
.datenblock {
  padding: 1.9rem 0;
  border-top: 1px solid var(--linie-zart);
}
.datenblock > :first-child { margin-top: 0; }
.datenblock > h2 { margin-bottom: .35rem; }
.datenblock > p { margin-bottom: 1rem; }
.datenblock .tabelle-rahmen { margin-bottom: .6rem; }
.datenblock > :last-child { margin-bottom: 0; }

/* --- Einstellungs-Abschnitte ---------------------------------------------
   Das klassische Zweispalt-Muster: links steht, WORUM es geht (Titel und
   zwei Saetze), rechts stehen die Felder. So traegt die Breite Inhalt
   statt Leere, und man ueberfliegt die Seite an den Titeln entlang. */
.vabschnitt {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: .9rem 2.5rem;
  padding: 1.6rem 0;
  border-top: 1px solid var(--linie-zart);
}
.vabschnitt:first-of-type { border-top: none; padding-top: .4rem; }
/* DIE FELDSPALTE NIMMT, WAS DER RAHMEN UEBRIG LAESST (10.09.2026).
   
   Sie stand auf 46rem, spaeter auf 60rem ab einem sehr breiten Schirm.
   Beides waren Zahlen neben dem Rahmen der Seite: Ein Formularabschnitt
   hoerte bei 1072 Pixeln auf, die Tabelle darueber bei 1280. Zwei
   Kanten auf derselben Seite, und die untere sah aus, als sei sie
   steckengeblieben.
   
   1fr heisst hier nicht "so breit wie moeglich", sondern "so breit wie
   der Rahmen" - und der ist gedeckelt. Die Laufweite der Erklaerung
   links bleibt bei 34ch, die Felder rechts fuellen ihre Karte. */
@media (min-width: 1000px) {
  .vabschnitt { grid-template-columns: minmax(15rem, 21rem) minmax(0, 1fr); }
}
/* EIN ABSCHNITT, DESSEN INHALT EINE TABELLE IST, VERTRAEGT DIE ZWEITE
   SPALTE NICHT (Befund 07.09.2026).

   Das Zweispalt-Muster ist fuer Formulare gedacht: links steht, worum
   es geht, rechts stehen die Felder. Im Zugriffsnachweis standen
   dahinter Tabellen - und weil die Umschaltung an der FENSTERbreite
   haengt und nicht an dem, was der Kundenbereich neben seiner
   Seitenleiste wirklich uebrig laesst, blieben auf einem 1024 Pixel
   breiten Bildschirm 365 Pixel fuer eine Tabelle von 612. Das Blatt,
   das der Dienstleister seinem Kunden vorlegt, hatte damit eine
   Bildlaufleiste quer durch die Beweisfuehrung. */
.vabschnitt.vabschnitt--voll { grid-template-columns: minmax(0, 1fr); }
/* Der Kopf eines Abschnitts ist auf 34ch gesetzt - richtig, solange er
   LINKS neben den Feldern steht. In --voll steht er UEBER dem Inhalt,
   und dann ist eine 272 Pixel schmale Spalte ueber einer 1600 Pixel
   breiten Tabelle ein Stummel. */
.vabschnitt--voll .vabschnitt-kopf p { max-width: var(--doku-breite); }
.vabschnitt-kopf h2 { margin: 0 0 .45rem; font-size: 1.05rem; }
.vabschnitt-kopf p {
  margin: 0;
  font-size: .86rem;
  color: var(--tinte-3);
  max-width: 34ch;
}
.vabschnitt .karte { margin-bottom: 0; }

/* EIN ZWEISPALT-ABSCHNITT IN EINEM KARTENRASTER (Befund 10.09.2026).
   
   Er gehoert dort nicht hin - er ist ein Baustein der SEITE und keiner
   fuer eine Reihe aus Karten. Aber wer ihn versehentlich hineinsetzt,
   soll keinen Scherbenhaufen bekommen: In der Verwaltung stand er eine
   Stunde lang als Rasterfeld in einer .karten-reihe und bekam eine
   Spalte von zwanzig Pixeln. Der Erklaertext lief Buchstabe fuer
   Buchstabe untereinander, quer ueber die Nachbarkarten.
   
   Eine Zeile CSS macht daraus einen Abschnitt ueber die volle Reihe:
   falsch platziert, aber lesbar. Das ist mehr wert als ein Test, der
   es verbietet - der faengt den naechsten Fall erst, wenn ihn jemand
   schreibt, und diese Regel wirkt sofort. */
.karten-reihe > .vabschnitt,
.karten-reihe > .vaktionen { grid-column: 1 / -1; }

/* Abschlusszeile unter den Abschnitten, buendig zur Feldspalte. */
.vaktionen {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  padding: 1.2rem 0 0;
  border-top: 1px solid var(--linie-zart);
}
@media (min-width: 1000px) {
  .vaktionen { grid-template-columns: minmax(15rem, 21rem) minmax(0, 1fr); }
  .vaktionen > * { grid-column: 2; }
}

/* --- Diagramme (Statistik) -----------------------------------------------
   Saeulen nach den Datenvisualisierungs-Regeln des Hauses: EINE Farbe je
   Reihe (die Leitfarbe), Saeulen hoechstens 24 px breit mit runder
   Datenkante oben und gerader Grundlinie, Hilfslinien haarduenn,
   Beschriftung in Texttoken - nie in der Datenfarbe. */
.diagramm-titel { font-size: .95rem; margin: 0 0 1rem; }
.diagramm {
  display: flex;
  align-items: stretch;
  /* Kein Spaltenabstand: Die Luft zwischen den Saeulen kommt aus der
     Spurbreite selbst - so laufen die Hilfslinien der Spuren als eine
     durchgehende Linie durch, statt gestrichelt zu wirken. */
  height: 200px;
}
.diagramm-spalte {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .25rem;
}
/* Die eigentliche Zeichenflaeche: Wert- und Monatszeile stehen ausserhalb,
   damit 100 % Saeulenhoehe wirklich 100 % der Flaeche sind. Die
   Hilfslinien (haarduenn, bei 0/25/50/75 %) liegen auf der Spur jeder
   Spalte - alle Spuren sind gleich hoch, die Linien fluchten. */
.diagramm-spur {
  flex: 1 1 auto;
  min-height: 0;
  width: 100%;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  background: linear-gradient(to top,
    var(--linie-zart) 0, var(--linie-zart) 1px, transparent 1px) bottom / 100% 25% repeat-y;
}
.diagramm-wert {
  font-family: var(--schrift-daten);
  font-size: .68rem;
  /* Feste Hoehe statt min-height: Spalten MIT Etikett haetten sonst eine
     hoehere Wertzeile und damit eine kuerzere Zeichenflaeche - ihre
     Hilfslinien laegen sichtbar neben denen der Nachbarspalten. */
  height: 1.15rem;
  line-height: 1.15rem;
  color: var(--tinte-2);
  white-space: nowrap;
}
.diagramm-saeule {
  width: min(90%, 24px);
  height: 0;
  min-height: 2px;
  background: var(--kenn);
  border-radius: 4px 4px 0 0;
}
.diagramm-monat {
  font-family: var(--schrift-daten);
  font-size: .68rem;
  /* Feste Hoehe wie bei der Wertzeile: Spalten OHNE Etikett haetten
     sonst eine hoehere Zeichenflaeche und versetzte Hilfslinien. */
  height: .95rem;
  line-height: .95rem;
  color: var(--tinte-3);
  white-space: nowrap;
}
@media (max-width: 719px) {
  /* Auf dem Telefon nur jeden zweiten Monat beschriften - sonst
     ueberlappen sich die Etiketten.

     VOM ENDE HER GEZAEHLT (04.10.2026): Von vorn gezaehlt fiel bei
     zwoelf Monaten genau der laufende weg - die Saeule, auf die man
     sieht, stand ohne Beschriftung da. */
  .diagramm-spalte:nth-last-child(even) .diagramm-monat { visibility: hidden; }
}

.karten-reihe {
  display: grid;
  gap: var(--a-5);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
}
/* Im Raster traegt der Abstand die Luecke, nicht die Karte. Sonst
   stehen zwischen zwei Zeilen 1.2rem Luecke PLUS 1.2rem Kartenrand. */
.karten-reihe > .karte { margin-bottom: 0; }

/* ABER UNTER DER REIHE FEHLTE DANN ALLES (Befund 13.09.2026, aus dem
   Betrieb: "Hier fehlt zwischen den boxen ... auch luft").

   Die Zeile darueber nimmt den Karten im Raster ihren Aussenrand - zu
   Recht, drinnen traegt die Luecke. Nur hat das Raster SELBST keinen,
   und damit stand die naechste Karte auf der Statistikseite mit null
   Pixeln Abstand unter den beiden Diagrammen. Gemessen: 0.

   Die Reihe uebernimmt deshalb den Rand, den ihre Karten abgegeben
   haben - derselbe Wert, den eine einzelne Karte auch haette. So ist
   es gleich, ob untereinander Karten oder Reihen stehen. */
.karten-reihe { margin-bottom: var(--a-6); }
.karten-reihe:last-child { margin-bottom: 0; }

/* IM AUFTRITT EINE STUFE MEHR (11.09.2026). Drinnen ist Dichte eine
   Tugend - dort arbeitet jemand und will viel auf einmal sehen.
   Draussen liest jemand, und zwei Karten, die sich fast beruehren,
   lesen sich als EIN Block mit zwei Ueberschriften. */
.inhalt .karten-reihe, .inhalt .raster { gap: var(--a-6); }

/* Ein Raster fuer Karten, die verschieden hoch sind - Formulare etwa.
   "start" statt der vorgegebenen Dehnung: Eine kurze Karte soll nicht
   auf die Hoehe der langen neben ihr wachsen und unten leer stehen. */
.karten-reihe--oben { align-items: start; }

/* Breitere Mindestbreite fuer Karten mit Formularen darin: Ein Feld
   unter 24rem wird in einer zweispaltigen Formzeile unbrauchbar eng. */
.karten-reihe--weit { grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr)); }

/* VIER KARTEN: ZWEI ODER VIER, NIE DREI.
   auto-fit rechnet die Spalten aus der Flaeche, und zwischen etwa 1280
   und 1650 Pixeln passen genau drei hinein - die vierte Karte steht
   dann allein in der zweiten Zeile. Bei einer Gruppe, die inhaltlich
   aus vier gleichrangigen Punkten besteht, sieht das nach Panne aus.
   Deshalb hier keine Rechnung, sondern eine Leiter: eine Spalte am
   Telefon, zwei ab dem Tablet, vier ab dem grossen Schirm. */
.karten-reihe--paar { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 720px) {
  .karten-reihe--paar { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* VIER SPALTEN GIBT ES NICHT MEHR (11.09.2026).

   Die Stufe bei 1400 Pixeln stammt aus der Zeit ohne Rahmen: Damals
   standen vier Karten auf 2560 Pixeln nebeneinander und waren einzeln
   600 breit. Seit der Auftritt bei 76rem endet, waeren es vier von
   280 - vier schmale Saeulen mit Flattersatz, und genau das Band, das
   "erschlaegt". Zwei mal zwei ist bei vier gleichrangigen Punkten
   ohnehin die ruhigere Ordnung. */

/* EINE KARTE, DIE NUR FLIESSTEXT TRAEGT.
   Seit die Breitengrenze gefallen ist, steht eine solche Karte 1840
   Pixel breit um 600 Pixel Text - ein Rahmen um viel Nichts. Der
   Rahmen hoert deshalb dort auf, wo der Text aufhoert.

   Das Mass ist --doku-breite und nicht --lesebreite: Diese Karte steht
   allein im Abschnitt und teilt sich die Zeile mit nichts, dann darf
   der Absatz die groessere der beiden Leseweiten haben. Die Deckelung
   der einzelnen Absaetze faellt hier weg - die Karte deckelt schon.

   Gruppen von Karten sind davon nicht betroffen, die teilen sich die
   Flaeche ohnehin. */
.karte--lesekarte { max-width: calc(var(--doku-breite) + 3rem); }
.karte--lesekarte > p, .karte--lesekarte > ul, .karte--lesekarte > ol { max-width: none; }

/* Karten VERSCHIEDENER Hoehe nebeneinander, ohne Loecher.
   
   Ein Raster kann das nicht: Es rechnet in Zeilen, und neben einer
   langen Karte bleibt der Rest der Zeile leer. Spalten fuellen
   stattdessen von oben nach unten und gleichen sich aus - eine kurze
   und eine mittlere Karte stehen dann neben einer langen.
   
   "break-inside: avoid" ist dabei nicht Kosmetik: Ohne die Angabe
   zerlegt der Browser eine Karte am Spaltenende, und ein Formular
   stuende zur Haelfte in der naechsten Spalte. */
/* DIESELBE LUECKE WIE IM KARTENRASTER (11.09.2026).
   
   Der Stapel stand auf 1.2rem, waehrend zwei Karten nebeneinander
   1.5rem auseinanderstehen. Beides kommt auf der Kontoseite
   uebereinander vor - und dann sieht man den Unterschied sofort, ohne
   sagen zu koennen, woran es liegt.
   
   Er wird nur im Kundenbereich benutzt (Konto, Hostname); die Zahl
   folgt deshalb der Dichte dieser Flaeche. */
.kartenstapel { columns: 26rem; column-gap: var(--a-5); }
.kartenstapel > .karte {
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
  margin-bottom: var(--a-5);
}

/* ==========================================================================
   Falter - alles, was sich zusammenklappen laesst
   ========================================================================== */

/* EIN Bauteil fuer alle gefalteten Listen: Aenderungsprotokoll und
   Rechnungen nach Jahr und Monat, die Kunden der Fernwartung nach
   Kunde. Vorher haette jede Seite ihren eigenen Aufklapper gebaut, und
   drei davon saehen drei Mal ein bisschen anders aus.

   Jede Zusammenfassung traegt eine ZAHL - man soll sehen, ob sich das
   Aufklappen lohnt, bevor man klickt. */
.falter-stufe { border: 1px solid var(--linie); border-radius: var(--r-gross); background: var(--flaeche); margin-bottom: .7rem; }
.falter-stufe .falter-stufe { background: var(--flaeche-2); margin-bottom: .6rem; }
.falter-stufe .falter-stufe:last-child { margin-bottom: 0; }

.falter summary {
  display: flex;
  align-items: center;
  gap: .6rem;
  cursor: pointer;
  padding: .7rem 1rem;
  list-style: none;
  border-radius: var(--r-gross);
}
.falter summary::-webkit-details-marker { display: none; }

/* Der Pfeil selbst gezeichnet und nicht als Zeichen: Das
   Vorgabe-Dreieck sitzt in jedem Browser anders und dreht sich nicht
   mit. */
.falter summary::before {
  content: "";
  width: .5rem; height: .5rem;
  border-right: 2px solid var(--tinte-3);
  border-bottom: 2px solid var(--tinte-3);
  transform: rotate(-45deg);
  transition: transform .15s ease;
  flex: none;
}
.falter details[open] > summary::before { transform: rotate(45deg); }
.falter summary:hover { color: var(--kenn); }
.falter summary:hover::before { border-color: var(--kenn); }

.falter-titel { flex: 1; font-size: .95rem; }
.falter > .falter-stufe > summary .falter-titel { font-family: var(--schrift-titel); font-size: 1.05rem; }

/* Die Zahl ist eine Nebenauskunft und keine Ueberschrift. */
.falter-zahl {
  font-family: var(--schrift-daten);
  font-size: .8rem;
  color: var(--tinte-3);
  background: var(--flaeche-2);
  border: 1px solid var(--linie-zart);
  border-radius: 999px;
  padding: .05rem .5rem;
  flex: none;
}
.falter-stufe .falter-stufe .falter-zahl { background: var(--flaeche); }

/* Eine Nebenangabe in der Zusammenfassung - der Betrag bei den
   Rechnungen, die Netze bei einem Kunden. Sie steht NEBEN der Zahl und
   nicht statt ihrer: "12 Rechnungen, 348,20 EUR" sagt beides. */
.falter-notiz {
  font-family: var(--schrift-daten);
  font-variant-numeric: tabular-nums;
  font-size: .88rem;
  color: var(--tinte-2);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.falter-inhalt { padding: 0 1rem 1rem; }
.falter > .falter-stufe > .falter-inhalt { padding-top: .2rem; }

/* Eine Karte, die als Ganzes ein Link ist - fuer die Mandantenliste des
   Fernzugriffs. Der Rahmen faerbt sich, statt dass der Text unterstrichen
   wird: Eine Karte voller unterstrichener Zeilen liest sich nicht. */
.karte--klickbar {
  display: block;
  color: inherit;
  text-decoration: none;
  transition: border-color .15s ease, transform .15s ease;
}
.karte--klickbar:hover,
.karte--klickbar:focus-visible { border-color: var(--kenn); transform: translateY(-1px); }

/* EINE GANZ KLICKBARE KARTE, DEREN VERWEIS NUR SEIN ZIEL HEISST
   (29.09.2026).

   Befund aus der Pruefung der oeffentlichen Seiten: Die fuenf
   Leistungskarten der Startseite waren GANZ ein <a>. Damit war ihr
   Verweistext die gesamte Karte - ueber neunzig Zeichen. In der
   Verweisliste eines Screenreaders stand dann nicht "Fernzugriff",
   sondern drei Saetze ueber Kundennetze, und beim Springen mit der
   Tabulatortaste noch einmal dasselbe.

   DER VERWEIS SITZT JETZT IN DER UEBERSCHRIFT, und sein
   Pseudo-Element deckt die Karte ab. Das ist der uebliche Weg fuer
   diesen Fall: kurzer Name im Baum, ganze Flaeche klickbar, und es
   braucht kein Skript dafuer.

   :focus-within statt :focus-visible am Kasten - der Kasten selbst
   bekommt keinen Fokus mehr, sein Verweis bekommt ihn. Der Rahmen
   soll trotzdem angehen, sonst sieht man beim Tabben nicht, wo man
   ist. Der Verweis behaelt zusaetzlich seinen eigenen Fokusring aus
   der allgemeinen Regel.

   NUR WO ES GEBRAUCHT WIRD: Karten mit kurzem Text (Wissensfusszeile,
   Mandantenliste) bleiben ein <a> - dort ist das einfacher und genauso
   richtig. */
.karte--stellvertreter { position: relative; }
/* AM VERWEIS UND NICHT AM <h3> (29.09.2026, nach der Live-Pruefung).

   Zuerst hiess die Regel ".karte--stellvertreter h3 a". Dann kam
   dieselbe Bauart in zwei Bausteinen dazu, in denen der Titel ein
   <strong> ist und kein <h3> - dort haette sie stumm nicht gegriffen,
   und die Karte waere nur noch am Titel klickbar gewesen, bei
   unveraendertem Aussehen. Die Klasse am Verweis sagt, was er ist, und
   gilt unabhaengig davon, worin er steckt. */
.karte--stellvertreter .kartenziel { color: inherit; text-decoration: none; }
.karte--stellvertreter .kartenziel::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
}
.karte--stellvertreter:focus-within { border-color: var(--kenn); transform: translateY(-1px); }
.karte-zeile { display: flex; align-items: center; justify-content: space-between; gap: .6rem; }

/* Die Aufnahme einer Schulungslektion. Sie soll die Karte fuellen und
   sie nie sprengen - eine Aufnahme in 1920 Pixeln Breite schiebt sonst
   die ganze Seite zur Seite. */
.aufnahme { display: block; width: 100%; max-width: 100%; border-radius: 8px; background: #000; }

.balkenliste { display: flex; flex-direction: column; gap: .6rem; }
.balkenzeile { display: grid; grid-template-columns: 6rem 1fr 3rem; align-items: center; gap: .6rem; }
.balken-name { font-size: .88rem; color: var(--tinte-2); }
.balken-spur { background: var(--flaeche-2); border-radius: 4px; height: 12px; }
.balken { background: var(--kenn); border-radius: 0 4px 4px 0; height: 100%; min-width: 2px; }
.balken-wert { text-align: right; font-size: .88rem; }

.zustandsliste { display: flex; flex-direction: column; gap: .55rem; margin-bottom: .9rem; }
.zustandszeile { display: flex; align-items: center; justify-content: space-between; gap: .6rem; }

/* --- Betriebsstatus in der Verwaltung -----------------------------------
   Eine Zeile Status-Chips (Stripe, Registrierung, Mailversand) mit
   Absprung in die Einstellungen. */
.betriebsstatus { margin-bottom: 1rem; }
.betriebsstatus-innen {
  display: flex;
  align-items: center;
  gap: 1.4rem;
  flex-wrap: wrap;
}
.betriebsstatus-punkt {
  display: flex;
  align-items: center;
  gap: .45rem;
}
.betriebsstatus-innen .knopf { margin-left: auto; }
@media (max-width: 719px) {
  .betriebsstatus-innen { gap: .7rem; }
  .betriebsstatus-innen .knopf { margin-left: 0; flex: 1 0 100%; }
}

/* --- Kundensicht --------------------------------------------------------
   Ein Verwalter arbeitet im Konto eines Kunden. Die Leiste steht ueber
   der Kopfzeile und bleibt unuebersehbar - niemand soll vergessen, in
   wessen Konto er gerade handelt. */
.kundensicht-leiste {
  background: var(--verspaetet-bg);
  border-bottom: 2px solid var(--verspaetet);
  color: var(--tinte);
}
.kundensicht-innen {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .8rem;
  flex-wrap: wrap;
  padding-top: .55rem;
  padding-bottom: .55rem;
}
.kundensicht-innen p { margin: 0; font-size: .88rem; }
.kundensicht-innen strong { color: var(--verspaetet); }
.kundensicht-zurueck { flex: none; }

.hinweiskasten {
  background: var(--kenn-bg);
  border: 1px solid var(--kenn);
  border-radius: var(--r);
  /* DIESELBE FAMILIE WIE DIE KARTE (11.09.2026).
     
     Der Kasten hatte .95/1.1rem Polster, die Karte daneben 1.75 -
     beide mit Rahmen, beide auf derselben Seite, und der eine sass
     spuerbar enger als die andere. Das liest sich nicht als zwei
     Bedeutungen, sondern als Unaufmerksamkeit.
     
     Nicht gleich viel, sondern eine Stufe weniger: Der Kasten ist ein
     Einwurf und kein Block - er darf kompakter sein, nur eben
     erkennbar aus derselben Werkstatt. */
  padding: 1.15rem 1.3rem;
  font-size: .9rem;
  color: var(--tinte-2);
  margin-bottom: var(--a-5);
}
.hinweiskasten > :last-child { margin-bottom: 0; }
/* DER KASTEN FUELLT DEN RAHMEN - DER TEXT DARIN NICHT (10.09.2026).
   
   Einen Tag lang war es umgekehrt: Der Kasten hoerte dort auf, wo sein
   Text aufhoerte (830 px), waehrend die Tabelle darunter 1760 nahm.
   Das behob die Leerflaeche IM Kasten und machte daraus eine
   Treppe AUS Kasten und Tabelle - drei Kanten untereinander, und das
   ist der schlechtere Fehler: Eine Leerflaeche sieht man an, dass sie
   Platz ist. Eine Treppe sieht nach Versehen aus.
   
   Also: Der Kasten geht bis an den Rahmen wie alles andere, und die
   Laufweite regelt der Absatz IN ihm (unten bei "Laufweite in den
   Baenken"). Aussen eine Kante, innen ein Mass - in dieser Reihenfolge
   ist beides erfuellbar, in der anderen keins von beiden. */
.arbeit-inhalt .hinweiskasten { max-width: none; }

/* --- Laufweite in den Baenken -------------------------------------------
   
   Der Rahmen ist 1280 breit. Ein Absatz darin waere 172 Zeichen je
   Zeile - beim Zeilenwechsel findet das Auge den naechsten Anfang
   nicht wieder, und man liest dieselbe Zeile zweimal. 
   
   Die Laufweite gehoert deshalb an den ABSATZ und nicht an die Bank,
   in der er liegt. Der Unterschied ist der ganze Punkt: Eine Bank mit
   Farbe und Rand, die bis zur Kante geht und deren Text nach zwei
   Dritteln endet, sieht aus wie ein Kasten mit Platz darin. Eine Bank,
   die selbst nach zwei Dritteln aufhoert, sieht aus wie eine Stufe
   neben der Tabelle darunter. Das erste ist Gestaltung, das zweite ein
   Versehen.
   
   Nur DIREKTE Absaetze: Wer in einen Kasten eine Werteliste, eine
   Tabelle oder ein Kartenraster legt, meint die Flaeche und bekommt
   sie auch. */
.arbeit-inhalt .hinweiskasten > p,
.arbeit-inhalt .meldung > p,
.arbeit-inhalt .karte > p { max-width: var(--doku-breite); }

/* EINE LISTE IST KEIN ABSATZ (Befund 10.09.2026).
   
   Derselbe Deckel auf einer Aufzaehlung ergab auf dem Betriebsschirm
   eine Saeule: vier Punkte zu je fuenf Zeilen, 500 Pixel hoch, daneben
   zwei Drittel roter Kasten. Man las eine Spalte und uebersah, dass es
   vier gleichartige Meldungen waren.
   
   Deshalb Spalten statt Deckel - und die Spaltenzahl ueber die
   Spaltenbreite statt ueber eine Fensterbreite: `columns: 30rem` heisst
   "so viele Spalten zu mindestens 30rem, wie hineinpassen". Auf dem
   Telefon ist das eine, auf 1280 sind es zwei. Ohne Umschaltpunkt, und
   damit auch ohne den Fehler, den ein Umschaltpunkt macht - er kennt
   nur das FENSTER und nicht die Flaeche, die neben der Seitenleiste
   uebrig bleibt.
   
   break-inside, damit ein Punkt nicht mitten im Satz die Spalte
   wechselt. */
.arbeit-inhalt .hinweiskasten > ul,
.arbeit-inhalt .hinweiskasten > ol,
.arbeit-inhalt .karte > ul,
.arbeit-inhalt .karte > ol { columns: 30rem; column-gap: 2.5rem; }
.arbeit-inhalt .hinweiskasten > ul > li,
.arbeit-inhalt .hinweiskasten > ol > li,
.arbeit-inhalt .karte > ul > li,
.arbeit-inhalt .karte > ol > li { break-inside: avoid; }
.hinweiskasten--erfolg  { background: var(--aktiv-bg);      border-color: var(--aktiv); }
.hinweiskasten--warnung { background: var(--verspaetet-bg); border-color: var(--verspaetet); }
.hinweiskasten--gefahr  { background: var(--inaktiv-bg);    border-color: var(--inaktiv); }

/* ==========================================================================
   Kennzahlen
   ========================================================================== */

.kennzahlen { display: grid; gap: .8rem; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); margin-bottom: 1.4rem; }
.kennzahl {
  background: var(--flaeche);
  border: 1px solid var(--linie);
  border-radius: var(--r);
  padding: .85rem 1rem;
}
.kennzahl b {
  display: block;
  font-family: var(--schrift-titel);
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
  line-height: 1.2;
}
.kennzahl span {
  font-family: var(--schrift-daten);
  font-size: .7rem;
  font-weight: 500;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--tinte-3);
}
/* Die zweite Zahl unter einer Kennzahl - der Bruttobetrag unter dem
   Nettoumsatz. Leise gesetzt: Sie ordnet die grosse Zahl ein, sie
   konkurriert nicht mit ihr. */
.kennzahl em {
  display: block;
  margin-top: .2rem;
  font-family: var(--schrift-daten);
  font-size: .72rem;
  font-style: normal;
  font-variant-numeric: tabular-nums;
  color: var(--tinte-3);
}
.kennzahl--warnung b { color: var(--verspaetet); }
.kennzahl--gefahr b  { color: var(--inaktiv); }

/* ==========================================================================
   Zugangsdaten - der Bildschirm, der ueber den Support entscheidet
   ========================================================================== */

.zugangsdaten {
  display: grid;
  grid-template-columns: max-content 1fr auto;
  gap: 0;
  margin: 1rem 0 0;
  border: 1px solid var(--linie);
  border-radius: var(--r);
  overflow: hidden;
}
.zugangsdaten dt, .zugangsdaten dd, .zugangsdaten .kopieren {
  padding: .55rem .85rem;
  border-bottom: 1px solid var(--linie-zart);
  background: var(--flaeche);
  display: flex;
  align-items: center;
}
.zugangsdaten dt {
  font-family: var(--schrift-daten);
  font-size: .7rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--tinte-3);
  background: var(--flaeche-2);
}
.zugangsdaten dd {
  margin: 0;
  font-family: var(--schrift-daten);
  font-size: .88rem;
  color: var(--tinte);
  word-break: break-all;
}
.zugangsdaten .kopieren { justify-content: flex-end; }
.zugangsdaten > *:nth-last-child(-n+3) { border-bottom: none; }

@media (max-width: 560px) {
  .zugangsdaten { grid-template-columns: 1fr auto; }
  .zugangsdaten dt { grid-column: 1 / -1; border-bottom: none; padding-bottom: .1rem; }
}

/* ==========================================================================
   Oeffentliche Seiten
   ========================================================================== */

.buehne { padding: clamp(2.5rem, 7vw, 4.5rem) 0 clamp(2rem, 4vw, 3rem); }

/* Ab 900 Pixeln steht das Buehnenbild neben dem Text, darunter laufen die
   Belege ueber die ganze Breite. Schmaler stapelt alles - das Bild rutscht
   dann unter die Knoepfe, damit der Aufruf zum Handeln oben bleibt. */
@media (min-width: 900px) {
  .buehne {
    display: grid;
    grid-template-columns: minmax(0, 1.02fr) minmax(0, .98fr);
    align-items: center;
    column-gap: clamp(1.5rem, 4vw, 3rem);
  }
  .buehne-belege { grid-column: 1 / -1; }
}

.buehne h1 {
  font-size: clamp(1.9rem, 5vw, 3rem);
  line-height: 1.08;
  letter-spacing: -.03em;
  max-width: 18ch;
  margin-bottom: 1rem;
}
/* DER VORSPANN DER BUEHNE DARF MEHR ATMEN ALS EIN ABSATZ - aber nach
   derselben Regel (11.09.2026). Vorher stand hier 1.6rem fest, also
   das 1,52-fache seiner eigenen Schrift, waehrend jeder andere Absatz
   beim 1,25-fachen liegt. In em gerechnet bleibt der Eindruck derselbe
   und die Zahl hoert auf, geraten zu sein: Die Buehne ist die Stelle,
   an der Weissraum arbeitet, deshalb eineinhalb statt eineinviertel. */
.buehne .vorspann { max-width: 56ch; margin-bottom: 1.5em; }
/* Der zusammenhaengende Text der Buehne als EIN Kind des zweispaltigen
   Rasters. Ohne dieses Kind verteilte das Raster Ueberschrift und
   Vorspaenne abwechselnd links und rechts. min-width: 0 hebt die
   Vorgabe min-width:auto auf - sonst sprengt ein langes Wort die
   Spalte, statt umzubrechen. */
.buehne-text { min-width: 0; }
.buehne-aktionen { display: flex; flex-wrap: wrap; gap: .7rem; align-items: center; }
.buehne-belege {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem 1.6rem;
  margin-top: 1.8rem;
  padding-top: 1.2rem;
  border-top: 1px solid var(--linie);
  font-size: .84rem;
  color: var(--tinte-3);
}
.buehne-belege span { display: inline-flex; align-items: center; gap: .45rem; }

/* --------------------------------------------------------------------------
   Das Buehnenbild.

   Es ist kein Bild aus einer Datei, sondern gezeichnetes SVG im Dokument.
   Das hat drei Gruende: die Content-Security-Policy laesst keine fremden
   Quellen zu, ein Inline-SVG faerbt sich ueber genau diese Variablen
   automatisch hell und dunkel mit, und es bleibt beim Vergroessern scharf.
   Alles Farbige steht deshalb hier und nicht als Attribut in der Vorlage.
   -------------------------------------------------------------------------- */
.buehne-bild { margin: 2rem 0 0; }
@media (min-width: 900px) { .buehne-bild { margin: 0; } }
.buehnenbild {
  display: block;
  width: 100%;
  max-width: 470px;
  height: auto;
  margin: 0 auto;
  /* Die Wege und ihre Pfeilspitzen erben diese Farbe: die Pfeilspitze im
     <marker> kennt das aufrufende Element nicht, wohl aber das SVG. */
  color: var(--kenn);
}
.buehne-bild figcaption {
  max-width: 470px;
  margin: .7rem auto 0;
  font-size: .82rem;
  line-height: 1.45;
  color: var(--tinte-3);
  text-align: center;
}

.bb-flaeche { fill: var(--flaeche); stroke: var(--linie); stroke-width: 1.4; }
.bb-flaeche--kenn { fill: var(--kenn-bg); stroke: var(--kenn); }
.bb-glyph { fill: none; stroke: var(--tinte-3); stroke-width: 1.6; stroke-linecap: round; }
.bb-glyph--kenn { stroke: var(--kenn); }
.bb-weg { fill: none; stroke: currentColor; stroke-width: 2.1; }
.bb-trennung { stroke: var(--linie); stroke-width: 1.4; stroke-dasharray: 4 5; }
.bb-durch { stroke: var(--tinte-3); stroke-width: 1.2; }
.bb-titel { fill: var(--tinte); font: 600 13px var(--schrift-titel); }
.bb-text { fill: var(--tinte-3); font: 11px var(--schrift-text); }
.bb-marke { fill: currentColor; font: 600 11px var(--schrift-text); }
.bb-daten { fill: var(--tinte-2); font: 12px var(--schrift-daten); }
.bb-daten--neu { fill: var(--kenn); }
.bb-mitte { text-anchor: middle; }

/* MEHR LUFT ZWISCHEN DEN ABSCHNITTEN (11.09.2026, "zu fuellig").

   Die Abstaende waren fuer eine Seite gerechnet, die von Rand zu Rand
   ging: Dort trennt schon die Breite. In einem Rahmen von 76rem stehen
   die Abschnitte dichter beieinander, und dann traegt der senkrechte
   Abstand die ganze Gliederung allein. Er steigt deshalb mit. */
.abschnitt { padding: clamp(3.2rem, 7vw, 5.5rem) 0; border-top: 1px solid var(--linie-zart); }

/* DIE TRENNLINIE SOLL IN DER MITTE LIEGEN (11.09.2026).
   
   Zwei Abschnitte untereinander ergeben von selbst gleich viel Luft
   ueber und unter der Linie - beide bringen ihr Polster mit. Folgt ein
   Abschnitt aber auf freien Inhalt (eine Lesekarte, eine Kartenreihe),
   steht ueber der Linie nur der Rand dieses Blocks und darunter das
   volle Polster. Gemessen auf /cloud-speicher: 40 Pixel gegen 88.
   
   Die Linie sass damit am vorigen Abschnitt statt zwischen beiden -
   sie sah aus wie ein Schlussstrich und nicht wie eine Fuge.
   
   DASSELBE MASS WIE DAS POLSTER, und das ist kein Zufall: Senkrechte
   Raender fallen zusammen, statt sich zu addieren. Der Rand des
   vorigen Blocks (32 Pixel) und dieser hier ergeben zusammen nicht
   120, sondern den groesseren von beiden. Ein kleinerer Wert waere
   also einfach verschwunden - beim ersten Versuch stand deshalb 42
   gegen 89. */
:not(.abschnitt) + .abschnitt { margin-top: clamp(3.2rem, 7vw, 5.5rem); }
.abschnitt-kopf { max-width: 60ch; margin-bottom: var(--a-6); }
/* Eine Ueberschrift OHNE Erklaersatz darunter - wo ein Abschnitt nur
   einen Namen braucht und keinen Vorspann. Sie traegt denselben
   Abstand wie ein ganzer Abschnittskopf, damit die Kartenreihe darunter
   nicht enger sitzt als anderswo. */
.abschnitt-titel { margin: 0 0 var(--a-6); }
.abschnitt-kopf h2 { margin-top: 0; }

.schritte { display: grid; gap: 1.4rem; counter-reset: schritt; }
@media (min-width: 780px) { .schritte { grid-template-columns: repeat(3, 1fr); } }
.schritt { counter-increment: schritt; }
.schritt .nummer {
  font-family: var(--schrift-daten);
  font-size: .7rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--kenn);
  margin-bottom: .4rem;
}
.schritt .nummer::before { content: "Schritt " counter(schritt); }
.schritt h3 { margin: 0 0 .3rem; font-size: 1rem; }
.schritt p { margin: 0; font-size: .92rem; color: var(--tinte-2); }

.merkmale { display: grid; gap: 1.2rem; }
@media (min-width: 720px) { .merkmale { grid-template-columns: repeat(2, 1fr); } }
/* DER TITEL EINES MERKMALS IST KEINE UEBERSCHRIFT MEHR (04.10.2026).

   GEMESSEN auf /vpn-fernzugriff: 34 Ueberschriften auf 1715 Woerter,
   also eine je 50 Woerter. Vier davon standen ueber Abschnitten von
   16 bis 22 Woertern - eine Ueberschrift und ein Satz.

   EIN <h3> IST EINE MARKE IM DOKUMENT: Ein Vorleseprogramm fuehrt sie
   in der Ueberschriftenliste, eine Suchmaschine liest sie als eigenes
   Thema der Seite, und wer mit der Tastatur springt, landet darauf.
   Vier Marken fuer vier Saetze verduennen die Gliederung, ohne dass
   ein Leser etwas davon hat - er sieht ohnehin nur fette Schrift.

   DESHALB BLEIBT DAS AUSSEHEN UND DIE MARKE FAELLT WEG. Die Regel
   gilt jetzt auch fuer .merkmal-titel (ein <p>), damit kein Pixel
   anders steht als vorher. Wer kuenftig doch eine echte Gliederung
   braucht, nimmt wieder h3 - die Regel traegt beide. */
.merkmal h3,
.merkmal .merkmal-titel {
  margin: 0 0 .3rem;
  font-size: 1rem;
  font-weight: 600;
  font-family: var(--schrift-titel);
  color: var(--tinte);
  line-height: 1.3;
}
.merkmal p { margin: 0; font-size: .92rem; color: var(--tinte-2); }
.merkmal p.merkmal-titel { font-size: 1rem; color: var(--tinte); }

/* Tarifkarten */
.tarife { display: grid; gap: 1rem; align-items: start; }
@media (min-width: 860px) { .tarife { grid-template-columns: repeat(3, 1fr); } }

.tarif {
  display: flex;
  flex-direction: column;
  gap: .7rem;
  background: var(--flaeche);
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  padding: 1.3rem 1.35rem;
}
.tarif--empfohlen { border-color: var(--kenn); box-shadow: 0 0 0 1px var(--kenn); }
.tarif-name {
  font-family: var(--schrift-daten);
  font-size: .7rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--tinte-3);
  display: flex;
  align-items: center;
  gap: .5rem;
}
.tarif--empfohlen .tarif-name { color: var(--kenn); }
.tarif-preis {
  font-family: var(--schrift-titel);
  font-size: 1.9rem;
  font-weight: 700;
  letter-spacing: -.025em;
  line-height: 1.1;
}
.tarif-preis small { font-family: var(--schrift-text); font-size: .8rem; font-weight: 400; color: var(--tinte-3); letter-spacing: 0; }
/* Die Steuerangabe. Sie steht direkt unter dem Preis und nicht als
   Fussnote am Seitenende: "19 EUR" und "zzgl. 19 % USt." gehoeren
   zusammen gelesen, sonst ist die grosse Zahl eine halbe Angabe. Der
   negative obere Abstand holt sie an den Preis heran, den .tarife per
   grid-gap sonst von ihr wegschiebt. */
.tarif-steuer {
  display: block;
  margin-top: -.45rem;
  font-size: .78rem;
  color: var(--tinte-3);
}
.tarif-beschreibung { font-size: .88rem; color: var(--tinte-2); margin: 0; }
.tarif-merkmale { list-style: none; margin: 0; padding: 0; display: grid; gap: .35rem; font-size: .88rem; color: var(--tinte-2); }
.tarif-merkmale li { position: relative; padding-left: 1.15rem; }
/* Der Pfeil haengt links, der Text laeuft normal weiter. Vorher war das
   li ein Flex-Kasten mit gap - dann wird jedes Kind ein eigener Kasten,
   und der Abstand landete auch zwischen <strong>3 Kundennetze</strong>
   und dem folgenden ", streng getrennt": "3 Kundennetze , streng
   getrennt" (Befund vom 07.09.2026). */
.tarif-merkmale li::before { content: "→"; color: var(--kenn); position: absolute; left: 0; top: 0; }
.tarif-fuss { margin-top: auto; padding-top: .6rem; }

/* DER QUERVERWEIS AUF DIE ANDEREN LEISTUNGEN.
   Er steht am Fuss jeder Auftrittsseite und trug bis zum 09.09.2026
   keine einzige Regel - kein Abstand, keine Trennlinie. Er lief damit
   in den Abschnitt darueber hinein, obwohl er das Angebot ist, das der
   Leser als naechstes sehen soll. Dieselbe Trennung wie .abschnitt,
   damit er als eigener Block dasteht. */
.leistungen-quer {
  padding: clamp(2rem, 5vw, 3.2rem) 0;
  border-top: 1px solid var(--linie-zart);
}
.leistungen-quer > h2 { max-width: var(--lesebreite); margin-bottom: 1.2rem; }

/* ==========================================================================
   Rechtstexte: Verzeichnis links, Text rechts
   ==========================================================================

   WAS HIER FALSCH WAR (11.09.2026)

   AGB, Datenschutzerklaerung und Auftragsverarbeitung sind die einzigen
   Seiten, die niemand liest, sondern DURCHSUCHT: "Wie lang ist die
   Kuendigungsfrist?", "Wer sind die Empfaenger?" Er sucht einen
   Paragraphen - und hatte dafuer nur die Bildlaufleiste. Dreizehn
   Paragraphen am Stueck in einer 680 Pixel schmalen Spalte, waehrend
   auf einem 2560er Schirm daneben 1900 Pixel leer blieben.

   Die Antwort ist NICHT, den Text breiter zu setzen. Eine Zeile ueber
   etwa 90 Zeichen findet das Auge am Zeilenende nicht mehr zurueck, und
   bei einem Text, den man ohnehin ungern liest, ist das das Ende. Der
   Platz geht an das Verzeichnis: Es steht daneben statt darueber, es
   bleibt beim Blaettern stehen, und es zeigt, wo man ist.

   Das Mass des Textes bleibt deshalb, wie es war. Neu ist nur, dass
   neben ihm etwas Nuetzliches steht. */

/* DAS MASS DER SEITE.

   Das Verzeichnis (17rem) und der Text (rund 68 Zeichen) nebeneinander,
   dazu der Abstand - mehr braucht ein Dokument nicht. Wer hier nach der
   vollen Schirmbreite sucht, sucht das Falsche: Eine Zeile ueber etwa
   90 Zeichen findet das Auge am Zeilenende nicht mehr zurueck, und bei
   einem Text, den man ohnehin ungern liest, hoert man dann auf.

   Das Mass steht an EINER Stelle, weil zwei Dinge daran haengen: die
   Ueberschrift samt Hinweiskasten oben und das Raster darunter. Liefen
   sie auseinander, staende die Ueberschrift neben dem Text statt
   ueber ihm. */
.rechtsseite {
  --rechtsmass: 58rem;
  max-width: var(--rechtsmass);
  margin-inline: auto;
}

.rechtslayout {
  display: grid;
  gap: clamp(1.4rem, 3vw, 2.6rem);
  align-items: start;
  /* Untereinander, bis beide Spalten ihr Mass bekommen. */
  grid-template-columns: minmax(0, 1fr);
}

@media (min-width: 62rem) {
  .rechtslayout { grid-template-columns: 17rem minmax(0, 1fr); }
}

/* Das Verzeichnis.

   <details> und nicht <nav> allein: Auf dem Telefon steht es UEBER dem
   Text, und dreizehn Zeilen Liste waeren dort eine Seite Vorspann vor
   dem ersten Satz. Zugeklappt ist es eine Zeile.

   DER PFEIL BLEIBT AUCH AUF DEM SCHREIBTISCH. Er einmal auszublenden
   war verlockend - dort ist ja Platz -, aber das Element bliebe
   klickbar: ein Aufklapper, der nicht danach aussieht und beim
   Anfassen die Liste einklappt. Wer sie zuklappen will, darf das
   ueberall; er sieht nur vorher, dass es geht. */
.rechts-toc {
  border: 1px solid var(--linie-zart);
  border-radius: var(--r-gross);
  background: var(--flaeche-2);
  padding: .9rem 1rem;
}
.rechts-toc-titel {
  font-family: var(--schrift-titel);
  font-size: .82rem;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--tinte-2);
  cursor: pointer;
}
.rechts-toc-titel::marker { color: var(--tinte-3); }
.rechts-toc-liste {
  list-style: none;
  margin: .7rem 0 0;
  padding: 0;
  display: grid;
  gap: .1rem;
}
.rechts-toc-punkt a {
  display: block;
  padding: .3rem .5rem;
  border-radius: var(--r-klein);
  font-size: .88rem;
  line-height: 1.35;
  color: var(--tinte-2);
  text-decoration: none;
  /* Ein Paragraphentitel ist kein Schlagwort - er darf umbrechen.
     Abgeschnitten waere die Liste kuerzer und unbrauchbar. */
  overflow-wrap: anywhere;
}
.rechts-toc-punkt a:hover { background: var(--flaeche-3); color: var(--tinte); }
.rechts-toc-punkt--e3 a { padding-left: 1.4rem; font-size: .83rem; color: var(--tinte-3); }

/* WO MAN GERADE IST.

   Das setzt ido.js beim Blaettern (IntersectionObserver). Ohne
   JavaScript fehlt nur diese Markierung - die Liste selbst sind
   Sprungziele und funktionieren auch dann. */
.rechts-toc-punkt--hier > a {
  background: var(--kenn-bg);
  color: var(--tinte);
  font-weight: 600;
  box-shadow: inset 2px 0 0 var(--kenn);
}

@media (min-width: 62rem) {
  .rechts-toc {
    /* BLEIBT STEHEN. Das ist der eigentliche Gewinn gegenueber einem
       Verzeichnis am Seitenanfang: Wer in § 9 etwas nachgelesen hat,
       springt von dort direkt in § 3, ohne wieder nach oben zu
       blaettern.

       Die Hoehe ist begrenzt und der Rest scrollt in sich - sonst
       ragte eine lange Gliederung unten aus dem Bild und die letzten
       Punkte waeren nie erreichbar. 4.5rem ist die Kopfzeile, dieselbe
       Zahl wie bei scroll-margin-top ganz oben. */
    position: sticky;
    top: 5.5rem;
    max-height: calc(100vh - 7rem);
    overflow-y: auto;
  }
}

/* Rechtstexte und lange Fliesstexte */
.rechtstext { max-width: 68ch; }

/* EIN FLIESSTEXT, DESSEN LISTEN DIE FLAECHE FUELLEN DUERFEN
   (11.09.2026).

   Gemeldet wurde es an anderer Stelle - "da ist rechts alles frei" -,
   aber es ist dieselbe Sache: Auf /dyndns standen sechs kurze
   Erklaerungen untereinander in einer 68 Zeichen schmalen Spalte, und
   auf einem 1600er Schirm blieb die halbe Seite leer.

   Das Mass bleibt, wo es hingehoert: an den ABSAETZEN. Eine Zeile ueber
   etwa 90 Zeichen findet das Auge am Zeilenende nicht mehr zurueck -
   das gilt fuer Fliesstext. Eine Stichwortliste hat dieses Problem
   nicht: Jeder Eintrag ist drei Zeilen lang und faengt links wieder an. */
.rechtstext--breit { max-width: none; }
.rechtstext--breit > p,
.rechtstext--breit > .nachsatz { max-width: 68ch; }

/* Listen ueber die Flaeche, in so vielen Spalten wie hineinpassen.

   auto-fit und nicht auto-fill: Bei nur zwei Eintraegen sollen sie
   nebeneinander stehen und nicht in zwei von vier Spalten, waehrend
   rechts zwei leere Bahnen stehen bleiben. 24rem ist die Breite, unter
   der eine Erklaerung anfaengt, Wort fuer Wort umzubrechen.

   DAS min() IST NICHT ZU HABEN (Befund beim Nachmessen, 11.09.2026).
   Ohne es steht dort eine feste Untergrenze von 24rem = 384 Pixeln -
   auch dann, wenn es ohnehin nur EINE Spalte gibt. Auf einem 390 Pixel
   breiten Telefon kommt der Seitenrand dazu, und die ganze Seite bekam
   eine waagerechte Bildlaufleiste. Genau der Fehler, den Aufgabe 74
   schon einmal aus der Preistabelle geholt hat. */
.spalten {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
  gap: .4rem 2.5rem;
}
/* In einer <dl> steht das Paar aus Stichwort und Erklaerung in einem
   <div> - sonst koennte das Raster beide in verschiedene Spalten
   setzen. Beide Faelle stehen hier, damit eine <ul> dieselbe Klasse
   benutzen kann. */
.spalten > li, .spalten > div { break-inside: avoid; }
.spalten > div > :first-child { margin-top: 0; }
/* Eine ungebrochene Adresse im Text eines Kunden ragt bei 390 Pixeln
   ueber den Rand und gibt der ganzen Seite eine Bildlaufleiste. Der
   Text kommt vom Autor; kuerzen kann ihn die Vorlage nicht. */
.rechtstext a { overflow-wrap: anywhere; }
.rechtstext h2 { font-size: 1.15rem; margin-top: 2rem; }
.rechtstext h3 { font-size: .98rem; margin-top: 1.4rem; }
.rechtstext ul, .rechtstext ol { padding-left: 1.2rem; margin: 0 0 1.25rem; }

/* EIN HAAR ZWISCHEN DEN PUNKTEN (11.09.2026).
   
   Eine Aufzaehlung, deren Punkte einander beruehren, ist eine Wand.
   Drei Zeilen Abstand waeren zu viel - dann zerfaellt die Liste in
   Einzelaussagen, und genau das ist sie nicht.
   
   Nur im FLIESSTEXT, nicht ueberall: In einer Navigation, einer
   Werteliste oder einem Menue ist Dichte richtig. Deshalb stehen die
   Traeger hier einzeln statt eines globalen "li". */
.rechtstext li,
.karte > ul > li, .karte > ol > li,
.hinweiskasten > ul > li, .hinweiskasten > ol > li { margin-bottom: .35rem; }
.rechtstext li:last-child,
.karte > ul > li:last-child, .karte > ol > li:last-child,
.hinweiskasten > ul > li:last-child, .hinweiskasten > ol > li:last-child { margin-bottom: 0; }
.rechtstext li::marker { color: var(--tinte-3); }
.rechtstext dl { margin: 0 0 1rem; }
.rechtstext dt { font-weight: 600; margin-top: .8rem; }
.rechtstext dd { margin: 0 0 .3rem; color: var(--tinte-2); }

/* Anleitungen */
.anleitung-schritte { list-style: none; counter-reset: anleitung; padding: 0; margin: 0; display: grid; gap: 1.1rem; }
.anleitung-schritte > li {
  counter-increment: anleitung;
  display: grid;
  grid-template-columns: 1.9rem 1fr;
  gap: .3rem .9rem;
  align-items: start;
}
.anleitung-schritte > li::before {
  content: counter(anleitung);
  font-family: var(--schrift-titel);
  font-weight: 700;
  font-size: .88rem;
  color: var(--kenn);
  background: var(--kenn-bg);
  border-radius: 50%;
  width: 1.75rem; height: 1.75rem;
  display: flex; align-items: center; justify-content: center;
}
.anleitung-schritte > li > * { grid-column: 2; margin: 0; }
.anleitung-schritte > li > *:first-child { margin-bottom: .25rem; font-weight: 600; }

/* Die Beschriftungsspalte hoechstens ein gutes Drittel breit: Mit
   "max-content" nahm sich eine lange Beschriftung (eine Fehlermeldung,
   ein Pfad) zwei Drittel der Zeile, und der Wert daneben lief als
   schmales Band ueber zwanzig Zeilen (Befund 08.09.2026, OPNsense). */
.werteliste { display: grid; grid-template-columns: fit-content(38%) 1fr; gap: .35rem 1.2rem; font-size: .9rem; margin: .7rem 0 0; }
.werteliste dt { font-size: .84rem; color: var(--tinte-3); }
/* "overflow-wrap: anywhere" statt "word-break: break-all": Beides
   zerlegt einen 44 Zeichen langen Schluessel, der sonst die Zelle
   sprengt. break-all bricht aber AUCH dort, wo eine Wortgrenze zwei
   Zeichen weiter laege - dann steht in der Zelle "DNS-Rebin/d-Schutz",
   "vollstaendi/g", "17:39 U/hr)". anywhere greift erst, wenn ein Wort
   allein nicht passt (Befund 09.09.2026). */
.werteliste dd { margin: 0; font-family: var(--schrift-daten); font-size: .86rem; overflow-wrap: anywhere; }

/* AUF DEM HANDY UNTEREINANDER.

   "max-content" fuer die Beschriftung ist auf einem breiten Schirm
   richtig und auf einem schmalen der Ruin: Eine Beschriftung wie „Kein
   Rebind-Schutz im Einsatz?" nimmt sich zwei Drittel der Zeile, und der
   Wert daneben laeuft als zehn Zeichen breites Band ueber zwanzig
   Zeilen. Genau in dem Kasten, der darueber entscheidet, ob die
   Einrichtung beim Kunden funktioniert. */
@media (max-width: 640px) {
  .werteliste { grid-template-columns: 1fr; gap: .15rem; }
  .werteliste dt { margin-top: .6rem; }
  .werteliste dt:first-child { margin-top: 0; }
}

/* Fliesstext in einer Datenspalte.
   In .zahl-Zellen gilt die Datenschrift. Fuer Adressen und Schluessel
   ist das richtig, fuer einen Erklaersatz nicht: Sechs Zeilen Monospace
   liest niemand, und genau dort steht der Hinweis, an dem die
   Einrichtung sonst scheitert. */
.lesetext, .lesetext p, .lesetext dt, .lesetext summary { font-family: var(--schrift-text); }
.lesetext .mono, .lesetext dd { font-family: var(--schrift-daten); }

/* Angaben zum Abschreiben - auch in einer schmalen Tabellenspalte.
   Bewusst KEIN Raster wie .werteliste: Deren "max-content"-Spalte zieht
   eine lange Beschriftung in die Breite, und in einer Tabellenzelle
   waechst damit die ganze Tabelle. Hier steht die Beschriftung ueber
   dem Wert und der Wert darf umbrechen. */
.angabenliste { margin: 0; }
.angabenliste dt { font-size: .8rem; color: var(--tinte-3); margin-top: .45rem; }
.angabenliste dt:first-child { margin-top: 0; }
.angabenliste dd { margin: 0; font-family: var(--schrift-daten); font-size: .86rem; overflow-wrap: anywhere; }

/* Anmelde- und Registrierungsseiten */
.formularseite {
  max-width: 25rem;
  margin: clamp(1.5rem, 6vw, 3.5rem) auto;
}

/* --- Das volle Kontingent: ein Weg, keine Warnung (04.10.2026) ---------- */
.kontingent-voll {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--a-3) var(--a-5);
  margin-top: var(--a-4);
  padding: var(--a-4) var(--a-5);
  border: 1px solid var(--linie);
  border-radius: var(--r-gross);
  background: var(--flaeche);
}
.kontingent-voll p { max-width: 60ch; color: var(--tinte-2); }
.kontingent-voll strong { color: var(--tinte); }

/* --- Die Knopfreihe im Seitenkopf einer Leistungsseite (04.10.2026)

   Gemessen: Auf drei Leistungsseiten stand der erste Handlungsknopf
   erst nach drei Vierteln der Seite. Wer nach zwei Absaetzen ueberzeugt
   ist, fand nichts - und die Entschlossensten verliert man zuerst. */
.kopfaktionen {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a-2);
  margin-top: var(--a-4);
}

/* --- Die Anmeldeseite: Formular und Grund nebeneinander (04.10.2026)

   Das Registrierungsformular stand als einzelne Karte mittig in einer
   leeren Flaeche. Wer von /preise kommt, hat dort einen Preis und eine
   Leistung gesehen; auf dieser Seite stand davon nichts mehr.

   DAS FORMULAR BLEIBT SCHMAL. Ein Eingabefeld ueber 30rem laedt nicht
   zum Ausfuellen ein, es sieht nach Arbeit aus - deshalb behaelt die
   linke Spalte das Mass der .formularseite und wird nicht breiter,
   nur weil daneben Platz ist.

   EINSPALTIG BIS 60rem, und das Formular steht im Quelltext zuerst:
   Wer zum Anmelden kommt, soll nicht erst an einer Begruendung
   vorbeiscrollen. Erst wenn beide nebeneinander passen, stehen sie
   nebeneinander. */
.anmeldeseite {
  display: grid;
  gap: var(--a-5) var(--a-7);
  max-width: 25rem;
  margin: clamp(1.5rem, 6vw, 3.5rem) auto;
  align-items: start;
}
.anmeldeseite .karte { margin-bottom: 1rem; }

/* DIE FORMULARSPALTE.

   Sie traegt eine eigene Klasse und nicht nur .karte, weil sie im
   Raster eine Stelle hat: erste Spalte, erste Zeile. Ohne das
   entscheidet die Reihenfolge im Quelltext - und die soll das
   Formular zuerst nennen, damit es auf dem Telefon oben steht.

   margin: 0 hebt den Aussenabstand der .karte auf; im Raster macht das
   gap die Abstaende, und zwei Mechanismen nebeneinander ergeben einen
   Spalt, den niemand erklaeren kann. */
.anmeldeseite-formular { margin: 0; }

@media (min-width: 60rem) {
  .anmeldeseite {
    grid-template-columns: 25rem minmax(0, 22rem);
    max-width: none;
    justify-content: center;
  }
  /* Der Nebenweg ("Schon ein Konto?") gehoert unter das Formular und
     nicht unter die ganze Seite - sonst steht er mittig zwischen den
     Spalten und zeigt auf keine von beiden. */
  .anmeldeseite .nebenwege { grid-column: 1; }
  .anmeldeseite-dabei { grid-row: 1 / span 2; grid-column: 2; }
}

/* LEISER ALS DAS FORMULAR. Diese Spalte soll beantworten, nicht
   ueberreden: kein Kasten, keine Flaeche, keine Knoepfe. Wer sie
   ueberliest, verliert nichts - wer zoegert, findet dort den Grund. */
.anmeldeseite-dabei {
  font-size: var(--t-s);
  color: var(--tinte-2);
}
.anmeldeseite-dabei h2 {
  font-family: var(--schrift-text);
  font-size: var(--t-s);
  font-weight: 600;
  color: var(--tinte);
  margin: 0 0 var(--a-2);
  letter-spacing: 0;
}
.anmeldeseite-dabei h2 + * { margin-top: 0; }
.anmeldeseite-dabei > * + h2 { margin-top: var(--a-5); }
.anmeldeseite-dabei p { margin: 0; }

/* Die Schrittfolge nummeriert, weil sie wirklich eine Reihenfolge ist:
   Ohne den Bestaetigungslink gibt es kein Kundennetz, ohne Kundennetz
   keine Konfiguration. Eine Aufzaehlung mit Punkten waere hier eine
   Luege ueber den Ablauf. */
.schrittfolge {
  margin: 0;
  padding-left: 1.3em;
  display: grid;
  gap: var(--a-2);
}
.schrittfolge li { margin: 0; }
.formularseite .karte { margin-bottom: 1rem; }
/* 25rem reichen fuer "E-Mail und Passwort". Ein Formular mit
   Auswahlfeldern, Freitext und erklaerenden Zeilen darunter bricht auf
   dieser Breite jede zweite Zeile um - die Kuendigungsseite bekommt
   deshalb Platz, ohne dass der Rest der Anmeldeseiten breiter wird. */
.formularseite--breit { max-width: 38rem; }
.formularseite--breit .hinweiskasten { margin-top: 1.5rem; }
.formularseite h1 { font-size: 1.45rem; margin-bottom: .3rem; }
/* EIN KLEINERER TEXT BEKOMMT NICHT MEHR LUFT ALS EIN GROESSERER
   (11.09.2026). Die Unterzeile stand auf 1.4rem bei .9rem Schrift -
   das 1,56-fache, mehr als jeder Fliesstext daneben. Beim Abklappern
   war sie der einzige Absatz des ganzen Auftritts, der die Regel
   verkehrt herum anwandte. */
.formularseite .unterzeile { font-size: .9rem; color: var(--tinte-3); margin-bottom: 1.25em; }
.formularseite .nebenwege { text-align: center; font-size: .87rem; color: var(--tinte-3); }
.formularseite .nebenwege a { text-decoration: none; }
.formularseite .nebenwege a:hover { text-decoration: underline; }

/* ==========================================================================
   Bewegung nur, wenn gewuenscht
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* ==========================================================================
   Druck - vor allem fuer die Rechnungsansicht
   ========================================================================== */

@media print {
  .kopf, .fuss, .knopf, .thema, .sprungmarke { display: none !important; }
  body { background: #fff; color: #000; }
  .karte, .tabelle-rahmen { border-color: #999; box-shadow: none; }

  /* Der Zugriffsnachweis wird ausgedruckt und weitergegeben. Die
     Seitenleiste, der Zurueck-Link und die Bedienhinweise gehoeren dann
     nicht mehr dazu - sie sind fuer den, der die Seite bedient, nicht
     fuer den, der das Blatt in der Hand haelt. */
  .nur-bildschirm, .arbeit-seite { display: none !important; }
  .arbeit-inhalt, .inhalt { margin: 0; padding: 0; max-width: none; }

  /* Eine Tabelle, die mitten in einer Zeile umbricht, ist auf Papier
     schwer zu lesen - und in einem Nachweis sieht sie nach Luecke aus. */
  tr, .karte { break-inside: avoid; }

  /* DAS INHALTSVERZEICHNIS BLEIBT AM BILDSCHIRM (11.09.2026).

     Auf Papier sind seine Zeilen keine Sprungziele mehr, sondern eine
     Liste ohne Seitenzahlen - dreizehn Zeilen, die niemandem etwas
     sagen, vor dem eigentlichen Text. Wer die AGB ausdruckt, will die
     AGB. */
  .rechts-toc { display: none !important; }
  .rechtsseite, .rechtstext { max-width: none; }
  .rechtslayout { display: block; }
}

/* Nur am Bildschirm: Knoepfe und Hinweise, die auf Papier nichts
   verloren haben. Das Gegenstueck zu .nur-vorlesen. */
@media print {
  .nur-bildschirm { display: none !important; }
}

/* Ein Punkt in einer Rechtsliste, der nicht ueberlesen werden darf -
   etwa "wir haben den privaten Schluessel". Kein Ausrufezeichen, keine
   Farbe wie eine Fehlermeldung: Es ist eine Tatsache, keine Stoerung. */
dl dt.hervor {
    color: var(--tinte);
    border-left: 3px solid var(--kenn);
    padding-left: .6rem;
    margin-left: -.75rem;
}

/* ---------------------------------------------------------------------
   Rueckfrage vor unwiderruflichen Aktionen

   Ersetzt window.confirm(). Der Systemdialog kann den Namen dessen, was
   verschwindet, nicht hervorheben, beschriftet seine Knoepfe mit "OK"
   statt mit der Handlung - und laesst sich in manchen Browsern dauerhaft
   abschalten, womit die Rueckfrage still wegfiele.

   Das <dialog>-Element bringt Fokusfalle, Esc und Hintergrund selbst mit;
   hier steht nur das Aussehen.
   --------------------------------------------------------------------- */

.modal {
    padding: 0;
    border: 1px solid var(--linie);
    border-radius: var(--r-gross);
    box-shadow: var(--schatten);
    background: var(--flaeche);
    color: var(--tinte);
    max-width: min(34rem, calc(100vw - 2rem));
    width: 100%;
}

/* Der Hintergrund verdeckt, ohne die Seite unlesbar zu machen: Man soll
   noch sehen, worauf sich die Frage bezieht. */
.modal::backdrop {
    background: rgba(12, 21, 28, .45);
    backdrop-filter: blur(2px);
}

.modal-kasten { padding: 1.4rem 1.5rem 1.2rem; }

.modal-titel {
    font-family: var(--schrift-titel);
    font-size: 1.15rem;
    margin: 0 0 .5rem;
}

.modal-text {
    margin: 0 0 1.2rem;
    color: var(--tinte-2);
    line-height: 1.55;
    /* Ein langer Hostname darf den Dialog nicht breiter machen als den
       Bildschirm. */
    overflow-wrap: anywhere;
}

.modal-aktionen {
    display: flex;
    gap: .6rem;
    justify-content: flex-end;
    flex-wrap: wrap;
}

/* Auf schmalen Geraeten untereinander, und der Abbruch UNTEN: Der Daumen
   liegt dort, und dort soll nicht die Loeschung liegen. */
@media (max-width: 30rem) {
    .modal-aktionen { flex-direction: column-reverse; }
    .modal-aktionen .knopf { width: 100%; }
}

/* Kein Aufblenden fuer alle, die es nicht wollen. */
@media (prefers-reduced-motion: no-preference) {
    .modal[open] { animation: modal-auf .16s ease-out; }
    .modal[open]::backdrop { animation: modal-grund .16s ease-out; }
}

@keyframes modal-auf {
    from { opacity: 0; transform: translateY(.5rem) scale(.985); }
    to   { opacity: 1; transform: none; }
}

@keyframes modal-grund {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* Der Weg aus dem eigenen Bereich hinaus (Kundenbereich -> Verwaltung).
   Abgesetzt und ruhiger als die uebrigen Punkte: Er fuehrt woandershin,
   und das soll man sehen, bevor man klickt. */
.arbeit-seite-trenner {
    display: block;
    height: 1px;
    background: var(--linie-zart);
    margin: .55rem .7rem;
}

.arbeit-seite a.arbeit-seite-fremd { color: var(--tinte-3); }
.arbeit-seite a.arbeit-seite-fremd:hover { color: var(--tinte); }

/* DER WEG IN DEN EIGENEN KUNDENBEREICH (13.09.2026).

   Auf dem Verwaltungs-Host ist das kein Link, sondern ein Knopf: Die
   Kundensicht muss angestossen werden, sonst leitet der Host die
   Kundenseiten zur Hauptdomain um, wo die Sitzung nicht gilt (siehe
   VerwaltungsHost). Er sieht aus wie die Punkte darueber - ein Knopf,
   der sich als solcher zu erkennen gibt, waere hier eine Schaltflaeche
   mitten in einer Navigation. */
.arbeit-seite-form { display: contents; }
.arbeit-seite button.arbeit-seite-fremd {
  display: flex;
  align-items: center;
  gap: .6rem;
  width: 100%;
  padding: .55rem .7rem;
  border: 0;
  border-left: 2px solid transparent;
  border-radius: var(--r-klein);
  background: none;
  font: inherit;
  font-size: .9rem;
  text-align: left;
  color: var(--tinte-3);
  cursor: pointer;
}
.arbeit-seite button.arbeit-seite-fremd svg { width: 17px; height: 17px; flex: none; opacity: .75; }
.arbeit-seite button.arbeit-seite-fremd:hover { color: var(--tinte); background: var(--flaeche-2); }

/* Die eigene Kundensicht ist kein fremdes Konto - also auch kein
   Warnton. Ruhig, aber sichtbar: Man soll den Rueckweg finden, ohne
   erschreckt zu werden. */
.kundensicht-leiste--eigen {
  background: var(--kenn-bg);
  border-bottom-color: var(--kenn);
}

@media (max-width: 899px) {
    /* In der waagerechten Leiste braucht es keinen Strich - dort steht
       der Punkt ohnehin am Ende. */
    .arbeit-seite-trenner { display: none; }
}

/* ==========================================================================
   Befehle in Anleitungen
   ==========================================================================

   Ein Block zum Abtippen oder Kopieren. Waagerecht scrollbar und NICHT
   umbrechend: Ein umbrochener Shell-Befehl sieht aus wie zwei Befehle,
   und wer die zweite Zeile fuer sich ausfuehrt, bekommt einen Fehler,
   den er nicht einordnen kann. Lieber schieben als raten. */
.befehl {
    font-family: var(--schrift-daten);
    font-size: .84rem;
    line-height: 1.55;
    background: var(--flaeche-2);
    color: var(--tinte);
    border: 1px solid var(--linie);
    border-radius: 8px;
    padding: .8rem .9rem;
    margin: .6rem 0;
    overflow-x: auto;
    white-space: pre;
    -webkit-overflow-scrolling: touch;
}

/* BEFEHL-VARIANTEN. Hinter der Grundklasse - sie setzt white-space und
   die Rahmenkurzform selbst, und beide wurden vorher verschluckt. */
.befehl--umbruch { white-space: pre-wrap; overflow-wrap: anywhere; }
.befehl--hoch { max-height: 18rem; overflow: auto; }
.befehl--leise { border-color: transparent; }

/* Die Kommentarzeilen im Befehlsblock. Sie erklaeren, was der naechste
   Befehl tut - und sollen dabei nicht so aussehen wie das, was man
   eintippt. */
.befehl .bem { color: var(--tinte-3); }

/* Der Weg von einer Anleitung zurueck zum Angebot. Ruhig gehalten: Die
   Anleitung ist der Grund, weshalb jemand hier ist, und bleibt es. */
.anleitung-angebot {
  font-size: .88rem;
  color: var(--tinte-3);
  border-left: 2px solid var(--kenn);
  padding-left: .8rem;
  margin: 1.2rem 0 0;
}

/* Namen zum Abschreiben INNERHALB einer Werteliste.
   Zwei Dinge, die dort sonst schiefgehen: .zugangsdaten zieht seinen
   Knopf in einer 1fr-Spalte auf die halbe Kastenbreite, und
   "word-break: break-all" aus .werteliste dd zerlegt den Erklaersatz
   daneben mitten im Wort ("di e Namen darunter"). */
.namensliste { list-style: none; display: flex; flex-direction: column; gap: .4rem; margin: .6rem 0 0; padding: 0; }
.namensliste > li { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
/* Fliesstext dort, wo sonst Daten stehen - als einzelner Absatz in
   einer Zelle (.fliesstext) oder fuer eine ganze Liste, die von Haus aus
   Saetze enthaelt (--text). Ohne das gilt die Datenschrift samt
   "word-break: break-all", und dann bricht ein Satz mitten im Wort:
   "die Zuweisu ng fehlt". */
.werteliste dd .fliesstext,
.werteliste--text dd {
  font-family: var(--schrift-text);
  word-break: normal;
  overflow-wrap: break-word;
}
/* DIE FEHLERSUCHE: Beschriftung ist die Meldung, Wert ist der Absatz
   dazu. Beides untereinander - eine Meldung wie "Die Zertifikatsliste
   war nicht abrufbar (HTTP 401)" ist keine Spaltenueberschrift. */
.werteliste--text { grid-template-columns: 1fr; gap: .2rem 0; }
.werteliste--text dt { font-size: var(--t-s); color: var(--tinte); font-weight: 600; margin-top: var(--a-4); }
.werteliste--text dt:first-child { margin-top: 0; }
.werteliste--text dd { max-width: var(--lesebreite); font-size: var(--t-s); }

/* Mehrere Knoepfe rechts in der Kopfzeile. Umbrechend, damit auf dem
   Handy nicht die Ueberschrift daneben zusammengedrueckt wird. */
.kopfaktionen { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }

/* ==========================================================================
   ANFRAGEN (Ticketsystem) und BEITRAEGE (Community-Anleitungen), 09.09.2026
   ========================================================================== */

/* Zaehler in der Seitenleiste: wie viele Anfragen offen sind. */
.seiten-zaehler {
  display: inline-block; min-width: 1.4em; padding: 0 .4em; margin-left: auto;
  border-radius: 999px; background: var(--kenn); color: #fff;
  font-size: var(--t-xs); font-weight: 600; line-height: 1.5; text-align: center;
}

/* Reiter ueber einer Liste: Offen / Meine / Wartet auf Kunde / Geschlossen.
   Dieselbe Form wie .wissen-reiter, aber ohne dessen Bindung an die
   Anleitungsseite. */
.reiter { display: flex; flex-wrap: wrap; gap: .35rem; margin: 0 0 var(--a-4); padding: 0; list-style: none; }
.reiter a {
  display: inline-flex; align-items: center; gap: .4rem;
  padding: .38rem .8rem; border: 1px solid var(--linie); border-radius: 999px;
  color: var(--tinte-2); text-decoration: none; font-size: var(--t-s); background: var(--flaeche);
}
.reiter a:hover { border-color: var(--kenn); color: var(--kenn); }
.reiter a[aria-current="true"] { background: var(--kenn); border-color: var(--kenn); color: #fff; }
.reiter a .reiter-zahl { font-family: var(--schrift-daten); font-size: var(--t-xs); opacity: .8; }

/* DER VERLAUF EINER ANFRAGE. Eine Liste von Eintraegen, jeder mit
   Kopfzeile (wer, wann, wie) und Text. Die Art faerbt den linken Rand,
   sonst nichts: Vier bunte Blasen waeren ein Chat, das hier ist ein
   Vorgang. Interne Notizen sind schraffiert markiert, damit man beim
   Lesen nie im Zweifel ist, was der Kunde sieht. */
.verlauf { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--a-4); }
.verlauf-eintrag {
  border: 1px solid var(--linie); border-left: 4px solid var(--linie);
  border-radius: var(--rundung); background: var(--flaeche); padding: var(--a-4) var(--a-5);
}
/* Ein Kasten von 1624 Pixeln, in dem der Text bei 470 endet, ist kein
   Gespraech, sondern eine Wand. Der Eintrag hoert deshalb dort auf, wo
   die Nachricht aufhoert - mit Luft fuer Name, Rolle und Zeitpunkt in
   der Kopfzeile. */
.verlauf-eintrag { max-width: 60rem; }
.verlauf-eintrag--kunde    { border-left-color: var(--messing); }
.verlauf-eintrag--antwort  { border-left-color: var(--kenn); }
.verlauf-eintrag--betreiber{ border-left-color: var(--kenn); }
.verlauf-eintrag--notiz    { border-left-color: var(--verspaetet); background: var(--flaeche-2); }
.verlauf-eintrag--system   { border-left-color: transparent; border-color: transparent; background: transparent; padding: 0 var(--a-5); color: var(--tinte-3); font-size: var(--t-s); }
.verlauf-kopf { display: flex; flex-wrap: wrap; gap: .3rem .8rem; align-items: baseline; margin: 0 0 var(--a-2); font-size: var(--t-s); color: var(--tinte-2); }
.verlauf-kopf strong { color: var(--tinte); }
.verlauf-kopf time { font-family: var(--schrift-daten); font-size: var(--t-xs); }
.verlauf-text { white-space: pre-wrap; overflow-wrap: anywhere; max-width: var(--lesebreite); margin: 0; }
.verlauf-eintrag--system .verlauf-text { max-width: none; }

/* Anhaenge unter einer Nachricht. */
.anhangliste { list-style: none; margin: var(--a-3) 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .4rem; }
.anhangliste a {
  display: inline-flex; align-items: center; gap: .35rem; padding: .25rem .6rem;
  border: 1px solid var(--linie); border-radius: 999px; font-size: var(--t-xs);
  text-decoration: none; color: var(--tinte-2); background: var(--flaeche);
}
.anhangliste a:hover { border-color: var(--kenn); color: var(--kenn); }

/* Kopfleiste einer Anfrage: Nummer, Status, Prioritaet, Bearbeiter -
   als Werteliste in einer Zeile. */
.kennzeile { display: flex; flex-wrap: wrap; gap: .4rem .9rem; align-items: center; margin: 0; padding: 0; list-style: none; font-size: var(--t-s); color: var(--tinte-2); }
.kennzeile li { display: inline-flex; align-items: center; gap: .35rem; }

/* Prioritaeten als Marker - dieselbe Familie wie .marker. */
.marker--kritisch { background: var(--inaktiv-bg); color: var(--inaktiv); border-color: var(--inaktiv); font-weight: 700; }

/* Das Reaktionsziel: ueberschritten wird rot, sonst still. */
.frist--ueberschritten { color: var(--inaktiv); font-weight: 600; }

/* Die Formulare unter dem Verlauf: Antwort und Notiz nebeneinander als
   Umschalter, ein grosses Textfeld. */
/* Ein Schreibfeld ist so breit wie das, was darin entsteht. Ohne Mass
   lief es ueber die ganze Flaeche - man schreibt dann Zeilen, die
   niemand gern liest. */
.antwortfeld, .editor-abschnitt { max-width: var(--doku-breite); }
.antwortfeld textarea { min-height: 9rem; }
.antwortfeld .formaktionen { justify-content: space-between; }

/* Textbausteine: eine Auswahl neben dem Antwortfeld. */
.bausteinwahl { display: flex; flex-wrap: wrap; gap: .4rem; margin: 0 0 var(--a-3); }

/* Beitrags-Editor: vier Abschnitte, jeder ein grosses Textfeld mit
   Hilfe daneben. */
.editor-abschnitt textarea { min-height: 11rem; font-family: var(--schrift-daten); font-size: var(--t-s); line-height: 1.55; }
.editor-hilfe { font-size: var(--t-s); color: var(--tinte-2); max-width: var(--lesebreite); }
.editor-hilfe code { font-family: var(--schrift-daten); background: var(--flaeche-2); padding: .05em .3em; border-radius: 3px; }

/* Der Autorenhinweis ueber einem Community-Beitrag. */
.beitrag-autor { display: flex; flex-wrap: wrap; gap: .4rem .9rem; align-items: center; font-size: var(--t-s); color: var(--tinte-2); margin: 0 0 var(--a-4); }

/* ==========================================================================
   FASSUNGEN UND BILDER DER COMMUNITY-BEITRAEGE, 09.09.2026
   ========================================================================== */

/* DER VERGLEICH ZWEIER FASSUNGEN.
   Zeilenweise, wie man einen Text liest - nicht wortweise: Wer prueft,
   will wissen, WELCHE Schritte dazugekommen sind, nicht welche Silbe
   sich geaendert hat.

   Farbe ALLEIN traegt die Auskunft nicht (rot-gruen-Schwaeche und
   Ausdrucke): Vor jeder Zeile steht ein Zeichen, + oder -, und
   entfernte Zeilen sind durchgestrichen. */
.vergleich {
  border: 1px solid var(--linie); border-radius: var(--rundung);
  background: var(--flaeche); overflow: hidden; margin: var(--a-4) 0 0;
}
.vergleich-kopf {
  display: flex; flex-wrap: wrap; gap: .4rem 1rem; align-items: baseline;
  padding: var(--a-3) var(--a-4); border-bottom: 1px solid var(--linie);
  background: var(--flaeche-2); font-size: var(--t-s);
}
.vergleich-kopf strong { font-size: var(--t-m); }
.vergleich-abschnitt {
  padding: var(--a-2) var(--a-4); border-top: 1px solid var(--linie);
  font-size: var(--t-etikett); letter-spacing: .05em; text-transform: uppercase;
  color: var(--tinte-3); font-family: var(--schrift-daten);
}
.vergleich-zeilen { margin: 0; padding: 0; list-style: none; font-family: var(--schrift-daten); font-size: var(--t-s); }
.vergleich-zeilen li {
  display: flex; gap: .6rem; padding: .12rem var(--a-4);
  white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.5;
}
.vergleich-zeilen li::before {
  content: attr(data-zeichen); flex: none; width: 1ch;
  color: var(--tinte-3); font-weight: 600;
}
.vergleich-zeilen .neu  { background: var(--aktiv-bg); }
.vergleich-zeilen .weg  { background: var(--inaktiv-bg); text-decoration: line-through; color: var(--tinte-2); }
.vergleich-zeilen .neu::before { color: var(--aktiv); }
.vergleich-zeilen .weg::before { color: var(--inaktiv); }
/* Unveraenderte Zeilen sind der Zusammenhang - lesbar, aber leise. */
.vergleich-zeilen .gleich { color: var(--tinte-3); }
.vergleich-leer { padding: var(--a-5) var(--a-4); color: var(--tinte-3); font-size: var(--t-s); text-align: center; }

/* Die Liste der Fassungen. */
.fassungsliste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .3rem; }
.fassungsliste li {
  display: flex; flex-wrap: wrap; gap: .3rem .8rem; align-items: baseline;
  padding: .45rem var(--a-3); border: 1px solid var(--linie); border-radius: var(--rundung);
  font-size: var(--t-s); background: var(--flaeche);
}
.fassungsliste .nummer { font-family: var(--schrift-daten); font-weight: 600; }
.fassungsliste time { font-family: var(--schrift-daten); font-size: var(--t-xs); color: var(--tinte-3); }

/* BILDER IM BEITRAG.
   Eine Abbildung ist ein eigener Block mit Beschriftung darunter, nicht
   ein Bild mitten im Absatz: In einer Anleitung zeigt sie einen
   Bildschirm, und der braucht Platz und eine Bildunterschrift, die
   sagt, was darauf zu sehen ist. */
.abbildung { margin: var(--a-5) 0; }
.abbildung img {
  display: block; max-width: 100%; height: auto;
  border: 1px solid var(--linie); border-radius: var(--rundung); background: var(--flaeche-2);
}
.abbildung figcaption {
  margin-top: var(--a-2); font-size: var(--t-s); color: var(--tinte-2);
  max-width: var(--lesebreite);
}
.abbildung figcaption .nummer { font-family: var(--schrift-daten); color: var(--tinte-3); margin-right: .4rem; }

/* Die Bilder im Editor: Vorschau, Nummer zum Einsetzen, Entfernen. */
.bilderraster { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr)); gap: var(--a-4); margin: var(--a-4) 0 0; }
.bilderkachel { border: 1px solid var(--linie); border-radius: var(--rundung); overflow: hidden; background: var(--flaeche); display: flex; flex-direction: column; }
.bilderkachel img { display: block; width: 100%; height: 8rem; object-fit: cover; background: var(--flaeche-2); }
.bilderkachel-fuss { padding: var(--a-3); display: flex; flex-direction: column; gap: .35rem; font-size: var(--t-s); }
.bilderkachel-marke { font-family: var(--schrift-daten); font-size: var(--t-xs); color: var(--kenn); }

/* ==========================================================================
   Fingerbedienung
   --------------------------------------------------------------------------
   Ein Block am Ende, damit er die kompakten Werte des Arbeitsbereichs
   sicher ueberschreibt. Er greift nur bei grobem Zeiger - am Schreibtisch
   bleibt die Oberflaeche dicht wie eine Desktopanwendung, am Handy wird
   sie treffsicher.
   ========================================================================== */

@media (pointer: coarse) {
  /* 44 px sind das Mindestmass, das ein Finger zuverlaessig trifft. */
  .knopf, .arbeit-inhalt .knopf { min-height: 2.75rem; }
  /* Auch der kleine Knopf. Er ist auf dem Schreibtisch fuer die Dichte
     einer Tabelle richtig - am Finger ist er in einer gestapelten
     Tabellenzeile die Hauptbedienung, und 38 Pixel trifft man daneben. */
  .knopf--klein, .arbeit-inhalt .knopf--klein { min-height: 2.75rem; }
  .reiter a { min-height: 2.75rem; display: inline-flex; align-items: center; }

  /* Unter 16 px zoomt Safari auf dem iPhone beim Antippen in das Feld
     hinein; die Seite steht danach verschoben. */
  input, select, textarea,
  .arbeit-inhalt input[type="text"], .arbeit-inhalt input[type="email"],
  .arbeit-inhalt input[type="password"], .arbeit-inhalt input[type="search"],
  .arbeit-inhalt input[type="tel"], .arbeit-inhalt input[type="date"],
  .arbeit-inhalt input[type="number"], .arbeit-inhalt select,
  .arbeit-inhalt textarea { font-size: 1rem; }

  /* Ein 36 Pixel hohes Feld ist am Finger dasselbe Problem wie ein
     36 Pixel hoher Knopf. Der Textbereich bleibt aussen vor, er bringt
     seine eigene Hoehe mit. */
  input, select,
  .arbeit-inhalt input[type="text"], .arbeit-inhalt input[type="email"],
  .arbeit-inhalt input[type="password"], .arbeit-inhalt input[type="search"],
  .arbeit-inhalt input[type="tel"], .arbeit-inhalt input[type="date"],
  .arbeit-inhalt input[type="number"], .arbeit-inhalt select { min-height: 2.75rem; }
  .ankreuz input[type="checkbox"], .ankreuz input[type="radio"] { min-height: 0; }

  /* 17 px grosse Kaestchen trifft niemand. */
  .ankreuz input[type="checkbox"], .ankreuz input[type="radio"] {
    width: 1.3rem; height: 1.3rem; margin-top: .1rem;
  }
  .ankreuz { padding: .2rem 0; }
}

/* ==========================================================================
   HIER STAND DAS EINWILLIGUNGSBANNER (13.09. bis 23.09.2026)
   --------------------------------------------------------------------------
   Rund sechzig Zeilen fuer ein Banner am unteren Rand, eine
   Auswahlliste je Anbieter und zwei gleich grosse Knoepfe fuer Ja und
   Nein. Gebraucht wurden sie fuer die Werbepixel von Google, Meta und
   TikTok.

   Aus dem Betrieb kam die Entscheidung dagegen: "auf der Live-Seite
   soll kein Fremdscript geladen werden." Damit gibt es nichts mehr,
   worin einzuwilligen waere - und ein Banner, das nach etwas fragt,
   das gar nicht stattfindet, ist die haeufigste Unsitte fremder
   Seiten.

   Die Regeln stehen nicht auskommentiert hier herum, sondern
   vollstaendig im Zweig claude/remarketing-parkplatz. Toter Code in
   einer Datei, die jeder Entwickler nach Klassennamen durchsucht,
   kostet mehr als ein Zweig.
   ========================================================================== */

/* Das hinterlegte Briefkopf-Logo in der Verwaltung. Feste HOEHE, freie
   Breite - genau wie im gedruckten Brief (Brieflogo::HOEHE_MM): Ein
   liegendes und ein stehendes Logo sollen gleich gross WIRKEN, und das
   tun sie ueber die Hoehe. */
.brieflogo-probe {
  display: block;
  height: 4.5rem;
  width: auto;
  max-width: 100%;
}

/* ==========================================================================
   DER HONIGTOPF - das Feld, das es fuer Menschen nicht gibt (24.09.2026)
   --------------------------------------------------------------------------
   NICHT display:none UND NICHT visibility:hidden. Beides pruefen
   Geschwader seit Jahren ab: Ein Feld, das so versteckt ist, fuellen
   sie nicht aus - und dann faengt die Falle niemanden.

   Stattdessen steht es weit ausserhalb des Bildes. Im Quelltext ist es
   ein ganz gewoehnliches Textfeld mit Beschriftung; nur sehen kann es
   niemand.

   DIE DREI ANDEREN SCHLOESSER STEHEN IN DER VORLAGE: aria-hidden fuer
   das Vorleseprogramm, tabindex="-1" gegen den Tabulator,
   autocomplete="off" gegen den Passwortspeicher. Wer mit der Tastatur
   oder mit einem Vorleseprogramm arbeitet, kommt gar nicht erst hin -
   sonst waere diese Falle eine Barriere.
   ========================================================================== */

.falle {
  position: absolute;
  left: -9999px;
  top: auto;
  width: 1px; height: 1px;
  overflow: hidden;
}

/* === DIE ANZEIGEN-ZIELSEITE /fernzugriff-testen ========================
   (30.09.2026)

   Aus dem Auftrag, mit der Messung dazu: 77 Anzeigenbesuche auf
   /vpn-fernzugriff, 92 % nur eine Seite, null Registrierungen. Die
   Seite beantwortet jede Frage - und genau das ist fuer jemanden, der
   aus einer Anzeige kommt, zu viel.

   DIE HARTE VORGABE IST DER ERSTE BILDSCHIRM: Ueberschrift, drei
   Belege und der Knopf muessen ohne Scrollen zu sehen sein, auch auf
   375 Pixeln Breite. Das ist der Grund fuer jede Zahl hier unten -
   kleinere Schrift in der Ueberschrift als in der grossen Buehne,
   engere Abstaende, kein Bild.

   Nachgemessen wird es, nicht geschaetzt: siehe LandungTest. */

/* Die schmale Kopfzeile: Schriftzug, Anmelden, Erscheinungsbild. Kein
   Klappmenue, also auch kein Platz dafuer. */
.kopf--schlank .menue-fuss {
  margin: 0 0 0 auto;
  padding: 0;
  border-top: none;
  flex-wrap: nowrap;
}
.kopf--schlank .menue-fuss .knopf { flex: none; }
.kopf--schlank .thema { margin-left: var(--a-3); }

.landung-buehne {
  padding: var(--a-5) 0 var(--a-6);
  display: flex;
  flex-direction: column;
  gap: var(--a-4);
}

/* KLEINER ALS DIE GROSSE BUEHNE, und das ist der Punkt. Dort darf die
   Ueberschrift den halben Bildschirm nehmen; hier muessen darunter noch
   drei Belege und ein Knopf stehen. */
.landung-buehne h1 {
  font-size: clamp(1.45rem, 5.2vw, 2.4rem);
  line-height: 1.16;
  letter-spacing: -.02em;
  max-width: 24ch;
  margin: 0;
}

.landung-belege {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--a-3);
  max-width: 46ch;
}
.landung-belege li {
  position: relative;
  padding-left: 1.6rem;
  font-size: var(--t-m);
  line-height: 1.45;
}
/* Der Haken als Pseudo-Element und nicht als Zeichen im Text: Ein
   Vorleseprogramm liest ihn sonst bei jedem Punkt mit. */
.landung-belege li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .42em;
  width: .95rem;
  height: .5rem;
  border-left: 2px solid var(--kenn);
  border-bottom: 2px solid var(--kenn);
  transform: rotate(-45deg);
}

.landung-aktion {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--a-3);
}

/* Der eine Knopf, der die Entscheidung traegt. Auf dem Handy ueber die
   ganze Breite - ein Ziel, das man nicht verfehlen kann. */
.knopf--gross {
  font-size: 1.02rem;
  padding: .85rem 1.5rem;
  width: 100%;
  justify-content: center;
  text-align: center;
}
@media (min-width: 560px) {
  .knopf--gross { width: auto; }
}

.landung-nebenweg {
  font-size: var(--t-s);
  color: var(--tinte-3);
}

.landung-schritte {
  margin: 0;
  padding-left: 1.3rem;
  display: flex;
  flex-direction: column;
  gap: var(--a-4);
  max-width: 60ch;
}
.landung-schritte li { line-height: 1.5; }

.landung-geraete {
  margin-top: var(--a-5);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--a-2) var(--a-4);
  font-size: var(--t-s);
}

/* Die Fragen. Ein <details> je Frage - ohne Skript, mit der Tastatur
   bedienbar, und der Zustand meldet sich von selbst an Screenreader. */
.landung-fragen {
  display: flex;
  flex-direction: column;
  border-top: 1px solid var(--linie);
  max-width: 68ch;
}
.landung-fragen > details { border-bottom: 1px solid var(--linie); }
.landung-fragen > details > summary {
  cursor: pointer;
  padding: var(--a-4) 2rem var(--a-4) 0;
  font-weight: 600;
  position: relative;
  list-style: none;
}
.landung-fragen > details > summary::-webkit-details-marker { display: none; }
.landung-fragen > details > summary::marker { content: ""; }
.landung-fragen > details > summary:hover { color: var(--kenn); }
/* Das Zeichen rechts dreht sich beim Aufklappen - ohne es sieht eine
   offene Frage aus wie eine geschlossene. */
.landung-fragen > details > summary::after {
  content: "";
  position: absolute;
  right: .4rem;
  top: 50%;
  width: .55rem;
  height: .55rem;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-70%) rotate(45deg);
  transition: transform .15s ease;
}
.landung-fragen > details[open] > summary::after { transform: translateY(-30%) rotate(-135deg); }
.landung-fragen > details > p { margin: 0 0 var(--a-4); max-width: 62ch; }

.landung-abschluss { margin-bottom: var(--a-7); }

/* DIE FESTE LEISTE AM UNTEREN RAND - nur auf dem Handy.
   Sie traegt "hidden", bis das Skript sie zeigt (siehe testleiste.js);
   ohne Skript bleibt sie weg, und der Knopf steht trotzdem dreimal auf
   der Seite. */
.testleiste {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 40;
  padding: var(--a-3) var(--a-4) calc(var(--a-3) + env(safe-area-inset-bottom, 0px));
  background: var(--flaeche);
  border-top: 1px solid var(--linie);
  box-shadow: 0 -2px 12px rgb(0 0 0 / .08);
}
.testleiste[hidden] { display: none; }
/* Ab Tablettbreite gibt es sie nicht: Dort steht der Knopf der Buehne
   lange genug im Bild, und eine Leiste ueber der ganzen Breite waere
   eine Aufdringlichkeit ohne Anlass. */
@media (min-width: 700px) {
  .testleiste { display: none; }
}

/* Die Knopfreihe rechts im Seitenkopf des Kundenbereichs (04.10.2026):
   Nebenaktion links, Hauptaktion ganz rechts - dort, wo das Auge einer
   Desktop-Anwendung sie sucht. Ohne den Abstand nach oben, den
   .kopfaktionen unter einem Vorspann braucht. */
.kopfaktionen--rechts { margin-top: 0; justify-content: flex-end; }

/* Vier Eckpunkte in einer Zeile, wo die Breite es hergibt (04.10.2026,
   Cloud-Speicher im Kundenbereich). Darunter bleibt es bei zwei
   Spalten von .merkmale. */
@media (min-width: 1200px) { .merkmale--vier { grid-template-columns: repeat(4, 1fr); } }

/* Die Loeschung im Konto, eingeklappt (04.10.2026). Der Titel ist die
   Zeile, die aufklappt - mit demselben Winkel wie bei den Fragen. */
.loeschzone > summary {
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .8rem;
  cursor: pointer;
}
.loeschzone > summary::-webkit-details-marker { display: none; }
.loeschzone > summary h2 { margin: 0; font-size: var(--t-l); }
.loeschzone > summary::after {
  content: "";
  flex: none;
  width: .55rem;
  height: .55rem;
  border-right: 2px solid var(--tinte-3);
  border-bottom: 2px solid var(--tinte-3);
  transform: rotate(45deg);
  transition: transform .15s ease;
}
.loeschzone[open] > summary { margin-bottom: var(--a-3); }
.loeschzone[open] > summary::after { transform: rotate(-135deg); }
.loeschzone > summary:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .loeschzone > summary::after { transition: none; } }

/* Ein Kapitel der Schulung: Ueberschrift, Satz, Stand rechts - dann die
   Tabelle. Keine Karte darum (04.10.2026). */
.schulung-kapitel { margin-top: var(--a-6); }
.schulung-kapitel-kopf {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--a-2) var(--a-4);
  margin-bottom: var(--a-3);
}
.schulung-kapitel-kopf h2 { margin: 0 0 .2rem; font-size: var(--t-l); }
.schulung-kapitel-kopf p { margin: 0; }

/* Der Schritt, der jetzt dran ist (04.10.2026): die Marke in der
   Kennfarbe, sonst nichts. Die Zeile selbst bleibt eine Zeile der
   Liste - sie wird nicht zur Karte. */
.einstieg-schritt--jetzt .einstieg-marke {
  background: var(--kenn);
  border-color: var(--kenn);
  color: var(--auf-kenn);
  font-weight: 600;
}
/* Ohne den Kasten "Als Naechstes" folgt die Liste direkt auf den
   Seitenkopf - dessen Abstand reicht (04.10.2026). */
.seitenkopf + .einstieg-liste { margin-top: 0; }
.seitenkopf + .einstieg-liste > .einstieg-schritt:first-child { padding-top: .25rem; }

/* --- Hintergrund in der Verwaltung (04.10.2026) -------------------------
   Erklaerungen, wie etwas gedacht ist, eingeklappt unter dem Seitenkopf.
   Eine Zeile mit Winkel; aufgeklappt der Text in Lesebreite, ohne
   farbigen Kasten - Farbe bleibt dem, was auffallen muss. */
.hintergrund { margin: 0 0 var(--a-5); }
.hintergrund > summary {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  list-style: none;
  cursor: pointer;
  font-size: var(--t-s);
  font-weight: 500;
  color: var(--tinte-2);
}
.hintergrund > summary::-webkit-details-marker { display: none; }
.hintergrund > summary::before {
  content: "";
  width: .45rem;
  height: .45rem;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(-45deg);
  transition: transform .15s ease;
}
.hintergrund[open] > summary::before { transform: rotate(45deg); }
.hintergrund > summary:hover { color: var(--kenn); }
.hintergrund > summary:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
.hintergrund-inhalt {
  margin-top: var(--a-3);
  padding-left: var(--a-4);
  border-left: 2px solid var(--linie);
  max-width: var(--lesebreite);
  color: var(--tinte-2);
}
.hintergrund-inhalt > :last-child { margin-bottom: 0; }
@media (prefers-reduced-motion: reduce) { .hintergrund > summary::before { transition: none; } }

/* Der Speicherknopf der Einstellungen laeuft mit (04.10.2026). Klebt am
   unteren Rand, solange sein Formular im Bild ist; der Grund deckt den
   Inhalt darunter ab, die Linie trennt ihn davon. */
.vaktionen--mitlaufend {
  position: sticky;
  bottom: 0;
  z-index: 5;
  padding-bottom: var(--a-3);
  background: var(--grund);
}
/* Der Sprung zu einem Abschnitt landet nicht unter der Kopfzeile.

   NACHGEMESSEN (05.10.2026): Hier stand var(--a-6), 32 Pixel - weniger
   als die klebende Kopfzeile selbst (51 Pixel, auf dem Telefon mit dem
   Kennzeichen 85). Ein Klick in der Sprungleiste schob die Ueberschrift
   genau unter sie. Jetzt: Kopfzeile plus Luft. */
.vabschnitt[id] { scroll-margin-top: 5.25rem; }
@media (max-width: 719px) {
  .arbeit-rumpf .vabschnitt[id], .arbeit-rumpf [id] { scroll-margin-top: 7rem; }
}

/* Ein Stand-Marker am Abschnittstitel (04.10.2026, Betriebsbereitschaft)
   steht mit Luft neben dem Wort, nicht daran geklebt. */
.vabschnitt-kopf h2 > .marker { margin-left: .5rem; vertical-align: .1em; }


/* === Mobile Ansichten (04.10.2026) ======================================

   GEMESSEN auf 375 Pixeln, alle Seiten: Nirgends lief etwas quer aus dem
   Bild. Drei Dinge aber trafen den Finger oder das Auge:

   1. TIPPFLAECHEN. Fusslinks 22 Pixel hoch, Aufklappzeilen 21, die
      Sprungleisten 35. Ein Finger trifft rund 44 - darunter erwischt
      man den Nachbarn. Nur bei grobem Zeiger: Mit der Maus waeren die
      Abstaende Luft ohne Grund.
   2. SCHRIFT UNTER 12 PIXELN. Die Versalien-Etiketten (Marker) standen
      bei 11,5 - auf dem Telefon, eine Armlaenge entfernt, zu klein.
   3. ZAHLENTABELLEN ALS KARTENSTAPEL. Ein Tag des Funnels mit sechzehn
      Spalten wurde zu einer Karte mit sechzehn Zeilen; dreissig Tage zu
      einer Seite von 10 000 Pixeln, auf der sich nichts mehr vergleichen
      liess. Zahlen liest man in Zeilen - siehe .tabelle-rahmen--zahlen. */
@media (pointer: coarse) {
  .fuss-links a { display: inline-block; padding: .65rem 0; }
  .sprungleiste a,
  .reiter a { min-height: 44px; display: inline-flex; align-items: center; }
  /* Jede Aufklappzeile - Hintergrund, Loeschen, Fragen, Themenbaum,
     Menue. Nur die Mindesthoehe: Zeilen, die schon hoeher sind,
     aendern sich nicht. */
  details > summary { min-height: 44px; }
  .hintergrund > summary { display: flex; }
  .ankreuz input[type="checkbox"],
  .ankreuz input[type="radio"] { width: 1.3rem; height: 1.3rem; }
}
@media (max-width: 719px) {
  :root { --t-etikett: .78rem; }
  .wissen-zahl { font-size: .78rem; }
}

/* ZAHLENTABELLEN SCROLLEN, STATT ZU STAPELN.

   Fuer Tabellen, deren Sinn der Vergleich von Zeile zu Zeile ist (Tag
   fuer Tag, Quelle gegen Quelle). Auf dem Telefon bleibt die Tabelle eine
   Tabelle und laesst sich waagerecht schieben; die erste Spalte - der
   Tag, die Quelle - bleibt dabei stehen, damit man weiss, wessen Zahlen
   man liest. */
@media (max-width: 719px) {
  .tabelle-rahmen--zahlen th:first-child,
  .tabelle-rahmen--zahlen td:first-child {
    position: sticky;
    left: 0;
    z-index: 1;
    background: var(--flaeche);
    box-shadow: 1px 0 0 var(--linie);
  }
  .tabelle-rahmen--zahlen thead th:first-child { background: var(--flaeche-2); }
}

/* --- Vertiefungen der Leistungsseiten (05.10.2026) ----------------------

   Auf dem Telefon zugeklappt (ido.js, Abschnitt 7), am Rechner offen und
   ohne Aufklappzeile. Die Zeile sagt nur "Weiterlesen" - worum es geht,
   steht in der Ueberschrift und der Einleitung direkt darueber. */
.vertiefung > summary { display: none; }
@media (max-width: 719px) {
  .vertiefung > summary {
    display: inline-flex;
    align-items: center;
    gap: .45rem;
    min-height: 44px;
    list-style: none;
    cursor: pointer;
    font-weight: 600;
    color: var(--kenn);
  }
  .vertiefung > summary::-webkit-details-marker { display: none; }
  .vertiefung > summary::after {
    content: "";
    width: .45rem;
    height: .45rem;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg);
    margin-top: -.2rem;
  }
  .vertiefung[open] > summary { display: none; }
  /* Zugeklappt gehoert die Zeile unter den Einleitungssatz - nicht mit
     dem vollen Abstand, den der Kopf fuer den Inhalt darunter hat. */
  .abschnitt-kopf + .vertiefung:not([open]) { margin-top: -1.1rem; }
  .vertiefung > summary:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
}

/* DICHTER AUF DEM TELEFON (05.10.2026, Leistungsseiten).

   Die Karte bringt rundum 1,75rem Rand mit - auf 375 Pixeln bleiben dem
   Text davon 263, und jede Zeile wird kurz und jeder Absatz hoch. Das
   Abschnittspolster von 51 Pixeln oben und unten summierte sich auf
   /vpn-fernzugriff zu 1 200 Pixeln Luft. Am Rechner bleibt beides, wie es
   gewuenscht war ("gerne noch etwas Platz lassen"); auf dem Telefon ist
   Platz das, was fehlt. Die Arbeitsflaeche hat eigene, staerkere Regeln
   und bleibt unberuehrt. */
@media (max-width: 719px) {
  .karte { padding: 1.1rem; margin-bottom: 1rem; }
  .abschnitt { padding: 2.2rem 0; }
  .leistungen-quer { padding: 2rem 0; }
  .leistungen-quer .karten-reihe { gap: .6rem; }
  .leistungen-quer .karte { margin-bottom: 0; }
}

/* Der eine Knopf unter der Speichertabelle - nur auf dem Telefon, siehe
   unten. Steht VOR der Telefonregel, sonst ueberstimmte er sie. */
.speicher-knopf-mobil { display: none; }

/* --- Preisseite auf dem Telefon (05.10.2026) ----------------------------

   TARIFKARTEN ZUM WISCHEN. Drei Karten untereinander waren 1 550 Pixel;
   nebeneinander, je 82 % breit, ist es eine Kartenhoehe - und die
   naechste Karte ragt sichtbar herein, damit man weiss, dass es weiter
   geht. Die empfohlene steht vorn: Sie ist die, die man zuerst sehen
   soll, und ohne Skript laesst sich nicht dorthin scrollen.

   Oben Platz fuer die Fahne, die halb ueber den Kartenrand ragt: Ein
   scrollender Rahmen schneidet alles ab, was ueber ihn hinausgeht. */
@media (max-width: 719px) {
  .tarifkarten:has(> .tarifkarte + .tarifkarte) {
    display: flex;
    /* NICHT ZENTRIERT: Das Raster darueber zentriert die Reihe. In einem
       scrollenden Rahmen schiebt das die erste Karte links ueber den
       Rand hinaus - dorthin, wo man nicht mehr hinwischen kann. */
    justify-content: flex-start;
    gap: .75rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    padding: .9rem 1rem .5rem;
    margin-left: -1rem;
    margin-right: -1rem;
    scroll-padding-left: 1rem;
    -webkit-overflow-scrolling: touch;
  }
  .tarifkarten:has(> .tarifkarte + .tarifkarte) > .tarifkarte {
    flex: 0 0 82%;
    scroll-snap-align: start;
  }
  .tarifkarten > .tarifkarte--hervor { order: -1; }

  /* Zwei Spalten ohne Stapel: Groesse und Betrag. Der Knopf steht
     einmal darunter (.speicher-knopf-mobil). */
  .tabelle-rahmen--schmal th:last-child,
  .tabelle-rahmen--schmal td:last-child { display: none; }
  .speicher-knopf-mobil { display: block; margin-top: .9rem; }
  .tabelle-rahmen--schmal table { min-width: 0; }
}

/* --- Startseite auf dem Telefon (05.10.2026) ----------------------------

   .nur-breit: Text, der am Rechner dasteht und auf dem Telefon nicht -
   weil er an anderer Stelle ausfuehrlich steht (die Erklaerung einer
   Leistung auf ihrer eigenen Seite). Nur fuer Ergaenzungen, nie fuer
   das, was man zum Entscheiden braucht. */
@media (max-width: 719px) {
  .nur-breit { display: none; }

  /* Die Leistungskarten: Symbol und Name in einer Zeile statt
     untereinander - das Symbol ist Wiedererkennung, kein Inhalt. */
  .karte--stellvertreter:has(> .leistungssymbol) {
    display: grid;
    grid-template-columns: auto 1fr;
    column-gap: .7rem;
    align-items: center;
  }
  .karte--stellvertreter:has(> .leistungssymbol) > * { grid-column: 1 / -1; }
  .karte--stellvertreter:has(> .leistungssymbol) > .leistungssymbol {
    grid-column: 1;
    width: 1.6rem;
    height: 1.6rem;
    margin: 0;
  }
  .karte--stellvertreter:has(> .leistungssymbol) > h3 { grid-column: 2; margin: 0; }
  .karte--stellvertreter:has(> .leistungssymbol) > h3 + p { margin-top: .5rem; }
  .karte--stellvertreter:has(> .leistungssymbol) > .marker { justify-self: start; margin-bottom: .6rem; }
  .karten-reihe:has(> .karte--stellvertreter > .leistungssymbol) { gap: .75rem; }
}

/* Ein Leerfeld zum Eintragen gehoert auf den Ausdruck, nicht auf den
   Telefonbildschirm (05.10.2026, /fuer-systemhaeuser). Im Kartenstapel
   stand es in jeder Karte als leeres "—". */
@media (max-width: 719px) {
  .tabelle-rahmen--stapel td.leerfeld { display: none; }
}

/* --- Stoerungen in den Anleitungen (05.10.2026, ido.js Abschnitt 8) -----

   Am Rechner offen und ohne Pfeil - sie sehen aus wie zuvor: die Meldung
   fett, die Abhilfe darunter. Die Zeile laesst sich dort nicht zuklappen
   (pointer-events), sonst verschwaende Text auf einen Fehlklick. Auf dem
   Telefon eine Zeile je Meldung, durch eine Linie getrennt, mit Pfeil. */
details.stoerung > summary { list-style: none; }
details.stoerung > summary::-webkit-details-marker { display: none; }
.stoerung-titel { font-weight: 600; margin: .8rem 0 .2rem; color: var(--tinte); }
.stoerung-inhalt { color: var(--tinte-2); }
.stoerung-inhalt > :last-child { margin-bottom: 0; }
@media (min-width: 720px) {
  details.stoerung > summary { pointer-events: none; }
}
@media (max-width: 719px) {
  details.stoerung { border-top: 1px solid var(--linie-zart); }
  details.stoerung > summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .8rem;
    min-height: 44px;
    padding: .55rem 0;
    cursor: pointer;
  }
  details.stoerung > summary::after {
    content: "";
    flex: none;
    width: .5rem;
    height: .5rem;
    border-right: 2px solid var(--tinte-3);
    border-bottom: 2px solid var(--tinte-3);
    transform: rotate(45deg);
    transition: transform .15s ease;
  }
  details.stoerung[open] > summary::after { transform: rotate(-135deg); }
  details.stoerung > summary > h3,
  details.stoerung > summary > .stoerung-titel { margin: 0; font-size: 1rem; line-height: 1.4; }
  details.stoerung > summary:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
  .stoerung-inhalt { padding-bottom: .8rem; }
}
@media (prefers-reduced-motion: reduce) { details.stoerung > summary::after { transition: none; } }

/* "Weiter im selben Bereich" am Fuss jeder Anleitung, auf dem Telefon
   (05.10.2026): eine Liste mit Trennlinien statt Karten in der Karte.
   Neun Verweise waren dort 1 300 Pixel - fuer Zeilen aus Titel und
   Geraetename. Aufzaehlungen in Anleitungen ruecken weniger ein: 40
   Pixel Einzug kosteten auf 375 Pixeln jede Zeile vier Woerter. */
@media (max-width: 719px) {
  [data-wissen-ohne-verzeichnis] .karten-reihe { gap: 0; }
  [data-wissen-ohne-verzeichnis] .karten-reihe > .karte {
    border: 0;
    border-top: 1px solid var(--linie-zart);
    border-radius: 0;
    background: none;
    box-shadow: none;
    padding: .7rem 0;
  }
  [data-wissen-ohne-verzeichnis] .karten-reihe > .karte .oben-2 { margin-top: .1rem !important; }
  .rechtstext ul, .rechtstext ol:not([class]), .karte ul:not([class]) { padding-left: 1.2rem; }
}

/* --- Die Bereichsleiste auf dem Telefon (05.10.2026, ido.js Abschnitt 9)

   Zugeklappt: der aktuelle Bereich und der Knopf "Alle Bereiche" in einer
   Zeile. Aufgeklappt: alle Bereiche wie bisher, der Knopf heisst
   "Weniger". Ab 720 Pixeln gibt es den Knopf nicht - dort steht die
   Leiste ganz. */
.arbeit-seite-umschalter { display: none; }
@media (max-width: 719px) {
  .arbeit-seite--faltbar .arbeit-seite-umschalter {
    display: inline-flex;
    align-items: center;
    gap: .45rem;
    margin-left: auto;
    min-height: 40px;
    padding: .4rem .8rem;
    border: 1px solid var(--linie);
    border-radius: var(--r-klein, 6px);
    background: var(--flaeche);
    color: var(--tinte);
    font: inherit;
    font-size: var(--t-s);
    font-weight: 600;
    cursor: pointer;
  }
  .arbeit-seite--faltbar .arbeit-seite-umschalter::after {
    content: "";
    width: .45rem;
    height: .45rem;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg);
    margin-top: -.2rem;
  }
  .arbeit-seite--faltbar:not(.arbeit-seite--zu) .arbeit-seite-umschalter::after { transform: rotate(-135deg); margin-top: .2rem; }
  /* Der Punkt: In einem verborgenen Bereich steht eine Zahl. */
  .arbeit-seite-umschalter--zahl::before {
    content: "";
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: var(--kenn);
  }
  .arbeit-seite--zu:not(:has([aria-current="page"])) .arbeit-seite-innen { justify-content: flex-end; }
  .arbeit-seite--zu .arbeit-seite-innen { flex-wrap: nowrap; align-items: center; }
  .arbeit-seite--zu .arbeit-seite-innen > :not([aria-current="page"]):not(.arbeit-seite-umschalter) { display: none; }
  .arbeit-seite--faltbar:not(.arbeit-seite--zu) .arbeit-seite-umschalter { margin-left: 0; }
  .arbeit-seite--faltbar:not(.arbeit-seite--zu) .arbeit-seite-umschalter--zahl::before { display: none; }
  .arbeit-seite-umschalter:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
}

/* --- Teilbereich in einem Formular der Verwaltung (05.10.2026)
   Eine Gruppe von Feldern, die nur braucht, wer sie nutzt - der
   Mail-Eingang der Anfragen. Die Zeile sieht aus wie eine
   Zwischenueberschrift mit Winkel; eingeklappt, solange nichts
   eingerichtet ist. */
.teilbereich > summary {
  font-size: 1rem;
  font-weight: 600;
  color: var(--tinte);
}
.teilbereich-inhalt { margin-top: var(--a-3); }

/* --- Kennzahlen, hinter denen eine Liste steht (05.10.2026)
   Als Verweis: dieselbe Kachel, beim Darueberfahren der Rahmen in der
   Kennfarbe - wie eine Kachel in einer Uebersicht, die man oeffnet. */
a.kennzahl { display: block; color: inherit; text-decoration: none; transition: border-color .15s ease; }
a.kennzahl:hover { border-color: var(--kenn); }
a.kennzahl:focus-visible { outline: 2px solid var(--kenn); outline-offset: 2px; }
.hinweiskasten > details.hintergrund { margin-top: var(--a-2); }

/* --- Der Kopf der Verwaltung auf dem Telefon (05.10.2026)
   Schriftzug, Kennzeichen "Verwaltung", Avatar, Abmelden und
   Farbumschalter brauchen zusammen rund 450 Pixel. Auf 375 wurde der
   Schriftzug auf 14 Pixel gedrueckt, und das Kennzeichen lag ueber
   "DNS Service". Jetzt schrumpft der Schriftzug nie, und das
   Kennzeichen steht in einer zweiten Zeile darunter. */
@media (max-width: 719px) {
  .arbeit-kopf-innen:has(.arbeit-chip) { flex-wrap: wrap; row-gap: .35rem; }
  .arbeit-kopf-innen .marke { flex-shrink: 0; }
  .arbeit-kopf-innen .arbeit-chip { order: 2; }
}
/* Unter 375 Pixeln passt auch der Kopf des Kundenbereichs nicht mehr
   in eine Zeile; dann rutscht der Farbumschalter nach unten. */
@media (max-width: 374px) {
  .arbeit-kopf-innen { flex-wrap: wrap; row-gap: .35rem; }
}

/* Die Zahl an einer Rubrik der Sprungleiste (Kundenseite der
   Verwaltung, 05.10.2026) - leise gesetzt wie an den Reitern. */
.sprungleiste a .reiter-zahl { font-family: var(--schrift-daten); font-size: var(--t-xs); opacity: .8; margin-left: .25rem; }

/* Eine Zelle, die nur am Rechner etwas sagt - der Strich fuer "kein
   Beleg" in der Rechnungsliste der Verwaltung (05.10.2026). Als Karte
   auf dem Telefon waere sie eine Zeile mit nichts als diesem Strich. */
@media (max-width: 719px) {
  .tabelle-rahmen--stapel td.nur-breit-zelle { display: none; }
}

/* ADRESSEN NIE IN DER ZAHL TRENNEN (11.10.2026, Verwaltung > Vermittler):
   je Adresse eine Zeile, die Spalte waechst mit der laengsten. */
.adressspalte .adresse { display: block; white-space: nowrap; }
.meldungsspalte { min-width: 12rem; }
