/* ============================================================
   dyne.css — local stylesheet for all new DYNE styling.
   Linked in css.php right after style-7.css, so rules here win
   the cascade without needing !important.

   MIGRATION MANIFEST (update every time a block is added below):
   Lists which page/prefix's CSS lives HERE vs. still inline in
   its own PHP file (render_*_css() / <style> block). Kept here
   so a later cleanup pass can see at a glance what's already
   migrated and what's still scattered across PHP files.

   Prefix   | Page(s)                        | Status
   ---------|---------------------------------|------------------------
   cgm-     | currentgm.php                   | NEW here (2026-08-11)
   csp-     | capspace.php                    | NEW here (2026-08-11)
   dpp-     | draftpicks.php                  | NEW here (2026-08-11)
   drr-     | draftrights.php                 | NEW here (2026-08-11)
   dht-     | drafthistory.php                | NEW here (2026-08-11)
   sch-     | schedule.php (nav-local only,   | NEW here (2026-08-11) -
            | rest still "terminplan-" inline)|
   rh-      | roster.php (rh-pill only here;  | rh-pill + variants NEW
            | rest in css/roster.css) +       | here (2026-08-11) —
            | inc_trade_tradeblock.php (same  | same ruleset reused by
            | rh-pill reuse; its other rh-*   | both, genuinely shared;
            | rules are in css/trade.css)     | rest of each stays split
            |                                 | per-page (see roster.css/
            |                                 | trade.css file headers)
   trp-     | trade.php + its 4 require()'d   | MOVED to css/trade.css
            | includes (inc_trade_*.php)      | (2026-08-11), not here —
            |                                 | not shared elsewhere
   gmform-  | 17+ pages (admin_*, dyneplus,   | .gmform-login-box (+
            | schedule, trade, freeagents,    | input/table sub-rules)
            | gamestats, roster_edit, ...)    | NEW here (2026-08-11,
            |                                 | confirmed byte-identical
            |                                 | first). .gmform-msg-error/
            |                                 | -success NOT moved — two
            |                                 | divergent variants exist
            |                                 | across pages, needs its
            |                                 | own dedicated pass to
            |                                 | sort out which page has
            |                                 | which before merging.
   ---------|---------------------------------|------------------------
   Fully migrated so far (own css/<page>.css file OR merged into this
   file): sh- (statshub.php), rh- (roster.php), trp- (trade.php),
   fap- (freeagents.php, css/freeagents.css, 2026-08-11),
   plp- (playerlist.php, css/playerlist.css, 2026-08-11),
   stp- (standings.php, css/standings.css, 2026-08-11),
   fab- (freeagent_bid.php + fa_auctions.php, ONE shared
   css/fab.css since both pages use the identical selectors,
   2026-08-11 — see that file's header for a union-of-both note),
   plt- (playofftree.php, css/playofftree.css, 2026-08-11),
   txp- (transactions.php, css/transactions.css, 2026-08-11 — also
   surfaced .trp-teampill as shared with trade.php, moved here too),
   epp- (profile.php, 2026-08-11 — 3 SEPARATE files, one per view:
   css/profile-player.css / -gm.css / -team.css, NOT merged despite
   the shared prefix — .epp-hero and other same-named selectors have
   real conflicting values per view, confirmed by direct comparison;
   profile.php also now require()s css.php for the first time, see
   [[project_dyne_css_not_loaded_on_epp_pages]] history),
   bsc- (boxscore.php, css/boxscore.css, 2026-08-11 — found during
   final sweep, wasn't in the original prefix list checked at the
   start of this migration),
   gsp- (gamestats.php, css/gamestats.css, 2026-08-11 — same sweep),
   roe- (roster_edit.php, css/roster_edit.css, 2026-08-11 — same
   sweep),
   terminplan- (schedule.php, css/schedule.css, 2026-08-12 — user
   explicitly said this page does NOT need a redesign, just asked to
   check for extractable CSS; moved as-is, zero visual change).
   dbe- (database_edit.php, NEW here 2026-08-15 — first redesign of
   this page, previously plain unstyled HTML tables/forms).
   hdb- (handbuch.php, NEW here 2026-08-15 — brand-new page, a
   user-facing manual listing every non-admin page's functions,
   grouped like the hamburger menu's categories (5 as of the index.php
   dashboard redesign the same day, was 3 before — see idx- below).
   Mockup approved first, per the user's standing preference for
   larger new pages.
   awe- (awards_edit.php, NEW here 2026-08-15 — first redesign of
   this page, previously plain unstyled HTML tables/forms, close
   sibling of dbe- above (same admin-CRUD-form page family) but its
   own prefix per the class-naming convention.
   No h1-h4/p tags used inside .hdb-page, same workaround as dbe-
   (div/span instead) to sidestep the white-card white-text-shadow
   gotcha in §8 of docs/design-system.md).
   pls- (playoff_seeding.php, NEW here 2026-08-15 — first redesign of
   this page, previously plain unstyled HTML tables/forms, same
   admin-CRUD-form page family as dbe-/awe- above, own prefix per the
   class-naming convention.
   dyp- (dyneplus.php, NEW here 2026-08-15 — first redesign of this
   page, previously plain unstyled HTML, same admin-CRUD-form page
   family as dbe-/awe-/pls- above, own prefix per the class-naming
   convention. Save button sits in the nav bar (explicit user request)
   using the dbe-/awe- light .dyp-navbtn style — but unlike those two,
   plain margin-left:auto alone hit the full-bleed-header gotcha
   (design-system.md §4), so #dypNavLocal's own width is additionally
   computed via JS (dypSyncNavLocal(), dyneplus.php) to end exactly at
   .dyp-box's right edge, not the viewport's — see that page's own
   header comment for the mechanism.
   adu- (admin_users.php, NEW here 2026-08-15 — first redesign of this
   page, previously plain unstyled HTML tables/forms, same admin-CRUD-
   form page family as dbe-/awe-/pls-/dyp- above, own prefix per the
   class-naming convention. Unlike pls-/dyp-, its two action buttons
   ("Neuen Benutzer anlegen" left-aligned, "Änderungen speichern"
   right-aligned via .adu-nav-right) DO sit in the nav bar per user
   request — same structure/padding-sync as awe-'s navlocal.
   idx- (index.php, NEW here 2026-08-15 — dashboard redesign, replacing
   the old plain bulleted link list. Tile-grid layout in an outer white
   box (pls- pattern), category cards mirroring the also-restructured
   get_main_nav_menu() (nav.php): "Mein Team"/"Transfermarkt"/
   "Ligabetrieb" (renamed same day from "Organisation", which also
   gained the external Forum link as a category item) split out of the
   old single 10-item "Team Management" category, per user request the
   split cascades into handbuch.php (hdb- above) too so both stay
   structurally identical. Mockup approved first as an Artifact. Admin
   category keeps its own gold-tinted card (reuses the .maxext gold
   token pair, design-system.md §1), same visual signal as the
   existing amber/gold pill family for "this needs elevated review/
   permissions". .idx-handbuch (added same day, follow-up request):
   a 6th static card linking to handbuch.php, filling the otherwise-
   empty 6th grid cell left by 5 categories in a 3-column grid.
   css/style_neu.css DELETED 2026-08-15 — legacy TeleportHQ/DevLink
   export, ~95% dead (no page still used its component classes after
   the epp-/rh-/etc. redesigns). The only two things from it still in
   active use, --dl-color-gray-black/-white, moved into the :root
   block below. roster.php + profile.php (all 3 views) had their
   <link> to it removed; nav.php's render_main_nav_css() already kept
   its own private copy of the --dl- spacing/radius vars it needs
   (see comment there), so it wasn't touched.

   This closes the page-by-page migration for every page that had
   ALREADY been redesigned to its own prefix as of 2026-08-11, plus
   schedule.php (moved without redesigning, per explicit user
   instruction 2026-08-12) — see docs/design-system.md §5 for the
   full prefix list. Pages never redesigned at all (still old
   teleportHQ/legacy look, no page prefix) are a separate, larger
   future project, not part of this pass.

   Not every page's CSS belongs in THIS file — dyne.css is for classes
   genuinely shared across 2+ pages. Page-specific design systems get
   their own css/<page>.css file instead (e.g. css/statshub.css,
   css/roster.css) and are linked with a filemtime() cache-busting
   query param, same pattern as this file's own <link> in css.php.
   sh- (statshub.php) lives in css/statshub.css, not here, as of
   2026-08-11 — moved out of this file's earlier "partial" state.
   ============================================================ */

:root {
    /* aus css/style_neu.css uebernommen (Datei 2026-08-15 geloescht) —
       roster.php body + profile.php body (alle 3 Views) + css/roster.css
       nutzen var(--dl-color-gray-black/-white) fuer Textfarbe/Hintergrund */
    --dl-color-gray-black: #000000;
    --dl-color-gray-white: #FFFFFF;
}

/* ===================== DYNE – globale Schrift ===================== */

@font-face {
    font-family: "Poppins";
    font-style: normal;
    font-weight: 400;
    src: url("/font/families/Poppins/Poppins-Regular.woff2") format("woff2");
}

@font-face {
    font-family: "Poppins";
    font-style: normal;
    font-weight: 600;
    src: url("/font/families/Poppins/Poppins-SemiBold.woff2") format("woff2");
}

@font-face {
    font-family: "Poppins";
    font-style: normal;
    font-weight: 700;
    src: url("/font/families/Poppins/Poppins-Bold.woff2") format("woff2");
}

body {
    font-family: "Poppins", Arial, Helvetica, sans-serif;
}

/* ===================== currentgm.php ("cgm-" prefix, added 2026-08-11) =====================
   Team/GM/Coach directory. Team cell keeps the pre-existing per-team color1/fontcol1 background
   (readable-pairing choice already made in the DB, see docs/design-system.md §7), now paired with
   the team logo that used to be loaded but never rendered. Sticky-col technique reused verbatim
   from docs/design-system.md §4. Stays in table format on mobile too (User-Wunsch 2026-08-11,
   siehe Kommentar bei .cgm-table-scroll unten) - kein Kartenlayout-Breakpoint mehr. */
.cgm-page { max-width: 1360px; margin: 0 auto; background: #ffffff; }
.cgm-content { padding: 18px 24px 28px; box-sizing: border-box; }

.cgm-header { margin-bottom: 14px; }
.cgm-h2 { font-size: 12.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50 !important; text-shadow: none !important; margin: 0 0 4px; }
.cgm-sub { font-size: 12px; color: #66707c !important; text-shadow: none !important; margin: 0; }

/* overflow-x:auto (statt eines Kartenlayout-Breakpoints, User-Wunsch 2026-08-11: "im mobile view
   bitte im Tabellenformat bleiben") - die Tabelle bleibt auf jeder Breite eine echte Tabelle
   (Kopfzeile + Zeilen), auf schmalen Screens wird sie stattdessen horizontal scrollbar, die
   sticky-col-Team-Spalte bleibt dabei sichtbar (identisches Prinzip wie standings.php's
   .stp-table-scroll). */
.cgm-table-scroll { overflow-x: auto; }
table.cgm-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.cgm-table thead tr:first-child th, .cgm-table thead tr:last-child th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 7px 10px; white-space: nowrap; }
.cgm-table thead th.left { text-align: left; padding-left: 14px; }
.cgm-table thead th.sticky-col { background: #2c3e50; z-index: 2; vertical-align: middle; }
.cgm-table thead th.cgm-group-divider { border-right: 1px dashed rgba(255,255,255,.4); }
.cgm-table tbody td { padding: 7px 10px; text-align: center; border-bottom: 1px solid #e2e4e7; vertical-align: middle; }
.cgm-table tbody td.left { text-align: left; }
.cgm-table tbody td.cgm-group-divider { border-right: 1px dashed #dde1e6; }
.cgm-table tbody tr:nth-child(odd) { background: #fff; }
.cgm-table tbody tr:nth-child(even) { background: #f5f6f8; }
.cgm-table tbody tr:hover { background: #eaf1f8; }

.cgm-table td.sticky-col, .cgm-table th.sticky-col { position: sticky; left: 0; z-index: 1; background: inherit; box-shadow: 2px 0 4px rgba(0,0,0,.06); }
.cgm-table thead th.sticky-col { background: #2c3e50; }

/* Team-Spalte schrumpft auf den laengsten Teamnamen ("Minnesota Timberwolves"/"Oklahoma City
   Thunder") statt eine feste breite Spalte mit viel Leerraum zu erzwingen - width:1% + nowrap ist
   der Standard-Trick dafuer: die Spalte bekommt gerade so viel Breite wie ihr Inhalt braucht, der
   Rest verteilt sich auf die uebrigen Spalten. */
.cgm-table th.cgm-team-col, .cgm-table td.cgm-team-col { width: 1%; white-space: nowrap; }

.cgm-team-chip {
	display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .01em;
	padding: 4px 12px; border-radius: 999px; white-space: nowrap; text-decoration: none;
}
.cgm-team-chip:hover { filter: brightness(1.08); }

.cgm-name-link { color: #2c3e50; font-weight: 600; text-decoration: underline; }
.cgm-name-link:hover { color: #1a2733; }
.cgm-debut { font-variant-numeric: tabular-nums; color: #3d4952; }
.cgm-steam-link { color: #2c3e50; text-decoration: underline; font-size: 11.5px; }
.cgm-steam-empty { color: #a9b0b8; font-style: italic; }

/* ===================== capspace.php ("csp-" prefix, added 2026-08-11) =====================
   Team-Cap-Uebersicht. Saison-Umschalter (Aktuelle/Naechste Saison) sitzt in DERSELBEN Zeile wie
   das Hamburger-Icon - Standardmuster wie ueberall sonst (roster.php/standings.php/statshub.php),
   NICHT als eigene Zeile (frueherer Versuch am selben Tag per flex-basis:100% war ein
   Missverstaendnis des User-Wunsches, siehe Git-Historie - "nicht direkt am Hamburger-Icon"
   bedeutet "nicht klebend links daneben", nicht "in einer eigenen Zeile"). .csp-navlocal bekommt
   stattdessen margin-left:auto, um an den rechten Rand der Leiste zu wandern - exakt wie
   roster.php's .rh-export-btn/standings.php's .stp-season-dropdown. Optik als Segmented-Pill exakt
   wie statshub.php's .sh-seg (User-Wunsch "genau so einen Umschalter wie in statshub.php") - hier
   als .csp-seg (identische Werte, nur umbenannt fuer den eigenen Praefix). Team-Spalte nutzt
   denselben farbigen Chip-mit-vollem-Namen wie currentgm.php (cgm-team-chip) statt einer voll
   eingefaerbten Zelle (User-Wunsch). Offene-Cap-/Spielerzahl-Zellen bleiben wie im Original
   gruen/rot je nach Status, jetzt mit den Design-System-Statusfarben (§1) statt der alten
   d9ead3/f4cccc-Hexwerte. Die "Naechste Saison"-Spalten (Softcap offen/Anzahl Spieler) sind auf
   User-Wunsch entfallen. */
.csp-page { max-width: 1360px; margin: 0 auto; background: #ffffff; }
.csp-content { padding: 18px 24px 28px; box-sizing: border-box; }

.csp-header { margin-bottom: 14px; }
.csp-h2 { font-size: 12.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50 !important; text-shadow: none !important; margin: 0 0 4px; }
.csp-sub { font-size: 12px; color: #66707c !important; text-shadow: none !important; margin: 0; }

/* Kein margin-left:auto mehr (fruehere Version sass rechtsbuendig, User-Korrektur 2026-08-11) -
   die Positionierung uebernimmt jetzt ausschliesslich cspSyncNavLocalPadding() (siehe capspace.php),
   das per JS ein passendes padding-left setzt, damit der Umschalter linksbuendig mit der Inhaltsbox
   landet statt am Hamburger-Icon zu kleben. */
.csp-navlocal { display: flex; align-items: center; }
/* Option C aus dem User-approved Mockup (2026-08-11, siehe capspace_toggle_options.html): die
   vorherige Version fuellte den aktiven Tab mit Navy (#2c3e50) - exakt derselbe Ton wie die
   Nav-Leiste dahinter, wodurch die "Fuellung" optisch mit dem Hintergrund verschmolz und kaum als
   aktiver Zustand erkennbar war (User-Feedback "immernoch etwas schwierig zu erkennen"). Jetzt:
   kein solider weisser Pillen-Container mehr, nur ein duenner halbtransparenter weisser Rahmen;
   aktiv = massiv WEISS gefuellt + Navy-Text (staerkstmoeglicher Kontrast gegen die dunkle Leiste,
   kann per Definition nicht mit ihr verschmelzen), inaktiv = gedaempft-transparenter weisser Text
   ohne Fuellung. */
.csp-seg { display: inline-flex; gap: 3px; padding: 3px; border: 1px solid rgba(255,255,255,.25); border-radius: 18px; }
.csp-seg a { color: rgba(255,255,255,.65); font-size: 11.5px; font-weight: 600; padding: 6px 13px; border-radius: 14px; text-decoration: none; display: inline-block; }
.csp-seg a:hover { color: #fff; }
.csp-seg a.active { background: #fff; color: #2c3e50; font-weight: 700; }
.csp-seg a.active:hover { color: #2c3e50; }

.csp-table-scroll { overflow-x: auto; }
table.csp-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.csp-table thead th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 8px 10px; white-space: nowrap; }
.csp-table thead th.left { text-align: left; padding-left: 14px; }
.csp-table thead th.sticky-col { background: #2c3e50; z-index: 2; }
.csp-table tbody td { padding: 7px 10px; text-align: center; border-bottom: 1px solid #e2e4e7; vertical-align: middle; }
.csp-table tbody td.left { text-align: left; }
.csp-table tbody tr:nth-child(odd) { background: #fff; }
.csp-table tbody tr:nth-child(even) { background: #f5f6f8; }
.csp-table tbody tr:hover { background: #eaf1f8; }

.csp-table td.sticky-col, .csp-table th.sticky-col { position: sticky; left: 0; z-index: 1; background: inherit; box-shadow: 2px 0 4px rgba(0,0,0,.06); }

.csp-table th.csp-team-col, .csp-table td.csp-team-col { width: 1%; white-space: nowrap; }

.csp-team-chip {
	display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .01em;
	padding: 4px 12px; border-radius: 999px; white-space: nowrap; text-decoration: none;
}
.csp-team-chip:hover { filter: brightness(1.08); }

.csp-cell-good { background: #e8f8ec; color: #1a7a1a; font-weight: 700; }
.csp-cell-bad { background: #fdeceb; color: #b00000; font-weight: 700; }

/* ===================== draftpicks.php ("dpp-" prefix, added 2026-08-11) =====================
   Draft-Pick-Besitzuebersicht (Round 1/2, Lottery-Schutzregeln). Saison-Auswahl neu (User-Wunsch) -
   Dropdown statt 2er-Segmented-Pill wie bei capspace.php, weil draftpicks ueber viele echte Saisons
   Daten hat statt nur "aktuell/naechste". Positionierung per dppSyncNavLocalPadding() - siehe
   docs/design-system.md §4 "Nav-local control horizontal alignment" fuer das generalisierte Muster
   (identisch zu csp-/fap-/sh- Pendants, nur umbenannt). Team-Spalte wie cgm-/csp-team-chip. Die 4
   Lottery-Farben sind dieselben Hex-Werte wie standings.php's Draft-Pick-Protection-Legende (§1). */
/* width:fit-content allein reichte nicht (User-Korrektur 2026-08-11: "immer noch deutlich breiter
   als der Inhalt") - identischer Grund wie spaeter bei draftrights.php (siehe dortiger Kommentar
   bei #content.drr-page fuer die volle Herleitung): #content ist ein Flex-Item von .layoutBoundary
   mit computed flex-basis:0px (vermutlich flex:1 aus style-7.css) - der Flex-Algorithmus bestimmt
   dann die Hauptachsen-Groesse, width greift gar nicht erst. Fix: flex:0 0 auto zuruecksetzen,
   danach schrumpft width:fit-content wie erwartet auf das breiteste Kindelement (i.d.R. die
   Tabelle). max-width:min(1360px,100%) verhindert Overflow auf schmalen Screens trotzdem. */
#content.dpp-page { flex: 0 0 auto !important; width: fit-content !important; max-width: min(1360px, 100%); margin: 0 auto; background: #ffffff; }
.dpp-content { padding: 18px 24px 28px; box-sizing: border-box; }

.dpp-header { margin-bottom: 14px; }
.dpp-h2 { font-size: 12.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50 !important; text-shadow: none !important; margin: 0 0 4px; }
.dpp-sub { font-size: 12px; color: #66707c !important; text-shadow: none !important; margin: 0; }

.dpp-navlocal { display: flex; align-items: center; }
.dpp-select { font-family: inherit; font-size: 12px; font-weight: 600; padding: 6px 10px; border-radius: 14px; border: 1px solid rgba(255,255,255,.35); background: rgba(255,255,255,.08); color: #fff; }
.dpp-select:hover { border-color: rgba(255,255,255,.6); }
.dpp-select option { color: #1b2733; background: #fff; }

/* Schmalere Tabelle statt volle Breite (User-Korrektur 2026-08-11: "spalten bzw die gesamte tabelle
   schmaler") - weder width:auto, display:inline-table noch width:fit-content auf der Tabelle selbst
   haben hier tatsaechlich geschrumpft (live getestet: Inhalt pro Zelle winzig - max. 3 Zeichen -,
   Spalten trotzdem 280px+ breit, exakt Containerbreite in allen 3 Varianten identisch; automatisches
   Table-Layout darf laut Spez. bei width:auto/table-layout:auto auf "das Groessere aus Containing-
   Block-Breite und GRIDmin" auffuellen, unabhaengig vom width-Keyword auf dem <table> selbst). Der
   zuverlaessige Fix: die Tabelle in einen Flex-Container packen - Flex-Items schrumpfen per Default
   (flex-grow:0) auf ihre Content-Groesse, das umgeht die tabellenspezifische Breitenberechnung
   komplett. justify-content:center zentriert, overflow-x:auto bleibt fuer sehr schmale Screens. */
.dpp-table-scroll { display: flex; justify-content: center; overflow-x: auto; }
table.dpp-table { flex: 0 0 auto; border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; }
.dpp-table thead th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 7px 8px; white-space: nowrap; }
.dpp-table thead th.left { text-align: left; padding-left: 12px; }
.dpp-table thead th.sticky-col { background: #2c3e50; z-index: 2; }
.dpp-table tbody td { padding: 6px 8px; text-align: center; border-bottom: 1px solid #e2e4e7; vertical-align: middle; }
.dpp-table tbody td.left { text-align: left; padding-left: 12px; }
.dpp-table tbody tr:nth-child(odd) { background: #fff; }
.dpp-table tbody tr:nth-child(even) { background: #f5f6f8; }
.dpp-table tbody tr:hover { background: #eaf1f8; }

.dpp-table td.sticky-col, .dpp-table th.sticky-col { position: sticky; left: 0; z-index: 1; background: inherit; box-shadow: 2px 0 4px rgba(0,0,0,.06); }
.dpp-table th.dpp-team-col, .dpp-table td.dpp-team-col { width: 1%; white-space: nowrap; }

.dpp-team-chip {
	display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .01em;
	padding: 4px 12px; border-radius: 999px; white-space: nowrap; text-decoration: none;
}
.dpp-team-chip:hover { filter: brightness(1.08); }

.dpp-pos { color: #66707c; font-weight: 600; font-size: 11px; }
.dpp-empty-cell { color: #a9b0b8; font-style: italic; }

/* Lottery-Schutzregel bei "Besitzer 1st": farbiger Punkt statt eingefaerbtem Text (User-Wunsch
   2026-08-11, analog zu roster.php's roster_tradeblock_dot() - Punkt wird direkt inline per
   dpp_owner_dot() gerendert, keine eigene Klasse noetig, siehe dortiger PHP-Kommentar). */

/* Teamvalue: fett hervorgehoben, wenn der Wert fest in draftpicks.teamvalue steht (kein per Formel
   geschaetzter Fallback) - User-Wunsch 2026-08-11. Geschaetzte Werte bleiben unauffaellig normal
   (kein Kursiv mehr, User-Korrektur 2026-08-11 - "das braucht es nicht"). */
.dpp-teamvalue-fixed { font-weight: 800; color: #1b2733; }

/* Eigene Box statt nur einer gestrichelten oberen Trennlinie, zentriert (User-Korrektur 2026-08-11). */
/* Fest 2-spaltiges Grid statt Flex-Wrap (User-Wunsch 2026-08-11: "Legende 3-zeilig, damit die
   Box insgesamt viel kleiner ist") - bei 5 Eintraegen ergibt das exakt 3 Zeilen (2+2+1) und die
   Box-Breite richtet sich nach der Legende statt nach einer einzeiligen Vollbreite. */
.dpp-legend { display: grid; grid-template-columns: repeat(2, auto); justify-content: center; gap: 6px 18px; width: fit-content; max-width: 100%; margin: 16px auto 0; padding: 12px 16px; background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 6px; font-size: 11.5px; color: #4a5a6b; }
.dpp-legend span:last-child { grid-column: 1 / -1; justify-self: center; }
.dpp-legend .sw { width: 9px; height: 9px; border-radius: 50%; display: inline-block; vertical-align: 0; margin-right: 5px; }
.dpp-legend b { color: #1b2733; }

/* Kein Kartenlayout-Breakpoint auf Mobile (User-Korrektur 2026-08-11: "auf mobile view bitte keine
   karten") - .dpp-table-scroll (overflow-x:auto) uebernimmt schmale Screens per horizontalem
   Scroll, die sticky-col-Team-Spalte bleibt dabei sichtbar. Identisches Prinzip wie
   cgm-/csp-table-scroll (siehe deren Kommentare). Die data-label-Attribute in draftpicks.php sind
   dadurch ungenutzt, aber harmlos - dort belassen fuer den Fall einer spaeteren Kurskorrektur. */

/* Kein Kartenlayout-Breakpoint mehr (User-Wunsch 2026-08-11: "im mobile view bitte im
   Tabellenformat bleiben, nicht auf das Kartenformat wechseln") - .csp-table-scroll oben
   (overflow-x:auto) uebernimmt die schmalen Screens stattdessen per horizontalem Scroll, die
   sticky-col-Team-Spalte bleibt dabei sichtbar. */

/* ===================== statshub.php: All-Time Leader + Rekorde tabs ("sh-" prefix, added 2026-08-11) =====================
   Ersetzt 7 Alt-Seiten (alltimeleader.php, alltimeteamleader.php, alltimeleader_franchise.php,
   alltimeleader_gm.php, alltimeleader_player_gm.php, alltimeleader_teams.php, records.php) durch
   2 neue Tabs auf statshub.php. Nur die hier NEU hinzugekommenen Klassen - die schon bestehenden
   sh-table/sh-filters/sh-select/sh-seg/sh-teampill/sh-rank/sh-playerpic/sh-name-link-Klassen bleiben
   unveraendert inline in statshub.php und werden hier einfach mitbenutzt (siehe Migrationsmanifest
   oben). Approved Mockup: siehe Chat-Verlauf 2026-08-11 (statshub_leaders_records_mockup.html). */

.sh-section { margin-bottom: 30px; }
/* siehe docs/design-system.md §8 ("White text with a shadow on white card backgrounds") - style-7.css
   stylt h2 global weiss-mit-schatten, auf der weissen sh-Content-Box unsichtbar ohne diesen Override. */
.sh-h2 { font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: #2c3e50 !important; text-shadow: none !important; margin: 0 0 12px; }

.sh-leadergrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.sh-leadercard { border: 1px solid #e2e4e7; border-radius: 8px; overflow: hidden; }
.sh-leadercard-head { background: #2c3e50; color: #fff; padding: 9px 14px; display: flex; align-items: baseline; justify-content: space-between; }
.sh-leadercard-head .stat { font-size: 12.5px; font-weight: 800; letter-spacing: .02em; }
.sh-leadercard-head .scope { font-size: 10px; color: #b7c2cc; text-transform: uppercase; letter-spacing: .04em; }
.sh-leaderrow { display: flex; align-items: center; gap: 9px; padding: 7px 14px; border-bottom: 1px solid #eef1f4; }
.sh-leaderrow:last-of-type { border-bottom: none; }
.sh-leaderrow:nth-child(odd) { background: #fff; }
.sh-leaderrow:nth-child(even) { background: #fafbfc; }
.sh-leaderrow.sh-goldrow:hover, .sh-leaderrow:hover { background: #eaf1f8; }
.sh-leaderrow .sh-lval { flex: 0 0 auto; font-weight: 800; font-size: 12.5px; color: #1b2733; font-variant-numeric: tabular-nums; }
.sh-leadercard-foot { padding: 8px 14px; text-align: right; background: #f4f6f8; border-top: 1px solid #e2e4e7; }
.sh-leadercard-foot a { font-size: 10.5px; font-weight: 700; color: #2c3e50; text-decoration: none; }
.sh-leadercard-foot a:hover { text-decoration: underline; }

/* Wiederverwendbare "Gold-Rekord"-Zeile fuer Rang 1 - identischer Ton wie das bestehende 3-Tier
   Record-Highlighting in der epp- Familie (docs/design-system.md §1), hier erstmals als Tabellen-
   /Kartenzeile statt Einzelzelle. Auf Leaderkarten-Zeilen UND sh-table-Zeilen anwendbar. */
.sh-goldrow { background: #fdf3c7 !important; }
.sh-goldrow td, .sh-goldrow .sh-lval { color: #7a5d00; font-weight: 800; }

.sh-legend { display: flex; gap: 16px; align-items: center; margin-top: 10px; font-size: 10.5px; color: #8b95a1; flex-wrap: wrap; }
.sh-legend .sw { width: 11px; height: 11px; border-radius: 3px; display: inline-block; vertical-align: -2px; margin-right: 4px; border: 1px solid #dde1e6; }

/* Der Bestenlisten-"Baukasten" (ersetzt die 6 alltimeleader*-Altseiten): Ansicht/Bereich/Zeitraum/
   Modus/Saisontyp/Kategorie sind alle sh-seg/sh-select wie ueberall sonst auf der Seite - keine neue
   Interaktionslogik, nur mehr Filterreihen als sonst ueblich. */
.sh-builder-row + .sh-builder-row { margin-top: 8px; }

/* Rekorde-Tab (ersetzt records.php): Rekordwert verlinkt zum Boxscore des Spiels. */
.sh-val-link { color: #2c3e50; font-weight: 800; text-decoration: underline; }
.sh-season-badge { font-size: 10.5px; color: #66707c; font-weight: 600; white-space: nowrap; }

/* Kompakte Tabellenvariante fuer All-Time-Leader-Baukasten + Rekorde (5-6 Spalten statt der ~35 der
   Spieler-/Team-Stats-Tabellen) - das bestehende inline `table.sh-table { min-width:1600px }` in
   statshub.php ist fuer die grossen Tabellen gedacht; ohne diesen Override erbten die schmalen neuen
   Tabellen dieselbe Mindestbreite und blaehten sich unnoetig auf volle 1600px auf (User-Bericht
   2026-08-11: "GM"-Spalte wurde dadurch ueber 600px breit, Rest lief rechts aus dem sichtbaren
   Bereich). Zwei Klassen auf dem Selektor (`table.sh-table.sh-table-compact`) reichen fuer die
   hoehere Spezifitaet gegenueber der Inline-Regel, das !important zusaetzlich zur Sicherheit -
   dieselbe Absicherung wie sonst in dieser Datei ueblich. Zentriert (margin:auto) statt linksbuendig,
   Zellenpolsterung ca. 20% ueber der Basis-.sh-table-Regel (User-Wunsch 2026-08-11: erster Wurf war
   zu eng). */
table.sh-table.sh-table-compact { min-width: 0 !important; width: auto !important; max-width: 100%; margin: 0 auto; font-size: 13.5px; }
table.sh-table.sh-table-compact thead th { padding: 10px 9px; }
table.sh-table.sh-table-compact tbody td { padding: 9px 9px; }
table.sh-table.sh-table-compact thead th.left { padding-left: 17px; }
table.sh-table.sh-table-compact tbody td.left { padding-left: 17px; }

/* Dezentes Feedback waehrend #sh-alltime-app per fetch() aktualisiert (User-Wunsch 2026-08-11: kein
   Seiten-Reload beim Umschalten mehr) - kein Spinner, nur leicht abgedunkelt + Klicks blockiert,
   damit ein zweiter Klick waehrend eines laufenden Requests nicht zwei Anfragen ueberlappen laesst. */
.sh-loading { opacity: .55; pointer-events: none; transition: opacity .1s; }

@media (max-width: 900px) {
	.sh-leadergrid { grid-template-columns: 1fr; }
}

/* ===================== draftrights.php ("drr-" prefix, added 2026-08-11) =====================
   Liste offener Draftrechte. Saison-Auswahl neu (User-Wunsch), Namenssuche entfernt (User-Wunsch
   "brauche keine suche nach spielername"), Team-Spalte als Chip (User-Wunsch) statt eingefaerbter
   Zelle. Positionierung per drrSyncNavLocalPadding() - siehe docs/design-system.md §4 "Nav-local
   control horizontal alignment". Tabelle nutzt von Anfang an den Flex-Shrink-Trick aus
   draftpicks.php (siehe dortiger Kommentar bei .dpp-table-scroll fuer die volle Herleitung, warum
   width:auto/fit-content/inline-table hier NICHT zuverlaessig schrumpfen) statt erst nachtraeglich
   korrigiert werden zu muessen. Kein Kartenlayout-Breakpoint auf Mobile (identische Linie wie
   cgm-/csp-/dpp-table-scroll: overflow-x:auto uebernimmt schmale Screens). */
/* Inhaltsbox schrumpft auf Inhaltsbreite statt volle 1360px (User-Korrektur 2026-08-11: "die
   inhaltsbox deutlich schmaler ... nur etwas groesser als der inhalt selbst"). Der eigentliche
   Grund, warum selbst width:fit-content!important + ID-Spezifitaet nichts brachte (live getestet,
   blieb bei 1080px): #content ist selbst ein Flex-Item von .layoutBoundary mit computed
   flex-basis:0px (vermutlich flex:1 aus style-7.css) - bei explizitem flex-basis/flex-grow
   bestimmt der Flex-Algorithmus die Hauptachsen-Groesse, nicht die width-Eigenschaft. Fix: die
   Flex-Eigenschaften selbst zuruecksetzen (flex:0 0 auto), danach greift width:fit-content wie
   erwartet. */
#content.drr-page { flex: 0 0 auto !important; width: fit-content !important; max-width: 1360px; margin: 0 auto; background: #ffffff; }
.drr-content { padding: 18px 24px 28px; box-sizing: border-box; }

.drr-header { margin-bottom: 14px; }
.drr-h2 { font-size: 12.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50 !important; text-shadow: none !important; margin: 0; }

.drr-navlocal { display: flex; align-items: center; }
.drr-select { font-family: inherit; font-size: 12px; font-weight: 600; padding: 6px 10px; border-radius: 14px; border: 1px solid rgba(255,255,255,.35); background: rgba(255,255,255,.08); color: #fff; }
.drr-select:hover { border-color: rgba(255,255,255,.6); }
.drr-select option { color: #1b2733; background: #fff; }

.drr-table-scroll { display: flex; justify-content: center; overflow-x: auto; }
table.drr-table { flex: 0 0 auto; border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; }
.drr-table thead th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 7px 12px; white-space: nowrap; }
.drr-table thead th.left { text-align: left; padding-left: 12px; }
.drr-table tbody td { padding: 6px 12px; text-align: center; border-bottom: 1px solid #e2e4e7; vertical-align: middle; }
.drr-table tbody td.left { text-align: left; }
.drr-table tbody tr:nth-child(odd) { background: #fff; }
.drr-table tbody tr:nth-child(even) { background: #f5f6f8; }
.drr-table tbody tr:hover { background: #eaf1f8; }

.drr-player-cell { display: flex; align-items: center; gap: 8px; white-space: nowrap; }
.drr-playerpic { width: 28px; height: 28px; border-radius: 4px; object-fit: cover; flex-shrink: 0; }

.drr-team-chip {
	display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .01em;
	padding: 4px 12px; border-radius: 999px; white-space: nowrap; text-decoration: none;
}
.drr-team-chip:hover { filter: brightness(1.08); }

.drr-empty-cell { color: #a9b0b8; font-style: italic; }

/* ===================== drafthistory.php ("dht-" prefix, added 2026-08-11) =====================
   Draft-Historie einer gewaehlten Saison. 1:1 Struktur-Vorlage von draftrights.php (siehe dortiger
   Kommentar) - Saison-Dropdown im Nav-local-Muster, Team-Chip (hier mit historischen statt
   aktuellen Teamfarben, da ein Team seit dem Draft umbenannt/umgefaerbt worden sein kann),
   Flex-Shrink-Trick fuer die Tabelle. #content-Flex-Fix (flex:0 0 auto + width:fit-content) direkt
   von Anfang an gesetzt statt wie bei .dpp-page/.drr-page erst nachtraeglich noetig zu werden -
   Grund: #content ist ein Flex-Item von .layoutBoundary mit computed flex-basis:0px, width allein
   greift da nicht. */
#content.dht-page { flex: 0 0 auto !important; width: fit-content !important; max-width: min(1360px, 100%); margin: 0 auto; background: #ffffff; }
.dht-content { padding: 18px 24px 28px; box-sizing: border-box; }

.dht-header { margin-bottom: 14px; }
.dht-h2 { font-size: 12.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50 !important; text-shadow: none !important; margin: 0; }

.dht-navlocal { display: flex; align-items: center; }
.dht-select { font-family: inherit; font-size: 12px; font-weight: 600; padding: 6px 10px; border-radius: 14px; border: 1px solid rgba(255,255,255,.35); background: rgba(255,255,255,.08); color: #fff; }
.dht-select:hover { border-color: rgba(255,255,255,.6); }
.dht-select option { color: #1b2733; background: #fff; }

.dht-table-scroll { display: flex; justify-content: center; overflow-x: auto; }
table.dht-table { flex: 0 0 auto; border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; }
.dht-table thead th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 7px 12px; white-space: nowrap; }
.dht-table thead th.left { text-align: left; padding-left: 12px; }
.dht-table tbody td { padding: 6px 12px; text-align: center; border-bottom: 1px solid #e2e4e7; vertical-align: middle; }
.dht-table tbody td.left { text-align: left; }
.dht-table tbody tr:nth-child(odd) { background: #fff; }
.dht-table tbody tr:nth-child(even) { background: #f5f6f8; }
.dht-table tbody tr:hover { background: #eaf1f8; }

/* Gestrichelte Trennlinie zwischen Runden (User-Wunsch 2026-08-11) - border-top statt eines
   eigenen Trennzeilen-<tr>, damit die Zebra-Streifen/Hover-Zustaende der echten Datenzeilen
   unangetastet bleiben. */
.dht-table tbody tr.dht-round-break td { border-top: 2px dashed #8a97a6; }

.dht-player-cell { display: flex; align-items: center; gap: 8px; white-space: nowrap; }
.dht-playerpic { width: 28px; height: 28px; border-radius: 4px; object-fit: cover; flex-shrink: 0; }
.dht-player-link { color: #2c3e50; font-weight: 600; text-decoration: underline; }
.dht-player-link:hover { color: #1a2733; }

.dht-team-chip {
	display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .01em;
	padding: 4px 12px; border-radius: 999px; white-space: nowrap; text-decoration: none;
}
.dht-team-chip:hover { filter: brightness(1.08); }

.dht-empty-cell { color: #a9b0b8; font-style: italic; }

/* ===================== schedule.php ("sch-" prefix, added 2026-08-11) =====================
   Nur die Nav-local-Kontrollen (Saison-Auswahl + Bearbeiten-Umschalter) wurden ins Design-System
   verschoben (User-Wunsch: "passt soweit, fuege mir nur die Saisonauswahl und den Bearbeiten
   Button in der Navleiste ein") - der Rest der Seite (Formular/Ansicht) bleibt bewusst die alte
   "terminplan-"-Optik in schedule.php's eigenem <style>-Block, kein Gesamt-Redesign angefragt.
   sch-select identisch zu dpp-/drr-/dht-select. Der Bearbeiten-Button nutzt bewusst nav.php's
   eigene mainnav-link-item/mainnav-selection-Klassen statt einer neuen Button-Optik (identisches
   Muster wie roster.php's .rh-export-btn, siehe docs/CLAUDE.md "Page-local nav controls"). */
.sch-navlocal { display: flex; align-items: center; gap: 4px; }
/* Bearbeiten-Button rechtsbuendig zum Inhalt (User-Wunsch 2026-08-11) - kein margin-left:auto +
   erzwungenes width auf .sch-navlocal (erster Versuch, zurueckgerollt: liess <select> als Flex-Item
   von .mainnav-header unter seine Inhaltsbreite schrumpfen, siehe Kommentar bei
   schSyncNavLocalPadding() in schedule.php). Stattdessen setzt genau diese JS-Funktion ein
   explizites Pixel-margin-left direkt auf .sch-edit-link - hier keine CSS-Regel dafuer noetig. */
.sch-select { font-family: inherit; font-size: 12px; font-weight: 600; padding: 6px 10px; border-radius: 14px; border: 1px solid rgba(255,255,255,.35); background: rgba(255,255,255,.08); color: #fff; }
.sch-select:hover { border-color: rgba(255,255,255,.6); }
/* Nur color, kein background auf .sch-select option (Abweichung vom sonstigen dpp-/drr-/dht-select-
   Muster) - User-Beobachtung 2026-08-11: bei dieser Seite (43 Saisons, deutlich mehr Optionen als
   die anderen -select-Dropdowns) blieb das Dropdown ab Saison ~11 leer (Zeilen ohne Text
   sichtbar). Bekannter Chromium-Bug: <option> mit explizit gesetztem UND background UND color
   wechselt in einen eigenen, selbst gezeichneten Popup-Renderer, der bei langen Listen eine
   Virtualisierungs-Luecke hat (Zeilen werden angelegt, Text bleibt aber leer). Nur color setzen
   reicht hier aus (verhindert das von der Elternfarbe #fff geerbte weisse-auf-weiss), background
   ist ohnehin bereits Browser-Standard-Weiss und war nur redundant gesetzt. */
.sch-select option { color: #1b2733; }

/* ===================== rh-pill (roster.php + inc_trade_tradeblock.php, moved here 2026-08-11) =====================
   Contract-status pill used on both roster.php's own tables AND trade.php's tradeblock (via
   inc_trade_tradeblock.php's include) — was byte-for-byte duplicated inline in both places before
   this move. .bonus/.maxext/.rh-pill-btn/.rh-pill-static are only used by roster.php today but kept
   here too since the base .rh-pill they extend is shared. inc_trade_tradeblock.php's own inline copy
   was left in place (harmless exact duplicate, not worth touching in this pass). */
.rh-pill { display: inline-block; font-size: 10px; padding: 1px 6px; border-radius: 8px; background: #f1eee8; color: #5f5e5a; border: 1px solid #c8c4b9; white-space: nowrap; }
.rh-pill.bird { background: #e7f2ff; color: #0c447c; border-color: #85b7eb; }
.rh-pill.rfa { background: #fde7ee; color: #8a1a3c; border-color: #e0a0bb; }
.rh-pill.bonus { background: #faeeda; color: #854f0b; border-color: #ef9f27; }
.rh-pill.bird-lost { background: #eef1f5; color: #4a5a6b; border-color: #b7c3d1; }
.rh-pill.bird-vorsaison { background: #e1f6f3; color: #0d6d61; border-color: #79cec1; }
.rh-pill.teamoption { background: #f0e8fb; color: #5a2a92; border-color: #c6a3ec; }
.rh-pill.rookiescale { background: #e6f6e9; color: #1d7a30; border-color: #9bd6a6; }
.rh-pill.draftrechte { background: #f7ecd9; color: #7a4e12; border-color: #dcb679; }
.rh-pill.getradet { background: #eceef1; color: #3d4952; border-color: #b7c0c8; }
.rh-pill.nomax { background: #fbe9dd; color: #96401a; border-color: #e8ab7c; }
.rh-pill.tradesperre { background: #fbe0df; color: #a41f19; border-color: #e79a95; }
.rh-pill.maxext { background: #fdf3c7; color: #7a5d00; border-color: #ecd27a; }
.rh-pill-btn { cursor: pointer; border-bottom: 1px dashed currentColor; background: none; padding: 1px 6px; font: inherit; }
.rh-pill-btn.rh-pill { border-style: solid; border-bottom-style: dashed; }
.rh-pill-static { opacity: .7; }

/* ===================== gmform-login-box (shared login box, moved here 2026-08-11) =====================
   Duplicated verbatim inline across 17+ pages (admin_*, dyneplus.php, schedule.php, trade.php,
   freeagents.php, gamestats.php, database_edit.php, roster_edit.php, currentgm_edit.php,
   playoff_seeding.php, transactions.php, awards_edit.php, index.php, inc_trade_detail.php,
   inc_trade_search.php, self_password_widget.php, admin_auth.php) — confirmed byte-identical
   before moving here. NOT moving .gmform-msg-error/.gmform-msg-success here too — those have
   quietly diverged into a "plain" variant (older pages) and an "enhanced #content-scoped
   !important" variant (redesigned pages) across the same set of files; consolidating them needs
   its own dedicated pass, not a guess made in passing. Each page's own duplicate .gmform-login-box
   copy was left in place where not otherwise touched this session (harmless exact duplicate) —
   only removed from pages actively being cleaned up (trade.php as of 2026-08-11). */
.gmform-login-box { background-color: #ffffff; padding: 20px; width: 340px; border: 1px solid #000; box-sizing: border-box; }
.gmform-login-box table { width: 100%; }
.gmform-login-box input[type=text], .gmform-login-box input[type=password] { width: 100%; box-sizing: border-box; padding: 4px; }

/* ===================== trp-teampill (shared, moved here 2026-08-11) =====================
   Team-colored pill, identical spec to .epp-teampill/.fab-teampill (docs/design-system.md
   "Team-colored pill"). Originally trade.php-only (css/trade.css), moved here after finding
   transactions.php reuses the exact same class via trp_team_pill() (inc_trade_functions.php) -
   confirmed byte-identical before moving. */
.trp-teampill { display: inline-block; width: 42px; box-sizing: border-box; text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 9px; letter-spacing: .02em; }

/* ===================== database_edit.php ("dbe-" prefix, added 2026-08-15) =====================
   First redesign of this page (previously plain unstyled HTML tables/forms, .gmform-* classes).
   User-Wunsche: Speichern-Button(e) liegen rechtsbuendig in der Nav-Leiste statt unten im Content
   (wie roster.php); Suche im List-Mode filtert live ohne Klick/Reload (Ajax, siehe database_edit.php
   selbst); beim einzeln Eintragen (Spieler + GM) sitzt je EINE Checkbox pro Spalte in der
   Tabellen-Kopfzeile (nicht mehr pro Zeile), die deselektierte Spalte wird ausgegraut. Reines
   Verwaltungswerkzeug (kein sh-/epp-Sonderfall) - Tabellen bleiben deshalb per overflow-x:auto
   scrollbar statt in ein Mobile-Kartenlayout zu kollabieren (analog cgm-table-scroll oben). Keine
   <h1>/<h2>/<h3>/<p>-Tags verwendet (div/span stattdessen) - vermeidet die in docs/design-system.md
   §8 dokumentierte white-on-white-Falle (style-7.css) komplett, statt sie per !important zu flicken. */
.dbe-page { max-width: 1360px; margin: 0 auto; padding: 20px 24px 40px; box-sizing: border-box; }
.dbe-crumb { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; font-weight: 700; color: #66707c; margin: 0 0 4px; }
.dbe-h1 { font-size: 20px; font-weight: 800; color: #1b2733; margin: 0 0 16px; }
.dbe-msg-success, .dbe-msg-error { font-size: 13px; font-weight: 600; border-radius: 6px; padding: 9px 13px; margin-bottom: 10px; }
.dbe-msg-success { background: #e8f8ec; color: #1a7a1a; border: 1px solid #b7e6c3; }
.dbe-msg-error { background: #fdeceb; color: #b00000; border: 1px solid #f0b8b2; }

/* ---- Nav-lokale Controls (Ansicht-/Modus-Tabs, Suche, Speichern) ---- */
.dbe-navtabs { display: flex; background: #1a2733; border-radius: 6px; padding: 3px; gap: 2px; flex: 0 0 auto; }
.dbe-navtab { border: none; background: transparent; color: #c9d2da; font: inherit; font-size: 12px; font-weight: 600; padding: 6px 13px; border-radius: 4px; cursor: pointer; white-space: nowrap; text-decoration: none; display: inline-block; }
.dbe-navtab.active { background: #2c3e50; color: #fff; font-weight: 700; }
.dbe-navtab:hover:not(.active) { color: #fff; }
.dbe-nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dbe-search-wrap { position: relative; }
.dbe-search-wrap input { font: inherit; font-size: 12.5px; border: 1px solid #3d5266; background: #1f2f3d; color: #fff; border-radius: 5px; padding: 6px 26px 6px 28px; width: 190px; outline: none; }
.dbe-search-wrap input::placeholder { color: #8fa0b0; }
.dbe-search-wrap input:focus { border-color: #6f95b8; }
.dbe-search-wrap svg { position: absolute; left: 8px; top: 50%; transform: translateY(-50%); width: 13px; height: 13px; fill: #8fa0b0; pointer-events: none; }
.dbe-search-spin { position: absolute; right: 7px; top: 50%; transform: translateY(-50%); width: 11px; height: 11px; border: 2px solid #8fa0b0; border-top-color: #fff; border-radius: 50%; opacity: 0; transition: opacity .15s; }
.dbe-search-spin.active { opacity: 1; animation: dbe-spin .6s linear infinite; }
@keyframes dbe-spin { to { transform: translateY(-50%) rotate(360deg); } }
.dbe-navbtn { font: inherit; font-size: 12px; font-weight: 700; border-radius: 5px; padding: 7px 14px; cursor: pointer; border: 1px solid transparent; white-space: nowrap; display: inline-flex; align-items: center; gap: 5px; }
.dbe-navbtn.primary { background: #fff; color: #2c3e50; }
.dbe-navbtn.primary:hover { background: #e7ecf1; }
.dbe-navbtn.ghost { background: transparent; color: #fff; border-color: #4d6377; }
.dbe-navbtn.ghost:hover { background: #1f2f3d; }
.dbe-navbtn-sub { opacity: .65; font-weight: 600; }
.dbe-iconbtn { width: 30px; height: 30px; display: inline-flex; align-items: center; justify-content: center; border-radius: 5px; border: 1px solid #4d6377; background: transparent; cursor: pointer; text-decoration: none; }
.dbe-iconbtn:hover { background: #1f2f3d; }
.dbe-iconbtn svg { width: 15px; height: 15px; fill: #fff; }

/* ---- List-Mode: Tabelle ---- */
.dbe-table-scroll { overflow-x: auto; border-radius: 6px; border: 1px solid #e2e4e7; }
.dbe-table { width: 100%; border-collapse: collapse; background: #fff; font-size: 12px; }
.dbe-table thead th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 9px 10px; white-space: nowrap; }
.dbe-table thead th.left { text-align: left; }
.dbe-table td { padding: 7px 10px; border-bottom: 1px solid #e2e4e7; text-align: center; white-space: nowrap; }
.dbe-table td.left { text-align: left; }
.dbe-table tbody tr:nth-child(even) { background: #f5f6f8; }
.dbe-table tbody tr:hover { background: #eaf1f8; }
.dbe-table tr.dbe-row-editing { background: #fffceb !important; }
.dbe-table td.sticky-col, .dbe-table th.sticky-col { position: sticky; left: 0; z-index: 1; background: inherit; box-shadow: 2px 0 4px rgba(0,0,0,.06); text-align: left; }
.dbe-table thead th.sticky-col { background: #2c3e50; z-index: 2; }
.dbe-table td input[type=text] { font: inherit; font-size: 12px; width: 100%; min-width: 64px; border: 1px solid #ccd3da; border-radius: 4px; padding: 4px 6px; box-sizing: border-box; }
.dbe-name-edit { display: flex; gap: 4px; }
.dbe-name-edit input { min-width: 70px; }
.dbe-pill { display: inline-block; font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 9px; background: #f1eee8; color: #5f5e5a; border: 1px solid #c8ccd1; letter-spacing: .02em; }
.dbe-actions { white-space: nowrap; }
.dbe-rowbtn { border: 1px solid #2c3e50; background: #fff; color: #2c3e50; font: inherit; font-size: 11px; font-weight: 700; border-radius: 4px; padding: 4px 9px; cursor: pointer; }
.dbe-rowbtn:hover { background: #eef1f4; }
.dbe-rowbtn:disabled { opacity: .4; cursor: default; }
.dbe-rowbtn.del { border-color: #e79a95; color: #b00000; }
.dbe-rowbtn.del:hover { background: #fdeceb; }
.dbe-empty { padding: 26px; text-align: center; color: #8b95a1; font-size: 13px; }
.dbe-pagination { display: flex; align-items: center; gap: 10px; margin-top: 14px; font-size: 12.5px; color: #66707c; }
.dbe-pagination select { font: inherit; font-size: 12.5px; border: 1px solid #ccd3da; border-radius: 4px; padding: 3px 6px; }
.dbe-pagination button { font: inherit; font-size: 12px; font-weight: 700; border: 1px solid #2c3e50; color: #2c3e50; background: #fff; border-radius: 4px; padding: 5px 11px; cursor: pointer; }

/* ---- New-Mode: Panels (Paste-Import + einzeln eintragen) ---- */
.dbe-panels { display: flex; flex-direction: column; gap: 18px; }
.dbe-panel { background: #fff; border: 1px solid #dde1e6; border-radius: 8px; padding: 18px 20px; }
.dbe-panel-title { font-size: 13px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50; margin: 0 0 10px; }
.dbe-help { background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 6px; padding: 10px 14px; font-size: 12.5px; color: #66707c; line-height: 1.55; margin-bottom: 14px; }
.dbe-help code { background: #fff; border: 1px solid #dde1e6; border-radius: 3px; padding: 1px 5px; color: #1b2733; }
.dbe-help-dot { display: inline-block; width: 14px; height: 14px; line-height: 14px; border-radius: 50%; background: #fff; color: #2c3e50; font-size: 10px; font-weight: 700; text-align: center; cursor: help; }
.dbe-chiprow { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; align-items: center; }
.dbe-chip { display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px; font-weight: 600; border: 1px solid #ccd3da; border-radius: 14px; padding: 5px 11px 5px 8px; cursor: pointer; background: #fff; color: #66707c; user-select: none; }
.dbe-chip input { accent-color: #2c3e50; }
.dbe-chip.on { background: #2c3e50; border-color: #2c3e50; color: #fff; }
.dbe-chip-actions { margin-left: auto; display: flex; gap: 6px; }
.dbe-linkbtn { font-size: 11.5px; font-weight: 700; color: #2c3e50; background: none; border: none; cursor: pointer; text-decoration: underline; padding: 4px; }
.dbe-paste { width: 100%; box-sizing: border-box; font-family: "SFMono-Regular", Consolas, monospace; font-size: 12.5px; border: 1px solid #ccd3da; border-radius: 6px; padding: 10px 12px; resize: vertical; }
.dbe-filerow { margin-top: 10px; font-size: 12.5px; color: #66707c; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.dbe-filerow input[type=file] { font: inherit; font-size: 12px; }

.dbe-rowtable-scroll { overflow-x: auto; }
.dbe-rowtable { border-collapse: collapse; width: 100%; min-width: 880px; }
.dbe-rowtable th { background: #1a2733; color: #fff; font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 700; padding: 7px 8px; text-align: left; }
.dbe-rowtable td { padding: 6px 8px; border-bottom: 1px solid #e2e4e7; vertical-align: top; }
.dbe-rowtable tbody tr:nth-child(even) { background: #f5f6f8; }
.dbe-th-check { display: flex; align-items: center; gap: 5px; cursor: pointer; white-space: nowrap; }
.dbe-th-check input { accent-color: #fff; width: 11px; height: 11px; cursor: pointer; }
.dbe-rowtable input[type=text] { font: inherit; font-size: 12px; width: 100%; min-width: 78px; border: 1px solid #ccd3da; border-radius: 4px; padding: 4px 6px; box-sizing: border-box; }
.dbe-rowtable input[type=text]:disabled { background: #f2f3f5; color: #b3b9c1; }
.dbe-rowtable td.rm { text-align: center; }
.dbe-remove { color: #b00000; cursor: pointer; font-weight: 700; font-size: 15px; }
.dbe-addrow { margin-top: 10px; display: inline-block; }
.dbe-note { font-size: 11.5px; color: #66707c; margin-top: 10px; max-width: 760px; line-height: 1.5; }

@media (max-width: 767px) {
	.dbe-nav-right { width: 100%; }
	.dbe-search-wrap { flex: 1 1 auto; }
	.dbe-search-wrap input { width: 100%; box-sizing: border-box; }
}

/* ===================== handbuch.php ("hdb-" prefix, added 2026-08-15) =====================
   Nutzer-Handbuch: listet jede Nicht-Admin-Seite mit ihren Funktionen auf, gruppiert wie die
   3 Hauptnav-Kategorien (Team Management/Stats Center/History). Reines Text-/Referenz-Layout,
   keine Tabellen -> keine sticky-col-Technik noetig. Wie dbe- (siehe oben) bewusst KEINE
   h1-h4/p-Tags innerhalb von .hdb-page (div/span stattdessen), um den White-on-white-Bug aus
   §8 des Design-System-Dokuments von vornherein zu vermeiden statt ihn per !important zu
   uebersteuern. Tag-Farben (.hdb-tag.*) sind bewusst dieselben 4 Hex-Paare wie andernorts
   (.rh-pill.rookiescale/.bonus/.getradet/.bird) - keine neuen Farben erfunden, nur eine neue,
   seiteneigene Klasse mit denselben Werten (gleiches Muster wie .fap-pill/.plp-pill ggue.
   .rh-pill: gleiche Werte, eigener Klassenname pro Seite). */
.hdb-page { max-width: 1360px; margin: 0 auto; background: #ffffff; }
.hdb-content { padding: 18px 24px 28px; }

.hdb-eyebrow { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; color: #66707c; }
.hdb-title { font-size: 24px; font-weight: 800; line-height: 1.15; color: #1b2733; margin-top: 6px; }
.hdb-lede { font-size: 13px; color: #66707c; margin-top: 10px; max-width: 62ch; line-height: 1.55; }

.hdb-legend { display: flex; flex-wrap: wrap; gap: 8px 18px; align-items: center; margin-top: 18px; padding: 12px 16px; background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 6px; font-size: 11.5px; color: #4a5a6b; }
.hdb-legend .item { display: inline-flex; align-items: center; gap: 6px; }

.hdb-toolbar { display: flex; gap: 8px; margin-top: 16px; }
.hdb-btn { font-family: inherit; font-size: 11.5px; font-weight: 600; cursor: pointer; background: transparent; border: 1px solid #2c3e50; color: #2c3e50; border-radius: 5px; padding: 6px 12px; }
.hdb-btn:hover { background: #eef1f4; }

.hdb-category { margin-top: 34px; padding-top: 22px; border-top: 1px solid #e2e4e7; }
.hdb-category:first-of-type { margin-top: 26px; }
.hdb-h2 { font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: #2c3e50; display: flex; align-items: baseline; gap: 10px; }
.hdb-h2 .n { font-size: 10.5px; font-weight: 700; color: #a9b0b8; letter-spacing: .04em; }
.hdb-category-desc { font-size: 12.5px; color: #66707c; margin-top: 6px; max-width: 62ch; }

.hdb-entry { border: 1px solid #e2e4e7; border-radius: 6px; margin-top: 10px; background: #fff; }
.hdb-entry[open] { border-color: #ccd3da; }
.hdb-entry summary { list-style: none; cursor: pointer; padding: 12px 16px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.hdb-entry summary::-webkit-details-marker { display: none; }
.hdb-entry summary::before { content: "\25B8"; color: #8b95a1; font-size: 11px; transition: transform .15s ease; flex: 0 0 auto; }
.hdb-entry[open] summary::before { transform: rotate(90deg); }
.hdb-entry-title { font-size: 14.5px; font-weight: 700; color: #1b2733; }
.hdb-entry-tags { display: flex; gap: 5px; flex-wrap: wrap; margin-left: auto; }

.hdb-tag { display: inline-block; font-size: 10px; font-weight: 700; padding: 2px 8px; border-radius: 8px; border: 1px solid; white-space: nowrap; letter-spacing: .01em; }
.hdb-tag.own   { background: #e6f6e9; color: #1d7a30; border-color: #9bd6a6; }
.hdb-tag.phase { background: #faeeda; color: #854f0b; border-color: #ef9f27; }
.hdb-tag.read  { background: #eceef1; color: #3d4952; border-color: #b7c0c8; }
.hdb-tag.open  { background: #e7f2ff; color: #0c447c; border-color: #85b7eb; }

.hdb-entry-body { padding: 0 16px 18px 42px; }
.hdb-lead { font-size: 12.5px; color: #33424c; max-width: 66ch; line-height: 1.6; }

.hdb-sub { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: #2c3e50; margin-top: 16px; margin-bottom: 6px; }
.hdb-features, .hdb-steps { margin: 0; padding-left: 18px; max-width: 66ch; }
.hdb-features li, .hdb-steps li { font-size: 12.5px; color: #33424c; line-height: 1.55; margin-bottom: 6px; }
.hdb-features li b, .hdb-steps li b { color: #1b2733; }
.hdb-steps li::marker { font-weight: 700; color: #2c3e50; }

.hdb-note { font-size: 12px; color: #66707c; max-width: 66ch; margin-top: 10px; line-height: 1.55; }

.hdb-rulebox { margin-top: 14px; padding: 12px 16px; background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 6px; max-width: 68ch; }
.hdb-rulebox .lbl { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: #66707c; margin-bottom: 6px; }
.hdb-rulebox ul { margin: 0; padding-left: 18px; }
.hdb-rulebox li { font-size: 12px; color: #33424c; line-height: 1.55; margin-bottom: 5px; }

/* Nav-lokale Controls (Kategorie-Sprungmarken + Suche) — gleiches Muster wie .fap-navtabs/
   .fap-navtab: normale mainnav-link-item-Links, aktiver Tab bekommt die dunkle Nav-Panel-Farbe
   als Hintergrund statt eines eigenen Pill-Containers. */
.hdb-navlocal { display: flex; align-items: center; gap: 4px; flex: 1 1 auto; flex-wrap: wrap; box-sizing: border-box; }
.hdb-navtab.active { background-color: #1a2733; font-weight: 700; }
.hdb-searchwrap { margin-left: auto; }
.hdb-search { font-family: inherit; font-size: 12px; padding: 5px 9px; width: 168px; border: 1px solid #5c6b7a; border-radius: 4px; background: #34495e; color: #fff; }
.hdb-search::placeholder { color: #a9b0b8; }
.hdb-search:focus { outline: 2px solid #6fa8dc; outline-offset: 1px; }

@media (max-width: 767px) {
	.hdb-content { padding: 14px 16px 22px; }
	.hdb-entry-body { padding: 0 14px 16px 28px; }
	.hdb-entry-tags { margin-left: 0; flex-basis: 100%; }
	.hdb-searchwrap { margin-left: 0; }
	.hdb-search { width: 100%; }
}

/* ===================== index.php ("idx-" prefix, added 2026-08-15) =====================
   Dashboard redesign, replacing the old plain bulleted link list (which sat directly on the
   dark page background, no white card). Outer white box (pls- pattern, design-system.md §4)
   containing category tile-cards; categories mirror get_main_nav_menu() (nav.php), which was
   restructured the same day (old single 10-item "Team Management" -> "Mein Team"/
   "Transfermarkt"/"Organisation"). Keep this in sync with nav.php's category split and with
   handbuch.php's hdb- sections above if either changes again. No h1-h4/p tags inside .idx-box,
   same div/span workaround as dbe-/hdb- to sidestep the white-card white-text-shadow gotcha
   (design-system.md §8). Mockup approved as an Artifact before implementation. */
.idx-box { max-width: 1360px; margin: 22px auto 0 auto; background: #ffffff; border: 1px solid #dde1e6; border-radius: 8px; padding: 26px 28px 30px 28px; }

.idx-headrow { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; padding-bottom: 20px; margin-bottom: 22px; border-bottom: 2px solid #e2e4e7; flex-wrap: wrap; }
.idx-eyebrow { font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: #66707c; margin: 0 0 4px 0; }
.idx-title { font-size: 25px; font-weight: 800; color: #2c3e50; margin: 0; line-height: 1.15; }
.idx-sub { font-size: 12.5px; color: #66707c; margin: 6px 0 0 0; }

/* Eigene-Team-Karte oben rechts, nur wenn der eingeloggte User ein Team hat (users.team). */
.idx-teamcard { display: flex; align-items: center; gap: 12px; background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 8px; padding: 8px 16px 8px 10px; }
.idx-teamcard .logo { width: 40px; height: 40px; border-radius: 8px; object-fit: contain; flex-shrink: 0; background: #ffffff; border: 1px solid #dde1e6; }
.idx-teamcard .meta .k { font-size: 9.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: #8b95a1; display: block; }
.idx-teamcard .meta .v { font-size: 13px; font-weight: 700; color: #2c3e50; }

.idx-catgrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.idx-category { background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 8px; padding: 14px 14px 16px 14px; }
.idx-h2 { font-size: 12.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: #2c3e50; margin: 0 0 10px 0; display: flex; align-items: center; gap: 7px; }
.idx-h2 .count { font-weight: 500; letter-spacing: normal; text-transform: none; color: #a9b0b8; font-size: 11px; }

.idx-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.idx-tile { display: flex; align-items: center; gap: 10px; background: #ffffff; border: 1px solid #dde1e6; border-radius: 6px; padding: 10px 11px; text-decoration: none; color: #1b2733; transition: background .12s ease, border-color .12s ease; }
.idx-tile:hover { background: #2c3e50; border-color: #2c3e50; }
.idx-tile:hover .idx-tile-label { color: #ffffff; }
.idx-tile:focus-visible { outline: 2px solid #2c7be5; outline-offset: 2px; }
.idx-tile .idx-tile-ic { width: 26px; height: 26px; border-radius: 6px; background: #f4f6f8; border: 1px solid #dde1e6; display: flex; align-items: center; justify-content: center; font-size: 13.5px; flex-shrink: 0; }
.idx-tile .idx-tile-label { font-size: 12.5px; font-weight: 600; color: #2c3e50; line-height: 1.25; }

/* Handbuch-Kachel: fuellt die sonst leere 6. Zelle des 3-spaltigen Rasters (5 Kategorien + 1
   freie Zelle), kein echter Menuepunkt aus get_main_nav_menu() sondern eine statische Karte -
   ganze .idx-category selbst als Link, nicht ein weiteres idx-tile-Kind darin. */
.idx-handbuch { display: flex; flex-direction: column; justify-content: center; text-decoration: none; transition: background .12s ease, border-color .12s ease; }
.idx-handbuch:hover { background: #2c3e50; border-color: #2c3e50; }
.idx-handbuch:hover .idx-h2, .idx-handbuch:hover .idx-handbuch-sub { color: #ffffff; }
.idx-handbuch:focus-visible { outline: 2px solid #2c7be5; outline-offset: 2px; }
.idx-handbuch-sub { font-size: 12px; color: #66707c; line-height: 1.45; }

/* Admin-Kategorie: eigener goldener Kasten statt einer weiteren gleichrangigen Kachel-Karte,
   damit sofort klar ist, dass das ein separater Berechtigungsbereich ist. Wiederverwendet die
   .maxext Gold-Token (design-system.md §1) statt neue Hex-Werte zu erfinden. */
.idx-admin { background: #fdf3c7; border: 1px solid #ecd27a; border-radius: 8px; padding: 16px 16px 18px 16px; margin-top: 22px; }
.idx-admin .idx-h2 { color: #7a5d00; }
.idx-admin .idx-h2 .count { color: #a98a2e; }
.idx-admin .idx-grid { grid-template-columns: repeat(4, 1fr); }
.idx-admin .idx-tile { background: #fffdf5; border-color: #ecd27a; }
.idx-admin .idx-tile:hover { background: #7a5d00; border-color: #7a5d00; }
.idx-admin .idx-tile .idx-tile-ic { border-color: #ecd27a; }

@media (max-width: 980px) {
	.idx-catgrid { grid-template-columns: repeat(2, 1fr); }
	.idx-admin .idx-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 767px) {
	.idx-box { padding: 18px 16px 22px 16px; }
	.idx-catgrid { grid-template-columns: 1fr; }
	.idx-admin .idx-grid { grid-template-columns: 1fr 1fr; }
	.idx-headrow { align-items: flex-start; }
}
@media (max-width: 420px) {
	.idx-grid { grid-template-columns: 1fr; }
	.idx-admin .idx-grid { grid-template-columns: 1fr; }
}

/* ===================== awards_edit.php ("awe-" prefix, added 2026-08-15) =====================
   Admin-Verwaltung der Saison-Awards (playerAwards/gmAwards) - vorher unstyled HTML-Tabellen/
   Formulare (.gmform-*-Klassen, Inline-<style>-Block). Nahe Schwester von database_edit.php
   (dbe-, siehe oben): gleiche Seiten-Familie (Admin-Formular fuer eine DB-Tabelle), gleiche
   Bausteine (Navtabs, Panel-Karten, Msg-Boxen) mit denselben Werten, aber eigenes Praefix statt
   Wiederverwendung von dbe- (Klassennamenskonvention design-system.md §5). Bewusst KEINE
   h1-h4/p-Tags innerhalb von .awe-page (div/span/label stattdessen) - vermeidet den White-on-
   white-Bug aus design-system.md §8 von vornherein statt ihn per !important zu uebersteuern
   (gleiches Muster wie dbe-/hdb- oben). Season-/View-Umschalter + Speichern-/Anlegen-Button
   sitzen in der Nav-Leiste ($awe_page_local_html), nicht als eigene Zeile im Content (Standing
   Rule, s. CLAUDE.md). Die grosse Feldliste (champ1-15, allstarw/e1-13, 12 Award-Paare) ist in
   Panel-Karten gruppiert statt einer langen einspaltigen Tabelle - Zahlenfelder (champ/allstar)
   als kompaktes Nummern-Grid ohne Co-Sieger-Option, echte Award-Paare als Label+Input-Grid mit
   optionalem "+"-Co-Sieger-Feld (identische Interaktion wie das alte showSecondAward()/
   hideSecondAward(), nur umbenannt zu aweShowCowin()/aweHideCowin() und mit CSS-Klassen statt
   Inline-Styles). .awe-page/.awe-content (User-Wunsch 2026-08-15): EINE weisse Inhaltsbox fuer
   die gesamte Seite (wie .hdb-page/.hdb-content oben), nicht einzelne auf dem dunklen
   Seitenhintergrund schwebende Panels wie bei dbe- - Panel-Karten (.awe-panel/.awe-empty/
   .awe-create-box) sind deshalb dezent getoent (#f4f6f8, derselbe "Box auf Weiss"-Token wie
   .dbe-help/.hdb-rulebox), sonst wuerden sie auf der jetzt weissen Seite unsichtbar. .awe-navlocal
   (ebenfalls 2026-08-15) ersetzt ein vorher fehlendes Inline-Style-Div - ohne den Padding-Sync per
   aweSyncNavLocalPadding() (awards_edit.php) sassen die Navtabs direkt am Hamburger-Icon und der
   per margin-left:auto geschobene Speichern-Button am Viewport-Rand statt an der rechten Kante
   der Inhaltsbox (siehe design-system.md §4 fuer das kanonische Muster, hier zusaetzlich um eine
   rechte Spiegelung erweitert). */
.awe-page { max-width: 1360px; margin: 0 auto; background: #ffffff; }
.awe-content { padding: 20px 24px 40px; box-sizing: border-box; }

.awe-navlocal { display: flex; align-items: center; gap: 14px; flex: 1 1 auto; flex-wrap: wrap; box-sizing: border-box; }

.awe-crumb { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; font-weight: 700; color: #66707c; margin: 0 0 4px; }
.awe-title { font-size: 20px; font-weight: 800; color: #1b2733; margin: 0 0 16px; }

.awe-msg-success, .awe-msg-error { font-size: 13px; font-weight: 600; border-radius: 6px; padding: 9px 13px; margin-bottom: 10px; }
.awe-msg-success { background: #e8f8ec; color: #1a7a1a; border: 1px solid #b7e6c3; }
.awe-msg-error { background: #fdeceb; color: #b00000; border: 1px solid #f0b8b2; }

.awe-navtabs { display: flex; background: #1a2733; border-radius: 6px; padding: 3px; gap: 2px; flex: 0 0 auto; }
.awe-navtab { border: none; background: transparent; color: #c9d2da; font: inherit; font-size: 12px; font-weight: 600; padding: 6px 13px; border-radius: 4px; cursor: pointer; white-space: nowrap; text-decoration: none; display: inline-block; }
.awe-navtab.active { background: #2c3e50; color: #fff; font-weight: 700; }
.awe-navtab:hover:not(.active) { color: #fff; }

.awe-season-select { font: inherit; font-size: 12.5px; border: 1px solid #3d5266; background: #1f2f3d; color: #fff; border-radius: 5px; padding: 6px 10px; cursor: pointer; }
.awe-season-select:focus { outline: none; border-color: #6f95b8; }

.awe-nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.awe-navbtn { font: inherit; font-size: 12px; font-weight: 700; border-radius: 5px; padding: 7px 14px; cursor: pointer; border: 1px solid transparent; white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; }
.awe-navbtn.primary { background: #fff; color: #2c3e50; }
.awe-navbtn.primary:hover { background: #e7ecf1; }
.awe-navbtn svg { width: 14px; height: 14px; fill: currentColor; }

.awe-empty { padding: 26px; text-align: center; color: #8b95a1; font-size: 13px; background: #f4f6f8; border-radius: 6px; border: 1px solid #dde1e6; }

.awe-create-box { background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 8px; padding: 18px 20px; font-size: 13px; color: #33424c; line-height: 1.6; }

.awe-panels { display: flex; flex-direction: column; gap: 18px; }
.awe-panel { background: #f4f6f8; border: 1px solid #dde1e6; border-radius: 8px; padding: 18px 20px; }
.awe-panel-title-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.awe-panel-title { font-size: 13px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50; margin: 0; }

.awe-importbtn { font: inherit; font-size: 11.5px; font-weight: 700; color: #2c3e50; background: #fff; border: 1px solid #2c3e50; border-radius: 5px; padding: 5px 11px; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
.awe-importbtn:hover { background: #eef1f4; }
.awe-importbtn svg { width: 13px; height: 13px; fill: currentColor; }

.awe-slot-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px 10px; }
.awe-slot { display: flex; align-items: center; gap: 7px; }
.awe-slot-num { flex: 0 0 auto; width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: #eef1f4; color: #2c3e50; font-size: 10.5px; font-weight: 700; }
.awe-slot input[type=text] { flex: 1 1 auto; min-width: 0; font: inherit; font-size: 12px; border: 1px solid #ccd3da; border-radius: 4px; padding: 5px 7px; box-sizing: border-box; }

.awe-field-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 14px 18px; }
.awe-field { display: flex; flex-direction: column; }
.awe-field-label { font-size: 11px; font-weight: 700; color: #66707c; margin-bottom: 5px; }
.awe-field-row { display: flex; align-items: center; gap: 6px; }
.awe-field-row input[type=text] { flex: 1 1 auto; min-width: 0; font: inherit; font-size: 12.5px; border: 1px solid #ccd3da; border-radius: 4px; padding: 6px 8px; box-sizing: border-box; }
.awe-cowin-btn { flex: 0 0 auto; width: 24px; height: 24px; border-radius: 50%; border: 1px solid #ccd3da; background: #fff; color: #2c3e50; font-size: 14px; font-weight: 700; cursor: pointer; line-height: 1; padding: 0; }
.awe-cowin-btn:hover { background: #eef1f4; }
.awe-cowin-wrap { display: flex; align-items: center; gap: 6px; margin-top: 6px; }
.awe-cowin-wrap input[type=text] { flex: 1 1 auto; min-width: 0; font: inherit; font-size: 12.5px; border: 1px solid #ccd3da; border-radius: 4px; padding: 6px 8px; box-sizing: border-box; background: #fbfbfc; }
.awe-cowin-remove { flex: 0 0 auto; width: 24px; height: 24px; border-radius: 50%; border: 1px solid #e79a95; background: #fff; color: #b00000; font-size: 14px; font-weight: 700; cursor: pointer; line-height: 1; padding: 0; }
.awe-cowin-remove:hover { background: #fdeceb; }

@media (max-width: 767px) {
	.awe-content { padding: 14px 16px 22px; }
	.awe-nav-right { width: 100%; }
	.awe-season-select { flex: 1 1 auto; }
}

/* ===================== playoff_seeding.php ("pls-" prefix, added 2026-08-15) =====================
   Admin-Pflege der Playoff-Setzliste (1-10 je Conference/Saison) - vorher unstyled HTML-Tabellen/
   Formulare. Selbe Seiten-Familie wie database_edit.php/awards_edit.php (dbe-/awe-, siehe oben):
   gleiche Bausteine (Msg-Boxen, Panel-Karten, Season-Select+Speichern-Button in der Nav-Leiste statt
   eigener Zeile im Content), eigenes Praefix statt Wiederverwendung von dbe-/awe- (Klassennamens-
   konvention design-system.md §5). Bewusst KEINE h1-h4/p-Tags innerhalb von .pls-page (div/span
   stattdessen) - selbes Muster wie dbe-/awe-, vermeidet den White-on-white-Bug (design-system.md §8)
   von vornherein. Die beiden Conference-Boxen (vorher `display:inline-block` nebeneinander) sind
   jetzt ein echtes 2-Spalten-Grid, das unter 700px (wie .rh-twocol) auf 1 Spalte faellt.
   .pls-box (added 2026-08-15, user request): DIESE Seite wickelt Crumb/Titel/Meldungen/Grid in
   EINE gemeinsame weisse Box statt einzelner freischwebender Karten auf dem dunklen Seiten-
   hintergrund - abweichend von dbe-/awe-, die nur ihre Panels/Tabellen einzeln weiss faerben
   (siehe design-system.md "Outer white content box" fuer wann welches Muster passt).
   Speichern-Button (added 2026-08-15, user request, 2 Iterationen): sitzt bewusst NICHT in der
   Nav-Leiste, sondern rechtsbuendig in einer eigenen `.pls-headrow` oberhalb des Inhalts, neben
   Crumb/Titel - explizite, user-gewuenschte Ausnahme von der sonst geltenden "Page-local-Controls
   gehoeren in die Nav-Leiste"-Regel (docs/CLAUDE.md), siehe design-system.md §4. Nur der Season-
   Select bleibt in der Nav-Leiste. Erste Fassung hatte den Button noch in der Nav (per
   `.pls-nav-right` mit `margin-left:auto`, das dort einen anderen Bug verursachte, siehe
   design-system.md §4 "margin-left:auto..." - dieser Fix ist mit dem Verschieben des Buttons aus
   der Nav hinfaellig geworden, `.pls-nav-right`/`.pls-navbtn` sind entfernt). Der Button ist ein
   dunkler, gefuellter Button (`.pls-savebtn`, navy bg + weisser Text), nicht der helle
   `.xxx-navbtn`-Stil aus dbe-/awe- - der war fuer den dunklen Nav-Hintergrund gedacht (weisser
   Pill-Button) und waere auf der jetzt weissen `.pls-box` unsichtbar (weiss auf weiss). */
.pls-page { max-width: 1360px; margin: 0 auto; padding: 20px 24px 40px; box-sizing: border-box; }
.pls-box { background: #fff; border: 1px solid #dde1e6; border-radius: 8px; padding: 22px 24px 26px; }

.pls-headrow { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 16px; }

.pls-crumb { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; font-weight: 700; color: #66707c; margin: 0 0 4px; }
.pls-title { font-size: 20px; font-weight: 800; color: #1b2733; margin: 0; }

.pls-savebtn { font: inherit; font-size: 12.5px; font-weight: 700; background: #2c3e50; color: #fff; border: none; border-radius: 6px; padding: 9px 18px; cursor: pointer; white-space: nowrap; }
.pls-savebtn:hover { background: #1a2733; }

.pls-msg-success, .pls-msg-error { font-size: 13px; font-weight: 600; border-radius: 6px; padding: 9px 13px; margin-bottom: 10px; }
.pls-msg-success { background: #e8f8ec; color: #1a7a1a; border: 1px solid #b7e6c3; }
.pls-msg-error { background: #fdeceb; color: #b00000; border: 1px solid #f0b8b2; }

.pls-season-select { font: inherit; font-size: 12.5px; border: 1px solid #3d5266; background: #1f2f3d; color: #fff; border-radius: 5px; padding: 6px 10px; cursor: pointer; }
.pls-season-select:focus { outline: none; border-color: #6f95b8; }

.pls-empty { padding: 26px; text-align: center; color: #8b95a1; font-size: 13px; }

.pls-conf-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; align-items: start; }

.pls-panel { background: #fff; border: 1px solid #dde1e6; border-radius: 8px; padding: 18px 20px; }
.pls-panel-head { display: flex; align-items: center; gap: 8px; margin: 0 0 14px; }
.pls-panel-head img { height: 22px; }
.pls-panel-title { font-size: 13px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50; }

.pls-seed-list { display: flex; flex-direction: column; gap: 7px; }
.pls-seed-row { display: flex; align-items: center; gap: 10px; }
.pls-seed-num { flex: 0 0 auto; width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: #eef1f4; color: #2c3e50; font-size: 11px; font-weight: 700; }
.pls-seed-select { flex: 1 1 auto; min-width: 0; font: inherit; font-size: 12.5px; border: 1px solid #ccd3da; border-radius: 4px; padding: 6px 8px; box-sizing: border-box; background: #fff; cursor: pointer; }
.pls-seed-select:focus { outline: none; border-color: #6f95b8; }

@media (max-width: 767px) {
	.pls-page { padding: 14px 16px 22px; }
	.pls-season-select { flex: 1 1 auto; }
	.pls-savebtn { width: 100%; }
}

@media (max-width: 700px) {
	.pls-conf-grid { grid-template-columns: 1fr; }
}

/* ===================== dyneplus.php ("dyp-" prefix, added 2026-08-15) =====================
   Admin-Pflege des DYNE+-Status je GM/Saison (kein/halb/voll + bei "halb" 2 von 4 Boni) - vorher
   unstyled HTML (Radios/Checkboxes in Flex-Zeilen). Selbe Seiten-Familie wie dbe-/awe-/pls-
   (kompakte Admin-CRUD-Formularseite), eigenes Praefix statt Wiederverwendung (design-system.md
   §5). Bewusst KEINE h1-h4/p-Tags innerhalb von .dyp-page (div/span statt), selbes Muster wie
   dbe-/awe-/pls- - vermeidet den White-on-white-Bug (design-system.md §8) von vornherein.
   .dyp-box: EINE gemeinsame weisse Box fuer Crumb/Titel/Meldungen/GM-Liste, wie pls-box - passt
   hier, da die Seite eine einzelne kompakte Formular-Einheit ist (design-system.md "Outer white
   content box").
   Speichern-Button: sitzt in der Nav-Leiste (explizite User-Vorgabe, anders als playoff_seeding.
   php's .pls-savebtn) - heller `.dyp-navbtn`-Stil wie dbe-/awe- (weisser Pill-Button fuer den
   dunklen Nav-Hintergrund). Naive erste Fassung nutzte nur `margin-left:auto` auf `.dyp-nav-
   right` - das landete am echten Viewport-Rand statt am rechten Rand der 1360px-Content-Spalte
   darunter, weil .mainnav-header echtes Full-Bleed ist (width:100%; position:fixed; left:0;
   right:0; siehe nav.php) - genau der in design-system.md §4 dokumentierte Gotcha. Fix: PHP setzt
   auf #dypNavLocal selbst `flex:0 0 auto` (statt `flex:1 1 auto` - sonst wuerde der Wrapper ohnehin
   bis zum Viewport-Rand wachsen und jede width-Berechnung waere hinfaellig) + `box-sizing:border-
   box`; die Sync-Funktion `dypSyncNavLocal()` (dyneplus.php, vor </body>) setzt dann per JS sowohl
   `padding-left` (wie ueberall sonst) ALS AUCH eine explizite `width`, sodass der Wrapper selbst
   exakt bei .dyp-box's rechtem Rand endet - `.dyp-nav-right`'s `margin-left:auto` landet dadurch
   dort statt am Viewport-Rand. Dieses Wrapper-width-Muster ist bisher einzigartig fuer dyp- (dbe-/
   awe- nutzen noch das blosse margin-left:auto ohne Breiten-Sync - ob die denselben Bug zeigen,
   ist unbestaetigt, siehe design-system.md §4 - nicht ungefragt anpassen).
   Jeder GM ist eine eigene Karte (.dyp-gm-card) statt Tabellenzeile - passt besser zu den
   variabel breiten Formularelementen (Status-Toggles + bedingte Bonus-Toggles) als eine Tabelle,
   und erspart eine eigene Mobile-Card-Collapse-Logik (die Karten sind schon mobil-tauglich per
   flex-wrap). Status-Radios/Bonus-Checkboxes sind als Toggle-Chips gestylt (verstecktes
   input + Sibling-<span>, aktiv via :checked), selbe Optik wie die Toggle-Chips im fap-/plp-
   Filterpanel (design-system.md §4). */
.dyp-page { max-width: 1360px; margin: 0 auto; padding: 20px 24px 40px; box-sizing: border-box; }
.dyp-box { background: #fff; border: 1px solid #dde1e6; border-radius: 8px; padding: 22px 24px 26px; }

.dyp-crumb { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; font-weight: 700; color: #66707c; margin: 0 0 4px; }
.dyp-title { font-size: 20px; font-weight: 800; color: #1b2733; margin: 0 0 16px; }

.dyp-msg-success, .dyp-msg-error { font-size: 13px; font-weight: 600; border-radius: 6px; padding: 9px 13px; margin-bottom: 10px; }
.dyp-msg-success { background: #e8f8ec; color: #1a7a1a; border: 1px solid #b7e6c3; }
.dyp-msg-error { background: #fdeceb; color: #b00000; border: 1px solid #f0b8b2; }

.dyp-empty { padding: 26px; text-align: center; color: #8b95a1; font-size: 13px; }

.dyp-season-select { font: inherit; font-size: 12.5px; border: 1px solid #3d5266; background: #1f2f3d; color: #fff; border-radius: 5px; padding: 6px 10px; cursor: pointer; }
.dyp-season-select:focus { outline: none; border-color: #6f95b8; }

.dyp-nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.dyp-navbtn { font: inherit; font-size: 12px; font-weight: 700; border-radius: 5px; padding: 7px 14px; cursor: pointer; border: 1px solid transparent; white-space: nowrap; }
.dyp-navbtn.primary { background: #fff; color: #2c3e50; }
.dyp-navbtn.primary:hover { background: #e7ecf1; }

.dyp-gm-list { display: flex; flex-direction: column; gap: 8px; }
.dyp-gm-card { border: 1px solid #e2e4e7; border-radius: 8px; padding: 12px 16px; }

.dyp-gm-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; }
.dyp-gm-name { font-size: 13.5px; font-weight: 700; color: #1b2733; }
.dyp-gm-team { font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 700; color: #5c6b7a; background: #eef1f4; border-radius: 9px; padding: 2px 8px; }
.dyp-gm-streak { margin-left: auto; font-size: 11px; color: #8b95a1; font-weight: 600; white-space: nowrap; }

.dyp-status-group { display: flex; flex-wrap: wrap; gap: 6px; }

.dyp-half-box { flex-wrap: wrap; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px dashed #dde1e6; }

.dyp-toggle { position: relative; cursor: pointer; }
.dyp-toggle input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.dyp-toggle span { display: inline-block; font-size: 12px; font-weight: 600; color: #5c6b7a; background: #fff; border: 1px solid #ccd3da; border-radius: 6px; padding: 6px 14px; }
.dyp-toggle input:checked + span { background: #2c3e50; border-color: #2c3e50; color: #fff; }
.dyp-toggle input:focus-visible + span { outline: 2px solid #6f95b8; outline-offset: 1px; }
.dyp-toggle.bonus span { font-size: 11.5px; padding: 5px 11px; }
.dyp-toggle.bonus input:checked + span { background: #0c447c; border-color: #0c447c; }

@media (max-width: 767px) {
	.dyp-page { padding: 14px 16px 22px; }
	.dyp-season-select { flex: 1 1 auto; }
	.dyp-nav-right { width: 100%; }
	.dyp-navbtn { width: 100%; text-align: center; }
	.dyp-gm-streak { margin-left: 0; }
}

/* ===================== admin_users.php ("adu-" prefix, added 2026-08-15) =====================
   First redesign of this page (previously plain unstyled HTML tables/forms, .gmform-*-classes +
   inline <style> block in admin_users.php itself). Same admin-CRUD-form page family as
   dbe-/awe-/pls-/dyp- above, own prefix per the class-naming convention (design-system.md §5).
   Mockup approved first (per the user's standing preference for larger redesigns), then
   implemented 1:1. .adu-page/.adu-content: ONE white content box for the whole page (like
   awe-/hdb-/pls-/dyp- above), not table + separate floating elements on the dark page background.
   No h1-h4/p tags inside .adu-page (div/span instead) - same white-on-white workaround as
   dbe-/awe-/hdb- (design-system.md §8).
   Both nav-local buttons sit in the nav bar, NOT as a headrow above the content like pls-/dyp-
   chose - explicit user request this time (2026-08-15). Initially both were right-aligned (single
   .adu-navlocal with justify-content:flex-end, no left-side content, deliberately sidestepping the
   margin-left:auto-escapes-to-the-whole-header-bar gotcha of design-system.md §4/§124 rather than
   working around it); revised same day to "Neuen Benutzer anlegen" left-aligned to content /
   "Änderungen speichern" (references bulkUsersForm via form="...") right-aligned, matching awe-'s
   structure exactly: .adu-navlocal is still the single child .mainnav-page-local exposes to
   .mainnav-header (that wrapper is display:contents), so a nested .adu-nav-right's
   margin-left:auto stays scoped to .adu-navlocal's own flex context instead of escaping to the
   whole header - the §124 bug only bites when $page_local_html itself has MULTIPLE sibling root
   nodes, which this still avoids. Padding sync (admin_users.php's aduSyncNavLocalPadding()) is now
   dual left+right, identical pattern to aweSyncNavLocalPadding().
   Rechtestufe rendered as a colour-coded pill (.adu-level-pill, read-only rows) or an equivalently
   coloured <select> (.adu-level-select, editable rows - JS onchange keeps the lvl-N class in sync
   with the live selection) using the SAME 3 tokens already defined for other pill families
   (default/bird-blue/gold from §1 of the design doc), not new hex values. Team column reuses the
   existing "Team-colored pill" pattern (trp-teampill's colour-resolution algorithm, duplicated
   locally in admin_users.php as adu_resolve_team_color() rather than requiring
   inc_trade_functions.php for a single helper) but with its own richer chip markup (colour dot +
   role suffix) instead of bare trp-teampill, to match the approved mockup. Aktionen column merges
   the previous two separate table columns (password-change form, delete form) into one; the delete
   form sits inline right of "Ändern" as an icon-only "✕" button (.adu-delbtn) rather than a
   labelled "✕ Löschen" button (revised same day, user request) - .adu-del-form uses
   display:contents so the <form> wrapper (needed for its own onsubmit confirm()) doesn't break the
   flex row it shares with the password-change form. */
.adu-navlocal { display: flex; align-items: center; gap: 10px; flex: 1 1 auto; flex-wrap: wrap; box-sizing: border-box; }
.adu-nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.adu-navbtn { font: inherit; font-size: 12px; font-weight: 700; border-radius: 5px; padding: 7px 14px; border: 1px solid transparent; background: #fff; color: #2c3e50; display: inline-flex; align-items: center; gap: 6px; cursor: pointer; white-space: nowrap; }
.adu-navbtn:hover { background: #e7ecf1; }
.adu-navbtn svg { width: 13px; height: 13px; fill: currentColor; }
.adu-navbtn.ghost { background: transparent; color: #fff; border-color: rgba(255,255,255,.5); }
.adu-navbtn.ghost:hover { background: rgba(255,255,255,.12); }

.adu-page { max-width: 1360px; margin: 0 auto; background: #ffffff; }
.adu-content { padding: 22px 24px 30px; box-sizing: border-box; }

.adu-crumb { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; font-weight: 700; color: #66707c; margin: 0 0 4px; }
.adu-title { font-size: 20px; font-weight: 800; color: #1b2733; margin: 0 0 16px; }

.adu-msg-success, .adu-msg-error { font-size: 13px; font-weight: 600; border-radius: 6px; padding: 9px 13px; margin-bottom: 14px; }
.adu-msg-success { background: #e8f8ec; color: #1a7a1a; border: 1px solid #b7e6c3; }
.adu-msg-error { background: #fdeceb; color: #b00000; border: 1px solid #f0b8b2; }

.adu-section-label { font-size: 12.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: #2c3e50; margin: 22px 0 10px; }
.adu-empty { padding: 26px; text-align: center; color: #8b95a1; font-size: 13px; background: #f4f6f8; border-radius: 6px; border: 1px solid #dde1e6; }

.adu-table-scroll { overflow-x: auto; border-radius: 6px; border: 1px solid #e2e4e7; }
.adu-table { width: 100%; border-collapse: collapse; background: #fff; font-size: 12.3px; min-width: 920px; }
.adu-table thead th { background: #2c3e50; color: #fff; font-weight: 700; text-align: center; padding: 9px 10px; white-space: nowrap; }
.adu-table thead th.left { text-align: left; }
.adu-table td { padding: 8px 10px; border-bottom: 1px solid #e2e4e7; text-align: center; vertical-align: middle; }
.adu-table td.left { text-align: left; }
.adu-table tbody tr:nth-child(even) { background: #f5f6f8; }
.adu-table tbody tr:hover { background: #eaf1f8; }
.adu-table td.sticky-col, .adu-table th.sticky-col { position: sticky; left: 0; z-index: 1; background: inherit; box-shadow: 2px 0 4px rgba(0,0,0,.06); text-align: left; }
.adu-table thead th.sticky-col { background: #2c3e50; z-index: 2; }

.adu-username { font-weight: 600; color: #1b2733; }
.adu-self-badge { display: inline-block; margin-left: 6px; font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; background: #eef1f4; color: #5c6b7a; border: 1px solid #dde1e6; border-radius: 8px; padding: 1px 6px; vertical-align: middle; }
.adu-date { color: #66707c; font-variant-numeric: tabular-nums; white-space: nowrap; }
.adu-muted { color: #a9b0b8; }

.adu-level-pill, .adu-level-select { display: inline-flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 700; border-radius: 9px; padding: 3px 10px; border: 1px solid; white-space: nowrap; }
.adu-level-select { font-family: inherit; cursor: pointer; padding: 3px 22px 3px 10px; appearance: none; background-repeat: no-repeat; background-position: right 7px center; background-size: 9px; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6z" fill="%235c6b7a"/></svg>'); }
.adu-level-select:focus { outline: none; border-color: #6f95b8; box-shadow: 0 0 0 2px rgba(111,149,184,.25); }
.adu-level-select.lvl-0, .adu-level-pill.lvl-0 { background: #f1eee8; color: #5f5e5a; border-color: #c8c4b9; }
.adu-level-select.lvl-1, .adu-level-pill.lvl-1 { background: #e7f2ff; color: #0c447c; border-color: #85b7eb; }
.adu-level-select.lvl-2, .adu-level-pill.lvl-2 { background: #fdf3c7; color: #7a5d00; border-color: #ecd27a; }

.adu-gm-input { font: inherit; font-size: 12px; width: 100%; min-width: 130px; border: 1px solid #ccd3da; border-radius: 4px; padding: 4px 7px; box-sizing: border-box; }
.adu-gm-input:focus { outline: none; border-color: #6f95b8; box-shadow: 0 0 0 2px rgba(111,149,184,.25); }

.adu-team-chip { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; border-radius: 9px; padding: 3px 9px 3px 7px; white-space: nowrap; }
.adu-team-chip .dot { width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; }
.adu-role-tag { font-weight: 500; opacity: .85; }

.adu-actions { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.adu-pw-row { display: flex; align-items: center; gap: 6px; }
.adu-pw-input { font: inherit; font-size: 11.5px; width: 118px; border: 1px solid #ccd3da; border-radius: 4px; padding: 4px 7px; box-sizing: border-box; }
.adu-rowbtn { border: 1px solid #2c3e50; background: #fff; color: #2c3e50; font: inherit; font-size: 11px; font-weight: 700; border-radius: 4px; padding: 4px 9px; cursor: pointer; white-space: nowrap; }
.adu-rowbtn:hover { background: #eef1f4; }
.adu-del-form { display: contents; }
.adu-delbtn { border: 1px solid #e79a95; background: #fff; color: #b00000; font: inherit; font-size: 13px; font-weight: 700; line-height: 1; border-radius: 4px; width: 26px; height: 26px; padding: 0; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; flex: 0 0 auto; }
.adu-delbtn:hover { background: #fdeceb; }

.adu-modal-overlay { display: none; position: fixed; inset: 0; background: rgba(15,23,32,.55); align-items: center; justify-content: center; z-index: 1000000; }
.adu-modal-overlay.open { display: flex; }
.adu-modal-box { background: #fff; border-radius: 10px; border: 1px solid #dde1e6; box-shadow: 0 12px 32px rgba(0,0,0,.28); width: 380px; max-width: calc(100vw - 32px); padding: 22px 22px 18px; box-sizing: border-box; }
.adu-modal-title { font-size: 15px; font-weight: 800; color: #1b2733; margin: 0 0 16px; }
.adu-field { margin-bottom: 12px; }
.adu-field label { display: block; font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: #66707c; margin-bottom: 5px; }
.adu-field input, .adu-field select { width: 100%; box-sizing: border-box; font: inherit; font-size: 13px; border: 1px solid #ccd3da; border-radius: 5px; padding: 7px 9px; }
.adu-field input:focus, .adu-field select:focus { outline: none; border-color: #6f95b8; box-shadow: 0 0 0 2px rgba(111,149,184,.25); }
.adu-field-hint { font-size: 10.5px; color: #a9b0b8; margin-top: 4px; }
.adu-modal-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
.adu-btn-secondary { font: inherit; font-size: 12.5px; font-weight: 700; color: #5c6b7a; background: #fff; border: 1px solid #ccd3da; border-radius: 5px; padding: 8px 14px; cursor: pointer; }
.adu-btn-secondary:hover { background: #f4f6f8; }
.adu-btn-primary { font: inherit; font-size: 12.5px; font-weight: 700; color: #fff; background: #2c3e50; border: 1px solid #2c3e50; border-radius: 5px; padding: 8px 14px; cursor: pointer; }
.adu-btn-primary:hover { background: #1a2733; }

@media (max-width: 767px) {
	.adu-content { padding: 16px 14px 22px; }
	.adu-pw-row { flex: 1 1 160px; }
	.adu-pw-input { width: auto; flex: 1 1 auto; }
}
