/* ================================================================
   SPO v2 – Stylesheet
   ================================================================
   Sektionen:
   1. Custom Properties
   2. Navbar – Hauptnavigation
   3. Navbar – Sub-Navigation (Sender-Ansichten)
   4. Breadcrumbs
   5. Buttons (btn-spo, btn-spo-outline, btn-petrol, btn-petrol-outline)
   6. Tabellen – Header & Basis
   7. Tabellen – Spezialzeilen (Tagesheader, Lücken, Overlap, SinL)
   8. Tabellen – Loops
   9. Tabellen – Thumbnails
   10. DataTables – Sortierung
   11. DataTables – Pagination
   12. Tabellen – SPO Legacy (table-spo)
   13. Tags & Badges
   14. Links
   15. Tooltips
   16. Sendeplanung – Wochenansicht (Grid)
   17. Produktionsliste – Badges & Zeilenfarben
   18. Teams
   19. Footer
   20. Loading Overlay
   21. Scroll-to-top
   22. Flatpickr Kalender (spo-cal Theme)
       22a. Kalender – Basis & Sichtbarkeit
       22b. Kalender – Pfeile (oben/unten)
       22c. Monatsheader & Navigation
       22d. Numerisches Input-Widget
       22e. Monatsname & Jahresauswahl
       22f. Wochentagszeile
       22g. Tage-Grid (dayContainer)
       22h. Einzelner Tag – Basis
       22i. Tag – Hover, Focus, inRange (Basis)
       22j. Tag – Heute
       22k. Tag – Ausgewählt / Start / Ende (CI-Farben)
       22l. Tag – inRange (Linie oben/unten, Lückenfix)
       22m. Tag – prevMonth / nextMonth / disabled
       22n. Tag – Heute innerhalb Range
       22o. Weekwrapper (KW-Spalte)
       22p. Inner-Container & Time-Picker
       22q. Animation
   23. Fokus-Glow entfernen + Fokus-/Active-Rahmen auf CI-Petrol
   ================================================================ */

/* 1. Custom Properties
   ──────────────────────────────────────────────────────────────── */
:root { --spo-ci: #1e2c48; --spo-ci-dark: #141e33; --spo-ci-mid: #2d3f63; --spo-ci-light: #edf0f7; --spo-dark-muted: #c1c1dd; --spo-dark-border: #485a8b; --spo-ci-stripe: #edf0f7; --spo-table-border: #dee2e6; --spo-live: #ff4d6d; --spo-ea: #7c6fea; --spo-petrol: #6fc5d3; --spo-petrol-dark: #4db0c0; }

/* Mobile-Browser (iOS Safari, Android Chrome) blähen kleine Schriften automatisch auf
   ("text inflation"). Das macht u.a. die 9px-Tags (LIVE/EA/Zeit) im Wochen-Grid höher als
   ihren fix hohen Block, sodass overflow:hidden sie anschneidet. Auf Autoren-Größe fixieren. */
html { -webkit-text-size-adjust: 100%; -moz-text-size-adjust: 100%; text-size-adjust: 100%; }

body.dark-mode { background-color: var(--spo-ci-dark) !important; }
body.dark-mode .dark-mode-text{ color: var(--spo-ci-light) !important; }
body.dark-mode .text-muted-dark {color: var(--spo-dark-muted) !important;}
body.dark-mode .dark-mode-btn { --bs-btn-color: var(--spo-ci-light); --bs-btn-border-color: var(--spo-dark-border); --bs-btn-hover-color: var(--spo-ci-light);
                                --bs-btn-hover-bg: var(--spo-ci-mid); --bs-btn-hover-border-color: var(--spo-dark-border); --bs-btn-disabled-color: var(--spo-ci-light); -bs-btn-disabled-border-color: var(--spo-ci-light); }
body.dark-mode .dark-mode-btn.active { background-color: var(--spo-ci-mid) !important; color: var(--spo-ci-light)!important; border-color: var(--spo-dark-border) !important; }
body.dark-mode .dark-mode-btn .kommentar-texticon.text-muted { color: var(--spo-dark-muted) !important; }
body.dark-mode .dark-mode-filter { --bs-btn-color: var(--spo-ci-light); --bs-btn-border-color: var(--spo-dark-border); --bs-btn-hover-color: var(--spo-ci-light); --bs-btn-hover-bg: var(--spo-ci-mid); --bs-btn-hover-border-color: var(--spo-dark-border); }
body.dark-mode .dark-mode-filter.active { background-color: var(--spo-ci-mid) !important; color: var(--spo-ci-light) !important; border-color: var(--spo-dark-border) !important; }

body.dark-mode .dark-mode-table tbody { background-color: var(--spo-ci-dark); --bs-table-bg: var(--spo-ci-dark); --bs-table-striped-bg: var(--spo-ci-mid); --bs-table-color: var(--spo-ci-light) !important;}
body.dark-mode .dark-mode-table.table-striped > tbody > tr:nth-of-type(odd) > * { --bs-table-bg-type: var(--spo-ci-mid); --bs-table-color-type: var(--spo-ci-light); color: var(--spo-ci-light); }
body.dark-mode .dark-mode-table > tbody > tr:hover > * { background-color: var(--spo-dark-border); color: var(--spo-ci-light); }
/* .table-active (per JS beim Aufklappen der Collapse-Zeile gesetzt) ueberschreibt sonst --bs-table-color-state
   mit dem dunklen Bootstrap-Default (--bs-table-active-color), sobald die Maus die Zeile wieder verlaesst. */
body.dark-mode .dark-mode-table > tbody > tr.table-active > * { color: var(--spo-ci-light) !important; }
body.dark-mode .dark-mode-table .text-muted { color: var(--spo-dark-muted)  !important; }
/* .table-light (Statistiken-Summenzeilen, z.B. "Produktionen gesamt") ist ein statisches Bootstrap-Kontextfarbe
   ohne Dark-Mode-Anpassung -- ohne diese Regel bleibt die Zeile hell-grau, egal welches Theme aktiv ist. */
body.dark-mode .dark-mode-table > tbody > tr.table-light > * { background-color: var(--spo-ci-mid) !important; color: var(--spo-ci-light) !important; }
body.dark-mode .besetzung-edit-view .besetzung-staff-table > tbody > tr > td { color: var(--spo-ci-light) !important; }
body.dark-mode #personen-termine-table tbody tr.table-active > td { color: var(--spo-ci-light) !important; }
body.dark-mode .pt-child-wrap .besetzung-staff-table > tbody > tr > td { color: #212529 !important; }

body.dark-mode .link-dark-mode { color: var(--spo-ci-light) !important; text-decoration-color: var(--spo-ci-light) !important; }
body.dark-mode .dt-info { color: #9aa7bd; }
body.dark-mode .dark-mode-container { color: var(--spo-ci-light); }
body.dark-mode .dark-mode-container  .form-text { color: var(--spo-dark-muted) !important; }

body.dark-mode .dark-mode-table-simple tbody { --bs-table-bg: var(--spo-ci-mid); --bs-table-color: var(--spo-ci-light); border-color: var(--spo-dark-border) }
body.dark-mode .dark-mode-table-simple > tbody > tr:hover > * { background-color: #3a5282 !important; color: var(--spo-ci-light) !important; }
body.dark-mode .ze-prod-card { border-color: var(--spo-dark-border) !important; }
.ze-detail-wrap { border: 1px solid var(--spo-table-border); border-radius: .375rem; }
body.dark-mode .ze-detail-wrap { border-color: var(--spo-dark-border); }
body.dark-mode tr.detail-row td { color: var(--spo-ci-light); }
body.dark-mode tr.detail-row .text-muted { color: var(--spo-dark-muted) !important; }

/* Produktions-Edit-Tab-Leiste: kompaktere Laschen, damit alle Tabs in eine Zeile passen */
#nav-tab .nav-link { padding: 0.3rem 0.65rem; font-size: 0.85rem; white-space: nowrap; }
#nav-tab .vr { align-self: center; height: 1.4rem; }

/* Tab-Leiste horizontal scrollbar bei Overflow + Scroll-Pfeile (JS toggelt .visible) */
.prod-tabs-nav { position: relative; }
.prod-tabs-scroll { overflow-x: auto; overflow-y: hidden; touch-action: pan-x; overscroll-behavior-x: contain; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none; scroll-behavior: smooth; }
.prod-tabs-scroll::-webkit-scrollbar { display: none; }
.prod-tabs-scroll-btn {
  position: absolute; top: 0; bottom: 0; width: 2.2rem;
  display: none; align-items: center; justify-content: center;
  border: 0; padding: 0; cursor: pointer; z-index: 3;
  background: none; color: var(--spo-ci);
}
.prod-tabs-scroll-btn.visible { display: flex; }
.prod-tabs-scroll-left  { left: 0;  background: linear-gradient(to right, #fff 60%, rgba(255,255,255,0)); }
.prod-tabs-scroll-right { right: 0; background: linear-gradient(to left,  #fff 60%, rgba(255,255,255,0)); }
.prod-tabs-scroll-btn:hover { color: var(--spo-ci-mid); }
.prod-tabs-scroll-btn:disabled { opacity: 0.35; cursor: default; }
body.dark-mode .prod-tabs-scroll-btn { color: var(--spo-ci-light); }
body.dark-mode .prod-tabs-scroll-left  { background: linear-gradient(to right, var(--spo-ci) 60%, rgba(30,44,72,0)); }
body.dark-mode .prod-tabs-scroll-right { background: linear-gradient(to left,  var(--spo-ci) 60%, rgba(30,44,72,0)); }
body.dark-mode .nav-tab-dark > .nav-link  { background-color: var(--spo-ci); color: var(--spo-ci-light); border-color: var(--spo-ci-mid);}
body.dark-mode .nav-tab-dark > .nav-link.active { background-color: var(--spo-ci-mid) ; color: var(--spo-ci-light); }
body.dark-mode .nav-tab-dark > .nav-link:disabled { color: var(--spo-dark-border) !important; }
body.dark-mode .tab-content-dark { background-color: var(--spo-ci-mid) ; border-color: var(--spo-ci-mid); color: var(--spo-ci-light);}
body.dark-mode .tab-content-dark .text-muted {color:  var(--spo-dark-muted) !important;}

body.dark-mode .breadcrumb-item, body.dark-mode .breadcrumb-item a { color:  var(--spo-dark-muted) !important; }
body.dark-mode .breadcrumb-item.active { color: var(--spo-ci-light) !important; --bs-breadcrumb-item-active-color: var(--spo-ci-light); }
body.dark-mode .breadcrumb-item + .breadcrumb-item::before { color: var(--spo-ci-light) !important; }

.cal-today-home { display: inline-flex; align-items: center; justify-content: center; vertical-align: middle; width: 1.7rem; height: 1.5rem; padding: 0; font-size: .8rem; line-height: 1; }

body.dark-mode .flatpickr-calendar.inline { background: var(--spo-ci-dark); }
body.dark-mode .flatpickr-innerContainer { background: var(--spo-ci-dark); }
body.dark-mode .flatpickr-day { color: var(--spo-ci-light); }
body.dark-mode .flatpickr-day.inRange { color: #484848; }
body.dark-mode .flatpickr-day:hover, body.dark-mode .flatpickr-day:focus { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); }

body.dark-mode #besetzung-table tbody { background-color: var(--spo-ci-light); }
/* Meine Termine – besetzung-main Zeilen im Dark Mode: rgba Kategorie-Farben liegen auf dunklem
   Body-Hintergrund → wirken schwarz/unlesbar. Lösung: weißer background-color als Basis +
   --row-accent (vom TR vererbt) als background-image-Overlay → identische Optik wie Light Mode.
   background-image liegt über background-color, daher erscheint die Farbe auf weißem Grund.
   Day-Header bleiben unberührt (eigene dark-mode-Regel). */
body.dark-mode .besetzung-main > td {
  background-color: #ffffff !important;
  background-image: linear-gradient(var(--row-accent, transparent), var(--row-accent, transparent)) !important;
  color: #212529 !important;
}
body.dark-mode .dark-mode-studio { background-color: var(--spo-ci-mid) !important; border-color: var(--spo-dark-border) !important;}
body.dark-mode .dark-mode-pro-edit-field { background-color: var(--spo-ci-mid) !important; border-color: var(--spo-ci-mid) !important;}
body.dark-mode .dark-mode-screenshot-preview { background-color: var(--spo-ci-mid) !important; border-color: var(--spo-dark-border) !important; }
body.dark-mode .stats-sum-row >td { background-color: var(--spo-ci-dark); color: var(--spo-ci-light); --bs-table-hover-bg: #3a5282;}
body.dark-mode .dark-mode-schulnote { --bs-btn-color: var(--spo-ci-light); --bs-btn-border-color: var(--spo-dark-border); --bs-btn-hover-color: var(--spo-ci-light);
                                --bs-btn-hover-bg: var(--spo-ci-mid); --bs-btn-hover-border-color: var(--spo-dark-border); --bs-btn-disabled-color: var(--spo-ci-light); -bs-btn-disabled-border-color: var(--spo-ci-light); }

body.dark-mode .day-header td { background-color: var(--spo-ci-mid) !important; color: var(--spo-ci-light); border-bottom-color: var(--spo-ci-mid) !important; }
body.dark-mode #loops-table .loop-header-dark td { background-color: var(--spo-ci) !important; color: var(--spo-ci-light); border-bottom-color: var(--spo-ci) !important; }
body.dark-mode #loops-table .loop-chevron { color: var(--spo-ci-light); border-color: rgba(255,255,255,.35); }
body.dark-mode .gebaut-switch { opacity: 0.8; }
body.dark-mode #plop-table > tbody > tr:not(.table-success):not(.table-warning):not(.day-header) > td { background-color: var(--spo-ci-light) !important; color: var(--spo-ci-dark) !important; }
body.dark-mode #plop-table > tbody > tr:not(.table-success):not(.table-warning):not(.day-header) > td .btn-plop-update { color: var(--spo-ci-dark) !important; }
body.dark-mode #plop-table > tbody > tr:hover > * { background-color: rgba(0,0,0,.07) !important; color: #000 !important; }
body.dark-mode .card { background-color: var(--spo-ci); --bs-card-border-color: var(--spo-dark-border); color: var(--spo-ci-light); }
body.dark-mode .bf-drag-handle { color: var(--spo-ci-light) !important; }
body.dark-mode #reportsStatsPanel .card.bg-light { background-color: var(--spo-ci-mid) !important; border-color: var(--spo-ci-mid) !important; }
body.dark-mode .bild-copy-link { color: var(--spo-ci-light) !important; }

body.dark-mode section.border-danger.bg-light { background-color: var(--spo-ci) !important; }

body.dark-mode .note-editor { border-color: var(--spo-dark-border) !important; }
#cron-table { border: 1px solid var(--spo-dark-border); }
body.dark-mode .note-toolbar { background-color: var(--spo-ci-mid) !important; border-bottom-color: var(--spo-dark-border) !important; }
body.dark-mode .note-toolbar .note-btn { border-color: var(--spo-dark-border) !important; color: var(--spo-ci-light) !important; background-color: var(--spo-ci-mid) !important; }
body.dark-mode .note-toolbar .note-btn:hover { background-color: var(--spo-ci) !important; }
body.dark-mode .note-toolbar .note-btn.active,
body.dark-mode .note-toolbar .note-btn[aria-pressed="true"] { background-color: var(--spo-ci) !important; }
body.dark-mode .note-toolbar .note-btn-group .dropdown-toggle::after { border-top-color: var(--spo-ci-dark); }
body.dark-mode .note-toolbar .dropdown-menu { background-color: var(--spo-ci-mid); border-color: var(--spo-dark-border); }
body.dark-mode .note-toolbar .dropdown-item { color: var(--spo-ci-light); }
body.dark-mode .note-toolbar .dropdown-item:hover { background-color: var(--spo-ci); }
body.dark-mode .note-editing-area { background-color: var(--spo-ci); }
body.dark-mode .note-editable { background-color: var(--spo-ci) !important; color: var(--spo-ci-light) !important; }
body.dark-mode .note-statusbar { background-color: var(--spo-ci-mid) !important; border-top-color: var(--spo-dark-border) !important; }
body.dark-mode .note-statusbar .note-icon-bar { border-top-color: var(--spo-dark-muted) !important; }

/* 2FA Zurücksetzen Modal – Dark Mode */
body.dark-mode #twofaResetModal .modal-content { background-color: var(--spo-ci); color: var(--spo-ci-light); border-color: var(--spo-ci-mid); }
body.dark-mode #twofaResetModal .modal-header  { border-bottom-color: var(--spo-ci-mid); }
body.dark-mode #twofaResetModal .modal-footer  { border-top-color: var(--spo-ci-mid); }
body.dark-mode #twofaResetModal .btn-close { filter: invert(1) grayscale(100%) brightness(200%); }
body.dark-mode #twofaResetModal .text-muted { color: var(--spo-dark-muted) !important; }

/* Passwort & Mail senden Modal – Dark Mode */
body.dark-mode #welcomeMailModal .modal-content { background-color: var(--spo-ci); color: var(--spo-ci-light); border-color: var(--spo-ci-mid); }
body.dark-mode #welcomeMailModal .modal-header  { border-bottom-color: var(--spo-ci-mid); }
body.dark-mode #welcomeMailModal .modal-footer  { border-top-color: var(--spo-ci-mid); }
body.dark-mode #welcomeMailModal .btn-close { filter: invert(1) grayscale(100%) brightness(200%); }
body.dark-mode #welcomeMailModal .text-muted { color: var(--spo-dark-muted) !important; }
body.dark-mode #welcomeMailModal hr { border-color: var(--spo-dark-border); opacity: 1; }
body.dark-mode #welcomeMailModal .form-label { color: var(--spo-ci-light); }
body.dark-mode #welcomeMailModal .form-check-label { color: var(--spo-ci-light); }
body.dark-mode #welcomeMailModal .form-control { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); border-color: var(--spo-dark-border); }
body.dark-mode #welcomeMailModal .form-control::placeholder { color: #8892a8; }
body.dark-mode #welcomeMailModal .form-control:focus { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); border-color: #6fc5d3; box-shadow: 0 0 0 .25rem rgba(111,197,211,.25); }
body.dark-mode #welcomeMailModal .btn-spo-outline { --bs-btn-color: var(--spo-ci-light); --bs-btn-border-color: var(--spo-dark-border); --bs-btn-hover-color: var(--spo-ci-light); --bs-btn-hover-bg: var(--spo-ci-mid); --bs-btn-hover-border-color: var(--spo-dark-border); }
body.dark-mode #welcomeMailModal .btn-secondary { background-color: var(--spo-ci-mid); border-color: var(--spo-dark-border); color: var(--spo-ci-light); }
body.dark-mode #welcomeMailModal .btn-secondary:hover { background-color: var(--spo-dark-border); border-color: var(--spo-dark-border); color: var(--spo-ci-light); }

/* TeamViewer-Chat Modal – Dark Mode */
body.dark-mode #tvChatModal .modal-content { background-color: var(--spo-ci); color: var(--spo-ci-light); border-color: var(--spo-ci-mid); }
body.dark-mode #tvChatModal .modal-header  { border-bottom-color: var(--spo-ci-mid); }
body.dark-mode #tvChatModal .btn-close { filter: invert(1) grayscale(100%) brightness(200%); }
body.dark-mode #tvChatModal .text-muted { color: var(--spo-dark-muted) !important; }
body.dark-mode #tvChatModal #tvChatMessages { border-color: var(--spo-ci-mid) !important; }
body.dark-mode #tvChatModal .form-control { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); border-color: var(--spo-dark-border); }
body.dark-mode #tvChatModal .form-control::placeholder { color: #8892a8; }
body.dark-mode #tvChatModal .form-control:focus { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); border-color: #6fc5d3; box-shadow: 0 0 0 .25rem rgba(111,197,211,.25); }

/* TeamViewer "Nachricht senden" Modal – Dark Mode (Summernote selbst ist bereits global dark-mode-gestylt, siehe .note-* oben) */
body.dark-mode #tvMailModal .modal-content { background-color: var(--spo-ci); color: var(--spo-ci-light); border-color: var(--spo-ci-mid); }
body.dark-mode #tvMailModal .modal-header  { border-bottom-color: var(--spo-ci-mid); }
body.dark-mode #tvMailModal .modal-footer  { border-top-color: var(--spo-ci-mid); }
body.dark-mode #tvMailModal .btn-close { filter: invert(1) grayscale(100%) brightness(200%); }
body.dark-mode #tvMailModal .form-control { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); border-color: var(--spo-dark-border); }
body.dark-mode #tvMailModal .form-control::placeholder { color: #8892a8; }
body.dark-mode #tvMailModal .form-control:focus { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); border-color: #6fc5d3; box-shadow: 0 0 0 .25rem rgba(111,197,211,.25); }
body.dark-mode #tvMailModal .form-floating > label { color: var(--spo-dark-muted); }

/* "Verfuegbare Sessions: N" -- fw-bold ohne Farbe erbt den Bootstrap-Default (dunkler Text), auf dem
   dunklen Seitenhintergrund unlesbar; Dark Mode braucht daher eine explizite Farbe wie andere Labels. */
body.dark-mode .tv-session-count { color: var(--spo-ci-light); }

/* TeamViewer-Chat Bubbles */
.tv-chat-bubble { max-width: 75%; padding: .5rem .75rem; border-radius: .75rem; background: #f1f1f1; }
.tv-chat-bubble-own { background: var(--spo-ci-light); }
body.dark-mode #tvChatModal .tv-chat-bubble { background: var(--spo-ci-mid); }
body.dark-mode #tvChatModal .tv-chat-bubble-own { background: var(--spo-ci); border: 1px solid var(--spo-ci-mid); }

/* 2. Navbar – Hauptnavigation
   ──────────────────────────────────────────────────────────────── */
.navbar-spo { background-color: var(--spo-ci) !important; box-shadow: 0 4px 6px -4px rgba(0,0,0,.2); }
.navbar-spo::after { content: ""; position: absolute; left: 0; bottom: 0; width: 100%; height: 3px; background-color: var(--spo-ci-dark); }
.navbar-spo .nav-link { color: rgba(255,255,255,.75); font-size: .875rem; box-shadow: inset 0 -2px 0 transparent; transition: color .15s ease, box-shadow .15s ease; }
.navbar-spo .nav-link:hover { color: #fff; box-shadow: inset 0 -2px 0 #6fc5d3; }
.navbar-spo .nav-link.active,
.navbar-spo .nav-item.show > .nav-link { color: #fff; font-weight: 600; }
.navbar-spo .dropdown-toggle { color: rgba(255,255,255,.75); }
.navbar-spo .dropdown-toggle:hover { color: #fff; box-shadow: inset 0 -2px 0 #6fc5d3; }
.navbar-spo .dropdown-toggle.active,
.navbar-spo .nav-item.show > .dropdown-toggle { color: #fff; font-weight: 600; }
/* Petrol-Hover-Unterstrich am User-Menü analog zu den übrigen nav-links */
.navbar-spo .user-menu-btn:hover { box-shadow: inset 0 -2px 0 #6fc5d3; }
.navbar-spo .nav-item.show > .user-menu-btn { color: #fff; font-weight: 600; }

/* Dropdown-Menüs (CI-Farben) */
.navbar-spo .dropdown-menu:not(.avail-menu) { background-color: var(--spo-ci); border: 1px solid rgba(255,255,255,.12); border-radius: .5rem; padding: .35rem 0; box-shadow: 0 8px 24px rgba(0,0,0,.3); margin-top: .35rem; --bs-dropdown-link-hover-bg: #6fc5d3; --bs-dropdown-link-hover-color: #000; --bs-dropdown-link-active-bg: #4da8b6; --bs-dropdown-link-active-color: #000; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item { color: rgba(255,255,255,.75); font-size: .85rem; padding: .45rem .85rem; transition: all .15s ease; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item:hover, .navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item:focus { color: #fff; background-color: #6fc5d3; color: #000; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item:active { color: #000; background-color: #4da8b6; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-divider { border-color: rgba(255,255,255,.12); margin: .25rem 0; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-header { color: rgba(255,255,255,.45); }

/* Hervorgehobener Admin-Eintrag: wichtige System-Einstellungen (Rot-Akzent) */
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system { color: #ef6b78; font-weight: 600; border-left: 3px solid #dc3545; padding-left: calc(.85rem - 3px); }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system i { color: #ef6b78; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system:hover, .navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system:focus, .navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system.active { color: #fff; background-color: #dc3545; }
.navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system:hover i, .navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system:focus i, .navbar-spo .dropdown-menu:not(.avail-menu) .dropdown-item.dropdown-item-system.active i { color: #fff; }

/* User-Dropdown (CI-Farben) */
.navbar-spo .dropdown-menu.dropdown-menu-end:not(.avail-menu) { background-color: var(--spo-ci); border: 1px solid rgba(255,255,255,.12); }

/* Nav-Labels: erst ab 1600px (Desktop) bzw. im Burger-Menü < lg */
.nav-label, .nav-label-rueckempfang { display: none; }
@media (max-width: 991.98px) { .nav-label, .nav-label-rueckempfang { display: inline; } }
@media (min-width: 1600px) { .nav-label, .nav-label-rueckempfang { display: inline; } }

/* Toggler (Burger) – 3-Linien → X-Morph */
.navbar-spo .navbar-toggler { align-items: center; justify-content: center; border-color: rgba(255,255,255,.25); padding: .35rem .55rem; line-height: 1; transition: background-color .2s ease, border-color .2s ease; }
.navbar-spo .navbar-toggler:hover,
.navbar-spo .navbar-toggler[aria-expanded="true"] { background-color: rgba(111,197,211,.18); border-color: #6fc5d3; }
.navbar-spo .navbar-toggler:hover .navbar-toggler-burger > span,
.navbar-spo .navbar-toggler[aria-expanded="true"] .navbar-toggler-burger > span { background: #fff; }
.navbar-spo .navbar-toggler:focus { box-shadow: none; }
.navbar-toggler-burger { display: block; position: relative; width: 22px; height: 16px; }
@media (max-width: 991.98px) { .navbar-spo .navbar-toggler { display: inline-flex; } }
.navbar-toggler-burger > span { position: absolute; left: 0; width: 100%; height: 2px; background: rgba(255,255,255,.9); border-radius: 2px; transition: top .25s ease .15s, transform .25s ease, opacity .15s ease; }
.navbar-toggler-burger > span:nth-child(1) { top: 0; }
.navbar-toggler-burger > span:nth-child(2) { top: 7px; }
.navbar-toggler-burger > span:nth-child(3) { top: 14px; }
.navbar-toggler[aria-expanded="true"] .navbar-toggler-burger > span { transition: top .25s ease, transform .25s ease .15s, opacity .15s ease; }
.navbar-toggler[aria-expanded="true"] .navbar-toggler-burger > span:nth-child(1) { top: 7px; transform: rotate(45deg); }
.navbar-toggler[aria-expanded="true"] .navbar-toggler-burger > span:nth-child(2) { opacity: 0; }
.navbar-toggler[aria-expanded="true"] .navbar-toggler-burger > span:nth-child(3) { top: 7px; transform: rotate(-45deg); }

/* Sender-Einträge in der Top-Nav */
.channel-nav-item { padding: .3rem .65rem !important; margin: .15rem .1rem; border-radius: .25rem; font-size: .8rem; font-weight: 500; color: rgba(255,255,255,.7) !important; border-bottom: 3px solid transparent; transition: all .15s ease; }
/* Petrol-Hover-Unterstrich aus .navbar-spo .nav-link:hover hier neutralisieren – kollidiert mit der Sender-Eigenfarbe (border-bottom-color) */
.navbar-spo .nav-link.channel-nav-item:hover,
.navbar-spo .nav-link.channel-group-toggle:hover { box-shadow: none; }
.channel-nav-item:hover { color: #fff !important; background-color: rgba(255,255,255,.1); }
.channel-nav-item.channel-nav-active { color: #000 !important; font-weight: 700; border-bottom-color: transparent !important; }

/* Channel-Gruppe (aufklappbar) */
.channel-group-wrapper { position: relative; align-items: center; }
.channel-group-toggle { color: rgba(255,255,255,.8) !important; font-size: .875rem; font-weight: 600; padding: .5rem .65rem !important; cursor: pointer; white-space: nowrap; transition: color .15s ease; }
.channel-group-toggle:hover { color: #fff !important; }
.channel-group-arrow { font-size: .65rem; transition: transform .3s ease; display: inline-block; }
.channel-group-toggle[aria-expanded="true"] .channel-group-arrow { transform: rotate(180deg); }
.channel-group-items { display: flex; flex-wrap: nowrap; align-items: center; max-width: 0; overflow: hidden; transition: max-width .4s cubic-bezier(.4,0,.2,1), opacity .3s ease; opacity: 0; background: var(--spo-ci-mid); border-radius: .35rem; padding: 0; margin: 0; white-space: nowrap; border: 1px solid transparent; box-shadow: none; }
.channel-group-items .nav-item { line-height: 1; }
.channel-group-items .channel-nav-item { padding: .2rem .55rem !important; margin: .1rem .05rem; font-size: .75rem; border-bottom-width: 2px; }
.channel-group-items.open { max-width: 1200px; opacity: 1; padding: .15rem .35rem; border-color: rgba(255,255,255,.1); box-shadow: 0 4px 12px rgba(0,0,0,.25); }

/* Mobile Channel-Gruppe */
.channel-group-toggle-mobile { color: rgba(255,255,255,.8) !important; font-size: .85rem; font-weight: 600; cursor: pointer; }
.channel-group-toggle-mobile:hover { color: #fff !important; }
.channel-group-arrow-mobile { font-size: .65rem; transition: transform .3s ease; display: inline-block; }
.channel-group-toggle-mobile[aria-expanded="true"] .channel-group-arrow-mobile { transform: rotate(180deg); }
.channel-group-items-mobile { background: rgba(0,0,0,.12); border-radius: .25rem; margin: .15rem 0 .15rem .5rem; padding: .1rem 0; }

/* Vertikaler Trenner */
.nav-divider { border-left: 1px solid rgba(255,255,255,.2); margin: .25rem .4rem; align-self: stretch; }

/* Verfügbarkeits-Button-Group (Datum + Dropdown in der Hauptnav) */
.avail-btngroup { vertical-align: middle; }
.avail-compact-link { display: none; color: rgba(255,255,255,.85); font-size: .85rem; font-weight: 600; text-decoration: none; padding-right: .1rem; }
.avail-compact-link:hover { color: #fff; }
.avail-date-btn { background: rgba(255,255,255,.85) !important; color: #1a1a1a !important; border: none !important; font-size: .8rem; font-weight: 600; line-height: 1.3; }
.avail-date-btn:hover { background: #fff !important; }
.avail-today-dot { display: inline-block; width: 12px; height: 12px; border-radius: 50%; border: 1px solid rgba(0,0,0,.15); margin: 0 .5rem; flex-shrink: 0; align-self: center; transition: background-color .15s ease; cursor: default; }
.avail-date-btn:focus { box-shadow: 0 0 0 .2rem rgba(255,255,255,.3) !important; }
.avail-split { border-left: 1px solid rgba(0,0,0,.15) !important; }
.avail-menu { min-width: 200px; padding: .35rem 0; border-radius: .5rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); border: 1px solid rgba(0,0,0,.08); }
.avail-menu .dropdown-item { display: flex; align-items: center; padding: .45rem .75rem; font-size: .85rem; transition: background .1s ease; }
.avail-menu .dropdown-item:hover { background: rgba(0,0,0,.04); }
.avail-menu .dropdown-item:active { background: rgba(0,0,0,.08); }
.avail-dot { display: inline-block; width: 12px; height: 12px; border-radius: 50%; margin-right: .5rem; flex-shrink: 0; border: 1px solid rgba(0,0,0,.1); }
.avail-color-bar { background: var(--bs-body-bg); border-bottom: 1px solid var(--bs-border-color); }
body.dark-mode .avail-color-bar { background: var(--spo-ci-dark) !important; border-bottom-color: var(--spo-dark-border) !important; }

/* Avail-Row im User-Dropdown (< 1200px) */
.avail-row-in-dropdown { padding: .5rem .85rem .4rem; border-bottom: 1px solid rgba(255,255,255,.12); margin-bottom: .15rem; }
.avail-row-in-dropdown .avail-row { flex-wrap: wrap; gap: .4rem; }
.avail-row-dropdown-label { display: block; font-size: .7rem; text-transform: uppercase; letter-spacing: .05em; color: rgba(255,255,255,.45); margin-bottom: .3rem; }

/* User-Menü-Button */
.user-menu-btn { color: rgba(255,255,255,.8) !important; font-size: .85rem; padding: .3rem .6rem; box-shadow: inset 0 -2px 0 transparent; transition: color .15s ease, box-shadow .15s ease; }
.user-menu-btn:hover { color: #fff !important; }

/* Navbar – Mobile (< 992px) */
@media (max-width: 991.98px) {
  .navbar-spo .navbar-collapse { padding: .25rem 0 1.5rem; border-top: 1px solid rgba(255,255,255,.15); margin-top: .25rem; max-height: calc(100dvh - 3.5rem); overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
  .navbar-spo .navbar-nav .nav-link { padding-top: .3rem; padding-bottom: .3rem; }
  .navbar-spo .dropdown-menu .dropdown-item { padding-top: .3rem; padding-bottom: .3rem; }
  .channel-nav-item { display: block; border-bottom: none; border-left: 3px solid transparent; border-radius: 0; padding: .25rem .75rem !important; margin: 0; font-size: .8rem; }
  .channel-nav-item.channel-nav-active { border-bottom: none !important; }
  .nav-divider { border-left: none; border-top: 1px solid rgba(255,255,255,.12); margin: .25rem 0; width: 100%; height: 0; }
  /* Bootstrap-Dropdown-Menü inline + Slide-Animation analog Channels-Mobile */
  .navbar-spo .dropdown-menu:not(.avail-menu),
  .navbar-spo .dropdown-menu.dropdown-menu-end:not(.avail-menu) { display: block; position: static !important; float: none; transform: none !important; width: 100%; max-height: 0; overflow: hidden; background-color: rgba(0,0,0,.12); border: none; border-radius: .25rem; padding: 0 0 0 .5rem; margin: 0 0 0 .5rem; box-shadow: none; transition: max-height .3s ease, padding .3s ease, margin .3s ease; }
  .navbar-spo .dropdown-menu:not(.avail-menu).show,
  .navbar-spo .dropdown-menu.dropdown-menu-end:not(.avail-menu).show { max-height: 600px; padding: .15rem 0 .15rem .5rem; margin: .15rem 0 .15rem .5rem; }
  /* Bootstrap ::after-Pfeil ausblenden – stattdessen eigener bi-chevron-down */
  .navbar-spo .dropdown-toggle::after { display: none !important; }
  .navbar-mobile-chevron { font-size: .65rem; transition: transform .3s ease; display: inline-block; }
  .navbar-spo .dropdown-toggle[aria-expanded="true"] .navbar-mobile-chevron { transform: rotate(180deg); }
  .navbar-spo-right { width: 100%; gap: .15rem; padding-top: .35rem; margin-top: .25rem; border-top: 1px solid rgba(255,255,255,.12); }
  .navbar-spo-right .nav-link, .navbar-spo-right .user-menu-btn { padding: .3rem 0 .3rem .75rem !important; width: 100%; text-align: left; }
  .navbar-spo-right .avail-row { padding: .15rem 0 .15rem .75rem; gap: .5rem; }
  .navbar-spo-right .avail-btngroup { width: auto; }
  .navbar-spo-right .avail-today-dot { margin: 0; }
  /* Top-Level-Items (Produktionen, Personal, Studio, Admin, Channels-Toggle) bündig mit .navbar-spo-right */
  .navbar-spo .navbar-nav > .nav-item > .nav-link { padding-left: .75rem !important; }
  /* Mehr Luft zwischen führendem Icon und Text */
  .navbar-spo .nav-link > .bi:first-child,
  .navbar-spo .user-menu-btn > .bi:first-child { margin-right: .55rem !important; }
}

/* 3. Navbar – Sub-Navigation (Sender-Ansichten)
   ──────────────────────────────────────────────────────────────── */
.navbar-spo-sub { padding: 0 1rem; min-height: auto; box-shadow: inset 0 1px 0 rgba(0,0,0,.05), 0 2px 4px -2px rgba(0,0,0,.1); }
.sub-nav-channel-name { font-size: .85rem; color: rgba(0,0,0,.65); white-space: nowrap; }
.sub-nav-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.sub-nav-scroll::-webkit-scrollbar { display: none; }
.sub-nav-link { padding: .4rem .75rem !important; font-size: .85rem; color: rgba(0,0,0,.6) !important; border-bottom: 2px solid transparent; transition: all .15s ease; white-space: nowrap; }
.sub-nav-link:hover { color: rgba(0,0,0,.85) !important; border-bottom-color: var(--spo-ci); }
.sub-nav-link.active { color: #000 !important; font-weight: 600; border-bottom-color: var(--spo-ci); }

/* Sub-Nav Download Button */
.sub-nav-download-btn { font-size: .8rem; padding: .25rem .6rem; border-color: rgba(0,0,0,.25); color: rgba(0,0,0,.6); }
.sub-nav-download-btn:hover, .sub-nav-download-btn:focus { border-color: rgba(0,0,0,.5); color: rgba(0,0,0,.85); background: rgba(255,255,255,.2); }

/* Sub-Nav EPG-Lock Button */
.sub-nav-lock-btn { font-size: .8rem; padding: .25rem .6rem; border-color: rgba(0,0,0,.25); color: rgba(0,0,0,.6); }
.sub-nav-lock-btn:hover, .sub-nav-lock-btn:focus { border-color: rgba(0,0,0,.5); color: rgba(0,0,0,.85); background: rgba(255,255,255,.2); }
.sub-nav-lock-btn.is-locked { border-color: var(--bs-danger); color: var(--bs-danger); background: rgba(255,255,255,.45); font-weight: 600; }
.sub-nav-lock-btn.is-locked:hover, .sub-nav-lock-btn.is-locked:focus { border-color: var(--bs-danger); color: #fff; background: var(--bs-danger); }

/* Sub-Nav – Dunkle Sender-Hintergründe: weiße Schrift */
.navbar-spo-sub-dark .sub-nav-channel-name { color: rgba(255,255,255,.85); }
.navbar-spo-sub-dark .sub-nav-link { color: rgba(255,255,255,.75) !important; }
.navbar-spo-sub-dark .sub-nav-link:hover { color: #fff !important; border-bottom-color: #fff; }
.navbar-spo-sub-dark .sub-nav-link.active { color: #fff !important; border-bottom-color: #fff; }
.navbar-spo-sub-dark .sub-nav-download-btn { border-color: rgba(255,255,255,.4); color: rgba(255,255,255,.8); }
.navbar-spo-sub-dark .sub-nav-download-btn:hover, .navbar-spo-sub-dark .sub-nav-download-btn:focus { border-color: rgba(255,255,255,.7); color: #fff; }
.navbar-spo-sub-dark .sub-nav-lock-btn { border-color: rgba(255,255,255,.4); color: rgba(255,255,255,.8); }
.navbar-spo-sub-dark .sub-nav-lock-btn:hover, .navbar-spo-sub-dark .sub-nav-lock-btn:focus { border-color: rgba(255,255,255,.7); color: #fff; }
.navbar-spo-sub-dark .sub-nav-lock-btn.is-locked { border-color: var(--bs-danger); color: #fff; background: var(--bs-danger); font-weight: 600; }
.navbar-spo-sub-dark .sub-nav-lock-btn.is-locked:hover, .navbar-spo-sub-dark .sub-nav-lock-btn.is-locked:focus { border-color: #bb2d3b; background: #bb2d3b; }

/* Sub-Nav – Mobile/Tablet (< 992px): nur Icons */
@media (max-width: 991.98px) {
  .navbar-spo-sub { padding: 0 .25rem; }
  .sub-nav-link { padding: .4rem .6rem !important; }
  .sub-nav-link .sub-nav-label { display: none; }
  .sub-nav-link .bi { font-size: 1rem; }
  .sub-nav-download-btn .sub-nav-label { display: none; }
  .sub-nav-download-btn { padding: .25rem .45rem; }
  .sub-nav-lock-btn .sub-nav-label { display: none; }
  .sub-nav-lock-btn { padding: .25rem .45rem; }
}

/* Produktionsübersicht – Filter-Collapse-Panels unter <1200px als eigene Zeile */
@media (max-width: 1199.98px) { .prod-filter-collapse    { flex-basis: 100% !important; order: 10; } }
/* Filter-Gruppen einheitlich klein halten: Label (input-group-text), ausgewählter Wert + nativ
   aufgeklappte Optionsliste (form-select/option) sowie Suchfelder (form-control). Sonst rendert
   das native Dropdown unter Windows/Chrome größer als das Steuerelement und das Label passt nicht
   zum Wert. Gilt für alle Kategorie-/Kunden-/Such-Filter der Produktionsübersichten + Signal.
   Hinweis: Select- UND form-control-Selektoren innerhalb einer input-group sind bewusst als
   `.input-group-sm > .form-…` (Spezifität 0,3,0) geschrieben, damit sie die iOS-Zoom-Regel weiter
   unten (`@max-width:767.98px .input-group-sm > .form-control/.form-select { font-size:16px }`,
   0,2,0) auch auf schmalen Viewports schlagen – sonst wirkt z. B. das Datums-Filterfeld größer als
   die Kategorie-/Ort-Selects daneben. Die Filterleiste soll bei jeder Breite einheitlich kompakt
   bleiben; die filtertypischen Datepicker-/Such-Inputs wiegen das (für iOS gedachte) Anti-Zoom hier
   nicht auf. Bare form-controls (ohne input-group) deckt schon `.…-collapse .form-control` ab. */
.prod-filter-collapse .input-group-sm > .form-select,
.prod-filter-collapse .input-group-sm > .form-control,
.prod-filter-collapse .form-select option,
.prod-filter-collapse .form-control,
.prod-filter-collapse .input-group-text,
.prod-filter-collapse-1500 .input-group-sm > .form-select,
.prod-filter-collapse-1500 .input-group-sm > .form-control,
.prod-filter-collapse-1500 .form-select option,
.prod-filter-collapse-1500 .form-control,
.prod-filter-collapse-1500 .input-group-text,
.signal-filter-collapse .input-group-sm > .form-select,
.signal-filter-collapse .input-group-sm > .form-control,
.signal-filter-collapse .form-select option,
.signal-filter-collapse .form-control,
.signal-filter-collapse .input-group-text { font-size: .8125rem; }
/* Produktions-Edit (#nav-tabContent): Formularfelder + native Select-Optionslisten
   einheitlich etwas kompakter (14px). Bewusst nur font-size – Hoehe/Padding der Felder
   bleiben unveraendert, damit die Bootstrap-Floating-Labels korrekt ueber dem Wert sitzen.
   Erst ab >=768px: unter 768px bleiben die Felder bei 16px, sonst zoomt iOS Safari beim
   Fokussieren eines Feldes hinein (font-size < 16px). */
@media (min-width: 768px) {
  #nav-tabContent .form-select,
  #nav-tabContent .form-select option,
  #nav-tabContent .form-control { font-size: .875rem; }
}
/* Variante fuer md-Breakpoint-Tabellen (Toggle bei <768px): stacked nur unter <768px */
@media (max-width:  767.98px) { .prod-filter-collapse-md { flex-basis: 100% !important; order: 10; } }
/* Variante fuer lg-Breakpoint-Tabellen (Toggle bei <992px): stacked nur unter <992px */
@media (max-width:  991.98px) { .prod-filter-collapse-lg { flex-basis: 100% !important; order: 10; } }
/* Variante fuer 720px-Tabellen (Toggle bei <720px): stacked nur unter <720px */
@media (max-width:  719.98px) { .prod-filter-collapse-720  { flex-basis: 100% !important; order: 10; } }
/* Variante fuer 1680px-Tabellen (Toggle bei <1680px): stacked nur unter <1680px */
@media (max-width: 1679.98px) { .prod-filter-collapse-1680 { flex-basis: 100% !important; order: 10; } }
/* Variante fuer 1500px-Tabellen (Toggle bei <1500px): stacked nur unter <1500px -- Produktionen-Filterleiste */
@media (max-width: 1499.98px) { .prod-filter-collapse-1500 { flex-basis: 100% !important; order: 10; } }
@media (min-width: 1500px) { .d-1500-none { display: none !important; } .d-1500-flex { display: flex !important; } }
@media (min-width: 1680px) { .d-1680-none { display: none !important; } }
@media (min-width: 1680px) { .d-1680-flex { display: flex !important; } }
/* Schmalste Tabellen-Spalten-Stufen (< 1200px vergeben) -- kollabieren zuletzt, kurz vor Mobile-Breite */
@media (min-width: 400px) { .d-400-table-cell { display: table-cell !important; } }
@media (min-width: 480px) { .d-480-table-cell { display: table-cell !important; } }
/* Zwischenstufe zwischen lg (992px) und xl (1200px) -- fuer Spalten, die zwischen zwei
   bestehenden Bootstrap-Breakpoints kollabieren sollen (z.B. Produktions-Liste: Email). */
@media (min-width: 1100px) { .d-1100-table-cell { display: table-cell !important; } }
/* Filter-Button-Labels ausblenden unter <420px (Icon-only) */
@media (max-width: 419.98px) { .filter-btn-label { display: none !important; } }
/* Produktionen-Filterleiste: Paging-Pfeile (#topPaging) rutschen unter <400px in eine zweite Zeile
   (flex-wrap der Toolbar) -- dort rechtsbuendig statt am linken Rand der neuen Zeile. */
@media (max-width: 399.98px) { #topPaging { margin-left: auto; } }
/* Filter-Button-Labels ausblenden unter <720px (Icon-only) */
@media (max-width: 719.98px) { .filter-btn-label-720 { display: none !important; } }
/* Custom 720px-Breakpoint-Utilities (kein Bootstrap-Standard) */
@media (min-width: 720px) { .d-720-none { display: none !important; } }
@media (min-width: 720px) { .d-720-flex { display: flex !important; } }
/* Produktions-Reports – Filtergruppen-Zeile unter <800px nach oben schieben */
@media (max-width: 799.98px) { .reports-btngroup-row { flex-basis: 100% !important; order: -1; } }
/* Produktions-Reports – Btn-Groups noch kleiner unter <576px */
@media (max-width: 575.98px) { .reports-btngroup-row .btn { padding: .21rem .415rem; font-size: .726rem; } }
/* Besetzungsübersicht – Quick-Besetzung unter <576px als vertikaler Stack */
@media (max-width: 575.98px) { .quick-besetzung { flex-direction: column; align-items: flex-start; width: 100%; } }
/* Playlist-Operating – Gebaut-Switches unter <576px 25% kleiner */
@media (max-width: 575.98px) { .gebaut-switch { transform: scale(0.75); } }

/* Signal-Übersicht – Filter-Collapse-Panels unter <922px als eigene Zeile */
@media (max-width: 921.98px) { .d-signal-lg-none { display: flex !important; } .signal-filter-collapse { flex-basis: 100% !important; order: 10; } }
@media (min-width: 922px) { .d-signal-lg-none { display: none !important; } .d-signal-lg-flex { display: flex !important; } }

/* Sub-Nav – sehr klein (< 440px): Icons verkleinern */
@media (max-width: 439.98px) {
  .sub-nav-link .bi { font-size: .75rem; }
  .sub-nav-link { padding: .4rem .45rem !important; }
}

/* 3b. Tabs (nav-tabs) – CI-Anpassung
   ──────────────────────────────────────────────────────────────── */
.nav-tabs { border-bottom: none; gap: .35rem; }
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { color: #fff; background-color: var(--spo-ci); border-color: var(--spo-ci); border-bottom: none; position: relative; z-index: 2; box-shadow: 0 -2px 8px rgba(0,0,0,.08); }
.nav-tabs .nav-link { color: var(--spo-ci); border: 1px solid #dee2e6; background-color: #f8f9fa; transition: none; border-radius: .375rem .375rem 0 0; }
.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { color: #fff; background-color: var(--spo-ci-mid); border-color: var(--spo-ci-mid); }
.tab-pane:focus { outline: none; }
.tab-content { background: #fff; border: 1px solid #dee2e6; border-radius: 0 .375rem .375rem .375rem; padding: 1.25rem; box-shadow: 0 2px 12px rgba(0,0,0,.06); }

/* 4. Breadcrumbs
   ──────────────────────────────────────────────────────────────── */
.breadcrumb { align-items: center; }
.breadcrumb-item { display: inline-flex; align-items: center; }
.breadcrumb-item + .breadcrumb-item::before { float: none; display: inline-flex; align-items: center; font-family: "bootstrap-icons"; content: "\f231"; color: var(--bs-secondary-color); font-size: .85em; line-height: 1; }
.breadcrumb a { text-decoration: none; }
.breadcrumb a:hover { text-decoration: underline; }
/* Einheitliche Abstände: Breadcrumbs haben projektweit den gleichen oberen/unteren Abstand, unabhängig vom umgebenden Wrapper (py-1, py-3 etc.). */
.breadcrumb { margin-top: .5rem; margin-bottom: .75rem; }

/* Einzeilig statt Umbruch: bei Überlänge horizontal scrollbar (statt 2–3 Zeilen Höhe). */
.breadcrumb { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.breadcrumb::-webkit-scrollbar { display: none; }
.breadcrumb-item { white-space: nowrap; }
/* Lange Labels kürzen — das aktive (letzte) Element füllt den restlichen Platz
   der tatsächlich verfügbaren Container-Breite und wird erst dann per Ellipsis
   gekürzt, statt auf eine feste Viewport-Breite (vw) begrenzt zu werden. */
.breadcrumb-item.active { display: block; flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 575.98px) {
  /* Home auf reines Icon reduzieren (spart Platz, Icon bleibt erkennbar). */
  .brteadcrump-home a .home-label { display: none; }
  .brteadcrump-home a .bi { margin-right: 0 !important; }
}

/* 5. Buttons
   ──────────────────────────────────────────────────────────────── */
/* Snappy Hover: Bootstrap-Default ist transition 0.15s auf allen Btn-Eigenschaften.
   Das fuehrt bei Outline-Buttons zu sichtbaren Zwischenzustaenden (z.B. Text noch
   in Outline-Farbe waehrend BG schon hover-Farbe ist). transition:none macht den
   Hover-Wechsel instant. */
.btn { transition: none; }
.btn-spo { --bs-btn-color: #fff; --bs-btn-bg: var(--spo-ci); --bs-btn-border-color: var(--spo-ci); --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--spo-ci-mid); --bs-btn-hover-border-color: var(--spo-ci-mid); --bs-btn-active-color: #fff; --bs-btn-active-bg: var(--spo-ci-dark); --bs-btn-active-border-color: var(--spo-ci-dark); --bs-btn-disabled-color: #fff; --bs-btn-disabled-bg: var(--spo-ci); --bs-btn-disabled-border-color: var(--spo-ci); --bs-btn-disabled-opacity: .45; }
.btn-spo-outline { --bs-btn-color: var(--spo-ci); --bs-btn-border-color: var(--spo-ci); --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--spo-ci); --bs-btn-hover-border-color: var(--spo-ci); --bs-btn-active-color: #fff; --bs-btn-active-bg: var(--spo-ci-mid); --bs-btn-active-border-color: var(--spo-ci-mid); --bs-btn-disabled-color: var(--spo-ci); --bs-btn-disabled-border-color: var(--spo-ci); --bs-btn-disabled-opacity: .45; }
.btn-spo-outline.active, .btn-spo-outline[aria-pressed="true"] { color: #fff; background-color: var(--spo-ci); border-color: var(--spo-ci); }
/* Filter-Toggle-Buttons mit geöffnetem Panel (.filter-active via spo.inc.js): nur die grüne
   text-success-Färbung zeigen. Bootstraps grauer Hover-/Active-/Focus-Hintergrund (v.a. bei
   btn-outline-secondary) blitzt sonst auf, solange der Cursor nach dem Klick auf dem Button
   bleibt, und beißt sich mit der Erfolgs-/CI-Färbung. Border wird auf success angeglichen. */
.filter-active.dark-mode-btn,
.filter-active.dark-mode-btn:hover,
.filter-active.dark-mode-btn:focus,
.filter-active.dark-mode-btn:active {
  background-color: transparent !important;
  border-color: var(--bs-success) !important;
  box-shadow: none !important;
}
@media (max-width: 991.98px) { .btn-spo-outline span, a.btn-spo span { display: none !important; } a.btn-spo .bi { margin-right: 0 !important; } }
/* DFB-Produktionsplanung, Ausnahmen von der Icon-only-Regel darueber: In der Produktions-Liste sind die
   Filter-Buttons mobil ohnehin auf Icons reduziert -- fuer "Neuer Eintrag" ist also Platz. Und in der
   aufgeklappten Detailzeile (.dfb-detail) steht die volle Zeilenbreite zur Verfuegung. */
@media (max-width: 991.98px) {
  #dfb-new-btn span { display: inline !important; }
  #dfb-new-btn .bi { margin-right: inherit !important; }
  .dfb-detail .btn-spo-outline span.dfb-btn-label { display: inline !important; }
}
/* Unterhalb 600px reicht der Platz neben "Archiv"/Filterleiste nicht mehr fuer die volle Beschriftung --
   Regel muss nach der 991.98px-Ausnahme oben stehen, um deren "immer inline" bei gleicher Spezifitaet
   (beide !important) per Reihenfolge zu ueberstimmen. */
@media (max-width: 599.98px) {
  #dfb-new-btn span { display: none !important; }
}
/* Planungs-Liste (dfb-produktionsplanung.inc.php, produktionsPlanungTable()): Zeilen, deren Datum+Beginn
   mehr als 3 Stunden in der Vergangenheit liegen (planungStartPast()), per diagonalem Streifenmuster
   markieren -- bewusst kein Opacity/Volltonfarbe, Text/Icons bleiben normal lesbar. Bootstrap 5.3 setzt
   ueber ".table > :not(caption) > * > *" ein eigenes DECKENDES background-color (var(--bs-table-bg)) direkt
   auf jede <td> -- ein Hintergrund am <tr> selbst wird davon also vollstaendig verdeckt (erste Version
   dieser Regel war deshalb unsichtbar). Das Bild muss also an der <td> sitzen; damit das Streifenmuster
   trotzdem an jeder Zellgrenze nahtlos weiterlaeuft statt pro Zelle neu bei Koordinate 0 anzusetzen, wird
   der Gradient per background-attachment:fixed am Viewport statt am jeweiligen Element verankert (Standard-
   Trick fuer ein ueber mehrere Geschwister-Elemente hinweg zusammenhaengendes Hintergrundmuster). Die
   Streifen sind ein durchscheinendes Schwarz/Weiss statt eines festen Grautons, damit sie sich automatisch
   an Light/Dark Mode anpassen. Gilt auch fuer die per JS (dfb-produktionsplanung.inc.js) an die
   DataTables-Collapse-Zeile weitergereichte Klasse. */
#dfb-produktionsplanung-table tr.dfb-planung-expired > td {
  background-image: repeating-linear-gradient(45deg, rgba(0, 0, 0, .07), rgba(0, 0, 0, .07) 6px, transparent 6px, transparent 12px);
  background-attachment: fixed;
}
body.dark-mode #dfb-produktionsplanung-table tr.dfb-planung-expired > td {
  background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, .07), rgba(255, 255, 255, .07) 6px, transparent 6px, transparent 12px);
  background-attachment: fixed;
}
/* Bedarf-Tabelle in der aufgeklappten Detailzeile (dfb-produktionsplanung.inc.js, buildBedarfHtml()):
   dieselbe Streifenmarkierung, wenn die zugehoerige Planung abgelaufen ist (Klasse wird dort direkt an
   .dfb-bedarf-table gesetzt statt an ein <tr>) -- inklusive der beiden <thead>-Zeilen (rowspan/colspan-
   Kopfzeilen von buildBedarfHtml()), nicht nur der Datenzeilen. .dfb-bedarf-table ist laut Kommentar an
   ihrer Definition bewusst immer hell, auch im Dark Mode -- deshalb hier nur die helle Variante, keine
   body.dark-mode-Regel. */
.dfb-bedarf-table.dfb-planung-expired > tbody > tr > td,
.dfb-bedarf-table.dfb-planung-expired > thead > tr > th {
  background-image: repeating-linear-gradient(45deg, rgba(0, 0, 0, .07), rgba(0, 0, 0, .07) 6px, transparent 6px, transparent 12px);
  background-attachment: fixed;
}
/* Bedarf-Tabelle in der aufgeklappten Detailzeile: "keine Daten"-Icons (boolIcon()/scoopaIcon()/
   youtubeIcon() in dfb-produktionsplanung.inc.js, alle .text-muted) sollen wie im Light Mode aussehen --
   .dfb-bedarf-table bleibt laut Definition bewusst immer hell, auch im Dark Mode. Ohne diese Regel greift
   aber "body.dark-mode .dark-mode-table .text-muted" (oben) trotzdem durch, weil die Bedarf-Tabelle als
   Collapse-Zeile innerhalb von #dfb-produktionsplanung-table.dark-mode-table im DOM haengt -- die Icons
   wuerden dann in der helleren Dark-Mode-Mutedfarbe (--spo-dark-muted) statt im normalen Bootstrap-Grau
   erscheinen und auf hellem Grund kaum noch zu erkennen sein. ID-Praefix fuer ausreichend Spezifitaet
   gegenueber der !important-Regel oben. */
body.dark-mode #dfb-produktionsplanung-table .dfb-bedarf-table .text-muted {
  color: var(--bs-secondary-color) !important;
}
/* Signalquelle-Auswahl-Button (dfb-produktionsplanung.inc.php): input-group aus form-floating-Input +
   Dropdown-Button. Bootstraps input-group-Randradius-Reset zielt nur auf direkte .form-control-Kinder --
   das Input steckt hier aber in einem .form-floating-Wrapper, deshalb rechte Ecken hier manuell kappen,
   damit Input und Button wie ein zusammenhaengendes Feld wirken (offizieller Bootstrap-Workaround fuer
   "form-floating in input-group"). */
.dfb-quelle-group > .form-floating { flex: 1 1 auto; width: 1%; }
.dfb-quelle-group > .form-floating .form-control { border-top-right-radius: 0; border-bottom-right-radius: 0; }
/* Der Button bleibt bewusst ein neutraler btn-outline-secondary (statt der markanten CI-blauen
   btn-spo-outline) und uebernimmt zusaetzlich exakt Randfarbe + Hintergrund von .form-control, damit er
   wie ein Teil des Signalquelle-Feldes wirkt statt wie ein eigenstaendiges Bedien-Element daneben. Reines
   Icon, kein zusaetzliches Bootstrap-Caret-Dreieck neben dem bi-chevron-down-Icon. Bewusst KEINE eigene
   body.dark-mode-Regel: btn-outline-secondary ist per Bootstrap-Default transparent, und im Dark Mode
   sitzt der Button auf einer .card mit dunklem Hintergrund (siehe body.dark-mode .card oben) -- ohne
   expliziten Hintergrund wuerde das Dunkel der Card durchscheinen, waehrend .form-control (immer explizit
   --bs-body-bg, in diesem Projekt unveraendert weiss) daneben hell bleibt. Deshalb Hintergrund hier fix
   auf --bs-body-bg gesetzt, damit Button und Input in beiden Modi identisch aussehen. */
.dfb-quelle-picker-btn {
  --bs-btn-bg: var(--bs-body-bg, #fff);
  --bs-btn-hover-bg: var(--bs-tertiary-bg, #f8f9fa);
  --bs-btn-active-bg: var(--bs-tertiary-bg, #f8f9fa);
  --bs-btn-border-color: var(--bs-border-color, #dee2e6);
  --bs-btn-hover-border-color: var(--bs-border-color, #dee2e6);
  --bs-btn-active-border-color: var(--bs-border-color, #dee2e6);
  --bs-btn-hover-color: #000;
  --bs-btn-active-color: #000;
}
.dfb-quelle-picker-btn::after { display: none !important; }
/* Filter-Toggle-Buttons: Beschriftung ab 576px anzeigen, auch wenn btn-spo-outline sonst bei <992px Icon-only ist */
@media (min-width: 576px) { .filter-toggle-group .btn-spo-outline span { display: inline !important; } }
/* Produktionen-Filterleiste: Toggle-Buttons (Anzahl/Datum/Kategorie/Ort/Suche) erst ab 620px mit Text, sonst Icon-only */
@media (min-width: 620px) { .d-620-inline { display: inline !important; } }
/* Benutzerverwaltung Filter-Toggle: Beschriftung erst ab 720px anzeigen */
@media (min-width: 720px) { .bu-filter-toggle-group .btn-spo-outline span { display: inline !important; } }
/* Playlist-Operating Aktualisieren-Button: Text ab 992px anzeigen */
@media (min-width: 992px) { .btn-plop-update span { display: inline !important; } }
/* Neues-Gerät-Button (Empfangsgeraete): Text ab 420px anzeigen, Icon-only nur darunter */
@media (min-width: 420px) { #new_empfangsgeraet span { display: inline !important; } #new_empfangsgeraet .bi { margin-right: inherit !important; } }
@media (min-width: 420px) { #ks-new-btn span { display: inline !important; } #ks-new-btn .bi { margin-right: inherit !important; } }
@media (min-width: 420px) { #kt-new-btn span { display: inline !important; } #kt-new-btn .bi { margin-right: inherit !important; } }
.btn-petrol { --bs-btn-color: #000; --bs-btn-bg: #6fc5d3; --bs-btn-border-color: #6fc5d3; --bs-btn-hover-color: #000; --bs-btn-hover-bg: #55b8c8; --bs-btn-hover-border-color: #4db0c0; --bs-btn-active-color: #000; --bs-btn-active-bg: #4db0c0; --bs-btn-active-border-color: #45a8b8; --bs-btn-disabled-color: #000; --bs-btn-disabled-bg: #6fc5d3; --bs-btn-disabled-border-color: #6fc5d3; --bs-btn-disabled-opacity: .45; }
.btn-petrol-outline { --bs-btn-color: #3a8fa0; --bs-btn-border-color: #6fc5d3; --bs-btn-hover-color: #000; --bs-btn-hover-bg: #6fc5d3; --bs-btn-hover-border-color: #6fc5d3; --bs-btn-active-color: #000; --bs-btn-active-bg: #55b8c8; --bs-btn-active-border-color: #4db0c0; --bs-btn-disabled-color: #3a8fa0; --bs-btn-disabled-border-color: #6fc5d3; --bs-btn-disabled-opacity: .45; }

/* Collapse-Toggle: dreht das Chevron-Icon je nach aria-expanded-Status */
.btn-collapse-toggle .bi { display: inline-block; transition: transform .2s ease-in-out; }
.btn-collapse-toggle[aria-expanded="true"] .bi { transform: rotate(180deg); }

/* Section-Header als Inline-Trigger (dezent, ohne Button-Border) - rotiert nur das Chevron */
.collapse-section-toggle { cursor: pointer; user-select: none; }
.collapse-section-toggle .bi-chevron-down { display: inline-block; transition: transform .2s ease-in-out; }
.collapse-section-toggle[aria-expanded="true"] .bi-chevron-down { transform: rotate(180deg); }
.collapse-section-toggle:hover { color: var(--spo-ci) !important; }

/* 6. Tabellen – Header & Basis
   ──────────────────────────────────────────────────────────────── */
.table thead th, .table thead td, table.dataTable thead th, table.dataTable thead td { background-color: var(--spo-ci) !important; color: #fff !important; font-weight: 600; font-size: .875rem; letter-spacing: .02em; white-space: nowrap; border: none !important; border-bottom: 2px solid var(--spo-table-border) !important; padding: .55rem .75rem; }
.table.table-striped > tbody > tr:nth-of-type(odd) > * { --bs-table-bg-type: var(--spo-ci-stripe); }
.table.table-sm { font-size: .875rem; }

/* 7. Tabellen – Spezialzeilen
   ──────────────────────────────────────────────────────────────── */
.table .day-header td { background-color: var(--spo-ci-light) !important; color: #000; font-weight: 700; border-bottom: 2px solid var(--spo-ci) !important; padding: .35rem .75rem !important; }
.table .row-gap td { background-color: #fff8e1 !important; color: #856404; }
.table .row-overlap td { background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, rgba(220,53,69,.10) 4px, rgba(220,53,69,.10) 6px) !important; }
.table .sinl-row td { color: #888 !important; font-style: italic; background-color: #fafbfd !important; }

/* Inline-Kommentare (INFO/MCR) in Titel-Zellen: Breite kappen + harten Umbruch erzwingen,
   damit lange Kommentare (bzw. unbrechbare Tokens/URLs) die Spalte nicht aufweiten und
   DataTables Responsive die Spalte auf schmalen Viewports nicht komplett kollabiert. */
.kommentar-inline, .mcr-kommentar-inline { max-width: 360px; overflow-wrap: anywhere; word-break: break-word; }
@media (max-width: 575.98px) { .kommentar-inline, .mcr-kommentar-inline { max-width: 100%; } }

/* Datenbank-Fehler-Alert (databaseErrorAlert()): Details-Button mit drehendem Caret,
   SQL-Text klein im Code-Pink (#d63384). mx-2 am Alert haelt mobil Abstand zu den Raendern. */
.db-error-alert { padding: 1.25rem 1.5rem; }
.db-error-toggle .db-error-caret { display: inline-block; transition: transform .15s ease; }
.db-error-toggle[aria-expanded="true"] .db-error-caret { transform: rotate(90deg); }
.db-error-sql { font-size: .8125rem; color: #d63384; max-height: 250px; overflow: auto; overflow-wrap: anywhere; word-break: break-word; background-color: #fff; padding: .75rem 1rem; }

/* Publikations-Info-Leiste (Letzte Publikation / Zeitraum / Einträge) */
.publish-info .publish-info-label { font-size: .68rem; letter-spacing: .03em; line-height: 1.2; margin-bottom: .1rem; }
.publish-info .border-sm-end { border-right: 0; }
.publish-info .border-sm-bottom-0 { }
@media (min-width: 576px) {
  .publish-info .border-sm-end { border-right: 1px solid var(--bs-border-color); }
  .publish-info .border-sm-bottom-0 { border-bottom: 0 !important; }
}
body.dark-mode .publish-info { background-color: var(--spo-ci-mid); color: var(--spo-ci-light); }
body.dark-mode .publish-info .publish-info-label { color: #aab4cc !important; }
body.dark-mode .publish-info .border-sm-end,
body.dark-mode .publish-info .border-top,
body.dark-mode .publish-info .border-bottom { border-color: #485a8b !important; }

/* 8. Tabellen – Loops
   ──────────────────────────────────────────────────────────────── */
#loops-table .loop-header td { background-color: var(--spo-ci-light) !important; border-bottom: 2px solid var(--spo-ci) !important; padding: .4rem .75rem !important; }
/* Loop-Aufklapp-Chevron als umrandetes Kaestchen – Stil wie das dtr-control der Uebersichten. */
#loops-table .loop-chevron { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; font-size: .75rem; line-height: 1 !important; color: #6c757d; border: 1px solid #ced4da; border-radius: .25rem; vertical-align: middle; }
#loops-table .loop-rows td { padding-left: 1.5rem; }
.loop-pos { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background-color: var(--spo-ci); color: #fff; font-size: .7rem; font-weight: 600; line-height: 1; }

@media (max-width: 767.98px) {
  #loops-table th:nth-child(1), #loops-table td:nth-child(1), #loops-table th:nth-child(2), #loops-table td:nth-child(2), #loops-table th:nth-child(5), #loops-table td:nth-child(5), #loops-table th:nth-child(7), #loops-table td:nth-child(7) { display: none; }
}
@media (max-width: 575.98px) {
  #loops-table th:nth-child(6), #loops-table td:nth-child(6) { display: none; }
}
/* colspan-Zeilen (Loop-Header, "Keine Sendungen") nie ausblenden – sie bestehen nur aus td:nth-child(1) */
#loops-table td[colspan] { display: table-cell !important; }

/* 9. Tabellen – Thumbnails
   ──────────────────────────────────────────────────────────────── */
/* Platzhalter "kein Bild verknuepft": neutrale dunkelgraue Border + durchgestrichenes
   Bild-Icon (Diagonale via ::after, da bootstrap-icons kein bi-image-slash hat). */
.thumb-placeholder { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 60px; height: 34px; background-color: #f1f3f5; border: 1px solid #6c757d; border-radius: 3px; color: #6c757d; font-size: .9rem; }
.thumb-placeholder::after { content: ""; position: absolute; top: 50%; left: 50%; width: 1.15em; height: 0; border-top: 1.5px solid currentColor; transform: translate(-50%, -50%) rotate(-45deg); pointer-events: none; }
.screenshot-thumb-preview { position: relative; display: inline-flex; width: 80px; height: 45px; padding: 0; border: 0; border-radius: 4px; overflow: hidden; background: #000; cursor: zoom-in; vertical-align: middle; }
/* Fluid-Variante (volle Breite, Hoehe automatisch) fuer die Produktions-Karte im Sendungs-Edit.
   Hoehere Spezifitaet (.screenshot-thumb-preview.screenshot-thumb-preview-fluid), damit die
   weiter unten definierten Fix-Groessen der Basisklasse nicht ueberschreiben. */
.screenshot-thumb-preview.screenshot-thumb-preview-fluid { display: block; width: 100%; height: auto; }
.screenshot-thumb-preview.screenshot-thumb-preview-fluid img { width: 100%; height: auto; object-fit: contain; }
.screenshot-thumb-preview.screenshot-thumb-preview-fluid .screenshot-thumb-preview-icon { font-size: 1.75rem; }
/* Kompakte Variante (60x34) fuer die Produktionsuebersicht – gleiche Hover/Lightbox-Mechanik. */
.screenshot-thumb-preview-sm { width: 60px; height: 34px; }
.screenshot-thumb-preview-sm img { width: 60px; height: 34px; }
.screenshot-thumb-preview-sm .screenshot-thumb-preview-icon { font-size: 1rem; }
.screenshot-thumb-preview img { width: 80px; height: 45px; object-fit: cover; display: block; transition: transform .18s ease, opacity .18s ease; }
.screenshot-thumb-preview-icon { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 1.25rem; background: rgba(0,0,0,.35); opacity: 0; transition: opacity .18s ease; pointer-events: none; }
.screenshot-thumb-preview:hover img, .screenshot-thumb-preview:focus-visible img { transform: scale(1.04); opacity: .82; }
.screenshot-thumb-preview:hover .screenshot-thumb-preview-icon, .screenshot-thumb-preview:focus-visible .screenshot-thumb-preview-icon { opacity: 1; }
.screenshot-lightbox { position: fixed; inset: 0; z-index: 10050; display: none; align-items: center; justify-content: center; padding: 4vh 4vw; background: rgba(0,0,0,.88); cursor: zoom-out; }
.screenshot-lightbox.is-open { display: flex; }
/* Titel der verknuepften Produktion im Sendungs-Edit: kompakt, damit lange Titel nicht umbrechen. */
.prod-card-title { font-size: 1rem; line-height: 1.3; }
@media (min-width: 768px) { .prod-card-title { font-size: 1.1rem; } }
.screenshot-lightbox img { max-width: min(92vw, 1920px); max-height: 92vh; width: auto; height: auto; border-radius: 6px; box-shadow: 0 18px 60px rgba(0,0,0,.55); background: #111; }

/* 10. DataTables – Sortierung
   ──────────────────────────────────────────────────────────────── */
.table thead th.sorting, .table thead th.sorting_asc, .table thead th.sorting_desc, .table thead th[class*="dt-orderable"] { cursor: pointer; position: relative; padding-right: 1.5rem !important; background-image: none !important; }
.table thead th.sorting::after, .table thead th.dt-orderable-asc.dt-orderable-desc:not(.dt-ordering-asc):not(.dt-ordering-desc)::after { content: "↕"; position: absolute; right: .5rem; top: 50%; transform: translateY(-50%); opacity: .35; font-size: .75rem; }
.table thead th.sorting_asc::after, .table thead th.dt-ordering-asc::after { content: "▲"; position: absolute; right: .5rem; top: 50%; transform: translateY(-50%); opacity: .9; font-size: .55rem; }
.table thead th.sorting_desc::after, .table thead th.dt-ordering-desc::after { content: "▼"; position: absolute; right: .5rem; top: 50%; transform: translateY(-50%); opacity: .9; font-size: .55rem; }
.table thead th.sorting:hover, .table thead th[class*="dt-orderable"]:hover { background-color: var(--spo-ci-mid); }
.table thead th.sorting:hover::after, .table thead th[class*="dt-orderable"]:hover::after { opacity: .7; }

/* 11. DataTables – Pagination & Info
   ──────────────────────────────────────────────────────────────── */
/* Info-Zeile ("Zeige 1 bis 50 von … Einträgen") – entspricht Bootstrap .small.text-muted */
.dt-info { font-size: 0.875em; color: #6c757d; padding: 1rem 0.75rem 0.5rem 0; text-align: right; }

.dt-paging { display: flex; justify-content: center; margin-top: 1rem; gap: 0.8rem; }
.dt-paging-button { display: inline-block; min-width: 35px; padding: 0.25rem 0.5rem; margin: 0.25rem; font-size: 0.8rem; font-weight: 400; text-align: center; color: #6c757d; background-color: #f8f9fa; border: 1px solid #dee2e6; border-radius: 0.25rem; cursor: pointer; transition: all 0.2s ease-in-out; }
.dt-paging-button:hover:not(.disabled) { background-color: #e9ecef; color: #495057; border-color: #ced4da; }
.dt-paging-button.current { background-color: #dee2e6; color: #495057; border-color: #adb5bd; }
.dt-paging-button.disabled { cursor: not-allowed; opacity: 0.5; }

@media (max-width: 576px) {
  .dt-paging-button { min-width: 30px; padding: 0.2rem 0.4rem; font-size: 0.75rem; }
}

body.dark-mode .dt-paging-button { color: var(--spo-ci-light); background-color: var(--spo-ci); border-color: var(--spo-dark-border); }
body.dark-mode .dt-paging-button:hover:not(.disabled) { color: var(--spo-ci-light); background-color: var(--spo-ci-mid); border-color: var(--spo-dark-border); }
body.dark-mode .dt-paging-button.current { color: var(--spo-ci-light); background-color: var(--spo-ci-mid); border-color: #6fc5d3; }
body.dark-mode .dt-paging-button.disabled { color: #6c7a99; background-color: var(--spo-ci); border-color: #2d3f63; }

/* 12. Tabellen – SPO Legacy (table-spo)
   ──────────────────────────────────────────────────────────────── */
.table-spo-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.table-spo { width: 100%; border-collapse: collapse; font-size: 0.875rem; background-color: #fff; border: none; }
.table-spo thead tr { background-color: var(--spo-ci); color: #fff; }
.table-spo thead th { padding: 0.55rem 0.75rem; font-weight: 600; letter-spacing: 0.02em; white-space: nowrap; border: none; border-bottom: 2px solid var(--spo-table-border); }
.table-spo tbody tr td { vertical-align: middle; border: none; border-bottom: 1px solid var(--spo-table-border); }
.table-spo .row-overlap, .table-spo .row-gap { scroll-margin-top: 80px; }
.table-spo .row-overlap td { background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, rgba(220,53,69,.10) 4px, rgba(220,53,69,.10) 6px); }
.table-spo .row-overlap:hover td { background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, rgba(220,53,69,.18) 4px, rgba(220,53,69,.18) 6px); }
.table-spo .row-gap td { background-color: #fff8e1; color: #856404; }
.table-spo tbody tr:nth-child(even):not(.day-header):not(.sinl-row):not(.row-gap):not(.row-overlap) { background-color: var(--spo-ci-stripe); }
.table-spo tbody tr:not(.day-header):hover td { background-color: rgba(var(--bs-spo-ci-stripe), 0.075); transition: background-color 0.12s ease; }
.table-spo .day-header td { background-color: var(--spo-stripe-mid); color: #000; font-weight: 700; border-bottom: 2px solid var(--spo-ci); }
#skyspots-table .day-header td,
#report-table .day-header td { background-color: var(--spo-ci) !important; color: #fff !important; border-bottom-color: var(--spo-ci-dark) !important; }
#skyspots-table thead th { position: sticky; top: 59px; z-index: 5; border-bottom: 0 !important; box-shadow: 0 2px 0 0 var(--spo-table-border); }
#skyspots-table .day-header td { position: sticky; top: var(--skyspots-dayheader-top, 99px); z-index: 4; }
.table-spo .sinl-row td { color: #888; font-style: italic; background-color: #fafbfd; }
.table-spo .sinl-row:hover td { background-color: #e8ecf8; }

/* 13. Tags & Badges
   ──────────────────────────────────────────────────────────────── */
.spo-tag { display: inline-block; padding: 0.15em 0.55em; border-radius: 4px; font-size: 0.78rem; font-weight: 600; white-space: nowrap; }
.spo-tag-live, .spo-tag-zeitversetzt { background-color: var(--spo-live); color: #fff; }
.spo-tag-ea { background-color: var(--spo-ea); color: #fff; }
.spo-tag-aufnahme { background-color: var(--spo-aufnahme, #8e44ad); color: #fff; }
.spo-tag-konserve { color: #999; font-weight: 400; }
.spo-badge { display: inline-block; font-size: 0.72rem; padding: 0.15em 0.5em; border-radius: 3px; color: #fff; }
.spo-badge-sendung { background-color: var(--spo-ci); }
.spo-badge-loop { background-color: var(--spo-ci-mid); opacity: 0.8; }

/* Sky Spots – Spot-Report Formular: stacked below 700px */
@media (min-width: 700px) { .col-spotreport-auto { flex: 0 0 auto; width: auto; } }
@media (max-width: 699.98px) { .w-100-spotreport { width: 100% !important; } }

/* Sky Spots – responsive column hiding (Ende → Wiederholungen → Länge) */
@media (max-width: 800px) { #skyspots-table .skyspots-col-ende  { display: none; } }
@media (max-width: 680px) { #skyspots-table .skyspots-col-wdh, #skyspots-table .skyspots-col-wdh-edit { display: none; } }
@media (max-width: 580px) { #skyspots-table .skyspots-col-laenge { display: none; } }

/* 14. Links
   ──────────────────────────────────────────────────────────────── */
a.spo-link-subtle { color: inherit; text-decoration: none; }
a.spo-link-subtle:hover { text-decoration: underline; }

/* 15. Tooltips
   ──────────────────────────────────────────────────────────────── */
.tooltip-inner {
  background: #2c3e50;
  color: #fff;
  font-size: 13px;
  font-weight: 500;
  padding: 6px 12px;
  border-radius: 6px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.25);
  letter-spacing: 0.3px;
}
.tooltip .tooltip-arrow::before {
  border-top-color: #2c3e50;
}
.bs-tooltip-bottom .tooltip-arrow::before {
  border-bottom-color: #2c3e50;
}
.bs-tooltip-start .tooltip-arrow::before {
  border-left-color: #2c3e50;
}
.bs-tooltip-end .tooltip-arrow::before {
  border-right-color: #2c3e50;
}

/* 16. Sendeplanung – Wochenansicht (Grid)
   ──────────────────────────────────────────────────────────────── */
:root { --row-night: 5px; --row-day: 20px; --time-col-width: 50px; }

/* Query-Container: die Spaltenbreiten unten beziehen sich per cqw auf die TATSÄCHLICHE
   Breite dieser Spalte (nach Bootstrap-Container-/.col-Padding), nicht auf 100vw. Mit 100vw
   wurde jede Tagesspalte um das horizontale Padding zu breit, sodass die rechte Blockkante
   (inkl. LIVE-/EA-Tag bei right:4px) beim Scroll-Snap über den sichtbaren Rand hinaus
   abgeschnitten wurde. */
#sendeplan-woche { color: #1e2c48; container-type: inline-size; }
#sendeplan-woche a { color: #1e2c48 !important; }

/* TV-Grid Container */
#sendeplan-woche .tv-grid { display: flex; min-height: 100%; overflow-x: auto; overflow-y: clip; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; scroll-padding-left: var(--time-col-width); border-radius: 0.375rem; border: 1px solid var(--spo-ci); }

/* Zeitspalte */
#sendeplan-woche .tv-grid > .time-grid { grid-template-columns: var(--time-col-width); border-right: 1px solid var(--spo-ci); width: var(--time-col-width); min-width: var(--time-col-width); grid-template-rows: 40px repeat(36, var(--row-night)) repeat(108, var(--row-day)) repeat(24, var(--row-night)); display: grid; position: sticky; left: 0; z-index: 10; flex-shrink: 0; box-shadow: 3px 0 6px rgba(0,0,0,0.08); background: linear-gradient(to bottom, var(--spo-ci) 0px, var(--spo-ci) 40px, var(--spo-ci-dark) 40px, var(--spo-ci-dark) calc(40px + 36 * var(--row-night)), #fff calc(40px + 36 * var(--row-night)), #fff calc(40px + 36 * var(--row-night) + 108 * var(--row-day)), var(--spo-ci-dark) calc(40px + 36 * var(--row-night) + 108 * var(--row-day)), var(--spo-ci-dark) 100%); }
#sendeplan-woche .tv-grid > .time-grid .time-day { color: #2a3449; font-variant-numeric: tabular-nums; }
#sendeplan-woche .tv-grid > .time-grid .time-night { color: #fff; font-variant-numeric: tabular-nums; }

/* Programm-Grid – Responsive Spaltenbreiten */
#sendeplan-woche .program-grid { grid-template-rows: 40px repeat(36, var(--row-night)) repeat(108, var(--row-day)) repeat(24, var(--row-night)); display: grid; overflow-x: visible; flex-shrink: 0; grid-template-columns: repeat(7, calc(100cqw - var(--time-col-width))); width: calc(7 * (100cqw - var(--time-col-width))); }
@media (min-width: 576px) { #sendeplan-woche .program-grid { grid-template-columns: repeat(7, calc((100cqw - var(--time-col-width)) / 2)); width: calc(7 * ((100cqw - var(--time-col-width)) / 2)); } }
@media (min-width: 768px) { #sendeplan-woche .program-grid { grid-template-columns: repeat(7, calc((100cqw - var(--time-col-width)) / 3)); width: calc(7 * ((100cqw - var(--time-col-width)) / 3)); } }
@media (min-width: 992px) { #sendeplan-woche .program-grid { grid-template-columns: repeat(7, calc((100cqw - var(--time-col-width)) / 5)); width: calc(7 * ((100cqw - var(--time-col-width)) / 5)); } }
@media (min-width: 1400px) { #sendeplan-woche .tv-grid { overflow-x: visible; } #sendeplan-woche .program-grid { grid-template-columns: repeat(7, minmax(120px, 1fr)); width: auto; flex: 1; min-width: 0; } }

/* Zeit-Labels */
#sendeplan-woche .time-label { background-color: var(--spo-ci); color: #fff; font-weight: 600; letter-spacing: 0.02em; border-bottom: 2px solid var(--spo-ci-dark); position: sticky; }
#sendeplan-woche .time { font-size: 12px; text-align: right; padding: 0 4px; font-weight: 600; position: sticky; align-self: start; letter-spacing: 0.01em; }

/* Tages-Header */
#sendeplan-woche .days { display: inline-block; background-color: var(--spo-ci); color: #fff; font-size: 0.8rem; letter-spacing: 0.02em; border-right: 1px solid rgba(255,255,255,0.15); border-bottom: 2px solid var(--spo-ci-dark); }
#sendeplan-woche .days .day-name { font-weight: 700; }
#sendeplan-woche .days .day-date { font-weight: 400; opacity: 0.85; font-variant-numeric: tabular-nums; }

/* Programm-Blöcke */
#sendeplan-woche .program { scroll-margin-top: 80px; padding: 5px; border-bottom: 1px solid rgba(30,44,72,0.2); border-right: 1px solid rgba(30,44,72,0.2); border-top: 1px solid rgba(255,255,255,0.35); text-align: left; overflow: hidden; z-index: 1; position: relative; box-shadow: inset 0 1px 0 rgba(255,255,255,0.3); cursor: pointer; }
#sendeplan-woche .program.loop { cursor: default; }
#sendeplan-woche .program:hover { filter: brightness(1.08); }
#sendeplan-woche .program .title { font-size: 0.78em; font-weight: 500; text-decoration: none; letter-spacing: 0.01em; }
#sendeplan-woche .program a.title { font-size: 0.78em; font-weight: 700; text-decoration: none; letter-spacing: 0.01em; }
#sendeplan-woche .program a.title:hover, #sendeplan-woche .program:hover a.title { text-decoration: underline; }
#sendeplan-woche .program .info { font-size: 0.75em; opacity: 0.85; }
#sendeplan-woche .program .wdh { font-size: 0.68em; opacity: 0.7; letter-spacing: 0.02em; }
#sendeplan-woche .program .category { font-size: 0.68em; opacity: 0.7; text-transform: uppercase; letter-spacing: 0.04em; }

/* Übertragungstyp-Ränder */
#sendeplan-woche .program.live, #sendeplan-woche .program.zeitversetzt { border-left: 6px solid #ff4d6d; }
#sendeplan-woche .program.Erstaustrahlung { border-left: 6px solid #7c6fea; }
#sendeplan-woche .program.konserve { border-left: 6px solid var(--spo-ci); }
#sendeplan-woche .program.konserve.loop { margin-left: 40%; width: 60%; overflow: hidden; z-index: 0; border-left: none; }

/* Überschneidungs-Kachel */
#sendeplan-woche .program.has-overlap::before { content: ''; position: absolute; inset: 0; background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, rgba(220,53,69,0.22) 4px, rgba(220,53,69,0.22) 6px); pointer-events: none; z-index: 1; }
#sendeplan-woche .program.has-overlap::after { content: '\f33a'; font-family: "bootstrap-icons"; font-size: 0.85rem; line-height: 1; color: #dc3545; position: absolute; top: 2px; right: 3px; pointer-events: none; z-index: 2; }

/* Loop-Blöcke */
#sendeplan-woche .loops { background: #d2f2fc; width: 40%; border-right: 1px solid rgba(30,44,72,0.2); border-bottom: 1px solid rgba(30,44,72,0.2); text-align: center; overflow: hidden; box-shadow: inset 0 1px 0 rgba(255,255,255,0.3); cursor: pointer; }
#sendeplan-woche .loops:hover { filter: brightness(1.08); }
#sendeplan-woche .loops a.looplink { font-size: 0.8em; text-decoration: none; }
#sendeplan-woche .loops a.looplink:hover, #sendeplan-woche .loops:hover a.looplink { text-decoration: underline; }
#sendeplan-woche .loops .loopdate, #sendeplan-woche .loops .looptime { font-size: 0.8em; text-decoration: none; font-weight: normal; }
#sendeplan-woche .loops .loopbadge { font-size: 0.8em; text-decoration: none; font-weight: normal; }

/* Lücken-Blöcke */
#sendeplan-woche .gaps { background: #e086e0; border: 1px solid rgba(30,44,72,0.2); border-left: 6px solid #9a3fa0; text-align: left; font-size: 12px; overflow: hidden; position: relative; padding: 5px; }
#sendeplan-woche .gaps .title { font-size: 12px; font-weight: bold; display: block; padding-top: 2px; }

/* Grid-Tags (Übertragungstyp, Zeit) */
#sendeplan-woche .tag { display: inline-block; font-size: 9px; font-weight: 600; border-radius: 3px; padding: 2px 5px; letter-spacing: 0.06em; text-transform: uppercase; position: absolute; top: 4px; right: 4px; margin-bottom: 0; }
#sendeplan-woche .tag-live { background: #ff4d6d; color: #fff; }
#sendeplan-woche .tag-ea { background: #7c6fea; color: #fff; }
#sendeplan-woche .tag-gap { background: #9a3fa0; color: #fff; }
#sendeplan-woche .timetag { display: inline-block; font-size: 10px; font-weight: 600; border-radius: 3px; padding: 1px 5px; letter-spacing: 0.02em; font-variant-numeric: tabular-nums; position: absolute; top: 4px; left: 4px; background: rgba(255,255,255,0.4); color: #2a3449; }
#sendeplan-woche .gaps .timetag { position: static; display: inline-block; margin-top: 4px; }

/* Farb-Legende (ausklappbarer Bereich am Legende-Button in der Wochen-Ansicht) */
.spo-legend { font-size: 0.85rem; }
.spo-legend-swatch { display: inline-block; width: 18px; height: 18px; border-radius: 3px; margin-right: 8px; flex: 0 0 auto; border: 1px solid rgba(30,44,72,0.25); }
#btn-legende[aria-expanded="true"] { background-color: #6c757d; border-color: #6c757d; color: #fff; }
#btn-legende .spo-legend-caret { display: inline-block; transition: transform 0.15s ease; }
#btn-legende[aria-expanded="true"] .spo-legend-caret { transform: rotate(180deg); }

/* TV-Ansicht: reine Anzeige ohne Interaktion, Zeilen wachsen mit Inhalt */
.tv-view #sendeplan-woche .tv-grid > .time-grid { grid-template-rows: 40px repeat(36, minmax(var(--row-night), auto)) repeat(108, minmax(var(--row-day), auto)) repeat(24, minmax(var(--row-night), auto)); background: #fff; border-right: none; box-shadow: none; }
.tv-view #sendeplan-woche .tv-grid > .time-grid .time-label { background-color: var(--spo-ci); }
.tv-view #sendeplan-woche .tv-grid > .time-grid .time-night { background-color: #fff; color: #2a3449; }
.tv-view #sendeplan-woche .tv-grid > .time-grid .time-day { background-color: #fff; }
.tv-view #sendeplan-woche .program-grid { grid-template-rows: 40px repeat(36, minmax(var(--row-night), auto)) repeat(108, minmax(var(--row-day), auto)) repeat(24, minmax(var(--row-night), auto)); background-color: #f8f9fa; }
.tv-view #sendeplan-woche .program { cursor: default; }
.tv-view #sendeplan-woche .program:hover { filter: none; }
.tv-view #sendeplan-woche .program.konserve.loop { margin-left: 0; width: 100%; }
.tv-view #sendeplan-woche .tv-gap { background: #e9ecef !important; border: 1px solid #dee2e6; border-left: 6px solid #ced4da; color: #6c757d; text-align: left; font-size: 12px; padding: 5px; overflow: hidden; }
.tv-view #sendeplan-woche .tv-gap .title { font-size: 12px; font-weight: 600; color: #6c757d; }
.tv-view #sendeplan-woche .tv-gap .timetag { background: rgba(255,255,255,0.6); color: #6c757d; }

/* Badge-Link Hover */
a.badge-link { transition: opacity .2s, transform .2s; }
a.badge-link:hover { opacity: .85; transform: scale(1.1); }

/* 17. Produktionsliste Kategorie-Badges */
/* Default fuer Kategorien ohne eigene Farbe (keine spezifische prod-badge-{slug}-Regel):
   dezent hellgrau mit schwarzer Schrift. Spezifische Regeln unten (gleiche Spezifitaet, spaetere
   Quelle) sowie die generierte sportarten-badges.css ueberschreiben diesen Default. */
[class*="prod-badge-"] { background-color: #e9ecef; color: #000; }
.prod-badge-fuball        { background-color: #93d9df; color: #000; }
.prod-badge-sdf2          { background-color: #f6c500; color: #000; }
.prod-badge-spielbericht  { background-color: #8ee76d; color: #000; }
.prod-badge-sportdigitalde { background-color: #6ae395; color: #000; }
.prod-badge-sportdigital1  { background-color: #ff4df3; color: #000; }
.prod-badge-sportdigital1stream { background-color: #ffb3fa; color: #000; }
.prod-badge-edge          { background-color: #035d6d; color: #fff; }
.prod-badge-esportsone    { background-color: #97FFFF; color: #000; }
.prod-badge-esportsonestream { background-color: #ccffff; color: #000; }
.prod-badge-axelspringer  { background-color: #0100fe; color: #fff; }
.prod-badge-exozet        { background-color: #ff7070; color: #fff; }
.prod-badge-teravolt      { background-color: #ff7070; color: #fff; }
.prod-badge-sdclubtv,
.prod-badge-sdclubtvksc,
.prod-badge-sdclubtvvfb,
.prod-badge-sdclubtvfcu,
.prod-badge-sdclubtvstp,
.prod-badge-hogmore       { background-color: #5e2028; color: #fff; }
.prod-badge-cmhtv         { background-color: #e3769c; color: #fff; }
.prod-badge-basketball    { background-color: #f1c40f; color: #000; }
.prod-badge-eishockey,
.prod-badge-eishockeydl,
.prod-badge-eishockeyedge { background-color: #f9e79f; color: #000; }
.prod-badge-sportdeutschlandtv { background-color: #ff9d18; color: #000; }
.prod-badge-volleyball    { background-color: #ffea93; color: #000; }
.prod-badge-handball      { background-color: #7fc0ff; color: #000; }
.prod-badge-morethansportstv { background-color: #000000; color: #fff; }
.prod-badge-dfbfast       { background-color: #C576F6; color: #fff; }
.prod-badge-dfbtv         { background-color: #20ae80; color: #000; }
.prod-badge-talknow       { background-color: #001538; color: #fff; }

/* Produktionsliste Zeilen-Hintergründe (dezent).
   --row-accent wird auf dem TR gesetzt und von TD via CSS-Custom-Property-Vererbung geerbt.
   Das erlaubt im Dark Mode, die rgba-Farbe als background-image auf weißem Grund zu rendern
   (background-image liegt über background-color → identische Optik wie Light Mode). */
.prod-row-fuball                                        { --row-accent: rgba(147, 217, 223, 0.15); }
.prod-row-fuball > td                                    { background-color: var(--row-accent); }
.prod-row-spielbericht,
.prod-row-sportdigitalde                                 { --row-accent: rgba(106, 227, 149, 0.15); }
.prod-row-spielbericht > td,
.prod-row-sportdigitalde > td                            { background-color: var(--row-accent); }
.prod-row-sdf2                                           { --row-accent: rgba(246, 197, 0, 0.15); }
.prod-row-sdf2 > td                                      { background-color: var(--row-accent); }
.prod-row-sportdigital1,
.prod-row-sportdigital1stream                            { --row-accent: rgba(255, 77, 243, 0.12); }
.prod-row-sportdigital1 > td,
.prod-row-sportdigital1stream > td                       { background-color: var(--row-accent); }
.prod-row-edge                                           { --row-accent: rgba(3, 93, 109, 0.12); }
.prod-row-edge > td                                      { background-color: var(--row-accent); }
.prod-row-esportsone,
.prod-row-esportsonestream                               { --row-accent: rgba(151, 255, 255, 0.2); }
.prod-row-esportsone > td,
.prod-row-esportsonestream > td                          { background-color: var(--row-accent); }
.prod-row-axelspringer                                   { --row-accent: rgba(1, 0, 254, 0.1); }
.prod-row-axelspringer > td                              { background-color: var(--row-accent); }
.prod-row-exozet                                         { --row-accent: rgba(255, 112, 112, 0.2); }
.prod-row-exozet > td                                    { background-color: var(--row-accent); }
.prod-row-teravolt                                       { --row-accent: rgba(255, 112, 112, 0.2); }
.prod-row-teravolt > td                                  { background-color: var(--row-accent); }
.prod-row-sdclubtv,
.prod-row-sdclubtvksc,
.prod-row-sdclubtvvfb,
.prod-row-sdclubtvfcu,
.prod-row-sdclubtvstp,
.prod-row-hogmore                                        { --row-accent: rgba(94, 32, 40, 0.15); }
.prod-row-sdclubtv > td,
.prod-row-sdclubtvksc > td,
.prod-row-sdclubtvvfb > td,
.prod-row-sdclubtvfcu > td,
.prod-row-sdclubtvstp > td,
.prod-row-hogmore > td                                   { background-color: var(--row-accent); }
.prod-row-cmhtv                                          { --row-accent: rgba(227, 118, 156, 0.12); }
.prod-row-cmhtv > td                                     { background-color: var(--row-accent); }
.prod-row-basketball                                     { --row-accent: rgba(241, 196, 15, 0.12); }
.prod-row-basketball > td                                { background-color: var(--row-accent); }
.prod-row-eishockey,
.prod-row-eishockeydl,
.prod-row-eishockeyedge                                  { --row-accent: rgba(249, 231, 159, 0.25); }
.prod-row-eishockey > td,
.prod-row-eishockeydl > td,
.prod-row-eishockeyedge > td                             { background-color: var(--row-accent); }
.prod-row-sportdeutschlandtv                             { --row-accent: rgba(255, 157, 24, 0.1); }
.prod-row-sportdeutschlandtv > td                        { background-color: var(--row-accent); }
.prod-row-volleyball                                     { --row-accent: rgba(255, 234, 147, 0.1); }
.prod-row-volleyball > td                                { background-color: var(--row-accent); }
.prod-row-handball                                       { --row-accent: rgba(127, 192, 255, 0.1); }
.prod-row-handball > td                                  { background-color: var(--row-accent); }
.prod-row-morethansportstv                               { --row-accent: rgba(0, 0, 0, 0.12); }
.prod-row-morethansportstv > td                          { background-color: var(--row-accent); }
.prod-row-dfbfast                                        { --row-accent: rgba(197, 118, 246, 0.12); }
.prod-row-dfbfast > td                                   { background-color: var(--row-accent); }
.prod-row-dfbtv                                          { --row-accent: rgba(32, 174, 128, 0.12); }
.prod-row-dfbtv > td                                     { background-color: var(--row-accent); }
.prod-row-talknow > td                                   { background-color: rgba(0, 21, 56, 0.12); }

/* Produktionsstatus: Gelöscht / Nicht einsetzen
   Einheitliche Kennzeichnung betroffener Zeilen in allen Listenansichten.
   Diagonale Schraffur als background-image, damit Kategorie-Farben (background-color)
   weiterhin sichtbar sind. Text wird zusätzlich gemutet. */
.prod-row-deleted > td {
  background-image: repeating-linear-gradient(
    -45deg,
    rgba(220, 53, 69, 0.10) 0,
    rgba(220, 53, 69, 0.10) 4px,
    transparent 4px,
    transparent 14px
  );
  color: #6c757d;
}
.prod-row-donotuse > td {
  background-image: repeating-linear-gradient(
    -45deg,
    rgba(255, 193, 7, 0.18) 0,
    rgba(255, 193, 7, 0.18) 4px,
    transparent 4px,
    transparent 14px
  );
}
/* Linker Balken als zusätzliche Kennzeichnung (nur am ersten Td, damit nicht jede Zell-Kante
   einen Balken bekommt). Bei kombinierten Flags dominiert die rote Farbe. */
.prod-row-donotuse > td:first-child                  { box-shadow: inset 3px 0 0 #ffc107; }
.prod-row-deleted > td:first-child                   { box-shadow: inset 3px 0 0 #dc3545; }
.prod-row-deleted.prod-row-donotuse > td:first-child { box-shadow: inset 3px 0 0 #dc3545; }

/* Reports-Tabelle: Child-Row-Tabellen erben die Zeilen-Hintergrundfarbe.
   Zwei Quellen setzen weißen Hintergrund auf inneren Tabellen-Elementen:
   1. Bootstrap (.table): background-color: var(--bs-table-bg) → var(--bs-body-bg) → #fff auf td/th
   2. DataTables CSS: table.dataTable tbody tr { background-color: #ffffff } trifft ALLE tr-Nachkommen
      von table.dataTable, also auch die tr-Elemente in den verschachtelten Detail-Tabellen.
   Lösung: background-color + box-shadow transparent erzwingen auf allen drei Ebenen. */
.reports-detail-content .table tr                { background-color: transparent !important; }
.reports-detail-content .table td,
.reports-detail-content .table th               { background-color: transparent !important; box-shadow: none !important; }


/* Variante für list-group-item (Produktions-Suche im Sendungs-/Loop-Formular) */
.search-result-deleted {
  background-image: repeating-linear-gradient(
    -45deg,
    rgba(220, 53, 69, 0.10) 0,
    rgba(220, 53, 69, 0.10) 4px,
    transparent 4px,
    transparent 14px
  );
  color: #6c757d;
}
.search-result-donotuse {
  background-image: repeating-linear-gradient(
    -45deg,
    rgba(255, 193, 7, 0.18) 0,
    rgba(255, 193, 7, 0.18) 4px,
    transparent 4px,
    transparent 14px
  );
}

/* ClubTV Kategorie-Badges */
.clubtv-badge-exozet { background-color: #f89292; color: #fff; }
.clubtv-badge-teravolt { background-color: #6e3e44; color: #fff; }
.clubtv-badge-sdclubtv,
.clubtv-badge-sdclubtv-ksc,
.clubtv-badge-sdclubtv-stp,
.clubtv-badge-sdclubtv-vfb,
.clubtv-badge-sdclubtv-fcu,
.clubtv-badge-hogmore { background-color: #5e2028; color: #fff; }

/* ClubTV Produktionsfarben (dezent) */
.exozet > td { background-color: rgba(248, 146, 146, 0.45); }
.teravolt > td { background-color: rgba(110, 62, 68, 0.4); }
.sdclubtv > td,
.sdclubtv-ksc > td,
.sdclubtv-stp > td,
.sdclubtv-vfb > td,
.sdclubtv-fcu > td,
.hogmore > td { background-color: rgba(94, 32, 40, 0.4); }
/* Verfügbarkeit – Grid-Layout
   ──────────────────────────────────────────────────────────────── */
.schedule-scroll {
  overflow-x: auto;
  box-shadow: 0 0 0 1px #ccc;
  position: relative;
  z-index: 0;
  scroll-snap-type: x mandatory;
  scroll-padding-left: 200px;
  width: fit-content;
  max-width: 100%;
  margin-inline: auto;
}
@media (max-width: 575.98px) {
  .schedule-scroll { scroll-padding-left: 0; }
}
.schedule {
  display: grid;
  /* grid-template-columns wird per inline style gesetzt */
  grid-auto-rows: 40px;
  min-width: max-content;
  background: repeating-linear-gradient(
    to bottom,
    #f8f8f8 0px,
    #f5f5f5 40px,   /* odd row (grey) */
    #ffffff 40px,
    #ffffff 80px    /* even row (white) */
  );
}

/* Scroll-Snap: jede Tagesspalte rastet ein (edit-cell, da header-row außerhalb schedule-scroll liegt) */
.schedule-scroll .edit-cell {
  scroll-snap-align: start;
}


/* Sticky-Wrapper für die Datum-Kopfzeile (außerhalb schedule-scroll, damit overflow-x:auto nicht stört) */
.schedule-head-sticky {
  position: sticky;
  top: calc(var(--spo-nav-h, 0px) + var(--spo-bar-h, 0px));
  z-index: 3;
  overflow-x: hidden;
  width: fit-content;
  max-width: 100%;
  margin-inline: auto;
  box-shadow: 0 0 0 1px #ccc;
}

/* Erste Spalte (Name + "Person"-Header) fixiert beim Scrollen */
.schedule > .name {
  position: sticky;
  left: 0;
  z-index: 2;
  background: #fff;
}
.schedule > .name:nth-of-type(odd) {
  background: #f8f8f8;
}
.schedule > :first-child {
  position: sticky;
  left: 0;
  z-index: 3;
}


.cell {
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
}
.edit-cell {
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
}
.name {
  justify-content: flex-start;
  padding-left: 8px;
  font-weight: 400;
}
.name .vorname  { font-weight: 400; }
.name .nachname { font-weight: 600; }
@media (max-width: 575.98px) { .schedule > .name { font-size: 12px; padding-left: 4px; } }
.header {
  background: #e0e0e0;
  font-weight: 500;
  flex-direction: column;
  line-height: 1.2;
}
.header .day-name { font-weight: 500; }
.header .day-num  { font-weight: 400; font-size: 12px; }
.header.weekend {
  background: #e7e7e7;
  color: #8b1a1a;
}
.header.weekend .day-name { font-weight: 700; }
.header.weekend .day-num  { font-weight: 600; font-size: 12px; }
.weekend {background: #e7e7e7;}

/* Verfügbarkeit – aktiver Farb-Button */
.avail {
  border: 2px solid transparent;
  transition: all .15s ease;
  font-size: .78rem;
  padding: .25rem .5rem;
}
.avail.active {
  border: 2px solid #333;
  box-shadow: 0 0 0 3px rgba(0,0,0,.15), 0 2px 8px rgba(0,0,0,.2);
  transform: scale(1.08);
}

/* Verfügbarkeit – Hover-Vorschau */
.edit-cell {
  cursor: pointer;
  transition: background .1s ease;
}

/* Verfügbarkeit – Feiertage: nur im Tabellenkopf farbig kennzeichnen */
.cell.header.holiday {
  background: var(--holiday-bg, #ff6b6b);
  color: #fff;
}
.cell.header.holiday .day-name,
.cell.header.holiday .day-num { color: #fff; }

/* Verfügbarkeit – Farben (höhere Spezifität via .edit-cell, damit user-set Farbe Feiertag uebersteuert) */
.edit-cell[color='ar']  {background: #cdffc1;}
.edit-cell[color='u']   {background: #ffff00;}
.edit-cell[color='uw']  {background: #f9e79f;}
.edit-cell[color='w']   {background: #00ff33;}
.edit-cell[color='v']   {background: #ff0000;}
.edit-cell[color='d']   {background: #ffffff;}
.edit-cell[color='a']   {background: #d159f5;}
.edit-cell[color='m']   {background: #00f0ff;}
.edit-cell[color='p']   {background: #ffa500;}
.edit-cell[color='saw'] {background: #27622aff;}

/* Verfügbarkeit – Urlaub auf Feiertag: diagonale Halb-Fuellung
   (Signal: Tag ist markiert, wird aber NICHT vom Urlaubskontingent abgezogen)
   Gelb-Hälfte oben-links, analog zu .edit-cell.weekend[color='u'] */
.edit-cell.holiday[color='u']  { background: linear-gradient(135deg, #ffff00 50%, #ffffff 50%); }
.edit-cell.holiday[color='uw'] { background: linear-gradient(135deg, #f9e79f 50%, #ffffff 50%); }

/* Zeiterfassung – Detail-Tab Löschen-Button: Text nur ab 1240px */
.ze-del-label { display: none; }
@media (min-width: 1240px) { .ze-del-label { display: inline; } }

/* Zeiterfassung – Arbeitsbeginn-übernehmen-Button: Text nur ab 1050px */
.ze-arbeitsbeginn-label { display: none; }
@media (min-width: 1050px) { .ze-arbeitsbeginn-label { display: inline; } }

/* 24-Wochen-Stats: Spaltenbezeichnungen ohne „Stunden" unter 820px */
.sws-th-short { display: inline; }
.sws-th-long  { display: none; }
@media (min-width: 820px) {
  .sws-th-short { display: none; }
  .sws-th-long  { display: inline; }
}

/* 18. Teams
   ──────────────────────────────────────────────────────────────── */
#teamstable td, #teamstable th { white-space: nowrap; }

/* Kontribution */
/* Karten-Marker: Plattform-Logo bzw. farbiger Pin als Ersatz der Leaflet-Standard-Stecknadel.
   Auch in der Plattform-Edit-Vorschau (#kp-marker-preview) verwendet. */
.kontrib-logo-marker { background: transparent; border: 0; }
.kontrib-logo-pin {
  width: 34px;
  height: 34px;
  border-radius: 50% 50% 50% 0;
  transform: rotate(-45deg);
  background: var(--pin-color, #0d6efd);
  border: 2px solid #fff;
  box-shadow: 0 2px 5px rgba(0,0,0,.4);
  display: flex;
  align-items: center;
  justify-content: center;
}
.kontrib-logo-pin.has-logo { background: #fff; }
.kontrib-logo-pin > * { transform: rotate(45deg); }
.kontrib-logo-pin i { color: #fff; font-size: 1rem; line-height: 1; }
.kontrib-logo-pin img { width: 22px; height: 22px; object-fit: contain; display: block; }

#kontribtable .kontrib-col-headend { min-width: 15rem; }
#kontribtable .kontrib-col-ziel { max-width: 12rem; }
#kontribtable td.kontrib-col-ziel code {
  display: inline-block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  vertical-align: bottom;
  white-space: nowrap;
}

/* 19. Footer
   ──────────────────────────────────────────────────────────────── */
.spo-footer { background-color: var(--spo-ci); color: rgba(255,255,255,.7); font-size: .85rem; }
.spo-footer-brand { font-weight: 700; font-size: 1.1rem; color: #fff; vertical-align: middle; }
.spo-footer-text { font-size: .8rem; line-height: 1.5; color: rgba(255,255,255,.5); }
.spo-footer-social { display: flex; gap: .65rem; flex-wrap: wrap; }
.spo-footer-social a { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 50%; background-color: rgba(255,255,255,.08); color: rgba(255,255,255,.7); font-size: 1rem; text-decoration: none; transition: all .2s ease; }
.spo-footer-social a:hover { background-color: rgba(255,255,255,.2); color: #fff; transform: translateY(-2px); }
.spo-footer-bottom { border-top: 1px solid rgba(255,255,255,.1); padding: .75rem 0; font-size: .75rem; color: rgba(255,255,255,.4); text-align: center; }

@media (min-width: 768px) {
  .spo-footer-social { justify-content: flex-end; }
}

/* 20. Loading Overlay
   ──────────────────────────────────────────────────────────────── */
#spo-loading-overlay { position: fixed; display: block; width: 100%; height: 100%; top: 0; left: 0; z-index: 9999; background-color: #000; opacity: 0.95; color: #eee; }
.spo-logo-loader { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .45rem; min-height: 7rem; padding: 2rem 1rem; color: var(--bs-secondary-color, #6c757d); }
.spo-logo-loader--inline { min-height: auto; padding: .25rem; }
.spo-logo-spinner { display: inline-block; width: 4.5rem; height: 4.5rem; aspect-ratio: 1 / 1; vertical-align: middle; }
.spo-logo-spinner canvas { display: block; width: 100%; height: 100%; }
.spo-logo-spinner--overlay { width: min(34vmin, 15rem); height: min(34vmin, 15rem); }
.spo-logo-spinner--button { width: 1.2em; height: 1.2em; margin-right: .35rem; flex: 0 0 auto; }

/* DataTables 2.x Processing-Indikator (.dt-processing in .dt-container). Wichtig: das Projekt
   laedt die DT1-CSS, die nur .dataTables_processing stylt – .dt-processing bleibt also
   ungestyled (position:static) und liegt sonst im Fluss OBERHALB der Tabelle. Hier als oben
   verankertes Overlay mit fester Hoehe -> der SPO-Spinner sitzt mittig im Tabellen-Body
   (unterhalb der Spaltenkoepfe). Greift global fuer alle DataTables. */
div.dt-container { position: relative; }
/* Tabelle smooth aus-/einblenden waehrend des Ladens (statt eines ueberlagernden Kastens). */
div.dt-container table.dataTable { transition: opacity .25s ease; }
.dt-container.dt-processing-active table.dataTable { opacity: 0; }
/* Spinner-Overlay deckt den Tabellenbereich und blendet smooth ein. display:flex !important,
   weil DT sonst per Inline-Style display:none/block toggelt und damit die opacity-Transition
   verhindert; Sichtbarkeit wird ueber .dt-processing-active gesteuert. */
div.dt-container div.dt-processing {
  position: absolute;
  inset: 0;
  margin: 0;
  padding: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
  display: flex !important;
  align-items: center;
  justify-content: center;
  z-index: 20;
  opacity: 0;
  pointer-events: none;
  transition: opacity .25s ease;
}
.dt-container.dt-processing-active div.dt-processing { opacity: 1; }
/* DT2 rendert zusaetzlich eine eigene Punkt-Animation (<div><div>..</div>) – ausblenden,
   wir zeigen ausschliesslich den SPO-Spinner (.spo-logo-loader). */
div.dt-container div.dt-processing > div:not(.spo-logo-loader) { display: none; }
div.dt-container div.dt-processing .spo-logo-loader { min-height: 0; padding: 0; }
/* Mindesthoehe waehrend des Ladens, damit der Spinner bei noch leerer Tabelle mittig Platz hat. */
.dt-container.dt-processing-active { min-height: 16rem; }

/* Klickbarer Produktions-Id-Badge (Klick kopiert die Id): dezenter Hover/Fokus-Hinweis. */
.copy-pid { transition: filter .12s ease; }
.copy-pid:hover, .copy-pid:focus-visible { filter: brightness(1.18); outline: none; }
.btn .spo-logo-spinner--button { vertical-align: -.2em; }
.btn:has(.spo-logo-spinner--button) { display: inline-flex; align-items: center; justify-content: center; gap: .15rem; }

/* Button-Ladezustand (spoButtonLoadingHtml): Bootstrap-.spinner-border statt des
   Logo-Canvas -- zeichnet ohne Bild-Ladezeit sofort. Groesse an der Schrifthoehe
   statt an Bootstraps festem 1rem, damit er in kleinen wie grossen Buttons passt;
   Farbe kommt ueber currentColor automatisch vom Button-Stil (auch im Dark-Mode). */
.spo-btn-spinner { width: 1.05em; height: 1.05em; border-width: .15em; vertical-align: -.15em; flex: 0 0 auto; }
.btn:has(.spo-btn-spinner) { display: inline-flex; align-items: center; justify-content: center; gap: .4rem; }

/* 21. Scroll-to-top
   ──────────────────────────────────────────────────────────────── */
#btn-scroll-top { display: none; position: fixed; bottom: 22px; right: 22px; z-index: 1050; border: none; background: none; padding: 0; cursor: pointer; }
#btn-scroll-top i { display: flex; align-items: center; justify-content: center; font-size: 20px; width: 44px; height: 44px; color: #fff; text-shadow: 0 1px 2px rgba(30,44,72,0.55), 0 0 4px rgba(30,44,72,0.35); border-radius: 12px; background: linear-gradient(160deg, rgba(255,255,255,0.45) 0%, rgba(255,255,255,0.10) 35%, rgba(111,197,211,0.18) 65%, rgba(255,255,255,0.05) 100%); backdrop-filter: blur(14px) saturate(1.7); -webkit-backdrop-filter: blur(14px) saturate(1.7); border: 1.5px solid rgba(255,255,255,0.55); box-shadow: 0 8px 22px rgba(30,44,72,0.25), inset 0 1px 1px rgba(255,255,255,0.65), inset 0 -2px 4px rgba(30,44,72,0.15); transition: transform .2s ease, box-shadow .25s ease, border-color .2s ease; }
#btn-scroll-top:hover i { transform: translateY(-3px); border-color: rgba(255,255,255,0.75); box-shadow: 0 12px 28px rgba(30,44,72,0.35), inset 0 1px 1px rgba(255,255,255,0.80), inset 0 -2px 4px rgba(30,44,72,0.20); }
#btn-scroll-top:active i { transform: translateY(-1px) scale(.96); transition-duration: .08s; }
body.dark-mode #btn-scroll-top i { color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,0.65), 0 0 4px rgba(0,0,0,0.45); background: linear-gradient(160deg, rgba(255,255,255,0.20) 0%, rgba(255,255,255,0.04) 35%, rgba(111,197,211,0.14) 65%, rgba(255,255,255,0.02) 100%); border-color: rgba(255,255,255,0.45); box-shadow: 0 8px 22px rgba(0,0,0,0.55), inset 0 1px 1px rgba(255,255,255,0.30), inset 0 -2px 4px rgba(0,0,0,0.25); }
body.dark-mode #btn-scroll-top:hover i { border-color: rgba(255,255,255,0.65); box-shadow: 0 12px 28px rgba(0,0,0,0.65), inset 0 1px 1px rgba(255,255,255,0.40), inset 0 -2px 4px rgba(0,0,0,0.30); }

/* 21c. Encoder-Belegung (Tages-Timeline)
   ──────────────────────────────────────────────────────────────── */
.enc-timeline {
  --enc-hour-width: 110px;       /* Default-Desktop: 12h sichtbar bei ~1280px-1440px viewport */
  --enc-label-width: 140px;
  --enc-row-height: 64px;
  --enc-header-height: 30px;
  position: relative;
  border: 1px solid var(--spo-table-border);
  background: #fff;
  /* KEIN overflow hier -- nur der .enc-body-scroll scrollt horizontal.
     Das laesst .enc-header als position:sticky relativ zur Seite kleben (Page-Scroll). */
}
body.dark-mode .enc-timeline { background: var(--spo-ci-dark); border-color: var(--spo-ci-mid); }

@media (max-width: 1199px) { .enc-timeline { --enc-hour-width: 95px; } }
@media (max-width: 767px)  { .enc-timeline { --enc-hour-width: 75px; --enc-label-width: 110px; } }

/* ─── Header: getrennt vom Body, sticky unterhalb der Haupt-Navbar ─────────────── */
.enc-header { position: sticky; top: 59px; z-index: 1010; background: var(--spo-ci); border-bottom: 1px solid var(--spo-ci-dark); }
/* Info-Zeile oberhalb der Stunden: Wochentag + Datum links, Zeitachsen-Hinweis + Scroll-Buttons rechts */
.enc-day-info { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: 6px 10px; min-height: 38px; background: var(--spo-ci-dark); color: var(--spo-ci-light); font-size: .78rem; line-height: 1.1; border-bottom: 1px solid rgba(255,255,255,0.08); }
.enc-day-info-label { font-weight: 600; }
.enc-day-info-meta  { opacity: .75; font-variant-numeric: tabular-nums; }
.enc-day-info-actions { display: flex; align-items: center; gap: 8px; }
.enc-header-inner { display: flex; align-items: stretch; min-height: var(--enc-header-height); }
/* Eck-Zelle: leer, dunkelblauer Header-BG (chained selector .enc-label.enc-label-corner ueberschreibt die generelle .enc-label-Regel weiter unten im File) */
.enc-label.enc-label-corner { flex: 0 0 var(--enc-label-width); background: var(--spo-ci); border-right: 1px solid rgba(255,255,255,0.10); box-sizing: border-box; }
/* Markante Petrol-Outline-Buttons (eigen, nicht Bootstrap-.btn, damit Hoehe stimmt) */
.enc-btn { appearance: none; -webkit-appearance: none; display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 22px; padding: 0; background-color: transparent; border: 2px solid #6fc5d3; color: #6fc5d3; border-radius: 4px; font-size: 1rem; font-weight: 700; line-height: 1; cursor: pointer; transition: background-color .15s ease, color .15s ease, transform .1s ease; font-family: inherit; }
.enc-btn:hover { background-color: #6fc5d3; color: var(--spo-ci); }
.enc-btn:active { background-color: #55b8c8; color: var(--spo-ci); transform: scale(.94); }
.enc-btn:focus { outline: 2px solid rgba(111,197,211,0.6); outline-offset: 2px; }
.enc-btn i { display: block; line-height: 1; }
.enc-header-track-view { flex: 1 1 auto; overflow: hidden; position: relative; min-width: 0; }
.enc-header-track { width: calc(var(--enc-hour-width) * 24); height: var(--enc-header-height); position: relative; will-change: transform; }

/* ─── Body: nur horizontal scrollbar, vertikal voll ausgedehnt ────────────────── */
.enc-body-scroll { overflow-x: auto; overflow-y: visible; }
/* min-width: max-content -- sonst ist die Row auf Parent-Breite (Viewport) beschraenkt
   und der Track-Inhalt rechts wird durch border-Stops/Gridline-Container abgeschnitten. */
.enc-row { display: flex; min-width: max-content; min-height: var(--enc-row-height); border-top: 1px solid var(--spo-table-border); }
.enc-row:first-child { border-top: 0; }
body.dark-mode .enc-row { border-top-color: var(--spo-ci-mid); }

/* Label-Spalte (links): horizontal-sticky innerhalb des Body-Scroll-Containers */
.enc-label {
  flex: 0 0 var(--enc-label-width);
  padding: .35rem .6rem; font-size: .75rem; line-height: 1.15;
  background: var(--spo-ci-light); border-right: 1px solid var(--spo-table-border);
  display: flex; flex-direction: column; justify-content: center;
  position: sticky; left: 0; z-index: 2;
}
.enc-label .enc-name { font-weight: 600; color: var(--spo-ci); }
.enc-label .enc-typ  { font-size: .65rem; color: #6c757d; }
body.dark-mode .enc-label { background: var(--spo-ci-mid); border-right-color: var(--spo-ci); }
body.dark-mode .enc-label .enc-name { color: var(--spo-ci-light); }
body.dark-mode .enc-label .enc-typ  { color: #b8b8b8; }

/* Track: feste Breite (24 * hour-width) statt flex:1 -> wird breiter als Viewport.
   Gitterlinien als explizite Divider-Divs (PHP-generiert, per absolute Position) -- robuster als CSS-Gradient bei breiten Tracks. */
.enc-track {
  position: relative;
  flex: 0 0 auto;
  width: calc(var(--enc-hour-width) * 24);
  min-height: var(--enc-row-height);
  background-color: transparent;
}
.enc-grid-line { position: absolute; top: 0; bottom: 0; width: 1px; background-color: rgba(30,44,72,0.18); pointer-events: none; z-index: 0; }
body.dark-mode .enc-grid-line { background-color: rgba(255,255,255,0.16); }

.enc-hour-tick { position: absolute; top: 0; bottom: 0; padding: 0; margin: 0; display: flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; font-variant-numeric: tabular-nums; color: #fff; opacity: .95; border-left: 1px solid rgba(255,255,255,0.20); box-sizing: border-box; }
.enc-hour-tick:first-child { border-left: 0; }

/* Box-Basis: KEINE bg/color/border-color hier setzen -- prod-badge-{kat} liefert die Grundfarbe (kommt im File frueher).
   Die Kat-Farbe wird im naechsten Block per linear-gradient-Overlay aufgehellt -> wirkt wie eine entsaettigte Variante
   (analog Wochen-TV-Programm). Inner-Badge bleibt voll gesaettigt, weil das Overlay nur die Box selbst trifft.
   Nur fuer Produktionen OHNE Kategorie greift .enc-block-nocat als expliziter Fallback. */
.enc-block { position: absolute; top: 3px; bottom: 3px; padding: 3px 6px; border: 1px solid rgba(0,0,0,0.15); border-radius: 4px; text-decoration: none; font-size: .72rem; line-height: 1.2; overflow: hidden; transition: filter .12s ease, transform .12s ease, box-shadow .12s ease; box-shadow: inset 0 1px 0 rgba(255,255,255,0.25), 0 1px 2px rgba(0,0,0,0.08); display: flex; flex-direction: column; justify-content: flex-start; gap: 1px; }
.enc-block[class*="prod-badge-"] { background-image: linear-gradient(rgba(255,255,255,0.55), rgba(255,255,255,0.55)); color: #2a3449; }
.enc-block-nocat { background-color: var(--spo-ci-light); color: var(--spo-ci); }
.enc-block:hover { z-index: 5; transform: scale(1.02); filter: brightness(1.08); box-shadow: inset 0 1px 0 rgba(255,255,255,0.25), 0 4px 10px rgba(0,0,0,0.2); }
.enc-block-badge { line-height: 1; }
.enc-block-title { font-weight: 600; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1 1 auto; align-self: stretch; display: flex; align-items: center; padding: 0; margin: 0; }
.enc-block-meta  { font-size: .65rem; opacity: .9; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }
.enc-block-meta-empty { opacity: .6; font-style: italic; }
.enc-block-katbadge { font-size: .6rem; font-weight: 600; padding: .15em .4em; }

/* Konflikt-Overlay: rote Diagonal-Schraffur + Warn-Icon top-right (analog sendeplan-woche .program.has-overlap) */
.enc-block.has-overlap::before { content: ''; position: absolute; inset: 0; background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, rgba(220,53,69,0.30) 4px, rgba(220,53,69,0.30) 6px); pointer-events: none; z-index: 1; border-radius: 3px; }
.enc-block.has-overlap::after  { content: '\f33a'; font-family: "bootstrap-icons"; font-size: 0.85rem; line-height: 1; color: #dc3545; position: absolute; top: 2px; right: 4px; pointer-events: none; z-index: 2; text-shadow: 0 0 3px rgba(255,255,255,0.8); }

.enc-arrow { position: absolute; top: 50%; transform: translateY(-50%); font-size: .9rem; opacity: .85; z-index: 2; }
.enc-arrow-l { left: 2px; }
.enc-arrow-r { right: 2px; }

/* 22. Flatpickr Kalender (spo-cal Theme)
   ──────────────────────────────────────────────────────────────── */

/* -- 22a. Kalender – Basis & Sichtbarkeit ---------------------- */
.flatpickr-calendar { background: transparent; opacity: 0; display: none; text-align: center; visibility: hidden; padding: 0; animation: none; direction: ltr; border: 0; font-size: 11px; line-height: 18px; border-radius: 4px; position: absolute; width: 224px; box-sizing: border-box; touch-action: manipulation; box-shadow: none; }
.flatpickr-calendar.inline { background: #fff; }
.flatpickr-calendar.open, .flatpickr-calendar.inline { opacity: 1; max-height: 480px; visibility: visible; }
.flatpickr-calendar.open { display: inline-block; z-index: 99999; }
.flatpickr-calendar.animate.open { animation: fpFadeInDown 300ms cubic-bezier(0.23, 1, 0.32, 1); }
.flatpickr-calendar.inline { display: block; position: relative; top: 2px; }
.flatpickr-calendar.static { position: absolute; top: calc(100% + 2px); }
.flatpickr-calendar.static.open { z-index: 999; display: block; }
.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7) { box-shadow: none !important; }
.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1) { box-shadow: none !important; }
.flatpickr-calendar .hasWeeks .dayContainer, .flatpickr-calendar .hasTime .dayContainer { border-bottom: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 0; }
.flatpickr-calendar .hasWeeks .dayContainer { border-left: 0; }
.flatpickr-calendar.hasTime .flatpickr-time { height: 32px; border: 1px solid rgba(72,72,72,0.2); }
.flatpickr-calendar.hasTime .flatpickr-innerContainer { border-bottom: 0; }
.flatpickr-calendar.noCalendar.hasTime .flatpickr-time { height: auto; }
.flatpickr-calendar:focus { outline: 0; }
.flatpickr-wrapper { position: relative; display: inline-block; }

/* -- 22b. Kalender – Pfeile (oben/unten) ----------------------- */
.flatpickr-calendar:before, .flatpickr-calendar:after { position: absolute; display: block; pointer-events: none; border: solid transparent; content: ''; height: 0; width: 0; left: 16px; }
.flatpickr-calendar.rightMost:before, .flatpickr-calendar.arrowRight:before, .flatpickr-calendar.rightMost:after, .flatpickr-calendar.arrowRight:after { left: auto; right: 16px; }
.flatpickr-calendar.arrowCenter:before, .flatpickr-calendar.arrowCenter:after { left: 50%; right: 50%; }
.flatpickr-calendar:before { border-width: 4px; margin: 0 -4px; }
.flatpickr-calendar:after { border-width: 3px; margin: 0 -3px; }
.flatpickr-calendar.arrowTop:before, .flatpickr-calendar.arrowTop:after { bottom: 100%; }
.flatpickr-calendar.arrowTop:before { border-bottom-color: rgba(72,72,72,0.2); }
.flatpickr-calendar.arrowTop:after { border-bottom-color: rgb(94,194,208); }
.flatpickr-calendar.arrowBottom:before, .flatpickr-calendar.arrowBottom:after { top: 100%; }
.flatpickr-calendar.arrowBottom:before { border-top-color: rgba(72,72,72,0.2); }
.flatpickr-calendar.arrowBottom:after { border-top-color: rgb(94,194,208); }

/* -- 22c. Monatsheader & Navigation ---------------------------- */
.flatpickr-months { display: flex; }
.flatpickr-months .flatpickr-month { border-radius: 0; background: var(--spo-ci); color: #fff; fill: #fff; height: 26px; line-height: 1; text-align: center; position: relative; user-select: none; overflow: hidden; flex: 1; }
.flatpickr-months .flatpickr-prev-month, .flatpickr-months .flatpickr-next-month { user-select: none; text-decoration: none; cursor: pointer; position: absolute; top: 0; height: 26px; padding: 6px 8px; z-index: 3; color: #fff; fill: #fff; }
.flatpickr-months .flatpickr-prev-month.flatpickr-disabled, .flatpickr-months .flatpickr-next-month.flatpickr-disabled { display: none; }
.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month, .flatpickr-months .flatpickr-next-month.flatpickr-prev-month { left: 0; }
.flatpickr-months .flatpickr-prev-month.flatpickr-next-month, .flatpickr-months .flatpickr-next-month.flatpickr-next-month { right: 0; }
.flatpickr-months .flatpickr-prev-month:hover, .flatpickr-months .flatpickr-next-month:hover { color: #bbb; }
.flatpickr-months .flatpickr-prev-month:hover svg, .flatpickr-months .flatpickr-next-month:hover svg { fill: #f64747; }
.flatpickr-months .flatpickr-prev-month svg, .flatpickr-months .flatpickr-next-month svg { width: 11px; height: 11px; }
.flatpickr-months .flatpickr-prev-month svg path, .flatpickr-months .flatpickr-next-month svg path { transition: fill 0.1s; fill: inherit; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced { width: var(--spo-cal-width) !important; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-months,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-weekdays,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-days { width: var(--spo-cal-width) !important; display: grid; grid-template-columns: repeat(var(--spo-cal-months), 224px); column-gap: var(--spo-cal-month-gap); }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-month,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-weekdaycontainer,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .dayContainer { width: 224px !important; min-width: 224px !important; max-width: 224px !important; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-month { height: 30px; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-current-month { padding-top: 8px; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-prev-month,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-next-month { height: 30px; padding-top: 8px; padding-bottom: 8px; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-innerContainer { padding-top: 4px; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-innerContainer,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-days { border: 0; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-weekdays { background: transparent; height: 26px; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-weekdaycontainer { background: rgb(94,194,208); height: 26px; align-items: center; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced span.flatpickr-weekday { line-height: 26px; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced span.flatpickr-weekday:nth-child(6),
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced span.flatpickr-weekday:nth-child(7),
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend { color: #dc3545; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.selected,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.startRange,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.endRange { color: #484848 !important; font-weight: 800; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend.selected,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend.startRange,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend.endRange { color: #dc3545 !important; font-weight: 800; }
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.today,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend.today,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend.today.startRange,
#calender .flatpickr-calendar.multiMonth.spo-cal-spaced .flatpickr-day.spo-weekend.today.endRange { color: #fff !important; font-weight: 800; }
#calender .flatpickr-day:hover, #calender .flatpickr-day:focus { font-weight: 700; }

/* xdsoft jQuery-Datetimepicker: Wochenende (Sa/So) in der gleichen Bordeaux-Rot-Note wie im
   Flatpickr-Kalender oben (#dc3545) -- dayOfWeekStart ist projektweit auf Montag gesetzt (spo.inc.php),
   daher stehen Sa/So immer an Spalte 6/7 im Wochentage-Header. */
.xdsoft_datetimepicker .xdsoft_calendar th:nth-child(6),
.xdsoft_datetimepicker .xdsoft_calendar th:nth-child(7),
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_weekend { color: #dc3545; }
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_weekend.xdsoft_current,
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_weekend.xdsoft_today { color: #dc3545; font-weight: 800; }

/* -- 22d. Numerisches Input-Widget ------------------------------ */
.numInputWrapper { position: relative; height: auto; }
.numInputWrapper input, .numInputWrapper span { display: inline-block; }
.numInputWrapper input { width: 100%; }
.numInputWrapper input::-ms-clear { display: none; }
.numInputWrapper input::-webkit-outer-spin-button, .numInputWrapper input::-webkit-inner-spin-button { margin: 0; -webkit-appearance: none; }
.numInputWrapper span { position: absolute; right: 0; width: 11px; padding: 0 2px; height: 50%; line-height: 50%; opacity: 0; cursor: pointer; border: 1px solid rgba(72,72,72,0.15); box-sizing: border-box; }
.numInputWrapper span:hover { background: rgba(0,0,0,0.1); }
.numInputWrapper span:active { background: rgba(0,0,0,0.2); }
.numInputWrapper span:after { display: block; content: ""; position: absolute; }
.numInputWrapper span.arrowUp { top: 0; border-bottom: 0; }
.numInputWrapper span.arrowUp:after { border-left: 3px solid transparent; border-right: 3px solid transparent; border-bottom: 3px solid rgba(72,72,72,0.6); top: 26%; }
.numInputWrapper span.arrowDown { top: 50%; }
.numInputWrapper span.arrowDown:after { border-left: 3px solid transparent; border-right: 3px solid transparent; border-top: 3px solid rgba(72,72,72,0.6); top: 40%; }
.numInputWrapper span svg { width: inherit; height: auto; }
.numInputWrapper span svg path { fill: rgba(255,255,255,0.5); }
.numInputWrapper:hover { background: rgba(0,0,0,0.05); }
.numInputWrapper:hover span { opacity: 1; }

/* -- 22e. Monatsname & Jahresauswahl --------------------------- */
.flatpickr-current-month { font-size: 110%; line-height: 1; font-weight: 300; color: inherit; position: absolute; width: 75%; left: 12.5%; padding: 5px 0 0 0; height: 26px; display: inline-block; text-align: center; transform: translate3d(0,0,0); }
.flatpickr-current-month span.cur-month { font-family: inherit; font-weight: 700; color: inherit; display: inline-block; margin-left: 0.5ch; padding: 0; }
.flatpickr-current-month span.cur-month:hover { background: rgba(0,0,0,0.05); }
.flatpickr-current-month .numInputWrapper { width: 6ch; display: inline-block; }
.flatpickr-current-month .numInputWrapper span.arrowUp:after { border-bottom-color: #fff; }
.flatpickr-current-month .numInputWrapper span.arrowDown:after { border-top-color: #fff; }
.flatpickr-current-month input.cur-year { background: transparent; box-sizing: border-box; color: inherit; cursor: text; padding: 0 0 0 0.5ch; margin: 0; display: inline-block; font-size: inherit; font-family: inherit; font-weight: 300; line-height: inherit; height: auto; border: 0; border-radius: 0; vertical-align: initial; appearance: textfield; }
.flatpickr-current-month input.cur-year:focus { outline: 0; }
.flatpickr-current-month input.cur-year[disabled], .flatpickr-current-month input.cur-year[disabled]:hover { font-size: 100%; color: rgb(94,194,208); background: transparent; pointer-events: none; }
.flatpickr-current-month .flatpickr-monthDropdown-months { appearance: menulist; background: var(--spo-ci); border: none; border-radius: 0; box-sizing: border-box; color: inherit; cursor: pointer; font-size: inherit; font-family: inherit; font-weight: 300; height: auto; line-height: inherit; margin: -1px 0 0 0; outline: none; padding: 0 0 0 0.5ch; position: relative; vertical-align: initial; width: auto; }
.flatpickr-current-month .flatpickr-monthDropdown-months:focus, .flatpickr-current-month .flatpickr-monthDropdown-months:active { outline: none; }
.flatpickr-current-month .flatpickr-monthDropdown-months:hover { background: none; }
.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month { color: rgba(0,0,0,1); outline: none; padding: 0; }

/* -- 22f. Wochentagszeile -------------------------------------- */
.flatpickr-weekdays { background: rgb(94,194,208); text-align: center; overflow: hidden; width: 100%; display: flex; align-items: center; height: 20px; }
.flatpickr-weekdays .flatpickr-weekdaycontainer { display: flex; flex: 1; }
span.flatpickr-weekday { cursor: default; font-size: 80%; background: rgba(94,194,208,0.3); color: rgba(0,0,0,0.54); line-height: 1; margin: 0; text-align: center; display: block; flex: 1; font-weight: bolder; }

/* -- 22g. Tage-Grid (dayContainer) ----------------------------- */
.dayContainer, .flatpickr-weeks { padding: 1px 0 0 0; }
.flatpickr-days { position: relative; overflow: hidden; display: flex; align-items: flex-start; width: 224px; border-left: 1px solid rgba(72,72,72,0.2); border-right: 1px solid rgba(72,72,72,0.2); }
.flatpickr-days:focus { outline: 0; }
.dayContainer { padding: 0 !important; outline: 0; text-align: left; width: 224px !important; min-width: 224px !important; max-width: 224px !important; box-sizing: border-box; display: grid !important; grid-template-columns: repeat(7, 1fr); gap: 0 !important; transform: translate3d(0,0,0); opacity: 1; }
.dayContainer + .dayContainer { box-shadow: none; }

/* -- 22h. Einzelner Tag – Basis -------------------------------- */
.flatpickr-day { background: none; border: none; border-radius: 150px; box-sizing: border-box; color: #484848; cursor: pointer; font-weight: 400; width: 100% !important; max-width: none !important; height: 30px; line-height: 30px; margin: 0 !important; display: block; position: relative; z-index: 1; text-align: center; }

/* -- 22i. Tag – Hover, Focus, inRange (Basis) ------------------ */
.flatpickr-day.inRange, .flatpickr-day.today.inRange, .flatpickr-day:hover, .flatpickr-day.prevMonthDay:hover, .flatpickr-day.nextMonthDay:hover, .flatpickr-day:focus, .flatpickr-day.prevMonthDay:focus, .flatpickr-day.nextMonthDay:focus { cursor: pointer; outline: 0 !important; background-color: #fff; border-color: transparent; }
.flatpickr-day:hover, .flatpickr-day:focus, .flatpickr-day.prevMonthDay:hover, .flatpickr-day.prevMonthDay:focus, .flatpickr-day.nextMonthDay:hover, .flatpickr-day.nextMonthDay:focus { background-color: var(--spo-ci-light); border-radius: 4px; color: var(--spo-ci); }

/* -- 22j. Tag – Heute ------------------------------------------ */
.flatpickr-day.today { background-color: var(--bs-red); border-radius: 0; color: #fff; }
.flatpickr-day.today:hover, .flatpickr-day.today:focus { border-color: var(--bs-red); background: var(--bs-red); color: #fff; }

/* -- 22k. Tag – Ausgewählt / Start / Ende (türkis + dunkelblau) */
.flatpickr-day.selected, .flatpickr-day.startRange, .flatpickr-day.endRange, .flatpickr-day.selected.inRange, .flatpickr-day.startRange.inRange, .flatpickr-day.endRange.inRange, .flatpickr-day.selected:focus, .flatpickr-day.startRange:focus, .flatpickr-day.endRange:focus, .flatpickr-day.selected:hover, .flatpickr-day.startRange:hover, .flatpickr-day.endRange:hover, .flatpickr-day.selected.prevMonthDay, .flatpickr-day.startRange.prevMonthDay, .flatpickr-day.endRange.prevMonthDay, .flatpickr-day.selected.nextMonthDay, .flatpickr-day.startRange.nextMonthDay, .flatpickr-day.endRange.nextMonthDay { background: rgb(94,194,208); color: var(--spo-ci); font-weight: 700; border: none; box-shadow: none; position: relative; }
.flatpickr-day.selected::after, .flatpickr-day.startRange::after, .flatpickr-day.endRange::after { content: ""; position: absolute; top: 0; bottom: 0; left: -1px; right: -1px; background: rgb(94,194,208); z-index: -1; }
.flatpickr-day.selected.startRange, .flatpickr-day.startRange.startRange, .flatpickr-day.endRange.startRange { border-radius: 50px 0 0 50px; }
.flatpickr-day.selected.startRange::after, .flatpickr-day.startRange.startRange::after, .flatpickr-day.endRange.startRange::after { left: 0; right: -1px; border-radius: 50px 0 0 50px; }
.flatpickr-day.selected.endRange, .flatpickr-day.startRange.endRange, .flatpickr-day.endRange.endRange { border-radius: 0 50px 50px 0; }
.flatpickr-day.selected.endRange::after, .flatpickr-day.startRange.endRange::after, .flatpickr-day.endRange.endRange::after { left: -1px; right: 0; border-radius: 0 50px 50px 0; }
.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)), .flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)), .flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)) { background: rgb(94,194,208); }
.flatpickr-day.selected.startRange.endRange, .flatpickr-day.startRange.startRange.endRange, .flatpickr-day.endRange.startRange.endRange { border-radius: 50px; }

/* -- 22l. Tag – inRange (Linie oben/unten, Lückenfix) ---------- */
.flatpickr-day.inRange { border-radius: 0; background: #fff; border: none; box-shadow: none; position: relative; }
.flatpickr-day.inRange::after { content: ""; position: absolute; top: 0; bottom: 0; left: -1px; right: -1px; border: none; background: #e8e8e8; z-index: -1; }

/* -- 22m. Tag – prevMonth / nextMonth / disabled --------------- */
.flatpickr-day.prevMonthDay.inRange, .flatpickr-day.nextMonthDay.inRange { background: transparent !important; border-color: transparent !important; box-shadow: none !important; }
.flatpickr-day.prevMonthDay.inRange::after, .flatpickr-day.nextMonthDay.inRange::after { display: none !important; }
.flatpickr-day.flatpickr-disabled, .flatpickr-day.flatpickr-disabled:hover, .flatpickr-day.prevMonthDay, .flatpickr-day.nextMonthDay, .flatpickr-day.notAllowed, .flatpickr-day.notAllowed.prevMonthDay, .flatpickr-day.notAllowed.nextMonthDay { color: rgba(72,72,72,0.3); background: transparent; border-color: transparent; cursor: default; }
.flatpickr-day.flatpickr-disabled, .flatpickr-day.flatpickr-disabled:hover { cursor: not-allowed; color: rgba(72,72,72,0.1); }
.flatpickr-day.hidden { visibility: hidden; }

/* -- 22n. Tag – Heute innerhalb Range -------------------------- */
.flatpickr-day.today.inRange, .flatpickr-day.today.startRange, .flatpickr-day.today.endRange { background: var(--bs-red) !important; color: #fff !important; border: none !important; box-shadow: none !important; z-index: 3; }
.flatpickr-day.today.inRange::after { background: var(--bs-red); border: none; }
.flatpickr-day.today.startRange::after { background: var(--bs-red); }
.flatpickr-day.today.endRange::after { background: var(--bs-red); }
/* -- 22o. Weekwrapper (KW-Spalte) ------------------------------ */
.rangeMode .flatpickr-day { margin-top: 1px; }
.flatpickr-weekwrapper { float: left; }
.flatpickr-weekwrapper .flatpickr-weeks { padding: 0 8px; border-left: 1px solid rgba(72,72,72,0.2); }
.flatpickr-weekwrapper .flatpickr-weekday { float: none; width: 100%; line-height: 20px; }
.flatpickr-weekwrapper span.flatpickr-day, .flatpickr-weekwrapper span.flatpickr-day:hover { display: block; width: 100%; max-width: none; color: rgba(72,72,72,0.3); background: transparent; cursor: default; border: none; }

/* -- 22p. Inner-Container & Time-Picker ------------------------ */
.flatpickr-innerContainer { display: flex; box-sizing: border-box; overflow: hidden; background: #fff; border-bottom: 1px solid rgba(72,72,72,0.2); }
.flatpickr-rContainer { display: inline-block; padding: 0; box-sizing: border-box; }
.flatpickr-time { text-align: center; outline: 0; display: flex; height: 0; line-height: 32px; max-height: 32px; box-sizing: border-box; overflow: hidden; background: #fff; border-radius: 0 0 4px 4px; }
.flatpickr-time:after { content: ""; display: table; clear: both; }
.flatpickr-time .numInputWrapper { flex: 1; width: 40%; height: 32px; float: left; }
.flatpickr-time .numInputWrapper span.arrowUp:after { border-bottom-color: #484848; }
.flatpickr-time .numInputWrapper span.arrowDown:after { border-top-color: #484848; }
.flatpickr-time.hasSeconds .numInputWrapper { width: 26%; }
.flatpickr-time.time24hr .numInputWrapper { width: 49%; }
.flatpickr-time input { background: transparent; box-shadow: none; border: 0; border-radius: 0; text-align: center; margin: 0; padding: 0; height: inherit; line-height: inherit; color: #484848; font-size: 11px; position: relative; box-sizing: border-box; appearance: textfield; }
.flatpickr-time input.flatpickr-hour { font-weight: bold; }
.flatpickr-time input.flatpickr-minute, .flatpickr-time input.flatpickr-second { font-weight: 400; }
.flatpickr-time input:focus { outline: 0; border: 0; }
.flatpickr-time .flatpickr-time-separator, .flatpickr-time .flatpickr-am-pm { height: inherit; float: left; line-height: inherit; color: #484848; font-weight: bold; width: 2%; user-select: none; align-self: center; }
.flatpickr-time .flatpickr-am-pm { outline: 0; width: 18%; cursor: pointer; text-align: center; font-weight: 400; }
.flatpickr-time input:hover, .flatpickr-time .flatpickr-am-pm:hover, .flatpickr-time input:focus, .flatpickr-time .flatpickr-am-pm:focus { background: #eaeaea; }
.flatpickr-input[readonly] { cursor: pointer; }

/* -- 22q. Animation -------------------------------------------- */
@keyframes fpFadeInDown { from { opacity: 0; transform: translate3d(0,-20px,0); } to { opacity: 1; transform: translate3d(0,0,0); } }

/* Inline-Kalender im #calender braucht keinen Popup-Zeiger (die blaue Spitze).
   Scoped auf #calender, damit Popup-Datepicker in Formularen ihren Pfeil behalten. */
#calender .flatpickr-calendar.inline:before,
#calender .flatpickr-calendar.inline:after { display: none; }

/* -- 22r. Mobile: 1-Monats-Kalender volle verfuegbare Breite ----
   Hebt die fixen 224px-Sperren des Single-Month-Falls auf, damit der
   Kalender den Platz im Container fuellt (mit Luft zur Seite via section.px-2).
   Greift bewusst NUR auf :not(.multiMonth) – der Mehrmonatsfall (spo-cal-spaced)
   bleibt unveraendert. max-width deckelt die Breite auf grossen Phones. */
@media (max-width: 575.98px) {
  #calender .col-auto { width: 100%; padding-left: 1rem; padding-right: 1rem; }
  #calender .flatpickr-calendar:not(.multiMonth) { width: 100% !important; max-width: 420px; margin-left: auto; margin-right: auto; }
  /* Wrapper-Kette aufbrechen: innerContainer (flex) + rContainer (inline-block) muessen wachsen,
     sonst bleibt das Tagesraster trotz width:100% inhaltsbreit. */
  #calender .flatpickr-calendar:not(.multiMonth) .flatpickr-innerContainer,
  #calender .flatpickr-calendar:not(.multiMonth) .flatpickr-rContainer,
  #calender .flatpickr-calendar:not(.multiMonth) .flatpickr-weekdays,
  #calender .flatpickr-calendar:not(.multiMonth) .flatpickr-days,
  #calender .flatpickr-calendar:not(.multiMonth) .dayContainer {
    width: 100% !important; min-width: 0 !important; max-width: 100% !important;
  }
  #calender .flatpickr-calendar:not(.multiMonth) .flatpickr-rContainer { display: block; }
}

/* ================================================================
   23. Rückempfang – Stream Grid & Cards
   ================================================================ */
.stream-grid { display: grid; gap: 1rem; grid-template-columns: 1fr; }
@media (min-width: 576px)  { .stream-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 992px)  { .stream-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1400px) { .stream-grid { grid-template-columns: repeat(4, 1fr); } }
.stream-card { background: #fff; border-radius: .5rem; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,.1); transition: box-shadow .2s, transform .2s; }
.stream-card:hover { box-shadow: 0 4px 12px rgba(0,0,0,.15); transform: translateY(-2px); }
.stream-card-player { position: relative; width: 100%; padding-top: 56.25%; overflow: hidden; background: #000; } /* 16:9 */
.stream-card-player iframe { position: absolute; inset: 0; width: 100%; height: 100%; }
.stream-card-body { padding: .5rem .75rem; display: flex; align-items: center; gap: .25rem; }
.stream-card-title { font-weight: 600; font-size: .85rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stream-expand-btn { color: #6c757d; font-size: .85rem; line-height: 1; padding: .2rem .35rem; border-radius: .25rem; transition: color .15s, background .15s; }
.stream-expand-btn:hover { color: #212529; background: rgba(0,0,0,.08); }
.stream-single-player { position: relative; width: 100%; padding-top: 56.25%; background: #000; border-radius: .5rem; overflow: hidden; }
.stream-single-player iframe { position: absolute; inset: 0; width: 100%; height: 100%; }

/* Gebaut-Switch: rot/grün mit Checkmark */
.gebaut-switch {
  width: 3em !important;
  height: 1.5em !important;
  cursor: pointer;
  background-color: var(--bs-danger) !important;
  border-color: var(--bs-danger) !important;
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e") !important;
  transition: background-color .2s, border-color .2s;
}
.gebaut-switch:checked {
  background-color: var(--bs-success) !important;
  border-color: var(--bs-success) !important;
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3cpolyline points='-1.2,0.4 -0.4,1.2 1.4,-0.8' fill='none' stroke='%23198754' stroke-width='0.7' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e") !important;
}
.gebaut-switch:focus {
  box-shadow: none !important;
}
@media (max-width: 719.98px) { .plop-btn-label { display: none; } .plop-icon-wide { display: none; } }
@media (min-width: 720px) { .plop-icon-narrow { display: none; } }
.plop-mobile-detail .plop-btn-label { display: inline; }
.plop-mobile-detail .plop-icon-wide { display: inline; }
.plop-mobile-detail .plop-icon-narrow { display: none; }
.stream-detail-content .table tr                { background-color: transparent !important; }
.stream-detail-content .table td,
.stream-detail-content .table th               { background-color: transparent !important; box-shadow: none !important; }

/* ============================================================
   HANNA-BRANCH – offene Styles (noch prüfen / aufräumen)
   ============================================================ */

/* Scroll snap for program grid days */
.program-grid .days {
  scroll-snap-align: start;
}

/* ClubTV Row-Overrides (volle Farben) */
.sdclubtv >td {background-color: #5e2028; color: #fff;}
.sdclubtv-ksc >td {background-color: #5e2028; color: #fff;}
.sdclubtv-spt >td {background-color: #5e2028; color: #fff;}
.sdclubtv-vfb >td {background-color: #5e2028; color: #fff;}
.hogmore >td {background-color: #5e2028; color: #fff;}
.edge >td {background-color: #006b3d; color: #fff;}

/* ── Booking iframe (responsive Google Forms) ── */
.booking-iframe-wrapper {
  position: relative;
  width: 100%;
  max-width: 800px;
  background: #fff;
  border: 1px solid #dee2e6;
  border-radius: .5rem;
  overflow: hidden;
  box-shadow: 0 .125rem .25rem rgba(0,0,0,.075);
}
.booking-iframe {
  display: block;
  width: 100%;
  min-height: 2400px;
  border: none;
}
@media (max-width: 768px) {
  .booking-iframe-wrapper { max-width: 100%; }
  .booking-iframe { min-height: 2800px; }
}

/* ── Switches: grün + Häkchen im Kreis wenn aktiv ────────────────── */
.form-check-input:checked {
  background-color: #198754;
  border-color: #198754;
}
.form-switch .form-check-input:checked {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3cpolyline points='-1.2,0.4 -0.4,1.2 1.4,-0.8' fill='none' stroke='%23198754' stroke-width='0.7' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e") !important;
}
.form-check-input:focus {
  border-color: #198754;
  box-shadow: 0 0 0 .25rem rgba(25,135,84,.25);
}

/* ── Switch: rot wenn aktiv (z.B. Downlink ausschließen) ─────────── */
.downlink-switch.form-check-input:checked {
  background-color: #dc3545;
  border-color: #dc3545;
}
.form-switch .downlink-switch.form-check-input:checked {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3cline x1='-1.2' y1='-1.2' x2='1.2' y2='1.2' stroke='%23dc3545' stroke-width='0.7' stroke-linecap='round'/%3e%3cline x1='1.2' y1='-1.2' x2='-1.2' y2='1.2' stroke='%23dc3545' stroke-width='0.7' stroke-linecap='round'/%3e%3c/svg%3e") !important;
}
.downlink-switch.form-check-input:focus {
  border-color: #dc3545;
  box-shadow: 0 0 0 .25rem rgba(220,53,69,.25);
}

/* ── Form-Floating in kompakter Größe (Studio-Forms) ─────────────────
   Bootstrap unterstützt .form-control-sm/.form-select-sm in
   .form-floating offiziell nicht — diese Klasse stellt Höhe, Padding
   und Label-Position so ein, dass Input/Select kompakt bleiben und
   das Floating-Label korrekt sitzt. */
.form-floating-sm { position: relative; }
.form-floating-sm > .form-control,
.form-floating-sm > .form-select {
  height: calc(2.5rem + 2px);
  min-height: calc(2.5rem + 2px);
  padding: 1rem 0.6rem 0.25rem 0.6rem;
  font-size: 0.8125rem;
  line-height: 1.15;
}
.form-floating-sm > .form-select {
  padding-top: 1.05rem;
  padding-bottom: 0.2rem;
}
.form-floating-sm > label {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  padding: 0.35rem 0.6rem;
  font-size: 0.75rem;
  pointer-events: none;
  border: 1px solid transparent;
  transform-origin: 0 0;
  transition: opacity .1s ease-in-out, transform .1s ease-in-out;
  color: #6c757d;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 100%;
}
.form-floating-sm > .form-control:focus ~ label,
.form-floating-sm > .form-control:not(:placeholder-shown) ~ label,
.form-floating-sm > .form-select ~ label {
  opacity: .85;
  transform: scale(.85) translateY(-.35rem) translateX(.15rem);
}
.form-floating-sm > .form-control::placeholder { color: transparent; }

/* ── Rechte-Tab: Tooltip-Hinweis ──────────────────────────────────── */
.rights-hint {
  text-decoration: underline dotted rgba(0,0,0,.45);
  text-underline-offset: 3px;
  cursor: help;
}
body.dark-mode .rights-hint {
  text-decoration-color: rgba(255,255,255,.5);
}

/* ── Rechte-Tab: responsive Spalten ───────────────────────────────────
   Statt fester 2 Spalten richtet sich die Spaltenzahl nach der verfügbaren
   Breite (column-width) – mobil/eng bleibt so genau eine Spalte pro Recht. */
.rights-list {
  column-width: 15rem;
  column-gap: 1.5rem;
}
.rights-list .form-check {
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
}
/* Lange Recht-Namen nicht in die Nachbarspalte überlaufen lassen */
.rights-list .form-check-label {
  display: inline-block;
  max-width: 100%;
  overflow-wrap: anywhere;
  vertical-align: top;
}

/* colors */
/* .color-ar {background: #cdffc1;}
.color-u {background: #ffff00;}
.color-uw {background: #f9e79f;}
.color-w {background: #00ff33;}
.color-v {background: #ff0000;}
.color-d {background: #ffffff;}
.color-a {background: #d159f5;}
.color-m {background: #00f0ff;}
.color-p {background: #ffa500;}
.color-saw{background: #27622aff;} */

[color='ar'] {background: #cdffc1;}
[color='u'] {background: #ffff00;}
[color='uw'] {background: #f9e79f;}
[color='w'] {background: #00ff33;}
[color='v'] {background: #ff0000;}
[color='d'] {background: #ffffff;}
[color='a'] {background: #d159f5;}
[color='m'] {background: #00f0ff;}
[color='p'] {background: #ffa500;}
[color='saw'] {background: #27622aff;}

/* Wochenenden mit Urlaub: diagonal halb markiert (zaehlen nicht als Urlaubstag) */
.edit-cell.weekend[color='u']  { background: linear-gradient(135deg, #ffff00 50%, #e7e7e7 50%); }
.edit-cell.weekend[color='uw'] { background: linear-gradient(135deg, #f9e79f 50%, #e7e7e7 50%); }

.deactivate-check:checked {
  background-color: var(--bs-danger);
  border-color: var(--bs-danger);
}


.nav-tabs .nav-link[disabled] {
    color: #adb5bd;
}

/* Filter-Button-Gruppen: Icons beim Hover/Active weiß */
.btn-group [data-filter].btn-outline-secondary:hover i,
.btn-group [data-filter].btn-outline-secondary.active i {
  color: #fff !important;
}
/* Stream-Produktionsübersicht: kompakte Detail-Tabelle */
table.stream-detail-table > tbody > tr > td {
  padding-top: .1rem !important;
  padding-bottom: .1rem !important;
  vertical-align: middle;
  line-height: 1.25;
}
.stream-detail-table p { margin: 0 !important; padding: 0; }
.stream-detail-table td > p:empty,
.stream-detail-table td > br:first-child { display: none; }

/* Studio */
.studio-card {
  border: 1px solid #cfe0ff;
  border-radius: 12px;
  box-shadow: 0 8px 24px rgba(30, 45, 75, 0.1);
}

.studio-card-title {
  margin: 0;
  font-size: 1.5rem;
  font-weight: 700;
}

.studio-btn {
  white-space: nowrap;
  color: #ffffff;
  background-color: #002957;
}

.studio-btn:hover {
  background-color: #001f3f;
  color: #ffffff;
}

/* Changes-Filter-Toolbar: Toggle-Buttons sichtbar unter 1860px, Panels darüber. */
#changes-filter-toggles { display: flex; }
@media (min-width: 1860px) {
  #changes-filter-toggles { display: none !important; }
  #changes-filter-panels .prod-filter-collapse { display: flex !important; }
}
/* Besetzungs-Filter-Toolbar: JS setzt .besetzung-compact wenn Panels nicht in eine Zeile passen */
#besetzung-filter-toggles, #besetzung-filter-toggles-quick { display: none !important; }
#besetzung-filter-toolbar .prod-filter-collapse { display: flex; }
#besetzung-filter-toolbar.besetzung-compact #besetzung-filter-toggles,
#besetzung-filter-toolbar.besetzung-compact #besetzung-filter-toggles-quick { display: flex !important; }
#besetzung-filter-toolbar.besetzung-compact .prod-filter-collapse { display: none !important; }
#besetzung-filter-toolbar.besetzung-compact .prod-filter-collapse.show,
#besetzung-filter-toolbar.besetzung-compact .prod-filter-collapse.collapsing { display: flex !important; }
@media (max-width: 401.98px) { .kommentar-label-full { display: none; } }
@media (min-width: 402px)    { .kommentar-label-short { display: none; } }

/* Kommentar-Toggle Text-Icon ("MCR"/"KOM"): kleiner + kompakt gesetzt, damit der
   Text-Token eher wie ein Bootstrap-Icon wirkt statt wie normaler Button-Text. */
.kommentar-texticon { font-size: .7rem; letter-spacing: -.04em; line-height: 1; }
/* Schmaleres horizontales Padding, damit die Filterzeile auf Mobile nicht umbricht. */
.kommentar-toggle { padding-left: .4rem; padding-right: .4rem; }

/* Kategorie-Inline-Fallback (Produktions-Uebersichten):
   Bei breitem Viewport ist die Kategorie eine eigene Tabellenspalte. Sobald die Tabelle
   die Kategorie-Spalte kollabiert, setzt das JS der Tabelle .kat-inline-on – dann erscheint
   die Kategorie als Badge direkt unter dem Produktionstitel (statt im Aufklapp-Detail). */
.prod-kat-inline { display: none; }
.kat-inline-on .prod-kat-inline { display: block; margin-top: .35rem; }
/* Produktionsbeginn-Inline-Fallback (Produktionsuebersicht): Uhrzeit unter dem Datum nur zeigen,
   wenn die separate Produktionsbeginn-Spalte kollabiert ist (.beginn-inline-on via JS).
   Der Spaltenkopf wechselt gleichzeitig von "Datum" auf "Zeit" – ein gemeinsamer Ausloeser. */
.prod-beginn-inline { display: none; }
#produktionstable.beginn-inline-on .prod-beginn-inline { display: block; }
#produktionstable .th-zeit-label { display: none; }
#produktionstable.beginn-inline-on .th-zeit-label { display: inline; }
#produktionstable.beginn-inline-on .th-datum-label { display: none; }
/* Reports-Tabelle nutzt feste Bootstrap-Breakpoints (Kategorie = d-none d-xl-table-cell):
   unter xl ist die Spalte ausgeblendet, daher den Inline-Badge dort direkt zeigen. */
@media (max-width: 1199.98px) { #reports-table .prod-kat-inline { display: block; margin-top: .35rem; } }

/* Sendeplan-Änderungen: dedizierte Responsive-Control-Spalte (Caret zum Aufklappen).
   Das Responsive-Plugin setzt .collapsed an der Tabelle, sobald Spalten versteckt werden;
   die Control-Spalte wird daher nur im kollabierten (mobilen/schmalen) Zustand eingeblendet. */
#aenderungentable .aen-control-col { width: 1px; white-space: nowrap; text-align: center; }
#aenderungentable:not(.collapsed) .aen-control-col { display: none; }

/* Quick-Besetzung (Produktions-Uebersicht / Besetzung) */
.quick-besetzung .quick-sel:disabled {
  color: #6c757d;
  background-color: #f8f9fa;
}

/* Besetzungs-Staff-Tabelle: Bootstraps Default-Table-BG ueberschreiben, damit die Produktionszeilen-Kategoriefarbe als Trennstreifen durchscheint. Die tbody-Zeilen bekommen einen leicht transluzenten weissen Overlay (gute Lesbarkeit, Kategoriefarbe scheint zwischen den Zeilen durch). Greift sowohl in der Besetzungsuebersicht als auch in "Meine Termine".
   Bootstraps Table-CSS-Variablen werden lokal zurueckgesetzt, damit Hover-Effekte der aeusseren Tabelle nicht durchschlagen. Statt eines fest gefaerbten border-bottom (der auf der Kategoriezeilen-Hintergrundfarbe schmutzig wirkt) werden die Zeilen ueber border-spacing getrennt – die Kategoriefarbe scheint als sauberer Trennstreifen durch. */
.besetzung-staff-table {
  --bs-table-bg: transparent;
  --bs-table-bg-type: transparent;
  --bs-table-bg-state: transparent;
  --bs-table-accent-bg: transparent;
  border-collapse: separate;
  border-spacing: 0 2px;
  margin-top: -2px;
  margin-bottom: -2px;
}
.besetzung-staff-table > tbody > tr > td,
.besetzung-staff-table > tfoot > tr > td {
  background-color: transparent;
  border-bottom-width: 0;
  padding: .4rem .65rem;
}
.besetzung-staff-table > tbody > tr > td {
  background-color: rgba(255, 255, 255, 0.75);
}
/* Namen mit Kontakt-Tooltip: Maus-Cursor + dezenter, gepunkteter Unterstrich beim
   Hover/Focus, damit erkennbar ist, dass dahinter Kontaktinfos liegen. */
[data-staff-contact-tooltip] { cursor: pointer; }
[data-staff-contact-tooltip]:hover,
[data-staff-contact-tooltip]:focus {
  text-decoration: underline;
  text-decoration-style: dotted;
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
}
/* Kontakt-Tooltip im SPO-Design: CI-Hintergrund (faerbt in BS5 auch den Pfeil ueber --bs-tooltip-bg),
   heller Text, linksbuendig, voll deckend. */
.staff-contact-tooltip { --bs-tooltip-bg: var(--spo-ci); --bs-tooltip-color: #fff; --bs-tooltip-opacity: 1; --bs-tooltip-max-width: 320px; }
.staff-contact-tooltip .tooltip-inner { padding: .7rem 1rem; text-align: left; word-break: break-word; box-shadow: 0 .25rem .75rem rgba(0,0,0,.25); }
.prod-location-tooltip { cursor: pointer; }

/* Besetzungsuebersicht – Mobile (<md): Day-Header-SAW-Add-Form klappt um, Add-Person-Form
   (.new-staff-card) stapelt seine Felder. Bestehende Staff-Eintraege bleiben einzeilig. */
@media (max-width: 767.98px) {
  /* Day-Header (mobil): Button bleibt in der Datumszeile (rechtsbuendig), nur das aufklappende
     Formular nimmt eine eigene volle Zeile darunter ein. saw-add-slot via display:contents
     aufloesen -> Button und Formular werden direkte Flex-Items der Datumszeile (DOM bleibt
     unveraendert, JS findet den Wrapper weiterhin). */
  #besetzung-table .day-header .saw-add-slot { display: contents; }
  #besetzung-table .day-header .saw-toggle-btn { order: 1; margin-left: auto; }
  #besetzung-table .day-header .saw-entries  { order: 3; flex: 1 1 100%; }
  #besetzung-table .day-header .saw-entries:empty { display: none; }

  /* SAW-Add-Form als eigene volle Zeile (order 4) im 2-Spalten-Grid: Rolle und Operator spannen
     jeweils ueber beide Spalten, Speichern fuellt die linke Spalte und Abbrechen sitzt rechts daneben.
     Selektor mit .d-flex, damit der Grid-Override nur greift, wenn JS den Wrapper geoeffnet hat. */
  #besetzung-table .day-header .saw-add-wrapper.d-flex {
    display: grid !important;
    grid-template-columns: 1fr auto;
    gap: .35rem;
    width: 100%;
    flex: 1 1 100%;
    order: 4;
  }
  #besetzung-table .day-header .saw-add-wrapper.d-flex > .saw-role-sel,
  #besetzung-table .day-header .saw-add-wrapper.d-flex > .saw-op-sel {
    grid-column: 1 / -1;
    width: 100% !important;
  }

  /* Mobile-Detail: bestehende Staff-Rows bleiben im 4-Spalten-Tabellen-Layout (siehe JS:
     ajaxCreateNewStaff). Das Add-Formular wird auf mobile NICHT als TR-Zeilen, sondern als
     separates Block-Div (.new-staff-mobile-form) hinter der Staff-Table gerendert -- so
     greifen Bootstrap-Defaults (form-select width:100%, input-group width:100%) sauber. */
  .besetzung-mobile-detail .besetzung-staff-table { width: 100%; }

  /* Hauptzeile + folgende Detailzeile (Besetzungs-Button) bilden mobil EINEN Block:
     untere Zell-Linie der Hauptzeile entfernen -> keine Trennlinie ueber dem Button. */
  #besetzung-table > tbody > tr.besetzung-main > td { border-bottom: 0; }

  /* Besetzungs-Detail: einheitliche, kompakte Abstaende zwischen Button, Staff-Liste und Add-Formular. */
  #besetzung-table .bes-staff-toggle { margin-bottom: .5rem; }
  #besetzung-table .bes-detail-staff .new-staff-mobile-form { margin-top: .5rem !important; padding: .5rem !important; }
  #besetzung-table .bes-detail-staff .new-staff-mobile-form > .mb-2 { margin-bottom: .4rem !important; }
  /* Add-Formular-Felder kompakter: Font bleibt 16px (iOS-Anti-Zoom), nur Padding/Hoehe reduziert,
     damit sie nicht ueberdimensioniert neben der Staff-Liste wirken. */
  #besetzung-table .bes-detail-staff .new-staff-mobile-form .form-select,
  #besetzung-table .bes-detail-staff .new-staff-mobile-form .form-control,
  #besetzung-table .bes-detail-staff .new-staff-mobile-form .input-group-text { padding-top: .2rem; padding-bottom: .2rem; min-height: 0; line-height: 1.35; }
}
/* Person-hinzufügen-Button im Collapse linksbündig statt rechtsbündig. */
#besetzung-table .bes-detail-staff tfoot td { text-align: left !important; }
/* Staff-Tabellen-Zellen niemals ausblenden — JS-Spalten-Hide darf nicht in verschachtelte Tabellen durchschlagen. */
#besetzung-table .besetzung-staff-table td { display: table-cell !important; }
/* Mobile-Detailbereich: traegt die Kategorie-Toenung der Hauptzeile (prod-row-Klasse), damit der
   Bereich hinter dem Besetzungs-Button optisch zur Produktion gehoert. Nur die aufklappbare
   Meta-Box (Kategorie/Wettbewerb/Produktionsort) hebt sich als weisser Block ab. */
#besetzung-table .bes-detail-meta { background-color: #fff; border-radius: .375rem; padding: .5rem .625rem; margin-bottom: .5rem; }
/* Vollbreiter Besetzungs-Button: Label sichtbar lassen — die globale Regel
   (.btn-spo-outline span -> display:none unter 992px, Icon-only) wuerde es sonst ausblenden. */
#besetzung-table .bes-staff-toggle span { display: inline !important; }
/* Collapse – Staff-Zeile: Name unter Rolle wenn zu schmal.
   .staff-name-compact (div im Rolle-td) einblenden, .staff-name-cell (eigene td) ausblenden.
   Kein Layout-Eingriff auf tr/td noetig — nur Show/Hide. */
.staff-name-compact { display: none; }
.bes-detail-staff { container-type: inline-size; }
@container (max-width: 360px) {
  #besetzung-table .bes-detail-staff .besetzung-staff-table .staff-name-compact { display: block; }
  #besetzung-table .bes-detail-staff .besetzung-staff-table .staff-name-cell    { display: none !important; }
  #besetzung-table .bes-detail-staff .besetzung-staff-table tbody tr td         { vertical-align: top; }
}
/* Detail-Zeile: Stripe-Box-Shadow + Border-Top entfernen, Kategorie-Farbe anwenden.
   --row-accent wird vom prod-row-*-tr vererbt; ohne Kategorie Fallback auf transparent. */
#besetzung-table .besetzung-mobile-detail > td {
  background-color: var(--row-accent, transparent) !important;
  box-shadow: none !important;
  border-top: none !important;
}
body.dark-mode #besetzung-table .besetzung-mobile-detail > td {
  background-color: #ffffff !important;
  background-image: linear-gradient(var(--row-accent, transparent), var(--row-accent, transparent)) !important;
  color: #212529 !important;
}
/* Change-Tabelle: Detail-Zeile Farbe + keine störenden Streifen. */
#change-table .change-mobile-detail > td {
  background-color: var(--row-accent, transparent) !important;
  box-shadow: none !important;
  border-top: none !important;
}
body.dark-mode #change-table .change-mobile-detail > td {
  background-color: #ffffff !important;
  background-image: linear-gradient(var(--row-accent, transparent), var(--row-accent, transparent)) !important;
  color: #212529 !important;
}

/* Besetzung – Sticky-Header-Tabelle (gegen das Fenster, ganze Tabelle bleibt geladen).
   overflow:visible noetig, damit position:sticky am Viewport statt am table-responsive-
   Container klebt. --besetzung-nav-top = Unterkante der festen Navbar (per JS gesetzt). */
#besetzung-table-wrapper { overflow: visible; }
#besetzung-table thead th {
  /* !important schlaegt die DataTables-Sortierregel '.table thead th[class*=dt-orderable] { position: relative }' (spo.css) */
  position: sticky !important;
  top: var(--besetzung-nav-top, 56px);
  z-index: 5;
  /* Navy-Hintergrund kommt aus '.table thead th' (!important). Kein Schatten, keine Border
     -- die CI-Border tragen allein die Tages-Zeilen. */
  box-shadow: none;
  border-bottom: 0 !important;
}
#besetzung-table .day-header td {
  position: sticky;
  /* top = Navbar-Unterkante + thead-Hoehe (per JS gesetzt), inkl. 1px Ueberlappung */
  top: var(--besetzung-dayheader-top, 88px);
  z-index: 4;
  /* Blaue CI-Border als box-shadow, da border-bottom bei sticky + border-collapse verschwindet */
  box-shadow: 0 2px 0 0 var(--spo-ci), 0 6px 7px -4px rgba(0,0,0,.35);
}

/* Playlist-Operating – identisches Sticky-Header-Verhalten wie Besetzung.
   overflow:visible am Wrapper, damit thead/Tages-Zeilen am Viewport statt am
   table-responsive-Container kleben. Offsets als CSS-Vars (per JS gesetzt). */
#plop-table-wrapper { overflow: visible; }
#plop-table thead th {
  position: sticky !important;
  top: var(--plop-nav-top, 56px);
  z-index: 5;
  box-shadow: none;
  border-bottom: 0 !important;
}
#plop-table .day-header td {
  position: sticky;
  top: var(--plop-dayheader-top, 88px);
  z-index: 4;
  box-shadow: 0 2px 0 0 var(--spo-ci), 0 6px 7px -4px rgba(0,0,0,.35);
}

/* Signal – Sticky-Header wie Besetzung, aber zweizeiliger thead: jede Kopf-Zeile
   klebt mit eigenem top (Zeile 2 direkt unter Zeile 1), Tages-Zeilen darunter. */
#signal-table-wrapper { overflow: visible; }
#signal-table thead tr:first-child th {
  position: sticky !important;
  top: var(--signal-nav-top, 56px);
  z-index: 6;
  box-shadow: none;
  border-bottom: 0 !important;
}
#signal-table thead tr:nth-child(2) th {
  position: sticky !important;
  top: var(--signal-thead-row2-top, 89px);
  z-index: 5;
  box-shadow: none;
  border-bottom: 0 !important;
}
#signal-table .day-header td {
  position: sticky;
  top: var(--signal-dayheader-top, 122px);
  z-index: 4;
  box-shadow: 0 2px 0 0 var(--spo-ci), 0 6px 7px -4px rgba(0,0,0,.35);
}

/* Generisches Sticky-Header-Verhalten fuer einzeilige Uebersichts-Tabellen
   (ikomg, mcr, clubtv, stream) – analog Besetzung. Offsets als CSS-Vars (per JS). */
.ov-sticky-wrap { overflow: visible; }
.ov-sticky-table thead th {
  /* !important schlaegt die DataTables-Sortierregel '.table thead th[class*=dt-orderable] { position: relative }' (spo.css) */
  position: sticky !important;
  top: var(--ov-nav-top, 56px);
  z-index: 5;
  box-shadow: none;
  border-bottom: 0 !important;
}
.ov-sticky-table .day-header td {
  position: sticky;
  top: var(--ov-dayheader-top, 88px);
  z-index: 4;
  box-shadow: 0 2px 0 0 var(--spo-ci), 0 6px 7px -4px rgba(0,0,0,.35);
}

/* DataTables Responsive – Child-Row vereinheitlichen (kein Erben der Spalten-Ausrichtung) */
table.dataTable > tbody > tr.child ul.dtr-details {
  margin: 0;
  padding: 0;
  list-style: none;
}
table.dataTable > tbody > tr.child ul.dtr-details > li,
table.dataTable > tbody > tr.child ul.dtr-details > li .dtr-title,
table.dataTable > tbody > tr.child ul.dtr-details > li .dtr-data {
  text-align: left !important;
}
table.dataTable > tbody > tr.child ul.dtr-details > li {
  padding: .35rem 0;
  border-bottom: 1px solid rgba(0,0,0,.06);
}
table.dataTable > tbody > tr.child ul.dtr-details > li:not(.dtr-section) {
  display: flex;
  align-items: baseline;
  gap: .75rem;
}
table.dataTable > tbody > tr.child ul.dtr-details > li:last-child {
  border-bottom: 0;
}
/* Feste Label-Spalte → alle Werte beginnen bündig untereinander */
table.dataTable > tbody > tr.child ul.dtr-details > li:not(.dtr-section) .dtr-title {
  font-weight: 600;
  flex: 0 0 auto;
  min-width: 9.5rem;
}
table.dataTable > tbody > tr.child ul.dtr-details > li:not(.dtr-section) .dtr-data {
  flex: 1 1 auto;
  min-width: 0;
}

/* Child-Row Sektions-Kopfzeile (z. B. Signaluebersicht: MCR / iKOMG / Stream) –
   gruppiert die ausgeklappten Werte analog zu den Spalten-Gruppen im Desktop-Header. */
table.dataTable > tbody > tr.child ul.dtr-details > li.dtr-section {
  padding: .35rem 0 .2rem;
  margin-top: .25rem;
  font-weight: 700;
  font-size: .8rem;
  text-transform: uppercase;
  letter-spacing: .03em;
  color: var(--spo-ci);
  border-bottom: 2px solid var(--spo-ci);
}
/* Aufgeklappte Responsive-Child-Zeile in allen Produktionen-Übersichten immer weiß.
   Die Listen kopieren per JS die prod-row-*-Kanalfarbe der Elternzeile auf die Child-Zeile
   (siehe produktionen.inc.js / produktionen_uebersichten.inc.js), wodurch der aufgeklappte
   Detailbereich sonst die Kanalfärbung erbt. Hier wird er – wie bei MCR (ohne Kanalklasse) –
   einheitlich auf weißen Hintergrund gezwungen. */
#produktionstable > tbody > tr.child > td,
#signal-table > tbody > tr.child > td,
#ikomg-table > tbody > tr.child > td,
#fremdproduktion-table > tbody > tr.child > td,
#quality-reports-table > tbody > tr.child > td,
#mcr-table > tbody > tr.child > td,
#clubtv-table > tbody > tr.child > td,
#stream-table > tbody > tr.child > td,
#sportartentable > tbody > tr.child > td {
  background-color: #fff !important;
}

/* Meine-Termine-Collapse-Zeilen im Dark Mode: Text schwarz halten. --bs-table-color reset
   verhindert dass Bootstrap's .table-Regel den Wert wieder auf spo-ci-light setzt. */
body.dark-mode table.meine-termine-dt > tbody > tr.child > td {
  --bs-table-color: #212529;
  color: #212529 !important;
}
/* DFB-Produktionsplanung – Aufklapp-Detailzeile der Produktions-Liste: dt/dd als Grid statt
   Bootstrap-.row. Das .row-Raster braucht negative Randmargins, die ueber das Padding des Wrappers
   hinausragen und die Detailzelle (und damit die Haupttabelle) breiter als den Viewport ziehen. */
.dfb-detail-dl {
  display: grid;
  grid-template-columns: minmax(5rem, max-content) minmax(0, 1fr);
  column-gap: .75rem;
  row-gap: .5rem;
  /* Eigenes Padding statt p-2 am .dfb-detail-Wrapper -- der ist randlos, damit die
     Bedarf-Tabelle buendig an den Kanten der Detailzeile anliegt ("aus einem Guss"). */
  padding: .5rem .5rem 0;
  margin-bottom: .5rem;
}
/* Aufgeklappte Hauptzeile: Trennlinie zur Detailzeile entfernen, damit Haupt- und Detailzeile als
   eine Einheit wirken; die Border der Detail-<td> bleibt als Abschluss zur naechsten Zeile. */
#dfb-produktionsplanung-table > tbody > tr.table-active > td { border-bottom-width: 0; }
.dfb-detail-dl dt { margin: 0; font-weight: 600; }
.dfb-detail-dl dd { margin: 0; min-width: 0; display: flex; align-items: center; }
/* Button-Beschriftung ("Bedarf melden"/"Planung bearbeiten"): in der engen Tabellenspalte erst ab
   1330px (eigener Breakpoint, kein Bootstrap-Standard zwischen xl/1200 und xxl/1400 -- analog
   d-1100-table-cell), in der aufgeklappten Detailzeile immer -- dort ist die volle Zeilenbreite da.
   Bewusst als eigene Klasse statt d-none/d-xl-inline: die Detailzeile entsteht aus einem Klon der
   Zelle, der die Utility-Klassen mitbringt. */
.dfb-btn-label { display: none; }
@media (min-width: 1330px) { .dfb-btn-label { display: inline; } }
.dfb-detail .dfb-btn-label { display: inline; }
/* Deaktivierte Felder im Bedarf-Formular (z.B. Sprache/HL-Sprache bei ausgeschaltetem Live/HL-Switch)
   deutlicher abblenden als Bootstraps Default (nur Hintergrundfarbe, keine Transparenz). */
#dfb-bedarf-edit-form .form-select:disabled,
#dfb-bedarf-edit-form .form-control:disabled { opacity: .6; }
/* Deaktivierter Channel-Select im Report (bei "Alle Channels einbeziehen") -- gleiche Abblendung. */
#dfb-report-form .form-select:disabled { opacity: .6; }
/* Scroll-Port der Bedarf-Innentabelle. Die px-Breite setzt sizeBedarfScroll() -- ein max-width:100%
   greift nicht, weil die umgebende Zelle ihre Breite selbst erst aus dem Inhalt bezieht. */
.dfb-bedarf-scroll { max-width: 100%; }
/* Ohne das hier wuerde Bootstrap's .table (width:100%) die Innentabelle auf die Breite des Scroll-Ports
   stauchen statt sie ueberlaufen und scrollen zu lassen -- die Spalten wuerden stattdessen umbrechen. */
table.dfb-bedarf-table { width: auto; min-width: 100%; }
table.dfb-bedarf-table th, table.dfb-bedarf-table td { white-space: nowrap; }
/* DFB-Produktionsplanung – Bedarf-Innentabelle im Collapse: Hintergrund bleibt bewusst immer hell
   (spo-ci-light), auch im Dark Mode -- Text daher immer dunkel halten (sonst per body.dark-mode .card
   geerbtes spo-ci-light unlesbar auf hellem Grund). */
.dfb-bedarf-table, .dfb-bedarf-table th, .dfb-bedarf-table td {
  --bs-table-bg: var(--spo-ci-light);
  --bs-table-color: var(--spo-ci-dark);
  background-color: var(--spo-ci-light) !important;
  color: var(--spo-ci-dark) !important;
}
table.dfb-bedarf-table thead th {
  background-color: var(--spo-ci-mid) !important;
  color: var(--spo-ci-light) !important;
}
/* Trennlinie vor jeder Spaltengruppe ("Live", "Highlights & Upload") des Bedarf-Detailtable. */
table.dfb-bedarf-table th.dfb-bedarf-group-start,
table.dfb-bedarf-table td.dfb-bedarf-group-start {
  border-left: 2px solid var(--spo-ci-mid);
}
/* Produktions-Liste-/Bedarfs-Liste-Tabellen im Dark Mode: eigener, hellerer Body-Ton (spo-ci statt
   spo-ci-dark aus der generischen .dark-mode-table-Regel) -- ID-Scope statt globaler Anpassung. */
body.dark-mode #dfb-produktionsplanung-table tbody,
body.dark-mode #dfb-bedarf-table tbody,
body.dark-mode .dfb-list-field-table tbody {
  background-color: var(--spo-ci) !important;
  --bs-table-bg: var(--spo-ci);
}
/* Email-Empfaengerliste (Besetzung-Stil) im Dark Mode: statt des generischen weissen
   Zeilen-Overlay aus .besetzung-staff-table einen spo-ci-Ton je Zelle setzen. */
body.dark-mode .dfb-email-userlist-table > tbody > tr > td {
  background-color: var(--spo-ci) !important;
  color: var(--spo-ci-light) !important;
}
/* Produktionsplanungsdaten-Kopf im Bedarf-Edit: kein eigener Kasten -- Body transparent statt
   des spo-ci-mid-Kastens aus der generischen .dark-mode-table-simple-Regel. */
body.dark-mode .dfb-bedarf-produktionsplanung-header-table tbody {
  background-color: transparent !important;
  --bs-table-bg: transparent;
}
body.dark-mode .dfb-bedarf-produktionsplanung-header-hr { border-color: var(--spo-dark-border); opacity: 1; }
body.dark-mode .mt-detail-content,
body.dark-mode .mt-detail-content span {
  color: #212529 !important;
}
/* Meine Termine – Mobile-Detail im Besetzungs-Stil: Meta (Wettbewerb/Produktionsort) als weisse,
   randlose Flaeche, Besetzung darunter. Die Child-Row traegt die Kategorie-Toenung (prod-row). */
.mt-detail-content .mt-detail-meta { background-color: #fff; border-radius: 0; padding: .5rem .625rem; margin-bottom: .5rem; }
.mt-detail-content .mt-detail-meta > div + div { margin-top: .15rem; }
body.dark-mode .mt-detail-content .mt-detail-meta { background-color: var(--spo-ci); }
body.dark-mode .mt-detail-content .mt-detail-meta,
body.dark-mode .mt-detail-content .mt-detail-meta span { color: var(--spo-ci-light) !important; }
/* Besetzungs-Block als NAHTLOSE zweite Zeile: keine Trennlinie zur Hauptzeile, kein oberer Abstand,
   gleiche Kategorie-Toenung -> Haupt- + Besetzungszeile wirken als ein Block. */
table.meine-termine-dt > tbody > tr.mt-has-child > td { border-bottom: 0 !important; }
table.meine-termine-dt > tbody > tr.mt-child-row > td { padding: 0 .5rem .55rem .5rem; }
.mt-detail-content { padding: 0; }
/* Meine Termine: Besetzungs-Staff-Zeilen transparent (statt halbtransparentem Weiss wie in der
   Besetzungsuebersicht), damit die Kategorie-Toenung der Produktionszeile durchscheint –
   Desktop-Spalte wie Mobile-Detail. */
table.meine-termine-dt .besetzung-staff-table > tbody > tr > td { background-color: transparent; }
/* Produktionen-Edit, Tab Besetzung: keine Kategorie-Toenung dahinter (eigene Card statt Listenzeile) -- daher Zeilen ebenfalls transparent statt halbtransparentem Weiss. */
.besetzung-edit-view .besetzung-staff-table > tbody > tr > td { background-color: transparent; }

table.dataTable > tbody > tr.child ul.dtr-details > li.dtr-section:first-child {
  margin-top: 0;
}

/* Signaluebersicht: aufgeklappte Child-Zeile nutzt die volle Breite – Label links, Wert rechtsbuendig.
   So lesen sich die Sektionen MCR/iKOMG/Stream als durchgaengige, tabellenartige Bloecke statt linksbuendig
   gestauchter Kurz-Zeilen. */
#signal-table > tbody > tr.child ul.dtr-details { width: 100%; }
#signal-table > tbody > tr.child ul.dtr-details > li:not(.dtr-section) {
  justify-content: space-between;
  gap: 1rem;
  padding-left: .75rem;
  padding-right: .75rem;
}
#signal-table > tbody > tr.child ul.dtr-details > li:not(.dtr-section) .dtr-title {
  flex: 0 0 auto;
  min-width: 0;
}
#signal-table > tbody > tr.child ul.dtr-details > li:not(.dtr-section) .dtr-data {
  flex: 1 1 auto;
  text-align: right !important;
}
#signal-table > tbody > tr.child ul.dtr-details > li.dtr-section {
  padding-left: .75rem;
  padding-right: .75rem;
}

/* Produktionstabelle: Responsive-Aufklapp-Control als Chevron-Button (Stil wie /management/wettbewerbe).
   Ersetzt das Standard-Dreieck des Responsive-Plugins durch ein bootstrap-icon-Chevron in einem kleinen
   umrandeten Kaestchen (rechts = eingeklappt, runter = ausgeklappt). ID-Selektor => hoehere Spezifitaet
   als die Plugin-Default-Regeln, daher kein Erben der Dreiecks-Borders. */
#produktionstable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#txt-table.dtr-inline.collapsed > tbody > tr > td.dtr-control:before,
#kontribtable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#kontrib-list-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#sendungentable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#signal-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#mcr-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#clubtv-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#fremdproduktion-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#quality-reports-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#aenderungentable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
#sportartentable.dtr-column.collapsed > tbody > tr > td.dtr-control:before {
  content: "\f285" !important;                /* bi-chevron-right */
  font-family: "bootstrap-icons" !important;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  font-size: .75rem;
  line-height: 1 !important;
  color: #6c757d;
  border: 1px solid #ced4da !important;
  border-radius: .25rem;
  margin-right: .5em;
  vertical-align: middle;
}
#produktionstable.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#txt-table.dtr-inline.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#kontribtable.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#kontrib-list-table.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#sendungentable.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#signal-table.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#mcr-table.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#clubtv-table.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#fremdproduktion-table.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#quality-reports-table.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#aenderungentable.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before,
#sportartentable.dtr-column.collapsed > tbody > tr.dtr-expanded > td.dtr-control:before {
  content: "\f282" !important;                /* bi-chevron-down */
  border: 1px solid #ced4da !important;
}
/* Desktop (nichts eingeklappt): keine Control-Spalten-Grafik in den Übersichten mit eigener Chevron-Spalte */
#produktionstable.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#kontribtable.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#kontrib-list-table.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#sendungentable.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#signal-table.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#mcr-table.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#clubtv-table.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#fremdproduktion-table.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#quality-reports-table.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#aenderungentable.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before,
#sportartentable.dtr-column:not(.collapsed) > tbody > tr > td.dtr-control:before {
  content: none !important;
  border: 0 !important;
}
/* Dark Mode: die Chevron-Box oben hartcodiert Light-Mode-Farben (Icon #6c757d, Border #ced4da) -- im
   Dark Mode wirkt das als heller Fleck auf dunklem Grund. Gleiche Farben wie die dark-mode-btn-Outline-
   Buttons (z.B. Aufklapp-Button in teams.inc.js) fuer ein einheitliches Bild. Selektor ohne ".dtr-expanded"
   trifft ueber die hoehere Elementanzahl (":before" + "tr" ohne Klassenrestriktion) beide Icon-Zustaende
   (Chevron-Right/-Down), siehe deren jeweilige Spezifitaet oben. */
body.dark-mode #produktionstable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #txt-table.dtr-inline.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #kontribtable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #kontrib-list-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #sendungentable.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #signal-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #mcr-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #clubtv-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #fremdproduktion-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #quality-reports-table.dtr-column.collapsed > tbody > tr > td.dtr-control:before,
body.dark-mode #aenderungentable.dtr-column.collapsed > tbody > tr > td.dtr-control:before {
  color: var(--spo-ci-light) !important;
  border-color: var(--spo-dark-border) !important;
}

/* Uebersichten mit manuell per tr.child-Markup nachgebauter Detail-Zeile (ikomg-table/stream-table,
   kein DataTables Responsive, kein row().child()) sowie Besetzungsaenderungen (#change-table, per
   css("display", ...) statt DataTables-API umgeschaltete Detail-Zeile): sanftes Einblenden -- die
   CSS-Animation laeuft automatisch immer dann, wenn die Zeile von display:none in einen sichtbaren
   display-Wert wechselt bzw. neu ins DOM eingefuegt wird, kein JS noetig. Schliessen bleibt abrupt:
   kein Vorher-Hook zum Abspielen einer Ausblend-Animation vorhanden. Alle anderen Uebersichten mit
   DataTables-Responsive-Child-Zeile (type:"column"/"inline") animieren beide Richtungen bereits per
   JS ueber window.spoResponsiveAnimatedDisplay() (siehe spo.inc.js) bzw. eigenem row().child()-Handler
   (reports-table) und brauchen dieses CSS-Fallback nicht mehr. */
@keyframes dtrChildIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
#change-table > tbody > tr.change-mobile-detail,
#ikomg-table > tbody > tr.child,
#stream-table > tbody > tr.child { animation: dtrChildIn .2s ease; }

/* Produktionen: Edit-Button-Spalte (letzte Spalte) auf reine Button-Breite schrumpfen.
   Auf schmalen Viewports ist der Button nur das Icon (Text via d-none d-xl-inline), daher
   braucht die Spalte kaum Padding – so bleibt maximal Platz fuer den Produktionstitel. */
#produktionstable > thead > tr > th:last-child,
#produktionstable > tbody > tr:not(.child) > td:last-child {
  width: 1px;
  white-space: nowrap;
  padding-left: .25rem;
  padding-right: .25rem;
}

/* Stats-Tabelle: horizontales Scroll-Snapping */
#stats-table-wrap {
  scroll-snap-type: x mandatory;
  scroll-padding-left: var(--stats-snap-padding, 0);
}
#stats-table th,
#stats-table td { scroll-snap-align: start; }

/* Stats-Tabelle: Name-Spalte horizontal sticky.
   border-collapse:separate gibt jeder Zelle eigene Borders – sticky-Spalte besitzt ihren rechten Border.
   border-spacing:0 verhindert Luecken; leading-edge-Ansatz (nur right+bottom) verhindert Dopplungen. */
#stats-table {
  border-collapse: separate !important;
  border-spacing: 0;
}
#stats-table tbody td {
  border-top: 0 !important;
  border-left: 0 !important;
  border-right: 1px solid var(--spo-table-border) !important;
  border-bottom: 1px solid var(--spo-table-border) !important;
}
#stats-table th:first-child {
  position: sticky;
  left: 0;
  z-index: 3;
}
#stats-table td.stats-name-cell {
  position: sticky;
  left: 0;
  z-index: 2;
  background-color: #fff;
  border-left: 1px solid var(--spo-table-border) !important;
}
body.dark-mode #stats-table td.stats-name-cell {
  background-color: var(--spo-ci-mid);
}
#stats-table thead th:nth-child(2),
#stats-table td.stats-rolle-cell {
  position: sticky;
  left: var(--stats-rolle-left, 0);
  z-index: 2;
}
#stats-table thead th:nth-child(2) { z-index: 3; }
#stats-table td.stats-rolle-cell {
  background-color: #fff;
}
#stats-table .stats-sum-row td.stats-rolle-cell {
  background-color: #f8f9fa;
}
body.dark-mode #stats-table td.stats-rolle-cell {
  background-color: var(--spo-ci-mid);
}

/* iOS-Safari zoomt beim Fokus auf Inputs hinein, wenn deren font-size < 16px ist.
   Bootstraps *-sm-Varianten (.875rem = 14px) loesen das aus. Auf Mobile-Viewports
   daher alle Form-Inputs auf 16px anheben -- verhindert das Ranzoomen in Filtern,
   Suchen und Edit-Formularen. */
@media (max-width: 767.98px) {
  .form-control,
  .form-control-sm,
  .form-select,
  .form-select-sm,
  .input-group-sm > .form-control,
  .input-group-sm > .form-select,
  textarea {
    font-size: 16px;
  }
}

/* Studio Accordion – gesamter Header klickbar */
#studioAccordion .d-flex.align-items-center { cursor: pointer; user-select: none; }

/* Meine-Termine-Tabelle in Personen-Termine Child-Row */
.pt-child-wrap .table-responsive {
  border: 1px solid var(--spo-dark-border);
  border-radius: .375rem;
  overflow: hidden;
}

/* 23. Fokus-Glow entfernen + Fokus-Rahmen auf CI-Petrol
   ────────────────────────────────────────────────────────────────
   Bootstrap legt beim Fokussieren (Klick oder Tab) einen hellen, weichen
   "Glow" (box-shadow-Ring, `0 0 0 .25rem rgba(...)`) um Inputs, Selects,
   Buttons und Filter. Dieser Ring ist projektweit unerwuenscht und wird
   hier global entfernt.
   Zusaetzlich faerbt Bootstrap den duennen Fokus-Rahmen standardmaessig
   hellblau (`#86b7fe`) – das passt nicht zur CI. Der Rahmen wird daher auf
   das CI-Petrol (`--spo-petrol`) umgestellt.
   Neue Komponenten NICHT mit eigenem Focus-`box-shadow` versehen. */
.form-control:focus,
.form-control:focus-visible,
.form-select:focus,
.form-select:focus-visible,
.form-check-input:focus,
.form-check-input:focus-visible,
.form-control-color:focus,
.input-group .form-control:focus,
.input-group .form-select:focus,
.btn:focus,
.btn:focus-visible,
.btn-check:focus + .btn,
.btn-check:focus-visible + .btn,
.btn-check:checked + .btn,
.page-link:focus,
.dropdown-item:focus,
.nav-link:focus,
.accordion-button:focus {
  box-shadow: none !important;
}

/* Fokus-Rahmen (nur Border-Farbe) auf CI-Petrol – ersetzt das Bootstrap-Hellblau.
   NUR fuer Text-/Auswahl-Inputs (Filter, Suchen, Edit-Formulare). Checkboxen,
   Radios und Switches sind BEWUSST ausgenommen – deren Checked-/Fokus-Farbe ist
   projektweit gruen (`#198754`, siehe Sektion "Switches: gruen + Haekchen"). */
.form-control:focus,
.form-control:focus-visible,
.form-select:focus,
.form-select:focus-visible,
.form-control-color:focus,
.input-group .form-control:focus,
.input-group .form-select:focus {
  border-color: var(--spo-petrol) !important;
}


/* ================================================================
   Publizieren-Log (#pub-log-area)
   ----------------------------------------------------------------
   Die Ergebnis-Boxen (Plandatei, StruPPI, TVA, TVXML, TA2, Sky ...) bestehen aus
   einer Kopfzeile plus einer .table-Auflistung, bei den XML-Exporten zusaetzlich
   je Distributionsziel (Gracenote, Simply.tv, EPGplus ...) ein eigener Unterblock.
   Bootstrap gibt .table-Zellen ein DECKENDES var(--bs-table-bg) (= weiss). In einer
   eingefaerbten .alert-Box schneidet das die Tabellenzeilen als weisse Baender aus
   dem Boxhintergrund heraus. Darum hier alle Table-BG-Variablen auf transparent --
   die Faerbung der Bloecke uebernimmt ausschliesslich .pub-target (siehe unten). */
#pub-log-area .table {
  --bs-table-bg: transparent;
  --bs-table-bg-type: transparent;
  --bs-table-bg-state: transparent;
  --bs-table-accent-bg: transparent;
}
#pub-log-area .table > tbody > tr > td {
  background-color: transparent;
  padding: .15rem 0;
  vertical-align: top;
}
/* Feste Label-Spalte, damit die Werte aller Boxen auf einer Kante stehen.
   width auf einer table-auto-Zelle wirkt als MINDESTbreite -- ein laengeres Label
   bricht die Ausrichtung also nicht, es schiebt beide Spalten gemeinsam nach rechts. */
#pub-log-area .table > tbody > tr > td:first-child {
  width: 11rem;
  white-space: nowrap;
}

/* --- Distributionsziele -------------------------------------------------
   Jedes Ziel ist eine eigene Karte auf leicht aufgehelltem Grund: das fasst
   Ueberschrift und zugehoerige Statuszeilen sichtbar zu einer Einheit zusammen
   und trennt die Ziele voneinander, ohne eine zweite Alert-Farbe einzufuehren. */
#pub-log-area .pub-targets {
  margin-top: .75rem;
  display: flex;
  flex-direction: column;
  gap: .5rem;
}
#pub-log-area .pub-target {
  background-color: rgba(255, 255, 255, .55);
  border: 1px solid rgba(0, 0, 0, .08);
  border-radius: .375rem;
  padding: 0 .65rem .35rem;
  overflow: hidden;
}
/* Kopfzeile der Karte: abgesetzter Streifen statt frei stehendem Text. Die
   negativen Margins ziehen sie ueber das Padding der Karte auf volle Breite. */
#pub-log-area .pub-target-title {
  font-weight: 600;
  margin: 0 -.65rem .35rem;
  padding: .3rem .65rem;
  background-color: rgba(0, 0, 0, .04);
  border-bottom: 1px solid rgba(0, 0, 0, .08);
}
/* Label-Spalte der Karten-Tabellen um das Karten-Padding verkuerzt, damit die
   Statuswerte trotz Einrueckung exakt auf derselben Kante stehen wie die Werte
   der aeusseren Tabelle (Sendungen:/Datei:). */
#pub-log-area .pub-target .table > tbody > tr > td:first-child {
  width: calc(11rem - .65rem);
}

body.dark-mode #pub-log-area .pub-target {
  background-color: rgba(255, 255, 255, .06);
  border-color: rgba(255, 255, 255, .15);
}
body.dark-mode #pub-log-area .pub-target-title {
  background-color: rgba(255, 255, 255, .08);
  border-bottom-color: rgba(255, 255, 255, .15);
}
