﻿/* =====================================================================
   SightCity Reservierungssystem – Redesign von admin.css
   Für: Günter Hanke  ·  Von: Tarek / Dagmar  ·  Juli 2026

   Dieses Stylesheet stylt Günters BESTEHENDES HTML um (semantische
   Elemente: fieldset/legend/label/input/select/textarea, seine
   Reiter-Struktur .tabs/[role=tab]/[role=tabpanel], progress usw.).
   -> Ein Datei-Tausch (css/admin.css) verändert das ganze System.
   Keine HTML-Änderungen nötig.

   Schrift: Atkinson Hyperlegible (selbst gehostet, DSGVO).
   ===================================================================== */

@font-face { font-family:"Atkinson Hyperlegible"; font-weight:400; font-style:normal; font-display:swap; src:url("fonts/atkinson-hyperlegible-regular.woff2") format("woff2"); }
@font-face { font-family:"Atkinson Hyperlegible"; font-weight:700; font-style:normal; font-display:swap; src:url("fonts/atkinson-hyperlegible-bold.woff2") format("woff2"); }
@font-face { font-family:"Atkinson Hyperlegible"; font-weight:400; font-style:italic; font-display:swap; src:url("fonts/atkinson-hyperlegible-italic.woff2") format("woff2"); }

:root{
  --sc-primary:#eb1b1f; --sc-secondary:#922821; --sc-tertiary:#fbe74e; --sc-accent:#ea5b0c;
  /* ⚠⚠ SightCity-Rot ALS FLÄCHE UNTER WEISSER SCHRIFT (Dagmar, 24.08.2026).
     Gemessen: Weiß auf #eb1b1f ergibt 4,46:1 — WCAG 2.1 AA verlangt bei
     16-px-Text 4,5:1. Das betraf JEDEN primären Knopf im Portal, nicht nur
     einen; aufgefallen ist es beim Bau des Knopfes „Neue Nachricht schreiben".
     #dd1a1e ergibt 4,94:1 und hat damit Reserve für Rundungen und
     Kantenglättung.
     ⚠ DIE MARKENFARBE SELBST BLEIBT UNANGETASTET. --sc-primary gilt weiter für
     Text, Rahmen, Links und Marker; nur FLÄCHEN mit weißer Schrift nehmen
     diesen Ton. Dagmars Entscheidung: „Ein minimal dunkleres Rot nur für
     Knopfflächen — die Marke bleibt im Übrigen unangetastet."
     ⚠ Wer eine neue Fläche in Rot anlegt, nimmt --sc-primary-flaeche. Steht
     dort wieder --sc-primary, ist der Kontrast still wieder unter AA. */
  --sc-primary-flaeche:#dd1a1e;
  --sc-bg:#f9f7ff; --sc-surface:#fff; --sc-base:#e9e6ed; --sc-fg:#0e1111; --sc-muted:#575756;
  --sc-info:#005a8c;
  /* ⚠ --sc-success WAR #1f8e30 und erreichte damit nur 4,23:1 auf Weiß — unter
     den 4,5:1, die WCAG 2.1 AA für normalen Text verlangt. Gemessen mit
     lokal-test/pruef-statusfarben.php, gemeldet seit dem 25.08.2026, von
     Dagmar am 26.08.2026 zur Änderung freigegeben.
     #1b7f2b ergibt 5,10:1 und ist nur eine Spur dunkler — der Farbcharakter
     bleibt erhalten.
     ⚠ WARUM DAS ABDUNKELN IN BEIDE RICHTUNGEN HILFT: Das Token ist an manchen
     Stellen TEXTFARBE auf hellem Grund (.dash-kachel__status--ok,
     .useradmin-status--ok, .deadlines-status--offen …) und an anderen FLÄCHE
     mit weißer Schrift darauf (.sc-tabstatus--done, progress). Beide
     Verhältnisse sind dieselbe Rechnung, nur seitenverkehrt — ein dunklerer
     Ton verbessert deshalb beide zugleich. Ein HELLERER hätte das eine
     verbessert und das andere verschlechtert. */
  --sc-success:#1b7f2b;
  /* ⚠ --sc-live ist ein ABGEDUNKELTER --sc-accent (#ea5b0c) und kein neuer
     Markenton. Grund: --sc-accent ergibt auf weißem Grund nur 3,50:1 und fällt
     damit unter AA, sobald er Text einfärbt statt einer Fläche. #b34700 ergibt
     5,50:1. Gebraucht wird er für "läuft gerade" in der Vortragsübersicht --
     der einzige Zustand, der Aufmerksamkeit will, ohne Alarm zu sein. */
  --sc-live:#b34700;
  --sc-border:rgba(14,17,17,.14); --sc-border-strong:rgba(14,17,17,.28);
  --sc-radius:10px; --sc-pill:25px;
  /* ---- Zwei Spuren, wie auf sightcity.net (Dagmar 05.08.2026) -------------
     Dagmar: "Ist es moeglich die Gesamtbreite des Reservierungssystems auch
     auf 1640px umzustellen?" -- moeglich ja, aber nicht fuer ALLES.

     --sc-spur-inhalt  fuer Text und Formulare. Bleibt bei 1024 px. Eine
       Textzeile ueber 1640 px ist fuer sehbehinderte Leserinnen und Leser
       kaum noch zu verfolgen: Beim Zeilenwechsel verliert man die Zeile
       (WCAG 1.4.8). Genau das ist bei SightCity die Kernzielgruppe, und
       1024 px ist Dagmars eigene Vorgabe fuer das Redesign.
     --sc-spur-breit   fuer Kopf und Fusszeile, also fuer Leisten, in denen
       nebeneinander gearbeitet wird. Damit steht die Navigation bei breiten
       Fenstern neben dem Logo -- so wie auf sightcity.net.

     Die Website macht es genauso (Content 1300, Wide 1640). Wer die
     Gesamtbreite doch umstellen will, aendert HIER eine Zahl. */
  /* ⚠ 1024 -> 1280 am 05.08.2026 (Dagmar). Die Navigationsleiste steht seither
     neben dem Logo, damit hat der Inhalt Platz. 1280 statt 1640: Eine Textzeile
     ueber rund 80 Zeichen verliert man beim Zeilenwechsel -- das trifft
     sehbehinderte Leser zuerst (WCAG 1.4.8). Einzelne Textbloecke sind
     zusaetzlich auf 65ch begrenzt, das bleibt. */
  --sc-spur-inhalt:1280px; --sc-spur-breit:1640px;

  /* ---- Die kleinste erlaubte Schrift (Dagmar 05.08.2026) -----------------
     „Ich glaube, mit fast jeder Überarbeitung wird die Schrift kleiner.“
     Nachgemessen: Die Grundschrift war unveraendert 16 px, aber 38 Elemente
     lagen darunter -- bis hinunter zu 12,5 px, und darunter ausgerechnet die
     STATUS-Zeichen der Checkliste und die Statuszeile der Kacheln.
     Bei einer Messe fuer blinde und sehbehinderte Menschen ist 12,5 px keine
     Feinheit, sondern ein Fehler.
     0.875rem = 14 px ist ab jetzt die Untergrenze. Wer kleiner will, braucht
     einen Grund, der hier danebensteht. Und IMMER rem, nie em: em rechnet vom
     Elternelement und schrumpft in Verschachtelungen weiter. */
  --sc-klein:0.875rem;
  --sc-font:"Atkinson Hyperlegible","DM Sans",Inter,-apple-system,Segoe UI,Roboto,Arial,sans-serif;
}

*,*::before,*::after{ box-sizing:border-box; }

body{
  margin:0; background:var(--sc-bg); color:var(--sc-fg);
  font-family:var(--sc-font); font-size:16px; line-height:1.6;
}
/* zentrierter Inhaltsbereich – seine Struktur: <main id="inhalt"> */
main#inhalt, main{ display:block; max-width:var(--sc-spur-inhalt); margin-inline:auto; padding:1.5rem 1rem 3rem; }

/* ---- Typografie ---- */
h1{ font-size:clamp(1.9rem,1.5rem + 1.8vw,2.6rem); line-height:1.25; margin:.2em 0 .6em; }
h2{ font-size:clamp(1.4rem,1.2rem + 1vw,1.9rem); line-height:1.3; margin:.4em 0 .4em; }
h3{ font-size:1.2rem; margin:.4em 0 .3em; }
a{ color:var(--sc-secondary); text-underline-offset:.15em; }
a:hover{ color:var(--sc-primary); }

/* ---- sichtbarer Fokus (WCAG) ---- */
:where(a,button,input,select,textarea,[tabindex],[role="tab"]):focus-visible{
  outline:3px solid var(--sc-info); outline-offset:2px; border-radius:3px;
}

/* ---- Kopf-Navigation – seine Struktur: <nav id="menu"><ul> ---- */
nav#menu{ background:var(--sc-fg); }
nav#menu ul{
  list-style:none; margin:0 auto; padding:.5rem 1rem; max-width:var(--sc-spur-inhalt);
  display:flex; flex-wrap:wrap; gap:.3rem 1.2rem; align-items:center;
}
nav#menu li{ margin:0; }
nav#menu a{ color:#fff; text-decoration:none; font-weight:700; display:inline-flex; align-items:center; gap:.5rem; }
nav#menu a:hover{ color:var(--sc-tertiary); }
nav#menu img.footerlogo{ height:38px; width:auto; background:#fff; padding:2px 6px; border-radius:6px; }

/* ---- Sprachauswahl (aid=0): <div id="language"> ---- */
#language{ max-width:var(--sc-spur-inhalt); margin:1.25rem auto; padding-inline:1rem; }
#language ul{ list-style:none; padding:0; margin:.4rem 0 0; display:flex; gap:.5rem; flex-wrap:wrap; }
#language a{ display:inline-block; padding:.5rem 1.1rem; border:1px solid var(--sc-border-strong); border-radius:var(--sc-pill); text-decoration:none; font-weight:700; background:var(--sc-surface); }
#language a:hover{ border-color:var(--sc-primary); color:var(--sc-primary); }

/* ---- Footer: <footer><hr>© … ---- */
footer{ max-width:var(--sc-spur-inhalt); margin:2rem auto 0; padding:1rem; color:var(--sc-muted); font-size:var(--sc-klein); }
footer hr{ border:0; border-top:1px solid var(--sc-border); margin:0 0 .8rem; }

/* ---- Listen / Tabellen (Admin-Übersichten) ---- */
table{ width:100%; border-collapse:collapse; margin:1rem 0; background:var(--sc-surface); border:1px solid var(--sc-border); border-radius:var(--sc-radius); overflow:hidden; }
caption{ text-align:left; font-weight:700; margin-bottom:.4rem; }
th,td{ text-align:left; padding:.6rem .8rem; border-bottom:1px solid var(--sc-border); }
thead th{ background:var(--sc-fg); color:#fff; }
/* ⚠ SORTIERLINKS IM TABELLENKOPF SIND WEISS (Dagmar, 24.08.2026):
   „Bei der Listenansicht ist die Kopfzeile im Hintergrund schwarz, Du hast die
   Schrift nun in SightCity Dunkelrot gemacht, weil die Felder sortierbar sind.
   Bitte wieder weiß machen, sonst passt der Kontrast von Schrift, Dreiecken
   und Hintergrund nicht."
   Sie hat recht: SightCity-Dunkelrot auf dem dunklen Kopfgrund reißt den
   Kontrast weit unter die 4,5:1 aus WCAG 2.1 AA — und die Sortierdreiecke
   verschwinden mit. Weiß auf var(--sc-fg) liegt darüber.
   ⚠ Die Unterstreichung bleibt: Ohne sie wäre der Link im weißen Kopftext an
   NICHTS mehr als Link zu erkennen — Farbe allein darf ein Bedienelement
   ohnehin nie kennzeichnen. Dieselbe Lösung wie seit je bei .standliste. */
thead th a{ color:#fff; text-decoration:underline; }
thead th a:hover, thead th a:focus{ color:#fff; text-decoration:none; }
tbody tr:nth-child(even){ background:var(--sc-bg); }
tbody tr:hover{ background:var(--sc-base); }
tbody tr:last-child td{ border-bottom:0; }

/* ---- Scroll-Rahmen für breite Datentabellen (Seite::tabellenrahmen) -------
   Befund vom 05.08.2026 (fuer-merge/responsiv-befund.md, Abschnitt 2): Neun
   Datentabellen laufen bei 360 px über und ziehen die GANZE SEITE waagerecht
   mit. Dann wandern Navigation, Firmenband und Überschrift nach links aus dem
   Bild; man muss erst zurückscrollen, um irgendwohin zu klicken.

   WCAG 2.1, Kriterium 1.4.10 (Reflow) nimmt Datentabellen ausdrücklich aus:
   Die Tabelle DARF scrollen, die Seite nicht. Muster dafür gab es schon --
   .hallenplan und .deadlines-ueberblick machten es richtig; hier steht es
   jetzt an einer Stelle für alle.

   ⚠ Der Rahmen trägt tabindex="0" (siehe klassen/seite.php). Ein Bereich mit
   overflow-x:auto lässt sich sonst nur mit der Maus schieben -- deshalb MUSS
   der Fokus sichtbar sein, sonst weiß niemand, dass er gerade die Tabelle in
   der Hand hat und mit den Pfeiltasten schieben kann.
   --------------------------------------------------------------------- */
.tabellenrahmen{ overflow-x:auto; max-width:100%; }
.tabellenrahmen:focus-visible{ outline:3px solid var(--sc-info); outline-offset:2px; }
/* Die Tabelle hat oben margin:1rem 0 -- im Rahmen würde der obere Abstand den
   Fokusrahmen unnötig hoch machen. Der Abstand gehört an den Rahmen. */
.tabellenrahmen{ margin:1rem 0; }
.tabellenrahmen > table{ margin-top:0; margin-bottom:0; }

/* ---- Formular-Abschnitte: fieldset als Karte ---- */
/* ⚠ min-width:0 ist hier KEINE Kosmetik (Messung 07.08.2026). Ein <fieldset>
   hat vom Browser her ein implizites min-inline-size: min-content und
   schrumpft deshalb NICHT unter die Breite seines breitesten Inhalts -- als
   einziges Element im ganzen Dokument. Auf schmalen Fenstern hat das die Seite
   waagerecht gezogen: „Paket wählen" um 35 px, der Logo-Bereich der
   Firmendaten um 70 px. Man sucht das lange am falschen Ende, weil an den
   Kindern alles richtig aussieht. */
form fieldset{
  border:1px solid var(--sc-border); border-radius:var(--sc-radius);
  background:var(--sc-surface); padding:1.25rem 1.25rem .75rem; margin:0 0 1.25rem;
  min-width:0;
}
fieldset{ min-width:0; }
form legend{ font-weight:700; font-size:1.15rem; padding:0 .4rem; color:var(--sc-fg); }
form legend h1,form legend h2,form legend h3{ margin:0; font-size:inherit; }

/* ---- Felder ---- */
label{ display:block; font-weight:700; margin:.4rem 0 .2rem; }
:where(input,select,textarea):not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=file]):not([type=button]){
  width:100%; font:inherit; font-size:16px; color:var(--sc-fg); background:var(--sc-surface);
  padding:.55rem .7rem; border:1px solid var(--sc-border-strong); border-radius:var(--sc-radius);
}
:where(input,select,textarea):focus{ border-color:var(--sc-info); }
input[readonly]{ background:var(--sc-base); color:var(--sc-muted); }
/* ⚠ Das Dateifeld ist von der Regel darueber ausdruecklich ausgenommen
   (:not([type=file])) -- mit width:100% wuerde der Auswahlknopf mitwachsen und
   albern aussehen. Ohne Obergrenze behaelt es aber seine eingebaute Breite und
   ragt auf schmalen Fenstern heraus: Am 07.08.2026 war es mit 353 px der
   letzte Grund, warum die Firmendaten bei 360 px noch waagerecht liefen. */
input[type=file]{ max-width:100%; }

/* Checkbox / Radio: nebeneinander mit Label */
input[type=checkbox],input[type=radio]{ width:auto; margin:0 .4rem .3rem 0; vertical-align:middle; transform:translateY(-1px); }
input[type=checkbox]+label,input[type=radio]+label{ display:inline; font-weight:400; margin:0; }

/* ---- Buttons ---- */
button,input[type=submit]{
  font:inherit; font-weight:700; cursor:pointer; line-height:1;
  /* ⚠ max-width, damit ein langer Knopftext auf schmalen Fenstern nicht die
     ganze Seite waagerecht zieht (Messung 07.08.2026). Bei <button> bricht der
     Text dann um; ein <input type="submit"> KANN nicht umbrechen -- dort steht
     die Beschriftung besser in einem <button> (siehe masken/booking.php). */
  max-width:100%;
  padding:.66em 1.4em; border-radius:var(--sc-pill);
  background:var(--sc-primary-flaeche); color:#fff; border:2px solid var(--sc-primary);
}
button:hover,input[type=submit]:hover{ background:var(--sc-fg); border-color:var(--sc-fg); }
input[type=file]{ font:inherit; }

/* ---- Zeichenzähler (progress + Textanzeige) ---- */
progress{ width:100%; height:6px; -webkit-appearance:none; appearance:none; border:0; margin:.3rem 0; }
progress::-webkit-progress-bar{ background:var(--sc-base); border-radius:3px; }
progress::-webkit-progress-value{ background:var(--sc-success); border-radius:3px; }
progress::-moz-progress-bar{ background:var(--sc-success); border-radius:3px; }
[id$="_text"]{ display:inline; font-size:.875rem; color:var(--sc-muted); }

/* =====================================================================
   Reiter LINKS (vertikal, Einstellungsseiten-Stil) mit Status-Anzeige
   Nutzt Günters vorhandenes tab / tabpanel-Markup, nur per CSS/JS.
   ===================================================================== */
.tabs{ display:grid; grid-template-columns:264px 1fr; gap:1.25rem; align-items:start; }
.tabs [role="tablist"]{
  display:flex; flex-direction:column; gap:.4rem;
  position:sticky; top:1rem;
}
.tabs [role="tab"]{
  font:inherit; font-weight:700; cursor:pointer; text-align:left;
  display:flex; align-items:center; gap:.6rem;
  background:var(--sc-surface); color:var(--sc-fg);
  border:1px solid var(--sc-border); border-radius:var(--sc-radius);
  padding:.7rem 1rem;
}
.tabs [role="tab"]:hover{ border-color:var(--sc-primary); }
.tabs [role="tab"][aria-selected="true"]{
  background:var(--sc-fg); color:#fff; border-color:var(--sc-fg);
}
.tabs [role="tabpanel"][hidden]{ display:none; }

/* Status-Kreis pro Reiter (von sc-tabs.js eingesetzt) */
/* ⚠ font-size .78em -> var(--sc-klein) am 05.08.2026 (Dagmar: „mit fast jeder
   Überarbeitung wird die Schrift kleiner“). Gemessen stimmte das: Die
   Grundschrift war unverändert 16 px, aber dieses Zeichen stand bei 12,5 px --
   und es ist kein Zierrat, sondern der STATUS eines Schrittes (erledigt /
   offen / Achtung). Ausgerechnet die Angabe, auf die es ankommt, war die
   kleinste auf der Seite.

   em statt rem war dabei die Falle: .78em rechnet vom ELTERNELEMENT, und in
   einer verschachtelten Liste schrumpft es mit jeder Ebene weiter. */
.sc-tabstatus{
  margin-left:auto; flex:none; width:1.5em; height:1.5em; border-radius:50%;
  display:grid; place-items:center; font-size:var(--sc-klein); font-weight:700;
}
.sc-tabstatus--done{ background:var(--sc-success); color:#fff; }
.sc-tabstatus--warn{ background:var(--sc-accent); color:#fff; }
.sc-tabstatus--open{ background:var(--sc-base); color:var(--sc-muted); border:1px solid var(--sc-border-strong); }
[role="tab"][aria-selected="true"] .sc-tabstatus--open{ background:rgba(255,255,255,.15); color:rgba(255,255,255,.8); border-color:rgba(255,255,255,.3); }

/* Screenreader-only */
.sc-sr{ position:absolute!important; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }

@media (max-width:820px){
  /* ⚠ minmax(0,1fr), nicht 1fr. Ein „1fr" ist in Wahrheit minmax(AUTO,1fr),
     und dieses auto ist die min-content-Breite des Inhalts: Die Spur kann
     dadurch BREITER werden als das Raster selbst. Genau so war es -- .tabs war
     328 px breit, die Spur darin 434 px, und die Firmendaten zogen die Seite um
     90 px nach rechts (Messung 07.08.2026). Mit minmax(0,1fr) darf die Spur
     schrumpfen, und die Felder darin richten sich nach dem Fenster. */
  .tabs{ grid-template-columns:minmax(0,1fr); }
  /* ⚠ position:relative statt static (Befund Paket „Header", 05.08.2026).
     Hier stand static. Die Reiterknöpfe enthalten eine .sc-sr-Spanne (nur für
     die Sprachausgabe), die mit position:absolute gesetzt ist. Ohne einen
     positionierten Vorfahren verliert sie ihren Bezugsrahmen, richtet sich am
     Seitenkörper aus und zieht die Seitenbreite auf 1138 px – bei 400 % Zoom
     also waagerechtes Scrollen über die ganze Seite (WCAG 1.4.10).
     relative behebt drei der vier Tablet-Fälle; gegengetestet.
     Am Umbruchverhalten der Leiste ändert es nichts. */
  .tabs [role="tablist"]{ flex-direction:row; overflow-x:auto; position:relative; }
  .tabs [role="tab"]{ white-space:nowrap; }
}

/* ---- Meldungen / Fehler (show_error nutzt h2) ---- */
.error,[role="alert"]{
  background:#fdeaea; border-left:6px solid var(--sc-primary);
  padding:.8rem 1rem; border-radius:0 var(--sc-radius) var(--sc-radius) 0;
}

/* ---- reduzierte Bewegung ---- */
@media (prefers-reduced-motion:reduce){ *{ transition:none!important; animation:none!important; } }

/* ===== Portal-Ergaenzungen (Fundament) ===== */

/* Sprunglink: unsichtbar bis er den Tastaturfokus bekommt */
.sprunglink { position: absolute; left: -9999px; top: 0; background: #003c8f; color: #fff; padding: 0.6em 1em; z-index: 100; }
.sprunglink:focus { left: 0; }

/* Statusmeldung (aria-live) */
.meldung { background: #e1f5ee; border: 2px solid #0f6e56; color: #04342c; padding: 0.6em 1em; border-radius: 6px; }

/* Eine RÜCKFRAGE, keine Erfolgsmeldung (Rüstzeit-Warnung, DA8 25.08.2026).
   ⚠ .meldung ist grün — sie sagt „hat geklappt". Eine Rückfrage, die genauso
   aussieht, wird weggeklickt, ohne gelesen zu werden. Deshalb ein eigener
   Modifikator statt derselben Farbe.
   ⚠ KEIN Rot: Rot ist im Portal die Fehlermeldung (.formular-fehler), und
   hier ist nichts falsch — es ist eine bewusste Ausnahme, die bestätigt werden
   soll. Gemessen: #4a3708 auf #fdf3d8 ergibt 9,8:1. */
.meldung--warnung { background: #fdf3d8; border-color: #8a6d1f; color: #4a3708; }

/* Formular-Fehlerblock und Feldfehler */
.formular-fehler { background: #fcebeb; border: 2px solid #a32d2d; color: #501313; padding: 0.6em 1em; border-radius: 6px; }
.formular-fehler a { color: #791f1f; }
.feldfehler { display: block; color: #a32d2d; }
.hilfe { display: block; font-size: 0.9em; color: #444441; }
.pflicht { color: #a32d2d; }

/* zweistufige Navigation: Website-Leiste + Ausstellerbereich-Leiste im Kopf.
   Beide als waagerechte Leiste, damit man flüssig zwischen den Modulen wechselt. */
header { background: var(--sc-fg); }
#hauptnavigation ul, .portal-nav ul {
  list-style: none; margin: 0 auto; max-width: var(--sc-spur-inhalt);
  padding: .5rem 1rem; display: flex; flex-wrap: wrap; gap: .3rem 1.2rem; align-items: center;
}
#hauptnavigation a, .portal-nav a { color: #fff; text-decoration: none; font-weight: 700; }
#hauptnavigation a:hover, .portal-nav a:hover { color: var(--sc-tertiary); }

/* DREI EBENEN, farblich getrennt (Dagmar 31.7.2026):
     1. Hauptnavigation der Website  -- schwarz (header)
     2. Ausstellerbereich            -- weiss auf schwarz
     3. Messeleitung                 -- weiss auf SightCity-Rot
   Die dünne Linie bleibt zusätzlich: Farbe allein darf nie das einzige
   Unterscheidungsmerkmal sein. */
.portal-nav { background: var(--sc-fg); border-top: 1px solid rgba(255,255,255,0.4); }

/* WARUM DAS DUNKLE ROT (--sc-secondary) UND NICHT --sc-primary?
   Weiss auf dem hellen SightCity-Rot #eb1b1f ergibt ein Kontrastverhaeltnis von
   4,46:1 und liegt damit UNTER der WCAG-2.1-AA-Grenze von 4,5:1 -- ausgerechnet
   in einem Portal fuer blinde und sehbehinderte Menschen. Weiss auf dem
   dunkleren Marken-Rot #922821 erreicht 8,24:1 und damit sogar AAA.
   Es bleibt erkennbar SightCity-Rot, ist aber lesbar. */
.portal-nav--admin { background: var(--sc-secondary); border-top: 2px solid #fff; }

/* ---- Der persoenliche Schnellzugriff (Dagmars DG1, 03.09.2026) --------
   Er steht als eigene Leiste ueber den beiden grossen und erbt von
   .portal-nav Farbe, Abstaende und die Auszeichnung der aktuellen Seite.
   ⚠ Er bekommt einen EIGENEN Grundton, damit man ihn nicht fuer eine der
   beiden Leisten haelt -- --sc-info (#005a8c) mit Weiss erreicht 8,6:1 und
   liegt damit ueber AAA. Kein neuer Farbwert: Der Ton ist im Portal schon
   gepruefte Markenfarbe.
   ⚠ Und ein Rahmen unten, damit die Grenze zur naechsten Leiste auch ohne
   Farbwahrnehmung zu sehen ist. */
.portal-nav--schnell { background: var(--sc-info); border-top: none; }
.portal-nav--schnell .portal-nav__leiste { border-bottom: 1px solid rgba(255,255,255,.35); }

/* aktuelles Modul: dreifach erkennbar (Farbe + Form/Pille + Fettschrift),
   nicht rein farbbasiert -- so bleibt es auch ohne Farbwahrnehmung eindeutig */
.portal-nav a[aria-current="page"] {
  color: var(--sc-fg); background: var(--sc-tertiary);
  padding: .15em .7em; border-radius: var(--sc-pill);
}

/* ===== Stand-Buchung ===== */

/* Legende mit Musterflächen (Farbe sichtbar zeigen) */
.standlegende { list-style: none; display: flex; flex-wrap: wrap; gap: 1em; padding: 0.6em 0.8em; margin: 0 0 1em; background: #f6f5f1; border: 1px solid #ddd; border-radius: 8px; }
.standlegende li { display: flex; align-items: center; gap: 0.5em; }
.legendefarbe { display: inline-block; width: 26px; height: 18px; border-radius: 4px; border: 1px solid rgba(0,0,0,0.35); }
.legendesymbol { width: 20px; height: 20px; background: #fff; border: 1px solid #ccc; border-radius: 4px; padding: 1px; box-sizing: border-box; vertical-align: middle; }
/* Der ausgeschriebene Farbname hinter dem Status (Guenter Hanke 06.08.2026).
   Etwas zurueckgenommen, aber NICHT kleiner: --sc-klein ist die Untergrenze,
   und der Name ist der Teil, der auch vorgelesen wird. */
.legendefarbname { color: #4a4a4a; }

/* Ampel-Punkt in der Standliste */
.ampel { display: inline-block; width: 14px; height: 14px; border-radius: 50%; border: 1px solid rgba(0,0,0,0.3); vertical-align: -2px; }

/* Standliste als Tabelle */
.standliste { border-collapse: collapse; width: 100%; margin: 0.5em 0 1.5em; }
.standliste caption { text-align: left; font-weight: bold; margin-bottom: 0.4em; }
.standliste th, .standliste td { text-align: left; padding: 6px 10px; border-bottom: 1px solid #e2e0d8; }
.standliste thead th { background: #2c2c2a; color: #fff; }
/* Sortier-Links in den Spaltenueberschriften weiss lassen (Dagmar 14.7.): die
   Sortierfunktion bleibt, die Ueberschrift hebt sich nicht durch Linkfarbe ab. */
.standliste thead th a { color: #fff; text-decoration: underline; }
.standliste thead th a:hover, .standliste thead th a:focus { color: #fff; text-decoration: none; }
.standliste tbody tr:nth-child(even) { background: #f6f5f1; }
/* Stände (Admin): Gruppierung nach Status (Dagmar 30.7.2026) -- erst alle
   Reservierungen, dann die fest gebuchten, dann die bestätigten usw. */
.standadmin-gruppe { margin: 1.6rem 0; }
.standadmin-gruppe > h2 { margin: 0 0 .4rem; font-size: 1.25rem; }
.standadmin-ueberblick { margin: .3rem 0 1.2rem; }
.standadmin-ueberblick a { white-space: nowrap; }

/* Hallenplan: begrenzte Höhe, scrollbar, damit die Seite nicht endlos wird */
.hallenplan { max-width: 100%; max-height: 70vh; overflow: auto; border: 1px solid #ddd; border-radius: 8px; background: #fff; padding: 8px; }
.hallenplan svg { max-width: 100%; height: auto; }

/* anklickbare Stände */
a.stand { cursor: pointer; }
a.stand:focus rect, a.stand:focus polygon, a.stand:focus circle,
a.stand:hover rect, a.stand:hover polygon, a.stand:hover circle { stroke-width: 16; }
a.stand:focus { outline: 3px solid #003c8f; outline-offset: 2px; }

/* Ebenen-Reiter */
.ebenenreiter { list-style: none; display: flex; flex-wrap: wrap; gap: 4px; padding: 0; margin: 0.5em 0; border-bottom: 2px solid #2c2c2a; }
.ebenenreiter a { display: inline-block; padding: 0.5em 1em; background: #eee; border-radius: 6px 6px 0 0; text-decoration: none; }
.ebenenreiter a[aria-current="page"] { background: #2c2c2a; color: #fff; font-weight: bold; }

.ansichtswahl, .sortwahl, .filterwahl { margin: 0.4em 0; }
.ansichtswahl a[aria-current], .filterwahl a[aria-current] { font-weight: bold; text-decoration: none; }

/* Abschnitte etwas absetzen */
section[aria-labelledby] { margin: 1.5em 0; padding: 1em 1.2em; background: #fbfaf7; border: 1px solid #e2e0d8; border-radius: 10px; }

/* ===== Startseite / Dashboard =====
   Nutzt dieselben Tokens und Status-Kreise (.sc-tabstatus) wie die Reiter,
   damit die Startseite im gleichen CD/CI wie z. B. "Firmendaten bearbeiten"
   erscheint. Nur Anordnung, keine neuen Farben. */

/* Begrüßung */
.dash-banner { display: flex; flex-wrap: wrap; align-items: baseline; gap: .8rem; margin: .2em 0 1.2rem; }
.dash-banner h1 { margin: 0; }
.dash-titelblock { display: flex; flex-direction: column; gap: .15rem; }
.dash-stand { color: var(--sc-muted); font-weight: 700; font-size: 1.1rem; }
.dash-firma { display: block; color: var(--sc-muted); font-size: 1rem; }
.dash-paket { color: var(--sc-muted); font-weight: 700; font-size: 1.1rem; }

/* Hinweisbanner (Stand reserviert, aber nicht gebucht) */
/* Der Hinweisbereich der Startseite (Guenter E5, 14.08.2026).
   Er bekommt den Tastaturfokus, damit ein Screenreader ihn ansagt -- ohne
   sichtbaren Rahmen sieht ein sehender Tastaturnutzer dann aber nicht, wo er
   gelandet ist. outline statt border: eine Umrandung verschoebe das Layout. */
.dash-hinweise { margin: 0 0 1.4rem; }
.dash-hinweise > h2 { font-size: 1.05rem; margin: 0 0 .6rem; }
.dash-hinweise:focus { outline: 3px solid var(--sc-accent); outline-offset: 4px; }
/* Der letzte Hinweis braucht keinen Abstand nach unten -- den hat der Bereich. */
.dash-hinweise .dash-hinweis:last-child { margin-bottom: 0; }

.dash-hinweis { background: #fff7e6; border-left: 6px solid var(--sc-accent); padding: .9rem 1.1rem; border-radius: 0 var(--sc-radius) var(--sc-radius) 0; margin: 0 0 1.2rem; }
.dash-hinweis strong { display: block; margin-bottom: .2rem; }
.dash-hinweis .dash-btn { margin-top: .7rem; }
/* ⚠ Interessenten ohne Firma sind KEINE Arbeitsliste, sondern eine
   Beobachtung -- deshalb ruhiger als die Hinweise, bei denen jemand
   entscheiden muss. Der Unterschied steht im TEXT; die Farbe unterstuetzt
   ihn nur (Dagmar 19.08.2026). */
.dash-hinweis--interessenten { background: var(--sc-surface); border-left-color: var(--sc-muted); }

/* Karte (gleicher Look wie fieldset) */
.dash-karte { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); background: var(--sc-surface); padding: 1.25rem; }

/* Fortschritt in vier Phasen */
.dash-phasen { display: grid; gap: 1.25rem; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); margin: .6rem 0 0; padding: 0; list-style: none; }
.dash-phase { margin: 0; }
.dash-phase h3 { font-size: 1rem; margin: 0 0 .5rem; }
.dash-checkliste { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; }
.dash-check { display: flex; align-items: flex-start; gap: .6rem; }
.dash-check .sc-tabstatus { margin-left: 0; width: 1.4em; height: 1.4em; margin-top: .1em; }
.dash-check--done .dash-check__text { color: var(--sc-muted); text-decoration: line-through; }

/* Abschnitts-Überschriften */
.dash-abschnitt { margin: 2rem 0 1rem; }

/* Karten-Raster */
.dash-karten { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); margin: 0 0 1rem; }
.dash-kachel { display: flex; flex-direction: column; gap: .5rem; }
.dash-kachel h3 { margin: 0; font-size: 1.2rem; }
.dash-kachel p { margin: 0; color: var(--sc-muted); flex: 1; }
.dash-kachel__status { font-size: 1rem; font-weight: 700; }
.dash-kachel__status--ok { color: var(--sc-success); }
.dash-kachel__status--todo { color: var(--sc-accent); }
.dash-kachel__aktion { display: flex; gap: .5rem; flex-wrap: wrap; margin-top: .3rem; }

/* "in Vorbereitung"-Marke (Nachrichtenzentrale). Die Regel .dash-kachel--bald
   ist am 05.08.2026 entfallen -- die Kachelart, zu der sie gehoerte, gibt es
   seit dem Zusammenbau vom 03.08. nicht mehr. */
.dash-bald { display: inline-block; font-size: var(--sc-klein); font-weight: 700; padding: .15em .6em; border-radius: var(--sc-pill); background: var(--sc-base); color: var(--sc-muted); }
.dash-bald-text { color: var(--sc-muted); }

/* Aktions-Link im Button-Look (konsistent mit den echten Buttons) */
.dash-btn { display: inline-block; font-weight: 700; text-decoration: none; padding: .5em 1.2em; border-radius: var(--sc-pill); background: var(--sc-primary-flaeche); color: #fff; border: 2px solid var(--sc-primary); }
.dash-btn:hover { background: var(--sc-fg); border-color: var(--sc-fg); color: #fff; }

/* Weitere Schritte */
.dash-weitere { margin-top: 2rem; border-top: 1px solid var(--sc-border); padding-top: 1.2rem; }
.dash-weitere ul { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.dash-weitere a { font-weight: 700; text-decoration: none; }

/* ===== Aktions-Links in Tabellen-Zeilen (z. B. Benutzerverwaltung) =====
   Statt massiver Buttons: schlanke, klar getrennte Links (weniger Platz,
   laufen nicht ineinander). Bleiben <button> im POST-Formular (barrierefrei). */
.aktion-link { background: none; border: 0; padding: 0; margin: 0 .2rem; font: inherit; font-weight: 700; color: var(--sc-secondary); text-decoration: underline; text-underline-offset: .15em; cursor: pointer; line-height: 1.6; }
.aktion-link:hover { color: var(--sc-primary); background: none; }
.aktion-link:focus-visible { outline: 3px solid var(--sc-info); outline-offset: 2px; }
/* Aktionen einer Zeile untereinander stapeln (übersichtlicher als nebeneinander) */
.stapel-aktionen { display: flex; flex-direction: column; align-items: flex-start; gap: .15rem; }
.stapel-aktionen form { display: block; margin: 0; }
.stapel-aktionen .aktion-link { margin: 0; }

/* ===== Zeichenzähler (Live "42 / 300" unter längenbegrenzten Feldern) ===== */
.zeichenzaehler { display: block; font-size: .8rem; color: var(--sc-muted); text-align: right; margin: .1rem 0 0; }

/* ===== Firmendaten: Veröffentlichungs-Hinweis + Logo-Alt-Text ===== */
.exhibitor-veroeffentlichung { font-weight: 700; }
/* "Warum ist das wichtig?" – aufklappbarer Hinweis je Abschnitt */
.warum { margin: 0 0 1rem; border-left: 4px solid var(--sc-info); background: #eef4fa; border-radius: 0 var(--sc-radius) var(--sc-radius) 0; padding: .3rem .8rem; }
.warum summary { cursor: pointer; color: var(--sc-info); font-weight: 700; }
.warum p { margin: .4rem 0 .2rem; }
.logo-alt-anzeige { display: block; font-size: .85rem; color: var(--sc-muted); margin-top: .3rem; }
.logo-alt-fehlt { color: var(--sc-accent); }

/* ===== Formular-Reiter-Navigation: Buttons untereinander (nicht zu eng) ===== */
.reiternav { display: flex; flex-wrap: wrap; gap: .6rem 1rem; align-items: flex-start; justify-content: space-between; margin-top: 1.2rem; }
.reiternav-rechts { display: flex; flex-direction: column; align-items: flex-start; gap: .5rem; }

/* A3 Button-Umbau: einheitliche Schaltflaechen statt Link/Knopf-Mix.
   "Zurueck" links als sekundaerer (umrandeter) Knopf, "Zwischenspeichern und
   weiter" rechts als normaler Knopf; die verbindliche Aktion steht abgetrennt
   im Abschluss-Bereich unter den Reitern. */
.reiternav-knopf { display: inline-block; text-decoration: none; background: var(--sc-surface); border: 2px solid var(--sc-secondary); color: var(--sc-secondary); padding: .45rem 1rem; font-weight: 700; border-radius: var(--sc-radius); line-height: 1.3; }
.reiternav-knopf:hover { background: var(--sc-secondary); color: var(--sc-surface); }
.reiternav-weiter-knopf { margin-left: auto; }
/* Der Abschluss-Bereich muss die volle Breite UNTER dem Formular einnehmen und
   nicht (als Grid-Kind) in der schmalen Reiter-Spalte landen (Dagmar 14.7.:
   "sieht aus, als ob was verrutscht ist"). grid-column spannt beide Spalten. */
/* Paketwahl (masken/packages.php). Der gebuchte Zustand wird IMMER auch als
   Text ausgegeben -- der Rahmen ist nur eine zusätzliche, optische Stütze. */
.paket-karten { align-items: start; }
.paket-karte { display: flex; flex-direction: column; gap: .4rem; }
.paket-karte--aktuell { border: 3px solid var(--sc-primary); }
.paket-preis { font-weight: 700; font-size: 1.1rem; margin: 0; }
.paket-status { margin: 0; color: var(--sc-muted); }
.paket-aktuell-name { font-weight: 700; font-size: 1.15rem; margin: 0 0 .3rem; }
.paket-beschreibung ul, .paket-beschreibung ol { margin: .4rem 0 .4rem 1.2rem; padding: 0 0 0 .6rem; }
.paket-beschreibung li { margin: .2rem 0; }
/* Geschachtelte Aufzählungen müssen sichtbar eingerückt sein, sonst ist die
   Gliederung nur im Screenreader erkennbar (Günter 29.7.: "besonders die
   geschachtelten Auflistungen"). */
.paket-beschreibung li > ul, .paket-beschreibung li > ol { margin: .2rem 0 .2rem .4rem; }
.paket-beschreibung h4, .paket-beschreibung h5, .paket-beschreibung h6 {
  margin: .6rem 0 .2rem; font-size: 1rem; }
/* Leistungstexte sind zugeklappt; aufgeklappt ist das aktuelle bzw. gewählte
   Paket (Günter 29.7.). <details> braucht kein JavaScript. */
.paket-details { margin-top: .5rem; border-top: 1px solid var(--sc-border); padding-top: .5rem; }
.paket-details > summary { cursor: pointer; font-weight: 700; padding: .3rem 0; }
.paket-details > summary:focus-visible { outline: 3px solid var(--sc-primary); outline-offset: 2px; }
/* Der Auswahlschalter ist die eigentliche Handlung in der Karte -- deutlich
   absetzen, damit er nicht wie Fließtext wirkt. */
.paket-wahl { margin: .5rem 0 0; padding: .5rem .6rem; background: var(--sc-base);
  border-radius: var(--sc-radius); font-weight: 700; }
.paket-wahl input[type="radio"] { margin-right: .4rem; }
/* Abschluss unter ALLEN Karten: einmal Teilnahmebedingungen, einmal Bestellen. */
.paket-abschluss { margin-top: 1rem; padding-top: .9rem; border-top: 2px solid var(--sc-border); }
.paket-auswahl { border: 0; padding: 0; margin: 0; }
.paket-auswahl > legend { font-size: 1.2rem; font-weight: 700; padding: 0; }
.paket-herabstufen { margin-top: 1.6rem; }
/* Die Buchen-Beschriftung enthält den Paketnamen und wird dadurch lang. Ohne
   Umbruch schoben die Knöpfe die Karte auseinander (Dagmar 29.7.: "laufen rechts
   aus den Spalten"). Daher: Knopf darf umbrechen und nie breiter als die Karte
   werden -- gilt für alle Schaltflächen in den Paketkarten. */
.paket-form { margin-top: .8rem; padding-top: .8rem; border-top: 1px solid var(--sc-border); }
.paket-karte input[type="submit"],
.paket-karte button {
  max-width: 100%; width: 100%; white-space: normal; overflow-wrap: anywhere;
  text-align: center; line-height: 1.3;
}
.paket-karte, .paket-karte * { min-width: 0; }   /* verhindert das Sprengen des Rasters */
.paket-verlust { margin: .6rem 0; padding: .7rem .9rem; background: var(--sc-base);
  border-left: 5px solid var(--sc-primary); border-radius: var(--sc-radius); }
.paket-verlust h3 { margin: 0 0 .4rem; font-size: 1.05rem; }
.paket-verlust ul { margin: .3rem 0 .5rem 1.2rem; padding: 0; }

/* Produkte: paketabhängige Bereiche (Dagmar 15.7.). Der Hinweis erklärt in
   Textform, warum ein Bereich gesperrt ist -- nicht nur ausgrauen (Barrierefreiheit:
   Farbe allein trägt keine Information). Link-Blöcke deutlich voneinander abgesetzt. */
.paket-hinweis { margin: .4rem 0 1rem; padding: .6rem .8rem; background: var(--sc-base);
  border-left: 5px solid var(--sc-secondary); border-radius: var(--sc-radius); color: var(--sc-fg); }
.link-block { margin: 0 0 1.4rem; padding: .9rem 1rem; border: 1px solid var(--sc-border);
  border-radius: var(--sc-radius); background: var(--sc-surface); }
.link-block .link-nr { margin: 0 0 .6rem; font-size: 1.05rem; }
.galerie-titel { margin: 1.6rem 0 .3rem; padding-top: 1.1rem; border-top: 2px solid var(--sc-border); }

.formular-abschluss { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: .6rem .8rem; align-items: center; margin-top: 1.6rem; padding-top: 1.1rem; border-top: 2px solid var(--sc-border); }

/* ===== Onlinevorträge: Erklär-Intro + Mehrfach-Art in 2 Spalten ===== */
.lectures-intro { font-weight: 700; }
.art-optionen { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .2rem .9rem; margin-top: .3rem; }
@media (max-width: 520px) { .art-optionen { grid-template-columns: 1fr; } }
.lectures-mehr { margin: .3rem 0 1.4rem; }
.lectures-mehr summary { cursor: pointer; color: var(--sc-secondary); font-weight: 700; }
.lectures-mehr summary:hover { color: var(--sc-primary); }
.lectures-mehr p { margin: .5rem 0; }
/* Einordnung JE REIHE (Dagmar 31.7.): steht direkt unter der Reihen-Überschrift
   und erklärt, was diese Reihe ist. Bewusst nicht aufklappbar -- der Text ist kurz,
   und ein zusätzlicher Klick pro Reihe wäre am Screenreader nur Ballast. */
   Farbe bleibt bewusst die normale Textfarbe -- ein "dezenteres" Grau würde nur
   den Kontrast senken, ohne etwas zu gewinnen. */
.reihe-info { margin: .2rem 0 .6rem; }
.reihe-info p { margin: .35rem 0; }

/* ===== Ausstellerausweise (Maske badges) ===== */
/* Vorschau eines Ausweises: kleine Karte, Logo (Standard) bzw. Kontaktdaten
   + QR-Platzhalter (personalisiert). Der Kostenstatus steht immer AUCH als
   Text da (inklusive / Betrag) -- Farbe ist nur Zusatz (Barrierefreiheit). */
.badges-vorschau { display: inline-block; min-width: 9rem; padding: .45rem .6rem; border: 1px solid var(--sc-border); border-radius: var(--sc-radius); background: var(--sc-surface); }
/* Kopf: Firmenlogo neben Firmenname + Standnummer (auf jedem Ausweis) */
.badges-vorschau__kopf { display: flex; align-items: center; gap: .5rem; }
.badges-vorschau__logo { max-width: 90px; max-height: 34px; flex: 0 0 auto; }
.badges-vorschau__kopftext { display: flex; flex-direction: column; line-height: 1.2; }
.badges-vorschau__firma { font-weight: 700; font-size: .85rem; }
/* ⚠ Ausnahme von der Untergrenze: Die Ausweis-Vorschau bildet eine echte
   Karte MASSSTAEBLICH verkleinert ab. Groessere Schrift darin waere nicht
   barrierefreier, sondern eine falsche Vorschau. Der Ausweis selbst wird
   gedruckt, nicht gelesen. */
.badges-vorschau__stand { font-size: .78rem; color: var(--sc-muted); }
/* Personendaten + QR-Platzhalter (nur personalisiert) */
.badges-vorschau__body { display: flex; align-items: center; gap: .5rem; margin-top: .4rem; padding-top: .4rem; border-top: 1px dashed var(--sc-border); }
.badges-vorschau__daten { font-size: .82rem; line-height: 1.3; }
.badges-vorschau__qr { flex: 0 0 auto; width: 2.6rem; height: 2.6rem; display: flex; align-items: center; justify-content: center; font-size: .72rem; font-weight: 700; letter-spacing: .05em; color: var(--sc-muted); border: 2px dashed var(--sc-border); border-radius: 4px; background: var(--sc-base); }
.badges-preis { font-weight: 700; white-space: nowrap; }
.badges-preis--frei { color: var(--sc-success); }
.badges-preis--kosten { color: var(--sc-accent); }
.badges-tabelle td { vertical-align: middle; }
.badges-summe td { font-weight: 700; border-top: 2px solid var(--sc-border); text-align: right; }
/* .badges-loeschen ist für einen LINK auf weißem Grund gemacht — so nutzen es
   masken/badges.php und masken/eveningevent.php.

   ⚠ BEIM GEGENPRÜFEN AM 08.08.2026 AUFGEFALLEN, unabhängig von Dagmars Meldung:
   Mit --sc-accent (#ea5b0c) kam der Link auf 3,5:1 gegen Weiß und 3,12:1 gegen
   den grauen Zeilenhintergrund — beides unter den 4,5:1 der WCAG 2.1 AA. Der
   Fehler war also nicht auf den Knopf beschränkt, er war nur dort so grell,
   dass er auffiel.
   #b84408 ist derselbe Orangeton, nur dunkler: 5,43:1 auf Weiß und 4,84:1 auf
   Grau. ⚠ Der graue Grund ist der schärfere Fall — wer nur gegen Weiß prüft,
   hält 4,7 für ausreichend und liegt in der Zebrazeile trotzdem darunter.

   ⚠ NICHT --sc-accent selbst geändert: Die Variable trägt auch Preise
   (.badges-preis--kosten) und Statusflächen. Eine Farbe für alle zu drehen,
   weil an einer Stelle der Kontrast fehlt, verschiebt das Problem nur. */
.badges-loeschen { color: #b84408; }

/* ⚠ ALS KNOPF BRAUCHT DIESELBE KLASSE ANDERE FARBEN (Dagmar 08.08.2026).
   masken/meetingrooms.php legt sie über Seite::aktionsknopf() auf einen
   <button>, und Knöpfe haben im Portal einen roten Grund. Ergebnis: orange
   (#ea5b0c) auf rot (#eb1b1f) — gemessen 1,27:1. Praktisch unlesbar.
   Dagmar: „da rote schrift auf rotem Button".

   Derselbe Fehlertyp wie bei .hilfe im dunklen Tabellenkopf, am selben Tag:
   eine Klasse, die für EINEN Kontext gemacht ist, in einem anderen benutzt.
   Deshalb wird sie hier für den Knopf-Fall ergänzt und nicht in der Maske
   umgangen — wer sie das nächste Mal auf einen Knopf legt, ist mitversorgt.

   ⚠ Weiße Schrift ALLEIN genügt nicht: Auf --sc-primary ergibt sie 4,46:1 und
   verfehlt die 4,5:1 der WCAG 2.1 AA knapp (16 px fett zählt noch nicht als
   „großer Text", das beginnt bei 18,66 px). Deshalb ist der Grund eine Spur
   dunkler — #cc1418 bringt 5,71:1 und bleibt sichtbar dasselbe Rot. */
button.badges-loeschen,
.badges-loeschen[type="submit"] {
  color: #fff; background: #cc1418; border-color: #cc1418;
}

/* Ansprechpartner: "Aus Benutzer uebernehmen" -- Dropdown und Knopf in einer
   Reihe mit Abstand (kleben nicht aneinander); auf schmalen Schirmen gestapelt,
   dann sorgt die Luecke fuer senkrechten Abstand. Hilfetext volle Breite. */
.contacts-uebernehmen { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem 1rem; margin-top: 1rem; }
.contacts-uebernehmen label { margin: 0; }
.contacts-uebernehmen select { margin: 0; }
.contacts-uebernehmen .hilfe { flex-basis: 100%; margin: .2rem 0 0; }

/* ---- Produkte (Maske products): Liste mit Reihenfolge, Reiter-Formular ---- */
.products-listhead { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin: 1rem 0; }
.products-count { font-weight: 700; }
.products-listhead .dash-btn { margin-left: auto; }
.products-sort-hinweis { margin: .2rem 0 1rem; }
.products-liste { list-style: none; margin: 0 0 1.5rem; padding: 0; display: grid; gap: .8rem; }
.products-item { display: flex; align-items: center; gap: .9rem; border: 1px solid var(--sc-border); border-radius: var(--sc-radius); background: var(--sc-surface); padding: .7rem .9rem; }
.products-item.dragging { opacity: .5; }
.contacts-row[draggable="true"] { cursor: grab; }
.contacts-row.dragging { opacity: .5; }
.products-item.dragover { border-color: var(--sc-primary); box-shadow: 0 0 0 2px var(--sc-primary); }
.products-drag { cursor: grab; color: var(--sc-muted); font-size: 1.3rem; line-height: 1; flex: none; }
.products-thumb { width: 56px; height: 56px; flex: none; border-radius: var(--sc-radius); object-fit: cover; }
.products-thumb--text { display: grid; place-items: center; font-weight: 700; color: #fff; background: var(--sc-secondary); }
.products-item__body { flex: 1 1 auto; min-width: 0; }
.products-item__name { font-weight: 700; }
.products-tags { display: flex; gap: .3rem; flex-wrap: wrap; margin-top: .3rem; }
.sc-tag { display: inline-block; font-size: .8rem; padding: .1rem .6rem; border-radius: var(--sc-pill); background: var(--sc-base); color: var(--sc-muted); }
.products-item__actions { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; flex: none; }
.products-inline { display: inline-flex; gap: .25rem; margin: 0; }
/* ⚠ Auf schmalen Fenstern muss die Produktzeile umbrechen duerfen. Die
   Aktionsgruppe steht auf flex:none (sie soll neben dem Namen nicht
   schrumpfen) -- ohne flex-wrap an der ZEILE bleibt sie deshalb daneben stehen
   und schiebt die Seite hinaus: bei 360 px um 102 px (Messung 07.08.2026).
   Die Reihenfolge bleibt gleich, die Knopfgruppe rutscht nur unter den Namen. */
@media (max-width: 640px) {
  .products-item { flex-wrap: wrap; }
  /* Und in der eigenen Reihe darf die Knopfgruppe nicht auf ihrer
     max-content-Breite beharren (flex:none oben): Bei 320 px waren das 316 px
     neben dem Innenabstand der Zeile -- 27 px zu viel. flex:1 1 100% gibt ihr
     die volle Zeile und erlaubt das Schrumpfen; die Knöpfe brechen dann um. */
  .products-item__actions { flex: 1 1 100%; }
}
.sc-ordbtn { width: 2.2em; height: 2.2em; padding: 0; font-size: 1rem; font-weight: 700; border-radius: var(--sc-radius); background: var(--sc-surface); color: var(--sc-fg); border: 1px solid var(--sc-border-strong); cursor: pointer; }
.sc-ordbtn:hover:not([disabled]) { border-color: var(--sc-primary); color: var(--sc-primary); }
.sc-ordbtn[disabled] { opacity: .4; cursor: default; }
.dash-btn--sekundaer { background: var(--sc-surface); color: var(--sc-fg); border-color: var(--sc-border-strong); }
.dash-btn--sekundaer:hover { background: var(--sc-base); color: var(--sc-fg); border-color: var(--sc-fg); }
/* Dateien / Datenblaetter */
.datei-block { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: 1rem; margin-top: .6rem; }
.datei-liste { list-style: none; margin: .5rem 0; padding: 0; display: grid; gap: .5rem; }
.datei-liste li { display: flex; align-items: center; gap: .6rem; }
/* 05.08.2026: von .7rem (11,2 px) auf die Untergrenze. Das Kuerzel sagt, WAS
   fuer eine Datei das ist -- das gehoert lesbar. */
.datei-typ { font-size: var(--sc-klein); font-weight: 700; color: #fff; background: var(--sc-secondary); border-radius: var(--sc-radius); padding: .15rem .45rem; flex: none; }
.datei-entfernen { margin-left: auto; }
.link-nr { margin: 1rem 0 .3rem; }
.links-titel { margin-top: 1.2rem; }

/* ---- Formular-Feldgruppen (Felder nebeneinander in Spalten) --------------- */
/* Aufeinanderfolgende Felder mit gleichem "gruppe"-Schluessel (Formular-Klasse)
   werden in .formular-gruppe gewickelt und hier in Spalten gelegt. So wird die
   Landesvorwahl schmal und steht neben der Telefonnummer, statt breit darunter. */
.formular-gruppe { display: grid; gap: 0 1rem; align-items: start; }
.formular-gruppe .formular-feld { margin: 0 0 .9rem; }
.formular-gruppe--person { grid-template-columns: minmax(7em, 9em) 1fr 1fr; }
.formular-gruppe--funktion { grid-template-columns: 1fr 1fr; }
.formular-gruppe--telefon,
.formular-gruppe--mobil { grid-template-columns: minmax(9em, 13em) 1fr; }
@media (max-width: 640px) { .formular-gruppe { grid-template-columns: 1fr; } }

/* Radiogruppe mit "inline" => 1: Optionen nebeneinander statt untereinander
   (z. B. Sprachwahl de/en). Ohne die Klasse bleiben Optionen gestapelt. */
.formular-radio-inline label { display: inline-flex; align-items: center; gap: .3em; margin-right: 1.5rem; }

/* ---- Ansprechpartner-Uebersicht: getrennte Spalten Reihenfolge / Aktion --- */
/* Wichtig: die <td> bleiben echte Tabellenzellen (KEIN display:flex auf der
   Zelle -- das wuerde die Spaltenausrichtung zerstoeren). Nur der innere
   Wrapper ordnet die Schaltflaechen waagerecht an. */
.contacts-order,
.contacts-actions { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
.contacts-inline { display: inline; margin: 0; }
.contacts-order .sc-ordbtn { width: 2.1em; height: 2.1em; padding: 0; font-size: 1rem; font-weight: 700; line-height: 1; border-radius: var(--sc-radius); background: var(--sc-surface); color: var(--sc-fg); border: 1px solid var(--sc-border-strong); cursor: pointer; }
.contacts-order .sc-ordbtn:hover:not([disabled]) { border-color: var(--sc-primary); color: var(--sc-primary); }
.contacts-order .sc-ordbtn[disabled] { opacity: .4; cursor: default; }

/* ==========================================================================
   MODULE VOM 31.07.2026 -- zusammengefuehrt aus fuer-merge/
   ========================================================================== */

/* Konditionen & Preise (masken/conditions.php) */
.conditions-abschnitt { margin: 1.2rem 0; }
.conditions-tabelle { margin-top: .6rem; }
.conditions-zahl { width: 9em; max-width: 100%; text-align: right; }
.conditions-schluessel { display: inline-block; font-family: monospace; font-size: .85em; color: var(--sc-muted); }
.conditions-fehlend { margin: .8rem 0; padding: .6rem .9rem; border: 1px solid var(--sc-border-strong); border-radius: var(--sc-radius); background: var(--sc-base); }
.conditions-fehlend h3 { margin: 0 0 .3rem; font-size: 1rem; }
.conditions-fehlend ul { margin: 0; padding-left: 1.2rem; }

/* ---------------------------------------------------------------------
   Messetermine und Fristen (masken/deadlines.php)
   Status dreifach: Text + Zeichen + Farbe – nie Farbe allein.
   --------------------------------------------------------------------- */
.deadlines-messewahl { margin: 0 0 1rem; }
.deadlines-ueberblick { margin-bottom: 2rem; }
/* Fünf Spalten mit langen Datumsangaben: auf schmalen Fenstern scrollt die
   Tabelle für sich, statt die ganze Seite breit zu machen.
   ⚠ 07.08.2026: Das overflow-x lag bis dahin am ABSCHNITT
   (.deadlines-ueberblick). Damit scrollten Überschrift und Hinweissatz mit aus
   dem Bild -- und weil der Abschnitt kein tabindex trug, war er mit der
   Tastatur gar nicht zu schieben: Die Spalte „bis" war ohne Maus
   unerreichbar. Jetzt umschließt Seite::tabellenrahmen nur die Tabelle, und
   das Scrollen samt Fokusrahmen kommt zentral von .tabellenrahmen. */
.deadlines-tabelle { min-width: 46rem; }
.deadlines-tabelle th[scope="row"] { font-weight: 700; }
.deadlines-status { white-space: nowrap; font-weight: 700; }
.deadlines-status--offen { color: var(--sc-success); }
.deadlines-status--noch_nicht { color: var(--sc-info); }
.deadlines-status--vorbei { color: var(--sc-secondary); }
.deadlines-gruppenhilfe { color: var(--sc-muted); margin: 0 0 1rem; }
/* Je Vortragsreihe ein Block im Reiter „Vorträge“ (Günter A8, 10.08.2026).
   Die Linie links trennt die Reihen voneinander -- ohne sie laufen bei vier
   Reihen acht Eingabefelder zu einer Kolonne zusammen, in der niemand mehr
   sieht, welches Feld zu welcher Reihe gehört.
   ⚠ --sc-info ist dieselbe Variable wie bei .deadlines-status--noch_nicht,
   also keine neue Farbe. */
.deadlines-reihe { border-left: 0.25rem solid var(--sc-info); padding: 0 0 0 0.75rem; margin: 1.5rem 0 0.5rem; }
/* ⚠ rem, nicht em: em rechnet vom Elternelement und schrumpft in
   Verschachtelungen weiter. Genau so war ein Statuszeichen bei 12,5 px
   gelandet. 1.0625rem = 17 px, deutlich über der Untergrenze 0.875rem. */
.deadlines-reihe-titel { font-size: 1.0625rem; margin: 0 0 0.35rem; }
.deadlines-reihe p { margin: 0 0 0.35rem; }

/* ---- Mediencenter (masken/media.php) ------------------------------------- */
.media-intro { max-width: 65ch; }

/* Filterleiste: waagerechte Liste, aktueller Filter hervorgehoben */
.media-filter ul { list-style: none; display: flex; flex-wrap: wrap; gap: .4rem 1rem; padding: 0; margin: .5rem 0 1rem; }
.media-filter a { display: inline-block; padding: .25em .8em; border-radius: var(--sc-pill); border: 2px solid var(--sc-border-strong); text-decoration: none; }
.media-filter a:hover, .media-filter a:focus { border-color: var(--sc-fg); }
.media-filter a[aria-current] { background: var(--sc-fg); color: #fff; border-color: var(--sc-fg); font-weight: 700; }

/* Hinweiszeile über der Liste */
.media-warnung { max-width: 65ch; }
.media-ok { color: var(--sc-success); font-weight: 700; }

/* Liste: Vorschau und Beschreibung */
.media-liste td { vertical-align: top; }
.media-vorschau__bild { display: block; border: 1px solid var(--sc-border); border-radius: var(--sc-radius); background: var(--sc-surface); }
.media-vorschau__datei { display: block; font-weight: 700; margin-bottom: .2rem; }
.media-alt { margin: 0 0 .3rem; }
.media-alt__label { color: var(--sc-muted); font-size: .85rem; }
/* Fehlender Alt-Text: Farbe zusätzlich zu Zeichen und Text (nie allein) */
.media-alt--fehlt { color: var(--sc-accent); }
.media-alt--fehlt-en { color: var(--sc-muted); font-size: .85rem; }
.media-row--ohnealt { background: #fdf3ec; }
.media-stichworte { margin: .3rem 0 0; font-size: .9rem; }

/* Aktionen in der Zeile: untereinander, damit die Ziele groß genug bleiben */
.media-actions { display: flex; flex-direction: column; align-items: flex-start; gap: .3rem; }
.media-inline { display: inline; margin: 0; }

/* Bearbeiten- und Löschen-Ansicht */
.media-bearbeiten__vorschau, .media-loeschen { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); background: var(--sc-surface); padding: 1rem; margin: 0 0 1rem; }
.media-meta { display: grid; grid-template-columns: max-content 1fr; gap: .2rem 1rem; margin: .8rem 0 0; }
.media-meta dt { color: var(--sc-muted); }
.media-meta dd { margin: 0; }
.media-fundstellen { max-width: 65ch; }
.media-upload fieldset { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: 1rem; }

@media (max-width: 640px) {
  .media-liste, .media-liste thead, .media-liste tbody, .media-liste tr, .media-liste td, .media-liste th { display: block; }
  .media-liste thead { position: absolute; left: -9999px; }
  .media-liste tr { border-bottom: 2px solid var(--sc-border-strong); padding: .5rem 0; }
}

/* Navigation: Aussteller- und Admin-Punkte sichtbar trennen (Dagmar 31.7.2026).
   Für Screenreader trennt bereits das aria-label der beiden nav-Bereiche; die
   Linie hier ist die Entsprechung für Sehende. */
.portal-nav--admin { border-top: 2px solid var(--sc-border-strong); }

/* ===========================================================================
   ZUSAMMENBAU 31.07.2026 -- die vier parallel gebauten Module
   =========================================================================== */

/* --- Ausstellerliste der Messeleitung (masken/exhibitors.php) ------------- */
/* Die sechs Sprunglinks je Zeile kompakt halten */
.exhibitors-aktionen { font-size: .9rem; }
.exhibitors-tabelle th[scope="row"] { font-weight: 700; }

/* --- Benutzerverwaltung der Messeleitung (masken/useradmin.php) ----------- */
/* Zustand eines Kontos: Farbe UND Zeichen UND Text -- Farbe allein wäre am
   Screenreader und bei Farbfehlsicht nicht wahrnehmbar. */
.useradmin-status { display: inline-block; }
.useradmin-status--ok   { color: var(--sc-success); }
.useradmin-status--warn { color: var(--sc-accent); }
.useradmin-status--aus  { color: var(--sc-secondary); font-weight: 700; }
.useradmin-status--info { color: var(--sc-info); }
/* Aktionsknöpfe sind einzelne Formulare -- sie sollen nebeneinander stehen */
.useradmin-aktion { display: inline; margin: 0; }
.useradmin-knopfzeile { display: flex; flex-wrap: wrap; align-items: baseline; gap: .8rem; }
.useradmin-zurueck { margin: .2rem 0 1rem; }
.useradmin-tabelle th[scope="row"] { font-weight: 700; }
/* Mail-Vorschau vor dem Versand: der Text so, wie er hinausgeht */
.useradmin-vorschau { border-left: 4px solid var(--sc-accent); }
.useradmin-mailtext { white-space: pre-wrap; background: var(--sc-base); padding: .8rem;
  border-radius: var(--sc-radius); font-size: .95rem; overflow-x: auto; }

/* --- Produktkategorien (masken/categories.php) ---------------------------- */
/* Die Einrückung ist ZUSATZ, nicht Information: In welcher Ebene eine Kategorie
   steht, sagt die Spalte „Ebene" in Worten. */
.categories-abschnitt { margin: 1.2rem 0; }
.categories-tabelle { margin-top: .6rem; }
.categories-zahl { text-align: right; white-space: nowrap; }
.categories-aktionen { white-space: normal; }
.categories-name--haupt { font-weight: 700; }
.categories-name--unter { padding-left: 1.6rem; font-weight: 400; }
.categories-name--waise { padding-left: 1.6rem; font-style: italic; }
.categories-kennung { font-family: monospace; font-size: .9em; }
.categories-felder { font-family: monospace; font-size: .85em; word-break: break-word; }
.categories-vorschau { margin: .4rem 0 0; }
.categories-vorschau ul { margin: .2rem 0 .6rem; }

/* --- Standverwaltung (masken/standadmin.php, Bereich staende) ------------- */
/* Ob ein Stand geprüft ist, steht in JEDEM Fall als Wort in der Zelle
   („Achtung: ungeprüft" / „geprüft"); Farbe und Zeichen kommen nur dazu.
   --sc-secondary ist das dunklere Marken-Rot #922821 (8,24:1, AAA). */
.staende-achtung { color: var(--sc-secondary); }
.dash-kachel__status--warnung { color: var(--sc-secondary); font-weight: bold; }

/* --- Mitaussteller: Status auf dem Stand (masken/subexhibitors.php) -------- */
/* Dreifach wie überall: Farbe, Zeichen, Text. Ohne diese Regeln bleibt die
   Aussage vollständig -- der Text steht in jedem Fall in der Zelle. */
.subexhibitors-status--ok    { color: var(--sc-success); }
.subexhibitors-status--offen { color: var(--sc-accent); }
.subexhibitors-aktion { display: inline; margin: 0; }

/* --- Firmenband und Firmenauswahl (Benutzer mit mehreren Firmen) ----------- */
/* Das Band klebt beim Blättern oben am Rand: Wer sich durch eine lange
   Produktliste arbeitet, soll nicht nach oben scrollen müssen, um zu sehen,
   für welche Firma er das gerade tut. Es steht zugleich als erstes im Inhalt,
   wird also vor jeder Überschrift vorgelesen. */
.firmenband { position: sticky; top: 0; z-index: 50; margin: 0 0 1rem;
  padding: .55rem .8rem; background: var(--sc-info); color: #fff;
  border-radius: var(--sc-radius); font-weight: 700; }
.firmenband a { color: #fff; }
.firmenwahl-liste { list-style: none; margin: .6rem 0 0; padding: 0; }
.firmenwahl-liste li { padding: .45rem 0; border-bottom: 1px solid var(--sc-border); }
.firmenwahl-liste li:last-child { border-bottom: 0; }
.firmenwahl-aktiv { background: var(--sc-base); border-radius: var(--sc-radius); padding: .45rem .6rem; }
.firmenwahl-marke { color: var(--sc-success); font-weight: 700; }

/* --- Ansprechpartner: Abgrenzung und Paketstand --------------------------- */
/* Der Paketstand steht als Satz da, nicht nur als Farbe -- wer keine Knöpfe
   sieht, soll lesen können, warum. */
.contacts-abgrenzung { border-left: 4px solid var(--sc-info); }
.contacts-paket--ok { color: var(--sc-success); font-weight: 700; }
.contacts-paket--fehlt { border-left: 4px solid var(--sc-accent); }

/* ===========================================================================
   ZUSAMMENBAU 03.08.2026 -- die fünf parallelen Module und die Rückmeldungen
   ---------------------------------------------------------------------------
   Alles darunter ist additiv: keine Regel oberhalb wird verändert. Farben
   kommen ausschließlich aus den vorhandenen --sc-*-Tokens.
   =========================================================================== */

/* --- P1: Standbeschränkungen (B5) ----------------------------------------- */
/* Farbe UND Zeichen UND Wort -- das Zeichen ist der mittlere Teil davon.     */
.statuszeichen { display: inline-block; min-width: 1.1em; font-weight: bold; }

/* --- P1: Auswahlschalter Hallenplan / Standliste (C3) --------------------- */
/* Eine echte Radiogruppe: der Rahmen macht sichtbar, dass immer nur EINES    */
/* gilt -- am Screenreader sagt das die Gruppe selbst („1 von 2").            */
.ansichtswahl-gruppe { display: inline-flex; align-items: center; gap: 1.2em;
  border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: 0.4em 0.9em; margin: 0.4em 0; }
.ansichtswahl-gruppe legend { padding: 0 0.4em; font-weight: bold; }
.ansichtswahl-gruppe label { display: inline-flex; align-items: center; gap: 0.4em; }
.ansichtswahl-knopf { margin: 0.4em 0; }

/* Hinweis, was die blauen Flächen bedeuten */
.hinweis-beschraenkung { margin: 0.4em 0 1em; color: var(--sc-muted); }

/* --- P1: Preistabelle, Summenblock im Fuß (C4) ---------------------------- */
/* Er steht seit dem 3.8.2026 IN der Tabelle, damit die Tabellenfunktionen    */
/* des Screenreaders ihn erreichen. Optisch muss er sich trotzdem absetzen.   */
.preistabelle tfoot th, .preistabelle tfoot td { border-top: 2px solid var(--sc-fg); }
.preistabelle tfoot .preis-gesamt th, .preistabelle tfoot .preis-gesamt td { font-size: 1.05em; }
/* Zeilenköpfe im Tabellenkörper sind KEINE Spaltenköpfe -> nicht dunkel */
.standliste tbody th[scope="row"] { background: transparent; color: inherit; font-weight: bold; }

/* --- P1: Freigabeschalter in den Messeterminen (D-A) ---------------------- */
.deadlines-freigabe { margin: 0.6em 0 1.2em; }

/* --- P2: Möbel- und Zubehörbestellung ------------------------------------- */
/* Mengenfelder schmal, Beschreibungen zurückgenommen */
.accessories-menge { width: 5em; }
.accessories-beschreibung,
.accessories-preisformel,
/* Höchstmenge dieser Firma -- bewusst wie der Schrittweiten-Hinweis gesetzt:
   beides sind Regeln zur Menge, keine Bestandsangabe (die steht farbig
   darüber). rem, nicht em -- siehe --sc-klein. */
.accessories-grenze,
.accessories-schritt { font-size: .9rem; color: var(--sc-muted); }
.accessories-groesse { white-space: nowrap; }
.accessories-alternative { font-weight: 700; }
/* Verfügbarkeit: Farbe kommt ZUSÄTZLICH zu Zeichen und Text */
.accessories-status--frei  { color: var(--sc-success); }
.accessories-status--knapp { color: var(--sc-accent); }
.accessories-status--weg   { color: var(--sc-primary); }
.accessories-summe th, .accessories-summe td { font-weight: 700; border-top: 2px solid var(--sc-fg); }
.accessories-preis--frei { font-style: italic; }
.accessories-ziellinks .dash-btn { margin: 0 .4em .4em 0; }

/* --- P4: Katalogeintrag ---------------------------------------------------- */
.catalog-auswahl label { display: inline-block; padding: .15rem 0; }
.catalog-auswahl label .hilfe { font-size: .85rem; }
.catalog-stand-liste, .catalog-gewaehlt { margin: .3rem 0 .6rem 1.2rem; }
.catalog-erklaerung h2 { font-size: 1.1rem; }

/* --- P5: Social Media ------------------------------------------------------ */
.sm-intro { max-width: 65ch; }

/* Kanäle der Firma */
.sm-kanaele { list-style: none; padding: 0; margin: .5rem 0 0; }
.sm-kanaele li { padding: .2rem 0; }
.sm-kanal__name { display: inline-block; min-width: 11ch; color: var(--sc-muted); }
/* Fehlende Kanäle: Farbe NUR zusätzlich zu Zeichen und Text, nie allein */
.sm-kanaele-fehlen { max-width: 65ch; color: var(--sc-accent); }

/* Die freien Beitraege je Veranstaltungsjahr (Dagmar 19.08.2026) */
.sm-kontingente td, .sm-kontingente th { vertical-align: top; }
.sm-kontingente th[scope="row"] { font-weight: 700; white-space: nowrap; }
/* ⚠ Die Erklaerungen tragen ihre Bedeutung IM TEXT. Die Farbe hier setzt nur
   eine Betonung obendrauf -- wer sie nicht sieht, verliert nichts. */
.sm-hinweis { max-width: 65ch; margin: .6rem 0 0; }
.sm-hinweis--dopplung { border-left: 3px solid var(--sc-border); padding-left: .8rem; }
.sm-hinweis--verfall { color: var(--sc-accent); }
.sm-hinweis--frei { color: var(--sc-success); font-weight: 700; }
.sm-hinweis--kosten { color: var(--sc-accent); font-weight: 700; }
/* Die Jahreswahl im Formular */
.sm-jahr { max-width: 65ch; }
.sm-jahr--eins { color: var(--sc-muted); }
/* Der Satz ueber dem Absenden-Knopf: er kostet Geld, also faellt er auf.
   Die Klasse formular-fehler traegt Rahmen und Farbe schon -- hier bleibt nur
   der Abstand, damit er nicht am Knopf klebt. */
.sm-kostenwarnung { margin-bottom: .8rem; max-width: 65ch; }

/* Der Plan */
.sm-plan td, .sm-plan th { vertical-align: top; }
.sm-plan th[scope="row"] { font-weight: 700; }
.sm-datum { min-width: 11rem; }
.sm-status { display: inline-flex; align-items: center; gap: .35rem; white-space: nowrap; }
.sm-status--veroeffentlicht { color: var(--sc-success); font-weight: 700; }
.sm-status--geplant { color: var(--sc-fg); }
.sm-status--eingereicht { color: var(--sc-accent); }
.sm-status--offen { color: var(--sc-muted); }

/* Eigener Beitrag */
.sm-eigene td, .sm-eigene th { vertical-align: top; }
.sm-actions { display: flex; flex-direction: column; align-items: flex-start; gap: .3rem; }
.sm-inline { display: inline; margin: 0; }
.sm-keine-aktion { color: var(--sc-muted); font-size: .9rem; }
.sm-form fieldset { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: 1rem; }
.sm-bildvorschau { margin: 0 0 1rem; }
.sm-bildvorschau img { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); background: var(--sc-surface); }

@media (max-width: 640px) {
  .sm-plan, .sm-plan thead, .sm-plan tbody, .sm-plan tr, .sm-plan td, .sm-plan th,
  .sm-eigene, .sm-eigene thead, .sm-eigene tbody, .sm-eigene tr, .sm-eigene td, .sm-eigene th { display: block; }
  .sm-plan thead, .sm-eigene thead { position: absolute; left: -9999px; }
  .sm-plan tr, .sm-eigene tr { border-bottom: 2px solid var(--sc-border-strong); padding: .5rem 0; }
  .sm-datum { width: 100%; }
}
/* ---- Kostenübersicht (Maske costs, Sitzung P3 vom 03.08.2026) --------------
   EINBAU: diesen ganzen Block ans Ende von portal/css/portal.css hängen,
   danach diese Datei löschen. Bis dahin lädt portal/dev-costs.php sie nach,
   damit die Seite im Browser schon so aussieht wie nach dem Zusammenbau.
   (Eine Quelle für beides -- so laufen Vorschau und Baustein nicht auseinander.) */

.costs-gesamt-gross{ font-size:2rem; font-weight:700; margin:.2rem 0 .4rem; }

/* Beträge rechtsbündig und mit gleich breiten Ziffern: nur so stehen die
   Nachkommastellen untereinander und die Spalte ist auf einen Blick lesbar. */
.costs-tabelle td.costs-betrag,
.costs-tabelle th.costs-betrag{ text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
.costs-betrag--frei{ color:var(--sc-muted); }

.costs-leer{ color:var(--sc-muted); font-style:italic; }
.costs-hinweis{ color:var(--sc-muted); font-size:.9rem; margin:.4rem 0 0; }

.costs-tabelle tfoot th,
.costs-tabelle tfoot td{ font-weight:700; border-top:2px solid var(--sc-border-strong); }
.costs-zwischensumme th,
.costs-zwischensumme td{ border-top:1px solid var(--sc-border-strong); }
.costs-rabatt th, .costs-rabatt td{ color:var(--sc-secondary); }

/* Abrechnungsstand: die FARBE ist nur die dritte Codierung. Zeichen (○ ◐ ✔) und
   Text stehen im HTML und tragen die Aussage auch ohne sie -- wer Farben nicht
   unterscheiden kann, verliert hier nichts (WCAG 1.4.1). */
.costs-stand{ white-space:nowrap; }
.costs-stand--offen{ color:var(--sc-muted); }
.costs-stand--teil{ color:var(--sc-accent); }
.costs-stand--voll{ color:var(--sc-success); }
/* ===========================================================================
   Rueckmeldungen 03.08.2026 -- Baustein fuer portal/css/portal.css
   ---------------------------------------------------------------------------
   portal.css war waehrend der sechs parallelen Sitzungen gesperrt. Alles hier
   ist ADDITIV: es kommen nur neue Klassen dazu, keine bestehende Regel wird
   angefasst. Beim Zusammenbau ans Ende von portal.css haengen und diese Datei
   loeschen (samt portal/dev-rueckmeldungen.php, die sie einbindet).

   Verwendete Tokens sind die vorhandenen (--sc-*), es kommen keine neuen dazu.
   =========================================================================== */

/* --- Suchfeld der Buchungsuebersicht (SA1) --------------------------------- */
/* Die Zeile bleibt umbruchfaehig: bei schmalem Fenster rutschen Knopf und
   Ruecksetz-Link unter das Eingabefeld, statt aus der Seite zu laufen. */
.standadmin-suche .formular-feld {
  display: flex; flex-wrap: wrap; align-items: center; gap: .6rem;
}
.standadmin-suche label { font-weight: 700; }
.standadmin-suche input[type="search"] { min-width: 16rem; flex: 1 1 16rem; }
/* Der Hilfetext gehoert unter die Zeile, nicht mitten hinein. */
.standadmin-suche .hilfe { flex-basis: 100%; margin: 0; }

/* --- Bereiche eines Standes (E4) ------------------------------------------- */
/* Die Ankreuzfelder stehen untereinander -- nebeneinander waere bei
   Vergroesserung die erste Zeile, die umbricht, und die Zuordnung
   Kaestchen/Beschriftung ginge verloren. */
.staende-bereiche label { display: block; padding: .15rem 0; }
.staende-bereiche .hilfe { margin: .2rem 0 .6rem; }
/* "Interne Flaeche" ist kein Bereich neben den anderen, sondern deren
   Gegenteil -- eine Trennlinie sagt das auch fuers Auge. */
.staende-bereiche .formular-feld {
  border-top: 1px solid var(--sc-border); margin: .8rem 0 0; padding-top: .8rem;
}

/* --- Abmessungen: Tiefe und Breite nebeneinander (SV-A) -------------------- */
/* "gruppe" => "masse" wickelt die beiden Felder in
   <div class="formular-gruppe formular-gruppe--masse">. Das Raster fehlt dieser
   Gruppe noch -- ohne Spaltenangabe stuenden die Felder untereinander. */
.formular-gruppe--masse { grid-template-columns: 1fr 1fr; }
.formular-gruppe--masse input[type="text"] { max-width: 10rem; }

/* --- Eckdaten einer Vortragsreihe (KL1) ------------------------------------ */
/* Zeitraum, Preis und Paketinhalt standen bisher als Fliesstext mit <br>
   untereinander. Jetzt sind es Paare aus Bezeichnung und Wert -- am
   Screenreader eine Liste, fuers Auge zwei Spalten. */
.lectures-eckdaten {
  margin: 0 0 1.2rem; padding: .9rem 1.1rem;
  background: var(--sc-surface);
  border: 1px solid var(--sc-border); border-radius: var(--sc-radius);
}
.lectures-eckdaten__paar {
  display: flex; flex-wrap: wrap; gap: .2rem .8rem;
  padding: .35rem 0; border-bottom: 1px solid var(--sc-border);
}
.lectures-eckdaten__paar:last-child { border-bottom: 0; }
.lectures-eckdaten dt { font-weight: 700; flex: 0 0 12rem; margin: 0; }
.lectures-eckdaten dd { margin: 0; flex: 1 1 16rem; }
/* Der Paketinhalt ist die Angabe, wegen der Dagmar den Block wollte -- er
   bekommt etwas mehr Gewicht, aber KEINE Bedeutung allein ueber die Farbe:
   die Bezeichnung „Im Paket enthalten" steht daneben. */
.lectures-eckdaten .lectures-kontingent { background: var(--sc-bg); }

/* Schmale Fenster: Bezeichnung ueber den Wert statt daneben. */
@media (max-width: 40rem) {
  .lectures-eckdaten dt { flex-basis: 100%; }
}

/* --- Produkte: Veröffentlichungsstatus (Dagmar 03.08.2026) ---------------- */
/* Farbe kommt IMMER zusätzlich zu Zeichen und Wort, nie allein. */
.products-status { display: inline-flex; align-items: center; gap: .3rem; font-size: .9rem; }
.products-status--publish { color: var(--sc-success); font-weight: 700; }
.products-status--draft   { color: var(--sc-accent); }
.products-status--archive { color: var(--sc-muted); }

/* Die Übersicht „So wird Ihr Produkt derzeit angezeigt" */
.products-vorschau { margin: .5rem 0 0; }
.products-vorschau__status { padding: .6rem .9rem; border-radius: var(--sc-radius);
  background: var(--sc-bg); border: 1px solid var(--sc-border); margin: 0 0 1rem; }
.products-vorschau__status--publish { border-left: 6px solid var(--sc-success); }
.products-vorschau__status--draft   { border-left: 6px solid var(--sc-accent); }
.products-vorschau__status--archive { border-left: 6px solid var(--sc-border-strong); }
.products-vorschau__liste { margin: 0; }
.products-vorschau__paar { display: flex; flex-wrap: wrap; gap: .2rem .8rem;
  padding: .4rem 0; border-bottom: 1px solid var(--sc-border); }
.products-vorschau__paar:last-child { border-bottom: 0; }
.products-vorschau__liste dt { font-weight: 700; flex: 0 0 13rem; margin: 0; }
.products-vorschau__liste dd { margin: 0; flex: 1 1 16rem; }
@media (max-width: 40rem) { .products-vorschau__liste dt { flex-basis: 100%; } }

/* ===========================================================================
   Ausklapplinks: einheitlich als Bedienelement erkennbar
   (Dagmar 03.08.2026: „Bei der Benutzerverwaltung funktioniert der
   Ausklapplink nicht, bzw. nur wenn man auf das kleine Dreieck davor klickt.
   Das muss deutlicher werden bei allen Ausklapplinks.")
   ---------------------------------------------------------------------------
   TECHNISCH war die ganze Zeile klickbar -- <summary> ist von sich aus ein
   Bedienelement über die volle Breite. Es SAH nur nicht so aus: schwarzer
   Fließtext, kein Zeigefinger, keine erkennbare Grenze. Wer das sieht, hält
   das Dreieck für den Schalter und den Text für Beschriftung.

   Drei Dinge machen den Unterschied, und alle drei zusammen:
     1. Zeigefinger      -- sagt: hier passiert etwas
     2. Link-Optik       -- dieselbe Farbe wie jeder andere Bedienweg im Portal
     3. width: fit-content -- macht SICHTBAR, wo der Klickbereich aufhört
   Der Marker (das Dreieck) bleibt erhalten: display bleibt list-item.

   Screenreader kündigen <summary> ohnehin als Schaltfläche mit Zustand
   („reduziert"/„erweitert") an -- daran ändert sich nichts.
   =========================================================================== */
summary {
  cursor: pointer;
  width: fit-content;
  max-width: 100%;
  color: var(--sc-secondary);
  font-weight: 700;
  padding: .25rem .4rem;
  border-radius: var(--sc-radius);
  text-decoration: underline;
  text-underline-offset: .15em;
}
summary:hover { color: var(--sc-primary); background: var(--sc-base); }
summary:focus-visible { outline: 3px solid var(--sc-info); outline-offset: 2px; }
/* Aufgeklappt: der Schalter tritt zurück, der Inhalt tritt hervor. */
details[open] > summary { margin-bottom: .5rem; }

/* --- Kostenübersicht: die drei Beträge (Dagmar 03.08.2026) ---------------- */
/* Nebeneinander, wo Platz ist; untereinander auf schmalen Fenstern. Die Farbe
   trägt KEINE Bedeutung allein -- jede Stufe hat ihre Bezeichnung als Text. */
.costs-stufen { display: flex; flex-wrap: wrap; gap: 1rem; margin: 0 0 1rem; }
.costs-stufe { flex: 1 1 14rem; padding: .8rem 1rem; border-radius: var(--sc-radius);
  background: var(--sc-bg); border: 1px solid var(--sc-border); }
.costs-stufe dt { font-weight: 700; margin: 0 0 .3rem; }
.costs-stufe dd { margin: 0; }
.costs-stufe__betrag { display: block; font-size: 1.5rem; font-weight: 700; }
.costs-stufe__text { display: block; font-size: .85rem; color: var(--sc-muted); margin-top: .3rem; }
.costs-stufe--abgerechnet { border-left: 6px solid var(--sc-success); }
.costs-stufe--naechste { border-left: 6px solid var(--sc-accent); }
.costs-stufe--offen { border-left: 6px solid var(--sc-border-strong); }
/* Die Gesamtsumme steht klein darunter -- sie ist eine Auskunft, keine Forderung. */
.costs-gesamt-klein { font-weight: 700; margin: .5rem 0; }

/* --- Katalogeintrag: die Eintragsform steht als Erstes (Dagmar 03.08.) ---- */
.catalog-form { border-left: 6px solid var(--sc-info); }
.catalog-form__name { font-size: 1.4rem; font-weight: 700; margin: .2rem 0 .6rem; }

/* --- Zubehör: Gliederung nach Artikelgruppen (Dagmar 03.08.2026) ----------
   Seit dem 06.08.2026 sind die Gruppen AUFKLAPPBAR (<details>) statt filterbar
   (Dagmar: "Überall sonst im Reservierungssystem haben wir aufklappbare
   Listen"). Die Sprungleiste .accessories-gruppennav ist damit entfallen. */
.accessories-gruppe { margin: 0 0 1.8rem; }
.accessories-gruppe h3 { margin: 0; padding-bottom: .3rem;
  border-bottom: 2px solid var(--sc-border-strong); }
.accessories-gruppe__anzahl { font-weight: 400; color: var(--sc-muted); font-size: .9rem; }
/* Der Aufklapp-Kopf trägt die Überschrift. Die allgemeine summary-Regel weiter
   unten macht die ganze Zeile klickbar und setzt den Fokusrahmen -- hier bleibt
   nur, den Rahmen der h3 bis an den Rand des Bereichs zu führen. */
.accessories-gruppe > summary { padding: .3rem 0; }
.accessories-gruppe > summary h3 { display: inline; border-bottom: 0; }
details.accessories-gruppe[open] > summary h3 { display: block; }

/* --- Navigation: Aufklappmenüs (Dagmar 03.08.2026) ------------------------ */
/* ⚠ OHNE JavaScript bleiben die Untermenüs OFFEN -- data-jsmenu setzt erst das
   Skript. So ist ohne Skript nichts unerreichbar, es ist nur länger. */
.portal-nav__gruppe { position: relative; }
/* ⚠ ZWEI SELEKTOREN, EINE REGEL (31.08.2026, N15 zweiter Teil). Der
   Leistenknopf ("Ausstellermenü" / "Administratorenmenü") sieht aus wie ein
   Gruppenschalter und soll es auch bleiben -- deshalb steht er HIER und nicht
   in einem zweiten Block mit denselben Werten.
   ⚠ Er steht VORNE in der Liste, damit ".portal-nav__schalter {" als
   zusammenhaengender Text erhalten bleibt: test-portalbefunde-2026-08-03.php
   sucht genau danach, wenn es die weisse Schrift nachmisst. */
.portal-nav__leistenknopf,
.portal-nav__schalter {
  display: inline-flex; align-items: center; gap: .4rem;
  background: none; border: 0; cursor: pointer; font: inherit;
  padding: .5rem .8rem; border-radius: var(--sc-radius);
  /* ⚠ WEISS, nicht "inherit": Ein <button> erbt die Textfarbe nicht von der
     Navigation, sondern läuft die Kette bis zum <body> hoch -- und der ist
     dunkel. Die beiden Oberpunkte standen deshalb schwarz auf dunklem Grund
     und waren praktisch unsichtbar (Dagmar 03.08.2026). Dieselbe Farbe und
     Stärke wie die Links daneben (.portal-nav a). */
  color: #fff; font-weight: 700;
}
.portal-nav__leistenknopf:hover,
.portal-nav__schalter:hover { color: var(--sc-tertiary); }
.portal-nav__leistenknopf:focus-visible,
.portal-nav__schalter:focus-visible { outline: 3px solid var(--sc-tertiary); outline-offset: 2px; }
/* Das Dreieck dreht sich beim Aufklappen -- zusätzlich zu aria-expanded, das
   die Sprachausgabe ansagt. Für beide Ebenen dasselbe: Leistenknopf und
   Gruppenschalter sollen sich gleich anfühlen. */
.portal-nav__pfeil::after { content: "\25BE"; display: inline-block; transition: transform .15s; }
.portal-nav__leistenknopf[aria-expanded="true"] .portal-nav__pfeil::after,
.portal-nav__schalter[aria-expanded="true"] .portal-nav__pfeil::after { transform: rotate(180deg); }
/* Die Gruppe, in der die aktuelle Seite liegt: GELB, wie ein aktiver Link --
   die andere bleibt weiß (Dagmar 03.08.2026). Dazu der Balken darunter und der
   Satz für die Sprachausgabe, damit die Farbe nicht allein trägt. */
.portal-nav__gruppe--aktiv > .portal-nav__schalter { color: var(--sc-tertiary); }
.portal-nav__unter { list-style: none; margin: 0; padding: 0; }
/* Mit JavaScript: als schwebendes Menü. Ohne: einfach untereinander. */
/* ⚠ z-index 60 und NICHT 30 (Dagmar 08.08.2026).
   Gemessen: .firmenband ist sticky mit z-index 50 — das Aufklappmenü lag mit
   30 also zwangsläufig DAHINTER, und die unteren Menüpunkte waren nicht mehr
   anklickbar. Dagmar: „wenn man in der Navigation das Dropdown verwendet,
   landet dieser hinter der Zeile für wen man gerade arbeitet, und so kann man
   nicht auf alle Punkte und Bereiche zugreifen."

   60 ist derselbe Wert wie bei den Menüs des Website-Headers (Leiste 1, Zeile
   ~1326) — die lagen von Anfang an richtig. Damit gilt im Portal eine
   durchgehende Reihenfolge:
       100  Sprunglink („Zum Inhalt springen") — muss über allem liegen
        60  aufgeklappte Menüs, beide Leisten
        50  Firmenband (sticky)
   ⚠ Wer hier eine Zahl ändert, prüft die anderen drei mit. */
.portal-nav__unter[data-jsmenu] {
  position: absolute; z-index: 60; min-width: 15rem;
  background: var(--sc-fg); border-radius: 0 0 var(--sc-radius) var(--sc-radius);
  box-shadow: 0 6px 18px rgba(0,0,0,.25); padding: .3rem 0;
}
.portal-nav__unter[data-jsmenu] a { display: block; padding: .5rem 1rem; }
@media (max-width: 640px) {
  .portal-nav__unter[data-jsmenu] { position: static; box-shadow: none; min-width: 0; }
}

/* Die Gruppe, in der die aktuelle Seite liegt: markiert, aber NICHT offen.
   (Dagmar 03.08.2026 -- ein dauerhaft offenes Menü verdeckt den Inhalt.)
   Farbe UND Fettschrift UND ein Satz für die Sprachausgabe. */
.portal-nav__gruppe--aktiv > .portal-nav__schalter {
  box-shadow: inset 0 -3px 0 var(--sc-tertiary);
}

/* ⚠ [hidden] MUSS hier ausdrücklich stehen. Die Bestandsregel
   „.portal-nav ul { display: flex }" ist spezifischer als der Browser-Standard
   für [hidden] und hebelt ihn aus -- das Untermenü war deshalb NIE wirklich
   verborgen, sondern nur aus dem sichtbaren Bereich geschoben. Genau das hat
   Dagmar am 03.08.2026 gesehen: „das Klappmenü bleibt offen stehen, man kann
   teilweise die Seite nicht sehen."
   Klasse + Attribut schlägt Klasse + Element, also gewinnt diese Regel. */
.portal-nav__unter[hidden] { display: none; }

/* Das Untermenü erbt von der Regel oben „display:flex; flex-wrap:wrap" -- die
   ist für eine WAAGERECHTE Leiste gedacht. In einem Aufklappmenü sollen die
   Einträge untereinander stehen, und zwar zuverlässig und nicht erst durch
   Umbruch. Deshalb ausdrücklich als Spalte, mit zurückgesetzten Abständen. */
.portal-nav__unter[data-jsmenu] {
  display: flex; flex-direction: column; flex-wrap: nowrap;
  gap: 0; align-items: stretch; margin: 0; max-width: none;
}
.portal-nav__unter[data-jsmenu][hidden] { display: none; }

/* ---- N15, zweiter Teil: die Portalleisten klappen ebenfalls zu -----------
   Günter Hanke, 31.08.2026, nach dem ersten Test mit iPhone SE und VoiceOver:
   „Die Punkte für die Ausstellerinfo sowie die Menüpunkte vom Portal bleiben
   als Menü da und können ausgeklappt werden."
   Dagmar am 31.08.2026: „allerdings sollten auch Deine eigenen Menüs
   zusammenklappen als 'Ausstellermenu' und 'Administratorenmenu'".

   Aufbau in klassen/seite.php, kopf():
       <nav class="portal-nav">
         <button class="portal-nav__schalter portal-nav__leistenknopf">
         <ul class="portal-nav__leiste">   -- die ganze bisherige Leiste
           <li class="portal-nav__gruppe"> -- die Gruppen von vorher, unverändert

   ⚠ ZWEI EBENEN, ZWEI MECHANIKEN — mit Absicht verschieden:
     Ebene 1 (Leiste) klappt NUR auf schmalen Geräten zu → Media Query, CSS.
     Ebene 2 (Gruppen) klappt auf JEDEM Gerät zu → [hidden], vom Skript gesetzt.
   Deshalb rührt das Skript die Leiste nicht mit hidden an: Die Bedingung
   „schmal" gehört ins Stylesheet, nicht in JavaScript. Ein gedrehtes Telefon,
   ein geteiltes Fenster oder 400 % Vergrößerung sieht der Server nicht.

   ⚠ DIESELBE SCHWELLE WIE DAS BURGER-MENÜ DER WEBSITE-LEISTE: 781 px. Eine
   dritte Zahl hieße, dass sich der Kopf der Seite an drei verschiedenen
   Stellen umbaut — man wüsste beim Verkleinern nie, was als Nächstes springt.

   ⚠ AM GROSSEN SCHIRM ÄNDERT SICH NICHTS. Der Knopf ist dort ausgeblendet,
   die Liste steht offen — Bild und Reihenfolge wie vor dem 31.08.2026. */

/* Zwei Klassen im Selektor (0,2,0), nicht eine: Der Knopf steht weiter oben in
   derselben Regel wie .portal-nav__schalter und bekommt von dort Farbe,
   Fokusrahmen und den sich drehenden Pfeil. Deren display:inline-flex darf ihn
   hier aber nicht sichtbar machen — und mit gleicher Spezifität entschiede die
   Reihenfolge im Stylesheet, also eine Zufälligkeit. */
.portal-nav .portal-nav__leistenknopf { display: none; }

@media (max-width: 781px) {
  /* ⚠ DER KNOPF ERSCHEINT NUR MIT SKRIPT. data-jsmenu setzt navi_skript() an
     das <nav>. Ohne Skript könnte er nichts aufklappen — er wäre ein Knopf,
     der immer dasselbe tut: nichts. Dann bleibt die Leiste offen stehen, wie
     sie vor dem 31.08.2026 stand. Genau dieselbe Lösung wie beim Burger-Menü
     der Website-Leiste und bei den Untermenüs der Gruppen. */
  .portal-nav[data-jsmenu] .portal-nav__leistenknopf {
    display: flex; justify-content: flex-start; width: 100%;
    /* Zielfläche für den Finger. WCAG 2.5.8 verlangt 24 × 24 px — auf einem
       Telefon, das mit einer Hand bedient wird, ist mehr angebracht. */
    min-height: 2.75rem;
    /* Bündig mit der Liste darunter: dieselben Werte wie „.portal-nav ul". */
    margin: 0 auto; max-width: var(--sc-spur-inhalt);
    padding: .5rem 1rem; border-radius: 0;
  }
  /* Zugeklappt ist die Leiste NUR, solange der Knopf sie auch wieder öffnen
     kann. Die Punkte bleiben dabei vollständig im HTML stehen — wer die Seite
     durchsucht, findet sie weiterhin.
     Spezifität 0,5,0 — die Bestandsregel „.portal-nav ul { display: flex }"
     hat 0,1,1 und würde ein schlichtes display:none sonst aushebeln (derselbe
     Fehler wie 2026 bei .portal-nav__unter[hidden], siehe oben). */
  .portal-nav[data-jsmenu] .portal-nav__leistenknopf[aria-expanded="false"] + .portal-nav__leiste {
    display: none;
  }
}

/* === ANFANG header ========================================================
   Kopfzeile der SightCity-Website im Portal (Dagmar 05.08.2026).
   Nachgebaut nach sightcity.net, dort am 03.08.2026 ausgemessen:
   Balken #575756 / 40 px / rechtsbündig, darunter Logo + Navigation, die
   Navigation in einer eigenen Reihe, Untermenü weiß mit Schlagschatten
   0 3px 6px -1px rgba(0,0,0,.2).
   Die Farben stehen schon als --sc-* in :root -- sie stimmen mit den
   WordPress-Werten überein, es ist nichts nachzutragen.

   DREI LEISTEN, DREI FARBEN (Dagmar 05.08.2026):
     1. Website        -- dunkle Schrift auf WEISS  (hier)
     2. Ausstellerbereich -- weiß auf Schwarz       (.portal-nav)
     3. Messeleitung   -- weiß auf dunklem Rot      (.portal-nav--admin)
   Auf den ersten Blick ist damit zu sehen, ob man gerade in der Website oder
   im Reservierungssystem unterwegs ist.

   ⚠ WARUM ÜBERALL "#hauptnavigation.webnav" DAVORSTEHT:
   Die Leiste behält die Kennung "hauptnavigation" (sie stand vorher schon
   dort und wird von lokal-test/test-portal-fundament.php geprüft). Damit
   greifen aber weiter oben in dieser Datei die Bestandsregeln
   "#hauptnavigation ul { ... }" und "#hauptnavigation a { color:#fff }" --
   und weiße Schrift auf weißem Grund wäre nicht zu lesen. Eine Kennung
   schlägt eine Klasse; nur Kennung PLUS Klasse gewinnt zuverlässig. */

/* ---- Zeile 1: der schmale Servicebalken ---------------------------------
   Volle Breite, Inhalt aber auf denselben 1024 px wie <main>. Das
   padding-inline mit max() erledigt beides in einer Zeile: außen füllt die
   Farbe bis zum Rand, innen steht der Text bündig unter dem Seiteninhalt. */
.webbalken { background: var(--sc-muted); }
.webbalken-innen {
  /* Senkrechte Polsterung .25rem statt .5rem (05.08.2026): Die Social-Symbole
     bringen eine 32-px-Zielfläche mit, damit wurde der Balken 50 px hoch --
     die Website hat gemessene 40 px. 4 + 32 + 4 = 40. */
  margin: 0; padding: .25rem max(1rem, (100% - var(--sc-spur-breit)) / 2);
  display: flex; flex-wrap: wrap; align-items: center;
  justify-content: flex-end; gap: .2rem 1.5rem;
  font-size: .95rem;
}
/* Weiß auf #575756 ergibt 6,4:1 -- über der AA-Grenze. Der Unterstrich bleibt:
   Farbe allein darf einen Link nie kennzeichnen. */
.webbalken a { color: #fff; }

/* ---- Social-Kanäle im Servicebalken (Dagmar 05.08.2026) -----------------
   Sechs Symbole und „Podcast (DE)“, wie auf sightcity.net.
   Die Symbole tragen ihren Namen als .sc-sr-Text — sie sind deshalb ohne
   Unterstrich, denn dort steht kein sichtbarer Text, den man unterstreichen
   könnte. „Podcast (DE)“ ist sichtbarer Text und behält seinen. */
.websocial {
  list-style: none; display: flex; align-items: center; flex-wrap: wrap;
  gap: .25rem .9rem; margin: 0; padding: 0;
}
.websocial > li { margin: 0; }
.websocial a {
  display: inline-flex; align-items: center; justify-content: center;
  /* 44 × 32 px Zielfläche. Die Symbole selbst sind 20 px — zu klein zum
     sicheren Treffen. WCAG 2.5.8 verlangt 24 × 24 px, hier ist mehr da:
     Wer zittert oder mit dem Finger zielt, trifft trotzdem. */
  min-width: 2.75rem; min-height: 2rem;
  text-decoration: none;
}
.websocial a:hover .websocial-symbol,
.websocial a:focus-visible .websocial-symbol { color: var(--sc-tertiary); }
/* Der Fokusrahmen muss auf dem dunklen Grau sichtbar sein — das übliche
   dunkle Outline verschwände dort. */
.websocial a:focus-visible { outline: 3px solid var(--sc-tertiary); outline-offset: 2px; }
.websocial-symbol { display: block; }
.websocial-podcast { text-decoration: underline; padding-inline: .25rem; }
/* Der Website-Link steht ganz rechts, abgesetzt von den Kanälen. */
.webbalken-website { text-decoration: underline; }
/* Unter 640 px wird der Balken sonst zweizeilig und schiebt die Seite nach
   unten. Die Kanäle sind dort verzichtbar — sie stehen auch im Fußbereich
   der Website; der Weg zur Website bleibt. */
@media (max-width: 640px) { .websocial { display: none; } }

/* ---- Zeile 2: Logo und Navigation --------------------------------------- */
.webkopf {
  background: var(--sc-surface);
  padding: 1rem max(1rem, (100% - var(--sc-spur-breit)) / 2);
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1.5rem;
}
.weblogo { display: inline-flex; align-items: center; text-decoration: none; }
/* Höhe 48 px, Breite automatisch -- damit trägt die Regel jede gelieferte
   Datei, PNG wie SVG, ohne dass hier Maße nachgetragen werden müssen.
   max-width plus object-fit sind der Riegel für den einen Fall, in dem das
   nicht reicht: eine SVG-Datei ohne viewBox hat kein Seitenverhältnis und
   würde sonst die halbe Kopfzeile einnehmen. So bleibt sie eingepasst und
   verzerrt nie. */
.weblogo img {
  display: block; height: 48px; width: auto;
  max-width: min(100%, 340px); object-fit: contain; object-position: left center;
}
/* Wortmarke, solange css/bilder/sightcity-logo.png nicht mitgeliefert ist.
   1.6rem fett = 25,6 px und zählt damit als GROSSE Schrift (ab 18,66 px fett);
   dafür verlangt WCAG 2.1 AA 3:1. Das SightCity-Rot #eb1b1f erreicht auf Weiß
   4,46:1 -- für große Schrift reichlich, für Fließtext wäre es zu wenig.
   Deshalb steht diese Farbe hier und nirgends sonst in der Leiste. */
.weblogo-text { font-size: 1.6rem; font-weight: 700; color: var(--sc-primary); }

/* ⚠ GEÄNDERT AM 05.08.2026 (Dagmar): Die Navigation steht rechts NEBEN dem
   Logo, solange sie dort hinpasst — und rutscht darunter, wenn nicht.

   Hier stand vorher „bekommt IMMER eine eigene Reihe“, mit der Begründung:
   im Portal sei der Inhaltsbereich auf 1024 px begrenzt, dort passten neun
   Menüpunkte nie neben ein Logo. Die Begründung war richtig — die Ursache
   war aber die schmale Spur, nicht die Navigation. Gemessen: neun Punkte
   brauchen 1230 px, neben dem Logo waren in der 1024er-Spur nur 897 px frei.

   Seit der Kopf die BREITE Spur benutzt (--sc-spur-breit, 1640 px), ist der
   Platz da, und der Header sieht bei großen Fenstern aus wie sightcity.net.
   Bei schmalen Fenstern bricht die Navigation um — genauso wie das Original.

   flex:1 1 auto statt 1 0 100%: „darf wachsen, darf schrumpfen, nimmt seine
   natürliche Breite“ — der Umbruch entsteht dann von selbst über
   flex-wrap:wrap am .webkopf. margin-left:auto schiebt sie nach rechts,
   solange sie in derselben Zeile steht. */
#hauptnavigation.webnav { flex: 1 1 auto; margin-left: auto; }
#hauptnavigation.webnav > ul { justify-content: flex-end; }
/* Umgebrochen gehört sie linksbündig unter das Logo — rechtsbündig sähe sie
   dort verloren aus, weil das Logo links steht. */
@media (max-width: 1200px) {
  #hauptnavigation.webnav { flex: 1 0 100%; margin-left: 0; }
  #hauptnavigation.webnav > ul { justify-content: flex-start; }
}
#hauptnavigation.webnav ul {
  list-style: none; margin: 0; padding: 0; max-width: none;
  display: flex; flex-wrap: wrap; align-items: center; gap: .2rem 1.2rem;
}
#hauptnavigation.webnav > ul > li { position: relative; margin: 0; }

/* Diese Leiste ist die WEBSITE, nicht das Portal: dunkle Schrift auf Weiß wie
   auf sightcity.net, 16 px, font-weight 400, kein Uppercase (ausgemessen).
   Die Schaltflächen müssen dazu die Portal-Knopfform (rote Pille) ablegen. */
#hauptnavigation.webnav a,
#hauptnavigation.webnav button,
#hauptnavigation.webnav .webnav-sprache-aktiv {
  color: var(--sc-fg); background: none; border: 0; border-radius: 0;
  font: inherit; font-weight: 400; line-height: inherit;
  padding: .35rem .2rem; text-decoration: underline; cursor: pointer;
}
#hauptnavigation.webnav .webnav-sprache-aktiv { text-decoration: none; font-weight: 700; cursor: default; }
/* Hover in --sc-secondary (#922821, 8,2:1), NICHT in --sc-primary: das helle
   #eb1b1f kommt auf Weiß nur auf 4,50:1 und läge damit auf der AA-Grenze --
   ausgerechnet beim Zeigen auf einen Link. */
#hauptnavigation.webnav a:hover,
#hauptnavigation.webnav button:hover {
  color: var(--sc-secondary); background: none; border-color: transparent;
}

/* Aufklapp-Pfeil wie in der Portal-Leiste (.portal-nav__pfeil): ein ZUSATZ --
   die Ansage kommt aus aria-expanded, nicht aus dem Zeichen. */
.webnav-pfeil::after { content: "\25BE"; display: inline-block; margin-left: .25em; transition: transform .15s; }
#hauptnavigation.webnav button[aria-expanded="true"] .webnav-pfeil::after { transform: rotate(180deg); }

/* Sprachwahl an der Stelle, an der die Website ihre hat (erster Punkt).
   ⚠ Seit dem 05.08.2026 ein Aufklappmenü mit Flaggen (Dagmar), gebaut wie
   jeder andere Punkt der Leiste — die Regeln dafür stehen oben und greifen
   hier von selbst. Nur die Flagge braucht eine eigene Zeile. */
.webnav-sprachen { display: flex; align-items: center; }
.webnav-flagge {
  display: inline-block; vertical-align: middle; margin-right: .4rem;
  /* Ein dünner Rahmen, sonst verschwindet die weiße Fläche der britischen
     Flagge auf dem weißen Kopf. */
  border: 1px solid var(--sc-border); border-radius: 2px;
}
/* In der Schaltfläche steht die Flagge allein (der Sprachname ist nur für die
   Sprachausgabe da) — dort darf sie keinen Abstand nach rechts schieben. */
.webnav-sprachen > .webnav-schalter .webnav-flagge { margin-right: .2rem; }

/* ---- Untermenü ---------------------------------------------------------- */
#hauptnavigation.webnav > ul > li > ul {
  display: none; position: absolute; top: 100%; left: 0; z-index: 60;
  min-width: 15rem; flex-direction: column; flex-wrap: nowrap; gap: 0;
  margin: 0; padding: .4rem 0;
  background: var(--sc-surface); box-shadow: 0 3px 6px -1px rgba(0,0,0,.2);
  border-radius: 0 0 var(--sc-radius) var(--sc-radius);
}
#hauptnavigation.webnav > ul > li > ul a { display: block; padding: .45rem 1rem; }

/* Zwei Wege, das Untermenü zu öffnen -- aber nie beide zugleich:
   1. aria-expanded="true" -- gesetzt vom Skript (Maus und Tastatur).
   2. :focus-within        -- greift OHNE JavaScript, sobald der Tab-Fokus in
                              den Punkt läuft.
   Das Skript setzt als Erstes data-jsmenu an die Leiste und schaltet damit
   Weg 2 ab. Ohne diesen Schalter gingen beide gleichzeitig: Das Menü klappte
   beim Antabben sichtbar auf, während aria-expanded weiter "reduziert"
   ansagt -- Bild und Ansage würden sich widersprechen. */
#hauptnavigation.webnav > ul > li > button[aria-expanded="true"] + ul { display: flex; }
#hauptnavigation.webnav:not([data-jsmenu]) > ul > li:focus-within > ul { display: flex; }

/* Schmale Fenster und starke Vergrößerung (WCAG 1.4.10 Reflow, 400 %):
   alles untereinander, Untermenüs dauerhaft offen. Ein Klappmenü, das breiter
   ist als das Fenster, ist schlimmer als gar keins.
   Die Schaltfläche entfällt dabei -- ihr Ziel geht nicht verloren, denn der
   Hauptpunkt steht ohnehin als erster Eintrag in seinem eigenen Untermenü. */
@media (max-width: 781px) {
  .webbalken-innen { justify-content: flex-start; }
  #hauptnavigation.webnav ul { flex-direction: column; align-items: stretch; gap: 0; width: 100%; }
  #hauptnavigation.webnav > ul > li > ul {
    display: flex; position: static; box-shadow: none; min-width: 0;
    padding: 0 0 0 1rem; border-radius: 0;
  }
  #hauptnavigation.webnav button { display: none; }
  .webnav-sprachen { flex-direction: row; padding: .35rem 0; }
}

/* ---- N15: das Burger-Menü der Website-Leiste (Günter 31.08.2026) ---------
   Günter, nach dem ersten Test mit iPhone SE und VoiceOver:
   „Doch würde ich in der Navigation alle Punkte der normalen Webseite außer
   dem Home zur allgemeinen Startseite in ein Burger Menü zusammenklappen.
   Die Punkte für die Ausstellerinfo sowie die Menüpunkte vom Portal bleiben
   als Menü da und können ausgeklappt werden."

   Die Leiste besteht dafür aus DREI Listen mit dem Knopf dazwischen
   (klassen/seite.php, websiteheader):
       <ul>  Sprachwahl, Startseite          -- steht immer offen
       <button class="webnav-burger">        -- nur in der schmalen Ansicht
       <ul id="webnav-besuchende">           -- die übrigen Punkte der Website
       <ul>  Ausstellerinformationen         -- steht immer offen

   ⚠ AM GROSSEN SCHIRM ÄNDERT SICH NICHTS. Der Knopf ist dort ausgeblendet,
   die drei Listen stehen in einer Reihe -- dafür wird das <nav> selbst zur
   Flexbox, mit demselben Abstand (.2rem 1.2rem), den die Liste bisher hatte.
   Reihenfolge, Beschriftungen und Aufklappmenüs bleiben, wie sie waren.

   ⚠ DIE SCHWELLE IST 781 px -- dieselbe wie oben. Ab hier steht die Leiste
   ohnehin untereinander; eine zweite Schwelle hieße, dass sich das Bild an
   zwei verschiedenen Stellen umbaut. Serverseitig wird die Breite NICHT
   geraten: PHP liefert immer dasselbe HTML, nur die Anzeige unterscheidet. */

/* Die drei Listen nebeneinander in einer Reihe. Ohne diese Zeile stünde jede
   Liste als eigener Block untereinander -- das <nav> war bisher nur ein
   Behälter um EINE Liste. */
#hauptnavigation.webnav {
  display: flex; flex-wrap: wrap; align-items: center;
  justify-content: flex-end; gap: .2rem 1.2rem;
}
/* Umgebrochen unter das Logo: linksbündig, wie die Liste darin auch. */
@media (max-width: 1200px) { #hauptnavigation.webnav { justify-content: flex-start; } }

/* Am großen Schirm gibt es weder den Knopf noch den Ersatz-Punkt Startseite:
   Dort führen das Logo und der Servicebalken zur Startseite, und die Leiste
   soll unverändert bleiben. */
#hauptnavigation.webnav .webnav-burger { display: none; }
#hauptnavigation.webnav .webnav-start--ersatz { display: none; }

/* Die drei Striche. Reiner Schmuck (aria-hidden) -- der Name des Knopfes steht
   als sichtbarer Text daneben. Ein Knopf mit drei Strichen und ohne Wort hätte
   am Screenreader überhaupt keinen Namen. */
.webnav-burgerstriche {
  display: inline-block; position: relative; width: 1.1em; height: .75em;
  border-top: 2px solid currentColor; border-bottom: 2px solid currentColor;
}
.webnav-burgerstriche::after {
  content: ""; position: absolute; left: 0; right: 0; top: 50%;
  border-top: 2px solid currentColor; transform: translateY(-1px);
}

@media (max-width: 781px) {
  /* Untereinander -- wie die Listen darin (Regel weiter oben). */
  #hauptnavigation.webnav { flex-direction: column; align-items: stretch; gap: 0; }
  /* Jetzt trägt der Punkt „Startseite": Günter nennt ihn ausdrücklich als den
     einen Punkt, der NICHT mit eingeklappt wird. */
  #hauptnavigation.webnav .webnav-start--ersatz { display: block; }
  /* ⚠ DER KNOPF ERSCHEINT NUR MIT SKRIPT. data-jsmenu setzt das Skript in
     seite.php als Erstes. Ohne Skript kann der Knopf nichts aufklappen -- er
     wäre ein Knopf, der immer dasselbe tut: nichts. Dann bleibt die Liste
     stehen, wie sie vor dem 31.08.2026 stand: alle Punkte offen untereinander.
     Genau dieselbe Lösung wie bei den Untermenüs der Leiste. */
  #hauptnavigation.webnav[data-jsmenu] .webnav-burger {
    display: inline-flex; align-items: center; gap: .5rem;
    /* Zielfläche für den Finger. WCAG 2.5.8 verlangt 24 × 24 px -- auf einem
       Telefon, das mit einer Hand bedient wird, ist mehr angebracht. */
    min-height: 2.75rem; width: 100%; justify-content: flex-start;
  }
  /* Zugeklappt ist die Liste NUR, solange der Knopf sie auch wieder öffnen
     kann. Die Punkte bleiben dabei im HTML stehen -- wer die Seite durchsucht
     oder per Überschrift springt, findet sie weiterhin. */
  #hauptnavigation.webnav[data-jsmenu] .webnav-burger[aria-expanded="false"] + .webnav-besuchende {
    display: none;
  }
}
/* === ENDE header ========================================================= */

/* === ANFANG dashboard === */

/* ---- Zwei Spalten 3:1 (Dagmar 05.08.2026) --------------------------------
   „Startseite bitte aufteilen als 2 Spalten im Verhältnis 3:1. Können wir die
   Fortschrittsanzeige bitte rechts als Spalte einbauen?“

   minmax(0,3fr) statt 3fr: Ohne das min=0 wächst eine Spalte am Inhalt, den
   sie nicht umbrechen kann (eine breite Tabelle, ein langes Wort) — das
   Verhältnis kippt dann, und die Seite scrollt waagerecht. Mit minmax(0,…)
   bleibt es bei 3:1, und der Inhalt bekommt seinen eigenen Scrollrahmen.

   align-items:start, damit die schmale Spalte oben bündig steht und nicht auf
   die Höhe der langen linken gestreckt wird. */
.dash-spalten {
  display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
  gap: 1.5rem; align-items: start;
}
.dash-spalten > * { min-width: 0; }
/* Die schmale Spalte klebt beim Blättern oben — sie ist die Übersicht, und
   eine Übersicht, die man wegscrollt, ist keine. top rechnet die drei
   Kopfleisten nicht mit: sticky bezieht sich auf den Scrollbereich, nicht auf
   den Seitenanfang. */
.dash-neben { position: sticky; top: 1rem; }

/* ⚠ Unter 1000 px wird aus 3:1 eine Spalte. Bei 1:3 auf schmalem Schirm wäre
   die rechte Spalte rund 200 px breit — darin bricht jede Checklistenzeile
   dreimal um. Die Übersicht rutscht dann unter den Inhalt, dorthin, wo sie
   auch im Quelltext steht: Vorlese- und Sehreihenfolge bleiben gleich. */
@media (max-width: 1000px) {
  .dash-spalten { grid-template-columns: 1fr; }
  .dash-neben { position: static; }
}
/* Startseite, Umbau vom 05.08.2026: Terminbereich, aufklappbare Kachelgruppen.
   Nur Anordnung -- keine neuen Farben, alles aus den vorhandenen Tokens. */

/* Der Kachelbereich ist jetzt eine <section> mit aria-labelledby (er war der
   einzige Block der Seite ohne Landmarke). Damit greift aber die
   Bestandsregel "section[aria-labelledby] { border; padding; background }" --
   und darin stehen Aufklappboxen, die ihrerseits Karten enthalten. Das gaebe
   Kaesten in Kaesten in Kaesten.
   ⚠ Die Bestandsregel bleibt unveraendert; sie wird hier fuer GENAU DIESE eine
   Section zurueckgenommen. Zwei Klassenselektoren schlagen Element+Attribut,
   die Reihenfolge im Stylesheet entscheidet also nicht mit. */
.dash-kacheln[aria-labelledby] {
  margin: 0; padding: 0; background: none; border: 0; border-radius: 0;
}

/* --- Kachelgruppe (<details>) -------------------------------------------- */
/* Die Box umschliesst den Schalter UND die Kacheln, damit man sieht, wozu die
   Kacheln gehoeren, wenn mehrere Gruppen offen stehen. */
.dash-gruppe {
  border: 1px solid var(--sc-border); border-radius: var(--sc-radius);
  background: var(--sc-base); padding: .6rem .9rem; margin: 0 0 1rem;
}
/* Der Schalter erbt Zeigefinger, Farbe, Unterstreichung und Fokusrahmen von
   der allgemeinen summary-Regel weiter oben -- hier nur die Groesse. */
.dash-gruppe__kopf { font-size: 1.15rem; }
/* Die Ueberschrift steht IM summary (im HTML ausdruecklich erlaubt) und haelt
   die Stufenfolge h2 -> h3 -> h4 lueckenlos. Damit sie neben dem Dreieck
   bleibt und nicht wie eine eigene Zeile wirkt: inline und ohne Eigenleben. */
.dash-gruppe__titel {
  display: inline; margin: 0; font-size: inherit; font-weight: inherit; color: inherit;
}
/* Die Zahl sagt VOR dem Aufklappen, wie viel dahintersteckt. Kein Farbcode --
   sie steht als Text da und wird mit vorgelesen. */
.dash-gruppe__zahl { font-weight: 400; font-size: var(--sc-klein); color: var(--sc-muted); }
.dash-gruppe[open] > .dash-gruppe__kopf { margin-bottom: .8rem; }
/* Innerhalb der Gruppe kein zusaetzlicher Abstand unter dem Kachelraster. */
.dash-gruppe .dash-karten { margin-bottom: 0; }

/* Kachelueberschrift: in einer Gruppe h4, ausserhalb h3 -- gleiches Aussehen.
   (Die Bestandsregel fuer h3 bleibt, hier kommt h4 dazu.) */
.dash-kachel h4 { margin: 0; font-size: 1.2rem; }
/* Zusatzsatz auf einer Kachel (z. B. die Vorjahresstaende auf "Stand & Buchung") */
.dash-kachel__hinweis { margin: 0; color: var(--sc-fg); font-size: .95rem; }

/* --- Terminbereich -------------------------------------------------------- */
/* Geordnete Liste MIT ihren Zahlen. Zwei Gruende, sie stehen zu lassen:
   die Reihenfolge ist hier die eigentliche Aussage ("was kommt zuerst"), und
   list-style:none nimmt Safari/VoiceOver die Listensemantik -- die Ansage
   "Liste mit 6 Eintraegen" ginge verloren.
   Kein display:grid: das unterdrueckt in manchen Browsern den Zaehler. */
.dash-terminliste { margin: .6rem 0 1rem; padding-left: 1.6rem; }
.dash-termin { padding: .35rem 0; border-bottom: 1px solid var(--sc-border); }
.dash-termin:last-child { border-bottom: 0; }
.dash-termin__datum { color: var(--sc-fg); }
.dash-termin__was { color: var(--sc-muted); }
.dash-termin__besprechung { margin: 1rem 0 .6rem; color: var(--sc-muted); }
/* === ENDE dashboard === */

/* === ANFANG shop === */
/* ===========================================================================
   Möbel- und Zubehörbestellung als Karten (Paket „Der Shop als Karten",
   05.08.2026 · Vorlage sightcity-redesign/muster-zubehoer.html)
   ---------------------------------------------------------------------------
   Aufbau: links das Karten-Raster, rechts die mitlaufende Bestellübersicht.
   Es wurde KEINE Bestandsregel geändert -- die vorhandenen .accessories-*
   Regeln (Status-Farben, Beschreibung, Schrittweite, Gruppen-Überschrift)
   gelten unverändert weiter und werden hier mitbenutzt.

   ⚠ Das Raster ordnet nichts um: grid ohne order/dense setzt die Karten in der
   Reihenfolge des Quelltextes. Wer sieht und wer sich vorlesen lässt, bekommt
   dieselbe Reihenfolge.
   =========================================================================== */

/* ---- Zwei Spalten: Artikel und Bestellübersicht ---------------------------- */
.shop-layout { display: grid; grid-template-columns: minmax(0, 1fr) 20rem;
  gap: 1.5rem; align-items: start; }
.shop-spalte { min-width: 0; }

/* ---- Karten-Raster --------------------------------------------------------- */
.shop-raster { list-style: none; margin: 0 0 1rem; padding: 0;
  display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); }
.shop-karte { display: flex; flex-direction: column; gap: .35rem;
  background: var(--sc-surface); border: 1px solid var(--sc-border);
  border-radius: var(--sc-radius); padding: .9rem 1rem 1rem; }
/* Kostenfrei Enthaltenes hebt sich ab -- zusätzlich zum Text „im Stand
   enthalten", die Farbe trägt die Aussage nicht allein. */
.shop-karte--frei { border-left: 6px solid var(--sc-success); }
.shop-karte__titel { margin: 0; font-size: 1.05rem; line-height: 1.35; }
.shop-karte__preis { margin: 0; font-weight: 700; }
.shop-karte__status { margin: 0; font-size: .9rem; }
.shop-karte .accessories-beschreibung,
.shop-karte .accessories-grenze,
.shop-karte .accessories-schritt { margin: 0; }
.shop-karte .formular-fehler { margin: .2rem 0 0; }
.shop-karte__ohne { margin: auto 0 0; font-weight: 700; color: var(--sc-muted); }
/* Der Stepper sitzt unten, damit er in allen Karten einer Reihe auf einer
   Linie steht -- auch wenn die Beschreibungen unterschiedlich lang sind. */
.shop-karte .shop-stepper { margin-top: auto; padding-top: .5rem; }

/* ---- Mengen-Stepper -------------------------------------------------------- */
.shop-stepper__label { display: block; font-size: .85rem; margin: 0 0 .2rem; }
.shop-stepper__zeile { display: flex; align-items: stretch; gap: .3rem; }
/* ⚠ flex-basis, NICHT width: Die Bestandsregel für Eingabefelder (ganz oben,
   :where(input,…):not([type=checkbox]):not(…)) setzt width:100%. Sie sieht
   harmlos aus, wiegt durch ihre sechs :not() aber (0,6,0) -- jede Klassenregel
   hier wäre schwächer, und das Feld war im Browser 169 statt 80 Pixel breit.
   Im Flex-Layout schlägt flex-basis die Breite, deshalb geht es so ohne
   Änderung an der Bestandsregel. */
.shop-stepper .accessories-menge { flex: 0 0 5.5rem; width: 5.5rem; text-align: center; }
/* Die Knöpfe sind ZUGABE (siehe accessories_stepper): ohne JavaScript bleiben
   sie hidden. Die Regel steht hier ausdrücklich, weil display:flex im Eltern-
   element den Browser-Standard für [hidden] aushebeln würde. */
.shop-stepper__knopf[hidden] { display: none; }
.shop-stepper__knopf { flex: 0 0 auto; width: 2.6rem; padding: 0;
  border-radius: var(--sc-radius); font-size: 1.3rem; line-height: 1; }
/* Ausgegraut, wo der Knopf nichts mehr bewirken kann: Minus bei 0, Plus bei
   erreichter Höchstmenge (Günter Hanke 06.08.2026).
   ⚠ Er bleibt STEHEN und verschwindet nicht. Sonst wanderte bei jedem Klick
   auf 0 das Zahlenfeld nach links, und die Karte sähe je nach Menge anders
   aus -- Bedienelemente, die ihren Platz wechseln, trifft man schlechter
   (WCAG 3.2.x, gleichbleibende Bedienung).
   Die Farbe allein trägt die Aussage nicht: `disabled` steht im Markup, der
   Browser nimmt den Knopf aus der Bedienung, und für die Tastatur sind diese
   Knöpfe ohnehin nicht da (tabindex=-1, aria-hidden). */
.shop-stepper__knopf:disabled { opacity: .45; cursor: not-allowed;
  background: var(--sc-base); color: var(--sc-fg); border-color: var(--sc-border); }
.shop-stepper__knopf:disabled:hover { background: var(--sc-base); color: var(--sc-fg); }

/* ---- Gruppen --------------------------------------------------------------- */
/* ⚠ HIER STANDEN BIS ZUM 06.08.2026 die Regeln der Filterleiste
   (.shop-filter__knoepfe / __knopf). Sie sind mit der Filterleiste selbst
   entfallen -- die Gruppen klappen jetzt auf, statt einander auszublenden. */
.shop-gruppe { margin: 0 0 1.8rem; }
.shop-gruppe__text { margin: 0 0 .7rem; color: var(--sc-muted); }

/* ---- Bestellübersicht ------------------------------------------------------ */
.shop-korb { position: sticky; top: 1rem; }
.shop-korb h2 { margin: 0 0 .6rem; font-size: 1.25rem; }
.shop-korb__liste { list-style: none; margin: 0; padding: 0; display: grid; gap: .4rem; }
.shop-korb__liste li { display: flex; justify-content: space-between; gap: .6rem;
  border-bottom: 1px solid var(--sc-border); padding-bottom: .35rem; }
.shop-korb__liste li:last-child { border-bottom: 0; }
.shop-korb__preis { white-space: nowrap; font-weight: 700; }
.shop-korb__summe { display: flex; justify-content: space-between; gap: .6rem;
  font-weight: 700; border-top: 2px solid var(--sc-fg); margin: .8rem 0;
  padding-top: .5rem; }
.shop-korb input[type=submit] { width: 100%; }

/* ---- Schmales Fenster ------------------------------------------------------ */
/* ⚠ Dieser Block steht am ENDE des Shop-Blocks, nicht bei .shop-layout oben:
   eine Media Query erhöht die Spezifität NICHT. Stünde sie vor
   „.shop-korb { position: sticky }", gewänne die spätere Regel -- die
   Bestellübersicht klebte dann auch auf dem Handy fest. Genau so war es beim
   ersten Anlauf (im Quelltext richtig, im Browser falsch). */
@media (max-width: 60rem) {
  /* ⚠ minmax(0,1fr), nicht 1fr -- derselbe Fallstrick wie bei .tabs oben:
     „1fr" heißt minmax(AUTO,1fr), und das auto ist die min-content-Breite des
     Inhalts. Bei 320 px war das Raster 288 px breit, die Spur darin 316 px,
     und der Shop zog die Seite 12 px nach rechts (Messung 07.08.2026). */
  .shop-layout { grid-template-columns: minmax(0, 1fr); }
  .shop-korb { position: static; }
}
/* === ENDE shop === */

/* ===========================================================================
   BESPRECHUNGSRÄUME UND MEETINGBOXEN (Dagmar 08.08.2026)
   =========================================================================== */

/* ⚠ KONTRASTFEHLER, GEMESSEN UND BEHOBEN.
   Dagmar: „bei der Buchung der Besprechungsräume passt der Kontrast der
   Uhrzeiten nicht."

   Nachgemessen im Browser: 1,94:1. WCAG 2.1 AA verlangt 4,5:1 für normalen
   Text — 14,4 px fett zählt nicht als „groß" (das beginnt erst bei 18,66 px
   fett). Es war also klar unter der Grenze, und zwar nicht knapp.

   Die Ursache war kein Sonderfall dieser Maske: .hilfe ist dunkelgrau
   (#444441) und für WEISSEN Grund gemacht. In der Tabellenkopfzeile steht es
   auf fast schwarzem Grund (#0e1111), wo sonst weiße Schrift steht — dunkelgrau
   auf fast schwarz.

   Die Regel gilt deshalb für JEDEN Hilfetext in einem Tabellenkopf und nicht
   nur für die Uhrzeiten hier: Überall dort ist der Grund dunkel, und überall
   dort wäre .hilfe unlesbar gewesen. Neuer Wert #e6e6e6 auf #0e1111 = 15,2:1. */
thead th .hilfe { color: #e6e6e6; }

/* Der gewählte Messetag. ⚠ Er war vorher von den anderen NICHT zu
   unterscheiden — gleiche Farbe, gleiches Gewicht, kein Rahmen; der einzige
   Unterschied stand in .sc-sr und war damit unsichtbar. Dagmar: „es ist leider
   nicht selbsterklärend, dass man erst aus der Datumsliste den Tag auswählen
   muss."
   Jetzt dreifach gekennzeichnet: Hintergrund UND Haken UND Text. */
.meetingrooms-tage ul { list-style: none; display: flex; flex-wrap: wrap; gap: .5rem; padding: 0; margin: .25rem 0 0; }
.meetingrooms-tage li { margin: 0; }
.meetingrooms-tage a,
.meetingrooms-tag-aktiv { display: inline-block; padding: .35rem .75rem; border-radius: var(--sc-radius); border: 2px solid var(--sc-base); }
/* ⚠ --sc-secondary (#922821) und NICHT --sc-primary (#eb1b1f).
   Beim Nachmessen kam heraus: Weiß auf dem hellen Rot ergibt 4,46:1 — und
   damit knapp UNTER den 4,5:1, die WCAG 2.1 AA fordert. 16 px fett zählt noch
   nicht als „großer Text" (das beginnt bei 18,66 px fett), die 3:1-Ausnahme
   greift hier also nicht.
   Beim Beheben eines Kontrastfehlers einen neuen einzubauen wäre die Art von
   Fehler, die niemand mehr nachprüft. Das dunklere Rot ist ohnehin schon die
   Linkfarbe des Portals und kommt auf 7,9:1. */
.meetingrooms-tag-aktiv { background: var(--sc-secondary); color: #fff; font-weight: 700; border-color: var(--sc-secondary); }
/* Der Zusatz „(gerade gewählt)" bleibt lesbar, tritt aber zurück.
   ⚠ NICHT über opacity gedämpft — das senkt den Kontrast mit. */
.meetingrooms-tag-zusatz { font-size: var(--sc-klein); font-weight: 400; }
.meetingrooms-tagwahl { margin: 1rem 0; }

/* Die Belegungstabellen: Status-Anknüpfungspunkte aus Session 3, bisher ohne
   Regel. Farbe ist hier immer die DRITTE Ebene — Zeichen und Text stehen im
   HTML und tragen die Aussage allein. */
.meetingrooms-eigene { font-weight: 700; }
.meetingrooms-belegt { color: var(--sc-muted); }
.meetingrooms-summe { font-weight: 700; }
.meetingrooms-vorstellung details { margin: .5rem 0; }
.meetingrooms-bild { max-width: 320px; max-height: 240px; margin: .5rem .5rem 0 0; border-radius: var(--sc-radius); }

/* =====================================================================
   NACHRICHTENCENTER (masken/messages.php)
   =====================================================================
   Vorlage: sightcity-redesign/muster-nachrichten-aussteller.html
            sightcity-redesign/muster-nachrichten-messeleitung.html

   ⚠ WARUM DIESER BLOCK ENTSTANDEN IST (Dagmar, 18.08.2026):
   „Das Nachrichtencenter entspricht noch nicht der Layoutvorlage."
   Nachgemessen: Die Maske gibt seit dem ersten Tag das Klassen-Vokabular
   der MUSTER aus (.nc-liste, .nc-beitrag, .sc-btn …). Die Muster bringen
   ihre Regeln in einem eigenen style-Block mit — im Portal gab es dazu
   KEINE EINZIGE ZEILE. Jede dieser Klassen lief also ins Leere, und die
   Maske erschien in den nackten Vorgaben des Browsers.
   Das ist der Fall, vor dem lokal-test/pruef-wirkt-es.php warnt, nur auf
   der Gestaltungsseite: gebaut, aber ohne Wirkung.

   ⚠ ZWEI ÜBERSETZUNGEN WAREN NÖTIG, ein Abschreiben ging nicht:
   1. Die Muster benutzen Merkmalsnamen, die es hier nicht gibt
      (--sc-space-4, --sc-fs-sm, --sc-foreground, --sc-radius-pill).
      Hier stehen die Namen des Portals (--sc-klein, --sc-fg, --sc-pill)
      und feste Abstände.
   2. Ein Kontrastfehler der Vorlage ist NICHT übernommen — siehe
      .nc-chip--neu weiter unten.

   Es stehen hier NUR Regeln für Klassen, die die Maske heute wirklich
   ausgibt. Kennzahlen, Filterleiste und Dokumententabelle aus den Mustern
   sind noch nicht gebaut; ihre Regeln kämen sonst ohne Wirkung dazu.
   ===================================================================== */

/* ---- Bausteine, die es im Portal bisher nicht gab -------------------- */
/* .sc-btn braucht nichts: button ist oben schon gestaltet (rot, Pille).
   Nur die ZWEITE Stufe fehlt — Knöpfe, die nicht die Hauptaktion sind.
   ⚠ Nicht über opacity gedämpft, das senkt den Kontrast mit. Weiß mit
   dunklem Rand: der Text bleibt bei vollem Kontrast auf dem Untergrund. */
.sc-btn--secondary{
  background:var(--sc-surface); color:var(--sc-fg); border-color:var(--sc-fg);
}
.sc-btn--secondary:hover{ background:var(--sc-base); color:var(--sc-fg); border-color:var(--sc-fg); }

/* Feldabstand wie .formular-feld im übrigen Portal. */
.sc-field{ margin:0 0 1rem; }

/* Der Weg zurück über der Überschrift. */
.sc-breadcrumb{ font-size:var(--sc-klein); color:var(--sc-muted); margin:0 0 .5rem; }

/* ---- Die Reiter: Offen / Archiviert / Zu prüfen ---------------------- */
/* ⚠ Der aktive Reiter ist NICHT nur farbig, sondern zusätzlich fett und
   trägt im HTML „(aktuelle Ansicht)" in .sc-sr. Farbe ist die dritte
   Ebene, nie die einzige. */
.nc-reiter{
  display:flex; flex-wrap:wrap; gap:.25rem; list-style:none;
  margin:0 0 1.5rem; padding:0; border-bottom:2px solid var(--sc-border-strong);
}
.nc-reiter li{ margin:0; }
.nc-reiter a{
  display:inline-block; padding:.75rem 1rem; text-decoration:none;
  color:var(--sc-secondary); font-weight:700;
  border-radius:var(--sc-radius) var(--sc-radius) 0 0;
}
.nc-reiter a:hover{ background:var(--sc-base); }
.nc-reiter a[aria-current="page"]{ background:var(--sc-fg); color:#fff; }

/* ---- Die Vorgangsliste ----------------------------------------------- */
/* Eine echte Liste und keine Tabelle: Die Einträge haben keine
   Spaltenlogik, und eine Liste liest sich am Screenreader flüssiger.
   (Die Messeleitung bekommt laut Muster eine Tabelle — die ist noch nicht
   gebaut, siehe lokal-test/abgleich-nachrichtencenter.md.) */
.nc-liste{ list-style:none; margin:0; padding:0; display:grid; gap:.75rem; }
.nc-vorgang{
  background:var(--sc-surface); border:1px solid var(--sc-border);
  border-left:5px solid var(--sc-border-strong);
  border-radius:var(--sc-radius); padding:1rem;
}
/* ⚠ Die orange Kante ist reine GRAFIK und trägt keine Aussage allein:
   „Ungelesen" steht daneben als Merkzeichen im Klartext. Grafische Teile
   brauchen 3:1 (WCAG 1.4.11) — #ea5b0c auf Weiß erreicht 3,5:1. */
.nc-vorgang--ungelesen{ border-left-color:var(--sc-accent); }
.nc-vorgang__titel{ margin:0 0 .5rem; font-size:1.15rem; }
.nc-vorgang__titel a{ color:var(--sc-fg); text-decoration:none; }
.nc-vorgang__titel a:hover{ color:var(--sc-primary); text-decoration:underline; }
.nc-vorgang--ungelesen .nc-vorgang__titel{ font-weight:700; }
.nc-vorgang__zeile{
  display:flex; flex-wrap:wrap; gap:.5rem 1rem; align-items:center;
  font-size:var(--sc-klein); color:var(--sc-muted); margin:0;
}

/* ---- Merkzeichen (Kategorie, ungelesen) ------------------------------ */
.nc-chip{
  display:inline-block; font-size:var(--sc-klein); font-weight:700;
  padding:.1em .7em; border-radius:var(--sc-pill);
  background:var(--sc-base); color:var(--sc-fg);
  border:1px solid var(--sc-border-strong);
}
/* ⚠ HIER WEICHT DAS PORTAL BEWUSST VON DER VORLAGE AB.
   Das Muster setzt Weiß auf --sc-accent (#ea5b0c). Nachgemessen sind das
   3,50:1 — WCAG 2.1 AA verlangt für Text 4,5:1, und 14 px fett zählt noch
   nicht als großer Text (das beginnt bei 18,66 px fett). Übernommen wäre
   das ein Kontrastfehler an der auffälligsten Stelle der Maske.
   --sc-secondary (#922821) mit Weiß erreicht 7,9:1 und ist ohnehin schon
   die Linkfarbe des Portals. Dieselbe Begründung wie bei
   .meetingrooms-tag-aktiv weiter oben. */
.nc-chip--neu{ background:var(--sc-secondary); color:#fff; border-color:var(--sc-secondary); }

/* ---- Zustand (nur Messeleitungssicht) -------------------------------- */
/* Punkt UND Wort. Der Punkt ist Zugabe; wer keine Farben wahrnimmt, liest
   denselben Text — messages_zustandstext() gibt ihn aus. */
.nc-zustand{ display:inline-flex; align-items:center; gap:.45em; white-space:nowrap; }
.nc-zustand::before{
  content:""; width:.75em; height:.75em; border-radius:50%;
  border:1px solid rgba(14,17,17,.35); flex:none;
}
.nc-zustand--neu::before{ background:var(--sc-accent); }
.nc-zustand--zugeordnet::before{ background:var(--sc-base); }
.nc-zustand--arbeit::before{ background:var(--sc-info); }
.nc-zustand--wartet::before{ background:var(--sc-tertiary); }
.nc-zustand--erledigt::before{ background:var(--sc-success); }

/* ---- Der Zusammenhang über einem Vorgang ----------------------------- */
.nc-kontext{ background:var(--sc-base); border-radius:var(--sc-radius); padding:1rem; margin:0 0 1.5rem; }
.nc-kontext dl{
  display:grid; gap:.5rem 1.5rem;
  grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); margin:0;
}
.nc-kontext dt{ font-weight:700; font-size:var(--sc-klein); color:var(--sc-muted); }
.nc-kontext dd{ margin:0; }

/* ---- Die Steuerbox der Messeleitung ---------------------------------- */
.nc-steuerung{
  background:var(--sc-surface); border:1px solid var(--sc-border);
  border-radius:var(--sc-radius); padding:1rem; margin:0 0 1.5rem;
  display:grid; gap:1rem;
  grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); align-items:end;
}
.nc-steuerung .sc-field{ margin-bottom:0; }
.nc-steuerung__aktionen{ grid-column:1 / -1; display:flex; flex-wrap:wrap; gap:.75rem; }

/* ---- Der Verlauf ------------------------------------------------------ */
.nc-verlauf{ list-style:none; margin:0 0 1.5rem; padding:0; display:grid; gap:1rem; }
.nc-beitrag{
  background:var(--sc-surface); border:1px solid var(--sc-border);
  border-radius:var(--sc-radius); padding:1rem;
  border-left:5px solid var(--sc-info);
}
/* Von der Messeleitung geschrieben (Sicht der Messeleitung). */
.nc-beitrag--von-uns{ border-left-color:var(--sc-secondary); }
/* Vom Aussteller selbst geschrieben (Sicht des Ausstellers). */
.nc-beitrag--eigen{ border-left-color:var(--sc-info); background:#eaf2f8; }
/* ⚠ Die interne Notiz muss auf den ersten Blick anders aussehen als eine
   Nachricht an den Aussteller — sonst schreibt irgendwann jemand eine
   Notiz in dem Glauben, sie ginge hinaus, oder umgekehrt. Deshalb gelbe
   Fläche UND gestrichelter Rand UND der Klartext „Interne Notiz" im HTML
   (messages_intern_marke). Drei Ebenen, keine trägt allein. */
.nc-beitrag--notiz{
  border-left-color:var(--sc-fg); border-style:dashed; background:#fffdf0;
}
.nc-beitrag__kopf{
  display:flex; flex-wrap:wrap; gap:.5rem 1rem; align-items:baseline;
  margin:0 0 .75rem; padding-bottom:.5rem; border-bottom:1px solid var(--sc-border);
}
.nc-beitrag__von{ font-weight:700; }
.nc-beitrag__zeit{ font-size:var(--sc-klein); color:var(--sc-muted); }
.nc-beitrag__marke{
  margin-left:auto; font-size:var(--sc-klein); font-weight:700;
  background:var(--sc-fg); color:#fff;
  border-radius:var(--sc-pill); padding:.1em .8em;
}
.nc-beitrag p:last-child{ margin-bottom:0; }
/* Wohin die Nachricht ging — im Zweifel muss das nachweisbar sein. */
.nc-empfangszeile{
  font-size:var(--sc-klein); color:var(--sc-muted);
  margin-top:.75rem; padding-top:.5rem; border-top:1px dashed var(--sc-border-strong);
}

/* ---- Der interne Faden unter einer Notiz ------------------------------ */
/* Eingerückt, damit der Faden als Faden erkennbar ist — aber mit derselben
   Kennzeichnung, denn er ist genauso intern. */
.nc-intern-antwort{
  margin:.75rem 0 0 1.5rem;
  border-left:3px solid var(--sc-border-strong); padding-left:1rem;
}
.nc-intern-antwort .nc-beitrag__kopf{ border-bottom:0; padding-bottom:0; margin-bottom:.5rem; }
.nc-intern-eingabe{ margin:1rem 0 0 1.5rem; }
.nc-intern-eingabe label{ font-size:var(--sc-klein); }
.nc-intern-eingabe textarea{ min-height:4.5rem; }

/* ---- Der Antwortbereich ----------------------------------------------- */
.nc-antwort textarea{ min-height:9rem; }
/* ⚠ Vor dem Absenden zeigen, wer es bekommt. Sonst entsteht später Streit
   darüber, ob eine Nachricht zugestellt war. */
.nc-empfaenger{
  background:#eaf2f8; border-left:5px solid var(--sc-info);
  border-radius:0 var(--sc-radius) var(--sc-radius) 0;
  padding:.75rem 1rem; margin:0 0 1rem;
}
.nc-empfaenger p{ margin:0 0 .5rem; }
.nc-empfaenger ul{ margin:0; padding-left:1.2rem; }

@media (max-width:700px){
  /* Die Steuerbox untereinander statt in gequetschten Spalten. */
  .nc-steuerung{ grid-template-columns:1fr; }
  .nc-intern-antwort,.nc-intern-eingabe{ margin-left:.75rem; }
}

/* Zurueckgestellt nach einer Ablehnung (Dagmar 18.08.2026).
   ⚠ EIGENE REGEL UND NICHT .meetingrooms-belegt: Die beiden Lagen sind
   verschieden, und der Aussteller muss das sehen. "Belegt" heisst "jemand
   anderes hat den Raum" -- da kommt er nicht wieder. "Zurueckgestellt bis"
   heisst "vielleicht bald wieder frei", und daneben steht der Zeitpunkt.
   ⚠ Die Farbe ist die DRITTE Ebene: Das Sanduhr-Zeichen und der Text mit dem
   Zeitpunkt stehen im HTML und tragen die Aussage allein. Dieselbe Sanduhr
   wie bei der Option -- beides heisst "noch nicht entschieden".
   ⚠ --sc-secondary und nicht das helle Rot: Weiss auf #eb1b1f erreicht nur
   4,46:1. Hier steht dunkles Rot auf hellem Grund, das ist 7,9:1. */
.meetingrooms-zurueckgestellt{ color:var(--sc-secondary); font-weight:700; }

/* ---- Eingangstabelle und Prüfliste der Messeleitung (18.08.2026) ----
   Die Grundgestaltung der Tabellen steht schon oben bei "table"; hier
   kommt nur dazu, was das Nachrichtencenter eigens braucht.
   ⚠ Die Zeilenüberschrift (der Betreff) ist ein <th scope="row"> und damit
   vom Browser fett und zentriert. Zentriert gehört ein Betreff nicht.
   ⚠ ÜBERFÄLLIG steht als WORT in der Zelle — die Farbe ist die dritte
   Ebene und trägt nichts allein. --sc-secondary (#922821) auf hellem
   Grund sind 7,9:1, das helle Rot käme nur auf 4,46:1. */
/* ---- Die vier Spalten der Nachrichtentabelle (Dagmars DG4, 03.09.2026) --
   Aus neun schmalen Spalten sind vier breite geworden. Die Angaben, die
   ihre eigene Spalte verloren haben, stehen jetzt als ZWEITE ZEILE in der
   Zelle daneben — sie muessen deshalb sichtbar untergeordnet sein, sonst
   liest sich jede Zeile wie zwei.
   ⚠ Die Mindestbreite faellt von 48rem auf 34rem: Sie war gegen neun
   Spalten gebaut. Ganz weg darf sie nicht — vier Spalten mit langen
   Betreffs brauchen weiterhin einen Boden, unter dem der Scrollrahmen
   greift (WCAG 1.4.10 verlangt, dass die SEITE nicht waagerecht scrollt,
   nicht dass die Tabelle es nie tut). */
.messages-tabelle{ min-width:34rem; }
.nc-betreff{ display:block; }
/* ⚠ 0.86rem und nicht kleiner: Darunter wird es fuer Menschen mit
   Sehrest unlesbar, und genau die sind hier die Zielgruppe. Die Farbe
   ist #444441 — genau derselbe Wert wie bei .hilfe (Zeile 332). ⚠ NICHT
   --sc-muted (#575756): Der ist heller und in dieser Schriftgroesse
   grenzwertig. Und kein eigener neuer Grauton — das waere ein zweiter,
   ungepruefter Kontrastwert neben einem geprueften. */
.nc-zeile2{ display:block; font-size:.86rem; color:#444441; margin-top:.15rem; }
/* ⚠ Der Trenner ist aria-hidden und darf deshalb rein optisch wirken. */
.nc-trenner{ opacity:.6; }
/* Das Datum bleibt zweizeilig zusammen — ein Umbruch mitten in der
   Uhrzeit macht aus einer Angabe zwei. */
.nc-datum{ white-space:nowrap; }
/* ---- Die Sortierlinks unter der Spaltenueberschrift -------------------
   Der Spaltenname ist kein Link mehr; die Sortierungen stehen als kleine
   Links darunter. ⚠ Sie sind KEINE Zierde, sondern die einzige Stelle,
   an der sich nach Firma, Von, Zustaendig und Wiedervorlage ordnen laesst
   — seit diese Spalten weg sind. Sie duerfen deshalb klein sein, aber
   nicht unauffaellig. */
/* ⚠ Die aktive Sortierung ist fett UND traegt daneben ein Dreieck UND das
   Wort aufsteigend/absteigend fuer den Screenreader — drei Ebenen, weil
   keine davon allein genuegt (WCAG 1.4.1: nicht durch Farbe allein). */
.nc-sort--aktiv{ font-weight:700; }
.messages-tabelle th[scope="row"]{ text-align:left; font-weight:400; }
.messages-tabelle th[scope="row"] a{ font-weight:700; }
.messages-faellig{ color:var(--sc-secondary); font-weight:700; }
/* Die Auswahl in der Prüfliste soll nicht die ganze Spalte einnehmen —
   daneben stehen zwei Knöpfe, und die Zeile bricht sonst dreimal um. */
.messages-tabelle select{ width:auto; max-width:14rem; }
.messages-tabelle form{ display:flex; flex-wrap:wrap; gap:.4rem; align-items:center; margin:0 0 .4rem; }

/* ---- Kennzahlen und Filterleiste des Nachrichtencenters (18.08.2026) --
   Übernommen aus muster-nachrichten-messeleitung.html, übersetzt auf die
   Merkmalsnamen des Portals.
   ⚠ Die Zahl steht als <b> und der erklärende Text daneben — nie die Zahl
   allein. Farbe ist die dritte Ebene: --warnung und --info unterscheiden
   sich zusätzlich durch den Text der Kachel. */
.nc-kennzahlen{ list-style:none; margin:0 0 1.5rem; padding:0; display:grid; gap:.75rem;
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); }
.nc-kennzahl{ background:var(--sc-surface); border:1px solid var(--sc-border);
  border-left:5px solid var(--sc-border-strong); border-radius:var(--sc-radius); padding:1rem; }
.nc-kennzahl--warnung{ border-left-color:var(--sc-accent); }
.nc-kennzahl--info{ border-left-color:var(--sc-info); }
.nc-kennzahl b{ display:block; font-size:1.8rem; line-height:1.1; }
.nc-kennzahl span{ color:var(--sc-muted); font-size:var(--sc-klein); }
.nc-filter{ background:var(--sc-surface); border:1px solid var(--sc-border);
  border-radius:var(--sc-radius); padding:1rem; margin:0 0 1.5rem; display:grid; gap:1rem;
  grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); align-items:end; }
.nc-filter .sc-field{ margin-bottom:0; }
/* Anhänge: Name UND Größe, nie nur ein Symbol. */
.nc-anhaenge{ list-style:none; margin:.75rem 0 0; padding:.75rem 0 0;
  border-top:1px dashed var(--sc-border-strong); display:grid; gap:.5rem; }
.nc-anhaenge a{ font-weight:700; }
.nc-groesse{ color:var(--sc-muted); font-size:var(--sc-klein); }
/* ⚠ DER FASSUNGSHINWEIS IST BEWUSST NICHT GRAU UND NICHT KLEIN.
   Dagmar am 02.09.2026: der Hinweis auf Version und Aenderungsdatum soll
   „deutlich" sein. Ihn wie .nc-groesse zu behandeln waere das Gegenteil --
   die Dateigroesse ist eine Nebenangabe, die Fassung ist eine Warnung.
   ⚠ Und er traegt seine Bedeutung als WORT ("Fassung 3, geaendert am ..."),
   nicht als Farbe: Guenter Hanke liest mit NVDA, und die Auszeichnung hier
   macht nur sichtbar, was ohnehin dasteht. */
.nc-fassung{ font-weight:600; color:var(--sc-text); }

/* --------------------------------------------------------------------------
   Fassungen und Notizen an Dokumenten (Dagmar 02.09.2026)
   --------------------------------------------------------------------------
   ⚠ NUR ABSTAND UND GRUPPIERUNG. Kein Zustand haengt hier an einer Farbe --
   die Fassungsnummer, das Aenderungsdatum und der Merker „nur fuer uns"
   stehen als WORT im HTML. Diese Regeln machen sichtbar, was ohnehin
   dasteht. */
.dok-fassungen{ margin:.4rem 0 0; padding:0; list-style:none; }
.dok-fassungen li{ margin:.15rem 0; }
/* Der Hinweis im Rueckfall (wenn messages-dokumente.php nicht geladen ist).
   ⚠ Gleiche Auszeichnung wie .nc-fassung: Derselbe Satz darf nicht
   verschieden aussehen, je nachdem welche Datei ihn erzeugt hat. */
.dok-fassung-hinweis{ font-weight:600; color:var(--sc-text); }
.dok-neue-fassung{ margin:.8rem 0 0; padding-top:.6rem; border-top:1px solid var(--sc-border); }
.dok-notizen{ margin:.6rem 0 0; }
.dok-notizliste{ margin:.3rem 0 0; padding:0; list-style:none; }
.dok-notizliste li{ margin:.4rem 0; padding-left:.6rem; border-left:3px solid var(--sc-border); }
/* Wer wann geschrieben hat -- eine Nebenangabe, anders als der Text selbst. */
.dok-notiz-kopf{ color:var(--sc-muted); font-size:var(--sc-klein); }
.dok-notizform{ margin:.5rem 0 0; }

/* --------------------------------------------------------------------------
   Der Signaturblock (Dagmars DF1, 02.09.2026)
   --------------------------------------------------------------------------
   ⚠ <address> ist im Browser von Haus aus KURSIV. Die Signatur ist aber
   kein Zitat und keine Hervorhebung -- sie ist eine Adresse, und genau
   dafuer gibt es das Element. Die Schraege kommt von der Vorgabe, nicht
   von einer Absicht.
   ⚠ DIESELBE REGEL STEHT EIN ZWEITES MAL in klassen/mail.php: Ein
   Mailprogramm liest portal.css nicht. Wer nur eine der beiden aendert,
   sieht es im Portal richtig und beim Empfaenger kursiv. */
address.sc-signatur{ font-style:normal; }
@media (max-width:700px){ .nc-filter{ grid-template-columns:1fr; } }

/* Umleiten und Textbausteine im Nachrichtencenter (18.08.2026) */
.nc-umleiten{ background:var(--sc-base); border-radius:var(--sc-radius); padding:1rem; margin:0 0 1.5rem; }
.messages-bausteine{ margin:0 0 1rem; }
.messages-bausteine summary{ cursor:pointer; font-weight:700; padding:.4rem 0; }
.messages-bausteine textarea{ background:var(--sc-base); }

/* ===== Eine Firma entfernen (Günters G2b, 20.08.2026) =====
   ⚠ ABGESETZT UND ZULETZT. Es ist die einzige Handlung in der Zeile, die etwas
   wegnimmt -- zwischen „Firmendaten" und „Produkte" wäre sie eine Falle für den
   schnellen Klick. Die Trennlinie oben ist deshalb keine Zier, sondern der
   sichtbare Teil derselben Entscheidung, aus der der Block ganz unten steht.
   ⚠ KEINE Farbe als alleiniges Signal (Barrierefreiheit): Was passiert, steht
   im Text darüber und in der Beschriftung des Knopfes. */
.exhibitors-entfernen{ margin-top:.9rem; padding-top:.8rem; border-top:1px solid var(--sc-border); }
.exhibitors-entfernen .hilfe{ margin:0 0 .5rem; }
/* Die Aufzählung dessen, was an der Firma hängt -- sie erklärt, warum hier
   „archivieren" steht und nicht „löschen". */
.exhibitors-entfernen__anhang{ margin:.3rem 0 .7rem 1.2rem; padding:0; }
.exhibitors-entfernen__anhang li{ margin:.15rem 0; }

/* Die entfernten Firmen -- der Weg zurück. Zugeklappt, damit die Liste im
   Normalfall nicht die halbe Seite einnimmt. */
.exhibitors-archiv summary{ cursor:pointer; font-weight:700; padding:.4rem 0; }
.exhibitors-archiv__liste{ margin:.5rem 0 0 1.2rem; padding:0; }
.exhibitors-archiv__liste li{ margin:.35rem 0; }

/* ===== Der Nachrichten-Editor der Messeleitung (Dagmar 19./20.08.2026) =====
   Er steht an zwei Stellen mit demselben Baustein: im Firmendashboard
   (Block „Nachrichten an diese Firma") und auf der Übersicht.
   ⚠ ZWEI ANGABEN JE ZEILE, und die Rolle steht vorn: „Rechnungsadresse" ist
   die Auskunft, nach der man auswählt -- die Adresse selbst bestätigt sie nur.
   Ohne diesen Unterschied stünde dort fünfmal dasselbe Muster (genau Dagmars
   Einwand vom 20.08.2026). */
.nachrichteneditor__block{ margin:0 0 1.5rem; }
.nachrichteneditor__empfaenger{ border:1px solid var(--sc-border); border-radius:var(--sc-radius); padding:.7rem 1rem; margin:0 0 1rem; }
.nachrichteneditor__empfaenger legend{ font-weight:700; padding:0 .3rem; }
.nachrichteneditor__zeile{ margin:.3rem 0; }
/* Die Rolle trägt die Aussage, deshalb fett -- und als eigener Block, damit
   Rolle und Adresse auf schmalen Fenstern nicht ineinanderlaufen. */
.nachrichteneditor__rolle{ font-weight:700; }
.nachrichteneditor__adresse{ display:block; margin-left:1.7rem; color:#444441; font-size:.92em; }
.nachrichteneditor textarea{ width:100%; }

/* Der Entfernen-Kasten in den Firmendaten (Günters I4, 20.08.2026).
   ⚠ ABGESETZT UND NICHT VERSTECKT. Er steht offen über den Registerkarten —
   genau dort, wo Günter ihn gesucht hat und wo er ihn beim Benutzer kennt.
   Was ihn ungefährlich macht, ist der eigene Kasten mit Rahmen und Abstand
   zum Speichern-Knopf, nicht ein Aufklappbereich: „finde ich nicht" war der
   gemeldete Fehler. */
.exhibitor-entfernen{ border:1px solid var(--sc-border); border-radius:var(--sc-radius); padding:.7rem 1rem; margin:0 0 1.5rem; }
.exhibitor-entfernen h2{ margin:0 0 .3rem; font-size:1.05rem; }
/* Die Trennlinie des inneren Bausteins entfällt hier — der Kasten ist die
   Absetzung, zwei Linien übereinander wären eine zu viel. */
.exhibitor-entfernen .exhibitors-entfernen{ margin-top:0; padding-top:0; border-top:0; }

/* ---------------------------------------------------------------------------
   Kopierknopf an den Antwortadressen (Dagmar 21.08.2026)
   Gezeichnet von Seite::antwortadresse_block(). Der Knopf ist im Quelltext
   "hidden" und wird erst vom Skript in Seite::fuss sichtbar gemacht -- deshalb
   braucht er hier KEINE eigene Versteck-Regel.
   ⚠ rem und nicht em: em rechnet vom Elternelement und schrumpft in
   Verschachtelungen weiter (Regel seit 05.08.2026).
   --------------------------------------------------------------------------- */
.kopierknopf {
  margin-left: 0.5rem;
  padding: 0.25rem 0.75rem;
  font-size: var(--sc-klein);
  cursor: pointer;
}
/* ⚠ Die Rueckmeldung steht NEBEN dem Knopf und schiebt nichts weg: Sie
   erscheint erst nach dem Klick, und ein Umbruch der Zeile in genau dem
   Moment laesst den Knopf unter dem Zeigefinger wegspringen. */
.kopiermeldung {
  margin-left: 0.5rem;
  font-size: var(--sc-klein);
  color: #1a6b1a;
}

/* ---------------------------------------------------------------------------
   Nachrichten-Editor: Werkzeugleiste, Bausteine, Portallinks, Signatur
   (Sessionen „editor" und „komcenter", 21.08.2026 — Günters J3/J5, Dagmars DA6)
   ⚠ Ohne diese Regeln funktioniert alles, es steht nur alles untereinander.
   ⚠ Immer rem, nie em: em rechnet vom Elternelement und schrumpft in
   Verschachtelungen weiter (Regel seit 05.08.2026).
   --------------------------------------------------------------------------- */
.editor-werkzeuge {
  display: flex; flex-wrap: wrap; gap: 0.25rem;
  margin-bottom: 0.25rem;
}
.editor-werkzeug {
  padding: 0.2rem 0.6rem;
  font-size: var(--sc-klein);
  cursor: pointer;
}
/* Bausteine und Portallinks sind derselbe Bau: Auswahl plus Einfügeknopf. */
.editor-bausteine,
.editor-portallinks {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem;
  margin: 0.5rem 0;
}
.editor-quelle { max-width: 28rem; }
.editor-einsetzen { padding: 0.25rem 0.75rem; font-size: var(--sc-klein); }
.editor-portallinks__liste { margin: 0.25rem 0 0; font-size: var(--sc-klein); }
/* ⚠ Der Vorschaukasten braucht einen sichtbaren Rahmen. Ohne ihn verschmilzt
   der gerenderte Text mit dem Formular, und man hält ihn für die Nachricht
   selbst — statt für ihr Abbild. */
.editor-signatur { margin: 0.75rem 0; }
.editor-signatur__titel { font-size: var(--sc-klein); font-weight: 700; margin: 0 0 0.25rem; }
.editor-signatur__vorschau,
.nachrichteneditor__vorschau {
  border: 1px solid var(--sc-muted);
  background: #fbfbfa;
  padding: 0.75rem;
  margin: 0.5rem 0;
}
.nachrichteneditor__sprache { margin: 0.75rem 0; }
/* Was Markdown::zu_html() seit dem 21.08.2026 zusätzlich erzeugen kann. */
.nachrichteneditor__vorschau blockquote,
.editor-signatur__vorschau blockquote {
  margin: 0.5rem 0; padding-left: 0.75rem;
  border-left: 3px solid var(--sc-muted);
}
.nachrichteneditor__vorschau hr,
.editor-signatur__vorschau hr {
  border: 0; border-top: 1px solid var(--sc-muted); margin: 0.75rem 0;
}

/* ---------------------------------------------------------------------------
   Vortragsverwaltung (Session „vortraege“, 21.08.2026 — Dagmars DA8)
   ⚠ Farbe UND Zeichen UND Wort. Zeichen und Wort stehen im HTML, hier steht
   die dritte Angabe. Farben ausschließlich aus den vorhandenen --sc-*-Tokens.
   --------------------------------------------------------------------------- */
/* Die sechs Stationen von DA8 (Dagmar 25.08.2026).
   ⚠ DIE FARBE IST HIER NUR DIE DRITTE CODIERUNG. Zeichen und Text stehen
   daneben -- wer die Farbe nicht sieht, verliert nichts.
   ⚠⚠ TROTZDEM MUSS JEDE FARBE FÜR SICH AA ERFÜLLEN: Der eingefärbte Text IST
   die Statusangabe, nicht bloß Dekoration daneben. Deshalb steht unten kein
   --sc-accent (#ea5b0c ergibt auf Weiß nur 3,50:1) und kein --sc-primary
   (4,46:1 -- knapp unter AA). Für "läuft gerade" gibt es keinen ausreichend dunklen Orangeton im
   Bestand, deshalb --sc-live (siehe :root). */
.vortraege-status { white-space: nowrap; font-weight: 700; }
.vortraege-status--reserviert    { color: var(--sc-muted); }
.vortraege-status--bestaetigt    { color: var(--sc-info); }
.vortraege-status--laeuft        { color: var(--sc-live); }
.vortraege-status--gehalten      { color: var(--sc-fg); }
.vortraege-status--abgeschlossen { color: var(--sc-success); }
.vortraege-status--abgesagt      { color: var(--sc-secondary); }

/* Die Merker "verschoben" und "geändert" stehen NEBEN der Station.
   ⚠ Bewusst leiser als die Station: Sie ergänzen sie, sie ersetzen sie nicht.
   Gleiche Schriftgröße wie der Fließtext, damit sie lesbar bleiben. */
.vortraege-merker { color: var(--sc-muted); font-weight: 400; white-space: nowrap; }
/* ⚠ IN DER ÜBERSICHT ZWEIZEILIG (Dagmar 26.08.2026): „beim Zustand zweizeilig
   machen". Der Merker steht neben der Station in derselben Zelle — „Bestätigt
   (geändert)" in einer Zeile brauchte gemessen die zweitbreiteste Spalte der
   ganzen Tabelle (182 px von 937). Untereinander passt beides in die 12 %,
   die die Spalte seit DC1 bekommt.
   ⚠ NUR IN DER ÜBERSICHT. In der Einzelansicht steht der Merker in einer
   Definitionsliste ohne Platznot — dort wäre ein Umbruch nur ein Loch.
   ⚠ AM SCREENREADER ÄNDERT SICH NICHTS: display:block ist Darstellung, der
   Text und seine Reihenfolge im Dokument bleiben, wie sie waren. */
body[data-maske="vortragsverwaltung"] .standliste .vortraege-merker { display: block; }

/* Ausklappbare Vortragsreihen (Dagmar 25.08.2026, DA8 a).
   ⚠ <details>/<summary> statt eines eigenen Aufklappers: Tastaturbedienung,
   Zustandsansage und Auffindbarkeit bringt das Element selbst mit.
   ⚠ cursor:pointer und der Abstand sind das EINZIGE, was hier gestaltet wird --
   das Dreieck des Browsers bleibt, weil es der Zustandsanzeiger ist, den alle
   Nutzer schon kennen. */
.vortraege-reihe > summary { cursor: pointer; padding: 0.3em 0; font-size: 1.15em; font-weight: 700; }
.vortraege-reihe > summary:focus-visible { outline: 3px solid var(--sc-info); outline-offset: 2px; }
/* Die Anzahl steht in der Zusammenfassung, damit eine zugeklappte Reihe nicht
   verschweigt, wie viel dahintersteckt. Leiser als der Name -- sie ist die
   Nebenangabe. ⚠ Gemessen: --sc-muted auf Weiß ergibt 7,23:1. */
.vortraege-reihe__zahl { display: block; font-size: 0.8em; font-weight: 400; color: var(--sc-muted); }

/* Das Suchfeld über den Reihen. */
.vortraege-suche { margin: 0 0 1em 0; }

/* ===========================================================================
   „Ihre Vorträge" — eine Karte je gebuchtem Vortrag (Dagmar 25.08.2026)
   ===========================================================================
   ⚠ Dagmar: „Die Darstellung geht völlig unter … jeder Vortrag muss klar
   eingegrenzt und leicht zu finden sein." Vorher war es eine <li>-Zeile im
   Fließtext. Der Rahmen und der linke Balken sind genau diese Eingrenzung. */
/* ⚠⚠ DIE KARTE KOMMT AUS DEM BESTAND. `section[aria-labelledby]` (Zeile 405)
   gestaltet im Portal JEDEN benannten Abschnitt als Karte: Rahmen, Hintergrund,
   Abstände, abgerundete Ecken. Genau das ist die geforderte Eingrenzung — hier
   wird sie deshalb BENUTZT und nicht nachgebaut.

   ⚠ Am 25.08.2026 stand hier zunächst eine vollständige eigene Kartenregel. Sie
   ist wirkungslos geblieben und im Browser aufgefallen: `section[aria-labelledby]`
   ist mit (0,1,1) SPEZIFISCHER als `.lectures-vortrag` (0,1,0) und gewinnt jede
   Eigenschaft, die beide setzen. Eine zweite Kartengestaltung wäre auch fachlich
   falsch gewesen — die Vortragskarte sähe dann anders aus als jeder andere
   Abschnitt des Portals.

   ⚠ Übrig bleibt der linke Akzentbalken. `section.lectures-vortrag` hat dieselbe
   Spezifität (0,1,1) wie die Bestandsregel und steht später in der Datei — nur
   deshalb greift er. Wer die Regel nach oben verschiebt, schaltet sie ab. */
section.lectures-vortrag { border-left: 5px solid var(--sc-info); margin: 0 0 1em 0; }
.lectures-vortrag > h4 { margin: 0 0 0.4em 0; font-size: 1.1em; }

/* Die Angaben zum Kopieren: Bezeichnung und Wert nebeneinander, ab schmalen
   Fenstern untereinander.
   ⚠ Der Wert bekommt eine feste Schrift — Meeting-IDs und Kenncodes werden
   abgetippt, und in einer Proportionalschrift sind 1/l und 0/O nicht sicher zu
   unterscheiden. */
.lectures-kopierliste { margin: 0; }
.lectures-kopierzeile { display: flex; flex-wrap: wrap; gap: 0.2em 0.8em; padding: 0.25em 0; }
.lectures-kopierzeile > dt { font-weight: 700; min-width: 14em; }
.lectures-kopierzeile > dd { margin: 0; }
.lectures-kopierwert { font-family: ui-monospace, "Consolas", "DejaVu Sans Mono", monospace; word-break: break-all; }

/* Der Kopierknopf steht im HTML auf hidden und wird nur mit JavaScript
   eingeblendet — ohne Skript bleibt der Wert markierbarer Text.
   ⚠ Deshalb hier KEIN display, das hidden überschreiben würde: `hidden` verliert
   gegen jede display-Regel, und der Knopf wäre wieder sichtbar und wirkungslos. */
.lectures-kopieren {
  font-size: 0.85em; padding: 0.15em 0.6em; cursor: pointer;
  border: 1px solid var(--sc-muted); border-radius: 4px;
  background: var(--sc-bg); color: var(--sc-fg);
}
.lectures-kopieren:hover, .lectures-kopieren:focus-visible { border-color: var(--sc-info); }

/* Der allgemeine Ablauf-Link — einmal je Seite, nicht je Vortrag. */
.lectures-ablauflink { margin: 0.5em 0 1.2em 0; }
/* Die Vorschau des Listenimports — dieselbe Sprache, andere Fälle. */
.vortraege-status--neu        { color: var(--sc-success); }
.vortraege-status--doppelt    { color: var(--sc-muted); }
.vortraege-status--fehler     { color: var(--sc-secondary); }

/* ⚠ Der Zustand „fehlgeschlagen" im Ordner „Gesendet" (Session „komcenter",
   21.08.2026, Dagmars DA1). Er kam mit dem neuen Ordner dazu und hatte als
   einziger nc-zustand keine eigene Farbe — er sah damit aus wie jeder andere.
   Ausgerechnet der: „Die Zulassungsmail ist rausgegangen" gegen „sie ist
   fehlgeschlagen" ist die eine Auskunft hier, die nicht verwechselbar sein
   darf. Zeichen (✗) und Wort stehen bereits im HTML, das ist die dritte
   Angabe. */
.nc-zustand--fehler::before{ background:var(--sc-primary); }
.nc-zustand--fehler{ color:var(--sc-secondary); font-weight:700; }

/* ---------------------------------------------------------------------------
   Zwei Spalten auf einer Höhe: Nachrichtenzentrale und Dokumente
   (Dagmar DA4, 21.08.2026 — "in einer Zeile aber mit zwei Spalten, jeweils 50%")
   --------------------------------------------------------------------------- */
.dash-zweispalt {
  display: grid;
  /* ⚠ auto-fit + minmax und nicht 1fr 1fr: Bei 360 px stehen die beiden Karten
     dann UNTEREINANDER statt nebeneinander zerquetscht. Ohne Media Query, weil
     die Regel am verfügbaren Platz hängt und nicht an der Gerätebreite. */
  grid-template-columns: repeat( auto-fit, minmax( 20rem, 1fr));
  gap: 1rem;
  align-items: start;
}
.dash-dokumente__titel {
  font-size: var(--sc-klein);
  margin: 0.75rem 0 0.25rem;
}
.dash-dokumente__liste,
.dash-dokumente__zahlen {
  margin: 0;
  padding-left: 1.25rem;
}
.dash-dokumente__zahlen { list-style: none; padding-left: 0; }
.dash-dokumente__zahlen li { padding: 0.1rem 0; }
/* ⚠ „Zu prüfen" ist das Einzige in der Liste, das zum Handeln auffordert —
   deshalb dreifach: Farbe hier, Zeichen und Wort stehen im HTML. */
.dash-dokumente__pruefen { color: var(--sc-secondary); font-weight: 700; }

/* Der Weg zum Editor im Kommunikationscenter (Dagmar DA5.2b, 21.08.2026).
   Er steht über der Tabelle, damit er ohne Suchen zu finden ist. */
.nc-neu { margin: 0 0 0.75rem; }

/* Mehrere Empfänger in der Einzelansicht (Dagmar 21.08.2026): „wichtig, zu
   sehen wenn die Nachricht auch an andere gegangen ist". */
.nc-auchan { display: block; font-weight: 700; }
.nc-empfaenger { margin: 0.25rem 0 0; padding-left: 1.25rem; }

/* ===========================================================================
   Kommunikationscenter: waagerecht die Bereiche, senkrecht ihre Unterpunkte
   ===========================================================================
   ⚠⚠ HIER WAR ES AM 21.08.2026 GENAU ANDERSHERUM, und zwar sichtbar:
   „Nachrichten" und „Meine Dokumente" standen als Aufzählung UNTEREINANDER,
   die Ordner „Offen · Gesendet · Zu prüfen …" NEBENEINANDER.

   Die Ursache war nicht das HTML, sondern das Fehlen von Regeln:
     * .nc-hauptreiter hatte GAR KEINE Regel -- ein <ul> ohne Regel ist eine
       senkrechte Aufzählung mit Punkten.
     * .nc-reiter trug noch display:flex aus der Zeit, als SIE die waagerechte
       Leiste war.
   ⚠ Genau der Fall aus PROJEKTSTAND Abschnitt 4: „Bei CSS- und Strukturfragen
   genügt die HTML-Prüfung NICHT. Im Browser messen." Die Struktur war richtig
   gebaut und sah trotzdem falsch aus.

   Vorbild für die Endgestalt ist „Firmendaten bearbeiten" (.tabs weiter oben,
   Zeile 195): links eine schmale Spalte mit Reitern untereinander, rechts der
   Inhalt. Dieselben Maße und dieselbe Auszeichnung des aktiven Reiters --
   zwei Masken, die dasselbe tun, sollen nicht verschieden aussehen.
   =========================================================================== */

/* ---- WAAGERECHT: die Bereiche ------------------------------------------- */
.nc-hauptreiter ul{
  display:flex; flex-wrap:wrap; gap:.25rem; list-style:none;
  margin:0 0 1.25rem; padding:0; border-bottom:2px solid var(--sc-border-strong);
}
.nc-hauptreiter li{ margin:0; }
.nc-hauptreiter a{
  display:inline-block; padding:.75rem 1.25rem; text-decoration:none;
  color:var(--sc-secondary); font-weight:700;
  border-radius:var(--sc-radius) var(--sc-radius) 0 0;
}
.nc-hauptreiter a:hover{ background:var(--sc-base); }
.nc-hauptreiter a[aria-current="page"]{ background:var(--sc-fg); color:#fff; }

/* ---- Die Zweiteilung: schmale Reiterspalte links, Inhalt rechts ---------- */
/* ⚠ 264px wie bei .tabs -- damit die beiden Masken bündig wirken. */
.nc-zweispalt{ display:grid; grid-template-columns:264px 1fr; gap:1.25rem; align-items:start; }
/* ⚠ Ein Rasterfeld schrumpft von sich aus NICHT unter seine Mindestbreite --
   und die bestimmt hier die Vorgangstabelle. Ohne diese Zeile wächst die
   Inhaltsspalte über den Bildschirm hinaus, und die SEITE scrollt waagerecht
   statt der Tabelle (WCAG 2.1 AA, 1.4.10 Reflow). Der Scrollrahmen um die
   Tabelle kann das nicht auffangen: Er füllt brav die Spalte, die zu breit
   geworden ist.
   Nachgemessen am 24.08.2026 bei 1440 px Fensterbreite: vorher scrollte die
   Seite 234 px waagerecht (mit der zurückgekehrten Spalte „An"), mit dieser
   Regel 0 px -- und die Tabelle scrollt in ihrem Rahmen, wie vorgesehen. */
.nc-zweispalt > .nc-inhalt{ min-width: 0; }
/* ⚠ Bei schmalem Fenster untereinander. Ohne Media Query, weil die Regel am
   verfügbaren Platz hängt und nicht an der Gerätebreite. */
@media ( max-width: 60rem){
  .nc-zweispalt{ grid-template-columns:1fr; }
}
.nc-ordner{ position:sticky; top:1rem; }

/* ---- SENKRECHT: die Unterpunkte ----------------------------------------- */
/* ⚠ Diese Regel STICHT die ältere .nc-reiter-Regel weiter oben (Zeile 1756),
   die noch aus der Zeit der waagerechten Leiste stammt. Sie steht hier und
   die alte bleibt stehen, weil .nc-reiter auch anderswo vorkommen kann --
   überschrieben wird gezielt nur innerhalb von .nc-ordner. */
.nc-ordner .nc-reiter{
  display:flex; flex-direction:column; gap:.4rem;
  list-style:none; margin:0; padding:0; border-bottom:0;
}
.nc-ordner .nc-reiter a{
  display:flex; align-items:center; gap:.6rem; text-align:left;
  padding:.7rem 1rem; font-weight:700; text-decoration:none;
  background:var(--sc-surface); color:var(--sc-fg);
  border:1px solid var(--sc-border); border-radius:var(--sc-radius);
}
.nc-ordner .nc-reiter a:hover{ border-color:var(--sc-primary); background:var(--sc-surface); }
.nc-ordner .nc-reiter a[aria-current="page"]{
  background:var(--sc-fg); color:#fff; border-color:var(--sc-fg);
}

/* ===== Die Einzelansicht einer Nachricht (Dagmars DB5, 24.08.2026) ==========
   Im Browser gemessen bei 1280, 900 und 375 px; die Zahlen stehen in
   fuer-merge/einzel-merge.md.
   =========================================================================== */

/* ⚠⚠ .nc-kopfblock STAND SEIT DEM 21.08.2026 IM HTML UND HATTE NULL REGELN.
   Nachgezählt mit grep, im Browser bestätigt. Genau das ist Dagmars Punkt
   „optisch besser zusammenhalten und von der Umgebung abgrenzen": Der Kasten
   war nie ein Kasten. Derselbe Befund wie am 21.08.2026 beim
   Kommunikationscenter — das HTML war richtig, das CSS fehlte.
   ⚠ DIE ABGRENZUNG TRÄGT DER RAHMEN UND NICHT DER HINTERGRUND: --sc-surface
   gegen den Seitengrund sind gemessene 1,06:1, also praktisch nichts. Der
   1px-Rahmen bringt 17,87:1. Wer den Rahmen wegnimmt, nimmt die Abgrenzung
   weg — auch wenn der Hintergrund stehen bleibt. */
.nc-kopfblock{
  background:var(--sc-surface); border:1px solid var(--sc-border);
  border-left:5px solid var(--sc-primary);
  border-radius:var(--sc-radius); padding:1rem; margin:0;
}
.nc-kopfblock h3{ margin:0 0 .75rem; font-size:1rem; }
.nc-kopfblock dl{ margin:0; display:grid; gap:.6rem; }
/* Gemessen: 14 px (--sc-klein), Kontrast zum Kastengrund 7,23:1. */
.nc-kopfblock dt{
  font-weight:700; font-size:var(--sc-klein); color:var(--sc-muted); margin:0;
}
.nc-kopfblock dd{ margin:0; }
.nc-kopfblock .nc-empfaenger{ list-style:none; margin:.3rem 0 0; padding:0; }

/* ---- Der Zweispalter: Mailkopf links, Bearbeitung rechts ------------------
   ⚠ minmax(0,1fr) und nicht 1fr: Grid-Bahnen haben min-width:auto, und eine
   lange Mailadresse im Kopfblock zöge die Spalte sonst über ihre Bahn hinaus.
   Gemessen mit einer 62 Zeichen langen Adresse — kein Überlauf.
   ⚠ Ohne Media Query auf die GERÄTEbreite, sondern auf den verfügbaren Platz —
   dieselbe Linie wie bei .nc-zweispalt. Gemessen: bei 1280 px nebeneinander
   (links 861, rechts 352), bei 900 px untereinander. */
.nc-einzel-kopf{
  display:grid; grid-template-columns:minmax(0,1fr) minmax(0,22rem);
  gap:1.25rem; align-items:start; margin:0 0 1.5rem;
}
@media ( max-width: 60rem){
  .nc-einzel-kopf{ grid-template-columns:1fr; }
}

/* ---- Die rechte Spalte: die Auswahlfelder UNTEREINANDER --------------------
   ⚠ AUSDRÜCKLICH KEIN RASTER. .nc-steuerung legt die Felder in
   repeat(auto-fit,minmax(190px,1fr)) — in einer 352 px breiten Spalte ergäbe
   das je nach Fensterbreite ein bis zwei Spalten. Dagmar will sie
   „untereinander", und das ist der normale Fluss von .sc-field.
   Gemessen bei 1280 px: alle vier Felder auf x=917, y=722/854/940/1027. */
.nc-einzel-steuerung{
  background:var(--sc-base); border-radius:var(--sc-radius);
  padding:1rem; margin:0;
}
.nc-einzel-steuerung h3{ margin:0 0 .75rem; font-size:1rem; }
.nc-einzel-steuerung .sc-field:last-of-type{ margin-bottom:.75rem; }

/* ---- Die Aufklappbereiche --------------------------------------------------
   Umleiten, interne Notiz, Signatur und Anhang — eine Regel für alle vier,
   damit sie nicht auseinanderlaufen.
   ⚠ HIER STEHT ABSICHTLICH KEINE summary-Regel für Farbe, Schriftschnitt oder
   Fokus: portal.css hat davon längst welche (Zeile 1122 ff. und
   summary:focus-visible in Zeile 1134). Eine zweite Fassung wäre eine zweite
   Wahrheit, und beim nächsten Umbau widersprechen sie sich — dieselbe
   Überlegung wie bei der z-index-Reihenfolge. Gesetzt wird nur, was der Kasten
   braucht: Fläche.
   ⚠ NACHGEMESSEN, dass Auf- und Zuklappen ohne JavaScript arbeitet: ein Klick
   auf die Zusammenfassung schaltet details.open um. */
.nc-aufklapp{
  background:var(--sc-surface); border:1px solid var(--sc-border);
  border-radius:var(--sc-radius); margin:0 0 1rem; padding:.35rem .65rem;
}
.nc-aufklapp > *:not(summary){ padding:0 .35rem .5rem; }

/* ---- Die Vorgangsmappe (Dagmar, 28.08.2026) ------------------------------
   Ein Zeitstrahl über alle Vorgänge einer Mappe. ⚠ JEDE ZEILE TRÄGT IHRE
   HERKUNFT — ohne sie stünden Mails aus mehreren Zusammenhängen untereinander,
   und niemand wüsste, was wozu gehört. */

/* ⚠ REGISTER ALS LINKS UND NICHT ALS ARIA-TABREITER. Sie sehen aus wie
   Reiter, sind aber echte Links mit Parameter: ohne JavaScript bedienbar, als
   Lesezeichen ablegbar, mit aria-current eindeutig ausgezeichnet. Dieselbe
   Bauform wie der Filter „nur offene" in der Raumbuchung. */
.nc-mappe__register{
  list-style:none; margin:0 0 .75rem; padding:0;
  display:flex; flex-wrap:wrap; gap:.35rem;
}
.nc-mappe__reg{
  display:block; padding:.25rem .6rem;
  border:1px solid var(--sc-border); border-radius:var(--sc-radius);
  background:var(--sc-bg); color:var(--sc-text); text-decoration:none;
  font-size:.9rem;
}
/* ⚠ Das aktive Register ist NICHT nur farbig markiert: Es trägt zusätzlich
   aria-current und ein kräftigeres Gewicht. Farbe allein wäre für jemanden mit
   Farbsinnstörung keine Auskunft (WCAG 1.4.1). */
.nc-mappe__reg--aktiv{
  background:var(--sc-primary); border-color:var(--sc-primary);
  color:#fff; font-weight:600;
}
a.nc-mappe__reg:hover, a.nc-mappe__reg:focus-visible{
  border-color:var(--sc-primary); text-decoration:underline;
}

.nc-mappe__strahl{ list-style:none; margin:0; padding:0; }
.nc-mappe__zeile{
  display:grid; grid-template-columns:9.5rem 1.4rem 1fr; gap:0 .6rem;
  align-items:start;
  padding:.5rem .25rem; border-bottom:1px solid var(--sc-border);
}
.nc-mappe__zeile:last-child{ border-bottom:none; }
/* ⚠ Auf schmalen Geräten rutscht der Zeitpunkt in eine eigene Zeile, statt die
   Beschreibung auf drei Zeichen zusammenzuquetschen. */
@media (max-width:34rem){
  .nc-mappe__zeile{ grid-template-columns:1.4rem 1fr; }
  .nc-mappe__zeit{ grid-column:1 / -1; }
}
.nc-mappe__zeit{
  font-size:.85rem; color:var(--sc-text-muted);
  font-variant-numeric:tabular-nums;
}
.nc-mappe__was{ min-width:0; }
/* ⚠ DIE HERKUNFTSZEILE. Sie ist kleiner und ruhiger als der Titel, aber nicht
   unter AA: Sie ist die Antwort auf „woher kommt das" und muss lesbar sein. */
.nc-mappe__herkunft{
  display:block; font-size:.82rem; color:var(--sc-text-muted); margin-top:.1rem;
}
/* Eine interne Notiz muss auf den ersten Blick anders aussehen als eine
   Nachricht an den Aussteller — dieselbe Regel wie im Verlauf eines Vorgangs. */
.nc-mappe__zeile--notiz{ background:var(--sc-surface); }

/* ---- Die Empfängerauswahl beim Antworten ---------------------------------- */
.nc-einzel-empfaenger{
  border:1px solid var(--sc-border); border-radius:var(--sc-radius);
  padding:1rem; margin:0 0 1rem;
}
/* ⚠ align-items:baseline und nicht center: Eine Zeile mit langer Adresse
   bricht um, und das Kästchen soll an der ERSTEN Zeile stehen, nicht in der
   Mitte des umgebrochenen Blocks. */
.nc-einzel-adresse{ margin:0 0 .5rem; display:flex; gap:.6rem; align-items:baseline; }
/* ⚠ rem und nie em: em rechnet vom Elternelement und schrumpft in
   Verschachtelungen weiter — genau so ist ein Statuszeichen bei 12,5 px
   gelandet. --sc-klein (0.875rem = 14 px) ist die kleinste erlaubte Schrift.
   Gemessen: 14 px, Kontrast der Adresse zum Grund 6,81:1. */
.nc-einzel-mail{ color:var(--sc-muted); font-size:var(--sc-klein); }
.nc-einzel-herkunft{ font-size:var(--sc-klein); }
/* ⚠ Die Büroklammer ist ZIERDE — sie trägt aria-hidden im HTML, die Aussage
   steht daneben im Text. Ein Symbol allein genügt nicht. */
.nc-einzel-klammer{ font-size:1.1rem; }

/* ===== Dokumentenbereich (S3, 24.08.2026) ==================================
   Zwei Regeln, die die Vorschau (DB2) und das Notizformular (DB3) ordnen.
   ⚠ Ohne die erste stehen Vorschaubild und Angaben untereinander statt
   nebeneinander -- lesbar bleibt es, aber der Zweck der Vorschau (mehrere
   image001.png nebeneinander vergleichen) geht verloren. */
.nc-dok-vorschau{ display:flex; flex-wrap:wrap; gap:1rem; align-items:flex-start; }
.nc-dok-notizform{ margin:1rem 0 0; }

/* ⚠ Ein Ankreuzfeld steht NEBEN seiner Beschriftung, nicht darüber. Ohne diese
   Regel sähe .formular-feld--haken genau aus wie .formular-feld -- ein
   Modifikator ohne eigene Regel, den pruef-css-klassen.php zu Recht meldet:
   Er verspricht einen Unterschied, den es nur im Klassennamen gibt.
   Der Hilfetext bleibt darunter und behält seine volle Breite, damit er am
   Screenreader wie im Bild zum Feld gehört (aria-describedby). */
.formular-feld--haken{ display:grid; grid-template-columns:auto 1fr; gap:.4rem .6rem; align-items:baseline; }
.formular-feld--haken .hilfe{ grid-column:1 / -1; }

/* „Neue Nachricht schreiben" — der Knopf über der Liste (Dagmar 24.08.2026).
   ⚠ Die Zusammenfassung SIEHT aus wie ein Knopf, bleibt aber ein <summary>:
   Damit funktioniert das Aufklappen ohne JavaScript, und der Screenreader
   sagt von selbst an, ob der Bereich offen oder zu ist. Ein nachgebauter
   Knopf mit Skript könnte beides nicht. */
.nc-neuform{ margin:0 0 1.25rem; }
.nc-neuform > summary{
  display:inline-block; cursor:pointer; padding:.55rem 1.1rem;
  background:var(--sc-primary-flaeche); color:#fff; border-radius:.3rem;
  font-weight:700; list-style:none;
}
.nc-neuform > summary::-webkit-details-marker{ display:none; }
/* ⚠ Die Überschrift steht IN der Zusammenfassung und darf dort nicht als
   eigener Block umbrechen — sonst steht der Knopf über die ganze Breite. */
.nc-neuform > summary h2{ display:inline; font-size:1rem; margin:0; color:inherit; }
/* ⚠ Der Fokusrahmen muss sichtbar bleiben: Das ist der einzige Hinweis für
   Tastaturnutzer, dass sie auf dem Knopf stehen. */
.nc-neuform > summary:focus-visible{ outline:3px solid var(--sc-fg); outline-offset:2px; }
.nc-neuform[open] > summary{ margin-bottom:.9rem; }

/* ===========================================================================
   DC1 -- die Vortragsübersicht muss ohne Seitwärtsscrollen lesbar sein
   ===========================================================================
   Dagmar am 25.08.2026: „Im Portal erscheint die Tabelle mit den Vorträgen zu
   breit, man muss von links nach rechts scrollen. Das ist nicht besonders
   barrierefrei und auch vom Normalhandling nicht ganz einfach."
   Und am 26.08. die Ursache dazu: „Im lokalen System waren aufgrund kürzerer
   Titel [...] alle Spalten erreichbar, aber im Portal, bei längeren
   Vortragstiteln fiel das Problem erst auf. Sprich inhaltlich ist alles
   korrekt und wir brauchen auch alle Spalten, aber die Darstellungsbreite
   passt offensichtlich nicht."

   ⚠ ALLE ACHT SPALTEN BLEIBEN. Es wird nichts weggelassen, abgekürzt oder
   durch ein Symbol ersetzt -- Dagmar braucht sie alle, und Abkürzungen hätten
   am Screenreader ohnehin ausgeschrieben werden müssen.

   ⚠ NACHGEMESSEN AM 26.08.2026 IM BROWSER, nicht überlegt:
   Bei 1024 px Breite und einem echten Titel („Inklusive Beauty Experience -
   Make-up Workshop für blinde und sehbehinderte Frauen mit anschließender
   Fragerunde") lief die Tabelle um 29 px über und der Rahmen begann zu
   scrollen. Die Spaltenbreiten dabei:
       Termin 104 · Bühne 147 · Firma 68 · Titel 147 · Sprache 80 ·
       Zustand 182 · Terminnummer 133 · Bearbeiten 102
   Der Titel -- die einzige Spalte, die wirklich Platz braucht -- bekam 147 px,
   während „Zustand" 182 nahm. Ursache: .standliste hat keine feste
   Spaltenaufteilung, also verteilt der Browser nach dem längsten Inhalt je
   Spalte. Ein langer Zustandstext oder Bühnenname gewinnt damit gegen einen
   langen Titel, der umbrechen könnte.

   ⚠ table-layout: fixed IST DER KERN. Erst damit gelten die Breiten unten --
   ohne sie sind sie nur Vorschläge, die der Browser überstimmt.

   ⚠ WARUM :has() UND KEIN MODIFIKATOR IM HTML:
   masken/vortragsverwaltung.php enthält DREI .standliste-Tabellen (Übersicht
   mit 8 Spalten, Importvorschau mit 5, Bühnen mit 7). Eine Regel auf
   data-maske allein träfe alle drei, und die Breiten unten wären für die
   anderen beiden falsch. Der saubere Weg wäre eine eigene Klasse an der
   Tabelle -- aber die Datei gehört am 26.08.2026 der Session „material", und
   zwei Sessions in einer Datei überschreiben einander.
   Die Bedingung „hat eine 8., aber keine 9. Kopfzelle" trifft genau die
   Übersicht. ⚠ Und sie ist ungefährlich: Kennt ein Browser :has() nicht,
   greift die Regel gar nicht, und die Tabelle verhält sich wie bisher.
   ⚠ Wenn die Tabelle je eine Spalte bekommt oder verliert, greift die Regel
   nicht mehr -- das ist Absicht. Dann sind auch die Breiten unten falsch und
   gehören neu gemessen, statt still weiterzugelten.
   ============================================================================ */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) {
  table-layout: fixed;
}
/* Die Breiten. Zusammen 100 %. Der Titel bekommt mit Abstand am meisten --
   er ist der einzige frei getextete Inhalt, alle anderen Spalten tragen
   Datum, Kürzel, Zustandswort oder einen Link fester Länge. */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(1) { width: 12%; }  /* Termin */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(2) { width: 11%; }  /* Bühne */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(3) { width: 15%; }  /* Firma */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(4) { width: 26%; }  /* Titel */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(5) { width:  8%; }  /* Sprache */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(6) { width: 12%; }  /* Zustand */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(7) { width:  8%; }  /* Terminnummer */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) th:nth-child(8) { width:  8%; }  /* Bearbeiten */
/* ⚠ overflow-wrap: anywhere GEHÖRT DAZU. Mit fester Spaltenaufteilung bricht
   ein Text an Leerzeichen um -- ein einzelnes überlanges Wort (eine URL, ein
   zusammengesetzter deutscher Begriff) hätte aber kein Leerzeichen und
   schöbe die Spalte trotzdem auf. */
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) td,
body[data-maske="vortragsverwaltung"] .standliste:has(thead th:nth-child(8)):not(:has(thead th:nth-child(9))) tbody th {
  overflow-wrap: anywhere;
}

/* --- Social-Media-Board der Messeleitung (masken/socialadmin.php) --------
   Dagmars DC3 (26.08.2026) und DD3 (31.08.2026).

   ⚠ FARBE IST HIER IMMER DIE DRITTE EBENE. Der Zustand „vom Aussteller
   geändert" steht als WORT in der Zeile (socialadmin_geaendert); die Klassen
   unten kommen nur dazu. Wer die Farben entfernt, verliert nichts an der
   Aussage -- deshalb darf hier auch nichts stehen, das allein trägt. */

/* Der Filterblock über den vier Listen */
.sa-filter { margin: 0 0 1.2rem; }
.sa-filter fieldset { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: .8rem 1rem; }
.sa-filter .formular-feld { margin: .4rem 0; }

/* Der Satz, der sagt, dass gefiltert wird, und der Satz zur Sortierung.
   Beide sind Auskunft und nicht Zierat -- deshalb lesbar und nicht klein. */
.sa-filterhinweis { max-width: 65ch; margin: .2rem 0 .6rem; font-weight: 700; }
.sa-sortsatz { max-width: 65ch; margin: .2rem 0 .6rem; color: var(--sc-muted); }

/* Die vier Listen */
.sa-liste { margin: 0 0 1.5rem; }
.sa-tabelle td, .sa-tabelle th { vertical-align: top; }
.sa-tabelle th[scope="row"] { font-weight: 700; }
.sa-inline { display: inline; margin: 0; }
.sa-gesperrt { display: block; max-width: 40ch; }

/* ⚠ DIE MARKIERUNG (DD3c). --sc-accent ist der Warnton des Portals, wie in
   .media-row--ohnealt. Der Streifen links steht ZUSÄTZLICH zur Hintergrund-
   farbe: Bei aktiviertem Kontrastmodus fällt die Fläche weg, der Rand nicht. */
.sa-zeile--geaendert { background: #fdf3e6; box-shadow: inset 4px 0 0 0 var(--sc-accent); }
.sa-geaendert { color: var(--sc-secondary); font-weight: 700; white-space: nowrap; }
.sa-geaendert__wann { color: var(--sc-muted); }

/* Der Block „Vom Aussteller geändert" ganz oben am Board */
.sa-geaendertblock { border-left: 4px solid var(--sc-accent); }
.sa-geaendertliste { list-style: none; padding: 0; margin: .5rem 0 0; }
.sa-geaendertliste li { padding: .25rem 0; }

/* Die Rückfrage vor dem Löschen */
.sa-loeschfrage { border-left: 4px solid var(--sc-secondary); }
.sa-loeschform { margin: .6rem 0 0; }

/* Die Kanalauswahl und die Verwaltungsfelder im Formular (seit 26.08.2026
   ohne Regel) */
.sa-kanaele, .sa-verwaltung { border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: .8rem 1rem; margin: 0 0 1rem; }
.sa-kanal { display: inline-block; min-width: 12ch; margin: .15rem .8rem .15rem 0; }

/* Der Beitrag zum Ansehen, wenn die Frist abgelaufen ist
   (masken/socialmedia.php, socialmedia_nurlesen) */
.sm-nurlesen__liste { display: grid; grid-template-columns: max-content 1fr; gap: .2rem 1rem; margin: .5rem 0 0; }
.sm-nurlesen__liste dt { color: var(--sc-muted); }
.sm-nurlesen__liste dd { margin: 0; }

/* Mobil: die Boardtabelle bricht um wie .sm-plan und .sm-eigene */
@media (max-width: 700px) {
  .sa-tabelle, .sa-tabelle thead, .sa-tabelle tbody, .sa-tabelle tr,
  .sa-tabelle td, .sa-tabelle th { display: block; }
  .sa-tabelle thead { position: absolute; left: -9999px; }
  .sa-tabelle tr { border-bottom: 2px solid var(--sc-border-strong); padding: .5rem 0; }
  .sm-nurlesen__liste { grid-template-columns: 1fr; }
}
--------------------------------------------------------------------------

⚠ ZWEI KLASSEN AUS DEM BESTAND SIND ABSICHTLICH NICHT DABEI:
  .conditions-messe und .conditions-messewahl -- sie gehören der
  Konditionenmaske, das Board benutzt sie mit. Eine eigene Regel dafür wäre
  eine zweite Wahrheit über dieselbe Gestaltung.

/* --- Sammelauswahl in Listen (klassen/sammelauswahl.php) ------------------
   Dagmars DD2 (31.08.2026): "bei vielen Tabellen, die die Benutzerverwaltung
   macht es Sinn mehrere Einträge gleichzeitig zu bearbeiten."

   ⚠ HIER TRÄGT KEINE FARBE EINE AUSSAGE. Welche Zeilen ausgewählt sind, sagen
   die Ankreuzfelder selbst; wie viele es sind, sagt die Ansage im
   role="status". Diese Regeln ordnen nur an -- wer sie entfernt, verliert
   nichts an der Auskunft. */

/* Die Aktionsleiste UNTER der Tabelle. Sie ist ein fieldset mit legend --
   deshalb hier nur Abstand und Rahmen, die Beschriftung kommt aus dem HTML. */
.sammelauswahl-leiste { margin: .8rem 0 1.5rem; }
.sammelauswahl-leiste fieldset {
  border: 1px solid var(--sc-border); border-radius: var(--sc-radius); padding: .8rem 1rem;
}
/* ⚠ Umbrechend und nicht mit fester Breite: Auf dem Telefon stehen Aktion,
   zweite Angabe und Knopf sonst nebeneinander und werden unlesbar schmal.
   Günter hat das Portal am 30.08. mit dem iPhone bedient -- das ist kein
   theoretischer Fall. */
.sammelauswahl-leiste .formular-feld { margin: .4rem 0; }
.sammelauswahl-knoepfe { display: flex; flex-wrap: wrap; gap: .5rem; margin: .4rem 0; }

/* Das Ankreuzfeld in der Zeile. Größer als der Browservorgabewert: Es ist das
   kleinste Ziel der ganzen Tabelle, und WCAG 2.5.8 verlangt 24 x 24 Pixel. */
.sammelauswahl-feld { width: 1.15rem; height: 1.15rem; }

/* Die Rückfrage vor einer Aktion, die Mails verschickt.
   ⚠ Der Streifen links steht ZUSÄTZLICH zur Fläche: Bei aktiviertem
   Kontrastmodus fällt die Hintergrundfarbe weg, der Rand nicht. Dasselbe
   Muster wie bei .sa-loeschfrage. */
.sammelauswahl-rueckfrage { border-left: 4px solid var(--sc-accent); }
.sammelauswahl-betroffene { margin: .5rem 0 .8rem 1.2rem; max-width: 65ch; }
.sammelauswahl-betroffene li { padding: .15rem 0; }

/* --- Gesperrte Kacheln auf dem Dashboard (masken/home.php) ----------------
   Günters N1d (31.08.2026): "Auf dem Dashboard erkenne ich das bei den Punkten
   noch nicht. Erst, wenn ich die Punkte aufrufe wird mir angezeigt, dass ich
   das noch nicht darf."

   ⚠ DAS WORT "gesperrt" UND DER GRUND STEHEN IM HTML. Diese Regeln machen es
   zusätzlich sichtbar -- sie ersetzen die Auskunft nicht. Deshalb wird die
   Kachel auch NICHT ausgegraut bis zur Unlesbarkeit: Wer sie sieht, soll
   lesen können, was ihm entgeht, sonst kann er nicht einmal danach fragen. */
.dash-kachel--gesperrt { border-left: 4px solid var(--sc-accent); }
/* Der Knopf sieht nach "geht gerade nicht" aus, bleibt aber ein Link mit href.
   ⚠ Ein <a> ohne href ist am Screenreader kein Link mehr und fällt aus der
   Linkliste -- die Kachel wäre wieder unauffindbar. Wer klickt, landet auf der
   Sperrseite, und die erklärt es ausführlich. */
.dash-kachel--gesperrt .dash-btn[aria-disabled="true"] {
  background: var(--sc-base); color: var(--sc-fg); border-color: var(--sc-border-strong);
}

/* --- N17: Passwort einblenden (masken/password.php, masken/login.php) ----
   Günter für Eva, 31.08.2026: „Eva vermisst den Button mit dem Auge zum
   Einblenden des Passworts."

   ⚠ KEIN AUGENSYMBOL. Der Knopf trägt ein Wort — ein <button> mit einem
   Symbol ohne Text ist am Screenreader namenlos. Diese Regeln machen ihn nur
   schmal genug, damit er neben das Feld passt. */
.pw-sicht {
  margin-left: .5rem;
  padding: .25rem .6rem;
  font-size: var(--sc-klein);
  background: var(--sc-base);
  color: var(--sc-fg);
  border: 1px solid var(--sc-border-strong);
  border-radius: var(--sc-pill);
  cursor: pointer;
}
.pw-sicht:hover { background: var(--sc-surface); }
/* ⚠ Der gedrückte Zustand wird SICHTBAR unterschieden -- aria-pressed allein
   sagt es nur der Sprachausgabe. Wer sieht, soll es auch sehen. */
.pw-sicht[aria-pressed="true"] {
  background: var(--sc-fg);
  color: var(--sc-surface);
  border-color: var(--sc-fg);
}
/* ⚠ Auf schmalen Geräten unter das Feld, nicht daneben: Feld und Knopf
   nebeneinander lassen für das Passwort keine sinnvolle Breite übrig.
   Die Schwelle ist dieselbe, die portal.css sonst benutzt. */
@media (max-width: 640px) {
  .pw-sicht { display: block; margin: .4rem 0 0; }
}

/* --- Leseansicht einer Mail ohne Vorgang (masken/messages.php) ------------
   Günters L5, gebaut am 31.08.2026: Im Ordner „Gesendet" liess sich eine Mail
   ohne Vorgang weder öffnen noch beantworten.

   ⚠ DIE FORM FOLGT N11 vom selben Tag: Überschrift, dann sofort der Text, die
   Angaben danach. Diese Regeln machen die Angabenliste lesbar -- sie tragen
   keine Aussage. */
.nc-mail-angaben { margin: 1rem 0 0; max-width: 65ch; }
.nc-mail-angaben dt { font-weight: 700; margin-top: .5rem; }
.nc-mail-angaben dd { margin: 0 0 0 1.2rem; }

/* --- Was neben dem Menüknopf stehen bleibt (klassen/seite.php) ------------
   Dagmar, 31.08.2026: „Abmelden bleibt draußen, sichtbar."

   ⚠ Seit die Portalleisten auf schmalen Geräten zuklappen, läge das Abmelden
   sonst HINTER dem Menüknopf — man müsste erst „Ausstellermenü" öffnen, um
   sich abzumelden. Das ist der Weg AUS dem System heraus; ihn hinter zwei
   Klicks zu legen ärgert genau dann, wenn es eilig ist. Dieselbe Entscheidung
   wie bei „Startseite" in der Website-Leiste.

   ⚠ Diese Liste klappt NIE zu — sie hat bewusst keine Regel im Media-Block
   darunter. Wer hier eine ergänzt, nimmt dem Aussteller den Ausweg. */
.portal-nav__aussen { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; }
.portal-nav__aussen li { margin: 0; }

/* ===========================================================================
   Dokumentenverzeichnis (Dagmar 01.09.2026) -- masken/dokumente.php
   ===========================================================================

   ⚠ FUER DIE HAUPTSESSION: Dieser Block gehoert ans ENDE von
   portal-fundament/portal/css/portal.css, hinter den .media-*-Block. Die
   Datei css/portal.css gehoert keiner Einzelsession -- deshalb liegt er hier.

   ⚠ WOZU ER GEBRAUCHT WIRD: lokal-test/pruef-css-klassen.php meldet eine
   Maske, deren Klassen im CSS gar nicht vorkommen -- "die Maske erscheint in
   den nackten Vorgaben des Browsers", und keine andere Pruefung sieht das
   (HTTP 200 liefert sie trotzdem). Ohne diesen Block steht dokumente.php mit
   rund 80 Prozent klassenlosen Namen in dieser Meldung.

   ⚠ NIE FARBE ALLEIN. Jede Farbe hier steht ZUSAETZLICH zu einem Wort, das
   ohnehin im HTML steht -- .dok-betroffene--null etwa neben dem
   ausgeschriebenen Satz "Diese Freigabe trifft zurzeit auf keinen einzigen
   Benutzer zu". Wer die Farbe nicht sieht, verliert nichts.

   ⚠ KEINE Silbentrennung (hyphens) -- manche Screenreader lesen die weichen
   Trennstriche mit.
   =========================================================================== */

/* Einleitungen und Hinweise: 65ch wie .media-intro -- eine Textzeile, die
   ueber die ganze Bildschirmbreite laeuft, ist schwer zu lesen. */
.dok-intro { max-width: 65ch; }
.dok-hinweis { max-width: 65ch; color: var(--sc-muted); }
.dok-hinweis-klein { font-size: .85rem; color: var(--sc-muted); }

/* Der leere Fall bekommt einen Satz und keine leere Tabelle -- er soll wie
   eine Auskunft aussehen und nicht wie ein Rest. */
.dok-leer { max-width: 65ch; }

/* ⚠ DER SATZ "SICHTBAR FUER ..." IST DAS HERZSTUECK DER MASKE. Er steht
   deshalb abgesetzt und nicht als Randnotiz: Wer eine Freigabe erteilt, muss
   vorher lesen koennen, wen er trifft. */
.dok-sichtbar { max-width: 75ch; margin: .6rem 0; }
.dok-betroffene { margin: .2rem 0 1rem; color: var(--sc-muted); }
/* 0 Betroffene ist fast immer ein Irrtum. Die Farbe kommt ZUSAETZLICH zum
   role="alert" und zum ausgeschriebenen Warnsatz. */
.dok-betroffene--null { color: var(--sc-accent); font-weight: 700; }

/* Die Kategorien der Freigabe: jede ein eigenes fieldset mit legend, damit
   der Screenreader die Ueberschrift zu jedem Kaestchen mit ansagt. */
.dok-kategorie { border: 2px solid var(--sc-border-strong); border-radius: var(--sc-radius, 6px); padding: .8rem 1rem; margin: 1rem 0; }
.dok-kategorie > legend { font-weight: 700; padding: 0 .4em; }
/* Kaestchenzeile: Kaestchen und Beschriftung nebeneinander statt untereinander.
   ⚠ Bewusst ueber die Grundklasse im Zusammenhang und nicht ueber einen
   eigenen Modifikator -- ein Modifikator ohne Regel sieht aus wie die
   Grundklasse (pruef-css-klassen.php, Regel A). */
.dok-kategorie .formular-feld { display: flex; align-items: baseline; gap: .5rem; margin: .3rem 0; }
.dok-kategorie .formular-feld label { font-weight: normal; }

/* Die Einordnung (Vertragsunterlage oder sonstiges, 02.09.2026).
   Sie sieht aus wie ein Freigabekasten -- nur steht hier unter jedem Knopf
   ein Erklaersatz, und der braucht eine eigene Zeile. Ohne das umbrochene
   Gitter draengte er sich neben die Beschriftung und waere bei schmaler
   Anzeige ein Wortsalat.
   ⚠ Der Satz ist EINGERUECKT bis unter die Beschriftung: So sieht man,
   wozu er gehoert, ohne dass eine Farbe oder ein Symbol es sagen muss. */
.dok-einordnung .formular-wahl { display: grid; grid-template-columns: auto 1fr; gap: 0 .5rem; margin: .5rem 0; align-items: baseline; }
.dok-einordnung .formular-wahl .hilfe { grid-column: 2; margin: .1rem 0 0; }

/* Die bereits gewaehlten Firmen/Benutzer: eine Liste ohne Aufzaehlungszeichen,
   jede Zeile mit ihrem eigenen Entfernen-Knopf daneben. */
.dok-gewaehlt { list-style: none; padding: 0; margin: .5rem 0; }
.dok-gewaehlt li { display: flex; align-items: baseline; gap: .6rem; padding: .25rem 0; border-bottom: 1px solid var(--sc-border, #ddd); }
.dok-gewaehlt li:last-child { border-bottom: 0; }

/* Ein Formular, das in einer Zeile mitlaufen soll (Entfernen, Loeschen). */
.dok-inline { display: inline; margin: 0; }
.dok-hinzu { margin: .5rem 0 0; }

/* Hochladen und Freigaben bearbeiten */
.dok-upload fieldset, .dok-merkmale fieldset { border: 2px solid var(--sc-border-strong); border-radius: var(--sc-radius, 6px); padding: .8rem 1rem; }
.dok-merkmale { margin: 0 0 1rem; }

/* Die technischen Angaben zu einem Dokument */
.dok-meta { margin: .5rem 0 1rem; }
.dok-meta dt { font-weight: 700; color: var(--sc-muted); font-size: .9rem; }
.dok-meta dd { margin: 0 0 .5rem; }

/* Die beiden Tabellen. vertical-align:top wie bei .media-liste -- in der
   Spalte "Sichtbar fuer" steht ein ganzer Satz, die Nachbarzellen sind kurz. */
.dok-liste td, .dok-downloads td { vertical-align: top; }
.dok-liste th[scope="row"] { text-align: left; }
.dok-downloads th[scope="row"] { text-align: left; }

/* --------------------------------------------------------------------------
   Zulassung und Freischaltung in der Firmenliste (Guenters O10, 01.09.2026)
   --------------------------------------------------------------------------
   In EINER Tabellenzelle stehen jetzt ZWEI Zustaende untereinander. Ohne Regel
   traegt jeder den vollen Absatzabstand des Browsers -- die Zelle wird doppelt
   so hoch wie noetig, und die beiden Zustaende sehen aus wie zwei getrennte
   Angaben statt wie ein Paar.

   ⚠ KEINE FARBE ALLEIN. Das Wort steht ohnehin da (Sessionregeln, Abschnitt 4);
   diese Regel macht nur den Abstand, nichts anderes traegt hier Bedeutung. */
.exhibitors-zustand { margin: 0 0 .25rem; line-height: 1.35; }
.exhibitors-zustand:last-child { margin-bottom: 0; }
/* Der Vergleich der beiden Fragen steht EINMAL ueber der Tabelle und nicht in
   jeder Zeile -- deshalb darf er ruhig etwas kleiner sein als die Liste. */
.exhibitors-zustand-erklaerung { font-size: .9rem; margin: 0 0 .8rem; }

/* ---- Die Auswahl des Schnellzugriffs in Mein Konto (DG1, 03.09.2026) --
   Eine mehrspaltige Liste von Ankreuzfeldern. ⚠ Kein festes Spaltenmass,
   sondern auto-fill mit einer Mindestbreite: Auf einem schmalen Fenster
   wird daraus von selbst eine Spalte, ohne Medienabfrage und ohne dass die
   SEITE waagerecht scrollt (WCAG 1.4.10).
   ⚠ list-style: none, aber die Liste bleibt ein <ul> -- der Screenreader
   sagt dann weiterhin an, wie viele Punkte zur Wahl stehen. */
.account-schnellwahl {
  list-style: none; margin: .5rem 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: .35rem 1.2rem;
}
/* ⚠ Der Klickbereich umfasst die Beschriftung mit -- ein Kaestchen von
   13 Pixeln allein ist mit zittriger Hand oder am Touchgeraet kaum zu
   treffen (WCAG 2.5.8). */
.account-schnellwahl label { cursor: pointer; padding: .15rem 0; }

/* ---- Der Wegweiser in „Mein Konto" (Dagmars DG1, 03.09.2026) ----------
   Die Seite hat je nach Person bis zu sechs Abschnitte. Der Wegweiser
   verschiebt keinen davon — er sagt nur, was kommt.
   ⚠ Er sieht bewusst NICHT wie eine Navigationsleiste aus: Ein zweiter
   Balken oben würde mit der Portalnavigation verwechselt. Ein heller
   Kasten im Textfluss liest sich als das, was er ist — ein Inhalts-
   verzeichnis dieser einen Seite. */
.account-inhalt {
  background: var(--sc-base); border-radius: var(--sc-radius);
  padding: .8rem 1rem; margin: 0 0 1.5rem;
}
/* ⚠ Die Überschrift bleibt eine echte h2 (der Screenreader zählt sie mit),
   wird aber optisch zurückgenommen — sie ist ein Etikett, keine Station. */
.account-inhalt h2 { font-size: 1rem; margin: 0 0 .4rem; }
/* ⚠ Mehrspaltig ohne feste Spaltenzahl: Auf einem schmalen Fenster wird
   daraus eine Spalte, ohne Medienabfrage (WCAG 1.4.10, Reflow). */
.account-inhalt ul {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
  gap: .2rem 1.2rem;
}

/* =====================================================================
   HILFE & FAQ (masken/faq.php)

   Die Anleitungen werden ausserhalb des Portals erzeugt (anleitungen/quelle/)
   und als Fragment eingesetzt. Sie bringen ihre Klassennamen mit, aber KEINE
   eigene CSS -- ihre eigenstaendige HTML-Fassung hat ein eigenes Stylesheet,
   das hier nichts zu suchen hat.

   ⚠ ALLES UNTER .hilfe-inhalt GEKAPSELT. Die Anleitungen benutzen kurze,
   allgemeine Klassennamen (.karte, .toc, .kopf). Ungekapselt traefen diese
   Regeln Masken, die zufaellig denselben Namen verwenden.

   ⚠ LAYOUT NACH Designmuster/SightCity Exhibitor Product Guide.html,
   FARBEN NACH DEM CD-GUIDE. Wo beide sich widersprechen, gilt der Guide:
   #ea5b0c erreicht gegen Weiss nur 3,50 : 1 und ist durch #BF4A0A ersetzt,
   #EB1B1F durch #DC191D.

   ⚠ DIE FARBWERTE STEHEN HIER LOKAL und nicht in den Portal-Tokens: Die
   Umstellung von --sc-accent und --sc-primary wirkt auf JEDE Maske und ist
   eine Entscheidung fuer das ganze System, nicht die dieses Blocks. Faellt
   sie, verschwindet dieser Kasten ersatzlos.
   ===================================================================== */
.hilfe-inhalt, .faq-liste, .faq-intro, .faq-fuss, .faq-zurueck{
  --cd-akzent:#bf4a0a;   /* Aussteller-Orange, 5,0 : 1 auf Weiss */
  --cd-alarm:#dc191d;    /* Logo-Rot, 5,0 : 1 auf Weiss */
  --cd-link:#922821;     /* Dunkelrot, 8,2 : 1 -- Links und Abschnittslabel */
  --cd-gut:#176d22;      /* Forum-Gruen, 6,5 : 1 */
  --cd-ink:#1a1a1a;
  --cd-ink-2:#4a4a49;
  --cd-grau:#575756;
  --cd-linie:#d8d8d6;
  --cd-offweiss:#f5f4f2;
}

/* ---- Uebersicht der Anleitungen --------------------------------------- */
.faq-intro{ max-width:65ch; }
.faq-liste{ list-style:none; margin:1.5rem 0 0; padding:0;
  display:flex; flex-direction:column; gap:1rem; }
.faq-eintrag{ border:1px solid var(--cd-linie); border-top:4px solid var(--cd-akzent);
  border-radius:14px; padding:1.15rem 1.4rem; }
.faq-eintrag__titel{ margin:0 0 .35rem; font-size:1.12rem; }
.faq-eintrag__kurz{ margin:0; color:var(--cd-grau); max-width:65ch; }
.faq-eintrag__sprache{ margin:.35rem 0 0; color:var(--cd-grau); font-size:.9rem; }
.faq-fuss{ margin-top:2.5rem; padding-top:1.25rem; border-top:2px solid var(--cd-akzent);
  color:var(--cd-ink-2); }
.faq-zurueck{ margin:0 0 1.25rem; }

/* ---- Die Anleitung selbst --------------------------------------------- */
.hilfe-inhalt{ max-width:60rem; color:var(--cd-ink); }
.hilfe-inhalt p, .hilfe-inhalt li{ max-width:65ch; }

/* Titelkasten: Flaeche in Aussteller-Orange, weisse Schrift */
.hilfe-inhalt .titelkasten{ background:var(--cd-akzent); color:#fff; border-radius:14px;
  padding:1.5rem 1.8rem 1.6rem; display:flex; flex-direction:column; gap:1rem; margin:0 0 1.5rem; }
.hilfe-inhalt .titelkasten h1{ margin:0; font-size:1.9rem; line-height:1.2; color:#fff; max-width:24ch; }
.hilfe-inhalt .titelkasten .lead{ margin:0; font-size:1.12rem; font-weight:700; line-height:1.5;
  color:#fff; max-width:52ch; }

/* Inhaltsverzeichnis */
.hilfe-inhalt .toc{ border:1px solid var(--cd-linie); border-radius:14px; padding:1.2rem 1.5rem;
  margin:0 0 1.75rem; }
.hilfe-inhalt .toc h2{ margin:0 0 .8rem; font-size:1.15rem; }
.hilfe-inhalt .toc ol{ margin:0; padding-left:1.4rem; display:flex; flex-direction:column; gap:.4rem; }
.hilfe-inhalt .toc li{ max-width:none; }
.hilfe-inhalt .toc a{ color:var(--cd-link); }

/* Auf einen Blick */
.hilfe-inhalt .blick{ border:1px solid var(--cd-linie); border-top:4px solid var(--cd-akzent);
  border-radius:14px; padding:1.3rem 1.6rem; background:var(--cd-offweiss); margin:0 0 1.75rem; }
.hilfe-inhalt .blick h2{ margin:0 0 .9rem; font-size:1.15rem; }
.hilfe-inhalt .blick ol, .hilfe-inhalt .blick ul{ margin:0; padding-left:1.5rem;
  display:flex; flex-direction:column; gap:.45rem; }
.hilfe-inhalt .merksatz{ margin:1rem 0 0; padding-top:.9rem; border-top:1px solid var(--cd-linie);
  color:var(--cd-link); }

/* Abschnitte */
.hilfe-inhalt .abschnittslabel{ margin:2.5rem 0 0; font-size:.95rem; font-weight:700; color:var(--cd-link); }
.hilfe-inhalt h2.abschnitt{ margin:.3rem 0 .9rem; font-size:1.5rem; }
.hilfe-inhalt h3{ margin:1.5rem 0 .55rem; font-size:1.12rem; }

/* Oberflaechenbeschriftungen und Navigationspfade */
.hilfe-inhalt .ui{ font-weight:700; }
.hilfe-inhalt .pfad{ font-weight:700; }
.hilfe-inhalt .pfad .trenner{ color:var(--cd-akzent); padding:0 .3em; font-weight:700; }

/* Statusliste */
.hilfe-inhalt .statusliste{ display:grid; grid-template-columns:1fr; gap:1px;
  background:var(--cd-linie); border:1px solid var(--cd-linie); border-radius:14px;
  overflow:hidden; margin:0 0 1rem; }
.hilfe-inhalt .statuszeile{ display:flex; gap:1rem; align-items:baseline; background:#fff; padding:.8rem 1.15rem; }
.hilfe-inhalt .statuszeile .marke2{ flex:0 0 10rem; font-weight:700; }
.hilfe-inhalt .statuszeile .text{ color:var(--cd-grau); max-width:none; }
.hilfe-inhalt .status--gut .marke2{ color:var(--cd-gut); }
.hilfe-inhalt .status--warn .marke2{ color:var(--cd-alarm); }
.hilfe-inhalt .status--ruhe .marke2{ color:var(--cd-grau); }

/* Tabellen */
.hilfe-inhalt .tabellenrahmen{ overflow-x:auto; margin:0 0 1.5rem; }
.hilfe-inhalt table.sc{ width:100%; border-collapse:collapse; font-size:.97rem; margin-top:.75rem; }
.hilfe-inhalt table.sc th, .hilfe-inhalt table.sc td{ text-align:left; vertical-align:top; padding:.8rem; }
.hilfe-inhalt table.sc thead th{ border-bottom:2px solid var(--cd-ink); font-weight:700; }
.hilfe-inhalt table.sc tbody th, .hilfe-inhalt table.sc tbody td{ border-bottom:1px solid var(--cd-linie); }
.hilfe-inhalt table.sc tbody th[scope="row"]{ font-weight:700; padding-left:0; }
.hilfe-inhalt table.sc.matrix td, .hilfe-inhalt table.sc.matrix thead th + th{ text-align:center; }
.hilfe-inhalt table.sc.matrix th[scope="row"]{ width:32%; }

/* Karten: Fallstricke und Knopf-Erklaerungen */
.hilfe-inhalt .kartenliste{ display:flex; flex-direction:column; gap:1rem; margin:0 0 1rem; }
.hilfe-inhalt .karte{ border:1px solid var(--cd-linie); border-radius:14px; padding:1.15rem 1.25rem; }
.hilfe-inhalt .karte h3{ margin:0 0 .55rem; font-size:1.12rem; }
.hilfe-inhalt .karte p{ margin:0 0 .55rem; color:var(--cd-grau); }
.hilfe-inhalt .karte p:last-child{ margin-bottom:0; color:var(--cd-ink); }
.hilfe-inhalt .karte .tun::before{ content:"Was Sie tun: "; font-weight:700; color:var(--cd-link); }
.hilfe-inhalt .karte--knopf{ border-radius:8px; padding:.8rem 1.05rem; }
.hilfe-inhalt .karte--knopf p{ margin:0; color:var(--cd-ink); }

/* Nutzenpunkte mit Ziffernquadrat */
.hilfe-inhalt .vorteile{ list-style:none; margin:0 0 1rem; padding:0;
  display:flex; flex-direction:column; gap:1.1rem; }
.hilfe-inhalt .vorteile li{ display:flex; gap:1.1rem; max-width:none; }
.hilfe-inhalt .vorteile .ziffer{ flex:0 0 2.75rem; height:2.75rem; border-radius:8px;
  background:var(--cd-alarm); color:#fff; display:flex; align-items:center; justify-content:center;
  font-size:1.25rem; font-weight:700; }
.hilfe-inhalt .vorteile p{ margin:0; max-width:62ch; }

/* Pruefliste */
.hilfe-inhalt .checkliste{ margin-top:2rem; background:var(--cd-offweiss);
  border:1px solid var(--cd-linie); border-radius:14px; padding:1.5rem 1.7rem; }
.hilfe-inhalt .checkliste ul{ list-style:none; margin:0; padding:0;
  display:flex; flex-direction:column; gap:.7rem; }
.hilfe-inhalt .checkliste li{ display:flex; gap:.85rem; align-items:flex-start; max-width:none; }
.hilfe-inhalt .checkliste li::before{ content:""; flex:0 0 auto; width:20px; height:20px;
  margin-top:3px; border:2px solid var(--cd-ink); border-radius:4px; }

/* Schlussabsatz */
.hilfe-inhalt .fuss{ margin:2.5rem 0 0; padding-top:1.15rem; border-top:2px solid var(--cd-akzent);
  color:var(--cd-ink-2); max-width:70ch; }

/* Bildschirmfotos in den Anleitungen.
   ⚠ DIE BREITENANGABE IM HTML IST DIE ECHTE PIXELBREITE (2360) -- sie steht
   dort, damit der Browser den Platz schon vor dem Laden kennt und die Seite
   beim Nachladen nicht springt. Ohne die Regel unten wuerde das Bild aber in
   Originalgroesse gezeigt und spraengte die Spalte. */
.hilfe-inhalt figure.bild{ margin:0 0 1.5rem; border:1px solid var(--cd-linie);
  border-radius:14px; overflow:hidden; background:#fff; max-width:100%; }
.hilfe-inhalt figure.bild img{ display:block; width:100%; height:auto; }
.hilfe-inhalt figure.bild figcaption{ padding:.7rem 1rem; border-top:1px solid var(--cd-linie);
  background:var(--cd-offweiss); font-size:.92rem; color:var(--cd-ink-2); max-width:none; }

/* ---- Die Zugriffstaste im Schnellzugriff (Günters Q11, 10.09.2026) -------
   Die Ziffer steht sichtbar hinter dem Namen, damit man sie findet, ohne zu
   raten -- ⚠ sie ist aber KEIN eigener Bedienpunkt, sondern eine Beschriftung.
   Deshalb steht sie kleiner und ruhiger als der Name, und ⚠ NICHT allein über
   die Farbe: Sie bleibt auch ohne Stylesheet lesbar, weil sie im Linktext
   steht ("Nachrichten Taste 1"). */
.portal-nav__taste { font-size: .85em; opacity: .8; white-space: nowrap; }

/* ---------------------------------------------------------------------------
   nachrichten-css.css — Gestaltung der Session „nachrichten"
   Produktivtag Donnerstag, 10.09.2026 — Punkte Q5a und Q5c
   ---------------------------------------------------------------------------
   ⚠ NICHT DIREKT IN portal/css/portal.css SCHREIBEN. Die Datei gehört der
   Hauptsession; sie baut diesen Block nach dem Merge ein (Abschnitt 2 des
   Dateibesitzes vom 10.09.2026).

   ⚠ EINBAUORT: unmittelbar HINTER dem Block „Die vier Spalten der
   Nachrichtentabelle (Dagmars DG4, 03.09.2026)" — heute portal.css ab
   Zeile 2147. Die Regeln hier setzen ihn fort und gehören zu derselben
   Tabelle.

   ⚠⚠ UND EINE REGEL WIRD DORT ARBEITSLOS: `.nc-sortlinks` (heute
   portal.css:2176/2177). Die Sortierlinks stehen seit Q5a nicht mehr in der
   Kopfzelle; die Klasse kommt in masken/messages.php nicht mehr vor. Sie
   schadet nicht — aber wer sie stehenlässt, hat in zwei Wochen eine CSS-Regel
   ohne HTML dazu, und der nächste Mensch sucht das HTML.
   ⚠ `.nc-sort--aktiv` BLEIBT dagegen in Gebrauch: Die aktive Sortierung ist
   jetzt in der Leiste über der Tabelle fett.
   --------------------------------------------------------------------------- */

/* ---- Q5a: die Sortierleiste über der Tabelle ------------------------------
   Sie ersetzt die Sortierlinks in den Kopfzellen. Günter Hanke am 10.09.2026:
   „Bei jedem Spaltenwechsel horizontal wird mir in den Datenzeilen auch das
   Sortieren angesagt."

   ⚠ SIE DARF KLEIN SEIN, ABER NICHT UNAUFFÄLLIG. Sie ist die einzige Stelle,
   an der sich nach Firma, Von, Zuständig und Wiedervorlage ordnen lässt —
   seit diese Spalten am 03.09.2026 weggefallen sind. Deshalb 0.9rem und nicht
   0.8rem wie vorher in der Kopfzelle: Dort stand sie im Zusammenhang der
   Spalte, hier steht sie für sich. */
.nc-sortierung{ margin:0 0 .7rem; }
/* Der sichtbare Name der Landmarke. ⚠ Er ist ein <p> und keine Überschrift:
   Eine <h3> zwischen der Ordner-<h2> und der Tabelle wäre eine Gliederungs-
   ebene, die es sachlich nicht gibt — und in der Überschriftenliste eines
   Screenreaders eine Station mehr auf dem Weg zur Tabelle (Günters J2c). */
.nc-sortierung__titel{ margin:0 0 .2rem; font-weight:700; font-size:.9rem; }
/* Die äußere Liste: eine Zeile je Spalte, ohne Aufzählungszeichen.
   ⚠ Die Listenstruktur bleibt im HTML — sie trägt am Screenreader die
   Zuordnung „welche Sortierung gehört zu welcher Spalte". Sichtbar wird sie
   nur nicht als Punkteliste dargestellt. */
.nc-sortierung__spalten{ list-style:none; margin:0; padding:0;
  display:flex; flex-wrap:wrap; gap:.2rem 1.6rem; }
.nc-sortierung__spalten > li{ margin:0; }
/* Der Spaltenname vor seinen Sortierungen. Farbe #444441 — genau derselbe
   geprüfte Wert wie bei .hilfe und .nc-zeile2, kein neuer Grauton. */
.nc-sortierung__spalte{ font-size:.9rem; color:#444441; margin-right:.35rem; }
.nc-sortierung__spalte::after{ content:":"; }
/* Die innere Liste: die Sortierungen einer Spalte nebeneinander. */
.nc-sortierung__links{ list-style:none; margin:0; padding:0;
  display:inline-flex; flex-wrap:wrap; gap:.15rem .6rem; }
.nc-sortierung__links > li{ margin:0; }
/* ⚠ Kein Umbruch mitten in einem Sortierlink: Das Dreieck gehört zum Wort,
   und eine Zeile, die mit „▲" anfängt, ist nicht mehr zuzuordnen. */
.nc-sortierung__links a{ white-space:nowrap; font-size:.9rem; }

/* ---- Q5c: die Blätterleiste des Ordners „Gesendet" ------------------------
   ⚠ EIGENE KLASSE, ABER DASSELBE AUSSEHEN wie .exhibitors-blaettern und
   .useradmin-blaettern. Beide sind heute ungestaltet; diese Regeln greifen
   deshalb ausschließlich hier und ändern an den anderen beiden Listen nichts.
   ⚠ Wer die drei später vereinheitlicht, hat mit diesem Block die Vorlage —
   und sollte dann alle drei auf EINE Klasse ziehen statt eine vierte zu
   erfinden. */
.nc-blaettern{ margin:.8rem 0 0; }
.nc-blaettern p{ margin:0 0 .3rem; }
/* ⚠ Die Blätterlinks bekommen eine großzügige Klickfläche (WCAG 2.5.5,
   Zielgröße): Sie stehen dicht nebeneinander, und daneben zu treffen heißt
   hier, eine Seite zu verlieren. */
.nc-blaettern a{ display:inline-block; padding:.25rem .4rem; }

/* buchung-css.css
   Einzelsession „buchung" — 10.09.2026 (DF2b)

   ⚠ NUR EINE REGEL, und das ist Absicht. Der Protokollkasten benutzt die
   vorhandenen Klassen .dash-karte (Rahmen, Hintergrund, Innenabstand) und
   .dash-gruppe / .dash-gruppe__kopf / .dash-gruppe__titel (das Auf- und
   Zuklappen). Sie in eigenen Namen noch einmal nachzubauen waere die
   Doppelung, gegen die ARBEITSREGELN Abschnitt 0 steht.

   Was FEHLT, ist ein Abstand: Der Kasten steht unmittelbar unter dem
   Abschnitt „Ihre Bestellung" und klebte ohne diese Regel daran.

   ⚠ Der Kasten traegt seine eigene Klasse trotzdem — sonst waere
   „booking-protokoll" ein Name ohne Wirkung im HTML, und genau danach
   sucht lokal-test/pruef-css-klassen.php.

   Einzubauen in portal/css/portal.css (die Datei gehoert der Hauptsession).
*/

.booking-protokoll { margin-top: 1.5rem; }

/* fuer-merge/editor-css.css
   Session „editor", 10.09.2026 -- Guenters Q4a und Q4b (Mailentwuerfe und
   verzoegerter Versand).

   ⚠ portal/css/portal.css gehoert der Hauptsession. Diese Regeln werden nach
   dem Merge dort eingefuegt, sinnvollerweise direkt hinter dem Block
   .nachrichteneditor__* (portal.css ab Zeile 2289).

   ⚠⚠ HIER STEHT KEINE REGEL, DIE ETWAS AUSBLENDET ODER UMSORTIERT.
   Der Grund steht im Kopf von Nachrichtenversand::formular(): Die REIHENFOLGE
   der Absendeknoepfe im Quelltext entscheidet darueber, was die Eingabetaste
   ausloest -- und das muss die Vorschau bleiben (Guenters Meldung vom
   24.08.2026, eine echte Mail ist vorzeitig hinausgegangen). Ein
   `order:` oder `flex-direction: row-reverse` an dieser Stelle hoebe Riegel 1
   auf, ohne dass es im HTML zu sehen waere.

   ⚠ Ebenso wenig steht hier eine Regel, die einen Zustand allein ueber die
   FARBE ausdrueckt. Jeder Zustand steht als Wort in der Tabelle
   (Mailentwurf::zustandstext) -- die Gestaltung darf ihn hervorheben, aber
   nicht ersetzen. */

/* ---------------------------------------------------------------------------
   Der Entwurfsblock im Formular
   --------------------------------------------------------------------------- */
/* ⚠ Derselbe Rahmen wie bei .nachrichteneditor__empfaenger: Beide sind
   fieldsets im selben Formular, und zwei verschiedene Rahmen nebeneinander
   sehen aus wie zwei verschiedene Formulare. */
.nachrichteneditor__entwurf {
  border: 1px solid var(--sc-border);
  border-radius: var(--sc-radius);
  padding: .7rem 1rem;
  margin: 1.2rem 0 0;
}
.nachrichteneditor__entwurf legend { font-weight: 700; padding: 0 .3rem; }
/* Das Datumsfeld darf nicht ueber die ganze Breite laufen -- ein
   Eingabefeld, das viel breiter ist als sein Inhalt, laesst vermuten, dass
   mehr hineingehoert. */
.nachrichteneditor__entwurf input[type="datetime-local"] { max-width: 18rem; }

/* ---------------------------------------------------------------------------
   Das Entwurfsfach (die Liste „Meine Mailentwuerfe")
   --------------------------------------------------------------------------- */
.nachrichteneditor__entwurfsfach { margin: 1.5rem 0 0; }

/* Die Knopfleiste einer Tabellenzeile.
   ⚠ Jede Zeile traegt ein eigenes <form> -- ohne diese Regel setzt der Browser
   davor und dahinter einen Absatzabstand, und die Tabellenzeilen werden
   doppelt so hoch. */
.nachrichteneditor__entwurfzeile { margin: 0; display: inline; }
/* ⚠ Die Knoepfe duerfen umbrechen und nicht aus der Zelle laufen: In der
   Zeile stehen je nach Zustand bis zu vier Bedienelemente, und bei grosser
   Schrift (200 %, WCAG 1.4.4) passen sie nicht nebeneinander. */
.nachrichteneditor__entwurfsfach td > .nachrichteneditor__entwurfzeile {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  align-items: center;
}
