:root {
  --brand-onyx: #0C2148;
  /* Hiess bis 27.08.2026 --brand-gold. Umbenannt, weil der Name die Rolle nicht mehr
     traf: die Farbe ist der Akzent und steht nur noch auf primaeren Schaltflaechen,
     nicht mehr auf jedem Link. Geprueft vor dem Umbenennen: die Variable hing an genau
     drei Stellen, alle in dieser Datei, nichts in der Datenbank. */
  --brand-accent: #C2410C;
  /* Neu: Linkfarbe. Vorher trugen alle Links den Akzent, dadurch war die Filterleiste
     orange und der Fokusrahmen erbte diese Farbe ueber currentColor. */
  --brand-link: #13366D;
  --brand-ivory: #F4F6F9;
  --brand-text: #1A1D21;
  --brand-muted: #5B6675;
  --brand-border: #E3E7ED;
  --brand-font-heading: 'Archivo', 'Inter', system-ui, sans-serif;
  --brand-font-body: 'Inter', system-ui, -apple-system, sans-serif;

  /* DIE HALBE RASTERBREITE, und zwar GEMESSEN.
     ==========================================
     Jeder Baustein, der bis an die Fensterkante laeuft und seinen Text
     trotzdem auf der Rasterkante der uebrigen Seite haelt, rechnet diese
     Kante selbst aus: `calc(50% - var(--gtp-raster-halb))`. Damit es dafuer
     genau EINE Zahl gibt, steht sie hier und nirgends sonst.

     HERLEITUNG. Die Zahl ist nicht aus der Theme-Einstellung abgeleitet und
     nicht geschaetzt, sondern am gerenderten DOM abgelesen, mit drei
     unabhaengigen Zeugengruppen auf beiden Seiten und drei Fensterbreiten
     (reports/p57-v121-raster/messe_kante.py):

       Fenster   Inhaltskante links   rechts    halbe Breite
       1280 px          55,00        1225,00       585,00
       1920 px         375,00        1545,00       585,00
       2560 px         695,00        1865,00       585,00

     Alle sieben bis acht Rasterkaesten je Seite tragen dort `max-width:
     1170px`, jede Ueberschrift beginnt auf deren linker Kante, und kein Absatz
     ragt darueber hinaus.

     DREI STUFEN, WEIL DAS THEME DREI HAT. Die Rasterbreite ist keine
     Konstante, sondern eine Treppe aus dem Theme-Stylesheet (`style.css`, das
     bekannte Bootstrap-Muster). Gemessen am gerenderten DOM, Inhaltskante
     links (reports/p57-aufraeumen-v21/protokolle/10-lage-vorher.json):
       unter 768 px:  kein Kasten, der Inhalt traegt 20 px Rand
                      (320 -> 20, 390 -> 20, 767 -> 20)
       ab  768 px Fenster:  720 px Raster   ->  halbe Breite 360 px
                      (768 -> 24, 900 -> 90, 991 -> 135,5)
       ab  992 px Fenster:  940 px Raster   ->  halbe Breite 470 px
                      (992 -> 26, 1024 -> 42, 1025 -> 42,5, 1229 -> 144,5)
       ab 1230 px Fenster: 1170 px Raster   ->  halbe Breite 585 px
                      (1230 -> 30, 1280 -> 55)

     DIE 720er STUFE HAT BIS ZUM 31.08.2026 GEFEHLT, UND ZWAR MIT BEGRUENDUNG.
     Hier stand: "Die Bleed-Bausteine stehen erst ab 1025 px nebeneinander,
     darunter stapeln sie und tragen ihren eigenen Seitenrand; die 720er Stufe
     braucht hier deshalb keine Entsprechung." Der erste Halbsatz stimmt, der
     Schluss daraus nicht: der eigene Seitenrand war fest 20 px, die uebrigen
     Ueberschriften der Seite wandern in diesem Band aber von 24 auf 135,5 px.
     Gemessen stand der Text der Bleed-Bausteine deshalb zwischen 768 und
     991 px bis zu 110 px weiter aussen als jede andere Ueberschrift, und
     zwischen 992 und 1024 px noch bis zu 22 px (die Wand traf dort schon, die
     gestapelten Bausteine standen weiter auf ihren 20). Ein Baustein, der
     stapelt, laeuft nicht mehr ueber die Rasterkante hinaus. Er steht dann
     einfach auf ihr, und dafuer muss er sie kennen.

     Der Grundwert deckt die unterste Stufe mit ab: dort gibt es keine halbe
     Rasterbreite, und jede Bleed-Formel faellt ueber ihr `max(20px, ...)` auf
     den 20-px-Rand des Themes zurueck. Der Grundwert muss dafuer nur groesser
     sein als die halbe Fensterbreite dieser Stufe (bei 767 px also 383,5 px);
     genommen ist die 470 der 940er Stufe, damit an dieser Stelle keine vierte
     Zahl steht, die niemand nachmisst.

     WARUM DAS HIER STEHT. Bis zum 29.08.2026 rechneten die Bleed-Formeln mit
     einer festen 570, also mit einem 1140er Raster. Diese Zahl gibt es auf der
     Seite durchaus, aber an der falschen Stelle: `--container-max-width:
     1140px` ist die Einstellung des Elementor-Kits, und das Theme ueberschreibt
     sie mit seiner eigenen Treppe. Die Folge war ein Versatz von 15 px an jeder
     Bleed-Kante, sichtbar an der Ueberschrift im Halbbild-Banner, die als
     einzige der Seite eingerueckt stand. Gefunden hat ihn eine Gegenpruefung,
     und zwar erst, nachdem der Pruefstand aufgehoert hatte, die Rasterkante
     mit derselben Formel zu rechnen, die er belegen sollte.

     Wer das Raster im Theme aendert, aendert HIER die Zahlen, misst mit
     messe_kante.py nach und nirgendwo sonst. */
  --gtp-raster-halb: 470px;
  /* Der Ueberstand, um den ein randloses Bild ueber die Rasterkante hinaus
     nach aussen laeuft, bevor es auf sehr breiten Schirmen stehen bleibt.
     Ebenfalls gemessen: die Buehne des Finish-Studios steht bei 1920 px auf
     x=90, die Inhaltskante auf x=375. */
  --gtp-bleed-ueberstand: 285px;
}
/* Die zwei oberen Stufen der Treppe, an genau den Schwellen des Themes. Weil
   hier eine Variable umgesetzt wird und keine einzelne Eigenschaft, ziehen ALLE
   Bleed-Formeln gemeinsam mit, ohne dass eine davon die Schwelle kennen muss.

   Die Reihenfolge ist die des Themes: reine min-width-Stufen, jede schlaegt die
   darunter. Eine Bereichsabfrage (min-width UND max-width) waere hier falsch,
   weil sie an der Schwelle eine Fuge liesse: bei 991,99 px greift ein
   `max-width: 991.98px` nicht mehr, das `min-width: 992px` des Themes aber
   auch noch nicht, und in diesem Spalt stuenden die zwei Kanten wieder
   110 px auseinander. */
@media (min-width: 768px) {
  :root { --gtp-raster-halb: 360px; }
}
@media (min-width: 992px) {
  :root { --gtp-raster-halb: 470px; }
}
@media (min-width: 1230px) {
  :root { --gtp-raster-halb: 585px; }
}
body { color: var(--brand-text); font-family: var(--brand-font-body); }
h1, h2, h3, h4, h5, h6 { font-family: var(--brand-font-heading); color: var(--brand-onyx); }
a { color: var(--brand-link); }
a:hover, a:focus { color: var(--brand-onyx); }
.br-btn, .br-btn:link {
  display: inline-block; background: var(--brand-onyx); color: var(--brand-ivory);
  border: 1px solid var(--brand-onyx); padding: .7em 1.6em; border-radius: 2px;
  font-family: var(--brand-font-body);
  text-decoration: none; transition: opacity .2s;
}
.br-btn:hover { opacity: .88; }
.br-bg-ivory { background: var(--brand-ivory); }
.br-accent { color: var(--brand-accent); }
.br-muted { color: var(--brand-muted); }
.br-border { border-color: var(--brand-border); }

/* gtp-referenzen
   ==================================================================
   Kachel und Filter der Referenzen. Gehoert zum Child-Template
   template-parts/content-project-filter.php und gilt an BEIDEN Stellen,
   an denen es benutzt wird: dem Elementor-Widget auf der Startseite und
   dem Archiv /referenzen/.

   Warum hier CSS und nicht die Widget-Controls: das Widget bietet zwar
   Farb- und Schriftregler fuer den Filter, aber nur fuer die Startseite.
   Das Archiv rendert archive-ot_portfolio.php ohne Elementor und hat gar
   keine Regler. Eine Regel fuer beide ist weniger Duplikat als Regler plus
   zweite CSS-Regel. Geprueft: im Widget 6d4c960 ist kein Farb- oder
   Schriftregler gesetzt, es kollidiert also nichts.

   Kein !important. Das ist moeglich, weil das Child-Template eigene
   Klassennamen mit Prefix gtp-ref- vergibt: das Parent-CSS zu .projects-box,
   .projects-thumbnail und .project-details findet nichts mehr vor.
   ================================================================== */

/* --- Filter ------------------------------------------------------- */
.filter ul li a {
  color: var(--brand-muted);
  text-transform: none;
  font-weight: 500;
}
.filter ul li a.active,
.filter ul li a:hover,
.filter ul li a:focus {
  color: var(--brand-link);
}
/* Den Unterstrich bringt das Theme als :after schon mit. Hier bekommt er nur
   die Marke statt currentColor und wird ausserhalb von aktiv/Hover unsichtbar.
   Das Theme blendet ihn erst ab 768 px aus (style.css:4949), darunter trug
   deshalb JEDER Knopf einen grauen Strich. */
.filter ul li a:after { opacity: 0; }
.filter ul li a.active:after,
.filter ul li a:hover:after,
.filter ul li a:focus-visible:after {
  opacity: 1;
  height: 2px;
  background: var(--brand-link);
}
/* Der Rahmen beim Klick war der Browser-Standard: das Theme setzt kein outline,
   und weil der Filter <a href="#"> mit preventDefault() ist, bleibt der Fokus
   nach dem Klick stehen. Er wird durch den Unterstrich oben ersetzt, den die
   Tastatur ueber :focus-visible ebenfalls bekommt. */
.filter ul li a:focus { outline: none; }
.filter ul li a:focus-visible { outline: none; }

@media (max-width: 767px) {
  /* Eine Zeile, seitlich schiebbar, statt Umbruch mit Einzel-Unterstrichen. */
  .isotope-filter ul {
    display: flex;
    flex-wrap: nowrap;
    overflow-x: auto;
    white-space: nowrap;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .isotope-filter ul::-webkit-scrollbar { display: none; }
  .isotope-filter ul li { flex: 0 0 auto; }
}

/* --- Kachel ------------------------------------------------------- */
.gtp-ref-karte {
  background: #fff;
  border: 1px solid var(--brand-border);
  border-radius: 6px;
  overflow: hidden;
  height: 100%;
}
.gtp-ref-bild {
  display: block;
  position: relative;
  aspect-ratio: 3 / 2;
  overflow: hidden;
}
.gtp-ref-bild-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .4s ease;
}
.gtp-ref-karte:hover .gtp-ref-bild-img { transform: scale(1.04); }
.gtp-ref-schleier {
  position: absolute;
  inset: 0;
  background: rgba(12, 33, 72, 0);
  transition: background .4s ease;
}
.gtp-ref-karte:hover .gtp-ref-schleier { background: rgba(12, 33, 72, .12); }

.gtp-ref-text { padding: 14px 16px 16px; }
.gtp-ref-label {
  margin: 0 0 4px;
  font-size: 12px;
  letter-spacing: .06em;
  color: var(--brand-muted);
  text-transform: none;
}
.gtp-ref-titel {
  margin: 0;
  font-family: var(--brand-font-heading);
  font-weight: 600;
  font-size: 18px;
  /* Feste Hoehe fuer genau zwei Zeilen. Ohne sie ergaben unterschiedlich lange
     Titel unterschiedlich hohe Karten, und Masonry schob die naechste Kachel in
     die entstandene Luecke ("Stahlgelaender" rutschte unter "Rohrserie"). */
  line-height: 1.3;
  height: 2.6em;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  color: var(--brand-text);
  text-transform: none;
}
/* Letztes Wort und Pfeil bleiben zusammen, sonst steht der Pfeil allein in Zeile 2. */
.gtp-ref-titel-ende { white-space: nowrap; }
.gtp-ref-titel a { color: inherit; }
.gtp-ref-titel a:hover { color: var(--brand-link); }
.gtp-ref-pfeil {
  display: inline-block;
  margin-left: 6px;
  font-size: 14px;
  vertical-align: baseline;
  transition: transform .25s ease;
}
/* Beim Ueberfahren der GANZEN Karte dreht der Pfeil aus der Schraege in die
   Waagerechte. Das Glyph ot-flaticon-top-right zeigt nach oben rechts, also
   45 Grad ueber der Waagerechten; +45 Grad im Uhrzeigersinn stellen ihn flach.
   Die 4 px Versatz aus dem ersten Durchgang bleiben erhalten, beide Anteile
   stehen in EINEM transform, weil die zweite Angabe die erste sonst ersetzt. */
.gtp-ref-karte:hover .gtp-ref-pfeil { transform: translateX(4px) rotate(45deg); }

.gtp-ref-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 10px 0 0;
  padding: 0;
  list-style: none;
  /* Auch mit nur einem Chip so hoch wie mit dreien, damit die Karten gleich hoch
     bleiben. 28 px ist die Hoehe eines Chips (12 px Text, 1.5 Zeilenhoehe, 2x3 px
     Innenabstand, 2x1 px Rahmen). */
  min-height: 28px;
}
.gtp-ref-chip {
  background: var(--brand-ivory);
  border: 1px solid var(--brand-border);
  border-radius: 3px;
  padding: 3px 8px;
  font-size: 12px;
  line-height: 1.5;
  color: var(--brand-muted);
}

/* --- Aufruf unter dem Raster (nur Startseite) --------------------- */
.gtp-ref-cta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 20px;
  margin-top: 40px;
}
/* Primaerknopf: uebernimmt Aussehen und Verhalten des Hero-Knopfes "Angebot anfordern"
   ueber DESSEN Variablen, nicht ueber abgeschriebene Zahlen. Aendert das Theme sein
   Primaerblau, wandert dieser Knopf mit. Der Akzent steht hier bewusst nicht mehr:
   die Site fuehrt genau eine Knopffarbe. */
.gtp-ref-cta-btn,
.gtp-ref-cta-btn:link,
.gtp-ref-cta-btn:visited {
  display: inline-block;
  background: var(--makaffo-color-primary, #004FEF);
  color: var(--makaffo-color-white, #fff);
  border: 1px solid transparent;  /* wie der Hero-Knopf, damit die Aussenmaße gleich sind */
  border-radius: 27px;
  padding: 13px 40px 9px;
  font-weight: 600;
  font-size: 14px;
  line-height: 32px;  /* ergibt dieselbe Knopfhoehe wie der Hero-Knopf, 54 px */
  text-decoration: none;
  transition: all .2s ease-in-out;
}
.gtp-ref-cta-btn:hover,
.gtp-ref-cta-btn:focus {
  background: var(--makaffo-color-dark, #242424);
  color: var(--makaffo-color-white, #fff);
}
.gtp-ref-cta-link {
  color: var(--brand-link);
  font-weight: 500;
  text-decoration: none;
  border-bottom: 2px solid transparent;
}
.gtp-ref-cta-link:hover,
.gtp-ref-cta-link:focus-visible { border-bottom-color: var(--brand-link); }

/* --- Logo im Kopf ------------------------------------------------------- */
/* Der schwarze Rahmen beim Ueberfahren war der Fokusring des Browsers: nach
   einem Mausklick auf das Logo bleibt der Fokus dort stehen, und `outline-style`
   springt auf `auto`. Dass er schwarz wirkte, liegt an dieser Datei: die Regel
   `a:hover, a:focus { color: var(--brand-onyx) }` faerbt ueber currentColor auch
   den Ring, und #0C2148 ist ein sehr dunkles Blau. Weder das Theme noch diese
   Datei setzen `outline` selbst.
   Maus bekommt keinen Ring mehr, die Tastatur einen sichtbaren. */
.the-logo a:focus { outline: none; }
.the-logo a:focus-visible {
  outline: 2px solid var(--brand-link);
  outline-offset: 2px;
}

/* --- Einzelseite einer Referenz ---------------------------------------- */
/* Der Infokasten kommt jetzt aus [gtp_ref_info] statt aus fest eingetippten
   Widgets. Flaeche, Innenabstand und Radius liefert weiter der Elementor-
   Container, hier stehen nur Raster und Schrift der Paare, gemessen am
   vorherigen Zustand: Label Epilogue 12/700 in Grossbuchstaben, Wert 14 px
   in der Themefarbe. */
.gtp-ref-info {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 24px 30px;
  margin: 0;
}
.gtp-ref-info-paar { margin: 0; }
.gtp-ref-info-label {
  display: block;
  margin: 0 0 4px;
  font-family: 'Epilogue', var(--brand-font-body);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .2px;
  text-transform: uppercase;
  color: #242424;
}
.gtp-ref-info-wert {
  display: block;
  margin: 0;
  font-size: 14px;
  color: var(--brand-link);
}
@media (max-width: 767px) {
  .gtp-ref-info { grid-template-columns: minmax(0, 1fr); gap: 16px; }
}

/* Bild der Einzelseite: fuellt die Spalte, Seitenverhaeltnis aus der Datei. */
.gtp-ref-seitenbild { margin: 0; }
.gtp-ref-seitenbild-img { display: block; width: 100%; height: auto; }

/* B6: Abstaende ueber den anderen Referenzen. Das Theme setzt 110 px, was ohne
   die entfallene Teilen-Leiste zu viel Luft laesst. */
.project-related-posts-wrap { padding-top: 48px; }
@media (max-width: 767px) {
  .project-related-posts-wrap { padding-top: 32px; }
}
/* In der Vor-Zurueck-Leiste steht nach dem Entfernen der Teilen-Leiste nur noch
   die Blaetterung, deshalb weniger Abstand nach unten. */
.post-nav { padding-bottom: 24px; }

/* --- Logo im angehefteten Kopf, schmale Fenster ------------------------- */
/* GEDREHT am 31.08.2026, weil sich die Voraussetzung geaendert hat.
   Die alte Fassung tauschte auf das HELLE Logo, und das war richtig, solange
   der angeheftete Mobil-Kopf dunkel war (gemessen rgb(27,44,64), spaeter
   rgb(38,47,66) aus einer zweiten Regel im Zusatz-CSS). Seit dem Auftrag
   "Header sticky" ist der angeheftete Kopf **site-weit weiss**; die beiden
   dunklen Regeln sind aus dem Zusatz-CSS 1396 entfernt. Auf Weiss ist das
   helle Logo unsichtbar, also gilt jetzt das Umgekehrte.

   Und ohne `body:not(.home)`. Der Ausschluss stand da, weil die Startseite
   den transparenten Kopf ueber dem dunklen Hero fuehrt; angeheftet ist der
   Kopf aber auch dort weiss, und Snippet 1871 schaltet auf der Startseite
   wegen `header-overlay` NICHT auf das dunkle Logo um. Ohne diese Regel
   staende auf der Startseite ein weisses Logo auf weissem Grund, also genau
   FALLE 69 an einer neuen Stelle. Gemessen vorher: hell sichtbar, Grund
   rgb(255,255,255). */
@media (max-width: 1023px) {
  /* Die ID im Selektor ist noetig, nicht Zierde: es gibt bereits eine
     Umschaltung `#site-header:not(.header-overlay) .header-mobile
     .gtp-logo-dunkel { display: block }` (Spezifitaet 1,3,0). Eine ID schlaegt
     jede Zahl von Klassen, ein Satz aus reinen Klassen verliert dagegen immer.
     Mit ID und vier Klassen steht diese Regel bei 1,4,0 und gewinnt, ohne dass
     ein !important noetig waere. */
  #site-header .header-mobile .sticky-header.is-stuck .gtp-logo-hell { display: none; }
  #site-header .header-mobile .sticky-header.is-stuck .gtp-logo-dunkel { display: block; }
}

/* --- Kopf der Referenz-Einzelseiten ------------------------------------- */
/* Der Titel steht weiss direkt auf dem Kopfbild, das Theme legt nichts dazwischen
   (.page-header hat nur `background: #000000 ...` als Traeger HINTER dem Bild).
   Gemessen war das schon mit dem alten Demobild kaputt: 2,57:1 und 28,9 Prozent der
   Titelflaeche unter 4,5:1. Mit dem Scrim sind es 6,18:1 und 0 Prozent.
   Bewusst nur auf den Referenz-Einzelseiten, also genau dort, wo das Bild getauscht
   wurde. Die uebrigen Kopfbilder (Kontakt, Ueber uns, Leistungen) bleiben unberuehrt. */
/* 28.08.2026 verallgemeinert: der Scrim haengt nicht mehr am Post-Typ, sondern am
   Kopfbereich selbst. Grund: die Vorlage fuer Unterseiten braucht denselben Kopf, und
   jede kuenftige Seite mit Kopfbild haette sonst wieder weissen Text auf hellem Foto.
   Die deutschen Seiten rendern gar keinen Kopfbereich, dort aendert die Regel nichts. */
.page-header { position: relative; }
.page-header::before {
  content: "";
  position: absolute;
  inset: 0;
  background-color: var(--brand-onyx);
  opacity: .7;
  pointer-events: none;
}
.page-header > .dcell { position: relative; z-index: 1; }

/* --- Werkstoff-Sektion, Bildformat ------------------------------------- */
/* Die drei Fotos sind 2752x1536, also 16:9,08. Das Elementor-Bild-Widget kennt kein
   Seitenverhaeltnis, deshalb hier: feste 16:9-Buehne, Bild fuellt sie beschnitten.
   Damit bleiben die drei Kacheln gleich hoch, auch wenn spaeter ein Bild mit anderem
   Verhaeltnis nachgereicht wird. */
.elementor-element-b134d36 .elementor-widget-image img {
  aspect-ratio: 16 / 9;
  object-fit: cover;
  width: 100%;
  height: auto;
  display: block;
}

/* --- Seitentitel im Kopfbereich, Worttrennung ---------------------------- */
/* Der Parent setzt word-break: break-word auf dem BODY (style.css:149), nicht auf
   dem Titel. Geerbt trifft es jede Ueberschrift, faellt aber erst auf, wenn ein
   einzelnes Wort breiter ist als seine Zeile: "Pulverbeschichtung" misst bei 36 px
   444 px, die Spalte bei 390 px Fenster nur 345 px. Der Titel brach deshalb nach
   "PULVERBESCHICH" um, ohne Trennstrich, weil hyphens auf manual steht.

   Warum die Schriftgroesse und nicht nur hyphens: auto.
   Nachgemessen: mit word-break: normal und hyphens: auto trennt der Pruefbrowser
   NICHT, und dann wird es schlimmer statt besser. Der Kopfbereich ist eine
   Tabellenzelle (.page-header.dtable > .dcell), und eine Tabellenzelle waechst auf
   die Mindestbreite ihres Inhalts: der Kasten ging auf 474 px auf, waehrend das
   Fenster 375 px breit ist, und weil der Parent auf dem body overflow: hidden
   setzt, war das Wort rechts einfach abgeschnitten statt umgebrochen.
   Trennmuster sind in Chromium eine nachladbare Komponente und in einem
   Pruefbrowser oft gar nicht vorhanden. Eine Zusage, die an einer solchen
   Komponente haengt, ist nicht pruefbar, also darf sie die Sache nicht tragen.

   Tragend ist deshalb die Schriftgroesse: 7vw ergeben bei 375 px Fenster 26 px und
   damit 324 px Wortbreite in einer 345 px breiten Spalte. Die Untergrenze 22 px
   haelt den Titel auch bei 320 px lesbar, die Obergrenze 36 px ist der bisherige
   Wert, den jedes Fenster ab etwa 515 px wieder erreicht.
   hyphens bleibt als Zugabe fuer Browser, die Trennmuster mitbringen, und
   overflow-wrap als letzte Reissleine: ein Umbruch ist immer besser als ein
   abgeschnittenes Wort.
   Gilt fuer jede Seite mit Kopfbereich, nicht nur fuer diese. */
.page-header .page-title {
  word-break: normal;
  overflow-wrap: break-word;
  hyphens: auto;
  -webkit-hyphens: auto;
}
@media (max-width: 767px) {
  .page-header .page-title { font-size: clamp(22px, 7vw, 36px); }
}


/* gtp-unterseiten
   ==================================================================
   Bausteine der Leistungs-Unterseiten. Angelegt fuer /pulverbeschichtung/,
   die als Blaupause fuer die uebrigen Unterseiten dient: jede Regel hier ist
   deshalb ueber eine Klasse angesprochen und nicht ueber eine Seiten-Id.

   Was ueber Elementor-Regler geht (Flaechen, Rahmen, Radien, Abstaende,
   Schriftgroessen, Farben, Bewegungseffekte), steht in den Widget-Einstellungen
   und bewusst NICHT hier. Hier steht nur, was kein Regler kann.
   Die beiden Signatur-Bausteine (Vorher/Nachher-Schieber, RAL-Farbband) bringen
   ihr eigenes CSS mit und stehen in p57/widgets/, nicht in dieser Datei.
   ================================================================== */

/* --- 1. Vollbreite: die Theme-Kaesten geben die Breite frei ------------- */
/* Elementors "Full Width" ist nur die Breite des ELTERN-Kastens, und der ist
   hier das Theme-Raster: gemessen 1170 px, beginnend bei x=48 im 1265 px
   breiten Fenster. Eine Sektion mit content_width=full reicht damit nie an den
   Fensterrand, ganz gleich, was in Elementor eingestellt ist.

   Der uebliche Griff dafuer waere width:100vw plus negative Raender. Der ist
   hier falsch: 100vw zaehlt die Rollleiste mit (gemessen 1280 gegen 1265
   nutzbare Breite), die Sektion waere 15 px zu breit, und weil das Theme auf
   dem body overflow:hidden setzt, saehe man den Fehler nicht, er stuende nur im
   waagerechten Ueberlauf. Stattdessen werden die drei Theme-Kaesten selbst
   freigegeben. Das ist exakt und braucht keine Rechnung.

   :has() statt einer Seiten-Id, damit jede kuenftige Unterseite dieselbe
   Behandlung bekommt, sobald sie eine Sektion mit .gtp-vollbreit traegt.
   Faellt :has() aus (sehr alter Browser), bleibt die Seite im Theme-Raster:
   ohne Vollbreite, aber unbeschaedigt. */
#content .container:has(.gtp-vollbreit) {
  width: 100%;
  max-width: none;
  padding-left: 0;
  padding-right: 0;
}
#content .row:has(.gtp-vollbreit) {
  margin-left: 0;
  margin-right: 0;
}
#content #primary:has(.gtp-vollbreit) {
  padding-left: 0;
  padding-right: 0;
}

/* --- 2. Halbes Bild: Text im Raster, Bild bis zur Fensterkante ---------- */
/* Der dunkle Banner ist zweigeteilt: links Text, der auf der Rasterkante der
   uebrigen Seite steht, rechts ein Bild, das bis an den Fensterrand laeuft.

   Der Innenabstand links rechnet die Rasterkante selbst aus, aus der einen
   gemessenen Konstanten oben: `calc(50% - var(--gtp-raster-halb))` ergibt bei
   1280 px Fensterbreite 55 px, und genau dort beginnt jede Ueberschrift der
   Seite. Prozente im padding beziehen sich auf die Breite des ELTERN-Kastens,
   und der ist dank Block 1 das Fenster. Deshalb ohne vw und damit ohne den
   Rollleisten-Fehler. max() faengt schmale Fenster ab.

   Bis zum 29.08.2026 stand hier die feste Zahl 570, also ein 1140er Raster.
   Der Kommentar behauptete dazu, das treffe den Rand des Rasters; gemessen
   stand die Ueberschrift dieses Banners damit 15 px weiter innen als jede
   andere Ueberschrift der Seite. */
/* .e-con davor ist noetig, nicht Zierde: Elementor setzt den Innenabstand als
   Kurzform padding: var(--padding-*) auf .e-con (Spezifitaet 0,1,0). Eine
   Langform padding-left aus einer Regel mit 0,2,0 schlaegt den linken Anteil
   dieser Kurzform, ohne dass die uebrigen drei Seiten verloren gehen. */
.e-con.gtp-halbbild {
  padding-left: max(20px, calc(50% - var(--gtp-raster-halb)));
  padding-right: 0;
}
.gtp-halbbild .gtp-halbbild__bild img {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 380px;
  object-fit: cover;
}
.gtp-halbbild .gtp-halbbild__bild,
.gtp-halbbild .gtp-halbbild__bild .elementor-widget-container {
  height: 100%;
}
@media (max-width: 1024px) {
  /* Untereinander: der Text bekommt wieder seitlichen Rand, das Bild sein
     eigenes Verhaeltnis. Ein randloses Vollhoehenbild waere hier sinnlos.

     DER RAND IST DIESELBE RECHNUNG WIE OBEN UND KEINE FESTE 20.
     Bis zum 31.08.2026 stand hier `20px`. Das traf die Rasterkante nur unter
     768 px; darueber wandert sie mit der Treppe des Themes, und die
     Ueberschrift dieses Banners stand dann bis zu 115,5 px weiter aussen als
     die daneben. Die Zahl bleibt als Boden im max() stehen, wo sie hingehoert:
     sie ist der Rand des Themes auf der untersten Stufe. */
  .e-con.gtp-halbbild {
    padding-left: max(20px, calc(50% - var(--gtp-raster-halb)));
    padding-right: max(20px, calc(50% - var(--gtp-raster-halb)));
  }
  .gtp-halbbild .gtp-halbbild__bild img {
    height: auto;
    min-height: 0;
    aspect-ratio: 4 / 3;
    border-radius: 10px;
  }
}

/* --- 3. Ablauf-Kacheln: dieselbe Geste wie die Kennzahl-Kacheln --------- */
/* Werte 1:1 aus dem WPCode-Schnipsel "CSS counter" (.gtp-stat:hover), damit
   sich auf der ganzen Website jede Karte beim Ueberfahren gleich verhaelt. */
.gtp-schritt {
  transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.gtp-schritt:hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 28px rgba(2, 54, 112, .12);
  border-color: #c9d6ea;
}

/* --- 4. Bewegung nur, wenn sie gewuenscht ist --------------------------- */
/* Elementors Eingangs-Animationen setzen elementor-invisible und machen das
   Element erst per Skript sichtbar. Wer Bewegung abbestellt hat, saehe damit
   eine leere Seite. Deshalb: Animation aus UND Sichtbarkeit sofort. */
@media (prefers-reduced-motion: reduce) {
  .elementor-invisible,
  .elementor .animated {
    visibility: visible !important;
    opacity: 1 !important;
    animation: none !important;
    transform: none !important;
  }
  .gtp-schritt { transition: none; }
}

/* --- 5. Referenz-Teaser: Raster fuer drei Kacheln ---------------------- */
/* Die Kachel selbst kommt unveraendert aus .gtp-ref-karte weiter oben. Hier steht
   nur das Raster, weil das Parent-Raster (.projects-masonry .project-item) an
   Isotope haengt: dort setzt JavaScript jede Kachel absolut, und ohne die
   Widget-Initialisierung bekaemen die Kacheln gar keine Breite.
   `align-items: stretch` ist der Grund, warum die drei Karten gleich hoch sind:
   .gtp-ref-karte traegt bereits `height: 100%`. */
.gtp-ref-teaser {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 30px;
  align-items: stretch;
}
.gtp-ref-teaser .project-item {
  float: none;
  width: auto;
  padding: 0;
  margin: 0;
  display: flex;
}
@media (max-width: 1024px) {
  .gtp-ref-teaser { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
}
@media (max-width: 767px) {
  .gtp-ref-teaser { grid-template-columns: minmax(0, 1fr); gap: 20px; }
}

/* --- 6. Haken-Listen: Zeichen und Text auf einer Grundlinie ------------- */
/* Betrifft die beiden Vergleichskarten und den dunklen Banner. Das Theme setzt
   Zeichen und Text nebeneinander, laesst aber keinen Abstand dazwischen: im Banner
   klebte der Haken am Wort ("gemessen: 0 px"). Und weil das Zeichen ein Inline-SVG
   ohne Masse ist (siehe Block 1), braucht es auch hier eine feste Groesse, sonst
   waechst es mit der Zeilenhoehe eines zweizeiligen Punktes mit.
   Die 3 px Versatz nach unten setzen das Zeichen auf die Grundlinie der ersten
   Textzeile statt an die Oberkante des Kastens. */
.gtp-liste .ot-icon-list-item {
  display: flex;
  align-items: flex-start;
  gap: 12px;
}
.gtp-liste .ot-icon-list-icon {
  flex: 0 0 auto;
  margin: 3px 0 0;
  width: 14px;
  height: 14px;
}
.gtp-liste .ot-icon-list-icon svg,
.gtp-liste .ot-icon-list-icon i {
  display: block;
  width: 14px;
  height: 14px;
  font-size: 14px;
  fill: currentColor;
}
.gtp-liste .ot-icon-list-text { display: block; }

/* --- 7. Versale Schlagzeilen: mitwachsend statt fest ------------------- */
/* Die Schlagzeilen sind versal und deshalb breiter als in Gemischtschreibung.
   "PULVERBESCHICHTUNG" misst als einzelnes Wort 12,35 px je Schriftgrad-Pixel
   (nachgemessen: 321 px bei 26 px). Die Spalte ist Fensterbreite minus 40 px
   Innenabstand. Daraus folgt die Obergrenze fuer den Grad:
   bei 390 px Fenster 27,1 px, bei 320 px Fenster nur 21,5 px.
   Ein fester Wert kann beides nicht: 26 px passt bei 390 und bricht bei 320
   mitten im Wort. 6,5vw ergibt 25,4 px bzw. 20,8 px und bleibt in beiden
   Faellen unter der Grenze. Elementor kennt keinen clamp-Regler, deshalb hier.

   Die Klasse gtp-versal traegt jede Schlagzeile dieser Seite; damit gilt die
   Regel auch fuer jede kuenftige Unterseite, ohne dass eine Seiten-Id im
   Selektor steht. Der Selektor muss die ELEMENTOR-Regel schlagen, die bei
   0,4,0 liegt, deshalb .elementor davor plus die eigene Klasse. */
@media (max-width: 767px) {
  .elementor .gtp-versal.elementor-widget .ot-heading__title {
    font-size: clamp(20px, 6.5vw, 42px);
    line-height: 1.18;
  }
}

/* --- 8. Knoepfe brechen auf sehr schmalen Fenstern um ------------------ */
/* Das Theme gibt seinen Knoepfen white-space: nowrap und 40 px Innenabstand
   je Seite. Bei 320 px Fenster ragte "Mehr zur Vorbehandlung" dadurch 34 px
   ueber die rechte Kante (nachgemessen); die uebrigen vier Knoepfe der Seite
   passten. Statt den Text zu kuerzen darf der Knopf hier umbrechen und traegt
   weniger Innenabstand. Erst unter 480 px, darueber bleibt alles wie gehabt. */
@media (max-width: 480px) {
  .gtp-knopf .octf-btn {
    max-width: 100%;
    white-space: normal;
    text-align: center;
    padding-left: 24px;
    padding-right: 24px;
  }
}

/* --- 9. Abschluss-Sektion sitzt buendig auf dem Fussbereich ------------- */
/* Das Theme gibt dem Inhaltsbereich unten 120 px Luft (style.css:2174,
   `.entry-content { padding: 100px 0 120px }`). Bei einer Seite, deren letzte
   Sektion ein vollflaechiger Banner ist, steht dieser Streifen dadurch auf
   einem 120 px hohen weissen Sockel ueber dem dunklen Fussbereich, und der
   Banner wirkt wie hineingelegt statt wie der Abschluss der Seite.

   Derselbe :has()-Weg wie in Block 1: die Regel haengt an einer Klasse auf der
   Sektion, nicht an einer Seiten-Id, und gilt damit fuer jede kuenftige
   Unterseite, die mit einem Vollbreiten-Banner endet. Nur der untere Abstand
   faellt, der obere bleibt, weil dort der Kopfbereich anschliesst.
   Spezifitaet 1,2,0 gegen 0,1,0 der Theme-Regel, deshalb ohne !important. */
#content .entry-content:has(.gtp-abschluss) { padding-bottom: 0; }

/* --- 10. Ablauf-Kacheln: Zeichen, Nummer als Wasserzeichen, Verbindung -- */
/* Ergaenzt Block 3 (Hover-Geste). Was ueber Elementor-Regler geht, steht
   weiterhin in den Widget-Einstellungen: Schriftgrad und Farbe der Nummer,
   das Zeichen selbst. Hier steht nur, was kein Regler kann. */

/* Der Kreis. 50x50 fest, damit er neben Titel und Text nicht mitwaechst und
   nicht zusammenfaellt: Elementors Zeichen-Regler setzt nur font-size, und die
   greift bei einem Inline-SVG nicht (dieselbe Falle wie in Block 6). */
/* Der Kreis steht LINKS, auf der Kante des Kachelinhalts. Elementor stellt ihn
   von Haus aus mittig und schreibt dafuer
   `.elementor-1629 .elementor-element.elementor-element-XXX .elementor-icon-wrapper
   { text-align: center }` in die Seiten-CSS, also mit Spezifitaet 0,4,0 und mit
   der Seiten-Id im Selektor. Ein Steuerelement dafuer gibt es in dieser Fassung
   nicht (nachgesehen: kein Control des icon-Widgets traegt diesen Selektor).
   Statt die Zahl zu ueberbieten (und dabei die Seiten-Id in eine Blaupausen-Regel
   zu holen) wird der Kasten zum Flex-Container: auf ein Flex-Kind wirkt
   text-align nicht mehr, die fremde Regel laeuft ins Leere statt verloren zu
   gehen. Deshalb reichen hier 0,3,0. */
.gtp-schritt .gtp-schritt__ikon .elementor-icon-wrapper {
  display: flex;
  justify-content: flex-start;
}
.gtp-schritt .gtp-schritt__ikon .elementor-icon {
  display: inline-grid;
  place-items: center;
  width: 50px;
  height: 50px;
  flex: 0 0 auto;
  padding: 0;
  border-radius: 50%;
  background: rgba(0, 79, 239, .10);
  transition: background-color .25s ease;
}
/* svg mit Klasse, damit der Selektor die eingebettete Theme-Regel schlaegt
   (0,3,1 gegen 0,2,1), sonst fuellt das Zeichen seinen Kasten aus. */
.gtp-schritt .gtp-schritt__ikon svg.e-font-icon-svg {
  width: 22px;
  height: 22px;
  fill: #004FEF;
  transition: fill .25s ease;
}
.gtp-schritt:hover .gtp-schritt__ikon .elementor-icon { background: #004FEF; }
.gtp-schritt:hover .gtp-schritt__ikon svg.e-font-icon-svg { fill: #FFFFFF; }

/* Die Nummer bleibt, tritt aber hinter den Inhalt: sie ordnet die Kacheln,
   ohne die Aufmerksamkeit vom Zeichen wegzuziehen. z-index -1 wirkt nur, weil
   die Kachel mit isolation einen eigenen Stapel aufmacht; ohne den lege die
   Nummer sich hinter die eigene weisse Flaeche der Kachel und waere weg. */
.gtp-schritt { isolation: isolate; }
.gtp-schritt .gtp-schritt__nr {
  position: absolute;
  top: 12px;
  right: 18px;
  z-index: -1;
  pointer-events: none;
}
.gtp-schritt .gtp-schritt__nr p { margin: 0; }

/* Die Verbindungslinie liegt IM Abstand zwischen zwei Kacheln (24 px, aus der
   Reihe) und auf der Mitte des Kreises (30 px Innenabstand oben + 25 px halber
   Kreis). Nur ab 1025 px: darunter stehen die Kacheln zwei-zweiig oder
   untereinander, eine waagerechte Linie waere dort falsch.
   left: 100% zielt auf die Kante des POLSTERkastens, die Kante des Rahmens
   liegt 1 px weiter aussen, deshalb die +1. */
@media (min-width: 1025px) {
  .gtp-schritt:not(:last-child)::before {
    content: "";
    position: absolute;
    /* Zwei Stellschrauben mit den Werten der Blaupause als Standard: eine Reihe
       ohne eigene Angabe rechnet weiter mit 55 px und 24 px, also genau wie
       bisher. Gesetzt werden sie nur dort, wo die Reihe enger steht (Block 13).
       Die Hoehe ist das Polster oben (30 px) plus der halbe Kreis (25 px); wer
       das Polster aendert, muss diese Zahl mitfuehren, sonst rutscht die Linie
       von der Kreismitte. Das Gate misst genau das nach. */
    top: var(--gtp-schritt-linie-y, 55px);
    left: calc(100% + 1px);
    width: var(--gtp-schritt-luecke, 24px);
    height: 1px;
    /* border: 0 ist nicht Zierde. Elementor gibt dem ::before der Sektion den
       Rahmen der Kachel mit (gemessen: border-width 1px, box-sizing border-box),
       und damit kann eine Hoehe von 1 px gar nicht entstehen: allein die beiden
       Rahmenkanten sind schon 2 px. Die Linie waere doppelt so dick wie
       beabsichtigt und ihre Farbe kaeme aus dem Rahmen statt von hier. */
    border: 0;
    background: #E3E7ED;
    pointer-events: none;
    transition: transform .25s ease;
  }
  /* Die Kachel hebt sich beim Ueberfahren um 4 px, und ein Pseudo-Element faehrt
     mit. Die Gegenbewegung haelt die Linie da, wo sie hingehoert: sie gehoert
     dem Abstand, nicht der Kachel. */
  .gtp-schritt:hover::before { transform: translateY(4px); }
}

/* Der gestapelte Zustand, also alles unter der Ein-Reihen-Breite. Elementor
   gibt der Kachel dort ueber `--width` die halbe Reihe (50 % zwischen 768 und
   1024 px) und stellt sie an den Zeilenanfang: gemessen bei 844 px eine Kachel
   von 360 px, links 0 px Luft, rechts 360 px. Das liest sich als abgeschnittene
   Reihe und nicht als Stapel.

   EINE Regel fuer beide Seiten, kein Seiten-Sonderweg. Gesetzt wird `width`
   und nicht `--width`: die Variable kommt aus der Seiten-CSS
   (`.elementor-1629 .elementor-element.elementor-element-a2106e1`, Spezifitaet
   0,3,0) und waere von hier nicht zu erreichen, ohne die Seiten-Id in eine
   Blaupausen-Regel zu holen. `width` dagegen setzt Elementor auf `.e-con`
   (0,1,0); `.e-con.gtp-schritt` schlaegt das mit 0,2,0 und ist damit von der
   Ladereihenfolge der Blaetter unabhaengig.

   min(100%, 560px) trifft beide Stapel-Regime mit derselben Zahl: zwischen 768
   und 1024 px deckelt es die halbe Reihe auf ein lesbares Mass, unter 768 px
   (wo die Kachel schon 100 % traegt) greift es erst, wenn die Reihe breiter als
   560 px ist. Ohne den Deckel spraenge die Kachel an der 767er Grenze von
   560 px auf 727 px, also genau dort breiter, wo das Fenster schmaler wird.

   margin-inline: auto verteilt den Rest auf beide Seiten. Das wirkt in beiden
   Regimen: unter 768 px steht die Kachel in einer Spalte (auto-Raender auf der
   Querachse), zwischen 768 und 1024 px allein in ihrer Zeile (auto-Raender auf
   der Hauptachse). In beiden Faellen schlagen auto-Raender das align-items des
   Elternkastens, deshalb braucht es dort nichts.

   WAS DAS FUER DIE ARBEIT IM EDITOR HEISST: unterhalb von 1025 px sind
   Elementors Regler "Breite" und "Aussenabstand" fuer diese Kachel ohne
   Wirkung. Sie schreiben `--width` und `margin` in die Seiten-CSS, und beides
   wird hier ueberschrieben. Wer die Stapel-Breite aendern will, aendert die
   560 an dieser Stelle, und zwar fuer beide Seiten zugleich. Im
   Ein-Reihen-Zustand ab 1025 px greifen die Regler unveraendert. */
@media (max-width: 1024px) {
  .e-con.gtp-schritt { width: min(100%, 560px); margin-inline: auto; }
}

@media (prefers-reduced-motion: reduce) {
  .gtp-schritt .gtp-schritt__ikon .elementor-icon,
  .gtp-schritt .gtp-schritt__ikon svg.e-font-icon-svg,
  .gtp-schritt::before { transition: none; }
}

/* --- 11. Vorlader bleibt bei abbestellter Bewegung liegen -------------- */
/* SITE-WEIT, nicht Sache einer einzelnen Seite. Gefunden beim Nachmessen des
   Massstab-Bausteins unter prefers-reduced-motion.

   Die Kette: Elementors frontend.css setzt in seinem eigenen
   `@media (prefers-reduced-motion: reduce)` die Regel
   `html * { transition-duration: 0s !important; transition-delay: 0s !important }`.
   Der Vorlader des Themes entfernt sich aber erst im transitionend-Rueckruf
   (`royal_preloader.min.js:34`, `_loadFinish`): er haengt `complete` an, das
   startet das Ausblenden, und ERST dessen Ende raeumt das Element weg. Mit
   Dauer 0 feuert transitionend nicht, der Rueckruf laeuft nie.

   Was liegen bleibt, ist nicht harmlos: nachgemessen 1265x900 px,
   position: fixed, z-index 2147483647, pointer-events: auto, opacity 0. Also
   unsichtbar und trotzdem ueber allem. `document.elementFromPoint` in der
   Bildmitte lieferte den Vorlader statt des Inhalts, auf 1629 wie auf der
   Startseite. Wer Bewegung abbestellt hat, konnte auf dieser Website nichts
   anklicken.

   Der Griff setzt am Endzustand an (`.complete` haengt der Vorlader selbst an,
   wenn er fertig ist), nicht am Vorlader ueberhaupt: waehrend des Ladens soll
   er weiter zu sehen sein. !important ist noetig, weil die Sichtbarkeit aus
   dem Theme-Stylesheet kommt. */
@media (prefers-reduced-motion: reduce) {
  #royal_preloader.complete { display: none !important; }
}

/* gtf-felgen
   ==================================================================
   Bausteine der Leistungsseite /felgenbeschichtung/. Sie erbt die
   Designsprache von /pulverbeschichtung/ (Blaupause), deshalb steht hier nur,
   was auf der Blaupause noch nicht vorkam: die Iconboxen auf farbigem Grund,
   die senkrechte Prozesslinie und die Zwei-Kachel-Lage des Referenz-Teasers.

   Wie oben gilt: was ueber Elementor-Regler geht (Flaechen, Farben, Abstaende,
   Schriftgroessen), steht in den Widget-Einstellungen und bewusst NICHT hier.
   Die beiden Signatur-Bausteine (Finish-Studio, Schichtaufbau) bringen ihr
   eigenes CSS mit und stehen in p57/widgets/, nicht in dieser Datei.

   Jede Regel haengt an einer Klasse, keine an der Seiten-Id: sie gilt damit
   fuer jede weitere Unterseite, die dieselben Bausteine benutzt.
   ================================================================== */

/* --- 12. Iconboxen auf farbigem Grund ---------------------------------- */
/* Dieselbe Geste wie der Zeichenkreis der Ablauf-Kacheln (Block 10), nur auf
   Blau statt auf Weiss: heller Kreis mit weissem Zeichen statt blauem Kreis
   mit blauem Zeichen.

   Warum ueberhaupt eine Regel, wo das Widget doch Regler fuer Kreisfarbe und
   Zeichengroesse hat: der Kreis kommt beim Theme aus `padding` um ein Zeichen
   herum (`.ot-view-stacked-1 .ot-icon-box__icon { padding: 17px }`). Damit
   haengt seine Groesse an der Zeichengroesse und ist nie exakt 50x50; und weil
   der Kasten `inline-flex` ist, schrumpft er neben einem zweizeiligen Titel
   mit. Beides ist im Gate eine Zahl (Icon-Container 1:1, hoechstens 2 px), und
   beides kann kein Regler. */
.gtf-usp .ot-icon-box__icon {
  flex: 0 0 50px;
  width: 50px;
  height: 50px;
  padding: 0;
  display: grid;
  place-items: center;
  margin-bottom: 0;
}
/* svg MIT Klasse, damit der Selektor die Theme-Regel `.ot-icon-box__icon svg`
   schlaegt (0,3,1 gegen 0,2,1), sonst fuellt das Zeichen seinen Kasten. */
.gtf-usp .ot-icon-box__icon svg.e-font-icon-svg {
  width: 22px;
  height: 22px;
  fill: currentColor;
}
/* Der Titel steht in Satzschreibung. Das Theme setzt ihn versal
   (`.ot-icon-box .icon-box-title { text-transform: uppercase }`), und ein
   Regler dafuer gibt es in dieser Fassung nicht. Versal waeren die vier Punkte
   vier Rufe nebeneinander; versal bleibt auf dieser Seite der Schlagzeile
   und den Labeln vorbehalten. */
.gtf-usp .icon-box-title {
  text-transform: none;
  word-break: normal;
}
/* Der Kasten steht oben buendig mit dem Kreis, nicht in der Mitte: bei zwei
   verschieden langen Titeln nebeneinander saehe eine Mittenausrichtung wie
   zwei verschiedene Grundlinien aus. */
.gtf-usp .ot-icon-box.box-content { align-items: flex-start; }
/* Der Kasten fuellt seine Rasterzelle. Ohne das sind zwei Punkte einer Reihe
   verschieden hoch, sobald der eine Titel eine Zeile mehr braucht, und die
   Zusage "Boxhoehen je Reihe identisch" waere gerissen. Der Inhalt bleibt oben,
   die Hoehe kommt vom Raster. */
.gtf-usp,
.gtf-usp .ot-icon-box { height: 100%; }

/* --- 13. Ablauf-Kacheln zu fuenft: dieselbe Kachel, engere Spur --------- */
/* Bis v1.1 stand hier die senkrechte Prozesslinie: fuenf Schritte untereinander,
   eigener Punkt, eigene Linie, eigene Klassen (.gtf-ablauf/.gtf-schritt). Sie
   ist ersatzlos entfallen, weil die Seite jetzt denselben Kachel-Baustein
   traegt wie die Blaupause (Block 3 fuer die Geste, Block 10 fuer Kreis,
   Wasserzeichen und Verbindung). Ein zweiter Ablauf-Stil neben dem der
   Blaupause waere genau der Kartenstil, den der Ableger nicht haben soll.

   Was bleibt, ist der Grund, aus dem es die Variante ueberhaupt gab: fuenf
   Kacheln in einer Reihe sind schmaler als vier. Bei 1140 px Rasterbreite sind
   es mit 18 px Spalte 213,6 px je Kachel statt 267 px. Deshalb genau zwei
   Aenderungen an der Blaupause, beide hier und beide als Zahl nachmessbar:

     1. Die Spalte faellt von 24 px auf 18 px (die Verbindungslinie liegt IM
        Abstand und muss deshalb mitfallen, sonst stuende sie 6 px in der
        naechsten Kachel).
     2. Das Polster faellt von 30/28 auf 26/22. Damit liegt die Kreismitte bei
        26 + 25 = 51 px statt bei 55 px, und die Linie geht mit.

   Alles andere (Flaeche, Rahmen, Radius, Kreis 50x50, Zeichen 22x22, Grad und
   Farbe von Nummer, Titel und Fliesstext, Hover-Geste) kommt unveraendert aus
   Block 3 und Block 10. Das Gate vergleicht es Wert fuer Wert gegen 1629. */
.gtf-ablauf5 {
  --gtp-schritt-luecke: 18px;
  --gtp-schritt-linie-y: 51px;
}

/* --- 14. Referenz-Teaser mit ZWEI Kacheln ------------------------------ */
/* Block 5 setzt drei Spalten. Wo nur zwei Referenzen einer Kategorie
   vorliegen, stuende rechts eine leere Rasterzelle. Die Regel greift ueber
   `:has()` genau dann, wenn die zweite Kachel zugleich die letzte ist, und
   laesst den Dreier-Fall der Blaupause unberuehrt. */
@media (min-width: 1025px) {
  .gtp-ref-teaser:has(.project-item:nth-child(2):last-child) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* --- 15. Vergleichskarten: die Akzentkante ----------------------------- */
/* Die zwei Karten des Einwand-Abschnitts auf 1630 sind Wert fuer Wert die
   Karten aus 1629 (Nasslack/Pulver): Flaeche #FFFFFF, Rahmen 1 px #E3E7ED,
   Radius 14, Polster 32/30 und mobil 24/22, Titel 21/700/28, Liste 16/400/26.
   Der EINE Unterschied ist die Kante oben, und sie steht deshalb hier und
   nicht als Rahmenbreite in den Widget-Einstellungen: eine dickere obere
   Rahmenkante wuerde `border-width` und `border-color` der Karte veraendern,
   also genau zwei der neunzehn Stilwerte, gegen die das Gate byte-gleich
   prueft. Ein innerer Schatten laesst alle neunzehn stehen und zeichnet die
   Kante zugleich sauber in den Radius hinein: innere Schatten werden am
   Polsterkasten beschnitten, die Kante folgt also der runden Ecke, statt sie
   zu ueberfahren.

   Bewegung: `.e-con` fuehrt `box-shadow` bereits in seiner Uebergangsliste
   (gemessen: `background, border, box-shadow, transform` mit
   `0.3s, 0.3s, 0.3s, 0.4s`). Weil hier keine Hover-Regel steht, bleibt der
   Schatten fest, und die Karten verhalten sich beim Ueberfahren wie die auf
   1629, also gar nicht. */
.gtp-vgl { box-shadow: inset 0 4px 0 var(--gtp-vgl-akzent, transparent); }
.gtp-vgl--zurueck { --gtp-vgl-akzent: #68768C; }
.gtp-vgl--blau    { --gtp-vgl-akzent: #004FEF; }

/* Die Schlusszeile ist Fliesstext und keine Karte. Der Verweis steht als
   eigener Absatz darunter; sein Aussehen kommt unveraendert aus
   `.gtp-ref-cta-link` weiter oben, damit die Website genau EINEN Textlink-Stil
   fuehrt. Die Absatzabstaende stehen hier, weil der Abstand zwischen den
   beiden Absaetzen sonst der des Themes waere und mit jedem Theme-Update
   wandern koennte. */
.gtp-vgl-schluss p { margin: 0; }
.gtp-vgl-schluss p + p { margin-top: 14px; }

/* --- 16. Werkstoff-Gattung: der Hero sitzt auf der Kopfkante ------------- */
/* Die vier Werkstoffseiten (Stahl, Aluminium, verzinkter Stahl, Edelstahl)
   sind eine eigene Gattung mit eigener Flaechenfolge, und die beginnt mit
   einem dunklen Hero, der unmittelbar unter der Kopfzeile anfaengt.

   WARUM DAS EINE REGEL BRAUCHT
   ----------------------------
   Das Theme gibt dem Inhaltsbereich oben 100 px Luft (style.css:2174,
   `.entry-content { padding: 100px 0 120px }`). Auf den Leistungsseiten faellt
   das nicht auf, weil deren erste Sektion weiss auf weissem Grund steht. Ein
   Hero in #0C2148 legte sich damit auf einen 100 px hohen weissen Sockel, und
   zwischen Kopfzeile und Hero stuende ein heller Streifen quer ueber die
   Seite. Der Auftrag verlangt an dieser Kante ausdruecklich 0,00 px.

   Derselbe :has()-Weg wie in Block 1 und Block 9: die Regel haengt an einer
   Klasse auf der Sektion, nicht an einer Seiten-Id, und gilt damit fuer jede
   kuenftige Werkstoffseite, sobald sie mit einem Vollbreiten-Hero anfaengt.
   Block 9 nimmt den unteren Abstand, dieser hier den oberen; zusammen sitzt
   eine Gattungsseite buendig zwischen Kopf und Fuss. Spezifitaet 1,2,0 gegen
   0,1,0 der Theme-Regel, deshalb ohne !important.

   Faellt :has() aus (sehr alter Browser), steht der Hero auf seinem Sockel:
   weniger schoen, aber unbeschaedigt. */
#content .entry-content:has(.gtw-hero) { padding-top: 0; }

/* --- 17. Werkstoff-Gattung: der Deckel auf der Hero-Textspalte ----------- */
/* Der Hero benutzt die Bleed-Geste aus Block 2 (`.gtp-halbbild`): der Text
   steht auf der Rasterkante der uebrigen Seite, das Bild laeuft bis an die
   rechte Fensterkante. Damit waechst die Textspalte mit dem Fenster, weil sie
   die Haelfte des Rests bekommt.

   GERECHNET, NICHT GERATEN. Die Spalte ist `50%` der Breite ab der
   Rasterkante, abzueglich 40 px Fuge zum Bild:
       1280 px  ->  (1280 - 55) / 2 - 40   =  572,5 px
       1920 px  ->  (1920 - 375) / 2 - 40  =  732,5 px
       2560 px  ->  (2560 - 695) / 2 - 40  =  892,5 px
   Die Rasterkante ist dabei `calc(50% - var(--gtp-raster-halb))` mit den
   gemessenen 585 px der oberen Stufe, also dieselbe eine Zahl wie ueberall.

   Bis 2500 px passiert hier nichts. Darueber wuerde die Einleitung ueber 870
   px breit, und drei Saetze in einer Zeile von knapp 900 px lesen sich nicht
   mehr: die Zeile wird zu lang, um das Auge zurueckzufuehren. Der Deckel
   haelt sie an, wo die Bleed-Geste sonst weiterliefe. Das Bild bleibt davon
   unberuehrt und laeuft weiter bis zur Fensterkante; nur die Spalte hoert
   auf zu wachsen. */
.gtw-hero .gtw-hero__text { max-width: 870px; }

/* --- 18. Werkstoff-Gattung: der Verweis in der Verweis-Karte ------------- */
/* Die drei Karten der Werkstoffseiten sind der Kartenstil der Bibliothek
   (`.gtf-usp`), zusaetzlich verlinkt: der Titel fuehrt auf die Leistungsseite,
   von der die Karte spricht. Das Theme macht daraus ein `a` im `h3` und faerbt
   es ueber `title_color` weiss; sichtbar ist damit nichts, was einen Verweis
   von einer Ueberschrift unterscheidet. Auf einer Karte, die "Verweis-Karte"
   heisst, ist das zu wenig: klickbar zu sein und klickbar auszusehen ist nicht
   dasselbe.

   NUR DIE UNTERSTREICHUNG, SONST NICHTS. Farbe, Schriftgrad, Gewicht,
   Zeilenhoehe, Polster und Radius bleiben die der Bibliothek; das Gate misst
   die neunzehn gerechneten Stilfelder gegen 1630, 1982 und 1983 und findet
   sie zeichengleich. `text-decoration` gehoert nicht zu diesen neunzehn, und
   das ist kein Schlupfloch, sondern die Stelle, an der sich ein Verweis von
   einer Ueberschrift unterscheiden DARF.

   Die Regel haengt an `.gtw-verweis`, also am Raster dieser Gattung, und nicht
   an `.gtf-usp`: die zwoelf Iconboxen auf 1630, 1982 und 1983 sind keine
   Verweise und bekommen deshalb auch keinen Strich. Beim Ueberfahren wird der
   Strich dicker statt die Farbe anders; auf dem Blau haelt nur Weiss die
   Textschwelle, ein zweiter Ton waere ein Rueckschritt (die C6D0E0-Falle). */
.gtw-verweis .gtf-usp .icon-box-title a {
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
  transition: text-decoration-thickness .2s ease;
}
.gtw-verweis .gtf-usp .icon-box-title a:hover,
.gtw-verweis .gtf-usp .icon-box-title a:focus-visible {
  text-decoration-thickness: 2px;
}
@media (prefers-reduced-motion: reduce) {
  .gtw-verweis .gtf-usp .icon-box-title a { transition: none; }
}

/* --- 19. Werkstoff-Gattung: das Bild nimmt, was der Deckel freigibt ------ */
/* Block 17 deckelt die Textspalte bei 870 px. Die Bildspalte daneben steht auf
   `width: 50%`, und die zwei zusammen fuellen die Reihe dann nicht mehr aus:
   bei 2560 px Fenster sind es 870 + 932,5 = 1802,5 von 1865 verfuegbaren, also
   bleiben **62,5 px** als Navy-Streifen zwischen Text und Bild stehen. Das Bild
   endet dort, wo es randlos weiterlaufen soll.

   Gemessen, nicht vermutet: das Gate meldete bei 2560 px genau diese 62,5 px
   Abstand zur rechten Fensterkante, bei 1280 und 1920 null. Der Fehler ist
   also erst durch den Deckel entstanden, und er gehoert zu ihm.

   `flex-grow: 1` laesst die Bildspalte den Rest nehmen, ohne dass eine zweite
   Zahl gepflegt werden muss: die 50 % bleiben ihre Grundbreite, das Wachstum
   folgt dem, was der Deckel uebrig laesst. Die Textspalte waechst nicht mit,
   weil ihr `max-width` sie haelt.

   Nur ab 1025 px: darunter stapeln die beiden (`.gtp-halbbild` gibt dem Bild
   dort ein eigenes Seitenverhaeltnis), und in einer Spalte wuerde `flex-grow`
   die HOEHE strecken statt die Breite. */
@media (min-width: 1025px) {
  .gtw-hero .gtw-hero__bild { flex-grow: 1; }
}

/* --- 20. Werkstoff-Gattung: der Pfeil-Link ------------------------------ */
/* Die Werkstoffseiten fuehren zwei Verweise, die dasselbe tun: weiterschicken.
   In der Weiche steht ZUM WERKSTOFF, in der Schlusszeile des Einwands FOTO
   SCHICKEN. Sie sahen verschieden aus, obwohl sie dieselbe Rolle haben: der
   eine versal und unterstrichen, der andere ein Fliesstext-Link in einer
   anderen Farbe. Ab hier ist es ein Aussehen: Versal, Unterstrich, Pfeil.

   WARUM DER PFEIL HIER STEHT UND NICHT ZWEIMAL
   --------------------------------------------
   Er ist die einzige Zutat, die beide neu bekommen, und er steht deshalb in
   EINER Regel fuer beide Waehler. Die uebrigen Werte (12/700/20, Laufweite
   .08em, Versalsatz, #13366D) stehen weiterhin an zwei Stellen, weil die
   Weiche ein HTML-Widget mit eigener CSS ist und diese Datei site-weit gilt.
   Das ist derselbe bezahlte Preis wie bei den drei Schriftwerten der
   Weiche-Karten, und er wird auf dieselbe Weise bezahlt: DAS GATE MISST BEIDE
   VERWEISE GEGENEINANDER, statt ihre Gleichheit zu glauben.

   WARUM DER PFEIL KEIN ZEICHEN IST
   --------------------------------
   Ein Pfeil als Schriftzeichen (U+2192) waere Inhalt und wuerde vorgelesen
   ("Pfeil nach rechts"), obwohl er nichts sagt, was der Text nicht sagt. Ein
   `::after` mit leerem Inhalt aus zwei Rahmenkanten ist Zierrat und bleibt
   stumm. Streng geometrisch ist er ohnehin: zwei gerade Kanten, um 45 Grad
   gedreht.

   WARUM DIE UNTERSTREICHUNG DIE ALTE KANTE ERSETZT
   ------------------------------------------------
   `.gtp-ref-cta-link` traegt oben eine durchsichtige untere Rahmenkante, die
   beim Ueberfahren sichtbar wird. Zusammen mit einer festen Unterstreichung
   waeren das zwei Striche uebereinander. Die Kante wird deshalb in diesem
   Umfeld auf null gesetzt, und das Ueberfahren wechselt stattdessen die Farbe,
   genau wie in der Weiche.

   UMFANG: die Klasse `gtp-vgl-schluss` steht auf genau drei Seiten (1630, 1632
   und 1967), und `.gtp-ref-cta-link` allein bleibt unberuehrt. Die Startseite
   791 fuehrt denselben Link ausserhalb einer Schlusszeile und aendert sich
   damit nicht; das Gate misst es nach. */
.gtp-vgl-schluss .gtp-ref-cta-link {
  font-family: "Archivo", "Archivo Expanded", system-ui, sans-serif;
  font-size: 12px;
  font-weight: 700;
  line-height: 20px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--brand-link);
  text-decoration: underline;
  text-underline-offset: 3px;
  border-bottom: 0;
}
.gtp-vgl-schluss .gtp-ref-cta-link:hover,
.gtp-vgl-schluss .gtp-ref-cta-link:focus-visible {
  color: #004FEF;
  border-bottom: 0;
}

.gtp-vgl-schluss .gtp-ref-cta-link::after,
.gtw-weiche .gtw-weiche__link::after {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-left: 9px;
  border-top: 2px solid currentColor;
  border-right: 2px solid currentColor;
  transform: rotate(45deg);
  vertical-align: 1px;
}

/* gto-oberflaechen
   ==================================================================
   Die dritte Gattung dieser Website: das MUSTER-STUDIO. Sie steht auf
   genau einer Seite (1635 "Farben & Oberflaechen") und hat einen anderen
   Charakter als die zwei aelteren: die Leistungsseiten erzaehlen einen
   Ablauf, die Werkstoffseiten erzaehlen einen Werkstoff, diese hier ist
   ein KATALOG und ein STUDIO. Dichte Kachelraster statt Erzaehlstrecke.

   WAS HIER STEHT UND WAS NICHT
   ----------------------------
   Hier steht das VOKABULAR der Gattung, also alles, was mehr als ein
   Baustein braucht: die zwoelf RAL-Naeherungen, die Musterplatte samt
   Kante, das Lichtband, die Koernung, der Hero und der Pfeil-Verweis.
   Sieben Bausteine zeigen Musterflaechen, und wenn jeder seine eigene
   Platte zeichnete, waeren es sieben Plattenstile, die am Bautag gleich
   aussehen und beim ersten Fix auseinanderlaufen. Was ein Baustein ALLEIN
   braucht, steht dagegen in seiner eigenen CSS in
   p57/widgets/oberflaechen/ und kommt ueber dieselbe Fuge wie jedes andere
   HTML-Widget dieses Projekts.

   ADDITIV, UND ZWAR NACHWEISLICH. Kein Waehler dieser Bloecke trifft eine
   Regel oder ein Element der zwei aelteren Gattungen: alles haengt an
   `gto-`. Der Bestandsschutz ist gemessen, nicht behauptet (Baum-SHA aller
   Bestandsseiten vorher/nachher, dazu ein reiner Anhang-Diff dieser Datei).
   ================================================================== */

/* --- 21. Das Vokabular: Toene, Platte, Licht, Korn ---------------------- */
/* WARUM DIE ZWOELF TOENE HIER STEHEN UND NICHT IM BAUSTEIN
   -------------------------------------------------------
   Sie werden an DREI Stellen gezeigt: im Studio (S3, als Flaeche der
   Buehne), in der Farbwelt (S6, als Kachelraster) und in der Signatur des
   Abschlusses (S9, als schmaler Streifen). Stuenden sie in den drei
   Bausteinen, stuenden sie dreimal da, und der erste Fix an einem Ton
   traefe zwei Stellen nicht. Ein Ton ist Vokabular dieser Website, genau
   wie --brand-onyx, und Vokabular steht in dieser Datei.

   ES SIND NAEHERUNGEN, UND DAS STEHT AUCH AUF DER SEITE
   -----------------------------------------------------
   Ein RAL-Ton ist eine Angabe fuer eine beschichtete Flaeche, kein
   Bildschirmwert: Bildschirm, Licht, Glanzgrad und Struktur veraendern die
   Wirkung. Verbindlich ist die RAL-Nummer am Teil. Die Seite sagt das an
   zwei Stellen im Klartext (unter dem Studio und in der Farbwelt), und
   studio.md fuehrt dieselbe Tabelle mit demselben Vorbehalt.

   DIE REIHENFOLGE IST DIE DES AUFTRAGS: von Verkehrsweiss zu Tiefschwarz,
   danach die vier Buntton-Beispiele. Sie ist an allen drei Stellen
   dieselbe, und das Gate misst es. */
:root {
  --gto-ral-9016: #F1F0EA;  /* Verkehrsweiss */
  --gto-ral-7035: #C5C7C4;  /* Lichtgrau */
  --gto-ral-9006: #A5A8A6;  /* Weissaluminium */
  --gto-ral-9007: #8F8F8C;  /* Graualuminium */
  --gto-ral-7024: #45494E;  /* Graphitgrau */
  --gto-ral-7016: #383E42;  /* Anthrazitgrau */
  --gto-ral-9005: #0E0E10;  /* Tiefschwarz */
  --gto-ral-3020: #BB1E10;  /* Verkehrsrot */
  --gto-ral-5010: #004389;  /* Enzianblau */
  --gto-ral-6005: #114232;  /* Moosgruen */
  --gto-ral-1023: #F7B500;  /* Verkehrsgelb */
  --gto-ral-8017: #442F29;  /* Schokoladenbraun */

  /* DIE PLATTENKANTE. Jede Musterflaeche dieser Gattung traegt sie.

     WARUM UEBERHAUPT EINE KANTE. #F1F0EA (Verkehrsweiss) liegt auf Weiss
     bei 1,14:1 und auf #F4F6F9 bei 1,09:1. Ohne Kante schwaemme die
     hellste Kachel auf der Seite, und ein Farbmuster ohne erkennbaren Rand
     ist keins.

     WARUM SIE AUF ALLEN LIEGT UND NICHT NUR AUF DEN HELLEN. Die Gattung
     zeigt Musterplatten, und ein Faecher aus Musterplatten hat an jeder
     Platte eine Kante. Eine Kante nur dort, wo sie noetig ist, sieht aus
     wie ein Fehler an den uebrigen elf.

     #68768C ist eine Stufe der Treppe dieses Projekts (die gedaempfte
     Akzentkante der Vergleichskarten, Block 15). Gemessen: 4,61:1 auf
     Weiss, 4,25:1 auf #F4F6F9. Damit traegt die Kante ueberall ueber der
     Grafik-Schwelle 3,0:1 gegen den Grund, auf dem die Platte liegt, und
     zwar unabhaengig vom Ton der Platte selbst. */
  --gto-kante: #68768C;
  --gto-radius: 12px;

  /* DAS LICHT ALS VIER LAGEN, DER GLANZGRAD SCHALTET SIE ZU (v2)
     -------------------------------------------------------------
     v1 hatte EINE Form (ein Band aus hellem Kern und zwei Flanken) und drei
     Zahlen, die sie verbogen. Auf dem Abzug waren Matt und Seidenglanz
     daraufhin kaum zu unterscheiden, und Glanz trug einen harten
     Einzelbalken, der wie aufgeklebtes Klebeband aussah. Das ist der
     Befund, an dem die Abnahme von v1 gescheitert ist.

     Der Grund ist keine falsche Zahl, sondern die eine Form: MATT IST NICHT
     EIN SCHMALERES BAND, MATT IST KEIN BAND. Eine matte Flaeche gibt das
     Licht in alle Richtungen zurueck; sie hat kein Glanzlicht, sondern nur
     ein Gefaelle. Solange alle drei Glanzgrade dieselbe Form tragen,
     unterscheidet sie nur die Deckkraft, und Deckkraft allein sieht man
     nebeneinander nicht.

     Jetzt sind es VIER Lagen mit je fester Form und je einem Regler:

       Kante   die schmale, harte Spiegelkante samt Bluete drumherum.
               Nur Glanz hat sie. Sie ist eine Spiegelung und kein Balken:
               heller Kern von 1,4 Prozent Breite, Bluete von je gut
               1,7 Prozent, und beides laeuft von Kante zu Kante durch.
       Schein  der breite, weiche Sekundaerschein. Seide und Glanz haben
               ihn, matt nicht.
       Tiefe   die dunklen Flanken. Sie machen aus einer eingefaerbten
               Flaeche ein Blech: je glaenzender, desto tiefer.
       Diffus  das Gefaelle einer stumpfen Flaeche, von hell nach dunkel,
               ohne jeden Umkehrpunkt. Matt hat nur dieses.

     Gemessen wurde die Abnahme, nicht behauptet: paarweise mittlere
     absolute Bildpunkt-Differenz der drei Karten bei 1280 px auf RAL 3020,
     Schwelle 8 von 255 aus dem Auftrag. Matt gegen Seide 20,71, Matt gegen
     Glanz 29,35, Seide gegen Glanz 11,44.

     WARUM REGLER UND NICHT DREI FERTIGE BILDER. Der Zustandsplan des
     Studios kann keine KLASSE setzen, nur Variablen. Vier Zahlen je
     Glanzgrad sind im Zustandsplan und im Gate lesbar; drei ausgeschriebene
     Verlaufsstapel waeren es nicht. Die Klassen `.gto-g-*` weiter unten und
     die drei Regeln in studio.css lesen dieselben zwoelf Zahlen von hier.
     Eine Zahl, zwei Leser, kein Abschreiben. */
  --gto-matt-kante: 0;    --gto-matt-schein: 0;    --gto-matt-tiefe: 0.3;   --gto-matt-diffus: 1;
  --gto-seide-kante: 0;   --gto-seide-schein: 1;   --gto-seide-tiefe: 0.52;  --gto-seide-diffus: 0.34;
  --gto-glanz-kante: 1;   --gto-glanz-schein: 1;   --gto-glanz-tiefe: 1;  --gto-glanz-diffus: 0.12;

  /* DIE KOERNUNG: EIN RASTER, ZWEI GROESSEN (v2.1)
     ----------------------------------------------
     Bis v2 stand hier echtes Rauschen aus `feTurbulence`, vier erzeugte
     SVG-Kacheln mit Primzahl-Seiten, damit die Fuge der einen Lage nie mit
     der der anderen zusammenfaellt. Das war handwerklich sauber und
     gestalterisch falsch: eine Pulverbeschichtung mit Feinstruktur hat ein
     GLEICHMAESSIGES Korn, kein Rauschen. Auf dem Abzug las sich die Flaeche
     wie ein Foto mit Bildrauschen, also wie ein Fehler, und nicht wie eine
     Oberflaeche.

     Jetzt ist es ein strenges Punktraster, und zwar EINES fuer beide
     Strukturen. Je Kachel zwei Punkte: ein heller oben links, ein dunkler
     unten rechts. Das ist die Lichtrichtung dieser Seite (104 Grad, siehe
     `.gto-licht`) auf ein Korn uebertragen: ein Korn wird von links oben
     angeleuchtet und wirft seinen Schatten nach rechts unten.

     EIN WAHRHEITSORT, ZWEI GROESSEN. `--gto-korn-raster` steht einmal da;
     Feinstruktur und Struktur unterscheiden sich NUR in der Kachelgroesse,
     6 px gegen 13 px. Wer das Korn aendert, aendert eine Stelle und trifft
     beide Strukturen, die Buehne des Studios, die Formel-Miniatur 03 und die
     zwei Praxis-Zeilen mit Korn.

     WARUM 18 PROZENT. Die Prozente sind Farbstopps entlang des Strahls, und
     der Strahl geht bis zur fernsten Ecke der Kachel. Bei 6 px sind 18
     Prozent rund 1,07 px Radius, also ein Punkt von gut 2 px; bei 13 px sind
     es rund 2,3 px, also gut 4,6 px. Der harte Sprung von 18 auf 19 Prozent
     macht die Kante scharf: ein weicher Verlauf waere wieder ein Schleier
     und kein Korn.

     GLATT HAT KEIN MUSTER, und das ist die Aussage: die pure Flaeche. */
  --gto-korn-raster:
    radial-gradient(circle at 30% 30%, rgba(255, 255, 255, .30) 0 18%,
                                        rgba(255, 255, 255, 0) 19%),
    radial-gradient(circle at 80% 80%, rgba(0, 0, 0, .34) 0 18%,
                                        rgba(0, 0, 0, 0) 19%);
  --gto-korn-fein: var(--gto-korn-raster);
  --gto-korn-fein-mass: 6px 6px;
  --gto-korn-grob: var(--gto-korn-raster);
  --gto-korn-grob-mass: 13px 13px;
}

/* DIE MUSTERPLATTE, das Atom dieser Gattung.
   Buehne des Studios, Miniaturen der Formel, Karten der Glanzgrade,
   Zeilen der Strukturen, zwoelf Kacheln der Farbwelt, zwoelf Segmente der
   Signatur: alle sind dieselbe Platte in verschiedenen Groessen. Sie
   traegt ihren Ton, ihre Kante und ihren Radius, und sie ist der
   Bezugsrahmen fuer Licht und Korn darin.

   Ohne `--gto-ton` steht sie auf Anthrazitgrau. Das ist kein Platzhalter,
   sondern der Ton, mit dem das Studio startet und der auf dieser Website
   ohnehin der haeufigste ist. */
.gto-platte {
  position: relative;
  overflow: hidden;
  background-color: var(--gto-ton, var(--gto-ral-7016));
  border: 1px solid var(--gto-kante);
  border-radius: var(--gto-radius);
  /* Die vier Regler stehen HIER und nicht auf `.gto-licht`, und das ist
     kein Geschmack: eine eigene Deklaration auf dem Kind beschattet den
     geerbten Wert vom Elternknoten. Standen die Vorgaben auf `.gto-licht`,
     hatten `.gto-g-matt` und die zwei Schwestern keine Wirkung, und alle
     drei Karten sahen gleich aus. Gemessen: 0,16 von 255 Unterschied
     zwischen Matt und Seidenglanz, also nichts. Gefunden hat es der
     Tuning-Stand vor dem Einbau und nicht der Blick auf den Code. */
  --gto-licht-kante: 0;
  --gto-licht-schein: 0;
  --gto-licht-tiefe: .30;
  --gto-licht-diffus: 1;
}

/* DAS LICHT, IN VIER LAGEN. Was jede Lage tut und warum es vier sind,
   steht oben bei den zwoelf Zahlen; wie es sich anfuehlt, steht im Kopf von
   studio.css. Die Reihenfolge im Stapel ist die des Blicks: die
   Spiegelkante liegt oben, das Gefaelle einer stumpfen Flaeche unten.

   ALLE VIER LAGEN STEHEN IMMER DA, auch die abgeschalteten. Eine Lage mit
   dem Regler 0 rechnet ihre Deckkraft zu 0 und ist damit unsichtbar, aber
   vorhanden: so gibt es EINEN Verlaufsstapel auf der Seite und nicht drei,
   und der Zustandsplan des Studios braucht keine Klasse zu setzen, sondern
   nur vier Zahlen.

   104 Grad ist die Richtung des Lichts auf dieser Seite, dieselbe wie in
   v1. Alle vier Lagen tragen sie, sonst kreuzten sich zwei Lichtquellen auf
   einer Flaeche. */
.gto-licht,
.gto-korn {
  position: absolute;
  inset: 0;
}
.gto-licht {
  background-image:
    linear-gradient(104deg,
      rgba(255, 255, 255, 0) 30%,
      rgba(255, 255, 255, calc(.16 * var(--gto-licht-kante))) 35.2%,
      rgba(255, 255, 255, calc(.95 * var(--gto-licht-kante))) 36.9%,
      rgba(255, 255, 255, calc(.95 * var(--gto-licht-kante))) 38.3%,
      rgba(255, 255, 255, calc(.18 * var(--gto-licht-kante))) 40.2%,
      rgba(255, 255, 255, 0) 47%),
    linear-gradient(104deg,
      rgba(255, 255, 255, 0) 6%,
      rgba(255, 255, 255, calc(.09 * var(--gto-licht-schein))) 28%,
      rgba(255, 255, 255, calc(.30 * var(--gto-licht-schein))) 54%,
      rgba(255, 255, 255, calc(.08 * var(--gto-licht-schein))) 76%,
      rgba(255, 255, 255, 0) 97%),
    linear-gradient(104deg,
      rgba(0, 0, 0, calc(.36 * var(--gto-licht-tiefe))) 0%,
      rgba(0, 0, 0, calc(.11 * var(--gto-licht-tiefe))) 22%,
      rgba(0, 0, 0, 0) 50%,
      rgba(0, 0, 0, calc(.15 * var(--gto-licht-tiefe))) 76%,
      rgba(0, 0, 0, calc(.40 * var(--gto-licht-tiefe))) 100%),
    linear-gradient(104deg,
      rgba(255, 255, 255, calc(.12 * var(--gto-licht-diffus))) 0%,
      rgba(255, 255, 255, calc(.03 * var(--gto-licht-diffus))) 42%,
      rgba(0, 0, 0, calc(.04 * var(--gto-licht-diffus))) 72%,
      rgba(0, 0, 0, calc(.11 * var(--gto-licht-diffus))) 100%);
}
.gto-korn {
  background-image: var(--gto-korn, none);
  background-size: var(--gto-korn-mass, auto);
  background-repeat: repeat;
}

/* Die sechs Zustaende als Klassen. Das Studio setzt dieselben Werte ueber
   seinen Zustandsplan, weil eine CSS-Regel keine Klasse setzen kann; die
   ZAHLEN liest es von oben, genau wie diese sechs Klassen. */
.gto-g-matt  { --gto-licht-kante: var(--gto-matt-kante);  --gto-licht-schein: var(--gto-matt-schein);  --gto-licht-tiefe: var(--gto-matt-tiefe);  --gto-licht-diffus: var(--gto-matt-diffus); }
.gto-g-seide { --gto-licht-kante: var(--gto-seide-kante); --gto-licht-schein: var(--gto-seide-schein); --gto-licht-tiefe: var(--gto-seide-tiefe); --gto-licht-diffus: var(--gto-seide-diffus); }
.gto-g-glanz { --gto-licht-kante: var(--gto-glanz-kante); --gto-licht-schein: var(--gto-glanz-schein); --gto-licht-tiefe: var(--gto-glanz-tiefe); --gto-licht-diffus: var(--gto-glanz-diffus); }
.gto-s-glatt { --gto-korn: none;                     --gto-korn-mass: auto; }
.gto-s-fein  { --gto-korn: var(--gto-korn-fein);     --gto-korn-mass: var(--gto-korn-fein-mass); }
.gto-s-grob  { --gto-korn: var(--gto-korn-grob);     --gto-korn-mass: var(--gto-korn-grob-mass); }

/* Was nur gelesen und nicht gesehen wird. Der Kasten bleibt im Fluss und
   fokussierbar; `display: none` naehme ihn dem Vorleseprogramm mit weg.
   Steht hier und nicht im Baustein, weil ihn sechs der sieben brauchen. */
.gto-nurlesen {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --- 22. Der Hero der Gattung sitzt auf der Kopfkante ------------------- */
/* Dieselbe Lage wie Block 16 und derselbe Grund: das Theme gibt dem
   Inhaltsbereich oben 100 px Luft (style.css:2174), und ein Hero in
   #0C2148 laege damit auf einem weissen Sockel.

   WARUM EINE ZWEITE REGEL UND KEIN ZWEITER WAEHLER IN BLOCK 16
   ------------------------------------------------------------
   Block 16 gehoert der Werkstoff-Gattung. Wer ihn erweitert, aendert eine
   Regel, an der vier gebaute Seiten haengen, und muss sie danach alle vier
   neu belegen. Diese Regel hier haengt an `gto-hero`, trifft ausschliesslich
   die eine Seite dieser Gattung und laesst Block 16 zeichengleich stehen.
   Das ist der Preis fuer den Bestandsschutz, und er ist eine Zeile teuer.

   Faellt :has() aus, steht der Hero auf seinem Sockel: weniger schoen,
   aber unbeschaedigt. Genau wie in Block 1, 9 und 16. */
#content .entry-content:has(.gto-hero) { padding-top: 0; }

/* Die Textspalte des Heros. Kicker, H1 und Einleitung stehen auf der
   Rasterkante wie alles andere, aber sie duerfen nicht mit dem Raster
   mitwachsen: bei 1140 px Kastenbreite haette die Einleitung Zeilen von
   gut 150 Zeichen, und das Auge findet den Zeilenanfang nicht mehr
   zurueck. 760 px sind rund 90 Zeichen bei 17 px, also die obere Kante
   dessen, was sich noch liest.

   Der Deckel gilt NUR fuer den Text. Das Bild darunter nimmt die volle
   Rasterbreite; es ist die Musterplatte auf dem dunklen Tisch. */
.gto-hero .gto-hero__text { max-width: 760px; }

/* DAS HERO-BILD IST EIN BAND, KEIN EINGEKLEBTES FOTO (v2).
   v1 setzte den Faecher als Bild in den 1180er Kasten: mit weissem Rand,
   mit Radius, mit Kartenwirkung. Auf dem Abzug las sich der Hero damit als
   Textblock plus Abbildung, und die Seite fing an wie jede andere.

   Jetzt laeuft ob1 unmittelbar unter dem Textblock als randloses Band ueber
   die volle Fensterbreite: keine Rundung, kein Rahmen, kein Abstand nach
   unten. Der Faecher ist das Bild dieser Seite, und ein Bild, das die Seite
   traegt, hat keinen Rand.

   DAS BILD WIRD JETZT SEHR WOHL BESCHNITTEN, und die Begruendung von v1
   dreht sich damit um. Sie lautete: ein Faecher hat einen Anfang und ein
   Ende, wer ihn abschneidet, zeigt einen Streifen Farbe. Das gilt fuer die
   BREITE und nur fuer sie, und in der Breite wird weiterhin nichts
   abgeschnitten. In der HOEHE stehen ueber und unter dem Faecher Werkbank
   und Hallenboden, also Beiwerk; `object-position: center 46%` haelt den
   Faecher im Bild und schneidet das Beiwerk weg.

   DIE HOEHE STEHT NICHT HIER, SONDERN AM ELEMENTOR-REGLER VON `go00006`.
   Bis zum 31.08.2026 stand an dieser Stelle `height: clamp(380px, 32vw,
   560px)`, und die Zeile war wirkungslos. Gemessen (CSSOM, alle Regeln, die
   auf das Bild passen und `height` setzen, reports/p57-aufraeumen-v21/
   protokolle/12-warum-hoehe.json):

     post-1635.css  .elementor-1635 .elementor-element.elementor-element-go00006 …
                    700px / 100% ab 1024 / 192px ab 767      Gewicht (0,3,1)
     brand.css      .gto-hero .gto-hero-band img
                    clamp(380px, 32vw, 560px)                Gewicht (0,2,1)

   Der Regler gewinnt ueber das Gewicht und nicht ueber die Reihenfolge; eine
   andere Ladefolge haette daran nichts geaendert. Effektiv gemessen: 192 px
   bei 390, 381,45 px bei 900 (Tablet-Wert `100%` faellt auf das natuerliche
   Verhaeltnis zurueck), 700 px bei 1280. Der clamp haette dort 380, 380 und
   409,6 px gesagt. Die Zeile ist ersatzlos entfernt, damit es fuer die Hoehe
   genau einen Wahrheitsort gibt: den Regler.

   Wer die Hoehe aendern will, aendert sie in Elementor an `go00006`
   (Desktop / Tablet / Mobil) und nicht hier. Die uebrigen fuenf
   Eigenschaften dieser Regel kommen sehr wohl an; nachgemessen in
   protokolle/13-warum-hoehe2.json.

   Die ausgelieferte Datei reicht: WordPress liefert bei 1280 px
   `ob1-1536x652.webp` (gemessen), und 1536 zu 652 deckt 1265 zu 700 in der
   Breite ohne Hochrechnen. */
.gto-hero .gto-hero-band img {
  display: block;
  width: 100%;
  object-fit: cover;
  object-position: center 46%;
  border-radius: 0;
}

/* Das Makro in S5 wird SEHR WOHL beschnitten, und damit steht die Regel von
   oben in ihrem Gegenstueck da: ein Ausschnitt einer Oberflaeche vertraegt
   einen zweiten, ein Faecher nicht.

   Ohne Beschnitt waere es 1170 x 873 und beherrschte den Abschnitt, in dem es
   nur der Beleg zu drei Karten ist. `aspect-ratio: 16 / 6` macht daraus ein
   Band von 1170 x 439; `object-fit: cover` schneidet oben und unten weg, was
   dabei ueber bleibt, und `object-position: center` nimmt die Mitte, weil bei
   einer gleichmaessigen Koernung jede Stelle dieselbe Aussage traegt.

   Der erste Abzug hatte diese Regel nicht: die Zusage stand im Kommentar,
   der Waehler fehlte, und auf dem Bild stand ein Foto, das doppelt so hoch
   war wie die drei Karten darueber zusammen. Gefunden hat das der Abzug. */
.gto-struktur-makro img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 6;
  object-fit: cover;
  object-position: center;
  border-radius: var(--gto-radius);
}

/* --- 23. Der Pfeil-Verweis der Gattung ---------------------------------- */
/* Aussehen wie Block 20, eigener Waehler. Der Auftrag sagt es woertlich:
   Block 20 bleibt auf `.gtp-vgl-schluss` eingegrenzt, also auf die drei
   Seiten, die diese Klasse fuehren (1630, 1632, 1967). Wer dort einen
   dritten Waehler hineinschriebe, aenderte eine Regel des Bestands.

   DER PREIS UND WARUM ER BEZAHLT WIRD
   -----------------------------------
   Die acht Werte stehen damit ein zweites Mal in dieser Datei. Das ist
   derselbe bezahlte Preis wie bei den drei Schriftwerten der Weiche, und
   er wird auf dieselbe Weise bezahlt: DAS GATE MISST BEIDE VERWEISE
   GEGENEINANDER, am gerenderten DOM, statt ihre Gleichheit zu glauben.
   Acht Stilwerte, der Pfeil dazu, bei jeder gefahrenen Breite.

   Der Pfeil ist auch hier kein Schriftzeichen, sondern ein `::after` mit
   leerem Inhalt aus zwei Rahmenkanten, um 45 Grad gedreht: ein U+2192
   waere Inhalt und wuerde vorgelesen, obwohl er nichts sagt, was der Text
   nicht sagt. */
.gto-verweis {
  font-family: "Archivo", "Archivo Expanded", system-ui, sans-serif;
  font-size: 12px;
  font-weight: 700;
  line-height: 20px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--brand-link);
  text-decoration: underline;
  text-underline-offset: 3px;
  border-bottom: 0;
}
.gto-verweis:hover,
.gto-verweis:focus-visible {
  color: #004FEF;
  border-bottom: 0;
}
.gto-verweis::after {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-left: 9px;
  border-top: 2px solid currentColor;
  border-right: 2px solid currentColor;
  transform: rotate(45deg);
  vertical-align: 1px;
}

/* --- 24. Die zwei Kanten der Oberflaechen-Gattung ----------------------- */
/* Zwei Bausteine dieser Seite laufen ueber die Rasterkante hinaus: die
   Buehne des Muster-Studios (S3) und das Farbband der Spektralwand (S6).
   Beide brauchen dieselben zwei Zahlen, und bis v2 rechnete jeder sie selbst
   aus. Seit v2.1 stehen sie hier, einmal.

     --gto-textrand    die Rasterkante der uebrigen Seite. Gemessen 55 px bei
                       1280, 375 bei 1920, 695 bei 2560 und 20 bei 390. Dort
                       beginnt jede Ueberschrift dieser Seite.
     --gto-bleed-rand  wie weit ein randloser Baustein nach aussen laeuft,
                       bevor er stehen bleibt. Gemessen 0 bei 1280 (also
                       Fensterkante), 90 bei 1920, 410 bei 2560. Der Deckel
                       ist 585 + 285 = 870, ein Bleed-Baustein wird also nie
                       breiter als 1740 px.

   WARUM DAS TROTZDEM KEINE FESTEN ZAHLEN SIND
   -------------------------------------------
   Eine Custom Property wird als TEXT eingesetzt. Das `50%` darin rechnet erst
   an der Stelle, an der die Variable BENUTZT wird, und zwar gegen den
   Eltern-Kasten dieser Stelle. Beide Formeln stimmen deshalb nur dort, wo der
   Eltern-Kasten das Fenster ist, also an einem direkten Kind einer
   vollbreiten Sektion ohne Seitenpolster. Wer sie tiefer benutzt, bekommt
   eine andere Zahl, und zwar ohne Fehlermeldung. Der erste Wurf von wand.css
   hatte genau diesen Fehler: der Bleed-Rand fiel von -55 px auf -20 px.

   DIE EINE AUSNAHME, UND WARUM SIE KEINE IST
   ------------------------------------------
   `.gtw-marke` (die Ablesung unter dem Farbband) benutzt `--gto-textrand`
   sinngemaess ein Stockwerk tiefer, naemlich gegen das Band statt gegen das
   Fenster. Sie bekommt trotzdem dieselbe Kante, weil das Band bei genau
   1740 px stehen bleibt: 870 - 585 = 285, und 285 ist genau der Ueberstand,
   um den das Band links ueber die Rasterkante hinausragt. Der Deckel ist
   damit nicht nur eine Zahl fuer die Breite, sondern die Bedingung, unter der
   diese Formel an zwei Stellen stimmt. Wer den Deckel aendert, misst die
   Ablesung nach.

   Herleitung und Messprotokoll der zwei Konstanten dahinter
   (--gtp-raster-halb, --gtp-bleed-ueberstand): ganz oben im :root. */
:root {
  --gto-textrand: max(20px, calc(50% - var(--gtp-raster-halb)));
  --gto-bleed-rand: max(0px, calc(50% - var(--gtp-raster-halb)
                                      - var(--gtp-bleed-ueberstand)));
}

/* --- 25. Der Kopf dockt an, ohne dass der Inhalt springt ---------------- */
/* DAS PROBLEM, IN EINER ZEILE
   ---------------------------
   Das Theme heftet den Kopf mit `position: fixed` an und stellt NICHTS an
   seine Stelle. Damit faellt seine Hoehe aus dem Fluss, und alles darunter
   rutscht in demselben Augenblick um genau diese Hoehe nach oben.

   GEMESSEN, nicht vermutet (reports/p57-header-mobil/protokolle/10-diagnose-vorher.txt):

     Seite 1635 @ 1280   Dokumenthoehe 6362 -> 6287 px, Sprung 75,00 px
     Seite 1635 @  390   Dokumenthoehe 7551 -> 7453 px, Sprung 98,23 px
     Startseite beides   Dokumenthoehe unveraendert, Sprung 0,00 px

   Die Startseite springt nicht, weil ihr Kopf `header-overlay` traegt und
   ohnehin `position: absolute` steht: was nie im Fluss war, kann ihn auch
   nicht verlassen. Der Sprung trifft also JEDE Seite ausser der Startseite.

   WARUM HIER UND NICHT AN DER THEME-EINSTELLUNG
   ---------------------------------------------
   Der Kopf-Baukasten des Themes kennt zum Anheften genau drei Steuerelemente
   (makaffo/inc/backend/elementor/elementor.php: `sticky_class`,
   `sticky_background`, `offset_space`). Ein Platzhalter ist nicht darunter.
   Elementors eigenes Sticky mit Platzhalter gehoert zu Elementor Pro, und das
   ist hier nicht installiert (aktiv ist `elementor` 4.2.3, sonst nichts aus
   der Familie). Bleibt die Hoehenreservierung an den beiden Huellen, die das
   Theme um die Kopf-Vorlagen legt (`inc/frontend/builder.php`).

   DIE ZAHLEN SIND GEMESSEN, UND ZWAR DIE TREPPE, NICHT ZWEI PUNKTE
   ----------------------------------------------------------------
   Die Hoehe ist nicht konstant (protokolle/12-stufen-vorher.txt, 35 Breiten):

     .header-mobile    bis 334 px: 161 px (Logo und Knopf brechen um)
                       335 bis 767 px:  98 px (Logo 255 px, Elementor mobil)
                       768 bis 1024 px: 110 px (Logo 307 px, Elementor Tablet)
     .header-desktop   ab 1025 px: 79 px, ab rund 1663 px waechst sie

   Der Umbruchpunkt 334/335 ist einzeln nachgemessen (protokolle/16-umbruch.txt,
   41 Breiten in Einerschritten), weil eine Mediengrenze drei Pixel daneben im
   Zwischenband 63 px Leere reservieren wuerde: zu viel ist schlimmer als zu
   wenig, weil es immer zu sehen ist und nicht nur beim Scrollen.

   DIE ZAHLEN STEHEN ALS BRUCH DA, UND ZWAR NACH EINEM ROTEN PUNKT.
   Der erste Wurf reservierte 161, 98 und 110 px, also die Zahlen aus
   `offsetHeight`. Das rundet auf ganze Pixel. Bei 335 px meldete der
   Kanten-Lauf daraufhin einen Pixel Dokumenthoehe zu wenig
   (protokolle/35-andock-kanten.txt): die echte Hoehe ist 98,234 px, die
   Reservierung war um 0,234 px zu klein. Nachgemessen mit
   `getBoundingClientRect().height` (protokolle/36-bruch.txt):

     bis 334 px   161,078 bis 161,094  (die Zahl schwankt ueber das Band um
                                        0,016 px, genommen ist die groessere)
     335..767     98,234
     768..1024    110,109

   Die clamp()-Kurve des Rechner-Kopfes brauchte diese Korrektur nicht: sie
   liefert 79,0116 gegen 79,000 gemessen, 91,3389 gegen 91,328 und 96,360
   gegen 96,359, also hoechstens 0,012 px zu viel.

   DER RECHNER-KOPF WAECHST, UND ZWAR NACH EINER REGEL
   ---------------------------------------------------
   Bis rund 1663 px ist die Menuespalte der hoechste Teil (74 px). Darueber
   ueberholt sie die Logospalte, und die haengt an der Fensterbreite
   (protokolle/13-warum-waechst.txt):

     Logospalte = 21 % der Innenbreite, und die ist Fensterbreite minus
     120 px Polster. Ihre Hoehe ist das Seitenverhaeltnis des Logos:
     1349/5906 = 0,22841. Zusammen 0,21 * 0,22841 = 0,0479661 je Pixel
     Innenbreite, also 4,79661vw - 5,756px. Gedeckelt bei 400 px Logobreite,
     das sind 91,36 px. Dazu 4 px Trenner-Behaelter und 1 px Rahmen.

   Nachgerechnet gegen die Messung: 1700 -> 80,79 (gemessen 81), 1800 -> 85,58
   (86), 1920 -> 91,34 (91), 2560 -> 96,36 (96). An der Nahtstelle 1663 px
   ergibt die Formel 79,01 px, also genau den Wert der Stufe darunter.

   `100vw` zaehlt auf dem Rechner die Rollleiste mit, das sind hier 0,05 * 15 =
   0,72 px zu viel. Unter einem Pixel, und `min-height` kann nur nach oben
   wirken: der Kopf wird dadurch nicht kleiner, hoechstens um einen dreiviertel
   Pixel hoeher. */
@media (max-width: 334px) {
  #site-header .header-mobile { min-height: 161.094px; }
}
@media (min-width: 335px) and (max-width: 767px) {
  #site-header .header-mobile { min-height: 98.234px; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  #site-header .header-mobile { min-height: 110.109px; }
}
@media (min-width: 1025px) {
  #site-header .header-desktop {
    min-height: calc(5px + clamp(74px, 4.79661vw - 5.756px, 91.36px));
  }
}

/* DIE BEWEGUNG AN DER AUSLOESE-KANTE, UND WARUM SIE JETZT WEG MUSS
   ---------------------------------------------------------------
   Das Theme laesst den angehefteten Kopf jedes Mal einfahren
   (`header .is-stuck { animation: stickySlideDown 0.65s ... both }`,
   makaffo/style.css:1779), und Elementors Behaelter bringt zusaetzlich
   `transition: background .3s, border .3s, box-shadow .3s, transform .4s` mit
   (gemessen, protokolle/10-diagnose-vorher.txt).

   Solange der Kopf beim Anheften seine Hoehe aus dem Fluss nahm, hatte das
   Theme aus Versehen eine Hysterese: die Ausloese-Schwelle ist
   `#site-header.offsetHeight + 200` (makaffo/js/scripts.js:40), und die fiel
   im angehefteten Zustand von 279 auf 204 px, weil die Huelle zusammenfiel.
   Die Reservierung oben nimmt genau das weg, also ist die Schwelle jetzt in
   beiden Richtungen dieselbe Zahl. Ein Finger, der an der Kante haengen
   bleibt, schaltet die Klasse damit mehrfach, und JEDES Anschalten startet die
   0,65 s lange Einfahrt von neuem. Das waere ein Flackern, das es vorher nicht
   gab, eingehandelt durch den eigenen Fix.

   Deshalb wird die Bewegung an dieser einen Stelle gekappt. Der Kopf ist dann
   einfach da, und "einfach da" kann nicht ruckeln. Ein Id und zwei Klassen
   (1,2,0) schlagen sowohl `header .is-stuck` (0,1,1) als auch `.e-con`
   (0,1,0), ein !important ist nicht noetig. */
#site-header .sticky-header.is-stuck {
  animation: none;
  transition: none;
}

/* DIE EINFAHRT KOMMT ZURUECK, ABER ENTPRELLT
   ------------------------------------------
   Die Regel darueber kappt die Bewegung des Themes, weil sie an der Kante
   flackerte. Sie loest damit das Flackern und nimmt zugleich die Einfahrt weg:
   der Kopf ist seither schlagartig da. Diese Regel holt sie zurueck, ohne das
   Flackern mitzubringen, und der Unterschied steckt nicht in der Animation,
   sondern in der KLASSE, an der sie haengt.

   `is-stuck` schaltet das Theme bei jedem Ueberschreiten der Schwelle
   (gemessen: 279 px bei 1280, 299 px bei 390; an der Kante zwoelf
   Umschaltungen in sechs Pendelrunden, protokolle/10-kopflage-vorher.json).
   `gtp-kopf-ein` setzt das Skript nur, wenn der Kopf vorher laenger als 250 ms
   abgedockt war. Ein Finger, der auf der Kante haengen bleibt, startet damit
   nichts mehr neu.

   Ein Id und drei Klassen (1,3,0) schlagen die Regel darueber (1,2,0), ohne
   dass es ein !important braucht.

   KEIN `both` UND KEIN `forwards`, UND DAS IST GEMESSEN UND NICHT GEERBT.
   Bliebe das `transform` nach der Einfahrt stehen, waere der Kopf der
   Bezugsrahmen fuer jedes `position: fixed` darunter. Darunter liegt
   `#mmenu-wrapper`, und zwar wirklich: es haengt in der Mobil-Kopfvorlage
   (`elementor-element-cb28b0b` > `.e-con-inner` > `.elementor-element-6749711`
   > `.octf-menu-mobile` > `#mmenu-wrapper`, protokolle/11-mmenu.json).
   Nachgemessen in protokolle/12-rahmen.json, mit Rueckmeldung des tatsaechlich
   angekommenen `transform`:

     Kopf ohne transform          Menue geschlossen x=390  offen x=80   h=1000
     Kopf translateY(0px)         unveraendert, aber der Kopf IST jetzt
                                  Bezugsrahmen (belegt am Fall darunter)
     Kopf translateY(-100%)       Menue faehrt 98,23 px mit nach oben

   Der Nullfall faellt nicht auf, weil die Kopfhuelle bei 0/0 sitzt und so breit
   ist wie das Fenster. Das ist ein Zufall der Geometrie und keine Sicherheit:
   der dritte Fall zeigt, dass der Bezugsrahmen sehr wohl gewechselt hat. Also
   bleibt kein `transform` stehen, weder ueber den Fuellmodus noch ueber die
   Klasse (die nimmt das Skript bei `animationend` wieder weg). */
@keyframes gtpKopfEin {
  from { transform: translateY(-100%); }
  to   { transform: translateY(0); }
}
#site-header .sticky-header.is-stuck.gtp-kopf-ein {
  animation: gtpKopfEin .4s ease-out;
}
/* Wer Bewegung abbestellt hat, bekommt den Kopf ohne Einfahrt, also genau den
   Zustand vor diesem Auftrag. Die Klasse bleibt dann folgenlos stehen, bis das
   Abdocken sie entfernt: ohne Animation gibt es kein `animationend`. Das ist
   unschaedlich, weil die Klasse allein nichts tut. */
@media (prefers-reduced-motion: reduce) {
  #site-header .sticky-header.is-stuck.gtp-kopf-ein { animation: none; }
}

/* DIE DRITTE DUNKLE QUELLE, DIE ERST NACH DEM AUFRAEUMEN SICHTBAR WURDE
   --------------------------------------------------------------------
   Der Auftrag nennt zwei Regeln im Zusatz-CSS 1396, die den angehefteten
   Mobil-Kopf dunkel faerben (#1B2C40 und #262F42, beide !important). Beide
   sind entfernt. Danach war der Kopf trotzdem nicht weiss, sondern
   rgb(36,36,36): darunter lag eine DRITTE Quelle, und die steht im Theme
   selbst (makaffo/style.css:5297):

       .header-mobile .is-stuck { background-color: var(--makaffo-color-dark); }

   Sie hat Spezifitaet 0,2,0 und schlaegt damit die weisse Regel des Themes
   `header .is-stuck` (0,1,1). Der Auftrag will den angehefteten Kopf
   site-weit weiss, also muss auch diese Quelle weg. Sie steht in einer
   Theme-Datei, die uns nicht gehoert und ein Update ohnehin zurueckbringen
   wuerde, deshalb wird sie hier ueberschrieben statt dort geloescht.

   Ein Id und drei Klassen (1,3,0) reichen gegen 0,2,0; ein !important ist
   nicht noetig und waere hier auch falsch, weil es die naechste Regel wieder
   zu einem !important zwaenge. */
#site-header .header-mobile .sticky-header.is-stuck {
  background-color: #FFFFFF;
}

/* --- 26. Das Etikett der Kennzahl behaelt Schriftart und Zeilenhoehe ----- */
/* Der Zaehler zeichnet sein Etikett nicht mehr als h6, sondern als p
   (functions.php, gtp_counter_etikett_ohne_ueberschrift). ZWEI gerechnete
   Eigenschaften kamen an diesem Etikett aus einer TAG-Regel und aus keiner
   anderen Quelle. Beide stehen deshalb hier ausgeschrieben.

   1. Die Zeilenhoehe:

          h6 { line-height: var(--makaffo-h6-line-height); }  makaffo/style.css:460

      Gemessen 30px. Ein p erbt stattdessen die 32px des Fliesstextes.

   2. Die Schriftart, und die hat mich einen Gate-Lauf gekostet:

          h1, h2, h3, h4, h5, h6 { font-family: var(--brand-font-heading); }
                                                        brand.css Zeile 111

      Als h6 stand das Etikett in Archivo, als p in Inter. Inter ist breiter,
      und genau ein Etikett stand knapp an der Kante: `RAL- & NCS-FARBTOENE`
      passte in 163,7px Kastenbreite auf eine Zeile und danach nicht mehr. Die
      Karte wurde 30px hoeher, die Seite 60px laenger (10130 auf 10190), und
      der Vergleich der Messlaeufe wurde an acht Zusagen rot.

      Der Fund gehoert in die Familie von FALLE 69: die Zusage war erfuellt
      (der Tag ist weg), und die Seite trotzdem eine andere. Gefunden hat es
      nicht die Stil-Messung, die zehn Eigenschaften liest und font-family
      nicht darunter, sondern die GEOMETRIE. Was ankommt, ist die Hoehe.

   Schriftgroesse, Gewicht, Farbe, Laufweite und die beiden Abstaende kommen
   dagegen aus Klassenregeln (.ot-counter__title und .gtp-stat
   .ot-counter__title) und bleiben von einem Tag-Wechsel unberuehrt; sie
   stehen hier deshalb NICHT.

   Das ist keine Kaschierung des Befunds, sondern seine Gegenrechnung: der Tag
   ist wirklich weg, und die Optik steht, wo sie stand. */
.ot-counter__title {
  font-family: var(--brand-font-heading);
  line-height: 30px;
}

/* gtu-ueber-uns
   ==================================================================
   Die vierte Gattung dieser Website: DER BETRIEB. Sie steht auf genau einer
   Seite (1637 "Ueber uns") und hat wieder einen anderen Charakter als die
   drei aelteren: die Leistungsseiten erzaehlen einen Ablauf, die
   Werkstoffseiten einen Werkstoff, die Oberflaechen-Seite ist ein Katalog.
   Diese hier erzaehlt ein HAUS: Halle, Ablauf, Grenzen, Menschen.

   WAS HIER STEHT UND WAS NICHT
   ----------------------------
   Hier steht nur, was das THEME sonst kaputt macht, also die drei Regeln um
   den randlosen Hero. Und das ist auffaellig wenig, verglichen mit den
   Gattungen davor. Der Grund ist kein Sparen, sondern der Zuschnitt: die
   fuenf Bausteine dieser Seite (Zahlenband, Rundgang, Grenzen, Zitat,
   Arbeitsweise) teilen sich untereinander KEIN Vokabular. Jeder steht einmal
   auf einer Seite. Was nur ein Baustein braucht, gehoert in seine eigene CSS
   in p57/widgets/ueber-uns/ und kommt ueber dieselbe Fuge wie jedes andere
   HTML-Widget dieses Projekts; es hier abzulegen hiesse, eine geteilte
   Zustaendigkeit zu behaupten, die es nicht gibt.

   ADDITIV, UND ZWAR NACHWEISLICH. Kein Waehler dieses Blocks trifft eine
   Regel oder ein Element der drei aelteren Gattungen: alles haengt an
   `gtu-`. Der Bestandsschutz ist gemessen, nicht behauptet (Baum-SHA aller
   Bestandsseiten vorher gegen nachher, dazu ein reiner Anhang-Diff dieser
   Datei).
   ================================================================== */

/* --- 27. Der Hero der Gattung sitzt auf der Kopfkante ------------------- */
/* Dieselbe Lage wie Block 16 und Block 22, derselbe Grund: das Theme gibt dem
   Inhaltsbereich oben 100 px Luft (makaffo/style.css:2174), und ein Hero in
   #0C2148 laege damit auf einem weissen Sockel.

   Dass es die dritte Regel dieser Art ist und nicht ein dritter Waehler in
   Block 16, hat den Grund, den Block 22 ausschreibt: Block 16 haengen vier
   gebaute Seiten an, Block 22 eine. Wer sie zusammenlegt, muss beim naechsten
   Eingriff sechs Seiten neu belegen statt einer. Der Bestandsschutz ist hier
   eine Zeile teuer, und die Zeile ist gut angelegt.

   Faellt :has() aus (sehr alter Browser), steht der Hero auf seinem Sockel:
   weniger schoen, aber unbeschaedigt. Genau wie in Block 1, 9, 16 und 22. */
#content .entry-content:has(.gtu-hero) { padding-top: 0; }

/* Die Textspalte des Heros. Kicker, H1 und Einleitung stehen auf der
   Rasterkante wie alles andere, duerfen aber nicht mit dem Raster mitwachsen:
   bei 1140 px Kastenbreite haette die Einleitung Zeilen von gut 150 Zeichen,
   und das Auge findet den Zeilenanfang nicht mehr zurueck.

   870 px ist der Deckel, den der Auftrag nennt, und derselbe, den die
   Werkstoff-Gattung in Block 17 fuehrt. Er faellt hier weiter aus als die
   760 px der Oberflaechen-Gattung, und das passt zum Text: die H1 dieser
   Seite ist ein Satz aus zwei Haelften ("Pulverbeschichtung ist Handwerk.
   Wir sind der Betrieb dazu."), und bei 760 px braeche sie an einer Stelle,
   an der der Punkt schon steht. */
.gtu-hero .gtu-hero__text { max-width: 870px; }

/* DAS HERO-BILD IST EIN BAND, KEIN EINGEKLEBTES FOTO.
   Dieselbe Entscheidung wie in Block 22 und aus demselben Grund: ein Bild,
   das die Seite traegt, hat keinen Rand. uu7 zeigt die Halle in ihrer ganzen
   Breite, von den Kragarmregalen links bis zur Kabine rechts; als Kasten mit
   Radius im 1180er Raster waere es eine Abbildung zum Text, als Band ist es
   der Raum, um den es geht.

   `object-position: center 60%` und nicht die Mitte: in der Hoehe stehen ueber
   der Halle Dachbinder und Leuchten, unten der Hallenboden. Der Schnitt haelt
   Regale, Kabine und Boden im Bild und nimmt das Dach heraus.

   DIE HOEHE STEHT NICHT HIER, SONDERN AM ELEMENTOR-REGLER DES BILD-WIDGETS.
   Das ist die Lehre aus Block 22: dort stand die Hoehe eine Fassung lang in
   dieser Datei und war wirkungslos, weil die post-CSS des Reglers mit (0,3,1)
   ueber das (0,2,1) dieser Regel gewinnt. Wer die Hoehe aendern will, aendert
   sie in Elementor und nicht hier. */
.gtu-hero .gtu-hero-band img {
  display: block;
  width: 100%;
  object-fit: cover;
  object-position: center 60%;
  border-radius: 0;
}

/* --- 28. Der Umriss-Knopf auf dunklem Grund ---------------------------- */
/* Das Theme gibt seinem zweiten Knopf die Primaerfarbe und leitet die Kante
   daraus ab:

       .octf-btn-outline { color: var(--makaffo-color-primary);
                           border: 1px solid currentColor; }   style.css

   Auf hellem Grund ist das richtig, und dort steht der Knopf bisher auch
   ueberall (1629 "Technische Daten"). Der Abschluss dieser Seite ist die
   erste Stelle der Website, an der er auf Navy steht, und dort sind es
   #004FEF gegen #0C2148, also **2,54:1**. Gefunden hat es der erste
   Gate-Lauf, und zwar nicht die Kontrastmessung (die las nur gtu-Waehler),
   sondern der Abzug.

   DIE REGEL HAENGT AN `gtu-abschluss` UND NICHT AN `gtp-knopf`.
   `gtp-knopf` ist geteiltes Vokabular; an ihm haengen sieben gebaute Seiten.
   Wer ihn anfasst, muss sie alle neu belegen, und das fuer ein Problem, das
   genau eine Sektion hat. Die Abschluss-Sektion traegt deshalb zwei Klassen:
   `gtp-abschluss` fuer das Geruest und `gtu-abschluss` fuer diese eine Regel.

   Der Schwebezustand muss mit, sonst waere er die naechste Falle: das Theme
   setzt dort `color: var(--makaffo-color-dark)`, und ein dunkler Knopf auf
   Navy ist unsichtbar statt nur schwach. Ein Fix, der den Ruhezustand heilt
   und den Schwebezustand kaputt laesst, ist kein Fix. */
.gtu-abschluss .octf-btn-outline {
  color: #FFFFFF;
}
.gtu-abschluss .octf-btn-outline:hover,
.gtu-abschluss .octf-btn-outline:focus {
  /* #C6D0E0 auf #0C2148: 10,18:1. Die Kante zieht ueber currentColor mit. */
  color: #C6D0E0;
}

/* --- 29. Der Referenz-Teaser der Ueber-Uns-Gattung --------------------- */
/* Die Kachelreihe unter der Arbeitsweise ist Hausbestand: dasselbe Raster
   (Block 5), dieselbe Kachel (`.gtp-ref-karte`, weiter oben), dasselbe
   Template. Der Auftrag zu v2 will sie an EINER Stelle anders: groessere
   Bilder und ein zurueckhaltender Schwebezustand.

   DIE REGELN HAENGEN AN `gtu-referenzen` UND NICHT AN `gtp-ref-karte`.
   Derselbe Grund wie in Block 28: `gtp-ref-*` ist geteiltes Vokabular. An ihm
   haengen die Startseite, das Referenz-Archiv und der Teaser auf 1629. Wer
   dort etwas veraendert, muss vier Stellen neu belegen, und das fuer einen
   Wunsch, der genau eine Sektion betrifft. Die Sektion traegt deshalb eine
   zweite Klasse, und alles hier steht dahinter.

   DREI KACHELN WAREN ES SCHON. Der Auftrag nennt "drei statt sechs sichtbar";
   der Teaser dieser Seite zeigt seit v1 drei (`[gtp_ref_teaser ids=...]` mit
   drei Kennungen), und "Alle Referenzen" steht darunter. Die Zusage ist also
   bereits eingeloest und hier nichts zu tun. Was fehlte, war die GROESSE.

   WAS ABSICHTLICH NICHT PASSIERT: DER TITEL VERSCHWINDET NICHT.
   "Titel erscheint" liesse sich woertlich bauen, indem der Titel im
   Ruhezustand ausgeblendet wird und beim Ueberfahren einblendet. Genau das
   macht das Parent-Theme, und genau deshalb gibt es im Child ein eigenes
   Kachel-Template: sein Kopf haelt fest, dass Text DAUERHAFT unter dem Bild
   stehen soll. Ein Titel, den man nur mit dem Zeiger sieht, ist auf einem
   Telefon gar nicht zu sehen, und ohne Titel ist eine Kachel ein Bild ohne
   Auskunft. Was hier beim Ueberfahren ERSCHEINT, ist deshalb die
   Unterstreichung des Titels; der Titel selbst steht immer da. */
.gtu-referenzen .gtp-ref-bild {
  /* 4 zu 3 statt 3 zu 2: bei drei Spalten im 1180er Raster waechst die Kachel
     damit von 249 auf 280 px Bildhoehe, also um ein knappes Achtel. Mehr
     ginge auch und waere zu viel: bei 1 zu 1 stuende der Titel unter der
     Falzkante. */
  aspect-ratio: 4 / 3;
}

/* Die Kachel hebt sich beim Ueberfahren. Vier Pixel und ein weicher Schatten,
   nicht mehr: der Auftrag sagt "dezent", und die Kachel traegt bereits zwei
   Bewegungen (das Bild zoomt um 4 %, der Pfeil dreht sich).

   `focus-within` steht daneben, weil der Titel ein Verweis ist: wer mit der
   Tastatur durch die Reihe geht, soll dieselbe Rueckmeldung bekommen wie wer
   mit dem Zeiger darueber faehrt. */
.gtu-referenzen .gtp-ref-karte {
  transition: transform .3s ease, box-shadow .3s ease;
}
.gtu-referenzen .gtp-ref-karte:hover,
.gtu-referenzen .gtp-ref-karte:focus-within {
  transform: translateY(-4px);
  box-shadow: 0 10px 26px rgba(12, 33, 72, .14);
}

/* Der Titel waechst mit dem Bild: 20 statt 18 px. Die feste Hoehe von zwei
   Zeilen (2,6em) rechnet in em und geht damit von selbst mit. */
.gtu-referenzen .gtp-ref-titel { font-size: 20px; }

/* Die Unterstreichung, die beim Ueberfahren erscheint. Sie steht als
   `text-decoration-color` und nicht als Verlauf im Hintergrund: eine
   Unterstreichung aus `background-size` bricht bei einem zweizeiligen Titel
   auseinander, und die Titel dieser Kacheln sind zweizeilig angelegt.
   #004389 auf #FFFFFF: 9,70:1. */
.gtu-referenzen .gtp-ref-titel a {
  text-decoration: underline;
  text-decoration-color: transparent;
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
  transition: text-decoration-color .25s ease, color .25s ease;
}
.gtu-referenzen .gtp-ref-karte:hover .gtp-ref-titel a,
.gtu-referenzen .gtp-ref-titel a:focus-visible {
  text-decoration-color: #004389;
}

/* --- 30. Die Referenzen-Seite v2 --------------------------------------- */
/* WARUM DER GANZE ABSCHNITT HIER STEHT UND NICHT IN DEN BAUSTEINEN
   ---------------------------------------------------------------
   Die Nachbarordner `widgets/oberflaechen/` und `widgets/ueber-uns/` legen
   ihren Stil neben ihr Markup, weil beides zusammen in EIN Elementor-Widget
   wandert. /referenzen/ ist keine Elementor-Seite: es ist das Archiv des
   Beitragstyps ot_portfolio, gezeichnet von `archive-ot_portfolio.php`. Es
   gibt hier kein Widget, in das ein `<style>` gehoerte, und es gaebe auch
   keinen Ort, an dem er genau einmal stuende: die Kachel wird neunmal
   gezeichnet. brand.css ist ohnehin auf jeder Seite eingehaengt und wird vom
   Browser zwischengespeichert. Der Auftrag sagt es woertlich: "brand.css
   additiv im naechsten freien Block".

   JEDE REGEL HAENGT AN EINER `gtr-`-KLASSE, UND ZWAR NOTWENDIG
   ------------------------------------------------------------
   Die Kachel-Vorlage `template-parts/content-project-filter.php` zeichnet an
   DREI Stellen: Startseite (Elementor-Widget), /ueber-uns/ (Shortcode
   [gtp_ref_teaser]) und hier. Die Filterleiste zeichnet an ZWEI. Jede Regel,
   die an `.gtp-ref-*` oder an `.filter` haengt, zoege diese Seiten mit, und
   der Auftrag sagt, sie bleiben unberuehrt. Deshalb traegt das Raster die
   Klasse `gtr-raster` und die Filterzeile `gtr-filter`, und alles hier steht
   dahinter. Derselbe Grund und dasselbe Mittel wie in Block 28 und 29.

   DIE FLAECHENFOLGE DER SEITE
   ---------------------------
   Foto mit Navy-Schleier (Kopfbereich), Weiss (Filter und Raster), Navy
   (Verzahnungs-Band), #004FEF (Abschluss). Kein Wechsel wiederholt sich, und
   die zwei Navy-Flaechen hintereinander, an denen die Ueber-Uns-Seite in v1
   gescheitert ist, entstehen hier gar nicht erst. */

/* 30.1 Der Hero im Kopfbereich des Themes ------------------------------- */
/* Das Foto gehoert dem Theme (`.page-header` mit `background-image` aus dem
   Kirki-Feld). Hier steht der Textkasten, den `gtr_kopf_mit_hero()` an die
   Stelle der blossen Ueberschrift setzt, und seit der Korrektur vom 01.09.2026
   auch der Schleier darunter, denn der ist jetzt ein Verlauf.

   WAS SICH GEAENDERT HAT UND WARUM
   --------------------------------
   Fassung 1 war ein zentrierter Kasten von 900 px in der Mitte des
   Kopfbereichs, ueber einem gleichmaessig gedeckten Foto. Auf jeder anderen
   Seite dieser Website steht der Hero linksbuendig auf der Rasterkante, mit
   Kicker, Schlagzeile, Satz und Knopf untereinander, und das Bild liegt rechts.
   Der Kopfbereich war damit die einzige Stelle, die nicht mitspricht.

   DER KOPFBEREICH BRINGT SEINE RASTERKANTE SCHON MIT
   --------------------------------------------------
   Fuer den linken Anschlag war NICHTS zu rechnen und keine Zahl zu setzen. Das
   Theme legt in den Kopfbereich seinen eigenen `.container`, und der sitzt
   gemessen auf genau derselben Kante wie jede Ueberschrift der Seite:

       Fenster   Inhaltskante Kopfbereich   Inhaltskante Band
        1280            55,0                     55,0
         992            26,0                     26,0
         991           135,5                    135,5
         844            62,0                     62,0
         390            15,0                     15,0

   (reports/p57-referenzen-fix/vorher.json, Felder `kopfContainer` und
   `bandStreifen`.) Es reicht deshalb, die Zentrierung wegzunehmen.

   DIE SPALTE ENDET AN JEDER BREITE AUF DER FENSTERMITTE, UND ZWAR EXAKT
   ---------------------------------------------------------------------
   Das Raster ist zentriert. Eine Spalte, die auf der linken Rasterkante
   beginnt und halb so breit ist wie das Raster, endet damit immer auf der
   Fenstermitte:
       1280:  55 + 585  =  640  =  1280/2
        992:  26 + 470  =  496  =   992/2
       1920: 375 + 585  =  960  =  1920/2
   `--gtp-raster-halb` ist genau diese halbe Rasterbreite, gemessen und in einer
   einzigen Zeile dieser Datei gepflegt (siehe Kopf). Deshalb steht sie hier als
   Deckel, und deshalb darf der Verlauf im Schleier seine Mitte bei 50 Prozent
   haben: die zwei Zahlen sind dieselbe Zahl, und niemand muss sie zweimal
   pflegen.

   DER SCHLEIER WIRD EIN VERLAUF, UND NUR HIER
   -------------------------------------------
   `.page-header::before` weiter oben in dieser Datei gilt fuer JEDE Seite mit
   Kopfbereich (Kontakt, Ueber uns, die neun Referenz-Einzelseiten). Diese Regel
   haengt an `:has(.gtr-hero)` und trifft damit ausschliesslich das Archiv.
   Faellt `:has()` aus, bleibt der gedeckte Schleier aus Fassung 1 stehen: der
   Text ist dann weniger kontrastreich, aber mit 6,18:1 immer noch ueber der
   Schwelle. Weniger schoen, unbeschaedigt.

   ALLE VIER ZEILEN STEHEN IN WEISS, UND DAS IST GERECHNET
   -------------------------------------------------------
   Der Grund unter der Schrift ist Foto plus Navy-Verlauf, nicht glattes Navy.
   Schon beim gedeckten Schleier (0,7) kam Weiss auf 6,18:1, waehrend #C6D0E0,
   die gedaempfte Zweitfarbe des Hauses, dort auf 3,97:1 faellt und damit unter
   die Schwelle 4,5:1. Der Verlauf ist auf der Textseite DUNKLER als 0,7, die
   Lage wird also besser und nicht schlechter. Die Rangfolge macht trotzdem
   Groesse, Gewicht und Laufweite, nicht die Farbe. Gemessen wird am Bildpunkt
   unter der Schrift (FALLE 72), nicht gegen eine Flaeche, die es unter einem
   Foto gar nicht gibt. */
.page-header:has(.gtr-hero)::before {
  background-color: transparent;
  background-image: linear-gradient(90deg,
      rgba(12, 33, 72, .95) 0%,
      rgba(12, 33, 72, .90) 50%,
      rgba(12, 33, 72, .58) 68%,
      rgba(12, 33, 72, .32) 85%,
      rgba(12, 33, 72, .22) 100%);
  opacity: 1;
}
/* `.text-center` steht als Klasse am Kopfbereich des Themes und ist mit 0,1,0
   genauso spezifisch wie diese Regel. brand.css laedt nach dem Theme, also
   gewinnt sie, ohne dass ein !important noetig waere. */
.gtr-hero {
  max-width: var(--gtp-raster-halb);
  margin: 0;
  text-align: left;
}
/* DAS SITE-POLSTER, IN ALLEN DREI STUFEN AUSGESCHRIEBEN (Punkt 0b a, 01.09.2026)
   ------------------------------------------------------------------------------
   Bis dahin hatte der Archiv-Kopf oberhalb von 992 px GAR KEIN Polster: er war
   eine Tabellenzelle mit fester Hoehe (409 px), und der Hero (330 px hoch) sass
   darin mittig, also mit 39,5 px oben und unten. Jede andere Seite dieser
   Website gibt ihrem Hero-Kopf mehr, und zwar in drei Stufen. Die Zahlen sind
   nicht gegriffen, sondern am gerenderten DOM abgelesen, an drei
   Bestands-Seiten und an den Umschaltbreiten beidseitig eingefasst
   (reports/p57-archiv-kopf/vorher.json, Feld `heroBenannt`):

       Fenster   /ueber-uns/   /farben-oberflaechen/   /werkstoff-stahl/
        1920        90 px            90 px                  90 px
        1280        90 px            90 px                  90 px
        1025        90 px            90 px                  90 px
        1024        72 px            72 px                  72 px
         768        72 px            72 px                  72 px
         767        60 px            60 px                  60 px
         390        60 px            60 px                  60 px

   Die Stufen liegen bei 1024/1025 und 767/768, also auf den Elementor-Stufen,
   auf denen die gebauten Hero-Koepfe stehen. Sie sind hier ABGELESEN und nicht
   von den 991/992 dieser Datei uebernommen: der Auftrag sagt "an einer
   Bestands-Seite am DOM ablesen und uebernehmen", und die Bestands-Koepfe
   schalten nun einmal dort.

   Alle drei Stufen stehen ausgeschrieben da, auch die mittlere, die sich aus
   den beiden anderen ergaebe. Der Auftrag verlangt es ausdruecklich, und der
   Grund dafuer ist gut: eine Stufe, die nur als Luecke zwischen zwei Abfragen
   existiert, laesst sich nicht lesen und nicht messen.

   DIE FESTE HOEHE BLEIBT STEHEN UND WIRD DABEI WIRKUNGSLOS
   ---------------------------------------------------------
   `min-height: 409px` ist die Vorgabe des Themes. Sie ist ein MINDESTMASS: mit
   90 px Polster oben und unten misst der Kopf 330 + 180 = 510 px und damit mehr
   als 409. Sie wird also nicht ueberschrieben, sondern von selbst unwirksam,
   und bleibt fuer den Fall stehen, dass der Hero einmal kuerzer wird. Der
   Wechsel unter 992 px auf `height: auto` steht unveraendert weiter unten. */
@media (min-width: 1025px) {
  .page-header:has(.gtr-hero) .gtr-hero { padding: 90px 0; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .page-header:has(.gtr-hero) .gtr-hero { padding: 72px 0; }
}
@media (max-width: 767px) {
  .page-header:has(.gtr-hero) .gtr-hero { padding: 60px 0; }
}
.gtr-hero__kicker {
  margin: 0 0 14px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #FFFFFF;
}
/* Die Klasse `page-title` bleibt am h1 und bringt Farbe und Versalien des
   Themes mit, dazu die zwei Regeln dieser Datei zur Worttrennung im
   Kopfbereich. `flex: 1` aus der Theme-Regel laeuft ins Leere, weil
   `.gtr-hero` kein Flex-Kasten ist. */
.gtr-hero__titel {
  margin: 0;
  line-height: 1.08;
}
/* Der Schriftgrad faellt von den 58 px des Themes auf die 42 px, mit denen jede
   andere Seite ihre Hero-Schlagzeile setzt (gemessen an 1632, 1635 und 1637:
   42/52, Archivo 700, versal). Zwei Dinge sind daran nicht beliebig:

   ERSTENS die Spezifitaet. `.page-header .page-title { font-size: 58px }` aus
   dem Theme steht bei 0,2,0; eine Regel auf `.gtr-hero__titel` allein (0,1,0)
   verloere still. Deshalb der Zweisatz.

   ZWEITENS die Bedingung `min-width: 768px`. Darunter gilt weiter der
   mitwachsende Grad `clamp(22px, 7vw, 36px)` aus dem Abschnitt "Seitentitel im
   Kopfbereich" weiter oben. Der ist teuer erkauft (die Tabellenzelle des
   Kopfbereichs waechst sonst ueber das Fenster hinaus, und der Parent
   schneidet ab statt umzubrechen) und wird hier nicht angefasst. Ohne diese
   Bedingung wuerde die spaetere Regel ihn ueberschreiben. */
@media (min-width: 768px) {
  .page-header .gtr-hero__titel { font-size: 42px; line-height: 52px; }
}
.gtr-hero__sub {
  margin: 18px 0 0;
  max-width: none;
  font-size: 17px;
  line-height: 30px;
  color: #FFFFFF;
}
.gtr-hero__knopf { margin-top: 30px; }
/* Das Foto als Bild-Element gibt es NUR unter 992 px. Der Vorgabewert steht
   ausserhalb jeder Abfrage, damit es auch dann verborgen bleibt, wenn `:has()`
   ausfaellt: dann bleibt der Kopfbereich der aus Fassung 1, und ein zweites
   Foto unter dem Text waere dort eine Dopplung. */
.gtr-hero__foto { display: none; }

/* UNTER 992 PX: TEXT AUF NAVY, FOTO DARUNTER
   ------------------------------------------
   So halten es die uebrigen Seiten mit `.gtp-halbbild` (Block 2): ab dieser
   Breite stapeln Text und Bild, der Text bekommt seinen Seitenrand zurueck und
   das Bild ein eigenes Seitenverhaeltnis samt Radius. Genau das steht hier,
   nur mit dem Unterschied, dass das Bild aus einem Hintergrund erst zu einem
   Bild gemacht werden muss (`gtr_kopf_foto()`).

   Der Kopfbereich muss dafuer drei Dinge aufgeben, und alle drei gehoeren zu
   seiner Bauart als Tabellenzelle mit fester Hoehe:
     `display: table` -> `block`, sonst sitzt der Inhalt in einer Zelle, die
        ihre Hoehe nicht vom Inhalt nimmt;
     `min-height: 409px` und die `height: 250px` des Themes unter 600 px, sonst
        deckelt eine feste Zahl den gewachsenen Inhalt;
     `padding: 40px 0` des Themes unter 600 px, weil das Polster jetzt am
        Textkasten haengt und sonst doppelt zaehlt.

   Der Schleier wird gleichzeitig undurchsichtig. Das Foto im Hintergrund ist
   damit verdeckt, und sichtbar ist nur noch das Bild-Element darunter. Es ist
   zeichengleich dieselbe Adresse, kostet also keine zweite Anfrage. */
@media (max-width: 991px) {
  .page-header:has(.gtr-hero) {
    display: block;
    height: auto;
    min-height: 0;
    padding: 0;
  }
  .page-header:has(.gtr-hero) > .dcell { display: block; }
  .page-header:has(.gtr-hero)::before {
    background-color: var(--brand-onyx);
    background-image: none;
    opacity: 1;
  }
  /* Das Polster steht seit dem 01.09.2026 weiter oben, in drei ausgeschriebenen
     Stufen (90 / 72 / 60). Hier bleibt nur die aufgehobene Breitenbegrenzung:
     unter 992 px gibt es keine zweite Spalte, neben der Platz bleiben muesste. */
  .page-header:has(.gtr-hero) .gtr-hero {
    max-width: none;
  }
  .page-header:has(.gtr-hero) .gtr-hero__foto {
    display: block;
    width: 100%;
    height: auto;
    margin-top: 36px;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    border-radius: 10px;
  }
}
@media (max-width: 767px) {
  .gtr-hero__kicker { font-size: 12px; letter-spacing: .14em; }
  .gtr-hero__sub { font-size: 16px; line-height: 27px; }
}

/* 30.2 Die Filterzeile als Chips ---------------------------------------- */
/* Das Verhalten ist unveraendert: es sind dieselben `<a data-filter>` in
   derselben `.isotope-filter`, und das Theme-Skript findet sie unveraendert.
   Neu ist das Aussehen und der Zaehler.

   DER UNTERSTRICH DES THEMES MUSS WEG, SONST SIND ES ZWEI ZEICHEN
   ---------------------------------------------------------------
   Weiter oben in dieser Datei bekommt `.filter ul li a:after` die Marke als
   Unterstrich. Ein Chip traegt seinen Zustand als FLAECHE; beides zusammen
   waere doppelt gemoppelt, und unter einer gefuellten Pille saehe der Strich
   aus wie ein Fehler. Der Waehler steht auf `.filter.gtr-filter`, also 0,2,4
   gegen die 0,1,4 der Regel oben, und gilt damit sicher, ohne dass die
   Reihenfolge in der Datei die Sache entscheiden muesste.

   DIE CHIPS BRECHEN UM, STATT SEITLICH ZU SCHIEBEN
   ------------------------------------------------
   Weiter oben steht fuer schmale Fenster `flex-wrap: nowrap` mit seitlichem
   Schieben. Der Grund dafuer steht dort auch: eine umbrechende Reihe von
   TEXTLINKS haette in jeder Zeile einzelne Unterstriche gehabt. Chips haben
   keine Unterstriche, und fuenf Chips, von denen zwei ausserhalb des Fensters
   liegen, sind zwei Kategorien, die niemand findet. Deshalb hier Umbruch.
   Die Startseite behaelt ihre Textlinks samt Schieben, weil diese Regeln
   hinter `gtr-filter` stehen.

   KONTRASTE. Ruhezustand #13366D auf Weiss 11,82:1, aktiv #FFFFFF auf
   #004FEF 6,24:1, Kante #E3E7ED auf Weiss 1,24:1 (traegt keine Auskunft, der
   Chip ist durch seine Schrift erkennbar; die Fuellung des aktiven Chips
   liegt bei 6,24:1 gegen Weiss). */
/* DAS POLSTER DER FILTERZEILE, UND WARUM ES HIER STEHEN MUSS.
   Der Inhaltsbereich dieser Website hat KEIN eigenes Polster: im
   Kunden-Customizer steht `.entry-content { padding: 0px 0 0px !important }`
   (`wp-custom-css` im Kopf jeder Seite), und das schlaegt die 100 oben und
   120 unten aus dem Theme-Stylesheet. Auf einer Elementor-Seite faellt das
   nicht auf, weil jede Sektion ihr eigenes Polster mitbringt. Auf DIESER
   Seite gibt es keine Sektionen, und die Filterzeile stand deshalb
   unmittelbar auf der Kante des Kopfbereichs. Der Abzug hat es gezeigt, nicht
   die Rechnung.

   56 px sind nicht gegriffen: es ist die Haelfte des Sektionspolsters der
   gebauten Seiten (90 oben), auf den naechsten Achterschritt gerundet. Der
   Kopfbereich bringt seine eigene Hoehe mit, ein volles Sektionspolster waere
   hier zu viel. Mobil dieselbe Rechnung auf die 60 der schmalen Fenster. */
.projects-filter-wrapper .gtr-filter { margin: 56px 0 40px; }
@media (max-width: 767px) {
  .projects-filter-wrapper .gtr-filter { margin: 36px 0 28px; }
}

.filter.gtr-filter ul {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
  border-bottom: 0;
  white-space: normal;
  overflow: visible;
}
.filter.gtr-filter ul li {
  display: block;
  flex: 0 0 auto;
  margin: 0;
  padding: 0;
}
.filter.gtr-filter ul li a {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 18px;
  border: 1px solid var(--brand-border);
  border-radius: 999px;
  background: #FFFFFF;
  color: var(--brand-link);
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 600;
  line-height: 1.4;
  text-transform: none;
  transition: background .2s ease, border-color .2s ease, color .2s ease;
}
.filter.gtr-filter ul li a:after { display: none; }
.filter.gtr-filter ul li a:hover {
  background: var(--brand-ivory);
  border-color: #C7D0DC;
  color: var(--brand-link);
}
.filter.gtr-filter ul li a.active,
.filter.gtr-filter ul li a.active:hover {
  background: #004FEF;
  border-color: #004FEF;
  color: #FFFFFF;
}
/* Der sichtbare Fokus. Weiter oben schaltet diese Datei `outline` an den
   Filter-Verweisen ab, weil der Unterstrich ihn dort ersetzt hat; hier gibt
   es keinen Unterstrich mehr, also muss der Ring zurueck. Er steht auf
   `#13366D` und nicht auf `currentColor`: auf dem aktiven Chip waere
   currentColor weiss und der Ring auf hellem Grund unsichtbar. */
.filter.gtr-filter ul li a:focus-visible {
  outline: 3px solid #13366D;
  outline-offset: 2px;
}
/* Der Zaehler steht in derselben Farbe wie sein Chip und wird nur leichter.
   Keine Deckkraft: eine halbdurchsichtige Schrift hat keinen Farbwert mehr,
   den man nachrechnen kann, und die Zahl waere damit unbelegt. */
.gtr-chip__zahl { font-weight: 400; }

@media (max-width: 767px) {
  .filter.gtr-filter ul { gap: 8px; }
  .filter.gtr-filter ul li a { padding: 8px 14px; font-size: 13px; }
}

/* 30.3 Das Kachel-Raster ------------------------------------------------ */
/* Drei Spalten ab 992, zwei dazwischen, eine unter 768. Die Werte kommen
   unveraendert aus dem Theme (`.projects-masonry.pf_3_cols`), es steht hier
   also keine einzige Breite. Die mittlere Stufe nennt der Auftrag nicht; sie
   ist Bestand und bleibt, weil zwei Spalten auf einem Tablet richtiger sind
   als eine.

   DAS BILDFORMAT WIRD 4 ZU 3, WIE IM TEASER AUF /ueber-uns/. Dort steht die
   Begruendung in Block 29: bei 1 zu 1 stuende der Titel unter der Falzkante.

   FALLE 71 IST HIER GEPRUEFT UND TRIFFT NICHT. Elementor liefert
   `.elementor img { border: none; border-radius: 0 }` mit (0,1,1) und schlaegt
   jede Baustein-Klasse mit (0,1,0). Der Inhaltsbereich dieser Seite liegt
   aber nicht in einem `.elementor`-Kasten (nur Kopf und Fuss tun das), die
   Regel greift also gar nicht. Nachgemessen wird es trotzdem: am gerenderten
   Element, nicht am Quelltext. */
.gtr-raster .gtp-ref-bild { aspect-ratio: 4 / 3; }

/* DER SCHWEBEZUSTAND: GENAU EINE BEWEGUNG (Korrektur vom 01.09.2026)
   ------------------------------------------------------------------
   Fassung 1 hatte an einer Kachel FUENF Zustandswechsel gleichzeitig: die
   Kachel hob sich mit Schatten, das Bild zoomte um 4 Prozent, ein Schleier
   legte sich darueber, der Pfeil wanderte und drehte sich um 45 Grad, und die
   Unterstreichung des Titels fuhr ein. Drei davon (Zoom, Schleier, Pfeil)
   kommen aus dem Bestand (Block 5), zwei kamen aus dem Referenzen-Lauf. Neun
   Kacheln nebeneinander, unter dem Zeiger jedes Mal fuenf Bewegungen mit drei
   verschiedenen Dauern (0,25 / 0,3 / 0,4 s): das liest sich als Zucken und
   nicht als Rueckmeldung.

   Ab hier ist es EINE: die Kachel hebt sich 4 px mit weichem Schatten, in
   0,15 s ease-out. Alles andere steht still.

   WARUM DIE DREI BESTANDS-BEWEGUNGEN HIER ABGESCHALTET UND NICHT DORT
   GELOESCHT WERDEN
   -------------------------------------------------------------------
   Die Kachel-Vorlage zeichnet an DREI Stellen: Startseite, Teaser auf
   /ueber-uns/ und hier. Der Auftrag gilt fuer die Uebersichts-Kacheln DIESER
   Seite; die zwei Bestandsseiten bleiben unberuehrt, und zwei Gegenproben im
   Gate messen genau das. Wer die Regeln in Block 5 aendert, aendert alle drei.
   Deshalb stehen die Abschaltungen hier, hinter `.gtr-raster`, mit einer
   Spezifitaet ueber der des Bestands (0,4,0 gegen 0,3,0).

   `focus-within` steht neben `:hover`, weil der Titel ein Verweis ist: wer mit
   der Tastatur durch die Reihe geht, bekommt dieselbe Rueckmeldung wie wer mit
   dem Zeiger darueberfaehrt. Das ist keine zweite Bewegung, es ist dieselbe. */
.gtr-raster .gtp-ref-karte {
  position: relative;
  transition: transform .15s ease-out, box-shadow .15s ease-out;
}
.gtr-raster .gtp-ref-karte:hover,
.gtr-raster .gtp-ref-karte:focus-within {
  transform: translateY(-4px);
  box-shadow: 0 10px 26px rgba(12, 33, 72, .14);
}
/* Kein Uebergang mehr an den vier Teilen, die im Bestand einen hatten. Das ist
   die Haelfte der Zusage: ohne diese Zeile bliebe der Zustand zwar gleich, aber
   jede spaetere Zustandsaenderung (etwa die Titelfarbe unten) faehre wieder
   ueber eine Dauer ein. */
.gtr-raster .gtp-ref-bild-img,
.gtr-raster .gtp-ref-schleier,
.gtr-raster .gtp-ref-pfeil,
.gtr-raster .gtp-ref-titel a { transition: none; }
/* Und die andere Haelfte: der Zielzustand ist der Ruhezustand. */
.gtr-raster .gtp-ref-karte:hover .gtp-ref-bild-img { transform: none; }
.gtr-raster .gtp-ref-karte:hover .gtp-ref-schleier { background: rgba(12, 33, 72, 0); }
.gtr-raster .gtp-ref-karte:hover .gtp-ref-pfeil { transform: none; }
/* Die Unterstreichung bleibt, aber NUR fuer die Tastatur. Sie ist die zweite
   Lage des Fokus (die erste ist der Ring an der Kachel, Regel weiter unten);
   faellt `:has()` aus, ist sie die einzige, die noch da ist. Beim Ueberfahren
   erscheint sie nicht mehr: der Titel wechselt dort seine Farbe, und das tut er
   ohne Uebergang, also ohne Bewegung. #13366D auf #FFFFFF: 11,82:1. */
.gtr-raster .gtp-ref-titel a {
  text-decoration: underline;
  text-decoration-color: transparent;
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
.gtr-raster .gtp-ref-titel a:focus-visible {
  text-decoration-color: var(--brand-link);
}
/* "prefers-reduced-motion: gar keine Bewegung." Der Schatten bleibt: er ist
   kein Weg, sondern ein Zustand, und ohne ihn haette der Zeiger auf dieser
   Seite gar keine Rueckmeldung mehr. Bewegt wird nichts. */
@media (prefers-reduced-motion: reduce) {
  .gtr-raster .gtp-ref-karte { transition: none; }
  .gtr-raster .gtp-ref-karte:hover,
  .gtr-raster .gtp-ref-karte:focus-within { transform: none; }
}

/* GANZE KARTE KLICKBAR, UND ZWAR MIT EINEM EINZIGEN TABSTOPP.
   Der Titel-Verweis spannt sich als `::after` ueber die ganze Kachel. Das
   Bild traegt weiterhin seinen eigenen Verweis, aber der ist seit dem
   27.08. `tabindex="-1"` und `aria-hidden`, liegt also weder im Tabweg noch
   im Vorlesebaum; beide zeigen ohnehin auf dieselbe Adresse. Die Alternative
   waere ein Verweis um die ganze Kachel gewesen, und der haette Kategorie,
   Ton-Zeile und Chips mit in seinen zugaenglichen Namen genommen.

   Der Preis steht hier, damit ihn niemand suchen muss: Text in der Kachel
   laesst sich nicht mehr markieren. Das ist der uebliche Preis dieser Bauart
   und der Grund, warum die Flaeche nicht ueber die Kachel hinausreicht. */
.gtr-raster .gtp-ref-titel a::after {
  content: "";
  position: absolute;
  inset: 0;
}
/* Der Fokusring liegt an der KACHEL und nicht am Wort, weil die Kachel das
   ist, was der Verweis abdeckt. `:has()` traegt ihn; faellt es aus, bleibt
   die Unterstreichung aus der Regel darueber als sichtbarer Fokus stehen.
   Zwei Lagen, damit kein Zustand ohne Anzeige bleibt. */
.gtr-raster .gtp-ref-karte:has(.gtp-ref-titel a:focus-visible) {
  outline: 3px solid #13366D;
  outline-offset: 2px;
}

/* 30.4 Die Ton-Zeile ---------------------------------------------------- */
/* Farbpunkt, RAL-Nummer fett, deutscher Name klein, dahinter die uebrigen
   Chips: eine einzige umbrechende Reihe, damit "dahinter" auch dann noch
   stimmt, wenn die Kachel schmal wird.

   DIE MINDESTHOEHE HAELT DIE KACHELN GLEICH HOCH. Vier der neun Beitraege
   haben keine belegte RAL-Nummer und damit keinen Punkt; ohne diese Zeile
   waeren ihre Kacheln niedriger, und Masonry schoebe die naechste in die
   Luecke. 34 px ist die Hoehe der Zeile mit Punkt (18 px Punkt, 2x8 px Luft).

   KONTRASTE, Grund #FFFFFF: Nummer #1A1D21 16,91:1, Name #5B6675 5,83:1,
   Chips unveraendert aus dem Bestand. Der Farbpunkt selbst traegt keine
   Schwelle, er IST die Auskunft; seine Kante steht in der Regel darunter. */
.gtr-zeile {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 10px;
  margin-top: 10px;
  min-height: 34px;
}
.gtr-zeile .gtp-ref-chips {
  margin: 0;
  min-height: 0;
}
.gtr-ton {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  margin: 0;
}
.gtr-ton__punkt {
  display: block;
  flex: 0 0 18px;
  width: 18px;
  height: 18px;
}
.gtr-ton__nr {
  font-family: var(--brand-font-body);
  font-size: 13px;
  font-weight: 700;
  color: var(--brand-text);
}
.gtr-ton__name {
  font-family: var(--brand-font-body);
  font-size: 12px;
  color: var(--brand-muted);
}

/* DIE GROSSE FASSUNG, im Verzahnungs-Band (Korrektur vom 01.09.2026).
   Es ist dieselbe Zeile und nicht eine zweite Bauart: derselbe Punkt aus
   `gtr_farbpunkt()`, dieselben zwei Spans, dieselbe Reihenfolge. Geaendert sind
   drei Schriftgrade und der Abstand. Die Seite fuehrt damit EIN Ton-Muster, und
   wer die Zeile im Band sieht, erkennt sie auf der Kachel wieder.

   Der Punkt traegt seine 28 px als ATTRIBUT (siehe `gtr_farbpunkt()`); die Regel
   hier wiederholt sie nur, weil `.gtr-ton__punkt` weiter oben eine feste
   Flex-Grundbreite von 18 px setzt und die sonst gewaenne. Zwei Klassen gegen
   eine: 0,2,0 gegen 0,1,0, also unabhaengig von der Reihenfolge in dieser Datei.

   KONTRASTE, Grund #F4F6F9: Nummer #1A1D21 15,84:1, Name #5B6675 5,38:1
   (dasselbe Paar wie die Chips der Kachel, dort gemessen). */
.gtr-ton--gross { gap: 12px; }
.gtr-ton__punkt.gtr-ton__punkt--gross {
  flex: 0 0 28px;
  width: 28px;
  height: 28px;
}
.gtr-ton--gross .gtr-ton__nr { font-size: 17px; }
.gtr-ton--gross .gtr-ton__name { font-size: 14px; }

/* 30.5 Das Verzahnungs-Band --------------------------------------------- */
/* Vollbreit auf der hellen Flaeche des Hauses, zwischen Raster und Abschluss.
   Die Polster sind die der gebauten Sektionen (90 / 72 / 60).

   VON NAVY AUF #F4F6F9 (Korrektur vom 01.09.2026)
   -----------------------------------------------
   Fassung 1 stand auf Navy, und der Abschluss dahinter musste deshalb auf Blau
   ausweichen (siehe 30.6). Die Seite endete damit als einzige der Website nicht
   auf Navy. Mit der hellen Flaeche loest sich beides auf einmal: Foto, Weiss,
   Hell, Navy. Kein Wechsel wiederholt sich, und der Abschluss ist wieder der
   eine dunkle Schluss.

   `#F4F6F9` ist keine neue Farbe und auch keine Erfindung fuer dieses Band. Es
   ist `--brand-ivory`, die Wechselflaeche, mit der /pulverbeschichtung/ und
   /ueber-uns/ ihre hellen Abschnitte gegeneinander absetzen (gemessen an fuenf
   Sektionen, reports/p57-referenzen-fix/kicker.json).

   DREI FARBREGELN SIND ERSATZLOS GEFALLEN, UND DAS IST DER PUNKT
   ---------------------------------------------------------------
   Auf Navy brauchten Kicker, Ueberschrift und Satz je eine eigene Farbe, weil
   der Hausstand dort nicht traegt. Auf `--brand-ivory` traegt er: der Kicker ist
   `.ot-heading__sub` und damit #004FEF aus dem Theme (5,76:1), die Ueberschrift
   nimmt `--brand-onyx` aus der Grundregel dieser Datei, der Satz `--brand-text`
   vom body. Dasselbe Bild wie auf jeder anderen hellen Sektion der Website,
   ohne eine einzige Zeile Farbe.

   DER ABSTAND NACH OBEN BLEIBT 100, DIE BEGRUENDUNG WIRD NACHGEZOGEN
   ------------------------------------------------------------------
   Hier stand: "100 px Weiss zwischen der letzten Kachel und der Navy-Kante".
   Die Kante ist nicht mehr Navy, der Abstand also nicht mehr der Kontrast
   zwischen Weiss und Dunkel, sondern der einzige Trenner, den es zwischen zwei
   hellen Flaechen ueberhaupt gibt. Er wird dadurch nicht unwichtiger, sondern
   wichtiger, und bleibt deshalb unveraendert stehen.

   KONTRASTE, Grund #F4F6F9: Kicker #004FEF 5,76:1, Ueberschrift #0C2148
   15,32:1, Satz #1A1D21 15,84:1. */
.gtr-band {
  background: var(--brand-ivory);
  margin-top: 100px;
  padding: 90px 0;
}
/* ZWEISPALTIG AB 992, EINSPALTIG DARUNTER: links der Weg, rechts die Toene.
   Die 992 ist nicht gegriffen, sondern die Stufe, an der das Theme sein Raster
   von 720 auf 940 px oeffnet (siehe Kopf dieser Datei). Unterhalb davon hat die
   rechte Spalte keinen Platz mehr, ohne dass der Satz links auf vier Woerter je
   Zeile faellt.

   Die rechte Spalte ist auf 340 px gedeckelt statt auf einen Anteil gesetzt:
   ihr Inhalt ist eine Liste kurzer Zeilen (Punkt, Nummer, Name), und die wird
   von mehr Breite nicht besser. Was uebrig bleibt, bekommt die Textspalte.
   `align-items: start` haelt die Toene oben; sonst stuenden vier kurze Zeilen
   mittig neben einem hohen Textblock und saehen aus wie versehentlich
   abgesackt. */
.gtr-band__raster { display: grid; gap: 40px; }
@media (min-width: 992px) {
  .gtr-band__raster {
    grid-template-columns: minmax(0, 1fr) minmax(0, 340px);
    gap: 60px;
    align-items: start;
  }
}
.gtr-band__satz {
  margin: 18px 0 0;
  max-width: 640px;
  font-size: 17px;
  line-height: 30px;
}
.gtr-band__knoepfe {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  margin-top: 34px;
}
/* Der Umriss-Knopf, jetzt auf hellem Grund. Das Theme gibt ihm
   `color: var(--makaffo-color-primary)`, also #004FEF, und ein blauer Knopf
   auf einer hellen Flaeche mit blauem Kicker darueber waere zweimal dieselbe
   Farbe fuer zwei verschiedene Dinge. `--brand-onyx` auf #F4F6F9: 15,32:1
   fuer die Schrift, 15,32:1 fuer den Pfeil und 15,32:1 fuer die Kante, die
   beide ueber `currentColor` beziehungsweise `fill: currentColor` mitziehen.

   SEIT DEM 01.09.2026 IST ER DER EINZIGE KNOPF DES BANDES.
   Hier stand, er saehe neben dem gefuellten Knopf daneben aus wie derselbe in
   blass. Diesen Nachbarn gibt es nicht mehr: der zweite Knopf ist ersatzlos
   aus dem Baustein geschnitten, und der verbliebene traegt seither den Umriss.
   Die Regel selbst bleibt Zeichen fuer Zeichen dieselbe, nur ihre Begruendung
   steht jetzt auf einem Bein statt auf zweien. Der Aufruf der Seite ist der
   gefuellte Knopf im Abschluss, 100 px weiter unten auf Navy.

   Der Schwebezustand braucht hier KEINE eigene Regel, und das ist der
   Unterschied zu Fassung 1. Das Theme faerbt den Knopf beim Ueberfahren
   `#242424` mit weisser Schrift (0,3,0, schlaegt die Umriss-Regel). Auf Navy
   war das die naechste Falle, auf hellem Grund ist es richtig: 13,64:1 gegen
   die Sektion, 15,42:1 fuer die Schrift auf der Fuellung. */
.gtr-band .octf-btn-outline { color: var(--brand-onyx); }

/* Die Ton-Spalte. Kein Raster und keine Kacheln: vier bis fuenf Zeilen
   untereinander, mit dem Abstand, den zwei 28-px-Punkte brauchen, um nicht
   aneinanderzustossen. Die Zeilen selbst stehen in 30.4, weil es dieselben
   sind wie auf der Kachel. */
.gtr-band__toene { display: grid; gap: 14px; }

@media (max-width: 991px) {
  .gtr-band { margin-top: 72px; padding: 72px 0; }
  /* Einspaltig, und die Toene stehen UNTER den Knoepfen. Das ist die
     Reihenfolge im Markup, es braucht dafuer also keine Regel: der Auftrag
     nennt sie ausdruecklich, und sie ergibt sich hier von selbst, weil die
     Textspalte im Markup vor der Ton-Spalte steht. Genannt ist sie trotzdem,
     damit niemand die zwei Spalten spaeter aus Versehen tauscht. */
}
@media (max-width: 767px) {
  .gtr-band { margin-top: 60px; padding: 60px 0; }
  .gtr-band__satz { font-size: 16px; line-height: 27px; }
  .gtr-band__knoepfe { gap: 12px; }
  .gtr-band__raster { gap: 32px; }
}

/* 30.6 Der Abschluss ---------------------------------------------------- */
/* Muster der uebrigen Seiten: vollbreit auf Navy, Ueberschrift versal in Weiss,
   ein gedaempfter Satz darunter, ein gefuellter Knopf. Die Klasse
   `gtp-abschluss` bleibt am Kasten, weil an ihr Block 9 haengt: sie nimmt dem
   Inhaltsbereich den unteren Abstand, damit der Streifen buendig auf dem
   Fussbereich sitzt statt auf einem weissen Sockel.

   ZURUECK AUF NAVY (Korrektur vom 01.09.2026)
   -------------------------------------------
   Hier stand `#004FEF`, und die Begruendung dafuer war richtig, solange ihre
   Bedingung galt: das Band davor war Navy, zwei gleiche Flaechen hintereinander
   waren der Befund, an dem /ueber-uns/ in v1 gescheitert ist, also wich der
   Abschluss aus. Mit dem hellen Band faellt die Bedingung weg, und mit ihr die
   Ausweichung. `--brand-onyx` ist die Flaeche, auf der jede andere Seite dieser
   Website schliesst.

   Der Knopf geht denselben Weg zurueck: auf Blau war `octf-btn-primary` eine
   Flaeche ohne Kanten (der Knopf traegt vom Theme dieselbe Farbe wie die
   Sektion), deshalb stand dort die helle Umkehrung. Auf Navy ist der gefuellte
   Primaerknopf wieder der richtige, und der Auftrag nennt ihn beim Namen.

   KONTRASTE, Grund #0C2148: Ueberschrift #FFFFFF 15,83:1, Satz #C6D0E0
   10,18:1. Der Satz ist gedaempft und nicht weiss, weil der einzige andere
   Navy-Abschluss der Website (/ueber-uns/) es genauso haelt; auf `#004FEF` gab
   es dazu keine Wahl, dort liegt #C6D0E0 bei 4,01:1 und damit unter der
   Schwelle. Der Wortlaut ist unveraendert.

   Der Knopf hebt sich mit 2,54:1 nicht von seinem Grund ab (#004FEF auf
   #0C2148). Das ist Hausstand und kein Fehler dieses Laufs: /ueber-uns/ macht
   es an derselben Stelle genauso, und die Schrift auf dem Knopf steht bei
   6,24:1. Es an EINER Seite anders zu machen hiesse, das Muster zu brechen,
   das dieser Auftrag herstellen soll. */
.gtr-schluss {
  background: var(--brand-onyx);
  padding: 90px 0;
}
.gtr-schluss__titel { color: #FFFFFF; }
.gtr-schluss__satz {
  margin: 18px 0 0;
  max-width: 760px;
  font-size: 17px;
  line-height: 30px;
  color: #C6D0E0;
}
.gtr-schluss__knopf { margin-top: 34px; }
@media (max-width: 991px) {
  .gtr-schluss { padding: 72px 0; }
}
@media (max-width: 767px) {
  .gtr-schluss { padding: 60px 0; }
  .gtr-schluss__satz { font-size: 16px; line-height: 27px; }
}

/* 30.7 Die Ueberschriften der zwei neuen Sektionen ---------------------- */
/* Die Bausteine benutzen das Ueberschriften-Markup des Hauses
   (`.ot-heading` mit `__sub` und `__title`), damit Groesse, Zeilenhoehe und
   Versalien dieselben sind wie auf den gebauten Seiten: 42/52 px, mobil
   28/38, alles aus dem Theme gelesen.

   ZWEI DINGE FEHLEN DORT UND STEHEN DESHALB HIER. Erstens die Farbe: weiter
   oben in dieser Datei bekommt jede Ueberschrift `color: var(--brand-onyx)`,
   und dunkles Navy auf Navy waere Kontrast 1,00:1, also FALLE 69 an einer
   neuen Stelle. Seit der Korrektur vom 01.09.2026 betrifft das nur noch EINE
   der zwei Ueberschriften: der Abschluss setzt sie ausdruecklich (30.6), das
   Band steht jetzt hell und laesst genau deshalb die Grundregel gelten. Eine
   Farbregel weniger ist hier keine Nachlaessigkeit, sondern die Auskunft, dass
   die Flaeche zum Hausstand passt.
   Zweitens der mitwachsende Schriftgrad auf schmalen Fenstern: Block 7 traegt
   ihn, haengt aber an `.elementor .gtp-versal.elementor-widget`, und diese
   Seite hat keinen Elementor-Kasten. Die Schlagzeilen hier sind kuerzer als
   "PULVERBESCHICHTUNG", der Grund von Block 7 trifft sie also nicht; die
   28 px des Themes reichen. Gemessen wird es trotzdem, bei 390 und bei 320. */
.gtr-band__kopf,
.gtr-schluss__kopf { margin: 0; }

/* =========================================================================
   Block 31: DIE EINZELSEITEN DER REFERENZEN (01.09.2026)
   =========================================================================
   Neun Beitraege, ein Template. Das Markup liegt in
   `widgets/referenzen/detail-*.html` und in der functions.php des Childs, der
   Stil steht hier, additiv im naechsten freien Block.

   ALLES HAENGT AN `.gtr-det-hero` ODER `.gtr-det-inhalt`
   ------------------------------------------------------
   Keine einzige Regel dieses Blocks trifft eine andere Seite. Der Kopf haengt
   ueber `:has(.gtr-det-hero)` am Kopfbereich, der Inhalt an dem Kasten, den
   `single-ot_portfolio.php` um ihn legt. Die Kachel-Regeln kommen aus Block
   30.3 und werden ueber die Klasse `gtr-raster` GEHOLT, nicht abgeschrieben.
   ====================================================================== */

/* 31.1 Der Kopf: Chevron-Grund, kein Foto, Inhalt an der Rasterkante ---- */
/* DER GRUND IST DAS BLAUE CHEVRON-BAND DER STARTSEITE, UND ZWAR DASSELBE BILD
   ---------------------------------------------------------------------------
   Nicht ein nachgebautes Muster aus Verlaeufen, sondern der Anhang, den die
   Startseite unter ihrem Abschnitt "Unsere Leistungen" als Grund fuehrt. Die
   Adresse wird zur Laufzeit von dort gelesen (`gtr_chevron_quelle()`) und in
   die eine Stelle geschrieben, an der das Theme den Grund des Kopfbereichs
   fuehrt. Es gibt damit fuer dieses Muster genau EINEN Wahrheitsort.

   DER SCHLEIER FAELLT, UND ZWAR GERECHNET
   ---------------------------------------
   `.page-header::before` legt auf JEDEN Kopfbereich einen Navy-Schleier mit
   0,7 Deckung. Er ist da, weil unter dem Titel sonst ein Foto liegt. Hier liegt
   kein Foto, sondern eine Flaeche, die schon dunkel genug ist: der HELLSTE
   Bildpunkt des sichtbaren Ausschnitts ist rgb(0, 99, 249), Weiss steht darauf
   bei 5,06:1 (nachgemessen ueber den ganzen Ausschnitt, nicht an einer Stelle).
   Ein Schleier daueber machte das Muster unsichtbar und den Kopf zu einer
   glatten dunklen Flaeche, also genau zu dem, was der Auftrag nicht will.

   Die Startseite haelt es an derselben Stelle genauso: weisse Schrift steht
   dort ohne Schleier direkt auf diesem Bild.

   DIE BAUART WIRD BLOCK STATT TABELLE, UND ZWAR AN ALLEN BREITEN
   ---------------------------------------------------------------
   Der Kopfbereich ist beim Theme eine Tabellenzelle mit fester Hoehe (409 px,
   unter 600 px 250 px), in der der Inhalt mittig sitzt. Das Polster dieses
   Auftrags waere darin nicht ablesbar: eine feste Hoehe verschluckt jede Stufe,
   die kleiner ist als sie selbst. Der Kopf einer Einzelseite fuehrt nur Kicker
   und Schlagzeile, ist also kuerzer als der des Archivs; er bekommt seine Hoehe
   deshalb aus Inhalt plus Polster, wie jeder gebaute Hero-Kopf dieser Website.

   Der Archiv-Kopf macht das ab 992 px NICHT, und das ist kein Widerspruch:
   dort traegt der Hero vier Zeilen plus Knopf und ist mit 90 px Polster ohnehin
   hoeher als die 409. Dort ist die feste Hoehe von selbst unwirksam, hier
   muesste sie weggenommen werden. */
.page-header:has(.gtr-det-hero) {
  display: block;
  height: auto;
  min-height: 0;
  padding: 0;
}
.page-header:has(.gtr-det-hero) > .dcell { display: block; }
.page-header:has(.gtr-det-hero)::before {
  background-color: transparent;
  opacity: 1;
}
/* `.text-center` steht als Klasse am Kopfbereich des Themes und wirkt ueber
   Vererbung. Der Kasten setzt seine Ausrichtung deshalb selbst, genau wie
   `.gtr-hero` auf dem Archiv. Fuer den linken Anschlag ist NICHTS zu rechnen:
   der Kopfbereich bringt seinen eigenen `.container` mit, und der sitzt
   gemessen auf derselben Kante wie jede Ueberschrift der Seite. */
.gtr-det-hero {
  margin: 0;
  text-align: left;
}
/* Das Site-Polster, in allen drei Stufen ausgeschrieben, mit denselben Zahlen
   und denselben Umschaltbreiten wie der Archiv-Kopf in Block 30.1. Abgelesen an
   /ueber-uns/, /farben-oberflaechen/ und /werkstoff-stahl/: 90 ab 1025, 72 von
   768 bis 1024, 60 darunter. */
@media (min-width: 1025px) {
  .page-header:has(.gtr-det-hero) .gtr-det-hero { padding: 90px 0; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .page-header:has(.gtr-det-hero) .gtr-det-hero { padding: 72px 0; }
}
@media (max-width: 767px) {
  .page-header:has(.gtr-det-hero) .gtr-det-hero { padding: 60px 0; }
}
/* Der Kicker ist die Kategorie. Dieselben Werte wie `.gtr-hero__kicker` auf dem
   Archiv, denn es ist dieselbe Zeile an derselben Stelle.
   `:empty` blendet ihn aus, wenn ein Beitrag keine Kategorie fuehrt: das ist
   ein Inhaltszustand und keine Panne, und ein leerer Absatz mit 14 px Abstand
   waere eine Luecke, die niemand erklaeren kann. */
.gtr-det-hero__kicker {
  margin: 0 0 14px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #FFFFFF;
}
.gtr-det-hero__kicker:empty { display: none; }
/* Die Klasse `page-title` bleibt am h1 und bringt Farbe und Versalien des
   Themes mit, dazu die zwei Regeln dieser Datei zur Worttrennung im
   Kopfbereich. Der Schriftgrad faellt von den 58 px des Themes auf die 42 px,
   mit denen jede andere Seite ihre Hero-Schlagzeile setzt.

   Der Zweisatz und die Bedingung `min-width: 768px` sind dieselben wie bei
   `.gtr-hero__titel` und aus demselben Grund: die Theme-Regel steht bei 0,2,0,
   und unter 768 px gilt der teuer erkaufte mitwachsende Grad aus dem Abschnitt
   "Seitentitel im Kopfbereich" weiter oben. */
.gtr-det-hero__titel {
  margin: 0;
  line-height: 1.08;
}
@media (min-width: 768px) {
  .page-header .gtr-det-hero__titel { font-size: 42px; line-height: 52px; }
}
@media (max-width: 767px) {
  .gtr-det-hero__kicker { font-size: 12px; letter-spacing: .14em; }
}

/* 31.2 Die Ton-Zeile unter dem Kopf ------------------------------------- */
/* Dieselbe Zeile wie auf der Kachel, aus derselben Funktion, eine Stufe
   groesser. "Eine Stufe groesser" ist keine neue Groesse: es sind die 28 px des
   Verzahnungs-Bandes, also die zweite und einzige andere Groesse, die diese
   Website fuer den Farbpunkt kennt. Nummer 17 px, Name 14 px kommen aus
   Block 30.4 und stehen hier nicht noch einmal.

   Die Chips gehen denselben Schritt mit: 14 statt 12 px, Innenabstand 5 zu 12
   statt 3 zu 8. Die Farben bleiben (`--brand-muted` auf `--brand-ivory`,
   5,38:1), es ist derselbe Chip in gross.

   `min-height` faellt hier weg. Auf der Kachel haelt es neun Kacheln gleich
   hoch; hier steht die Zeile allein, und eine Mindesthoehe waere eine Luecke. */
.gtr-det-ton { padding: 28px 0 0; }
.gtr-zeile--gross {
  gap: 10px 16px;
  margin-top: 0;
  min-height: 0;
}
.gtr-zeile--gross .gtp-ref-chips {
  gap: 8px;
  min-height: 0;
}
.gtr-zeile--gross .gtp-ref-chip {
  padding: 5px 12px;
  font-size: 14px;
}
@media (max-width: 767px) {
  .gtr-det-ton { padding: 20px 0 0; }
}

/* 31.3 Der Inhalt: Typografie ins Site-Raster --------------------------- */
/* Der Inhalt der neun Beitraege ist tabu, sein Wortlaut ist unveraendert. Was
   sich aendert, ist die Schrift, in der er steht.

   DIE SPEZIFITAET IST HIER DER GANZE AUFWAND
   -------------------------------------------
   Elementor schreibt seine Typografie als
   `.elementor-675 .elementor-element.elementor-element-db34669 .elementor-heading-title`,
   also mit vier Klassen (0,4,0). Eine Regel auf `.gtr-det-inhalt h2` (0,1,1)
   verloere still, und zwar ohne Fehler und ohne Konsolenausgabe, genau wie in
   FALLE 71. Die Regeln hier stehen deshalb ebenfalls bei (0,4,0) und gewinnen
   ueber die Reihenfolge: das Elementor-CSS steht im Kopf VOR dem Verweis auf
   brand.css (nachgemessen am gerenderten HTML, Zeichen 24024 gegen 30605).

   ZWISCHENTITEL: ARCHIVO STATT EPILOGUE, NAVY STATT #242424
   ----------------------------------------------------------
   Archivo ist die Ueberschrift-Schrift dieser Website (Zeile 111 dieser Datei),
   Epilogue kommt aus dem Demo-Inhalt des Themes. `--brand-onyx` auf Weiss:
   15,32:1. Groesse und Zeilenhoehe bleiben, wie der Beitrag sie fuehrt (30/40,
   mobil 24/36): das sind Inhaltseinstellungen, und der Auftrag nennt die
   SCHRIFT, nicht den Grad.

   Der TAG wird ausserdem zu h2, aber nicht hier: das macht
   `gtr_det_zwischentitel()` beim Rendern, denn CSS kann kein Element umbenennen.

   FLIESSTEXT: INTER, 16/28, `--brand-muted`
   ------------------------------------------
   Vorgefunden: Epilogue 14/20 in #585858, also der blosse Vorgabewert des
   Themes. Die Zahlen 16/28 und `--brand-muted` sind nicht gegriffen, sondern
   an den gebauten Seiten abgelesen: /pulverbeschichtung/ setzt seinen
   Fliesstext auf genau diese Werte (gemessen am DOM, `.elementor-widget-text-
   editor p`). Geaendert ist gegenueber dort nur die Schrift, und die nennt der
   Auftrag beim Namen. `#5B6675` auf Weiss: 5,83:1.

   HAKEN-LISTE: WIE AUF DEN UEBRIGEN SEITEN
   -----------------------------------------
   Vorgefunden: Epilogue, fett, VERSAL, #242424. Die Haken-Listen der uebrigen
   Seiten stehen in Inter 16/26 in `--brand-muted`, in Satzschreibung und ohne
   Fettung (gemessen an `.gtp-liste .ot-icon-list-item` auf /pulverbeschichtung/).
   Genau das steht hier. Das Zeichen selbst bleibt unangetastet: seine Farbe
   (#004FEF) und seine Groesse (18 px) sind Einstellungen des Beitrags.

   BEITRAGSBILD: VOLLE RASTERBREITE, 4 ZU 3 WIE IN DER UEBERSICHT
   ---------------------------------------------------------------
   Die volle Rasterbreite hat es schon (gemessen 1170 px bei 1280 px Fenster,
   es steht in einem Elementor-Kasten ohne eigene Breite). Neu ist der
   Zuschnitt: `aspect-ratio: 4 / 3` mit `object-fit: cover`, dieselben zwei
   Zeilen, mit denen Block 30.3 die Kacheln der Uebersicht zuschneidet.

   FALLE 71 GILT HIER, ANDERS ALS AUF DEM ARCHIV. Der Inhalt einer Einzelseite
   liegt IN einem `.elementor`-Kasten, `.elementor img { height: auto }` (0,1,1)
   greift also. Der Waehler hier steht bei (0,2,0) und schlaegt ihn; ein blosses
   `img.gtp-ref-seitenbild-img` waere mit (0,1,1) ein Gleichstand, den nur die
   Ladereihenfolge entschiede. */
.gtr-det-inhalt .elementor-element.elementor-widget-heading .elementor-heading-title {
  font-family: var(--brand-font-heading);
  color: var(--brand-onyx);
}
.gtr-det-inhalt .elementor-element.elementor-widget-text-editor,
.gtr-det-inhalt .elementor-element.elementor-widget-text-editor p {
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 28px;
  color: var(--brand-muted);
}
/* FUENF KLASSEN, UND JEDE EINZELNE IST NOETIG.
   Elementor schreibt die Schrift der Haken-Liste als
   `.elementor-675 .elementor-element.elementor-element-a74112c
    .elementor-icon-list-item > .elementor-icon-list-text`, also mit FUENF
   Klassen (0,5,0). Der erste Wurf dieser Regel stand bei (0,4,0) und verlor
   still: die Liste blieb versal und fett, ohne Fehler und ohne Konsolenausgabe.
   Sechs Klassen stehen hier statt fuenf, damit die Regel nicht von der
   Ladereihenfolge abhaengt. */
.gtr-det-inhalt .elementor-widget.elementor-element.elementor-widget-icon-list
  .elementor-icon-list-item > .elementor-icon-list-text {
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 26px;
  font-weight: 400;
  text-transform: none;
  color: var(--brand-muted);
}
.gtr-det-inhalt .gtp-ref-seitenbild-img {
  aspect-ratio: 4 / 3;
  object-fit: cover;
}

/* 31.4 Die Anfrage-Zeile ------------------------------------------------ */
/* Ein schmales Band auf der hellen Wechselflaeche des Hauses. Es ist schmaler
   als eine gebaute Sektion (48 statt 90 px Polster), weil es eine Zeile fuehrt
   und keinen Abschnitt: der Auftrag sagt "ein schmales Band".

   Die Umschaltbreiten sind hier 991 und 767, also die der gebauten Sektionen
   (Block 30.5), und nicht die 1024 des Kopfes. Das ist kein Versehen: die
   Hero-Koepfe dieser Website schalten auf den Elementor-Stufen, die Sektionen
   auf den Rasterstufen des Themes. Beide Reihen sind abgelesen und nicht
   erfunden, und sie sind verschieden.

   Satz links, Knoepfe rechts, ab 768 px nebeneinander. Darunter stapeln sie in
   der Reihenfolge des Markups: erst die Frage, dann die zwei Wege.

   KONTRASTE, Grund `--brand-ivory`: Satz `--brand-text` 15,84:1, Umriss-Knopf
   `--brand-onyx` 15,32:1 (Schrift wie Kante, sie zieht ueber currentColor mit),
   gefuellter Knopf Weiss auf #004FEF 6,13:1. Der Umriss-Knopf bekommt dieselbe
   Farbe wie im Band auf /referenzen/ und aus demselben Grund: das Theme gaebe
   ihm sonst das Blau des gefuellten Knopfes daneben. */
.gtr-det-anfrage {
  background: var(--brand-ivory);
  margin-top: 72px;
  padding: 48px 0;
}
.gtr-det-anfrage__raster {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 20px 40px;
}
.gtr-det-anfrage__satz {
  margin: 0;
  max-width: 46ch;
  font-size: 17px;
  line-height: 30px;
  color: var(--brand-text);
}
.gtr-det-anfrage__knoepfe {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}
.gtr-det-anfrage .octf-btn-outline { color: var(--brand-onyx); }
@media (max-width: 991px) {
  .gtr-det-anfrage { margin-top: 60px; padding: 40px 0; }
}
@media (max-width: 767px) {
  .gtr-det-anfrage { margin-top: 48px; padding: 32px 0; }
  .gtr-det-anfrage__satz { font-size: 16px; line-height: 27px; }
  .gtr-det-anfrage__knoepfe { gap: 12px; }
}

/* 31.5 Die Reihe "Mehr aus <Kategorie>" --------------------------------- */
/* Weiss, mit dem Polster der gebauten Sektionen. Das Raster kommt aus Block 5
   (`.gtp-ref-teaser`), die Kachel aus Block 30.3 (`.gtr-raster`): beide sind
   GEHOLT und nicht abgeschrieben, deshalb steht hier zu Raster und Kachel
   keine einzige Zeile.

   Die Ueberschrift benutzt das Ueberschriften-Markup des Hauses
   (`.ot-heading__title`), damit Groesse, Zeilenhoehe und Versalien dieselben
   sind wie auf den gebauten Seiten: 42/52, mobil 28/38, alles aus dem Theme.
   Ihre Farbe kommt aus der Grundregel dieser Datei (`--brand-onyx`, 15,32:1 auf
   Weiss); eine eigene Farbregel braucht sie nicht, weil die Flaeche zum
   Hausstand passt. */
.gtr-det-mehr { padding: 90px 0; }
.gtr-det-mehr__kopf { margin: 0 0 34px; }
.gtr-det-mehr__alle { margin: 34px 0 0; }
/* Der Verweis traegt seine Unterstreichung dauerhaft und nicht erst beim
   Ueberfahren: er steht allein unter einem Raster aus Kacheln, und ein Wort,
   das sich nur durch seine Farbe von Fliesstext unterscheidet, ist als Verweis
   nicht erkennbar. `--brand-link` auf Weiss: 11,82:1. */
.gtr-det-mehr__alle-link {
  font-family: var(--brand-font-body);
  font-size: 16px;
  font-weight: 600;
  color: var(--brand-link);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
}
@media (max-width: 991px) {
  .gtr-det-mehr { padding: 72px 0; }
}
@media (max-width: 767px) {
  .gtr-det-mehr { padding: 60px 0; }
  .gtr-det-mehr__kopf { margin: 0 0 26px; }
}

/* 31.6 Der Fokus der neuen Verweise ------------------------------------- */
/* DER RING IST EIN SCHATTEN UND KEIN `outline`, UND DAS IST KEIN GESCHMACK
   -------------------------------------------------------------------------
   Im Zusatz-CSS der Website steht `a:focus { outline: none !important }`,
   site-weit. Ein `outline` an einem Verweis ist damit tot, und zwar auch mit
   hoeherer Spezifitaet: gegen `!important` hilft nur `!important`. Ein zweites
   `!important` daraufzusetzen hiesse, den Streit zu gewinnen und die Regel im
   Bestand stehen zu lassen; das waere eine Aenderung an einer Bestandsseite,
   die dieser Auftrag nicht hat.

   `box-shadow` faellt nicht unter diese Regel. Er zeichnet denselben Ring,
   ohne dass irgendwo ein zweites `!important` steht, und er trifft nur die
   drei Verweise dieses Auftrags. Das Kachel-Raster daneben hat seinen eigenen
   Fokusring aus Block 30.3, der ueber `:has()` an der KACHEL haengt und
   deshalb von derselben Regel nie betroffen war.

   `--brand-link` auf `--brand-ivory`: 10,29:1, auf Weiss 11,82:1. */
.gtr-det-anfrage a:focus-visible,
.gtr-det-mehr__alle-link:focus-visible {
  box-shadow: 0 0 0 3px var(--brand-link);
}
.gtr-det-mehr__alle-link:focus-visible { border-radius: 2px; }

/* =========================================================================
   Block 32: DIE KONTAKT-SEITE (01.09.2026)
   =========================================================================
   Eine Seite, eine Vorlage. Das Markup liegt in `widgets/kontakt/*.html` und
   in `page-kontakt.php`, der Stil steht hier, additiv im naechsten freien
   Block.

   ALLES HAENGT AN `.gtk-kopf`, `.gtk-band`, `.gtk-person` ODER `.gtk-inhalt`
   ---------------------------------------------------------------------------
   Keine einzige Regel dieses Blocks trifft eine andere Seite. Der Kopf haengt
   ueber `:has(.gtk-kopf)` am Kopfbereich des Themes, alles andere an dem
   Kasten, den `page-kontakt.php` um die zwei Baender legt. Es gibt in diesem
   Block keine Seiten-Kennung und keinen Kurznamen, wie ueberall sonst in
   dieser Datei.

   `gtk-` IST NICHT FREI, UND DAS IST BEDACHT
   ------------------------------------------
   Das Praefix fuehrt bereits /kleinserien/ (Seite 1983), mit den zwei
   BEM-Bloecken `.gtk-menge` und `.gtk-takt` und ihren `--gtk-*`-Variablen. Der
   Auftrag nennt `gtk-` ausdruecklich, also wird es genommen; kollisionsfrei
   bleibt es durch zwei Zusagen dieses Blocks: neue Blocknamen (`gtk-kopf`,
   `gtk-band`, `gtk-kanal`, `gtk-zeiten`, `gtk-person`, `gtk-inhalt`) und KEIN
   `--gtk-*` auf `:root`. In brand.css stand `gtk-` bis zu diesem Block null
   mal; die zwei Bestands-Bloecke halten ihre Variablen im eigenen Waehler.
   /kleinserien/ faehrt deshalb als Gegenprobe im Diff dieses Laufs mit.

   DER KOPF IST DER DER EINZELSEITEN UND NICHT DER DES ARCHIVS
   -----------------------------------------------------------
   Der Auftrag nennt zwei Wege: Foto plus Navy-Verlauf von links (wie Block
   30.1), wenn der Anhang `kt-gebaeude` vorliegt, ersatzweise den Chevron-Grund
   der Einzelseiten (Block 31.1). `kt-gebaeude` liegt nicht in der Mediathek,
   also ist 31.1 die Vorlage. Damit faellt der Verlauf ersatzlos weg: er ist
   der Schleier UEBER einem Foto, und wo kein Foto liegt, verdeckt er nur das
   Muster.
   ====================================================================== */

/* 32.1 Der Kopf: Chevron-Grund, Inhalt an der Rasterkante --------------- */
/* DIE BAUART WIRD BLOCK STATT TABELLE, UND ZWAR AN ALLEN BREITEN
   ---------------------------------------------------------------
   Der Kopfbereich ist beim Theme eine Tabellenzelle mit fester Hoehe (409 px,
   unter 600 px 250 px), in der der Inhalt mittig sitzt. Eine feste Hoehe
   verschluckt jede Polster-Stufe, die kleiner ist als sie selbst, und der Kopf
   dieser Seite soll seine Hoehe aus Inhalt plus Polster bekommen wie jeder
   gebaute Hero dieser Website. Wortgleich die Begruendung aus Block 31.1, und
   hier gilt sie an allen Breiten: der Kopf traegt vier Zeilen plus Knopf und
   ist damit ueber 992 px ohnehin hoeher als die 409, darunter waeren die
   250 px zu wenig.

   DER SCHLEIER FAELLT, UND ZWAR GERECHNET
   ---------------------------------------
   `.page-header::before` legt auf JEDEN Kopfbereich einen Navy-Schleier mit
   0,7 Deckung. Er ist da, weil unter dem Titel sonst ein Foto liegt. Hier
   liegt kein Foto, sondern das Chevron-Band der Startseite, und das ist schon
   dunkel genug: der HELLSTE Bildpunkt des sichtbaren Ausschnitts ist
   rgb(0, 99, 249), Weiss steht darauf bei 5,06:1 (nachgemessen fuer Block
   31.1, ueber den ganzen Ausschnitt und nicht an einer Stelle; es ist
   dasselbe Bild aus derselben Quelle). Ein Schleier darueber machte das Muster
   unsichtbar und den Kopf zu einer glatten dunklen Flaeche. */
.page-header:has(.gtk-kopf) {
  display: block;
  height: auto;
  min-height: 0;
  padding: 0;
}
.page-header:has(.gtk-kopf) > .dcell { display: block; }
.page-header:has(.gtk-kopf)::before {
  background-color: transparent;
  opacity: 1;
}

/* `.text-center` steht als Klasse am Kopfbereich des Themes und wirkt ueber
   Vererbung. Der Kasten setzt seine Ausrichtung deshalb selbst, genau wie
   `.gtr-hero` und `.gtr-det-hero`.

   DER DECKEL VON 870 PX IST HAUSSTAND UND KEIN NEUER WERT.
   Er steht in Block 17 (Werkstoff) und Block 27 (Ueber uns) mit derselben
   Begruendung: bei voller Rasterbreite haette die Einleitung Zeilen von gut
   150 Zeichen, und das Auge findet den Zeilenanfang nicht mehr zurueck. Der
   Archiv-Kopf (Block 30.1) deckelt stattdessen auf `--gtp-raster-halb`, aber
   nur, weil dort ein Foto neben dem Text liegt. Hier liegt keines. */
.gtk-kopf {
  max-width: 870px;
  margin: 0;
  text-align: left;
}

/* Das Site-Polster, in allen drei Stufen ausgeschrieben, mit denselben Zahlen
   und denselben Umschaltbreiten wie Block 30.1 und 31.1. Abgelesen an
   /ueber-uns/, /farben-oberflaechen/ und /werkstoff-stahl/: 90 ab 1025,
   72 von 768 bis 1024, 60 darunter. */
@media (min-width: 1025px) {
  .page-header:has(.gtk-kopf) .gtk-kopf { padding: 90px 0; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .page-header:has(.gtk-kopf) .gtk-kopf { padding: 72px 0; }
}
@media (max-width: 767px) {
  .page-header:has(.gtk-kopf) .gtk-kopf { padding: 60px 0; }
}

/* Kicker, Schlagzeile und Satz sind zeichengleich die des Archiv-Kopfs
   (Block 30.1). Es ist dieselbe Zeile an derselben Stelle, und wo der Bestand
   eine Antwort hat, wird sie genommen und nicht neu erfunden. */
.gtk-kopf__kicker {
  margin: 0 0 14px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #FFFFFF;
}
/* Die Klasse `page-title` bleibt am h1 und bringt Farbe und Versalien des
   Themes mit, dazu die zwei Regeln dieser Datei zur Worttrennung im
   Kopfbereich. Der Schriftgrad faellt von den 58 px des Themes auf die 42 px,
   mit denen jede andere Seite ihre Hero-Schlagzeile setzt.

   Der Zweisatz und die Bedingung `min-width: 768px` sind dieselben wie bei
   `.gtr-hero__titel` und aus demselben Grund: die Theme-Regel
   `.page-header .page-title { font-size: 58px }` steht bei 0,2,0, und unter
   768 px gilt der mitwachsende Grad `clamp(22px, 7vw, 36px)` aus dem Abschnitt
   "Seitentitel im Kopfbereich" weiter oben. */
.gtk-kopf__titel {
  margin: 0;
  line-height: 1.08;
}
@media (min-width: 768px) {
  .page-header .gtk-kopf__titel { font-size: 42px; line-height: 52px; }
}
.gtk-kopf__sub {
  margin: 18px 0 0;
  max-width: none;
  font-size: 17px;
  line-height: 30px;
  color: #FFFFFF;
}
/* Eine Zeile, wie `.gtr-hero__knopf`. Alles Weitere bringt die Theme-Huelle
   `octf-btn octf-btn-primary` mit. */
.gtk-kopf__knopf { margin-top: 30px; }
@media (max-width: 767px) {
  .gtk-kopf__kicker { font-size: 12px; letter-spacing: .14em; }
  .gtk-kopf__sub { font-size: 16px; line-height: 27px; }
}

/* 32.2 Das Kontakt-Band: Kanaele links, Zeiten rechts ------------------- */
/* Der Grund ist ausdruecklich weiss gesetzt und nicht dem Theme ueberlassen.
   Die Kontrastwerte dieses Blocks sind gegen #FFFFFF gerechnet, und eine
   gerechnete Zahl, deren Grund von einer fremden Einstellung abhaengt, ist
   keine Zusage. Die Flaechenfolge der Seite lautet damit Chevron, Weiss,
   Hell: wie auf /referenzen/, wo auf den Kopf ebenfalls Weiss und dann
   `--brand-ivory` folgt.

   Die Polster sind die der gebauten Sektionen, 90 / 72 / 60 (Block 30.5). */
.gtk-band {
  background: #FFFFFF;
  padding: 90px 0;
}
@media (max-width: 991px) { .gtk-band { padding: 72px 0; } }
@media (max-width: 767px) { .gtk-band { padding: 60px 0; } }

/* ZWEISPALTIG AB 992, EINSPALTIG DARUNTER.
   Die 992 ist nicht gegriffen, sondern die Stufe, an der das Theme sein Raster
   von 720 auf 940 px oeffnet (siehe den Kopf dieser Datei); der Auftrag nennt
   sie, und Block 30.5 schaltet an derselben Stelle.

   Zwei gleiche Spalten und nicht 1fr plus fester Deckel wie in Block 30.5:
   dort steht rechts eine Liste aus vier kurzen Zeilen, hier ein Abschnitt mit
   Ueberschrift, sechs Zeilen und einem Satz. Er traegt so viel wie die Kanaele
   links und bekommt deshalb ebenso viel Platz. `align-items: start` haelt
   beide Spalten oben; sonst stuenden drei Kanaele mittig neben einem hoeheren
   Block und saehen aus wie versehentlich abgesackt. */
.gtk-band__raster { display: grid; gap: 48px; }
@media (min-width: 992px) {
  .gtk-band__raster {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 60px;
    align-items: start;
  }
}

.gtk-kanaele { margin: 0; padding: 0; list-style: none; }
/* Die Trennlinien sind Zierrat und kein Bedienelement: sie ordnen drei Zeilen,
   die auch ohne sie zu lesen waeren. `--brand-border` ist dafuer der
   Hausstand, an jeder Karte und jedem Datenblatt dieser Website. */
.gtk-kanal {
  margin: 0;
  padding: 24px 0;
  border-top: 1px solid var(--brand-border);
}
.gtk-kanal:last-child { border-bottom: 1px solid var(--brand-border); }
.gtk-kanal__etikett {
  display: block;
  font-family: var(--brand-font-body);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--brand-muted);
}
/* Der Wert ist die grosse Zeile, um die es dem Auftrag geht ("drei grosse
   Direktkanaele als klickbare Zeilen").

   `overflow-wrap: break-word` ist hier kein Beiwerk: die Mailadresse ist ein
   einziges Wort aus 29 Zeichen, und bei 390 px Fenster steht sie sonst ueber
   der rechten Kante. Die Rufnummer traegt ein Leerzeichen und bricht deshalb
   von selbst an der richtigen Stelle.

   Der Grad waechst mit, damit die Adresse in der halben Spalte bei 992 px
   Platz findet und bei 1280 px nicht verloren wirkt: 20 px unten, 28 px oben.

   Die Farbe ist `--brand-link`, also die Linkfarbe des Hauses (11,82:1 auf
   Weiss). Die Adresszeile ist kein Verweis und traegt deshalb `--brand-onyx`;
   eine Zeile in Linkfarbe, die nicht klickt, ist ein gebrochenes Versprechen. */
.gtk-kanal__wert {
  display: block;
  margin-top: 8px;
  font-family: var(--brand-font-heading);
  font-size: clamp(20px, 2.1vw, 28px);
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -.01em;
  color: var(--brand-link);
  text-decoration: none;
  overflow-wrap: break-word;
}
a.gtk-kanal__wert:hover,
a.gtk-kanal__wert:focus { color: var(--brand-onyx); }
.gtk-kanal__wert--ort { color: var(--brand-onyx); }

/* Der Pfeil-Verweis des Hauses (Block 20). Er steht hier ausgeschrieben und
   wird nicht an die Regel dort angehaengt: der Auftrag sagt "additiv im
   naechsten freien Block", und eine bestehende Regel um einen Waehler zu
   erweitern waere kein additiver Block, sondern eine Aenderung an geteiltem
   Code. Die sechs Zeilen des Pfeils sind der Preis dafuer.

   Warum der Pfeil kein Schriftzeichen ist, steht bei Block 20: ein U+2192
   waere Inhalt und wuerde vorgelesen ("Pfeil nach rechts"), obwohl er nichts
   sagt, was der Text nicht sagt. */
.gtk-kanal__route {
  display: inline-block;
  margin-top: 12px;
  font-family: var(--brand-font-heading);
  font-size: 12px;
  font-weight: 700;
  line-height: 20px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--brand-link);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.gtk-kanal__route:hover,
.gtk-kanal__route:focus-visible { color: #004FEF; }
.gtk-kanal__route::after {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-left: 9px;
  border-top: 2px solid currentColor;
  border-right: 2px solid currentColor;
  transform: rotate(45deg);
  vertical-align: 1px;
}

/* Die Ueberschrift benutzt das Markup des Hauses (`.ot-heading` mit
   `__title`), damit Groesse, Zeilenhoehe und Versalien dieselben sind wie auf
   den gebauten Seiten. Zwei Dinge fehlen dort und stehen deshalb hier: das
   Polster der Huelle, das das Theme mitbringt, und sonst nichts. Die Farbe
   kommt aus der Grundregel dieser Datei (`--brand-onyx`, 15,83:1 auf Weiss),
   wie in Block 30.7 auf heller Flaeche. */
.gtk-zeiten__kopf { margin: 0 0 24px; }

/* Die Zeiten sind Paare aus Tag und Wert, also eine Definitionsliste. Die
   Begruendung samt der h4-Regel des Gates steht in
   `widgets/werkstoff/akte.html`; hier steht nur der Stil dazu.

   `minmax(0, 1fr) auto` statt einer festen Etikettenspalte: die Zeit ist immer
   kurz und immer gleich lang, der Tagesname nicht. So steht die Zeit an einer
   Kante, ohne dass jemand eine Spaltenbreite raten muesste. Genau das ist in
   `akte.css` einmal schiefgegangen (168 px geraten, 210 px gemessen).

   RUHIGERE ZEILE SEIT DER KORREKTUR VOM 01.09.2026
   ------------------------------------------------
   Die Liste ist von sechs Zeilen auf zwei geschrumpft (alle Werktage tragen
   denselben Wert, siehe `widgets/kontakt/band.html`). Sechs enge Zeilen waren
   eine Treppe, zwei enge Zeilen sind ein Rest. Polster 14 statt 11 und
   Zeilenhoehe 26 statt 24 geben den zweien den Raum, den sie jetzt haben; die
   Form folgt damit dem Kartendienst, an dem der Auftrag sie misst: Tag links,
   Zeit rechts an der Kante, dazwischen Luft.

   Geaendert wird HIER und nicht in einem spaeteren Block: es sind die Regeln
   derselben Auftragsreihe, und derselbe Wert an zwei Stellen ist die Drift,
   vor der diese Datei an mehreren Stellen warnt. */
.gtk-zeiten__liste {
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--brand-border);
}
.gtk-zeiten__zeile {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 20px;
  align-items: baseline;
  padding: 14px 0;
  border-bottom: 1px solid var(--brand-border);
}
.gtk-zeiten__tag {
  margin: 0;
  font-family: var(--brand-font-body);
  font-size: 15px;
  line-height: 26px;
  color: var(--brand-muted);
}
/* `dd` bringt im Browser 40 px Einzug mit. Ohne diese Null saesse jede Zeit
   um genau diesen Betrag neben ihrer Kante. `text-align: right` steht dabei,
   obwohl die `auto`-Spalte den Wert ohnehin an die Kante legt: bricht die Zeit
   eines Tages doch einmal um, soll die zweite Zeile an derselben Kante stehen
   und nicht darunter ausfransen. */
.gtk-zeiten__wert {
  margin: 0;
  font-family: var(--brand-font-heading);
  font-size: 15px;
  font-weight: 700;
  line-height: 26px;
  text-align: right;
  color: var(--brand-text);
  white-space: nowrap;
}
.gtk-zeiten__zeile--zu .gtk-zeiten__wert { color: var(--brand-muted); }
.gtk-zeiten__satz {
  margin: 20px 0 0;
  font-size: 15px;
  line-height: 26px;
  color: var(--brand-muted);
}

/* 32.3 Die Ansprechpartner-Zeile ---------------------------------------- */
/* Ein schmales Band, deshalb die Polsterreihe 48 / 40 / 32 und nicht die
   90 / 72 / 60 der vollen Sektionen. Beide Reihen sind Hausstand, die zweite
   steht in Block 31.4 fuer die Anfrage-Zeile, die dieselbe Aufgabe hat.

   `--brand-ivory` ist die Wechselflaeche des Hauses und die vom Auftrag
   genannte Farbe (#F4F6F9). Sie steht hier ueber die Variable und nicht als
   Hexwert, damit die Seite mit dem Haus mitwandert.

   Umbruch statt zweiter Spalte unter 767: die zwei Haelften sind kurz, und
   eine Zeile, die auf halbe Breite faellt, bricht mitten im Namen. */
.gtk-person {
  background: var(--brand-ivory);
  padding: 48px 0;
}
@media (max-width: 991px) { .gtk-person { padding: 40px 0; } }
@media (max-width: 767px) { .gtk-person { padding: 32px 0; } }
.gtk-person__raster {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px 40px;
}
.gtk-person__satz {
  margin: 0;
  font-size: 17px;
  line-height: 30px;
  color: var(--brand-text);
}
.gtk-person__name {
  font-family: var(--brand-font-heading);
  font-weight: 800;
  color: var(--brand-onyx);
}
.gtk-person__kanal {
  display: flex;
  align-items: baseline;
  gap: 12px;
  margin: 0;
}
.gtk-person__etikett {
  font-family: var(--brand-font-body);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--brand-muted);
}
.gtk-person__wert {
  font-family: var(--brand-font-heading);
  font-size: 20px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--brand-link);
  text-decoration: none;
}
.gtk-person__wert:hover,
.gtk-person__wert:focus { color: var(--brand-onyx); }

/* 32.4 Der Fokus der neuen Verweise ------------------------------------- */
/* DER RING IST EIN SCHATTEN UND KEIN `outline`, UND DAS IST KEIN GESCHMACK.
   Im Zusatz-CSS dieser Website steht `a:focus { outline: none !important }`,
   site-weit. Ein `outline` an einem Verweis ist damit tot, und zwar auch mit
   hoeherer Spezifitaet: gegen `!important` hilft nur `!important`. Dieselbe
   Feststellung und dieselbe Antwort stehen in Block 31.6.

   Zwei Ringe und nicht einer, weil die zwei Flaechen verschieden sind: auf
   Weiss und `--brand-ivory` traegt `--brand-link` (11,82:1 bzw. 10,92:1), auf
   dem Chevron-Grund des Kopfes waere derselbe Ton kaum zu sehen. Dort ist
   Weiss die Farbe, die ueber der Schwelle bleibt, genau wie die Schrift
   darunter. */
.gtk-inhalt a:focus-visible {
  box-shadow: 0 0 0 3px var(--brand-link);
}
.page-header:has(.gtk-kopf) a:focus-visible {
  box-shadow: 0 0 0 3px #FFFFFF;
}

/* =========================================================================
   Block 33: DAS ANLIEFERUNGS-BAND DER KONTAKT-SEITE (01.09.2026)
   =========================================================================
   Ein Band zwischen Kontakt-Band und Ansprechpartner-Zeile. Das Markup liegt
   in `widgets/kontakt/anlieferung.html`, der Stil steht hier, additiv im
   naechsten freien Block.

   ALLES HAENGT AN `.gtk-anlieferung`
   ----------------------------------
   Keine einzige Regel dieses Blocks trifft eine andere Seite. Die Haken-Regeln
   kommen aus Block 6 und werden ueber die Klasse `gtp-liste` GEHOLT, nicht
   abgeschrieben; hier steht nur, was Block 6 offen laesst, weil es dort aus
   dem Elementor-Post-CSS kam: Schriftgrad, Zeilenhoehe, Farbe und der Abstand
   zwischen zwei Punkten.

   WARUM DER KNOPF DIESES AUFTRAGS HIER NICHT VORKOMMT
   ---------------------------------------------------
   Punkt 2 des Auftrags stellt den Hero-Knopf auf das helle Muster. Er braucht
   in dieser Datei KEINE Zeile: `octf-btn-light` ist eine Theme-Klasse
   (`makaffo/style.css:1100-1111`) und liefert weisse Fuellung, Schrift in
   Global Primary und dasselbe Schwebeverhalten wie der gefuellte Knopf. Der
   Auftrag verlangt einen Wahrheitsort, und der ist das Theme. Eine Regel hier
   waere eine zweite Fassung desselben Musters.
   ====================================================================== */

/* 33.1 Die Flaeche und das Raster --------------------------------------- */
/* Navy, weil die Nachbarn Weiss und `--brand-ivory` sind und keine Flaeche
   sich wiederholen darf. Die Herleitung steht im Kopf von
   `widgets/kontakt/anlieferung.html`.

   Polster 90 / 72 / 60 wie jede volle Sektion des Hauses (Block 30.5). Dies
   ist ein Abschnitt mit Ueberschrift und Text, kein schmales Band, also gilt
   diese Reihe und nicht die 48 / 40 / 32 aus Block 31.4. */
.gtk-anlieferung {
  background: var(--brand-onyx);
  padding: 90px 0;
}
@media (max-width: 991px) { .gtk-anlieferung { padding: 72px 0; } }
@media (max-width: 767px) { .gtk-anlieferung { padding: 60px 0; } }

/* ZWEISPALTIG AB 992, EINSPALTIG DARUNTER.
   Die 992 ist die Rasterstufe des Themes (720 auf 940 px), dieselbe wie in
   Block 30.5 und Block 32.2.

   Aufgeteilt wie in Block 30.5 und nicht wie im Kontakt-Band darueber: links
   steht Fliesstext, rechts eine Liste aus drei kurzen Zeilen, und die wird von
   mehr Breite nicht besser. Was uebrig bleibt, bekommt der Text.
   `align-items: start` haelt die Haken oben; sonst stuenden drei Zeilen mittig
   neben einem hoeheren Textblock und saehen aus wie abgesackt. */
.gtk-anlieferung__raster { display: grid; gap: 40px; }
@media (min-width: 992px) {
  .gtk-anlieferung__raster {
    grid-template-columns: minmax(0, 1fr) minmax(0, 340px);
    gap: 60px;
    align-items: start;
  }
}

/* 33.2 Kicker, Ueberschrift und Satz auf dunklem Grund ------------------ */
/* DREI FARBREGELN, UND ALLE DREI SIND NOETIG.
   Auf `--brand-ivory` traegt der Hausstand von selbst, und Block 30.5 hat
   dort ausdruecklich drei Farbregeln gestrichen. Hier ist es umgekehrt, und
   zwar gerechnet:

     Kicker  `.ot-heading__sub` ist #004FEF aus dem Theme. Auf #0C2148 sind
             das 2,54:1, also unter jeder Schwelle. Ersetzt durch #8AB4F8,
             7,51:1, der Hausstand fuer einen Kicker auf Navy (abgelesen an
             `widgets/oberflaechen/wand.css`).
     H2      Die Grundregel dieser Datei gibt jeder Ueberschrift
             `--brand-onyx`. Dunkles Navy auf Navy waere 1,00:1, also FALLE 69
             an einer neuen Stelle. Weiss: 15,83:1.
     Satz    `--brand-text` vom body waere ebenfalls unlesbar. #C6D0E0 ist die
             gedaempfte Zweitfarbe des Hauses auf Navy, 10,18:1, dieselbe wie
             im Abschluss von /ueber-uns/ und /referenzen/.

   Das Polster der `.ot-heading`-Huelle bringt das Theme mit und wird hier auf
   null gesetzt, wie in Block 30.7 und 32.2. */
.gtk-anlieferung__kopf { margin: 0; }
.gtk-anlieferung__kicker { color: #8AB4F8; }
.gtk-anlieferung__titel { color: #FFFFFF; }
.gtk-anlieferung__satz {
  margin: 18px 0 0;
  max-width: 640px;
  font-size: 17px;
  line-height: 30px;
  color: #C6D0E0;
}

/* 33.3 Die drei Haken-Zeilen -------------------------------------------- */
/* Lage, Fuge und Zeichengroesse kommen aus Block 6, geholt ueber `gtp-liste`.
   Aufzaehlpunkt und Einzug nimmt `.unstyle` aus dem Theme. Offen bleibt von
   dort nur, was im Bestand das Elementor-Post-CSS gesetzt hat, und genau das
   steht hier, mit denselben Werten wie am Bestandsbaustein auf
   /pulverbeschichtung/ (Widget 71905ae): Inter 16/26 in 400, 14 px Abstand
   zwischen zwei Punkten, alles in Weiss.

   Die Farbe steht NUR an der Zeile und nicht am Zeichen: Block 6 gibt dem SVG
   `fill: currentColor`, der Haken nimmt sie also mit. So halten es alle drei
   Bestandsstellen, an denen Zeichen und Text dieselbe Farbe tragen; der Haken
   setzt sich nicht ab, er ist so hell wie sein Satz. */
.gtk-haken { margin: 0; }
.gtk-haken .ot-icon-list-item {
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 26px;
  color: #FFFFFF;
}
.gtk-haken .ot-icon-list-item + .ot-icon-list-item { margin-top: 14px; }

/* 33.4 Der Fokus der Verweise in diesem Band ---------------------------- */
/* Dieses Band fuehrt heute keinen Verweis. Die Regel steht trotzdem hier,
   damit die Familie an jeder Stelle dieselbe Frage beantwortet: der Ring aus
   Block 32.4 ist `var(--brand-link)`, und der waere auf Navy so gut wie
   unsichtbar: #13366D gegen #0C2148 sind 1,34:1, also praktisch dieselbe
   Flaeche. Auf dunklem Grund ist Weiss der Ring, genau wie im Kopf. Kaeme in
   Haeppchen 3 ein Verweis dazu, waere das sonst die Zeile, die jemand vergisst.

   Spezifitaet: beide Regeln stehen bei (0,2,1), diese hier steht spaeter in
   der Datei und gewinnt deshalb ueber die Reihenfolge. Das ist kein Zufall,
   sondern der Grund, warum sie in einem SPAETEREN Block steht.

   `box-shadow` und nicht `outline`, weil im Zusatz-CSS der Website
   `a:focus { outline: none !important }` steht, site-weit. Die Feststellung
   und dieselbe Antwort stehen in Block 31.6 und 32.4. */
.gtk-anlieferung a:focus-visible {
  box-shadow: 0 0 0 3px #FFFFFF;
}

/* =========================================================================
   Block 34: DIE RECHTSSEITEN (01.09.2026)
   =========================================================================
   Vier Seiten, eine Huelle: Impressum, Datenschutzerklaerung,
   Cookie-Richtlinie und AGB. Das Markup liegt in `widgets/recht/*.html` und
   in den vier `page-{slug}.php`, der Stil steht hier, additiv im naechsten
   freien Block.

   ALLES HAENGT AN `.gtl-kopf`, `.gtl-inhalt` ODER `.gtl-text`
   -----------------------------------------------------------
   Keine einzige Regel dieses Blocks trifft eine andere Seite. Der Kopf haengt
   ueber `:has(.gtl-kopf)` am Kopfbereich des Themes, alles andere an dem
   Kasten, den `gtl_seite()` um den Rumpf legt. Es gibt in diesem Block keine
   Seiten-Kennung und keinen Kurznamen, wie ueberall sonst in dieser Datei.

   `gtl-` IST FREI, UND ZWAR NACHGESEHEN
   -------------------------------------
   Null Treffer im ganzen Child, im ganzen Repo, in den Themes und Plugins des
   Containers und in `wp_posts`, `wp_postmeta` und `wp_options`. Die
   Gegenprobe schlaegt an: dieselben Suchen finden fuer `gtk-` 13 Dateien und
   6 Beitraege, fuer `gtp-` 98 Beitraege und 136 Meta-Zeilen. Anders als bei
   `gtk-` (Block 32) braucht es hier deshalb keine Zusagen zur
   Kollisionsfreiheit: es gibt nichts, womit es kollidieren koennte.
   Genommen ist `gtl-` und nicht `gti-`, weil es die GATTUNG traegt und nicht
   eine Seite, so wie `gto-`, `gtu-` und `gtw-` ihre Gattung tragen; `gti-`
   laege sonst neben einem spaeter noetigen `gtd-`, `gtc-` und `gta-`.

   NUR DIE HUELLE, KEIN TEXT: DAS GILT FUER DREI DER VIER
   -------------------------------------------------------
   Der Auftrag ist an dieser Stelle ausdruecklich. Impressum bekommt einen
   verbindlichen Wortlaut, Datenschutz, Cookie-Richtlinie und AGB bekommen
   denselben Kopf und dasselbe Leseraster, und ihr Inhalt bleibt, was er ist.
   Deshalb spricht dieser Block den Rumpf ueber `.gtl-text__spalte` an und
   nicht ueber die Klassen des Impressum-Bausteins: dieselbe Spalte umschliesst
   dort den Kurzbefehl von Complianz, und was er ausgibt, weiss heute niemand.
   ====================================================================== */

/* 34.1 Der Kopf: ein schmales Navy-Band -------------------------------- */
/* DIE BAUART WIRD BLOCK STATT TABELLE, UND ZWAR AN ALLEN BREITEN
   ---------------------------------------------------------------
   Der Kopfbereich ist beim Theme eine Tabellenzelle mit fester Hoehe (409 px,
   unter 600 px 250 px), in der der Inhalt mittig sitzt. Eine feste Hoehe
   verschluckt jede Polster-Stufe, die kleiner ist als sie selbst, und genau
   das waere hier der Fall: dieser Kopf traegt zwei Zeilen und soll SCHMAL
   sein. Wortgleich die Begruendung aus Block 31.1 und 32.1.

   DAS NAVY IST DER VORHANDENE SCHLEIER MIT DECKUNG 1
   ---------------------------------------------------
   `.page-header::before` liegt seit dem 28.08.2026 site-weit als
   `--brand-onyx` mit 0,7 ueber jedem Kopfbereich (Zeile 423 dieser Datei,
   `inset: 0`, darueber `.dcell` mit `z-index: 1`). Er ist da, weil unter dem
   Titel sonst ein Foto liegt.

   Hier liegt kein Foto, und der Auftrag will eine ruhige Flaeche. Dieser eine
   Schleier steht deshalb auf Deckung 1. Dann ist die sichtbare Flaeche
   #0C2148, und zwar unabhaengig davon, was darunter liegt.

   DAS IST NICHT DER BEQUEME WEG, SONDERN DER EINZIGE. NACHGEMESSEN.
   Ein `background-image: none` an dieser Stelle waere die naheliegende
   Loesung und stuende wirkungslos da: das Theme setzt sein Kopfbild NICHT
   ueber ein Stylesheet, sondern INLINE an das Element, auf jeder Seite dieser
   Website. Abgelesen an /impressum/ am 01.09.2026:

     <div class="page-header dtable text-center"
          style="background-image: url(.../makaffo/images/bg-pheader-default.jpg);">

   Ein Inline-Stil schlaegt jede Regel aus einer Datei, ohne `!important` und
   ohne Rangfolge-Trick. Ein `background-image: none` stand hier im ersten Wurf
   und ist wieder raus: eine Regel, die nichts bewirkt, sieht im Quelltext aus
   wie eine Entscheidung. Der Schleier dagegen liegt UEBER dem Bild und
   verdeckt es vollstaendig.

   Der Grund am Element selbst bleibt. Er ist der Boden, falls ein Browser das
   Pseudoelement nicht zeichnet, und er macht den gemessenen Wert im Diff
   eindeutig statt "was auch immer das Theme hier vorhatte". Eine
   Kontrastzusage, deren Grund von einer fremden Einstellung abhaengt, ist
   keine Zusage; genau diese Ueberlegung steht in Block 32.2 fuer das weisse
   Kontakt-Band.

   KONTRAST: Weiss auf #0C2148 sind 15,83:1, nachgemessen am Bildpunkt unter
   der Schrift; der Kicker steht ebenfalls weiss. Der Wert ist derselbe, den
   Block 30.6 und 33.2 fuer weisse Schrift auf Navy fuehren.

   ACHTUNG BEIM ABSCHREIBEN: in dieser Datei stehen ZWEI Zahlen fuer
   `--brand-onyx`, und beide sind richtig, nur fuer verschiedene Gruende.
   15,83:1 gilt gegen Weiss (#FFFFFF), 15,32:1 gegen `--brand-ivory`
   (#F4F6F9). Der erste Wurf dieses Blocks hatte die zweite Zahl gegriffen,
   weil sie in der Datei haeufiger vorkommt. Gefunden hat es nicht das
   Nachlesen, sondern die Messung.

   Bewiesen wird der Kontrast ohnehin nicht an dieser Regel, sondern am
   Bildpunkt unter der Schrift: der Kontrast-Pruefer des Gates misst die Maske
   und nicht die Absicht, und genau deshalb faellt dort auf, wenn der Schleier
   einmal nicht traegt. */
.page-header:has(.gtl-kopf) {
  display: block;
  height: auto;
  min-height: 0;
  padding: 0;
  background-color: var(--brand-onyx);
}
.page-header:has(.gtl-kopf) > .dcell { display: block; }
.page-header:has(.gtl-kopf)::before {
  background-color: var(--brand-onyx);
  opacity: 1;
}

/* `.text-center` steht als Klasse am Kopfbereich des Themes und wirkt ueber
   Vererbung. Der Kasten setzt seine Ausrichtung deshalb selbst, genau wie
   `.gtr-hero`, `.gtr-det-hero` und `.gtk-kopf`.

   KEIN DECKEL AUF DER BREITE. Block 32.1 deckelt den Kontakt-Kopf auf 870 px,
   weil dort ein Einleitungssatz steht, der sonst 150 Zeichen lange Zeilen
   haette. Hier stehen zwei Zeilen, und die laengste ist ein einzelnes Wort
   ("DATENSCHUTZERKLAERUNG"). Ein Deckel ohne Wirkung waere eine Zahl, die
   jemand spaeter fuer eine Entscheidung haelt. */
.gtl-kopf {
  margin: 0;
  text-align: left;
}

/* Das Site-Polster, in allen drei Stufen ausgeschrieben, mit denselben Zahlen
   und denselben Umschaltbreiten wie Block 30.1, 31.1 und 32.1. Abgelesen an
   /ueber-uns/, /farben-oberflaechen/ und /werkstoff-stahl/: 90 ab 1025,
   72 von 768 bis 1024, 60 darunter.

   SCHMAL WIRD DAS BAND DURCH SEINEN INHALT, NICHT DURCH EINE NEUE ZAHL.
   Gerechnet bei 1280 px: Kicker 17 px plus 14 px Abstand plus h1 52 px sind
   83 px Inhalt, dazu zweimal 90 px Polster, macht rund 263 px. Der
   Kontakt-Kopf kommt mit Satz und Knopf auf rund 430 px, die Tabellenzelle
   des Themes auf 409 px. Das Band ist also schmaler als beides, und dafuer
   musste keine vierte Polster-Stufe erfunden werden. */
@media (min-width: 1025px) {
  .page-header:has(.gtl-kopf) .gtl-kopf { padding: 90px 0; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .page-header:has(.gtl-kopf) .gtl-kopf { padding: 72px 0; }
}
@media (max-width: 767px) {
  .page-header:has(.gtl-kopf) .gtl-kopf { padding: 60px 0; }
}

/* Kicker und Schlagzeile sind zeichengleich die des Archiv-Kopfs (Block 30.1),
   der Einzelseiten (31.1) und der Kontakt-Seite (32.1). Es ist dieselbe Zeile
   an derselben Stelle, und wo der Bestand eine Antwort hat, wird sie genommen
   und nicht neu erfunden. */
.gtl-kopf__kicker {
  margin: 0 0 14px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #FFFFFF;
}
/* Die Klasse `page-title` bleibt am h1 und bringt Farbe und Versalien des
   Themes mit, dazu die zwei Regeln dieser Datei zur Worttrennung im
   Kopfbereich. Der Schriftgrad faellt von den 58 px des Themes auf die 42 px,
   mit denen jede andere Seite ihre Hero-Schlagzeile setzt.

   Der Zweisatz und die Bedingung `min-width: 768px` sind dieselben wie bei
   `.gtr-hero__titel` und `.gtk-kopf__titel` und aus demselben Grund: die
   Theme-Regel `.page-header .page-title { font-size: 58px }` steht bei
   (0,2,0), und unter 768 px gilt der mitwachsende Grad
   `clamp(22px, 7vw, 36px)` aus dem Abschnitt "Seitentitel im Kopfbereich"
   weiter oben. Genau dieser Abschnitt ist fuer das Wort
   "PULVERBESCHICHTUNG" entstanden, und "DATENSCHUTZERKLAERUNG" ist zwei
   Zeichen laenger. */
.gtl-kopf__titel {
  margin: 0;
  line-height: 1.08;
}
@media (min-width: 768px) {
  .page-header .gtl-kopf__titel { font-size: 42px; line-height: 52px; }
}
@media (max-width: 767px) {
  .gtl-kopf__kicker { font-size: 12px; letter-spacing: .14em; }
}

/* 34.2 Das Leseraster --------------------------------------------------- */
/* Die Flaeche ist ausdruecklich weiss gesetzt und nicht dem Theme ueberlassen.
   Die Kontrastwerte dieses Blocks sind gegen #FFFFFF gerechnet, und eine
   gerechnete Zahl, deren Grund von einer fremden Einstellung abhaengt, ist
   keine Zusage. Dieselbe Ueberlegung steht in Block 32.2.
   Die Polster sind die der gebauten Sektionen, 90 / 72 / 60 (Block 30.5). */
.gtl-text {
  background: #FFFFFF;
  padding: 90px 0;
}
@media (max-width: 991px) { .gtl-text { padding: 72px 0; } }
@media (max-width: 767px) { .gtl-text { padding: 60px 0; } }

/* DER DECKEL VON 640 PX, UND WARUM NICHT 760 ODER 870
   ----------------------------------------------------
   Das Haus hat fuer eine lange Textspalte bisher keine Regel: Block 31.3, der
   Inhalt der Referenz-Einzelseiten, laeuft ueber die volle Rasterbreite von
   1170 px. Der Auftrag verlangt hier ausdruecklich ein Leseraster, also muss
   eine Zahl her.

   Sie ist nicht gegriffen, sondern aus der einen Herleitung genommen, die
   diese Datei dazu fuehrt. Block 22 schreibt fuer 760 px: "rund 90 Zeichen
   bei 17 px, also die obere Kante dessen, was sich noch liest". Der Auftrag
   setzt den Fliesstext hier auf 16 px. Dieselbe Rechnung ergibt dann:

     760 px bei 16 px  ->  rund 95 Zeichen, also UEBER der genannten Kante
     640 px bei 16 px  ->  rund 80 Zeichen, also darunter

   Genommen ist deshalb 640, und das ist zugleich ein Hauswert: Block 30.5
   deckelt den Band-Satz darauf, Block 33.2 den Satz des Anlieferungs-Bandes.
   870 px scheidet aus, das ist der Deckel fuer Hero-EINLEITUNGEN (Block 17,
   27 und 32.1), nicht fuer Fliesstext.

   Der Kasten steht links an der Rasterkante und nicht mittig: jede
   Ueberschrift dieser Website beginnt dort, und ein zentrierter Textblock
   waere die einzige Stelle, an der die linke Kante wandert. */
.gtl-text__spalte {
  max-width: 640px;
  margin: 0;
}

/* 34.3 Die Typografie der Textseite ------------------------------------ */
/* ZWISCHENTITEL: ARCHIVO, 30/40, NAVY
   ------------------------------------
   Archivo und `--brand-onyx` bringt die Grundregel dieser Datei mit (Zeile
   112, `h1, h2, ... { font-family: var(--brand-font-heading); color:
   var(--brand-onyx) }`), und hier reicht sie auch: anders als in Block 31.3
   liegt dieser Text in KEINEM Elementor-Kasten, es gibt also keinen Waehler
   mit vier oder fuenf Klassen dagegen (FALLE 71). Die Zeilen unten setzen
   deshalb nur, was die Grundregel nicht sagt.

   Groesse und Zeilenhoehe sind abgelesen und nicht gegriffen: 30/40, mobil
   24/36, sind die Werte, mit denen die Referenz-Einzelseiten ihre
   Zwischentitel fuehren (Block 31.3 laesst sie ausdruecklich stehen, weil sie
   der Beitrag mitbringt). Das ist im Haus die einzige Stelle, an der ein h2
   MITTEN IM TEXT steht statt als Sektions-Ueberschrift; die 42/52 der
   Sektions-Ueberschriften waeren hier zu laut.

   `text-transform: none` STEHT AUSDRUECKLICH DA, UND ZWAR ALS ZUSAGE.
   Der Wortlaut des Impressums ist verbindlich und gemischt geschrieben, und
   das Gate prueft ihn ueber `innerText`, also ueber den vom Browser
   UMGESETZTEN Text. Kaeme irgendwoher ein `text-transform: uppercase` auf
   Ueberschriften (das Theme fuehrt es an mehreren Stellen), stuende dort
   "ANGABEN GEMAESS PARAGRAF 5 DDG", und die Zusage waere gebrochen, ohne dass
   jemand etwas geaendert haette. Die h1 im Kopf ist der umgekehrte Fall: sie
   SOLL versal sein, das macht das Theme, und der Auftrag verlangt sie so.

   Der Abstand nach oben ist grosszuegiger als der nach unten (44 gegen 14),
   damit ein Zwischentitel sichtbar zum FOLGENDEN Absatz gehoert und nicht zum
   vorangehenden. Der erste Titel der Spalte braucht ihn nicht, er steht schon
   am Polster der Sektion. */
.gtl-text__titel {
  margin: 44px 0 14px;
  font-size: 30px;
  line-height: 40px;
  text-transform: none;
}
.gtl-text__spalte > :first-child { margin-top: 0; }
@media (max-width: 767px) {
  .gtl-text__titel { margin-top: 36px; font-size: 24px; line-height: 36px; }
}

/* FLIESSTEXT: INTER, 16/28, `--brand-muted`
   ------------------------------------------
   Der Auftrag nennt 16/28 beim Namen. Die Farbe nennt er nicht; genommen ist
   die des Hauses fuer Fliesstext, dieselbe wie in Block 31.3, dort abgelesen
   an /pulverbeschichtung/. `#5B6675` auf Weiss: 5,83:1.

   Der Waehler trifft `p` allgemein und nicht nur `.gtl-text__satz`: in der
   Spalte der drei uebrigen Rechtsseiten steht der Kurzbefehl von Complianz,
   und dessen Absaetze tragen keine Klasse von uns. Genau dafuer ist die
   Spalte da. Aus demselben Grund stehen Listen und Verweise hier mit. */
.gtl-text__spalte p,
.gtl-text__spalte li {
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 28px;
  color: var(--brand-muted);
}
.gtl-text__spalte p { margin: 0 0 18px; }
.gtl-text__spalte > p:last-child { margin-bottom: 0; }
.gtl-text__spalte ul,
.gtl-text__spalte ol { margin: 0 0 18px; padding-left: 22px; }
.gtl-text__spalte li { margin: 0 0 6px; }

/* Die Anschrift und die drei Kanaele stehen als EIN Absatz mit `<br>`, damit
   `innerText` dieselben Zeilen liefert wie eine Liste, ohne einer Anschrift
   eine Gliederung anzudichten. Ihre Zeilen stehen enger als Fliesstext, weil
   sie einzeln kurz sind: 28 px Durchschuss zwischen fuenf Anschriftszeilen
   liesse den Block auseinanderfallen. 26 px ist der Wert, den das Haus fuer
   kurze Zeilen fuehrt (Block 6, die Haken-Listen). */
.gtl-text__satz--anschrift,
.gtl-text__satz--kanaele { line-height: 26px; }

/* Die Verweise auf Telefon und E-Mail. `--brand-link` auf Weiss: 10,92:1,
   derselbe Wert und dieselbe Farbe wie in der Ansprechpartner-Zeile von
   /kontakt/ (Block 32.3). Unterstrichen, weil sie mitten im Fliesstext
   stehen und dort die Farbe allein den Verweis nicht kenntlich macht. */
.gtl-text__wert {
  color: var(--brand-link);
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* 34.4 Der Fokus der neuen Verweise ------------------------------------ */
/* DER RING IST EIN SCHATTEN UND KEIN `outline`, UND DAS IST KEIN GESCHMACK.
   Im Zusatz-CSS dieser Website steht `a:focus { outline: none !important }`,
   site-weit. Ein `outline` an einem Verweis ist damit tot, und zwar auch mit
   hoeherer Spezifitaet: gegen `!important` hilft nur `!important`. Dieselbe
   Feststellung und dieselbe Antwort stehen in Block 31.6, 32.4 und 33.4.

   Zwei Ringe und nicht einer, weil die zwei Flaechen verschieden sind. Auf
   Weiss traegt `--brand-link` (10,92:1). Im Kopf steht heute kein Verweis;
   die Regel steht trotzdem da, aus demselben Grund wie in Block 33.4: auf
   Navy waere `#13366D` gegen `#0C2148` 1,34:1, also praktisch dieselbe
   Flaeche, und kaeme dort spaeter ein Verweis dazu, waere das sonst die
   Zeile, die jemand vergisst. */
.gtl-inhalt a:focus-visible {
  box-shadow: 0 0 0 3px var(--brand-link);
}
.page-header:has(.gtl-kopf) a:focus-visible {
  box-shadow: 0 0 0 3px #FFFFFF;
}

/* =========================================================================
   Block 35: DER SCHWEBENDE MAIL-KNOPF, SITE-WEIT (01.09.2026)
   =========================================================================
   Ein fester Verweis unten rechts, auf jeder Seite ausser der Anfrage-Seite.
   Das Markup liegt in `widgets/global/mailknopf.html`, eingehaengt ueber
   `wp_footer` (`functions.php`, Blockkopf DER SCHWEBENDE MAIL-KNOPF), der
   Stil steht hier, additiv im naechsten freien Block.

   ALLES HAENGT AN `.gtg-mail`
   ---------------------------
   Keine einzige Regel dieses Blocks trifft eine andere Seite oder einen
   anderen Baustein. Das Praefix `gtg-` traegt die Gattung "global" und war
   frei: null Treffer im Child, im Eltern-Theme, in `app/` und in der
   Datenbank, bei anschlagender Gegenprobe auf `gtk-` (411 im Repo, 141 im
   Container, 6 Beitraege, 9 Meta-Zeilen).

   WARUM DER KNOPF NICHT `octf-btn` TRAEGT
   ---------------------------------------
   Block 33 sagt als Hausregel, der Wahrheitsort fuer Knopf-Aussehen sei das
   Theme, und brand.css setze nur, was dort fehlt. Diese Regel wird hier
   gebrochen, und zwar bewusst. `.octf-btn` ist Epilogue 16/500 in Versalien
   mit Radius 27 px und Polster 13/40/9 (`makaffo/style.css:1050-1087`); der
   Auftrag verlangt Inter 15/600 und eine Pille. Schwerer wiegt der
   Schwebezustand: `.octf-btn:not(.octf-btn-play):hover` erzwingt mit (0,3,0)
   `background-color: #242424` (`:1095-1098`) und schluckt jeden Wechsel auf
   Global Primary. Genau dieser Fund steht im Kurzbericht von p57-kontakt-2.
   Ein Knopf, der die Theme-Klasse traegt, koennte den Auftrag also nicht
   erfuellen. Er traegt sie deshalb nicht, und er borgt sich auch nichts von
   ihr aus.

   DIE SITE-WEITE `a:hover`-REGEL SCHLAEGT DIE KLASSE, UND DAS IST DER GRUND
   FUER DIE DOPPELTEN WAEHLER
   ---------------------------------------------------------------------
   Zeile 113 dieser Datei setzt site-weit `a:hover, a:focus { color:
   var(--brand-onyx); }`. Das ist (0,1,1) und schlaegt `.gtg-mail` mit (0,1,0).
   Ohne Gegenzug waere die Schrift im Schwebezustand Navy auf Global Primary,
   also **2,54:1**, und zwar nur im Schwebezustand: die Regel haette zur
   HAELFTE gegriffen (FALLE 71). Deshalb nennt der Schwebe-Waehler die Farbe
   ausdruecklich noch einmal, und deshalb steht `:focus` neben
   `:focus-visible`: `.gtg-mail:hover` ist (0,2,0) und gewinnt, `!important`
   braucht es nicht.

   DIE ZAHLEN, GEGEN ZWEI GRUENDE GERECHNET
   ----------------------------------------
   Der Knopf schwebt ueber wechselndem Grund, deshalb steht jeder Wert
   zweimal da, einmal gegen den hellsten und einmal gegen den dunkelsten
   Untergrund, und es zaehlt der schlechtere (FALLE 72).

     Fuellung `rgba(12, 33, 72, .94)`, also `--brand-onyx` bei Deckung .94.
     Ueber Weiss ergibt das #1B2E53, ueber Navy praktisch #0C2148.
     Weisse Schrift darauf: **13,44:1** beziehungsweise **15,83:1**.
     Weisse Schrift auf dem Schwebe-Grund #004FEF: **6,24:1** (deckend).
     Kante `rgba(255, 255, 255, .42)` auf der Fuellung: **3,66:1** bzw.
     **3,87:1**, gemessen als Nicht-Text gegen 3,0:1.

   DER RING IST EIN SCHATTEN UND KEIN `outline`, UND DAS IST KEIN GESCHMACK.
   Im Zusatz-CSS der Website steht site-weit `a:focus { outline: none
   !important }`. Er ist hier DOPPELT, und das ist der Unterschied zu den
   Bloecken 32 bis 34: dort steht der Knopf entweder auf hellem Grund
   (`--brand-link`) oder auf Navy (`#FFFFFF`), hier trifft beides zugleich zu.
   Ein Ring in `--brand-link` allein verschwaende an der Pillenkante
   (**1,14:1** gegen die Fuellung), einer in Weiss allein auf hellem Grund.
   Innen Weiss, aussen `--brand-link`: der innere Ring trennt die Pille vom
   aeusseren, der aeussere traegt gegen den Seitengrund **11,82:1**. Der
   weiche Schatten steht in derselben Deklaration, sonst faellt er im Fokus
   ersatzlos weg.

   WARUM DER KNOPF NICHT AUF 22 PX UEBER DER KANTE SITZT
   -----------------------------------------------------
   Der Auftrag sagt `bottom: 22px` (Desktop) und `14px` (mobil). Gemessen
   steht dort schon der Nach-oben-Knopf des Themes: `#back-to-top`,
   `right: 40px`, ab 500 px Scroll `bottom: 40px`, 42x45 px, **z-index 1000**,
   auf allen vier geprueften Seiten und in beiden Breiten. Seine Oberkante
   liegt 85 px ueber der Fensterkante, mitten in der Pille.

   Ueber den Stapel ist das nicht zu loesen, und das ist der eigentliche
   Punkt. Der Knopf MUSS unter dem Seitenkopf bleiben, weil das mobile Menue
   (9999) und sein Schleier (9998) IM Kopf haengen und der Kopf mit
   `position: relative` und `z-index: 10` (Unterseiten) beziehungsweise
   `absolute` und `999` (Startseite) einen eigenen Stapelkontext aufmacht.
   Gegen ein Element auf body-Ebene zaehlt das Menue deshalb mit 10 bzw. 999.
   Jeder Wert ueber 1000 laege damit ueber dem geoeffneten Menue.

   Also weicht der neue Knopf aus, nicht der Bestand. Der Auftragswert bleibt
   erhalten, nur als Abstand zur OBERKANTE des Bestands-Knopfes statt zur
   Fensterkante: 85 + 22 = 107, 85 + 14 = 99.
   ====================================================================== */

/* 35.1 Die Pille und ihr Platz ------------------------------------------ */
.gtg-mail {
  position: fixed;
  right: 22px;
  bottom: 107px;
  /* Ueber dem Inhalt (hoechster Wert im Wurzel-Stapel ist 5,
     `.isotope-filter`, makaffo/style.css:4770) und unter dem gesamten Kopf. */
  z-index: 9;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 12px 20px;
  border: 2px solid rgba(255, 255, 255, .42);
  border-radius: 999px;
  background-color: rgba(12, 33, 72, .94);
  color: #FFFFFF;
  font-family: var(--brand-font-body);
  font-size: 15px;
  font-weight: 600;
  line-height: 20px;
  text-decoration: none;
  white-space: nowrap;
  box-shadow: 0 10px 26px rgba(12, 33, 72, .14);
  transition: background-color .2s ease, border-color .2s ease,
              transform .2s ease, box-shadow .2s ease;
}
.gtg-mail__zeichen {
  display: block;
  flex: none;
  width: 20px;
  height: 20px;
}

/* 35.2 Schwebezustand und Fokus ----------------------------------------- */
/* Die Farbe steht hier noch einmal, gegen Zeile 113. Begruendung im
   Blockkopf. `:active` ist dabei, weil das Theme `a:hover, a:active`
   fuehrt (`makaffo/style.css:1423`). */
.gtg-mail:hover,
.gtg-mail:focus,
.gtg-mail:focus-visible,
.gtg-mail:active {
  color: #FFFFFF;
  text-decoration: none;
}
.gtg-mail:hover,
.gtg-mail:focus-visible {
  background-color: var(--makaffo-color-primary, #004FEF);
  /* Die Kante zieht mit. Auf der Fuellung im Ruhezustand traegt sie bei .42
     noch 3,65:1, auf dem deckenden #004FEF des Schwebezustands faellt sie
     aber auf 2,23:1: der Grund wird heller, die Kante mischt sich aus
     demselben Weiss, und beide laufen aufeinander zu. Nachgemessen, nicht
     gerechnet. Bei .62 sind es 3,27:1. Das ist derselbe Gedanke wie in
     FALLE 72: ein Wert, der gegen EINEN Grund stimmt, sagt nichts ueber
     den zweiten. */
  border-color: rgba(255, 255, 255, .62);
  transform: translateY(-1px);
}
.gtg-mail:focus-visible {
  box-shadow: 0 0 0 3px #FFFFFF,
              0 0 0 6px var(--brand-link),
              0 10px 26px rgba(12, 33, 72, .14);
}

/* 35.3 Der Puls --------------------------------------------------------- */
/* Der Ring waechst als Schatten nach aussen und nicht ueber `transform:
   scale()`. Das Hausvorbild (`widgets/anlage.css:125-136`) skaliert, aber
   dort ist der Ring ein KREIS; eine Pille von 174x48 px auf `scale(2.1)`
   waere ein Schlauch von 365 px Breite und 101 px Hoehe. Als Schatten folgt
   er der Rundung und waechst in alle Richtungen gleich weit.

   Zweiter Grund, und der wiegt fuer die Messung schwerer: der Ring bleibt so
   vollstaendig AUSSERHALB des Rahmenkastens. Der Kontrast-Pruefer nimmt zwei
   Abzuege derselben Lage und haelt jeden Bildpunkt, der sich unterscheidet,
   fuer Schrift; ein bewegter Ring INNERHALB des Inhaltskastens waere damit
   der schlechteste "Schriftpunkt" und wuerde die Messung nach unten ziehen.

   Zeitform, Kurve und Halte-Phase sind die des Vorbilds, die Dauer die des
   Auftrags. */
.gtg-mail::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  animation: gtgMailPuls 1.9s ease-out infinite;
}
@keyframes gtgMailPuls {
  /* #004FEF ist Global Primary. In einer Farbe mit Deckung laesst sich
     `var()` nicht einsetzen, deshalb steht die Zahl hier ausgeschrieben,
     wie an den uebrigen Stellen dieser Datei auch. */
  0%        { box-shadow: 0 0 0 0 rgba(0, 79, 239, .40); }
  70%, 100% { box-shadow: 0 0 0 16px rgba(0, 79, 239, 0); }
}

/* 35.4 Mobil, unter 768 ------------------------------------------------- */
/* Unter 768 ein runder Knopf von 56 px, nur mit dem Zeichen. Der Name kommt
   dann aus `aria-label`, das im Markup ohnehin steht und woertlich dasselbe
   sagt wie der sichtbare Text darueber.

   `env(safe-area-inset-bottom)` hat im ganzen Child keinen Praezedenzfall.
   Der Ersatzwert steht deshalb ausdruecklich da: ohne ihn liefert ein
   Browser, der die Funktion nicht kennt, gar nichts, und die ganze
   `calc()`-Rechnung faellt aus. Im Container-Browser ist der Wert 0, das ist
   kein Beweis fuer ein Geraet. */
@media (max-width: 767px) {
  .gtg-mail {
    right: 14px;
    bottom: calc(99px + env(safe-area-inset-bottom, 0px));
    width: 56px;
    height: 56px;
    padding: 0;
    gap: 0;
    justify-content: center;
  }
  .gtg-mail__zeichen {
    width: 22px;
    height: 22px;
  }
  .gtg-mail__text {
    display: none;
  }
}

/* 35.5 Bewegung nur wenn gewuenscht ------------------------------------- */
/* Hausform: abgeschaltet werden `animation` und `transition`, der
   Endzustand bleibt stehen. Ohne Animation hat der Ring keinen Schatten,
   ist also ersatzlos weg, ohne dass etwas fehlt. Bedienbar bleibt alles,
   der Fokusring ebenso: er ist kein Uebergang, sondern ein Zustand. */
@media (prefers-reduced-motion: reduce) {
  .gtg-mail {
    transition: none;
  }
  .gtg-mail::after {
    animation: none;
  }
}

/* =========================================================================
   Block 36: DER ABSTAND UNTER DER TON-ZEILE, REFERENZ-DETAILSEITEN
   (01.09.2026)

   Eine einzige Zusage, dreimal ausgeschrieben. Die Luecke zwischen der
   Ton-Zeile und dem ersten Absatz des Beitragsinhalts war 90 px und ist 60.

   WAS GEMESSEN WURDE, BEVOR HIER ETWAS STAND
   ------------------------------------------
   Der Auftrag nennt als Verdacht "das Elementor-Standardpolster des ersten
   e-con stapelt sich auf das Template-Polster". Am DOM ist es weder das eine
   noch das andere, und der Unterschied entscheidet ueber den Waehler:

     * Es stapelt sich NICHTS. Die Fuge zwischen `.gtr-det-ton` und dem ersten
       Container misst 0,00 px an allen drei Breiten. Das Polster liegt INNEN.
     * Es ist auch kein Standardwert. Der zweite Container der Seite traegt
       Elementors Vorgabe von 10 px; der erste traegt 90, und die stehen als
       `--padding-top: 90px` im Dokument-CSS jedes der neun Beitraege.

   Die Zahl 90 ist damit eine Einstellung der neun Beitraege, und genau die
   sind tabu. Sie laesst sich nur ueberschreiben, nicht wegnehmen.

   WARUM DIE VARIABLE UND NICHT DAS POLSTER
   ----------------------------------------
   Elementor setzt bei einem `boxed` Container das Polster NICHT auf den
   Container, sondern ueber eine Kette:

       .elementor-675 .elementor-element.elementor-element-0dd4453
                                         { --padding-top: 90px }   (0,3,0)
       .e-con                            { --padding-block-start:
                                               var(--padding-top) }  (0,1,0)
       .e-con > .e-con-inner             { padding-block-start:
                                             var(--padding-block-start) } (0,2,0)

   Daraus folgen zwei Dinge, die man nicht sieht, wenn man den Quelltext liest
   statt die Kaskade am gerenderten Element:

   1. Der Container selbst hat `padding-top: 0px`. Wer ihn anfasst, aendert
      nichts und merkt es nicht. Das Polster sitzt am `.e-con-inner`.
   2. Dort heisst es `padding-block-start` und NICHT `padding-top`. Eine Regel
      auf `padding-top` waere ein Wettlauf zweier verschiedener Eigenschaften
      um denselben gerechneten Wert, den bei Gleichstand die Reihenfolge
      entscheidet. Das ist die Art Gleichstand, vor der Block 31.3 an der
      Bildregel bereits einmal gewarnt hat.

   Deshalb steht hier `--padding-top`, also derselbe Eingang, den das Dokument
   belegt. Gleiche Ebene, gleicher Mechanismus, ein anderer Wert. Alles
   Weitere macht Elementors eigene Kette, und ein `!important` braucht es
   nirgends.

   DIE SPEZIFITAET, GERECHNET UND NICHT GEHOFFT
   --------------------------------------------
   Das Dokument-CSS steht bei (0,3,0) und wird als `<style>` in den Kopf
   gedruckt (`css_print_method=internal`, FALLE 55), also VOR dem Verweis auf
   diese Datei. Auf die Reihenfolge ist damit kein Verlass, gewonnen wird ueber
   die Spezifitaet. Der Waehler unten zaehlt vier: `.gtr-det-inhalt`,
   `.elementor`, `.e-con` und `:first-child` (eine Pseudoklasse zaehlt wie eine
   Klasse). (0,4,0) schlaegt (0,3,0), und zwar unabhaengig davon, wer zuerst
   geladen wird.

   `:first-child` ist an allen neun Beitraegen nachgemessen und trifft; jeder
   fuehrt genau zwei Container auf oberster Ebene. Der zweite bleibt
   unangetastet, seine 10 px sind in Ordnung.

   ES TRIFFT NUR DIESE SEITEN, UND ZWAR PER KONSTRUKTION
   -----------------------------------------------------
   `.gtr-det-inhalt` ist der Kasten, den `single-ot_portfolio.php` um den
   Inhalt legt. Es gibt ihn auf keiner anderen Seite dieser Website. Eine
   Gegenprobe auf Bestandsseiten ist deshalb keine Sorgfalt, sondern eine
   Messung ohne Gegenstand.

   Und er gilt fuer JEDE kuenftige Referenz: der Waehler nennt keine Beitrags-
   und keine Element-Kennung, sondern die Stelle im Aufbau.

   DREI STUFEN MIT DEMSELBEN WERT, UND WARUM DAS KEIN VERSEHEN IST
   ---------------------------------------------------------------
   Der Auftrag verlangt die Werte an 1280, 768 und 390 einzeln, weil Elementor
   eigene Tablet-Polster fuehren kann. Gemessen fuehren die neun Beitraege
   KEINES: `--padding-top` misst an allen drei Breiten 90 px, es gibt also nur
   die Desktop-Stufe. Der Referenzwert seinerseits misst an allen drei Breiten
   ebenfalls denselben Wert (siehe unten). Beide Reihen sind flach, also ist
   auch die Antwort flach.

   Ausgeschrieben stehen die drei Stufen trotzdem, und zwar genau fuer den
   Fall, den der Auftrag vorwegnimmt: setzt ein kuenftiger Beitrag ein
   Tablet- oder Mobil-Polster, steht die Stufe schon da, in der es zu kappen
   waere. Die Umschaltbreiten sind die von ELEMENTOR (1024/1025 und 767/768),
   nicht die Rasterstufen des Themes aus Block 31.4: gekappt wird ein
   Elementor-Wert, und er schaltet auf Elementor-Stufen um. Dieselbe Reihe
   fuehrt Block 31.1 fuer den Kopf.

   DER ZIELWERT IST ABGELESEN, NICHT GEWAEHLT
   ------------------------------------------
   60 px ist der Sektions-Innenrhythmus dieser Website, gemessen an
   /ueber-uns/ ueber alle Sektionen: von neun senkrechten Fugen zwischen
   Bausteinen INNERHALB einer Sektion messen sechs genau 60,00 px, und zwar
   unveraendert an 1280, 768 und 390. Es ist der Abstand von einer Kopfgruppe
   zu dem, was sie ankuendigt, also dieselbe Aufgabe, die die Ton-Zeile hier
   hat. Die beiden anderen Werte sind keine Kandidaten: 36 px steht zwischen
   Ueberschrift und ihrer eigenen Unterzeile (enger, weil zusammengehoerig),
   88 px genau einmal vor einer Knopfgruppe.

   WAS HIER NICHT STEHT: DER ABSTAND KOPF ZU TON-ZEILE
   ---------------------------------------------------
   Er ist mitgemessen, wie beauftragt, und er wird nicht gekappt, weil er den
   Referenzwert nicht reisst: 28 px an 1280 und 768, 20 px an 390, gegen 60.
   Er ist bereits ENGER als der Rhythmus, und das ist richtig so, denn die
   Ton-Zeile gehoert zum Kopf und nicht zum Text darunter. Ihn auf 60 zu
   ziehen hiesse, eine Luecke zu vergroessern, um eine Regel zu erfuellen, die
   gegen Luecken gerichtet ist. Block 31.2 bleibt deshalb unangetastet.
   ====================================================================== */

/* 36.1 Der erste Container des Beitragsinhalts -------------------------- */
@media (min-width: 1025px) {
  .gtr-det-inhalt .elementor > .e-con:first-child { --padding-top: 60px; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .gtr-det-inhalt .elementor > .e-con:first-child { --padding-top: 60px; }
}
@media (max-width: 767px) {
  .gtr-det-inhalt .elementor > .e-con:first-child { --padding-top: 60px; }
}

/* =========================================================================
   Block 37: DIE ANFRAGE-SEITE (01.09.2026)
   =========================================================================
   Eine Seite, eine Vorlage. Das Markup liegt in `widgets/anfrage/*.html`, in
   `page-anfrage.php` und im Formular-Beitrag `gta-anfrage`, der Stil steht hier,
   additiv im naechsten freien Block.

   ALLES HAENGT AN `.gta-kopf`, `.gta-tonband`, `.gta-formular`, `.gta-schluss`
   ODER `.gta-inhalt`
   ---------------------------------------------------------------------------
   Keine einzige Regel dieses Blocks trifft eine andere Seite. Der Kopf haengt
   ueber `:has(.gta-kopf)` am Kopfbereich des Themes, alles andere an dem
   Kasten, den `page-anfrage.php` um die drei Baender legt. Es gibt in diesem
   Block keine Seiten-Kennung und keinen Kurznamen, wie ueberall sonst in
   dieser Datei.

   `gta-` IST FREI, UND ZWAR NACHGESEHEN
   -------------------------------------
   Vor diesem Block stand `gta-` in dieser Datei genau einmal, naemlich als
   Ankuendigung im Kopf von Block 34 ("laege sonst neben einem spaeter noetigen
   `gtd-`, `gtc-` und `gta-`"). Im Parent-Theme, in den Plugins, in den
   MU-Plugins und in der Datenbank (`wp_posts`, `wp_postmeta`, `wp_options`):
   null Treffer. Die Gegenprobe schlaegt an, `gtk-` liefert dort sechs Beitraege
   und neun Meta-Zeilen. Wie in Block 32 gilt auch hier: KEIN `--gta-*` auf
   `:root`.

   DIE FLAECHENFOLGE IST GERECHNET UND NICHT GEWAEHLT
   --------------------------------------------------
   Chevron (Kopf), Hell (Ton-Band), Weiss (Formular), Navy (Schluss). Keine
   Flaeche wiederholt ihre Nachbarin. Das Ton-Band ist bedingt: es erscheint nur
   mit einem `?ral=`, dessen Nummer in `ral-classic.json` steht. Faellt es weg,
   lautet die Folge Chevron, Weiss, Navy, und die Regel gilt weiter. Genau
   deshalb liegt das Ton-Band auf Hell und nicht auf Weiss: sonst haetten Band
   und Formular dieselbe Flaeche und die Kante dazwischen verschwaende.

   WARUM DER GROESSTE TEIL DIESES BLOCKS ZWEI KLASSEN TIEF WAEHLT
   --------------------------------------------------------------
   Das Parent-Theme setzt seine Feldregeln ueber Attribut-Waehler
   (`input[type="text"]`, `input[type="email"]`, `textarea`, ...,
   makaffo/style.css ab Zeile 1234). Ein solcher Waehler steht bei (0,1,1), eine
   einzelne Klasse bei (0,1,0) und verliert damit. Jede Feldregel hier heisst
   deshalb `.gta-form .gta-feld__eingabe` und steht bei (0,2,0). Das ist kein
   Zierrat und kein Vorsichts-`!important`, sondern die kleinste Fassung, die
   gewinnt. Dieselbe Ueberlegung, mit anderen Zahlen, steht in Block 31.3 und
   in FALLE 71.
   ====================================================================== */

/* 37.1 Der Kopf: Chevron-Grund, Inhalt an der Rasterkante --------------- */
/* Wortgleich die Lage aus Block 32.1, mit einer Ausnahme, die weiter unten
   steht: dieser Kopf traegt keinen Knopf.

   DIE BAUART WIRD BLOCK STATT TABELLE, UND ZWAR AN ALLEN BREITEN
   ---------------------------------------------------------------
   Der Kopfbereich ist beim Theme eine Tabellenzelle mit fester Hoehe (409 px,
   unter 600 px 250 px), in der der Inhalt mittig sitzt. Eine feste Hoehe
   verschluckt jede Polster-Stufe, die kleiner ist als sie selbst, und der Kopf
   dieser Seite soll seine Hoehe aus Inhalt plus Polster bekommen wie jeder
   gebaute Hero dieser Website.

   DER SCHLEIER FAELLT, UND ZWAR GERECHNET
   ---------------------------------------
   `.page-header::before` legt auf JEDEN Kopfbereich einen Navy-Schleier mit
   0,7 Deckung. Er ist da, weil unter dem Titel sonst ein Foto liegt. Hier liegt
   kein Foto, sondern das Chevron-Band der Startseite, und das ist schon dunkel
   genug: der HELLSTE Bildpunkt des sichtbaren Ausschnitts ist rgb(0, 99, 249),
   Weiss steht darauf bei 5,06:1 (nachgemessen fuer Block 31.1, ueber den ganzen
   Ausschnitt und nicht an einer Stelle; es ist dasselbe Bild aus derselben
   Quelle). Ein Schleier darueber machte das Muster unsichtbar und den Kopf zu
   einer glatten dunklen Flaeche. */
.page-header:has(.gta-kopf) {
  display: block;
  height: auto;
  min-height: 0;
  padding: 0;
}
.page-header:has(.gta-kopf) > .dcell { display: block; }
.page-header:has(.gta-kopf)::before {
  background-color: transparent;
  opacity: 1;
}

/* `.text-center` steht als Klasse am Kopfbereich des Themes und wirkt ueber
   Vererbung. Der Kasten setzt seine Ausrichtung deshalb selbst, genau wie
   `.gtr-hero`, `.gtr-det-hero` und `.gtk-kopf`.

   DER DECKEL VON 870 PX IST HAUSSTAND UND KEIN NEUER WERT. Er steht in Block 17
   (Werkstoff), Block 27 (Ueber uns) und Block 32.1 (Kontakt) mit derselben
   Begruendung: bei voller Rasterbreite haette die Einleitung Zeilen von gut 150
   Zeichen, und das Auge findet den Zeilenanfang nicht mehr zurueck. */
.gta-kopf {
  max-width: 870px;
  margin: 0;
  text-align: left;
}

/* Das Site-Polster, in allen drei Stufen ausgeschrieben, mit denselben Zahlen
   und denselben Umschaltbreiten wie Block 30.1, 31.1, 32.1 und 34.1. Abgelesen
   an /ueber-uns/, /farben-oberflaechen/ und /werkstoff-stahl/: 90 ab 1025,
   72 von 768 bis 1024, 60 darunter. */
@media (min-width: 1025px) {
  .page-header:has(.gta-kopf) .gta-kopf { padding: 90px 0; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .page-header:has(.gta-kopf) .gta-kopf { padding: 72px 0; }
}
@media (max-width: 767px) {
  .page-header:has(.gta-kopf) .gta-kopf { padding: 60px 0; }
}

/* Kicker, Schlagzeile und Satz sind zeichengleich die des Kontakt-Kopfs
   (Block 32.1) und damit die des Archiv-Kopfs (Block 30.1). Es ist dieselbe
   Zeile an derselben Stelle, und wo der Bestand eine Antwort hat, wird sie
   genommen und nicht neu erfunden.

   HIER FEHLT `.gta-kopf__knopf`, UND DAS IST DIE EINE ABWEICHUNG
   --------------------------------------------------------------
   Block 32.1 endet mit `.gtk-kopf__knopf { margin-top: 30px }`. Diese Zeile hat
   hier kein Gegenstueck, weil der Auftrag im Kopf ausdruecklich keinen Knopf
   will: das Formular ist der Knopf. Eine Regel fuer ein Element, das es nicht
   gibt, waere eine Zeile, die jemand spaeter fuer eine vergessene haelt. */
.gta-kopf__kicker {
  margin: 0 0 14px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #FFFFFF;
}
/* Die Klasse `page-title` bleibt am h1 und bringt Farbe und Versalien des
   Themes mit, dazu die zwei Regeln dieser Datei zur Worttrennung im
   Kopfbereich. Der Schriftgrad faellt von den 58 px des Themes auf die 42 px,
   mit denen jede andere Seite ihre Hero-Schlagzeile setzt.

   Der Zweisatz und die Bedingung `min-width: 768px` sind dieselben wie bei
   `.gtr-hero__titel` und `.gtk-kopf__titel` und aus demselben Grund: die
   Theme-Regel `.page-header .page-title { font-size: 58px }` steht bei (0,2,0),
   und unter 768 px gilt der mitwachsende Grad `clamp(22px, 7vw, 36px)` aus dem
   Abschnitt "Seitentitel im Kopfbereich" weiter oben. */
.gta-kopf__titel {
  margin: 0;
  line-height: 1.08;
}
@media (min-width: 768px) {
  .page-header .gta-kopf__titel { font-size: 42px; line-height: 52px; }
}
.gta-kopf__sub {
  margin: 18px 0 0;
  max-width: none;
  font-size: 17px;
  line-height: 30px;
  color: #FFFFFF;
}
@media (max-width: 767px) {
  .gta-kopf__kicker { font-size: 12px; letter-spacing: .14em; }
  .gta-kopf__sub { font-size: 16px; line-height: 27px; }
}

/* 37.2 Das Ton-Band: die Gegenseite der Verzahnung --------------------- */
/* Ein schmales Band auf der hellen Flaeche des Hauses. Die Polsterreihe ist die
   der schmalen Baender, 48 / 40 / 32 (Block 33.1 und 35), nicht die der vollen
   Sektionen: hier steht EINE Zeile, keine Ueberschrift und kein Absatz.

   DIE TON-ZEILE WIRD GEHOLT UND NICHT NACHGEBAUT
   ----------------------------------------------
   Farbpunkt, Nummer und Name kommen aus `gtr_ton_markup( $ton, 28 )`, also aus
   `.gtr-ton--gross` weiter oben (Block 30.4). Damit ist der Hexwert des Punktes
   zeichengleich der aus `ral-classic.json`, die Geometrie aus FALLE 73
   (Fuellung r=6, Luft 1,2 px, Kante r=8) gilt hier von selbst mit, und dieser
   Block enthaelt keinen einzigen Farbwert eines RAL-Tones.

   Der Auftrag sagt "RAL-Nummer fett". Das ist sie bereits: `.gtr-ton__nr` steht
   in Inter 700. Es gibt hier deshalb keine Regel dafuer, und das ist die Probe
   aufs Exempel, dass die Zeile wirklich der eine Wahrheitsort ist.

   KONTRASTE, Grund `--brand-ivory` #F4F6F9: Etikett und Ton-Name #5B6675
   5,38:1, Nummer #1A1D21 15,62:1, Entfernen-Verweis #13366D 10,92:1. */
.gta-tonband {
  background: var(--brand-ivory);
  padding: 48px 0;
}
@media (max-width: 991px) { .gta-tonband { padding: 40px 0; } }
@media (max-width: 767px) { .gta-tonband { padding: 32px 0; } }

/* Eine Zeile, die umbricht, statt zu schrumpfen. Bei 390 px stehen Etikett,
   Ton-Zeile und Entfernen-Verweis untereinander; `align-items: center` haelt
   den 28-px-Punkt auf der Schriftlinie seiner Nachbarn. */
.gta-tonband__zeile {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 20px;
}
.gta-tonband__etikett {
  font-family: var(--brand-font-body);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--brand-muted);
}
/* Der Entfernen-Verweis ist unterstrichen, weil er mitten in einer Zeile aus
   Text steht und ohne Unterstreichung nur an der Farbe zu erkennen waere.
   Dieselbe Feststellung und dieselbe Antwort stehen in Block 34.4. */
.gta-tonband__weg {
  font-family: var(--brand-font-body);
  font-size: 14px;
  line-height: 22px;
  color: var(--brand-link);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.gta-tonband__weg:hover,
.gta-tonband__weg:focus { color: var(--brand-onyx); }

/* 37.3 Die Formular-Sektion -------------------------------------------- */
/* Der Grund ist ausdruecklich weiss gesetzt und nicht dem Theme ueberlassen:
   die Kontrastwerte dieses Abschnitts sind gegen #FFFFFF gerechnet, und eine
   gerechnete Zahl, deren Grund von einer fremden Einstellung abhaengt, ist
   keine Zusage. Dieselbe Ueberlegung steht in Block 32.2.

   Die Polster sind die der gebauten Sektionen, 90 / 72 / 60 (Block 30.5). */
.gta-formular {
  background: #FFFFFF;
  padding: 90px 0;
}
@media (max-width: 991px) { .gta-formular { padding: 72px 0; } }
@media (max-width: 767px) { .gta-formular { padding: 60px 0; } }

/* DER DECKEL IST 760 PX UND NICHT DIE 640 DER RECHTSSEITEN
   --------------------------------------------------------
   Block 34.2 deckelt eine lange Textspalte auf 640 px, hergeleitet aus "rund
   80 Zeichen bei 16 px". Diese Herleitung gilt fuer FLIESSTEXT und nicht fuer
   ein Formular: hier steht kein Satz, der ueber die volle Breite laeuft,
   sondern zwei Felder nebeneinander. Bei 760 px und 32 px Fuge sind das
   364 px je Feld, und darin steht "Laenge x Breite x Hoehe" ohne abzuschneiden.
   760 ist zugleich ein Hauswert (Block 22 fuehrt ihn fuer die Textspalte bei
   17 px). Der Kasten steht links an der Rasterkante und nicht mittig: die
   ganze Seite ist linksbuendig aufgebaut, vom Kopf an. */
.gta-formular__kasten { max-width: 760px; }

/* Die Reihen. Einspaltig ist der Grundfall, zweispaltig ab 992 px, weil dort
   das Theme sein Raster von 720 auf 940 px oeffnet; dieselbe Stufe schaltet in
   Block 30.5, 32.2 und 33.1. `align-items: start` haelt beide Spalten oben,
   sonst saehe ein Feld mit Hinweiszeile darunter aus wie versehentlich
   abgesackt. */
.gta-form__reihe { display: grid; gap: 28px; }
.gta-form__reihe + .gta-form__reihe { margin-top: 28px; }
@media (min-width: 992px) {
  .gta-form__reihe--zwei {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 32px;
    align-items: start;
  }
}

/* Das Etikett steht UEBER dem Feld und nicht daneben: bei 390 px ist daneben
   kein Platz, und ein Etikett, das je nach Breite die Seite wechselt, ist beim
   Ausfuellen schwerer wiederzufinden als eines, das immer oben steht.

   KONTRASTE, Grund #FFFFFF: Etikett #0C2148 15,83:1, die Pflichtmarke und die
   Hinweiszeile #5B6675 5,83:1. */
.gta-feld__etikett {
  display: block;
  margin: 0 0 8px;
  font-family: var(--brand-font-body);
  font-size: 15px;
  font-weight: 600;
  line-height: 24px;
  color: var(--brand-onyx);
}
/* Die Pflicht steht als WORT und nicht als Sternchen. Ein Sternchen braucht
   eine Legende irgendwo auf der Seite, und wer sie ueberliest, weiss nicht,
   was es bedeutet; ausserdem liest ein Vorleseprogramm es als "Stern". Der
   Zustand selbst haengt nicht an dieser Marke: Contact Form 7 setzt am Feld
   zusaetzlich `aria-required="true"`. */
.gta-feld__pflicht {
  margin-left: 8px;
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--brand-muted);
}
.gta-feld__hinweis {
  display: block;
  margin-top: 8px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  line-height: 22px;
  color: var(--brand-muted);
}

/* DIE FELDER SELBST.
   ------------------
   Zwei Klassen tief, siehe den Kopf dieses Blocks: die Theme-Regel steht bei
   (0,1,1), diese bei (0,2,0) und gewinnt damit ohne `!important`.

   DIE KANTE IST `--brand-muted` UND NICHT `--brand-border`
   -------------------------------------------------------
   Das Haus zeichnet Trennlinien in `--brand-border` (#E3E7ED). Fuer eine
   Trennlinie ist das richtig, fuer die Kante eines Bedienelements nicht: sie
   steht auf Weiss bei 1,24:1, und die Umrandung eines Eingabefeldes ist genau
   der Fall, fuer den 3:1 gilt (Nicht-Text-Kontrast). `--brand-muted` steht bei
   5,83:1 und ist damit auch dann noch zu sehen, wenn jemand den Schirm im
   Sonnenlicht liest. Ein zweiter Weg, das Feld erkennbar zu machen (eine graue
   Fuellung wie beim Theme, #F7F7F7), scheidet aus demselben Grund aus: gegen
   Weiss sind das 1,05:1.

   16 PX UND NICHT 14. Unter 16 px zoomt iOS beim Hineintippen in ein Feld die
   ganze Seite heran und laesst sie so stehen. Das Theme setzt 14 px; hier ist
   das der Grund fuer die Abweichung, nicht der Geschmack.

   KONTRAST im Feld, Grund #FFFFFF: Eingabe #1A1D21 16,91:1, Platzhalter
   #5B6675 5,83:1. Der Platzhalter ist im Auftrag von der Messung ausgenommen;
   er traegt trotzdem einen Wert ueber der Schwelle, damit die Ausnahme keine
   braucht. */
.gta-form .gta-feld__eingabe {
  display: block;
  width: 100%;
  padding: 13px 16px;
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 26px;
  color: var(--brand-text);
  background-color: #FFFFFF;
  border: 1px solid var(--brand-muted);
  border-radius: 6px;
  box-sizing: border-box;
}
.gta-form .gta-feld__eingabe::placeholder {
  color: var(--brand-muted);
  opacity: 1;
}
.gta-form .gta-feld__mehrzeiler {
  min-height: 150px;
  resize: vertical;
}
/* Die Auswahl behaelt ihr eigenes Zeichen und bekommt nur Kante, Polster und
   Schrift der uebrigen Felder. `appearance: none` wuerde das Zeichen entfernen
   und muesste durch ein eigenes ersetzt werden; das waere ein neues Zeichen in
   einem Haus, das seine Zeichen zaehlt, und es waere je nach Betriebssystem
   anders gross. Der sichtbare Unterschied ist der Pfeil, und der gehoert dort
   auch hin. */
.gta-form .gta-feld__auswahl {
  height: auto;
  cursor: pointer;
}

/* DER FOKUS IST HIER VON NULL GEBAUT, UND ZWAR MIT ABSICHT
   --------------------------------------------------------
   Nachgemessen: das Theme setzt an allen Feldern `outline: none`
   (makaffo/style.css:1256, ohne `!important`), und die einzige `:focus`-Regel
   fuer Felder auf der ganzen Website setzt `color: #585858`, also exakt den
   Wert, den das Feld im Ruhezustand ohnehin traegt. Der Fokus veraendert am
   Feld damit heute buchstaeblich nichts. Eine Pruefung, die nur fragt "gibt es
   eine :focus-Regel", ginge hier gruen und bewiese nichts.

   `box-shadow` und nicht `outline`, weil das Haus seine Fokusringe so zeichnet
   (vier Praezedenzfaelle, Block 31.6, 32.4, 33.4, 34.4). Die Kante wechselt
   zusaetzlich auf `--brand-link`: der Ring allein waere bei einem Feld, das
   ohnehin eine Kante hat, nur eine zweite Linie in derselben Gegend. */
.gta-form .gta-feld__eingabe:focus,
.gta-form .gta-feld__eingabe:focus-visible {
  outline: none;
  border-color: var(--brand-link);
  box-shadow: 0 0 0 3px var(--brand-link);
}

/* Die Foto-Felder. `fieldset` und `legend` sind hier keine Zierde: fuenf
   Eingaben, die zusammen EINE Frage beantworten, gehoeren in eine Gruppe, und
   die Legende ist ihre gemeinsame Beschriftung. Das Standard-Aussehen des
   `fieldset` (Rahmen und Einzug) wird zurueckgenommen, seine Bedeutung nicht.

   Ab 560 px stehen Beschriftung und Feld nebeneinander, darunter untereinander.
   Die 560 ist nicht die Rasterstufe des Themes, sondern der Punkt, an dem die
   Beschriftung "Datei 1" plus der native Dateiknopf in eine Zeile passen; sie
   gilt nur hier und aendert an keiner anderen Stelle etwas. */
.gta-fotos {
  margin: 28px 0 0;
  padding: 0;
  border: 0;
  min-width: 0;
}
.gta-fotos__hinweis {
  margin: 0;
  font-family: var(--brand-font-body);
  font-size: 15px;
  line-height: 24px;
  color: var(--brand-text);
}
.gta-fotos__grenze {
  margin: 6px 0 0;
  font-family: var(--brand-font-body);
  font-size: 14px;
  line-height: 22px;
  color: var(--brand-muted);
}
.gta-fotos__reihe {
  display: grid;
  gap: 6px;
  margin-top: 14px;
}
@media (min-width: 560px) {
  .gta-fotos__reihe {
    grid-template-columns: 84px minmax(0, 1fr);
    align-items: center;
    gap: 16px;
  }
}
.gta-fotos__etikett {
  font-family: var(--brand-font-body);
  font-size: 14px;
  line-height: 22px;
  color: var(--brand-muted);
}
.gta-form .gta-fotos__eingabe {
  display: block;
  width: 100%;
  font-family: var(--brand-font-body);
  font-size: 14px;
  line-height: 22px;
  color: var(--brand-text);
}
.gta-form .gta-fotos__eingabe:focus,
.gta-form .gta-fotos__eingabe:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px var(--brand-link);
}

/* Der Zustimmungs-Haken. Contact Form 7 wickelt hier selbst ein `label` um
   Kasten und Text; die Beschriftung ist damit UEBER DIE VERSCHACHTELUNG
   verbunden und braucht kein `for`. Das ist gueltiges HTML und der uebliche
   Weg des Plugins.

   `.wpcf7-list-item` bringt aus dem Plugin-Stylesheet `margin-left: 1em` mit.
   Die Zeile wuerde damit gegen alle anderen Felder eingerueckt stehen, und
   zwar nur diese eine. */
.gta-dsgvo { margin-top: 32px; }
.gta-dsgvo .wpcf7-list-item { display: block; margin: 0; }
.gta-dsgvo label {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  font-family: var(--brand-font-body);
  font-size: 15px;
  line-height: 24px;
  color: var(--brand-text);
  cursor: pointer;
}
/* 20 px und nicht die Vorgabe des Systems (meist 13 px): der Haken ist das
   einzige Bedienelement der Seite, das man treffen muss, ohne es lesen zu
   koennen. `accent-color` faerbt ihn im Zustand "an" in die Linkfarbe des
   Hauses, ohne dass der Kasten nachgebaut werden muesste. */
.gta-form .gta-dsgvo__kasten {
  flex: 0 0 20px;
  width: 20px;
  height: 20px;
  margin: 2px 0 0;
  accent-color: var(--brand-link);
}
.gta-form .gta-dsgvo__kasten:focus,
.gta-form .gta-dsgvo__kasten:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px var(--brand-link);
}
.gta-dsgvo__verweis {
  color: var(--brand-link);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.gta-dsgvo__verweis:hover,
.gta-dsgvo__verweis:focus { color: var(--brand-onyx); }

/* Der Absende-Knopf traegt die Theme-Klasse `.octf-btn` und bekommt damit den
   Primaer-Stil des Hauses ohne eine eigene Zeile: gefuellt #004FEF, weisse
   Schrift (6,24:1), Epilogue 16/500 versal, Radius 27 px, Polster 13/40/9. Das
   ist der eine Wahrheitsort; `.octf-btn-primary` steht zwar im Markup mancher
   Bausteine, hat aber nirgends eine Regel und tut nichts.

   Was das Theme NICHT mitbringt, ist der Fokus: `.octf-btn` setzt
   `outline: none`. Der Ring kommt deshalb hier dazu, und er streitet nicht mit
   der Theme-Regel `.octf-btn:not(.octf-btn-play):focus`, die nur die
   Grundfarbe setzt. */
.gta-form__senden { margin-top: 32px; }
.gta-form .gta-senden {
  cursor: pointer;
}
.gta-form .gta-senden:focus,
.gta-form .gta-senden:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px var(--brand-link);
}

/* DIE MELDUNGEN.
   --------------
   Zwei Sorten, und sie sehen verschieden aus, weil sie verschiedene Dinge
   sagen: die Feldmeldung steht unter ihrem Feld, die Sammelmeldung unter dem
   Formular.

   ROT ALLEIN SAGT NICHTS. Neben der Farbe traegt ein ungueltiges Feld eine
   zweite Kante (2 px statt 1) und `aria-invalid="true"` aus dem Plugin, und die
   Meldung selbst ist ein Satz. Wer Farben nicht unterscheidet, liest also
   trotzdem, was fehlt.

   `--brand-accent` (#C2410C) ist die einzige warme Farbe dieses Hauses und
   stand bis zu diesem Block an keiner gebauten Regel, sondern nur an der
   Hilfsklasse `.br-accent`. Sie steht auf Weiss bei 5,18:1 und ist damit ueber
   der Schwelle fuer normalen Text.

   Die Sammelmeldung des Plugins bringt eigene Farben mit (`.wpcf7 form.sent`
   gruen, `form.invalid` gelb). Sie werden hier ersetzt, und die Waehler sind
   dafuer eine Klasse tiefer als die des Plugins: dessen Regel steht bei
   (0,3,1), diese bei (0,4,1). Auf die Ladereihenfolge wird nicht gebaut. */
.gta-formular .wpcf7-not-valid-tip {
  display: block;
  margin-top: 8px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  line-height: 22px;
  color: var(--brand-accent);
}
.gta-form .wpcf7-not-valid {
  border-color: var(--brand-accent);
  border-width: 2px;
}
.gta-formular .wpcf7 form .wpcf7-response-output {
  margin: 28px 0 0;
  padding: 16px 18px;
  border: 2px solid var(--brand-muted);
  border-radius: 6px;
  font-family: var(--brand-font-body);
  font-size: 15px;
  line-height: 24px;
  color: var(--brand-text);
}
.gta-formular .wpcf7 form.sent .wpcf7-response-output {
  border-color: var(--brand-link);
}
.gta-formular .wpcf7 form.invalid .wpcf7-response-output,
.gta-formular .wpcf7 form.unaccepted .wpcf7-response-output,
.gta-formular .wpcf7 form.failed .wpcf7-response-output,
.gta-formular .wpcf7 form.aborted .wpcf7-response-output,
.gta-formular .wpcf7 form.spam .wpcf7-response-output {
  border-color: var(--brand-accent);
}

/* 37.4 Die Schlusszeile ------------------------------------------------- */
/* Ein schmales Band auf Navy, die Polsterreihe der schmalen Baender
   (48 / 40 / 32). Es ist der dunkle Schluss, mit dem jede Seite dieser Website
   endet.

   KONTRASTE, Grund `--brand-onyx` #0C2148: die zwei Kanaele #FFFFFF 15,83:1,
   Vorsatz, Trenner und Takt-Zusage #C6D0E0 10,18:1. #C6D0E0 ist keine neue
   Farbe: es ist der ruhige Satz aus Block 33.2, dort auf demselben Grund. */
.gta-schluss {
  background: var(--brand-onyx);
  padding: 48px 0;
}
@media (max-width: 991px) { .gta-schluss { padding: 40px 0; } }
@media (max-width: 767px) { .gta-schluss { padding: 32px 0; } }

/* Ab 992 px stehen Kanaele und Takt-Zusage nebeneinander, die Zusage rechts
   ausgerichtet; darunter untereinander und beide links. Dieselbe Stufe wie
   ueberall in diesem Block. */
.gta-schluss__raster { display: grid; gap: 14px; }
@media (min-width: 992px) {
  .gta-schluss__raster {
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 32px;
    align-items: baseline;
  }
  .gta-schluss__takt { text-align: right; }
}
.gta-schluss__kanaele,
.gta-schluss__takt {
  margin: 0;
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 26px;
  color: #C6D0E0;
}
.gta-schluss__wert {
  color: #FFFFFF;
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.gta-schluss__wert:hover,
.gta-schluss__wert:focus { color: #C6D0E0; }
.gta-schluss__trenner { padding: 0 6px; }

/* 37.5 Der Fokus der Verweise auf dieser Seite -------------------------- */
/* Zwei Regeln, weil es zwei Gruende gibt. Auf den hellen Flaechen (Ton-Band und
   Formular) ist der Ring `var(--brand-link)`, auf Navy und im Kopf ist er
   #FFFFFF: #13366D gegen #0C2148 sind 1,34:1, also praktisch dieselbe Flaeche.
   Dieselbe Feststellung und dieselbe Antwort stehen in Block 31.6, 32.4, 33.4
   und 34.4.

   `box-shadow` und nicht `outline`, weil im Zusatz-CSS der Website
   `a:focus { outline: none !important }` steht, site-weit. */
.gta-inhalt a:focus-visible {
  box-shadow: 0 0 0 3px var(--brand-link);
}
.gta-schluss a:focus-visible,
.page-header:has(.gta-kopf) a:focus-visible {
  box-shadow: 0 0 0 3px #FFFFFF;
}

/* --- 38. Der ANFRAGE-Knopf unter dem Mobilmenue ------------------------ */
/* Er traegt NICHT `octf-btn`: der hat `white-space: nowrap` und 40 px
   Innenabstand je Seite, im Panel bleiben aber nur 240 px nutzbare Breite
   (`.mmenu-wrapper .mobile-nav { min-width: 240px }`). Er traegt auch nicht
   `gtp-knopf`, weil das geteiltes Vokabular ist (Block 28): sieben gebaute
   Seiten haengen daran, und ein Einzelfall bekommt eine eigene Klasse.

   Die Waehler unten haben (1,3,1) und schlagen die Theme-Regel
   `.mmenu-wrapper .mobile_mainmenu li a` (0,3,1) ohne ein `!important`.

   Kein eigener Media-Query: der Knopf sitzt in `#mmenu-wrapper`, und den gibt
   es nur im Mobil-Kopf. Ab 1025 px ist der ganze `.header-mobile` unsichtbar,
   der Eintrag steht dort zwar im DOM, aber in keinem Bildschirmbereich. */
#mmenu-wrapper .mobile_mainmenu li.gtp-mmenu-cta {
  margin-top: 18px;
}
#mmenu-wrapper .mobile_mainmenu li.gtp-mmenu-cta > a {
  display: block;
  width: 100%;
  box-sizing: border-box;
  padding: 13px 20px 12px;
  /* Die Haarlinie des Listen-Stils muss ausdruecklich weg. Die Ausnahme
     `li:last-child > a { border: none }` des Themes steht nur im
     `.mobile_nav`-Block (Unterstrich) und greift auf `.mobile-nav` nie. */
  border-bottom: 0;
  border-radius: 27px;        /* wie --makaffo-btn-border-radius */
  background-color: #004FEF;  /* Global Primary */
  color: #FFFFFF;             /* 6,24:1 auf #004FEF */
  font-family: Epilogue, sans-serif;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: .06em;
  text-align: center;
  text-transform: uppercase;
  white-space: normal;
}
/* Das Theme faerbt Menue-Verweise im Schwebezustand auf die Primaerfarbe.
   Am Knopf waere das Blau auf Blau, also nichts zu sehen. */
#mmenu-wrapper .mobile_mainmenu li.gtp-mmenu-cta > a:hover,
#mmenu-wrapper .mobile_mainmenu li.gtp-mmenu-cta > a:focus,
#mmenu-wrapper .mobile_mainmenu li.gtp-mmenu-cta > a:focus-visible {
  background-color: #0040C4;  /* Weiss darauf: 8,35:1 */
  color: #FFFFFF;
}
#mmenu-wrapper .mobile_mainmenu li.gtp-mmenu-cta > a:focus-visible {
  outline: 2px solid #FFFFFF;
  outline-offset: 2px;
}


/* =========================================================================
   Block 38: DIE FEHLERSEITE 404 (02.09.2026)
   =========================================================================
   Die Vorlage dazu ist `404.php` im Child. Sie geht den Weg der Rechtsseiten:
   `get_header()` wird gepuffert, und darin wird die Schlagzeile des
   Kopfbereichs gegen einen eigenen Kopf getauscht. Warum das nicht Zierde,
   sondern Pflicht ist (ohne den Tausch stuende dort das englische
   "ERROR PAGE" des Themes), steht im Docblock der Vorlage.

   ALLES HAENGT AN `.gt404-`, UND DAS PRAEFIX IST FREI
   ---------------------------------------------------
   Nachgesehen vor der Vergabe: `gt404-` kommt in dieser Datei, im ganzen
   Child, in den Themes des Containers und in der Datenbank kein einziges Mal
   vor (Gegenprobe mit `gtl-kopf`: zwei Treffer im Container). Es traegt die
   GATTUNG, so wie `gtl-` die Rechtsseiten traegt. Keine Regel dieses Blocks
   spricht eine Seiten-Kennung an, und keine trifft einen Waehler, den es auf
   einer Bestandsseite gibt: dieser Block ist dort wirkungslos, und der Diff
   des Gates belegt es.

   DIE ZAHLEN SIND ABGESCHRIEBEN, NICHT ERFUNDEN
   ----------------------------------------------
   38.1 ist Zeichen fuer Zeichen Block 34.1 mit ausgetauschtem Praefix: Navy
   ueber den Schleier, Polster 90 / 72 / 60, Kicker 14 px / 700 / .16em versal,
   Schlagzeile 42/52 ab 768 px. Zwei Koepfe derselben Familie, die sich in
   einer Zahl unterschieden, waeren eine Zahl zu viel. Leseraster 640 px wie
   Block 34.2.

   KONTRASTE (neue Paare dieses Auftrags, gerechnet und im Gate am Bildpunkt
   am Bildpunkt GEMESSEN, nicht gerechnet): Weiss auf `--brand-onyx` 15,83:1 fuer Kicker und
   Schlagzeile. `#004FEF` auf Weiss 6,24:1 fuer die Ziffer (grosse Schrift,
   Schwelle 3,0:1). `--brand-muted` auf Weiss 5,83:1 fuer den Satz.
   `--brand-onyx` auf Weiss 15,83:1 fuer Schrift und Kante der drei
   Umriss-Knoepfe. Weiss auf `#004FEF` 6,24:1 im Primaerknopf.
   ====================================================================== */

/* 38.1 Das Navy-Band ---------------------------------------------------- */
/* Wortgleich die Lage aus Block 34.1: das Theme setzt sein Kopfbild INLINE
   ans Element, ein `background-image: none` liefe deshalb ins Leere. Der
   site-weite Schleier `.page-header::before` traegt ohnehin `--brand-onyx`,
   hier steht er auf Deckung 1 statt 0,7 und verdeckt das Bild vollstaendig.
   Der Grund am Element selbst bleibt als Boden. */
.page-header:has(.gt404-kopf) {
  display: block;
  height: auto;
  min-height: 0;
  padding: 0;
  background-color: var(--brand-onyx);
}
.page-header:has(.gt404-kopf) > .dcell { display: block; }
.page-header:has(.gt404-kopf)::before {
  background-color: var(--brand-onyx);
  opacity: 1;
}

/* `.text-center` steht als Klasse am Kopfbereich des Themes und wirkt ueber
   Vererbung. Der Kasten setzt seine Ausrichtung deshalb selbst. */
.gt404-kopf {
  margin: 0;
  text-align: left;
}
@media (min-width: 1025px) {
  .page-header:has(.gt404-kopf) .gt404-kopf { padding: 90px 0; }
}
@media (min-width: 768px) and (max-width: 1024px) {
  .page-header:has(.gt404-kopf) .gt404-kopf { padding: 72px 0; }
}
@media (max-width: 767px) {
  .page-header:has(.gt404-kopf) .gt404-kopf { padding: 60px 0; }
}

/* Zeichengleich `.gtl-kopf__kicker` aus Block 34.1. */
.gt404-kopf__kicker {
  margin: 0 0 14px;
  font-family: var(--brand-font-body);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #FFFFFF;
}
@media (max-width: 767px) {
  .gt404-kopf__kicker { font-size: 12px; letter-spacing: .14em; }
}

/* Die Klasse `page-title` bleibt am h1 und bringt Weiss, Versalien und die
   Worttrennung des Kopfbereichs mit (makaffo/style.css:2008, brand.css:474).
   Hier steht nur, was davon abweicht: der Grad faellt von den 58 px des
   Themes auf die 42 px jeder anderen Schlagzeile dieser Website. Unter
   768 px gilt der mitwachsende Grad aus brand.css:481. */
.gt404-kopf__titel {
  margin: 0;
  line-height: 1.08;
}
@media (min-width: 768px) {
  .page-header .gt404-kopf__titel { font-size: 42px; line-height: 52px; }
}

/* 38.2 Die vier Wege ---------------------------------------------------- */
/* Weisse Flaeche und die Polster der gebauten Sektionen, 90 / 72 / 60
   (Block 30.5). */
.gt404-wege {
  background: #FFFFFF;
  padding: 90px 0;
}
@media (max-width: 991px) { .gt404-wege { padding: 72px 0; } }
@media (max-width: 767px) { .gt404-wege { padding: 60px 0; } }

/* DER DECKEL SITZT AM SATZ UND NICHT AN DER SPALTE.
   Er ist das Leseraster aus Block 34.2, hergeleitet fuer eine lange
   Textspalte ("rund 80 Zeichen bei 16 px"). Die Knopfreihe ist kein Lesetext:
   lag der Deckel an der Spalte, brach bei 1280 px der vierte Knopf in eine
   zweite Zeile, obwohl 778 px Knopfbreite in ein 1140 px breites Raster
   passen. Gefunden hat es der Abzug, nicht die Regel. */
.gt404-wege__spalte {
  margin: 0;
}

/* DIE ZIFFER: ARCHIVO UND GLOBAL PRIMARY, WIE DER AUFTRAG ES NENNT.
   `#004FEF` ist der Wert von Global Primary, abgelesen am Elementor-Kit
   dieser Website (`system_colors`, Eintrag `primary`) und identisch mit
   `--makaffo-color-primary` des Themes. Er steht hier als Hexwert und nicht
   als `var(--e-global-color-primary)`: die Kontrastzahl daneben ist sonst
   eine Zusage ueber eine fremde Einstellung. Archivo bringt die Grundregel
   der Datei mit, weil die Ziffer in einem Absatz steht; `font-family` steht
   deshalb ausgeschrieben da.
   Grosse Schrift nach WCAG (ab 24 px fett, hier 84 px und mehr), Schwelle
   also 3,0:1, gemessen 6,24:1 gegen Weiss. */
.gt404-ziffer {
  margin: 0 0 18px;
  font-family: var(--brand-font-heading);
  font-size: 160px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -.02em;
  color: #004FEF;
}
@media (min-width: 768px) and (max-width: 1024px) {
  .gt404-ziffer { font-size: 120px; }
}
@media (max-width: 767px) {
  .gt404-ziffer { font-size: 84px; }
}

/* Der ruhige Satz. Farbe und Grad sind die des Fliesstextes der Textseiten
   (Block 34.3), es ist dieselbe Rolle an derselben Stelle. */
.gt404-satz {
  max-width: 640px;
  margin: 0 0 30px;
  font-family: var(--brand-font-body);
  font-size: 16px;
  line-height: 28px;
  color: var(--brand-muted);
}

/* Die Reihe bricht um, statt die Knoepfe zu stauchen: bei 390 px stehen vier
   Knoepfe untereinander, ab 768 px nebeneinander. `align-items: center` haelt
   den Primaerknopf, der im Wrapper des Themes steckt, auf einer Linie mit den
   drei Umriss-Knoepfen. */
.gt404-wege__reihe {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px;
}

/* Der Umriss-Knopf auf hellem Grund traegt Navy statt der Primaerfarbe,
   dieselbe Regel und dieselbe Begruendung wie in Block 30.4 (`.gtr-band`) und
   31.5 (`.gtr-det-anfrage`). Der Schwebezustand braucht keine eigene Zeile:
   das Theme faerbt mit (0,3,0) auf `#242424` mit weisser Schrift, und auf
   hellem Grund ist das richtig (15,42:1 fuer die Schrift auf der Fuellung). */
.gt404-wege .octf-btn-outline { color: var(--brand-onyx); }
