/*
Theme Name: LotzApp B2B Theme
Theme URI: https://somesunnymind.com/
Update URI: https://github.com/somesunnymind/lotzwoo-theme-base
Author: LotzApp Solutions
Description: Minimales Block-Theme für B2B-Großhandelsshops auf WooCommerce. Trägt das Design-System in theme.json und sonst so wenig wie möglich — Kopfbereich, Fußbereich, zwei zuweisbare Seitenvorlagen. Alles Kundenspezifische gehört in ein Kindtheme.
Version: 0.4.0
Requires at least: 6.6
Tested up to: 7.0
Requires PHP: 8.1
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: lotzwoo-theme-base
Tags: block-theme, full-site-editing, e-commerce
*/

/* ==================================================================
   Die Brücke zwischen theme.json und den B2B-Oberflächen.

   Das Plugin bringt sein eigenes Design-System mit (`b2b-tokens.css`,
   54 Custom Properties, auf die acht Wurzeln unten gescopet — bis zum
   2026-08-13 stand hier „`.lotzwoo-b2b-shop` und `.lotzwoo-reorder`", und
   genau diese verkürzte Liste war der Fehler). Das ist richtig so: das
   Plugin muss in jedem Theme funktionieren, auch in einem, das nichts von
   ihm weiß.

   Dieses Theme weiß von ihm. Also übersetzt es hier die
   theme.json-Presets in die Token des Plugins — genau an der Stelle,
   die der Kommentar in `b2b-tokens.css` dafür vorsieht: "Wo eine Site
   übernehmen soll, genügt es, den Token auf einer der Wurzeln zu
   überschreiben."

   Die Richtung ist Absicht. Stünde die Abhängigkeit im Plugin, hinge
   das Plugin am Theme. So hängt das Theme am Plugin, und wer das Theme
   wechselt, bekommt wieder die Standardwerte statt einer kaputten
   Oberfläche. Der Fallback hinter jedem `var()` ist derselbe Wert, den
   das Plugin ohnehin mitbringt.

   Ein Kindtheme ändert nur theme.json. Diese Datei bleibt unberührt.

   `.lotzwoo-heldback` ist seit Ticket 15 dabei. Die Sektion der
   zurückgehaltenen Positionen wird vom Plugin **clientseitig** in den
   Warenkorb-Slot gezeichnet und liegt damit außerhalb von
   `.lotzwoo-b2b-shop` — ohne eigene Wurzel erreichte sie keine der Token,
   und sie ist die einzige Plugin-Fläche im Kaufweg, die das Plugin selbst noch
   nicht gestaltet (`grep heldback` über seine Stylesheets findet nichts).
   Deshalb stehen ihre Regeln weiter unten in dieser Datei; sobald das Plugin
   eigene mitbringt, findet es hier die Token des Kundenthemes bereits vor.
   ================================================================== */

/* ------------------------------------------------------------------
   Die acht Wurzeln sind ein Vertrag zwischen zwei Repos.
   (`.lotzwoo-standing-orders` kam mit AP-58, `.lotzwoo-contextcard` mit AP-60.)

   Dieselbe Liste steht in `lotzapp-for-woocommerce/assets/css/b2b-tokens.css`,
   und sie muss dort dieselbe sein. Wer hier eine Fläche hinzufügt und dort
   nicht, baut genau den Fehler, der am 2026-08-13 gefunden wurde: das Plugin
   führte fünf Wurzeln, dieses Theme drei, die Schnittmenge war zwei — und auf
   `.lotzwoo-favorites`, `.lotzwoo-locations` und `.lotzwoo-ordercontext` galt
   deshalb **kein einziges** Token dieser Datei. Die drei Konto-Flächen trugen
   die Marke des Kunden nicht: die Grundfläche stand dort auch auf Bersta bei
   #ffffff statt bei #fbf7f0, mitten in einem cremefarbenen Shop.

   Eine Fläche steht auch dann in beiden Listen, wenn eine der beiden Seiten
   sie noch nicht gestaltet. Token kosten nichts; die Lücke ist das Teure, und
   sie wird nirgends rot — dasselbe Muster wie AD-11, nur andersherum.

   Die Reihenfolge im Dokument ist seit dem 2026-08-13 zugesagt: `functions.php`
   hängt diese Datei an das Token-Stylesheet des Plugins, wo es geladen ist.
   Beide Seiten definieren dieselben Token auf derselben Spezifität — es gewinnt,
   was später steht, und das muss diese Datei sein, sonst trägt keine Fläche die
   Marke.
   ------------------------------------------------------------------ */

.lotzwoo-b2b-shop,
.lotzwoo-reorder,
.lotzwoo-favorites,
.lotzwoo-locations,
.lotzwoo-standing-orders,
.lotzwoo-ordercontext,
.lotzwoo-contextcard,
/* AP-70 (C1/C5): die zwei fremden Wurzeln. `b2b-tokens.css` traegt sie
   ebenfalls — beide Seiten definieren dieselben Token auf derselben
   Spezifitaet, und es gewinnt, was spaeter steht. Fehlt eine Zeile hier,
   traegt die Flaeche die Vorgabefarben des Plugins statt der Marke, und
   nichts wird davon rot. */
.lotzwoo-overview,
.lotzwoo-heldback,
.woocommerce-MyAccount-content,
.woocommerce-MyAccount-navigation {
  --lwb-brand-50:  var(--wp--preset--color--brand-50,  #eaf6f1);
  --lwb-brand-100: var(--wp--preset--color--brand-100, #cfe9de);
  --lwb-brand-200: var(--wp--preset--color--brand-200, #a3d5c2);
  --lwb-brand-300: var(--wp--preset--color--brand-300, #6bbb9f);
  --lwb-brand-400: var(--wp--preset--color--brand-400, #349a7a);
  --lwb-brand-500: var(--wp--preset--color--brand-500, #157d5f);
  --lwb-brand-600: var(--wp--preset--color--brand-600, #0f6b51);
  --lwb-brand-700: var(--wp--preset--color--brand-700, #0b5641);
  --lwb-brand-800: var(--wp--preset--color--brand-800, #084132);
  --lwb-brand-900: var(--wp--preset--color--brand-900, #062f25);

  --lwb-ink-900: var(--wp--preset--color--ink-900, #0d1520);
  --lwb-ink-700: var(--wp--preset--color--ink-700, #263243);
  --lwb-ink-600: var(--wp--preset--color--ink-600, #3a4759);
  --lwb-ink-500: var(--wp--preset--color--ink-500, #5a6879);
  --lwb-ink-400: var(--wp--preset--color--ink-400, #8592a3);
  --lwb-ink-300: var(--wp--preset--color--ink-300, #b9c2cd);
  --lwb-ink-200: var(--wp--preset--color--ink-200, #dbe1e8);
  --lwb-ink-100: var(--wp--preset--color--ink-100, #f1f4f7);
  --lwb-ink-50:  var(--wp--preset--color--ink-50,  #f7f9fb);

  /* Die größte Fläche der Oberfläche: die Rolle „Karte, Tabelle,
     Eingabefeld" — 32 Regeln. Ein Kundentheme auf Creme würde sonst weiße
     Kästen auf getöntem Grund zeigen. Sie hängt deshalb am Preset `surface`
     und nicht an `white`: Weiß muss Weiß bleiben können, dort wo es wörtlich
     gemeint ist (der Rand am Warenkorb-Zähler weiter unten ist so eine
     Stelle).

     Der Token hieß bis zum 2026-08-13 `--lwb-white` — auf beiden Seiten, und
     der Name war der Fehler: er hat drei Sitzungen gegen ein Symptom bauen
     lassen. Jetzt heißt er wie die Rolle und wie das Preset, an dem er
     hängt. */
  --lwb-surface: var(--wp--preset--color--surface, #fff);

  /* Und hier die zweite Rolle, die dem Satz oben bisher gefehlt hat: die
     Fläche, die sich vom Grund abheben *soll*. Sie ist wörtlich Weiß und
     hängt deshalb am Preset `white`, das beide theme.json führen — nicht an
     `surface`. Die zwei müssen auf einem Kundentheme verschieden aussehen,
     sonst gibt es nichts, wovon sich der Vordergrund abhebt: auf Bersta
     #ffffff gegen #fbf7f0.

     Nur die Farbe steht hier. Kontur und Schatten der Rolle (`--lwb-front`,
     `--lwb-front-border`, `--lwb-front-shadow`) bleiben beim Plugin — sie
     sind aus Token gerührt, die dieses Theme ohnehin schon setzt, und eine
     zweite Fassung davon wäre wieder die doppelte Wahrheit. */
  --lwb-white-pure: var(--wp--preset--color--white, #ffffff);

  --lwb-ok-50:    var(--wp--preset--color--ok-50,    #e8f6ee);
  --lwb-ok-500:   var(--wp--preset--color--ok-500,   #17794a);
  --lwb-warn-50:  var(--wp--preset--color--warn-50,  #fdf3e3);
  --lwb-warn-500: var(--wp--preset--color--warn-500, #a86a08);
  --lwb-err-50:   var(--wp--preset--color--err-50,   #fdecec);
  --lwb-err-500:  var(--wp--preset--color--err-500,  #b42318);
  --lwb-err-700:  var(--wp--preset--color--err-700,  #8a1a12);
  --lwb-info-50:  var(--wp--preset--color--info-50,  #eaf1fc);
  --lwb-info-500: var(--wp--preset--color--info-500, #1e5eb8);

  /* Der Fokusring ist eine Zustandsanzeige und trägt die Marke. Im Plugin
     steht er als fertiger Schatten mit eingebautem Grün; ohne diese Zeile
     leuchtete er auf einer roten Seite grün — von allen Lücken der Brücke
     die, die am stärksten nach Fehler aussieht.

     Zusammengesetzter Wert, also keine bloße Weiterreichung: `color-mix`
     rührt ihn aus der Markenfarbe selbst an. Damit folgt der Ring jedem
     Kundentheme, ohne dass hier eine zweite Farbe stünde.

     Zwei Ringe, nicht einer. Die Fassung des Plugins ist eine einzelne
     durchscheinende Fläche mit 28 % Deckung; nachgerechnet sind das gegen
     Creme 1.53:1, gegen Weiß kaum mehr. WCAG 2.1 verlangt für die
     Fokusanzeige 3:1 gegen die Umgebung (1.4.11), und mit einer Deckung
     erreicht man das nicht — selbst 55 % kommen nur auf 2.45:1. Innen liegt
     deshalb ein deckender Ring von 2px, der die 3:1 trägt (gegen Creme
     5.53:1); der weiche Saum außen bleibt, weil er den Ring auf getönten und
     dunklen Flächen ablöst. */
  --lwb-focus:
    0 0 0 2px var(--wp--preset--color--brand-500, #157d5f),
    0 0 0 5px color-mix(in srgb, var(--wp--preset--color--brand-500, #157d5f) 25%, transparent);

  /* Nicht überschrieben: --lwb-sh-sm/md/lg. Die drei Schatten sind
     zusammengesetzte Werte auf rgba(13,21,32,…) — neutral genug, um sie dem
     Plugin zu lassen. Ein Schatten, der die Marke trägt, ist eine eigene
     Entscheidung und keine Lücke. */
}

/* Die Schrift der B2B-Oberflächen.

   Hier stand einmal die Brücke `--lwb-font-sans`/`--lwb-font-num` auf die
   Presets `sans` und `mono`. Die Presets gibt es, die Token liest das Plugin
   aber nirgends — es erbt seine Schrift schlicht von `<body>`. Zwei Zeilen,
   die eine Verbindung behaupteten, die es nicht gab.

   Ersetzt durch die Fassung, die wirklich wirkt: die Familie steht auf den
   Wurzeln. Der Grund, das überhaupt zu sagen statt weiter zu erben,
   ist das Kindtheme — sobald eines eine Serife für Überschriften setzt, holt
   sich `styles.elements.heading` aus theme.json auch die Überschriften des
   Shops.

   **Auf allen sechs Wurzeln, seit dem 2026-08-13.** Bis dahin standen hier
   drei, und die Lücke war dieselbe wie eine Etage höher bei den Token, nur
   eine Ebene tiefer: `.lotzwoo-favorites`, `.lotzwoo-locations` und
   `.lotzwoo-ordercontext` bekamen die Token von AP-25, aber keine der Regeln,
   die sie benutzen. Auf Bersta gemessen kamen die Überschriften der drei
   Konto-Flächen in **Bitter** statt in **Inter** — die Serife des
   Kundenthemes mitten in der Bedienoberfläche. Auf dem Basistheme war nichts
   zu sehen, weil dort beide Rollen dieselbe Grotesk tragen; deshalb hat es
   niemand bemerkt, und deshalb wird auch hier nichts rot.

   Die Regel gilt für die Wurzel und nicht nur für die Überschrift, obwohl auf
   Bersta heute nur die Überschrift abweicht: `<body>` trägt dort zufällig
   dieselbe Grotesk. Ein Kundentheme mit einer eigenen Fließtextschrift
   verschöbe sonst die ganze Fläche, und der Befund käme ein drittes Mal.

   Ab `h2` ist das nicht gemeint. Was der Shop unterhalb der Seitenüberschrift
   an Überschriften setzt, sind Bedienbeschriftungen — Filtergruppen, der Kopf
   der Schnellerfassung, die Kontextschritte, der Kopf der Nachbestellseite.
   Sie gehören zur Oberfläche und nicht zur Drucksache, und sie erben deshalb
   die Schrift der Wurzel.

   Die `h1` ist die Ausnahme, und zwar bewusst: es gibt genau eine
   (`.lwb-head__title h1`, die Sortimentsüberschrift), sie ist der Titel der
   Seite und nicht Teil des Bedienwerks. Sie ist zugleich die Stelle, an der
   Website und Shop sich berühren — und der bruchfreie Übergang zwischen
   beiden war die Begründung von ADR 004. Sie trägt deshalb die Serife des
   Kundenthemes, so wie jeder andere Seitentitel auch.

   Die Ziffernschrift der Matrix (tabellarische Ziffern auf Preis-, Mengen-
   und Artikelnummernspalten) bleibt offen und gehört ins Plugin-Repo — sie
   braucht die Zellen, nicht die Wurzel. */
.lotzwoo-b2b-shop,
.lotzwoo-reorder,
.lotzwoo-favorites,
.lotzwoo-locations,
.lotzwoo-standing-orders,
.lotzwoo-ordercontext,
.lotzwoo-contextcard,
.lotzwoo-overview,
.lotzwoo-heldback,
.woocommerce-MyAccount-content,
.woocommerce-MyAccount-navigation {
  font-family: var(--wp--preset--font-family--sans, "Inter", "Segoe UI", system-ui, sans-serif);
}

/* `.lotzwoo-heldback` steht hier aus genau dem Grund, den der Absatz oben
   nennt, und er ist am 2026-08-12 im Browser sichtbar geworden: die
   Überschrift der Sektion kam in der Serife des Kundenthemes: Bersta setzt
   `styles.elements.heading`, und die Sektion ist keine Drucksache, sondern
   eine Bedienbeschriftung im Warenkorb. Genau derselbe Befund stand am
   2026-08-13 auf den drei Konto-Flächen — dort ist es die einzige Stelle, an
   der die fehlende Wurzel überhaupt sichtbar wurde. */
.lotzwoo-b2b-shop :is(h2, h3, h4, h5, h6),
.lotzwoo-reorder :is(h2, h3, h4, h5, h6),
.lotzwoo-favorites :is(h2, h3, h4, h5, h6),
.lotzwoo-locations :is(h2, h3, h4, h5, h6),
.lotzwoo-ordercontext :is(h2, h3, h4, h5, h6),
.lotzwoo-contextcard :is(h2, h3, h4, h5, h6),
.lotzwoo-overview :is(h2, h3, h4, h5, h6),
.lotzwoo-heldback :is(h2, h3, h4, h5, h6),
/* **Zwei Wurzeln fehlten, und der Absatz darueber sagt schon warum**
   (2026-08-26). Gemeldet als „diese h2 sind nicht Inter wie die anderen":
   „Rechnungsadresse", „Lieferadresse", „Darstellung" und „Daueraufträge"
   standen in Bitter, „Nachbestellen" daneben in Inter. Gemessen — an allen
   vier gewinnt `h1, h2, h3, h4, h5, h6 { font-family: serif }` aus
   `theme.json`, weil keine Wurzel darueber diese Regel zurueckholt.

   Die Liste eine Ebene hoeher (Zeile 226 ff.) fuehrt
   `.woocommerce-MyAccount-content` laengst; nur hier fehlte sie. Das ist
   dieselbe Luecke, die der Absatz darueber fuer `.lotzwoo-heldback`
   beschreibt — eine Wurzel, die in einer der zwei Listen steht und in der
   anderen nicht, faellt erst an einer Ueberschrift auf. */
.lotzwoo-standing-orders :is(h2, h3, h4, h5, h6),
.woocommerce-MyAccount-content :is(h2, h3, h4, h5, h6) {
  font-family: inherit;
}

/* Die Rahmen der Bedienelemente — ein Provisorium mit Verfallsdatum.

   WCAG 1.4.11 verlangt 3:1 für das, was ein Bedienelement als Bedienelement
   kenntlich macht. Das Plugin zieht diese Rahmen aus `--lwb-ink-200` — und
   aus derselben Variable auch die Kanten von Karten, Tabellen und Panels.
   Für eine Trennlinie ist ein zarter Strich richtig und ausdrücklich
   ausgenommen; für ein Auswahlfeld ist er es nicht. Ein Token, zwei Rollen:
   über die Token-Brücke ist das nicht zu trennen, egal welchen Wert man
   einsetzt. Zarte Linie heißt unsichtbare Felder, sichtbare Felder heißt
   eine Oberfläche aus lauter Kästen.

   Deshalb hier, ausnahmsweise, über Klassennamen des Plugins statt über
   Token. Es ist die dritte Kopplung zwischen den Repos und die einzige, die
   nicht bleiben soll: sobald `b2b-tokens.css` eine eigene Rolle für den
   Rahmen eines Bedienelements hat, ist dieser Block ersatzlos zu löschen.
   Bis dahin ist die Alternative, eine bekannte Barriere auszuliefern.

   Es ist kein Nachbau: keine dieser Regeln bringt eine Gestalt mit, jede
   ändert genau eine Farbe an einem Element, das es schon gibt.

   Der Befund ist älter als die Umfärbung — `#dbe1e8` auf Weiß sind 1.32:1 —
   und überlebt sie, weil auch die warme Linie bei 1.30:1 liegt.

   Favoriten und Orte stehen seit dem 2026-08-13 mit drin. Sie hatten dieselben
   Felder aus derselben Variable und standen nur deshalb nicht hier, weil die
   Liste beim Schreiben dieses Blocks zwei Wurzeln kannte. Eine Barriere hört
   nicht am Endpunkt auf.

   Zwei Dinge, die die Liste bewusst *nicht* enthält:

   * `.lotzwoo-locations__set--active`. Es sieht aus wie ein Bedienelement mit
     zarter Kante, hat aber als einziges hier eine eigene Rahmenfarbe im
     Überfahren (`.lotzwoo-locations__set:hover` → `brand-600`, gleiche
     Spezifität wie diese Regel). Aufgenommen bekäme der Knopf beim Überfahren
     einen grauen Ring um eine markenfarbene Fläche. Der Zustand ist selten und
     der Schaden sichtbar; der Rahmen bleibt, wie er ist.
   * `.lotzwoo-ordercontext`. Diese Fläche hat keine Bedienelemente — sie ist
     eine Tabelle mit Abzeichen in Woos eigener Bestellansicht. Ihre Kanten
     sind Trennlinien, und für die ist der zarte Strich ausdrücklich richtig.

   Eine Eigenschaft dieser Regelform, die schon für `.lotzwoo-reorder__termin`
   galt und jetzt auch für `.lotzwoo-locations__select` gilt: sie schlägt das
   `:focus-visible` des Plugins, weil beide auf (0,2,0) liegen und diese Datei
   später kommt. Der Fokus bleibt trotzdem angezeigt — er hängt am
   `box-shadow` aus `--lwb-focus`, nicht am Rahmen —, aber er wechselt die
   Rahmenfarbe nicht mehr. Am 2026-08-13 auf beiden Themes nachgemessen. */
.lotzwoo-b2b-shop :is(.lwb-input, .lwb-select, .lwb-qty, .lwb-viewswitch, .lwb-pill, .lwb-scantoggle, .lwb-btn--secondary),
.lotzwoo-reorder :is(.lotzwoo-reorder__all, .lotzwoo-reorder__termin),
.lotzwoo-reorder__pager .button,
.lotzwoo-favorites :is(.lotzwoo-favorites__pill, .lotzwoo-favorites__qty, .lotzwoo-favorites__remove),
.lotzwoo-favorites__more .button,
.lotzwoo-locations .lotzwoo-locations__select {
  border-color: var(--wp--preset--color--ink-350, #808d9d);
}

/* ==================================================================
   Der Warenkorb-Slot und die Sektion, die das Plugin hineinzeichnet.

   Ticket 15. Das Theme liefert den Ort (`<div id="lotzwoo-cart-slot">` aus dem
   `render_callback` von `lotzwoo/cart-slot`), das Plugin füllt ihn aus der
   Store-API-Cart: den Versand-Hinweis und die Sektion der zurückgehaltenen
   Positionen. Beides hatte bis hierher **null** CSS-Regeln — Posten 6 der
   Nachbarkarte hat am 2026-08-11 mit echtem Browser gemessen, dass die Sektion
   ungestaltet unter dem Bestellknopf landete. Für FR-CTX-06b ist das dasselbe
   wie „nicht da".

   ## Der Anker im Flex-Container, und warum `order: -1`

   `.wp-block-woocommerce-filled-cart-block` ist `display:flex; flex-wrap:wrap`
   mit zwei Kindern: Positionen 65 %, Summen 35 % (gemessen in Woos `cart.css`).
   Der Anker steht im Markup **zwischen** beiden — das ist die Entscheidung aus
   Ticket 15, Frage 3, und sie gilt für Vorlesereihenfolge und Tastatur.

   Sichtbar wäre er dort aber der Bruch der zwei Spalten: ein drittes Kind mit
   100 % Breite umbricht und schiebt die Summen in eine dritte Zeile — aus dem
   Warenkorb würde ein Stapel. Ein Kind, das nur so breit ist wie die linke
   Spalte, hat dasselbe Problem eine Stufe milder.

   Deshalb `order: -1`: die Sektion wird als Band über **beide** Spalten
   gezeichnet, die Spalten bleiben, wie sie sind. Der Zweck der Übung ist damit
   erfüllt und mehr als das — der Kunde sieht die zurückgehaltenen Positionen,
   bevor sein Blick überhaupt in die rechte Spalte fällt.

   Ein Grid aus dem Flex-Container zu machen (Sektion unter den Positionen,
   Summen rechts oben) wäre die schönere Anordnung und ist verworfen: es hieße,
   Woos Breiten an den inneren Klassen zu überschreiben, und bricht beim
   nächsten Umbau dieser Klassen an einer Stelle, die niemand mit dieser Datei
   in Verbindung bringt.

   ## `:empty` und der Zwischenzustand

   Ohne Plugin — und heute auch **mit** ihm, solange `MOUNT_ID` in
   `b2b-cart.js` noch `lotzwoo-heldback-blocks` heißt — bleibt das Div leer.
   `display:none` nimmt es dann ganz aus dem Flex-Container: kein Kind, keine
   `blockGap`-Lücke, Höhe 0. Genau die Sorge, die beim Kopf-Slot zur leeren
   Zeichenkette geführt hat, hier aber ohne Verzicht auf den Anker lösbar.
   ================================================================== */

#lotzwoo-cart-slot {
  flex: 0 0 100%;
  order: -1;
}

#lotzwoo-cart-slot:empty {
  display: none;
}

/* ==================================================================
   Die leere Huelle eines Template-Parts.

   `parts/navigation.html` und `parts/footer-links.html` sind in der Basis
   leer — die Seitenstruktur eines Kunden gehoert ins Kindtheme (AD-11). Der
   Block `core/template-part` rendert trotzdem seinen Rahmen: ein
   `<div class="wp-block-template-part">` ohne Inhalt. Gemessen am 2026-08-12,
   Basis-Theme allein, 1440px: der Knopf „Zum Sortiment" ruecken damit 24px
   nach rechts, und ueber der Copyright-Zeile stehen 24px zu viel — zwei
   `blockGap`-Luecken um nichts.

   Zwei Regeln, weil zwei Layouts betroffen sind. `display:none` nimmt die
   Huelle aus dem Flex-Container des Kopfes. Im Fuss genuegt das **nicht**:
   die `constrained`-Anordnung setzt den Abstand ueber `* + *`, und ein
   ausgeblendetes Element bleibt ein Geschwister. Deshalb die zweite Regel.

   `:empty` und nicht „Datei weglassen": ohne Datei zeigte der Website-Editor
   den Part als geloescht an, und ein Kindtheme haette keine Vorlage zum
   Aufmachen.
   ================================================================== */

.wp-block-template-part:empty {
  display: none;
}

.wp-block-template-part:empty + * {
  margin-block-start: 0;
}

/* Der Versand-Hinweis. Er trägt Woos `woocommerce-info` und bekommt von dort
   eine Grundgestalt; hier steht nur, was ihn in diesen Entwurf einpasst.
   Bewusst über Presets statt über die Token-Brücke: er liegt als Geschwister
   **neben** `.lotzwoo-heldback` im Slot und damit außerhalb jeder Token-Wurzel.
   Eine vierte Wurzel für eine Regel wäre der teurere Weg. */
#lotzwoo-cart-slot .lotzwoo-shipping-blocked {
  margin: 0 0 var(--wp--preset--spacing--40);
  border-left: 3px solid var(--wp--preset--color--info-500);
  background: var(--wp--preset--color--info-50);
  padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
  color: var(--wp--preset--color--ink-700);
  font-size: var(--wp--preset--font-size--md);
}

/* Die Sektion selbst.

   Sie ist ein Ausnahmezustand und keine Fläche wie jede andere: hier steht,
   was der Kunde bestellt hat und **nicht** bekommt. Deshalb der warme Ton der
   Warnrolle und eine sichtbare Kante — kein Rot, denn es ist kein Fehler,
   sondern eine Auskunft über die Freigaben seines Kontos.

   Die Farben kommen aus `--lwb-*`; die Wurzel oben in dieser Datei übersetzt
   sie aus theme.json. Ein Kundentheme mit anderer Warnfarbe färbt die Sektion
   damit mit, ohne diese Regeln anzufassen. */
.lotzwoo-heldback {
  margin: 0 0 var(--wp--preset--spacing--50);
  border: 1px solid var(--lwb-warn-500);
  border-radius: 8px;
  background: var(--lwb-warn-50);
  padding: var(--wp--preset--spacing--40);
  color: var(--lwb-ink-900);
}

.lotzwoo-heldback__title {
  margin: 0;
  font-size: var(--wp--preset--font-size--lg);
  font-weight: 600;
  line-height: 1.2;
}

.lotzwoo-heldback__hint {
  margin: var(--wp--preset--spacing--10) 0 0;
  color: var(--lwb-ink-600);
  font-size: var(--wp--preset--font-size--md);
}

.lotzwoo-heldback__list {
  margin: var(--wp--preset--spacing--40) 0 0;
  padding: 0;
  list-style: none;
}

/* Eine Zeile je Position: Bezeichnung und Menge links, Grund und die Knöpfe
   rechts. `flex-wrap`, weil die Bezeichnung eines Großhandelsartikels lang ist
   und drei Knöpfe daneben auf einem Telefon keine Zeile mehr ergeben.

   Die Linie steht **über** jeder Zeile und nicht unter ihr: so trägt die
   erste Zeile die Trennung zur Überschrift, und unter der letzten bleibt keine
   Linie ohne Gegenüber. */
.lotzwoo-heldback__item {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
  border-top: 1px solid var(--lwb-warn-500);
  padding: var(--wp--preset--spacing--30) 0;
}

.lotzwoo-heldback__label {
  flex: 1 1 16rem;
  font-weight: 600;
}

/* Tabellarische Ziffern: Mengen stehen untereinander und sollen sich vergleichen
   lassen. Dieselbe Rolle, die die Matrix des Shops der Ziffernschrift gibt. */
.lotzwoo-heldback__qty {
  font-family: var(--wp--preset--font-family--mono);
  font-variant-numeric: tabular-nums;
  color: var(--lwb-ink-700);
}

/* Der Grund ist die Antwort auf die Frage „warum fehlt das?" und damit das
   Wichtigste an der Zeile nach der Bezeichnung. Er steht als Plakette, damit er
   nicht als Fließtext neben den Knöpfen untergeht. */
.lotzwoo-heldback__reason {
  flex: 0 1 auto;
  max-width: 100%;
  border-radius: 999px;
  background: var(--lwb-surface);
  padding: 2px 10px;
  color: var(--lwb-ink-700);
  font-size: var(--wp--preset--font-size--sm);
}

/* Die vier Knöpfe der Sektion tragen Woos `button`-Klasse. Auf einer
   Block-Seite ist die ungestaltet — Woos klassisches CSS greift nur unter
   `.woocommerce` —, sie kämen also als Systemknöpfe des Browsers.

   Zweitrangige Form für die drei Zeilenknöpfe: sie sind Korrekturen an einer
   Auskunft, nicht der Weg nach vorn. Der Rahmen kommt aus der Rolle
   „Rahmen Bedienelement" (`--wp--preset--color--ink-350`), die WCAG 1.4.11
   trägt — dieselbe Begründung wie beim Provisorium weiter oben. */
.lotzwoo-heldback .button {
  border: 1px solid var(--wp--preset--color--ink-350, #808d9d);
  border-radius: 8px;
  background: var(--lwb-surface);
  padding: 6px 12px;
  color: var(--lwb-ink-900);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  line-height: 1.2;
  cursor: pointer;
}

.lotzwoo-heldback .button:hover {
  background: var(--lwb-ink-100);
}

.lotzwoo-heldback .button:focus-visible {
  outline: none;
  box-shadow: var(--lwb-focus);
}

/* „Alles wieder aufnehmen" ist der einzige Knopf, der etwas voranbringt, und
   steht deshalb allein und in der Markenfarbe. */
.lotzwoo-heldback__reactivate-all {
  margin-top: var(--wp--preset--spacing--40);
}

.lotzwoo-heldback .lotzwoo-heldback__reactivate-all {
  border-color: var(--lwb-brand-500);
  background: var(--lwb-brand-500);
  color: var(--lwb-surface);
}

.lotzwoo-heldback .lotzwoo-heldback__reactivate-all:hover {
  border-color: var(--lwb-brand-600);
  background: var(--lwb-brand-600);
}

/* ==================================================================
   Systemregeln des Entwurfs.

   Was hier steht, gilt für jedes Kundentheme. Eine Regel, die nur für einen
   Kunden gilt, gehört ins Kindtheme — die Frage ist bei jeder neuen Zeile
   zuerst zu stellen.
   ================================================================== */

/* Zurückhaltung beim Rot: Fließtext-Links tragen Tinte mit farbigem
   Unterstrich und nehmen die Markenfarbe erst beim Überfahren an.

   Der Grund, warum die Regel hier steht und nicht in theme.json: `elements.link`
   kennt `color.text` und `typography.textDecoration`, aber kein
   `text-decoration-color` — in keiner Schemaversion. Die Regel ist dort nicht
   formulierbar.

   Der Grund, warum sie ins Basistheme gehört und nicht ins Kindtheme: sie ist
   eine Eigenschaft des Entwurfssystems, nicht einer Marke. Jeder Kunde mit
   einer kräftigen Markenfarbe will sie — ein Fließtext, in dem jeder Link
   farbig leuchtet, ist unruhig, und bei den meisten Markenfarben ist er
   zugleich der Kontrastfehler.

   Bewusst schwach gehalten: kein `!important`, keine ID. Wer sie nicht will,
   überschreibt `elements.link` im eigenen theme.json und gewinnt.

   Nur in `main`: Kopf- und Fußbereich haben ihre eigenen Zustände.

   Und ausdrücklich nicht in den B2B-Oberflächen. Sie liegen mit im `<main>`,
   sind aber keine Drucksache: dort sind Links Knöpfe, Reiter und Zeilen mit
   eigenen Zuständen aus `b2b-shop.css`. Die Ausnahmen stehen in `:where()`
   und wiegen deshalb nichts — das hält die Regel bei einer Klasse Gewicht:
   schwer genug, um `elements.link` aus theme.json zu schlagen (das braucht
   sie, sonst bliebe der Link farbig), leicht genug, damit jede Plugin-Regel
   mit zwei Klassen sie schlägt.

   **Alle sechs Wurzeln, seit dem 2026-08-13.** Die Ausnahmeliste stand auf
   denselben zwei wie die Schrift darüber, und das ist derselbe Fehler in
   umgekehrter Richtung: statt einer fehlenden Regel eine Regel, die zu weit
   greift. Am 2026-08-13 mit einer Sonde je Wurzel gemessen — auf
   `.lotzwoo-favorites`, `.lotzwoo-locations`, `.lotzwoo-ordercontext` und
   `.lotzwoo-heldback` kam der Fließtext-Ton der Website (`ink-900` mit
   Markenunterstrich) statt der Bedienfarbe der Fläche.

   Sichtbar wurde davon bis heute wenig, und das ist kein Gegenargument,
   sondern die Beschreibung des Musters: die Plugin-Regeln mit zwei Klassen
   schlagen diese hier, wie der Absatz oben es vorsieht. Es traf genau die
   Links mit *einer* Klasse — `.lotzwoo-locations__empty-link` (Leerzustand)
   und `.lotzwoo-favorites__status a`. Beide sind Zustände, die man selten
   sieht, und beide standen falsch, sobald man sie sah. */
main a:not(.wp-element-button):not(:where(.wp-block-navigation-item__content, .wc-block-components-button, .lotzwoo-b2b-shop a, .lotzwoo-reorder a, .lotzwoo-favorites a, .lotzwoo-locations a, .lotzwoo-ordercontext a, .lotzwoo-heldback a)) {
  color: var(--wp--preset--color--ink-900);
  text-decoration-color: var(--wp--preset--color--brand-500);
  text-decoration-thickness: 1.5px;
  text-underline-offset: .18em;
}

main a:not(.wp-element-button):not(:where(.wp-block-navigation-item__content, .wc-block-components-button, .lotzwoo-b2b-shop a, .lotzwoo-reorder a, .lotzwoo-favorites a, .lotzwoo-locations a, .lotzwoo-ordercontext a, .lotzwoo-heldback a)):hover,
main a:not(.wp-element-button):not(:where(.wp-block-navigation-item__content, .wc-block-components-button, .lotzwoo-b2b-shop a, .lotzwoo-reorder a, .lotzwoo-favorites a, .lotzwoo-locations a, .lotzwoo-ordercontext a, .lotzwoo-heldback a)):focus-visible {
  color: var(--wp--preset--color--brand-500);
}

/* Ueberschriften brechen. Deutsch tut das von selbst nicht.

   Der Befund, am 2026-08-12 gemessen: `/datenschutz/` lief bei 390px um 50px
   waagrecht ueber — `.entry-content` 409px in 343px verfuegbarer Breite. Nicht
   der Inhalt war es, sondern die Ueberschrift: „Datenschutzerklaerung" mit
   `has-6-xl-font-size` bei 38,4px, **ein Wort**, das laenger ist als der Kasten.
   Ein Wort ist fuer den Umbruch eine unteilbare Einheit; der Kasten gibt nach,
   nicht das Wort.

   Die Regel steht deshalb hier und nicht an dieser Seite. Es ist keine
   Eigenheit der Datenschutzerklaerung, es ist die Sprache: „Lieferbedingungen",
   „Mindestbestellwert", „Bestellannahmezeiten", „Verbraucherstreitbeilegung" —
   jede kuenftige Ueberschrift jedes Kunden kann es ausloesen, und je groesser
   der Schriftgrad, desto frueher. Am Titel repariert waere es einmal repariert.

   ## Warum zwei Eigenschaften, und welche die Zusage traegt

   `overflow-wrap: break-word` **traegt sie**: es bricht ein Wort, das allein
   auf seiner Zeile nicht passt, und nur dann. Gemessen: 409/343 -> 343/343,
   der Ueberlauf der Seite faellt von 50px auf 0.

   `hyphens: auto` ist die typografisch bessere Antwort auf ein Kompositum —
   „Datenschutz-erklaerung" statt eines Schnitts mitten im Wort — und steht
   deshalb zuerst: wo der Browser trennen kann, trennt er, und `break-word`
   kommt gar nicht erst zum Zug. Es traegt die Zusage aber **nicht**, und das
   ist gemessen und nicht vermutet: der Messrechner (Chrome 151, Linux) bringt
   keine Trenn-Woerterbuecher mit. Dort ist `hyphens: auto` wirkungslos — „120px
   breiter Kasten, `Datenschutzerklaerung`, `hyphens:auto` gegen `hyphens:none`:
   beide 140px, beide einzeilig". Auf den Browsern der Besucher (Windows, macOS,
   Firefox) greift es, hier ist es nicht nachweisbar. Eine Regel, deren Wirkung
   man auf der eigenen Werkbank nicht sehen kann, darf nicht die einzige sein.

   ## Nicht `overflow-wrap: anywhere`, und das ist dieselbe Entscheidung wie bei
   der Tabelle

   Bei `.wp-block-table` (siehe unten) wurde `anywhere` verworfen. Der Grund
   gilt hier fort, nur an anderer Stelle: `anywhere` zaehlt beim Ermitteln der
   kleinstmoeglichen Breite mit und laesst damit Kaesten schrumpfen, die gar
   nicht ueberlaufen. `break-word` tut das nicht — es greift erst, wenn wirklich
   kein Platz mehr ist. Beide erreichen hier dasselbe (gemessen: `anywhere` und
   `break-word` liefern auf `/datenschutz/` identisch 343/343, zwei Zeilen,
   92,2px Hoehe); `break-word` erreicht es ohne die Nebenwirkung. Es ist
   ausserdem das, was der Kern selbst auf `.wp-block-column` setzt.

   Kein `!important`, kein Klassengewicht: ein Kindtheme, das fuer eine
   bestimmte Ueberschrift etwas anderes will, ueberschreibt das mit einer
   einzigen Zeile.

   Bei 1440px aendert die Regel nichts — dort passt jedes dieser Woerter, und
   eine Umbruchregel, die auf dem Schreibtisch etwas verschiebt, waere zu breit
   geraten. Nachgemessen an sechs Seiten. */
main :is(h1, h2, h3, h4, h5, h6) {
  hyphens: auto;
  overflow-wrap: break-word;
}

/* Die Trennlinie — das meistwiederholte Element der Website.

   Fuenf bis acht pro Seite, und bis zum 2026-08-11 das einzige, das nicht nach
   der Marke aussah: gemessen 100px breit, `border-bottom: 2px solid
   rgb(128, 128, 128)`. Das ist WordPress' Werkseinstellung, unveraendert
   ausgeliefert — ein grauer Strich von Daumenlaenge mitten in einer Seite, die
   sonst durchgehend in `ink-200` gehalten ist.

   ADR 004 verlangt an dieser Stelle das Gegenteil: „feine Linien statt Kaesten",
   und `--linie` = `#E4DACA`, im Theme das Preset `ink-200`. Der Entwurf setzt
   sie ueberall gleich — Kopfunterkante, Fusskante, Datenzeilen —, immer
   `1px solid var(--linie)` und immer ueber die volle Breite.

   Deshalb hier: volle Inhaltsbreite, 1px, Preset-Farbe. Drei Werte, drei
   Messungen dagegen.

   `currentColor` statt der Variable direkt im Rahmen: waehlt jemand im Editor
   eine Farbe, setzt WordPress `.has-…-color` mit `!important` auf `color` — der
   Rahmen folgt dann von selbst. Stuende das Preset im `border-top`, gaebe es
   eine Farbwahl, die sichtbar nichts tut.

   `is-style-dots` bleibt ausgenommen. Die Punktvariante des Kerns zeichnet ihr
   Muster als `::before` und schaltet dafuer `border` und `background` per
   `!important` ab; eine Randregel darauf waere eine Regel, die aussieht, als
   griffe sie. Wer Punkte waehlt, hat etwas anderes gemeint als eine Linie.

   `opacity: 1` ist kein Zierrat: der Kern vergibt auf jeder Trennlinie die
   Klasse `has-alpha-channel-opacity` (an allen 21 Linien der sechs Seiten
   nachgesehen), und daran haengt in aelteren Kernfassungen eine Deckung von
   0.4. Eine Linie, die schon zart ist, darf nicht auch noch halb da sein. */
.wp-block-separator:not(.is-style-dots) {
  border: 0;
  border-top: 1px solid currentColor;
  color: var(--wp--preset--color--ink-200);
  opacity: 1;
}

/* Die Breite braucht einen eigenen, schwereren Selektor — nachgemessen, nicht
   vorsorglich. Die 100px stehen nicht im Blockstylesheet, sondern in
   `blocks/separator/theme.min.css`, das erst durch
   `add_theme_support('wp-block-styles')` geladen wird:

     .wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}

   Das sind drei Klassen Gewicht. Die Regel darueber wiegt zwei, und die erste
   Fassung dieser Datei hat deshalb Farbe und Staerke gesetzt, die Breite aber
   nicht — im Browser gemessen: `1px solid rgb(228, 218, 202)` bei weiterhin
   100px. Ein `hr` davor bringt ein Element mehr und gewinnt, ohne dass hier ein
   `!important` stuende. Der Block rendert immer ein `hr`.

   `is-style-wide` bleibt ausgenommen wie beim Kern — diese Variante ist ohnehin
   schon voll breit, und der Selektor bliebe sonst hinter dem des Kerns. */
hr.wp-block-separator:not(.is-style-wide):not(.is-style-dots) {
  width: 100%;
}

/* Die Tabelle — und die Spalte, deren Verschwinden eine Rechtsfolge hat.

   `grep wp-block-table style.css` gab bis zum 2026-08-11 null Treffer: die
   Tabellen der Website standen unveraendert auf WordPress' Werkseinstellung.
   Die ist ein Gitter — `td, th { border: 1px solid }` plus
   `thead { border-bottom: 3px solid }` —, also genau das Gegenteil dessen, was
   ADR 004 verlangt. Der Entwurf kennt ueberhaupt keine `<table>`; sein
   Tabellenbild ist `dl.daten`: Versalien-Label in `.8rem` ueber dem Wert, je
   Zeile eine Linie in `--linie`, keine senkrechte Kante, keine Fuellung. Das
   ist hier nachgebaut.

   ## Der eigentliche Befund

   Drei Tabellen sind breiter als ihr Kasten. Die Empfaenger-Tabelle der
   Datenschutzerklaerung misst 538px in 358px verfuegbarer Breite — die dritte
   Spalte „Grundlage", die Rechtsgrundlagen, liegt ausserhalb des Sichtfelds.
   Impressum 408px in 391px und 391px in 358px, mitten im Wort abgeschnitten.

   Der Kern legt auf `figure.wp-block-table` bereits `overflow-x: auto` (an
   allen fuenf erreichbaren Tabellen nachgemessen). Der Inhalt ist also nicht
   weg, er ist nur nicht auffindbar: nichts am Bild sagt, dass rechts noch etwas
   steht. Das ist der Befund — nicht „abgeschnitten", sondern „lautlos".

   ## Zwei Griffe, in dieser Reihenfolge

   **Erstens weniger Ueberlauf.** `hyphens: auto` greift dort, wo der Browser
   deutsche Trennstellen kennt — die Seite traegt `lang="de"`. Zwei der drei
   Faelle liegen nur 17px bzw. 33px ueber ihrem Kasten; ein Trennstrich in
   „Bezirkshauptmannschaft" loest sie ganz auf.

   Nicht `overflow-wrap: anywhere`: das schrumpfte die Tabelle zuverlaessig,
   indem es mitten in Woertern bricht — auf einer Seite mit Firmenbuchnummern
   und Paragraphen ist das schlechter lesbar als ein Bildlauf.

   **Zweitens ein sichtbarer Rand am Schnitt.** Vier Ebenen: zwei Deckel, die
   mit dem Inhalt wandern (`local`), und darunter zwei Schatten, die an der
   Kapsel kleben (`scroll`). Am Anfang liegt der linke Deckel ueber dem linken
   Schatten und loescht ihn; sobald gescrollt wird, wandert er weg und der
   Schatten erscheint. Das Ergebnis ist ein Hinweis, der sich selbst
   zurueckzieht: er steht genau dann, wenn dort wirklich noch etwas ist, und
   erscheint auf keiner der fuenf Tabellen, die ohnehin passen. Kein
   JavaScript.

   Die Deckelfarbe ist `surface`. Auf dem aktiven Kindtheme ist das die
   Seitenflaeche selbst (Creme `#fbf7f0`), also exakt richtig; im blanken
   Basistheme steht `#ffffff` gegen einen Grund von `#f7f9fb` — 1.02:1, an einem
   weich auslaufenden 32px-Streifen nicht zu sehen. Der Schatten wird per
   `color-mix` aus `ink-900` angeruehrt und folgt damit dem Kundentheme, ohne
   dass hier ein zweiter Farbwert stuende.

   ## Was bewusst NICHT hier steht

   **Kein `tabindex="0"` auf der Kapsel.** Der uebliche Rat setzt es
   unbedingt — und damit auf jede Tabelle, auch auf die, die passt. Gemessen an
   Chrome 151: eine Kapsel, die ueberlaeuft, bekommt von selbst einen
   Tabulator-Halt, eine passende nicht. Der Browser tut also bereits genau das
   Bedingte, das eine feste Auszeichnung nur unbedingt koennte. Fuenf der acht
   Tabellen dieser Website passen; sie bekaemen einen Halt, an dem nichts zu tun
   ist.

   **Kein Umbau auf Kartenstapel je Zeile.** Die Form waere besser — nichts
   muesste sich mehr bewegen —, aber sie braucht je Zelle die Beschriftung ihrer
   Spalte aus der Kopfzeile. Fuenf Tabellen dieser Website haben heute eine
   **leere** Kopfzeile (Befund S6, ein Fehler des Importskripts): jeder Wert
   bekaeme eine leere Beschriftung. Die Form ist erst zu haben, wenn die
   Kopfzeilen stimmen — dann ist sie es wert.

   Schirmleseprogramme sind von alldem nicht betroffen: `overflow` verbirgt
   nichts vor ihnen, die dritte Spalte wurde immer vorgelesen. Der Befund war
   ein sehender Befund, und die Loesung ist es auch.

   ## Nachtrag 2026-08-12: die Ueberschriftenregel entscheidet dasselbe
   ## scheinbar andersherum

   Weiter oben steht seit heute „Ueberschriften brechen. Deutsch tut das von
   selbst nicht." — eine Regel, die Woerter **bricht**, waehrend diese hier das
   ausdruecklich nicht will. Beide Begruendungen sollen voneinander wissen,
   deshalb dieser Absatz.

   Es ist kein Widerspruch, sondern zwei Faelle: eine ueberlaufende Zelle liegt
   in einer Kapsel mit Bildlauf und sichtbarem Rand und ist damit
   **erreichbar** — eine ueberlaufende Ueberschrift schiebt die ganze Seite auf
   und nimmt jede andere Zeile mit. Die Zelle hat ein Auffangnetz, die
   Ueberschrift hat keines. Und was dort gewaehlt wurde, ist nicht das hier
   verworfene `anywhere`, sondern `break-word`: der Einwand oben („schrumpfte
   die Tabelle") trifft es nicht, weil `break-word` bei der kleinstmoeglichen
   Breite nicht mitzaehlt und deshalb keinen Kasten schrumpft.

   Zwei Zahlen dazu, damit hier niemand aus dem Text auf eine Wirkung schliesst,
   die nie jemand gesehen hat: die beiden Impressum-Tabellen messen am
   2026-08-12 bei 390px **407/343** und **384/343** — sie laufen weiterhin ueber
   und leben von der Kapsel, nicht vom Trennstrich. Der Messrechner (Chrome 151,
   Linux) bringt keine Trenn-Woerterbuecher mit; nachgeprueft an einem 120px
   breiten Kasten mit „Datenschutzerklaerung": `hyphens:auto` und `hyphens:none`
   ergeben beide 140px und eine Zeile. `hyphens: auto` ist auf dieser Werkbank
   also **nicht pruefbar**. Die Zeile bleibt, weil sie auf den Browsern der
   Besucher greift — sie ist eine Verbesserung, keine Zusage. Die Zusage traegt
   hier die Kapsel und bei den Ueberschriften `break-word`. */
.wp-block-table {
  overflow-x: auto;

  /* Reihenfolge: die zuerst genannte Ebene liegt oben. Die Deckel muessen
     ueber den Schatten liegen, sonst loeschen sie nichts. */
  background-image:
    linear-gradient(to right, var(--wp--preset--color--surface, #fff), transparent),
    linear-gradient(to left,  var(--wp--preset--color--surface, #fff), transparent),
    linear-gradient(to right, color-mix(in srgb, var(--wp--preset--color--ink-900, #0d1520) 16%, transparent), transparent),
    linear-gradient(to left,  color-mix(in srgb, var(--wp--preset--color--ink-900, #0d1520) 16%, transparent), transparent);
  background-position: 0 0, 100% 0, 0 0, 100% 0;
  background-repeat: no-repeat;
  background-size: 32px 100%, 32px 100%, 16px 100%, 16px 100%;
  background-attachment: local, local, scroll, scroll;
}

.wp-block-table table {
  width: 100%;
  border-collapse: collapse;
}

/* `:is(th, td)` wiegt zwei Klassen und schlaegt damit das `.wp-block-table td`
   des Kerns, ohne `!important` zu brauchen. */
.wp-block-table :is(th, td) {
  border: 0;
  border-bottom: 1px solid var(--wp--preset--color--ink-200);
  padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
  text-align: left;
  vertical-align: top;
  hyphens: auto;
}

/* Aussen buendig: die Linie soll die Spalte tragen, nicht einen Kasten
   andeuten. Dasselbe tut der Entwurf mit `dl.daten`. */
.wp-block-table :is(th, td):first-child { padding-left: 0; }
.wp-block-table :is(th, td):last-child  { padding-right: 0; }

/* Die 3px-Kante des Kerns unter dem Tabellenkopf. Sie ist der Grund, warum die
   fuenf leeren Kopfzeilen aus S6 als „schmales Band mit dicker Unterkante"
   auffallen — der Selektor wiegt hier ein Element mehr und gewinnt. */
.wp-block-table table thead {
  border-bottom: 0;
}

.wp-block-table thead th {
  color: var(--wp--preset--color--ink-500);
  font-size: var(--wp--preset--font-size--xs);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
}

/* ==================================================================
   Was ein B2B-Portal vom Theme braucht und was ein Blog-Theme nicht
   mitbringt.
   ================================================================== */

/* Der Katalog ist eine dichte Tabelle. Ein Inhaltsbereich von 960px
   quetscht sie unlesbar zusammen — dokumentiert im Deploy-Runbook als
   die Falle, in die jede neue Installation einmal tritt. Die Seite mit
   dem Shortcode nimmt deshalb das Full-Width-Template, und dort hebt
   das Theme die 960px auf.

   Freigegeben ist die Breite trotzdem nicht: ohne Obergrenze zieht die
   Matrix auf einem 34-Zoll-Schirm über die volle Fensterbreite, und der
   Weg von der Artikelnummer links zur Menge rechts wird länger als ein
   Blick. Es ist dieselbe Schale, in der auch der Kopfbereich steht — und
   deshalb steht die Zahl hier nicht. Sie steht als
   `settings.layout.wideSize` in `theme.json`, WordPress veröffentlicht sie
   als `--wp--style--global--wide-size`, und Kopf wie Deckel lesen von dort.
   Wer die Breite ändert, ändert genau eine Zahl an genau einer Stelle.

   Der Kopfbereich holt sie sich über `alignwide` auf `.lotzwoo-header-row`,
   nicht über eine eigene `wideSize` im Blockmarkup. Das ist kein Geschmack:
   ein Block, der nur `wideSize` und kein `contentSize` deklariert, bekommt
   von WordPress die Regel
   `> :where(:not(.alignleft):not(.alignright):not(.alignfull))` mit genau
   diesem Wert — die Inline-Angabe wirkt dann als *Inhalts*breite. Ersatzlos
   entfernt, fiele der Kopf auf 960px zusammen. Der Ausrichtungsweg erbt
   dagegen sauber aus `theme.json`.

   `margin-inline: auto` ist der Teil, der überhaupt zentriert; die
   Obergrenze allein ließe alles links kleben. Im Kopf erledigt das die
   Layout-Regel des Kerns, deren `:where(:not(…))` auch `.alignwide` trifft.

   Warum der Deckel auf der Plugin-Wurzel sitzt und nicht auf dem Block
   darüber: der Block trägt seine 16px als *Innen*abstand. Ein `max-width`
   dort rechnet sie mit ein und lässt 32px weniger Inhalt übrig — während die
   Kopfzeile ihr Maß voll ausnutzt, weil ihre 16px außen am `<header>`
   hängen. Unterhalb der Grenze fällt das nicht auf: dort greift kein Deckel
   und beide laufen auf `vw − 32`. Erst auf einem Ultrawide standen
   Navigation und Tabelle 16px versetzt. Eine Ebene tiefer gedeckelt, ist der
   Aufbau auf beiden Seiten derselbe — dasselbe Maß ohne Innenabstand in
   einem Elternteil mit 16px — und die Flucht stimmt in jeder Breite.

   Der Selektor greift zwei Wurzeln des Plugins, nicht `> *`: die
   Blockstruktur der Seite kann sich ändern, `.lotzwoo-b2b-shop` und
   `.lotzwoo-reorder` nicht.

   Und hier bleibt es bei zweien, obwohl die Token-Brücke oben seit dem
   2026-08-13 sechs Wurzeln führt — das ist die „eigene Begründung", die der
   Vertrag für eine kürzere Liste verlangt: `.lotzwoo-page-full-width` ist
   eine *Seitenvorlage*, die von Hand zugewiesen wird, und zugewiesen ist sie
   der Sortiments- und der Nachbestellseite. Die drei Konto-Flächen liegen im
   Konto-Template von WooCommerce und bekommen diese Klasse nie; eine Zeile
   für sie wäre eine Regel, die nirgends greift. Wer die Vorlage später einer
   Konto-Seite zuweist, trägt sie hier nach. */
.lotzwoo-page-full-width .wp-block-post-content > * {
  max-width: none;
}

/* Der Nulldurchgang gegen den Blockabstand — seit AP-83 gemessen und
   angefordert. Setzt der Betreiber `[lotzwoo_b2b_login]` in sein Muster,
   ist die Plugin-Wurzel dort ein Geschwisterblock unter anderen, und
   WordPress' eigene Layout-Regel

       :where(.is-layout-constrained) > :where(:not(.alignleft)…)
       { margin-block-start: 24px }

   gibt ihr denselben Abstand wie jedem Absatz. An der Bank gemessen
   (2026-08-25, 1440 px): `margin-block-start: 24px`. Die Regel steht in
   `:where()` und hat damit Spezifitaet 0 — dieser Selektor (0,2,0)
   ueberschreibt sie, ohne dass irgendwo ein `!important` noetig waere.

   Der Abstand ueber der Flaeche kommt damit aus dem Muster des Betreibers
   und nicht aus einer Layout-Vorgabe, die ihn nicht kennt.

   **`margin-inline` ist wieder `auto`** (2026-08-26, angefordert). AP-83 hat
   es am 2026-08-25 zusammen mit dem Blockabstand auf `0` gesetzt — die zwei
   gehoerten aber nie zusammen. `margin-block-start: 0` behebt einen Abstand,
   den WordPress oben anlegt; `margin-inline` entscheidet, wo die gedeckelte
   Flaeche im Elternteil steht, und der ist `alignfull`, also so breit wie das
   Fenster.

   Am 2026-08-26 am Klon gemessen, Rest links/rechts neben der Flaeche:

     Fenster   mit `0`            mit `auto`
     2560      16 / **624**       320 / 320
     2100      16 / **164**       90 / 90
     1952      16 / 16            16 / 16
     1440      16 / 16            16 / 16

   Unterhalb von rund 1952 px aendert `auto` **nichts**: dort greift der Deckel
   (`wide-size`, 1920) gar nicht, die Flaeche fuellt ihren Elternteil und die
   16 px links wie rechts sind dessen Polster. Erst darueber steht sie mit `0`
   am linken Rand und laesst rechts ein wachsendes Loch.

   Angefragt war `.lotzwoo-b2b-shop { margin: auto !important }`. Beides steht
   hier bewusst anders: **kein `!important`**, weil dieser Selektor (0,2,0) die
   Kern-Regel in `:where()` (Spezifitaet 0) ohnehin schlaegt — es gibt nichts zu
   ueberstimmen. Und **`margin-inline` statt `margin`**, damit `margin-block-end`
   unberuehrt bleibt: die Kurzform setzte ihn auf `auto`, und das ist im Fluss
   zwar auch Null, aber eine Null, die niemand entschieden hat. Beide Wurzeln,
   weil es eine Regel ist und die Nachbestellseite dieselbe Vorlage traegt. */
.lotzwoo-page-full-width .lotzwoo-b2b-shop,
.lotzwoo-page-full-width .lotzwoo-reorder {
  max-width: var(--wp--style--global--wide-size);
  margin-block-start: 0;
  margin-inline: auto;
}

/* Die Kontextleiste des Shops klebt oben, und die WordPress-Admin-Bar
   liegt fest darüber. Ohne Versatz verschwindet die Leiste unter ihr —
   und mit ihr der Matrix-Spaltenkopf, der sich an ihrer Unterkante
   ausrichtet.

   Der Name ist der des Plugins. Die erste Fassung dieser Datei erfand
   `--lotzapp-offset-top`, das nichts liest; das Plugin rechnet mit
   `--lwb-sticky-top`, deklariert auf seinen beiden Wurzeln. Ein Token
   umzubenennen heißt hier, ihn abzuschalten.

   Die drei Stufen sind die der Admin-Bar selbst: 32px im Normalfall,
   46px darunter — und unter 600px gar keiner, weil sie dort
   `position: absolute` wird und mitscrollt. Ein Versatz für eine Leiste,
   die nicht mehr steht, wäre ein Loch über der Tabelle.

   **Die Leiste steht in der Liste, seit dem 2026-08-26.** Hier standen zwei
   Wurzeln, mit der Begründung, `--lwb-sticky-top` lese „genau eine Sache,
   die klebende Kontextleiste des Shops" — und die drei Konto-Flächen hätten
   nichts Klebendes. Der zweite Halbsatz stimmt nicht: seit AP-32 steht
   dieselbe klebende Leiste auf allen vier Flächen, und auf Warenkorb und
   Konto liegt sie **außerhalb** jeder Plugin-Wurzel. Dort war der Token gar
   nicht deklariert, und die Leiste parkte hinter der Admin-Bar.

   `.lotzwoo-contextbar` steht deshalb selbst in der Liste. Innerhalb des
   Sortiments ist das keine zweite Quelle, sondern dieselbe Zahl eine Ebene
   tiefer: die Leiste erbte sie ohnehin von `.lotzwoo-b2b-shop`. Nötig ist
   die eigene Zeile für die drei Flächen, die keine Plugin-Wurzel haben —
   und der Plugin-Token `--lwb-sticky-top: 0px` auf `.lotzwoo-b2b-shop`
   (Spezifität 0,1,0) schlägt einen geerbten Wert von `body.admin-bar`
   sonst zurück, bevor die Leiste ihn sieht. */
body.admin-bar .lotzwoo-b2b-shop,
body.admin-bar .lotzwoo-reorder,
body.admin-bar .lotzwoo-contextbar {
  --lwb-sticky-top: 32px;
}

@media screen and (max-width: 782px) {
  body.admin-bar .lotzwoo-b2b-shop,
  body.admin-bar .lotzwoo-reorder,
  body.admin-bar .lotzwoo-contextbar {
    --lwb-sticky-top: 46px;
  }
}

@media screen and (max-width: 600px) {
  body.admin-bar .lotzwoo-b2b-shop,
  body.admin-bar .lotzwoo-reorder,
  body.admin-bar .lotzwoo-contextbar {
    --lwb-sticky-top: 0px;
  }
}

/* Die klebende Leiste sitzt ganz oben im Inhalt. Das Seiten-Template gibt
   `<main>` einen Innenabstand nach oben — richtig für Fließtext, falsch
   hier: der Abstand liegt zwischen Kopfbereich und Leiste und sieht aus wie
   ein Loch, das beim Scrollen zuklappt.

   Die Bedingung ist die Leiste selbst, nicht das Template und nicht die
   Seiten-ID: `:has()` fragt genau das, was gemeint ist — hat dieser
   Inhaltsbereich eine klebende Kontextleiste? Abgemeldet rendert der
   Shortcode nur seinen Login-Hinweis und gar keine Leiste, und dann bleibt
   der Abstand, wo er hingehört.

   `!important` ist hier nicht Bequemlichkeit: Block-Templates schreiben
   ihre Abstände als Inline-Style an das Element, und den schlägt eine
   externe Regel sonst nicht. */
main#wp--skip-link--target:has(.lwb-contextbar) {
  margin-top: 0 !important;
  padding-top: 0 !important;
}

/* ==================================================================
   Kopfbereich.

   Gegen `docs/mockups/prototype/` im Plugin-Repo gelegt: dort trägt der
   Kopf links Logo und Navigation, rechts eine Reihe Icon-Schaltflächen.
   Die Struktur steht in `parts/header.html`; hier stehen nur die Zustände,
   die ein Block-Theme nicht aus theme.json bekommt.

   Die Klassennamen der beiden WooCommerce-Blöcke sind abgelesen, nicht
   geraten — `do_blocks()` über die Template-Datei, dann die Klassen aus
   der Ausgabe. Ein Selektor auf einen Namen, den Woo nicht vergibt, wäre
   eine Regel, die aussieht, als griffe sie.
   ================================================================== */

/* Der Kopf hält die Höhe des Prototyps: --header-h ist dort 60px.

   36px, nicht 60: der <header> legt oben und unten je 12px Innenabstand
   dazu, macht 60 plus die Trennlinie. Die erste Fassung setzte hier 60 und
   ergab damit einen 84px hohen Kopf — die Innenabstände waren mitgezählt,
   ohne dass sie in der Rechnung standen.

   Die Höhe hängt an der inneren Reihe, nicht am <header>. Der Header ist ein
   Constrained-Layout: gäbe man ihm display: flex, würden seine Kinder zu
   Flex-Elementen und verlören die Auto-Margins, mit denen dieses Layout
   zentriert und begrenzt — die Breitenbegrenzung wäre weg. Die innere Reihe
   ist ohnehin schon flex und zentriert dort auch vertikal.

   min-height, nicht height: sobald die Reihe auf schmalen Fenstern umbricht,
   müsste eine feste Höhe den Inhalt abschneiden. */
.lotzwoo-header-row {
  min-height: 36px;
}

/* Das Logo muss sich der Zeile fügen, nicht umgekehrt. Der Block schreibt
   Breite und Höhe als Attribute ans <img> — bersta.png ist fast quadratisch,
   bei den 140px des Blocks also 126px hoch und damit doppelt so hoch wie der
   ganze Kopf. Begrenzt wird die Höhe, nicht die Breite: ein breiter
   Schriftzug als Logo bliebe so lesbar, während eine feste Breite ihn auf
   Briefmarkengröße brächte. */
.wp-block-site-logo img {
  max-height: 36px;
  width: auto;
  height: auto;
}

header .wp-block-site-title a {
  letter-spacing: -.02em;
  text-decoration: none;
}

/* Die Kachel steht nur, solange kein Logo hochgeladen ist — siehe den
   Filter in functions.php. Maße sind die des Prototyps.

   Der Verlauf lief von `brand-400` nach `brand-700`; der Buchstabe stand am
   hellen Ende bei 4.15:1 gegen Weiß und verfehlte die 4.5. Bersta hat ein
   Logo hochgeladen, die Kachel greift dort nicht — beim nächsten Kunden ohne
   Logo greift sie wieder. Eine Stufe tiefer angesetzt (`brand-500`) trägt
   denselben Verlauf und hält die Schwelle in jeder Palette, weil `500` die
   Stufe ist, auf der ohnehin der Primärknopf mit weißer Schrift steht. */
.lotzwoo-logomark {
  display: grid;
  place-items: center;
  flex: none;
  width: 28px;
  height: 28px;
  border-radius: 8px;
  background: linear-gradient(140deg, var(--wp--preset--color--brand-500), var(--wp--preset--color--brand-800));
  color: var(--wp--preset--color--white);
  font-size: var(--wp--preset--font-size--md);
  font-weight: 700;
  line-height: 1;
}

/* Navigationslinks: der Prototyp gibt ihnen eine Fläche, keinen
   Unterstrich, und markiert die aktuelle Seite farbig statt fett. */
header .wp-block-navigation-item__content {
  padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
  border-radius: 6px;
  color: var(--wp--preset--color--ink-500);
  font-weight: 500;
  text-decoration: none;
}

/* Die Flaeche ist beiden Zustaenden gemeinsam und bleibt es. Was den Fokus
   *anzeigt*, ist der Ring weiter unten — siehe den Block bei „Fokus im
   Kopfbereich“. */
header .wp-block-navigation-item__content:hover,
header .wp-block-navigation-item__content:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

header .current-menu-item > .wp-block-navigation-item__content {
  background: var(--wp--preset--color--brand-50);
  color: var(--wp--preset--color--brand-600);
}

/* Konto und Warenkorb sind im Prototyp Schaltflächen mit einer Fläche
   beim Überfahren. Beide Woo-Blöcke bringen ihr eigenes Icon mit — das
   ist der Grund, sie zu nehmen statt Icons von Hand zu setzen: die Zahl
   am Warenkorb ist dann echt und nicht gemalt. */
.lotzwoo-header-actions {
  align-items: center;
}

/* Rechts bleiben, auch wenn die Zeile umbricht. `space-between` gibt der
   Gruppe auf einer eigenen Zeile keinen Partner mehr, gegen den sie sich
   abstoessen koennte — sie stand dann links unter dem Logo. Gemessen am
   2026-08-14: abgemeldet ab 1200px, angemeldet mit den drei
   Plugin-Flaechen ab 1440px. Das automatische Aussenmass nimmt den freien
   Platz vor `justify-content` auf und wirkt in beiden Faellen.

   Mit dem Elternteil davor, und das ist gemessen und nicht vorsorglich:
   als blosses `.lotzwoo-header-actions` rechnete der Browser weiter mit
   `margin-left: 0`. WordPress' eigene Layout-Regeln setzen das physische
   `margin` spaeter im Stapel und bei gleicher Spezifitaet — eine logische
   Eigenschaft verliert dagegen, obwohl sie auf dieselbe Kante zeigt. */
.lotzwoo-header-row > .lotzwoo-header-actions {
  margin-inline-start: auto;
}

/* Zwei Formen, nicht eine — so trennt der Prototyp sie auch. Der
   Warenkorb ist eine quadratische Schaltfläche von 36px, weil er nur ein
   Icon trägt; das Konto ist ein Chip mit Text daneben. Beide dieselbe
   Fläche beim Überfahren, damit sie als eine Reihe lesbar bleiben. */
.lotzwoo-header-actions .wc-block-customer-account__link,
.lotzwoo-header-actions .wc-block-mini-cart__button {
  display: flex;
  align-items: center;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--wp--preset--color--ink-500);
  cursor: pointer;
  text-decoration: none;
}

.lotzwoo-header-actions .wc-block-mini-cart__button {
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
}

/* Die Beschriftung trägt die Schrift der Menüpunkte daneben, nicht die des
   Fließtexts. Woo liefert den Link mit `font: inherit` aus, er erbte also
   die 0.9375rem des Bodys und dessen Normalgewicht und stand damit neben
   „Über uns" sichtbar größer und dünner in derselben Zeile.

   `color: inherit` statt eines Tokens, und zwar mit Absicht: die
   Navigationslinks *sind* geerbt gefärbt. Ihre eigene Regel weiter oben
   setzt zwar `ink-500`, kommt damit aber nicht durch — WordPress' eigenes
   Navigations-Stylesheet trägt

     .wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content

   mit doppelter Klasse und `color: inherit`, und (0,3,0) schlägt das
   (0,1,1) von `header .wp-block-navigation-item__content`. Der Menüpunkt
   steht deshalb in `ink-900`, nicht in `ink-500`. Wer hier ein Token
   einträgt, trifft die gerenderte Kopfzeile also gerade nicht.

   Nur der Konto-Link, nicht der Warenkorb daneben: der trägt kein Wort,
   und sein Icon soll leiser bleiben als die Beschriftung. */
.lotzwoo-header-actions .wc-block-customer-account__link {
  gap: var(--wp--preset--spacing--20);
  padding: 5px 10px;
  min-height: 36px;
  color: inherit;
  font-size: var(--wp--preset--font-size--md);
  font-weight: 500;
}

.lotzwoo-header-actions .wc-block-customer-account__link:hover,
.lotzwoo-header-actions .wc-block-customer-account__link:focus-visible,
.lotzwoo-header-actions .wc-block-mini-cart__button:hover,
.lotzwoo-header-actions .wc-block-mini-cart__button:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

/* Fokus im Kopfbereich — Navigationslinks, Konto, Warenkorb.

   Dieselbe Regel, die die zwei Overlay-Knoepfe weiter unten schon tragen, eine
   Ebene weiter gezogen. Bis hierher hatten die drei nur die Flaeche aus
   `ink-100`, und die zwei Zeilen darueber geben sie bei `:hover` UND bei
   `:focus-visible` — mit zwei Folgen:

   * Die Flaeche traegt die Fokusanzeige nicht. `ink-100` kommt gegen `surface`
     auf 1.17:1 und gegen das weisse Overlay auf 1.25:1; WCAG 2.1 verlangt in
     1.4.11 fuer die Fokusanzeige 3:1. Was man sah, war Chromes Vorgabering
     (`outline: auto 1px rgb(16,16,16)`, am 2026-08-11 an allen drei gemessen)
     — sichtbar, aber ohne Marke, ohne verlaessliche Staerke und je Browser
     anders.
   * Fokus und Mauszeiger sahen identisch aus. Wer tastet, konnte nicht sehen,
     wo er steht.

   Die Trennung liegt deshalb nicht in der Flaeche, sondern im Ring: die
   Flaeche bleibt beiden Zustaenden gemeinsam (eine Stelle, kein Auseinander-
   laufen), den Fokus zeigt allein der Ring. `outline` und nicht `box-shadow`,
   weil es kein Layout kostet, und `brand-500` aus dem Preset, damit der Ring
   dem Kindtheme folgt, ohne dass hier ein zweiter Farbwert stuende.

   `outline-offset: -2px`, der Ring also INNERHALB der Randbox — und das ist
   gemessen, nicht Geschmack. Im offenen Overlay setzt der Kern die
   Navigationslinks buendig an den linken Bildschirmrand (x=0, ohne Polsterung)
   und legt darum einen Vorfahren mit `overflow: auto`. Mit `+2px` reicht der
   Ring bis -4px und wird links beschnitten: aus dem Rechteck wird ein C, auf
   jedem der sechs Links. Dieselbe Falle wie beim Schliessen-Knopf, nur sechs
   Mal. Nach innen gezeichnet kann ihn nichts beschneiden — bei 390px und bei
   1280px nachgesehen, Ueberstand ueberall 0.

   Nach innen liegt der Ring auf der eigenen Fuellung. Das sind zwei Flaechen,
   denn auf der aktuellen Seite gewinnt `brand-50` aus der Regel darunter
   (gleiche Spezifitaet, spaeter notiert — im Browser bestaetigt):

     Ring                Flaeche darunter                      Kontrast
     brand-500 #b33a2b   Fuellung ink-100 #ede5d8               4.72:1
     brand-500 #b33a2b   aktuelle Seite brand-50 #faefed        5.24:1
     brand-500 #157d5f   Fuellung ink-100 #f1f4f7               4.61:1
     brand-500 #157d5f   aktuelle Seite brand-50 #eaf6f1        4.59:1

   Die ersten zwei Zeilen sind das aktive Kindtheme lotzwoo-theme-bersta, die
   letzten zwei das Basistheme. Die Aussenkante des Rings grenzt weiterhin an
   die Flaeche daneben — #b33a2b auf Creme #fbf7f0 5.53:1 und auf dem weissen
   Overlay 5.90:1, #157d5f auf Weiss 5.08:1. Alle sieben Werte tragen die 3:1,
   der niedrigste mit 4.59:1.

   Der Oeffnen-Knopf behaelt seinen Ring aussen (`+2px`, weiter unten): er steht
   frei in der Kopfzeile, dort schneidet nichts, und 24px Kantenlaenge sind zu
   wenig, um einen Ring noch nach innen zu nehmen. */
header .wp-block-navigation-item__content:focus-visible,
.lotzwoo-header-actions .wc-block-customer-account__link:focus-visible,
.lotzwoo-header-actions .wc-block-mini-cart__button:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: -2px;
}

/* Logo-Link und Website-Titel — derselbe Ring, aber nach AUSSEN.

   Die letzten zwei Kopfbedienelemente ohne eigene Fokusanzeige; bis hierher
   trugen sie Chromes Vorgabering (`outline: auto 1px rgb(16,16,16)`, am
   2026-08-11 an beiden gemessen).

   Die Richtung ist hier die andere als eine Regel weiter oben, und das ist
   gemessen. Zwei Gruende, jeder fuer sich ausreichend:

   * **Es schneidet nichts.** Der Ring nach innen war oben eine Notwehr gegen
     den `overflow: auto` des offenen Overlays. Diese zwei stehen gar nicht
     darin: bei offenem Overlay faengt der Kern den Fokus im Modal, beide sind
     mit der Tabulatortaste nicht mehr erreichbar (nachgesehen — der Fokus
     kommt dort nie an). Bei geschlossenem Overlay hat keiner von beiden einen
     clippenden Vorfahren, bei 390px so wenig wie bei 1280px.
   * **Nach innen laege der Ring im Bild bzw. in der Schrift.** Die Randbox des
     Logo-Links ist die des `<img>`; ein Ring mit `-2px` zeichnete sich auf die
     aeusseren 2px der Kundengrafik, deren Farben das Theme nicht kennt. Der
     Titel wiederum hat keine Polsterung (anders als die Navigationslinks, die
     ihre `ink-100`-Flaeche haben) — dort schnitte der Ring durch die Versalien.

   Mit `+2px` liegt zwischen Ring und Element ein 2px breiter Streifen der
   Kopfflaeche. Beide Kanten des Rings grenzen damit an dieselbe Flaeche, und
   die Logo-Grafik beruehrt er ueberhaupt nicht:

     brand-500 #b33a2b   auf Kopfflaeche #fbf7f0 (bersta)     5.53:1
     brand-500 #157d5f   auf Kopfflaeche #ffffff (Basis)      5.08:1 */
header .wp-block-site-logo a:focus-visible,
header .wp-block-site-title a:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 2px;
}

/* Der Fokusring auf einer GEFUELLTEN Markenflaeche — hier "Zum Sortiment".

   Der Sonderfall des Kopfbereichs, und keine Wiederholung: die Fuellung dieses
   Knopfes IST `brand-500`. Der Ring, den die uebrigen sechs Bedienelemente
   tragen, kaeme darauf auf 1:1 und waere schlicht nicht da.

   DIE REGEL, und sie gilt nicht nur fuer diesen Knopf:

     Auf einer gefuellten Markenflaeche ist die Ringfarbe die Schriftfarbe
     dieser Flaeche — hier `white`. Weil die Flaeche gefuellt ist, kann sich der
     Ring von ihrer Umgebung nicht mehr selbst abgrenzen; deshalb bleibt aussen
     zusaetzlich der `brand-500`-Ring, den der Kopfbereich ohnehin fuehrt.

   Der erste Satz ist der tragende, denn er borgt sich eine Garantie, die schon
   besteht, statt eine zweite aufzumachen: `theme.json` setzt fuer
   `elements.button` `white` auf `brand-500`. Eine Fuellung, die als gefuellter
   Knopf durchgeht, hat ihren Kontrast gegen Weiss also bereits als Schrift
   beweisen muessen — und 4.5:1 fuer Text ist strenger als die 3:1, die 1.4.11
   vom Ring verlangt. Das traegt in die Zukunft: wuerde eine kuenftige Fuellung
   je so hell, dass ein weisser Ring die 3:1 verfehlt, haette ihre eigene weisse
   Beschriftung die 4.5:1 schon vorher verfehlt. Der Fehler faellt dann an der
   Schrift auf, nicht erst an der Fokusanzeige.

   Gerechnet gegen beide Paletten und gegen die Toene, auf denen der Ring
   wirklich liegt — die Fuellung im Ruhezustand und die `brand-600` des
   `:hover`, denn beide Zustaende koennen zusammenfallen:

     Kante                                       bersta      Basis
     Kern white gegen Fuellung brand-500          5.90:1     5.08:1
     Kern white gegen Fuellung brand-600 (hover)  7.75:1     6.48:1
     Kern white gegen Saum brand-500              5.90:1     5.08:1
     Saum brand-500 gegen Kopfflaeche             5.53:1     5.08:1

   Acht Werte, alle ueber 3:1, der niedrigste 5.08:1. Jede Kante des Rings
   traegt einzeln — die Anzeige haengt an keiner einzelnen Nachbarfarbe.

   Die zwei anderen Kandidaten sind gerechnet und im Browser angesehen worden,
   nicht geraten:

   * **Nur ein weisser Ring innen (invertiert).** Gegen die Fuellung 5.90/5.08,
     das traegt. Seine Aussenkante grenzt aber an die Kopfflaeche: 1.07:1 in
     bersta, 1.00:1 im Basistheme. Im Bild sieht der Knopf dann aus, als haette
     er 2px seines Randes verloren — die Anzeige verschwindet nach aussen.
   * **`ink-900` als Ringfarbe.** Faellt an der Rechnung durch, und zwar zuerst
     in der aktiven Palette: 2.97:1 auf `brand-500` in bersta, 3.61:1 im
     Basistheme — und auf dem `brand-600` des Hover-Zustands 2.26:1 bzw.
     2.83:1. Der Wert wird schlechter, je dunkler die Fuellung, also genau in
     die Richtung, in die die Marken-Rampe von 500 nach 900 laeuft. Als Regel
     fuer den naechsten gefuellten Knopf waere er damit schon widerlegt, bevor
     es ihn gibt.

   `outline-offset: 0`, damit die zwei Ringe einander beruehren: ein Spalt
   dazwischen zeigte die Kopfflaeche, und deren Kante gegen den weissen Kern
   traegt nichts (1.07:1). Der Saum bleibt wortgleich die Regel der uebrigen
   sechs; der `inset`-Schatten ist die einzige Zutat, und er liegt innerhalb der
   eigenen Randbox, kann also von nichts beschnitten werden, was nicht schon den
   Knopf selbst beschneidet. Ueberstand bei 390px und 1280px nachgemessen,
   ueberall 0.

   `header` vor dem Selektor mit Absicht: im Kopfbereich traegt genau ein
   Element `.wp-element-button` (nachgesehen — Konto und Warenkorb tun es
   nicht), auf der Seite sind es fuenf. Die anderen vier stehen auf den
   Plugin-Flaechen und haben dort mit `--lwb-focus` ihre eigene Regel; diese
   hier greift bewusst nicht dorthin. Der naechste gefuellte Knopf IM KOPF
   bekommt den Ring dagegen ohne eine weitere Zeile. */
header .wp-element-button:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 0;
  box-shadow: inset 0 0 0 2px var(--wp--preset--color--white);
}

/* Die zwei Knoepfe des Overlay-Menues — "Menü öffnen" und "Menü schließen".

   Sie waren die einzigen fokussierbaren Stellen des Kopfbereichs ohne eigene
   Fokusgestaltung: Navigationslinks, Konto und Warenkorb bekommen oben je eine
   Flaeche aus `ink-100`, die zwei Knoepfe bekamen nichts. Am 2026-08-11 im
   Browser nachgemessen — beide zeigten allein Chromes Vorgabering
   (`outline: auto 1px`), also weder die Marke noch eine verlaessliche Staerke.

   Zwei Teile, und der zweite ist der, auf den es ankommt:

   * Die **Flaeche** ist dieselbe Regel wie eine Zeile hoeher. Sie macht die
     zwei Knoepfe zu Geschwistern der uebrigen Kopfbedienung, nicht zu einem
     Sonderfall.
   * Der **deckende Ring** von 2px traegt die Fokusanzeige. Die Flaeche allein
     tut das nicht, und zwar nicht knapp: `ink-100` kommt gegen `surface` auf
     1.17:1 und gegen das weisse Overlay auf 1.25:1, wo WCAG 2.1 in 1.4.11
     fuer die Fokusanzeige 3:1 verlangt. Das ist dieselbe Rechnung, die weiter
     oben schon fuer `--lwb-focus` steht.

   Warum hier `outline` statt `var(--lwb-focus)`: dieser Schatten lebt auf den
   Wurzeln des Plugins — seit dem 2026-08-13 sechs, damals zwei — und ist im
   Kopfbereich gar nicht in Reichweite (im Browser geprueft: leer). An der
   Zahl haengt das Argument nicht: der Kopfbereich liegt ausserhalb jeder von
   ihnen. Ein `outline` kostet
   ausserdem kein Layout — beim Schliessen-Knopf, der im Overlay oben rechts
   klebt, ist das kein Detail.

   ACHTUNG, hier stand bis zum 2026-08-11 das Gegenteil der Wahrheit: ein
   `outline` werde „von `overflow` nicht abgeschnitten". Er wird es sehr wohl.
   Drei Sitzungen haben es unabhaengig gemessen — der Overlay-Container
   (`.wp-block-navigation__responsive-container.has-modal-open`) traegt
   `overflow: auto` und clippt, und zweimal musste der Versatz deshalb nach
   innen gedreht werden (`118da8e`, `96db4e0`). Wer hier einen Ring nach aussen
   setzt, misst vorher den Ueberstand gegen jeden clippenden Vorfahren.

   `brand-500` und nicht `ink-900`, weil der Ring die Marke traegt; die Farbe
   kommt aus dem Preset, folgt also dem Kindtheme, ohne dass hier ein zweiter
   Farbwert stuende. Gemessen gegen die Flaechen, auf denen er wirklich liegt:

     Ring                Flaeche                          Kontrast
     brand-500 #b33a2b   Kopf/Creme #fbf7f0 (oeffnen)      5.53:1
     brand-500 #b33a2b   Overlay    #ffffff (schliessen)   5.90:1
     brand-500 #b33a2b   Fuellung   #ede5d8 (daneben)      4.72:1
     brand-500 #157d5f   Kopf/`surface` #ffffff            5.08:1
     brand-500 #157d5f   Fuellung   #f1f4f7 (daneben)       4.61:1

   Die ersten drei Zeilen sind die Farbe des aktiven Kindthemes, die letzten
   zwei der Rueckfall des Basisthemes. Alle fuenf tragen die 3:1.

   Bis zum 2026-08-11 stand in der Basistheme-Zeile „dieselben drei" und
   „4.76 / 5.08 / 4.07". Die 4.76 ist `#157d5f` auf Creme `#fbf7f0` — eine
   Kombination, die nie rendert: die Creme gehoert dem Kindtheme, im
   Basistheme ist `surface` weiss. Die Zahl war richtig gerechnet und
   beschrieb eine Flaeche, die es an dieser Stelle nicht gibt.

   Nur `:focus-visible`, kein `:hover`: der Ruhe- und Mauszustand der zwei
   Knoepfe ist Gestaltung und laeuft als Stream F. */
header .wp-block-navigation__responsive-container-open:focus-visible,
header .wp-block-navigation__responsive-container-close:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  border-radius: 6px;
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 2px;
}

/* Der Schliessen-Knopf braucht den Ring nach innen, und das ist kein
   Schoenheitsgriff.

   Der Kern heftet ihn im offenen Overlay in die obere rechte Ecke — gemessen
   auf 390px Breite sitzt er auf [366, 0, 24, 24], also buendig an zwei
   Bildschirmkanten. Ein Ring mit `outline-offset: 2px` liegt damit von -4px
   bis 394px, und weil die Seite waagerecht nicht scrollt, werden oben und
   rechts je 4px abgeschnitten: der Ring wird zum C statt zum Rechteck.
   Nachgesehen, nicht vermutet — der Screenshot zeigt es.

   Das ist kein Einzelfall dieser Breite. Der Kern setzt den Knopf auf jeder
   Fenstergroesse in dieselbe Ecke, also schneidet es immer.

   Mit `-2px` wird der Ring innerhalb der Randbox gezeichnet und kann nicht
   mehr beschnitten werden. Er liegt dann auf der Fuellung statt auf dem
   Overlay: `brand-500` gegen `ink-100` sind 4.72:1, weiterhin ueber den 3:1
   aus 1.4.11, und seine Aussenkante grenzt an das weisse Overlay mit 5.90:1. */
header .wp-block-navigation__responsive-container-close:focus-visible {
  outline-offset: -2px;
}

/* Icon und Text stehen zueinander zentriert, nicht auf der Schriftlinie.
   Gilt fuer beide Schaltflaechen und fuer das getauschte Lucide-Konto-Icon. */
.lotzwoo-header-actions svg {
  display: block;
  flex: none;
}

.lotzwoo-header-actions .label,
.lotzwoo-header-actions .wc-block-mini-cart__quantity-badge {
  display: flex;
  align-items: center;
}

/* Die Zahl am Warenkorb: Markenfarbe statt Themefarbe, und ein weißer
   Rand, damit sie sich vom Icon abhebt, über dem sie sitzt. */
.lotzwoo-header-actions .wc-block-mini-cart__badge {
  border: 2px solid var(--wp--preset--color--white);
  background: var(--wp--preset--color--brand-500);
  color: var(--wp--preset--color--white);
  font-weight: 700;
}

/* Screenreader-Text: das Skip-Link im Kopfbereich braucht ihn und
   Block-Themes bringen ihn nicht von sich aus mit. */
.screen-reader-text {
  border: 0;
  clip-path: inset(50%);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}

.screen-reader-text:focus {
  background-color: var(--wp--preset--color--white, #fff);
  clip-path: none;
  color: var(--wp--preset--color--ink-900, #0d1520);
  display: block;
  height: auto;
  left: 8px;
  padding: 12px 20px;
  top: 8px;
  width: auto;
  z-index: 100000;
}

/* ==================================================================
   Die fünf wiederkehrenden Bausteine.

   Ticket 17, Gegenstück zu den `register_block_style()`-Aufrufen in
   `functions.php`. Bis hierher baute `import-pages.py` diese fünf an 45
   Aufrufstellen aus Block-Attributen zusammen — jede Palettenänderung hätte
   45 Stellen gehabt, und keine davon im Theme.

   Jeder Wert ist der, den das Skript heute schreibt, nur an einer Stelle statt
   an fünfzehn. Der Umbau soll nichts verschieben, sondern den Ort wechseln;
   deshalb steht hier kein „schöner" Wert und kein neuer Hexwert, sondern
   ausschließlich Token aus theme.json.

   Systemregeln, nicht Kundengestaltung: die Bausteine sind Rollen (ein Label,
   eine Karte, ein abgesetzter Abschnitt), ihre Farben kommen aus der Palette
   des jeweiligen Kindthemes. Deshalb gehören sie hierher und nicht nach Bersta.

   Die Klassennamen sind eine Kopplung zum Website-Repo. `import-pages.py`
   schreibt genau diese Zeichenketten; wer hier umbenennt, muss dort nachziehen.
   ================================================================== */

/* Versalien-Label über einer Überschrift. Der Buchstabenabstand ist kein
   Token — er stand so im Skript und wandert unverändert mit; eine eigene
   Skala für einen einzigen Wert wäre mehr Zusage als Nutzen. */
p.is-style-label {
  color: var(--wp--preset--color--brand-500);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  letter-spacing: 0.13em;
  text-transform: uppercase;
}

/* Die grosse Zahl. `serif` steht seit dem 2026-08-12 in der theme.json der
   Basis — als generischer Stapel mit Georgia voran, ohne mitgelieferte
   Schriftdatei. Bis dahin kannte den Slug nur das Kindtheme, und dieser
   Block-Style zeigte in der Basis auf ein Token, das es dort nicht gab: ein
   Vertrag, den das Design-System mit sich selbst bricht, und zwar lautlos —
   der Rueckfall auf die Grundschrift sah aus wie eine Absicht.

   Welche Serife es ist, bleibt Kundensache: Bersta ueberschreibt denselben
   Slug mit Bitter (ADR 004), die Kaskade der theme.json erledigt das ueber den
   gleichen Slugnamen von selbst.

   Der Fallback auf `sans` bleibt stehen. Er greift jetzt nur noch, wenn ein
   Kindtheme das `fontFamilies`-Array ersetzt und `serif` dabei weglaesst —
   WordPress ersetzt dieses Array als Ganzes.

   `5-xl`, nicht `5xl`: WordPress setzt zwischen Ziffer und Buchstabe einen
   Bindestrich, wenn es aus dem Slug den Custom-Property-Namen bildet. Am
   erzeugten Stylesheet abgelesen, nicht geraten — `--wp--preset--font-size--5xl`
   existiert nicht und wäre stillschweigend wirkungslos geblieben. */
p.is-style-kennzahl {
  font-family: var(--wp--preset--font-family--serif, var(--wp--preset--font-family--sans));
  font-size: var(--wp--preset--font-size--5-xl);
  font-weight: 500;
}

/* Textkarte mit Rahmen. Innen `h3` + `p` — der Aufbau bleibt im Skript, ein
   Block-Style trägt Aussehen und keine Zusammensetzung. */
.wp-block-group.is-style-karte {
  border: 1px solid var(--wp--preset--color--ink-200);
  padding: var(--wp--preset--spacing--50);
}

/* Abgesetzter Abschnitt. Nur Polsterung und Vertikalabstand: der Hintergrund
   bleibt Attribut, weil er je Aufrufer zwischen `surface-2` und keinem
   Hintergrund wechselt und damit Inhalt der Seite ist, nicht des Bausteins. */
.wp-block-group.is-style-abgesetzt {
  padding-block: var(--wp--preset--spacing--70);
  padding-inline: var(--wp--preset--spacing--50);
}

/* Ein Empfänger der Datenschutz-Auskunft, als Block statt als Tabellenzeile
   (T5: die dritte Spalte lag auf 390px ausserhalb des Sichtfelds).
   Logische Eigenschaften statt `border-left`/`padding-left`, weil die Kante
   an den Textanfang gehört und nicht an die linke Bildschirmseite; in dieser
   Leserichtung ist das derselbe Ort. */
.wp-block-group.is-style-empfaenger {
  border-inline-start: 3px solid var(--wp--preset--color--ink-200);
  padding-block: var(--wp--preset--spacing--40);
  padding-inline: var(--wp--preset--spacing--50) var(--wp--preset--spacing--40);
}

/* Eine Liste kurzer, gleichrangiger Stichworte auf zwei Spalten.

   Acht einzeilige Eintraege untereinander laufen lang und lassen daneben die
   halbe Rasterbreite leer. Zwei Spalten halbieren den Lauf.

   `columns: 2 16em` und nicht `column-count: 2`, und das ist der ganze Punkt
   dieser Regel. Mit beiden Werten nimmt der Browser die *kleinere* der beiden
   Vorgaben: zwei Spalten, solange je 16em Platz sind, sonst eine. Auf einem
   Telefon faellt die Liste damit von selbst einspaltig zurueck, ohne
   Umbruchpunkt und ohne dass jemand einen pflegen muss. Ein blosses
   `column-count: 2` haette bei 360px zwei Spalten zu je 160px erzwungen, in
   denen „Frischfleisch, auch von alten Nutztierrassen" vierzeilig steht.

   Warum das ueberhaupt ein Block-Style ist: WordPress' Block-Attribut
   `textColumns` schreibt ausschliesslich `column-count` und kennt die
   Mindestbreite nicht. Ueber das Attribut ist dieses Verhalten nicht
   erreichbar. */
.wp-block-list.is-style-zweispaltig {
  columns: 2 16em;
  gap: var(--wp--preset--spacing--60);
}

/* Ein Eintrag darf nicht ueber die Spaltengrenze zerrissen werden. */
.wp-block-list.is-style-zweispaltig > li {
  break-inside: avoid;
}

/* Laufender Text auf lesbarer Zeilenlaenge.

   Gemessen an der Ueber-uns-Seite vor dem Umbau: 119 Zeichen je Zeile. Das
   Raster steht auf 960px, und fuer eine Tabelle oder ein Kartenraster ist das
   richtig — fuer laufenden Text nicht. Die Spanne, in der das Auge den
   Zeilenanfang ohne Suchen zurueckfindet, liegt bei 50 bis 75 Zeichen.

   `ch` und nicht Pixel: die Breite soll an der Schrift haengen, nicht an einer
   Zahl. Aendert ein Kundentheme den Grundschriftgrad, wandert die Zeilenlaenge
   mit, statt still falsch zu werden.

   `margin-inline: 0 auto` ist der eigentliche Punkt dieser Regel. Ein Kind
   eines `is-layout-constrained`-Blocks bekommt von WordPress `margin-inline:
   auto` und stuende damit *mittig* im 960er-Raster — also eingerueckt
   gegenueber der Ueberschrift darueber, die die volle Breite nutzt. Das liest
   als Versehen. Der Text beginnt an derselben Kante wie seine Ueberschrift.

   Der doppelte Klassenname und das `!important` sind kein Tippfehler und auch
   keine Bequemlichkeit. WordPress' Layoutregel fuer constrained-Kinder lautet

     .is-layout-constrained > :where(:not(.alignleft):not(.alignright)…) {
       margin-left: auto !important; margin-right: auto !important; }

   Gegen ein `!important` hilft keine Spezifitaet, sondern nur ein zweites.
   Und weil `:where()` die Spezifitaet der Kernregel auf eine Klasse drueckt,
   muss die eigene Regel bei gleichem Gewicht auch noch hoeher liegen — daher
   der wiederholte Klassenname.

   Zuerst stand hier die Vermutung, es gehe um die Reihenfolge im `head`. Das
   war falsch, und der erste Versuch (nur doppelter Klassenname, ohne
   `!important`) blieb folgerichtig wirkungslos: gemessen stand die Spalte
   weiter bei 1006px statt bei 792px. Erst beides zusammen dreht es. */
.wp-block-group.is-style-lesebreite.is-style-lesebreite {
  max-inline-size: 70ch;
  margin-inline: 0 auto !important;
}

/* Ein Schritt einer Zeitleiste: Knoten, Verbindung zum naechsten, Inhalt daneben.

   Warum das hier steht und nicht als Inline-Style im Website-Repo: Knoten und
   Verbindung sind Pseudoelemente, und ein Block-Attribut kann keines erzeugen.
   Alles andere an diesem Baustein waere inline moeglich gewesen — die beiden
   sind der Grund, aus dem er ueberhaupt ein Block-Style ist.

   Warum ueberhaupt eine Zeitleiste im Basis-Theme: „ein Schritt in einer
   zeitlichen Folge" ist eine Rolle, keine Kundengestaltung — dieselbe
   Begruendung wie bei Karte und Empfaenger. Die Farben kommen aus der Palette
   des jeweiligen Kindthemes.

   Der Punkt wird *nicht* die Markenfarbe. ADR 004 haelt das Rot fuer Labels,
   den Primaerknopf und Zustaende frei; eine Zeitmarke ist keines davon. Die
   Jahreszahl darueber traegt ohnehin `is-style-label` und damit das Rot —
   zwei rote Elemente uebereinander waeren genau die Unruhe, die ADR 004
   abstellen wollte.

   Linie `ink-300` und Punkt `ink-400`, und nicht `ink-200` fuer die Linie, wie
   der Rollenname „Linie" es nahelegt. Grund ist gemessen, nicht empfunden: die
   Zeitleiste steht auf `surface-2` (#f4ede1), und `ink-200` (#e4daca) liegt
   davor bei rund 1,1:1 — die Linie war schlicht nicht da. `ink-200` ist gegen
   `surface` kalibriert, nicht gegen `surface-2`.

   Das ist ein Befund ueber die Palette und nicht ueber diesen Baustein: er
   trifft jede Haarlinie in einem abgesetzten Abschnitt, `is-style-karte`
   eingeschlossen. Hier steht bewusst nur die lokale Abhilfe — eine Rolle der
   Palette umzudeuten, ist keine Entscheidung, die nebenbei in einem
   Block-Style faellt.

   Logische Eigenschaften wie beim Empfaenger: die Kante gehoert an den
   Textanfang, nicht an die linke Bildschirmseite.

   Beim letzten Schritt laeuft die Linie nicht weiter — sonst zeigte sie ins
   Leere und behauptete einen vierten Eintrag. Der Punkt bleibt, weil er
   absolut liegt. */
.wp-block-group.is-style-zeitleiste-schritt {
  position: relative;
  padding-inline-start: var(--wp--preset--spacing--60);
  padding-block-end: var(--wp--preset--spacing--60);
}

/* Kein Abstand zwischen den Schritten. WordPress gibt jedem Kind eines
   Layout-Blocks ein `margin-block-start`, und genau dort zeichnete die
   Verbindung nicht — die Linie hatte Luecken zwischen den Punkten. Der
   Zwischenraum kommt jetzt aus dem `padding-block-end` oben, und das gehoert
   zum Kasten, ueber den die Verbindung laufen kann. */
.wp-block-group.is-style-zeitleiste-schritt {
  margin-block-start: 0;
}

.wp-block-group.is-style-zeitleiste-schritt > :first-child {
  margin-block-start: 0;
}

/* Der Knoten. `0.4em` von oben setzt ihn auf die Grundlinie der Jahresmarke
   daneben, nicht auf die Oberkante des Kastens. */
.wp-block-group.is-style-zeitleiste-schritt::before {
  content: "";
  position: absolute;
  inset-inline-start: -4.5px;
  inset-block-start: 0.4em;
  inline-size: 9px;
  block-size: 9px;
  border-radius: 50%;
  background: var(--wp--preset--color--ink-400);
}

/* Die Verbindung von diesem Knoten zum naechsten.

   Frueher war das die `border-inline-start` des Kastens. Das war der Fehler:
   eine Kante beginnt an der Oberkante und endet an der Unterkante, der Knoten
   sitzt aber 0.4em tiefer — und ueber den Aussenabstand zum naechsten Schritt
   kam sie ohnehin nicht hinueber. Ergebnis waren Striche, die weder am einen
   noch am anderen Punkt ankamen.

   Als eigenes Element laesst sich beides sagen: beginne unter diesem Knoten
   (`0.4em` Versatz plus die 9px des Knotens), und laufe bis 0.4em *unter* die
   Unterkante — dort faengt der naechste Knoten an. Der negative Wert ist der
   Punkt der ganzen Regel; ohne ihn bliebe wieder eine Luecke von der Hoehe des
   Versatzes.

   `-0.5px` bei 1px Breite setzt die Linie mittig unter die Knoten, die bei
   -4.5px mit 9px Breite ebenfalls auf 0 zentriert sind. */
.wp-block-group.is-style-zeitleiste-schritt::after {
  content: "";
  position: absolute;
  inset-inline-start: -0.5px;
  inset-block-start: calc(0.4em + 9px);
  inset-block-end: -0.4em;
  inline-size: 1px;
  background: var(--wp--preset--color--ink-300);
}

/* Beim letzten Schritt keine Verbindung — sie zeigte ins Leere und behauptete
   einen vierten Eintrag. */
.wp-block-group.is-style-zeitleiste-schritt:last-child {
  padding-block-end: 0;
}

.wp-block-group.is-style-zeitleiste-schritt:last-child::after {
  content: none;
}

.wp-block-group.is-style-zeitleiste-schritt .wp-block-quote {
  border-inline-start: none;
  padding-inline-start: 0;
  margin-block-start: var(--wp--preset--spacing--40);
}

/* ==================================================================
   Akkordeon — eine Wahl, bei der nur eine Antwort offen steht
   ================================================================== */

/* Warum `<details>` und kein Skript.

   Ein Akkordeon ist eine der wenigen Oberflaechen, die der Browser fertig
   mitbringt: Tastatur, Screenreader, Aufklappzustand und die Suche im
   Dokument sind bereits richtig. Jede Nachbildung mit `aria-expanded` und
   Klick-Zuhoerern muss das alles noch einmal bauen, und die meisten bauen es
   halb. Dazu kommt der Fall, der diese Entscheidung traegt: faellt das Skript
   aus, ist eine nachgebaute Loesung ein Stapel unerreichbarer Absaetze — ein
   `<details>` ist dann schlicht aufgeklappt.

   Das `name`-Attribut macht die Gruppe wechselseitig: oeffnet man eines,
   schliesst der Browser das andere, ohne eine Zeile JavaScript. Browser, die
   das noch nicht kennen, lassen beide offen — das ist die richtige Richtung
   zu scheitern, denn beide Formulare sind dann sichtbar statt keines.

   Warum keine Karte. ADR 004 sagt „feine Linien statt Kaesten", und ein
   Akkordeon ist die Stelle, an der die Versuchung am groessten ist: Rahmen,
   Ecken, Schatten, damit „man sieht, dass es klickbar ist". Sichtbar macht es
   der Zeiger, der Marker und die Flaeche, die auf Hover reagiert — nicht ein
   Kasten. Die Trennung uebernimmt dieselbe 1px-Linie in `ink-200`, die auf
   dieser Website ohnehin ueberall die Trennung uebernimmt. */
.lotzwoo-accordion > details {
  border-top: 1px solid var(--wp--preset--color--ink-200);
}

.lotzwoo-accordion > details:last-of-type {
  border-bottom: 1px solid var(--wp--preset--color--ink-200);
}

/* Der Kopf. `list-style: none` und der WebKit-Zwilling entfernen den
   Standard-Pfeil; er sitzt je nach Browser woanders und laesst sich nicht
   ausrichten. Der eigene Marker steht rechts, wo ihn eine Liste von
   Auswahlmoeglichkeiten erwarten laesst. */
.lotzwoo-accordion > details > summary {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--wp--preset--spacing--30);
  padding: var(--wp--preset--spacing--30) 0;
  cursor: pointer;
  list-style: none;
  font-size: var(--wp--preset--font-size--md);
  font-weight: 600;
  color: var(--wp--preset--color--ink-900);
}

.lotzwoo-accordion > details > summary::-webkit-details-marker {
  display: none;
}

/* Die Flaeche reagiert, der Kasten bleibt weg: derselbe Griff wie in der
   Kopfnavigation, damit „hier kann man klicken" auf der ganzen Website
   dieselbe Geste ist. */
.lotzwoo-accordion > details > summary:hover,
.lotzwoo-accordion > details > summary:focus-visible {
  background: var(--wp--preset--color--ink-100);
}

/* Die Zusatzzeile im Kopf sagt, fuer wen die Klappe gedacht ist. Sie steht im
   selben Element, damit der Screenreader sie beim Aufklappen mitliest statt
   sie hinter der Klappe zu verstecken. */
.lotzwoo-accordion__hint {
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 400;
  color: var(--wp--preset--color--ink-500);
}

/* Der Marker: zwei Striche zu einem Winkel gedreht — dieselbe Haarlinie wie
   die Trennung, kein Zeichensatz-Glyph und kein Bild. */
.lotzwoo-accordion > details > summary::after {
  content: "";
  flex: none;
  width: 0.5em;
  height: 0.5em;
  margin-inline-start: auto;
  border-right: 1px solid currentColor;
  border-bottom: 1px solid currentColor;
  transform: rotate(45deg) translate(-0.15em, -0.15em);
  transition: transform 150ms ease;
}

.lotzwoo-accordion > details[open] > summary::after {
  transform: rotate(225deg) translate(-0.15em, -0.15em);
}

/* Der Inhalt. Der Abstand sitzt unten am Panel und nicht oben am ersten Kind,
   sonst summiert er sich mit dem Aussenabstand des Formulars. */
.lotzwoo-accordion__panel {
  padding-bottom: var(--wp--preset--spacing--40);
}

/* Wer Bewegung abbestellt hat, bekommt den Winkel ohne Drehung. Das Akkordeon
   selbst klappt weiterhin — das ist ein Zustandswechsel, keine Animation. */
@media (prefers-reduced-motion: reduce) {
  .lotzwoo-accordion > details > summary::after {
    transition: none;
  }

  /* Derselbe Satz fuer den Winkel am „mehr" (AP-53): das Untermenue klappt
     weiterhin auf — das ist ein Zustandswechsel, keine Animation. Nur die
     Drehung entfaellt. */
  .lotzwoo-mehr__winkel {
    transition: none;
  }
}

/* Die Klappe reagiert auf den Zeiger mit Raum, nicht nur mit Flaeche. Der
   Innenabstand waechst zur Seite hin, damit die Schrift beim Ueberfahren vom
   Rand wegrueckt — eine Geste, die auf einer Auswahl aus zwei Tueren deutlicher
   ist als eine blosse Faerbung. Vom Auftraggeber so gesetzt. */
.lotzwoo-accordion > details > summary {
  padding-right: 4px;
  transition: 0.3s;
}

.lotzwoo-accordion > details > summary:hover {
  padding: 12px 12px 12px 8px !important;
  transition: 0.3s;
}

/* Woos zweispaltiges Raster gibt jeder Spalte die halbe Breite. Untereinander
   liegende Klappen brauchen die ganze. */
#customer_login .lotzwoo-accordion {
  width: 100%;
}

/* ==================================================================
   Kontextleiste — Lieferort und Liefertermin, ueber dem Inhalt
   ================================================================== */

/* Warum hier und nicht im Plugin.

   Dieselbe Antwort wie bei `.lotzwoo-heldback` und den Kopfflaechen: das
   Plugin entscheidet, *was* dasteht, dieses Theme, *wie* es aussieht.
   Hier kommt eine zweite Haelfte dazu, und sie wiegt schwerer. Die Leiste
   steht seit AP-32 auf **vier** Flaechen — Sortiment, Warenkorb,
   Kontouebersicht und jedem Konto-Endpunkt — und drei davon laden
   `b2b-shop.css` ausdruecklich **nicht** (177.602 Bytes Katalog-Renderer,
   die auf einer Kontoseite nichts zu suchen haben). Eine Gestaltung im
   Plugin-Stylesheet erreichte drei der vier nicht.

   Der Preis ist benannt: ohne dieses Theme kommt die Leiste ungestaltet.
   Fuer eine Zeile aus zwei Beschriftungen, zwei Werten und einem Knopf ist
   das lesbar und nicht kaputt.

   ---------------------------------------------------------------
   AUSNAHME VON ADR 004 — bewusst, nicht uebersehen.

   ADR 004 verlangt „feine Linien statt Kaesten", und dieses Stylesheet
   folgt dem an drei weiteren Stellen (Akkordeon, Kopfflaechen,
   zurueckgehaltene Positionen). Die Kontextleiste folgt dem **nicht**:
   sie ist eine dunkle Vollflaeche mit Symbolen, Abzeichen und einem roten
   Zustand.

   **Entschieden vom Auftraggeber am 2026-08-14**, ausdruecklich gegen die
   Empfehlung der Mastersession, der die feine Fassung vorlag. Der Grund:
   die Leiste ist die tragende Auskunft des Kaufwegs — fuer welchen Ort und
   welchen Termin die Preise darunter gelten — und sie soll auf allen
   Seiten gleich aussehen. Bis dahin gab es sie zweimal: dunkel im
   Sortiment, als Haarlinie im Kopfbereich.

   **Wer das „repariert", dreht eine Entscheidung des Auftraggebers
   zurueck.** Sie gilt fuer diese eine Flaeche und fuer keine andere.
   --------------------------------------------------------------- */

/* Die Flaeche laeuft ueber die ganze Fensterbreite, ohne aus ihrem
   Container genommen zu werden: ein Schlagschatten ohne Weichzeichnung
   malt sie nach links und rechts weiter, `clip-path` schneidet ihn oben
   und unten wieder zurueck. Uebernommen aus der Sortimentsfassung, wo der
   Umweg seit AD-3 steht, und aus denselben drei Gruenden — ein Schatten
   zaehlt nicht zum Scrollbereich (kein waagerechter Scrollbalken, den
   `100vw` mit negativen Margins auf jedem Schirm mit sichtbarer
   Scrollleiste erzeugte), die Leiste bleibt im Fluss (`position: sticky`
   also unangetastet), und der Inhalt behaelt die Breite seiner Spalte.

   `position: sticky` und nicht der ganze Kopf: bei 1440 px ist der
   Kopfbereich angemeldet 189 px hoch, auf 390 px 341 px — ein Drittel des
   Bildes, dauerhaft belegt von Logo und Navigation. Die Leiste allein
   kostet 44 px. Vom Auftraggeber am 2026-08-14 so entschieden.

   Damit sie kleben *kann*, steht der Block `lotzwoo/context-slot` seit
   AP-32 in den Vorlagen und nicht mehr in `parts/header.html`: ein
   sticky-Element klebt nur innerhalb seines Containers, und der Container
   waere sonst das `<header>` gewesen, das WordPress um jeden
   Template-Part legt — also genau so hoch wie der Kopf und keinen Pixel
   mehr. */
.lotzwoo-contextbar {
  --kontextleiste-grund: var(--wp--preset--color--ink-900);
  /* **Die Hoehe der drei Bedienelemente der Leiste, an einer Stelle.**
     Bis hierher war sie zweimal gerechnet und einmal geerbt: Stern und
     Warenkorb standen auf gesetzten 40 px, der Wechsler auf 33,5 px aus
     Polster plus Zeilenhoehe — am 2026-08-25 gemessen. Drei Knoepfe in
     einer Reihe, zwei davon einen Kopf groesser.

     Sie steht auf der Leiste und nicht auf `__actions`, weil der Wechsler
     seit AP-70 (B3) **neben** der Aktionsgruppe steht und nicht darin:
     unter 700 px muss er ein Rasterelement von `__inner` sein. Eine
     Eigenschaft auf `__actions` erreichte ihn nicht. */
  --lotzwoo-contextbar-control-h: 34px;
  position: sticky;
  /* **Der Versatz ist ein Token, keine Null** (2026-08-26). Hier stand
     `top: 0`, und damit parkte die Leiste hinter der WordPress-Admin-Bar:
     von ihren 44 px verschwanden 32 unter ihr, und weil die Werkzeugleiste
     des Sortiments mit `calc(var(--lwb-sticky-top) + var(--lwb-ctx-h))` =
     76 px rechnet, lief die Artikelliste durch einen 32-px-Schlitz
     dazwischen. Am 2026-08-26 am Klon gemessen, 1440 px, angemeldet.

     Die Null ist beim Umzug der Gestaltung aus dem Plugin hierher
     entstanden (`f030c61`, AP-32): die abgelöste Regel
     `.lotzwoo-b2b-shop .lwb-contextbar` las `top: var(--lwb-sticky-top)`,
     die Portierung hat die Hälfte verloren. Der Kommentar zum Token weiter
     oben beschreibt genau diesen Fehler — er hatte nur keinen Leser.

     Der Rückfall auf `0px` ist der Normalfall: ohne Admin-Bar deklariert
     niemand den Token, und dann klebt die Leiste am Fensterrand. */
  top: var(--lwb-sticky-top, 0px);
  z-index: 20;
  background: var(--kontextleiste-grund);
  box-shadow: 0 0 0 100vmax var(--kontextleiste-grund);
  clip-path: inset(0 -100vmax);
  color: var(--wp--preset--color--surface);
  font-size: var(--wp--preset--font-size--md);
}

/* Ohne aufloesbaren Kontext ist die Leiste rot. Der Zustand steht
   zusaetzlich im Wort („Kontext fehlt") und in `data-state` — Farbe allein
   ist keine Information. */
.lotzwoo-contextbar.is-unset {
  --kontextleiste-grund: var(--wp--preset--color--err-700);
}

/* Steht die Leiste als eigene Bahn zwischen Kopf und Inhalt, hat sie
   keinen Container, der ihr eine Rinne gaebe — sie liegt direkt in
   `.wp-site-blocks`. Dann nimmt sie sich dieselbe wie der Kopf darueber,
   damit Ortsname und Logo auf einer Kante stehen. Im Sortiment entfaellt
   die Regel: dort steckt die Leiste in der Inhaltsspalte des Kurzcodes und
   haette sonst eine Rinne zu viel. */
.wp-site-blocks > .lotzwoo-contextbar {
  padding-inline: var(--wp--style--root--padding-left) var(--wp--style--root--padding-right);

  /* Buendig unter dem Kopf, Fall A: als eigene Bahn ist die Leiste ein
     Geschwister im Fluss von `wp-site-blocks` und bekommt dessen
     Block-Abstand als `margin-block-start` — gemessen 24 px am Warenkorb.
     Eine klebende Leiste, die im Ruhezustand 24 px unter dem Kopf schwebt,
     sieht aus wie ein Element, das noch nicht angekommen ist. */
  margin-block-start: 0;
}

/* Buendig unter dem Kopf, Fall B: im Sortiment steckt die Leiste in der
   Inhaltsspalte des Kurzcodes, und `main` legt 24 px Rand plus 16 px Polster
   darueber — gemessen 40 px zwischen Kopf-Unterkante (95) und
   Leisten-Oberkante (135).

   Genommen wird das Polster von `main` und nicht per negativem Rand von der
   Leiste: ein negativer Rand von 40 px waere eine Zahl, die stillschweigend
   falsch wird, sobald jemand am Abstandsraster dreht. `:has()` fragt
   stattdessen nach der Tatsache — traegt diese Seite die Leiste, faengt sie
   oben ohne Abstand an. Der Inhalt **unter** der Leiste behaelt seinen
   eigenen; ihn traegt die Leiste selbst, nicht `main`. */
main:has(> * .lotzwoo-contextbar),
main:has(> .lotzwoo-contextbar) {
  margin-block-start: 0;
}

/* Die Zeile. `flex-wrap`, weil die Werte Kundendaten sind und jede Laenge
   haben koennen — „Wien 1100 — Hauptfiliale" steht neben „Abholmarkt".
   Die Hoehe haelt `min-height`: solange die Leiste eine Zeile bleibt,
   zentriert `align-items` den Inhalt darin. */
/* **`nowrap`, und zwar ohne Medienbedingung.** Der Entwurf, auf den sich der
   Auftraggeber festgelegt hat, sagt einen Satz, der keine Ausnahme kennt:
   „sechs Verdichtungsstufen, **keine einzige davon ein Umbruch**." Seine
   Buehne kennt deshalb gar kein `flex-wrap` — Flex ist von sich aus `nowrap`.

   Hier stand `wrap`, und der Umbruch war messbar: bei 900 px war die Leiste
   **92 px** hoch und bei 800 px **118 px**, weil erst die Bedienelemente und
   dann die Angaben selbst in die naechste Zeile rutschten (gemessen am
   2026-08-17). Zwei Stufen weiter unten wurde das mit `nowrap` in einer
   Medienbedingung repariert — und damit nur unterhalb 700 px.

   Nachgeben duerfen die Angaben, nicht die Zeile: `min-width: 0` an den
   Faechern, Auslassungspunkte am Wert, feste Groesse an den Bedienelementen.
   Das steht gleich darunter und gilt jetzt ebenfalls auf jeder Breite. */
.lotzwoo-contextbar__inner {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: var(--wp--preset--spacing--40);
  /* 50 statt 44 — vom Auftraggeber am 2026-08-26 angefordert.
     Es ist die einzige Stelle: die drei Medienstufen weiter unten regeln
     nur Rinne und Polster, keine Hoehe.

     **Was daran haengt, haengt gemessen daran.** Der Klebestapel des
     Sortiments rechnet mit `--lwb-ctx-h`, und die Zahl kommt aus einem
     ResizeObserver auf dieser Leiste (`b2b-ctxheight.js`) — Werkzeugleiste,
     Filterspalte und Matrix-Spaltenkopf ruecken von selbst 6 px nach. Der
     Vorgabewert `52px` in `b2b-shop.css` ist der Ausfallwert fuer den Fall,
     dass das Skript nicht laeuft, und bleibt, wie er ist. */
  min-height: 50px;
}

/* **Die Auskunft fluchtet mit der Kopfzeile, die Flaeche laeuft durch.**

   Die Leiste steht auf zwei verschiedenen Arten im Dokument: im Sortiment
   zeichnet der Kurzcode sie **in** seinem eigenen Behaelter, auf Warenkorb,
   Konto und Favoriten haengt sie als Block `lotzwoo/context-slot` direkt in
   `.wp-site-blocks` — ausserhalb jeder Inhaltsspalte. Dort begann ihre
   Auskunft bei x = 16, waehrend der Seitenrahmen darum ganz woanders sass.

   **Ausgerichtet wird an der Kopfzeile, nicht am Seiteninhalt.** Die Leiste
   gehoert zum Kopf: sie klebt unter ihm, traegt seine Farbe und beantwortet
   dieselbe Frage wie er — *fuer wen und fuer wann gilt, was hier steht*. Ein
   erster Anlauf nahm die Inhaltsbreite (960 px) und liess sie auf 480 px
   beginnen; der Auftraggeber hat das am 2026-08-17 als „schmal" gemeldet und
   die Kopfzeile als Mass genannt. Gemessen ist die jetzt **x = 16, w = 1888**
   auf 1920 px, und die Leiste steht genau so.

   Die dunkle Flaeche laeuft weiterhin bis zum Fensterrand — das traegt der
   Schlagschatten mit `100vmax`, und daran aendert sich nichts. Begrenzt wird
   nur, wo der Inhalt steht. Im Sortiment greift die Regel nicht: dort liegt
   die Leiste im Kurzcode-Behaelter und fluchtet schon. */
.wp-site-blocks > .lotzwoo-contextbar .lotzwoo-contextbar__inner {
  box-sizing: border-box;
  max-width: var(--wp--style--global--wide-size);
  margin-inline: auto;
  padding-inline: var(--wp--preset--spacing--40);
}

/* `overflow: hidden` haelt die Angaben in der Leiste — waagrecht, und dafuer
   ist es da. Es klammert aber **in beiden Achsen**, und die untere Kante der
   Klammer ist die Unterkante des Kastens: eine Unterlaenge, die darueber
   hinausragt (das `g` in „Dienstag"), waere abgeschnitten.

   Das Paar Polster/negatives Aussenmass schiebt **nur die Klammerkante** um
   3 px nach unten. Der Kasten wird innen groesser, sein Aussenmass bleibt
   gleich, also bewegt sich im Aufbau nichts — auch nicht die senkrechte
   Zentrierung, die am Aussenmass haengt.

   Nicht `overflow: clip` mit `overflow-clip-margin`: das lockert die Klammer
   in **allen** Richtungen, also auch waagrecht, und genau waagrecht soll sie
   halten. Nicht `overflow-y: visible`: eine Achse auf `hidden` rechnet die
   andere zu `auto` um, und `auto` macht den Kasten zum Scroll-Container —
   dieselbe Regel, an der `overflow-x: auto` weiter unten die Matrix-Kopfzeile
   gekostet hat.

   **Am 2026-08-27 gemessen und nicht reproduziert:** auf 14 Breiten von 1920
   bis 360 px und auf Sortiment, Warenkorb und Konto ist das Bild mit und ohne
   diese Klammer byteweise gleich — hier schneidet sie heute nichts ab. Die
   drei Pixel sind die Zusicherung, dass sie es auch nicht kann. */
.lotzwoo-contextbar__facts {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  padding-bottom: 3px;
  margin-bottom: -3px;
}

.lotzwoo-contextbar__fact {
  min-width: 0;
}

.lotzwoo-contextbar__fact dd {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.lotzwoo-contextbar__actions {
  flex: 0 0 auto;
}

/* Die Tatsachen als Beschreibungsliste: „Lieferort" ist der Begriff, der
   Ortsname die Beschreibung. Ein Screenreader liest das Paar zusammen,
   waehrend zwei nebeneinandergestellte `span` nur zwei Woerter waeren.
   Das ist der Teil, der aus der Kopf-Fassung gewonnen hat — das Aussehen
   kommt aus der Sortimentsfassung, der Aufbau von hier. */
.lotzwoo-contextbar__facts {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: var(--wp--preset--spacing--40);
  margin: 0;
}

.lotzwoo-contextbar__fact,
.lotzwoo-contextbar__unset {
  display: flex;
  align-items: center;
  gap: var(--wp--preset--spacing--20);
  margin: 0;
  line-height: 1.25;
}

/* Der Hinweis ist ein `<p>`, und ein `<p>` bekommt in einer Block-Seite von
   ausserhalb dieser Datei Abstaende. Die Gruppenregel darueber setzt sie schon
   zurueck; diese Zeile sagt es fuer den einen Fall noch einmal, in dem die
   Leiste nur den Hinweis traegt und nichts daneben steht, was den Umbruch
   sichtbar machen wuerde. */
.lotzwoo-contextbar__unset {
  margin: 0;
  /* Darf schrumpfen: sonst drueckt eine lange Ueberschrift die Leiste auf
     390 px ueber den Rand (Sammellauf 2026-09-23, `kontextleiste`
     Favoriten 378/464/492 px). */
  min-width: 0;
}

/* Beschriftung ueber dem Wert, nicht daneben: so bleibt die Leiste eine
   Zeile hoch, auch wenn beide Werte lang sind. */
.lotzwoo-contextbar__pair {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.lotzwoo-contextbar__fact dt,
.lotzwoo-contextbar__unset-title {
  font-size: var(--wp--preset--font-size--xs);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--wp--preset--color--ink-300);
  white-space: nowrap;
}

/* Wie `__fact dd`: eine Zeile, und was nicht passt, endet in Auslassungspunkten
   statt im Ueberlauf. */
.lotzwoo-contextbar__unset-title {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

.lotzwoo-contextbar__fact dd,
.lotzwoo-contextbar__unset-body {
  margin: 0;
  font-size: var(--wp--preset--font-size--md);
  font-weight: 600;
}

.lotzwoo-contextbar.is-unset .lotzwoo-contextbar__unset-title {
  color: rgba(255, 255, 255, 0.75);
}

/* Ein Symbol steht nie allein: jedes sitzt neben seiner eigenen
   Beschriftung, ist deshalb `aria-hidden` und traegt keine Bedeutung, die
   der Text nicht schon traegt. `flex: none`, damit es bei knappem Platz
   nicht schmaler wird als sein viewBox — ein gequetschtes Symbol liest
   sich wie ein Fehler. Strichbreite und Fuellung stehen am Element
   (`Shop_Icons::inline()`), die Farbe hier. */
.lotzwoo-contextbar__icon {
  flex: none;
  color: var(--wp--preset--color--ink-300);
}

.lotzwoo-contextbar.is-unset .lotzwoo-contextbar__icon {
  color: rgba(255, 255, 255, 0.85);
}

.lotzwoo-contextbar__sep {
  width: 1px;
  align-self: stretch;
  min-height: 1.8em;
  background: rgba(255, 255, 255, 0.18);
}

/* Der Bestellschluss — das einzige Abzeichen der Leiste, und der einzige
   Wert mit eigener Farbe. Er steht **in** der Terminangabe und traegt
   keine eigene Beschriftung: „Bestellschluss 19.08.2026, 16:03" benennt
   sich selbst, ein `dt` daneben ergaebe das Wort zweimal. Am 2026-08-14
   auf der Kontoseite so gemessen.

   Ein verstrichener sagt es im Wort („Bestellschluss vorbei") und nicht
   nur im Rot. */
.lotzwoo-contextbar__cutoff {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-inline-start: 0.5em;
  padding: 2px 8px;
  border-radius: 999px;
  background: var(--wp--preset--color--ok-50);
  color: var(--wp--preset--color--ok-500);
  font-size: var(--wp--preset--font-size--xs);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.lotzwoo-contextbar__cutoff--closed {
  background: var(--wp--preset--color--err-50);
  color: var(--wp--preset--color--err-500);
}

/* Der laufende Bestellschluss (2026-09-08, Plugin-Seite:
   `assets/js/b2b-cutoff.js`).

   Bis dahin kannte diese Leiste zwei Zustaende, offen und vorbei — ein Termin,
   der in zwanzig Minuten schliesst, sah aus wie einer in fuenf Tagen. Genau
   dieser Kunde ruft danach an und fragt, ob er noch bestellen darf.

   Gefaerbt wird ueber `data-lwb-cutoff-stage`, das Attribut, das das Skript
   fortschreibt. **Nicht ueber eine Klasse**: dasselbe Skript bedient die
   Warenkorbflaeche des Plugins, und deren Stylesheet benennt seine Klassen
   anders. Ein Attributselektor faerbt beide, ohne dass eines von beiden das
   andere kennen muss.

   Rot ab der letzten halben Stunde, und zwar dasselbe Rot wie „vorbei": was in
   zwanzig Minuten schliesst, verlangt dieselbe Aufmerksamkeit wie das, was
   gerade geschlossen hat. Eine dritte Farbe dafuer waere eine, die niemand
   gelernt hat. */
.lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="warn"] {
  background: var(--wp--preset--color--warn-50, #fdf3e3);
  color: var(--wp--preset--color--warn-500, #9a6107);
}

.lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="urgent"],
.lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="late"] {
  background: var(--wp--preset--color--err-50);
  color: var(--wp--preset--color--err-500);
}

/* Die Restzeit steht hinter dem Zeitpunkt und traegt ihr Trennzeichen selbst
   — als `::before`, damit es mit ihr verschwindet. Ausserhalb des
   Warnfensters ist der Knoten leer (das Skript leert ihn), und ein
   Mittepunkt, der dann allein stehenbliebe, waere die Sorte Rest, die man
   erst auf einem Schirm sieht. */
.lotzwoo-contextbar__cutoff-rest:not(:empty)::before {
  content: " \00b7 ";
}

.lotzwoo-contextbar__cutoff .lotzwoo-contextbar__icon {
  color: currentColor;
}

/* Rechts steht, was man tun kann. `margin-inline-start: auto` haelt die
   Gruppe am rechten Rand, solange die Zeile nicht umbricht; darin steht
   zuerst, was die Seite selbst beisteuert (das Sortiment seinen
   Netto/Brutto-Umschalter), dann der Wechsler. */
.lotzwoo-contextbar__actions {
  display: flex;
  align-items: center;
  gap: var(--wp--preset--spacing--20);
  margin-inline-start: auto;
}

/* Der Wechsler. Auf dunklem Grund ist ein Textknopf mit rotem Unterstrich
   nicht lesbar — die Geste des Fliesstext-Links, die ADR 004 sonst
   vorgibt, traegt hier nicht. Stattdessen dieselbe helle Umrandung, die
   die Sortimentsfassung seit AD-3 benutzt. */
.lotzwoo-contextbar__switch {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  height: var(--lotzwoo-contextbar-control-h, 34px);
  padding: 0 11px;
  border: 1px solid rgba(255, 255, 255, 0.32);
  border-radius: 6px;
  background: rgba(255, 255, 255, 0.16);
  font: inherit;
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  color: var(--wp--preset--color--surface);
  cursor: pointer;
}

.lotzwoo-contextbar__switch:hover,
.lotzwoo-contextbar__switch:focus-visible {
  background: rgba(255, 255, 255, 0.26);
}

/* **Der Knopf nimmt die Hoehe der Zeile, nicht seine eigene.** Die feste
   `height` darueber laesst ihn neben zweizeiligen Angaben mittig schweben; mit
   `height: 100%` steht seine Umrandung so hoch wie das, wozu sie gehoert.
   `min-height` haelt die 34 px als Untergrenze — sie ist die Trefferflaeche,
   nicht die Optik, und in einer einzeiligen Leiste ist `100%` kleiner.

   Der Elementname erhoeht die Spezifitaet gerade so weit, dass diese Regel die
   `height` oben schlaegt; alles andere am Knopf bleibt, wie es dort steht. */
button.lotzwoo-contextbar__switch {
  height: 100%;
  min-height: 34px;
}

/* =================================================================
   Der Wechsler ist ein Winkel direkt hinter den Angaben — auf jeder Breite

   Entscheidung des Auftraggebers vom 2026-09-24. Bis dahin stand ueber
   700 px ein Knopf „Wechseln" rechts aussen neben Stern und Warenkorb, und
   nur darunter galt, was AP-70 (B3) gebaut hatte: kein Kasten, ein Winkel,
   und ein Klick irgendwo auf Ort und Termin oeffnet den Waehler. Die schmale
   Fassung war die verstaendlichere — der Winkel steht bei dem, was er
   aendert, und nicht bei dem, was man sonst noch tun kann. Sie gilt jetzt
   ueberall.

   **Gebaut als Ueberlagerung, nicht als zweiter Ausloeser.** Die Zeile ist
   ein Raster mit drei Spalten: Angaben, Leerraum, Aktionen. Angabengruppe und
   Knopf liegen in **derselben** Zelle, der Knopf darueber und durchsichtig —
   die ganze Gruppe ist seine Flaeche, ohne dass etwas verschachtelt wird. Die
   Angaben sind eine `<dl>`, und ein `<button>` nimmt nur Phrasing Content.

   **Die erste Spalte ist so breit wie ihr Inhalt** (`minmax(0, auto)`) und
   nicht wie der Platz: damit steht der Winkel am Ende von Ort und Termin und
   nicht am Ende der Zeile. Wird es eng, gibt zuerst die Leerspalte nach, dann
   die Angaben — deren Auslassungspunkte bleiben, wie sie sind. Das Polster
   hinter den Angaben ist die Breite des Winkels samt Trefferflaeche; ohne es
   laege der Winkel ueber dem letzten Zeichen.

   **Es bleibt bei genau einem Ausloeser** — derselbe `<button>`, derselbe
   Fokusstopp, dasselbe `aria-haspopup`. Das Wort „Wechseln" bleibt im
   Dokument und wird vorgelesen; weggeblendet wird es nur fuer die Augen. */
.lotzwoo-contextbar__inner,
.wp-site-blocks > .lotzwoo-contextbar .lotzwoo-contextbar__inner {
  display: grid;
  grid-template-columns: minmax(0, auto) 1fr auto;
  align-items: center;
}

.lotzwoo-contextbar__facts,
.lotzwoo-contextbar__unset,
.lotzwoo-contextbar__switch {
  grid-area: 1 / 1;
}

.lotzwoo-contextbar__facts,
.lotzwoo-contextbar__unset {
  /* Plus ein kleiner Abstand (2026-09-24, gewuenscht): ohne ihn stand der
     Winkel buendig am letzten Zeichen bzw. am Bestellschluss-Abzeichen. Der
     Knopf richtet den Winkel rechts in dieser Flaeche aus, das Polster ist
     also der Abstand. */
  padding-inline-end: calc(var(--lotzwoo-contextbar-winkel, 34px) + var(--lotzwoo-contextbar-winkel-abstand, 6px));
}

.lotzwoo-contextbar__actions {
  grid-area: 1 / 3;
}

/* Der Knopf des veralteten Kontexts („Erneut versuchen") hat keinen Winkel,
   nur sein Wort — ueber die Angaben gelegt, stuende es auf ihnen. Er bleibt
   ein Kasten und nimmt die Leerspalte. */
.lotzwoo-contextbar__switch[data-lotzwoo-contextbar-retry] {
  grid-area: 1 / 2;
  justify-self: start;
}

.lotzwoo-contextbar__switch[data-lotzwoo-contextbar-open] {
  justify-content: flex-end;
  align-self: stretch;
  min-width: 0;
  margin-inline-start: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  /* Ueber der Gruppe, damit der Klick ihn trifft und nicht den Text
     darunter. Die Angaben bleiben lesbar — der Knopf ist durchsichtig. */
  z-index: 1;
}

.lotzwoo-contextbar__switch[data-lotzwoo-contextbar-open]:hover,
.lotzwoo-contextbar__switch[data-lotzwoo-contextbar-open]:focus-visible {
  background: none;
}

.lotzwoo-contextbar__switch-wort {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* **Der Winkel hat das Mass von Stern und Warenkorb** (2026-09-24, gemeldet:
   „hoeher und breiter als die beiden daneben"). Bis dahin 40 x 40 aus
   18 px Symbol + 2 x 11 px Polster; jetzt dieselbe Kantenlaenge
   `--lotzwoo-contextbar-control-h` wie die zwei Aktionsknoepfe, das Symbol
   mittig darin. 34 px liegen weiter ueber den 24 px aus WCAG 2.5.8 — und
   die eigentliche Trefferflaeche ist ohnehin die ganze Angabengruppe.

   `--lotzwoo-contextbar-winkel` ist dieselbe Zahl fuer das Polster hinter
   den Angaben oben; beide muessen gleich sein, sonst laege der Winkel ueber
   dem letzten Zeichen oder mit Luft dahinter. */
.lotzwoo-contextbar {
  --lotzwoo-contextbar-winkel: var(--lotzwoo-contextbar-control-h, 34px);
}

.lotzwoo-contextbar__switch-winkel {
  display: block;
  flex: none;
  box-sizing: border-box;
  width: var(--lotzwoo-contextbar-winkel);
  height: var(--lotzwoo-contextbar-winkel);
  padding: calc((var(--lotzwoo-contextbar-winkel) - 18px) / 2);
}

/* Der Kasten ist fort, die Rueckmeldung nicht: beim Ueberfahren und im
   Tastaturfokus bekommt der Winkel die Flaeche, die der Knopf „Wechseln"
   vorher als Ganzes trug — dieselben Werte, siehe weiter oben. */
.lotzwoo-contextbar__switch-winkel {
  border-radius: 6px;
}

.lotzwoo-contextbar__switch[data-lotzwoo-contextbar-open]:hover .lotzwoo-contextbar__switch-winkel,
.lotzwoo-contextbar__switch[data-lotzwoo-contextbar-open]:focus-visible .lotzwoo-contextbar__switch-winkel {
  background: rgba(255, 255, 255, 0.26);
}

/* Der Satz aus `Context_Notice`, wenn der Kontext das Bestellen sperrt.
   Er steht unter der Zeile und nicht darin: er ist ein Satz und keine
   Angabe, und in der Zeile haette er jede Ausrichtung zerstoert. Das
   Sortiment uebergibt ihn nicht — dort steht er eine Zeile tiefer im Tor,
   in voller Laenge. */
.lotzwoo-contextbar__notice {
  margin: 0 0 var(--wp--preset--spacing--30);
  max-width: 70ch;
  font-size: var(--wp--preset--font-size--sm);
  color: rgba(255, 255, 255, 0.82);
}

.lotzwoo-contextbar__notice strong {
  display: block;
  color: var(--wp--preset--color--surface);
}

/* --- Die Klappe mit dem Waehler ist am 2026-08-17 entfallen ---------

   Hier standen rund achtzig Zeilen fuer `.lotzwoo-contextbar__panel` und ihre
   Teile: zwei Auswahlfelder, ein Knopf, eine Statuszeile. Sie waren die
   **zweite** Antwort auf dieselbe Frage — im Sortiment oeffnete derselbe Knopf
   einen vollen Waehler im Modal, mit Suche und mit den Abzeichen fuer
   Mindestbestellwert und Bestellschluss. Auf Warenkorb und Konto, also dort,
   wo der Korb schon gefuellt ist, stand die schlechtere.

   Der Waehler ist ausgezogen und gehoert jetzt dem Plugin
   (`assets/js/b2b-context-picker.js` samt eigenem Stylesheet). Das ist die
   Ausnahme von AD-1 und sie ist begruendet: ein Modal steht ueber der Seite,
   gehoert keinem Seitenbereich, und ohne Gestaltung ist es nicht schlicht,
   sondern unbenutzbar. Wer dieses Theme nicht einsetzt, bekommt trotzdem
   einen Waehler, der funktioniert.
   ------------------------------------------------------------------- */

/* --- Die 600er-Stufe der Leiste ist am 2026-08-17 entfallen ----------

   Hier stapelte die Kontextleiste ihre Tatsachen: jede Tatsache ihre Zeile,
   die Aktionen auf volle Breite darunter. Das war richtig, solange die Zeile
   umbrechen durfte — und es ist am selben Tag um 10:03 falsch geworden, ohne
   dass eine Regel sich geaendert haette.

   **Was passiert ist.** Die 700er-Stufe (AP-48, weiter unten) setzt
   `flex-wrap: nowrap` auf `__inner`; nachgeben sollen seither die Angaben, mit
   Auslassungspunkten, nicht die Leiste. Die `width: 100%` der Aktionen aus
   diesem Block blieb daneben stehen. Beide Bloecke kollidierten in **keiner**
   einzelnen Eigenschaft, also entschied die Kaskade nichts und beide galten:
   die Aktionen nahmen die ganze Zeile, umbrechen durfte nichts mehr, und fuer
   Ort und Termin blieben **null Pixel**. Am Klon gemessen — bei 601 px waren
   die Angaben 367 px breit, bei 600 px 0, und zwar bis 320 px hinunter.

   Das ist die teuerste Sorte Fehler: er stand in keiner der beiden Regeln, er
   entstand zwischen ihnen. Kein waagrechter Ueberlauf, keine rote Zusicherung,
   keine Meldung — die Leiste zeigte auf jedem Telefon einfach nichts mehr an.

   **Entfallen ist er ersatzlos, nicht zusammengefuehrt.** Die 700er-Stufe
   traegt den Fall vollstaendig: gemessen laufen die Angaben von 367 px bei
   601 auf 130 px bei 320 durch, die Leiste bleibt ueber den ganzen Bereich
   **62 px** hoch, und es gibt auf keiner Breite einen waagrechten Ueberlauf.
   Der Rest dieses Blocks — engere Abstaende und ein weggeblendeter Trenner —
   ist mitgegangen, weil er eine **zweite Schwelle** bei 600 baute, wo jetzt
   eine Darstellung genuegt: mit ihm sprang die klebende Leiste dort von 62 auf
   70 px, und Hoehe ist bei einer Leiste, die stehen bleibt, die teuerste
   Groesse.

   Die Zusicherung dazu steht in `eine-kontextleiste.mjs` (Plugin-Repo): sie
   misst die Angaben ueber die Schwelle hinweg und wird rot, wenn ihre Breite
   auf null faellt.
   ------------------------------------------------------------------- */

/* =====================================================================
   Die drei Kopfflaechen des Plugins — `lotzwoo/header-slot`
   (Kaufweg-Posten 3, AP-30)

   Warum hier und nicht im Plugin: dieselbe Antwort wie bei
   `.lotzwoo-contextbar` und `.lotzwoo-heldback`. Das Plugin entscheidet,
   *was* dasteht — Schnellsuche, Favoriten-Zaehler, Kundenchip —, dieses
   Theme, *wie* es aussieht. Die drei stehen in derselben Zeile wie das
   Konto-Symbol und der Mini-Warenkorb, also mitten in der Kopfgestaltung
   dieses Themes; ein Stylesheet aus dem Plugin muesste dort gegen die
   Regeln oberhalb anschreiben.

   Der Preis ist benannt: ohne dieses Theme kommen die drei ungestaltet.
   Ein Suchknopf, ein Stern mit einer Zahl und zwei Zeilen Text sind dann
   lesbar und nicht kaputt.

   Gebaut nach ADR 004: der Kundenchip traegt ein Versalien-Label ueber
   dem Namen und steht auf einer Linie statt in einer Karte, die
   Trefferliste trennt ihre Zeilen mit Haarlinien, und das Rot bleibt der
   Zahl am Zaehler vorbehalten — derselben Farbe, die der Mini-Warenkorb
   daneben fuer seine Zahl schon nutzt.
   ===================================================================== */
.lotzwoo-headerareas {
  display: flex;
  align-items: center;
  /* Enger als der Abstand der Gruppe (spacing-20): die drei gehoeren
     zusammen und sollen als ein Block neben Konto und Warenkorb lesbar
     sein, nicht als drei einzelne Nachbarn. */
  gap: 8px;
}

/* Suchknopf und Zaehler sind quadratische Schaltflaechen von 36px — die
   Form, die der Mini-Warenkorb in derselben Zeile schon hat. Sie hier zu
   wiederholen statt seine Regel zu erweitern, ist Absicht: seine Regel
   gehoert Woos Block, diese den Flaechen des Plugins, und ein
   Woo-Update, das die eine bricht, soll nicht die andere mitnehmen. */
.lotzwoo-headerareas__favorites {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--wp--preset--color--ink-500);
  cursor: pointer;
  text-decoration: none;
}

.lotzwoo-headerareas__favorites:hover,
.lotzwoo-headerareas__favorites:focus-visible,
.lotzwoo-headerareas__customer:hover,
.lotzwoo-headerareas__customer:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

/* Dieselbe Fokusanzeige wie bei Konto und Warenkorb weiter oben: die
   Flaeche aus `ink-100` traegt sie nicht (1.17:1 gegen `surface`, WCAG
   1.4.11 verlangt 3:1), also ein eigener Ring in der Markenfarbe. */
.lotzwoo-headerareas__favorites:focus-visible,
.lotzwoo-headerareas__customer:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 2px;
}

/* Die Zahl am Zaehler, gebaut wie die Zahl am Warenkorb: Markenfarbe,
   weisser Rand gegen das Symbol darunter, tabellarische Ziffern, damit
   sie beim Wechsel von 9 auf 10 nicht springt. */
.lotzwoo-headerareas__badge {
  position: absolute;
  top: -2px;
  inset-inline-end: -2px;
  min-width: 18px;
  height: 18px;
  padding: 0 4px;
  border: 2px solid var(--wp--preset--color--white);
  border-radius: 9px;
  background: var(--wp--preset--color--brand-500);
  color: var(--wp--preset--color--white);
  font-size: 11px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 14px;
  text-align: center;
}

/* Eine leere Merkliste bekommt keine rote Null. Die Zahl verschwindet,
   der Stern bleibt — der Weg zur Liste soll auch dann dastehen, wenn
   sie leer ist, sonst lernt niemand, dass es sie gibt. Dieselbe
   Ueberlegung wie bei `Favorites_Service::sidebar_filter()`, die den
   Filter ausgegraut anbietet statt ihn zu verstecken. */
.lotzwoo-headerareas__favorites.is-empty .lotzwoo-headerareas__badge {
  display: none;
}

/* Der Kundenchip: kein Kasten, kein Wort darueber. Er nennt die Antwort
   auf „fuer wen kaufe ich hier ein" — deshalb steht der Name fett und die
   Preisklasse leise darunter. Das Label „Kunde" ist mit AP-48 entfallen;
   was es sagte, sagt jetzt das `aria-label` der Verknuepfung.

   AP-48 Punkt 1: `margin-inline-start: auto` steht **ohne Medienbedingung**.
   Der Chip sitzt auf 1920 px am rechten Rand und auf 320 px auch — eine
   Stelle, die sich mit der Breite verschiebt, ist eine Stelle, die man
   suchen muss. */
/* Symbol und Beschriftung nebeneinander, Name und Ziel untereinander.

   **Seit AP-97 (2026-09-01) steht das Symbol im Ruhezustand da.** Bis dahin
   war es allein die Ersatzfassung fuer den Fall, dass der Name keinen Platz
   mehr hat. Der Auftraggeber wollte es auch daneben — und dann, wenn die Zeile
   eng wird, als erstes wieder weg: Zierde geht vor Auskunft. Es hat damit zwei
   Rollen und drei Stufen, und beide Regeln dafuer stehen weiter unten. */
.lotzwoo-headerareas__customer {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-inline-start: auto;
  max-width: 24ch;
  padding: 4px 8px;
  border-radius: 8px;
  color: var(--wp--preset--color--ink-900);
  line-height: 1.15;
  text-decoration: none;
}

.lotzwoo-headerareas__customer-text {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}

/* „Mein Konto" — die leiseste Zeile im Kopf, und die einzige, die sagt, wohin
   der Klick fuehrt. Sie steht **unter** dem Namen und nicht darueber: oben
   stand bis AP-48 „Kunde", ein Wort, das den Namen benannte, den man schon
   liest. Kleiner und ruhiger gesetzt, damit der Name die Zeile fuehrt.

   `ink-600` traegt die 4.5:1 aus WCAG 1.4.3 in beiden Themes mit Abstand —
   nachgerechnet gegen die Flaeche, auf der die Zeile wirklich liegt, weil sie
   die kleinste Schrift im Kopf hat:

     #3a4759 auf `surface` #ffffff (Basistheme)   9.44:1
     #534d46 auf `surface` #fbf7f0 (Bersta)       7.81:1 */
.lotzwoo-headerareas__customer-role {
  color: var(--wp--preset--color--ink-600);
  font-size: var(--wp--preset--font-size--xs);
  font-weight: 400;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --- Die Ersatzfassung: das Symbol ---------------------------------

   Reicht der Platz fuer den Namen nicht mehr, tritt an seine Stelle Lucides
   `circle-user`. Wann das ist, entscheidet **keine Breite**, sondern die
   Messung in `kopfleiste.js` — dieselbe Begruendung wie beim Menue: der Name
   kommt aus dem Kundenkonto, „Musterfirma GmbH & Co KG" und „M. Muster"
   brauchen nicht dieselbe Schwelle.

   Der Chip ist dabei das **letzte**, was nachgibt: erst wandern die
   Menuepunkte, dann die Bestellannahme, dann uebernimmt der Hamburger, und
   erst danach wird aus dem Namen ein Symbol.

   Der Text bleibt im Dokument und wird weiter vorgelesen — versteckt wird er
   mit `clip-path`, nicht mit `display: none`. Ein Symbol allein saehe fuer
   einen Screenreader aus wie ein Link ohne Namen. */
/* **Beide Regeln tragen `.lotzwoo-header-actions` mit, und das ist kein
   Zierrat.** Weiter oben steht `.lotzwoo-header-actions svg { display: block }`
   fuer die Symbole der Aktionsgruppe — (0,1,1). Ein blosses
   `.lotzwoo-headerareas__customer-icon` ist (0,1,0) und verliert: gemessen am
   2026-08-17 stand das Konto-Symbol auf **jeder** Breite da, neben dem Namen.
   Dritter Fall dieser Art in zwei Tagen; einer Regel sieht man das nicht an. */
.lotzwoo-header-actions .lotzwoo-headerareas__customer-icon {
  display: block;
}

/* **Stufe 2: die Zierde faellt zuerst.** Reicht die Zeile nicht mehr, nimmt
   `kopfleiste.js` das Symbol weg, bevor irgendetwas anderes nachgibt — es ist
   das einzige im Kopf, dessen Verlust keine Auskunft kostet.

   `:not(.lotzwoo-kopf--kontoicon)` und nicht die Reihenfolge im Stylesheet:
   in Stufe 3 tragen beide Klassen zugleich, und dann muss das Symbol wieder
   da sein — dort ist es der ganze Knopf. Eine Regel, die nur deshalb gewinnt,
   weil sie spaeter steht, ueberlebt das naechste Verschieben nicht. */
.lotzwoo-kopf--ohne-symbole:not(.lotzwoo-kopf--kontoicon) .lotzwoo-header-actions .lotzwoo-headerareas__customer-icon {
  display: none;
}

.lotzwoo-kopf--kontoicon .lotzwoo-header-actions .lotzwoo-headerareas__customer-icon {
  display: block;
}

.lotzwoo-kopf--kontoicon .lotzwoo-headerareas__customer-text {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* Ohne Beschriftung ist der Chip ein Knopf und kein Textblock: die
   Trefferflaeche von 40 x 40 px steht dann fuer sich, und `max-width` hat
   nichts mehr zu begrenzen. Dieselbe Groesse wie beim Menue-Oeffner und beim
   Anmeldelink daneben. */
/* Auch hier die laengere Kette: `.lotzwoo-header-actions .…__customer` setzt
   weiter unten `min-width: 0`, damit der Chip schrumpfen **darf** — bei
   Gleichstand gewinnt die spaetere, und der Chip stand auf 320 px auf 26 px
   gequetscht, mit einem 24-px-Symbol darin. */
.lotzwoo-kopf--kontoicon .lotzwoo-header-actions .lotzwoo-headerareas__customer {
  box-sizing: border-box;
  justify-content: center;
  max-width: none;
  min-width: 40px;
  min-height: 40px;
}


/* Der Weg hinein fuer Abgemeldete (Entscheidung vom 2026-08-17).

   Er steht an der Stelle, an der fuer angemeldete Kunden der Chip steht, und
   ist das **einzige** Kind der Aktionsgruppe. Deshalb ohne
   `margin-inline-start: auto`: der Chip braucht es, weil neben ihm etwas
   stehen kann; hier schoebe es den Link von der linken Kante der Gruppe weg,
   und `kopfflaechen.mjs` misst genau diesen Versatz auf 0.

   Trefferflaeche mindestens 40 x 40 px, wie beim Menue-Oeffner. Ein Wort
   statt eines Symbols, weil „Anmelden" die Auskunft ist, die ein Besucher
   ohne Konto zuerst braucht — dasselbe Wort wie in `login_notice()`. */
/* **Warum die Zeile die Trefferhoehe *ist* und nicht darin zentriert wird.**
   Hier stand `display: flex; align-items: center` — und es wirkte nicht: die
   Regel weiter unten setzt fuer den Ueberlaufschutz `display: block`, und ein
   Blockcontainer kennt `align-items` nicht. Die 15-px-Zeile stand damit oben
   im 40-px-Kasten, um rund 12 px ueber der Mitte. Am 2026-08-25 gemessen:
   Kasten 48 px hoch, Textmitte bei 11,5 statt 24.

   `display: flex` konnte hier nicht bleiben: `text-overflow: ellipsis` gilt
   fuer Blockcontainer, ein Flex-Container gaebe den Ueberlauf hart
   abgeschnitten zurueck — und genau dieser Ueberlauf (32 px bei 320 px
   Fensterbreite) ist der Grund fuer die Regel weiter unten.

   Beides zugleich geht ohne zusaetzliches Markup so: die Zeilenhoehe **ist**
   die Trefferhoehe, das vertikale Polster entfaellt. Eine einzelne Zeile in
   einem Zeilenkasten dieser Hoehe steht mittig, der Container bleibt ein
   Blockcontainer, und `text-overflow` arbeitet weiter. Ein Wert, zweimal
   gelesen — Hoehe und Zeile koennen nicht mehr auseinanderlaufen. */
.lotzwoo-headerareas__login {
  --lotzwoo-kopf-treffer: 40px;
  box-sizing: border-box;
  min-width: var(--lotzwoo-kopf-treffer);
  min-height: var(--lotzwoo-kopf-treffer);
  padding: 0 8px;
  border-radius: 8px;
  color: var(--wp--preset--color--ink-900);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  line-height: var(--lotzwoo-kopf-treffer);
  text-decoration: none;
  white-space: nowrap;
}

.lotzwoo-headerareas__login:hover,
.lotzwoo-headerareas__login:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

/* Dieselbe Begruendung wie beim Zaehler und beim Chip: die Flaeche aus
   `ink-100` traegt 1.17:1 gegen `surface` und genuegt WCAG 1.4.11 nicht. */
.lotzwoo-headerareas__login:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 2px;
}

.lotzwoo-headerareas__customer-name {
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Die Preisklasse steht unter dem Namen und ist die leiseste Zeile im
   Kopf. Sie beantwortet die zweite Haelfte derselben Frage — zu welchen
   Konditionen — und ist bis heute nirgends sichtbar gewesen. */

/* AP-48: hier stand die Schnellsuche des Kopfes und die Begruendung, warum
   ihre Klappe an der Kopfzeile hing und nicht am Suchknopf. Beides ist mit ihr
   entfallen. `position: relative` bleibt — die Zeile ist weiter der Bezug fuer
   alles, was unter ihr aufklappt. */
.lotzwoo-header-row {
  position: relative;
}

/* Der Weg zu allem, was die Klappe nicht fasst. Er steht unter den
   Treffern statt neben dem Suchfeld: gelesen wird von oben nach unten,
   und wer nach sieben Zeilen nicht das Richtige gefunden hat, sucht
   genau dort weiter. Textknopf mit rotem Unterstrich — dieselbe Geste
   wie ein Fliesstext-Link, ADR 004. */
.lotzwoo-headerareas__all {
  display: block;
  margin-top: var(--wp--preset--spacing--20);
  padding-top: var(--wp--preset--spacing--20);
  border-top: 1px solid var(--wp--preset--color--ink-200);
  color: var(--wp--preset--color--ink-900);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 500;
  text-align: center;
  text-decoration: underline;
  text-decoration-color: var(--wp--preset--color--brand-500);
  text-underline-offset: 3px;
}

.lotzwoo-headerareas__all:hover,
.lotzwoo-headerareas__all:focus-visible {
  color: var(--wp--preset--color--brand-500);
}

.lotzwoo-headerareas__hint {
  margin: var(--wp--preset--spacing--20) 0 0;
  font-size: var(--wp--preset--font-size--sm);
  color: var(--wp--preset--color--ink-700);
}

/* Auf schmalen Schirmen schrumpft der Kundenchip, er verschwindet
   nicht. Bei 390px teilen sich Logo, Menuetaste, Suchknopf, Zaehler,
   Konto und Warenkorb eine Zeile von 343px, und ein Firmenname wie
   "Bersta Naturkost Grosshandel" braucht davon allein die Haelfte —
   also faellt weg, was der Kunde ohnehin weiss (das Wort "Kunde") und
   was ihn eine Antippbewegung entfernt auf der Kontoseite erwartet
   (die Preisklasse). Was bleibt, ist die Antwort auf die Frage: fuer
   wen.

   Weggeblendet und nicht entfernt: beide Zeilen stehen weiter im
   Markup und werden weiter vorgelesen. Ein Screenreader auf einem
   Telefon hoert dasselbe wie einer auf einem Schreibtisch. */
/* AP-48 Punkt 4: der 782er-Block ist ersatzlos entfallen. Er presste den
   Chip auf 9ch und blendete Label und Preisklasse weg — eine Schwelle, die
   niemand gemessen hatte (782 px ist Woos Admin-Bar-Grenze, nicht die
   dieses Kopfes). Was hier stand, uebernehmen die fuenf Verdichtungsstufen
   weiter unten, und die stehen an gemessenen Sprungstellen. */

/* =====================================================================
   Fuenf Verdichtungsstufen (AP-48, Punkt 4)

   Vorher: zwei Haltepunkte, 600 und 782 — beides Woos Zahlen, keine
   dieses Kopfes. Der Kopf brach dazwischen um, statt zurueckzutreten, und
   die Hoehe ueber der ersten Artikelzeile nahm einundzwanzig verschiedene
   Werte an. Die schlimmste Breite war dabei **nicht das Telefon**, sondern
   das kleine Notebook: bei 720–760 px stand die Kopfzeile mit 233 px am
   hoechsten, weil das Menue noch ausgeschrieben war und die Aktionsgruppe
   schon umgebrochen.

   Sechs Stufen waren geplant; es sind fuenf. Die 1260er hatte nur die
   Bestellannahme zu verstecken, und die entfaellt ersatzlos (Entscheidung
   des Auftraggebers, 2026-08-16).

     1040  zwei Menuepunkte
      880  Menueleiste wird Taste, Preisklasse, Beschriftungen ueber Ort
           und Termin
      700  Ort auf die Kurzform, Leiste einzeilig
      480  Favoriten-Stern (der Warenkorb hat keinen zweiten Weg, der
           Stern schon)
      400  Wochentag im Termin

   **Zurueckgetreten, nicht entfernt.** Jede dieser Angaben bleibt im
   Dokument und wird weiter vorgelesen. Wer den Kopf hoert statt ihn zu
   sehen, hoert auf 320 px dasselbe wie auf 1920.
   ===================================================================== */

/* --- Der `actions`-Platz: Favoriten und Warenkorb in der klebenden Bahn --- */

/* Der Behaelter der Kopfflaeche soll hier keine eigene Reihe aufmachen —
   seine Kinder gehoeren direkt in die Flex-Reihe der Leiste. */
.lotzwoo-contextbar__actions .lotzwoo-headerareas {
  display: contents;
}

/* Auf dem dunklen Grund der Leiste erben beide die Schrift der Leiste.
   Die Kopffassung setzt `ink-500` — auf `ink-900` waere das unlesbar. */
.lotzwoo-contextbar__actions .lotzwoo-headerareas__favorites,
.lotzwoo-contextbar__actions .wp-block-woocommerce-mini-cart,
.lotzwoo-contextbar__actions .wc-block-mini-cart__button {
  color: inherit;
}

/* =====================================================================
   AP-70 · B1 + B2 — zwei Schaltflaechen, eine Regel

   **Vier Unterschiede waren am 2026-08-20 gemessen**, und alle vier kamen
   aus derselben Wurzel: der Stern ist unser Markup (`header-areas.php`),
   der Warenkorb ist WooCommerces Mini-Cart-Block, und beide brachten ihre
   Kopfzeilen-Regeln mit — die eine ohne Flaechenpraefix, die andere mit.

     Flaeche   36 x 36 gegen min 40 x 40
     Kreis     Marke mit weissem Rand gegen **ungestylt** — die Regel dafuer
               steht unter `.lotzwoo-header-actions` und greift hier nicht
     Hover     greift gegen **greift nicht** (dasselbe Praefix-Problem)
     Grund     derselbe, `ink-900`

   **Der auffaelligste war der Hover:** auf dem dunklen Grund leuchtete der
   Stern als heller Kasten auf (`background: ink-100`), der Warenkorb daneben
   tat gar nichts. Zwei Schaltflaechen in einer Reihe, von denen eine auf den
   Zeiger reagiert.

   **Der Hover ist fuer den dunklen Grund gebaut, nicht vom Kopf geerbt.**
   Die Leiste hat fuer ihre eigenen Knoepfe bereits eine Sprache — 
   `rgba(255,255,255,.16)` im Ruhezustand, `.26` beim Ueberfahren, siehe
   `.lotzwoo-contextbar__switch` weiter oben. Sie wird hier genommen und
   nicht neu erfunden.

   **Eine Regel, zwei Flaechen** — doppelte Pflege ist der falsche Weg
   zurueck. Und sie steht unter `.lotzwoo-contextbar__actions`, also genau
   dort, wo sie greift; das war der ganze Befund der Kreis-Zeile. */
.lotzwoo-contextbar__actions .lotzwoo-headerareas__favorites,
.lotzwoo-contextbar__actions .wc-block-mini-cart__button {
  position: relative;
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Quadratisch, und die Kantenlaenge ist die Hoehe des Wechslers
     nebenan — ein Wert fuer drei Knoepfe, deklariert auf der Leiste.
     Vier gleiche Zeilen und nicht `aspect-ratio`: `min-width`/`min-height`
     muessen mitgehen, sonst zieht der Zaehler mit zweistelliger Zahl die
     Breite auf und aus dem Quadrat wird ein Rechteck. */
  width: var(--lotzwoo-contextbar-control-h, 34px);
  height: var(--lotzwoo-contextbar-control-h, 34px);
  min-width: var(--lotzwoo-contextbar-control-h, 34px);
  min-height: var(--lotzwoo-contextbar-control-h, 34px);
  padding: 0;
  border: 0;
  border-radius: 6px;
  background: rgba(255, 255, 255, 0.16);
  color: inherit;
  cursor: pointer;
  text-decoration: none;
}

.lotzwoo-contextbar__actions .lotzwoo-headerareas__favorites:hover,
.lotzwoo-contextbar__actions .lotzwoo-headerareas__favorites:focus-visible,
.lotzwoo-contextbar__actions .wc-block-mini-cart__button:hover,
.lotzwoo-contextbar__actions .wc-block-mini-cart__button:focus-visible {
  background: rgba(255, 255, 255, 0.26);
  color: inherit;
  text-decoration: none;
}

/* Der Fokusring in Weiss und nicht in der Markenfarbe: auf `ink-900` traegt
   Brand-500 den Kontrast nicht, den WCAG 1.4.11 mit 3:1 verlangt. Im Kopf
   ist es umgekehrt, deshalb steht dort eine andere Zeile. */
.lotzwoo-contextbar__actions .lotzwoo-headerareas__favorites:focus-visible,
.lotzwoo-contextbar__actions .wc-block-mini-cart__button:focus-visible {
  outline: 2px solid var(--wp--preset--color--white);
  outline-offset: 2px;
}

/* **Die Kreise verdecken das Symbol nicht mehr.** Sie sitzen auf der Ecke
   der Flaeche statt ueber dem 20er-Symbol darin; der Rand ist die
   Leistenfarbe und nicht Weiss, weil ein weisser Ring auf `ink-900` als
   zweiter Kreis liest. Wie viel Symbolflaeche sichtbar bleibt, steht als
   Zahl im Bericht — die Zahl entscheidet, nicht die Regel.

   **Der Kreis haengt an der Kantenlaenge des Knopfes, und das war bis
   2026-08-25 unausgesprochen.** Die 18 px hier waren fuer die 40er-Flaeche
   gerechnet: zwischen Symbolrand und Knopfecke lagen 10 px, der Kreis
   brauchte davon 6. Als die Flaeche auf 34 px ging — gleiche Hoehe wie der
   Wechsler nebenan —, blieben 7 px, und `ap70-leiste` meldete prompt 8,3 %
   verdeckte Symbolflaeche gegen 5 % erlaubte. **Die Suite hat den Fehler
   gefunden, nicht das Auge.**

   Gemessen wurde die ganze Reihe, nicht nur der Ausweg:

     Flaeche   Kreis    1 Ziffer   2 Ziffern   3 Ziffern
     40 px     18 px       1,8 %       5,7 %       9,5 %
     34 px     18 px       8,3 %      17,9 %          —
     34 px     15 px       2,3 %       7,4 %          —

   Daraus zwei Dinge. Erstens: 15 px ist der Wert, der zur 34er-Flaeche
   gehoert. Zweitens, und das ist der Nebenbefund: **die 5 % galten noch nie
   fuer zweistellige Zahlen** — auch die 40er-Flaeche lag dort bei 5,7 %. Die
   Suite misst mit dem echten Zaehlerstand, und der war einstellig. Wer die
   Zahl zweistellig braucht, misst sie zuerst; hier wird sie nicht stillgelegt.

   `top`/`inset-inline-end` gehen von 6 auf 5 px: der Kreis stand damit 1 px
   ueber der Leistenoberkante und wurde von deren `clip-path` angeschnitten.
   Jetzt schliesst er buendig damit ab. */
/* **Die laengere Kette ist Absicht.** Woos eigene Regel fuer sein Abzeichen
   gewinnt sonst beim Grund: gemessen am 2026-08-20 stand dort `rgb(255,255,255)`
   statt der Markenfarbe, waehrend jede andere Eigenschaft schon von hier kam —
   ein Kreis, der die halbe Regel dieses Blocks trug und die andere Haelfte von
   woanders. Mit `.lotzwoo-contextbar` davor tragen beide Flaechen dieselbe. */
.lotzwoo-contextbar .lotzwoo-contextbar__actions .lotzwoo-headerareas__badge,
.lotzwoo-contextbar .lotzwoo-contextbar__actions .wc-block-mini-cart__badge {
  position: absolute;
  top: -5px;
  inset-inline-end: -5px;
  box-sizing: border-box;
  min-width: 15px;
  height: 15px;
  padding: 0 3px;
  border: 1.5px solid var(--wp--preset--color--ink-900);
  border-radius: 8px;
  font-size: 10px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 12px;
  text-align: center;
  /* **Woos zwei letzte eigene Zeilen, und damit sitzen beide Kreise gleich**
     (2026-08-26, vom Auftraggeber gemeldet: „die Zahl am Warenkorb sitzt
     hoeher"). Am Klon nachgemessen, 1440 px, beide Knoepfe bei y = 99,7:

       Stern        Abzeichen y = 94,7   transform: none            margin: 0
       Warenkorb    Abzeichen y = 87,2   translateY(-50%) = -7,5px  margin-left: -44%

     Die 7,5 px sind die halbe Kreishoehe. Beides kommt aus Woos
     `mini-cart.css` (`.wc-block-mini-cart__badge`), die den Kreis an seinem
     eigenen Bezugsrahmen zentriert; `min-width` und `height` von dort hatte
     dieser Block laengst uebernommen, `transform` und `margin` nicht — und
     genau die zwei blieben uebrig.

     Kein `!important` noetig: diese Kette ist (0,3,0) gegen Woos (0,1,0).
     `margin` und nicht `margin-inline-start`, weil Woo physisch setzt und
     eine Null auf allen vier Seiten hier ohnehin das Gemeinte ist.

     Der Breitenunterschied, den dieselbe Messung zeigt, ist **keiner**:
     der Stern trug eine Ziffer, der Warenkorb zwei. `min-width` ist der
     Boden, oben waechst der Kreis mit dem Zaehler — an beiden gleich.

     **Nachtrag vom selben Tag: `left` gehoert dazu, und das war ein halber
     Fix.** Woos Regel lautet vollstaendig `left: 100%; margin-left: -44%` —
     die zwei sind ein Paar: `left` schiebt den Kreis komplett neben den
     Knopf, das negative Margin holt ihn wieder heran. Oben stand nur das
     Margin, also fiel die Rueckholung weg und `left: 100%` blieb stehen.
     Ergebnis, gemessen: der Kreis stand **15 px** rechts neben dem Knopf
     statt 5 px darueber — „neben statt auf dem Eck", wie es gemeldet wurde.
     Senkrecht stimmte es da schon, waagrecht war es schlechter als vorher.

       Stern       left (verwendet) 24 px   Ueberstand rechts  5 px
       Warenkorb   left  34 px = 100 %      Ueberstand rechts 15 px

     `left: auto` gibt die Waagrechte an `inset-inline-end: -5px` zurueck,
     und damit waechst der Kreis bei zweistelligen Zaehlern nach **links**
     in den Knopf hinein statt nach rechts aus ihm heraus — genau wie der
     Stern. Physisch `left` und nicht `inset-inline-start`, weil Woo physisch
     setzt: neutralisiert wird die Zeile, die dasteht. */
  left: auto;
  transform: none;
  margin: 0;
}

/* **`!important` ist hier kein Faustpfand, sondern die einzige Moeglichkeit —
   und der Befund dahinter ist derselbe wie beim Fokusring aus AP-45.**

   Woos Mini-Cart-Block faerbt sein Abzeichen ueber die Interactivity API:
   `data-wp-style--background-color="state.badgeBackgroundColor"` schreibt ein
   **inline** `style`-Attribut, und ein inline gesetzter Wert schlaegt jede
   Regel aus einem Stylesheet, gleich wie lang deren Kette ist. Am 2026-08-20
   im Dokument nachgesehen: `style="background-color: rgb(255,255,255); color:
   rgb(179,58,43)"`. Drei Anlaeufe mit steigender Spezifitaet blieben ohne
   Wirkung — jede andere Eigenschaft dieses Blocks kam schon von hier, nur die
   zwei Farben nicht.

   **Dasselbe gilt fuer die Kopffassung** (`.lotzwoo-header-actions
   .wc-block-mini-cart__badge` weiter oben): ihr `background` hat nie gewirkt,
   und niemand hat es gemessen. Sie bleibt unberuehrt — das ist ein
   Nebenbefund und gehoert in den Bericht, nicht in diesen Commit. */
.lotzwoo-contextbar .lotzwoo-contextbar__actions .wc-block-mini-cart__badge {
  background-color: var(--wp--preset--color--brand-500) !important;
  color: var(--wp--preset--color--white) !important;
}

.lotzwoo-contextbar .lotzwoo-contextbar__actions .lotzwoo-headerareas__badge {
  background-color: var(--wp--preset--color--brand-500);
  color: var(--wp--preset--color--white);
}

/* Woos Abzeichen liegt in einem eigenen Behaelter, der sonst selbst der
   Bezugsrahmen waere — dann sitzt der Kreis am Symbol statt an der Flaeche. */
.lotzwoo-contextbar__actions .wc-block-mini-cart__quantity-badge {
  position: static;
}

/* Ist die Aktionsgruppe leer (keine Kopfflaechen auf dieser Seite), soll sie
   auch keinen Zwischenraum kosten. Seit AP-70 kann sie leer sein: der
   Ausloeser steht daneben, nicht mehr darin. */
.lotzwoo-contextbar__actions:empty {
  display: none;
}

/* =====================================================================
   Drei Bahnen, und kein Punkt fliegt raus (AP-53)

   Die Zeile hatte zwei Kinder und `flex-wrap: wrap`: links Logo, Titel
   und Navigation, rechts die Aktionsgruppe. Ein drittes Kind dazwischen
   klebt an der linken Gruppe — `space-between` verteilt Zwischenraeume,
   es zentriert nichts. Die mittlere Bahn bekommt deshalb `flex: 1` und
   zentriert selbst: die Nummer steht damit in der Mitte der **Zeile** und
   nicht in der Mitte des Rests.

   **`nowrap`, und die Warnung dazu ist teuer bezahlt.** Ein Ueberlaufmenue
   und eine umbrechende Zeile arbeiten gegeneinander; die Zeile muss also
   auf `nowrap`. Genau diese Umstellung hat am 2026-08-17 eine Etage
   tiefer die Leiste bei 390 px Fenster auf 452 px hinausgeschoben — vier
   Pruefungen meldeten es. Nachgeben muessen die **Inhalte**: `min-width: 0`
   und Auslassungspunkte. Deshalb steht beides hier, und nicht nur das
   `nowrap`.
   ===================================================================== */

/* Ohne das schrumpft kein Flex-Kind je unter seinen Inhalt — und dann
   laeuft die Zeile waagrecht ueber, statt zu verdichten.

   **Und es reicht nicht an den direkten Kindern**, was am 2026-08-17 gemessen
   wurde und den Fehler vom selben Tag um ein Haar wiederholt haette: bei
   400 px stand der Kundenchip mit seiner rechten Kante auf 405 und schob das
   Dokument um 5 px hinaus, bei 320 px um 13. Vorher brach die Zeile an dieser
   Stelle um — mit `nowrap` tut sie es nicht mehr, und dann muss **jede**
   Ebene bis zum Text hinunter nachgeben duerfen. `min-width` ist nicht
   vererbbar; eine Ebene ohne die Zeile bricht die Kette.

   Die Ist-Messung vom 2026-08-16 hatte auf allen 161 Breiten **keinen**
   waagrechten Ueberlauf. Das war kein Zufall, sondern eine Eigenschaft, die
   zu halten ist. */
.lotzwoo-header-row > *,
.lotzwoo-header-row > * > *,
.lotzwoo-header-actions .lotzwoo-headerareas,
.lotzwoo-header-actions .lotzwoo-headerareas__customer {
  min-width: 0;
}

/* Was der Chip abschneidet, ist der Firmenname — und der ist die Angabe, die
   sich am ehesten verkuerzen laesst, ohne dass die Auskunft verlorengeht.
   Vorgelesen wird er weiter vollstaendig. */
/* **Ein Bedienelement gibt nicht nach — nachgeben ist Sache der Angaben.**
   Dieselbe Regel, die eine Etage tiefer schon steht („Favoriten, Warenkorb und
   Wechsler behalten ihre Groesse, ein halber Knopf ist keiner"), gilt hier fuer
   das Menue: bei 390 px abgemeldet war der Knopf „mehr" auf 39 px gequetscht,
   bei 40 px Mindestbreite — 34 px liefen aus seinem Kasten heraus und schoben
   das Dokument um 15 px hinaus. Gemessen am 2026-08-17; angemeldet trat es
   **nicht** auf, weil die Aktionsgruppe auf Inhaltsseiten leer ist und der
   Platz dann reicht.

   Was stattdessen nachgibt, steht daneben: der Seitentitel. Er ist die
   laengste und die verzichtbarste Angabe der linken Gruppe. */
.lotzwoo-header-row .wp-block-template-part {
  flex-shrink: 0;
}

/* Und die Kehrseite derselben Regel: was schrumpfen **darf**, muss auch
   abschneiden. Ein Flex-Kind mit `min-width: 0` wird schmaler als sein Text,
   und der Text laeuft dann heraus — sichtbar nicht, messbar sehr wohl. Der
   Anmeldelink lief so um 32 px ueber seinen Kasten hinaus. */
.lotzwoo-header-actions .lotzwoo-headerareas__login,
.lotzwoo-header-actions .lotzwoo-headerareas__customer-name {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Der Seitentitel schneidet ebenfalls ab — aber am **Absatz**, nicht am Link
   darin. `display: block` auf dem `<a>` gab ihm die volle Breite des
   Elternteils statt der seines Textes, und bei 320 px stand das Dokument
   danach auf 344. Eine Regel gegen einen Ueberlauf, die einen groesseren
   erzeugt: gemessen am 2026-08-17, zwischen zwei Durchlaeufen. */
.lotzwoo-header-row .wp-block-site-title {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Die mittlere Bahn. `flex: 1 1 0` und nicht `auto`: nur mit Basis 0
   teilen sich die Bahn und der freie Platz so auf, dass die Mitte der
   Zeile auch die Mitte bleibt, wenn links und rechts verschieden breit
   sind. */
.lotzwoo-header-mitte {
  flex: 1 1 0;
  justify-content: center;
  min-width: 0;
}

/* **Leeres Feld heisst nichts im Dokument.** Das Plugin gibt bei
   ungepflegter Nummer die leere Zeichenkette zurueck — der Gruppenkasten
   des Themes bliebe aber stehen und waere genau der leere Kasten, den die
   leere Zeichenkette vermeiden sollte, eine Etage hoeher: mit `blockGap`
   verschoebe er Konto-Chip und Warenkorb um eine Luecke.

   Zwei Regeln und nicht eine, und sie stehen getrennt: `:empty` verliert,
   sobald zwischen den Tags ein Zeilenumbruch steht — und genau das steht dort,
   die Vorlage rueckt ein. `:has()` verliert daran nicht. Getrennt stehen sie,
   damit ein Browser ohne `:has()` nicht beide wegwirft.

   **Und der Elternteil davor ist gemessen, nicht vorsorglich.** `:has(*)`
   zaehlt fuer die Spezifitaet wie sein Argument, und `*` zaehlt null: die Regel
   stand damit bei (0,1,0) — gleichauf mit WordPress' erzeugter Layoutklasse
   `.wp-container-core-group-is-layout-…`, die spaeter im Stapel steht und
   deshalb gewann. Am 2026-08-17 nachgemessen: der Selektor **traf**
   (`matches()` sagte ja) und `display` stand trotzdem auf `flex`. Eine Regel,
   die gegen den Kern verliert, sieht aus wie eine Regel — dieselbe Falle wie
   bei der 1040er-Stufe, nur an einer anderen Stelle. */
.lotzwoo-header-row > .lotzwoo-header-mitte:empty {
  display: none;
}

.lotzwoo-header-row > .lotzwoo-header-mitte:not(:has(*)) {
  display: none;
}

/* Die Bestellannahme selbst. Sie gibt nach, statt die Zeile zu sprengen —
   und wenn sie ganz weichen muss, holt das Skript sie ins „mehr". */
.lotzwoo-headerphone {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
  overflow: hidden;
  color: var(--wp--preset--color--ink-900);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 500;
  text-decoration: none;
  white-space: nowrap;
}

/* **Die Auslassungspunkte sitzen an der Nummer, nicht am Link** (AP-97). Seit
   der Hoerer davorsteht, ist der Link ein Flex-Kasten mit zwei Kindern; ein
   `text-overflow` auf ihm greift dann nicht mehr, und die Nummer waere hart
   abgeschnitten statt mit Punkten. */
.lotzwoo-headerphone__num {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Das Symbol schrumpft nicht mit: `min-width: 0` am Link laesst jedes Kind
   nachgeben, und ein zusammengedrueckter Hoerer sieht aus wie ein Defekt. */
.lotzwoo-headerphone__ico {
  flex: none;
}

/* Derselbe Schritt wie beim Konto-Symbol, und derselbe Grund: die Nummer ist
   die Auskunft, der Hoerer ist die Zierde.

   **Nur in der mittleren Bahn.** Wandert die Nummer weiter unten ins „mehr"
   oder ins Overlay, trifft dieser Selektor nicht mehr — dort steht sie in
   einer eigenen Zeile, dort ist Platz, und dort fuehrt das Symbol wieder. */
.lotzwoo-kopf--ohne-symbole .lotzwoo-header-mitte .lotzwoo-headerphone__ico {
  display: none;
}

a.lotzwoo-headerphone:hover,
a.lotzwoo-headerphone:focus-visible {
  color: var(--wp--preset--color--brand-500);
}

a.lotzwoo-headerphone:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 2px;
  border-radius: 6px;
}

/* --- Der Messzustand ------------------------------------------------

   **Ein Kasten, der nachgibt, meldet nie einen Ueberlauf.** Genau das ist
   der Sinn der drei Regeln darueber — und genau deshalb kann das Skript
   im Normalzustand nicht messen, ob die Punkte passen: `min-width: 0` und
   `flex-shrink` sorgen dafuer, dass immer alles „passt", nur eben
   abgeschnitten.

   Fuer die Dauer **eines** Animationsbildes nimmt diese Klasse dem Kopf
   das Nachgeben ab. Dann steht jedes Kind auf seiner natuerlichen Breite,
   und die Frage „passt das?" hat eine Antwort. Gemalt wird zwischendurch
   nicht — das Skript setzt, misst und raeumt im selben Durchlauf.

   `!important`, und das ist hier kein Notnagel: die Regeln, die
   ueberstimmt werden, sind die zwei Zeilen darueber und WordPress' eigene
   Layout-Ausgaben. Ein Messzustand, der von der naechsten Layout-Regel
   ausgehebelt wird, misst still das Falsche. */
.lotzwoo-header-row.lotzwoo-misst,
.lotzwoo-header-row.lotzwoo-misst * {
  flex-grow: 0 !important;
  flex-shrink: 0 !important;
  flex-basis: auto !important;
  min-width: auto !important;
  overflow: visible !important;
  text-overflow: clip !important;
}

/* --- Zwei Darstellungen, und Kerns 600 px sind keine davon ----------

   Der Kern kennt genau eine Schwelle: `@media (min-width: 600px)` blendet
   den Oeffner aus und macht aus dem Overlay-Behaelter eine gewoehnliche
   Zeile. Die 600 beschreiben nichts an diesem Kopf — sie sind Woos Zahl,
   so wie 782 die der Admin-Bar war (AP-48 hat sie aus demselben Grund
   herausgenommen).

   Umgeschaltet wird deshalb ueber eine Klasse, die `kopfleiste.js` aus der
   **Verteilung** setzt: sobald weniger als drei Punkte ausgeschrieben
   blieben, uebernimmt der Hamburger. Entscheidung des Auftraggebers vom
   2026-08-17.

   Das kostet vier Regeln, weil Kerns Medienregeln in **beide** Richtungen
   umgekehrt werden muessen: ueber 600 px den Oeffner einblenden, unter
   600 px die ausgeschriebene Leiste stehen lassen. Die Spezifitaeten sind
   nachgerechnet und nicht geschaetzt — Kerns Behaelter-Regel steht bei
   (0,3,0), und ein Gleichstand haenge sonst an der Ladereihenfolge zweier
   Stylesheets.
   ------------------------------------------------------------------- */

/* Ohne Hamburger: der Oeffner bleibt weg, auch unter 600 px. */
.lotzwoo-header-row:not(.lotzwoo-kopf--burger) .wp-block-navigation__responsive-container-open {
  display: none;
}

/* Ohne Hamburger: die Punkte stehen ausgeschrieben, auch unter 600 px.
   Dieselben fuenf Angaben, mit denen der Kern das ueber 600 px tut. */
.lotzwoo-header-row:not(.lotzwoo-kopf--burger)
  .wp-block-navigation__responsive-container:not(.is-menu-open) {
  position: relative;
  z-index: auto;
  display: block;
  width: 100%;
  background-color: inherit;
}

/* Mit Hamburger: der Oeffner kommt, auf jeder Breite. */
.lotzwoo-header-row.lotzwoo-kopf--burger
  .wp-block-navigation__responsive-container-open:not(.always-shown) {
  display: flex;
}

/* Mit Hamburger: die ausgeschriebene Leiste geht. Der **geoeffnete**
   Zustand ist davon unberuehrt — den regelt der Kern ueber `is-menu-open`,
   und daran wird nicht gedreht. */
.lotzwoo-header-row.lotzwoo-kopf--burger
  .wp-block-navigation__responsive-container:not(.is-menu-open):not(.hidden-by-default) {
  display: none;
}

/* Mit Hamburger gibt es kein „mehr". Zwei Menues nebeneinander waeren zwei
   Wege zu denselben sechs Punkten, und die Zusicherung lautet **genau
   eines**. */
.lotzwoo-header-row.lotzwoo-kopf--burger .lotzwoo-mehr {
  display: none !important;
}

/* --- Der Oeffner traegt sein Wort wieder (AP-48, Punkt 5) -----------

   Er war mit `overlayMenu: "never"` entfallen und ist mit der
   Klarstellung vom 2026-08-17 zurueck — also auch die Begruendung von
   AP-48: Woos Oeffner rendert nur ein Symbol, und ein Symbol allein sagt
   nicht, was dahinterliegt. Das Wort haengt der Filter in `functions.php`
   daneben; hier steht nur seine Groesse.

   Trefferflaeche mindestens 40 x 40 px, und das Wort bleibt bis 320 px
   hinunter stehen. */
.wp-block-navigation__responsive-container-open {
  align-items: center;
  gap: 6px;
  min-width: 40px;
  min-height: 40px;
  padding: 4px 8px;
}

.lotzwoo-navi-wort {
  font-size: var(--wp--preset--font-size--sm);
  line-height: 1;
}

/* --- Das Overlay des Hamburgers ------------------------------------

   Gemessen am 2026-08-17 auf 390 px, Overlay offen, bevor hier etwas stand:
   die Menuepunkte begannen bei **x = 0** — buendig an der Fensterkante, ohne
   jeden Innenabstand —, ihre Links waren **22 px** hoch, und der
   Schliessen-Knopf sass als 24 x 24 grosse Flaeche in der Ecke, ohne
   Mauszustand. Der Kern gestaltet dieses Overlay nicht; er oeffnet es nur.

   Drei Dinge macht dieser Abschnitt, und alle drei nur im **geoeffneten**
   Zustand (`.is-menu-open`): die ausgeschriebene Leiste benutzt denselben
   Behaelter, und was hier steht, hat in einer waagrechten Zeile nichts zu
   suchen.

   **1 · Die Punkte ruecken vom Rand.** Innenabstand am Dialog, nicht an jedem
   Eintrag — sonst sitzt der Schliessen-Knopf weiter buendig und die Kante
   bleibt uneinheitlich.

   **2 · Ein Eintrag ist so gross wie eine Trefferflaeche.** 44 px hoch statt
   22, und der Link nimmt die **ganze** Zeilenbreite: ein Menuepunkt, bei dem
   nur die sechs Buchstaben treffen, ist auf einem Telefon eine Zumutung. Das
   sind dieselben 44 px, die WCAG 2.5.8 als Zielgroesse nennt — der Kopf
   selbst arbeitet mit 40, aber dort steht ein Knopf neben dem anderen und
   nicht eine Liste, durch die gescrollt wird.

   **3 · Ein Mauszustand.** Bis hierher gab es nur `:focus-visible`; wer mit
   der Maus daruberfuhr, sah nichts. Dieselbe Flaeche `ink-100` wie beim
   Anmeldelink und beim Zaehler, damit es im Kopf nicht drei Antworten auf
   dieselbe Geste gibt.
   ------------------------------------------------------------------- */

/* **Der Dialog uebernimmt den Rhythmus der Kopfzeile**, damit beim Oeffnen
   nichts springt: dort steht die Marke bei x = 16 und y = 17, in einer 40 px
   hohen Zeile, die bei y = 12 beginnt. Also 16 px seitlich (`spacing--40`,
   derselbe Wert, den der Inhaltscontainer des Kopfs nimmt) und 12 px oben —
   die Marke sitzt dann in der Zeile mit dem 40 px hohen Schliessen-Knopf
   wieder auf derselben Hoehe wie zuvor. Gemessen, beide Zustaende. */
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-dialog {
  padding-inline: var(--wp--preset--spacing--40);
  padding-block-start: var(--wp--preset--spacing--30);
  padding-block-end: var(--wp--preset--spacing--40);
}

/* Die Liste traegt die volle Breite, damit die Eintraege es koennen.

   **Kein `gap` hier.** Ein erster Anlauf setzte 2 px und blieb wirkungslos:
   der Navigation-Block schreibt seinen Zwischenraum als **Inline-Stil** an die
   Liste, und dagegen gewinnt kein Selektor. Gemessen — die Regel stand da und
   die 4 px des Blocks blieben stehen. Eine Regel, die nichts tut, ist beim
   naechsten Lesen eine Falschauskunft; die 4 px sind ausserdem in Ordnung. */
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__container {
  width: 100%;
}

.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation-item {
  width: 100%;
}

/* **Diese lange Kette ist nachgemessen, nicht geraten.** Der Kern setzt im
   offenen Overlay `padding: 0` auf denselben Knoten, und zwar mit

     .wp-block-navigation__responsive-container.is-menu-open
       :where(:not(.disable-default-overlay))
       .wp-block-navigation__responsive-container-content
       .wp-block-navigation-item__content

   — das sind **(0,4,0)**; `:where()` zaehlt null. Zwei Anlaeufe sind daran
   gescheitert: ohne `header` stand die Regel bei (0,2,0) und verlor ueber die
   Ladereihenfolge, mit `header` bei (0,3,1) und verlor immer noch. Die
   Eintraege waren dabei jedes Mal 44 px hoch — die Hoehe kam durch, der
   Einzug nicht —, und die Bestellannahme darunter war als einzige
   eingerueckt. Erst mit dem `…-content` in der Kette steht sie bei (0,4,1).

   Die Lehre steht schon dreimal in dieser Datei und hier zum vierten Mal: eine
   Regel, die halb durchkommt, sieht aus wie eine, die wirkt. */
header .wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-container-content
  .wp-block-navigation-item__content {
  display: flex;
  align-items: center;
  /* `width: 100%` **und** Innenabstand: ohne `border-box` addiert sich beides,
     und der Link stand 24 px breiter da als sein Listeneintrag — auf 390 px
     also 12 px ueber den rechten Rand hinaus. Gemessen zwischen zwei
     Durchlaeufen. */
  box-sizing: border-box;
  width: 100%;
  min-height: 44px;
  padding-inline: 12px;
  border-radius: 8px;
  text-decoration: none;
}

header .wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-container-content
  .wp-block-navigation-item__content:hover,
header .wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-container-content
  .wp-block-navigation-item__content:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

/* Die Bestellannahme ist der einzige Eintrag, der keine Navigation ist —
   sie wandert nur hierher, wenn die Zeile sie nicht mehr traegt. Eine
   Haarlinie darueber sagt das, ohne ein Wort dafuer auszugeben. */
.wp-block-navigation__responsive-container.is-menu-open .lotzwoo-mehr__telefon {
  width: 100%;
  margin-block-start: var(--wp--preset--spacing--20);
  padding-block-start: var(--wp--preset--spacing--20);
  border-block-start: 1px solid var(--wp--preset--color--ink-200);
}

header .wp-block-navigation__responsive-container.is-menu-open
  .lotzwoo-mehr__telefon
  > * {
  display: flex;
  align-items: center;
  min-height: 44px;
  padding-inline: 12px;
}

/* Der Schliessen-Knopf bekommt dieselbe Trefferflaeche wie der Oeffner, den
   er zurueckdreht — 40 x 40 —, und denselben Mauszustand wie alles andere
   hier. Sein Fokusring bleibt nach innen versetzt: der Kern haelt ihn per
   `position` in der Ecke, und der Grund dafuer steht dort, wo der Ring
   gesetzt wird. */
.wp-block-navigation__responsive-container-close {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 40px;
  min-height: 40px;
  border-radius: 8px;
}

/* **Und er kommt zurueck in den Fluss.** Der Kern heftet ihn mit `position:
   absolute` in die obere rechte Ecke des Overlays — deshalb ignorierte er
   sowohl den Innenabstand des Dialogs als auch dessen Flex-Zeile: gemessen
   sass er auf y = 0, waehrend die Marke daneben auf y = 12 stand. Erst als
   `static` wird er ein Geschwister der Marke und steht wirklich in einer Zeile
   mit ihr.

   Damit ist auch der Aussenrand entfallen, den er vorher brauchte, um an
   derselben Kante zu enden wie die Eintraege — der Innenabstand des Dialogs
   traegt ihn jetzt fuer beide. */
header .wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-container-close {
  position: static;
}

/* --- Die Marke im Overlay ------------------------------------------

   Logo und Site-Titel wandern beim Oeffnen hierher (`kopfleiste.js`), weil
   der Titel der Weg ins Sortiment ist und das Overlay ihn sonst zudeckte:
   sechs Menuepunkte, eine Rufnummer, und kein Weg zurueck in den Katalog
   ausser ueber das Schliessen.

   Sie stehen links, der Schliessen-Knopf rechts, beide in **einer** Zeile.
   Der Dialog wird dafuer zur umbrechenden Zeile: Marke und Knopf teilen sich
   die erste, die Punkteliste bekommt mit `flex-basis: 100%` die zweite. */
header .wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-dialog {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--wp--preset--spacing--20);
}

header .wp-block-navigation__responsive-container.is-menu-open
  .lotzwoo-header-marke {
  flex: 1 1 auto;
  min-width: 0;
}

header .wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-container-content {
  flex: 0 0 100%;
}

.wp-block-navigation__responsive-container-close:hover {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
}

/* Und derselbe Mauszustand fuer den Oeffner. Bis zum 2026-08-17 stand im
   Kommentar zum Fokusring, der Ruhe- und Mauszustand der beiden Knoepfe sei
   „Gestaltung und laeuft als Stream F" — er ist jetzt beauftragt und hier. */
.wp-block-navigation__responsive-container-open:hover {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  border-radius: 8px;
}

/* --- „mehr" ---------------------------------------------------------

   Der Kern kennt kein Priority+. `core/navigation` kann genau zweierlei:
   ausgeschriebene Leiste, oder ganze Leiste hinter einer Overlay-Taste.
   Das hier ist Eigenbau — Markup aus `functions.php`, Verteilung aus
   `assets/js/kopfleiste.js`, Aussehen von hier.

   Trefferflaeche mindestens 40 x 40 px, wie beim Oeffner, den es abloest. */
.lotzwoo-mehr {
  position: relative;
}

/* **`hidden` allein versteckt hier nichts, und das ist gemessen.** Das
   Attribut wirkt ueber eine Regel des Browsers (`[hidden] { display: none }`),
   und jede Autorenregel schlaegt sie — der Kern setzt auf
   `.wp-block-navigation-item` ein `display: flex`. Ergebnis am 2026-08-17 bei
   1440 px: „mehr" stand da, mit leerem Untermenue, obwohl alle sechs Punkte in
   der Leiste waren. Eine Tuer in einen leeren Raum, und sie sah aus wie eine
   Regel, die greift.

   Derselbe Fehler wie beim Untermenue eine Regel tiefer, nur andersherum
   gefunden: dort war er vorsorglich verhindert, hier hat er zugeschlagen. */
.lotzwoo-mehr[hidden] {
  display: none !important;
}

.lotzwoo-mehr__knopf {
  display: flex;
  align-items: center;
  gap: 4px;
  min-width: 40px;
  min-height: 40px;
  padding: 4px 8px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: inherit;
  cursor: pointer;
  font: inherit;
  line-height: 1;
}

.lotzwoo-mehr__knopf:hover {
  color: var(--wp--preset--color--brand-500);
}

.lotzwoo-mehr__knopf:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: 2px;
}

/* Der Winkel dreht sich beim Oeffnen. Er sagt damit dasselbe wie
   `aria-expanded`, nur fuer die Augen. */
.lotzwoo-mehr__winkel {
  transition: transform 0.2s;
}

.lotzwoo-mehr__knopf[aria-expanded="true"] .lotzwoo-mehr__winkel {
  transform: rotate(180deg);
}

.lotzwoo-mehr__menue {
  position: absolute;
  inset-block-start: calc(100% + 4px);
  inset-inline-end: 0;
  z-index: 40;
  min-width: 12rem;
  margin: 0;
  /* Kein Innenabstand: die Eintraege gehen bis an den Rand. Was die runden
     Ecken aussen haelt, ist `overflow: hidden` — die Flaeche eines Eintrags
     wird an ihnen beschnitten, statt sie zu ueberdecken. */
  padding: 0;
  overflow: hidden;
  border: 1px solid var(--wp--preset--color--ink-200);
  border-radius: 8px;
  background: var(--wp--preset--color--surface);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
  list-style: none;
}

/* Ausdruecklich, weil die Regel darueber `display` nicht setzt und ein
   Reset des Kerns es jederzeit tun koennte. Ein Untermenue, das trotz
   `hidden` sichtbar bleibt, ist die Sorte Fehler, die nur auf einer
   fremden Installation auftritt. */
.lotzwoo-mehr__menue[hidden] {
  display: none;
}

/* Dieselbe Handschrift wie im Overlay: ein Eintrag ist so gross wie eine
   Trefferflaeche und nimmt die **ganze** Breite des Kastens. Damit seine
   Flaeche die runden Ecken nicht ueberdeckt, hat der Kasten keinen
   Innenabstand mehr und clippt stattdessen (`overflow: hidden`, oben).

   **Und deshalb liegt der Fokusring hier nach innen.** Ein clippender
   Vorfahre schneidet einen `outline` ab; das steht weiter oben schon einmal
   fuer den Schliessen-Knopf des Overlays, dreimal unabhaengig gemessen. Wer
   `overflow` setzt, schuldet dem Ring einen negativen Versatz. */
.lotzwoo-mehr__menue > li {
  display: block;
  width: 100%;
}

.lotzwoo-mehr__menue > li > * {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  width: 100%;
  min-height: 44px;
  padding-inline: 12px;
  text-decoration: none;
}

.lotzwoo-mehr__menue > li > *:hover,
.lotzwoo-mehr__menue > li > *:focus-visible {
  background: var(--wp--preset--color--ink-100);
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

.lotzwoo-mehr__menue > li > *:focus-visible {
  outline: 2px solid var(--wp--preset--color--brand-500);
  outline-offset: -2px;
}

/* Die Nummer im „mehr" darf ausschreiben — hier ist der Platz da, den sie
   in der Zeile nicht hatte. */
.lotzwoo-mehr__telefon .lotzwoo-headerphone {
  overflow: visible;
  text-overflow: clip;
}

/* --- Stufe 1040: zurueckgebaut (AP-53) -----------------------------

   Hier stand `display: none` auf `.lotzwoo-navi--sekundaer` — und das war
   genau das, was AP-53 abstellt: **zwei Menuepunkte flogen raus**, und
   niemand kam mehr an sie heran. „Ueber uns" und „Aktuelles" waren ab
   1040 px nicht verdichtet, sondern weg.

   Die Klasse bleibt, die Regel geht. Aus einer Ausblendung wird eine
   **Rangordnung**: was `.lotzwoo-navi--sekundaer` traegt, wandert zuerst
   ins „mehr" (`assets/js/kopfleiste.js` liest sie). Die redaktionelle
   Entscheidung dahinter bleibt damit erhalten und bekommt eine bessere
   Wirkung als vorher — erreichbar statt fort.

   Entscheidung des Auftraggebers vom 2026-08-17.
   ------------------------------------------------------------------- */

/* --- Stufe 880: zurueckgebaut (AP-53) ------------------------------

   Hier kehrten zwischen 600 und 880 px die beiden Regeln des Kerns um:
   der Oeffner kam zurueck, die ausgeschriebene Leiste ging. **„mehr"
   ersetzt die Menuetaste bis 320 px hinunter** — Entscheidung des
   Auftraggebers vom 2026-08-17 —, es gibt unterhalb keiner Breite zwei
   Menues nebeneinander. `overlayMenu` steht im Kindtheme auf `never`,
   damit der Kern bei 600 px nicht seine eigene Meinung hat.

   Was von der 880er-Stufe bleibt, steht gleich darunter: die
   Beschriftungen ueber Ort und Termin. Die haben mit dem Menue nichts zu
   tun und sind gemessen.
   ------------------------------------------------------------------- */

@media (max-width: 880px) {
  /* Hier trat bis zum 2026-08-17 die Preisklasse zurueck. Sie steht seither
     ueberhaupt nicht mehr im Chip — in welche Kundenklasse ein Kunde faellt,
     gehoert nicht in den Shop. Eine Stufe, die etwas wegblendet, das es nicht
     gibt, ist eine Zeile, die beim naechsten Lesen Fragen aufwirft. */

  /* Die Beschriftungen ueber Ort und Termin. Der Wert benennt sich selbst
     — „Wien 1100" braucht kein Wort „Lieferort" darueber, sobald der Platz
     knapp wird. Vorgelesen wird beides weiter. */
  .lotzwoo-contextbar__fact dt {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }

  /* Der Trenner zwischen Ort und Termin. Er trennte zwei Bloecke, die
     untereinander standen — sobald sie in **einer** Zeile stehen, trennt sie
     der Abstand, und der Strich kostet nur Platz. */
  .lotzwoo-contextbar__sep {
    display: none;
  }

  /* Ohne Beschriftung darueber steht der Wert allein — das Paar wird zur
     Zeile. Der Rest (nicht umbrechen, abschneiden statt wachsen) gilt seit
     dem 2026-08-17 ohne Medienbedingung und steht beim Grundstil. */
  .lotzwoo-contextbar__pair {
    flex-direction: row;
    align-items: baseline;
    gap: 4px;
  }
}

/* --- Stufe 880: der Oeffner kam an eine Breite gebunden (AP-53) -----

   Hier stand die Groesse von Woos Oeffner, und weiter oben eine
   Medienbedingung, die ihn zwischen 600 und 880 px einblendete. Beides ist
   fort: **wann** er erscheint, entscheidet seit dem 2026-08-17 nicht mehr
   eine Breite, sondern die gemessene Verteilung. Seine Groesse und sein
   Wort stehen bei den zwei Darstellungen weiter oben.
   ------------------------------------------------------------------- */

/* --- Stufe 700: der Ort nimmt seine Kurzform ------------------------

   Ohne sie stuende hier „Wien 1…", weil abgeschnitten wird, was nicht
   passt — also genau die Angabe, die den Ort identifiziert. Beide
   Fassungen stehen im Dokument (`Location::short_label()`); getauscht
   wird nur, welche sichtbar ist. Die volle bleibt fuer Vorlesewerkzeuge
   die maßgebliche, deshalb traegt die kurze `aria-hidden`. */
.lotzwoo-contextbar__location-short {
  display: none;
}

/* Dieselbe Bauart, zwei Stufen weiter unten angewandt: der Winkel des
   Schalters und der Bestellschluss ohne sein Wort stehen im Dokument und
   warten auf ihre Stufe. Was hier `display: none` traegt, ist die
   Ersatzfassung — nie die Angabe selbst. */
.lotzwoo-contextbar__cutoff-short {
  display: none;
}

@media (max-width: 700px) {
  /* **Nur zurücktreten, wenn eine Kurzform bereitsteht.**
     `Location::short_label()` schneidet am Gedankenstrich ab — „Wien 1100 —
     Hauptfiliale" wird „Wien 1100". Ein Ortsname **ohne** Trenner („Tour W4
     Dienstag") hat keine kuerzere Fassung, und die Vorlage zeichnet dann auch
     keine: sie setzt kein leeres Element fuer einen Fall, den es nicht gibt.

     Unbedingt gesetzt, versteckte diese Regel dann die einzige vorhandene
     Fassung — ab 700 px stand kein Ortsname mehr da. `eine-kontextleiste.mjs`
     hat das an 26 Stellen gemeldet, und die Zusicherung hatte recht.
     `:has()` fragt deshalb nach der Ersatzfassung, bevor es das Original
     wegnimmt. */
  .lotzwoo-contextbar__fact:has(.lotzwoo-contextbar__location-short)
    [data-lotzwoo-contextbar-location] {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }

  .lotzwoo-contextbar__location-short {
    display: block;
  }

  /* Einzeilig ist die Leiste schon eine Stufe hoeher (880). Was hier
     dazukommt, ist die Antwort auf die Frage, **wer** nachgibt, wenn es
     trotzdem eng wird.

     Erster Anlauf war `flex-wrap: nowrap` allein: dann schob der
     `actions`-Platz die Zeile auf 452 px hinaus, bei 390 px Fenster. Vier
     Pruefungen von `kopfflaechen.mjs` haben das gemeldet, und sie hatten
     recht — die Ist-Messung vom 2026-08-16 hatte auf allen 161 Breiten
     **keinen** waagrechten Ueberlauf, und das war kein Zufall, sondern eine
     Eigenschaft, die zu halten ist.

     Die Antwort war bis zum 2026-08-17: die Angaben schneiden ab, die
     Bedienelemente behalten ihre Groesse. Das war die halbe Miete und im
     Ergebnis falsch herum — der Entwurf des Auftraggebers laesst statt der
     Angabe den **Knopf** nachgeben: „der Knopf ‚Wechseln' entfaellt, weil die
     Leiste selbst antippbar wird — die 95 px, die er braucht, sind genau die,
     die dem Ortsnamen fehlen." Unten steht, wie das gebaut ist. */

  /* Der Zwischenraum wird schmaler. 8 px statt 16 — bei einer Leiste, die
     ihre Angaben abschneiden muss, ist jede Rinne ein Zeichen weniger. */
  /* Die laengere Kette steht dabei, weil die Ausrichtungsregel weiter oben
     `.wp-site-blocks > …` traegt und sonst gewinnt: die Rinnen blieben auf
     den Block-Flaechen bei 16 px, waehrend das Sortiment auf 10 ginge. */
  .lotzwoo-contextbar__inner,
  .wp-site-blocks > .lotzwoo-contextbar .lotzwoo-contextbar__inner {
    gap: 8px;
  }

  /* **Das Polster gilt nur den Block-Flaechen, nicht dem Sortiment**
     (2026-08-28, gemeldet).

     Bis hierher trugen beide Selektoren dasselbe `padding-inline`, und das
     war ein Versehen mit sichtbarer Folge: im Sortiment zeichnet der Kurzcode
     die Leiste **in** seinem eigenen Behaelter, der seine Seitenraender schon
     traegt. Oberhalb 700 px steht die Auskunft dort deshalb bei 0 und fluchtet
     mit Ueberschrift, Werkzeugleiste und Liste darunter — unterhalb 700 px
     ruckte sie um 10 px (unter 480 um 8) nach innen und stand als einzige
     Flaeche der Seite aus der Flucht.

     Auf Warenkorb, Konto und Favoriten haengt dieselbe Leiste als Block
     direkt in `.wp-site-blocks`, ausserhalb jeder Inhaltsspalte. Dort ist das
     Polster das einzige, was die Auskunft vom Fensterrand fernhaelt, und dort
     bleibt es. */
  .wp-site-blocks > .lotzwoo-contextbar .lotzwoo-contextbar__inner {
    padding-inline: 10px;
  }

  .lotzwoo-contextbar__facts {
    gap: 8px;
  }

  /* **Nachgeben darf der Ort, nicht der Termin.** Die Regel steht so im
     Entwurf und ist die, ohne die alles andere nichts nuetzt: solange beide
     Faecher gleichermassen schrumpfen durften, wurde der Termin auf 96 px
     gequetscht und der Bestellschluss darin — 252 px breit — von
     `overflow: hidden` einfach abgeschnitten. Auf 390 px stand dort ein
     Uhrsymbol ohne Uhrzeit.

     Der Termin ist die Angabe mit der Frist daran; der Ortsname ist die, die
     sich kuerzen laesst, ohne dass die Auskunft verlorengeht — und fuer ihn
     steht die Kurzform bereit. */
  .lotzwoo-contextbar__fact {
    flex: 0 1 auto;
    min-width: 0;
  }

  /* Der Ort gibt **zuerst** nach, und zwar viermal so schnell. Ein blosses
     „der Termin schrumpft gar nicht" (so steht es im Entwurf) rechnet mit
     dessen Zeichenketten: dort steht „Sa., 15.08." und „16:03", hier
     „Do., 20.08.2026" und „19.08.2026, 15:33" — 274 px statt 190. Gemessen
     stand der Termin damit auf 390 px ueber den Rand hinaus und der
     Bestellschluss wurde abgeschnitten, also genau die Angabe mit der Frist
     daran. Beide duerfen jetzt nachgeben, der Ort viel frueher. */
  .lotzwoo-contextbar__fact:first-child {
    flex-shrink: 4;
    /* **Aber nie auf null.** „Viermal so schnell" heisst ohne Untergrenze:
       auf 320 px war der Ortsname 0 px breit, und `eine-kontextleiste.mjs`
       hat genau das gemeldet — die Zusicherung dort verlangt, dass beide
       Angaben Flaeche haben, und sie hat recht: ein Lieferort, den man nicht
       sieht, ist der Befund, gegen den dieser ganze Umbau angetreten ist.

       6ch sind gemessen die Breite, ab der die Kurzform noch etwas sagt
       („Wien 1…", „Mödling"). Was darunter fehlt, nimmt sich der Termin vom
       eigenen Datum — sein Abzeichen mit der Frist bleibt davon unberuehrt. */
    min-width: 6ch;
  }

  /* **Und im Termin gibt das Datum nach, nie der Bestellschluss.** Dafuer
     wird die Angabe zur Zeile: der Text schneidet mit Auslassungspunkten ab,
     das Abzeichen behaelt seine Groesse. Ohne das kuerzt `text-overflow`
     beides gemeinsam — und weil das Abzeichen hinten steht, verschwindet es
     zuerst. */
  .lotzwoo-contextbar__fact [data-lotzwoo-contextbar-appointment] {
    display: flex;
    align-items: baseline;
    gap: 4px;
    min-width: 0;
  }

  .lotzwoo-contextbar__fact [data-lotzwoo-contextbar-appointment-text] {
    overflow: hidden;
    min-width: 0;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .lotzwoo-contextbar__cutoff {
    flex: none;
  }

  /* Wechsler: seit dem 2026-09-24 auf jeder Breite ein Winkel direkt hinter
     den Angaben — die Regeln stehen oben bei `.lotzwoo-contextbar__switch`
     und gelten hier unveraendert. */

  /* Die Langformen treten zurueck: das Zeitfenster hinter dem Datum und das
     Wort „Bestellschluss" vor der Uhrzeit. Beides steht in der Klappe, die
     der Schalter daneben oeffnet, und beides bleibt im Dokument stehen —
     weggeblendet wird es fuer die Augen, nicht fuers Vorlesen. */
  .lotzwoo-contextbar__lang {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }

  .lotzwoo-contextbar__cutoff-short {
    display: inline;
  }

  /* **Im Warnfenster gewinnt die Restzeit den Platz.** Unter 700 px steht im
     Abzeichen sonst die blosse Uhrzeit („13:11"), und die beantwortet die
     Frage, die in der letzten Stunde zaehlt, schlechter als „noch 25 Min."
     — sie verlangt die Rechnung, die der Kunde gerade nicht machen will.
     Beides nebeneinander passt auf 390 px nicht; also tritt der Zeitpunkt
     zurueck, solange es eilt, und kommt darueber wieder. */
  .lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="warn"] .lotzwoo-contextbar__cutoff-short,
  .lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="urgent"] .lotzwoo-contextbar__cutoff-short,
  .lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="late"] .lotzwoo-contextbar__cutoff-short {
    display: none;
  }

  /* Und ohne den Zeitpunkt daneben braucht die Restzeit ihr Trennzeichen
     nicht mehr. */
  .lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="warn"] .lotzwoo-contextbar__cutoff-rest::before,
  .lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="urgent"] .lotzwoo-contextbar__cutoff-rest::before,
  .lotzwoo-contextbar__cutoff[data-lwb-cutoff-stage="late"] .lotzwoo-contextbar__cutoff-rest::before {
    content: none;
  }
}

/* --- Stufe 480: der Favoriten-Stern --------------------------------

   Er geht und der Warenkorb bleibt, weil der Stern einen zweiten Weg hat
   (die Favoritenseite, aus dem Konto erreichbar) und der Warenkorb keinen.
   Punkt 6 verlangt ausdruecklich, dass der Warenkorb auf **jeder** Breite
   an derselben Stelle steht. */
@media (max-width: 480px) {
  .lotzwoo-contextbar__actions .lotzwoo-headerareas__favorites {
    display: none;
  }

  /* Und die Rinnen enger. Der Entwurf beziffert, was das bringt: „die 14 px
     sind genau die, die zwischen ‚Wien 11…' und ‚Wien 1100' liegen" — auf
     390 px gemessen. Eine Stufe, die nur etwas wegnimmt, verschenkt den
     Platz, den das Wegnehmen frei macht. */
  .lotzwoo-contextbar__inner,
  .wp-site-blocks > .lotzwoo-contextbar .lotzwoo-contextbar__inner {
    gap: 6px;
  }

  /* Wieder nur die Block-Flaechen — dieselbe Begruendung wie eine Stufe
     hoeher. Im Sortiment bleibt die Auskunft bei 0 und in der Flucht. */
  .wp-site-blocks > .lotzwoo-contextbar .lotzwoo-contextbar__inner {
    padding-inline: 8px;
  }

  .lotzwoo-contextbar__facts {
    gap: 6px;
  }

  .lotzwoo-contextbar__cutoff {
    margin-inline-start: 0.35em;
    padding: 2px 6px;
  }
}

/* --- Stufe 400: der Wochentag --------------------------------------

   „Sa., 15.08.2026" wird „15.08.2026". Das Datum traegt den Wochentag
   ohnehin; auf 390 px ist er die teuerste Silbe im Kopf. */
@media (max-width: 400px) {
  .lotzwoo-contextbar__weekday {
    display: none;
  }
}

/* -------------------------------------------------------------------
   WooCommerce zwingt seinen Seiten eine eigene Inhaltsbreite auf —
   und bricht damit die linke Kante (AP-58)

   `woocommerce-blocktheme.css` setzt auf Konto, Warenkorb und Kasse:

       .woocommerce-account .wp-block-post-title,
       .woocommerce-account main .woocommerce, …   { max-width: 1000px }

   Unser `contentSize` ist **960px** (`theme.json`). Der Seitentitel bekommt
   damit 1000, der Inhalt darunter bleibt bei 960 — beide zentriert, und die
   Differenz von 40px verteilt sich auf zwei Seiten. Gemessen am 2026-08-17 auf
   `/konto/` bei 1440px: Überschrift links bei **220**, erster Reiter bei
   **240**. Bei 390px stehen beide auf 16, weil dort nichts mehr zu zentrieren
   ist — deshalb sieht man den Fehler nur breit.

   **Warum es nur auf der Kontoseite auffällt und die Regel trotzdem global
   ist:** Woos Liste trifft drei Seiten, aber nur das Konto stellt Titel und
   eingerückte Navigation direkt untereinander. Warenkorb und Kasse tragen
   denselben Versatz, ohne dass er dort eine Kante bricht. Eine Regel, die nur
   `.woocommerce-account` heilte, ließe den Fehler an zwei Stellen stehen und
   wartete darauf, dass ihn dort jemand findet.

   **Wirkungslos überall sonst:** die drei Klassen setzt WooCommerce selbst auf
   `<body>`, und ohne sie greift nichts hier. Eine gewöhnliche Inhaltsseite
   bleibt unberührt — nachgemessen.
   ------------------------------------------------------------------- */
.woocommerce-account .wp-block-post-title,
.woocommerce-account main .woocommerce,
.woocommerce-cart .wp-block-post-title,
.woocommerce-cart main .woocommerce,
.woocommerce-checkout .wp-block-post-title,
.woocommerce-checkout main .woocommerce {
  max-width: var(--wp--style--global--content-size);
}

/* --- Ausser dem Titel, der sich selbst als `alignwide` ausweist ------

   Die Regel darueber ist fuer die Kontoseite gebaut und trifft drei Seiten.
   Auf dem Warenkorb bricht sie genau die Kante, von der der Kommentar oben
   sagt, sie bleibe dort heil: `templates/page-cart.html` gibt dem Titel
   `{"align":"wide"}` und dem Warenkorbblock `alignwide`, beide sollen also
   auf derselben Linie stehen. Gemessen am 2026-08-18 bei 1440px stand der
   Titel bei x=240 mit 960px Breite, der Block darunter bei x=16 mit 1408 —
   **224px Versatz zwischen einer Ueberschrift und ihrem eigenen Inhalt.**

   Kein Zurueckdrehen der Regel darueber: sie nimmt Woos Versatz weiter weg,
   wo niemand `alignwide` gesagt hat. Ausgenommen ist nur, was die Vorlage
   ausdruecklich breit stellt — dort gilt wieder `wideSize`, dieselbe Zahl,
   die der Kern jedem anderen `alignwide` gibt. */
.woocommerce-cart .wp-block-post-title.alignwide,
.woocommerce-checkout .wp-block-post-title.alignwide {
  max-width: var(--wp--style--global--wide-size);
}

/* =====================================================================
   Der Kaufweg — Warenkorb, Kasse, Bestellbestaetigung und Seitenkorb
   (AP-61)

   Vier Flaechen, die WooCommerce selbst zeichnet, und bis zum 2026-08-18
   die einzigen im ganzen Portal ohne eine einzige Zeile dieses Themes.
   Was dort stand, war Woos Werkseinstellung — und die ist nicht neutral,
   sondern ein eigenes, fremdes Design-System: kalte Linien aus
   `currentColor`, 4px-Radien, acht festverdrahtete Hinweisfarben, Schwarz
   als Auswahlfarbe.

   **Der Befund in einem Satz:** derselbe Kunde sieht im Sortiment die
   Marke des Shops und drei Klicks spaeter WooCommerce. Gemessen am
   2026-08-18 an `/warenkorb/`, `/kasse/`,
   `/kasse/bestellung-erhalten/581/` und am Seitenkorb, bei 1440px, gegen
   die Werte, die `.lwb-input`, `.lwb-panel` und `.lwb-alert` im Sortiment
   auf derselben Installation tatsaechlich zeichnen.

   **Warum hier und nicht im Plugin** — dieselbe Antwort wie bei
   `.lotzwoo-contextbar`, `.lotzwoo-heldback` und den Kopfflaechen: das
   Plugin entscheidet, *was* im Kaufweg steht (Artikelnummer,
   zurueckgehaltene Positionen, Bestellkontext), dieses Theme *wie* es
   aussieht. Und es steht in `--wp--preset--*` statt in `--lwb-*`, weil
   diese Flaechen nicht unter den acht Wurzeln liegen: ein `var(--lwb-…)`
   loest hier auf nichts auf, und zwar lautlos.

   **Die Reihenfolge traegt hier mit.** Woos Blockstile stehen im Dokument
   als Handles 11 bis 22, diese Datei als 31 (abgelesen 2026-08-18 auf
   `/warenkorb/`). Regeln gleicher Spezifitaet gewinnen deshalb hier. Wer
   das Enqueue umbaut, bricht diesen Abschnitt, ohne dass etwas rot wird.
   ===================================================================== */

/* --- 1. Eine Linie, und es ist die der Marke -------------------------

   ADR 004 verlangt „feine Linien statt Kaesten", und die Linie ist
   `ink-200` — dieselbe Zahl, die weiter oben schon die Trennlinie, die
   Kopfunterkante und die Fusskante traegt.

   Woo zieht stattdessen jede Linie als
   `color-mix(in srgb, currentColor 20%, transparent)`. Auf `ink-900`
   ergibt das ein kaltes Grauschwarz — gemessen
   `color(srgb 0.105882 0.0980392 0.0862745 / 0.2)` an der Warenkorbtabelle,
   an den Adresskaesten der Bestaetigung und am Trennstrich ueber den AGB,
   und mit 30% am Mengenwaehler und an der Fusskante des Seitenkorbs.
   Neben `#e4daca` steht das wie ein Ausdruck neben einem Druck.

   **Aufgezaehlt statt pauschal.** Ein `border-color` auf alle Nachkommen
   traefe auch Fokusringe, Abzeichen und Knopfkanten. Was hier steht, ist
   die Liste der Linien, die auf den vier Flaechen tatsaechlich sichtbar
   waren; eine, die Woo nur im Ladezustand oder in der Expresskasse zieht,
   steht bewusst nicht dabei. */
.wp-block-woocommerce-cart .wc-block-cart__main .wc-block-cart-items,
.wp-block-woocommerce-cart .wc-block-cart__main .wc-block-cart-items td,
.wp-block-woocommerce-cart table.wc-block-cart-items .wc-block-cart-items__row,
.wp-block-woocommerce-cart .wp-block-woocommerce-cart-order-summary-block,
.wp-block-woocommerce-cart .wp-block-woocommerce-cart-order-summary-totals-block,
.wp-block-woocommerce-checkout .wp-block-woocommerce-checkout-order-summary-block,
.wp-block-woocommerce-checkout .wc-block-components-checkout-order-summary__title,
.wp-block-woocommerce-checkout .wc-block-components-checkout-order-summary__content.is-open,
.wp-block-woocommerce-checkout .wp-block-woocommerce-checkout-order-summary-totals-block,
.wp-block-woocommerce-checkout .wc-block-components-address-card,
.wp-block-woocommerce-checkout .wc-block-checkout__terms--with-separator,
.wp-block-woocommerce-checkout .wc-block-components-shipping-rates-control__package--multiple,
.wp-block-woocommerce-checkout .wc-block-components-local-pickup-select--multiple,
.wp-block-woocommerce-checkout .wc-block-components-panel.has-border,
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked::after,
.wc-block-mini-cart__drawer .wc-block-mini-cart__footer,
.wc-block-order-confirmation-totals__table,
.wc-block-order-confirmation-totals__table td,
.wc-block-order-confirmation-totals__table th,
.wc-block-order-confirmation-shipping-address,
.wc-block-order-confirmation-billing-address,
.wc-block-order-confirmation-additional-fields,
.wc-block-cart-item__quantity .wc-block-components-quantity-selector {
  border-color: var(--wp--preset--color--ink-200);
}

/* Zwei Linien zeichnet Woo nicht als Rahmen, sondern als 1px hohes
   `::after` mit Hintergrundfarbe — die Trenner zwischen den Versand- und
   Zahlungsoptionen. Dieselbe Farbe, andere Eigenschaft. */
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked .wc-block-components-radio-control__option::after,
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked div.wc-block-components-radio-control-accordion-option::after {
  background: var(--wp--preset--color--ink-200);
}

/* --- 2. Die Radien der Skala ----------------------------------------

   Woo setzt ueberall 4px. Die Skala kennt 5 / 8 / 12, und der Kaufweg ist
   die einzige Stelle im Portal, an der 4 vorkam. Angewandt wie im
   Sortiment: 8 fuer alles, was man bedient (Feld, Mengenwaehler, Option,
   Hinweis), 12 fuer die Kaesten, die Inhalt tragen (`.lwb-panel` = 12). */
.wp-block-woocommerce-checkout .wc-block-components-form .wc-block-components-text-input input,
.wp-block-woocommerce-checkout .wc-block-components-address-card,
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked::after,
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked .wc-block-components-radio-control-accordion-option--checked-option-highlighted,
.wp-block-woocommerce-checkout .wc-block-components-shipping-rates-control__package--multiple,
.wp-block-woocommerce-checkout .wc-block-components-local-pickup-select--multiple,
.wc-block-cart-item__quantity .wc-block-components-quantity-selector,
.wc-block-components-notice-banner {
  border-radius: 8px;
}

.wp-block-woocommerce-checkout .wp-block-woocommerce-checkout-order-summary-block,
.wc-block-order-confirmation-totals__table,
.wc-block-order-confirmation-shipping-address,
.wc-block-order-confirmation-billing-address,
.wc-block-order-confirmation-additional-fields {
  border-radius: 12px;
}

/* --- 3. Die Hinweise tragen die Palette -----------------------------

   Acht festverdrahtete Hexwerte stehen in `wc-blocks.css`: `#fff0f0`,
   `#cc1818`, `#fffbf4`, `#f0b849`, `#f4fff7`, `#4ab866`, `#f4f8ff`,
   `#007cba` — dazu `#2f2f2f` fuer Text und Symbol. Keiner davon steht in
   einer der beiden `theme.json`.

   Gemessen hat das am 2026-08-18 den Mindestbestellwert-Hinweis auf
   `/warenkorb/` und im Seitenkorb in Woo-Rot statt in `err-500` gezeigt —
   zwei Rottoene in einem Bild, und der falsche war der lautere.

   Die drei Randfarben sind die des Plugins (`.lwb-alert--warn|err|info`,
   `b2b-shop.css`), Zeichen fuer Zeichen. Damit sehen der Hinweis im
   Sortiment und der im Warenkorb gleich aus — das ist der Zweck. Fuer
   `is-success` hat das Plugin keine Vorlage; dort steht die einzige
   errechnete Farbe dieses Abschnitts. */
.wc-block-components-notice-banner {
  border-color: var(--wp--preset--color--ink-200);
  background-color: var(--wp--preset--color--ink-50);
  color: var(--wp--preset--color--ink-700);
  font-size: var(--wp--preset--font-size--sm);
}

.wc-block-components-notice-banner > svg {
  background-color: var(--wp--preset--color--ink-500);
}

.wc-block-components-notice-banner.is-error {
  border-color: #f4b9b9;
  background-color: var(--wp--preset--color--err-50);
  color: var(--wp--preset--color--err-700);
}

.wc-block-components-notice-banner.is-error > svg {
  background-color: var(--wp--preset--color--err-500);
}

.wc-block-components-notice-banner.is-warning {
  border-color: #f4d9a4;
  background-color: var(--wp--preset--color--warn-50);
  color: var(--wp--preset--color--warn-500);
}

.wc-block-components-notice-banner.is-warning > svg {
  background-color: var(--wp--preset--color--warn-500);
}

.wc-block-components-notice-banner.is-info {
  border-color: #b9cff2;
  background-color: var(--wp--preset--color--info-50);
  color: var(--wp--preset--color--info-500);
}

.wc-block-components-notice-banner.is-info > svg {
  background-color: var(--wp--preset--color--info-500);
}

.wc-block-components-notice-banner.is-success {
  border-color: color-mix(in srgb, var(--wp--preset--color--ok-500) 35%, transparent);
  background-color: var(--wp--preset--color--ok-50);
  color: var(--wp--preset--color--ok-500);
}

.wc-block-components-notice-banner.is-success > svg {
  background-color: var(--wp--preset--color--ok-500);
}

/* --- 4. Die Auswahl traegt die Marke, nicht Schwarz ------------------

   `wc-blocks.css` zeichnet den Punkt der gewaehlten Versand- oder
   Zahlungsart als `background:#000` und ihren Rahmen als
   `inset 0 0 0 1.5px currentColor`. Gemessen ergab das auf der Kasse eine
   schwarze Auswahlmarke in einem Shop, dessen Akzent `#b33a2b` ist — die
   einzige Stelle im ganzen Kaufweg, an der eine Zustandsfarbe vorkommt,
   und sie sagt nichts ueber die Marke.

   Der ungewaehlte Rahmen kommt von `currentColor 48%` und wird `ink-350`,
   dieselbe Rolle („Rahmen Bedienelement"), die `.lwb-input` im Sortiment
   traegt. */
.wp-block-woocommerce-checkout .wc-block-components-radio-control__input {
  border-color: var(--wp--preset--color--ink-350);
  background: var(--wp--preset--color--white);
}

.wp-block-woocommerce-checkout .wc-block-components-radio-control__input:checked {
  border-color: var(--wp--preset--color--brand-500);
}

.wp-block-woocommerce-checkout .wc-block-components-radio-control__input:checked::before {
  background: var(--wp--preset--color--brand-500);
}

.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked .wc-block-components-radio-control-accordion-option--checked-option-highlighted,
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked .wc-block-components-radio-control__option--checked-option-highlighted {
  box-shadow: inset 0 0 0 1.5px var(--wp--preset--color--brand-500);
}

/* --- 5. Felder und Kaesten wie im Sortiment -------------------------

   `.lwb-input` zeichnet am 2026-08-18 gemessen: `1px solid #8c8073`,
   Radius 8, Flaeche `#fbf7f0`. Woos Feld auf der Kasse zeichnete
   `1px solid color(srgb 0.168 0.176 0.184 / 0.8)`, Radius 4, Flaeche
   `#ffffff` — auf einer cremefarbenen Seite ein weisser Kasten mit
   grauem Rand.

   **Die Schriftgroesse bleibt bei 16px**, obwohl `.lwb-input` 15 traegt.
   Das ist keine Nachlaessigkeit: unter 16px zoomt iOS Safari beim
   Hineintippen in das Feld hinein, und diese 16 sind Woos Antwort darauf.
   Ein Pixel Abweichung gegen einen Sprung der ganzen Seite auf dem Telefon
   ist kein Tausch, den dieser Abschnitt machen sollte. */
.wp-block-woocommerce-checkout .wc-block-components-form .wc-block-components-text-input input,
.wp-block-woocommerce-checkout .wc-block-components-form .wc-block-components-textarea {
  border-color: var(--wp--preset--color--ink-350);
  background-color: var(--wp--preset--color--surface);
}

/* Woos Fokuszustand setzt `border: 1.5px solid` **ohne Farbe** — der Rahmen
   springt damit auf `currentColor`, also auf die Textfarbe, und der einzige
   Unterschied zum Ruhezustand waere ein halbes Pixel Dicke. Das Sortiment
   zeigt Fokus als Ring in der Marke (`--lwb-focus`); dieselbe Form hier,
   ausgeschrieben, weil dieser Token unter den acht Wurzeln liegt und hier
   auf nichts aufloesen wuerde. */
.wp-block-woocommerce-checkout .wc-block-components-form .wc-block-components-text-input input:focus,
.wp-block-woocommerce-checkout .wc-block-components-form .wc-block-components-textarea:focus {
  border-color: var(--wp--preset--color--brand-500);
  outline: none;
  box-shadow:
    0 0 0 2px var(--wp--preset--color--brand-500),
    0 0 0 5px color-mix(in srgb, var(--wp--preset--color--brand-500) 25%, transparent);
}

/* Der Mengenwaehler steht im Warenkorb **und** im Seitenkorb, und sein
   Eingabefeld erbte keine Schrift: gemessen `Arial 13px` mitten in einer
   Seite, die durchgehend Inter traegt. `font: inherit` waere zu viel — es
   naehme dem Feld auch seine Groesse; geerbt wird nur die Familie. */
.wc-block-components-quantity-selector .wc-block-components-quantity-selector__input {
  font-family: inherit;
}

/* --- 6. Die Bestellbestaetigung kommt auf die Skala zurueck ----------

   Zwei Werte fielen dort heraus, und beide haben dieselbe Ursache: Woo
   haengt an `woocommerce/order-confirmation-status` die Kernklasse
   `has-large-font-size`. `large` ist ein Preset des **Kerns**, keines
   dieser `theme.json` — es loest auf 36px auf. Der Absatz „Vielen Dank…"
   stand damit bei 36px, und die blanke `<h1>` darin bei ihren
   Browservorgabe-`2em` davon, also **72px**. Der groesste Schritt der
   Skala ist `3xl` = 30px, und genau den traegt der Seitentitel des
   Warenkorbs nebenan. Zwei Seiten desselben Kaufwegs, zwei Titelgroessen
   im Verhaeltnis 1:2,4.

   Die `<h1>` bekommt deshalb die Groesse jedes anderen Seitentitels, der
   Absatz die Vorspann-Stufe `lg`. */
.wc-block-order-confirmation-status.has-large-font-size {
  font-size: var(--wp--preset--font-size--lg);
}

.wc-block-order-confirmation-status h1 {
  font-size: var(--wp--preset--font-size--3xl);
}

/* Woos eigene Ueberschrift der Positionstabelle traegt `style="font-size:24px"`
   inline — ein Attributwert, den keine Regel schlaegt. Er liegt zufaellig auf
   `2xl` und bleibt deshalb stehen; hier steht nur, dass er geprueft wurde. */

/* --- 7. Der Seitenkorb ----------------------------------------------

   Drei Aenderungen kommen aus dem Auftrag vom 2026-08-18 und nicht aus
   einer Messung: der Titel heisst „Warenkorb", die Artikelnummer entfaellt,
   und die Variante zieht zum Preis in eine Zeile.

   **Der Titel liegt nicht hier**, sondern in `parts/mini-cart.html` — er
   ist ein Blockattribut, keine Farbe. Was hier steht, ist seine Groesse:
   gemessen 32px, damit **groesser als der Seitentitel des Warenkorbs
   (30px)**, den die Schublade nur zusammenfasst. Er bekommt `xl`, dieselbe
   Stufe wie die Schritt-Ueberschriften der Kasse.

   **Artikelnummer und Variante kommen beide aus einem Filter des Plugins
   bzw. aus der Store-API**, und beide Flaechen — Warenkorbseite und
   Schublade — lesen dieselbe Nutzlast. Eine Aenderung in PHP traefe
   deshalb zwangslaeufig beide. Der Auftrag will sie nur in der Schublade,
   also steht sie hier und nur hier.

   Ausgewaehlt wird ueber `data-wp-context`, nicht ueber die Klasse
   `…__artikelnummer`: die Klasse baut Woo aus dem **Label**, sie hiesse
   nach jeder Umbenennung anders. `dataProperty` ist der Vertrag. */
.wc-block-mini-cart__drawer .wc-block-mini-cart__title {
  font-size: var(--wp--preset--font-size--xl);
}

.wc-block-mini-cart__drawer .wc-block-components-product-details[data-wp-context*="item_data"] {
  display: none;
}

/* Preis und Variante in eine Zeile. Sie sind **keine** Geschwister — der
   Preis haengt direkt im `__wrap`, die Variante zwei Ebenen tiefer in der
   `product-metadata`. Deshalb nicht `flex`, sondern Inline-Fluss: die
   Spalte wird zum Block, Preis und Metadaten werden inline, und der
   Zeilenumbruch entsteht von selbst, wenn es eng wird — „umbrechen
   erlaubt" ist damit nicht erlaubt, sondern eingebaut.

   Die leere Kurzbeschreibung faellt weg, weil ein leerer Block-Kasten
   mitten in einem Inline-Fluss die Zeile trotzdem aufbricht. Nur die
   leere: hat ein Artikel eine Kurzbeschreibung, behaelt sie ihre eigene
   Zeile ueber dem Preis. */
.wc-block-mini-cart__drawer .wc-block-cart-item__wrap {
  display: block;
}

.wc-block-mini-cart__drawer .wc-block-cart-item__wrap .wc-block-components-product-name {
  display: block;
}

.wc-block-mini-cart__drawer .wc-block-cart-item__prices,
.wc-block-mini-cart__drawer .wc-block-components-product-metadata,
.wc-block-mini-cart__drawer .wc-block-components-product-metadata > div {
  display: inline;
}

/* Der Preis selbst traegt `display: block` aus `mini-cart-contents.css` und
   haette die Zeile von innen wieder aufgebrochen. `:not([hidden])` ist kein
   Zierrat: dieselbe Zelle traegt eine **zweite**, verborgene Preisfassung fuer
   den Rabattfall, und die haelt allein das Attribut unten
   (`.wc-block-components-product-price[hidden]`, Spezifitaet 0-1-1). Eine
   Regel ohne die Ausnahme haette sie eingeblendet und jeden Preis doppelt
   gezeigt. */
.wc-block-mini-cart__drawer .wc-block-cart-item__prices > .wc-block-components-product-price:not([hidden]) {
  display: inline;
}

.wc-block-mini-cart__drawer .wc-block-components-product-metadata > div:has(> .wc-block-components-product-metadata__description:empty) {
  display: none;
}

/* **Hier stand ein Trenner, und er ist mit Absicht weg** — auf Ansage des
   Auftraggebers am 2026-08-27.

   Er setzte ein `•` vor die Variantenzeile, `•` statt `/`, weil `/` in der
   Zeile schon vergeben ist: Woo trennt damit zwei Attributachsen desselben
   Artikels („Sorte: Vanille / Gebinde: 1x").

   Die Ueberlegung war richtig, ihre **Voraussetzung** nicht. Ein Trenner
   trennt nur, solange die beiden Seiten nebeneinanderstehen. In der
   Schublade tun sie das nie: bei 1440 px ist die Warenkorbspalte rund
   340 px breit, der Inline-Fluss bricht hinter dem Preis um, und das
   Zeichen landet am **Zeilenanfang**. Dort trennt es nichts, es liest sich
   als Aufzaehlungspunkt.

   Gemessen am 2026-08-26/27 an vier Positionen: **auf allen vieren** stand
   das Zeichen am Zeilenanfang, und auf einer stand es voellig allein —
   ein einfaches Produkt hat keine Variante, aber Woo rendert den Kasten
   `[data-wp-context*="variation"]` trotzdem. Er war dann 19 px breit und
   enthielt genau den Punkt.

   **Wer ihn zurueckholen will**, braucht zuerst die Zeile, in der er
   stehen kann — die Voraussetzung, nicht das Zeichen, war das Problem.

   Der Auftraggeber hat `display: none` auf dem `::before` geschickt. Das
   waere eine zweite Regel gewesen, die die erste zuruecknimmt; ein `•`,
   das gesetzt und im selben Stylesheet wieder versteckt wird, ist eine
   Falle fuer den naechsten, der es sucht. Deshalb ist die Quelle weg. */

/* Preis und Variante tragen dieselbe Groesse. Die Variante stand bei
   11.375px — das ist Woos `0.875em` auf 13px und kein Schritt der Skala;
   die naechste echte Stufe unter `sm` waere `xs` = 12px, und die braucht
   es hier nicht: die Zeile ist ohnehin nur noch halb so lang. Das Label
   bleibt leiser als der Preis. */
.wc-block-mini-cart__drawer .wc-block-components-product-details {
  font-size: var(--wp--preset--font-size--sm);
}

.wc-block-mini-cart__drawer .wc-block-components-product-details__name {
  color: var(--wp--preset--color--ink-500);
}

/* Derselbe Artikelname, zwei Farben: in der Schublade `brand-600` mit
   Unterstreichung, auf der Warenkorbseite `ink-900` ohne. Der Unterschied
   ist keiner der Absicht — er entsteht daraus, dass die Schublade
   ausserhalb von `main` haengt und die Ausnahmeliste der Linkregel weiter
   oben sie deshalb nicht erreicht. Die Schublade folgt der Seite. */
.wc-block-mini-cart__drawer .wc-block-cart-item__wrap a.wc-block-components-product-name {
  color: var(--wp--preset--color--ink-900);
  text-decoration: none;
}

.wc-block-mini-cart__drawer .wc-block-cart-item__wrap a.wc-block-components-product-name:hover,
.wc-block-mini-cart__drawer .wc-block-cart-item__wrap a.wc-block-components-product-name:focus-visible {
  text-decoration: underline;
}

/* Die Schale der Schublade steht auf `#ffffff`, ihr Inhalt auf `surface`.
   Sichtbar wird das heute nur unter der Adminleiste, die den Inhalt um
   32px nach unten schiebt — ein Streifen, den ein Kunde nie sieht. Die
   Regel steht trotzdem hier: zwei Flaechen, die dasselbe sein sollen und
   es nicht sind, sind ein Fehler, der auf seinen Anlass wartet. */
.wc-block-mini-cart__drawer {
  background-color: var(--wp--preset--color--surface);
}

/* --- 8. Die Ueberschrift der Warenkorbsumme -------------------------

   `.wc-block-cart__totals-title` ist eine `<h2>`, und Woo setzt sie mit
   `font-size:inherit` und `background:transparent` auf Fliesstext zurueck —
   gemessen Inter 13px. Jede andere Ueberschrift des Portals steht in
   Bitter; `theme.json` sagt das fuer `elements.heading`, und Woos Regel
   liegt darueber. Sie bekommt die Familie zurueck und die Stufe `md`,
   weil sie eine Spaltenueberschrift ist und keine Seitenueberschrift. */
.wp-block-woocommerce-cart .wc-block-cart__totals-title {
  font-family: var(--wp--preset--font-family--serif);
  font-size: var(--wp--preset--font-size--md);
  color: var(--wp--preset--color--ink-900);
}
