/* ==========================================================================
   OfficeShare24 — Design System

   Hell und rund wie Airbnb, dazu die überlebensgroße Schrift und die
   schwarzen Kontrastbänder aus der Officex-Referenz.

   Farben stammen aus dem Logo, mit der Pipette gemessen:
     Blau   #4599F9  (Bildmarke)
     Blau   #68B1FD  (Wortmarke, heller)
     Schwarz #000000

   Die eine Zahl, die das ganze System bestimmt: **Weiß auf #4599F9 hat
   2,93:1.** Ein blauer Knopf mit weißer Schrift fiele also durch jede
   Prüfung. Schwarz auf demselben Blau hat 6,5:1.

   Daraus folgt:
     * Primäre Handlung = schwarze Pille mit weißer Schrift (18,5:1).
       Das ist zugleich die Sprache der Officex-Referenz.
     * Blau ist Akzent: Marke, aktiver Zustand, Fokusring, Preisnadel,
       ausgewählter Filter. Als Fläche immer mit dunkler Schrift.
     * Blau als Textfarbe nur abgedunkelt: #3677C2 hat 4,59:1 auf Weiß.
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. SCHRIFT

   Eine Familie für alles: Plus Jakarta Sans.

   Sie kann, was hier gebraucht wird — 200–800 als Variable Font, eine
   echte Kursive für die zweite Zeile der Heldenüberschrift, tabellarische
   Ziffern für die Preisspalten. Beide Tokens zeigen deshalb auf dieselbe
   Familie; `--font-display` bleibt als eigener Name stehen, damit sich
   Überschriften später wieder trennen lassen, ohne jede Regel anzufassen.

   Selbst gehostet, kein Aufruf an fonts.googleapis.com und keiner an
   fonts.gstatic.com. Zwei Gründe: Jede fremde Anfrage ist eine Anfrage
   mehr, die vor dem ersten Buchstaben beantwortet sein will, und eine
   Adresse mehr, die einem Besucher in der EU zugeordnet werden kann.

   Vier Dateien in assets/fonts/, zusammen 100 KB: aufrecht und kursiv,
   jeweils latin und latin-ext. `unicode-range` trennt die Zeichensätze —
   wer nur Deutsch liest, lädt die 21 KB für latin-ext gar nicht erst, und
   die Kursive kommt nur auf der Startseite an.

   Japanisch und Chinesisch stehen nicht darin und standen es nie — dort
   greift wie bisher die Systemschrift. Ein CJK-Schnitt wiegt Megabyte;
   ihn mitzuliefern hieße, allen anderen die Ladezeit dafür aufzuhalsen.

   Aktualisieren: siehe README, Abschnitt „Die Schrift".
   -------------------------------------------------------------------------- */

@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url('../fonts/plus-jakarta-sans-latin-normal.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                 U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url('../fonts/plus-jakarta-sans-latin-ext-normal.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                 U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                 U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: italic;
  font-weight: 200 800;
  font-display: swap;
  src: url('../fonts/plus-jakarta-sans-latin-italic.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                 U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: italic;
  font-weight: 200 800;
  font-display: swap;
  src: url('../fonts/plus-jakarta-sans-latin-ext-italic.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                 U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                 U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* --------------------------------------------------------------------------
   1. TOKENS
   -------------------------------------------------------------------------- */

:root {
  /* Marke — gemessen aus Logo1.JPG und Logo2.JPG */
  --brand:       #4599F9;  /* Bildmarke. Fläche und Akzent, nie Text auf Weiß */
  --brand-soft:  #68B1FD;  /* Wortmarke */
  --brand-text:  #3677C2;  /* dieselbe Farbe abgedunkelt — 4,59:1 auf Weiß */
  --brand-deep:  #1E4E86;  /* gedrückter Zustand */
  --brand-100:   #E4F0FE;  /* Fläche für ausgewählte Zustände */
  --brand-50:    #F3F8FF;

  /* Rückwärtskompatible Namen, damit bestehende Regeln weiterlaufen */
  --blue:      var(--brand-text);
  --blue-700:  var(--brand-deep);
  --blue-600:  var(--brand);
  --blue-100:  var(--brand-100);
  --blue-50:   var(--brand-50);

  /* Kontrastband. Schwarz wie im Logo, nicht blau. */
  --brand-surface: #0B0D10;

  /* Flächen — reinweiß, nicht cremefarben. Airbnb lebt vom weißen Grund,
     auf dem die Fotos die einzige Farbe sind. */
  --surface:     #FFFFFF;
  --card:        #FFFFFF;
  --card-sunk:   #F5F6F8;

  /* Text */
  --ink:         #111418;  /* 18,5:1 */
  --ink-2:       #454C56;  /* 9,2:1  — Fließtext sekundär */
  --ink-3:       #5B6472;  /* 5,98:1 — Hilfstext */

  /* Linien — Haarlinien, keine grauen Kästen */
  --line:        #EBEDF0;
  --line-2:      #DDE0E5;
  --line-3:      #98A0AC;

  /* Zustände */
  --ok:        #1F7A4D;
  --ok-bg:     #E6F4EC;
  --warn:      #8A5A10;
  --warn-bg:   #FBF0DE;
  --danger:    #C0261C;
  --danger-bg: #FCEAE8;

  /* Schrift — eine Familie, zwei Namen.
     `--font-display` gehört h1 und h2, `--font-sans` allem Übrigen; dass
     beide auf dasselbe zeigen, ändert nichts an der Trennung. Sie steht
     im Bauplan, damit sich Überschriften später wieder anders setzen
     lassen, ohne jede Regel im Haus anzufassen. */
  --font-sans:    'Plus Jakarta Sans', system-ui, sans-serif;
  --font-display: var(--font-sans);

  /* Typskala — die Überschriften sind bewusst größer als vorher.
     Officex setzt die Wortmarke über die ganze Breite; das ist der Zug,
     der eine Vermietungsseite von einem Formular unterscheidet. */
  --t--1: clamp(0.8rem, 0.785rem + 0.07vw, 0.86rem);
  --t-0:  clamp(0.95rem, 0.93rem + 0.1vw, 1rem);
  --t-1:  clamp(1.1rem, 1.04rem + 0.3vw, 1.3rem);
  --t-2:  clamp(1.45rem, 1.25rem + 0.9vw, 2.1rem);
  --t-3:  clamp(1.95rem, 1.5rem + 2.1vw, 3.4rem);
  --t-4:  clamp(2.6rem, 1.6rem + 4.6vw, 5.75rem);

  /* Raum — großzügiger als vorher. Abschnitte atmen. */
  --s-1: 0.5rem;
  --s-2: 1rem;
  --s-3: 1.5rem;
  --s-4: 2rem;
  --s-5: 3.25rem;
  --s-6: 5rem;
  --s-7: 7.5rem;

  /* Maß & Form
     Airbnb rundet Bilder mit 12 px und Karten mit 16 px; Knöpfe und
     Eingaben sind Pillen. Die Radien sind konzentrisch gerechnet: Ein
     Innenkörper in einer Schale bekommt Außenradius minus Polsterung,
     sonst laufen die Kurven nicht parallel. */
  --maxw: 1400px;
  --gutter: 1.25rem;
  --r-sm:   10px;
  --r:      14px;
  --r-card: 18px;
  --r-shell: 26px;   /* Schale um Suchleiste, Filter, Buchungstafel */
  --r-pill: 999px;

  /* Bewegung — eine Kurve mit Masse, keine gleichförmige Blende */
  --ease-out:  cubic-bezier(0.32, 0.72, 0, 1);
  --ease-soft: cubic-bezier(0.22, 1, 0.36, 1);
  --dur-hover: 200ms;
  --dur-reveal: 700ms;
  --dur-panel: 380ms;

  /* Schatten — breit und sehr weich gestreut. Kein dunkler Rand unter der
     Karte, sondern der Eindruck, dass sie ein Stück über dem Blatt liegt. */
  --sh-1: 0 1px 2px rgba(17, 20, 24, 0.04), 0 4px 12px -4px rgba(17, 20, 24, 0.06);
  --sh-2: 0 2px 6px rgba(17, 20, 24, 0.04), 0 12px 28px -10px rgba(17, 20, 24, 0.10);
  --sh-3: 0 4px 12px rgba(17, 20, 24, 0.05), 0 24px 60px -20px rgba(17, 20, 24, 0.16);
  --sh-nav: 0 1px 0 rgba(17, 20, 24, 0.07);

  color-scheme: light;
}

@media (min-width: 720px) { :root { --gutter: 2.25rem; } }

/* Dunkelmodus ist eine bewusste Wahl, keine Folge der Systemeinstellung.
   Der Auftrag lautet „hell wie Airbnb" — wer den Rechner dunkel gestellt
   hat, bekäme sonst nie zu sehen, was hier entworfen wurde. Der Schalter
   im Kopf setzt data-theme und merkt sich die Wahl. */
:root[data-theme="dark"] {
    color-scheme: dark;
    /* Auf dunklem Grund trägt das Markenblau direkt: #4599F9 auf #0E1116
       hat 6,46:1. Abdunkeln wäre hier falsch. */
    --brand:      #4599F9;
    --brand-soft: #68B1FD;
    --brand-text: #7CBBFF;
    --brand-deep: #2A6FC4;
    --brand-100:  #12243A;
    --brand-50:   #0F1C2C;

    --brand-surface: #06070A;

    --surface:   #0E1116;
    --card:      #171B21;
    --card-sunk: #12161B;

    --ink:       #EDEFF2;
    --ink-2:     #B5BCC6;
    --ink-3:     #8C95A1;

    --line:      #242A31;
    --line-2:    #333A43;
    --line-3:    #79828E;

    --ok:      #5FCB92;  --ok-bg:     #10261B;
    --warn:    #E0A968;  --warn-bg:   #2A1F10;
    --danger:  #F0837A;  --danger-bg: #2B1513;

    --sh-1: 0 1px 2px rgba(0,0,0,0.5);
    --sh-2: 0 2px 6px rgba(0,0,0,0.5), 0 12px 28px -10px rgba(0,0,0,0.6);
    --sh-3: 0 4px 12px rgba(0,0,0,0.5), 0 24px 60px -20px rgba(0,0,0,0.7);
    --sh-nav: 0 1px 0 rgba(255,255,255,0.07);
  }

/* --------------------------------------------------------------------------
   2. RESET
   -------------------------------------------------------------------------- */

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

html {
  /* Die Familie steht schon auf dem Wurzelelement und nicht erst auf
     `body`. Sonst bliebe genau ein Element im Dokument auf der Vorgabe
     des Browsers stehen — sichtbar wird das nie, aber eine Prüfung „läuft
     jede Schrift über die Tokens?" hätte immer einen Treffer. */
  font-family: var(--font-sans);
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: 6rem;
}

body {
  margin: 0;
  background: var(--surface);
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: var(--t-0);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
}

img, svg, video { max-width: 100%; display: block; }
img { height: auto; }
button, input, select, textarea { font: inherit; color: inherit; }

/* Mit einer Familie muss das Gewicht die Rangfolge tragen, für die sonst
   zwei Schriften nebeneinander stünden: h1 und h2 in 700, h3 und alles
   darunter in 600. Die enge Laufweite gilt für beide Ebenen — sie ist der
   Grund, warum große Zeilen nicht auseinanderfallen.

   Die Trennung der Tokens bleibt trotzdem an der Ordnungsebene und nicht
   an der Größe: `--font-display` steht an h1 und h2, `--font-sans` an
   allem Übrigen. Solange beide dasselbe bedeuten, sieht man davon nichts
   — beim nächsten Wechsel schon. */
h1, h2 {
  font-family: var(--font-display);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0;
  text-wrap: balance;
}
h3, h4 {
  font-family: var(--font-sans);
  font-weight: 600;
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0;
  text-wrap: balance;
}

p { margin: 0; text-wrap: pretty; }
ul, ol { margin: 0; padding: 0; list-style: none; }
a { color: inherit; text-decoration: none; }

:focus-visible { outline: 2px solid var(--blue); outline-offset: 3px; border-radius: 4px; }
:focus:not(:focus-visible) { outline: none; }
::selection { background: var(--blue); color: #fff; }

/* Zahlen laufen tabellarisch, wo sie in Spalten oder Listen stehen.

   Voreingestellt sind proportionale Ziffern: Die 1 ist schmaler als die 8,
   und untereinander gesetzte Beträge zappeln dann um ein paar Pixel. In
   Fließtext ist das richtig, in einer Preisspalte nicht.

   Betroffen sind Preise, Zählwerte (Städte, Länder, Treffer), Kennzahlen,
   Teamgrößen, Seitenzahlen und die Tage im Kalender — dort ist es am
   deutlichsten, weil dreißig Zellen ein Raster bilden. */
.num,
.price, .price-unit,
.spec-val,
.card-meta,
.anbieter-zahl-wert,
.photo-tag,
.hero-ort-zahl,
.auswahl-eintrag-note,
.auswahl-text,
.nav-suche-teil,
.result-count strong,
.kalender-tag,
.pager button,
.summary-total,
.map-pin { font-variant-numeric: tabular-nums; }

/* --------------------------------------------------------------------------
   3. LAYOUT
   -------------------------------------------------------------------------- */

.wrap { width: min(100% - (2 * var(--gutter)), var(--maxw)); margin-inline: auto; }
.wrap--narrow { width: min(100% - (2 * var(--gutter)), 860px); }

.section { padding-block: var(--s-6); }
.section--sunk { background: var(--card-sunk); }
.section--blue { background: var(--brand-surface); color: #E7EDF6; }
.section--blue h2, .section--blue h3 { color: #fff; }
@media (min-width: 900px) { .section { padding-block: var(--s-7); } }

/* Knapper als die übrigen Abschnitte: Das Logoband trägt eine Zeile und
   eine Reihe Zeichen, keine Überschrift und keine Karten. Mit den 120 px
   der Regel oben stand es in einem Feld, das dreimal so hoch war wie sein
   Inhalt. 64 px sind hier genug, unter 900 px 48. */
.section--band { padding-block: 48px; }
@media (min-width: 900px) { .section--band { padding-block: 64px; } }

.section-head { margin-bottom: var(--s-4); display: flex; align-items: flex-end; justify-content: space-between; gap: var(--s-3); flex-wrap: wrap; }

/* Mittige Fassung. Ein zugehöriger Verweis rückt darin unter die
   Überschrift statt an den rechten Rand — nebeneinander wäre die
   Überschrift nicht mehr mittig, sondern nur noch ungefähr. */
.section-head--mitte {
  flex-direction: column; align-items: center;
  text-align: center; gap: var(--s-2);
}

/* Hero: Text und Bildcollage nebeneinander, sobald Platz da ist.
   Bewusst hier und nicht als Inline-Style — inline schlägt jede
   Media Query und die Spalten blieben gestapelt. */
#hero-grid { gap: var(--s-5); align-items: center; }
@media (min-width: 1000px) {
  #hero-grid { grid-template-columns: 1.05fr 0.95fr; }
}
/* Auf schmalen Geräten würde die Collage die Seite füllen */
#hero-grid .photo { max-height: 46vh; }

.grid { display: grid; gap: var(--s-3); }
.grid--2 { grid-template-columns: 1fr; }
.grid--3 { grid-template-columns: 1fr; }
.grid--4 { grid-template-columns: repeat(2, 1fr); }
@media (min-width: 680px) {
  .grid--2 { grid-template-columns: repeat(2, 1fr); }
  .grid--3 { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .grid { gap: var(--s-4); }
  .grid--3 { grid-template-columns: repeat(3, 1fr); }
  .grid--4 { grid-template-columns: repeat(4, 1fr); }
}

/* --------------------------------------------------------------------------
   4. TYPOGRAFIE
   -------------------------------------------------------------------------- */

/* Die Überschrift ist das Bauteil, das den Ton setzt. Sehr eng gesetzt,
   sehr fett, sehr groß — der Zug aus der Officex-Referenz. Bei dieser Größe
   ist der Standardabstand zwischen den Zeilen zu luftig und die
   Standardlaufweite zu weit; beides wird zurückgenommen. */
.display  {
  font-family: var(--font-display); font-size: var(--t-4); font-weight: 700;
  letter-spacing: -0.02em; line-height: 0.98; text-wrap: balance;
}
.headline {
  font-family: var(--font-display); font-size: var(--t-3); font-weight: 700;
  letter-spacing: -0.02em; line-height: 1.06; text-wrap: balance;
}
.subhead  { font-family: var(--font-sans); font-size: var(--t-2); font-weight: 600; letter-spacing: -0.02em; }
.title    { font-family: var(--font-display); font-size: var(--t-1); font-weight: 600; letter-spacing: -0.018em; }

.lede  { font-size: var(--t-1); line-height: 1.6; color: var(--ink-2); max-width: 48ch; }
.body  { color: var(--ink-2); max-width: 65ch; }
.muted { color: var(--ink-2); }
.help  { font-size: var(--t--1); color: var(--ink-3); }

/* Kleines Schildchen über der Überschrift. Es trägt eine Angabe, keine
   Verzierung — hier die Größe des Bestands. */
.eyebrow {
  display: inline-flex; align-items: center; gap: 0.45rem;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-2);
  background: var(--card-sunk);
  border-radius: var(--r-pill);
  padding: 0.42rem 0.85rem;
}
.eyebrow::before {
  content: '';
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--brand);
  flex-shrink: 0;
}

/* --------------------------------------------------------------------------
   5. NAVIGATION
   -------------------------------------------------------------------------- */

.nav {
  position: sticky;
  top: 0;
  z-index: 100;
  /* Hellgrau statt weiß — die kleine Suchleiste, die beim Scrollen hier
     erscheint, ist weiß und hebt sich dadurch ab. Die Durchsicht bleibt:
     Was darunter durchläuft, soll weiter zu ahnen sein. */
  background: color-mix(in srgb, var(--card-sunk) 92%, transparent);
  backdrop-filter: blur(16px) saturate(1.4);
  -webkit-backdrop-filter: blur(16px) saturate(1.4);
  box-shadow: var(--sh-nav);
}

/* Die Kopfzeile steht selbst auf --card-sunk. Genau diese Fläche benutzen
   Verweise, Knöpfe und Schalter sonst beim Überfahren — auf ihr wäre also
   nichts zu sehen. Hier tönt deshalb die Tinte statt der Kartenfarbe: zehn
   Prozent auf grauem Grund sind ein sichtbarer, aber ruhiger Schimmer, und
   im Dunkelmodus dreht sich das von allein um, weil die Tinte dort hell
   ist. */
.nav .nav-link:hover,
.nav .btn--quiet:hover,
.nav .theme-toggle:hover,
.nav .auswahl-knopf:hover,
.nav .nav-toggle:hover {
  background: color-mix(in srgb, var(--ink) 10%, transparent);
}

/* Wortmarke links, Werkzeuge rechts — und dazwischen, ab 1000 px, die
   Mitte der Seite.

   Ein Raster aus 1fr auto 1fr hätte nicht gereicht: `1fr` unterschreitet
   die Breite seines Inhalts nicht, und die Werkzeuge rechts sind breiter
   als die Wortmarke links. Die mittlere Spalte säße dadurch um die
   Differenz verschoben — gemessen 12 px. Herausgenommen aus dem Fluss und
   auf 50 % gesetzt, steht sie exakt. */
.nav-inner {
  position: relative;
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-3); height: 4.75rem;
}
.nav-links, .nav-suche { margin-left: 0; }
@media (min-width: 1000px) {
  .nav-links, .nav-suche {
    position: absolute; left: 50%; transform: translateX(-50%);
  }
}

/* Wortmarke
   Die gelieferten Dateien sind JPG und haben einen weißen Grund, also
   keine Transparenz. Auf dem weißen Kopf fällt das nicht auf; im
   Dunkelmodus säße das Logo sonst in einem weißen Kasten. Deshalb steht es
   dort auf einer eigenen hellen Pille — die übliche Behandlung für Logos,
   die einen hellen Untergrund brauchen.

   Mit einer SVG- oder PNG-Fassung mit Transparenz fiele die Pille weg;
   siehe README. */
.brand { display: flex; align-items: center; flex-shrink: 0; }

/* Wortmarke als SVG im Markup statt als Bilddatei.
   Der schwarze Teil steht auf `currentColor`, deshalb dreht die Marke im
   Dunkelmodus von selbst auf Hell — die weiße Pille, die eine JPG dort
   gebraucht hätte, ist überflüssig geworden. */
.brand-name {
  height: 30px;
  width: auto;
  color: var(--ink);
  flex-shrink: 0;
  overflow: visible;
}
/* Die Wortmarke holt ihre Schrift aus dem Token und nicht aus einem
   `font-family`-Attribut am <text>, sonst stünde im Projekt eine Angabe,
   die an keinem der beiden Tokens hängt.

   Jeder Wechsel der Familie ändert die Breite des Schriftzugs, und die
   Bildmarke „24" steht auf einer festen Koordinate. `x` und `viewBox`
   sind deshalb nachgemessen; siehe README, Abschnitt „Die Schrift". */
.brand-name text { font-family: var(--font-sans); }
@media (max-width: 559px) { .brand-name { height: 25px; } }

/* --------------------------------------------------------------------------
   Kalender
   -------------------------------------------------------------------------- */

.kalender { position: relative; }

/* Der Knopf sieht aus wie ein Eingabefeld — dieselben Maße, derselbe
   Rahmen, derselbe Fokusring wie .input.

   Vorher war er nackter Text: kein Rahmen, kein Grund, keine Polsterung.
   In der Suchleiste ist das richtig, in der Verfügbarkeitskarte stand er
   damit zwischen zwei gerahmten Feldern und las sich wie eine Angabe, die
   dort einfach steht. Wer einen Zeitraum wählen wollte, sah kein Feld, in
   das er hätte klicken können.

   Umgekehrt herum wäre es falsch gewesen: Die Suchleiste nimmt den
   Feldlook unten wieder zurück (.hero-feld .kalender-knopf), und das ist
   eine Stelle gegen sonst jede. */
.kalender-knopf {
  display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;
  min-height: 48px; padding: 0.7rem 0.9rem;
  background: var(--card);
  border: 1px solid var(--line-2);
  border-radius: var(--r);
  color: var(--ink); text-align: left; width: 100%;
  cursor: pointer;
  transition: border-color var(--dur-hover) var(--ease-out), box-shadow var(--dur-hover) var(--ease-out);
}
.kalender-knopf:hover { border-color: var(--line-3); }
.kalender-knopf:focus-visible {
  outline: none;
  border-color: var(--blue);
  box-shadow: 0 0 0 3px var(--blue-100);
}
.kalender.is-offen .kalender-knopf { border-color: var(--blue); }
.kalender-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kalender-symbol { flex-shrink: 0; color: var(--ink-3); }
.kalender-knopf.is-leer { color: var(--ink-3); }

/* In der Suchleiste zurück auf nackten Text: Dort öffnet der ganze
   Abschnitt, ein Rahmen um einen von dreien wäre ein Feld im Feld. */
.hero-feld .kalender-knopf {
  display: block; min-height: 1.5rem; padding: 0; gap: 0;
  border: 0; background: transparent; border-radius: 0;
  font-size: 0.88rem;
}
.hero-feld .kalender-knopf:hover { border-color: transparent; }
.hero-feld .kalender-knopf:focus-visible { box-shadow: none; }

/* Aufklappende Felder bringen ihre Schriftfarbe selbst mit.
   Sie erben sonst die des Ortes, an dem sie hängen — und das ist hier die
   Suchleiste auf der dunklen Bühne, deren Farbe Weiß ist. Weiße Schrift
   auf der weißen Kartenfläche des Feldes: unsichtbar. Wer einen eigenen
   Grund setzt, muss auch die Schrift dazu setzen. */
.kalender-panel {
  position: absolute; z-index: 220; top: calc(100% + 10px); left: 0;
  background: var(--card); color: var(--ink);
  border: 1px solid var(--line);
  border-radius: var(--r-card); box-shadow: var(--sh-3);
  padding: var(--s-2); width: 292px;
}
.kalender.is-oben .kalender-panel { top: auto; bottom: calc(100% + 10px); }

/* Am Fenster statt am Feld. Gebraucht im Anfrage-Feld auf der
   Objektseite: Der <dialog> rollt seinen Inhalt, und ein Bildlaufbehälter
   schneidet absolut gesetzte Nachkommen an seinem Rand ab. Die Stelle
   rechnet kalender.js (Option `festStehend`) und schreibt sie als
   Inline-Stil — deshalb steht hier nur die Art der Positionierung. */
.kalender-panel--fest { position: fixed; }
/* Zwei Monate sind breit; am rechten Bildrand klappt das Feld nach innen */
.kalender.is-rechts .kalender-panel { left: auto; right: 0; }

/* In der Suchleiste hängt das Feld an der Leiste statt am Abschnitt
   „Ab wann" (siehe `zentrierenAn` in assets/js/kalender.js) und steht
   deshalb mittig darunter — mit zehn Pixeln Abstand. */
.kalender-panel--zentriert {
  top: calc(100% + 10px); left: 50%; right: auto;
  transform: translateX(-50%);
}
.kalender-panel--zentriert.is-oben {
  top: auto; bottom: calc(100% + 10px);
}

/* --- Zwei Monate nebeneinander ------------------------------------------
   Wie bei Airbnb: der laufende und der nächste Monat, die Pfeile bewegen
   beide zusammen. Unter 760 px bleibt einer übrig — zwei Gitter nebeneinander
   bräuchten dort mehr Platz, als der Bildschirm hat. */
.kalender-monate { display: flex; gap: var(--s-3); }
.kalender-monat-block { flex: 1 1 auto; min-width: 0; }
.kalender-panel--doppelt { width: auto; }
.kalender-panel--doppelt .kalender-monat-block { flex: 0 0 268px; }
.kalender-pfeil-platz { width: 32px; height: 32px; }
/* Doppelt geschrieben, damit die Regel die allgemeine für .kalender-pfeil
   sticht — sonst stünde ein dritter Pfeil zwischen den beiden Monaten. */
.kalender-pfeil.kalender-pfeil--schmal { display: none; }

@media (max-width: 759px) {
  .kalender-monat-block + .kalender-monat-block { display: none; }
  .kalender-pfeil.kalender-pfeil--schmal { display: grid; }
}

/* Drei feste Spalten statt space-between: Der Monatsname steht damit über
   der Mitte seines Gitters, auch wenn auf einer Seite kein Pfeil sitzt.
   Bei space-between hing er an der Seite, auf der der Pfeil fehlte. */
.kalender-kopf {
  display: grid; grid-template-columns: 32px 1fr 32px;
  align-items: center; margin-bottom: 0.4rem;
}
.kalender-monat { text-align: center; }
.kalender-monat { font-weight: 600; font-size: 0.92rem; }
.kalender-pfeil {
  width: 32px; height: 32px; border-radius: 50%;
  display: grid; place-items: center; cursor: pointer;
  background: transparent; border: 0; color: var(--ink-2);
}
.kalender-pfeil:hover:not(:disabled) { background: var(--card-sunk); color: var(--ink); }
/* Gesperrt heißt hier: Weiter zurück gibt es nichts zu buchen. Sichtbar
   bleibt der Pfeil, damit die Kopfzeile ihre Form behält. */
.kalender-pfeil:disabled { opacity: 0.3; cursor: default; }

.kalender-wochentage, .kalender-gitter {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px;
}
.kalender-wochentage span {
  text-align: center; font-size: 0.68rem; color: var(--ink-3);
  padding-block: 0.3rem; text-transform: uppercase; letter-spacing: 0.04em;
}
.kalender-gitter:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; border-radius: var(--r-sm); }

.kalender-tag {
  aspect-ratio: 1; border: 0; background: transparent; cursor: pointer;
  border-radius: var(--r-sm); font-size: 0.85rem; color: var(--ink);
  font-variant-numeric: tabular-nums;
  transition: background var(--dur-hover) var(--ease-out);
}
.kalender-tag:hover:not(:disabled) { background: var(--card-sunk); }
.kalender-tag.is-heute { font-weight: 700; }
.kalender-tag.is-heute::after {
  content: ''; display: block; width: 4px; height: 4px; border-radius: 50%;
  background: var(--brand); margin: 1px auto 0;
}
.kalender-tag.is-bereich { background: var(--brand-100); border-radius: 0; }
.kalender-tag.is-gewaehlt { background: var(--ink); color: var(--surface); font-weight: 600; }
/* Der Tastatur-Cursor braucht eine eigene Marke — sonst weiß man beim
   Wandern mit den Pfeiltasten nicht, wo man steht. */
.kalender-tag.is-aktiv { box-shadow: inset 0 0 0 2px var(--brand); }
.kalender-tag:disabled { color: var(--line-3); cursor: default; }
.kalender-leer { aspect-ratio: 1; }
.kalender-fuss { margin-top: 0.4rem; display: flex; justify-content: flex-end; }

/* --------------------------------------------------------------------------
   Ortsvorschläge in der Suchleiste
   -------------------------------------------------------------------------- */

/* Eigene Schriftfarbe, siehe .kalender-panel — dieselbe Falle. */
.hero-orte {
  position: absolute; z-index: 210; top: calc(100% + 10px); left: 0;
  min-width: 220px; max-height: 260px; overflow-y: auto;
  background: var(--card); color: var(--ink);
  border: 1px solid var(--line);
  border-radius: var(--r-card); box-shadow: var(--sh-3); padding: 0.3rem;
}
.hero-ort {
  display: flex; justify-content: space-between; align-items: center; gap: 0.6rem;
  padding: 0.5rem 0.6rem; border-radius: var(--r-sm); cursor: pointer; font-size: 0.9rem;
}
.hero-ort.is-aktiv { background: var(--card-sunk); }
.hero-ort-land { color: var(--ink-3); font-size: 0.8rem; margin-left: 0.4rem; }
.hero-ort-zahl { color: var(--ink-3); font-size: 0.8rem; font-variant-numeric: tabular-nums; }

/* --------------------------------------------------------------------------
   Anbieter
   Mittig gesetzt, viel Weißraum, keine Schatten, keine Rahmen um die Logos.
   Die Trennlinien der Kennzahlen sind Haarlinien.
   -------------------------------------------------------------------------- */

/* Flacher Abschnitt: eine Zeile, darunter das Band. Deshalb 64 px statt
   der 96 px, die der Abschnitt mit Überschrift und Kennzahlen brauchte. */
.anbieter { text-align: center; padding-block: 64px; }

/* 15 px. Der Abstand zum Band steht unten an .anbieter-band. */
.anbieter-hinweis {
  margin: 0;
  font-size: 1.125rem; line-height: 1.5;
  color: var(--ink-2);
}

/* --- Logos ---------------------------------------------------------------
   Einheitliche Höhe, Breite läuft mit. Grau und zurückgenommen, beim
   Überfahren in Farbe — die Leiste soll belegen, nicht werben. */
.anbieter-zelle {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0.5rem 0.25rem; border-radius: var(--r-sm);
}
.anbieter-zelle:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

/* Zwei Stellschrauben je Logo, gesetzt in assets/js/index.js:

   --logo-h      die Grundhöhe. Sie ist gemessen und stellt alle
                 Schriftzüge auf dieselbe Versalhöhe.
   --logo-scale  die Feinkorrektur des optischen Gewichts. Sie läuft über
                 transform und nicht über die Höhe, damit sich beim
                 Nachjustieren nur das Bild ändert und nicht das Raster
                 des Bandes.

   300 px Höchstbreite, weil „The Office Operators" bei 11,5:1 ein
   ungewöhnlich langer Schriftzug ist; bei 230 px wäre er der einzige, der
   an der Deckelung hängt und dadurch kleiner steht als alle anderen. */
.anbieter-logo {
  height: var(--logo-h, 38px); width: auto; max-width: 300px; object-fit: contain;
  transform: scale(var(--logo-scale, 1));
  filter: grayscale(1); opacity: 0.6;
  transition: filter var(--dur-panel) var(--ease-out), opacity var(--dur-panel) var(--ease-out);
}
.anbieter-zelle:hover .anbieter-logo,
.anbieter-zelle:focus-visible .anbieter-logo { filter: grayscale(0); opacity: 1; }

/* Im Dunkelmodus werden die Logos zu weißen Silhouetten.
   invert() wäre falsch: Es dreht jede Farbe auf ihre Gegenfarbe — aus dem
   Rot von „too" würde Türkis, aus dem Grün von Basepoint Magenta. Auf
   schwarzen Logos fällt das nicht auf, auf farbigen sofort.
   brightness(0) nimmt die Farbe ganz heraus und lässt nur die Form stehen,
   invert(1) macht Weiß daraus. Die Transparenz bleibt dabei erhalten, die
   Kanten also weich.
   Deshalb gibt es hier auch beim Überfahren keine Farbe zurück — sie wäre
   entweder falsch oder, bei den schwarzen Logos, unsichtbar. Es wird nur
   heller. */
:root[data-theme="dark"] .anbieter-logo { filter: brightness(0) invert(1); opacity: 0.58; }
:root[data-theme="dark"] .anbieter-zelle:hover .anbieter-logo,
:root[data-theme="dark"] .anbieter-zelle:focus-visible .anbieter-logo {
  filter: brightness(0) invert(1); opacity: 1;
}

/* --- Laufband ------------------------------------------------------------
   Die Spur enthält den Inhalt zweimal und wandert um genau die halbe
   Breite. An dem Punkt steht die Kopie dort, wo das Original begann — die
   Schleife springt deshalb nicht.

   Gelaufen wird nach rechts: Die Spur startet bei -50 % und endet bei 0.

   Die weichen Kanten kommen über mask-image und nicht über aufgesetzte
   farbige Kästen: Ein Kasten müsste die Hintergrundfarbe kennen und wäre
   im Dunkelmodus falsch. */
.anbieter-band {
  margin-top: var(--s-4);        /* 32 px unter der Hinweiszeile */
  overflow: hidden;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
}
.anbieter-spur {
  display: flex; width: max-content;
  animation: anbieter-lauf var(--anbieter-dauer, 42s) linear infinite;
  will-change: transform;
}
.anbieter-band:hover .anbieter-spur,
.anbieter-band:focus-within .anbieter-spur { animation-play-state: paused; }
/* Weiter Abstand mit Absicht: Bei wenigen Logos wiederholt sich das Band
   sichtbar; je mehr Luft zwischen den Zellen steht, desto weniger
   Wiederholungen liegen gleichzeitig im Bild. */
.anbieter-gruppe { display: flex; align-items: center; gap: var(--s-6); padding-left: var(--s-6); }

@keyframes anbieter-lauf {
  from { transform: translateX(-50%); }
  to   { transform: translateX(0); }
}

/* --- Kennzahlen ----------------------------------------------------------
   Auf der Startseite stehen keine mehr; sie ziehen in die Anbieter-Section
   weiter unten. `anbieter.js` gibt sie weiterhin aus, wenn sie übergeben
   werden — deshalb bleibt die Gestaltung hier stehen. */
.anbieter-zahlen {
  display: flex; justify-content: center; align-items: stretch;
  margin-top: var(--s-5); gap: 0;
}
.anbieter-zahl {
  display: flex; flex-direction: column; gap: 0.2rem;
  padding-inline: var(--s-4); min-width: 0;
}
.anbieter-zahl + .anbieter-zahl { border-left: 0.5px solid var(--line-2); }
.anbieter-zahl-wert {
  font-family: var(--font-sans); font-weight: 700;
  font-size: var(--t-2); letter-spacing: -0.02em; color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.anbieter-zahl-label { font-size: 0.82rem; color: var(--ink-3); }

@media (max-width: 620px) {
  .anbieter-zahlen { flex-direction: column; align-items: center; gap: var(--s-3); }
  .anbieter-zahl + .anbieter-zahl { border-left: 0; border-top: 0.5px solid var(--line-2); padding-top: var(--s-3); }
  .anbieter-gruppe { gap: var(--s-3); padding-left: var(--s-3); }
  /* Auf kleinen Geräten etwas langsamer, sonst huscht es vorbei */
  .anbieter-spur { animation-duration: calc(var(--anbieter-dauer, 42s) * 1.35); }
}

/* Ohne Bewegungswunsch steht das Band still und wird zum Raster. Von den
   Wiederholungen bleibt genau eine übrig — die mit den Alternativtexten. */
@media (prefers-reduced-motion: reduce) {
  .anbieter-band { -webkit-mask-image: none; mask-image: none; overflow: visible; }
  .anbieter-spur { animation: none; width: auto; justify-content: center; }
  .anbieter-gruppe { flex-wrap: wrap; justify-content: center; padding-left: 0; }
  .anbieter-gruppe + .anbieter-gruppe { display: none; }
}

/* --------------------------------------------------------------------------
   So funktioniert es
   Drei Spalten Text: Titel und zwei Zeilen. Keine Karten, keine Rahmen,
   keine Ziffern, keine Zeichen — die Gliederung trägt allein der Abstand.
   -------------------------------------------------------------------------- */

.so-schritte {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: var(--s-5);
  margin-top: var(--s-3);
}
.so-schritt { min-width: 0; }

.so-titel { margin: 0; font-size: 1.125rem; }
.so-text {
  margin: 0.4rem 0 0;
  font-size: 0.9375rem; line-height: 1.6;
  color: var(--ink-2); max-width: 34ch;
}
.so-mehr { margin: var(--s-4) 0 0; text-align: center; }

/* Die Staffelung ist hier bewusst langsamer als die 30 ms, die sonst
   gelten: Bei drei großen Spalten liest man sie sonst nicht als Folge. */
.so-schritte .reveal { transition-delay: calc(var(--i, 0) * 80ms); }

@media (max-width: 899px) {
  .so-schritte { grid-template-columns: 1fr; gap: var(--s-4); }
  .so-text { max-width: none; }
}

/* --------------------------------------------------------------------------
   Warum officeshare24
   Dunkles Band über die volle Breite. Es trennt den Teil für Suchende von
   dem für Anbieter — und weil es dieselbe Fläche trägt wie die
   Heldenbühne, klammert es die Seite zugleich zusammen.

   Keine Karten, keine Zeichen. Zwischen den Spalten steht eine Haarlinie,
   und die sitzt in der Lücke statt an der Spalte: Als Rahmen am Element
   verschöbe sie den Text der zweiten und dritten Spalte gegenüber der
   ersten.
   -------------------------------------------------------------------------- */

.warum {
  background: var(--hero-deep);
  color: var(--hero-ink);
}
.warum-titel {
  color: var(--hero-ink); max-width: 24ch;
  margin: 0 auto; text-align: center;
}

.warum-punkte {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: var(--s-5);
  margin-top: var(--s-4);
}
.warum-punkt { position: relative; min-width: 0; }
.warum-punkt + .warum-punkt::before {
  content: ''; position: absolute;
  left: calc(var(--s-5) / -2); top: 0; bottom: 0;
  width: 1px; background: rgba(255, 255, 255, 0.12);
}

.warum-punkt-titel { margin: 0; font-size: 1.125rem; color: var(--hero-ink); }
.warum-punkt-text {
  margin: 0.4rem 0 0;
  font-size: 0.9375rem; line-height: 1.6;
  color: rgba(255, 255, 255, 0.72);
}

@media (max-width: 899px) {
  .warum-punkte { grid-template-columns: 1fr; gap: var(--s-4); }
  /* Gestapelt liegt die Linie oben statt links */
  .warum-punkt + .warum-punkt::before {
    left: 0; right: 0; top: calc(var(--s-4) / -2); bottom: auto;
    width: auto; height: 1px;
  }
}

/* --------------------------------------------------------------------------
   Flächen anbieten
   Letzter Abschnitt vor der Fußzeile: Überschrift, ein Satz, ein Knopf.
   Ohne Bewegung — direkt darüber läuft bereits das Logoband.
   -------------------------------------------------------------------------- */

/* Der ganze Block steht mittig — bei drei Zeilen untereinander wirkte eine
   mittige Überschrift über linksbündigem Satz wie ein Fehler. */
.fa { text-align: center; }
.fa-titel { max-width: 18ch; margin: 0 auto; }
.fa-lede { margin: var(--s-2) auto 0; max-width: 46ch; color: var(--ink-2); }
.fa-btn { margin-top: var(--s-4); }

@media (max-width: 899px) {
  .fa-titel { max-width: none; }
}

/* --------------------------------------------------------------------------
   Kopfbereich (Hero)
   -------------------------------------------------------------------------- */

:root {
  --hero-deep:  #14233A;
  --hero-mid:   #1E3555;
  --hero-edge:  #33587F;
  --hero-ink:   #FFFFFF;
  --hero-muted: rgba(255, 255, 255, 0.62);
  --hero-suche-h: 92px;   /* Höhe der Suchleiste; die halbe steht über */
  /* Überstand des Turms. Gemessen an der Spitze, nicht an der Bilddatei:
     Die Spitze liegt bei 7,8 % der Bildhöhe, der sichtbare Überstand ist
     also kleiner als dieser Wert. Er muss unter der Kopfleiste bleiben,
     sonst verschwindet die Spitze hinter ihr. */
  --turm-ueber:   68px;
}

/* Unten so viel Polsterung, dass die überstehende Suchleiste Platz hat —
   sonst schöbe sich der nächste Abschnitt darunter. */
.hero-aussen { padding-block: var(--s-5) calc(var(--hero-suche-h) / 2 + var(--s-5)); }

.hero-buehne {
  position: relative;
  overflow: visible;          /* der Turm ragt oben heraus */
  border-radius: 16px;
  /* Zwei Lagen: der Grundverlauf und ein dunkler Kern hinter dem Turm.
     Der Turm ist Glas und trägt in der Tiefe Blautöne, die dem hellen Rand
     des Verlaufs zu nahe kämen — der Kern hält ihn frei. */
  background:
    radial-gradient(58% 78% at 84% 46%, rgba(8, 16, 30, 0.55), transparent 72%),
    linear-gradient(105deg, var(--hero-deep), var(--hero-mid) 52%, var(--hero-edge));
  color: var(--hero-ink);
  padding: 64px var(--s-4) 88px;
  min-height: 420px;
  display: flex; align-items: center;
}

.hero-text { max-width: 52%; }

.hero-eyebrow {
  font-size: 0.81rem; letter-spacing: 0.06em;
  color: var(--hero-muted); margin-bottom: var(--s-2);
}

/* Die Heldenzeile ist eine h1 und wird gesetzt wie jede h1 und h2: 700
   und -0,02 em.

   Der kursive Akzent in der zweiten Zeile kommt aus einem echten Schnitt
   und nicht aus einer geneigten Aufrechten — die Kursive liegt als eigene
   Datei bei. Das ist die einzige kursive Stelle im Projekt und deshalb
   auch die einzige, die diese Datei überhaupt anfordert. */
.hero-titel {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2.1rem, 1.1rem + 3.4vw, 3.5rem);
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0;
}
.hero-titel span { display: block; }
.hero-titel em { display: block; font-style: italic; }

/* --- Der Turm ------------------------------------------------------------
   Vom Foto bleibt nur der vordere Turm stehen: kein Himmel, kein
   Nachbarhaus, keine Kartenkante. Der Zuschnitt liegt als clip-path hier
   und nicht als zweite Bilddatei — es kommt also kein Byte dazu, und die
   Kante bleibt bei jeder Auflösung scharf.

   Die Punkte sind gemessen, nicht geschätzt: tools/turm-silhouette.ps1
   liest die Silhouette aus dem Foto und gibt genau diese Zeile aus. Rechts
   folgt sie dem Dachgrat, links der Gebäudekante; die Befahrschienen im
   Himmel fallen weg. Voraussetzung ist, dass der Kasten das
   Seitenverhältnis des Fotos hält — sonst verrutschen die Prozentwerte
   gegenüber dem Bildinhalt. Deshalb aspect-ratio statt fester Höhe.

   pointer-events aus: Der Kasten liegt über der Bühne und soll keine
   Klicks abfangen. */
.hero-foto {
  position: absolute;
  right: 0;
  top: calc(-1 * var(--turm-ueber));
  height: calc(100% + var(--turm-ueber));
  width: auto;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  pointer-events: none;
  clip-path: polygon(
    47.34% 7.81%, 52.61% 9.26%, 53.7% 10.59%, 58.17% 13.26%, 63.96% 15.26%,
    77.61% 23.27%, 78.38% 23.94%, 78.89% 25.27%, 79.5% 25.94%, 89.27% 31.94%,
    91.6% 34.61%, 98.38% 40.62%, 99.2% 41.95%, 100% 41.95%, 100% 100%,
    25.32% 100%, 34.31% 42.62%, 37.1% 26.61%, 37.01% 23.27%, 37.3% 22.6%,
    46.33% 9.92%
  );
  /* Unten löst sich der Turm im Verlauf auf. Ohne das säße eine gerade
     Schnittkante auf der Unterkante der Bühne, und an der abgerundeten
     Ecke stünde er über. */
  -webkit-mask-image: linear-gradient(180deg, #000 66%, transparent 95%);
          mask-image: linear-gradient(180deg, #000 66%, transparent 95%);
  /* Das Glas liegt bei rund 204°, der Verlauf der Bühne bei 210–217°. Acht
     Grad Drehung schieben das Foto in dieselbe Blaufamilie; Sättigung und
     Kontrast gleichen aus, was die Drehung an Tiefe nimmt. Kein Duoton —
     die Spiegelungen im Glas sollen Zeichnung behalten. */
  filter: hue-rotate(8deg) saturate(1.12) contrast(1.04);
}

/* --- Suchleiste ----------------------------------------------------------
   Sitzt mittig auf der Unterkante, zur Hälfte darüber hinaus. */
.hero-suche {
  position: absolute;
  left: 50%; bottom: 0;
  transform: translate(-50%, 50%);
  z-index: 3;                       /* über dem Turm */
  width: min(780px, calc(100% - var(--s-4) * 2));
  min-height: var(--hero-suche-h);
  background: var(--card);
  border: 1px solid color-mix(in srgb, var(--ink) 10%, transparent);
  border-radius: var(--r-pill);
  /* Zwei Lagen statt einer: ein enger, fast schwarzer Saum direkt unter
     der Kante und darunter ein weit gestreuter, sehr blasser Schein. Ein
     einzelner Schatten wirkt entweder hart oder schmutzig; erst die
     Kombination hebt die Leiste, ohne dass man den Schatten sieht. */
  box-shadow: 0 2px 5px rgba(17, 20, 24, 0.055),
              0 14px 34px rgba(17, 20, 24, 0.09);
  display: grid;
  grid-template-columns: 1.2fr 1fr 1fr auto;
  /* stretch statt center: Die Abschnitte füllen die Leiste in voller Höhe.
     Mittig gesetzt wären sie nur so hoch wie ihr Text, und die getönte
     Fläche beim Überfahren träfe nur diesen Streifen — oben und unten
     blieben 15 px kalt, obwohl der Zeiger über der Leiste steht. */
  align-items: stretch;
  padding: 0.5rem 0.5rem 0.5rem 0.35rem;
}

.hero-feld {
  position: relative;
  /* Der Inhalt bleibt mittig, obwohl der Abschnitt die volle Höhe hat */
  display: flex; flex-direction: column; justify-content: center;
  padding: 0.55rem 0.9rem;
  border-radius: var(--r-pill);
  min-width: 0;
  transition: background var(--dur-hover) var(--ease-out);
}
/* --- Zustände der Leiste --------------------------------------------------
   Im Ruhezustand ist die Leiste weiß und der Abschnitt unter dem Zeiger
   tönt sich. Sobald ein Feld offen ist, dreht sich das um: Die Leiste
   selbst tönt sich, und der offene Abschnitt bleibt als einziger weiß und
   hebt sich mit einem Schatten heraus. Das lenkt den Blick auf das Feld,
   in dem man gerade steht, ohne eine einzige Linie mehr zu zeichnen. */
.hero-feld:hover { background: var(--card-sunk); }

.hero-suche:focus-within { background: var(--card-sunk); }
.hero-suche:focus-within .hero-feld { background: transparent; }
.hero-suche:focus-within .hero-feld:hover { background: color-mix(in srgb, var(--ink) 5%, transparent); }
.hero-suche:focus-within .hero-feld:focus-within {
  background: var(--card);
  box-shadow: var(--sh-2);
}
.hero-feld + .hero-feld::before {
  content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  width: 1px; height: 44%; background: var(--line);
  transition: opacity var(--dur-hover) var(--ease-out);
}
.hero-feld:hover + .hero-feld::before,
.hero-feld:focus-within + .hero-feld::before,
.hero-feld:hover::before, .hero-feld:focus-within::before { opacity: 0; }

.hero-feld .label { display: block; font-size: 0.7rem; margin-bottom: 0.1rem; color: var(--ink-3); }
.hero-feld .input,
.hero-feld .auswahl-knopf {
  border: 0; background: transparent; padding: 0;
  font-size: 0.88rem; color: var(--ink); width: 100%; min-height: 1.5rem;
}
/* Ohne Wahl grau, wie „Flexibel" im Feld daneben (.kalender-knopf.is-leer).
   Beide Abschnitte öffnen auf denselben Klick und sollen deshalb auch
   gleich aussehen — schwarze Schrift läse sich als bereits getroffene
   Wahl. */
.hero-feld .auswahl-knopf.is-leer { color: var(--ink-3); }

/* Zwei Pixel Luft links, um dieselben zwei wieder nach links versetzt: Der
   Text steht damit exakt wie vorher unter seiner Beschriftung, aber der
   Schreibstrich hat Platz. Ohne diese Luft steht er bei leerem Feld genau
   auf der Kante des Inhaltsbereichs, und da Eingabefelder ihren Inhalt
   beschneiden, war die linke Hälfte des Strichs abgeschnitten. */
.hero-feld .input { padding-left: 2px; margin-left: -2px; }

/* Kein blauer Ring im aktiven Feld. Die getönte Fläche zeigt, wo man ist —
   das ist ruhiger und trägt in beiden Modi.

   Für die Tastatur bleibt ein Ring, aber in Tinte statt in Markenblau und
   als Innenschatten statt als outline: So folgt er der Pillenform des
   Abschnitts, statt ein Rechteck darum zu ziehen. 50 % Tinte ergeben gegen
   die Leiste 3,1:1 — sichtbar genug, um als Fokus zu gelten, und leise
   genug, um nicht zu schreien. */
.hero-feld .input:focus { outline: none; box-shadow: none; }
.hero-feld:has(:focus-visible) {
  box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--ink) 50%, transparent);
}

/* --- Zurücknehmen (assets/js/hero.js) -------------------------------------
   Ein Kreuz am rechten Rand des Abschnitts, nur solange dort etwas steht.
   Es sitzt absolut und nicht im Fluss: So steht es in allen drei
   Abschnitten auf derselben Höhe und an derselben Kante, gleich wie lang
   der Wert darunter ist.

   26 px, damit es die Mindestgröße für Ziele erreicht (WCAG 2.2, 24 px),
   ohne im 92 px hohen Streifen zu dominieren. Der Kreis ist getönte Tinte
   statt einer festen Farbe — damit trägt er auf der weißen Leiste wie auf
   der dunklen. */
.hero-loeschen {
  position: absolute; right: 0.5rem; top: 50%; transform: translateY(-50%);
  width: 26px; height: 26px; border-radius: 50%;
  display: grid; place-items: center; padding: 0; border: 0;
  background: color-mix(in srgb, var(--ink) 7%, transparent);
  color: var(--ink-2); cursor: pointer;
  transition: background var(--dur-hover) var(--ease-out),
              color var(--dur-hover) var(--ease-out);
}
.hero-loeschen[hidden] { display: none; }
.hero-loeschen:hover {
  background: color-mix(in srgb, var(--ink) 16%, transparent);
  color: var(--ink);
}
.hero-loeschen:active { transform: translateY(-50%) scale(0.92); }

/* Platz für das Kreuz, aber nur wenn es da ist: Sonst stünde der Wert in
   jedem Abschnitt dauerhaft 2 rem vor der Kante und die Leiste wirkte
   überall zu eng. */
.hero-feld:has(.hero-loeschen:not([hidden])) .input,
.hero-feld:has(.hero-loeschen:not([hidden])) .auswahl-knopf,
.hero-feld:has(.hero-loeschen:not([hidden])) .kalender-knopf {
  padding-right: 1.9rem;
}

.hero-go {
  width: 52px; height: 52px; border-radius: 50%;
  /* Spaltenfluss auch im Ruhezustand: Sonst stünde die (leere)
     Beschriftung als zweite Zeile unter der Lupe und schöbe sie nach oben.
     justify-content: center ist der zweite Teil davon — ohne das verteilen
     zwei Spalten den freien Platz unter sich auf, die leere Beschriftung
     bekäme die Hälfte und schöbe die Lupe um 5 px aus der Mitte.
     padding: 0 setzt die Vorgabe des Browsers für Schaltflächen zurück. */
  display: grid; grid-auto-flow: column;
  justify-content: center; align-items: center; padding: 0;
  overflow: hidden; flex-shrink: 0;
  background: var(--hero-deep); color: #fff; border: 0; cursor: pointer;
  /* Die Abschnitte strecken sich über die volle Höhe, der Knopf nicht —
     er behält seinen Kreis und sitzt mittig. */
  justify-self: end; align-self: center;
  transition: transform var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out);
}
.hero-go:hover { background: var(--hero-mid); transform: scale(1.06); }
.hero-go:active { transform: scale(0.97); }

/* Der Knopf ist ein Kreis mit Lupe, solange niemand in der Leiste steht.
   Sobald ein Feld offen ist, wächst die Beschriftung heraus.
   Animiert wird max-width und nicht width: `width: auto` lässt sich nicht
   überblenden, ein Deckel schon. */
/* Aufziehen mit Überblendung, Zuklappen ohne: Der Knopf springt beim
   Verlassen sofort auf seine 52 px zurück, die Beschriftung bräuchte aber
   noch ihre Zehntelsekunde — für diese Zeitspanne stand die Schrift dann
   in einem Kreis, der zu klein für sie ist, und schob die Lupe aus der
   Mitte. Deshalb steht die Überblendung nur im aufgezogenen Zustand. */
.hero-go span {
  display: block; max-width: 0; opacity: 0; overflow: hidden;
  white-space: nowrap; font-weight: 600; font-size: 0.95rem;
}
.hero-suche:focus-within .hero-go {
  width: auto; border-radius: var(--r-pill); padding-inline: 1.15rem;
}
.hero-suche:focus-within .hero-go span {
  max-width: 12rem; opacity: 1; margin-left: 0.5rem;
  transition: max-width var(--dur-panel) var(--ease-out),
              opacity var(--dur-hover) var(--ease-out),
              margin var(--dur-panel) var(--ease-out);
}

/* --- Unter 900 px ---------------------------------------------------------
   Die Überlappung funktioniert hier nicht: Das Foto nähme dem Text die
   Breite und die aufsitzende Leiste hätte keinen Platz. Also einspaltig,
   Foto oben, Leiste als eigene Karte darunter. */
@media (max-width: 899px) {
  .hero-aussen { padding-bottom: var(--s-4); }
  .hero-buehne {
    flex-direction: column; align-items: stretch;
    padding: var(--s-3);
    min-height: 0;
    /* Der Turm steht oben über, bleibt aber rechtsbündig — quer läuft
       nichts hinaus. */
    overflow: visible;
  }
  /* Nebeneinander geht hier nicht auf: Neben dem Turm blieben für die
     Überschrift keine 150 px, und eine Serifenzeile in 2 rem bricht dann
     nach jedem Wort um. Der Turm steht deshalb über dem Text, rechts
     angeschlagen und mit der Kartenkante bündig — den Überstand nach oben
     behält er. */
  .hero-foto {
    position: static; order: -1;
    height: 240px; width: auto;
    margin: -60px calc(-1 * var(--s-3)) var(--s-2) auto;
  }
  .hero-text { max-width: 100%; }
  .hero-suche {
    position: static; transform: none; width: 100%;
    border-radius: var(--r-shell);
    grid-template-columns: 1fr;
    margin-top: var(--s-3);
    padding: 0.35rem;
  }
  .hero-feld + .hero-feld::before {
    left: 0.9rem; right: 0.9rem; top: 0; transform: none;
    width: auto; height: 1px;
  }
  .hero-feld { padding: 0.75rem 0.9rem; min-height: 44px; }
  .hero-go {
    width: 100%; border-radius: var(--r-pill); height: 48px;
    margin-top: 0.35rem; gap: 0.5rem; grid-auto-flow: column;
  }
  /* Auf schmalen Geräten steht die Beschriftung immer, der Knopf ist hier
     ohnehin eine Zeile breit */
  .hero-go span { max-width: none; opacity: 1; margin-left: 0.5rem; }
}

/* Im Dunkelmodus braucht die weiße Leiste eine dunkle Fassung; die Bühne
   selbst bleibt in beiden Modi dunkel. */
:root[data-theme="dark"] .hero-suche {
  background: var(--card);
  border-color: color-mix(in srgb, #fff 12%, transparent);
}
:root[data-theme="dark"] .hero-go { background: var(--brand); color: #0A1220; }
:root[data-theme="dark"] .hero-go:hover { background: var(--brand-soft); }

/* Bildcollage im Kopfbereich. Ein hohes Bild links, zwei gestapelte
   rechts — als 2×2-Raster mit übergreifender linker Spalte, damit beide
   Seiten unten auf derselben Linie enden. Vorher war die rechte Spalte ein
   eigener Stapel und hing über.

   Das Raster steht hier und nicht als Inline-Stil im Markup: Inline-Werte
   schlagen jede Medienabfrage, und genau daran ist der Kopfbereich in
   diesem Projekt schon einmal auf schmalen Geräten hängen geblieben. */
.hero-collage {
  display: grid;
  grid-template-columns: 1.04fr 1fr;
  grid-template-rows: 1fr 1fr;
  gap: 10px;
  /* Seit Titel und Untertitel kürzer sind, trägt die Textspalte weniger
     Höhe. Eine quadratische Collage zöge den ganzen Kopfbereich auf über
     600 px und schöbe die Suchleiste unter die Falz. */
  aspect-ratio: 4 / 3;
  max-height: 430px;
  margin-inline-start: auto;
}
.hero-collage .photo { border-radius: var(--r-card); aspect-ratio: auto; height: 100%; }
.hero-collage #hero-a { grid-row: 1 / span 2; }

/* Umschalter hell/dunkel. Zeigt immer das Symbol dessen, was der Klick
   bewirken würde — sonst rätselt man, ob es den Zustand oder die Handlung
   meint. */
.theme-toggle {
  width: 40px; height: 40px; border-radius: 50%;
  display: grid; place-items: center;
  background: transparent; border: 1px solid transparent;
  color: var(--ink-2); cursor: pointer; flex-shrink: 0;
  transition: background var(--dur-hover) var(--ease-out), color var(--dur-hover) var(--ease-out);
}
.theme-toggle:hover { background: var(--card-sunk); color: var(--ink); }
.theme-toggle .theme-sun  { display: none; }
.theme-toggle .theme-moon { display: block; }
:root[data-theme="dark"] .theme-toggle .theme-sun  { display: block; }
:root[data-theme="dark"] .theme-toggle .theme-moon { display: none; }

/* Kein margin-left: Die Verweise stehen mittig, ein Randabstand schöbe sie
   genau um seinen Betrag aus der Mitte. */
.nav-links { display: none; gap: 0.25rem; align-items: center; }
.nav-link {
  font-size: 0.94rem;
  font-weight: 500;
  color: var(--ink-2);
  padding: 0.5rem 0.7rem;
  border-radius: var(--r-sm);
  transition: color var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out);
}
.nav-link:hover { color: var(--ink); background: var(--card-sunk); }

/* Die aktuelle Seite wird markiert, damit man sieht, wo man ist —
   in Tinte mit einem Strich darunter, nicht in Blau. Blau ist der
   Markenakzent und soll nicht zweite Bedeutung tragen. Der Strich ist
   die zweite, farbunabhängige Auszeichnung: Wer Farben schlecht
   unterscheidet, erkennt ihn trotzdem. */
.nav-link[aria-current] {
  color: var(--ink);
  font-weight: 600;
  background: transparent;
  position: relative;
}
.nav-link[aria-current]::after {
  content: '';
  position: absolute; left: 0.7rem; right: 0.7rem; bottom: 0.15rem;
  height: 2px; border-radius: 2px;
  background: var(--ink);
}

/* Beim Antippen färbt Android Verweise standardmäßig ein — hier
   unerwünscht, die Fläche zeigt die Berührung bereits an. */
.nav-link, .btn, .auswahl-knopf, .theme-toggle, .kalender-knopf {
  -webkit-tap-highlight-color: transparent;
}

.nav-tools { display: flex; align-items: center; gap: var(--s-1); margin-left: auto; }

/* Sprachauswahl — bei neun Sprachen ein Auswahlfeld statt Knöpfen */
/* --------------------------------------------------------------------------
   Auswahlfeld mit Suche  (assets/js/auswahl.js)
   Ersetzt das native <select> dort, wo die Liste lang ist. 113 Länder in
   einem Systemmenü sind eine Kartei zum Durchscrollen; hier tippt man drei
   Buchstaben.
   -------------------------------------------------------------------------- */

.auswahl { position: relative; display: inline-flex; flex-shrink: 0; }

.auswahl-knopf {
  display: inline-flex; align-items: center; gap: 0.4rem;
  min-height: 40px; padding: 0.35rem 0.7rem;
  background: transparent; border: 1px solid transparent;
  border-radius: var(--r-pill);
  color: var(--ink); font-size: 0.95rem; font-weight: 500;
  cursor: pointer; max-width: 100%;
  transition: background var(--dur-hover) var(--ease-out), border-color var(--dur-hover) var(--ease-out);
}
.auswahl-knopf:hover { background: var(--card-sunk); }
.auswahl-knopf--symbol {
  width: 40px; height: 40px; padding: 0; justify-content: center;
  color: var(--ink-2);
}
.auswahl-knopf--symbol:hover { color: var(--ink); }
.auswahl-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.auswahl-pfeil { flex-shrink: 0; color: var(--ink-3); transition: transform var(--dur-hover) var(--ease-out); }
.auswahl.is-offen .auswahl-pfeil { transform: rotate(180deg); }

/* Eigene Schriftfarbe, siehe .kalender-panel: In der Suchleiste erbte
   dieses Feld sonst das Weiß der Bühne und stand weiß auf Weiß. */
.auswahl-panel {
  position: absolute; z-index: 200; top: calc(100% + 8px); left: 0;
  min-width: 260px; max-width: 88vw;
  background: var(--card); color: var(--ink);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  box-shadow: var(--sh-3);
  padding: 0.4rem;
  display: flex; flex-direction: column; gap: 0.4rem;
}
/* Am rechten Rand nach innen ausrichten, sonst hängt das Feld über */
.nav-tools .auswahl-panel { left: auto; right: 0; min-width: 200px; }
.auswahl.is-oben .auswahl-panel { top: auto; bottom: calc(100% + 8px); }

.auswahl-suche {
  border: 1px solid var(--line-2); border-radius: var(--r-sm);
  padding: 0.5rem 0.7rem; font-size: 0.92rem; background: var(--surface); color: var(--ink);
}
.auswahl-suche:focus-visible { outline: 2px solid var(--brand); outline-offset: -1px; }

.auswahl-liste { max-height: 300px; overflow-y: auto; overscroll-behavior: contain; }
.auswahl-eintrag {
  display: flex; align-items: center; gap: 0.6rem;
  padding: 0.5rem 0.65rem; border-radius: var(--r-sm);
  cursor: pointer; font-size: 0.93rem;
}
.auswahl-eintrag.is-aktiv { background: var(--card-sunk); }
.auswahl-eintrag.is-gewaehlt { font-weight: 600; }
.auswahl-eintrag-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.auswahl-eintrag-note { color: var(--ink-3); font-size: 0.84rem; font-variant-numeric: tabular-nums; }
.auswahl-haken { color: var(--brand-text); flex-shrink: 0; }
.auswahl-leer { padding: 0.8rem 0.65rem; color: var(--ink-3); font-size: 0.9rem; }

/* In der Suchleiste trägt das Feld keine eigene Fläche — das Segment
   darum leuchtet bereits. */
.searchbar-feld .auswahl { width: 100%; }
.searchbar-feld .auswahl-knopf {
  padding: 0; min-height: 1.9rem; width: 100%;
  justify-content: space-between; font-size: 0.98rem;
}
.searchbar-feld .auswahl-knopf:hover { background: transparent; }

.lang { display: inline-flex; flex-shrink: 0; }
.lang-select {
  appearance: none;
  min-height: 40px;
  padding: 0.4rem 1.9rem 0.4rem 0.75rem;
  background: var(--card-sunk);
  border: 1px solid transparent;
  border-radius: var(--r-pill);
  color: var(--ink-2);
  font-size: 0.85rem;
  font-weight: 600;
  cursor: pointer;
  background-image: linear-gradient(45deg, transparent 50%, var(--ink-3) 50%),
                    linear-gradient(135deg, var(--ink-3) 50%, transparent 50%);
  background-position: calc(100% - 15px) 52%, calc(100% - 10px) 52%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  transition: border-color var(--dur-hover) var(--ease-out), color var(--dur-hover) var(--ease-out);
}
.lang-select:hover { border-color: var(--line-2); color: var(--ink); }
.lang-select:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

.nav-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px;
  background: transparent; border: 1px solid var(--line-2);
  border-radius: var(--r-sm); cursor: pointer; flex-shrink: 0;
}
.nav-toggle span { display: block; width: 16px; height: 1.5px; background: var(--ink); position: relative; }
.nav-toggle span::before, .nav-toggle span::after {
  content: ''; position: absolute; left: 0; width: 16px; height: 1.5px; background: var(--ink);
  transition: transform var(--dur-panel) var(--ease-out);
}
.nav-toggle span::before { top: -5px; }
.nav-toggle span::after { top: 5px; }
.nav-toggle[aria-expanded='true'] span { background: transparent; }
.nav-toggle[aria-expanded='true'] span::before { transform: translateY(5px) rotate(45deg); }
.nav-toggle[aria-expanded='true'] span::after { transform: translateY(-5px) rotate(-45deg); }

.nav-drawer {
  display: grid; grid-template-rows: 0fr;
  transition: grid-template-rows var(--dur-panel) var(--ease-out);
  overflow: hidden; background: var(--surface);
}
.nav-drawer.is-open { grid-template-rows: 1fr; }
/* Die Polsterung erst im geöffneten Zustand: Beim Zusammenfalten über
   grid-template-rows: 0fr schrumpft die Zeile, die Polsterung des
   Innencontainers aber nicht — geschlossen blieben sonst 24 px stehen und
   die oberste Zeile lugte unter der Kopfzeile hervor. */
.nav-drawer-inner { overflow: hidden; }
.nav-drawer.is-open .nav-drawer-inner { padding-bottom: var(--s-3); }
.nav-drawer .nav-link { display: block; padding: 0.9rem 0; border-bottom: 1px solid var(--line); font-size: 1.05rem; border-radius: 0; }

.nav-tools > .btn { display: none; }
@media (min-width: 700px) { .nav-tools > .btn { display: inline-flex; } }
@media (min-width: 1000px) {
  .nav-links { display: flex; }
  .nav-toggle { display: none; }
  .nav-drawer { display: none; }
}

/* --------------------------------------------------------------------------
   Kleine Suchleiste in der Kopfzeile
   Sie erscheint, sobald die große Leiste weggescrollt ist, und tritt an die
   Stelle der Verweise. Stehen bleiben damit oben: Wortmarke, Suche und
   rechts „Fläche anbieten", Sprache, Dunkelmodus.
   -------------------------------------------------------------------------- */

.nav-suche {
  display: none; align-items: center; gap: 0.1rem;
  padding: 0.45rem 0.45rem 0.45rem 1.35rem;
  background: var(--card);
  border: 1px solid var(--line-2);
  border-radius: var(--r-pill);
  box-shadow: var(--sh-1);
  cursor: pointer;
  font-size: 0.95rem; color: var(--ink);
  transition: box-shadow var(--dur-hover) var(--ease-out);
}
.nav-suche:hover { box-shadow: var(--sh-2); }
.nav-suche:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

.nav-suche-teil {
  padding-inline: 1.1rem; white-space: nowrap; font-weight: 600;
  max-width: 16ch; overflow: hidden; text-overflow: ellipsis;
}
.nav-suche-teil + .nav-suche-teil { border-left: 1px solid var(--line); }
.nav-suche-teil:first-child { padding-left: 0; }

.nav-suche-lupe {
  width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0;
  display: grid; place-items: center; margin-left: 0.55rem;
  background: var(--hero-deep); color: var(--hero-ink);
}
:root[data-theme="dark"] .nav-suche-lupe { background: var(--brand); color: #0A1220; }

/* Umschalten: Verweise raus, Leiste rein. Die Klasse setzt
   assets/js/index.js, sobald die große Leiste oben aus dem Bild läuft;
   auf der Objektseite steht sie fest im Markup. */
@media (min-width: 1000px) {
  .nav.is-kompakt .nav-links { display: none; }
  .nav.is-kompakt .nav-suche:not([hidden]) { display: flex; }
  /* Aufgeklappt tritt die große Leiste an die Stelle der kleinen; die
     Verweise bleiben draußen, sonst sprängen sie für die Dauer des
     Suchens in die Mitte zurück. */
  .nav.is-suchend .nav-links { display: none; }
}

/* --- Aufklappbare Suchleiste unter der Kopfzeile (Objektseite) ------------
   Dasselbe Formular wie auf der Startseite, nur an anderer Stelle. Dort
   sitzt es halb auf der Unterkante der Heldenbühne und ist dafür absolut
   gesetzt; hier steht es im Fluss und mittig.

   `position: relative` bleibt aber nötig: Das aufklappende Kalenderfeld
   wird von kalender.js an die Leiste umgehängt und richtet sich an ihr
   aus. Ohne einen gesetzten Bezug hier suchte es sich den nächsten
   positionierten Vorfahren und stünde irgendwo. */
.nav-suchfeld {
  border-top: 1px solid var(--line);
  padding-block: var(--s-2) var(--s-3);
}
.nav-suchfeld[hidden] { display: none; }
.nav-suchfeld .hero-suche {
  position: relative;
  left: auto; bottom: auto;
  transform: none;
  margin-inline: auto;
}

/* --------------------------------------------------------------------------
   6. BUTTONS
   -------------------------------------------------------------------------- */

/* Alle Knöpfe sind Pillen — die Form aus beiden Referenzen. Beim Drücken
   staucht der Knopf leicht statt zu springen; das liest sich als Druck
   auf einen Gegenstand und nicht als Sprung im Raster. */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.55rem;
  min-height: 48px;
  padding: 0.75rem 1.5rem;
  border-radius: var(--r-pill);
  border: 1px solid transparent;
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 0.95rem;
  letter-spacing: -0.005em;
  cursor: pointer;
  text-align: center;
  transition: transform var(--dur-hover) var(--ease-out),
              background var(--dur-hover) var(--ease-out),
              border-color var(--dur-hover) var(--ease-out),
              box-shadow var(--dur-hover) var(--ease-out);
}
.btn:active { transform: scale(0.98); }

/* Jede gefüllte Schaltfläche trägt dieselbe Fläche: das tiefe Blau der
   Heldenbühne, dieselbe wie der runde Knopf in der Suchleiste (.hero-go).
   Weiß darauf ergibt 15,8:1.

   Das helle Markenblau selbst ginge nicht — Weiß darauf hat 2,93:1 und
   brauchte früher einen Umriss als Krücke. Vorher war Primär schwarz; das
   tiefe Blau ist ebenso tragfähig und bindet die Schaltflächen an die
   Bühne.

   Im Dunkelmodus wäre diese Fläche vom Grund kaum zu unterscheiden; dort
   übernimmt das helle Markenblau mit dunkler Schrift — wie .hero-go. */
.btn--primary { background: var(--hero-deep); color: var(--hero-ink); box-shadow: var(--sh-1); }
.btn--primary:hover { background: var(--hero-mid); box-shadow: var(--sh-2); transform: translateY(-1px); }
.btn--primary:active { transform: scale(0.98); }
:root[data-theme="dark"] .btn--primary { background: var(--brand); color: #0A1220; }
:root[data-theme="dark"] .btn--primary:hover { background: var(--brand-soft); }

/* Die zweite Handlung neben einer ersten — „Zurück" neben „Weiter".
   Sie trägt dieselbe Farbe, aber als Schrift und Kante statt als Fläche:
   Zwei gleich gefüllte Knöpfe nebeneinander sähen gleich wichtig aus, und
   die Frage „welcher bringt mich weiter?" wäre nur noch am Text zu klären.
   #14233A auf Weiß hat 15,8:1. */
.btn--ghost {
  background: var(--card); color: var(--hero-deep);
  border-color: color-mix(in srgb, var(--hero-deep) 30%, transparent);
}
.btn--ghost:hover { border-color: var(--hero-deep); box-shadow: var(--sh-1); }

.btn--quiet { background: transparent; color: var(--hero-deep); }
.btn--quiet:hover { background: var(--card-sunk); }

/* Im Dunkelmodus wäre das tiefe Blau als Schrift auf dunklem Grund nicht
   zu lesen; dort bleiben beide bei der Textfarbe der Seite. */
:root[data-theme="dark"] .btn--ghost { color: var(--ink); border-color: var(--line-2); }
:root[data-theme="dark"] .btn--ghost:hover { border-color: var(--ink); }
:root[data-theme="dark"] .btn--quiet { color: var(--ink-2); }
:root[data-theme="dark"] .btn--quiet:hover { color: var(--ink); }

/* Auf dem schwarzen Kontrastband */
.btn--onblue { background: var(--surface); color: var(--ink); }
.btn--onblue:hover { background: var(--brand); color: #0A1220; }
.btn--ghost-onblue { background: transparent; color: #fff; border-color: rgba(255,255,255,0.35); }
.btn--ghost-onblue:hover { background: rgba(255,255,255,0.1); border-color: #fff; }

.btn--sm { min-height: 40px; padding: 0.45rem 1.05rem; font-size: 0.88rem; }
.btn--lg { min-height: 58px; padding: 0.95rem 2rem; font-size: 1.04rem; }
.btn--block { width: 100%; }

/* Pfeil im eigenen Kreis, bündig in der rechten Polsterung. Er wandert
   beim Überfahren ein Stück in seine Richtung — die Bewegung sagt, wohin
   der Knopf führt, statt nur zu blinken. */
.btn__go {
  width: 30px; height: 30px; border-radius: 50%;
  display: grid; place-items: center; flex-shrink: 0;
  margin-right: -0.55rem; margin-left: 0.15rem;
  background: rgba(255, 255, 255, 0.16);
  transition: transform var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out);
}
.btn--ghost .btn__go, .btn--onblue .btn__go { background: rgba(10, 18, 32, 0.1); }
.btn:hover .btn__go { transform: translateX(3px) scale(1.06); background: rgba(255, 255, 255, 0.26); }
.btn--ghost:hover .btn__go, .btn--onblue:hover .btn__go { background: rgba(10, 18, 32, 0.16); }

/* Weiterführende Verweise laufen in der Textfarbe, nicht in Blau. Blau
   ist hier der Markenakzent; wenn jeder Verweis blau ist, trägt die Farbe
   keine Bedeutung mehr. Der Pfeil zeigt, dass es weitergeht. */
.arrow-link {
  display: inline-flex; align-items: center; gap: 0.45rem;
  font-weight: 600; color: var(--ink-2); min-height: 44px;
  transition: color var(--dur-hover) var(--ease-out);
}
.arrow-link:hover { color: var(--ink); }
.arrow-link svg { transition: transform var(--dur-hover) var(--ease-out); }
.arrow-link:hover svg { transform: translateX(3px); }

/* --------------------------------------------------------------------------
   7. FORMULARE
   -------------------------------------------------------------------------- */

.field { display: flex; flex-direction: column; gap: 0.35rem; }
.label { font-size: var(--t--1); font-weight: 400; color: var(--ink-2); }

.input, .select, .textarea {
  min-height: 48px;
  padding: 0.7rem 0.9rem;
  background: var(--card);
  border: 1px solid var(--line-2);
  border-radius: var(--r);
  color: var(--ink);
  width: 100%;
  transition: border-color var(--dur-hover) var(--ease-out), box-shadow var(--dur-hover) var(--ease-out);
}
.input::placeholder, .textarea::placeholder { color: var(--ink-3); }
.input:hover, .select:hover, .textarea:hover { border-color: var(--line-3); }
.input:focus, .select:focus, .textarea:focus {
  outline: none;
  border-color: var(--blue);
  box-shadow: 0 0 0 3px var(--blue-100);
}
.textarea { min-height: 120px; resize: vertical; line-height: 1.55; }

.select {
  appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--ink-3) 50%),
                    linear-gradient(135deg, var(--ink-3) 50%, transparent 50%);
  background-position: calc(100% - 18px) 50%, calc(100% - 13px) 50%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  padding-right: 2.5rem;
}

.error { font-size: var(--t--1); color: var(--danger); font-weight: 500; }
.field.is-invalid .input, .field.is-invalid .select, .field.is-invalid .textarea { border-color: var(--danger); }

.check { display: flex; align-items: center; gap: 0.6rem; min-height: 44px; cursor: pointer; font-size: 0.94rem; }
.check input { width: 18px; height: 18px; accent-color: var(--blue); cursor: pointer; flex-shrink: 0; }

.range { width: 100%; height: 36px; accent-color: var(--blue); background: transparent; cursor: pointer; }
.range:focus-visible { outline: 2px solid var(--blue); outline-offset: 4px; }

.choice {
  position: relative; display: block;
  border: 1px solid var(--line-2); border-radius: var(--r);
  padding: 0.9rem 1rem; cursor: pointer; background: var(--card);
  transition: border-color var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out), box-shadow var(--dur-hover) var(--ease-out);
  min-height: 48px;
}
.choice input { position: absolute; opacity: 0; width: 0; height: 0; }
.choice:hover { border-color: var(--line-3); box-shadow: var(--sh-1); }
.choice:has(input:checked) { border-color: var(--blue); background: var(--blue-50); box-shadow: 0 0 0 1px var(--blue); }
.choice:has(input:focus-visible) { outline: 2px solid var(--blue); outline-offset: 2px; }
.choice-title { font-weight: 600; display: block; }
.choice-note { font-size: var(--t--1); color: var(--ink-3); }

/* --------------------------------------------------------------------------
   8. SUCHLEISTE (Hero)
   -------------------------------------------------------------------------- */

/* Suchleiste als Schale mit Innenkörper: Ein heller Rahmen um ein weißes
   Feld, Außenradius minus Polsterung für den Innenradius, damit die Kurven
   parallel laufen. Das ist der Griff, an dem die Seite angefasst wird —
   er darf sich anfühlen wie ein Gegenstand. */
.searchbar {
  background: var(--card);
  border-radius: var(--r-shell);
  padding: var(--s-2);
  display: grid;
  gap: var(--s-2);
  box-shadow: var(--sh-3);
  outline: 1px solid var(--line);
  outline-offset: -1px;
}
/* Jedes Feld ist ein eigenes Segment, das beim Überfahren aufleuchtet —
   die Geste von Buchungsseiten. Die Polsterung sitzt am Segment, nicht an
   der Schale, damit die helle Fläche bis an die Trennlinie reicht. */
.searchbar-feld {
  border-radius: calc(var(--r-shell) - var(--s-2));
  padding: 0.7rem 1rem;
  transition: background var(--dur-hover) var(--ease-out);
  min-width: 0;
}
.searchbar-feld:hover,
.searchbar-feld:focus-within { background: var(--card-sunk); }
.searchbar-feld .label { display: block; margin-bottom: 0.1rem; }
.searchbar-feld .input {
  border: 0; background: transparent; padding: 0; min-height: 1.9rem;
  width: 100%; font-size: 0.98rem;
}
.searchbar-feld .input:focus-visible { outline: none; }

/* Runder Knopf mit Lupe. Markenblau mit dunklem Symbol: Weiß darauf hätte
   2,93:1 und wäre zu schwach — dunkel auf demselben Blau sind es 6,5:1.
   Der Ring gibt dem Kreis eine Kante gegen den weißen Grund. */
.searchbar-go {
  width: 52px; height: 52px; border-radius: 50%;
  display: grid; place-items: center; flex-shrink: 0;
  background: var(--brand); color: #0A1220;
  border: 0; box-shadow: inset 0 0 0 1px var(--brand-deep);
  cursor: pointer; justify-self: end;
  transition: transform var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out);
}
.searchbar-go:hover { background: var(--brand-soft); transform: scale(1.06); }
.searchbar-go:active { transform: scale(0.97); }

@media (min-width: 560px) {
  .searchbar { grid-template-columns: 1fr 1fr auto; align-items: center; }
}
@media (min-width: 900px) {
  .searchbar { grid-template-columns: 1.6fr 1.1fr auto; gap: 0; padding: 0.4rem 0.4rem 0.4rem 0.5rem; align-items: center; }

  /* Trennstrich zwischen den Feldern, wie in Buchungsleisten üblich.
     Er verschwindet, sobald eines der beiden Segmente aufleuchtet —
     sonst schnitte eine Linie mitten durch die helle Fläche. */
  .searchbar-feld + .searchbar-feld { position: relative; }
  .searchbar-feld + .searchbar-feld::before {
    content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
    width: 1px; height: 60%; background: var(--line);
    transition: opacity var(--dur-hover) var(--ease-out);
  }
  .searchbar-feld:hover + .searchbar-feld::before,
  .searchbar-feld:focus-within + .searchbar-feld::before,
  .searchbar-feld + .searchbar-feld:hover::before,
  .searchbar-feld + .searchbar-feld:focus-within::before { opacity: 0; }
}

/* --------------------------------------------------------------------------
   9. FILTER-CHIPS
   -------------------------------------------------------------------------- */

.chipbar {
  display: flex; align-items: center; gap: 0.5rem;
  overflow-x: auto; padding-bottom: 0.35rem;
  scrollbar-width: thin;
}
.chipbar::-webkit-scrollbar { height: 4px; }
.chipbar::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 2px; }

.chip {
  display: inline-flex; align-items: center; gap: 0.4rem;
  white-space: nowrap;
  min-height: 42px;
  padding: 0.5rem 0.95rem;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: var(--card);
  color: var(--ink-2);
  font-size: 0.9rem; font-weight: 500;
  cursor: pointer;
  transition: border-color var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out),
              color var(--dur-hover) var(--ease-out), box-shadow var(--dur-hover) var(--ease-out);
}
.chip:hover { border-color: var(--line-3); box-shadow: var(--sh-1); }
.chip[aria-pressed='true'] { background: var(--blue); border-color: var(--blue); color: #fff; }
:root[data-theme="dark"] .chip[aria-pressed='true'] { color: #0C1420; }
.chip--reset { border-style: dashed; color: var(--ink-3); }

/* --------------------------------------------------------------------------
   10. KARTEN (Listings)
   -------------------------------------------------------------------------- */

/* Objektkarte im Zuschnitt der Airbnb-Referenz: gerundetes Foto, darunter
   Text ohne Rahmen und ohne Kasten. Der Schatten liegt am Foto, nicht an
   der Karte — das ist der Unterschied zwischen „Bild auf weißem Blatt" und
   „Kachel in einem Raster". */
.card {
  position: relative;
  background: transparent;
  border-radius: var(--r-card);
  display: flex; flex-direction: column;
  transition: transform var(--dur-hover) var(--ease-out);
}
.card:hover { transform: translateY(-2px); }
.card:focus-within .photo { box-shadow: 0 0 0 3px var(--brand); }

/* Die ganze Karte ist anklickbar, ohne dass ein Verweis um alles herum
   liegt. Der Verweis im Titel zieht eine unsichtbare Fläche über die
   Karte; alles darunter — Foto, Ort, Preis — führt damit zum Objekt.

   Auf der Startseite geht es einfacher: Dort ist die Karte selbst ein
   <a>. Hier steckt der Merkknopf mit drin, und ein Knopf in einem Verweis
   ist ungültiges Markup. Genau ein Verweis je Karte bleibt es so oder so.

   Der Merkknopf liegt eine Ebene höher und bleibt bedienbar. Er steht
   dafür neben dem Foto statt darin: Das Bild bildet mit
   `isolation: isolate` einen eigenen Stapelraum, aus dem heraus keine
   z-index-Angabe nach außen wirkt.

   Preis der Bauart: Der Text auf der Karte lässt sich nicht mehr mit der
   Maus markieren. */
.card--klick .card-title a::after {
  content: ''; position: absolute; inset: 0; z-index: 1;
  border-radius: var(--r-card);
}
.card--klick .fav { z-index: 2; }

.card .photo { border-radius: var(--r-card); }

.card-body { padding: 0.85rem 0.15rem 0; display: flex; flex-direction: column; gap: 0.3rem; flex: 1; }
.card-title { font-family: var(--font-sans); font-size: 1.02rem; font-weight: 600; letter-spacing: -0.02em; }
.card-meta { font-size: 0.88rem; color: var(--ink-3); }

/* Bildfläche. Bis echte Fotos vorliegen: Lichtstudien aus Verläufen.
   Austausch gegen <img> ist in der README beschrieben. */
.photo {
  position: relative;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--card-sunk);
  isolation: isolate;
}
.photo img { width: 100%; height: 100%; object-fit: cover; transition: transform 400ms var(--ease-out); }
.card:hover .photo img { transform: scale(1.04); }

/* Eine Lichtstudie je Himmelsrichtung — Nordlicht kühl, Südlicht warm.
   Alle acht Richtungen sind belegt, weil die Daten sie liefern. */
.photo--n  { background: linear-gradient(155deg, #6E8798 0%, #3E5566 48%, #22303C 100%); }
.photo--s  { background: linear-gradient(155deg, #D6B187 0%, #9A7853 48%, #453727 100%); }
.photo--e  { background: linear-gradient(155deg, #B9C4AE 0%, #74836B 48%, #2F382C 100%); }
.photo--w  { background: linear-gradient(155deg, #CE9679 0%, #87604C 48%, #3A2820 100%); }
.photo--ne { background: linear-gradient(155deg, #8FA9A6 0%, #4F6B69 48%, #26383A 100%); }
.photo--nw { background: linear-gradient(155deg, #8794A8 0%, #4B5872 48%, #252C3C 100%); }
.photo--se { background: linear-gradient(155deg, #D8BE95 0%, #9C8155 48%, #453B26 100%); }
.photo--sw { background: linear-gradient(155deg, #D2A184 0%, #8B6650 48%, #3C2C22 100%); }
.photo--loft   { background: linear-gradient(155deg, #9AA6B3 0%, #56636F 48%, #272E35 100%); }
.photo--atrium { background: linear-gradient(155deg, #DED9CB 0%, #96917F 48%, #3E3C33 100%); }

/* Fensterraster deutet Raum an, ohne ein Foto zu behaupten */
.photo::after {
  content: '';
  position: absolute; inset: 0;
  background-image:
    linear-gradient(to right, rgba(255,255,255,0.12) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255,255,255,0.12) 1px, transparent 1px);
  background-size: 24% 32%;
  mix-blend-mode: overlay;
  pointer-events: none;
}

.photo-tag {
  position: absolute; left: 0.7rem; top: 0.7rem; z-index: 2;
  font-size: 0.75rem; font-weight: 600;
  padding: 0.32em 0.65em;
  border-radius: var(--r-pill);
  background: rgba(255,255,255,0.94);
  color: #14181A;
  box-shadow: var(--sh-1);
}

/* Favoritenknopf — Marktplatz-Konvention */
.fav {
  position: absolute; right: 0.6rem; top: 0.6rem; z-index: 2;
  width: 38px; height: 38px;
  border: 0; border-radius: 50%;
  background: rgba(255,255,255,0.92);
  color: #4A5157;
  display: grid; place-items: center;
  cursor: pointer;
  box-shadow: var(--sh-1);
  transition: transform var(--dur-hover) var(--ease-out), color var(--dur-hover) var(--ease-out);
}
.fav:hover { transform: scale(1.08); }
.fav[aria-pressed='true'] { color: #C2703D; }
.fav[aria-pressed='true'] svg { fill: currentColor; }

.badge {
  display: inline-flex; align-items: center; gap: 0.3rem;
  font-size: 0.74rem; font-weight: 600;
  padding: 0.3em 0.6em;
  border-radius: var(--r-pill);
  white-space: nowrap;
}
.badge--ok      { background: var(--ok-bg);     color: var(--ok); }
.badge--warn    { background: var(--warn-bg);   color: var(--warn); }
/* Auf dem hellblauen Feld reicht --brand-text nicht: 3,98:1 bei 12 px.
   --brand-deep kommt auf 7,31:1. */
.badge--blue    { background: var(--brand-100);  color: var(--brand-deep); }
.badge--copper  { background: var(--copper-100); color: var(--copper-deep); }
.badge--neutral { background: var(--card-sunk); color: var(--ink-2); }

.seal { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.78rem; font-weight: 600; color: var(--ok); }
.seal svg { width: 14px; height: 14px; flex-shrink: 0; }

.price { font-family: var(--font-sans); font-weight: 600; letter-spacing: -0.02em; }
.price-unit { font-size: 0.8em; color: var(--ink-3); font-weight: 500; }

.rating { display: inline-flex; align-items: center; gap: 0.25rem; font-size: 0.86rem; font-weight: 600; }
.rating svg { width: 14px; height: 14px; color: var(--copper); fill: currentColor; }
.rating small { color: var(--ink-3); font-weight: 400; font-size: 1em; }

/* Beschriftung, Punktlinie, Wert.
   Der Wert trug bisher white-space:nowrap und konnte deshalb nicht
   umbrechen — bei langen Angaben wie „Long Term Office" oder einer
   ausführlichen Adresse schob er sich über die Beschriftung. Jetzt darf
   die Zeile umbrechen: Passt der Wert nicht mehr daneben, rückt er in die
   nächste Zeile und bleibt rechtsbündig. */
.spec {
  display: flex; align-items: baseline; gap: 0.5rem;
  padding: 0.5rem 0; border-bottom: 1px solid var(--line);
  flex-wrap: wrap;
}
.spec:last-child { border-bottom: 0; }
.spec-key { color: var(--ink-2); font-size: 0.92rem; flex-shrink: 0; max-width: 100%; }
.spec-dots { flex: 1 1 1rem; border-bottom: 1px dotted var(--line-2); transform: translateY(-3px); min-width: 1rem; }
.spec-val {
  font-weight: 500; text-align: right; margin-left: auto;
  max-width: 100%; overflow-wrap: anywhere;
}

/* Merkmalzeile unter dem Titel */
.facts { display: flex; flex-wrap: wrap; gap: 0.3rem 0.5rem; font-size: 0.86rem; color: var(--ink-3); }
.facts span + span::before { content: '·'; margin-right: 0.5rem; color: var(--line-2); }

/* --------------------------------------------------------------------------
   11. SUCHSEITE: Liste links, Karte rechts fixiert
   -------------------------------------------------------------------------- */

.split { display: grid; grid-template-columns: 1fr; gap: var(--s-3); align-items: start; }
@media (min-width: 1100px) {
  .split { grid-template-columns: minmax(0, 1fr) minmax(360px, 40%); gap: var(--s-4); }
  .split-map { position: sticky; top: 6rem; height: calc(100vh - 8rem); }
}

.results-grid { display: grid; grid-template-columns: 1fr; gap: var(--s-3); }
@media (min-width: 620px)  { .results-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1500px) { .results-grid { grid-template-columns: repeat(3, 1fr); } }

/* Ohne Kartenspalte darf das Raster breiter werden */
.split.is-listonly { grid-template-columns: 1fr; }
.split.is-listonly .split-map { display: none; }
.split.is-listonly .results-grid { grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); }

/* --- Filterspalte ---------------------------------------------------------
   Ab 1100 px eine eigene Spalte links, die beim Blättern stehen bleibt.
   Darunter klappt sie über den Ergebnissen auf: Auf einem Telefon nähme
   eine feste Spalte die halbe Bildbreite weg. */
.search-layout { display: grid; grid-template-columns: 1fr; gap: var(--s-4); align-items: start; }
@media (min-width: 1100px) {
  .search-layout { grid-template-columns: 264px minmax(0, 1fr); }
  .filters { position: sticky; top: 6rem; }
  .filters-toggle { display: none; }
}

/* Auf dem reinweißen Grund trägt ein Schatten allein nicht mehr — die
   Spalte wäre unsichtbar. Stattdessen eine Haarlinie und der große Radius
   der Schalen. */
.filters {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r-shell);
  padding: var(--s-3);
}
.filter-group { display: block; padding-block: var(--s-2); }
.filter-group + .filter-group { border-top: 1px solid var(--line); }
.filter-group > .label { display: block; margin-bottom: 0.5rem; }
.filter-group .select, .filter-group .input, .filter-group .range { width: 100%; }
.filters .btn { margin-top: var(--s-2); }

/* Unter 1100 px wird die Spalte erst auf Knopfdruck sichtbar */
@media (max-width: 1099px) {
  .filters { display: none; }
  .filters.is-open { display: block; }
}

.map {
  position: relative; height: 100%; min-height: 440px;
  border-radius: var(--r-card);
  background: var(--card-sunk);
  overflow: hidden;
  box-shadow: var(--sh-1);
  touch-action: none;                 /* sonst scrollt die Seite beim Ziehen */
  cursor: grab;
}
.map.is-dragging { cursor: grabbing; }
.map:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

/* Kacheln und Nadeln liegen übereinander; verschoben wird nur der Inhalt,
   nicht der Rahmen — so bleibt die abgerundete Ecke erhalten. */
.map-layer { position: absolute; inset: 0; }
.map-layer img {
  position: absolute; width: 256px; height: 256px;
  user-select: none; -webkit-user-drag: none;
}

/* Preisnadel statt Punkt — Marktplatz-Konvention */
.map-pin {
  position: absolute; transform: translate(-50%, -100%);
  background: var(--card); color: var(--ink);
  border: 1px solid var(--line-2); border-radius: var(--r-pill);
  font-family: var(--font-sans); font-size: 0.78rem; font-weight: 700;
  padding: 0.28rem 0.6rem; white-space: nowrap; cursor: pointer;
  box-shadow: var(--sh-1);
  transition: background var(--dur-hover) var(--ease-out), color var(--dur-hover) var(--ease-out);
}
.map-pin:hover, .map-pin.is-active { background: var(--blue); border-color: var(--blue); color: #fff; z-index: 2; }
.map-pin:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

.map-zoom { position: absolute; top: 10px; right: 10px; display: grid; gap: 4px; z-index: 3; }
.map-zoom button {
  width: 34px; height: 34px; border-radius: 9px;
  background: var(--card); color: var(--ink);
  border: 1px solid var(--line-2); box-shadow: var(--sh-1);
  font-size: 1.1rem; line-height: 1; cursor: pointer;
}
.map-zoom button:hover { border-color: var(--line-3); }

.map-credit {
  position: absolute; right: 0; bottom: 0; z-index: 3; margin: 0;
  background: color-mix(in srgb, var(--card) 82%, transparent);
  /* Nicht kleiner: Die Nennung ist Lizenzbedingung und muss lesbar sein */
  font-size: 0.75rem; padding: 0.2rem 0.5rem; border-top-left-radius: 8px;
}
.map-credit a { color: inherit; }

/* --- Bilder vergrößern ----------------------------------------------------
   Die Lupe erscheint nur dort, wo sich das Bild wirklich öffnen lässt.
   Das Kennzeichen ist role="button" — das setzt objekt.js genau an den
   Bildern, an die die Lightbox gehängt wurde. Auf den Karten in der Suche
   führt ein Klick zur Objektseite, dort wäre eine Lupe eine Lüge.

   Gezeichnet als SVG statt über das Systemkürzel `zoom-in`: Das ist auf
   Windows eine kleine Bitmap und wirkt auf heutigen Bildschirmen grob.
   Weiße Lupe mit dunklem Rand, damit sie auf hellen wie dunklen Fotos
   steht. Der Zahlenpaar am Ende ist der Griffpunkt (Mitte des Kreises). */
.gallery .photo img[role="button"] {
  cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cg fill='none' stroke='%23111418' stroke-width='4' stroke-linecap='round'%3E%3Ccircle cx='14' cy='14' r='8'/%3E%3Cpath d='M20 20l6 6M14 10.5v7M10.5 14h7'/%3E%3C/g%3E%3Cg fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='14' cy='14' r='8'/%3E%3Cpath d='M20 20l6 6M14 10.5v7M10.5 14h7'/%3E%3C/g%3E%3C/svg%3E") 14 14, zoom-in;
}
.gallery .photo img:focus-visible { outline: 3px solid var(--brand); outline-offset: -3px; }

.lightbox {
  border: 0; padding: 0; max-width: 100vw; max-height: 100vh;
  width: 100vw; height: 100vh; background: transparent;
  display: none; place-items: center;
}
.lightbox[open] { display: grid; grid-template-columns: auto 1fr auto; align-items: center; }
.lightbox::backdrop { background: rgba(9, 12, 18, 0.92); }

.lightbox-figure { margin: 0; display: grid; gap: var(--s-2); justify-items: center; padding: var(--s-3); min-width: 0; }
.lightbox-figure img {
  max-width: 100%; max-height: 82vh; width: auto; height: auto;
  border-radius: var(--r-card); display: block;
}
.lightbox-figure figcaption { color: #fff; font-size: 0.9rem; text-align: center; }
.lightbox-pos { opacity: 0.65; margin-left: 0.4rem; }

.lightbox-close, .lightbox-nav {
  background: rgba(255, 255, 255, 0.1); color: #fff;
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: 50%; cursor: pointer;
  width: 46px; height: 46px; display: grid; place-items: center;
  transition: background var(--dur-hover) var(--ease-out);
}
.lightbox-close:hover, .lightbox-nav:hover { background: rgba(255, 255, 255, 0.22); }
.lightbox-close { position: fixed; top: 16px; right: 16px; z-index: 2; }
.lightbox-nav { margin-inline: var(--s-2); }

@media (max-width: 640px) {
  /* Auf schmalen Geräten liegen die Pfeile über dem Bild statt daneben —
     als eigene Spalten bliebe für das Foto kaum Breite. */
  .lightbox[open] { grid-template-columns: 1fr; }
  .lightbox-nav { position: fixed; bottom: 20px; }
  .lightbox-prev { left: 20px; }
  .lightbox-next { right: 20px; }
}

/* Galerie ohne Fotos: keine Attrappe, sondern eine ehrliche Leerstelle */
.photo--empty {
  display: grid; place-items: center;
  background: var(--card-sunk); color: var(--ink-3);
  font-size: 0.95rem; text-align: center; padding: var(--s-3);
}
.gallery.is-empty { grid-template-columns: 1fr; }

.results-bar {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-2); flex-wrap: wrap; margin-bottom: var(--s-3);
}
.result-count { font-size: 0.95rem; color: var(--ink-2); }
.result-count strong { color: var(--ink); font-weight: 700; }

.view-toggle { display: inline-flex; background: var(--card-sunk); border-radius: var(--r-pill); padding: 3px; }
.view-toggle button {
  min-height: 38px; padding: 0.35rem 0.9rem;
  background: transparent; border: 0; border-radius: var(--r-pill);
  cursor: pointer; font-size: 0.87rem; font-weight: 600; color: var(--ink-3);
  transition: background var(--dur-hover) var(--ease-out), color var(--dur-hover) var(--ease-out);
}
.view-toggle button[aria-pressed='true'] { background: var(--card); color: var(--ink); box-shadow: var(--sh-1); }

/* Blättern */
.pager { display: flex; align-items: center; justify-content: center; gap: 0.4rem; margin-top: var(--s-5); flex-wrap: wrap; }
.pager button {
  min-width: 42px; min-height: 42px; padding: 0 0.7rem;
  border: 1px solid var(--line-2); background: var(--card);
  border-radius: var(--r-sm); cursor: pointer; font-weight: 600; font-size: 0.9rem;
  color: var(--ink-2);
  transition: border-color var(--dur-hover) var(--ease-out), background var(--dur-hover) var(--ease-out), color var(--dur-hover) var(--ease-out);
}
.pager button:hover:not(:disabled) { border-color: var(--line-3); color: var(--ink); }
.pager button[aria-current='page'] { background: var(--blue); border-color: var(--blue); color: #fff; }
:root[data-theme="dark"] .pager button[aria-current='page'] { color: #0C1420; }
.pager button:disabled { opacity: 0.4; cursor: not-allowed; }
.pager-gap { color: var(--ink-3); padding: 0 0.2rem; }

.empty {
  text-align: center; padding: var(--s-6) var(--s-3);
  background: var(--card); border-radius: var(--r-card); color: var(--ink-2);
}

/* Ladezustand */
.skeleton {
  background: linear-gradient(90deg, var(--card-sunk) 25%, var(--line) 37%, var(--card-sunk) 63%);
  background-size: 400% 100%;
  animation: shimmer 1.4s ease-in-out infinite;
  border-radius: var(--r-card);
}
@keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }
.skeleton-card { height: 300px; }

/* --------------------------------------------------------------------------
   12. OBJEKTSEITE
   -------------------------------------------------------------------------- */

.object-layout { display: grid; gap: var(--s-4); }
@media (min-width: 1024px) { .object-layout { grid-template-columns: minmax(0,1fr) 360px; gap: var(--s-5); align-items: start; } }

.booking-panel {
  border: 1px solid var(--line); border-radius: var(--r-shell);
  background: var(--card); color: var(--ink); padding: var(--s-3);
  display: flex; flex-direction: column; gap: var(--s-2);
  box-shadow: var(--sh-2);
}
@media (min-width: 1024px) { .booking-panel { position: sticky; top: 6rem; } }

.gallery { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.gallery .photo { border-radius: var(--r-card); }
.gallery .photo:first-child { grid-column: 1 / -1; aspect-ratio: 16 / 9; }
@media (min-width: 760px) {
  .gallery { grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(2, 1fr); height: 440px; }
  .gallery .photo { aspect-ratio: auto; height: 100%; }
  /* aspect-ratio muss hier noch einmal zurückgenommen werden, obwohl die
     Zeile darüber es für alle Bilder tut: Die Regel für das erste Bild
     steht außerhalb dieser Abfrage und wiegt mit :first-child schwerer —
     Reihenfolge hilft gegen Gewicht nicht.

     Was ohne diese Zeile geschah: Das Titelbild bekam aus dem Raster
     440 px Höhe und rechnete sich daraus über 16:9 eine Breite von
     782 px. Sein Platz im Raster ist aber 696 px breit. Die überzähligen
     86 px schob es unter das Bild rechts daneben — die Bilder
     überlappten sich. */
  .gallery .photo:first-child { grid-column: span 2; grid-row: span 2; aspect-ratio: auto; }
}

.tabs { display: flex; gap: 0.3rem; border-bottom: 1px solid var(--line); margin-bottom: var(--s-3); overflow-x: auto; }
.tab {
  padding: 0.8rem 1rem; background: transparent; border: 0;
  border-bottom: 2px solid transparent; cursor: pointer;
  color: var(--ink-3); font-weight: 600; white-space: nowrap; min-height: 48px;
  transition: color var(--dur-hover) var(--ease-out), border-color var(--dur-hover) var(--ease-out);
}
.tab[aria-selected='true'] { color: var(--blue); border-bottom-color: var(--blue); }
.tab:hover { color: var(--ink); }
.tabpanel[hidden] { display: none; }

.amenities { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 0.7rem var(--s-3); }
.amenity { display: flex; align-items: center; gap: 0.55rem; font-size: 0.94rem; }
.amenity svg { width: 17px; height: 17px; color: var(--ok); flex-shrink: 0; }

/* Grundriss — bleibt als Unterscheidungsmerkmal, in neuer Farbwelt */
.plan { position: relative; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-card); overflow: hidden; }
.plan::before {
  content: ''; position: absolute; inset: 0;
  background-image: linear-gradient(to right, var(--line) 1px, transparent 1px),
                    linear-gradient(to bottom, var(--line) 1px, transparent 1px);
  background-size: 28px 28px; opacity: 0.6; pointer-events: none;
}
.plan svg { position: relative; width: 100%; height: auto; display: block; }
.plan-wall { fill: none; stroke: var(--ink); stroke-width: 5; stroke-linejoin: miter; }
.plan-inner-wall { fill: none; stroke: var(--ink); stroke-width: 2.5; }
.plan-hint { fill: none; stroke: var(--line-3); stroke-width: 1; stroke-dasharray: 4 4; }

.plan-room { cursor: pointer; }
.plan-room rect {
  fill: var(--blue-100); fill-opacity: 0.85;
  stroke: var(--line-3); stroke-width: 1;
  transition: fill var(--dur-hover) var(--ease-out), fill-opacity var(--dur-hover) var(--ease-out);
}
.plan-room.is-booked rect { fill: url(#hatch); fill-opacity: 1; }
.plan-room:hover rect, .plan-room:focus-visible rect { fill: var(--blue); fill-opacity: 0.3; }
.plan-room.is-active rect { fill: var(--blue); fill-opacity: 0.45; stroke: var(--blue); stroke-width: 2; }
.plan-room:focus { outline: none; }
.plan-room:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

.plan-label { font-family: var(--font-sans); font-size: 11px; font-weight: 600; fill: var(--ink); pointer-events: none; text-anchor: middle; }
.plan-label--sub { font-size: 9.5px; font-weight: 400; fill: var(--ink-2); }
.plan-dim { stroke: var(--line-3); stroke-width: 0.8; }
.plan-dim-text { font-family: var(--font-sans); font-size: 9px; fill: var(--ink-3); text-anchor: middle; }
.plan-north-text { font-family: var(--font-sans); font-size: 10px; font-weight: 700; fill: var(--ink); text-anchor: middle; }

.plan-legend { display: flex; flex-wrap: wrap; gap: var(--s-2); padding: var(--s-2) var(--s-3); border-top: 1px solid var(--line); background: var(--card-sunk); position: relative; }
.plan-legend-item { display: flex; align-items: center; gap: 0.4rem; font-size: 0.8rem; color: var(--ink-2); }
.plan-legend-swatch { width: 14px; height: 10px; border: 1px solid var(--line-3); border-radius: 2px; flex-shrink: 0; }

.plan-layout { display: grid; grid-template-columns: 1fr; gap: var(--s-3); align-items: start; }
@media (min-width: 1500px) { .plan-layout { grid-template-columns: 1fr 300px; } }

.room-panel { background: var(--card); color: var(--ink); border: 1px solid var(--line); border-radius: var(--r-card); padding: var(--s-3); display: flex; flex-direction: column; gap: 0.75rem; }
.room-panel-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--s-2); }

.plan-draw path, .plan-draw line, .plan-draw rect, .plan-draw polyline {
  stroke-dasharray: var(--len, 1200); stroke-dashoffset: var(--len, 1200);
}
.plan-draw.is-drawn path, .plan-draw.is-drawn line, .plan-draw.is-drawn rect, .plan-draw.is-drawn polyline {
  animation: plan-draw 1500ms var(--ease-out) forwards;
  animation-delay: calc(var(--d, 0) * 1ms);
}
@keyframes plan-draw { to { stroke-dashoffset: 0; } }
.plan-draw .fade-in { opacity: 0; }
.plan-draw.is-drawn .fade-in { animation: plan-fade 600ms var(--ease-out) forwards; animation-delay: calc(var(--d, 0) * 1ms); }
@keyframes plan-fade { to { opacity: 1; } }

/* --------------------------------------------------------------------------
   13. BUCHUNGSSTRECKE
   -------------------------------------------------------------------------- */

.steps { display: flex; gap: 0; margin-bottom: var(--s-5); flex-wrap: wrap; }
.step { display: flex; align-items: center; gap: 0.55rem; padding: 0.5rem 0; flex: 1 1 auto; min-width: 0; }
.step-no {
  width: 32px; height: 32px; border-radius: 50%;
  border: 1px solid var(--line-2); display: grid; place-items: center;
  font-size: 0.82rem; font-weight: 700; flex-shrink: 0; color: var(--ink-3);
  transition: background var(--dur-panel) var(--ease-out), border-color var(--dur-panel) var(--ease-out), color var(--dur-panel) var(--ease-out);
}
.step-label { font-size: 0.9rem; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.step.is-current .step-no { background: var(--blue); border-color: var(--blue); color: #fff; }
.step.is-current .step-label { color: var(--ink); font-weight: 600; }
.step.is-done .step-no { background: var(--ok); border-color: var(--ok); color: #fff; }
:root[data-theme="dark"] .step.is-current .step-no,
:root[data-theme="dark"] .step.is-done .step-no { color: #0C1420; }
.step:not(:last-child)::after { content: ''; flex: 1 1 1rem; height: 1px; min-width: 0.5rem; margin: 0 0.75rem; background: var(--line-2); }
@media (max-width: 700px) { .step-label { display: none; } .step:not(:last-child)::after { margin: 0 0.4rem; } }

.fieldset { border: 0; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--s-3); }
.form-row { display: grid; gap: var(--s-2); }
@media (min-width: 640px) { .form-row--2 { grid-template-columns: 1fr 1fr; } }

.summary { border: 1px solid var(--line); border-radius: var(--r-shell); background: var(--card); padding: var(--s-3); display: flex; flex-direction: column; gap: 0.3rem; }

/* Der Preisblock setzt sich mit einem eigenen Strich vom Was ab.

   Die Zeile darüber zog ihren eigenen aber auch: `.spec` hat unten eine
   Linie, und `.spec:last-child` nimmt sie nur der letzten Zeile — die
   Bestuhlung ist zwar die letzte Angabe, aber nicht das letzte Kind, denn
   danach kommen Preisblock und Endsumme. Also standen zwei Striche mit
   21 px Luft dazwischen, gemessen an der Unterkante von „Bestuhlung"
   (694 px) und der Oberkante des Blocks (715 px).

   Der Strich gehört dem Block; die Zeile davor gibt ihren ab. */
.summary-block { padding-top: 0.6rem; margin-top: 0.5rem; border-top: 1px solid var(--line); }
.summary .spec:has(+ .summary-block) { border-bottom: 0; }
.summary-total {
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--s-2);
  padding-top: 0.8rem; margin-top: 0.5rem; border-top: 1px solid var(--line-2);
  font-family: var(--font-sans); font-size: var(--t-1); font-weight: 700;
}
.confirm-mark { width: 60px; height: 60px; border-radius: 50%; background: var(--ok-bg); color: var(--ok); display: grid; place-items: center; margin-bottom: var(--s-2); }

/* --------------------------------------------------------------------------
   14. FUSSZEILE
   -------------------------------------------------------------------------- */

/* Die Fußzeile läuft im Wechsel der Abschnitte mit: Über ihr steht
   „Flächen anbieten" auf getöntem Grund, sie selbst steht hell. Ein
   schwarzes Band an dieser Stelle wäre der zweite dunkle Block innerhalb
   von zwei Bildschirmhöhen — das dunkle Band „Warum officeshare24" trägt
   den Kontrast bereits.

   Getrennt wird sie stattdessen durch eine Haarlinie; ohne die verschwämme
   sie mit dem Abschnitt darüber, sobald beide hell sind. */
.footer {
  background: var(--card-sunk); color: var(--ink-2);
  border-top: 1px solid var(--line);
  padding-block: var(--s-6) var(--s-4);
}
.footer a { color: var(--ink-2); }
.footer a:hover { color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }
.footer h3 { font-size: 0.72rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); font-weight: 600; margin-bottom: var(--s-2); font-family: var(--font-sans); }
/* currentColor trägt die Wortmarke — auf hellem Grund also in Tinte */
.footer .brand-name { color: var(--ink); }
.footer-grid { display: grid; gap: var(--s-4); }
@media (min-width: 760px) { .footer-grid { grid-template-columns: 1.7fr 1fr 1fr 1fr; } }
.footer-links { display: flex; flex-direction: column; gap: 0.55rem; }
.footer-links a { min-height: 32px; display: inline-flex; align-items: center; font-size: 0.93rem; }
.footer-bottom {
  margin-top: var(--s-5); padding-top: var(--s-3);
  border-top: 1px solid var(--line);
  display: flex; justify-content: space-between; gap: var(--s-2); flex-wrap: wrap;
  font-size: 0.82rem; color: var(--ink-3);
}

/* --------------------------------------------------------------------------
   15. BEWEGUNG
   -------------------------------------------------------------------------- */

.reveal {
  opacity: 0; transform: translateY(12px);
  transition: opacity var(--dur-reveal) var(--ease-out), transform var(--dur-reveal) var(--ease-out);
  transition-delay: calc(var(--i, 0) * 30ms);
}
.reveal.is-in { opacity: 1; transform: none; }
.fade { opacity: 0; transition: opacity var(--dur-reveal) var(--ease-out); transition-delay: calc(var(--i, 0) * 30ms); }
.fade.is-in { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important; animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important; scroll-behavior: auto !important;
  }
  .reveal, .fade { opacity: 1; transform: none; }
  .plan-draw path, .plan-draw line, .plan-draw rect, .plan-draw polyline { stroke-dashoffset: 0; }
  .plan-draw .fade-in { opacity: 1; }
  .btn:hover, .card:hover { transform: none; }
  .card:hover .photo img { transform: none; }
  .skeleton { animation: none; }
}

/* --------------------------------------------------------------------------
   16. HILFSKLASSEN
   -------------------------------------------------------------------------- */

.stack { display: flex; flex-direction: column; }
.stack-1 { gap: var(--s-1); } .stack-2 { gap: var(--s-2); }
.stack-3 { gap: var(--s-3); } .stack-4 { gap: var(--s-4); } .stack-5 { gap: var(--s-5); }

.row { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; }
.row-between { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); flex-wrap: wrap; }

.mt-1 { margin-top: var(--s-1); } .mt-2 { margin-top: var(--s-2); }
.mt-3 { margin-top: var(--s-3); } .mt-4 { margin-top: var(--s-4); } .mt-5 { margin-top: var(--s-5); }

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

.skip-link {
  position: absolute; left: var(--gutter); top: -100px; z-index: 200;
  background: var(--blue); color: #fff; padding: 0.7rem 1.1rem; border-radius: var(--r);
  transition: top var(--dur-hover) var(--ease-out);
}
.skip-link:focus { top: 0.75rem; }

[hidden] { display: none !important; }

/* --------------------------------------------------------------------------
   Anfrage-Feld auf der Objektseite  (assets/js/anfrage.js)

   Ein <dialog> und keine eigene Seite: Der Kunde soll auf der Objektseite
   bleiben und danach weitere Flächen anfragen können. <dialog> bringt
   Fokusfalle, Escape und Hintergrund von sich aus mit.
   -------------------------------------------------------------------------- */

.inq-dialog {
  width: min(640px, calc(100vw - 2rem));
  max-height: calc(100vh - 3rem);
  padding: 0;
  border: 1px solid var(--line);
  border-radius: var(--r-shell);
  background: var(--card);
  color: var(--ink);
  box-shadow: var(--sh-3);
  overflow: auto;
}
.inq-dialog::backdrop { background: rgba(17, 20, 24, 0.45); backdrop-filter: blur(2px); }
.inq-inner { padding: var(--s-4); }

/* Fläche und Stadt als Zusammenfassung, nicht als Feld: Sie kommen von
   der Seite und sind keine Angabe des Kunden. */
.inq-objekt {
  display: flex; flex-direction: column; gap: 0.15rem;
  padding: 0.8rem 0.9rem; margin-top: var(--s-2);
  background: var(--card-sunk); border-radius: var(--r);
}

/* Der Honigtopf. Nicht `display:none` und nicht `hidden`: Beides
   überspringen viele Skripte, die Formulare ausfüllen. So steht das Feld
   im Baum, ist berechenbar — und liegt außerhalb des Bildes. */
.inq-falle {
  position: absolute; left: -9999px; top: auto;
  width: 1px; height: 1px; overflow: hidden;
}

.inq-fertig { text-align: center; padding: var(--s-3) var(--s-2); }
.inq-fertig .confirm-mark { margin-inline: auto; }
.inq-fertig .row { justify-content: center; flex-wrap: wrap; }

@media (max-width: 559px) {
  .inq-dialog { width: 100vw; max-width: 100vw; max-height: 100vh; border-radius: 0; border: 0; }
  .inq-inner { padding: var(--s-3); }
}

/* --------------------------------------------------------------------------
   Rechtsseiten  (functions/impressum.js … , lib/rechtsseite.js)

   Ein Textblatt und sonst nichts. 720 px, weil eine Zeile ab etwa 90
   Zeichen schwer zu verfolgen ist und ein Rechtstext genau der ist, den
   niemand zweimal liest.
   -------------------------------------------------------------------------- */

.rechts { padding-block: var(--s-5) var(--s-7); }
.rechts-blatt { width: min(100% - (2 * var(--gutter)), 720px); margin-inline: auto; }

.rechts-stand { margin-top: var(--s-1); color: var(--ink-3); font-size: 0.85rem; }

/* Der Hinweis auf die maßgebliche Sprachfassung. Ruhig, nicht warnend:
   Es ist eine Auskunft, kein Fehler. */
.rechts-hinweis {
  margin-top: var(--s-3);
  padding: 0.8rem 1rem;
  background: var(--card-sunk);
  border-radius: var(--r);
  color: var(--ink-2);
  font-size: 0.9rem; line-height: 1.55;
}

/* „Inhalt in Vorbereitung" dagegen schon: Der Strich an der Seite ist
   der Unterschied zwischen einem Hinweis und einer Warnung. */
.rechts-entwurf {
  margin-top: var(--s-3);
  padding: 0.8rem 1rem;
  border-left: 3px solid var(--brand);
  background: color-mix(in srgb, var(--brand) 8%, transparent);
  border-radius: 0 var(--r) var(--r) 0;
  color: var(--ink); font-size: 0.9rem; line-height: 1.55;
}

/* Der Fließtext. Die Abstände hängen an den Überschriften und nicht an
   den Absätzen: Ein Abschnitt beginnt weit oben und schließt eng an
   seinen ersten Absatz an — so liest man die Gliederung, ohne sie zu
   suchen. */
.rechts-text { margin-top: var(--s-4); font-family: var(--font-sans); }

.rechts-text h2 {
  margin-top: var(--s-5); margin-bottom: var(--s-2);
  font-size: 1.25rem; line-height: 1.3; font-weight: 700;
}
.rechts-text h3 {
  margin-top: var(--s-4); margin-bottom: var(--s-1);
  font-size: 1.02rem; line-height: 1.35; font-weight: 650;
}
.rechts-text h4 {
  margin-top: var(--s-3); margin-bottom: var(--s-1);
  font-size: 0.95rem; font-weight: 650; color: var(--ink-2);
}
.rechts-text > :first-child { margin-top: 0; }

.rechts-text p,
.rechts-text li {
  font-size: 1rem; line-height: 1.7; color: var(--ink-2);
}
.rechts-text p { margin-block: var(--s-2); }

.rechts-text ul, .rechts-text ol { margin-block: var(--s-2); padding-left: 1.3rem; }
.rechts-text li { margin-block: 0.35rem; }
.rechts-text li::marker { color: var(--ink-3); }

.rechts-text strong { color: var(--ink); font-weight: 650; }

/* Die eckigen Klammern in den Entwürfen stehen kursiv da. Sie sind
   Anweisungen an die Verfasserin, nicht Text für Lesende — und sollen
   auch so aussehen, solange sie noch dastehen. */
.rechts-text em { color: var(--ink-3); }

.rechts-text a { color: var(--blue); text-decoration: underline; text-underline-offset: 2px; }
.rechts-text code {
  font-size: 0.9em; padding: 0.1em 0.35em;
  background: var(--card-sunk); border-radius: var(--r-sm);
}
.rechts-text hr { margin-block: var(--s-4); border: 0; border-top: 1px solid var(--line); }

/* Die Rechtsverweise in der Fußzeile — auch auf den übrigen Seiten */
.footer-recht { display: flex; gap: var(--s-3); flex-wrap: wrap; }
.footer-recht a { color: inherit; }

@media (max-width: 559px) {
  .rechts { padding-block: var(--s-4) var(--s-5); }
  .rechts-text h2 { font-size: 1.15rem; }
}

/* Rechtsverweise im Anfragefenster. Ein modales Fenster deckt den Fuß
   der Seite darunter ab — ohne diese Zeile wäre der Weg zum Impressum:
   schließen, scrollen, klicken. */
.inq-fuss {
  margin-top: var(--s-3); padding-top: var(--s-2);
  border-top: 1px solid var(--line);
  font-size: 0.8rem; color: var(--ink-3); text-align: center;
}
.inq-fuss a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.inq-fuss a:hover { color: var(--ink); }
.inq-fertig .inq-fuss { text-align: center; }
