@font-face{font-family:'Karla';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/karla-latin-400-normal.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Karla';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/karla-latin-ext-400-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:'Karla';font-style:normal;font-weight:500;font-display:swap;src:url('../fonts/karla-latin-500-normal.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Karla';font-style:normal;font-weight:500;font-display:swap;src:url('../fonts/karla-latin-ext-500-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:'Karla';font-style:normal;font-weight:600;font-display:swap;src:url('../fonts/karla-latin-600-normal.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Karla';font-style:normal;font-weight:600;font-display:swap;src:url('../fonts/karla-latin-ext-600-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:'Karla';font-style:normal;font-weight:700;font-display:swap;src:url('../fonts/karla-latin-700-normal.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Karla';font-style:normal;font-weight:700;font-display:swap;src:url('../fonts/karla-latin-ext-700-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:'Fjalla One';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/fjalla-one-latin-400-normal.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Fjalla One';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/fjalla-one-latin-ext-400-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;}
/*
  assets/css/pistenmarkt.css
  ---------------------------------------------------------------------------
  Design-System für den HGH Ski-Basar - Farben, Typografie und die
  Pill-Auswahlkomponente sind direkt aus der Pistenzettel-Vorlage
  übernommen (gleiche Variablennamen, gleicher Look), erweitert um
  Marktplatz-Kartenraster, Filterleiste, Lightbox/Modal und Navigation.
  ---------------------------------------------------------------------------
*/

:root{
  --snow:#F5F9FC;
  --paper:#FFFFFF;
  --ink:#1E2A33;
  --ink-soft:#54646F;
  --line:#D9E4EC;
  --accent:#2E6DA4;
  --accent-deep:#163A5C;
  --accent-warm:#B5432E;
  --ok:#2E7D4F;
  --heisenberg-blau:#2A4A79;
  --shadow: 0 1px 2px rgba(22,42,58,.06), 0 8px 24px -12px rgba(22,42,58,.18);
  --radius: 14px;
  /* Bewusst IMMER hell - siehe unten. Kein @media (prefers-color-scheme)
     mehr, damit die Seite unabhängig von der Betriebssystem-Einstellung
     der jeweiligen Person durchgängig im hellen Modus angezeigt wird. */
  color-scheme: light only;
}

*{box-sizing:border-box;}
html{ -webkit-text-size-adjust:100%; }
body{
  margin:0;
  background:var(--snow);
  color:var(--ink);
  font-family:'Karla',ui-sans-serif,system-ui,-apple-system,sans-serif;
  -webkit-font-smoothing:antialiased;
}
/* Einheitliche Überschriftenfarbe (Heisenberg-Blau) auf allen Seiten -
   einzelne Überschriften setzen daher keine eigene color-Regel mehr (siehe
   z. B. .app__title, .schritt__inhalt h2 weiter unten). */
h1,h2,h3{ text-wrap:balance; margin:0; color:var(--heisenberg-blau); }
a{ color:var(--accent-deep); }
button{ font-family:inherit; }

/* ---------- Schnee-Hintergrund (rein dekorativ, siehe assets/js/schnee.js) ----------
   position:fixed + z-index:0, direkt als erstes Element im <body> - dadurch
   liegt er unterhalb von allem, was danach im Dokument kommt (Navigation,
   .app-Inhalt), ohne dass diese extra einen höheren z-index brauchen. Panels
   und Karten haben ohnehin einen deckenden Hintergrund (var(--paper)), der
   Schnee ist also nur in Zwischenräumen/auf der Seiten-Hintergrundfarbe
   sichtbar - "hinter den Kacheln", nicht darüber. */
.schnee{ position:fixed; inset:0; z-index:0; overflow:hidden; pointer-events:none; }
/* Rein weiße Flocken auf dem fast weißen Seitenhintergrund (--snow) waren
   praktisch unsichtbar (kaum Kontrast) - deshalb zusätzlich ein weicher
   Schlagschatten/"Glow" (dunkel für Kontur + Akzentblau für den
   Winter-Touch), der die Flocke auch auf hellem Grund klar erkennbar
   macht, ohne dass sie wie ein bunter Punkt wirkt. */
.schnee span{
  position:absolute; top:-10px; display:block; border-radius:50%;
  background:#fff;
  box-shadow: 0 0 0 1px rgba(30,42,51,.16), 0 1px 4px rgba(30,42,51,.22), 0 0 7px 1px rgba(46,109,164,.35);
  animation-name:schnee-fallen; animation-timing-function:linear;
  animation-iteration-count:infinite;
}
@keyframes schnee-fallen{
  from{ transform:translate(0, 0); }
  to{ transform:translate(var(--schnee-drift, 0px), 110vh); }
}

/* ---------- layout shell ---------- */
/* Einheitliche Inhaltsbreite für ALLE Seiten (vorher hatte z. B. der
   Marktplatz 1280px, "Angebot erstellen" 760px und "Meine Angebote"/
   "Anfragen"/"Moderation" 820px - das wirkte uneinheitlich). 820px war die
   Breite von "Meine Angebote" und ist jetzt der verbindliche Standard, auch
   für die Navigation (siehe .nav__inner), damit das Logo links exakt dort
   beginnt, wo auch der Seiteninhalt beginnt. */
/* position:relative (ohne eigenen z-index) reicht, damit .app im
   Stacking-Kontext als "positioniertes Element auf Stapel-Ebene 0" gilt und
   dadurch - weil im Quelltext NACH dem Schnee-Container - über dem
   fixierten Schnee liegt statt darunter (sonst würde ein unpositioniertes
   Element trotz späterer Reihenfolge im Quelltext HINTER positionierten
   Geschwisterelementen auf Ebene 0 gemalt, siehe .schnee weiter oben). */
.app{ max-width:1600px; margin:0 auto; padding:24px 20px 64px; position:relative; }
.app__eyebrow{
  font-family:'Karla',ui-sans-serif,sans-serif;
  font-size:12px; letter-spacing:.12em; text-transform:uppercase;
  color:var(--accent); font-weight:700;
}
.app__title{
  font-family:'Fjalla One',ui-sans-serif,sans-serif;
  font-size:clamp(26px,4vw,36px);
  letter-spacing:.01em;
}
.app__sub{ color:var(--ink-soft); font-size:15px; line-height:1.5; }

/* ---------- top navigation ---------- */
.nav{
  background:var(--paper); border-bottom:1px solid var(--line);
  position:sticky; top:0; z-index:40;
}
/* .nav selbst ist volle Breite (Hintergrund/Trennlinie sollen bis an den
   Bildschirmrand gehen) - der eigentliche Inhalt liegt in .nav__inner mit
   derselben max-width wie .app, damit das Logo links exakt dort beginnt,
   wo auch der übrige Seiteninhalt beginnt (nicht ganz am Bildschirmrand).
   position:relative, damit .nav__menu (siehe unten) sich daran statt an
   der vollen Breite von .nav ausrichtet. */
.nav__inner{
  max-width:1600px; margin:0 auto; position:relative;
  display:flex; align-items:center; justify-content:space-between;
  gap:12px; padding:10px 20px;
}

/* Kopfzeile jetzt bewusst schmal: kleines Icon-Logo + Name der GERADE
   OFFENEN Seite (statt vorher einem großen, unbeschnittenen Logo) - alle
   Seiten inkl. Konto/Abmelden liegen dafür in einem einzigen Menü hinter
   dem Hamburger-Knopf (.nav__menu weiter unten), nicht mehr direkt in der
   Kopfzeile. */
.nav__brand{ display:flex; align-items:center; gap:10px; min-width:0; }
.nav__brand-logo-link{ display:flex; flex:none; }
/* Gleiche Höhe wie der Menü-Knopf rechts (.nav__toggle, 38px) - beide sind
   Flex-Kinder von .nav__inner mit align-items:center, dadurch bekommen sie
   automatisch denselben Abstand nach oben/unten. Kein border-radius mehr -
   das Logo bleibt eckig. */
.nav__brand-logo{ display:block; height:38px; width:auto; }
.nav__brand-seite{
  font-family:'Fjalla One',ui-sans-serif,sans-serif; font-size:17px;
  color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  display:inline-block; transition:opacity .15s ease, transform .15s ease;
}
/* Kurzer Fade+Slide beim Wechsel zwischen Marke ("HGH SKI-BASAR") und
   Seitentitel (siehe Scroll-Logik in includes/kopf.php) statt eines
   abrupten Text-Sprungs. */
.nav__brand-seite--wechsel{ opacity:0; transform:translateY(-4px); }

.nav__toggle{
  display:inline-flex; align-items:center; justify-content:center;
  width:38px; height:38px; border-radius:9px; border:1px solid var(--line);
  background:var(--paper); cursor:pointer; flex:none;
}
.nav__toggle svg{ width:18px; height:18px; color:var(--ink); }

/* Ein einziges Dropdown-Menü für ALLE Seiten + Konto/Abmelden (ersetzt die
   früheren zwei getrennten: Seiten-Links-Leiste + Konto-Dropdown). Kein
   eigenes "display" gesetzt (Standard eines div ist block) - so reicht das
   reine [hidden]-Attribut zum Ein-/Ausblenden per JS, ohne dass eine
   Autor-Regel die Browser-Vorgabe [hidden]{display:none} überstimmen
   könnte (siehe .karte[hidden] weiter unten für den Hintergrund, warum das
   wichtig ist). */
.nav__menu{
  position:absolute; top:calc(100% + 8px); right:20px;
  width:270px; max-width:calc(100vw - 40px);
  background:var(--paper); border:1px solid var(--line); border-radius:12px;
  box-shadow:var(--shadow); padding:10px; z-index:50;
}
.nav__links{ display:flex; flex-direction:column; gap:2px; }
.nav__link{
  display:flex; align-items:center; justify-content:space-between; gap:8px;
  font-size:14px; font-weight:600; color:var(--ink-soft);
  text-decoration:none; padding:10px 10px; border-radius:8px;
}
.nav__link:hover{ background:var(--snow); color:var(--ink); }
.nav__link.is-active{ background:color-mix(in srgb, var(--accent) 14%, var(--snow)); color:var(--accent-deep); }
.nav__badge{
  min-width:17px; height:17px; padding:0 4px;
  border-radius:999px; background:var(--accent-warm); color:#fff;
  font-size:10.5px; font-weight:700; display:inline-flex;
  align-items:center; justify-content:center;
}

.nav__menu-footer{ margin-top:6px; padding-top:10px; border-top:1px solid var(--line); }
.nav__user-info{ display:flex; align-items:center; gap:10px; padding:2px 10px 12px; min-width:0; }
.nav__avatar-klein{
  width:30px; height:30px; border-radius:50%; flex:none;
  background:var(--accent-deep); color:#fff;
  font-family:'Karla',ui-sans-serif,sans-serif; font-weight:700; font-size:11.5px;
  letter-spacing:.02em; display:flex; align-items:center; justify-content:center;
}
.nav__user-name{ font-size:13px; font-weight:600; color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.nav__logout{
  display:block; text-align:center;
  font-size:12.5px; font-weight:700; color:var(--ink-soft);
  text-decoration:none; border:1px solid var(--line); border-radius:8px;
  padding:8px 10px;
}
.nav__logout:hover{ border-color:var(--accent); color:var(--accent-deep); }
/* Sitzt links neben "Abmelden" (Hamburger-Menü UND schmale Menüleiste,
   siehe .nav__sekundaer weiter unten) und klappt #klimateamBanner direkt
   unter der Menüleiste auf/zu (siehe includes/kopf.php). Bewusst als
   gleich hoher/breiter Knopf wie .nav__logout aufgebaut (identisches
   Padding/Rahmen/Radius), nicht einfach ein bloßes Icon. */
.nav__menu-footer-aktionen{ display:flex; align-items:center; gap:8px; }
.nav__menu-footer-aktionen .nav__logout{ flex:1; }
.nav__klimateam-knopf{
  flex:none; display:inline-flex; align-items:center; justify-content:center;
  background:var(--paper); border:1px solid var(--line); border-radius:8px;
  padding:8px 10px; cursor:pointer;
}
.nav__klimateam-knopf:hover, .nav__klimateam-knopf[aria-expanded="true"]{ border-color:var(--accent); }
.nav__klimateam-knopf img{ height:15px; width:auto; display:block; }

/* Zweite Leiste unter der Kopfzeile, NUR auf breiten Bildschirmen (siehe
   @media weiter unten): zeigt alle Seiten + Konto/Abmelden direkt
   ausgeklappt, ohne dass man dafür erst den Hamburger-Knopf braucht. Auf
   schmalen Bildschirmen bleibt es bei der einen Kopfzeile + Hamburger-Menü
   wie bisher (siehe .nav__toggle/.nav__menu oben). */
.nav__sekundaer{ display:none; }
.nav__sekundaer-links{ display:flex; align-items:center; gap:2px; flex-wrap:wrap; }
.nav__sekundaer-link{
  display:flex; align-items:center; gap:6px;
  font-size:13px; font-weight:600; color:var(--ink-soft);
  text-decoration:none; padding:6px 9px; border-radius:8px; white-space:nowrap;
}
.nav__sekundaer-link:hover{ background:var(--snow); color:var(--ink); }
.nav__sekundaer-link.is-active{ background:color-mix(in srgb, var(--accent) 14%, var(--snow)); color:var(--accent-deep); }
/* Nur noch der Abmelden-Knopf hier - Initialen/Name stehen bereits im
   Hamburger-Menü (.nav__menu-footer), auf der schmalen zweiten Leiste war
   das schlicht zu viel für wenig Mehrwert. */
.nav__sekundaer-konto{ display:flex; align-items:center; gap:8px; flex:none; }
.nav__sekundaer .nav__logout{ padding:6px 12px; }
.nav__sekundaer .nav__klimateam-knopf{ padding:6px 12px; }

@media (min-width:961px){
  /* Auf breiten Bildschirmen ist der Hamburger-Knopf anfangs überflüssig
     (die zweite Leiste zeigt ja schon alles) - er erscheint erst, sobald
     beim Scrollen die zweite Leiste einklappt (.nav--kompakt, siehe unten). */
  .nav__toggle{ display:none; }
  .nav--kompakt .nav__toggle{ display:inline-flex; }

  /* Exakt dieselbe Breite wie der übrige Seiteninhalt (.app/.nav__inner,
     820px) - nicht breiter. Bewusst OHNE Trennlinie zum Logo darüber (die
     gab es früher als border-top, war aber unerwünscht). */
  .nav__sekundaer{
    display:flex; align-items:center; justify-content:space-between; gap:16px;
    max-width:1600px; margin:0 auto; padding:8px 20px 10px;
    max-height:60px;
    overflow:hidden;
  }
  /* Sobald man scrollt (siehe Skript in includes/kopf.php), klappt diese
     Leiste ein - ihr Inhalt bleibt über den Hamburger-Knopf erreichbar
     (.nav__menu, gleicher Inhalt). BEWUSST OHNE CSS-transition auf
     max-height/padding (gab es früher, war die Ursache für Ruckeln beim
     Scrollen): max-height/padding sind layoutverändernde Eigenschaften -
     sie über ~280ms zu animieren zwingt den Browser, bei praktisch jedem
     einzelnen Scroll-Ereignis in diesem Zeitfenster neu Layout+Paint für
     die halbe Kopfzeile zu berechnen (die Nav ist zudem position:sticky,
     was das noch verschärft). Ein Wechsel von JS-Messzeitpunkt zu
     ResizeObserver (siehe includes/kopf.php) hat das NICHT gelöst, weil
     die eigentliche Kostenquelle die Animation selbst war, nicht in erster
     Linie deren Messung. Jetzt klappt die Leiste sofort/ohne Animation ein
     - genau wie das mobile Menü, der Filter-Umschalter und das
     KlimaTeam-Banner in dieser Anwendung ohnehin bereits sofort statt
     animiert umschalten (siehe dort) - dadurch fällt die wiederholte
     Neuberechnung während des Scrollens komplett weg. */
  .nav--kompakt .nav__sekundaer{
    max-height:0; padding-top:0; padding-bottom:0;
  }
}

/* Aufklappbares KlimaTeam-Banner direkt unter der Menüleiste (siehe
   .nav__klimateam-knopf oben und includes/kopf.php) - soll optisch genauso
   breit wirken wie der übrige, sichtbare Seiteninhalt (z. B. Filterleiste/
   Kartenraster oder Logo-bis-Abmelden in der Nav). Deren Breite ist NICHT
   820px, sondern 820px MINUS das eigene 20px-Innenabstand von .app/
   .nav__inner links+rechts, also 780px - denn .app/.nav__inner sind selbst
   schon die "Rahmen"-Box mit padding:...20px, ihr sichtbarer Inhalt liegt
   780px breit darin. Ein eigenes max-width:820px hier (wie zuvor) hätte
   dagegen den GRÜNEN Hintergrund bis an die volle 820px-Außenkante gemalt
   (padding zählt bei box-sizing:border-box zur Box, nicht zusätzlich dazu)
   - 20px auf jeder Seite breiter als der Rest des Seiteninhalts. Kein
   eigenes border-radius/border-top, damit es optisch direkt an die
   Menüleiste "anschließt". */
.klimateam-banner{
  max-width:780px; margin:0 auto; padding:14px 20px;
  background:color-mix(in srgb, var(--ok) 14%, var(--paper));
  border:1px solid color-mix(in srgb, var(--ok) 35%, var(--line)); border-top:0;
  border-radius:0 0 12px 12px;
  font-size:14px; color:var(--ink); text-align:center;
}
.klimateam-banner[hidden]{ display:none; }
.klimateam-banner p{ margin:0; }

/* ---------- im Browser bearbeitbare Textbausteine ---------- */
/* Für alle ohne Bearbeitungsrechte ist ".bearbeitbar" ein reiner,
   unsichtbarer Wrapper (kein data-schluessel, kein Stift-Knopf) - sieht
   optisch identisch zum reinen Text aus, siehe pistenmarktBearbeitbarerText()
   in includes/functions.php. */
.bearbeitbar--aktiv{ display:flex; align-items:flex-start; gap:6px; }
.bearbeitbar__anzeige{ min-width:0; flex:1 1 auto; }
.bearbeitbar__knopf{
  flex:none; display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; margin-top:1px; border-radius:6px; border:1px solid transparent;
  background:transparent; color:var(--ink-soft); cursor:pointer; opacity:.55;
  transition:opacity .15s ease, background .15s ease, border-color .15s ease;
}
.bearbeitbar__knopf svg{ width:13px; height:13px; }
.bearbeitbar__knopf:hover{ opacity:1; background:var(--snow); border-color:var(--line); color:var(--accent-deep); }
.bearbeitbar--bearbeitung{ display:block; }
.bearbeitbar--bearbeitung .bearbeitbar__anzeige{ display:block; }
.bearbeitbar__feld{
  display:block; width:100%; max-width:480px; font-family:inherit; font-size:14px; color:var(--ink);
  background:var(--snow); border:1.5px solid var(--accent); border-radius:9px; padding:8px 10px;
  margin-bottom:6px;
}
textarea.bearbeitbar__feld{ max-width:640px; min-height:90px; line-height:1.5; resize:vertical; }
.bearbeitbar__aktionen{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.bearbeitbar__speichern, .bearbeitbar__abbrechen{
  font-family:inherit; font-size:12.5px; font-weight:700; border-radius:8px; padding:6px 12px; cursor:pointer;
}
.bearbeitbar__speichern{ background:var(--accent-deep); color:#fff; border:1px solid var(--accent-deep); }
.bearbeitbar__speichern:hover{ background:var(--ink); }
.bearbeitbar__speichern:disabled, .bearbeitbar__abbrechen:disabled{ opacity:.6; cursor:default; }
.bearbeitbar__abbrechen{ background:var(--paper); color:var(--ink-soft); border:1px solid var(--line); }
.bearbeitbar__abbrechen:hover{ border-color:var(--accent); color:var(--accent-deep); }
.bearbeitbar__hinweis{ font-size:12px; color:var(--ink-soft); }
/* Platzhalter, wenn ein Untertitel absichtlich geleert wurde (siehe
   pistenmarktInhalt()/pistenmarktBearbeitbarerText() in
   includes/functions.php) - nur für Moderationsgruppen sichtbar, damit sie
   den Stift zum Wieder-Hinzufügen finden; alle anderen sehen an dieser
   Stelle einfach gar nichts. */
.bearbeitbar__leer-hinweis{ color:var(--ink-soft); font-style:italic; font-size:13px; }

/* ---------- flash messages ---------- */
.flash{
  border-radius:12px; padding:12px 16px; margin-bottom:18px;
  font-size:14px; font-weight:600; display:flex; align-items:flex-start; gap:10px;
  border:1px solid var(--line);
}
.flash svg{ width:18px; height:18px; flex:none; margin-top:1px; }
.flash--ok{ background:color-mix(in srgb, var(--ok) 12%, var(--paper)); color:var(--ok); border-color:color-mix(in srgb, var(--ok) 35%, var(--line)); }
.flash--fehler{ background:color-mix(in srgb, var(--accent-warm) 12%, var(--paper)); color:var(--accent-warm); border-color:color-mix(in srgb, var(--accent-warm) 35%, var(--line)); }

/* ---------- panel (forms, cards, generic boxes) ---------- */
.panel{
  background:var(--paper); border:1px solid var(--line);
  border-radius:var(--radius); box-shadow:var(--shadow); padding:22px;
}
.panel__heading{ font-family:'Fjalla One',sans-serif; font-size:18px; letter-spacing:.02em; margin-bottom:4px; }
.panel__hint{ color:var(--ink-soft); font-size:13px; margin-bottom:18px; line-height:1.5; }

/* ---------- Schritte-Liste (siehe so-gehts.php) ---------- */
.schritte{ display:flex; flex-direction:column; gap:20px; }
.schritt{ display:flex; gap:14px; align-items:flex-start; }
.schritt__nummer{
  width:32px; height:32px; border-radius:50%; flex:none;
  background:var(--accent-deep); color:#fff;
  font-family:'Karla',ui-sans-serif,sans-serif; font-weight:700; font-size:14px;
  display:flex; align-items:center; justify-content:center;
}
/* Schritt-Titel/-Text sind jetzt bearbeitbare Textbausteine (siehe
   so-gehts.php + pistenmarktBearbeitbarerText()) und deshalb keine echten
   <h2>/<p> mehr (die .bearbeitbar-Hülle dazwischen wäre sonst ungültiges
   HTML) - Optik bleibt identisch, .schritt__titel bekommt die
   Überschriftenfarbe deshalb explizit statt über die h1,h2,h3-Regel oben. */
.schritt__titel{
  font-family:'Fjalla One',sans-serif; font-size:16px; letter-spacing:.01em;
  color:var(--heisenberg-blau); margin:2px 0 4px; display:block;
}
.schritt__text{ color:var(--ink-soft); font-size:14px; line-height:1.55; }

/* Schritt-Gruppen ("Ich suche .../Ich biete ...", siehe so-gehts.php), jede
   mit eigener Überschrift und eigenem Hinzufügen-Knopf. Überschrift bewusst
   deutlich größer als vorher (15px), aber klar kleiner als die Seiten-<h1>
   (.app__title, clamp(26px,4vw,36px)) - dazwischen als eigene Ebene. */
.schritte-gruppe__titel{ font-size:21px; font-family:'Fjalla One',sans-serif; letter-spacing:.2px; margin-bottom:16px; }
.schritte-gruppe + .schritte-gruppe{ margin-top:8px; }
/* Fließtext-Block "Nutzungsbedingungen und Haftungsausschluss" (dritte
   Gruppe auf so-gehts.php) - reiner Absatztext statt nummerierter Schritte,
   daher eigene Anzeige-Klasse statt .schritt__text. */
.nutzungsbedingungen-text{ color:var(--ink-soft); font-size:14px; line-height:1.65; }
/* Der Text ist deutlich länger als die übrigen bearbeitbaren Textbausteine -
   beim Bearbeiten bekommt das Eingabefeld darum mehr Platz statt der sonst
   üblichen max-width:640px/min-height:90px (siehe .bearbeitbar__feld). */
.bearbeitbar:has(.nutzungsbedingungen-text) .bearbeitbar__feld{ max-width:100%; min-height:280px; }
/* Formular statt einfachem Knopf, weil Hinzufügen/Entfernen klassisch per
   POST+Redirect läuft (wie die Status-Knöpfe in meine-angebote.php),
   nicht per fetch() wie das reine Text-Bearbeiten oben. */
.schritt__entfernen-formular{ margin-left:auto; flex:none; }
.schritt__entfernen{
  width:24px; height:24px; border-radius:50%; flex:none;
  border:1px solid var(--line); background:var(--paper); color:var(--ink-soft);
  font-size:16px; line-height:1; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
}
.schritt__entfernen:hover{ border-color:var(--accent-warm); color:var(--accent-warm); background:color-mix(in srgb, var(--accent-warm) 10%, var(--paper)); }
.schritte-gruppe__hinzufuegen-formular{ margin-top:16px; }
.schritte-gruppe__hinzufuegen{
  width:100%; font-family:inherit; font-size:13px; font-weight:700; color:var(--accent-deep);
  background:transparent; border:1.5px dashed var(--line); border-radius:9px;
  padding:9px 14px; cursor:pointer;
}
.schritte-gruppe__hinzufuegen:hover{ border-color:var(--accent); background:var(--snow); }

/* ---------- form controls ---------- */
/* Kein fieldset:last-of-type-Sonderfall mehr: in neu.php ist "Zustand" das
   letzte <fieldset>, aber danach folgen noch weitere .field-group-Blöcke
   (Preisvorstellung usw.) - ein auf 0 gesetzter Abstand hier ließ die
   Zustand-Buttons direkt in die Preisvorstellung hineinlaufen, ohne
   sichtbaren Zwischenraum. */
fieldset{ border:0; padding:0; margin:0 0 20px; }
legend{ font-size:13px; font-weight:700; color:var(--ink); padding:0 0 8px; display:flex; align-items:center; gap:6px; }
legend .req{ color:var(--accent-warm); font-weight:700; }
/* Positiver statt negativer Abstand nach oben - vorher (-4px) rückte der
   Hinweistext optisch fast auf das Eingabefeld darüber (siehe Größe-Feld in
   neu.php). */
.field-note{ font-size:12px; color:var(--ink-soft); margin:8px 0; line-height:1.4; }
label.text-label{ display:block; font-size:13px; font-weight:700; margin-bottom:8px; }
label.text-label .req{ color:var(--accent-warm); }

input[type="text"], input[type="number"], input[type="email"], input[type="search"],
select, textarea{
  width:100%; font-family:inherit; font-size:14px; color:var(--ink);
  background:var(--snow); border:1px solid var(--line); border-radius:9px;
  padding:10px 12px; outline-offset:2px;
}
textarea{ resize:vertical; min-height:64px; line-height:1.5; }
input:focus-visible, select:focus-visible, textarea:focus-visible, .pill:has(input:focus-visible){
  outline:2px solid var(--accent);
}
.field-group{ margin-bottom:16px; }
.field-group:last-child{ margin-bottom:0; }

/* Preisvorstellung + "Kostenlose Leihe" nebeneinander in einer Zeile, statt
   das Eingabefeld über die volle Breite zu ziehen und den Leihe-Schalter
   darunter. .preis-eingabe ist jetzt der einzige positionierte Elternteil
   des €-Zeichens (vorher war das die ganze .price-row inkl. Label und
   Leihe-Pill darunter, wodurch "top:50%" sich auf die GESAMTE, viel höhere
   Zeile bezog statt nur auf das Eingabefeld - das €-Zeichen saß dadurch
   sichtbar nicht mittig). Das €-Zeichen steht jetzt rechts IM Feld (wie
   auch sonst im Deutschen üblich: "20 €" statt "€ 20") - die eingegebene
   Zahl daher rechtsbündig, direkt davor. */
.preis-zeile{ display:flex; align-items:stretch; gap:10px; flex-wrap:wrap; }
.preis-eingabe{ position:relative; flex:0 1 150px; min-width:110px; }
.preis-eingabe input{ padding-left:12px; padding-right:34px; width:100%; text-align:right; }
.preis-eingabe::after{
  content:"€"; position:absolute; right:12px; top:50%; transform:translateY(-50%);
  color:var(--ink-soft); font-weight:700; pointer-events:none;
}
/* Grau + gesperrt, sobald "Kostenlose Leihe" ausgewählt ist (siehe
   Skript in neu.php, setzt zusätzlich value="0"). */
.preis-eingabe input:disabled{ background:var(--line); color:var(--ink-soft); cursor:not-allowed; }
/* VB / Fixpreis / Kostenlose Leihe: alle drei gleich breit, mit
   zentriertem Text (statt der linksbündigen .pill--compact-Vorgabe).
   .preistyp-gruppe (VB+Fixpreis) ist bewusst KEIN eigener Flex-Container
   mehr (display:contents) - so stehen alle drei Pills als gleichwertige,
   direkte Geschwister in .preis-zeile und bekommen über denselben
   flex-basis/flex-grow zuverlässig exakt dieselbe Breite, statt dass zwei
   davon in einer verschachtelten Zwischen-Gruppe eigene Maße hätten.
   Selektor bewusst ".preis-zeile .pill--preistyp" (zwei Klassen) statt nur
   ".pill--preistyp" (eine Klasse) - sonst gleiche Spezifität wie
   ".pill--compact" weiter unten, und dessen linksbündige Vorgabe würde
   wegen der späteren Position im Stylesheet gewinnen (siehe bekanntes
   CSS-Kaskade-Problem in diesem Projekt: bei gleicher Spezifität gewinnt
   die später stehende Regel, unabhängig vom Inhalt). */
.preistyp-gruppe{ display:contents; }
.preis-zeile .pill--preistyp, .preis-zeile .pill--leihe{
  flex:1 1 130px; justify-content:center; min-width:0; padding:9px 14px;
}

.pill-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(96px,1fr)); gap:8px; }
.pill-grid.pill-grid--3{ grid-template-columns:repeat(3,1fr); }
/* auto-fit statt auto-fill: leere, unbenutzte Spalten fallen weg, die
   vorhandenen 4 Zustand-Buttons strecken sich dadurch zuverlässig über die
   volle Breite statt bei bestimmten Bildschirmbreiten schmaler zu bleiben,
   weil auto-fill zusätzliche leere Spalten offen gehalten hätte. */
.pill-grid.pill-grid--2col{ grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); }
.pill-grid.pill-grid--1col{ grid-template-columns:1fr; }

.pill{
  position:relative; display:flex; flex-direction:column; align-items:center;
  gap:4px; text-align:center; border:1.5px solid var(--line); border-radius:10px;
  padding:10px 6px 8px; cursor:pointer; background:var(--snow);
  transition:border-color .15s ease, background .15s ease;
}
.pill svg{ width:20px; height:20px; color:var(--ink-soft); }
.pill span{ font-size:12px; font-weight:600; line-height:1.25; }
.pill small{ font-size:10.5px; color:var(--ink-soft); font-weight:500; }
.pill input{ position:absolute; inset:0; margin:0; opacity:0; cursor:pointer; }
.pill:has(input:checked){ border-color:var(--accent); background:color-mix(in srgb, var(--accent) 12%, var(--snow)); }
.pill:has(input:checked) svg{ color:var(--accent-deep); }
.pill:has(input:checked) span{ color:var(--accent-deep); }
/* Grau + gesperrt (z. B. VB/fix, sobald "Kostenlose Leihe" ausgewählt ist,
   siehe Skript in neu.php) - bewusst NACH der :checked-Regel oben, damit
   das Grau auch bei einer zuvor schon angewählten Pille gewinnt. */
.pill:has(input:disabled){ border-color:var(--line); background:var(--line); cursor:not-allowed; }
.pill:has(input:disabled) span{ color:var(--ink-soft); }
.pill:has(input:disabled) input{ cursor:not-allowed; }

.pill--compact{ flex-direction:row; gap:6px; padding:7px 10px; justify-content:flex-start; }
.pill--compact svg{ width:16px; height:16px; flex:none; }
.pill--compact span{ min-width:0; white-space:normal; text-align:left; line-height:1.2; }

/* Schriftart bewusst NICHT mehr JetBrains Mono (Monospace stammte
   unverändert aus der Pistenzettel-Vorlage) - dadurch sahen Knöpfe wie
   "Angebot veröffentlichen" oder "Filter anzeigen/ausblenden" sichtbar
   anders aus als der restliche Text (Karla, z. B. Labels/Pills/Abmelden-
   Knopf). font-family:inherit gleicht das an - betrifft ALLE .btn-Knöpfe
   auf allen Seiten (Bearbeiten/Löschen/Status ändern usw.), nicht nur die
   zwei gemeldeten Stellen. */
.btn{
  font-family:inherit; font-weight:700; font-size:13px;
  color:#fff; background:var(--accent-deep);
  border:0; border-radius:9px; padding:11px 18px; cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  text-decoration:none;
}
.btn:hover{ background:var(--accent); }
.btn svg{ width:16px; height:16px; }
.btn--ghost{ background:transparent; color:var(--ink); border:1px solid var(--line); }
.btn--ghost:hover{ background:var(--snow); border-color:var(--accent); color:var(--accent-deep); }
.btn--warn{ background:var(--accent-warm); }
.btn--warn:hover{ background:#96361f; }
/* Positive Variante (z. B. "Verkauft bzw. abgegeben" im Löschgrund-Dialog
   auf meine-angebote.php) - dieselbe Grün-Farbe wie .status-badge--aktiv. */
.btn--ok{ background:var(--ok); }
.btn--ok:hover{ background:#245f3e; }
.btn--block{ width:100%; }
.btn--sm{ padding:8px 12px; font-size:12px; }
.print-btn{ /* Alias, damit alte Klasse aus der Vorlage weiter funktioniert */ }

/* ---------- marketplace layout ---------- */
/* Die Filterleiste steht jetzt IMMER (auch auf breiten Bildschirmen) als
   eigene Zeile ÜBER dem Kartenraster statt als schmale linke Spalte
   daneben - deshalb nur noch eine einzige Spalte. Die frühere
   280px-1fr-Aufteilung ist absichtlich nicht mehr vorhanden. */
.markt-layout{ display:grid; grid-template-columns:1fr; gap:22px; align-items:start; }

/* Bewusst KEIN position:sticky (mehr) - die Filterleiste soll beim
   Scrollen ganz normal mit dem übrigen Seiteninhalt unter die Navigation
   wegscrollen, nicht darüber "kleben" bleiben (das führte vorher dazu,
   dass sie dauerhaft über den Karten schwebte, solange sie nicht
   ausgeblendet war). */
.filter-panel{ position:static; }

/* Auf Mobile ist der eigentliche Filterinhalt standardmäßig eingeklappt -
   ein Knopf blendet ihn bei Bedarf ein. Auf breiteren Bildschirmen bleibt
   alles wie gehabt dauerhaft sichtbar, der Knopf ist dort unnötig. */
.filter-toggle-btn{ display:none; width:100%; margin-bottom:16px; }
.filter-toggle-btn svg{ width:16px; height:16px; transition:transform .15s ease; }
.filter-toggle-btn[aria-expanded="true"] svg{ transform:rotate(180deg); }
@media (max-width:960px){
  .filter-toggle-btn{ display:flex; }
  .filter-inhalt{ display:none; }
  .filter-inhalt.is-open{ display:block; }
}

.filter-gruppe{ margin-bottom:18px; }
.filter-gruppe:last-child{ margin-bottom:0; }
/* .filter-zeile (z. B. Geschlecht+Zustand nebeneinander) ist KEIN
   .filter-gruppe, bekommt also nicht automatisch deren Abstand nach
   unten - ohne diese Regel rückt die nächste Gruppe (Suche) zu dicht
   heran. Selber Wert wie .filter-gruppe, damit die Abstände einheitlich
   wirken. */
.filter-zeile{ margin-bottom:18px; }
.filter-gruppe__label{ font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.06em; color:var(--ink-soft); margin-bottom:8px; display:block; }
.filter-reset{ font-size:12.5px; color:var(--accent-warm); font-weight:700; text-decoration:none; }
/* Nur sichtbar, sobald tatsächlich mindestens ein Filter aktiv ist (siehe
   marktplatz.js) - startet daher hier zusätzlich mit [hidden] im HTML. */
.filter-reset[hidden]{ display:none; }

/* Buttons in der Filterleiste zeigen ihren Text (bzw. Icon+Text bei
   Kategorie) immer zentriert an - unabhängig von der Bildschirmbreite,
   deshalb bewusst NICHT in einer Media Query. Überschreibt die
   linksbündige Vorgabe von .pill--compact (die für andere Stellen wie
   z. B. "Kostenlose Leihe" auf neu.php unverändert bleiben soll, daher
   hier auf .filter-panel eingegrenzt). */
.filter-panel .pill--compact{ justify-content:center; }

/* Der neue Desktop-Knopf (siehe weiter unten) ist auf Mobile unsichtbar -
   dort regelt weiterhin allein der bestehende .filter-toggle-btn oben das
   Ein-/Ausklappen. WICHTIG: diese Regel muss VOR der min-width:961px-Regel
   stehen, die ihn dort wieder sichtbar macht - bei gleicher Spezifität
   (eine einzelne Klasse) gewinnt sonst schlicht die später im Stylesheet
   stehende Regel, unabhängig von der Media Query. */
.filter-toggle-desktop-btn{ display:none; }

/* Ab 961px: Kategorie und Größe bekommen weiterhin je eine eigene volle
   Zeile (Größe direkt unter Kategorie). Geschlecht+Zustand stehen dagegen
   nebeneinander in einer Zeile (siehe .filter-zeile, Geschlecht links,
   Zustand rechts) - Suche steht als letztes wieder in einer eigenen,
   vollen Zeile ganz unten. */
@media (min-width:961px){
  /* Kategorie: weiterhin mehrspaltig mit Umbruch bei Bedarf - war bisher
     als .pill-grid--1col extra für die schmale 280px-Sidebar auf eine
     einzige Säule ausgelegt, jetzt darf sie die volle Zeilenbreite nutzen. */
  .filter-gruppe--kategorie .pill-grid{ grid-template-columns:repeat(auto-fill,minmax(110px,1fr)); }

  /* Größe: IMMER nur eine Zeile hoch, kein Umbruch - bei mehr Größen, als
     hineinpassen, wird die Zeile horizontal scrollbar statt in die zweite
     Zeile umzubrechen. */
  .filter-gruppe--groesse .pill-grid{
    display:flex; flex-wrap:nowrap; overflow-x:auto; gap:8px; padding-bottom:3px;
  }
  .filter-gruppe--groesse .pill{ flex:0 0 auto; min-width:46px; }

  /* Geschlecht + Zustand nebeneinander in einer Zeile - jede Gruppe
     bekommt die Hälfte der Breite (Reihenfolge im Markup: Geschlecht,
     dann Zustand). */
  .filter-zeile{ display:flex; gap:28px; align-items:flex-start; }
  .filter-zeile > .filter-gruppe{ flex:1 1 0; min-width:0; margin-bottom:0; }

  /* Innerhalb dieser Zeile: Buttons richten sich nach der Breite ihres
     eigenen Textes (flex-basis:auto), wachsen aber zusammen auf die volle
     verfügbare Breite (flex-grow:1) - statt wie bei Kategorie in
     gleich breiten Rasterspalten. Dazu bewusst kleiner (Schrift/Padding),
     damit trotz der halbierten Zeilenbreite genug Platz bleibt. */
  .filter-zeile .pill-grid{ display:flex; flex-wrap:wrap; gap:6px; }
  .filter-zeile .pill{ flex:1 1 auto; }
  .filter-zeile .pill{ padding:5px 7px; }
  .filter-zeile .pill span{ font-size:11px; }

  .filter-toggle-desktop-btn{ display:inline-flex; }
  .filter-toggle-desktop-btn svg{ width:14px; height:14px; transition:transform .15s ease; }
  /* Pfeilrichtung: zeigt nach OBEN ("einklappen") solange die Gruppen
     sichtbar sind (aria-expanded="true"), und nach UNTEN ("ausklappen"),
     sobald sie ausgeblendet sind - das war zuvor genau andersrum. */
  .filter-toggle-desktop-btn[aria-expanded="true"] svg{ transform:rotate(180deg); }
  /* Nur diese Klasse (per Skript auf #filterGruppen umgeschaltet, siehe
     marktplatz.js) blendet die eigentlichen Filtergruppen aus - existiert
     bewusst NUR hier in der Desktop-Media-Query, sodass sie auf Mobile
     (wo derselbe Ein-/Ausklapp-Mechanismus schon über .filter-toggle-btn/
     .filter-inhalt läuft) keinerlei Wirkung hat. */
  .filter-gruppen--eingeklappt{ display:none; }
}

/* Zahl der Angebote + Sortierung (links) und "Filter zurücksetzen" (nur
   bei aktivem Filter, siehe marktplatz.js) + Ein-/Ausblenden-Knopf (rechts)
   stehen zusammen in einer Zeile (siehe Markup in index.php) ganz oben in
   der weißen Box (.filter-panel) - bewusst AUSSERHALB von .filter-inhalt,
   damit diese Zeile inkl. Ein-/Ausblenden-Knopf immer sichtbar bleibt,
   auch wenn die Filtergruppen gerade ausgeblendet sind. Trennlinie darunter
   grenzt sie optisch vom übrigen Panel-Inhalt ab. */
.markt-toolbar{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  margin-bottom:18px; padding-bottom:16px; border-bottom:1px solid var(--line);
  flex-wrap:wrap;
}
.markt-toolbar__gruppe{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
.markt-toolbar__count{ font-size:13.5px; color:var(--ink-soft); }
.markt-toolbar__count b{ color:var(--ink); }
.sortier-select{ width:auto; min-width:180px; }
.filter-werkzeuge{ display:flex; align-items:center; gap:16px; }

.karten-raster{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); gap:16px;
}
.leerzustand{ text-align:center; padding:60px 20px; color:var(--ink-soft); }
.leerzustand svg{ width:48px; height:48px; margin-bottom:12px; color:var(--line); }

/* ---------- Fußzeile (aktuell nur auf index.php, siehe dort) ---------- */
.seiten-fuss{ margin-top:40px; padding:20px; border-top:1px solid var(--line); text-align:center; }
.seiten-fuss__inner{ max-width:1600px; margin:0 auto; }
.seiten-fuss a{ font-size:13px; font-weight:600; color:var(--ink-soft); text-decoration:none; }
.seiten-fuss a:hover{ color:var(--accent-deep); text-decoration:underline; }

/* ---------- listing card ---------- */
.karte{
  background:var(--paper); border:1px solid var(--line); border-radius:var(--radius);
  overflow:hidden; box-shadow:var(--shadow); display:flex; flex-direction:column;
  cursor:pointer; text-align:left; padding:0;
  transition:transform .15s ease, box-shadow .15s ease;
}
/* WICHTIG: .karte setzt oben explizit display:flex - ohne diese eigene
   Regel würde das per JS gesetzte [hidden]-Attribut (assets/js/marktplatz.js)
   NICHT wirken, weil eine Autor-Regel mit gleicher Spezifität die
   Browser-Vorgabe "[hidden]{display:none}" nie überstimmt (das war der
   Grund für gefilterte, aber trotzdem sichtbare Angebote). */
.karte[hidden]{ display:none; }
.karte:hover{ transform:translateY(-3px); box-shadow:0 4px 8px rgba(22,42,58,.1), 0 16px 32px -16px rgba(22,42,58,.28); }
.karte__foto{ position:relative; aspect-ratio:4/3; background:var(--snow); overflow:hidden; }
.karte__foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.karte__foto-platzhalter{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; color:var(--line); }
.karte__foto-platzhalter svg{ width:40px; height:40px; }
.karte__status{
  position:absolute; top:10px; left:10px; padding:4px 9px; border-radius:999px;
  font-size:10.5px; font-weight:700; letter-spacing:.03em; text-transform:uppercase;
  background:rgba(255,255,255,.92); color:var(--ink);
}
.karte__status--reserviert{ color:var(--accent-deep); }
.karte__status--verkauft{ color:var(--accent-warm); }
.karte__preis{
  position:absolute; bottom:10px; right:10px; max-width:78%; background:var(--accent-warm); color:#fff;
  font-family:'Karla',ui-sans-serif,sans-serif; font-weight:700; font-size:14px;
  padding:5px 10px; border-radius:8px; box-shadow:0 4px 10px -4px rgba(181,67,46,.6);
  text-align:right; line-height:1.2;
}
/* "Kostenlose Leihe" ist deutlich länger als ein Preis wie "25 €" - eigene,
   etwas kleinere Variante statt Überlaufen/Abschneiden. */
.karte__preis--leihe{ font-size:11px; background:var(--ok); box-shadow:0 4px 10px -4px rgba(46,125,79,.5); }
.karte__foto-anzahl{
  position:absolute; bottom:10px; left:10px; background:rgba(20,30,38,.65); color:#fff;
  font-size:11px; font-weight:700; padding:4px 8px; border-radius:7px;
  display:flex; align-items:center; gap:4px;
}
.karte__foto-anzahl svg{ width:12px; height:12px; }
.karte__body{ padding:14px 14px 16px; display:flex; flex-direction:column; gap:8px; flex:1; }
.karte__kategorie{ display:flex; align-items:center; gap:8px; min-width:0; }
.karte__kategorie-icon{ width:26px; height:26px; border-radius:50%; background:var(--snow); display:flex; align-items:center; justify-content:center; flex:none; }
.karte__kategorie-icon svg{ width:14px; height:14px; color:var(--accent-deep); }
.karte__kategorie-text{ font-family:'Fjalla One',sans-serif; font-size:15.5px; color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex:0 1 auto; }
/* Marke steht jetzt rechtsbündig am anderen Ende der Zeile (margin-left:
   auto schiebt sie in der Flex-Zeile ganz nach rechts, weg von der
   Kategorie) statt wie zuvor direkt danach mit Trennpunkt - der Punkt
   ergibt bei der Distanz zur Kategorie keinen Sinn mehr und ist daher
   raus. Schriftgröße/-art wie die Kategorie (gleiche Schriftfamilie/
   -größe), nur die Farbe bleibt das gedämpfte Grau, damit die Kategorie
   optisch trotzdem führend bleibt. */
.karte__kategorie-marke{
  font-family:'Fjalla One',sans-serif; font-size:15.5px; color:var(--ink-soft);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; flex:0 1 auto;
  margin-left:auto; padding-left:8px;
}
/* Alle drei Labels (Geschlecht/Größe/Zustand) als Gruppe mittig statt links
   ausgerichtet - justify-content:center wirkt bei flex-wrap auch dann
   zentriert, wenn die Tags in mehrere Zeilen umbrechen. */
.karte__meta{ display:flex; flex-wrap:wrap; justify-content:center; gap:6px; }
.tag{
  font-size:11px; font-weight:700; color:var(--ink-soft); background:var(--snow);
  border:1px solid var(--line); border-radius:999px; padding:3px 9px;
}
.karte__eigenes{ font-size:11.5px; font-weight:700; color:var(--accent); margin-top:auto; }

/* ---------- modal / lightbox ---------- */
.overlay{
  position:fixed; inset:0; background:rgba(14,21,27,.62); backdrop-filter:blur(2px);
  display:flex; align-items:center; justify-content:center; padding:20px; z-index:100;
}
.overlay[hidden]{ display:none; }
.modal{
  background:var(--paper); border-radius:16px; max-width:720px; width:100%;
  max-height:88vh; overflow:auto; box-shadow:var(--shadow); position:relative;
}
.modal__schliessen{
  position:absolute; top:12px; right:12px; width:34px; height:34px; border-radius:50%;
  background:var(--paper); border:1px solid var(--line); cursor:pointer;
  display:flex; align-items:center; justify-content:center; z-index:5;
}
.modal__schliessen svg{ width:16px; height:16px; color:var(--ink); }

.detail__fotos{ position:relative; background:var(--ink); aspect-ratio:4/3; }
.detail__fotos img{ width:100%; height:100%; object-fit:contain; display:block; background:#0E151B; cursor:zoom-in; }
.detail__fotos-nav{
  position:absolute; top:50%; transform:translateY(-50%); width:38px; height:38px;
  border-radius:50%; background:rgba(255,255,255,.9); border:0; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
}
.detail__fotos-nav svg{ width:18px; height:18px; color:var(--ink); }
.detail__fotos-nav--prev{ left:10px; } .detail__fotos-nav--next{ right:10px; }
.detail__fotos-punkte{ position:absolute; bottom:10px; left:0; right:0; display:flex; justify-content:center; gap:5px; }
.detail__fotos-punkte span{ width:6px; height:6px; border-radius:50%; background:rgba(255,255,255,.5); }
.detail__fotos-punkte span.is-aktiv{ background:#fff; }
.detail__body{ padding:22px; }
.detail__kopf{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; margin-bottom:14px; }
.detail__titel{ font-family:'Fjalla One',sans-serif; font-size:22px; }
.detail__preis{ font-family:'Karla',ui-sans-serif,sans-serif; font-weight:700; font-size:20px; color:var(--accent-warm); white-space:nowrap; text-align:right; }
.detail__preis--leihe{ color:var(--ok); white-space:normal; }
.detail__meta{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px; }
.detail__beschreibung{ font-size:14.5px; line-height:1.6; color:var(--ink); margin-bottom:18px; }
.detail__anbieter{ font-size:13px; color:var(--ink-soft); border-top:1px dashed var(--line); padding-top:14px; }

.lightbox{ position:fixed; inset:0; background:rgba(6,10,14,.92); z-index:200; display:flex; align-items:center; justify-content:center; }
.lightbox[hidden]{ display:none; }
.lightbox img{ max-width:92vw; max-height:88vh; object-fit:contain; }
.lightbox__schliessen{
  position:absolute; top:16px; right:16px; width:40px; height:40px; border-radius:50%;
  background:rgba(255,255,255,.14); border:0; cursor:pointer; display:flex; align-items:center; justify-content:center;
}
.lightbox__schliessen svg{ width:18px; height:18px; color:#fff; }

/* ---------- Foto-Upload (neu.php) ---------- */
.foto-upload{ border:1.5px dashed var(--line); border-radius:12px; padding:16px; text-align:center; background:var(--snow); }
.foto-upload input[type="file"]{ font-size:13px; }
.foto-vorschau{ display:flex; flex-wrap:wrap; gap:10px; margin-top:12px; }
.foto-vorschau__item{ position:relative; width:84px; height:84px; border-radius:10px; overflow:hidden; border:1px solid var(--line); }
.foto-vorschau__item img{ width:100%; height:100%; object-fit:cover; display:block; }
.foto-vorschau__entfernen{
  position:absolute; top:3px; right:3px; width:20px; height:20px; border-radius:50%;
  background:rgba(20,30,38,.7); border:0; color:#fff; cursor:pointer; font-size:13px; line-height:1;
  display:flex; align-items:center; justify-content:center;
}

/* ---------- meine-angebote / anfragen tables ---------- */
.liste{ display:flex; flex-direction:column; gap:12px; }
.liste-eintrag{
  display:flex; gap:14px; align-items:flex-start; padding:14px; border:1px solid var(--line);
  border-radius:12px; background:var(--paper);
}
.liste-eintrag__foto{ width:64px; height:64px; border-radius:9px; overflow:hidden; flex:none; background:var(--snow); }
.liste-eintrag__foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.liste-eintrag__inhalt{ flex:1; min-width:0; }
.liste-eintrag__titel{ font-weight:700; font-size:14.5px; margin-bottom:2px; }
.liste-eintrag__meta{ font-size:12.5px; color:var(--ink-soft); }
.liste-eintrag__aktionen{ display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
.status-badge{ font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.03em; padding:3px 8px; border-radius:999px; }
.status-badge--aktiv{ background:color-mix(in srgb, var(--ok) 16%, var(--paper)); color:var(--ok); }
.status-badge--reserviert{ background:color-mix(in srgb, var(--accent) 16%, var(--paper)); color:var(--accent-deep); }
.status-badge--verkauft{ background:color-mix(in srgb, var(--accent-warm) 16%, var(--paper)); color:var(--accent-warm); }
.status-badge--neu{ background:color-mix(in srgb, var(--accent-warm) 16%, var(--paper)); color:var(--accent-warm); }
.status-badge--gelesen{ background:var(--snow); color:var(--ink-soft); }
.status-badge--beantwortet{ background:color-mix(in srgb, var(--ok) 16%, var(--paper)); color:var(--ok); }

/* ---------- login pages ---------- */
.login-body{ display:flex; min-height:100vh; align-items:center; justify-content:center; padding:20px; }
/* position:relative aus demselben Grund wie bei .app (siehe dort) - sonst
   würde der fixierte Schnee über der Login-Karte statt dahinter liegen. */
.login-buehne{ width:100%; max-width:420px; position:relative; }
.login-konsole{
  background:var(--paper); border:1px solid var(--line); border-radius:18px;
  box-shadow:var(--shadow); padding:32px 28px; text-align:center; position:relative; overflow:hidden;
}
.login-logo{ width:190px; max-width:70%; height:auto; margin:0 auto 12px; display:block; }
/* Doppelt so groß wie im ersten Entwurf - dafür nicht mehr auf die exakte
   Logobreite begrenzt (width:auto), sonst würde der größere Text umbrechen
   oder über den Rand der Login-Karte hinausragen. */
.login-marke{
  width:auto; max-width:100%; margin:0 auto 22px;
  font-family:'Fjalla One',ui-sans-serif,sans-serif;
  font-size:30px; letter-spacing:.03em; text-align:center;
  color:var(--heisenberg-blau); white-space:nowrap;
}
/* Bewusst nicht mehr volle Kartenbreite (width:100%, wie im allerersten
   Entwurf), sondern etwas schmaler als .login-logo (190px/max 70%) - dafür
   mit margin:0 auto zentriert statt sich über block+100% zu strecken.
   Farbton bewusst identisch zu den ausgewählten Menüeinträgen in der
   Navigation (siehe .nav__link.is-active/.nav__sekundaer-link.is-active),
   nicht das kräftigere Heisenberg-Blau - für einen einheitlichen Look
   zwischen Login-Knopf und "aktueller Seite" in der Navigation. */
.login-iserv-knopf{
  display:block; width:175px; max-width:65%; margin:4px auto 0; text-align:center;
  padding:13px 8px; border-radius:10px; font-weight:700; font-size:14.5px; text-decoration:none;
  white-space:nowrap; background:color-mix(in srgb, var(--accent) 14%, var(--snow)); color:var(--accent-deep);
}
.login-iserv-knopf:hover{ background:color-mix(in srgb, var(--accent) 24%, var(--snow)); }
.login-fehler{ background:color-mix(in srgb, var(--accent-warm) 12%, var(--paper)); color:var(--accent-warm); border-radius:10px; padding:10px 12px; font-size:13.5px; text-align:left; }
.login-formular{ text-align:left; margin-top:10px; }
/* Kleiner Hinweis unterhalb des Anmelde-Knopfs, dass der Ski-Basar ein
   Projekt des KlimaTeams ist (siehe login.php) - bewusst dezent (kleines
   Logo + kleiner Text), damit der Anmelde-Knopf selbst im Vordergrund bleibt. */
.login-klimateam{ margin-top:28px; }
.login-klimateam-logo{ width:56px; height:auto; margin:0 auto 6px; display:block; }
.login-klimateam-text{ font-size:11.5px; color:var(--ink-soft); margin:0; }

/* ---------- utility ---------- */
.visually-hidden{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; }

@media print{
  .nav, .filter-panel, .markt-toolbar{ display:none !important; }
}

/* =====================================================================
   Hüttenküche – Ergänzungen (Rezeptkarten, Gruppen, Mitglieder)
   Zielgerät: iPad 11" (834 pt hochkant / 1194 pt quer) – große Tippflächen
   ===================================================================== */
.rezept-grid{ display:grid; grid-template-columns:repeat(2,1fr); gap:16px; }
@media (min-width:1000px){ .rezept-grid{ grid-template-columns:repeat(3,1fr); } }
@media (max-width:520px){ .rezept-grid{ grid-template-columns:1fr; } }
.rezept-karte{ display:flex; flex-direction:column; background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); box-shadow:var(--shadow); overflow:hidden; text-decoration:none; color:var(--ink); transition:transform .12s ease, border-color .12s ease; }
.rezept-karte:hover{ border-color:var(--accent); transform:translateY(-2px); }
.rezept-karte__foto{ display:block; aspect-ratio:4/3; background:var(--snow); }
.rezept-karte__foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.rezept-karte__leer{ display:grid; place-items:center; height:100%; color:var(--ink-soft); font-size:13px; }
.rezept-karte__text{ padding:12px 14px 14px; display:flex; flex-direction:column; gap:2px; }
.rezept-karte__text strong{ font-family:'Fjalla One',sans-serif; font-weight:400; font-size:18px; letter-spacing:.01em; color:var(--heisenberg-blau); }
.rezept-karte__text small{ color:var(--ink-soft); font-size:13px; }

.gruppen-karte{ display:flex; justify-content:space-between; align-items:center; gap:14px; margin-bottom:12px; text-decoration:none; color:var(--ink); min-height:64px; }
.gruppen-karte:hover{ border-color:var(--accent); }
.gruppen-karte strong{ font-family:'Fjalla One',sans-serif; font-weight:400; font-size:18px; color:var(--heisenberg-blau); }
.gruppen-karte small{ color:var(--ink-soft); font-size:13px; }
.gruppen-karte__badges{ display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end; }

.liste-eintrag{ display:flex; gap:14px; align-items:flex-start; padding:12px 0; border-top:1px solid var(--line); }
.liste-eintrag:first-of-type{ border-top:0; }
.liste-eintrag__foto{ width:72px; height:72px; }
.liste-eintrag__titel a{ color:var(--ink); text-decoration:none; }
.liste-eintrag__aktionen form{ margin:0; }
.liste-eintrag__aktionen .btn{ min-height:40px; }
.rueckmeldung{ margin:8px 0 2px; background:color-mix(in srgb, var(--accent-warm) 10%, var(--paper)); border:1px solid color-mix(in srgb, var(--accent-warm) 30%, var(--line)); border-radius:9px; padding:8px 10px; font-size:13.5px; }
.zurueckgeben{ display:flex; gap:8px; margin-top:8px; }
.zurueckgeben input{ flex:1; }

.mitglieder{ display:flex; flex-wrap:wrap; gap:8px; }
.mitglied{ display:inline-flex; align-items:center; gap:4px; background:var(--snow); border:1px solid var(--line); border-radius:999px; padding:6px 6px 6px 12px; font-size:13.5px; font-weight:600; }
.mitglied form{ display:inline; margin:0; }
.mitglied__x{ appearance:none; border:0; background:transparent; width:28px; height:28px; border-radius:50%; cursor:pointer; color:var(--ink-soft); font-size:14px; }
.mitglied__x:hover{ background:color-mix(in srgb, var(--accent-warm) 15%, var(--paper)); color:var(--accent-warm); }

/* größere Tippflächen auf Touch-Geräten */
@media (pointer:coarse){
  .btn{ min-height:44px; }
  input[type="text"], input[type="number"], input[type="email"], input[type="search"], select{ min-height:44px; font-size:16px; }
  textarea{ font-size:16px; }
}
.leerzustand.panel p{ margin:0 0 8px; }
.seiten-fuss a{ padding:10px; display:inline-block; }
.panel .liste-eintrag{ background:none; border:0; border-top:1px solid var(--line); border-radius:0; box-shadow:none; padding:14px 0; }
.panel .liste-eintrag:first-of-type{ border-top:0; padding-top:4px; }
.zurueckgeben input{ min-width:0; width:auto; }
.zurueckgeben .btn{ flex:none; }
.liste-eintrag__inhalt{ min-width:0; }
.liste-eintrag__foto{ flex:none; border-radius:9px; overflow:hidden; background:var(--snow); }
@media (min-width:1400px){ .rezept-grid{ grid-template-columns:repeat(4,1fr); } }
/* Tags */
.tags{ display:flex; flex-wrap:wrap; gap:6px; margin-top:6px; }
.tag{ display:inline-block; font-size:11.5px; font-weight:700; padding:3px 9px; border-radius:999px; background:var(--snow); color:var(--accent-deep); border:1px solid var(--line); text-decoration:none; }
.tag--vegan{ background:color-mix(in srgb, var(--ok) 14%, var(--paper)); color:var(--ok); border-color:color-mix(in srgb, var(--ok) 35%, var(--line)); }
.tag--vegetarisch{ background:color-mix(in srgb, #7A9A2E 14%, var(--paper)); color:#5B7420; border-color:color-mix(in srgb, #7A9A2E 35%, var(--line)); }
a.tag:hover, .tag.is-aktiv{ background:var(--accent-deep); color:#fff; border-color:var(--accent-deep); }
.filterzeile{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-bottom:18px; }
.filterzeile .tag{ font-size:13px; padding:7px 14px; min-height:36px; display:inline-flex; align-items:center; }
.zeile2{ display:grid; grid-template-columns:1fr 200px; gap:12px; }
@media (max-width:560px){ .zeile2{ grid-template-columns:1fr; } }
