/* ==========================================================================
   iCOGNIZE — Landingpage
   Nur die Wortmarke: Bildmarke oben, Schriftzug darunter. Dunkle Flaeche,
   Metallverlaeufe, Schattenwurf, ein Lichtband das ueber das Logo wandert.
   Keine externen Ressourcen, keine Abhaengigkeiten.
   ========================================================================== */

:root{
  --blau:      #0098cc;   /* Hausfarbe */
  --blau-hell: #4ec0e6;

  --grund:     #04080b;   /* fast schwarz, leicht blaustichig */
  --grund-2:   #0a151d;
  --schrift:   #dbe6ee;
  --gedaempft: #6b7c86;
  --linie:     rgba(219,230,238,.10);

  --sans: "Segoe UI Variable Display","Segoe UI",-apple-system,BlinkMacSystemFont,
          Inter,system-ui,"Helvetica Neue",Arial,sans-serif;

  /* Groesse des Logos — hier stellst du sie ein.
     Das Logo ist jetzt annaehernd quadratisch (Verhaeltnis 0,93). */
  --logo-breite: clamp(13rem, 33vw, 23rem);

  /* Takt des Lichtbandes und des Atmens im Hintergrund */
  --glanz-dauer: 6s;    /* Gesamttakt: kurzer Blitz, dann Ruhe */
  --glanz-start: 1.2s;  /* Vorlauf nach dem Laden */
  --wasser-dauer: 7s;   /* Takt der Baender auf der Wasseroberflaeche */
  --atem-dauer: 22s;   /* nur wirksam, wenn das Atmen aktiviert wird */
}

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

/* Nur <html> bekommt die volle Hoehe. FRUEHER STAND HIER AUCH body — das war
   ein Fehler, der erst mit der ersten Seite auffiel, deren Text laenger ist
   als der Bildschirm: eine feste Hoehe von 100% zusammen mit dem
   overflow-x:hidden weiter unten macht den <body> selbst zum Rollbereich.
   Das Dokument bleibt dann so hoch wie das Fenster, und alles darunter —
   letzter Abschnitt, Schaltflaechen, Fusszeile — war schlicht nicht mehr
   erreichbar. body{min-height:100svh} genuegt voellig: die Seite fuellt den
   Bildschirm und waechst mit ihrem Inhalt. */
html{ height:100%; }
html{
  overflow-x:clip;
  /* Die Grundfarbe gehoert auch auf <html>, nicht nur auf <body>: beim
     Blaettern malt der Browser die Flaeche, bevor der Koerper steht. */
  background:var(--grund);
  color-scheme:dark;
}

body{
  margin:0;
  min-height:100svh;
  display:flex; flex-direction:column;
  font-family:var(--sans);
  color:var(--schrift);
  background:var(--grund);
  -webkit-font-smoothing:antialiased;
  /* clip statt hidden: hidden erzwingt overflow-y:auto und macht den <body>
     damit zum Rollbereich — siehe oben. clip klemmt nur seitlich ab und
     laesst das Rollen dem Dokument. */
  overflow-x:clip;
}

/* --------------------------------------------------------------------------
   Der Raum hinter dem Logo

   Drei Ebenen: ein tiefer Farbverlauf, ein langsam atmender Lichtkern und
   eine feine Koernung. Die Koernung ist kein Bild, sondern ein im CSS
   erzeugtes Rauschen — sie nimmt dem Verlauf die Streifenbildung und gibt
   der Flaeche Textur.
   -------------------------------------------------------------------------- */

body::before{
  content:"";
  position:fixed; inset:-10%; z-index:0; pointer-events:none;
  background:
    radial-gradient(46rem 34rem at 50% 40%, rgba(0,152,204,.13), transparent 70%),
    radial-gradient(70rem 46rem at 50% 44%, rgba(0,120,170,.06), transparent 74%),
    radial-gradient(30rem 22rem at 16% 96%, rgba(0,152,204,.04), transparent 70%),
    radial-gradient(34rem 26rem at 88% 8%,  rgba(0,152,204,.035), transparent 70%),
    linear-gradient(175deg, var(--grund-2), var(--grund) 62%);
}

/* Lichtkern hinter dem Logo — bewusst STATISCH.

   Er hat einmal geatmet. Gemessen hat das rund ein Viertel der Bildrate
   gekostet, weil eine Flaeche dieser Groesse dabei in jedem Einzelbild neu
   gezeichnet wird. Zusammen mit dem wandernden Lichtband war die Seite auf
   schwaecheren Rechnern sichtbar ruckelig.

   Wer das Atmen zurueckhaben will: die beiden auskommentierten Zeilen
   aktivieren — und vorher auf einem langsamen Geraet gegenpruefen. */
.buehne::before{
  content:"";
  position:absolute; z-index:-1; pointer-events:none;
  width:min(78vw, 54rem); aspect-ratio:1; border-radius:50%;
  background:radial-gradient(closest-side, rgba(0,152,204,.15), transparent 72%);
  opacity:.62;
  /* animation:atmen var(--atem-dauer) ease-in-out infinite alternate; */
  /* will-change:opacity; */
}

@keyframes atmen{
  from{ opacity:.55; }
  to  { opacity:1; }
}

body::after{
  content:"";
  position:fixed; inset:0; z-index:0; pointer-events:none;
  /* Kein mix-blend-mode: das Mischen der gesamten Flaeche kostet in jedem
     Einzelbild spuerbar Leistung. Eine niedrige Deckkraft genuegt. */
  opacity:.035;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='r'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23r)'/%3E%3C/svg%3E");
  /* Randabdunklung, damit die Mitte traegt */
  box-shadow:inset 0 0 22rem 6rem rgba(0,0,0,.55);
}

/* --- Buehne -------------------------------------------------------------- */

.buehne{
  position:relative; z-index:1;
  flex:1 1 auto;
  display:grid; place-items:center;
  padding:clamp(2rem,8vh,6rem) 1.5rem;
}

/* Die Spiegelung haengt aus dem Fluss heraus nach unten. Damit sie nicht an
   der Fusszeile klebt, verschiebt sich das Logo etwas nach oben. */
.marke{
  /* Als Variable, weil der Uebergang zusaetzlich skaliert und die
     Verschiebung dabei erhalten bleiben muss. */
  --marke-y: calc(var(--logo-breite) * -.30);
  transform:translateY(var(--marke-y));
}

.marke{
  position:relative;
  width:var(--logo-breite);
  line-height:0;

  /* Der Rand im viewBox des Logos, damit Spiegelung und Horizont ohne
     Rechnerei bündig sitzen: 70 von 942 in der Hoehe, 70 von 876 in der
     Breite. Bei geaenderten Logomassen hier mit anpassen. */
  --rand-h: 7.429%;
  --rand-b: 7.989%;
  --inhalt-b: 84.022%;

  /* Abstand zwischen Logounterkante und Horizont */
  --horizont: 5%;
  /* Luft zwischen Horizont und Beginn der Spiegelung — ohne sie klebt die
     Spiegelung an der Wasserlinie und wirkt angewachsen statt gespiegelt. */
  --spiegel-abstand: 3.2%;
  /* Breite der Horizontlinie, bezogen auf die Logobreite.
     Der Deckel in vw weiter unten verhindert seitliches Schieben. */
  --horizont-breite: 620%;
  /* Breite der Wasserflaeche, ebenfalls bezogen auf die Logobreite */
  --wasser-breite: 220%;
}

/* --- Kleine Markenmarke fuer Produktseiten -------------------------------- */
/* Dieselbe Mechanik wie .marke (Wasser, Horizont, Spiegelung, Lichtband),
   nur mit einem Schriftzug statt der Bildmarke und deutlich kleiner. Der
   Inhalt fuellt hier sein eigenes viewBox randlos aus, darum kein Rand wie
   beim Logo. */
/* Er tritt allein ueber die GROESSE zurueck, nicht ueber die Schrift.

   Ein Zwischenversuch sperrte stattdessen die Buchstaben weit auseinander
   (letter-spacing 13 im SVG) und dimmte die Deckkraft. Das war falsch
   herum: gesperrt zog sich der Schriftzug ueber die ganze Breite und wurde
   dadurch erst recht dominant, waehrend Spiegelung, Horizont und Wasser
   darunter auf einen flachen Streifen zusammenschrumpften — also genau das
   Gegenteil des Gewollten. Eng gesetzt und klein bleibt der Effekt
   beisammen, und die Ueberschrift ordnet sich unter. NICHT aufsperren. */
.marke--produkt{
  /* --logo-breite steht am .produktkopf, siehe dort: sie gilt fuer den
     Schriftzug UND die Bildmarke davor. */
  /* Zurueckgenommen wird ueber die HELLIGKEIT, nicht ueber die Sperrung:
     der Schriftzug soll dem Wortzug "iCOGNIZE" auf der Seite davor
     aehneln, und der steht dort flach und grau (rgba(219,230,238,.5)).
     saturate/contrast nehmen dem Metall den Glanz, ohne die Mechanik
     anzutasten; die Deckkraft nimmt den Rest. Die Buchstaben bleiben eng
     gesetzt — Aufsperren macht den Schriftzug breit und damit auffaelliger,
     nicht ruhiger. */
  opacity:.72;
  filter:saturate(.55) contrast(.78) brightness(1.04);
  --rand-h: 0%;
  --rand-b: 0%;
  --inhalt-b: 100%;
  /* Kein Bildzeichen ueber dem Schriftzug, das die Spiegelung nach unten
     druecken wuerde — der Ausgleich faellt darum deutlich kleiner aus als
     bei .marke. */
  --marke-y: calc(var(--logo-breite) * -.12);
}

.marke__logo,
.marke__glanz,
.marke__spiegel{ display:block; width:100%; height:auto; overflow:visible; }

/* Das Lichtband liegt deckungsgleich ueber dem Logo. */
.marke__glanz{
  position:absolute; inset:0;
  height:100%;
  pointer-events:none;
}

/* --- Das Logo als Eingang ------------------------------------------------- */
/* Der Verweis umschliesst nur Logo und Lichtband. Seine Flaeche ist damit
   genau der Kasten des Logos — die Spiegelung im Wasser loest nichts aus.
   Kein position hier: die absolut gesetzten Ebenen sollen sich weiter auf
   .marke beziehen. */

.marke__tor{
  display:block;
  line-height:0;
  cursor:pointer;
  text-decoration:none;
  -webkit-tap-highlight-color:transparent;
}

.marke__tor:focus-visible{
  outline:2px solid rgba(120,220,255,.75);
  outline-offset:14px;
  border-radius:8px;
}

/* Der Schein hinter dem Logo. z-index:-1 setzt ihn hinter die Bildmarke;
   .marke bildet wegen seines transform den Stapelzusammenhang, weiter nach
   hinten als bis dorthin kann er also nicht rutschen.

   Es ist wieder eine weichgezeichnete Kopie des Logos — aber mit sehr viel
   groesseren Radien als beim ersten Versuch. Die Form ist erkennbar, die
   Kante nicht. Ein formloser Farbverlauf dazwischen hatte mit dem Logo
   nichts mehr zu tun; die enge Fassung sah aus wie ein Aufkleber.

   overflow:visible ist noetig — der Hof reicht weit ueber den viewBox
   hinaus und wuerde sonst am Rand des Logokastens abgeschnitten.

   will-change haelt das gefilterte Bild auf einer eigenen Ebene bereit.
   Ohne das rechnet der Browser die beiden Unschaerfen erst beim ersten
   Ueberfahren — der Schein setzte dann sichtbar verspaetet ein. */
.marke__schein{
  position:absolute; inset:0; z-index:-1;
  width:100%; height:100%;
  overflow:visible;
  pointer-events:none;
  opacity:0;
  transition:opacity .32s ease;
  /* Kein mix-blend-mode. Frueher stand hier screen, mit dem Argument, Licht
     solle hinzukommen statt zuzudecken. Das galt, solange der Schein blau
     war. Weisses Licht auf normalem Weg kann ebenfalls nur aufhellen — der
     Unterschied ist gemessen kleiner als 7 von 255 in einem einzigen Kanal
     und betrifft keinen einzigen Bildpunkt sichtbar, waehrend screen rund
     8 % Bildrate kostet. */
  will-change:opacity;
}

/* Aufhellung des Metalls und Widerschein auf dem Wasser: ebenfalls nur
   ein- und ausgeblendet. */
.aufhellung{
  opacity:0;
  transition:opacity .3s ease;
}

.marke__schein-wasser{
  position:absolute;
  left:50%; transform:translateX(-50%);
  top:calc(100% - var(--rand-h) + var(--horizont));
  width:min(170%, 94vw);
  height:76%;
  pointer-events:none;
  opacity:0;
  transition:opacity .42s ease;
  /* screen statt normal: Licht kommt hinzu, es deckt nicht zu. */
  mix-blend-mode:screen;
  background:radial-gradient(56% 58% at 50% 4%,
    rgba(255,255,255,.26) 0%, rgba(232,246,255,.13) 32%,
    rgba(180,220,245,.045) 58%, transparent 80%);
}

/* Nur dort, wo es einen Mauszeiger gibt. Auf dem Telefon bleibt ein
   :hover nach dem Antippen haengen — der Schein bliebe dann stehen. */
@media (hover:hover){
  .marke__tor:hover .marke__schein{ opacity:.85; }
  .marke__tor:hover .aufhellung{ opacity:.08; }
  .marke:has(.marke__tor:hover) .marke__schein-wasser{ opacity:1; }
  .marke:has(.marke__tor:hover) .marke__horizont{ opacity:1; }
}

/* Der Tastaturweg zeigt denselben Zustand — sonst waere die Seite mit der
   Tastatur bedienbar, aber nicht lesbar. */
.marke__tor:focus-visible .marke__schein{ opacity:.85; }
.marke__tor:focus-visible .aufhellung{ opacity:.08; }
.marke:has(.marke__tor:focus-visible) .marke__schein-wasser{ opacity:1; }
.marke:has(.marke__tor:focus-visible) .marke__horizont{ opacity:1; }

/* Wer Bewegung reduziert haben moechte, bekommt den Schein ohne Uebergang. */
@media (prefers-reduced-motion:reduce){
  .marke__schein,.aufhellung,.marke__schein-wasser{ transition:none; }
}

/* --- Horizont, Spiegelung und Wasseroberflaeche --------------------------- */

.marke__horizont{
  position:absolute;
  /* Deutlich breiter als das Logo, aber nie breiter als der Bildschirm —
     sonst laesst sich die Seite auf dem Telefon seitlich schieben. */
  left:50%; transform:translateX(-50%);
  width:min(var(--horizont-breite), 96vw);
  top:calc(100% - var(--rand-h) + var(--horizont));
  height:1px;
  pointer-events:none;
  /* Ruhewert leicht unter 1, damit die Linie beim Ueberfahren des Logos
     ein wenig mitgeht. */
  opacity:.82;
  transition:opacity .42s ease;
  /* Zurueckhaltend: die Linie soll die Wasserflaeche andeuten, nicht
     behaupten. Sie reicht weit ueber das Logo hinaus und laeuft an beiden
     Enden vollstaendig aus. */
  background:linear-gradient(to right,
    transparent 0%, rgba(0,152,204,.04) 14%, rgba(90,185,225,.14) 32%,
    rgba(150,220,248,.26) 50%,
    rgba(90,185,225,.14) 68%, rgba(0,152,204,.04) 86%, transparent 100%);
}

/* Die Spiegelung: dasselbe Logo, gekippt, gedaempft, weich und nach unten
   ausgeblendet. Sie steht still — eine bewegte Wasserflaeche haette dieselbe
   Bildrate gekostet, die wir gerade zurueckgewonnen haben.

   Der Verlauf als Maske blendet sie zum Horizont hin ein. Achtung auf die
   Richtung: die Maske wirkt im ungekippten Zustand, das Kippen kommt danach —
   deshalb liegt das Undurchsichtige unten im Verlauf und erscheint oben. */
.marke__spiegel{
  position:absolute;
  left:var(--rand-b);
  width:var(--inhalt-b);
  top:calc(100% - var(--rand-h) + var(--horizont) + var(--spiegel-abstand));
  /* Um die Mitte kippen, nicht um die Oberkante: sonst klappt die Spiegelung
     nach oben ueber das Logo statt nach unten unter den Horizont. */
  transform:scaleY(-1);
  opacity:.28;
  /* Der Wasserfilter verzerrt die Spiegelung, die Weichzeichnung nimmt ihr
     die Schaerfe. Reihenfolge zaehlt: erst verzerren, dann weichzeichnen. */
  filter:url(#ic-wasser) blur(.7px) saturate(.85);
  pointer-events:none;
  -webkit-mask-image:linear-gradient(to bottom,
    transparent 0%, rgba(0,0,0,.10) 34%, rgba(0,0,0,.45) 72%, #000 100%);
          mask-image:linear-gradient(to bottom,
    transparent 0%, rgba(0,0,0,.10) 34%, rgba(0,0,0,.45) 72%, #000 100%);
}

/* Auf den Produktseiten heisst der Wasserfilter anders (eigene, kleinere
   Filterdefinition im Markup der jeweiligen Seite) — ohne diese Regel liefe
   .marke__spiegel dort ins Leere und die Spiegelung bliebe unverzerrt. */
.marke--produkt .marke__spiegel{ filter:url(#pm-wasser) blur(.7px) saturate(.85); }

/* --- Das wandernde Lichtband --------------------------------------------- */
/* Leicht geneigt, das laesst die Oberflaeche metallischer wirken als ein
   senkrechter Streifen. Es laeuft einmal durch und wartet dann. */

.glanz{
  transform:translateX(0) skewX(-12deg);
  /* Verzoegerung, damit der erste Durchlauf nicht in den Seitenaufbau faellt —
     dort ruckelt er sonst sichtbar. */
  animation:glanz var(--glanz-dauer) cubic-bezier(.33,0,.25,1) var(--glanz-start) infinite;
  will-change:transform;
}

@keyframes glanz{
  0%        { transform:translateX(0)    skewX(-12deg); }
  18%, 100% { transform:translateX(175%) skewX(-12deg); }
}

/* Die Spiegelung hat einen engeren viewBox als das Logo (ohne den Rand fuer
   den Schatten), und ihr Lichtband ist breiter. Prozentwerte beziehen sich
   auf den jeweiligen viewBox — ohne eigene Kurve liefe das Band der
   Spiegelung langsamer und geriete gegenueber dem Original aus dem Tritt.

   Hergeleitet, damit beide Bandmitten in derselben Logospalte stehen:
     Logo:     Mitte = -255 + t2 x 876,21
     Spiegel:  Mitte = -265 + t1 x 736,21
     gleichgesetzt  ->  t1 = 0,0136 + t2 x 1,19016
   t2 laeuft von 0 auf 175 %, also t1 von 1,4 % auf 209,6 %. */
.marke__spiegel .glanz{ animation-name:glanz-spiegel; }

@keyframes glanz-spiegel{
  0%        { transform:translateX(1.4%)   skewX(-12deg); }
  18%, 100% { transform:translateX(209.6%) skewX(-12deg); }
}

/* --- Punkteraster --------------------------------------------------------- */
/* Liegt als eigene Ebene hinter dem Inhalt und ueber der Grundfarbe. Fest im
   Bild, nicht mitscrollend — es ist Raum, kein Inhalt. */

.raster{
  position:fixed; inset:0;
  width:100%; height:100%;
  display:block;
  z-index:0;
  pointer-events:none;      /* der Zeiger gehoert dem Inhalt */
  opacity:0;
  animation:raster-auf 1.6s ease .2s forwards;
}
@keyframes raster-auf{ from{ opacity:0 } to{ opacity:1 } }

@media (prefers-reduced-motion:reduce){
  .raster{ animation:none; opacity:1; }
}

/* --- Geruest der Seite hinter dem Logo ------------------------------------ */
/* Bewusst schmal gehalten: die Seite hat noch keinen Inhalt, sie soll
   deshalb auch nicht so tun als haette sie einen. */

.baustelle{
  position:relative; z-index:1;
  flex:1;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:1.1rem;
  padding:3rem 1.5rem;
  text-align:center;
}

/* Gross und fett, aber zurueckgenommen: die Wortmarke traegt die Seite,
   soll aber nicht mit der Aussage darunter um Aufmerksamkeit streiten.
   Deshalb Deckkraft statt voller Helligkeit — sie steht wie eingelassen in
   der Flaeche, nicht darauf. Die Sperrung faellt bei dieser Groesse enger
   aus als vorher, sonst zerfaellt das Wort. */
/* Bildmarke und Schriftzug in einer Zeile. inline-flex statt einfachem
   Text, damit das Zeichen mittig zur Schrift sitzt und mit ihr waechst —
   seine Hoehe ist in em angegeben. Die Sperrung sitzt auf dem WORT, nicht
   auf dem Verweis: sonst bekaeme auch der Abstand zwischen Zeichen und Wort
   die .24em ab. */
.baustelle__marke{
  display:inline-flex; align-items:center; gap:.30em;
  font-size:clamp(1.9rem,6.5vw,3.6rem);
  font-weight:700;
  line-height:1.05;
  color:rgba(219,230,238,.5);
  text-decoration:none;
  margin-bottom:1.9rem;
  transition:color .3s ease, text-shadow .3s ease;
}

.baustelle__wort{
  position:relative;              /* Bezug fuer das Markenzeichen */
  letter-spacing:.24em;
  /* Hinter dem letzten Buchstaben steht noch eine Sperrung; sie wieder
     abziehen, sonst sitzt die Zeile sichtbar links von der Mitte. */
  margin-right:-.24em;
}

.baustelle__zeichen{
  display:block;
  height:1.32em; width:auto;
  flex:none;
}
/* Das Markenzeichen sitzt oben rechts an der Schrift, nicht auf der
   Grundlinie. Absolut gesetzt statt ueber vertical-align: so haengt seine
   Hoehe nicht an der eigenen Schriftgroesse, es waechst die Zeilenbox nicht
   auf und die Mitte des Schriftzugs bleibt die Mitte der BUCHSTABEN — ein
   Zeichen, das die Zentrierung verschiebt, faellt sofort auf.
   Fuer Vorlesesoftware ausgeblendet; der Verweis hat ueber aria-label eine
   eigene Beschriftung. */
.marke__tm{
  position:absolute;
  left:100%; top:-.02em;
  margin-left:-.10em;
  font-size:.30em;
  letter-spacing:0;
  line-height:1;
  opacity:.8;
}

.baustelle__marke:hover,
.baustelle__marke:focus-visible{
  color:rgba(214,240,255,.9);
  text-shadow:0 0 30px rgba(95,212,255,.35);
}

.baustelle__titel{
  margin:0;
  font-size:clamp(1.35rem,4vw,2rem);
  font-weight:500;
  letter-spacing:.01em;
}

.baustelle__text{
  margin:0;
  max-width:34rem;
  color:var(--gedaempft);
  /* Groesser und kursiv: der Satz ist kein Beiwerk, sondern die Aussage
     der Seite. Kursiv setzt ihn vom Titel darueber ab, ohne ihm mit noch
     mehr Gewicht Konkurrenz zu machen.
     clamp und nicht ein fester Wert, damit er auf schmalen Geraeten nicht
     ueber die Trommel hinauswaechst — und weil die Seite als EIN Bild ohne
     Rollen gedacht ist: jede zusaetzliche Zeile hier kostet unten Platz. */
  font-size:clamp(1.02rem, 1.9vw, 1.22rem);
  font-style:italic;
  line-height:1.55;
  /* pre-line: gesetzte Zeilenenden gelten, mehrfache Leerzeichen nicht.
     Damit kann der Umbruch im Text stehen statt als <br> im HTML. */
  white-space:pre-line;
}

.baustelle__wege{
  margin:1rem 0 0;
  display:flex; flex-wrap:wrap; gap:.8rem 1.6rem;
  align-items:center; justify-content:center;
}

.baustelle__taste{
  display:inline-block;
  padding:.6rem 1.3rem;
  border:1px solid rgba(78,192,230,.42);
  border-radius:3px;
  color:var(--schrift); text-decoration:none;
  transition:border-color .25s ease, box-shadow .25s ease, color .25s ease;
}
.baustelle__taste:hover,
.baustelle__taste:focus-visible{
  color:#bfeaff;
  border-color:rgba(120,220,255,.8);
  box-shadow:0 0 24px rgba(0,152,204,.22);
}

.baustelle__zurueck{
  color:var(--gedaempft); text-decoration:none;
  border-bottom:1px solid transparent;
}
.baustelle__zurueck:hover,
.baustelle__zurueck:focus-visible{
  color:var(--schrift); border-bottom-color:var(--linie);
}

/* --- Liste auf der Bereichsseite ------------------------------------------ */
/* Nur dort gebraucht, wo eine Bereichsseite schon auf vorhandene Unterseiten
   zeigen kann — bisher allein auf produkte.html. */

.bereich__liste-titel{
  margin:1.6rem 0 .5rem;
  color:var(--gedaempft);
  font-size:.92rem;
}
.bereich__liste{
  list-style:none;
  margin:0 0 .4rem;
  padding:0;
  display:flex; flex-wrap:wrap; justify-content:center;
  gap:.5rem 1.6rem;
}
.bereich__liste a{
  color:var(--schrift);
  text-decoration:none;
}
/* Nicht mehr nur ein Wort in einer Zeile: auf produkte.html traegt jeder
   Verweis jetzt zusaetzlich die Geraeteumrisse darunter. Der Name behaelt
   seine eigene Unterstreichung beim Zeigen/Fokussieren (dafuer jetzt auf
   dem <span>, nicht mehr auf dem <a> — sonst liefe die Linie unter dem Bild
   mit durch); das Bild bekommt stattdessen einen staerkeren Schein. */
.bereich__liste a{
  display:flex; flex-direction:column; align-items:center;
  gap:.8rem;
  padding:.4rem;
}
.bereich__liste-name{
  border-bottom:1px solid transparent;
  transition:color .25s ease, border-color .25s ease;
}
.bereich__liste a:hover .bereich__liste-name,
.bereich__liste a:focus-visible .bereich__liste-name{
  color:#bfeaff;
  border-bottom-color:rgba(120,220,255,.45);
}

/* Die Geraeteumrisse: dieselbe Hausfarbe wie die Schein-Marker anderswo
   (--blau-hell), mit einem ruhigen, staendig sichtbaren Schein — anders als
   bei den fremden Referenzlogos gibt es hier keine fremde Marke zu
   zuegeln, das Bild darf also von Anfang an leuchten. Beim Zeigen mit der
   Maus oder Fokussieren legt sich derselbe Schein noch eine Stufe kraeftiger
   darueber und das Bild hebt sich minimal an. */
.bereich__liste-bild{
  display:block;
  width:auto; height:5.5rem;
  max-width:100%;
  filter:drop-shadow(0 0 4px rgba(78,192,230,.65)) drop-shadow(0 0 11px rgba(0,152,204,.4));
  transition:filter .3s ease, transform .25s ease;
}
@media (hover:hover){
  .bereich__liste a:hover .bereich__liste-bild{
    filter:drop-shadow(0 0 7px rgba(78,192,230,.95)) drop-shadow(0 0 18px rgba(0,152,204,.6));
    transform:translateY(-2px);
  }
}
.bereich__liste a:focus-visible .bereich__liste-bild{
  filter:drop-shadow(0 0 7px rgba(78,192,230,.95)) drop-shadow(0 0 18px rgba(0,152,204,.6));
  transform:translateY(-2px);
}
@media (prefers-reduced-motion:reduce){
  .bereich__liste-bild{ transition:none; }
}

/* --- Produktwahl-Rad -------------------------------------------------------*/
/* Ersetzt auf dieser Seite den fruecheren Text-Reiter "Produkte". Drei echte
   Verweise (funktionieren also auch ganz ohne Javascript, nur ohne die
   Radoptik — siehe die Regeln unten fuer :not(.radwahl--bereit)) stehen wie
   auf einer Trommel im Raum; das Mausrad blaettert hindurch, die Trommel
   rastet auf dem naechsten Produkt ein. Ziehen mit Maus oder Finger tut
   dasselbe, fuer Geraete ohne Mausrad. */
.radwahl{
  position:relative; z-index:1;
  width:min(100%, 26rem);
  /* Luft nach oben und unten: die Trommel greift durch die starke Kippung
     weit aus und soll den Waegen darueber und der Fusszeile darunter nicht
     zu nahe kommen. */
  margin:2.8rem 0 1.6rem;
}
/* Buehne: haelt Fenster und Pfeile zusammen und ist der Bezug fuer deren
   Platzierung. Noetig, weil die Ausblendmaske des Fensters alles mitnimmt,
   was darin liegt — die Pfeile muessen also daneben stehen, nicht darin. */
.radwahl__buehne{
  position:relative;
  /* Hoeher als das frueher 12,5rem hohe Fenster: die staerker gekippte
     Trommel greift weiter aus, und die Pfeile brauchen oben und unten Luft,
     ohne dem nachbarn ins Wort zu fallen. */
  height:18rem;
}

.radwahl__fenster{
  position:absolute; inset:0;
  /* Kraeftigere Perspektive als zuvor (54rem): je kleiner der Wert, desto
     staerker die Fluchtung — erst damit sieht man eine Trommel und nicht
     eine Liste, die sich ein wenig neigt. Der Winkel je Feld steht in
     radwahl.js. */
  perspective:26rem;
  perspective-origin:50% 50%;
  -webkit-user-select:none; user-select:none;
  touch-action:pan-x;
  cursor:ns-resize;
  -webkit-mask-image:linear-gradient(to bottom,
    transparent 0%, #000 22%, #000 78%, transparent 100%);
          mask-image:linear-gradient(to bottom,
    transparent 0%, #000 22%, #000 78%, transparent 100%);
}

/* --- Die beiden Pfeile ------------------------------------------------- */
/* Stehen ueber der oberen und unter der unteren Linie und tun dasselbe wie
   die Pfeiltasten. Am obersten bzw. untersten Feld schalten sie sich ab und
   zeigen damit nebenbei, dass die Trommel Enden hat. */
.radwahl__pfeil{
  position:absolute; left:50%;
  transform:translateX(-50%);
  z-index:2;
  width:3.2rem; height:1.7rem;
  display:flex; align-items:center; justify-content:center;
  padding:0;
  background:none; border:0; border-radius:3px;
  color:var(--gedaempft);
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
  transition:color .25s ease, opacity .25s ease, transform .25s ease;
}
.radwahl__pfeil svg{ width:1.5rem; height:auto; display:block; }
.radwahl__pfeil--auf{ top:0; }
.radwahl__pfeil--ab { bottom:0; }

@media (hover:hover){
  .radwahl__pfeil:hover:not(:disabled){ color:#bfeaff; }
  .radwahl__pfeil--auf:hover:not(:disabled){ transform:translate(-50%,-2px); }
  .radwahl__pfeil--ab:hover:not(:disabled){ transform:translate(-50%,2px); }
}
.radwahl__pfeil:focus-visible{
  outline:2px solid rgba(120,220,255,.75);
  outline-offset:3px;
}
.radwahl__pfeil:disabled{
  opacity:.22;
  cursor:default;
}

/* Ohne Javascript gibt es keine Trommel — dann sind die Pfeile sinnlos. */
.radwahl:not(.radwahl--bereit) .radwahl__pfeil{ display:none; }
.radwahl__feld{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  text-align:center;
  text-decoration:none;
  font-weight:700;
  font-size:clamp(1.35rem,4.4vw,1.95rem);
  letter-spacing:.01em;
  color:var(--gedaempft);
  backface-visibility:hidden;
  -webkit-tap-highlight-color:transparent;
  transition:transform .5s cubic-bezier(.22,1,.36,1), opacity .5s ease,
             color .3s ease, text-shadow .3s ease;
}
/* Waehrend des Ziehens bzw. eines Mausrad-Schubs folgt das Feld direkt dem
   Zeiger, ohne den Uebergang hinterherzuruckeln. Erst das Einrasten am Ende
   bekommt wieder die weiche Kurve. */
.radwahl--zieht .radwahl__feld{ transition:none; }

.radwahl__feld--aktiv{
  color:#eaf7ff;
  text-shadow:0 0 12px rgba(78,192,230,.8), 0 0 26px rgba(0,152,204,.45);
}
@media (hover:hover){
  .radwahl__feld:hover:not(.radwahl__feld--aktiv){ color:#a9c8d8; }
}
.radwahl__feld:focus-visible{
  outline:2px solid rgba(120,220,255,.75);
  outline-offset:6px;
  border-radius:6px;
}

.radwahl__linie{
  position:absolute; left:6%; right:6%; height:1px;
  pointer-events:none;
  background:linear-gradient(to right,
    transparent 0%, rgba(120,220,255,.35) 50%, transparent 100%);
}
/* Der Abstand der beiden Linien muss zur Schriftgroesse passen — und zur
   Konstanten BAND in radwahl.js, die entscheidet, welcher Klick als "vorne
   stehendes Feld oeffnen" gilt. Wer hier dreht, dreht dort mit. */
.radwahl__linie--oben{ top:calc(50% - 2.75rem); }
.radwahl__linie--unten{ top:calc(50% + 2.75rem); }

.radwahl__hinweis{
  margin:.9rem 0 0;
  font-size:.82rem;
  color:var(--gedaempft);
}

/* Ohne Javascript — oder solange radwahl.js noch nicht gelaufen ist — liegt
   hier eine ganz gewoehnliche, senkrechte Liste aus drei Verweisen. Die
   Radoptik ist ein Zusatz, kein Ersatz fuer die eigentliche Navigation. */
.radwahl:not(.radwahl--bereit) .radwahl__buehne{ height:auto; }
.radwahl:not(.radwahl--bereit) .radwahl__fenster{
  position:static; height:auto; perspective:none; cursor:auto;
  -webkit-mask-image:none; mask-image:none;
  display:flex; flex-direction:column; gap:.3rem;
}
.radwahl:not(.radwahl--bereit) .radwahl__feld{
  position:static; transform:none !important; opacity:1; color:var(--schrift);
  padding:.4rem 0;
}
.radwahl:not(.radwahl--bereit) .radwahl__linie{ display:none; }

@media (prefers-reduced-motion:reduce){
  .radwahl__feld{ transition:opacity .3s ease, color .3s ease, text-shadow .3s ease; }
}

/* --- Uebergang: ins Licht eintauchen -------------------------------------- */
/* Der Klick auf das Logo fuehrt nicht einfach auf die naechste Seite. Der
   Schein, den der Zeiger andeutet, flammt auf, das Logo waechst dem
   Betrachter entgegen, und das Licht ueberstrahlt die Flaeche. Die neue Seite
   tritt aus demselben Licht wieder hervor.

   Der Schleier wird von site.js erzeugt und nicht im HTML vorgehalten: ohne
   JavaScript gibt es keinen Uebergang, dann soll auch nichts im Weg liegen.

   Bewusst kein reines Weiss und keine volle Bildschirmhelligkeit als Blitz —
   ein Aufblitzen auf dunklem Grund ist unangenehm und fuer empfindliche
   Menschen ein echtes Problem. Das Licht ist hellblau und kommt aus der
   Mitte, wo das Logo steht. */

/* HIER STEHT BEWUSST KEIN RADIALVERLAUF.

   Ein Radialverlauf hat in seiner Mitte einen Radius von null. Firefox
   rechnet genau diesen einen Bildpunkt falsch und malt ihn dunkel — auf
   heller Flaeche ein schwarzer Punkt, immer an derselben Stelle.

   Nachgemessen an Alexanders Bildschirmfoto: der Punkt lag auf 1 Bildpunkt
   genau in der waagerechten Mitte des Seiteninhalts — also im Mittelpunkt
   des Verlaufs, nicht in der Bildmitte (die liegt wegen der Rollleiste 7
   Punkte weiter rechts). Damit war es eindeutig der Verlauf. Eine deckende
   Farbe darunter half nicht: Firefox malt dort keine Luecke, sondern eine
   falsche Farbe.

   Das Licht kommt jetzt aus einer deckenden Grundfarbe mit zwei
   ueberlagerten LINEAREN Verlaeufen, die zu den Raendern hin abdunkeln.
   Die haben keinen Mittelpunkt und damit auch keine Rechenstelle, an der
   etwas schiefgehen kann. Der Eindruck bleibt fast derselbe. */
/* Nur fuer den Bruchteil EINES Bildes gesetzt, von uebergang.js im
   pageshow-Empfaenger. Hintergrund: kommt eine Seite aus dem Seitenspeicher
   des Browsers zurueck, traegt sie noch die Klasse, mit der sie verlassen
   wurde (alles auf Deckkraft null). Nimmt man die Klasse einfach ab, laufen
   die zugehoerigen UEBERGAENGE rueckwaerts ab — die Trommel faehrt eine
   halbe Sekunde lang wieder herein, waehrend darueber der schwarze Schleier
   abblendet. Zwei Bewegungen uebereinander. Diese Regel setzt die Uebergaenge
   fuer ein Bild aus, damit das Abnehmen ein Sprung ist und nicht selbst eine
   Bewegung. Bewusst nur `transition`, nicht `animation`: der wandernde Glanz
   auf dem Schriftzug ist eine Animation und wuerde sonst neu anfangen. */
html.ohne-bewegung *{ transition:none !important; }

.uebergang{
  position:fixed; inset:0; z-index:70;
  pointer-events:none;
  opacity:0;
  /* KEIN Radialverlauf mehr — siehe die Erklaerung ueber .uebergang. */
  background-color:#e7f6ff;
  background-image:
    linear-gradient(to right,  rgba(150,200,224,.55), rgba(150,200,224,0) 46%,
                               rgba(150,200,224,0) 54%, rgba(150,200,224,.55)),
    linear-gradient(to bottom, rgba(150,200,224,.5) 0%, rgba(150,200,224,0) 38%,
                               rgba(150,200,224,0) 48%, rgba(150,200,224,.62) 100%);
}
.uebergang--hin{ animation:uebergang-hin .46s cubic-bezier(.5,0,.78,.46) forwards; }

/* Der Rueckweg: nach Schwarz, nicht ins Licht. */
.uebergang--schwarz{
  background:var(--grund);
  animation:uebergang-schwarz .34s ease forwards;
}
@keyframes uebergang-schwarz{ from{ opacity:0 } to{ opacity:1 } }

/* Die Ebene beim ANKOMMEN steht als leeres Element IM HTML und ist im
   Ruhezustand abgeschaltet. Sie muss schon im allerersten Bild der neuen
   Seite liegen: reicht ein Skript sie nach, sieht man dazwischen kurz die
   fertige Seite — Licht, Seite, wieder Licht. Genau das war der doppelte
   Blitz. uebergang.js setzt deshalb nur die Klasse an <html>, und zwar oben
   im Kopf, bevor der Koerper gelesen ist.

   Bewusst ein Element und kein Pseudoelement der Wurzel (html::after): dort
   blieb in Firefox ein einzelner dunkler Punkt im Bild stehen. */
.ankunft{
  position:fixed; inset:0; z-index:70;
  pointer-events:none;
  display:none;
}

/* Nur zur Fehlersuche, ueber ?probe=1 in der Adresse: derselbe Schleier,
   aber stehend. */
html.probe .ankunft{
  display:block;
  opacity:.55;
  /* KEIN Radialverlauf mehr — siehe die Erklaerung ueber .uebergang. */
  background-color:#e7f6ff;
  background-image:
    linear-gradient(to right,  rgba(150,200,224,.55), rgba(150,200,224,0) 46%,
                               rgba(150,200,224,0) 54%, rgba(150,200,224,.55)),
    linear-gradient(to bottom, rgba(150,200,224,.5) 0%, rgba(150,200,224,0) 38%,
                               rgba(150,200,224,0) 48%, rgba(150,200,224,.62) 100%);
}
html.aus-dem-licht .ankunft{
  display:block;
  /* KEIN Radialverlauf mehr — siehe die Erklaerung ueber .uebergang. */
  background-color:#e7f6ff;
  background-image:
    linear-gradient(to right,  rgba(150,200,224,.55), rgba(150,200,224,0) 46%,
                               rgba(150,200,224,0) 54%, rgba(150,200,224,.55)),
    linear-gradient(to bottom, rgba(150,200,224,.5) 0%, rgba(150,200,224,0) 38%,
                               rgba(150,200,224,0) 48%, rgba(150,200,224,.62) 100%);
  animation:uebergang-her .58s cubic-bezier(.32,.12,.3,1) forwards;
}
html.aus-dem-schwarz .ankunft{
  display:block;
  background:var(--grund);
  animation:uebergang-her .46s ease forwards;
}

html.aus-dem-licht main{ animation:auftauchen .58s cubic-bezier(.32,.12,.3,1) both; }
html.aus-dem-licht .fuss{ animation:auftauchen-fuss .58s ease both; }
html.aus-dem-schwarz main{ animation:auftauchen .5s ease .1s both; }
html.aus-dem-schwarz .fuss{ animation:auftauchen-fuss .5s ease .1s both; }

@keyframes uebergang-hin{ from{ opacity:0 } to{ opacity:1 } }
@keyframes uebergang-her{ from{ opacity:1 } to{ opacity:0 } }

/* Das Logo waechst entgegen. Die Verschiebung aus --marke-y bleibt drin,
   sonst springt es beim Start der Bewegung nach unten. */
body.eintauchen .marke{
  animation:eintauchen-marke .5s cubic-bezier(.5,0,.9,.5) forwards;
}
@keyframes eintauchen-marke{
  from{ transform:translateY(var(--marke-y)) scale(1); }
  to  { transform:translateY(var(--marke-y)) scale(1.28); }
}

/* Der Schein geht sofort voll auf. Der Selektor ist eine Stufe laenger als
   die Regel fuer den Zeiger, sonst gewaenne diese beim Klicken. */
body.eintauchen .marke .marke__schein{
  opacity:1;
  transition:opacity .16s ease;
}

/* Fusszeile und Wasser treten zurueck — das Licht kommt vom Logo. */
body.eintauchen .fuss{ animation:eintauchen-weg .26s ease forwards; }
body.eintauchen .marke__wasser{ animation:eintauchen-weg .34s ease forwards; }
@keyframes eintauchen-weg{ from{ opacity:1 } to{ opacity:0 } }

/* Ankommen: der Inhalt schaelt sich aus dem Licht heraus. */
@keyframes auftauchen{
  from{ opacity:.35; transform:scale(1.035); }
  to  { opacity:1;   transform:none; }
}
@keyframes auftauchen-fuss{ from{ opacity:0 } to{ opacity:1 } }

/* Wer Bewegung reduziert haben moechte, bekommt gar keinen Uebergang —
   site.js springt dann direkt auf die neue Seite. Diese Regel ist die
   zweite Sicherung, falls doch eine Klasse gesetzt wurde. */
@media (prefers-reduced-motion:reduce){
  .uebergang{ display:none; }
  body.eintauchen .marke,
  body.eintauchen .fuss,
  body.eintauchen .marke__wasser,
  html.aus-dem-licht .ankunft,
  html.aus-dem-schwarz .ankunft,
  html.aus-dem-licht main,
  html.aus-dem-schwarz main,
  html.aus-dem-licht .fuss,
  html.aus-dem-schwarz .fuss{ animation:none; }
  html.aus-dem-licht .ankunft,
  html.aus-dem-schwarz .ankunft{ display:none; }
}

/* --- Produktseiten-Geruest ------------------------------------------------ */
/* Kopf mit der kleinen Markenmarke oben, darunter ein knapper Hinweistext
   samt Wegen zurueck — bewusst schmal, damit eine spaeter eingesetzte
   Produktbeschreibung densselben Rahmen wiederverwenden kann. */

/* --- Inhalt einer Bereichsseite ------------------------------------------ */
/* Eine Spalte, linksbuendig, mit einer Zeilenlaenge um die 60 Zeichen — mehr
   liest sich auf einer dunklen Flaeche schlecht. Der .produktinhalt darueber
   ist mittig gesetzt und bleibt fuer die noch leeren Geruestseiten. */
/* Mittig gesetzt wie die Seite, von der aus sie aufgerufen wird: dort steht
   alles in einer schmalen Spalte in der Mitte. Ueberschriften und der
   Leitsatz stehen zentriert, die Absaetze selbst linksbuendig — mehrere
   Zeilen mittig auszurichten liest sich schlecht. */
.bereich{
  /* Wie weit der Schleier ueber die Textspalte hinausreicht. Innerhalb
     dieser Strecke blendet er auf, deshalb steht der Wert unten in der
     Verlaufsangabe noch einmal. */
  --schleier-rand: 4rem;
  position:relative; z-index:1;
  flex:1 1 auto;
  width:min(100% - 3rem, 36rem);
  margin-inline:auto;
  text-align:center;
}

/* EIN SCHLEIER, GENAU SO BREIT WIE DER TEXT.
   Ohne ihn laufen die hellen Punkte des Rasters quer durch die Zeilen, und
   unter mehreren Absaetzen wird der Text unleserlich. Er liegt deshalb NUR
   hinter der Textspalte: links und rechts bleibt der Hintergrund
   vollstaendig sichtbar.

   Zwei Verlaeufe erledigen das. Der eine blendet waagerecht auf, und zwar
   in genau der Strecke, die der Schleier ueber die Spalte hinausragt
   (--schleier-rand). Dadurch ist er dort deckend, wo der erste Buchstabe
   steht, und ausserhalb der Spalte gar nicht mehr vorhanden. Der zweite
   ist eine Maske und nimmt oben und unten die Kante weg, damit der Streifen
   nicht abrupt anfaengt und aufhoert.

   position:absolute, nicht fixed: der Schleier gehoert zum Text und muss
   mit ihm rollen. Er haengt an .bereich und nicht am body, damit ihn nur
   Seiten mit Text bekommen. Weil .bereich mit position und z-index einen
   eigenen Stapelraum aufmacht, liegt das Kind mit z-index:-1 zwar hinter
   dem Text, aber immer noch VOR dem Raster.

   VERWORFEN: ein bildschirmfuellender Radialverlauf. Erst deckte er fast
   alles zu, dann war er schmaler und schwaecher — aber immer lag er auch
   dort, wo gar kein Text steht. */
.bereich::before{
  content:"";
  position:absolute;
  inset:-1.5rem calc(var(--schleier-rand) * -1);
  z-index:-1;
  pointer-events:none;
  background:linear-gradient(to right,
    rgba(7,13,18,0)   0,
    rgba(7,13,18,.80) var(--schleier-rand),
    rgba(7,13,18,.80) calc(100% - var(--schleier-rand)),
    rgba(7,13,18,0)   100%);
  -webkit-mask-image:linear-gradient(to bottom,
    transparent 0, #000 3rem, #000 calc(100% - 3rem), transparent 100%);
  mask-image:linear-gradient(to bottom,
    transparent 0, #000 3rem, #000 calc(100% - 3rem), transparent 100%);
}

/* --- Rollen IN der Spalte statt im Fenster ------------------------------- */
/* Gewuenscht auf der Unternehmensseite: der Rollbalken soll nicht am Rand
   des Browserfensters stehen, sondern in der Textspalte selbst. Die Seite
   wird dafuer auf Fensterhoehe festgesetzt; Schriftzug oben und Fusszeile
   unten stehen still, nur die Spalte dazwischen laeuft durch.

   DREI DINGE, DIE DABEI ZU BEACHTEN SIND

   1. Der Text rollt in einer EIGENEN Ebene (.bereich__rolle), nicht in
      .bereich selbst. Der Schleier haengt naemlich als Pseudoelement an
      .bereich; wuerde dieses Element rollen, wanderte der Schleier mit und
      liesse den durchlaufenden Text unbedeckt. So bleibt er stehen und
      deckt immer genau den sichtbaren Ausschnitt.

   2. min-height:0 ist Pflicht. Flexkinder haben von Haus aus
      min-height:auto und schrumpfen deshalb NICHT unter ihren Inhalt — ohne
      diese Zeile waechst die Spalte einfach weiter und der Rollbalken
      landet wieder am Fenster.

   3. Nur am Rechner. Auf dem Telefon ist ein festgesetztes Fenster
      unangenehm: die Adressleiste klappt nicht mehr weg, und der Finger
      muss den Kasten treffen. Unterhalb von 48rem bleibt deshalb alles
      beim Alten, die Seite rollt dort wie jede andere. */

.bereich__rolle{ padding-bottom:clamp(2.5rem,7vh,4.5rem); }

@media (min-width:48rem){
  body.fest{ height:100svh; overflow:hidden; }

  body.fest .bereich{
    min-height:0;
    display:flex; flex-direction:column;
  }

  body.fest .bereich__rolle{
    flex:1 1 auto;
    min-height:0;
    overflow-y:auto;
    /* Der Platz fuer den Balken wird von Anfang an freigehalten, sonst
       ruckt der Text beim ersten Erscheinen um dessen Breite zur Seite. */
    scrollbar-gutter:stable;
    /* Rollt der Zeiger ueber die Spalte hinaus, soll nicht ploetzlich die
       Seite dahinter wandern. */
    overscroll-behavior:contain;

    /* Luft zwischen Text und Balken. BEIDSEITIG, nicht nur rechts: die
       Spalte steht mittig auf der Seite und der Schleier liegt symmetrisch
       darum. Ein Abstand nur rechts ruecke den Blocksatz sichtbar aus der
       Mitte. Der Preis sind gut zwei Zentimeter weniger Zeilenlaenge, was
       bei 36rem Spaltenbreite nicht auffaellt. */
    padding-inline:1.15rem;
  }

  /* Der Balken in der Handschrift der Seite. Firefox versteht die beiden
     Standardangaben, die auf Chrome und Safari zielenden Regeln darunter
     bleiben dort wirkungslos — beide Wege sind noetig. */
  body.fest .bereich__rolle{
    scrollbar-width:thin;
    scrollbar-color:rgba(120,180,210,.34) transparent;
  }
  body.fest .bereich__rolle::-webkit-scrollbar{ width:8px; }
  body.fest .bereich__rolle::-webkit-scrollbar-track{ background:transparent; }
  body.fest .bereich__rolle::-webkit-scrollbar-thumb{
    background:rgba(120,180,210,.34);
    border-radius:4px;
  }
  body.fest .bereich__rolle::-webkit-scrollbar-thumb:hover{
    background:rgba(140,205,235,.55);
  }

  /* tabindex="0" steht im HTML, damit sich der Bereich mit Bild-ab und den
     Pfeiltasten bedienen laesst — Chrome macht rollbare Kaesten sonst nicht
     erreichbar. Der Rahmen soll dabei nur bei Tastaturbedienung erscheinen. */
  body.fest .bereich__rolle:focus{ outline:none; }
  body.fest .bereich__rolle:focus-visible{
    outline:2px solid var(--blau-hell); outline-offset:2px; border-radius:.3rem;
  }

  /* Der Kopf darf auf einem flachen Fenster weniger Platz nehmen, sonst
     bleibt fuer den Text kaum etwas uebrig. */
  @media (max-height:46rem){
    body.fest .produktkopf{ padding-top:clamp(1.2rem,4vh,2.5rem); padding-bottom:1rem; }
  }
}

/* Der Schatten steht statt eines dichteren Schleiers: er trennt die
   Buchstaben vom wandernden Raster, ohne den Hintergrund zuzudecken. */
.bereich__leitsatz,
.bereich__titel,
.bereich__teil p,
.bereich__zeit li{ text-shadow:0 1px 4px rgba(4,9,13,.9), 0 0 14px rgba(4,9,13,.7); }

.bereich__leitsatz{
  margin:0 0 2.4rem;
  font-size:clamp(1.1rem,2.6vw,1.3rem);
  line-height:1.6;
  color:#dbe6ee;
}

.bereich__teil{ margin:0 0 2.2rem; }

/* --- Die Leistungsseite: Text und Zeichnung nebeneinander ------------------ */
/* Die Spalte ist hier breiter als sonst (36rem). Der Grund ist nicht Geschmack,
   sondern Rechnung: neben dem Text steht eine Zeichnung, beide teilen sich die
   Breite, und bei 36rem blieben fuer den Text keine 18rem — das sind rund
   fuenfunddreissig Zeichen je Zeile und damit deutlich unter dem, was sich
   angenehm liest. */
.bereich--leistungen,
.bereich--chronik{ width:min(100% - 3rem, 54rem); }

.leistung,
.chronik{
  display:grid;
  gap:1rem 2rem;
  align-items:center;
  margin-bottom:clamp(2.4rem, 6vh, 3.6rem);
}

/* Erst ab dieser Breite nebeneinander. Darunter steht die Zeichnung ueber dem
   Text — nicht daneben und geschrumpft, denn eine Strichzeichnung, die auf
   Daumenbreite zusammenfaellt, ist keine Illustration mehr, sondern Schmutz. */
@media (min-width:44rem){
  .leistung,
  .chronik{ grid-template-columns:1fr 1fr; }
  /* Jede zweite gedreht: sonst laeuft das Auge sechsmal denselben Weg, und die
     Seite wirkt wie eine Tabelle. */
  .leistung--gedreht .leistung__bild,
  .chronik--gedreht .chronik__bild{ order:2; }
}

.leistung__bild{
  margin:0;
  border-radius:6px;
  border:1px solid var(--linie);
  background:var(--grund-2);
  overflow:hidden;
}

.leistung__bild img{
  display:block;
  width:100%; height:auto;
}

/* Links, nicht mittig. .bereich setzt fuer die ganze Seite text-align:center —
   das ist fuer Leitsatz und Wege richtig, fuer einen Absatz von drei Zeilen
   aber nicht: zentrierter Fliesstext zwingt das Auge, den Zeilenanfang jedes
   Mal neu zu suchen.

   UND LINKSBUENDIG STATT BLOCKSATZ. .bereich__teil p setzt Blocksatz, und auf
   einer Seite mit voller Spaltenbreite ist das richtig. Hier steht der Text
   aber nur auf der halben Breite neben einer Zeichnung — rund fuenfundvierzig
   Zeichen je Zeile. Blocksatz zieht dann die Wortabstaende auf und reisst
   helle Gassen durch den Absatz, gemessen bis zur dreifachen Wortluecke.
   Silbentrennung bleibt an; sie hilft auch im Flattersatz gegen kurze
   Zeilen. */
.leistung__text,
.chronik__text{ text-align:left; }

/* ZWEI KLASSEN IM WAEHLER, und das ist kein Versehen. .bereich__teil p steht
   WEITER UNTEN in dieser Datei und setzt dort Blocksatz. Bei gleicher
   Spezifitaet gewinnt die spaetere Regel — ein schlichtes .leistung__text p
   blieb deshalb wirkungslos, obwohl es richtig aussah. Entweder man
   verschiebt den ganzen Block hinter den anderen, oder man haengt eine
   Klasse mehr davor. Das zweite ist haltbarer: es ueberlebt auch das
   naechste Umsortieren der Datei. */
.leistung .leistung__text p,
.chronik .chronik__text p{ margin:0 0 .7rem; text-align:left; }
.chronik .chronik__text p:last-child{ margin-bottom:0; }

/* Der Wirbel als Hintergrund, aber LEISE.
   wirbel.js ist als Schaustueck gebaut: dichte, helle Linienbaender ueber die
   ganze Flaeche. Hinter Fliesstext ist das unlesbar — der Leitsatz stand in
   voller Staerke mitten im Strudel. Die Datei selbst kennt keine Stellschraube
   dafuer (sie stammt aus der Zeit vor den data-Merkmalen), deshalb wird sie
   hier gedaempft, nicht dort umgebaut.

   opacity, nicht filter: die Leinwand wird mit alpha:false gezeichnet, ist
   also deckend. Erst die Durchsicht laesst den dunklen Grund der Seite
   durchschlagen, und genau das nimmt den Baendern die Helligkeit.

   .08 -> .04. Gemessen an einer textfreien Randspalte der fertigen Seite
   faellt die Streuung der Helligkeit damit von 5.1 auf 3.5 — der Wirbel ist
   noch da, traegt die Flaeche aber nicht mehr. Darunter (.03) verschwindet
   er, und dann kann er auch ganz weg. */
.raster.wirbel{ animation-name:raster-auf-leise; }
@keyframes raster-auf-leise{ from{ opacity:0 } to{ opacity:.04 } }

/* Und derselbe Wert, wenn die Einblendung wegfaellt. Die Regel bei
   "Bewegung reduzieren" setzt opacity:1 fuer alle Raster; ohne diese Zeile
   stuende der Wirbel dort wieder in voller Staerke. */
@media (prefers-reduced-motion:reduce){
  .raster.wirbel{ opacity:.04; }
}

/* Der Wandel hinter der Produktseite. Dieselbe Stellschraube wie beim
   Wirbel darueber, nur nicht so weit heruntergedreht: der Wirbel ist eine
   FLAECHE und deckt alles, der Wandel besteht aus duennen Drahtgittern, die
   den Grund grossenteils frei lassen. Bei .04 waere davon nichts mehr zu
   sehen. Wer ihn noch leiser will, dreht hier — und an beiden Stellen
   gleich, sonst springt er bei "Bewegung reduzieren". */
.raster.wandel{ animation-name:raster-auf-wandel; }
@keyframes raster-auf-wandel{ from{ opacity:0 } to{ opacity:.85 } }

@media (prefers-reduced-motion:reduce){
  .raster.wandel{ opacity:.85; }
}

/* Der Schwarm hinter der Informationsseite. Deutlich leiser als der Wandel:
   der besteht aus ruhenden Drahtgittern, der Schwarm aus lauter kleinen
   Flaechen, die staendig in Bewegung sind. Bewegtes zieht den Blick von
   sich aus an und braucht deshalb weniger Deckkraft, um gleich stark zu
   wirken. Die Voegel verblassen ausserdem mit der Entfernung; das steckt im
   Shader und nicht hier, weil es je Vogel verschieden ist. */
.raster.voegel{ animation-name:raster-auf-voegel; }
@keyframes raster-auf-voegel{ from{ opacity:0 } to{ opacity:.6 } }

@media (prefers-reduced-motion:reduce){
  .raster.voegel{ opacity:.6; }
}

/* --- Informationen: das Verzeichnis der Mitteilungen ---------------------- */
/* Schmaler als die Mediathek (60rem): hier steht je Eintrag eine Zeile Text,
   kein Bild. Auf 60rem risse der Titel ueber die ganze Breite und das Datum
   stuende allein am Anfang einer sehr langen Zeile. */
.bereich--informationen{ width:min(100% - 3rem, 52rem); }

/* Die Zeile "Aktuelles zum Unternehmen" aus dem alten Auftritt. Dort war sie
   die Ueberschrift ueber der Liste; hier ist sie eine Aufschrift darueber,
   denn die Ueberschrift der Seite steht schon im Kopf. Deshalb klein und
   gesperrt statt gross — dieselbe Behandlung wie .netzwerk__titel. */
.infoliste__kopf{
  margin:0 0 1.2rem;
  font-size:.88rem;
  font-weight:600;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--gedaempft);
}

.infoliste{
  list-style:none;
  margin:0 0 clamp(2rem, 5vh, 3rem);
  padding:0;
  display:grid;
  gap:1rem;
}

/* Der ganze Eintrag ist ein Kasten, aber NICHT der ganze Kasten ist der
   Verweis: das Ziel ist ein PDF, das sich in einem neuen Reiter oeffnet.
   Ein Kasten, der beim Klick irgendwo das Fenster wechselt, ueberrascht;
   ein Verweis mit Beschriftung sagt vorher, was kommt. Deshalb hier anders
   als bei den Filmkacheln der Mediathek. */
.infoliste__eintrag{
  padding:1.1rem 1.3rem 1.2rem;
  border:1px solid var(--linie);
  border-radius:8px;
  background:rgba(10,21,29,.5);
}

/* Dasselbe Datum wie in der Chronik und der Mediathek. */
.infoliste__datum{
  display:block;
  margin:0 0 .3rem;
  font-size:.75rem;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--gedaempft);
}

.infoliste__titel{
  margin:0 0 .7rem;
  font-size:clamp(1rem, 2.2vw, 1.12rem);
  font-weight:600;
  line-height:1.4;
  color:var(--schrift);
}

/* KEIN Pfeilzeichen. Erster Versuch war ein "↗" im ::after — das Zeichen
   fehlt in Segoe UI und kam als leeres Kaestchen heraus. Ein Sinnbild, das
   der Schriftschnitt nicht kennt, ist keins. Stattdessen steht jetzt im
   TEXT, was sich oeffnet: "(PDF)". Das laesst sich uebersetzen, wird
   mitvorgelesen und sagt mehr als ein Pfeil, der nur "woandershin"
   bedeutet. */
.infoliste__weg{
  display:inline-flex; align-items:center; gap:.4rem;
  font-size:.92rem;
  color:var(--blau-hell);
  text-decoration:none;
  border-bottom:1px solid transparent;
  transition:border-color .25s, color .25s;
}
.infoliste__weg:hover,
.infoliste__weg:focus-visible{
  color:#fff;
  border-bottom-color:var(--blau-hell);
}

/* --- Die Mediathek: Filme, die auf YouTube liegen ------------------------- */
/* Die Karten VERWEISEN, sie betten nicht ein. Das ist keine Geschmacksfrage:
   ein eingebettetes <iframe> laedt beim Seitenaufbau von Google, greift damit
   auf das Endgeraet zu und braeuchte eine Einwilligung (§ 25 TDDDG) samt
   Abschnitt in der Datenschutzerklaerung. Ein Verweis tut nichts davon — der
   Abruf beginnt erst, nachdem der Besucher geklickt hat und die Seite
   verlassen hat. Deshalb liegen die Vorschaubilder auch im Projekt und
   werden NICHT von img.youtube.com geholt; das waere derselbe Fremdabruf,
   nur unauffaelliger.

   Wer hier spaeter einbetten will: Platzhalter stehenlassen, das <iframe>
   erst nach Einwilligung nachladen (site.js meldet sie ueber
   'icognize:einwilligung'), und die Datenschutzerklaerung ergaenzen. */
.bereich--mediathek{ width:min(100% - 3rem, 60rem); }

.mediathek__raster{
  display:grid;
  align-items:start;
  gap:clamp(1.4rem, 4vw, 2.2rem);
  margin-bottom:clamp(2rem, 5vh, 3rem);
}
@media (min-width:46rem){
  .mediathek__raster{ grid-template-columns:1fr 1fr; }
}

/* Die ganze Karte ist der Verweis, nicht nur der Titel: ein Ziel von der
   Groesse eines Daumens statt eines von der Groesse eines Wortes. */
.film{
  display:block;
  text-align:left;
  text-decoration:none;
  color:inherit;
  border-radius:8px;
}
.film:focus-visible{ outline:2px solid var(--blau-hell); outline-offset:3px; }

.film__bild{
  position:relative;
  display:block;
  aspect-ratio:16 / 9;
  border-radius:6px;
  border:1px solid var(--linie);
  background:var(--grund-2);
  overflow:hidden;
}
/* hidden schlaegt display:block NICHT — deshalb ausdruecklich. site.js setzt
   das Merkmal, wenn ein Vorschaubild fehlt; ohne diese Zeile bliebe der
   Bildtext als Zeile im Rahmen stehen (derselbe Fall wie bei .besuche). */
.film__bild img[hidden]{ display:none; }

/* GRAU-BLAU IM RUHEZUSTAND, FARBE UNTER DEM ZEIGER.

   Die Filterkette ist NICHT neu erfunden, sondern dieselbe wie bei der
   Diaschau auf der Neuigkeitenseite: entfaerben, abdunkeln, Kontrast
   anziehen, ueber sepia ueberhaupt erst wieder eine Farbe hineinbringen
   (aus Grau geht das anders nicht), den Braunton um 158 Grad ins Blaugruene
   drehen, saettigen. Die Begruendung der einzelnen Schritte steht dort, bei
   .diaschau__bild; hier steht sie bewusst nicht ein zweites Mal.

   Zwei Anlaesse, dieselbe Antwort: dreizehn Vorschaubilder aus dreizehn
   Jahren, unterschiedlich belichtet und unterschiedlich bunt. Im Hausblau
   liegen sie als Raster ruhig nebeneinander; in ihren eigenen Farben
   zerfaellt die Seite in dreizehn Einzelbilder.

   Der Zeiger holt beides zugleich: Farbe (filter:none) und die leichte
   Annaeherung (scale). Die Zeiten stehen deshalb dicht beieinander — das
   Bild soll nicht erst heranfahren und dann nachfaerben. */
.film__bild img{
  display:block;
  width:100%; height:100%;
  object-fit:cover;
  transition:transform .5s cubic-bezier(.2,.7,.3,1), filter .45s ease;
  filter:grayscale(1) brightness(.68) contrast(1.1)
         sepia(.6) hue-rotate(158deg) saturate(4.5);
}
.film:hover .film__bild img,
.film:focus-visible .film__bild img{
  transform:scale(1.035);
  filter:none;
}

/* Auf einem Geraet ohne Zeiger gaebe es die Farbe sonst nie zu sehen —
   dieselbe Ueberlegung wie bei der Diaschau. Dort zeigt das laufende Bild
   sich von selbst; hier gibt es kein laufendes Bild, also stehen alle
   dreizehn in Farbe. */
@media (hover:none){
  .film__bild img{ filter:none; }
}

/* Ein schlichtes Dreieck im Kreis, KEIN YouTube-Zeichen. Das Zeichen ist
   eine eingetragene Marke; es nachzubauen oder einzufaerben waere genau die
   Frage, die sich auf der Netzwerkseite schon einmal gestellt hat. Ein
   Abspielsymbol versteht ohnehin jeder. */
.film__spiel{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  color:rgba(233,242,248,.86);
  pointer-events:none;
  transition:transform .35s cubic-bezier(.2,.7,.3,1), color .35s;
}
.film__spiel svg{ width:clamp(2.6rem, 7vw, 3.4rem); height:auto; }
.film:hover .film__spiel,
.film:focus-visible .film__spiel{ transform:scale(1.08); color:#fff; }

.film__dauer{
  position:absolute; right:.5rem; bottom:.5rem;
  padding:.1rem .4rem;
  border-radius:4px;
  background:rgba(4,8,11,.72);
  font-size:.75rem;
  font-variant-numeric:tabular-nums;
  color:var(--schrift);
}

.film__wort{ display:block; padding:.75rem .1rem 0; }

/* Dasselbe Datum wie in der Chronik: klein, gesperrt, gedaempft. */
.film__datum{
  display:block;
  margin:0 0 .25rem;
  font-size:.75rem;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--gedaempft);
}
.film__titel{
  display:block;
  margin:0 0 .35rem;
  font-size:clamp(1rem,2.2vw,1.12rem);
  font-weight:600;
  color:var(--schrift);
}
.film:hover .film__titel{ color:var(--blau-hell); }
.film__text{
  display:block;
  font-size:.92rem;
  line-height:1.55;
  color:var(--gedaempft);
}
/* Die Texte stammen unveraendert aus dem alten Auftritt und sind
   unterschiedlich lang — von gar keinem bis zu vier Absaetzen beim
   Forschungsprojekt. Deshalb Absaetze statt eines Fliesstextes, und die
   Karten oben ausgerichtet statt mittig, sonst haengen kurze neben langen
   in der Luft. */
.film__absatz{ display:block; }
.film__absatz + .film__absatz{ margin-top:.5em; }

@media (prefers-reduced-motion:reduce){
  .film__bild img, .film__spiel{ transition:none; }
  .film:hover .film__bild img{ transform:none; }
}

/* --- Der Besuchsstand unter der Trommel ----------------------------------- */
/* Steht unter dem Hinweis zur Bedienung und soll leiser sein als der: der
   Hinweis erklaert, wie man weiterkommt, die Zahl ist eine Randnotiz. Sie
   bekommt deshalb dieselbe gedaempfte Farbe, aber eine Stufe kleiner und
   mit mehr Luft darueber.

   hidden allein reicht nicht: .besuche ist ueber display:flex gesetzt, und
   display schlaegt das eingebaute display:none des hidden-Merkmals. Deshalb
   die ausdrueckliche Regel darunter. */
.besuche{
  display:flex;
  justify-content:center;
  gap:.4em;
  margin:1.1rem 0 0;
  font-size:.78rem;
  letter-spacing:.06em;
  color:var(--gedaempft);
}
.besuche[hidden]{ display:none; }

/* Die Zahl selbst etwas heller als das Wort daneben — sie ist die Angabe,
   das Wort nur ihre Einheit. Und mit gleichbreiten Ziffern, damit sie beim
   Hochzaehlen nicht zappelt. */
.besuche__zahl{
  color:var(--schrift);
  font-variant-numeric:tabular-nums;
}

/* --- Die Chronik: dieselbe Zeile, aber mit Datum und Foto ------------------ */
/* Die Anordnung teilt sich die Chronik mit der Leistungsseite (siehe oben):
   zwei Spalten ab 44rem, jede zweite gedreht. Nur was dort fehlt, steht hier.

   .leistung heisst die Klasse trotzdem weiter — sie ist die Zeile "Text neben
   Bild", nicht ein Begriff der Leistungsseite. Umbenennen haette dort acht
   Waehler und zwei Seiten angefasst, ohne dass sich etwas aendert. */

/* Das Datum steht ueber dem Titel, klein und ruhig. Es soll auffindbar sein,
   wenn man danach sucht, und nicht mitlesen, wenn man es nicht tut. */
.chronik__datum{
  display:block;
  margin:0 0 .25rem;
  font-size:.8rem;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--gedaempft);
}

/* --- Die Klappkarte der Chronik ------------------------------------------- */
/* Vorn liegt das Foto in Grau-Blau, beim Ueberfahren klappt die Karte um die
   WAAGERECHTE Achse (rotateX) und zeigt es, wie es ist — sie kippt also nach
   hinten weg, wie ein aufgestelltes Blatt, das man nach oben klappt. Dieselbe Bauweise wie die
   Logokacheln auf der Netzwerkseite (.netzwerk__blatt), nur dass hier auf
   beiden Seiten dasselbe Bild liegt.

   Der Rahmen sitzt deshalb NICHT mehr an der <figure>: die traegt jetzt die
   Perspektive, und ein overflow:hidden an ihr wuerde die Drehung flach
   schneiden. Rahmen, Rundung und Grund liegen an den beiden Blattseiten. */
.chronik__bild{
  margin:0;
  perspective:1000px;
}

.chronik__blatt{
  position:relative;
  aspect-ratio:3 / 2;
  transform-style:preserve-3d;
  transition:transform .6s cubic-bezier(.2,.7,.3,1);
}
.chronik__bild:hover .chronik__blatt,
.chronik__bild:focus-within .chronik__blatt{ transform:rotateX(180deg); }

.chronik__vorn,
.chronik__hinten{
  position:absolute; inset:0;
  backface-visibility:hidden;
  -webkit-backface-visibility:hidden;
  border-radius:6px;
  border:1px solid var(--linie);
  background:var(--grund-2);
  overflow:hidden;
}
.chronik__hinten{ transform:rotateX(180deg); }

/* DIE EINFAERBUNG, und zwar als Duplex statt als Filter.
   grayscale() allein ergaebe ein graues Bild, und ein blauer Schleier
   darueber (opacity) wuerde nur alles aufhellen. Hier liegt das
   entsaettigte Bild MULTIPLIZIEREND auf einer grau-blauen Flaeche: Schwarz
   bleibt Schwarz, Weiss wird zum Hausblaugrau, alles dazwischen zieht sich
   auf diese eine Achse. Das ist der Duplexdruck, und er haelt auch dunkle
   Bilder zusammen.

   isolation:isolate ist Pflicht: ohne sie mischt sich das Bild nicht mit
   seiner eigenen Flaeche, sondern mit allem, was auf der Seite darunter
   liegt — samt Hintergrundraster. */
.chronik__vorn{
  background:#8fb4cc;
  isolation:isolate;
}
.chronik__vorn img{
  filter:grayscale(1) contrast(1.06) brightness(1.02);
  mix-blend-mode:multiply;
}

.chronik__bild img{
  display:block;
  width:100%; height:100%;
  object-fit:cover;
  object-position:center;
}

/* Ohne Zeigegeraet gibt es kein Ueberfahren. Dann steht gleich das Bild da,
   wie es ist — so wie die Logokacheln der Netzwerkseite. */
@media (hover:none){
  .chronik__blatt{ transform:rotateX(180deg); }
}

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

/* Fehlt ein Foto, faellt der Rahmen weg statt ein kaputtes Bild zu zeigen.
   site.js setzt die Klasse, wenn das Laden scheitert; der Text rueckt dann
   auf die volle Breite. */
.chronik--ohne-bild .chronik__bild{ display:none; }
@media (min-width:44rem){
  .chronik--ohne-bild{ grid-template-columns:1fr; }
}

/* Aufzaehlung innerhalb eines Eintrags. */
.chronik__liste{
  margin:0 0 .7rem;
  padding-left:1.1rem;
  text-align:left;
}
.chronik__liste li{ margin:0 0 .3rem; }

/* Das Zitat aus einer fremden Quelle, mit Herkunft darunter. */
.chronik__zitat{
  margin:0 0 .7rem;
  padding-left:.9rem;
  border-left:2px solid var(--linie);
  text-align:left;
}
.chronik__quelle{
  display:block;
  font-size:.85rem;
  color:var(--gedaempft);
}

.bereich__titel{
  margin:0 0 .7rem;
  font-size:clamp(1.05rem,2.4vw,1.25rem);
  font-weight:600;
  letter-spacing:.02em;
  color:#eaf7ff;
}

/* Blocksatz. Ohne Silbentrennung reisst er in einer schmalen Spalte grosse
   Luecken zwischen die Woerter — hyphens:auto gehoert zwingend dazu. Die
   Sprache dafuer holt sich der Browser aus dem lang-Merkmal in <html>, das
   jede Seite ohnehin traegt. */
.bereich__teil p{
  margin:0 0 .9rem;
  line-height:1.7;
  color:var(--gedaempft);
  text-align:justify;
  -webkit-hyphens:auto;
  hyphens:auto;
}
.bereich__teil p:last-child{ margin-bottom:0; }

.bereich__teil em{ font-style:normal; color:#cfe2ee; }

.bereich__teil a{
  color:#7ec8e8;
  text-decoration:none;
  border-bottom:1px solid rgba(126,200,232,.35);
  transition:color .3s ease, border-color .3s ease;
}
.bereich__teil a:hover,
.bereich__teil a:focus-visible{ color:#aee2f7; border-bottom-color:rgba(174,226,247,.7); }

/* Die beiden Wege hinaus stehen zweimal: einmal ueber dem Text und einmal
   darunter. Wer sich nach dem Leitsatz schon entschieden hat, soll nicht
   erst an allem vorbeirollen muessen. */
.bereich__wege{
  margin:2.4rem 0;
  display:flex; flex-wrap:wrap; gap:.9rem 1.2rem;
  align-items:center; justify-content:center;
}
.bereich__wege--oben{ margin:1.8rem 0 2.8rem; }

/* --- Zeitstrahl ---------------------------------------------------------- */
/* Eine senkrechte Linie mit Punkten, links davon die Jahreszahl. Die Linie
   laeuft an beiden Enden ins Nichts: ein hart abgeschnittener Strich
   behauptet, die Geschichte begaenne und endete genau hier.

   Die Punkte sitzen AUF der Linie. Ihre Position rechnet sich aus dem
   Einzug der Liste; wer den Einzug aendert, zieht --strahl-x mit. */
.bereich__zeit{
  --strahl-x: 4.15rem;      /* Abstand der Linie vom linken Rand der Liste */
  --einzug: 5.6rem;
  position:relative;
  list-style:none;
  margin:0;
  padding:.2rem 0 .2rem var(--einzug);
  text-align:left;
}

.bereich__zeit::before{
  content:"";
  position:absolute;
  left:var(--strahl-x); top:0; bottom:0;
  width:1px;
  background:linear-gradient(to bottom,
    rgba(126,200,232,0) 0%,
    rgba(126,200,232,.42) 12%,
    rgba(126,200,232,.42) 88%,
    rgba(126,200,232,0) 100%);
}

.bereich__zeit li{
  position:relative;
  padding:0 0 1.25rem;
  line-height:1.6;
  color:var(--gedaempft);
}
.bereich__zeit li:last-child{ padding-bottom:0; }

.bereich__zeit li::before{      /* der Punkt auf der Linie */
  content:"";
  position:absolute;
  left:calc(var(--strahl-x) - var(--einzug) - .25rem);
  top:.5rem;
  width:.5rem; height:.5rem;
  border-radius:50%;
  background:#9fd0e6;
  box-shadow:0 0 10px rgba(126,200,232,.55);
}

.bereich__jahr{
  position:absolute;
  left:calc(var(--einzug) * -1);
  width:3.3rem;
  text-align:right;
  color:#9fd0e6;
  font-variant-numeric:tabular-nums;
  font-weight:600;
}

/* Schmale Fenster: die Jahreszahl passt nicht mehr neben die Linie, sie
   rueckt ueber den Eintrag. Die Linie bleibt — sonst waere es kein
   Zeitstrahl mehr, sondern eine Liste. */
/* Schmale Bildschirme: links und rechts ist kein Platz mehr fuer eine
   breite Blende, sie liefe ueber den Rand und wuerde dort hart
   abgeschnitten. */
@media (max-width:34rem){
  .bereich{ --schleier-rand: 1.1rem; }
}

@media (max-width:30rem){
  .bereich__zeit{ --strahl-x:.25rem; --einzug:1.6rem; }
  .bereich__zeit li{ padding-bottom:1.4rem; }
  .bereich__zeit li::before{ top:.42rem; }
  .bereich__jahr{
    position:static; display:block;
    width:auto; text-align:left; margin-bottom:.1rem;
  }
}

/* Der Kopf einer Bereichsseite MIT Inhalt steht links ueber dem Text, nicht
   mittig: sonst haengt die Ueberschrift ueber einer linksbuendigen Spalte in
   der Luft. Die Ueberschrift bekommt dieselbe Spaltenbreite wie .bereich,
   damit beide auf derselben Kante beginnen — Breite hier und dort aendern.
   Ausgeloest ueber eine eigene Klasse und nicht ueber :has(), damit man im
   HTML sieht, welche Bauart eine Seite hat. */
.bereichskopf--text{
  justify-content:flex-start;
  text-align:left;
  padding-inline:0;
}
.bereichskopf--text .bereichskopf__titel{
  width:min(100% - 3rem, 40rem);
  margin-inline:auto;
  font-size:clamp(1.6rem,5.2vw,2.9rem);
}

/* z-index 2, nicht 1: der Schleier von .bereich (dort ein Kind mit
   z-index:-1 im eigenen Stapelraum) liegt sonst UEBER dem Kopf, weil
   .bereich im Quelltext danach kommt und dieselbe Stufe haette. Der
   Schriftzug samt Spiegelung sah dadurch ausgewaschen aus. */
/* --- Uebergang: in die Tiefe --------------------------------------------- */
/* Vom Trommelmenue auf eine Bereichsseite. Zwei Haelften derselben Bewegung:
   hier weicht alles zurueck und der gewaehlte Eintrag kommt entgegen, drueben
   setzt sich der Name aus derselben Richtung. Dass es EINE Geste ist und
   nicht zwei, haengt daran, dass beide Haelften dieselbe Richtung und
   aehnliche Kurven benutzen — wer eine aendert, aendert die andere mit.

   WEGGEHEN (body.in-die-tiefe, gesetzt von uebergang.js) */

body.in-die-tiefe .radwahl__buehne{
  /* Die ganze Trommel kommt entgegen. Der Massstab sitzt auf der Buehne und
     nicht auf den Feldern: die tragen ihre eigenen Transformationen aus
     radwahl.js, und zwei Angaben auf demselben Element wuerden sich
     ueberschreiben. */
  transform:scale(2.9);
  opacity:0;
  transition:transform .52s cubic-bezier(.5,0,.75,0), opacity .52s ease-in;
}

body.in-die-tiefe .radwahl__feld:not(.radwahl__feld--gewaehlt),
body.in-die-tiefe .radwahl__linie,
body.in-die-tiefe .radwahl__pfeil,
body.in-die-tiefe .radwahl__hinweis{
  /* Alles ausser dem gewaehlten Eintrag geht frueher: sonst zieht ein
     Gewimmel mit nach vorn statt eines einzelnen Wortes. */
  opacity:0;
  transition:opacity .2s ease-out;
}

body.in-die-tiefe .radwahl__feld--gewaehlt{
  /* Er bleibt am laengsten stehen und verglueht erst zum Schluss. */
  opacity:1;
  transition:opacity .42s ease-in .1s;
}

body.in-die-tiefe .baustelle__marke,
body.in-die-tiefe .baustelle__titel,
body.in-die-tiefe .baustelle__text,
body.in-die-tiefe .baustelle__wege,
body.in-die-tiefe .fuss{
  /* Der Rest der Seite weicht nach HINTEN — die Gegenbewegung. Ohne sie
     sieht es aus, als waechse nur das Menue, statt dass man hineinfaehrt. */
  transform:scale(.93);
  opacity:0;
  transition:transform .5s ease-in, opacity .34s ease-in;
}

body.in-die-tiefe .raster{
  opacity:0;
  transition:opacity .5s ease-in;
}

/* ANKOMMEN (html.aus-der-tiefe, gesetzt im Kopf der neuen Seite) */

html.aus-der-tiefe .ankunft{
  display:block;
  background:var(--grund);
  animation:uebergang-her .52s ease-out forwards;
}

html.aus-der-tiefe .produktkopf .marke{
  /* Der Name setzt sich aus derselben Richtung.

     ZWEI FALLEN, beide erlebt:

     1. `.marke` traegt bereits `transform:translateY(var(--marke-y))` — die
        Verschiebung, mit der Schriftzug und Spiegelung buendig sitzen. Eine
        Animation auf `transform` ERSETZT sie. Beim ersten Versuch sprang
        der Schriftzug deshalb waehrend des Einblendens um rund hundert
        Pixel nach oben und mitten in den Text. Die Verschiebung muss in
        JEDEM Schritt der Animation mitgeschrieben werden.

     2. Kein `scale` auf diesem Element. Darunter haengen zwei SVG-Filter
        (`pm-schein` mit 260 % Filterflaeche, `pm-wasser`); wird das Ganze
        vergroessert, waechst die Filterflaeche mit — Firefox schneidet sie
        dann an einer senkrechten Kante ab, und der halbe Schriftzug fehlt
        samt Spiegelung und Schein. Ein reines Verschieben aendert die
        Rasterung nicht und ist deshalb unbedenklich. */
  animation:aus-der-tiefe-marke .62s cubic-bezier(.16,.84,.3,1) forwards;
}

html.aus-der-tiefe .bereich{
  animation:aus-der-tiefe-inhalt .7s cubic-bezier(.22,1,.36,1) .1s backwards;
}

@keyframes aus-der-tiefe-marke{
  /* DRITTE FALLE, und die unauffaelligste: im Schlussbild steht KEIN
     opacity. Das ist Absicht.

     Stuende dort `opacity:1`, liefe die Bewegung auf volle Deckkraft zu und
     hielte sie — die Animation traegt `forwards`. Nach 1,4 s nimmt aber
     uebergang.js die Klasse `aus-der-tiefe` wieder weg (der Rueckweg ueber
     den Zurueck-Knopf braucht das, siehe dort). In diesem Augenblick faellt
     der gehaltene Wert weg, und der Schriftzug sackt von 1 auf die .72, die
     .marke--produkt ohnehin traegt: ein sichtbares Nachdunkeln rund eine
     Sekunde nach dem Ankommen.

     Laesst man opacity im Schlussbild weg, laeuft die Bewegung stattdessen
     auf den Wert zu, den das Element selbst hat. Danach aendert das
     Wegnehmen der Klasse nichts mehr — und dieselbe Kurve stimmt weiterhin
     fuer jede Deckkraft, ohne dass hier eine Zahl doppelt gepflegt werden
     muss. */
  from{ transform:translateY(calc(var(--marke-y) + 1.1rem)); opacity:0; }
  to  { transform:translateY(var(--marke-y)); }
}

/* Der Inhalt darf skalieren: dort haengt kein Filter darunter. Er traegt
   damit den Eindruck der Tiefe, den der Schriftzug nicht mehr tragen kann. */
@keyframes aus-der-tiefe-inhalt{
  from{ transform:scale(1.08) translateY(.7rem); opacity:0; }
  to  { transform:none;                          opacity:1; }
}

/* Wer weniger Bewegung eingestellt hat, bekommt keine: uebergang.js
   wechselt dann sofort, und diese Regeln greifen gar nicht erst. */
@media (prefers-reduced-motion:reduce){
  body.in-die-tiefe *,
  html.aus-der-tiefe *{ animation:none !important; transition:none !important; }
}

.produktkopf{
  position:relative; z-index:2;
  padding:clamp(2.5rem,7vh,4.5rem) 1.5rem clamp(1.5rem,4vh,3rem);
  display:flex; justify-content:center; align-items:flex-start;

  /* Die Logobreite steht seit dem 14.09.2026 HIER und nicht mehr in
     .marke--produkt, damit sie an EINER Stelle liegt: der Seitenkopf gibt
     die Breite vor, alles darunter rechnet daran. */
  --logo-breite: clamp(14rem, 38vw, 21rem);
}

/* --- Die Bildmarke vor dem Bereichsnamen ---------------------------------- */
/* Hier steht nichts mehr. Die Bildmarke ist kein eigenes Element daneben,
   sondern liegt MIT dem Schriftzug in einer SVG-Gruppe (#pm-marke) — nur so
   nehmen Metallverlauf, Schein, Maske und Spiegelung sie mit. Ihre Groesse
   und ihre Lage rechnet assets/js/kopfzeichen.js aus der gemessenen Breite
   des Bereichsnamens; mit CSS ginge das nicht, weil CSS die Breite eines
   SVG-Textes nicht kennt. */

.produktinhalt{
  position:relative; z-index:1;
  flex:1 1 auto;
  display:flex; flex-direction:column; align-items:center;
  text-align:center;
  gap:1.4rem;
  width:min(100% - 3rem, 34rem);
  margin-inline:auto;
  padding-bottom:clamp(2rem,6vh,4rem);
}

.produktinhalt__hinweis{ margin:0; color:var(--gedaempft); }

.produktinhalt__wege{
  margin:0;
  display:flex; flex-wrap:wrap; justify-content:center; gap:.9rem 1.2rem;
  /* align-items MUSS hier stehen. Ohne die Zeile gilt die Voreinstellung
     "stretch": der schlichte Verweis daneben bekommt dieselbe Hoehe wie die
     umrandete Schaltflaeche, seine Schrift sitzt dann aber OBEN in diesem
     zu hohen Kasten — gemessen zehn Pixel ueber der Schrift der
     Schaltflaeche. Die Kaesten fluchten dabei, die Schrift nicht; deshalb
     faellt es beim Nachmessen der Elemente nicht auf, beim Hinsehen sofort.
     .bereich__wege hatte die Zeile von Anfang an — daher der Unterschied
     zwischen den Bereichsseiten. */
  align-items:center;
}

/* --- Referenzen: Kunden- und Partnerlogos --------------------------------
   Die Logos gehoeren fremden Marken und kommen in ganz unterschiedlichen
   Farben und Kontrasten daher — manche hell, manche dunkel, manche mit
   eigenem Hintergrund. brightness(0) invert(1) macht aus jeder deckenden
   Flaeche eine weisse Silhouette, unabhaengig von der Ausgangsfarbe — so
   sehen alle Marken in Ruhestellung gleich zurueckhaltend aus. Erst beim
   Zeigen mit der Maus heben brightness(1) und invert(0) diese Filter wieder
   auf (sie sind fuer sich genommen wirkungslos), die Marke erscheint in
   ihren echten Farben, und derselbe blaue Schein wie beim Logo und den
   sozialen Symbolen im Fuss (siehe .fuss__social-link) legt sich darueber.

   Flexbox statt Grid fuer das Raster: bei neun Kacheln bleibt immer eine
   letzte, unvollstaendige Zeile uebrig (z.B. 7+2). justify-content:center
   zentriert jede Zeile fuer sich, auch die unvollstaendige — die Kacheln
   stehen dann symmetrisch zur Mittelachse statt links haengenzubleiben.
   Feste Kachelbreite (kein flex-grow), sonst wuerden ausgerechnet die
   Kacheln der letzten Zeile ueberproportional breit gezogen. */

.produktinhalt--netzwerk{
  width:min(100% - 3rem, 72rem);
  gap:3rem;
}

/* --- Produkte: das Sinnbild ueber dem Satz -------------------------------- */
/* Die Seite ist breiter als die uebrigen Baustellenseiten (34rem), aber
   schmaler als eine Inhaltsseite. Grund ist allein die Zeichnung: bei 34rem
   steht sie kleiner da als die drei Geraeteumrisse darunter, und dann sieht
   der Satz nicht nach Ansage aus, sondern nach Fussnote. */
.produktinhalt--produkte{
  width:min(100% - 3rem, 46rem);
  /* PFLICHT, sobald die Seite laenger wird als das Fenster: .fuss liegt
     fest am unteren Fensterrand, und die gemeinsame Zeile darunter
     (clamp(2rem,6vh,4rem)) reicht nur fuer die kurze Baustellenfassung
     dieser Seite. Mit der Zeichnung wuchs sie darueber hinaus, und die
     beiden Schaltflaechen sassen gemessen 39 Pixel UNTER der Oberkante
     der Fussleiste — sichtbar blieben sie nur, weil die Leiste
     durchscheint. --fuss-hoehe misst site.js. */
  padding-bottom:calc(var(--fuss-hoehe, 6rem) + clamp(1.5rem, 4vh, 3rem));
}

/* Das obere Paar steht naeher an der Zeichnung als die gemeinsame Luft
   (1.4rem) hergibt: es gehoert zum Bild darunter, nicht zum Kopf darueber.
   Ohne die Zeile sass es genau in der Mitte zwischen beiden und liess sich
   keinem von beiden zuordnen. */
.produktinhalt__wege--oben{ margin-bottom:.4rem; }

.hochdruck{ margin:0; width:100%; }

/* Die Zeichnung traegt keine Farbbehandlung. Sie ist in den Hausfarben
   gezeichnet und nicht fotografiert — es gibt nichts zu daempfen. */
.hochdruck__bild{
  display:block;
  width:100%; height:auto;
  max-width:34rem;
  margin-inline:auto;
}

/* Der Satz ist der Inhalt der Seite, nicht ihre Bildunterschrift. Deshalb
   in Schriftfarbe statt gedaempft und eine Stufe groesser als der Fliesstext
   — sonst laese er sich wie die uebliche Baustellenzeile, die er ersetzt. */
.hochdruck__wort{
  margin:1.4rem auto 0;
  max-width:30rem;
  font-size:clamp(1.05rem, 2.6vw, 1.32rem);
  line-height:1.55;
  color:var(--schrift);
}


/* Mittig, wie das Kachelraster darunter. Linksbuendig sass die Ueberschrift
   an der Fensterkante, waehrend die Kacheln in der Mitte standen — zwei
   verschiedene Achsen auf derselben Seite. */
.netzwerk__gruppe{ width:100%; text-align:center; }

.netzwerk__titel{
  margin:0 0 1.4rem;
  font-size:.88rem;
  font-weight:600;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--gedaempft);
}

.netzwerk__raster{
  display:flex; flex-wrap:wrap; justify-content:center;
  gap:1.1rem;
  list-style:none;
  margin:0; padding:0;
}
/* Die Kachel ist jetzt ein Verweis auf die offizielle Seite der Marke — das
   <li> traegt nur noch die feste Breite, damit alle Zeilen gleich hoch
   bleiben, die eigentliche Kachel (Rahmen, Hintergrund, Schein) sitzt auf
   dem <a>, analog zu .fuss__social-link. */
/* --- Die Kacheln: Klappkarten --------------------------------------------
   Vorn steht nur der Firmenname als Text, hinten liegt das Logo. Faehrt der
   Zeiger darueber, klappt die Karte um; faehrt er weg, klappt sie zurueck.

   DAS IST KEINE SPIELEREI, SONDERN DER GRUND DAFUER, DASS DIE LOGOS
   UNVERAENDERT BLEIBEN KOENNEN. Vorher lagen sie flach auf dem dunklen Grund
   und wurden dafuer auf weisse Silhouetten heruntergerechnet
   (brightness(0) invert(1)). Eine fremde Marke so umzufaerben ist heikel:
   Markeninhaber geben ihre Zeichen in aller Regel nur unveraendert und in
   ihren Farben frei. Auf der Rueckseite bekommt jedes Logo genau den Grund,
   fuer den es gezeichnet wurde — kein Filter, keine Umfaerbung.

   HELL ODER DUNKEL, JE LOGO. Nachgemessen an allen achtzehn Dateien: sechzehn
   sind dunkel gezeichnet und brauchen hellen Grund. Zwei sind reines Weiss
   (Controlware, Telehouse) und waeren auf Weiss unsichtbar — die tragen
   .netzwerk__kachel--dunkel. Kommt ein Logo dazu, gehoert diese Pruefung
   wiederholt; sie ist in zwei Minuten gemacht und spart eine leere Kachel.

   WARUM DIE KACHEL EINE FESTE HOEHE HAT. Die beiden Seiten liegen absolut
   uebereinander, damit sie sich beim Klappen decken. Absolute Kinder tragen
   aber nichts zur Hoehe des Elternteils bei — ohne feste Hoehe fiele die
   Kachel auf null zusammen. */

/* Zwanzig Prozent groesser als zuvor (9rem / 5.2rem). Beide Werte stehen am
   RASTER und nicht an der Kachel: das <li> dazwischen braucht die Breite
   ebenfalls, und es ist der Elternteil der Kachel — eine dort gesetzte
   Variable saehe es nie. */
.netzwerk__raster{
  --kachel-breite: 10.8rem;
  --kachel-hoehe:  6.25rem;
}

.netzwerk__raster > li{ flex:0 0 var(--kachel-breite); display:flex; }

.netzwerk__kachel{
  display:block;
  width:100%;
  height:var(--kachel-hoehe);
  /* Die Fluchtlinie fuer das Klappen. Ohne perspective dreht sich die Karte
     flach in der Ebene und sieht aus, als wuerde sie zusammengedrueckt. Der
     Wert ist der Abstand des gedachten Auges: je kleiner, desto staerker die
     Verkuerzung. 900px sind deutlich zu sehen, ohne zu verzerren. */
  perspective:900px;
  text-decoration:none;
}

.netzwerk__blatt{
  position:relative;
  display:block;
  width:100%; height:100%;
  /* preserve-3d MUSS hier stehen: nur dann behalten die beiden Seiten ihre
     Lage im Raum. Ohne das werden sie plattgerechnet, und die Rueckseite
     liegt nicht hinten, sondern einfach darueber. */
  transform-style:preserve-3d;
  transition:transform .6s cubic-bezier(.2,.75,.25,1);
}

.netzwerk__vorn,
.netzwerk__hinten{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  /* Der Rahmen um das Logo steht HIER und nicht in den Bilddateien. Die sind
     seit dem 14.09.2026 randlos zugeschnitten (werkzeug/logos-trimmen.py),
     damit jedes Zeichen den Platz gleich ausnutzt; der Abstand zum Rand
     kommt fuer alle aus derselben Zeile und laesst sich an einer Stelle
     nachziehen. Knapp gehalten, sonst war das Zuschneiden umsonst. */
  padding:.72rem .8rem;
  border-radius:4px;
  border:1px solid rgba(219,230,238,.14);
  box-shadow:0 10px 26px rgba(0,0,0,.4);
  /* Die abgewandte Seite bleibt unsichtbar. Sonst schiene sie seitenverkehrt
     durch die zugewandte hindurch. */
  backface-visibility:hidden;
  -webkit-backface-visibility:hidden;
  transition:border-color .25s ease, box-shadow .25s ease;
}

.netzwerk__vorn{
  background:var(--grund-2);
  color:rgba(219,230,238,.72);
  font-size:.82rem;
  line-height:1.3;
  text-align:center;
  /* Lange Namen wie "Flughafen Berlin Brandenburg GmbH" muessen umbrechen
     duerfen, notfalls mitten im Wort — sonst steht ein Name ueber den Rand
     hinaus.

     KEINE Silbentrennung (hyphens:auto). Sie war hier zuerst drin und hat
     aus "Brandenburg" ein "Bran-denburg" gemacht und aus "Solutions" ein
     "So-lutions": in einem Firmennamen liest sich ein eingefuegter
     Bindestrich wie ein Teil des Namens, und bei englischen Woertern in
     einem deutschen Absatz trennt der Browser ohnehin nach den falschen
     Regeln. Ohne sie rutscht das Wort einfach als Ganzes in die naechste
     Zeile. overflow-wrap bleibt als Notnagel fuer den Fall, dass ein
     einzelnes Wort breiter ist als die Kachel. */
  overflow-wrap:anywhere;
}

.netzwerk__hinten{
  transform:rotateY(180deg);
  /* Heller Grund, weil die allermeisten Logos dafuer gezeichnet sind. Nicht
     reines Weiss: das schlaegt auf der dunklen Seite ein Loch.

     Ueber --kachel-grund laesst sich das je Kachel im HTML uebersteuern. Das
     braucht, wer sein Zeichen nur MIT Hintergrund herausgibt — ein fertiges
     Banner statt eines freistehenden Logos. Traegt die Kachel dieselbe Farbe
     wie das Bild, sieht man keine Naht, und das Zeichen bleibt unangetastet.
     Der Weg ist bewusst eine Variable und keine Klasse je Firma: eine Klasse
     .netzwerk__kachel--venetric waere im Stylesheet eine Firma zu viel. */
  background:var(--kachel-grund, #f2f6f9);
  border-color:rgba(219,230,238,.22);
}

/* Manche Logos bringen ihren weissen Grund mit — als deckendes JPG oder als
   weisse Flaeche mitten in der Zeichnung. Auf dem leicht getoenten #f2f6f9
   zeichnet sich dann ein hellerer Kasten ab. Diese Kacheln bekommen darum
   reines Weiss, und die Naht verschwindet. */
.netzwerk__kachel--weiss .netzwerk__hinten{ background:#ffffff; }

/* Manche Logos bringen ihren weissen Grund mit — als deckendes JPG oder als
   weisse Flaeche mitten in der Zeichnung. Auf dem leicht getoenten #f2f6f9
   zeichnet sich dann ein hellerer Kasten ab. Diese Kacheln bekommen darum
   reines Weiss, und die Naht verschwindet. */
.netzwerk__kachel--weiss .netzwerk__hinten{ background:#ffffff; }

.netzwerk__kachel--dunkel .netzwerk__hinten{
  background:#12191f;
  border-color:rgba(219,230,238,.18);
}

.netzwerk__hinten img{
  display:block;
  /* Beides auf 100 %, nicht auf einen festen Wert in rem. Die Prozente
     beziehen sich auf den Innenraum der Kachel, also auf Hoehe und Breite
     abzueglich des Innenabstands — jedes Logo wird damit so gross, wie es
     der Platz hergibt, und behaelt sein Verhaeltnis.

     Eine feste Hoehe (vorher 3rem) taugt dafuer nicht: ein breiter
     Schriftzug wie Honeywell ist ohnehin durch die BREITE begrenzt und
     merkt nichts davon, ein quadratisches Zeichen wie Nessum oder das der
     EAB dagegen bliebe bei einem Drittel des verfuegbaren Platzes stehen
     und wirkte verloren. */
  max-width:100%;
  max-height:100%;
  width:auto; height:auto;
  /* KEIN filter. Das ist der ganze Punkt dieser Bauweise. */
}

@media (hover:hover){
  .netzwerk__kachel:hover .netzwerk__blatt{ transform:rotateY(180deg); }
  .netzwerk__kachel:hover .netzwerk__vorn,
  .netzwerk__kachel:hover .netzwerk__hinten{
    border-color:rgba(78,192,230,.5);
    box-shadow:0 12px 30px rgba(0,0,0,.5), 0 0 26px rgba(0,152,204,.18);
  }
}

/* Derselbe Zustand fuer den Tastaturweg. */
.netzwerk__kachel:focus-visible .netzwerk__blatt{ transform:rotateY(180deg); }
.netzwerk__kachel:focus-visible .netzwerk__vorn,
.netzwerk__kachel:focus-visible .netzwerk__hinten{
  border-color:rgba(78,192,230,.5);
  box-shadow:0 12px 30px rgba(0,0,0,.5), 0 0 26px rgba(0,152,204,.18);
}

/* Auf dem Finger gibt es kein Ueberfahren — dort bliebe die Karte fuer immer
   auf der Textseite stehen, und die Logos waeren unerreichbar. Also liegt
   dort von vornherein die Logoseite oben. */
@media (hover:none){
  .netzwerk__blatt{ transform:rotateY(180deg); }
}

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

@media (max-width:640px){
  .netzwerk__raster{ --kachel-breite:9rem; --kachel-hoehe:5.4rem; }
}

/* --- Diaschau ------------------------------------------------------------ */
/* Drei Bilder, die von links nach rechts durchlaufen. Farbe zeigen sie nur
   unter dem Zeiger — die Faerbung steht KOMPLETT hier, das Skript wechselt
   nur die Blaetter. */

.diaschau{
  position:relative; z-index:1;
  /* Breiter als die Textspalte darueber (34rem). Der Elternteil ist ein
     Flexkasten mit align-items:center — ein Kind, das breiter ist als er,
     ragt deshalb GLEICHMAESSIG nach beiden Seiten hinaus und bleibt
     mittig. Ohne flex:0 0 auto wuerde es stattdessen auf die Breite des
     Elternteils zusammengedrueckt.
     Bezug ist 100vw und nicht 100%, weil sich die Breite eben nicht am
     Elternteil bemisst; der Rollbalken kann dabei ein paar Pixel kosten,
     die body{overflow-x:clip} abfaengt.

     Breite UND Hoehe stehen als eigene Werte da, statt die Hoehe ueber
     aspect-ratio zu erzeugen. Grund: der Rahmen unten muss sich an die
     Groesse des BILDES anschmiegen, und dafuer braucht das Bild eine
     Obergrenze in beiden Richtungen als echte Laenge. Aus einer
     aspect-ratio laesst sich die nicht auslesen. */
  --breite: min(100vw - 3rem, 46rem);
  --hoehe:  calc(var(--breite) * 3 / 4);
  --rahmenluft: .55rem;

  /* Der Abstand nach oben und nach unten soll GLEICH aussehen — gemessen
     von der Schrift der Schaltflaechen bis zur Bildkante. Nach oben ist
     das schlicht --luft. Nach unten stehen aber noch die Punkte im Weg,
     also muss deren Zeile samt ihrem Vorabstand abgezogen werden, sonst
     rutscht die untere Zeile um genau diesen Betrag weiter weg (gemessen:
     oben 77 px, unten 66 px). Deshalb bekommt die Punktzeile hier auch
     eine feste Hoehe: nur dann geht die Rechnung auf und haengt nicht an
     der zufaelligen Zeilenhoehe der Schaltflaechen darin. */
  --luft: clamp(2rem, 5vh, 3.25rem);
  --punktzeile: 1.2rem;
  --punktabstand: .9rem;

  flex:0 0 auto;
  width:var(--breite);
  max-width:none;
  margin:var(--luft) 0
         max(0px, calc(var(--luft) - var(--punktabstand) - var(--punktzeile)));
}
@media (max-width:34rem){
  .diaschau{ --hoehe: var(--breite); --rahmenluft:.4rem; }
}

.diaschau__fenster{
  position:relative; overflow:hidden;
  /* Feste Hoehe. Sie ist kein Zierrat: ohne sie richtete sich der
     Ausschnitt nach dem gerade laufenden Bild, und weil die drei Bilder
     verschiedene Formate haben, spraenge die halbe Seite bei jedem
     Wechsel. Der Ausschnitt selbst ist unsichtbar — zu sehen ist nur der
     Rahmen um das jeweilige Bild. */
  height:var(--hoehe);
}

.diaschau__blatt{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  /* Ruhelage: LINKS ausserhalb. Von dort kommt das naechste Bild herein. */
  transform:translateX(-100%);
  opacity:0;
  transition:transform .76s cubic-bezier(.22,1,.36,1), opacity .5s ease;
}
/* Ruhelage auf der ANDEREN Seite — gebraucht, wenn zurueckgeblaettert
   wird: dann kommt das Bild von rechts. Muss VOR --da stehen, sonst
   gewaenne es bei gleicher Spezifitaet gegen dessen transform:none und das
   ankommende Bild bliebe rechts stehen. */
.diaschau__blatt--rechts{ transform:translateX(100%); }

.diaschau__blatt--da { transform:none;              opacity:1; }
.diaschau__blatt--weg{ transform:translateX(100%);  opacity:0; }
/* Hinaus nach LINKS, beim Zurueckblaettern. */
.diaschau__blatt--weg-links{ transform:translateX(-100%); opacity:0; }
/* Nur fuer den Bruchteil eines Bildes gesetzt, wenn das abgeraeumte Blatt
   von rechts in seine Ruhelage links zurueckgesetzt wird. Ohne das faehrt
   es sichtbar quer durchs Bild zurueck. */
.diaschau__blatt--stumm{ transition:none !important; }

/* DER RAHMEN SCHMIEGT SICH AN DAS BILD.

   Der Trick steckt beim BILD, nicht beim Rahmen. Ein <img> mit
   width:auto/height:auto und Obergrenzen in beiden Richtungen verkleinert
   sich von selbst so weit, dass es in beide passt — und behaelt dabei sein
   Seitenverhaeltnis. Es nimmt also genau die Groesse an, die object-fit
   sonst innerhalb eines zu grossen Kastens erzeugt haette, nur ist der
   Kasten diesmal das Bild selbst.

   Der Rahmen ist ein inline-block darum: er schrumpft auf seinen Inhalt
   und ist damit automatisch um die Rahmenluft groesser als das Bild — bei
   jedem der drei Formate.

   Die Obergrenzen muessen sich auf das FENSTER beziehen (--breite,
   --hoehe) und nicht auf den Rahmen. Ein Prozentwert vom Rahmen waere ein
   Ringschluss: der Rahmen richtet sich nach dem Bild, das Bild nach dem
   Rahmen. */
/* Ein Bild der Diaschau kann weiterfuehren. Der Verweis liegt UM den
   Rahmen, nicht um das Bild: so bleibt die Groessenrechnung des Rahmens
   unberuehrt (er schmiegt sich weiter an das Bild), und die anklickbare
   Flaeche schliesst den Rahmen mit ein. */
.diaschau__verweis{
  display:inline-flex;
  max-width:100%; max-height:100%;
  text-decoration:none;
  border-radius:.45rem;
}
.diaschau__verweis:focus-visible{
  outline:2px solid var(--blau-hell); outline-offset:3px;
}
/* Nur der anklickbare Ausschnitt bekommt beim Zeigen eine Kante — sonst
   sieht man einem Bild nicht an, dass es weiterfuehrt, waehrend die
   anderen es nicht tun. */
.diaschau__verweis:hover .diaschau__rahmen,
.diaschau__verweis:focus-visible .diaschau__rahmen{
  border-color:var(--blau-hell);
}

.diaschau__rahmen{
  display:inline-block;
  padding:var(--rahmenluft);
  border:1px solid var(--linie);
  border-radius:.4rem;
  background:rgba(7,13,18,.5);
  line-height:0;   /* sonst sitzt unter dem Bild eine Zeilenkante */
}

/* DIE FAERBUNG STECKT AUSSCHLIESSLICH IN DER FILTERKETTE DES BILDES.

   Erster Versuch war eine Farbebene mit mix-blend-mode:color darueber —
   dasselbe Mittel wie bei der Karte im Kontaktblatt. Hier ging das schief:
   damals lag das Bild noch in einem festen Kasten, object-fit liess
   Randflaechen frei, und dort hatte die Farbebene KEINEN Untergrund zum
   Mischen. Ergebnis waren zwei knallblaue Balken links und rechts des
   Motivs. Eine Filterkette kennt dieses Problem nicht: sie wirkt nur auf
   Bildpunkte, die es wirklich gibt. Deshalb weicht diese Stelle bewusst
   vom Vorgehen bei der Karte ab — und bleibt auch dabei, seit der Rahmen
   sich anschmiegt: der Filter ist einfacher und tut dasselbe.

   Die Kette liest sich von links nach rechts: entfaerben, abdunkeln,
   Kontrast anziehen, ueber sepia ueberhaupt erst wieder eine Farbe
   hineinbringen (aus Grau geht das anders nicht), diesen Braunton um 158
   Grad ins Blaugruene drehen und zum Schluss so weit saettigen, dass es
   zum Blaucyan der Seite passt. Die Saettigung ist der Regler, an dem man
   den Ton einstellt — bei 3,4 wirkt er ruhiger, ab etwa 8 grell. */
.diaschau__bild{
  display:block;
  width:auto; height:auto;
  max-width: calc(var(--breite) - 2 * var(--rahmenluft) - 2px);
  max-height:calc(var(--hoehe)  - 2 * var(--rahmenluft) - 2px);
  filter:grayscale(1) brightness(.68) contrast(1.1)
         sepia(.6) hue-rotate(158deg) saturate(4.5);
  transition:filter .45s ease;
}
.diaschau__fenster:hover .diaschau__bild{ filter:none; }

/* Auf einem Geraet ohne Zeiger gaebe es die Farbe sonst nie zu sehen.
   Dort zeigt das gerade laufende Bild sie von sich aus. */
@media (hover:none){
  .diaschau__blatt--da .diaschau__bild{ filter:none; }
}

/* --- Bedienung ----------------------------------------------------------- */
/* Ohne JavaScript wirken Pfeile und Punkte nicht. Sie stehen deshalb auf
   "aus" und werden erst von diaschau.js freigegeben. */
.diaschau__pfeil,
.diaschau__punkte{ display:none; }
.diaschau--lebt .diaschau__pfeil { display:grid; }
.diaschau--lebt .diaschau__punkte{ display:flex; }

.diaschau__pfeil{
  position:absolute; top:50%; transform:translateY(-50%);
  z-index:2;
  place-items:center;
  width:2.4rem; height:2.4rem;
  border:1px solid var(--linie); border-radius:50%;
  background:rgba(7,13,18,.55);
  color:var(--schrift); font:inherit; line-height:1;
  cursor:pointer;
  opacity:.45;
  transition:opacity .25s ease, border-color .25s ease, background-color .25s ease;
}
.diaschau__fenster:hover .diaschau__pfeil{ opacity:.85; }
.diaschau__pfeil:hover,
.diaschau__pfeil:focus-visible{
  opacity:1; border-color:var(--blau-hell); background:rgba(7,13,18,.8);
}
.diaschau__pfeil--zurueck{ left:.6rem; }
.diaschau__pfeil--vor    { right:.6rem; }
.diaschau__pfeil svg{ width:1rem; height:1rem; fill:none;
  stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }

.diaschau__punkte{
  justify-content:center; align-items:center; gap:.55rem;
  height:var(--punktzeile);
  margin:var(--punktabstand) 0 0; padding:0; list-style:none;
}
.diaschau__punkt{
  width:.55rem; height:.55rem; padding:0;
  border:1px solid var(--gedaempft); border-radius:50%;
  background:transparent; cursor:pointer;
  transition:background-color .3s ease, border-color .3s ease;
}
.diaschau__punkt--da{ background:var(--blau-hell); border-color:var(--blau-hell); }
.diaschau__punkt:focus-visible{ outline:2px solid var(--blau-hell); outline-offset:3px; }

/* Wer weniger Bewegung eingestellt hat, bekommt keinen Lauf: das Skript
   wechselt dann nicht von selbst, und diese Regel nimmt auch dem Klick auf
   Pfeil oder Punkt die Fahrt. */
@media (prefers-reduced-motion:reduce){
  .diaschau__blatt{ transition:opacity .2s ease; transform:none; }
  .diaschau__blatt--weg,
  .diaschau__blatt--weg-links,
  .diaschau__blatt--rechts{ transform:none; }
}

/* --- Dateibaum (Seite "Material") ---------------------------------------- */
/* Der Baum steht in derselben Handschrift wie der Rest: dunkler Grund,
   duenne Linien, Hausblau nur als Akzent. Die Zeichnungen der Symbole
   stehen als SVG im Skript und nehmen ueber currentColor die Farbe ihrer
   Zeile an — so muss hier nur EIN Ton gepflegt werden. */

.baum{
  position:relative; z-index:1;
  /* Breiter als die Textspalte: Dateinamen sind lang, und ein Umbruch
     mitten im Namen macht eine Liste unlesbar. Derselbe Griff wie bei der
     Diaschau — Flexkasten mit align-items:center, also ragt ein breiteres
     Kind gleichmaessig nach beiden Seiten hinaus. */
  flex:0 0 auto;
  width:min(100vw - 3rem, 44rem);
  max-width:none;
  /* Oben und unten gleich viel Luft: der Baum steht zwischen zwei
     gleichen Zeilen mit denselben Schaltflaechen, und ungleiche Abstaende
     faellen dort sofort auf. Der Elternteil steuert zusaetzlich seinen
     eigenen Zeilenabstand bei — der ist auf beiden Seiten derselbe und
     stoert die Gleichheit deshalb nicht. */
  margin:clamp(2rem,5vh,3.25rem) 0;
  text-align:left;

  /* Wie weit der Schleier ueber die Liste hinausreicht. */
  --schleier-rand:3rem;
}

/* Derselbe Schleier wie hinter dem Fliesstext der Unternehmensseite, aus
   demselben Grund: das Punkteraster laeuft sonst quer durch die Dateinamen
   und macht sie unruhig. Er liegt NUR hinter der Liste; links und rechts
   bleibt der Hintergrund voll sichtbar. Waagerecht blendet er in genau der
   Strecke auf, die er ueberragt, senkrecht nimmt eine Maske die Kanten weg. */
.baum::before{
  content:"";
  position:absolute;
  inset:-1rem calc(var(--schleier-rand) * -1);
  z-index:-1;
  pointer-events:none;
  background:linear-gradient(to right,
    rgba(7,13,18,0)   0,
    rgba(7,13,18,.82) var(--schleier-rand),
    rgba(7,13,18,.82) calc(100% - var(--schleier-rand)),
    rgba(7,13,18,0)   100%);
  -webkit-mask-image:linear-gradient(to bottom,
    transparent 0, #000 2rem, #000 calc(100% - 2rem), transparent 100%);
  mask-image:linear-gradient(to bottom,
    transparent 0, #000 2rem, #000 calc(100% - 2rem), transparent 100%);
}

/* --- Leiste mit Suche und Schalter --------------------------------------- */
.baum__leiste{
  display:flex; flex-wrap:wrap; align-items:center; gap:.7rem;
  margin:0 0 .9rem;
}

.baum__suchfeld{
  position:relative;
  flex:1 1 12rem;
  display:flex; align-items:center;
}
.baum__lupe{
  position:absolute; left:.65rem;
  width:1rem; height:1rem;
  fill:none; stroke:var(--gedaempft); stroke-width:1.8;
  stroke-linecap:round; pointer-events:none;
}
.baum__suchfeld input{
  width:100%;
  padding:.5rem .8rem .5rem 2.1rem;
  font:inherit; font-size:.95rem;
  color:var(--schrift);
  background:rgba(7,13,18,.55);
  border:1px solid var(--linie); border-radius:.35rem;
  transition:border-color .25s ease, background-color .25s ease;
}
.baum__suchfeld input::placeholder{ color:var(--gedaempft); }
.baum__suchfeld input:focus{
  outline:none;
  border-color:var(--blau-hell);
  background:rgba(7,13,18,.8);
}

.baum__alle{
  padding:.5rem .9rem;
  font:inherit; font-size:.9rem;
  color:var(--gedaempft);
  background:transparent;
  border:1px solid var(--linie); border-radius:.35rem;
  cursor:pointer;
  transition:color .25s ease, border-color .25s ease;
}
.baum__alle:hover,
.baum__alle:focus-visible{ color:var(--schrift); border-color:var(--blau-hell); }

/* --- Der Baum selbst ------------------------------------------------------ */
.baum__ast{ margin:0; padding:0; list-style:none; }

/* Die Fuehrungslinie der zweiten und jeder tieferen Ebene. Sie sitzt am
   Ast und nicht an jeder Zeile: so ist es EINE Linie und nicht ein Stapel
   kurzer Stuecke, die an den Fugen auseinanderfallen. */
.baum__ordner > .baum__ast{
  margin-left:1.45rem;
  padding-left:.9rem;
  border-left:1px solid var(--linie);
}

.baum__zeile{ margin:0; }

/* Ordnerkopf und Dateizeile teilen sich das Raster: Symbol, Name, Mass.
   Nur so fluchten die Angaben rechts ueber alle Ebenen hinweg. */
.baum__kopf,
.baum__datei{
  display:flex; align-items:center; gap:.55rem;
  padding:.32rem .5rem;
  border-radius:.3rem;
  color:var(--schrift);
  text-decoration:none;
  transition:background-color .18s ease, color .18s ease;
}
.baum__kopf{ cursor:pointer; list-style:none; }
/* Das eigene Dreieck des Browsers vor <summary> muss weg — wir zeichnen
   unseres selbst, damit es sich drehen kann. */
.baum__kopf::-webkit-details-marker{ display:none; }
.baum__kopf::marker{ content:""; }

.baum__kopf:hover,
.baum__datei:hover,
.baum__kopf:focus-visible,
.baum__datei:focus-visible{
  background:rgba(0,152,204,.12);
  outline:none;
}
.baum__datei:focus-visible,
.baum__kopf:focus-visible{ box-shadow:inset 0 0 0 1px var(--blau-hell); }

.baum__pfeil{
  flex:0 0 auto;
  width:.85rem; height:.85rem;
  fill:none; stroke:var(--gedaempft); stroke-width:2.2;
  stroke-linecap:round; stroke-linejoin:round;
  transition:transform .22s ease, stroke .22s ease;
}
.baum__ordner[open] > .baum__kopf .baum__pfeil{ transform:rotate(90deg); }
.baum__kopf:hover .baum__pfeil{ stroke:var(--blau-hell); }

.baum__symbol{
  flex:0 0 auto;
  width:1.15rem; height:1.15rem;
  fill:none; stroke:currentColor; stroke-width:1.6;
  stroke-linecap:round; stroke-linejoin:round;
  color:var(--gedaempft);
  transition:color .18s ease;
}
/* Nur die Art bekommt Farbe, nicht die ganze Zeile: die Liste soll sich
   auf einen Blick sortieren lassen, ohne bunt zu werden. */
.baum__symbol--ordner   { color:#7fb4cc; }
.baum__symbol--pdf      { color:#d98b8b; }
.baum__symbol--bild     { color:#8fc9a6; }
.baum__symbol--zeichnung{ color:#b9a4d8; }
.baum__symbol--tabelle  { color:#9ec98f; }
.baum__symbol--archiv   { color:#d3b781; }
.baum__symbol--video    { color:#89b6d8; }
.baum__datei:hover .baum__symbol,
.baum__kopf:hover .baum__symbol{ color:var(--blau-hell); }

.baum__name{
  flex:1 1 auto;
  min-width:0;
  /* Lange Namen brechen am Punkt oder Unterstrich um, statt die Spalte zu
     sprengen. Abschneiden waere schlimmer: gerade das Ende eines
     Dateinamens traegt die Auskunft. */
  overflow-wrap:anywhere;
  font-size:.95rem;
  line-height:1.45;
}
.baum__kopf .baum__name{ font-weight:600; }

.baum__mass{
  flex:0 0 auto;
  font-size:.8rem;
  color:var(--gedaempft);
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}

/* Beim Aufklappen faehrt der Inhalt herein. Beim ZUklappen nicht: <details>
   nimmt seinen Inhalt sofort aus dem Bild, und das laesst sich ohne Skript
   nicht aufhalten. Ein halber Uebergang ist hier ehrlicher als ein
   nachgebauter, der bei jedem Klick eine Bildhoehe lang haengt. */
.baum__ordner[open] > .baum__ast{ animation:baum-auf .24s ease; }
@keyframes baum-auf{
  from{ opacity:0; transform:translateY(-.35rem); }
  to  { opacity:1; transform:none; }
}

/* --- Fortschritt beim Herunterladen --------------------------------------- */
/* Erscheint unter der Dateizeile, solange geladen wird. Der Einzug links
   bringt ihn auf die Hoehe des Dateinamens, nicht des Symbols davor. */
.baum__fortschritt{
  display:flex; align-items:center; gap:.7rem;
  margin:.15rem 0 .45rem 1.7rem;
  font-size:.8rem;
  color:var(--gedaempft);
  font-variant-numeric:tabular-nums;
}

.baum__balken{
  flex:1 1 auto;
  height:3px;
  min-width:4rem;
  border-radius:2px;
  background:rgba(219,230,238,.14);
  overflow:hidden;
}
.baum__balken-fuell{
  width:0; height:100%;
  background:linear-gradient(90deg, var(--blau) 0%, var(--blau-hell) 100%);
  transition:width .18s linear;
}

/* Ohne Content-Length gibt es keinen Prozentwert. Dann laeuft ein kurzes
   Stueck hin und her — es sagt "es passiert etwas", nicht "so weit ist es".
   Eine erfundene Prozentzahl waere schlimmer als gar keine. */
.baum__balken--unbestimmt .baum__balken-fuell{
  width:35%;
  animation:baum-laeuft 1.1s ease-in-out infinite alternate;
}
@keyframes baum-laeuft{
  from{ transform:translateX(-100%); }
  to  { transform:translateX(286%); }
}

.baum__fortschritt-text{ flex:0 0 auto; white-space:nowrap; }

.baum__abbruch{
  flex:0 0 auto;
  padding:.12rem .55rem;
  border:1px solid rgba(219,230,238,.2);
  border-radius:.25rem;
  background:none;
  color:var(--gedaempft);
  font:inherit; font-size:.78rem;
  cursor:pointer;
  transition:border-color .2s ease, color .2s ease;
}
.baum__abbruch:hover,
.baum__abbruch:focus-visible{
  color:#bfeaff;
  border-color:rgba(120,220,255,.6);
}

@media (max-width:34rem){
  .baum__fortschritt{ margin-left:0; flex-wrap:wrap; }
  .baum__balken{ order:3; flex-basis:100%; }
}

.baum__hinweis{
  margin:.6rem 0 0;
  font-size:.95rem;
  color:var(--gedaempft);
}

.baum__stand{
  margin:.9rem 0 0;
  font-size:.8rem;
  color:var(--gedaempft);
  font-variant-numeric:tabular-nums;
}

@media (prefers-reduced-motion:reduce){
  .baum__ordner[open] > .baum__ast{ animation:none; }
  .baum__pfeil{ transition:none; }
  /* Der unbestimmte Balken darf nicht laufen; er bleibt dann als ruhiger
     Streifen stehen, und die geladene Menge daneben sagt weiter, dass
     etwas vorangeht. */
  .baum__balken--unbestimmt .baum__balken-fuell{ animation:none; width:100%; opacity:.45; }
  .baum__balken-fuell{ transition:none; }
}

@media (max-width:34rem){
  .baum__ordner > .baum__ast{ margin-left:1rem; padding-left:.6rem; }
  /* Auf schmalen Geraeten steht das Mass unter dem Namen statt daneben —
     nebeneinander bliebe fuer den Namen kaum etwas uebrig. */
  .baum__kopf,
  .baum__datei{ flex-wrap:wrap; }
  .baum__mass{ width:100%; padding-left:1.7rem; }
}

/* --- Fusszeile ----------------------------------------------------------- */

/* --- DIE FUSSLEISTE STEHT FEST ------------------------------------------- */
/* Sie liegt seit dem 14.09.2026 fest am unteren Rand des Fensters und rollt
   nicht mit. Auf den langen Seiten — Netzwerk, Unternehmen, Neuigkeiten —
   war Impressum, Datenschutz und AGB sonst erst nach dem ganzen Inhalt zu
   erreichen; bei Pflichtangaben ist das unschoen.

   DREI DINGE MUSSTEN DAFUER ZUSAMMENKOMMEN:

   1. Der Platz muss reserviert werden. Ein festes Element liegt ausserhalb
      des Flusses — ohne Gegenmassnahme verschwaende die letzte Zeile jeder
      Seite darunter. Der Koerper traegt darum unten einen Abstand in Hoehe
      der Leiste. Wie hoch die ist, weiss nur der Browser: sie bricht auf
      schmalen Fenstern um, und die Abstaende schrumpfen auf flachen (siehe
      ganz unten in dieser Datei). Gemessen wird deshalb in site.js, das
      Ergebnis steht in --fuss-hoehe. Der Ersatzwert hier traegt den Fall
      ohne Javascript.

   2. Der Inhalt darf nicht durchscheinen. Vorher lag die Leiste am Ende der
      Seite auf dem Grund und brauchte keine eigene Flaeche. Jetzt rollt
      Text darunter durch, also bekommt sie Milchglas — dieselbe Machart wie
      bei den Blaettern (siehe .blatt__karte::before). Halbdurchsichtig und
      nicht deckend, damit der Hintergrund der Seite weiter durchschimmert;
      wo der Browser das nicht kann, wird sie deckend.

   3. Die Kante darf nicht schneiden. Ein harter Strich, an dem Text
      abgeschnitten wird, sieht nach Fehler aus. Ueber der Leiste liegt
      darum ein schmaler Auslauf, der den Grund nach oben ausblendet.

   Der Stapelwert liegt unter dem der Einwilligungsabfrage (60) und der
   Uebergangsebenen (70): die duerfen weiter darueber liegen. Blaetter sind
   <dialog> und stehen ohnehin in der obersten Ebene. */
.fuss{
  position:fixed; inset:auto 0 0 0; z-index:40;
  padding:clamp(1.5rem,4vh,2.75rem) 1.5rem;
  /* Auf dem Telefon liegt unten der Balken fuer die Gesten. env() gibt
     seine Hoehe; max() sorgt dafuer, dass der gewoehnliche Abstand gilt,
     wo es keinen Balken gibt. */
  padding-bottom:max(clamp(1.5rem,4vh,2.75rem), env(safe-area-inset-bottom));
  border-top:1px solid var(--linie);
  /* DIE ARBEIT MACHT DIE WEICHZEICHNUNG, NICHT DIE DECKUNG.

     Ein erster Anlauf stellte die Deckung auf .90, weil der Text, der unter
     der Leiste durchrollt, noch lesbar schien. Das war ein Trugschluss:
     geprueft wurde in einem Browser ohne Bildschirmbeschleunigung, und dort
     wird backdrop-filter zwar als unterstuetzt gemeldet, aber nicht
     ausgefuehrt — nachgestellt mit einer Probeseite, auf der Text unter
     einem blur(30px)-Balken gestochen scharf stehen blieb. Gemessen wurde
     also nur die Deckung, und die musste dann eben hoch. Das Ergebnis war
     eine schwarze Leiste, und das war nicht gewollt.

     Jetzt liegt die Deckung niedrig genug, dass der Hintergrund der Seite
     weiter durchschimmert. Unlesbar wird der durchrollende Text durch die
     Weichzeichnung, und dazu durch brightness() im selben Filter: das
     dunkelt ab, was DAHINTER liegt, statt eine schwarze Folie davorzulegen.
     Der Unterschied ist genau der zwischen "getoentes Glas" und "Brett".

     WER DIESE WERTE AENDERT, PRUEFT SIE AUF EINEM RICHTIGEN BILDSCHIRM. In
     einem Browser ohne Beschleunigung sieht die Leiste hier zu
     durchsichtig aus — das taeuscht. */
  /* ZWEI SCHRAUBEN, UND SIE TUN VERSCHIEDENES:

     --fuss-toenung  ist die Farbschicht VOR dem Hintergrund. Sie nimmt
                     gleichmaessig Licht weg. Hoeher = dunkler, und es
                     bleibt weniger vom Hintergrund uebrig.
     --fuss-streuung ist die Weichzeichnung DAHINTER. Sie macht Text
                     unlesbar — aber sie loescht auch das Netz: dessen
                     Linien sind duenn und hell, und wer sie weit genug
                     verstreut, hat am Ende eine gleichmaessige Flaeche.

     Ein Zwischenstand stand auf 28 Pixel Streuung und zusaetzlich auf
     brightness(.66). Vom treibenden Netz war unter der Leiste nichts mehr
     zu sehen, und genau darum geht es auf diesen Seiten. Die Streuung ist
     deshalb auf ein Drittel herunter und das Abdunkeln ganz heraus: die
     Punkte des Netzes ueberleben zehn Pixel als weiche Lichter, ein
     Schriftzug in derselben Groesse dagegen faellt auseinander.

     WER HIER DREHT, PRUEFT AUF EINEM RICHTIGEN BILDSCHIRM. Browser ohne
     Bildschirmbeschleunigung melden backdrop-filter als unterstuetzt,
     fuehren ihn aber nicht aus — dann sieht man nur die Toenung und haelt
     sie faelschlich fuer zu schwach. */
  --fuss-toenung: .30;
  --fuss-streuung: 10px;

  background:rgba(4,8,11,var(--fuss-toenung));
  backdrop-filter:saturate(1.25) blur(var(--fuss-streuung));
  /* Eigene Compositor-Ebene, wie beim Blatt. */
  will-change:backdrop-filter;
}

/* Kein Milchglas im Browser? Dann deckend — halbdurchsichtig allein waere
   schlimmer als gar nichts, weil der Text dahinter lesbar bliebe. */
@supports not (backdrop-filter:blur(1px)){
  .fuss{ background:var(--grund); }
}

.fuss::before{
  content:"";
  position:absolute; left:0; right:0; bottom:100%;
  height:2.25rem;
  pointer-events:none;
  background:linear-gradient(to top, rgba(4,8,11,.38), rgba(4,8,11,0));
}

/* Der reservierte Platz. Der Ersatzwert ist grosszuegig gewaehlt: lieber
   etwas Luft zu viel als eine verdeckte Zeile, falls site.js nicht laeuft. */
body{ padding-bottom:var(--fuss-hoehe, 6rem); }

.fuss__in{
  width:min(100% - 1rem, 60rem);
  margin-inline:auto;
  display:flex; flex-wrap:wrap; justify-content:center;
  gap:.5rem clamp(1.5rem,4vw,3rem);
  font-size:.92rem;
}

.fuss a{
  color:var(--gedaempft); text-decoration:none;
  padding:.35rem .1rem;
  transition:color .25s ease;
}
.fuss a:hover,.fuss a:focus-visible{ color:var(--blau-hell); }

/* Soziale Netzwerke — IN der Zeile, direkt hinter "Datenschutz", nicht mehr
   rechts in der Ecke. Frueher schwebten sie absolut positioniert am rechten
   Rand; das trennte sie optisch vom Rest der Fusszeile und riss auf breiten
   Bildschirmen eine grosse Luecke auf. Jetzt sind sie ein weiteres Glied
   derselben zentrierten Reihe und laufen bei schmalen Fenstern mit um.

   In Ruhestellung entsaettigt und abgedunkelt, damit die drei fremden
   Markenfarben nicht heller wirken als der Rest der dunklen Seite; erst
   beim Zeigen mit der Maus kommen Farbe und ein Schein in der Hausfarbe
   dazu — genau wie beim Logo und der Baustellen-Taste. */

.fuss__social{
  display:flex; align-items:center;
  gap:.15rem;
  /* Etwas naeher an den Text davor als der Abstand zwischen den Woertern:
     die drei Zeichen gehoeren sichtbar zu dieser Zeile, bilden aber eine
     eigene kleine Gruppe. */
  margin-left:calc(clamp(1.5rem,4vw,3rem) * -0.35);
}
.fuss__social-link{
  display:inline-flex; align-items:center; justify-content:center;
  padding:.45rem;
  border-radius:4px;
}
.fuss__social-link img{
  display:block;
  height:1.2rem; width:auto;
  filter:grayscale(1) brightness(.55);
  transition:filter .3s ease;
}
@media (hover:hover){
  .fuss__social-link:hover img{
    filter:grayscale(0) brightness(1.05) saturate(1.1)
           drop-shadow(0 0 6px rgba(78,192,230,.9))
           drop-shadow(0 0 14px rgba(0,152,204,.55));
  }
}
.fuss__social-link:focus-visible img{
  filter:grayscale(0) brightness(1.05) saturate(1.1)
         drop-shadow(0 0 6px rgba(78,192,230,.9))
         drop-shadow(0 0 14px rgba(0,152,204,.55));
}

/* Schmale Bildschirme: die Reihe bricht ohnehin um; dann soll die Gruppe
   mittig unter dem Rechtlichen stehen und nicht am Zeilenanfang kleben. */
@media (max-width:640px){
  .fuss__social{
    margin-left:0;
    width:100%;
    justify-content:center;
  }
}

@media (prefers-reduced-motion:reduce){
  .fuss__social-link img{ transition:none; }
}

:focus-visible{ outline:2px solid var(--blau); outline-offset:4px; border-radius:2px; }

/* --- Ruecksichtnahme und Druck ------------------------------------------- */

/* Eine leichte Struktur auf der Wasseroberflaeche. Die Verzerrung allein
   wirkt glasig; ein paar wandernde Baender geben der Flaeche Halt.

   ZWEI getrennte Lagen mit unterschiedlicher Periode (7,2 % und 11,3 %) und
   unterschiedlichem Tempo. Eine einzelne Lage wirkt mechanisch gleichmaessig;
   zwei ueberlagerte finden erst nach 81 % wieder dieselbe Stellung.

   Warum getrennte Lagen und nicht zwei Verlaeufe in einer: jede Lage muss um
   GENAU EINE EIGENE Periode wandern, sonst springt sie am Ende zurueck. Zwei
   Perioden in einer Ebene haetten einen gemeinsamen Umlauf von 813 % — nicht
   darstellbar. Getrennt laeuft jede in ihrem eigenen Takt rund.

   Bewegt wird nur die Position der Lagen, nicht ihr Inhalt — das kann der
   Browser der Grafikkarte ueberlassen. */
.marke__wasser{
  position:absolute;
  left:50%; transform:translateX(-50%);
  width:min(var(--wasser-breite), 88vw);
  top:calc(100% - var(--rand-h) + var(--horizont) + var(--spiegel-abstand));
  height:85.1%;
  pointer-events:none;
  /* Zwei Masken, miteinander verschnitten: nach unten ausblenden und zu den
     Seiten hin auslaufen — sonst sieht man die Kanten des Rechtecks. */
  -webkit-mask-image:
    linear-gradient(to bottom, #000 0%, rgba(0,0,0,.55) 55%, transparent 100%),
    linear-gradient(to right, transparent 0%, #000 16%, #000 84%, transparent 100%);
          mask-image:
    linear-gradient(to bottom, #000 0%, rgba(0,0,0,.55) 55%, transparent 100%),
    linear-gradient(to right, transparent 0%, #000 16%, #000 84%, transparent 100%);
  -webkit-mask-composite:source-in;
          mask-composite:intersect;
}

.marke__wasser i{
  position:absolute; inset:0; display:block;
  will-change:transform;
}

/* Lage 1 — Periode 7,2 % */
.marke__wasser i:first-child{
  background:repeating-linear-gradient(to bottom,
    rgba(4,12,18,0)        0%,
    rgba(4,12,18,0)        1.7%,
    rgba(150,215,242,.055) 2.1%,   /* Lichtsaum auf dem Wellenkamm */
    rgba(4,12,18,.34)      3.0%,
    rgba(4,12,18,.11)      3.9%,
    rgba(4,12,18,0)        4.8%,
    rgba(4,12,18,.22)      6.3%,
    rgba(4,12,18,.06)      6.9%,
    rgba(4,12,18,0)        7.2%);
  animation:welle-a var(--wasser-dauer) linear infinite;
}

/* Lage 2 — Periode 11,3 %, etwas schneller unterwegs */
.marke__wasser i:last-child{
  background:repeating-linear-gradient(to bottom,
    rgba(4,12,18,0)        0%,
    rgba(4,12,18,.16)      1.1%,
    rgba(4,12,18,0)        2.6%,
    rgba(120,200,232,.035) 5.2%,
    rgba(4,12,18,.10)      7.4%,
    rgba(4,12,18,0)        9.0%,
    rgba(4,12,18,.20)     10.4%,
    rgba(4,12,18,0)       11.3%);
  animation:welle-b calc(var(--wasser-dauer) * 1.35) linear infinite;
}

/* Jede Lage wandert um genau ihre eigene Periode — deshalb schliesst der
   Durchlauf nahtlos und es gibt keinen Ruecksprung. */
@keyframes welle-a{
  from{ transform:translateY(0); }
  to  { transform:translateY(-7.2%); }
}

@keyframes welle-b{
  from{ transform:translateY(0); }
  to  { transform:translateY(-11.3%); }
}


/* --- Sprachauswahl in der Fusszeile --------------------------------------- */

.nur-vorlesen{
  position:absolute; width:1px; height:1px; margin:-1px;
  padding:0; border:0; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap;
}

.sprache{ display:inline-flex; align-items:center; }

.sprache__wahl{
  appearance:none; -webkit-appearance:none;
  font:inherit; font-size:.82rem; letter-spacing:.08em;
  color:var(--gedaempft);
  background-color:transparent;
  /* Pfeil als eingebettete Grafik — keine zusaetzliche Datei, kein Nachladen */
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%236b7c86' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right .55rem center;
  background-size:.6rem;
  border:1px solid var(--linie); border-radius:2px;
  padding:.32rem 1.7rem .32rem .62rem;
  cursor:pointer;
  transition:color .25s ease, border-color .25s ease;
}
.sprache__wahl:hover,
.sprache__wahl:focus-visible{ color:var(--blau-hell); border-color:rgba(78,192,230,.45); }

/* Die Liste selbst zeichnet das Betriebssystem — auf dunklem Grund braucht
   sie eigene Farben, sonst steht schwarz auf schwarz. */
.sprache__wahl option{ background:var(--grund-2); color:var(--schrift); }

/* --- Einwilligungsabfrage ------------------------------------------------- */

.einwilligung{
  position:fixed; inset:auto 0 0 0; z-index:60;
  /* UEBER die feste Fussleiste, nicht darauf. Solange die Abfrage offen ist,
     verdeckte sie sonst genau die Verweise, die ein Besucher in diesem
     Moment am ehesten braucht — Datenschutz und Impressum. Der Wert kommt
     aus derselben Messung wie der Abstand am Koerper (site.js). */
  bottom:var(--fuss-hoehe, 6rem);
  display:flex; justify-content:center;
  padding:clamp(.75rem,2.5vw,1.5rem);
  pointer-events:none;
}
.einwilligung[hidden]{ display:none; }

.einwilligung__karte{
  pointer-events:auto;
  width:min(100%, 46rem);
  /* Ebenfalls ohne backdrop-filter, siehe .blatt__karte — die Abfrage
     erscheint waehrend des Seitenaufbaus, gerade da zaehlt jede Ersparnis. */
  background:rgba(10,21,29,.96);
  border:1px solid rgba(219,230,238,.14);
  border-radius:4px;
  box-shadow:0 18px 50px rgba(0,0,0,.55);
  padding:clamp(1.1rem,2.4vw,1.6rem);
  display:grid; gap:.75rem;
  animation:einwilligung-auf .45s cubic-bezier(.2,.7,.3,1) both;
}

@keyframes einwilligung-auf{
  from{ opacity:0; transform:translateY(14px); }
  to  { opacity:1; transform:none; }
}

.einwilligung__titel{
  margin:0; font-size:1rem; font-weight:600; letter-spacing:-.01em;
  color:var(--schrift);
}

.einwilligung__text{
  margin:0; font-size:.9rem; line-height:1.55; color:var(--gedaempft);
  max-width:62ch;
}

.einwilligung__tasten{
  display:flex; flex-wrap:wrap; align-items:center; gap:.6rem 1rem;
  margin-top:.25rem;
}

.taste{
  font:inherit; font-size:.88rem;
  padding:.55rem 1.1rem;
  border-radius:2px; cursor:pointer;
  border:1px solid rgba(219,230,238,.28);
  background:transparent; color:var(--schrift);
  transition:border-color .2s ease, background-color .2s ease, color .2s ease;
}
.taste:hover{ border-color:var(--schrift); }

/* Zustimmen ist hervorgehoben, aber nicht auffaelliger als noetig — eine
   Absage muss genauso leicht zu treffen sein wie eine Zusage. */
.taste--betont{
  border-color:transparent;
  background:var(--blau); color:#04222e; font-weight:600;
}
.taste--betont:hover{ background:var(--blau-hell); }

.einwilligung__mehr{
  font-size:.85rem; color:var(--gedaempft);
  text-decoration:none; border-bottom:1px solid rgba(107,124,134,.4);
  padding-bottom:1px;
  margin-left:auto;
}
.einwilligung__mehr:hover{ color:var(--blau-hell); border-bottom-color:currentColor; }

@media (max-width:520px){
  .einwilligung__tasten{ flex-direction:column; align-items:stretch; }
  .taste{ width:100%; }
  .einwilligung__mehr{ margin:.2rem auto 0; }
}

@media (prefers-reduced-motion:reduce){
  .einwilligung__karte{ animation:none; }
}


/* --- Eingeblendete Blaetter (Impressum, Datenschutz) ---------------------- */

.blatt{
  /* Das <dialog> selbst ist nur der Rahmen; sichtbar ist die Karte darin. */
  border:0; padding:clamp(1rem,4vw,2.5rem); margin:auto;
  width:min(100% - 1.5rem, 46rem);
  max-height:min(84svh, 46rem);
  background:transparent; color:var(--schrift);
  overflow:visible;
}

/* Nur eine leichte Abdunklung: das Blatt soll ueber der Seite schweben,
   sie aber nicht verdecken. */
.blatt::backdrop{
  background:rgba(2,7,10,.32);
}

.blatt__karte{
  display:flex; flex-direction:column;
  max-height:min(84svh, 46rem);
  /* Halbtransparent, mit Milchglas — aber auf einer EIGENEN EBENE darunter
     (siehe ::before). Lag die Weichzeichnung auf der Karte selbst, musste sie
     bei jeder Aenderung im Inhalt neu gerechnet werden; das machte die
     Texteingabe traege. Auf eigener Ebene ist es deutlich guenstiger:
     gemessen beim Tippen, vierfach gedrosselt, 14,3 statt 8,5 Bilder je
     Sekunde. Ganz ohne Weichzeichnung waeren es 24 — dieser Rest ist der
     Preis fuer das Aussehen und bewusst so entschieden. */
  background:transparent;
  border:1px solid rgba(219,230,238,.16);
  border-radius:5px;
  /* Schattenwurf auf die darunter liegende Seite */
  box-shadow:
    0 32px 70px rgba(0,0,0,.62),
    0 6px 18px rgba(0,0,0,.45),
    0 0 60px rgba(0,152,204,.10);
  overflow:hidden;
  /* Beim Einblenden wird NUR geschoben, nicht ein-/ausgeblendet.
     Grund: solange auf einem Element eine Deckkraft ungleich 1 liegt,
     zeichnet der Browser die Weichzeichnung dahinter nicht — sie sprang
     deshalb erst am Ende der Einblendung an. Gemessen ueber die
     Kantenschaerfe hinter der Karte: mit Deckkraftwechsel 4,97 (scharf)
     waehrend der Einblendung, nur mit Verschiebung 3,23 (bereits
     weichgezeichnet). Der Inhalt blendet separat ein, siehe unten. */
  animation:blatt-schieben .34s cubic-bezier(.2,.7,.3,1) both;
}

/* Die Milchglasebene. Enthaelt selbst nichts und aendert sich nie — dadurch
   bleibt sie beim Tippen unberuehrt. */
.blatt__karte::before{
  content:"";
  position:absolute; inset:0; z-index:-1;
  border-radius:inherit;
  background:rgba(9,19,26,.70);
  backdrop-filter:saturate(1.2) blur(16px);
  /* Eigene Compositor-Ebene — bringt gemessen rund ein Bild je Sekunde,
     kostet nichts. */
  will-change:backdrop-filter;
}


@keyframes blatt-schieben{
  from{ transform:translateY(14px); }
  to  { transform:none; }
}

/* Der Inhalt blendet ein — er liegt ueber der Milchglasebene und stoert sie
   nicht. So wirkt das Oeffnen weich, ohne dass die Weichzeichnung aussetzt. */
.blatt__kopf,
.blatt__inhalt{
  animation:blatt-inhalt .34s ease both;
}

@keyframes blatt-inhalt{
  from{ opacity:0; }
  to  { opacity:1; }
}

.blatt__kopf{
  display:flex; align-items:center; gap:1rem;
  padding:clamp(1rem,2.4vw,1.4rem) clamp(1.1rem,2.6vw,1.7rem);
  border-bottom:1px solid rgba(219,230,238,.12);
  flex:none;
}

.blatt__titel{
  margin:0; font-size:1.05rem; font-weight:600; letter-spacing:-.01em;
}

.blatt__zu{
  margin-left:auto; flex:none;
  width:2.25rem; height:2.25rem;      /* gross genug fuer den Daumen */
  display:grid; place-items:center;
  background:transparent; color:var(--gedaempft);
  border:1px solid rgba(219,230,238,.16); border-radius:3px;
  cursor:pointer;
  transition:color .2s ease, border-color .2s ease;
}
.blatt__zu svg{ width:.75rem; height:.75rem; }
.blatt__zu:hover{ color:var(--schrift); border-color:rgba(219,230,238,.4); }

.blatt__inhalt{
  overflow-y:auto;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;   /* das Blaettern greift nicht auf die Seite durch */
  padding:clamp(1rem,2.6vw,1.6rem) clamp(1.1rem,2.6vw,1.7rem) clamp(1.4rem,3vw,2rem);
  font-size:.92rem; line-height:1.62; color:var(--gedaempft);
  scrollbar-width:thin;
  scrollbar-color:rgba(219,230,238,.28) transparent;
}
.blatt__inhalt::-webkit-scrollbar{ width:9px; }
.blatt__inhalt::-webkit-scrollbar-thumb{
  background:rgba(219,230,238,.24); border-radius:9px;
  border:2px solid transparent; background-clip:content-box;
}
.blatt__inhalt::-webkit-scrollbar-thumb:hover{ background:rgba(219,230,238,.42); background-clip:content-box; }

.blatt__inhalt h3{
  margin:1.6rem 0 .4rem; font-size:.82rem; font-weight:600;
  letter-spacing:.1em; text-transform:uppercase; color:var(--schrift);
}
.blatt__inhalt h3:first-of-type{ margin-top:.6rem; }
.blatt__inhalt p{ margin:0 0 .9rem; max-width:64ch; }
.blatt__inhalt ul{ margin:0 0 .9rem; padding-left:1.15rem; max-width:64ch; }
.blatt__inhalt li{ margin:.3rem 0; }
.blatt__inhalt a{ color:var(--blau-hell); text-decoration-color:rgba(78,192,230,.45); }

/* --- Das AGB-Blatt -------------------------------------------------------- */
/* Die AGB sind das einzige Blatt mit zwei Gliederungsebenen: Teile (h3, wie
   ueberall) und Paragraphen (h4). Der Paragraph steht ruhiger als der Teil —
   gemischte Schreibung statt Versalien, sonst schreit bei 86 Paragraphen die
   halbe Seite. */
.blatt__inhalt h4{
  margin:1.3rem 0 .35rem; font-size:.95rem; font-weight:600;
  letter-spacing:.01em; color:var(--schrift);
}
.blatt__inhalt h3 + h4{ margin-top:.7rem; }

/* Die Standzeile ueber dem Text: bei AGB ist das Datum keine Nebensache,
   sondern sagt, welche Fassung man vor sich hat. */
.blatt__stand{
  margin:0 0 .9rem;
  font-size:.85rem; color:var(--gedaempft);
}

/* Der Weg zum PDF, am Ende des Textes. Gleiche Form wie die Tasten auf den
   Bereichsseiten (.baustelle__taste), damit die Seite eine Sprache spricht. */
.blatt__laden{ margin:1.8rem 0 .4rem; }
/* Oben schliesst der Knopf den Vorspann ab: Standzeile, Knopf, Trennlinie,
   dann der Text. Die Linie sass vorher an der Standzeile. */
.blatt__laden--oben{
  margin:0 0 1.5rem; padding-bottom:1.4rem;
  border-bottom:1px solid rgba(219,230,238,.14);
}
.blatt__laden-taste{
  display:inline-block;
  padding:.6rem 1.3rem;
  border:1px solid rgba(78,192,230,.42);
  border-radius:3px;
  color:var(--schrift); text-decoration:none;
  transition:border-color .25s ease, box-shadow .25s ease, color .25s ease;
}
@media (hover:hover){
  .blatt__laden-taste:hover{
    color:#bfeaff; border-color:rgba(120,220,255,.8);
    box-shadow:0 0 24px rgba(0,152,204,.22);
  }
}
.blatt__laden-taste:focus-visible{
  color:#bfeaff; border-color:rgba(120,220,255,.8);
  box-shadow:0 0 24px rgba(0,152,204,.22);
}
@media (prefers-reduced-motion:reduce){
  .blatt__laden-taste{ transition:none; }
}

/* Produktnamen in der Liste: fuehren auf eine eigene Seite, deshalb ein
   spuerbarer Schein beim Ueberfahren statt der schlichten Unterstreichung
   der uebrigen Blatt-Verweise. Dieselbe Hausfarbe wie ueberall sonst. */
.produkt-verweis{
  color:var(--schrift);
  font-weight:600;
  text-decoration:none;
  border-bottom:1px solid rgba(219,230,238,.28);
  transition:color .25s ease, border-color .25s ease, text-shadow .3s ease;
}
@media (hover:hover){
  .produkt-verweis:hover{
    color:#bfeaff;
    border-bottom-color:rgba(120,220,255,.7);
    text-shadow:0 0 10px rgba(78,192,230,.75), 0 0 22px rgba(0,152,204,.4);
  }
}
.produkt-verweis:focus-visible{
  color:#bfeaff;
  border-bottom-color:rgba(120,220,255,.7);
  text-shadow:0 0 10px rgba(78,192,230,.75), 0 0 22px rgba(0,152,204,.4);
}

/* Kennzeichnet Texte, die noch nicht geprueft sind. */
.blatt__hinweis{
  margin:0 0 1.2rem;
  padding:.6rem .8rem;
  border-left:2px solid var(--blau);
  background:rgba(0,152,204,.08);
  color:var(--schrift); font-size:.85rem;
}

@media (prefers-reduced-motion:reduce){
  .blatt__karte,
  .blatt__kopf,
  .blatt__inhalt{ animation:none; }
}



/* --- Karte im Kontaktblatt ------------------------------------------------ */
/* Das Bild bleibt unveraendert, die Einfaerbung macht das CSS. So laesst sich
   der Ton jederzeit anpassen, ohne die Datei neu zu erzeugen.

   Zwei Schritte: das Bild wird entfaerbt und abgedunkelt, darueber liegt eine
   Ebene in der Hausfarbe im Modus "color". Der uebernimmt die Farbe der
   Ebene und behaelt die Helligkeit des Bildes — daher bleiben Strassen,
   Daecher und Felder unterscheidbar, nur eben in Blau statt Gruen. */

.karte{
  position:relative; display:block;
  margin:0 0 1.6rem;
  border-radius:4px; overflow:hidden;
  border:1px solid rgba(219,230,238,.14);
  box-shadow:0 10px 26px rgba(0,0,0,.4);
  isolation:isolate;                 /* haelt den Mischmodus im Bild */
  text-decoration:none;
  transition:border-color .25s ease, box-shadow .25s ease;
}
.karte:hover,.karte:focus-visible{
  border-color:rgba(78,192,230,.5);
  box-shadow:0 12px 30px rgba(0,0,0,.5), 0 0 26px rgba(0,152,204,.18);
}

.karte__bild{
  display:block; width:100%; height:auto;
  /* Erst entfaerben und deutlich abdunkeln — sonst leuchtet die Karte
     staerker als das Logo und zieht den Blick von der Seite weg. */
  filter:grayscale(1) brightness(.46) contrast(1.3);
}

/* Ebene 1: die Farbe. "color" uebernimmt den Farbton der Ebene und behaelt
   die Helligkeit des Bildes — Strassen, Daecher und Felder bleiben dadurch
   unterscheidbar, nur eben in Blau statt Gruen. Bewusst nicht voll gedeckt,
   sonst wirkt die Karte wie eingefaerbtes Papier statt wie Luftbild. */
.karte__ton{
  position:absolute; inset:0; pointer-events:none;
  background:var(--blau);
  mix-blend-mode:color;
  opacity:.62;
}

/* Ebene 2: Tiefe. Ein dunkler Verlauf von unten und eine leichte
   Randabdunklung binden die Karte in die Flaeche ein. */
.karte::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:
    linear-gradient(180deg, rgba(4,12,18,.16) 0%, rgba(4,12,18,.52) 100%),
    radial-gradient(120% 100% at 50% 45%, transparent 45%, rgba(4,12,18,.5) 100%);
}

/* Nadel und Hinweis muessen ueber der Abdunklung liegen. */
.karte__nadel,.karte__hinweis,.karte__quelle{ z-index:2; }

/* Der Standort. Bewusst nachgezeichnet und nicht aus dem Bild uebernommen:
   die rote Originalnadel wuerde durch die Einfaerbung verschwinden. */
.karte__nadel{
  position:absolute; left:50%; top:50%;
  width:clamp(1.5rem,3.2vw,1.9rem);
  transform:translate(-50%,-92%);
  pointer-events:none;
  filter:drop-shadow(0 3px 6px rgba(0,0,0,.6));
}
.karte__nadel svg{ width:100%; height:auto; display:block; fill:var(--blau-hell); }
.karte__nadel-kern{ fill:#04222e; }

/* Kartendaten gehoeren dem Anbieter — die Quellenangabe steht deshalb im
   Bild und nicht nur im Impressum. */
.karte__quelle{
  position:absolute; left:.6rem; bottom:.6rem;
  font-size:.68rem; letter-spacing:.04em;
  color:rgba(219,230,238,.62);
  text-shadow:0 1px 3px rgba(0,0,0,.8);
}

.karte__hinweis{
  position:absolute; right:.6rem; bottom:.6rem;
  font-size:.72rem; letter-spacing:.06em;
  color:var(--schrift);
  background:rgba(4,12,18,.66);
  border:1px solid rgba(219,230,238,.16);
  border-radius:2px;
  padding:.3rem .55rem;
}
.karte:hover .karte__hinweis{ color:var(--blau-hell); }


/* --- Ansicht des Eingangs -------------------------------------------------- */
/* Dieselbe Behandlung wie die Karte: entfaerben, abdunkeln, Hausfarbe im
   Mischmodus "color" darueber. Damit stehen Karte und Foto in derselben
   Stimmung, obwohl das eine ein Luftbild und das andere eine Strassenansicht
   ist. */

.ansicht{
  position:relative;
  margin:1rem 0 0;
  border-radius:4px; overflow:hidden;
  border:1px solid rgba(219,230,238,.14);
  box-shadow:0 10px 26px rgba(0,0,0,.4);
  isolation:isolate;
}

.ansicht__bild{
  display:block; width:100%; height:auto;
  /* Weniger Kontrast als bei der Karte: die helle Hausfassade wuerde sonst
     deutlich staerker leuchten als das gleichmaessige Luftbild darueber. */
  filter:grayscale(1) brightness(.44) contrast(1.04);
}

/* Die Abdunklung von .karte::after noch einmal, damit das Foto ebenso in die
   Flaeche eingebunden wird. */
.ansicht::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:
    linear-gradient(180deg, rgba(4,12,18,.30) 0%, rgba(4,12,18,.20) 38%, rgba(4,12,18,.54) 100%),
    radial-gradient(120% 100% at 50% 45%, transparent 40%, rgba(4,12,18,.52) 100%);
}

.ansicht .karte__quelle,
.ansicht__text{ z-index:2; position:relative; }

.ansicht__text{
  margin:0;
  padding:.55rem .8rem .7rem;
  font-size:.82rem; color:var(--gedaempft);
  background:rgba(4,12,18,.55);
}

/* --- Nachricht schreiben --------------------------------------------------- */

.post{ display:grid; gap:.85rem; margin-top:.2rem; }

.post__hinweis{
  margin:0; font-size:.85rem; color:var(--gedaempft);
  border-left:2px solid var(--blau);
  background:rgba(0,152,204,.07);
  padding:.55rem .75rem;
}

.post__zeile{ display:grid; gap:.85rem; }
@media (min-width:34rem){ .post__zeile{ grid-template-columns:1fr 1fr; } }

.post__feld{ display:grid; gap:.3rem; }
.post__feld > span{
  font-size:.76rem; letter-spacing:.09em; text-transform:uppercase;
  color:var(--gedaempft);
}

.post__feld input,
.post__feld textarea{
  font:inherit; font-size:.92rem;
  color:var(--schrift);
  background:rgba(4,12,18,.5);
  border:1px solid rgba(219,230,238,.16);
  border-radius:3px;
  padding:.6rem .7rem;
  width:100%;
  transition:border-color .2s ease, background-color .2s ease;
}
.post__feld textarea{ resize:vertical; min-height:6rem; line-height:1.55; }
.post__feld input:hover,
.post__feld textarea:hover{ border-color:rgba(219,230,238,.3); }
.post__feld input:focus,
.post__feld textarea:focus{
  outline:none;
  border-color:var(--blau);
  background:rgba(4,12,18,.7);
}
.post__feld input::placeholder,
.post__feld textarea::placeholder{ color:rgba(107,124,134,.7); }

.post__fuss{
  display:flex; flex-wrap:wrap; align-items:center; gap:.7rem 1rem;
  margin-top:.2rem;
}
/* Koederfeld gegen automatisierte Eintraege. Bewusst NICHT display:none —
   manche Ausfuellhilfen und Roboter ueberspringen versteckte Felder, ein
   aus dem Bild geschobenes Feld dagegen nicht. Fuer Vorlesesoftware ist es
   ueber aria-hidden und tabindex ausgenommen. */
.post__koeder{
  position:absolute; left:-9999px; top:auto;
  width:1px; height:1px; overflow:hidden;
}

.post__meldung{ font-size:.85rem; color:var(--gedaempft); }
.post__meldung--fehler{ color:#ffb27a; }
.post__meldung--gut{ color:#7fdcfa; }

.taste:disabled{ opacity:.55; cursor:progress; }

@media (pointer:coarse){
  .post__feld input,
  .post__feld textarea{ padding:.75rem .8rem; font-size:1rem; }
}

/* --- Bedienung mit dem Finger --------------------------------------------- */
/* Mit der Maus genuegen kleine Ziele, mit dem Daumen nicht. Gemessen lagen
   die Fusszeilenverweise bei 28 Bildpunkten Hoehe — empfohlen sind rund 44.
   Greift nur bei grobem Zeigegeraet, das Aussehen am Rechner bleibt gleich. */
@media (pointer:coarse){
  .fuss a{ padding:.72rem .4rem; }
  .fuss__social-link{ padding:.8rem; }
  .fuss__in{ gap:.25rem clamp(1rem,3vw,2rem); }
  .sprache__wahl{ padding:.62rem 1.8rem .62rem .72rem; }
  .blatt__zu{ width:2.75rem; height:2.75rem; }
  .taste{ padding:.78rem 1.2rem; }
  .einwilligung__mehr{ padding:.6rem 0; }
}


/* --- Ruhe, solange ein Blatt offen ist ------------------------------------ */
/* Die Wasserverzerrung wird in jedem Einzelbild neu gerechnet. Liegt ein
   Blatt darueber, sieht man davon fast nichts — spuerbar ist es trotzdem:
   ohne diese Regel wird die Texteingabe im Kontaktformular traege, weil jeder
   Tastendruck einen neuen Durchlauf ausloest. Das Logo liegt hinter dem Blatt,
   der Verzicht faellt nicht auf. */
body.blatt-offen .marke__spiegel{ filter:blur(.7px) saturate(.85); }
body.blatt-offen .marke__wasser i,
body.blatt-offen .glanz{ animation-play-state:paused; }

/* --- Ausfuellhilfe des Browsers ------------------------------------------- */
/* Chrome und Edge faerben automatisch ausgefuellte Felder hellgelb — auf
   dunklem Grund ein Fremdkoerper. Die Fuellfarbe laesst sich nicht direkt
   setzen, wohl aber mit einem einwaerts gerichteten Schatten uebermalen. */
.post__feld input:-webkit-autofill,
.post__feld input:-webkit-autofill:hover,
.post__feld input:-webkit-autofill:focus,
.post__feld textarea:-webkit-autofill{
  -webkit-text-fill-color:var(--schrift);
  -webkit-box-shadow:0 0 0 40rem #0a151d inset;
  box-shadow:0 0 0 40rem #0a151d inset;
  caret-color:var(--schrift);
  transition:background-color 9999s ease-in-out 0s;   /* verhindert das Aufblitzen */
}
.post__feld input:-webkit-autofill::first-line{
  font:inherit; font-size:.92rem; color:var(--schrift);
}

/* --- Notbremse ------------------------------------------------------------ */
/* <body class="ruhig"> schaltet die beiden teuersten Bewegungen ab: die
   Wasserbaender und den Glanz in der Spiegelung. Gemessen kosten die beiden
   zusammen rund ein Drittel der Bildrate. Falls die Seite auf einem Geraet
   haengt, ist das der erste Griff — das Logo und sein Lichtband bleiben. */
body.ruhig .marke__spiegel{ filter:blur(.7px) saturate(.85); }
body.ruhig .marke__spiegel g[mask]{ display:none; }
body.ruhig .marke__wasser i{ animation:none; }

@media (prefers-reduced-motion:reduce){
  .glanz{ animation:none; opacity:0; }
  /* Ohne Bewegungswunsch: Wasserverzerrung weglassen, Spiegelung bleibt. */
  .marke__spiegel{ filter:blur(.7px) saturate(.85); }
  .marke__wasser i{ animation:none; }
  .buehne::before{ animation:none; opacity:.8; }
}

@media print{
  body::before,body::after,.buehne::before,.glanz{ display:none; }
  body{ background:#fff; color:#000; }
}

/* --- FLACHE FENSTER: DIE SEITE MIT DEM TROMMELMENUE MUSS INS BILD PASSEN --- */
/* STEHT MIT ABSICHT GANZ AM ENDE DER DATEI. Diese Regeln uebersteuern
   Werte, die weiter oben stehen (.baustelle, .radwahl, .radwahl__buehne,
   .fuss) — bei gleicher Spezifitaet entscheidet die Reihenfolge, und ein
   Media Query aendert daran nichts. Der erste Versuch stand vor
   .radwahl__buehne und blieb genau deshalb wirkungslos: die Buehne
   behielt ihre 18rem.  */
/* Die Seite mit dem Trommelmenue ist als EIN Bild gedacht — Wortmarke,
   Trommel und Fusszeile ohne Rollen. Das ging nicht auf: der Inhalt von
   .baustelle ist rund 710 Pixel hoch und schrumpft nicht, dazu kamen 96
   Pixel Innenabstand und die Fusszeile. Gemessen wurde das Dokument
   dadurch 909 Pixel hoch — bei 900 Pixel Fensterhoehe neun zu viel, bei
   800 gleich hundert. Die Fusszeile mit den Verweisen auf die sozialen
   Netzwerke rutschte damit unter den sichtbaren Rand, und man musste
   rollen, um sie ueberhaupt zu sehen.

   flex:1 hilft dabei NICHT: Flexkinder haben min-height:auto und
   schrumpfen nicht unter ihren Inhalt. Also muessen die Abstaende weichen,
   und zwar nur dort, wo die Hoehe knapp ist — auf hohen Bildschirmen soll
   die Seite luftig bleiben.

   Die Werte sind nicht geraten, sondern nachgemessen: bei 800 Pixel
   Fensterhoehe fehlten genau 101 Pixel. */
@media (max-height:58rem){
  .baustelle{ padding:1.4rem 1.5rem; gap:.7rem; }
  .radwahl{ margin:1.3rem 0 .9rem; }
  .fuss{ padding-top:1.1rem; padding-bottom:1.1rem; }
}
@media (max-height:50rem){
  .baustelle{ padding:.9rem 1.5rem; gap:.5rem; }
  .radwahl{ margin:.8rem 0 .6rem; }
  .fuss{ padding-top:.9rem; padding-bottom:.9rem; }
  /* Die Buehne darf kuerzer werden, ohne dass die Trommel Schaden nimmt:
     die aeusseren Felder liegen ohnehin bei Deckkraft 0,16 und laufen in
     die Ausblendmaske hinein. Der Halbmesser der Trommel steckt in
     radwahl.js (RADIUS = 132) und bleibt unangetastet — die Geometrie
     aendert sich also nicht, nur der Ausschnitt. */
  .radwahl__buehne{ height:15.5rem; }
}
@media (max-height:44rem){
  .baustelle{ padding:.6rem 1.5rem; gap:.35rem; }
  .radwahl{ margin:.5rem 0 .4rem; }
  .fuss{ padding-top:.7rem; padding-bottom:.7rem; }
  .radwahl__buehne{ height:13.5rem; }
}
