/* ==========================================================================
   efficas.de — Gestaltungssystem, Refit-Fassung
   --------------------------------------------------------------------------
   Quelle im Repo: wordpress/mu-plugins/efficas-assets/design-refit.css
   NOCH NICHT AUF DER BOX. Ersetzt design.css erst nach Jonas' Freigabe.

   Warum es diese Datei gibt
   -------------------------
   Gemessen am 10.09.2026 (docs/efficas-website-BESTAND-gestaltung-2026-09-10.md):
   416,7 KB Inhaltslayout stehen inline in 18 Seiten, zentral liegt davon
   nichts. Vier Vokabulare - efficas-, eh3-, efl-, ep- - benennen dieselben
   Dinge verschieden und bemessen sie verschieden. Der Abschnittsabstand steht
   bei den Leistungsseiten auf 52px fest, bei Startseite und Profil auf
   clamp(72-118px): Faktor zwei zwischen Seitentypen derselben Website.

   Was hier anders ist
   -------------------
   EIN Vokabular (.ef-*), EINE Skala mit sieben Rollen, EIN Radius, EIN
   Schattensatz, DREI Abstandsstufen. Darauf drei Seitentyp-Kompositionen,
   die den Entwuerfen A, B und C entsprechen:

     .ef-seite--auftakt      Startseite            (Entwurf A "Hafen")
     .ef-seite--leistung     7 Angebotsseiten      (Entwurf B "Register")
     .ef-seite--erklaerung   10 Wissens-/Hausseiten (Entwurf C "Lagebild")

   Aufbau, in dieser Reihenfolge:
     1  Token          Farbe, Schrift, Mass
     2  Grundlagen     Typografie, Fokus, Bewegung
     3  Rahmen         Bahn, Band, Abschnitt
     4  Textbausteine  Marke, Kopfzeile, Vorspann, Link
     5  Bausteine      Knopf, Karte, Liste, Tabelle, Zahlen, Verweise …
     6  Seitentypen    was A, B und C je eigen haben
     7  Grafiken       Schaubildrahmen mit Umschaltpunkt 768px
     8  Uebergang      Altnamen als Aliase, mit Verfallsdatum
   ========================================================================== */


/* == 1  TOKEN ============================================================= */

:root {

  /* -- Farbe — unveraendert aus design.css uebernommen ------------------- */
  --ef-navy:          #153b5b;
  --ef-navy-tief:     #0d2940;
  --ef-navy-weich:    #12385c;
  --ef-navy-tinte:    #081a2b;
  --ef-tiefsee:       #061420;
  --ef-blau:          #2b6690;
  --ef-blau-hell:     #4f83ae;
  --ef-rot:           #7e2f3d;
  --ef-rot-hell:      #a4485a;
  --ef-rot-signal:    #d86c7e;   /* Aufhellung fuer dunkle Gruende. Gemessen:
                                    4,52:1 auf --ef-navy-tief, dem dunkelsten
                                    Grund, auf dem die Marke steht. Der Vorgaenger
                                    #c25668 kam dort nur auf 3,43:1 und war fuer
                                    13px-Text zu dunkel. Gleicher Farbton (350°),
                                    nur heller - nicht Richtung Orange gezogen. */
  --ef-rot-signal-flaeche: #c25668; /* fuer Flaechen und grosse Schrift, wo 3:1 reicht */
  --ef-rot-flaeche:   #f4eaec;

  --ef-text:          #12202c;
  --ef-text-leise:    #4e6272;
  --ef-text-schwach:  #57646f;   /* Gemessen 5,17:1 auf Weiss und 4,52:1 auf
                                    --ef-grund-2, dem dunkelsten hellen Grund,
                                    auf dem Meta-Text vorkommt. Zwei Vorgaenger
                                    lagen darunter: #7d8b98 bei 3,01:1,
                                    #5f6d7a bei 3,89:1. NICHT aufhellen. */

  --ef-flaeche:       #ffffff;
  --ef-grund:         #f4f6f7;
  --ef-grund-2:       #eef3f7;
  --ef-band:          #e9eff5;   /* Abschnittsband — muss gegen Weiss als Kante lesbar sein */
  --ef-linie:         #d8dde3;
  --ef-linie-fein:    #e6eaf0;
  --ef-erfolg:        #2e5a4c;

  --ef-auf-dunkel:        #dfeaf3;
  --ef-auf-dunkel-leise:  #9db5c8;
  --ef-linie-dunkel:      rgba(255, 255, 255, .16);

  /* -- Schrift — SIEBEN Rollen. Mehr gibt es nicht. ----------------------
     Gemessen im Bestand: 32 verschiedene Groessen auf der Strategieseite,
     ueberwiegend gebrochene Werte aus em-Ketten (10,88 / 11,52 / 12,16 …).
     Hier steht je Rolle ein Wert, und die Rollen haben Namen.
 */
  /* Bemessen fuer 1470px Fensterbreite - die Breite eines MacBook bei
     100% Browserzoom. Das war der Pruefstein, und die erste Fassung ist
     daran gescheitert: dort stand H1 auf 56px und H2 auf 44px. Auf einem
     835px hohen Schirm nahm allein eine fuenfzeilige Ueberschrift 350px
     ein - fast die halbe Seite. Jonas musste den Browser auf 75% ziehen,
     damit die Seite lesbar wurde. Wer zoomen muss, damit ein Text
     funktioniert, liest einen Text, der nicht funktioniert.

     Der Fehler war das Verhaeltnis, nicht die Absolutgroesse: H1 lag beim
     3,3-fachen des Fliesstextes. Fuer eine Beratungsseite, die am
     Notebook gelesen wird, sind 2,5 das Mass. Fliesstext bleibt deshalb
     bei 17px - der ist richtig -, die Anzeigegroessen kommen herunter.

                       vorher (1470)   jetzt (1470)
        H1                 56              42
        H2                 44              32
        H3                 24              21
        Vorspann           21              19
        Fliesstext         17              17

     ACHTUNG: In CSS-Rechenausdruecken muessen + und - von Leerzeichen
     umgeben sein. "1.4rem+3vw" ist ungueltig und laesst die GANZE
     Deklaration ausfallen - ohne Fehlermeldung, mit Rueckfall auf den
     geerbten Wert. Das hat beim Bau der Entwuerfe zwei Anlaeufe gekostet. */
  --ef-s-mikro:  0.8125rem;                                       /* 13px  Marke, Meta, Bildunterschrift */
  --ef-s-klein:  0.9375rem;                                       /* 15px  Beitext, Listen, Knopf */
  --ef-s-basis:  1.0625rem;                                       /* 17px  Fliesstext */
  --ef-s-lead:   clamp(1.0625rem, 1rem + 0.3vw, 1.1875rem);       /* 17-19 Vorspann */
  --ef-s-h3:     clamp(1.125rem, 0.99rem + 0.35vw, 1.375rem);     /* 18-22 */
  --ef-s-h2:     clamp(1.5rem, 0.945rem + 1.15vw, 2.25rem);       /* 24-36 */
  --ef-s-h1:     clamp(1.875rem, 1.155rem + 1.6vw, 3rem);         /* 30-48 */

  --ef-display: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --ef-body:    "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, sans-serif;
  --ef-mono:    "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;

  /* -- Mass — EIN Radius, EIN Schattensatz, DREI Abstaende ---------------
     Im Bestand: 12 Eckradien auf einer Seite (3/6/8/10/12/14/16/18/20/999px
     plus zwei asymmetrische) und fuenf Bahnbreiten. */
  --ef-r:        10px;
  --ef-r-klein:  6px;

  --ef-schatten:      0 1px 2px rgba(8, 20, 32, .05), 0 10px 30px rgba(8, 20, 32, .08);
  --ef-schatten-hoch: 0 2px 4px rgba(8, 20, 32, .06), 0 24px 60px rgba(8, 20, 32, .16);

  /* Drei Stufen mit Aufgabe, nicht mit Groesse benannt:
     eng  = innerhalb einer Gruppe, mit = zwischen Bloecken, weit = zwischen Abschnitten */
  /* Bemessen fuer einen Notebook-Bildschirm (1440 x 900), nicht fuer einen
     grossen Monitor. Vorher lief die weite Stufe bis 104px - auf 900px Hoehe
     ging damit ein Achtel des Bildschirms fuer einen Abschnittswechsel drauf. */
  /* Ebenfalls auf 1470px nachgerechnet. Die weite Stufe stand bei 68px,
     oben und unten also 136px je Abschnittswechsel - ein Sechstel eines
     835px hohen Schirms fuer eine Fuge. Jetzt 52px. */
  --ef-luft-eng:  clamp(.875rem, .75rem + .5vw, 1.25rem);   /* 14 → 19 → 20 */
  --ef-luft-mit:  clamp(1.5rem, 1.25rem + .9vw, 2.25rem);   /* 24 → 33 → 36 */
  --ef-luft-weit: clamp(2.25rem, 1.875rem + 1.5vw, 3.5rem); /* 36 → 52 → 56 */

  --ef-bahn:      1140px;   /* waechst ab 1600px, siehe unten */
  --ef-bahn-eng:  860px;
  --ef-rand:      clamp(1.75rem, 5vw, 3rem);    /* 28px auf dem Telefon, 48px
                                    ab Tablet. Der Livestand hatte 12px, der
                                    erste Refit-Stand 20px - beides stand am
                                    Rand gedraengt. */
  --ef-lesebahn:  68ch;

  /* Der Abstand zwischen einer Abschnittsueberschrift und dem Text darunter.
     Er steht hier als eigenes Mass, weil dieselbe Beziehung im Bestand in
     DREI Formen vorkommt: Text in der Kopfzeile, Text als Geschwister der
     Kopfzeile, Ueberschrift ganz ohne Kopfzeile. Vorher ergab jede Form
     einen anderen Abstand - 44px, 20px, 20px. Ein Leser sieht aber immer
     dieselbe Beziehung, also muss auch immer dasselbe Mass herauskommen.
     Die .6rem sind die Fuge der Kopfzeile, die im ersten Fall dazukommt. */
  --ef-kopf-luft: calc(var(--ef-luft-mit) + .6rem);

  --ef-kopf-hoehe:   72px;
  --ef-kopf-hoehe-s: 60px;
  --ef-uebergang:    170ms cubic-bezier(.4, 0, .2, 1);

  /* Umschaltpunkt der Schaubilder. Gemessen: ein 700er viewBox liefert hier
     10,7px Beschriftung, darunter faellt sie unter die Lesbarkeit. */
  --ef-schaubild-grenze: 768px;
}

/* Auf einem Buerobildschirm ist eine 1140px-Bahn in 2560px Fenster ein
   Streifen in der Mitte: 44% der Flaeche traegt Inhalt, links und rechts
   stehen je 710px leer. Die Bahn waechst deshalb mit - aber nur die Bahn.
   Der Fliesstext bleibt bei seiner Lesebahn (68ch), die zusaetzliche
   Breite geht an Raster, Auftakt und Schaubilder. Genau so herum: mehr
   Platz macht Tafeln besser und Absaetze schlechter. */
@media (min-width: 1600px) { :root { --ef-bahn: 1280px; } }
@media (min-width: 2000px) { :root { --ef-bahn: 1400px; } }


/* == 2  GRUNDLAGEN ======================================================== */

html {
  -webkit-text-size-adjust: 100%;
  scroll-padding-top: calc(var(--ef-kopf-hoehe) + 16px);

  /* KEIN scroll-behavior: smooth. Es stand hier bis zum 11.09.2026 und war
     die Ursache fuer ein zaehes, falsch anfuehlendes Scrollen beim Griff auf
     den Nach-oben-Knopf (a.generate-back-to-top, unten rechts auf jeder
     Seite).

     Der Grund ist ein Zusammenstoss zweier Mechanismen: GeneratePress
     bringt fuer diesen Knopf eine EIGENE Scroll-Animation in JavaScript
     mit. Laeuft zusaetzlich die des Browsers, arbeiten beide gegeneinander
     und die Strecke - auf der Startseite 7.744 Pixel - zieht sich endlos.

     Ankerspruenge im Text springen jetzt sofort statt zu gleiten. Das ist
     der Preis; er ist klein gegen einen Knopf, der sich kaputt anfuehlt.
     Wer smooth zurueckhaben will, muss es auf kurze Strecken begrenzen -
     und das kann CSS nicht, es gehoert dann in ein Skript. */
}

/* Bewegung ist eine Zugabe, nie eine Bedingung fuer Lesbarkeit. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}

.ef-seite {
  font-family: var(--ef-body);
  font-size: var(--ef-s-basis);
  line-height: 1.66;
  color: var(--ef-text);
  background: var(--ef-flaeche);
  -webkit-font-smoothing: antialiased;
}

/* Der Abfang fuer alles, was ueber den Rand laeuft - volle Baender,
   Randmarken, das Relief im Kopf.
   Er sitzt am body und NICHT an .ef-seite. Dort stand er bis zum
   10.09.2026, und das war genau falsch herum: .ef-seite ist im Theme nur
   1376 von 1470 Pixeln breit, also hat das clip die vollen Baender wieder
   auf Kastenbreite zurueckgeschnitten. Sichtbar war ein dunkler Block mit
   weissem Rand links und rechts - gemeint war eine durchlaufende Flaeche.
   Am body greift es an der Fensterkante, wo es hingehoert.
   clip statt hidden, weil hidden einen Scroll-Container erzeugt und
   position:sticky im Seitenkopf bricht. */
body:has(.ef-seite) { overflow-x: clip; }

/* Der schwebende Zurueck-nach-oben-Knopf des Themes.
   Gemessen: background rgba(217, 17, 24, .5) - das ist #D91118 aus der
   alten Farbwelt, halbdurchsichtig - mit color #2b2b2b darauf. Dunkelgrauer
   Pfeil auf durchscheinendem Signalrot, 40px gross, und die Deckkraft
   wandert beim Scrollen. Er ist die einzige Stelle auf den Entwuerfen, an
   der die Altfarbe noch auftaucht.

   Er bleibt - auf einer Seite von 14.700px ist ein schwebender Ausgang
   naeher als das Ende. Aber er traegt die Farben des Hauses und ein
   Tap-Ziel von 44px. Der Streifen .ef-nachoben am Seitenende bleibt
   daneben bestehen: der eine ist der Notausgang, der andere der Abschluss. */
body:has(.ef-seite) .generate-back-to-top {
  width: 44px;
  height: 44px;
  border: 1px solid var(--ef-linie-dunkel);
  border-radius: var(--ef-r-klein);
  background: var(--ef-navy-tief);
  color: #fff;
  box-shadow: var(--ef-schatten);
  transition: background var(--ef-uebergang), transform var(--ef-uebergang);
}
body:has(.ef-seite) .generate-back-to-top:hover,
body:has(.ef-seite) .generate-back-to-top:focus-visible {
  background: var(--ef-navy);
  color: #fff;
  transform: translateY(-2px);
}
body:has(.ef-seite) .generate-back-to-top:focus-visible {
  outline: 2px solid var(--ef-rot-signal);
  outline-offset: 2px;
}

/* Der graue Streifen zwischen Navigation und Seitenkopf.
   Das Theme polstert .site-content mit 128px oben, und .site traegt
   #f4f6f7 als Grund. Auf den Livesetien stimmt das: dort beginnt der
   Inhalt mit weissem Text auf weiss und braucht Luft unter der klebenden
   Navigation. Jede Refit-Seite beginnt dagegen mit einem vollbreiten
   Band - Seitenkopf oder Auftakt. Die Polsterung stand deshalb als
   128px hoher grauer Kasten zwischen Navigation und dunklem Kopf.

   Unten bleibt die Polsterung stehen: dort endet die Seite mit "Nach
   oben" auf weissem Grund, und ohne Abstand klebt die Zeile am Fuss. */
.site-content:has(.ef-seite) { padding-top: 0; }
/* Und die seitliche dazu. Sie kam auf --ef-rand OBEN DRAUF: auf einem
   390px-Telefon 32px vom Theme plus 28px aus der Bahn, zusammen 120px
   von 390 - knapp ein Drittel des Schirms als Rand. Der Rand der Seite
   ist --ef-rand, und den setzt die Bahn. */
.site-content:has(.ef-seite) { padding-inline: 0; }
/* Unten dasselbe wie oben: 128px grauer Streifen zwischen dem Ende der
   Seite und dem Fuss. Die Seite schliesst mit ihrem eigenen Abschluss. */
.site-content:has(.ef-seite) { padding-bottom: 0; }

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

/* height:auto ist hier kein Beiwerk. WordPress schreibt width- und
   height-Attribute ins Bild ("height=1200"). Eine gesetzte Hoehe schlaegt
   aspect-ratio - ohne diese Zeile wird das Portraet 290 breit und 1200 hoch,
   und der Seitenkopf zwei Bildschirme lang. Steht in :where(), damit
   Bausteine mit fester Groesse (.ef-schluss__person img) gewinnen. */
.ef-seite :where(img, svg) { display: block; max-width: 100%; height: auto; }

/* Ueberschriften: Display-Schrift, ausgeglichener Umbruch, KEINE Trennung.
   Im Bestand stand hyphens:auto auf der H1 - live las man dort
   "Prioritaet-en", "Umsetzbar-keit", "zusammenfin-den".

   ALLE Grundregeln stehen in :where(). Das setzt ihre Spezifitaet auf null,
   damit jede Bausteinklasse sie ueberschreiben kann, ohne !important.
   Ohne :where() gewinnt ".ef-seite p { margin: 0 }" (0,1,1) gegen
   ".ef-lead { margin-top: … }" (0,1,0) - der Vorspann klebte dann an der
   Ueberschrift. Genau so entstehen !important-Ketten. */
.ef-seite :where(h1, h2, h3, h4) {
  font-family: var(--ef-display);
  margin: 0;
  text-wrap: balance;
  color: var(--ef-navy);
  /* Grundzustand: keine Trennung, aber ein zu langes Wort bricht um, statt
     aus dem Bild zu laufen. Ohne overflow-wrap stand auf dem Telefon
     "Transformationsprojek" halb ausserhalb des Schirms. */
  hyphens: none;
  overflow-wrap: break-word;
}

/* Deutsche Komposita brauchen den Trennstrich - aber nur die langen.
   "Prioritaeten" (11) und "Umsetzbarkeit" (13) bleiben ganz, ein Wort ab 15
   Zeichen darf trennen. Genau das war der Livestand-Fehler: dort stand
   hyphens:auto ohne Grenze und trennte "Prioritaet-en".

   Nur wo die Grenze auch durchgesetzt werden kann. Kein @supports-Treffer
   heisst: gar nicht trennen, lieber umbrechen. */
@supports (hyphenate-limit-chars: 15 6 5) {
  .ef-seite :where(h1, h2, h3, h4) {
    hyphens: auto;
    -webkit-hyphens: auto;
    hyphenate-limit-chars: 15 6 5;
  }
}
.ef-seite :where(h1) { font-size: var(--ef-s-h1); line-height: 1.06; letter-spacing: -.03em;  font-weight: 800; }
.ef-seite :where(h2) { font-size: var(--ef-s-h2); line-height: 1.12; letter-spacing: -.026em; font-weight: 800; }
.ef-seite :where(h3) { font-size: var(--ef-s-h3); line-height: 1.28; letter-spacing: -.014em; font-weight: 700; }
.ef-seite :where(h4) { font-size: var(--ef-s-basis); line-height: 1.4; font-weight: 700; }

/* Jeder Absatz haelt die Lesebahn ein, auch ohne .ef-text. Gemessen auf
   der Startseite: 1044px Zeilenlaenge, bei 17px also rund hundert Zeichen.
   Ab etwa fuenfundsiebzig verliert das Auge beim Ruecksprung die Zeile -
   der Text wird nicht falsch, aber anstrengend. In einer Karte oder einer
   Rasterzelle bindet die Regel ohnehin nicht, dort ist die Spalte enger.
   :where(), damit jede Bausteinregel sie ohne Muehe uebersteuern kann. */
.ef-seite :where(p, ul, ol, dl) { max-width: var(--ef-lesebahn); }
.ef-seite :where(p) { margin: 0; }
.ef-seite :where(p + p) { margin-top: 1rem; }
.ef-seite :where(ul, ol) { margin: 0; padding-left: 1.25rem; }
/* Abstand ZWISCHEN den Punkten. Ohne ihn sieht der Zeilenumbruch INNERHALB
   eines Punktes genauso aus wie der Sprung zum naechsten - bei
   zweizeiligen Eintraegen weiss das Auge nicht mehr, wo einer aufhoert.
   Genau das war an der Interim-Seite nicht zu lesen. Raster- und
   Flexlisten bekommen ihren Abstand aus der Fuge; fuer die setzt
   Abschnitt 7c den Aussenrand wieder auf null. */
.ef-seite :where(li + li) { margin-top: .45rem; }

/* Der Textfluss: was auf eine Ueberschrift oder eine Marke folgt, bekommt
   Abstand - unabhaengig davon, ob es eine Klasse traegt.

   Vorher gab es dafuer ZWEI Mechanismen: ein Raster mit gap an .ef-kopfzeile
   und margin-top an einzelnen Bausteinen. Klassenlose Absaetze fielen durch
   beide durch und klebten an der Ueberschrift - auf der Startseite gleich
   dreimal (Person, Ebenenmodell, Fractional CIO).

   (0,1,2) schlaegt die Grundregel :where(p) mit (0,1,0) und jede
   Bausteinklasse mit (0,1,0). */
.ef-seite :is(h3, h4) + :is(p, ul, ol, dl, figure, table, div, details, section) { margin-top: var(--ef-luft-eng); }
/* h1 und h2 fuehren einen Abschnitt an - sie bekommen dasselbe Mass wie in
   der Kopfzeile, damit der Rhythmus nicht von der Form des Markups
   abhaengt. h3 und h4 sind Bausteinueberschriften und bleiben enger. */
.ef-seite :is(h1, h2) + :is(p, ul, ol, dl, figure, table, div, details, section) { margin-top: var(--ef-kopf-luft); }
/* Die Marke gehoert zu ihrer Ueberschrift - sie steht dicht davor. */
.ef-seite .ef-marke + :is(h1, h2, h3, h4) { margin-top: .6rem; }
.ef-seite .ef-kopfzeile + * { margin-top: var(--ef-kopf-luft); }
/* Was nach einer Knopfzeile kommt, braucht Abstand zu ihr - sie ist ein
   Handlungsblock, kein Absatz. Im Auftakt der Startseite stand
   "Lieber direkt sprechen? Kontakt" mit 0px direkt unter dem Knopf und
   die Meta-Zeilen wieder mit 0px darunter: drei Bloecke aufeinander. */
.ef-seite .ef-knopfzeile + * { margin-top: var(--ef-luft-mit); }
.ef-seite .ef-kennung + * { margin-top: var(--ef-luft-eng); }
/* Zwei weitere Luecken aus derselben Familie, gemessen im Profilkopf:
   der Vorspann und der Absatz darunter standen mit 0px aufeinander, und
   die Tafel klebte an der Bildunterschrift des Portraets. Beides sind
   Bloecke, die im Flusswerk keine Regel hatten. */
.ef-seite .ef-lead + * { margin-top: var(--ef-luft-eng); }
.ef-seite .ef-portraet + * { margin-top: var(--ef-luft-mit); }
.ef-seite .ef-kopftafel + * { margin-top: var(--ef-luft-eng); }

/* Und der Fall, den das Flusswerk bisher gar nicht kannte: was nach einem
   BAUSTEIN kommt. Es gab Regeln fuer "Ueberschrift plus Absatz", fuer die
   Kopfzeile und fuer die Knopfzeile - aber ein Absatz hinter einem
   Passungsraster, einer Tabelle oder einem Schaubild stand mit 0px daran.
   Gemessen auf der Strategieseite: der Absatz "Eine Frage kehrt so oft
   wieder…" klebte an der Unterkante der beiden Passungsfelder.

   Absichtlich nur fuer DIREKTE Kinder einer Bahn oder eines Abschnitts.
   Innerhalb einer Karte macht die Fuge den Abstand; griffe die Regel auch
   dort, kaeme sie oben drauf. */
.ef-seite :is(.ef-bahn, .ef-abschnitt) > :is(.ef-passung, .ef-karten, .ef-belege,
    .ef-zahlen, .ef-folge, .ef-verweise, .ef-stationen, .ef-liste, .ef-faecher,
    .ef-tabelle-huelle, .ef-schaubild, .ef-tafel, .ef-kurzgesagt, .ef-explorer,
    .ef-steckbrief, .ef-formular, .ef-mailvorschau, .ef-datenblatt) + * {
  margin-top: var(--ef-luft-mit);
}
/* Innerhalb eines Rasters regelt gap den Abstand - dort keine Raender. */
.ef-seite :is(.ef-karten, .ef-belege, .ef-folge, .ef-zahlen, .ef-passung, .ef-verweise) > * > :is(h1,h2,h3,h4) + * { margin-top: .75rem; }

/* Fokus gilt ueberall, nicht nur im Seitenkopf. Im Bestand war eine
   :focus-visible-Regel nur fuer .ef-kopf definiert; im Seiteninhalt griff
   die Voreinstellung des Browsers, auch auf dunklen Schaltflaechen. */
.ef-seite :where(a, button, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--ef-rot);
  outline-offset: 3px;
  border-radius: 3px;
}
.ef-band--dunkel :where(a, button, summary, [tabindex]):focus-visible,
.ef-abschluss :where(a, button, summary, [tabindex]):focus-visible {
  outline-color: var(--ef-rot-signal);
}

/* Scrollgetriebenes Auftauchen. Der Ruhezustand ist SICHTBAR - ein
   abgebrochener oder nicht unterstuetzter Lauf hinterlaesst nie
   unlesbaren Text. Deshalb beginnt die Kurve bei .4, nicht bei 0. */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .ef-auftauchen {
      animation: ef-auftauchen linear both;
      animation-timeline: view();
      animation-range: entry 2% cover 24%;
    }
    @keyframes ef-auftauchen {
      from { opacity: .4; transform: translateY(16px); }
      to   { opacity: 1;  transform: none; }
    }
  }
}


/* == 3  RAHMEN ============================================================ */

.ef-bahn {
  max-width: var(--ef-bahn);
  margin-inline: auto;
  padding-inline: var(--ef-rand);
}
/* Eine Bahn in einer Bahn polstert ein zweites Mal. Auf der Startseite
   stand der Auftaktinhalt dadurch in 1044 statt 1140 Pixeln - 96px
   schmaler als jeder Abschnitt darunter, sichtbar als Versatz an der
   linken Kante. Statt es im Markup zu suchen, hebt diese Regel jede
   innere Bahn auf: es gibt genau EINE Bahnbreite je Seite. */
:is(.ef-bahn, .ef-seitenkopf__innen, .ef-auftakt__innen) :is(.ef-bahn) {
  max-width: none;
  padding-inline: 0;
}
.ef-bahn--eng { max-width: var(--ef-bahn-eng); }

/* Der Abschnittsrhythmus. EIN Wert fuer alle Seitentypen - im Bestand
   standen sich 52px (Leistungsseiten) und clamp(72-118px) (Startseite,
   Profil) gegenueber, Faktor zwei innerhalb derselben Website. */
.ef-abschnitt { padding-block: var(--ef-luft-weit); }
.ef-abschnitt--knapp { padding-block: var(--ef-luft-mit); }

/* -- Volle Breite --------------------------------------------------------
   Der zweite Befund, den nur die Box zeigen konnte. Das Theme haelt den
   Inhalt in einem Kasten:

       .site         { max-width: 1440px }
       .site-content { padding: 32px }

   Gemessen auf einem 1470px-Schirm: main.ef-seite ist 1376px breit und
   beginnt bei x=47. Jedes dunkle Band hoerte also 47px vor dem Rand auf
   und stand als Kasten im Weiss - auf einem breiten Monitor waechst der
   Rand auf ueber hundert Pixel. Gemeint war eine durchlaufende Flaeche.

   Die beiden Zeilen heben genau das auf: der negative Aussenrand zieht das
   Band auf Fensterbreite, das gleich grosse Innenpolster stellt den Inhalt
   an dieselbe Stelle zurueck. Beide Werte sind exakt invers, die Bahn
   darin bewegt sich deshalb nicht.

   50vw zaehlt die Bildlaufleiste mit, das Band ragt also ein paar Pixel
   ueber den Rand hinaus. Das faengt overflow-x:clip an .ef-seite ab -
   clip und nicht hidden, weil hidden position:sticky bricht.

   Warum nicht der box-shadow-Trick von .ef-voll-links-rechts: der malt nur
   Farbe. Seitenkopf und Auftakt tragen ein Bild (Relief, Hafen), und das
   haette an der Kastenkante aufgehoert. */
.ef-seite :is(.ef-seitenkopf, .ef-auftakt, .ef-abschluss, .ef-band) {
  margin-inline: calc(50% - 50vw);
  padding-inline: calc(50vw - 50%);
}

.ef-band { position: relative; }
.ef-band--grund  { background: var(--ef-grund); }
.ef-band--ton    { background: var(--ef-band); }
.ef-band--dunkel { background: var(--ef-navy-tief); color: var(--ef-auf-dunkel); }
.ef-band--tinte  { background: var(--ef-navy-tinte); color: var(--ef-auf-dunkel); }

.ef-band--dunkel :is(h1, h2, h3, h4),
.ef-band--tinte  :is(h1, h2, h3, h4) { color: #fff; }

/* Feines Raster auf dunklem Grund — die Grammatik der efficas-Bildsprache. */
.ef-band--raster {
  background-image:
    linear-gradient(var(--ef-linie-dunkel) 1px, transparent 1px),
    linear-gradient(90deg, var(--ef-linie-dunkel) 1px, transparent 1px);
  background-size: 56px 56px;
  background-position: center;
}

/* Vollbreiter Grund aus einer Rasterspalte heraus. Braucht overflow-x:clip
   am Seitenrumpf, das steht in Abschnitt 2. */
.ef-voll-links-rechts {
  box-shadow: -100vmax 0 0 currentColor, 100vmax 0 0 currentColor;
}

.ef-ankerversatz { scroll-margin-top: calc(var(--ef-kopf-hoehe) + 16px); }


/* == 4  TEXTBAUSTEINE ===================================================== */

/* Die Marke ueber einer Ueberschrift. Traegt Weinrot - das ist der Ort, an
   dem der Akzent auf hellem Grund vorkommt. */
.ef-marke {
  font-family: var(--ef-body);
  font-size: var(--ef-s-mikro);
  font-weight: 700;
  letter-spacing: .15em;
  text-transform: uppercase;
  color: var(--ef-rot);
  display: inline-flex;
  align-items: center;
  gap: .7rem;
  margin: 0;
}
.ef-marke::before {
  content: "";
  width: 1.5rem;
  height: 2px;
  background: currentColor;
  flex: none;
}
.ef-marke--schlicht::before { display: none; }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-marke { color: var(--ef-rot-signal); }

/* EINE Regel fuer alle Ueberschriftenbreiten, statt drei Sonderfaelle mit
   16ch, 19ch und 28ch, die sich gegenseitig geschlagen haben.

   24ch klingt schmal, ist es aber nicht: In Plus Jakarta misst ein "ch" bei
   dieser Groesse rund 0,7em, eine Zeile fasst also etwa 33 Zeichen. Eine
   96 Zeichen lange Ueberschrift steht damit in drei Zeilen - vorher waren es
   bei 16ch sieben.

   Der Vorspann bleibt schmaler: er wird gelesen, nicht ueberflogen. */
/* Die Kopfzeile ist ein Stapel, kein Block. Im Bestand steht sie oft als
   zwei Kaesten - Marke und Ueberschrift im ersten, der Text im zweiten.
   Als display:block hatten die beiden keinen Abstand voneinander: der
   Absatz klebte an der Unterkante der H2. Die Flussregeln greifen dort
   nicht, weil Ueberschrift und Absatz nicht Geschwister sind.
   Als Raster macht die Fuge den Abstand - einmal, fuer alle Faelle. */
/* Rhythmus statt gleicher Abstaende. Gemessen war im Bestand:
       Marke -> Ueberschrift   20px
       Ueberschrift -> Text    20px
   Alles gleich weit, also gruppiert sich nichts - das Auge kann nicht
   sehen, dass die Marke ZUR Ueberschrift gehoert und der Absatz eine neue
   Stimme ist. Naehe bedeutet Zusammengehoeren; das ist das aelteste
   Mittel der Typografie und hier lag es brach.

   Jetzt: die Marke sitzt dicht an ihrer Ueberschrift, und was nach der
   Ueberschrift kommt, bekommt die mittlere Stufe. */
.ef-kopfzeile { max-width: none; display: grid; gap: .6rem; }
/* .ef-seite davor, damit die Regel ueber der allgemeinen Flussregel
   ".ef-seite :is(h1,h2,h3,h4) + :is(p, ul, …)" (0,1,2) liegt. Ohne das
   entschied die Form des Markups ueber den Abstand: 30px, wo Ueberschrift
   und Text Geschwister sind, 44px, wo die Ueberschrift in einem Kasten
   steckt. Dieselbe Figur mit zwei Rhythmen - genau das, was auf allen
   Seiten gleich sein soll. */
.ef-seite .ef-kopfzeile > :is(h1, h2, h3, h4) + *,
.ef-seite .ef-kopfzeile > div:has(> :is(h1, h2, h3, h4)) + * { margin-top: var(--ef-luft-mit); }
/* Steht die Marke DIREKT in der Kopfzeile, macht die Fuge den Abstand
   schon - der Aussenrand aus dem Flusswerk kaeme oben drauf. Gemessen auf
   der Startseite: 19px statt der gewollten 10. */
.ef-kopfzeile > .ef-marke + :is(h1, h2, h3, h4) { margin-top: 0; }
/* Ein Abschnittskopf, der aus dem Seitenkopf herausgewandert ist, bringt
   die Klassen von dort mit: eine .ef-tafel__titel als Beschriftung und ein
   nacktes <span> als Zeile darunter. Auf hellem Grund stehen die beiden
   dann als zwei gleich leise Zeilen ueber dem Raster und sagen nichts.
   Hier bekommen sie die Rollen, die sie im Abschnittskopf haben: Marke
   und Aussage. Das ist Gestaltung, keine Inhaltsaenderung - im Markup
   bleibt jedes Wort, wo es steht. */
.ef-kopfzeile > .ef-tafel__titel {
  font-family: var(--ef-body);
  font-size: var(--ef-s-mikro);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--ef-rot);
}
.ef-kopfzeile > span:not([class]) {
  font-family: var(--ef-display);
  font-size: var(--ef-s-h3);
  font-weight: 700;
  line-height: 1.3;
  color: var(--ef-navy);
  max-width: 32ch;
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-kopfzeile > span:not([class]) { color: #fff; }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-kopfzeile > .ef-tafel__titel { color: var(--ef-rot-signal); }
.ef-seite :where(h1, h2) { max-width: 24ch; }
.ef-seite :where(h3) { max-width: 32ch; }
.ef-seite .ef-lead   { max-width: 58ch; }

/* Die Frage, auf die ein Abschnitt antwortet. Sie stand im Bestand als
   letzter Satz eines Absatzes und ging dort unter - obwohl zwei Bloecke
   weiter ein "Nein." darauf antwortet. Sie traegt deshalb die
   Anzeigeschrift und die Farbe der Ueberschriften: laut genug, um als
   Frage gelesen zu werden, leise genug, um keine zweite H2 zu sein. */
.ef-frage {
  font-family: var(--ef-display);
  font-size: var(--ef-s-lead);
  font-weight: 700;
  line-height: 1.4;
  color: var(--ef-navy);
  max-width: 46ch;
  text-wrap: balance;
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-frage { color: #fff; }

.ef-lead {
  font-size: var(--ef-s-lead);
  line-height: 1.55;
  color: var(--ef-text-leise);
  max-width: 52ch;
  margin-top: var(--ef-luft-eng);
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-lead { color: var(--ef-auf-dunkel-leise); }

.ef-text { color: var(--ef-text-leise); max-width: var(--ef-lesebahn); }
.ef-text--eng { max-width: 54ch; }

/* Dunkle Zusammenhaenge an EINER Stelle.
   Vorher trugen .ef-text und .ef-kennung im dunklen Seitenkopf weiter die
   Textfarbe fuer hellen Grund - #4e6272 auf beinahe Schwarz, praktisch
   unlesbar. Jede Flaeche, die dunkel wird, muss ihre Textfarben mitbringen;
   sonst faellt genau der Fliesstext durch, der nicht in einem eigenen
   Baustein steckt. */
/* Ein Selektor fuer alles, was Text traegt - statt einer Liste von
   Bausteinen, die zwangslaeufig unvollstaendig bleibt. Beim ersten Anlauf
   standen genau die Bausteine ohne Eintrag in Navy auf Navy: ein Zitat bei
   1,6:1, ein Verweis bei 1,6:1, eine Zeile ohne Klasse bei 1,22:1.
   (0,1,1) schlaegt jede Bausteinklasse mit (0,1,0). */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(p, li, span, dd, dt, figcaption, small, blockquote, div) { color: var(--ef-auf-dunkel-leise); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(strong, b, .ef-beleg__wert, .ef-verweis__titel, .ef-schluss__name, .ef-zitat) { color: #fff; }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-kennung, .ef-beleg__marke, .ef-fall__meta) { color: #8fa8bc; }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-marke, .ef-fall__marke, .ef-stufe__nr, .ef-station__zeit) { color: var(--ef-rot-signal); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-link { color: #fff; border-bottom-color: var(--ef-rot-signal); }

/* Helle Inseln auf dunklem Grund holen die helle Textwelt zurueck.
   Eine weisse Tafel oder Tabelle in einem dunklen Band braucht wieder
   dunklen Text - sonst kehrt sich die Regel oben gegen sie. */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-tabelle-huelle, .ef-fall, .ef-datenblatt__rumpf) :is(p, li, span, dd, dt, div, blockquote) { color: var(--ef-text-leise); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-tabelle-huelle, .ef-fall, .ef-datenblatt__rumpf) :is(h1, h2, h3, h4, strong, b) { color: var(--ef-navy); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-tabelle-huelle, .ef-fall, .ef-datenblatt__rumpf) .ef-link { color: var(--ef-navy); border-bottom-color: var(--ef-rot); }
/* Der Tabellenkopf bleibt dunkel mit weisser Schrift. */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-abschluss) .ef-tabelle thead :is(th, a) { color: #fff; }

/* Eine Kennung als Liste ist eine Kette von Angaben, kein Stapel von
   Punkten. Im Auftakt standen "Hamburg & Norddeutschland", "Interim ·
   Projektleitung · Beratung" und "Vor-Ort-faehig & seniorig" als drei
   Zeilen untereinander in Versalien - das las sich wie ein Restposten
   unter dem Knopf statt wie eine Zeile Eckdaten. */
ul.ef-kennung, ol.ef-kennung {
  display: flex; flex-wrap: wrap; gap: .4rem 1.25rem;
  list-style: none; padding-left: 0;
  /* Kein Fliesstext, also keine Lesebahn. Die Grundregel fuer Absaetze
     und Listen kappt bei 68ch - im Profilkopf zwang das die drei
     Eckdaten auf VIER Zeilen, obwohl die Spalte 804px breit ist. */
  max-width: none;
}
ul.ef-kennung > li::marker { content: none; }

/* -- Hinweis: eine Randbemerkung mit Akzentstrich -------------------------
   Nicht zu verwechseln mit .ef-zitat. Ein Zitat ist ein SATZ, den jemand
   gesagt hat - Anzeigeschrift, Navy, gross genug zum Stehenbleiben. Ein
   Hinweis ist eine Einschraenkung oder eine Fussnote im Fluss: bis zu
   einem halben Absatz, Fliesstext, leiser Ton.

   Beim Umbau des Lagebilds sind SECHS Hinweise faelschlich als Zitate
   gelandet - die Klassenkarte fuehrte efl-note auf ef-zitat. Einer davon
   war 634 Zeichen lang und stand als fuenfzehn Zeilen Anzeigeschrift in
   Navy da. Anzeigeschrift traegt einen Satz, keinen Absatz. */
.ef-hinweis {
  margin-top: var(--ef-luft-mit);
  padding-left: 1.15rem;
  border-left: 3px solid var(--ef-rot);
  font-family: var(--ef-body);
  font-size: var(--ef-s-klein);
  font-weight: 400;
  line-height: 1.65;
  color: var(--ef-text-leise);
  max-width: var(--ef-lesebahn);
}
.ef-hinweis > :is(strong, b):first-child { color: var(--ef-navy); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-hinweis {
  border-left-color: var(--ef-rot-signal);
  color: var(--ef-auf-dunkel-leise);
}

/* Kennung: eine kurze Kennzeile - "8 Erhebungsfelder · 3 Sichten", "Mo–Fr,
   11–19 Uhr". Bis zum 10.09.2026 trugen auch ganze Saetze diese Klasse
   ("Typische Umfelder sind Maschinenbau, Fertigungsindustrie, …", 188
   Zeichen) und standen in 13px Versalien. Solche Saetze heissen jetzt
   .ef-notiz und werden als Text gesetzt. */
.ef-notiz {
  font-size: var(--ef-s-klein);
  line-height: 1.55;
  color: var(--ef-text-leise);
  margin: 0;
  max-width: var(--ef-lesebahn);
}
.ef-seite .ef-notiz + * { margin-top: var(--ef-luft-eng); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-notiz { color: var(--ef-auf-dunkel-leise); }
.ef-kennung {
  font-family: var(--ef-body);
  font-size: var(--ef-s-mikro);
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--ef-text-schwach);
  margin: 0;
}

/* 13px ist der Boden. <small> setzt sonst auf 0.8em herunter - im Auftakt
   der Startseite stand der Hinweis "Scrollen" dadurch auf 10px. Was zu
   klein zum Lesen ist, ist entweder ueberfluessig oder falsch gesetzt. */
.ef-seite :where(small) { font-size: var(--ef-s-mikro); }

/* Hervorhebung im Fliesstext. Vorher: Gewicht 700 in derselben Farbe wie
   der Absatz. Ueber einen halben Satz gelegt ergibt das einen Klotz -
   "optisch ein wenig schwierig", wie Jonas es nannte. Emphase gehoert
   ueber die Farbe: dunklere Tinte bei 600 statt gleicher Ton bei 700.
   Das hebt genauso deutlich und traegt auch ueber mehrere Zeilen. */
.ef-seite :where(strong, b) { font-weight: 600; color: var(--ef-text); }
/* Bauteile mit eigener dunkler Flaeche stehen NICHT in der kanonischen
   Bandliste - die Regel oben hat ihnen deshalb dunkle Tinte auf Navy
   gegeben. Gemessen auf dem Lagebild: "Standard" bei 1,43:1. */
:is(.ef-explorer__ergebnis-kopf, .ef-explorer__befund, .ef-datenblatt__kopf,
    .ef-tabelle thead) :is(strong, b) { color: inherit; }

.ef-seite :where(a) { color: inherit; text-decoration-color: var(--ef-rot); text-underline-offset: 2px; }
.ef-link {
  color: var(--ef-navy);
  font-weight: 600;
  text-decoration: none;
  border-bottom: 1px solid var(--ef-rot);
  padding-bottom: 1px;
  transition: color var(--ef-uebergang);
}
.ef-link:hover { color: var(--ef-rot); }
/* Eigenstaendige Handlung statt Verweis im Fliesstext: braucht ein Tap-Ziel.
   Links MITTEN im Text sind davon ausgenommen - WCAG 2.5.8 nimmt sie aus. */
.ef-link--eigen { display: inline-flex; align-items: center; min-height: 44px; }



/* == 5  BAUSTEINE ========================================================= */

/* -- Knopf ---------------------------------------------------------------
   min-height 46px: im Bestand lagen 17 von 40 Tap-Zielen unter 44px. */
.ef-knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .55rem;
  min-height: 46px;
  padding: .75rem 1.25rem;
  font-family: var(--ef-body);
  font-size: var(--ef-s-klein);
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  border: 1px solid transparent;
  border-radius: var(--ef-r-klein);
  cursor: pointer;
  transition: background var(--ef-uebergang), color var(--ef-uebergang),
              border-color var(--ef-uebergang), transform var(--ef-uebergang);
}
.ef-knopf:hover { transform: translateY(-1px); }
.ef-knopf--voll   { background: var(--ef-rot); color: #fff; }
.ef-knopf--voll:hover { background: #6b2734; }
.ef-knopf--linie  { border-color: var(--ef-linie); color: var(--ef-navy); background: var(--ef-flaeche); }
.ef-knopf--linie:hover { border-color: var(--ef-navy); background: var(--ef-grund-2); }
/* Auf dunklem Grund dreht der Linienknopf selbst um. Vorher musste beim
   Umstellen entschieden werden, ob ein Knopf --linie oder --hell bekommt -
   und auf der Startseite landeten helle Knoepfe auf hellem Band: 1:1. */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-knopf--linie { border-color: rgba(255,255,255,.34); color: #fff; background: transparent; }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-knopf--linie:hover { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.62); }
.ef-knopf--hell   { border-color: rgba(255,255,255,.34); color: #fff; }
.ef-knopf--hell:hover { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.62); }
/* Ein .ef-knopf ohne Spielart war unsichtbar: die Grundregel setzt bewusst
   nur Form und Groesse, Farbe kommt aus --voll oder --linie. Auf dem Profil
   stand deshalb "Zum Schnell-Check" als blanker Text ohne Flaeche und ohne
   Rand. Statt die Stelle im Inhalt zu flicken, faellt der Knopf hier auf die
   Linienform zurueck - kein Knopf soll je aussehen wie kein Knopf. */
.ef-knopf:not([class*="ef-knopf--"]) {
  border-color: var(--ef-linie); color: var(--ef-navy); background: var(--ef-flaeche);
}
.ef-knopf:not([class*="ef-knopf--"]):hover { border-color: var(--ef-navy); background: var(--ef-grund-2); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-knopf:not([class*="ef-knopf--"]) { border-color: rgba(255,255,255,.34); color: #fff; background: transparent; }

.ef-knopfzeile { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: var(--ef-luft-mit); }

/* -- Karte ---------------------------------------------------------------
   Rahmen, Flaeche, Radius und Schatten sagen jeweils "eigenstaendiges
   Objekt". Im Bestand trugen 23 bis 45 Elemente je Seite alle vier
   Merkmale - dadurch sagte keines mehr etwas. Karten sind hier fuer die
   Faelle reserviert, in denen wirklich gleichrangige Objekte nebeneinander
   stehen. Fuer Aufzaehlungen gibt es .ef-liste. */
/* Die Spaltenzahl richtet sich nach der Anzahl der Karten, nicht nach einer
   Klasse, die jemand setzen muss. Vier Karten in einem Dreierraster lassen
   die vierte allein in der zweiten Reihe stehen - genau das stand vorher auf
   der Strategieseite. Die --2/--3/--4 bleiben als Handsteuerung. */
.ef-karten > .ef-belege { grid-column: 1 / -1; } /* vier Zellen in einer halben Karte: 129px je Zelle (Projektleitung) */
.ef-karten {
  display: grid;
  gap: 1rem;
  margin-top: var(--ef-luft-mit);
}
@media (min-width: 700px) {
  .ef-karten { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 900px) {
  .ef-karten { grid-template-columns: repeat(3, 1fr); }
  /* genau zwei, genau vier: paarweise. Sonst bleibt eine Karte allein. */
  .ef-karten:has(> :nth-child(2):last-child),
  .ef-karten:has(> :nth-child(4):last-child) { grid-template-columns: repeat(2, 1fr); }
  /* Ein Kennzahlenblock zaehlt beim Abzaehlen nicht mit - er spannt ohnehin
     die ganze Breite. Auf der Projektleitung galt das Raster deshalb als
     Viererraster, schaltete auf zwei Spalten, und die dritte Karte stand
     allein neben 514px Nichts (11.09.2026). */
  .ef-karten:has(> .ef-belege):has(> :nth-child(4):last-child) { grid-template-columns: repeat(3, 1fr); }
}
@media (min-width: 1080px) {
  .ef-karten:has(> :nth-child(8):last-child) { grid-template-columns: repeat(4, 1fr); }
}
/* Eine Karte, die als einzige in der letzten Reihe steht, legt sich ueber
   die volle Breite und schliesst den Block - statt allein neben einer
   Luecke zu haengen. Zweimal gesehen: fuenf Fragen im Zweispalter, sieben
   im Dreispalter.

   Es gibt dafuer keine allgemeine Regel in CSS - ein Raster kennt seine
   Kinderzahl nicht. Deshalb die Faelle, die wirklich vorkommen, einzeln:
   im Zweispalter jede ungerade Anzahl, im Dreispalter die Anzahlen, bei
   denen eins uebrig bleibt (7, 10, 13).

   Der Fliesstext darin bleibt auf seiner Lesebahn - die Karte wird
   breiter, nicht die Zeile. */
@media (min-width: 700px) and (max-width: 899.98px) {
  .ef-karten:has(> :nth-child(odd):last-child) > :last-child { grid-column: 1 / -1; }
}
@media (min-width: 700px) {
  .ef-karten--2:has(> :nth-child(odd):last-child) > :last-child { grid-column: 1 / -1; }
}
@media (min-width: 900px) {
  .ef-karten:has(> :nth-child(7):last-child)  > :last-child,
  .ef-karten:has(> :nth-child(10):last-child) > :last-child,
  .ef-karten:has(> :nth-child(13):last-child) > :last-child { grid-column: 1 / -1; }
  /* Der Vierspalter ab 1080px hat seine eigene Rechnung - dort bleibt bei
     acht Karten nichts uebrig. */
  .ef-karten--2:has(> :nth-child(7):last-child) > :last-child { grid-column: 1 / -1; }
}
@media (min-width: 700px)  { .ef-karten.ef-karten--2 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px)  { .ef-karten.ef-karten--3 { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1000px) { .ef-karten.ef-karten--4 { grid-template-columns: repeat(4, 1fr); } }

.ef-karte {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: var(--ef-luft-eng);
  background: var(--ef-flaeche);
  /* --ef-linie-fein steht auf Weiss bei rund 1,1:1 - eine Kante, die man
     nur sieht, wenn man weiss, dass sie da ist. Karten sind eigene
     Objekte, also bekommen sie die traegere Linie. */
  border: 1px solid var(--ef-linie);
  border-radius: var(--ef-r);
  overflow: hidden;
  transition: box-shadow var(--ef-uebergang), transform var(--ef-uebergang),
              border-color var(--ef-uebergang);
}
.ef-karte::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 2px;
  background: var(--ef-rot);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 320ms cubic-bezier(.4, 0, .2, 1);
}
.ef-karte:hover { box-shadow: var(--ef-schatten); transform: translateY(-3px); border-color: var(--ef-linie); }
.ef-karte:hover::before { transform: scaleX(1); }
.ef-karte--ruhig::before { display: none; }
.ef-karte--ruhig:hover { transform: none; box-shadow: none; }
/* Ein Vorspann in einer Karte ist kein Vorspann mehr, sondern Kartentext.
   Sonst steht 19px-Schrift in einem 500px breiten Kasten neben einer
   21px-Ueberschrift und die Karte hat keine Rangfolge mehr. */
.ef-karte .ef-lead { font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-text-leise); max-width: none; }
/* Eine Karte, die aus der Reihe heraussteht - der empfohlene Zuschnitt,
   der aktuelle Meilenstein. Genau EINE je Reihe, sonst hebt sich nichts
   mehr ab. Der Unterschied liegt in Rand und Flaeche, nicht in der
   Schriftgroesse: die Reihe soll noch als Reihe lesbar bleiben. */
.ef-karte--hervor { border-color: var(--ef-rot); background: var(--ef-rot-flaeche); }
.ef-karte--hervor::before { background: var(--ef-rot); }

/* Ein Betrag. Steht in der Anzeigeschrift und mit Tabellenziffern, damit
   Zahlen untereinander auf einer Achse liegen. */
.ef-betrag {
  display: block; font-family: var(--ef-display); font-size: var(--ef-s-h3);
  font-weight: 700; line-height: 1.2; color: var(--ef-navy);
  font-variant-numeric: tabular-nums;
}
.ef-betrag > small { display: block; font-family: var(--ef-body); font-size: var(--ef-s-mikro); font-weight: 400; color: var(--ef-text-leise); margin-top: .2rem; }

/* -- Datenblatt ---------------------------------------------------------
   Ein ausgefuelltes Musterexemplar: dunkle Kopfleiste, Wertepaare im
   Rumpf, eine Einordnung im Fuss. Anders als .ef-tafel ist es kein
   Einschub im Text, sondern ein Dokument im Dokument - deshalb die
   Kopfleiste. */
.ef-datenblatt {
  border: 1px solid var(--ef-linie); border-radius: var(--ef-r);
  background: var(--ef-flaeche); box-shadow: var(--ef-schatten); overflow: hidden;
}
.ef-datenblatt__kopf {
  background: var(--ef-navy); color: #fff; padding: .95rem 1.15rem;
  display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; flex-wrap: wrap;
}
.ef-datenblatt__kopf b { font-family: var(--ef-display); font-size: var(--ef-s-klein); font-weight: 700; }
.ef-datenblatt__kopf span { font-size: var(--ef-s-mikro); color: var(--ef-auf-dunkel-leise); letter-spacing: .07em; text-transform: uppercase; }
/* Der Rumpf ist eine helle Insel: steht das Datenblatt im dunklen
   Seitenkopf, erbt sein Inhalt sonst die Aufhellungsfarben und laeuft auf
   weissem Grund bei 2,9:1. Deshalb ist .ef-datenblatt__rumpf oben in der
   Inselliste eingetragen - zusammen mit Tabelle und Fallbeispiel. */
.ef-datenblatt__rumpf { padding: .4rem 1.15rem 1.15rem; }
/* Der Steckbrief im Datenblatt braucht die HELLE Fassung.
   Im Seitenkopf wird er sonst zum dunklen Fugenraster umgebaut:
       .ef-seitenkopf .ef-steckbrief     { gap:1px; background: weiss/16% }
       .ef-seitenkopf .ef-steckbrief > * { background: rgba(6,18,30,.55) }
   Das ist auf dunklem Grund richtig. Im Datenblatt liegt es aber auf
   Weiss - dort werden aus den durchscheinenden Zellen graue Balken und
   aus den hellen Fugen unsichtbare Linien. Genau der graue Block, den
   Jonas gesehen hat.

   Hier also zurueck zur Grundfigur: weisse Zeilen, feine Trennlinien.
   Ein .ef-seite davor, damit die Spezifitaet ueber der Kopfregel liegt
   und nicht die Reihenfolge in der Datei entscheidet. */
.ef-seite .ef-datenblatt__rumpf .ef-steckbrief {
  gap: 0;
  background: none;
  border: 0;
  border-top: 1px solid var(--ef-linie);
  margin-top: 0;
}
.ef-seite .ef-datenblatt__rumpf .ef-steckbrief > * {
  background: none;
  padding: .8rem 0;
  border-bottom: 1px solid var(--ef-linie-fein);
}
.ef-seite .ef-datenblatt__rumpf .ef-steckbrief > :last-child { border-bottom: 0; }
/* Auf dem Handy stapelten sieben Paare zu 534px im Seitenkopf - der Kopf
   des Lagebilds war 1.911px hoch, zwei Bildschirme, bevor Inhalt kam.
   Bezeichner links, Wert rechts: eine Zeile je Paar. */
@media (max-width: 699px) {
  .ef-seite .ef-datenblatt__rumpf .ef-steckbrief > div {
    display: grid; grid-template-columns: minmax(0, 42%) minmax(0, 1fr);
    column-gap: .75rem; align-items: baseline; padding: .55rem 0;
  }
  .ef-seite .ef-datenblatt__rumpf .ef-steckbrief > div > :is(dt, dd) { margin: 0; }
}
/* Der Rumpf ist eine helle Insel im dunklen Seitenkopf. Die Insel-Regeln
   in Abschnitt 4 reichen hier nicht: .ef-seitenkopf .ef-steckbrief dt
   liegt bei derselben Spezifitaet (0,2,1) und steht spaeter in der Datei -
   bei Gleichstand gewinnt die letzte. Statt den Block ans Dateiende zu
   schieben und damit die Reihenfolge zur stillen Bedingung zu machen,
   traegt er ein .ef-seite davor: (0,3,1) gewinnt, egal wo er steht.
   Gemessen waren es 2,94:1 fuer die Bezeichner und 1,24:1 fuer die
   Werte - beides auf Weiss. */
.ef-seite :is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) :is(.ef-datenblatt__rumpf, .ef-datenblatt__fuss) :is(p, li, span, dd, div) { color: var(--ef-text-leise); }
.ef-seite :is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) :is(.ef-datenblatt__rumpf, .ef-datenblatt__fuss) :is(dt, strong, b, h3, h4) { color: var(--ef-navy); }
.ef-seite :is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-datenblatt__fuss { color: var(--ef-text-leise); }
.ef-datenblatt__fuss {
  padding: .9rem 1.15rem; background: var(--ef-rot-flaeche);
  border-top: 1px solid rgba(126, 47, 61, .16);
  font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-text-leise);
}
/* Beitragsbild einer Karte. Sitzt VOR dem Polster, damit es bis an die
   Kanten laeuft - deshalb die negativen Raender.
   Achtung beim Befuellen: Die sechzehn Schaubilder aus grafiken/ sind hier
   das falsche Format. Sie sind 700 Einheiten breit und beschriftet; auf
   Kartenbreite faellt ihre Beschriftung auf rund 5px. Die CI kennt dafuer
   eine eigene Form - Beitragsbild dunkel und unbeschriftet. */
.ef-karte__bild {
  margin: calc(var(--ef-luft-eng) * -1) calc(var(--ef-luft-eng) * -1) 0;
  background: var(--ef-grund-2);
}
.ef-karte__bild img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }

.ef-karte__marke { font-size: var(--ef-s-mikro); font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--ef-text-schwach); }
.ef-karte__text  { font-size: var(--ef-s-klein); color: var(--ef-text-leise); }
.ef-karte__mehr  { margin-top: auto; align-self: flex-start; display: inline-flex; align-items: center; min-height: 44px; }
/* Der Weiterverweis sinkt auf den Kartenboden, damit die Links einer
   Reihe auf einer Hoehe stehen. Die Karte ist eine Flexspalte, also
   erledigt margin-top:auto das - aber nur an dem Element, das WIRKLICH
   Flexkind ist. Im Bestand steckt der Link in einem <div>, und die
   Regel oben sass am <a> darin: sie schob den Link innerhalb seines
   Kaestchens nach unten und das Kaestchen blieb, wo der Text aufhoerte.
   Deshalb hier das Kaestchen selbst - und nur, wenn wirklich ein
   Verweis drin steckt. Eine Karte, die mit ihrem Text endet, soll den
   Text nicht an den Boden schieben und eine Luecke in der Mitte lassen. */
.ef-karte > :last-child:has(.ef-karte__mehr) { margin-top: auto; }

:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-karte { background: var(--ef-navy-tief); border-color: var(--ef-linie-dunkel); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-karte__text { color: var(--ef-auf-dunkel-leise); }

/* -- Tafel: ein hervorgehobener Block, kein Raster ---------------------- */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-abschluss) .ef-tafel {
  background: rgba(255, 255, 255, .05);
  border-color: var(--ef-linie-dunkel);
  border-left-color: var(--ef-rot-signal);
}
/* Eine Tafel ist eine HERVORHEBUNG - sie muss sich von der Seite abheben.
   Bis zum 10.09.2026 war sie weiss auf weiss mit einer Haarlinie und
   einem roten Strich links, ohne Rundung. Auf der Portfolio-Seite trug
   genau so eine Tafel das Ergebnis des Formats - also das, wofuer der
   Kunde zahlt - und Jonas' Urteil war: "geht total unter". Zu Recht: ein
   Randstrich ist die Form einer Fussnote, nicht die eines Ergebnisses.

   Jetzt getoente Flaeche, Hausradius, dasselbe Polster wie eine Karte.
   Der rote Strich bleibt - er sagt weiterhin, wo der Block anfaengt. */
.ef-tafel {
  margin-top: var(--ef-luft-mit);
  padding: var(--ef-luft-eng) var(--ef-luft-mit);
  border: 1px solid var(--ef-linie);
  border-left: 3px solid var(--ef-rot);
  border-radius: var(--ef-r);
  background: var(--ef-grund);
}
/* Ein Tafeltitel ist eine Ueberschrift, auch wenn er im Bestand als <p>
   steht. Ohne Rang las sich "Verantwortung im Mandat" wie der erste
   Listenpunkt: gleiche Groesse, gleiche Staerke, gleiche Farbe. */
.ef-tafel__titel {
  margin-top: .75rem;
  font-family: var(--ef-display);
  font-size: var(--ef-s-basis);
  font-weight: 700;
  line-height: 1.35;
  color: var(--ef-navy);
}
.ef-tafel > .ef-tafel__titel:first-child { margin-top: 0; }
/* Eine Tafel IN einer Karte ist keine zweite Tafel, sondern eine Zeile.
   Im Kopf der Projektleitungsseite sass eine 115px hohe Tafel mit 36px
   Polsterung in einer Karte - fuer einen einzigen Verweis auf ein PDF.
   Kasten im Kasten im Band. Hier wird sie flach: der Akzentstrich bleibt,
   das Gehaeuse verschwindet. */
.ef-karte > .ef-tafel,
.ef-passung__feld > .ef-tafel {
  margin-top: var(--ef-luft-eng);
  padding: .2rem 0 .2rem 1rem;
  border: 0;
  border-left: 3px solid var(--ef-rot);
  border-radius: 0;
  background: none;
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-karte > .ef-tafel { background: none; border-left-color: var(--ef-rot-signal); }

/* Eine Tafel, in der ein Download steckt, ist ein Knopf und kein Einschub.
   Im Bestand liegen dort ZWEI Verweise auf dieselbe PDF - einer mit dem
   Text, einer mit dem Pfeilzeichen und dem download-Attribut. Untereinander
   gestapelt hinter einem Akzentstrich sah das aus wie ein Zitat, unter dem
   jemand ein Symbol vergessen hat. Nebeneinander in einem Rahmen ist es
   das, was es ist: eine Handlung.

   Sie steht nicht auf voller Kartenbreite - ein Knopf ist so breit wie
   seine Beschriftung, sonst wird aus der Handlung eine Flaeche. */
.ef-karte > .ef-tafel:has(a[download]),
.ef-tafel:has(> a[download]) {
  display: inline-flex; align-items: center; gap: .5rem;
  align-self: flex-start;
  min-height: 46px;
  margin-top: var(--ef-luft-eng);
  padding: .6rem 1rem;
  border: 1px solid var(--ef-linie);
  border-left-width: 1px;
  border-radius: var(--ef-r-klein);
  background: var(--ef-flaeche);
  transition: border-color var(--ef-uebergang), background var(--ef-uebergang);
}
.ef-tafel:has(> a[download]) .ef-link { border-bottom: 0; font-weight: 600; }
.ef-tafel:has(> a[download]) a[download] { display: inline-flex; align-items: center; color: var(--ef-rot); }
.ef-tafel:has(> a[download]):hover { border-color: var(--ef-navy); background: var(--ef-grund-2); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-tafel:has(> a[download]) {
  border-color: var(--ef-linie-dunkel); background: rgba(255, 255, 255, .06);
}
/* Auf dunklem Grund dreht die Tafel mit, statt als weisser Kasten
   stehenzubleiben. Im Seitenkopf der Projektleitung sass eine Tafel mit
   vierzig Zeichen Inhalt als leuchtender Block im dunklen Auftakt - sie
   las sich wie etwas, das da vergessen wurde.

   Tabelle und Fallbeispiel bleiben helle Inseln: die tragen Daten, und
   Zahlenkolonnen wollen weissen Grund. Eine Tafel ist ein Einschub im
   Text und gehoert in die Farbwelt ihres Bandes. */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-tafel {
  background: rgba(255, 255, 255, .055);
  border-color: var(--ef-linie-dunkel);
  border-left-color: var(--ef-rot-signal);
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-tafel :is(h1, h2, h3, h4, strong, b, .ef-tafel__titel) { color: #fff; }


/* -- Liste: der Ersatz fuer Karten bei Aufzaehlungen -------------------- */
.ef-liste { margin-top: var(--ef-luft-mit); border-top: 1px solid var(--ef-linie); }
.ef-liste__eintrag {
  display: grid;
  gap: .4rem 2.5rem;
  padding: var(--ef-luft-eng) 0;
  border-bottom: 1px solid var(--ef-linie-fein);
}
@media (min-width: 800px) {
  .ef-liste__eintrag { grid-template-columns: minmax(0, 21rem) 1fr; align-items: baseline; }
}
.ef-liste__eintrag > :is(h2, h3, h4) { font-size: var(--ef-s-basis); font-weight: 700; line-height: 1.4; letter-spacing: -.005em; color: var(--ef-text); }
.ef-liste__eintrag > :is(p, div:not(:first-child)) { font-size: var(--ef-s-klein); color: var(--ef-text-leise); }

/* -- Aufzaehlung mit Signalstrich --------------------------------------- */
.ef-punkte { margin: 0; padding: 0; list-style: none; display: grid; gap: .6rem; }
.ef-punkte > * {
  position: relative;
  padding-left: 1.1rem;
  font-size: var(--ef-s-klein);
  line-height: 1.5;
  color: var(--ef-text-leise);
}
.ef-punkte > *::before {
  content: "";
  position: absolute;
  left: 0;
  top: .66em;
  width: 7px;
  height: 1px;
  background: var(--ef-rot);
  opacity: .7;
}

/* -- Tabelle -------------------------------------------------------------
   Der Kopf traegt EINE Behandlung fuer alle Wertspalten. Im Bestand standen
   dort vier Zellen in vier Behandlungen, und zwei Spaltentitel waren als
   Links in #7e2f3d auf #153b5b gesetzt - Kontrast 1,31:1, praktisch
   unlesbar (Befund G-05). */
.ef-tabelle-huelle { margin-top: var(--ef-luft-mit); border: 1px solid var(--ef-linie); background: var(--ef-flaeche); }
.ef-tabelle { width: 100%; border-collapse: collapse; font-size: var(--ef-s-klein); font-variant-numeric: tabular-nums; }
.ef-tabelle thead th {
  background: var(--ef-navy);
  color: #fff;
  text-align: left;
  vertical-align: bottom;
  padding: 1.15rem 1.25rem;
  font-family: var(--ef-display);
  font-weight: 700;
  font-size: var(--ef-s-klein);
  line-height: 1.3;
  letter-spacing: -.008em;
  border-left: 1px solid var(--ef-linie-dunkel);
}
.ef-tabelle thead th a { color: #fff; text-decoration: none; display: inline-flex; align-items: center; min-height: 44px; }
.ef-tabelle thead th a::after { content: " \2192"; color: var(--ef-rot-signal); }
.ef-tabelle thead th:first-child {
  background: var(--ef-navy-tinte);
  border-left: 0;
  font-family: var(--ef-mono);
  font-weight: 600;
  font-size: var(--ef-s-mikro);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ef-auf-dunkel-leise);
}
.ef-tabelle thead th.ef-hier { background: var(--ef-navy-tief); }
.ef-hier__marke {
  display: block;
  font-family: var(--ef-mono);
  font-size: var(--ef-s-mikro);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ef-rot-signal);
  margin-bottom: .45rem;
}
.ef-tabelle tbody th {
  text-align: left;
  vertical-align: top;
  padding: 1rem 1.25rem;
  font-family: var(--ef-mono);
  font-weight: 600;
  font-size: var(--ef-s-mikro);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ef-text-schwach);
  background: var(--ef-flaeche);
  border-bottom: 1px solid var(--ef-linie-fein);
  white-space: nowrap;
}
.ef-tabelle tbody td { padding: 1rem 1.25rem; vertical-align: top; border-bottom: 1px solid var(--ef-linie-fein); color: var(--ef-text-leise); }
.ef-tabelle tbody tr:last-child :is(th, td) { border-bottom: 0; }
.ef-tabelle td.ef-dies {
  background: var(--ef-band);
  color: var(--ef-text);
  font-weight: 500;
  box-shadow: inset 1px 0 0 var(--ef-linie), inset -1px 0 0 var(--ef-linie);
}

/* Unter 900px stapelt die Tabelle zu beschrifteten Bloecken, statt in einen
   seitlichen Bildlauf gezwungen zu werden. Dafuer traegt jede Zelle ein
   data-spalte-Attribut. */
@media (max-width: 899px) {
  .ef-tabelle-huelle { border: 0; }
  .ef-tabelle, .ef-tabelle tbody, .ef-tabelle tbody tr,
  .ef-tabelle tbody th, .ef-tabelle tbody td { display: block; width: auto; }
  .ef-tabelle thead { display: none; }
  .ef-tabelle tbody tr { border: 1px solid var(--ef-linie); margin-bottom: .85rem; }
  .ef-tabelle tbody th { background: var(--ef-navy); color: #fff; border-bottom: 0; white-space: normal; padding: .7rem 1rem; }
  .ef-tabelle tbody td { display: grid; grid-template-columns: minmax(0, 8rem) 1fr; gap: .15rem .85rem; padding: .7rem 1rem; }
  .ef-tabelle tbody td::before {
    content: attr(data-spalte);
    font-family: var(--ef-mono);
    font-size: var(--ef-s-mikro);
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--ef-text-schwach);
  }
  .ef-tabelle td.ef-dies::before { color: var(--ef-rot); }
  .ef-tabelle tbody tr td:last-child { border-bottom: 0; }
}

/* -- Kennzahlen ---------------------------------------------------------- */
.ef-zahlen { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; background: var(--ef-linie); }
@media (min-width: 820px) { .ef-zahlen { grid-template-columns: repeat(4, 1fr); } }
.ef-zahl { background: var(--ef-flaeche); padding: 1.6rem 1.35rem; }
.ef-zahl > b {
  display: block;
  font-family: var(--ef-display);
  font-weight: 800;
  font-size: 1.75rem;
  line-height: 1.1;
  letter-spacing: -.035em;
  color: var(--ef-navy);
  font-variant-numeric: tabular-nums;
  margin-bottom: .5rem;
}
.ef-zahl > span { font-size: var(--ef-s-klein); line-height: 1.5; color: var(--ef-text-leise); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-zahlen { background: var(--ef-linie-dunkel); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-zahl { background: var(--ef-navy-tinte); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-zahl > b { color: #fff; }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-zahl > span { color: var(--ef-auf-dunkel-leise); }

/* -- Folge: eine echte Reihenfolge, deshalb Ziffern ---------------------- */
.ef-folge { display: grid; gap: 1px; margin-top: var(--ef-luft-mit); background: var(--ef-linie); border: 1px solid var(--ef-linie); }
@media (min-width: 820px) { .ef-folge--3 { grid-template-columns: repeat(3, 1fr); } }
.ef-stufe { background: var(--ef-flaeche); padding: 1.5rem 1.35rem; display: flex; flex-direction: column; gap: .6rem; }
.ef-stufe__nr {
  font-family: var(--ef-display);
  font-weight: 800;
  font-size: 1.75rem;
  line-height: 1;
  letter-spacing: -.03em;
  color: var(--ef-rot);
  font-variant-numeric: tabular-nums;
}
.ef-stufe > :is(h3, h4) { font-size: var(--ef-s-basis); }
.ef-stufe > :is(p, div:not([class])) { font-size: var(--ef-s-klein); color: var(--ef-text-leise); }

/* -- Verweise auf andere Seiten ----------------------------------------- */
.ef-verweise { display: grid; gap: 1rem; margin-top: var(--ef-luft-mit); }
@media (min-width: 800px) {
  .ef-verweise { grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
  /* auto-fit legt bei 1044px vier Spalten an. Bei fuenf Kacheln bliebe die
     fuenfte allein in der zweiten Reihe - dieselbe Unwucht, die Jonas schon
     bei den blauen Kaesten gestoert hat. Fuenf stehen 3 + 2. */
  .ef-verweise:has(> :nth-child(5):last-child) { grid-template-columns: repeat(3, 1fr); }
}
.ef-verweis {
  display: flex;
  flex-direction: column;
  gap: .6rem;
  padding: var(--ef-luft-eng);
  background: var(--ef-flaeche);
  border: 1px solid var(--ef-linie);
  border-radius: var(--ef-r);
  text-decoration: none;
  transition: border-color var(--ef-uebergang), box-shadow var(--ef-uebergang);
}
/* Im Bestand gibt es die Kachel in zwei Fassungen: als <a>, das alles
   umschliesst, und als <article>, in dem nur der Titel ein Link ist.
   In der zweiten Fassung ist die Kachel NICHT klickbar - man trifft nur
   die Titelzeile. Genau das war Jonas' Befund: "man erkennt nicht so
   schnell, dass es klickbare Kacheln sind". Sie waren es nicht.

   Die Flaeche darunter macht die ganze Kachel zum Ziel, ohne dass am
   Inhalt etwas geaendert wird. Sie liegt unter dem Text, damit
   Sie liegt UEBER dem Text - ein erster Anlauf legte sie darunter, und
   dann fing der Absatz die Klicks ab. Der Preis ist, dass sich der Text
   der Kachel nicht mehr markieren laesst; bei einem Teaser von zwei
   Zeilen ist das der bessere Tausch. */
.ef-verweis { position: relative; }
.ef-verweis:not(a) .ef-verweis__titel a::after {
  content: ""; position: absolute; inset: 0; z-index: 1; border-radius: inherit;
}

.ef-verweis:hover,
.ef-verweis:has(a:hover),
.ef-verweis:has(a:focus-visible) { border-color: var(--ef-navy); box-shadow: var(--ef-schatten); }
.ef-verweis:has(a:focus-visible) { outline: 2px solid var(--ef-rot); outline-offset: 2px; }

.ef-verweis__titel {
  font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-basis);
  line-height: 1.35; color: var(--ef-navy);
  /* Der Pfeil steht HINTER dem Titel, nicht am aeusseren Rand der Kachel.
     Mit space-between stand er allein in der rechten Ecke und sah aus, als
     gehoere er zu nichts. */
  display: flex; align-items: baseline; gap: .45rem;
}
/* Der Pfeil steht immer da - er ist das Zeichen, dass es weitergeht -
   und ruecht beim Ueberfahren eine Spur nach rechts. */
.ef-verweis__titel::after {
  content: "\2192"; flex: none; color: var(--ef-rot); font-weight: 400;
  transition: transform var(--ef-uebergang);
}
.ef-verweis:hover .ef-verweis__titel::after,
.ef-verweis:has(a:hover) .ef-verweis__titel::after { transform: translateX(3px); }
/* Der Titel traegt seine Linie erst beim Ueberfahren: sonst sieht es aus,
   als waere NUR die Titelzeile das Ziel. */
.ef-verweis .ef-verweis__titel .ef-link { border-bottom-color: transparent; }
.ef-verweis:hover .ef-verweis__titel .ef-link,
.ef-verweis:has(a:hover) .ef-verweis__titel .ef-link { border-bottom-color: var(--ef-rot); }

/* Der Teasertext einer Kachel, egal wie er im Markup heisst.
   Bis zum 11.09.2026 hing sein Aussehen daran, ob jemand .ef-text gesetzt
   hatte: 16 Kacheln standen damit in Grau, 29 ohne sie in Navy - derselben
   Farbe wie die Ueberschrift darueber. Auf der Strategieseite standen beide
   Sorten untereinander, und genau das hat Jonas gesehen.
   Die Regel haengt jetzt am Ort (Kind einer Kachel), nicht an einer Klasse,
   die man vergessen kann. Groesse und Abstand bleiben, wie sie waren -
   17px und 22px -, damit sich nur das aendert, was falsch war. */
.ef-verweis > p,
.ef-verweis__text { color: var(--ef-text-leise); }

/* -- Passung: wofuer etwas gemacht ist und wofuer nicht ----------------- */
.ef-passung { display: grid; gap: 1rem; margin-top: var(--ef-luft-mit); }
@media (min-width: 760px) { .ef-passung { grid-template-columns: repeat(2, 1fr); } }
.ef-passung__feld { padding: var(--ef-luft-eng); border: 1px solid var(--ef-linie-fein); border-radius: var(--ef-r); background: var(--ef-flaeche); }
/* Der Titel des Feldes traegt im Bestand oft .ef-tafel__titel statt einer
   Ueberschrift. Die alte Regel griff nur auf h2/h3/h4 - deshalb fehlten
   auf der Interim-Seite Rang UND Vorzeichen, und "Verantwortung im
   Mandat" stand in derselben Groesse wie die Punkte darunter. */
.ef-passung__feld > :is(h2, h3, h4, .ef-tafel__titel) {
  margin-top: 0;
  font-family: var(--ef-display);
  font-size: var(--ef-s-basis);
  font-weight: 700;
  color: var(--ef-navy);
  display: flex; align-items: baseline; gap: .6rem;
}
.ef-passung__feld > :is(h2, h3, h4, .ef-tafel__titel)::before {
  font-family: var(--ef-mono); font-size: var(--ef-s-klein); font-weight: 600; flex: none;
}
/* Der Unterschied lag bisher in einer 3px-Linie: dunkelgruen gegen
   dunkelgrau. Nebeneinander sind das zwei dunkle Striche. Eine sehr
   leichte Tonung der Flaeche sagt es auf einen Blick, ohne laut zu
   werden - die Linie bleibt und traegt das Vorzeichen mit. */
.ef-passung__feld--gut  { border-left: 3px solid var(--ef-erfolg); background: rgba(46, 90, 76, .04); }
.ef-passung__feld--gut > :is(h2, h3, h4, .ef-tafel__titel)::before { content: "+"; color: var(--ef-erfolg); }
.ef-passung__feld--nicht{ border-left: 3px solid var(--ef-text-schwach); background: var(--ef-grund); }
.ef-passung__feld--nicht > :is(h2, h3, h4, .ef-tafel__titel)::before { content: "\2212"; color: var(--ef-text-schwach); }

/* Eine Liste im Passungsfeld traegt im Bestand keine Klasse und bekam
   deshalb die Standardpunkte des Browsers - runde Aufzaehlungspunkte, die
   es sonst nirgends auf der Seite gibt. Sie bekommt hier dieselbe Figur
   wie .ef-punkte, nur im Vorzeichen des Feldes eingefaerbt. */
:is(.ef-passung__feld, .ef-tafel, .ef-karte) ul:not([class]) { list-style: none; padding-left: 0; display: grid; gap: .55rem; }
:is(.ef-passung__feld, .ef-tafel, .ef-karte) ul:not([class]) > li {
  position: relative; padding-left: 1.15rem;
  font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-text-leise);
}
:is(.ef-passung__feld, .ef-tafel, .ef-karte) ul:not([class]) > li::before {
  content: ""; position: absolute; left: 0; top: .68em;
  width: 8px; height: 1px; background: var(--ef-text-schwach);
}
.ef-passung__feld--gut ul:not([class]) > li::before { background: var(--ef-erfolg); }
/* Die Karte war in dieser Liste nicht dabei - fuenf klassenlose <ul> in
   Karten trugen deshalb die runden Standardpunkte des Browsers, die
   einzigen auf der ganzen Website. Nebeneinander mit einer Karte, die
   ihre Punkte als Chips zeigt, sah das aus wie zwei Gestaltungswelten. */
.ef-passung__feld .ef-punkte,
:is(.ef-passung__feld, .ef-tafel, .ef-karte) ul:not([class]) { margin-top: .9rem; }

/* -- Beleg: Kennzahl mit Bedeutung -------------------------------------- */
/* Belege sind KENNZAHLEN - die Zahl ist der Gegenstand, alles andere
   erklaert sie. Bis zum 10.09.2026 stand sie auf var(--ef-s-h3), also
   22px: der Groesse einer Kartenueberschrift. In einer Zelle, die auf
   einem breiten Schirm 800px misst, verschwindet das. Jonas' Urteil galt
   allen acht Bloecken auf sieben Seiten: "total lost - die kleinen
   Zahlen, der kleine Text, die grossen Kaestchen."

   Die Zahl steht jetzt auf 28 bis 44px und traegt die Zelle. Und vier
   Zellen stehen nebeneinander, ohne dass jemand eine Klasse setzen muss -
   im Bestand hatte KEINER der acht Bloecke die noetige --4, also standen
   ueberall vier Zellen im Zweierquadrat mit halbleeren Kaesten. */
.ef-belege { display: grid; gap: 1px; margin-top: var(--ef-luft-mit); background: var(--ef-linie); border: 1px solid var(--ef-linie); }
@media (min-width: 700px)  { .ef-belege { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) {
  .ef-belege--4,
  .ef-belege:has(> :nth-child(4):last-child) { grid-template-columns: repeat(4, 1fr); }
  .ef-belege:has(> :nth-child(3):last-child) { grid-template-columns: repeat(3, 1fr); }
}
.ef-belege > * { background: var(--ef-flaeche); }

/* Kontaktformular: Eingabe und Mailvorschau nebeneinander.
   Jonas zur Kontaktseite: "zu viel Blauflaeche - geht nicht auf eine Seite,
   merkwuerdige Anordnung, man muss scrollen." Am 10.09.2026 nachgemessen:
   die Tafel stand in der rechten Spalte eines Zweispalts, 600px breit, und
   stapelte darin Formular (953px) und Mailvorschau (723px) - zusammen
   1769px. Links daneben standen 267px Einleitung und 1500px Nichts.

   Die Vorschau zeigt die Mail, die beim Absenden entsteht. Sie gehoert
   neben das Formular, nicht 950px darunter - sonst sieht sie niemand beim
   Ausfuellen. Also: der Zweispalt wird zum Stapel, und die Tafel nimmt die
   ganze Bahn und teilt sie zwischen Eingabe und Vorschau.

   Die Regel haengt am INHALT (ein Formular mit Vorschau daneben), nicht an
   der Seite - eine zweite Seite mit demselben Baustein bekaeme dasselbe. */
@media (min-width: 1000px) {
  .ef-seite .ef-zweispalt:has(.ef-formular + .ef-mailvorschau) {
    grid-template-columns: minmax(0, 1fr);
    row-gap: var(--ef-luft-mit);
  }
  .ef-seite .ef-zweispalt:has(.ef-formular + .ef-mailvorschau) > .ef-tafel {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    column-gap: var(--ef-luft-mit);
    align-items: start;
  }
  /* Die Vorschau bleibt stehen, waehrend man das Formular hinunterfuellt. */
  .ef-zweispalt:has(.ef-formular + .ef-mailvorschau) :is(.ef-formular, .ef-mailvorschau) {
    margin-top: 0;
  }
  .ef-zweispalt:has(.ef-formular + .ef-mailvorschau) .ef-mailvorschau {
    position: sticky; top: calc(var(--ef-kopfhoehe, 72px) + 1rem);
  }
}
.ef-beleg { background: var(--ef-flaeche); padding: var(--ef-luft-eng) 1.3rem var(--ef-luft-mit); }
.ef-beleg__wert  {
  display: block; font-family: var(--ef-display); font-weight: 800;
  font-size: clamp(1.75rem, 1.2rem + 1.6vw, 2.75rem);
  line-height: 1.05; letter-spacing: -.03em;
  color: var(--ef-navy); font-variant-numeric: tabular-nums;
}
/* Traegt der Block Woerter statt Zahlen - auf der Projektleitung stehen
   dort "Delivery & Governance" und "Kein PMO-Theater" -, bleibt es bei
   der Ueberschriftgroesse. Vierzig Pixel Anzeigeschrift brechen einen
   solchen Begriff auf drei Zeilen. */
.ef-belege--wort .ef-beleg__wert { font-size: var(--ef-s-h3); line-height: 1.25; letter-spacing: -.014em; }
.ef-beleg__marke { display: block; font-family: var(--ef-body); font-size: var(--ef-s-mikro); letter-spacing: .07em; text-transform: uppercase; color: var(--ef-text-schwach); margin: .55rem 0 .45rem; }
.ef-beleg__text  { font-size: var(--ef-s-klein); color: var(--ef-text-leise); line-height: 1.5; }
/* Nicht jeder Beleg hat beides. Auf Startseite und Profil steht der ganze
   Satz im Etikett und es gibt gar keinen Text darunter - "Jahre Verantwortung
   in IT-, Projekt-, Beratungs- und Fuehrungsrollen", 46 Zeichen, gesetzt in
   11px Versalien mit .07em Sperrung. So liest das niemand; genau das meinte
   Jonas mit "der kleine Text" (10.09.2026).
   Fehlt der Text, ist das Etikett kein Etikett mehr, sondern die Erklaerung -
   und wird auch so gesetzt. Keine Inhaltsaenderung, nur die Form folgt dem,
   was tatsaechlich dasteht. */
.ef-beleg:not(:has(.ef-beleg__text)) .ef-beleg__marke {
  font-size: var(--ef-s-klein); text-transform: none; letter-spacing: 0;
  font-weight: 400; color: var(--ef-text-leise); line-height: 1.5;
  margin: .5rem 0 0;
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-beleg__wert { color: #fff; }

/* -- Praxisfall ---------------------------------------------------------
   Auf fuenf Seiten. Traegt Umfeldzeile, Titel und beschriftete Felder
   (Umfang, Aufgabe, Ergebnis). Kein Kartenraster - ein Fall ist ein
   zusammenhaengender Beleg, kein Element unter gleichen. */
.ef-faelle { display: grid; gap: var(--ef-luft-mit); margin-top: var(--ef-luft-mit); }
.ef-fall {
  border: 1px solid var(--ef-linie); border-left: 3px solid var(--ef-navy);
  border-radius: var(--ef-r); background: var(--ef-flaeche);
  padding: clamp(1.35rem, 3vw, 2rem);
}
/* -- Ergebnis einer Fallkarte -------------------------------------------
   Es sitzt am FUSS der Karte, nicht dort, wo der Text zufaellig aufhoert.
   Damit stehen die Ergebnisse einer Reihe auf einer Hoehe - und das Loch,
   das eine kuerzere Karte sonst unten laesst, wandert nach oben, wo es
   als Luft liest statt als fehlender Inhalt. Genau das war Jonas'
   Eindruck: "teamleitung hat kein ergebnis".

   .ef-karte davor, weil Abschnitt 7c die Aussenraender der Kartenkinder
   auf null setzt - margin-top:auto braucht mehr Gewicht als das. */
.ef-karte > .ef-fall__ergebnis {
  margin-top: auto;
  padding-top: var(--ef-luft-eng);
  border-top: 1px solid var(--ef-linie-fein);
  font-size: var(--ef-s-klein);
  line-height: 1.6;
  color: var(--ef-text-leise);
}
.ef-fall__ergebnis > strong:first-child { color: var(--ef-navy); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  .ef-karte > .ef-fall__ergebnis { border-top-color: var(--ef-linie-dunkel); }

.ef-fall__meta {
  /* "Internationaler Maschinenbau · ca. 5.000 Anwender · Team rund 30" -
     sechzig Zeichen in 13px Versalien mit Sperrung liest niemand. Die Zeile
     ist Auskunft, kein Etikett. (Audit 10.09.2026) */
  font-family: var(--ef-body); font-size: var(--ef-s-klein);
  color: var(--ef-text-schwach);
  padding-bottom: .9rem; margin-bottom: 1.25rem; border-bottom: 1px solid var(--ef-linie-fein);
}
.ef-fall__raster { display: grid; gap: var(--ef-luft-eng) 3rem; }
@media (min-width: 860px) { .ef-fall__raster { grid-template-columns: minmax(0, 17rem) minmax(0, 1fr); align-items: start; } }
.ef-fall__feld + .ef-fall__feld { margin-top: var(--ef-luft-eng); }
.ef-fall__marke {
  display: block; font-family: var(--ef-body); font-size: var(--ef-s-mikro);
  letter-spacing: .07em; text-transform: uppercase; color: var(--ef-rot); margin-bottom: .4rem;
}

/* -- Zitat --------------------------------------------------------------- */
.ef-zitat {
  border-left: 2px solid var(--ef-rot); padding-left: clamp(1rem, 2.5vw, 1.75rem);
  font-family: var(--ef-display); font-weight: 600; letter-spacing: -.018em;
  font-size: var(--ef-s-h3); line-height: 1.35; color: var(--ef-navy);
  max-width: 34ch; margin-top: var(--ef-luft-mit);
}

/* -- Kleinigkeiten ------------------------------------------------------- */
.ef-nowrap { white-space: nowrap; }
.ef-punkt {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  background: var(--ef-rot); flex: none; margin-right: .5rem;
}

/* Dunkelfassungen der Bausteine mit heller Flaeche. Ohne sie steht ein
   weisser Belegkasten im dunklen Band und bekommt von der Kontextregel
   weissen Text: 1:1. */
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) :is(.ef-belege, .ef-folge, .ef-faelle) { background: var(--ef-linie-dunkel); border-color: var(--ef-linie-dunkel); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) :is(.ef-beleg, .ef-stufe) { background: var(--ef-navy-tief); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-liste { border-top-color: var(--ef-linie-dunkel); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-liste__eintrag { border-bottom-color: var(--ef-linie-dunkel); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-liste__eintrag > :is(h2, h3, h4) { color: #fff; }

/* -- Steckbrief: Name-Wert-Paare ---------------------------------------- */
.ef-steckbrief { display: grid; margin-top: var(--ef-luft-mit); border-top: 1px solid var(--ef-linie); }
.ef-steckbrief > * { display: grid; gap: .2rem 2rem; padding: .9rem 0; border-bottom: 1px solid var(--ef-linie-fein); }
@media (min-width: 620px) { .ef-steckbrief > * { grid-template-columns: 11rem 1fr; align-items: baseline; } }
.ef-steckbrief dt { font-size: var(--ef-s-mikro); font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--ef-navy); }
.ef-steckbrief dd { margin: 0; font-size: var(--ef-s-klein); color: var(--ef-text-leise); }

/* -- Abschluss: der letzte Block jeder Seite ---------------------------- */
.ef-abschluss { background: var(--ef-navy-tief); color: #fff; }
.ef-abschluss :is(h1, h2, h3) { color: #fff; }
.ef-abschluss .ef-lead { color: var(--ef-auf-dunkel-leise); }
.ef-abschluss .ef-marke { color: var(--ef-rot-signal); }


/* -- Erreichbarkeitspunkt ------------------------------------------------
   Ein Zustand, kein Schmuck: der Punkt sagt "jemand ist da". Deshalb
   traegt er auch Text - ein Punkt allein waere eine Farbaussage, und die
   liest niemand mit Rotsehschwaeche. */
.ef-erreichbar {
  display: inline-flex; align-items: center; gap: .45rem;
  font-family: var(--ef-body); font-size: var(--ef-s-mikro);
  letter-spacing: .06em; text-transform: uppercase; font-weight: 600;
  color: var(--ef-auf-dunkel-leise);
}
.ef-erreichbar::before {
  content: ""; width: .5rem; height: .5rem; border-radius: 999px; flex: none;
  background: #6fbf9a; box-shadow: 0 0 0 3px rgba(111, 191, 154, .22);
}

/* -- Zweispalt: Begleittext links, Werkzeug rechts -----------------------
   Anders als das alte efficas-intro-grid steht hier KEINE Ueberschrift in
   der schmalen Spalte - beide Spalten tragen eigenstaendige Bloecke, und
   die schmale faellt nie unter 300px. */
.ef-zweispalt { display: grid; gap: var(--ef-luft-mit); align-items: start; margin-top: var(--ef-luft-mit); }
@media (min-width: 900px) {
  .ef-zweispalt { grid-template-columns: minmax(18.75rem, .8fr) minmax(0, 1.2fr); gap: clamp(1.75rem, 3vw, 2.75rem); }
}


/* == 5b  FORMULAR, BUCHUNG, MAILVORSCHAU =================================
   Diese Bausteine kommen nur auf der Kontaktseite vor. Sie standen dort
   als 26 KB Inline-CSS mit eigenen Farben, eigenen Radien (22px, 18px,
   16px, 12px, 999px) und eigenen Schatten - eine kleine Parallelwelt.
   Hier tragen sie dieselben Marken wie alles andere: ein Radius, ein
   Schattensatz, die drei Abstandsstufen.

   Ein Eingabefeld ist ein Tap-Ziel wie ein Knopf: min-height 46px, wie
   .ef-knopf. Und der Fokusring ist sichtbar und nicht wegoptimiert - er
   ist fuer Tastaturbedienung die einzige Ortsangabe. */

.ef-formular { display: grid; gap: var(--ef-luft-eng); margin-top: var(--ef-luft-mit); }
.ef-formular__paar { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .875rem; }
@media (max-width: 620px) { .ef-formular__paar { grid-template-columns: 1fr; } }

.ef-feld { display: grid; gap: .5rem; min-width: 0; }
.ef-feld > label,
.ef-feldgruppe > legend {
  font-family: var(--ef-body); font-size: var(--ef-s-klein);
  font-weight: 600; line-height: 1.4; color: var(--ef-text); padding: 0;
}
.ef-feld > :is(input, select, textarea) {
  width: 100%; min-width: 0; min-height: 46px;
  appearance: none; -webkit-appearance: none;
  border: 1px solid var(--ef-linie); border-radius: var(--ef-r-klein);
  background: var(--ef-flaeche); color: var(--ef-text);
  font-family: var(--ef-body); font-size: var(--ef-s-basis); line-height: 1.45;
  padding: .7rem .85rem;
  transition: border-color var(--ef-uebergang), box-shadow var(--ef-uebergang);
}
/* Der Pfeil des Auswahlfeldes wird mitgeliefert, weil appearance:none ihn
   entfernt - sonst sieht ein <select> aus wie ein Textfeld und niemand
   klickt hinein. */
.ef-feld > select {
  padding-right: 2.5rem;
  background-image: linear-gradient(45deg, transparent 50%, var(--ef-text-leise) 50%),
                    linear-gradient(135deg, var(--ef-text-leise) 50%, transparent 50%);
  background-position: right 1.15rem center, right .9rem center;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}
.ef-feld > textarea { resize: vertical; min-height: 10.5rem; line-height: 1.6; }
.ef-feld > :is(input, select, textarea):focus-visible {
  outline: none;
  border-color: var(--ef-navy);
  box-shadow: 0 0 0 3px rgba(21, 59, 91, .18);
}
.ef-feld > ::placeholder { color: var(--ef-text-schwach); }

.ef-feldgruppe { margin: 0; padding: 0; border: 0; min-width: 0; }
.ef-wahlzeile { display: flex; flex-wrap: wrap; gap: .6rem 1.1rem; margin-top: .65rem; }
/* Das Kaestchen sitzt an der ersten Zeile, nicht in der Mitte des Blocks -
   sonst wandert es bei zweizeiliger Beschriftung nach unten weg. */
.ef-haken {
  display: inline-flex; align-items: flex-start; gap: .6rem; cursor: pointer;
  font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-text-leise);
}
.ef-haken > input { margin: .22rem 0 0; accent-color: var(--ef-navy); flex: none; width: 1rem; height: 1rem; }
.ef-haken--zustimmung { display: flex; }
.ef-formular__fuss { display: grid; gap: .875rem; }
.ef-formular__knoepfe { display: flex; flex-wrap: wrap; gap: .75rem; }
.ef-formular__knoepfe > .ef-knopf { flex: 1 1 13.75rem; }
@media (max-width: 620px) { .ef-formular__knoepfe { flex-direction: column; } }
.ef-formular__hinweis { margin: 0; font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-text-leise); }

/* -- Mailvorschau -------------------------------------------------------
   Zeigt, was gleich im Mailprogramm steht. Der Rumpf laeuft in der
   Monoschrift, weil dort Zeilenumbrueche und Einzuege Bedeutung tragen -
   es ist ein Textdokument, keine Fliesstextpassage. */
.ef-mailvorschau {
  margin-top: var(--ef-luft-eng);
  border: 1px solid var(--ef-linie); border-radius: var(--ef-r);
  background: var(--ef-grund); overflow: hidden;
}
.ef-mailvorschau__kopf {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem;
  padding: 1rem 1.1rem; border-bottom: 1px solid var(--ef-linie);
  background: var(--ef-flaeche);
}
@media (max-width: 620px) { .ef-mailvorschau__kopf { flex-direction: column; align-items: stretch; } }
.ef-mailvorschau__marke {
  margin: 0 0 .25rem; font-family: var(--ef-body); font-size: var(--ef-s-mikro);
  letter-spacing: .09em; text-transform: uppercase; font-weight: 600; color: var(--ef-text-schwach);
}
.ef-mailvorschau__zeile { margin: 0; font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-text-leise); }
.ef-mailvorschau__meta { display: grid; gap: .25rem; padding: 1rem 1.1rem 0; }
.ef-mailvorschau__meta p { margin: 0; font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-text); }
.ef-mailvorschau__text {
  margin: 0; padding: 1rem 1.1rem;
  white-space: pre-wrap; overflow-wrap: break-word;
  font-family: var(--ef-mono); font-size: var(--ef-s-klein); line-height: 1.65; color: var(--ef-text);
}
.ef-mailvorschau__stand { min-height: 1.5rem; margin: 0; padding: 0 1.1rem 1.1rem; font-size: var(--ef-s-klein); line-height: 1.5; color: var(--ef-erfolg); }

/* -- Buchung ------------------------------------------------------------
   Der Kalender laedt erst nach ausdruecklichem Klick. Vorher steht hier
   eine Flaeche mit dem Grund, warum - kein Rahmen, der stillschweigend
   eine Verbindung zu einem fremden Dienst aufbaut. */
.ef-buchung__rahmen { border: 1px solid var(--ef-linie); border-radius: var(--ef-r); overflow: hidden; background: var(--ef-flaeche); }
.ef-buchung__rahmen iframe { display: block; width: 100%; height: 43.75rem; border: 0; }
@media (max-width: 900px) { .ef-buchung__rahmen iframe { height: 38.75rem; } }
@media (max-width: 620px) { .ef-buchung__rahmen iframe { height: 32.5rem; } }
.ef-buchung__zustimmung {
  display: flex; flex-direction: column; align-items: flex-start; gap: .875rem;
  padding: clamp(1.5rem, 4vw, 2.5rem) clamp(1.1rem, 3vw, 1.75rem);
  background: var(--ef-grund-2);
}
.ef-buchung__titel { margin: 0; font-family: var(--ef-display); font-size: var(--ef-s-h3); font-weight: 700; color: var(--ef-navy); }
.ef-buchung__text { margin: 0; max-width: 62ch; font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-text-leise); }
.ef-buchung__hinweis { margin: 0; font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-text-schwach); }
.ef-buchung__ersatz { margin-top: var(--ef-luft-eng); }

/* == 6  SEITENTYPEN ======================================================= */

/* -- A · Auftakt (Startseite, Entwurf "Hafen") --------------------------
   Foto als Hero, aber mit einem Schleier, der zum rechten Rand aufklart.
   Im Livestand lief er 0.86/0.68/0.38/0.72 - also zum Rand hin WIEDER
   dunkel; das Bild war ueberall zugedeckt und der Hero trotzdem 1153px hoch. */
.ef-auftakt { position: relative; overflow: hidden; background: var(--ef-tiefsee); color: var(--ef-auf-dunkel); isolation: isolate; }
/* Die Bildebene traegt entweder einen Hintergrund ODER ein echtes <img>.
   Das <img> ist der bessere Weg: es laesst sich vorladen, kann srcset
   tragen und zaehlt sauber als groesstes Inhaltselement. Die Startseite
   bringt es schon mit - ihre alte Bildebene wird zu dieser hier. */
.ef-auftakt__bild { position: absolute; inset: 0; z-index: -2; background-size: cover; background-position: 62% 46%; background-repeat: no-repeat; overflow: hidden; }
.ef-auftakt__bild > img { width: 100%; height: 100%; object-fit: cover; object-position: 62% 46%; }
.ef-auftakt__bild > div { display: none; }   /* leere Reste der alten Ebenen */
.ef-auftakt__schleier {
  position: absolute; inset: 0; z-index: -1;
  background:
    /* Der Auslauf nach unten. Ohne ihn trifft das Hafenfoto hart auf das
       folgende Band: der waagerechte Schleier darunter laesst das Bild
       rechts bei 8 Prozent Deckkraft stehen, waehrend das Band mit einem
       Vollton beginnt. Auf breiten Schirmen war das eine sichtbare Kante
       quer durch die Seite (Jonas, 11.09.2026, bei 1920px).

       Der Endwert ist NICHT die Grundfarbe des Auftakts (--ef-tiefsee
       #061420), sondern die des folgenden Bandes (--ef-navy-tinte #081a2b).
       Genau deshalb verschwindet die Kante. Wer die Reihenfolge der
       Startseitenabschnitte aendert und hinter den Auftakt etwas anderes
       setzt, muss diesen Wert mitziehen. */
    linear-gradient(to bottom,
      rgba(8,26,43,0) 52%,
      rgba(8,26,43,.45) 76%,
      rgba(8,26,43,.88) 93%,
      rgb(8,26,43) 100%),
    linear-gradient(100deg, rgba(4,14,24,.95) 0%, rgba(5,18,30,.86) 38%, rgba(6,20,33,.30) 72%, rgba(6,20,33,.08) 100%),
    linear-gradient(rgba(4,14,24,.15), rgba(4,14,24,.42));
}
.ef-auftakt__innen {
  max-width: var(--ef-bahn);
  margin-inline: auto;
  padding: clamp(2.5rem, 4.5vw, 3.75rem) var(--ef-rand) clamp(2.25rem, 4vw, 3.25rem);
  display: grid;
  gap: clamp(1.75rem, 3.5vw, 3rem);
  align-items: end;
}
@media (min-width: 960px)  { .ef-auftakt__innen { grid-template-columns: minmax(0, 34rem) 1fr; } }
/* Feste 34rem lassen den Auftakt auf grossen Schirmen schrumpfen, waehrend
   das Hafenbild dahinter die volle Breite fuellt. Ab hier waechst er mit. */
@media (min-width: 1600px) { .ef-auftakt__innen { grid-template-columns: minmax(0, 40rem) 1fr; } }
.ef-auftakt h1 { color: #fff; text-shadow: 0 1px 24px rgba(4,14,24,.4); }
.ef-auftakt .ef-lead { color: #cfdeea; }
.ef-auftakt .ef-marke { color: var(--ef-rot-signal); }
@media (prefers-reduced-motion: no-preference) {
  .ef-auftakt__bild, .ef-auftakt__bild > img { animation: ef-driften 72s ease-in-out infinite alternate; }
  @keyframes ef-driften {
    from { transform: scale(1.03); }
    to   { transform: scale(1.09) translate3d(-1.2%, -.6%, 0); }
  }
}
/* Der Schnell-Check: das Einzige, was ein Besucher sofort tun kann. */
.ef-check { background: rgba(255,255,255,.055); border: 1px solid var(--ef-linie-dunkel); border-radius: var(--ef-r); padding: clamp(1.5rem, 3vw, 2rem); }
.ef-check__satz { font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-h3); line-height: 1.3; letter-spacing: -.016em; color: #fff; margin-top: .9rem; max-width: 22ch; }
.ef-check__fakten { display: flex; flex-wrap: wrap; gap: .5rem; list-style: none; margin: 1.5rem 0 0; padding: 0; }
.ef-check__fakten > * { font-size: var(--ef-s-mikro); color: #c2d6e5; border: 1px solid rgba(255,255,255,.2); border-radius: 999px; padding: .3rem .7rem; }
.ef-check__fuss { margin-top: 1rem; font-size: var(--ef-s-mikro); color: #8ba5ba; line-height: 1.5; }

/* -- B · Leistung (7 Angebotsseiten, Entwurf "Register") ----------------
   Feste Faecher in fester Reihenfolge, ein mitlaufendes Seitenregister und
   aufklappbare Tiefe. Scanbarkeit kommt aus der Wiederholung derselben
   Faecher an derselben Stelle, nicht aus dem Stil. */
.ef-werk { display: grid; gap: 0; }
@media (min-width: 1000px) { .ef-werk { grid-template-columns: 9rem minmax(0, 1fr); gap: 0 3.5rem; align-items: start; } }

.ef-register {
  position: sticky;
  top: var(--ef-kopf-hoehe);
  z-index: 20;
  background: var(--ef-flaeche);
  border-bottom: 1px solid var(--ef-linie);
  margin-inline: calc(var(--ef-rand) * -1);
  padding-inline: var(--ef-rand);
  overflow-x: auto;
}
.ef-register ol { display: flex; gap: 1.25rem; list-style: none; margin: 0; padding: .75rem 0; }
.ef-register a {
  font-family: var(--ef-mono);
  font-size: var(--ef-s-mikro);
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--ef-text-schwach);
  text-decoration: none;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  gap: .45rem;
}
.ef-register a > b { color: var(--ef-rot); font-weight: 600; }
.ef-register a:hover { color: var(--ef-navy); }
.ef-register a[data-hier] { color: var(--ef-navy); font-weight: 600; }
@media (min-width: 1000px) {
  .ef-register { top: calc(var(--ef-kopf-hoehe) + 3rem); background: transparent; border-bottom: 0; margin: 0; padding: 0; overflow: visible; align-self: start; }
  .ef-register ol { flex-direction: column; gap: 0; padding: 0; border-left: 1px solid var(--ef-linie); }
  .ef-register a { min-height: 0; padding: .5rem 0 .5rem 1rem; margin-left: -1px; border-left: 2px solid transparent; align-items: baseline; }
  .ef-register a[data-hier] { border-left-color: var(--ef-rot); }
}

.ef-fach-block { padding-block: var(--ef-luft-weit); border-top: 1px solid var(--ef-linie); }
.ef-fach-block:first-child { border-top: 0; }
.ef-fach-block--ton { background: var(--ef-band); border-top-color: transparent; box-shadow: -100vmax 0 0 var(--ef-band), 100vmax 0 0 var(--ef-band); }
.ef-fach-block--ton + .ef-fach-block { border-top-color: transparent; }
.ef-fach-block__marke { font-family: var(--ef-body); font-size: var(--ef-s-mikro); letter-spacing: .1em; text-transform: uppercase; color: var(--ef-rot); margin-bottom: .9rem; }

/* "Auf einen Blick" — die vier Faecher, die ein Einkaeufer zuerst sucht. */
.ef-blick { display: grid; gap: 1px; margin-top: var(--ef-luft-mit); background: var(--ef-linie-dunkel); border: 1px solid var(--ef-linie-dunkel); }
@media (min-width: 760px) { .ef-blick { grid-template-columns: repeat(4, 1fr); } }
.ef-blick > * { background: rgba(6,18,30,.55); padding: 1.15rem 1.25rem; }
.ef-blick dt { font-family: var(--ef-body); font-size: var(--ef-s-mikro); letter-spacing: .08em; text-transform: uppercase; color: #7e9ab0; margin-bottom: .5rem; }
.ef-blick dd { margin: 0; font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-basis); line-height: 1.35; color: #fff; letter-spacing: -.01em; }
.ef-blick dd small { display: block; font-family: var(--ef-body); font-weight: 400; font-size: var(--ef-s-klein); color: var(--ef-auf-dunkel-leise); letter-spacing: 0; margin-top: .35rem; }

/* Aufklappbare Tiefe: der Scanweg bleibt kurz, die Tiefe bleibt erreichbar. */
.ef-faecher { margin-top: 1rem; border-top: 1px solid var(--ef-linie); }
.ef-fach { border-bottom: 1px solid var(--ef-linie-fein); }
.ef-fach > summary {
  display: grid; gap: .25rem 1.5rem; padding: 1.15rem 2.5rem 1.15rem 0;
  cursor: pointer; list-style: none; position: relative; align-items: baseline;
}
@media (min-width: 720px) { .ef-fach > summary { grid-template-columns: 2.75rem minmax(0, 26rem) 1fr; } }
.ef-fach > summary::-webkit-details-marker { display: none; }
.ef-fach > summary::after {
  content: ""; position: absolute; right: .35rem; top: 1.55rem; width: 9px; height: 9px;
  border-right: 1.5px solid var(--ef-text-schwach); border-bottom: 1.5px solid var(--ef-text-schwach);
  transform: rotate(45deg); transition: transform var(--ef-uebergang), border-color var(--ef-uebergang);
}
.ef-fach[open] > summary::after { transform: rotate(-135deg); border-color: var(--ef-rot); }
.ef-fach__nr    { font-family: var(--ef-mono); font-size: var(--ef-s-mikro); color: var(--ef-rot); }
.ef-fach__titel { font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-basis); line-height: 1.4; letter-spacing: -.008em; color: var(--ef-text); }
.ef-fach__kurz  { font-size: var(--ef-s-klein); color: var(--ef-text-leise); line-height: 1.5; }
.ef-fach__inhalt { padding: 0 2.5rem 1.5rem 0; color: var(--ef-text-leise); font-size: var(--ef-s-klein); max-width: 64ch; }
@media (min-width: 720px) { .ef-fach__inhalt { padding-left: calc(2.75rem + 1.5rem); } }

.ef-schalter {
  font-family: var(--ef-mono); font-size: var(--ef-s-mikro); letter-spacing: .07em; text-transform: uppercase;
  background: none; border: 1px solid var(--ef-linie); color: var(--ef-text-leise);
  padding: .55rem .85rem; cursor: pointer; min-height: 44px;
  transition: border-color var(--ef-uebergang), color var(--ef-uebergang);
}
.ef-schalter:hover { border-color: var(--ef-navy); color: var(--ef-navy); }

/* Die Aussage steht ueber der Tabelle, nicht in ihr. */
.ef-kurzgesagt { display: grid; gap: 1px; margin-top: var(--ef-luft-eng); background: var(--ef-linie); border: 1px solid var(--ef-linie); }
@media (min-width: 820px) { .ef-kurzgesagt { grid-template-columns: repeat(3, 1fr); } }
.ef-kurzgesagt > * { background: var(--ef-flaeche); padding: 1rem 1.15rem; font-size: var(--ef-s-klein); color: var(--ef-text-leise); line-height: 1.5; margin: 0; }
.ef-kurzgesagt > * > b { display: block; font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-basis); color: var(--ef-text); letter-spacing: -.008em; margin-bottom: .25rem; }
.ef-kurzgesagt > .ef-dies { background: var(--ef-band); }
.ef-kurzgesagt > .ef-dies > b { color: var(--ef-navy); }

/* -- Seitenkopf fuer B und C -------------------------------------------
   Typ B (Leistung) und Typ C (Erklaerung) teilen den Kopf: Relief als Grund,
   Schleier darueber, Inhalt in einer Bahn. Sie unterscheiden sich nur in der
   zweiten Spalte - B zeigt darunter "Auf einen Blick", C ein Portraet. */
.ef-seitenkopf { position: relative; overflow: hidden; background: var(--ef-tiefsee); color: var(--ef-auf-dunkel); isolation: isolate; }
/* Das Hamburg-Relief. Bis zum 10.09.2026 abends stand hier KEIN Bild -
   Groesse, Lage und Deckkraft waren gesetzt, die Datei nicht. In der
   lokalen Pruefmappe war sie als Daten-URI eingespielt, auf der Box fehlte
   sie, und jeder Seitenkopf war flaches Navy. Jonas' "zu viel Blauflaeche"
   hatte hier seinen Grund. Der Pfad ist relativ zur Stylesheet-Datei -
   beide liegen in efficas-assets. 1280x832, unter cover auf grossen
   Schirmen hochskaliert; bei 66% Deckkraft als Textur unkritisch, eine
   2560er-Fassung waere der naechste Schritt. */
/* Zwei Aufloesungen: 1280px fuer normale Schirme, 2560px fuer Retina.
   image-set laedt genau eine davon - die grosse Datei (437 KB gegen 101 KB)
   kostet also nur dort, wo sie auch etwas bringt. Die Zeile davor ist die
   Rueckfallebene fuer Browser ohne image-set; sie muss stehen bleiben,
   sonst haben die gar keinen Grund.

   Zwei Dinge, an denen es beim Einrichten gehakt hat (11.09.2026):
   Die Datei aus der CI-Ablage hat 437 KB, und statische Dateien ueber
   rund 300 KB gibt der Server in diesem Verzeichnis nicht heraus - er
   antwortet mit 403. Neu gerechnet auf 275 KB laeuft sie. Und eine
   Adresse, die einmal abgelehnt wurde, bleibt abgelehnt, auch nachdem
   die Datei dort passt; deshalb heisst sie relief-2560 und nicht
   relief-2x. Wer sie tauscht, achte auf beides. */
.ef-seitenkopf__relief { position: absolute; inset: -4%; z-index: -2; background-image: url(relief.jpg); background-image: image-set(url(relief.jpg) 1x, url(relief-2560.jpg) 2x); background-size: cover; background-position: 62% 44%; background-repeat: no-repeat; opacity: .66; }
.ef-seitenkopf__schleier { position: absolute; inset: 0; z-index: -1; background: linear-gradient(98deg, rgba(4,13,22,.95) 0%, rgba(5,17,28,.86) 44%, rgba(5,17,28,.5) 100%); }
.ef-seitenkopf__innen {
  max-width: var(--ef-bahn); margin-inline: auto;
  padding: clamp(2.5rem, 5vw, 4rem) var(--ef-rand) clamp(2.25rem, 4vw, 3.25rem);
  display: grid; gap: clamp(1.75rem, 3.5vw, 3rem); align-items: end;
}
/* Zwei Spalten nur, wenn es auch zwei Kinder gibt. Nicht jede Leistungsseite
   bringt einen "Auf einen Blick"-Block mit; ohne diese Bedingung stand der
   Text in einer schmalen Saeule neben leerer Flaeche und der Kopf wurde
   ueber einen Bildschirm hoch. */
@media (min-width: 900px) {
  .ef-seitenkopf--erklaerung .ef-seitenkopf__innen:has(> * + *) { grid-template-columns: minmax(0, 1.5fr) minmax(0, .62fr); }
  /* Und oben statt unten ausgerichtet. Der Grundwert align-items:end setzt
     beide Spalten auf eine gemeinsame Unterkante - richtig, solange die
     Textspalte die hoehere ist. Auf dem Profil ist es umgekehrt: die
     Nebenspalte traegt Portraet UND Tafel und wird 862px hoch, die
     Textspalte 538px. Die Ueberschrift rutschte dadurch auf y=621 und stand
     unter 320px leerem dunklem Grund - der Name war beim Laden nicht zu
     sehen. Oben ausgerichtet steht er sofort da. */
  .ef-seitenkopf--erklaerung .ef-seitenkopf__innen:has(> * + *) { align-items: start; }
  .ef-seitenkopf--leistung   .ef-seitenkopf__innen:has(> * + *) { grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr); align-items: end; }
}
/* Es gibt Koepfe mit .ef-seitenkopf__innen und Koepfe mit einer schlichten
   .ef-bahn. Die erste bringt ihre Polsterung mit, die zweite nur die
   seitliche - senkrecht hat sie keine. Solange ein ganzer Abschnitt IM
   Kopf stand, fiel das nicht auf: dessen padding-block hielt die
   Unterkante. Seit der Abschnitt herausgeloest ist, endete der dunkle
   Grund direkt an der letzten Zeile - das Zitat sass auf der Kante.
   Beide Fassungen tragen jetzt dasselbe Mass. */
.ef-seitenkopf > .ef-bahn,
.ef-auftakt > .ef-bahn {
  padding-block: clamp(2.5rem, 5vw, 4rem) clamp(2.25rem, 4vw, 3.25rem);
}

/* Das Portraet beginnt mit einer harten Kante, die Marke daneben mit
   Schrift in einer Zeilenbox. Beide starten auf derselben Rasterlinie -
   optisch sass das Bild dadurch 8px hoeher als der Text. Der halbe
   Durchschuss der Marke holt es auf dieselbe Hoehe. */
.ef-seitenkopf .ef-portraet { margin-top: .5rem; }

.ef-seitenkopf h1 { color: #fff; }
.ef-seitenkopf .ef-lead { color: #b9cddd; }
.ef-seitenkopf .ef-marke { color: var(--ef-rot-signal); }
@media (prefers-reduced-motion: no-preference) {
  .ef-seitenkopf__relief { animation: ef-driften 72s ease-in-out infinite alternate; }
}
.ef-seitenkopf .ef-steckbrief { border-top: 0; gap: 1px; background: var(--ef-linie-dunkel); border: 1px solid var(--ef-linie-dunkel); }
.ef-seitenkopf .ef-steckbrief > * { background: rgba(6,18,30,.55); padding: .9rem 1.1rem; border-bottom: 0; }
.ef-seitenkopf .ef-steckbrief dt { color: #7e9ab0; }
.ef-seitenkopf .ef-steckbrief dd { color: #dce9f3; }

/* Ein Steckbrief IN einer Kopftafel steht in einer 332px schmalen Spalte.
   Die Zweispaltenfassung (11rem fuer den Bezeichner, Rest fuer den Wert)
   laesst dort 140px fuer den Wert uebrig - "Jonas Kieselbach" bricht auf
   zwei Zeilen, die Anschrift auf drei, der Fokus auf fuenf. Dazu schob
   die eigene Polsterung der Zeilen die Tabelle ueber die Kante der Tafel.

   Die Umschaltung haengt an der FENSTERbreite; das Problem ist aber die
   Spaltenbreite. Solange es dafuer keine Regel gibt, wird der Fall hier
   benannt: in einer Kopftafel stapelt der Steckbrief immer. */
.ef-kopftafel .ef-steckbrief {
  margin-top: var(--ef-luft-eng);
  gap: 0;
  background: none;
  border: 0;
  border-top: 1px solid var(--ef-linie-dunkel);
}
.ef-kopftafel .ef-steckbrief > * {
  grid-template-columns: 1fr;
  gap: .15rem;
  padding: .7rem 0;
  background: none;
  border-bottom: 1px solid var(--ef-linie-dunkel);
}
.ef-kopftafel .ef-steckbrief > :last-child { border-bottom: 0; }
.ef-kopftafel .ef-steckbrief dd { max-width: none; }

/* Portraet: unbehandelt. Ein Farbstich ueber einem Gesicht macht aus einem
   Menschen einen Effekt; das Bild ist ohnehin schon schwarzweiss. */
/* Der Grund sitzt am Bild, nicht am Rahmen - sonst steht eine
   Bildunterschrift auf heller Flaeche und erbt die Farbe des dunklen
   Zusammenhangs. Gemessen waren das 1,08:1. */
.ef-portraet { position: relative; max-width: 290px; width: 100%; justify-self: end; margin: 0; }
.ef-portraet img {
  width: 100%; aspect-ratio: 3 / 4; object-fit: cover; object-position: 50% 14%;
  background: var(--ef-grund); border-radius: var(--ef-r);
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.22);
}
.ef-portraet figcaption {
  margin-top: .8rem; font-size: var(--ef-s-mikro); line-height: 1.5;
  color: var(--ef-text-leise);
}
:is(.ef-seitenkopf, .ef-auftakt, .ef-band--dunkel) .ef-portraet figcaption { color: #a8c0d3; }

/* -- Kleines Portraet mit Namenszeile ------------------------------------
   Die grosse Fassung oben ist ein Bildelement mit Bildunterschrift. Diese
   hier ist eine Absenderzeile: Bild und Name nebeneinander, so gross wie
   ein Absender in einem Briefkopf.

   Steht bewusst NACH .ef-portraet: beide Selektoren sind (0,1,1), bei
   Gleichstand entscheidet die Reihenfolge. Weiter oben eingehaengt hat
   .ef-portraet img {width:100%} gewonnen und das Bild lief 290px breit
   bei 52px Hoehe - ein weisser Balken statt eines Kopfes. */
.ef-portraet--klein { display: flex; align-items: center; gap: .85rem; max-width: none; justify-self: stretch; }
.ef-portraet--klein img {
  width: 3.25rem; height: 3.25rem; flex: none;
  aspect-ratio: 1; border-radius: 999px; object-position: 50% 30%;
}
.ef-portraet__angabe { display: grid; gap: .1rem; min-width: 0; }
.ef-portraet__name { margin: 0; font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-klein); color: #fff; }
.ef-portraet--klein .ef-kennung { margin: 0; }


/* Stationen: eine Folge in der Zeit, deshalb datiert. */
.ef-stationen { margin-top: var(--ef-luft-mit); border-top: 1px solid var(--ef-linie); }
.ef-station { display: grid; gap: .4rem 2rem; padding: 1.5rem 0; border-bottom: 1px solid var(--ef-linie-fein); }
@media (min-width: 800px) { .ef-station { grid-template-columns: 8rem minmax(0, 17rem) 1fr; align-items: baseline; } }
/* Der Meilenstein, an dem entschieden wird. Wie bei den Karten: genau
   einer je Reihe, und der Unterschied liegt in der Flaeche, nicht in der
   Schriftgroesse. Der Einzug haelt die Zeitspalte auf ihrer Achse. */
.ef-station--hervor { background: var(--ef-rot-flaeche); box-shadow: inset 3px 0 0 var(--ef-rot); padding-inline: 1rem; margin-inline: -1rem; }

.ef-station__zeit { font-size: var(--ef-s-mikro); font-weight: 700; letter-spacing: .08em; color: var(--ef-rot); font-variant-numeric: tabular-nums; }
.ef-station > :is(h3, h4) { font-size: var(--ef-s-basis); font-weight: 700; line-height: 1.4; color: var(--ef-text); }
.ef-station > :is(p, div:not([class])) { font-size: var(--ef-s-klein); color: var(--ef-text-leise); }

/* Foto in einem Rahmen, nicht als Textunterlage. */
.ef-fenster { position: relative; margin: 0; }
.ef-fenster img { width: 100%; aspect-ratio: 16 / 10; object-fit: cover; border-radius: var(--ef-r); box-shadow: var(--ef-schatten); }
.ef-fenster figcaption {
  margin-top: .9rem; font-size: var(--ef-s-mikro); color: var(--ef-text-schwach);
  display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; line-height: 1.5;
}
.ef-fenster figcaption b { color: var(--ef-navy); font-weight: 600; }


/* -- Tafel im Seitenkopf: durchscheinender Block auf dunklem Grund ------ */
.ef-kopftafel {
  background: rgba(255, 255, 255, .055);
  border: 1px solid var(--ef-linie-dunkel);
  border-radius: var(--ef-r);
  padding: clamp(1.5rem, 3vw, 2rem);
}
/* Vorspann- statt H3-Groesse. Die Tafel steht in der schmalen Spalte des
   Seitenkopfs - auf dem Profil sind das 291px, abzueglich Polsterung 225px
   Textbreite. Bei 24px stehen dort vier Zeilen mit vierzehn Zeichen, direkt
   neben einer 56px-H1: zwei Ueberschriften, die um dieselbe Rolle streiten.
   Auf Vorspanngroesse sind es drei Zeilen, und die Tafel ist wieder das,
   was sie sein soll - eine Beischrift, keine zweite Zeile im Kopf. */
.ef-kopftafel > :is(h2, h3) { font-size: var(--ef-s-lead); line-height: 1.32; color: #fff; }
.ef-kopftafel > :not(:is(h1,h2,h3,h4)) { margin-top: .9rem; font-size: var(--ef-s-klein); color: var(--ef-auf-dunkel-leise); }

/* -- Brotweg ------------------------------------------------------------- */
.ef-brotweg {
  display: flex; flex-wrap: wrap; gap: .5rem;
  font-family: var(--ef-body); font-size: var(--ef-s-mikro);
  letter-spacing: .08em; text-transform: uppercase; color: #8fa8bc; margin: 0;
}
.ef-brotweg a { color: inherit; text-decoration: none; }
.ef-brotweg a:hover { color: #fff; }
.ef-brotweg > [aria-current] { color: #fff; }

/* -- Merkmale: kurze Eigenschaften als Kette ----------------------------
   Kind-Tag bewusst offen (> *). Das Altmarkup benutzt hier mal <li>, mal
   <span> - eine Regel auf "> li" liess die Merkmale auf der
   Projektleitungsseite als nackten Fliesstext stehen. Wo alle Kinder
   dieselbe Rolle haben, darf die Regel nicht am Tag haengen. */
.ef-merkmale { display: flex; flex-wrap: wrap; gap: .5rem; list-style: none; margin: var(--ef-luft-eng) 0 0; padding: 0; }
.ef-merkmale > * {
  font-size: var(--ef-s-klein); color: var(--ef-text-leise);
  border: 1px solid var(--ef-linie); border-radius: 999px; padding: .35rem .8rem;
}
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-merkmale > * { color: #c2d6e5; border-color: rgba(255,255,255,.2); }

/* -- Intro-Paar: Bezeichnung links, Ausfuehrung rechts -------------------
   Auf den Leistungsseiten viermal je Seite verwendet. Traegt die
   wiederkehrende Figur "Beleg / Arbeitsweise / Abgrenzung" plus Text. */
.ef-intro { display: grid; gap: var(--ef-luft-eng) 3rem; margin-top: var(--ef-luft-mit); }
@media (min-width: 860px) { .ef-intro { grid-template-columns: minmax(0, 18rem) minmax(0, 1fr); align-items: start; } }
.ef-intro__text { display: grid; gap: 1rem; }
.ef-intro__text > * { max-width: var(--ef-lesebahn); color: var(--ef-text-leise); }

/* -- Schluss: der Handlungsblock am Seitenende --------------------------
   Wie .ef-abschluss, aber mit Platz fuer ein Portraet und eine Fussnote. */
.ef-schluss { background: var(--ef-grund-2); border-top: 1px solid var(--ef-linie); }
.ef-schluss__raster { display: grid; gap: var(--ef-luft-mit); align-items: center; }
@media (min-width: 900px) { .ef-schluss__raster { grid-template-columns: minmax(0, 1fr) minmax(0, 17rem); gap: 3.5rem; } }
.ef-schluss__notiz { margin-top: var(--ef-luft-eng); padding-top: var(--ef-luft-eng); border-top: 1px solid var(--ef-linie); font-size: var(--ef-s-klein); color: var(--ef-text-leise); max-width: 60ch; }
.ef-schluss__person { display: flex; align-items: center; gap: 1rem; }
.ef-schluss__person img { width: 76px; height: 76px; border-radius: 999px; object-fit: cover; object-position: 50% 14%; flex: none; }
.ef-schluss__name { display: block; font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-basis); color: var(--ef-navy); }
.ef-schluss__rolle { display: block; font-size: var(--ef-s-klein); color: var(--ef-text-leise); }

/* == 7  GRAFIKEN ==========================================================
   Sechzehn Schaubilder, viewBox durchgehend 680-700 Einheiten breit.
   Gemessen fuer ein 700er viewBox in dieser Bahn:

     1156px Schirm -> Beschriftung 16,5px      900px -> 12,7px
      768px Schirm -> Beschriftung 10,7px      375px ->  4,9px

   Oberhalb von 768px tragen sie, darunter nicht. Deshalb der Umschaltpunkt
   genau dort: bis 768px scrollt das Schaubild waagerecht in seinem eigenen
   Rahmen und behaelt seine Lesegroesse, statt auf 5px zu schrumpfen.
   ========================================================================= */

.ef-schaubild { margin-top: var(--ef-luft-mit); }
.ef-schaubild__rahmen {
  border: 1px solid var(--ef-linie);
  border-radius: var(--ef-r);
  background: var(--ef-flaeche);
  padding: clamp(1rem, 2.5vw, 1.5rem);
}
/* svg UND img: die sechzehn Grafiken kommen als <img> - keine ID- und
   Klassenkollisionen zwischen zwei Bildern auf einer Seite, kein
   Stil, der aus dem SVG in die Seite leckt. */
.ef-schaubild :is(svg, img) { display: block; width: 100%; height: auto; }
.ef-schaubild figcaption { margin-top: .9rem; font-size: var(--ef-s-mikro); color: var(--ef-text-schwach); line-height: 1.5; }
/* Beschriftungen der Schaubilder.
   Bis zum 10.09.2026 trug JEDE der sechzehn SVG-Dateien diesen Block selbst
   mit sich - identisch, byteweise. Solange sie als <img> eingebunden waren,
   war das harmlos. Inline gilt ein <style> in einer SVG aber fuer das ganze
   Dokument, und die Klassen heissen .h .t .k .l: so allgemein, dass jedes
   kuenftige Element mit diesen Namen mitgetroffen wuerde. Deshalb steht der
   Block jetzt einmal hier und ist an .ef-schaubild gebunden.
   Die Werte sind unveraendert - es ist derselbe Block, nur an einem Ort. */
.ef-schaubild svg .h  { font-family: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-weight: 700; fill: #153b5b; }
.ef-schaubild svg .l  { font-weight: 700; fill: #12202c; }
.ef-schaubild svg .t  { fill: #556775; }
.ef-schaubild svg .k  { fill: #7d8b98; letter-spacing: .08em; text-transform: uppercase; font-weight: 700; }
.ef-schaubild svg .hv { fill: #7e2f3d; font-weight: 700; }
.ef-schaubild svg .wt { fill: #ffffff; }

/* Bemalung fuer eingebettete Schaubilder. Sechs Klassen statt Farbwerten
   am Element: sonst stehen die Hausfarben als Hexwerte in jedem SVG und
   sind bei der naechsten Farbkorrektur nicht auffindbar. Die Namen sagen
   die Rolle, nicht die Farbe. */
.ef-mal-navy   { fill: var(--ef-navy); }
.ef-mal-rot    { fill: var(--ef-rot); }
.ef-mal-ton    { fill: var(--ef-grund-2); }
.ef-mal-weiss  { fill: #fff; }
.ef-mal-leise  { fill: var(--ef-text-leise); }
.ef-mal-leer   { fill: none; }
.ef-strich-navy  { stroke: var(--ef-navy); fill: none; }
.ef-strich-rot   { stroke: var(--ef-rot); fill: none; }
.ef-strich-linie { stroke: var(--ef-linie); fill: none; }
/* Beschriftung im Schaubild: dieselben zwei Schriften wie ueberall. */
.ef-mal-titel { font-family: var(--ef-display); font-weight: 700; }
.ef-mal-text  { font-family: var(--ef-body); font-weight: 400; }

@media (max-width: 768px) {
  /* Der Rahmen wird zum Sichtfenster, das Schaubild behaelt seine Groesse. */
  .ef-schaubild__rahmen { overflow-x: auto; -webkit-overflow-scrolling: touch; padding-inline: 0; }
  /* Drei aeltere Schaubilder stehen ohne Rahmen direkt in der figure. Ohne
     Scrollcontainer lief die 700px-Grafik aus der Seite (Lagebild, 390px). */
  .ef-schaubild:not(:has(> .ef-schaubild__rahmen)) { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .ef-schaubild :is(svg, img) { width: 700px; max-width: none; }
  .ef-schaubild__rahmen > * { padding-inline: 1rem; }
  /* Hinweis, dass hier gewischt werden darf. */
  .ef-schaubild__rahmen::after {
    content: "Zum Lesen waagerecht wischen";
    display: block;
    padding: .6rem 1rem 0;
    font-family: var(--ef-mono);
    font-size: var(--ef-s-mikro);
    color: var(--ef-text-schwach);
    position: sticky;
    left: 0;
  }
}

:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-schaubild__rahmen { border-color: var(--ef-linie-dunkel); background: rgba(255,255,255,.035); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss) .ef-schaubild figcaption { color: #8ba5ba; }

/* Schaubild neben Text. */
/* minmax(0, 1fr), nicht auto: Eine auto-Spalte waechst auf die max-content-
   Breite ihres groessten Kindes. Auf dem Handy war das die 700px breite
   Grafik im Scrollrahmen - und der Text daneben lief mit auf 700px hinaus,
   die Startseite scrollte waagerecht (Audit 10.09.2026, 390px). */
.ef-schau { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ef-luft-mit); align-items: center; }
@media (min-width: 900px) {
  .ef-schau { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 4rem; }
  /* Steht ein Portraet in der Nebenspalte, braucht die nicht die halbe
     Seite. Vorher sass ein 290px breites Bild in einer 530px-Spalte und
     schwamm in leerer Flaeche. */
  .ef-schau:has(.ef-portraet) { grid-template-columns: minmax(0, .68fr) minmax(0, 1.32fr); align-items: start; }
  .ef-schau:has(.ef-portraet) .ef-portraet { max-width: 340px; justify-self: start; }
}
.ef-schau--gedreht > *:first-child { order: 2; }
@media (max-width: 899px) { .ef-schau--gedreht > *:first-child { order: 0; } }


/* -- Zurueck nach oben ---------------------------------------------------
   Fehlte auf jeder Seite. Sitzt am Ende des Inhalts, nicht als schwebender
   Knopf - eine Seite, die man zu Ende gelesen hat, braucht den Ausgang
   dort, wo man angekommen ist. */
/* Der Abschluss der Seite war ein Stapel aus drei leeren Zonen: 52px
   weisser Abstand, 98px "Nach oben", dann 128px graue Theme-Polsterung -
   zusammen 278px zwischen dem letzten Band und dem Fuss, in zwei
   verschiedenen Grautoenen. Jetzt sitzt der Streifen direkt am letzten
   Band, und die Theme-Polsterung darunter faellt weg. */
.ef-nachoben {
  display: flex; justify-content: center;
  /* Die Bahn darin ist Flex-Kind und schrumpfte auf Textbreite. */
  padding-block: var(--ef-luft-mit) var(--ef-luft-eng);
  border-top: 1px solid var(--ef-linie-fein);
  margin-top: 0;
}
/* Nach einem vollbreiten Band braucht es keine Trennlinie - die Kante des
   Bandes ist die Trennung. */
:is(.ef-band, .ef-abschluss, .ef-auftakt, .ef-seitenkopf) + .ef-nachoben { border-top: 0; }
.ef-nachoben > .ef-bahn { flex: 1; display: flex; justify-content: center; }
.ef-nachoben a {
  display: inline-flex; align-items: center; gap: .5rem; min-height: 44px;
  font-size: var(--ef-s-klein); font-weight: 600; color: var(--ef-navy);
  text-decoration: none;
}
.ef-nachoben a::before { content: "\2191"; color: var(--ef-rot); }
.ef-nachoben a:hover { color: var(--ef-rot); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-abschluss) .ef-nachoben { border-top-color: var(--ef-linie-dunkel); }
:is(.ef-band--dunkel, .ef-band--tinte, .ef-abschluss) .ef-nachoben a { color: #fff; }

/* == 7b  THEME-KORREKTUR: LINKFARBE ======================================
   Der einzige Punkt, an dem die echte Kaskade auf der Box den Refit
   geschlagen hat - und der Grund, warum lokales Bauen hier nicht reichte.

   GeneratePress druckt inline in den Kopf:

       .inside-article a, .paging-navigation a,
       .comments-area a, .page-header a { color: var(--iron-grey-text); }

   Das ist Spezifitaet 0,1,1 und liegt damit ueber jeder Refit-Regel, die
   einem Link mit einer einzigen Klasse eine Farbe gibt (0,1,0). Auf allen
   sechzehn Entwuerfen sah das so aus:

       .ef-knopf--voll   Theme-Grau #2b2b2b auf Weinrot   1,59:1
       .ef-knopf--linie  Theme-Grau statt Navy
       .ef-link          Theme-Grau statt Navy
       a                 Theme-Grau statt inherit - auf dunklem Grund
                         also fast Schwarz auf Navy

   Die Regeln auf dunklem Grund waren nie betroffen: sie stehen als
   :is(…) .ef-knopf--linie bei (0,2,0) und liegen ohnehin darueber.

   Der Block wiederholt deshalb genau die Farbwerte von oben - keine neuen
   Entscheidungen, nur dieselben eine Stufe hoeher gehaengt. Dass hier
   .inside-article steht, ist Absicht: der Selektor benennt die Ursache und
   greift nur dort, wo sie steht. Ausserhalb des Themes - in einer Vorschau
   ohne GeneratePress - gibt es die Theme-Regel nicht, und die Regeln oben
   tragen allein. Faellt die Theme-Regel weg, kann dieser Block ersatzlos
   geloescht werden. */
.inside-article .ef-seite a { color: inherit; }
.inside-article .ef-seite .ef-link { color: var(--ef-navy); }
.inside-article .ef-seite .ef-link:hover { color: var(--ef-rot); }
.inside-article .ef-seite .ef-knopf--voll { color: #fff; }
.inside-article .ef-seite .ef-knopf--linie { color: var(--ef-navy); }
.inside-article .ef-seite .ef-knopf--hell { color: #fff; }
.inside-article .ef-seite .ef-knopf:not([class*="ef-knopf--"]) { color: var(--ef-navy); }
.inside-article .ef-seite .ef-verweis { color: var(--ef-navy); }
/* Dunkler Grund: dieselbe kanonische Liste wie ueberall, eine Stufe hoeher. */
.inside-article .ef-seite
  :is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-knopf--linie, .ef-knopf--hell, .ef-link, .ef-verweis,
     .ef-knopf:not([class*="ef-knopf--"])) { color: #fff; }
/* Helle Insel im dunklen Band holt Navy zurueck - Reihenfolge wie oben. */
.inside-article .ef-seite
  :is(.ef-band--dunkel, .ef-band--tinte, .ef-seitenkopf, .ef-auftakt, .ef-abschluss)
  :is(.ef-tabelle-huelle, .ef-fall, .ef-datenblatt__rumpf) :is(.ef-link, .ef-verweis) { color: var(--ef-navy); }
.inside-article .ef-seite .ef-nachoben a { color: var(--ef-text-leise); }
.inside-article .ef-seite .ef-nachoben a:hover { color: var(--ef-rot); }

/* == 7a  ZWEISPALTIGER ABSCHNITTSKOPF ====================================
   Jonas ueber alle Seiten: "linksbuendig", "schlauchig", "zu viel
   Weissraum", "leserlicher ist es nicht geworden". Gemessen: der
   Fliesstext nutzte 52% der Bahn, immer links. Die Lesebahn von 68
   Zeichen ist richtig - aber ohne Gegengewicht rechts entsteht Abschnitt
   fuer Abschnitt dieselbe Figur, und das Auge findet keinen Rhythmus.

   Der Abschnittskopf steht ab 900px zweispaltig: Marke und Ueberschrift
   links auf zwei Fuenfteln, der einleitende Text rechts auf drei.

   Drei Markupformen im Bestand, alle muessen dasselbe ergeben:
     A  Kopfzeile mit zwei Kaesten       .ef-kopfzeile > div + div
     B  Text als Geschwister, Absatz     .ef-bahn > .ef-kopfzeile + p
     C  Text als Geschwister, im Kasten  .ef-bahn > .ef-kopfzeile + div

   ZWEI ANLAEUFE HAT ES GEBRAUCHT, beide festgehalten:
   1. Form C fehlte - Lagebild blieb zehnmal einspaltig.
   2. Der Versuch, Kaesten MIT Raster per :not(:has(...)) auszunehmen,
      hat den ganzen Selektor ungueltig gemacht: :has() darf kein :has()
      enthalten. Die Regel fiel still aus, und nichts aenderte sich.
      Geprueft, ob der Ausschluss ueberhaupt noetig ist - ueber alle
      achtzehn Seiten: NULL klassenlose Kaesten nach einer Kopfzeile
      tragen ein Raster. Der Ausschluss war ein Problem, das es nicht gab.

   Die Bahn ist jetzt immer ein Raster; alles darin laeuft ueber beide
   Spalten. Nur eine Kopfzeile, auf die ein Einleitungsblock FOLGT,
   nimmt die linke - dafuer reicht ein einstufiges :has(+ …).
   Keine Fuge am Raster: die Abstaende macht weiterhin das Flusswerk.

   Folgt auf den Kopf direkt ein Raster (Karten, Tabelle, Schaubild),
   bleibt er voll breit - dort gehoert nichts daneben. */
@media (min-width: 900px) {

  /* -- Form A -- */
  .ef-seite .ef-abschnitt .ef-kopfzeile:has(> div + div) {
    grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
    column-gap: clamp(2rem, 4vw, 4rem);
    align-items: start;
  }
  .ef-seite .ef-abschnitt .ef-kopfzeile:has(> div + div) > div + div { margin-top: 0; }
  .ef-seite .ef-abschnitt .ef-kopfzeile:has(> div + div) > div + div :is(p, ul) { max-width: none; }

  /* -- Form B und C -- */
  /* :not(...) - eine Bahn kann zugleich ein Layout-Bauteil sein. Auf der
     Startseite trug der Personen-Abschnitt "ef-bahn ef-schau": das Kopfraster
     hier gewann, und die Regel "> * { grid-column: 1 / -1 }" legte Portraet
     und Text uebereinander statt nebeneinander - halbe Seite leer
     (11.09.2026). Wer sein eigenes Raster mitbringt, behaelt es. */
  .ef-seite .ef-abschnitt > .ef-bahn:not(.ef-schau, .ef-zweispalt, .ef-karten, .ef-verweise, .ef-belege) {
    display: grid;
    grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
    column-gap: clamp(2rem, 4vw, 4rem);
    row-gap: 0;
    align-items: start;
  }
  .ef-seite .ef-abschnitt > .ef-bahn:not(.ef-schau, .ef-zweispalt, .ef-karten, .ef-verweise, .ef-belege) > * { grid-column: 1 / -1; }
  .ef-seite .ef-abschnitt > .ef-bahn > .ef-kopfzeile:has(+ :is(p, .ef-text, .ef-lead, div:not([class]))) {
    grid-column: 1 / 2; grid-row: 1;
    /* Traegt dieser Kopf selbst zwei Huellen (Form A), wuerde er seine 394px
       nochmal 2:3 teilen - gemessen 134px fuer Marke und Ueberschrift
       (Fractional CIO, Lagebild). In der schmalen Spalte stapeln sie. */
    grid-template-columns: minmax(0, 1fr);
  }
  .ef-seite .ef-abschnitt > .ef-bahn > .ef-kopfzeile:has(+ :is(p, .ef-text, .ef-lead, div:not([class]))) > div + div { margin-top: var(--ef-luft-eng); }
  .ef-seite .ef-abschnitt > .ef-bahn > .ef-kopfzeile:has(+ :is(p, .ef-text, .ef-lead, div:not([class]))) + :is(p, .ef-text, .ef-lead, div:not([class])) {
    grid-column: 2 / 3;
    grid-row: 1;
    margin-top: 0;
    max-width: none;
  }
  .ef-seite .ef-abschnitt > .ef-bahn > .ef-kopfzeile:has(+ :is(p, .ef-text, .ef-lead, div:not([class]))) + :is(p, .ef-text, .ef-lead, div:not([class])) :is(p, ul) { max-width: none; }
  /* Ein zweiter Absatz gehoert zur Einleitung und sitzt UNTER dem ersten
     in derselben Spalte. */
  .ef-seite .ef-abschnitt > .ef-bahn > .ef-kopfzeile + :is(p, .ef-text, .ef-lead) + :is(p, .ef-text, .ef-lead) {
    grid-column: 2 / 3;
    grid-row: 2;
  }
}

/* == 7b  LAGEBILD-EXPLORER ===============================================
   Ein Werkzeug im Text: acht Felder, drei Sichten, ein Rechner. Es kommt
   nur auf der Lagebild-Seite vor und ist der einzige Baustein der Website
   mit eigener Zustandslogik.

   Was sich beim Umbau geaendert hat
   ---------------------------------
   Der Explorer brachte eine komplette Parallelwelt mit: eine eigene
   Farbschicht (--x-navy, --x-mid, --x-tint …, elf Aliase auf die
   ef-Token), zwei eigene Radien (14px und 18px neben den 10px der Seite)
   und VIERZEHN Schriftgroessen von .68rem bis 1.35rem - also 11px bis
   22px in Schritten von einem halben Pixel. Elf Pixel liegen unter dem,
   was auf einem Bildschirm noch gelesen wird.

   Hier steht er auf denselben sieben Schriftrollen, demselben Radius und
   denselben drei Abstandsstufen wie der Rest. Er wird dadurch etwas
   groesser - das ist beabsichtigt: es ist ein Werkzeug, mit dem jemand
   arbeitet, kein Kleingedrucktes.

   Die Zustaende bleiben unveraendert, weil das Skript sie setzt:
   aria-selected an den Reitern, aria-pressed an Feldern und Sichten,
   hidden an den Tafeln, .ef-explorer--bereit an der Wurzel. */

.ef-explorer {
  border: 1px solid var(--ef-linie);
  border-radius: var(--ef-r);
  background: var(--ef-flaeche);
  color: var(--ef-text);
  box-shadow: var(--ef-schatten);
  overflow: hidden;
  margin-top: var(--ef-luft-mit);
}
.ef-explorer button { font: inherit; color: inherit; }

/* -- Kopf und Reiter -- */
.ef-explorer__kopf {
  padding: var(--ef-luft-eng) var(--ef-luft-eng) 0;
  border-bottom: 1px solid var(--ef-linie-fein);
  background: linear-gradient(180deg, var(--ef-flaeche), var(--ef-grund-2));
}
.ef-explorer__marke {
  display: block; font-family: var(--ef-body); font-size: var(--ef-s-mikro);
  letter-spacing: .09em; text-transform: uppercase; font-weight: 600; color: var(--ef-rot);
}
.ef-explorer__titel {
  margin: .45rem 0 .3rem; font-family: var(--ef-display); font-size: var(--ef-s-h3);
  line-height: 1.28; font-weight: 700; color: var(--ef-navy); max-width: 46ch;
}
.ef-explorer__unter { margin: 0 0 .9rem; font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-text-leise); max-width: 70ch; }

.ef-explorer__reiter { display: flex; gap: 2px; flex-wrap: wrap; }
.ef-explorer__reiterknopf {
  appearance: none; min-height: 44px;
  border: 1px solid var(--ef-linie); border-bottom: none;
  background: rgba(255, 255, 255, .6);
  padding: .6rem 1rem; border-radius: var(--ef-r-klein) var(--ef-r-klein) 0 0;
  cursor: pointer; font-size: var(--ef-s-klein); font-weight: 600; color: var(--ef-text-leise);
  transition: background var(--ef-uebergang), color var(--ef-uebergang);
}
.ef-explorer__reiterknopf:hover { background: var(--ef-flaeche); color: var(--ef-navy); }
/* Der gewaehlte Reiter traegt einen Balken, nicht nur eine andere Farbe -
   Zustand darf nie allein an der Farbe haengen. */
.ef-explorer__reiterknopf[aria-selected="true"] {
  background: var(--ef-flaeche); color: var(--ef-navy);
  box-shadow: inset 0 3px 0 var(--ef-rot);
}
.ef-explorer :is(button, [tabindex]):focus-visible { outline: 2px solid var(--ef-rot); outline-offset: 2px; }

.ef-explorer__tafel { padding: var(--ef-luft-eng); }
.ef-explorer__tafel[hidden] { display: none; }
.ef-explorer__lead { margin: 0 0 var(--ef-luft-eng); font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-text-leise); max-width: 74ch; }
.ef-explorer__lead b { color: var(--ef-text); }

/* -- Die acht Felder -- */
.ef-explorer__raster { display: grid; grid-template-columns: repeat(4, 1fr); gap: .65rem; }
@media (max-width: 1000px) { .ef-explorer__raster { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px)  { .ef-explorer__raster { grid-template-columns: 1fr; } }
.ef-explorer__feld {
  appearance: none; text-align: left; cursor: pointer;
  display: flex; flex-direction: column; gap: .3rem; min-height: 6.5rem;
  border: 1px solid var(--ef-linie); border-radius: var(--ef-r-klein);
  background: var(--ef-flaeche); padding: .85rem .9rem;
  transition: border-color var(--ef-uebergang), box-shadow var(--ef-uebergang), transform var(--ef-uebergang);
}
.ef-explorer__feld:hover { border-color: var(--ef-navy); box-shadow: var(--ef-schatten); transform: translateY(-1px); }
.ef-explorer__feld[aria-pressed="true"] { border-color: var(--ef-rot); background: var(--ef-rot-flaeche); box-shadow: var(--ef-schatten); }
.ef-explorer__feld-nr   { font-family: var(--ef-mono); font-size: var(--ef-s-mikro); font-weight: 600; letter-spacing: .08em; color: var(--ef-rot); }
.ef-explorer__feld-name { font-family: var(--ef-display); font-size: var(--ef-s-klein); font-weight: 700; line-height: 1.3; color: var(--ef-navy); }
.ef-explorer__feld-kurz { font-size: var(--ef-s-mikro); line-height: 1.45; color: var(--ef-text-leise); }

/* -- Ausklappender Befund -- */
.ef-explorer__detail {
  margin-top: var(--ef-luft-eng);
  border: 1px solid var(--ef-linie); border-left: 3px solid var(--ef-rot);
  border-radius: var(--ef-r-klein);
  background: linear-gradient(180deg, var(--ef-flaeche), var(--ef-grund-2));
  padding: 1.05rem 1.15rem;
}
.ef-explorer__detail h4 { margin: 0; font-size: var(--ef-s-basis); color: var(--ef-navy); line-height: 1.3; }
.ef-explorer__detail-erhoben { margin: .55rem 0 0; font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-text-leise); }
.ef-explorer__drei { display: grid; grid-template-columns: repeat(3, 1fr); gap: .75rem; margin-top: 1rem; }
@media (max-width: 660px) { .ef-explorer__drei { grid-template-columns: 1fr; } }
.ef-explorer__drei-spalte h5 { margin: 0 0 .45rem; font-family: var(--ef-body); font-size: var(--ef-s-mikro); letter-spacing: .08em; text-transform: uppercase; color: var(--ef-rot); font-weight: 700; }
.ef-explorer__drei-spalte ul { margin: 0; padding-left: 1.05rem; }
.ef-explorer__drei-spalte li { font-size: var(--ef-s-klein); line-height: 1.5; color: var(--ef-text); margin-bottom: .35rem; }
.ef-explorer__befund { margin-top: 1rem; padding: .8rem .95rem; border-radius: var(--ef-r-klein); background: var(--ef-navy); color: var(--ef-auf-dunkel); }
.ef-explorer__befund span { display: block; font-size: var(--ef-s-mikro); letter-spacing: .09em; text-transform: uppercase; color: var(--ef-auf-dunkel-leise); font-weight: 600; margin-bottom: .3rem; }
.ef-explorer__befund p { margin: 0; font-size: var(--ef-s-klein); line-height: 1.55; }

/* -- Sichtenwahl -- */
.ef-explorer__sichtbar { display: flex; gap: .5rem; flex-wrap: wrap; margin-bottom: var(--ef-luft-eng); }
.ef-explorer__sicht {
  appearance: none; min-height: 44px;
  border: 1px solid var(--ef-linie); background: var(--ef-flaeche); border-radius: 999px;
  padding: .45rem 1rem; font-size: var(--ef-s-klein); font-weight: 600;
  color: var(--ef-text-leise); cursor: pointer;
  transition: background var(--ef-uebergang), color var(--ef-uebergang), border-color var(--ef-uebergang);
}
.ef-explorer__sicht:hover { border-color: var(--ef-navy); color: var(--ef-navy); }
.ef-explorer__sicht[aria-pressed="true"] { background: var(--ef-navy); border-color: var(--ef-navy); color: #fff; }
.ef-explorer__sichtnotiz { margin: 0 0 var(--ef-luft-eng); padding: .8rem .95rem; border-radius: var(--ef-r-klein); background: var(--ef-band); font-size: var(--ef-s-klein); line-height: 1.55; color: var(--ef-navy-weich); }
.ef-explorer__sichtnotiz b { display: block; margin-bottom: .2rem; color: var(--ef-navy); }

/* -- Zeilen je Sicht -- */
.ef-explorer__zeilen { display: grid; grid-template-columns: repeat(2, 1fr); gap: .65rem; }
@media (max-width: 900px) { .ef-explorer__zeilen { grid-template-columns: 1fr; } }
.ef-explorer__zeile { border: 1px solid var(--ef-linie-fein); border-radius: var(--ef-r-klein); padding: .8rem .9rem; background: var(--ef-flaeche); }
.ef-explorer__zeile h5 { margin: 0 0 .45rem; font-family: var(--ef-display); font-size: var(--ef-s-klein); color: var(--ef-navy); }
.ef-explorer__zeile h5 span { color: var(--ef-rot); font-weight: 700; margin-right: .4rem; }
.ef-explorer__zeile ul { margin: 0; padding-left: 1.05rem; }
.ef-explorer__zeile li { font-size: var(--ef-s-mikro); line-height: 1.5; color: var(--ef-text-leise); margin-bottom: .28rem; }

/* -- Rechner -- */
.ef-explorer__rechner { display: grid; grid-template-columns: 1fr 1fr; gap: var(--ef-luft-mit); align-items: start; }
@media (max-width: 900px) { .ef-explorer__rechner { grid-template-columns: 1fr; } }
.ef-explorer__regler { display: flex; flex-direction: column; gap: var(--ef-luft-eng); }
.ef-explorer__stellglied label { display: block; font-size: var(--ef-s-klein); font-weight: 600; color: var(--ef-navy); margin-bottom: .4rem; }
.ef-explorer__stellglied output { float: right; font-weight: 700; color: var(--ef-rot); font-variant-numeric: tabular-nums; }
.ef-explorer__stellglied input[type="range"] { width: 100%; accent-color: var(--ef-rot); min-height: 24px; }
.ef-explorer__skala { display: flex; justify-content: space-between; font-size: var(--ef-s-mikro); color: var(--ef-text-schwach); margin-top: .15rem; }

.ef-explorer__ergebnis { border: 1px solid var(--ef-linie); border-radius: var(--ef-r-klein); overflow: hidden; background: var(--ef-flaeche); }
.ef-explorer__ergebnis-kopf { background: var(--ef-navy); color: #fff; padding: .85rem 1rem; }
.ef-explorer__ergebnis-kopf span { display: block; font-size: var(--ef-s-mikro); letter-spacing: .09em; text-transform: uppercase; color: var(--ef-auf-dunkel-leise); font-weight: 600; }
.ef-explorer__ergebnis-kopf strong { font-family: var(--ef-display); font-size: var(--ef-s-h3); font-weight: 700; }
.ef-explorer__ergebnis-rumpf { padding: 1rem; }
/* Zahlenpaare: tabular-nums, damit die Betraege untereinander stehen. */
.ef-explorer__paar { display: flex; justify-content: space-between; gap: 1rem; padding: .45rem 0; border-bottom: 1px dotted var(--ef-linie-fein); font-size: var(--ef-s-klein); }
.ef-explorer__paar:last-of-type { border-bottom: none; }
.ef-explorer__paar span { color: var(--ef-text-leise); }
.ef-explorer__paar strong { color: var(--ef-navy); font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; }
.ef-explorer__preis { margin-top: .85rem; padding: .8rem .9rem; border-radius: var(--ef-r-klein); background: var(--ef-rot-flaeche); border: 1px solid rgba(126, 47, 61, .18); }
.ef-explorer__preis .ef-explorer__paar { border-bottom-color: rgba(126, 47, 61, .16); }
.ef-explorer__preis strong { color: var(--ef-rot); }
.ef-explorer__notiz { margin: .85rem 0 0; font-size: var(--ef-s-mikro); line-height: 1.55; color: var(--ef-text-leise); }
.ef-explorer__stopp { padding: 1rem; border-radius: var(--ef-r-klein); background: var(--ef-band); font-size: var(--ef-s-klein); line-height: 1.6; color: var(--ef-navy-weich); }
.ef-explorer__fussnote { margin: var(--ef-luft-eng) 0 0; padding-top: .75rem; border-top: 1px solid var(--ef-linie-fein); font-size: var(--ef-s-mikro); line-height: 1.55; color: var(--ef-text-schwach); }

/* -- Ohne Skript -------------------------------------------------------
   Der Rueckfall steht IMMER im Markup und wird erst ausgeblendet, wenn
   das Skript die Wurzel als bereit markiert. Umgekehrt herum haette wer
   ohne JavaScript kommt eine leere Flaeche gesehen. */
.ef-explorer__rueckfall ul { margin: .5rem 0 0; padding-left: 1.1rem; }
.ef-explorer__rueckfall li { font-size: var(--ef-s-klein); line-height: 1.6; margin-bottom: .3rem; }
.ef-explorer--bereit .ef-explorer__rueckfall { display: none; }

/* Gedruckt zaehlt der Inhalt, nicht die Bedienung: Reiter und Sichten
   fallen weg, alle Tafeln stehen offen. */
@media print {
  .ef-explorer { box-shadow: none; }
  .ef-explorer__reiter, .ef-explorer__sichtbar { display: none; }
  .ef-explorer__tafel[hidden] { display: block !important; }
}

/* == 7c  IN EINER REIHE ==================================================
   Zwei Regeln, die dafuer sorgen, dass nebeneinanderstehende Bloecke auch
   wie eine Reihe aussehen. Beide kamen aus dem Kopf der
   Projektleitungsseite: dort stehen vier Bloecke in einem Zweierraster -
   drei Karten und ein Belegraster - und der Beleg fiel doppelt aus der
   Reihe.

   1  Er begann 43px tiefer als sein Nachbar. Grund: .ef-belege bringt
      margin-top: var(--ef-luft-mit) mit, damit es im Textfluss Abstand
      haelt. Als Rasterzelle ist dieser Abstand falsch - die Fuge des
      Rasters macht das bereits, der Aussenrand kommt oben drauf.

   2  Er hatte eckige Ecken, die Karten daneben 10px Rundung.

   Die erste Regel steht bewusst HIER und nicht bei den Bausteinen: sie
   muss nach allen margin-top-Angaben stehen, sonst entscheidet bei
   gleicher Spezifitaet die Reihenfolge gegen sie. */

/* Ein Kind eines Rasters oder einer Flexreihe hat keinen eigenen
   Aussenabstand. Den Abstand macht die Fuge - einmal, fuer alle. */
/* ACHTUNG bei :is() - eine Falle, die hier schon zugeschnappt ist:
   :is() nimmt die Spezifitaet seines STAERKSTEN Arguments fuer die ganze
   Liste. Solange ".ef-tafel ul:not([class])" mit drinstand, wog diese
   Regel (0,2,1) statt (0,1,0) - und schlug damit Regeln wie
   ".ef-karte > .ef-fall__ergebnis" (0,2,0), die sie nie schlagen sollte.
   Das Ergebnis einer Fallkarte blieb deshalb dort stehen, wo der Text
   aufhoerte, statt an den Kartenfuss zu sinken.

   Deshalb: in dieser Liste stehen NUR einfache Klassen. Was einen
   Nachfahrenselektor braucht, bekommt eine eigene Zeile darunter. */
:is(.ef-karten, .ef-belege, .ef-folge, .ef-zahlen, .ef-passung, .ef-verweise,
    .ef-schau, .ef-zweispalt, .ef-knopfzeile, .ef-merkmale, .ef-wahlzeile,
    .ef-karte, .ef-verweis, .ef-punkte, .ef-kennung,
    .ef-kurzgesagt, .ef-seitenkopf__innen, .ef-auftakt__innen,
    .ef-explorer__raster, .ef-explorer__zeilen, .ef-explorer__drei,
    .ef-formular__paar, .ef-formular__knoepfe) > * {
  margin-top: 0;
}
/* Die beiden Faelle mit Nachfahrenselektor - getrennt, damit ihre
   Spezifitaet nicht auf die Liste oben abfaerbt. */
.ef-passung__feld ul > *,
:is(.ef-tafel, .ef-karte) ul:not([class]) > * { margin-top: 0; }

/* Gleiche Rundung fuer alles, was neben einer Karte stehen kann.
   overflow:hidden, weil diese Bloecke ihre Trennlinien als 1px-Fugen ueber
   den Hintergrund zeichnen - ohne das ragen die Fugen in die runde Ecke. */
:is(.ef-belege, .ef-zahlen, .ef-folge, .ef-kurzgesagt) {
  border-radius: var(--ef-r);
  overflow: hidden;
}

/* == 8  UEBERGANG =========================================================
   Aliase der vier Altvokabulare auf die neuen Bausteine.

   WOZU: Damit der 416,7-KB-Inline-Block aus einer Seite geloescht werden
   kann, BEVOR ihr Markup auf .ef-* umgeschrieben ist. Ohne diesen Abschnitt
   muesste jede Seite in einem Zug beides sein - CSS raus und alle Klassen
   neu - und ein Fehler traefe sofort die ganze Seite.

   WANN ES WEGKOMMT: Sobald die letzte der 18 Seiten auf .ef-* umgestellt
   ist. Der Abschnitt ist kein Dauerzustand - genau so sind die vier
   Vokabulare ueberhaupt erst entstanden.

   NICHT ERWEITERN. Wer hier einen Eintrag vermisst, stellt die Seite um.
   ========================================================================= */

/* .efficas-page-shell traegt beim Uebergang zusaetzlich .ef-seite - keine eigene Regel noetig. */
.efficas-container      { max-width: var(--ef-bahn); margin-inline: auto; padding-inline: var(--ef-rand); }
.efficas-section        { padding-block: var(--ef-luft-weit); }
.efficas-section--soft  { background: var(--ef-grund); }
.efficas-anchor-offset  { scroll-margin-top: calc(var(--ef-kopf-hoehe) + 16px); }
.efficas-eyebrow        { font-family: var(--ef-body); font-size: var(--ef-s-mikro); font-weight: 700; letter-spacing: .15em; text-transform: uppercase; color: var(--ef-rot); margin: 0; }
.efficas-h1             { font-size: var(--ef-s-h1); line-height: 1.06; letter-spacing: -.03em; font-weight: 800; color: var(--ef-navy); hyphens: none; text-wrap: balance; }
.efficas-h2             { font-size: var(--ef-s-h2); line-height: 1.12; letter-spacing: -.026em; font-weight: 800; color: var(--ef-navy); hyphens: none; text-wrap: balance; }
.efficas-h3             { font-size: var(--ef-s-h3); line-height: 1.28; letter-spacing: -.014em; font-weight: 700; color: var(--ef-text); }
.efficas-text           { color: var(--ef-text-leise); max-width: var(--ef-lesebahn); }
.efficas-hero-lead      { font-size: var(--ef-s-lead); line-height: 1.55; color: var(--ef-text-leise); max-width: 52ch; }
.efficas-link           { color: var(--ef-navy); font-weight: 600; text-decoration: none; border-bottom: 1px solid var(--ef-rot); }
.efficas-btn            { display: inline-flex; align-items: center; justify-content: center; gap: .55rem; min-height: 46px; padding: .75rem 1.25rem; font-size: var(--ef-s-klein); font-weight: 600; text-decoration: none; border: 1px solid transparent; border-radius: var(--ef-r-klein); }
.efficas-btn-primary    { background: var(--ef-rot); color: #fff; }
.efficas-btn-secondary  { border-color: var(--ef-linie); color: var(--ef-navy); background: var(--ef-flaeche); }
.efficas-card           { background: var(--ef-flaeche); border: 1px solid var(--ef-linie-fein); border-radius: var(--ef-r); padding: var(--ef-luft-eng); }
.efficas-cards-grid     { display: grid; gap: 1rem; margin-top: var(--ef-luft-mit); }
.efficas-panel          { padding: clamp(1.5rem, 3vw, 2.25rem); border: 1px solid var(--ef-linie); border-left: 3px solid var(--ef-rot); background: var(--ef-flaeche); }
.efficas-panel-title    { font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-h3); color: var(--ef-navy); }
.efficas-table-wrap     { margin-top: var(--ef-luft-mit); border: 1px solid var(--ef-linie); background: var(--ef-flaeche); }
.efficas-table          { width: 100%; border-collapse: collapse; font-size: var(--ef-s-klein); }
.efficas-crosslink-grid { display: grid; gap: 1rem; margin-top: var(--ef-luft-mit); }
.efficas-crosslink-card { display: flex; flex-direction: column; gap: .6rem; padding: var(--ef-luft-eng); background: var(--ef-flaeche); border: 1px solid var(--ef-linie-fein); border-radius: var(--ef-r); text-decoration: none; }
.efficas-crosslink-title{ font-family: var(--ef-display); font-weight: 700; font-size: var(--ef-s-basis); color: var(--ef-navy); }

/* == 9  STILELEMENTE =======================================================
   Jonas, 10.09.2026: "einen exklusiveren, modernen Touch - nicht uebertrieben,
   aber schon modern." Vier Dinge, alle leise:

   1. Das Hamburg-Relief als Wasserzeichen in den dunklen Baendern und im
      Schlussband. Der Seitenkopf traegt es bereits; so laeuft dieselbe Figur
      vom Kopf bis zum Fuss der Seite durch, statt einmal aufzutauchen und
      dann zu verschwinden. Opazitaet .1 - Kontrast der hellen Schrift bleibt
      ueber 12:1, der leisen ueber 5:1.
   2. Tiefe statt Flaeche: ein Lichteinfall oben links auf den dunklen
      Baendern. Ein einziger radialer Verlauf, sechs Prozent Weiss.
   3. Bausteine tauchen beim Scrollen auf - scroll-getrieben, ohne Skript,
      18px von unten und aus der Transparenz. Nur in Browsern, die
      animation-timeline koennen; ueberall sonst steht alles von Anfang an,
      und wer Bewegung reduziert hat, sieht keine. Nichts wartet auf einen
      Beobachter: was beim Laden im Bild ist, ist sofort da.
   4. Verweiskacheln heben sich beim Ueberfahren zwei Pixel - der Schatten
      war schon da, die Bewegung fehlte.
   ========================================================================= */
.ef-band--tinte,
.ef-abschluss { position: relative; isolation: isolate; }
.ef-band--tinte::before,
.ef-abschluss::before {
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background-image: url(relief.jpg);
  background-image: image-set(url(relief.jpg) 1x, url(relief-2560.jpg) 2x);
  background-size: 140%; background-position: 78% 42%;
  background-repeat: no-repeat; opacity: .1; filter: grayscale(1) contrast(1.15);
}
.ef-band--tinte,
.ef-abschluss {
  background-image: radial-gradient(120% 90% at 12% -10%, rgba(255, 255, 255, .06), transparent 60%);
}

/* Das Band unmittelbar nach dem Auftakt bekommt KEINEN Aufheller.
   Der radiale Verlauf oben sitzt bei 'at 12% -10%' - also oberhalb der
   Oberkante, und dort ist er am staerksten. Gerechnet: er hebt den Grund
   #081a2b auf rgb(23,40,56). Der Auftakt darueber laeuft in reines #081a2b
   aus. 42 Punkte Abweichung auf einer geraden Linie quer durch die Seite -
   genau die Kante, die Jonas am 11.09.2026 auf einem 1920er Schirm gesehen
   hat.

   Nur dieses eine Band. Alle weiteren behalten ihre Tiefe; dort grenzt
   keine Bildflaeche an. Das Relief liegt in ::before und bleibt. */
.ef-auftakt + .ef-band--tinte,
.ef-auftakt + .ef-abschluss,
.ef-seitenkopf + .ef-band--tinte,
.ef-seitenkopf + .ef-abschluss { background-image: none; }

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .ef-seite .ef-abschnitt:not(.ef-seitenkopf) > .ef-bahn > :is(.ef-karten, .ef-belege, .ef-schaubild,
        .ef-tafel, .ef-zweispalt, .ef-tabelle-huelle, .ef-faelle, .ef-verweise, .ef-schau,
        .ef-passung, .ef-folge, .ef-stationen, .ef-zahlen) {
      animation: ef-auftauchen linear both;
      animation-timeline: view();
      animation-range-start: entry 0%;
      animation-range-end: entry 140px;
    }
  }
}
@keyframes ef-auftauchen {
  from { opacity: .001; translate: 0 18px; }
  to   { opacity: 1;    translate: 0 0; }
}

.ef-verweis { transition: translate var(--ef-uebergang), box-shadow var(--ef-uebergang), border-color var(--ef-uebergang); }
.ef-verweis:hover,
.ef-verweis:has(a:focus-visible) { translate: 0 -2px; }
@media (prefers-reduced-motion: reduce) { .ef-verweis:hover { translate: none; } }

/* Absaetze ohne Hurenkinder in der letzten Zeile - wo der Browser es kann. */
.ef-seite p { text-wrap: pretty; }
