/*
Theme Name:   tegrafo Storefront Child
Theme URI:    https://shop-test.tegrafo.de/
Description:  Child-Theme von Storefront für den Amnesty-Merchshop (tegrafo e.K.). CSS- und Funktions-Anpassungen leben hier statt im Parent-Theme, damit Storefront-Updates nichts überschreiben.
Author:       tegrafo e.K.
Template:     storefront
Version:      1.90.29
Text Domain:  tegrafo-storefront-child
License:      Proprietary
Nutzungsrechte: Rahmenvertrag tegrafo/AMNESTY, Abschnitt „Urheber- und Nutzungsrechte“ – Erklärung im Kopf von wp-content/plugins/tegrafo-merchshop-core/tegrafo-merchshop-core.php
*/

/* ==========================================================================
   Amnesty Corporate Identity – globale Styles
   Quelle aller Werte: Handbuch_Corporate_Identity.pdf, S. 9 (Farben),
   S. 16–17 (Typografie). Abweichungen sind an Ort und Stelle begründet.

   Aufbau:
   1. Schriften (self-hosted, keine externen Requests)
   2. Design-Tokens
   3. Grundlayout und Abstände
   4. Typografie
   5. Links
   6. Buttons
   7. Formularfelder
   8. Fokus und Bedienhilfen
   9. Kopfbereich
  10. Fußbereich
  11. Shop-Übersicht und Produktarchiv
  12. Produktseite
  13. Startseite: Bildbereich mit Aktionsbalken
  14. Warenkorb und Kasse
  15. Konto- und Anmeldebereich
  16. Symbole, Hinweise, Zahlungsarten
  17. Feinschliff Kopfbereich und Seitenkopf
  18. Social Media im Fußbereich
  19. Kennzeichnung Shop, Warenkorb-Typografie, Versandhinweis
  20. Variantenauswahl als Schaltflächen
  21. Mitlaufender Kopfbereich, Fußbereich am unteren Rand
  22. Startseite: Bereichsauswahl
  23. Bereichsumschalter (alle Seiten außer Startseite)
  24. Vertrauenshinweise
  25. Ticketsystem (SupportCandy)
  26. Telefonzeiten mit Erreichbarkeit
  27. Hilfe-Seite: E-Mail als Notausgang unter dem Formular
  28. Farbhinweis in der Produktübersicht
  29. Größentabelle
   ========================================================================== */


/* 1. Schriften =============================================================
   Das Handbuch schreibt die Amnesty Trade Gothic vor und nennt Arial als
   Systemschrift, wenn die Hausschrift nicht installiert werden kann (S. 16,
   Pkt. 1). Trade Gothic ist nicht self-hostbar; Roboto tritt mit Freigabe vom
   16.09.2026 an ihre Stelle – Roboto Condensed für Überschriften (entspricht
   Trade Gothic Condensed No. 20/18), Roboto Regular für Fließtext (entspricht
   Trade Gothic Roman). Arial bleibt als erster Fallback stehen und ist damit
   weiterhin die vom Handbuch vorgesehene Ersatzschrift.

   Self-hosted als WOFF2, keine Einbindung über fonts.googleapis.com – der Shop
   läuft cookie-frei und darf keine externen Ressourcen nachladen (§25 TDDDG).
   Lizenz: SIL Open Font License 1.1, siehe assets/fonts/OFL.txt.
   Kursive Schnitte sind bewusst nicht eingebunden: Das Handbuch kennt keine
   Kursiv-Auszeichnung (Hervorhebungen werden gelb markiert oder unterstrichen,
   S. 17 Pkt. 4) – spart zwei Dateien. */

@font-face {
	font-family: "Roboto";
	src: url("assets/fonts/roboto-400.woff2") format("woff2");
	font-weight: 400;
	font-style: normal;
	font-display: swap;
}

@font-face {
	font-family: "Roboto";
	src: url("assets/fonts/roboto-700.woff2") format("woff2");
	font-weight: 700;
	font-style: normal;
	font-display: swap;
}

@font-face {
	font-family: "Roboto Condensed";
	src: url("assets/fonts/roboto-condensed-400.woff2") format("woff2");
	font-weight: 400;
	font-style: normal;
	font-display: swap;
}

@font-face {
	font-family: "Roboto Condensed";
	src: url("assets/fonts/roboto-condensed-700.woff2") format("woff2");
	font-weight: 700;
	font-style: normal;
	font-display: swap;
}


/* 2. Design-Tokens ========================================================= */

:root {
	/* --- Primärfarben (Handbuch S. 9) --- */
	--tg-gelb:        #ffff00; /* Amnesty Gelb, HKS 3, CMYK 0/0/100/0 */
	--tg-schwarz:     #000000; /* HKS 88, CMYK 0/0/0/100 */
	--tg-weiss:       #ffffff;

	/* --- Sekundärfarben (Handbuch S. 9): warme Grautöne für Hintergründe,
	       Informationskästen und Grafiken. Nicht für Text. --- */
	--tg-hellgrau:    #c7c2ba; /* Pantone Warm Grey 3 C  */
	--tg-grau:        #a59d95; /* Pantone Warm Grey 6 C  */
	--tg-dunkelgrau:  #766a62; /* Pantone Warm Grey 10 C */

	/* --- Semantische Zuordnung ---
	       Gelb ist ausschließlich der Handlungsebene vorbehalten: "Es ist
	       wichtig, mit dem Gelb sparsam umzugehen und die Farbe nicht für
	       dekorative Zwecke zu missbrauchen, damit sie ihre Kraft nicht
	       verliert." (S. 9, Pkt. 3) */
	--tg-text:            var(--tg-schwarz);
	--tg-text-leise:      var(--tg-dunkelgrau); /* 5,2:1 auf Weiß – WCAG AA */
	--tg-flaeche:         var(--tg-weiss);
	--tg-flaeche-info:    var(--tg-hellgrau);   /* Infokästen, 11,9:1 mit Schwarz */
	--tg-linie:           var(--tg-hellgrau);
	--tg-linie-kraeftig:  var(--tg-schwarz);
	--tg-aktion-flaeche:  var(--tg-gelb);       /* CTA, 19,6:1 mit Schwarz */
	--tg-aktion-text:     var(--tg-schwarz);
	--tg-markierung:      var(--tg-gelb);       /* "wie mit einem Textmarker" (S. 20) */

	/* --- Schriftfamilien --- */
	--tg-font-text:     "Roboto", Arial, Helvetica, sans-serif;
	--tg-font-headline: "Roboto Condensed", "Arial Narrow", Arial, sans-serif;

	/* --- Schriftgrößen ---
	       Das Handbuch staffelt im Verhältnis 1:2 (80/40/20/10 pt auf DIN A4,
	       S. 17). Auf dem Bildschirm ist diese Staffel zu grob: 8,5 pt wäre
	       unlesbar, 80 pt sprengt jedes Handy-Display. Die Hierarchie und ihre
	       Reihenfolge bleiben erhalten, die Sprünge sind fluid gestaucht. */
	--tg-fs-hero:   clamp(2.25rem, 1.50rem + 3.20vw, 3.50rem); /* 36 → 56 px */
	--tg-fs-h1:     clamp(1.875rem, 1.45rem + 1.80vw, 2.50rem); /* 30 → 40 px */
	--tg-fs-h2:     clamp(1.50rem, 1.33rem + 0.75vw, 1.75rem);  /* 24 → 28 px */
	--tg-fs-h3:     clamp(1.1875rem, 1.16rem + 0.12vw, 1.25rem);/* 19 → 20 px */
	--tg-fs-text:   1.0625rem; /* 17 px */
	--tg-fs-klein:  0.875rem;  /* 14 px – Marginalien, Bildunterschriften,
	                              Pflichtangaben (Rolle: Trade Gothic Cn No. 18) */
	--tg-fs-button: 1rem;      /* 16 px */
	--tg-fs-navigation: 1.125rem; /* 18 px – die Navigation trägt den ganzen
	                              Kopfbereich und darf etwas kräftiger sein
	                              als ein Knopf im Fließtext */

	/* --- Zeilenabstände --- */
	--tg-lh-hero:     1.05;
	--tg-lh-headline: 1.15;
	--tg-lh-text:     1.65;

	/* --- Laufweite ---
	       Die Spationierungswerte des Handbuchs (−5 bis +10) sind
	       InDesign-Einheiten zu 1/1000 em, auf dem Bildschirm praktisch
	       wirkungslos. Für Versalien braucht es spürbar mehr, sonst kleben die
	       Großbuchstaben. */
	--tg-ls-versal:        0.02em;
	--tg-ls-versal-klein:  0.04em; /* je kleiner der Grad, desto mehr Luft */

	/* --- Abstände: 4er-Raster --- */
	--tg-space-3xs: 0.25rem; /*  4 px */
	--tg-space-2xs: 0.5rem;  /*  8 px */
	--tg-space-xs:  1rem;    /* 16 px */
	--tg-space-s:   1.5rem;  /* 24 px */
	--tg-space-m:   2.5rem;  /* 40 px */
	--tg-space-l:   4rem;    /* 64 px */
	--tg-space-xl:  6rem;    /* 96 px */

	/* --- Maße --- */
	--tg-container:   75rem;  /* 1200 px */
	--tg-textbreite:  68ch;   /* Lesebreite für Fließtext */
	--tg-radius:      0;      /* Flächen und Kästen bleiben eckig. Die Vorgabe
	                             "immer gerade Seitenränder und eine rechteckige
	                             Form" (S. 14) gilt dem Aktionsbalken – der gelben
	                             Fläche auf Bildern –, nicht den Bedienelementen. */
	--tg-radius-knopf: 4px;   /* Knöpfe mit leicht gerundeten Ecken, wie auf
	                             amnesty.de. */

	/* Zustandsfarbe der gelben Knöpfe beim Überfahren und bei Tastaturfokus.
	   Schwarz darauf erreicht 15,0:1. */
	--tg-gelb-aktiv:  #ffd700;
}


/* 3. Grundlayout und Abstände ==============================================
   Mobile-first: Der Seitenrand ist auf kleinen Displays schmaler als
   Storefronts Standard (2,62 em ≈ 42 px), damit Produktbilder größer werden
   können. Ab Tablet wird er wieder großzügiger. */

.col-full {
	max-width: var(--tg-container);
	padding-left: var(--tg-space-xs);
	padding-right: var(--tg-space-xs);
}

@media (min-width: 48em) {
	.col-full {
		padding-left: var(--tg-space-m);
		padding-right: var(--tg-space-m);
	}
}

/* Luft zwischen den großen Seitenabschnitten – der wichtigste Hebel für
   "offener und weniger dicht". */
#content.site-content {
	padding-top: var(--tg-space-m);
	padding-bottom: var(--tg-space-l);
}

@media (min-width: 48em) {
	#content.site-content {
		padding-top: var(--tg-space-l);
		padding-bottom: var(--tg-space-xl);
	}
}


/* 4. Typografie ============================================================ */

body,
button,
input,
select,
textarea {
	color: var(--tg-text);
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-text);
	line-height: var(--tg-lh-text);
}

/* Fließtext bekommt eine begrenzte Lesebreite. Tabellen, Raster und
   WooCommerce-Bausteine sind ausgenommen, die brauchen die volle Breite. */
.entry-content > p,
.entry-content > ul,
.entry-content > ol,
.woocommerce-product-details__short-description,
.term-description > p {
	max-width: var(--tg-textbreite);
}

h1,
h2,
h3,
h4,
h5,
h6 {
	color: var(--tg-text);
	font-family: var(--tg-font-headline);
	font-weight: 700;
	line-height: var(--tg-lh-headline);
	/* Handbuch S. 17, Pkt. 6: "Überschriften und Fließtext werden immer
	   linksbündig ausgerichtet." */
	text-align: left;
	text-wrap: balance;
	margin-top: 0;
	margin-bottom: var(--tg-space-s);
}

/* Versalien laut Handbuch S. 16, Pkt. 2. Umgesetzt über text-transform, damit
   im Markup die normale Schreibweise stehen bleibt – wichtig für Screenreader,
   Suchmaschinen und Copy-&-Paste. */
h1,
h2,
h3 {
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal);
}

h1 { font-size: var(--tg-fs-h1); }
h2 { font-size: var(--tg-fs-h2); }
h3 { font-size: var(--tg-fs-h3); }

h4,
h5,
h6 {
	font-size: var(--tg-fs-text);
	letter-spacing: var(--tg-ls-versal);
}

/* Ausnahme von der Versalien-Regel: Produkttitel sind Daten, keine Headlines.
   Lange deutsche Artikelnamen in Großbuchstaben sind schlechter lesbar.
   Freigabe dieser Abweichung am 16.09.2026. */
.product_title,
.woocommerce-loop-product__title,
.wc-block-components-product-name,
.product-name,
.widget .product-title {
	text-transform: none;
	letter-spacing: 0;
	font-family: var(--tg-font-headline);
}

/* Kleintexte: Marginalien, Bildunterschriften, Pflichtangaben. Im Handbuch die
   Rolle der Trade Gothic Condensed No. 18 (S. 16, Pkt. 4). */
small,
.wc-gzd-additional-info,
.woocommerce-price-suffix,
.wc-gzd-product-units,
figcaption,
.entry-meta {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	font-weight: 400;
	line-height: 1.5;
	letter-spacing: 0;
	color: var(--tg-text-leise);
}

/* Hervorhebung im Fließtext: gelb markiert wie mit einem Textmarker
   (Handbuch S. 17, Pkt. 4 und S. 20). */
mark,
.entry-content mark {
	background-color: var(--tg-markierung);
	color: var(--tg-schwarz);
	padding: 0 var(--tg-space-3xs);
}

hr {
	border: 0;
	border-top: 1px solid var(--tg-linie);
	margin: var(--tg-space-m) 0;
}

::selection {
	background-color: var(--tg-gelb);
	color: var(--tg-schwarz);
}


/* 5. Links =================================================================
   Amnesty Gelb erreicht auf Weiß nur 1,07:1 und ist als Linkfarbe unbrauchbar.
   Links sind deshalb schwarz und unterstrichen – damit sind sie auch ohne
   Farbwahrnehmung erkennbar (WCAG 1.4.1). Beim Hover legt sich die gelbe
   Markierung dahinter; das ist exakt die Handbuchregel "Hervorhebungen werden
   gelb markiert. Ist dies nicht möglich, wird unterstrichen." (S. 17, Pkt. 4). */

a {
	color: var(--tg-text);
	text-decoration: underline;
	text-decoration-thickness: 0.08em;
	text-underline-offset: 0.18em;
	transition: background-color 120ms linear;
}

a:hover,
a:focus {
	color: var(--tg-schwarz);
	background-color: var(--tg-markierung);
}

/* Keine Unterstreichung und keine Markierung bei Bedienelementen und
   Bildlinks – dort wäre beides nur Unruhe. */
a.button,
a.added_to_cart,
/* Die Blöcke in Warenkorb und Kasse setzen ihre Knöpfe teils als <a> um – ohne
   diesen Eintrag bekämen sie die Unterstreichung der Textlinks. */
a.wc-block-components-button,
.wc-block-components-button,
.wc-block-components-totals-coupon-link,
.main-navigation a,
.storefront-primary-navigation a,
.site-header a,
.site-branding a,
.woocommerce-loop-product__link,
.woocommerce-product-gallery a,
.flex-control-nav a,
.page-numbers,
.wc-tabs a,
.woocommerce-MyAccount-navigation a {
	text-decoration: none;
}

/* Storefront unterstreicht Links im Inhaltsbereich über
   `.hentry .entry-content a` – zwei Klassen und ein Element und damit
   spezifischer als die Ausnahmeliste oben. Warenkorb, Kasse und Kontobereich
   liegen genau dort, ihre Knöpfe bekamen deshalb trotz der Ausnahme eine
   Unterstreichung. Für Bedienelemente im Inhalt muss die Ausnahme denselben
   Vorspann tragen. */
.hentry .entry-content a.button,
.hentry .entry-content a.added_to_cart,
.hentry .entry-content a.wc-block-components-button,
.hentry .entry-content .wc-block-components-button,
.hentry .entry-content .wc-block-components-totals-coupon-link,
.hentry .entry-content .woocommerce-loop-product__link,
.hentry .entry-content .wc-tabs a,
.hentry .entry-content .page-numbers {
	text-decoration: none;
}

a.button:hover,
a.added_to_cart:hover,
.woocommerce-loop-product__link:hover,
.woocommerce-product-gallery a:hover,
.site-branding a:hover {
	background-color: transparent;
}

/* Storefront hellt die Hover-Farbe der Zweitnavigation auf #8F837B auf –
   3,7:1 auf Weiß und damit unter WCAG AA. Beim Hover wird stattdessen nicht
   heller, sondern dunkler. Die eigentliche Navigation kommt in Schritt (b). */
.secondary-navigation ul.menu a:hover {
	color: var(--tg-schwarz);
}


/* 6. Buttons ===============================================================
   Gelb mit schwarzer Schrift ist die stärkste Kombination der CI (19,6:1) und
   trägt inhaltlich genau das, was ein CTA braucht: "Gelb ist die Farbe der
   Dringlichkeit und steht für Intervention und Protest." (S. 9, Pkt. 2)

   Rollenverteilung:
   .button.alt  → die eigentliche Handlung (In den Warenkorb, Zur Kasse) = gelb
   .button      → Nebenhandlungen (Warenkorb aktualisieren, Gutschein) = hellgrau
   Die Farbwerte selbst liefert Storefronts Customizer-CSS, gefüttert über die
   Filter in functions.php. Hier steht nur Form und Typografie. */

button,
input[type="button"],
input[type="reset"],
input[type="submit"],
.button,
.wp-block-button__link,
a.button {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-button);
	font-weight: 400;
	line-height: 1.2;
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	text-align: center;
	border: 0;
	border-radius: var(--tg-radius-knopf);
	padding: var(--tg-space-xs) var(--tg-space-s);
	/* Mindestens 44 px hoch – Touch-Ziel nach WCAG 2.5.5 */
	min-height: 2.75rem;
	text-shadow: none;
}

/* Die Hover-Farben erzeugt Storefront selbst aus den CI-Werten oben:
   Gelb #FFFF00 → #E6E600, Hellgrau #C7C2BA → #AEA9A1, jeweils mit schwarzer
   Schrift (19,6:1 bzw. 9,0:1). Hier deshalb nur den Textschatten entfernen,
   den Storefront auf Buttons legt. */
button:hover,
input[type="button"]:hover,
input[type="reset"]:hover,
input[type="submit"]:hover,
.button:hover,
.wp-block-button__link:hover,
a.button:hover {
	text-shadow: none;
}

/* Die gelben Handlungsknöpfe bekommen beim Überfahren und bei Tastaturfokus
   ein satteres Gelb statt Storefronts abgedunkeltem #E6E600 – auf amnesty.de
   ist das die Zustandsfarbe. Schwarz darauf erreicht 15,0:1. */
/* Die Selektorliste spiegelt die von Storefront erzeugte Regel eins zu eins.
   Beim ersten Anlauf war nur `.button.alt:hover` abgedeckt – Storefront führt
   aber auch `.widget-area .widget a.button.alt:hover` mit vier Klassen, und
   diese Variante gewann weiter mit #E6E600. Gleiche Selektoren, später im
   Quelltext, also gewinnen unsere. */
button.alt:hover,
button.alt:focus-visible,
input[type="button"].alt:hover,
input[type="button"].alt:focus-visible,
input[type="reset"].alt:hover,
input[type="reset"].alt:focus-visible,
input[type="submit"].alt:hover,
input[type="submit"].alt:focus-visible,
.button.alt:hover,
.button.alt:focus-visible,
.widget-area .widget a.button.alt:hover,
.widget-area .widget a.button.alt:focus-visible,
.site-header-cart .widget_shopping_cart a.button.alt:hover,
.site-header-cart .widget_shopping_cart a.button.alt:focus-visible,
.single_add_to_cart_button:hover,
.single_add_to_cart_button:focus-visible {
	background-color: var(--tg-gelb-aktiv);
	border-color: var(--tg-gelb-aktiv);
	color: var(--tg-schwarz);
}

/* Auf schmalen Displays laufen die Haupt-Buttons über die volle Breite –
   größere Trefferfläche, klarere Handlungsaufforderung. */
@media (max-width: 47.99em) {
	.single_add_to_cart_button,
	.checkout-button,
	.wc-proceed-to-checkout .button,
	.woocommerce-form-login .button,
	.woocommerce-form-register .button {
		display: block;
		width: 100%;
	}
}


/* 7. Formularfelder ========================================================
   Nur Optik. Die Feldlogik von Germanized (Pflichtfelder, Reihenfolge,
   Checkboxen im Checkout) bleibt unangetastet. */

input[type="text"],
input[type="email"],
input[type="tel"],
input[type="url"],
input[type="password"],
input[type="search"],
input[type="number"],
input[type="date"],
select,
textarea,
.input-text {
	background-color: var(--tg-weiss);
	border: 1px solid var(--tg-dunkelgrau);
	border-radius: var(--tg-radius);
	box-shadow: none;
	color: var(--tg-text);
	padding: var(--tg-space-2xs) var(--tg-space-xs);
	min-height: 2.75rem;
}

input::placeholder,
textarea::placeholder {
	color: var(--tg-text-leise);
	opacity: 1;
}

label {
	font-family: var(--tg-font-headline);
	font-weight: 400;
	letter-spacing: 0;
}

/* Die Sternchen-Pflichtfeldmarkierung von WooCommerce/Germanized bleibt
   erhalten, wird aber nicht mehr in einer Signalfarbe gesetzt – Gelb wäre hier
   unlesbar, Rot ist nicht Teil der CI. */
.required,
.woocommerce form .form-row .required {
	color: var(--tg-text);
	text-decoration: none;
}


/* 8. Fokus und Bedienhilfen ================================================
   Ein rein gelber Fokusrahmen erreicht auf Weiß 1,07:1 und verfehlt die
   3:1-Anforderung für Nicht-Text-Kontraste (WCAG 1.4.11) deutlich. Der Rahmen
   ist deshalb schwarz: 21:1 auf Weiß, auf dem gelben Knopf immer noch 19,6:1,
   im schwarzen Fußbereich wird er weiß (Abschnitt 10).

   Ein zusätzlicher gelber Außenring war der erste Entwurf. Auf Bedienelementen
   mit viel Innenabstand – Navigationspunkte, Reiter – wurde daraus ein sehr
   wuchtiger Kasten; er ist am 16.09.2026 wieder entfallen. */

/* Der Rahmen gilt ausdrücklich nur für Bedienelemente, nicht für beliebige
   Elemente.

   Grund: Storefront und die WooCommerce-Blöcke geben reinen Layout-Behältern
   ein `tabindex="-1"`, damit Sprungmarken und die Fehlerbehandlung im Checkout
   sie anspringen können – darunter `#content`, das die ganze Seite umfasst.
   Mit der Tabulatortaste sind solche Behälter nicht erreichbar, sie erhalten
   den Fokus nur per Skript. Chrome wertet das nicht als Tastaturbedienung und
   zeichnet nichts; Firefox schon. Dort zog sich dann ein Rahmen um den
   gesamten Inhaltsbereich, sichtbar als zwei senkrechte Linien über die volle
   Seitenhöhe. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[role="button"]:focus-visible,
[role="link"]:focus-visible,
[contenteditable]:focus-visible,
[tabindex]:not([tabindex="-1"]):focus-visible {
	outline: 2px solid var(--tg-schwarz);
	outline-offset: 2px;
}

/* Kein Rahmen beim Klicken – aber weiterhin einer bei der Tastatur.

   Storefront zeichnet ihn unabhängig von der Eingabeart:
   `a:focus, input:focus, textarea:focus, button:focus { outline: 2px solid }`
   (storefront/style.css, Zeile 31). Dadurch sprang bei jedem Mausklick ein
   schwarzer Kasten um den angeklickten Link – am deutlichsten um die Symbole
   im Kopfbereich, deren Trefferfläche hoch und schmal ist.

   `:focus-visible` ist die Unterscheidung, die es dafür gibt: Der Browser
   entscheidet, ob ein Fokus angezeigt gehört. Bei der Maus nicht, bei
   Tabulator und Pfeiltasten schon. `:focus:not(:focus-visible)` trifft genau
   die Fälle, in denen der Browser „nein" sagt, und räumt dort auf.

   Bewusst nicht einfach alle Rahmen abgeschaltet: Ohne sichtbaren Fokus ist
   eine Seite mit der Tastatur nicht mehr bedienbar (WCAG 2.4.7). Die Regel
   nimmt den Rahmen nur dort weg, wo ihn niemand braucht. */
:focus:not(:focus-visible) {
	outline: none;
}

/* Und zur Sicherheit: Behälter, die nur Sprungziel sind, bekommen nie einen
   Rahmen – unabhängig davon, wie ein Browser `:focus-visible` auslegt. */
[tabindex="-1"]:focus,
[tabindex="-1"]:focus-visible {
	outline: none;
}

a:focus-visible {
	background-color: transparent;
}

/* Reine Textlinks: Der Rahmen liegt eng am Text statt auf Abstand. */
p a:focus-visible,
li a:focus-visible,
.entry-content a:focus-visible,
.tegrafo-fuss a:focus-visible,
.woocommerce-breadcrumb a:focus-visible {
	outline-offset: 1px;
}

/* Großflächige Bedienelemente bekommen gar keinen Rahmen, sondern dieselbe
   Hervorhebung wie die aktive Seite: schwarzer Balken und hellgraue Fläche.
   Ein Rahmen umschließt dort den kompletten Klickbereich samt Innenabstand und
   wirkt als Kasten – bei einem Navigationspunkt mit 26 px Innenabstand oben und
   unten ist das ein auffälliger Block.

   Balken und Fläche sind als Fokusanzeige ausreichend: Schwarz auf Weiß
   erreicht 21:1, die Fläche hebt sich zusätzlich ab (WCAG 2.4.7). */
/* Bei Tastaturbedienung dieselbe schwarze Fläche wie beim Hover, zusätzlich
   ein weißer Rahmen innen – sonst wäre der Fokus auf der aktuellen Seite, die
   ohnehin schwarz ist, nicht zu erkennen. */
.main-navigation ul.menu > li > a:focus-visible,
.main-navigation ul.nav-menu > li > a:focus-visible {
	background-color: var(--tg-schwarz);
	color: var(--tg-weiss);
	outline: 2px solid var(--tg-weiss);
	outline-offset: -6px;
}

.woocommerce-tabs ul.tabs li a:focus-visible {
	outline: none;
	border-bottom-color: var(--tg-schwarz);
	background-color: var(--tg-flaeche-info);
}

.site-header-cart a:focus-visible,
.tegrafo-konto a:focus-visible,
.handheld-navigation a:focus-visible,
.secondary-navigation a:focus-visible,
.storefront-handheld-footer-bar ul li > a:focus-visible {
	outline: none;
	background-color: var(--tg-flaeche-info);
	box-shadow: 0 3px 0 0 var(--tg-schwarz);
}

.hentry .entry-content .woocommerce-MyAccount-navigation ul li a:focus-visible {
	outline: none;
	background-color: var(--tg-flaeche-info);
	box-shadow: inset 3px 0 0 0 var(--tg-schwarz);
	padding-left: var(--tg-space-2xs);
}

/* Sprungmarke zum Inhalt – Storefront bringt sie mit, sie war nur unsichtbar
   unauffällig. */
.skip-link:focus {
	background-color: var(--tg-gelb);
	color: var(--tg-schwarz);
	font-family: var(--tg-font-headline);
	font-weight: 400;
	text-transform: uppercase;
}

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


/* 9. Kopfbereich ===========================================================
   Kopffarbe je Bereich (Wunsch AMNESTY, Farbkonzept vom 25.09.2026): Gelb im
   ganzen Merchshop samt Startseite, Weiß im Materialshop und im
   Gruppenbereich. Bis zum 27.09.2026 war es umgekehrt (Gelb auf der
   Startseite und den beiden Aktionsmaterialien-Bereichen, Weiß auf
   Merchshop-Unterseiten). Das Logo darf auf beiden stehen (Handbuch S. 10,
   Pkt. 2 – gelb, weiß oder schwarz sind zulässig).

   Die Hintergrundfarbe selbst kommt NICHT von hier, sondern aus Storefronts
   eigener, request-abhängiger Customizer-CSS-Ausgabe (farben.php – dort steht
   auch, warum: nur dieser Weg kann sich je Aufruf unterscheiden, eine feste
   Regel in dieser Datei könnte das nicht). Hier steht deshalb nur noch die
   Trennlinie.

   Kundenwunsch, zweite Runde: auf den Merchshop-Unterseiten (weißer Kopf)
   war die Linie bislang bewusst heller (Hellgrau statt Kräftig) – auf
   Wunsch jetzt überall gleich kräftig wie auf der Startseite. `tegrafo-
   kopf-weiss` (bis 27.09.2026 `tegrafo-kopf-merch`) kommt aus kanal.php,
   derselben Bedingung, die auch farben.php verwendet – hier also ohne
   eigene Regel, die Fallunterscheidung gilt nur noch für die
   Kopf-Hintergrundfarbe.

   Kundenwunsch, dritte Runde: Die Linie stand nach dem Umzug des
   Bereichsumschalters an `storefront_header` (damals nötig, um über dem
   inzwischen entfernten Kategorienmenü zu stehen) nur noch innerhalb von
   `.site-header` zur Verfügung, weil `<header>` den kompletten
   `storefront_header`-Hook umschließt und die Linie dadurch weder an der
   richtigen Stelle (vor statt hinter dem Umschalter) noch über die volle
   Seitenbreite ging (Kundenrückmeldungen 19.09.2026, „Linie verschieben"
   und „Linie über die ganze Breite"). Der eigentliche Fehler saß am
   Hook, nicht hier: Der Umschalter hängt jetzt wieder an
   `storefront_before_content` (bereiche.php) und rendert damit als
   eigenständiges Element NACH `</header>` – die Linie kann deshalb wieder
   ganz normal an `.site-header` selbst hängen, direkt unter Logo/Suche/
   Konto/Warenkorb und über die volle Breite, ohne Sonderregel. Die Linie
   zwischen Umschalter und Inhalt bleibt unverändert Sache von
   `.tegrafo-umschalter` selbst (Abschnitt 23). */

/* Seit dem 27.09.2026 ohne Linie (Wunsch AMNESTY vom 25.09., Punkt 5, „ähnlich
   wie beim Amnesty-UK-Shop“). Die Kante zwischen gelbem Kopf und weißem
   Inhalt trägt die Fläche allein. Bis dahin 1 px Schwarz, siehe oben. */
.site-header {
	border-bottom: 0;
	/* War var(--tg-space-s), Kundenwunsch: der Freiraum über Logo/Zusatz
	   wirkte zu großzügig. */
	padding-top: var(--tg-space-2xs);
	padding-bottom: 0;
}

/* Logohöhe zentral steuerbar. Die Schutzzone leitet sich daraus ab. */
.site-branding {
	--tg-logo-h: 48px;
	/* Schutzzone = x = Versalhöhe „INTERNATIONAL" = 26 % der Logohöhe
	   (gemessen im Logo aus dem Brand Hub: 159 von 606 px, seit 27.09.2026;
	   in der alten Fassung waren es 24 %). */
	--tg-logo-schutzzone: calc(var(--tg-logo-h) * 0.26);
	margin-bottom: var(--tg-space-s);
}

@media (min-width: 48em) {
	.site-branding {
		--tg-logo-h: 64px;
	}
}

.site-branding .tegrafo-logo {
	display: inline-block;
	padding: var(--tg-logo-schutzzone);
	/* Der linke Schutzraum kommt bereits vom Seitenrand des Containers. */
	padding-left: 0;
	text-decoration: none;
	background-color: transparent;
}

.site-header .site-branding img {
	display: block;
	/* Nur proportional skalieren – Aufbau und Proportionen des Logos dürfen
	   nicht verändert werden (Handbuch S. 11). Deshalb `height: auto` mit
	   `max-height` statt einer festen Höhe: Bis 25.09.2026 stand hier
	   `height: var(--tg-logo-h)` neben `max-width: 100%`. Wurde der Platz
	   knapp, schrumpfte nur die Breite – bei 375 px 44 × 48 statt 165 × 48,
	   bei 800 px 210 × 64 statt 220 × 64 (Befund Tobias). So bleibt das
	   Seitenverhältnis in jedem Fall erhalten. */
	width: auto;
	height: auto;
	max-width: 100%;
	max-height: var(--tg-logo-h);
}

/* Navigationsleiste – Teil derselben Kopffläche, kein eigener Ton. Anders als
   der Kopf selbst hat sie keine Storefront-Einstellung, die sich request-
   abhängig setzen ließe – deshalb hier direkt über die body-Klasse aus
   kanal.php, mit derselben Bedingung wie farben.php. */
.storefront-primary-navigation {
	background-color: var(--tg-gelb);
}

body.tegrafo-kopf-weiss .storefront-primary-navigation {
	background-color: var(--tg-weiss);
}

.main-navigation ul.menu > li > a,
.main-navigation ul.nav-menu > li > a,
.handheld-navigation ul.menu li a,
.secondary-navigation ul.menu a {
	font-family: var(--tg-font-headline);
	font-weight: 400;
	font-size: var(--tg-fs-navigation);
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	color: var(--tg-text);
	text-decoration: none;
	background-color: transparent;
	/* Die schwarze Fläche blendet auf, statt hart umzuspringen. Kurz genug,
	   dass sie der Mausbewegung nicht hinterherhinkt. Wer im Betriebssystem
	   weniger Bewegung eingestellt hat, sieht weiterhin den harten Wechsel –
	   das regelt die Medienabfrage in Abschnitt 8. */
	transition: background-color 180ms ease-out, color 180ms ease-out;
}

/* Die aktuelle Seite ist bereits schwarz und soll beim Überfahren nicht
   nachträglich noch einmal aufblenden. */
.main-navigation ul.menu > li.current-menu-item > a,
.main-navigation ul.menu > li.current-menu-ancestor > a,
.main-navigation ul.menu > li.current_page_parent > a {
	transition: none;
}

/* Hover und aktuelle Seite bekommen eine schwarze Fläche mit weißer Schrift –
   so löst es auch amnesty.de. Der Block füllt die ganze Höhe der Leiste, weil
   die Menüpunkte 1,618 em Innenabstand oben und unten tragen.

   Kein Gelb: Das bleibt den Handlungen vorbehalten ("mit dem Gelb sparsam
   umgehen", Handbuch S. 9, Pkt. 3). Weiß auf Schwarz ist vom Handbuch
   ausdrücklich gedeckt (S. 16, Pkt. 7) und erreicht 21:1. */
.main-navigation ul.menu > li > a:hover,
.main-navigation ul.nav-menu > li > a:hover,
.main-navigation ul.menu > li.current-menu-item > a,
.main-navigation ul.menu > li.current-menu-ancestor > a,
.main-navigation ul.menu > li.current_page_parent > a {
	background-color: var(--tg-schwarz);
	color: var(--tg-weiss);
}

/* Untermenü: Storefront erzeugt daraus ein neutrales Grau (#F0F0F0), das in
   keiner CI-Palette vorkommt. Stattdessen weiß mit Hellgrau-Kante. */
.main-navigation ul.menu ul.sub-menu,
.main-navigation ul.nav-menu ul.children {
	background-color: var(--tg-weiss);
	border: 1px solid var(--tg-linie);
}

.main-navigation ul.menu ul li a,
.main-navigation ul.nav-menu ul li a {
	font-family: var(--tg-font-headline);
	text-transform: none;
	letter-spacing: 0;
	font-weight: 400;
	color: var(--tg-text);
}

.main-navigation ul.menu ul li a:hover {
	background-color: var(--tg-flaeche-info);
}

/* Menütaste auf Mobilgeräten – 44 px Trefferfläche, CI-Typografie. */
button.menu-toggle {
	background-color: var(--tg-weiss);
	border: 2px solid var(--tg-schwarz);
	color: var(--tg-text);
	min-height: 2.75rem;
}

button.menu-toggle:hover {
	background-color: var(--tg-gelb);
}

/* Navigationsleiste (Kategorienmenü) als eine Zeile.

   Storefront verteilt die Leiste mit Prozentbreiten und Floats: Navigation
   73,9 %, Warenkorb 21,7 %, dazwischen 4,35 % Abstand. Konto und Warenkorb
   stehen seit dem Kundenwunsch „beides rechts oben" nicht mehr hier, sondern
   oben beim Logo (siehe „Kopfzeile: Logo, Suche, Konto, Warenkorb" weiter
   unten) – die Prozentrechnung ergäbe für die Navigation allein keine 100 %
   mehr und bräuchte ohnehin eine Flex-Zeile statt fester Breiten.

   Die Selektoren führen `.woocommerce-active .site-header` mit, weil Storefronts
   Breitenregeln genau diese Spezifität haben und sonst gewinnen würden. */
@media (min-width: 48em) {
	.site-header .storefront-primary-navigation > .col-full {
		display: flex;
		align-items: center;
		gap: var(--tg-space-s);
	}

	/* Storefront legt auf `.col-full` ein Clearfix-Paar mit `content: ""`.
	   Im Float-Layout unsichtbar – in einer Flex-Zeile werden daraus zwei
	   echte Flex-Elemente, und der Zwischenraum schiebt die Navigation um
	   24 px nach rechts. Sichtbar daran, dass der erste Menüpunkt nicht mehr
	   mit dem Logo darüber fluchtete. */
	.site-header .storefront-primary-navigation > .col-full::before,
	.site-header .storefront-primary-navigation > .col-full::after {
		content: none;
	}

	.woocommerce-active .site-header .storefront-primary-navigation .main-navigation {
		width: auto;
		float: none;
		clear: none;
		margin-right: 0;
		margin-bottom: 0;
		flex: 1 1 auto;
	}
}


/* Warenkorb und Konto */
.site-header-cart .cart-contents,
.tegrafo-konto a {
	font-family: var(--tg-font-headline);
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	color: var(--tg-text);
	text-decoration: none;
	background-color: transparent;
}

.tegrafo-konto {
	padding: var(--tg-space-xs) 0;
}

/* Auf Mobilgeräten gibt es die feste Fußleiste mit eigenem Konto-, Such- und
   Warenkorb-Zugang (Storefront, storefront_handheld_footer_bar – drei von
   diesen Elementen hier unabhängige Elemente, keine Duplikate im Markup).
   Konto, Suche und Warenkorb hier im Kopf wären dort ein zweiter Weg zu
   denselben drei Zielen und würden die Fußleiste nur verdoppeln. */
@media (max-width: 47.99em) {
	.tegrafo-konto,
	.site-header .site-header-cart,
	.site-header .site-search {
		display: none;
	}
}


/* 10. Fußbereich ===========================================================
   Weiß auf Schwarz – vom Handbuch ausdrücklich vorgesehen (S. 16, Pkt. 7:
   "in Ausnahmefällen invertiert in Weiß auf schwarzem oder grauem Balken").
   Kontrast 21:1. */

.site-footer {
	background-color: var(--tg-schwarz);
	color: var(--tg-weiss);
	padding-top: var(--tg-space-l);
	/* Auf Mobilgeräten liegt die feste Fußleiste (4,236 em hoch) über dem
	   Seitenende. Ohne diesen Zuschlag verschwinden die letzten Zeilen des
	   Fußbereichs dahinter. */
	padding-bottom: calc(var(--tg-space-s) + 4.235801032em);
}

@media (min-width: 48em) {
	.site-footer {
		padding-bottom: var(--tg-space-s);
	}
}

.site-footer h1,
.site-footer h2,
.site-footer h3,
.site-footer h4,
.site-footer h5,
.site-footer h6 {
	color: var(--tg-weiss);
}

.site-footer a {
	color: var(--tg-weiss);
	text-decoration: underline;
}

/* Im Fuß würde die gelbe Markierung auf Schwarz zwar funktionieren, wäre aber
   ein zweiter Gelb-Einsatz neben den Buttons. Stattdessen verschwindet beim
   Hover die Unterstreichung. */
.site-footer a:hover,
.site-footer a:focus {
	background-color: transparent;
	color: var(--tg-weiss);
	text-decoration: none;
}

.site-footer :focus-visible {
	outline-color: var(--tg-weiss);
}

.tegrafo-fuss {
	display: grid;
	grid-template-columns: 1fr;
	gap: var(--tg-space-m);
}

/* Vier Spalten seit dem 22.09.2026 (Hilfe, Rechtliches, Amnesty International,
   Dieser Shop). Ab Tablet zwei nebeneinander, erst am Desktop alle vier – vier
   schmale Spalten bei 48em wären enger als die längsten Einträge
   („Widerruf & Rücksendung“, „Kontakt zu Amnesty“). */
@media (min-width: 48em) {
	.tegrafo-fuss {
		grid-template-columns: repeat(2, 1fr);
		gap: var(--tg-space-m) var(--tg-space-l);
	}
}

@media (min-width: 64em) {
	.tegrafo-fuss {
		grid-template-columns: repeat(4, 1fr);
	}
}

.tegrafo-fuss__titel {
	font-size: var(--tg-fs-h3);
	margin-bottom: var(--tg-space-xs);
}

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

.tegrafo-fuss__liste li + li {
	margin-top: var(--tg-space-2xs);
}

.tegrafo-fuss__logo {
	display: block;
	height: 48px;
	width: auto;
	max-width: 100%;
	/* Abstand zum Link „Über uns“ darüber: bis 29.09.2026 nur die Zeilenhöhe,
	   das Logo klebte am Link (Wunsch Tobias). Jetzt ein Zwischenraum wie
	   zwischen Spaltentitel und Liste, plus die Schutzzone des Logos. */
	margin-top: var(--tg-space-s);
	/* Schutzzone auch hier: 26 % der Logohöhe (Kopf, Abschnitt 9) */
	margin-bottom: calc(48px * 0.26);
}

.tegrafo-fuss__absender {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	line-height: 1.5;
	color: var(--tg-weiss);
	max-width: 42ch;
	margin-bottom: 0;
}

/* Widerrufsbutton („Vertrag widerrufen“, § 356a BGB) als eigene Zeile oben im
   Fuß – umgehängt in inc/fussbereich.php. Germanized gibt ihn als
   p.eu-owb-order-withdraw-from-contract-button > a.button aus, zentriert.
   Bis 24.09.2026 stand er unter dem Copyright, weiß auf Hellgrau (1,77:1):
   `.site-footer a` färbte die Schrift weiß und ist spezifischer als
   Storefronts `.button`. Jetzt gelb mit Schwarz wie die Handlungsknöpfe
   (19,6:1), linksbündig am Raster, mit derselben Trennlinie wie darunter.
   Die Selektoren schlagen auch `.site-footer a:hover` und `a:focus`, die den
   Hintergrund sonst durchsichtig machten. */
.site-footer .eu-owb-order-withdraw-from-contract-button {
	text-align: left;
	margin: 0 0 var(--tg-space-m);
	padding-bottom: var(--tg-space-m);
	border-bottom: 1px solid var(--tg-dunkelgrau);
}

.site-footer .eu-owb-order-withdraw-from-contract-button a.button {
	background-color: var(--tg-gelb);
	color: var(--tg-schwarz);
	text-decoration: none;
}

.site-footer .eu-owb-order-withdraw-from-contract-button a.button:hover,
.site-footer .eu-owb-order-withdraw-from-contract-button a.button:focus-visible {
	background-color: var(--tg-gelb-aktiv);
	color: var(--tg-schwarz);
}

/* Eingeblendete Fußleiste auf Mobilgeräten (Konto, Suche, Warenkorb). */
.storefront-handheld-footer-bar {
	background-color: var(--tg-weiss);
	border-top: 2px solid var(--tg-schwarz);
}

/* Die Verknüpfungen brauchen eine deckende Fläche: Hinter der Leiste liegt das
   Suchfeld (z-index 1), das erst beim Antippen der Lupe hervorkommt. Mit
   durchsichtigen Verknüpfungen (z-index 999) schiene es dauerhaft durch. */
.storefront-handheld-footer-bar ul li > a {
	color: var(--tg-text);
	background-color: var(--tg-weiss);
	text-decoration: none;
	/* Storefronts Trennlinie ist halbtransparentes Weiß und auf weißem Grund
	   unsichtbar. */
	border-right-color: var(--tg-linie);
}

/* Das Suchfeld selbst ebenfalls auf deckendem Grund, damit beim Aufklappen
   nicht der Seiteninhalt durchscheint.

   `bottom` zusätzlich überschrieben: Storefront schiebt das geschlossene
   Suchfeld nur um 2em nach unten aus dem Bild (assets/css/woocommerce/
   woocommerce.css) – in der Annahme, dass es dort so schmal bleibt. Mit
   eigenem Rahmen und Hintergrund oben und dem größeren `padding` aus dieser
   Datei ragt es aber höher als 2em, und der obere Rand blieb als schmale,
   weiße Linie quer über der Fußleiste sichtbar – unabhängig vom Hover,
   einfach immer (Kundenrückmeldung 19.09.2026, „komische Linien"). `-100vh`
   schiebt es garantiert vollständig aus dem sichtbaren Bereich, unabhängig
   von der tatsächlichen Höhe des Suchfelds. Die Aufklapp-Regel
   (`.search.active .site-search { bottom: 100% }`, dieselbe Datei) bleibt
   unverändert – der Wechsel läuft weiter über Storefronts eigenes footer.js,
   das beim Antippen der Lupe die Klasse `active` umschaltet. */
.storefront-handheld-footer-bar ul li.search .site-search {
	background-color: var(--tg-weiss);
	border-top: 1px solid var(--tg-linie);
	bottom: -100vh;
}

.storefront-handheld-footer-bar ul li.cart .count {
	background-color: var(--tg-gelb);
	color: var(--tg-schwarz);
	border-color: var(--tg-schwarz);
}

/* „Produkte" (kopfbereich.php, seit 27.09.2026): dieselbe Symbolschrift wie
   Suche und Warenkorb (Font Awesome aus dem Parent-Theme, lokal geladen),
   Zeichen „tshirt" – dasselbe Motiv wie das Merch-Symbol im archivierten
   Bereichsumschalter. */
.storefront-handheld-footer-bar ul li.produkte > a::before {
	content: "\f553";
}


/* 11. Shop-Übersicht und Produktarchiv ======================================
   Ziel: größere Produktbilder, mehr Weißraum, weniger Kanten. Storefront legt
   die Produkte als gefloatete Listenelemente mit prozentualen Breiten aus;
   hier übernimmt stattdessen ein Raster, das sich an der verfügbaren Breite
   orientiert statt an einer festen Spaltenzahl. */

/* Volle Breite, wo keine Seitenleiste ausgegeben wird. Storefront gibt der
   Inhaltsspalte ab 768 px sonst 73,9 % und stellt die restlichen 26 % für eine
   Leiste frei, die auf Shop-Seiten gar nicht mehr erscheint. */
@media (min-width: 48em) {
	.tegrafo-volle-breite .content-area {
		width: 100%;
		float: none;
		margin-left: 0;
		margin-right: 0;
	}
}


/* Seitenkopf des Archivs */
.woocommerce-products-header {
	margin-bottom: var(--tg-space-m);
}

.woocommerce-products-header__title {
	font-size: var(--tg-fs-h1);
	margin-bottom: var(--tg-space-xs);
}

.term-description,
.woocommerce-products-header .taxonomy-description {
	max-width: var(--tg-textbreite);
}

/* Kategorienzeile mit Seitenzahlen – bewusst leise: kleine Schrift, normale
   Schreibweise statt Versalien, dunkelgrau statt schwarz. Das war vorher ein
   kräftig gestaltetes Menü im Kopf (Kundenwunsch: dezenter, hier an der
   Ergebniszeile). Die aktuelle Kategorie bekommt WordPress' eigene
   `current-menu-item`-Klasse und hebt sich darüber ab, ohne dass die Zeile
   insgesamt lauter wirkt.

   Kundenwunsch, zweite Runde: Die Seitenzahlen standen zuvor in einer
   eigenen Zeile darüber (`.storefront-sorting`, jetzt komplett entfernt) –
   zwei fast leere Zeilen mit je eigenem Rand darunter wirkten unnötig
   auseinandergezogen. `tegrafo_kategorien_zeile()` (produktarchiv.php) gibt
   die Seitenzahlen jetzt selbst mit aus, als zweites Kind hier in derselben
   Flex-Zeile: Kategorien links, `margin-left: auto` schiebt die Seitenzahlen
   auf derselben Linie nach rechts.

   Kundenwunsch, dritte Runde: Auf schmalen Displays brechen die Kategorien
   ohnehin auf mehrere Zeilen um – die Seitenzahlen landeten dann auf einer
   eigenen, fast leeren Zeile, aber noch immer nach rechts geschoben statt
   sauber eingeordnet (Kundenrückmeldung 19.09.2026, „Paginierung besser
   lösen"). Unter dieser Breite deshalb eine eigene Zeile mit voller Breite:
   `.woocommerce-pagination` selbst braucht dafür kein `justify-content`,
   das steckt schon auf `ul.page-numbers` (weiter unten in dieser Datei) und
   zentriert die Seitenzahlen automatisch, sobald die Zeile die volle Breite
   einnimmt. */
.tegrafo-kategorien {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--tg-space-s) var(--tg-space-m);
	margin-bottom: var(--tg-space-m);
}

.tegrafo-kategorien .woocommerce-pagination {
	margin-left: auto;
	margin-top: 0;
}

/* Nach den beiden Basisregeln oben, nicht davor: Gleiche Selektor-Spezifität,
   also entscheidet die Reihenfolge im Quelltext – vor den Basisregeln stehend
   hätte dieser Block bei jeder Bildschirmbreite verloren, „max-width" hin
   oder her. */
@media (max-width: 47.99em) {
	.tegrafo-kategorien {
		flex-direction: column;
		align-items: stretch;
	}

	.tegrafo-kategorien .woocommerce-pagination {
		margin-left: 0;
		margin-top: var(--tg-space-s);
	}
}

.tegrafo-kategorien__liste {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	/* Waagerecht großzügig, seit die Trennpunkte weg sind: Der Abstand ist
	   jetzt das Trennzeichen. Senkrecht eng, damit eine umbrechende Zeile
	   zusammenhängend bleibt. */
	gap: var(--tg-space-2xs) var(--tg-space-m);
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Am Telefon passen fünf Kategorien à 18px nicht mit 40px Lücke nebeneinander
   – dort reicht die kleinere Stufe, der Umbruch trennt ohnehin schon.

   Und noch eine Stufe kleiner, seit im iframe bei 386px nachgemessen: Die
   Zeile war mit 18/16px und 24px Lücke **196px** hoch – auf einem 844px
   hohen Display rund ein Viertel des Sichtbereichs, noch vor dem ersten
   Produkt. Die Hauptzeile brach auf drei Zeilen um, die Unterzeile auf zwei.

   Durchgemessen wurden drei Wege:

     nur die Lücke auf 16px       196px – bringt nichts, der Umbruch bleibt
     16/15px und Lücke 16px       160px – gewählt
     je eine Zeile, quer scrollbar 118px – spart am meisten, schiebt aber
                                   Kategorien aus dem Bild, die man dann nur
                                   durch Wischen findet

   Die 15px der Unterzeile haben bewusst kein Token: Zwischen `--tg-fs-button`
   (16px) und `--tg-fs-klein` (14px) liegt nichts, und für einen einzigen
   Sonderfall lohnt kein sechster Schriftgrad in der Staffel. 14px wären auch
   gegangen, 15px hält den Abstand zur Hauptzeile aber gleichmäßig. */
@media (max-width: 47.99em) {
	.tegrafo-kategorien__liste {
		gap: var(--tg-space-2xs) var(--tg-space-xs);
	}
}

.tegrafo-kategorien__liste li {
	position: relative;
}

/* Zweite Zeile: die Unterkategorien der aktuellen Hauptkategorie
   (inc/produktarchiv.php, Kundenwunsch 23.09.2026).

   `flex-basis: 100%` zwingt die Liste in eine eigene Zeile – sie steht im
   Quelltext hinter den Seitenzahlen (die per `margin-left: auto` rechts
   kleben), landet aber trotzdem sauber darunter, weil `.tegrafo-kategorien`
   ohnehin `flex-wrap: wrap` hat. Kein `order`, damit Lesereihenfolge und
   Darstellung übereinstimmen.

   Der Einzug rückt die Unterzeile sichtbar unter die Hauptzeile; ohne ihn
   stünden zwei gleich aussehende Punktreihen übereinander und man wüsste
   nicht, welche welcher untergeordnet ist. Am Telefon entfällt er – dort
   bricht die Hauptzeile selbst schon um, und jeder Millimeter zählt. */
.tegrafo-kategorien__unter {
	flex: 0 0 100%;
	gap: var(--tg-space-2xs) var(--tg-space-s);
	margin-top: var(--tg-space-2xs);
}

@media (max-width: 47.99em) {
	.tegrafo-kategorien__unter {
		gap: var(--tg-space-2xs) var(--tg-space-xs);
	}
}

@media (min-width: 48em) {
	.tegrafo-kategorien__unter {
		padding-left: var(--tg-space-m);
	}
}

/* --- Hauptzeile ------------------------------------------------------------
   Kundenwunsch 23.09.2026: „das kategoriemenu und untermenü schöner und
   deutlicher gestalten". Vorher stand hier bewusst eine sehr leise Zeile –
   14px, Grau, Trennpunkte – weil das kräftige Aufklappmenü im Kopf am
   18.09.2026 abgeschafft worden war und die Kategorien nicht wieder wie ein
   „richtiges" Menü wirken sollten. Mit der zweistufigen Struktur aus der
   AMNESTY-Vorlage trägt diese Zurückhaltung nicht mehr: Zwei graue
   Punktreihen übereinander sagen weder, dass sie Navigation sind, noch
   welche der anderen untergeordnet ist.

   Deshalb jetzt klar zwei Ebenen:

     Hauptzeile   Roboto Condensed, 18px (--tg-fs-navigation, genau dafür
                  angelegt), Schwarz, gemischte Schreibung
     Unterzeile   Roboto, 16px, Grau, eingerückt

   Gemischte Schreibung statt Versalien ist Absicht: Der Bereichsumschalter
   direkt darüber steht in Versalien auf gefüllten Reitern. Stünde die
   Kategorienzeile genauso da, hätte man zwei gleich laute Reihen übereinander
   und keine Rangfolge mehr. Condensed und 18px reichen, damit die Zeile als
   Navigation gelesen wird.

   Die Trennpunkte sind ersatzlos weg. Sie hatten einen Fehler, der mit dem
   Umbruch auffiel: Das Zeichen gehörte per `li + li::before` zum *folgenden*
   Eintrag und stand absolut positioniert links davon – brach die Zeile um,
   rutschte der Punkt an den Anfang der neuen Zeile. Abstand allein trennt
   sauberer, und bei 40px Lücke braucht es ohnehin kein Zeichen mehr. */

.tegrafo-kategorien__liste a {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-navigation);
	font-weight: 400;
	line-height: 1.3;
	text-transform: none;
	letter-spacing: normal;
	color: var(--tg-text);
	text-decoration: none;
}

.tegrafo-kategorien__liste a:hover,
.tegrafo-kategorien__liste a:focus-visible {
	text-decoration: underline;
	text-underline-offset: 0.25em;
	text-decoration-thickness: 2px;
}

/* Die aktuelle Kategorie mit kräftigem schwarzem Unterstrich.

   Zwischenstand, der es nicht geworden ist: erst eine gelbe
   Textmarker-Markierung („wie mit einem Textmarker", Handbuch S. 20).
   Sie war deutlich, stand aber als zweite gelbe Fläche direkt unter dem
   gelben Reiter des Bereichsumschalters. Entscheidung Tobias 23.09.2026:
   „ja unterstrich statt gelb" – damit bleibt Gelb dem Umschalter und den
   Knöpfen vorbehalten, so wie es das Handbuch mit „sparsam einsetzen"
   (S. 9) meint.

   3 px, nicht die 2 px der Unterzeile: In der Hauptzeile sind alle
   Einträge schwarz, der Unterstrich ist dort das **einzige**
   Unterscheidungsmerkmal und muss entsprechend tragen. In der Unterzeile
   kommt der Wechsel von Grau auf Schwarz hinzu, da genügt weniger. Genau
   daran war die alte Fassung gescheitert: ein dünner Unterstrich unter
   14 px Grau sah aus wie ein Link, der gerade überfahren wird.

   `current-product_cat-ancestor` und `current-product-ancestor` sind die
   Klassen, die WordPress vergibt, wenn man in einer Unterkategorie
   beziehungsweise auf einer Produktseite darunter steht – so ist in der
   Hauptzeile auch der Weg dorthin markiert, nicht nur das Blatt unten. */
.tegrafo-kategorien__liste .current-menu-item > a,
.tegrafo-kategorien__liste .current-menu-ancestor > a,
.tegrafo-kategorien__liste .current-product_cat-ancestor > a,
.tegrafo-kategorien__liste .current-product-ancestor > a,
.tegrafo-kategorien__liste .current_page_parent > a {
	color: var(--tg-text);
	text-decoration: underline;
	text-underline-offset: 0.3em;
	text-decoration-thickness: 3px;
}

/* --- Unterzeile ------------------------------------------------------------
   Nach den Regeln der Hauptzeile, nicht davor: `.tegrafo-kategorien__unter`
   und `.tegrafo-kategorien__liste` sind beide eine einzelne Klasse, die
   Spezifität ist also gleich und die Reihenfolge im Quelltext entscheidet.
   Dieselbe Falle wie schon bei der Paginierung und beim Umschalter. */

.tegrafo-kategorien__unter a {
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-button);
	color: var(--tg-text-leise);
}

.tegrafo-kategorien__unter a:hover,
.tegrafo-kategorien__unter a:focus-visible {
	color: var(--tg-text);
}

/* Die aktuelle Unterkategorie: Schwarz statt Grau, dazu 2 px Unterstrich.
   Dünner als oben, weil hier schon der Farbwechsel trägt. */
.tegrafo-kategorien__unter .current-menu-item > a {
	color: var(--tg-text);
	text-decoration: underline;
	text-underline-offset: 0.25em;
	text-decoration-thickness: 2px;
}

/* Schriftgrade am Telefon – **nach** allen `… a`-Regeln oben, nicht oben beim
   Abstand. Die Regeln haben dieselbe Spezifität (eine Klasse plus ein
   Element), also entscheidet die Reihenfolge im Quelltext. Beim ersten Anlauf
   stand dieser Block weiter oben neben der Lückenregel und hatte deshalb
   keine Wirkung – gemessen im iframe: weiterhin 18/16 px. Dieselbe Falle, vor
   der die Kommentare in dieser Datei an drei anderen Stellen schon warnen.

   Die 15 px der Unterzeile haben bewusst kein Token: Zwischen
   `--tg-fs-button` (16 px) und `--tg-fs-klein` (14 px) liegt nichts, und für
   einen einzigen Sonderfall lohnt kein sechster Schriftgrad in der Staffel. */
@media (max-width: 47.99em) {
	.tegrafo-kategorien__liste a {
		font-size: var(--tg-fs-button);
	}

	.tegrafo-kategorien__unter a {
		font-size: 0.9375rem; /* 15px */
	}
}

/* --- Aufklapplisten an der Hauptzeile --------------------------------------
   Wunsch AMNESTY vom 25.09.2026, Entscheidung Tobias 27.09.2026: „Dropdown
   überall mit Pfeil“ (produktarchiv.php, assets/js/kategorien.js). Hinter
   den Schriftgraden fürs Telefon, damit deren `… a`-Regel die Einträge der
   Liste nicht wieder auf die Hauptzeilen-Schrift zieht.

   Der Pfeil ist ein Knopf, soll aber nicht wie einer aussehen: kein Grau,
   keine Versalien, kein Innenabstand aus Abschnitt 6. Seine Trefferfläche ist
   trotzdem 44 px hoch (WCAG 2.5.5 wie die übrigen Knöpfe). Die negativen
   Ränder oben und unten nehmen ihn aus der Zeilenhöhe heraus – sonst stünde
   jede Hauptkategorie mit Pfeil höher als „Alles“. Die Hover-Farbe von
   Storefront (`button:hover`) ist spezifischer als eine einzelne Klasse,
   deshalb sind die Zustände unten ausdrücklich mit aufgeführt. */
.tegrafo-kategorien__pfeil,
.tegrafo-kategorien__pfeil:hover,
.tegrafo-kategorien__pfeil:focus {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2rem;
	min-height: 0;
	height: 2.75rem;
	margin: -0.625rem 0 -0.625rem var(--tg-space-3xs);
	padding: 0;
	vertical-align: middle;
	background-color: transparent;
	border: 0;
	color: var(--tg-text);
	cursor: pointer;
}

.tegrafo-kategorien__pfeil[aria-expanded="true"] svg {
	transform: rotate(180deg);
}

/* Weiß mit schwarzer Linie wie der Kopf, ohne Schatten – die Zeile bleibt
   zurückhaltend, die Liste liegt nur darüber. Links um den Innenabstand
   verschoben, damit die Einträge mit dem Namen der Hauptkategorie fluchten.

   Offen und zu über `visibility`, nicht `display`: Eine verborgene Liste
   behält so ihre Maße, das Skript kann sie schon vor dem Öffnen im Bild
   halten, und ihre Links sind trotzdem nicht per Tabulator erreichbar. */
.tegrafo-kategorien__klapp {
	position: absolute;
	top: calc(100% + var(--tg-space-3xs));
	left: calc(-1 * var(--tg-space-xs));
	z-index: 30;
	display: block;
	min-width: 12rem;
	max-width: calc(100vw - 2 * var(--tg-space-xs));
	margin: 0;
	padding: var(--tg-space-2xs) 0;
	list-style: none;
	background-color: var(--tg-weiss);
	border: 1px solid var(--tg-linie-kraeftig);
	visibility: hidden;
	opacity: 0;
	/* Beim Schließen 150 ms Nachlauf: Wer schräg nach unten in die Liste
	   zielt, streift kurz die Lücke darüber und verliert sie nicht. */
	transition: opacity 0.15s ease, visibility 0s linear 0.15s;
}

.tegrafo-kategorien__pfeil[aria-expanded="true"] + .tegrafo-kategorien__klapp {
	visibility: visible;
	opacity: 1;
	transition: opacity 0.15s ease, visibility 0s linear 0s;
}

/* Überfahren nur mit einer echten Maus. Ein Tablet meldet `hover: none`, dort
   öffnet allein der Pfeil – sonst zeigte das erste Tippen auf eine
   Hauptkategorie die Liste, statt auf ihre Seite zu führen. 100 ms Vorlauf,
   damit nicht jede Liste aufblitzt, über die die Maus nur hinwegfährt.
   `data-zu` setzt das Skript nach Esc, bis die Maus den Eintrag verlässt. */
@media (hover: hover) and (pointer: fine) {
	.tegrafo-kategorien__liste > li:hover:not([data-zu]) > .tegrafo-kategorien__klapp {
		visibility: visible;
		opacity: 1;
		transition: opacity 0.15s ease 0.1s, visibility 0s linear 0.1s;
	}

	.tegrafo-kategorien__liste > li:hover:not([data-zu]) > .tegrafo-kategorien__pfeil svg {
		transform: rotate(180deg);
	}
}

.tegrafo-kategorien__klapp li {
	display: block;
}

/* Schrift der Unterzeile, aber schwarz: In der Liste gibt es keine aktuelle
   Ebene, von der sich die Einträge grau abheben müssten. */
.tegrafo-kategorien__klapp a {
	display: block;
	padding: var(--tg-space-3xs) var(--tg-space-xs);
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-button);
	line-height: 1.5;
	white-space: nowrap;
	color: var(--tg-text);
}

.tegrafo-kategorien__klapp a[aria-current="page"] {
	text-decoration: underline;
	text-underline-offset: 0.25em;
	text-decoration-thickness: 2px;
}

/* Der Fokusrahmen aus Abschnitt 8 steht 2 px außen und fiele hier mit der
   Linie der Liste zusammen – nach innen gelegt bleibt er als eigener Rahmen
   erkennbar. */
.tegrafo-kategorien__klapp a:focus-visible {
	outline-offset: -4px;
}

.woocommerce-ordering {
	margin: 0;
}

.woocommerce-ordering select.orderby {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	padding: var(--tg-space-3xs) var(--tg-space-2xs);
	min-height: 2.75rem;
}


/* --- Das Raster ---------------------------------------------------------- */

/* `minmax(0, 1fr)` statt `1fr`: `1fr` heißt `minmax(auto, 1fr)`, jede Spalte
   ist also mindestens so breit wie ihr längstes Wort. „Menschenrechtsspiel“
   (160 px) und „AUSFÜHRUNG WÄHLEN“ (144 px) haben das Raster am Telefon und bei
   768 px über den Rand geschoben, bei 320 px fehlten rechts 48 px (25.09.2026).
   Dass die Wörter trotzdem in die Spalte passen, regeln Titel und Button
   weiter unten. */
.woocommerce ul.products,
ul.products {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--tg-space-m) var(--tg-space-s);
	margin: 0 0 var(--tg-space-l);
	padding: 0;
	list-style: none;
	/* Storefronts Float-Layout abräumen */
	float: none;
	clear: both;
}

/* Storefront setzt auf ul.products ein Clearfix-Paar mit `content: ""`. Im
   Float-Layout ist das unsichtbar – in einem Raster werden daraus zwei echte
   Rasterfelder, also zwei leere Kacheln vor und nach den Produkten. */
.woocommerce ul.products::before,
.woocommerce ul.products::after,
ul.products::before,
ul.products::after {
	content: none;
}

@media (min-width: 48em) {
	.woocommerce ul.products,
	ul.products {
		gap: var(--tg-space-l) var(--tg-space-m);
	}

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

	.woocommerce ul.products.columns-4,
	ul.products.columns-4 {
		grid-template-columns: repeat(4, minmax(0, 1fr));
	}

	.woocommerce ul.products.columns-2,
	ul.products.columns-2 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* Storefronts Prozentbreiten und Ränder überschreiben – im Raster erledigt
   das `gap`. Auch `first`/`last`-Klassen verlieren damit ihre Bedeutung.
   Die dritte Zeile ist nötig, weil Storefront die Breiten je Spaltenzahl über
   `.site-main ul.products.columns-3 li.product` setzt – das ist spezifischer
   als die beiden Selektoren darüber und würde sie sonst überstimmen. */
.woocommerce ul.products li.product,
.site-main ul.products li.product,
.site-main ul.products[class*="columns-"] li.product,
ul.products li.product {
	width: auto;
	max-width: none;
	float: none;
	clear: none;
	margin: 0;
	padding: 0;
	/* Handbuch S. 16, Pkt. 6: immer linksbündig. */
	text-align: left;
	display: flex;
	flex-direction: column;
	/* Grundabstand zwischen Bild/Titel/Preis, Pflichtangaben und Button.
	   `margin-top: auto` am Button legt darüber noch den restlichen Freiraum,
	   sodass die Buttons einer Reihe unten bündig stehen. */
	row-gap: var(--tg-space-2xs);
}


/* --- Die Kachel ---------------------------------------------------------- */

.woocommerce ul.products li.product a.woocommerce-loop-product__link,
ul.products li.product a.woocommerce-loop-product__link {
	display: block;
	text-decoration: none;
	background-color: transparent;
}

.woocommerce ul.products li.product img,
ul.products li.product img {
	display: block;
	width: 100%;
	height: auto;
	margin: 0 0 var(--tg-space-xs);
	/* Warmes Hellgrau hinter dem Bild: Produktfotos vor weißem Hintergrund
	   bekommen dadurch eine Kante, ohne dass ein Rahmen nötig wird. Laut
	   Handbuch ist das genau die Rolle der Sekundärfarben – "für Hintergründe,
	   Informationskästen und Grafiken" (S. 9). */
	background-color: var(--tg-flaeche-info);
}

.woocommerce ul.products li.product .woocommerce-loop-product__title,
ul.products li.product .woocommerce-loop-product__title {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-h3);
	font-weight: 400;
	/* Produkttitel bleiben in normaler Schreibweise – Abweichung von der
	   Versalien-Regel, freigegeben am 16.09.2026. */
	text-transform: none;
	letter-spacing: 0;
	color: var(--tg-text);
	padding: 0;
	margin: 0 0 var(--tg-space-3xs);
	/* Lange Wörter trennen statt mitten im Wort umbrechen: Bei 320 px ist eine
	   Spalte 108 px breit, „Menschenrechtsspiel“ braucht 160. Getrennt werden
	   nur Wörter ab 12 Buchstaben mit mindestens 5 auf jeder Seite. `wrap`
	   statt des `balance` aller Überschriften: Mit `balance` trennt Chrome auch
	   Wörter, die passen („But-ton Regenbogen“, „Baumwoll-tasche“ bis 1024 px),
	   `wrap` trennt nur, was nicht in die Zeile geht. Die Silbentrennung braucht
	   `lang="de"` am html-Element, das setzt WordPress. */
	-webkit-hyphens: auto;
	hyphens: auto;
	hyphenate-limit-chars: 12 5 5;
	text-wrap: wrap;
}

.woocommerce ul.products li.product .price,
ul.products li.product .price {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-text);
	font-weight: 700;
	color: var(--tg-text);
	margin: 0;
	display: block;
}

/* Pflichtangaben von Germanized: MwSt.-Hinweis, Versandkosten, Lieferzeit,
   Grundpreis. Sie bleiben vollständig und an Ort und Stelle; typografisch
   bekommen sie die Rolle der Marginalie (Handbuch S. 16, Pkt. 4). */
.woocommerce ul.products li.product .wc-gzd-additional-info,
ul.products li.product .wc-gzd-additional-info {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	line-height: 1.4;
	color: var(--tg-text-leise);
	margin: var(--tg-space-3xs) 0 0;
}

.woocommerce ul.products li.product .wc-gzd-additional-info a,
ul.products li.product .wc-gzd-additional-info a {
	color: var(--tg-text-leise);
}

/* Der Button sitzt am unteren Rand der Kachel, damit die Buttons einer Reihe
   eine gemeinsame Kante bilden – auch bei unterschiedlich langen Produktnamen.
   `margin-top: auto` schiebt ihn nach unten, der Mindestabstand hält ihn von
   den Pflichtangaben darüber frei. Auf schmalen Displays läuft er über die
   volle Kachelbreite: größere Trefferfläche, klarere Handlungsaufforderung.
   Seit 1.90.9 gilt das bis 64em: Bei 768 px hat eine der vier Spalten nur
   120 px, ein Button mit eigener Breite wäre breiter als die Kachel. */
.woocommerce ul.products li.product .button,
ul.products li.product .button {
	margin-top: auto;
	align-self: stretch;
	width: 100%;
}

/* Unter 64em 4 px statt 24 px Innenabstand seitlich: Das längste Wort
   („WEITERLESEN“, 97,5 px) passt so noch in die 108 px breite Spalte bei
   320 px. Der Text steht zentriert, der kleinere Abstand fällt nur bei den
   längsten Beschriftungen auf. */
@media (max-width: 63.99em) {
	.woocommerce ul.products li.product .button,
	ul.products li.product .button {
		padding-left: var(--tg-space-3xs);
		padding-right: var(--tg-space-3xs);
	}
}

@media (min-width: 64em) {
	.woocommerce ul.products li.product .button,
	ul.products li.product .button {
		align-self: flex-start;
		width: auto;
	}
}

.woocommerce ul.products li.product .added_to_cart,
ul.products li.product .added_to_cart {
	display: inline-block;
	margin-top: var(--tg-space-2xs);
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
}


/* --- Kategorie-Kacheln --------------------------------------------------- */

.woocommerce ul.products li.product-category .woocommerce-loop-category__title,
ul.products li.product-category .woocommerce-loop-category__title {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-h3);
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal);
	color: var(--tg-text);
}


/* --- Seitenblättern ------------------------------------------------------ */

.woocommerce-pagination {
	margin-top: var(--tg-space-m);
}

.woocommerce-pagination ul.page-numbers {
	border: 0;
	display: flex;
	flex-wrap: wrap;
	gap: var(--tg-space-2xs);
	justify-content: center;
}

/* Storefronts Clearfix-Paar (`content: ""`) wird in der Flex-Liste zu zwei
   leeren Einträgen, die je einen `gap` mitbringen: Rechtsbündig endete die
   Leiste 8 px vor der Rasterkante (gemessen 25.09.2026). Wie beim Raster. */
.woocommerce-pagination ul.page-numbers::before,
.woocommerce-pagination ul.page-numbers::after {
	content: none;
}

.woocommerce-pagination ul.page-numbers li {
	border: 0;
}

.woocommerce-pagination .page-numbers {
	border-radius: var(--tg-radius-knopf);
	font-family: var(--tg-font-headline);
	font-weight: 400;
	min-width: 2.75rem;
	min-height: 2.75rem;
	display: flex;
	align-items: center;
	justify-content: center;
	border: 1px solid var(--tg-linie);
	color: var(--tg-text);
	text-decoration: none;
	background-color: transparent;
}

/* Nur die einzelnen Seiten-Links, nicht die ganze Liste: WooCommerce gibt
   der `<ul>` selbst ebenfalls die Klasse `page-numbers` (dieselbe wie den
   Einträgen darin). `:hover` gilt aber für jedes Element, über dem der
   Zeiger gerade steht – auch für Vorfahren, deren Fläche der Zeiger nur
   mit-überdeckt. Ohne die Einschränkung auf `a`/`span` färbte darum beim
   Überfahren eines einzelnen Knopfs die ganze `<ul>` grau ein, weil sie
   über denselben Selektor `.page-numbers:hover` ebenfalls traf – sichtbar
   als ein einziger grauer Block statt eines einzelnen Knopfs
   (Kundenrückmeldung 19.09.2026). */
.woocommerce-pagination a.page-numbers:hover,
.woocommerce-pagination span.page-numbers:hover {
	background-color: var(--tg-flaeche-info);
}

/* Deckt sich in der Selektor-Kette mit `.woocommerce-pagination .page-
   numbers li .page-numbers.current` aus WooCommerce/Storefronts eigenem
   CSS (Spezifität 0-4-1). Ohne das `li` dazwischen verlor die kürzere
   Fassung dagegen: Die aktuelle Seite blieb hellgrau statt schwarz gefüllt,
   der schwarze Rand (aus dieser Regel, unstrittig) stand dann unpassend zur
   hellgrauen Fläche (Kundenrückmeldung 19.09.2026, „aktiv-Status nicht
   schön"). */
.woocommerce-pagination .page-numbers li .page-numbers.current {
	background-color: var(--tg-schwarz);
	border-color: var(--tg-schwarz);
	color: var(--tg-weiss);
}

/* Seitenzahlen unter dem Raster (seit 1.90.11, inc/produktarchiv.php).
   Storefront lässt `.woocommerce-pagination` nach rechts fließen, dann
   umfloss der Vertrauensblock darunter die Leiste. Hier ohne Fließen, am
   Telefon mittig wie oben (das erledigt `justify-content` auf der Liste),
   ab 48em rechtsbündig, also unter der Leiste in der Kategorienzeile. Das
   Raster hält unten schon 64 px Abstand, deshalb hier kein eigener nach
   oben. */
.tegrafo-seitenzahlen-unten {
	clear: both;
	margin-bottom: var(--tg-space-l);
}

.tegrafo-seitenzahlen-unten .woocommerce-pagination {
	float: none;
	margin-top: 0;
}

@media (min-width: 48em) {
	.tegrafo-seitenzahlen-unten .woocommerce-pagination ul.page-numbers {
		justify-content: flex-end;
	}
}


/* 12. Produktseite =========================================================
   Aufteilung: Galerie links, Zusammenfassung rechts. Storefront gibt der
   Galerie 41 % und der Zusammenfassung 53 %; für größere Produktbilder wird das
   Verhältnis umgedreht. */

@media (min-width: 48em) {
	.single-product div.product .woocommerce-product-gallery {
		width: 52%;
		float: left;
		margin-right: 5%;
	}

	.single-product div.product .summary {
		width: 43%;
		float: right;
		margin-right: 0;
	}
}

/* Produktbilder auf warmem Hellgrau – wie in der Übersicht. */
.single-product div.product .woocommerce-product-gallery__image img {
	background-color: var(--tg-flaeche-info);
}

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li img {
	background-color: var(--tg-flaeche-info);
	border: 1px solid transparent;
}

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li img.flex-active {
	border-color: var(--tg-schwarz);
}


/* --- Zusammenfassung ----------------------------------------------------- */

.single-product div.product .product_title {
	font-size: var(--tg-fs-h1);
	margin-bottom: var(--tg-space-xs);
}

.single-product div.product .summary p.price,
.single-product div.product .summary .price {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-h2);
	font-weight: 700;
	color: var(--tg-text);
	margin-bottom: var(--tg-space-2xs);
}

/* Pflichtangaben direkt am Preis: MwSt.-Hinweis und Versandkosten-Link.
   Sie bleiben unverändert an ihrem Platz, bekommen aber die Rolle der
   Marginalie (Handbuch S. 16, Pkt. 4). Dunkelgrau erreicht auf Weiß 5,2:1 und
   erfüllt damit WCAG AA auch für kleinen Text. */
.single-product div.product .legal-price-info,
.single-product div.product .summary .wc-gzd-additional-info {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	line-height: 1.5;
	color: var(--tg-text-leise);
}

.single-product div.product .summary .wc-gzd-additional-info a {
	color: var(--tg-text-leise);
}

/* Germanized legt leere Absätze als Platzhalter an und füllt sie per
   JavaScript, sobald eine Variante gewählt ist – Lieferzeit, Grundpreis,
   Pfand. Sie dürfen deshalb nicht ausgeblendet werden, erzeugen im leeren
   Zustand aber Lücken. `:empty` greift nur, solange nichts drinsteht; sobald
   Germanized den Text einsetzt, gelten wieder die normalen Abstände. */
.wc-gzd-additional-info:empty,
.wc-gzd-additional-info-placeholder:empty {
	margin: 0;
}

.single-product div.product .woocommerce-product-details__short-description {
	margin-bottom: var(--tg-space-s);
}


/* --- Variantenauswahl ---------------------------------------------------- */

/* Storefront stellt die Tabelle auf `display: list-item` um. Für die Auswahl
   von Größe und Farbe ist eine gestapelte Beschriftung über dem Auswahlfeld
   besser bedienbar – vor allem auf dem Handy, wo 70 % Feldbreite zu schmal
   für die Werte sind. Nur Darstellung: Felder, Namen und die Logik von
   WooCommerce bleiben unberührt. */
.single-product div.product table.variations,
.single-product div.product table.variations tbody,
.single-product div.product table.variations tr,
.single-product div.product table.variations th,
.single-product div.product table.variations td {
	display: block;
	width: 100%;
	padding: 0;
	border: 0;
}

.single-product div.product table.variations tr {
	margin-bottom: var(--tg-space-s);
}

.single-product div.product table.variations th.label label {
	display: block;
	font-family: var(--tg-font-headline);
	font-weight: 400;
	margin-bottom: var(--tg-space-3xs);
}

.single-product div.product table.variations select {
	max-width: 100%;
	width: 100%;
}

.single-product div.product .reset_variations {
	display: inline-block;
	margin-top: var(--tg-space-2xs);
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
}

.single-product div.product .single_variation .price {
	margin-bottom: var(--tg-space-xs);
}


/* --- Menge und Warenkorb ------------------------------------------------- */

.single-product div.product form.cart {
	padding: 0;
	margin-bottom: var(--tg-space-m);
}

.single-product div.product form.cart .quantity {
	float: none;
	display: inline-block;
	margin-right: var(--tg-space-xs);
	vertical-align: middle;
}

.single-product div.product form.cart .quantity .qty {
	width: 5rem;
	min-height: 2.75rem;
	text-align: center;
}

/* Der Warenkorb-Button trägt die Klasse `alt` und ist damit bereits gelb mit
   schwarzer Schrift (19,6:1). Hier nur Größe und Anordnung. */
.single-product div.product form.cart .single_add_to_cart_button {
	vertical-align: middle;
	padding-left: var(--tg-space-m);
	padding-right: var(--tg-space-m);
}

@media (max-width: 47.99em) {
	.single-product div.product form.cart .quantity {
		display: block;
		margin: 0 0 var(--tg-space-2xs);
	}

	.single-product div.product form.cart .quantity .qty {
		width: 100%;
	}

	.single-product div.product form.cart .single_add_to_cart_button {
		display: block;
		width: 100%;
	}
}

.single-product div.product .product_meta {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	color: var(--tg-text-leise);
	border-top: 1px solid var(--tg-linie);
	padding-top: var(--tg-space-xs);
}

.single-product div.product .product_meta a {
	color: var(--tg-text-leise);
}


/* --- Reiter -------------------------------------------------------------- */

/* Storefront stellt die Reiter ab 768 px als schmale Spalte links neben den
   Inhalt (29 % Reiter, 65 % Inhalt). Waagerecht über dem Inhalt steht dem
   Panel die volle Breite zur Verfügung – das kommt vor allem der Maßtabelle
   und den Produktsicherheitsangaben zugute, die beide Tabellen enthalten. */
.woocommerce-tabs {
	overflow: visible;
	padding: var(--tg-space-l) 0 0;
}

.woocommerce-tabs::before,
.woocommerce-tabs::after {
	content: none;
}

.woocommerce-tabs ul.tabs {
	list-style: none;
	margin: 0;
	padding: 0;
	border-top: 0;
	border-bottom: 1px solid var(--tg-linie);
	display: flex;
	flex-wrap: wrap;
	gap: 0 var(--tg-space-s);
}

.woocommerce-tabs ul.tabs li {
	display: block;
	margin: 0;
	border-bottom: 0;
	background: transparent;
	border-radius: 0;
}

/* Storefronts Zeiger unter dem aktiven Reiter abschalten (Kundenmeldung
   23.09.2026: „hier ist noch ein Pfeil, der da nicht hingehört").

   Storefront zeichnet die Reiter im Original als abgesetzte Kästchen und
   setzt darunter eine kleine Spitze, die auf den aktiven Reiter zeigt – ein
   Zeichen aus Font Awesome in `.woocommerce-tabs ul.tabs li::after`
   (icons.css), eingeblendet über `li.active::after { opacity: 1 }`. Die
   Kästchen sind hier längst weg, die Reiter stehen als flache Beschriftungen
   über einer durchgehenden Linie und werden schwarz unterstrichen. Die Spitze
   zeigte seitdem auf nichts und stand als 8,5 px breiter Haken neben dem
   Wort.

   Nur `::after`: `::before` trägt an dieser Stelle ohnehin `content: none`
   (nachgemessen), da gibt es nichts abzuschalten. */
.woocommerce-tabs ul.tabs li::after {
	display: none;
}

.woocommerce-tabs ul.tabs li a {
	display: block;
	padding: var(--tg-space-xs) 0;
	font-family: var(--tg-font-headline);
	font-weight: 400;
	font-size: var(--tg-fs-button);
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	color: var(--tg-text);
	text-decoration: none;
	background-color: transparent;
	border-bottom: 3px solid transparent;
	margin-bottom: -1px;
}

.woocommerce-tabs ul.tabs li.active a,
.woocommerce-tabs ul.tabs li a:hover {
	border-bottom-color: var(--tg-schwarz);
	background-color: transparent;
}

.woocommerce-tabs .panel {
	margin-top: var(--tg-space-m);
}

.woocommerce-tabs .panel h2:first-of-type {
	font-size: var(--tg-fs-h2);
	margin-bottom: var(--tg-space-s);
}

@media (min-width: 48em) {
	.woocommerce-tabs ul.tabs {
		width: 100%;
		float: none;
		margin-right: 0;
		gap: 0 var(--tg-space-m);
	}

	.woocommerce-tabs .panel {
		width: 100%;
		float: none;
		margin-right: 0;
	}
}

/* Tabellen in den Reitern – Maßtabelle, Zusätzliche Informationen,
   Produktsicherheit. */
.woocommerce-tabs .panel table {
	width: 100%;
	border-collapse: collapse;
}

.woocommerce-tabs .panel table th,
.woocommerce-tabs .panel table td {
	border: 1px solid var(--tg-linie);
	padding: var(--tg-space-2xs) var(--tg-space-xs);
	text-align: left;
}

.woocommerce-tabs .panel table th {
	font-family: var(--tg-font-headline);
	background-color: var(--tg-flaeche-info);
}


/* --- Ähnliche Produkte --------------------------------------------------- */

.related.products > h2,
.up-sells > h2,
.cross-sells > h2 {
	font-size: var(--tg-fs-h2);
	text-align: left;
	margin-bottom: var(--tg-space-m);
}

.related.products,
.up-sells {
	clear: both;
	padding-top: var(--tg-space-l);
}


/* 13. Startseite: Aktionsbalken mit Produktbild ==============================
   Der Balken ist rechteckig mit geraden Kanten, in 100 % Amnesty Gelb, und
   hält zu allen Seiten denselben Freiraum ein (Handbuch S. 14). Seit dem
   29.09.2026 steht ein freigestelltes Produktbild rechts im Balken (Wunsch
   AMNESTY: die Leerfläche füllen). Ohne Bild steht der Text allein. */

.tegrafo-buehne {
	margin-bottom: var(--tg-space-l);
}

.tegrafo-buehne__balken {
	background-color: var(--tg-gelb);
	color: var(--tg-schwarz);
	/* Gleicher Freiraum an allen vier Seiten – ausdrückliche Vorgabe (S. 14). */
	padding: var(--tg-space-m);
	max-width: var(--tg-container);
	margin: 0 auto;
}

/* Mit Bild: unterhalb der Tablet-Breite Text oben, Bild kleiner darunter. */
.tegrafo-buehne__balken--mit-bild {
	display: grid;
	gap: var(--tg-space-s);
	align-items: center;
}

.tegrafo-buehne__bild {
	justify-self: center;
}

.tegrafo-buehne__bild img {
	display: block;
	width: auto;
	height: auto;
	max-width: 100%;
	max-height: 14rem;
}

.tegrafo-buehne__ueberschrift {
	font-size: var(--tg-fs-hero);
	line-height: var(--tg-lh-hero);
	color: var(--tg-schwarz);
	margin: 0 0 var(--tg-space-s);
	max-width: 22ch;
}

/* Der Knopf trägt die Klasse `alt` und wäre damit gelb auf gelb. Auf dem
   Aktionsbalken dreht sich das Verhältnis um: schwarze Fläche, weiße Schrift
   (21:1). Damit bleibt die Handlungsfarbe im Balken eindeutig. */
.tegrafo-buehne__knopf,
.tegrafo-buehne .button.alt {
	background-color: var(--tg-schwarz);
	border-color: var(--tg-schwarz);
	color: var(--tg-weiss);
}

.tegrafo-buehne__knopf:hover,
.tegrafo-buehne .button.alt:hover {
	background-color: var(--tg-dunkelgrau);
	border-color: var(--tg-dunkelgrau);
	color: var(--tg-weiss);
}

/* Ab Tablet: Text links, Bild rechts am Rand des Balkens. Die Textspalte
   nimmt den Rest; das Bild wächst mit der Breite, bleibt aber gedeckelt. */
@media (min-width: 48em) {
	.tegrafo-buehne__balken--mit-bild {
		grid-template-columns: minmax(0, 1fr) auto;
		gap: var(--tg-space-m);
	}

	.tegrafo-buehne__bild {
		justify-self: end;
	}

	.tegrafo-buehne__bild img {
		max-height: 20rem;
	}
}

@media (min-width: 64em) {
	.tegrafo-buehne__bild img {
		max-height: 24rem;
	}
}


/* 14. Warenkorb und Kasse ===================================================
   Beide Seiten sind blockbasiert (`wp:woocommerce/cart`). Der Server liefert
   nur ein Gerüst, den sichtbaren Aufbau erzeugt JavaScript – die Klassennamen
   stammen deshalb aus den Block-Stylesheets von WooCommerce, nicht aus dem
   ausgelieferten Quelltext.

   Hier wird ausschließlich das Aussehen gesetzt. Reihenfolge und Inhalt der
   Felder, die Pflichtangaben und die Einwilligungs-Kästchen von Germanized
   im Block `wp-block-woocommerce-checkout-terms-block` bleiben unberührt. */

:root {
	/* Von den Blöcken 30-fach für Trennlinien genutzt. */
	--wc-separator-color: var(--tg-hellgrau);
	--wc-form-color-text: var(--tg-schwarz);
}

/* Warenkorb und Kasse auf dieselbe Breite wie der Rest der Seite.

   Beide Blöcke tragen die Klasse `alignwide`, und WooCommerce setzt auf diesen
   Seiten zusätzlich die Body-Klasse `storefront-full-width-content`. Damit
   greift Storefronts Regel für breite Blöcke:
   `margin-left/right: calc(25% - 25vw)`. Bei 1680 px Fensterbreite sind das
   −120 px je Seite – der Block lief von 113 bis 1553, während Logo, Menü,
   Suche und alle anderen Seiten von 233 bis 1433 laufen.

   Für Bilder und andere breite Blöcke im Fließtext bleibt `alignwide`
   unverändert; hier werden ausdrücklich nur diese beiden Blöcke eingefangen.
   Die Selektoren tragen fünf Klassen, weil Storefronts Regel ebenso viele
   hat. */
.woocommerce-cart .hentry .entry-content .wp-block-woocommerce-cart.alignwide,
.woocommerce-checkout .hentry .entry-content .wp-block-woocommerce-checkout.alignwide {
	width: auto;
	max-width: none;
	margin-left: 0;
	margin-right: 0;
	padding-left: 0;
	padding-right: 0;
}

/* Überschriften der Abschnitte: Kontakt, Lieferadresse, Versand, Zahlung */
.wc-block-components-title,
.wc-block-components-checkout-step__title {
	font-family: var(--tg-font-headline);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal);
	color: var(--tg-text);
}

.wc-block-components-checkout-step__description {
	font-family: var(--tg-font-text);
	color: var(--tg-text-leise);
}

/* Eingabefelder wie im übrigen Shop: gerade Kanten, 44 px Höhe. */
.wc-block-components-text-input input[type="text"],
.wc-block-components-text-input input[type="email"],
.wc-block-components-text-input input[type="tel"],
.wc-block-components-text-input input[type="number"],
.wc-block-components-textarea,
.wc-block-components-combobox-control input {
	border: 1px solid var(--tg-dunkelgrau);
	border-radius: var(--tg-radius);
	min-height: 2.75rem;
	color: var(--tg-text);
}

.wc-block-components-text-input label,
.wc-block-components-checkout-step__heading-content label {
	font-family: var(--tg-font-headline);
}

/* Auswahl von Versandart und Zahlungsart */
.wc-block-components-radio-control-accordion-option,
.wc-block-components-radio-control__option {
	border-radius: var(--tg-radius);
}

.wc-block-components-radio-control-accordion-option {
	border: 1px solid var(--tg-linie);
}

.wc-block-components-radio-control-accordion-option:has(input:checked),
.wc-block-components-radio-control__option--checked-option-highlighted {
	border-color: var(--tg-schwarz);
}

/* Summenblock: im Handbuch ein Informationskasten, also warmes Hellgrau
   (Schwarz darauf 11,9:1). */
.wc-block-components-sidebar .wc-block-components-totals-wrapper,
.wp-block-woocommerce-cart-order-summary-block,
.wp-block-woocommerce-checkout-order-summary-block {
	background-color: var(--tg-flaeche-info);
	border-radius: var(--tg-radius);
}

.wp-block-woocommerce-cart-order-summary-block,
.wp-block-woocommerce-checkout-order-summary-block {
	padding: var(--tg-space-s);
}

.wc-block-components-totals-item__label {
	font-family: var(--tg-font-headline);
}

.wc-block-components-totals-item__value,
.wc-block-components-formatted-money-amount {
	font-family: var(--tg-font-headline);
	font-weight: 700;
}

/* Gesamtsumme deutlich absetzen */
.wc-block-components-totals-footer-item .wc-block-components-totals-item__label,
.wc-block-components-totals-footer-item .wc-block-components-totals-item__value {
	font-size: var(--tg-fs-h3);
	font-weight: 700;
	color: var(--tg-text);
}

/* Steuer- und Versandhinweise im Summenblock bleiben vollständig stehen und
   bekommen die Rolle der Marginalie.

   Schwarz statt `--tg-text-leise` seit 1.90.18 (Selbsttest Barrierefreiheit,
   27.09.2026): Die Hinweise stehen immer im hellgrauen Summenblock, und
   Dunkelgrau erreicht dort nur 2,95 : 1 („inkl. 0,95 € MwSt.“, WCAG 1.4.3
   verlangt 4,5 : 1). Schwarz auf Hellgrau hat 11,9 : 1. Die Marginalie
   bleibt über Schriftgrad und Condensed erkennbar – und das Handbuch will
   Text ohnehin schwarz (S. 16, Pkt. 7). */
.wc-block-components-totals-footer-item-tax,
.wc-block-components-totals-item__description,
.wc-block-components-totals-shipping-address-summary {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	color: var(--tg-text);
}

/* Artikelangaben in der Bestellübersicht der Kasse (Lieferzeit von
   Germanized, Größe und Farbe bei Varianten): WooCommerce setzt sie in
   `#757575` auf den eigenen Grund der Liste (`#eeeeee`) – 3,97 : 1 bei
   12,8 px (Selbsttest Barrierefreiheit, 27.09.2026). Schwarz: 18,1 : 1. */
.wc-block-components-order-summary .wc-block-components-product-details,
.wc-block-components-order-summary .wc-block-components-product-details__name,
.wc-block-components-order-summary .wc-block-components-product-details__value,
.wc-block-components-order-summary .delivery-time-inner {
	color: var(--tg-text);
}

/* Schaltflächen */
.wc-block-components-button {
	font-family: var(--tg-font-headline);
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	border-radius: var(--tg-radius-knopf);
	min-height: 2.75rem;
}

/* Die beiden Handlungen, auf die es ankommt: zur Kasse und Bestellung
   abschicken. Schwarz auf Amnesty Gelb, 19,6:1. */
.wc-block-cart__submit-button,
.wc-block-components-checkout-place-order-button {
	background-color: var(--tg-gelb);
	border-color: var(--tg-gelb);
	color: var(--tg-schwarz);
}

.wc-block-cart__submit-button:hover,
.wc-block-cart__submit-button:focus-visible,
.wc-block-components-checkout-place-order-button:hover,
.wc-block-components-checkout-place-order-button:focus-visible {
	background-color: var(--tg-gelb-aktiv);
	border-color: var(--tg-gelb-aktiv);
	color: var(--tg-schwarz);
}

/* Zurück zum Warenkorb ist eine Nebenhandlung. */
.wc-block-components-checkout-return-to-cart-button {
	color: var(--tg-text);
	background-color: transparent;
}

/* Artikelzeilen */
.wc-block-cart-items__row,
.wc-block-components-order-summary-item {
	border-color: var(--tg-linie);
}

.wc-block-components-product-name {
	font-family: var(--tg-font-headline);
	font-weight: 400;
	color: var(--tg-text);
	text-transform: none;
}

.wc-block-components-product-metadata {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
	color: var(--tg-text-leise);
}

.wc-block-components-quantity-selector {
	border-radius: var(--tg-radius);
	border-color: var(--tg-dunkelgrau);
}

/* Das Zahlenfeld zwischen Minus und Plus ist nur 45 px breit (WooCommerce:
   107 px Rahmen, je 30 px für die Knöpfe). Die Feldregel aus Abschnitt 7 gibt
   jedem Zahlenfeld links und rechts 1 rem Polster – für die Ziffern blieben
   13 px, von „10“ war nur die 1 ganz zu sehen (Tobias, 24.09.2026).
   WooCommerce selbst setzt hier kein seitliches Polster, die Zahl steht mittig. */
.wc-block-components-quantity-selector input.wc-block-components-quantity-selector__input {
	padding-left: 0;
	padding-right: 0;
}

/* Gutscheinfeld */
.wc-block-components-totals-coupon-link {
	color: var(--tg-text);
}

/* Rahmen beim Klicken.

   WooCommerce hängt seine Fokusrahmen an `:focus` statt an `:focus-visible`.
   Der Unterschied: `:focus` greift auch beim Mausklick, `:focus-visible` nur
   bei Tastaturbedienung. Wer auf einen Knopf oder auf Plus/Minus klickt,
   bekommt deshalb einen Rahmen stehen, der dort nichts nützt – beim Knopf
   sogar einen blauen Ring (#0675C4), der in keiner CI-Palette steht.

   Hier wird der Rahmen für Mausbedienung abgeräumt und für die Tastatur durch
   unseren schwarzen ersetzt. Die Selektoren führen `body` mit, weil
   WooCommerce eine Variante mit `body:not(…)` mitliefert, die sonst gewinnt. */

body .wc-block-components-button:not(.is-link):focus:not(:focus-visible),
body .wc-block-components-quantity-selector .wc-block-components-quantity-selector__button:focus:not(:focus-visible),
body .wc-block-components-quantity-selector input.wc-block-components-quantity-selector__input:focus:not(:focus-visible),
body .wc-block-components-express-payment .wc-block-components-express-payment__event-buttons > li:focus:not(:focus-visible) {
	box-shadow: none;
	outline: none;
	border-color: transparent;
}

body .wc-block-components-button:not(.is-link):focus-visible,
body .wc-block-components-quantity-selector .wc-block-components-quantity-selector__button:focus-visible,
body .wc-block-components-quantity-selector input.wc-block-components-quantity-selector__input:focus-visible {
	box-shadow: none;
	outline: 2px solid var(--tg-schwarz);
	outline-offset: 2px;
}

/* Hinweisbänder: gerade Kanten, schwarze Schrift. */
.wc-block-components-notice-banner {
	border-radius: var(--tg-radius);
	color: var(--tg-text);
}

/* Leerer Warenkorb */
.wp-block-woocommerce-empty-cart-block .wc-block-components-title {
	font-size: var(--tg-fs-h2);
}

/* Abholstation (Shiptastic, „Nicht zuhause? Wähle eine Abholstation“):
   Der Block zeigt „Leider wurden keine Abholstationen in deiner Nähe
   gefunden.“, sobald keine Treffer vorliegen – also auch, bevor überhaupt
   gesucht wurde (Tobias, 25.09.2026). Die Meldung bleibt deshalb verborgen,
   solange das Postleitzahlfeld leer ist (WooCommerce setzt `is-active` erst
   bei Inhalt oder Fokus) und während die Suche läuft. Ergibt eine
   eingegebene Postleitzahl nichts, erscheint sie wie vorgesehen. */
.wc-shiptastic-pickup-location-delivery .pickup-location-search-fields:has(.wc-block-components-text-input:not(.is-active) > #pickup-location-search-postcode) + .pickup-location-search-results > p,
.wc-shiptastic-pickup-location-delivery .pickup-location-search-results.is-searching > p {
	display: none;
}

/* Summe und „Jetzt kaufen“ an der Kasse (Desktop): Germanized setzt beides
   in einen eigenen Block unter die Bestellübersicht (`.wc-gzd-checkout-submit`)
   und lässt ihn mit `position: sticky; top: 0` mitlaufen, damit Summe und
   Button beim Scrollen zusammen sichtbar bleiben. Unser Kopf klebt aber
   ebenfalls oben (Abschnitt 21, 104 px): Beim Scrollen zur AGB-Checkbox lag
   die Gesamtsumme darunter, sichtbar blieb nur der Button (Tobias,
   25.09.2026, mit Blick auf § 312j Abs. 2 BGB). Der Block klebt deshalb
   unter dem Kopf, mit Abstand. Dieselben Bedingungen wie beim Kopf: ab 48em
   Breite und 34em Höhe, mit Werkzeugleiste um deren Höhe tiefer. `body`
   davor, weil Germanizeds Regel gleich stark ist und als Blockstil oft erst
   nach diesem Stylesheet geladen wird. */
@media (min-width: 48em) and (min-height: 34em) {
	body .wc-gzd-checkout .is-large .wc-gzd-checkout-submit {
		top: calc(var(--tg-kopf-hoehe) + var(--tg-space-s));
	}

	body.admin-bar .wc-gzd-checkout .is-large .wc-gzd-checkout-submit {
		top: calc(var(--tg-kopf-hoehe) + 32px + var(--tg-space-s));
	}
}

@media screen and (min-width: 48em) and (max-width: 782px) and (min-height: 34em) {
	body.admin-bar .wc-gzd-checkout .is-large .wc-gzd-checkout-submit {
		top: calc(var(--tg-kopf-hoehe) + 46px + var(--tg-space-s));
	}
}


/* 15. Konto- und Anmeldebereich =============================================
   Der Bereich ist funktional, nicht werblich: klare Felder, ein eindeutiger
   Weg nach vorn, keine Ablenkung. */

/* --- Anmeldung, Passwort vergessen --------------------------------------- */

/* Formulare, die für sich allein auf der Seite stehen, brauchen keine volle
   Breite – schmal ist hier besser lesbar und wirkt weniger wie ein Hindernis. */
.woocommerce-form-login,
.woocommerce-ResetPassword,
.woocommerce-form-register {
	max-width: 30rem;
	border: 1px solid var(--tg-linie);
	border-radius: var(--tg-radius);
	padding: var(--tg-space-m);
	margin-left: 0;
}

.woocommerce-form-row {
	margin-bottom: var(--tg-space-s);
}

.woocommerce-form-row label,
.woocommerce-ResetPassword label {
	display: block;
	font-family: var(--tg-font-headline);
	font-weight: 400;
	margin-bottom: var(--tg-space-3xs);
}

.woocommerce-form-row .input-text,
.woocommerce-ResetPassword .input-text {
	width: 100%;
}

/* „Angemeldet bleiben": Kästchen und Text nebeneinander, mit ausreichender
   Trefferfläche. */
.woocommerce-form__label-for-checkbox {
	display: flex;
	align-items: flex-start;
	gap: var(--tg-space-2xs);
	font-family: var(--tg-font-text);
	font-weight: 400;
	cursor: pointer;
}

.woocommerce-form__input-checkbox {
	width: 1.25rem;
	height: 1.25rem;
	margin: 0.2rem 0 0;
	flex: 0 0 auto;
	accent-color: var(--tg-schwarz);
}

/* Auf diesen Seiten gibt es genau eine Handlung, und die bekommt die
   Handlungsfarbe – dieselbe Regel wie auf der Produktseite und in der Kasse:
   ein gelber Knopf je Ansicht, nie mehr. */
/* Der Selektor führt das Formular mit, weil Storefront `.form-row .button` auf
   `width: auto` setzt – zwei Klassen, also spezifischer als die Knopfklasse
   allein. */
.woocommerce-form-login .form-row .woocommerce-form-login__submit,
.woocommerce-ResetPassword .form-row .button,
.woocommerce-form-register .form-row .woocommerce-form-register__submit {
	background-color: var(--tg-gelb);
	border-color: var(--tg-gelb);
	color: var(--tg-schwarz);
	width: 100%;
	margin-top: var(--tg-space-2xs);
}

.woocommerce-form-login .form-row .woocommerce-form-login__submit:hover,
.woocommerce-form-login .form-row .woocommerce-form-login__submit:focus-visible,
.woocommerce-ResetPassword .form-row .button:hover,
.woocommerce-ResetPassword .form-row .button:focus-visible {
	background-color: var(--tg-gelb-aktiv);
	border-color: var(--tg-gelb-aktiv);
	color: var(--tg-schwarz);
}

.woocommerce-LostPassword {
	margin-top: var(--tg-space-s);
	margin-bottom: 0;
	font-size: var(--tg-fs-klein);
}


/* --- Kontobereich, angemeldet -------------------------------------------- */

@media (min-width: 48em) {
	.woocommerce-MyAccount-navigation {
		width: 22%;
		float: left;
		margin-right: 5%;
	}

	.woocommerce-MyAccount-content {
		width: 73%;
		float: right;
		margin-right: 0;
	}
}

.hentry .entry-content .woocommerce-MyAccount-navigation ul {
	margin-left: 0;
	padding-left: 0;
	border-top: 0;
}

.hentry .entry-content .woocommerce-MyAccount-navigation ul li {
	list-style: none;
	border-bottom: 1px solid var(--tg-linie);
}

.hentry .entry-content .woocommerce-MyAccount-navigation ul li.woocommerce-MyAccount-navigation-link a {
	display: block;
	padding: var(--tg-space-xs) 0;
	font-family: var(--tg-font-headline);
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	color: var(--tg-text);
	text-decoration: none;
	background-color: transparent;
	/* 44 px Trefferfläche */
	min-height: 2.75rem;
}

/* Die aktuelle Seite bekommt denselben schwarzen Balken wie in der
   Hauptnavigation – kein Gelb, das bleibt den Handlungen vorbehalten. */
.hentry .entry-content .woocommerce-MyAccount-navigation ul li.is-active {
	border-left: 3px solid var(--tg-schwarz);
}

.hentry .entry-content .woocommerce-MyAccount-navigation ul li.is-active a {
	padding-left: var(--tg-space-2xs);
}

.hentry .entry-content .woocommerce-MyAccount-navigation ul li a:hover {
	background-color: var(--tg-flaeche-info);
	padding-left: var(--tg-space-2xs);
}

.woocommerce-MyAccount-content h2 {
	font-size: var(--tg-fs-h2);
	font-weight: 700;
}

/* Bestell- und Adresstabellen */
.woocommerce-MyAccount-content table.woocommerce-orders-table,
.woocommerce-MyAccount-content table.shop_table {
	width: 100%;
	border-collapse: collapse;
	border: 0;
}

.woocommerce-MyAccount-content table.shop_table th,
.woocommerce-MyAccount-content table.shop_table td {
	border: 0;
	border-bottom: 1px solid var(--tg-linie);
	padding: var(--tg-space-xs) var(--tg-space-2xs);
	text-align: left;
}

.woocommerce-MyAccount-content table.shop_table th {
	font-family: var(--tg-font-headline);
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	font-size: var(--tg-fs-klein);
}

.woocommerce-MyAccount-content .woocommerce-Address {
	margin-bottom: var(--tg-space-m);
}

.woocommerce-MyAccount-content .woocommerce-Address-title h2,
.woocommerce-MyAccount-content .woocommerce-Address-title h3 {
	font-size: var(--tg-fs-h3);
}

/* Hinweis, wenn noch keine Bestellungen vorliegen */
.woocommerce-MyAccount-content .woocommerce-info,
.woocommerce-MyAccount-content .woocommerce-message {
	background-color: var(--tg-flaeche-info);
	color: var(--tg-text);
	border-top-color: var(--tg-schwarz);
	border-radius: var(--tg-radius);
}


/* 16. Symbole, Hinweise, Zahlungsarten ======================================
   Nachträge aus der ersten Durchsicht im Browser. */

/* --- Symbole in Kopfbereich ---------------------------------------------- */

.tegrafo-symbol {
	display: block;
	/* Etwas kleiner als zuvor: neben der 18-px-Navigation wirkten 24 px
	   breiter und schwerer als die Menüpunkte daneben. */
	width: 1.375rem;
	height: 1.375rem;
	flex: 0 0 auto;
}

.tegrafo-konto a {
	display: inline-flex;
	align-items: center;
	gap: var(--tg-space-2xs);
}

/* Warenkorb: Symbol mit Anzahl darauf, kein Preis. */
.tegrafo-warenkorb {
	display: inline-flex;
	align-items: center;
}

.tegrafo-warenkorb__symbol {
	position: relative;
	display: block;
}

.tegrafo-warenkorb__anzahl {
	position: absolute;
	top: -0.45rem;
	right: -0.55rem;
	min-width: 1.15rem;
	height: 1.15rem;
	padding: 0 0.2rem;
	box-sizing: border-box;
	border-radius: 999px;
	background-color: var(--tg-gelb);
	color: var(--tg-schwarz);
	border: 1px solid var(--tg-schwarz);
	font-family: var(--tg-font-headline);
	font-size: 0.6875rem;
	font-weight: 700;
	line-height: 1.05rem;
	text-align: center;
	letter-spacing: 0;
}

/* Storefront blendet den Warenkorb im Kopf unterhalb 768 px aus und zeigt
   stattdessen die feste Fußleiste – das bleibt so. */
.site-header-cart .cart-contents {
	padding: var(--tg-space-xs) 0;
}

/* Die Warenkorb-Vorschau, die beim Überfahren des Symbols aufklappt.

   Storefront gibt ihr `width: 100%` – bezogen auf die Liste, die den Link
   umgibt. Seit der Kopfbereich eine Flex-Zeile ist, ist diese Liste nur noch so
   breit wie das Symbol, also 22 px. Die Vorschau fiel dadurch auf Symbolbreite
   zusammen und setzte ihren Text mit einem Buchstaben pro Zeile.

   Sie bekommt deshalb eine eigene Breite und wird an der rechten Kante
   ausgerichtet, damit sie nicht aus dem Fenster läuft. */
.site-header-cart .widget_shopping_cart {
	width: 22rem;
	max-width: calc(100vw - 2 * var(--tg-space-m));
	background-color: var(--tg-weiss);
	border: 1px solid var(--tg-linie);
	padding: var(--tg-space-s);
	text-align: left;
}

.site-header-cart:hover .widget_shopping_cart,
.site-header-cart.focus .widget_shopping_cart,
.site-header-cart:focus-within .widget_shopping_cart {
	left: auto;
	right: 0;
}

.site-header-cart .widget_shopping_cart .total {
	font-family: var(--tg-font-headline);
	border-top: 1px solid var(--tg-linie);
	padding-top: var(--tg-space-2xs);
}

/* Storefront hängt an den Warenkorb-Link zusätzlich ein Symbol aus der
   Font-Awesome-Schrift. Zusammen mit unserem SVG standen zwei Warenkörbe
   untereinander. Nur im Kopfbereich abschalten – die feste Fußleiste auf
   Mobilgeräten bezieht ihre Symbole aus derselben Schrift und behält sie. */
.site-header-cart .cart-contents::after,
.site-header-cart .cart-contents::before {
	content: none;
}


/* --- Hinweisbänder -------------------------------------------------------
   WooCommerce liefert Blau (#3D9CD2), Grün (#0F834D) und Rot (#E2401C) mit
   weißer Schrift. Keine dieser Farben steht in der CI.

   Zuordnung:
   Information und Erfolgsmeldung → warmes Hellgrau, schwarze Schrift (11,9:1).
   Fehler → Amnesty Gelb mit schwarzem Rahmen. Das Handbuch weist Gelb genau
   diese Rolle zu: „Gelb ist die Farbe der Dringlichkeit" und dient dazu,
   „Aufmerksamkeit zu erzeugen" (S. 9, Pkt. 1–2). */

.woocommerce-message,
.woocommerce-info,
.woocommerce-error,
.woocommerce-noreviews,
p.no-comments {
	background-color: var(--tg-flaeche-info);
	color: var(--tg-text);
	border-top-color: var(--tg-schwarz);
	border-radius: var(--tg-radius);
}

.woocommerce-message a,
.woocommerce-info a,
.woocommerce-error a,
.woocommerce-noreviews a,
p.no-comments a {
	color: var(--tg-text);
}

.woocommerce-message a:hover,
.woocommerce-info a:hover,
.woocommerce-error a:hover {
	color: var(--tg-text);
	opacity: 1;
	background-color: var(--tg-weiss);
}

.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before,
.woocommerce-noreviews::before,
p.no-comments::before {
	color: var(--tg-schwarz);
}

.woocommerce-error {
	background-color: var(--tg-gelb);
	border-top-color: var(--tg-schwarz);
}

.woocommerce-message .button,
.woocommerce-info .button,
.woocommerce-error .button {
	color: var(--tg-text);
}

/* Beim Überfahren setzt Storefront den Verweis im Band („Warenkorb anzeigen“)
   wieder auf Weiß mit 70 % Deckkraft – `.woocommerce-error .button:hover`,
   drei Klassen und damit stärker als die Regel oben. Auf Gelb und Hellgrau war
   er dann nicht mehr lesbar (Tobias, 24.09.2026). Jetzt bleibt er schwarz und
   wird unterstrichen. `a.button` statt `.button`, damit die Regel Storefront
   unabhängig von der Ladereihenfolge schlägt. */
.woocommerce-message a.button:hover,
.woocommerce-info a.button:hover,
.woocommerce-error a.button:hover,
.woocommerce-message a.button:focus-visible,
.woocommerce-info a.button:focus-visible,
.woocommerce-error a.button:focus-visible {
	color: var(--tg-text);
	opacity: 1;
	text-decoration: underline;
}

/* „Es wurden keine Produkte gefunden" steht ohne Fläche im Inhalt –
   das ist kein Hinweisband, sondern eine Auskunft. */
.woocommerce-info.woocommerce-no-products-found {
	background-color: transparent;
	color: var(--tg-text);
	border: 0;
	padding-left: 0;
}


/* --- Zahlungsarten -------------------------------------------------------
   Die Symbole von WooCommerce sind mit rund 24 px so klein, dass Karten- und
   PayPal-Zeichen kaum auseinanderzuhalten sind. */

/* WooCommerce setzt die Höhe über
   `.wc-block-components-payment-method-icons .wc-block-components-payment-method-icon`
   – zwei Klassen. Der Selektor muss sie mitführen, sonst bleibt es bei 24 px. */
.wc-block-components-payment-method-icons .wc-block-components-payment-method-icon,
.wc-block-components-payment-method-icons img {
	height: 2.25rem;
	width: auto;
	max-height: none;
}

.wc-block-components-payment-method-icons {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--tg-space-2xs);
	justify-content: center;
}

/* Das Symbol neben der Bezeichnung einer einzelnen Zahlungsart in der Kasse. */
.wc-block-components-radio-control__label .wc-block-components-payment-method-icon,
.wc-block-components-payment-method-label--with-icon img {
	height: 1.75rem;
}

/* --- Zahlungsarten als Übersichtsseite -----------------------------------
   Der Shortcode [payment_methods_info] von Germanized gibt dieselbe
   `ul.payment_methods` aus wie die klassische Kasse: Aufzählungspunkte,
   Symbol hinter dem Namen, Storefronts Listenabstände. Auf einer eigenen
   Seite gelesen wirkte das wie eine unfertige Liste, nicht wie eine Auskunft
   darüber, womit man bezahlen kann.

   Gestaltet wird die Ausgabe des Shortcodes, nicht ein abgeschriebener
   Seiteninhalt: Kommt eine Zahlungsart hinzu oder fällt weg, ändert sich die
   Seite mit. Es bleibt bei einer Quelle.

   Alles hängt an `.tegrafo-zahlarten` – einer Gruppe, die der Seiteninhalt um
   den Shortcode legt. Die Kasse dieses Shops ist der Block-Checkout und bringt
   eigene Klassen mit; sollte je die klassische Kasse dazukommen, benutzt sie
   dieselbe `ul.payment_methods`, und ohne diese Klammer bekämen dort die
   Auswahlfelder das Kachelbild. */

.tegrafo-zahlarten ul.payment_methods.methods {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	/* auto-fit statt fester Spaltenzahl: Die Kacheln richten sich nach der
	   Zahl der aktiven Zahlungsarten, ohne dass hier eine Zahl gepflegt werden
	   muss. Unterhalb von rund 34 rem bleibt eine Spalte übrig. */
	grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
	gap: var(--tg-space-xs);
}

.tegrafo-zahlarten ul.payment_methods.methods > li {
	margin: 0;
	padding: var(--tg-space-s);
	border: 1px solid var(--tg-linie);
	background-color: var(--tg-flaeche);
}

.tegrafo-zahlarten ul.payment_methods.methods > li > label {
	display: flex;
	align-items: center;
	gap: var(--tg-space-xs);
	margin: 0;
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-h3);
	font-weight: 700;
	/* Hier gehört die Beschriftung zu keinem Eingabefeld. Kein Zeiger-Cursor,
	   der ein Klickziel verspricht, das es auf dieser Seite nicht gibt. */
	cursor: default;
}

/* Das Symbol steht in der Ausgabe hinter dem Namen und wird vorgezogen, damit
   alle Namen an derselben Kante beginnen. Feste Breite statt `width: auto`,
   weil die Mollie-Zeichen unterschiedliche Seitenverhältnisse haben – sonst
   rückt jeder Name anders weit ein. */
.tegrafo-zahlarten ul.payment_methods.methods > li > label img {
	order: -1;
	flex: 0 0 2.75rem;
	width: 2.75rem;
	height: 1.75rem;
	object-fit: contain;
	object-position: left center;
}

/* Vorkasse bringt kein Symbol mit. Name und Beschreibung stehen dann bündig
   an der Kastenkante. Bis 24.09.2026 hielt ein leerer Platzhalter in
   Symbolbreite alle Namen auf einer Linie; auf Tobias' Wunsch steht der Text
   jetzt links, die Beschreibung bekommt damit die volle Breite der Kachel. */

/* Die Beschreibung fluchtet mit dem Namen, nicht mit dem Symbol – eingerückt
   wird sie deshalb nur, wo ein Symbol davorsteht. */
.tegrafo-zahlarten ul.payment_methods.methods .payment_box {
	margin-top: var(--tg-space-2xs);
}

.tegrafo-zahlarten ul.payment_methods.methods > li:has(> label img) .payment_box {
	padding-left: calc(2.75rem + var(--tg-space-xs));
}

.tegrafo-zahlarten ul.payment_methods.methods .payment_box p {
	margin: 0;
	color: var(--tg-text-leise);
	font-size: var(--tg-fs-klein);
	line-height: var(--tg-lh-text);
}

/* „Karte“ liefert einen leeren Absatz mit. Wie bei den Germanized-Platzhaltern
   in Abschnitt 12 nicht ausblenden, sondern nur den Abstand nehmen – sobald
   dort eine Beschreibung hinterlegt wird, steht sie wie bei den anderen. */
.tegrafo-zahlarten ul.payment_methods.methods .payment_box:has(p:empty:only-child) {
	margin-top: 0;
}

/* Auf schmalen Geräten ist die Einrückung teurer als die gemeinsame Kante.
   Derselbe Selektor wie oben, sonst gewänne dessen Einrückung. */
@media (max-width: 30em) {
	.tegrafo-zahlarten ul.payment_methods.methods > li:has(> label img) .payment_box {
		padding-left: 0;
	}
}


/* 17. Feinschliff Kopfbereich und Seitenkopf ================================
   Nachträge aus der zweiten Durchsicht im Browser. */

/* --- Kopfzeile: Logo, Suche, Konto, Warenkorb ----------------------------
   Storefront stellt Logo und Suche nebeneinander, aber als Floats mit fester
   Prozentbreite und einem Außenabstand unten – die Suche saß dadurch rund
   20 px höher als das Logo. Als Flex-Zeile stehen alle auf gleicher Höhe.

   Konto und Warenkorb sind hierher umgezogen, aus der Navigationsleiste mit
   den Kategorien (Kundenwunsch: beides rechts oben, neben Logo und Suche,
   nicht in einer zweiten Zeile). Die Hook-Priorität dafür steht in
   kopfbereich.php; hier nur noch die sichtbare Reihenfolge über `order` –
   losgelöst von der Hook-Reihenfolge, die aus technischen Gründen anders
   sortiert ist (Kommentar dort). */

@media (min-width: 48em) {
	.site-header > .col-full {
		display: flex;
		align-items: center;
		gap: var(--tg-space-m);
	}

	/* Wie in der Navigationszeile: Storefronts Clearfix-Paar würde in einer
	   Flex-Zeile zu zwei zusätzlichen Elementen. */
	.site-header > .col-full::before,
	.site-header > .col-full::after {
		content: none;
	}

	.woocommerce-active .site-header .site-branding {
		width: auto;
		float: none;
		clear: none;
		margin: 0;
		flex: 1 1 auto;
		order: 1;
	}

	.woocommerce-active .site-header .site-search {
		width: auto;
		float: none;
		clear: none;
		margin: 0;
		flex: 0 0 auto;
		order: 2;
	}

	.tegrafo-konto {
		order: 3;
	}

	/* Storefront gibt dem Warenkorb serienmäßig 21,7 % Breite (für die alte
	   Navigationsleiste berechnet, drei Fünftel der Zeile). Hierher umgezogen
	   ist davon nur die Reihenfolge übernommen worden (Abschnitt 17 oben),
	   nicht das Zurücksetzen von Breite und Float – der Warenkorb-Behälter
	   blieb dadurch trotz sichtbar kleinem Symbol 21,7 % breit und schob den
	   sichtbaren Inhalt weit von der rechten Kante weg. Gleiche Korrektur wie
	   bei Branding und Suche oben. */
	.woocommerce-active .site-header .site-header-cart {
		width: auto;
		float: none;
		clear: none;
		margin: 0;
		flex: 0 0 auto;
		order: 4;
	}
}


/* --- Schriftlinien in der Navigationszeile -------------------------------
   Die Menüpunkte tragen 1,618 em Innenabstand oben und unten, der Konto-Link
   und der Warenkorb bisher nur 1 em. Bei mittiger Ausrichtung in der Flex-
   Zeile lagen die Schriftlinien von „Anmelden" und den Menüpunkten dadurch
   nicht auf einer Höhe. Gleicher Innenabstand und gleicher Schriftgrad – dann
   fluchten sie. */

.tegrafo-konto a {
	font-size: var(--tg-fs-navigation);
}

/* --- Konto und Warenkorb auf eine Linie ----------------------------------
   Beide hingen zuvor an ihrem eigenen Innenabstand (1,618em oben und unten),
   um auf die Höhe der Menüpunkte zu kommen. Das ging beim Warenkorb auf, beim
   Konto nicht: Dessen Behälter ist ein Block mit einem inline-flex-Link darin,
   und unter einem solchen Link bleibt die Unterlänge der Zeile stehen – gut
   acht Pixel, die den Behälter höher machen als seinen Inhalt. Das Symbol saß
   dadurch vier Pixel über dem Warenkorb daneben.

   Statt mit Innenabständen zu rechnen, richten beide sich jetzt einfach
   mittig aus. Die Zeile ist ohnehin ein Flex-Container mit `align-items:
   center`; ihre Höhe geben Logo und Suche vor, daran ändert das nichts.

   Nebenbei erledigt: 44 × 44 Pixel Trefferfläche für beide Symbole (WCAG
   2.5.5). Vorher waren sie 22 Pixel breit – ein halb so großes Ziel, wie es
   sein sollte. */

/* Nur ab 48em. Darunter gibt es die Flex-Zeile gar nicht, und vor allem:
   Auf Mobilgeräten sind Konto, Suche und Warenkorb im Kopf ausgeblendet –
   dort führt die feste Fußleiste zu allen dreien (eigene, unabhängige
   Elemente, siehe Hinweis bei der Mobil-Regel weiter unten).

   Ohne diese Eingrenzung holt das `display: flex` hier die Symbole zurück:
   Es ist spezifischer als das `display: none` der Mobilregel weiter unten und
   steht später im Stylesheet. Genau das ist am 17.09.2026 passiert – im Kopf
   standen dann Warenkorb und Konto untereinander, zusätzlich zur Fußleiste,
   die dasselbe anbietet. */
@media (min-width: 48em) {
	.site-header .tegrafo-konto,
	.site-header .site-header-cart,
	.site-header .site-header-cart > li {
		display: flex;
		align-items: center;
		padding-top: 0;
		padding-bottom: 0;
	}

	.site-header .tegrafo-konto > a,
	.site-header .site-header-cart .cart-contents {
		display: flex;
		align-items: center;
		justify-content: center;
		width: 2.75rem;
		height: 2.75rem;
		padding: 0;
	}

	/* „Produkte" (kopfbereich.php, seit 27.09.2026) ist ein Wort, kein
	   Symbol: In 44 px Breite liefe es links und rechts aus seinem Behälter
	   bis unter „Hilfe". Breite nach Inhalt, Höhe und Trefferfläche bleiben. */
	.site-header .tegrafo-produkte > a {
		width: auto;
	}
}


/* --- Suche als Symbol -----------------------------------------------------
   Kundenwunsch: Suchfeld als Symbol statt als durchgehend offenes Eingabefeld.
   Am echten Formular von storefront_product_search() geändert wird nichts –
   Feld, Absende-Knopf und das versteckte post_type-Feld bleiben, wie
   WooCommerce sie ausgibt, nur die Optik ändert sich. Damit funktioniert die
   Suche unverändert, auch ohne das CSS hier (z. B. im Block-Editor-Kontext).

   Die Lupe ist eine reine Bild-Maske über `currentColor` – dieselbe Technik
   wie in symbole.php für Konto/Warenkorb, nur als CSS-Hintergrund statt
   Inline-SVG, weil hier kein PHP beteiligt ist. Sie liegt über dem noch
   schmalen Feld und lässt Klicks durch (`pointer-events: none`), das Feld
   selbst ist die tatsächliche Trefferfläche.

   Kein eigener Fokusrahmen hier: Der globale Umgang mit :focus-visible
   (Abschnitt 8) reicht für ein Eingabefeld aus, ohne dass eine seiner Regeln
   hier wiederholt werden müsste.

   `#masthead` vorangestellt, wo es um Breite/Innenabstand des Feldes geht:
   WordPress liefert dafür serienmäßig eine Regel mit drei Klassen und zwei
   Elementen (`.widget_product_search form:not(.wp-block-search)
   input[type="search"]`, Spezifität 0-3-2) – ohne die ID gewinnt sie gegen
   `.site-search .search-field` (0-2-0) und das Feld bleibt trotz dieser
   Regeln in voller Breite offen. Eine ID schlägt jede Klassen-/Element-Zahl
   sofort, ganz ohne `!important`. */
#masthead .site-search .woocommerce-product-search {
	position: relative;
	display: flex;
	align-items: center;
}

#masthead .site-search .woocommerce-product-search::before {
	content: "";
	position: absolute;
	left: 0.7rem;
	/* Ohne `top` richtet sich ein absolut positioniertes Element nach seiner
	   statischen Position im Textfluss – bei einem Pseudo-Element vor dem
	   (unsichtbaren) Label meist knapp unterhalb der Zeilenmitte, nicht
	   exakt zentriert. Konto und Warenkorb daneben zentrieren sich über
	   Flexbox echt mittig; dasselbe hier über `top: 50%` plus Verschiebung
	   um die halbe eigene Höhe nachbilden. */
	top: 50%;
	transform: translateY(-50%);
	width: 1.125rem;
	height: 1.125rem;
	background-color: var(--tg-text);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E") center / contain no-repeat;
	        mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E") center / contain no-repeat;
	pointer-events: none;
}

/* box-sizing: border-box (globaler Reset) UND ein Innenabstand links, der für
   sich schon fast die ganze deklarierte Breite braucht, vertragen sich nicht:
   40 px Polster plus 2 px Rahmen lassen bei 44 px Breite (2,75rem) nur 2 px
   für den Inhalt – der Browser weicht dann auf die tatsächlich benötigte
   Breite aus (Polster + Rahmen, Inhalt auf 0 gestaucht) und das Feld wurde
   rund 66 statt 44 px breit. Sichtbar u. a. daran, dass der Abstand zwischen
   Suche, Konto und Warenkorb ungleichmäßig wirkte.

   Der Innenabstand wird deshalb erst beim Fokussieren gesetzt, wenn auch die
   Breite auf 14rem wächst und Platz dafür da ist. Im eingeklappten Zustand
   braucht es ihn nicht: Dort steht kein Text, nur das Symbol – und das liegt
   ohnehin absolut positioniert über dem Feld (Regel oben), unabhängig vom
   Innenabstand. */
#masthead .site-search .search-field {
	width: 2.75rem;
	height: 2.75rem;
	padding: 0;
	border: 1px solid transparent;
	border-radius: var(--tg-radius-knopf);
	background-color: transparent;
	/* Eingeklappt ohne Innenabstand (siehe Kommentar oben) hätte der
	   Platzhaltertext „Produkte suchen …" keinen Platz mehr neben der Lupe
	   und läge über ihr – deshalb hier unsichtbar, bis das Feld fokussiert
	   ist. Am Formular selbst ändert das nichts: Der zugängliche Name kommt
	   ohnehin vom `<label class="screen-reader-text">`, das WooCommerce
	   mitliefert, nicht vom Platzhalter. */
	color: transparent;
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-text);
	transition: width 200ms ease-out, padding-left 200ms ease-out, border-color 200ms ease-out, background-color 200ms ease-out, color 200ms ease-out;
}

#masthead .site-search .search-field:focus {
	width: 14rem;
	padding-left: 2.5rem;
	border-color: var(--tg-linie-kraeftig);
	background-color: var(--tg-weiss);
	color: var(--tg-text);
	caret-color: var(--tg-text);
}

/* `::placeholder` braucht eine eigene Regel: Abschnitt 7 setzt seine Farbe
   ausdrücklich (`input::placeholder { color: var(--tg-text-leise) }`), das
   erbt nicht einfach die `color` des Feldes von oben – ohne diese Zeile
   bliebe der Platzhalter auch eingeklappt sichtbar und läge weiter über der
   Lupe. */
#masthead .site-search .search-field::placeholder {
	color: transparent;
}

#masthead .site-search .search-field:focus::placeholder {
	color: var(--tg-text-leise);
}

/* Der Absende-Knopf bleibt erreichbar (Tastatur, assistive Technik), aber
   unsichtbar: Die Eingabe sendet das Formular schon über die Eingabetaste,
   ein zweites sichtbares Element neben dem ohnehin schon als Symbol
   gestalteten Feld wäre doppelt. Maße wie screen-reader-text (Abschnitt 8),
   nicht display:none – sonst verschwände der Knopf auch aus der Tab-Reihenfolge. */
#masthead .site-search .woocommerce-product-search button[type="submit"] {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}


/* --- Luft um den Seitentitel --------------------------------------------
   Betraf alle Seiten: zwischen Brotkrumenpfad und Überschrift lagen rund
   150 px, darunter noch einmal 100 px. Auf Warenkorb und Kasse kam ein
   Sonderfall dazu – Storefront gibt der Überschrift dort 5,997 em
   Innenabstand nach unten und zentriert sie, was der Vorgabe „immer
   linksbündig" widerspricht (Handbuch S. 16, Pkt. 6). */

/* Der Brotkrumenpfad steckt in einem eigenen Streifen, der allein 3,7 em
   Außenabstand nach unten mitbringt – gut 63 px, bevor der Inhalt überhaupt
   beginnt. */
.storefront-breadcrumb {
	margin-bottom: 0;
	padding: var(--tg-space-xs) 0;
}

.woocommerce-breadcrumb {
	margin-bottom: 0;
}

#content.site-content {
	padding-top: var(--tg-space-xs);
}

@media (min-width: 48em) {
	#content.site-content {
		padding-top: var(--tg-space-s);
	}
}

.hentry .entry-header {
	margin-bottom: var(--tg-space-s);
	padding-bottom: 0;
	border-bottom: 0;
}

.storefront-full-width-content.woocommerce-cart .entry-header,
.storefront-full-width-content.woocommerce-checkout .entry-header,
.storefront-full-width-content.woocommerce-account .entry-header {
	text-align: left;
	padding: 0;
	margin-bottom: var(--tg-space-s);
}

.woocommerce-products-header {
	/* Seit der Bereichsumschalter im Kopf sitzt (bereiche.php), folgt der
	   Seitentitel direkt auf dessen Trennlinie – mit dem üblichen
	   Innenabstand des Inhaltsbereichs allein (Abschnitt 3) wirkte das mit
	   rund 25 px Abstand knapp. Etwas mehr Luft hier, statt am gemeinsamen
	   Innenabstand zu drehen, der auch auf jeder anderen Seite gilt. */
	margin-top: var(--tg-space-s);
	margin-bottom: var(--tg-space-s);
}

.entry-title,
.woocommerce-products-header__title {
	margin-bottom: 0;
}


/* 18. Social Media im Fußbereich ============================================
   Reine Verweise, keine eingebetteten Inhalte – siehe inc/socialmedia.php. */

.tegrafo-social {
	margin-top: var(--tg-space-m);
	padding-top: var(--tg-space-s);
	border-top: 1px solid var(--tg-dunkelgrau);
}

.tegrafo-social__titel {
	font-size: var(--tg-fs-h3);
	color: var(--tg-weiss);
	margin-bottom: var(--tg-space-xs);
}

.tegrafo-social__liste {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: var(--tg-space-2xs);
}

/* Weiß auf Schwarz, 21:1. Die Fläche ist 44 × 44 px groß – Mindestmaß für
   Tippziele nach WCAG 2.5.5 –, das Symbol selbst 24 px. */
.tegrafo-social__verweis {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 2.75rem;
	height: 2.75rem;
	border-radius: var(--tg-radius-knopf);
	color: var(--tg-weiss);
	background-color: transparent;
	text-decoration: none;
	transition: background-color 180ms ease-out, color 180ms ease-out;
}

/* Beim Überfahren dreht sich das Verhältnis um: weiße Fläche, schwarzes
   Symbol. Das bleibt bei der Logik des Handbuchs (Schwarz auf Weiß bzw. Weiß
   auf Schwarz) und hält Gelb weiterhin den Handlungen vor. */
/* Beim Überfahren dreht sich das Verhältnis um: weiße Fläche, schwarzes
   Symbol.

   Der Selektor sieht umständlicher aus, als er müsste. Storefront färbt alle
   Verweise im Fußbereich über den Customizer ein:
   `.site-footer a:not(.button):not(.components-button) { color: … }`
   (class-storefront-customizer.php, Zeile 1011). Jedes `:not()` zählt für die
   Spezifität mit, macht zusammen mit `.site-footer` drei Klassen und ein
   Element – und schlägt damit eine schlichte Hover-Regel aus zwei Klassen.
   Der Hintergrund wurde weiß, die Symbolfarbe blieb es: weiß auf weiß, das
   Symbol verschwand. Mit gleichgezogenem Selektor greift die Regel. */
.site-footer a.tegrafo-social__verweis:not(.button):hover,
.site-footer a.tegrafo-social__verweis:not(.button):focus-visible {
	background-color: var(--tg-weiss);
	color: var(--tg-schwarz);
	text-decoration: none;
}

.site-footer .tegrafo-social__verweis:focus-visible {
	outline: 2px solid var(--tg-weiss);
	outline-offset: 2px;
}

.tegrafo-social__symbol {
	display: block;
	width: 1.5rem;
	height: 1.5rem;
}


/* 19. Kennzeichnung Shop, Warenkorb-Typografie, Versandhinweis ==============
   Nachträge aus der dritten Durchsicht. */

/* --- „Shop" neben dem Logo ----------------------------------------------- */

/* Der Selektor führt `.site-header` mit, weil Storefront dort
   `.site-header .site-branding { display: block }` setzt – zwei Klassen und
   damit spezifischer als die Klasse allein. Ohne das blieb der Zusatz ein
   Blockelement unter dem Logo statt daneben. */
.site-header .site-branding {
	display: flex;
	align-items: center;
	gap: var(--tg-logo-schutzzone);
}

/* Auf dem Telefon reichte der Platz nicht: Storefront hält rechts 120 px für
   seinen Menüknopf frei (`.site-branding { width: calc(100% - 120px) }`), den
   es hier nicht gibt – dort sitzt nur der ☰ des Bereichsumschalters (46 px,
   Abschnitt 23). Logo und Zusatz bekamen bei 375 px zusammen 160 px, das Logo
   wurde gestaucht (Tobias, 25.09.2026).

   Jetzt reicht die Fläche bis 18 px vor den ☰ (`100% - 2.5rem`), und die
   Logohöhe folgt der Breite: Logo, Schutzzone, Abstand und „Merchshop“
   brauchen zusammen rund das 5,85-Fache der Logohöhe, frei sind rund
   Breite − 114 px (40 px Rand links, ☰ samt Rand und Luft rechts). Geteilt
   durch 6 bleibt etwas Reserve. Gemessen: 414 px → 163 × 48, 375 px →
   137 × 40, 320 px → 104 × 30, jeweils im richtigen Seitenverhältnis. Der
   Zusatz skaliert über `--tg-logo-h` mit und bricht nicht um. Reicht es
   einmal doch nicht (etwa schmales Desktop-Fenster mit Scrollbalken), gibt
   das Logo nach – proportional, siehe `img` in Abschnitt 9.

   Neu gerechnet am 27.09.2026 für das Logo aus dem Brand Hub und „SHOP“:
   Logo 2,86 h, Schutzzone und Abstand je 0,26 h, Zusatz 0,26 h Innenabstand
   plus 2 px Strich plus rund 1,03 h für „SHOP“ – zusammen rund 4,7 h statt
   5,85 h. Frei sind rund Breite − 135 px (Rand links, Reserve für den
   archivierten ☰ rechts). Geteilt durch 4,8 bleibt Reserve. Gemessen siehe
   Protokoll. Für „MATERIALSHOP“ (rund 3,2 h statt 1,03 h) reicht das auf
   320 px nicht mehr, dann muss die Formel je Kanal gelten. */
@media (max-width: 47.99em) {
	.site-header .site-branding {
		width: calc(100% - 2.5rem);
		--tg-logo-h: clamp(32px, calc((100vw - 140px) / 4.8), 48px);
	}

	.site-branding .tegrafo-logo {
		flex: 0 1 auto;
		min-width: 0;
	}

	.tegrafo-kopf-zusatz {
		flex-shrink: 0;
		white-space: nowrap;
	}
}

/* Der Zusatz steht außerhalb der Schutzzone des Logos und ist durch eine Linie
   abgesetzt – er gehört sichtbar nicht zur Wort-Bild-Marke. Schriftgrad an der
   Logohöhe orientiert (bleibt so bei jedem Breakpoint im Verhältnis).

   Seit dem 27.09.2026 nach Vorgabe von AMNESTY (25.09., Punkt 5): schwarzer
   Strich, „SHOP“ in Versalien, Roboto fett. Bis dahin „Merchshop“ bzw.
   „Shop“ in gemischter Schreibung, Roboto Condensed normal, mit hellgrauem
   Strich. 0,37 × Logohöhe ergibt bei Roboto (Versalhöhe 0,711 em) genau die
   Versalhöhe von „INTERNATIONAL“ (0,26 ×) – „SHOP“ steht so auf derselben
   Höhe wie die untere Zeile des Logos, ohne es zu überragen. Der Strich ist
   2 px breit, 1 px wirkte neben der fetten Schrift wie eine Haarlinie. */
.tegrafo-kopf-zusatz {
	font-family: var(--tg-font-text);
	font-size: calc(var(--tg-logo-h) * 0.37);
	font-weight: 700;
	line-height: 1;
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	color: var(--tg-text);
	padding-left: var(--tg-logo-schutzzone);
	border-left: 2px solid var(--tg-schwarz);
	/* Die Trennlinie läuft genau über die Höhe des Logos – nicht über die des
	   Schriftzugs, sonst wirkt sie wie ein zufälliger Strich. */
	align-self: center;
	display: flex;
	align-items: center;
	min-height: var(--tg-logo-h);
}


/* --- Warenkorb und Kasse: lesbarer ---------------------------------------
   Die Blöcke setzen fast alle Texte auf `--wp--preset--font-size--small` mit
   14 px als Rückfallwert – Artikelnamen, Tabellenköpfe, Summenzeilen,
   Pflichtangaben. In einem Bestellvorgang, in dem Namen, Mengen und Beträge
   geprüft werden, ist das zu klein.

   Statt gegen jede einzelne Regel anzuschreiben, wird die Variable selbst
   angehoben – aber nur innerhalb der beiden Blöcke, damit die Voreinstellung
   „Klein" im übrigen Seiteninhalt unverändert bleibt. */

.wp-block-woocommerce-cart,
.wp-block-woocommerce-checkout {
	--wp--preset--font-size--small: 1rem;
}

/* Versalien bleiben den Überschriften der Seite vorbehalten, nicht den
   Bausteinen darin. Die Selektoren spiegeln die von WooCommerce, sonst
   gewinnen deren zwei bis drei Klassen. */
.wc-block-cart .wc-block-cart__totals-title,
.wp-block-woocommerce-cart-order-summary-heading-block,
.wp-block-woocommerce-checkout-order-summary-heading-block,
.wc-block-components-checkout-order-summary__title,
.wc-block-components-checkout-order-summary__title-text,
.wc-block-components-title,
.wc-block-components-checkout-step__title,
.wc-block-components-totals-item__label,
table.wc-block-cart-items .wc-block-cart-items__header,
table.wc-block-cart-items .wc-block-cart-items__header th {
	text-transform: none;
	letter-spacing: 0;
}

/* Überschrift der Summenspalte: stand auf 14 px, also der kleinsten Schrift
   der Seite – ausgerechnet in der Spalte, in der der Betrag geprüft wird. */
.wc-block-cart .wc-block-cart__totals-title,
.wp-block-woocommerce-cart-order-summary-heading-block,
.wp-block-woocommerce-checkout-order-summary-heading-block,
.wc-block-components-checkout-order-summary__title,
.wc-block-components-title,
.wc-block-components-checkout-step__title {
	font-size: var(--tg-fs-h3);
}

/* Artikelname: die wichtigste Angabe der Zeile. */
table.wc-block-cart-items .wc-block-cart-items__row .wc-block-components-product-name,
.wp-block-woocommerce-checkout-order-summary-block .wc-block-components-product-name {
	font-size: var(--tg-fs-h3);
	line-height: 1.3;
}

/* Tabellenköpfe und Summenzeilen auf Fließtextgröße. */
table.wc-block-cart-items .wc-block-cart-items__header,
table.wc-block-cart-items .wc-block-cart-items__header th,
.wc-block-components-totals-item__label,
.wc-block-components-totals-item__value {
	font-size: var(--tg-fs-text);
}

/* Die Pflichtangaben bleiben in der Marginalien-Größe – aber nicht kleiner. */
.wc-block-components-totals-footer-item-tax,
.wc-block-components-totals-item__description,
.wc-block-components-totals-shipping-address-summary,
.wc-block-components-product-metadata {
	font-size: var(--tg-fs-klein);
}


/* Der Versandhinweis unter dem Warenkorb ist am 23.09.2026 entfernt worden
   (inc/warenkorb.php erklärt, warum). Seine Regeln standen hier – sie sind
   mit ihm zusammen raus, damit keine Gestaltung ohne Gegenstück übrig
   bleibt. */


/* 20. Variantenauswahl als Schaltflächen ====================================
   Statt des Aufklappmenüs stehen alle Größen und Farben nebeneinander. Was
   nicht lieferbar ist, ist durchgestrichen – sichtbar, bevor man klickt.

   Das Auswahlfeld von WooCommerce bleibt im Formular und bleibt die Quelle der
   Wahrheit; die Schaltflächen bedienen es nur (siehe inc/variantenauswahl.php).
   Ausgeblendet wird es erst, wenn das Skript die Gruppe tatsächlich aufgebaut
   hat – ohne JavaScript bleibt das Menü stehen und funktioniert.
   ========================================================================== */

.single-product div.product table.variations select.tegrafo-varianten-ersetzt {
	display: none;
}

.tegrafo-varianten {
	display: flex;
	flex-wrap: wrap;
	/* 6 px statt 8: Mit neun Größen (XS–5XL, seit 30.09.2026) sollen alle
	   Knöpfe in der Spalte (43 %, ~520 px) in eine Zeile passen. */
	gap: 0.375rem;
	margin-top: var(--tg-space-3xs);
}

/* Storefronts Clearfix macht aus ::before/::after sonst zwei Flex-Kinder und
   reißt eine Lücke in die erste Zeile. */
.tegrafo-varianten::before,
.tegrafo-varianten::after {
	content: none;
}

.tegrafo-varianten__wert {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	/* 44 px Mindestmaß in beide Richtungen – Treffergröße nach WCAG 2.5.5.
	   Die Größenkürzel sind kurz („S"), ohne Mindestbreite entstünden
	   fingernagelgroße Ziele. Bis 30.09.2026 waren es 52 px Breite und 16 px
	   Innenabstand; mit neun Größen brach die Reihe dann um (AMNESTY/Tobias).
	   Jetzt 44 px und 10 px: neun Knöpfe brauchen rund 455 px. */
	min-width: 2.75rem;
	min-height: 44px;
	padding: 0 0.625rem;

	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-button);
	font-weight: 400;
	line-height: 1.2;

	/* Keine Versalien: Größen wie „XS" und „3XL" sind ohnehin groß
	   geschrieben, und bei Farbnamen kostet es nur Lesbarkeit. */
	text-transform: none;
	letter-spacing: 0;
	white-space: nowrap;

	color: var(--tg-text);
	background-color: var(--tg-flaeche);
	border: 1px solid var(--tg-linie-kraeftig);
	border-radius: var(--tg-radius-knopf);
	cursor: pointer;

	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

/* Beim Überfahren neutral grau statt gelb. Gelb ist die Handlungsfarbe des
   Warenkorb-Knopfs; auf den Größenknöpfen daneben konkurriert es damit und
   lässt jeden überfahrenen Wert wie den gewählten aussehen. */
.tegrafo-varianten__wert:hover {
	background-color: var(--tg-hellgrau); /* Schwarz darauf: 11,9:1 */
	border-color: var(--tg-schwarz);
	color: var(--tg-schwarz);
}

/* Der gewählte Wert: schwarz gefüllt. Gelb ist hier bewusst nicht die
   Auszeichnung des Zustands – es bleibt der Handlungsebene vorbehalten
   (Handbuch S. 9, Pkt. 3), also dem Warenkorb-Knopf darunter. */
.tegrafo-varianten__wert[aria-checked="true"] {
	background-color: var(--tg-schwarz);
	border-color: var(--tg-schwarz);
	color: var(--tg-weiss);
}

/* Der gewählte Wert ändert sich beim Überfahren nicht – er ist bereits im
   Zielzustand, ein Wechsel würde nur Bewegung ohne Aussage erzeugen. */
.tegrafo-varianten__wert[aria-checked="true"]:hover {
	background-color: var(--tg-schwarz);
	color: var(--tg-weiss);
}

/* Nicht lieferbar: durchgestrichen und zurückgenommen, aber weiter bedienbar.
   Der Durchstrich allein trägt die Aussage nicht – im Markup steht zusätzlich
   „(zurzeit nicht lieferbar)" für Screenreader.
   Dunkelgrau auf Weiß erreicht 5,2:1 und damit WCAG AA; das Hellgrau der
   übrigen Linien käme hier nur auf 1,8:1 und wäre als Rahmen eines
   Bedienelements zu schwach (WCAG 1.4.11). */
.tegrafo-varianten__wert--vergriffen {
	position: relative;
	color: var(--tg-text-leise);
	border-color: var(--tg-text-leise);

	/* Kein `text-decoration: line-through`: Dieser Strich ist nur so breit wie
	   der Text selbst – bei „S" oder „M" sind das neun Pixel, die man leicht
	   übersieht. Stattdessen läuft die Linie unten über die ganze Kachel. */
	text-decoration: none;
}

/* Der Durchstrich: eine kräftige Linie quer über die Kachel, in der Farbe des
   Textes (`currentColor`), damit sie beim Überfahren mit dunkler wird. Die
   Aussage trägt sie nicht allein – dafür steht „(zurzeit nicht lieferbar)"
   als Text im Markup.

   `display: block` ist hier Pflicht, nicht Gewohnheit: Chrome blendet
   ::before/::after auf `<button>` grundsätzlich aus (UA-Stylesheet
   `button::after { display: none }`). Bei einem `<div>` genügt `position:
   absolute`, damit die Anzeige auf `block` springt – gegen ein gesetztes
   `display: none` hilft das aber nicht, weil es gar kein Element erzeugt.
   Ohne diese Zeile fehlt der Strich in Chrome ersatzlos, ohne Fehlermeldung. */
.tegrafo-varianten__wert--vergriffen::after {
	content: "";
	display: block;
	position: absolute;
	left: 6px;
	right: 6px;
	top: calc(50% - 1px);
	height: 2px;
	background-color: currentColor;
	pointer-events: none;
}

.tegrafo-varianten__wert--vergriffen:hover {
	background-color: var(--tg-flaeche);
	color: var(--tg-schwarz);
	border-color: var(--tg-schwarz);
}

/* Gesperrt ist etwas anderes als vergriffen: Diesen Wert gibt es in der
   gewählten Kombination gar nicht. WooCommerce setzt das selbst. */
.tegrafo-varianten__wert:disabled {
	color: var(--tg-grau);
	border-color: var(--tg-linie);
	background-color: var(--tg-flaeche);
	cursor: not-allowed;
}

.tegrafo-varianten__wert:disabled:hover {
	background-color: var(--tg-flaeche);
}

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


/* 21. Mitlaufender Kopfbereich, Fußbereich am unteren Rand =================
   Zwei Dinge, die zusammengehören, weil beide am Seitengerüst ansetzen:
   Der Kopf bleibt beim Scrollen stehen, und der Fuß sitzt auch dann am
   unteren Rand, wenn eine Seite kaum Inhalt hat.
   ========================================================================== */

/* --- Voraussetzung für `position: sticky` --------------------------------
   Storefront setzt `overflow-x: hidden` auf `body` und `.site`
   (style.css, Zeile 31). Sobald eine Achse auf `hidden` steht, berechnet der
   Browser die andere zu `auto` – beide Elemente werden damit zu
   Scroll-Containern. Ein `sticky` Element klebt immer am nächsten
   scrollenden Vorfahren; das wäre hier `.site`, und die scrollt selbst nie.
   Der Kopf bliebe einfach stehen, wo er ist, ohne jede Fehlermeldung.

   `clip` schneidet genauso ab, erzeugt aber keinen Scroll-Container. Kennt
   ein Browser den Wert nicht, fällt die Zeile weg und Storefronts `hidden`
   bleibt stehen – dann klebt der Kopf nicht, aber nichts ist kaputt. */
body,
.site {
	overflow-x: clip;
}


/* --- Fußbereich am unteren Rand halten ------------------------------------
   Bei kurzen Seiten – Danke-Seite, leerer Warenkorb, 404 – endete der Fuß
   bisher mitten im Bild, darunter weißer Raum bis zum Fensterrand.

   `#page` hat genau drei Kinder: Kopf, Inhalt, Fuß. Der Inhalt darf wachsen,
   der Rest behält seine Höhe. */
.site {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
}

@supports (min-height: 100dvh) {
	/* Auf Mobilgeräten ist 100vh die Höhe *ohne* eingeblendete Adressleiste –
	   die Seite ragt dadurch unter den Rand. `dvh` misst, was wirklich zu
	   sehen ist. */
	.site {
		min-height: 100dvh;
	}
}

.site > .site-content {
	flex: 1 0 auto;
}

.site > .site-footer {
	margin-top: auto;
}

/* Storefronts Clearfix würde sonst zwei leere Flex-Kinder erzeugen und eine
   Lücke zwischen Kopf und Inhalt aufreißen. */
.site::before,
.site::after {
	content: none;
}


/* --- Kopfbereich mitlaufend ---------------------------------------------- */

/* Höhe des mitlaufenden Kopfs (die Logo-Zeile), gemessen am 25.09.2026:
   104 px in allen Breiten ab 48em. Gebraucht von allem, was darunter
   kleben soll – bisher Summe und „Jetzt kaufen“ an der Kasse (Abschnitt 14).
   Ändert sich der Kopf, hier nachmessen. */
:root {
	--tg-kopf-hoehe: 104px;
}

.site-header {
	position: sticky;
	top: 0;
	/* z-index hat Storefront bereits auf 999 – hier nur festgehalten, damit
	   der Kopf sicher über dem mitscrollenden Inhalt liegt. */
	z-index: 999;
}

/* Unter der Werkzeugleiste von WordPress einhängen, sonst verdeckt sie den
   oberen Rand des Kopfes. */
.admin-bar .site-header {
	top: 32px;
}

@media screen and (max-width: 782px) {
	.admin-bar .site-header {
		top: 46px;
	}
}

/* Sprungziele nicht unter den Kopf rutschen lassen: „Zum Inhalt springen",
   Anker in Texten, das Zurückspringen nach dem Absenden eines Formulars. */
html {
	scroll-padding-top: 13rem;
}

@media (max-width: 66.4989em) {
	html {
		scroll-padding-top: 8rem;
	}
}

/* Geöffnetes Menü: Ist der Kopf höher als das Fenster, klebt er zwar oben,
   aber der untere Teil ist dann nicht mehr erreichbar – man käme an die
   unteren Menüpunkte nicht heran. Solange das Menü offen ist, läuft der Kopf
   deshalb normal mit.

   Seit der Kopf auf Mobilgeräten ohnehin nicht mehr klebt (siehe unten), ist
   das nur noch ein Rückhalt – die Klapp-Navigation gibt es erst unterhalb von
   1064 px. Die Regel bleibt trotzdem stehen: Wer die Grenze unten verschiebt,
   soll sich nicht erst wieder an dieses Problem erinnern müssen. */
.site-header:has(.main-navigation.toggled) {
	position: static;
}

/* Sehr flache Fenster – Handy im Querformat, kleine Notebooks: Ein Kopf von
   gut 200 px nähme dort die halbe Anzeige ein. Da bleibt er lieber oben. */
@media (max-height: 34em) {
	.site-header {
		position: static;
	}
}

/* Auf Mobilgeräten läuft der Kopf gar nicht erst mit.

   Am Desktop kostet er 208 px von rund 1300 px Fensterhöhe – 16 %, vertretbar.
   Auf einem Handy steht demselben Kopf aber nur ein Bruchteil der Höhe
   gegenüber, und vom eigentlichen Inhalt bliebe zu wenig übrig. Der Gewinn –
   Menü und Warenkorb immer in Reichweite – wiegt das dort nicht auf.

   Die Grenze ist dieselbe, die dieses Stylesheet durchgehend für „mobil"
   verwendet (48em = 768 px). Zwischen 768 und 1064 px klebt der Kopf also
   weiterhin, obwohl die Navigation dort schon zugeklappt ist; falls er auch
   auf Tablets weichen soll, ist es diese eine Zahl.

   `scroll-padding-top` fällt hier mit weg: Ohne mitlaufenden Kopf gibt es
   nichts, wovor ein Sprungziel ausweichen müsste. */
@media (max-width: 47.99em) {
	.site-header {
		position: static;
	}

	html {
		scroll-padding-top: 0;
	}
}

@media (prefers-reduced-motion: reduce) {
	html {
		scroll-behavior: auto;
	}
}


/* 22. Startseite: Bereichsauswahl ===========================================
   Drei Kacheln, aber nur eine davon (Merch) ist heute aktiv. Die aktive
   Kachel trägt den einzigen gelben Knopf der Seite (Handbuch S. 9: Gelb
   sparsam einsetzen) – die beiden künftigen Bereiche stehen in Hellgrau, dem
   Infokasten-Ton aus den Design-Tokens, statt in einer erfundenen Farbe. */

.tegrafo-bereiche {
	/* Grenzt direkt an .tegrafo-vertrauen (beide auf der Startseite ohne
	   Element dazwischen) – beide Ränder fallen im normalen Fluss zusammen
	   (CSS-Randüberlappung, es gilt der größere von beiden, nicht die
	   Summe). Deshalb hier auf denselben kleineren Wert wie dort, sonst
	   hätte das Verringern des anderen Randes allein nichts bewirkt. */
	margin-bottom: var(--tg-space-s);
}

.tegrafo-bereiche__kopf {
	margin-bottom: var(--tg-space-m);
}

.tegrafo-bereiche__kopf h2 {
	font-size: var(--tg-fs-h2);
	margin: 0 0 var(--tg-space-2xs);
}

.tegrafo-bereiche__kopf p {
	color: var(--tg-text-leise);
	max-width: var(--tg-textbreite);
	margin: 0;
}

.tegrafo-bereiche__reihe {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--tg-space-s);
}

@media (max-width: 61.99em) {
	.tegrafo-bereiche__reihe {
		grid-template-columns: 1fr;
	}
}

.tegrafo-bereich-karte {
	display: flex;
	flex-direction: column;
	gap: var(--tg-space-2xs);
	padding: var(--tg-space-s);
	border: 1px solid var(--tg-linie-kraeftig);
	border-radius: var(--tg-radius);
}

.tegrafo-bereich-karte__bild {
	display: block;
	width: 100%;
	height: 11rem;
	object-fit: contain;
	margin-bottom: var(--tg-space-2xs);
}

/* Platzhalter-Bereiche: Bild entsättigt und abgedunkelt, dasselbe Signal wie
   beim gesperrten Knopf darunter – „zu sehen, aber noch nicht dran". */
.tegrafo-bereich-karte--platzhalter .tegrafo-bereich-karte__bild {
	filter: grayscale(1) opacity(0.7);
}

.tegrafo-bereich-karte__titel {
	font-size: var(--tg-fs-h3);
	margin: 0;
}

.tegrafo-bereich-karte__text {
	color: var(--tg-text-leise);
	font-size: var(--tg-fs-text);
	flex: 1;
	margin: 0;
}

.tegrafo-bereich-karte__knopf {
	align-self: flex-start;
	margin-top: var(--tg-space-2xs);
}

/* Platzhalter: Hellgrau statt einer erfundenen zweiten Farbe – derselbe Ton,
   den die Design-Tokens schon für Infokästen vorsehen (--tg-flaeche-info).
   Rahmen so dünn wie bei der aktiven Karte, nur heller statt gestrichelt –
   die Fläche selbst trägt den Unterschied, nicht die Linienart. */
.tegrafo-bereich-karte--platzhalter {
	background-color: var(--tg-flaeche-info);
	border: 1px solid var(--tg-grau);
}

/* Sieht wie ein Knopf aus, ist aber keiner: kein Link, kein Zeiger, kein
   Tastaturfokus – die Fläche ist noch nicht bedienbar. */
.tegrafo-bereich-karte__folgt {
	align-self: flex-start;
	margin-top: var(--tg-space-2xs);
	padding: var(--tg-space-xs) var(--tg-space-s);
	border: 2px solid var(--tg-grau);
	border-radius: var(--tg-radius-knopf);
	color: var(--tg-text-leise);
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-button);
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	cursor: default;
}


/* 23. Bereichsumschalter (alle Seiten außer Startseite) =====================
   Ersetzt vorerst die Brotkrumen an derselben Stelle – das Handbuch macht zu
   Brotkrumen keine Vorgabe, hier geht es nur um Orientierung.

   Optik nach dem Amnesty-Entwurf für die Merch-Unterseite: Reiter mit Symbol
   und Beschriftung nebeneinander, „hier bist du" gelb gefüllt. Dass Gelb
   damit auch außerhalb des Kaufabschlusses auftaucht, ist hier Kundenwunsch
   (Entwurf zeigt es genauso) – anders als etwa in der Hauptnavigation
   (Abschnitt 9), wo „aktuelle Seite" bewusst schwarz bleibt. Jeder Reiter
   trägt trotzdem höchstens eine gelbe Fläche gleichzeitig, siehe Kommentar
   bei tegrafo_bereiche_liste() in bereiche.php.

   Kundenwunsch, zweite Runde: ohne Rahmen, alle drei gleich breit. Getrennt
   werden die Reiter jetzt allein durch die Füllfarbe (Gelb vs. Weiß) und den
   schmalen Zwischenraum, der den weißen Grund durchscheinen lässt – kein
   Rahmen nötig, um sie auseinanderzuhalten.

   Kundenwunsch, dritte Runde: zunächst über die volle Seitenbreite (dafür
   war `col-full` an `tegrafo-umschalter__reihe` entfernt, bereiche.php),
   jetzt auf dieselbe Containerbreite wie das übrige Merchshop-Layout
   begrenzt – `col-full` ist deshalb wieder da.

   `box-sizing: border-box` zusätzlich nötig: `.col-full` liegt hier direkt
   im `<nav>`, nicht – wie Produktraster und Vertrauenshinweise – bereits
   innerhalb eines weiteren `.col-full` um den Hauptinhalt. Ohne Umstellung
   zählt die Innenabstand-Polsterung on top zur Höchstbreite dazu und die
   Reihe würde beidseitig 40px breiter als der Container darunter, statt mit
   ihm bündig abzuschließen (dieselbe Ursache wie beim Warenkorb-Symbol in
   Abschnitt 17: `width` bezieht sich ohne `border-box` nur auf den Inhalt,
   die Polsterung kommt on top). */

.tegrafo-umschalter {
	background-color: var(--tg-weiss);
	border-bottom: 1px solid var(--tg-linie);
}

/* --- Mobilfassung: als Hamburger einklappbar -----------------------------
   Kundenrückmeldung 19.09.2026: Auf schmalen Displays passen die drei Reiter
   nicht mehr nebeneinander, ohne dass „Aktionsmaterialien kostenlos" und
   „Gruppenbereich (SSO)" mitten im Wort umbrechen. `<details>`/`<summary>`
   übernimmt das Auf-/Zuklappen nativ und barrierefrei, ganz ohne eigenes
   JavaScript – ohne JavaScript bliebe die Liste schlicht aufgeklappt stehen,
   keine Funktion ginge verloren (gleiches Prinzip wie in variantenauswahl.php,
   nur dort mit einem echten Formularfeld als Ausweichlösung statt hier mit
   `<details>` selbst).

   Am Desktop (≥48em, style.css folgt hier derselben Grenze wie schon bei
   `.col-full` und der Kopf-Fußleiste weiter oben) bleibt es beim
   bisherigen Bild: `<summary>` verschwindet, `.tegrafo-umschalter__reihe`
   bekommt ihr `display: flex` fest zugewiesen, unabhängig vom `[open]`-
   Zustand des `<details>` – zwei Klassen schlagen dabei Storefronts (bzw.
   des Browsers eigene) `details:not([open]) > :not(summary)`-Regel für
   geschlossene `<details>` ganz ohne `!important`.

   Kundenwunsch, zweite Runde: nur noch das Symbol, rechtsbündig, kein
   sichtbarer Text mehr daneben (bereiche.php gibt die Bereichsbezeichnung
   jetzt nur noch als `.screen-reader-text` aus).

   Kundenwunsch, dritte Runde: der Hamburger soll oben in die Kopfzeile
   wandern, statt in einer eigenen zweiten Reihe darunter zu stehen
   (Kundenrückmeldung 19.09.2026, Pfeil in der Rückmeldung zeigt nach oben
   zur Logo-Zeile). `<summary>` und `<header class="site-header">` sind
   Geschwister, keine Vorfahr-Nachfahr-Beziehung (derselbe Grund, aus dem die
   Kopflinie zuvor umziehen musste, siehe Kommentar bei `.site-header` weiter
   oben) – `position: absolute` relativ zu `#page` (dem gemeinsamen
   Vorfahren) wäre die naheliegende Lösung gewesen, blieb aber unsichtbar:
   `.site-header` bekommt weiter oben in dieser Datei `z-index: 999`
   (Abschnitt „Kopfbereich mitlaufend"), und auch mit `position: static` auf
   Mobilgeräten deckt sein Inhalt ein absolut positioniertes Geschwister
   trotzdem zu – abweichend vom eigentlich zu erwartenden Verhalten,
   Live-getestet, nicht nur angenommen. `position: fixed` (an den
   Sichtbereich statt an ein Vorfahrenelement gebunden) liegt dagegen
   zuverlässig obenauf UND hat einen echten Vorteil gegenüber `absolute`:
   Der Hamburger bleibt beim Scrollen erreichbar, passend zur bereits
   feststehenden Fußleiste (Konto/Suche/Warenkorb) auf Mobilgeräten.

   Korrektur 25.09.2026 (Befund Tobias): `fixed` war ein Fehler. Der Knopf
   schwebte beim Scrollen über dem Inhalt (etwa der Bestellübersicht), und
   die Liste klappt im Textfluss unter dem Kopf auf – wer weiter unten
   tippte, öffnete sie außerhalb des Bildes (gemessen: bei 1065 px Scrollhöhe
   oben bei −961 px), sichtbar passierte nichts. Jetzt `absolute`: Der Knopf
   steht an derselben Stelle in der Logo-Zeile und läuft mit dem Kopf weg,
   der auf dem Telefon ohnehin nicht klebt (Abschnitt 21). Mit dem
   `z-index: 1000` unten liegt er über dem Kopf – gemessen per
   `elementFromPoint`, die frühere Beobachtung „bleibt unsichtbar“ galt ohne
   ihn. Bezugsrahmen ist das Dokument, kein Vorfahr ist positioniert.

   Absichtlich nur `<summary>` wird so herausgelöst, nicht die aufklappbare
   Liste `.tegrafo-umschalter__reihe` selbst: Die bleibt im normalen
   Textfluss, direkt unter dem Kopf, wie gehabt – nur eben ohne die Reihe für
   den geschlossenen Hamburger obendrüber, die jetzt entfällt. `<details>`
   hat im geschlossenen Zustand dadurch kein eigenes Kind mehr im Textfluss
   (Summary herausgelöst, Reihe nativ ausgeblendet) und fällt von selbst auf
   0px Höhe zusammen – die eigene Fläche/Linie von `.tegrafo-umschalter`
   (oben) wäre für sich allein nur noch eine sinnlose 1px-Linie direkt unter
   der Kopflinie und deshalb hier ausgeschaltet; erst wenn die Liste
   aufklappt, bekommt die Reihe ihre Fläche zurück. */
.tegrafo-umschalter__aktuell {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--tg-space-2xs);
	color: var(--tg-text);
	cursor: pointer;
	list-style: none;
}

.tegrafo-umschalter__aktuell::-webkit-details-marker {
	display: none;
}

/* Kundenwunsch, vierte und fünfte Runde: etwas größer und etwas weiter
   unten, nicht direkt an der Bildschirmkante – wie bei den drei Symbolen im
   Kopf am Desktop (Suche/Konto/Warenkorb, Abschnitt 17) ist 30px eine
   deutlich greifbarere Fläche als die ursprünglichen 20px. Feste px statt
   Abstands-Token, da 30px keinem der vorhandenen Werte entsprechen. */
.tegrafo-umschalter__aktuell .tegrafo-umschalter__symbol {
	width: 30px;
	height: 30px;
}

@media (max-width: 47.99em) {
	.tegrafo-umschalter__aktuell {
		position: absolute;
		top: 30px;
		right: var(--tg-space-xs);
		z-index: 1000;
		background-color: var(--tg-weiss);
		border-radius: var(--tg-radius-knopf);
	}

	.tegrafo-umschalter {
		background-color: transparent;
		border-bottom: none;
	}

	/* Erst wenn aufgeklappt, bekommt die Reihe ihre Fläche/Linie zurück –
	   `:has()` liest den `[open]`-Zustand von `<details>` direkt aus, ganz
	   ohne JavaScript oder zusätzliche Klasse. */
	.tegrafo-umschalter:has(.tegrafo-umschalter__klapp[open]) {
		background-color: var(--tg-weiss);
		border-bottom: 1px solid var(--tg-linie);
	}
}

@media (min-width: 48em) {
	.tegrafo-umschalter__aktuell {
		display: none;
	}
}

/* --- Warum die Reihe seit dem 23.09.2026 NICHT mehr im <details> steht -----
   Die Reiterreihe war ein Kind des `<details>`; am Desktop wurde sie über
   `.tegrafo-umschalter__klapp .tegrafo-umschalter__reihe { display: flex }`
   wieder eingeblendet, obwohl das `<details>` zu war. Das funktionierte,
   solange Browser geschlossene `<details>` über die UA-Regel
   `details:not([open]) > :not(summary) { display: none }` versteckten – zwei
   Klassen schlagen diese Regel.

   Die Browser sind davon abgerückt: Sie verstecken den Inhalt jetzt über das
   Pseudoelement `::details-content` mit `content-visibility: hidden`. Das
   greift eine Ebene höher als jede `display`-Regel am Kind. Am 23.09.2026
   habe ich deshalb `::details-content { content-visibility: visible }`
   ergänzt – in Chrome wirkte das, in Firefox **nicht** (Rückmeldung Tobias,
   auch nach Neuladen). Welche Eigenschaften ein Browser an diesem
   Pseudoelement überhaupt von außen annimmt, ist je Engine verschieden; ein
   Flicken, der auf einer Engine wirkt und auf der anderen nicht, ist keine
   Lösung, sondern zwei Fehler.

   Jetzt hängt die Darstellung am Desktop gar nicht mehr am `<details>`:
   Die Reihe steht im Quelltext **daneben** (bereiche.php), nicht darin. Am
   Desktop ist sie damit eine ganz normale Flex-Zeile, in jedem Browser, ohne
   Sonderregel. Nur am Telefon wird sie ausgeblendet und über den
   `[open]`-Zustand des Hamburgers wieder eingeblendet – per `:has()`, das
   hier ohnehin schon für die Fläche benutzt wird (weiter oben).

   Preis dafür: Das `<details>` hat keinen eigenen Inhalt mehr, die
   aufklappbare Liste ist sein Geschwister. Für Hilfstechnik heißt das, dass
   der Auf-/Zuklapp-Zustand weiterhin angesagt wird, die Einträge aber hinter
   dem Knopf folgen statt in ihm. Vorlesereihenfolge und Tastaturweg bleiben
   richtig, weil die Reihe unmittelbar auf den Knopf folgt. Am Desktop
   entfällt der Knopf ohnehin (`display: none` oben). */


.tegrafo-umschalter__reihe {
	display: flex;
	gap: var(--tg-space-3xs);
	box-sizing: border-box;

	/* Kundenwunsch: Die Reihe selbst liegt (dank border-box oben) bereits
	   bündig auf Containerbreite, aber `.col-full`s eigener Innenabstand
	   (padding-left/right) rückte die Reiter dann noch einmal 40px nach
	   innen – die Knöpfe wirkten schmaler als Produktraster und
	   Kategorienzeile darunter, obwohl die Reihe selbst schon exakt
	   passte. Innenabstand deshalb hier auf 0, die Reiter tragen mit
	   ihrem eigenen `padding` (weiter unten) ohnehin genug Abstand zum
	   Text. */
	padding-left: 0;
	padding-right: 0;
}

/* Wie in Abschnitt 17 bei `.site-header > .col-full`: Storefronts eigenes
   Clearfix-Paar auf `.col-full` (`content: ""`) zählt in einer Flex-Zeile
   als eigener, unsichtbarer erster/letzter Flex-Eintrag – nach Entfernen
   des Innenabstands oben blieb dadurch je ein zusätzlicher `gap`-Abstand
   (4px) vor dem ersten und nach dem letzten Reiter übrig, die Knöpfe füllten
   die Containerbreite also noch immer nicht ganz aus (Kundenrückmeldung
   19.09.2026, „liegt am padding der buttons" – tatsächliche Ursache war
   dieses unsichtbare Geschwisterelement, nicht der Innenabstand der Reiter
   selbst). */
.tegrafo-umschalter__reihe::before,
.tegrafo-umschalter__reihe::after {
	content: none;
}

.tegrafo-umschalter__eintrag {
	display: inline-flex;
	flex: 1 1 0;
	box-sizing: border-box;
	align-items: center;
	justify-content: center;
	gap: var(--tg-space-2xs);
	line-height: 1.25;
	padding: var(--tg-space-xs) var(--tg-space-s);
	border-radius: 0;
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-button);
	text-transform: uppercase;
	letter-spacing: var(--tg-ls-versal-klein);
	text-decoration: none;
	color: var(--tg-text);
	text-align: center;
}

.tegrafo-umschalter__symbol {
	flex: none;
}

.tegrafo-umschalter__eintrag--aktiv {
	background-color: var(--tg-gelb);
}

.tegrafo-umschalter__eintrag--aktiv:hover {
	background-color: var(--tg-gelb-aktiv);
}

/* Sieht startklar aus, ist es aber noch nicht (Kundenwunsch, siehe
   bereiche.php) – deshalb volle Kontraststärke wie ein echter Reiter, kein
   gedämpfter Text. Der einzige Unterschied zum aktiven Reiter ist die
   fehlende Füllung; nichts daran signalisiert „gesperrt". */
.tegrafo-umschalter__eintrag--schein {
	background-color: var(--tg-weiss);
}

.tegrafo-umschalter__eintrag--schein:hover {
	background-color: var(--tg-flaeche-info);
}

/* Für einen Bereich, der wirklich noch nicht so weit ist, dass er überhaupt
   anklickbar aussehen soll – aktuell ungenutzt, aber ein `schein: false`
   ohne weiteres Feld greift automatisch hierauf zurück. */
.tegrafo-umschalter__eintrag--gesperrt {
	color: var(--tg-text-leise);
	cursor: default;
}

/* Nach den Basisregeln oben (`.tegrafo-umschalter__reihe`, `.tegrafo-
   umschalter__eintrag`), nicht davor: Gleiche Selektor-Spezifität, also
   entscheidet die Reihenfolge im Quelltext (dieselbe Falle wie eben bei der
   Kategorienzeile). Untereinander statt nebeneinander: Bei drei gleich
   breiten Dritteln käme derselbe Zeilenumbruch zurück, den der Hamburger
   gerade vermeiden soll. */
@media (max-width: 47.99em) {
	/* Zugeklappt ist der Normalfall am Telefon. `:has()` liest den
	   `[open]`-Zustand des Hamburgers aus – dasselbe Mittel wie oben bei der
	   Fläche, also kein neues Risiko. */
	.tegrafo-umschalter__reihe {
		display: none;
		flex-direction: column;
	}

	.tegrafo-umschalter:has(.tegrafo-umschalter__klapp[open]) .tegrafo-umschalter__reihe {
		display: flex;
	}

	.tegrafo-umschalter__eintrag {
		flex: none;
		justify-content: flex-start;
	}
}


/* 24. Vertrauenshinweise =====================================================
   Drei Punkte, Symbol + Titel + Satz, wie im Amnesty-Entwurf, Text von dort
   übernommen. Die Kreisfläche steht in Hellgrau statt im hellgelben Ton des
   Entwurfs – konsequent bei den fünf Handbuchfarben, ohne einen sechsten,
   nirgendwo sonst verwendeten Ton einzuführen. */

.tegrafo-vertrauen {
	/* Rand oben war var(--tg-space-l), zusammen mit dem eigenen Innenabstand
	   (ebenfalls --tg-space-l) wirkte der Übergang von den Bereichs-Kacheln
	   wie eine eigene Seite, nicht wie deren Abschluss. Jetzt --tg-space-s –
	   genau wie der untere Rand von .tegrafo-bereiche direkt darüber, mit
	   dem sich dieser Rand die CSS-Randüberlappung teilt (es gilt immer der
	   größere von beiden, nicht die Summe – deshalb müssen beide sinken,
	   nicht nur einer).
	   Der Innenabstand blieb beim ersten Kürzen bewusst bei --tg-space-l
	   stehen, war in der Praxis aber immer noch zu viel Luft zwischen
	   Trennlinie und Hinweisen (und danach bis zum Fußbereich) – jetzt auf
	   --tg-space-m verringert. */
	padding-block: var(--tg-space-m);
	border-top: 1px solid var(--tg-linie);
	margin-top: var(--tg-space-s);
}

.tegrafo-vertrauen__reihe {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--tg-space-m);
}

@media (max-width: 61.99em) {
	.tegrafo-vertrauen__reihe {
		grid-template-columns: 1fr;
	}
}

.tegrafo-vertrauen__eintrag {
	display: flex;
	gap: var(--tg-space-xs);
	align-items: flex-start;
}

.tegrafo-vertrauen__abzeichen {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2.75rem;
	height: 2.75rem;
	border-radius: 50%;
	background-color: var(--tg-hellgrau);
	color: var(--tg-schwarz);
}

.tegrafo-vertrauen__eintrag h3 {
	font-size: var(--tg-fs-h3);
	margin: 0 0 var(--tg-space-3xs);
}

.tegrafo-vertrauen__eintrag p {
	color: var(--tg-text-leise);
	font-size: var(--tg-fs-text);
	margin: 0;
}


/* 25. Ticketsystem (SupportCandy) ===========================================
   Das Plugin bringt eine eigene Gestaltung mit: 5 px runde Ecken an Kästen und
   Feldern, Grundschrift 14 px, Feldhinweise 10 px, Knöpfe in Dunkelblau
   (#313042). Nichts davon passt zur CI – Flächen sind eckig (--tg-radius: 0),
   die Grundschrift ist 17 px, und die Handlungsfarbe ist Gelb.

   Nur Optik, keine Feldlogik. Selektoren bleiben auf die beiden Behälter des
   Plugins begrenzt (.wpsc-shortcode-container, .wpsc-auth-container), damit
   der übrige Shop unberührt bleibt. */

.wpsc-shortcode-container,
.wpsc-auth-container {
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-text);
	line-height: var(--tg-lh-text);
	color: var(--tg-text);
	border-radius: var(--tg-radius) !important;
	border-color: var(--tg-linie) !important; /* Plugin setzt 1px solid Primärfarbe !important */
}

/* Feldbeschriftung wie im Shop: schmale Schrift, gleiche Größe wie der Text. */
.wpsc-shortcode-container .wpsc-tff-label,
.wpsc-shortcode-container .wpsc-tff-label .name {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-text);
	color: var(--tg-text);
}

/* Das Sternchen für Pflichtfelder setzt das Plugin rot. Rot gehört nicht zur
   CI, und als einziger Farbträger wäre es ohnehin zu wenig (WCAG 1.4.1). */
.wpsc-shortcode-container .required-indicator {
	color: var(--tg-text);
}

/* 10 px Hilfstext ist zu klein; im Shop sind Marginalien 14 px. */
.wpsc-shortcode-container .extra-info,
.tegrafo-sc-hinweis {
	font-size: var(--tg-fs-klein);
	line-height: var(--tg-lh-text);
	color: var(--tg-text-leise);
}

.wpsc-shortcode-container input[type="text"],
.wpsc-shortcode-container input[type="email"],
.wpsc-shortcode-container input[type="number"],
.wpsc-shortcode-container input[type="date"],
.wpsc-shortcode-container select,
.wpsc-shortcode-container textarea,
.wpsc-auth-container input[type="text"],
.wpsc-auth-container input[type="password"] {
	background-color: var(--tg-weiss);
	border: 1px solid var(--tg-dunkelgrau);
	border-radius: var(--tg-radius);
	box-shadow: none;
	color: var(--tg-text);
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-text);
	padding: var(--tg-space-2xs) var(--tg-space-xs);
	min-height: 2.75rem;
}

/* Das Plugin setzt Ecken, Höhen und Schriftgrößen mit `!important`, die
   Felder zusätzlich über die ID `#wpsc-container` (eigenes style.css,
   Zeile 70 ff. und 548 ff.: `border-radius: 5px`, `min-/max-height: 30px`).
   Dagegen kommt nur dieselbe ID mit derselben Kennzeichnung an. 30 px sind
   auch als Touch-Ziel zu klein – im Shop sind Felder 44 px hoch
   (WCAG 2.5.5). */
#wpsc-container input[type="text"],
#wpsc-container input[type="email"],
#wpsc-container input[type="password"],
#wpsc-container select,
#wpsc-container textarea {
	border-radius: var(--tg-radius) !important;
	min-height: 2.75rem !important;
	max-height: none !important;
	line-height: var(--tg-lh-text) !important;
	padding: var(--tg-space-2xs) var(--tg-space-xs) !important;
}

/* Auswahlfeld „Kategorie“ (Select2): eigene Höhe und Schriftgröße im Plugin. */
#wpsc-container .select2-container {
	font-size: var(--tg-fs-text) !important;
}

#wpsc-container .select2-container .select2-selection--single {
	height: 2.75rem !important;
}

/* Das Plugin entfernt den Fokusrahmen der Felder mit `outline: none
   !important`. Ohne sichtbaren Fokus ist das Formular mit der Tastatur nicht
   bedienbar (WCAG 2.4.7), deshalb zurückgeholt – schwarz wie im übrigen Shop. */
#wpsc-container input:focus-visible,
#wpsc-container select:focus-visible,
#wpsc-container textarea:focus-visible {
	outline: 2px solid var(--tg-schwarz) !important;
	outline-offset: 2px;
}

/* Das Auswahlfeld „Kategorie“ ist ein Select2-Nachbau. Es gehört zum Plugin,
   erscheint aber als eigenes Element neben dem echten <select>. */
.wpsc-shortcode-container .select2-selection--single {
	border: 1px solid var(--tg-dunkelgrau);
	border-radius: var(--tg-radius);
	height: 2.75rem;
	display: flex;
	align-items: center;
}

.wpsc-shortcode-container .select2-selection--single .select2-selection__rendered,
.wpsc-shortcode-container .select2-selection--single .select2-selection__placeholder {
	font-size: var(--tg-fs-text);
	color: var(--tg-text);
	line-height: 1.2;
}

.wpsc-shortcode-container .select2-selection--single .select2-selection__arrow {
	height: 2.75rem;
}

/* Knöpfe wie im übrigen Shop: die Handlung gelb, Nebenhandlungen hellgrau,
   beides mit schwarzer Schrift (19,6:1 bzw. 9,0:1).

   `!important` ist hier nötig: SupportCandy schreibt seine Knopffarben inline
   in den Seitenkopf, jede Eigenschaft mit `!important` (framework/class-wpsc-
   framework.php, Zeile 301 ff.). Die Farbe selbst kommt aus den Plugin-
   Einstellungen und steht dort auf Schwarz; die Schriftfarbe des Hauptknopfes
   ist im Plugin fest auf Weiß verdrahtet – auf Gelb unlesbar (1,07:1), deshalb
   der Eingriff. */
.wpsc-shortcode-container .wpsc-button,
.wpsc-auth-container .wpsc-button,
.wpsc-modal .wpsc-button {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-button);
	letter-spacing: var(--tg-ls-versal-klein);
	font-size: var(--tg-fs-button) !important;
	border-radius: var(--tg-radius-knopf) !important;
	min-height: 2.75rem;
	padding: var(--tg-space-2xs) var(--tg-space-s);
	text-shadow: none;
}

.wpsc-shortcode-container .wpsc-button.primary,
.wpsc-auth-container .wpsc-button.primary,
.wpsc-modal .wpsc-button.primary {
	background-color: var(--tg-gelb) !important;
	border: 1px solid var(--tg-gelb) !important;
	color: var(--tg-schwarz) !important;
}

.wpsc-shortcode-container .wpsc-button.primary:hover,
.wpsc-shortcode-container .wpsc-button.primary:focus-visible,
.wpsc-auth-container .wpsc-button.primary:hover,
.wpsc-auth-container .wpsc-button.primary:focus-visible,
.wpsc-modal .wpsc-button.primary:hover,
.wpsc-modal .wpsc-button.primary:focus-visible {
	background-color: var(--tg-gelb-aktiv) !important;
	border: 1px solid var(--tg-gelb-aktiv) !important;
	color: var(--tg-schwarz) !important;
}

.wpsc-shortcode-container .wpsc-button.secondary,
.wpsc-auth-container .wpsc-button.secondary,
.wpsc-modal .wpsc-button.secondary {
	background-color: var(--tg-hellgrau) !important;
	border: 1px solid var(--tg-hellgrau) !important;
	color: var(--tg-schwarz) !important;
}

.wpsc-shortcode-container .wpsc-button.secondary:hover,
.wpsc-shortcode-container .wpsc-button.secondary:focus-visible,
.wpsc-auth-container .wpsc-button.secondary:hover,
.wpsc-auth-container .wpsc-button.secondary:focus-visible,
.wpsc-modal .wpsc-button.secondary:hover,
.wpsc-modal .wpsc-button.secondary:focus-visible {
	background-color: var(--tg-grau) !important;
	border: 1px solid var(--tg-grau) !important;
	color: var(--tg-schwarz) !important;
}

/* --- Agentenansicht (Ticketliste, einzelnes Ticket, Dialoge) --------------
   Dieselbe Linie wie vorn: eckige Flächen, schmale Schrift in Kopfzeilen,
   Warmgrau statt Blaugrau. Die Farben selbst stehen in den Plugin-
   Einstellungen (`wpsc-ap-ticket-list`, `-individual-ticket`, `-dashboard`,
   `-modal`, `-agent-collision`); hier steht nur, was das Plugin fest im
   Stylesheet hat.

   Runde Bilder (Profilbild, Zähler) bleiben rund – sie sind keine Fläche. */

#wpsc-container .wpsc-ticket-list-tbl,
#wpsc-container .wpsc-it-widget,
#wpsc-container .wpsc-widget-header,
#wpsc-container .wpsc-widget-body,
#wpsc-container .wpsc-filter-item,
#wpsc-container .wpsc-tickets-container,
#wpsc-container .wpsc-it-container,
#wpsc-container .wpsc-it-reply-section-container,
#wpsc-container .wpsc-it-thread-section-container,
.wpsc-modal .wpsc-modal-header,
.wpsc-modal .wpsc-modal-body,
.wpsc-modal .wpsc-modal-footer,
.wpsc-modal .wpsc-input-group input[type="text"],
.wpsc-modal .wpsc-input-group textarea,
.wpsc-modal .wpsc-input-group select {
	border-radius: var(--tg-radius) !important;
}

/* Storefront färbt jede Tabellenkopfzeile hell (`table:not(.has-background) th`,
   aus dem Customizer-CSS) und gewinnt gegen die Farbe aus den Plugin-
   Einstellungen – die Kopfzeile war weiß auf Weiß. Deshalb hier noch einmal,
   mit der ID davor. */
#wpsc-container table.wpsc-ticket-list-tbl th {
	background-color: var(--tg-schwarz) !important;
	color: var(--tg-weiss) !important;
}

/* Tabellenkopf und Filterzeile in der schmalen Schrift, wie Tabellen im Shop. */
#wpsc-container .wpsc-ticket-list-tbl th,
#wpsc-container .wpsc-widget-header,
.wpsc-modal .wpsc-modal-header {
	font-family: var(--tg-font-headline);
	letter-spacing: var(--tg-ls-versal);
}

/* Interne Notizen hoben sich bisher nur durch Olivgrün vom Kundenbeitrag ab.
   Beides ist jetzt schwarz, also braucht die Notiz ein anderes Merkmal:
   den Informationskasten der CI (Warmgrau, Schwarz darauf 11,9:1). */
#wpsc-container .wpsc-thread.note .thread-body {
	background-color: var(--tg-flaeche-info);
	padding: var(--tg-space-2xs) var(--tg-space-xs);
}

/* Die Beiträge selbst lesen sich wie Fließtext im Shop. */
#wpsc-container .wpsc-thread .thread-text {
	font-size: var(--tg-fs-text);
	line-height: var(--tg-lh-text);
}


/* 26. Telefonzeiten mit Erreichbarkeit (inc/telefonzeiten.php) ==============
   Nummer groß, Zeiten leise, darunter der Zustand. „Jetzt erreichbar“ bekommt
   die Textmarker-Markierung (Gelb = Handlungsebene, S. 20) – ein Anruf ist die
   Handlung, zu der die Zeile einlädt. „Nicht besetzt“ bleibt ohne Farbe; die
   Handlung ist dann der Link zum Formular, und der ist als Link erkennbar.
   Ohne JavaScript bleibt die Statuszeile per hidden-Attribut verborgen. */

.tegrafo-telefon p {
	margin-bottom: 0.25em;
}

.tegrafo-telefon__nummer {
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-h4);
}

.tegrafo-telefon__zeiten {
	color: var(--tg-text-leise);
}

.tegrafo-telefon__status {
	margin-top: 0.5em;
}

.tegrafo-telefon--offen .tegrafo-telefon__status {
	display: inline-block;
	padding: 0 0.3em;
	background: var(--tg-markierung);
	color: var(--tg-text);
}


/* 27. Hilfe-Seite: E-Mail als Notausgang unter dem Formular =================
   Entscheidung 22.09.2026: Das Formular ist der Weg, die E-Mail der Ausweg,
   solange Mails nicht als Tickets landen. Deshalb kein eigener Kasten mehr
   oben, sondern ein leiser Satz unter dem Ticketformular. */

.tegrafo-hilfe-notausgang {
	margin-top: 1.5em;
	font-size: var(--tg-fs-klein, 0.9em);
	color: var(--tg-text-leise);
}

.tegrafo-hilfe-notausgang a {
	color: inherit;
}


/* 28. Farbhinweis in der Produktübersicht (inc/produktarchiv.php) ============
   Kundenwunsch 23.09.2026: In der Übersicht soll man sehen, dass es einen
   Artikel in mehreren Farben gibt. Punkt plus Name, direkt unter dem
   Produktnamen.

   Jeder Punkt bekommt denselben schwarzen Ring, unabhängig von der Füllung.
   Bei Schwarz verschwindet er in der Fläche, bei Weiß und Natur ist er das
   Einzige, was den Punkt überhaupt sichtbar macht – ein Ring nur für helle
   Farben wäre eine Sonderregel, die bei jeder neuen Farbe wieder zu
   entscheiden wäre. Schwarz statt `--tg-linie` (Hellgrau), weil Hellgrau auf
   weißem Grund einen weißen Punkt nicht zuverlässig abgrenzt; die harte
   schwarze Kontur passt außerdem zur Linienführung im übrigen Layout.

   `flex-wrap` und eine eigene Zeile je Eintrag bei schmalen Kacheln: Die
   Kachelbreite steht nicht fest (vier Spalten am Desktop, zwei am Telefon),
   und „Grau meliert" neben „Weiß" sprengt eine schmale Kachel sonst. */

.tegrafo-farben {
	display: flex;
	flex-wrap: wrap;
	gap: var(--tg-space-3xs) var(--tg-space-s);
	list-style: none;
	margin: 0 0 var(--tg-space-2xs);
	padding: 0;
}

.tegrafo-farben__eintrag {
	display: flex;
	align-items: center;
	gap: var(--tg-space-3xs);
	margin: 0;
}

.tegrafo-farben__punkt {
	display: block;
	flex: none;
	width: 0.75rem;
	height: 0.75rem;
	border: 1px solid var(--tg-linie-kraeftig);
	border-radius: 50%;
}

.tegrafo-farben__name {
	font-family: var(--tg-font-text);
	font-size: var(--tg-fs-klein);
	font-weight: 400;
	text-transform: none;
	letter-spacing: normal;
	color: var(--tg-text-leise);
}


/* 29. Größentabelle (tegrafo-merchshop-core, inc/groessentabellen.php) =======
   Markup und Maßskizze kommen aus dem Plugin, weil die Maße Produktdaten sind
   und einen Themewechsel überleben müssen. Hier steht nur die Darstellung.
   Die Grundregeln für Tabellen in Reitern (Rahmen, Kopfzeile Hellgrau)
   stehen in Abschnitt 12 und gelten auch hier.

   Skizze links, Tabelle daneben. Wird es zu eng, rutscht die Tabelle unter
   die Skizze. Die Skizze ist ein Hilfsmittel und keine Produktabbildung:
   200 px reichen, damit A und B lesbar sind, am Telefon 160 px. */

.tegrafo-groessentabelle {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: var(--tg-space-s) var(--tg-space-m);
}

.tegrafo-groessentabelle__skizze {
	flex: 0 0 12.5rem;
}

.tegrafo-groessentabelle__skizze svg {
	display: block;
	width: 100%;
	height: auto;
}

.tegrafo-groessentabelle__inhalt {
	flex: 1 1 20rem;
	min-width: 0; /* sonst schiebt eine breite Tabelle den Flex-Container auf */
	max-width: 40rem;
}

/* Mehr Spalten, als auf ein schmales Telefon passen: Die Tabelle scrollt in
   ihrem Rahmen, statt die ganze Seite seitlich verschiebbar zu machen. */
.tegrafo-groessentabelle__rahmen {
	overflow-x: auto;
}

/* Nicht auf volle Breite gezogen (Abschnitt 12 setzt 100 %): Bei drei
   Spalten wären das über 200 px je Zelle für zweistellige Zahlen, und das
   Auge verliert auf dem Weg von der Größe zum Wert die Zeile. */
.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle {
	width: auto;
	margin: 0;
	font-variant-numeric: tabular-nums;
}

.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle th,
.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle td {
	text-align: center;
	padding-left: var(--tg-space-s);
	padding-right: var(--tg-space-s);
}

/* Werte und Größen nie umbrechen („12M-18M", „53–60"). Die Kopfzeile darf
   umbrechen, „Breite (A)" wird am Telefon zweizeilig. */
.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle tbody th,
.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle td {
	white-space: nowrap;
}

/* Die Größe ist Zeilenkopf, damit ein Screenreader sie zu jedem Wert
   mitliest. Sie soll aber nicht wie die Kopfzeile aussehen: weiß, nur in der
   Überschriftenschrift. */
.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle tbody th {
	background-color: transparent;
}

.tegrafo-groessentabelle__hinweis {
	margin: var(--tg-space-xs) 0 0;
	font-size: var(--tg-fs-klein);
	color: var(--tg-text-leise);
}

@media (max-width: 47.99em) {
	.tegrafo-groessentabelle__skizze {
		flex-basis: 10rem;
	}

	/* Vier Spalten (Baby-Body mit Körpergröße) passen bei 390 px Breite in
	   17 px nicht hinein. Gemessen fehlten 12 px, und „Körpergröße" wurde
	   abgeschnitten. In 14 px passen sie. */
	.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle th,
	.woocommerce-tabs .panel .tegrafo-groessentabelle__tabelle td {
		padding-left: var(--tg-space-2xs);
		padding-right: var(--tg-space-2xs);
		font-size: var(--tg-fs-klein);
		line-height: var(--tg-lh-headline);
	}
}

/* Link „Größentabelle" unter den Größenknöpfen. Schrift und Abstand wie
   „Zurücksetzen" (Abschnitt 12). Steht die Größe in der letzten Zeile, stehen
   beide Links nebeneinander. */
.single-product div.product .tegrafo-groessentabelle-link {
	display: inline-block;
	margin: var(--tg-space-2xs) var(--tg-space-s) 0 0;
	font-family: var(--tg-font-headline);
	font-size: var(--tg-fs-klein);
}


/* 30. Bestandshinweis auf der Produktseite (inc/produktseite.php) ============
   Kundenwunsch 23.09.2026: „ohne Icon, kein grün".

   Beides kommt nicht von uns: Das Häkchen-Symbol setzt `icons.css` über
   `.stock.in-stock::before` (Font Awesome 5), das Grün #0F834D steht in
   WooCommerce' eigener `woocommerce.css`. Grün gehört nicht zu den fünf
   Farben des Handbuchs – es wäre die einzige Stelle im Shop, an der es
   vorkommt.

   Das Symbol wird für **beide** Zustände abgeräumt, nicht nur für „vorrätig":
   Ein Häkchen hier und ein Kreuz dort wäre ein Zeichensatz für sich, und der
   Text sagt es bereits. Wer die Seite hört statt sieht, hatte davon ohnehin
   nichts – die Symbole stehen in `content` und werden je nach Vorleseprogramm
   als Leerzeichen oder als Unsinn ausgegeben.

   Zwei Stufen, zwei Grade an Deutlichkeit:

     „Wenige verfügbar"       grau wie die Lieferzeitzeile darüber – eine
                              Randnotiz, kein Alarm
     „Sehr wenige verfügbar"  schwarz, also so laut wie der Fließtext

   Bewusst **ohne** Fettung: Die selbst gehostete Roboto liegt nur in 400 und
   700 vor (assets/fonts/), 500 gäbe es nicht und der Browser rechnete sich
   eine Fettung aus. 700 wiederum wäre lauter als die Produktüberschrift
   verträgt. Der Sprung von Grau auf Schwarz reicht.

   „Nicht vorrätig" stand zunächst weiter in WooCommerce' Rot (#E2401C).
   Entscheidung Tobias 23.09.2026: „rot raus schwarz reicht." Rot ist genauso
   wenig eine Handbuchfarbe wie Grün, und das eigentliche Signal ist ohnehin
   ein anderes – bei ausverkaufter Ware fehlt der Knopf „In den Warenkorb".
   Die Zeile muss das nicht noch einmal anschreien.

   Dass „Nicht vorrätig" und „Sehr wenige verfügbar" damit gleich aussehen,
   ist in Ordnung: Beide sind die laute Stufe, und sie stehen nie gleichzeitig
   da. */

.stock::before {
	display: none;
}

.stock.in-stock {
	color: var(--tg-text-leise);
}

.stock.tegrafo-bestand--sehr-wenige,
.stock.out-of-stock {
	color: var(--tg-text);
}


/* 31. Miniaturen in der Produktgalerie =======================================
   Kundenwunsch 23.09.2026: „zwischen den Thumbnails nicht so großen Abstand".

   Ursache: WooCommerce legt die Miniaturen als Spaltenraster an – jedes `li`
   schwimmt links und bekommt einen prozentualen rechten Rand, berechnet für
   vier Spalten über die volle Galeriebreite. Bei zwei Bildern bleibt der Rand
   trotzdem stehen: gemessen **89 px** Abstand neben einer 53 px breiten
   Miniatur, also mehr Lücke als Bild.

   Statt an den Prozenten zu drehen hier eine Flex-Zeile mit festem Abstand.
   Das Raster wird damit nicht enger gerechnet, sondern durch etwas ersetzt,
   das keine feste Spaltenzahl kennt – zwei Bilder stehen dann genauso richtig
   wie sechs. Der Zeilenumbruch (`flex-wrap`) hält die Reihe innerhalb der
   Galeriebreite.

   Die Selektoren sind so lang wie die von WooCommerce, weil sie deren
   Spezifität erreichen müssen – sonst gewinnen Rand und `float` weiter. Beim
   ersten Anlauf war meiner eine Klasse zu kurz und wirkungslos: Die Regel, die
   die 89 px setzt, lautet

     .single-product div.product .woocommerce-product-gallery
       .woocommerce-product-gallery--columns-5 .flex-control-thumbs li

   – mit der Spaltenzahl als zusätzlicher Klasse. `[class*="--columns-"]` holt
   diese Klasse hier nach, ohne sich auf „5" festzulegen: Ändert jemand die
   Spaltenzahl in den WooCommerce-Einstellungen, greift die Regel weiterhin.
   Die Spezifität ist damit gleich, und weil style.css nach woocommerce.css
   geladen wird, gewinnt sie.

   Die **Breite** der Miniaturen bleibt absichtlich unangetastet (WooCommerce
   rechnet sie aus der eingestellten Spaltenzahl). Im ersten Anlauf stand hier
   `width: auto` – dann wuchsen die Bilder von 53 auf 200 px, weil sie ohne
   Vorgabe ihre natürliche Größe einnehmen. Gewünscht war weniger Abstand,
   nicht größere Bilder. */

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs {
	display: flex;
	flex-wrap: wrap;
	gap: var(--tg-space-2xs);
}

.single-product div.product .woocommerce-product-gallery[class*="--columns-"] .flex-control-thumbs li {
	float: none;
	margin: 0;
}


/* 32. Startseite: Hero-Untertitel und die zwei Teaser =======================
   Hero (inc/startseite.php): Unter der Überschrift im Aktionsbalken steht
   seit dem 23.09.2026 ein Satz von AMNESTY – Fließtextgröße, schwarz auf
   Gelb, auf Lesebreite begrenzt wie die Überschrift darüber.
   Teaser: zwei Spalten unter den Kacheln, Text in Lesebreite, „Mehr dazu“
   als schlichter Link (die einzige gelbe Fläche der Seite bleibt der
   Merch-Knopf, Handbuch S. 9). Auf schmalen Bildschirmen untereinander.
   Seit dem 27.09.2026 sind die Kacheln archiviert (bereiche.php): Die
   Teaser folgen direkt auf den Balken, und statt des Merch-Knopfs steht
   dort wieder „Zum Shop“ (schwarz auf Gelb, Abschnitt 13). */

.tegrafo-buehne__text {
	font-size: var(--tg-fs-text);
	line-height: var(--tg-lh-text);
	color: var(--tg-schwarz);
	margin: 0;
	max-width: 48ch;
}

/* Der Text hat keinen Außenabstand, der Abstand zum Knopf darunter kommt
   deshalb vom Knopf – derselbe wie zwischen Überschrift und Text. */
.tegrafo-buehne__knopf {
	margin-top: var(--tg-space-s);
}

.tegrafo-teaser {
	padding-block: var(--tg-space-m);
	border-top: 1px solid var(--tg-linie);
	margin-top: var(--tg-space-s);
}

/* Raster auf dem inneren Behälter – Storefronts Clearfix an .col-full
   (::before/::after, display: table) würde sonst zu eigenen Rasterzellen. */
.tegrafo-teaser__reihe {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: var(--tg-space-l);
}

@media (max-width: 61.99em) {
	.tegrafo-teaser__reihe {
		grid-template-columns: 1fr;
		gap: var(--tg-space-m);
	}
}

.tegrafo-teaser__titel {
	font-size: var(--tg-fs-h3);
	margin: 0 0 var(--tg-space-xs);
}

.tegrafo-teaser__eintrag p {
	max-width: var(--tg-textbreite);
}

.tegrafo-teaser__mehr {
	margin-bottom: 0;
}

.tegrafo-teaser__mehr a {
	font-family: var(--tg-font-headline);
	text-transform: uppercase;
	letter-spacing: 0.02em;
}


/* 33. Textseiten: Spalte mittig statt links =================================
   Kundenrückmeldung 23.09.2026 zur Seite „Über uns": „hier nicht so viel
   Freiraum, oder ist das die Warenkorbspalte?"

   Es war keine Spalte – auf der Seite gibt es gar kein Nebenelement, die
   Klasse `right-sidebar` am `<body>` ist nur Storefronts Standard und ohne
   Widget-Bereich folgenlos. Die Lücke entstand durch die Lesebreite: Absätze
   sind auf `--tg-textbreite` (68 Zeichen ≈ 650 px) gedeckelt, der Behälter
   ist 1200 px breit, und beides war linksbündig. Daneben blieben 550 px leer,
   während die Überschriften darüber die volle Breite einnahmen – der Text
   sah dadurch aus, als fehle rechts etwas.

   Die Begrenzung bleibt: Über rund 70 Zeichen je Zeile wird langer Fließtext
   mühsam zu lesen, dafür ist sie da. Stattdessen bekommt der ganze
   Inhaltsbereich diese Breite und wird mittig gesetzt. Überschriften und Text
   stehen damit in derselben Spalte, der Freiraum verteilt sich auf beide
   Seiten und liest sich als Absicht statt als Lücke.

   Die Ausnahmen stehen bewusst als `:has()`-Bedingung und nicht als Liste von
   Seiten-IDs: Eine Seite, die später eine Tabelle oder einen Spaltenblock
   bekommt, braucht die volle Breite dann von selbst – ohne dass jemand daran
   denken muss. Ausgenommen sind deshalb Inhalte mit Spaltenblock (Hilfe &
   Kontakt), Tabelle (Versand & Zahlung), WooCommerce-Blöcken und dem
   Ticketsystem, dazu über die Körperklassen alle WooCommerce-Seiten
   (Shop, Warenkorb, Kasse, Mein Konto) und die Startseite.

   `.woocommerce` stand zuerst mit in der Ausnahmeliste und war zu grob:
   Germanized legt auch um die Ausgabe seiner Rechtstext-Shortcodes einen
   `.woocommerce`-Behälter. Impressum und Zahlungsarten blieben dadurch
   linksbündig, obwohl sie reiner Text sind. Die echten Shop-Seiten hängen
   ohnehin an der Körperklasse `woocommerce-page`, die Blöcke an
   `wc-block` – `.woocommerce` ist dafür nicht nötig.

   Begrenzt wird der ganze `<article>` (`.hentry`), nicht nur `.entry-content`.
   Zuerst stand die Regel am Inhalt allein – dann rutschte der Text in die
   Mitte, die Überschrift „ÜBER UNS" blieb aber links kleben, weil sie im
   `entry-header` daneben steht. Titel und Text gehören in dieselbe Spalte,
   sonst ist die Lücke nur woanders.

   Erst ab 60em: Darunter ist der Behälter ohnehin schmaler als die Lesebreite,
   die Regel hätte dort nichts zu tun.

   Das `body` vor `.page` ist nicht Zierde, sondern die Korrektur eines
   Fehlers: Ohne es stand dort `.page:not(.home)`, und das griff trotzdem auf
   der Startseite. Grund ist, dass WordPress die Klasse `page` nicht nur dem
   `<body>` gibt, sondern auch dem `<article>` – und das trägt weder `home`
   noch `woocommerce-page`. Der Ausschluss lief damit ins Leere, die
   Startseite und „Mein Konto" wurden mitzentriert. Gemerkt nur, weil ich die
   Regeln am Element abgefragt habe statt nur hinzusehen. */

@media (min-width: 60em) {
	body.page:not(.woocommerce-page):not(.home) .hentry:not(:has(.wp-block-columns, table, [class*="wc-block"], [class*="supportcandy"], [id*="supportcandy"])) {
		max-width: var(--tg-textbreite);
		margin-inline: auto;
	}
}


/* 34. Mengenfeld: Hinweis statt Browser-Fenster (inc/mengenfeld.php) ========
   Erscheint unter Feld und Knopf, sobald mehr eingetippt wird, als da ist.
   Leise Textfarbe, keine rote Warnung – der Kunde hat nichts falsch gemacht,
   er wusste die Zahl nur nicht. Das Feld selbst bekommt einen schwarzen
   Rahmen, damit klar ist, worauf sich der Satz bezieht. */

.tegrafo-mengenhinweis {
	margin: var(--tg-space-2xs) 0 0;
	font-size: var(--tg-fs-klein, 0.9em);
	color: var(--tg-text-leise);
	max-width: var(--tg-textbreite);
}

form.cart input.qty.tegrafo-mengenfeld--fehler {
	border-color: var(--tg-linie-kraeftig);
}


/* =============================================================================
 * Harmonisierter Hinweis auf die gesetzliche Gewährleistung (Germanized, EU
 * 2024/825, seit 27.09.2026). Germanized hängt ihn bei Storefront an
 * `storefront_footer` (Priorität 25) und zentriert ihn. Im Fußbereich ist
 * alles linksbündig – das Label folgt (Tobias, 01.10.2026). Größe bewusst
 * unverändert: „hervorgehoben“ und lesbar muss es bleiben.
 * ========================================================================== */

.site-footer .wc-gzd-legal-guarantee-footer {
	text-align: left;
	margin-top: var(--tg-space-s);
}

.site-footer .wc-gzd-legal-guarantee-footer .wc-gzd-legal-guarantee-label {
	display: inline-block;
}
