/* Inter wird lokal ausgeliefert, damit Seitenaufrufe keine Mitglieds-IP an
   Google übertragen. Die variable Datei bildet auch Zwischenwerte wie 650
   nativ ab; getrennte Unicode-Bereiche laden Kyrillisch nur bei Bedarf. */
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/assets/fonts/InterVariable.woff2") format("woff2");
  unicode-range: U+0400-045F, U+0460-052F, U+0490-0491, U+04B0-04B1,
    U+1C80-1C8A, U+2116, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/assets/fonts/InterVariable.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
    U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F,
    U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113,
    U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/assets/fonts/InterVariable.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC,
    U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F,
    U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* =========================================================================
   WiFi Money Club — App Stylesheet
   Premium dark UI, blue accent. Style reference: ProTrader (myprotrader.app),
   recolored to WiFi-Money blue (#9250ec).
   ========================================================================= */

/* ---------- Design Tokens ---------------------------------------------- */
:root {
  /*
   * DIE ANWENDUNG IST DUNKEL - das muss der Browser wissen.
   *
   * Ohne diese Angabe zeichnet er seine EIGENEN Bedienelemente nach dem
   * Farbschema des Betriebssystems: Eingabefelder ohne gesetzten Grund,
   * Bildlaufleisten, Auswahllisten, Datumswaehler. Auf einem hellen System
   * wurden sie weiss - mitten in einer dunklen Oberflaeche, und mit weisser
   * Schrift darin unlesbar.
   *
   * Genau daran hing der Befund vom 08.08.2026 ("das Auge sieht man nicht auf
   * weissen Feldern"): Nicht das Symbol war falsch, der Untergrund war es.
   */
  color-scheme: dark;

  /* Surfaces */
  --canvas:        #0A0A0C;   /* app background           */
  --sidebar-bg:    #0D0D10;   /* sidebar background       */
  --card:          #1A1A20;   /* cards / panels (lifted off the dark canvas) */
  --card-hover:    #202027;   /* card / row hover         */
  --elevated:      #17171d;   /* dropdowns, popovers      */
  /* Eingabefelder. WAR NIE DEFINIERT und wurde trotzdem benutzt: Die Zeile
     background: var(--surface) fiel damit weg, und die Konto-Felder bekamen die
     Vorgabe des Browsers - weiss. Zusammen mit color: var(--text) hiess das auf
     einem hellen System weisse Schrift auf weissem Grund, und das Auge zum
     Sichtbarmachen war ebenfalls unsichtbar. Derselbe Wert wie bei .input. */
  --surface:       #0c0c0f;   /* input fields             */

  /* Borders */
  --border:        rgba(255, 255, 255, 0.06);
  --border-strong: rgba(255, 255, 255, 0.10);
  /* Zweitname fuer dieselben zwei Werte: Die Schreibleiste benutzt --line,
     der Rest --border. Statt die Aufrufe umzuschreiben, bekommt der Name eine
     Definition - so bleibt beides lesbar und nichts faellt weg. */
  --line:          rgba(255, 255, 255, 0.06);
  --line-strong:   rgba(255, 255, 255, 0.10);

  /* Brand / accent */
  --accent:        #9250ec;
  --accent-hover:  #a66bf0;
  --accent-glow:   rgba(146, 80, 236, 0.15);
  --accent-soft:   rgba(146, 80, 236, 0.12);
  --accent-line:   rgba(146, 80, 236, 0.35);

  /* Text */
  --text:          #FFFFFF;
  --text-muted:    rgba(255, 255, 255, 0.55);
  --text-faint:    rgba(255, 255, 255, 0.35);

  /* Status (use sparingly) */
  --green:         #22C55E;
  --green-soft:    rgba(34, 197, 94, 0.12);
  --red:           #FF3B30;
  --red-soft:      rgba(255, 59, 48, 0.12);
  /* Ohne diese Zeile hatte "Lektion abgeschlossen" gar keine Farbe. */
  --success:       #22C55E;
  /* Warnstufe: Zugang gefährdet, aber noch vorhanden. Der Ton ist der der
     Streak-Anzeige (#ffb020) — er war schon im Design, nur ohne Rolle. */
  --warn:          #ffb020;
  --warn-line:     rgba(255, 176, 32, 0.35);
  --warn-soft:     rgba(255, 176, 32, 0.12);
  --warn-glow:     rgba(255, 176, 32, 0.18);

  /* Radii */
  --r-card:        16px;
  --r-item:        10px;
  --r-pill:        999px;
  --r-sm:          8px;

  /* Spacing scale */
  --s-1: 4px;
  --s-2: 8px;
  --s-3: 12px;
  --s-4: 16px;
  --s-5: 20px;
  --s-6: 24px;
  --s-7: 28px;
  --s-8: 32px;
  --s-10: 40px;

  /* Layout */
  --sidebar-w:     264px;
  --sidebar-w-collapsed: 76px;
  --header-h:      68px;

  /* Shadows */
  --shadow-soft:   0 8px 30px rgba(0, 0, 0, 0.35);
  --shadow-card:   0 1px 0 rgba(255,255,255,0.02), 0 10px 30px rgba(0,0,0,0.25);
  --shadow-pop:    0 12px 40px rgba(0, 0, 0, 0.55);
}

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

/* body wächst mit dem Inhalt (min-height statt fixem height:100%) — wichtig,
   damit das Dokument sauber am Viewport scrollt und position:sticky greift. */
html { height: 100%; }
body { min-height: 100%; }

body {
  margin: 0;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
    Helvetica, Arial, sans-serif;
  background: var(--canvas);
  color: var(--text);
  font-size: 14px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

a { color: inherit; text-decoration: none; }

button { font-family: inherit; cursor: pointer; }

::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: rgba(255, 255, 255, 0.08);
  border-radius: 999px;
  border: 2px solid transparent;
  background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.16); background-clip: padding-box; }

/* =========================================================================
   APP SHELL
   ========================================================================= */
.app {
  display: flex;
  min-height: 100vh;
}

.main {
  flex: 1;
  min-width: 0;            /* allow children to shrink */
  margin-left: var(--sidebar-w);
  display: flex;
  flex-direction: column;
  transition: margin-left .22s ease;
}

.app.collapsed .main { margin-left: var(--sidebar-w-collapsed); }

/* =========================================================================
   SIDEBAR
   ========================================================================= */
.sidebar {
  position: fixed;
  top: 0;
  left: 0;
  width: var(--sidebar-w);
  height: 100vh;
  background: var(--sidebar-bg);
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  z-index: 60;
  transition: width .22s ease, transform .22s ease;
}

.app.collapsed .sidebar { width: var(--sidebar-w-collapsed); }

/* Brand / logo block */
.sidebar__brand {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-5) var(--s-5) var(--s-4);
  height: var(--header-h);
  flex-shrink: 0;
}

.brand__mark {
  width: 34px;
  height: 34px;
  border-radius: 10px;
  flex-shrink: 0;
  display: grid;
  place-items: center;
  background: linear-gradient(135deg, var(--accent), #4a1fb0);
  box-shadow: 0 6px 18px var(--accent-glow);
  color: #fff;
}

.brand__mark svg { width: 18px; height: 18px; }

/* Marken-Logo (Bild) — ersetzt Icon-Box + Text.
   --full  = komplette Wortmarke (Standard)
   --icon  = nur das Emblem (Sidebar eingeklappt) */
.brand__logo { display: block; height: 22px; width: auto; max-width: 100%; }
.brand__logo--icon { display: none; height: 34px; }
.brand__admin { flex-shrink: 0; }
.sidebar__brand--admin { overflow: hidden; }
.sidebar__brand--admin .brand__logo--full { height: 26px; }   /* Platz für ADMIN-Pill */

.brand__text {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  white-space: nowrap;
  overflow: hidden;
}

.brand__name {
  font-weight: 700;
  font-size: 15px;
  letter-spacing: .2px;
}

.pill {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .5px;
  padding: 2px 7px;
  border-radius: var(--r-pill);
  line-height: 1.4;
}

.pill--beta {
  color: var(--accent);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
}

.pill--soon {
  color: var(--text-faint);
  border: 1px solid var(--border-strong);
  background: rgba(255, 255, 255, 0.03);
}

/* Navigation scroll area */
.sidebar__nav {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: var(--s-2) var(--s-3) var(--s-4);
}

.nav-group { margin-top: var(--s-5); }
.nav-group:first-child { margin-top: var(--s-2); }

.nav-group__caption {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .8px;
  text-transform: uppercase;
  color: var(--text-faint);
  padding: 0 var(--s-3);
  margin-bottom: var(--s-2);
  display: flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}

.nav-group__caption .lock { width: 12px; height: 12px; opacity: .7; }

/* Nav item */
.nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: 9px var(--s-3);
  border-radius: var(--r-item);
  color: var(--text-muted);
  font-weight: 500;
  font-size: 13.5px;
  white-space: nowrap;
  transition: background .15s ease, color .15s ease;
  margin-bottom: 2px;
}

.nav-item__icon {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
  display: grid;
  place-items: center;
}
.nav-item__icon svg { width: 18px; height: 18px; stroke-width: 1.7; }

.nav-item__label {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
}

.nav-item:hover {
  background: var(--card-hover);
  color: var(--text);
}

/* active state — left bar + soft blue bg + blue text/icon */
.nav-item.is-active {
  background: var(--accent-soft);
  color: var(--accent);
}
.nav-item.is-active::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 3px;
  height: 20px;
  border-radius: 0 3px 3px 0;
  background: var(--accent);
}
.nav-item.is-active .nav-item__icon { color: var(--accent); }

/* coming-soon / locked items */
.nav-item.is-soon { color: var(--text-faint); }
.nav-item.is-soon:hover { color: var(--text-muted); }
.nav-item.is-locked { color: var(--text-faint); opacity: .85; }
.nav-item.is-locked .nav-item__icon { opacity: .7; }

/* "Zum Launch ausgeblendet" - sieht nur, wer den Eintrag allein wegen seiner
   Rolle sieht. Bewusst ein Symbol statt eines Wortes: Der Platz neben dem
   Eintragsnamen ist knapp, und "Coming Soon" steht dort teils schon.
   Warnfarbe statt Akzent, damit es nicht wie eine Auszeichnung wirkt. */
.nav-item__launch {
  flex-shrink: 0; display: inline-grid; place-items: center;
  width: 18px; height: 18px; border-radius: 50%;
  color: var(--warn, #ffb020);
  background: color-mix(in srgb, var(--warn, #ffb020) 16%, transparent);
}
.nav-item__launch svg { width: 11px; height: 11px; }
.nav-item__soon {
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: .4px;
  text-transform: uppercase;
  color: var(--text-faint);
  border: 1px solid var(--border);
  background: rgba(255, 255, 255, 0.03);
  padding: 2px 6px;
  border-radius: var(--r-pill);
  flex-shrink: 0;
}

/* Sidebar footer / collapse button */
.sidebar__footer {
  flex-shrink: 0;
  padding: var(--s-3);
  border-top: 1px solid var(--border);
}

.collapse-btn {
  width: 100%;
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: 9px var(--s-3);
  border-radius: var(--r-item);
  background: transparent;
  border: 1px solid var(--border);
  color: var(--text-muted);
  font-size: 13px;
  font-weight: 500;
  transition: background .15s ease, color .15s ease;
}
.collapse-btn:hover { background: var(--card-hover); color: var(--text); }
.collapse-btn svg { width: 18px; height: 18px; flex-shrink: 0; transition: transform .22s ease; }
.app.collapsed .collapse-btn svg { transform: rotate(180deg); }

/* Collapsed mode: hide text labels, center icons */
.app.collapsed .brand__text,
.app.collapsed .nav-group__caption,
.app.collapsed .nav-item__label,
.app.collapsed .nav-item__launch,
.app.collapsed .nav-item__soon,
.app.collapsed .nav-item__devhide,
.app.collapsed .collapse-btn span {
  display: none;
}

/* =========================================================================
   DEV-MARKIERUNG "Zum Launch ausblenden" — Sidebar-Pill + Seiten-Banner.
   Rein für Developer; nichts wird ausgeblendet, nur gekennzeichnet.
   ========================================================================= */
.nav-item--devhide { flex-wrap: wrap; height: auto; row-gap: 5px; }
.nav-item__devhide {
  flex-basis: 100%; margin-left: 32px;   /* unter dem Label ausgerichtet (Icon 20 + Gap 12) */
  align-self: flex-start; white-space: normal;
  font-size: 8.5px; font-weight: 700; letter-spacing: .3px; text-transform: uppercase;
  color: #f5b62b; border: 1px solid rgba(245,182,43,0.45);
  background: rgba(245,182,43,0.14); padding: 1px 6px; border-radius: var(--r-pill);
}
.launch-hide {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-bottom: var(--s-6); padding: 12px 16px; border-radius: 12px;
  color: #f5b62b; background: rgba(245,182,43,0.10); border: 1px solid rgba(245,182,43,0.45);
  font-weight: 700; font-size: 13px; letter-spacing: .5px;
}
.launch-hide svg { width: 18px; height: 18px; flex: none; }
.launch-hide small { font-weight: 500; color: var(--text-muted); letter-spacing: 0; }
.app.collapsed .sidebar__brand { justify-content: center; padding-left: 0; padding-right: 0; }
/* eingeklappt: Wortmarke + ADMIN-Pill aus, nur das Emblem zeigen */
.app.collapsed .brand__logo--full,
.app.collapsed .brand__admin { display: none; }
.app.collapsed .brand__logo--icon { display: block; }
.app.collapsed .nav-item { justify-content: center; padding-left: 0; padding-right: 0; }
.app.collapsed .collapse-btn { justify-content: center; }
.app.collapsed .nav-group__caption {
  /* keep a slim divider feel where captions were */
  height: 1px; padding: 0; margin: var(--s-4) var(--s-3) var(--s-3);
  background: var(--border);
}

/* =========================================================================
   HEADER
   ========================================================================= */
.header {
  position: sticky;
  top: 0;
  z-index: 40;
  height: var(--header-h);
  display: flex;
  align-items: center;
  gap: var(--s-4);
  padding: 0 var(--s-6);
  background: rgba(10, 10, 12, 0.72);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--border);
}

.header__hamburger {
  display: none;            /* shown on mobile */
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--r-item);
  color: var(--text);
  width: 38px;
  height: 38px;
  place-items: center;
}
.header__hamburger svg { width: 20px; height: 20px; }

.header__spacer { flex: 1; }

.header__actions {
  display: flex;
  align-items: center;
  gap: var(--s-3);
}

/* badges in header */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  font-weight: 600;
  padding: 7px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--card);
  color: var(--text-muted);
  white-space: nowrap;
}
.badge svg { width: 14px; height: 14px; }

.badge--streak { color: #ffb020; }
.badge--streak svg { color: #ffb020; }

.badge--active {
  color: var(--accent);
  border-color: var(--accent-line);
  background: var(--accent-soft);
}
.badge--active .dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-glow);
}

/* WARUM: Im Original fehlte die Kopfzeilenwarnung; Maße und Tokens stammen aus den benachbarten Badges und der Dashboard-Warnung.
   05.08.2026: von Rot auf die Warnstufe umgestellt. Die rote Farbe stammte
   aus der Zeit, als es nur eine Stufe gab — danach stand der Badge daneben
   orange und die Warnung rot: zwei Farben für denselben Zustand. Rot bleibt
   dem echten Verlust vorbehalten. Der Knopf "Broker verwalten" erbt die
   Farbe (color: inherit), sein Trennstrich bekommt sie mit. */
.header-access-warning {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 12px;
  border: 1px solid var(--warn-line);
  border-radius: var(--r-pill);
  background: var(--warn-soft);
  color: var(--warn);
  font-size: 12px;
  white-space: nowrap;
}
/* WARUM: Im Original fehlte der Verweis; er übernimmt Farbe und kompakte Anordnung der neuen Warnung ohne eigenes Aussehen. */
.header-access-warning__summary {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: inherit;
}
/* WARUM: Im Original fehlte das Warnsymbol; seine Anordnung folgt den vorhandenen Header-Badges. */
.header-access-warning__icon {
  display: inline-flex;
  flex: 0 0 auto;
}
/* WARUM: Im Original fehlte das Warnsymbol; seine Maße werden vom vorhandenen Badge-Symbol übernommen. */
.header-access-warning__icon svg { width: 14px; height: 14px; }
/* WARUM: Im Original fehlte der Broker-Verweis; Rahmen und Abstand nutzen die Werte der Warnung statt eines neuen Designs. */
.header-access-warning__action {
  padding-left: 6px;
  border-left: 1px solid var(--warn-line);
  color: inherit;
  font-weight: 600;
}
/* WARUM: Das Original kannte keine neutralen Risikostatus; der Punkt übernimmt die Gefahrenfarbe der Dashboard-Warnung.
   05.08.2026, Betreiberentscheidung: ROT nur beim echten Verlust (entzogen,
   gesperrt). "Gefährdet" heißt, der Zugang besteht noch — dafür Orange, die
   Farbe, die im Design schon für die Streak steht. Vorher trug jeder Status
   außer "aktiv" denselben roten Punkt: Eine Warnung sah damit aus wie eine
   Sperre, und die Warnfarbe stumpft ab, wenn sie alles bedeutet. */
[data-status-badge]:not(.badge--active) .dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--red);
}
.badge--warn { color: var(--warn); border-color: var(--warn-line); background: var(--warn-soft); }
[data-status-badge].badge--warn .dot {
  background: var(--warn);
  box-shadow: 0 0 0 3px var(--warn-glow);
}
/* WARUM: Im schmalen Original-Header war kein Warnknopf vorgesehen; Hinweis und Countdown bleiben über den Textverweis bedienbar. */
@media (max-width: 900px) {
  .header-access-warning__action { display: none; }
}

/* icon button (theme toggle) */
.icon-btn {
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  border-radius: var(--r-item);
  border: 1px solid var(--border);
  background: var(--card);
  color: var(--text-muted);
  transition: background .15s ease, color .15s ease;
}
.icon-btn:hover { background: var(--card-hover); color: var(--text); }
.icon-btn svg { width: 18px; height: 18px; }

/* account / avatar dropdown */
.account { position: relative; }
.account__btn {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  background: transparent;
  border: none;
  padding: 3px;
  border-radius: var(--r-pill);
}
.avatar {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-weight: 700;
  font-size: 13px;
  color: #fff;
  background: linear-gradient(135deg, var(--accent), #4a1fb0);
  box-shadow: 0 4px 14px var(--accent-glow);
}
.account__chev { width: 16px; height: 16px; color: var(--text-muted); transition: transform .18s ease; }
.account.is-open .account__chev { transform: rotate(180deg); }

.account__menu {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  min-width: 200px;
  background: var(--elevated);
  border: 1px solid var(--border-strong);
  border-radius: 14px;
  box-shadow: var(--shadow-pop);
  padding: var(--s-2);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px);
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
}
.account.is-open .account__menu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.account__head {
  padding: var(--s-2) var(--s-3) var(--s-3);
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--s-2);
}
.account__name { font-weight: 600; font-size: 13px; }
.account__mail { font-size: 12px; color: var(--text-muted); }
.menu-item {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: 9px var(--s-3);
  border-radius: var(--r-item);
  color: var(--text-muted);
  font-size: 13px;
  font-weight: 500;
  transition: background .15s ease, color .15s ease;
}
.menu-item:hover { background: var(--card-hover); color: var(--text); }
.menu-item svg { width: 16px; height: 16px; }
.menu-item--danger:hover { color: var(--red); }

/* "Abmelden" ist ein Button in einem POST-Formular statt eines Links —
   ein GET-Logout liesse sich per fremdem <img>-Tag ausloesen (CSRF).
   Dieser Reset laesst den Button exakt wie die uebrigen Menuepunkte aussehen. */
button.menu-item {
  width: 100%;
  background: none;
  border: 0;
  text-align: left;
  font-family: inherit;
  cursor: pointer;
}

/* =========================================================================
   CONTENT
   ========================================================================= */
.content {
  flex: 1;
  padding: var(--s-8);
  max-width: 1280px;
  width: 100%;
  margin: 0 auto;
}

/* Scanner: Die Karte ohne Innenpolster - der Chart liegt direkt an der
   runden Border, die Rundung beschneidet seine Ecken. Die Hoehe ist genau
   der Platz zwischen Kopfleiste und Browserkante abzueglich des
   .content-Polsters je Breakpoint: nichts zu scrollen (27.08.2026). */
.scanner-karte { padding: 0; overflow: hidden; height: calc(100vh - var(--header-h) - 2 * var(--s-8)); }
.scanner-karte .tradingview-widget-container,
.scanner-karte #goldgpt-chart { height: 100%; }
@media (max-width: 900px) { .scanner-karte { height: calc(100vh - var(--header-h) - 2 * var(--s-5)); } }
@media (max-width: 640px) { .scanner-karte { height: calc(100vh - var(--header-h) - 2 * var(--s-4)); } }

/* DIE ABDECKUNG IM CHART (28.10.2026).

   Das Wasserzeichen oben rechts - "WiFi Money Club" und darunter eine
   Copyright-Zeile - zeichnet der Indikator GoldGPT selbst ins Chart. Es steht
   im iframe von TradingView; von aussen kommt kein Skript und kein Stylesheet
   dort hinein (fremder Ursprung). Bleibt nur: etwas darueberlegen.

   .theme-glass .card::before liegt auf z-index 1, deshalb hier 2 - sonst
   zoege der Kartenring als Ganzes darueber hinweg.

   pointer-events: none, damit Ziehen und Zoomen in dieser Ecke weiterlaufen
   wie im Rest des Charts.

   DIE WERTE SIND STELLSCHRAUBEN, keine Messung: Die Tabelle sitzt bei
   TradingView am rechten Rand des Chart-Bereichs, also LINKS der Preisachse -
   und wie breit die ist, haengt an der Stellenzahl des Kurses. Verrutscht das
   Wasserzeichen, zieht man hier und nicht im Markup. */
.scanner-karte {
  --abdeckung-oben:   74px;
  --abdeckung-rechts: 112px;
  /* Fuer alle Fenstergroessen gleich: Der Text im Chart ist ein fester
     Textblock, seine Breite haengt nicht an der Chartbreite. Bei 820px
     Fensterbreite lugte sonst links das "W" von "WiFi" hervor. */
  --abdeckung-breite: 186px;
  --abdeckung-hoehe:  84px;
  /* Reines Schwarz, am laufenden Chart nachgemessen: TradingView zeichnet
     dort rgb(0,0,0). Die Kartenfarbe #0A0A0F wirkt daneben als heller
     Fleck. */
  --abdeckung-grund:  #000000;
  --abdeckung-schrift:#E3B84C;
}
.scanner-abdeckung {
  position: absolute;
  top:    var(--abdeckung-oben);
  right:  var(--abdeckung-rechts);
  width:  var(--abdeckung-breite);
  height: var(--abdeckung-hoehe);
  z-index: 2;
  pointer-events: none;
  display: grid;
  place-items: center;
  background: var(--abdeckung-grund);
  color: var(--abdeckung-schrift);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: .2px;
  text-align: center;
}
/* Schmalere Fenster: kleineres Chart, schmalere Preisachse. */
@media (max-width: 900px) {
  .scanner-karte {
    --abdeckung-oben:   68px;
    --abdeckung-rechts: 100px;
    --abdeckung-hoehe:  78px;
  }
}
@media (max-width: 640px) {
  .scanner-karte {
    --abdeckung-oben:   60px;
    --abdeckung-rechts: 84px;
    --abdeckung-hoehe:  84px;
  }
  .scanner-abdeckung { font-size: 13px; }
}

/* page header */
/* Compact page head: eyebrow removed globally, less vertical space. */
.page-head { margin-bottom: var(--s-6); }
/* Kategorie-/Eyebrow-Zeile auf allen Seiten ausgeblendet. */
.page-head__eyebrow { display: none; }
.page-title {
  font-size: 28px;
  font-weight: 700;
  letter-spacing: -.4px;
  margin: 0 0 var(--s-2);
}
/* Seitentitel durchgehend weiß — überschreibt evtl. inline gesetzte Akzentwörter. */
.page-title span { color: #FFFFFF !important; }
.page-subtitle {
  font-size: 15px;
  color: var(--text-muted);
  margin: 0;
  max-width: 70ch;
}

/* generic section heading */
.section-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-4);
  margin: var(--s-8) 0 var(--s-4);
}
.section-title { font-size: 17px; font-weight: 650; margin: 0; }
.section-link { font-size: 13px; color: var(--accent); font-weight: 500; }
.section-link:hover { color: var(--accent-hover); }

/* =========================================================================
   CARDS / GRID
   ========================================================================= */
.grid { display: grid; gap: var(--s-5); }
.grid--2 { grid-template-columns: repeat(2, 1fr); }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--4 { grid-template-columns: repeat(4, 1fr); }

.card {
  /* Flat, even dark blue-black tone (ProTrader feel, blue not violet). No gradient. */
  background: #0e0f19;
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--r-card);
  padding: var(--s-6);
  /* inner highlight + soft drop for depth */
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.03), 0 8px 24px rgba(0,0,0,0.25);
  /* Border WIDTH stays constant 1px — only colour animates, so no layout shift. */
  transition: border-color .25s ease, box-shadow .25s ease, background .25s ease, transform .25s ease;
}
.card--hover:hover {
  /* 1px border kept; only the colour shifts to blue (no 2px / no ring). */
  border-color: rgba(146,80,236,0.4);
  transform: translateY(-2px);
  /* dezent flat aufhellen + blauer Außen-Glow (kein Gradient) */
  background: #141826;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.03), 0 8px 28px rgba(146,80,236,0.12);
}

/* .card--glow kept as an alias of .card — flat, no blue shimmer corner. */
.card--glow {
  position: relative;
  overflow: hidden;
}

.card__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-3);
  margin-bottom: var(--s-4);
}
.card__title { font-size: 14px; font-weight: 600; margin: 0; }
.card__icon {
  width: 40px; height: 40px;
  border-radius: 11px;
  display: grid; place-items: center;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
}
.card__icon svg { width: 20px; height: 20px; }

/* stat card */
.stat__label { font-size: 13px; color: var(--text-muted); margin-bottom: 0px; }
.stat__value { font-size: 28px; font-weight: 700; letter-spacing: -.5px; }
.stat__delta { font-size: 12.5px; font-weight: 600; margin-top: var(--s-2); display: inline-flex; align-items: center; gap: 4px; }
.stat__delta.is-up { color: var(--green); }
.stat__delta.is-down { color: var(--red); }

/* =========================================================================
   COURSE CARD (Academy overview) — built on the shared .card class.
   Image-topped card: thumbnail · pill · meta · title · desc · progress · CTA.
   ========================================================================= */
.course-card {
  /* Uniform inner padding so a card border is visible all around the image. */
  padding: var(--s-3);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
/* Active cards are real links — whole card clickable. */
a.course-card { cursor: pointer; color: inherit; text-decoration: none; }

/* 16:9 media area — floats INSIDE the card as a rounded block. */
.course-card__media {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  border-radius: 12px;
}
.course-card__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform .35s ease;
}
.course-card.card--hover:hover .course-card__img { transform: scale(1.04); }
/* soft fade from image into the card body */
.course-card__media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 55%, rgba(21,21,26,0.85) 100%);
  pointer-events: none;
}

/* pill on top of the image */
.course-card__pill {
  position: absolute;
  top: var(--s-3);
  left: var(--s-3);
  z-index: 2;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .3px;
  padding: 4px 10px;
  border-radius: var(--r-pill);
  color: #fff;
  background: rgba(10, 10, 12, 0.6);
  border: 1px solid var(--border-strong);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
.course-card__pill--soon {
  color: var(--accent);
  background: rgba(146, 80, 236, 0.18);
  border-color: var(--accent-line);
}

/* body */
.course-card__body {
  padding: var(--s-4) var(--s-2) var(--s-2);  /* gap under the floating image */
  display: flex;
  flex-direction: column;
  flex: 1;
}

/* meta row: lessons · duration */
.course-card__meta {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  font-size: 12.5px;
  color: var(--text-muted);
  margin-bottom: var(--s-3);
}
.course-card__meta-item { display: inline-flex; align-items: center; gap: 5px; }
.course-card__meta-item svg { width: 14px; height: 14px; stroke-width: 1.8; }
.course-card__meta-sep { color: var(--text-faint); }

.course-card__title {
  font-size: 17px;
  font-weight: 650;
  margin: 0 0 var(--s-2);
  letter-spacing: -.2px;
}
.course-card__desc {
  font-size: 13.5px;
  color: var(--text-muted);
  margin: 0 0 var(--s-5);
  line-height: 1.55;
}

/* progress */
.course-card__progress { margin-top: auto; }            /* push to bottom area */
.progress {
  height: 6px;
  border-radius: var(--r-pill);
  background: rgba(255, 255, 255, 0.07);
  overflow: hidden;
}
.progress__bar {
  height: 100%;
  border-radius: var(--r-pill);
  background: var(--accent);
  box-shadow: 0 0 10px var(--accent-glow);
  transition: width .4s ease;
}
.course-card__progress-label {
  font-size: 12px;
  color: var(--text-muted);
  margin: var(--s-2) 0 0;
}

/* Coming-soon state — clearly locked, same visual family */
.course-card.is-soon { opacity: .9; }
.course-card.is-soon .course-card__img { filter: grayscale(.4) brightness(.45); }
.course-card.is-soon .course-card__media::after {
  background: linear-gradient(180deg, rgba(10,10,12,0.35) 0%, rgba(21,21,26,0.9) 100%);
}
.course-card.is-soon .course-card__title,
.course-card.is-soon .course-card__desc { color: var(--text-muted); }

/* disabled CTA */
.btn--disabled {
  background: rgba(255, 255, 255, 0.04);
  border-color: var(--border);
  color: var(--text-faint);
  cursor: not-allowed;
  box-shadow: none;
}
.btn--disabled:active { transform: none; }
.btn--disabled svg { width: 16px; height: 16px; }

/* =========================================================================
   COURSE DETAIL (Ebene 2) — hero + modules + lesson rows.
   Template for every course page; built on the shared .card class.
   ========================================================================= */

/* dezenter Zurück-Link */
.back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  font-weight: 500;
  color: var(--text-muted);
  margin-bottom: var(--s-5);
  transition: color .15s ease, gap .15s ease;
}
.back-link:hover { color: var(--accent); gap: 9px; }
.back-link svg { width: 16px; height: 16px; }

/* ---- Hero card ---- */
.course-hero { padding: var(--s-8); }
.course-hero__title {
  font-size: 30px;
  font-weight: 700;
  letter-spacing: -.4px;
  margin: 0 0 var(--s-3);
}
.course-hero__desc {
  font-size: 15px;
  color: var(--text-muted);
  line-height: 1.6;
  margin: 0 0 var(--s-5);
  max-width: 68ch;
}

/* meta row (icon + value, dot-separated) */
.course-hero__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2) var(--s-4);
  font-size: 13.5px;
  color: var(--text-muted);
  margin-bottom: var(--s-5);
}
.meta-item { display: inline-flex; align-items: center; gap: 7px; }
.meta-item svg { width: 16px; height: 16px; stroke-width: 1.8; color: var(--accent); }
.meta-item strong { color: var(--text); font-weight: 600; }

/* progress (reuses .progress / .progress__bar from course cards) */
.course-hero__progress { max-width: 520px; margin-bottom: var(--s-6); }

/* ---- Modules ---- */
.module { margin-top: var(--s-8); }
.module:first-of-type { margin-top: var(--s-6); }

.module__caption {
  display: flex;
  align-items: baseline;
  gap: 8px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .8px;
  text-transform: uppercase;
  color: var(--accent);
  margin: 0 0 var(--s-4);
  padding-left: var(--s-1);
}
.module__caption .module__sep { color: var(--text-faint); font-weight: 600; }
.module__caption .module__name { color: var(--text); letter-spacing: .3px; }

/* lesson list */
.lesson-list { display: flex; flex-direction: column; gap: var(--s-3); }

/* lesson row — clickable card */
.lesson {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  padding: var(--s-4) var(--s-5);
  cursor: pointer;
}
.lesson__index {
  flex-shrink: 0;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-muted);
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--border-strong);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.lesson:hover .lesson__index {
  color: var(--accent);
  border-color: var(--accent-line);
  background: var(--accent-soft);
}

.lesson__body { flex: 1; min-width: 0; }
.lesson__title { font-size: 14.5px; font-weight: 600; margin: 0 0 2px; }
.lesson__desc {
  font-size: 13px;
  color: var(--text-muted);
  margin: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.lesson__meta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
  font-size: 12.5px;
  color: var(--text-muted);
}
.lesson__meta svg { width: 14px; height: 14px; stroke-width: 1.8; }

/* status icon (empty circle = nicht abgeschlossen) */
.lesson__status {
  flex-shrink: 0;
  width: 20px;
  height: 20px;
  color: var(--text-faint);
  display: grid;
  place-items: center;
}
.lesson__status svg { width: 20px; height: 20px; }
/* WARUM: dynamischer Abschlusszustand nutzt die vorhandenen Design-Tokens. */
.lesson__status.is-complete { color: var(--success); border-color: var(--success); }

/* Mobile: let duration drop below the title, keep rows tidy */
@media (max-width: 640px) {
  .lesson { flex-wrap: wrap; }
  .lesson__body { flex-basis: calc(100% - 34px - var(--s-4)); }
  .lesson__desc { white-space: normal; }
  .lesson__meta { margin-left: calc(34px + var(--s-4)); }   /* align under title */
  .lesson__status { margin-left: auto; }
}

/* =========================================================================
   LESSON PAGE (Ebene 3) — video + prose + quiz, with a sticky outline.
   Template for every lesson; built on the shared .card class.
   ========================================================================= */

/* two-column: content + outline; collapses to one column on narrow screens */
.lesson-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 340px;
  gap: var(--s-6);
  align-items: start;
}

/* ---- main column ---- */
.lesson-main { min-width: 0; }

.lesson-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .6px;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: var(--s-3);
}
.lesson-eyebrow .module__sep { color: var(--text-faint); }
.lesson-eyebrow .lesson-eyebrow__name { color: var(--text-muted); }

.lesson-headline {
  font-size: 27px;
  font-weight: 700;
  letter-spacing: -.4px;
  margin: 0 0 var(--s-3);
}
.lesson-submeta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2) var(--s-4);
  font-size: 13px;
  color: var(--text-muted);
  margin-bottom: var(--s-6);
}
.lesson-submeta .meta-item svg { color: var(--accent); }

/* ---- video player (placeholder) ---- */
/* Folien-Betrachter einer Praesentations-Lektion (Psychology Academy,
   19.08.2026): das Bild an der Stelle des Videokastens, darunter die Leiste
   mit Vor/Zurueck und Zaehler. */
.folien { margin-bottom: var(--s-6); }
.folien__bild {
  display: block; width: 100%; height: auto;
  border-radius: var(--r-card);
  border: 1px solid var(--border);
  background: var(--card);
}
.folien__leiste {
  display: flex; align-items: center; justify-content: center;
  gap: var(--s-4); margin-top: var(--s-3);
}
.folien__knopf { min-width: 44px; }
.folien__zaehler {
  font-size: 13px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; min-width: 64px; text-align: center;
}
.folien__vollbild { margin-left: var(--s-3); }
/* Vollbild: das Bild fuellt den Schirm, die Leiste bleibt unten bedienbar.
   Zwei getrennte Regeln - :fullscreen fuer Browser mit echter Vollbild-API,
   .is-vollbild als Rueckfall (u. a. iPhone), wo folien.js die Klasse setzt. */
.folien:fullscreen {
  background: #0a0a0c; margin: 0; padding: var(--s-5);
  display: flex; flex-direction: column; justify-content: center; gap: var(--s-3);
}
.folien:fullscreen .folien__bild { flex: 1; min-height: 0; width: 100%; object-fit: contain; border: 0; background: transparent; }
.folien.is-vollbild {
  position: fixed; inset: 0; z-index: 1000;
  background: #0a0a0c; margin: 0; padding: var(--s-5);
  display: flex; flex-direction: column; justify-content: center; gap: var(--s-3);
}
.folien.is-vollbild .folien__bild { flex: 1; min-height: 0; width: 100%; object-fit: contain; border: 0; background: transparent; }

.video {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--r-card);
  overflow: hidden;
  border: 1px solid rgba(255,255,255,0.08);
  background:
    radial-gradient(120% 120% at 50% 0%, rgba(146,80,236,0.10), transparent 60%),
    #0c0e16;
  display: grid;
  place-items: center;
  cursor: pointer;
  margin-bottom: var(--s-6);
}
.video::after {                      /* subtle bottom vignette */
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 60%, rgba(0,0,0,0.45) 100%);
  pointer-events: none;
}
.video__play {
  position: relative;
  z-index: 1;
  width: 72px; height: 72px;
  border-radius: 50%;
  display: grid; place-items: center;
  color: #fff;
  background: var(--accent);
  box-shadow: 0 10px 30px var(--accent-glow), 0 0 0 10px rgba(146,80,236,0.12);
  transition: transform .18s ease, box-shadow .18s ease;
}
.video:hover .video__play { transform: scale(1.06); box-shadow: 0 10px 36px var(--accent-glow), 0 0 0 14px rgba(146,80,236,0.14); }
.video__play svg { width: 28px; height: 28px; margin-left: 3px; }
.video__label {
  position: absolute;
  z-index: 1;
  bottom: var(--s-4);
  left: var(--s-5);
  font-size: 12.5px;
  color: var(--text-muted);
}

/* ---- prose / text blocks ---- */
.prose { color: rgba(255,255,255,0.78); font-size: 15px; line-height: 1.7; }
.prose h2 {
  color: var(--text);
  font-size: 19px;
  font-weight: 650;
  letter-spacing: -.2px;
  margin: var(--s-8) 0 var(--s-3);
}
.prose h2:first-child { margin-top: 0; }
.prose p { margin: 0 0 var(--s-4); }
.prose ul { margin: 0 0 var(--s-4); padding-left: var(--s-5); }
.prose li { margin-bottom: var(--s-2); }
.prose strong { color: var(--text); font-weight: 600; }

/* callout / note box */
.callout {
  display: flex;
  gap: var(--s-3);
  padding: var(--s-4) var(--s-5);
  margin: var(--s-5) 0;
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  border-radius: 12px;
  font-size: 14px;
  line-height: 1.6;
  color: rgba(255,255,255,0.82);
}
.callout__icon { flex-shrink: 0; color: var(--accent); }
.callout__icon svg { width: 20px; height: 20px; }
.callout strong { color: var(--text); }

/* ---- quiz ---- */
.quiz { margin-top: var(--s-8); }
.quiz__head {
  display: flex; align-items: center; gap: var(--s-3);
  margin-bottom: var(--s-2);
}
.quiz__badge {
  font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase;
  color: var(--accent);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  padding: 3px 9px; border-radius: var(--r-pill);
}
.quiz__question { font-size: 16px; font-weight: 600; margin: 0 0 var(--s-5); }

.quiz__options { display: flex; flex-direction: column; gap: var(--s-3); margin-bottom: var(--s-5); }
.quiz__option {
  display: flex; align-items: center; gap: var(--s-3);
  width: 100%;
  text-align: left;
  padding: var(--s-4);
  border-radius: 12px;
  border: 1px solid var(--border-strong);
  background: rgba(255,255,255,0.02);
  color: var(--text);
  font-size: 14px; font-weight: 500;
  transition: border-color .15s ease, background .15s ease;
}
.quiz__option:hover { border-color: var(--accent-line); background: var(--card-hover); }
.quiz__marker {
  flex-shrink: 0;
  width: 22px; height: 22px;
  border-radius: 50%;
  border: 1px solid var(--border-strong);
  display: grid; place-items: center;
  font-size: 12px; font-weight: 600; color: var(--text-muted);
}
.quiz__option.is-selected { border-color: var(--accent); background: var(--accent-soft); }
.quiz__option.is-selected .quiz__marker { border-color: var(--accent); color: var(--accent); }

/* revealed answer states (set by app.js after "prüfen") */
.quiz.is-checked .quiz__option { cursor: default; pointer-events: none; }
.quiz__option.is-correct { border-color: var(--green); background: var(--green-soft); }
.quiz__option.is-correct .quiz__marker { border-color: var(--green); color: var(--green); }
.quiz__option.is-wrong { border-color: var(--red); background: var(--red-soft); }
.quiz__option.is-wrong .quiz__marker { border-color: var(--red); color: var(--red); }

.quiz__feedback {
  font-size: 13.5px; font-weight: 500;
  margin: 0 0 var(--s-4);
  display: none;
}
.quiz.is-checked.is-right .quiz__feedback--right { display: block; color: var(--green); }
.quiz.is-checked.is-wrong .quiz__feedback--wrong { display: block; color: var(--red); }
/* WARUM: Der Netzwerkfehler muss unabhaengig vom Quiz-Zustand erscheinen.
   Ueber .quiz__feedback--wrong waere er genau umgekehrt sichtbar gewesen:
   eingeblendet nach einer falschen Antwort, unsichtbar beim echten Fehler. */
.quiz__feedback[data-quiz-network-error]:not([hidden]) { display: block; color: var(--red); }

/* ---- prev / next ---- */
.lesson-nav {
  display: flex;
  justify-content: space-between;
  gap: var(--s-4);
  margin-top: var(--s-8);
  padding-top: var(--s-6);
  border-top: 1px solid var(--border);
}
.lesson-nav .btn--ghost { max-width: 48%; }
.lesson-nav__spacer { flex: 1; }

/* ---- outline (right, sticky) — Card selbst scrollt NICHT (Border/Eck-Glanz
   bleiben ganz); nur der innere .outline__scroll scrollt bei Überlänge. ---- */
.outline {
  position: sticky;
  top: calc(var(--header-h) + var(--s-5));   /* beginnt unter dem (Glas-)Header */
  align-self: start;                         /* NICHT auf Zeilenhöhe strecken → sonst kein sticky */
  padding: var(--s-5);
  display: flex;
  flex-direction: column;
  /* Höhe auf den sichtbaren Bereich unter dem Header begrenzen */
  max-height: calc(100vh - var(--header-h) - (var(--s-5) * 2));
}
.outline__title { flex-shrink: 0; }          /* Kopf bleibt fix, scrollt nicht mit */
.outline__progress { flex-shrink: 0; }
/* innerer scrollbarer Bereich: nimmt Restplatz, scrollt vertikal */
.outline__scroll {
  flex: 1 1 auto;
  min-height: 0;                             /* wichtig, damit overflow in Flex greift */
  overflow-y: auto;
  overflow-x: visible;
  margin-right: calc(var(--s-3) * -1);       /* Scrollbar nach außen, Text bündig */
  padding-right: var(--s-3);
  /* dezente, dünne Scrollbar (passend zum dunklen Glas) */
  scrollbar-width: thin;
  scrollbar-color: rgba(255,255,255,0.18) transparent;
}
.outline__scroll::-webkit-scrollbar { width: 8px; }
.outline__scroll::-webkit-scrollbar-track { background: transparent; }
.outline__scroll::-webkit-scrollbar-thumb {
  background: rgba(255,255,255,0.16);
  border-radius: 999px;
  border: 2px solid transparent;
  background-clip: padding-box;
}
.outline__scroll::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.28); background-clip: padding-box; }

.outline__title {
  font-size: 14px; font-weight: 650; margin: 0 0 var(--s-2);
}
.outline__progress { margin-bottom: var(--s-5); }
.outline__progress-label { font-size: 12px; color: var(--text-muted); margin: var(--s-2) 0 0; }

.outline__module {
  font-size: 11px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  color: var(--text-faint);
  margin: var(--s-5) 0 var(--s-2);
  padding-left: var(--s-1);
}
.outline__module:first-of-type { margin-top: 0; }

.outline__item {
  display: flex; align-items: center; gap: var(--s-3);
  padding: 8px var(--s-2);
  border-radius: var(--r-item);
  color: var(--text-muted);
  font-size: 13px;
  transition: background .15s ease, color .15s ease;
}
.outline__item:hover { background: var(--card-hover); color: var(--text); }
.outline__ico {
  flex-shrink: 0; width: 18px; height: 18px;
  display: grid; place-items: center; color: var(--text-faint);
}
.outline__ico svg { width: 18px; height: 18px; }
.outline__name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.outline__dur { font-size: 11.5px; color: var(--text-faint); flex-shrink: 0; }

.outline__item.is-done { color: var(--text); }
.outline__item.is-done .outline__ico { color: var(--green); }
.outline__item.is-current {
  background: var(--accent-soft);
  color: var(--accent);
  font-weight: 600;
}
.outline__item.is-current .outline__ico { color: var(--accent); }

/* responsive: outline drops below the content */
@media (max-width: 1000px) {
  .lesson-layout { grid-template-columns: minmax(0, 1fr); }
  /* gestapelt (mobil/Tablet): kein sticky, normal im Fluss, keine eigene Höhe/Scroll */
  /* gestapelt (mobil/Tablet): kein sticky, keine Höhenbegrenzung, kein Innen-Scroll */
  .outline { position: static; max-height: none; }
  .outline__scroll { overflow-y: visible; max-height: none; margin-right: 0; padding-right: 0; }
}

/* =========================================================================
   TRADING IDEAS — single centered "join" card
   ========================================================================= */
.join-wrap { max-width: 560px; margin: 0 auto; }
.join-card { text-align: center; padding: var(--s-10) var(--s-8); }
.join-card__icon {
  width: 64px; height: 64px;
  margin: 0 auto var(--s-5);
  border-radius: 18px;
  display: grid; place-items: center;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  box-shadow: 0 0 50px var(--accent-glow);
}
.join-card__icon svg { width: 32px; height: 32px; }
.join-card__title { font-size: 22px; font-weight: 700; margin: 0 0 var(--s-3); }
.join-card__desc {
  font-size: 14.5px; color: var(--text-muted); line-height: 1.65;
  margin: 0 auto var(--s-6); max-width: 44ch;
}
.join-card__hint {
  font-size: 12.5px; color: var(--text-faint);
  margin: var(--s-4) 0 0;
}

/* =========================================================================
   ANNOUNCEMENTS — two columns: feed (toggle: cards/calendar) + "Heute" banner
   ========================================================================= */
.ann-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: var(--s-6);
  align-items: start;
}
.ann-main { min-width: 0; }

/* view toggle (segmented control) */
.view-toggle {
  display: inline-flex;
  gap: 4px;
  padding: 4px;
  border-radius: var(--r-item);
  background: rgba(255,255,255,0.03);
  border: 1px solid var(--border);
  margin-bottom: var(--s-5);
}
.view-toggle__btn {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 16px;
  border: none; background: transparent;
  color: var(--text-muted);
  font-size: 13px; font-weight: 600;
  border-radius: 7px;
  transition: background .15s ease, color .15s ease;
}
.view-toggle__btn svg { width: 15px; height: 15px; }
.view-toggle__btn:hover { color: var(--text); }
.view-toggle__btn.is-active {
  background: var(--accent);
  color: #fff;
  box-shadow: 0 6px 18px var(--accent-glow);
}

.ann-view[hidden] { display: none; }

/* ---- card view ---- */
.ann-cards { display: flex; flex-direction: column; gap: var(--s-6); }
.ann-card {
  position: relative;
  /* dezenter blauer Glow für Tiefe (wie ProTrader, nur blau) */
  box-shadow: 0 10px 30px rgba(0,0,0,0.25), 0 8px 40px rgba(146,80,236,0.10);
}
.ann-card:hover { box-shadow: 0 10px 30px rgba(0,0,0,0.3), 0 10px 50px rgba(146,80,236,0.16); }
.ann-card__title { font-size: 16px; font-weight: 650; margin: 0 0 var(--s-2); }
.ann-card__body { font-size: 14px; color: var(--text-muted); line-height: 1.65; margin: 0 0 var(--s-4); }
.ann-card__date {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; color: var(--text-faint);
}
.ann-card__date svg { width: 13px; height: 13px; }

/* ---- calendar view ---- */
.calendar { padding: var(--s-5); }
.calendar__head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: var(--s-4);
}
.calendar__month { font-size: 15px; font-weight: 650; }
.calendar__nav { display: flex; gap: var(--s-2); }
.cal-nav-btn {
  width: 32px; height: 32px;
  display: grid; place-items: center;
  border-radius: 8px;
  border: 1px solid var(--border);
  background: var(--card);
  color: var(--text-muted);
  transition: background .15s ease, color .15s ease;
}
.cal-nav-btn:hover { background: var(--card-hover); color: var(--text); }
.cal-nav-btn svg { width: 16px; height: 16px; }

.calendar__weekdays,
.calendar__grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 6px;
}
.calendar__weekdays {
  margin-bottom: 6px;
}
.calendar__weekdays span {
  text-align: center;
  font-size: 11px; font-weight: 600; letter-spacing: .4px;
  color: var(--text-faint);
  text-transform: uppercase;
}
.cal-day {
  position: relative;
  aspect-ratio: 1;
  display: grid; place-items: center;
  border-radius: 9px;
  border: 1px solid transparent;
  background: rgba(255,255,255,0.02);
  color: var(--text);
  font-size: 13px; font-weight: 500;
  transition: background .15s ease, border-color .15s ease;
}
.cal-day.is-other { color: var(--text-faint); background: transparent; }
.cal-day.has-event { cursor: pointer; }
.cal-day.has-event:hover { background: var(--card-hover); border-color: var(--accent-line); }
.cal-day.has-event::after {              /* event dot */
  content: "";
  position: absolute; bottom: 6px; left: 50%; transform: translateX(-50%);
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 6px var(--accent-glow);
}
.cal-day.is-today { border-color: var(--accent); color: var(--accent); font-weight: 700; }
.cal-day.is-selected { background: var(--accent-soft); border-color: var(--accent); }

/* day detail panel under the calendar */
.cal-detail { margin-top: var(--s-5); }
.cal-detail__title { font-size: 13px; font-weight: 600; color: var(--text-muted); margin: 0 0 var(--s-3); }
.cal-detail__empty { font-size: 13px; color: var(--text-faint); }
.cal-event {
  display: flex; gap: var(--s-3);
  padding: var(--s-3) var(--s-4);
  border: 1px solid var(--border);
  border-radius: 10px;
  background: rgba(255,255,255,0.02);
  margin-bottom: var(--s-3);
}
.cal-event__time {
  flex-shrink: 0; font-size: 12.5px; font-weight: 700; color: var(--accent);
  min-width: 46px;
}
.cal-event__title { font-size: 13.5px; font-weight: 500; }

/* ---- Zeitraum-Waehler: EIN Bauteil fuer die ganze Anwendung --------------
   ==========================================================================

   BETREIBERANSAGE VOM 24.09.2026: "Ich moechte generell den Time Picker
   benutzen, den wir auch global immer benutzen, wie zum Beispiel auch in dem
   Trading Journal."

   Bis heute standen diese Regeln in journal.css, jede einzelne hinter
   - damit war der Waehler auf einer Seite zu haben und sonst
   nirgends. Hierher verschoben, Zeile fuer Zeile unveraendert, nur ohne den
   Seiten-Vorsatz. Er steht direkt hinter den .calendar-Bausteinen, weil der
   Kalender im Panel genau diese benutzt.

   DIE KLASSENNAMEN BLEIBEN (jr-filter, zeitwahl). Sie umzubenennen haette
   jede Stelle im Journal mitgenommen, ohne eine einzige Zeile Gestaltung zu
   verbessern. */
/* ---- Zeitraum-Waehler im Seitenkopf --------------------------------------
   Der Knopf oeffnet ein Panel mit den Zeitraeumen links und den beiden
   Datumsfeldern rechts. Ohne JavaScript bleibt statt des Knopfs das
   Auswahlfeld stehen (siehe zeitraum.js) - deshalb sind hier beide Zustaende
   gestaltet. */
.jr-filter { position: relative; display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; }
.jr-filter__gruppe { display: flex; align-items: center; gap: var(--s-2); }
.jr-filter__knopf {
  display: inline-flex; align-items: center; gap: var(--s-2); cursor: pointer;
  padding: 8px 12px; border: 1px solid var(--border-strong); border-radius: 10px;
  background: var(--card); color: var(--text); font-size: 13px; font-weight: 600;
}
.jr-filter__knopf:hover { background: var(--card-hover); }
.jr-filter__knopf svg { width: 15px; height: 15px; color: var(--text-faint); flex-shrink: 0; }
.jr-filter__marke { color: var(--text-muted); font-weight: 500; }
.jr-filter__pfeil { transition: transform .15s ease; }
.jr-filter__knopf[aria-expanded="true"] .jr-filter__pfeil { transform: rotate(180deg); }

.zeitwahl {
  position: absolute; top: calc(100% + 6px); right: 0; z-index: 40; min-width: 300px;
  border: 1px solid var(--border-strong); border-radius: var(--r-card); background: var(--card);
  box-shadow: 0 18px 44px rgba(0,0,0,0.45); overflow: hidden;
}
.zeitwahl[hidden] { display: none; }
.zeitwahl__leib { display: flex; align-items: stretch; }
.zeitwahl__liste { display: flex; flex-direction: column; gap: 2px; padding: var(--s-3); min-width: 200px; }
.zeitwahl__eintrag {
  text-align: left; cursor: pointer; font-size: 13px; font-weight: 550; padding: 9px 12px;
  border: 1px solid transparent; border-radius: 9px; background: transparent; color: var(--text-muted);
}
.zeitwahl__eintrag:hover { background: var(--card-hover); color: var(--text); }
.zeitwahl__eintrag[aria-pressed="true"] {
  background: var(--accent-soft); border-color: var(--accent-line); color: var(--text); font-weight: 650;
}
/* "Benutzerdefiniert" ist der letzte Eintrag und gehoert nicht zu den
   rollierenden Zeitraeumen - die Linie sagt das, ohne ein Wort dafuer zu
   brauchen. */
.zeitwahl__eintrag:last-child { margin-top: var(--s-2); padding-top: 13px; border-top: 1px solid var(--border); border-radius: 0 0 9px 9px; }

/* DER STRICH STEHT, WO DIE GRUPPE WECHSELT, nicht ueber dem letzten Eintrag
   (Betreiberansage vom 24.09.2026: "Letzte 30 Tage - da kommt der Strich, und
   dann kommt Dieser Monat und Letzter Monat. Dann ist das schoen sauber
   abgetrennt").

   Die Regel darueber stammt aus dem Journal, wo der letzte Eintrag
   "Benutzerdefiniert" war. Wer --gruppen setzt, bekommt sie nicht: Zwei Striche
   in einer Liste von sechs Eintraegen trennen nichts mehr, sie zerlegen nur. */
.zeitwahl__liste--gruppen .zeitwahl__eintrag:last-child {
  margin-top: 0; padding-top: 9px; border-top: 0; border-radius: 9px;
}
.zeitwahl__liste--gruppen .zeitwahl__eintrag.hat-trenner {
  margin-top: var(--s-2); padding-top: 13px; border-top: 1px solid var(--border);
}
.zeitwahl__eigen { display: flex; flex-direction: column; gap: var(--s-3); padding: var(--s-3); border-left: 1px solid var(--border); }
.zeitwahl__eigen[hidden] { display: none; }
.zeitwahl__grenzen { display: flex; gap: var(--s-2); }
/* Der Kalender steht fest im Panel, nicht mehr in einem Aufklappfenster am
   Feld. min-width haelt die sieben Spalten breit genug, damit die Zahlen nicht
   uebereinanderrutschen. */
.zeitwahl__eigen .calendar { min-width: 252px; }
.zeitwahl__fuss {
  display: flex; align-items: center; justify-content: space-between; gap: var(--s-3);
  padding: var(--s-3) var(--s-4); border-top: 1px solid var(--border);
}
.zeitwahl__hinweis { font-size: 11.5px; color: var(--text-faint); }
.zeitwahl__knoepfe { display: flex; gap: var(--s-2); flex-shrink: 0; }
@media (max-width: 620px) {
  .zeitwahl { position: static; min-width: 0; }
  .zeitwahl__leib { flex-direction: column; }
  .zeitwahl__eigen { border-left: none; border-top: 1px solid var(--border); }
}

/* Datumsfeld im Stil des year-select, damit die Zeile ruhig wirkt. */
.date-field { position: relative; display: flex; align-items: center; gap: 6px; }
.date-field__label {
  font-size: 11px; font-weight: 600; letter-spacing: .4px;
  color: var(--text-faint); text-transform: uppercase;
}
.date-field__input {
  background: rgba(255,255,255,0.05);
  border: 1px solid rgba(255,255,255,0.1);
  color: var(--text);
  font-family: inherit; font-size: 13px; font-weight: 600;
  padding: 6px 12px;
  border-radius: var(--r-item);
  cursor: pointer;
  width: 118px;
}
.date-field__input:focus { outline: none; border-color: var(--accent-line); }

/* Der Kalender im Zeitraum-Panel nutzt die vorhandenen .calendar-Bausteine aus
   app.css – gleiche Optik wie der Session-Kalender.

   REIHENFOLGE IST HIER TRAGEND: Die Reihenfolge in dieser Datei entscheidet,
   welche Markierung gewinnt, weil alle Regeln dieselbe Spezifitaet haben.
   Von schwach nach stark: Tage mit Trades, dann die Spanne dazwischen, dann
   die beiden Grenzen. Wer eine Regel verschiebt, dreht die Rangfolge um. */
.zeitwahl__eigen .cal-day { cursor: pointer; font-size: 12px; }
.zeitwahl__eigen .cal-day:hover:not(.is-disabled) { background: var(--card-hover); border-color: var(--accent-line); }
.zeitwahl__eigen .cal-day.hat-trades { background: rgba(255,255,255,0.07); color: var(--text); font-weight: 650; }
.zeitwahl__eigen .cal-day.is-in-range { background: var(--accent-soft); color: var(--text); }
.zeitwahl__eigen .cal-day.is-selected { background: var(--accent); border-color: var(--accent); color: #fff; }
.zeitwahl__eigen .cal-day.is-disabled { color: var(--text-faint); background: transparent; cursor: not-allowed; }

/* ---- Zeitraum-Waehler: das Panel bleibt im Bild ----

   BETREIBERBEFUND mit Screenshot: Die Liste, die Datumsfelder und der
   Kalender waren rechts abgeschnitten.

   ES WAR NICHT DAS PANEL, ES WAREN DIE BEIDEN DATUMSFELDER. "VON
   2026-07-25 BIS 2026-08-23" nebeneinander ergeben rund 380px unteilbare
   Breite; daran hat sich das Panel festgehalten und ist ueber den Rand
   gewachsen. Alles darin sah dann breiter aus, als es sein durfte.

   max-width am Panel ist der Riegel, das Umbrechen der Grenzen die
   Behandlung. */
@media (max-width: 620px) {
  .jr-filter { display: block; }
  .jr-filter__knopf { width: 100%; justify-content: flex-start; }
  .zeitwahl { max-width: 100%; }
  .zeitwahl__liste { min-width: 0; }
  .zeitwahl__grenzen { flex-wrap: wrap; }
  /* Die beiden Datumsfelder sind der unteilbare Inhalt, an dem sich das
     Panel festhielt: "VON 2026-07-25" und "BIS 2026-08-23" nebeneinander
     ergeben rund 380px. Sie duerfen jetzt untereinander. */
  .zeitwahl__grenzen .date-field { flex: 1 1 140px; min-width: 0; }
  .zeitwahl__grenzen .date-field__input { min-width: 0; width: 100%; }
  .zeitwahl__eigen .calendar { min-width: 0; }
  .zeitwahl__fuss { flex-wrap: wrap; }
}

/* ---- "Heute" banner (right) ---- */
.ann-today {
  position: sticky;
  top: calc(var(--header-h) + var(--s-5));
  padding: var(--s-6);
  /* Fokus-Element: etwas stärkerer blauer Glow */
  border-color: var(--accent-line);
  box-shadow: 0 10px 30px rgba(0,0,0,0.3), 0 12px 50px rgba(146,80,236,0.16);
}
.ann-today__label {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase;
  color: var(--accent);
  margin-bottom: var(--s-1);
}
.ann-today__label svg { width: 15px; height: 15px; }
.ann-today__date { font-size: 13px; color: var(--text-muted); margin: 0 0 var(--s-5); }

.session {
  display: flex; gap: var(--s-3); align-items: flex-start;
  padding: var(--s-3) 0;
  border-top: 1px solid var(--border);
}
.session:first-of-type { border-top: none; padding-top: 0; }
.session__time {
  flex-shrink: 0;
  font-size: 13px; font-weight: 700; color: var(--accent);
  min-width: 48px;
}
.session__title { font-size: 13.5px; font-weight: 500; line-height: 1.45; }
.ann-today__empty {
  font-size: 13px; color: var(--text-faint);
  padding: var(--s-3) 0;
}

/* responsive: stack columns */
@media (max-width: 1000px) {
  .ann-layout { grid-template-columns: minmax(0, 1fr); }
  .ann-today { position: static; }
}

/* =========================================================================
   LIVE SESSIONS — Google-Calendar-style week grid + month + promo banner
   IMPORTANT: the hour-row height below (52px) MUST match HOUR_PX in the
   page script, otherwise event blocks won't line up with the hour lines.
   ========================================================================= */

/* toolbar above the calendar (navigation + range label) */
.ls-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-3); margin-bottom: var(--s-4); flex-wrap: wrap;
}
.ls-toolbar__nav { display: flex; align-items: center; gap: var(--s-2); }
.ls-range { font-size: 14px; font-weight: 600; color: var(--text); }
.btn--today { padding: 7px 14px; font-size: 13px; }

/* ---- WEEK GRID ---- */
.wk { padding: 0; overflow: hidden; }

/* header row (weekday + date) — same column template as the body grid */
.wk__header { display: grid; grid-template-columns: 52px repeat(7, 1fr); }
.wk__corner { border-bottom: 1px solid var(--border); }
.wk__dh {
  text-align: center; padding: 9px 2px;
  border-left: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}
.wk__dh .dow {
  display: block; font-size: 10.5px; font-weight: 600;
  text-transform: uppercase; letter-spacing: .4px; color: var(--text-faint);
}
.wk__dh .dom {
  display: inline-grid; place-items: center;
  min-width: 26px; height: 26px; margin-top: 3px;
  font-size: 14px; font-weight: 600; border-radius: 50%;
}
.wk__dh.is-today .dom { background: var(--accent); color: #fff; }

/* body: time axis + 7 day columns */
.wk__grid { display: grid; grid-template-columns: 52px repeat(7, 1fr); }
.wk__times { position: relative; }
.wk__time {
  height: 52px;                      /* == HOUR_PX */
  box-sizing: border-box;
  padding: 3px 7px 0 0;
  text-align: right;
  font-size: 10.5px; color: var(--text-faint);
}
.wk__col {
  position: relative;
  border-left: 1px solid var(--border);
  /* horizontal hour lines, one every 52px starting at the top */
  background-image: linear-gradient(to bottom, var(--border) 1px, transparent 1px);
  background-size: 100% 52px;        /* == HOUR_PX */
}
.wk__col.is-today::before {
  content: ""; position: absolute; inset: 0;
  background: rgba(146,80,236,0.05); pointer-events: none;
}

/* event block, absolutely positioned by the script (top/height/left/width) */
.wk-event {
  position: absolute;
  border-radius: 7px; overflow: hidden;
  background: rgba(146,80,236,0.18);
  border-left: 3px solid var(--accent);
  padding: 4px 7px;
  box-shadow: 0 4px 12px rgba(146,80,236,0.12);
}
.wk-event__time { font-size: 10px; font-weight: 700; color: #cfe0ff; }
.wk-event__title {
  font-size: 11.5px; font-weight: 600; color: #fff; line-height: 1.25;
  overflow: hidden; text-overflow: ellipsis;
  display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical;
}

/* ---- compact "upcoming sessions" cards (ProTrader-style upsell) ---- */
.upcoming { margin-top: var(--s-8); }
.scard { display: flex; gap: var(--s-4); align-items: center; padding: var(--s-3); }
.scard__thumb {
  width: 132px; aspect-ratio: 16 / 9; flex-shrink: 0;
  border-radius: 10px; object-fit: cover; display: block;
}
.scard__body { flex: 1; min-width: 0; }
.scard__title { font-size: 14px; font-weight: 600; margin: 0 0 3px; }
.scard__meta { font-size: 12.5px; color: var(--text-muted); margin: 0; }
.scard__rsvp { flex-shrink: 0; }
@media (max-width: 560px) {
  .scard { flex-wrap: wrap; }
  .scard__thumb { width: 100%; }
  .scard__rsvp { width: 100%; }
}

/* =========================================================================
   "HEUTE" PROMO BANNER (right column) — richer than a normal card.
   Overrides the earlier .ann-today / .session rules (later = wins).
   ========================================================================= */
.ann-today {
  position: sticky;
  top: calc(var(--header-h) + var(--s-5));
  padding: var(--s-6) var(--s-5);
  overflow: hidden;
  border: 1px solid var(--accent-line);
  background:
    radial-gradient(130% 70% at 50% 0%, rgba(146,80,236,0.16), transparent 62%),
    var(--card);
  box-shadow: 0 14px 40px rgba(0,0,0,0.4), 0 0 70px rgba(146,80,236,0.20);
}
.ann-today__label {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 13px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  color: var(--accent); margin-bottom: 2px;
}
.ann-today__label svg { width: 16px; height: 16px; }
.ann-today__date { font-size: 13.5px; color: var(--text-muted); margin: 0 0 var(--s-5); }

.session {
  display: flex; gap: var(--s-3); align-items: flex-start;
  padding: var(--s-4) 0;
  border-top: 1px solid var(--border);
}
.session:first-of-type { border-top: none; padding-top: var(--s-1); }
.session__time {
  flex-shrink: 0; min-width: 56px;
  font-size: 17px; font-weight: 800; color: #fff;
  letter-spacing: -.3px;
}
.session__main { flex: 1; min-width: 0; }
.session__title { font-size: 13.5px; font-weight: 600; line-height: 1.4; margin: 0 0 7px; }
/* Banner-"Erinnern": gleicher Outline-Stil wie .btn-outline (Konsistenz) */
.session__rsvp {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11.5px; font-weight: 600;
  padding: 5px 11px; border-radius: var(--r-pill);
  color: var(--accent);
  border: 1px solid rgba(146, 80, 236, 0.5);
  background: transparent;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.session__rsvp:hover { background: rgba(146, 80, 236, 0.12); border-color: var(--accent); color: var(--accent); }
.session__rsvp svg { width: 13px; height: 13px; }

.ann-today__cta {
  margin-top: var(--s-5);
  padding-top: var(--s-5);
  border-top: 1px solid var(--border);
}
.ann-today__empty { font-size: 13px; color: var(--text-faint); padding: var(--s-3) 0; }

/* ---- page head row: title block + page-view switcher (Kalender/Cards) ---- */
.ls-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap; margin-bottom: var(--s-6);
}
.ls-head .page-head { margin-bottom: 0; }

/* compact variant of the segmented toggle (used for Woche/Monat) */
.view-toggle--sm { margin-bottom: 0; }
.view-toggle--sm .view-toggle__btn { padding: 6px 13px; font-size: 12.5px; }

/* ---- calendar card with in-header toolbar ---- */
.cal-card { padding: 0; overflow: hidden; }
.cal-toolbar {
  display: flex; align-items: center; gap: var(--s-3);
  padding: var(--s-3) var(--s-4);
  border-bottom: 1px solid var(--border);
  flex-wrap: wrap;
}
.cal-toolbar__nav { display: flex; align-items: center; gap: var(--s-2); }
.cal-toolbar__label {
  flex: 1 1 auto; text-align: center;
  font-size: 14px; font-weight: 600; color: var(--text);
  min-width: 120px;
}

/* month panel needs padding (the week grid is intentionally full-bleed) */
[data-cal-panel="month"] { padding: var(--s-5); }

/* ---- session card (Cards view) — reuses .course-card visuals ---- */
.course-card__when {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; font-weight: 600; color: var(--accent);
  margin: 0 0 var(--s-2);
}
.course-card__when svg { width: 14px; height: 14px; }
.course-card__cta { margin-top: auto; padding-top: var(--s-4); }

/* ---- Cards view: sessions grouped by day (ProTrader-style list cards) ---- */
.day-group { margin-top: var(--s-8); }
.day-group:first-child { margin-top: 0; }
.day-group__title {
  font-size: 13px; font-weight: 700; letter-spacing: .3px;
  color: var(--accent);
  margin: 0 0 var(--s-4);
  padding-bottom: var(--s-2);
  border-bottom: 1px solid var(--border);
}
.day-list { display: flex; flex-direction: column; gap: var(--s-4); }

/* wide horizontal list card */
.lsession {
  display: flex; align-items: center; gap: var(--s-4);
  padding: var(--s-3);
  /* dezenter blauer Glow, passend zum Rest der App */
  box-shadow: 0 8px 28px rgba(146,80,236,0.12);
}
.lsession__thumb {
  width: 160px; aspect-ratio: 16 / 9; flex-shrink: 0;
  border-radius: 10px; object-fit: cover; display: block;
}
.lsession__body { flex: 1; min-width: 0; }
.lsession__when {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 600; color: var(--accent); margin: 0 0 4px;
}
.lsession__when svg { width: 13px; height: 13px; }
.lsession__title { font-size: 15.5px; font-weight: 650; margin: 0 0 3px; }
.lsession__host { font-size: 12.5px; color: var(--text-muted); margin: 0; }

.lsession__action { display: flex; align-items: center; gap: var(--s-3); flex-shrink: 0; }
.lsession__rsvp { padding: 9px 18px; font-size: 13px; }
.lsession__arrow { color: var(--text-faint); display: grid; place-items: center; transition: color .15s ease, transform .15s ease; }
.lsession__arrow svg { width: 20px; height: 20px; }
.lsession:hover .lsession__arrow { color: var(--accent); transform: translateX(2px); }
/* Hover: Glow etwas verstärken (Rand kommt weiterhin von .card--hover) */
.lsession:hover { box-shadow: 0 8px 28px rgba(146,80,236,0.18); }

/* Mobile: thumbnail on top, action below the text */
@media (max-width: 640px) {
  .lsession { flex-wrap: wrap; }
  .lsession__thumb { width: 100%; }
  .lsession__action { width: 100%; }
  .lsession__rsvp { flex: 1; }
}

/* =========================================================================
   ANNOUNCEMENTS — simple single-column feed (ProTrader-style)
   ========================================================================= */
.feed {
  max-width: 720px;             /* keep cards from getting too wide */
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
}

.post__title {
  font-size: 17px;
  font-weight: 650;
  margin: 0 0 var(--s-3);
  letter-spacing: -.2px;
}
.post__body { color: var(--text-muted); font-size: 14px; line-height: 1.7; }
.post__body p { margin: 0 0 var(--s-3); }
.post__body p:last-child { margin-bottom: 0; }

.post__time {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; color: var(--text-faint);
  margin-top: var(--s-4);
}
.post__time svg { width: 13px; height: 13px; }

/* reactions bar */
.reactions {
  display: flex; flex-wrap: wrap; gap: var(--s-2);
  margin-top: var(--s-4);
  padding-top: var(--s-4);
  border-top: 1px solid var(--border);
}
.reaction {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border-strong);
  background: rgba(255,255,255,0.02);
  color: var(--text-muted);
  font-size: 13px; line-height: 1;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.reaction:hover { background: var(--card-hover); border-color: var(--accent-line); }
.reaction__emoji { font-size: 15px; }
.reaction__count { font-size: 12.5px; font-weight: 600; min-width: 8px; text-align: left; }

/* active (clicked) state */
.reaction.is-on {
  background: var(--accent-soft);
  border-color: var(--accent-line);
  color: var(--accent);
}

/* =========================================================================
   TRADING JOURNAL — day strip, shared trades, metric cards (Chart.js), KPIs
   ========================================================================= */

/* page head row: title + edit button (left) · period switcher (right) */
.jr-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap; margin-bottom: var(--s-6);
}
.jr-head .page-head { margin-bottom: 0; }
.jr-head__left { display: flex; flex-direction: column; gap: var(--s-3); align-items: flex-start; }
.jr-head__controls { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; }
.btn--sm { padding: 8px 14px; font-size: 13px; }

.jr-block { margin-top: var(--s-8); }

/* ---- Block 1: day / week strip ---- */
.jr-strip-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-3); margin-bottom: var(--s-4);
}
.jr-month { font-size: 16px; font-weight: 650; }
.jr-nav { display: flex; align-items: center; gap: var(--s-2); }

.jr-days { display: flex; gap: var(--s-3); overflow-x: auto; padding-bottom: var(--s-2); }
/* nested inside the container card → dezent abgesetzte Fläche (nicht "Box in gleicher Box") */
.jr-day {
  flex: 0 0 138px; padding: var(--s-4);
  background: rgba(255,255,255,0.025);
  border: 1px solid var(--border);
  border-radius: 12px;
}

/* generic nested surface for elements that sit INSIDE a container card */
.inner-card {
  background: rgba(255,255,255,0.025);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: var(--s-5);
}
.inner-card--hover { transition: border-color .2s ease, background .2s ease, transform .2s ease; }
.inner-card--hover:hover {
  border-color: var(--accent-line);
  background: rgba(255,255,255,0.045);
  transform: translateY(-2px);
}
.jr-day__top {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: var(--s-3);
}
.jr-day__date { font-size: 13px; font-weight: 600; }
.jr-day__dow { color: var(--text-muted); font-weight: 500; margin-left: 4px; }
.jr-day__icon { color: var(--text-faint); display: grid; place-items: center; }
.jr-day__icon svg { width: 15px; height: 15px; }
.jr-day__pnl { font-size: 17px; font-weight: 700; letter-spacing: -.3px; }
.jr-day__trades { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.jr-day.is-empty { opacity: .45; }

/* shared colour helpers */
.is-up   { color: var(--green); }
.is-down { color: var(--red); }
.is-flat { color: var(--text-faint); }

/* ---- Block 2: shared trade cards (sparklines) ---- */
.trade-card__head {
  display: flex; align-items: center; justify-content: space-between;
  font-size: 12.5px; color: var(--text-muted);
}
.trade-card__symbol { font-size: 22px; font-weight: 700; letter-spacing: -.4px; margin: var(--s-2) 0 var(--s-4); }
.trade-card__spark { height: 72px; position: relative; }

/* ---- Block 3: metric cards ---- */
.metric-card__title { font-size: 13px; color: var(--text-muted); margin: 0 0 var(--s-2); }
.metric-card__value { font-size: 25px; font-weight: 700; letter-spacing: -.5px; margin-bottom: var(--s-4); }
.metric-card__value small { font-size: 14px; font-weight: 600; color: var(--text-muted); }

.gauge-wrap  { position: relative; height: 128px; }
.donut-wrap  { position: relative; height: 150px; }
.donut-legend { display: flex; justify-content: center; gap: var(--s-4); margin-top: var(--s-3); font-size: 12px; color: var(--text-muted); }
.donut-legend i { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin-right: 5px; vertical-align: middle; }

/* avg winning vs losing — proportional split bar */
.split-bar { display: flex; height: 14px; border-radius: var(--r-pill); overflow: hidden; margin: var(--s-5) 0 var(--s-3); }
.split-bar__win  { background: var(--green); }
.split-bar__loss { background: var(--red); }
.split-vals { display: flex; justify-content: space-between; font-size: 13px; font-weight: 700; }

/* hourly breakdown list */
.hourly { display: flex; flex-direction: column; gap: var(--s-3); max-height: 196px; overflow-y: auto; padding-right: 4px; }
.hour-row { display: flex; align-items: center; gap: var(--s-3); font-size: 12.5px; }
.hour-row__time { width: 44px; color: var(--text-muted); flex-shrink: 0; }
.hour-row__track { flex: 1; height: 8px; border-radius: var(--r-pill); background: rgba(255,255,255,0.05); position: relative; }
.hour-row__track::before { /* center line */
  content: ""; position: absolute; left: 50%; top: -2px; bottom: -2px; width: 1px; background: var(--border-strong);
}
.hour-row__fill { position: absolute; top: 0; bottom: 0; border-radius: var(--r-pill); }
.hour-row__fill.is-up   { background: var(--green); left: 50%; }
.hour-row__fill.is-down { background: var(--red);   right: 50%; }
.hour-row__val { width: 92px; text-align: right; flex-shrink: 0; font-weight: 600; }
.hour-row__val span { color: var(--text-faint); font-weight: 500; margin-left: 4px; }

/* ---- Block 4: KPI cards ---- */
.kpi-card__head { display: flex; align-items: center; gap: var(--s-3); margin-bottom: var(--s-4); }
.kpi-card__icon {
  width: 38px; height: 38px; border-radius: 11px; flex-shrink: 0;
  display: grid; place-items: center;
  color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.kpi-card__icon svg { width: 19px; height: 19px; }
.kpi-card__title { font-size: 13px; color: var(--text-muted); }
.kpi-card__value { font-size: 24px; font-weight: 700; letter-spacing: -.4px; }
.kpi-card__sub { font-size: 12.5px; color: var(--text-faint); margin-top: 4px; }

/* =========================================================================
   STATUS & RANKS (rewards) — rank cards, metallic hex badges, info blocks
   ========================================================================= */

/* head row: title (left) · "Dein Status" pill (right) */
.rw-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap; margin-bottom: var(--s-6);
}
.rw-head .page-head { margin-bottom: 0; }
.rw-status {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 13px; color: var(--text-muted);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  padding: 8px 14px; border-radius: var(--r-pill);
}
.rw-status b { color: var(--accent); font-weight: 700; }

/* ---- rank cards ---- */
.rank-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--s-5); }

.rank-card {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: var(--s-3);
  padding: var(--s-6) var(--s-4);
}
.rank-card__name { font-size: 16px; font-weight: 700; margin: var(--s-2) 0 0; }
.rank-card__thresh { font-size: 13px; color: var(--text-muted); }

.rank-card__status {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; font-weight: 600; color: var(--green);
  margin-top: auto;
}
.rank-card__status svg { width: 14px; height: 14px; }

/* "Du bist hier" badge on the current rank */
.rank-card__here {
  margin-top: auto;
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 700; letter-spacing: .3px;
  color: #fff; background: var(--accent);
  padding: 5px 12px; border-radius: var(--r-pill);
  box-shadow: 0 6px 18px var(--accent-glow);
}

/* current rank card highlight */
.rank-card.is-current {
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent), 0 14px 40px rgba(146,80,236,0.22);
}

/* ---- metallic hex badge ---- */
.badge-hex {
  width: 84px; height: 92px; display: block;
  filter: drop-shadow(0 6px 14px rgba(0,0,0,0.5));
}

/* ---- Block 2: "Was dein Status freischaltet" ---- */
.feature-cols {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: var(--s-3) var(--s-8);
}
.feature { display: flex; align-items: center; gap: var(--s-3); font-size: 14px; }
.feature__check {
  flex-shrink: 0; width: 22px; height: 22px; border-radius: 50%;
  display: grid; place-items: center;
  color: var(--green); background: var(--green-soft);
  border: 1px solid rgba(34,197,94,0.35);
}
.feature__check svg { width: 13px; height: 13px; }

/* ---- Block 3: "Wie der Status funktioniert" ---- */
.howto { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--s-4); }
.howto li { display: flex; gap: var(--s-3); align-items: flex-start; }
.howto__num {
  flex-shrink: 0; width: 24px; height: 24px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 12px; font-weight: 700; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.howto__text { font-size: 14px; color: var(--text-muted); line-height: 1.6; }
.howto__text strong { color: var(--text); font-weight: 600; }

/* ---- responsive ---- */
@media (max-width: 1100px) { .rank-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 760px)  { .rank-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px)  {
  .rank-grid { grid-template-columns: minmax(0, 1fr); }
  .feature-cols { grid-template-columns: minmax(0, 1fr); }
}

/* =========================================================================
   ACCOUNT — profile header + personal data (display / edit toggle)
   ========================================================================= */

/* ---- Block 1: profile header ---- */
.profile {
  display: flex; align-items: center; gap: var(--s-5);
}
.profile__avatar-wrap { display: flex; flex-direction: column; align-items: center; gap: var(--s-2); flex-shrink: 0; }
.profile__avatar {
  width: 84px; height: 84px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 28px; font-weight: 700; color: #fff;
  background: linear-gradient(135deg, var(--accent), #4a1fb0);
  box-shadow: 0 8px 22px var(--accent-glow);
}
.profile__change {
  font-size: 12px; font-weight: 600; color: var(--accent);
  background: transparent; border: none; padding: 0;
}
.profile__change:hover { color: var(--accent-hover); }

.profile__info { min-width: 0; }
.profile__name { font-size: 22px; font-weight: 700; margin: 0 0 4px; letter-spacing: -.3px; }
.profile__mail { font-size: 14px; color: var(--text-muted); margin: 0 0 var(--s-3); overflow: hidden; text-overflow: ellipsis; }
.profile__badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 700; letter-spacing: .3px;
  color: var(--accent); border: 1px solid var(--accent-line);
  background: var(--accent-soft); padding: 5px 12px; border-radius: var(--r-pill);
}
.profile__badge .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }

/* ---- Block 2: personal data ---- */
.data-card__head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-3); margin-bottom: var(--s-5);
}

.field-list { display: flex; flex-direction: column; }
.field-row {
  display: grid; grid-template-columns: 200px 1fr; align-items: center;
  gap: var(--s-4);
  padding: var(--s-4) 0;
  border-top: 1px solid var(--border);
}
.field-row:first-child { border-top: none; padding-top: 0; }
.field-row__label { font-size: 13px; color: var(--text-muted); font-weight: 500; }
.field-row__value { font-size: 14px; color: var(--text); font-weight: 500; }

/* Zwei Felder je Zeile (Konto: Vorname|Nachname, E-Mail|Telefon, Land|Sprache).
   WARUM eine eigene Variante statt "field-list grid grid--2": .field-list setzt
   display:flex und steht in dieser Datei WEIT NACH .grid – bei gleicher
   Gewichtung gewinnt die spaetere Regel, das Raster kam nie an. Diese Regel
   steht bewusst direkt hier, damit die Reihenfolge stimmt. */
.field-list--zwei {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  column-gap: var(--s-6);
}
/* In halber Breite ist die 200px-Beschriftungsspalte zu breit fuer den Wert. */
.field-list--zwei .field-row { grid-template-columns: 120px 1fr; }
/* Ohne dies haette die rechte Spalte oben eine Trennlinie zu viel: in zwei
   Spalten sind die ERSTEN BEIDEN Zeilen die oberste Reihe. */
.field-list--zwei .field-row:nth-child(-n+2) { border-top: none; padding-top: 0; }
/* .field-row__input ist normalerweise ausgeblendet (nur im Bearbeiten-Modus
   sichtbar). Das Passkey-Feld nutzt dieselbe Optik, steht aber dauerhaft da. */
.field-row__input.is-sichtbar { display: block; max-width: 240px; }
@media (max-width: 720px) {
  .field-list--zwei { grid-template-columns: minmax(0, 1fr); }
  .field-list--zwei .field-row:nth-child(2) { border-top: 1px solid var(--border); padding-top: var(--s-4); }
}

/* edit input (hidden until edit mode) */
.field-row__input {
  width: 100%; max-width: 380px; height: 42px;
  padding: 0 var(--s-4);
  background: #0c0c0f;
  border: 1px solid var(--border-strong);
  border-radius: var(--r-item);
  color: var(--text); font-size: 14px;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.field-row__input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }

/* mode visibility: default = display mode */
.field-row__input { display: none; }
.account-form.is-editing .field-row__value { display: none; }
.account-form.is-editing .field-row__input { display: block; }

/* action buttons row (only in edit mode) */
.data-actions { display: none; gap: var(--s-3); margin-top: var(--s-6); }
.account-form.is-editing .data-actions { display: flex; }
.account-form.is-editing .data-card__head .btn { display: none; }   /* hide "Bearbeiten" while editing */
.account-section { margin-bottom: 24px; }
.account-section form { margin-top: 16px; }
.account-notice, .account-success { padding: 12px 16px; border-radius: 8px; background: var(--accent-glow); }
.account-hint { color: var(--text-muted); }
.account-fields { display: grid; gap: 14px; max-width: 620px; }
.account-fields label, #passkeys > label { display: grid; gap: 6px; font-weight: 600; }
/* Platz fuer das Auge: Die Konto-Felder bringen ihren eigenen Innenabstand
   mit (11px 12px), und ohne Zuschlag rechts liefe der Text unter den Knopf. */
.account-fields .input-wrap input { padding-right: 44px; }

/* Uebersetzungen nachtragen (Akademie-Inhalte) */
.uebersetzen { margin: var(--s-5) 0; padding: var(--s-5); display: grid; gap: var(--s-4); }
.uebersetzen__kopf { display: grid; gap: 4px; }
.uebersetzen__aktionen { display: flex; flex-wrap: wrap; gap: var(--s-3); }
.uebersetzen__aktionen form { margin: 0; }
/* Der Bericht kommt wortwoertlich vom Befehl - also auch mit seinen
   Zeilenumbruechen. Er kann lang werden; scrollen statt die Seite sprengen. */
.uebersetzen__bericht {
  margin: 0;
  padding: var(--s-4);
  max-height: 320px;
  overflow: auto;
  background: #0c0c0f;
  border: 1px solid var(--border);
  border-radius: var(--r-item);
  font-size: 12.5px;
  line-height: 1.6;
  color: var(--text-muted);
  white-space: pre-wrap;
}

/* Bericht: welche Lektion ein Quiz hat und welche eines bekaeme. */
.quiz-bericht { margin: 0; padding: 0; list-style: none; display: grid; gap: 2px; }
.quiz-bericht__zeile {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3);
  justify-content: space-between;
  padding: var(--s-3) var(--s-4);
  border: 1px solid var(--border);
  border-radius: var(--r-item);
  font-size: 13px;
}
.quiz-bericht__lektion { color: var(--text); font-weight: 600; }
.quiz-bericht__zustand { color: var(--text-muted); }
/* Nur die Zeilen, an denen sich etwas aendert, tragen Farbe - sonst leuchtet
   der ganze Bericht und man sieht nicht, worum es geht. */
.quiz-bericht__zeile.is-wird_uebernommen { border-color: var(--accent-line); background: var(--accent-soft); }
.quiz-bericht__zeile.is-wird_uebernommen .quiz-bericht__zustand { color: var(--accent); }
.quiz-bericht__zeile.is-keine_quelle { border-color: var(--warn-line); background: var(--warn-soft); }
.quiz-bericht__zeile.is-keine_quelle .quiz-bericht__zustand { color: var(--warn); }
.account-fields input, #passkeys input { width: 100%; padding: 11px 12px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); color: var(--text); }
.field-error { color: #ef4444; margin: -8px 0 0; }
.account-data { display: grid; gap: 0; }
.account-data > div { display: grid; grid-template-columns: minmax(120px, 1fr) 2fr; padding: 12px 0; border-bottom: 1px solid var(--border); }
.account-data dt { color: var(--text-muted); }
.account-data dd { margin: 0; }
.two-factor-qr svg { max-width: 220px; height: auto; background: white; padding: 8px; }
.recovery-codes { padding: 16px; overflow: auto; }
.passkey-list { padding: 0; list-style: none; }
.passkey-list li { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--border); }
.passkey-list span { display: grid; gap: 4px; }
.passkey-list small { color: var(--text-muted); }

@media (max-width: 560px) {
  .profile { flex-direction: column; text-align: center; align-items: center; }
  .field-row { grid-template-columns: minmax(0, 1fr); gap: 6px; }
}

/* =========================================================================
   DASHBOARD (index) — dense, multi-layer cards (ProTrader-grade)
   Feine Trennlinie = border-top 1px solid rgba(255,255,255,0.06)
   ========================================================================= */

.dash-block { margin-top: var(--s-5); }

/* ---- shared building blocks ---- */
/* section inside a card, separated by a fine divider */
.c-sec { padding-top: var(--s-4); margin-top: var(--s-4); border-top: 1px solid rgba(255,255,255,0.06); }
.c-sec--first, .c-sec:first-child { padding-top: 0; margin-top: 0; border-top: none; }

/* mini section head: emoji/icon + title (+ right action) */
.sec-head { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); }
.sec-head__title { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: var(--text); }
.sec-head__title .emo { font-size: 14px; }
.sec-head__action { font-size: 12px; font-weight: 600; color: var(--accent); display: inline-flex; align-items: center; gap: 4px; }
.sec-head__action:hover { color: var(--accent-hover); }
.sec-head__action svg { width: 13px; height: 13px; }
/* Der Re-Sync ist seit dem 31.07.2026 ein <button> statt eines toten Links.
   Browser geben Knoepfen von sich aus Hintergrund, Rahmen und Innenabstand –
   ohne diesen Ausgleich saehe er anders aus als die uebrigen Aktionen im
   Abschnittskopf. */
button.sec-head__action {
  background: none;
  border: 0;
  padding: 0;
  font-family: inherit;
  cursor: pointer;
}

/* label/value pair */
.kv__label { font-size: 11.5px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .4px; margin: 0 0 3px; }
.kv__value { font-size: 14px; font-weight: 600; color: var(--text); }
.kv__value small { color: var(--text-faint); font-weight: 500; }
.kv__req { font-size: 11px; color: var(--text-muted); margin: 3px 0 0; }

/* ---- 1) greeting ---- */
.greeting-eyebrow { font-size: 11px; font-weight: 700; letter-spacing: 1px; color: var(--text-faint); text-transform: uppercase; margin: 0 0 6px; }
.greeting { font-size: 26px; font-weight: 400; margin: 0 0 var(--s-5); }

/* upper row: status | sessions (wider) | announcements */
/* obere Reihe: Status/Milestones (60%) links, Announcements (40%) rechts,
   beide gleich hoch (stretch), aber insgesamt FLACH. Marktuhr → Journal. */
.dash-top { display: grid; grid-template-columns: 6fr 4fr; gap: var(--s-5); align-items: stretch; }
.dash-top > .card { display: flex; flex-direction: column; }

/* Status-Card intern: Status (links) + Milestones (rechts) NEBENEINANDER */
.status-split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-6); flex: 1; }
.status-split__left { display: flex; flex-direction: column; }
.status-split__right {
  display: flex; flex-direction: column; justify-content: flex-start;  /* oben bündig mit links */
  border-left: 1px solid rgba(255,255,255,0.06);   /* dezente vertikale Trennlinie */
  padding-left: var(--s-6);
}

/* kompakte Milestone-Kategorien in der rechten Spalte */
.ms-mini { display: flex; flex-direction: column; gap: var(--s-4); margin-top: var(--s-5); }
.ms-mini__top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--s-3); margin-bottom: 6px; }
.ms-mini__name { font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--accent); }
.ms-mini__val { font-size: 13px; font-weight: 600; color: var(--text); }
.ms-mini .status-bar { height: 5px; }
.ms-mini__next { font-size: 11.5px; color: var(--text-muted); margin: 6px 0 0; }
.ms-mini__next strong { color: var(--text); font-weight: 600; }

/* Announcements kompakter, damit die Reihe insgesamt niedriger bleibt */
.dash-top .mini-item { padding: 7px 0; }
.dash-top .mini-list { display: flex; flex-direction: column; justify-content: center; flex: 1; }

@media (max-width: 900px) {
  /* gestapelt: Karten & Spalten untereinander, kein Gleich-Höhe-Stretch */
  .dash-top { grid-template-columns: minmax(0, 1fr); align-items: start; }
  .status-split { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .status-split__right {
    justify-content: flex-start;
    border-left: none; padding-left: 0;
    margin-top: var(--s-4); padding-top: var(--s-4);
    border-top: 1px solid rgba(255,255,255,0.06);   /* im Stapel: horizontale Trennlinie */
  }
  .dash-top .mini-list { justify-content: flex-start; }
}

/* emphasised cards get a soft blue glow */
.card--soft-glow { box-shadow: inset 0 1px 0 rgba(255,255,255,0.03), 0 10px 34px rgba(146,80,236,0.10); }

/* ---- 2a) status card ---- */
.status-rank { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--s-3); margin-top: var(--s-3); }
.status-rank__val { font-size: 32px; font-weight: 800; color: var(--accent); letter-spacing: -.6px; line-height: 1; }
.status-rank__xp { text-align: right; }
.status-bar { height: 6px; border-radius: var(--r-pill); background: rgba(255,255,255,0.07); overflow: hidden; margin-top: var(--s-3); }
.status-bar > i { display: block; height: 100%; background: var(--accent); border-radius: var(--r-pill); box-shadow: 0 0 10px var(--accent-glow); }
.status-note { font-size: 12.5px; color: var(--text-muted); line-height: 1.5; margin: 6px 0 0; }
.status-note .lead { color: var(--green); font-weight: 600; }
.status-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-4); margin-bottom: var(--s-4); }

/* ---- 2b) MARKET CLOCK (statisch) ---- */
.clock { --clk-info: 116px; --clk-status: 86px; }
.clock__head { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
.clock__head .sec-head__title { flex: 1; }
.clock__time { font-size: 22px; font-weight: 800; letter-spacing: -.4px; font-variant-numeric: tabular-nums; }
.clock__tz { font-size: 11.5px; color: var(--text-faint); }

/* hour axis */
.clock__axis { display: grid; grid-template-columns: var(--clk-info) 1fr var(--clk-status); margin-top: var(--s-4); }
.clock__ticks { grid-column: 2; position: relative; height: 16px; }
.clock__tick { position: absolute; top: 0; transform: translateX(-50%); font-size: 10px; color: var(--text-faint); }

/* rows area (relative → holds the single "now" line) */
.clock__rows { position: relative; display: flex; flex-direction: column; }
.clock__now {
  position: absolute; top: 0; bottom: 0; width: 2px;
  /* sits inside the timeline column: info-offset + 81.8% of track width */
  left: calc(var(--clk-info) + (100% - var(--clk-info) - var(--clk-status)) * 0.818);
  background: linear-gradient(180deg, rgba(146,80,236,0.1), var(--accent), rgba(146,80,236,0.1));
  z-index: 2;
}
.clock__now::before { content: ""; position: absolute; top: -3px; left: -3px; width: 8px; height: 8px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px var(--accent-glow); }

.clock-row { display: grid; grid-template-columns: var(--clk-info) 1fr var(--clk-status); align-items: center; height: 40px; }
.clock-row__info { display: flex; align-items: center; gap: 8px; min-width: 0; }
.clock-row__flag { font-size: 15px; }
.clock-row__city { font-size: 12.5px; font-weight: 600; }
.clock-row__local { font-size: 11px; color: var(--text-faint); font-variant-numeric: tabular-nums; }
.clock-row__track { position: relative; height: 8px; border-radius: var(--r-pill); background: rgba(255,255,255,0.04); }
.clock-bar { position: absolute; top: 0; bottom: 0; border-radius: var(--r-pill); }
.clock-bar.is-open-blue  { background: linear-gradient(90deg, rgba(146,80,236,0.6), var(--accent)); box-shadow: 0 0 10px rgba(146,80,236,0.3); }
.clock-bar.is-open-green { background: linear-gradient(90deg, rgba(34,197,94,0.5), var(--green)); box-shadow: 0 0 10px rgba(34,197,94,0.25); }
.clock-bar.is-closed     { background: rgba(255,255,255,0.12); }
.clock-row__status { font-size: 10.5px; font-weight: 700; letter-spacing: .4px; text-align: right; }
.clock-row__status.is-open   { color: var(--green); }
.clock-row__status.is-closed { color: var(--text-faint); }
.clock__foot { display: flex; align-items: center; gap: var(--s-2); font-size: 12px; color: var(--text-muted); flex-wrap: wrap; }
.clock__foot b { color: var(--text); font-weight: 600; }
.clock__foot .sep { color: var(--text-faint); }

/* ---- 2c) announcements list ---- */
.mini-list { display: flex; flex-direction: column; }
.mini-item { display: flex; align-items: flex-start; gap: var(--s-3); padding: var(--s-3) 0; border-top: 1px solid rgba(255,255,255,0.06); transition: opacity .15s ease; }
.mini-item:first-child { border-top: none; padding-top: 0; }
.mini-item:hover { opacity: .85; }
.mini-item__ico { flex-shrink: 0; font-size: 15px; line-height: 1.4; }
.mini-item__body { flex: 1; min-width: 0; }
.mini-item__title { font-size: 13px; font-weight: 600; margin: 0 0 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mini-item__desc { font-size: 12px; color: var(--text-muted); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mini-item__time { flex-shrink: 0; font-size: 11px; font-weight: 600; color: var(--text-faint); }

/* ---- 3) action cards ---- */
.action-card { display: flex; align-items: center; gap: var(--s-4); }
.action-card__ico {
  width: 46px; height: 46px; border-radius: 12px; flex-shrink: 0;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.action-card__ico svg { width: 22px; height: 22px; }
.action-card__body { flex: 1; min-width: 0; }
.action-card__eyebrow { font-size: 11px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase; color: var(--accent); margin: 0 0 3px; }
.action-card__title { font-size: 15px; font-weight: 650; margin: 0 0 2px; }
.action-card__desc { font-size: 12.5px; color: var(--text-muted); margin: 0; }
.action-card__arrow { flex-shrink: 0; color: var(--text-faint); transition: color .15s ease, transform .15s ease; }
.action-card__arrow svg { width: 20px; height: 20px; }
.action-card:hover .action-card__arrow { color: var(--accent); transform: translateX(3px); }

/* ---- 4) quick-access tiles ---- */
.quick-tile { display: flex; flex-direction: column; gap: var(--s-3); }
.quick-tile__icon {
  width: 44px; height: 44px; border-radius: 12px;
  display: grid; place-items: center;
  color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.quick-tile__icon svg { width: 22px; height: 22px; }
.quick-tile__title { font-size: 15px; font-weight: 650; margin: var(--s-2) 0 0; }
.quick-tile__sub { font-size: 12.5px; color: var(--text-muted); margin: 0; }
.quick-tile__sub.is-live { color: var(--green); font-weight: 600; }

/* market clock: on small screens hide the per-city local time to keep rows tidy */
@media (max-width: 520px) {
  .clock { --clk-info: 92px; --clk-status: 72px; }
  .clock-row__local { display: none; }
}

/* =========================================================================
   PLACEHOLDER / SKELETON ELEMENTS (build = scaffold only)
   ========================================================================= */
.skeleton {
  background: linear-gradient(90deg, rgba(255,255,255,0.04), rgba(255,255,255,0.07), rgba(255,255,255,0.04));
  background-size: 200% 100%;
  border-radius: 8px;
  animation: shimmer 1.8s ease-in-out infinite;
}
@keyframes shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
.sk-line { height: 12px; margin-bottom: 10px; }
.sk-line.w-40 { width: 40%; }
.sk-line.w-60 { width: 60%; }
.sk-line.w-80 { width: 80%; }
.sk-line:last-child { margin-bottom: 0; }
.sk-block { height: 120px; border-radius: 12px; }
.sk-thumb { aspect-ratio: 16 / 9; border-radius: 12px; }
.sk-avatar { width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; }

/* dashed empty placeholder panel */
.placeholder {
  border: 1px dashed var(--border-strong);
  border-radius: var(--r-card);
  background: rgba(255, 255, 255, 0.015);
  padding: var(--s-8);
  display: grid;
  place-items: center;
  text-align: center;
  color: var(--text-muted);
  min-height: 160px;
}
.placeholder__icon {
  width: 44px; height: 44px; margin-bottom: var(--s-3);
  color: var(--text-faint);
}
.placeholder__icon svg { width: 44px; height: 44px; }
.placeholder__title { font-weight: 600; color: var(--text); margin: 0 0 4px; font-size: 14px; }
.placeholder__text { font-size: 13px; max-width: 46ch; }

/* list row scaffold */
.row-list { display: flex; flex-direction: column; gap: var(--s-3); }
.row {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  padding: var(--s-4);
  border: 1px solid var(--border);
  border-radius: 12px;
  background: rgba(255,255,255,0.012);
  transition: background .15s ease, border-color .15s ease;
}
.row:hover { background: var(--card-hover); border-color: var(--border-strong); }
.row__body { flex: 1; min-width: 0; }

/* =========================================================================
   COMING SOON full-page state
   ========================================================================= */
.coming-soon {
  display: grid;
  place-items: center;
  text-align: center;
  padding: var(--s-10) var(--s-6);
  min-height: 52vh;
}
.coming-soon__inner { max-width: 460px; }
.coming-soon__icon {
  width: 84px; height: 84px;
  margin: 0 auto var(--s-6);
  border-radius: 22px;
  display: grid; place-items: center;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  box-shadow: 0 0 60px var(--accent-glow);
}
.coming-soon__icon svg { width: 40px; height: 40px; }
.coming-soon__pill {
  display: inline-block;
  font-size: 11px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  color: var(--accent);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  padding: 4px 12px;
  border-radius: var(--r-pill);
  margin-bottom: var(--s-4);
}
.coming-soon__title { font-size: 26px; font-weight: 700; margin: 0 0 var(--s-3); }
.coming-soon__text { color: var(--text-muted); font-size: 15px; margin: 0; }

/* =========================================================================
   BUTTONS
   ========================================================================= */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--s-2);
  padding: 11px var(--s-5);
  border-radius: var(--r-item);
  font-size: 14px;
  font-weight: 600;
  border: 1px solid transparent;
  transition: background .15s ease, border-color .15s ease, transform .1s ease;
}
.btn:active { transform: translateY(1px); }
.btn svg { width: 18px; height: 18px; }
.btn--primary {
  background: var(--accent);
  color: #fff;
  box-shadow: 0 8px 24px var(--accent-glow);
}
.btn--primary:hover { background: var(--accent-hover); }
.btn--ghost {
  background: var(--card);
  border-color: var(--border);
  color: var(--text);
}
.btn--ghost:hover { background: var(--card-hover); border-color: var(--border-strong); }
/* Outline-Variante für Sekundär-Aktionen (RSVP/Erinnern): transparent + blauer Rand */
.btn-outline {
  background: transparent;
  border: 1px solid rgba(146, 80, 236, 0.5);
  color: var(--accent);
  box-shadow: none;
}
.btn-outline:hover {
  background: rgba(146, 80, 236, 0.12);
  border-color: var(--accent);
  color: var(--accent);
}
.btn--block { width: 100%; }

/* =========================================================================
   LOGIN PAGE
   ========================================================================= */
.login {
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: var(--s-6);
  position: relative;
  overflow: hidden;
}
.login__bg {
  position: absolute;
  inset: 0;
  background: url("../wifimoney-background.webp") center/cover no-repeat;
  opacity: .5;
  z-index: 0;
}
.login__overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    radial-gradient(900px 500px at 70% 20%, var(--accent-glow), transparent 60%),
    linear-gradient(180deg, rgba(10,10,12,0.55), rgba(10,10,12,0.92));
}
.login__card {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 420px;
  background: var(--card);
  border: 1px solid var(--border-strong);
  border-radius: 20px;
  box-shadow: var(--shadow-pop), 0 0 0 1px rgba(146,80,236,0.05), 0 0 80px var(--accent-glow);
  padding: var(--s-8);
}
.login__brand {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  margin-bottom: var(--s-6);
}
.login__brand .brand__name { font-size: 16px; }
.login__brand .brand__logo { height: 38px; }
.login__title { font-size: 23px; font-weight: 700; margin: 0 0 var(--s-2); }
.login__subtitle { font-size: 14px; color: var(--text-muted); margin: 0 0 var(--s-6); }

/* Rueckmeldungen am Login — in der Design-Phase nicht vorhanden, weil es
   ohne Backend keine Fehlerzustaende gab. Nutzt ausschliesslich bestehende
   Tokens (--red / --red-soft / --green), damit die Optik konsistent bleibt. */
.login__error,
.login__notice {
  display: flex;
  align-items: flex-start;
  gap: var(--s-2);
  font-size: 13px;
  line-height: 1.45;
  padding: var(--s-3);
  border-radius: 12px;
  margin: 0 0 var(--s-5);
}
.login__error {
  color: var(--red);
  background: var(--red-soft);
  border: 1px solid rgba(255, 59, 48, 0.28);
}
.login__error svg { width: 16px; height: 16px; flex: 0 0 16px; margin-top: 1px; }
.login__notice {
  color: var(--green);
  background: rgba(34, 197, 94, 0.12);
  border: 1px solid rgba(34, 197, 94, 0.28);
}

/* Zwei-Faktor: aufklappbarer Bereich fuer den Wiederherstellungscode. */
.tfa-recovery { margin-top: var(--s-5); }
.tfa-recovery > summary {
  cursor: pointer;
  font-size: 13px;
  color: var(--text-muted);
  text-align: center;
  list-style: none;
  transition: color .15s ease;
}
.tfa-recovery > summary::-webkit-details-marker { display: none; }
.tfa-recovery > summary:hover { color: var(--accent); }

/* form */
.field { margin-bottom: var(--s-4); }
.field__label {
  display: block;
  font-size: 13px;
  font-weight: 500;
  color: var(--text-muted);
  margin-bottom: var(--s-2);
}
.input-wrap { position: relative; }
.input {
  width: 100%;
  height: 46px;
  padding: 0 var(--s-4);
  background: #0c0c0f;
  border: 1px solid var(--border-strong);
  border-radius: var(--r-item);
  color: var(--text);
  font-size: 14px;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.input::placeholder { color: var(--text-faint); }
.input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-glow);
}
.input--with-icon { padding-right: 46px; }
.input-icon-btn {
  position: absolute;
  right: 6px;
  top: 50%;
  transform: translateY(-50%);
  width: 34px; height: 34px;
  display: grid; place-items: center;
  background: transparent;
  border: none;
  color: var(--text-muted);
  border-radius: 8px;
}
.input-icon-btn:hover { color: var(--text); background: var(--card-hover); }
.input-icon-btn svg { width: 18px; height: 18px; }

.field-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: var(--s-2) 0 var(--s-6);
}
.checkbox {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-size: 13px;
  color: var(--text-muted);
  user-select: none;
  cursor: pointer;
}

/* Ein Haken mit einem ganzen SATZ daneben, nicht mit zwei Worten.

   .checkbox ist inline-flex - jedes Kind wird damit zu einem eigenen
   Flex-Element. Bei "Stay signed in" faellt das nicht auf, weil dort nur ein
   Stueck steht. Der Zustimmungssatz besteht aus sieben Stuecken (vier
   Textteile, drei Verweise) und wurde am 07.08.2026 als sieben Spalten
   nebeneinander gezeichnet - unlesbar.

   Behoben an zwei Stellen: Der Satz sitzt in der Ansicht in EINEM span, und
   hier steht das Kaestchen oben statt mittig, damit es bei mehreren Zeilen
   nicht in der Mitte schwebt. */
.checkbox--satz { align-items: flex-start; line-height: 1.5; }
.checkbox--satz input { margin-top: 2px; flex: none; }
.checkbox--satz > span { display: block; }
.checkbox--satz a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
.checkbox--satz a:hover { color: var(--accent-hover); }

.checkbox input {
  appearance: none;
  width: 17px; height: 17px;
  /* HELLER ALS #0c0c0f, das praktisch schwarz auf schwarzem Grund war
     (Betreiberfund vom 08.08.2026: "dass man diese Checkbox auch richtig
     sieht"). Ein leeres Kaestchen muss als Kaestchen erkennbar sein - sonst
     sieht niemand, dass dort etwas anzuklicken ist. */
  border: 1.5px solid rgba(255,255,255,0.55);
  border-radius: 5px;
  background: rgba(255,255,255,0.12);
  display: grid; place-items: center;
  /* BOX-SIZING UND FLEX: NONE, damit sich beim Anhaken NICHTS bewegt.
     (Betreiberfund vom 08.08.2026: "Wenn man den Haken setzt, verschiebt sich
     leicht die Position.")

     Ohne box-sizing zaehlt der Rahmen zur Breite DAZU - 17px plus 2x1.5px
     ergibt 20px. Und ohne flex: none darf das Kaestchen im Flex-Verbund
     schrumpfen, wenn der Text daneben Platz braucht. Beides zusammen liess
     den Satz um ein bis zwei Pixel springen. */
  box-sizing: border-box;
  flex: none;
  /* Fester Bezugsrahmen fuer den Haken - siehe :checked::after unten. */
  position: relative;
  /* Ohne feste Zeilenhoehe richtet sich das Kaestchen an der Grundlinie des
     Textes aus, und die verschiebt sich, sobald Inhalt dazukommt. */
  line-height: 0;
  vertical-align: top;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
}
.checkbox input:checked { background: var(--accent); border-color: var(--accent); }
.checkbox input:checked::after {
  /* ABSOLUT, NICHT IM FLUSS. Vorher war der Haken ein Grid-Element im
     Kaestchen - und schob dessen Grundlinie, sobald er erschien. Der Satz
     daneben rutschte dadurch beim Anklicken ein bis zwei Pixel nach unten.

     Betreiberbefund vom 08.08.2026, zweimal gemeldet: "der Text mit dem Haken
     bewegt sich noch immer etwas nach unten, wenn man draufklickt". Meine
     erste Erklaerung (box-sizing) war nur die halbe Ursache.

     Absolut positioniert kann er die Groesse des Kaestchens nicht mehr
     beeinflussen - egal, was mit ihm passiert. */
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 9px; height: 5px;
  margin: -4px 0 0 -5px;
  border: 2px solid #fff;
  border-top: none; border-right: none;
  transform: rotate(-45deg);
}
.link { color: var(--accent); font-size: 13px; font-weight: 500; }
.link:hover { color: var(--accent-hover); }

.login__foot {
  text-align: center;
  margin-top: var(--s-5);
  font-size: 13px;
  color: var(--text-muted);
}

/* Die Adresse ueber dem Codefeld (15.08.2026). Der erklaerende Satz ist
   gedaempft, die Adresse selbst steht in Textfarbe und wird umbrochen: Sie ist
   das Einzige auf dieser Seite, das jemand PRUEFEN soll, und lange Adressen
   duerfen den Kasten nicht sprengen. */
.login__adresse {
  text-align: center;
  margin-bottom: var(--s-5);
  font-size: 13px;
  line-height: 1.6;
  color: var(--text-muted);
  overflow-wrap: anywhere;
}
/* Der Neuversand steht unter dem Formular, mit Luft dazwischen: Er ist der
   zweite Weg, nicht die Hauptsache. */
.login__erneut { margin-top: var(--s-4); }
.login__adresse strong { color: var(--text); font-weight: 600; }

/* Datenschutzhinweis unter dem Aktivierungsformular (Art. 13 DSGVO).
   Kleiner als der Fuß, weil er informiert und nicht zum Klicken auffordert –
   aber lesbar, denn ein Hinweis, den niemand liest, erfüllt nichts. */
.auth-legal {
  margin: var(--s-4) 0 0;
  font-size: 12px;
  line-height: 1.55;
  color: var(--text-faint);
  text-align: center;
}
.auth-legal a { color: var(--text-muted); text-decoration: underline; text-underline-offset: 2px; }
.auth-legal a:hover { color: var(--text); }
/*
 * Der Zustimmungshaken traegt einen ganzen Satz, keine zwei Woerter wie
 * "Angemeldet bleiben". .checkbox zentriert senkrecht (align-items: center);
 * bei drei Zeilen Text staende das Kaestchen dann in der Mitte des Absatzes
 * statt neben der ersten Zeile. Deshalb oben ausgerichtet, und das Kaestchen
 * darf nicht mitschrumpfen.
 */
.checkbox--legal { align-items: flex-start; text-align: left; line-height: 1.5; }
.checkbox--legal input { flex: none; margin-top: 1px; }
.checkbox--legal a { color: var(--text); text-decoration: underline; text-underline-offset: 2px; }

/* =========================================================================
   MOBILE OVERLAY for sidebar
   ========================================================================= */
/* HIER STAND DIE VERDUNKELUNG DER SCHUBLADE, und sie ist am 09.08.2026
   gefallen.

   BETREIBERMELDUNG: "Wenn ich die Sidebar aufmache, sehe ich auf einmal nichts
   mehr", und nach zwei Nachbesserungen: "Ich kann noch immer nichts
   auswaehlen."

   Das Element lag ueber der ganzen Seite - auch ueber der Leiste selbst. Erst
   verdeckte es sie sichtbar (backdrop-filter), dann fing es nach dem
   Entfernen von Farbe und Weichzeichner weiterhin die Klicks ab. Zwei
   Anlaeufe mit Ebenennummern haben daran nichts geaendert, und beim dritten
   habe ich aufgehoert, an Ebenen zu drehen.

   Das Schliessen beim Klick daneben haengt jetzt an einem Zuhoerer am
   Dokument - siehe app.js. Was nicht da ist, kann nichts verdecken. */

/* =========================================================================
   RESPONSIVE
   ========================================================================= */
@media (max-width: 1100px) {
  .grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 900px) {
  /* Sidebar becomes an off-canvas drawer */
  .main { margin-left: 0 !important; }
  .sidebar { transform: translateX(-100%); }
  /* Ausdruecklich ueber der Verdunkelung - siehe den Kommentar bei .scrim. */
  .sidebar.is-open { transform: translateX(0); box-shadow: var(--shadow-pop); z-index: 80; }
  /* Force full width even if "collapsed" state was saved */
  .app.collapsed .sidebar { width: var(--sidebar-w); }
  .app.collapsed .brand__text,
  .app.collapsed .nav-group__caption,
  .app.collapsed .nav-item__label,
  .app.collapsed .nav-item__launch,
.app.collapsed .nav-item__soon,
  .app.collapsed .collapse-btn span { display: revert; }
  .app.collapsed .nav-item { justify-content: flex-start; padding-left: var(--s-3); padding-right: var(--s-3); }

  .header__hamburger { display: grid; }
  .content { padding: var(--s-5); }
  .page-title { font-size: 25px; }
}

@media (max-width: 640px) {
  .grid--2, .grid--3, .grid--4 { grid-template-columns: minmax(0, 1fr); }
  .badge--streak { display: none; }      /* keep header tidy on small screens */
  .content { padding: var(--s-4); }
}

/* =========================================================================
   THEME: "LIQUID GLASS" — purple→orange accent + glass surfaces.
   SCOPED to body.theme-glass (currently only the Dashboard / index.html),
   so the shared sidebar & header restyle ONLY on that page and the other
   pages keep the existing blue theme untouched. Roll out globally later
   by adding class="theme-glass" to the other pages' <body>.
   ========================================================================= */
/* Registrierte Custom Properties → machen die Verlaufs-Stopps des Eck-Glanzes
   ANIMIERBAR (transition greift nur bei @property-typisierten Werten).
   Sie definieren die transparente Mittelzone des 135°-Rand-Glanzes:
   je näher --glow-a/--glow-b an 50% rücken, desto weiter breitet sich das
   Licht von den Ecken an den Kanten entlang aus. */
@property --glow-a { syntax: "<percentage>"; inherits: false; initial-value: 28%; }
@property --glow-b { syntax: "<percentage>"; inherits: false; initial-value: 72%; }
/* Eck-Glanz-FARBEN registriert → beim Hover animierbar heller werden */
@property --corner-tl { syntax: "<color>"; inherits: true; initial-value: rgba(255,255,255,0.55); }
@property --corner-br { syntax: "<color>"; inherits: true; initial-value: rgba(255,255,255,0.38); }

.theme-glass {
  /* purple→orange accent gradient + single-tone fallback that replaces the blue */
  --accent-gradient: linear-gradient(135deg, #7f44f4, #ef4f3c);
  --accent:        #9250ec;              /* single-tone fallback (links, icons) */
  --accent-hover:  #a66bf0;
  --accent-glow:   rgba(146, 80, 236, 0.20);
  --accent-soft:   rgba(146, 80, 236, 0.14);
  --accent-line:   rgba(146, 80, 236, 0.40);

  /* ---- JUSTIERBARE GLAS-REGLER ------------------------------------------
     Diese Werte zum Feintunen anfassen: */
  --glass-overlay:  rgba(0, 0, 0, 0.75);    /* Hintergrund-Abdunklung               */
  --glass-vignette: rgba(0, 0, 0, 0.45);   /* Rand-Vignette (dunkler zu den Rändern) */
  --glass-bg:       rgba(0, 0, 0, 0.45); /* Glas-Grundfarbe (Substanz)        */
  --glass-blur:     45px;                  /* Blur-Stärke (Fokus-Flächen)           */
  --glass-saturate: 160%;                  /* Farbsättigung durchs Glas             */
  --glass-bright:   1.05;                  /* leichte Aufhellung                    */
  --glass-border:   rgba(255, 255, 255, 0.10); /* dezenter Grundrand (ganze Card)     */
  --hover-glow:     rgba(255, 255, 255, 0.15); /* HOVER: dezenter weißer Außen-Glow   */
  --nav-active-bg:  rgba(255, 255, 255, 0.08); /* aktive Sidebar-Zeile = exakt Scrollbar-Thumb */

  /* ---- Primär-Button (dunkler Glas-Button, leuchtende weiße Unterkante) ---- */
  --btn-fill:         #0a0a0f;                  /* FILL_COLOR: fast schwarze Füllung   */
  --btn-glow:         0.95;                     /* GLOW_BRIGHTNESS: Helligkeit (0..1)  */
  --btn-glow-w-rest:  35%;                      /* GLOW_WIDTH_REST: Breite im Ruhezustand */
  --btn-glow-w-hover: 90%;                      /* GLOW_WIDTH_HOVER: Breite beim Hover */
  --btn-edge:         2px;                       /* VISIBLE_EDGE_HEIGHT: wie viel Glow unten hervorschaut */
  --corner-tl:      rgba(255, 255, 255, 0.50); /* Eck-Glanz OBEN-LINKS (am hellsten, -5%) */
  --corner-br:      rgba(255, 255, 255, 0.38); /* Eck-Glanz UNTEN-RECHTS (schwächer)  */
  --glass-shimmer:  rgba(255, 255, 255, 0.15); /* innerer Lichtsaum oben (Materialität)*/
  --glass-depth:    rgba(0, 0, 0, 0.6); /* Tiefenschatten unter dem Glas */
}

/* ---- statisches Hintergrundbild (vollflächig, cover, fixiert) ---- */
body.theme-glass {
  background: url("../wifi-money-background-purple-orange.webp") center center / cover no-repeat fixed, #08080D;
}

/* dunkler Overlay + Vignette ÜBER dem Canvas, UNTER dem Content */
body.theme-glass::after {
  content: ""; position: fixed; inset: 0; z-index: 1; pointer-events: none;
  background:
    radial-gradient(130% 130% at 50% 38%, rgba(0,0,0,0) 52%, var(--glass-vignette) 100%),
    var(--glass-overlay);
}
body.theme-glass .app { position: relative; z-index: 2; }   /* Content über Canvas + Overlay */

/* =========================================================================
   WEBGL-MESH-GRADIENT CANVAS (eigener Shader, siehe index.html).
   Ebenen: Canvas (z 0) → Overlay (z 1) → UI (z 2).
   Farben als CSS-Variablen → im JS ausgelesen (leicht änderbar).
   Enthält zugleich einen statischen CSS-Verlauf als WebGL-Fallback.
   ========================================================================= */
.gradient-canvas {
  position: fixed; inset: 0; z-index: 0; width: 100%; height: 100%;
  display: block; pointer-events: none;
  /* Fallback-Look, falls kein WebGL (wird vom Canvas überdeckt, sobald es läuft) */
  background:
    linear-gradient(135deg, transparent 40%, rgba(239,79,60,0.10) 50%, transparent 60%),
    linear-gradient(135deg, #0a0a0f 0%, #1a0f2e 45%, #7f44f4 70%, #1a0f2e 100%);
  /* Shader-Farben (JS liest diese aus) */
  --gradient-color-1: #0a0a0f;   /* dunkler Grund     */
  --gradient-color-2: #7f3ffb;   /* Lila (dominant)   */
  --gradient-color-3: #f94e33;   /* Orange (Adern)    */
  --gradient-color-4: #1a0f2e;   /* dunkles Violett   */
}

/* =========================================================================
   GLASS SURFACES
   - Fokus-Flächen (Sidebar, Header, Haupt-Cards): starker Blur + Substanz.
   - Alle Cards inkl. kleiner Tiles: dezenter Grundrand + diagonaler Eck-Glanz.
   Kanten-Rezept: gleichmäßige border (Grundrand) + ein maskierter Verlaufs-Ring
   (::before) der NUR die Ecken oben-links / unten-rechts aufleuchten lässt.
   Der Ring respektiert border-radius (mask-composite statt border-image).
   ========================================================================= */

/* Glas-Rezept für Sidebar + Header (UNVERÄNDERT: halbtransparentes Glas + Blur). */
.theme-glass .sidebar,
.theme-glass .header {
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  border: 1px solid var(--glass-border);
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth);
}

/* Cards: voll deckendes Schwarz statt halbtransparentem Glas → Seitenhintergrund
   scheint NICHT mehr durch die Card. backdrop-filter/Blur entfällt dadurch
   (wirkungslos + Performance). Rand, Eck-Glanz (::before), Hover, Radius und
   Schatten bleiben unverändert erhalten. */
.theme-glass .card {
  background: #0A0A0F;
  border: 1px solid var(--glass-border);   /* dezenter, gleichmäßiger Grundrand */
  box-shadow:
    inset 0 1px 1px var(--glass-shimmer),  /* feiner Lichtsaum oben (Materialität) */
    var(--glass-depth);                     /* Außen-Tiefenschatten */
}
/* KEINE separate CSS-Border: der Ring (::before) IST die Border → dadurch liegt
   der Grundrand + Eck-Glanz auf EINER Linie, exakt auf der Card-Kante (kein 1px-
   Versatz mehr, da inset:0 ohne Border direkt auf der Border-Box sitzt). */
.theme-glass .card { position: relative; border: 0; }
.theme-glass .dash-top > .card,
.theme-glass .action-card { border-radius: 18px; }

/* Border + diagonaler Eck-Glanz als EIN 1px-Ring, exakt auf der Card-Kontur:
   135°-Verlauf: TL hell → dezenter Grundrand in der Mitte → BR hell.
   Über padding + mask-exclude → folgt exakt dem border-radius. */
.theme-glass .card::before {
  content: "";
  position: absolute; inset: 0;
  border-radius: inherit;
  padding: 1px;                             /* Ring-/Border-Dicke */
  --glow-a: 28%;                            /* Ruhezustand: Grundrand-Zone 28%–72% */
  --glow-b: 72%;
  background: linear-gradient(135deg,
      var(--corner-tl) 0%,
      var(--glass-border) var(--glow-a),    /* Mitte = dezenter Grundrand (durchgehend) */
      var(--glass-border) var(--glow-b),
      var(--corner-br) 100%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  pointer-events: none;
  z-index: 1;
  /* fließende Ausbreitung + Aufhellung des Glanzes beim Hover */
  transition: --glow-a .4s ease, --glow-b .4s ease, --corner-tl .4s ease, --corner-br .4s ease;
}

/* nested Flächen dezent, kein eigener Rand/Glanz (sitzen INNEN im Glas) */
.theme-glass .inner-card,
.theme-glass .jr-day { background: rgba(255, 255, 255, 0.05); border-color: rgba(255, 255, 255, 0.10); box-shadow: none; }
.theme-glass .inner-card::before,
.theme-glass .jr-day::before { display: none; }

/* Card-Hover: Glas + Border bleiben STABIL. Es passiert NUR eines — derselbe
   Eck-Glanz breitet sich von oben-links/unten-rechts an den Kanten entlang aus,
   indem die transparente Mittelzone schrumpft (28–72% → 40–60%). Kein Vollweiß,
   keine zweite Border, keine Breiten-/Layout-Änderung. */
.theme-glass .card--hover:hover::before {
  --glow-a: 33%;                            /* mittlere Ausbreitung (zwischen dezent u. stark) */
  --glow-b: 67%;
  --corner-tl: rgba(255, 255, 255, 0.75);   /* weißes Leuchten oben-links (gedämpft)    */
  --corner-br: rgba(255, 255, 255, 0.60);   /* weißes Leuchten unten-rechts (gedämpft)  */
}
/* zusätzlicher dezenter weißer Außen-Glow, damit der Rand sichtbar "leuchtet" */
.theme-glass .card--hover:hover {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 22px var(--hover-glow);
}

/* =========================================================================
   ACCENT: Verlauf dort, wo vorher flächiges Blau war
   ========================================================================= */
/* ---- Primär-Button: dunkler Glas-Button mit leuchtender UNTERKANTE ----
   Saubere Schichtung über Background-Layer (kein z-index-/Overflow-Trick):
     • GLOW-Linie (hinten): horizontaler Verlauf transparent→weiß(mittig)→transparent,
       an der Unterkante.
     • DUNKLE FILL-BOX (davor): deckt den Button bis auf die unterste VISIBLE_EDGE_HEIGHT
       ab → der weiche innere Glow wird abgeschnitten, sichtbar bleibt nur eine dünne,
       saubere Leuchtlinie.
     • TEXT (vorne): liegt als Element-Inhalt automatisch über dem Hintergrund.
   Kein Blur, kein Außen-Glow/-Schatten. Ruhe: schmal mittig · Hover: ~90%, nur horizontal.
   Justierbar über die --btn-* Variablen (siehe .theme-glass Block). */
.theme-glass .btn--primary {
  position: relative;
  border: 1px solid rgba(255,255,255,0.12);      /* Glas-Grundrand */
  border-radius: 8px;
  color: #fff;
  background-color: var(--btn-fill);             /* Grundfarbe (dunkel) */
  background-image:
    linear-gradient(var(--btn-fill), var(--btn-fill)),                                  /* FILL-Box (deckt oben ab) */
    linear-gradient(90deg, transparent 0%, rgba(255,255,255,var(--btn-glow)) 50%, transparent 100%); /* GLOW-Linie */
  background-repeat: no-repeat, no-repeat;
  background-position: top center, bottom center;
  /* WICHTIG: Positionierung an der BORDER-Box (nicht padding-box) → die Leuchtlinie
     liegt exakt auf der unteren Border-Kante, kein 1px-Versatz. Border = Schein. */
  background-origin: border-box;
  background-clip: border-box;
  background-size:
    100% calc(100% - var(--btn-edge)),           /* FILL lässt unten VISIBLE_EDGE_HEIGHT frei */
    var(--btn-glow-w-rest) 100%;                 /* GLOW-Breite (mittig) — Ruhezustand */
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.08);
  transition: background-size .3s ease, border-color .3s ease;
}
/* Hover: leuchtende Unterkante breitet sich horizontal auf ~90% aus (weich) */
.theme-glass .btn--primary:hover {
  border-color: rgba(255,255,255,0.20);
  background-size:
    100% calc(100% - var(--btn-edge)),
    var(--btn-glow-w-hover) 100%;
}
.theme-glass .brand__mark { background: var(--accent-gradient); }

/* Profil-Avatar (oben rechts) → gleicher Glas-Look wie die Cards:
   Glas-Grund + Blur + dezenter Rand + diagonaler Eck-Glanz. "AV" bleibt weiß. */
.theme-glass .avatar {
  position: relative;
  color: #ffffff;
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  border: 1px solid var(--glass-border);
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth);
}
.theme-glass .avatar::before {
  content: ""; position: absolute; inset: 0;
  border-radius: inherit; padding: 1px;
  background: linear-gradient(135deg,
      var(--corner-tl) 0%, transparent 28%, transparent 72%, var(--corner-br) 100%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  pointer-events: none;
}

/* Fortschrittsbalken (.status-bar/.progress) werden jetzt ZENTRAL getönt –
   siehe Block "ZENTRALE PILLEN/BADGES + FORTSCHRITTSBALKEN" am Dateiende. */
/* Aktiver Sidebar-Punkt: Balken bleibt Gradient (oben), Zeile aber NEUTRAL
   & etwas heller als der Sidebar-Grund → wirkt ausgewählt; Icon+Text weiß. */
.theme-glass .nav-item.is-active::before { background: var(--accent-gradient); }
.theme-glass .nav-item.is-active {
  background: var(--nav-active-bg);        /* neutral, dezent heller (justierbar) */
  color: #ffffff;
}
.theme-glass .nav-item.is-active .nav-item__icon { color: #ffffff; }

/* Marktuhr: blaue Elemente → Verlauf/Lila (grün + rot bleiben) */
.theme-glass .clock__now { background: linear-gradient(180deg, rgba(146,80,236,0.1), #9250ec, rgba(239,79,60,0.5)); }
.theme-glass .clock-bar.is-open-blue { background: var(--accent-gradient); box-shadow: 0 0 10px rgba(146,80,236,0.3); }

/* farbig hinterlegte Icon-KACHELN/-Boxen → dezente Lila→Orange-Verlauf-Tönung
   + heller Glyph. Zentral für alle Icon-in-Box-Elemente (identische Optik):
     .quick-tile__icon · .action-card__ico   → Dashboard
     .card__icon                             → Card-Header-Icons (Dashboard u.a.)
     .kpi-card__icon                         → Journal-KPI-Karten
     .join-card__icon                        → Trading Ideas (Telegram)
     .coming-soon__icon                      → Affiliate-Seiten (Coming Soon)
   NICHT: freistehende Icons ohne Box, Sidebar-/Header-Icons. */
.theme-glass .quick-tile__icon,
.theme-glass .action-card__ico,
.theme-glass .card__icon,
.theme-glass .kpi-card__icon,
.theme-glass .join-card__icon,
.theme-glass .coming-soon__icon,
.theme-glass .portal-tile__icon,
.theme-glass .cat-tile__icon,
.theme-glass .ti-telegram__icon,
.theme-glass .fs-step__icon,
.theme-glass .fs-service__icon {
  background: var(--tint-bg);
  border-color: var(--tint-border);
  color: #d9c9ff;
}

/* ---- Zentrale "Icon-Box"-Tönung als Variablen (Referenz: Trading-Ideas-Icon).
   Pillen/Badges (unten) und Fortschrittsbalken/Charts teilen denselben Look. ---- */
.theme-glass {
  --tint-bg:     linear-gradient(135deg, rgba(127,68,244,0.24), rgba(239,79,60,0.18));
  --tint-border: rgba(146, 80, 236, 0.40);
  --tint-text:   #e6d8ff;   /* helle, gut lesbare Tönung für Text in Pillen/Badges */
}

/* Begrüßungs-Akzentwort: Verlauf-Text (Haupttitel bleibt weiß) */
.theme-glass .greeting span {
  background: var(--accent-gradient);
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
}

/* kleine Chips/Backgrounds, die var(--card) opak nutzen → leicht durchscheinend
   (.badge/.badge--active werden jetzt zentral getönt – siehe PILLEN/BADGES-Block). */
.theme-glass .icon-btn,
.theme-glass .account__menu { background: rgba(255, 255, 255, 0.06); }

/* =========================================================================
   LOGIN im Glas-Theme — neues Hintergrundbild + Glas-Card (scoped).
   ========================================================================= */
.theme-glass .login__bg {
  background: url("../wifi-money-background-purple-orange.webp") center/cover no-repeat;
  opacity: 1;                              /* Bild kommt vom Login-Layer selbst */
}
.theme-glass .login__overlay {
  background:
    radial-gradient(900px 500px at 70% 20%, var(--accent-glow), transparent 60%),
    linear-gradient(180deg, rgba(6,6,10,0.62), rgba(6,6,10,0.86));
}
/* Login-Card = Liquid Glass wie die App-Cards */
.theme-glass .login__card {
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  border: 0;                                /* Ring (::before) IST die Border → kein Versatz */
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth);
}
/* Border + diagonaler Eck-Glanz als EIN Ring, exakt auf der Kontur (wie bei .card) */
.theme-glass .login__card::before {
  content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px;
  background: linear-gradient(135deg, var(--corner-tl) 0%, var(--glass-border) 28%, var(--glass-border) 72%, var(--corner-br) 100%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none;
}


/* =========================================================================
   FIX Sticky-Kursinhalt (lesson-basic-forex-1.html):
   Die rechte Spalte ist "card outline". Die zentrale Regel
   ".theme-glass .card { position: relative }" (0-2-0) überschrieb sonst
   ".outline { position: sticky }" (0-1-0). Mit höherer Spezifität (.card.outline)
   greift sticky verlässlich. (.card hat KEIN störendes overflow; Vorfahren auch nicht.)
   ========================================================================= */
.theme-glass .card.outline {
  position: sticky;
  top: calc(var(--header-h) + var(--s-5));   /* unter dem Glas-Header */
  align-self: start;                         /* nicht auf Zeilenhöhe strecken */
  /* Höhe/Flex/Innen-Scroll kommen aus der .outline-Regel (display:flex, max-height,
     .outline__scroll overflow-y:auto) — Card selbst scrollt nicht, Eck-Glanz bleibt. */
}
@media (max-width: 1000px) {
  /* gestapelt: kein sticky, normal im Fluss */
  .theme-glass .card.outline { position: static; }
}

/* =========================================================================
   ADMIN — dezentes "Admin-Panel"-Label im Header (Rest nutzt die App-Styles).
   ========================================================================= */
.admin-tag {
  display: inline-flex; align-items: center; gap: 7px;
  margin-left: var(--s-2);
  font-size: 13px; font-weight: 600; color: var(--text-muted);
  white-space: nowrap;
}
.admin-tag svg { width: 15px; height: 15px; color: var(--accent); }
@media (max-width: 640px) { .admin-tag { display: none; } }   /* auf sehr schmalen Screens ausblenden */

/* =========================================================================
   ADMIN — kompakte Stats-/Kennzahlen-Cards (nur .stat-grid im Admin-Dashboard).
   Justierbar über --stat-pad-y (Höhe/vertikales Padding) und --stat-gap (Abstand).
   ========================================================================= */
.stat-grid {
  --stat-pad-y: 8px;    /* vertikales Padding der Karten (kleiner = flacher) */
  --stat-gap:   12px;   /* Abstand zwischen den Karten */
  gap: var(--stat-gap);
}
.stat-grid > .card {
  padding-top: var(--stat-pad-y);
  padding-bottom: var(--stat-pad-y);
  display: flex;
  flex-direction: column;
  justify-content: center;   /* Inhalt vertikal zentriert, wenig Leerraum */
}
/* Innenabstände straffen, damit die flacheren Karten sauber sitzen */
.stat-grid .card__head { margin-bottom: 0px; }
/* .stat__value ist ein <p> → hatte die große Browser-Standard-Marge (oben+unten,
   ~1em). Explizit stark reduziert (~ -64%) für kompakteren Sitz der Kennzahl. */
.stat-grid .stat__value { line-height: 1.1; margin: 10px 0; }
.stat-grid .stat__delta { margin-top: var(--s-1); }

/* =========================================================================
   ADMIN — CRUD-Ansicht (Liste + Formular-Panel + Badge + Toggle).
   Gemeinsame Klassen für alle Verwaltungs-Seiten (Announcements, Live Sessions,
   Pop-ups, Giveaways) → einmal pflegen, überall identisch.
   ========================================================================= */

/* Toolbar: Titel links + "Neu erstellen" rechts */
.crud-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap; margin-bottom: var(--s-6);
}

/* ---- Liste ---- */
.crud-list { display: flex; flex-direction: column; gap: var(--s-3); }
.crud-row { display: flex; align-items: center; gap: var(--s-4); padding: var(--s-4) var(--s-5); }
/* ganzflächig klickbare CRUD-Karte (öffnet Bearbeiten-Popup) — cursor + Hover
   signalisieren die Klickbarkeit; der Hover-Hintergrund kommt von .card--hover */
.crud-row.is-rowclick { cursor: pointer; }
/* klickbare Tabellen-Zeile (Rollen/Support etc.) */
.dtable tbody tr.is-rowclick { cursor: pointer; }
.dtable tbody tr.is-rowclick:hover { background: var(--card-hover); }
.crud-row__ico {
  width: 40px; height: 40px; flex-shrink: 0; border-radius: 11px;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.crud-row__ico svg { width: 19px; height: 19px; }
.crud-row__body { flex: 1; min-width: 0; }
.crud-row__title { font-size: 14.5px; font-weight: 600; margin: 0 0 2px; }
.crud-row__sub { font-size: 12.5px; color: var(--text-muted); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crud-row__status { flex-shrink: 0; }
.crud-row__actions { display: flex; gap: var(--s-2); flex-shrink: 0; }
@media (max-width: 720px) {
  .crud-row { flex-wrap: wrap; }
  .crud-row__body { flex-basis: 100%; order: -1; }
}

/* ---- Status-Badge (Aktiv / Inaktiv) ---- */
.status-badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 600; padding: 4px 10px; border-radius: var(--r-pill);
  border: 1px solid transparent; white-space: nowrap;
}
.status-badge .dot { width: 6px; height: 6px; border-radius: 50%; }
.status-badge.is-active   { color: var(--green); background: var(--green-soft); border-color: rgba(34,197,94,0.35); }
.status-badge.is-active .dot   { background: var(--green); }
.status-badge.is-inactive { color: var(--text-faint); background: rgba(255,255,255,0.03); border-color: var(--border); }
.status-badge.is-inactive .dot { background: var(--text-faint); }

/* ---- Icon-Aktionen (Bearbeiten / Löschen) ---- */
.icon-action {
  width: 34px; height: 34px; display: grid; place-items: center;
  border-radius: 8px; border: 1px solid var(--border);
  background: rgba(255,255,255,0.04); color: var(--text-muted);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.icon-action:hover { background: var(--card-hover); color: var(--text); border-color: var(--border-strong); }
.icon-action--danger:hover { color: var(--red); border-color: rgba(255,59,48,0.4); }
.icon-action svg { width: 16px; height: 16px; }

/* ---- Toggle-Switch (Aktiv/Inaktiv) ---- */
.switch { display: inline-flex; align-items: center; gap: var(--s-2); cursor: pointer; user-select: none; }
.switch input {
  appearance: none; -webkit-appearance: none;
  width: 40px; height: 22px; border-radius: var(--r-pill); flex-shrink: 0;
  background: rgba(255,255,255,0.10); border: 1px solid var(--border-strong);
  position: relative; cursor: pointer; transition: background .18s ease, border-color .18s ease;
}
.switch input::after {
  content: ""; position: absolute; top: 2px; left: 2px;
  width: 16px; height: 16px; border-radius: 50%; background: #fff;
  transition: transform .18s ease;
}
.switch input:checked { background: var(--accent); border-color: var(--accent); }
.switch input:checked::after { transform: translateX(18px); }
.switch__label { font-size: 13px; color: var(--text-muted); }

/* ---- Formular-Panel (Erstellen/Bearbeiten) ---- */
.form-panel { margin-bottom: var(--s-6); }
.form-panel[hidden] { display: none; }

/* =========================================================================
   ADMIN-STANDARD: Bearbeiten/Erstellen läuft IMMER über die zentrale
   Modal-Komponente (kein Accordion). Das Formular-Panel (.form-panel) wird
   von window.AdminModal als zentriertes, blickdichtes Glas-Pop-up gezeigt.
   Trigger: [data-open-form] · Schließen: [data-close-form]/Overlay/ESC.
   Doku: admin/README.md · JS: app.js (Abschnitt 8, AdminModal).
   ========================================================================= */
/* Overlay HINTER dem Panel (200 < 201). Wichtig: AdminModal portalt Overlay UND
   Panel nach <body> — sonst sperrt der Stacking-Context von .app (z-index:2) den
   Panel-z-index ein und das body-Overlay läge VOR dem Panel. Portal nicht entfernen. */
.admin-modal-overlay {
  position: fixed; inset: 0; z-index: 200;
  background: rgba(0, 0, 0, 0.62);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.admin-modal-overlay[hidden] { display: none; }
body.admin-modal-lock { overflow: hidden; }

/* Panel als zentriertes Modal (blickdicht, Padding rundum, scrollbar bei Bedarf) */
.form-panel.is-modal {
  position: fixed; z-index: 201;
  top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: min(600px, calc(100vw - 2 * var(--s-5)));
  max-height: 90vh;
  margin: 0;
  background: #0f0f16;   /* blickdicht (über dem Overlay) */
  box-shadow: 0 24px 70px rgba(0, 0, 0, 0.55);
  /* Header oben + Footer unten bleiben FIX, nur der Inhalt dazwischen scrollt.
     Der Panel-Rahmen (.card border) umschließt so IMMER das ganze Modal —
     die Buttons liegen nie außerhalb. Gilt zentral für alle Bearbeiten-Modals. */
  display: flex; flex-direction: column;
  overflow: hidden;
}
/* fixe Kopfzeile (Titel + Close) und Fußzeile (Aktions-Buttons) */
.form-panel.is-modal > .form-panel__head,
.form-panel.is-modal > .form-actions { flex: 0 0 auto; }
/* scrollender Inhaltsbereich = alles zwischen Kopf und Fuß (z. B. .form-grid).
   Dieser Bereich hat KEINE eigene abschließende Border → wirkt nicht wie Modal-Ende. */
.form-panel.is-modal > :not(.form-panel__head):not(.form-actions) {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  /* etwas Innenabstand rechts, damit die Scrollbar nicht am Text klebt */
  margin-right: calc(-1 * var(--s-2)); padding-right: var(--s-2);
}
.form-panel__head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: var(--s-5); padding-bottom: var(--s-4);
  border-bottom: 1px solid var(--border);
}
.form-panel__title { font-size: 16px; font-weight: 650; margin: 0; }

.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-4) var(--s-5); }
/* WARUM min-width: 0 – Raster- und Flex-Kinder haben von Haus aus
   min-width: auto und schrumpfen NICHT unter ihren Inhalt. Ein langer Wert im
   Feld (bunny-Adresse, Videolink) machte die Spalte breiter als das 600px
   breite Fenster, und das Pop-up liess sich waagerecht scrollen. */
.form-grid > * { min-width: 0; }
.form-field { display: flex; flex-direction: column; min-width: 0; }
.form-field--full { grid-column: 1 / -1; }
/* Eine Dolmetscherzeile: E-Mail, Ausgangs- und Zielsprache nebeneinander.
   Die E-Mail bekommt den Rest, die beiden Sprachfelder je ein Drittel – so
   steht die Adresse nicht auf zwei Zeilen, während daneben Luft ist. */
.form-row { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: var(--s-2); margin-bottom: var(--s-2); }
.form-row > * { min-width: 0; }

/* „Gespeichert, aber ein Schritt daneben ist schiefgegangen“ – bernsteinfarben,
   nicht rot: Es ist keine abgelehnte Eingabe, sondern ein Hinweis auf etwas,
   das beim nächsten Speichern von selbst nachzieht. */
.admin-warnung {
  margin-bottom: var(--s-5); padding: 12px 16px; border-radius: 10px;
  font-size: 14px; line-height: 1.5; color: #f5d9a8;
  background: rgba(200, 140, 40, .12); border: 1px solid rgba(200, 140, 40, .3);
}
.form-label { font-size: 13px; font-weight: 500; color: var(--text-muted); margin-bottom: 6px; }

.form-input, .form-select, .form-textarea {
  width: 100%; font-family: inherit; font-size: 14px; color: var(--text);
  background: #0c0c0f; border: 1px solid var(--border-strong); border-radius: 10px;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.form-input, .form-select { height: 44px; padding: 0 14px; }
.form-textarea { padding: 12px 14px; min-height: 92px; resize: vertical; line-height: 1.5; }
.form-input::placeholder, .form-textarea::placeholder { color: var(--text-faint); }
.form-input:focus, .form-select:focus, .form-textarea:focus {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow);
}

/* =========================================================================
   AUSGEFUELLT VOM BROWSER (autofill)

   BETREIBERMELDUNG vom 08.08.2026: "Ja, ist auch mal nicht zu sehen." Das
   "mal" war der Hinweis - betroffen waren nur die Felder, die der Browser
   selbst ausgefuellt hatte.

   Chrome und Safari uebermalen ein automatisch ausgefuelltes Feld mit einem
   eigenen hellen Gelb-Weiss. Das ist KEINE gewoehnliche Hintergrundfarbe: Sie
   laesst sich mit background nicht ueberschreiben. Der einzige Weg ist ein
   Innenschatten, der die Flaeche ueberdeckt, und -webkit-text-fill-color fuer
   die Schrift.

   FOLGE VORHER: Wer sein Passwort vom Browser einsetzen liess, sah ein weisses
   Feld - darin weisse Schrift und das weisse Auge. Beides unsichtbar, und beim
   naechsten Aufruf war es wieder da, weil ohne Autofill nichts uebermalt wurde.

   Die lange Verzoegerung ist der uebliche Kniff: Ein Uebergang, der praktisch
   nie ankommt, haelt den eigenen Grund stabil, statt dass der Browser ihn
   nachtraeglich wieder ueberblendet.
   ========================================================================= */
.input:-webkit-autofill,
.input:-webkit-autofill:hover,
.input:-webkit-autofill:focus,
.form-input:-webkit-autofill,
.form-input:-webkit-autofill:hover,
.form-input:-webkit-autofill:focus,
.form-textarea:-webkit-autofill,
.account-fields input:-webkit-autofill,
.account-fields input:-webkit-autofill:hover,
.account-fields input:-webkit-autofill:focus,
#passkeys input:-webkit-autofill {
  -webkit-box-shadow: 0 0 0 1000px var(--surface) inset;
  box-shadow: 0 0 0 1000px var(--surface) inset;
  -webkit-text-fill-color: var(--text);
  caret-color: var(--text);
  transition: background-color 9999s ease-in-out 0s;
}
/* native Date/Time-Picker im Dark-Look */
.form-input[type="date"], .form-input[type="time"] { color-scheme: dark; }
.form-select {
  appearance: none; -webkit-appearance: none; cursor: pointer;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23ffffff88' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat: no-repeat; background-position: right 12px center; padding-right: 38px;
}

/* Datei-Upload (Platzhalter, ohne echte Funktion) */
/* =========================================================================
   MEDIENKARTE (Uploads im Panel)
   -------------------------------------------------------------------------
   BETREIBERANSAGE vom 30.08.2026: "Das ist halt wie eine richtige Tabelle...
   Ich wuerde das vielleicht sogar auch nochmal so machen, dass die dann auch
   eine eigene Karte sind."

   Drei Spalten: was es ist | der Knopf dazu | der Link. Bis dahin standen bei
   den Videoplaetzen drei UNBESCHRIFTETE Felder unter einer Ueberschrift, jedes
   mit einem Knopf in eigener Zeile - welches Feld das Video war und welches
   das Vorschaubild, erkannte man nur am Knopftext darunter.
   ========================================================================= */
.medien-karte {
  border: 1px solid var(--border); border-radius: 12px;
  background: rgba(255,255,255,0.02); padding: var(--s-5);
}
.medien-karte + .medien-karte { margin-top: var(--s-4); }
.medien-karte__titel {
  margin: 0 0 var(--s-4); font-size: 13px; font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted);
}

/* DIE ERSTE SPALTE HATTE EINE OBERGRENZE ZU WENIG (30.08.2026).
   Sie stand auf max-content - so breit wie ihre laengste Beschriftung. Eine
   davon lautete "Video link · English (also used for all other languages)",
   sechsundfuenfzig Zeichen, und nahm sich rund siebenhundert Pixel. Der Knopf
   nahm seine feste Breite, fuer das Adressfeld blieben sechzig uebrig.

   Der Betreiber meldete es als "ich sehe die Links nicht" - sie standen drin,
   nur in einem Feld, in das nichts hineinpasste. Ein Raster, dessen Spalten
   sich am laengsten Text bedienen, hat keine Bremse; die steht jetzt hier.

   Spalte 3 bekommt eine echte Mindestbreite: Ein Feld, in das man nichts
   lesen kann, ist kein Feld. min() haelt sie davon ab, schmale Fenster zu
   sprengen. */
.medien-tabelle {
  display: grid;
  grid-template-columns: minmax(0, 200px) max-content minmax(min(200px, 100%), 1fr);
  gap: var(--s-3) var(--s-4); align-items: start;
}
/* Die Zeile selbst zeichnet nichts - ihre drei Kinder haengen direkt im
   Raster. Sonst saessen sie in einer Spalte und nichts waere buendig. */
/* DER STAPEL - fuer den Sammel-Upload, wo es kein Adressfeld gibt.
   EIN Abstand zwischen allen Elementen. Vorher trug hier jeder Knopf sein
   eigenes .form-actions mit margin-top: var(--s-6), dazu kam der gap der
   Spalte: zwei Knoepfe untereinander ergaben doppelt so viel Luft wie noetig,
   und die Auswahl darueber sass in einem dritten Kasten mit wieder anderem
   Abstand. Genau das war der Padding-Befund des Betreibers vom 30.08.2026. */
.medien-stapel { display: flex; flex-direction: column; gap: var(--s-4); }
.medien-stapel .form-label { display: block; margin-bottom: 6px; }
/* Volle Breite: In einer Spalte von rund vierhundert Pixeln flattern zwei
   verschieden breite Knoepfe untereinander. */
.medien-stapel .btn { width: 100%; }
.medien-stapel .form-hint:empty { display: none; }

.medien-zeile { display: contents; }
/* Beschriftung und Knopf stehen auf Hoehe der ERSTEN Zeile des Feldes -
   nicht mittig zur ganzen Zelle. Die traegt unter dem Feld noch Hinweise und
   waere sonst mal zwei, mal vier Zeilen hoch, und die Beschriftung wanderte
   mit. 44px ist die Hoehe von .form-input. */
.medien-zeile__name { font-size: 13.5px; color: var(--text-muted); min-height: 44px; display: flex; align-items: center; }
.medien-zeile__tat { display: flex; align-items: center; min-height: 44px; }
.medien-zeile__knopf { white-space: nowrap; }
.medien-zeile__wert { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.medien-zeile__wert .form-hint:empty { display: none; }

/* Schmale Geraete: Aus der Tabelle werden Bloecke. Reihenfolge dort wie
   gezeichnet - Name, Feld, Knopf: Auf dem Handy liest man von oben nach
   unten, und der Knopf ist der letzte Schritt. */
@media (max-width: 760px) {
  .medien-tabelle { display: block; }
  .medien-zeile { display: grid; gap: 6px; }
  .medien-zeile + .medien-zeile { margin-top: var(--s-4); }
  .medien-zeile__name { order: 1; min-height: 0; }
  .medien-zeile__wert { order: 2; }
  .medien-zeile__tat { order: 3; min-height: 0; }
  .medien-zeile__knopf { width: 100%; }
}

.form-toggle { flex-direction: row; align-items: center; justify-content: space-between; gap: var(--s-4); }

.form-actions { display: flex; gap: var(--s-3); margin-top: var(--s-6); }

@media (max-width: 640px) { .form-grid { grid-template-columns: minmax(0, 1fr); } }

/* =========================================================================
   ADMIN — Tabellen / Matrix (dunkler Glas-Stil, dezente Trennlinien).
   Wiederverwendbar für Academy-Stats, Support, Rollen-Matrix.
   ========================================================================= */
.table-wrap { width: 100%; overflow-x: auto; }         /* horizontal scrollbar auf Mobile */
.dtable { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.dtable th, .dtable td {
  text-align: left; padding: var(--s-3) var(--s-4);
  border-bottom: 1px solid rgba(255,255,255,0.06);
  white-space: nowrap;
}
.dtable thead th {
  font-size: 11.5px; font-weight: 600; letter-spacing: .4px; text-transform: uppercase;
  color: var(--text-faint); border-bottom: 1px solid var(--border);
}
.dtable tbody tr { transition: background .15s ease; }
.dtable tbody tr:hover { background: rgba(255,255,255,0.03); }
.dtable tbody tr:last-child td { border-bottom: none; }
.dtable td.num, .dtable th.num { text-align: right; font-variant-numeric: tabular-nums; }
.dtable td.center, .dtable th.center { text-align: center; }
.dtable .t-title { font-weight: 600; color: var(--text); white-space: normal; }
.dtable .t-actions { display: flex; gap: var(--s-2); justify-content: flex-end; }

/* Mini-Fortschrittsbalken in Zellen (z.B. Abschlussquote / Ø-Sehdauer) */
.cell-bar { display: flex; align-items: center; gap: var(--s-3); min-width: 140px; }
.cell-bar__track { flex: 1; height: 6px; border-radius: var(--r-pill); background: rgba(255,255,255,0.07); overflow: hidden; }
.cell-bar__fill { height: 100%; border-radius: var(--r-pill); background: var(--accent); }
.cell-bar__val { font-size: 12.5px; color: var(--text-muted); min-width: 34px; text-align: right; }

/* Matrix: Häkchen/Kreuz-Zellen (Rolle × Berechtigung) */
.mx-yes { color: var(--green); }
.mx-no  { color: var(--text-faint); }
.mx-yes svg, .mx-no svg { width: 16px; height: 16px; }

/* Filter-/Kategorie-Chips */
.chip-bar { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-bottom: var(--s-5); }
.chip {
  font-size: 12.5px; font-weight: 500; padding: 6px 13px; border-radius: var(--r-pill);
  border: 1px solid var(--border); background: rgba(255,255,255,0.03); color: var(--text-muted);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.chip:hover { background: var(--card-hover); color: var(--text); }
.chip.is-active { background: var(--accent-soft); border-color: var(--accent-line); color: var(--accent); }

/* Rollen-Badge (mehrere Farben zur Unterscheidung) */
.role-badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 600; padding: 4px 10px; border-radius: var(--r-pill);
  border: 1px solid var(--accent-line); background: var(--accent-soft); color: var(--accent);
  white-space: nowrap;
}
.role-badge.is-support { border-color: rgba(34,197,94,0.35); background: var(--green-soft); color: var(--green); }
.role-badge.is-content { border-color: rgba(245,158,11,0.35); background: rgba(245,158,11,0.12); color: #f5a623; }

/* Aktivitäts-/Änderungsprotokoll (Liste) */
.log-list { display: flex; flex-direction: column; }
.log-item {
  display: flex; gap: var(--s-3); align-items: flex-start;
  padding: var(--s-3) 0; border-top: 1px solid rgba(255,255,255,0.06);
}
.log-item:first-child { border-top: none; }
.log-item__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); margin-top: 6px; flex-shrink: 0; box-shadow: 0 0 0 3px var(--accent-glow); }
.log-item__body { flex: 1; min-width: 0; font-size: 13px; }
.log-item__body strong { color: var(--text); font-weight: 600; }
.log-item__time { font-size: 11.5px; color: var(--text-faint); flex-shrink: 0; }

/* Ticket-Status-Varianten (Support) — nutzen die .status-badge-Basis */
.status-badge.is-open     { color: var(--accent); background: var(--accent-soft); border-color: var(--accent-line); }
.status-badge.is-open .dot     { background: var(--accent); }
.status-badge.is-progress { color: #f5a623; background: rgba(245,158,11,0.12); border-color: rgba(245,158,11,0.35); }
.status-badge.is-progress .dot { background: #f5a623; }
.status-badge.is-solved   { color: var(--green); background: var(--green-soft); border-color: rgba(34,197,94,0.35); }
.status-badge.is-solved .dot   { background: var(--green); }

/* =========================================================================
   PROFIL-POPUP (Account-Dropdown) — gleicher Glas-Hintergrund/Blur wie die
   Cards (blickdicht/substanziell), ABER OHNE diagonalen Eck-Glanz.
   Grundrand bleibt zur sauberen Abgrenzung.
   ========================================================================= */
.theme-glass .account__menu {
  /* justierbar: --popup-bg (Deckkraft/blickdicht) · --popup-blur (Blur-Stärke) */
  --popup-bg:   rgba(18, 18, 26, 0.92);   /* kräftig & blickdicht (höher = undurchsichtiger) */
  --popup-blur: 60px;                     /* deutlich stärkerer Blur als die Cards */
  background: var(--popup-bg);
  -webkit-backdrop-filter: blur(var(--popup-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  backdrop-filter: blur(var(--popup-blur)) saturate(var(--glass-saturate)) brightness(var(--glass-bright));
  border: 1px solid var(--glass-border);
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth);
}

/* =========================================================================
   REWARDS — Schwellen-Hinweis + MILESTONES (Badges nach Kategorien).
   Badges als CSS-Hexagone (konsistent mit den Status-Wappen), Glas-Design.
   ========================================================================= */
.rank-hint { font-size: 13px; color: var(--text-muted); text-align: center; margin: var(--s-4) 0 0; }
.rank-hint strong { color: var(--text); font-weight: 600; }

.ms-head { margin-top: var(--s-10); margin-bottom: var(--s-5); }
.ms-sub { font-size: 14px; color: var(--text-muted); margin: 0; }

/* Gesamt-Fortschritt */
.ms-overall { margin-bottom: var(--s-5); }
.ms-overall__row { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: var(--s-3); }
.ms-overall__label { font-size: 14px; color: var(--text-muted); }
.ms-overall__label strong { color: var(--text); font-weight: 700; }
.ms-overall__pct { font-size: 15px; font-weight: 700; color: var(--accent); }

/* Kategorie-Block */
.ms-cat { margin-bottom: var(--s-5); }
.ms-cat__head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--s-4); margin-bottom: var(--s-3); }
.ms-cat__name { font-size: 12px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase; color: var(--accent); margin: 0 0 4px; }
.ms-cat__value { font-size: 14px; color: var(--text-muted); margin: 0; }
.ms-cat__value strong { color: var(--text); font-weight: 700; }
.ms-cat__count { font-size: 12.5px; font-weight: 600; color: var(--text-muted); white-space: nowrap; }
.ms-cat__next { font-size: 12.5px; color: var(--text-muted); margin: var(--s-3) 0 0; }
.ms-cat__next strong { color: var(--text); font-weight: 600; }
.ms-xp {
  display: inline-block; margin-left: 6px; font-size: 11px; font-weight: 700;
  color: var(--accent); border: 1px solid var(--accent-line); background: var(--accent-soft);
  padding: 1px 8px; border-radius: var(--r-pill);
}

/* Badge-Reihe */
.ms-badges { display: grid; grid-template-columns: repeat(7, 1fr); gap: var(--s-3); margin-top: var(--s-5); }
.ms-badge {
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--s-2);
  padding: var(--s-4) var(--s-2);
  border: 1px solid var(--border); border-radius: 14px;
  background: rgba(255,255,255,0.025);
}
.ms-badge__hex {
  position: relative; width: 52px; height: 58px; flex-shrink: 0;
  display: grid; place-items: center; color: #fff;
  clip-path: polygon(50% 0, 100% 25%, 100% 75%, 50% 100%, 0 75%, 0 25%);
  background: var(--accent-gradient, linear-gradient(135deg, #7f3ffb, #f94e33));
  filter: drop-shadow(0 4px 10px rgba(0,0,0,0.45));
}
.ms-badge__hex > svg:first-child { width: 24px; height: 24px; }
.ms-badge__check {
  position: absolute; top: -4px; right: -4px;
  width: 20px; height: 20px; border-radius: 50%;
  display: grid; place-items: center; color: #fff;
  background: var(--green); border: 2px solid #12121a;
}
.ms-badge__check svg { width: 11px; height: 11px; }
.ms-badge__name { font-size: 13px; font-weight: 600; margin: 4px 0 0; }
.ms-badge__thresh { font-size: 12px; color: var(--text-muted); margin: 0; }

/* nicht erreicht → gedimmt + entfärbtes Badge */
.ms-badge.is-locked { opacity: .5; }
.ms-badge.is-locked .ms-badge__hex {
  background: linear-gradient(160deg, #2b2b34, #17171d);
  color: var(--text-faint);
  filter: drop-shadow(0 3px 8px rgba(0,0,0,0.4));
}
.ms-badge.is-unlocked { border-color: var(--accent-line); background: var(--accent-soft); }

@media (max-width: 760px) { .ms-badges { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 480px) { .ms-badges { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* =========================================================================
   SPRACHUMSCHALTER (Header) — nutzt das .account-Dropdown-Muster.
   ========================================================================= */
.lang__btn { gap: 7px; padding: 6px 10px; border: 1px solid var(--border); border-radius: var(--r-item); }
.lang__btn:hover { background: var(--card-hover); }
.lang__flag { font-size: 15px; line-height: 1; }
.lang__code { font-size: 12.5px; font-weight: 600; color: var(--text-muted); }
.lang .account__chev { width: 15px; height: 15px; }
.lang__menu { min-width: 190px; }
.lang__menu .menu-item { gap: var(--s-3); }
.lang__menu .menu-item .lang__code { margin-left: auto; }
.lang__menu .menu-item.is-active { color: var(--accent); background: var(--accent-soft); }
@media (max-width: 640px) { .lang__code { display: none; } .lang__btn { padding: 6px 8px; } }

/* =========================================================================
   DASHBOARD — Portal-Raster: eine Box pro Sidebar-Navigationspunkt.
   ========================================================================= */
/* Zwei-Zeilen-Layout: 4 große Main-Cards oben, 8 kompakte Cards in EINER Reihe darunter. */
.nav-portal-main { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--s-4); margin-bottom: var(--s-4); }
.nav-portal-rest { display: grid; grid-template-columns: repeat(6, 1fr); gap: var(--s-3); }

/* Main-Cards: größer/prominenter (mehr Höhe, größeres Icon/Titel) */
.nav-portal-main .portal-tile { padding: var(--s-6); min-height: 104px; gap: 10px; }
.nav-portal-main .portal-tile__icon { width: 44px; height: 44px; }
.nav-portal-main .portal-tile__icon svg { width: 22px; height: 22px; }
.nav-portal-main .portal-tile__title { font-size: 15.5px; }
.nav-portal-main .portal-tile__desc { font-size: 12px; }

/* Rest-Cards: kompakt, vertikal zentriert (Icon oben, Titel darunter), ohne Beschreibung */
.nav-portal-rest .portal-tile { padding: var(--s-3) var(--s-2); align-items: center; text-align: center; gap: 7px; }
.nav-portal-rest .portal-tile__head { flex-direction: column; gap: 7px; }
.nav-portal-rest .portal-tile__icon { width: 34px; height: 34px; }
.nav-portal-rest .portal-tile__title { font-size: 11.5px; line-height: 1.2; }
.nav-portal-rest .portal-tile__desc { display: none; }
.portal-tile {
  display: flex; flex-direction: column; gap: 7px;
  padding: var(--s-4);
}
/* Kopfzeile der Kachel: Icon links, Titel direkt daneben (horizontal). */
.portal-tile__head { display: flex; align-items: center; gap: 9px; }
.portal-tile__icon {
  flex: none;
  width: 34px; height: 34px; border-radius: 10px;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.portal-tile__icon svg { width: 18px; height: 18px; stroke-width: 1.8; }
.portal-tile__title { font-size: 13.5px; font-weight: 650; margin: 0; line-height: 1.25; }
.portal-tile__desc { font-size: 11.5px; color: var(--text-muted); margin: 0; line-height: 1.4; }

@media (max-width: 1100px) {
  .nav-portal-main { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nav-portal-rest { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
  .nav-portal-main { grid-template-columns: minmax(0, 1fr); }
  .nav-portal-rest { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* =========================================================================
   LIVE SESSIONS · EBENE 1 — drei große Kategorie-Kacheln (Trading/UGC/Mindset)
   ========================================================================= */
.cat-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--s-6);
}
.cat-tile {
  display: flex; flex-direction: column;
  align-items: flex-start;
  gap: var(--s-3);
  min-height: 300px;
  padding: var(--s-8);
}
/* Icon-Box EXAKT wie bei Trading Ideas (.join-card__icon): gleiche Maße,
   gleicher Gradient (via .theme-glass-Sammelregel), gleicher Glow. Nur linksbündig
   statt zentriert (margin-bottom statt auto). KEIN eigener Hover-Effekt. */
.cat-tile__icon {
  width: 64px; height: 64px; border-radius: 18px;
  display: grid; place-items: center;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  box-shadow: 0 0 50px var(--accent-glow);
  margin-bottom: var(--s-2);
}
.cat-tile__icon svg { width: 32px; height: 32px; }
.cat-tile__title { font-size: 22px; font-weight: 700; letter-spacing: -.3px; color: var(--text); }
.cat-tile__desc { font-size: 13.5px; color: var(--text-muted); line-height: 1.6; }
.cat-tile__cta {
  margin-top: auto;
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 13.5px; font-weight: 600; color: var(--accent);
  transition: gap .2s ease;
}
.cat-tile__cta svg { width: 17px; height: 17px; }
.cat-tile.card--hover:hover .cat-tile__cta { gap: 12px; }
/* Icons haben bewusst KEINEN eigenen Hover-Effekt (nur der Card-Eck-Glanz reagiert). */

/* =========================================================================
   LIVE SESSIONS — Kategorie-Boxen (Inline-Variante) + Educator-Liste.
   Educator-Detailseite (Hero + Strategie-Videos). Alles theme-glass.
   ========================================================================= */

/* ---- Haupt-Tabs (Übersicht | Sessions Kalender) ---- */
.view-toggle--tabs { margin-bottom: var(--s-6); }
.view-toggle--tabs .view-toggle__btn { padding: 9px 18px; font-size: 13.5px; }

/* ---- Kategorie-Boxen: Trading | UGC ---- */
.cat-select {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--s-5);
  margin-bottom: var(--s-7);
}
.cat-card {
  display: flex; align-items: center; gap: var(--s-4);
  padding: var(--s-5);
  text-align: left;
  cursor: pointer;
}
.cat-card__icon {
  flex: none;
  width: 48px; height: 48px; border-radius: 13px;
  display: grid; place-items: center;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
}
.cat-card__icon svg { width: 24px; height: 24px; stroke-width: 1.8; }
.cat-card__text { display: flex; flex-direction: column; gap: 3px; }
.cat-card__title { font-size: 16px; font-weight: 650; color: var(--text); }
.cat-card__desc { font-size: 12.5px; color: var(--text-muted); }

/* aktive Kategorie: lila/oranger Eck-Glanz + Akzent-Icon-Box */
.theme-glass .cat-card.is-active::before {
  --glow-a: 26%; --glow-b: 74%;
  --corner-tl: #7f44f4;
  --corner-br: #ef4f3c;
}
.theme-glass .cat-card.is-active {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 26px var(--accent-glow);
}
.cat-card.is-active .cat-card__icon {
  color: #fff;
  background: var(--accent-gradient);
  border-color: transparent;
}

/* ---- Educator-Liste ---- */
.edu-section__title {
  font-size: 15px; font-weight: 650; color: var(--text);
  margin: 0 0 var(--s-4);
}
/* Cards NEBENEINANDER in einer Reihe (flex row), gleichmäßige Abstände.
   Auf schmalen Screens brechen sie um / stapeln (flex-wrap). */
.edu-grid {
  display: flex; flex-direction: row; flex-wrap: wrap;
  align-items: stretch; gap: var(--s-5);
  width: 100%;
}

/* Innerer Aufbau je Card: Icon oben (zentriert) → Name → Strategie. */
.edu-card {
  flex: 1 1 220px; min-width: 0;
  display: flex; flex-direction: column; align-items: center;
  text-align: center; gap: var(--s-3);
  padding: var(--s-6) var(--s-5);
}
.edu-card__media { flex: none; }
.edu-card__img {
  width: 100%; height: 100%; border-radius: 10px;
  object-fit: cover; display: block;
  border: 1px solid rgba(255,255,255,0.14);
  box-shadow: 0 8px 24px rgba(0,0,0,0.35);
}
.edu-card__body { display: flex; flex-direction: column; align-items: center; gap: 5px; min-width: 0; }
.edu-card__name { font-size: 19px; font-weight: 700; letter-spacing: -.2px; color: var(--text); }
.edu-card__strategy { font-size: 13px; color: var(--text-muted); }
/* Pfeil entfällt im vertikalen, zentrierten Layout. */
.edu-card__arrow { display: none; }

/* =========================================================================
   EDUCATOR-DETAILSEITE
   ========================================================================= */

/* ---- HERO — betonter Container: kräftigerer Glas-Look + lila/oranger Schimmer ---- */
.edu-hero {
  position: relative;
  overflow: hidden;
  padding: var(--s-8);
  /* gleicher vertikaler Abstand oben (zum Educator-Titel) wie unten (zur
     "Einarbeitung"-Sektion) — konsistent auf beiden Seiten der Box. */
  margin-top: var(--s-8);
  margin-bottom: var(--s-8);
}
/* betonter Eck-Glanz in Educator-Farbe (dezent) im Ruhezustand; Akzent-Fallback */
.theme-glass .edu-hero::before {
  --glow-a: 22%; --glow-b: 78%;
  --corner-tl: color-mix(in srgb, var(--edu, #7f44f4) 85%, transparent);
  --corner-br: color-mix(in srgb, var(--edu, #7f44f4) 55%, transparent);
}
.theme-glass .edu-hero {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 40px color-mix(in srgb, var(--edu, #7f44f4) 18%, transparent);
}
/* dezenter diagonaler lila/orange Schimmer im Hintergrund des Containers */
.edu-hero__glow {
  position: absolute; inset: 0;
  border-radius: inherit;
  pointer-events: none;
  z-index: 0;
  background:
    radial-gradient(120% 80% at 0% 0%, rgba(127,68,244,0.22), transparent 55%),
    radial-gradient(120% 80% at 100% 100%, rgba(239,79,60,0.18), transparent 55%);
}
.edu-hero > *:not(.edu-hero__glow) { position: relative; z-index: 1; }

.edu-hero__profile {
  display: flex; align-items: center; gap: var(--s-6);
  margin-bottom: var(--s-6);
}
.edu-hero__portrait { flex: none; }
.edu-hero__portrait img {
  width: 104px; height: 104px; border-radius: 20px;
  object-fit: cover; display: block;
  border: 1px solid rgba(255,255,255,0.14);
  box-shadow: 0 8px 24px rgba(0,0,0,0.35);
}
.edu-hero__info { min-width: 0; }
.edu-hero__cat {
  display: inline-block;
  font-size: 11px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase;
  color: #fff;
  background: var(--accent-gradient);
  padding: 4px 11px; border-radius: var(--r-pill);
  margin-bottom: var(--s-3);
}
.edu-hero__name { font-size: 30px; font-weight: 700; letter-spacing: -.4px; margin: 0 0 4px; }
.edu-hero__strategy { font-size: 15px; font-weight: 600; color: var(--accent); margin: 0 0 var(--s-3); }
.edu-hero__text { font-size: 14px; color: var(--text-muted); line-height: 1.65; margin: 0; max-width: 68ch; }

/* AUF TELEFON UND TABLET IST WIEDER ALLES BENUTZBAR (23.08.2026).

   HIER STAND DAS GEGENTEIL, und es hatte seinen Grund. Am 09.08.2026 hiess
   es: "Macht es so, dass nur Live-Sessions und Dashboard angezeigt werden
   koennen ... Die ganzen Sachen, die geblurred sind, einfach mal: Coming
   Soon for the Mobile." Der Mitgliederbereich war auf dem Telefon damals
   nicht zu gebrauchen - Tabellen rollten seitlich, Raster quetschten sich.
   Statt ihn zu reparieren, wurde er zugesperrt.

   AM 23.08.2026 IST ER REPARIERT (siehe den Mobil-Block am Dateiende), und
   die Sperre wurde zum eigentlichen Fehler:

     "Ich kann in der Mobilresponsive noch immer keine weiteren Bereiche
      auswaehlen ... Zwischendurch auch die Sprache kann ich gar nicht
      einstellen ... Auf mein Konto kann ich auch nicht gehen."

   ALLE DREI KAMEN AUS DERSELBEN REGEL. Sie blendete jeden Navigationseintrag
   ausser Dashboard und Live Sessions ab - und mit
   ".account__menu .menu-item" auch das Konto-Menue. Die Sprachwahl benutzt
   dieselbe Klasse fuer ihre Eintraege und fiel still mit darunter; das war
   damals niemandem aufgefallen, weil niemand danach gesucht hat.

   WAS DAVON BLEIBT: nichts. Kein pointer-events, kein Abblenden, kein
   Hinweis "nur am Rechner". Das Datenattribut data-mobil steht noch an zwei
   Eintraegen im Markup - es kostet keine Klasse und stoert keinen Waechter;
   wer es aufraeumt, nimmt es dort mit heraus.

   MobilTest haelt fest, dass diese Sperre nicht zurueckkehrt. */

/* ---- Live-Session-Leiste: Countdown + Zoom-Button ---- */
.edu-live {
  display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-5);
  padding: var(--s-5);
  border-radius: 16px;
  background: rgba(255,255,255,0.05);
  border: 1px solid rgba(255,255,255,0.10);
}
.edu-live__lead { flex: 1; min-width: 200px; }
.edu-live__badge {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 11px; font-weight: 600; letter-spacing: .4px; text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 6px;
}
/* Wird wirklich gesendet, wechselt die Plakette auf Rot und der Punkt
   pulsiert. EINE Aussage an EINER Stelle - vorher stand hier immer "Naechste
   Live Session", und die Ueberschrift darunter behauptete "laeuft jetzt",
   sobald die Uhrzeit passte. */
.edu-live__badge.is-live { color: var(--red); }
.edu-live__badge.is-live .dot {
  background: var(--red); box-shadow: 0 0 0 0 rgba(255,59,48,0.6);
  animation: livePuls 1.8s ease-out infinite;
}
@keyframes livePuls {
  70% { box-shadow: 0 0 0 8px rgba(255,59,48,0); }
  100% { box-shadow: 0 0 0 0 rgba(255,59,48,0); }
}
/* Ohne Bewegung bleibt die Aussage dieselbe - sie haengt an Farbe und Text,
   nicht am Pulsieren. */
@media (prefers-reduced-motion: reduce) { .edu-live__badge.is-live .dot { animation: none; } }
.edu-live__badge .dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 10px var(--accent-glow);
}
.edu-live__label { font-size: 17px; font-weight: 650; color: var(--text); margin: 0 0 5px; }
.edu-live__meta {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12.5px; color: var(--text-muted); margin: 0;
}
.edu-live__meta svg { width: 15px; height: 15px; stroke-width: 1.8; color: var(--accent); }

/* Countdown-Anzeige */
.edu-live__count { display: flex; align-items: center; gap: 8px; }
.cd { display: flex; flex-direction: column; align-items: center; min-width: 52px;
  padding: 8px 6px; border-radius: 12px;
  background: rgba(0,0,0,0.35); border: 1px solid rgba(255,255,255,0.08); }
.cd__num { font-size: 24px; font-weight: 700; line-height: 1; color: var(--text); font-variant-numeric: tabular-nums; }
.cd__lbl { font-size: 9.5px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase; color: var(--text-faint); margin-top: 4px; }
.cd__sep { font-size: 22px; font-weight: 700; color: var(--text-faint); }

.edu-live__btn { flex: none; }
/* Das Formular um „In der Zoom-App starten“ soll sich verhalten wie der Knopf
   daneben – ohne dieses display bekäme es die volle Breite der Zeile und
   schöbe den Startknopf um. */
.edu-live__form { display: contents; }

/* DIE STEUERUNG DES EDUCATORS - Zustand und Knoepfe nebeneinander. */
.edu-live__steuerung { display: flex; align-items: center; gap: var(--s-4); flex-wrap: wrap; }
.edu-live__zustand {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12.5px; font-weight: 700; letter-spacing: .3px; text-transform: uppercase;
  color: #f87171;
}
.edu-live__zustand::before {
  content: ""; width: 8px; height: 8px; border-radius: 50%;
  background: currentColor;
}
.edu-live__btn svg { width: 17px; height: 17px; }

/* ---- Session links, Educator rechts ----

   BETREIBERANSAGE vom 08.08.2026: "Das Video auf der linken Seite, so wie bei
   YouTube. Ganz oben an der oberen Kante vom Video faengt der Name mit der
   Kategorie an, und unten der Benachrichtigungsknopf auch buendig auf."

   ALS RASTER, NICHT ALS FLEX-ZEILE: Nur so bekommt die rechte Spalte die
   Hoehe der linken vorgegeben. Mit flex richtete sie sich nach ihrem eigenen
   Inhalt, und die Unterkanten lagen je nach Laenge der Notiz woanders. */
/* VIER FUENFTEL FUER DAS VIDEO.

   BETREIBERANSAGE vom 08.08.2026: "Ich moechte es so machen, dass das Video
   links 80 % vom ganzen Bereich einnimmt."

   Als Anteil, nicht als feste Pixelzahl - sonst waere die rechte Spalte auf
   einem breiten Monitor ein Streifen und auf einem kleinen die halbe Seite.
   Die Untergrenze haelt sie beisammen: Darunter bricht "Erhalte
   Benachrichtigungen zu Live Sessions und Educator" auf sechs Zeilen um. */
.edu-split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(230px, 20%);
  gap: var(--s-6);
  margin-bottom: var(--s-8);
  /* AUSDRUECKLICH, NICHT AUS VERSEHEN: Beide Spalten bekommen dieselbe Hoehe
     und schliessen oben wie unten buendig ab - BETREIBERANSAGE vom
     08.08.2026: "Neben dem Video ist alles uneben, das passt nicht
     zusammen." Steht hier ein anderer Wert, wandern die Unterkanten
     auseinander, sobald die Notiz einmal laenger ist. */
  align-items: stretch;
}
/* 16:9 WIE BEI YOUTUBE, nicht als feste Pixelhoehe.

   BETREIBERENTSCHEIDUNG vom 08.08.2026: "Go mit dem Verhaeltnis, wie es
   YouTube macht." Eine feste Hoehe (520px) waere auf einem breiten Monitor
   ein Briefschlitz und auf einem Laptop die halbe Seite, bevor man ueberhaupt
   zu den Videos scrollt. So richtet sich die Hoehe nach der Breite.

   height:auto laesst den Kasten trotzdem wachsen, wenn der Inhalt mehr
   braucht - aspect-ratio ist dann nur die Untergrenze. Ohne das schnitte eine
   lange Sessionzeile unten ab. */
.edu-split__main {
  min-width: 0;
  /* DIE BREITE KOMMT AUS DER SPALTE, DIE HOEHE AUS DEM VERHAELTNIS.

     BETREIBERBILD vom 11.08.2026: "Das Design wurde noch immer nicht gefixt.
     Es ist jetzt wieder ab und zu breit." Die Karte schob sich ueber die
     rechte Spalte, und zwar mal ja, mal nein.

     DAS "AB UND ZU" WAR DIE SPUR: Es haengt daran, wie lang die
     Educator-Note gerade ist. Ist sie laenger als die Videoflaeche, wird die
     rechte Spalte hoeher - und weil beide Spalten buendig abschliessen
     sollen (align-items: stretch), zieht sie die linke mit. Damit hat die
     Karte auf einmal eine feste Hoehe, und der Browser rechnet aus 16/9 die
     BREITE aus statt der Hoehe. Ergebnis: breiter als ihre Bahn.

     width: 100% macht die Breite eindeutig. Danach kann aspect-ratio nur
     noch in die gemeinte Richtung rechnen, und die gestreckte Hoehe laesst
     die Karte einfach hoeher werden - was sie soll.

     MEINE ERSTE KORREKTUR (min-width am Nachbarn, Umbruch langer Adressen)
     war richtig und nicht die Ursache. Sie hat einen zweiten Fehler behoben,
     der zufaellig gleichzeitig sichtbar wurde. */
  width: 100%;
  aspect-ratio: 16 / 9;
  height: auto;
  display: flex; flex-direction: column; gap: var(--s-5);
}

/* Beide Zustaende fuellen dieselbe Flaeche - es steht immer nur einer da.
   Vorher klebte der Countdown oben und darunter war toter Raum.

   MITTIG IN BEIDE RICHTUNGEN. BETREIBERANSAGE vom 08.08.2026: "Dass dieser
   Badge mit der Countdownflaeche zentriert ist im Video." Ohne
   justify-content sass die Leiste links und lief rechts ins Leere - ein
   flex-Kind nimmt in der Hauptachse nur die Breite seines Inhalts. */
.edu-split__main > .edu-hero {
  flex: 1 1 auto;
  display: flex; align-items: center; justify-content: center;
  /* BEIDE RAENDER, NICHT NUR UNTEN. Beim ersten Anlauf stand hier nur
     margin-bottom - das margin-top von --s-8 aus der Basisregel blieb stehen
     und schob die Videoflaeche genau eine Stufe tiefer als die rechte Spalte.
     BETREIBERANSAGE vom 08.08.2026: "Das Badge soll genau da anfangen, wo das
     Video anfaengt, von der Hoehe her." */
  margin-top: 0; margin-bottom: 0;
}
.edu-split__main > .edu-hero .edu-live {
  width: 100%; max-width: 720px;
  justify-content: center;
}
.edu-split__main > .edu-zoom {
  flex: 1 1 auto; min-height: 0;
  position: relative;
  /* Kein Innenabstand: Das Bild soll die Kanten beruehren, oben wie unten. */
  padding: 0; margin-top: 0; overflow: hidden;
}
.edu-split__main > .edu-zoom .edu-zoom__buehne {
  position: absolute; inset: 0;
  min-height: 0; border-radius: 0;
}

/* Was vor der Buehne liegt, solange niemand beigetreten ist: Plakette,
   Sessionzeile, Beitritts-Knopf. Sobald das SDK laeuft, setzt zoom-session.js
   is-live - und die Ueberlagerung geht weg, statt ueber dem Bild zu haengen. */
.edu-zoom__davor {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--s-4);
  padding: var(--s-6);
  /* Ein Hauch Verlauf statt einer Flaeche: Der schwarze Grund allein wirkt
     wie ein Ladefehler. */
  background:
    radial-gradient(120% 90% at 50% 0%, rgba(127,68,244,0.18), transparent 60%),
    rgba(0,0,0,0.55);
}
.edu-zoom__davor .edu-live {
  width: 100%; max-width: 640px;
  justify-content: center;
  background: rgba(10,10,15,0.72);
  backdrop-filter: blur(6px);
}
.edu-zoom.is-live .edu-zoom__davor { display: none; }

/* DIE FLAECHE STEHT FEST, ZOOM PASST SICH HINEIN.

   BETREIBERANSAGE vom 09.08.2026: "Das Verhaeltnis vom Platzhalter soll nicht
   von der Groesse her veraendert werden." Und danach, nach zwei Anlaeufen mit
   Zooms Vollbild: "Go mit dem Platzhalter, der bleibt."

   ZWEI ANFORDERUNGEN, DIE SICH AUSSCHLIESSEN. Die Client View bringt die
   volle Oberflaeche mit Leiste, Eigenbild und Freigabe - sie will dafuer das
   ganze Fenster. Die Meetingansicht liess sich einsperren, ihr
   Vorschau-Bildschirm, ihre Dialoge und die Fusszeile nicht: Im Test lag ein
   grauer Bereich quer ueber der Akademie. Jedes davon einzeln einzufangen
   waere eine Liste, die bei jedem Zoom-Update neu bricht.

   Die eingebettete Ansicht braucht davon nichts - sie zeichnet von sich aus
   in das Element, das man ihr gibt. */

/* DER VOLLBILDKNOPF.

   BETREIBERANSAGE vom 09.08.2026: "Die Nutzer sollen den Platzhalter als
   Vollbild machen koennen, damit sie besser sehen."

   Er sitzt in der Ecke der Buehne und bleibt zurueckhaltend, bis man ihn
   sucht - waehrend einer Session soll die Aufmerksamkeit beim Educator sein,
   nicht bei unseren Bedienelementen. */
.edu-zoom__vollbild {
  position: absolute; top: 12px; right: 12px; z-index: 3;
  display: flex; align-items: center; justify-content: center;
  width: 34px; height: 34px;
  border: 1px solid rgba(255,255,255,0.14); border-radius: 9px;
  background: rgba(10,10,15,0.66); color: var(--text-muted);
  cursor: pointer; opacity: .55; transition: opacity .15s, color .15s;
}
.edu-zoom__vollbild:hover, .edu-zoom__vollbild:focus-visible { opacity: 1; color: #fff; }
.edu-zoom__vollbild svg { width: 16px; height: 16px; }

/* Im Vollbild verliert der Kasten sein Seitenverhaeltnis - er IST der
   Bildschirm. Ohne das blieben oben und unten Balken in Bildschirmfarbe. */
.edu-zoom.is-vollbild {
  aspect-ratio: auto; width: 100%; height: 100%;
  border-radius: 0; padding: 0;
}
.edu-zoom.is-vollbild .edu-zoom__buehne { border-radius: 0; }

/* WAEHREND DER GASTGEBER SENDET, TRITT DIE AKADEMIE ZURUECK.

   BETREIBERANSAGE vom 09.08.2026: "Es soll so aussehen, dass ich mich selber
   sehen kann, auch mit den Buttons."

   Die volle Zoom-Oberflaeche gibt es nur als Client View, und die will den
   ganzen Schirm. Beim ersten Versuch schien unsere Seite halb durch - Zooms
   Wurzelelement lag als Ueberlagerung darauf, und unsere Karte stand darueber.
   Der Betreiber sah einen grauen Bereich quer ueber der Akademie und kam an
   Zooms Join-Knopf nicht heran.

   VERSTECKEN, NICHT ENTFERNEN: Die Seite bleibt im Dokument stehen und ist
   nach dem Verlassen unveraendert da - mit Scrollstand, geoeffneten Reitern
   und allem. Ein Neuaufbau waere sichtbar und wuerde den Platz verlieren, an
   dem der Educator vorher war. */
body.zoom-vollbild > *:not(#zmmtg-root) { display: none !important; }
body.zoom-vollbild { overflow: hidden; background: #000; }

/* NACH DEM ENDE STEHT DA EIN SATZ, KEIN LOCH.
   BETREIBERANSAGE: "Wenn man die Session beendet hat, sieht man den schwarzen
   Platzhalter. Da soll stehen: die Session wurde gerade beendet." */
.edu-zoom__ende {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  padding: var(--s-6);
  text-align: center; font-size: 15px; color: var(--text-muted);
  background: rgba(0,0,0,0.55);
}
.edu-split__side {
  display: flex; flex-direction: column; gap: var(--s-5);
  /* Ohne min-height:0 waechst eine Rasterzelle mit ihrem Inhalt statt ihn zu
     begrenzen - die Notiz rollte dann nicht, sondern machte die Spalte
     laenger als das Video. */
  min-height: 0;
  /* UND min-width:0 AUS DEMSELBEN GRUND, nur in der anderen Richtung.

     BETREIBERBILD vom 11.08.2026: Die rechte Spalte schob sich ueber die
     Karte, die Educator-Note war rechts abgeschnitten, das Layout verrutscht.

     DER AUSLOESER STAND IN DER NOTIZ: eine Zoom-Adresse, in einem Stueck, ohne
     Leerzeichen. Ein Rasterkind darf von Haus aus nicht schmaler werden als
     sein Inhalt - also drueckte die Adresse die Spalte breiter als ihre Bahn,
     und das ganze Raster ging aus dem Leim.

     Die linke Spalte hatte das seit jeher; hier fehlte es. Ein Fehler, der
     erst auftritt, wenn jemand zum ersten Mal einen Link hineinschreibt. */
  min-width: 0;
}
/* Lange Adressen brechen um, statt zu schieben. Ohne das haelt min-width:0
   die Spalte zwar in ihrer Bahn - der Text liefe dann aber unsichtbar
   darueber hinaus. */
.edu-note__text, .edu-signup__title { overflow-wrap: anywhere; }
/* Der Kopfblock hat den Platz gewechselt, nicht das Aussehen. Nur der eigene
   Abstand nach unten faellt weg - hier setzt ihn das gap der Spalte. */
.edu-split__side .edu-head { margin-bottom: 0; flex-wrap: nowrap; gap: var(--s-4); }

/* KLEINER, WEIL DIE SPALTE SCHMAL IST.

   BETREIBERANSAGE vom 08.08.2026: "Der Name mit der Kategorie bitte kleiner
   machen, damit alles schoen reinpasst. Das ist ultra wichtig."

   In 20 % Breite brach "Ilija Zubiks" bei 28px auf zwei Zeilen und
   "Mindset · Trading Basic" gleich mit - vier Zeilen fuer zwei Angaben, und
   die Hoehe fehlte der Notiz darunter. Nur hier verkleinert: In der
   Kalenderansicht steht derselbe Block ueber die volle Breite und darf gross
   bleiben. */
/* RAHMEN UND INHALT ZUSAMMEN, sonst quillt es heraus.
   .edu-head__ini traegt eine eigene feste Groesse (88px). Beim ersten Anlauf
   habe ich nur den Rahmen verkleinert - der Initialen-Block blieb gross, ragte
   unten heraus und schob sich ueber die Educator Note. */
.edu-split__side .edu-head__frame { width: 60px; height: 60px; border-radius: 14px; padding: 4px; }
.edu-split__side .edu-head__ini {
  width: 100%; height: 100%;
  border-radius: 10px;
  font-size: 19px;
}
.edu-split__side .edu-head__img { border-radius: 10px; }
.edu-split__side .edu-head__cat {
  font-size: 9.5px; letter-spacing: .4px;
  padding: 3px 8px; margin-bottom: 6px;
}
.edu-split__side .edu-head__name { font-size: 18px; letter-spacing: -.2px; line-height: 1.2; }
.edu-split__side .edu-head__strategy { font-size: 12px; line-height: 1.35; }
.edu-split__side .edu-note,
.edu-split__side .edu-signup { max-width: none; align-self: auto; }

/* Die Notiz nimmt, was zwischen Kopf und Knopf uebrig bleibt. Schreibt der
   Educator drei Absaetze, rollt der Text darin - die Karte waechst nicht. */
/* SO HOCH WIE IHR TEXT, NICHT WIE DER PLATZ.

   BETREIBERANSAGE vom 08.08.2026: "Das Educator-Note-Feld darf generell
   kleiner werden." Vorher war die Notiz das mitwachsende Stueck der Spalte und
   sog die ganze Resthoehe auf - bei drei Zeilen Text stand da ein leerer
   Kasten von einem halben Bildschirm.

   Die Obergrenze faengt den anderen Fall ab: Schreibt der Educator einen
   Aufsatz, waechst die Karte nicht weiter, sondern man rollt darin. */
/* Sie reicht bis an die Benachrichtigungs-Karte heran - BETREIBERANSAGE vom
   08.08.2026: "Die Educator Note so weit nach unten ziehen, bis sie zu der
   Karte runtergeht, damit die rechte Seite gut gefuellt ist."
   Der Abstand dazwischen kommt aus dem gap der Spalte. */
/* min-height: 0 IST HIER DAS ENTSCHEIDENDE, nicht flex: 1 1 auto.

   BETREIBERBILD vom 11.08.2026: "Es ist jetzt wieder ab und zu breit."

   DIE KETTE, UND SIE IST DREIMAL DIESELBE SORTE FEHLER: Ein Flex-Kind darf
   von Haus aus nicht kleiner werden als sein Inhalt. Die Notiz konnte
   deshalb nicht schrumpfen, obwohl ihr Text darin rollen sollte - der
   overflow-y: auto eine Zeile tiefer kam nie zum Zug. Also wuchs die Karte
   mit dem Text, die rechte Spalte wurde hoeher als die Videoflaeche, die
   Rasterzeile zog die linke Spalte mit, und aus deren nun festen Hoehe
   rechnete der Browser ueber aspect-ratio die BREITE aus. Am Ende schob sich
   die Videokarte ueber die rechte Spalte.

   Vier Schritte von einer fehlenden Zeile bis zum verrutschten Layout - und
   sichtbar nur, wenn der Educator gerade eine lange Notiz geschrieben hat.
   Daher "ab und zu".

   Dieselbe Ursache wie beim min-width der Spalte daneben und beim Umbruch der
   langen Adresse: Raster- und Flex-Kinder muessen ausdruecklich klein werden
   duerfen. */
.edu-split__side .edu-note { flex: 1 1 auto; min-height: 0; max-height: none; }
.edu-split__side .edu-note__body { min-height: 0; }
.edu-split__side .edu-note__text { overflow-y: auto; min-height: 0; }

/* Der Knopf bleibt unten buendig mit der Videokante - die frei gewordene
   Hoehe wird zu Luft zwischen Notiz und Knopf, nicht zu einem leeren Feld. */
.edu-split__side .edu-signup { flex: none; margin-top: auto; }

@media (max-width: 1100px) {
  /* Untereinander. Die Hoehenbindung faellt damit weg, also auch der
     Rollbereich - die Notiz darf hier so lang werden, wie sie ist. */
  .edu-split { grid-template-columns: minmax(0, 1fr); }
  .edu-split__side .edu-note { flex: none; max-height: none; }
  .edu-split__side .edu-note__text { overflow-y: visible; }
  /* Untereinander gibt es keine Unterkante, an der etwas buendig sitzen
     koennte - der Knopf folgt einfach der Notiz. */
  .edu-split__side .edu-signup { margin-top: 0; }
}

/* ---- Die Session selbst, eingebettet in der Seite ----

   Die Buehne ist leer, bis jemand beitritt - das Zoom-SDK haengt sein
   eigenes Geruest hinein. Deshalb steht die Hoehe hier und nicht dort:
   Ohne sie waere der Kasten null Pixel hoch, das SDK zeichnete in nichts
   hinein, und man saehe eine leere Seite statt der Session. */
.edu-zoom { padding: var(--s-5); margin-top: var(--s-5); }
.edu-zoom__buehne {
  min-height: 520px;
  border-radius: 14px;
  overflow: hidden;
  background: #000;
}
/* Zoom setzt eigene Farben in sein Geruest - der schwarze Grund darunter
   verhindert das kurze weisse Aufblitzen beim Beitreten. */
.edu-zoom__buehne:empty { background: rgba(255,255,255,0.04); }
.edu-zoom__status {
  margin: var(--s-4) 0 0;
  font-size: 13.5px;
  color: var(--text-muted);
  text-align: center;
  min-height: 20px;
}
.edu-zoom__status:empty { display: none; }

@media (max-width: 720px) {
  .edu-zoom__buehne { min-height: 360px; }
}

/* ---- Strategie-Videos ---- */
.edu-videos__head { margin-bottom: var(--s-5); }

/* Das ausgeblendete Feld traegt hidden, nicht display:none.

   BETREIBERANSAGE vom 08.08.2026: "Die Beschreibung muss hoeher, am besten
   direkt unter dem Schalter mit ein bisschen Abstand. Dann kommen die
   Videos." Vorher stand ueber ihr eine ganze Stufe Leerraum und unter ihr
   fast keiner - sie klebte auf den Kacheln statt zum Umschalter zu gehoeren. */
.edu-videos .view-toggle--tabs { margin-bottom: var(--s-4); }
.edu-videos__panel { margin-top: 0; }
.edu-videos__panel > .edu-videos__sub { margin: 0 0 var(--s-5); }
.edu-videos__leer {
  /* --s-6, nicht --s-7: Letztere ist im Wurzelblock nicht definiert. Ein
     padding mit einem leeren var() ist ungueltig und faellt komplett weg -
     der Kasten haette dann gar keinen Innenabstand. */
  margin: 0; padding: var(--s-6) var(--s-5);
  text-align: center; font-size: 13.5px; color: var(--text-faint);
  border: 1px dashed rgba(255,255,255,0.12); border-radius: 14px;
}
.edu-videos__title { font-size: 20px; font-weight: 700; letter-spacing: -.3px; margin: 0 0 4px; }
.edu-videos__sub { font-size: 13.5px; color: var(--text-muted); margin: 0; }

.vid-card { display: flex; flex-direction: column; padding: 0; overflow: hidden; }
.vid-card__thumb {
  position: relative; display: block;
  aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: 16px 16px 0 0;
}
.vid-card__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .3s ease; }
.vid-card.card--hover:hover .vid-card__thumb img { transform: scale(1.05); }
.vid-card__play {
  position: absolute; inset: 0; margin: auto;
  width: 52px; height: 52px; border-radius: 50%;
  display: grid; place-items: center;
  color: #fff;
  background: rgba(10,10,15,0.55);
  border: 1px solid rgba(255,255,255,0.25);
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  transition: background .2s ease, transform .2s ease;
}
.vid-card__play svg { width: 22px; height: 22px; margin-left: 2px; }
.vid-card.card--hover:hover .vid-card__play { background: var(--accent); transform: scale(1.06); }
.vid-card__dur {
  position: absolute; right: 8px; bottom: 8px;
  font-size: 11px; font-weight: 600; color: #fff;
  background: rgba(0,0,0,0.65);
  padding: 2px 7px; border-radius: 6px;
}
.vid-card__body { display: flex; flex-direction: column; gap: 4px; padding: var(--s-4); }
.vid-card__title { font-size: 14px; font-weight: 650; color: var(--text); line-height: 1.35; }
.vid-card__meta { font-size: 12px; color: var(--text-muted); }

/* =========================================================================
   EDUCATOR-DETAILSEITE · KOPFZEILE — links "Zurück", rechts die Tabs (eine Zeile).
   ========================================================================= */
.edu-topbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-4);
  /* DER EINZIGE HEBEL FUER DEN ABSTAND NACH OBEN.
     Er schiebt beide Spalten gemeinsam - schoebe man stattdessen die
     Videokarte einzeln, staenden ihre Oberkante und die der rechten Spalte
     sofort wieder versetzt.

     Erst gekuerzt auf --s-3 ("Das Video soll so weit oben sein wie es geht"),
     dann wieder angehoben: Zusammen mit dem entfernten oberen Rand der Karte
     war es eine Stufe zu viel und klebte am Ruecklink. */
  margin-bottom: var(--s-6);
}
.edu-topbar .back-link { margin-bottom: 0; }
.edu-topbar .view-toggle--tabs { margin-bottom: 0; }

/* Session-Kalender-Tab: (1) gleicher oberer Abstand wie im Übersicht-Tab
   (edu-hero), damit der Toggle/Kalender nicht am Educator-Kopf + den Tabs klebt. */
[data-edu-panel="calendar"] { margin-top: var(--s-8); }
/* (3) rechte Spalte ("Heutige Sessions") oben bündig mit dem Kalender: kein
   Sticky-Versatz in diesem Kontext (Announcements-Seite behält ihr Sticky). */
[data-edu-panel="calendar"] .ann-today { position: static; top: auto; }

/* KOPF — Bild, Name, Strategie. Abstand nach unten zur folgenden Box/Inhalten. */
.edu-head {
  display: flex; align-items: stretch; gap: var(--s-5);   /* Kinder auf gleiche Höhe strecken */
  margin-bottom: var(--s-7);
}
.edu-head__portrait { flex: none; display: flex; align-items: center; }   /* Bild vertikal zentriert trotz stretch */
.edu-head__portrait img {
  width: 88px; height: 88px; border-radius: 18px;
  object-fit: cover; display: block;
  border: 1px solid rgba(255,255,255,0.14);
  box-shadow: 0 8px 24px rgba(0,0,0,0.35);
}
.edu-head__info { min-width: 0; }
.edu-head__cat {
  display: inline-block;
  font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase;
  /* getönte Kategorie-Pille in Educator-Farbe (dezent), sonst Akzent-Fallback */
  color: var(--edu, var(--accent));
  background: color-mix(in srgb, var(--edu, var(--accent)) 20%, transparent);
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
  padding: 4px 11px; border-radius: var(--r-pill);
  margin-bottom: var(--s-2);
}
.edu-head__name { font-size: 28px; font-weight: 700; letter-spacing: -.4px; margin: 0 0 3px; }
.edu-head__strategy { font-size: 14.5px; font-weight: 600; color: var(--edu, var(--accent)); margin: 0; }

/* Educator-Intro-Text im Übersicht-Tab */
.edu-intro { margin: var(--s-7) 0; }
.edu-intro__title { font-size: 19px; font-weight: 700; letter-spacing: -.3px; margin: 0 0 var(--s-3); }
.edu-intro__text { font-size: 14px; color: var(--text-muted); line-height: 1.7; margin: 0; max-width: 74ch; }

/* Tabs auf der Detailseite = Segmented Control (Standard-view-toggle, aktiv = lila) */
.view-toggle--tabs { margin-bottom: var(--s-6); }

/* ---- Responsive ---- */
@media (max-width: 1100px) { .cat-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 900px) {
  .cat-grid { grid-template-columns: minmax(0, 1fr); }
  .cat-tile { min-height: 0; }
}
@media (max-width: 760px) {
  .cat-select { grid-template-columns: minmax(0, 1fr); }
  .edu-hero__profile { flex-direction: column; text-align: center; align-items: center; }
  .edu-hero__text { max-width: none; }
  .edu-head { flex-direction: column; text-align: center; }
  .edu-live { flex-direction: column; align-items: stretch; }
  .edu-live__count { justify-content: center; }
  .edu-live__btn { width: 100%; justify-content: center; }
}

/* =========================================================================
   ZENTRALE PILLEN/BADGES + FORTSCHRITTSBALKEN — getönte "Icon-Box"-Optik.
   Alle Marken-Pillen/Badges bekommen: getönter Gradient (--tint-bg) + dezenter
   Border (--tint-border) + gut lesbarer Text (--tint-text). Form/Radius/Padding
   bleiben je Element erhalten. (Semantische Status-/Rollen-Badges mit eigener
   Farbe – is-active grün etc. – behalten bewusst ihre Bedeutung.)
   ========================================================================= */
.theme-glass .pill--beta,
.theme-glass .pill--soon,
.theme-glass .badge,
.theme-glass .badge--streak,
.theme-glass .badge--active,
.theme-glass .portal-tile__soon,
.theme-glass .chip.is-active,
.theme-glass .ms-xp,
.theme-glass .edu-head__cat,
.theme-glass .edu-hero__cat {
  background: var(--tint-bg);
  border: 1px solid var(--tint-border);
  color: var(--tint-text);
}

/* AUSNAHME von der Tönung oben — nachgemessen am 05.08.2026.
   Der Block davor ist SPEZIFISCHER als .badge--warn (.theme-glass .badge =
   zwei Klassen gegen eine) und steht später in der Datei. Er hat die orange
   Warnfarbe also vollständig überschrieben: Der Punkt war orange, das Schild
   selbst blieb violett getönt — der Betreiber sah schlicht keine Änderung.
   Diese eine Stufe trägt eine Bedeutung, die die Tönung nicht einebnen darf. */
.theme-glass .badge--warn {
  background: var(--warn-soft);
  border: 1px solid var(--warn-line);
  color: var(--warn);
}

/* Pillen über Card-Bildern (Kurs-Pillen) — Tönung über dunklem Unterleger,
   damit der Text auf hellen Bildern lesbar bleibt (Blur bleibt aus dem Basis-Stil). */
.theme-glass .course-card__pill,
.theme-glass .course-card__pill--soon {
  background:
    linear-gradient(135deg, rgba(127,68,244,0.34), rgba(239,79,60,0.26)),
    rgba(10, 10, 14, 0.50);
  border-color: var(--tint-border);
  color: #fff;
}

/* ---- Fortschrittsbalken: dezenter getönter Fill + Track mit dezentem Border ----
   Deckt BEIDE Balken-Varianten ab, damit ALLE identisch aussehen:
     • .progress / .progress__bar  → Academy, Milestones, Rewards, Journal
     • .status-bar / .status-bar>i  → Dashboard (Status-Card: XP, Badges,
       Volume Traded, Account Growth) */
/* justierbare Werte für die Linien-Optik (feinjustierbar) */
.theme-glass {
  --bar-line-h:  2px;   /* Linienstärke (dünner als der Track) */
  --bar-inset-x: 3px;   /* seitlicher Innenabstand der Linie */
}
/* TRACK = Container mit Luft: Border/Rundung/Höhe unverändert; Linie darin
   vertikal zentriert und seitlich eingerückt. */
.theme-glass .progress,
.theme-glass .status-bar {
  background: rgba(255, 255, 255, 0.05);
  box-shadow: inset 0 0 0 1px var(--tint-border);   /* Track-Border wie Icon-Box, ohne Layout-Shift */
  display: flex;
  align-items: center;                              /* Linie vertikal zentriert */
  padding: 0 var(--bar-inset-x);                    /* seitlicher Innenabstand */
}
/* FORTSCHRITT = schmale weiße Linie (statt voll gefüllter Höhe) */
.theme-glass .progress__bar,
.theme-glass .status-bar > i {
  height: var(--bar-line-h);        /* dünne Linie statt Track-Höhe */
  background: #FFFFFF;
  border-radius: var(--r-pill);     /* abgerundete Enden */
  box-shadow: none;
}

/* =========================================================================
   DASHBOARD — VIP-Wappen, Abzeichen-Reihe, Main-Cards.
   Wappen sind wiederverwendete Komponenten (.badge-hex aus rewards.html,
   .ms-badge aus milestones.html). Später leicht durch Bilder ersetzbar:
   das jeweilige <svg> durch <img class="badge-hex"> bzw.
   <img class="ms-badge__img"> im .ms-badge__hex tauschen.
   ========================================================================= */
/* VIP-Wappen in der Status-Card (kompakter als auf der Rewards-Seite) */
.status-vip { display: flex; align-items: center; gap: var(--s-4); margin: var(--s-3) 0 var(--s-2); }
.status-vip .badge-hex { width: 58px; height: 64px; flex-shrink: 0; }
.status-vip__body { flex: 1; min-width: 0; }
.status-vip__name { font-size: 30px; font-weight: 800; color: var(--accent); letter-spacing: -.6px; line-height: 1; margin-bottom: 8px; }
.status-vip .status-bar { height: 5px; }   /* gleiche Balken-Optik wie Volume Traded / Account Growth */
.status-vip__next { font-size: 11.5px; color: var(--text-muted); margin: 6px 0 0; }

/* Bild-Ersatz für Wappen (füllt die vorhandene Form) */
img.badge-hex { object-fit: cover; }
.ms-badge__img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Abzeichen-Kategorie-Reihe: aktuelles (zuletzt freigeschaltetes) Wappen +
   Fortschrittsbalken (Wappen wiederverwendet aus milestones.html: .ms-badge__hex). */
/* vertikal: Wappen oben, Fortschrittsbalken (mit Label) darunter */
.ms-cat-row { display: flex; flex-direction: column; align-items: flex-start; gap: var(--s-2); }
.ms-cat-row__crest { width: 40px; height: 45px; flex-shrink: 0; }
.ms-cat-row__crest > svg:first-child { width: 19px; height: 19px; }
.ms-cat-row__body { width: 100%; min-width: 0; }

/* =========================================================================
   ACADEMY — Schloss-Badge auf gesperrter Kurs-Card + Freischalt-Modal (Glas).
   ========================================================================= */
/* Schloss oben rechts auf der Card (Gegenstück zur "Deutsch"-Pille links) */
.course-card__lock {
  position: absolute; top: var(--s-3); right: var(--s-3); z-index: 3;
  width: 34px; height: 34px; border-radius: 50%;
  display: grid; place-items: center; color: #fff;
  background: rgba(10, 10, 14, 0.6);
  border: 1px solid var(--border-strong);
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}
.course-card__lock svg { width: 16px; height: 16px; }
/* Gesperrt-Optik: Bild dezent abgedunkelt (Card selbst bleibt Glas) */
.course-card.is-locked .course-card__img { filter: brightness(.6); }

/* ---- Modal (Glas) ---- */
.modal { position: fixed; inset: 0; z-index: 300; display: none; align-items: center; justify-content: center; padding: var(--s-5); }  /* über dem Admin-Form-Modal (z-index 201), damit Vorschau/Dialoge oben liegen */
.modal.is-open { display: flex; }
.modal[hidden] { display: none; }
.modal__overlay {
  position: absolute; inset: 0;
  background: rgba(0, 0, 0, 0.62);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.modal__panel {
  position: relative; z-index: 1;
  width: 100%; max-width: 440px;
  padding: var(--s-8);   /* 32px Innenabstand rundum (zentral für alle Modals) */
  text-align: center;
}
.modal__icon {
  width: 52px; height: 52px; border-radius: 14px;
  display: grid; place-items: center; margin: 0 auto var(--s-4);
  color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.modal__icon svg { width: 26px; height: 26px; }
.modal__title { font-size: 18px; font-weight: 700; line-height: 1.35; margin: 0 0 var(--s-2); }
.modal__text { font-size: 14px; color: var(--text-muted); line-height: 1.6; margin: 0 0 var(--s-6); }
.modal__actions { display: flex; gap: var(--s-3); justify-content: center; }
.modal__actions .btn { min-width: 96px; justify-content: center; }

/* Bild im Mitglieder-Pop-up: breit wie der Kasten, mit Abstand zum Titel. */
.popup__bild {
  display: block;
  width: 100%;
  max-height: 260px;
  object-fit: cover;
  border-radius: var(--r-item);
  margin: 0 0 var(--s-4);
}

/* ---- Video-Popup (Educator-Seite) ----------------------------------------
   Das Video sass in einem Rahmen, der auf 440px gedeckelt ist, und das
   <iframe> hatte UEBERHAUPT KEINE REGEL - es stand also in der Standardgroesse
   des Browsers da, 300x150. Das war der eigentliche Grund, warum man kaum
   etwas erkannte.

   EIGENE KLASSE STATT .modal__panel: Diese Regel ist laut ihrem Kommentar
   "zentral fuer alle Modals" und traegt sieben weitere Dialoge - die drei
   Strategie-Fenster in Trading Ideas, das Journal, die Admin-Popups und die
   Erinnerung auf derselben Educator-Seite. Global aufgezogen waeren die alle
   zerrissen.

   MUSS NACH .modal STEHEN: gleiche Spezifitaet, also entscheidet die
   Reihenfolge. Weiter unten in der Datei setzt nichts mehr an .modal an. */
.video-modal { left: var(--sidebar-w); padding: var(--s-4); }
.app.collapsed .video-modal { left: var(--sidebar-w-collapsed); }
.video-modal__panel {
  max-width: none;
  max-height: 100%;
  padding: var(--s-4);
}
/*
 * :not([hidden]) IST HIER PFLICHT, kein Feinschliff. Im Rahmen liegen beide
 * Elemente uebereinander - ein <iframe> fuer bunny/YouTube/Vimeo und ein
 * <video> fuer eine hochgeladene Datei -, und das Skript blendet das jeweils
 * falsche per hidden aus. Ein blankes "display: block" aus dem Stylesheet
 * schlaegt diese Voreinstellung des Browsers und zeigte beide gleichzeitig.
 */
.video-modal__panel iframe:not([hidden]),
.video-modal__panel video:not([hidden]) {
  display: block;
  width: 100%;
  /*
   * Die Hoehe begrenzt die Breite, nicht umgekehrt - sonst ragt das Video bei
   * flachen Fenstern unten heraus. Ueber max-height statt ueber die Breite
   * bliebe das Seitenverhaeltnis nicht erhalten; der Spieler wuerde innen
   * schwarze Balken zeichnen. Abgezogen sind Titel und Innenabstaende.
   */
  max-width: calc((100vh - 130px) * 16 / 9);
  aspect-ratio: 16 / 9;
  height: auto;
  margin: 0 auto;
  border: 0;
  border-radius: var(--r-item);
  background: #000;
}
/* Unterhalb von 900px faehrt die Seitenleiste aus dem Bild (siehe RESPONSIVE);
   ein Versatz nach rechts wuerde dann nur Platz verschenken. */
@media (max-width: 900px) {
  .video-modal,
  .app.collapsed .video-modal { left: 0; }
}

/* =========================================================================
   ACADEMY — Coming-Soon-Lektionen (gedimmt, nicht klickbar) in Kursliste + Outline.
   ========================================================================= */
/* Kursliste (.lesson als <article>, kein Link) */
.lesson.is-soon { opacity: .5; cursor: default; }
.lesson.is-soon:hover .lesson__index {
  color: var(--text-muted); border-color: var(--border-strong); background: rgba(255,255,255,0.04);
}
.lesson__soon {
  display: inline-block; margin-left: 8px; vertical-align: middle;
  font-size: 9.5px; font-weight: 600; letter-spacing: .4px; text-transform: uppercase;
  color: var(--text-faint); border: 1px solid var(--border);
  background: rgba(255,255,255,0.03); padding: 2px 7px; border-radius: var(--r-pill);
}
/* Outline (Coming-Soon-Item als <span>, kein Link) */
.outline__item.is-soon { opacity: .5; cursor: default; }
.outline__item.is-soon:hover { background: transparent; color: inherit; }

/* =========================================================================
   TRADING IDEAS — 2 gleich hohe Zeilen (Strategie-Cards + Telegram-Box),
   Farb-Glow je Strategie, Strategie-Modals. Alles theme-glass.
   ========================================================================= */
.ti-page { display: flex; flex-direction: column; }

/* Zwei-Zeilen-Raster, je ~50% der Höhe.
   >>> --ti-reserve justiert die Gesamthöhe (Header + Content-Padding + Titel) <<< */
.ti-grid {
  --ti-reserve: 240px;   /* etwas mehr reserviert, damit unten Luft bleibt */
  display: grid;
  grid-template-rows: 1fr 1fr;
  gap: var(--s-5);
  height: calc(100vh - var(--ti-reserve));
  min-height: 460px;
  margin-bottom: var(--s-6);   /* Abstand, damit die untere Card nicht am Seitenende klebt */
}
.ti-strats {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--s-5);
  min-height: 0;
}

/* ---- Farb-Glow-Definitionen je Strategie (hier justierbar) ----
   --glow      = Akzentfarbe (Icon/Titel/CTA)
   --glow-soft = weicher Flächen-/Außen-Schein
   --glow-ring = farbiger Rand (Eck-Glanz-Ring der Card) */
.strat--purple { --glow:#8b5cff; --glow-soft:rgba(127,63,251,0.22); --glow-ring:rgba(127,63,251,0.60); }
.strat--blue   { --glow:#4d8dff; --glow-soft:rgba(61,123,255,0.22);  --glow-ring:rgba(61,123,255,0.60); }
.strat--gold   { --glow:#f5b62b; --glow-soft:rgba(245,182,43,0.20);  --glow-ring:rgba(245,182,43,0.62); }

/* farbiger Eck-Glanz-Ring (Ruhezustand) + weicher Außen-Glow für Card & Modal */
.theme-glass [class*="strat--"]::before { --corner-tl: var(--glow-ring); --corner-br: var(--glow-ring); }
[class*="strat--"] {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 34px var(--glow-soft);
}
/* weicher farbiger Flächen-Schimmer im Hintergrund (Card & Modal) */
.glow-layer {
  position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: 0;
  background:
    radial-gradient(120% 90% at 0% 0%,   var(--glow-soft), transparent 55%),
    radial-gradient(120% 90% at 100% 100%, var(--glow-soft), transparent 60%);
}

/* ---- Strategie-Card ---- */
.strat-card {
  position: relative; overflow: hidden;
  display: flex; flex-direction: column; align-items: flex-start; gap: var(--s-3);
  padding: var(--s-6);
  height: 100%;
  text-align: left; font: inherit; color: inherit; cursor: pointer;
}
.strat-card > *:not(.glow-layer) { position: relative; z-index: 1; }
.strat-card__icon {
  width: 46px; height: 46px; border-radius: 13px;
  display: grid; place-items: center;
  color: var(--glow);
  background: var(--glow-soft);
  border: 1px solid var(--glow-ring);
}
.strat-card__icon svg { width: 23px; height: 23px; stroke-width: 1.8; }
.strat-card__name { font-size: 21px; font-weight: 700; letter-spacing: -.3px; color: var(--text); }
.strat-card__desc { font-size: 13px; color: var(--text-muted); line-height: 1.5; }
.strat-card__cta {
  margin-top: auto;
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 13px; font-weight: 600; color: var(--glow);
  transition: gap .2s ease;
}
.strat-card__cta svg { width: 16px; height: 16px; }
.strat-card.card--hover:hover .strat-card__cta { gap: 11px; }

/* ---- Auffällige Telegram-Box (Haupt-CTA) — zentriert, untereinander ---- */
.ti-telegram {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; gap: var(--s-4);
  padding: var(--s-8);
  height: 100%;
}
.theme-glass .ti-telegram::before { --corner-tl: rgba(146,80,236,0.75); --corner-br: rgba(239,79,60,0.65); }
.ti-telegram {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 44px var(--accent-glow);
}
.ti-telegram__icon {
  flex: none; width: 60px; height: 60px; border-radius: 16px;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.ti-telegram__icon svg { width: 30px; height: 30px; }
.ti-telegram__body { min-width: 0; }
.ti-telegram__title { font-size: 23px; font-weight: 700; letter-spacing: -.3px; margin: 0 0 var(--s-2); }
.ti-telegram__desc { font-size: 14px; color: var(--text-muted); line-height: 1.55; margin: 0 auto; max-width: 48ch; }

/* ---- Prominenter Haupt-CTA-Button (Akzent-Gradient) ---- */
.btn--cta {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 15px 30px; font-size: 15.5px; font-weight: 700;
  color: #fff; border: 0; border-radius: var(--r-item);
  background: var(--accent-gradient);
  box-shadow: 0 10px 30px var(--accent-glow);
  transition: filter .15s ease, transform .15s ease, box-shadow .15s ease;
}
.btn--cta svg { width: 19px; height: 19px; }
.btn--cta:hover { filter: brightness(1.07); box-shadow: 0 12px 38px var(--accent-glow); }

/* =========================================================================
   STRATEGIE-MODALS — Video + PDF (Platzhalter), Farb-Glow der Strategie.
   ========================================================================= */
.ti-modal .modal__panel {
  position: relative; overflow: hidden;
  max-width: 520px; text-align: left;
  padding: var(--s-8);   /* 32px Innenabstand rundum */
}
/* Inhalt über den Glow, ABER den absolut positionierten Close-Button ausnehmen
   (sonst würde er auf position:relative gezwungen und säße oben links). */
.ti-modal .modal__panel > *:not(.glow-layer):not(.modal__close) { position: relative; z-index: 1; }
.modal__close {
  position: absolute; top: var(--s-4); right: var(--s-4); z-index: 2;
  width: 34px; height: 34px; border-radius: 9px;
  display: grid; place-items: center;
  color: var(--text-muted); background: rgba(255,255,255,0.05);
  border: 1px solid var(--border); cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
.modal__close:hover { background: var(--card-hover); color: var(--text); }
.modal__close svg { width: 17px; height: 17px; }
.modal__eyebrow {
  font-size: 11px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase;
  color: var(--text-muted); margin: 0 0 4px;
}
.ti-modal .modal__title.strat-title { font-size: 26px; font-weight: 700; letter-spacing: -.4px; color: var(--glow); margin: 0 0 var(--s-5); }
.modal__join { width: 100%; justify-content: center; margin-bottom: var(--s-5); }

/* Video-Platzhalter */
.ti-video {
  position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--s-3); aspect-ratio: 16 / 9; margin-bottom: var(--s-4);
  border-radius: 14px; cursor: pointer;
  background: rgba(255,255,255,0.04); border: 1px solid var(--border);
}
.ti-video__play {
  width: 54px; height: 54px; border-radius: 50%;
  display: grid; place-items: center; color: #fff;
  background: rgba(10,10,15,0.6); border: 1px solid rgba(255,255,255,0.25);
}
.ti-video__play svg { width: 22px; height: 22px; margin-left: 2px; }
.ti-video__label { font-size: 12.5px; color: var(--text-muted); }

/* PDF-Download-Platzhalter */
.ti-pdf {
  display: flex; align-items: center; gap: var(--s-4);
  padding: var(--s-4);
  border-radius: 14px;
  background: rgba(255,255,255,0.04); border: 1px solid var(--border);
  transition: border-color .15s ease, background .15s ease;
}
.ti-pdf:hover { border-color: var(--accent-line); background: var(--card-hover); }
.ti-pdf__icon {
  flex: none; width: 42px; height: 42px; border-radius: 10px;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.ti-pdf__icon svg { width: 21px; height: 21px; }
.ti-pdf__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ti-pdf__title { font-size: 14px; font-weight: 600; color: var(--text); }
.ti-pdf__meta { font-size: 12px; color: var(--text-muted); }
.ti-pdf__dl { flex: none; color: var(--text-muted); }
.ti-pdf__dl svg { width: 20px; height: 20px; display: block; }

/* ---- responsive ---- */
@media (max-width: 1000px) {
  .ti-grid { height: auto; grid-template-rows: none; }
  .strat-card { min-height: 170px; }
  .ti-telegram { flex-direction: column; text-align: center; }
  .ti-telegram__desc { max-width: none; }
  .ti-telegram__btn { width: 100%; justify-content: center; }
}
/* Zwei Karten, zwei Haelften (11.08.2026, Betreiberansage nach dem Wegfall von
   Nova). Bei drei Karten stand hier noch die Erklaerung, warum es keine
   Zweierreihe gibt - die Frage stellt sich jetzt nicht mehr.

   Unter 760px untereinander: Zwei Karten nebeneinander waeren dort je etwa
   170px breit, und die Beschreibung braeuchte vier Zeilen. */
@media (max-width: 760px) {
  .ti-strats { grid-template-columns: minmax(0, 1fr); }
}

/* =========================================================================
   LIVE SESSIONS — Startseite (2 mittige Boxen), Wochenkalender-Tabelle,
   Educator-Note. Alles theme-glass, gut lesbar auf dunklem Grund.
   ========================================================================= */
/* Startseite: zentrierter Titel + zwei große Boxen mittig */
.ls-home__head { text-align: center; }
.ls-home__title { letter-spacing: .5px; }
.cat-grid--two { grid-template-columns: repeat(2, 1fr); max-width: 800px; margin: 0 auto; }

/* Zwischenüberschrift (z.B. "Educators" unter dem Kalender) */
/* deutlich mehr Luft zwischen Kalender und Educator-Cards */
.ls-sub-head { font-size: 18px; font-weight: 700; letter-spacing: -.2px; margin: var(--s-5) 0 var(--s-4); }

/* ---- WOCHENKALENDER (Tabelle) — Optik angeglichen an den Session-Kalender
   der Educator-Detailseite (Zellen-/Raster-Look, Session-Blöcke, Typo). ---- */
.wk-cal-card { padding: 0; overflow: hidden; margin-bottom: var(--s-10); }  /* Abstand zu den Cards darunter */
.wk-cal-wrap { overflow-x: auto; }                    /* horizontal scrollen auf schmalen Screens */
/* table-layout: fixed → alle 7 Wochentag-Spalten gleich breit (Rest nach der
   festen Educator-Spalte gleichmäßig geteilt), unabhängig vom Zell-Inhalt. */
.wk-cal { width: 100%; min-width: 860px; border-collapse: collapse; table-layout: fixed; }
.wk-cal th, .wk-cal td { border: 1px solid var(--border); }   /* dezente Trennlinien wie im Wochenraster */

/* Kopfzeile: Wochentage — wie .wk__dh (klein, uppercase, faint) */
.wk-cal thead th {
  padding: var(--s-3) var(--s-2);
  font-size: 10.5px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase;
  color: var(--text-faint); text-align: center;
  background: rgba(255,255,255,0.03);
}
.wk-cal thead .wk-cal__corner { text-align: left; padding-left: var(--s-4); }
.wk-cal__corner, .wk-cal__edu { width: 220px; }

/* Erste Spalte: Educator (klickbar) */
.wk-cal__edu { padding: var(--s-4); background: rgba(255,255,255,0.02); }
.wk-edu { display: flex; align-items: center; gap: 12px; color: inherit; }
.wk-edu__img {
  width: 44px; height: 44px; border-radius: 50%; object-fit: cover; flex: none;
  border: 1px solid rgba(255,255,255,0.16);
}
.wk-edu__meta { display: flex; flex-direction: column; min-width: 0; }
.wk-edu__name { font-size: 14px; font-weight: 650; color: var(--text); transition: color .15s ease; }
.wk-edu__role { font-size: 11px; color: var(--text-faint); text-transform: lowercase; }
.wk-edu:hover .wk-edu__name { color: var(--accent); }

/* Tages-Zellen — höher/luftiger; leichte Akzent-Tönung nur auf "heute-artigen"
   Spalten entfällt. Die Tönung wandert in den Session-Block. */
.wk-cal__cell { height: 118px; padding: 8px; vertical-align: top; }

/* Session-Block — 1:1 wie .wk-event im Session-Kalender:
   lila getönt, abgerundet, Akzent-Kante links, dezenter Schatten. */
.wk-sess {
  display: flex; flex-direction: column; align-items: flex-start; gap: 5px;
  width: 100%; height: auto; padding: 9px 11px; text-align: left;
  border-radius: 8px;
  /* Educator-Farbe (var(--edu) von der Zeile) — getönt; sonst Akzent-Fallback */
  background: color-mix(in srgb, var(--edu, var(--accent)) 18%, transparent);
  border-left: 3px solid var(--edu, var(--accent));
  box-shadow: 0 4px 12px color-mix(in srgb, var(--edu, var(--accent)) 13%, transparent);
}
/* ZWEI SESSIONS AM SELBEN TAG LIEFEN UEBEREINANDER (27.08.2026): Jede
   Karte stand auf 100% Zellhoehe - bei zweien zusammen das Doppelte, und
   die zweite ragte in die Zeile des naechsten Educators. Jetzt fuellt nur
   die EINZELNE Karte ihre Zelle; mehrere werden inhaltshoch, stapeln sich
   mit Abstand, und die Zeile waechst mit (118px bleiben Mindesthoehe).
   Das Admin-Panel macht es mit .adm-cal genauso. */
.wk-sess:only-child { height: 100%; }
.wk-sess + .wk-sess { margin-top: 6px; }
.wk-sess__time { font-size: 11px; font-weight: 700; color: var(--edu, #cfe0ff); }
.wk-sess__title {
  font-size: 12.5px; font-weight: 600; color: #fff; line-height: 1.3;
  overflow-wrap: anywhere; word-break: break-word;   /* sauber umbrechen, kein Überlauf */
}
/* WARUM: Original-Markup markiert belegte Kalenderzellen semantisch. */
.wk-cal__cell.is-session { background: rgba(255,255,255,0.025); }
.wk-sess__badge {
  font-size: 8.5px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase;
  color: #f5b62b; border: 1px solid rgba(245,182,43,0.45);
  background: rgba(245,182,43,0.16); padding: 1px 6px; border-radius: var(--r-pill);
}
/* VIP-Extra: Gold-Variante des Blocks (statt grellem Sonderton) */
.is-vip .wk-sess { background: rgba(245,182,43,0.16); border-left-color: #f5b62b; box-shadow: 0 4px 12px rgba(245,182,43,0.12); }
.is-vip .wk-sess__time { color: #ffdd99; }

/* Platzhalter-Hinweis (Zeiten folgen / wird bekannt gegeben) */
.wk-cal__soon { color: var(--text-faint); font-size: 13.5px; text-align: center; padding: var(--s-6); }
.wk-cal__soon em { color: var(--text-muted); font-style: normal; font-weight: 600; }

/* ---- EDUCATOR NOTE (Detailseite, neben dem Namen) ---- */
.edu-head { flex-wrap: wrap; }
.edu-note {
  align-self: stretch;   /* gleiche Höhe wie der Content-Block links (oben/unten bündig) */
  display: flex; align-items: flex-start; gap: 10px;   /* Inhalt oben ausgerichtet */
  max-width: 280px;
  padding: var(--s-3) var(--s-4);
  border-radius: 12px;
  /* Schlicht: dunkler Card-Grund + dezenter grauer Rahmen (keine getönten Akzente). */
  background: #0a0a0f;
  border: 1px solid rgba(255,255,255,0.12);
}
.edu-note__icon { flex: none; color: var(--text-muted); }
.edu-note__icon svg { width: 18px; height: 18px; display: block; }
.edu-note__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.edu-note__label { font-size: 10px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--text-muted); }
.edu-note__text { font-size: 13px; color: var(--text); line-height: 1.4; }

@media (max-width: 760px) {
  .edu-note { margin-left: 0; width: 100%; max-width: none; }
}

/* =========================================================================
   EDUCATOR — Benachrichtigungs-Box (rechts neben der Note) + Modal.
   Gleicher getönter Glas-Stil wie .edu-note; volle Höhe (align-self: stretch).
   ========================================================================= */
.edu-signup {
  align-self: stretch;                 /* gleiche Höhe wie Content-Block & Note */
  display: flex; flex-direction: column; gap: var(--s-3);
  max-width: 300px;
  padding: var(--s-4);
  border-radius: 12px;
  /* Identisch schlicht wie .edu-note: dunkel + grauer Rahmen. */
  background: #0a0a0f;
  border: 1px solid rgba(255,255,255,0.12);
}
.edu-signup__title { font-size: 13.5px; font-weight: 700; color: var(--text); line-height: 1.3; margin: 0; }
.edu-signup__btn { width: 100%; justify-content: center; }  /* direkt unter der Überschrift */

/* ---- Benachrichtigungs-Modal: linksbündiges Formular ---- */
.notify-modal { max-width: 460px; text-align: left; }
.notify-modal .modal__icon { margin: 0 0 var(--s-4); }
.notify-modal .modal__title, .notify-modal .modal__text { text-align: left; }

.notify-form { display: flex; flex-direction: column; gap: var(--s-4); margin-top: var(--s-5); }
.notify-field { display: flex; flex-direction: column; gap: 6px; }
.notify-field__label { font-size: 12.5px; font-weight: 600; color: var(--text-muted); }
.notify-field__input {
  width: 100%; padding: 11px 13px; border-radius: var(--r-item);
  background: rgba(255,255,255,0.04); border: 1px solid var(--border-strong);
  color: var(--text); font: inherit; font-size: 14px;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.notify-field__input::placeholder { color: var(--text-faint); }
.notify-field__input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
.notify-check { display: flex; align-items: flex-start; gap: 9px; font-size: 13px; color: var(--text-muted); line-height: 1.45; cursor: pointer; }
.notify-check input { margin-top: 2px; width: 16px; height: 16px; accent-color: var(--accent); flex: none; }
.notify-link { color: var(--accent); text-decoration: underline; }
/* Submit gesperrt, solange die Checkbox nicht gesetzt ist */
.notify-form .btn[disabled] { opacity: .45; cursor: not-allowed; box-shadow: none; }

@media (max-width: 760px) {
  .edu-signup { margin-left: 0; width: 100%; max-width: none; }
}

/* =========================================================================
   ANNOUNCEMENTS — angepinnt / hervorgehoben.
   ========================================================================= */
.post--pinned { order: -1; }   /* .feed ist flex-column → Pinned nach oben */
.post__pin {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 11px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase;
  color: var(--accent); margin-bottom: var(--s-3);
}
.post__pin svg { width: 14px; height: 14px; }
/* Hervorgehoben: kräftigerer Akzent-Ring + linke Akzentkante + Glow (kein Layout-Shift) */
.theme-glass .post--highlight::before { --corner-tl: rgba(160,107,255,0.85); --corner-br: rgba(239,79,60,0.6); }
.post--highlight {
  box-shadow: inset 3px 0 0 var(--accent), inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 30px var(--accent-glow);
}

/* Admin-Liste: Pin/Highlight-Tags */
.crud-tag {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 10px; font-weight: 700; letter-spacing: .3px; text-transform: uppercase;
  color: var(--accent); border: 1px solid var(--accent-line); background: var(--accent-soft);
  padding: 1px 7px; border-radius: var(--r-pill); margin-left: 6px; vertical-align: middle;
}
.crud-tag svg { width: 11px; height: 11px; }

/* =========================================================================
   RANKS — VIP-Vorteil-Card.
   ========================================================================= */
.vip-benefit { display: flex; align-items: flex-start; gap: var(--s-5); padding: var(--s-6); margin-top: var(--s-6); }
.theme-glass .vip-benefit::before { --corner-tl: rgba(160,107,255,0.9); --corner-br: rgba(127,63,251,0.7); }
.vip-benefit { box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 36px rgba(127,63,251,0.22); }
.vip-benefit__icon {
  flex: none; width: 52px; height: 52px; border-radius: 14px;
  display: grid; place-items: center; color: #cbb0ff;
  background: rgba(127,63,251,0.16); border: 1px solid rgba(160,107,255,0.5);
}
.vip-benefit__icon svg { width: 26px; height: 26px; }
.vip-benefit__eyebrow { font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--accent); }
.vip-benefit__title { font-size: 18px; font-weight: 700; margin: 2px 0 var(--s-3); }
.vip-benefit__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.vip-benefit__list li { display: flex; align-items: flex-start; gap: 9px; font-size: 14px; color: var(--text); line-height: 1.4; }
.vip-benefit__ck { flex: none; color: var(--green); display: inline-flex; }
.vip-benefit__ck svg { width: 16px; height: 16px; }

/* =========================================================================
   LIVE SESSIONS — VIP-Session gesperrt: "Access ab VIP Status".
   ========================================================================= */
.wk-sess__badge { display: inline-flex; align-items: center; gap: 3px; }
.wk-sess__badge svg { width: 10px; height: 10px; }
.wk-sess__access {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 9.5px; font-weight: 700; letter-spacing: .2px;
  color: #f5b62b; margin-top: 2px;
}
.wk-sess__access svg { width: 11px; height: 11px; }

/* =========================================================================
   ERSTE SCHRITTE / FAST START — zentriertes Karten-Design (theme-glass).
   Badge sitzt mittig auf der oberen Card-Kante; darunter Icon → Titel → Text,
   alles zentriert. Lila/orange Akzente.
   ========================================================================= */
.fs-hero { text-align: center; max-width: 720px; margin: 0 auto var(--s-10); }
.fs-hero__eyebrow {
  display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-line);
  padding: 5px 14px; border-radius: 100px; margin-bottom: var(--s-4);
}
.fs-hero__title { font-size: 34px; font-weight: 800; letter-spacing: -.6px; margin: 0 0 var(--s-3); }
.fs-hero__sub { font-size: 15px; color: var(--text-muted); line-height: 1.6; margin: 0; }

/* Das Logo ueber der Ueberschrift (Copy Trading, 09.10.2026). Es ist
   freigestellt, braucht also keinen eigenen Grund - nur eine Obergrenze,
   damit es auf dem Handy nicht die halbe Seite fuellt.

   DIE GRENZE STEHT IN width UND NICHT IN max-width, und das ist keine
   Geschmacksfrage, sondern eine Reparatur (10.10.2026):

   Weiter unten in dieser Datei steht in @media (max-width: 760px) die
   Zeile ".content img, .content video, .content iframe { max-width: 100% }"
   - ein sinnvoller Schutz, damit Bilder nicht aus dem Inhalt laufen. Sie
   hat aber hoehere Spezifitaet als diese Regel hier (Klasse + Element
   gegen Klasse allein) und steht ausserdem spaeter. Auf dem Handy gewann
   also IMMER sie, und das Logo lief ueber die volle Breite - seit dem Tag,
   an dem es eingebaut wurde. Auf dem Laptop fiel es nicht auf, weil die
   Regel dort gar nicht gilt.

   AUFGEFALLEN IST ES ERST, als der Betreiber am 10.10.2026 ein kleineres
   Logo wollte und meine neue max-width aus demselben Grund wirkungslos
   blieb. Mit width statt max-width ist die Sache erledigt: ".content img"
   begrenzt nur nach OBEN auf 100 Prozent, und 210 Pixel sind weniger als
   das - die Regel greift ins Leere, statt diese hier zu schlagen. */
.fs-hero__logo { display: block; width: min(100%, 210px); height: auto; margin: 0 auto var(--s-4); }

/* ============================================================
   COPY TRADING - WERTENTWICKLUNG (09.10.2026)
   ============================================================

   DIE ERSTE KARTE LAEUFT IN DERSELBEN SPUR WIE DIE SCHRITTE.

   BETREIBERANSAGE vom 09.10.2026: "Mach mal bitte die erste Karte genauso
   schmal wie die anderen Karten, wie von Step 1, Step 2, Step 3 und so."

   SIE DURFTE FRUEHER AUSBRECHEN - um 240 Pixel ueber die 760er Spur hinaus,
   weil zwoelf Monatsbalken sonst Striche gewesen waeren. Mit dem Diagramm
   auf 570 Pixeln ist der Grund weg, und eine einzelne Karte, die aus der
   Reihe faellt, zerreisst die Spur. Die Klasse bleibt trotzdem: Sie steuert
   weiterhin, dass der Text in dieser Karte ueber die volle Kartenbreite
   laeuft statt auf 56 Zeichen zu stehen. */
.fs-step--weit { width: 100%; }

/* Die Jahreswahl - dieselbe Machart wie die Filterknoepfe im Journal:
   gedrueckter Zustand ueber aria-pressed, nicht ueber eine Extraklasse.
   Ein Knopf, der seinen Zustand nur optisch traegt, ist fuer ein
   Vorleseprogramm stumm. */
/* ============================================================
   DER TRANSFER EINES BESTEHENDEN KONTOS (15.10.2026)

   BETREIBERANSAGE: "Unter dem Button Register noch einen weiteren
   Button. Der Button ist dafuer da, dass du mit dem Button ein Pop-up
   aufmachst."

   DER KNOPF IST EIN ZWEITER, KEIN GLEICHWERTIGER: Oben steht der Weg
   fuer alle (Registrieren), hier der fuer die wenigen, die schon ein
   Konto haben. Deshalb btn-outline statt btn--primary - sichtbar, aber
   nicht gleich laut.

   Das Modal selbst nutzt die Klassen, die das Portal schon hat (.modal,
   .modal__overlay, .modal__panel, .modal__close); hier stehen nur die
   Abweichungen fuer diesen einen Inhalt.
   ============================================================ */
/* DER KNOPF IST DER REGISTER-KNOPF IN ROT.

   BETREIBERANSAGE vom 15.10.2026: "genauso machen wie der Register-Button,
   aber vielleicht ist die Farbe drin ein bisschen anders. Vielleicht
   einfach die rote Farbe von denen drin nehmen."

   #ef4f3c IST KEINE NEUE FARBE: Sie ist das rote Ende von
   --accent-gradient (linear-gradient(135deg, #7f44f4, #ef4f3c)) und liegt
   damit schon im Portal. Darum passt der Knopf neben den violetten,
   ohne fremd zu wirken.

   display und margin stehen hier und NICHT ueber .fs-step__cta: Diese
   Regel steht im Stylesheet weiter oben als .fs-step__cta (Zeile 6092),
   deren margin-top haette die Zeile hier sonst stillschweigend ersetzt. */
.vcx-transfer__knopf {
  display: inline-flex; margin-top: var(--s-5);
}

/* DER KNOPF TRAEGT DEN VERLAUF DER MARKE.

   BETREIBERANSAGE vom 15.10.2026: "machen wir den Button mit der
   Gradient-Farbe. Das ist, glaube ich, besser."

   --accent-gradient ist der Verlauf des Portals (violett nach rot) und
   steht auf .theme-glass selbst - also dieselbe Farbe, die das Markenlogo,
   die aktive Menuezeile und die Konditionen-Karte tragen.

   DIE FARBE MUSS AUF DIESER EBENE STEHEN, NICHT EINE HOEHER: Die
   Glas-Regel .theme-glass .btn--primary traegt zwei Klassen (0-2-0) und
   schlaegt jede einzelne, egal wer spaeter im Stylesheet steht.

   ERSETZT WIRD NUR background-image, SONST NICHTS. Die Glas-Mechanik
   rechnet mit zwei Schichten: Die erste deckt den Knopf ab und laesst
   unten var(--btn-edge) frei, die zweite ist die weisse Leuchtlinie, die
   dort hervorschaut - "nur dieser weisse Streifen unten im Button ist
   noch mit drin". Die erste Schicht wird hier der Verlauf, die zweite ist
   wortwoertlich die aus .theme-glass .btn--primary. Alles andere -
   background-size, -position, -origin, -clip - bleibt von dort.

   OHNE DEN WEISSEN STREIFEN BRAUCHT ES NUR EINE SCHICHT.

   BETREIBERANSAGE vom 15.10.2026: "mach mal den weissen Streifen bei dem
   Button raus und einen zoom hover effekt rein."

   DASS DIE LEUCHTLINIE WEG IST, REICHT NICHT: Die Glas-Regel laesst
   unten var(--btn-edge) der Fuellung frei, damit die Linie dort
   hervorschauen kann. Bleibt dieser Streifen frei und die Linie fehlt,
   scheint dort die Grundfarbe durch - aus dem weissen Streifen wird ein
   dunkler. Deshalb deckt background-size: 100% 100% den Knopf ganz ab.

   background-origin und -clip bleiben von der Glas-Regel auf border-box:
   Der Verlauf deckt damit auch die 1px-Border mit ab, die hier nur noch
   transparent dasteht. Sie bleibt stehen, damit der Knopf genauso hoch
   ist wie der Register-Knopf darueber - mit border: 0 waere er 2px
   flacher. */
.theme-glass .vcx-transfer__knopf {
  background-image: var(--accent-gradient);
  background-color: transparent;
  background-size: 100% 100%;
  border-color: transparent;
  transition: transform .2s ease;
}

/* DER ZOOM BEIM UEBERFAHREN.

   scale(1.04) ist der Wert, den das Portal schon traegt
   (.course-card__img, .vid-card__thumb img) - kein neu erfundener.

   DIE TRANSITION MUSS OBEN STEHEN, nicht hier: Die Glas-Regel setzt
   "transition: background-size .3s ease, border-color .3s ease" und
   loescht damit das transform aus .btn. Ohne die eigene Zeile springt
   der Knopf, statt zu wachsen.

   KEIN FARBWECHSEL: "Der Button bekommt beim Hover nicht die Farbe,
   sondern hat generell schon diese rote Farbe." Es bewegt sich nur.

   background-size MUSS HIER NOCHMAL STEHEN, und das war ein Fehler:
   .theme-glass .btn--primary:hover setzt es auf
   "100% calc(100% - var(--btn-edge))" - also wieder mit dem freien
   Streifen unten. Beide Regeln wiegen gleich (zwei Klassen und eine
   Pseudoklasse), und wer eine Eigenschaft nicht setzt, kann sie auch
   nicht gewinnen: Im Ruhezustand war der Knopf also ganz gefuellt, beim
   Ueberfahren kam der Streifen zurueck. Genau das hat der Betreiber
   gesehen: "der Streifen ist doch immer beim Hovern da." */
.theme-glass .vcx-transfer__knopf:hover {
  transform: scale(1.04);
  background-size: 100% 100%;
  border-color: transparent;
}

/* DAS KLICK-FEEDBACK MUSS MIT, sonst geht es verloren: .btn:active
   traegt zwei Klassen, die Hover-Regel oben drei - beim Klicken auf
   einen Knopf, auf dem die Maus steht, gewinnt also der Zoom und das
   Eindruecken aus .btn:active faellt weg. Hier stehen beide zusammen. */
.theme-glass .vcx-transfer__knopf:active {
  transform: scale(1.01) translateY(1px);
}

/* WER NICHT ANIMIERT HABEN WILL, BEKOMMT ES AUCH NICHT. */
@media (prefers-reduced-motion: reduce) {
  .theme-glass .vcx-transfer__knopf { transition: none; }
  .theme-glass .vcx-transfer__knopf:hover { transform: none; }
}

/* DIE ZEILE DIREKT UNTER DEM KNOPF, IN WEISS.

   "Das ist einfach dann direkt unter dem Button, und man merkt, man muss
   einfach auf den Button selber klicken." Deshalb weiss und nicht
   gedaempft wie .form-hint - sie gehoert zum Knopf, nicht zum Rand. */
.vcx-transfer__klick {
  margin: var(--s-3) 0 0;
  font-size: 13.5px; font-weight: 600; line-height: 1.5;
  color: #fff;
}

.vcx-transfer__hinweis {
  max-width: 56ch; margin: var(--s-3) auto 0;
  text-align: left;
}

/* DER KASTEN ROLLT NICHT - DER TEXT IN IHM ROLLT.

   DER RAND DES KASTENS IST KEIN RAND, SONDERN EIN PSEUDOELEMENT:
   .theme-glass .card::before liegt mit position: absolute und inset: 0
   auf der Kante und macht Border und Eck-Glanz in einer Linie. An einem
   ROLLENDEN Element haengt so ein Element am Inhalt und wandert mit ihm
   nach oben. Genau das hat der Betreiber gesehen: "Diese Borderlinien
   sind jetzt im Popup selber, und wenn man scrollt, gehen diese
   Borderlinien auch mit. Dann ueberschneidet sich der Text mit den
   Borderlinien."

   DESHALB ROLLT HIER NICHTS MEHR: Der Kasten ist eine Spalte aus Kopf
   (fest) und Textfeld (rollt). Der Rand bleibt stehen, wo er hingehoert.

   max-height: 100% ist die Inhaltshoehe des Rahmens .modal, also der
   Schirm MINUS dessen Innenabstand oben und unten. Eine Hoehe in
   Schirmeinheiten (vh) wuerde den Abstand nicht kennen.

   overflow: hidden haelt den Text an der runden Ecke, padding: 0 gibt
   den Innenabstand nach innen weiter - er gehoert jetzt an die beiden
   Felder, nicht an den Kasten. */
.vcx-transfer__panel {
  max-width: 640px; max-height: 100%;
  display: flex; flex-direction: column;
  padding: 0; overflow: hidden;
  text-align: left;
}

/* DER KOPF HAELT DEN SCHLIESSKNOPF - UND NUR IHN.

   "Es soll aussehen, dass der Close-Button und das nicht ueberschneiden."
   Der Knopf steht im Fluss (position: static schlaegt das absolute aus
   .modal__close, weil zwei Klassen mehr zaehlen als eine), also rechnet
   sich die Hoehe des Kopfes aus seiner eigenen Groesse. Der Text darunter
   kann ihn nie erreichen.

   KEINE EIGENE FLAECHE, KEINE KANTE: Der Kopf ist nur Platz. */
.vcx-transfer__kopf {
  flex: 0 0 auto;
  display: flex; justify-content: flex-end;
  padding: var(--s-4) var(--s-4) 0;
}

.vcx-transfer__kopf .modal__close { position: static; }

/* DAS TEXTFELD ROLLT. min-height: 0 ist nicht optional: Ohne diese Zeile
   waechst ein Flex-Kind auf seinen Inhalt und rollt nie. */
.vcx-transfer__rolle {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  padding: var(--s-2) var(--s-8) var(--s-8);
}

/* DAS BILD GANZ OBEN, ohne Kante: "Man muss einfach nur das Bild ganz
   oben reinpacken, und drunter ist der ganze Text." Der Schirmabzug hat
   selbst einen hellen Grund und setzt sich vom dunklen Kasten ab - ein
   Rahmen darum waere genau der Kasten, den der Betreiber nicht will. */
.vcx-transfer__bild {
  display: block; width: 100%; height: auto;
  margin: 0 0 var(--s-5);
  border-radius: 10px;
}

.vcx-transfer__titel {
  margin: 0 0 var(--s-4);
  font-size: 19px; font-weight: 800;
  letter-spacing: .04em; text-transform: uppercase;
}

/* JEDE ZEILE SIEHT AUS WIE DIE ANDERE.

   "Mach es nicht so kompliziert, also auch keinen eigenen Kasten im
   Pop-up reinpacken, muss auch nicht. Mach es einfach ganz normal, also
   entspannt." Eine Klasse fuer alle Absaetze - keine Warnfarbe, keine
   Schreibmaschinenschrift, keine Trennlinie. Der Text des Betreibers
   steht da, wie er ihn geschickt hat. */
.vcx-transfer__zeile {
  margin: 0 0 var(--s-4);
  font-size: 14px; line-height: 1.6; color: var(--text);
}

.vcx-transfer__zeile:last-child { margin-bottom: 0; }

/* DER KNOPF ZUM FORMULAR.

   BETREIBERANSAGE vom 15.10.2026: "Mach am besten diesen Link zu einem
   Button im Pop-up selber." Vorher stand die Adresse als Zeile da und
   musste abgetippt oder markiert werden.

   NUR DER ABSTAND STEHT HIER: Aussehen, Groesse und Verhalten kommen von
   .btn/.btn--primary, also vom Portal. Der Knopf ist damit derselbe wie
   der Register-Knopf auf der Seite. */
.vcx-transfer__formular {
  display: inline-flex;
  margin: 0 0 var(--s-4);
}

/* .vcx-punkte bringt margin: 0 mit - die drei Angaben brauchen hier den
   gleichen Abstand nach unten wie jede andere Zeile. */
.vcx-transfer__punkte { margin: 0 0 var(--s-4); }

@media (max-width: 600px) {
  .vcx-transfer__hinweis { max-width: none; }
}

/* ============================================================
   DAS RECHTLICHE AM SEITENENDE (15.10.2026)

   BETREIBERANSAGE: "Dann das hier adden unten als Disclaimer, Name:
   DISCLAIMER & LICENSE."

   RUHIGER ALS ALLES DARUEBER, aber nicht versteckt: kein Kartenrahmen,
   kein Akzent, nur eine Trennlinie und kleinere Schrift. Diese Karte
   wirbt nicht, sie haftet. Sie soll am Ende stehen und gefunden werden,
   nicht auffallen.

   LESBAR BLEIBT SIE TROTZDEM. 12,5 Pixel ist die Groesse, die auf dieser
   Seite auch der Equity-Stop traegt; darunter faengt das an, was man
   nicht mehr liest, sondern uebersieht. Bei einem Haftungsausschluss ist
   das der falsche Ort zum Sparen - er zaehlt im Zweifel.
   ============================================================ */
.vcx-recht {
  max-width: 760px; margin: var(--s-10) auto 0;
  padding-top: var(--s-7);
  border-top: 1px solid var(--border);
}

.vcx-recht__titel {
  margin: 0 0 var(--s-6);
  font-size: 12px; font-weight: 600; line-height: 1.4;
  letter-spacing: .18em; text-transform: uppercase;
  color: var(--text-muted); text-align: center;
}

.vcx-recht__block + .vcx-recht__block { margin-top: var(--s-6); }

/* Die drei Ueberschriften in derselben gesperrten Machart wie die
   Faecher weiter oben - die Seite behaelt eine Handschrift. */
.vcx-recht__kopf {
  margin: 0 0 var(--s-3);
  font-size: 11px; font-weight: 600; line-height: 1.4;
  letter-spacing: .14em; text-transform: uppercase;
  color: var(--text);
}

.vcx-recht__text {
  margin: 0;
  font-size: 12.5px; line-height: 1.65;
  color: var(--text-muted);
}

@media (max-width: 600px) {
  .vcx-recht { margin-top: var(--s-8); padding-top: var(--s-6); }
}

/* ============================================================
   DIE KONDITIONEN-KARTE (12.10.2026)

   BETREIBERANSAGE: "So bekommst du eine richtige Karte, einfach so ein
   Badge, das einfach viel besser zu sehen und auffaelliger ist."

   AUFFAELLIG OHNE BEWEGUNG. Die Seite hat die ausdrueckliche Vorgabe
   "nicht zu viel Animation"; was hier auffaellt, sind ein Akzentrahmen,
   ein leiser Schimmer aus derselben Farbe und EINE grosse Zeile. Kein
   Puls, kein Verlaufswandern, kein Hover-Effekt - eine Karte, die
   Konditionen nennt, soll sachlich wirken, nicht wie ein Angebot, das
   gleich ablaeuft.

   IN DER SPUR DER SCHRITTE: 760 Pixel wie alles darunter. Sie steht
   ausserhalb von .fs-steps (zwischen Kopf und erster Karte) und braucht
   die Breite deshalb selbst.
   ============================================================ */
/* SCHMALER ALS DIE ANDEREN KARTEN (560 statt 760) und bewusst KEINE
   .card: Betreiberansage vom 12.10.2026 - "Mach mal die Karte ein bisschen
   einzigartiger. Die kann auch diese gewisse Gradientenfarbe haben, aber
   so, dass man das viel besser, also viel auffaelliger sieht. Die muss
   auch nicht so gross sein."

   DASS SIE SCHMALER IST, MACHT SIE AUFFAELLIGER, nicht kleiner: Zwischen
   zwei 760er Spuren faellt eine 560er auf, weil sie aus der Flucht
   heraussticht. Eine breitere haette sich eingereiht. */
.vcx-kondition {
  position: relative;
  max-width: 560px; margin: 0 auto var(--s-8);
  padding: var(--s-6); text-align: center;
  border-radius: var(--r-card);
  background: #0e0f19;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.04),
    0 14px 44px rgba(146,80,236,0.22);
}

/* DER RAHMEN IST DER VERLAUF SELBST - das hat keine andere Karte im
   Portal, und genau darum geht es.

   WIE DAS GEHT: Ein Pseudo-Element liegt deckungsgleich auf der Karte und
   ist ganz mit dem Verlauf gefuellt. Zwei Masken darueber - eine auf die
   Innenflaeche, eine auf die ganze - loeschen sich per exclude gegenseitig
   aus, uebrig bleibt der 1,5 Pixel breite Rand. Ein echter
   border-image kaeme ohne Radius aus, und border-image mit Radius
   funktioniert nicht.

   ::before UND NICHT ::after: Bei .card ist ::before im Glas-Thema fuer
   den Eckglanz belegt - deshalb traegt diese Karte die Klasse gar nicht
   erst. Sie ist keine Karte unter vielen, sie ist diese eine. */
.vcx-kondition::before {
  content: ''; position: absolute; inset: 0;
  border-radius: inherit; padding: 1.5px;
  background: var(--accent-gradient, linear-gradient(135deg, #7f44f4, #ef4f3c));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  pointer-events: none;
}

/* Die beiden Merkmale - gesperrte Versalien wie an den Faechern unten,
   damit die Seite eine Handschrift behaelt. */
/* WEISS, NICHT GEDAEMPFT - Betreiberansage vom 12.10.2026: "Der ganze
   Text, der da ist, das weiss sein." Die beiden Merkmale und die
   Erklaerung standen in --text-muted, also auf 55 Prozent Deckkraft. Das
   ist richtig fuer Beiwerk; hier ist es keines. */
.vcx-kondition__merkmale {
  position: relative;
  margin: 0 0 var(--s-4);
  font-size: 12px; font-weight: 600; line-height: 1.5;
  letter-spacing: .16em; text-transform: uppercase;
  color: var(--text);
}

/* DIE AUFTEILUNG IST DER KERN DER KARTE und die einzige grosse Zeile.
   Steht sie klein, liest man die Karte als Werbetext; steht sie gross,
   ist sie eine Zusage. */
.vcx-kondition__aufteilung {
  position: relative;
  margin: 0 0 var(--s-4);
  font-size: 22px; font-weight: 800; line-height: 1.3;
  letter-spacing: -.2px; color: var(--text);
  text-wrap: balance;
}

/* DIE ZAHLEN TRAGEN DEN VERLAUF SELBST.

   ERST DIE FARBE, DANN DER VERLAUF: Kann ein Browser background-clip
   nicht, bleibt es bei color und der Satz ist weiss lesbar. Ohne das
   @supports stuende bei ihm transparenter Text auf einem Verlaufsbalken -
   also gar nichts. Genau diese Zeile traegt die Zusage ueber Geld; sie
   darf unter keinen Umstaenden unlesbar werden. */
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .vcx-kondition__aufteilung {
    background: var(--accent-gradient, linear-gradient(135deg, #7f44f4, #ef4f3c));
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
  }
}

.vcx-kondition__erklaerung {
  position: relative;
  max-width: 48ch; margin: 0 auto;
  font-size: 14px; line-height: 1.6; color: var(--text);
}

/* Der Schlusssatz traegt die Pointe. Abgetrennt durch eine Linie, die
   selbst aus dem Verlauf kommt und zu den Seiten ausblendet - dasselbe
   Mittel wie am Kopf der Faecher weiter unten, nur mittig. */
.vcx-kondition__schluss {
  position: relative;
  margin: var(--s-5) 0 0; padding-top: var(--s-5);
  font-size: 15px; font-weight: 700; color: var(--text);
}
.vcx-kondition__schluss::before {
  content: ''; position: absolute; top: 0; left: 50%;
  transform: translateX(-50%);
  width: 120px; height: 1px;
  background: linear-gradient(90deg, transparent,
    var(--accent, #9250ec), transparent);
}

/* DER EQUITY-STOP - unten in der Karte, kleiner als der Rest.

   BETREIBERANSAGE vom 13.10.2026: "Kannst du auch in der Box hinzufuegen
   (unten als aber kleiner)."

   ABGESETZT DURCH EINE LINIE, nicht durch eine zweite Karte: Der Abschnitt
   gehoert zur Zusage darueber - er sagt, was im schlechtesten Fall
   passiert. In einem eigenen Kasten laese er sich wie etwas, das jemand
   anderes geschrieben hat. */
/* ZENTRIERT WIE DER REST DER KARTE (Betreiberansage vom 13.10.2026: "Mache
   bitte den Text, der linksbuendig ist, also der so kleingeschrieben ist,
   mal zentriert"). Er stand als einziger Block linksbuendig und brach
   damit die Mittelachse, an der die ganze Karte haengt. */
.vcx-kondition__stop {
  position: relative;
  margin: var(--s-6) 0 0; padding-top: var(--s-5);
  border-top: 1px solid var(--border);
  text-align: center;
}

/* UEBER DIE GANZE KARTENBREITE (Betreiberansage vom 13.10.2026: "Mach das
   Padding fuer den kleingedruckten Text breiter, sodass die Zeile generell
   breiter ist").

   HIER STAND max-width: 46ch, mit der Begruendung, zentrierter Satz brauche
   eine kurze Zeile. Das stimmt als Regel - nur nutzte der Block damit 285
   von 512 verfuegbaren Pixeln, und die Karte sah aus, als haette jemand
   vergessen, den Text zu setzen. Die Regel wog hier weniger als der
   Eindruck. */
.vcx-kondition__stop-text {
  margin: 0 0 var(--s-3);
  font-size: 12.5px; line-height: 1.6; color: var(--text-muted);
}

/* DIE EINSCHRAENKUNG IST KEINE FUSSNOTE.

   "Ein Verlust von mehr als 30 % kann nicht vollstaendig ausgeschlossen
   werden" ist der Satz, der im Streitfall zaehlt. Er steht deshalb in
   derselben Groesse wie die beiden Absaetze darueber, nicht kleiner, und
   bekommt das Warnzeichen - gelb am Zeichen, nicht am Text, wie an den
   Warnungen in den Schritten.

   Wer eine Einschraenkung leiser setzt als die Zusage, zu der sie gehoert,
   versteckt sie. Das waere hier nicht nur unschoen, sondern bei einem
   Produkt, fuer das jemand tausend Euro einzahlt, der falsche Ort zum
   Sparen. */
.vcx-kondition__stop-warnung {
  /* MITTIG ALS GRUPPE, nicht als Zeile: justify-content ruecht Zeichen und
     Text zusammen in die Mitte, align-items haelt das Zeichen oben an der
     ersten Zeile. Ohne das zweite saesse es auf halber Hoehe eines
     dreizeiligen Satzes und sieht aus, als gehoere es nirgendwohin. */
  display: flex; gap: 8px; align-items: flex-start; justify-content: center;
  margin: var(--s-4) 0 0;
  font-size: 12.5px; line-height: 1.6; color: var(--text); text-align: left;
}
.vcx-kondition__stop-warnung svg {
  flex: none; width: 15px; height: 15px; margin-top: 2px; color: var(--warn);
}

@media (max-width: 600px) {
  .vcx-kondition { padding: var(--s-5) var(--s-4); }
  .vcx-kondition__aufteilung { font-size: 18px; }
  .vcx-kondition__merkmale { letter-spacing: .12em; }
}

/* Der Akzentteil der Ueberschrift - "Trading Algorithm" neben dem Namen.
   Die Farbe stand bis zum 10.10.2026 in einem style-Attribut im Markup;
   dort laesst sich in einer Medienabfrage nichts aendern, und genau das
   braucht der Umbruch auf dem Handy weiter unten. */
.vcx-titel__akzent { color: var(--accent); }

.vcx-chart { margin: 0 0 var(--s-6); }

/* DER JAHRESUMSCHALTER - EIN GLEITER, KEINE DREI KNOEPFE.

   BETREIBERANSAGE vom 09.10.2026: "Der Umschalter sollte am besten auch noch
   viel, viel geiler werden. Am besten so ein Umschalter, der wirklich so ein
   3D-Umschalter ist, den ich dann so gut bewegen kann."

   DIE MARKIERUNG WANDERT, statt dass drei Flaechen ihre Farbe tauschen: Beim
   Klick faehrt sie zum gewaehlten Jahr. Das ist die einzige Bewegung auf
   dieser Seite und sie hat einen Grund - sie zeigt, dass man hier schieben
   kann, und wohin.

   DIE TIEFE KOMMT AUS DEM PORTAL, nicht aus einer Schatten-Spielerei: innen
   eine dunkle Mulde, auf dem Gleiter die Glanzkante und der Akzentschatten,
   die hier auch Karten und Knoepfe tragen (inset 0 1px 0 rgba(255,255,255,…)
   und 0 8px 28px rgba(146,80,236,…)). */
.vcx-chart__kopf { display: flex; justify-content: center; margin-bottom: var(--s-5); }

.vcx-chart__jahre {
  position: relative; display: inline-flex; padding: 4px; gap: 0;
  border: 1px solid var(--border-strong); border-radius: 12px;
  background: rgba(0,0,0,0.28);
  box-shadow: inset 0 2px 6px rgba(0,0,0,0.45), inset 0 -1px 0 rgba(255,255,255,0.04);
}

/* Die wandernde Markierung. Sie liegt UNTER den Knoepfen; ihre Masse setzt
   das Skript, weil nur dort bekannt ist, wie breit eine Jahreszahl rendert. */
.vcx-chart__gleiter {
  position: absolute; top: 4px; left: 0; height: calc(100% - 8px);
  border-radius: 9px; pointer-events: none;
  background: var(--accent-gradient, linear-gradient(135deg, #7f44f4, #ef4f3c));
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.25), 0 6px 18px rgba(146,80,236,0.35);
  transition: transform .28s cubic-bezier(.4, 1.3, .5, 1), width .28s cubic-bezier(.4, 1.3, .5, 1);
}

.vcx-chart__jahr {
  position: relative; z-index: 1;
  cursor: pointer; font: inherit; font-size: 13px; font-weight: 650;
  padding: 8px 22px; border: 0; border-radius: 9px;
  background: transparent; color: var(--text-muted);
  transition: color .2s ease;
}
.vcx-chart__jahr:hover { color: var(--text); }
.vcx-chart__jahr[aria-pressed="true"] { color: #fff; }
.vcx-chart__jahr:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }

/* WER NICHT ANIMIERT HABEN WILL, BEKOMMT ES AUCH NICHT. */
@media (prefers-reduced-motion: reduce) {
  .vcx-chart__gleiter { transition: none; }
}


/* DIE FLAECHE DES DIAGRAMMS - HOEHER UND SCHMALER.

   BETREIBERANSAGE vom 09.10.2026: "Mach die Y-Achse hoeher und die X-Achse
   schmaler." Aufrechte Saeulen lesen sich besser als breite Kloetze, und die
   Karte passt bei 270 Pixeln weiterhin auf einen Schirm.

   DIE FESTE HOEHE IST PFLICHT, nicht Geschmack: Chart.js laeuft hier mit
   maintainAspectRatio:false, und ohne Hoehenangabe am Elternelement waechst
   die Zeichenflaeche bei jedem Neuzeichnen weiter. Diese Regel ist mir beim
   Umbau des Umschalters einmal versehentlich mitgeloescht worden - sie darf
   nicht wieder verschwinden. */
.vcx-chart__flaeche { position: relative; height: 270px; max-width: 570px; margin: 0 auto; }

/* DER ROLLBEREICH. Auf breiten Schirmen tut er nichts - die Flaeche ist
   schmaler als er. Auf dem Handy traegt er das breitere Diagramm. */
.vcx-chart__rolle { overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch; }

@media (max-width: 720px) {
  .vcx-chart__flaeche { height: 220px; }
}

/* ============================================================
   DAS DIAGRAMM AUF DEM HANDY

   BETREIBERANSAGE vom 10.10.2026: "Es waere ganz geil, wenn man die
   Diagramme generell ein bisschen verkleinert. Wenn ihr sie dann breiter
   schiebt, sind die ganzen Balken ein bisschen breiter, und man hat mehr
   Platz fuer die Zahlen."

   DIE RECHNUNG GIBT IHM RECHT, und sie ist der Grund fuer die 560: Auf
   einem 390-Pixel-Schirm bleiben der Flaeche etwa 350 Pixel, abzueglich
   Y-Achse rund 26 je Monat. "12,99 %" braucht bei 11 Pixeln Schrift etwa
   42. Unter ungefaehr 560 Pixeln Diagrammbreite passen zwoelf Monatszahlen
   nicht nebeneinander - unabhaengig davon, wie man die Balken anordnet.
   Bei 560 sind es 43,5 je Monat, und die Schrift faellt im Skript auf 10
   Pixel, sobald es eng wird: 38 gegen 43,5, das traegt.

   NUR DAS DIAGRAMM SCHIEBT SICH, NICHT DIE SEITE. Der Rollbereich sitzt
   eng um die Zeichenflaeche. Eine Seite, die als Ganzes seitlich wackelt,
   ist auf dem Handy ein Fehler; ein Diagramm, das man schieben kann, ist
   eine Bedienung.

   FLACHER ALS AUF DEM LAPTOP: 190 statt 270. Wer schiebt, haelt das
   Diagramm im Blick und will nicht gleichzeitig senkrecht scrollen.
   ============================================================ */
@media (max-width: 600px) {
  .vcx-chart__flaeche { min-width: 560px; height: 190px; }

  /* KEIN VERLAUF UND KEINE KANTE AM RECHTEN RAND, obwohl beides als
     "hier geht es weiter"-Zeichen ueblich ist: Beide blieben auch dann
     stehen, wenn jemand schon ganz nach rechts geschoben hat, und
     schnitten dann den letzten Balken an. Ohne Skript laesst sich das
     nicht unterscheiden. Der angeschnittene Monat am Rand ist selbst das
     ehrlichere Zeichen - man sieht, dass das Diagramm weitergeht. */

  /* Das Logo nimmt auf dem Handy die halbe Breite weg (Betreiberansage vom
     10.10.2026: "Ich will das Logo, was ganz oben ist, viel kleiner
     haben").

     WIEDER width UND NICHT max-width - aus demselben Grund wie oben bei
     der Grundregel: ".content img { max-width: 100% }" aus der
     760er-Abfrage haette jede max-width hier geschlagen. Meine erste
     Fassung stand mit genau diesem Fehler da und bewirkte nichts. */
  .fs-hero__logo { width: min(100%, 120px); }

  /* DIE UEBERSCHRIFT BRICHT ZWISCHEN DEN BEIDEN HAELFTEN.

     BETREIBERANSAGE vom 10.10.2026: "Mach das bitte so, dass auch
     'Trading' auf der zweiten Zeile kommt." Vorher brach die Zeile dort,
     wo gerade kein Platz mehr war - "Venture Capital Trading" /
     "Algorithm", also mitten in den Akzentteil hinein.

     ALS BLOCK UND NICHT UEBER text-wrap: balance: balance verteilt die
     Woerter gleichmaessig, aber es garantiert keine Stelle. Hier soll der
     Umbruch nicht gleichmaessig sein, sondern an genau einer Naht liegen -
     zwischen dem Namen und der Beschreibung. */
  .vcx-titel__akzent { display: block; }

  /* ETWAS KLEINER, DAMIT ES BEI ZWEI ZEILEN BLEIBT: Die deutsche Fassung
     heisst "Trading-Algorithmus" - neunzehn Zeichen, bei 34 Pixeln fett
     rund 344 breit. Auf einem 393er Schirm bleiben nach dem Seitenrand
     etwa 361. Das ginge gerade eben auf, braeche aber auf einem iPhone SE
     (375 Pixel, davon 343 nutzbar) in eine dritte Zeile - und dann waere
     die Naht wieder verwischt, um die es hier geht. Bei 30 Pixeln sind es
     rund 304 und die Sache hat Luft.

     NUR DIESE UEBERSCHRIFT, nicht .fs-hero__title allgemein: Dieselbe
     Klasse traegt auch "Erste Schritte bei WiFi Money", und dort ist keine
     Aenderung bestellt. Der :has()-Selektor trifft genau den Titel, der
     den Akzentteil enthaelt - also diesen einen. */
  .fs-hero__title:has(.vcx-titel__akzent) { font-size: 30px; }
}

/* DER TEXT UNTER DEM DIAGRAMM LAEUFT UEBER DIE GANZE KARTE.

   BETREIBERANSAGE vom 09.10.2026: "Ich moechte gerne den Text direkt unter
   dem Graphen breiter haben." .fs-step__text haelt sonst 56 Zeichen
   Zeilenlaenge - richtig fuer die schmalen Schrittkarten, zu schmal hier. */
.fs-step--weit .fs-step__text { max-width: none; }

/* LUFT ZWISCHEN DEN ABSAETZEN (Betreiberansage vom 09.10.2026: "eine
   Leerzeile, sodass es ein bisschen cleaner zum Lesen ist"). Zwei Absaetze
   standen dicht beieinander und lasen sich wie einer. */
.fs-step--weit .fs-step__text + .fs-step__text { margin-top: var(--s-5); }

/* Der Risikohinweis: Fussnote statt Fliesstext. Kleiner und ruhiger als der
   Text darueber - aber lesbar, denn genau dieser Satz zaehlt im Zweifel
   ("Add a clearly visible disclaimer", Partnerliste vom 09.10.2026). */
.vcx-hinweis {
  font-size: 12px; line-height: 1.5; color: var(--text-faint, rgba(255,255,255,0.40));
  max-width: none; margin: var(--s-4) 0 0;
}

/* ============================================================
   EIN FACH IN DER KARTE - vom VCX-Logo abgeleitet

   BETREIBERANSAGE vom 09.10.2026: "Das kann man doch noch viel gerne
   designen, sodass es halt ein bisschen vom Logo abgeleitet ist. Ausserdem
   moechte ich, dass Important Settings und How the Registration Works eine
   eigene Karte haben, auch in der Karte selber, sodass es ein bisschen
   uebersichtlicher wirkt."

   WAS ICH AUS DEM LOGO GENOMMEN HABE - drei Dinge, nicht mehr:

   1. DIE WEIT GESPERRTEN VERSALIEN. Unter dem VCX steht "VENTURE CAPITAL"
      in duennen Grossbuchstaben mit sehr viel Luft dazwischen. Genau das
      sind jetzt die Beschriftungen der Faecher und der Datenzeilen.
   2. DIE DIAGONALE SCHNITTKANTE. V und X sind aus breiten Baendern gebaut,
      die sich schraeg schneiden. Die Nummernmarker tragen diesen Schnitt
      unten rechts - deshalb keine Kreise mehr.
   3. SCHARFE KANTEN STATT RUNDER. Das Logo hat keinen einzigen Radius. Ganz
      so weit gehe ich nicht, sonst passt die Seite nicht mehr zum Portal -
      aber die Faecher sind spuerbar kantiger als die Karten drumherum.

   WAS ICH NICHT GENOMMEN HABE: den Blechglanz der Buchstaben. Auf einer
   Flaeche von dieser Groesse wird aus einem Verlauf im Logo schnell eine
   Spielerei, und die Vorgabe fuer die ganze Seite lautet "sehr, sehr klar".
   ============================================================ */
.vcx-fach {
  max-width: 56ch; margin: var(--s-6) auto 0; text-align: left;
  padding: var(--s-5);
  border: 1px solid var(--border); border-radius: 14px;
  background: rgba(0,0,0,0.22);
}

/* Die Beschriftung des Fachs: gesperrte Versalien wie "VENTURE CAPITAL",
   daneben eine Linie, die aus dem Akzent heraus nach rechts auslaeuft -
   die Schnittkante des Logos, flach gelegt. */
.vcx-fach__kopf {
  display: flex; align-items: center; gap: var(--s-3);
  margin: 0 0 var(--s-4);
  font-size: 11.5px; font-weight: 600; line-height: 1.3;
  letter-spacing: .18em; text-transform: uppercase;
  color: var(--text-muted);
}
.vcx-fach__kopf::after {
  content: ''; flex: 1 1 auto; height: 1px; min-width: 24px;
  background: linear-gradient(90deg, var(--accent-line), transparent);
}

/* Fliesstext in einem Fach. Nicht .fs-step__text: Die Klasse zentriert sich
   mit margin:auto in der Karte und haelt 56 Zeichen - im Fach ist beides
   schon geregelt, und der Text soll dort linksbuendig an der Kante stehen. */
.vcx-fach__text {
  font-size: 14.5px; line-height: 1.6; color: var(--text-muted);
  margin: 0 0 var(--s-4);
}
.vcx-fach__text--letzter { margin-bottom: 0; }

/* DAS DATENBLATT. Die Trennlinien entstehen aus dem Abstand: ein Pixel Luft
   auf dem Rahmenfarbton, darueber die Zeilen in Kartenfarbe. So braucht
   keine Zeile einen eigenen Rahmen, und die erste und letzte bekommen die
   Rundung des Rahmens geschenkt. */
.vcx-daten {
  display: grid; gap: 1px; background: var(--border);
  border-radius: 10px; overflow: hidden;
}
.vcx-daten__zeile {
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: 4px var(--s-4);
  padding: 11px 14px; background: var(--card);
}
.vcx-daten__label {
  font-size: 11px; font-weight: 600; letter-spacing: .12em;
  text-transform: uppercase; color: var(--text-faint);
}
.vcx-daten__wert {
  font-size: 14.5px; font-weight: 650; color: var(--text); text-align: right;
}
/* Ohne Doppelpunkt kein Wertepaar - dann steht die Zeile schlicht da. */
.vcx-daten__wert--voll { text-align: left; font-weight: 500; }

/* Der Warnsatz unter dem Datenblatt. Gelb nur am Zeichen, nicht am Text:
   Ein ganzer Absatz in Warnfarbe liest sich wie ein Aushang, ein gelbes
   Dreieck vor normalem Text liest sich wie ein Hinweis. */
.vcx-fach__warnung {
  display: flex; gap: 10px; align-items: flex-start;
  margin: var(--s-4) 0 0;
  font-size: 13.5px; line-height: 1.55; color: var(--text);
}
.vcx-fach__warnung svg {
  flex: none; width: 16px; height: 16px; margin-top: 3px; color: var(--warn);
}

/* DER ABLAUF - sechs Schritte, die aufeinander folgen.
   Hier ist die Nummerierung richtig (anders als bei den Einstellungen, die
   vorher faelschlich durchnummeriert waren), und die Linie zwischen den
   Markern sagt genau das: eins nach dem anderen. */
.vcx-ablauf {
  counter-reset: vcx; list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 22px;
}
.vcx-ablauf li {
  counter-increment: vcx; position: relative; padding-left: 44px;
  font-size: 14.5px; line-height: 1.55; color: var(--text);
}

/* DER MARKER TRAEGT DEN SCHNITT DES LOGOS: unten rechts abgeschraegt, wie
   die Baender von V und X dort, wo sie sich kreuzen. Fuehrende Null, weil
   die Marker dadurch gleich breit bleiben - bei "1" neben "10" verrutscht
   sonst die Textkante. */
.vcx-ablauf li::before {
  content: counter(vcx, decimal-leading-zero);
  position: absolute; left: 0; top: 0;
  width: 28px; height: 28px;
  clip-path: polygon(0 0, 100% 0, 100% 64%, 64% 100%, 0 100%);
  display: grid; place-items: center;
  font-size: 11px; font-weight: 700; letter-spacing: .04em;
  color: var(--accent); background: var(--accent-soft);
}

/* Die Linie von Marker zu Marker. Sie startet unter dem Marker und endet
   am naechsten; der Abstand unten entspricht dem gap der Liste - aendert
   sich der eine, muss der andere mit.

   BETREIBERANSAGE vom 09.10.2026: "Bei der Karte Step 1 die Schritte ein
   bisschen weiter auseinanderziehen, weil das jetzt irgendwie ein bisschen
   eng aussieht." 14 Pixel waren zu dicht - bei einem Punkt, der ueber zwei
   Zeilen laeuft, verschmolz er mit dem naechsten. */
.vcx-ablauf li:not(:last-child)::after {
  content: ''; position: absolute; left: 13.5px; top: 32px; bottom: -22px;
  width: 1px; background: var(--border-strong);
}

/* EINE AUFZAEHLUNG OHNE REIHENFOLGE - derselbe Marker, aber ohne Zahl.

   DAS BRAUCHT ES, DAMIT DER FEHLER AUS SCHRITT 1 SICH NICHT WIEDERHOLT:
   Was man fuer eine SEPA-Auszahlung braucht (Name, IBAN, Bankverbindung),
   ist eine Aufzaehlung, keine Reihenfolge - nummeriert liest es sich, als
   muesste man es nacheinander abarbeiten. Die Raute ist der Schnitt des
   Logos, auf seine kleinste Form gebracht. */
.vcx-punkte {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 12px;
}
.vcx-punkte li {
  position: relative; padding-left: 26px;
  font-size: 14.5px; line-height: 1.55; color: var(--text);
}
.vcx-punkte li::before {
  content: ''; position: absolute; left: 2px; top: 8px;
  width: 8px; height: 8px; transform: rotate(45deg);
  background: var(--accent);
}

/* Mehrere Warnungen untereinander brauchen Luft, sonst lesen sie sich als
   ein Block und keine wird mehr einzeln wahrgenommen. */
.vcx-fach__warnung + .vcx-fach__warnung { margin-top: var(--s-3); }

/* Warnungen, die unter einem Inhalt stehen, werden von ihm abgetrennt. */
.vcx-fach__abschnitt {
  margin: var(--s-5) 0 0; padding-top: var(--s-5);
  border-top: 1px solid var(--border);
}

/* Die Fussnote unter einem Fach - abgetrennt, aber im selben Fach, weil sie
   sich auf dessen Inhalt bezieht. */
.vcx-fach__fussnote {
  margin: var(--s-4) 0 0; padding-top: var(--s-4);
  border-top: 1px solid var(--border);
  font-size: 12.5px; line-height: 1.5; color: var(--text-faint);
}

/* DIE AUSZAHLUNGSKARTE LAEUFT IN DERSELBEN SPUR WIE DIE SCHRITTE.

   Sie steht ausserhalb von .fs-steps - ausdrueckliche Vorgabe aus der
   Partnerliste: "Add this section at the very bottom of the page as a
   separate and slightly smaller information section." Ohne eigene
   Breitenangabe lief sie dort ueber die ganze Seite, waehrend die Schritte
   darueber in 760 Pixeln standen. Jetzt dieselbe Spur, damit die Seite eine
   Kante hat statt zwei. */
.vcx-auszahlung {
  max-width: 760px; margin: 64px auto 0;
  padding: 36px; text-align: center;
}

/* Der Schlusssatz - keine Fussnote eines Fachs, sondern der Abschluss der
   ganzen Karte. Deshalb ohne Trennlinie und in der Spur der Faecher. */
.vcx-auszahlung__schluss {
  max-width: 56ch; margin: var(--s-6) auto 0; text-align: left;
  font-size: 13px; line-height: 1.55; color: var(--text-faint);
}

/* Auf dem Handy wird aus dem Wertepaar ein Stapel: Bezeichnung oben, Wert
   darunter - nebeneinander waere bei "Mindesteinzahlung" kein Platz mehr. */
@media (max-width: 520px) {
  .vcx-fach { padding: var(--s-4); }
  .vcx-daten__zeile { flex-direction: column; align-items: stretch; }
  .vcx-daten__wert { text-align: left; }
  .vcx-auszahlung { padding: var(--s-5); }
}

/* Vertikal gestapelt, mittig, großzügiger Abstand */
.fs-steps { display: flex; flex-direction: column; gap: 64px; max-width: 760px; margin: 0 auto; }

.fs-step {
  position: relative;
  text-align: center;
  padding: 48px 36px 36px;   /* oben groß, damit das Badge hineinragen kann */
}
/* Badge mittig auf der oberen Kante (ragt halb heraus).
   BEWUSSTE AUSNAHME von der sonstigen Badge-Regel (transparent + Border): hier
   voll deckendes Lila, KEIN Border, weißer Text. Größe = wie das "Fast Start"-
   Badge (.fs-hero__eyebrow). Gilt nur für die Step-Badges. */
.fs-step__badge {
  position: absolute;
  top: -15px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 2;
  display: inline-block;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .6px;
  text-transform: uppercase;
  padding: 5px 14px;
  border-radius: 100px;
  color: #fff;
  background: #7f3ffb;
  border: 0;
}
.fs-step__icon {
  width: 56px; height: 56px; border-radius: 16px; margin: 0 auto 20px;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.fs-step__icon svg { width: 28px; height: 28px; stroke-width: 1.8; }
.fs-step__title { font-size: 33px; font-weight: 800; letter-spacing: -.5px; color: var(--text); margin: 0 0 var(--s-3); line-height: 1.15; }
.fs-step__text { font-size: 15px; color: var(--text-muted); line-height: 1.65; margin: 0 auto; max-width: 56ch; }

/* zentrierte Inhalte unter dem Text */
.fs-step .video { max-width: 620px; margin: var(--s-6) auto 0; }
.fs-step__cta { display: inline-flex; margin-top: var(--s-6); }

/* Weitere Services — Icon-Cards (KEINE Bilder, KEINE Pills), zentriert */
.fs-services { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s-4); margin-top: var(--s-6); text-align: center; }

/* Finish-Karte */
.fs-finish { text-align: center; padding: var(--s-8); max-width: 760px; margin: 64px auto 0; }
.theme-glass .fs-finish::before { --corner-tl: rgba(160,107,255,0.85); --corner-br: rgba(239,79,60,0.6); }
.fs-finish__icon {
  width: 56px; height: 56px; border-radius: 16px; margin: 0 auto var(--s-4);
  display: grid; place-items: center; color: #fff; background: var(--accent-gradient);
  box-shadow: 0 10px 30px var(--accent-glow);
}
.fs-finish__icon svg { width: 28px; height: 28px; }
.fs-finish__title { font-size: 24px; font-weight: 700; margin: 0 0 var(--s-2); }
.fs-finish__text { font-size: 14.5px; color: var(--text-muted); line-height: 1.65; margin: 0 auto var(--s-5); max-width: 60ch; }

@media (max-width: 760px) {
  .fs-step { padding: 44px var(--s-5) var(--s-6); }
  .fs-step__title { font-size: 27px; }
}
@media (max-width: 500px) {
  .fs-hero__title { font-size: 27px; }
}

/* =========================================================================
   AFFILIATE ACADEMY — "Advanced" gesperrt, bis Psychology Academy frei ist.
   Rein clientseitig/visuell (Verkettung via localStorage). Kein eigenes Pop-up.
   ========================================================================= */
/* Affiliate Academy: die Live-Session-Karte unter dem Seitenkopf, volle
   Breite und flach (Betreiberansage vom 18.08.2026: "die komplette Breite
   einnehmen, dementsprechend von der Laenge kuerzer, Ueberschrift ueber die
   Karte"). Lead links, Countdown rechts - eine Zeile statt eines Stapels. */
.aff-live .edu-hero { margin-top: 0; padding: var(--s-5) var(--s-6); }
.aff-live .edu-live { padding: var(--s-3) var(--s-4); justify-content: space-between; }

.aff-advanced { position: relative; }
/* gesperrt: Lektionsliste gedimmt + nicht klickbar, Overlay darüber */
.aff-advanced.is-locked .lesson-list {
  opacity: .30; filter: grayscale(.35);
  pointer-events: none; user-select: none;
}
.aff-advanced__lock { display: none; }
.aff-advanced.is-locked .aff-advanced__lock {
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 8px;
  position: absolute; left: 50%; top: 58%; transform: translate(-50%, -50%); z-index: 3;
  width: min(360px, 86%); padding: var(--s-5) var(--s-6);
  border-radius: 14px;
  background: rgba(10, 10, 15, 0.82); border: 1px solid var(--border-strong);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  box-shadow: 0 14px 40px rgba(0,0,0,0.45);
}
.aff-advanced__lock-icon {
  width: 44px; height: 44px; border-radius: 12px;
  display: grid; place-items: center; color: var(--accent);
  background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.aff-advanced__lock-icon svg { width: 22px; height: 22px; }
.aff-advanced__lock-title { font-size: 14px; font-weight: 700; color: var(--text); margin: 0; }
.aff-advanced__lock-text { font-size: 12.5px; color: var(--text-muted); line-height: 1.5; margin: 0; }

/* Der Hinweis mit Knopf (07.08.2026). Er sitzt in der Sperrschicht der
   Affiliate Academy und auf der Kurskachel von Psychology - deshalb keine
   eigene Position, sondern nur Abstand nach oben und ein zentrierter Block. */
.hinweis-karte {
  display: flex; flex-direction: column; align-items: center; gap: var(--s-3);
  margin-top: var(--s-4); padding-top: var(--s-4);
  border-top: 1px solid var(--border);
  text-align: center;
}
.hinweis-karte__frage { margin: 0; font-size: 13px; font-weight: 600; color: var(--text); }

/* =========================================================================
   EDUCATOR — Initialen-Avatare statt Bilder (Live Sessions).
   ========================================================================= */
.wk-edu__ini {
  flex: none; width: 44px; height: 44px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 13px; font-weight: 700; letter-spacing: .3px;
  color: var(--edu, var(--accent));
  background: color-mix(in srgb, var(--edu, var(--accent)) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
}
.edu-card__ini {
  width: 64px; height: 64px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 21px; font-weight: 700; letter-spacing: .5px;
  color: var(--edu, var(--accent));
  background: color-mix(in srgb, var(--edu, var(--accent)) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
}
.edu-head__ini {
  flex: none; align-self: center;
  width: 88px; height: 88px; border-radius: 18px;
  display: grid; place-items: center;
  font-size: 30px; font-weight: 700; letter-spacing: .5px;
  color: var(--edu, var(--accent));
  background: color-mix(in srgb, var(--edu, var(--accent)) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
}

/* =========================================================================
   EDUCATOR-AKZENTFARBEN (Live Sessions) — pro Educator eine zentrale Variable.
   >>> HIER anpassen/erweitern. Angewendet via .edu-eric / .edu-nick / .edu-ilija,
   die die lokale Variable --edu setzen. Kalender, Cards und Detailseite lesen
   --edu und tönen dezent (color-mix). Semantische Farben (grün/rot) unberührt. <<<
   ========================================================================= */
.theme-glass {
  --educator-eric:  #f5b62b;   /* Eric Lucas  — Gold  */
  --educator-nick:  #34d399;   /* Nick Engels — Grün  */
  --educator-ilija: #9250ec;   /* Ilija Zubiks — Lila */
}
.edu-eric  { --edu: var(--educator-eric); }
.edu-nick  { --edu: var(--educator-nick); }
.edu-ilija { --edu: var(--educator-ilija); }

/* Educator-Cards: dezenter Akzent in Educator-Farbe (Eck-Glanz-Ring + weicher Glow) */
.edu-card.edu-eric, .edu-card.edu-nick, .edu-card.edu-ilija {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth),
              0 0 26px color-mix(in srgb, var(--edu) 15%, transparent);
}
.theme-glass .edu-card.edu-eric::before,
.theme-glass .edu-card.edu-nick::before,
.theme-glass .edu-card.edu-ilija::before {
  --corner-tl: color-mix(in srgb, var(--edu) 75%, transparent);
  --corner-br: color-mix(in srgb, var(--edu) 45%, transparent);
}

/* =========================================================================
   ADMIN — POP-UPS: Typ-Umschalter (Formular), Typ-Badge (Liste) und
   Kunden-Vorschau-Pop-up (Demo/testfertig). Rein Design, keine Backend-Logik.
   ========================================================================= */
/* dezenter (optional)-Hinweis neben Labels */
.form-hint { font-weight: 400; color: var(--text-faint); }

/* WAS AN DIESEM FELD NICHT STIMMT.

   BETREIBERMELDUNG vom 09.08.2026: "Ich kann sein Profil nicht speichern. Ich
   habe nur read-only, glaube ich." Er hatte kein read-only - die Formulare
   sagten schlicht nie, was fehlte. Jetzt steht es unter dem Feld, in Rot, und
   der Kasten macht sich dafuer wieder auf. */
/* MITGLIEDERAUSWAHL MIT SUCHE.

   BETREIBERANSAGE vom 09.08.2026: "Auch die Liste zeigen und ein Suchfeld
   reinpacken, damit man denjenigen sehr schnell finden kann."

   Die Liste rollt in sich. Bei dreihundert Konten waere ein Formular sonst
   dreitausend Pixel lang, und der Speichern-Knopf laege ausser Sicht. */
.mitglieder-liste {
  max-height: 260px; overflow-y: auto;
  margin-top: var(--s-3);
  border: 1px solid rgba(255,255,255,0.10); border-radius: 10px;
  padding: var(--s-3);
  display: flex; flex-direction: column; gap: 2px;
}
.mitglieder-zeile { display: flex; align-items: center; gap: 10px; padding: 5px 6px; border-radius: 7px; }
.mitglieder-zeile:hover { background: rgba(255,255,255,0.05); }
.mitglieder-zeile__name { font-size: 13.5px; font-weight: 600; }
.mitglieder-zeile__mail { font-size: 12px; color: var(--text-faint); margin-left: auto; }
.mitglieder-leer { margin: var(--s-3) 0 0; font-size: 13px; color: var(--text-faint); text-align: center; }

/* WER IST ANGEHAKT - eigenes Feld ueber der Liste (21.08.2026).

   Betreiber: "Ich sehe nicht direkt, welche Nutzer angehakt sind." Die Zahl
   allein sagt nicht, WER; bei dreihundert Konten liegen die Haken verstreut.

   Eigener Rahmen, damit es als Feld gelesen wird und nicht als Fortsetzung
   der Liste - und mit Hoehenbegrenzung, weil eine Gruppe auch fuenfzig
   Mitglieder haben kann und das Formular sonst ins Endlose waechst. */
.mitglieder-gewaehlt {
  margin-top: var(--s-3);
  border: 1px solid rgba(255,255,255,0.10); border-radius: 10px;
  padding: var(--s-3);
}
.mitglieder-gewaehlt__titel {
  margin: 0 0 var(--s-2);
  font-size: 12px; font-weight: 600; letter-spacing: .3px;
  text-transform: uppercase; color: var(--text-muted);
}
.mitglieder-chips { display: flex; flex-wrap: wrap; gap: 6px; max-height: 130px; overflow-y: auto; }
.mitglieder-chips:empty { display: none; }
.mitglieder-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 8px 4px 10px;
  border: 1px solid var(--accent-line); border-radius: 999px;
  background: var(--accent-soft); color: var(--text);
  font-size: 12.5px; font-weight: 600;
  cursor: pointer;
}
.mitglieder-chip:hover { border-color: var(--accent); }
.mitglieder-chip__name { overflow-wrap: anywhere; }
.mitglieder-chip__weg { display: inline-flex; color: var(--text-muted); }
.mitglieder-chip__weg svg { width: 13px; height: 13px; display: block; }
.mitglieder-chip:hover .mitglieder-chip__weg { color: var(--accent); }
.mitglieder-gewaehlt .mitglieder-leer { margin: 0; text-align: left; }

.form-error {
  display: block;
  margin-top: 5px;
  font-size: 12px; font-weight: 600;
  color: #f87171;
}
.form-error::before { content: "! "; font-weight: 700; }

/* Segmentierter Typ-Umschalter im Formular: Bild + Text / Nur Text */
.pop-type {
  display: flex; gap: 4px; padding: 4px;
  border-radius: var(--r-item);
  background: rgba(255,255,255,0.03); border: 1px solid var(--border);
}
.pop-type__btn {
  flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  padding: 9px 14px; border: none; background: transparent;
  color: var(--text-muted); font-size: 13px; font-weight: 600;
  border-radius: 7px; cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
.pop-type__btn svg { width: 15px; height: 15px; }
.pop-type__btn:hover { color: var(--text); }
.pop-type__btn.is-active { background: var(--accent); color: #fff; box-shadow: 0 6px 18px var(--accent-glow); }

/* Bild-Feld ausblenden, wenn Typ = "Nur Text" */
.form-panel.is-text-only .form-field--img { display: none; }

/* Typ-Badge in der Liste (neutrale Glas-Pille) */
.type-badge {
  display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0;
  padding: 4px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 600;
  color: var(--text-muted); background: rgba(255,255,255,0.04); border: 1px solid var(--border);
}
.type-badge svg { width: 13px; height: 13px; }

/* Kunden-Vorschau-Pop-up (nutzt .modal/.modal__panel-Basis) */
.pop-preview { max-width: 420px; }
.pop-preview__media {
  margin: 0 0 var(--s-5); border-radius: 12px; overflow: hidden;
  border: 1px solid rgba(255,255,255,0.12);
}
.pop-preview__media[hidden] { display: none; }
.pop-preview__img { display: block; width: 100%; height: auto; }
.pop-preview__text { font-size: 15px; color: var(--text); line-height: 1.6; margin: 0 0 var(--s-5); }
.pop-preview__text.is-bold { font-weight: 700; }
.pop-preview__btn { width: 100%; justify-content: center; }
.pop-preview__btn[hidden] { display: none; }

/* =========================================================================
   ADMIN — LIVE SESSIONS: Rollen-Hinweis, Themen-Tabs (verwaltbar) und
   gemeinsamer Wochenkalender (Mo–So) mit allen Educators des Themas als
   Zeilen. Frontend-Kalender-Stil (.wk-cal/.wk-sess) wiederverwendet, Sessions
   in Educator-Farbe getönt (--edu von der Zeile). Rein Design/Demo.
   ========================================================================= */
/* Rollen-Hinweis (Design-Notiz: Superadmin sieht alle, Educator nur sich) */
.adm-role-note {
  display: flex; gap: 10px; align-items: flex-start;
  padding: var(--s-4) var(--s-5); border-radius: 12px;
  background: rgba(255,255,255,0.03); border: 1px solid var(--border);
  color: var(--text-muted); font-size: 13px; line-height: 1.55;
  margin-bottom: var(--s-5);
}
.adm-role-note svg { width: 18px; height: 18px; color: var(--accent); flex: none; margin-top: 1px; }
.adm-role-note strong { color: var(--text); font-weight: 650; }

/* Kopfzeilen der beiden Views (Übersicht / Kalender) */
.adm-ov-head, .adm-cal-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap; margin-bottom: var(--s-5);
}
/* --- Educator-Seite (Note / Videos / Infos) — pro Thema, aus dem Kalender erreicht --- */
.edu-empty { color: var(--text-faint); font-style: normal; }

/* Themen-Kontext über der Educator-Seite */
.edu-ctx { font-size: 13px; color: var(--text-muted); margin: 0 0 var(--s-5); }
.edu-ctx strong { color: var(--edu, var(--accent)); font-weight: 700; }

/* Educator in der Kalender-Zeile ist klickbar (→ Educator-Seite) */
.adm-cal .wk-edu[data-edu-open] { cursor: pointer; border-radius: 8px; padding: 4px 6px; margin: -4px -6px; transition: background .15s ease; }
.adm-cal .wk-edu[data-edu-open]:hover { background: rgba(255,255,255,0.05); }
.adm-cal .wk-edu[data-edu-open]:hover .wk-edu__role { color: var(--edu, var(--text-muted)); }

/* Note-Karte */
.edu-note-row { display: flex; align-items: flex-start; gap: var(--s-4); flex-wrap: wrap; }
.edu-note-text { margin: 0; font-size: 14px; color: var(--text); line-height: 1.6; flex: 1; min-width: 0; }

/* Video-Liste: Thumbnail-Platzhalter */
.edu-vid__thumb {
  flex: none; width: 58px; height: 38px; border-radius: 7px;
  display: grid; place-items: center;
  color: var(--text-muted); background: rgba(255,255,255,0.05);
  border: 1px solid var(--border);
}
.edu-vid__thumb svg { width: 16px; height: 16px; }

/* Infos/Profil-Karte — Akzent aus Educator-Farbe (--edu) */
.edu-info-card { display: flex; align-items: flex-start; gap: var(--s-5); }
.edu-info__ini {
  flex: none; width: 56px; height: 56px; border-radius: 50%;
  display: grid; place-items: center; font-size: 18px; font-weight: 700; letter-spacing: .5px;
  color: var(--edu, var(--accent));
  background: color-mix(in srgb, var(--edu, var(--accent)) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
}
/* Das Profilbild an derselben Stelle wie die Initiale - gleiche Groesse,
   damit die Karte nicht springt, je nachdem ob ein Foto hinterlegt ist. */
/* Sessions im Kalender ziehen. Der Griff ist derselbe Dreipunkt wie in den
   sortierbaren Listen - wer ihn kennt, erkennt hier dieselbe Geste. */
.adm-sess__griff {
  cursor: grab; color: var(--text-faint); display: inline-flex; align-items: center;
  margin-right: 4px; flex-shrink: 0;
}
.adm-sess__griff:active { cursor: grabbing; }
.adm-sess__griff svg { width: 12px; height: 12px; }
.adm-sess.is-dragging { opacity: .45; }
/* Das Ziel hebt sich ab, solange die Kachel darueber schwebt - sonst weiss
   man beim Loslassen nicht, wo sie landet. */
.adm-cell.is-ziel { outline: 2px dashed var(--accent-line); outline-offset: -4px; border-radius: 8px; }
/* Kurze Rueckmeldung nach dem Speichern beziehungsweise beim Fehlschlag.
   Ohne sie liesse sich nicht unterscheiden, ob der Server die Verschiebung
   angenommen hat oder ob die Kachel nur im Browser liegt. */
.adm-sess.is-verschoben { box-shadow: 0 0 0 2px var(--green); }
.adm-sess.is-fehler { box-shadow: 0 0 0 2px var(--red); }
.edu-info__img { flex: none; width: 56px; height: 56px; border-radius: 50%; object-fit: cover; }
.edu-info__body { min-width: 0; }
.edu-info__name { font-size: 17px; font-weight: 700; color: var(--text); margin: 0 0 2px; }
.edu-info__strategy { font-size: 13px; font-weight: 600; color: var(--edu, var(--accent)); margin: 0 0 var(--s-3); }
.edu-info__desc { font-size: 14px; color: var(--text-muted); line-height: 1.6; margin: 0 0 var(--s-4); }
.edu-accent { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-muted); }
.edu-accent__dot { width: 14px; height: 14px; border-radius: 50%; background: var(--edu, var(--accent)); border: 1px solid rgba(255,255,255,0.2); }
.adm-ov-title, .adm-cal-title { font-size: 18px; font-weight: 700; margin: 0; }
.adm-cal-head { margin-top: var(--s-2); }
.adm-cal-actions { display: flex; gap: var(--s-3); flex-wrap: wrap; }   /* Educator hinzufügen + Thema verwalten in einer Reihe */

/* Themen-Übersicht: Cards (Glas), Klick → Kalender */
.adm-topic-grid { align-items: stretch; }
.adm-topic-card {
  display: flex; align-items: center; gap: var(--s-4);
  text-align: left; cursor: pointer;
}
.adm-topic-card__ico {
  flex: none; width: 46px; height: 46px; border-radius: 12px;
  display: grid; place-items: center;
  color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.adm-topic-card__ico svg { width: 22px; height: 22px; }
.adm-topic-card__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
.adm-topic-card__name { font-size: 16px; font-weight: 700; color: var(--text); }
.adm-topic-card__meta { font-size: 12.5px; color: var(--text-muted); }
.adm-topic-card__manage {
  flex: none; width: 34px; height: 34px; border-radius: 8px;
  display: grid; place-items: center;
  border: 1px solid var(--border); background: rgba(255,255,255,0.03);
  color: var(--text-muted); cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.adm-topic-card__manage:hover { color: var(--text); border-color: var(--border-strong); background: var(--card-hover); }
.adm-topic-card__manage svg { width: 16px; height: 16px; }

/* Danger-Button (Löschen) + kleine Button-Varianten */
/* Eine Karte, deren Knopf nicht rueckgaengig zu machen ist. Der Rahmen ist
   die Warnung - der Knopf allein geht in einer langen Seite unter. */
.card--danger { border-color: rgba(255,59,48,0.30); }
.card--danger .section-title { color: #ff8079; }

.btn--danger { background: rgba(255,59,48,0.14); border: 1px solid rgba(255,59,48,0.40); color: #ff6b60; }
.btn--danger:hover { background: rgba(255,59,48,0.22); color: #ff8079; }
.btn--xs { padding: 5px 10px; font-size: 12px; min-width: 0; }
.btn--sm { padding: 7px 13px; font-size: 13px; }

/* Nur im "Thema verwalten"-Modus sichtbar (Abbrechen + Thema löschen) */
#topicPanel .topic-manage-only { display: none; }
#topicPanel.is-manage .topic-manage-only { display: inline-flex; }

/* Educator-Verwaltung im Thema-Formular: Liste + "Educator hinzufügen" */
.adm-edu-list { display: flex; flex-direction: column; gap: var(--s-2); }
.adm-edu-row {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 12px; border-radius: 10px;
  border: 1px solid var(--border); background: rgba(255,255,255,0.03);
}
.adm-edu-row__dot { width: 11px; height: 11px; border-radius: 50%; flex: none; background: var(--accent); }
.adm-edu-row__name { flex: 1; min-width: 0; font-size: 13.5px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-edu-row__confirm { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12.5px; color: var(--text-muted); }
.adm-edu-list + .btn { margin-top: var(--s-3); }   /* Abstand zwischen Liste und "Educator hinzufügen" */

/* Educator-Seite: Infos + Note nebeneinander (2 Karten, gleiche Höhe) */
.edu-cols { align-items: stretch; }
.edu-panel { display: flex; flex-direction: column; }
.edu-panel__head {
  display: flex; align-items: center; justify-content: space-between; gap: var(--s-3);
  margin-bottom: var(--s-4); padding-bottom: var(--s-3); border-bottom: 1px solid var(--border);
}
.edu-panel__title { font-size: 16px; font-weight: 700; margin: 0; }

/* Educator-hinzufügen-Modal: Modus-Umschaltung (bestehend / neu) */
#eduModal .edu-mode { display: none; }
#eduModal.is-existing .edu-mode--existing { display: flex; }
#eduModal.is-new .edu-mode--new { display: flex; }

/* Platzhalter-Hinweis (leeres Thema / keine Sessions) */
.adm-cal-hint { color: var(--text-faint); font-size: 13px; margin: 0 0 var(--s-4); }

/* Admin-Kalender (auf .wk-cal aufsetzend): Educator-Name in Educator-Farbe,
   Zellen als Flex-Spalte (Blöcke oben, "+" unten) */
.adm-cal .wk-edu__name { color: var(--edu, var(--text)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-cal .wk-edu:hover .wk-edu__name { color: var(--edu, var(--text)); }
.adm-cal .wk-cal__cell { height: auto; }
.adm-cal .adm-cell { display: flex; flex-direction: column; gap: 8px; min-height: 104px; height: 100%; }
.adm-cal .wk-sess { height: auto; }

/* Schmalere Educator-Spalte → mehr Platz für die Mo–So-Spalten (breiter/gleich verteilt) */
.adm-cal { min-width: 820px; }
.adm-cal .wk-cal__corner, .adm-cal .wk-cal__edu { width: 148px; }
.adm-cal .wk-cal__edu { padding: var(--s-3); }
.adm-cal .wk-edu { gap: 9px; }
.adm-cal .wk-edu__ini { width: 34px; height: 34px; font-size: 11px; }
.adm-cal .wk-edu__name { font-size: 13px; }
.adm-cal .wk-edu__role { font-size: 10px; }

/* "+"-Button in der Kalenderzelle */
.adm-add--cell { margin-top: auto; padding: 6px; }

/* Session-Block: wie .wk-sess (getönt in Educator-Farbe) + Aktionen */
.adm-sess { position: relative; }
.adm-sess.is-off { opacity: .5; }
.adm-sess__actions { display: flex; gap: 6px; margin-top: 4px; }
.adm-sess__btn {
  display: inline-grid; place-items: center; width: 24px; height: 24px;
  border-radius: 6px; border: 1px solid rgba(255,255,255,0.14);
  background: rgba(0,0,0,0.25); color: var(--text-muted); cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.adm-sess__btn:hover { background: rgba(0,0,0,0.4); color: #fff; }
.adm-sess__btn--danger:hover { color: var(--red); border-color: rgba(255,59,48,0.4); }
.adm-sess__btn svg { width: 13px; height: 13px; }
.adm-sess__off {
  font-size: 8.5px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase;
  color: var(--text-faint); border: 1px solid var(--border);
  background: rgba(255,255,255,0.04); padding: 1px 6px; border-radius: var(--r-pill);
}
/* Wiederholungs-Badge am Session-Block */
.adm-sess__rep {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 10px; font-weight: 600; color: rgba(255,255,255,0.72);
}
.adm-sess__rep svg { width: 11px; height: 11px; opacity: .85; }

/* "+ Session" — leere Zelle / hinzufügen */
.adm-add {
  width: 100%; margin-top: auto;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  padding: 8px; border: 1px dashed var(--border-strong); background: transparent;
  color: var(--text-faint); font-size: 12px; font-weight: 600; border-radius: 8px;
  cursor: pointer; transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.adm-add svg { width: 14px; height: 14px; }
.adm-add:hover { color: var(--text); border-color: var(--accent-line); background: rgba(255,255,255,0.02); }

/* =========================================================================
   DASHBOARD — ZUGANG-GEFÄHRDET-WARNUNG + 7-TAGE-COUNTDOWN (Design/Platzhalter).
   Warnend, aber edel im Glas-Look: dezente warme (amber/rot-orange) Tönung,
   KEINE grellen Vollflächen. Sichtbarkeit (nur bei Unterschreitung) + echter
   Countdown sind Backend. Werte anpassen: .cd-num (Tage/Std.), .access-warn__reasons.
   ========================================================================= */
.access-warn {
  position: relative; overflow: hidden;
  margin-bottom: var(--s-6);
  /* warme Tönung als Layer ÜBER dem Glas-Grund (dezent, nicht deckend) */
  background-image:
    radial-gradient(130% 150% at 100% 0%, rgba(245,166,35,0.12), transparent 55%),
    radial-gradient(130% 150% at 0% 130%, rgba(255,86,60,0.10), transparent 55%);
  border: 1px solid rgba(245,166,35,0.38);
}
/* Eck-Glanz (::before-Ring der Glas-Card) warm einfärben */
.theme-glass .access-warn::before {
  --corner-tl: rgba(245,166,35,0.75);
  --corner-br: rgba(255,86,60,0.65);
}
/* Demo-Pille: eigene Zeile ÜBER dem Titel (statisch, überlappt nichts) */
.access-warn__badge {
  display: inline-flex; align-items: center; margin-bottom: var(--s-4);
  max-width: calc(100% - 44px);   /* lässt rechts Platz für den Close-Button */
  font-size: 10px; font-weight: 600; letter-spacing: .3px; text-transform: uppercase;
  color: #ffc98a; background: rgba(245,166,35,0.12);
  border: 1px solid rgba(245,166,35,0.30); padding: 3px 9px; border-radius: var(--r-pill);
}
/* Close-Button oben rechts (dezent, Glas) */
.access-warn__close {
  position: absolute; top: var(--s-4); right: var(--s-4);
  width: 30px; height: 30px; border-radius: 8px;
  display: grid; place-items: center;
  color: var(--text-muted); background: rgba(255,255,255,0.04);
  border: 1px solid var(--border); cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.access-warn__close:hover { color: var(--text); background: rgba(255,255,255,0.08); border-color: var(--border-strong); }
.access-warn__close svg { width: 15px; height: 15px; }
.access-warn__main { display: flex; align-items: center; gap: var(--s-6); flex-wrap: wrap; }
.access-warn__icon {
  flex: none; width: 46px; height: 46px; border-radius: 12px;
  display: grid; place-items: center; align-self: flex-start;
  color: #ffb347; background: rgba(245,166,35,0.14); border: 1px solid rgba(245,166,35,0.40);
}
.access-warn__icon svg { width: 24px; height: 24px; }
.access-warn__body { flex: 1 1 320px; min-width: 0; padding-right: var(--s-6); }
.access-warn__title { font-size: 17px; font-weight: 700; color: var(--text); margin: 0 0 4px; }
.access-warn__text { font-size: 13.5px; color: var(--text-muted); line-height: 1.6; margin: 0; }
.access-warn__reasons { list-style: none; margin: var(--s-3) 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.access-warn__reasons li { display: flex; align-items: center; gap: 9px; font-size: 13px; color: var(--text); }
.access-warn__reasons li::before {
  content: ""; width: 7px; height: 7px; border-radius: 50%; flex: none;
  background: #ff6b3d; box-shadow: 0 0 8px rgba(255,107,61,0.6);
}
.access-warn__reasons strong { font-weight: 700; }
.access-warn__cur { color: var(--text-faint); }

/* Countdown-Spalte (rechts; wandert auf schmalen Screens unter den Text) */
.access-warn__count { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-start; gap: var(--s-3); min-width: 210px; }
.access-warn__count-label { font-size: 12px; color: var(--text-muted); }
.access-warn__timer { display: flex; align-items: center; gap: 10px; }
.cd-unit {
  display: flex; flex-direction: column; align-items: center; min-width: 58px;
  padding: 9px 12px; border-radius: 10px;
  background: rgba(0,0,0,0.28); border: 1px solid rgba(245,166,35,0.30);
}
.cd-num { font-size: 24px; font-weight: 800; line-height: 1; color: #ffd9a0; font-variant-numeric: tabular-nums; }
.cd-lbl { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--text-faint); margin-top: 5px; }
.cd-sep { font-size: 22px; font-weight: 800; color: rgba(245,166,35,0.55); }
.access-warn__cta { width: 100%; justify-content: center; margin-top: 2px; }

@media (max-width: 640px) {
  .access-warn__body { padding-right: 0; }
  .access-warn__count { min-width: 0; width: 100%; }
}

/* =========================================================================
   DASHBOARD v12 — übernommenes Layout (nur index.html nutzt diese Klassen).
   Bewusst NICHT übernommen: der lila→orange Gradient der Referenz für die
   Fortschrittsbalken. Es gilt weiter unsere zentrale Optik
   (.progress/.status-bar = Track mit dezentem Border, Fortschritt = dünne
   weisse Linie) — siehe Block "ZENTRALE PILLEN/BADGES + FORTSCHRITTSBALKEN".
   ========================================================================= */

/* ---- Status-Card: grosse Kennzahlen (30-Tage-Vol / Balance) ---- */
.status-grid--big { gap: var(--s-8); margin-top: var(--s-5); margin-bottom: 0; }
.kv__value--big {
  display: block; font-size: 30px; font-weight: 800; letter-spacing: -.5px;
  color: var(--text); margin: 8px 0 2px;
}
.kv__value-req { display: block; font-size: 16px; font-weight: 600; color: var(--text-muted); margin: 0 0 22px; }
/* nur Höhe/Abstand — Farbe/Optik kommt aus unserer zentralen Balken-Gestaltung */
.status-bar--big { height: 8px; margin-bottom: 10px; }

/* ---- Status-Card rechts: Letzte Trades (Feed aus dem Trading Journal) ---- */
.trade-feed .mini-item { align-items: center; }
.trade-feed__dir {
  flex-shrink: 0; width: 30px; height: 30px; border-radius: 9px;
  display: grid; place-items: center; border: 1px solid currentColor;
}
.trade-feed__dir.is-up   { background: var(--green-soft); border-color: rgba(34,197,94,0.35); }
.trade-feed__dir.is-down { background: var(--red-soft);   border-color: rgba(255,59,48,0.35); }
.trade-feed__dir svg { width: 15px; height: 15px; }
.trade-feed__pnl { flex-shrink: 0; font-size: 13px; font-weight: 700; }
.trade-side {
  display: inline-block; font-size: 10px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .3px; padding: 1px 6px; border-radius: var(--r-pill);
  margin-left: 5px; vertical-align: middle;
}
.trade-side.is-long  { color: var(--green); background: var(--green-soft); }
.trade-side.is-short { color: var(--red);   background: var(--red-soft); }

/* ---- Nächste Live Sessions: Tag/Uhrzeit-Boxen ----
   ANPASSUNG ggü. Referenz: ALLE Boxen einheitlich LILA getönt (keine
   gold/grün/türkis-Varianten) und die Schrift darin WEISS. */
.session-item { align-items: center; gap: var(--s-4); }
.session-item__day {
  flex-shrink: 0; width: 158px; height: 42px; padding: 0 14px;
  border-radius: 10px; display: inline-flex; align-items: center; justify-content: center;
  gap: 7px; white-space: nowrap;
  color: #fff;                          /* Wochentag + Uhrzeit weiss */
  background: var(--accent-soft);       /* dezent lila getönt */
  border: 1px solid var(--accent-line);
}
.session-item__dayname  { font-size: 14px;   font-weight: 800; letter-spacing: .1px; color: #fff; }
.session-item__dash     { font-size: 13px;   font-weight: 600; opacity: .5; }
.session-item__daytime  { font-size: 12.5px; font-weight: 600; color: #fff; }

/* ---- Portal: 3 grosse Nav-Cards (Academy / Scanner / Trading Ideas) ---- */
.nav-portal-main--3 { grid-template-columns: repeat(3, 1fr); }
.nav-portal-main--3 .portal-tile { padding: var(--s-4) var(--s-6); min-height: 0; gap: 0; justify-content: center; }
.nav-portal-main--3 .portal-tile__head { justify-content: center; }
.nav-portal-main--3 .portal-tile__title { font-size: 22px; }
@media (max-width: 1100px) { .nav-portal-main--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px)  { .nav-portal-main--3 { grid-template-columns: minmax(0, 1fr); } }

/* ---- Grosse angepinnte Ankündigung (Community Notice) ---- */
.pinned-post { padding: var(--s-8); }
.pinned-post__title {
  font-size: 25px; font-weight: 800; letter-spacing: -.3px;
  margin: 0 0 var(--s-4); display: flex; align-items: center; gap: 10px;
}
.pinned-post__body { color: var(--text-muted); font-size: 14.5px; line-height: 1.7; margin-bottom: var(--s-5); }
.pinned-post__body p { margin: 0 0 var(--s-4); }
.pinned-post__body p:last-child { margin-bottom: 0; }
.pinned-post__foot {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap;
  padding-top: var(--s-5); border-top: 1px solid rgba(255,255,255,0.06);
}
.pinned-post__cta { flex-shrink: 0; }

/* Hinweis im Warn-Block: 4-Wochen-Prüfzeitraum / Countdown startet nach 3 Wochen */
.access-warn__note {
  margin: var(--s-3) 0 0; font-size: 12.5px; line-height: 1.55;
  color: var(--text-muted);
}
.access-warn__note strong { color: var(--text); font-weight: 650; }

/* =========================================================================
   LIVE SESSIONS — Educator-Bilder (ersetzen die Initialen-Kreise).
   Kalender + Educator-Cards: runde Bilder · Detailseite: kleiner Bildrahmen.
   Bild-Quelle ist Platzhalter (/assets/eric-lucas.webp) bis eigene Fotos da sind.
   ========================================================================= */
/* Educator-Card (unter dem Kalender): rundes Bild in Educator-Farbe gerahmt */
.edu-card__img {
  width: 64px; height: 64px; border-radius: 50%; object-fit: cover; flex: none;
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--edu, var(--accent)) 12%, transparent);
}
/* Detailseite: Bild im kleinen Rahmen (Passepartout in Educator-Farbe) */
.edu-head__frame {
  flex: none; align-self: center;
  width: 88px; height: 88px; border-radius: 18px; padding: 5px;
  display: grid; place-items: center;
  background: color-mix(in srgb, var(--edu, var(--accent)) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--edu, var(--accent)) 45%, transparent);
}
.edu-head__img {
  width: 100%; height: 100%; border-radius: 13px; object-fit: cover; display: block;
}

/* =========================================================================
   RECHTLICHES — dezenter Sidebar-Link (unten, abgesetzt) + Seite mit den
   zwei Abschnitten Impressum / Datenschutzerklärung (Platzhalter-Texte).
   ========================================================================= */
/* Sidebar-Link: bewusst unauffällig, klar vom Menü abgesetzt */
.sidebar__legal {
  display: block; padding: 2px 2px var(--s-3);
  font-size: 11.5px; color: var(--text-faint);
  transition: color .15s ease;
}
.sidebar__legal:hover { color: var(--text-muted); text-decoration: underline; }
.app.collapsed .sidebar__legal { display: none; }   /* eingeklappt: ausblenden */

/* Sprungmarken oben auf der Seite */
.legal-nav { display: flex; flex-wrap: wrap; gap: var(--s-3); margin-bottom: var(--s-6); }
.legal-nav__link {
  display: inline-flex; align-items: center; padding: 7px 14px;
  border-radius: var(--r-pill); border: 1px solid var(--border);
  background: rgba(255,255,255,0.03);
  font-size: 13px; font-weight: 600; color: var(--text-muted);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.legal-nav__link:hover { color: var(--text); border-color: var(--accent-line); background: var(--accent-soft); }

/* Abschnitts-Karten */
/* DER KOPFBEREICH IST STICKY und schwebt ueber dem Inhalt. Mit nur 32px
   Abstand landete die Ueberschrift eines Abschnitts DAHINTER - man sprang
   richtig, sah aber nicht, dass man angekommen war.

   Betreiberbefund vom 08.08.2026: "Der Link von Financial und Education
   Disclaimer wird nicht richtig zum Link weitergeleitet." Er wurde
   weitergeleitet; die Ueberschrift war nur verdeckt. */
.legal-sec { margin-bottom: var(--s-6); scroll-margin-top: calc(var(--header-h) + var(--s-4)); }
.legal-sub { scroll-margin-top: calc(var(--header-h) + var(--s-4)); }
.legal-sec__head {
  display: flex; align-items: center; gap: var(--s-4);
  padding-bottom: var(--s-4); margin-bottom: var(--s-5);
  border-bottom: 1px solid var(--border);
}
.legal-sec__icon {
  flex: none; width: 40px; height: 40px; border-radius: 11px;
  display: grid; place-items: center;
  color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-line);
}
.legal-sec__icon svg { width: 20px; height: 20px; }
.legal-sec__title { font-size: 20px; font-weight: 700; margin: 0; }
.legal-sec__body { font-size: 14px; line-height: 1.7; color: var(--text-muted); max-width: 78ch; }
.legal-sec__body p { margin: 0 0 var(--s-4); }
/* Platzhalter-Zeile deutlich, aber dezent hervorgehoben */
.legal-placeholder {
  font-weight: 650; color: var(--text);
  padding: var(--s-3) var(--s-4); border-radius: 10px;
  background: rgba(255,255,255,0.04); border: 1px dashed var(--border-strong);
}
.legal-list { margin: 0; padding-left: 1.15rem; display: flex; flex-direction: column; gap: 6px; }
.legal-list li { font-size: 13.5px; }
.legal-list li + li { margin-top: 2px; }

/* Die gewählte Sprachfassung der Rechtstexte (siehe RechtlichesController) */
.legal-nav__link.is-active {
  color: var(--text); border-color: var(--accent-line); background: var(--accent-soft);
}

/* Überschriften INNERHALB eines Rechtstextes. Ein Impressum besteht aus
   benannten Blöcken ("Kontakt", "EU-Streitschlichtung"); ohne Gliederung wird
   daraus eine Textwand, in der niemand die Anschrift findet. */
.legal-sub {
  font-size: 15px; font-weight: 700; color: var(--text);
  margin: var(--s-6) 0 var(--s-3);
}
.legal-sec__body > .legal-sub:first-child { margin-top: 0; }
.legal-sub--klein { font-size: 13.5px; font-weight: 650; color: var(--text-muted); margin-top: var(--s-5); }

/* Fußnote: Übersetzungshinweis, Stand der Fassung */
.legal-note {
  margin-top: var(--s-6); padding-top: var(--s-4);
  border-top: 1px solid var(--border);
  font-size: 12.5px; color: var(--text-faint);
}

.legal-sec__body a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
.legal-sec__body a:hover { color: var(--text); }
/* Steht ueber AGB und Risikohinweis, solange es die nur auf Englisch gibt. */
.legal-hinweis {
  margin: 0 0 var(--s-5);
  padding: var(--s-3) var(--s-4);
  border: 1px solid var(--border);
  border-radius: var(--r-item);
  background: var(--accent-soft);
  font-size: 13px;
  color: var(--text-muted);
}


/* Der Zeitzonen-Hinweis ueber dem Session-Kalender im Panel (08.08.2026).
   Sichtbar, aber nicht laut: Er steht ueber etwas, das man taeglich sieht -
   ein greller Kasten waere nach der dritten Woche unsichtbar. */
.adm-cal-hinweis {
  margin: 0 0 var(--s-4);
  font-size: 12.5px;
  color: var(--text-muted);
  line-height: 1.5;
}
.adm-cal-hinweis strong { color: var(--text); font-weight: 650; }

/* =========================================================================
   TUTORIAL-BUTTON + ERKLÄRVIDEO-MODAL (Scanner / Trading Journal).
   Button sitzt oben links über dem Seiteninhalt; Modal zeigt einen
   Video-Platzhalter — das echte Erklärvideo folgt.
   ========================================================================= */
.tutorial-btn { align-self: flex-start; margin-bottom: var(--s-5); }
.tutorial-btn svg { width: 17px; height: 17px; }
.tutorial-modal { max-width: 640px; text-align: left; }
.tutorial-modal .modal__title { margin-bottom: var(--s-2); }
.tutorial-modal .modal__text { margin-bottom: var(--s-5); }
.tutorial-modal .video { margin: 0; }

/* =========================================================================
   ERSTE SCHRITTE — Einführungs-Karte, Lektions-Thumbnail, nummerierte Liste,
   Video-Paar (Live Sessions) und Doppel-CTA (Scanner / Trading Journal).
   ========================================================================= */
/* Einführung: gleiche Optik wie eine Step-Karte, eigenes Badge */
.fs-intro {
  position: relative; text-align: center;
  padding: 48px 36px 36px;
  max-width: 760px; margin: 0 auto var(--s-10);
}
.fs-intro__badge {
  position: absolute; top: -15px; left: 50%; transform: translateX(-50%); z-index: 2;
  display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .6px;
  text-transform: uppercase; color: #fff; background: #7f3ffb;
  padding: 7px 16px; border-radius: var(--r-pill);
}
.fs-intro .video { margin-top: var(--s-6); }

/* Lektions-Thumbnail (Schritt 2) — klickbar zur Academy */
.fs-lesson {
  display: block; max-width: 420px; margin: var(--s-6) auto 0;
  border-radius: 14px; overflow: hidden;
  border: 1px solid var(--border); background: rgba(255,255,255,0.02);
  transition: border-color .15s ease, transform .15s ease;
}
.fs-lesson:hover { border-color: var(--accent-line); transform: translateY(-2px); }
.fs-lesson__img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
.fs-lesson__name {
  display: block; padding: 12px var(--s-4);
  font-size: 14px; font-weight: 650; color: var(--text); text-align: left;
}

/* Nummerierte Liste (Schritt 3) — linksbündig in der zentrierten Karte */
.fs-list {
  max-width: 56ch; margin: var(--s-5) auto 0; padding: 0; list-style: none;
  counter-reset: fs; display: flex; flex-direction: column; gap: 10px; text-align: left;
}
.fs-list li {
  counter-increment: fs; position: relative; padding-left: 40px;
  font-size: 14.5px; color: var(--text); line-height: 1.5;
}
.fs-list li::before {
  content: counter(fs); position: absolute; left: 0; top: -1px;
  width: 26px; height: 26px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 12.5px; font-weight: 700;
  color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-line);
}

/* Zwei Video-Platzhalter nebeneinander (Schritt 4) */
.fs-videos { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-4); margin-top: var(--s-6); }
/* Bleibt EINER der beiden Kaesten uebrig, weil sein Educator abgeschaltet
   ist, soll er nicht links kleben und rechts ein Loch lassen. Ueber :has,
   damit der Normalfall (zwei Kaesten) unangetastet bleibt - greift :has
   nicht, steht es wie vorher und nichts bricht. */
.fs-videos:has(> .fs-educator:only-child) {
  grid-template-columns: minmax(0, 420px);
  justify-content: center;
}
@media (max-width: 640px) { .fs-videos { grid-template-columns: minmax(0, 1fr); } }

/* Je Educator ein Kasten: Video, Name, Leitfaden - untereinander.
   Der Leitfaden fehlt, wenn kein PDF hinterlegt ist; align-content sorgt
   dafuer, dass die Spalte dann oben buendig bleibt statt zu zerlaufen. */
.fs-educator { display: grid; gap: var(--s-2); align-content: start; }
.fs-educator__name { text-align: center; font-size: 13px; font-weight: 600; color: var(--text-muted); }

/* DIE BEIDEN KAESTEN WAREN EIN STRICH - 13.08.2026, aus dem Screenshot.

   .fs-step .video setzt margin:auto links und rechts. In einem Blockkasten
   (Schritt 1) heisst das "mittig", im Raster heisst es etwas anderes: Ein
   Rasterfeld mit automatischen Aussenabstaenden dehnt sich NICHT mehr, es
   nimmt seine Inhaltsbreite. Und der einzige Inhalt - die Beschriftung - ist
   absolut positioniert, zaehlt also nicht. Breite null, und aspect-ratio
   machte daraus Hoehe null.

   DAS WAR SCHON AM 07.08. SO, als hier zuletzt zwei Kaesten standen. Wer
   damals "diese Platzhalter-Videos braucht man nicht" sagte, sah vermutlich
   genau diesen Strich. */
.fs-educator .video { max-width: none; margin: 0; }

/* Zwei CTAs nebeneinander (Schritt 5) */
.fs-dual-cta { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-3); margin-top: var(--s-6); }
.fs-dual-cta .btn { min-width: 190px; justify-content: center; }


/* Auswahlkasten im Projektdesign. WARUM hier und nicht in journal.css:
   Die Regel war an .journal-page gebunden – im Konto griff deshalb gar
   nichts und dort stand der nackte Browser-Kasten samt Systempfeil.
   Eine Formsprache, eine Regel. */
.year-select {
  background: rgba(255,255,255,0.05);
  border: 1px solid rgba(255,255,255,0.1);
  color: var(--text);
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  padding: 6px 12px;
  border-radius: var(--r-item);
  cursor: pointer;

  /* WARUM: Ohne appearance:none zeichnet jeder Browser seinen eigenen Pfeil –
     andere Farbe, andere Groesse, ausserhalb unseres Farbschemas. Der Pfeil
     unten ist derselbe Chevron wie in den cal-nav-btn, als Data-URI (kein
     Fremdserver – siehe KeineFremdeinbindungTest). Der rechte Innenabstand
     haelt den Text vom Pfeil frei. */
  appearance: none;
  -webkit-appearance: none;
  padding-right: 30px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238b93a7' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 9px center;
  background-size: 14px 14px;
}
.year-select:focus { outline: none; border-color: var(--accent-line); }

/* WARUM: Der Re-Sync im Dashboard war ein toter Link und ist jetzt ein
   Formular. display:contents laesst das <form> im Layout verschwinden, damit
   der Knopf exakt dort sitzt, wo vorher der Link stand. */
.sec-head__form { display: contents; }

/* Reihenfolge per Ziehen (ersetzt die Hoch/Runter-Knoepfe). */
.sort-handle { cursor: grab; }
.sort-handle:active { cursor: grabbing; }
.crud-row.is-dragging { opacity: .5; }

/* Sprachleiste: IMMER einzeilig.
   WARUM: .view-toggle hat kein flex-wrap. Bei fuenf Sprachen fiel das nicht
   auf; seit acht bricht die Leiste um oder sprengt das Fenster. Statt
   umzubrechen wird sie seitlich verschiebbar. */
/* Farbleiste teilt sich die Regel mit der Sprachleiste: beide muessen
   einzeilig bleiben und duerfen stattdessen seitlich rollen. */
.view-toggle--farben,
.view-toggle--sprachen {
  display: flex;
  flex-wrap: nowrap;
  overflow-x: auto;
  max-width: 100%;
  scrollbar-width: thin;
}
.view-toggle--sprachen .view-toggle__btn { flex: 0 0 auto; white-space: nowrap; }
/* Acht Sprachen mit ausgeschriebenem "fehlt" waeren breiter als jedes
   Fenster – hier genuegt ein Punkt. */
.view-toggle--sprachen .status-badge {
  font-size: 0;
  padding: 0;
  width: 6px; height: 6px;
  border-radius: 50%;
  margin-left: 6px;
}

/* Zwischenueberschriften in langen Bearbeiten-Fenstern.
   WARUM: Das Video-Fenster hat zehn Felder plus Sprachreiter plus Upload und
   wirkte als eine lange Liste. Gegliedert passt es in den sichtbaren Bereich,
   ohne dass ein Feld entfaellt. */
.form-section {
  grid-column: 1 / -1;
  margin: var(--s-4) 0 0;
  font-size: 12px; font-weight: 650; letter-spacing: .4px;
  text-transform: uppercase; color: var(--text-faint);
}
.form-section:first-child { margin-top: 0; }

/* Mehrfachauswahl (z. B. Unterrichtssprachen eines Educators). */
.form-checks { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-4); }
.form-check { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }
.form-check input { width: 16px; height: 16px; accent-color: var(--accent); cursor: pointer; }

/* Einspaltige Bearbeiten-Fenster.
   WARUM als Variante: Im 600px-Fenster stehen zwei schmale Spalten
   nebeneinander – bei langen Werten (bunny-Adressen, achtsprachige Titel)
   unruhig zu lesen. Kurze Fenster wie "Modul anlegen" bleiben zweispaltig,
   sonst entstuende viel Leerraum. */
.form-grid--einspaltig { grid-template-columns: 1fr; }

/* Schreibleiste unter den Textfeldern im Admin.
   WARUM: Die Felder halten Text, kein HTML. Die Leiste setzt die
   Auszeichnungen, damit niemand '# ' oder '**' auswendig lernen muss. */
.schreibleiste { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); margin-top: var(--s-2); }
.schreibleiste__knopf {
  padding: 4px 10px; border-radius: var(--r-sm); cursor: pointer;
  border: 1px solid var(--line); background: transparent;
  color: var(--text-muted); font-size: 12px; line-height: 1.4;
}
.schreibleiste__knopf:hover { color: var(--text); border-color: var(--line-strong, var(--line)); }
.schreibleiste__hinweis { color: var(--text-faint); font-size: 11px; }

/* Farbpunkt im Knopf: Die Farbe selbst muss sichtbar sein, der Name allein
   sagt nicht, welcher Gruenton gemeint ist. */
.farbpunkt {
  width: 12px; height: 12px; border-radius: 50%;
  display: inline-block; flex: 0 0 auto;
  box-shadow: 0 0 0 1px rgba(255,255,255,0.22);
}

/* Zuordnungskasten: links die Steuerung, rechts die Arbeit.
   WARUM 1fr 3fr und nicht .grid--2: Die Sprachauswahl ist EIN Feld, die
   Liste traegt bis zu hundert Zeilen. Gleich breite Spalten haetten links
   viel Leerraum und rechts Umbrueche mitten im Dateinamen.
   Betreiberentscheidung vom 04.08.2026. */
.zuordnung {
  display: grid;
  grid-template-columns: 1fr 3fr;
  gap: var(--s-6);
  align-items: start;
}
.zuordnung__steuerung { display: flex; flex-direction: column; gap: var(--s-3); }
/* KEINE MEDIENKARTE IN DER STEUERSPALTE. Am 30.08.2026 stand hier eine -
   und der Betreiber schickte ein Bild, auf dem "Type of video" dreizeilig
   umbrach und "Thumbnail" unter dem Knopf "Upload images" durchschlug.
   Der Grund: Die Spalte ist ein Viertel der Breite (1fr von 1fr 3fr), die
   Medientabelle braucht drei Spalten. Beim Sammel-Upload gibt es ohnehin kein
   Adressfeld, das eine Tabelle ordnen koennte - hier gehoeren einfach zwei
   Knoepfe untereinander. Betreiberansage: "Das wird sie nicht aendern, dass
   wir jetzt zurueck machen, so wie es vorher war." */
/* Ohne min-width sprengen lange Dateinamen die rechte Rasterspalte. */
.zuordnung__liste { min-width: 0; }
/* Ueberschrift ueber den beiden Gruppen (offen / bereits zugeordnet). */
.zuordnung__gruppe { color: var(--text-muted); font-size: 12px; margin: var(--s-4) 0 var(--s-2); }
.zuordnung__gruppe:first-child { margin-top: 0; }
/* Die zugeordneten sind erledigt - sie sollen nicht um Aufmerksamkeit
   konkurrieren mit dem, was noch zu tun ist. */
.zuordnung__erledigt { color: var(--text-faint); }

/* Unter 900px waere die linke Spalte unbedienbar schmal. */
@media (max-width: 900px) {
  .zuordnung { grid-template-columns: minmax(0, 1fr); }
}

/* Vorschaubild im Lektions-Player.
   WARUM ueber eine eigene Angabe (--video-vorschau) und nicht per
   background-image im style-Attribut: Die .video-Regel setzt ihren Verlauf
   ueber die Kurzform "background". Ein direktes background-image im Attribut
   haette ihn ersetzt, und der Kasten haette seinen Charakter verloren.

   Der dunkle Streifen dazwischen ist kein Schmuck: Ohne ihn steht die weisse
   Beschriftung auf hellen Vorschaubildern unlesbar da. */
.video--vorschau {
  background:
    radial-gradient(120% 120% at 50% 0%, rgba(146,80,236,0.10), transparent 60%),
    linear-gradient(rgba(6,7,12,0.55), rgba(6,7,12,0.55)),
    var(--video-vorschau) center / cover no-repeat,
    #0c0e16;
}

/* Dasselbe fuer den kleineren Kasten auf der Trading-Ideas-Seite.
   Ergaenzt am 07.08.2026 mit den Videoplaetzen: Der Kasten dort ist derselbe
   in klein, und ein Vorschaubild braucht er genauso. Getrennt notiert statt
   als gemeinsamer Selektor, weil .ti-video seinen eigenen Verlauf hat - ein
   .video--vorschau, .ti-video--vorschau { ... } haette dem kleinen Kasten den
   Verlauf des grossen gegeben. */
.ti-video--vorschau {
  background:
    linear-gradient(rgba(6,7,12,0.55), rgba(6,7,12,0.55)),
    var(--video-vorschau) center / cover no-repeat,
    #0c0e16;
}

/* Vorschaukachel in der Bild-Zuordnungsliste.
   WARUM ueberhaupt: Bei einem Video ordnet man ueber den Dateinamen zu, ohne
   es anzusehen. Bei einem Vorschaubild ist das Ansehen der Punkt — eine Liste
   aus blossen Dateinamen waere eine Einladung, das falsche zu erwischen. */
.bildkachel {
  width: 96px; height: 54px;           /* 16:9, wie der Kasten auf der Lektionsseite */
  object-fit: cover;
  border-radius: var(--r-sm);
  border: 1px solid var(--line);
  background: #0c0e16;                 /* solange das Bild laedt */
  flex: 0 0 auto;
}

/* =========================================================================
   MOBIL — NUR VON OBEN NACH UNTEN (23.08.2026)

   BETREIBERANSAGE: "Wichtig ist, dass du Laenge und Breite, also links und
   rechts, guckst, damit es nicht irgendwie ueberlappt oder komplett
   scrollbar ist. Man kann eigentlich nur von oben nach unten scrollen."

   DAS IST EINE ANDERE ENTSCHEIDUNG ALS BISHER, und zwar bewusst. An drei
   Stellen stand vorher "auf schmalen Schirmen seitlich rollen" - beim
   Wochenkalender, bei der Trade-Tabelle und beim Tagesstreifen im Journal.
   Seitliches Rollen ist auf dem Handy die unsichtbarste aller Gesten: Was
   rechts aus dem Bild faellt, existiert fuer die meisten nicht.

   DESHALB WIRD HIER UMGEBROCHEN, NICHT GESCHOBEN. Aus der Matrix wird eine
   Liste, aus der Tabelle werden Karten, aus dem Streifen ein Raster.

   NUR DER MITGLIEDERBEREICH. Das Panel bleibt, wie es ist - dort arbeitet
   niemand vom Handy, und .adm-cal braucht seine Breite.

   Bruchpunkte wie im Rest der Datei: 760 fuer Tablets im Hochformat, 640
   fuer Telefone, 560 fuer schmale Telefone. Keine neuen erfunden.
   ========================================================================= */

/* ---- 1) Wochenplan der Live Sessions: Matrix wird Liste ---- */

/* Die Tabelle war 860px breit und rollte in ihrem Kasten. Auf einem Telefon
   sah man Montag und ahnte den Rest.

   AUS JEDER EDUCATOR-ZEILE WIRD EIN BLOCK mit seinen Terminen darunter, und
   jede Zelle sagt selbst, zu welchem Tag sie gehoert (data-tag aus der
   Ansicht). Leere Tage verschwinden - ein Kaestchen "Dienstag: nichts" ist
   Platz ohne Inhalt. */
@media (max-width: 760px) {
  .wk-cal-wrap { overflow-x: visible; }
  .wk-cal { min-width: 0; display: block; table-layout: auto; }
  .wk-cal thead { display: none; }
  .wk-cal tbody, .wk-cal tr { display: block; }
  .wk-cal tr + tr { margin-top: var(--s-5); }

  .wk-cal th, .wk-cal td { border: none; }
  /* Mit .wk-cal davor, nicht mit !important: Die Grundregel ist
     ".wk-cal th, .wk-cal td" und damit spezifischer als eine Klasse allein.
     Ein !important hier waere der erste Dominostein - der naechste setzt
     eines dagegen. */
  .wk-cal th.wk-cal__edu {
    display: block; width: auto;
    padding: var(--s-3) var(--s-4);
    border-bottom: 1px solid var(--border);
  }
  .wk-cal__corner, .wk-cal__edu { width: auto; }

  /* Nur belegte Tage, und jeder mit seinem Kuerzel davor. */
  .wk-cal__cell { display: none; }
  .wk-cal__cell.is-session {
    display: grid;
    grid-template-columns: 44px minmax(0, 1fr);
    align-items: start;
    gap: var(--s-3);
    height: auto;
    padding: var(--s-3) var(--s-4);
  }
  .wk-cal__cell.is-session::before {
    content: attr(data-tag);
    font-size: 11px; font-weight: 700; letter-spacing: .4px;
    text-transform: uppercase; color: var(--text-faint);
    padding-top: 6px;
  }
  .wk-cal__cell.is-session > * { grid-column: 2; }
}

/* ---- 2+3) Trading Log und Tagesstreifen: siehe journal.css ----

   HIER STANDEN SIE, UND HIER WIRKTEN SIE NICHT.

   Die Journalseite laedt nach app.css noch journal.css, und dort steht alles
   mit ".journal-page" davor. Zwei Klassen schlagen eine; eine Medienabfrage
   aendert an der Spezifitaet nichts. Meine Karten-Ansicht fuer die
   Trade-Tabelle ist deshalb nie erschienen - die Tabelle rollte weiter
   seitlich, und ich habe es einen Tag lang nicht gemerkt, weil MobilTest nur
   app.css gelesen hat.

   Die Regeln stehen jetzt in journal.css, wo sie hingehoeren. Der Waechter
   liest inzwischen beide Dateien. */

/* ---- 4) Sprach- und Farbleiste: umbrechen statt rollen ----

   Acht Sprachen in einer Zeile sind auf 375px eine Rollleiste, die niemand
   sieht. Zwei Reihen Knoepfe sind kein Schoenheitsfehler, sondern die
   ehrlichere Loesung. */
@media (max-width: 640px) {
  .view-toggle--farben,
  .view-toggle--sprachen { flex-wrap: wrap; overflow-x: visible; }
}

/* ---- 5) Zweispaltiges, das auf dem Telefon untereinander gehoert ---- */
@media (max-width: 760px) {
  .edu-split { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 560px) {
  /* Kontostand und Volumen nebeneinander wurden zu zwei schmalen Saeulen mit
     abgeschnittenen Zahlen. */
  .status-grid { grid-template-columns: minmax(0, 1fr); gap: var(--s-5); }
  .status-grid--big { gap: var(--s-6); }
  /* Bezeichnung ueber dem Wert statt daneben - "Registriert seit" und ein
     Datum teilten sich sonst 300px. */
  .account-data > div { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .fs-videos { grid-template-columns: minmax(0, 1fr); }
}

/* ---- 6) Nichts darf breiter sein als der Bildschirm ----

   DER SCHLUSSRIEGEL. Die Regeln oben raeumen die bekannten Stellen; diese
   hier faengt die naechste ab, an die niemand gedacht hat - eine lange
   E-Mail-Adresse, eine Kennung ohne Leerzeichen, ein eingebettetes Video.

   overflow-x: clip statt hidden am body: hidden macht den Kasten zu einem
   Rollbehaelter und bricht position:sticky in der Kopfzeile. */
@media (max-width: 760px) {
  html, body { overflow-x: clip; }
  .content { min-width: 0; }
  .content img, .content video, .content iframe { max-width: 100%; }
  .card { overflow-wrap: anywhere; }
}

/* ---- 7) Zeilen, die auf dem Telefon umbrechen duerfen ----

   Diese Reihen stehen am Schreibtisch nebeneinander und muessen es nicht.
   Ein Umbruch kostet eine Zeile Hoehe; ohne ihn wird der Inhalt gequetscht
   oder schiebt die Seite auf.

   NUR flex-wrap, SONST NICHTS. Kein neues Layout, keine neuen Abstaende -
   die Reihen sehen aus wie vorher, sie brechen nur um, wenn der Platz nicht
   reicht. */
@media (max-width: 640px) {
  .form-actions,
  .course-card__meta,
  .donut-legend,
  .folien__leiste,
  .edu-topbar,
  .access-warn__timer { flex-wrap: wrap; }
}
@media (max-width: 560px) {
  /* "Angemeldet bleiben" und "Passwort vergessen?" teilen sich sonst 320px. */
  .field-row { flex-wrap: wrap; row-gap: var(--s-2); }
}

/* ---- 7b) DIE FALLE, DIE DIE DASHBOARD-KARTE ZU BREIT MACHTE ----

   BETREIBERBEFUND vom 23.08.2026, mit Screenshot: "Da geht die Breite auch
   schon wieder nicht gut. Das ist viel zu breit gemacht." Auf dem Bild waren
   "RE-SYNC", die Fortschrittsbalken und der Session-Titel rechts abgeschnitten.

   NICHT DER INHALT WAR ZU BREIT, DIE KARTE WAR ES. Und der Grund steht in
   einer Zeile, die harmlos aussieht: grid-template-columns: 1fr heisst
   ausgeschrieben minmax(auto, 1fr). Das auto ist ein MINDESTMASS - die Spalte
   wird nie schmaler als ihr breitester unteilbarer Inhalt. Im Statuskasten
   sitzt so einer (die Session-Zeile mit der 158px-Kachel), also wuchs die
   Spalte ueber den Bildschirm hinaus. Die Titel darin haetten Ellipsen gehabt,
   nur hatten sie ploetzlich Platz genug.

   ALLE 29 MOBIL-RASTER TRAGEN JETZT minmax(0, 1fr). Das ist keine Kosmetik an
   einer Stelle, sondern dieselbe Falle an neunundzwanzig - sie faellt beim
   Schreiben nicht auf, weil "1fr" nach "so breit wie noetig" aussieht und
   "so breit wie mindestens noetig" bedeutet.

   FLEX HAT DIESELBE FALLE unter anderem Namen: min-width: auto. Deshalb hier
   dieselbe Behandlung fuer die Zeilen, die im Dashboard nebeneinander stehen. */
@media (max-width: 900px) {
  .dash-top > *, .status-split > *, .mini-list, .mini-item { min-width: 0; }
}
@media (max-width: 560px) {
  /* Die feste Breite der Tageskachel war der unteilbare Inhalt, an dem sich
     die Spalte festhielt. Auf dem Telefon darf sie mitgehen. */
  .session-item__day { width: auto; min-width: 0; flex-shrink: 1; }
}

/* ---- 7c) Affiliate Academy: Lektionszeilen und Held ----

   BETREIBERANSAGE vom 23.08.2026: "Affiliate Academy ist auch noch nicht
   optimiert ... Es sollte dann genauso optimiert sein wie in der Akademie
   selber."

   WARUM SIE ANDERS AUSSAH: Die Academy zeigt Kurskarten in einem Raster, das
   auf eine Spalte faellt - fertig. Die Affiliate Academy zeigt Lektionszeilen,
   und eine Zeile ist etwas anderes als eine Karte: Nummer, Titel, Dauer und
   Haken stehen NEBENEINANDER, drei davon mit flex-shrink: 0. Auf dem Telefon
   blieb fuer den Titel der Rest.

   DIE DAUER RUTSCHT UNTER DEN TITEL, statt ihn zu quetschen. Nummer und Haken
   bleiben, wo sie sind - sie sind schmal und man findet die Zeile an ihnen
   wieder. */
@media (max-width: 560px) {
  /* EINE ZEILE, KEIN UMBRUCH - berichtigt am 23.08.2026.
     
     Mein erster Versuch liess die Zeile umbrechen und schob die Dauer auf
     eine eigene Zeile unter den Titel. Der Betreiber wollte sie zurueck:
     "Die Zeit links neben dem Kreis, der markiert, ob es abgeschlossen ist -
     weil diese Zeit drunter ist."

     ER HAT RECHT, UND DER UMBRUCH WAR UEBERFLUESSIG: Nummer, Dauer und Kreis
     sind zusammen keine 110px, und der Titel hat min-width: 0 samt Ellipse
     am Untertitel - er schrumpft von selbst. Ich habe ein Platzproblem
     geloest, das keines war, und dabei die Zusammengehoerigkeit von Dauer
     und Haken zerschnitten. */
  .lesson { gap: var(--s-3); padding: var(--s-4); }

  /* --s-8 rundum sind auf 360px fast ein Drittel der Breite. */
  .edu-hero { padding: var(--s-5); }
  .aff-advanced.is-locked .aff-advanced__lock { width: min(360px, 94%); padding: var(--s-4); }
}

/* ---- 8) Kopfzeile und ihre Menues auf schmalen Schirmen ----

   Seit die Sperre weg ist, sind Sprachwahl und Konto-Menue wieder benutzbar -
   sie muessen dafuer aber auch hinpassen und aufgehen duerfen.

   DAS MENUE HAENGT AM RECHTEN RAND SEINES KNOPFES. Bei 360px steht der Knopf
   fast am Bildschirmrand; ein Menue von 200px ragte nach links ins Bild und
   nach rechts darueber hinaus. Mit einer Obergrenze aus der Fensterbreite
   bleibt es innerhalb - wichtig, seit html/body seitlich abschneiden: Was
   ueber den Rand ragt, waere nicht mehr erreichbar, sondern weg. */
@media (max-width: 640px) {
  .header { padding: 0 var(--s-4); gap: var(--s-3); }
  .header__actions { gap: var(--s-2); min-width: 0; }
  .account__menu {
    max-width: calc(100vw - var(--s-6));
    max-height: calc(100vh - var(--header-h) - var(--s-6));
    overflow-y: auto;
  }
  /* Der Statuspunkt reicht - "Zugang gefaehrdet" nimmt sonst die Haelfte der
     Zeile und schiebt Sprache und Konto aus dem Bild. */
  .header__actions .badge--warn { max-width: 42vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}


/* =========================================================================
   QUONI - eigener Bereich, Stand 14.09.2026 (Vorschau nur fuer
   QUONI_VORSCHAU, siehe config/quoni.php und Sichtbarkeit::NUR_VORSCHAU).

   Alle Quoni-Farben stehen im ersten .theme-glass-Block darunter. Kommen die
   endgueltigen Markenwerte, aendert sich nur dieser Block; das Zeichen liegt
   in public/assets/quoni/zeichen.png.

   Grundlage: Markenanalyse quantora-strategies.com vom 14.09.2026. Deren
   Verlauf (#8147F6 -> #F24E3F) liegt praktisch auf unserem Glass-Akzent.
   Quoni hebt sich deshalb ueber Rand-Verlauf, Glow, Lichtstreifen und
   Zeichen ab, nicht ueber neue Farben.
   ========================================================================= */
.theme-glass {
  --quoni-a:        #8147f6;
  --quoni-b:        #f24e3f;
  --quoni-gradient: linear-gradient(135deg, var(--quoni-a), var(--quoni-b));
  --quoni-soft:     linear-gradient(135deg, rgba(129,71,246,0.20), rgba(242,78,63,0.12));
  --quoni-line:     rgba(129,71,246,0.45);
  --quoni-glow:     rgba(129,71,246,0.26);
  --quoni-glow-b:   rgba(242,78,63,0.16);
  /* hellere Enden des Verlaufs - fuer Schrift auf dunklem Grund */
  --quoni-a-hell:   #a47bff;
  --quoni-b-hell:   #ff6a5c;
  /* diagonale Lichtstreifen wie auf quantora-strategies.com */
  --quoni-streaks:
    linear-gradient(120deg, transparent 52%, rgba(129,71,246,0.22) 60%, rgba(242,78,63,0.20) 64%, transparent 72%),
    linear-gradient(120deg, transparent 70%, rgba(129,71,246,0.14) 78%, transparent 86%);
}

/* Logo-Platzhalter: weisses Icon auf Verlauf */
.quoni-mark {
  display: grid; place-items: center; flex: none;
  background: var(--quoni-gradient);
  box-shadow: 0 0 18px var(--quoni-glow), inset 0 1px 1px rgba(255,255,255,0.35);
}
.quoni-mark img { width: 58%; height: 58%; object-fit: contain; display: block; }

/* =========================================================================
   1) DASHBOARD - vier Kacheln statt drei, Quoni hebt sich leicht ab
   ========================================================================= */
.nav-portal-main--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.nav-portal-main--4 .portal-tile { padding: var(--s-4) var(--s-5); min-height: 0; gap: 0; justify-content: center; }
.nav-portal-main--4 .portal-tile__head { justify-content: center; }
.nav-portal-main--4 .portal-tile__title { font-size: 19px; }
@media (max-width: 1100px) { .nav-portal-main--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* 2x2 auf dem Telefon: Icon UEBER dem Titel. Nebeneinander blieb zu wenig
   Platz, und "Academy" brach mitten im Wort um. */
@media (max-width: 620px) {
  .nav-portal-main--4 .portal-tile { padding: var(--s-4) var(--s-3); }
  .nav-portal-main--4 .portal-tile__head { flex-direction: column; gap: 8px; text-align: center; }
  .nav-portal-main--4 .portal-tile__icon { width: 38px; height: 38px; }
  .nav-portal-main--4 .portal-tile__title { font-size: 15px; }
  .portal-tile--quoni .portal-tile__body { align-items: center; }
}

.theme-glass .portal-tile--quoni {
  background-color: #0b0912;
  background-image: var(--quoni-streaks);
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth),
              0 0 26px var(--quoni-glow);
}
.theme-glass .portal-tile--quoni::before {
  --corner-tl: rgba(160,110,255,0.95);
  --corner-br: rgba(242,78,63,0.80);
  --glow-a: 34%; --glow-b: 66%;
}
.theme-glass .portal-tile--quoni:hover {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth),
              0 0 34px var(--quoni-glow), 0 0 18px var(--quoni-glow-b);
}
/* Die Glass-Regel fuer Icon-Boxen (.theme-glass .portal-tile__icon) hat
   hoehere Prioritaet als .quoni-mark und uebermalte den Verlauf. */
.theme-glass .portal-tile--quoni .portal-tile__icon.quoni-mark {
  border: 0;
  background: var(--quoni-gradient);
  box-shadow: 0 0 18px var(--quoni-glow), inset 0 1px 1px rgba(255,255,255,0.35);
}
.portal-tile--quoni .portal-tile__body { display: flex; flex-direction: column; min-width: 0; }
/* Zwei Zeilen statt Abschneiden mit "..." */
.portal-tile--quoni .portal-tile__desc {
  font-size: 11px; line-height: 1.3; color: var(--text-muted);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

/* =========================================================================
   2) SEITENLEISTE - hervorgehobene Box ganz oben unter LEARNING
   ========================================================================= */
.nav-quoni {
  position: relative; display: flex; align-items: center; gap: 10px;
  margin: 0 0 6px; padding: 9px 10px;
  border-radius: var(--r-item);
  background: var(--quoni-soft), rgba(255,255,255,0.02);
  border: 1px solid var(--quoni-line);
  box-shadow: 0 0 16px var(--quoni-glow);
  color: var(--text);
  transition: box-shadow .2s ease, border-color .2s ease, transform .1s ease;
}
.nav-quoni:hover { border-color: rgba(160,110,255,0.75); box-shadow: 0 0 22px var(--quoni-glow), 0 0 10px var(--quoni-glow-b); }
.nav-quoni .quoni-mark { width: 30px; height: 30px; border-radius: 8px; }
.nav-quoni__text { display: flex; flex-direction: column; min-width: 0; line-height: 1.2; }
.nav-quoni__title { font-size: 12px; font-weight: 750; letter-spacing: 1.2px; text-transform: uppercase; }
.nav-quoni__sub { font-size: 11.5px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nav-quoni__sub span { transition: transform .2s ease; display: inline-block; }
.nav-quoni:hover .nav-quoni__sub span { transform: translateX(3px); }
.nav-quoni.is-active { border-color: rgba(160,110,255,0.9); }
/* Eingeklappte Leiste: nur das Zeichen bleibt, wie bei den normalen Eintraegen */
.app.collapsed .nav-quoni { justify-content: center; padding: 8px 0; }
.app.collapsed .nav-quoni__text { display: none; }

/* =========================================================================
   3) LIVE SESSIONS - Quoni.com als Zeile (Wochentage leer) und als Karte
   ========================================================================= */
.edu-quoni { --edu: var(--quoni-a); }
.wk-cal tr.edu-quoni .wk-cal__edu { background: var(--quoni-soft), rgba(255,255,255,0.02); }
.wk-edu__ini.quoni-mark { width: 44px; height: 44px; border-radius: 50%; border: 0; }
.wk-cal tr.edu-quoni .wk-cal__cell { background: rgba(129,71,246,0.025); }
/* TERMINKARTE IM QUONI-VERLAUF - Betreiberwahl vom 15.09.2026 (Variante A).
   Das Violett allein (#8147f6) war von Ilija Zubiks (#9250ec) kaum zu
   unterscheiden. Gilt im Wochenplan und im Quoni-Kalender des Panels; dort
   traegt nur die Zeile von Quoni.com die Klasse edu-quoni. */
.wk-cal tr.edu-quoni .wk-sess {
  position: relative; border-left: 0; padding-left: 14px;   /* 3px Rand + 11px wie .wk-sess */
  background: linear-gradient(135deg, rgba(129,71,246,0.24), rgba(242,78,63,0.18));
  box-shadow: 0 4px 14px var(--quoni-glow-b);
}
.wk-cal tr.edu-quoni .wk-sess::before {
  content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px;
  border-radius: 8px 0 0 8px;
  background: linear-gradient(180deg, var(--quoni-a), var(--quoni-b));
}
.wk-cal tr.edu-quoni .wk-sess__time {
  background: linear-gradient(90deg, var(--quoni-a-hell), var(--quoni-b-hell));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}

.theme-glass .edu-card.edu-quoni {
  background-color: #0b0912;
  background-image: var(--quoni-streaks);
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth),
              0 0 26px var(--quoni-glow);
}
.theme-glass .edu-card.edu-quoni::before {
  --corner-tl: rgba(160,110,255,0.95);
  --corner-br: rgba(242,78,63,0.80);
}
.edu-card__ini.quoni-mark { width: 64px; height: 64px; border-radius: 50%; border: 0; }

/* =========================================================================
   4) QUONI-SEITE - One-Pager
   ========================================================================= */
.quoni-page { display: flex; flex-direction: column; gap: var(--s-8); max-width: 1080px; }

.quoni-hero {
  position: relative; overflow: hidden;
  padding: clamp(28px, 5vw, 56px);
  background-color: #0b0912 !important;
  background-image: var(--quoni-streaks), radial-gradient(60% 80% at 100% 0%, rgba(129,71,246,0.18), transparent 70%) !important;
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 40px var(--quoni-glow) !important;
}
.theme-glass .quoni-hero::before { --corner-tl: rgba(160,110,255,0.95); --corner-br: rgba(242,78,63,0.75); }
.quoni-hero__brand { display: flex; align-items: center; gap: 10px; margin-bottom: var(--s-5); }
.quoni-hero__brand .quoni-mark { width: 36px; height: 36px; border-radius: 10px; }
.quoni-hero__brand-name { font-size: 13px; font-weight: 750; letter-spacing: 1.4px; text-transform: uppercase; color: var(--text-muted); }
.quoni-hero__brand-name b { color: var(--text); }
.quoni-hero__title {
  margin: 0; max-width: 16ch;
  font-size: clamp(30px, 4.6vw, 48px); font-weight: 800; letter-spacing: -1px; line-height: 1.05;
}
.quoni-hero__title em {
  font-style: normal;
  background: var(--quoni-gradient); -webkit-background-clip: text; background-clip: text; color: transparent;
}
.quoni-hero__sub { margin: var(--s-4) 0 0; max-width: 56ch; font-size: 15.5px; line-height: 1.6; color: var(--text-muted); }
.quoni-actions { display: flex; flex-wrap: wrap; gap: var(--s-3); margin-top: var(--s-6); }

.quoni-head { margin: 0 0 var(--s-2); font-size: 24px; font-weight: 800; letter-spacing: -.4px; }
.quoni-lead { margin: 0 0 var(--s-5); max-width: 68ch; font-size: 14.5px; line-height: 1.65; color: var(--text-muted); }

.quoni-features { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-4); }
.quoni-feature { display: flex; flex-direction: column; gap: 10px; padding: var(--s-5); }
.quoni-feature__title { margin: 0; font-size: 15px; font-weight: 700; }
.quoni-feature__text { margin: 0; font-size: 13px; line-height: 1.5; color: var(--text-muted); }
@media (max-width: 1100px) { .quoni-features { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px)  { .quoni-features { grid-template-columns: minmax(0, 1fr); } }

.quoni-video {
  position: relative; display: grid; place-items: center;
  aspect-ratio: 16 / 9; width: 100%; max-width: 100%;
  border-radius: 18px; overflow: hidden; cursor: pointer;
  border: 1px solid var(--quoni-line);
  background: var(--quoni-streaks), radial-gradient(70% 90% at 50% 50%, rgba(129,71,246,0.22), #07060c 75%);
  box-shadow: 0 0 40px var(--quoni-glow);
}
.quoni-video__play {
  width: 76px; height: 76px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--quoni-gradient);
  box-shadow: 0 0 0 10px rgba(255,255,255,0.06), 0 12px 40px var(--quoni-glow);
  transition: transform .2s ease;
}
.quoni-video:hover .quoni-video__play { transform: scale(1.06); }
.quoni-video__play svg { width: 28px; height: 28px; margin-left: 4px; fill: #fff; }
.quoni-video__note { position: absolute; left: 0; right: 0; bottom: 18px; text-align: center; font-size: 12.5px; color: var(--text-muted); }

/* Vorschaubild im Quoni-Kasten (30.09.2026).

   EIGENE REGEL, aus demselben Grund wie bei .ti-video--vorschau: Der
   Quoni-Kasten hat seinen eigenen Verlauf und seine eigene Grundfarbe. Eine
   gemeinsame Regel haette ihm den Hintergrund der Akademie-Kaesten gegeben.

   OHNE DIESE ZEILEN WAERE DAS FELD IM PANEL EINE ATTRAPPE: Man koennte ein
   Vorschaubild hochladen, und auf der Seite bliebe alles, wie es war. */
.quoni-video--vorschau {
  background:
    linear-gradient(rgba(7,6,12,0.55), rgba(7,6,12,0.55)),
    var(--video-vorschau) center / cover no-repeat,
    #07060c;
}

.quoni-cats { display: flex; flex-wrap: wrap; gap: 10px; }
.quoni-cat {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 10px 16px; border-radius: 999px;
  font-size: 13.5px; font-weight: 600;
  background: rgba(255,255,255,0.03); border: 1px solid var(--glass-border, rgba(255,255,255,0.10));
}
.quoni-cat::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--quoni-gradient); }
/* =========================================================================
   AFFILIATE-DASHBOARD - Ziel-Leiste, Filterzeile, Hinweise (19.09.2026)

   GRUNDLAGE ist Ilijas Wireframe: "Kein finales Design - zeigt nur Aufbau,
   Boxen, Hierarchie und Inhalte. Farben, Typografie, Icons etc. bitte frei
   gestalten." Gebaut ist es deshalb aus den Bausteinen der Akademie; neu sind
   nur die Teile, fuer die es hier noch nichts gab.

   DIE ZIEL-LEISTE IST DER EINE NEUE BAUSTEIN. Sie soll dem Affiliate eine
   langfristige Sicht geben ("Long-Term Vision"), nicht nur eine Zahl.
   ========================================================================= */
.aff-goals { display: grid; gap: var(--s-6); }
.aff-goal__head { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s-3); margin-bottom: var(--s-3); }
.aff-goal__title { font-size: 13px; font-weight: 600; color: var(--text); }
/* WEISS WIE DIE ETAPPEN DARUNTER (Betreiberansage vom 24.09.2026: "Die Zahl mit
   USD sollte auch weiss sein"). In Akzentfarbe sah sie aus wie ein Link und
   stand in derselben Farbe wie der Balken - jetzt liest man erst die Zahl und
   sieht dann, wo sie auf der Leiste steht. */
.aff-goal__now { font-size: 14px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; }
.aff-goal__track {
  position: relative; height: 10px; border-radius: var(--r-pill);
  background: rgba(255,255,255,0.06); border: 1px solid var(--border); overflow: hidden;
}
.aff-goal__fill { position: absolute; inset: 0 auto 0 0; background: var(--accent-gradient); border-radius: var(--r-pill); }
/* Die Etappen liegen UNTER dem Balken, nicht darin: Im Balken standen sie bei
   schmalen Fenstern uebereinander. */
.aff-goal__marks { position: relative; height: 34px; margin-top: 6px; }
/* DIE ZAHLEN IMMER WEISS, DEN FORTSCHRITT ZEIGT DER PUNKT (Betreiberansage vom
   24.09.2026: "Die Zahlen sollen immer alle weiss sein, und diese Punkte
   darueber dann entweder lila, wenn es nicht erreicht wurde, aber wenn die Zahl
   erreicht wurde, dann muss es orange sein").

   Vorher trug die Zahl selbst den Zustand: erreicht hell, offen fast unsichtbar
   (--text-faint). Damit war die Leiste an den Stellen, die noch vor einem
   liegen, kaum zu lesen - also genau dort, wo das Ziel steht. Jetzt liest sich
   jede Etappe gleich gut, und die Farbe des Punkts sagt, wo man steht: lila wie
   der Anfang des Marken-Verlaufs, orange wie sein Ende. */
/* nowrap, WEIL DIE LETZTE ETAPPE SONST BRICHT: Sie sitzt auf left: 100%, also
   am rechten Rand ihres Kastens - dort bleiben null Pixel Platz, und aus
   "1 Mio." wurden zwei Zeilen. Verschoben wird sie erst danach per transform,
   und das aendert an der Breite nichts mehr. */
.aff-mark { position: absolute; top: 0; transform: translateX(-50%); text-align: center; font-size: 10.5px; color: var(--text); white-space: nowrap; }
.aff-mark:first-child { transform: translateX(0); }
.aff-mark:last-child { transform: translateX(-100%); }
.aff-mark__dot { display: block; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); margin: 0 auto 4px; }
.aff-mark.is-reached { font-weight: 600; }
.aff-mark.is-reached .aff-mark__dot { background: #ef4f3c; }

.aff-filter__label { font-size: 12.5px; color: var(--text-muted); }
/* BESCHRIFTUNG UEBER DEM FELD (Betreiberansage vom 25.09.2026: "Das Status
   soll nicht neben dem Dropdown stehen, sondern darueber als Titel").

   Die Gruppe haelt beides zusammen, wenn die Zeile umbricht - daneben stand
   die Beschriftung vorher schon aus demselben Grund. */
.aff-gruppe { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.aff-gruppe[hidden] { display: none; }

.aff-hint { margin: var(--s-4) 0 0; font-size: 12px; color: var(--text-faint); max-width: 90ch; }

/* ABSCHNITTE STATT EINER LANGEN BAHN (Betreiberansage 24.09.2026: "Ich kenne
   keinen Unterschied zwischen den Aktivitaetskennzahlen und der Uebersicht").
   Jeder Block bekommt eine Ueberschrift und einen Satz, der sagt, was die
   Zahlen darunter bedeuten. */
.aff-section { margin-top: var(--s-7); }
.aff-section:first-of-type { margin-top: var(--s-5); }
/* WEISS, NICHT GEDAEMPFT (Betreiberansage vom 24.09.2026: "Diese kleinen Titel
   'Dein Ziel', 'Aktivitaet' und 'Gesamtansicht' alle bitte in Weiss. Man soll
   das richtig sehen koennen"). Gedaempft waren sie kaum zu lesen - und sie sind
   das Einzige, was die vier Bloecke voneinander trennt. */
.aff-section__title {
  margin: 0 0 var(--s-4); font-size: 12px; font-weight: 700; letter-spacing: .8px;
  text-transform: uppercase; color: var(--text);
}

/* DIE FUENF BEREICHE DER SEITE (Betreiberansage vom 10.11.2026: "dass man
   nicht mehr scrollen muss. Dann hat man diese anderen Bereiche").

   UNTERSTRICHEN UND NICHT GEPILLT, anders als die Reiter der beiden Listen
   weiter unten: Das sind zwei verschiedene Ebenen. Oben wechselt man die
   Seite, unten eine Tabelle auf derselben Seite - saehen beide gleich aus,
   waere nicht zu erkennen, welcher Klick wie weit traegt.

   DIE LINIE IST DER VERLAUF DES HAUSES, derselbe wie an jedem aktiven
   Element. Der Einzelton bleibt als Rueckfall stehen, falls die Seite ohne
   die Verlaufs-Variable geladen wird. */
.aff-bereiche {
  display: flex; gap: var(--s-5); flex-wrap: wrap;
  margin: 0 0 var(--s-5);
  border-bottom: 1px solid var(--border);
}
.aff-bereich {
  position: relative; padding: 0 0 10px;
  font-size: 15px; font-weight: 600; color: var(--text-muted);
  text-decoration: none; white-space: nowrap;
  transition: color .15s ease;
}
.aff-bereich:hover,
.aff-bereich.is-active { color: var(--text); }
.aff-bereich.is-active::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px;
  background: var(--accent-gradient, var(--accent)); border-radius: 2px;
}
/* Die Zahl neben "Deine Leute" ist eine Zahl und keine Beschriftung - sie
   bleibt hell (Hausregel: was zaehlt, steht nicht in Grau). */
.aff-bereich__zahl {
  margin-left: 7px; padding: 1px 7px; border-radius: var(--r-pill);
  font-size: 12px; font-variant-numeric: tabular-nums;
  color: var(--text); background: var(--accent-soft);
}

/* Reiter zwischen Kundenliste und Sub-IBs - zwei Listen, nicht eine lange. */
.aff-tabs { display: flex; gap: var(--s-2); margin-bottom: var(--s-4); flex-wrap: wrap; }
.aff-tab {
  padding: 7px 14px; border-radius: var(--r-pill); cursor: pointer;
  font-size: 13px; font-weight: 600; color: var(--text-muted);
  background: transparent; border: 1px solid var(--border);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.aff-tab:hover { color: var(--text); border-color: var(--border-strong); }
.aff-tab.is-active { color: #fff; background: var(--accent); border-color: transparent; }
.aff-tab__zahl { opacity: .65; margin-left: 6px; font-variant-numeric: tabular-nums; }
/* Rechts aussen auf Hoehe der Reiter: Der Satz gehoert zur Tabelle darunter,
   nicht zu einem der beiden Reiter - deshalb so weit weg wie moeglich von
   beiden. Schmal rutscht er unter die Reiter, statt sie zu quetschen. */
.aff-tabs__hinweis { margin-left: auto; align-self: center; font-size: 12px; color: var(--text-faint); }

/* EINE SUB-IB-ZEILE KLAPPT IHRE LEUTE AUF (Betreiberansage vom 24.09.2026).
   Die ganze Zeile ist der Griff, nicht nur der Pfeil - ein zwoelf Pixel
   breites Ziel zu treffen ist Arbeit. */
.dtable tbody tr[data-aufklappen] { cursor: pointer; }
.dtable tbody tr[data-aufklappen]:hover { background: rgba(255,255,255,0.04); }
.aff-aufklapp {
  display: inline-flex; align-items: center; margin-right: 8px;
  color: var(--text-faint); transition: transform .15s ease, color .15s ease;
}
.aff-aufklapp svg { width: 13px; height: 13px; }
tr[aria-expanded="true"] .aff-aufklapp { transform: rotate(90deg); color: var(--accent); }

/* Die aufgeklappte Liste sitzt in einer eigenen Zeile ueber alle Spalten, mit
   etwas Einzug und dunklerem Grund: Man soll sehen, dass sie zu der Zeile
   darueber gehoert und nicht die Tabelle fortsetzt. */
.aff-unterzeile > td {
  padding: var(--s-4) var(--s-4) var(--s-5) var(--s-5);
  background: rgba(0,0,0,0.25);
  border-left: 2px solid var(--accent-line);
}
.aff-unterzeile[hidden] { display: none; }

/* GITTER IN BEIDE RICHTUNGEN (Betreiberansage 24.09.2026: "Jetzt gibt's halt
   nur die Linien für die horizontale Ansicht"). Als eigene Klasse, nicht an
   .dtable: Dieselbe Tabelle steht im Admin-Panel, und dort ist die ruhige
   Fassung gewollt. */
.dtable--gitter th, .dtable--gitter td { border-right: 1px solid var(--border); }
.dtable--gitter th:last-child, .dtable--gitter td:last-child { border-right: none; }

/* KOPFZEILEN DUERFEN UMBRECHEN (Betreiberansage vom 24.09.2026: "In den
   Spalten 'Net Deposit eigene Linie' und 'Net Deposit gesamte Struktur' ist
   eine Zeile reingeschrieben worden, obwohl man das alles in zwei Zeilen
   reinschreiben kann").

   .dtable setzt white-space: nowrap auf JEDE Zelle - deshalb war die Spalte so
   breit wie ihre Ueberschrift, und die Tabelle musste seitlich gerollt werden,
   obwohl die Zahlen darunter kurz sind. Hier gilt das nur fuer den Kopf und
   nur in diesen beiden Tabellen: Im Admin-Panel steht dieselbe .dtable, und
   dort ist die einzeilige Kopfzeile gewollt.

   DIE ZAHLEN BLEIBEN EINZEILIG. Eine umgebrochene Zahl liest niemand. */
.dtable--gitter thead th { white-space: normal; }

/* DIE KOPFZEILE HEBT SICH DURCH IHREN GRUND AB, NICHT DURCH IHRE LINIEN
   (Betreiberansage vom 24.09.2026: "Das mit den Gitterlinien passt doch nicht.
   Mach die Gitterlinien so wie bei den anderen darunter, und mach dann die
   Hintergruende ein bisschen heller - sodass man besser zwischen einer Zeile
   und der Spaltenzeile unterscheiden kann").

   DREI ANLAEUFE, EINE ERKENNTNIS: erst orange Linien, dann weisse rundherum -
   beide Male stach das Gitter ins Auge statt der Ueberschriften. Eine Flaeche
   trennt ruhiger als eine Linie: Der Kopf ist etwas heller als die Karte, die
   Linien laufen durch wie im Rest der Tabelle. */
.dtable--gitter thead th {
  color: var(--text);
  background: rgba(255,255,255,0.05);
  /* .dtable stellt die Zahlenspalten rechtsbuendig - fuer die Ueberschriften
     gilt das ab jetzt nicht mehr, deshalb beide Sonderfaelle ausdruecklich. */
  text-align: center;
  transition: background .15s ease;
}
.dtable--gitter thead th.num,
.dtable--gitter thead th.center { text-align: center; }

/* BEIM ZEIGEN WIRD DER GRUND ETWAS HELLER (Betreiberansage vom 24.09.2026:
   "ein bisschen grauer, also ein bisschen heller, aber nicht zu hell, damit man
   den Pfeil noch sieht"). Zusammen mit dem Pfeil sagt das vor dem Klick, dass
   hier etwas passiert - vier Hundertstel Weiss mehr reichen dafuer. */
.dtable--gitter thead th:hover { background: rgba(255,255,255,0.09); }
/* Die Beifuegung bleibt zurueckhaltender als die Ueberschrift, aber heller als
   vorher - neben weisser Schrift wirkte sie sonst wie ausgegraut. */
.dtable--gitter thead .t-unterzeile { color: var(--text-muted); }

/* SORTIEREN DURCH KLICK AUF DEN SPALTENNAMEN (Betreiberansage vom 24.09.2026).
   Der Knopf fuellt die ganze Zelle und erbt ihre Schrift - er soll nicht wie
   ein Knopf aussehen, sondern wie die Ueberschrift, die er ist. Sichtbar wird
   er beim Zeigen: Der Pfeil taucht auf, sobald die Maus darueber steht.

   text-align: inherit haelt die Zahlenspalten rechtsbuendig; ohne das saessen
   ihre Ueberschriften links und die Zahlen darunter rechts. */
/* KEIN gap AN DER ZEILE: Es gilt zwischen den Kindern auch dann, wenn eines
   davon null breit ist - zehn Spalten hielten so 40 Pixel fuer einen Pfeil
   frei, den neun von ihnen gar nicht zeigen. Der Abstand haengt deshalb am
   Pfeil selbst, und den gibt es nur in der sortierten Spalte. */
/* ALLE SPALTENNAMEN MITTIG (Betreiberansage vom 24.09.2026). Die Zahlen
   darunter bleiben rechtsbuendig - sie will man untereinander vergleichen, die
   Ueberschriften nicht. */
.dtable__sort {
  display: flex; align-items: center; justify-content: center;
  width: 100%; padding: 0; border: 0; background: none;
  font: inherit; color: inherit; letter-spacing: inherit; text-transform: inherit;
  text-align: center; cursor: pointer;
}
/* DER PFEIL BEIM ZEIGEN, OHNE DIE SPALTE ZU VERBREITERN (Betreiberansage vom
   24.09.2026: "Wenn man auf einen Spaltennamen geht, soll man auch darauf
   hovern koennen und damit sortieren").

   DER TRICK IST EIN KASTEN OHNE BREITE: Der Pfeil steckt in einem Feld, das
   null Pixel breit ist und ueber seinen Rand hinaus malen darf. So erscheint
   er beim Zeigen genau neben der Ueberschrift, ohne dass sich an der
   Spaltenbreite etwas aendert - in jeder der zehn Spalten Platz dafuer
   freizuhalten kostete 160 Pixel, und die Tabelle musste wieder gerollt
   werden.

   In der sortierten Spalte bekommt er dann doch seinen Platz: Dort bleibt er
   stehen, und er soll nicht auf dem Trennstrich liegen. */
.dtable__pfeilraum {
  display: inline-flex; align-items: center;
  width: 0; flex-shrink: 0; overflow: visible;
}
/* DIE DREHENDE SPALTE HAT KEINEN PFEIL. Er zeigt nach oben oder nach unten
   und kann drei Stufen nicht unterscheiden - bei jedem dritten Klick saehe er
   aus wie beim ersten. Was oben steht, sagt stattdessen die zweite Zeile im
   Spaltenkopf (28.10.2026). */
.dtable__sort.is-dreher .dtable__pfeilraum { display: none; }

/* ---- DIE RANGLISTE DER STAERKSTEN SUB-IBs ----

   BETREIBERANSAGE vom 28.10.2026, mit Bildschirmfoto: Titel links, "Alle
   anzeigen" rechts, darunter der Umschalter und fuenf Zeilen aus Name,
   Verdienst und einem Balken.

   NAME UND BETRAG IN EINER ZEILE, DER BALKEN DARUNTER UEBER DIE GANZE
   BREITE. Ein Balken neben dem Namen haette bei langen Namen ("Nico Joshua
   Brueggemann") nur noch eine Handbreit uebrig, und genau die Laenge ist ja
   die Aussage. */
.aff-rang__schalter { margin-bottom: var(--s-5); }

.aff-rang__alle {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 0; border: 0; background: none; cursor: pointer;
  font-family: inherit; font-size: 13px; font-weight: 600; color: var(--text-muted);
  transition: color .15s ease;
}
.aff-rang__alle:hover { color: var(--text); }
.aff-rang__alle svg { width: 14px; height: 14px; }

.aff-rang__liste { list-style: none; margin: 0; padding: 0; }
.aff-rang__zeile {
  display: grid; grid-template-columns: 1fr auto;
  align-items: baseline; gap: 6px var(--s-4);
  margin-top: var(--s-5);
}
.aff-rang__zeile:first-child { margin-top: 0; }
/* Eine ausgeblendete Zeile ist ein Raster - ohne diese Regel schlaegt ihr
   display das hidden-Attribut, und der Umschalter blendet nichts aus.
   Dieselbe Falle wie bei der Funnel-Liste am 28.10.2026. */
.aff-rang__zeile[hidden] { display: none; }

/* Ein langer Name schiebt den Betrag nicht aus der Karte, er endet mit
   Punkten; der ganze Name steht im title-Text. */
.aff-rang__name {
  min-width: 0; font-size: 16px; font-weight: 600; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.aff-rang__wert {
  font-size: 16px; font-weight: 700; color: var(--text);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* Der Balken nimmt beide Spalten - er gehoert zu Name UND Betrag. */
.aff-rang__balken {
  grid-column: 1 / -1;
  height: 3px; border-radius: var(--r-pill);
  background: rgba(255,255,255,0.07); overflow: hidden;
}
/* DER HAUSVERLAUF, NICHT DAS ROT DER VORLAGE (Betreiberansage vom
   28.10.2026). --accent-gradient ist derselbe Verlauf wie in den
   Ziel-Leisten, in der Marke und im aktiven Menuepunkt - Lila nach Rot-Orange.

   JEDER BALKEN TRAEGT IHN GANZ, so wie die Ziel-Leisten darueber: Der Verlauf
   fuellt seinen eigenen Kasten, also beginnt jeder Balken lila und endet
   orange, egal wie lang er ist. Ihn stattdessen ueber die ganze Spur zu
   legen, haette aus der Farbe eine zweite Skala gemacht - kurze Balken
   lila, lange orange - und damit dasselbe zweimal gesagt, was schon die
   Laenge sagt.

   DER FUELLSTAND IST EIN VERHAELTNIS ZUM BESTEN DER LISTE, kein Anteil an
   einem Ziel: Deshalb ist der oberste Balken immer voll, und beim Umschalten
   rechnet das Skript ihn neu. */
.aff-rang__fuell {
  display: block; height: 100%; border-radius: var(--r-pill);
  background: var(--accent-gradient);
  transition: width .25s ease;
}

@media (max-width: 620px) {
  .aff-rang__name, .aff-rang__wert { font-size: 14px; }
}
.dtable__pfeil {
  width: 12px; height: 12px; flex-shrink: 0;
  opacity: 0; transition: opacity .15s ease;
}
.dtable__sort:hover { color: var(--text); }
.dtable__sort:hover .dtable__pfeil { opacity: .5; }
/* Die Spalte, nach der gerade sortiert wird - sonst sucht man, wonach die
   Tabelle geordnet ist. */
.dtable__sort.is-sortiert { color: var(--text); }
.dtable__sort.is-sortiert .dtable__pfeilraum { width: 12px; margin-left: 4px; }
.dtable__sort.is-sortiert .dtable__pfeil { opacity: 1; }
/* Ein Pfeil, zwei Richtungen: aufsteigend zeigt er nach oben, absteigend wird
   er gedreht. Zwei Symbole zu pflegen waere doppelt so viel Markup. */
.dtable__sort.is-ab .dtable__pfeil { transform: rotate(180deg); }

/* ---- Die Tabellen auf dem Telefon (Betreiberansage vom 25.09.2026) --------
   Am Schreibtisch aendert sich nichts: Alles hier steht in einer Abfrage fuer
   schmale Bildschirme.

   DER BEFUND, gemessen bei 390 Pixern Geraetebreite: Die Tabelle war 551 breit
   und der sichtbare Ausschnitt 310 - so weit, so erwartbar bei zehn Spalten.
   Schlimm war etwas anderes: Der Browser verteilt die Breite nach Inhalt, und
   weil alle Zahlenspalten nicht umbrechen duerfen, blieben fuer die NAMEN
   36 Pixel uebrig. "Aleksandra Yilmaz" stapelte sich damit auf zwoelf Zeilen -
   eine einzige Tabellenzeile war 288 Pixel hoch, fast der halbe Bildschirm.

   ZWEI GRIFFE, MEHR NICHT:

   1. Die Namensspalte bekommt eine Mindestbreite. Danach steht ein Name in
      hoechstens zwei Zeilen, und die Tabellenzeile schrumpft auf ein Sechstel.
   2. Sie bleibt beim seitlichen Rollen stehen. Ohne das rollt man nach rechts
      zu den Zahlen und weiss nicht mehr, zu wem sie gehoeren.

   Die Breite insgesamt waechst dadurch etwas - das ist der bewusste Tausch:
   seitlich rollen kann man, eine zwoelfzeilige Zelle lesen nicht. */
@media (max-width: 620px) {
  .dtable--gitter { font-size: 12.5px; }
  .dtable--gitter th, .dtable--gitter td { padding-left: 8px; padding-right: 8px; }

  /*
   * 3. DIE UEBERSCHRIFTEN DUERFEN NICHT MITTEN IM WORT BRECHEN.
   *
   * Von weiter oben erben sie overflow-wrap: anywhere. Damit ist die kleinste
   * denkbare Breite einer Spalte EIN BUCHSTABE - und genau so hat der Browser
   * sie verteilt: "WITHDRAWALS" stand in 47 Pixeln und war 86 hoch, "NET
   * DEPOSIT gesamte Struktur" brachte es auf 165. Die Kopfzeile allein war
   * 190 Pixel hoch.
   *
   * Mit normal ist die kleinste Breite das laengste Wort, und die Verteilung
   * geht wieder auf. Keine geratene Pixelzahl noetig.
   */
  .dtable--gitter thead th { overflow-wrap: normal; font-size: 10.5px; letter-spacing: .2px; }
  .dtable--gitter thead .t-unterzeile { font-size: 9.5px; }

  .dtable--gitter th:first-child,
  .dtable--gitter td:first-child {
    position: sticky; left: 0; z-index: 2; min-width: 116px;
  }
  /* Stehenbleiben geht nur mit deckendem Grund - sonst scheint die Spalte
     durch, ueber die sie sich schiebt. Dieselben Farben wie die Flaechen
     darunter: Kopfzeile etwas heller, Karte dunkel. */
  .dtable--gitter thead th:first-child { background: #14141A; }
  .dtable--gitter tbody td:first-child { background: #0A0A0F; }
  /* In der aufgeklappten Liste liegt die Karte auf dunklerem Grund. */
  .aff-unterzeile .dtable--gitter tbody td:first-child { background: #08080C; }
  .aff-unterzeile > td { padding: var(--s-3) var(--s-2) var(--s-4) var(--s-3); }
}

/* Die zweite Zeile einer Spaltenueberschrift: "Net Deposit" oben, woher die
   Zahl kommt darunter. Kleiner und blasser, damit die Spalten in der Kopfzeile
   weiter gleich aussehen - es ist eine Beifuegung, keine zweite Ueberschrift.

   DER UMBRUCH IST ERZWUNGEN (display: block) und nicht dem Zufall der
   Spaltenbreite ueberlassen: Frei umgebrochen wurde aus einer Zeile eine von
   vier ("NET / DEPOSIT / (GESAMTE / STRUKTUR)"), je nachdem, wie viel Platz
   die Nachbarspalten gerade liessen. */
.t-unterzeile {
  display: block; text-transform: none; letter-spacing: 0;
  font-size: 10.5px; font-weight: 500; color: var(--text-faint);
}

/* KNAPPERES POLSTER ALS IN DEN ADMIN-TABELLEN: Bei neun Spalten kosten die
   vorgegebenen 16 Pixel links und rechts 72 Pixel Breite - genau die, die der
   Tabelle zum Hineinpassen fehlten. Elf Pixel reichen; die senkrechten Linien
   halten die Spalten ohnehin auseinander. */
.dtable--gitter th, .dtable--gitter td { padding-left: 11px; padding-right: 11px; }

/* Zeitraum-Waehler - oben rechts auf Hoehe der Ueberschrift, nicht unten
   (Betreiberansage 24.09.2026).

   SEINE GESTALTUNG STEHT WEITER OBEN bei .jr-filter/.zeitwahl: Seit dem
   24.09.2026 benutzt diese Seite denselben Waehler wie das Trading Journal
   ("den Time Picker, den wir auch global immer benutzen"). Die eigenen Regeln
   dafuer - ein Auswahlfeld und zwei type="date"-Felder - sind ersatzlos weg.
   Hier bleibt nur die Zeile, die ihn neben die Ueberschrift stellt. */
/* SEITENTITEL LINKS, ZEITRAUM-WAEHLER RECHTS - Betreiberansage vom
   24.10.2026: "Timefilter soll auch oben rechts sein."

   VORHER SASS ER NEBEN "DEIN ZIEL", der Ueberschrift des ersten Abschnitts.
   Die ist mit den uebrigen Abschnittstiteln gefallen, und damit stand der
   Waehler allein in einer leeren Zeile. Ein Waehler, der fuer die GANZE Seite
   gilt, gehoert ohnehin an ihren Kopf.

   MITTIG AUSGERICHTET, SEIT DIE UNTERSCHRIFT WEG IST (24.10.2026: "Der Satz
   soll auch weg"). Solange dort zwei Zeilen standen, musste der Knopf oben
   haengen - an der Unterkante rutschte er unter den Text und sass auf der
   ersten Karte auf. Bei EINER Zeile ist das Gegenteil richtig: Titel und
   Knopf gehoeren auf dieselbe optische Linie, sonst steht der Knopf vier
   Pixel zu hoch und es sieht aus wie ein Versehen. */
.aff-seitenkopf {
  display: flex; justify-content: space-between; align-items: center;
  gap: var(--s-4); flex-wrap: wrap;
}
.aff-seitenkopf__text { min-width: 0; }
/* OHNE DIESE ZEILE SITZT DER KNOPF VIER PIXEL ZU TIEF. Der Seitentitel bringt
   8 px Aussenabstand nach unten mit; die zaehlen zu seiner Box, nicht zu
   seinem Text. Mittig ausgerichtet wird also die BOX zentriert - und der
   sichtbare Text sitzt damit vier Pixel hoeher als der Knopf. Jetzt traegt
   den Abstand der Kopf selbst. */
.aff-seitenkopf .page-title { margin-bottom: 0; }


/* MEHR LUFT ZWISCHEN DEN KARTEN (Betreiberansage vom 24.09.2026: "Bei der
   Gesamtansicht moechte ich gerne, dass die Karten genug Abstand zueinander
   haben").

   .stat-grid kommt aus dem Admin-Dashboard und ist dort bewusst eng: zwoelf
   Pixel zwischen Karten, die in EINER Reihe stehen. In der Gesamtansicht
   stehen drei Reihen uebereinander - und der Abstand galt nur innerhalb einer
   Reihe, zwischen den Reihen gar nicht. Sie klebten aneinander. */
/* Die Karten der Gesamtansicht untereinander, mit demselben Abstand, den die
   Abschnitte innerhalb einer Karte voneinander haben. Vorher standen hier drei
   Raster (.stat-grid) mit eigenen Abstandsregeln - seit die Zahlen in Bloecken
   stehen, reicht ein Stapel. */
.aff-stapel { display: flex; flex-direction: column; gap: var(--s-5); }

/* DIE FUENF KENNZAHLEN - Betreiberansage vom 24.10.2026.

   FUENF NEBENEINANDER IN EINER ZEILE, ausdruecklich so gewuenscht. Auf dem
   Telefon untereinander, auf dem Tablet zu zweit, am Schreibtisch zu fuenft.

   FESTE STUFEN STATT auto-fit: Gemessen passten bei 1440 px vier Spalten, und
   damit stand in der zweiten Reihe ein Nachzuegler. Wer fuenf in eine Zeile
   will, muss fuenf sagen - sonst rechnet der Browser etwas anderes aus. */
.aff-kpi {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-5);
}
@media (min-width: 620px)  { .aff-kpi { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .aff-kpi { grid-template-columns: repeat(5, minmax(0, 1fr)); } }

/* DREI STATT FUENF - die zweite Reihe (Betreiberansage vom 24.10.2026).
   Dieselbe Karte, dasselbe Raster, nur eine andere Spaltenzahl: So stehen
   beide Reihen im gleichen Rhythmus, statt dass die zweite ihre eigene
   Aufteilung erfindet. */
@media (min-width: 620px)  { .aff-kpi--drei { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* ALLE FUENF IM GLEICHEN FORMAT: Titel, Zahl, eine Unterzeile. In der ersten
   Fassung sassen die Ringe in zwei der Karten und machten sie hoeher als die
   uebrigen - und damit die ganze Zeile. Die Aufteilungen stehen jetzt im
   eigenen Block darunter. */
.aff-kpi__karte {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  padding: var(--s-5);
  min-width: 0;
}
/* DIE ZAHL DARF NICHT UMBRECHEN. Bei fuenf Spalten ist eine Karte rund 210 px
   breit, und "166.805 USD" brauchte bei 30 px zwei Zeilen - damit stand die
   Einheit allein unter dem Betrag und die Karte war eine Zeile hoeher als ihre
   Nachbarn. Kleiner und in einer Zeile ist hier mehr wert als gross. */
.aff-kpi__karte .kpi-card__value {
  font-size: clamp(19px, 1.5vw, 24px);
  white-space: nowrap;
}

/* TITEL LINKS, ZEICHEN RECHTS - Betreiberansage vom 24.10.2026.

   Der Titel darf umbrechen, das Zeichen nicht schrumpfen: flex-shrink: 0 am
   Zeichen, min-width: 0 am Titel. Ohne das zieht ein langer Titel wie
   "Funding conversion" das Zeichen zusammen, bis es ein Strich ist. */
.aff-kpi__kopf {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--s-3);
}
.aff-kpi__kopf .kpi-card__title { min-width: 0; }

/* GEDAEMPFT UND KLEIN: Das Zeichen macht die Karte wiedererkennbar, es
   konkurriert nicht mit der Zahl. Dieselbe Farbe, die vorher die Unterzeilen
   trugen - die sind weg, der Ton bleibt. */
.aff-kpi__zeichen {
  flex: 0 0 auto;
  color: var(--text-muted);
  opacity: .75;
  line-height: 0;
}
.aff-kpi__zeichen svg { width: 18px; height: 18px; display: block; }


/* DIE DIAGRAMME - zwei Ringe nebeneinander, die Linie ueber die volle Breite.

   EIGENE BLOECKE STATT EINGEBETTET: Ein Diagramm in einer Kennzahlkarte muss
   sich an deren Hoehe halten; eines in einer eigenen Karte traegt seine
   eigene Ueberschrift und darf atmen. */
.aff-diagramme {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-5);
}
@media (min-width: 760px) { .aff-diagramme { grid-template-columns: repeat(2, 1fr); } }

.aff-diagramm { padding: var(--s-5); }

/* LINIE LINKS, RING RECHTS - Betreiberansage vom 24.10.2026.

   ZWEI DRITTEL ZU EINEM: Die Linie traegt acht Monate auf der x-Achse, der
   Ring zwei Werte. Haelftig geteilt staucht die Linie, und der Ring schwimmt
   in seiner Haelfte. */
/* minmax(0, 1fr) UND NICHT 1fr: Ein fr-Streifen ist von Haus aus so breit
   wie sein breitester Inhalt mindestens braucht. Ein langer Name ohne
   Umbruchstelle macht seine Spalte damit breiter als ihren Anteil - die
   Karten stehen ungleich, und die letzte haengt rechts aus dem Bildschirm.
   Mit der Null als Mindestbreite bleiben die Streifen gleich, und der Inhalt
   endet mit Punkten. Gemeldet am 11.11.2026 mit Bildschirmfoto. */
.aff-paar {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--s-5);
}
/* DREI UND ZWEI SPALTEN DESSELBEN FUENFER-RASTERS, nicht 2fr zu 1fr
   (Betreiberansage vom 24.10.2026: "Die Breite der Karte von den
   Kreisdiagrammen genau so gross wie die Karten von Net Deposit und Total
   Earnings").

   EIN VERHAELTNIS REICHT DAFUER NICHT. Die Kennzahlenreihe darueber hat fuenf
   Spalten und vier Luecken dazwischen; zwei Karten im Verhaeltnis 2:1 teilen
   dieselbe Breite mit nur EINER Luecke - die Kanten liegen dann um ein paar
   Pixel daneben, und genau das sieht man. Mit span 3 und span 2 im selben
   Fuenfer-Raster treffen sie sich exakt. */
@media (min-width: 960px) {
  .aff-paar { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .aff-paar > :first-child { grid-column: span 3; }
  .aff-paar > :last-child  { grid-column: span 2; }

  /* DASSELBE RASTER, ANDERSHERUM - fuer die Zeile mit der ruhenden Liste und
     dem Verdienst-Kalender (Betreiberansage vom 28.10.2026).

     DIE REIHENFOLGE STEHT FEST, DER PLATZ NICHT: Links die Liste, rechts der
     Kalender - so war die Ansage. Sieben Spalten mit Datum UND Betrag
     brauchen aber die breitere Haelfte, eine Namensliste kommt mit der
     schmalen aus. Also zwei und drei statt drei und zwei, im selben
     Fuenfer-Raster: Die Kanten treffen damit dieselben Spalten wie die Zeile
     darueber. */
  .aff-paar--gedreht > :first-child { grid-column: span 2; }
  .aff-paar--gedreht > :last-child  { grid-column: span 3; }
}

/* DER KOPF DER BEIDEN NEUEN KARTEN - Titel links, Werkzeug rechts.

   EIGEN UND NICHT .aff-kpi__kopf: Dort steht ein Titel neben einem Zeichen,
   hier ein Titel neben einer Zahl oder neben zwei Bedienelementen. */
.aff-blockkopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--s-3); margin-bottom: var(--s-4);
}
.aff-blockkopf__titel { font-size: 15px; font-weight: 620; color: var(--text); }
/* WEISS, NICHT GRAU (Betreiberansage vom 28.10.2026: "Das ist mir alles zu
   grau"). Es sind die beiden Zahlen, um die es auf diesen Karten geht - die
   Summe des Monats und die Zahl der Leute. Gedaempft gelesen sahen sie aus
   wie eine Fussnote zur Ueberschrift. */
.aff-blockkopf__zahl {
  font-size: 15px; font-weight: 700; color: var(--text);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* MIT WERKZEUG DARF DIE ZEILE UMBRECHEN. Der Titel, ein Dreierumschalter und
   ein Knopf mit "Neueste zuerst" brauchen zusammen mehr als die 380 px, die
   diese Karte innen hat - gemessen am 28.10.2026. Statt alles zu stauchen
   rutscht das Werkzeug dann unter den Titel und bleibt rechtsbuendig, also
   weiterhin oben rechts. */
.aff-blockkopf--werkzeug { flex-wrap: wrap; align-items: center; row-gap: var(--s-3); }
.aff-blockkopf--werkzeug > :first-child { flex: 1 1 auto; }

/* ZAHL, UMSCHALTER, PFEIL - in dieser Reihenfolge und rechtsbuendig. Die
   Zahl gehoert zum Fenster und nicht zur Ueberschrift: Steht sie am anderen
   Kartenende, sieht man beim Klick auf 60 nicht, dass sie mitwandert. */
.aff-werkzeug { display: flex; align-items: center; gap: var(--s-2); margin-left: auto; }
/* DEN UMSCHALTER GIBT ES SCHON - siehe .aff-schalter weiter unten, gebaut am
   24.09.2026 fuer die Zeilenzahl 20/50/100. 30/60/90 ist dieselbe Sorte
   Bedienung, also dieselben Klassen.

   HIER STAND EINMAL EINE ZWEITE FASSUNG DAVON, und sie sah falsch aus, ohne
   dass man den Grund sah: Gleicher Name, gleiche Spezifitaet - die spaetere
   im Stylesheet gewinnt, und das war die alte. Der Pfeilknopf bekam dadurch
   border: 0 und ein 14-px-Zeichen statt seines Rahmens. Der Modifier fuer den
   Pfeil steht deshalb jetzt direkt hinter dem Umschalter, den er abwandelt. */

/* ---- DIE FUNNEL-LISTE: wer noch nie eingezahlt hat ----

   EINE LISTE UND KEINE TABELLE. Drei Angaben je Zeile - Name, Herkunft, Tage
   - brauchen keine Kopfzeile, keine Sortierung ueber Spalten und keine
   Seiten; die grosse Tabelle mit alldem steht ohnehin weiter unten. Was hier
   zaehlt, ist, wen man anruft.

   DIE LISTE FUELLT, WAS DER KALENDER VORGIBT - und waechst nie darueber
   hinaus (Betreiberansage vom 28.10.2026: "Wenn es mehr Leute gibt, als da
   reinpasst, muss man scrollen koennen. Die Karte soll nicht groesser
   werden, als sie jetzt ist").

   DAS MACHT flex-basis: 0, UND ZWAR GENAU DESHALB: Beide Karten stehen in
   derselben Rasterzeile, deren Hoehe sich nach der groesseren richtet. Mit
   flex-basis: auto zaehlen die Zeilen der Liste zu dieser Hoehe mit - fuenfzig
   Namen machen die Zeile dann fuenfzig Namen hoch, und der Kalender daneben
   wird mitgezogen. Mit flex-basis: 0 steuert die Liste nichts zur Hoehe bei;
   sie bekommt, was nach Kopf und Fusszeile uebrig ist, und rollt darin.

   min-height: 0 ERLAUBT DAS ROLLEN - ohne das waechst ein Flex-Kind ueber
   seinen Kasten hinaus, statt zu rollen.

   AUF DEM SCHMALEN BILDSCHIRM GILT DAS NICHT. Dort stehen die Karten
   untereinander, es gibt keine fremde Hoehe zu fuellen, und flex-basis: 0
   liesse die Liste auf null zusammenfallen. Deshalb steht hier die
   Rueckfallebene und die Regel oben erst ab der zweispaltigen Breite. */
.aff-ruhig {
  list-style: none; margin: 0; padding: 0;
  flex: 1 1 auto; min-height: 0; max-height: 420px; overflow-y: auto;
}
@media (min-width: 960px) {
  .aff-ruhig { flex: 1 1 0; max-height: none; }
}
/* ZWEI SPALTEN, NICHT MEHR DREI: Name und Registrierungsdatum - mehr braucht
   diese Liste nicht (28.10.2026). Das Abzeichen Direkt/Netzwerk ist raus, und
   mit ihm die Frage, was es neben einem Datum eigentlich sagen soll. */
.aff-ruhig__zeile {
  display: grid; grid-template-columns: 1fr auto;
  align-items: center; gap: var(--s-3);
  padding: 8px 0; border-top: 1px solid var(--line);
}
/* DAS hidden-ATTRIBUT BRAUCHT HIER EINE EIGENE REGEL. Sein Standardwert ist
   display: none, aber jede eigene display-Angabe schlaegt ihn - und diese
   Zeile ist ein Raster. Ohne das hier blendet der Umschalter nichts aus: Die
   Ueberschrift sagte "30 Tage" und darunter standen 88. */
.aff-ruhig__zeile[hidden] { display: none; }
/* DER RAND LIEGT OBEN, also darf ihn die erste SICHTBARE Zeile nicht tragen -
   und das ist nach dem Umschalten eine andere als beim Laden. Ein
   CSS-Geschwisterwahl dafuer waere eine Zeile, die niemand mehr liest; das
   Skript setzt stattdessen eine Klasse, wenn es ohnehin schon durch die
   Zeilen laeuft. */
.aff-ruhig__zeile.is-erste { border-top: 0; }
/* SO GROSS WIE DIE UEBERSCHRIFT (Betreiberansage vom 28.10.2026: "Macht die
   Namen und alles andere in der Tabelle genauso gross wie die Ueberschrift").

   Vorher standen hier 26 px, nach der Ansage von einer Stunde davor
   ("doppelt so gross"). Das war zu viel: Von einem Namen blieben rund
   vierzehn Zeichen uebrig, der Rest wurde zu Punkten. Fuenfzehn ist die
   Groesse des Kartentitels - die Zeile liest sich damit als Liste und nicht
   als Schlagzeile.

   EIN LANGER NAME SCHIEBT DAS DATUM NICHT AUS DER KARTE, er endet mit
   Punkten; der ganze Name steht im title-Text. */
.aff-ruhig__name {
  min-width: 0; font-size: 15px; font-weight: 600; line-height: 1.3; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* WEISS WIE DER NAME (Betreiberansage vom 28.10.2026). Gedaempft gelesen
   sah das Datum aus wie eine Fussnote zum Namen; es ist aber die zweite
   Haelfte der Zeile - und die einzige, nach der sortiert wird. */
.aff-ruhig__datum {
  font-size: 15px; font-weight: 600; color: var(--text);
  font-variant-numeric: tabular-nums; white-space: nowrap; line-height: 1.3;
}
.aff-ruhig__fuss { margin: var(--s-3) 0 0; font-size: 11px; color: var(--text-faint); }

/* ---- DER VERDIENST-KALENDER ----

   BETREIBERANSAGE vom 28.10.2026: "Ein Kalender im Monatsformat, und dann soll
   man jeden Tag sehen koennen, wie viel Geld man gemacht hat."

   SIEBEN GLEICHE SPALTEN, FESTES SEITENVERHAELTNIS: Ein Kalender, dessen
   Felder je nach Monat anders hoch sind, liest sich nicht mehr als Kalender.
   Die Zeilenzahl wechselt zwischen fuenf und sechs - die Karte wird dann eben
   eine Zeile hoeher, statt die Felder zu stauchen. */
.aff-kalender__leiste {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-3); margin-bottom: var(--s-3);
}
.aff-kalender__monat {
  font-size: 16px; font-weight: 650; color: var(--text); text-align: center;
  flex: 1 1 auto;
}
.aff-kalender__wochentage,
.aff-kalender__gitter {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px;
}
.aff-kalender__wochentage {
  margin-bottom: 6px; font-size: 12px; font-weight: 600;
  color: var(--text-faint); text-align: center; text-transform: uppercase;
  letter-spacing: .04em;
}
/* DER KALENDER WAECHST, DIE KARTE NICHT (Betreiberansage vom 28.10.2026:
   "Nicht die Karte groesser machen, sondern den Kalender an sich").

   Die Karte bekommt ihre Hoehe aus der Rasterzeile - also aus der Liste
   daneben. Bisher sass das Raster oben drin und liess darunter Platz liegen;
   jetzt nimmt es ihn. grid-auto-rows: 1fr teilt die Hoehe gleichmaessig auf
   die sechs Wochen auf, die Mindesthoehe faengt den schmalen Bildschirm ab,
   wo es nichts zu fuellen gibt. */
.aff-kalender__gitter {
  flex: 1 1 auto; grid-auto-rows: minmax(62px, 1fr); align-content: stretch;
}
.aff-kalender__tag {
  min-height: 62px; padding: 7px 7px 6px; border-radius: 9px;
  border: 1px solid var(--line); background: rgba(255,255,255,0.02);
  display: flex; flex-direction: column; gap: 2px;
}
/* Ein Feld, das zu keinem Tag dieses Monats gehoert, ist kein leeres Feld -
   es ist gar keines. Ohne Rahmen und ohne Grund steht der Monat fuer sich. */
.aff-kalender__tag--fremd { border-color: transparent; background: none; }
/* OHNE MITSCHRIEB BLEIBT DAS FELD STUMM. Eine 0 dort hiesse "an diesem Tag
   nichts verdient" - und das weiss die Seite nicht, sie hat nur keinen Stand.
   Genau diese Verwechslung hat am 28.09.2026 aus einer Zeitraum-Einzahlung
   eine Lebenszeit-Summe gemacht. */
.aff-kalender__tag--unbekannt { opacity: .45; }
/* HEUTE ZEICHNET SICH NICHT UEBER DEN BESTEN TAG. Faellt beides zusammen,
   bleibt die Spitze stehen - sie ist die seltenere Auskunft, und welcher Tag
   heute ist, weiss der Leser ohnehin. */
.aff-kalender__tag--heute:not(.aff-kalender__tag--spitze) { border-color: var(--accent-line); }
/* Ein Tag mit Verdienst traegt die Hausfarbe - nicht als Flaeche, sondern als
   Anflug. Zwanzig leuchtende Felder waeren ein Muster, kein Hinweis. */
.aff-kalender__tag--verdient {
  border-color: var(--accent-line); background: var(--accent-soft);
}
.aff-kalender__zahl {
  font-size: 13px; font-weight: 600; color: var(--text-faint);
  font-variant-numeric: tabular-nums; line-height: 1;
}
.aff-kalender__tag--verdient .aff-kalender__zahl { color: var(--text-muted); }
/* DER BESTE TAG DES MONATS IN GRUEN (Betreiberansage vom 28.10.2026, zweiter
   Anlauf - zuerst war es das Hausorange).

   GRUEN PASST HIER BESSER, UND ZWAR AUS EINEM GRUND: Orange steht auf dieser
   Seite fuer das Zweite - die Netzwerk-Haelfte der Ringe, der Punkt auf der
   Plakette. Der beste Tag ist aber kein Zweites, sondern ein Bestwert; gruen
   heisst im ganzen Haus "gut" (siehe .aff-status--aktiv).

   TEILEN SICH MEHRERE TAGE DIE HOECHSTE ZAHL, leuchten sie alle: Einen davon
   auszuwaehlen hiesse, eine Rangfolge zu erfinden, die es nicht gibt. */
.aff-kalender__tag--spitze {
  border-color: rgba(34,197,94,0.55); background: rgba(34,197,94,0.16);
}
.aff-kalender__tag--spitze .aff-kalender__zahl { color: rgba(34,197,94,0.8); }
.aff-kalender__tag--spitze .aff-kalender__betrag { color: var(--green); }
/* Der Strich steht fuer eine Null, nicht fuer eine Luecke - also gedaempft,
   aber da. Ein Feld ganz ohne Zeichen hiesse "nichts mitgeschrieben". */
.aff-kalender__betrag--null { color: var(--text-faint); font-weight: 600; }
.aff-kalender__betrag {
  margin-top: auto; font-size: 14px; font-weight: 650; color: var(--text);
  font-variant-numeric: tabular-nums; line-height: 1.15;
  overflow: hidden; text-overflow: ellipsis;
}
/* Eine Differenz, die mehrere Tage abdeckt, bekommt einen Punkt - und im
   title-Text den Satz dazu. Still auf einen Tag gebucht waere sie ein zu
   guter Tag neben leeren. */
.aff-kalender__spanne {
  width: 4px; height: 4px; border-radius: 50%;
  background: var(--warn); align-self: flex-end;
}

@media (max-width: 520px) {
  /* Auf dem Telefon traegt ein Feld keine zwei Zeilen mehr. Dann steht nur
     noch der Tag da und faerbt sich - der Betrag kommt beim Antippen. */
  .aff-kalender__gitter { grid-auto-rows: minmax(38px, 1fr); }
  .aff-kalender__tag { min-height: 38px; padding: 5px; }
  .aff-kalender__betrag { display: none; }
}

/* DIE BEIDEN RINGE NEBENEINANDER (Betreiberansage vom 24.10.2026: "Mach die
   Kreise nebeneinander, nicht untereinander - sieht gleich besser aus").

   DAMIT MUSSTEN RING UND PLAKETTEN UEBEREINANDER. Die Karte ist 364 px breit;
   zwei Ringe MIT Plaketten daneben waeren vier Spalten auf dieser Breite, und
   jede davon zu schmal fuer "Network 38". Nebeneinander heisst hier also:
   zwei Saeulen, in jeder der Ring oben und seine drei Plaketten darunter. */
.aff-ringpaar {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--s-4);
}
/* RING OBEN, PLAKETTEN DARUNTER - und das bleibt so, auch nachdem die Karte
   breiter wurde.

   GERECHNET STATT GERATEN: Die Karte ist 433 px breit, abzueglich Innenabstand
   und Luecke bleiben je Saeule 188 px. Ein Ring von 140 px und "Network 38"
   von 95 px passen dort nicht nebeneinander - probiert, und die Plaketten
   liefen rechts aus der Karte heraus.

   DIE HOEHE KOSTET DAS NICHTS. Die Zeile richtet sich ohnehin nach dem
   Liniendiagramm; der Ringinhalt bleibt darunter. Kuerzer wird die Zeile
   deshalb nicht durch ein Umstellen der Ringe, sondern indem das
   Liniendiagramm flacher wird - siehe --linie. */
.aff-ringzeile {
  display: flex; flex-direction: column; align-items: center; gap: var(--s-3);
  min-width: 0;
}
/* EINE OBERGRENZE, KEINE FESTE BREITE - beides war einmal falsch.

   Mit flex: 1 1 nahm der Ring auf der vollen Breite allen Platz und schob die
   Plaketten an den rechten Rand: zwei Dinge, die zusammengehoeren, mit einer
   Handbreit Nichts dazwischen. Mit einer festen Breite von 240 px sprengte er
   dafuer die schmale Karte neben dem Verlauf, und die Plaketten rutschten
   darunter.

   max-width loest beides: Er waechst bis 240 px und nicht weiter, und er
   schrumpft, wo es eng wird. Beides am 24.10.2026 im Browser nachgemessen. */
/* Der Ring fuellt seine Saeule, hoert aber bei 150 px auf - sonst wird er in
   einer breiten Karte zum Hauptdarsteller und draengt die Plaketten weg. */
.aff-ringzeile .aff-diagramm__flaeche { width: 100%; max-width: 140px; }

.aff-plaketten {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  min-width: 0;
}

/* EINE PLAKETTE TRAEGT PUNKT, NAME UND ZAHL. Die Zahl steht fett am Ende -
   sie ist der Grund, aus dem der Betreiber die Legende ueberhaupt neben dem
   Ring haben wollte ("am besten mit zwei Badges: ein Badge mit Direct 22").
   Die Farbe des Punktes ist dieselbe wie im Ring; ohne sie muesste man raten,
   welche Haelfte gemeint ist. */
.aff-plakette {
  display: inline-flex; align-items: center; gap: var(--s-2);
  padding: 6px 10px; border-radius: 999px;
  background: rgba(255,255,255,0.04);
  border: 1px solid var(--border);
  font-size: 12.5px; color: var(--text-muted);
  white-space: nowrap;
}
.aff-plakette strong { color: var(--text); font-weight: 650; }
.aff-plakette__punkt { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
.aff-plakette--lila .aff-plakette__punkt { background: #7f3ffb; }
.aff-plakette--orange .aff-plakette__punkt { background: #f94e33; }

/* DIE HOEHE STEHT HIER, NICHT AM canvas: Chart.js rechnet mit der Hoehe des
   Elternelements, sobald maintainAspectRatio aus ist. Steht sie am canvas,
   waechst es bei jedem Neuzeichnen - ein bekannter Fallstrick, der die Seite
   langsam nach unten schiebt. */
.aff-diagramm__flaeche { position: relative; margin-top: var(--s-3); }
/* 156 STATT 140: Die acht Pixel Rand fuer den Ausschlag beim Ueberfahren
   gehen von der Zeichenflaeche ab, oben wie unten. Ohne Ausgleich waere der
   Ring sichtbar kleiner geworden, nur damit er nicht mehr anstoesst. */
.aff-diagramm__flaeche--ring { height: 156px; }

/* DER STRICH STEHT JETZT LINKS, NICHT OBEN. Er sagt dasselbe wie vorher -
   dass es zwei Fragen sind und nicht ein Diagramm mit sechs Plaketten - nur
   trennt er jetzt nebeneinander statt untereinander. */
.aff-ringzeile--zweiter {
  padding-left: var(--s-4);
  border-left: 1px solid var(--border);
}
@media (max-width: 420px) {
  /* Zu schmal fuer zwei Saeulen: untereinander, und der Strich kippt mit. */
  .aff-ringpaar { grid-template-columns: 1fr; }
  .aff-ringzeile--zweiter {
    padding-left: 0; border-left: 0;
    padding-top: var(--s-4); border-top: 1px solid var(--border);
  }
}

/* DER NAME STEHT IM LOCH DES RINGES (Betreiberansage vom 24.10.2026).

   ALS MARKUP, NICHT AUF DIE FLAECHE GEMALT: Text im Canvas ist nicht
   markierbar, skaliert nicht mit der Schriftgroesse des Lesers und muesste
   bei jeder Uebersetzung neu vermessen werden.

   pointer-events: none ist hier kein Feinschliff, sondern Pflicht: Sonst
   verschluckt der Text die Maus, und der Ring zeigt seinen Hinweis nicht mehr.

   DIE BREITE IST BEGRENZT - das Loch ist 62 Prozent des Ringes, und ein
   laengerer Name wie "Total Sub-IBs" schoebe sich sonst ueber die Farbe. */
.aff-ringmitte {
  position: absolute; inset: 0; pointer-events: none;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 1px; text-align: center;
}
/* KRAEFTIGER UND IN WEISS (Betreiberansage vom 24.10.2026). Gedaempft sah der
   Name aus wie eine Beschriftung der Flaeche; er ist aber die Ueberschrift des
   Ringes - das Einzige, was sagt, WOVON hier die Rede ist. */
.aff-ringmitte__name {
  max-width: 62%;
  font-size: 11.5px; line-height: 1.25;
  font-weight: 620; color: var(--text);
}

/* DAS FRAGEZEICHEN AN DER KENNZAHL - Betreiberansage vom 24.10.2026: "Ich
   weiss nicht genau, was Funding Conversion ist. Waere geil, wenn man da einen
   Info-Button reinlegt."

   KEIN JAVASCRIPT: Ein Hinweis, der nur bei Mausberuehrung erscheint, braucht
   kein Skript - :hover und :focus-visible reichen. tabindex am Traeger, damit
   er auch mit der Tastatur erreichbar ist; wer nicht mit der Maus arbeitet,
   hat dieselbe Frage.

   ueber DEM INHALT, nicht darin: z-index und ein Rand, damit das Feld nicht in
   der Karte untergeht. Es oeffnet nach unten - die Karten stehen oben auf der
   Seite, nach oben waere es ausserhalb des Bildes. */
.aff-info {
  position: relative; display: inline-flex; vertical-align: middle;
  color: var(--text-muted); cursor: help;
}
/* Sitzt er im Zeichenplatz der Karte, gelten dessen Regeln - nur der
   Mauszeiger und die Hinweisflaeche kommen dazu. */
.aff-kpi__zeichen.aff-info { flex: 0 0 auto; opacity: 1; }
.aff-kpi__zeichen.aff-info .aff-info__zeichen svg { width: 18px; height: 18px; }
.aff-info__zeichen { line-height: 0; opacity: .7; }
.aff-info__zeichen svg { width: 13px; height: 13px; display: block; }
.aff-info:hover .aff-info__zeichen,
.aff-info:focus-visible .aff-info__zeichen { opacity: 1; color: var(--text); }

.aff-info__text {
  position: absolute; top: calc(100% + 8px); left: -8px; z-index: 30;
  width: max-content; max-width: 240px;
  padding: 10px 12px; border-radius: 10px;
  background: var(--surface-2, #16161c);
  border: 1px solid var(--border);
  box-shadow: 0 12px 28px rgba(0,0,0,0.45);
  font-size: 12px; font-weight: 400; line-height: 1.45; color: var(--text-muted);
  white-space: normal; text-align: left;
  opacity: 0; visibility: hidden; transform: translateY(-4px);
  transition: opacity .14s ease, transform .14s ease, visibility .14s;
}
.aff-info:hover .aff-info__text,
.aff-info:focus-visible .aff-info__text,
.aff-info:focus-within .aff-info__text {
  opacity: 1; visibility: visible; transform: translateY(0);
}

/* Die Rechnung steht als eigene Zeile unter dem Satz und in Weiss: Sie ist der
   Beleg, der Satz nur die Erklaerung. */
.aff-info__rechnung {
  display: block; margin-top: 6px;
  color: var(--text); font-weight: 600;
}

/* DIE GESAMTZAHL TRAEGT KEINEN FARBPUNKT - sie ist keine Haelfte des Ringes,
   sondern seine Summe. Ein Punkt davor wuerde eine dritte Farbe im Ring
   suchen, die es nicht gibt. Stattdessen ein kraeftigerer Rand: Sie steht
   oben und gehoert zu den beiden darunter, ist aber nicht eine von ihnen. */
.aff-plakette--gesamt {
  background: rgba(255,255,255,0.07);
  border-color: rgba(255,255,255,0.14);
}
.aff-diagramm__flaeche--linie { height: 230px; }

/* DIE LINIE FUELLT IHRE KARTE. Neben zwei gestapelten Ringen ist die rechte
   Karte hoeher als 300 px - und die linke zog mit, waehrend ihr Diagramm bei
   300 stehen blieb. Unten blieb eine Handbreit Nichts, das aussah wie ein
   vergessener Abschnitt.

   min-height haelt die Untergrenze: Steht die Karte einmal allein in ihrer
   Zeile, faellt die Linie nicht in sich zusammen. */
.aff-paar > .aff-diagramm { display: flex; flex-direction: column; }
/* Streckt das Liniendiagramm die Zeile, steht der Ringinhalt mittig darin -
   sonst klebt er oben und darunter steht eine Handbreit Nichts. */
.aff-paar > .aff-diagramm > .aff-ringpaar { margin: auto 0; }
.aff-paar > .aff-diagramm > .aff-diagramm__flaeche--linie {
  flex: 1 1 auto; height: auto; min-height: 230px;
}
.aff-diagramm__flaeche canvas { display: block; }


/* Auch die Kartentitel in Weiss - aus demselben Grund wie die Ueberschriften.
   NUR IM AFFILIATE-BEREICH: .kpi-card__title steht auch im Journal, und dort
   ist die gedaempfte Fassung gewollt. */
.aff-section .kpi-card__title { color: var(--text); }

/* DIE RECHNUNG NEBEN DEM TITEL, nicht als dritte Zeile unter der Zahl. Sie
   erklaert den Titel, also steht sie bei ihm - und in der zurueckhaltenden
   Schrift, die vorher die dritte Zeile hatte. */
/* ELF PIXEL, GEMESSEN UND NICHT GERATEN: In der Karte sind 256 Pixel Platz,
   "Net Deposit" braucht 72. Bei zwoelf Pixeln ist die Klammer 180 breit - zwei
   Pixel zu viel, und sie rutschte in die zweite Zeile, womit die Karte wieder
   drei haette. Bei elf sind es 165, und alles steht nebeneinander.

   KEIN nowrap AUF DER GANZEN ZEILE: Wird das Fenster schmaler, soll die
   Klammer umbrechen und nicht aus der Karte laufen. */
.kpi-card__formel { font-weight: 400; font-size: 11px; color: var(--text-faint); white-space: nowrap; }

/* DER VERDIENST TRAEGT DEN GRADIENTEN AM RAND (Betreiberansage vom 24.09.2026:
   "Es waere ganz cool, wenn die Verdienstkarte auch diese Gradient-Farbe
   bekommt, von der Border her, sodass man einfach merkt, dass es was anderes
   ist").

   GEFAERBT WIRD DER RING, NICHT EINE BORDER. Im Glas-Thema hat .card
   border: 0 - den Rand zeichnet ::before als 1px-Ring mit Maske. Der erste
   Versuch setzte eine echte 2px-Border mit zwei Hintergrundebenen: im Browser
   gemessen kam davon NICHTS an, weil .theme-glass .card (0-2-0) die Border
   wieder auf 0 setzt. Hier wird stattdessen genau der Ring umgefaerbt.

   ZWEI PIXEL STATT EINEM, damit man den Unterschied auch sieht; der Ring liegt
   als Maske ueber der Kante, die Karte selbst wird davon nicht kleiner. */
.theme-glass .card.aff-verdienst::before {
  padding: 2px;
  background: var(--accent-gradient);
  /* Der Eck-Glanz wandert hier nicht: Der Ring IST schon farbig. */
  transition: none;
}
.theme-glass .card.aff-verdienst {
  box-shadow: inset 0 1px 1px var(--glass-shimmer), var(--glass-depth), 0 0 22px rgba(146,80,236,0.18);
}

/* DIE VERDIENSTKARTE SIEHT AUS WIE DIE ANDEREN VIER - nur der Rand ist anders.

   HIER STAND IHR ALTES LAYOUT: Titel und Zahl nebeneinander, mittig
   ausgerichtet, der Titel groesser. Das war richtig, solange sie allein ueber
   die ganze Breite ging (24.09.2026). Als eine von fuenf gleich breiten Karten
   hat es sie aus der Reihe geworfen: Das Zeichen sass nicht oben rechts
   sondern neben dem Titel, und die Karte war hoeher als ihre Nachbarn.

   Betreiberbefund vom 24.10.2026: "KPI-Karten auf dieselbe Hoehe bringen wie
   bei Total Earnings ... die Icons sollen ganz oben rechts sein, weil sie bei
   Total Earnings nicht ganz rechts sind."

   Der farbige Rand und der Schein bleiben - die tragen die Hervorhebung, und
   die brauchte nie ein zweites Layout. */

/* ZEILENANZAHL 20/50/100 (Betreiberansage vom 24.09.2026: "sodass die Tabelle
   nicht zu lang wird"). Der Schalter steht rechts neben dem Paarfilter, weil
   beides Einstellungen derselben Tabelle sind. */
/* ALLE BEDIENELEMENTE IN EINER FLIESSENDEN REIHE. Vorher lagen sie in zwei
   Kaesten nebeneinander (Filter links, Zeilenzahl rechts) - und weil beide
   fuer sich umbrachen, standen am Ende vier fast leere Zeilen uebereinander.
   Jetzt bricht die Reihe dort um, wo der Platz endet, und die Zeilenzahl
   haelt sich rechts, solange welcher da ist. */
/* align-items: flex-end HAELT DIE FELDER AUF EINER LINIE, auch wenn ueber
   einem eine Beschriftung steht und ueber dem Suchfeld keine. */
.aff-werkzeuge {
  display: flex; align-items: flex-end; flex-wrap: wrap;
  gap: var(--s-3); margin-bottom: var(--s-4);
}
.aff-zeilen { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; margin-left: auto; }

/* Suchfeld ueber den Tabellen - im Stil der Auswahlfelder daneben, damit die
   Filterzeile eine Zeile bleibt und nicht drei verschiedene Bauteile zeigt. */
.aff-suche {
  min-width: 220px; padding: 7px 12px;
  border: 1px solid var(--border-strong); border-radius: var(--r-item);
  background: rgba(255,255,255,0.04); color: var(--text);
  font-family: inherit; font-size: 13px;
}
.aff-suche::placeholder { color: var(--text-faint); }
.aff-suche:focus { outline: none; border-color: var(--accent); }

@media (max-width: 620px) {
  /* Ueber die ganze Breite: Ein halb so breites Suchfeld neben einem
     Auswahlfeld faenge zwei Buchstaben. */
  .aff-suche { min-width: 0; width: 100%; }
}

/* HOEHER, BEIDE GLEICH (Betreiberansage vom 10.11.2026: "Mach bitte das
   Suchfeld und den Status ein bisschen hoeher von der Hoehe her").

   NUR IN DIESER ZEILE: .year-select ist das Auswahlfeld des ganzen Hauses, es
   steht auch im Trading Journal und oben im Seitenkopf. Hier bekommt es
   deshalb mehr Hoehe ueber den Elternteil und nicht an seiner eigenen Regel.

   padding-right BLEIBT UNANGETASTET - dort sitzt der Pfeil. */
.aff-werkzeuge .aff-suche,
.aff-werkzeuge .year-select { min-height: 40px; }
.aff-werkzeuge .aff-suche { padding: 10px 14px; }
.aff-werkzeuge .year-select { padding-top: 10px; padding-bottom: 10px; padding-left: 14px; }

/* DREI GLEICH GROSSE KARTEN (Betreiberansage vom 10.11.2026: "unten die Top
   Subbies, die Top Trader und die letzte Aktivitaet, sodass die drei Karten
   alle gleich gross sind").

   GLEICH GROSS HEISST HIER ZWEIERLEI: gleich breit ueber 1fr-Spalten, und
   gleich hoch ueber height:100%. Ohne die zweite Zeile waere jede Karte so
   hoch wie ihr eigener Inhalt, und die Reihe saehe aus wie eine Treppe.

   ERST AB 1100 PIXEL NEBENEINANDER, und dann gleich alle drei: Fuenf Zeilen
   aus Name, Zahl und Rang brauchen Breite. Eine Zwischenstufe mit zwei
   Spalten gibt es bewusst nicht - die dritte Karte stuende allein in der
   zweiten Reihe und waere doppelt so breit wie die beiden darueber. */
.aff-drei { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-5); }
/* ERST AB 1500 PIXEL NEBENEINANDER, und das ist gemessen und nicht geraten:
   Bei 1440 bleiben nach Seitenleiste und Raendern rund 950 Pixel, also drei
   Karten zu je 304. Davon gehen Rang, Kuerzel und Betrag ab - fuer den Namen
   blieben fuenfzig Pixel, und aus "MARCEL MANUEL FUCHS" wurde "M…".

   DARUNTER STEHEN SIE UNTEREINANDER, jede ueber die volle Breite: gleich
   gross sind sie dann immer noch, nur lesbar. */
@media (min-width: 1500px) { .aff-drei { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.aff-drei > .card { height: 100%; min-width: 0; }
/* DER TITEL DARF UMBRECHEN. "Top Trader (Rebates)" und "Alle anzeigen"
   zusammen passen in einem Drittel der Breite nicht immer nebeneinander;
   ohne Umbruch wuerde eines von beiden gestaucht. */
.aff-drei .aff-blockkopf { flex-wrap: wrap; row-gap: var(--s-2); }

/* EINE ZEILE IN DEN DREI KARTEN: links ein Zeichen oder zwei Buchstaben, in
   der Mitte Name und Unterzeile, rechts die Zahl. Dieselbe Form fuer Trader
   und Ereignisse - es sind dieselben Zeilen, nur mit anderem Inhalt. */
.aff-reihe { list-style: none; margin: var(--s-3) 0 0; padding: 0; }
.aff-reihe__zeile {
  display: flex; align-items: center; gap: var(--s-3);
  padding: 10px 0; border-top: 1px solid var(--border);
}
.aff-reihe__zeile:first-child { border-top: 0; }
.aff-reihe__kuerzel,
.aff-reihe__zeichen {
  flex: 0 0 36px; height: 36px; display: flex; align-items: center; justify-content: center;
  border-radius: var(--r-item); background: var(--accent-soft); color: var(--text);
  font-size: 12.5px; font-weight: 700; letter-spacing: .4px;
}
.aff-reihe__zeichen svg { width: 18px; height: 18px; }
.aff-reihe__zeichen--einzahlung { color: var(--success); }
.aff-reihe__zeichen--trade { color: var(--accent); }
.aff-reihe__text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
/* ABGESCHNITTEN STATT UMGEBROCHEN: Drei Karten nebeneinander sind schmal, und
   ein zweizeiliger Name machte seine Zeile hoeher als die anderen vier. */
.aff-reihe__name {
  font-size: 13.5px; font-weight: 600; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* AUCH DIE UNTERZEILE BLEIBT EINZEILIG (Betreiberansage vom 11.11.2026:
   "dass die Karten immer schoen gleichmaessig sind"). "2,10 Lots · 3 Trades"
   brach in der schmalen Karte um, und jede Kachel mit Umbruch war eine Zeile
   hoeher als ihre Nachbarn - damit wuchs die ganze Karte. */
.aff-reihe__unter {
  font-size: 12px; color: var(--text-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.aff-reihe__rechts { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
.aff-reihe__wert { font-size: 13.5px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; }
.aff-reihe__rang { font-size: 11.5px; color: var(--text-faint); font-variant-numeric: tabular-nums; }

/* JEDE ZEILE EINE EIGENE KACHEL (Betreiberansage vom 10.11.2026: "dass auch
   die einzelnen Zeilen bitte in einer einzelnen Karte sind").

   NUR BEI TRADERN UND AKTIVITAET: Die Rangliste der Sub-IBs traegt unter
   jedem Namen einen Balken ueber die volle Breite; in einer Kachel mit
   Innenabstand saehe der aus, als gehoerte er nicht dazu. */
.aff-reihe--kacheln { display: grid; gap: var(--s-2); }
/* EINE FESTE HOEHE JE KACHEL: Eine Zeile ohne Unterzeile waere sonst
   flacher als ihre Nachbarn, und die Karte haette eine Stufe.

   min-width: 0 IST DER ZWEITE TEIL DESSELBEN PROBLEMS: Die Liste ist ein
   Raster, und ein Rasterfeld ist von Haus aus mindestens so breit wie sein
   laengstes unteilbares Wort. "MARCEL MANUEL FUCHS · 0,08 Lots XAUUSD" hat
   keine Umbruchstelle - die Kachel wurde also breiter als ihre Karte und
   schob die ganze Reihe aus dem Bildschirm (11.11.2026). */
.aff-reihe--kacheln .aff-reihe__zeile { min-height: 64px; min-width: 0; }
.aff-reihe--kacheln .aff-reihe__zeile,
.aff-reihe--kacheln .aff-reihe__zeile:first-child {
  /* MEHR LUFT NACH INNEN (Betreiberansage vom 10.11.2026: "die Padding-Karten
     drin koennen auch ein bisschen breiter sein"). Seit rechts nur noch eine
     Zahl steht, ist der Platz dafuer auch da. */
  padding: 13px 16px;
  border: 1px solid var(--border); border-radius: var(--r-item);
  background: rgba(255, 255, 255, 0.025);
}

/* DER RANG STEHT LINKS VOR DEM KUERZEL ("Dann sieht man eine schoene 1, eine
   schoene 2"). Die ersten drei in Gold, Silber und Bronze - das ist der
   Unterschied zwischen einer Liste und einem Treppchen. */
.aff-reihe__platz {
  flex: 0 0 20px; text-align: center;
  font-size: 14px; font-weight: 700; color: var(--text-faint);
  font-variant-numeric: tabular-nums;
}
.aff-reihe--kacheln .aff-reihe__zeile:nth-child(1) .aff-reihe__platz { color: #f5b62b; }
.aff-reihe--kacheln .aff-reihe__zeile:nth-child(2) .aff-reihe__platz { color: #c7ccd8; }
.aff-reihe--kacheln .aff-reihe__zeile:nth-child(3) .aff-reihe__platz { color: #d79a6a; }

/* DAS TREPPCHEN SIEHT MAN AUCH AM RAND (Betreiberansage vom 11.11.2026: "die
   Borde bitte auch in den Farben Gold, Silber, Bronze").

   NUR BEI DEN TOP TRADERN: In der Aktivitaet gibt es keinen Rang, dort waere
   ein goldener Rahmen um das juengste Ereignis eine Auszeichnung fuer nichts.

   GEDAEMPFT UND NICHT VOLL: Ein Rahmen in vollem Gold um eine Kachel auf
   dunklem Grund leuchtet staerker als die Zahl darin. */
/* DIE SPALTE RECHTS HAT EINE MINDESTBREITE, keine feste. Fest bedeutete bei
   einer dreigeteilten Karte, dass vom Namen zwei Buchstaben uebrigbleiben;
   ganz ohne bestimmte die laengste Zahl, wie weit rechts die Namen sitzen.
   Mit der Mindestbreite stehen gleich lange Betraege buendig, und ein
   laengerer bekommt trotzdem seinen Platz. */
.aff-reihe--rang .aff-reihe__rechts { flex: 0 0 auto; min-width: 92px; }
/* Etwas enger in den Kacheln: Jeder Pixel Abstand fehlt dem Namen. */
.aff-reihe--kacheln .aff-reihe__zeile { gap: var(--s-2); }

.aff-reihe--rang .aff-reihe__zeile:nth-child(1) { border-color: rgba(245, 182, 43, 0.55); }
.aff-reihe--rang .aff-reihe__zeile:nth-child(2) { border-color: rgba(199, 204, 216, 0.45); }
.aff-reihe--rang .aff-reihe__zeile:nth-child(3) { border-color: rgba(215, 154, 106, 0.5); }

/* DAS ZEICHEN VOR DEM KARTENTITEL (Betreiberansage vom 10.11.2026: "damit es
   ein bisschen mehr farblich aussieht"). Je Karte eine eigene Farbe, sonst
   waere es nur ein weiteres graues Quadrat. */
.aff-blockkopf__titel { display: inline-flex; align-items: center; gap: var(--s-2); }
.aff-kopficon {
  flex: 0 0 26px; width: 26px; height: 26px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--r-sm); background: var(--accent-soft); color: var(--accent);
}
.aff-kopficon svg { width: 15px; height: 15px; }
.aff-kopficon--pokal { background: rgba(245, 182, 43, 0.14); color: #f5b62b; }
.aff-kopficon--flamme { background: rgba(249, 78, 51, 0.14); color: #f94e33; }
.aff-kopficon--blitz { background: rgba(34, 197, 94, 0.14); color: var(--green); }
.aff-kopficon--balken { background: rgba(59, 130, 246, 0.14); color: #3b82f6; }
.aff-kopficon--geld { background: rgba(34, 197, 94, 0.14); color: var(--green); }
.aff-kopficon--quelle { background: rgba(146, 80, 236, 0.16); color: var(--accent); }
.aff-kopficon--text { background: rgba(59, 130, 246, 0.14); color: #3b82f6; }
.aff-kopficon--eigene { background: rgba(245, 182, 43, 0.14); color: #f5b62b; }

/* Kopieren und Bearbeiten nebeneinander im Kopf eines eigenen Textes. */
.aff-text__knoepfe { display: flex; gap: var(--s-2); flex-shrink: 0; }
/* Das Formular fuer einen neuen Text sitzt unter der Liste und bekommt eine
   Trennlinie - sonst sieht es aus wie ein weiterer Textbaustein. */
.aff-texte__neu { margin-top: var(--s-5); padding-top: var(--s-5); border-top: 1px solid var(--border); }

/* Der Haken und die Sanduhr in der Auszahlungsliste. */
.aff-reihe__zeichen--bezahlt { background: var(--green-soft); color: var(--green); }
.aff-reihe__zeichen--offen { background: rgba(245, 182, 43, 0.14); color: #f5b62b; }

/* DIE MARKE RECHTS IN DER AUSZAHLUNGSZEILE: "ausgezahlt" oder "geplant". Klein
   und in Versalien, damit sie neben dem Betrag nicht mit ihm konkurriert. */
.aff-marke {
  display: inline-block; padding: 3px 8px; border-radius: var(--r-pill);
  font-size: 10.5px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  white-space: nowrap;
}
.aff-marke--bezahlt { background: var(--green-soft); color: var(--green); }
.aff-marke--offen { background: rgba(245, 182, 43, 0.14); color: #f5b62b; }

/* Der Vergleich mit dem Vormonat in der Kennzahl-Karte. */
.aff-delta { font-weight: 600; }
.aff-delta--plus { color: var(--green); }
.aff-delta--minus { color: var(--red); }

/* DAS POP-UP DER EIGENEN TEXTE (Betreiberansage vom 10.11.2026: "Der Popup
   soll auch viel besser designed sein").

   DIE BESCHRIFTUNGEN SIND WEISS: Es sind zwei Felder, und beide muss man
   lesen koennen. Gedaempft gelesen sahen "Titel" und "Text" aus wie
   Fussnoten zu den leeren Kaesten darunter.

   textarea.input BRAUCHT EIGENE REGELN: .input setzt height auf 46 Pixel -
   fuer eine Zeile richtig, fuer ein Textfeld der Grund, warum es als
   Briefschlitz dastand. Und ohne font-family nimmt ein Textfeld die
   Schreibmaschinenschrift des Browsers, waehrend das Feld darueber die
   Hausschrift zeigt. */
.aff-popup .field__label { color: var(--text); font-size: 13.5px; font-weight: 600; }
.aff-popup textarea.input {
  height: auto;
  min-height: 200px;
  padding: 12px var(--s-4);
  font-family: inherit;
  line-height: 1.6;
  resize: vertical;
  /* Waechst beim Tippen mit (data-waechst), ohne Sprung. */
  overflow: hidden;
}
.aff-popup__hinweis { margin: var(--s-3) 0 var(--s-5); font-size: 13.5px; color: var(--text); }
.aff-popup__code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px;
  padding: 2px 7px; border-radius: var(--r-sm);
  background: var(--accent-soft); color: var(--text);
}
.aff-popup .form-actions { gap: var(--s-3); }

/* WOHER DIE KLICKS KOMMEN: je Kanal eine Zeile mit Name, Balken und Zahl.

   DER BALKEN MISST SICH AM STAERKSTEN KANAL und nicht an der Summe: Bei vier
   Kanaelen mit je einem Viertel waeren alle Balken kurz, und man saehe nicht,
   dass sie gleich stark sind. Der Anteil steht ohnehin als Prozentzahl
   daneben. */
/* EINE KOPFZEILE UEBER DEN KACHELN (Betreiberansage vom 11.11.2026):
   Die Zahl in der Kachel ist ohne Beschriftung nur eine Zahl. Die Kopfzeile
   benutzt dieselben drei Spalten wie eine Datenzeile, damit "Klicks" genau
   ueber den Kacheln steht und nicht ungefaehr. */
.aff-quellen__kopf { display: flex; align-items: center; gap: var(--s-3); margin-top: var(--s-4); }
.aff-quellen__kopf-platz { flex: 1 1 auto; min-width: 0; }
.aff-quellen__kopf-wert {
  flex: 0 0 104px; text-align: center;
  font-size: 11.5px; font-weight: 600; letter-spacing: .6px;
  text-transform: uppercase; color: var(--text);
}
.aff-quellen { list-style: none; margin: var(--s-2) 0 var(--s-4); padding: 0; display: grid; gap: var(--s-2); }
.aff-quellen__zeile { display: flex; align-items: center; gap: var(--s-3); }
/* NAME MIT ZEICHEN DAVOR (Betreiberansage vom 10.11.2026). Die Zeichen sind
   selbst gezeichnet, nicht von den Diensten geladen - die Begruendung steht
   in affiliate/quelle-icon.blade.php. */
.aff-quellen__name {
  flex: 0 0 120px; display: flex; align-items: center; gap: var(--s-2);
  font-size: 13px; color: var(--text);
}
/* DASSELBE ZEICHEN IN BEIDEN LISTEN: oben bei den Link-Varianten, unten bei
   den Klicks. Eine Klasse, eine Farbtafel - zwei waeren zwei Orte, an denen
   ein neuer Kanal vergessen wird. */
.aff-kanalzeichen { flex: 0 0 18px; height: 18px; display: inline-flex; align-items: center; }
.aff-kanalzeichen svg { width: 18px; height: 18px; }
/* Je Dienst seine Hausfarbe. TikTok bleibt weiss - sein Zeichen ist es auch. */
.aff-kanalzeichen--instagram { color: #e1306c; }
.aff-kanalzeichen--telegram { color: #29a9eb; }
.aff-kanalzeichen--tiktok { color: var(--text); }
.aff-kanalzeichen--youtube { color: #ff0033; }
.aff-kanalzeichen--qr { color: var(--text); }
.aff-kanalzeichen--direkt { color: var(--text-muted); }
/* DICKER (10.11.2026: "die Balken sollten noch viel dicker sein, damit man
   das besser sehen kann"). */
.aff-quellen__balken {
  flex: 1 1 auto; min-width: 0; height: 20px; border-radius: var(--r-pill);
  background: rgba(255, 255, 255, 0.05); overflow: hidden;
}
.aff-quellen__fuell { display: block; height: 100%; border-radius: var(--r-pill); background: var(--accent-gradient, var(--accent)); }
/* DIE ZAHL IN EINER EIGENEN KACHEL, UND ALLE GLEICH BREIT (Betreiberansage
   vom 10.11.2026). Die feste Breite ist nicht Geschmack: Ohne sie endet die
   Spur dort, wo die Zahl anfaengt - "0 · 0 %" ist kuerzer als "76 · 36 %",
   und die Balken standen reihenweise unterschiedlich weit. */
/* DER SATZ UNTER DEN BALKEN IN WEISS (Betreiberansage vom 11.11.2026). Als
   eigene Abwandlung und nicht an .aff-hint: Die Klasse traegt auf dieser
   Seite ein Dutzend Fussnoten, die gedaempft bleiben sollen. */
.aff-hint--hell { color: var(--text); }

.aff-quellen__wert {
  flex: 0 0 104px;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 5px 10px; border-radius: var(--r-item);
  border: 1px solid var(--border); background: rgba(255, 255, 255, 0.04);
  font-size: 13.5px; font-weight: 700; color: var(--text);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}

@media (max-width: 620px) {
  .aff-quellen__name { flex-basis: 104px; font-size: 12.5px; }
}

/* VIER KARTEN IN EINER REIHE - der Bereich "Provisionen". Dasselbe Raster wie
   die Reihen der Uebersicht, nur eine andere Spaltenzahl. */
@media (min-width: 620px)  { .aff-kpi--vier { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .aff-kpi--vier { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* Rechts im Blockkopf, auf Hoehe des Titels: "mit deinem Link". */
.aff-blockkopf__notiz { margin-left: auto; font-size: 12px; color: var(--text-faint); }

/* DIE MONATSBALKEN (Provisionen).

   DER HOECHSTE BALKEN IST VOLL, der Rest misst sich an ihm - eine feste Skala
   muesste raten, wie viel ein guter Monat ist. Die Zahl steht ueber dem
   Balken und nicht darunter: Unten steht der Monat, und zwei Zeilen
   untereinander liessen nicht erkennen, welche wozu gehoert. */
/* DIE BALKEN FUELLEN DIE KARTE (Betreiberansage vom 11.11.2026: "in der
   Karte sind die jetzt weit oben, das ist nicht so geil").

   Die Karte ist so hoch wie die Auszahlungen daneben. Ohne diese beiden
   Zeilen behielt das Raster seine 190 Pixel und klebte unter der
   Ueberschrift, darunter stand eine halbe Karte Leere. Jetzt waechst es
   mit - die Grundlinie bleibt unten, die Balken werden hoeher. */
.aff-monatskarte { display: flex; flex-direction: column; }
.aff-monatskarte .aff-monate { flex: 1 1 auto; }
.aff-monate {
  display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
  gap: var(--s-3); align-items: end;
  margin: var(--s-4) 0; padding: 0; list-style: none; min-height: 190px;
}
.aff-monate__spalte {
  display: flex; flex-direction: column; align-items: center; justify-content: flex-end;
  gap: 6px; height: 100%; min-width: 0;
}
.aff-monate__wert {
  font-size: 12.5px; font-weight: 600; color: var(--text);
  font-variant-numeric: tabular-nums;
}
/* OHNE SPUR HINTER DEM BALKEN: Sie war ein Kasten ueber die volle Hoehe und
   las sich als zweiter, randvoller Balken - gerade im schwaechsten Monat, wo
   der echte Balken nur ein Streifen ist. */
.aff-monate__balken {
  position: relative; width: 100%; max-width: 68px; flex: 1 1 auto;
  display: flex; align-items: flex-end; overflow: hidden;
}
/* DIE ABGESCHLOSSENEN MONATE RUHIG, DER LAUFENDE IM VERLAUF DES HAUSES. So
   sieht man ohne Beschriftung, welcher Balken noch waechst. */
.aff-monate__fuell { width: 100%; border-radius: var(--r-item); background: rgba(146, 80, 236, 0.55); }
.aff-monate__fuell--laufend { background: var(--accent-gradient, var(--accent)); }
.aff-monate__label { font-size: 12px; color: var(--text-muted); }

/* DIE FERTIGEN TEXTE (Materialien). Jeder in seinem eigenen Rahmen, damit man
   sieht, wo einer aufhoert - sie haben alle mehrere Absaetze. */
.aff-texte { display: grid; gap: var(--s-4); margin-top: var(--s-4); }
.aff-text { border: 1px solid var(--border); border-radius: var(--r-item); padding: var(--s-4); }
.aff-text__kopf {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-3); margin-bottom: var(--s-3);
}
.aff-text__titel { margin: 0; font-size: 14px; font-weight: 620; color: var(--text); }
/* Absaetze und Zeilenumbrueche stehen im Text selbst und sollen genau so in
   der Zwischenablage landen - deshalb <pre>, aber mit der Schrift der Seite. */
.aff-text__inhalt {
  margin: 0; white-space: pre-wrap; word-break: break-word;
  font-family: inherit; font-size: 13.5px; line-height: 1.6; color: var(--text-muted);
}

/* DER PARTNERLINK. Das Feld ist zum Lesen und Markieren da, nicht zum
   Tippen - Schreibmaschinenschrift, damit eine verwechselte Ziffer auffaellt. */
.aff-link { display: flex; gap: var(--s-3); align-items: center; flex-wrap: wrap; }
.aff-link__feld {
  flex: 1 1 260px; min-width: 0; min-height: 40px; padding: 10px 14px;
  border: 1px solid var(--border-strong); border-radius: var(--r-item);
  background: rgba(255,255,255,0.04); color: var(--text);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px;
}
.aff-link__feld:focus { outline: none; border-color: var(--accent); }
.aff-linkzahlen { display: flex; gap: var(--s-8); margin: var(--s-5) 0; flex-wrap: wrap; }
.aff-linkzahlen__block { display: flex; flex-direction: column; gap: 2px; }
.aff-linkzahlen__titel {
  font-size: 11.5px; letter-spacing: .6px; text-transform: uppercase; color: var(--text-muted);
}
.aff-linkzahlen__wert {
  font-size: 22px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums;
}
.aff-varianten__kopf { margin-top: var(--s-5); }
.aff-varianten { list-style: none; margin: 0; padding: 0; }
.aff-varianten__zeile {
  display: flex; align-items: center; gap: var(--s-3);
  padding: 10px 0; border-top: 1px solid var(--border);
}
.aff-varianten__name {
  flex: 0 0 112px; display: flex; align-items: center; gap: var(--s-2);
  font-size: 13px; font-weight: 600; color: var(--text);
}
.aff-varianten__url {
  flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: 12.5px; color: var(--text-muted);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}

/* DER QR-CODE braucht seinen weissen Grund - ein Code auf dunklem Grund wird
   von vielen Kameras nicht gelesen. */
/* DER TITEL OBEN, DER CODE MITTIG (Betreiberansage vom 11.11.2026: "nur der
   QR-Code mit dem Button mittig in der Karte, der Titel soll da bleiben, wo
   er jetzt ist").

   KEIN justify-content: center AUF DER KARTE: Das zoege die Ueberschrift mit
   nach unten, und sie staende nicht mehr auf einer Linie mit der
   Ueberschrift daneben. Die beiden Aussenabstaende auf auto zentrieren
   stattdessen nur das Paar aus Code und Knopf im Platz, der unter dem Titel
   uebrig bleibt. */
.aff-qr {
  display: flex; flex-direction: column; align-items: center;
  text-align: center;
}
.aff-qr .btn { align-self: center; margin-bottom: auto; }
.aff-qr .aff-blockkopf { width: 100%; justify-content: center; }
.aff-qr__flaeche {
  background: #fff; border-radius: var(--r-item); padding: 12px;
  line-height: 0;
  /* margin-top: auto schiebt den Code zusammen mit dem auto unter dem Knopf
     in die Mitte des Platzes, der unter dem Titel uebrig bleibt. Als
     Kurzbefehl, weil eine spaetere "margin"-Zeile ihn sonst zuruecksetzt. */
  margin: auto 0 var(--s-4);
}
.aff-qr__flaeche svg { display: block; width: 260px; height: 260px; }

@media (max-width: 620px) {
  /* Acht Balken nebeneinander sind auf dem Telefon acht Striche. Vier
     Monate passen, der Rest rutscht nach unten. */
  .aff-monate { grid-auto-flow: row; grid-template-columns: repeat(4, 1fr); min-height: 0; }
  .aff-monate__spalte { height: 150px; }
  .aff-varianten__zeile { flex-wrap: wrap; }
  .aff-varianten__name { flex: 0 0 auto; }
}

/* EIN UMSCHALTER, NICHT DREI KNOEPFE (Betreiberansage vom 24.09.2026: "Ich
   moechte gerne, dass in der Tabelle die Zahlengroesse 20, 50 oder 100 ein
   Umschalter ist").

   DER RAHMEN MACHT DEN UNTERSCHIED: Drei einzelne Knoepfe lesen sich als drei
   Befehle. Liegen sie in einer Fassung und eine Stellung ist hell, sieht man
   eine Einstellung mit drei Stufen - und welche gerade gilt. */
.aff-schalter {
  display: inline-flex; padding: 3px; gap: 2px;
  border: 1px solid var(--border); border-radius: 10px;
  background: rgba(255,255,255,0.04);
}
.aff-schalter__knopf {
  cursor: pointer; padding: 5px 12px; border: 0; border-radius: 7px;
  background: transparent; color: var(--text-muted);
  font-family: inherit; font-size: 13px; font-weight: 600;
  font-variant-numeric: tabular-nums;
  transition: background .15s ease, color .15s ease;
}
.aff-schalter__knopf:hover { color: var(--text); }
.aff-schalter__knopf.is-active { background: var(--accent); color: #fff; }
.aff-schalter__knopf svg { display: block; width: 14px; height: 14px; }
/* DER SORTIERKNOPF STEHT NEBEN DEM UMSCHALTER, nicht darin: eigener Rahmen,
   quadratisch, und er traegt nur einen Pfeil (Betreiberansage vom 28.10.2026:
   "Da ist einfach nur so ein Pfeil-Icon nach oben oder nach unten"). Was er
   tut, steht im title und im aria-label - ein Pfeil allein sagt niemandem,
   wonach sortiert wird. */
.aff-schalter__knopf--pfeil {
  /* GENAU SO HOCH WIE DER UMSCHALTER UND QUADRATISCH (Betreiberansage vom
     28.10.2026). 34 px sind dessen Aussenmass: 1 Rahmen + 3 Innenabstand +
     26 Knopf + 3 + 1. Probiert war align-self: stretch mit aspect-ratio - die
     Hoehe stimmte damit von selbst, die Breite nicht: Ein Flex-Kind bekommt
     seine Grundbreite aus dem Inhalt, lange bevor das Strecken die Hoehe
     festlegt, und so stand dort ein 16 px schmaler Streifen. */
  width: 34px; height: 34px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--border); border-radius: 9px;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.aff-schalter__knopf--pfeil:hover { border-color: var(--border-strong); }
.aff-schalter__knopf--pfeil svg { transition: transform .15s ease; }
/* Aelteste zuerst heisst aufsteigend - derselbe Pfeil, gedreht. Zwei Zeichen
   fuer zwei Richtungen waeren zweimal dasselbe Bild. */
.aff-schalter__knopf--pfeil.is-auf svg { transform: rotate(180deg); }

/* SEITEN UNTER DER TABELLE (Betreiberansage vom 24.09.2026: "Eine Seite hat
   immer 20 Zeilen, dann kann man auf Seite 2 gehen"). Dieselbe Machart wie der
   Zeilen-Umschalter darueber - es ist dieselbe Sorte Bedienung. */
.aff-seiten {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  margin-top: var(--s-4);
}
.aff-seiten[hidden] { display: none; }
.aff-seiten__zahlen { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.aff-seiten__knopf {
  min-width: 30px; height: 30px; padding: 0 8px;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; border: 1px solid var(--border); border-radius: 8px;
  background: transparent; color: var(--text-muted);
  font-family: inherit; font-size: 13px; font-weight: 600;
  font-variant-numeric: tabular-nums;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.aff-seiten__knopf:hover:not(:disabled) { color: var(--text); border-color: var(--border-strong); }
.aff-seiten__knopf.is-active { background: var(--accent); border-color: transparent; color: #fff; }
/* Am Anfang und am Ende der Liste fuehrt der Pfeil nirgendwohin. */
.aff-seiten__knopf:disabled { opacity: .35; cursor: default; }
.aff-seiten__knopf svg { width: 15px; height: 15px; }
.aff-seiten__luecke { padding: 0 2px; color: var(--text-faint); font-size: 13px; }

/* STATUS EINES KUNDEN - aktiv, gefaehrdet, inaktiv (Betreiberansage vom
   24.09.2026). Abgeleitet aus dem letzten Trade; die Schwellen stehen in
   config/affiliate.php.

   Gruen, Gelb, Grau statt Gruen, Rot, Grau: Rot heisst in dieser Anwendung
   "kaputt". Ein Kunde, der sechs Wochen nicht gehandelt hat, ist nicht kaputt -
   er ist der, bei dem sich ein Anruf lohnt. */
.aff-status {
  display: inline-block; padding: 2px 8px; border-radius: var(--r-pill);
  font-size: 11px; font-weight: 600; white-space: nowrap;
}
.aff-status--aktiv { background: rgba(34,197,94,0.14); color: var(--green); }
.aff-status--gefaehrdet { background: var(--warn-soft); color: var(--warn); }
.aff-status--inaktiv { background: rgba(255,255,255,0.06); color: var(--text-muted); }

@media (max-width: 620px) {
  .aff-seitenkopf { align-items: flex-start; }
  /* DREI ZEILEN STATT VIER: Suche oben ueber die ganze Breite, darunter Status
     und Assets nebeneinander (Betreiberansage vom 25.09.2026), unten die
     Zeilenzahl. Die beiden Auswahlfelder teilen sich die Zeile zu gleichen
     Teilen - flex-basis 0 heisst "verteilt den Platz", nicht "so breit wie
     euer Inhalt". Faellt eines weg, weil es bei den Sub-IBs nicht gilt, nimmt
     das andere die ganze Breite. */
  .aff-werkzeuge { flex-wrap: wrap; align-items: flex-end; gap: var(--s-3); }
  .aff-suche { flex: 1 1 100%; }
  .aff-werkzeuge .aff-gruppe { flex: 1 1 0; min-width: 0; }
  .aff-werkzeuge .aff-gruppe .year-select { width: 100%; }
  .aff-zeilen { flex: 1 1 100%; margin-left: 0; }
}

@media (max-width: 620px) {
  .aff-goal__marks { height: 44px; }
  .aff-mark { font-size: 9.5px; }
}

.quoni-hint { margin: var(--s-3) 0 0; font-size: 12.5px; color: var(--text-faint); }
/* Der Hinweis auf die TradeQuo-Adresse steht UEBER dem Button und soll auf
   EINE Zeile passen (Betreiberansage 18.09.2026) - deshalb weiss, ohne
   Breitenbegrenzung. Auf dem Telefon darf er umbrechen; feste Einzeiligkeit
   waere dort ein Text, der aus dem Bild laeuft. */
.quoni-hint--mail { margin: var(--s-6) 0 0; font-size: 13px; font-weight: 600; color: var(--text); }
.quoni-hint--mail + .quoni-actions { margin-top: var(--s-3); }
.quoni-cta .quoni-hint--mail { margin-left: auto; margin-right: auto; }

.quoni-free { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--s-5); align-items: start; padding: var(--s-6); }
.quoni-free__icon {
  width: 48px; height: 48px; border-radius: 14px; display: grid; place-items: center;
  color: #34d399; background: rgba(52,211,153,0.10); border: 1px solid rgba(52,211,153,0.35);
}
.quoni-free__icon svg { width: 24px; height: 24px; }
.quoni-free__title { margin: 0 0 var(--s-2); font-size: 22px; font-weight: 800; letter-spacing: -.3px; }
.quoni-free__text { margin: 0; font-size: 14.5px; line-height: 1.65; color: var(--text-muted); }
.quoni-free__note { margin: var(--s-3) 0 0; font-size: 13.5px; font-weight: 600; color: var(--text); }
@media (max-width: 560px) { .quoni-free { grid-template-columns: minmax(0, 1fr); } }

.quoni-cta { text-align: center; padding: clamp(28px, 5vw, 48px); }
.quoni-cta .quoni-head { font-size: 26px; }
.quoni-cta .quoni-lead { margin-left: auto; margin-right: auto; }
.quoni-cta .quoni-actions { justify-content: center; }

/* "QUONI ENTDECKEN" IN DEN QUONI-FARBEN (Betreiberansage 16.09.2026). Nur
   dieser Button: Die Glas-Regel .theme-glass .btn--primary bleibt fuer alle
   anderen Buttons unberuehrt. */
.theme-glass .btn--primary.btn--quoni {
  border-color: transparent;
  background: var(--quoni-gradient);
  box-shadow: 0 6px 22px var(--quoni-glow), inset 0 1px 0 rgba(255,255,255,0.28);
  transition: filter .2s ease, box-shadow .2s ease;
}
.theme-glass .btn--primary.btn--quoni:hover {
  border-color: transparent;
  background: var(--quoni-gradient);
  filter: brightness(1.08);
  box-shadow: 0 8px 28px var(--quoni-glow), 0 0 18px var(--quoni-glow-b), inset 0 1px 0 rgba(255,255,255,0.32);
}

/* App Store und Google Play - offizielle Plaketten, nebeneinander, gleich hoch */
.quoni-stores { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3); margin-top: var(--s-4); }
.quoni-cta .quoni-stores { justify-content: center; }
.quoni-store { display: inline-flex; border-radius: 8px; transition: transform .15s ease, box-shadow .15s ease; }
.quoni-store:hover { transform: translateY(-1px); box-shadow: 0 6px 18px var(--quoni-glow); }
.quoni-store img { display: block; height: 44px; width: auto; }

@media (max-width: 620px) {
  .quoni-page { gap: var(--s-6); }
  .quoni-actions .btn { flex: 1 1 100%; }
}

/* ============================================================
   DIE SEITENWAHL UNTER EINER LISTE

   BETREIBERMELDUNG vom 16.10.2026: "Die Buttons fuer die naechsten Seiten
   sind auch nicht richtig gemacht. Da sind die Icons viel zu gross."

   DER GRUND LAG NICHT IM CSS, sondern in der Ansicht: Laravels
   mitgelieferte Seitenwahl ist fuer Tailwind gebaut, ihre Pfeile tragen
   class="w-5 h-5". Ohne Tailwind tut die Klasse nichts, und die SVGs
   nehmen ihre Grundgroesse.

   HIER STEHEN DESHALB NUR DIE ABWEICHUNGEN: Die Pillen selbst sind .chip,
   dieselbe Klasse wie die Statusfilter ueber der Liste. Die Pfeile sind
   Schriftzeichen und folgen damit der Schriftgroesse der Pille - sie
   koennen nicht aus der Groesse laufen.
   ============================================================ */
.seitenwahl {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--s-2);
}

/* EINE PILLE OHNE ZIEL ist keine Pille zum Klicken: Am ersten und letzten
   Blatt bleibt der Pfeil stehen, damit die Reihe nicht springt - aber er
   sieht aus wie abgeschaltet und faengt keinen Zeiger. */
.chip--aus {
  opacity: .4;
  cursor: default;
  pointer-events: none;
}

.seitenwahl__luecke {
  padding: 0 2px;
  font-size: 12.5px; color: var(--text-faint);
}

/* WIE VIELE VON WIE VIELEN - rechts, mit Abstand zur Reihe. Auf dem Telefon
   rutscht sie unter die Pillen, statt sie zu quetschen. */
.seitenwahl__stand {
  margin-left: auto;
  font-size: 12.5px; color: var(--text-faint);
  font-variant-numeric: tabular-nums;
}

@media (max-width: 600px) {
  .seitenwahl__stand { margin-left: 0; width: 100%; }
}

/* ZAHLEN IN TABELLEN LESEN SICH SPALTENWEISE.

   Rechtsbuendig, damit Tausender untereinander stehen, und mit
   tabular-nums: Die Ziffern einer Proportionalschrift sind
   unterschiedlich breit, dadurch verrutschen die Stellen von Zeile zu
   Zeile und ein Betrag sieht laenger aus als der groessere darueber.

   Eingefuehrt am 16.10.2026 mit den Spalten Einzahlung und getradete Lots
   in der Mitgliederliste. */
.dtable .zahl {
  text-align: right;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
