/**
 * angebote.css: Die Angebote-Seite
 *
 * Alle Farben und Abstände kommen aus den Tokens in design-system.css.
 * Kein einziger Hex-Wert hier drin, ändert sich die Palette, zieht diese
 * Seite automatisch mit.
 */

/* ── Kopfzeile mit den Zahlen ─────────────────────────────────────── */
.page-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-lg);
  margin-bottom: var(--space-lg);
  flex-wrap: wrap;
}

.angebote-stats {
  display: flex;
  gap: var(--space-md);
}

.stat {
  text-align: center;
  min-width: 64px;
}

.stat__wert {
  font-size: var(--font-size-lg);
  font-weight: var(--font-weight-bold);
  color: var(--color-text);
  line-height: 1.2;
}

.stat__label {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* Die "zu prüfen"-Zahl sticht hervor, sie ist eine Aufforderung, keine Info. */
.stat--warn .stat__wert { color: var(--color-warning); }

/* ── Zwei Spalten: links einfügen, rechts ansehen ──────────────────── */
.angebote-grid {
  display: grid;
  grid-template-columns: minmax(380px, 1fr) minmax(420px, 1.2fr);
  gap: var(--space-lg);
  align-items: start;
}

.angebote-right {
  display: flex;
  flex-direction: column;
  gap: var(--space-lg);
}

/* Auf schmalen Bildschirmen untereinander. */
@media (max-width: 900px) {
  .angebote-grid { grid-template-columns: 1fr; }
}

/* Hier standen die Regeln für das Feld "Beitrag von Hand einfügen" samt
   seiner Vorschau-Tabelle. Das Feld ist weg, der Forum-Abruf holt die
   Beiträge von allein. */

/* ── Preise ───────────────────────────────────────────────────────── */
.preis-alt {
  text-decoration: line-through;
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  margin-right: 4px;
}

.preis-neu {
  font-weight: var(--font-weight-semibold);
  color: var(--color-text);
}

.preis-rabatt {
  color: var(--color-success);
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  margin-left: 4px;
}

/* Kein Preis = "—", NICHT "0 DR".
   Eine 0 würde behaupten, das Item sei gratis gewesen. Das ist etwas
   grundsätzlich anderes als "der Beitrag nennt keinen Preis". */
.preis-keiner { color: var(--color-text-muted); }

/* ── Aktuell im Shop ──────────────────────────────────────────────── */
.aktuell-item {
  padding: var(--space-md) 0;
  border-bottom: 1px solid var(--color-border-subtle);
}

.aktuell-item:last-child { border-bottom: none; }

.aktuell-item__kopf {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-sm);
  margin-bottom: 4px;
}

.aktuell-item__zeit {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

.aktuell-item__titel {
  font-weight: var(--font-weight-semibold);
  color: var(--color-text);
  margin-bottom: var(--space-xs);
}

.aktuell-item__items {
  list-style: none;
  margin: 0;
  padding: 0;
}

.aktuell-item__items li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-sm);
  padding: 3px 0;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}

.aktuell-item__preis { white-space: nowrap; }

/* ── Prüf-Liste ───────────────────────────────────────────────────── */
.card--warning { border-left: 3px solid var(--color-warning); }

.pruef-item {
  padding: var(--space-sm) 0;
  border-bottom: 1px solid var(--color-border-subtle);
  font-size: var(--font-size-sm);
}

.pruef-item:last-child { border-bottom: none; }

.pruef-item__kopf {
  display: flex;
  gap: var(--space-sm);
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  margin-bottom: 2px;
}

.pruef-item__erkannt { color: var(--color-text); }

.pruef-item__roh {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  margin-top: 2px;
}

.pruef-item__roh code {
  background: var(--color-border-subtle);
  padding: 1px 5px;
  border-radius: var(--radius-sm);
  font-family: ui-monospace, monospace;
}

/* ── Historie ─────────────────────────────────────────────────────── */
.historie-tabelle {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--font-size-sm);
}

.historie-tabelle td {
  padding: var(--space-sm) var(--space-xs);
  border-bottom: 1px solid var(--color-border-subtle);
  vertical-align: middle;
}

.historie-datum {
  color: var(--color-text-muted);
  white-space: nowrap;
  font-size: var(--font-size-xs);
}

.historie-typ { white-space: nowrap; }

.historie-titel {
  color: var(--color-text);
  width: 100%;
}

.historie-titel a {
  color: var(--color-primary);
  text-decoration: none;
}

.historie-titel a:hover { text-decoration: underline; }

.historie-anzahl {
  text-align: right;
  color: var(--color-text-secondary);
  white-space: nowrap;
}

/* Ein Rad hat keine Angebote, es hat Gewinne. Die Zahl steht trotzdem in
   derselben Spalte, also muss dranstehen, WAS sie zählt. */
.historie-anzahl__art {
  font-size: 0.75em;
  color: var(--color-text-secondary);
  margin-left: 3px;
  opacity: 0.75;
}

/* ── "Inhalt fehlt" ──────────────────────────────────────────────────────
   Rot heißt hier nicht "kaputt", sondern "hier ist noch Handarbeit fällig":
   ein Beitrag ohne ein einziges Item und ohne Kisteninhalt. Meist ein Flash
   Deal, dessen Items nur im Bild stehen.

   Bewusst nur ein linker Balken und eine leichte Tönung, keine knallrote
   Zeile. Sonst schreit die Liste, und was ständig schreit, überliest man. */
.historie-zeile--leer > td {
  background: var(--color-danger-subtle, #fdecec);
}
.historie-zeile--leer > td:first-child {
  box-shadow: inset 3px 0 0 var(--color-danger, #c0392b);
}

.historie-fehlt {
  display: inline-block;
  margin-left: var(--space-xs);
  padding: 1px 6px;
  border-radius: var(--radius-sm);
  background: var(--color-danger, #c0392b);
  color: var(--color-on-accent);
  font-size: var(--font-size-xs, 11px);
  font-weight: var(--font-weight-medium);
  white-space: nowrap;
  cursor: help;
}


/* ═══════════════════════════════════════════════════════════════════
 *  RANKING
 * ═══════════════════════════════════════════════════════════════════ */

.page-header__rechts {
  display: flex;
  align-items: center;
  gap: var(--space-lg);
  flex-wrap: wrap;
}

/* ── Tabs ─────────────────────────────────────────────────────────── */
.angebote-tabs {
  display: flex;
  gap: 4px;
  background: var(--color-border-subtle);
  padding: 3px;
  border-radius: var(--radius-md);
}

.angebote-tab {
  padding: 6px 14px;
  border-radius: var(--radius-sm);
  text-decoration: none;
  color: var(--color-text-secondary);
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-medium);
  transition: all var(--transition-fast);
}

.angebote-tab:hover { color: var(--color-text); }

.angebote-tab.active {
  background: var(--color-surface);
  color: var(--color-primary);
  box-shadow: var(--shadow-sm);
}

/* ── Kopfzeile mit Suche ──────────────────────────────────────────── */
.ranking-kopf {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-lg);
  flex-wrap: wrap;
}

.ranking-suche {
  max-width: 260px;
  margin: 0;
}

.ranking-filter {
  display: flex;
  gap: var(--space-lg);
  margin-top: var(--space-md);
  flex-wrap: wrap;
}

.ranking-check {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  cursor: pointer;
}

.ranking-check__hint {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}

/* ── Legende ──────────────────────────────────────────────────────────
 *  Steht bewusst ÜBER der Tabelle, nicht in einem Tooltip, den keiner
 *  findet. Wer die Zahlen liest, muss wissen, wie belastbar sie sind,
 *  sonst liest er sie falsch.
 *  ─────────────────────────────────────────────────────────────────── */
.ranking-legende {
  background: var(--color-border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-sm) var(--space-md);
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
  line-height: 2;
  margin-bottom: var(--space-md);
}

.ranking-legende .badge { margin-right: 4px; }
.ranking-legende .badge:not(:first-child) { margin-left: var(--space-md); }

/* ── Tabelle ──────────────────────────────────────────────────────── */
.ranking-tabelle {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--font-size-sm);
}

.ranking-tabelle th {
  text-align: left;
  padding: var(--space-xs) var(--space-sm);
  border-bottom: 1px solid var(--color-border);
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.ranking-tabelle td {
  padding: var(--space-sm);
  border-bottom: 1px solid var(--color-border-subtle);
  vertical-align: middle;
}

.ta-r { text-align: right; }
.ranking-tabelle th.ta-r { text-align: right; }

.ranking-zeile { cursor: pointer; transition: background var(--transition-fast); }
.ranking-zeile:hover { background: var(--color-border-subtle); }

/* Überfällige Zeilen fallen auf. Das ist die Information, wegen der man
   überhaupt auf diese Seite geht. */
.zeile--ueberfaellig { background: var(--color-danger-subtle); }
.zeile--ueberfaellig:hover { background: var(--color-danger-subtle); filter: brightness(0.97); }

.ranking-name {
  font-weight: var(--font-weight-medium);
  color: var(--color-text);
  width: 100%;
}

.ranking-name .badge { margin-left: 6px; }

.ranking-stern {
  color: var(--color-warning);
  margin-left: 4px;
}

.ranking-rhythmus,
.ranking-zuletzt {
  white-space: nowrap;
  color: var(--color-text-secondary);
}

.ranking-conf { margin-top: 2px; }

.ranking-datum {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  margin-top: 2px;
}

.ranking-merken {
  font-size: 16px;
  line-height: 1;
  padding: 4px 8px;
}

.ranking-hinweis {
  margin-top: var(--space-md);
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  text-align: center;
}

/* ══════════════════════════════════════════════════════════════════════════
   DER SCROLLKASTEN, die Seite steht still, die Liste bewegt sich
   ══════════════════════════════════════════════════════════════════════════
   Vorher war die SEITE der Scrollbereich. Bei 1.400 Zeilen bedeutete das:
   Die Kopfzeile wandert nach oben aus dem Bild, und ab Zeile 40 weiß niemand
   mehr, welche Spalte "Rhythmus" ist und welche "Zuletzt".

       Eine Tabelle ohne sichtbare Kopfzeile ist keine Tabelle.
       Sie ist eine Reihe von Zahlen ohne Bedeutung.

   Jetzt scrollt nur dieser Kasten, und die Kopfzeile klebt darin fest. Die
   Fußleiste mit der Blätterung steht darunter und ist damit IMMER sichtbar,
   man muss nicht ans Ende scrollen, um zu erfahren, dass es weitergeht.

   max-height in vh, nicht in px: Auf einem großen Bildschirm zeigt der Kasten
   mehr Zeilen, auf einem kleinen weniger. Eine feste Pixelhöhe wäre auf dem
   einen zu klein und auf dem anderen zu groß, und auf beiden falsch. */
.liste-scroll {
  max-height: 62vh;
  overflow-y: auto;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
}

.liste-scroll thead th {
  position: sticky;
  top: 0;
  z-index: 2;
  /* Undurchsichtig! Ohne eigenen Hintergrund scrollen die Zeilen DURCH die
     Kopfzeile hindurch, man liest zwei Texte übereinander und hält es sofort
     für einen Fehler. Zu Recht.
     --color-surface ist der Hintergrund der Karte, in der die Tabelle steht;
     damit passt die Kopfzeile in jedem Farbschema, auch im dunklen. */
  background: var(--color-surface);
  box-shadow: 0 1px 0 var(--color-border);
}

/* ── Die Fußleiste: blättern links, Seitengröße rechts ───────────────────
   "liste-", nicht "ranking-": Ranking UND Aufräumen benutzen dieselbe Leiste.
   Ein Bauteil, das an zwei Stellen steht, darf nicht nach einer davon heißen,
   sonst traut sich beim nächsten Mal niemand, es in der dritten zu benutzen.

   Die Leiste stand vorher auf Kante: 4px zwischen den Seitenzahlen, kein
   Abstand nach unten, und die Zahl "1 bis 20 von 2598" klebte am Auswahlfeld.
   Bei zwölf Knöpfen nebeneinander wird daraus ein Ziffernband, in dem man die
   gesuchte Seite sucht, statt sie zu sehen.

       Zahlen brauchen mehr Luft als Wörter. Ein Wort hat eine Form,
       an der das Auge es wiedererkennt, eine 7 hat nur ihren Platz. */
.liste-fuss {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-lg);
  flex-wrap: wrap;
  margin-top: var(--space-lg);
  margin-bottom: var(--space-md);
}

.liste-blaettern {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
}

.liste-seite {
  min-width: 36px;
  height: 36px;
  padding: 0 var(--space-md);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--color-text);
  font-size: var(--font-size-sm);
  cursor: pointer;
}

.liste-seite:hover:not(:disabled) {
  background: var(--color-border-subtle);
}

.liste-seite:disabled {
  opacity: .35;
  cursor: default;
}

/* Die aktuelle Seite ist die einzige Information in dieser Leiste, die man
   wirklich BRAUCHT. Also ist sie die einzige, die Farbe bekommt. */
.liste-seite--aktiv {
  background: var(--color-primary);
  border-color: var(--color-primary);
  color: var(--color-on-accent);
  font-weight: 600;
}

.liste-luecke {
  padding: 0 var(--space-xs);
  color: var(--color-text-muted);
}

/* "1 bis 20 von 2598" und das Auswahlfeld sind zwei getrennte Dinge: eine
   Auskunft und ein Bedienelement. Standen sie dicht beieinander, sah es aus
   wie eine Beschriftung des Feldes. */
.liste-proseite {
  display: flex;
  align-items: center;
  gap: var(--space-md);
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

.liste-proseite select {
  width: auto;
  padding: var(--space-xs) var(--space-sm);
  font-size: var(--font-size-xs);
}

/* Der Scrollkasten für Listen ohne Tabellenkopf (Aufräum-Seite).
   Etwas flacher als das Ranking: Auf dieser Seite stehen DREI Listen
   untereinander, jede darf nur so viel Platz nehmen, dass man die nächste
   noch ahnt. Eine Seite, die nur eine Liste zeigt, verschweigt die anderen. */
.liste-box {
  max-height: 46vh;
  overflow-y: auto;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-sm);
}

.liste-suche {
  margin-bottom: var(--space-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   DIE GRUPPENKÖPFE, eine Überschrift, ein Satz, eine Zahl
   ══════════════════════════════════════════════════════════════════════════
   Vorher stand hier eine farbige Zeile ("240 × beweisbar, der Name steht so
   in den Spieldaten") und darunter ein vierzeiliger Erklärblock in derselben
   Schriftgröße wie die Item-Zeilen. Beides zusammen war eine Textwand, durch
   die man hindurchscrollt, ohne sie zu lesen, und dann sieht man auch die
   Warnung nicht mehr, die darin steht.

   Jetzt: Überschrift (fett, kurz), die Zahl als Marke daneben, EIN Satz, der
   die Sache erklärt, und das Kleingedruckte kleiner. Wer nur den Titel liest,
   weiß bereits genug. Wer den Satz liest, weiß, warum.
   ══════════════════════════════════════════════════════════════════════════ */
.karte__kopf {
  flex: 1;
  min-width: 0;   /* sonst sprengt langer Text die Flex-Zeile statt umzubrechen */
}

.gruppe__kopf {
  padding: var(--space-sm) var(--space-md);
  border-radius: var(--radius-md) var(--radius-md) 0 0;
  border: 1px solid var(--color-border);
  border-bottom: none;
}

/* Dieselben Farbtöne, die die Gruppen schon vorher hatten, grün = Beweis,
   gelb = Vorsicht. Die Farbe ist die Aussage; sie darf sich nicht ändern, nur
   weil ich die Überschrift umgebaut habe. */
.gruppe__kopf--sicher   { background: var(--color-success-subtle, #eefaf3); }
.gruppe__kopf--gesperrt { background: var(--color-warn-subtle, #fff8e1); }
.gruppe__kopf--unsicher { background: var(--color-warn-subtle, #fff8e1); }

.gruppe__zeile {
  display: flex;
  align-items: baseline;
  gap: var(--space-sm);
  flex-wrap: wrap;
}

.gruppe__titel {
  font-size: var(--font-size-md);
  font-weight: var(--font-weight-bold);
  color: var(--color-text);
  margin: 0;
}

/* Die Zahl als Marke. Sie steht NEBEN dem Titel, nie darin: Eine Überschrift,
   die mit ihrer eigenen Zahl umbricht, ist keine Überschrift mehr. */
.gruppe__zahl {
  padding: 1px 8px;
  border-radius: 999px;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-secondary);
  white-space: nowrap;
}

/* ══════════════════════════════════════════════════════════════════════════
   KISTENINHALTE
   ══════════════════════════════════════════════════════════════════════════
   Als Chips, nicht als Tabelle. Eine Tabelle verspricht Struktur: Spalten,
   Werte, Vergleichbarkeit. Hier gibt es nichts zu vergleichen: Es ist eine
   Aufzählung dessen, was drin sein KANN. Die Darstellung soll sagen, was die
   Sache ist, und nicht mehr. */
.inhalt-liste {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: var(--space-xs);
}

/* Das Kärtchen ist jetzt ein KNOPF, kein Text mehr. Es öffnet etwas, also muss
   es sich auch so anfühlen: Hand-Zeiger, Hover, Tastaturfokus. Ein anklickbares
   Ding, das aussieht wie Beschriftung, findet niemand. */
.inhalt-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 10px;
  border: 1px solid transparent;
  border-radius: 999px;
  background: var(--color-border-subtle);
  font-size: var(--font-size-xs);
  font-family: inherit;
  color: var(--color-text-secondary);
  cursor: pointer;
  transition: background var(--transition-fast, 120ms),
              border-color var(--transition-fast, 120ms),
              color var(--transition-fast, 120ms);
}
.inhalt-chip:hover,
.inhalt-chip:focus-visible {
  background: var(--color-surface);
  border-color: var(--color-primary, #2563eb);
  color: var(--color-text);
}

/* Ein Kärtchen ohne Item dahinter (das Ding war nie einzeln im Shop) führt
   nirgendwohin. Es zeigt beim Drüberfahren trotzdem seinen Kasten, aber es
   verspricht keinen Klick, den es nicht einlösen kann. */
.inhalt-chip:not([data-chip-item]) { cursor: default; }

.inhalt-chip__bild {
  width: 18px;
  height: 18px;
  object-fit: contain;
}

/* ══════════════════════════════════════════════════════════════════════════
   DAS ITEM-FENSTER ÜBER EINEM TRUHENINHALT
   ══════════════════════════════════════════════════════════════════════════
   Vorbild ist der Tooltip aus dem Spiel: ein kleiner Kasten, direkt am Ding,
   ohne die Seite zu verlassen. Das Aussehen ist bewusst UNSERES, ein schwarzer
   Spiel-Tooltip mit goldener Schrift wäre hier ein Fremdkörper (und die Grafik
   gehört Gameforge).

   position: fixed, weil das Fenster am Bildschirm hängt, nicht am Dokument. Es
   steht ja über einer Liste, die selbst scrollt.
   ══════════════════════════════════════════════════════════════════════════ */
.item-pop {
  position: fixed;
  z-index: 1200;
  min-width: 240px;
  /* Der Kasten ist so breit, wie sein Inhalt es verlangt, nicht so breit, wie
     ich es vorher geraten habe. Eine feste Breite zwingt sonst die Namen in die
     Knie (siehe .item-pop__inhalt-liste).

     Die Obergrenze bleibt: nie breiter als der Bildschirm, und nie so breit,
     dass aus dem Tooltip ein Fenster wird. */
  width: max-content;
  max-width: min(880px, 94vw);
  padding: var(--space-md);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xl);
  font-size: var(--font-size-sm);
  line-height: 1.5;
  animation: dialog-auf 120ms ease-out;

  /* DER WICHTIGSTE ZWEI ZEILEN IN DIESER DATEI:
     Der Kasten hängt am Zeiger. Ohne pointer-events:none läge er UNTER der Maus,
     der Browser hielte ihn für das Ziel, das Kärtchen bekäme ein "mouseout",
     der Kasten schlösse sich, die Maus wäre wieder über dem Kärtchen, er ginge
     auf, und so weiter. Ein Flackern, dreißigmal pro Sekunde.

     Er ist zum Lesen da, nicht zum Anfassen. Also ist er für die Maus Luft. */
  pointer-events: none;
}

.item-pop__kopf {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  padding-bottom: var(--space-sm);
  margin-bottom: var(--space-sm);
  border-bottom: 1px solid var(--color-border-subtle);
  font-weight: var(--font-weight-semibold);
  font-size: var(--font-size-md);
  color: var(--color-text);
}

/* Der Name nimmt sich den Platz, der übrig ist, und bricht um, statt den Preis
   aus dem Kasten zu schieben. */
.item-pop__name { flex: 1 1 auto; min-width: 0; }

/* Der letzte Preis steht im Kopf, nicht in der Tabelle: Er ist die Zahl, wegen
   der man hinschaut. Alles darunter erklärt sie nur. */
.item-pop__preis {
  flex: 0 0 auto;
  padding: 1px 8px;
  border-radius: 999px;
  background: var(--color-bg-subtle);
  color: var(--color-text);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.item-pop__bild { width: 24px; height: 24px; object-fit: contain; flex: 0 0 auto; }

/* Kein Bild? Ein gepunkteter Rahmen statt einer Lücke. Eine Lücke sieht aus wie
   ein Fehler; ein Platzhalter sagt: hier fehlt etwas, und das ist bekannt. */
.item-pop__bild--leer {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-sm);
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}

/* ── Die Marken: Verlässlichkeit und Fälligkeit ──────────────────────────
   "alle 304 T" klingt nach einer Zusage. "schwankend" daneben sagt, dass es
   keine ist. Die Warnung gehört an die Zahl, nicht in eine Fußnote, dorthin
   schaut niemand, der es eilig hat. */
.item-pop__marken {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-bottom: var(--space-xs);
}

.item-pop__marke {
  padding: 1px 8px;
  border-radius: 999px;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-medium);
  white-space: nowrap;
}
.item-pop__marke--gut {
  background: var(--color-success-subtle, #e7f6ec);
  color: var(--color-success, #1e7a3c);
}
.item-pop__marke--warn {
  background: var(--color-warn-subtle, #fff8e1);
  color: var(--color-warning, #8a6100);
}
.item-pop__marke--schlecht {
  background: var(--color-danger-subtle, #fdecec);
  color: var(--color-danger, #c0392b);
}
/* "nicht mehr im Shop" ist keine Warnung, sondern ein Nachruf. Grau. */
.item-pop__marke--tot {
  background: var(--color-bg-subtle);
  color: var(--color-text-muted);
}

.item-pop__zahlen { margin: 2px 0; }

.item-pop__zeile {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-md);
  padding: 3px 0;
  color: var(--color-text-muted);   /* das Label leiser … */
}
.item-pop__zeile strong {
  color: var(--color-text);          /* … der Wert führt */
  font-weight: var(--font-weight-semibold);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Der Nebenwert (vor 726 T · 251 bis 357) steht neben dem Hauptwert, nicht in einer
   eigenen Zeile: Er beantwortet keine eigene Frage, er relativiert nur. */
.item-pop__leise {
  color: var(--color-text-muted);
  font-weight: var(--font-weight-normal);
}

/* "War nie einzeln im Shop" ist keine Fehlermeldung, sondern ein Ergebnis.
   Also grau und ruhig, nicht rot. */
.item-pop__leer,
.item-pop__laedt {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  line-height: 1.45;
  padding: var(--space-xs) 0;
}

/* ── Der Shop-Text im Tooltip ─────────────────────────────────────────────
   Bei einem Shop-Paket ist er die einzige Auskunft, die es überhaupt gibt. */
.item-pop__text {
  margin-top: var(--space-xs);
  padding-top: var(--space-xs);
  border-top: 1px solid var(--color-border-subtle);
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
  line-height: 1.45;
}
.item-pop__text > div { white-space: normal; }

/* ── Und in der Detailansicht: der ganze Text ───────────────────────────── */
.detail-text {
  margin: var(--space-md) 0;
  padding: var(--space-sm) var(--space-md);
  border-left: 3px solid var(--color-primary, #2563eb);
  background: var(--color-bg-subtle);
  border-radius: var(--radius-sm);
  font-size: var(--font-size-sm);
  line-height: 1.5;
}
.detail-text__kopf {
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-secondary);
  margin-bottom: 4px;
}

/* ── Der Bonus im Hover ────────────────────────────────────────────────────
   Zwei, drei kurze Zeilen wie "+15% EXP-Bonus". Sie sind der Grund, warum man
   ein Pet-Siegel kauft, und sollen deshalb ins Auge fallen, ohne zu schreien:
   etwas kräftigere Schrift, grüner Ton, kein Kasten drumherum. Ein eigener
   Rahmen würde sie zu einem dritten Block machen, sie sind aber nur eine
   Ergänzung der Zeilen darüber. */
.item-pop__bonus {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-top: 6px;
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-medium);
  color: var(--color-success, #16a34a);
}

/* ── Die Wiki-Felder (Funktion, Bonus, Herkunft …) ─────────────────────────
   Mehrere kleine Abschnitte in EINEM Kasten. Jeder bekommt eine eigene, leise
   Überschrift, sonst liefe "Funktion" nahtlos in "Bonus" über und man müsste
   beim Lesen raten, wo das eine aufhört. Der Abstand macht die Trennung, nicht
   eine Linie: Es sind Geschwister, keine getrennten Kästen. */
.wiki-feld + .wiki-feld { margin-top: 10px; }
.wiki-feld__kopf {
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-tertiary, var(--color-text-secondary));
  text-transform: uppercase;
  letter-spacing: .04em;
  margin-bottom: 2px;
}
.wiki-feld__text {
  color: var(--color-text-primary);
  line-height: 1.55;
}

/* ── Die geordnete Shop-Beschreibung ───────────────────────────────────────
   Drei Sorten Zeile, drei Gewichte. Geteilt von Detailansicht (.detail-text)
   und Tooltip (.item-pop__text), damit beide gleich aussehen.
   Vorher lagen alle Zeilen als gleichrangige <div> übereinander, eine Wand.
   Jetzt: die Merkmale als ruhige Punkteliste (das Wesentliche), die Werbung
   leise darunter, der Hinweis abgesetzt als Kleingedrucktes. */
.shop-merkmale {
  list-style: none;
  margin: 0;
  padding: 0;
}

.shop-merkmale li {
  position: relative;
  padding-left: 14px;
  margin: 3px 0;
}

.shop-merkmale li::before {
  content: "";
  position: absolute;
  left: 2px;
  top: 0.5em;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--color-primary, #2563eb);
  opacity: 0.5;
}

/* Werbung ist kein Merkmal, sie steht leiser und kursiv, damit das Auge sie
   als Ton, nicht als Fakt liest. */
.shop-fliess {
  margin: 7px 0 0;
  color: var(--color-text-muted);
  font-style: italic;
}

/* Der Hinweis ist das Kleingedruckte: abgesetzt durch eine feine Linie, kleiner
   und ruhig, da, aber nie im Weg. */
.shop-hinweis {
  margin: 8px 0 0;
  padding-top: 6px;
  border-top: 1px dashed var(--color-border-subtle, rgba(0, 0, 0, 0.12));
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  line-height: 1.4;
}

.shop-hinweis__label {
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-secondary);
  margin-right: 4px;
}

/* ── Der mögliche Inhalt IM Tooltip ──────────────────────────────────────
   Damit beantwortet der Kasten über einer Truhe die Frage, wegen der man
   hinschaut, ohne dass man die Truhe erst aufklappen muss. */
.item-pop__inhalt {
  margin-top: var(--space-xs);
  padding-top: var(--space-xs);
  border-top: 1px solid var(--color-border-subtle);
}

.item-pop__inhalt-kopf {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-sm);
  margin-bottom: 5px;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-secondary);
}
.item-pop__inhalt-stand {
  font-weight: var(--font-weight-normal);
  color: var(--color-text-muted);
  white-space: nowrap;
}

/* ══════════════════════════════════════════════════════════════════════════
   SPALTEN, DIE SICH NACH DEN NAMEN RICHTEN: NICHT UMGEKEHRT
   ══════════════════════════════════════════════════════════════════════════
   Erster Versuch: drei gleich breite Spalten (1fr). Sieht sauber aus, bis der
   erste lange Name kommt:

       Wüstenprinzessin+ (braun) …
       Mondsichelchen-Truhe (30 …

   Ein Item-Name, der genau dort abbricht, wo er sich von seinem Nachbarn
   unterscheidet, ist kein Name mehr. Er ist ein Rätsel. Und dann ist die ganze
   Liste wertlos: Man hat sie ja aufgeschlagen, um zu WISSEN, was drin ist.

       Lieber ein breiterer Kasten als ein abgeschnittener Name.

   Also: grid-auto-flow: column mit max-content-Spalten. Die Zeilenzahl gibt das
   JS vor (--zeilen), die Breite ergibt sich aus dem längsten Namen. Der Kasten
   wird so breit, wie der Inhalt es verlangt, und nie breiter als der Bildschirm
   (max-width am .item-pop).
   ══════════════════════════════════════════════════════════════════════════ */
.item-pop__inhalt-liste {
  display: grid;
  grid-auto-flow: column;
  grid-template-rows: repeat(var(--zeilen, 8), auto);
  grid-auto-columns: max-content;
  gap: 2px 18px;
}

.item-pop__inhalt-zeile {
  display: flex;
  align-items: center;
  gap: 5px;
  min-width: 0;
  padding: 1px 0;
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
}

/* Der Name steht GANZ da. Kein Umbruch (das würde die Rasterung zerstören,
   wegen der man die Liste überfliegen kann), kein Abschneiden (das würde den
   Namen zerstören, wegen dem man sie liest). Die Spalte richtet sich nach ihm. */
.item-pop__inhalt-name {
  white-space: nowrap;
}

/* Die Trefferchance aus der Itemshop-Tabelle ("· 17,5 %"). Leise und mit
   gleichen Ziffernbreiten, damit die Prozente untereinander stehen. */
.item-pop__inhalt-chance {
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

/* Das Bildchen ist der Grund, warum man die Liste überfliegen kann, statt sie zu
   lesen. Fehlt eins, hält ein leerer Platz die Spalte trotzdem in der Flucht,
   sonst tanzen die Namen, und das Raster ist dahin. */
.item-pop__inhalt-zeile img,
.item-pop__inhalt-kein-bild {
  flex: 0 0 auto;
  width: 16px;
  height: 16px;
  object-fit: contain;
}

.item-pop__inhalt-zeile--rest {
  color: var(--color-text-muted);
  font-style: italic;
  padding-left: 21px;      /* auf einer Linie mit den Namen daneben */
}

/* (.item-pop__fuss ist weggefallen. Dort stand "Klick öffnet die ganze
   Historie", ein Versprechen, das der Kasten nicht überall einlöst: Über einer
   Ranking-Zeile stimmt es, über einem Kärtchen ohne Item dahinter nicht. Ein
   Hinweis, der manchmal lügt, ist schlechter als keiner. Wer die Zeile öffnen
   will, klickt sie ohnehin an, das muss ihm niemand sagen.) */

/* ── Die laufenden Angebote als Kärtchen ─────────────────────────────────
   Dasselbe Kärtchen wie beim Truheninhalt, nur mit Preis. Ein Item ist ein
   Item, egal aus welcher Sorte Beitrag es kommt. */
.aktuell-item__chips { margin-top: var(--space-xs); }

.inhalt-chip--preis { padding-right: 4px; }

.inhalt-chip__preis {
  margin-left: 5px;
  padding: 1px 7px;
  border-radius: 999px;
  background: var(--color-surface);
  color: var(--color-text);
  font-weight: var(--font-weight-semibold);
  font-variant-numeric: tabular-nums;
}
.inhalt-chip--preis:hover .inhalt-chip__preis { background: var(--color-bg-subtle); }

/* Die Gewinn-Chance im Rad-Chip ("· 12 %"). Leise, mit gleichen Ziffernbreiten,
   damit die Prozente ruhig neben den Namen stehen. */
.inhalt-chip__chance {
  margin-left: 4px;
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

/* ── Die Gewinne in "Aktuell im Shop" ─────────────────────────────────────
   Sie stehen NEBEN der Preisliste, nicht darin: Ein Gewinn hat keinen Preis,
   und eine Zeile mit "— DR" dahinter wäre eine Antwort auf eine Frage, die
   niemand gestellt hat. */
.aktuell-item__gewinne {
  margin-top: var(--space-xs);
  padding-top: var(--space-xs);
}

.aktuell-item__gewinne-kopf {
  display: block;
  margin-bottom: 5px;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

/* Die Ebenen des Rads sind gleichwertige Abschnitte, keine Nachschläge. Also
   bekommt jede Luft und eine feine Linie davor, damit man sieht, wo eine
   aufhört und die nächste anfängt. Eine Haarlinie reicht dafür, mehr wäre
   Dekoration. */
.rad-ebene + .rad-ebene {
  margin-top: var(--space-md);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border-subtle);
}

/* Die Ebenen-Überschrift trägt jetzt ihren Abschnitt, vorher war sie nur eine
   Zeile mit Doppelpunkt davor. Etwas heller und mit Abstand nach unten. */
.rad-ebene > .aktuell-item__gewinne-kopf {
  margin-bottom: var(--space-sm);
  color: var(--color-text-secondary);
  font-size: var(--font-size-sm);
}

/* (.inhalt-hinweis ist weggefallen, der Hinweistext gehörte zur Inhalts-Liste
   in der Detailansicht, und die ist im Tooltip aufgegangen. Eine CSS-Klasse, die
   niemand mehr benutzt, ist kein harmloser Rest: Beim nächsten Mal sucht man,
   wo sie herkommt, und findet nichts.) */

/* Die Kisten-Treffer über der Ranking-Tabelle. Sie sind eine ANDERE Sorte
   Antwort, deshalb ein eigener Kasten und keine Zeile in der Tabelle. */
.kisten-treffer {
  margin-bottom: var(--space-md);
  padding: var(--space-sm) var(--space-md);
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-border-subtle);
}

.kisten-kopf {
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-secondary);
  margin-bottom: 4px;
}

/* Die Zahl in der Überschrift ("(11 Fundstellen)"). Ein leiser Zusatz, keine
   zweite Überschrift. */
.kisten-anzahl {
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-normal);
  color: var(--color-text-muted);
}

/* Der Knopf "Icon für alle wählen" in der Kopfzeile. Ein leiser Textknopf,
   der erst auffällt, wenn man ihn sucht. */
.kisten-icon-alle {
  margin-left: var(--space-md);
  padding: 2px 8px;
  font-size: var(--font-size-xs);
  color: var(--color-accent, #2563eb);
  background: none;
  border: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.12));
  border-radius: 6px;
  cursor: pointer;
}
.kisten-icon-alle:hover {
  background: var(--color-bg-subtle, rgba(0, 0, 0, 0.04));
}

/* Die Icon-Spalte: so schmal wie ihr Inhalt, mittig, und anklickbar. Ein Klick
   irgendwo in der Zelle öffnet den Bild-Wähler für alle Varianten. */
.kisten-icon {
  width: 1px;
  vertical-align: middle;
  cursor: pointer;
}
.kisten-icon .item-icon {
  display: block;
  width: 20px;
  height: 20px;
  object-fit: contain;
}

/* Wo noch kein Bild ist: ein „?"-Feld, das zum Klicken einlädt, dasselbe
   Signal wie im Ranking. Ein leeres Feld sähe aus wie „hier geht nichts". */
.kisten-icon-leer {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  border: 1px dashed var(--color-border-subtle, rgba(0, 0, 0, 0.2));
  border-radius: 4px;
}
.kisten-icon:hover .kisten-icon-leer {
  color: var(--color-accent, #2563eb);
  border-color: var(--color-accent, #2563eb);
}

/* ══════════════════════════════════════════════════════════════════════════
   Icon-Vorschläge-Seite
   ══════════════════════════════════════════════════════════════════════════ */
.icon-summe {
  margin-bottom: var(--space-md);
  padding: var(--space-sm) var(--space-md);
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  background: var(--color-bg-subtle, rgba(0, 0, 0, 0.03));
  border-radius: 8px;
}

/* Eine Vorschlagszeile: Ziel-Icon · Name + Varianten · Übernehmen-Knopf. */
.icon-vorschlag {
  display: flex;
  align-items: center;
  gap: var(--space-md);
  padding: var(--space-sm) 0;
  border-bottom: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.06));
}
.icon-vorschlag:last-child { border-bottom: none; }

.icon-vorschlag__bild {
  cursor: pointer;   /* das Icon selbst übernimmt auch, nicht nur der Knopf */
}
.icon-vorschlag__bild .item-icon {
  width: 34px;
  height: 34px;
  object-fit: contain;
}
.icon-vorschlag__text { flex: 1; min-width: 0; }

.icon-vorschlag__ziel {
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-primary);
}
.icon-vorschlag__zahl {
  margin-left: 6px;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-normal);
  color: var(--color-text-muted);
}
.icon-vorschlag__namen {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  /* Lange Variantenlisten nicht die Zeile sprengen lassen. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.icon-btn { flex: none; padding: 5px 12px; font-size: var(--font-size-sm); }

/* Unsichere Zeile: Name + eine Reihe anklickbarer Kandidaten. */
.icon-unsicher {
  /* Horizontaler Innenabstand, seit die Liste in einem Scrollkasten sitzt:
     ohne ihn klebten die Namen direkt am Rand. Vertikal wie gehabt. */
  padding: var(--space-sm) var(--space-md);
  border-bottom: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.06));
}
.icon-unsicher:last-child { border-bottom: none; }
.icon-unsicher__name {
  font-weight: var(--font-weight-medium);
  color: var(--color-text-primary);
  margin-bottom: 4px;
}
.icon-unsicher__quelle {
  margin-left: 6px;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-normal);
  color: var(--color-text-muted);
}
.icon-unsicher__kand { display: flex; flex-wrap: wrap; gap: 6px; }

.icon-kandidat {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 8px 3px 4px;
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
  background: none;
  border: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.12));
  border-radius: 6px;
  cursor: pointer;
}
.icon-kandidat:hover {
  border-color: var(--color-accent, #2563eb);
  color: var(--color-accent, #2563eb);
}
.icon-kandidat .item-icon { width: 24px; height: 24px; object-fit: contain; }

/* Der „selbst suchen"-Knopf hebt sich leicht ab, er ist der eigene Weg, nicht
   ein Vorschlag des Programms. */
.icon-kandidat--suche {
  border-style: dashed;
  color: var(--color-accent, #2563eb);
  font-weight: var(--font-weight-medium);
}

/* Der Scrollkasten um die Tabelle. Vertikal bei vielen Zeilen, HORIZONTAL bei
   schmalem Fenster, so bleiben die Spalten heil und ausgerichtet, statt zu
   brechen oder abgeschnitten zu werden. */
.kisten-scroll {
  max-height: 240px;
  overflow: auto;
}

/* Eine echte Tabelle: vier Spalten, über alle Zeilen ausgerichtet.
   Bewusst KEIN width:100%, die Tabelle ist so breit wie ihr Inhalt. Dadurch
   sitzt die Meta-Spalte dicht hinter der Kiste (der frühere "große Abstand"
   entstand, weil eine Spalte bis zum Fensterrand gedehnt wurde). Wird das
   Fenster schmaler als die Tabelle, scrollt der Kasten seitwärts. */
.kisten-tabelle {
  border-collapse: collapse;
  font-size: var(--font-size-sm);
}

.kisten-tabelle td {
  padding: 5px 0;
  border-bottom: 1px solid var(--color-border-subtle, rgba(0, 0, 0, 0.06));
  white-space: nowrap;
  vertical-align: baseline;
}

/* GLEICHER Abstand zwischen JEDEM Spaltenpaar, egal wie breit der Inhalt ist.
   Deshalb hier statt einzelner padding-right an den Zellen: Die Regel
   ".kisten-tabelle td { padding: 5px 0 }" ist spezifischer als eine bloße
   Klasse wie ".kisten-pfeil" und hätte deren padding-right stillschweigend auf
   0 zurückgesetzt, genau darum klebte "liegt in" an der Kiste. "td + td" ist
   ebenso spezifisch und trifft jede Spalte außer der ersten. */
.kisten-tabelle td + td {
  padding-left: var(--space-lg);
}

.kisten-tabelle tr:last-child td {
  border-bottom: none;
}

/* Item: der Bezug, nicht die Auskunft, leise. */
.kisten-item {
  color: var(--color-text-secondary);
}

/* Hover-bar: über den Item-Namen fahren zeigt, was in DIESER Truhe steckt.
   Leiser Hinweis wie bei den Truhen-Namen: gepunktete Linie, Fragezeichen-Cursor. */
.kisten-item--pop {
  cursor: help;
  text-decoration: underline dotted var(--color-border);
  text-underline-offset: 3px;
}

/* Verb ("lag in" / "liegt in"): das ruhige Bindeglied. */
.kisten-pfeil {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}

/* Kiste: wonach man sucht, sie bekommt das Gewicht. */
.kisten-box {
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-primary);
}

/* Wann/Wie-oft (oder das Itemshop-Etikett). */
.kisten-meta {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}

/* "immer im Shop", steht dort, wo sonst der Rhythmus steht ("alle 18 T").
   Kursiv und leise: Es ist keine Prognose, sondern die Feststellung, dass es
   keine braucht. Ein Item, das nie weg war, kommt auch nicht wieder. */
.ranking-dauerhaft {
  font-style: italic;
  color: var(--color-text-muted);
}

.gruppe__marke {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  font-style: italic;
}

.gruppe__text {
  margin: 4px 0 0;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  line-height: 1.5;
}

/* Das Kleingedruckte: Es steht da, es steht im Weg, aber es steht nicht in
   derselben Größe wie die Aussage darüber. */
.gruppe__text--leise {
  display: block;
  margin-top: 2px;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

/* Der Scrollkasten schließt direkt an den Gruppenkopf an, oben ohne Radius,
   damit beides wie EIN Block wirkt und nicht wie zwei zufällig gestapelte. */
.namen__gruppe .liste-box {
  border-radius: 0 0 var(--radius-md) var(--radius-md);
}

.namen__gruppe + .namen__gruppe {
  margin-top: var(--space-xl);
}

/* "Kein Treffer in dieser Gruppe." steht IN der Gruppe, nicht statt ihrer.
   Eine Gruppe, die bei der Suche einfach verschwindet, lässt einen rätseln, ob
   es sie noch gibt. Eine, die sagt "hier ist nichts", beantwortet die Frage. */
.namen__leer {
  padding: var(--space-md);
  text-align: center;
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
}

/* Der Verlauf im Item-Dialog. Etwas höher als die Listen auf der Aufräum-Seite:
   Hier steht nur EINE Liste im Kasten, sie darf also mehr Platz nehmen. */
.liste-box--verlauf {
  max-height: 52vh;
  padding: 0 var(--space-sm);
}

/* Die Zahl neben der Überschrift ("94 Sichtungen"). Sie steht dort, weil ein
   Kasten mit Deckel seine Länge nicht mehr selbst verrät, wer nur zwanzig
   Zeilen sieht, muss trotzdem wissen, dass es vierundneunzig sind. */
.detail-titel__zahl {
  margin-left: var(--space-sm);
  font-size: var(--font-size-xs);
  font-weight: 400;
  color: var(--color-text-muted);
}

/* ── Zusammengeführte Items: zugeklappt, mit Deckel ────────────────────── */
.alias-summary {
  cursor: pointer;
  padding: var(--space-sm) var(--space-lg);
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
  user-select: none;
}

.alias-summary:hover {
  color: var(--color-text);
}

.alias-suche {
  margin-bottom: var(--space-sm);
}

.alias-scroll {
  max-height: 320px;
  overflow-y: auto;
}

/* ── Fälligkeit ───────────────────────────────────────────────────────
 *  Die vier Zustände. Der wichtigste ist "überfällig", deshalb ist er
 *  der einzige, der farblich schreit.
 *
 *  "keine" ist ein schlichtes "—", KEINE Zahl. Wo keine belastbare
 *  Prognose möglich ist, wird auch keine angezeigt. Eine geratene Zahl
 *  sieht genauso aus wie eine, die stimmt, und der Nutzer kann beide
 *  nicht unterscheiden.
 *  ─────────────────────────────────────────────────────────────────── */
.faellig {
  white-space: nowrap;
  font-weight: var(--font-weight-semibold);
}

.faellig__detail {
  display: block;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-regular);
  opacity: 0.8;
}

/* Das voraussichtliche Datum. Kursiv und etwas blasser, damit man sofort sieht:
   geschaetzt, nicht sicher. */
.faellig__detail--schaetzung {
  font-style: italic;
  opacity: 0.65;
  cursor: help;
}

.faellig--ueberfaellig { color: var(--color-danger); }
.faellig--heute        { color: var(--color-danger); }
.faellig--bald         { color: var(--color-warning); }
.faellig--termin       { color: var(--color-success); }
.faellig--faellig      { color: var(--color-success); }

/* "heute" in der Zuletzt-Spalte: grün, weil das Item GERADE JETZT läuft. */
.zuletzt-heute { color: var(--color-success); font-weight: var(--font-weight-semibold); }
.faellig--spaeter      { color: var(--color-text-secondary); font-weight: var(--font-weight-regular); }
.faellig--keine        { color: var(--color-text-muted); font-weight: var(--font-weight-regular); cursor: help; }

.preis-spanne {
  color: var(--color-text-secondary);
  white-space: nowrap;
}

.badge--muted {
  background: var(--color-border-subtle);
  color: var(--color-text-muted);
}

/* ── Detail-Ansicht ───────────────────────────────────────────────── */
.detail-zahlen {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: var(--space-md);
  margin-bottom: var(--space-lg);
}

.detail-zahl {
  text-align: center;
  padding: var(--space-md) var(--space-sm);
  background: var(--color-surface);
  border: 1px solid var(--color-border-subtle);
  border-radius: var(--radius-md);
  transition: border-color var(--transition-fast, 120ms);
}
.detail-zahl:hover { border-color: var(--color-border); }

.detail-zahl__wert {
  font-size: var(--font-size-xl, 1.5rem);
  font-weight: var(--font-weight-bold);
  color: var(--color-text);
  line-height: 1.15;
  font-variant-numeric: tabular-nums;
}

.detail-zahl__label {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  margin-top: 4px;
  /* Ein Etikett ist keine Aussage, es ist eine Beschriftung. Kapitälchen und
     etwas Sperrung setzen es leise von der Zahl ab, ohne mit ihr zu wetteifern. */
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-weight: var(--font-weight-medium);
}

/* Die ehrliche Einordnung. Steht direkt unter den Zahlen, nicht klein
   gedruckt irgendwo unten, wo man sie überliest. */
.detail-warnung {
  background: var(--color-danger-subtle);
  border-left: 3px solid var(--color-danger);
  border-radius: var(--radius-sm);
  padding: var(--space-sm) var(--space-md);
  font-size: var(--font-size-sm);
  color: var(--color-text);
  margin-bottom: var(--space-lg);
}

.detail-hinweis {
  background: var(--color-warning-subtle);
  border-left: 3px solid var(--color-warning);
  border-radius: var(--radius-sm);
  padding: var(--space-sm) var(--space-md);
  font-size: var(--font-size-sm);
  color: var(--color-text);
  margin-bottom: var(--space-lg);
}

/* Wartungssignal ganz oben auf der Übersicht (Geister-Items). Ruhiges Gelb, kein
   Alarm: ein Hinweis für den Admin, kein Fehler für den Nutzer. Alle Farbwerte
   kommen aus design-system.css, dieselbe Warnfarbe wie sonst im Dashboard. */
.geister-hinweis {
  background: var(--color-warning-subtle);
  border-left: 3px solid var(--color-warning);
  border-radius: var(--radius-sm);
  padding: var(--space-sm) var(--space-md);
  font-size: var(--font-size-sm);
  color: var(--color-text);
  margin-bottom: var(--space-lg);
}
.geister-hinweis strong { color: var(--color-warning); }

.detail-titel {
  display: flex;
  align-items: baseline;
  gap: var(--space-sm);
  font-size: var(--font-size-md);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text);
  /* Abstand NACH OBEN: Jeder Abschnitt (Verlauf, Möglicher Inhalt, Steckt in
     Kisten) bekommt einen klaren Anfang, statt am vorigen zu kleben. Eine dünne
     Linie darüber trennt sie ohne Lärm. */
  margin: var(--space-lg) 0 var(--space-sm);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border-subtle);
}
/* Der erste Abschnitt braucht die Trennlinie nicht, über ihm stehen die
   Kennzahlen, die sich schon abheben. */
.detail-zahlen + .detail-titel,
.detail-warnung + .detail-titel,
.detail-hinweis + .detail-titel,
.detail-text + .detail-titel {
  border-top: none;
  padding-top: 0;
  margin-top: var(--space-md);
}

.detail-verlauf {
  list-style: none;
  margin: 0;
  padding: 0;
}

/* Eine gedeckelte Fassung fuer sehr lange Listen. "Steckt in diesen Kisten"
   kann ueber sechzig Zeilen haben, das schiebt sonst die halbe Seite weg.
   Derselbe Deckel wie bei .kisten-scroll, damit beide Kisten-Listen im Detail
   gleich hoch bleiben. Die Zeile, die man gerade liest, klebt nicht am Rand,
   deshalb ein wenig Innenabstand rechts fuer den Rollbalken. */
.detail-verlauf--scroll {
  max-height: 240px;
  overflow-y: auto;
  padding-right: 4px;
}

.detail-verlauf li {
  display: flex;
  align-items: baseline;
  gap: var(--space-md);
  padding: var(--space-sm) var(--space-xs);
  border-radius: var(--radius-sm);
  border-bottom: 1px solid var(--color-border-subtle);
  font-size: var(--font-size-sm);
  transition: background var(--transition-fast, 120ms);
}
/* Beim Drüberfahren hebt sich die Zeile leicht ab, man sieht, welchen Beitrag
   man gleich öffnet. */
.detail-verlauf li:hover { background: var(--color-bg-subtle); }

.detail-verlauf li:last-child { border-bottom: none; }

.detail-verlauf__datum {
  color: var(--color-text-muted);
  white-space: nowrap;
  min-width: 90px;
}

.detail-verlauf__titel {
  color: var(--color-text);
  flex: 1;
}

/* Truhen-Namen, über die man fahren kann, um ihren Inhalt zu sehen. Ein leiser
   Hinweis: gepunktete Unterstreichung und Fragezeichen-Cursor. */
.detail-verlauf__titel--pop {
  cursor: help;
  text-decoration: underline dotted var(--color-border);
  text-underline-offset: 3px;
}

.detail-verlauf__abstand {
  color: var(--color-primary);
  font-weight: var(--font-weight-semibold);
  white-space: nowrap;
}


/* ═══════════════════════════════════════════════════════════════════
 *  ITEM-ICONS (aus dem Metin2-Wiki)
 * ═══════════════════════════════════════════════════════════════════ */

.ranking-bild-th { width: 44px; }

.ranking-bild {
  width: 44px;
  padding-right: 0 !important;
}

.item-icon {
  width: 32px;
  height: 32px;
  display: block;
  border-radius: var(--radius-sm);
  cursor: pointer;

  /* "object-fit: contain" NICHT weglassen.
     ------------------------------------------------------------------
     Die Bilder haben nicht alle dasselbe Seitenverhältnis:
       Segenskugel           32 x 32   quadratisch
       Waffen/Kostüme        32 x 64   hochkant
       Mammut-Wundertruhe   242 x 242  quadratisch, aber groß
     Ohne "contain" würde ein 32x64-Bild in das 32x32-Kästchen GEQUETSCHT,
     das Schwert wäre gestaucht. Mit "contain" wird es eingepasst und behält
     seine Form. */
  object-fit: contain;

  /* Hier stand "image-rendering: pixelated".
     ------------------------------------------------------------------
     Das war richtig, SOLANGE alle Bilder 32x32 waren: Beim Hochskalieren auf
     einem HiDPI-Display bleiben harte Pixelkanten schärfer als weichgezeichnete.

     Seit auch große Bilder dabei sind (Mammut-Wundertruhe: 242x242), ist es
     FALSCH. "pixelated" heißt "Nächster-Nachbar", beim VERKLEINERN von 242 auf
     32 Pixel wirft das 98 % der Bildpunkte einfach weg. Ergebnis: ein zerfranstes,
     flimmerndes Bild.

     Die Standardglättung ("auto") verkleinert sauber und lässt 32x32-Icons bei
     ihrer 1:1-Darstellung praktisch unangetastet. Also: für den einen Fall
     minimal weicher, für den anderen dramatisch besser. */
  image-rendering: auto;

  transition: transform var(--transition-fast);
}

.item-icon:hover { transform: scale(1.15); }

/* Kein Bild? Ein Platzhalter, der zum Klicken einlädt: KEIN leeres Feld.
   Ein leeres Feld sieht kaputt aus. Ein "?" sagt: hier fehlt etwas, und du
   kannst es beheben. */
.item-icon--leer {
  /* Das „?" gehört in die Mitte, sonst klebt es oben links in der Ecke. */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px dashed var(--color-border);
  background: transparent;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  line-height: 1;
  padding: 0;
}

.item-icon--leer:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: var(--color-primary-subtle);
}

/* Ein Inhalt aus dem Shop hat kein Datum, er sagt "was", nicht "wann". Das
   kleine Etikett steht deshalb dort, wo sonst das Datum stünde. */
/* "laut Shop" ist ein HERKUNFTS-Etikett, kein Link. Vorher war es blau
   (Primärfarbe), und Blau plus Pille liest jeder als "hier kann man klicken".
   Also neutral: ein ruhiges graues Tag, das sagt "woher", ohne etwas zu
   versprechen, das es nicht tut. */
.quelle-shop {
  display: inline-block;
  padding: 1px 7px;
  border-radius: 999px;
  background: var(--color-bg-subtle, #f1f3f5);
  color: var(--color-text-secondary);
  font-size: var(--font-size-xs, 11px);
  font-weight: var(--font-weight-medium);
  cursor: help;
}

/* ── Der kleine Tooltip im App-Stil (siehe appTipZeigen in item-popup.js) ────
   Ein helles, gerundetes Kästchen wie die übrigen Karten der App, statt des
   schwarzen Browser-title. Liegt am <body> und wird per position:fixed
   gesetzt, damit es kein scrollender Kasten abschneidet. */
.app-tip {
  position: fixed;
  z-index: 9999;
  max-width: 240px;
  padding: 6px 9px;
  border-radius: var(--radius-sm, 6px);
  background: var(--color-bg, #fff);
  color: var(--color-text, #1f2937);
  border: 1px solid var(--color-border, #e5e7eb);
  box-shadow: 0 6px 22px rgba(0, 0, 0, 0.14);
  font-size: var(--font-size-xs, 11px);
  font-weight: var(--font-weight-normal);
  line-height: 1.4;
  white-space: normal;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.12s ease;
}

.app-tip--an {
  opacity: 1;
}

/* ── Das Sammel-Zeichen ────────────────────────────────────────────────────
   Für "verschiedene Hüte+", "verschiedene Pets": Warengruppen, keine Items.

   Es MUSS anders aussehen als ein Icon, sonst hält man es für eines. Deshalb:
   kein Rahmen wie beim "?" (das lädt zum Klicken ein, hier gibt es nichts
   zuzuordnen), sondern eine ruhige, runde Fläche mit einem Zeichen darin.
   Gedämpft, denn es ist eine Kategorie, keine Sache.

   Und kein cursor:pointer. Was nicht klickbar ist, darf nicht so tun. */
.item-icon--sammel {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px dashed var(--color-border);
  border-radius: 50%;
  background: var(--color-bg-subtle);
  font-size: 15px;
  line-height: 1;
  opacity: 0.75;
  cursor: help;
}

/* Im Kärtchen ("Aktuell im Shop") ist dasselbe Zeichen kleiner und ohne Rahmen,
   dort steht es NEBEN dem Namen, nicht anstelle eines Icons in einer Spalte.
   Derselbe Inhalt, andere Umgebung, anderes Maß. */
.inhalt-chip .item-icon--sammel {
  width: 18px;
  height: 18px;
  border: none;
  background: none;
  font-size: 12px;
  opacity: 0.9;
}

/* ── Der Zuordnungs-Dialog ────────────────────────────────────────── */
.bild-dialog {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.4);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 200;
  padding: var(--space-lg);
}

.bild-dialog[hidden] { display: none; }

.bild-dialog__box {
  background: var(--color-surface);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: var(--space-lg);
  width: 100%;
  max-width: 480px;
  max-height: 80vh;
  display: flex;
  flex-direction: column;
}

.bild-dialog__kopf {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  margin-bottom: var(--space-md);
}

.bild-dialog__titel {
  font-size: var(--font-size-md);
  font-weight: var(--font-weight-bold);
  color: var(--color-text);
  margin: 0;
}

.bild-dialog__item {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin: 2px 0 0;
}

.bild-treffer-liste {
  margin-top: var(--space-md);
  overflow-y: auto;
  flex: 1;
  min-height: 120px;
}

.bild-treffer {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  width: 100%;
  padding: var(--space-sm);
  border: none;
  background: transparent;
  border-radius: var(--radius-md);
  cursor: pointer;
  text-align: left;
  font-family: inherit;
  font-size: var(--font-size-sm);
  color: var(--color-text);
  transition: background var(--transition-fast);
}

.bild-treffer:hover { background: var(--color-border-subtle); }

/* Dasselbe in der Suchvorschau, hier sieht man die Unterschiede sogar
   besonders deutlich, weil Icons und große Bilder direkt untereinander stehen. */
.bild-treffer img {
  width: 40px;
  height: 40px;
  flex-shrink: 0;
  object-fit: contain;
  image-rendering: auto;
}

.bild-hinweis {
  padding: var(--space-md);
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
  text-align: center;
  line-height: 1.6;
}

.bild-hinweis code {
  background: var(--color-border-subtle);
  padding: 2px 6px;
  border-radius: var(--radius-sm);
  font-family: ui-monospace, monospace;
  color: var(--color-text);
}

.bild-dialog__fuss {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-sm);
  margin-top: var(--space-md);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border);
}

.bild-dialog__hinweis {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

/* Die Größenangabe hinter jedem Suchtreffer. Sie steht da, damit du siehst, WAS
   du auswählst. Ein 32×32-Icon ist das Übliche, 242×242 ist die
   Mammut-Wundertruhe, zu der es schlicht kein kleineres Bild gibt. Ohne diese
   Angabe würdest du dich fragen, warum ein Bild plötzlich anders aussieht. */
.bild-treffer__groesse {
  margin-left: auto;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

/* ══════════════════════════════════════════════════════════════════════════
   Prüf-Liste: die Korrektur-Zeile
   ══════════════════════════════════════════════════════════════════════════
   Vier Felder und zwei Knöpfe in einer Reihe. Das Namensfeld bekommt allen
   übrigen Platz (1fr), die Zahlenfelder sind schmal, sie enthalten selten
   mehr als drei Ziffern, und ein breites Feld für eine dreistellige Zahl lädt
   dazu ein, etwas anderes hineinzuschreiben.

   Auf schmalen Bildschirmen bricht die Reihe um, statt zu quetschen. */
.pruef-item__form {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs);
  align-items: center;
  margin-top: var(--space-sm);
}

.pruef-item__form .pruef-name {
  flex: 1 1 200px;
  min-width: 160px;
}

.pruef-item__form .pruef-normal,
.pruef-item__form .pruef-offer,
.pruef-item__form .pruef-tage {
  flex: 0 0 84px;
  width: 84px;
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* Die Zahlenfelder verlieren ihre Spinner-Pfeilchen. Die sind bei Preisen
   sinnlos (niemand klickt sich von 45 auf 29) und stehlen Platz. */
.pruef-item__form input[type="number"]::-webkit-inner-spin-button,
.pruef-item__form input[type="number"]::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.pruef-item__form input[type="number"] { -moz-appearance: textfield; }

/* "Verwerfen" ist bewusst der LEISERE Knopf. Es ist die zerstörende Aktion,
   sie soll erreichbar sein, aber nicht einladend. Das Auge soll zuerst auf
   "Übernehmen" fallen, denn das ist in den allermeisten Fällen das Richtige. */
.pruef-item__form .pruef-weg {
  color: var(--color-text-muted);
}
.pruef-item__form .pruef-weg:hover {
  color: var(--color-danger);
}

/* ══════════════════════════════════════════════════════════════════════════
   Beitrags-Ansicht
   ══════════════════════════════════════════════════════════════════════════ */

/* ══════════════════════════════════════════════════════════════════════════
   Das Beitrags-Fenster war zu klein, und zwar nicht "unschön", sondern
   UNBRAUCHBAR.
   ══════════════════════════════════════════════════════════════════════════
   In diesem Fenster liest man Tabellen mit fünf Spalten in Monospace. Bei
   760 px bricht jede Zeile um, und ausgerechnet die Struktur, wegen der man
   hier hinschaut, wird unsichtbar.

   Deshalb: so breit wie der Bildschirm hergibt (bis 1400 px), und die Höhe an
   der Sichthöhe statt an einer festen Zeilenzahl. Ein Fenster für eine Aufgabe,
   nicht für ein Layout-Raster. */
/* ══════════════════════════════════════════════════════════════════════════
   DER GRUNDSTIL DES FENSTERS, er hat schlicht GEFEHLT
   ══════════════════════════════════════════════════════════════════════════
   Das <dialog> trug die Klasse "dialog", und die gab es nirgends. Kein Rahmen,
   keine Rundung, kein Schatten, kein abgedunkelter Hintergrund: Der Browser hat
   sein eingebautes Aussehen von 1998 gezeigt, mitten in einer App, die überall
   sonst Karten mit weichen Kanten hat.

   Es sah nicht "schlicht" aus. Es sah aus wie ein Fehler. Und in gewisser Weise
   war es einer: Ich habe ein Bauteil benutzt, das ich nie gebaut hatte.

   Die Werte kommen aus dem Design-System (--color-surface, --radius-xl,
   --shadow-xl), dieselben, aus denen auch .modal in components.css gemacht ist.
   Ein zweites Aussehen für dasselbe Ding wäre schon der nächste Fehler.
   ══════════════════════════════════════════════════════════════════════════ */
.dialog {
  padding: 0;
  border: none;
  border-radius: var(--radius-xl);
  background: var(--color-surface);
  color: var(--color-text);
  box-shadow: var(--shadow-xl);
  max-width: 560px;
  width: 90%;
  max-height: 90vh;
  overflow: hidden;
}

/* Der abgedunkelte Hintergrund. Er ist nicht Dekoration, sondern die Ansage
   "hier ist gerade nichts anderes wichtig", und er ist die Fläche, auf die man
   klickt, um wieder rauszukommen. */
.dialog::backdrop {
  background: rgba(0, 0, 0, 0.7);
  backdrop-filter: blur(4px);
}

/* Das kurze Aufpoppen, dieselbe Bewegung wie bei .modal: von leicht unten,
   leicht kleiner. Ein Fenster, das aus dem Nichts erscheint, wirkt wie ein
   Sprung; eines, das kommt, wirkt wie eine Antwort. */
@keyframes dialog-auf {
  from { opacity: 0; transform: translateY(20px) scale(0.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
.dialog[open] {
  animation: dialog-auf var(--transition-base, 180ms) ease-out;
}
@media (prefers-reduced-motion: reduce) {
  .dialog[open] { animation: none; }
}

.dialog__form {
  padding: var(--space-lg);
  overflow-y: auto;
  max-height: 90vh;
}

/* Der Kopf bleibt stehen. Wer unten in einer langen Item-Liste steckt, muss den
   Weg hinaus sehen, ohne erst wieder hochscrollen zu müssen. */
.dialog__kopf {
  position: sticky;
  top: calc(var(--space-lg) * -1);
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  margin: calc(var(--space-lg) * -1) calc(var(--space-lg) * -1) var(--space-md);
  padding: var(--space-md) var(--space-lg);
  background: var(--color-surface);
  border-bottom: 1px solid var(--color-border-subtle);
}

.dialog__kopf h3 {
  margin: 0;
  font-size: var(--font-size-lg);
  font-weight: var(--font-weight-semibold);
}

.dialog--breit {
  max-width: 1400px;
  width: 94vw;
  max-height: 92vh;
}

.dialog--breit .dialog__form {
  display: flex;
  flex-direction: column;
  max-height: 88vh;
}

/* Der Rohtext bekommt den ganzen übrigen Platz, er ist der Grund für dieses
   Fenster. Die Item-Liste darunter darf schrumpfen. */
.dialog--breit .post-roh {
  flex: 1 1 auto;
  min-height: 320px;
  resize: vertical;   /* und wenn es doch nicht reicht: selbst größer ziehen */
}

.dialog--breit .post-offers {
  flex: 0 1 auto;
  overflow-y: auto;
  max-height: 26vh;
}

/* Ein Knopf, der wie ein Link aussieht. Klingt nach Kosmetik, ist aber
   Semantik: Er löst eine AKTION aus (Dialog öffnen), er führt nicht zu einer
   anderen Adresse. Ein <a> ohne href wäre für Tastatur und Screenreader tot;
   ein <button> ist von Haus aus erreichbar. */
.link-button {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  color: var(--color-primary);
  cursor: pointer;
  text-align: left;
}
.link-button:hover { text-decoration: underline; }

.historie-extern {
  margin-left: var(--space-xs);
  color: var(--color-text-muted);
  text-decoration: none;
  font-size: var(--font-size-xs);
}
.historie-extern:hover { color: var(--color-primary); }

.post-meta {
  display: flex;
  gap: var(--space-md);
  flex-wrap: wrap;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  padding-bottom: var(--space-sm);
  margin-bottom: var(--space-md);
  border-bottom: 1px solid var(--color-border-subtle);
}

/* Der Rohtext: Monospace und white-space: pre.
   NICHT verhandelbar. In diesem Text SIND die Tabs die Spaltentrenner, genau
   an ihnen entscheidet sich, ob eine Tabellenzeile richtig gelesen wird. Eine
   Proportionalschrift, die Tabs zu Leerzeichen glättet, würde ausgerechnet das
   unsichtbar machen, weswegen man hier hinschaut. */
.post-roh {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: var(--font-size-xs);
  line-height: 1.55;
  white-space: pre;      /* NICHT "pre-wrap": Ein Umbruch würde eine Tabellen-
                            zeile in zwei zerlegen, und damit genau das
                            vortäuschen, wonach man hier sucht. Lieber seitlich
                            scrollen und die Wahrheit sehen. */
  overflow-x: auto;
  tab-size: 4;           /* 8 war zu viel: Bei fünf Spalten schiebt es die
                            letzte aus dem Bild. */
}

.post-offers { margin-top: var(--space-md); }

.post-offers__kopf {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-bottom: var(--space-xs);
}

.post-offers__kopf--inhalt {
  margin-top: var(--space-md);
  padding-top: var(--space-sm);
  border-top: 1px solid var(--color-border-subtle);
}

.post-offer {
  display: grid;
  grid-template-columns: 1fr auto 60px 28px;
  align-items: center;
  gap: var(--space-sm);
  padding: 4px var(--space-xs);
  font-size: var(--font-size-sm);
  border-radius: var(--radius-sm);
}
.post-offer:nth-child(even) { background: var(--color-bg-subtle); }

.post-offer__preis { text-align: right; font-variant-numeric: tabular-nums; }
.post-offer__tage  { text-align: right; color: var(--color-text-secondary); }

/* Das ✕ ist leise, bis man die Zeile berührt. Ein Löschknopf, der einen ständig
   anschaut, wird irgendwann aus Versehen gedrückt. */
.post-offer__weg {
  border: none;
  background: none;
  color: var(--color-text-secondary);
  cursor: pointer;
  line-height: 1;
  padding: 2px 4px;
  border-radius: var(--radius-sm);
  opacity: 0;
  transition: opacity var(--transition-fast, 120ms), color var(--transition-fast, 120ms);
}
.post-offer:hover .post-offer__weg,
.post-offer__weg:focus-visible { opacity: 1; }
.post-offer__weg:hover {
  color: var(--color-danger, #c0392b);
  background: var(--color-danger-subtle, #fdecec);
}

/* Die unsicheren Zeilen fallen auf. Sie sollen auffallen, sie sind der Grund,
   warum man diesen Dialog überhaupt geöffnet hat. */
.post-offer--unsicher {
  background: var(--color-warn-subtle, #fff8e1);
  color: var(--color-text);
  font-weight: var(--font-weight-medium);
}

/* Ein von Hand eingetragenes Item ist kein Fund, sondern eine Behauptung,
   meine. Das gehört dazugeschrieben, sonst hält man es später für etwas, das
   im Beitrag stand. */
.post-offer__hand {
  margin-left: 6px;
  padding: 0 5px;
  border-radius: var(--radius-sm);
  background: var(--color-bg-subtle);
  border: 1px solid var(--color-border);
  color: var(--color-text-secondary);
  font-size: var(--font-size-xs, 11px);
}

/* Der leere Beitrag erklärt sich selbst, statt eine leere Liste hinzustellen. */
.post-offers__leer {
  margin-top: var(--space-sm);
  padding: var(--space-sm) var(--space-md);
  border-left: 3px solid var(--color-danger, #c0392b);
  background: var(--color-danger-subtle, #fdecec);
  border-radius: var(--radius-sm);
  font-size: var(--font-size-sm);
  line-height: 1.5;
}

/* ── Von Hand nachtragen ───────────────────────────────────────────────── */
.post-nachtragen {
  margin-top: var(--space-md);
  padding: var(--space-sm) var(--space-md);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-bg-subtle);
}

.post-nachtragen > summary {
  cursor: pointer;
  font-weight: var(--font-weight-medium);
  font-size: var(--font-size-sm);
}

/* Name breit, Zahlen schmal, die Spaltenbreiten sagen schon, was wo hingehört. */
.nachtragen__form {
  display: grid;
  grid-template-columns: 1fr 90px 90px 80px auto;
  gap: var(--space-xs);
  align-items: center;
  margin-top: var(--space-sm);
}

@media (max-width: 640px) {
  .nachtragen__form { grid-template-columns: 1fr 1fr; }
}

.dialog__aktionen {
  display: flex;
  gap: var(--space-sm);
  margin-top: var(--space-lg);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border-subtle);
}

/* Der Beitragstitel in der Prüf-Liste ist ein Knopf, kein Text mehr.
   Er soll aussehen wie vorher, nur eben anklickbar. */
.pruef-item__titel.link-button {
  font-size: inherit;
  font-weight: inherit;
  color: var(--color-text-secondary);
}
.pruef-item__titel.link-button:hover {
  color: var(--color-primary);
}

/* Der Zeitraum-Filter steht in derselben Reihe wie die Häkchen, er ist ein
   Filter wie sie, kein Sonderfall. Nur eben mit mehr als zwei Zuständen. */
.ranking-zeitraum {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-left: auto;   /* rechts, weg von den Häkchen */
}

.ranking-zeitraum select {
  width: auto;
  min-width: 150px;
  padding: 4px var(--space-xs);
  font-size: var(--font-size-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   Zusammenführungs-Vorschläge
   ══════════════════════════════════════════════════════════════════════════
   Bewusst ZURÜCKHALTEND gestaltet, kein Warnbanner, kein Ausrufezeichen.
   Es ist eine Frage, keine Meldung. Ein Vorschlag, der schreit, wird
   angeklickt statt gelesen; und beim Zusammenführen ist Lesen der ganze Punkt. */
.merge {
  border-top: 1px solid var(--color-border-subtle);
  background: var(--color-bg-subtle);
}

.merge__kopf {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-bottom: var(--space-sm);
}

.merge__zeile {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  padding: var(--space-xs) 0;
}

.merge__meta {
  display: block;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

/* Der Hinweis auf die Unumkehrbarkeit steht DIREKT beim Knopf, nicht in einer
   Fußnote. Eine Warnung, die man erst nach dem Klick findet, ist keine. */
.merge__hinweis {
  margin-top: var(--space-sm);
  padding-top: var(--space-sm);
  border-top: 1px dashed var(--color-border-subtle);
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  line-height: 1.6;
}

/* Die Richtungsangabe. Sie steht ÜBER dem Knopf, nicht daneben, man liest von
   oben nach unten, und die Konsequenz gehört vor die Handlung, nicht neben sie. */
.merge__richtung {
  display: block;
  margin-top: 4px;
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
}

/* Die Liste der Zusammenführungen. */
.alias-zeile {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  padding: var(--space-xs) 0;
  border-bottom: 1px solid var(--color-border-subtle);
  font-size: var(--font-size-sm);
}
.alias-zeile:last-child { border-bottom: none; }

/* Der alte Name durchgestrichen, er ist ja nicht mehr in Gebrauch.
   Das sagt in einem Zeichen, was drei Wörter bräuchten. */
.alias-alt {
  text-decoration: line-through;
  color: var(--color-text-muted);
}

.alias-pfeil { color: var(--color-text-muted); margin: 0 4px; }

.alias-datum {
  margin-left: var(--space-sm);
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

/* ══════════════════════════════════════════════════════════════════════════
   Aufräum-Seite
   ══════════════════════════════════════════════════════════════════════════ */

.kand__zahl {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-bottom: var(--space-sm);
}

.kand {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-areas: "paar knopf" "grund knopf";
  align-items: center;
  gap: 2px var(--space-md);
  padding: var(--space-sm) 0;
  border-bottom: 1px solid var(--color-border-subtle);
}
.kand:last-child { border-bottom: none; }

.kand__paar {
  grid-area: paar;
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  flex-wrap: wrap;
}

.kand__seite { display: flex; flex-direction: column; }

/* Name + Pfeil-Link + Herkunfts-Schild in EINER Zeile. Ohne diesen Wrapper
   würde jedes davon (Flex-Spalte) auf einer eigenen Zeile landen. */
.kand__kopf {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}

/* Das Herkunfts-Schild: woher stammt diese Seite (Angebot / Glücksrad …). Dezent,
   aber lesbar, es ist eine Tatsache über das Item, kein Knopf. */
.kand__herkunft,
.ranking-herkunft {
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
  background: var(--color-surface-sunken, rgba(127, 127, 127, 0.12));
  border: 1px solid var(--color-border-subtle);
  border-radius: 999px;
  padding: 1px 8px;
  white-space: nowrap;
}

/* Der verschwindende Name durchgestrichen, das sagt in einem Zeichen, was
   sonst drei Wörter bräuchten. Und es sagt es, BEVOR geklickt wird. */
.kand__seite--weg strong {
  text-decoration: line-through;
  color: var(--color-text-muted);
  font-weight: var(--font-weight-medium);
}

.kand__meta {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

.kand__pfeil { color: var(--color-text-muted); }

/* Der GRUND steht mit dabei. Ein Vorschlag ohne Begründung ist ein Befehl,
   und Befehle prüft man nicht, man befolgt sie. Genau das wollen wir hier nicht. */
.kand__grund {
  grid-area: grund;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

/* Die Knöpfe rechts: „Zusammenführen" (nicht immer da) und „Getrennt lassen".
   Untereinander, damit sie auch bei schmalem Platz nicht ins Gedränge kommen. */
.kand__aktionen {
  grid-area: knopf;
  display: flex;
  flex-direction: column;
  gap: 4px;
  align-items: stretch;
}

.kand__go { /* liegt jetzt in .kand__aktionen, keine eigene grid-area mehr */ }

/* „Getrennt lassen" ist die leisere Aktion, es passiert seltener und ist kein
   Fortschritt, sondern ein Veto. Deshalb zurückhaltender als der Merge-Knopf. */
.kand__weg { color: var(--color-text-muted); }
.kand__weg:hover { color: var(--color-text-secondary); }

/* ── Von Hand ── */
.manuell__spalten {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: start;
  gap: var(--space-md);
}

.manuell__pfeil {
  align-self: center;
  padding-top: 24px;
  color: var(--color-text-muted);
  font-size: var(--font-size-lg);
}

.manuell__treffer {
  margin-top: var(--space-xs);
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.manuell__item {
  text-align: left;
  padding: 6px var(--space-xs);
  background: none;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  font: inherit;
  font-size: var(--font-size-sm);
  color: var(--color-text);
  cursor: pointer;
}
.manuell__item:hover {
  background: var(--color-bg-subtle);
  border-color: var(--color-border);
}

/* Truhen mit Inhalt ohne Angebot (Aufräumen) */
.truhe-zeile {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-md);
  padding: var(--space-sm) 0;
  border-bottom: 1px solid var(--color-border);
}
.truhe-zeile:last-child { border-bottom: none; }
.truhe__info {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  min-width: 0;
  flex: 1 1 auto;
}
.truhe__icon {
  width: 32px;
  height: 32px;
  object-fit: contain;
  flex: 0 0 auto;
}
.truhe__icon--leer {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
  opacity: .7;
}
.truhe__inhalt { font-size: var(--font-size-sm); }
.truhe__picker { flex: 0 0 280px; max-width: 280px; }
.truhe__treffer {
  margin-top: var(--space-xs);
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.manuell__leer {
  padding: 6px var(--space-xs);
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
}

.manuell__ergebnis {
  margin: var(--space-md) 0;
  padding: var(--space-sm);
  border-radius: var(--radius-sm);
  background: var(--color-bg-subtle);
  font-size: var(--font-size-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   Verschollene Items
   ══════════════════════════════════════════════════════════════════════════
   Nicht rot, nicht laut, nicht weg, nur leise.

   Sie stehen ganz unten in der Liste, weil sie höchstwahrscheinlich nicht mehr
   im Shop sind (sie reißen ihren eigenen Rhythmus um mehr als das Dreifache).
   Aber sie werden NICHT versteckt: Wer wissen will, was es früher gab, findet
   es dort. Es soll nur niemand mehr daran vorbeiscrollen müssen, der wissen
   will, was morgen kommt. */
.zeile--verschollen {
  opacity: 0.55;
}
.zeile--verschollen:hover {
  opacity: 1;
}

/* "nicht mehr im Shop", grau, nicht rot. Rot heißt "handeln"; hier gibt es
   nichts zu tun. Es ist eine Feststellung, keine Warnung. */
.faellig--verschollen {
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  cursor: help;
  white-space: nowrap;
}

/* Ein saisonales Item nennt einen MONAT, keine Tageszahl. Es ist so verlässlich,
   wie es in diesen Daten nur geht, also dieselbe Farbe wie "kommt bald", nur
   ohne die Dringlichkeit. */
.faellig--saison {
  color: var(--color-text);
  font-weight: var(--font-weight-medium);
  white-space: nowrap;
}

.ranking-saison {
  color: var(--color-text);
  white-space: nowrap;
}

/* "kam jedes Jahr" ist eine Auskunft ueber frueher. Sie tritt in derselben
   Zeile auf wie "nicht mehr im Shop" und soll ihr nicht die Schau stehlen,
   deshalb dieselbe gedaempfte Farbe wie andere Vergangenheitsangaben. */
.ranking-saison--war { color: var(--color-text-muted); }

/* Die Kennzahl eines verschollenen Items ist keine Auskunft, sondern das
   Eingeständnis, dass es keine gibt. Sie darf nicht so aussehen wie die anderen. */
.detail-zahl--leise .detail-zahl__wert { color: var(--color-text-muted); }

/* ══════════════════════════════════════════════════════════════════════════
   Item umbenennen
   ══════════════════════════════════════════════════════════════════════════ */
#detailName {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  flex-wrap: wrap;
}

.detail-name-feld {
  flex: 1 1 260px;
  min-width: 200px;
  padding: 6px var(--space-xs);
  border: 1px solid transparent;      /* unaufdringlich: sieht aus wie Text … */
  border-radius: var(--radius-sm);
  background: transparent;
  font-size: var(--font-size-lg);
  font-weight: var(--font-weight-bold);
  color: var(--color-text);
  font-family: inherit;
}
/* … bis man es anfasst. Ein Feld, das immer wie ein Feld aussieht, lädt zum
   Herumtippen ein; eines, das erst beim Fokus eines wird, stört die Ansicht
   nicht und ist trotzdem da, wenn man es braucht. */
.detail-name-feld:hover  { border-color: var(--color-border); }
.detail-name-feld:focus  {
  border-color: var(--color-primary);
  background: var(--color-bg);
  outline: none;
}

.detail-name-sperre {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  display: flex;
  align-items: center;
  gap: 4px;
}
.detail-name-sperre .link-button { font-size: var(--font-size-xs); }

/* ══════════════════════════════════════════════════════════════════════════
   Beitragsliste: Filter und Fuß
   ══════════════════════════════════════════════════════════════════════════ */
/* Eigene Zeile, volle Breite. Im Kopfbereich hat der Titeltext die Felder
   zusammengequetscht, bis in ihnen nur noch "Dat" und "m T" zu lesen war,
   ein Eingabefeld, dessen Beschriftung nicht hineinpasst, stellt keine Frage,
   es gibt ein Rätsel auf. */
.card__toolbar.historie-filter {
  display: grid;
  grid-template-columns: minmax(220px, 1.4fr) minmax(150px, auto) minmax(200px, 1fr);
  gap: var(--space-sm);
  padding: var(--space-sm) var(--space-md);
  border-bottom: 1px solid var(--color-border-subtle);
  background: var(--color-bg-subtle);
}

.historie-filter select { width: 100%; }

@media (max-width: 760px) {
  .card__toolbar.historie-filter { grid-template-columns: 1fr; }
}

/* Der Fuß steht IMMER da, auch wenn nichts nachzuladen ist. Denn die eigentliche
   Information ist nicht der Knopf, sondern die Zahl: "50 von 848". Ohne sie
   weiß niemand, ob er alles gesehen hat, und genau das war das Problem. */
.historie-fuss {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  padding: var(--space-sm) var(--space-md);
  border-top: 1px solid var(--color-border-subtle);
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}

/* ══════════════════════════════════════════════════════════════════════════
   Offizieller Name aus den Spieldaten
   ══════════════════════════════════════════════════════════════════════════
   Beweis und Vermutung sehen VERSCHIEDEN aus. Wenn beide gleich aussähen,
   klickte man das eine so gedankenlos weg wie das andere. */
.offiziell {
  border-top: 1px solid var(--color-border-subtle);
}

/* Grün: exakter Treffer. Das ist beweisbar, es gibt dieses Item, es heißt so. */
.offiziell--sicher { background: var(--color-success-subtle, #eefaf3); }

/* Gelb: nur ähnlich. Eine Vermutung, die grob danebenliegen kann. */
.offiziell--unsicher { background: var(--color-warn-subtle, #fff8e1); }

.offiziell__kopf {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-bottom: 4px;
}

.offiziell__name { margin-bottom: var(--space-xs); }

.offiziell__meta {
  display: block;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}

.offiziell__warnung {
  font-size: var(--font-size-xs);
  color: var(--color-text);
  margin-bottom: var(--space-xs);
  line-height: 1.5;
}

/* ══════════════════════════════════════════════════════════════════════════
   Namen aus den Spieldaten
   ══════════════════════════════════════════════════════════════════════════ */
.namen__gruppe { margin-bottom: var(--space-lg); }
.namen__gruppe:last-child { margin-bottom: 0; }

/* Die alten .namen__titel / .namen__warnung sind ersatzlos entfallen, ihre
   Aufgabe erledigen jetzt .gruppe__kopf, .gruppe__titel und .gruppe__text
   (weiter oben). Sie hier "für alle Fälle" stehen zu lassen wäre der Anfang
   einer Datei, in der niemand mehr weiß, was noch benutzt wird. */

.namen__zeile {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  padding: var(--space-xs) var(--space-sm);
  border-bottom: 1px solid var(--color-border-subtle);
  font-size: var(--font-size-sm);
}
.namen__zeile:last-of-type { border-bottom: none; }

/* Der alte Name durchgestrichen, er ist ja der falsche. Das sagt in einem
   Zeichen, was drei Wörter bräuchten. Und es sagt es VOR dem Klick. */
.namen__alt {
  text-decoration: line-through;
  color: var(--color-text-muted);
}

.namen__pfeil { color: var(--color-text-muted); margin: 0 4px; }

.namen__meta {
  display: block;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

.namen__alle { margin-top: var(--space-sm); }

/* Die zwei Knöpfe rechts an einer Namenszeile: „Übernehmen" und „Ablehnen".
   Nebeneinander, und sie schrumpfen nicht, der Name links darf umbrechen. */
.namen__aktionen {
  display: flex;
  gap: var(--space-xs);
  flex-shrink: 0;
  align-items: center;
}

/* „Ablehnen" ist das leisere Veto, zurückhaltender als „Übernehmen". */
.namen__weg { color: var(--color-text-muted); }
.namen__weg:hover { color: var(--color-text-secondary); }


.namen__zeile--gesperrt {
  opacity: 0.7;
  cursor: default;
}

/* Der GRUND, warum etwas gesperrt ist, bzw. was nach dem Umbenennen ansteht.
   Er steht direkt an der Zeile, nicht in einer Fußnote. Eine Begründung, die
   man suchen muss, liest niemand. */
.namen__grund {
  display: block;
  margin-top: 2px;
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
  line-height: 1.5;
}

/* ══════════════════════════════════════════════════════════════════════════
   BEITRÄGE OHNE ANGEBOTSZEILE
   ══════════════════════════════════════════════════════════════════════════
   Die Kachel meldet eine Luecke, keinen Fehler. Deshalb ruhig gehalten: Die
   Aussetzer oben stehen als lesbare Liste, die ungelernten Formate darunter
   nur als Marken mit Zahl. Wer die Seite ueberfliegt, soll die Groesse der
   Luecke sehen, ohne sie lesen zu muessen. */
.luecke__gruppe { margin-bottom: var(--space-lg); }
.luecke__gruppe:last-child { margin-bottom: 0; }

.luecke__titel {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  font-weight: 500;
  margin-bottom: var(--space-sm);
}

/* Der Rollbalken liegt IM Kasten, nicht daneben. Ohne diesen Abstand klebt
   der Forum-Link rechts direkt am Balken und sieht aus, als waere er
   abgeschnitten. */
.luecke__liste {
  max-height: 40vh;
  overflow-y: auto;
  padding-right: var(--space-sm);
}

.luecke__zeile {
  display: flex;
  align-items: baseline;
  gap: var(--space-sm);
  padding: 5px 0;
  border-bottom: 1px solid var(--color-border-subtle);
}
.luecke__zeile:last-child { border-bottom: 0; }

.luecke__datum {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  white-space: nowrap;
  min-width: 6.5em;
}
.luecke__text { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.luecke__link { font-size: var(--font-size-xs); white-space: nowrap; }
.luecke__rest {
  margin-top: var(--space-sm);
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}

.luecke__marken { display: flex; flex-wrap: wrap; gap: var(--space-sm); }
.luecke__marke {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  padding: 3px 10px;
  border-radius: 999px;
  border: 1px solid var(--color-border);
  color: var(--color-text-secondary);
  font-size: var(--font-size-xs);
}
.luecke__marke b { color: var(--color-text); }

/* Format, Anzahl, Grund: drei Spalten, damit die Zahlen untereinander
   stehen und der Grund lesbar bleibt. */
.luecke__format { min-width: 9em; font-weight: 500; }
.luecke__anzahl {
  min-width: 3em;
  text-align: right;
  color: var(--color-text);
  font-variant-numeric: tabular-nums;
}

/* ── Shop-Artikel ohne Item ──────────────────────────────────────────────
   Name und Vorschlag in einer Zeile, die Beschreibung gedaempft darunter.
   Ohne die Beschreibung muesste man bei jedem Namen raten, worum es geht. */
.shopname {
  padding: 8px 0;
  border-bottom: 1px solid var(--color-border-subtle);
}
.shopname:last-child { border-bottom: 0; }

.shopname__zeile {
  display: flex;
  align-items: baseline;
  gap: var(--space-sm);
  flex-wrap: wrap;
}
.shopname__shop { font-weight: 500; }
.shopname__pfeil {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
}
.shopname__item { color: var(--color-primary); }
.shopname__text {
  margin-top: 3px;
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  line-height: 1.5;
  overflow-wrap: anywhere;
}

/* Die Knoepfe stehen rechts in der Zeile, nicht darunter: Wer die Liste
   durchgeht, will mit dem Auge in einer Spalte bleiben. */
.shopname__knoepfe {
  margin-left: auto;
  display: flex;
  gap: 6px;
  white-space: nowrap;
}
/* Zustimmen gruen, ablehnen rot, in beiden Gruppen dieselbe Zuordnung. Wer
   die Liste durchgeht, soll nicht bei jedem Knopf neu lesen muessen, was die
   Farbe hier gerade bedeutet. */
.shopname__ja:hover,
.shopname__neu:hover  { border-color: var(--color-success); color: var(--color-success); }
.shopname__nein:hover,
.shopname__weg:hover  { border-color: var(--color-danger);  color: var(--color-danger); }

/* ══════════════════════════════════════════════════════════════════════════
   DER REITER "ÜBERSICHT" ALS EINE EINZIGE KARTE
   ══════════════════════════════════════════════════════════════════════════
   WARUM DIE KLASSEN HIER WEITER "erfassen" HEISSEN
   Der Reiter hieß "Erfassen", solange dort ein Formular zum Einfügen stand.
   Das Formular ist weg, der Name versprach also etwas, das man nicht mehr
   findet, und heißt seit Juli 2026 "Übersicht". Die Klassennamen sind
   geblieben: .erfassen, .erfassen__kopf, .erfassen__zahlen und der Rest
   stehen im CSS, in index.html und im Skript darunter. Sie umzutaufen wäre an
   die hundert Fundstellen quer durch drei Dateien, ohne dass sich am Bild
   auch nur ein Pixel ändert. Ein interner Name muss nicht schön sein, er muss
   an allen Stellen derselbe sein. Wer hier nach "Übersicht" sucht und nichts
   findet: das ist dieser Block.

   Zahlen, "Aktuell im Shop", die Prüf-Liste und die Beitragsliste standen in
   je einem eigenen Kasten. Vier Rahmen behaupten vier getrennte Themen, es ist
   aber eines: was im Shop passiert ist.

       Ein Rahmen sagt "das hier gehört zusammen und der Rest nicht".
       Wer ihn viermal setzt, sagt es viermal und meint es nie.

   Jetzt trennen nur noch Haarlinien, wie auf der Changelog-Seite. Die
   Abschnitte unterscheiden sich durch die Farbe ihrer Kopfzeile, nicht durch
   Umrandung: Farbe ordnet ein (grün läuft, gelb will Arbeit, grau ist
   Nachschlagen), ein Rahmen trennt nur ab.
   ══════════════════════════════════════════════════════════════════════════ */
.erfassen {
  background: var(--color-surface);
  border: 0.5px solid var(--color-border);
  border-radius: var(--radius-md);
  /* Die Kopfzeilen laufen bis an den Rand. Ohne overflow schneidet die
     Rundung sie nicht mit, und in den Ecken guckt Farbe über den Bogen. */
  overflow: hidden;
}

/* ── 1. Die Zahlenzeile ──────────────────────────────────────────────────
   Vier Blicke auf denselben Bestand, deshalb vier gleich breite Felder ohne
   eigene Rahmen. Die Breite kommt aus flex-basis 0: Sonst bestimmte die
   längste Beschriftung die Spalte, und die Zahlen ständen nicht untereinander,
   sobald aus 7 eine 1204 wird. */
.erfassen__zahlen {
  gap: 0;
  padding: var(--space-md) 0;
  border-bottom: 0.5px solid var(--color-border);
}

.erfassen__zahlen .stat {
  flex: 1 1 0;
  min-width: 0;
  padding: 0 var(--space-sm);
}

/* Die Haarlinie steht ZWISCHEN den Feldern, nicht um sie herum: Sie soll
   ordnen, nicht vier Kästchen zeichnen. */
.erfassen__zahlen .stat + .stat {
  border-left: 0.5px solid var(--color-border);
}

/* ── 2. Die Abschnitte ───────────────────────────────────────────────────
   Jeder Abschnitt ist nur ein Streifen in der Karte. Die Linie sitzt oben und
   nicht unten, damit der letzte Abschnitt nicht auf der Kartenkante doppelt. */
.erfassen__block {
  display: block;
}

.erfassen__block + .erfassen__block,
.erfassen__zahlen + .erfassen__block {
  border-top: 0.5px solid var(--color-border);
}

/* ── Die Kopfzeilen ──────────────────────────────────────────────────────
   Alle drei bauen gleich: Zeichen links, Titel, Anzahl rechts. Nur die Farbe
   unterscheidet sie. Wer die Seite einmal gelesen hat, findet die Anzahl beim
   zweiten Abschnitt an derselben Stelle wie beim ersten. */
.erfassen__kopf {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  padding: var(--space-sm) var(--space-md);
  background: var(--color-bg-subtle);
  flex-wrap: wrap;
}

.erfassen__kopf--gruen { background: var(--color-success-subtle); }
.erfassen__kopf--gelb  { background: var(--color-warning-subtle); }

.erfassen__titel {
  font-size: var(--font-size-base);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text);
  margin: 0;
}

.erfassen__kopf--gruen .erfassen__titel { color: var(--color-success); }
.erfassen__kopf--gelb  .erfassen__titel { color: var(--color-warning); }

/* Der Punkt ist die Ampel: Er sagt "jetzt gerade", bevor man den Titel liest. */
.erfassen__punkt {
  width: 8px;
  height: 8px;
  border-radius: var(--radius-full);
  background: var(--color-success);
  flex: 0 0 auto;
}

.erfassen__warnzeichen {
  color: var(--color-warning);
  font-size: var(--font-size-md);
  line-height: 1;
  flex: 0 0 auto;
}

/* Die Anzahl steht direkt HINTER dem Titel, als Teil der Überschrift. Am
   rechten Rand war sie eine Zahl für sich, und man musste den Blick zurück
   zum Titel werfen, um zu wissen, wovon sie überhaupt spricht. Ohne
   Mindestbreite hüpfte die Pille beim Wechsel von 9 auf 10. */
.erfassen__anzahl {
  font-size: var(--font-size-xs);
  font-variant-numeric: tabular-nums;
  color: var(--color-text-secondary);
  background: var(--color-surface-raised);
  border-radius: var(--radius-full);
  padding: 2px 10px;
  min-width: 30px;
  text-align: center;
}

/* Leer heißt: es gibt nichts zu zählen. Dann soll auch keine leere Pille
   stehen bleiben, das JS schreibt in diesem Fall einen leeren Text. */
.erfassen__anzahl:empty { display: none; }

/* Grau in einer grünen Kopfzeile sieht aus, als wäre die Pille dort
   hineingefallen: Sie ist der einzige Fleck, der die Farbe des Abschnitts
   nicht mitmacht. Also nimmt sie die Farbfamilie ihrer Kopfzeile an, aber nur
   in der Schrift. Die Fläche bleibt neutral und dunkler als der Kopf, sonst
   verschwände die Pille darin. Klein und normal gesetzt bleibt sie damit
   leiser als der Titel, der dieselbe Farbe kräftiger trägt. */
.erfassen__kopf--gruen .erfassen__anzahl {
  background: var(--color-surface);
  color: var(--color-success);
}

.erfassen__kopf--gelb .erfassen__anzahl {
  background: var(--color-surface);
  color: var(--color-warning);
}

/* ── Der Inhalt eines Abschnitts ─────────────────────────────────────── */
.erfassen__inhalt {
  padding: 0 var(--space-md);
}

/* Die Beitragstabelle bringt ihren eigenen Rahmen mit, weil sie früher in
   einem eigenen Kasten stand. In der einen Karte wäre das ein Rahmen im
   Rahmen. Das Scrollen bleibt, nur die Umrandung geht. */
.erfassen__inhalt .liste-scroll {
  border: none;
  border-radius: 0;
}

.erfassen__hinweis {
  padding: var(--space-sm) var(--space-md) 0;
  margin: 0;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}

/* ── Die Filter in der Kopfzeile ─────────────────────────────────────────
   Sie gehören zu dieser einen Liste, deshalb stehen sie in deren Kopfzeile
   und nicht als eigene Leiste darüber. Auf schmalen Bildschirmen rutschen sie
   in die nächste Zeile, statt die Felder auf Briefmarkengröße zu quetschen. */
.erfassen__filter {
  margin-left: auto;
  display: flex;
  gap: var(--space-sm);
  flex-wrap: wrap;
}

.erfassen__filter .form-input {
  width: auto;
  min-width: 150px;
  font-size: var(--font-size-sm);
  padding: 4px var(--space-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   ZWANZIG ZEILEN, DER REST AUF KLICK
   ══════════════════════════════════════════════════════════════════════════
   Neun von zehn Tagen bleiben unter elf Angeboten, der größte hatte 209. Ohne
   Deckel schöbe ein einziger solcher Tag alles andere aus dem Bild.

   Wo die Grenze liegt, steht NUR im Skript im Template. Hier stand sie vorher
   dreimal als nth-child(n+6) daneben, und wer sie ändern wollte, musste alle
   Stellen finden. Jetzt hängt das Skript den überzähligen Zeilen ein
   data-verdeckt an, und diese Regel blendet aus, was markiert ist.

   Das Aufklappen macht <details> allein. Der Deckel steht als Geschwister
   HINTER der Liste, deshalb :has(): Es gibt keinen Weg, vom Deckel rückwärts
   auf die Liste zu zeigen, wohl aber vom gemeinsamen Block auf beide. */
.erfassen__block:not(:has(.erfassen__deckel[open])) .erfassen__inhalt [data-verdeckt] {
  display: none;
}

/* ── EINE AUFKLAPP-ZEILE MUSS NACH BEDIENELEMENT AUSSEHEN ─────────────────
   Sie war blauer Text, sonst nichts. Blauer Text heißt im Netz "Link", und ein
   Link führt woanders hin; dass man hier etwas AUFKLAPPT, stand nirgends. Wer
   die Seite nicht gebaut hat, liest die Zeile und geht weiter.

       Ein Knopf, den man nicht als Knopf erkennt, wird nicht gedrückt.
       Er ist dann kein zurückhaltendes Bedienelement, sondern keines.

   Jetzt hat sie eine Fläche, einen Rahmen und Innenabstand, und beim
   Darüberfahren wird sie heller und der Rahmen blau. Zurückhaltend bleibt sie
   trotzdem: gedeckter Hintergrund, Text in der zweiten Farbe. Es ist ein
   Nebenweg, kein Hauptknopf, und soll den Knöpfen der Liste nicht die Schau
   stehlen. */
.erfassen__deckel {
  border-top: 0.5px solid var(--color-border);
  padding: var(--space-sm) var(--space-md);
}

/* inline-flex, nicht flex: Der Knopf soll so breit sein wie seine Beschriftung.
   Über die ganze Kartenbreite gezogen sähe er wieder wie ein Streifen aus und
   nicht wie etwas, das man drückt. */
.erfassen__mehr {
  display: inline-flex;
  align-items: center;
  gap: var(--space-sm);
  padding: var(--space-xs) var(--space-md);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg-subtle);
  cursor: pointer;
  color: var(--color-text-secondary);
  font-size: var(--font-size-sm);
  list-style: none;               /* das Browser-Dreieck weg */
  transition: background var(--transition-fast),
              border-color var(--transition-fast),
              color var(--transition-fast);
}

.erfassen__mehr::-webkit-details-marker { display: none; }

.erfassen__mehr:hover {
  background: var(--color-surface-raised);
  border-color: var(--color-primary);
  color: var(--color-primary);
}

/* Wer mit der Tastatur unterwegs ist, sieht sonst nicht, wo er steht. */
.erfassen__mehr:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

/* Eigener Pfeil statt Browser-Dreieck: ein gedrehtes Quadrat sitzt in jeder
   Schriftart gleich und dreht sich beim Aufklappen mit. */
.erfassen__mehr::after {
  content: "";
  width: 6px;
  height: 6px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(45deg);
  transform-origin: center;
  margin-bottom: 3px;
  transition: transform var(--transition-fast);
}

.erfassen__deckel[open] .erfassen__mehr::after { transform: rotate(-135deg); }
.erfassen__deckel[open] .erfassen__mehr-text::after { content: " (zuklappen)"; }

/* ══════════════════════════════════════════════════════════════════════════
   EIN BEITRAG DECKELT SICH SELBST
   ══════════════════════════════════════════════════════════════════════════
   Ein laufendes Glücksrad bringt drei Ebenen mit zusammen rund 150 Kärtchen
   mit. Das ist ein einziger Beitrag, aber länger als die ganze übrige Seite.
   Das Skript steckt darum alles ab Ebene 2 in ein <details>, hier steht nur,
   wie die Zeile dazu aussieht: dieselbe Sprache wie der große Deckel, nur
   kleiner und eingerückt, weil sie zu EINEM Beitrag gehört und nicht zur
   Liste. */
.aktuell-item__deckel {
  margin: var(--space-xs) 0 var(--space-sm);
}

/* Dieselbe Knopf-Form wie beim großen Deckel, nur eine Nummer kleiner. "Ebene 2
   und Ebene 3 anzeigen" war blauer Text und sah damit aus wie eine Fußnote,
   dabei ist es der einzige Weg zu den restlichen Gewinnen. */
.aktuell-item__mehr {
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
  padding: var(--space-xs) var(--space-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg-subtle);
  cursor: pointer;
  color: var(--color-text-secondary);
  font-size: var(--font-size-xs);
  list-style: none;
  transition: background var(--transition-fast),
              border-color var(--transition-fast),
              color var(--transition-fast);
}

.aktuell-item__mehr::-webkit-details-marker { display: none; }

.aktuell-item__mehr:hover {
  background: var(--color-surface-raised);
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.aktuell-item__mehr:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

.aktuell-item__mehr::after {
  content: "";
  width: 5px;
  height: 5px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(45deg);
  transform-origin: center;
  margin-bottom: 3px;
  transition: transform var(--transition-fast);
}

.aktuell-item__deckel[open] .aktuell-item__mehr::after { transform: rotate(-135deg); }

/* Zwei Texte im Knopf, je nach Zustand einer sichtbar. Zugeklappt "Weitere N
   anzeigen", offen "N weniger anzeigen". Der Browser entscheidet das am [open]
   des <details>, kein JavaScript. */
.aktuell-item__mehr .deckel-auf { display: none; }
.aktuell-item__deckel[open] > .aktuell-item__mehr .deckel-zu { display: none; }
.aktuell-item__deckel[open] > .aktuell-item__mehr .deckel-auf { display: inline; }

/* Ein aufgeklappter Überhang bekommt Abstand nach oben, sonst klebt die erste
   Reihe an der Zeile, die sie geöffnet hat. */
.aktuell-item__deckel[open] > .inhalt-liste {
  margin-top: var(--space-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   DIE KÄRTCHEN BRAUCHEN LUFT
   ══════════════════════════════════════════════════════════════════════════
   Bei sechs Zimmerpflanzen sah die enge Packung noch ordentlich aus. Bei
   vierzig ergibt sie eine Mauer, in der kein einzelner Name mehr auffällt,
   und genau das Auffallen ist ja der Zweck.

       Abstand ist keine Verschwendung. Er ist das, woran das Auge
       merkt, wo ein Ding aufhört und das nächste anfängt.

   Nur in dieser Karte, das Item-Fenster und die anderen Seiten bleiben eng. */
.erfassen .inhalt-liste {
  gap: var(--space-sm);
  margin-bottom: var(--space-sm);
}

.erfassen .inhalt-chip {
  padding: 6px 12px;
  line-height: 1.45;
}

.erfassen .inhalt-chip--preis { padding-right: 6px; }

/* ══════════════════════════════════════════════════════════════════════════
   EIN BEITRAG IST EIN BLOCK, AUCH OHNE RAHMEN
   ══════════════════════════════════════════════════════════════════════════
   Oben das Schild, darunter der Titel, darunter die Kärtchen, und alles mit
   vier Pixeln dazwischen. Drei verschiedene Auskünfte, gleich weit
   auseinander wie die Zeilen innerhalb einer davon. Wer darüberschaut, sieht
   einen Textblock und muss sich die Gliederung selbst denken.

       Zusammengehörendes erkennt man nicht am Rahmen, sondern daran,
       dass innen weniger Platz ist als außen. Ist der Abstand überall
       gleich, gibt es keine Gruppen.

   Also gestuft: eng innerhalb einer Zeile, mittel zwischen Schild, Titel und
   Kärtchen, weit zwischen zwei Beiträgen. Ein Rahmen ist dann nicht nötig,
   die dünne Trennlinie reicht.

   Nur in dieser Karte. Die Kärtchen im Item-Fenster stehen weiter eng. */
.erfassen .aktuell-item {
  padding: var(--space-lg) 0;
}

.erfassen .aktuell-item__kopf {
  margin-bottom: var(--space-sm);
}

/* ── DIE ÜBERSCHRIFT EINES BEITRAGS ──────────────────────────────────────
   Sie war fetter Text in Lesegröße, daneben ein blasses Datum, und darunter
   fingen ohne Übergang die Kärtchen an. Der Beitragstitel sah damit genauso
   aus wie jede andere Zeile in der Karte, obwohl er der Kopf von zwanzig
   Kärtchen ist.

       Eine Überschrift muss nicht laut sein. Sie muss nur größer sein
       als das, was sie überschreibt.

   Also eine Stufe größer, mehr nicht. Kein zweites Fettgewicht, keine Farbe,
   keine eigene Fläche: Die Kopfzeile darüber ist schon farbig, und zwei
   farbige Ebenen übereinander machen aus einer Liste ein Plakat. */
.erfassen .aktuell-item__titel {
  font-size: var(--font-size-md);
  line-height: 1.4;
  /* Die Haarlinie schließt Art-Schild und Titel zu EINEM Kopf zusammen und
     setzt die Kärtchen darunter ab. Dünner als die Linie zwischen zwei
     Beiträgen, sonst läse man sie als neuen Beitrag. */
  padding-bottom: var(--space-sm);
  border-bottom: 0.5px solid var(--color-border-subtle);
  margin-bottom: var(--space-md);
}

/* Der Zeitraum bekommt eine eigene kleine Fläche, dieselbe wie die
   Anzahl-Pille in der Beitragsliste. Als blasser Text hing er am Namen und
   las sich wie dessen Fortsetzung ("Ring der Freude Rad 2 13.07."). Auf
   eigener Fläche ist auf einen Blick klar: hier hört der Name auf, hier
   fängt die Laufzeit an. Nur im Beitragskopf, in der Beitragsliste bleibt
   der Zeitraum schlichter Text, dort stehen zwanzig davon untereinander. */
.erfassen .aktuell-item__titel .beitrag-zeitraum {
  display: inline-block;
  padding: 2px var(--space-sm);
  border-radius: var(--radius-sm);
  background: var(--color-bg-subtle);
  color: var(--color-text-secondary);
  font-size: var(--font-size-xs);
  line-height: 1.4;
  vertical-align: middle;
}

.erfassen .aktuell-item__chips,
.erfassen .aktuell-item__gewinne {
  margin-top: var(--space-sm);
}

/* Der Knopf klebte an den Kärtchen darüber und sah aus, als gehörte er zur
   letzten Reihe. Er ist aber der Weg zur nächsten, also braucht er Luft. */
.erfassen .aktuell-item__deckel {
  margin-top: var(--space-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   JEDE BEITRAGSART HAT IHRE EIGENE FARBE
   ══════════════════════════════════════════════════════════════════════════
   Alle Schilder waren blau. Damit war das Schild nur noch eine Beschriftung,
   die man lesen musste, obwohl sie die Stelle besetzt, an der Farbe am
   billigsten wirkt.

       Ein Kennzeichen, das immer gleich aussieht, kennzeichnet nichts.

   Die Farben kommen aus dem Design-System, es gibt also vier Töne und Grau.
   Zehn Beitragsarten auf zehn Wunschfarben zu verteilen hieße, neue Werte zu
   erfinden und aus der Liste einen Regenbogen zu machen. Stattdessen steht
   die Farbe für die SIPPE, und die hellere Schwester für das zweite Mitglied
   darin:

       Blau   kaufen        Angebot im Shop, dauerhaft im Shop
       Grün   gewinnen      Rad, Tombola
       Gelb   Rabattaktion  WM Sale, Flash Deals
       Rot    Eile          Blitzauktion, Happy Hour
       Grau   nachschlagen  Event, Sonstiges

   So erkennt man beim Durchblättern zuerst, WORUM es geht, und liest erst
   dann, welche der beiden Arten es genau ist. */
.erfassen .typ-schild {
  background: var(--color-surface-raised);
  color: var(--color-text-muted);
}

/* In der Beitragsliste ist das Schild zugleich der Weg zum Beitrag. Es steht in
   jeder Zeile, auch dort, wo der Titel wegfällt, weil er nur Datum und Art
   wiederholt hätte. Ein <button> bringt Rahmen und eigene Schrift mit, beides
   muss weg, sonst sähe das Schild anders aus als dasselbe Schild in "Aktuell im
   Shop". Beim Darüberfahren legt sich ein dünner blauer Ring darum: die Farbe
   des Schildes bleibt, es ist ja immer noch eine Auskunft. */
.erfassen button.typ-schild {
  border: none;
  font-family: inherit;
  font-weight: var(--font-weight-semibold);
  cursor: pointer;
}

.erfassen button.typ-schild:hover {
  box-shadow: 0 0 0 1px var(--color-primary);
}

.erfassen button.typ-schild:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

/* Blau: hier wird gekauft. */
.erfassen .typ-schild--angebot {
  background: var(--color-primary-subtle);
  color: var(--color-primary);
}
.erfassen .typ-schild--preissenkung {
  background: var(--color-primary-subtle);
  color: var(--color-primary-hover);
}

/* Grün: hier wird gelost, nicht gekauft. */
.erfassen .typ-schild--rad {
  background: var(--color-success-subtle);
  color: var(--color-success);
}
.erfassen .typ-schild--tombola {
  background: var(--color-success-subtle);
  color: var(--color-success-hover);
}

/* Gelb: befristete Rabattaktion. */
.erfassen .typ-schild--wm_sale {
  background: var(--color-warning-subtle);
  color: var(--color-warning);
}
.erfassen .typ-schild--flash_deal {
  background: var(--color-warning-subtle);
  color: var(--color-warning-hover);
}

/* Rot: läuft ab, wer zögert, verpasst es. */
.erfassen .typ-schild--blitzauktion {
  background: var(--color-danger-subtle);
  color: var(--color-danger);
}
.erfassen .typ-schild--happy_hour {
  background: var(--color-danger-subtle);
  color: var(--color-danger-hover);
}

/* Grau: nichts zu holen, nur zum Nachschlagen. Event bleibt etwas kräftiger
   als "Sonstiges", denn es ist eine Aussage und kein Auffangbecken. */
.erfassen .typ-schild--event {
  background: var(--color-surface-raised);
  color: var(--color-text-secondary);
}
.erfassen .typ-schild--sonstiges {
  background: var(--color-bg-subtle);
  color: var(--color-text-muted);
}

/* ══════════════════════════════════════════════════════════════════════════
   NAME KRÄFTIG, ZEITRAUM LEISE
   ══════════════════════════════════════════════════════════════════════════
   "Fussball Sale 11.06.-24.07.2026" ist eine Zeile mit zwei Auskünften. Das
   Skript trennt sie (siehe titelHtml in angebote.js), hier bekommen beide ihr
   Gewicht: der Name so, wie er war, das Datum kleiner, leiser und mit etwas
   Luft davor. Es steht damit sichtbar daneben statt mittendrin.

   Der Zeitraum bricht nicht um. Ein "13.07. -" am Zeilenende und die zweite
   Hälfte darunter liest sich wie zwei Termine. */
.erfassen .beitrag-zeitraum {
  margin-left: var(--space-sm);
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-normal);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Der Abstand links trennt den Zeitraum vom Namen. Fällt der Name weg, weil er
   nur wiederholte, was das Art-Schild schon sagt, trennt er von nichts mehr und
   schiebt den Zeitraum bloß eingerückt nach rechts. */
.erfassen .beitrag-zeitraum:first-child { margin-left: 0; }

/* ══════════════════════════════════════════════════════════════════════════
   DIE ANZAHL IST EINE ANGABE, KEIN SCHILD
   ══════════════════════════════════════════════════════════════════════════
   Sie steht jetzt direkt hinter dem Titel und damit dicht neben dem farbigen
   Art-Schild. Zwei gerundete Kästchen nebeneinander liest man aber als zwei
   Schilder, und dann sucht man in der Zahl eine Bedeutung, die sie nicht hat.

       Nähe schafft Verwechslung. Was nebeneinander steht, muss sich
       deutlicher unterscheiden als das, was weit auseinander liegt.

   Also alles weglassen, was das Schild ausmacht: keine Farbe, kein fettes
   Gewicht, keine ganz runde Form. Bleibt ein grauer Kasten mit einer Zahl,
   leise genug, um nicht zu stören, und nah genug, um dazuzugehören. Die
   Ziffern in fester Breite, sonst wackeln die Pillen von Zeile zu Zeile. */
.erfassen .beitrag-anzahl {
  display: inline-flex;
  align-items: baseline;
  margin-left: var(--space-sm);
  padding: 2px var(--space-sm);
  border-radius: var(--radius-sm);
  background: var(--color-bg-subtle);
  color: var(--color-text-secondary);
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-normal);
  font-variant-numeric: tabular-nums;
  line-height: 1.4;
  white-space: nowrap;
}

/* Ein Rad hat keine Angebote, es hat Gewinne, und eine Truhe hat Inhalte.
   Weil beides in derselben Pille steht, muss dranstehen, WAS gezählt wird.
   "Inh." ist kurz genug, um nicht zu stören, aber nicht selbsterklärend,
   deshalb schreibt der Hover es aus. */
.erfassen .beitrag-anzahl__art {
  margin-left: var(--space-xs);
  font-size: 0.85em;
  color: var(--color-text-muted);
  cursor: help;
}

/* Wo der Titel den Zeitraum schon nennt, bleibt die rechte Angabe leer. Ein
   leeres Feld soll auch keine Lücke reißen, sonst rückt das Schild ohne Grund
   nach links. */
.erfassen .aktuell-item__zeit:empty { display: none; }

/* ══════════════════════════════════════════════════════════════════════════
   DAS LÖSCHKREUZ STEHT VORN UND HÄLT DEN MUND
   ══════════════════════════════════════════════════════════════════════════
   Es sitzt jetzt am Zeilenanfang, vor dem Datum (siehe angebote.js). Damit
   steht der gefährlichste Knopf der Seite genau dort, wo das Auge beim Lesen
   jeder Zeile anfängt.

       Was leicht zu treffen ist, muss leise sein. Sonst wird aus
       "gut erreichbar" schnell "aus Versehen gedrückt".

   Also gedeckt im Ruhezustand: kein Rahmen, keine Fläche, die stille dritte
   Textfarbe. Erst beim Darüberfahren wird er rot und bekommt seine Fläche.
   Die Spalte bleibt so schmal wie das Zeichen, sonst schöbe sie das Datum
   ohne Grund nach rechts. */
.erfassen .historie-loeschen {
  width: 1%;
  padding-right: 0;
}

.erfassen .btn-delete-row {
  border: none;
  background: transparent;
  color: var(--color-text-muted);
}

.erfassen .btn-delete-row:hover,
.erfassen .btn-delete-row:focus-visible {
  background: var(--color-danger-subtle);
  color: var(--color-danger);
}

/* ── Schmale Bildschirme ─────────────────────────────────────────────────
   Vier Zahlenfelder nebeneinander werden unter 700px zu schmal für die
   Beschriftung. Zwei mal zwei behält die Lesbarkeit; dabei fällt die
   senkrechte Linie beim dritten Feld weg, sie stünde sonst am Zeilenanfang. */
@media (max-width: 700px) {
  .erfassen__zahlen { flex-wrap: wrap; }
  .erfassen__zahlen .stat { flex: 1 1 45%; padding: var(--space-sm); }
  .erfassen__zahlen .stat:nth-child(3) { border-left: none; }
  .erfassen__filter { width: 100%; margin-left: 0; }
  .erfassen__filter .form-input { flex: 1 1 100%; }
}

/* ══════════════════════════════════════════════════════════════════════════
   DAS HIDDEN-ATTRIBUT MUSS GEWINNEN
   ══════════════════════════════════════════════════════════════════════════
   "hidden" wirkt über die eingebaute Regel [hidden] { display: none } des
   Browsers, und die ist nur eine Vorgabe. Jedes eigene "display: flex" schlägt
   sie. Der Prüf-Abschnitt und die Deckel-Zeilen stehen genau so im Template
   und blieben sonst sichtbar, obwohl das Skript sie versteckt hat.

       Ein Schalter, den eine andere Regel überstimmt, ist kein
       Schalter. Er sieht nur so aus. */
.erfassen [hidden] { display: none !important; }


/* ── Bug-Report-Textfeld ──────────────────────────────────────────────────────
   Ohne Regel hat ein textarea "resize: both": Man kann es am Griff unten rechts
   in JEDE Richtung ziehen, auch seitlich über den Kartenrand hinaus. Das sah
   nach einem Fehler aus. Jetzt nur noch senkrecht, mit einer Ober- und
   Untergrenze, damit es weder zum Strich schrumpft noch aus der Karte wächst. */
.melde-seite textarea.form-input {
  resize: vertical;
  min-height: 110px;
  max-height: 340px;
  /* Schlanke Rollleiste statt der klobigen Windows-Leiste mit Pfeil-Knöpfen.
     Standard-Eigenschaft, wirkt in Chrome und Firefox; die dunkle Farbe kommt
     schon von color-scheme: dark (siehe design-system.css). */
  scrollbar-width: thin;
}
