/* ============================================================
   Newsroom — Design System
   Theme "Folio" (Direction C) · Light + Dark · CSS-Variablen
   ============================================================

   Inhaltsverzeichnis
   ------------------
   1. Tokens         — Design-Variablen (Farben, Fonts, Radius)
   2. Reset & Base   — html/body, Überschriften-Skala, Links
   3. Typografie     — die zwoelf Textsorten, nr-mono
   4. Layout         — nr-masthead-bar, nr-masthead-link, Auth-Seiten
   5. Surfaces       — nr-card, nr-panel
   6. Alerts         — nr-alert · ok / warn / neutral
   7. Komponenten    — nr-btn, Formularfelder, nr-chip
   8. Utilities      — Focus-Ring, Scrollbar, Theme-Toggle
   9. Editionsinhalt — edition-content, ressort-header

   Verwendung
   ----------
   <html data-theme="light">  explizit hell
   <html data-theme="dark">   explizit dunkel
   Kein data-theme            folgt Browser-Präferenz via @media
   ============================================================ */

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


/* ============================================================
   1. TOKENS
   ============================================================ */

/* --- Light (Standard) --- */
:root {
  --nr-font-display: 'Plus Jakarta Sans', system-ui, sans-serif;
  --nr-font-body:    'Plus Jakarta Sans', system-ui, sans-serif;
  --nr-font-mono:    'JetBrains Mono', ui-monospace, monospace;

  /* Die Leiter der zwoelf Textsorten, angehaengt an EINEN Regler. `--nr-skala`
     zieht die ganze Seite groesser oder kleiner; die sechs Stufen behalten dabei
     ihr Verhaeltnis zueinander. Fuer den Handy-Satz aendert sich deshalb nur eine
     einzige Zahl (s. unten) und nicht sechs.

     `max(12px, ...)` auf der kleinsten Stufe: Joergs Untergrenze. Sie haelt auch
     dann, wenn jemand die Skala weit herunterdreht. */
  --nr-skala: 1;
  --nr-fs1: calc(39px * var(--nr-skala));   /* nr-title  */
  --nr-fs2: calc(29px * var(--nr-skala));   /* nr-metric */
  --nr-fs3: calc(21px * var(--nr-skala));   /* nr-heading */
  --nr-fs4: calc(17px * var(--nr-skala));   /* nr-body */
  --nr-fs5: calc(15px * var(--nr-skala));   /* nr-value, nr-source, nr-message, nr-action */
  --nr-fs6: max(12px, calc(13px * var(--nr-skala)));  /* nr-section, nr-label, nr-note, nr-status */

  /* Flächen */
  --nr-paper:        #F5F1EA;   /* Seitengrund — warmes Cremeweiß */
  --nr-paper-2:      #ECE6DA;   /* Leicht abgesetzte Fläche (Panels, Inputs) */

  /* Linien */
  --nr-line:         rgba(40, 30, 18, 0.12);
  --nr-line-strong:  rgba(40, 30, 18, 0.26);

  /* Schrift */
  --nr-ink:          #1C1810;
  --nr-ink-soft:     #4E483A;
  --nr-ink-mute:     #8E8773;

  /* Akzent — Salbeigrün (austauschbar per Tenant) */
  --nr-accent:       #5B7A4F;
  --nr-accent-soft:  #DCE3D2;

  /* Warn */
  --nr-warn:         #A04A1E;
  --nr-warn-bg:      #FEF0E6;

  /* Form-Inputs */
  --nr-input-bg:     #FFFFFF;
  --nr-radius:       10px;

  /* Masthead — warmes Dunkelbraun, nicht schwarz */
  --nr-masthead:     #2C2819;
  --nr-masthead-fg:  #F0E9DC;

  /* Fehler (#370: vorher Phantom-Token, Fallback #e53e3e in profile.html griff immer) */
  --nr-error:        #C0392B;

  /* Stern-Gold fuer "bevorzugte Quelle" (#548, Joerg 28.08.2026): gelb wie die
     ueblichen Sternchen-Markierungen im Web. Die Tinte darauf bleibt in beiden
     Themes dunkel, weil die Gold-Flaeche hell bleibt. Beide Layouts lesen diese
     Tokens (Zeitungssatz via --v5-stern). */
  --nr-stern:        #C9A227;
  --nr-stern-tinte:  #16130E;
}

/* --- Dark (Browser-Präferenz) --- */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --nr-paper:        #15130E;
    --nr-paper-2:      #1F1C15;
    --nr-line:         rgba(240, 230, 210, 0.10);
    --nr-line-strong:  rgba(240, 230, 210, 0.24);
    --nr-ink:          #EFEAD9;
    --nr-ink-soft:     #B0A98F;
    --nr-ink-mute:     #6E6852;
    --nr-accent:       #A7C798;
    --nr-accent-soft:  #28301F;
    --nr-warn:         #E07040;
    --nr-warn-bg:      rgba(160, 74, 30, 0.18);
    --nr-input-bg:     #262115;
    --nr-masthead:     #0D0B08;
    --nr-masthead-fg:  #EAE3D0;
    --nr-error:        #FF6B5B;
    --nr-stern:        #D1B24E;
  }
}

/* --- Dark (Explizit via data-theme="dark") --- */
:root[data-theme="dark"] {
  --nr-paper:        #15130E;
  --nr-paper-2:      #1F1C15;
  --nr-line:         rgba(240, 230, 210, 0.10);
  --nr-line-strong:  rgba(240, 230, 210, 0.24);
  --nr-ink:          #EFEAD9;
  --nr-ink-soft:     #B0A98F;
  --nr-ink-mute:     #6E6852;
  --nr-accent:       #A7C798;
  --nr-accent-soft:  #28301F;
  --nr-warn:         #E07040;
  --nr-warn-bg:      rgba(160, 74, 30, 0.18);
  --nr-input-bg:     #262115;
  --nr-masthead:     #0D0B08;
  --nr-masthead-fg:  #EAE3D0;
  --nr-error:        #FF6B5B;
  --nr-stern:        #D1B24E;
}

/* Theme-abhaengige Bilder (#575, Broetchen-Grafiken /subscription): zwei
   Varianten je Motiv (hell/dunkel), Umschaltung ueber dieselbe Theme-Mechanik
   wie die Farb-Tokens oben, kein Sonderweg. */
.nr-theme-bild-dunkel { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .nr-theme-bild-hell   { display: none; }
  :root:not([data-theme="light"]) .nr-theme-bild-dunkel { display: inline; }
}
:root[data-theme="dark"] .nr-theme-bild-hell   { display: none; }
:root[data-theme="dark"] .nr-theme-bild-dunkel { display: inline; }


/* ============================================================
   2. RESET & BASE
   ============================================================ */

html {
  font-size: 19px;
}

html, body {
  margin: 0;
  padding: 0;
  overflow-x: hidden;
  background: var(--nr-paper);
  color: var(--nr-ink);
}

body {
  font-family: var(--nr-font-body);
  font-feature-settings: "ss01", "cv11";
  -webkit-font-smoothing: antialiased;
  line-height: 1.45;
  letter-spacing: -0.005em;
}

/* Überschriften-Skala — Gewicht 500 für ruhigen Charakter */
h1, h2, h3, h4 {
  font-family: var(--nr-font-display);
  font-weight: 500;
  letter-spacing: -0.022em;
  line-height: 1.1;
  margin: 0;
  color: var(--nr-ink);
}

h1 { font-size: 1.6rem; }
h2 { font-size: 1.25rem; }
h3 { font-size: 1.05rem; }
h4 { font-size: 0.95rem; }

p      { margin: 0; }
button { font: inherit; cursor: pointer; }

/* FAQ-Antworten (#435): HTML aus faq_entries.antwort — die globalen Resets
   (p ohne Margin, Tailwind-Preflight nullt Listenpunkte) machen mehrteilige
   Antworten unlesbar (Absätze kleben, <ul>-Anstriche fehlen). Hier gezielt
   wiederherstellen, nur innerhalb des Antwortblocks. */
.faq-antwort p          { margin: 0 0 0.75rem; }
.faq-antwort p:last-child { margin-bottom: 0; }
.faq-antwort ul,
.faq-antwort ol         { list-style: disc; margin: 0 0 0.75rem 1.35rem; padding: 0; }
.faq-antwort ol         { list-style: decimal; }
.faq-antwort li         { margin: 0 0 0.3rem; }

/* Links erben Schriftart und -größe vom Elternelement */
a       { font: inherit; color: var(--nr-accent); text-decoration: none; transition: filter 120ms; }
a:hover { text-decoration: none; filter: brightness(1.3); }

/* Link MITTEN IM FLIESSTEXT — die Standardklasse dafür (Joerg, 17.08.2026: „Der Link
   funktioniert, ist aber nicht als solcher erkennbar. Hatten wir schon mehrfach").
   Ein Navigationslink steht allein und ist durch seinen Platz erkennbar; ein Link im
   Satz hat diesen Platz nicht, deshalb trägt er hier die Unterstreichung. Ohne
   gemeinsame Klasse baut jede Seite ihre eigene Fassung, und genau das ist mehrfach
   passiert. */
.nr-textlink        { color: var(--nr-accent); text-decoration: underline;
                      text-underline-offset: 0.18em; text-decoration-thickness: 1px; }
.nr-textlink:hover  { text-decoration-thickness: 2px; filter: brightness(1.15); }


/* ============================================================
   3. TYPOGRAFIE
   ============================================================ */

/* Umrandetes Kürzel neben einer Überschrift ("Beta") — stand 4× leicht
   unterschiedlich als Inline-Style in Landing/Home/Admin (#370). */
.nr-badge {
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs6);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--nr-accent);
  border: 1px solid var(--nr-accent);
  border-radius: 3px;
  padding: 1px 5px;
  line-height: 1.4;
  vertical-align: middle;
}
/* Beta-Abzeichen + Design-Schalter unter dem Zeitungstitel (#548, Joerg 23.08.2026):
   gleiche Groesse, zusammen zentriert; der Schalter ist ein Knopf im Badge-Mass. */
.nr-beta-zeile { margin-top: 0.5rem; display: flex; justify-content: center; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
.nr-beta-zeile form { display: flex; }   /* das Formular um den Schalter: kein Zeilenkasten, sonst sitzt der Knopf 1px tiefer */
.nr-beta-zeile .nr-badge { display: inline-flex; align-items: center; height: 24px; padding: 0 7px; margin: 0; box-sizing: border-box; line-height: 1; }
.nr-badge-schalter { background: transparent; cursor: pointer; }
/* Hover als Umriss, nicht als Fuellung — gefuellt ist allein die AKTIVE
   Ansicht, sonst verschwimmt beim Zeigen, welche gerade gilt. */
.nr-badge-schalter:hover { border-color: var(--nr-accent); color: var(--nr-accent); }
/* Ansichts-Umschalter Magazin/Kompakt (Joerg 26.08.2026): zwei Segmente in
   einem Rahmen, die aktive Ansicht gefuellt und nicht klickbar. */
/* Landing-Variante des Schalters (29.08.2026): Links statt Formular-Knoepfe
   (/magazin, /kompakt als Direktsprung-Adressen), sonst dasselbe Bild. */
.nr-ansicht-schalter-landing { display: inline-flex; }
.nr-ansicht-schalter-landing a { text-decoration: none; }
.nr-ansicht-schalter .nr-badge-schalter:first-child { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.nr-ansicht-schalter .nr-badge-schalter + .nr-badge-schalter { border-left: none; border-top-left-radius: 0; border-bottom-left-radius: 0; }
.nr-badge-schalter.ist-aktiv,
.nr-badge-schalter.ist-aktiv:hover { background: var(--nr-accent); color: var(--nr-paper); cursor: default; }

/* ZWOELF TEXTSORTEN (Joerg 09.08.2026) — der EINZIGE Ort fuer Schriftgroessen.
   Sechs Groessen: 38 · 28 · 20 · 16 · 14 · 12. Feste px mit Absicht: Nicht die
   Einheit war das Problem, sondern 34 Groessen an 252 Stellen.
   Regeln und Zuordnung: mvp/docs/TEXTSORTEN.md */

/* Display */
.nr-title {
  font-family: var(--nr-font-display);
  font-size: var(--nr-fs1); font-weight: 400; line-height: 1.05;
  letter-spacing: -0.01em; color: var(--nr-ink);
}
.nr-metric {
  font-family: var(--nr-font-body);
  font-size: var(--nr-fs2); font-weight: 700; line-height: 1.1;
  color: var(--nr-ink);
}

/* Heading */
.nr-heading {
  font-family: var(--nr-font-display);
  font-size: var(--nr-fs3); font-weight: 500; line-height: 1.3;
  letter-spacing: -0.015em; color: var(--nr-ink);
}

/* Body */
.nr-body {
  font-family: var(--nr-font-body);
  font-size: var(--nr-fs4); font-weight: 400; line-height: 1.7;
  color: var(--nr-ink-soft);
}
.nr-value {
  font-family: var(--nr-font-body);
  font-size: var(--nr-fs5); font-weight: 400; line-height: 1.4;
  color: var(--nr-ink);
}

/* Label — gleiche Groesse, Unterschied nur ueber Gewicht und Farbe: „Ihre
   Angaben" und „Angemeldet als" sahen vorher identisch aus. */
.nr-section {
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs6); font-weight: 700; line-height: 1.4;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--nr-ink-soft);
}
.nr-label {
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs6); font-weight: 400; line-height: 1.4;
  letter-spacing: 0.10em; text-transform: uppercase; color: var(--nr-ink-mute);
}

/* Meta — `nr-source` ist bewusst eine Stufe groesser als `nr-note`: Herkunft
   ist das Produktversprechen, kein Kleingedrucktes. */
.nr-source {
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs5); font-weight: 400; line-height: 1.4;
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--nr-ink-mute);
}
.nr-note {
  font-family: var(--nr-font-body);
  font-size: var(--nr-fs6); font-weight: 400; line-height: 1.6;
  /* Steht auch INNERHALB einer Beschriftung („— frei formulieren"); ohne diese
     Zeile erbt sie deren Versalien und Sperrung. */
  letter-spacing: 0; text-transform: none;
  color: var(--nr-ink-mute);
}

/* Status — ohne die drei Modifikatoren von `nr-label` nicht zu unterscheiden. */
.nr-status {
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs6); font-weight: 400; line-height: 1.4;
  letter-spacing: 0.06em; text-transform: uppercase; color: var(--nr-ink-mute);
}
.nr-message {
  font-family: var(--nr-font-body);
  font-size: var(--nr-fs5); font-weight: 400; line-height: 1.5;
  color: var(--nr-ink);
}
.nr-status.is-ok,    .nr-message.is-ok    { color: var(--nr-accent); }
.nr-status.is-warn,  .nr-message.is-warn  { color: var(--nr-warn); }
.nr-status.is-error, .nr-message.is-error { color: var(--nr-error); }

/* Nur die Farbe, keine Groesse — fuer Beiwerk INNERHALB einer anderen Textsorte
   (z. B. der Zusatz hinter einem Haekchen). Vorher stand dafuer viermal
   `class="nr-note" style="font-size:inherit"` in den Vorlagen: erst eine Groesse
   holen, die man nicht will, und sie dann inline zurueckdrehen. */
.is-mute { color: var(--nr-ink-mute); }
.is-soft { color: var(--nr-ink-soft); }

/* Action — nur die Schrift; Flaeche und Rand bleiben bei `.nr-btn`. */
.nr-action {
  font-family: var(--nr-font-body);
  font-size: var(--nr-fs5); font-weight: 600; line-height: 1;
  letter-spacing: 0.01em;
}

/* Sonderformen ausserhalb der zwoelf Textsorten (#565) — Wortmarke, Mono-Label,
   Icon: fuer sie gibt es keine Textsorte, deshalb eigene feste Groessen statt
   --nr-fs*. Sie ziehen trotzdem mit --nr-skala mit, damit sie auf Handy wie der
   Rest der Leiter schrumpfen. */
/* Doppelklasse mit Vorrang (Joerg 29.08.2026, "Newsroom zu klein geraten —
   im Prinzip so wie in Prod"): die spaeter definierte .nr-masthead-link-Regel
   (0.875rem) gewann sonst gegen diese Groesse — gleiche Spezifitaet,
   spaetere Regel sticht. Werte = der Prod-Stand dieser Wortmarke. */
.nr-wordmark,
.nr-masthead-link.nr-wordmark {
  font-weight: 600; font-size: calc(1.4rem * var(--nr-skala));
  letter-spacing: -0.01em; opacity: 0.90;
}
.nr-btn-label-mono {
  font-family: var(--nr-font-mono);
  font-size: calc(12px * var(--nr-skala));
  letter-spacing: 0.06em; text-transform: uppercase;
}
.nr-icon-xl { font-size: calc(2rem * var(--nr-skala)); }

/* Handy-Satz (Joerg 09.08.2026).

   Schrift: EINE Zahl. 0,85 = alles 15% kleiner, die kleinste Stufe faengt die
   Untergrenze von 12px selbst ab.

   Seitenrand: Er entstand aus ZWEI Schichten uebereinander -- `.nr-rahmen` gab
   1rem (19px), jeder Kasten mit `p-6` nochmal 1,5rem (28,5px). Zusammen 47,5px je
   Seite; auf einem 360px-Schirm ist das ueber ein Viertel der Breite. Beide
   Schichten werden hier gekappt, zusammen auf 26,5px.

   `!important` beim Kasten, weil `p-6` eine Tailwind-Klasse ist und sonst gewinnt
   (dasselbe Muster wie bei #411 weiter unten). */
@media (max-width: 640px) {
  :root {
    --nr-skala: 0.85;
    --nr-rand:  0.5rem;
  }
  .nr-panel.p-6 { padding: 0.9rem !important; }
}

/* --- Ab hier der Bestand; wird Seite fuer Seite abgeloest. --- */

/* Monospace-Zeichensatz mit Tabellenziffern */
.nr-mono { font-family: var(--nr-font-mono); font-feature-settings: "tnum"; }

/* Display-Titel für Zeitungs-Masthead (Landing + Ausgabe teilen sich das).
   font-size bewusst clamp() statt --nr-fs1-Leiter — sonst auf Handys zu groß/eng. */
.nr-display-title {
  font-family: var(--nr-font-display);
  font-size: clamp(1.55rem, 6vw, 2.4rem);
  font-weight: 500;
  letter-spacing: -0.03em;
  line-height: 1.05;
  color: var(--nr-ink);
  margin: 0 0 0.8rem;
}

/* Zeitungs-Masthead-Kopf — Landing + Ausgabe teilen sich das. */
.nr-masthead-head {
  text-align: center;
  padding: 0.8rem 0 1.5rem;
  border-bottom: 2px solid var(--nr-masthead);
}


/* ============================================================
   4. LAYOUT
   ============================================================ */

/* Masthead-Leiste */
.nr-masthead-bar {
  background: var(--nr-masthead);
  border-bottom: 1px solid rgba(240, 233, 220, 0.12);
}

/* Header sticky */
header.nr-masthead-bar {
  position: sticky;
  top: 0;
  z-index: 50;
}

/* Umgebungs-Sticker: Ampelfärbung der Masthead (nur für Admins eingeblendet).
   Klassisch dev=grün, test=gelb, prod=rot. Dunkle Töne, damit der helle
   Masthead-Text lesbar bleibt. */
.nr-env-dev     { background: #14532d !important; }   /* gruen        */
.nr-env-test    { background: #854d0e !important; }   /* braun-gelb   */
.nr-env-prod    { background: #7f1d1d !important; }   /* rot          */
.nr-env-prodref { background: #1e3a5f !important; }   /* dunkelblau   */

.nr-env-badge {
  font-family: var(--nr-font-mono);
  font-size: 12px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--nr-masthead-fg);
  background: rgba(0, 0, 0, 0.28);
  border: 1px solid rgba(240, 233, 220, 0.25);
  border-radius: 6px;
  padding: 3px 9px;
  white-space: nowrap;
}

/* Footer — Trennstrich oben statt unten */
footer.nr-masthead-bar {
  border-top: 1px solid rgba(240, 233, 220, 0.12);
  border-bottom: none;
}

/* Footer-Innentext: kein Opacity-Stacking, jedes Element einzeln */

/* Fliesstextschrift statt Monospace, Laufweite raus (Joerg 09.08.2026): Der Fuss soll
   in dieselben 42rem passen wie der Kopf, und proportionale Schrift braucht dafuer
   rund 15% weniger Platz. Preis ist die technische Anmutung. Nachgerechnet mit der
   richtigen Wurzel (19px, nicht 16): In 42rem stehen 798px zur Verfuegung, die laengste
   Sprache braucht 729px -- alle sechs Sprachen passen in eine Zeile. */
.nr-masthead-footer {
  font-family: var(--nr-font-body);
  font-size: 14px;
}
.nr-masthead-footer-item {
  color: var(--nr-masthead-fg);
  opacity: 0.50;
  transition: opacity 120ms;
  /* Ein Pflichtlink bricht nie in sich selbst um (2026-08-08). Wird der Platz eng,
     rutscht der ganze Link in die naechste Zeile -- das leistet `flex-wrap` an der
     Zeile. "Vertraege hier kuendigen" ist die gesetzliche Beschriftung (§ 312k BGB)
     und laesst sich nicht kuerzen, also muss sie am Stueck bleiben. */
  white-space: nowrap;
}
a.nr-masthead-footer-item:hover { opacity: 0.90; color: var(--nr-masthead-fg); }

/* Marke im Fuss (Joerg 29.08.2026): fester Wortabstand ueber gap statt
   Leerzeichen (die wirkten bei 14px extrem klein); Ervolution verlinkt.
   Die 0.5-Daempfung liegt auf den KINDERN, nicht auf der Zeile: laege sie
   auf der Zeile, wuerde der Link-Hover (0.9) damit multipliziert und bliebe
   unsichtbar — genau wie bei den uebrigen Fusslinks kein Opacity-Stacking. */
.nr-footer-marke { display: inline-flex; gap: 0.5em; align-items: baseline; opacity: 1; }
.nr-footer-marke > * { opacity: 0.5; }
.nr-footer-marke a { color: var(--nr-masthead-fg); text-decoration: none; transition: opacity 120ms; }
.nr-footer-marke a:hover { opacity: 0.9; color: var(--nr-masthead-fg); }

/* Navigations-Links in der Masthead-Leiste.
   0,875rem = dieselbe Groesse wie der Artikeltext (Joerg 09.08.2026). Eigene Zahl,
   kein Inhalts-Regler: Die Leiste soll sich nicht mitbewegen, wenn im Profil an den
   Schriftgroessen gedreht wird. */
.nr-masthead-link {
  font: inherit;
  color: var(--nr-masthead-fg);
  font-size: 0.875rem;
  opacity: 0.75;
  text-decoration: none;
  transition: opacity 120ms;
}
.nr-masthead-link:hover,
a.nr-masthead-footer-item:hover,
.nr-mobile-nav-link:hover { filter: none; }
.nr-masthead-link:hover { opacity: 0.92; color: var(--nr-masthead-fg); }

/* Admin-Nav: gruppierte Dropdowns (Desktop). Öffnen per Hover/Fokus, kein JS. */
.nr-nav-group { position: relative; }
.nr-nav-trigger {
  font: inherit;
  color: var(--nr-masthead-fg);
  font-size: 1rem;
  opacity: 0.75;
  background: transparent;
  border: none;
  cursor: pointer;
  padding: 0.5rem 0;            /* vertikale Hover-Brücke zum Panel — kein Flackern */
  transition: opacity 120ms;
}
.nr-nav-group:hover .nr-nav-trigger,
.nr-nav-group:focus-within .nr-nav-trigger { opacity: 1; }
.nr-nav-menu {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 190px;
  background: var(--nr-masthead);
  border: 1px solid color-mix(in srgb, var(--nr-masthead-fg) 15%, transparent);
  border-radius: 6px;
  padding: 0.35rem;
  z-index: 100;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
}
.nr-nav-group:hover .nr-nav-menu,
.nr-nav-group:focus-within .nr-nav-menu { display: block; }
.nr-nav-menu a {
  display: block;
  color: var(--nr-masthead-fg);
  opacity: 0.8;
  text-decoration: none;
  font-size: 0.9rem;
  padding: 0.45rem 0.6rem;
  border-radius: 4px;
  white-space: nowrap;
}
.nr-nav-menu a:hover { opacity: 1; background: rgba(0, 0, 0, 0.22); }

/* Mobile-Nav: Gruppen-Überschriften */
.nr-mobile-nav-group {
  color: var(--nr-masthead-fg);
  opacity: 0.5;
  font-family: var(--nr-font-mono);
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin: 0.75rem 0 0.1rem;
}

/* Footer responsive */
/* DIE Fusszeile (_fusszeile.html, 29.08.2026): eine Komponente fuer Portal,
   Landing, Auth und Admin — Abstaende hier statt als Utility-Klassen oder
   Inline-Stile, damit sie auf Seiten ohne Tailwind identisch traegt. */
.nr-footer { margin-top: 3rem; }
.nr-footer-innen { padding-top: 1rem; padding-bottom: 1rem; }
.nr-footer-admin { text-align: center; color: var(--nr-masthead-fg); opacity: 0.5; }

.nr-footer-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  /* Reicht der Platz nicht, rutscht eine ganze Gruppe nach unten statt dass
     einzelne Woerter brechen (2026-08-08). */
  flex-wrap: wrap;
}

/* Pflichtlinks immer sichtbar, auf jeder Schirmbreite (Joerg 09.08.2026). Unter 480px
   lagen sie hinter einem Hamburger; § 5 DDG, Art. 12 DSGVO und § 312k BGB verlangen
   unmittelbare Erreichbarkeit, nicht einen Klick. Wird es eng, brechen sie um. */
.nr-footer-links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.25rem;
}

@media (max-width: 480px) {
  /* Karten-Grid: 2 Spalten → 1 Spalte */
  .nr-home-cards { grid-template-columns: 1fr !important; }

  /* Footer: "powered by Ervolution" ausblenden */
  .nr-footer-powered { display: none !important; }
}

/* Gebrandete Auth-Shell (#97): Kopf / zentrierte Box / Fuß als Flex-Spalte.
   nr-auth-shell ersetzt nr-auth-page auf <body>, wenn base_auth.html den
   Masthead+Footer rendert; nr-auth-main zentriert die Box im Restraum. */
.nr-auth-shell {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
.nr-auth-main {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 2rem 1rem;
}

.nr-auth-box {
  width: 100%;
  max-width: 24rem;
}

/* 6-stelliger Bestätigungscode (cross_device.html) */
.nr-auth-code {
  font-family: var(--nr-font-mono);
  font-size: 3rem;
  font-weight: 700;
  letter-spacing: 0.3em;
  color: var(--nr-ink);
  background: var(--nr-paper-2);
  border: 2px solid var(--nr-line-strong);
  border-radius: var(--nr-radius);
  padding: 1.25rem 1.5rem;
  display: inline-block;
}


/* ============================================================
   5. SURFACES
   ============================================================ */

/* Karte — Papierfarbe mit feiner Umrandung */
.nr-card {
  background: var(--nr-paper);
  border: 1px solid var(--nr-line);
  border-radius: var(--nr-radius);
}

/* Lesebreite des Portals — EINE Definition (27.07.2026).

   Der Anlass war eng: /widerruf stand linksbuendig, alle anderen Kundenseiten mittig.
   Ursache war keine Regel, sondern eine kopierte Zeichenkette ("max-w-2xl mx-auto"),
   bei der unterwegs das "mx-auto" verlorenging.

   Der Rahmen (Kopfleiste, Fuss, Aussenspalte) bleibt unangetastet bei max-w-5xl, wie
   auf Prod: Die Leiste laeuft von der Marke bis zum Abmelden-Symbol bewusst deutlich
   breiter als der Text darunter. Eine Zeitungsspalte wird nicht lesbarer, wenn man sie
   in die Breite zieht. Ich hatte am 27.07.2026 zwischendurch beides auf eine Breite
   gezogen -- das war ein Standardisieren ueber den Auftrag hinaus und ist rueckgebaut. */
:root {
  --nr-breite: 42rem;   /* Textspalte -- Lesebreite wie Prod v0.84.0 */
  --nr-rand:    1rem;   /* Luft zum Fensterrand, kommt oben drauf */
}

/* Aussenrahmen fuer Kopfleiste, Fuss und Seitenrahmen (27.07.2026, zweiter Anlauf).

   Joerg: „Versuchen wir noch mal 42 rem." Der erste Anlauf heute frueh ging zurueck,
   weil ich ihn ungefragt ueber Landingpage und Anmeldeseiten gezogen und dabei die Zahl
   als AUSSENMASS genommen hatte -- uebrig blieben 40rem Text statt 42rem.

   Diesmal richtig gerechnet: Die Aussenkante ist Lesebreite PLUS Rand, damit innen
   exakt die 42rem stehen, die auch die Textspalte hat. Leiste und Text laufen dadurch
   auf derselben Kante.

   Die Landingpage bleibt unberuehrt (sie fuehrt ihre eigenen 42rem als Aussenmass, also
   40rem innen -- zwei Rem Unterschied, mit blossem Auge nicht zu sehen). Der Admin
   ebenfalls: sein Grid ist breit, und das ist dort richtig. */
.nr-rahmen {
  width: 100%;
  max-width: calc(var(--nr-breite) + 2 * var(--nr-rand));
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--nr-rand);
  padding-right: var(--nr-rand);
}

/* Hier stand vom 08. bis 09.08.2026 `.nr-rahmen--weit` (64rem), damit der Fuss nicht
   umbricht. Das liess den Kopf auf 42rem und den Fuss auf 64rem laufen. Beide laufen
   jetzt auf 42rem; den Platz schafft die Schrift (s. .nr-masthead-footer). */

/* Seitenspalte — die EINE Lesespalte des Portals (27.07.2026).
   Vorher trug jede Seite ihre eigene Kombination aus `max-w-2xl` und `mx-auto`.
   Wer beim Kopieren das `mx-auto` verlor, bekam eine linksbuendige Seite in einer
   ansonsten mittigen App -- genau so standen /widerruf, /agb, /impressum und
   /datenschutz. Breite und Zentrierung gehoeren an EINE Stelle; neue Seiten
   schreiben `class="nr-page"` und koennen es nicht mehr halb richtig machen.
   Bewacht von tests/web/test_portal_layout.py. */
.nr-page { max-width: var(--nr-breite); margin-left: auto; margin-right: auto; }

/* Rueckweg der Unterseiten (_zurueck.html, Joerg 29.08.2026): eine leise
   Textzeile, in beiden Layouts oben ueber dem Inhalt und unten nach dem
   Inhalt. */
.nr-zurueck { color: var(--nr-ink-mute); font-size: 0.9rem; text-decoration: none; transition: color 120ms; }
.nr-zurueck:hover { color: var(--nr-ink); }
/* Sichtbarer Abstand zwischen Winkel und Wort (Joerg 29.08.2026): ein blosses
   Leerzeichen wirkte zu knapp. */
.nr-zurueck-zeichen { margin-right: 0.4em; }
.nr-zurueck-kopf { margin-bottom: 1.25rem; }
.nr-zurueck-fuss { margin-top: 1.75rem; }

/* Panel — leicht abgesetzte Fläche (Formularbereiche, Sektionen) */
.nr-panel       { background: var(--nr-paper-2); border-radius: var(--nr-radius); }
.nr-panel-inner { background: var(--nr-paper);   border-radius: calc(var(--nr-radius) - 2px); }


/* ============================================================
   6. ALERTS
   ============================================================ */

.nr-alert {
  border-radius: var(--nr-radius);
  padding: 12px 16px;
  font-size: var(--nr-fs5);
  line-height: 1.5;
}

.nr-alert.ok      { background: var(--nr-accent-soft); color: var(--nr-accent); }
.nr-alert.warn    { background: var(--nr-warn-bg);     color: var(--nr-warn);   }
.nr-alert.neutral { background: var(--nr-line);        color: var(--nr-ink-mute); }

/* --- Hinweis im Seitenfluss (27.07.2026) ---------------------------------------
   Joerg: „Auf der Startseite hat eine Einblendung den linken gruenen Rand und eine
   andere Farbe. Die neuen Hinweise haben das nicht. Warum? Wie lautet Deine Regel?"

   Ehrliche Antwort: Es gab keine. Es gab DREI Idiome nebeneinander -- `.nr-toast` fuer
   Fluechtiges, `.nr-alert` fuer den Banner nach einem Redirect, und an sechs Stellen ein
   handgeschriebenes `nr-panel` + `border-left: 3px`, jedes Mal per Inline-Stil. Wer neu
   baut, kann keins davon befolgen, weil keins aufgeschrieben ist.

   Die Regel, ab jetzt:

     nr-toast   Fluechtige Rueckmeldung auf eine Aktion. Verschwindet von selbst.
     nr-alert   Banner nach Reload/Redirect. Gefaerbte Flaeche, kurzlebig im Blick.
     nr-notice  Bleibender Hinweis IM Seitenfluss. Traegt einen farbigen linken Rand.

   Und der Rand sagt, WAS los ist -- er ist kein Zierat:

     .accent    Es laeuft etwas fuer Sie (Willkommensausgabe wird gebaut, Beta-Hinweis)
     .warn      Es hat Folgen oder eine Frist laeuft (Loeschauftrag, Guthaben knapp)
     .mute      Reine Information, nichts zu tun

   Wer keinen Rand setzt, sagt damit: Das hier ist Inhalt, kein Hinweis. */
.nr-notice {
  background: var(--nr-paper-2);
  border-radius: var(--nr-radius);
  border-left: 3px solid var(--nr-line);
  padding: 1.1rem 1.25rem;
}
.nr-notice.accent { border-left-color: var(--nr-accent); }
.nr-notice.warn   { border-left-color: var(--nr-warn);   }
.nr-notice.mute   { border-left-color: var(--nr-line);   }

/* --- Toast (transiente Aktions-Rückmeldung, Single Source: window.toast in base.html) ---
   Gegenstück zu .nr-alert: nr-alert = bleibender Banner nach Reload/Redirect,
   nr-toast = kurze Einblendung nach AJAX-Aktion (Teilen, Quellen, Push …). */
.nr-toast {
  position: fixed;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%) translateY(8px);
  max-width: min(92vw, 420px);
  background: var(--nr-ink);
  color: var(--nr-paper);
  padding: 10px 18px;
  border-radius: var(--nr-radius);
  font-size: var(--nr-fs5);
  line-height: 1.4;
  z-index: 9999;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
  opacity: 0;
  transition: opacity 160ms ease, transform 160ms ease;
}
.nr-toast.nr-toast--in { opacity: 1; transform: translateX(-50%) translateY(0); }
.nr-toast.ok  { background: var(--nr-accent); color: var(--nr-paper); }
.nr-toast.err { background: var(--nr-warn);   color: #fff; }


/* ============================================================
   7. KOMPONENTEN
   ============================================================ */

/* --- Buttons --- */
.nr-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 10px 16px;
  font: inherit;
  font-weight: 500;
  font-size: var(--nr-fs5);
  border: 1px solid var(--nr-line-strong);
  border-radius: var(--nr-radius);
  background: color-mix(in srgb, var(--nr-ink) 6%, var(--nr-paper-2));
  color: var(--nr-ink);
  transition: background 120ms ease, transform 120ms ease, border-color 120ms ease;
}
.nr-btn:hover         { background: color-mix(in srgb, var(--nr-accent) 12%, var(--nr-paper)); }
/* primary = accent (Joerg 30.08.2026: nirgendwo komplett schwarze oder weisse
   Knoepfe — die Tinte-Flaeche war hell ein schwarzer, dunkel ein weisser Knopf).
   Textfarbe --nr-paper statt festem #fff: traegt auch auf den aufgehellten
   Dunkelmodus-Akzenten (Salbei bzw. Bordeaux). */
.nr-btn.primary,
.nr-btn.accent        { background: var(--nr-accent); color: var(--nr-paper); border-color: var(--nr-accent); }
.nr-btn.primary:hover { transform: translateY(-1px); }
.nr-btn.accent:hover  { transform: translateY(-1px); }
.nr-btn.ghost         { background: transparent; border-color: transparent; padding-left: 8px; padding-right: 8px; }
.nr-btn.ghost:hover   { background: var(--nr-paper-2); }
.nr-btn.danger        { background: var(--nr-warn);   color: var(--nr-paper); border-color: var(--nr-warn); }
.nr-btn.sm            { padding: 6px 10px; font-size: var(--nr-fs6); }
.nr-btn.icon          { padding: 8px; width: 36px; height: 36px; }
.nr-btn.full          { width: 100%; }
/* Gesperrter Knopf (#582): Solange eine Auswertung fuer diesen Kunden laeuft, ist der
   Speichern-Knopf gesperrt — ohne sichtbaren Unterschied waere die Sperre ein stummer
   Klick ins Leere. Kein Hover-Effekt, sonst verspricht die Flaeche etwas. */
.nr-btn:disabled,
.nr-btn[disabled]     { opacity: 0.45; cursor: not-allowed; }
.nr-btn:disabled:hover,
.nr-btn[disabled]:hover { transform: none; }

/* --- Bestätigungsdialog (#454): ersetzt window.confirm() -------------------------
   Der Browser-Dialog trägt ein Häkchen „Weitere Aufforderungen verbieten"; danach
   liefert confirm() still false und der Knopf tut nichts mehr. Deshalb ein eigener
   Dialog im Papier-Look des Produkts. Steuerung: js/confirm-dialog.js. */
dialog.nr-confirm {
  max-width: 30rem;
  padding: 20px 22px;
  border: 1px solid var(--nr-line-strong);
  /* Akzent-Oberkante in beiden Layouts (Joerg 30.08.2026): die reine
     Tinte-Kante las sich als Traueranzeige. */
  border-top: 2px solid var(--nr-accent);
  border-radius: var(--nr-radius);
  background: var(--nr-paper);
  color: var(--nr-ink);
  box-shadow: 0 18px 48px rgba(0, 0, 0, 0.22);
}
dialog.nr-confirm::backdrop { background: rgba(0, 0, 0, 0.42); }
.nr-confirm-text    { margin: 0 0 18px; font-size: var(--nr-fs5); line-height: 1.55; }
.nr-confirm-actions { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; }

/* --- Teilen-Knopf (#203): rahmenloses Symbol im Akzent-Ton, rechts oben im Artikel-Titel --- */
.nr-share-btn {
  float: right;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0 0 6px 10px;
  padding: 4px;
  background: transparent;
  border: none;
  color: var(--nr-accent);
  cursor: pointer;
  line-height: 0;
  opacity: 0.85;
  transition: opacity 120ms ease, transform 120ms ease;
}
.nr-share-btn svg     { width: 19px; height: 19px; }
.nr-share-btn:hover   { opacity: 1; transform: translateY(-1px); }

/* --- Formularfelder (Input, Select, Textarea) --- */
.nr-input,
.nr-select,
.nr-textarea {
  width: 100%;
  padding: 10px 13px;
  background: var(--nr-input-bg);
  border: none;
  border-radius: calc(var(--nr-radius) - 2px);
  font: inherit;
  /* Ein Eingabefeld ist kein Absatz: getippter Text eine Stufe unter dem
     Fliesstext (Joerg 09.08.2026). */
  font-size: var(--nr-fs5);
  color: var(--nr-ink);
  outline: none;
  transition: box-shadow 120ms ease;
}
.nr-input:focus,
.nr-select:focus,
.nr-textarea:focus { box-shadow: 0 0 0 2px var(--nr-accent); }
.nr-select         { appearance: none; cursor: pointer; }
.nr-textarea       { line-height: 1.55; resize: vertical; }

/* Feste Angabe in einer Feldreihe (Joerg 09.08.2026): steht da, wo ein Eingabefeld
   stuende, und liest sich wie dessen Inhalt -- gleiche Einrueckung, gleiche Groesse,
   gleiche Farbe. Es fehlt allein die weisse Flaeche, denn die ist das Zeichen fuer
   "hier kann man tippen". Erster Fall: die Anmelde-Adresse im Profil. */
/* Kaestchen fuer eine feste Angabe: sieht aus wie ein Eingabefeld, nur ohne die
   weisse Flaeche, die "hier kann man tippen" bedeutet (Joerg 09.08.2026). Reine
   Anordnung -- die Schrift kommt aus `.nr-value` daneben. */
.nr-wert {
  display: block;
  width: 100%;
  padding: 6px 10px;
  border: 1px solid var(--nr-line);
  border-radius: 6px;
  word-break: break-all;
  margin: 0;
}

/* --- Chip (Label-Badges) --- */
.nr-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 9px;
  border: 1px solid var(--nr-line-strong);
  border-radius: 999px;
  font-size: var(--nr-fs6);
  color: var(--nr-ink-soft);
  font-family: var(--nr-font-mono);
  letter-spacing: 0.04em;
  background: transparent;
}
.nr-chip.solid   { background: var(--nr-ink);         color: var(--nr-paper);  border-color: var(--nr-ink);  }
.nr-chip.accent  { background: var(--nr-accent-soft);  color: var(--nr-accent); border-color: transparent;    }
.nr-chip.warn    { background: var(--nr-warn-bg);      color: var(--nr-warn);   border-color: transparent;    }


/* ============================================================
   8. UTILITIES
   ============================================================ */

/* Focus-Ring */
*:focus-visible {
  outline: 2px solid var(--nr-accent);
  outline-offset: 2px;
}

/* Scrollbars */
::-webkit-scrollbar       { width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { background: var(--nr-line-strong); border-radius: 3px; }

/* Theme-Toggle-Button (in Masthead) */
#theme-toggle {
  background: transparent;
  border: none;
  font-size: 19px;
  line-height: 1;
  cursor: pointer;
  padding: 4px 6px;
  border-radius: var(--nr-radius);
  color: var(--nr-masthead-fg);
  opacity: 0.65;
  transition: opacity 120ms;
}
#theme-toggle:hover { opacity: 1; }


/* ============================================================
   9. EDITIONSINHALT
   ============================================================ */

/* EDITION_BODY_CSS (Single Source für Mail+Web) verwendet hardcodierte Hellmodus-Farben.
   Diese Overrides ersetzen sie im Web durch CSS-Variablen, die im Dark Mode automatisch
   die richtigen Werte liefern. Im Hellmodus stimmen die Variablen exakt mit den
   Hardcodes überein → keine Regression. */
.edition-content h3                  { color: var(--nr-ink) !important; }
.edition-content p,
.edition-content ul,
.edition-content ol,
.edition-content li                  { color: var(--nr-ink-soft) !important; }
.edition-content .quelle-source,
.edition-content .quelle,
.edition-content .read-more,
.edition-content .read-more:visited,
.edition-content .quellen-summary   { color: var(--nr-ink-mute) !important; }
.edition-content .ressort-header     { color: var(--nr-accent) !important; border-color: var(--nr-accent) !important; }
.edition-content .article-divider    { border-color: var(--nr-line-strong) !important; }
.edition-content .quelle-link,
.edition-content p a,
.edition-content li a                { color: var(--nr-accent) !important; }
.edition-content .quelle-link:hover,
.edition-content p a:hover,
.edition-content li a:hover          { filter: brightness(1.2); }


/* ============================================================
   10. AUDIO PLAYER
   ============================================================ */

.nr-audio-player {
  background: var(--nr-paper-2);
  border: 1px solid var(--nr-line-strong);
  border-left: 3px solid var(--nr-accent);
  border-radius: var(--nr-radius);
  padding: 1.1rem 1.25rem;
  display: flex;
  align-items: center;
  gap: 1rem;
  transition: box-shadow 0.15s;
}

.nr-audio-player:hover {
  box-shadow: 0 2px 14px color-mix(in srgb, var(--nr-accent) 10%, transparent);
}

.nr-audio-btn {
  flex-shrink: 0;
  width: 44px; height: 44px;
  background: var(--nr-accent);
  border-radius: 50%;
  border: none;
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: transform 0.15s;
  color: var(--nr-paper);
}
.nr-audio-btn:hover { transform: scale(1.06); }
.nr-audio-btn svg { pointer-events: none; }

.nr-audio-content { flex: 1; min-width: 0; }

.nr-audio-eyebrow {
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs6);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--nr-accent);
  margin-bottom: 3px;
}

.nr-audio-title {
  font-size: var(--nr-fs5);
  font-weight: 600;
  color: var(--nr-ink);
  line-height: 1.25;
  margin-bottom: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.nr-audio-info {
  font-size: var(--nr-fs6);
  color: var(--nr-ink-mute);
  font-family: var(--nr-font-mono);
  letter-spacing: 0.03em;
  margin-bottom: 7px;
}

.nr-audio-track {
  height: 2px;
  background: var(--nr-line-strong);
  border-radius: 1px;
  cursor: pointer;
  position: relative;
}

.nr-audio-fill {
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 0%;
  background: var(--nr-accent);
  border-radius: 1px;
}

/* Stimmenwahl + Tempo unter der Fortschrittsleiste (#325) — erzeugt von
   static/js/read-player.js, darum hier ohne Gegenstück in einer Vorlage. */
.nr-tts-settings {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1rem;
  margin-top: 7px;
  font-family: var(--nr-font-mono);
  font-size: var(--nr-fs6);
  color: var(--nr-ink-mute);
}

.nr-tts-settings label {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  min-width: 0;
}

.nr-tts-settings select {
  max-width: 13rem;
  min-width: 0;
  padding: 2px 4px;
  font-family: inherit;
  font-size: inherit;
  color: var(--nr-ink);
  background: var(--nr-paper);
  border: 1px solid var(--nr-line-strong);
  border-radius: var(--nr-radius);
}

.nr-tts-settings input[type="range"] {
  width: 6.5rem;
  accent-color: var(--nr-accent);
}

/* Options-Knopf am Kompakt-Player (29.08.2026): klappt die Stimme/Tempo-Karte
   unter der Player-Zeile auf, Standard zugeklappt. */
.nr-tts-optionen {
  flex-shrink: 0;
  align-self: center;
  background: none;
  border: none;
  padding: 0.4rem;
  cursor: pointer;
  color: var(--nr-ink-mute);
  border-radius: var(--nr-radius);
}

.nr-tts-optionen:hover,
.nr-tts-optionen[aria-expanded="true"] {
  color: var(--nr-ink);
}

.nr-optionen-karte {
  margin-top: 0.75rem;
  padding: 0.7rem 1.25rem;
  background: var(--nr-paper-2);
  border: 1px solid var(--nr-line-strong);
  border-radius: var(--nr-radius);
}

.nr-optionen-karte[hidden] { display: none; }

.nr-optionen-karte .nr-tts-settings { margin-top: 0; }

/* Bewertungs-Daumen im Feedback-Formular (28.08.2026): Umriss-Knopf statt
   Emoji-Radio, gewaehlt = gefuellt in Tinte. Das Radio bleibt unsichtbar im
   Formular; :has traegt den Zustand an den Knopf. */
.nr-daumen-wahl {
  display: inline-flex; align-items: center; justify-content: center;
  width: 46px; height: 40px;
  background: var(--nr-paper-2); border: 1px solid var(--nr-line-strong);
  border-radius: var(--nr-radius); color: var(--nr-ink-soft);
  cursor: pointer; transition: background 120ms, border-color 120ms, color 120ms;
}
.nr-daumen-wahl input { position: absolute; opacity: 0; pointer-events: none; }
.nr-daumen-wahl:hover { border-color: var(--nr-accent); color: var(--nr-accent); }
.nr-daumen-wahl:has(input:checked) {
  /* Akzent statt Tinte (Joerg 30.08.2026: kein Schwarz als Auswahl-Flaeche). */
  background: var(--nr-accent); border-color: var(--nr-accent); color: var(--nr-paper);
}
.nr-daumen-wahl:has(input:focus-visible) { outline: 2px solid var(--nr-accent); outline-offset: 2px; }

/* Daumen unter der Ausgabe + Feedback-Dialog (customer/_feedback_daumen.html):
   EIN Baustein fuer beide Layouts, deshalb hier und nicht in zeitungssatz.css
   (dort waere er im Kompakt-Layout lautlos wirkungslos). Der Hover nimmt im
   Magazin dessen Akzent (--v5-akzent gesetzt), sonst die Tinte. */
.nr-daumen {
  display: flex; justify-content: center; align-items: center; gap: 18px;
  padding: 12px 0 4px; margin-top: 1.5rem;
}
.nr-daumen-frage {
  font-family: var(--nr-font-display); font-size: 1.25rem; color: var(--nr-ink);
  margin-right: 8px;
}
.nr-daumen-knopf {
  width: 64px; height: 64px; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--nr-paper-2); border: 1px solid var(--nr-line); border-radius: 4px;
  color: var(--nr-ink-soft);
  cursor: pointer; transition: transform 120ms, border-color 120ms, color 120ms;
}
.nr-daumen-knopf:hover,
.nr-daumen-knopf:focus-visible {
  transform: translateY(-2px);
  border-color: var(--v5-akzent, var(--nr-accent));
  color: var(--v5-akzent, var(--nr-accent));
}
.nr-feedback-dialog {
  border: 1px solid var(--nr-line); border-top: 2px solid var(--nr-accent);
  padding: 0; background: var(--nr-paper-2); color: var(--nr-ink);
  width: min(560px, 92vw);
}
.nr-feedback-dialog::backdrop { background: rgba(22, 19, 14, 0.45); }
.nr-feedback-dialog .nr-panel { border: none; }
.nr-dialog-zu {
  position: absolute; top: 6px; right: 8px; z-index: 1;
  background: none; border: none; font-size: 1.6rem; line-height: 1;
  color: var(--nr-ink-mute); cursor: pointer; padding: 4px 8px;
}
.nr-dialog-zu:hover { color: var(--v5-akzent, var(--nr-accent)); }

.nr-player-row {
  display: flex;
  gap: 0.75rem;
  align-items: stretch;
}

.nr-player-row .nr-audio-player {
  flex: 2;
}

/* Audio temporär nicht verfügbar (TTS war nicht erreichbar) — ausgegraut, B-R2 */
.nr-audio-off {
  opacity: 0.45;
  cursor: default;
  pointer-events: none;
}

@media (max-width: 600px) {
  .nr-player-row {
    flex-direction: column;
  }

  .nr-player-row .nr-audio-player {
    flex: none;
    width: 100%;
    max-width: 100%;
  }
}

/* ============================================================
   RESPONSIVE NAV — Hamburger
   ============================================================ */

/* #370: .nr-hamburger (Haupt-Nav) und .nr-admin-hamburger (Admin-Nav) sind
   deklarationsidentisch — ein Rumpf, zwei Klassennamen, weil beide Navs
   getrennte Breakpoints/Media-Queries haben (s. u.). */
.nr-hamburger,
.nr-admin-hamburger {
  display: none;
  background: transparent;
  border: none;
  color: var(--nr-masthead-fg);
  opacity: 0.7;
  cursor: pointer;
  padding: 4px;
  line-height: 1;
}

/* Ausklappmenue: schmal und rechtsbuendig unter dem Hamburger, mit Theme +
   Abmelden analog zum Magazin-Seitenmenue (Joerg 29.08.2026). Verankert am
   INHALTSRAUM (.nr-rahmen), nicht am seitenbreiten Header; sonst klebt das
   Menue bei breitem Browser am Bildschirmrand. */
header.nr-masthead-bar > .nr-rahmen { position: relative; }
.nr-mobile-nav {
  display: none;
  position: absolute;
  top: 52px;
  right: 0;
  left: auto;
  min-width: 170px;
  text-align: right;
  background: var(--nr-masthead);
  border-bottom: 1px solid color-mix(in srgb, var(--nr-masthead-fg) 15%, transparent);
  border-left: 1px solid color-mix(in srgb, var(--nr-masthead-fg) 15%, transparent);
  z-index: 100;
  flex-direction: column;
  padding: 0.5rem 1rem 1rem;
}

.nr-mobile-nav--open {
  display: flex;
}

.nr-mobile-nav-link {
  color: var(--nr-masthead-fg);
  opacity: 0.8;
  text-decoration: none;
  font-size: 1rem;
  font-weight: 500;
  padding: 0.6rem 0;
  border-bottom: 1px solid color-mix(in srgb, var(--nr-masthead-fg) 10%, transparent);
}
.nr-mobile-nav-link:last-child { border-bottom: none; }
.nr-mobile-nav-link:hover { opacity: 1; color: var(--nr-masthead-fg); }

/* Theme + Abmelden als Menuezeilen (Joerg 29.08.2026): Knoepfe sehen aus wie
   die Links darueber, der Trenner setzt sie ab wie im Magazin-Seitenmenue. */
button.nr-mobile-nav-link {
  background: none; border-left: none; border-right: none; border-top: none;
  width: 100%; text-align: right; cursor: pointer;
  font: inherit; font-size: 1rem; font-weight: 500;
}
.nr-mobile-nav form { margin: 0; }
.nr-mobile-nav form .nr-mobile-nav-link { border-bottom: none; }
.nr-mobile-nav-trenner {
  height: 1px; margin: 6px 0;
  background: color-mix(in srgb, var(--nr-masthead-fg) 15%, transparent);
}

/* Portal-Nav IMMER als Hamburger (Joerg 29.08.2026); die Admin-Leiste unten
   behaelt ihren eigenen 860px-Breakpoint (Herleitung: 680-812px
   Leistenbreite je Sprache, html = 19px je rem; Joerg 09.08.2026). */
.nr-nav-desktop { display: none !important; }
.nr-hamburger   { display: flex; }
header { position: relative; }

/* Admin-Nav: mehr Links → höherer Breakpoint.
   Muss NACH der .nr-admin-hamburger-Basisregel stehen, sonst gewinnt
   deren display:none (gleiche Spezifität, spätere Regel). */
@media (max-width: 860px) {
  .nr-admin-nav-desktop { display: none !important; }
  .nr-admin-hamburger   { display: flex; }
  .nr-admin-env-badge   { display: none !important; }
}

/* Landing-Page-spezifische Styles */
.nr-landing-login {
  background: var(--nr-paper-2);
  border: 1px solid var(--nr-line-strong);
  border-top: 3px solid var(--nr-accent);
  border-radius: var(--nr-radius);
  padding: 1.75rem 1.5rem;
}

/* ===== Sprachumschalter (Landing-Masthead) ===== */
.nr-lang { position: relative; }
.nr-lang-btn {
  display: flex; align-items: center; gap: 0.4rem;
  background: transparent; border: none; cursor: pointer;
  color: var(--nr-masthead-fg); font-family: var(--nr-font-mono);
  font-size: 12px; letter-spacing: 0.04em;
  opacity: 0.75; padding: 4px 6px; border-radius: 8px;
  transition: opacity 120ms;
}
.nr-lang-btn:hover { opacity: 1; }
.nr-lang-flag {
  width: 19px; height: 13px; border-radius: 2px; display: block;
  object-fit: cover; box-shadow: 0 0 0 1px rgba(0,0,0,0.18);
}
/* Bewusste Ausnahme von der 12-px-Mindestschrift (#337): das Caret ist reines
   Symbol (▼), kein Text — 9px hält das Dreieck dezent neben der Flagge. */
.nr-lang-caret { font-size: 9px; opacity: 0.6; }
.nr-lang-menu {
  position: absolute; right: 0; top: calc(100% + 6px);
  min-width: 160px; padding: 0.3rem;
  background: var(--nr-paper);
  border: 1px solid var(--nr-line-strong);
  border-radius: var(--nr-radius);
  box-shadow: 0 8px 24px rgba(0,0,0,0.18);
  z-index: 60; display: none;
}
.nr-lang-menu.open { display: block; }
.nr-lang-item {
  display: flex; align-items: center; gap: 0.6rem;
  padding: 0.5rem 0.65rem; border-radius: calc(var(--nr-radius) - 3px);
  text-decoration: none; color: var(--nr-ink);
  font-size: 0.85rem; white-space: nowrap;
}
.nr-lang-item:hover { background: rgba(127,127,127,0.12); }
.nr-lang-item.active { font-weight: 600; }
.nr-lang-item.active::after { content: "✓"; margin-left: auto; opacity: 0.7; font-size: 0.8rem; }

/* Schmale Screens (Landing, abgemeldet): Sprachwähler auf Flagge+Pfeil eindampfen,
   Abstände verdichten — sonst schiebt die Zeile den Login-Knopf aus dem Bild
   (Joerg-Befund 2026-07-17: Knopf nur ~20% sichtbar). gap ist inline gesetzt,
   daher hier mit !important übersteuern. */
@media (max-width: 480px) {
  .nr-landing-nav { gap: 0.5rem !important; }
  .nr-lang-btn > span:not(.nr-lang-caret) { display: none; }
}

/* #411: Abstand über dem Zeitungskopf auf schmalen Screens eindampfen. */
@media (max-width: 480px) {
  main.nr-rahmen { padding-top: 1rem !important; }
  .nr-masthead-head { padding-top: 1rem !important; padding-bottom: 1rem !important; }
}

/* ===== Interessen-Prioritaet: Punkte (#277) =====
   Als CSS-Formen, NICHT als Schriftzeichen (●/○): Der Buchstabe "o" ist schmaler als "●"
   (Unicode-Breitenklasse Narrow vs. Ambiguous), und die Weiss-Kreis-Glyphe rendert je nach
   Schrift mit duennerem Strich — beides ergibt ungleich grosse Punkte. Hier haben gefuellt
   und leer per Konstruktion exakt dieselbe Groesse (gleiche width/height; der leere hat nur
   keinen Fuellhintergrund). Genutzt von Portal-Profil UND Admin-Kundenansicht. */
.nr-prio-dots {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  flex: none;
}
.nr-prio-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  box-sizing: border-box;
  border: 1px solid currentColor;
  background: currentColor;
}
.nr-prio-dot.is-empty {
  background: transparent;
  opacity: 0.45;
}

/* Wartekringel — bisher inline im Admin-Template nachgebaut (#277: einmal hier, statt
   zweimal inline). Respektiert die Systemeinstellung "Bewegung reduzieren". */
.nr-spinner {
  display: inline-block;
  width: 0.7rem;
  height: 0.7rem;
  border: 2px solid var(--nr-ink-mute);
  border-top-color: transparent;
  border-radius: 50%;
  animation: nr-spin 0.8s linear infinite;
}
@keyframes nr-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .nr-spinner { animation: none; opacity: 0.6; }
}
