/* ---------------------------------------------------------------------------
   kabelei.css - die einzige Stilvorlage des Shops.

   Es gibt keinen zweiten Stilverweis, nirgends. Keine Webschrift, keine
   Symbolschrift, kein fremder Server. Symbole kommen als Inline-SVG.

   Haltung
   -------
   Klassisch, handwerklich, wappenhaft, seriös. Die Kundschaft baut Strom in ihr
   Fahrzeug ein und haftet selbst dafür. Sie braucht Genauigkeit und Vertrauen,
   keine Begeisterung. Also: klare Kanten, kaum Rundung, keine Verläufe, keine
   Schatten, keine Bewegung ausser dem Farbwechsel bei Bedienelementen. Wer
   Aufmerksamkeit braucht, nimmt Abstand und Schriftschnitt, nicht Farbe.

   Woher die Farben kommen
   -----------------------
   Aus dem Signet, ausgemessen und nicht geschätzt. Das Wappen zeigt zwei Kabel,
   eines schwarz, eines rot, mit Ringkabelschuhen - darunter ein Schild, links
   cremefarben, rechts rot, mit sichtbarer Kupferlitze.

   Daraus die Gestaltungssprache des Ladens: ROT IST PLUS, SCHWARZ IST MINUS.
   Das versteht jeder, der schon einmal eine Batterie angeklemmt hat. Rot trägt
   deshalb die Hauptaktion und die aktive Marke, Anthrazit trägt Kopf, Fuss und
   Tabellenköpfe. Die schmale zweifarbige Leiste (.polleiste) zieht diese Sprache
   als wiederkehrendes Zeichen durch die Seite.

   Kontrast, nachgerechnet nach WCAG 2.1 (Ziel AA, 4,5:1 im Fliesstext)
   -------------------------------------------------------------------
     Weiss      auf Rot #A62822       7,1:1
     Creme      auf Rot #A62822       5,4:1
     Creme      auf Anthrazit #222    12,1:1
     Kupfer     auf Anthrazit #222     5,3:1
     Anthrazit  auf Weiss             15,9:1
     Anthrazit  auf Creme #E8E0D0     12,1:1
   Nicht erlaubt und deshalb nirgends verwendet:
     Rot #A62822 auf Anthrazit         2,2:1  - Rot ist auf Dunkel nie Text
     Kupfer      auf Weiss             3,0:1  - Kupfer ist auf Hell nie Text

   Bilder, seit dem 13.08.2026
   ---------------------------
   Bis dahin hatte der Laden kein einziges Bild. Das war der Hauptgrund, warum er
   unfertig wirkte - nicht die Farben und nicht die Schrift. Was dazugekommen ist,
   steht in Abschnitt 9 und gehorcht drei Regeln:

     1. Jedes Bild traegt width und height im Auszeichnungscode UND aspect-ratio
        hier. Ohne beides springt die Seite beim Laden, das Ziel fuer CLS ist 0,05.
     2. Bilder liegen als WebP in mehreren Breiten vor, erzeugt von
        gestaltung/werkzeuge/bilder-aufbereiten.php. Nie eine Rohdatei einbinden.
     3. Steht Text AUF einem Bild, wird der Kontrast vorher nachgerechnet, mit
        gestaltung/werkzeuge/bildkontrast-messen.php. Nicht das Maximum zaehlt,
        sondern der Flaechenanteil unter 4,5:1.

   Nichts ueberdeckt etwas. Kein position: fixed, kein klebender Kopf, keine
   Einblendfenster - BAUVERTRAG Abschnitt 6, gilt ohne Ausnahme.

   Aufbau
     1  Variablen
     2  Grundlagen und Schrift
     3  Aufbau, Flächen, Seitenleiste
     4  Kopf
     5  Fuss
     6  Tabellen
     7  Formulare und Bedienelemente
     8  Meldungen und Kleinteile
     9  Bilder, Bahnen und Kacheln
    10  Startseite und Fehlerseiten
    11  Konfigurator
    12  Breite Ansichten
    13  Sehhilfe
--------------------------------------------------------------------------- */

/* == 1  Variablen ========================================================= */

:root {
    /* -- Marke. Die vier Werte stammen aus dem Signet und werden nicht variiert.
          Wer hier etwas ändert, ändert das Verhältnis zum Logo. -- */
    --marke-schwarz: #222222;   /* Hauptfarbe, das schwarze Kabel   */
    --marke-rot:     #A62822;   /* Zweitfarbe, gedecktes Ziegelrot  */
    --marke-creme:   #E8E0D0;   /* Fläche im Wappenschild           */
    --marke-kupfer:  #B88C71;   /* die Litze, nur Akzent            */

    /* -- Rollen. Vorlagen benutzen ausschliesslich diese Namen, nie die
          Markenwerte direkt. So bleibt ein späterer Wechsel eine Zeile. -- */
    --farbe-text:          var(--marke-schwarz);
    --farbe-text-leise:    #5E5852;   /* warmes Grau, 7,0:1 auf Weiss */
    --farbe-grund:         #ffffff;
    --farbe-flaeche:       #F7F4EE;   /* Creme, stark aufgehellt */
    --farbe-flaeche-tief:  #EFE9DC;
    --farbe-linie:         #DED7C8;
    --farbe-linie-stark:   #A89C86;
    --farbe-akzent:        var(--marke-rot);
    --farbe-akzent-tief:   #7E1E19;   /* dieselbe Farbe dunkler, für Zeigerkontakt */
    --farbe-akzent-blass:  #F7EAE8;
    --farbe-gut:           #2A6141;   /* 7,3:1 */
    --farbe-warnung:       #8A5100;   /* 6,4:1 */
    --farbe-fehler:        #8C1D18;   /* 9,1:1, dunkler als das Markenrot */
    --farbe-umriss:        var(--marke-schwarz);

    /* Die beiden Symbolfarben am Konfigurator. Tanja am 13.08.2026: "Teilen lila bei
       Mouseover, Merken gelb bei Mouseover." Sie stehen hier und nicht am Bauteil,
       weil in diesem Laden keine feste Farbe im Regelsatz steht.
       Gelb ist auf Weiss nicht lesbar - deshalb zwei Werte: der Stern bekommt beim
       Zeigen die gelbe FLAECHE und behaelt den dunklen Umriss, und der Umriss ist es,
       der den Kontrast traegt. */
    --farbe-teilen:         #5B2D8E;   /* Lila, 8,7:1 auf Weiss */
    --farbe-merken:         #8A5100;   /* dunkles Gold, 6,4:1 - der Umriss */
    --farbe-merken-flaeche: #F5C518;   /* das Gelb, nur Flaeche innerhalb des Umrisses */

    /* Dunkle Zonen: Kopf und Fuss. Text darauf immer Creme, niemals Rot. */
    --farbe-dunkel:            var(--marke-schwarz);
    --farbe-dunkel-hoch:       #332F2C;
    --farbe-auf-dunkel:        var(--marke-creme);
    --farbe-auf-dunkel-leise:  var(--marke-kupfer);

    /* Abstaende. Vielfache von 4, damit nichts krumm sitzt. */
    --abstand-1: 0.25rem;   /*  4px */
    --abstand-2: 0.5rem;    /*  8px */
    --abstand-3: 1rem;      /* 16px */
    --abstand-4: 1.5rem;    /* 24px */
    --abstand-5: 2.5rem;    /* 40px */
    --abstand-6: 4rem;      /* 64px */

    /* Schrift. Systemschriften, nichts wird geladen.
       Überschriften und Wortmarke laufen in einer Serifenschrift - das ist der
       billigste Weg zu klassischem Charakter, er kostet kein einziges Byte.
       Georgia steht hinten, weil es Mediävalziffern setzt (die 3 hängt unter die
       Grundlinie). In einer Überschrift wie "Batteriekabel 25 mm²" sieht das
       nach Fehler aus, deshalb kommen zuerst Schriften mit Versalziffern. */
    --schrift: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --schrift-titel: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Palatino, Georgia, "Times New Roman", serif;
    --schrift-fest: ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, "Liberation Mono", monospace;

    /* Die Ueberschriften sind am 13.08.2026 eine Stufe groesser geworden. Vorher
       war h1 auf dem Handy 30 px und am Schirm 36 px - das ist die Groesse, in
       der andere Laeden ihre ZWISCHENueberschriften setzen. */
    --schrift-winzig: 0.75rem;   /* 12px, nur Fussnoten */
    --schrift-klein:  0.875rem;  /* 14px */
    --schrift-grund:  1rem;      /* 16px, nie kleiner im Fliesstext */
    --schrift-gross:  1.125rem;  /* 18px */
    --schrift-h3:     1.25rem;
    --schrift-h2:     1.625rem;
    --schrift-h1:     2rem;

    --zeilenhoehe:       1.6;
    --zeilenhoehe-eng:   1.25;

    /* Masse */
    --breite-inhalt:   72rem;
    --breite-text:     38rem;   /* Lesebreite, rund 75 Zeichen */
    --breite-leiste:   16rem;   /* klebende Seitenleiste */
    --bedienhoehe:     2.75rem; /* 44px, Mindestgroesse fuer Finger */
    --radius:          2px;     /* gerade so viel, dass Kanten nicht schneiden */
    --linie:           1px solid var(--farbe-linie);
    --polleiste-hoehe: 4px;
}

/* == 2  Grundlagen und Schrift ============================================ */

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

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

body {
    margin: 0;
    background: var(--farbe-grund);
    color: var(--farbe-text);
    font-family: var(--schrift);
    font-size: var(--schrift-grund);
    line-height: var(--zeilenhoehe);
}

h1, h2, h3, h4 {
    margin: 0 0 var(--abstand-3);
    font-family: var(--schrift-titel);
    line-height: var(--zeilenhoehe-eng);
    font-weight: 600;
    /* Versalziffern erzwingen, wo die Schrift beides kann. */
    font-variant-numeric: lining-nums;
    text-wrap: balance;
}

h1 { font-size: var(--schrift-h1); }
h2 { font-size: var(--schrift-h2); margin-top: var(--abstand-5); }
h3 { font-size: var(--schrift-h3); margin-top: var(--abstand-4); }

h2:first-child, h3:first-child { margin-top: 0; }

/* Ein kurzer roter Strich über jeder Hauptüberschrift im Inhalt. Klassisches
   Buchsatzmotiv, ein Zeichen statt einer Farbfläche. Nur im Inhalt, damit es in
   Formularen und Beiblättern nicht auftaucht. */
.inhalt h1::before,
.inhalt h2::before,
.fehlerseite h1::before {
    content: "";
    display: block;
    width: 2.5rem;
    height: 3px;
    margin-bottom: var(--abstand-2);
    background: var(--marke-rot);
}

p, ul, ol, dl { margin: 0 0 var(--abstand-3); }

p { max-width: var(--breite-text); }

a {
    color: var(--farbe-akzent);
    text-underline-offset: 0.15em;
}

a:hover { color: var(--farbe-akzent-tief); }

/* Sichtbarer Fokus ist Pflicht. Nie wegnehmen, ohne Ersatz zu setzen.
   Der Ring sitzt mit Abstand ausserhalb, damit er auf dem roten Knopf nicht auf
   Rot liegt (Anthrazit auf Rot wären nur 2,2:1). */
:focus-visible {
    outline: 2px solid var(--farbe-umriss);
    outline-offset: 2px;
}

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

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

hr {
    border: 0;
    border-top: var(--linie);
    margin: var(--abstand-5) 0;
}

/* Das wiederkehrende Markenzeichen: links Rot, rechts Schwarz - Plus und Minus.
   Zwei Farbflächen, kein Verlauf, kein zusätzliches Auszeichnungselement. */
.polleiste {
    position: relative;
    height: var(--polleiste-hoehe);
    background: var(--marke-schwarz);
}

.polleiste::before {
    content: "";
    position: absolute;
    inset: 0 50% 0 0;
    background: var(--marke-rot);
}

/* == 3  Aufbau, Flächen, Seitenleiste ===================================== */

.inhalt {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding: var(--abstand-4) var(--abstand-3) var(--abstand-6);
}

/* Fliesstext auf Lesebreite halten, ohne den Rahmen zu verengen. */
.lesetext { max-width: var(--breite-text); }

.flaeche {
    background: var(--farbe-flaeche);
    border: var(--linie);
    border-radius: var(--radius);
    padding: var(--abstand-4);
    /* ⭐ Abstand nach unten seit dem 26.08.2026. Tanja mit Bildschirmfoto vom Warenkorb:
       "Abstand zwischen den Boxen hier." Die Summenbox (.flaeche) und der Kontohinweis
       (.hinweis) darunter klebten aneinander - beide creme, beide mit Rahmen, dazwischen
       nur die Haarlinie der beiden Kanten. Sie sahen aus wie EIN Kasten mit einem Strich
       in der Mitte.

       .hinweis fuehrte seinen margin-bottom von Anfang an, .flaeche nicht - und ein
       margin-bottom wirkt nach unten, nicht nach oben. Zwischen den beiden stand deshalb
       nichts. Derselbe Wert wie der Innenabstand: aussen so viel Luft wie innen. */
    margin-bottom: var(--abstand-4);
}

.flaeche > :last-child { margin-bottom: 0; }

/* Seit dem 13.09.2026 tragen die Kassenkaesten die Lesebreite INNEN (div.lesetext in der
   vollbreiten Flaeche), Tanja: "die Box genauso breit machen wie der Strich". Dann ist das
   letzte Kind der Flaeche der Textumschlag, und dessen letzter Absatz braucht dieselbe
   Regel - sonst bleibt unten der Absatzabstand als zweites Polster stehen. */
.flaeche .lesetext > :last-child { margin-bottom: 0; }

/* Rahmen um Inhalt und Seitenleiste.
   Ohne Seitenleiste bleibt er wirkungslos - dann trägt .inhalt weiterhin Breite
   und Innenabstand selbst. Das ist Absicht: templates/betrieb benutzt .inhalt
   ohne diesen Rahmen und darf davon nichts merken. */
.rahmen--leiste {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding-inline: var(--abstand-3);
}

.rahmen--leiste > .inhalt {
    max-width: none;
    margin: 0;
    padding-inline: 0;
}

/* Die Seitenleiste steht im Quelltext HINTER dem Inhalt. Auf dem Handy liest man
   sie damit nach der Ware, nicht davor - so steht es im Gestaltungsauftrag. Erst
   ab der breiten Ansicht rückt sie per Raster daneben und klebt beim Scrollen. */
.seitenleiste {
    margin-bottom: var(--abstand-6);
    font-size: var(--schrift-klein);
}

.seitenleiste__block {
    border: var(--linie);
    border-top: 3px solid var(--marke-rot);
    background: var(--farbe-flaeche);
    padding: var(--abstand-3);
}

.seitenleiste__block + .seitenleiste__block { margin-top: var(--abstand-3); }

.seitenleiste__titel {
    margin: 0 0 var(--abstand-2);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-gross);
    font-weight: 600;
}

/* Die vier Zusagen des Betriebs. Der Punkt davor ist ein Kabelschuh im Kleinen:
   ein Quadrat, abwechselnd Rot und Schwarz. Farbe ist hier Schmuck, nie Träger
   einer Aussage - die steht vollständig im Text daneben. */
.argumente {
    list-style: none;
    margin: 0;
    padding: 0;
}

.argumente li {
    position: relative;
    padding-left: var(--abstand-4);
    margin-bottom: var(--abstand-2);
}

.argumente li:last-child { margin-bottom: 0; }

.argumente li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0.55em;
    width: 0.5rem;
    height: 0.5rem;
    background: var(--marke-rot);
}

.argumente li:nth-child(even)::before { background: var(--marke-schwarz); }

/*
 * ⭐ Die vier Zusagen, ab 26.08.2026 die gestaltete Fassung. Tanja: "Jeder Punkt
 * braucht ein Icon, einen Zweizeiler, horizontale Linie zwischen den einzelnen
 * Punkten." Im Fokus stehen Qualitaet, Schnelligkeit und Zuverlaessigkeit.
 *
 * .argumente bleibt daneben stehen und wird NICHT geloescht - die Entwuerfe unter
 * gestaltung/muster/ benutzen sie noch. Wer sie dort ablegt, kann sie hier entfernen.
 *
 * Das Symbol traegt keine Aussage. Es steht als Wiedererkennung daneben, der Satz
 * daneben ist vollstaendig ohne es lesbar - dieselbe Regel wie beim roten Quadrat
 * der alten Liste.
 */
.zusagen {
    list-style: none;
    margin: 0;
    padding: 0;
}

.zusage {
    display: grid;
    grid-template-columns: 1.5rem 1fr;
    column-gap: var(--abstand-2);
    padding: var(--abstand-3) 0;
}

.zusage:first-child { padding-top: var(--abstand-1); }
.zusage:last-child { padding-bottom: 0; }

/* Die Linie steht ZWISCHEN den Punkten, nicht ueber dem ersten und nicht unter dem
   letzten. Deshalb der Geschwisterwaehler und keine Rahmenlinie je Element. */
.zusage + .zusage { border-top: var(--linie); }

.zusage__symbol {
    grid-row: 1 / span 2;
    width: 1.5rem;
    height: 1.5rem;
    margin-top: 0.15em;
    color: var(--marke-rot);
}

.zusage__titel {
    margin: 0;
    font-family: var(--schrift-titel);
    font-weight: 600;
    line-height: 1.25;
}

.zusage__text {
    margin: 0.2em 0 0;
    color: var(--farbe-text-leise);
    line-height: 1.4;
}

/* Sprungmarke fuer Tastatur und Vorlesesoftware. */
.sprung {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 10;
    background: var(--marke-rot);
    color: #fff;
    padding: var(--abstand-2) var(--abstand-3);
    text-decoration: none;
}

.sprung:focus {
    left: 0;
    color: #fff;
}

/* == 4  Kopf ==============================================================
   Minimalistisch, so steht es im Gestaltungsauftrag: Signet mit Wortmarke,
   Hauptmenü, rechtsbündig Warenkorb und Kundenkonto. Sonst nichts. Die vier
   Vertrauensaussagen standen früher hier über die volle Breite und sind in die
   Seitenleiste gewandert.
   ========================================================================= */

/* Keine Trennlinie mehr seit dem 13.08.2026: Unter dem Kopf steht entweder der
   dunkle Aufmacher oder die Polleiste. Beide trennen deutlicher, als eine
   Haarlinie es koennte, und zwei Trenner uebereinander sind einer zu viel. */
.kopf {
    background: var(--farbe-grund);
    border-bottom: 0;
}

.kopf__innen {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding: var(--abstand-3);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--abstand-3);
}

.wortmarke {
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
    color: var(--farbe-text);
    text-decoration: none;
}

/* Feste Breite und Höhe stehen zusätzlich im Auszeichnungscode. Ein Bild ohne
   Masse verschiebt beim Nachladen die halbe Seite, und das Ziel für CLS ist 0,05. */
/* 3 statt 2,75 rem seit dem 13.08.2026. Bei 44 px war vom Wappen nichts mehr zu
   erkennen - die Ranken, das Schild und die beiden Kabelschuhe sind zu fein. */
.wortmarke__signet {
    flex: 0 0 auto;
    width: 3rem;
    height: 3rem;
}

.wortmarke__text {
    display: flex;
    flex-direction: column;
    line-height: 1.1;
}

.wortmarke__name {
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h2);
    font-weight: 600;
    letter-spacing: 0.02em;
}

.wortmarke__zusatz {
    font-size: var(--schrift-winzig);
    color: var(--farbe-text-leise);
    text-transform: uppercase;
    letter-spacing: 0.1em;
}

.menue { width: 100%; order: 3; }

.menue__liste {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-1);
}

.menue__verweis {
    display: flex;
    align-items: center;
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-3);
    color: var(--farbe-text);
    text-decoration: none;
    font-weight: 600;
}

/* Beim Ueberfahren: cremefarbene Flaeche, die Schrift bleibt schwarz. color steht hier
   ausdruecklich, weil sonst a:hover aus den Grundregeln (ein Element und eine
   Pseudoklasse) die Klasse schluege und den Punkt dunkelrot faerbte. */
.menue__verweis:hover {
    background: var(--farbe-flaeche);
    color: var(--farbe-text);
}

/* ⭐ DER AKTIVE PUNKT TRAEGT ROTE SCHRIFT, seit dem 18.09.2026. Tanja: "Hauptmenü :active
   müssen wir anders machen. Der Unterstrich gefällt mir nicht. Machen wir Textfarbe rot.
   Dafür darf dann halt das :hover nicht mehr rot sein."

   Bis dahin stand unter dem aktiven Punkt ein roter Strich von 3 px (und an jedem anderen
   ein durchsichtiger gleicher Hoehe, damit nichts springt) - beides ist weg.

   ROT HEISST JETZT NUR NOCH EINES: "hier sind Sie". Deshalb ist ausser dem aktiven Punkt
   nichts im Hauptmenue rot - nicht das Ueberfahren (Flaeche, schwarze Schrift) und auch
   nicht der aufgeklappte Punkt in Abschnitt 4.3, der bis zu diesem Tag rot wurde und den
   Tanja beim Ueberfahren als "rotes Hover" gesehen hat. Der aktive Punkt bleibt auch beim
   Ueberfahren rot, deshalb steht :hover hier mit. */
.menue__verweis--aktiv,
.menue__verweis--aktiv:hover {
    color: var(--farbe-akzent);
}

.kopf__werkzeuge {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: var(--abstand-1);
}

/* Seit dem 17.08.2026 steht in diesen Verweisen nur noch das Symbol - Tanja:
   "Hier nur die Icons, keine Texte." Die Wörter sind nicht gelöscht, sie liegen
   als span.nur-vorlesen darin und kommen bei Mouseover als Sprechblase.

   Daraus folgen drei Angaben, die vorher unnötig waren:
   min-width  hält die Trefferfläche quadratisch bei 44 px. Ohne sie wäre der
              Verweis nur so breit wie das Symbol plus Polster, also ~30 px - zu
              schmal für einen Finger.
   justify-content zentriert das Symbol darin.
   gap        wirkt nur noch beim Warenkorb, denn nur der hat ein zweites sichtbares
              Kind: den Zähler. Bei den anderen dreien ist es wirkungslos, weil
              span.nur-vorlesen mit position:absolute gar nicht im Flusslayout liegt.
              Eine Stufe kleiner als vorher (abstand-1 statt abstand-2), weil der
              Zähler seinen eigenen margin-left mitbringt und beides sich addiert. */
.kopf__verweis {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--abstand-1);
    min-height: var(--bedienhoehe);
    min-width: var(--bedienhoehe);
    padding: 0 var(--abstand-1);
    color: var(--farbe-text);
    text-decoration: none;
    font-size: var(--schrift-klein);
}

.kopf__verweis:hover { color: var(--farbe-akzent); }

/* Der Warenkorbverweis ist der Anker für den Pfeil, der nach dem Zurücklegen zwei
   Sekunden lang auf den Zähler zeigt. position: relative gehört zu dieser Aufgabe und
   zu keiner anderen - ohne es sucht sich der Pfeil den nächsten positionierten
   Vorfahren und landet irgendwo auf der Seite. Genau dieser Fehler steckte bis zum
   13.08.2026 in der Preisleiste des Konfigurators. */
.kopf__verweis--korb { position: relative; }

/* Symbole sind Inline-SVG und erben ihre Farbe vom Text. Keine Symbolschrift.

   ⭐ UM DIE HAELFTE GROESSER seit dem 06.09.2026. Tanja: "Die Icons oben rechts ruhig um
   50% größer." 1,375rem waren 22 px, jetzt sind es genau das Anderthalbfache. Seit im Kopf
   nur noch Symbole stehen und kein Wort mehr danebensteht (26.08.), tragen sie die Aussage
   allein - dann duerfen sie auch die Groesse dafuer haben.

   ⚠️ DIE ZEILE WIRD DAVON NICHT HOEHER. .kopf__verweis haelt min-height: var(--bedienhoehe),
   also 44 px, und 33 px passen darunter. Wer die Symbole weiter vergroessert, schiebt ab
   44 px den ganzen Kopf auseinander. */
.kopf__symbol {
    flex: 0 0 auto;
    width: 2.0625rem;
    height: 2.0625rem;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.6;
    stroke-linecap: round;
    stroke-linejoin: round;
}

/* ⭐ HOCHGESTELLT UND AM SYMBOL ANGEDOCKT, seit dem 13.09.2026. Tanja: "Die Warenkorb-Zahl
   (hier 4) muss hochgestellt und an das Warenkorb-Icon angedockt sein. Gerne auch rund."

   Bis dahin stand der Zaehler als 33-px-Kasten NEBEN dem Symbol, seit dem 06.09. so gross
   wie das Symbol selbst - er sah aus wie ein fuenftes Symbol und nicht wie eine Angabe zum
   vierten. Der aeltere Satz an dieser Stelle ("rechteckig, nicht rund, runde Blasen
   gehoeren zu einer anderen Sorte Laden") war meine Annahme, keine Vorgabe, und ist mit
   Tanjas Satz erledigt.

   Absolut im Verweis, der seit dem Pfeil position: relative traegt. Der Verweis ist 44 px
   hoch und 52 px breit, das Symbol 33 px liegt mittig, seine rechte obere Ecke bei etwa
   x 42 / y 6. Die Blase misst 20 px und sitzt mit right: 0 und top: 0 mit ihrer Mitte bei
   x 42 / y 10, also auf dieser Ecke - hochgestellt, angedockt. Sie ueberlagert dort nur den
   Umriss des Korbs, keine Angabe, die lesbar sein muss; das ist kein Verstoss gegen
   "nichts ueberdeckt etwas" (BAUVERTRAG 6), denn sie gehoert zum Symbol.

   Rund, wie freigegeben. Zwei Ziffern passen durch min-width plus Polster, drei kommen im
   Laden nicht vor. 12 px fett, weiss auf Ziegelrot 7,1:1, im Kontrastmodus 11,5:1.

   Kein margin-left und keine Flussbreite mehr: Der Verweis bleibt 44 px breit, das Symbol
   bleibt mittig, das gap in .kopf__verweis wirkt seither auf nichts mehr. Der Pfeil
   (.kopf__pfeil, right 0.25rem) zeigt weiter genau unter die Blase. */
.kopf__zaehler {
    position: absolute;
    top: 0;
    right: 0;
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.25rem;
    height: 1.25rem;
    padding: 0 0.3rem;
    border-radius: 999px;
    background: var(--marke-rot);
    color: #fff;
    font-size: 0.75rem;
    line-height: 1;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

/* 🔴 OHNE DIESE ZEILE STEHT BEI LEEREM KORB EINE ROTE NULL IM KOPF.
   Der Zähler steht seit dem 21.08.2026 immer im Dokument und trägt bei Anzahl 0 das
   HTML-Attribut hidden (warum, steht in templates/teile/_kopf.html.twig). Das display
   der Klasse darüber ist eine Angabe des Autors, das display:none hinter hidden nur
   eine des Browsers - und Autorenangaben schlagen die des Browsers. Also hier noch
   einmal, ausdrücklich. Dasselbe gilt für das vorgelesene Wort daneben, das seine
   Regel aus .nur-vorlesen bezieht. */
.kopf__zaehler[hidden],
.nur-vorlesen[hidden] { display: none; }

/* ⭐ DASSELBE FUER JEDEN KNOPF, seit dem 06.09.2026. .knopf traegt display: inline-flex
   und schlaegt damit aus demselben Grund das [hidden] des Browsers - ein verborgener
   Knopf waere sichtbar, und zwar lautlos.

   Gebraucht vom Verweis "Zum Warenkorb" in der Preisleiste des Konfigurators, der erst
   auftaucht, wenn wirklich etwas im Korb liegt. Die Regel gilt bewusst fuer ALLE Knoepfe:
   Wer den naechsten mit hidden versieht, soll nicht dieselbe Stunde suchen.

   ⚠️ Sie ist der Grund, warum templates/konfigurator/anschlusskabel.html.twig seinen
   Rechenknopf im UMSCHLAG verbirgt und nicht am Knopf selbst. Beides geht jetzt. */
.knopf[hidden] { display: none; }

/* Der Pfeil auf den Zähler, zwei Sekunden nach dem Zurücklegen. Tanjas Vorgabe vom
   20.08.2026.

   🔴 ER ÜBERDECKT NICHTS, und das ist keine Geschmacksfrage: BAUVERTRAG Abschnitt 6
   verbietet position: fixed und alles, was etwas verdeckt. Er sitzt absolut INNERHALB
   von .kopf__verweis--korb und ragt gut 8 px nach unten - in den Zeilenabstand, den
   .kopf__innen mit gap: var(--abstand-3) ohnehin freilässt (16 px). Darunter beginnt
   erst das Hauptmenü. Kein z-index, kein Einblendfenster.

   KEINE BEWEGUNG. Der Laden kennt "keine Bewegung ausser dem Farbwechsel bei
   Bedienelementen" - ein hüpfender oder eingeblendeter Pfeil wäre der erste Bruch.
   Damit erübrigt sich auch eine Ausnahme für prefers-reduced-motion: Was steht, stört
   niemanden, der Bewegung abgeschaltet hat.

   Kein display hier, und das ist Absicht: Ohne Autorenangabe wirkt das hidden aus dem
   Auszeichnungscode von allein, und der Pfeil braucht keine zweite Regel, die ihn
   wieder wegnimmt.

   Ein Dreieck aus Rändern, kein Zeichen und kein Bild: Ein Textpfeil hinge an der
   Schriftart, ein Bild wäre eine zusätzliche Anfrage. Rot wie der Zähler, auf den er
   zeigt - beides ist dieselbe Meldung.

   pointer-events: none, damit er nicht heimlich die Trefferfläche des Verweises nach
   unten zieht. Anklickbar ist der Warenkorb, nicht seine Zier. */
.kopf__pfeil {
    position: absolute;
    top: 100%;
    right: 0.25rem;
    margin-top: 2px;
    width: 0;
    height: 0;
    border-left: 0.35rem solid transparent;
    border-right: 0.35rem solid transparent;
    border-bottom: 0.4rem solid var(--marke-rot);
    pointer-events: none;
}

/* -- 4.1  Der Kopf am Handy ----------------------------------------------
   ⭐ SEIT DEM 14.09.2026 ZWEI ZEILEN. Tanja mit Bildschirmfoto vom iPhone 13 mini: "Da ist
   das Auge für die Behindertenansicht um eine Zeile verrutscht. Das sieht doof aus.
   Vorschlag: 1. Zeile Logo mittig, ggf. etwas größer. 2. Zeile Hauptmenü (Toggle /
   Akkordeon), Icons für Kundenkonto, Warenkorb, Auge. Gleichmäßig verteilt."

   Bis dahin standen Wortmarke und Werkzeuge in einer Zeile, und bei 375 px war fuer das
   Auge kein Platz mehr - es brach allein in eine zweite Zeile, das Menue in eine dritte.

   Jetzt, unter 48 rem:
     Zeile 1  die Wortmarke allein, mittig, Signet 56 statt 48 px
     Zeile 2  Menueknopf, [Stern], Konto, Warenkorb, Auge - gleichmaessig verteilt
     Zeile 3  das Hauptmenue, nur wenn der Menueknopf es aufgeklappt hat (order 3,
              width 100 % hat es ohnehin) - eine Liste untereinander, im Fluss, die
              Seite waechst nach unten. Kein Einblendfenster, nichts ueberdeckt etwas.

   display: contents an .kopf__werkzeuge macht seine Kinder zu Kindern des Kopfrasters,
   nur so verteilt space-evenly alle fuenf Symbole gleichmaessig - drei in einem Kasten
   und zwei daneben liessen sich nicht gemeinsam verteilen. Ein div ohne Rolle verliert
   dabei nichts.

   Den Knopf gibt es nur mit JavaScript (html.js): Ohne JavaScript bleibt das Menue
   offen, wie bisher, und ein Knopf, der nichts tut, faellt weg - dieselbe Regel wie bei
   der Sehhilfe. Auf- und Zuklappen: public/js/rahmen.js ueber hidden am <nav>.
   ------------------------------------------------------------------------- */

/* Am Laptop gibt es keinen Menueknopf, das Menue steht offen in der zweiten Zeile. */
.kopf__menueknopf { display: none; }

@media (max-width: 48rem) {
    .kopf__innen { justify-content: space-evenly; }

    .wortmarke {
        flex: 1 0 100%;
        justify-content: center;
    }

    .wortmarke__signet {
        width: 3.5rem;
        height: 3.5rem;
    }

    .kopf__werkzeuge { display: contents; }

    html.js .kopf__menueknopf {
        display: flex;
        background: none;
        border: 0;
        font: inherit;
        cursor: pointer;
    }

    /* Zu: drei Striche. Auf: ein Kreuz. Beides liegt im selben SVG, aria-expanded
       entscheidet, welches zu sehen ist. */
    .kopf__menueknopf-auf { display: none; }
    .kopf__menueknopf[aria-expanded="true"] .kopf__menueknopf-auf { display: block; }
    .kopf__menueknopf[aria-expanded="true"] .kopf__menueknopf-zu { display: none; }
    .kopf__menueknopf[aria-expanded="true"] { color: var(--farbe-akzent); }

    /* Das aufgeklappte Menue: eine Liste untereinander, Punkt fuer Punkt eine Zeile
       von 44 px, getrennt durch die Linie des Ladens. Der aktive Punkt traegt hier
       zur roten Schrift einen roten Strich LINKS und die cremefarbene Flaeche - in
       einer Liste, die man mit dem Daumen ueberfliegt, traegt die Farbe der Schrift
       allein nicht weit genug. Den Strich UNTEN, den Tanja am 18.09.2026 am Laptop
       abgeschafft hat, gab es in der Liste nie: Er waere eine zweite Trennlinie. */
    .menue[hidden] { display: none; }

    .menue {
        padding-top: var(--abstand-2);
        border-top: var(--linie);
    }

    .menue__liste {
        flex-direction: column;
        gap: 0;
    }

    .menue__verweis {
        padding: 0 var(--abstand-2);
        border-bottom: 1px solid var(--farbe-linie);
    }

    .menue__punkt:last-child .menue__verweis { border-bottom: 0; }

    .menue__verweis--aktiv {
        box-shadow: inset 3px 0 0 var(--marke-rot);
        background: var(--farbe-flaeche);
    }
}

/* -- 4.2  Nach oben, nur am Handy -------------------------------------------
   ⭐ SEIT DEM 14.09.2026. Tanja: "In der mobilen Ansicht braucht es unten rechts ein
   Chevron-Up-Icon, damit man auch wieder schnell hochscrollen kann."

   🔴 DAS IST DIE EINE AUSNAHME VON "NICHTS UEBERDECKT ETWAS" (BAUVERTRAG 6), und Tanja
   hat sie selbst angeordnet. Sie bleibt so klein wie moeglich: nur unter 48 rem, nur
   mit JavaScript, nur wenn die Seite schon um eine Bildschirmhoehe gescrollt ist
   (rahmen.js nimmt dann das hidden weg), 44 px in der Ecke unten rechts, wo im Laden
   kein Bedienelement liegt. Kein zweites Element darf sich darauf berufen.

   Der Sprung nach oben ist ein Sprung, kein Gleiten - der Laden kennt keine Bewegung
   ausser dem Farbwechsel bei Bedienelementen. Ohne JavaScript bleibt der Knopf
   verborgen (hidden im Auszeichnungscode wird nie entfernt).
   ------------------------------------------------------------------------- */
.nach-oben { display: none; }

@media (max-width: 48rem) {
    html.js .nach-oben:not([hidden]) {
        display: flex;
        align-items: center;
        justify-content: center;
        position: fixed;
        right: 0.75rem;
        bottom: 0.75rem;
        width: var(--bedienhoehe);
        height: var(--bedienhoehe);
        border: var(--linie);
        border-radius: 50%;
        background: var(--farbe-grund);
        color: var(--farbe-text);
        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
        opacity: 0.92;
        z-index: 5;
    }

    .nach-oben svg {
        width: 1.5rem;
        height: 1.5rem;
        fill: none;
        stroke: currentColor;
        stroke-width: 2;
        stroke-linecap: round;
        stroke-linejoin: round;
    }
}

@media print {
    .nach-oben { display: none !important; }
}

/* -- 4.3  Das Untermenue unter "Batteriekabel" --------------------------------
   ⭐ SEIT DEM 18.09.2026. Tanja am 16.09.2026: "Hauptmenü: wir brauchen ein Dropdown. Der
   Hauptmenüpunkt BATTERIEKABEL bekommt also ein Dropdown mit den Querschnitten, 10-95mm2.
   Außerdem Batterieanschlusskabel mit Sicherung. Dazu Icons. 10mm² bekommt einen ganz
   dünnen Frosch. der wird immer dicker, bis wir bei 95mm² einen ziemlich dicken Frosch
   haben."

   🔴 IM GRUNDSATZ KLAPPT ES IM FLUSS AUF: Das Feld ist ein Kind von .kopf__innen wie die
   Sehhilfe und nimmt sich mit flex 1 0 100 % eine volle Zeile - order 4 stellt es hinter
   alles andere, am Laptop unter die Kopfzeile, am Handy unter das aufgeklappte Hauptmenue
   (order 3). Geoeffnet wird es dort per Klick oder Tipp (public/js/rahmen.js).

   🔴 MIT DER MAUS SCHWEBT ES, seit dem 18.09.2026 abends - Tanja: "Submenü flyout bereits
   bei Mouseover." Ueberfahren und Fluss vertragen sich nicht (die Seite spraenge bei jeder
   Mausbewegung), deshalb steht ganz unten in diesem Abschnitt EINE Medienabfrage, in der
   das Feld position: absolute bekommt. Nur dort duerfen absolute und z-index stehen,
   fixed nirgends - tests/untermenue-pruefen.php misst beides nach. Begruendung, Grenzen
   und der Weg zurueck stehen an dem Block selbst und im BAUVERTRAG, Abschnitt 6.

   ⚠️ .untermenue[hidden] MUSS HIER STEHEN. hidden ist nur display: none aus dem
   Browser-Stilblatt, und jede display-Angabe an der Klasse schluege es - dieselbe Falle
   wie bei .kopf__zaehler[hidden] und .menue[hidden].

   DIE BILDER HABEN WEISSEN GRUND, der Kopf auch (--farbe-grund). Deshalb bekommt die
   Kachel beim Ueberfahren einen Rahmen und KEINE Farbflaeche: Auf Creme stuende jedes
   Bild als weisses Rechteck da.

   ⭐ ZWEI SPALTEN, VIER KACHELN JE ZEILE, seit dem 18.09.2026 abends. Tanja: "Mach das
   Submenü zweizeilig. Also immer vier Produkte in einer Zeile. Rechts davon die Ratgeber /
   Rechner, untereinander, mit passendem Icon." Bis dahin standen die acht Kacheln des
   Batteriekabels am Laptop in EINER Reihe und die Verweise als Zeile darunter.
     - Die Kacheln stehen in JEDER Breite zu viert: acht beim Batteriekabel ergeben zwei
       Zeilen, vier bei der Fahrzeugleitung eine, zwei beim Solarkabel eine halbe. Bei 375 px
       bleiben je Kachel gut 80 px, das Bild schrumpft sonst mit.
     - Ab 48 rem stehen .untermenue__produkte und .untermenue__hilfen NEBENEINANDER, die
       rechte mit einer Trennlinie links. Das Feld wird dafuer selbst zum Flex-Behaelter -
       es bleibt zugleich das Flex-Kind von .kopf__innen mit der vollen Zeile. Darunter
       stehen beide untereinander, in der Reihenfolge des Dokuments.
     - Die linke Spalte ist auf 34 rem begrenzt: vier Kacheln von gut 8 rem um ein Bild von
       6 rem. Ohne Grenze zoege das Raster die Kacheln auf die halbe Kopfbreite, und die
       Figuren staenden mit breiten Luecken da.
     - Die Verweise stehen untereinander, jeder mit seinem Symbol davor (gezeichnet in
       teile/_kopf.html.twig, Farbe aus currentColor - das Symbol faerbt sich mit dem Verweis).

   ⭐ DASSELBE FELD UNTER "SOLARKABEL" UND "FAHRZEUGLEITUNG" (Tanja: "Gleiches Spiel für
   Solarkabel", dann "Das gleiche auch direkt für Solarkabel und Fahrzeugleitung"). Weniger
   Kacheln bleiben im selben Raster: links, so gross wie beim Batteriekabel, der Rest der
   Zeile leer. Auf volle Breite gezogen waeren es groessere Figuren in einem Feld, das sonst
   gleich aussieht - wer zwischen den Menuepunkten wechselt, saehe die Figuren springen.
   Deshalb keine Regel je Feld.
   ------------------------------------------------------------------------- */
.untermenue {
    order: 4;
    flex: 1 0 100%;
    min-width: 0;
    padding: var(--abstand-3) 0 var(--abstand-2);
    border-top: var(--linie);
}

.untermenue[hidden] { display: none; }

.untermenue__titel {
    margin: 0 0 var(--abstand-2);
    color: var(--farbe-text-leise);
    font-size: var(--schrift-klein);
    font-weight: 600;
}

/* Unter 48 rem stehen die beiden Huellen untereinander - der Abstand zwischen ihnen haengt
   an der oberen, damit die untere ohne Rand an der Trennlinie des Laptops anliegen kann. */
.untermenue__produkte { margin-bottom: var(--abstand-4); }

.untermenue__kacheln {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: var(--abstand-2);
}

.untermenue__kachel {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--abstand-1);
    height: 100%;
    padding: var(--abstand-2) var(--abstand-1);
    border: 1px solid transparent;
    border-radius: var(--radius);
    color: var(--farbe-text);
    font-size: var(--schrift-klein);
    font-weight: 600;
    line-height: 1.25;
    text-align: center;
    text-decoration: none;
}

.untermenue__kachel:hover,
.untermenue__kachel:focus-visible {
    border-color: var(--marke-rot);
    color: var(--farbe-akzent);
}

/* Breite und Hoehe stehen am <img> und kommen mit dem Figurensatz (App\Seite\Menuefiguren).
   height: auto haelt das Verhaeltnis, wenn die Kachel am schmalen Handy unter die
   Bildbreite faellt. 5 rem ist die Breite des ersten Satzes (80 px, hochkant). */
.untermenue__bild {
    width: 100%;
    max-width: 5rem;
    height: auto;
}

/* ⭐ DIE FIGUREN SIND AUSTAUSCHBAR, seit dem 18.09.2026 - Tanja: "Baue es aber so um, dass
   es leicht widerrufbar ist. Wir probieren vielleicht noch ein paar mehr aus." Das Feld
   traegt untermenue--<satz> und untermenue--b<breite der kleinen Datei>. Die Regel haengt
   an der BREITE, nicht am Namen: Ein neuer Satz mit 96 px (quadratisch, wie "blitz" und
   "echse") braucht hier keine Zeile. Erst eine neue Breite braucht eine. */
.untermenue--b96 .untermenue__bild { max-width: 6rem; }

/* Untereinander, in jeder Breite (Tanja am 18.09.2026: "untereinander, mit passendem
   Icon"). Jede Zeile ist so hoch wie ein Finger breit. */
.untermenue__verweise {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}

.untermenue__verweis {
    display: inline-flex;
    align-items: center;
    gap: var(--abstand-2);
    min-height: var(--bedienhoehe);
}

/* Das Symbol vor dem Verweis. Es ist nur Strich und nimmt die Farbe des Verweises
   (currentColor) - beim Ueberfahren faerbt es sich mit ihm. flex: none, damit ein langer
   Verweistext, der umbricht, das Symbol nicht staucht. */
.untermenue__symbol {
    flex: none;
    width: 1.375rem;
    height: 1.375rem;
}

/* Der kleine Winkel am Menuepunkt - nur mit JavaScript, denn nur dann klappt der Punkt
   etwas auf. Zwei Rahmenlinien, gedreht: kein Bild, keine Symbolschrift. aria-expanded
   setzt rahmen.js, der Winkel zeigt dann nach oben. */
html.js .menue__verweis[data-untermenue]::after {
    content: "";
    flex: none;
    width: 0.45rem;
    height: 0.45rem;
    margin: -0.2rem 0 0 0.5rem;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg);
}

/* Der aufgeklappte Punkt traegt die cremefarbene Flaeche des Ueberfahrens und den gedrehten
   Winkel - KEINE rote Schrift mehr (bis zum 18.09.2026 abends war er rot). Rot heisst im
   Hauptmenue nur noch "hier sind Sie", siehe .menue__verweis--aktiv in Abschnitt 4. Die
   Flaeche bleibt stehen, solange das Feld offen ist: Wer mit der Maus vom Punkt ins Feld
   faehrt, sieht weiter, zu welchem Punkt es gehoert. */
html.js .menue__verweis[data-untermenue][aria-expanded="true"] { background: var(--farbe-flaeche); }

html.js .menue__verweis[data-untermenue][aria-expanded="true"]::after {
    margin-top: 0.25rem;
    transform: rotate(-135deg);
}

/* ⭐ AB 48 REM NEBENEINANDER: links die Kacheln, rechts Rechner und Ratgeber.
   ⚠️ display: flex an .untermenue schluege das hidden aus dem Auszeichnungscode -
   .untermenue[hidden] weiter oben haelt dagegen (zwei Merkmale schlagen eines, gleich in
   welcher Reihenfolge und auch hier in der Medienabfrage). Die Regel dort darf nie fallen.
   align-items: stretch, damit die Trennlinie der rechten Spalte so lang ist wie das Feld
   und nicht nur so lang wie die vier Verweise. */
@media (min-width: 48rem) {
    .untermenue {
        display: flex;
        align-items: stretch;
        gap: var(--abstand-4);
    }

    .untermenue__produkte {
        flex: 0 1 34rem;
        min-width: 0;
        margin-bottom: 0;
    }

    .untermenue__hilfen {
        flex: 1 1 16rem;
        min-width: 0;
        padding-left: var(--abstand-4);
        border-left: var(--linie);
    }
}

/* Erst am breiten Bildschirm die grosszuegigen Abstaende um die Trennlinie. Zwischen 48 und
   64 rem (Tablet hochkant, gemessen bei 768 px) ist die rechte Spalte sonst so schmal, dass
   "Batterien parallel oder in Reihe schalten" auf drei Zeilen bricht. */
@media (min-width: 64rem) {
    .untermenue { gap: var(--abstand-5); }
    .untermenue__hilfen { padding-left: var(--abstand-5); }
}

/* 🔴 MIT DER MAUS SCHWEBT DAS FELD - die zweite Ausnahme von "nichts ueberdeckt etwas"
   (BAUVERTRAG 6). Tanja am 18.09.2026 abends: "Submenü flyout bereits bei Mouseover."

   WARUM AUS "BEIM UEBERFAHREN" DAS SCHWEBEN FOLGT: Im Fluss schoebe das Feld die Seite um
   seine Hoehe nach unten - gemessen 446 px beim Batteriekabel, 231 px bei den beiden
   anderen. Wer mit der Maus quer ueber das Hauptmenue faehrt, saehe die Seite dreimal
   springen. Und Google zaehlt genau das als Layoutverschiebung: Ueberfahren gilt dort,
   anders als ein Klick, NICHT als Eingabe, jede Verschiebung danach geht in den CLS-Wert
   der Seite ein (Ziel des Ladens: 0,05). Ein schwebendes Feld verschiebt nichts. Deshalb
   stand hier bis zu diesem Abend der Klick - Ueberfahren und Fluss vertragen sich nicht.

   DIE AUSNAHME BLEIBT SO KLEIN WIE MOEGLICH:
     - nur wo eine Maus das Hauptwerkzeug ist (hover: hover, pointer: fine) UND das
       Hauptmenue in der Kopfzeile steht (ueber 48 rem). Am Handy und am Tablet bleibt das
       Feld im Fluss und geht per Tipp auf - dort gibt es kein Ueberfahren.
     - position: absolute, NICHT fixed: Das Feld haengt am Kopf und scrollt mit ihm weg.
     - Es verdeckt nur, solange die Maus auf dem Menuepunkt oder im Feld steht; rahmen.js
       schliesst es danach von selbst, ausserdem bei Escape und beim Klick daneben.
     - Es verdeckt den Seitenanfang, nie ein Bedienelement, das gerade benutzt wird - der
       Anlass der Regel war eine Preisleiste UEBER dem Feld, das der Kunde ausfuellte.
   ZURUECK IN DEN FLUSS geht es, indem dieser Block und das Ueberfahren in rahmen.js
   entfallen - dann aber wieder per Klick.

   VOLLE BREITE, INHALT IN DER SPALTE DES LADENS: Bezugsrahmen ist .kopf (nur er ist
   positioniert, .kopf__innen bewusst nicht), das Feld reicht von Fensterrand zu
   Fensterrand, und der Innenabstand rueckt den Inhalt auf die Flucht des Kopfes -
   (100 % - Inhaltsbreite) / 2 plus der Innenabstand von .kopf__innen in dieser Breite.
   Ein Feld nur in Inhaltsbreite liesse links und rechts die Seite durchscheinen.

   KEIN SCHATTEN (BAUVERTRAG 6). Nach unten schliesst die Polleiste des Ladens das Feld ab,
   links rot, rechts schwarz - dasselbe Bild wie unter dem Kopf, zwei Farbflaechen aus
   ::before und ::after. Beide sind absolut gesetzt und damit keine Flex-Kinder des Feldes. */
@media (min-width: 48.01rem) and (hover: hover) and (pointer: fine) {
    .kopf { position: relative; }

    .untermenue {
        position: absolute;
        top: 100%;
        right: 0;
        left: 0;
        z-index: 20;
        padding: var(--abstand-3)
                 max(var(--abstand-4), calc((100% - var(--breite-inhalt)) / 2 + var(--abstand-4)))
                 calc(var(--abstand-4) + var(--polleiste-hoehe));
        background: var(--farbe-grund);
    }

    .untermenue::before,
    .untermenue::after {
        content: "";
        position: absolute;
        bottom: 0;
        left: 0;
        height: var(--polleiste-hoehe);
    }

    .untermenue::before { right: 0; background: var(--marke-schwarz); }
    .untermenue::after { right: 50%; background: var(--marke-rot); }

    /* ⭐ DER SCHLEIER UEBER DER SEITE, seit dem 18.09.2026 abends. Tanja: "Wenn man mit der
       Maus über dem Hauptmenü ist sollte über der restlichen Seite ein graues,
       halbtransparentes Overlay sitzen. Also nur unterhalb des Headerbereichs."

       Er gehoert zum schwebenden Feld und damit zur selben, zweiten Ausnahme von "nichts
       ueberdeckt etwas" (BAUVERTRAG 6) - deshalb steht er in DIESER Medienabfrage und
       nirgends sonst. Er kommt und geht MIT dem Feld (rahmen.js), also nach denselben
       120 und 280 ms: Wer das Menue nur quert, sieht die Seite nicht grau aufblitzen, und
       ueber "Wissen", das kein Feld hat, erscheint er nicht.

       EIN ECHTES ELEMENT, KEIN RIESENSCHATTEN AM FELD: Ein Schatten liesse Klicks durch,
       und wer neben das Feld klickt, traefe den Verweis darunter. Der Schleier faengt den
       Klick ab, rahmen.js schliesst daraufhin nur das Feld.

       position: absolute am Kopf, NICHT fixed: top 100 % ist die Unterkante des Kopfes,
       genau dort soll er beginnen. Die HOEHE setzt rahmen.js beim Aufgehen - bis zum Ende
       des Dokuments und keinen Pixel weiter, sonst verlaengerte er die Seite. Unter dem Feld
       (z-index 20), ueber allem anderen (die Sprungmarke traegt 10, die Hilfe-Blasen 5).
       Ohne Uebergang: Der Laden kennt keine Bewegung.

       :not([hidden]) statt einer zweiten Regel fuer [hidden] - dasselbe Muster wie bei
       .nach-oben: Ausserhalb dieser Abfrage bleibt es bei display: none von unten. */
    .kopf__schleier:not([hidden]) {
        display: block;
        position: absolute;
        top: 100%;
        right: 0;
        left: 0;
        z-index: 15;
        background: rgba(34, 34, 34, 0.5);
    }
}

/* Den Schleier erzeugt rahmen.js, und ausserhalb der Medienabfrage oben gibt es ihn nicht:
   kein Schweben, kein Schleier. */
.kopf__schleier { display: none; }

/* ⭐ AM HANDY EIN AKKORDEON, seit dem 18.09.2026 abends. Tanja: "Mobiles Menü: Nur die
   Querschnitte, keine Rechner und Ratgeber. Das Submenü muss direkt unterm Hauptmenü
   aufklappen. Also wenn ich auf Batteriekabel gehe, müssen direkt darunter die 8 Produkte
   erscheinen. Plus den Link zu 'Alle Batteriekabel'."

   Bis dahin klappte das Feld UNTER der ganzen Liste auf: Wer "Batteriekabel" antippte, sah
   die Figuren erst hinter "Solarkabel", "Fahrzeugleitung" und "Wissen".

   DIREKT UNTER DEM PUNKT steht das Feld, weil rahmen.js es am schmalen Kopf in den
   Listenpunkt haengt (und am breiten zurueck an seinen Platz in .kopf__innen). Das
   Stilblatt allein kann das nicht: order sortiert nur Geschwister, und das Feld ist im
   Auszeichnungscode kein Geschwister der Menuepunkte. Ohne JavaScript klappt am Handy
   ohnehin nichts auf - der Punkt ist dann ein Verweis auf die Kategorieseite.

   NUR DIE QUERSCHNITTE UND "ALLE ...": Beide Zwischenueberschriften und alle Verweise
   ausser dem auf die Kategorieseite (li.untermenue__alle) sind am Handy weg. Sie bleiben im
   Auszeichnungscode, am Laptop stehen sie rechts neben den Kacheln.

   Oben keine Linie (der Menuepunkt darueber traegt seine Trennlinie schon), unten eine als
   Abschluss vor dem naechsten Punkt. */
@media (max-width: 48rem) {
    /* In der Liste am Handy steht der Winkel rechts aussen, wie man es von Akkordeons kennt. */
    html.js .menue__verweis[data-untermenue]::after { margin-left: auto; margin-right: var(--abstand-2); }

    .untermenue {
        padding: var(--abstand-2) var(--abstand-2) var(--abstand-1);
        border-top: 0;
        border-bottom: 1px solid var(--farbe-linie);
    }

    .untermenue__produkte { margin-bottom: 0; }

    .untermenue__titel,
    .untermenue__verweise li:not(.untermenue__alle) { display: none; }
}

@media print {
    .untermenue { display: none !important; }
}

/* == 5  Fuss ==============================================================
   Mindestens dreispaltig, so steht es im Gestaltungsauftrag. Vier Spalten:
   Betrieb, Rechtliches, Zahlungsarten, Sprache.
   ========================================================================= */

/* Kein Aussenabstand oben, seit dem 13.08.2026.
   Der Abstand zum Fuss kommt aus dem Innenabstand von .inhalt (unten 4 rem) und
   auf der Startseite aus der letzten Farbbahn. Stand er zusaetzlich hier, ergab
   das zwei weisse Streifen um die Polleiste, und der rote Strich schwebte frei
   zwischen zwei Flaechen, statt den Fuss abzusetzen. */
.fuss {
    margin-top: 0;
    background: var(--farbe-dunkel);
    color: var(--farbe-auf-dunkel);
    font-size: var(--schrift-klein);
}

/*
 * ⚠️ UNTEN WENIGER LUFT ALS OBEN, seit dem 19.08.2026: Unter den Spalten kommt die
 * Sammelzeile mit ihrer Trennlinie, und die bringt ihren eigenen Abstand mit. Zweimal der
 * volle Abstand ergab eine Lücke, die aussah wie ein Fehler.
 *
 * Der Spaltenabstand ist bewusst grösser als der Zeilenabstand: Untereinander (auf dem
 * Telefon) folgen die Spalten aufeinander wie Absätze, nebeneinander brauchen sie eine
 * Trennung, die man sieht.
 */
.fuss__innen {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding: var(--abstand-5) var(--abstand-3) var(--abstand-4);
    display: grid;
    gap: var(--abstand-4) var(--abstand-5);
}

.fuss__marke {
    display: flex;
    align-items: baseline;
    gap: var(--abstand-2);
    margin: 0 0 var(--abstand-3);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h3);
    font-weight: 600;
    letter-spacing: 0.02em;
}

.fuss__ueberschrift {
    margin: 0 0 var(--abstand-2);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-gross);
    font-weight: 600;
}

.fuss__zeile { margin: 0 0 var(--abstand-2); max-width: var(--breite-text); }

/* Kupfer auf Anthrazit sind 5,3:1 - genug für Fliesstext nach AA. */
.fuss__zeile--leise { color: var(--farbe-auf-dunkel-leise); }

.fuss__liste { list-style: none; margin: 0; padding: 0; }

.fuss__verweis {
    display: inline-flex;
    align-items: center;
    min-height: 2rem;
    color: var(--farbe-auf-dunkel);
}

.fuss__verweis:hover { color: #fff; }

.fuss__verweis--aktiv { font-weight: 600; text-decoration: none; }

.fuss__liste--sprachen { display: flex; gap: var(--abstand-3); }

/*
 * ⭐ DAS SAMMELSURIUM: eine eigene Zeile UNTER den Spalten.
 *
 * Tanjas Vorgabe vom 19.08.2026. Sie traegt alle Seiten, die nicht im Hauptmenue stehen -
 * Impressum, AGB, Widerruf, Datenschutz, Versand, Zahlung, Kontakt, Über uns.
 *
 * Waagerecht und umbrechend statt als fuenfte Spalte: Es sind acht bis zehn Verweise, und
 * eine Spalte daraus waere doppelt so hoch wie der Rest des Fusses. In einer Zeile stehen
 * sie da, wo man sie sucht - ganz unten, klein, vollstaendig.
 *
 * Die Trennlinie darueber ist der einzige Schmuck: Sie sagt, dass hier etwas anderes
 * anfaengt als die Spalten darueber.
 */
/*
 * ⭐ MITTIG UND MIT GLEICHEN ABSTÄNDEN, seit dem 19.08.2026. Tanja: "Die unterste Zeile
 * mit den Links zentrieren, und Abstände hübscher / gleichmäßiger machen."
 *
 * ⚠️ DIE ZEILE STAND VORHER NICHT IM INHALTSRAHMEN. .fuss__sammel lag als Kind von
 * <footer> auf der vollen Fensterbreite, während die Spalten darüber in .fuss__innen auf
 * 72rem begrenzt sind und mittig stehen — die Trennlinie lief also weiter nach links und
 * rechts als alles, was sie trennen sollte. max-width und margin: auto holen sie in
 * dieselbe Spur.
 *
 * ⚠️ ZENTRIERT WIRD ÜBER justify-content UND NICHT ÜBER text-align. Die Verweise sind
 * Flex-Kinder; text-align richtete nur den Text innerhalb jedes einzelnen aus, und der
 * ist so breit wie sein Wort. Zu sehen wäre gar nichts.
 *
 * Der Zeilenabstand war 0 und ist jetzt derselbe wie die halbe Spaltenlücke: Bei zehn
 * Verweisen bricht die Zeile auf schmalen Schirmen um, und zwei Reihen ohne Abstand
 * kleben aneinander. Die Verweise tragen selbst min-height: 2rem (.fuss__verweis), das
 * hat den Mangel bisher zugedeckt.
 */
.fuss__sammel {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding: var(--abstand-4) var(--abstand-3) var(--abstand-5);
    border-top: 1px solid var(--farbe-auf-dunkel-leise);
}

.fuss__sammel-liste {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: var(--abstand-2) var(--abstand-4);
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: var(--schrift-klein);
}

/* Auf Dunkel wäre der anthrazitfarbene Fokusring unsichtbar. */
.fuss :focus-visible { outline-color: var(--marke-creme); }

/* Die Marken der Zahlungsanbieter. Seit dem 12.08.2026 belegt, mit den Dateien aus
   dem Fuß von amumot-shop.de. Welche Marken erscheinen, steht in
   config/packages/twig.yaml - weder hier noch in der Vorlage. */
.fuss__zahlarten {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--abstand-2);
}

/* 2rem statt 1.5rem: Jede Datei bringt eine weiße Karte mit eigenem Innenabstand mit,
   das Markenzeichen darin füllt nur etwa zwei Drittel der Höhe. Bei 1.5rem blieben vom
   Schriftzug rund zehn Pixel übrig - das ist nicht mehr zu erkennen.

   Die weiße Karte ist dabei ein Vorteil: Sie trägt jede Marke in ihren Originalfarben
   vor den dunklen Fuß, ohne dass eine davon eingefärbt oder umrandet werden müsste. */
.fuss__zahlart {
    height: 2rem;
    width: auto;
}

/* == 6  Tabellen ==========================================================
   Der Tabellenkopf steht in Anthrazit mit Creme darauf (12,1:1). Das macht aus
   der Tabelle ein Datenblatt, und ein Datenblatt ist genau das, was diese
   Kundschaft lesen will.
   ========================================================================= */

/* Jede Tabelle gehoert in <div class="scrollen">, sonst sprengt sie das Handy. */
.scrollen {
    overflow-x: auto;
    margin: 0 0 var(--abstand-3);
    -webkit-overflow-scrolling: touch;
}

/* ⭐ separate STATT collapse, seit dem 14.09.2026. Tanja mit Bildschirmfoto vom iPhone
   (Technische Daten auf der Produktseite): "Tabelle fehlt ein Stück vom Rahmen, oben
   rechts?" Der obere Strich endete genau an der Grenze der ersten Spalte. Mit
   border-collapse: collapse zeichnet der Browser den Tabellenrahmen nicht als Rahmen der
   Tabellenbox, sondern verteilt ihn auf die Zellen der ersten Zeile - und Safari laesst
   dabei den Anteil der zweiten Zelle aus, sobald davor eine <caption> steht, die
   .nur-vorlesen absolut aus dem Fluss nimmt. Mit separate und border-spacing 0 ist der
   Rahmen wieder ein Boxrahmen der Tabelle, unabhaengig von den Zellen. Das Bild aendert
   sich sonst nicht: Die Zellen tragen nur border-bottom, die letzte Zeile keins
   (.tabelle tbody tr:last-child), also entstehen keine Doppelstriche.

   ⚠️ NICHT IN SAFARI NACHGEMESSEN - hier gibt es keins. In Chrome sehen beide Fassungen
   gleich aus, das ist gemessen. Ob der Strich am iPhone wieder durchgeht, sagt Tanjas
   naechstes Bildschirmfoto. */
.tabelle {
    border-collapse: separate;
    border-spacing: 0;
    width: 100%;
    font-size: var(--schrift-klein);
    border: var(--linie);
}

/* Eine Tabelle aus Beschriftung und Wert (Technische Daten auf der Produktseite): die
   ganze Wertespalte rechtsbuendig, nicht nur die Zellen mit .zahl. Tanja am 14.09.2026:
   "Alle Werte rechtsbündig, außer der ISO wert."

   🔴 ZWEI KLASSEN, MIT ABSICHT (16.09.2026): Als ".tabelle--werte td" hatte die Regel
   dieselbe Spezifitaet wie ".tabelle td { text-align: left }" weiter unten, und die
   spaetere gewinnt - die Normzeile stand zwei Tage weiter links, die Sichtprobe vom
   14.09. hatte "mittig" fuer "rechts" gehalten. Klassen schlagen Elemente, zwei Klassen
   schlagen eine: 0-2-1 gegen 0-1-1. */
.tabelle.tabelle--werte td { text-align: right; }

/*
 * Eine Tabelle, die nur so breit wird wie ihr Inhalt.
 *
 * Fuer kurze Angabenlisten (Bestellnummer, Betrag, Zahlart) statt fuer Datenblaetter.
 * Ueber die volle Inhaltsbreite stehen Beschriftung und Wert dort meterweit auseinander.
 * max-width haelt sie trotzdem im Rahmen, wenn ein Wert einmal lang wird.
 */
.tabelle--eng {
    width: auto;
    max-width: 100%;
}

.tabelle th,
.tabelle td {
    padding: var(--abstand-2) var(--abstand-3);
    text-align: left;
    border-bottom: var(--linie);
    vertical-align: top;
}

/*
 * ⭐ DIE KOPFZEILE DARF UMBRECHEN. Tanja am 26.08.2026: "Die Tabelle ist sogar an
 * meinem Laptop zu breit. Horizontales Scrollen am Handy ja, aber nicht am Tablet
 * oder Laptop."
 *
 * Hier stand `white-space: nowrap`, und das war die ganze Ursache. Gemessen an der
 * Live-Seite am Datenblatt unter /batteriekabel, acht Spalten:
 *
 *     ohne Umbruch                  894px
 *     mit Umbruch                   792px
 *     + Innenabstand 8px            664px
 *     + 8px und kleinere Schrift    594px
 *
 * Die Inhaltsspalte ist NIE breiter als 808px (Raster .rahmen--leiste: 808px + 256px,
 * gedeckelt bei 1152px). Steht die Seitenleiste daneben, schrumpft sie bis auf rund
 * 680px. Ohne Umbruch passte die Tabelle also nirgends, auch nicht auf einem grossen
 * Bildschirm.
 *
 * 🔴 UND DESHALB STEHT `.tabelle thead .zahl` MIT IN DER ZWEITEN REGEL. Die Kopfzellen
 * des Datenblatts tragen `class="zahl"`, und `.tabelle .zahl` setzt ebenfalls nowrap.
 * Die Spezifitaeten:
 *
 *     .tabelle thead th     0-1-2   (eine Klasse, zwei Elemente)
 *     .tabelle .zahl        0-2-0   (zwei Klassen)
 *     .tabelle thead .zahl  0-2-1   gewinnt
 *
 * Klassen wiegen schwerer als Elemente. `.tabelle thead th` allein verliert also
 * gegen `.zahl` - am Bildschirm gemessen, nicht geschaetzt. Wer die zweite Zeile
 * entfernt, dreht die Tabelle stillschweigend auf den alten Stand zurueck.
 *
 * In den DATENZELLEN bleibt nowrap richtig: "10-2400 cm" und "1.010g" sollen nicht
 * mitten im Wert brechen.
 */
.tabelle thead th {
    background: var(--farbe-dunkel);
    color: var(--farbe-auf-dunkel);
    border-bottom: 0;
    font-family: var(--schrift-titel);
    font-weight: 600;
}

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

/*
 * Ab hier wird der Innenabstand knapper, nicht der Inhalt. Es wird KEINE Spalte
 * ausgeblendet - eine Datentabelle, die je nach Bildschirm etwas anderes behauptet,
 * ist schlimmer als eine, die man schieben muss.
 *
 * 72rem: unterhalb davon steht die Seitenleiste noch daneben und die Inhaltsspalte
 * faellt von 808px auf rund 680px. 664px passen da hinein.
 * 48rem: Tabletbreite. 594px passen in die 720px, die dort ohne Seitenleiste bleiben.
 *
 * Darunter, also am Handy, wird weiter geschoben. Das ist Tanjas Vorgabe.
 */
@media (max-width: 72rem) {
    .tabelle th,
    .tabelle td { padding: var(--abstand-2) 8px; }
}

@media (max-width: 48rem) {
    .tabelle { font-size: 0.8125rem; }
    .tabelle th,
    .tabelle td { padding: 6px; }
}

/* Zeile für Zeile ein Hauch Creme. Hilft beim Wandern über breite Datenblätter. */
.tabelle tbody tr:nth-child(even) { background: var(--farbe-flaeche); }

.tabelle tbody tr:last-child td,
.tabelle tbody tr:last-child th { border-bottom: 0; }

/* Zahlen rechtsbuendig und mit gleicher Ziffernbreite, sonst tanzen die Spalten. */
.tabelle .zahl,
.zahl {
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.tabelle caption {
    caption-side: bottom;
    padding-top: var(--abstand-2);
    color: var(--farbe-text-leise);
    font-size: var(--schrift-winzig);
    text-align: left;
}

/* == 7  Formulare und Bedienelemente ====================================== */

.feld { margin-bottom: var(--abstand-3); }

.feld__beschriftung {
    /* Anker für die Hilfe-Blase. Sie hängt sich an die Beschriftung und erscheint über
       deren volle Breite darunter — damit kann sie auf keinem Bildschirm seitlich
       hinauslaufen, ohne dass irgendwer etwas ausmisst. Siehe teile/_hilfe.html.twig.

       🔴 STEHT EINE HILFE-BLASE DABEI, GEHÖRT DIESE KLASSE AN EINEN UMSCHLAG UM DAS
       <label> UND NICHT AN DAS <label> SELBST. Gemessen am 31.08.2026: Alles, was in
       einem <label for="…"> steht, zählt zum zugänglichen Namen des Feldes, und der
       Text der Blase steht im Ruhezustand nur geklippt da (siehe .hilfe__text weiter
       unten) statt entfernt — er zählte also mit. Aus „Sicherungshalter inkl. Sicherung"
       wurde für eine Vorlesesoftware „Sicherungshalter inkl. Sicherung Erklärung Zur
       Wahl stehen nur Werte, die zum Querschnitt passen." Richtig ist:

           <span class="feld__beschriftung">
               <label for="x">Beschriftung</label><!-- dann die Blase -->
           </span>

       Für die Ausrichtung ändert das nichts, weil position: relative hier an der KLASSE
       hängt und nicht an einem bestimmten Element. Ohne Blase darf die Klasse weiter
       unmittelbar am <label>, an einem <p> oder an einer <legend> stehen. */
    position: relative;
    display: block;
    margin-bottom: var(--abstand-1);
    font-weight: 600;
    font-size: var(--schrift-klein);
}

/*
 * Die Hilfe-Blase — das Fragezeichen hinter einer Beschriftung.
 *
 * ⭐ Tanjas Vorgabe vom 19.08.2026: „Wir müssen mehr mit Tooltips arbeiten, um die
 * eigentliche Seite so übersichtlich wie möglich zu halten."
 *
 * ⚠️ DAS IST DIE AUSNAHME VON „NICHTS ÜBERDECKT ETWAS", UND SIE IST GEWOLLT.
 * Tanjas Dauer-Anweisung richtet sich gegen Elemente, die DAUERHAFT etwas verdecken:
 * klebende Kopfzeilen, feste Leisten, Einblendfenster, die von selbst aufgehen. Diese
 * Blase erscheint nur, solange der Kunde auf dem Fragezeichen steht, und verschwindet,
 * sobald er wegsieht. Sie deckt nichts zu, was er gerade lesen will — sie zeigt genau
 * das, wonach er gefragt hat. Wer das hier ausbaut, weil „nichts überdecken darf",
 * baut die Anweisung falsch herum ein.
 *
 * Kein Einblendfenster im eigentlichen Sinn: kein position: fixed, kein Abdunkeln des
 * Hintergrunds, kein Schließknopf. Der z-index ist 5 und nicht 9999.
 */
.hilfe { display: inline; }

.hilfe__knopf {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.15rem;
    height: 1.15rem;
    margin-left: 0.35rem;
    padding: 0;
    border: 1px solid var(--farbe-linie-stark);
    border-radius: 50%;
    background: var(--farbe-grund);
    color: var(--farbe-text-leise);
    font: inherit;
    font-weight: 600;
    line-height: 1;
    /* Der Mauszeiger sagt, was hier passiert: nachschlagen, nicht abschicken. */
    cursor: help;
    vertical-align: baseline;
}

.hilfe__knopf:hover,
.hilfe__knopf:focus-visible {
    border-color: var(--marke-rot);
    color: var(--marke-rot);
}

/*
 * Ruhezustand: für Vorlesesoftware da, für das Auge weg.
 *
 * 🔴 GEKLIPPT UND NICHT visibility:hidden. Ein Element mit visibility:hidden oder
 * display:none ist auch für das aria-describedby des Knopfes nicht vorhanden — dann
 * steht am Fragezeichen für blinde Kunden buchstäblich nichts. Dieselbe Technik wie
 * .nur-vorlesen, nur eben umschaltbar.
 */
.hilfe__text {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

.hilfe:hover .hilfe__text,
.hilfe:focus-within .hilfe__text {
    top: calc(100% + 0.3rem);
    right: 0;
    left: 0;
    z-index: 5;
    width: auto;
    height: auto;
    overflow: visible;
    clip-path: none;
    white-space: normal;
    padding: var(--abstand-2) var(--abstand-3);
    border: 1px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
    /* Deckend, nicht durchscheinend: Was darunter liegt, soll man NICHT mitlesen. */
    background: var(--farbe-grund);
    color: var(--farbe-text);
    /* Die Beschriftung ist fett, die Erklärung ist es nicht. */
    font-weight: 400;
    line-height: 1.45;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
}

.feld__hinweis {
    display: block;
    margin-top: var(--abstand-1);
    color: var(--farbe-text-leise);
    font-size: var(--schrift-klein);
}

.feld__fehler {
    display: block;
    margin-top: var(--abstand-1);
    color: var(--farbe-fehler);
    font-size: var(--schrift-klein);
    font-weight: 600;
}

/*
 * Zwei Felder in einer Zeile: Vorname und Nachname, Strasse und Hausnummer,
 * Postleitzahl und Ort. Sie gehoeren zusammen, und untereinander macht eine
 * Anschrift neun Zeilen, durch die sich niemand gern tippt.
 *
 * Die Breiten sind nicht gleich verteilt, sondern nach dem, was hineingehoert:
 * eine Hausnummer ist kuerzer als eine Strasse, eine Postleitzahl kuerzer als
 * ein Ortsname. Gleich breite Spalten sehen ordentlich aus und sind es nicht.
 *
 * Die Umbruchgrenze steht ausnahmsweise hier und nicht in Abschnitt 12: sie
 * gehoert zu genau dieser Regel, und getrennt davon wuerde beim naechsten Umbau
 * die eine Haelfte geaendert und die andere vergessen.
 */
/*
 * ⭐ EIN ANSCHRIFTSBLOCK STEHT AUF HALBER INHALTSBREITE, seit dem 19.08.2026.
 *
 * Tanja: "Felder sind auf dem Desktop viel zu breit. Halb so breit reicht. Hausnummer und
 * PLZ haben maximal 5 Ziffern. Da braucht es kein ewig breites Feld."
 *
 * Der Rahmen ist 72rem, ein Feld darin war 34rem breit - fuer einen Vornamen. Lange
 * Eingabefelder sehen nicht grosszuegig aus, sie sehen nach Formular aus, und das Auge
 * muss fuer jede Zeile den ganzen Weg zurueck.
 *
 * ⚠️ DIE BREITE STEHT AM BLOCK UND NICHT AN JEDEM FELD. Daran haengt, dass das Raster
 * darunter mitschrumpft: 3fr/1fr von 34rem macht aus der Hausnummer von selbst ein kurzes
 * Feld. Wer stattdessen jedem Feld eine Breite gibt, hat beim naechsten Feldpaar wieder
 * eine Ausnahme.
 */
.anschriftsfelder { max-width: 34rem; }

/* Ein Feld fuer hoechstens fuenf Ziffern. Der Deckel steht zusaetzlich zum Raster, damit
   Hausnummer und Postleitzahl auch dann kurz bleiben, wenn der Block einmal breiter wird
   oder eines der beiden allein in einer Zeile steht. 7rem tragen "12345" und "123-125". */
.eingabe--kurz { max-width: 7rem; }

.feldpaar { display: grid; gap: 0 var(--abstand-3); }

@media (min-width: 30rem) {
    .feldpaar { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .feldpaar--breit-schmal { grid-template-columns: minmax(0, 3fr) minmax(0, 1fr); }
    .feldpaar--schmal-breit { grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); }
}

/* Ein Feld, das der Kunde nicht aendern kann, sieht auch so aus. Grau auf Creme
   statt Schwarz auf Weiss - und weil ein gesperrtes Feld beim Absenden NICHTS
   mitschickt, traegt daneben ein verstecktes Feld den Wert. Ohne das kaeme die
   Anschrift ohne Land an und die Kasse wiese sie ab. */
.eingabe[disabled] {
    background: var(--farbe-flaeche);
    border-color: var(--farbe-linie);
    color: var(--farbe-text-leise);
    cursor: not-allowed;
}

input, select, textarea, button { font: inherit; color: inherit; }

.eingabe,
select.eingabe {
    display: block;
    width: 100%;
    min-height: var(--bedienhoehe);
    padding: var(--abstand-2) var(--abstand-3);
    background: var(--farbe-grund);
    border: 1px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
}

.eingabe:focus-visible { border-color: var(--farbe-akzent); }

.eingabe--fehler { border-color: var(--farbe-fehler); }

.eingabe[aria-invalid="true"] { border-color: var(--farbe-fehler); }

.eingabe--zahl { font-variant-numeric: tabular-nums; }

/* Ein Stueckzahlfeld ist kein Textfeld und braucht die volle Zeilenbreite nicht.
   Dreistellig genuegt: wer mehr als 999 Masskabel gleicher Art braucht, ruft an.
   Die Breite traegt drei Ziffern und das Drehfeld des Browsers. */
.eingabe--menge {
    width: 5.5rem;
    text-align: center;
}

/* Feld und Knopf sind EINE Handlung und stehen deshalb nebeneinander. Untereinander
   sahen sie aus wie zwei. .eingabe ist eine Blockzeile, die Reihe hebt das auf. */
.mengenreihe {
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
}

/*
 * Die Knopfzelle der Warenkorbzeile: Merken-Stern und Entfernen-X nebeneinander.
 *
 * ⚠️ OHNE DIESE REGEL STAPELN SIE SICH. Beide Knöpfe stecken in einem eigenen <form>
 * (jeder ändert etwas und läuft deshalb per POST, Begründung in _zeile.html.twig), und
 * ein <form> ist ein Blockelement. Am 19.08.2026 genau so live gegangen: Der Stern
 * stand über dem X, und jede Warenkorbzeile war doppelt so hoch wie nötig.
 *
 * Gefunden hat das kein Prüflauf, sondern eine Kopplungsprüfung über den ganzen Baum —
 * eine Klasse in einer Vorlage, die es im Stilblatt nicht gibt, sieht im Quelltext
 * richtig aus und tut nichts. Dieselbe Fehlerklasse wie ein Bild ohne Datei.
 */
.zeilenknoepfe {
    display: flex;
    align-items: center;
    gap: var(--abstand-1);
}

/* Die Hauptaktion ist rot: Rot ist der Pluspol, und der Kaufknopf ist das Plus
   dieser Seite. Weiss auf #A62822 sind 7,1:1. */
.knopf {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-4);
    border: 1px solid transparent;
    border-radius: var(--radius);
    background: var(--farbe-akzent);
    color: #fff;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}

.knopf:hover { background: var(--farbe-akzent-tief); color: #fff; }

.knopf[disabled],
.knopf--gesperrt {
    background: var(--farbe-linie-stark);
    border-color: var(--farbe-linie-stark);
    color: #fff;
    cursor: not-allowed;
}

/* Der zweitrangige Knopf ist der Minuspol: Umriss in Anthrazit, keine Fläche. */
.knopf--zweitrangig {
    background: var(--farbe-grund);
    border-color: var(--marke-schwarz);
    color: var(--farbe-text);
}

.knopf--zweitrangig:hover {
    background: var(--farbe-flaeche);
    color: var(--farbe-text);
}

.knopf--breit { width: 100%; }

/* Symbolknopf: quadratisch statt beschriftet. Das Wort verschwindet nicht, es
   wandert - in title (Sprechblase bei Mouseover) und in .nur-vorlesen (fuer den
   Vorleser). Ein Knopf ohne zugaenglichen Namen ist fuer Blinde ein "Schaltflaeche".
   Die 44 px bleiben: ein Symbol wird nicht kleiner angefasst als ein Wort. */
.knopf--symbol {
    flex: 0 0 auto;
    width: var(--bedienhoehe);
    padding: 0;
}

.knopf__symbol {
    width: 1.25rem;
    height: 1.25rem;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
}

/* Der stille Knopf hat weder Flaeche noch Umriss. Fuer Nebenhandlungen, die neben
   der Ware stehen und sie nicht ueberstimmen sollen - Entfernen sucht niemand, es
   muss nur da sein, wenn man es sucht. #5E5852 sind 7,0:1 auf Weiss.
   Beim Zeigen wird es dunkler, nicht rot: Rot ist in diesem Laden der Pluspol und
   gehoert dem Kaufknopf. Wegnehmen ist das Gegenteil, also Anthrazit. */
.knopf--still {
    background: transparent;
    border-color: transparent;
    color: var(--farbe-text-leise);
}

.knopf--still:hover {
    background: var(--farbe-flaeche);
    border-color: var(--farbe-linie);
    color: var(--farbe-text);
}

/*
 * Die Zeile, die eine Seite abschliesst: Abstand nach oben, weil der Knopf nicht
 * mehr zur Tabelle darueber gehoert, und rechts, wo der Blick nach der Summenspalte
 * ankommt. Auf dem Telefon bleibt .knopf--breit voll breit, dann wirkt es nicht.
 *
 * max-width: none IST DER EIGENTLICHE PUNKT. Absaetze stehen im Laden auf Lesebreite
 * (p { max-width: 38rem }), der Inhaltsrahmen ist 72rem. Ein rechtsbuendiger Knopf in
 * einem halb so breiten Absatz landet ungefaehr in der Mitte der Seite - genau so sah
 * es am 14.08.2026 aus, und es sah nach mittig aus, weil es das praktisch war.
 * Die Lesebreite gilt fuer Text. Eine Knopfzeile ist keiner.
 *
 * flex statt text-align, damit es auch dann rechts bleibt, wenn spaeter ein zweiter
 * Knopf dazukommt.
 */
.knopfzeile {
    display: flex;
    justify-content: flex-end;
    max-width: none;
    margin-top: var(--abstand-5);
}

/* Auswahl als Kachelgruppe, etwa Farbe oder Kabelschuh im Konfigurator. */
.wahl {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-2);
    border: 0;
    margin: 0;
    padding: 0;
}

.wahl__punkt {
    display: inline-flex;
    align-items: center;
    gap: var(--abstand-2);
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-3);
    border: 1px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    cursor: pointer;
}

.wahl__punkt:hover { background: var(--farbe-flaeche); }

.wahl__punkt--gewaehlt {
    border-color: var(--marke-rot);
    box-shadow: inset 0 0 0 1px var(--marke-rot);
    background: var(--farbe-akzent-blass);
    font-weight: 600;
}

/* == 8  Meldungen und Kleinteile =========================================== */

.hinweis {
    border: var(--linie);
    border-left: 4px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
    background: var(--farbe-flaeche);
    padding: var(--abstand-3);
    margin-bottom: var(--abstand-3);
}

.hinweis--gut     { border-left-color: var(--farbe-gut); }
.hinweis--warnung { border-left-color: var(--farbe-warnung); }

/* Der Fehlerhinweis muss sich vom Markenrot unterscheiden lassen, sonst liest
   man jeden roten Knopf als Fehler. Deshalb dunkler, mit eigener Fläche - und
   der Klartext trägt die Aussage ohnehin allein. */
.hinweis--fehler {
    border-left-color: var(--farbe-fehler);
    border-color: var(--farbe-fehler);
    background: #FBEFEE;
}

/* ⭐ DER LETZTE KASTEN VOR DEM BESTELLKNOPF. Tanja am 27.08.2026, an einem Bild der
   Prüfseite: "Box muss von der Box darüber losgelöst sein. Hintergrund der Box auch in
   einer anderen Farbe."

   Darüber steht der Summenblock aus warenkorb/_summen.html.twig - eine .flaeche in Creme,
   mit dem Versand- und Lieferhinweis am Fuss. .flaeche bringt keinen Aussenabstand mit,
   das Formular darunter auch nicht, und beide tragen dieselbe Fläche: die zwei Kästen
   stossen auf Kante und lesen sich als ein Block mit einem Absatz darin. Der untere ist
   aber etwas anderes - die letzte Auskunft vor einem Schritt, der sich nicht mehr
   zurücknehmen lässt.

   ⚠️ EIGENE KLASSE, WEIL .hinweis IN 29 VORLAGEN STEHT. Vom Konto über den Konfigurator
   und den Warenkorb bis in den Betriebsbereich. Wer den Grund an .hinweis selbst ändert,
   färbt jeden Hinweis im ganzen Laden um - auch den, der nur meldet, dass eine Auswahl
   leer ist. Deshalb ein Zusatz zu .hinweis, kein Eingriff in .hinweis.

   ⚠️ DIE FARBE KOMMT AUS DER PALETTE, kein Hexwert daneben. --farbe-akzent-blass ist das
   blass angelegte Markenrot. Der Kasten trägt damit die Hausfarbe und sieht trotzdem
   nicht wie eine Fehlermeldung aus: .hinweis--fehler hat zusätzlich den dunkelroten
   Rahmen ringsum und einen eigenen, kälteren Grund.

   NACHGERECHNET, NICHT GESCHÄTZT: --farbe-text auf --farbe-akzent-blass sind 13,5:1 im
   Grundzustand (#222222 auf #F7EAE8) und 17,9:1 in der Kontrastfassung (#000000 auf
   demselben Grund, weil Abschnitt 13 diese Variable nicht umstellt). Verlangt sind 4,5:1.
   Das Paar steht als "Gewaehlte Kachel" ohnehin schon in der Liste von
   gestaltung/werkzeuge/sehhilfe-pruefen.php und wird dort in BEIDEN Ansichten
   mitgemessen - Abschnitt 13 braucht deswegen keine zusätzliche Zeile.

   ⚠️ DIE FARBE ALLEIN TRÄGT DIE AUSSAGE NICHT. Wer Farben schlecht unterscheidet, sieht
   den Wechsel von Creme auf Blassrot womöglich gar nicht. Drei Dinge sagen es deshalb
   ohne Farbe mit: der grosse Abstand nach oben, der breitere Balken links in der
   Akzentfarbe (dasselbe Mittel wie .flaeche--wichtig) und die kräftigere Kante ringsum.
   In Graustufen bleibt der Kasten ein eigener Kasten.

   Nichts hiervon schwebt, klebt oder überdeckt etwas - der Kasten steht im Fluss und
   schiebt nur den Knopf nach unten. */
.hinweis--pruefen {
    margin-top: var(--abstand-5);
    /* Reihenfolge zählt: border-color zuerst, danach setzt border-left die linke Seite
       wieder komplett neu. Umgekehrt geschrieben wäre der Balken wieder blass. */
    border-color: var(--farbe-linie-stark);
    border-left: 6px solid var(--farbe-akzent);
    background: var(--farbe-akzent-blass);
    padding: var(--abstand-4);
}

.hinweis > :last-child { margin-bottom: 0; }

.leise { color: var(--farbe-text-leise); }
.klein { font-size: var(--schrift-klein); }

/* Der Einleitungssatz unter einer Hauptüberschrift. Eine Stufe grösser als der
   Fliesstext, mehr braucht es nicht. */
.lead {
    font-size: var(--schrift-gross);
    margin-bottom: var(--abstand-4);
}

/* Frage und Antwort. <details> statt eigener Aufklapptechnik: der Browser kann
   das, es kostet keine Zeile JavaScript, und ohne JavaScript geht es genauso. */
.frage {
    border-bottom: var(--linie);
    padding: var(--abstand-2) 0;
}

.frage__titel {
    display: flex;
    align-items: center;
    min-height: var(--bedienhoehe);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h3);
    font-weight: 600;
    cursor: pointer;
    /* Platz fuer das Chevron rechts, siehe ::after. Kein Browser-Dreieck daneben. */
    position: relative;
    padding-right: 2.5rem;
    list-style: none;
}

.frage__titel::-webkit-details-marker { display: none; }

/* ⭐ DAS CHEVRON, seit dem 14.09.2026. Tanja: "Auch muss in jede Zeile rechtsbündig ein
   Chevron Icon platziert werden. Sonst sieht man ja nicht, dass man aufklappen kann. Zum
   Zuklappen auch wieder ein entsprechendes Chevron." Ein Winkel aus zwei Kanten in der
   Textfarbe, zu: Spitze nach unten, offen: Spitze nach oben. Kein Bild, keine Datei -
   dreht sich mit, faerbt sich mit. */
.frage__titel::after {
    content: "";
    position: absolute;
    right: 0.75rem;
    top: 50%;
    width: 0.6rem;
    height: 0.6rem;
    margin-top: -0.5rem;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg);
    transition: transform 0.2s ease, margin-top 0.2s ease;
}

.frage[open] > .frage__titel::after {
    margin-top: -0.15rem;
    transform: rotate(-135deg);
}

.frage[open] .frage__titel { color: var(--farbe-akzent); }

.frage__antwort { padding: var(--abstand-2) 0 var(--abstand-3); }

.frage__antwort > :last-child { margin-bottom: 0; }

/* Der Weg von der Startseite hierher. */
.brotkrumen {
    margin-bottom: var(--abstand-4);
    font-size: var(--schrift-klein);
    color: var(--farbe-text-leise);
}

.brotkrumen a { color: var(--farbe-text-leise); }
.brotkrumen a:hover { color: var(--farbe-akzent); }

/* Preise werden immer mit gleicher Ziffernbreite gesetzt. Der Wert selbst kommt
   ausnahmslos aus dem Preisrechner - hier steht nur, wie er aussieht. */
.preis {
    font-variant-numeric: tabular-nums;
    font-weight: 700;
    white-space: nowrap;
}

.preis--gross { font-size: var(--schrift-h2); letter-spacing: -0.01em; }
.preis--zusatz { font-weight: 400; color: var(--farbe-text-leise); font-size: var(--schrift-klein); }

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

/* == 9  Bilder, Bahnen und Kacheln ========================================
   Neu am 13.08.2026 mit dem Gestaltungsumbau. Diese Bausteine sind allgemein -
   sie gehören keiner Seite. Was nur die Startseite braucht, steht in 10.
   ========================================================================= */

/* Jedes Bild traegt width und height im Auszeichnungscode. Der Grund darunter
   verhindert, dass die Flaeche vor dem Laden weiss aufblitzt. */
.bild {
    display: block;
    width: 100%;
    height: auto;
    background: var(--farbe-flaeche-tief);
}

/* Randabfallend: aus dem Inhaltsrahmen heraus bis an beide Schirmkanten.
   100vw statt 100 %, weil der Rahmen bei 72 rem gedeckelt ist und das Band
   darueber hinaus soll. */
.randlos {
    width: 100vw;
    max-width: 100vw;
    margin-inline: calc(50% - 50vw);
}

/* Ein Bildband ueber die volle Breite. Die Hoehe ist gedeckelt, sonst wird auf
   einem breiten Schirm aus dem Band eine Wand. */
.band {
    position: relative;
    overflow: hidden;
    max-height: 30rem;
}

.band .bild { object-fit: cover; height: 100%; }

/* -- Bahnen: ein Abschnitt, der ueber die volle Breite eingefaerbt ist. Innen
      sitzt der Inhalt wieder auf 72 rem. Gehoert in den Block vor_inhalt oder
      nach_inhalt von base.html.twig, nicht in .inhalt. -- */
.zone {
    padding-block: var(--abstand-6);
    margin-block: var(--abstand-6);
}

.zone--creme  { background: var(--farbe-flaeche); }
.zone--dunkel { background: var(--farbe-dunkel); color: var(--farbe-auf-dunkel); }

/* Die letzte Bahn vor dem Fuss. Ohne sie steht ein weisser Streifen zwischen
   Bahn und Polleiste, und der rote Strich schwebt frei. */
.zone--schluss { margin-bottom: 0; }

.zone__innen {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding-inline: var(--abstand-3);
}

/* Auf Dunkel ist Rot nie Text (2,2:1). Ueberschriften stehen dort in Creme, den
   Markenbezug traegt der rote Strich darueber. */
.zone--dunkel h2 { color: var(--farbe-auf-dunkel); }
.zone--dunkel .leise { color: var(--farbe-auf-dunkel-leise); }
.zone--dunkel a { color: var(--marke-creme); }
.zone--dunkel :focus-visible { outline-color: var(--marke-creme); }

/* Der zweitrangige Knopf auf dunklem Grund: Umriss in Creme statt Anthrazit,
   sonst verschwindet er in der Flaeche. */
.knopf--auf-dunkel {
    background: transparent;
    border-color: var(--marke-creme);
    color: var(--marke-creme);
}

.knopf--auf-dunkel:hover {
    background: var(--marke-creme);
    color: var(--marke-schwarz);
}

/* -- Text neben Bild. Auf dem Handy untereinander, ab 64 rem nebeneinander. -- */
.paar {
    display: grid;
    gap: var(--abstand-4);
    align-items: center;
    margin-bottom: var(--abstand-6);
}

.paar__text > :last-child { margin-bottom: 0; }
.paar__text p { max-width: 34rem; }

/* -- Vier harte Zahlen statt vier Adjektive. Die Zahl gross, das Wort klein,
      darueber der rote Strich - dasselbe Zeichen wie ueber den
      Hauptueberschriften, eine Stufe kleiner. -- */
.zahlen {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--abstand-4);
    margin: 0;
    padding: 0;
    list-style: none;
}

.zahlen li::before {
    content: "";
    display: block;
    width: 1.75rem;
    height: 3px;
    margin-bottom: var(--abstand-2);
    background: var(--marke-rot);
}

.zahlen__wert {
    display: block;
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h1);
    font-weight: 600;
    line-height: 1.1;
    font-variant-numeric: lining-nums tabular-nums;
}

.zahlen__wort {
    display: block;
    margin-top: var(--abstand-1);
    font-size: var(--schrift-klein);
    color: var(--farbe-text-leise);
}

.zone--dunkel .zahlen__wort { color: var(--farbe-auf-dunkel-leise); }

/* -- Masszahlen als Reihe kleiner Marken, etwa die Querschnitte einer
      Kabelart. Sie sind das eigentliche Verkaufsargument: der Kunde sucht eine
      Zahl, kein Gefuehl. -- */
.masse {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-1);
    margin: 0 0 var(--abstand-3);
    padding: 0;
    list-style: none;
    font-variant-numeric: tabular-nums;
    font-size: var(--schrift-klein);
}

/* ⭐ DIE MARKE IST EIN SPAN IM LISTENPUNKT, seit dem 18.09.2026. Tanja: "nimm die mm² aus
   der letzten Zahl. Also einfach außerhalb vom weißen Markup rechts platzieren." Vorher
   war der Listenpunkt selbst die Marke, und die Einheit stand mit in der letzten. Jetzt
   traegt der Punkt Zahl und - nur der letzte - die Einheit daneben: Beide bleiben ein
   Stueck und brechen gemeinsam um. */
.masse li {
    display: flex;
    align-items: center;
    gap: var(--abstand-1);
}

.masse__marke {
    padding: 0.15rem var(--abstand-2);
    border: 1px solid var(--farbe-linie);
    border-radius: var(--radius);
    background: var(--farbe-flaeche);
}

.masse__einheit { color: var(--farbe-text-leise); }

/* Liegt die Reihe selbst auf Creme, braucht die Marke Weiss - sonst
   verschwindet sie in der Flaeche, auf der sie liegt. */
.flaeche .masse__marke,
.reihe .masse__marke { background: var(--farbe-grund); }

/* -- Abschnittskopf: Ueberschrift plus erklaerender Satz darunter. -- */
.abschnitt__kopf { margin-bottom: var(--abstand-4); }
.abschnitt__kopf p { color: var(--farbe-text-leise); max-width: 44rem; }
.zone--dunkel .abschnitt__kopf p { color: var(--farbe-auf-dunkel-leise); }

/* Fuer Ueberschriften, die eine Bahn oder einen ganzen Abschnitt anfuehren.
   clamp statt fester Groesse: zwischen Handy und Schirm liegt sonst ein Sprung. */
.ueberschrift-gross { font-size: clamp(1.7rem, 4vw, 2.5rem); }

/* -- Bewegung. Das Einzige, was sich bewegt: Abschnitte blenden beim Scrollen
      einmal auf. Kein Karussell, keine Parallaxe, nichts, was ueber etwas
      anderes faehrt.

      Der Ausgangszustand ist SICHTBAR und nicht unsichtbar. Wo der Browser
      animation-timeline nicht kann, steht damit alles von Anfang an da. Eine
      Einblendung, die haengenbleibt, macht die Seite leer - und das faellt beim
      Bauen nicht auf, weil der eigene Browser es ja kann. -- */
@supports (animation-timeline: view()) {
    @media (prefers-reduced-motion: no-preference) {
        .aufblenden {
            animation: aufblenden linear both;
            animation-timeline: view();
            animation-range: entry 10% cover 28%;
        }

        @keyframes aufblenden {
            from { opacity: 0; transform: translateY(1.25rem); }
            to   { opacity: 1; transform: none; }
        }
    }
}

/* == 10  Startseite und Fehlerseiten ======================================
   Der Aufmacher heisst .schaufenster und ersetzt seit dem 13.08.2026 die
   Cremeflaeche .aufmacher.

   ZUR UEBERSCHRIFT IM BILD, weil das die strittige Stelle ist:
   Der Text steht auf dem Foto, aber nichts ueberdeckt etwas. Das Bild ist
   Grund, kein Inhalt - es verdeckt keine Schaltflaeche und keine Angabe, und es
   verschiebt sich beim Scrollen nicht. Die Regel aus BAUVERTRAG Abschnitt 6
   zielt auf klebende Leisten und Einblendfenster, nicht auf Satz.

   Die Lesbarkeit ist gemessen, nicht geschaetzt, mit
   gestaltung/werkzeuge/bildkontrast-messen.php ueber genau den Ausschnitt, in
   dem der Text sitzt:

       Leuchtdichte im Mittel   0,0100
       Creme darauf             13,3:1 im Mittel, 12,6:1 bei 95 % der Flaeche
       Flaeche unter 4,5:1      0,1 %

   Deshalb kein Verlauf und keine abgedunkelte Platte ueber dem Foto - beides
   waere nach BAUVERTRAG ohnehin nicht erlaubt, und beides braucht es nicht.

   WIRD DAS AUFMACHERBILD AUSGETAUSCHT, GEHOERT DIESE MESSUNG WIEDERHOLT. Ein
   helleres Foto traegt den Text nicht, und das sieht man ihm nicht an.
   ========================================================================= */

.schaufenster {
    background: var(--farbe-dunkel);
    color: var(--farbe-auf-dunkel);
}

.schaufenster__bild {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 21 / 9;
    object-fit: cover;
}

.schaufenster__innen {
    max-width: var(--breite-inhalt);
    margin: 0 auto;
    padding: var(--abstand-5) var(--abstand-3);
}

.schaufenster h1 {
    font-size: clamp(2.1rem, 6.5vw, 3.5rem);
    color: var(--farbe-auf-dunkel);
    margin-bottom: var(--abstand-3);
    max-width: 18em;
}

/* Der rote Strich ueber der Ueberschrift, hier groesser als im Inhalt. */
.schaufenster h1::before {
    content: "";
    display: block;
    width: 4rem;
    height: 4px;
    margin-bottom: var(--abstand-3);
    background: var(--marke-rot);
}

.schaufenster__lead {
    font-size: var(--schrift-gross);
    color: var(--farbe-auf-dunkel);
    max-width: 32rem;
    margin-bottom: var(--abstand-4);
}

.schaufenster__knoepfe { display: flex; flex-wrap: wrap; gap: var(--abstand-2); margin: 0; }
.schaufenster :focus-visible { outline-color: var(--marke-creme); }

/* -- Das Sortiment als breite Reihen: Bild links, Text rechts, Preis und Knopf
      auf einer Linie. Reihen statt Kacheln, weil drei Kabelarten sich in Worten
      unterscheiden und nicht in Bildern - die Reihe gibt dem Text Platz.

      Creme auf Weiss, nicht Weiss auf Weiss: der Seitengrund ist weiss. -- */
.reihen { list-style: none; margin: 0 0 var(--abstand-5); padding: 0; }

.reihe {
    display: grid;
    gap: var(--abstand-4);
    align-items: center;
    background: var(--farbe-flaeche);
    border: var(--linie);
    border-radius: var(--radius);
    overflow: hidden;
    margin-bottom: var(--abstand-4);
}

.reihe__bild { aspect-ratio: 16 / 10; object-fit: cover; height: 100%; }

.reihe__innen { padding: var(--abstand-4); }

.reihe__norm {
    margin: 0 0 var(--abstand-1);
    font-size: var(--schrift-winzig);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--farbe-text-leise);
}

.reihe__titel {
    margin: 0 0 var(--abstand-2);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h2);
    font-weight: 600;
}

.reihe__titel a { color: var(--farbe-text); text-decoration: none; }
.reihe__titel a:hover { color: var(--farbe-akzent); text-decoration: underline; }

.reihe__text { margin-bottom: var(--abstand-3); }

.reihe__abschluss {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--abstand-3);
    margin: 0;
}

/* -- Karte: ein abgesetzter Kasten auf der weissen Seite. -- */
.karte {
    background: var(--farbe-flaeche);
    border: var(--linie);
    border-radius: var(--radius);
    padding: var(--abstand-4);
    margin-bottom: var(--abstand-5);
}

.karte > :last-child { margin-bottom: 0; }

/* -- Drei Schritte nebeneinander, die Ziffer im roten Quadrat. Anders als
      .ablauf, wo die Schritte untereinander stehen. -- */
.schritte {
    display: grid;
    gap: var(--abstand-4);
    counter-reset: schritt;
    list-style: none;
    margin: 0;
    padding: 0;
}

.schritte li { counter-increment: schritt; }

.schritte li::before {
    content: counter(schritt);
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    margin-bottom: var(--abstand-2);
    background: var(--marke-rot);
    color: #fff;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

.schritte h3 { margin-bottom: var(--abstand-1); font-size: var(--schrift-h3); }
.schritte p { margin-bottom: 0; }

/* -- Boxen zu Rechnern und Ratgebern, Tanjas Vorgabe vom 13.08.2026: je ein
      Bild und eine Kurzbeschreibung, und der Verweis sitzt HART AUF DEM KEYWORD
      im Fliesstext. Kein Knopf.

      Das ist kein Geschmack, sondern interne Verlinkung: Ein Knopf mit der
      Aufschrift "Mehr erfahren" gibt der Zielseite kein einziges Wort mit.

      Zwei Regeln, die daraus folgen und beim Weiterbauen gelten:
        1. GENAU EIN VERWEIS JE BOX. Das Bild bekommt keinen - zwei Verweise auf
           dasselbe Ziel sind fuer Vorlesesoftware eine Dopplung und verteilen
           das Gewicht auf zwei Anker, von denen einer leer ist.
        2. KEINE UEBERSCHRIFT UEBER DER BOX. Sie waere der zweite Anker oder
           toter Text. Die Kennzeichnung darueber ist bewusst kein Verweis. -- */
.wissensboxen {
    display: grid;
    gap: var(--abstand-4);
    margin: 0 0 var(--abstand-4);
    padding: 0;
    list-style: none;
}

.wissensbox {
    display: flex;
    flex-direction: column;
    background: var(--farbe-grund);
    border: var(--linie);
    border-radius: var(--radius);
    overflow: hidden;
}

.wissensbox__bild { aspect-ratio: 3 / 2; object-fit: cover; }

.wissensbox__innen { padding: var(--abstand-3) var(--abstand-4) var(--abstand-4); }

/* Rot fuer den Rechner, weil er etwas ausrechnet und damit die aktive Seite
   ist - Anthrazit fuer den Ratgeber. Die Farbe ist Schmuck, das Wort daneben
   traegt die Aussage. */
.wissensbox__art {
    display: inline-block;
    margin: 0 0 var(--abstand-2);
    padding: 0.1rem var(--abstand-2);
    background: var(--marke-schwarz);
    color: var(--marke-creme);
    font-size: var(--schrift-winzig);
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

.wissensbox__art--rechner { background: var(--marke-rot); color: #fff; }

.wissensbox__text { margin: 0; max-width: none; }

/* Der Verweis im Fliesstext wird unterstrichen und bleibt es. Ein Verweis, den
   man erst beim Ueberfahren erkennt, wird auf dem Handy nie gefunden. */
.wissensbox__text a {
    font-weight: 600;
    text-decoration: underline;
    text-decoration-thickness: 2px;
}

/*
 * Der Weg durch die Kasse: Anschrift - Zahlart - Pruefen. Die Ziffer sitzt im
 * roten Quadrat, wieder der Pluspol, diesmal als Wegweiser.
 *
 * AM 14.08.2026 VON UNTEREINANDER AUF NEBENEINANDER GEDREHT. Untereinander
 * brauchten drei Woerter drei Zeilen und sahen aus wie eine Aufgabenliste statt
 * wie ein Weg mit drei Haltestellen. Tanja hat es als Fehler gemeldet, und sie
 * hatte recht: eine Fortschrittsanzeige zeigt, wo man ist, und dafuer muessen
 * die Stationen nebeneinanderstehen.
 *
 * Der einzige Ort, der .ablauf benutzt, ist kasse/_geruest.html.twig - geprueft
 * ueber das ganze templates-Verzeichnis. Der Umbau kann also nichts anderes
 * treffen. Das Markup bleibt unangetastet (die Datei gehoert einem anderen
 * Slot): ein <ol>, ein <li> je Station, der aktuelle traegt aria-current.
 */
/*
 * ⭐ GROSSZUEGIGER SEIT DEM 26.08.2026. Tanja mit Bildschirmfoto der Kasse, den ersten
 * Schritt eingekreist: "Die einzelnen Tabs großzügiger machen. Breiter, höher. Aktiver Tab
 * besser als active designen."
 *
 * ⚠️ WAS VORHER FEHLTE, war nicht die Groesse allein: Der aktuelle Schritt hob sich
 * ausschliesslich durch Fettschrift ab. Alle drei Quadrate waren rot, auch die, die noch
 * kommen - und Rot liest man als "hier bist du". Drei rote Quadrate nebeneinander sagen
 * damit dreimal dasselbe und nichts.
 *
 * 🔴 AM SELBEN TAG NOCH EINMAL ZURUECKGENOMMEN. Mein erster Anlauf gab JEDER Station einen
 * eigenen Kasten mit Rahmen. Tanja mit Bildschirmfoto, alle drei eingekreist: "zu viele
 * Striche. zu unruhig."
 *
 * Sie hat recht, und der Fehler ist der klassische: Ich habe das Merkmal, das den AKTIVEN
 * kenntlich machen soll, allen gegeben - und damit wieder eingeebnet. Drei Kaesten
 * nebeneinander sind dasselbe Problem wie vorher die drei roten Quadrate, nur in Linien.
 *
 * Jetzt traegt nur der aktive Schritt etwas Sichtbares:
 *
 *   erledigt  graues Quadrat, Text leise, KEIN Rahmen, KEINE Flaeche
 *   AKTIV     rotes Quadrat, helle Flaeche, Rahmen, roter Balken unten, Text dunkel
 *   kommend   Quadrat nur als Umriss, Text leise, KEIN Rahmen, KEINE Flaeche
 *
 * ⚠️ RAHMEN UND BALKEN LIEGEN TROTZDEM AUF ALLEN, nur durchsichtig. Ein Rahmen, der erst
 * beim aktiven Schritt entsteht, verschoebe die anderen um seine Breite - die Zeile
 * huepfte bei jedem Schritt. transparent kostet keinen Strich und haelt die Masse gleich.
 * Und nichts ueberdeckt etwas, das ist Tanjas Dauerregel.
 */
.ablauf {
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    gap: var(--abstand-2);
    list-style: none;
    counter-reset: schritt;
    margin: 0 0 var(--abstand-4);
    padding: 0;
}

/*
 * ⚠️ SPEZIFITAET, NICHT REIHENFOLGE. Die Vorlage schreibt <ol class="ablauf klein">, und
 * .klein steht in der Datei weiter unten - bei gleichem Gewicht (0-1-0) gewinnt das
 * spaetere. Mit .ablauf.klein (0-2-0) ist die Frage entschieden, unabhaengig davon, wohin
 * jemand .klein spaeter verschiebt. Ohne diese Zeile bleibt die Schrift klein, und die
 * Aenderung waere lautlos wirkungslos.
 */
.ablauf.klein { font-size: var(--schrift-grund); }

.ablauf li {
    counter-increment: schritt;
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
    padding: var(--abstand-2) var(--abstand-3);
    /* Durchsichtig, nicht abwesend - siehe Kopf. Die Breite muss stehen, damit die Zeile
       beim Schrittwechsel nicht springt. */
    border: 1px solid transparent;
    border-bottom: 3px solid transparent;
    border-radius: var(--radius);
    color: var(--farbe-text-leise);
}

.ablauf li::before {
    content: counter(schritt);
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border: 1px solid transparent;
    border-radius: var(--radius);
    background: var(--farbe-linie-stark);
    color: #fff;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

/*
 * Erledigte Stationen behalten allein ihr gefuelltes graues Quadrat. Keine Flaeche, kein
 * Rahmen: Der Weg dahin ist gegangen, er ist nicht mehr das Ziel, und er soll neben dem
 * aktuellen Schritt nicht um Aufmerksamkeit bitten.
 *
 * Die Auswahl trifft aria-current selbst - kein zweites Merkmal im Markup, das irgendwann
 * anders sagt als die Vorlesehilfe.
 */

/* Was noch kommt: Quadrat nur als Umriss. Ein leeres Feld ist ein Feld, das noch zu
   fuellen ist - das sagt mehr als jede Farbe. */
.ablauf li[aria-current="step"] ~ li::before {
    background: transparent;
    border-color: var(--farbe-linie-stark);
    color: var(--farbe-text-leise);
}

/* ⭐ DER AKTIVE SCHRITT, und nur er, traegt etwas Sichtbares: rotes Quadrat, cremefarbene
   Flaeche, roter Balken unten, dunkler Text. Vier Merkmale, von denen jedes einzelne allein
   schon ausreicht - wer Farben nicht unterscheidet, sieht die Flaeche; wer Flaechen nicht
   unterscheidet, liest die Schrift.

   ⚠️ KEIN RAHMEN, AUCH HIER NICHT. Er stand hier bis zum 06.09.2026 und war einer der
   Striche, die Tanja beanstandet hat. Eine Flaeche grenzt genauso ab und zieht keine Linie;
   der Balken unten bleibt als einziger Strich, weil er die Aussage traegt.

   Creme und nicht Weiss: Der Seitengrund ist weiss, eine weisse Flaeche waere unsichtbar. */
/* ⭐ OHNE FLAECHE, seit dem 13.09.2026. Tanja mit Bildschirmfoto der Kasse: "Das hier sieht
   optisch immer noch scheiße aus. Mach die drei Tabs oben wieder ohne Hintergrund und
   Unterstrich wenn active." Die Cremeflaeche vom 26.08. ist damit weg; was den aktiven
   Schritt kenntlich macht, sind der rote Balken unten, das rote Quadrat und der dunkle
   Text. Der durchsichtige Rahmen bleibt, damit die Zeile beim Schrittwechsel nicht
   springt - er zeichnet keinen Strich. */
.ablauf li[aria-current="step"] {
    border-bottom-color: var(--marke-rot);
    color: var(--farbe-text);
}

.ablauf li[aria-current="step"]::before {
    background: var(--marke-rot);
    color: #fff;
}

/* Auf breiteren Schirmen mehr Luft. Am Telefon wuerden drei Stationen mit diesem
   Innenabstand umbrechen, was zwar geht, aber die Kasse unnoetig auseinanderzieht. */
@media (min-width: 48rem) {
    .ablauf { gap: var(--abstand-3); }
    .ablauf li { padding: var(--abstand-3) var(--abstand-4); }
    .ablauf li::before { width: 2.25rem; height: 2.25rem; }
}

/* ⭐ BEZAHLMOEGLICHKEITEN AUF DER PRUEFSEITE, seit dem 13.09.2026. Tanja: "Hier bleiben wir
   informativ: 'Bezahlmöglichkeiten'. Dann die Logos einblenden, mit den Zahlmethoden, die
   zur Verfügung stehen." Eine Reihe kleiner Karten mit den Marken aus dem Fuss, kein
   Bedienelement, kein Radio (die standen hier vom 06.09. bis zum 13.09.).

   Die Marken bringen ihre weisse Karte mit eigenem Innenabstand selbst mit (siehe
   .fuss__zahlart), hier bekommt jede Zahlart zusaetzlich den Rahmen der Flaechen, damit
   die Reihe auf dem weissen Seitengrund nicht schwebt. Kreditkarte traegt zwei Marken in
   einer Karte, Ueberweisung nur ihren Namen - deshalb mindestens Bedienhoehe, damit beide
   Sorten gleich hoch stehen. */
.zahlarten {
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    gap: var(--abstand-2);
    margin: 0 0 var(--abstand-3);
    padding: 0;
    list-style: none;
}

.zahlarten__punkt {
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
    min-height: var(--bedienhoehe);
    padding: var(--abstand-1) var(--abstand-2);
    border: var(--linie);
    border-radius: var(--radius);
    background: #fff;
}

.zahlarten__marke {
    height: 2rem;
    width: auto;
}

.zahlarten__name {
    padding: 0 var(--abstand-1);
    font-weight: 600;
}

/* Der Rueckfall fuer Browser ohne :has ist am 06.09.2026 gegenstandslos geworden: Seit
   erledigte Stationen keine eigene Flaeche mehr tragen, kommt die Regel ohne :has aus.
   Getroffen wird nur noch ueber [aria-current] und den Geschwisterselektor, und beides
   kennt jeder Browser seit Jahren.

   Erledigte Stationen unterscheiden sich von den kommenden nur noch am Quadrat: gefuellt
   grau gegen leeren Umriss. Das reicht, weil daneben ohnehin steht, wo man ist. */

/* Fehlerseiten. Sie setzen weder Katalog noch Warenkorb voraus - was nicht
   vorausgesetzt wird, kann auch nicht ein zweites Mal danebengehen. */
.fehlerseite {
    max-width: var(--breite-text);
    margin: 0 auto;
    padding: var(--abstand-6) var(--abstand-3);
    text-align: center;
}

.fehlerseite__signet {
    width: 8rem;
    height: 8rem;
    margin-bottom: var(--abstand-4);
}

.fehlerseite__code {
    font-family: var(--schrift-fest);
    font-size: var(--schrift-klein);
    letter-spacing: 0.2em;
    color: var(--farbe-text-leise);
}

.fehlerseite p { max-width: none; }

.fehlerseite h1::before { margin-inline: auto; }

/* == 10.8  Gemerkte Kabel ==================================================== */

/*
 * ⭐ KOMPAKT SEIT DEM 19.08.2026. Tanja: "Da muss ein gemerktes Kabel deutlich kompakter
 * sein. Das Bild kann komplett raus. … Preis rechtsbündig. … Länge und Farbe in eine
 * Zeile, Ende 1 und Ende 2 und Drehung in eine Zeile."
 *
 * Vorher: eine Zeichnung, sechs Tabellenzeilen und zwei Knöpfe mit Text je Eintrag. Bei
 * acht gemerkten Kabeln war das eine Bildschirmhöhe pro Kabel.
 */
.merk__kopf {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--abstand-2) var(--abstand-3);
    margin-bottom: var(--abstand-2);
}

/* Kleiner als ein gewoehnliches h3 (1,25rem): In einer Liste aus acht Eintraegen ist
   die Ueberschrift ein Bezeichner und keine Kapitelmarke. */
.merk__titel { margin: 0; font-size: 1.0625rem; }

/* Der Querschnitt gehört zum Namen und ist doch nicht der Name. Leiser und kleiner,
   aber in derselben Zeile — zwei Zeilen wären für eine Angabe wie "25 mm²" zu viel. */
.merk__norm {
    margin-left: var(--abstand-2);
    color: var(--farbe-text-leise);
    font-size: var(--schrift-klein);
    font-weight: 400;
}

/* Rechtsbündig, wie Tanja es verlangt hat — und über margin-left: auto und nicht über
   text-align. Der Preis ist ein eigenes Element in einer Flex-Zeile; text-align richtete
   nur den Text INNERHALB seiner eigenen Breite aus, und die ist so breit wie der Betrag. */
.merk__preis {
    margin: 0 0 0 auto;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/*
 * Beschriftung und Wert, mehrere Paare je Zeile.
 *
 * ⚠️ DIE PAARE STEHEN IN <div>-HÜLLEN INNERHALB DES <dl>. Ohne sie wären dt und dd
 * eigenständige Rasterkinder, und beim Umbruch landete eine Beschriftung am Zeilenende
 * und ihr Wert in der nächsten Zeile. Ein <div> zwischen dl und dt/dd ist seit HTML 5.2
 * ausdrücklich erlaubt und genau dafür gedacht.
 */
.merkdaten {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-1) var(--abstand-4);
    margin: 0 0 var(--abstand-1);
    font-size: var(--schrift-klein);
}

.merkdaten > div { display: flex; gap: var(--abstand-1); }
.merkdaten dt { color: var(--farbe-text-leise); }
.merkdaten dt::after { content: ':'; }
.merkdaten dd { margin: 0; }

.merk__gemerkt {
    margin: var(--abstand-2) 0 0;
    color: var(--farbe-text-leise);
    font-size: var(--schrift-winzig);
}

.merk__notiz { margin: var(--abstand-2) 0 0; }

/* Mengenfeld und die beiden Symbolknöpfe in einer Reihe. */
.merk__zeile {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--abstand-2);
    margin-top: var(--abstand-3);
}

.merk__korb { display: flex; align-items: center; gap: var(--abstand-2); }

/* Das Notizfeld wächst, der Knopf nicht. Ohne min-width: 0 sprengt ein Eingabefeld in
   einer Flex-Zeile den Rahmen nach rechts, statt sich zu verkleinern — die Vorgabe für
   Flex-Kinder ist min-width: auto, und die ist bei einem input die Feldbreite. */
.merk__notizform {
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
    margin-top: var(--abstand-2);
}

.merk__notizform .eingabe { min-width: 0; flex: 1 1 12rem; }

/* Symbolknöpfe gibt es schon: .knopf--symbol und .knopf__symbol stehen oben bei den
   übrigen Knöpfen. Hier stand am 19.08.2026 kurzzeitig eine zweite Fassung — dieselben
   Namen, andere Strichstärke. Zwei Regeln gleichen Namens sind keine Gestaltung,
   sondern ein Zufall: Es gewinnt die weiter unten stehende, und welche das ist, merkt
   niemand. */

/* == 10.9  Kundenkonto ======================================================= */

/*
 * ⭐ DAS KONTO IST SEIT DEM 19.08.2026 EIN ONEPAGER MIT SPALTE LINKS.
 *
 * Tanja: "Die vier Links oben inklusive 'Ausloggen', das sollen doch bestimmt schöne Tabs
 * sein." Und dann: "Das Kundenkonto sollte ein Onepager sein. Die Tabs dann Ankerlinks,
 * zur Navigation. Verschiebe die Tabs nach links in die Sidebar."
 *
 * Bis dahin hatte diese Navigation KEINE einzige Zeile CSS - sie stand als
 * Aufzählungsliste mit Punkten da, so wie der Browser sie vorfindet.
 *
 * ⭐ DIE NAVIGATION KLEBT, seit dem 16.09.2026 - ab der Breite, in der sie eine eigene
 * Spalte hat. Tanja zu /konto#merkliste: "Links die Sidebar sollte mit nach unten
 * rutschen, immer im sichtbaren Bereich bleiben." Das verträgt sich mit "nichts überdeckt
 * etwas" (BAUVERTRAG 6): position: sticky ist dort ausdrücklich erlaubt, wenn das Element
 * eine eigene Spalte hat und beim Mitlaufen nichts verdeckt - genau wie die Seitenleiste
 * mit den Vertrauensaussagen. Hier stand bis dahin "KEIN position: sticky" mit dem
 * Argument, eine mitlaufende Spalte decke den Inhalt daneben ab; das gilt nur, wenn sie
 * keine eigene Spalte hat, und deshalb bleibt sie unter 52 rem (eine Spalte, Telefon) im
 * Fluss. align-items: start am Raster ist die Voraussetzung: Eine gestreckte Rasterzelle
 * hat nichts, wohin sie kleben könnte.
 */
.konto { display: grid; gap: var(--abstand-5); align-items: start; }

/* ⚠️ min-width: 0 IST HIER KEINE ZIERDE. Rasterkinder starten auf min-width: auto,
   und das ist bei einer Liste die Breite ihres längsten Eintrags. Die Spalte steht auf
   festen 14rem — ein längerer Menüpunkt (eine Übersetzung, ein neuer Abschnitt) liefe
   ohne diese Zeile aus der Spalte heraus, statt umzubrechen. */
.konto__spalte { min-width: 0; }

@media (min-width: 52rem) {
    /* Die Spalte ist so breit wie ihr längster Eintrag und nicht breiter. minmax(0, 1fr)
       für den Inhalt: ohne die 0 sprengt eine breite Tabelle das Raster nach rechts. */
    .konto { grid-template-columns: 14rem minmax(0, 1fr); gap: var(--abstand-6); }

    /* Klebt am oberen Rand, sobald die Seite unter ihr wegscrollt (Tanja, 16.09.2026).
       top laesst den Abstand des Inhaltsrands frei, damit sie nicht an der Kante haengt. */
    .konto__spalte { position: sticky; top: var(--abstand-4); }
}

.kontonav { list-style: none; margin: 0; padding: 0; }
.kontonav li { margin-bottom: var(--abstand-1); }

.kontonav__punkt {
    display: block;
    padding: var(--abstand-2) var(--abstand-3);
    border-left: 3px solid transparent;
    border-radius: var(--radius);
    color: inherit;
    text-decoration: none;
}

.kontonav__punkt:hover,
.kontonav__punkt:focus-visible {
    background: var(--farbe-flaeche);
    border-left-color: var(--farbe-akzent);
}

.kontonav__form { margin-top: var(--abstand-3); }

/*
 * DIE FARBLICHE MARKIERUNG DES ANGESTEUERTEN ABSCHNITTS - ohne eine Zeile JavaScript.
 *
 * :target trifft den Abschnitt, dessen id gerade in der Adresse steht. Eine mitlaufende
 * Markierung am Menüpunkt selbst ("welcher Abschnitt ist gerade sichtbar") gäbe es nur
 * mit einem Beobachter im Skript - und die Kontoseite lädt heute gar kein Skript.
 *
 * ⚠️ NICHT MIT background ARBEITEN, sondern mit einer Linie links. Ein farbig
 * hinterlegter Abschnitt bleibt hinterlegt, bis der Kunde etwas anderes anklickt, und
 * sieht dann aus wie ein Fehler.
 */
.konto__inhalt > section { scroll-margin-top: var(--abstand-4); }

.konto__inhalt > section:target > h2 {
    border-left: 4px solid var(--farbe-akzent);
    padding-left: var(--abstand-3);
    margin-left: calc(-1 * var(--abstand-3) - 4px);
}

/* Was unterwegs ist, steht oben und hebt sich ab. Kein Rot: Rot ist im Laden die
   Hauptaktion, und eine Sendungsnummer ist keine Aktion, sondern eine Auskunft. */
.flaeche--wichtig { border-left: 4px solid var(--farbe-akzent); }

/*
 * ⭐ DER WIDERRUF AUS DER BESTELLSEITE, seit dem 16.09.2026.
 *
 * Tanja: "Kunde kann ein Kabel (Checkbox, anhakbar) widerrufen, oder die gesamte
 * Bestellung." Jede Zeile ist ein <label> um ihr Kästchen, also mit der ganzen Fläche
 * anklickbar - am Telefon ist ein nacktes Kästchen von 13 Pixeln kein Bedienelement.
 * Kein JavaScript: "Die gesamte Bestellung" ist ein Kästchen wie die anderen, entschieden
 * wird im Controller (App\Widerruf\Kontowiderruf).
 *
 * Das fieldset wird zurückgesetzt wie .wahl (Abschnitt 7): Browser geben ihm Rahmen und
 * Innenabstand, die hier nichts zu suchen haben.
 */
.widerruf-wahl { border: 0; margin: 0 0 var(--abstand-3); padding: 0; min-width: 0; }

.widerruf-wahl__zeile {
    display: flex;
    align-items: flex-start;
    gap: var(--abstand-3);
    min-height: var(--bedienhoehe);
    padding: var(--abstand-2) var(--abstand-3);
    margin-bottom: var(--abstand-2);
    border: 1px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    cursor: pointer;
}

.widerruf-wahl__zeile:hover { background: var(--farbe-flaeche); }

.widerruf-wahl__zeile input {
    flex: none;
    width: 1.15rem;
    height: 1.15rem;
    margin: 0.2rem 0 0;
    accent-color: var(--marke-rot);
}

/* Angehakt sieht man auch ohne auf das Kästchen zu schauen - dieselbe Sprache wie
   .wahl__punkt--gewaehlt im Konfigurator, nur ohne Skript, über :has(). */
.widerruf-wahl__zeile:has(:checked) {
    border-color: var(--marke-rot);
    box-shadow: inset 0 0 0 1px var(--marke-rot);
    background: var(--farbe-akzent-blass);
}

/* Beschriftung und Wert, wie im Impressum. Bis zum 19.08.2026 stand diese Liste ohne
   eigene Regel da; im Konto steht sie neben Fließtext und braucht den Unterschied. */
.angaben { margin: 0 0 var(--abstand-4); }
.angaben dt { color: var(--farbe-text-leise); font-size: var(--schrift-klein); }
.angaben dd { margin: 0 0 var(--abstand-3); }
.angaben dd:last-child { margin-bottom: 0; }
/* == 11  Konfigurator =====================================================
   Stand bis zum 13.08.2026 als kritisches CSS im Kopf von
   templates/konfigurator/seite.html.twig - rund neunzig Zeilen dauerhafte
   Gestaltung in einem Block, der laut base.html.twig fuer "hoechstens 6 KB, nur
   wenn es sich lohnt" gedacht ist. Das war der zweite Stilort im Laden, und der
   BAUVERTRAG kennt nur einen. Deshalb steht es jetzt hier.

   Tanjas Vorgabe vom 13.08.2026: "Der Konfigurator selbst inklusive
   Preis-Warenkorb-Box muss optisch eine Einheit sein. Technische Daten
   darunter."

   Also ein Kasten: oben die Felder, unten der Abschluss mit Stueckzahl, Preis
   und Warenkorb. Die technischen Daten stehen danach als eigener Abschnitt und
   nicht mehr in einer zweiten Spalte daneben.

   WAS DAS JAVASCRIPT BRAUCHT und was deshalb nicht umbenannt werden darf:
   die Kennungen kfg, kfg-formular, kfg-preisdaten, kfg-texte, kfg-preis,
   kfg-zusatz, kfg-grundpreis, kfg-fehler, kfg-rechnen, kfg-warenkorb,
   kfg-kurzlink, kfg-laenge-hinweis, kfg-ausrichtung-feld, kfg-bild,
   kfg-teilen, kfg-teilen-ergebnis, kfg-kurzlink-kopieren, kfg-kopiert,
   kfg-ziel-whatsapp, kfg-ziel-mail, kfg-ziel-signal, kfg-ziel-telegram,
   kfg-merken, die Attribute data-feld, data-schritt, data-querschnitt,
   data-bild-url und die Klasse .kfg--verborgen.
   Alles andere ist reine Gestaltung.
   ========================================================================= */

/* Der Kasten. Eingabe und Abschluss sind EIN Element, nicht zwei nebeneinander. */
.kfg {
    border: var(--linie);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    margin-bottom: var(--abstand-5);
    overflow: hidden;
}

/*
 * DAS RASTER IM KASTEN, seit dem 14.08.2026. Tanja woertlich:
 * "Linke Spalte Farbe, Länge, Ende 1, Ende 2, Drehung. Zweite Spalte Bild
 * quadratisch, Stückzahl, Warenkorb."
 *
 * Auf schmalen Schirmen gibt es keine zweite Spalte. Dann gilt die Reihenfolge
 * im Quelltext, und die ist BILD - FELDER - LEISTE: Wer am Telefon kauft, will
 * sehen, was er zusammenstellt, ehe er das erste Auswahlfeld anfasst.
 *
 * Ab 60 rem ordnet grid-template-areas um. Umgeordnet wird nur die Anzeige -
 * Tabreihenfolge und Vorlesereihenfolge bleiben die des Quelltextes, und das
 * Bild ist darin kein Hindernis, weil es nicht bedienbar ist.
 */
.kfg__raster { display: grid; }

.kfg__felder { padding: var(--abstand-4); }

/*
 * Die fuenf Felder untereinander, in Tanjas Reihenfolge.
 *
 * Bis zum 14.08.2026 standen sie ab 40 rem in ZWEI Spalten (links Farbe und
 * Laenge, rechts die beiden Enden). Das war richtig, solange das Formular den
 * ganzen Kasten fuellte. Jetzt ist das Formular selbst die linke Spalte - zwei
 * Unterspalten darin waeren vier Spalten auf der Seite, und Tanjas Reihenfolge
 * waere keine Reihenfolge mehr, sondern ein Rechteck.
 */
.kfg__form {
    display: grid;
    gap: 0 var(--abstand-5);
    align-items: start;
}

/*
 * Das Produktbild. Quadratisch, weil das SVG 600 x 600 ist - aspect-ratio haelt
 * die Flaeche schon frei, ehe etwas darin steht, damit beim Nachziehen der
 * Zeichnung nichts springt.
 *
 * background: transparent hebt den Wert aus .bild auf: das SVG bringt seine
 * eigene Grundflaeche mit (data-teil="grund"), zwei uebereinander gaeben an den
 * abgerundeten Ecken einen Rand.
 */
.kfg__bild { padding: var(--abstand-4); }

/* Der Platz der Zeichnung, solange noch keine da ist. Seit dem 19.08.2026 startet der
   Konfigurator ohne gewaehlte Enden - vorher stand hier eine grosse weisse Flaeche, die
   aussah, als waere etwas kaputt. Die Mindesthoehe haelt das Raster ruhig: Ohne sie
   springt die ganze rechte Spalte, sobald die erste Zeichnung erscheint. */
.kfg__bild-leer {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 12rem;
    margin: 0;
    padding: var(--abstand-4);
    border: 1px dashed var(--farbe-linie);
    border-radius: var(--radius);
    color: var(--farbe-text-leise);
    text-align: center;
}

.kfg__bild svg {
    display: block;
    width: 100%;
    max-width: 30rem;
    height: auto;
    aspect-ratio: 1 / 1;
    margin-inline: auto;
    background: transparent;
}

/* ⭐ DIE FLACHE ZEICHNUNG, seit dem 14.09.2026: Meterware ohne Enden, also die
   Fahrzeugleitung. Tanja: "Für die Fahrzeugleitung braucht es kein quadratisches Bild.
   Es gibt hier keine Enden 1 und 2. [...] Reduziere das Bild in der Höhe, damit Preis und
   Warenkorb Button nach oben rutschen." App\Konfig\Kabelbild liefert dann 600 x 240, und
   das Quadrat von oben darf es nicht wieder aufziehen: aspect-ratio auto nimmt das
   Verhältnis aus width und height des SVG. Die Klasse bild--flach setzt Kabelbild selbst
   an das SVG, sobald beide Enden "ohne" sind - so bleibt sie auch richtig, wenn
   konfigurator.js die Zeichnung nachlädt und nur den Inhalt des Behälters tauscht. */
.kfg__bild svg.bild--flach { aspect-ratio: auto; }

/*
 * ⭐ DAS FOTOREALISTISCHE PRODUKTBILD, seit dem 19.08.2026.
 *
 * Tanja: "Das Jetzige ist eher unschön. Wir möchten beim Ergebnis näher ran an den
 * Kabelkonfigurator bei amumot-shop.de. Die Optik ist da schon sehr perfekt."
 *
 * Drei Bilder liegen übereinander: Kabelkörper, Kabelschuh Ende 1, Kabelschuh Ende 2 in
 * seiner Drehung. Alle drei sind 1000 x 1000 und auf derselben Leinwand gerendert — es
 * wird nichts positioniert und nichts ausgemessen. Erzeugt wird der Stapel von
 * App\Konfig\KabelbildTwig, ausgewählt von App\Konfig\Kabelfoto.
 *
 * ⚠️ DER BEHÄLTER BRAUCHT aspect-ratio, WEIL DIE EBENEN AUS DEM FLUSS SIND.
 * Absolut positionierte Kinder tragen nichts zur Höhe bei — ohne diese Zeile wäre der
 * Behälter null hoch und das Bild unsichtbar. Das Seitenverhältnis ist dasselbe wie bei
 * der gezeichneten Fassung darüber (.kfg__bild svg), damit die Spalte beim Umschalten
 * zwischen Foto und Zeichnung nicht springt.
 *
 * ⚠️ KEIN loading="lazy" AN DEN EBENEN. Dieses Bild IST der Inhalt der Seite; verzögert
 * geladen wäre es eine leere Fläche an genau der Stelle, auf die der Kunde schaut. Steht
 * im Erzeuger, hier zur Erinnerung.
 */
.kfg__foto {
    position: relative;
    width: 100%;
    max-width: 30rem;
    /* ⭐ BESCHNITTEN, seit dem 14.09.2026. Tanja mit gelb markiertem Bildschirmfoto des
       Solarkabel-Konfigurators: "Was ich hier gelb angemarkert habe, ist Platzverschwendung.
       Mach die Abstände raus, damit Preis und Warenkorb nach oben rutschen."

       Die Ebenen sind 1000 x 1000, das Kabel liegt schräg in der Mitte, oben und unten
       ist Leinwand. Am 14.09.2026 über alle 78 Dateien gemessen: Inhalt beim Batteriekabel
       von y = 262 bis 811, beim Solarkabel von 253 bis 748. Gezeigt wird der Streifen von
       200 bis 880, also 680 von 1000 - das Verhältnis 1000/680 unten und der Versatz
       translateY(-20 %) an den Ebenen gehören ZUSAMMEN. Die Beschriftung (kfg__foto-masse)
       bekommt denselben Versatz, damit Maßlinie und Bohrung auf dem Foto bleiben.

       ⚠️ Beim Umschalten auf die gezeichnete Fassung (Rückfall ohne Foto) springt die
       Spalte jetzt, weil die Zeichnung quadratisch bleibt. Das ist der Ausnahmefall ohne
       Bildsatz, nicht der Laden. */
    aspect-ratio: 1000 / 680;
    overflow: hidden;
    margin-inline: auto;
}

/*
 * ⭐ DIE BESCHRIFTUNG UEBER DEM FOTO: Laenge, Drehung, Bohrung. Seit dem 19.08.2026.
 *
 * Tanja: "Zeige im Schaubild die Kabellänge (Mitte Kabelschuh bis Mitte Kabelschuh) an.
 * … Auch die Drehung und die Bohrung (M6, M8 usw) sollen wieder angezeigt werden."
 *
 * Das SVG liegt als oberste Ebene im selben Behaelter und hat dieselbe Leinwand wie die
 * Fotos (1000 x 1000). Deshalb sitzt jede Beschriftung an derselben Stelle wie im Bild,
 * in jeder Groesse — es wird nichts nachgerechnet.
 *
 * ⚠️ pointer-events: none. Die Beschriftung liegt ueber dem ganzen Bild; ohne diese
 * Zeile fienge sie jeden Klick ab, der eigentlich dem Bild gilt.
 */
.kfg__foto-masse {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: auto;
    /* Quadratisch wie die Ebenen darunter, derselbe Versatz - siehe .kfg__foto. */
    aspect-ratio: 1 / 1;
    transform: translateY(-20%);
    pointer-events: none;
}

/* Die Linien: duenn, in der leisen Textfarbe. Kein Rot — Rot ist im Laden die
   Hauptaktion und gehoert dem Kaufknopf, nicht einer Massangabe. */
.kfg__masse-strich { fill: none; stroke: var(--farbe-text-leise); stroke-width: 3; }
.kfg__masse-spitze { fill: var(--farbe-text-leise); stroke: none; }

.kfg__masse-zahl {
    fill: var(--farbe-text);
    font-size: 44px;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

/* Die Messregel steht kleiner unter der Zahl. Sie ist die Angabe, an der haengt, ob das
   gelieferte Kabel passt — siehe daten/ratgeber/de/fragen-zum-konfigurator.html. */
.kfg__masse-regel { fill: var(--farbe-text-leise); font-size: 26px; }

/* ---------------------------------------------------------------------------------
   DIE BESCHRIFTUNG AUF DEM FOTO — KEIN KASTEN, SONDERN EIN SAUM

   ⭐ Tanja am 20.08.2026: „Die Bezeichnung der Kabelschuhe, hier M6 und M10, sollen
   keine Umrandung und keinen Strich haben."

   🔴 EINFACH NUR DEN KASTEN ZU LOESCHEN WAERE FALSCH GEWESEN, und das ist gemessen:
   Ueber alle 2424 Schildlagen von FLY-10 (jede Bauform, jede Drehung, beide Farben)
   liegt der schlechteste Kontrast der Schrift gegen das Foto bei 1,1:1 — beim
   90-Grad-Kabelschuh auf 270 Grad landet das Schild auf dem Kabel selbst. Dort waere
   die Angabe unsichtbar gewesen, und zwar genau bei der Zusammenstellung, bei der
   niemand hinsieht.

   Der Saum loest das ohne Kasten: Jeder Buchstabe traegt seinen eigenen hellen Rand,
   die Schrift steht damit immer auf hell, egal was darunter liegt. paint-order sorgt
   dafuer, dass der Rand UNTER die Fuellung kommt — ohne die Zeile male der Rand ueber
   die Buchstaben und machte sie fett und teigig.

   ⚠️ WER DEN SAUM ENTFERNT, MISST VORHER NACH. Das Werkzeug dafuer liegt in
   gestaltung/werkzeuge/, die Zahl oben ist damit entstanden.
   --------------------------------------------------------------------------------- */
.kfg__masse-zahl,
.kfg__masse-regel,
.kfg__masse-schildtext,
.kfg__masse-schildzeile {
    stroke: var(--farbe-grund);
    stroke-width: 6px;
    stroke-linejoin: round;
    paint-order: stroke fill;
}

.kfg__masse-schildtext { fill: var(--farbe-text); font-size: 34px; font-weight: 700; }
.kfg__masse-schildzeile { fill: var(--farbe-text-leise); font-size: 30px; }

.kfg__foto-ebene {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: auto;
    /* Die Ebene ist 1000 x 1000, der Behälter seit dem 14.09.2026 nicht mehr: Sie bleibt
       quadratisch in Breite des Behälters und wird um ein Fünftel nach oben gerückt, der
       Behälter schneidet oben und unten ab - siehe .kfg__foto. */
    aspect-ratio: 1 / 1;
    transform: translateY(-20%);
    object-fit: contain;
}

.kfg__zeile { display: flex; gap: var(--abstand-2); align-items: flex-start; }
.kfg__zeile .kfg__laenge { flex: 1 1 auto; }
.kfg__schritt { flex: 0 0 auto; min-width: var(--bedienhoehe); padding: 0 var(--abstand-3); }

.kfg__satz { border: 0; margin: 0 0 var(--abstand-3); padding: 0; min-width: 0; }

/* Wird von konfigurator.js an- und abgeschaltet. Nicht umbenennen. */
.kfg--verborgen { display: none; }

/* ---------------------------------------------------------------------------------
   ⭐ DER ANSCHLUSSKABEL-KONFIGURATOR STEHT ZWEISPALTIG, seit dem 27.08.2026.

   Tanja mit einem Bildschirmfoto, auf dem vier Stellen rot durchgestrichen sind: „Dann
   müssen wir den Konfigurator deutlich kompakter gestalten. Raus kommt, was rot
   durchgestrichen ist. Beschreibungstexte also raus, als Tooltip oben rein. Die
   Eingabefelder für Sicherungshalter, L1, L2, Farbe etc. sind sehr breit. Da kommen immer
   nur kurze Werte rein, meist nur 3 Stellen. Mach das kompakter, z. B. Zweispaltig (links
   Text, rechts Feld)."

   🔴 DIESE REGELN HAENGEN AN .kfg__kompakt UND NICHT AN .feld.
   .feld steckt in vierzehn Vorlagen, darunter Kasse, Konto und Betriebsbereich - wer die
   Klasse selbst umbaut, baut die Kasse mit um. .kfg__kompakt wird ausschliesslich in
   templates/konfigurator/anschlusskabel.html.twig gesetzt, und zwar am <form>. Der
   Batteriekabel-Konfigurator bleibt unberuehrt, er benutzt weiter .kfg__form.

   ⚠️ DIE UMBRUCHGRENZE STEHT HIER UND NICHT IN ABSCHNITT 12, genau wie bei .feldpaar und
   aus demselben Grund: Sie gehoert zu genau diesen Regeln, und getrennt davon wird beim
   naechsten Umbau die eine Haelfte geaendert und die andere vergessen. Es ist auch
   dieselbe Grenze wie dort, 30 rem - unter 480 px steht ein Feldpaar im Laden nirgends
   nebeneinander.
   --------------------------------------------------------------------------------- */

/*
 * Die Auswahlreihe "eine oder zwei Leitungen".
 *
 * Aufbau wie .kfg__bauart im Batteriekabel: echte Auswahlknoepfe, keine Karten. Tanja am
 * 19.08.2026 ueber die Karten: „Das sieht so scheiße aus. Zwei Radiobuttons."
 *
 * ⚠️ GETROFFEN WIRD DAS LABEL, NICHT DER PUNKT. Ein blanker Auswahlknopf misst 13 px und
 * liegt damit unter jeder Zielgroesse. Das <label> umschliesst Knopf UND Wort und ist
 * --bedienhoehe hoch, also 44 px - damit ist die Trefferflaeche gross genug fuer den
 * Finger, ohne dass die Zeile wieder zur Karte wird. Bis zum 27.08.2026 trugen diese
 * beiden Zeilen gar keine Klasse.
 */
.kfg__wahlreihe {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-1) var(--abstand-4);
}

.kfg__wahlreihe label {
    display: inline-flex;
    align-items: center;
    gap: var(--abstand-2);
    min-height: var(--bedienhoehe);
    cursor: pointer;
}

.kfg__wahlreihe input {
    flex: none;
    width: 1.15rem;
    height: 1.15rem;
    margin: 0;
    accent-color: var(--marke-rot);
}

/*
 * ⭐ EIN FELD IST SO BREIT, WIE SEIN LAENGSTER WERT ES BRAUCHT - nicht so breit wie die
 * Zeile. Zwei Deckel, weil es zwei Sorten Werte gibt, und beide sind am tatsaechlichen
 * Inhalt gemessen und nicht geschaetzt:
 *
 *   .kfg__kurzwahl   9 rem - Querschnitt ("1,5 mm²"), Sicherungshalter ("150 A"), Farbe
 *                    ("schwarz" / "black"). Hoechstens sieben Zeichen, rund 55 px.
 *   .kfg__langwahl  17 rem - die vier Endenfelder. Laengster Eintrag des ganzen Ladens:
 *                    "Flachsteckhülse 6,3" (deutsch) und "Blade receptacle 6.3"
 *                    (englisch), rund 146 px in der Systemschrift bei 16 px. Dazu 2 rem
 *                    Innenabstand aus .eingabe und rund 1,5 rem fuer das Pfeilfeld des
 *                    Browsers - macht 17 rem, in denen der Eintrag ganz dasteht.
 *
 * Die beiden Zahlenfelder L1 und L2 tragen das vorhandene .eingabe--kurz (7 rem, traegt
 * "12345"). Anschlusskabel::MAX_CM ist 1000, also hoechstens vier Stellen.
 *
 * 🔴 ALLE DREI DECKEL TRAGEN 0-1-0 UND STEHEN NIE AM SELBEN ELEMENT. Ein gemeinsamer
 * Deckel `.kfg__kompakt .eingabe` waere naheliegender und waere ein Fehler: Er traegt
 * 0-2-0 und schluege damit .eingabe--kurz (0-1-0) - die zwei Zahlenfelder waeren
 * lautlos 17 rem breit, obwohl im Quelltext 7 rem stehen. Dieselbe Falle wie .zahl gegen
 * .tabelle thead th. Deshalb bekommt jedes Feld seinen eigenen Deckel und keinen geerbten.
 *
 * Sie gelten in JEDER Breite, auch auf dem Telefon. Ein Auswahlfeld fuer "schwarz" muss
 * nirgends 350 px breit sein - genau das war Tanjas Beanstandung.
 */
.kfg__kurzwahl { max-width: 9rem; }
.kfg__langwahl { max-width: 17rem; }

/*
 * Das Fragezeichen auf Zielgroesse: 24 px statt der 18,4 px aus .hilfe__knopf.
 *
 * ⚠️ AUSSERHALB JEDER MEDIENABFRAGE, und das ist der Punkt: Die Zielgroesse zaehlt am
 * meisten dort, wo mit dem Finger getippt wird, also auf dem Telefon. Eine Regel dafuer in
 * einer min-width-Abfrage waere genau verkehrt herum.
 *
 * ⚠️ NUR IN DIESEM KONFIGURATOR, nicht an .hilfe__knopf selbst: Die Klasse gehoert auch
 * dem Batteriekabel, und dessen Gestaltung ist an diesem Tag nicht beauftragt. Wer sie
 * spaeter allgemein anhebt, loescht diese Regel wieder - zwei Groessen fuer dasselbe
 * Zeichen sind auf Dauer eine zu viel.
 */
.kfg__kompakt .hilfe__knopf { width: 1.5rem; height: 1.5rem; }

@media (min-width: 30rem) {
    /*
     * Links die Beschriftung, rechts das Feld.
     *
     * ⚠️ DIE SPALTENMASSE SIND AM ENGSTEN FALL GERECHNET, UND DER IST NICHT DAS TELEFON.
     * Ab 60 rem steht die Feldspalte des Konfigurators nur noch auf halber Seitenbreite:
     * bei 960 px Fensterbreite bleiben nach Rand, Rahmen und Innenabstand rund 374 px.
     * Davon nehmen 9 rem die Beschriftung und 1 rem der Abstand, es bleiben rund 214 px
     * fuers Feld - genug fuer die 146 px des laengsten Endeneintrags samt Innenabstand
     * und Pfeil. Breiter wird es ab 72 rem wieder, dort deckelt .kfg__langwahl.
     *
     * 9 rem fuer die Beschriftung ist ebenso gemessen: "L1 — vom ersten Ende bis zum
     * Halter (cm)" laeuft darin auf zwei Zeilen und bleibt damit so hoch wie das Feld
     * daneben. Bei 8 rem waeren es drei Zeilen - dann waere die zweispaltige Zeile hoeher
     * als die einspaltige, und der ganze Umbau haette nichts gebracht.
     */
    .kfg__kompakt .feld {
        display: grid;
        grid-template-columns: minmax(0, 9rem) minmax(0, 1fr);
        align-items: center;
        gap: var(--abstand-1) var(--abstand-3);
        /* 9 rem Beschriftung + 1 rem Abstand + 17 rem Feld. Ohne den Deckel driften
           Beschriftung und Feld auf breiten Schirmen quer ueber die Spalte auseinander. */
        max-width: 27rem;
        margin-bottom: var(--abstand-2);
    }

    /*
     * 🔴 OHNE DIESE ZEILE STEHT DAS FELD L2 IMMER DA.
     *
     * Die Regel darueber ist eine Anzeigeangabe des Autors, das display: none hinter
     * [hidden] nur eine des Browsers - und Autorenangaben schlagen die des Browsers.
     * Genau daran haengt <div class="feld" data-nur-mit-halter hidden> fuer L2, das
     * anschlusskabel.js umblendet. Bis zum 27.08.2026 trug .feld keine Anzeigeregel, und
     * hidden wirkte von selbst; ab jetzt muss es ausdruecklich dastehen.
     *
     * Dieselbe Falle und dieselbe Loesung wie bei .kopf__zaehler[hidden] und
     * .nur-vorlesen[hidden] in Abschnitt 4. Wer das display oben je aus der Medienabfrage
     * herausholt, nimmt diese Zeile mit.
     */
    .kfg__kompakt .feld[hidden] { display: none; }

    /*
     * Alles ausser der Beschriftung steht rechts, untereinander.
     *
     * ⚠️ OHNE DIE ERSTE ZEILE LIEFE DIE ZWEITE ZEILE EINES FELDES IN DIE LINKE SPALTE.
     * Die automatische Platzierung fuellt zeilenweise: Kind 1 links, Kind 2 rechts, Kind 3
     * wieder links. Ein Feld mit Beschriftung, Eingabe und einer dritten Zeile saehe damit
     * aus, als waere die dritte Zeile eine neue Beschriftung.
     */
    .kfg__kompakt .feld > * { grid-column: 2; }

    .kfg__kompakt .feld > .feld__beschriftung {
        grid-column: 1;
        grid-row: 1;
        /* Der Abstand nach unten galt der Zeile darunter. Nebeneinander gibt es sie nicht. */
        margin-bottom: 0;
    }

    /*
     * ⚠️ DIE HILFE-BLASE HAENGT AN DER BESCHRIFTUNG und waere ab hier nur 9 rem breit.
     * Ein Satz wie „Halten Sie L1 kurz, denn dieses Stück liegt vor der Sicherung und ist
     * ungeschützt." stuende darin auf neun Zeilen. Deshalb loest sie hier die rechte Kante
     * und nimmt sich die Breite, die sie braucht.
     *
     * 20 rem passen auch in die engste Feldspalte (374 px, siehe oben) vollstaendig
     * hinein - .kfg traegt overflow: hidden, eine breitere Blase waere seitlich
     * abgeschnitten. Wer den Wert erhoeht, rechnet das nach.
     */
    .kfg__kompakt .hilfe:hover .hilfe__text,
    .kfg__kompakt .hilfe:focus-within .hilfe__text {
        right: auto;
        width: max-content;
        max-width: 20rem;
    }
}

/* Die Querschnitte als Reihe. Sie stehen ueber dem Kasten, weil ein Wechsel
   eine andere Seite ist und nicht eine andere Einstellung. */
.kfg__querschnitte {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-2);
    list-style: none;
    margin: 0 0 var(--abstand-4);
    padding: 0;
}

.kfg__querschnitt {
    display: inline-flex;
    align-items: center;
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-3);
    border: 1px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    text-decoration: none;
    font-variant-numeric: tabular-nums;
}

.kfg__querschnitt--aktiv {
    border-color: var(--marke-rot);
    box-shadow: inset 0 0 0 1px var(--marke-rot);
    background: var(--farbe-akzent-blass);
    font-weight: 600;
}

/*
 * Meterware oder konfektioniertes Kabel — die erste Entscheidung.
 *
 * ⭐ Tanjas Vorgabe vom 18.08.2026: eine eigene Zeile direkt nach der
 * Querschnittsauswahl. Vorher entstand Meterware stillschweigend dadurch, dass man bei
 * BEIDEN Enden "ohne Kabelschuh" waehlte — das musste man wissen.
 *
 * ⭐ SEIT DEM 19.08.2026 ZWEI AUSWAHLKNOEPFE, KEINE ZWEI KARTEN MEHR. Tanja woertlich:
 * "Das sieht so scheiße aus. Zwei Radiobuttons, vorausgewählt ist erstes."
 *
 * Was an den Karten falsch war: Sie waren dreimal so hoch wie jede Zeile darunter und
 * drueckten Farbe und Laenge unter den Falz — fuer eine Frage, deren beide Antworten je
 * ein Wort lang sind. Und sie sahen aus wie Knoepfe, taten aber, was ein Auswahlknopf
 * tut. Die beiden Erklaerungen stehen seit dem 19.08.2026 abends in einer Hilfe-Blase
 * am Fragezeichen der Ueberschrift (konfigurator.bauart.hilfe, siehe .hilfe weiter oben).
 *
 * ⚠️ NICHTS NACHGEBAUT. Der Auswahlknopf ist ein echtes <input type="radio">, nur
 * groesser und in der Hausfarbe. Ein Nachbau aus <span> verliert Tastaturbedienung,
 * Vorlesesoftware und die Gruppenbildung ueber name= — und das alles fuer ein Aussehen,
 * das der Browser von selbst richtig hinbekommt.
 */
.kfg__bauart-feld { margin-bottom: var(--abstand-4); }

/* Nebeneinander, solange Platz ist, sonst untereinander. Kein Grid mit zwei gleich
   breiten Spalten mehr: Es gibt nichts mehr, dessen Hoehen auszugleichen waeren. */
.kfg__bauart {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-1) var(--abstand-4);
    margin-top: var(--abstand-2);
}

/* Das <label> umschliesst Knopf UND Wort, damit auch das Wort anwaehlt. --bedienhoehe
   haelt die Trefferflaeche fuer den Finger gross genug, ohne dass die Zeile wieder zur
   Karte wird. */
.kfg__bauart-wahl {
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
    min-height: var(--bedienhoehe);
    cursor: pointer;
}

.kfg__bauart-wahl input {
    flex: none;
    width: 1.15rem;
    height: 1.15rem;
    margin: 0;
    accent-color: var(--marke-rot);
}

.kfg__bauart-name { font-weight: 600; }

/* Gesetzt von konfigurator.js und serverseitig vorgerendert — der Punkt im Knopf allein
   traegt die Auswahl nicht. */
.kfg__bauart-wahl--aktiv .kfg__bauart-name { color: var(--marke-rot); }

/* Hier stand bis zum 19.08.2026 der Steuersatz: zwei Flaechen und ein aufklappbarer
   Kasten mit dem Pflichthaken, nach Tanjas Vorbild aus dem amumot-Shop. Der
   Nullsteuersatz ist auf ihre Anweisung wieder ausgebaut - die Solarkabel laufen mit dem
   Regelsatz wie alle anderen Kabel auch. */

/*
 * Der Abschluss des Kastens: Stueckzahl, Preis, Fehler, Knoepfe.
 *
 * Er KLEBT NICHT. Bis zum 12.08.2026 stand hier "position: sticky; bottom: 0",
 * und die Leiste schob sich ueber das Feld "Ende 2" - der Kunde konnte den
 * zweiten Kabelschuh nicht mehr sehen, waehrend er ihn waehlte. Tanjas Regel:
 * "Grundsaetzlich wollen wir keine Elemente haben, die irgendwas ueberdecken."
 *
 * Die Oberkante ist die Polleiste des Ladens: links rot, rechts schwarz, hier
 * als Kante zwischen Eingabe und Preis. position: relative gehoert dazu - ohne
 * es sucht sich das rote Stueck den naechsten positionierten Vorfahren und
 * landet irgendwo auf der Seite. Genau das war bis zum 13.08.2026 der Fall.
 */
.kfg__leiste {
    position: relative;
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-3);
    align-items: center;
    margin: 0;
    padding: var(--abstand-4);
    border-top: var(--polleiste-hoehe) solid var(--marke-schwarz);
    background: var(--farbe-flaeche);
}

.kfg__leiste::before {
    content: "";
    position: absolute;
    left: 0;
    right: 50%;
    top: calc(var(--polleiste-hoehe) * -1);
    height: var(--polleiste-hoehe);
    background: var(--marke-rot);
}

/* Die Stueckzahl steht bei der Summe, die sie vervielfacht. Feste Breite, damit
   sie den Preis nicht wegdrueckt. */
.kfg__leiste .kfg__menge { flex: 0 0 auto; width: 6rem; margin: 0; }

.kfg__preisblock { flex: 1 1 8rem; }
.kfg__preisblock p { margin: 0; }

/* Der Preis ist die wichtigste Zahl der Seite. Der Wert kommt aus dem
   Preisrechner, hier steht nur, wie gross er aussieht. */
.kfg__leiste .preis--gross { font-size: var(--schrift-h1); line-height: 1.1; }

/* Die Fehlermeldung ueber die volle Breite, sonst quetscht sie sich zwischen
   Preis und Knopf und wird zur Randnotiz. Leer nimmt sie keinen Platz. */
.kfg__leiste .feld__fehler { flex: 1 0 100%; margin: 0; }
.kfg__leiste .feld__fehler:empty { display: none; }
#kfg-fehler:empty { display: none; }

.kfg__knoepfe { flex: 1 0 100%; display: flex; flex-wrap: wrap; gap: var(--abstand-2); }
.kfg__leiste .knopf--breit { width: auto; }

/* "Zum Warenkorb" neben dem Warenkorbknopf ist seit dem 10.09.2026 ein Textlink und kein
   Knopf mehr. Tanja mit Bildschirmfoto: "Änderung Design: 'Zum Warenkorb' Button nicht als
   Button, sondern als Textlink." Farbe und Unterstrich kommen von der Regel für a in
   Abschnitt 1, hier steht nur, wie er neben dem Knopf sitzt: senkrecht auf dessen Mitte,
   mit etwas Luft, damit der Klickbereich nicht am Knopf klebt. Bewusst KEIN display, damit
   hidden bei leerem Korb ohne eigene Zeile wirkt - anders als bei .knopf, siehe
   .knopf[hidden] in Abschnitt 4. Gilt für beide Konfiguratoren. */
.kfg__korblink { align-self: center; padding: 0 var(--abstand-1); }

/* Ein Hinweis in der Leiste steht ueber die volle Breite, aus demselben Grund wie die
   Fehlerzeile darueber. Gebraucht seit dem 26.08.2026 (S44) vom Anschlusskabel-
   Konfigurator: dort steht unter dem gesperrten Warenkorbknopf der Satz, WARUM er gesperrt
   ist. Zwischen Preis und Knopf gequetscht waere er eine Randnotiz.

   Die Regel gilt fuer beide Konfiguratoren. .kfg__korb-meldung fuehrt dieselben zwei Werte
   schon selbst - kein Widerspruch, nur eine Wiederholung ohne Wirkung. */
.kfg__leiste .hinweis { flex: 1 0 100%; margin: 0; }

/* Die Bestätigung nach dem Zurücklegen: "Ihr Kabel liegt im Warenkorb". Sie steht
   unter dem Knopf, über die volle Breite, und sie ist ein gewöhnlicher .hinweis - das
   Aussehen kommt von dort, hier steht nur, wo er sitzt.

   Leer nimmt sie keinen Platz, genau wie die Fehlerzeile zwei Regeln weiter unten und
   wie die Meldung der Sehhilfe. Ein leerer .hinweis wäre sonst ein leerer Kasten mit
   Rahmen, der auf jeder frisch geladenen Seite steht.

   Gefüllt wird sie von konfigurator.js aus dem data-text der Vorlage. Ohne JavaScript
   bleibt sie leer und damit unsichtbar - dort führt der Weg auf die Warenkorbseite,
   und die sagt es selbst. */
.kfg__korb-meldung { flex: 1 0 100%; margin: 0; }
.kfg__korb-meldung:empty { display: none; }

/* ------------------------------------------------------------------------
   Teilen und Merken. Zwei Symbole unter dem Warenkorbknopf.

   Tanja am 13.08.2026: "Das 'Konfiguration teilen' nur mit einem Icon
   darstellen. Daneben ein Icon 'Konfiguration merken'. Als Sternchen-Icon.
   Teilen lila bei Mouseover, Merken gelb bei Mouseover."

   🔴 NICHTS UEBERDECKT HIER ETWAS. Die vier Teilen-Ziele stehen in einem
   <details> und schieben den Inhalt auseinander - kein Einblendfenster, kein
   position: fixed, kein z-index. Die Seite waechst nach unten. Das ist Tanjas
   Dauer-Anweisung und nicht verhandelbar.

   Beide Bedienelemente sind 44 px gross, wie jeder andere Knopf im Laden. Ein
   Symbol wird nicht kleiner angefasst als ein Wort.
   ------------------------------------------------------------------------ */

.kfg__symbole {
    flex: 1 0 100%;
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: var(--abstand-2);
    margin-top: var(--abstand-1);
}

/* Zu ist sie so breit wie ihr Symbol, offen nimmt sie sich Platz und schiebt den
   Stern zur Seite oder in die naechste Zeile. Genau das soll aufklappen tun. */
.teilen { flex: 0 1 auto; min-width: 0; }
.teilen[open] { flex: 1 1 16rem; }

.teilen__knopf {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--bedienhoehe);
    height: var(--bedienhoehe);
    border: 1px solid var(--farbe-linie);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    color: var(--farbe-text-leise);
    cursor: pointer;
    /* Das Dreieck des Aufklappers muss weg - hier ist das Symbol die Anzeige.
       Zwei Schreibweisen, weil aeltere WebKit-Fassungen ::marker nicht kennen. */
    list-style: none;
}

.teilen__knopf::-webkit-details-marker { display: none; }
.teilen__knopf::marker { content: ""; }

.teilen__knopf:hover,
.teilen__knopf:focus-visible {
    color: var(--farbe-teilen);
    border-color: var(--farbe-teilen);
}

.teilen__symbol {
    width: 1.25rem;
    height: 1.25rem;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.teilen__auf {
    padding: var(--abstand-3) 0 0;
    display: grid;
    gap: var(--abstand-2);
    justify-items: start;
}

.teilen__satz { margin: 0; }
.teilen__meldung { margin: 0; }
.teilen__meldung:empty { display: none; }

.teilen__ergebnis { display: grid; gap: var(--abstand-2); width: 100%; }

.teilen__adresse { display: flex; gap: var(--abstand-2); align-items: center; }
.teilen__feld { flex: 1 1 8rem; min-width: 0; font-size: var(--schrift-klein); }

.teilen__ziele {
    display: flex;
    flex-wrap: wrap;
    gap: var(--abstand-2);
    list-style: none;
    margin: 0;
    padding: 0;
}

/* Ein Verweis und ein Knopf nebeneinander - beide muessen gleich aussehen, sonst
   sieht Signal aus wie ein Fremdkoerper. Deshalb steht hier alles ausgeschrieben,
   was ein Knopf sonst vom Browser mitbekaeme. */
.teilen__ziel {
    display: inline-flex;
    align-items: center;
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-3);
    border: 1px solid var(--farbe-linie);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    color: var(--farbe-text);
    font: inherit;
    font-size: var(--schrift-klein);
    text-decoration: none;
    cursor: pointer;
}

.teilen__ziel:hover,
.teilen__ziel:focus-visible {
    color: var(--farbe-teilen);
    border-color: var(--farbe-teilen);
}

/* Der Stern. Gelb wird beim Zeigen die FLAECHE, der Umriss bleibt dunkelgold -
   ein rein gelber Stern auf weissem Grund waere nicht zu sehen. */
.merken {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--bedienhoehe);
    height: var(--bedienhoehe);
    padding: 0;
    border: 1px solid var(--farbe-linie);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    color: var(--farbe-text-leise);
    cursor: pointer;
}

.merken__symbol {
    width: 1.4rem;
    height: 1.4rem;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.6;
    stroke-linejoin: round;
}

.merken:hover,
.merken:focus-visible { color: var(--farbe-merken); border-color: var(--farbe-merken); }

.merken:hover .merken__symbol,
.merken:focus-visible .merken__symbol { fill: var(--farbe-merken-flaeche); }

/* Der Stern im Seitenkopf, NUR fuer Angemeldete - er fuehrt in die eigene
   Merkliste. Er liegt in .kopf__werkzeuge und erbt von .kopf__verweis, hier
   steht nur die gelbe Flaeche beim Zeigen. */
.kopf__verweis--merken:hover .kopf__symbol,
.kopf__verweis--merken:focus-visible .kopf__symbol { fill: var(--farbe-merken-flaeche); }

/* -- Drehrichtung. Die Zeichnungen erben ihre Farbe ueber currentColor vom
      Text, deshalb steht hier keine einzige Farbe. Keine feste Pixelbreite. -- */
.drehung { margin-top: var(--abstand-2); }
.drehung__auf { margin-top: var(--abstand-2); }

/* Der Aufklapper ist seit dem 13.08.2026 ZU, wenn die Seite laedt. Aufgeklappt
   schob er zwei Zeichnungen zwischen das Feld und den Preis, und wer nur die
   Laenge aendern wollte, scrollte daran vorbei. Der Regelsatz darueber bleibt
   sichtbar - er traegt die Aussage, die Zeichnung erlaeutert sie nur. */
.drehung__titel {
    display: flex;
    align-items: center;
    min-height: var(--bedienhoehe);
    cursor: pointer;
    font-size: var(--schrift-klein);
    font-weight: 600;
    padding: var(--abstand-1) 0;
}

.drehung__blick { margin: var(--abstand-2) 0 var(--abstand-3); }
.drehung__blickbild { display: block; width: 100%; max-width: 17rem; height: auto; }
.drehung__blicktext { margin: var(--abstand-1) 0 0; }
.drehung__liste { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--abstand-2); }

.drehung__fall {
    display: grid;
    grid-template-columns: 4.25rem minmax(0, 1fr);
    grid-template-areas: 'bild wert' 'bild text';
    align-content: center;
    gap: 0 var(--abstand-2);
}

.drehung__bild { grid-area: bild; align-self: center; width: 100%; height: auto; }
.drehung__wert { grid-area: wert; align-self: end; margin: 0; font-weight: 600; font-variant-numeric: tabular-nums; }
.drehung__text { grid-area: text; align-self: start; margin: 0; }
.drehung__schluss { margin: var(--abstand-3) 0 0; }

/* == 12  Breite Ansichten ================================================= */

@media (min-width: 40rem) {
    :root {
        --schrift-h1: 2.5rem;
        --schrift-h2: 1.875rem;
    }

    .inhalt { padding-inline: var(--abstand-4); }
    .kopf__innen { padding-inline: var(--abstand-4); }
    .rahmen--leiste { padding-inline: var(--abstand-4); }
    .fuss__innen {
        padding-inline: var(--abstand-4);
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .knopf--breit { width: auto; }

    .zone__innen { padding-inline: var(--abstand-4); }
    .schaufenster__innen { padding-inline: var(--abstand-4); }
    .schritte { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .wissensboxen { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .zahlen { grid-template-columns: repeat(4, minmax(0, 1fr)); }

    /* HIER STAND BIS ZUM 14.08.2026 .kfg__form { grid-template-columns: repeat(2, …) }.
       Das Formular ist seither selbst die linke Spalte des Konfigurators, siehe
       Abschnitt 11 - zwei Unterspalten darin waeren vier Spalten auf der Seite. */
    .kfg__felder { padding: var(--abstand-5); }
    .kfg__bild { padding: var(--abstand-5); }
}

@media (min-width: 60rem) {
    .menue { width: auto; order: 0; }

    /*
     * ZWEI SPALTEN IM KONFIGURATOR. Tanjas Vorgabe vom 14.08.2026:
     * "Linke Spalte Farbe, Länge, Ende 1, Ende 2, Drehung. Zweite Spalte Bild
     * quadratisch, Stückzahl, Warenkorb."
     *
     * Die Felder stehen ueber BEIDE Zeilen - sie sind laenger als Bild und
     * Preisleiste zusammen, und ohne das Ueberspannen bliebe rechts unten ein
     * Loch.
     *
     * align-items: start, damit sich keine Spalte auf die Hoehe der anderen
     * zieht. Die Trennlinie sitzt an der Feldspalte und nicht als gap, weil ein
     * gap zwischen Bild und Leiste die Polleiste der Leiste abschneiden wuerde.
     */
    .kfg__raster {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        grid-template-areas:
            "felder bild"
            "felder leiste";
        align-items: start;
    }

    .kfg__bild   { grid-area: bild; }
    .kfg__felder { grid-area: felder; border-right: var(--linie); }
    .kfg__leiste { grid-area: leiste; }
    /* ⭐ VIER SPALTEN, seit dem 19.08.2026. Tanja: "Den Hauptfooter-Teil darüber machen
       wir 4-spaltig."

       Der Betrieb steht breiter, die drei Listen daneben gleich schmal. Ohne Marken der
       Zahlungsanbieter fällt deren Spalte weg und es bleiben drei — die Vorlage lässt sie
       dann gar nicht erst entstehen, siehe fuss__innen--zahlarten. */
    .fuss__innen { grid-template-columns: 2fr 1fr 1fr; }
    .fuss__innen--zahlarten { grid-template-columns: 2fr 1fr 1fr 1fr; }
}

@media (min-width: 64rem) {
    .rahmen--leiste {
        display: grid;
        grid-template-columns: minmax(0, 1fr) var(--breite-leiste);
        gap: var(--abstand-5);
        align-items: start;
    }

    /* Klebend. Kostet nichts an Ladezeit und hält die Zusagen im Blick, während
       der Kunde die Datenblätter durchgeht. */
    .seitenleiste {
        position: sticky;
        top: var(--abstand-3);
        margin-top: var(--abstand-4);
    }

    .paar { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--abstand-6); }
    .paar--bild-links .paar__text { order: 2; }

    .reihe { grid-template-columns: minmax(0, 26rem) minmax(0, 1fr); }
    .reihe__innen { padding: var(--abstand-5); }

    .wissensboxen { grid-template-columns: repeat(3, minmax(0, 1fr)); }

    /*
     * Ab hier traegt der Text IM Bild. Die Breite ist so gewaehlt, dass er den
     * gemessenen dunklen Bereich nicht verlaesst: hoechstens 42 % der Breite,
     * beginnend am linken Rand des Inhaltsrahmens.
     *
     * Bild und Text liegen im SELBEN Rasterfeld. Das Bild ist Grund, der Text
     * steht darauf - beide beanspruchen dieselbe Flaeche, keiner verdeckt den
     * anderen, und der Aufmacher behaelt die Hoehe des Bildes.
     */
    .schaufenster {
        display: grid;
        grid-template-areas: 'aufmacher';
        align-items: center;
    }

    /* height: 100 % ist hier kein Beiwerk. Wird der Text hoeher als das Bild -
       auf 1024 px ist das der Fall -, spannt er die Rasterzeile auf, und das
       Bild soll sie ausfuellen statt oben zu kleben. object-fit: cover
       beschneidet dabei, es verzerrt nicht. */
    .schaufenster__bild {
        grid-area: aufmacher;
        aspect-ratio: 21 / 9;
        height: 100%;
        max-height: 40rem;
    }

    .schaufenster__innen {
        grid-area: aufmacher;
        width: 100%;
        padding-block: var(--abstand-5);
    }

    .schaufenster h1,
    .schaufenster__lead,
    .schaufenster__knoepfe { max-width: 42%; }
}

/* == 13  Sehhilfe =========================================================
   Die Ansichtseinstellungen aus dem Seitenkopf, Vorlage teile/_kopf.html.twig,
   Bedienung public/js/sehhilfe.js.

   🔴 KEIN SCHWEBENDES KNOEPFCHEN. Kein position: fixed, kein z-index, keine
   Einblendung. Das Feld klappt im Fluss auf und schiebt die Seite nach unten -
   BAUVERTRAG Abschnitt 6.

   Die Kontrastfassung ist deshalb eine Handvoll Zeilen und kein zweites
   Stilblatt: der Laden benutzt ueberall Rollenvariablen und nie eine feste
   Farbe. Hier werden nur die Variablen umgestellt, der Rest folgt von selbst.
   Nachgerechnet - nicht behauptet - von
   gestaltung/werkzeuge/sehhilfe-pruefen.php, Schwelle 7:1 (WCAG AAA).
   ------------------------------------------------------------------------- */

/* -- Das Aufklappfeld im Kopf ------------------------------------------- */

/* Zugeklappt so breit wie das Symbol, damit es neben dem Warenkorb steht.
   Aufgeklappt nimmt es eine ganze Zeile des Kopfes - nur so hat das Feld
   Breite. .kopf__innen bricht bereits um, hier kommt nichts hinzu. */
.sehhilfe { flex: 0 0 auto; min-width: 0; }
.sehhilfe[open] { flex: 1 0 100%; }

/* Aufgeklappt rutscht das Feld eine Zeile nach unten. Damit dabei wenigstens
   nicht auch noch das Symbol quer ueber den Kopf springt, bleibt es rechts
   stehen, wo es zugeklappt schon stand - unter dem Warenkorb. */
.sehhilfe[open] > .sehhilfe__knopf {
    display: flex;
    width: fit-content;
    margin-left: auto;
}

/* Nur noch das Auge, kein Wort "Ansicht" daneben - siehe .kopf__verweis. Die
   Maße sind dieselben, damit die vier Symbole eine Reihe ergeben und nicht drei
   plus eins. */
.sehhilfe__knopf {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: var(--bedienhoehe);
    min-width: var(--bedienhoehe);
    padding: 0 var(--abstand-1);
    color: var(--farbe-text);
    font-size: var(--schrift-klein);
    cursor: pointer;
    /* Das Dreieck des Aufklappers weg - das Auge ist die Anzeige. Zwei
       Schreibweisen, weil aeltere WebKit-Fassungen ::marker nicht kennen. */
    list-style: none;
}

.sehhilfe__knopf::-webkit-details-marker { display: none; }
.sehhilfe__knopf::marker { content: ""; }

.sehhilfe__knopf:hover { color: var(--farbe-akzent); }
.sehhilfe[open] .sehhilfe__knopf { color: var(--farbe-akzent); font-weight: 600; }

.sehhilfe__symbol {
    flex: 0 0 auto;
    width: 1.375rem;
    height: 1.375rem;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.6;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.sehhilfe__auf {
    margin-top: var(--abstand-2);
    border: var(--linie);
    border-top: 3px solid var(--marke-rot);
    background: var(--farbe-flaeche);
    padding: var(--abstand-3);
}

.sehhilfe__satz {
    margin: 0 0 var(--abstand-3);
    font-size: var(--schrift-klein);
    color: var(--farbe-text-leise);
}

.sehhilfe__steuerung { display: grid; gap: var(--abstand-4); }

/* Ohne JavaScript bewirken die Kaestchen nichts. Ein Knopf, der ins Leere
   fuehrt, ist schlimmer als keiner - also weg damit, der <noscript>-Hinweis
   daneben sagt stattdessen, wie man die Schrift im Browser vergroessert.
   Die Klasse js setzt der Sofortschnipsel im <head> von base.html.twig. */
html:not(.js) .sehhilfe__steuerung { display: none; }

.sehhilfe__gruppe { border: 0; margin: 0; padding: 0; min-width: 0; }

.sehhilfe__legende {
    padding: 0;
    margin-bottom: var(--abstand-2);
    font-weight: 600;
    font-size: var(--schrift-klein);
}

.sehhilfe__fuss {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--abstand-3);
}

.sehhilfe__meldung {
    margin: 0;
    font-size: var(--schrift-klein);
    color: var(--farbe-text-leise);
}

.sehhilfe__meldung:empty { display: none; }

/* Die gewaehlte Kachel wie im Konfigurator. Reine Zugabe: :has() kennt nicht
   jeder Browser, und wo es fehlt, sagt der Punkt im Radio dasselbe. */
.sehhilfe .wahl__punkt:has(:checked) {
    border-color: var(--marke-rot);
    box-shadow: inset 0 0 0 1px var(--marke-rot);
    background: var(--farbe-akzent-blass);
    font-weight: 600;
}

/* -- Schriftgroesse ------------------------------------------------------
   Ueber die Wurzelgroesse, damit alles mitwaechst, was in rem gerechnet ist -
   Abstaende, Bedienhoehe, Lesebreite. Die Umbruchgrenzen bleiben stehen, weil
   rem in einer Medienabfrage immer auf der Ausgangsgroesse rechnet und nicht
   auf dieser hier. Das ist erwuenscht: die Spalten sollen nicht springen. */
html.sehhilfe-schrift-115 { font-size: 115%; }
html.sehhilfe-schrift-130 { font-size: 130%; }

/* -- Zeilenabstand ------------------------------------------------------- */
html.sehhilfe-zeilen {
    --zeilenhoehe:     1.9;
    --zeilenhoehe-eng: 1.45;
}

/* -- Bewegung abschalten -------------------------------------------------
   Derselbe Inhalt wie die Medienabfrage weiter unten, nur von Hand geschaltet:
   nicht jedes Betriebssystem hat den Schalter, und nicht jeder findet ihn. */
html.sehhilfe-ruhe,
html.sehhilfe-ruhe *,
html.sehhilfe-ruhe *::before,
html.sehhilfe-ruhe *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
}

/* -- Kontrast erhoehen ---------------------------------------------------
   Nur Variablen. Die vier Markenwerte werden mit umgestellt, weil Polleiste,
   Zaehler und Sprungmarke sie unmittelbar benutzen - der Zaehler traegt Weiss
   auf Rot, und #A62822 sind dafuer 7,1:1, also gerade eben. Hier wird das Rot
   dunkler, das Anthrazit schwarz und das Creme weiss. Das Wappen bleibt, wie
   es ist: es ist ein Bild, kein Text.

   Die Rollenvariablen zeigen im Grundzustand auf die Markenwerte
   (--farbe-akzent: var(--marke-rot)). Sie erben die neuen Werte deshalb von
   selbst und stehen unten nur, wo sie einen EIGENEN Wert brauchen.

   Alle Paare sind ausgerechnet, siehe sehhilfe-pruefen.php. Kein Wert unter
   7:1, der niedrigste liegt bei 10,6:1. */
html.sehhilfe-kontrast {
    --marke-schwarz: #000000;
    --marke-rot:     #6E1A15;   /* Weiss darauf 11,5:1 statt 7,1:1 */
    --marke-creme:   #ffffff;

    --farbe-text-leise:       #2B2B2B;   /* 14,2:1 auf Weiss */
    --farbe-flaeche:          #ffffff;
    --farbe-flaeche-tief:     #F2EFE9;
    --farbe-linie:            #000000;
    --farbe-linie-stark:      #000000;
    --farbe-akzent-tief:      #4E1210;
    --farbe-gut:              #17472F;
    --farbe-warnung:          #5C3600;
    --farbe-fehler:           #6E1512;
    --farbe-teilen:           #3F1F63;
    --farbe-merken:           #5C3600;
    --farbe-auf-dunkel-leise: #ffffff;
}

/* Verweise nicht nur an der Farbe erkennbar. Im Grundzustand traegt sie der
   Farbwechsel allein - wer Farben schlecht unterscheidet, sieht dann nichts. */
html.sehhilfe-kontrast a { text-decoration: underline; }

/* Der Fokusring wird dicker. Er ist fuer Tastaturbedienung das Wichtigste
   ueberhaupt, und 2 px verschwinden auf einem hellen Schirm. */
html.sehhilfe-kontrast :focus-visible { outline-width: 3px; }

/* Wer Bewegung abbestellt hat, bekommt keine. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
}

@media print {
    .kopf, .fuss, .sprung, .seitenleiste, .polleiste { display: none; }
    .inhalt { max-width: none; padding: 0; }
    .rahmen--leiste { display: block; padding: 0; }
    .tabelle thead th { background: transparent; color: #000; border-bottom: 2px solid #000; }
    .inhalt h1::before, .inhalt h2::before { display: none; }

    /* Bilder und Farbbahnen kosten auf Papier nur Toner. Der Aufmacher faellt
       ganz weg - seine Ueberschrift steht im Bild und waere ohne den dunklen
       Grund schwarz auf weiss unlesbar. */
    .band, .schaufenster, .kachel__bild, .reihe__bild, .wissensbox__bild { display: none; }
    .zone { padding-block: var(--abstand-3); margin-block: var(--abstand-3); background: transparent; color: #000; }
    .zone--dunkel h2, .zone--dunkel .zahlen__wort { color: #000; }
    .reihe, .karte { background: transparent; break-inside: avoid; }
}

/* == 14  Redaktioneller Inhalt ============================================
 *
 * Kategorietexte und Ratgeber: Fließtext, Bilder, Tabellen, das Rechenspiel.
 *
 * ⭐ AM 19.08.2026 AUS public/css/inhalt.css HIERHER GEZOGEN. Die Content-Sitzung
 * hatte sie als zweite Datei angelegt, um sich nicht mit der Redesign-Sitzung in
 * kabelei.css zu begegnen. Das war beim Bauen richtig und beim Ausliefern falsch:
 * base.html.twig Zeile 84 sagt "Genau eine Stilvorlage, kein zweiter Verweis,
 * nirgends", und ein zweiter <link> hätte diese Doktrin für einen Textblock
 * aufgegeben.
 *
 * Angehängt und nicht eingewoben: Keine bestehende Zeile wurde angefasst, damit
 * die Redesign-Sitzung nichts vorfindet, das sich unter ihr bewegt hat.
 *
 * ⚠️ ALLES HÄNGT UNTER .redaktion, .spiel ODER .figur--*. Diese drei Namen kommen
 * in den Abschnitten 1 bis 13 NICHT vor - nachgezählt, nicht vermutet. Wer hier
 * eine Regel ergänzt, hält den Namensraum: Eine Regel ohne ihn greift in den
 * ganzen Laden, und genau daran ist die erste Fassung gescheitert (sie hing unter
 * .inhalt und hätte jede Seite auf Lesebreite geschrumpft).
 *
 * Mitbenutzt und NICHT nachgebaut werden die Ladenklassen .frage, .tabelle,
 * .scrollen und .zahl - hier steht nur, was ihnen im Fließtext fehlt.
 * ======================================================================== */


/* == 14.1  Rahmen ============================================================ */

/* ⚠️ DIE BREITE DER ABSAETZE MACHT NICHT DIESER ABSCHNITT, sondern Abschnitt 3:
   dort steht global  p { max-width: var(--breite-text); }  also 38rem.

   Das ist wichtig, weil es am 19.08.2026 eine Ansage stillschweigend verschluckt
   hat. Tanja wollte den Fliesstext auf Contentbreite, ich habe daraufhin die
   Begrenzung HIER entfernt - ohne jede Wirkung, weil die globale Regel weiterlief.
   Sichtbar wurde nur, dass Aufzaehlungen ploetzlich breiter liefen als die
   Absaetze daneben.

   Zweite Ansage am selben Tag, nachdem sie das gesehen hatte: "Breite bei der
   Aufzaehlung soll ebenso begrenzt sein wie Breite vom Fliesstext." Listen,
   Merkkaesten und das Easteregg ziehen deshalb auf dieselben 38rem nach.

   Wer den Fliesstext doch auf voller Breite will, aendert Zeile 207 - und dann
   auch diese Regel hier, sonst kippt die Spalte wieder auseinander. */
.redaktion > ul,
.redaktion > ol,
.redaktion > dl,
.redaktion > .kasten,
.redaktion > .beiseite {
    max-width: var(--breite-text);
}

/* .breit hebt die Begrenzung auf: die sechs Anwendungsfaelle, das Rechenspiel,
   breite Tabellen und die Panoramabilder tragen sie. Zwei Klassen schlagen
   Klasse-plus-Element, die Regel gewinnt also ohne !important. */
.redaktion > .breit {
    max-width: none;
}

/* Kein Strich UNTER der Ueberschrift. Tanja am 20.08.2026: "Im CSS hat es zu
   viele Striche drin."

   Ueber jeder h2 im Inhalt liegt schon der kurze rote Buchsatz-Strich aus
   Abschnitt 3 (.inhalt h2::before). Eine zweite Linie darunter kastelte die
   Ueberschrift ein, und gleich darunter fingen in Glossar und Tabelle die
   naechsten Linien an. Der Abstand nach oben trennt die Abschnitte allein.

   Geblieben ist clear: both - eine Ueberschrift, die neben einem seitlichen
   Bild anfaengt, liest sich wie eine Bildunterschrift. */
.redaktion h2 {
    margin-top: var(--abstand-5);
    clear: both;
}

/* Und kein Strich UEBER der Ueberschrift, wenn sie in einer Box sitzt.
   Tanja am 20.08.2026: "Keine kurzen Striche, wenn die Überschrift in einer
   Box ist."

   Der Buchsatz-Strich trennt einen Abschnitt vom Fliesstext darueber. In einer
   Box uebernimmt das die Boxkante, der Strich wird zur Doppelung. Bei den
   Haeufigen Fragen kam dazu, dass die Ueberschrift ein Flexkasten ist: Der
   Strich wurde dadurch zum Flexkind und stand als Gedankenstrich NEBEN dem
   Fragezeichen statt darueber. */
/* ⭐ AM 06.09.2026 UM .flaeche ERGAENZT. Tanja mit Bildschirmfoto der Kasse, den Strich
   ueber "Ihre E-Mail-Adresse" durchgestrichen: "zu viele Striche. zu unruhig."

   Es ist dieselbe Regel wie oben, nur war sie bis dahin auf die Redaktionskaesten
   beschraenkt. .flaeche ist der Kasten des Ladens ausserhalb der Ratgebertexte - Kasse,
   Konto, Warenkorb, Zahlung, achtzehn Stellen. Ueberall dort uebernimmt die Boxkante die
   Trennung, und der Strich stand als zweite Kante drei Millimeter daneben.

   Der Strich ueber der freistehenden h1 bleibt: Sie steht auf der Seite, nicht in einem
   Kasten, und dort trennt sie nichts anderes.

   🔴 WARUM .inhalt DAVORSTEHT UND NICHT NUR .flaeche: Die Gegenregel heisst
   ".inhalt h2::before" und wiegt 0-1-2. Ein blankes ".flaeche h2::before" waere ebenfalls
   0-1-2 - Gleichstand, und dann entscheidet allein, welche Zeile weiter unten in der Datei
   steht. Das haelt genau so lange, bis jemand einen Block verschiebt, und faellt dabei
   lautlos aus. Mit .inhalt davor sind es 0-2-2, und die Frage ist entschieden. */
.redaktion .fragen > h2::before,
.inhalt .fragen > h2::before,
.redaktion .kasten h2::before,
.redaktion .kasten h3::before,
.redaktion .spiel h2::before,
.redaktion .spiel h3::before,
.rechner h2::before,
.rechner h3::before,
.inhalt .flaeche h2::before,
.inhalt .flaeche h3::before {
    content: none;
}

.redaktion h3 {
    margin-top: var(--abstand-4);
    color: var(--farbe-akzent-tief);   /* 8,4:1 auf Weiss */
}

/* == 14.2  Bilder ============================================================ */

/* Tanjas Regel vom 19.08.2026: volle Breite nur im Panoramaformat. Alles
   andere steht halbbreit rechts und lässt den Text daneben weiterlaufen. */

.redaktion figure { margin: var(--abstand-4) 0; }

.redaktion figure img {
    display: block;
    width: 100%;
    height: auto;
    background: var(--farbe-flaeche-tief);
    border: 1px solid var(--farbe-linie);
}

.redaktion figcaption {
    margin-top: var(--abstand-2);
    padding-left: var(--abstand-3);
    border-left: 3px solid var(--marke-kupfer);
    color: var(--farbe-text-leise);
    font-size: var(--schrift-klein);
    line-height: 1.5;
}

.figur--panorama img { aspect-ratio: 21 / 9; object-fit: cover; }
.figur--seitlich img { aspect-ratio: 3 / 4;  object-fit: cover; }
.figur--paar img     { aspect-ratio: 1 / 1;  object-fit: cover; }

@media (min-width: 45rem) {
    /* Seit der Fliesstext auf voller Contentbreite laeuft, waere ein halbbreites
       Hochkantbild rund 58rem hoch - hoeher als jeder Absatz daneben. Tanja am
       19.08.: "Das Bild sollte hoechstens so hoch sein, dass links der Content
       noch schoen fliesst." Deshalb schmaler UND quadratisch beschnitten. */
    /* Tanja am 19.08.2026: "max. 50% auf dem Desktop" und "rechtsbuendig".
       Die 26rem daneben sind die zweite Bremse: Bei 72rem Inhaltsbreite waeren
       50 % schon 36rem, und ein quadratisches Bild waere dann 36rem hoch -
       hoeher als der Absatz daneben. Es gilt der jeweils kleinere Wert. */
    .redaktion .figur--seitlich {
        float: right;
        width: 50%;
        max-width: 26rem;
        margin: var(--abstand-1) 0 var(--abstand-4) var(--abstand-4);
    }

    .redaktion .figur--seitlich img { aspect-ratio: 1 / 1; }

    /* Zwei Bilder, die zusammengehoeren und nebeneinander muessen - Max und Ziva
       auf der Ueber-uns-Seite. Kein Float: das Paar steht in der Textspalte und
       traegt EINE gemeinsame Bildunterschrift ueber beide Spalten. */
    .redaktion .figur--paar {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--abstand-3);
        max-width: var(--breite-text);
        clear: both;
    }

    .redaktion .figur--paar figcaption { grid-column: 1 / -1; }

    /* Ein Float schiebt nur den ZEILENKASTEN beiseite, nicht den Block. Eine
       Flaeche mit Hintergrund lief deshalb UNTER das Bild hindurch - Tanja:
       "Hier liegt das rechtsbuendige Bild ueber dem Kasten."

       Zwei Antworten, je nach Breitenbedarf:
       flow-root  - eigener Formatierungskontext, der Kasten stellt sich sauber
                    NEBEN das Bild und behaelt seine Flaeche
       clear      - was die volle Breite braucht, faengt unter dem Bild an */
    .redaktion .kasten,
    .redaktion .beiseite {
        display: flow-root;
    }

    .redaktion .scrollen,
    .redaktion ul.faelle,
    .redaktion ol.arbeitsgang,
    .redaktion .fragen,
    .redaktion .spiel,
    .redaktion .figur--panorama {
        clear: both;
    }
}

/* == 14.3  Auszeichnung im Fliesstext ======================================== */

/* Ein Messwert im Satz. Feste Ziffernbreite, damit Zahlen nicht tanzen. */
.redaktion .wert {
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    font-weight: 600;
}

/* Ein Normzitat. Wird überflogen, deshalb sichtbar abgesetzt. */
.redaktion .norm {
    font-family: var(--schrift-fest);
    font-size: 0.9em;
    padding: 0.05em 0.35em;
    background: var(--farbe-flaeche-tief);
    white-space: nowrap;
}

/* ⭐ Auf dunklem Grund kehrt sich .norm um. Tanja am 20.08.2026: "beiger Text auf
   beigem Hintergrund, nicht lesbar."

   Die Ursache: .norm bringt eine helle Flaeche mit (#EFE9DC) und erbt die Farbe.
   In der Kopfzeile der Ladentabelle ist die geerbte Farbe Creme (#E8E0D0) - das
   ergibt einen Kontrast von 1,05:1. Die Flaeche ist hier also schaedlich, nicht
   schmueckend: Sie deckt den dunklen Grund ab, auf dem die Schrift lesbar waere.

   Ohne Flaeche, mit Kupferkante: Creme auf #222222 sind 12,7:1. */
.redaktion .tabelle thead .norm,
.zone--dunkel .norm {
    background: transparent;
    border: 1px solid var(--farbe-auf-dunkel-leise);
    color: var(--farbe-auf-dunkel);
}

/* Umgangssprache, die wir bewusst benutzen, weil danach gesucht wird. */
.redaktion .volksmund {
    font-style: italic;
    border-bottom: 1px dotted var(--farbe-linie-stark);
}

.redaktion .plus  { color: var(--farbe-akzent); font-weight: 600; }
.redaktion .minus { color: var(--farbe-text);   font-weight: 600; }

/* == 14.4  Listen und Arbeitsgänge =========================================== */

/* Symbole als Inline-SVG im Hintergrund, keine Symbolschrift.
   kabelei.css im Kopfteil: "Symbole kommen als Inline-SVG." */
.redaktion ul.haken,
.redaktion ul.kreuz {
    list-style: none;
    padding-left: 0;
}

.redaktion ul.haken > li,
.redaktion ul.kreuz > li {
    position: relative;
    padding-left: var(--abstand-5);
    margin-bottom: var(--abstand-2);
}

.redaktion ul.haken > li::before,
.redaktion ul.kreuz > li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0.28em;
    width: 1.15em;
    height: 1.15em;
    background: no-repeat center/contain;
}

.redaktion ul.haken > li::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M2 10.5 7.5 16 18 4' fill='none' stroke='%232A6141' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

.redaktion ul.kreuz > li::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M4 4l12 12M16 4L4 16' fill='none' stroke='%238C1D18' stroke-width='2.6' stroke-linecap='round'/%3E%3C/svg%3E");
}

/* Arbeitsgang: nummerierte Schritte UNTEREINANDER, mit runder Ziffernscheibe.
   Nicht .schritte - das ist im Laden ein dreispaltiges Raster mit eckiger
   Ziffer, und zwei Fassungen desselben Namens hätten sich gegenseitig
   überschrieben. */
.redaktion ol.arbeitsgang {
    list-style: none;
    counter-reset: arbeitsgang;
    padding-left: 0;
}

.redaktion ol.arbeitsgang > li {
    counter-increment: arbeitsgang;
    position: relative;
    padding-left: var(--abstand-6);
    margin-bottom: var(--abstand-4);
    min-height: 2.25rem;
}

.redaktion ol.arbeitsgang > li::before {
    content: counter(arbeitsgang);
    position: absolute;
    left: 0;
    top: -0.1em;
    width: 2.25rem;
    height: 2.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--marke-rot);
    color: #fff;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    border-radius: 50%;
}

/* ⚠️ :first-child ist hier kein Beiwerk. Ohne die Einschraenkung traf die Regel
   JEDES <strong> im Schritt, nicht nur den Schrittnamen davor. Tanja am
   20.08.2026: Mitten im Satz stand "kaltverschweißte, gasdichte Verbindung" als
   eigene Zeile in Serifenschrift und h3-Groesse, weil es zufaellig ein direktes
   Kind des <li> war. Auszeichnung im Fliesstext bleibt jetzt Auszeichnung. */
.redaktion ol.arbeitsgang > li > strong:first-child {
    display: block;
    margin-bottom: var(--abstand-1);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h3);
}

/* == 14.5  Was den Ladentabellen fehlt ======================================= */

/* .tabelle und .scrollen kommen aus kabelei.css und werden hier NICHT
   nachgebaut. Ergänzt wird nur die hervorgehobene Zeile - eine Kante, keine
   Fläche, damit die Zebrastreifen des Ladens weiter durchlaufen. */

/* Der Laden setzt caption-side: bottom (Abschnitt 6). Das passt fuer eine
   Quellenangabe unter einer Preistabelle, nicht fuer eine UEBERSCHRIFT. Tanja
   am 19.08.: "Wenn kleiner Text unter den Tabellen, dann Kleingedrucktes."
   Die redaktionellen Tabellen tragen Titel wie "Was in Ihrem Kabel steckt" -
   der gehoert nach oben. Nur hier umgestellt, der Laden bleibt, wie er ist. */
.redaktion .tabelle caption {
    caption-side: top;
    margin-bottom: var(--abstand-2);
    color: var(--farbe-text);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-gross);
    font-weight: 600;
    text-align: left;
}
/* Die hervorgehobene Zeile trug bis zum 20.08.2026 eine gruene Kante — und zwar
   an JEDER Zelle, weil der Selektor `tr.hervor > *` lautete. Statt einer Marke am
   Zeilenanfang standen vier gruene Balken mitten in der Tabelle. Tanja: "Grüne
   Striche hier in der Tabelle. Weg damit."

   Ersatzlos gestrichen. Ein Zeilenrahmen waere die naheliegende Alternative, aber
   die Zebrastreifen des Ladens laufen bereits durch, und eine zweite Markierung
   darueber macht die Tabelle nicht ruhiger. Was hervorgehoben gehoert, sagt der
   Text daneben - bei 35 mm² steht es im Absatz darueber.

   `class="hervor"` bleibt in der Auszeichnung stehen. Sie kostet nichts und ist
   der Anker, falls doch eine ruhigere Markierung kommen soll. */

/* Eine Tabelle darf breiter laufen als die Lesespalte. */
.redaktion .scrollen.breit { max-width: none; }

/* == 14.6  Merkkästen ======================================================== */

.redaktion .kasten {
    margin: var(--abstand-4) 0;
    padding: var(--abstand-3) var(--abstand-4);
    background: var(--farbe-flaeche);
    border-left: 4px solid var(--farbe-linie-stark);
}

.redaktion .kasten > :first-child { margin-top: 0; }
.redaktion .kasten > :last-child  { margin-bottom: 0; }

.redaktion .kasten__titel {
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
    margin-bottom: var(--abstand-2);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-gross);
    font-weight: 600;
}

/* Symbol nach rechts. Tanja am 20.08.2026: "Die Symbole lieber rechtsbündig."

   Links stand es vor dem Text und zwang die Ueberschrift in eine schmalere
   Spalte - bei einem zweizeiligen Titel klebte es dann oben in der Ecke. Rechts
   hat es die Boxkante als Anschlag und der Titel die volle Breite.

   order verschiebt das SVG hinter den Text: Der Text ist ein anonymes Flexkind
   mit order 0, das SVG bekommt 1. margin-left: auto schiebt es an den Rand,
   und flex-shrink: 0 (weiter unten) haelt es rund, wenn der Titel lang wird.

   ⭐ .fragen > h2 svg OHNE .redaktion davor, seit dem 14.09.2026: Die FAQ-Box steht seit
   diesem Tag auch im Ratgeber und auf der Seite der haeufigen Fragen (Tanja: "auf ALLE
   FAQs in dem Projekt anwenden"), und dort stand das Fragezeichen links, in den
   Produkttexten rechts. Ein Laden, eine Box - das Symbol steht ueberall rechts. */
.redaktion .kasten__titel svg,
.fragen > h2 svg {
    order: 1;
    margin-left: auto;
}

.redaktion .kasten__titel svg {
    flex: 0 0 auto;
    width: 1.3em;
    height: 1.3em;
}

.redaktion .kasten--merken  { border-left-color: var(--marke-kupfer); }
.redaktion .kasten--achtung { border-left-color: var(--farbe-warnung); }
.redaktion .kasten--achtung .kasten__titel { color: var(--farbe-warnung); }
.redaktion .kasten--gut     { border-left-color: var(--farbe-gut); }
.redaktion .kasten--gut .kasten__titel { color: var(--farbe-gut); }

/* Das Easteregg. Trockene Ironie, deshalb bewusst zurückhaltend gesetzt:
   keine Farbfläche, nur eine Kupferlinie und Kursivschrift. */
.redaktion .beiseite {
    margin: var(--abstand-4) 0;
    padding: var(--abstand-2) 0 var(--abstand-2) var(--abstand-4);
    border-left: 3px solid var(--marke-kupfer);
    font-family: var(--schrift-titel);
    font-size: var(--schrift-gross);
    font-style: italic;
    color: var(--farbe-text-leise);
}

/* == 14.7  Anwendungsfälle =================================================== */

.redaktion ul.faelle {
    display: grid;
    gap: var(--abstand-3);
    margin: var(--abstand-4) 0;
    padding: 0;
    list-style: none;
}

@media (min-width: 45rem) {
    .redaktion ul.faelle { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Drei Spalten am Schreibtisch, Tanjas Ansage vom 19.08. Sechs Faelle stehen
   damit als 3x2 beieinander statt als 2x3-Turm. */
@media (min-width: 64rem) {
    .redaktion ul.faelle { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.redaktion ul.faelle > li {
    padding: var(--abstand-3);
    border: var(--linie);
    border-top: 3px solid var(--farbe-akzent);
}

.redaktion ul.faelle h3 {
    margin: 0 0 var(--abstand-2);
    font-size: var(--schrift-h3);
    color: var(--farbe-text);
}

.redaktion ul.faelle p { margin: 0; font-size: var(--schrift-klein); }

.redaktion ul.faelle .querschnitt {
    display: inline-block;
    margin-top: var(--abstand-2);
    padding: 0.1em 0.5em;
    background: var(--farbe-flaeche-tief);
    font-family: var(--schrift-fest);
    font-size: var(--schrift-winzig);
}

/* == 14.8  Häufige Fragen ==================================================== */

/* .frage, .frage__titel und .frage__antwort stehen fertig in kabelei.css und
   werden dort gepflegt. Neu ist nur der Rahmen darum: Der Block wird anders
   gelesen als der Fliesstext - niemand liest ihn von oben nach unten, alle
   springen zu ihrer Frage. Deshalb eine eigene Fläche. */
/* ⭐ SEIT DEM 14.09.2026 OHNE .redaktion DAVOR. Tanja: "Das aufklappbare CSS für die FAQ
   sind fein. Bitte auf ALLE FAQs in dem Projekt anwenden. Es muss aber am Anfang der Box
   immer auch eine Überschrift 'FAQ' platziert werden." Der Kasten galt bis dahin nur im
   Redaktionssatz (Produkt- und Kategorietexte); die Ratgeber-Fragen und die Seite
   /haeufige-fragen standen ohne Kasten und ohne Überschrift da. Jetzt EIN Kasten für alle:
   .fragen mit <h2>FAQ</h2> vorweg und <details class="frage"> je Frage. */
.fragen {
    margin: var(--abstand-5) 0;
    padding: var(--abstand-4);
    background: var(--farbe-flaeche);
    border: var(--linie);
}

.fragen > h2 {
    margin-top: 0;
    display: flex;
    align-items: center;
    gap: var(--abstand-2);
}

.fragen > h2 svg {
    flex: 0 0 auto;
    width: 1em;
    height: 1em;
}

/* Auf Creme trägt das dunklere Rot den Kontrast: 8,4:1 statt 5,4:1. */
.fragen .frage__titel { color: var(--farbe-akzent-tief); }
.fragen .frage:last-of-type { border-bottom: 0; padding-bottom: 0; }

/* == 14.9  Glossar =========================================================== */

.redaktion .glossar {
    margin: var(--abstand-4) 0;
    padding: 0;
    display: grid;
}

@media (min-width: 45rem) {
    .redaktion .glossar { grid-template-columns: 12rem 1fr; }
}

.redaktion .glossar dt {
    padding: var(--abstand-2) var(--abstand-3) var(--abstand-2) 0;
    border-top: var(--linie);
    font-family: var(--schrift-fest);
    font-size: var(--schrift-klein);
    font-weight: 600;
    color: var(--farbe-akzent-tief);
}

.redaktion .glossar dd {
    margin: 0;
    padding: var(--abstand-2) 0;
    border-top: var(--linie);
    font-size: var(--schrift-klein);
}

@media (max-width: 44.99rem) {
    .redaktion .glossar dd { border-top: 0; padding-top: 0; }
}

/* == 14.10  Rechenspiel ====================================================== */

.spiel {
    margin: var(--abstand-5) 0;
    border: 1px solid var(--farbe-linie-stark);
}

.spiel__kopf {
    padding: var(--abstand-3) var(--abstand-4);
    background: var(--farbe-dunkel);
    color: var(--farbe-auf-dunkel);
}

.spiel__kopf h3 {
    margin: 0;
    color: var(--farbe-auf-dunkel);
    font-size: var(--schrift-h3);
}

.spiel__kopf p {
    margin: var(--abstand-1) 0 0;
    font-size: var(--schrift-klein);
    color: var(--farbe-auf-dunkel-leise);
}

.spiel__buehne {
    display: block;
    width: 100%;
    height: auto;
    background: var(--farbe-flaeche);
}

.spiel__regler {
    display: grid;
    gap: var(--abstand-3);
    padding: var(--abstand-4);
    border-top: var(--linie);
}

@media (min-width: 45rem) {
    .spiel__regler { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.spiel__regler label {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: var(--abstand-1) var(--abstand-2);
    align-items: baseline;
    font-size: var(--schrift-klein);
    font-weight: 600;
}

.spiel__regler output {
    font-variant-numeric: tabular-nums;
    font-weight: 700;
    color: var(--farbe-akzent-tief);
}

.spiel__regler input[type="range"] {
    grid-column: 1 / -1;
    width: 100%;
    height: var(--bedienhoehe);
    accent-color: var(--farbe-akzent);
}

.spiel__regler select {
    grid-column: 1 / -1;
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-2);
    border: 1px solid var(--farbe-linie-stark);
    background: var(--farbe-grund);
    font: inherit;
}

.spiel__ergebnis {
    display: grid;
    gap: var(--abstand-3);
    margin: 0;
    padding: var(--abstand-4);
    border-top: var(--linie);
    background: var(--farbe-flaeche);
}

@media (min-width: 45rem) {
    .spiel__ergebnis { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.spiel__wert { text-align: center; }

.spiel__wert dt {
    font-size: var(--schrift-winzig);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--farbe-text-leise);
}

.spiel__wert dd {
    margin: var(--abstand-1) 0 0;
    font-size: var(--schrift-h2);
    font-variant-numeric: tabular-nums;
    line-height: 1.1;
}

.spiel__urteil {
    margin: 0;
    padding: var(--abstand-3) var(--abstand-4);
    border-top: var(--linie);
    font-weight: 600;
}

.spiel__urteil[data-stufe="gut"]      { color: var(--farbe-gut); }
.spiel__urteil[data-stufe="knapp"]    { color: var(--farbe-warnung); }
.spiel__urteil[data-stufe="schlecht"] { color: var(--farbe-fehler); background: var(--farbe-akzent-blass); }

.spiel__hinweis {
    margin: 0;
    padding: var(--abstand-3) var(--abstand-4);
    border-top: var(--linie);
    font-size: var(--schrift-winzig);
    color: var(--farbe-text-leise);
}

/* Ohne JavaScript bleibt das Spiel weg und der Text daneben trägt allein. */
.spiel[hidden] { display: none; }

/* == 14.11  Bewegung, Sehhilfe, Druck ======================================== */

/* Der Laden bewegt sonst nichts. Was sich hier ändert, ist der Zustand der
   Leitung im Spiel - das erklärt etwas, statt zu schmücken. Wer Bewegung
   abgeschaltet hat, bekommt denselben Zustand ohne Übergang. */
@media (prefers-reduced-motion: reduce) {
    .spiel * { animation: none !important; transition: none !important; }
}

@media (prefers-contrast: more) {
    .redaktion .fragen,
    .redaktion .kasten,
    .redaktion ul.faelle > li { border-color: var(--farbe-umriss); }
    .redaktion figcaption { color: var(--farbe-text); }
}

@media print {
    .spiel__regler,
    .spiel__hinweis { display: none; }
    .redaktion .figur--seitlich { float: none; width: 60%; }
    .redaktion > * { max-width: none; }

    /* Im Druck wird die Kopfzeile weiss (Abschnitt 13). Die Umkehrung von .norm
       muss dann mit zurueck, sonst steht Creme auf Weiss - derselbe Fehler wie
       vorher, nur andersherum. */
    .redaktion .tabelle thead .norm {
        border-color: #000;
        color: #000;
    }
}

/* == 15  Rechner und Wissensliste ==========================================
 *
 * Zwei Bausteine, die fertig gebaut waren und NIE eine einzige Regel bekommen
 * haben. Gefunden hat es die Hauptsitzung am 19.08.2026 beim Nachmessen.
 *
 *   .rechner*      - erzeugt teils die Vorlage (templates/wissen/_rechner.html.twig),
 *                    teils public/js/rechner.js zur Laufzeit. Ohne Regeln stand auf
 *                    den drei Rechnerseiten woertlich "Empfohlener Querschnitt25 mm²":
 *                    bauZeile() setzt zwei Spans aneinander, und nichts trennte sie.
 *   .wissensliste* - die Artikelliste auf /wissen. Ohne Regeln eine nackte
 *                    Aufzaehlung mit Punkten, waehrend .wissensbox als fertige
 *                    Kartenkomponente danebenlag.
 *
 * ⚠️ WARUM EIN EIGENER ABSCHNITT UND NICHT ABSCHNITT 14: Dort haengt alles unter
 * .redaktion, .spiel oder .figur--*. Diese beiden Bausteine stehen ausserhalb der
 * redaktionellen Texte. Sie hier anzuhaengen waere bequem und wuerde die Regel von
 * Abschnitt 14 aushebeln, auf die sich andere Sitzungen verlassen.
 *
 * ⚠️ .wissensbox WIRD NICHT NACHGEBAUT. Die Karten hier borgen sich deren Bildsprache
 * (Rahmen, Radius, Polster, Rasterabstand), tragen aber KEIN Bild - die Ratgeber haben
 * keins. Wer .wissensbox aendert, sollte hier hereinsehen.
 * ========================================================================== */

/* == 15.1  Der Rechner ====================================================== */

.rechner {
    margin: var(--abstand-5) 0;
    border: var(--linie);
    border-radius: var(--radius);
    background: var(--farbe-flaeche);
}

/* 🔴 minmax(0, 1fr) AUCH EINSPALTIG, seit dem 14.09.2026. Tanja mit Bildschirmfoto vom
   iPhone 13 mini: "Input Felder passen nicht ins Bild." Die Felder liefen rechts aus dem
   Kasten. Ursache: Ohne grid-template-columns hat das Raster eine Spalte mit Breite auto,
   und ein Rasterfeld ist mindestens so breit wie sein Inhalt (min-width: auto). Der
   Inhalt ist ein <select>, dessen laengster Eintrag "Verbraucher, Beleuchtung, Kuehlbox -
   3 %" lautet - breiter als 375 px minus Polster. Die Spalte wuchs darueber hinaus, und
   alle Felder streckten sich auf diese Breite. Zweispaltig stand minmax(0, 1fr) schon
   da, deshalb fiel es am Laptop nie auf. */
.rechner__form {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--abstand-3);
    padding: var(--abstand-4);
    margin: 0;
}

@media (min-width: 45rem) {
    .rechner__form { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Jedes Feld ist ein <p>. Beschriftung ueber das Bedienelement, Einheit daneben.
   min-width: 0 und minmax(0, 1fr) aus demselben Grund wie beim Formular darueber:
   Das Feld darf schmaler werden als sein laengster Listeneintrag. */
.rechner__feld {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap: var(--abstand-1) var(--abstand-2);
    margin: 0;
    min-width: 0;
    max-width: none;          /* sonst greift p { max-width: 38rem } aus Abschnitt 3 */
}

.rechner__feld label {
    grid-column: 1 / -1;
    font-weight: 600;
    font-size: var(--schrift-klein);
}

.rechner__feld select,
.rechner__feld input {
    /* So breit wie die Spalte und keinen Pixel breiter - siehe .rechner__form. Ein
       <select> ist von sich aus so breit wie sein laengster Eintrag, ein <input> so
       breit wie 20 Zeichen. */
    width: 100%;
    min-width: 0;
    box-sizing: border-box;
    min-height: var(--bedienhoehe);
    padding: 0 var(--abstand-2);
    border: 1px solid var(--farbe-linie-stark);
    border-radius: var(--radius);
    background: var(--farbe-grund);
    color: var(--farbe-text);
    font: inherit;
}

/* Ohne diese Zeile stuende die Einheit direkt am Zahlenfeld. */
.rechner__einheit {
    color: var(--farbe-text-leise);
    font-size: var(--schrift-klein);
}

.rechner__ergebnis {
    padding: var(--abstand-4);
    border-top: var(--linie);
}

.rechner__ergebnis h3 { margin-top: 0; }

.rechner__tafel {
    margin: 0 0 var(--abstand-3);
    border: var(--linie);
    border-radius: var(--radius);
    background: var(--farbe-grund);
}

/* ⭐ HIER SASS DER FEHLER. Bezeichnung links, Wert rechts, dazwischen Luft.
   Vorher lief beides als zwei Inline-Elemente ohne Leerraum ineinander. */
.rechner__zeile {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--abstand-2) var(--abstand-4);
    padding: var(--abstand-2) var(--abstand-3);
    border-bottom: var(--linie);
}

.rechner__zeile:last-child { border-bottom: 0; }

.rechner__was  { color: var(--farbe-text-leise); }
.rechner__wert { font-variant-numeric: tabular-nums; text-align: right; }

/* Die Hauptzeile traegt das Ergebnis, auf das der ganze Rechner hinauslaeuft. */
.rechner__zeile--haupt {
    background: var(--farbe-flaeche);
    box-shadow: inset 3px 0 0 var(--farbe-akzent);
}

.rechner__zeile--haupt .rechner__was  { color: var(--farbe-text); font-weight: 600; }
.rechner__zeile--haupt .rechner__wert { font-size: var(--schrift-h3); }

.rechner__fussnote {
    margin: 0;
    padding: var(--abstand-3) var(--abstand-4);
    border-top: var(--linie);
    font-size: var(--schrift-winzig);
    color: var(--farbe-text-leise);
    max-width: none;
}

/* == 15.2  Die Artikelliste auf /wissen ===================================== */

.wissensliste {
    display: grid;
    gap: var(--abstand-3);
    margin: 0 0 var(--abstand-5);
    padding: 0;
    list-style: none;          /* die nackten Punkte waren der sichtbare Teil des Fehlers */
}

@media (min-width: 45rem) {
    .wissensliste { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 64rem) {
    .wissensliste { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.wissensliste__eintrag {
    display: flex;
    flex-direction: column;
    gap: var(--abstand-2);
    padding: var(--abstand-3) var(--abstand-4) var(--abstand-4);
    background: var(--farbe-grund);
    border: var(--linie);
    border-top: 3px solid var(--farbe-akzent);
    border-radius: var(--radius);
}

.wissensliste__titel {
    font-family: var(--schrift-titel);
    font-size: var(--schrift-h3);
    font-weight: 600;
    line-height: var(--zeilenhoehe-eng);
    text-decoration: none;
}

/* Ein Verweis, den man erst beim Ueberfahren erkennt, wird auf dem Handy nie
   gefunden. Deshalb bleibt die Unterstreichung beim Ueberfahren, statt erst
   dann zu erscheinen - dieselbe Ueberlegung wie bei .wissensbox__text a. */
.wissensliste__titel:hover,
.wissensliste__titel:focus-visible { text-decoration: underline; text-decoration-thickness: 2px; }

.wissensliste__anriss {
    margin: 0;
    max-width: none;
    font-size: var(--schrift-klein);
    color: var(--farbe-text-leise);
}

/* Die Lesezeit sitzt am Fuss der Karte, damit die Karten trotz verschieden
   langer Anrisse unten buendig wirken. */
.wissensliste__eintrag > .klein { margin-top: auto; }

/* == 16. (frei) Testbanner, entfernt am 17.10.2026 ============================== */
/*
   Hier stand bis zum 17.10.2026 die Regel .testbanner (Amber #ffc107, fast schwarze
   Schrift, max-width: none gegen die Lesebreite der Absaetze). Mit dem Banner in
   base.html.twig weggefallen, als Mollie scharf geschaltet wurde. Tanja: "Weg mit dem
   Banner, Mollie scharf schalten." Die Nummer 16 bleibt frei, damit die Verweise auf die
   folgenden Abschnitte stimmen.
*/

/* == 17. Zweite Seitenleisten-Box: was zur Kategorie gehoert ==================== */
/*
 * ⭐ Neu am 26.08.2026 (S38), am selben Tag GRUPPIERT (S42). Tanja nach der Durchsicht am
 * Bildschirm: "Die zweite Sidebar-Box muessen wir etwas besser strukturieren."
 *
 * Sie sitzt im selben .seitenleiste__block wie das Qualitaetsversprechen darueber und
 * uebernimmt damit Rahmen, Abstand und Ueberschrift. Eigen sind nur die Gruppen.
 *
 * ⚠️ DIE SYMBOLE SIND WEG, und .kategorieleiste__symbol mit ihnen. Bis zum 26.08. trug jede
 * Zeile ∑, ✎ oder ▸. Neben einer Gruppenueberschrift sagen sie nichts mehr - unter
 * "Rechner" stand ∑ zweimal untereinander, eine Spalte mit demselben Zeichen. Wer sie
 * zurueckholt, braucht die Regel wieder; im Twig steht dann auch wieder ein span.
 *
 * ⚠️ KEIN STRICH UNTER DEN GRUPPENTITEL. Tanjas Linie vom 20.08. ("Striche raus") gilt hier
 * genauso: Die Ueberschrift trennt schon, ein Strich daneben ist ein zweites Mal dasselbe.
 * Die feinen Linien ZWISCHEN den Eintraegen bleiben - sie trennen Zeilen, nicht Bloecke.
 */
.kategorieleiste__gruppe + .kategorieleiste__gruppe {
    margin-top: var(--abstand-4, 1.5rem);
}

/*
 * Kleine gesperrte Versalien: klar als Etikett lesbar, ohne mit dem Boxtitel darueber
 * (Serif, gross) oder den Verweisen darunter (rot) verwechselt zu werden. Bei .875rem
 * bleiben Versalien lesbar - var(--schrift-winzig) waere hier zu klein, das ist laut
 * Typografieblock ausdruecklich den Fussnoten vorbehalten.
 */
.kategorieleiste__gruppentitel {
    margin: 0 0 var(--abstand-2, .5rem);
    font-family: inherit;
    font-size: var(--schrift-klein, .875rem);
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--farbe-text-leise, #5E5852);
}

.kategorieleiste {
    list-style: none;
    margin: 0;
    padding: 0;
}

.kategorieleiste__eintrag {
    padding: .5rem 0;
    border-top: 1px solid var(--farbe-linie, #DED7C8);
    font-size: .95rem;
    line-height: 1.4;
}

/* Die erste Zeile jeder Gruppe braucht keine Trennlinie - darueber sitzt die Ueberschrift. */
.kategorieleiste__eintrag:first-child { border-top: 0; padding-top: 0; }

/*
 * Der Artikel, auf dem man gerade steht. Er bleibt in der Liste, wird aber nicht auf sich
 * selbst verwiesen - halbfett und in Textfarbe statt rot.
 */
.kategorieleiste__hier {
    font-weight: 700;
    color: var(--farbe-text, #222222);
}

/* "mehr" ist der Ausgang, kein gleichrangiger Eintrag: eine Spur kleiner. Rot bleibt es,
   sonst sieht es nicht mehr nach Verweis aus. */
.kategorieleiste__eintrag--mehr { font-size: var(--schrift-klein, .875rem); }


/* == 18. Bewertungen (11.09.2026) ============================================ */
/* Anzeige unter dem Redaktionstext der Produkt- und Kategorieseiten
   (teile/_bewertungen.html.twig) und das Formular hinter dem Mail-Link
   (bewertung/bewerten.html.twig). Tanja: "rundem Avatar, der nur Initialien
   wiederspiegelt. Datum der Bewertung." Sterne laufen ueber currentColor in der
   Akzentfarbe, damit sie in beiden Farbsaetzen (Abschnitt 13) mitgehen. */

.bewertungen { margin-top: var(--abstand-5); }
.bewertungen__schnitt { display: flex; align-items: center; gap: var(--abstand-2); flex-wrap: wrap; margin: 0 0 var(--abstand-3); }

.sterne { display: inline-flex; gap: 0.1rem; color: var(--farbe-akzent); line-height: 1; }
.sterne__stern { width: 1.1rem; height: 1.1rem; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linejoin: round; }
.sterne__stern--voll { fill: currentColor; }

.bewertungen__liste { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--abstand-3); max-width: var(--breite-text); }
.bewertung { display: grid; grid-template-columns: 2.75rem minmax(0, 1fr); gap: var(--abstand-2); align-items: start; padding: var(--abstand-3); background: var(--farbe-flaeche); border: 1px solid var(--farbe-linie); border-radius: 8px; }
.bewertung__avatar { display: grid; place-items: center; width: 2.75rem; height: 2.75rem; border-radius: 50%; background: var(--farbe-akzent); color: var(--farbe-auf-dunkel); font-weight: 700; letter-spacing: 0.02em; }
.bewertung__kopf { display: flex; align-items: center; gap: var(--abstand-2); flex-wrap: wrap; }
.bewertung__kopf time { color: var(--farbe-text-leise); }
.bewertung__kennzeichen { font-size: 0.8rem; color: var(--farbe-text-leise); border: 1px solid var(--farbe-linie); border-radius: 999px; padding: 0 0.5rem; }
.bewertung__produkt { margin: 0.2rem 0 0; font-size: 0.9rem; color: var(--farbe-text-leise); }
.bewertung__text { margin: var(--abstand-1) 0 0; }
.bewertungen__herkunft { margin-top: var(--abstand-3); max-width: var(--breite-text); }

/* Formular: fuenf Radio-Knoepfe als Sterne. Die Knoepfe bleiben im Zugriffsbaum (nur
   aus dem Bild verschoben), mit Tastatur bedienbar wie jede Radiogruppe. Gefuellt sind
   alle Sterne bis zum gewaehlten - CSS kann nicht rueckwaerts, deshalb :has() auf die
   Gruppe und nth-of-type auf die labels. Ohne :has() (sehr alte Browser) bleibt nur der
   gewaehlte Stern gefuellt, das Formular funktioniert trotzdem. */
.bewerten { max-width: var(--breite-text); }
.bewerten__position { border: 1px solid var(--farbe-linie); border-radius: 8px; padding: var(--abstand-3); margin: 0 0 var(--abstand-3); }
.bewerten__position legend { font-weight: 700; padding: 0 var(--abstand-1); }
.sternewahl { display: inline-flex; gap: 0.15rem; margin: var(--abstand-2) 0; color: var(--farbe-akzent); }
.sternewahl input { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.sternewahl label { cursor: pointer; display: inline-block; width: 2rem; height: 2rem; }
.sternewahl label svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linejoin: round; }
.sternewahl input:checked + label svg { fill: currentColor; }
.sternewahl input:focus-visible + label { outline: 2px solid var(--farbe-akzent); outline-offset: 2px; border-radius: 4px; }
.sternewahl:has(input:nth-of-type(1):checked) label:nth-of-type(-n+1) svg,
.sternewahl:has(input:nth-of-type(2):checked) label:nth-of-type(-n+2) svg,
.sternewahl:has(input:nth-of-type(3):checked) label:nth-of-type(-n+3) svg,
.sternewahl:has(input:nth-of-type(4):checked) label:nth-of-type(-n+4) svg,
.sternewahl:has(input:nth-of-type(5):checked) label:nth-of-type(-n+5) svg { fill: currentColor; }
.sternewahl label:hover svg { fill: currentColor; fill-opacity: 0.35; }
.bewerten textarea { width: 100%; min-height: 5rem; }

/* == 16  Kanzleitext ======================================================
   Der Copyright-Block der IT-Recht Kanzlei unter den AGB (seite/_agb_kanzlei.html.twig),
   seit dem 16.09.2026. Die Kanzlei liefert ihn mit Inline-Stilen (inline-block, float,
   nowrap); die stehen hier als Klasse, weil der Laden genau eine Stilvorlage hat.
   Logo links, Stand rechts, darueber der Abstand einer Seitenzaesur. Das Bild kommt vom
   Server der Kanzlei (Lizenz), 220 x 55, mit max-width fuer schmale Bildschirme.
   ========================================================================= */
.kanzlei {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: flex-start;
    gap: var(--abstand-2) var(--abstand-4);
    margin-top: var(--abstand-6);
    font-size: var(--schrift-winzig);
    color: var(--farbe-text-leise);
}

.kanzlei__logo { display: inline-block; line-height: 0; }

.kanzlei img {
    max-width: 100%;
    height: auto;
}

.kanzlei__stand { white-space: nowrap; }
