/* ══════════════════════════════════════════════════════════════════════════
   Fischhandel Römer — Gestaltung
   Reihenfolge: Grundlage · Bausteine · Kopfzeile · Hero · Abschnitte ·
                Formulare · Shop · Fußzeile · Bewegung
   ══════════════════════════════════════════════════════════════════════════ */

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Sprungmarken dürfen nicht unter der klebenden Kopfzeile landen. */
  scroll-padding-top: 6.5rem;
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

body {
  margin: 0;
  background: var(--papier);
  color: var(--text);
  font-family: var(--schrift);
  font-size: var(--t-m);
  font-weight: 400;
  line-height: 1.65;
  font-feature-settings: 'cv05' 1, 'cv11' 1;   /* offenes ß, einstöckiges g */
  overflow-x: hidden;
}

img, svg, picture { display: block; max-width: 100%; }
img { height: auto; }

/* Alle Überschriften tragen die Display-Serif des Kunden. font-weight bleibt
   400: die Schrift ist von sich aus fett, und synthetisches Fetten würde ihre
   feinen Haarstriche zumatschen. */
h1, h2, h3, h4 {
  margin: 0 0 var(--r-4);
  font-family: var(--schrift-display);
  font-weight: 400;
  line-height: 1.06;
  letter-spacing: -.005em;
  text-wrap: balance;
}
h1 { font-size: var(--t-4xl); }
h2 { font-size: var(--t-3xl); }
h3 { font-size: var(--t-xl); }
h4 { font-size: var(--t-l); }

p { margin: 0 0 var(--r-4); }
p:last-child { margin-bottom: 0; }
strong { font-weight: 700; }

a { color: inherit; text-decoration-color: var(--rand-stark); text-underline-offset: .18em; }
a:hover { text-decoration-color: currentColor; }

/* Ein Fokusring, der auf Creme UND auf Navy sichtbar bleibt: Koralle mit
   hellem Sockel darunter. */
:focus-visible {
  outline: 3px solid var(--fokus);
  outline-offset: 2px;
  border-radius: var(--rund-xs);
}

ul, ol { margin: 0 0 var(--r-4); padding-left: 1.25rem; }
li { margin-bottom: .35rem; }

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

/* Sprung zum Inhalt — erste Tabulatorstation der Seite. */
.zum-inhalt {
  position: absolute; left: 50%; top: 0; transform: translate(-50%, -120%);
  z-index: 200; padding: .7rem 1.2rem;
  background: var(--navy); color: var(--text-auf-navy);
  border-radius: 0 0 var(--rund-m) var(--rund-m); font-weight: 600;
  text-decoration: none; transition: transform var(--tempo) var(--kurve);
}
.zum-inhalt:focus { transform: translate(-50%, 0); }

/* ── Bausteine ─────────────────────────────────────────────────────────── */

.huelle { width: 100%; max-width: var(--spalte); margin: 0 auto; padding: 0 var(--r-5); }
.huelle-eng { max-width: var(--spalte-eng); }

.abschnitt { position: relative; padding: var(--r-9) 0; }
.abschnitt-schmal { position: relative; padding: var(--r-8) 0; }

/* Der gerissene Streifen des NÄCHSTEN Abschnitts hängt nach oben in diesen
   hier hinein (position:absolute, top: -riss-h). Er fraß damit die eigene
   Grundluft auf: von den 4 rem eines schmalen Abschnitts blieben bei 1280 px
   gemessene 11 px übrig — auf familie.html schnitt der Streifen in die
   Unterzeile. Deshalb legt ein Abschnitt, dem ein Riss folgt, die Höhe des
   Streifens unten drauf; die Luft nach dem Inhalt bleibt dann die gleiche
   wie überall.
   Die Hero ist ausgenommen: dort SOLL der Streifen ins Foto reißen, das ist
   die Kante aus dem Kundenentwurf. */
.abschnitt:has(+ * > .riss)        { padding-bottom: calc(var(--r-9) + var(--riss-h)); }
.abschnitt-schmal:has(+ * > .riss) { padding-bottom: calc(var(--r-8) + var(--riss-h)); }

.auf-navy  { background: var(--navy);  color: var(--text-auf-navy); }
.auf-dunst { background: var(--dunst); }
.auf-papier{ background: var(--creme-tief); }
.auf-navy h2, .auf-navy h3 { color: var(--text-auf-navy); }
.auf-navy a { text-decoration-color: var(--rand-auf-navy); }

/* Augenbraue über der Überschrift — im Bestand durchgehend gesperrt
   geschrieben („STANDORTE", „FÜR JEDEN WAS DABEI"). */
.marke {
  display: inline-flex; align-items: center; gap: .55rem;
  margin: 0 0 var(--r-3);
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .18em;
  text-transform: uppercase; color: var(--text-leise);
}
.marke::before {
  content: ''; width: 1.75rem; height: 2px; background: var(--koralle);
  flex: none;
}
.auf-navy .marke { color: var(--text-auf-navy-leise); }

.kopfblock { max-width: 44rem; margin-bottom: var(--r-7); }
.kopfblock.mitte { margin-left: auto; margin-right: auto; text-align: center; }
.kopfblock.mitte .marke::before { display: none; }
.kopfblock p { color: var(--text-ruhig); font-size: var(--t-l); }
.auf-navy .kopfblock p { color: var(--text-auf-navy-ruhig); }

.knopf {
  display: inline-flex; align-items: center; justify-content: center; gap: .6rem;
  min-height: 3rem; padding: .85rem 1.6rem;
  border: 2px solid transparent; border-radius: var(--rund-pille);
  font: inherit; font-size: var(--t-s); font-weight: 700; letter-spacing: .01em;
  text-decoration: none; cursor: pointer;
  transition: transform var(--tempo) var(--kurve),
              background-color var(--tempo) var(--kurve),
              border-color var(--tempo) var(--kurve),
              box-shadow var(--tempo) var(--kurve);
}
.knopf:hover { transform: translateY(-2px); }
.knopf:active { transform: translateY(0); }

.knopf-1 { background: var(--navy); color: var(--creme); box-shadow: var(--schatten-m); }
.knopf-1:hover { background: var(--navy-tief); box-shadow: var(--schatten-l); }

.knopf-2 { background: transparent; color: var(--navy); border-color: var(--rand-stark); }
.knopf-2:hover { border-color: var(--navy); background: var(--schleier); }

/* Dunkelblau auf Koralle statt Weiß: Weiß erreicht nur 3,11:1, Navy-tief
   5,43:1. Der Zeigefinger-Zustand hellt deshalb auf, statt abzudunkeln. */
.knopf-3 { background: var(--koralle); color: var(--navy-tief); box-shadow: var(--schatten-m); }
.knopf-3:hover { background: var(--koralle-hell); }

.auf-navy .knopf-1 { background: var(--creme); color: var(--navy); }
.auf-navy .knopf-1:hover { background: #fff; }
.auf-navy .knopf-2 { color: var(--text-auf-navy); border-color: var(--rand-auf-navy); }
.auf-navy .knopf-2:hover { border-color: var(--creme); background: rgba(250,246,237,.08); }

.knopf-reihe { display: flex; flex-wrap: wrap; gap: var(--r-3); align-items: center; }

.karte {
  background: var(--creme);
  border: 1px solid var(--rand-fein);
  border-radius: var(--rund-l);
  padding: var(--r-5);
  box-shadow: var(--schatten-karte);
}
.auf-navy .karte,
.auf-navy .karte-glas {
  background: var(--navy-hoch); border-color: var(--rand-auf-navy);
  color: var(--text-auf-navy);
}

/* Marker für Angaben, die die Bestandsseite nicht hergibt. */

/* ── Gerissene Kanten ──────────────────────────────────────────────────────
   Das Leitmotiv des Entwurfs. Jede Sektion trägt an ihrer Oberkante einen
   Riss-Streifen IN IHRER EIGENEN Flächenfarbe, negativ nach oben versetzt.
   Dadurch überlappt er die vorhergehende Sektion und wirkt wie abgerissenes
   Papier. Die Grafik ist unten lückenlos deckend zugeschnitten — sonst würde
   an der Sektionsgrenze die Farbe der Vorgängersektion durchscheinen.
   ─────────────────────────────────────────────────────────────────────── */

.riss {
  position: absolute;
  left: 0; right: 0;
  height: var(--riss-h);
  top: calc(-1 * var(--riss-h) + 1px);   /* 1px Überlappung gegen Rundungslücken */
  background-repeat: no-repeat;
  background-position: center bottom;
  background-size: 100% 100%;
  pointer-events: none;
  z-index: 2;
}
.riss-papier { background-image: url('../images/riss-papier.png'); }
.riss-navy   { background-image: url('../images/riss-navy.png'); }
/* Das weiße Papierband des Kunden („Navigation-Papierstreifen") hat BEIDE
   Kanten gerissen und die deckende Fläche mittig. Es gehört deshalb nicht an
   den Rand einer Sektion, sondern MITTIG AUF die Grenze zwischen navyfarbener
   Kopfzeile und Hero-Foto — halb auf der einen, halb auf der anderen Fläche.
   Genau dafür ist es gezeichnet, und daher kommt sein Name. */
.kopf-riss {
  position: absolute; left: 0; right: 0; bottom: 0;
  height: var(--kopf-riss-h);
  transform: translateY(50%);
  /* -voll statt des Originals: Die gelieferte Grafik ist ein frei schwebendes
     Band, das an BEIDEN Enden spitz auslaeuft — links 5, rechts 4 Spalten
     sind sogar ganz durchsichtig. Auf Fensterbreite gestreckt wurde daraus
     je Ecke ein Keil von rund 10px, in dem Navy und Hero ohne Papier
     aneinanderstossen (Auftraggeber, 02.10.2026: „an den Ecken keine Luft").
     Die abgeleitete Fassung ist auf den Bereich beschnitten, in dem das Band
     die Naht deckend ueberspannt (x 11..2093 des Originals);
     damit stimmt 100% 100%
     wieder: das Band reicht bis in beide Ecken.
     Das Original liegt unveraendert daneben. */
  background: url('../images/riss-nav-weiss-randlos.png') center bottom / 100% 100% no-repeat;
  pointer-events: none;
  z-index: 25;
}

/* ── Kopfzeile ───────────────────────────────────────────────────────
   Aufbau nach dem Entwurf: zwei Labelgruppen, das Wappen in der Mitte, der
   Korallenknopf rechts.

   Das Wappen liegt ABSOLUT in der Mitte und steht damit ausserhalb des
   Flussens. Zwei Gruende: es haengt nach unten in die Hero hinein, ohne die
   Kopfzeile hoeher zu machen, und die Navigation bleibt ein sauberer Zweier-
   Block, den man auf schmalen Fenstern in eine Spalte umklappen kann. Vorher
   sass es zwischen den Gruppen im Fluss; das geoeffnete Menue musste die
   Gruppen deshalb absolut positionieren, und die zweite bekam einen GERATENEN
   Versatz nach unten. Der passte nicht zur echten Hoehe, und die zweite
   Gruppe lag ueber der ersten.
   ────────────────────────────────────────────────────────────────────── */

.kopf {
  position: relative;
  z-index: 20;
  background: var(--navy);
  color: var(--text-auf-navy);
}

.kopf-innen {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--r-5);
  min-height: 6.25rem;
  padding-top: var(--kopf-oben);
  /* Das Papierband ragt mit halber Hoehe in die Kopfzeile. Ohne diesen
     Fussabstand beruehrte seine Risskante den Unterstrich der aktiven Seite. */
  padding-bottom: calc(var(--kopf-riss-h) * .55 + .6rem);
}

.wappen {
  position: absolute;
  left: 50%;
  top: var(--kopf-oben);
  translate: -50% 0;
  /* Ueber dem Papierband (z-index 25): das Wappen liegt VOR dem Riss, sonst
     schneidet ihm die weisse Flaeche durchs Bild. */
  z-index: 30;
  display: block;
  margin: 0;
  transition: transform var(--tempo) var(--kurve);
}
.wappen img {
  height: var(--wappen-h);
  width: auto;
  filter: drop-shadow(0 8px 18px rgba(7, 29, 56, .28));
}
.wappen:hover { transform: translateY(-2px); }

.kopf-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  /* Gleiche Abstaende links und rechts vom Wappen — das war die Vorgabe.
     Rechnerisch geht das nur, wenn beide Gruppen gleich breit sind: sitzt das
     Wappen in der Fenstermitte und sollen seine Nachbarn gleich weit weg
     stehen, muss die Beschriftung links so breit sein wie rechts. Deshalb
     traegt jede Gruppe jetzt ZWEI Labels; der Kontaktknopf ist kein
     Gruppenmitglied mehr, sondern liegt absolut an der rechten Kante.
     Die Gruppen sind gleich breit (flex: 1 1 0) und nach INNEN ausgerichtet,
     wodurch beide gleich weit an das Wappen heranreichen. */
  position: relative;
  width: 100%;
  /* Die Luecke in der Mitte haelt den Platz des absolut liegenden Wappens frei
     UND bestimmt, wie weit die Beschriftung auseinandersteht: weil die Gruppen
     nach innen ausgerichtet sind, ist die Luft neben dem Wappen genau dieser
     Zuschlag — und links wie rechts gleich gross. Im Entwurf sind es rund
     110 px bei 1440 px Fensterbreite. */
  gap: calc(var(--wappen-b) + 2 * clamp(var(--r-5), 7.6vw, 7rem));
}
.kopf-nav-gruppe {
  display: flex;
  align-items: center;
  /* Moderate Abstaende INNERHALB einer Gruppe. Die Spannweite der Navigation
     entsteht aus der Luecke um das Wappen, nicht aus grossen Label-Abstaenden:
     mit 4rem brauchte die rechte Gruppe mehr Platz als ihre halbe Spannweite
     und lief in die Mitte — ab 1440 px ueberlappte sie das Wappen um 14 px. */
  gap: clamp(var(--r-4), 2.8vw, 2.5rem);
  flex: 1 1 0;
}
.kopf-nav-gruppe:first-of-type { justify-content: flex-end; }
.kopf-nav-gruppe:last-of-type  { justify-content: flex-start; }

/* Der Kontaktknopf haengt an der rechten Kante der Huelle und nimmt damit
   keinen Platz in der Balance der beiden Labelgruppen ein. */
.kopf-kontakt {
  position: absolute;
  right: 0;
  top: 50%;
  translate: 0 -50%;
}

.kopf-nav-gruppe > a:not(.knopf) {
  font-family: var(--schrift-display);
  /* Groesser als zuvor (war max 1,125rem = 18 px): im Entwunf sind die
     Labels rund ein Viertel groesser. */
  font-size: clamp(1rem, 1.55vw, 1.4rem);
  letter-spacing: .005em;
  color: var(--text-auf-navy);              /* 13,34:1 auf Navy */
  text-decoration: none;
  white-space: nowrap;
  /* .55rem statt .35rem: zwischen 901 und 1206 px Fensterbreite waren die
     Labels nur 39,6 bis 44,0 px hoch. iPad Air (1180 px) und iPad Pro 11
     (1194 px) im Querformat liegen genau in diesem Bereich, dort wird mit
     dem Finger getippt, und ein Menueschalter greift erst unter 901 px.
     Mit 17,6 px Polster sind es durchgehend ueber 44 px. */
  padding: .55rem 0;
  border-bottom: 2px solid transparent;
  transition: border-color var(--tempo) var(--kurve), opacity var(--tempo) var(--kurve);
}
.kopf-nav-gruppe > a:not(.knopf):hover { border-bottom-color: var(--koralle); }
.kopf-nav-gruppe > a[aria-current='page'] { border-bottom-color: var(--koralle); }

.nav-schalter {
  display: none;
  align-items: center; gap: .5rem;
  min-height: 2.75rem; padding: .55rem .9rem;
  background: transparent; border: 2px solid var(--rand-auf-navy);
  border-radius: var(--rund-pille);
  font: inherit; font-size: var(--t-s); font-weight: 700;
  color: var(--text-auf-navy);              /* Rand 3,04:1 auf Navy */
  cursor: pointer;
}
.nav-schalter-strich {
  position: relative; display: block; width: 1.1rem; height: 2px;
  background: currentColor; border-radius: 2px;
}
.nav-schalter-strich::before,
.nav-schalter-strich::after {
  content: ''; position: absolute; left: 0; width: 100%; height: 2px;
  background: currentColor; border-radius: 2px;
  transition: transform var(--tempo) var(--kurve);
}
.nav-schalter-strich::before { top: -.35rem; }
.nav-schalter-strich::after  { top:  .35rem; }
.nav-schalter[aria-expanded='true'] .nav-schalter-strich { background: transparent; }
.nav-schalter[aria-expanded='true'] .nav-schalter-strich::before { transform: translateY(.35rem) rotate(45deg); }
.nav-schalter[aria-expanded='true'] .nav-schalter-strich::after  { transform: translateY(-.35rem) rotate(-45deg); }

/* ── Kopfzeile auf schmalen Fenstern ─────────────────────────────────
   Das Wappen rueckt nach links, rechts steht der Menueschalter. Geoeffnet
   nimmt die Navigation eine EIGENE ZEILE im normalen Fluss (flex-wrap), statt
   absolut positioniert zu werden: die Kopfzeile waechst einfach mit. Damit
   entfaellt jeder geratene Versatz. Die Reihenfolge in der Zeile steuert
   order, weil das Wappen im Markup vor der Navigation steht. */
@media (max-width: 900px) {
  .kopf-innen { justify-content: space-between; flex-wrap: wrap; }

  .wappen {
    position: static;
    translate: none;
    order: 1;
    margin-bottom: -1.25rem;
  }
  .wappen img { height: 4.75rem; }

  .nav-schalter { display: inline-flex; order: 2; }
  .kopf-nav { display: none; order: 3; }

  .kopf-nav { max-width: none; margin-inline: 0; }
  .kopf.offen .kopf-kontakt,
  .kein-js .kopf-kontakt { position: static; translate: none; }

  .kopf.offen .kopf-nav,
  .kein-js .kopf-nav {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    flex: 1 1 100%;
    width: auto;
    gap: 0;
    margin-top: var(--r-4);
  }
  /* Ohne den Ueberhang wuerde die neue Zeile das Wappen ueberlappen. */
  .kopf.offen .wappen,
  .kein-js .wappen { margin-bottom: 0; }

  .kopf.offen .kopf-nav-gruppe,
  .kein-js .kopf-nav-gruppe {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    flex: none;
    gap: 0;
  }
  .kopf.offen .kopf-nav a:not(.knopf),
  .kein-js .kopf-nav a:not(.knopf) {
    padding: .9rem .25rem;
    font-size: var(--t-l);
    border-bottom: 1px solid var(--rand-auf-navy);
  }
  /* Die aktuelle Seite muss auch im offenen Menue erkennbar bleiben. Die
     Kurzschreibweise border-bottom in der Regel darueber (Spezifitaet 0,4,1)
     setzt die Farbe und schlug die aria-current-Regel (0,2,1) — dadurch war
     die aktive Seite unter 901 px von den uebrigen nicht zu unterscheiden. */
  .kopf.offen .kopf-nav a[aria-current='page'],
  .kein-js .kopf-nav a[aria-current='page'] {
    border-bottom-color: var(--koralle);
    border-bottom-width: 2px;
  }

  .kopf.offen .kopf-nav .knopf,
  .kein-js .kopf-nav .knopf {
    margin-top: var(--r-4);
    justify-content: center;
  }

  /* Ohne JavaScript kann der Schalter nichts aufklappen — dann waere die
     Navigation auf dem Telefon unerreichbar. Also liegt sie dort offen. */
  .kein-js .nav-schalter { display: none; }
}

/* ── Hero ──────────────────────────────────────────────────────────────────
   Vollbreites Foto, navy abgedunkelt, gerissene Kante oben und unten. Die
   Abdunkelung ist kein Geschmacksmittel: erst mit ihr erreicht creme Schrift
   auf dem Foto 4,5:1 (gemessen, siehe tokens.css).
   ─────────────────────────────────────────────────────────────────────── */

.hero {
  position: relative;
  isolation: isolate;
  /* Die Höhe hängt an der BREITE, nicht an rem-Werten: der Entwurf ist für
     1920 px gezeichnet und die Hero dort 940 px hoch, also 49 % der Breite.
     Mit rem-Deckeln fiel das Verhältnis auf breiten Schirmen auf 0,37 — die
     Hero wurde flach und sah nicht mehr wie der Entwurf aus. Der obere Deckel
     verhindert, dass sie auf sehr breiten Schirmen den ganzen Bildschirm
     füllt. */
  min-height: clamp(26rem, 49vw, 60rem);
  display: grid;
  place-items: center;
  padding: clamp(var(--r-8), 7vw, 7rem) 0;
  background: var(--navy);
  color: var(--text-auf-navy);
  text-align: center;
  overflow: hidden;
}
.hero-bild {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%;
  object-fit: cover;
}
/* Abdunkelung in zwei Stufen, und zwar bewusst SCHWACH:
   Eine Decke über dem ganzen Foto (vorher zusammen rund 80 %) ließ das Motiv
   verschwinden — der Entwurf zeigt Garnelen und Kräuter deutlich. Also nur
   eine leichte Grundabdunkelung mit Randabschattung; die Lesbarkeit stellt
   der zweite Schleier her, der NUR hinter dem Textblock liegt (siehe
   .hero .huelle). So bleibt das Foto hell und die Schrift trotzdem sicher.
   Nötig ist das, weil im Textbereich ein fast weißer Bildpunkt liegt
   (die Limette, L = 0,999): dagegen braucht weiße Schrift 65 % Abdunkelung. */
.hero-schleier {
  position: absolute; inset: 0; z-index: -1;
  /* Warum ein BAND und keine Decke:
     Das Foto trägt in jedem waagerechten Streifen nahezu weiße Spitzlichter
     (Limette, Salzschale, Steinreflexe) — ein anderer Bildausschnitt hilft
     also nicht. Eine gleichmäßige Decke über allem lässt das Motiv aber
     verschwinden und wirkt wie ein Filter. Deshalb bleibt das Foto oben unter
     der Risskante und unten hell, und nur der Streifen mit der Schrift wird
     kräftig abgedunkelt. Dazu eine schwache Randabschattung für den
     Zusammenhalt. Werte gegen die tatsächlich gerenderten Bildpunkte gemessen
     (siehe README, Abschnitt „Geprüft"). */
  background:
    linear-gradient(180deg,
      rgba(7, 29, 56, 0)    0%,
      rgba(7, 29, 56, .34)  7%,
      rgba(7, 29, 56, .9)  17%,
      rgba(7, 29, 56, .9)  76%,
      rgba(7, 29, 56, .48) 90%,
      rgba(7, 29, 56, .1)  100%),
    radial-gradient(125% 105% at 50% 40%,
      rgba(7, 29, 56, .04) 0%,
      rgba(7, 29, 56, .3) 100%);
}

/* Die Überschrift soll wie im Entwurf über die Sektionsbreite laufen; ihre
   Größe hängt deshalb an der Hüllenbreite, nicht an der Fensterbreite. */
.hero .huelle {
  position: relative;
  container-type: inline-size;
}

.hero h1 {
  margin: 0 auto var(--r-5);
  max-width: none;
  /* clamp als Rückfall für Browser ohne Container-Einheiten. */
  font-size: var(--d-hero);
  /* 15,3 Prozent der Huellenbreite: damit ist die erste Zeile rund 95 Prozent
     der Huelle breit und bei 1920 px etwa 60 Prozent des Fensters, so gross
     wie im Entwurf. An vw gekoppelt waere sie dort nur 52 Prozent, weil die
     Huelle bei 1200 px feststeht, die Schrift aber weiterwachsen wuerde. */
  font-size: min(15.3cqw, 11.5rem);
  line-height: .98;
  letter-spacing: -.018em;
  color: #fff;                    /* reines Weiß, nicht das cremefarbene --creme */
  text-shadow: 0 2px 28px rgba(7, 29, 56, .8), 0 1px 3px rgba(7, 29, 56, .5);
}
.hero-zeile-hell { display: block; color: var(--hero-blau); }

.hero-unter {
  /* Der Satz soll so breit laufen wie der Titel darueber. Die Deckelung auf
     40 rem hielt ihn bei 50 Prozent der Huelle, waehrend der Titel 95 Prozent
     einnimmt — das sah unfertig aus. Jetzt haengt die Groesse an der
     Huellenbreite (2,9 Prozent): der Satz ist rund 31,7 mal so breit wie
     seine Schriftgroesse, also fuellt er damit gut neun Zehntel der Huelle.
     Die Untergrenze verhindert, dass er auf dem Telefon winzig wird — dort
     bricht er stattdessen auf zwei Zeilen um. */
  max-width: none;
  margin: 0 auto var(--r-6);
  font-size: max(1.0625rem, 2.9cqw);
  line-height: 1.45;
  color: #fff;
  text-shadow: 0 1px 16px rgba(7, 29, 56, .85);
}

/* ── Zweispalter: Bild und Text ────────────────────────────────────────── */

.zweispalt {
  display: grid; gap: var(--r-7);
  grid-template-columns: repeat(auto-fit, minmax(min(19rem, 100%), 1fr));
  align-items: center;
}
.zweispalt-text { max-width: 34rem; }
.zweispalt-text p { color: var(--text-ruhig); }
.auf-navy .zweispalt-text p { color: var(--text-auf-navy-ruhig); }
.zweispalt.gedreht .zweispalt-bild { order: 2; }
@media (max-width: 800px) {
  .zweispalt.gedreht .zweispalt-bild { order: 0; }
}

/* Ein Rahmen, nicht zwei: das Bild trägt die Rundung selbst, der Rand sitzt
   als inset-Schatten darauf. Zwei geschachtelte Rundungen erzeugen sonst den
   doppelten Rahmen, der auf einer früheren Seite auffiel. */
.bild {
  position: relative;
  border-radius: var(--rund-xl);
  overflow: hidden;
  box-shadow: var(--schatten-m), inset 0 0 0 1px var(--rand);
}
.bild img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }
.bild-schild {
  position: absolute; left: var(--r-4); bottom: var(--r-4);
  padding: .5rem .9rem; border-radius: var(--rund-pille);
  background: rgba(10, 42, 80, .88); color: var(--creme);
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase;
}

/* ── Faktenband ────────────────────────────────────────────────────────── */

.fakten {
  display: grid; gap: var(--r-5);
  grid-template-columns: repeat(auto-fit, minmax(min(11rem, 100%), 1fr));
}
.fakt-zahl {
  display: block; font-size: var(--t-3xl); font-weight: 800;
  letter-spacing: -.03em; line-height: 1;
}
.fakt-wort { display: block; margin-top: .4rem; font-size: var(--t-s); color: var(--text-ruhig); }
.auf-navy .fakt-wort { color: var(--text-auf-navy-ruhig); }

/* ── Sortiment mit Reitern ─────────────────────────────────────────────── */

.reiter-leiste {
  display: flex; flex-wrap: wrap; gap: .5rem;
  margin-bottom: var(--r-6);
  padding: 0; list-style: none;
}
.reiter {
  /* Auch als Sprungmarke (<a> im Shop) verwendet — deshalb inline-flex und
     ohne Unterstreichung, sonst greift min-height nicht. */
  display: inline-flex; align-items: center; justify-content: center;
  text-decoration: none;
  min-height: 2.75rem; padding: .6rem 1.15rem;
  background: transparent; color: var(--text-ruhig);
  border: 2px solid var(--rand-stark); border-radius: var(--rund-pille);
  font: inherit; font-size: var(--t-s); font-weight: 700; cursor: pointer;
  transition: all var(--tempo) var(--kurve);
}
.reiter:hover { color: var(--navy); border-color: var(--navy); }
/* ACHTUNG: Hier stand bis 2026-09-08 die Reiterfassung des Sortiments samt
   einer Regel „.tafel-titel { display: none }". Der Name kollidiert mit dem
   .tafel-titel der neuen Warentafeln — sichtbar blieben die Titel nur, weil
   die neue Regel später im Stylesheet steht. Beides ist entfernt. */

.preis-hinweis {
  display: flex; gap: var(--r-3); align-items: flex-start;
  margin-top: var(--r-6); padding: var(--r-4) var(--r-5);
  background: var(--dunst); border-radius: var(--rund-m);
  font-size: var(--t-s); color: var(--text-ruhig);
}
.preis-hinweis svg { width: 1.25rem; height: 1.25rem; flex: none; color: var(--navy); margin-top: .15rem; }

/* ── Schritte ──────────────────────────────────────────────────────────── */

.schritte {
  display: grid; gap: var(--r-5);
  grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
  counter-reset: schritt;
  list-style: none; padding: 0; margin: 0;
}
.schritt {
  position: relative; padding: var(--r-5);
  background: var(--creme); border: 1px solid var(--rand);
  border-radius: var(--rund-l); margin: 0;
}
.auf-navy .schritt { background: var(--navy-hoch); border-color: var(--rand-auf-navy); }
.schritt::before {
  counter-increment: schritt; content: counter(schritt, decimal-leading-zero);
  display: block; margin-bottom: var(--r-3);
  font-size: var(--t-xl); font-weight: 800; color: var(--koralle);
  letter-spacing: -.02em;
}
.schritt h3 { font-size: var(--t-l); margin-bottom: .5rem; }
.schritt p { font-size: var(--t-s); color: var(--text-ruhig); margin: 0; }
.auf-navy .schritt p { color: var(--text-auf-navy-ruhig); }

/* ── Galerie ───────────────────────────────────────────────────────────── */

.galerie {
  display: grid; gap: var(--r-4);
  grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
}
.galerie .bild img { aspect-ratio: 1 / 1; }

/* ── Abschluss-Ruf ─────────────────────────────────────────────────────── */

.ruf { text-align: center; }
.ruf h2 { max-width: 30em; margin-inline: auto; }
.ruf .knopf-reihe { justify-content: center; }

/* ── Formulare ─────────────────────────────────────────────────────────── */

.feld { display: flex; flex-direction: column; gap: .4rem; margin-bottom: var(--r-4); }
.feld > label, .feld-titel {
  font-size: var(--t-s); font-weight: 700; color: var(--navy);
}
.feld-notiz { font-size: var(--t-xs); color: var(--text-leise); }
.pflicht { color: var(--koralle-schrift); }

input[type='text'], input[type='email'], input[type='tel'], input[type='date'],
input[type='number'], select, textarea {
  width: 100%; min-height: 3rem; padding: .7rem .9rem;
  background: #fff; color: var(--text);
  border: 2px solid var(--rand-stark);      /* 3,1:1 — WCAG 1.4.11 */
  border-radius: var(--rund-m);
  font: inherit; font-size: var(--t-s);
  transition: border-color var(--tempo) var(--kurve), box-shadow var(--tempo) var(--kurve);
}
textarea { min-height: 7rem; resize: vertical; line-height: 1.55; }
input:hover, select:hover, textarea:hover { border-color: var(--navy); }
input:focus, select:focus, textarea:focus {
  border-color: var(--navy);
  box-shadow: 0 0 0 3px rgba(10, 42, 80, .14);
  outline: 3px solid var(--fokus); outline-offset: 1px;
}
select {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%230a2a50' stroke-width='2'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right .8rem center;
  background-size: 1rem; padding-right: 2.4rem;
}
input:disabled, select:disabled {
  background: var(--creme-tief); color: var(--text-leise); cursor: not-allowed;
  border-color: var(--rand);
}
.feld-fehler input, .feld-fehler select, .feld-fehler textarea { border-color: var(--koralle-schrift); }
.fehler-text { font-size: var(--t-xs); font-weight: 600; color: var(--koralle-schrift); }

.kontroll { display: flex; gap: .7rem; align-items: flex-start; margin-bottom: var(--r-4); }
.kontroll input[type='checkbox'] {
  flex: none; width: 1.35rem; height: 1.35rem; margin: .15rem 0 0;
  accent-color: var(--navy);
}
.kontroll label { font-size: var(--t-s); color: var(--text-ruhig); }

.feld-paar {
  display: grid; gap: var(--r-4);
  grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
}

.meldung {
  display: none; gap: var(--r-3); align-items: flex-start;
  margin-bottom: var(--r-4); padding: var(--r-4);
  border-radius: var(--rund-m); font-size: var(--t-s);
}
.meldung.sichtbar { display: flex; }
.meldung-gut  { background: rgba(29, 54, 134, .10); border: 1px solid rgba(29,54,134,.3); }
.meldung-warn { background: rgba(252, 90, 90, .12); border: 1px solid rgba(252,90,90,.45); }

/* ── Vorbestell-Shop ───────────────────────────────────────────────────── */

.shop-lage { display: grid; gap: var(--r-7); align-items: start; }
@media (min-width: 1040px) {
  .shop-lage { grid-template-columns: minmax(0, 1fr) 23rem; }
  .shop-panel { position: sticky; top: 6.5rem; }
}

.warengruppe { margin-bottom: var(--r-7); }
.warengruppe h3 {
  display: flex; align-items: baseline; gap: .6rem;
  padding-bottom: var(--r-2); margin-bottom: var(--r-4);
  border-bottom: 2px solid var(--rand);
}
.warengruppe-mass { font-family: var(--schrift); font-size: var(--t-xs); font-weight: 600; color: var(--text-leise); letter-spacing: 0; text-transform: none; }

.produkt-liste { display: grid; gap: .5rem; }
.produkt {
  display: grid; gap: var(--r-3);
  grid-template-columns: minmax(0, 1fr) 7.5rem 9.5rem;
  align-items: center;
  padding: .6rem .85rem;
  background: var(--creme);
  border: 1px solid var(--rand);
  border-radius: var(--rund-m);
  transition: border-color var(--tempo) var(--kurve), background-color var(--tempo) var(--kurve);
}
.produkt.gewaehlt { border-color: var(--navy); background: #fff; }
.produkt-name { font-size: var(--t-s); font-weight: 600; }
.produkt-mass select { min-height: 2.5rem; padding: .35rem 1.9rem .35rem .6rem; font-size: var(--t-xs); }

.zaehler {
  display: inline-flex; align-items: center; justify-self: end;
  border: 2px solid var(--rand-stark); border-radius: var(--rund-pille);
  background: #fff; overflow: hidden;
}
.zaehler button {
  width: 2.5rem; height: 2.5rem; flex: none;
  background: transparent; border: 0; cursor: pointer;
  font: inherit; font-size: 1.15rem; font-weight: 700; color: var(--navy);
  line-height: 1;
}
.zaehler button:hover:not(:disabled) { background: var(--dunst); }
.zaehler button:disabled { color: var(--text-leise); cursor: not-allowed; }
.zaehler input {
  width: 3.2rem; min-height: 2.5rem; padding: 0; text-align: center;
  border: 0; border-radius: 0; background: transparent;
  font-size: var(--t-s); font-weight: 700;
  -moz-appearance: textfield;
}
.zaehler input::-webkit-outer-spin-button,
.zaehler input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.zaehler input:focus { box-shadow: none; outline-offset: -3px; }

@media (max-width: 620px) {
  .produkt { grid-template-columns: minmax(0, 1fr) auto; }
  .produkt-mass { grid-column: 1; }
  .zaehler { grid-row: 1 / span 2; grid-column: 2; }
}

.korb { padding: 0; overflow: hidden; }
.korb-kopf {
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--r-3);
  padding: var(--r-4) var(--r-5);
  background: var(--navy); color: var(--text-auf-navy);
}
.korb-kopf h3 { margin: 0; font-size: var(--t-l); color: var(--text-auf-navy); }
.korb-anzahl { font-size: var(--t-s); font-weight: 700; color: var(--koralle); }
.korb-koerper { padding: var(--r-5); }
.korb-liste { list-style: none; margin: 0 0 var(--r-4); padding: 0; max-height: 17rem; overflow-y: auto; }
.korb-liste > li {
  /* wrap, damit die Zusatzliste eine eigene Zeile bekommt statt sich neben
     den Posten zu drängen. */
  display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap;
  padding: .45rem 0; border-bottom: 1px solid var(--rand);
  font-size: var(--t-s); margin: 0;
}
.korb-liste .korb-zusatz li {
  display: flex; align-items: baseline; gap: .5rem;
  padding: 0; border: 0; margin: 0;
}
.korb-liste li:last-child { border-bottom: 0; }
.korb-menge { font-weight: 700; flex: none; }
.korb-weg {
  margin-left: auto; flex: none;
  width: 1.75rem; height: 1.75rem; padding: 0;
  background: transparent; border: 1px solid var(--rand); border-radius: 50%;
  color: var(--text-ruhig); font: inherit; font-size: .9rem; cursor: pointer;
}
.korb-weg:hover { border-color: var(--koralle); color: var(--koralle-schrift); }
.korb-leer { font-size: var(--t-s); color: var(--text-leise); }
.korb-preisnotiz {
  padding: var(--r-3) var(--r-4); margin-bottom: var(--r-4);
  background: var(--dunst); border-radius: var(--rund-s);
  font-size: var(--t-xs); color: var(--text-ruhig);
}

/* Auf schmalen Geräten wandert die Bestellübersicht in eine Leiste am
   unteren Rand — sonst müsste man an allen Waren vorbeiscrollen, um zu
   sehen, was schon ausgewählt ist. */
.shop-leiste {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 90;
  display: none; align-items: center; justify-content: space-between; gap: var(--r-3);
  padding: .75rem var(--r-5) calc(.75rem + env(safe-area-inset-bottom));
  background: var(--navy); color: var(--text-auf-navy);
  box-shadow: 0 -8px 28px rgba(7, 29, 56, .28);
}
.shop-leiste .knopf { min-height: 2.75rem; }
.shop-leiste-zahl { font-size: var(--t-s); font-weight: 700; }
@media (max-width: 1039px) {
  .shop-leiste.sichtbar { display: flex; }
  body.mit-leiste { padding-bottom: 5rem; }
}

/* ── Fußzeile ──────────────────────────────────────────────────────────────
   Nach dem Entwurf: Logo und Anschrift links, sonst nichts. Die Seitenliste
   und die Rechtszeile sind ergänzt — ohne sie wäre die Datenschutzerklärung
   von keiner Seite erreichbar. */

.fuss {
  background: var(--navy-tief);
  color: var(--text-auf-navy);
  padding: clamp(var(--r-8), 7vw, var(--r-10)) 0 var(--r-5);
}
.fuss-innen {
  display: flex; flex-wrap: wrap; gap: var(--r-7) var(--r-9);
  align-items: flex-start; justify-content: space-between;
  margin-bottom: var(--r-8);
}
/* Logo und Anschrift NEBENEINANDER (Auftraggeber, 02.10.2026).
   Vorher stand die Anschrift unter einem bis zu 13rem breiten Logo; der
   Markenblock war dadurch rund doppelt so hoch wie die Seitenliste daneben.
   align-items:center haelt beide Teile auf derselben Mittellinie, auch wenn
   die Anschrift mal eine Zeile mehr bekommt. */
.fuss-marke {
  display: flex;
  align-items: center;
  gap: var(--r-5);
  max-width: 30rem;
}
/* Die Breite ist aus der Anschrift GERECHNET, nicht geschaetzt: fuenf Zeilen
   in --t-s bei Zeilenhoehe 1.9 ergeben rund 142px. Das Logo ist 677x888,
   also 0.762 breit wie hoch — fuer dieselbe Hoehe sind das rund 108px. */
.fuss-logo {
  height: auto;
  width: clamp(4.5rem, 7vw, 6.75rem);
  flex: none;
  margin: 0;
}
/* Unter 560px wird es nebeneinander zu eng: die Anschrift bekaeme pro Zeile
   kaum mehr als die Haelfte. Dort wieder untereinander. */
@media (max-width: 560px) {
  .fuss-marke { display: block; }
  .fuss-logo { width: 5.5rem; margin-bottom: var(--r-4); }
}

/* Ueberschrift der Seitenliste. Klein und gesperrt — sie ordnet die Liste
   ein und soll die Anschrift daneben nicht uebertoenen. */
.fuss-titel {
  margin: 0 0 var(--r-4);
  font-family: inherit;
  font-size: var(--t-xs);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--text-auf-navy);
}
.fuss address {
  font-size: var(--t-s); font-style: normal; line-height: 1.9;
  color: var(--text-auf-navy-ruhig);
}
.fuss a { color: var(--text-auf-navy-ruhig); text-decoration: none; }
.fuss a:hover { color: var(--text-auf-navy); text-decoration: underline; }

/* Eine Spalte statt eines Rasters: Das ist die klassische Fussspalte, und
   sie laeuft jetzt neben dem Markenblock auf aehnliche Hoehe. Als Raster
   zerfiel die Liste je nach Fensterbreite in zwei oder drei kurze Spalten,
   und die Ueberschrift „Seiten" stand ueber lauter Stummeln. */
.fuss-nav ul {
  list-style: none; padding: 0; margin: 0;
  display: grid; gap: .55rem;
  grid-template-columns: 1fr;
}
.fuss-nav li { margin: 0; font-size: var(--t-s); }

.fuss-schluss {
  display: flex; flex-wrap: wrap; gap: var(--r-3) var(--r-5);
  align-items: center; justify-content: space-between;
  padding-top: var(--r-5); border-top: 1px solid var(--rand-auf-navy);
  font-size: var(--t-xs); color: var(--text-auf-navy-leise);
}
.fuss-schluss p { margin: 0; }
.fuss-schluss ul { display: flex; flex-wrap: wrap; gap: var(--r-4); list-style: none; padding: 0; margin: 0; }
.fuss-schluss li { margin: 0; font-size: var(--t-xs); }

/* ── Bewegung ──────────────────────────────────────────────────────────── */

.zeigt { opacity: 0; transform: translateY(18px); }
.zeigt.da { opacity: 1; transform: none; transition: opacity var(--tempo-l) var(--kurve), transform var(--tempo-l) var(--kurve); }

/* Ohne JavaScript darf nichts unsichtbar bleiben. */
.kein-js .zeigt { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  .zeigt, .zeigt.da { opacity: 1; transform: none; transition: none; }
  .knopf:hover, .stand:hover { transform: none; }
  * { animation-duration: .001ms !important; animation-iteration-count: 1 !important; }
}

@media print {
  .kopf, .balken, .shop-leiste, .hero-band, .hero-echo, .hero-korn { display: none !important; }
  body { background: #fff; color: #000; }
  .abschnitt { padding: 1rem 0; }
}

/* ── Wochenplan ────────────────────────────────────────────────────────── */

.plan { overflow-x: auto; }          /* breite Tabelle scrollt in sich, nie die Seite */
.plan table {
  width: 100%; min-width: 30rem; border-collapse: collapse;
  background: var(--creme); border: 1px solid var(--rand);
  border-radius: var(--rund-l); overflow: hidden;
}
.plan thead th {
  padding: .8rem var(--r-4); text-align: left;
  background: var(--navy); color: var(--text-auf-navy);
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
}
.plan tbody th {
  width: 9rem; padding: var(--r-4); text-align: left; vertical-align: top;
  font-size: var(--t-s); font-weight: 700;
  border-top: 1px solid var(--rand);
}
.plan tbody td {
  padding: var(--r-4); border-top: 1px solid var(--rand);
  display: flex; flex-wrap: wrap; gap: var(--r-2) var(--r-5);
}
.plan tr.heute th, .plan tr.heute td { background: rgba(252, 90, 90, .09); }
.plan tr.heute th::after {
  content: 'heute'; display: block;
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--koralle-schrift);
}
.plan-stand { display: flex; flex-direction: column; font-size: var(--t-s); }
.plan-stand span { color: var(--text-ruhig); }
.plan-frei { font-size: var(--t-s); color: var(--text-leise); }
.plan-notiz { margin-top: var(--r-4); font-size: var(--t-s); color: var(--text-ruhig); }

/* Auswahlfelder in Produktzeilen (Fischplatten-Formular) */
.produkt input[type='checkbox'] {
  width: 1.35rem; height: 1.35rem; margin: 0;
  accent-color: var(--navy); flex: none;
}
label.produkt { cursor: pointer; align-items: start; }
label.produkt:has(input:checked) { border-color: var(--navy); background: #fff; }
label.produkt .feld-notiz { line-height: 1.5; }

/* ══════════════════════════════════════════════════════════════════════════
   Bausteine des neuen Entwurfs (2026-09-08)
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Sektionsköpfe ─────────────────────────────────────────────────────────
   Der Entwurf setzt über jede Überschrift ein kleines Label: in der
   Wochenmarkt-Sektion als schlichte Zeile, in den beiden folgenden als
   Pille — einmal gefüllt auf Navy, einmal umrandet auf Papier. */

.sektion-kopf {
  text-align: center;
  margin-bottom: clamp(var(--r-6), 4vw, var(--r-8));
  /* Bezugsgroesse fuer die Ueberschrift, siehe unten. */
  container-type: inline-size;
}
.sektion-kopf h2 {
  margin: 0 auto;
  max-width: none;
  /* Alle Sektionsueberschriften tragen DIESELBE Groesse — im Entwurf sind sie
     gleich gross, nur die Textlaenge unterscheidet sie. Der Wert haengt an der
     Huellenbreite (9,05 Prozent), nicht an der Fensterbreite: oberhalb von
     1248 px steht die Huelle bei 1200 px fest, waehrend vw weiterwaechst. So
     ergibt sich bei 1152 px Inhaltsbreite eine Schriftgroesse von 104 px, und
     die drei Zeilen fuellen 62, 89 und 95 Prozent der Huelle.
     Die clamp-Zeile davor ist der Rueckfall fuer Browser ohne
     Container-Einheiten. */
  font-size: var(--d-titel);
  font-size: min(9.05cqw, 6.5rem);
  letter-spacing: -.022em;
}
/* Die laengste Sektionsueberschrift fuellt 95 Prozent der Huelle und soll
   nicht umbrechen; unter 620 px darf sie es doch, sonst wird sie winzig. */
.sektion-kopf-breit h2 { text-wrap: nowrap; }
@media (max-width: 620px) {
  .sektion-kopf-breit h2 { text-wrap: balance; }
}
.sektion-kopf .unter {
  max-width: 42rem; margin: var(--r-4) auto 0;
  font-size: var(--t-l); color: var(--text-ruhig);
}
.auf-navy .sektion-kopf .unter { color: var(--text-auf-navy-ruhig); }

.uebertitel {
  display: block; margin: 0 0 var(--r-3);
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .2em;
  text-transform: uppercase; color: var(--text-leise);
}
.auf-navy .uebertitel { color: var(--text-auf-navy-leise); }

/* Im Entwurf sind die Pillen WEISS und gemischt geschrieben, nicht gesperrt
   in Grossbuchstaben. Navy auf Weiss ergibt 14,2:1. */
.pille {
  display: inline-block; margin: 0 0 var(--r-4);
  padding: .45rem 1.15rem;
  border-radius: var(--rund-pille);
  font-size: var(--t-s); font-weight: 600; letter-spacing: .005em;
}
.pille-hell { background: #fff; color: var(--navy); }
.pille-rand { background: #fff; color: var(--navy); border: 1px solid var(--rand-fein); }

/* ── Knöpfe des Entwurfs ───────────────────────────────────────────────────
   Pillenform, Koralle gefüllt, dunkelblaue Schrift (Weiß erreicht auf Koralle
   nur 3,11:1 — Navy-tief 5,43:1). */

.knopf-koralle {
  background: var(--koralle);
  color: var(--navy-tief);
  border-color: transparent;
  box-shadow: 0 6px 18px -6px rgba(252, 90, 90, .7);
}
.knopf-koralle:hover { background: var(--koralle-hell); color: var(--navy-tief); }
/* Der kleine Knopf sitzt in der Kopfzeile neben Labels von rund 22 px —
   mit --t-xs wirkte er daneben winzig. */
.knopf-klein { min-height: 2.75rem; padding: .6rem 1.35rem; font-size: var(--t-s); }
.knopf-gross { min-height: 3.4rem; padding: 1rem 2rem; font-size: var(--t-s); }

/* ── Marktort-Karten ──────────────────────────────────────────────────────
   Foto, Ortsname in der Display-Serif, zwei fein umrandete Faktenkästchen
   nebeneinander, unten der Korallenknopf. Sieben Karten, drei Spalten. */

.ort-gitter {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(17.5rem, 100%), 1fr));
  gap: clamp(var(--r-4), 2vw, var(--r-6));
  list-style: none; padding: 0; margin: 0;
}
.ort {
  display: flex; flex-direction: column; gap: var(--r-3);
  margin: 0; padding: .75rem;
  background: var(--creme);
  border-radius: var(--rund-l);
  box-shadow: var(--schatten-karte);
  transition: transform var(--tempo) var(--kurve), box-shadow var(--tempo) var(--kurve);
}
.ort:hover { transform: translateY(-3px); box-shadow: var(--schatten-l); }

.ort-bild { border-radius: .75rem; overflow: hidden; background: var(--creme-tief); }
.ort-bild img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }

.ort-name {
  margin: var(--r-2) 0 0; padding: 0 .35rem;
  font-size: var(--d-karte); line-height: 1.1;
  color: var(--navy);
}

/* Fakten der Ortskarte: in der Vorlage durch feine Striche getrennt, nicht
   in Kästen gesetzt. Ein waagerechter Strich unter dem Ortsnamen, ein
   senkrechter zwischen Zeit und Adresse. */
.ort-fakten {
  display: grid; grid-template-columns: 1fr 1fr;
  margin: 0 .35rem;
  padding-top: var(--r-3);
  border-top: 1px solid var(--strich);
}
.ort-zeit,
.ort-adresse {
  margin: 0;
  font-size: var(--t-xs); font-style: normal; line-height: 1.5;
  color: var(--text-ruhig);
}
.ort-zeit { padding-right: var(--r-3); }
.ort-adresse {
  padding-left: var(--r-3);
  border-left: 1px solid var(--strich);
}
.ort-zeit strong { display: block; color: var(--navy); font-weight: 700; }

.ort-knopf {
  margin-top: auto; width: 100%;
  min-height: 2.6rem; padding: .6rem 1rem; font-size: var(--t-xs);
}

/* Der heutige Markttag wird von main.js hervorgehoben. */
.ort.heute { box-shadow: 0 0 0 2px var(--koralle), var(--schatten-karte); }
.ort-heute-schild {
  align-self: flex-start; margin: 0 .35rem;
  padding: .2rem .6rem; border-radius: var(--rund-xs);
  background: var(--koralle); color: var(--navy-tief);
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase;
}

/* ── Fischplatten-Karten ──────────────────────────────────────────────────
   1:1 nach der Vorlage des Auftraggebers:
   - Der Farbverlauf läuft von dunklem Navy OBEN zu hellerem Blau UNTEN.
   - Titel und Warenliste stehen zentriert.
   - Die freigestellte Platte ist BREITER als die Karte und ragt links und
     rechts über deren Kanten hinaus; sie sitzt am unteren Kartenrand und
     wirkt dadurch in die Karte integriert statt darunter geklebt.
   - Kräftig gerundete Ecken, große Lücken zwischen den Karten.
   ─────────────────────────────────────────────────────────────────────── */

.platten {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: clamp(var(--r-5), 4vw, 4.5rem);
  list-style: none; padding: 0;
  margin: 0 0 clamp(var(--r-6), 4vw, var(--r-8));
}
.platte {
  position: relative;
  display: flex; flex-direction: column;
  margin: 0;
  padding: clamp(var(--r-5), 2.6vw, var(--r-7)) var(--r-5) 0;
  /* Dunkel oben, hell unten — wie in der Vorlage. */
  /* Die hellste Stufe liegt bewusst im unteren Viertel, wo nur noch die
     Platte sitzt: auf #1c5b8b erreicht der Resthinweis sonst nur 2,98:1.
     Über dem Text bleibt der Grund bei höchstens #14456f (Liste 5,89:1). */
  background: linear-gradient(180deg,
              #0d2c4e 0%,
              #123f66 45%,
              #14456f 68%,
              #1c5b8b 100%);
  border-radius: clamp(1.25rem, 2.4vw, 2rem);
  box-shadow: inset 0 0 0 1px rgba(250, 246, 237, .14), var(--schatten-l);
  color: var(--text-auf-navy);
  text-align: center;
}
.platte-titel {
  margin: 0 0 var(--r-5);
  font-size: clamp(1.5rem, 1.1rem + 1.4vw, 2.375rem);
  line-height: 1.05;
  color: var(--text-auf-navy);
}

/* Die Hülle zentriert den Listenblock, die Einträge selbst bleiben
   linksbündig — mittig geflatterte Aufzählungen liest niemand gern. */
.platte-liste-huelle { display: flex; justify-content: center; }
.platte-liste {
  columns: 2 6rem; column-gap: var(--r-5);
  list-style: none; padding: 0; margin: 0;
  text-align: left;
}
.platte-liste li {
  /* Die Spalten sind schmal; ohne Trennung reißt overflow-wrap Wörter wie
     „Makrelenrollmops" mitten durch und hängt ein einzelnes s in die nächste
     Zeile. Mit lang="de" trennt der Browser an sinnvollen Stellen. */
  hyphens: auto;
  break-inside: avoid; position: relative;
  margin: 0 0 .45rem; padding-left: .85rem;
  font-size: var(--t-s); line-height: 1.4;
  color: var(--text-auf-navy-ruhig);
}
.platte-liste li::before {
  content: ''; position: absolute; left: 0; top: .55em;
  width: .3rem; height: .3rem; border-radius: 50%;
  background: var(--hellblau);
}
.platte-rest {
  margin: var(--r-4) 0 0;
  font-size: var(--t-xs);
  /* Nicht --text-auf-navy-leise: auf dem Verlauf erreicht dessen 62 % nur
     4,12:1. Mit 80 % sind es 6,2:1. */
  color: rgba(250, 246, 237, .8);
}

.platte-bild {
  /* Breiter als die Karte: die Platte ragt seitlich hinaus. Der negative
     Innenabstand hebt sie an den unteren Kartenrand. */
  /* 136 % der Inhaltsbreite bei -18 % Seitenrand: die Platte ragt damit rund
     30 px über jede Kartenkante hinaus — in der Vorlage etwa 17 % der
     Kartenbreite. Prozente beziehen sich auf den Inhaltsbereich, der
     Innenabstand der Karte ist also schon herausgerechnet. */
  width: 136%;
  margin: auto -18% calc(-1 * clamp(.5rem, 1.2vw, 1.25rem));
}
/* Unter 800 px ist die Karte fast so breit wie die Hülle — ein Überstand von
   30 px schob die Seite dann um 2 bis 4 px waagerecht über den Rand. Dort
   ragt die Platte deshalb weniger weit hinaus, und die Sektion beschneidet
   zusätzlich (clip, nicht hidden: das erzeugt keinen Scrollbereich). */
@media (max-width: 800px) {
  .platte-bild { width: 128%; margin-inline: -14%; }
}
.abschnitt-platten { overflow-x: clip;
  padding-top: var(--r-5);
  position: relative; z-index: 2;
}
.platte-bild img {
  width: 100%; height: auto;
  filter: drop-shadow(0 16px 22px rgba(7, 29, 56, .5));
}

/* ── Korallenband ──────────────────────────────────────────────────────────
   Reiner Trenner ohne Text, gerade Kanten, volle Breite. */
.band-koralle {
  height: clamp(1.75rem, 3.4vw, 3.75rem);
  background: var(--koralle);
}

/* ── Foto-Band mit einer einzigen Aussage ─────────────────────────────────── */
.band-foto {
  position: relative;
  isolation: isolate;
  display: grid; place-items: center;
  min-height: clamp(18rem, 32vw, 32rem);   /* Entwurf: ~46 % der Breite */
  padding: var(--r-8) 0;
  background: var(--navy);
  overflow: hidden;
  text-align: center;
}
.band-foto img.band-bild {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%; object-fit: cover;
}
.band-foto .band-schleier {
  position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(rgba(7, 29, 56, .62), rgba(7, 29, 56, .62));
}
/* Bezugsgroesse fuer die Ueberschrift des Fotobands. */
.band-foto .huelle { container-type: inline-size; }
.band-foto h2 {
  margin: 0;
  max-width: none;
  /* Dieselbe Groesse wie die Sektionsueberschriften: im Entwurf ist
     „Kartenzahlung moeglich." gross und praegnant, bei 104 px fuellt sie
     76 Prozent der Huelle (rund 60 Prozent des Fensters) — genau wie dort. */
  font-size: var(--d-band);
  font-size: min(9.05cqw, 6.5rem);
  letter-spacing: -.022em;
  color: #fff;
  text-shadow: 0 2px 18px rgba(7, 29, 56, .6);
}

/* ── Anpassungen der Bestandsbausteine an den Papiergrund ────────────────── */
.schritt { background: var(--creme); }
.auf-navy .schritt { background: var(--navy-hoch); }
.reiter[aria-selected='true'] { background: var(--navy); border-color: var(--navy); color: var(--creme); }

.sektion-fussnote {
  margin: clamp(var(--r-5), 3vw, var(--r-7)) 0 0;
  text-align: center;
  font-size: var(--t-s);
  color: var(--text-leise);
}
.auf-navy .sektion-fussnote { color: var(--text-auf-navy-leise); }

/* Das Wappen hängt in die Hero; auf schmalen Fenstern rutscht die Überschrift
   sonst darunter. Deshalb dort mehr Luft nach oben. */
@media (max-width: 900px) {
  .hero { padding-top: clamp(var(--r-8), 18vw, var(--r-10)); }
}


/* Der Textteil der Plattenkarte schiebt das Bild an die Unterkante. */
.platte-text { flex: 1 1 auto; }

/* ── Sortiment: Warenkarten mit Fotos ─────────────────────────────────────
   Der Kunde wollte die echten Fotos seiner Warengruppen sehen. Auf seiner
   Bestandsseite klebt das Foto abgeschnitten an der rechten Kartenkante und
   streitet dort mit der Warenliste um den Platz. Hier trägt die Karte das
   Foto oben über die ganze Breite und den Gruppennamen DARAUF — Bild und
   Schrift werden eine Einheit statt zwei Nachbarn.

   Kontraste auf dem Kartengrund #14406e, nachgerechnet:
   Creme 9,79:1 · Creme 76 % 6,37:1 · Hellblau 5,42:1.
   Der Titel liegt auf einem Verlauf, der an der Textkante schon 72 % deckt
   (navy-tief über dem hellsten Foto: mindestens 11:1).
   ─────────────────────────────────────────────────────────────────────── */

/* ── Reiter der Warenkategorien ────────────────────────────────────────────
   Der Auftraggeber will die Kategorien als Reiter. Die Regeln hängen an
   role="tablist", weil die Klasse .reiter im Shop auch für Sprungmarken
   benutzt wird — dort sind es <a> auf Papiergrund und sollen so bleiben. */

.reiter-leiste[role='tablist'] {
  display: flex; flex-wrap: wrap; justify-content: center; gap: .3rem;
  width: fit-content; max-width: 100%;
  margin: 0 auto clamp(var(--r-6), 3.5vw, var(--r-8));
  padding: .35rem;
  background: rgba(250, 246, 237, .07);
  border: 1px solid var(--rand-auf-navy);
  border-radius: var(--rund-pille);
}
.reiter-leiste[role='tablist'] .reiter {
  min-height: 2.75rem; padding: .55rem clamp(.9rem, 1.6vw, 1.5rem);
  background: transparent; border: 0; border-radius: var(--rund-pille);
  font-family: var(--schrift-display);
  font-size: clamp(.9375rem, .88rem + .2vw, 1.0625rem);
  font-weight: 400; letter-spacing: .005em;
  color: var(--text-auf-navy-ruhig);       /* 5,97:1 auf Navy */
  cursor: pointer; white-space: nowrap;
  transition: background-color var(--tempo) var(--kurve), color var(--tempo) var(--kurve);
}
.reiter-leiste[role='tablist'] .reiter:hover {
  color: var(--text-auf-navy); background: rgba(250, 246, 237, .1);
}
.reiter-leiste[role='tablist'] .reiter[aria-selected='true'] {
  background: var(--creme); color: var(--navy);   /* 13,34:1 */
}

/* Auf schmalen Fenstern brechen vier Reiter in zwei Zeilen, und die
   Pillenform wirkt dann unruhig. Dort läuft die Leiste deshalb in einer Zeile
   und scrollt waagerecht in sich — die Seite selbst scrollt nicht mit.
   Tastaturnutzer erreichen die Reiter weiter mit den Pfeiltasten; focus()
   scrollt den gewählten Reiter selbst ins Bild. */
@media (max-width: 720px) {
  .reiter-leiste[role='tablist'] {
    width: 100%;
    flex-wrap: nowrap;
    justify-content: flex-start;
    overflow-x: auto;
    border-radius: var(--rund-m);
    scrollbar-width: none;
  }
  .reiter-leiste[role='tablist']::-webkit-scrollbar { display: none; }
}

.reiter-tafel[hidden] { display: none !important; }
.reiter-tafel:focus-visible { outline: 3px solid var(--fokus); outline-offset: 6px; border-radius: var(--rund-s); }

/* Die Kategorieüberschrift nennt nur der Reiter — für Vorlesewerkzeuge muss
   sie aber in der Gliederung stehen. Deshalb sichtbar erst ohne JavaScript. */
.tafel-kat-titel {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.kein-js .tafel-kat-titel {
  position: static; width: auto; height: auto; margin: 0 0 .35rem;
  overflow: visible; clip: auto; white-space: normal;
  font-size: var(--d-karte); color: var(--text-auf-navy);
}
.kein-js .reiter-leiste[role='tablist'] { display: none; }
.kein-js .reiter-tafel[hidden] { display: block !important; }
.kein-js .reiter-tafel { margin-bottom: clamp(var(--r-7), 4.5vw, var(--r-9)); }

.kat-zahl {
  display: block; margin: 0 0 clamp(var(--r-4), 2vw, var(--r-5));
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--hellblau);   /* 5,42:1 */
}

.karten-gitter {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(19rem, 100%), 1fr));
  gap: clamp(var(--r-4), 2vw, var(--r-5));
  /* Ohne start würden kurze Karten auf die Höhe der längsten gestreckt —
     genau der tote Leerraum, der an der Bestandslösung stört. */
  align-items: start;
  list-style: none; padding: 0; margin: 0;
}

.warenkarte {
  margin: 0;
  background: var(--navy-hoch);
  border-radius: var(--rund-l);
  overflow: hidden;
  box-shadow: var(--schatten-l);
  transition: transform var(--tempo) var(--kurve);
}
.warenkarte:hover { transform: translateY(-3px); }

.warenkarte-bild { position: relative; }
.warenkarte-bild img {
  display: block; width: 100%;
  aspect-ratio: 4 / 3; object-fit: cover;
}
.warenkarte-titel {
  position: absolute; left: 0; right: 0; bottom: 0;
  margin: 0; padding: 2.75rem .9rem .7rem;
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem;
  font-size: clamp(1.125rem, 1rem + .5vw, 1.375rem);
  line-height: 1.1;
  color: var(--text-auf-navy);
  background: linear-gradient(to top,
              rgba(7, 29, 56, .94) 0%,
              rgba(7, 29, 56, .72) 55%,
              rgba(7, 29, 56, 0) 100%);
  text-shadow: 0 1px 10px rgba(7, 29, 56, .65);
}

.warenkarte-koerper { padding: var(--r-4) .95rem 1.15rem; }

.waren-label {
  margin: 0 0 .5rem;
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .4rem;
  font-size: var(--t-xs); font-weight: 700; letter-spacing: .1em;
  line-height: 1.35; text-transform: uppercase;
  color: var(--hellblau);
}
.waren-label:not(:first-child) { margin-top: var(--r-4); }

.warenliste { list-style: none; margin: 0; padding: 0; }
.warenliste-lang { columns: 2 7.5rem; column-gap: var(--r-4); }
.warenliste li {
  margin: 0 0 .2rem; padding: 0;
  font-size: var(--t-s); line-height: 1.45;
  color: var(--text-auf-navy-ruhig);
  break-inside: avoid;
  /* „Victoriabarschfilet" ist breiter als eine schmale Listenspalte. Ohne
     Trennung lief das Wort über den Kartenrand hinaus. */
  hyphens: auto;
  overflow-wrap: break-word;
}
.waren-hinweis {
  margin: .85rem 0 0;
  font-size: var(--t-xs); line-height: 1.45;
  color: var(--text-auf-navy-leise);
}

.chip {
  padding: .1rem .45rem; border-radius: var(--rund-xs);
  background: var(--koralle); color: var(--navy-tief);
  font-size: .625rem; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase;
}

.tafeln-fuss {
  margin: clamp(var(--r-6), 3.5vw, var(--r-8)) 0 0;
  text-align: center; font-size: var(--t-s);
  color: var(--text-auf-navy-ruhig);
}
.tafeln-fuss a { color: var(--hellblau); }

/* ── Häufige Fragen ────────────────────────────────────────────────────────
   Zwei Spalten ab 900 px, darunter eine. Die Frage steht als h3 über der
   Antwort statt in einem Aufklapper: eingeklappter Text wird von
   Antwortmaschinen schlechter gelesen, und fünf kurze Absätze brauchen
   keine Mechanik. */
.faq-liste {
  display: grid;
  gap: var(--r-5) var(--r-7);
  margin-top: var(--r-6);
}
@media (min-width: 900px) {
  .faq-liste { grid-template-columns: 1fr 1fr; }
}
.faq-paar h3 {
  font-family: var(--schrift-display);
  font-weight: 400;
  font-size: var(--d-karte);
  line-height: 1.15;
  margin: 0 0 .5rem;
  color: var(--navy);
}
.faq-paar p {
  margin: 0;
  max-width: 46ch;
}

/* ── Shop ohne JavaScript ──────────────────────────────────────────────────
   Die Warenliste steht auch ohne Skript vollständig da (gut für Leser wie für
   Suchmaschinen), bedienen lässt sie sich dann aber nicht. Statt sie zu
   verstecken, wird sie sichtbar stillgelegt — die Höhe bleibt gleich, deshalb
   springt die Seite nicht, wenn shop.js sie durch die bedienbare Fassung
   ersetzt. */
.kein-js #shop-katalog select,
.kein-js #shop-katalog input,
.kein-js #shop-katalog .zaehler button {
  pointer-events: none;
  opacity: .5;
}

/* ── Lange deutsche Wörter auf schmalen Geräten ────────────────────────────
   Bei 320 px bleiben von der Hülle 272 px Textbreite. „Auftragsverarbeitungs-
   vertrag" und „moin@fischhandelroemer.de" passen dort nicht in eine Zeile und
   schoben die Seite waagerecht heraus (gemessen +35 px auf der Datenschutz-
   seite). Trennen statt schieben — mit lang="de" trennt der Browser sinnvoll,
   break-word fängt den Rest. */
body { overflow-wrap: break-word; }
@media (max-width: 720px) {
  /* Silbentrennung nur, wo die Zeilen wirklich kurz sind. Global gesetzt
     trennte sie auch die zweispaltigen Fragen bei 1280 px an acht Stellen
     („Meerespro-dukte", „Vorbe-stellung") und riss dabei Verweise ausein-
     ander — schlechter zu lesen als der Umbruch ohne Trennung. */
  body { hyphens: auto; }
}

/* ── Häufige Fragen ────────────────────────────────────────────────────────
   Zwei Spalten ab 900 px, darunter eine. Die Frage steht als h3 über der
   Antwort statt in einem Aufklapper: eingeklappter Text wird von
   Antwortmaschinen schlechter gelesen, und fünf kurze Absätze brauchen
   keine Mechanik. */
.faq-liste {
  display: grid;
  gap: var(--r-5) var(--r-7);
  margin-top: var(--r-6);
}
@media (min-width: 900px) {
  .faq-liste { grid-template-columns: 1fr 1fr; }
}
.faq-paar h3 {
  font-family: var(--schrift-display);
  font-weight: 400;
  font-size: var(--d-karte);
  line-height: 1.15;
  margin: 0 0 .5rem;
  color: var(--navy);
}
.faq-paar p {
  margin: 0;
  max-width: 46ch;
}

/* ── Shop ohne JavaScript ──────────────────────────────────────────────────
   Die Warenliste steht auch ohne Skript vollständig da (gut für Leser wie für
   Suchmaschinen), bedienen lässt sie sich dann aber nicht. Statt sie zu
   verstecken, wird sie sichtbar stillgelegt — die Höhe bleibt gleich, deshalb
   springt die Seite nicht, wenn shop.js sie durch die bedienbare Fassung
   ersetzt. */
.kein-js #shop-katalog select,
.kein-js #shop-katalog input,
.kein-js #shop-katalog .zaehler button {
  pointer-events: none;
  opacity: .5;
}

/* ── Lange deutsche Wörter auf schmalen Geräten ────────────────────────────
   Bei 320 px bleiben von der Hülle 272 px Textbreite. „Auftragsverarbeitungs-
   vertrag" und „moin@fischhandelroemer.de" passen dort nicht in eine Zeile und
   schoben die Seite waagerecht heraus (gemessen +35 px auf der Datenschutz-
   seite). Trennen statt schieben — mit lang="de" trennt der Browser sinnvoll,
   break-word fängt den Rest. */
body { overflow-wrap: break-word; }
@media (max-width: 720px) {
  /* Silbentrennung nur, wo die Zeilen wirklich kurz sind. Global gesetzt
     trennte sie auch die zweispaltigen Fragen bei 1280 px an acht Stellen
     („Meerespro-dukte", „Vorbe-stellung") und riss dabei Verweise ausein-
     ander — schlechter zu lesen als der Umbruch ohne Trennung. */
  body { hyphens: auto; }
}

/* ── Brotkrumenpfad ────────────────────────────────────────────────────────
   Nur auf Unterseiten, und bewusst leise: er ist Orientierung, nicht Inhalt.
   Der obere Abstand muss den gerissenen Streifen der Kopfzeile überspringen,
   der zur Hälfte in den Inhalt hineinhängt (--kopf-riss-h / 2). */
.pfad {
  padding: calc(var(--kopf-riss-h) / 2 + var(--r-4)) 0 var(--r-4);
  font-size: var(--t-s);
  color: var(--text-ruhig);
}
.pfad .huelle { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
/* Kein eigener Unterstrichton: die Grundregel für a nutzt --rand-stark
   (3,03:1) und erfüllt damit WCAG 1.4.11. Der schwächere --rand wäre
   kaum zu sehen — der Verweis wäre dann nur noch an der Farbe zu
   erkennen, und die ist hier dieselbe wie beim Fließtext. */
.pfad a:hover { color: var(--navy); text-decoration-color: currentColor; }
.pfad-teiler { color: var(--koralle); }
.pfad [aria-current='page'] { color: var(--navy); font-weight: 600; }

/* ── Wochenplan: der Schiebekasten ─────────────────────────────────────────
   Gemessen: die Tabelle braucht mindestens 480 px. Bei 528 px Fensterbreite
   bleiben nach den Rändern der Hülle genau 480 px übrig — darunter schiebt
   der Kasten, darüber nicht. Deshalb steht der Hinweis nur bis 527 px.
   Der Kasten selbst trägt tabindex="0" (siehe Erzeuger), damit die rechte
   Spalte auch ohne Maus erreichbar ist; dafür braucht er einen sichtbaren
   Fokusring. */
.plan-schiebe { display: none; }
@media (max-width: 527px) {
  .plan-schiebe {
    display: block;
    margin: 0 0 var(--r-3);
    font-size: var(--t-s);
    color: var(--text-ruhig);
  }
}
.plan:focus-visible {
  outline: 2px solid var(--koralle);
  outline-offset: 3px;
}

/* ── Ruhiger Text in Karten auf Navy ───────────────────────────────────────
   .auf-navy .karte setzt die Textfarbe auf der Karte, ein inline gesetztes
   color am <p> hat das aber überschrieben: --text-ruhig ist ein dunkles Navy
   für helle Flächen und ergab auf --navy-hoch gemessene 1,25:1. Die zwei
   Inline-Angaben sind entfernt; die Regel gehört hierher, wo sie den
   passenden Ton für dunkle Flächen wählt. */
.auf-navy .karte p,
.auf-navy .karte-glas p { color: var(--text-auf-navy-ruhig); }

/* ── Vorbesteller-Shop: die drei Plattenreihen ─────────────────────────────
   Der Auftraggeber wollte die Bildsprache der Startseite, aber liegend: Bild
   links, in den Container hineinragend, rechts Name, Bestandteile und die
   Personenzahl. Der Verlauf ist derselbe wie bei den Karten der Startseite —
   dunkel oben, hell unten — damit beide Flächen als dieselbe Familie lesen. */
.platten-reihen { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--r-6); }

.platte-reihe {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 11rem) minmax(0, 1fr);
  align-items: center;
  gap: var(--r-6);
  padding: var(--r-6) var(--r-6) var(--r-6) 0;
  border-radius: var(--rund-xl);
  background: linear-gradient(180deg, #0d2c4e 0%, #123f66 45%, #14456f 68%, #1c5b8b 100%);
  color: var(--text-auf-navy);
  box-shadow: var(--schatten-karte);
  transition: box-shadow .18s ease;
}
.platte-reihe.gewaehlt { box-shadow: 0 0 0 2px var(--koralle), var(--schatten-karte); }

/* Das Bild ragt links aus dem Container heraus — wie die Platte auf der
   Startseite über die Kartenkanten. Der Container schneidet nicht ab, dafür
   fängt .abschnitt-platten-shop den seitlichen Überstand. */
.platte-reihe-bild { margin-left: -3.5rem; margin-right: -1.5rem; }
.platte-reihe-bild img {
  width: 100%; height: auto; display: block;
  filter: drop-shadow(0 14px 20px rgba(7, 29, 56, .5));
}

.platte-reihe-text { min-width: 0; }
.platte-reihe .platte-titel { margin: 0 0 .15rem; font-size: var(--d-karte); }
.platte-reihe-kurz {
  margin: 0 0 var(--r-4);
  font-size: var(--t-s);
  color: var(--text-auf-navy-ruhig);
}
.platte-reihe .platte-liste { columns: 2 8rem; }

/* Personenzahl: derselbe Zähler wie früher bei den Waren, nur mit Beschriftung. */
.platte-personen {
  display: flex; align-items: center; flex-wrap: wrap;
  gap: var(--r-3) var(--r-4);
  margin-top: var(--r-5);
}
.platte-personen label { font-weight: 600; font-size: var(--t-s); }
.platte-personen .feld-notiz { color: var(--text-auf-navy-ruhig); margin: 0; }

/* Unter 760 px steht das Bild über dem Text; ein 8-rem-Streifen daneben wäre
   dort nur noch ein Fleck. */
@media (max-width: 760px) {
  .platte-reihe {
    grid-template-columns: minmax(0, 1fr);
    padding: var(--r-6) var(--r-5);
    justify-items: center;
    text-align: center;
  }
  .platte-reihe-bild { margin: 0 auto; width: min(16rem, 70%); }
  .platte-reihe .platte-liste { text-align: left; }
  .platte-personen { justify-content: center; }
  /* Die Reihe ist auf schmalen Geräten mittig gesetzt — im Aufklapper wäre
     das falsch: eine Liste aus Name und Zähler liest man linksbündig. */
  .platte-reihe .zusatz { text-align: left; }
}

/* Der Hinweis auf noch nicht bestätigte Angaben steht EINMAL über den
   Reihen; je Platte genügt der Chip in der Überschrift. Dreimal derselbe
   Kasten liest sich wie eine Fehlermeldung. */
.offen-hinweis {
  margin: 0 0 var(--r-6);
  padding: var(--r-4) var(--r-5);
  border-left: 3px solid var(--koralle);
  border-radius: 0 var(--rund-s) var(--rund-s) 0;
  background: rgba(252, 90, 90, .10);
  font-size: var(--t-s);
  color: var(--text-ruhig);
}
.platte-reihe .platte-titel .chip {
  margin-left: .6rem;
  vertical-align: .28em;
  white-space: nowrap;
}

/* Die Kurzbeschreibung unter dem Plattennamen auf der Startseite — sie
   benennt, was „Platte A" konkret ist. */
.platte-kurz {
  margin: -.9rem 0 var(--r-5);
  font-size: var(--t-s);
  color: var(--text-auf-navy-ruhig);
}

/* ── Kalender für den Abholtermin ──────────────────────────────────────────
   Der Auftraggeber wollte ein Monatsraster statt einer Liste, mit
   ausgegrauten Tagen ohne Markt. Ein <input type="date"> kann das nicht —
   sein Kalender lässt sich nicht nach Wochentagen einschränken. Deshalb hier
   ein eigenes Raster; die Auswahlliste bleibt verborgen im Formular stehen
   und trägt weiterhin den Wert (siehe abholung.js). */
.kalender {
  margin-top: var(--r-3);
  /* Gedeckelt, weil das Formular auf mittleren Breiten einspaltig wird: ohne
     Deckel bläht das quadratische Tagfeld den Kalender auf 670 px auf und die
     Tage werden 89 px groß. */
  max-width: 22rem;
  border: 1px solid var(--rand-fein);
  border-radius: var(--rund-l);
  background: var(--creme);
  padding: var(--r-4);
}
@media (max-width: 400px) {
  /* Bei 320 px bleiben sonst nur 25 px je Tagfeld. */
  .kalender { padding: var(--r-3); }
}
.kalender-kopf {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--r-3); margin-bottom: var(--r-3);
}
.kalender-monat { font-weight: 600; font-size: var(--t-m); color: var(--navy); }
.kalender-blatt {
  width: 2.25rem; height: 2.25rem;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--rand-stark); border-radius: 50%;
  background: transparent; color: var(--navy);
  font-size: 1.125rem; line-height: 1; cursor: pointer;
}
.kalender-blatt:hover:not(:disabled) { background: var(--navy); color: var(--creme); }
.kalender-blatt:disabled { opacity: .35; cursor: default; }

.kalender-gitter { width: 100%; border-collapse: collapse; table-layout: fixed; }
.kalender-gitter th {
  padding: 0 0 .35rem;
  font-size: var(--t-xs); font-weight: 600; text-align: center;
  color: var(--text-ruhig);
}
.kalender-gitter th abbr { text-decoration: none; }
.kalender-gitter td { padding: 1px; text-align: center; }

.kalender-tag {
  width: 100%; aspect-ratio: 1 / 1;
  min-height: 2.25rem; max-height: 2.75rem;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid transparent; border-radius: var(--rund-s);
  background: transparent; color: var(--navy);
  font: inherit; font-size: var(--t-s); font-variant-numeric: tabular-nums;
  cursor: pointer;
}
.kalender-tag:hover:not(:disabled) { background: var(--navy); color: var(--creme); }
/* Markttage tragen einen leisen Rahmen, damit sie sich auch ohne Farbe von
   den gesperrten Tagen unterscheiden — Farbe allein wäre WCAG 1.4.1. */
.kalender-tag:not(:disabled) { border-color: var(--rand-stark); font-weight: 600; }
.kalender-tag:disabled {
  /* Gesperrte Bedienelemente sind von WCAG 1.4.3 ausgenommen, lesbar bleiben
     sollten die Zahlen trotzdem — man orientiert sich an ihnen im Monat.
     Bei .32 waren es gemessene 1,93:1, bei .48 sind es 2,86:1, und der
     Unterschied zu den wählbaren Tagen (13,34:1) bleibt eindeutig.
     Unterschieden wird ohnehin nicht nur über Farbe: wählbare Tage tragen
     Rahmen und Fettung (WCAG 1.4.1). */
  color: rgba(10, 42, 80, .48);
  cursor: default;
}
.kalender-tag.gewaehlt,
.kalender-tag.gewaehlt:hover { background: var(--koralle); border-color: var(--koralle); color: var(--navy-tief); }

.kalender-hinweis, .kalender-leer {
  margin: var(--r-3) 0 0;
  font-size: var(--t-xs); color: var(--text-ruhig);
}
.kalender-leer { margin: 0; }

/* ── Salate als Zusatz zur Platte ──────────────────────────────────────────
   31 Sorten je Platte wären ausgeklappt eine Wand. <details> hält die Seite
   ruhig, klappt ohne JavaScript und meldet seinen Zustand an Screenreader.
   Der Aufklapper sitzt auf der navyfarbenen Reihe, also helle Schrift. */
.zusatz {
  margin-top: var(--r-5);
  border: 1px solid var(--rand-auf-navy);
  border-radius: var(--rund-l);
  background: rgba(250, 246, 237, .06);
}
.zusatz > summary {
  display: flex; align-items: center; flex-wrap: wrap;
  gap: .5rem var(--r-3);
  padding: var(--r-4) var(--r-5);
  cursor: pointer;
  list-style: none;               /* eigener Pfeil, siehe ::after */
  border-radius: var(--rund-l);
}
.zusatz > summary::-webkit-details-marker { display: none; }
.zusatz > summary::after {
  content: '';
  margin-left: auto;
  width: .6rem; height: .6rem;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  rotate: 45deg;
  transition: rotate .18s ease;
}
.zusatz[open] > summary::after { rotate: -135deg; }
.zusatz > summary:hover { background: rgba(250, 246, 237, .07); }

.zusatz-titel { font-weight: 600; font-size: var(--t-m); }
.zusatz-frei {
  font-size: var(--t-xs); letter-spacing: .06em; text-transform: uppercase;
  color: var(--text-auf-navy-ruhig);
}
/* Der Stand bleibt auch zugeklappt sichtbar — sonst weiß niemand, dass da
   noch etwas drinsteckt. */
.zusatz-stand {
  padding: .1rem .5rem; border-radius: var(--rund-xs);
  background: var(--koralle); color: var(--navy-tief);
  font-size: var(--t-xs); font-weight: 700;
}

.zusatz-koerper { padding: 0 var(--r-5) var(--r-5); }
.zusatz-notiz, .zusatz-sperre {
  margin: 0 0 var(--r-4);
  font-size: var(--t-s);
  color: var(--text-auf-navy-ruhig);
}
.zusatz-sperre {
  padding: .5rem .75rem;
  border-left: 3px solid var(--koralle);
  border-radius: 0 var(--rund-s) var(--rund-s) 0;
  background: rgba(250, 246, 237, .08);
  color: var(--text-auf-navy);
}
.zusatz-gruppe {
  margin: var(--r-5) 0 var(--r-3);
  font-family: inherit; font-weight: 700;
  font-size: var(--t-xs); letter-spacing: .08em; text-transform: uppercase;
  color: var(--text-auf-navy-ruhig);
}
.zusatz-gruppe:first-of-type { margin-top: 0; }

/* Eine Spalte, auch auf großen Schirmen: der Aufklapper sitzt in der
   Plattenreihe und ist dort nur rund 460 px breit. Zweispaltig blieben je
   Name gut 110 px — „Meerrettichlachssalat" brach dann mitten im Wort. */
.zusatz-liste { display: grid; gap: .15rem; }
.zusatz-zeile {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--r-3);
  padding: .3rem .5rem;
  border-radius: var(--rund-s);
}
.zusatz-zeile.gewaehlt {
  background: rgba(250, 246, 237, .10);
  box-shadow: inset 3px 0 0 var(--koralle);
}
.zusatz-name {
  font-size: var(--t-s); min-width: 0;
  /* Der Textkörper trägt overflow-wrap: break-word — hier ist ein Trennstrich
     das bessere Mittel, sonst hängt ein „t" allein in der zweiten Zeile. */
  overflow-wrap: normal; hyphens: auto;
}

/* Der kleine Zähler: dieselbe Form wie bei den Personen, nur kompakter. */
.zaehler-klein { flex: 0 0 auto; border-width: 1px; }
.zaehler-klein button { width: 2rem; height: 2rem; font-size: .95rem; }
.zaehler-klein input { width: 3.1rem; font-size: var(--t-xs); }
.zusatz-gesperrt .zusatz-zeile { opacity: .55; }

/* Die Zusätze in der Vorbestellung: eingerückt unter ihrer Platte. */
.korb-zusatz {
  flex: 1 0 100%;                 /* eigene Zeile unter dem Posten */
  list-style: none; margin: .35rem 0 .1rem; padding: 0 0 0 var(--r-4);
  border-left: 2px solid var(--rand);
  display: grid; gap: .2rem;
  font-size: var(--t-xs);
}
.korb-zusatz .korb-menge { font-weight: 600; }
.korb-zusatz .korb-weg { width: 1.4rem; height: 1.4rem; font-size: .75rem; }
