/* =====================================================================
 * Dark theme — scoped to [data-theme="dark"] on <html>.
 *
 * Strategy: ONLY override neutral surfaces (bg / text / border / shadows)
 * via Bootstrap CSS variables so the primary accent still follows the
 * active color_scheme (theme-default.css = purple, theme-evidentia.css =
 * teal). Component-level selectors fix spots that hardcoded light hexes.
 *
 * Keep `[data-theme="dark"]` the outer scope so the file is inert in
 * light mode — no runtime cost to load it unconditionally.
 * ===================================================================== */

[data-theme="dark"] {
  --bs-body-bg: #1b1b29;
  --bs-body-color: #d4d2e3;
  --bs-body-color-rgb: 212, 210, 227;
  --bs-tertiary-bg: #252537;
  --bs-tertiary-color: #8a889c;
  --bs-secondary-bg: #2a2a3d;
  --bs-secondary-color: #aeacbd;
  --bs-border-color: #3a3a4f;
  --bs-border-color-translucent: rgba(255, 255, 255, 0.08);
  --bs-emphasis-color: #ffffff;
  --bs-heading-color: #e8e6f6;
  --bs-link-color: var(--bs-primary);
  --bs-link-hover-color: var(--bs-primary);
  color-scheme: dark;
}

/* core.css scopes --bs-card-title-color INSIDE `.card`, not at :root,
 * so an html-level override is shadowed by the closer `.card` ancestor
 * for every descendant `.card-title`. Override the var on `.card` (and
 * subtitle for symmetry) so every `.card-title` / `.card-subtitle`
 * across the app picks up body color in dark mode. */
[data-theme="dark"] .card {
  --bs-card-title-color: #e8e6f6;
  --bs-card-subtitle-color: var(--bs-tertiary-color);
}

/* ---- Global body + text ---- */
[data-theme="dark"] body {
  background-color: var(--bs-body-bg);
  color: var(--bs-body-color);
}

[data-theme="dark"] .text-muted,
[data-theme="dark"] .text-secondary {
  color: var(--bs-tertiary-color) !important;
}

[data-theme="dark"] .text-dark,
[data-theme="dark"] .text-body {
  color: var(--bs-body-color) !important;
}

/* core.css ships `.text-heading { color: #444050 !important; }` — a hardcoded
   dark gray that vanishes against the dark body. Override site-wide so any
   <span class="text-heading"> reads correctly in dark mode. */
[data-theme="dark"] .text-heading {
  color: var(--bs-heading-color) !important;
}

/* ---- Cards / containers ---- */
[data-theme="dark"] .card,
[data-theme="dark"] .card-body,
[data-theme="dark"] .card-header,
[data-theme="dark"] .card-footer {
  background-color: #232334;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .card-header {
  background-color: #232334;
  border-bottom-color: var(--bs-border-color);
}

/* ---- Tables ---- */
[data-theme="dark"] .table {
  --bs-table-bg: transparent;
  --bs-table-color: var(--bs-body-color);
  --bs-table-striped-bg: rgba(255, 255, 255, 0.025);
  --bs-table-striped-color: var(--bs-body-color);
  --bs-table-hover-bg: rgba(255, 255, 255, 0.04);
  --bs-table-hover-color: var(--bs-body-color);
  --bs-table-border-color: var(--bs-border-color);
  color: var(--bs-body-color);
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .table thead th,
[data-theme="dark"] .table tfoot th {
  background-color: #2b2b3f !important;
  color: #b9b7cc !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .table tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color);
}

/* DataTables wrappers + pagination pill */
[data-theme="dark"] .dataTables_wrapper,
[data-theme="dark"] .dataTables_wrapper .dataTables_info,
[data-theme="dark"] .dataTables_wrapper .dataTables_length label,
[data-theme="dark"] .dataTables_wrapper .dataTables_filter label {
  color: var(--bs-body-color);
}
[data-theme="dark"] .dataTables_paginate .paginate_button {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .dataTables_paginate .paginate_button.disabled {
  color: var(--bs-tertiary-color) !important;
}

/* ---- Navbar (topbar) ---- */
[data-theme="dark"] .layout-navbar,
[data-theme="dark"] .navbar,
[data-theme="dark"] .topbar-inner {
  background-color: #1e1e2d;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .topbar-search,
[data-theme="dark"] #globalSearchInput {
  background-color: #2a2a3d;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] #globalSearchInput::placeholder { color: var(--bs-tertiary-color); }
[data-theme="dark"] .topbar-search i,
[data-theme="dark"] .topbar-shortcut {
  color: var(--bs-tertiary-color);
}
[data-theme="dark"] .topbar-divider {
  background-color: var(--bs-border-color);
}
[data-theme="dark"] .topbar-theme-toggle,
[data-theme="dark"] .topbar-mobile-toggle,
[data-theme="dark"] .topbar-lang-toggle,
[data-theme="dark"] .topbar-user-toggle {
  color: var(--bs-body-color);
}
[data-theme="dark"] .topbar-user-toggle:hover,
[data-theme="dark"] .topbar-theme-toggle:hover,
[data-theme="dark"] .topbar-lang-toggle:hover {
  background-color: rgba(255, 255, 255, 0.05);
}

/* ---- Sidebar ---- */
[data-theme="dark"] #layout-menu,
[data-theme="dark"] .layout-menu {
  background-color: #1e1e2d;
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .menu-inner .menu-item .menu-link {
  color: var(--bs-body-color);
}
[data-theme="dark"] .menu-inner .menu-item .menu-link:hover {
  color: var(--bs-emphasis-color);
  background-color: rgba(255, 255, 255, 0.03);
}
[data-theme="dark"] .menu-inner .menu-item.active > .menu-link:not(.menu-toggle) {
  background-color: rgba(var(--bs-primary-rgb), 0.15);
  color: var(--bs-primary);
}
[data-theme="dark"] .menu-inner .menu-header {
  color: var(--bs-tertiary-color);
}
[data-theme="dark"] .sidebar-collapse-toggle,
[data-theme="dark"] .app-brand {
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}

/* ---- Modals + dropdowns + popovers ---- */
[data-theme="dark"] .modal-content,
[data-theme="dark"] .dropdown-menu,
[data-theme="dark"] .popover,
[data-theme="dark"] .offcanvas {
  background-color: #232334;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .modal-header,
[data-theme="dark"] .modal-footer {
  border-color: var(--bs-border-color);
}
/* Modal backdrop: core.css ships #97959e at 0.5 opacity which washes out
 * to a light-gray overlay over the dark body — looks like a "white shadow"
 * in dark mode. Also the sidebar's stacking context can sit above the
 * default backdrop z-index so only the page area gets dimmed.
 *
 * Use a soft dark overlay at 0.4 opacity — calibrated against the
 * addUnlicensedWizardModal screenshot the user marked as correct, where
 * page content (cards, table rows, status badges) is clearly readable
 * through the dim. Going higher (0.6+) makes the page look pitch-black,
 * not a fade. Bump z-index above the sidebar (max 1100) so one shade
 * covers sidebar + content together.
 *
 * Override the CSS vars (not the .show opacity) so Bootstrap's own
 * `opacity: var(--bs-backdrop-opacity)` rule still runs the fade-in/out
 * transition naturally — pinning .show with !important would flicker
 * during the close fade. background-color is pinned so the default
 * #97959e never paints for a frame on first show. */
[data-theme="dark"] .modal-backdrop {
  --bs-backdrop-bg: #000000;
  --bs-backdrop-opacity: 0.4;
  background-color: #000000 !important;
  z-index: 1200 !important;
}
[data-theme="dark"] .modal {
  z-index: 1210 !important;
}
[data-theme="dark"] .dropdown-item {
  color: var(--bs-body-color);
}
[data-theme="dark"] .dropdown-item:hover,
[data-theme="dark"] .dropdown-item:focus {
  background-color: rgba(255, 255, 255, 0.05);
  color: var(--bs-emphasis-color);
}
[data-theme="dark"] .dropdown-divider {
  border-top-color: var(--bs-border-color);
}
[data-theme="dark"] .btn-close {
  filter: invert(1) grayscale(100%) brightness(200%);
}

/* ---- Forms ---- */
[data-theme="dark"] .form-control,
[data-theme="dark"] .form-select,
[data-theme="dark"] .input-group-text {
  background-color: #2a2a3d;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .form-control::placeholder { color: var(--bs-tertiary-color); }
[data-theme="dark"] .form-control:focus,
[data-theme="dark"] .form-select:focus {
  background-color: #2a2a3d;
  border-color: var(--bs-primary);
  color: var(--bs-body-color);
  box-shadow: 0 0 0 0.15rem rgba(var(--bs-primary-rgb), 0.25);
}
[data-theme="dark"] .form-check-input {
  background-color: #2a2a3d;
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .form-check-input:checked {
  background-color: var(--bs-primary);
  border-color: var(--bs-primary);
}
[data-theme="dark"] .form-label {
  color: var(--bs-body-color);
}

/* ---- Buttons (keep primary/danger as-is — only tweak outlines) ---- */
[data-theme="dark"] .btn-outline-secondary {
  color: var(--bs-body-color);
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .btn-outline-secondary:hover {
  background-color: rgba(255, 255, 255, 0.06);
  color: var(--bs-emphasis-color);
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .btn-light {
  background-color: #2a2a3d;
  color: var(--bs-body-color);
  border-color: var(--bs-border-color);
}

/* ---- Label/soft badges ---- */
[data-theme="dark"] .bg-label-primary { background-color: rgba(var(--bs-primary-rgb), 0.2) !important; color: var(--bs-primary) !important; }
[data-theme="dark"] .bg-label-success { background-color: rgba(34, 197, 94, 0.2) !important; color: #4ade80 !important; }
[data-theme="dark"] .bg-label-warning { background-color: rgba(245, 158, 11, 0.2) !important; color: #fbbf24 !important; }
[data-theme="dark"] .bg-label-danger  { background-color: rgba(234, 84, 85, 0.2) !important; color: #fb7185 !important; }
[data-theme="dark"] .bg-label-info    { background-color: rgba(56, 189, 248, 0.2) !important; color: #38bdf8 !important; }
[data-theme="dark"] .bg-label-secondary { background-color: rgba(148, 163, 184, 0.18) !important; color: #cbd5e1 !important; }

/* ---- Tabs / nav pills ---- */
[data-theme="dark"] .nav-tabs .nav-link,
[data-theme="dark"] .nav-tabs-custom .nav-link {
  color: var(--bs-tertiary-color);
  border-color: transparent;
}
[data-theme="dark"] .nav-tabs .nav-link:hover,
[data-theme="dark"] .nav-tabs-custom .nav-link:hover {
  color: var(--bs-body-color);
}
[data-theme="dark"] .nav-tabs .nav-link.active,
[data-theme="dark"] .nav-tabs-custom .nav-link.active {
  color: var(--bs-primary);
  background-color: transparent;
  border-color: transparent;
}

/* ---- Page headers ---- */
[data-theme="dark"] .app-page-header {
  background-color: transparent;
}
[data-theme="dark"] .app-page-header h4,
[data-theme="dark"] .app-page-header h1,
[data-theme="dark"] .app-page-header h5 {
  color: var(--bs-emphasis-color);
}
[data-theme="dark"] .app-page-header p {
  color: var(--bs-tertiary-color);
}
[data-theme="dark"] .app-page-header-icon {
  background-color: rgba(var(--bs-primary-rgb), 0.18);
  color: var(--bs-primary);
}

/* ---- Breadcrumbs + misc text ---- */
[data-theme="dark"] .breadcrumb,
[data-theme="dark"] .breadcrumb-item { color: var(--bs-tertiary-color); }
[data-theme="dark"] .breadcrumb-item.active,
[data-theme="dark"] .breadcrumb-item a { color: var(--bs-body-color); }

/* ---- Alerts / toasts ---- */
[data-theme="dark"] .alert {
  background-color: #2a2a3d;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .toast {
  background-color: #2a2a3d;
  color: var(--bs-body-color);
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .toast-header {
  background-color: #252537;
  color: var(--bs-body-color);
  border-bottom-color: var(--bs-border-color);
}
[data-theme="dark"] .toast-header .btn-close {
  filter: invert(1) grayscale(100%) brightness(200%);
}
/* showToast() (#toast-container) + toastr.js fallback both use these classes from
   toastr.css. The .light-style rules ship with white-bg + dark-text and a light
   shadow; load order is theme-dark.css then toastr.css, so we need a compound
   `[data-theme="dark"].light-style ...` selector (both classes attach to <html>,
   no descendant space) with higher specificity than `.light-style #toast-container ...`. */
[data-theme="dark"].light-style #toast-container > .toast,
[data-theme="dark"].light-style #toast-container > .toast-success,
[data-theme="dark"].light-style #toast-container > .toast-error,
[data-theme="dark"].light-style #toast-container > .toast-info,
[data-theme="dark"].light-style #toast-container > .toast-warning,
[data-theme="dark"].light-style #toast-container .toast-success,
[data-theme="dark"].light-style #toast-container .toast-error,
[data-theme="dark"].light-style #toast-container .toast-info,
[data-theme="dark"].light-style #toast-container .toast-warning {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style #toast-container > div {
  box-shadow: 0 0.1875rem 0.75rem 0 rgba(0, 0, 0, 0.4) !important;
  border: 1px solid var(--bs-border-color);
}
[data-theme="dark"].light-style #toast-container .toast-title {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style #toast-container .toast-message {
  color: var(--bs-body-color);
}
[data-theme="dark"].light-style #toast-container .toast-message a {
  color: var(--bs-primary);
}
[data-theme="dark"].light-style #toast-container .toast-message a:hover {
  color: rgba(var(--bs-primary-rgb), 0.7);
}
[data-theme="dark"].light-style #toast-container .toast-close-button {
  color: var(--bs-tertiary-color) !important;
  text-shadow: none;
}
[data-theme="dark"].light-style #toast-container .toast-progress {
  background-color: var(--bs-primary);
  opacity: 0.4;
}

/* ---- Pagination ---- */
[data-theme="dark"] .page-link {
  background-color: transparent;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .page-link:hover {
  background-color: rgba(255, 255, 255, 0.05);
  color: var(--bs-emphasis-color);
}
[data-theme="dark"] .page-item.active .page-link {
  background-color: var(--bs-primary);
  border-color: var(--bs-primary);
  color: #fff;
}
[data-theme="dark"] .page-item.disabled .page-link {
  color: var(--bs-tertiary-color);
}

/* ---- Flatpickr (date-range picker) ---- */
[data-theme="dark"] .flatpickr-calendar,
[data-theme="dark"] .flatpickr-months,
[data-theme="dark"] .flatpickr-weekdays,
[data-theme="dark"] .flatpickr-innerContainer {
  background-color: #232334;
  color: var(--bs-body-color);
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .flatpickr-day {
  color: var(--bs-body-color);
}
[data-theme="dark"] .flatpickr-day.prevMonthDay,
[data-theme="dark"] .flatpickr-day.nextMonthDay {
  color: var(--bs-tertiary-color);
}
[data-theme="dark"] .flatpickr-day:hover {
  background-color: rgba(255, 255, 255, 0.06);
}
[data-theme="dark"] .flatpickr-weekday,
[data-theme="dark"] .flatpickr-current-month,
[data-theme="dark"] .flatpickr-monthDropdown-months,
[data-theme="dark"] .numInputWrapper input {
  color: var(--bs-body-color) !important;
  background-color: transparent;
}

/* ---- Search overlay ---- */
[data-theme="dark"] .search-overlay { background-color: rgba(10, 10, 20, 0.75); }
[data-theme="dark"] .search-overlay-panel {
  background-color: #232334;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] .search-overlay-input {
  background-color: transparent;
  color: var(--bs-body-color);
}
/* Browser autofill (Chrome / Edge / Safari) paints a yellow-ish background
 * onto inputs even when CSS sets `background: transparent`. The trick is
 * an inset box-shadow large enough to cover the input, in the surface
 * color we want — the autofill background then sits *behind* the shadow
 * and never shows. -webkit-text-fill-color keeps the typed text legible. */
[data-theme="dark"] .search-overlay-input:-webkit-autofill,
[data-theme="dark"] .search-overlay-input:-webkit-autofill:hover,
[data-theme="dark"] .search-overlay-input:-webkit-autofill:focus,
[data-theme="dark"] .search-overlay-input:-webkit-autofill:active {
  -webkit-box-shadow: 0 0 0 1000px transparent inset !important;
  box-shadow: 0 0 0 1000px transparent inset !important;
  -webkit-text-fill-color: var(--bs-body-color) !important;
  background-color: transparent !important;
  transition: background-color 5000s ease-in-out 0s;
}
[data-theme="dark"] .search-overlay-row:hover,
[data-theme="dark"] .search-overlay-row.is-focused {
  background-color: rgba(255, 255, 255, 0.04);
}

/* ---- Sweetalert2 ---- */
[data-theme="dark"] .swal2-popup {
  background-color: #232334;
  color: var(--bs-body-color);
}
[data-theme="dark"] .swal2-title,
[data-theme="dark"] .swal2-html-container,
[data-theme="dark"] .swal2-content {
  color: var(--bs-body-color);
}

/* ---- Scrollbars (webkit) ---- */
[data-theme="dark"] ::-webkit-scrollbar-track { background: transparent; }
[data-theme="dark"] ::-webkit-scrollbar-thumb {
  background-color: var(--bs-border-color);
  border-radius: 999px;
}

/* =====================================================================
 * Page-scoped overrides
 *
 * Many feature pages (transactions, activity, user-behavior, players, etc)
 * declare their own CSS variables like `--tx-border-color: #ebe9f1` with
 * *hardcoded* light hex fallbacks — so even if `--bs-border-color` is
 * dark, those pages still paint light. Rebind them here. Also covers a
 * pile of `background: #fff` / `white` scattered across the page CSS by
 * targeting common utility class patterns under [data-theme="dark"].
 * ===================================================================== */

[data-theme="dark"] .tx-page,
[data-theme="dark"] .al-page,
[data-theme="dark"] .ub-page,
[data-theme="dark"] .pl-page,
[data-theme="dark"] .companies-page,
[data-theme="dark"] .imp-page,
[data-theme="dark"] .players-page,
[data-theme="dark"] .responsible-gambling-page {
  --tx-border-color: var(--bs-border-color);
  --tx-text-primary: var(--bs-body-color);
  --tx-text-secondary: var(--bs-secondary-color);
  --tx-text-muted: var(--bs-tertiary-color);

  --al-border-color: var(--bs-border-color);
  --al-text-primary: var(--bs-body-color);
  --al-text-secondary: var(--bs-secondary-color);
  --al-text-muted: var(--bs-tertiary-color);

  --ub-border-color: var(--bs-border-color);
  --ub-text-primary: var(--bs-body-color);
  --ub-text-secondary: var(--bs-secondary-color);
  --ub-text-muted: var(--bs-tertiary-color);

  --cp-border-color: var(--bs-border-color);
  --cp-text-primary: var(--bs-body-color);
  --cp-text-secondary: var(--bs-secondary-color);
  --cp-text-muted: var(--bs-tertiary-color);
  --cp-body-bg: var(--bs-body-bg);

  --imp-border-color: var(--bs-border-color);
  --imp-text-primary: var(--bs-body-color);
  --imp-text-secondary: var(--bs-secondary-color);
  --imp-text-muted: var(--bs-tertiary-color);
  --imp-body-bg: var(--bs-body-bg);
}

/* ---- Search inputs on filter bars (most pages use `.search-input`) ---- */
[data-theme="dark"] .search-input,
[data-theme="dark"] .tx-search-input,
[data-theme="dark"] .al-search-input,
[data-theme="dark"] .ub-search-input,
[data-theme="dark"] input[type="search"] {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .search-input::placeholder,
[data-theme="dark"] .tx-search-input::placeholder,
[data-theme="dark"] .al-search-input::placeholder,
[data-theme="dark"] .ub-search-input::placeholder { color: var(--bs-tertiary-color) !important; }

/* ---- Summary strip (Transactions / Total Deposits / Total Payouts) ---- */
[data-theme="dark"] .summary-strip,
[data-theme="dark"] .tx-summary,
[data-theme="dark"] .tx-summary-strip,
[data-theme="dark"] .al-summary,
[data-theme="dark"] .ub-summary,
[data-theme="dark"] .results-summary {
  background-color: #2b2b3f !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}

/* ---- Category / quick-filter chip strips ---- */
[data-theme="dark"] .category-chips,
[data-theme="dark"] .tx-category-chips,
[data-theme="dark"] .al-category-chips,
[data-theme="dark"] .quick-filters,
[data-theme="dark"] .nav-tabs-custom,
[data-theme="dark"] .category-chip,
[data-theme="dark"] .quick-filter-tab {
  background-color: transparent !important;
  color: var(--bs-body-color);
}
[data-theme="dark"] .category-chip:hover,
[data-theme="dark"] .quick-filter-tab:hover {
  background-color: rgba(255, 255, 255, 0.04) !important;
}

/* Generic white-panel rescue: any .card-like element inside page scopes
   that hardcoded `background: #fff`. */
[data-theme="dark"] .tx-page .card,
[data-theme="dark"] .al-page .card,
[data-theme="dark"] .ub-page .card,
[data-theme="dark"] .pl-page .card,
[data-theme="dark"] .companies-page .card,
[data-theme="dark"] .imp-page .card,
[data-theme="dark"] .players-page .card,
[data-theme="dark"] .responsible-gambling-page .card,
[data-theme="dark"] .companies-page .search-input-wrapper input,
[data-theme="dark"] .tx-page .tx-filter-card,
[data-theme="dark"] .al-page .al-filter-card,
[data-theme="dark"] .ub-page .ub-filter-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color);
}

/* KPI / stat cards that hardcode white */
[data-theme="dark"] .stat-card,
[data-theme="dark"] .kpi-card,
[data-theme="dark"] .rg-stat-card,
[data-theme="dark"] .metric-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color);
}
[data-theme="dark"] .stat-card .stat-value,
[data-theme="dark"] .kpi-card .kpi-value,
[data-theme="dark"] .metric-card .metric-value { color: var(--bs-body-color) !important; }

/* Pagination footer pills used on importer / transactions */
[data-theme="dark"] .pagination-footer,
[data-theme="dark"] .pagination-footer .page-size-select,
[data-theme="dark"] .pagination-footer .btn-page {
  background-color: transparent;
  color: var(--bs-body-color);
  border-color: var(--bs-border-color);
}
[data-theme="dark"] .pagination-footer .page-size-select,
[data-theme="dark"] .pagination-footer .btn-page {
  background-color: #2a2a3d !important;
}

/* Filter-tag pills (used on filter strips across pages) */
[data-theme="dark"] .filter-tag {
  background-color: rgba(var(--bs-primary-rgb), 0.15) !important;
  border-color: rgba(var(--bs-primary-rgb), 0.3) !important;
  color: var(--bs-body-color);
}
[data-theme="dark"] .filter-tag-remove:hover {
  background-color: rgba(234, 84, 85, 0.2) !important;
}

/* =====================================================================
 * Add-filter popover + filter editor (.filter-picker / .filter-editor)
 * Used on /companies, /transactions, /players, /importer (and the
 * `.al-` prefixed variant on /audit-log). All variants use a hardcoded
 * `background: #fff` and depend on light-color tokens for borders and
 * text. Override the surface and re-color the rows / inputs / actions
 * so the popover is readable in dark mode.
 * ===================================================================== */
[data-theme="dark"] .filter-picker,
[data-theme="dark"] .filter-editor,
[data-theme="dark"] .al-filter-picker,
[data-theme="dark"] .al-filter-editor {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5) !important;
}
[data-theme="dark"] .filter-picker-header,
[data-theme="dark"] .al-filter-picker-header {
  color: var(--bs-tertiary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .filter-picker-item,
[data-theme="dark"] .al-filter-picker-item {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .filter-picker-item:hover,
[data-theme="dark"] .al-filter-picker-item:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
}
[data-theme="dark"] .filter-picker-item i,
[data-theme="dark"] .al-filter-picker-item i {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .filter-editor .filter-editor-label,
[data-theme="dark"] .al-filter-editor .filter-editor-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .filter-editor input[type="text"],
[data-theme="dark"] .filter-editor input[type="date"],
[data-theme="dark"] .filter-editor input[type="number"],
[data-theme="dark"] .filter-editor select,
[data-theme="dark"] .al-filter-editor input[type="text"],
[data-theme="dark"] .al-filter-editor input[type="date"],
[data-theme="dark"] .al-filter-editor input[type="number"],
[data-theme="dark"] .al-filter-editor select {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .filter-editor input::placeholder,
[data-theme="dark"] .al-filter-editor input::placeholder {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .filter-checkbox-list,
[data-theme="dark"] .al-filter-checkbox-list {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .filter-checkbox-list label,
[data-theme="dark"] .al-filter-checkbox-list label {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .btn-cancel-filter,
[data-theme="dark"] .al-btn-cancel-filter {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .btn-cancel-filter:hover,
[data-theme="dark"] .al-btn-cancel-filter:hover {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * Page header h4 titles — `.tx-page-header h4` and the audit-log
 * `.al-page-header h4` use scoped CSS variables that resolve to
 * `#5e5873` (dark slate). In dark mode that's invisible on the dark
 * body. Same fix for tx subtitle `p` which uses --tx-text-secondary.
 * ===================================================================== */
[data-theme="dark"] .tx-page-header h4,
[data-theme="dark"] .al-page-header h4,
[data-theme="dark"] .ub-page-header h4 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .tx-page-header p,
[data-theme="dark"] .al-page-header p,
[data-theme="dark"] .ub-page-header p {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /companies/:id Source Reconciliation table — Net Deposit totals row
 * uses inline `style="background-color: #f3f2f7; font-weight: 600;"`
 * which paints a near-white band over a dark page. Beat the inline
 * value with an attribute selector.
 * ===================================================================== */
[data-theme="dark"] #reconciliationTable tr[style*="f3f2f7"] {
  background-color: #2b2b3f !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #reconciliationTable tr[style*="f3f2f7"] td {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /config Two-Step Verification card body — `.security-card-body` is
 * `background: white` and `.security-method` is `#f9f9fb`, both of
 * which break the dark surface set by the parent `.security-card`.
 * Title / subtitle / methods row also need text-color overrides.
 * ===================================================================== */
[data-theme="dark"] .security-card-body {
  background-color: #232334 !important;
  border-top-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .security-title {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .security-subtitle,
[data-theme="dark"] .security-chevron {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .security-detail-item {
  color: var(--bs-body-color) !important;
  background-color: transparent !important;
}
[data-theme="dark"] .security-method {
  background-color: #2a2a3d !important;
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * Info-row pattern (used in #txDetailModal, user detail, profile,
 * activity audit detail). Light-mode tokens: label `#b9b9c3`, value
 * `#5e5873`, separator `#f3f2f7`, section title `#5e5873`. The label
 * is already faint and the value is invisible on dark surfaces.
 * Modal title in #txDetailModal uses scoped --tx-text-primary which
 * also resolves to a dark slate — pin it to body color.
 * ===================================================================== */
[data-theme="dark"] .info-row {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .info-row-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .info-row-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .tx-detail-section-title {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #txDetailModal .modal-title {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #txDetailModal .modal-header,
[data-theme="dark"] #txDetailModal .modal-footer {
  border-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * /companies list table — companies/index.ejs hardcodes
 * `tbody td { color: #2f2b3d }` and `.company-name { color: #2f2b3d }`
 * which are invisible on the dark surface. Logo placeholder bg
 * `#f3f2f7` also flashes light when a row has no logo image.
 * ===================================================================== */
[data-theme="dark"] .companies-page #companiesTable tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .companies-page .company-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .companies-page .company-logo {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .companies-page #companiesTable tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}

/* =====================================================================
 * /transactions list table — `#transactions-table tbody td` hardcodes
 * `color: #2f2b3d` (the Date column inherits this) and `.msisdn-cell`
 * uses `--tx-text-secondary` (#6e6b7b). Both are too dark for the
 * dark surface — remap to body / secondary so all columns read.
 * ===================================================================== */
[data-theme="dark"] #transactions-table tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #transactions-table .msisdn-cell {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] #transactions-table .msisdn-cell:hover {
  color: var(--bs-primary) !important;
}
[data-theme="dark"] #transactions-table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}

/* =====================================================================
 * /players list table — `#players-table tbody td` hardcodes #2f2b3d
 * (Date / Birthdate / Age / Created columns), `.msisdn-item` pills
 * carry their own light bg + `#5e5873` text, and `.company-tag` chips
 * are color-coded inline by the JS but their *base* layout class
 * still lacks contrast in dark mode. Fix all three.
 * ===================================================================== */
[data-theme="dark"] #players-table tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #players-table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
[data-theme="dark"] .msisdn-item {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * Players list filter strip pieces also used on /companies:
 * .quick-filters .nav-link, .btn-save-filter, .summary-text. Light-
 * mode hardcodes #6e6b7b / #5e5873 / #ebe9f1 — remap to body / muted
 * tokens and theme-aware borders.
 * ===================================================================== */
[data-theme="dark"] .quick-filters .nav-link {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .quick-filters .nav-link:hover {
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .quick-filters .nav-link.active {
  color: var(--bs-primary) !important;
  background-color: rgba(var(--bs-primary-rgb), 0.16) !important;
  border-color: rgba(var(--bs-primary-rgb), 0.35) !important;
}
[data-theme="dark"] .btn-save-filter {
  color: var(--bs-secondary-color) !important;
  border-color: var(--bs-border-color) !important;
  background-color: transparent !important;
}
[data-theme="dark"] .btn-save-filter:hover {
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .summary-text {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .summary-text strong {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * Stat-card value (responsible-gambling cases dashboard, player-fraud
 * detail). Light-mode `#5e5873` is invisible on dark cards.
 * ===================================================================== */
[data-theme="dark"] .stat-card-value {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /companies-fraud/:id/detail — the page header `.company-name` h2
 * and the SMS-evidence cards both carry hardcoded light tokens.
 * Note: `.company-name` already has a /companies-list dark rule —
 * it's the same class name so this rule complements that without
 * a scope conflict.
 * ===================================================================== */
[data-theme="dark"] .company-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .company-meta {
  color: var(--bs-secondary-color) !important;
}

[data-theme="dark"] .sms-evidence-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .sms-evidence-card:hover {
  border-color: rgba(var(--bs-primary-rgb), 0.4) !important;
}
[data-theme="dark"] .sms-evidence-header {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .sms-evidence-phone {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .sms-evidence-time,
[data-theme="dark"] .sms-evidence-tag {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .sms-evidence-content {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .sms-evidence-footer {
  background-color: #252537 !important;
  border-top-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * #emailThreadModal — `.email-thread` ($f9f9fb) and each `.email-
 * message` (white) need dark surfaces. Header from / date / body
 * also use light tokens.
 * ===================================================================== */
[data-theme="dark"] .email-thread {
  background-color: #1f1f2e !important;
}
[data-theme="dark"] .email-message {
  background-color: #2a2a3d !important;
  border-left-color: var(--bs-border-color);
}
[data-theme="dark"] .email-from {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .email-date {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .email-message-body {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /config Roles & Permissions table — description cell is rendered
 * as `<span class="text-muted">…</span>`. In dark mode `.text-muted`
 * already maps to --bs-tertiary-color via the global rule, but on
 * this table we want the description a touch brighter so it reads
 * as content rather than a hint. Override just for the rolesTable.
 * ===================================================================== */
[data-theme="dark"] #rolesTable tbody td .text-muted {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /management list table — `#user-management-table tbody td`
 * hardcodes #2f2b3d (Email + Last Login + ID columns inherit) and
 * `.user-name` is `#5e5873`. Both invisible on dark surface.
 * Also: the page wraps its filter row in `.filter-bar` which my
 * earlier dark-mode rule for player-detail filter bars was painting
 * `#2b2b3f`. The /management filter bar isn't a card and shouldn't
 * carry that surface — reset it to transparent.
 * ===================================================================== */
[data-theme="dark"] #user-management-table tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .user-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .user-department {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] #user-management-table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
/* The /management filter-bar lives inside `.card-body`. Other usages
 * (player detail Financials/Betting tabs) are siblings of `.card-header`
 * and use the standalone `#2b2b3f` strip from the earlier filter-bar
 * rule. Scope the transparent reset to `.card-body .filter-bar` so it
 * only catches the user-management page (and profile, which also uses
 * `.card-body .filter-bar` and reads better without the strip). */
[data-theme="dark"] .card-body .filter-bar {
  background-color: transparent !important;
  border-color: transparent !important;
}

/* =====================================================================
 * /config Roles & Permissions table — Permissions cell renders a
 * comma-joined string with `<small class="text-muted">…</small>` on
 * the resource list. Bump it to body color so the resource list reads
 * as content rather than a hint, and same for the row's other muted
 * columns inside #rolesTable.
 * ===================================================================== */
[data-theme="dark"] #rolesTable tbody td,
[data-theme="dark"] #rolesTable tbody td .text-muted,
[data-theme="dark"] #rolesTable tbody td small {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #rolesTable tbody td .text-muted.fst-italic,
[data-theme="dark"] #rolesTable tbody td .role-empty {
  color: var(--bs-tertiary-color) !important;
}

/* =====================================================================
 * /audit-log suspicious-activity banner (#alAlertBanner). Light-mode
 * tint `rgba(185, 28, 28, 0.04)` is too faint to read on the dark
 * body — the banner disappears. Bump the alpha so it lands as a soft
 * red tint, similar to a Bootstrap alert-danger panel.
 * ===================================================================== */
[data-theme="dark"] .al-alert-banner {
  background-color: rgba(220, 53, 69, 0.16) !important;
  border-color: rgba(220, 53, 69, 0.35) !important;
}
[data-theme="dark"] .al-alert-banner-header:hover {
  background-color: rgba(220, 53, 69, 0.10) !important;
}
[data-theme="dark"] .al-alert-banner-body {
  border-top-color: rgba(220, 53, 69, 0.20) !important;
}
[data-theme="dark"] .al-alert-row:not(:last-child) {
  border-bottom-color: rgba(220, 53, 69, 0.12) !important;
}
[data-theme="dark"] .al-alert-banner-left {
  color: #f87171 !important;
}
[data-theme="dark"] .al-alert-banner-count {
  background-color: rgba(220, 53, 69, 0.28) !important;
  color: #fecaca !important;
}

/* =====================================================================
 * /audit-log Timeline tab — `.al-timeline-content` is `#f9f9fb`,
 * `.al-timeline-selector` is `#f9f9fb`, `.al-filter-input` is white.
 * Also the `--al-text-*` page tokens resolve to dark slate, which is
 * invisible on dark surfaces. Remap each text role.
 * ===================================================================== */
[data-theme="dark"] .al-timeline-content {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .al-timeline-content:hover {
  background-color: #32324a !important;
}
[data-theme="dark"] .al-timeline-selector {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .al-filter-input {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .al-timeline-title,
[data-theme="dark"] .al-new-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .al-timeline-description {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .al-timeline-date,
[data-theme="dark"] .al-timeline-meta,
[data-theme="dark"] .al-timeline-meta span,
[data-theme="dark"] .al-timeline-date-group,
[data-theme="dark"] .al-timeline-empty,
[data-theme="dark"] .al-old-value,
[data-theme="dark"] .al-filter-label {
  color: var(--bs-tertiary-color) !important;
}

/* =====================================================================
 * /importer expand-row — `.stat-box` is `background: white`. The
 * Per-MMO Breakdown table wrapper and Timeline wrapper are JS-built
 * with inline `style="background:#fff;"` which needs the attribute-
 * selector trick to override.
 * ===================================================================== */
[data-theme="dark"] .imp-page .stat-box {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .imp-page .stat-box .stat-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .imp-page .expand-content div[style*="background:#fff"],
[data-theme="dark"] .imp-page .expand-content div[style*="background: #fff"],
[data-theme="dark"] .imp-page .expand-content div[style*="background:white"],
[data-theme="dark"] .imp-page .expand-content div[style*="background: white"],
[data-theme="dark"] .expand-content div[style*="background:#fff"],
[data-theme="dark"] .expand-content div[style*="background: #fff"],
[data-theme="dark"] .expand-content div[style*="background:white"],
[data-theme="dark"] .expand-content div[style*="background: white"] {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
}
/* ApexCharts canvas inside the importer expand-row charts — force a
 * transparent SVG background even if `chart.background` config didn't
 * propagate (e.g. legacy renders). The canvas paints a solid `<rect>`
 * fill="#fff" otherwise. */
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-canvas,
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-canvas svg,
[data-theme="dark"] #gapTimelineChart .apexcharts-canvas,
[data-theme="dark"] #gapTimelineChart .apexcharts-canvas svg,
[data-theme="dark"] #selectedWindowChart .apexcharts-canvas,
[data-theme="dark"] #selectedWindowChart .apexcharts-canvas svg {
  background-color: transparent !important;
}

/* importer.js renders 7 wrappers with inline `style="background:var(--imp-card-bg, #fff); ..."`.
 * `.imp-page` scoped CSS sets `--imp-card-bg: var(--bs-card-bg, #ffffff)` which stays
 * white in dark mode (Bootstrap doesn't flip --bs-card-bg). Override the var
 * once on `.imp-page` in dark mode and every wrapper auto-flips without per-
 * selector attribute matching. */
[data-theme="dark"] .imp-page {
  --imp-card-bg: #232334;
}
[data-theme="dark"] .imp-page .expand-content table {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .imp-page .expand-section-title {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /players list expandable row — `.linked-account-item` rows
 * (rendered when a National-ID row is expanded) hardcode #5e5873 /
 * #6e6b7b / #ebe9f1. Remap to body / secondary / border tokens.
 * ===================================================================== */
[data-theme="dark"] .linked-account-item {
  color: var(--bs-body-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .linked-account-item .account-msisdn {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .linked-account-item .account-arrow {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .linked-account-item .account-username {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /players/:id (player detail) — comprehensive dark-mode pass.
 * `players/detail.ejs` scopes ~30 classes that hardcode #5e5873 /
 * #6e6b7b / #b9b9c3 / #2f2b3d / #ebe9f1 / #f9f9fb / #f3f2f7 / #fff
 * across the profile header, KPI cards, page tables, expand-rows,
 * inline ledger, balance flow, modals, and pagination. Existing
 * .timeline-* / .filter-bar / .ledger-filter-bar / .propagation-
 * summary / .linked-account-item rules above already cover their
 * pieces — the block below adds everything else on the page.
 * ===================================================================== */

/* Profile header: name, meta grid, action divider, footer note */
[data-theme="dark"] .profile-details h3 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .profile-meta-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .profile-meta-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .profile-actions {
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .profile-note {
  color: var(--bs-tertiary-color) !important;
}

/* KPI tiles on the Overview tab (.kpi-card-equal) */
[data-theme="dark"] .kpi-card-equal .kpi-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .kpi-card-equal .kpi-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .kpi-card-equal .kpi-source {
  color: var(--bs-tertiary-color) !important;
}

/* Page tables under #playerDetailPage (MSISDNs / Company Accounts /
 * Betting Activity tables). thead bg #f3f2f7 + tbody #2f2b3d body. */
[data-theme="dark"] #playerDetailPage .table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] #playerDetailPage .table tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #playerDetailPage .table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}

/* Expand-row chrome (chevron + section title + bottom border) */
[data-theme="dark"] .expand-toggle {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .expand-content {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .expand-section-title {
  color: var(--bs-tertiary-color) !important;
}

/* Timeline (vertical track separator only — content already handled) */
[data-theme="dark"] .timeline::before {
  background-color: var(--bs-border-color) !important;
}

/* Ban-propagation tile values + labels */
[data-theme="dark"] .propagation-stat-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .propagation-stat-label {
  color: var(--bs-tertiary-color) !important;
}

/* Warning banner body text (red-tinted panel — bg already legible) */
[data-theme="dark"] .warning-banner p {
  color: var(--bs-body-color) !important;
}

/* Ban / Unban modal player-info box (bg #f3f2f7) */
[data-theme="dark"] .user-info-box {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
}

/* Inline ledger inside Company Accounts expand rows */
[data-theme="dark"] .inline-ledger {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .inline-ledger .table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .inline-ledger .table tbody td {
  color: var(--bs-body-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .inline-ledger .table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}

/* Balance flow bar (Opening → Deposit → Bonus → … → Closing) */
[data-theme="dark"] .balance-flow {
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .balance-flow-item {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .balance-flow-item.flow-opening,
[data-theme="dark"] .balance-flow-item.flow-closing {
  background-color: #232334 !important;
}
[data-theme="dark"] .balance-flow-item + .balance-flow-item {
  border-left-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .balance-flow-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .balance-flow-value {
  color: var(--bs-body-color) !important;
}

/* Ledger pagination */
[data-theme="dark"] .ledger-pagination-info {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .ledger-page-btn {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .ledger-page-btn:hover:not(:disabled) {
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .ledger-page-btn.active {
  background-color: var(--bs-primary) !important;
  border-color: var(--bs-primary) !important;
  color: #ffffff !important;
}

/* Inline `style="color:#5e5873"` / `#b9b9c3` used in the breadcrumb,
 * "last status change" footer, and modal player-info box (Ban/Unban).
 * Catch via attribute selectors so the inline values don't beat us.
 * Scoped to the page wrapper to keep blast radius tight. */
[data-theme="dark"] #playerDetailPage [style*="color: #5e5873"],
[data-theme="dark"] #playerDetailPage [style*="color:#5e5873"] {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #playerDetailPage [style*="color: #b9b9c3"],
[data-theme="dark"] #playerDetailPage [style*="color:#b9b9c3"] {
  color: var(--bs-tertiary-color) !important;
}

/* =====================================================================
 * /players/responsible-gambling/:nid/:caseId/detail — case detail page
 * `responsible-gambling-detail.ejs` scopes ~50 classes that hardcode
 * light tokens (#fff / #f3f2f7 / #f9f9fb / #ebe9f1 / #5e5873 / #6e6b7b
 * / #b9b9c3 / #2f2b3d). Comprehensive dark-mode pass below.
 * ===================================================================== */

/* Breadcrumb */
[data-theme="dark"] .breadcrumb-current {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .breadcrumb-separator {
  color: var(--bs-tertiary-color) !important;
}

/* Case header card (white bg + meta + divider) */
[data-theme="dark"] .case-header-card {
  background-color: #232334 !important;
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.35) !important;
}
[data-theme="dark"] .case-header-nid-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .case-header-nid-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .case-header-meta {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .case-header-case-id {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .case-header-divider {
  background-color: var(--bs-border-color) !important;
}

/* Export button (transparent → dark surface) */
[data-theme="dark"] .btn-export {
  background-color: #2a2a3d !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .btn-export:hover {
  background-color: #32324a !important;
  color: var(--bs-body-color) !important;
}

/* Why-flagged item text */
[data-theme="dark"] .explainability-item .text {
  color: var(--bs-body-color) !important;
}

/* Player overview grid (NID / MSISDNs / loss / period / casino / sports / companies) */
[data-theme="dark"] .player-overview-grid {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .player-overview-section {
  border-right-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .player-overview-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .player-overview-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .msisdn-pill {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  color: var(--bs-body-color) !important;
}

/* Daily Loss Pattern — Cumulative Loss summary card */
[data-theme="dark"] .loss-summary-bar {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .loss-summary-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .loss-summary-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .loss-summary-threshold {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .loss-summary-track {
  background-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .loss-summary-marker {
  background-color: var(--bs-body-color) !important;
}
[data-theme="dark"] .loss-summary-footer {
  color: var(--bs-tertiary-color) !important;
}

/* Chart legend strip */
[data-theme="dark"] .chart-legend-bottom {
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .chart-legend-item {
  color: var(--bs-secondary-color) !important;
}

/* ApexCharts custom tooltip popover (white card) */
[data-theme="dark"] .chart-tooltip {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5) !important;
}
[data-theme="dark"] .chart-tooltip-date {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .chart-tooltip-value {
  color: var(--bs-body-color) !important;
}

/* Transaction Log list rows */
[data-theme="dark"] .transaction-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .transaction-item:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
[data-theme="dark"] .transaction-date,
[data-theme="dark"] .transaction-operator-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .transaction-time,
[data-theme="dark"] .transaction-stake {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .transaction-msisdn {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  color: var(--bs-secondary-color) !important;
}

/* Pagination bar inside transaction-list / case-history */
[data-theme="dark"] .pagination-bar {
  background-color: #2a2a3d !important;
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .pagination-info {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .pagination-btn {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .pagination-btn:hover:not(:disabled):not(.active) {
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
}

/* Company Breakdown rows */
[data-theme="dark"] .operator-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .operator-item:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.06) !important;
}
[data-theme="dark"] .operator-rank {
  background-color: #2a2a3d !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .operator-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .operator-msisdn-tag {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .operator-amount-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .operator-amount-label,
[data-theme="dark"] .operator-loss-percent {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .operator-loss-bar {
  background-color: #2a2a3d !important;
}

/* Activity by Time of Day cards */
[data-theme="dark"] .time-period-card {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .time-period-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .time-period-hours {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .time-period-bar {
  background-color: var(--bs-border-color) !important;
}

/* Decision panel — radio options on white cards */
[data-theme="dark"] .decision-panel-title,
[data-theme="dark"] .decision-option-title {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .decision-option {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .decision-option-desc {
  color: var(--bs-secondary-color) !important;
}

/* Recent Bets + Case History tables */
[data-theme="dark"] #recentBetsTable thead th,
[data-theme="dark"] #recentBetsTable tfoot th,
[data-theme="dark"] #caseHistoryTable thead th,
[data-theme="dark"] #caseHistoryTable tfoot th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #recentBetsTable tbody td,
[data-theme="dark"] #caseHistoryTable tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #recentBetsTable tbody tr:hover,
[data-theme="dark"] #caseHistoryTable tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.06) !important;
}

/* =====================================================================
 * /management/detail/:id (user-detail.ejs) — Permissions, Login
 * History, and Audit Logs tables hardcode `.table thead th` with
 * `#f3f2f7` + `#6e6b7b` and `.table tbody td` with `#2f2b3d`. The
 * #loginHistoryTable / #auditLogsTable also re-assert `tbody td`
 * with `#2f2b3d`. Plus Sessions tab cards (.session-item / .session-
 * device / .session-meta), Timeline (.timeline-* — same class names
 * as player detail, re-asserted here), Export History (.export-*),
 * the pagination footer, and the Upload Photo dropzone.
 * ===================================================================== */
[data-theme="dark"] #permissionsTable thead th,
[data-theme="dark"] #loginHistoryTable thead th,
[data-theme="dark"] #auditLogsTable thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #permissionsTable tbody td,
[data-theme="dark"] #loginHistoryTable tbody td,
[data-theme="dark"] #auditLogsTable tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #permissionsTable tbody tr:hover,
[data-theme="dark"] #loginHistoryTable tbody tr:hover,
[data-theme="dark"] #auditLogsTable tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
/* Both /profile and /management/detail/:id render Login History +
 * Audit Logs cells via JS — the column renderers wrap timestamp /
 * IP / location values in `<span style="color: #2f2b3d;">`, an
 * INLINE color that beats my `tbody td color` rule via specificity.
 * Catch the literal value with the attribute-selector trick so the
 * inline tokens get re-mapped to body color in dark mode. */
[data-theme="dark"] #loginHistoryTable [style*="color: #2f2b3d"],
[data-theme="dark"] #loginHistoryTable [style*="color:#2f2b3d"],
[data-theme="dark"] #auditLogsTable [style*="color: #2f2b3d"],
[data-theme="dark"] #auditLogsTable [style*="color:#2f2b3d"] {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * Global inline-color remap. JS column renderers across 8 files
 * (user_management, user-detail-page, profile-page, player-detail,
 * player-list, transactions, importer, company-detail) wrap cell
 * values in `<span style="...color: #2f2b3d|#5e5873|#6e6b7b|#82868b">`,
 * inline tokens that beat scoped `tbody td color` in dark mode.
 * Catch each literal value via the attribute-selector trick and
 * remap to the matching theme token. The hex set below is exactly
 * the page-design vocabulary for "dark slate body text" — these
 * colors should never paint on a dark surface regardless of context.
 * ===================================================================== */
[data-theme="dark"] [style*="color: #2f2b3d"],
[data-theme="dark"] [style*="color:#2f2b3d"],
[data-theme="dark"] [style*="color: #5e5873"],
[data-theme="dark"] [style*="color:#5e5873"] {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] [style*="color: #6e6b7b"],
[data-theme="dark"] [style*="color:#6e6b7b"],
[data-theme="dark"] [style*="color: #82868b"],
[data-theme="dark"] [style*="color:#82868b"] {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] [style*="color: #b9b9c3"],
[data-theme="dark"] [style*="color:#b9b9c3"],
[data-theme="dark"] [style*="color: #444050"],
[data-theme="dark"] [style*="color:#444050"] {
  color: var(--bs-tertiary-color) !important;
}

/* =====================================================================
 * /management list — `.user-id-text` is a class (not inline) with
 * `color: #6e6b7b`, so the global attribute-selector remap doesn't
 * catch it. Bump it to body color so the USR-XXX id reads on dark.
 * Email + Last Login cells use inline `<span style="color: #6e6b7b">`
 * which IS caught by the global remap above.
 * ===================================================================== */
[data-theme="dark"] .user-id-text {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /config Settings tab — `.system-info-value` (timezone / country /
 * currency / language / phone code values) hardcodes `color: #5e5873`
 * via the page-scoped `<style>` block, which beats the global var
 * remap. Pin to body color in dark mode.
 * ===================================================================== */
[data-theme="dark"] .system-info-value {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /audit-log DataTables (Activity Log / Change History / IP & Devices)
 * scope `tbody td { color: #2f2b3d }` per table id, so the global
 * `tbody td` rules don't reach them. Override each table id directly.
 * ===================================================================== */
[data-theme="dark"] #alActivityTable tbody td,
[data-theme="dark"] #alChangeHistoryTable tbody td,
[data-theme="dark"] #alIpDevicesTable tbody td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #alActivityTable tbody tr:hover,
[data-theme="dark"] #alChangeHistoryTable tbody tr:hover,
[data-theme="dark"] #alIpDevicesTable tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
/* `.al-mono` (IP Address cells in Activity Log + IP & Devices tables,
 * and the Event Detail modal) ships `color: #2f2b3d` — closer ancestor
 * than the `td`, so the table-id rules above don't reach it. */
[data-theme="dark"] .al-mono {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /players list — `.company-tag` chips are rendered with INLINE
 * `style="color: X; background: Y"` per company (light-pastel
 * palette), so the chips read as anemic on a dark surface. Force a
 * unified dark style: dim the saturated bg with a primary-tint blend
 * and pin text to body color. Inline values still apply (we don't
 * use `!important` on background/color directly — we layer a
 * box-shadow inset to wash the colors). Simpler: override with
 * `!important` + attribute selector to catch any inline `background`.
 * ===================================================================== */
[data-theme="dark"] .company-tag {
  background-color: rgba(var(--bs-primary-rgb), 0.18) !important;
  color: var(--bs-body-color) !important;
  border: 1px solid rgba(var(--bs-primary-rgb), 0.32) !important;
}

/* =====================================================================
 * /importer/files/:id pagination-footer — `.imp-detail
 * .pagination-footer { background: #f9f9fb }` plus white selects/
 * buttons. Remap the strip + controls to dark surfaces.
 * ===================================================================== */
[data-theme="dark"] .imp-detail .pagination-footer {
  background-color: #232334 !important;
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .imp-detail .pagination-footer .page-size-select,
[data-theme="dark"] .imp-detail .pagination-footer .btn-page {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .imp-detail .pagination-footer .btn-page:hover:not(:disabled) {
  background-color: rgba(var(--bs-primary-rgb), 0.10) !important;
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .imp-detail .pagination-footer .page-indicator,
[data-theme="dark"] .imp-detail .pagination-footer .pagination-info {
  color: var(--bs-tertiary-color) !important;
}

/* =====================================================================
 * /config — templateWizardModal pieces. `.template-preview-box` is
 * `#f9f9fb`, `.info-panel` is `#f9f9fb`, `.placeholders-table th` is
 * `#f3f2f7`, `.checklist-text` is `#5e5873`. The earlier group rule
 * already gives `.template-preview-box` + `.checklist-item` a dark
 * `#2a2a3d` surface — supplement with text + thead overrides here.
 * ===================================================================== */
[data-theme="dark"] .info-panel {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .info-panel h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .placeholders-table th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .placeholders-table td {
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .checklist-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .checklist-text {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /config — taxRateWizardModal `.tax-review-summary` outer panel
 * (was `#f9f9fb`) and labels/values. The inner `.tax-review-row` is
 * already covered by the earlier group rule; we still need the outer
 * wrapper + label/value text colors here.
 * ===================================================================== */
[data-theme="dark"] .tax-review-summary {
  background-color: #232334 !important;
}
[data-theme="dark"] .tax-review-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .tax-review-value {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /config Tax Settings detail (e.g. Sport Tax) — Current Tax Rate
 * card. `.current-rate-card` already paints `#2a2a3d` via the earlier
 * group rule, but its header banner `.current-rate-header` is
 * `#f9f9fb` and its body `.current-rate-body` is nested inside —
 * remap the header to a slightly different dark band so the card
 * still reads as having a header.
 * ===================================================================== */
[data-theme="dark"] .current-rate-header {
  background-color: #2b2b3f !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .current-rate-header h6 {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * Bootstrap `.bg-light` utility — used in 4 templates (config preview
 * box, ncems, fraud_companies/detail, companies/detail). Default
 * Bootstrap fills it with `#f8f9fa` (the `--bs-light` token), which
 * paints white on dark surfaces. Remap globally so every consumer
 * picks up a dark surface in dark mode.
 * ===================================================================== */
[data-theme="dark"] .bg-light {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /players-fraud/:nid/detail — comprehensive dark-mode pass.
 * fraud_players/detail.ejs scopes ~30 classes that hardcode #fff /
 * #f9f9fb / #f3f2f7 / #5e5873 / #6e6b7b / #b9b9c3 / #ebe9f1.
 * `.stat-card-value`, `.flagged-players-table`, `.timeline-content/
 * title/date/description` are already covered globally — this block
 * adds everything else.
 * ===================================================================== */

/* Stat tiles + Linked Wallets / Active At Companies info cards */
[data-theme="dark"] .stat-card,
[data-theme="dark"] .player-info-row .info-card {
  background-color: #232334 !important;
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.35) !important;
}
[data-theme="dark"] .stat-card-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .player-info-row .info-card-title {
  color: var(--bs-tertiary-color) !important;
}
/* Player header `.player-info` block — `.player-id` ships `#5e5873`,
 * `.player-meta` ships `#6e6b7b` (both regular CSS, not inline). */
[data-theme="dark"] .player-info-header .player-id {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .player-info-header .player-meta {
  color: var(--bs-secondary-color) !important;
}

/* Linked-wallet pill */
[data-theme="dark"] .wallet-chip {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}

/* Tabs (Active Cases / Case History) */
[data-theme="dark"] .nav-tabs-underline {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .nav-tabs-underline .nav-link {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .nav-tabs-underline .nav-link:hover,
[data-theme="dark"] .nav-tabs-underline .nav-link.active {
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .nav-tabs-underline .nav-link.active {
  border-bottom-color: var(--bs-primary) !important;
}

/* Case panel header (when an Active Case row is expanded) */
[data-theme="dark"] .panel-header {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .panel-title h5 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .panel-meta {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .panel-meta .separator {
  color: var(--bs-border-color) !important;
}
[data-theme="dark"] .btn-close-panel {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .status-indicator {
  color: var(--bs-secondary-color) !important;
}

/* Action / section bars inside the case panel */
[data-theme="dark"] .actions-bar,
[data-theme="dark"] .section-header {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .section-header h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .section-toggle {
  color: var(--bs-tertiary-color) !important;
}

/* Detection details summary box (Big Winner / Large Transaction etc.) */
[data-theme="dark"] .detection-details {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .detection-details-row {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .detection-details-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .detection-details-value {
  color: var(--bs-body-color) !important;
}

/* Transaction Evidence table inside the case panel */
[data-theme="dark"] .transaction-evidence-table th {
  background-color: #2b2b3f !important;
  color: var(--bs-tertiary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .transaction-evidence-table td {
  color: var(--bs-body-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}

/* Timeline track + marker borders (markers had `border: 2px solid #fff`
 * which painted a white halo on the dark page) */
[data-theme="dark"] .timeline::before {
  background-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .timeline-marker {
  border-color: #232334 !important;
}

/* =====================================================================
 * /companies-fraud list — `.company-table-name` (Licensed +
 * Unlicensed company tables) hardcodes `color: #5e5873`.
 * ===================================================================== */
[data-theme="dark"] .company-table-name {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * #addUnlicensedWizardModal — `.logo-upload-area` is a dashed
 * dropzone with `background: #f8f7fa` + `#ebe9f1` border. Remap to
 * dark surface + theme border + secondary placeholder text.
 * ===================================================================== */
[data-theme="dark"] .logo-upload-area {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .logo-upload-area:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.06) !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"] .logo-upload-placeholder {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * #resolutionModal (fraud_companies/detail.ejs) — `.resolution-option`
 * radio cards have border `#ebe9f1`, hover `#a89ff7`. Title h6 is
 * `#5e5873` and description p is `#a5a3ae` (which is OK on light
 * but reads as muddy on dark). Remap to theme tokens.
 * ===================================================================== */
[data-theme="dark"] .resolution-option {
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .resolution-option:hover {
  border-color: rgba(var(--bs-primary-rgb), 0.5) !important;
}
[data-theme="dark"] .resolution-option-content h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .resolution-option-content p {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /importer per-company expand timeline (#companyTimeline-N) — the
 * ApexCharts rangeBar is rendered with `TEXT = '#6e6b7b'` and
 * `BORDER = '#ebe9f1'` baked into the chart config (see importer.js).
 * Override the SVG inline `fill` / `stroke` attributes via CSS to
 * remap axis labels + grid lines for dark mode. Inline SVG `fill`
 * attribute IS overridden by CSS `fill` — no `style` attribute trick
 * needed here.
 * ===================================================================== */
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-text,
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-yaxis-label,
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-xaxis-label,
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-xaxistooltip-text {
  fill: var(--bs-secondary-color) !important;
}
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-gridline {
  stroke: var(--bs-border-color) !important;
}
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-grid line,
[data-theme="dark"] [id^="companyTimeline-"] .apexcharts-grid-borders line {
  stroke: var(--bs-border-color) !important;
}

/* Sessions tab — Active Sessions list cards */
[data-theme="dark"] .session-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .session-item:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
[data-theme="dark"] .session-item.active {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
}
[data-theme="dark"] .session-device {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .session-meta {
  color: var(--bs-tertiary-color) !important;
}

/* Sessions tab — Activity Timeline (.timeline-* re-asserted to beat
 * the page-scoped `#5e5873`/`#f9f9fb` rules in user-detail.ejs).  */
[data-theme="dark"] .user-detail-timeline-anchor,
[data-theme="dark"] .timeline-content {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .timeline-title {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .timeline-date {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .timeline-description {
  color: var(--bs-secondary-color) !important;
}

/* Export History list rows */
[data-theme="dark"] .export-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .export-file {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .export-date {
  color: var(--bs-tertiary-color) !important;
}

/* Pagination footer (under each DataTable on the user-detail page) */
[data-theme="dark"] .pagination-footer {
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .pagination-footer .dataTables_info {
  color: var(--bs-tertiary-color) !important;
}

/* Upload Photo dropzone (Edit Info modal) */
[data-theme="dark"] .upload-area {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .upload-area:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.06) !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"] .upload-area-text {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .upload-area-hint {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .upload-preview {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .upload-preview-img {
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .upload-preview-name {
  color: var(--bs-body-color) !important;
}

/* Saved-searches button + Add-filter button (outline on light bg) */
[data-theme="dark"] .btn-add-filter,
[data-theme="dark"] .btn-saved,
[data-theme="dark"] .btn-save-search,
[data-theme="dark"] .btn-clear-all {
  background-color: transparent !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .btn-add-filter:hover,
[data-theme="dark"] .btn-saved:hover,
[data-theme="dark"] .btn-save-search:hover,
[data-theme="dark"] .btn-clear-all:hover {
  background-color: rgba(255, 255, 255, 0.05) !important;
}

/* Responsible Gambling KPI cards (light pastels on white) */
[data-theme="dark"] .rg-page .summary-card,
[data-theme="dark"] .rg-summary-card,
[data-theme="dark"] .responsible-gambling-page .stat-card,
[data-theme="dark"] .detected-cases-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color);
}

/* Players list + detail — clean up white "national id" card + tab nav */
[data-theme="dark"] .player-list-page .category-chip,
[data-theme="dark"] .player-tabs .nav-link,
[data-theme="dark"] .player-detail-page .info-row {
  color: var(--bs-body-color);
}

/* DataTables wrapper backdrop + filter bar used by transactions/players */
[data-theme="dark"] .dataTables_wrapper .dataTables_filter input,
[data-theme="dark"] .dataTables_wrapper .dataTables_length select {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}

/* Quick-filter tab strip band (white bar on Companies + Players) */
[data-theme="dark"] .quick-filters-bar,
[data-theme="dark"] #quickFilters,
[data-theme="dark"] .companies-page #quickFilters,
[data-theme="dark"] .nav.nav-pills {
  background-color: transparent !important;
}
[data-theme="dark"] .nav.nav-pills .nav-link {
  color: var(--bs-body-color);
  background-color: transparent;
}
[data-theme="dark"] .nav.nav-pills .nav-link.active {
  background-color: rgba(var(--bs-primary-rgb), 0.15);
  color: var(--bs-primary);
}

/* ---- Loading splash (#loading-bg) ----
 * theme-default.css hardcodes `#loading-bg { background: #fff }`, which
 * paints a full-screen white flash on reload before any view renders.
 * Override with a dark surface + keep the logo readable. This kicks in
 * immediately because the pre-paint inline script in header.ejs sets
 * data-theme BEFORE any stylesheet paints. */
[data-theme="dark"] #loading-bg {
  background: var(--bs-body-bg) !important;
}
[data-theme="dark"] #loading-bg .logo-image-light {
  display: none !important;
}
[data-theme="dark"] #loading-bg .logo-image-dark {
  display: inline-block !important;
}

/* ---- Sidebar brand logo (#layout-menu .app-brand) ----
 * sidebar.ejs renders four <img>s for the brand:
 *   - .logo-image-light             — `logo_url`, full colored
 *   - .logo-image-dark              — `logo_white_url`, full white (inline display:none)
 *   - .logo-image-collapsed-light   — `logo_collapsed_url`, small colored mark
 *   - .logo-image-collapsed-dark    — `logo_white_collapsed_url`, small white mark (inline display:none)
 *
 * Visibility matrix in DARK mode (light mode falls through to Vuexy defaults):
 *
 *                       expanded    collapsed-hover    collapsed-static
 *   logo-light          HIDDEN      HIDDEN             HIDDEN
 *   logo-dark           shown       shown              HIDDEN
 *   collapsed-light     HIDDEN      HIDDEN             HIDDEN
 *   collapsed-dark      HIDDEN      HIDDEN             shown
 *
 * `.layout-menu-collapsed` lives on <html> (same element as [data-theme="dark"])
 * so we use a compound selector with no space between them. The `!important` on
 * the visible rules beats both inline `style="display:none"` AND the colored-
 * variant rules; the second collapsed-not-hover rule wins via higher specificity
 * to re-hide the full white logo when only the small mark should appear. */
[data-theme="dark"] #layout-menu .app-brand .logo-image-light {
  display: none !important;
}
[data-theme="dark"] #layout-menu .app-brand .logo-image-dark {
  display: block !important;
}
[data-theme="dark"].layout-menu-collapsed:not(.layout-menu-hover) #layout-menu .app-brand .logo-image-dark {
  display: none !important;
}
[data-theme="dark"].layout-menu-collapsed:not(.layout-menu-hover) #layout-menu .app-brand .logo-image-collapsed-light {
  display: none !important;
}
[data-theme="dark"].layout-menu-collapsed:not(.layout-menu-hover) #layout-menu .app-brand .logo-image-collapsed-dark {
  display: block !important;
}

/* ---- Navbar (#layout-navbar) ----
 * The partial uses id-scoped rules with a hardcoded `background: #ffffff`
 * and `--topbar-text: #5e5873`, which beat the earlier `.layout-navbar`
 * class override on specificity. Match specificity here so dark wins. */
[data-theme="dark"] #layout-navbar.layout-navbar {
  --topbar-border: var(--bs-border-color);
  --topbar-hover: rgba(255, 255, 255, 0.05);
  --topbar-active: rgba(var(--bs-primary-rgb), 0.15);
  --topbar-text: var(--bs-body-color);
  --topbar-text-muted: var(--bs-tertiary-color);
  --topbar-text-secondary: var(--bs-secondary-color);
  background: #1e1e2d !important;
  border-bottom-color: var(--bs-border-color) !important;
  box-shadow: 0 4px 24px 0 rgba(0, 0, 0, 0.3) !important;
}
[data-theme="dark"] #layout-navbar .topbar-search,
[data-theme="dark"] #layout-navbar .topbar-search .search-input {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #layout-navbar .topbar-search .search-input::placeholder,
[data-theme="dark"] #layout-navbar .topbar-search .search-icon,
[data-theme="dark"] #layout-navbar .topbar-search .search-shortcut {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] #layout-navbar .topbar-lang-toggle,
[data-theme="dark"] #layout-navbar .topbar-theme-toggle,
[data-theme="dark"] #layout-navbar .topbar-user-toggle,
[data-theme="dark"] #layout-navbar .topbar-mobile-toggle {
  color: var(--bs-body-color);
}
[data-theme="dark"] #layout-navbar .topbar-lang-toggle:hover,
[data-theme="dark"] #layout-navbar .topbar-theme-toggle:hover,
[data-theme="dark"] #layout-navbar .topbar-user-toggle:hover,
[data-theme="dark"] #layout-navbar .topbar-mobile-toggle:hover {
  background-color: rgba(255, 255, 255, 0.05);
}

/* ---- Sidebar (#layout-menu) ----
 * The partial declares its own --sidebar-* variables with hardcoded light
 * hex, so the generic body-color override from above wasn't enough — rebind
 * the sidebar vars to dark tokens so the whole submenu tree follows. */
[data-theme="dark"] #layout-menu.layout-menu {
  --sidebar-active-bg: rgba(var(--bs-primary-rgb), 0.18);
  --sidebar-active-color: var(--bs-primary);
  --sidebar-hover-bg: rgba(255, 255, 255, 0.04);
  --sidebar-border: var(--bs-border-color);
  --sidebar-text: #d4d2e3;
  --sidebar-text-muted: #8a889c;
  --sidebar-text-secondary: #aeacbd;
  background-color: #1e1e2d !important;
  border-right-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #layout-menu .app-brand { border-bottom-color: var(--bs-border-color); }
[data-theme="dark"] #layout-menu .menu-sub,
[data-theme="dark"] #layout-menu .menu-inner {
  background-color: transparent;
}
[data-theme="dark"] #layout-menu .menu-item > .menu-link,
[data-theme="dark"] #layout-menu .menu-sub .menu-link {
  color: var(--sidebar-text);
}
[data-theme="dark"] #layout-menu .menu-item > .menu-link:hover {
  background-color: var(--sidebar-hover-bg);
  color: var(--bs-emphasis-color);
}
[data-theme="dark"] #layout-menu .menu-item.active > .menu-link:not(.menu-toggle) {
  background-color: var(--sidebar-active-bg);
  color: var(--sidebar-active-color);
}
[data-theme="dark"] #layout-menu .sidebar-collapse-toggle {
  border-top-color: var(--bs-border-color);
  color: var(--sidebar-text);
}

/* ---- /market page ----
 * `.tax-stat-box` (Expected Tax / WHT / Actual Filed small cards) and
 * `.company-quick-card` (Top Companies sparkline cards) both hardcode
 * light fills. Also neutralize the tiny `.tax-range-marker` /
 * `.tax-actual-marker` circles which use `background: white` on the
 * range-bar rails. */
[data-theme="dark"] .tax-stat-box {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color);
}
[data-theme="dark"] .tax-stat-box.highlight {
  background-color: rgba(var(--bs-primary-rgb), 0.18) !important;
  border-color: rgba(var(--bs-primary-rgb), 0.35) !important;
}
[data-theme="dark"] .company-quick-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .company-quick-card:hover {
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.45) !important;
}
[data-theme="dark"] .tax-range-marker,
[data-theme="dark"] .tax-actual-marker {
  background: #232334 !important;
}
[data-theme="dark"] .tax-range-point.max {
  background: var(--bs-border-color) !important;
  border-color: #232334 !important;
}

/* Income statement table on /market — section header rows + sub-rows */
[data-theme="dark"] .income-statement-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .income-statement-table .section-row td {
  background: #2b2b3f !important;
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .income-statement-table td {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .income-statement-table .sub-row,
[data-theme="dark"] .income-statement-table .sub-row .sub-label,
[data-theme="dark"] .income-statement-table .balance-cell .balance-label,
[data-theme="dark"] .income-statement-table .balance-cell .balance-value {
  color: var(--bs-body-color) !important;
}

/* /config page — Settings cards, Default Thresholds, Security rows.
 * `.security-detail-item` is intentionally excluded — inside
 * #twoStepDetails it should be transparent so the rows blend with the
 * surrounding `.security-card-body`, not paint as filled rows. */
[data-theme="dark"] .system-info-item,
[data-theme="dark"] .config-row,
[data-theme="dark"] .current-rate-card,
[data-theme="dark"] .rate-detail-item,
[data-theme="dark"] .template-preview-box,
[data-theme="dark"] .checklist-item,
[data-theme="dark"] .tax-review-row {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .security-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .security-card-header {
  background-color: #232334 !important;
  color: var(--bs-body-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
/* The small icon tile on the left of each settings row */
[data-theme="dark"] .system-info-item > [class*="icon"],
[data-theme="dark"] .config-row > [class*="icon"] {
  background-color: rgba(255, 255, 255, 0.04);
  color: var(--bs-body-color);
}

/* /companies Rows-per-page <select> (id-based, beat the hardcoded #fff) */
[data-theme="dark"] .companies-page .rows-per-page select,
[data-theme="dark"] .companies-page #pageSizeSelect {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * Player detail (/players/:id) — all tabs
 * ===================================================================== */

/* Filter bar shared across Financials, Betting Activity, and Ledger tabs */
[data-theme="dark"] .filter-bar,
[data-theme="dark"] .ledger-filter-bar {
  background: #2b2b3f !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}

/* Timeline tab — each activity card */
[data-theme="dark"] .timeline-content,
[data-theme="dark"] .propagation-summary {
  background: #2a2a3d !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .timeline-title { color: var(--bs-body-color) !important; }
[data-theme="dark"] .timeline-date { color: var(--bs-tertiary-color) !important; }
[data-theme="dark"] .timeline-description { color: var(--bs-secondary-color) !important; }

/* =====================================================================
 * /players/responsible-gambling/list
 * Stat-card icon tiles + Bet Type badges keep their tint; the big panels
 * and inputs need dark surfaces.
 * ===================================================================== */
[data-theme="dark"] .responsible-gambling-page .filter-bar,
[data-theme="dark"] .responsible-gambling-page .form-control.dt-input,
[data-theme="dark"] .rg-page .form-control,
[data-theme="dark"] .responsible-gambling-page .form-select {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .responsible-gambling-page .bet-type-badge.casino {
  background: rgba(245, 158, 11, 0.18) !important;
  color: #fbbf24 !important;
}

/* Market Risk section — 6 insight cards + Overall Risk summary panel */
[data-theme="dark"] .insight-card {
  background: #2a2a3d !important;
  color: var(--bs-body-color);
}
[data-theme="dark"] .insight-card:hover {
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4) !important;
}
[data-theme="dark"] .risk-summary-card {
  background: linear-gradient(135deg, #252537 0%, #2c2c42 100%) !important;
  color: var(--bs-body-color);
}

/* =====================================================================
 * /importer — filter bar inputs + pagination footers
 * The page scope `.imp-page` hardcodes `background: white` on inputs +
 * pagination pills; match the specificity with !important so the dark
 * skin wins.
 * ===================================================================== */
[data-theme="dark"] .imp-page select,
[data-theme="dark"] .imp-page input[type="text"],
[data-theme="dark"] .imp-page input[type="search"],
[data-theme="dark"] .imp-page input[type="date"],
[data-theme="dark"] .imp-page .form-control,
[data-theme="dark"] .imp-page .form-select {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .imp-page .pagination-footer {
  background-color: #2b2b3f !important;
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .imp-page .pagination-footer .page-size-select,
[data-theme="dark"] .imp-page .pagination-footer .btn-page {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .imp-page .pagination-footer .btn-page:hover:not(:disabled) {
  background-color: rgba(var(--bs-primary-rgb), 0.15) !important;
  color: var(--bs-primary) !important;
  border-color: var(--bs-primary) !important;
}

/* User management pagination footer */
[data-theme="dark"] #user-management-table_wrapper .pagination-footer {
  background-color: #2b2b3f !important;
  color: var(--bs-body-color);
  border-top-color: var(--bs-border-color);
}

/* =====================================================================
 * /companies-fraud/ — KPI boxes, cases table + footer, Show entries strip
 * ===================================================================== */
[data-theme="dark"] .fraud-kpi,
[data-theme="dark"] .fraud-kpi-card,
[data-theme="dark"] .fraud-stat,
[data-theme="dark"] .fraud-page .dataTables_wrapper,
[data-theme="dark"] .fraud-page .dataTables_length,
[data-theme="dark"] .fraud-page .dataTables_paginate,
[data-theme="dark"] .show-entries-footer,
[data-theme="dark"] .entries-footer {
  background-color: transparent !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .fraud-page .dataTables_length select,
[data-theme="dark"] .fraud-page .dataTables_filter input {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * /players-fraud/ — flagged players list + detail panels
 * ===================================================================== */
[data-theme="dark"] .fraud-players-page .detection-rule-card,
[data-theme="dark"] .fraud-players-page .flagged-table,
[data-theme="dark"] .fraud-players-page .dataTables_wrapper thead th,
[data-theme="dark"] .player-fraud-detail .linked-wallets,
[data-theme="dark"] .player-fraud-detail .active-companies,
[data-theme="dark"] .case-detail-panel,
[data-theme="dark"] .case-panel-body,
[data-theme="dark"] .detection-details,
[data-theme="dark"] .case-timeline-item,
[data-theme="dark"] .timeline-row {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}

/* Fraud detail table headers across both company + player fraud pages */
[data-theme="dark"] .fraud-page table thead th,
[data-theme="dark"] .fraud-players-page table thead th,
[data-theme="dark"] .player-fraud-detail table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-body-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * Navbar language dropdown — specific id+class to beat the navbar's
 * hardcoded #fff on `.dropdown-menu.topbar-lang-dropdown`.
 * ===================================================================== */
[data-theme="dark"] #layout-navbar .dropdown-menu,
[data-theme="dark"] #layout-navbar .topbar-lang-dropdown,
[data-theme="dark"] #layout-navbar .topbar-user-dropdown {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #layout-navbar .dropdown-item,
[data-theme="dark"] #layout-navbar .topbar-lang-dropdown .dropdown-item,
[data-theme="dark"] #layout-navbar .topbar-user-dropdown .dropdown-item {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #layout-navbar .dropdown-item:hover,
[data-theme="dark"] #layout-navbar .dropdown-item:focus,
[data-theme="dark"] #layout-navbar .navbar-lang-item:hover {
  background-color: rgba(255, 255, 255, 0.05) !important;
  color: var(--bs-emphasis-color) !important;
}
[data-theme="dark"] #layout-navbar .navbar-lang-item.active {
  background-color: rgba(var(--bs-primary-rgb), 0.18) !important;
  color: var(--bs-primary) !important;
}

/* Multiselect (used on /market, /players filters) */
[data-theme="dark"] .multiselect-container,
[data-theme="dark"] .multiselect,
[data-theme="dark"] .ms-options-wrap,
[data-theme="dark"] .ms-options,
[data-theme="dark"] .ms-options > ul > li {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .ms-options > ul > li:hover {
  background-color: rgba(255, 255, 255, 0.05) !important;
}

/* =====================================================================
 * NCEMS page (/ncems) — scoped <style> in views/ncems/index.ejs uses
 * hardcoded light hexes. Override neutrals + soften saturated trend hues
 * for dark surfaces; keep status hues intact (covered below).
 * ===================================================================== */
[data-theme="dark"] .pipeline-empty-message {
  background-color: #252537 !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .pipeline-empty-message i {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .pipeline-step:not(:last-child)::after {
  background-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .pipeline-step.pending .pipeline-icon,
[data-theme="dark"] .pipeline-icon.pending {
  background-color: #2a2a3d !important;
  border: 2px solid var(--bs-border-color) !important;
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .pipeline-step.running .pipeline-icon,
[data-theme="dark"] .pipeline-icon.running {
  background-color: #2a2a3d !important;
  border: 2px solid var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
/* Tabler icons inside pipeline-icon use currentColor by default, but the
   ejs sets `<i class="ti ti-clock">` directly — pin to inherit so the
   pending icon stroke matches the muted text color. */
[data-theme="dark"] .pipeline-step.pending .pipeline-icon i,
[data-theme="dark"] .pipeline-icon.pending i {
  color: var(--bs-tertiary-color) !important;
}
/* Pipeline step labels inherit body color, but the ejs <%= step.step %>
   text and durations sometimes render dim on dark — pin them explicitly. */
[data-theme="dark"] .pipeline-stepper .step-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .pipeline-stepper .step-duration,
[data-theme="dark"] .pipeline-stepper .step-records {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .tab-content-bordered {
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .metric-label,
[data-theme="dark"] .mismatch-subtitle {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .metric-value,
[data-theme="dark"] .mismatch-total {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .progress-thin,
[data-theme="dark"] .coverage-progress {
  background-color: var(--bs-border-color) !important;
}
/* Coverage bar fill is hardcoded #696cff — switch to brand primary so it
   adapts to default purple and evidentia teal. */
[data-theme="dark"] .coverage-progress .progress-bar {
  background-color: var(--bs-primary) !important;
}
[data-theme="dark"] .data-freshness-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .status-pill.success {
  background-color: rgba(40, 167, 69, 0.16) !important;
  color: #4ade80 !important;
}
[data-theme="dark"] .status-pill.warning {
  background-color: rgba(255, 193, 7, 0.18) !important;
  color: #fbbf24 !important;
}
[data-theme="dark"] .status-pill.error {
  background-color: rgba(220, 53, 69, 0.18) !important;
  color: #f87171 !important;
}
/* Soften the saturated greens/reds used on trend deltas — the source uses
   #72e128 / #ff4747 which over-saturate against dark surfaces. */
[data-theme="dark"] .trend-up {
  color: #4ade80 !important;
}
[data-theme="dark"] .trend-down {
  color: #f87171 !important;
}
/* Card border accents — keep the colored left edges but ensure they read
   on dark; the source palette is fine here, but pin so theme-default's
   accent doesn't bleed through if specificity wars happen. */
[data-theme="dark"] .card-border-shadow-primary { border-left-color: var(--bs-primary) !important; }
[data-theme="dark"] .card-border-shadow-success { border-left-color: #4ade80 !important; }
[data-theme="dark"] .card-border-shadow-warning { border-left-color: #fbbf24 !important; }
[data-theme="dark"] .card-border-shadow-danger  { border-left-color: #f87171 !important; }
[data-theme="dark"] .card-border-shadow-info    { border-left-color: #38bdf8 !important; }
/* Job-details modal builds tables via JS template strings with `text-muted`
   on label cells. Bootstrap's .text-muted adapts via --bs-secondary-color
   so this is mostly belt-and-suspenders, but pin font-monospace job IDs
   (rendered as <span class="font-monospace">) so they stay readable. */
[data-theme="dark"] #jobDetailsModalBody .text-muted {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] #jobDetailsModalBody td:not(.text-muted) {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .font-monospace {
  color: var(--bs-body-color);
}

/* =====================================================================
 * Profile (/profile) + User Detail (/management/detail/:id) — both
 * ship identical scoped CSS with hardcoded light surfaces. Overrides
 * target the shared class names and a few inline-styled spots.
 * ===================================================================== */
[data-theme="dark"] .risk-item,
[data-theme="dark"] .risk-score-bar,
[data-theme="dark"] .export-item,
[data-theme="dark"] .change-history-item,
[data-theme="dark"] .photo-preview-box,
[data-theme="dark"] .activity-header-info,
[data-theme="dark"] .table-header {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .risk-item-label,
[data-theme="dark"] .risk-score-label,
[data-theme="dark"] .session-meta,
[data-theme="dark"] .role-card-desc {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .risk-item-value,
[data-theme="dark"] .session-device,
[data-theme="dark"] .role-card-name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .role-card {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .role-card-page-chip,
[data-theme="dark"] .perm-source-chip {
  background-color: rgba(255, 255, 255, 0.06) !important;
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .session-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .session-item:hover {
  background-color: rgba(255, 255, 255, 0.04) !important;
}
[data-theme="dark"] .timeline::before {
  background-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .export-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .activity-header-info {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .table-search-input {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .photo-upload-area {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .photo-upload-area:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.06) !important;
}
[data-theme="dark"] .photo-delete-btn {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
/* Inline style="background:#f3f2f7;color:#b9b9c3" on readonly email + role-count chip */
[data-theme="dark"] input[readonly].form-control,
[data-theme="dark"] #roleCountBadge {
  background-color: #252537 !important;
  color: var(--bs-tertiary-color) !important;
  border-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * multiselect.js (assets/js/multiselect.min.js) — the custom jQuery
 * plugin used for Company/MNO/Status filters on /market, /players,
 * /importer, /companies-fraud/*, etc. Base CSS ships in
 * assets/css/multiselect.css with hardcoded white/grey/blue.
 *
 * Different library from the jquery-multiselect `.ms-options` block
 * above — both coexist, both need dark overrides.
 * ===================================================================== */
[data-theme="dark"] .multiselect-wrapper .multiselect-input-div input,
[data-theme="dark"] .multiselect-wrapper input.multiselect-input {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .multiselect-wrapper .multiselect-input-div input::placeholder {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .multiselect-wrapper .multiselect-list {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .multiselect-wrapper .multiselect-list > span {
  color: var(--bs-emphasis-color) !important;
}
[data-theme="dark"] .multiselect-wrapper ul li {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .multiselect-wrapper ul li:hover,
[data-theme="dark"] .multiselect-wrapper ul li.active {
  background-color: rgba(var(--bs-primary-rgb), 0.18) !important;
  color: var(--bs-emphasis-color) !important;
}
[data-theme="dark"] .multiselect-count {
  background-color: rgba(var(--bs-primary-rgb), 0.22) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .multiselect-wrapper.disabled .multiselect-count {
  background-color: rgba(255, 255, 255, 0.08) !important;
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .multiselect-dropdown-arrow {
  border-top-color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .multiselect-wrapper.disabled .multiselect-dropdown-arrow {
  border-top-color: rgba(255, 255, 255, 0.15) !important;
}

/* =====================================================================
 * Market page (/market) — scoped <style> in views/markets/index.ejs
 * has a few hardcoded light hexes for the tax legend + income table.
 * ===================================================================== */
[data-theme="dark"] .tax-rate-legend {
  background-color: #252537 !important;
}
[data-theme="dark"] .tax-label-item .label-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .tax-label-item .label-title {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .tax-label-item .label-source {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .income-statement-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .income-statement-table td {
  border-bottom-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * Generic catch-all for bare inputs/selects/textareas. Many scoped
 * <style> blocks ship hardcoded `background: #fff` on native elements
 * without a `.form-control` class (e.g. /management uses `.filter-input`).
 * This block covers the common native form elements; specific custom
 * classes below override spots that beat even this.
 * ===================================================================== */
[data-theme="dark"] input[type="text"],
[data-theme="dark"] input[type="search"],
[data-theme="dark"] input[type="email"],
[data-theme="dark"] input[type="password"],
[data-theme="dark"] input[type="tel"],
[data-theme="dark"] input[type="url"],
[data-theme="dark"] input[type="number"],
[data-theme="dark"] input[type="date"],
[data-theme="dark"] input[type="datetime-local"],
[data-theme="dark"] input[type="time"],
[data-theme="dark"] textarea,
[data-theme="dark"] select {
  background-color: #2a2a3d;
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}
[data-theme="dark"] input::placeholder,
[data-theme="dark"] textarea::placeholder {
  color: var(--bs-tertiary-color);
}
[data-theme="dark"] select option {
  background-color: #232334;
  color: var(--bs-body-color);
}

/* /management Users page uses `.filter-input` (custom class — beats
 * .form-control fallback). Also covers the search/role/status row. */
[data-theme="dark"] .filter-input {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .filter-input:focus {
  background-color: #2a2a3d !important;
  border-color: var(--bs-primary) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .filter-input::placeholder {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .search-input-wrapper .ti-search {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .filter-label {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * Settings (/config) — viewChannelModal + viewTemplateModal share the
 * `.config-group` / `.config-row` / `.config-label` / `.config-value`
 * block. Template modal also uses `.info-panel`, `.placeholders-table`,
 * and `.template-preview-box`. All ship hardcoded #f9f9fb / #f3f2f7 / #fff.
 * ===================================================================== */
[data-theme="dark"] .config-group,
[data-theme="dark"] .info-panel,
[data-theme="dark"] .template-preview-box {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .config-group-title {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .config-row {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .config-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .config-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .info-panel h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .placeholders-table th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .placeholders-table td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .template-preview-box .placeholder {
  background-color: rgba(var(--bs-primary-rgb), 0.24) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .checklist-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .wizard-stepper {
  border-bottom-color: var(--bs-border-color) !important;
}
/* Wizard step-connector line. Three usages share the `.wizard-stepper`
 * class: fraud_companies/index.ejs (#addUnlicensedWizardModal — hardcoded
 * `background: #ebe9f1` on `::before`), companies/index.ejs (uses
 * `var(--cp-border-color)` which auto-themes via the `.companies-page`
 * rebind), config/index.ejs (no `::before`, uses border-bottom which is
 * handled by the rule above). The fraud_companies hardcoded hex paints a
 * near-white line on dark and ignores the var rebind because the page
 * has no scoped CSS variable. Override `::before` directly so all three
 * pages share the same dark-mode line color. */
[data-theme="dark"] .wizard-stepper::before {
  background: var(--bs-border-color) !important;
}

/* =====================================================================
 * Company Detail (/companies/:id) — scoped <style> in
 * views/companies/detail.ejs has ~50 hardcoded light hexes across the
 * 5 tabs (Overview / Documents / Contacts / Wallets / Notifications).
 * Group overrides by visual block.
 * ===================================================================== */

/* Overview tab — Audit Result insight cards + Overall Audit Risk card */
[data-theme="dark"] .audit-insight-card {
  background-color: #252537 !important;
}
[data-theme="dark"] .audit-insight-text {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .audit-risk-summary-card {
  background: linear-gradient(135deg, #232334 0%, #2a2a3d 100%) !important;
}
[data-theme="dark"] .audit-risk-details {
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .audit-risk-label {
  color: var(--bs-secondary-color) !important;
}

/* Documents tab — document-table + filter chips + dropzone */
[data-theme="dark"] .document-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .document-table tbody td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .document-table tbody tr:hover {
  background-color: rgba(255, 255, 255, 0.04) !important;
}
[data-theme="dark"] .document-name .file-details .name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .document-filter-bar .filter-btn {
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .dropzone {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .dropzone p {
  color: var(--bs-secondary-color) !important;
}

/* Contacts tab — contact-table + info-item cards (Company Information grid) */
[data-theme="dark"] .contact-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .contact-table tbody td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .contact-table tbody tr:hover {
  background-color: rgba(255, 255, 255, 0.04) !important;
}
[data-theme="dark"] .contact-person .name {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .contact-detail,
[data-theme="dark"] .contact-detail a {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .info-item {
  background-color: #252537 !important;
}
[data-theme="dark"] .info-item .info-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .info-item .info-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .map-container {
  border-color: var(--bs-border-color) !important;
}

/* Wallets tab — wallet-table */
[data-theme="dark"] .wallet-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .wallet-table tbody td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .wallet-table tbody tr:hover {
  background-color: rgba(255, 255, 255, 0.04) !important;
}
[data-theme="dark"] .wallet-info .wallet-name {
  color: var(--bs-body-color) !important;
}

/* Notifications tab — inactive channel card + #reconciliationTable thead */
[data-theme="dark"] .notif-channel-item {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-channel-item.active {
  background: linear-gradient(135deg, rgba(var(--bs-primary-rgb), 0.08) 0%, rgba(var(--bs-primary-rgb), 0.14) 100%) !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"] .notif-channel-type {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-channel-addresses {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .notif-channel-meta {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] #reconciliationTable thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .nav-tabs-custom {
  border-bottom-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * notifWizardModal (5-step Add/Edit Notification Channel wizard) —
 * lives in views/companies/detail.ejs (`#notifWizardModal`). Step 4
 * has the Ban/Unban/Warning action-type tab strip (white pill bg +
 * white active pill) and Step 5 has the Email/SMS preview card on a
 * light surface. Radio cards + template editor toolbar need dark too.
 * ===================================================================== */
[data-theme="dark"] .notif-source-option,
[data-theme="dark"] .notif-event-type-checkbox,
[data-theme="dark"] .notif-template-option,
[data-theme="dark"] .notif-channel-type-option {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-source-option:hover,
[data-theme="dark"] .notif-event-type-checkbox:hover,
[data-theme="dark"] .notif-template-option:hover,
[data-theme="dark"] .notif-channel-type-option:hover {
  border-color: var(--bs-primary) !important;
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
[data-theme="dark"] .notif-source-option.selected,
[data-theme="dark"] .notif-event-type-checkbox.checked,
[data-theme="dark"] .notif-template-option.selected,
[data-theme="dark"] .notif-channel-type-option.selected {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"] .notif-channel-type-info h6,
[data-theme="dark"] .notif-event-type-label,
[data-theme="dark"] .notif-template-option-content h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-channel-type-info p,
[data-theme="dark"] .notif-template-option-content p {
  color: var(--bs-tertiary-color) !important;
}

/* Step 4 — Action type tab strip (Ban / Unban / Warning) + template editor */
[data-theme="dark"] .notif-action-type-tabs {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .notif-action-type-tab {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .notif-action-type-tab:hover {
  background-color: rgba(255, 255, 255, 0.05) !important;
}
[data-theme="dark"] .notif-action-type-tab.active {
  background-color: #232334 !important;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35) !important;
}
[data-theme="dark"] .notif-template-editor {
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-template-editor-toolbar {
  background-color: #2b2b3f !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-placeholder-btn {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-char-counter {
  background-color: #252537 !important;
  border-top-color: var(--bs-border-color) !important;
  color: var(--bs-tertiary-color) !important;
}

/* Step 5 — Preview card (Email/SMS Preview with Subject / To / body) */
[data-theme="dark"] .notif-preview-card,
[data-theme="dark"] .notif-info-panel,
[data-theme="dark"] .notif-message-preview-box {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-preview-header {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-preview-header h6,
[data-theme="dark"] .notif-info-panel h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-preview-body {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .notif-preview-tabs {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-preview-tab {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .notif-preview-tab:hover {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .notif-detail-row {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .notif-detail-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .notif-detail-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-placeholders-table th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .notif-placeholders-table td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .notif-info-alert {
  background-color: rgba(var(--bs-primary-rgb), 0.14) !important;
  border-color: rgba(var(--bs-primary-rgb), 0.3) !important;
}
[data-theme="dark"] .notif-info-alert p {
  color: var(--bs-body-color) !important;
}

/* notifWizardModal stepper itself — step labels need contrast on dark */
[data-theme="dark"] .notif-wizard-step-label {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .notif-wizard-step:not(:last-child)::after {
  background-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * /companies-fraud/ list page — test-txn-stat KPI cards + companies-table.
 * `.fraud-page` scope already handles DataTables wrappers above; here we
 * override the scoped <style> in views/fraud_companies/index.ejs.
 * ===================================================================== */
[data-theme="dark"] .test-txn-stat {
  background-color: #232334 !important;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3) !important;
}
[data-theme="dark"] .companies-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .companies-table,
[data-theme="dark"] .companies-table tbody td {
  color: var(--bs-body-color) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .companies-table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
[data-theme="dark"] .companies-table-title {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /companies-fraud/:id/detail — Paybill Findings card + paybill chips.
 * ===================================================================== */
[data-theme="dark"] .paybill-findings-card {
  background-color: #232334 !important;
  box-shadow: 0 4px 24px 0 rgba(0, 0, 0, 0.3) !important;
}
[data-theme="dark"] .paybill-findings-card .card-header {
  background-color: #2b2b3f !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .paybill-findings-card .card-header h5 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .paybill-section {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .paybill-section-title {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .paybill-section-count {
  background-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .paybill-chip-compact,
[data-theme="dark"] .paybill-item {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .paybill-chip-compact:hover {
  background-color: #2a2a3d !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"] .paybill-chip-compact .network-tag,
[data-theme="dark"] .paybill-item-meta {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .paybill-item-number {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /companies-fraud/:id/sms — SMS evidence cards + filter bar.
 * views/fraud_companies/sms.ejs ships hardcoded #fff / #fafafa / #f8f9fa.
 * ===================================================================== */
[data-theme="dark"] .sms-list-card {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .sms-list-card:hover {
  border-color: rgba(var(--bs-primary-rgb), 0.5) !important;
}
[data-theme="dark"] .sms-list-card-header {
  background: linear-gradient(135deg, rgba(var(--bs-primary-rgb), 0.14) 0%, transparent 100%) !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .sms-list-card-phone {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .sms-list-card-meta,
[data-theme="dark"] .sms-pagination-info {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .sms-list-card-content {
  background-color: #252537 !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .sms-list-card-footer {
  background-color: #252537 !important;
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .sms-list-tag.paybill {
  background-color: rgba(255, 255, 255, 0.06) !important;
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /audit-log — category chip pills (All / Authentication / User Management
 * / Company Access / Data Export / System Config / Security Events).
 * `.al-category-chip` ships `background: #ffffff` in activity.ejs.
 * ===================================================================== */
[data-theme="dark"] .al-category-chip {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .al-category-chip:hover {
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .al-category-chip.active {
  background-color: rgba(var(--bs-primary-rgb), 0.18) !important;
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"] .al-category-chip .al-chip-count {
  background-color: rgba(var(--bs-primary-rgb), 0.22) !important;
  color: var(--bs-primary) !important;
}

/* =====================================================================
 * /importer#coverage — Gap Timeline Day/Week/Month/Year zoom toggle.
 * The container div + buttons use inline `style="background: #f3f2f7"` +
 * `background: transparent` in views/importer/index.ejs. CSS !important
 * can beat inline styles; we target the attribute pattern.
 * ===================================================================== */
[data-theme="dark"] .imp-page .card-header div[style*="#f3f2f7"],
[data-theme="dark"] .imp-page .card-header div[style*="f3f2f7"] {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .imp-page .btn-view[style*="transparent"] {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .imp-page .btn-view[style*="transparent"]:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  color: var(--bs-primary) !important;
}

/* =====================================================================
 * Bootstrap daterangepicker library (assets/css/bootstrap-daterangepicker.css)
 * used by /market "Date Range" popup and other date-range inputs.
 *
 * Library ships BOTH `.light-style` and `.dark-style` rule trees. Vuexy
 * hardcodes `class="light-style"` on the shell and never swaps it, so
 * `.light-style .daterangepicker` keeps winning against bare
 * `[data-theme="dark"] .daterangepicker` on specificity ties. Fix:
 * prefix selectors with `.light-style` to bump specificity to 0,3,0
 * (beats the library's 0,2,0) without needing a body class swap.
 * ===================================================================== */
[data-theme="dark"].light-style .daterangepicker {
  background-color: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .daterangepicker::before {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .daterangepicker::after {
  border-bottom-color: #232334 !important;
}
[data-theme="dark"].light-style .daterangepicker table thead {
  background-color: #232334 !important;
}
[data-theme="dark"].light-style .daterangepicker table thead th,
[data-theme="dark"].light-style .daterangepicker table thead td {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .calendar-table thead tr:last-child th {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .daterangepicker th.month {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .ranges li {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .ranges li:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"].light-style .daterangepicker .ranges li.active {
  background-color: var(--bs-primary) !important;
  color: #fff !important;
}
[data-theme="dark"].light-style .daterangepicker .calendar-table {
  background-color: transparent !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .calendar-table th,
[data-theme="dark"].light-style .daterangepicker .calendar-table td {
  color: var(--bs-body-color) !important;
  background-color: transparent !important;
  border-color: transparent !important;
}
[data-theme="dark"].light-style .daterangepicker td.off,
[data-theme="dark"].light-style .daterangepicker td.off.in-range,
[data-theme="dark"].light-style .daterangepicker td.off.start-date,
[data-theme="dark"].light-style .daterangepicker td.off.end-date {
  color: var(--bs-tertiary-color) !important;
  background-color: transparent !important;
}
[data-theme="dark"].light-style .daterangepicker td.available:not(.active):hover,
[data-theme="dark"].light-style .daterangepicker th.available:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.14) !important;
  color: var(--bs-primary) !important;
}
[data-theme="dark"].light-style .daterangepicker td.in-range {
  background-color: rgba(var(--bs-primary-rgb), 0.16) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .daterangepicker td.active,
[data-theme="dark"].light-style .daterangepicker td.active:hover,
[data-theme="dark"].light-style .daterangepicker td.start-date,
[data-theme="dark"].light-style .daterangepicker td.end-date {
  background-color: var(--bs-primary) !important;
  color: #fff !important;
}
[data-theme="dark"].light-style .daterangepicker td.disabled,
[data-theme="dark"].light-style .daterangepicker option.disabled {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .calendar-table .next,
[data-theme="dark"].light-style .daterangepicker .calendar-table .prev {
  background-color: rgba(255, 255, 255, 0.06) !important;
}
[data-theme="dark"].light-style .daterangepicker .calendar-table .next span,
[data-theme="dark"].light-style .daterangepicker .calendar-table .prev span {
  border-color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .drp-calendar.left,
[data-theme="dark"].light-style .daterangepicker .drp-calendar.right {
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .daterangepicker select.monthselect,
[data-theme="dark"].light-style .daterangepicker select.yearselect,
[data-theme="dark"].light-style .daterangepicker select.hourselect,
[data-theme="dark"].light-style .daterangepicker select.minuteselect,
[data-theme="dark"].light-style .daterangepicker select.secondselect,
[data-theme="dark"].light-style .daterangepicker select.ampmselect {
  background-color: #2a2a3d !important;
  color: var(--bs-body-color) !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .daterangepicker select.monthselect option,
[data-theme="dark"].light-style .daterangepicker select.yearselect option {
  color: var(--bs-body-color) !important;
  background-color: #232334 !important;
}
[data-theme="dark"].light-style .daterangepicker .drp-buttons {
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .daterangepicker .drp-selected {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /companies-fraud/:id/detail — remaining items not caught earlier:
 *   - `.paybill-list-item` rows (the "SUNBETUGANDA" under-investigation
 *     row ships `background: #f8f7fa`).
 *   - The "View All SMS Evidence" footer uses `.paybill-section` with an
 *     inline `style="background: #f8f7fa;"` injected by JS
 *     (detail.ejs:1502). Attribute selector + !important beats inline.
 * ===================================================================== */
[data-theme="dark"] .paybill-list-item {
  background-color: #252537 !important;
}
[data-theme="dark"] .paybill-list-item:hover {
  background-color: #2a2a3d !important;
}
[data-theme="dark"] .paybill-list-item .paybill-item-number {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .paybill-list-item .paybill-item-meta {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .paybill-section[style*="f8f7fa"] {
  background-color: #252537 !important;
}

/* .cases-table (Active Investigations / Past Resolved tables on detail page) */
[data-theme="dark"] .cases-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .cases-table thead th.sortable:hover {
  background-color: #35354b !important;
}
[data-theme="dark"] .cases-table thead th .sort-icon {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .cases-table tbody td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .cases-table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}

/* =====================================================================
 * /players-fraud/ list — Detection Rules cards (Big Winners / Large
 * Transactions / Smurfing / Rapid Movement) + Flagged Players table.
 * views/fraud_players/index.ejs scoped CSS hardcodes #f9f9fb / #f3f2f7.
 * ===================================================================== */
[data-theme="dark"] .detection-rule-card {
  background-color: #252537 !important;
}
[data-theme="dark"] .detection-rule-content h6 {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .detection-rule-content p {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .flagged-players-table {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .flagged-players-table thead th {
  background-color: #2b2b3f !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .flagged-players-table thead th.sortable:hover {
  background-color: #35354b !important;
}
[data-theme="dark"] .flagged-players-table thead th .sort-icon {
  color: var(--bs-tertiary-color) !important;
}
[data-theme="dark"] .flagged-players-table tbody td {
  border-bottom-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .flagged-players-table tbody tr:hover {
  background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}
[data-theme="dark"] .legend-item {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * /auth/login (default theme) — page-auth.css hardcodes .authentication-bg
 * to #fff in `.light-style`. The auth layout sets `<html class="light-style">`
 * unconditionally, so we beat it with a compound selector
 * `[data-theme="dark"].light-style` (same element, no descendant gap).
 * Form inputs, labels, headings, and the password eye toggle all need
 * dark-mode contrast. The evidentia login theme already styles itself
 * via `.evidentia-login-card`, so it is unaffected.
 * ===================================================================== */
[data-theme="dark"].light-style .authentication-wrapper .authentication-bg {
  background-color: #1e1e2d !important;
}
[data-theme="dark"].light-style .auth-cover-bg-color {
  background-color: #25293c !important;
}
[data-theme="dark"].light-style .authentication-wrapper.authentication-basic .authentication-inner:before,
[data-theme="dark"].light-style .authentication-wrapper.authentication-basic .authentication-inner:after {
  opacity: 0.6;
}
[data-theme="dark"].light-style .authentication-bg h4,
[data-theme="dark"].light-style .authentication-bg h5,
[data-theme="dark"].light-style .authentication-bg .form-label,
[data-theme="dark"].light-style .authentication-bg label {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .authentication-bg p {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .form-control {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .form-control::placeholder {
  color: var(--bs-tertiary-color) !important;
  opacity: 1;
}
[data-theme="dark"].light-style .authentication-bg .form-control:focus {
  background-color: #2a2a3d !important;
  border-color: var(--bs-primary) !important;
  box-shadow: 0 0 0 0.15rem rgba(var(--bs-primary-rgb), 0.25) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .input-group-merge .input-group-text {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .form-check-input {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .form-check-input:checked {
  background-color: var(--bs-primary) !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"].light-style .authentication-bg .form-check-label {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .nav-link {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .authentication-bg .nav-link:hover {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .auth-cover-brand .app-brand-text {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /auth/login (evidentia theme) — page-auth-evidentia.css already paints
 * a dark glass card on a teal gradient, so dark mode should keep that
 * look. We re-assert the colors with `!important` so the generic
 * `[data-theme="dark"] .form-control / .form-label / .input-group-text`
 * rules don't bleed through (they tie on specificity 0,2,0 and load
 * BEFORE page-auth-evidentia.css, so without `!important` here, source
 * order would still favor evidentia — but we bump to !important so
 * future generic dark rules can't accidentally win).
 * ===================================================================== */
[data-theme="dark"].light-style .authentication-wrapper.authentication-cover {
  background: linear-gradient(135deg, #061021 0%, #08323d 100%) !important;
}
[data-theme="dark"].light-style .evidentia-login-card {
  background: rgba(10, 16, 30, 0.92) !important;
  border-color: rgba(255, 255, 255, 0.08) !important;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5) !important;
}
[data-theme="dark"].light-style .evidentia-login-card h4,
[data-theme="dark"].light-style .evidentia-login-card .text-white {
  color: #fff !important;
}
[data-theme="dark"].light-style .evidentia-login-card p,
[data-theme="dark"].light-style .evidentia-login-card .text-white-50 {
  color: rgba(255, 255, 255, 0.55) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .form-label {
  color: rgba(255, 255, 255, 0.85) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .form-control {
  background-color: rgba(15, 23, 42, 0.6) !important;
  border-color: rgba(255, 255, 255, 0.15) !important;
  color: #fff !important;
}
[data-theme="dark"].light-style .evidentia-login-card .form-control::placeholder {
  color: rgba(255, 255, 255, 0.35) !important;
  opacity: 1;
}
[data-theme="dark"].light-style .evidentia-login-card .form-control:focus {
  background-color: rgba(15, 23, 42, 0.8) !important;
  border-color: var(--bs-primary) !important;
  box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25) !important;
  color: #fff !important;
}
[data-theme="dark"].light-style .evidentia-login-card .input-group-text {
  background-color: rgba(15, 23, 42, 0.6) !important;
  border-color: rgba(255, 255, 255, 0.15) !important;
  color: rgba(255, 255, 255, 0.5) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .form-check-label {
  color: rgba(255, 255, 255, 0.7) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .form-check-input {
  background-color: rgba(15, 23, 42, 0.6) !important;
  border-color: rgba(255, 255, 255, 0.2) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .form-check-input:checked {
  background-color: var(--bs-primary) !important;
  border-color: var(--bs-primary) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .nav-link {
  color: rgba(255, 255, 255, 0.6) !important;
}
[data-theme="dark"].light-style .evidentia-login-card .nav-link:hover {
  color: #fff !important;
}
[data-theme="dark"].light-style .evidentia-login-card .invalid-feedback {
  color: #f87171 !important;
}

/* =====================================================================
 * ApexCharts tooltips — site-wide dark-mode pass.
 *
 * Why this is non-trivial:
 *   - Vuexy ships parallel rule trees in apex-charts.css: `.light-style …`
 *     for light, `.dark-style …` for dark. The `<html>` element keeps
 *     `class="light-style"` permanently (Vuexy never swaps it), so the
 *     `.dark-style` block never fires. Default ApexCharts tooltips
 *     therefore render with white background / light border on every
 *     chart in the app, even in dark mode.
 *   - `[data-theme="dark"]` is set on the SAME `<html>` element by the
 *     pre-paint script in partials/header.ejs. To beat the
 *     `.light-style …` rules, we use the **compound** selector
 *     `[data-theme="dark"].light-style …` (no space — same element) so
 *     specificity ties or wins, then `!important` on the property.
 *
 * What this covers (every chart in the app inherits these):
 *   - Default tooltip shell (`.apexcharts-tooltip.apexcharts-theme-light`)
 *     used by player-detail (#overviewDepositsChart, #overviewStakeWinChart,
 *     #financialsDepPayChart, #financialsStakeWinChart), markets
 *     (#activityTrend, #companyComparison, #ggrShare), company-detail
 *     (#ggrChart, Income Statement #lineChart custom tooltip), players
 *     (#totalTransactionsChart), responsible-gambling-detail
 *     (#lossVelocityChart custom tooltip via `.chart-tooltip` — already
 *     remapped above), importer (#companyTimeline-*, #gapTimelineChart,
 *     #selectedWindowChart range-bar tooltips).
 *   - Tooltip title bar, series rows, value/label text, color marker dots.
 *   - X-axis and Y-axis tooltips (the small label that follows the
 *     crosshair on the axis edge).
 *   - Axis-tooltip arrow pseudo-elements (4 directions × :before/:after).
 *   - Crosshair stroke color so the vertical/horizontal hover line reads
 *     against the dark surface.
 *
 * Markets `winLoseChart` / `highRiskChart` configure
 * `tooltip.theme: 'dark'` in JS, which renders as
 * `.apexcharts-tooltip.apexcharts-theme-dark`. The library's built-in
 * dark theme already paints those with a dark background, so no override
 * is needed — they're left alone.
 * ===================================================================== */
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip.apexcharts-theme-light {
  background: #2a2a3d !important;
  border: 1px solid var(--bs-border-color) !important;
  box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.4) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-title {
  background: #232334 !important;
  border-bottom: 1px solid var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text-y-label,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text-y-value,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text-z-label,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text-z-value,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text-goals-label,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-text-goals-value {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-series-group {
  background: transparent !important;
}

/* Range-bar tooltip (importer gap-timeline / selected-window / per-company timelines). */
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-rangebar .series-name,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-tooltip-rangebar .category {
  color: var(--bs-body-color) !important;
}

/* Axis tooltips (the floating label on the axis edge that follows the
 * crosshair). Background, border, and text need to read against dark. */
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip {
  background: #232334 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip-text,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip-text {
  color: var(--bs-body-color) !important;
}

/* Axis-tooltip arrow (the little pointer between the tooltip and the
 * axis line). Each direction has a :before (border) and :after (fill).
 * Match the surface + border tokens above. */
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-bottom:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-bottom:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-bottom:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-bottom:after {
  border-bottom-color: #232334 !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-bottom:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-bottom:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-bottom:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-bottom:before {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-top:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-top:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-top:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-top:after {
  border-top-color: #232334 !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-top:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-top:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-top:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-top:before {
  border-top-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-left:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-left:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-left:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-left:after {
  border-left-color: #232334 !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-left:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-left:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-left:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-left:before {
  border-left-color: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-right:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-right:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-right:after,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-right:after {
  border-right-color: #232334 !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-xaxistooltip-right:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-xaxistooltip-right:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxistooltip.apexcharts-yaxistooltip-right:before,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxistooltip.apexcharts-yaxistooltip-right:before {
  border-right-color: var(--bs-border-color) !important;
}

/* Crosshair lines — the vertical/horizontal hover guides. SVG `stroke`
 * attribute is set inline by ApexCharts; CSS `stroke` overrides it. */
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xcrosshairs,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-ycrosshairs {
  stroke: var(--bs-border-color) !important;
}

/* =====================================================================
 * /companies-fraud — addUnlicensedWizardModal Step 3 Review panel.
 * Page CSS hardcodes `.review-summary { background: #f8f7fa }` (light
 * gray-purple), `.review-item { border-bottom: 1px solid #ebe9f1 }`,
 * `.review-item label { color: #5d596c }`, `.review-item span { color:
 * #6e6b7b }` — the wizard's review card paints as a near-white panel
 * over the dark modal-content. Remap to a slightly-elevated surface
 * (#252537) above the modal-content (#232334) plus body / secondary
 * tokens for the label/value pair.
 * ===================================================================== */
[data-theme="dark"] #addUnlicensedWizardModal .review-summary {
  background-color: #252537 !important;
}
[data-theme="dark"] #addUnlicensedWizardModal .review-item {
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] #addUnlicensedWizardModal .review-item label {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] #addUnlicensedWizardModal .review-item span {
  color: var(--bs-secondary-color) !important;
}

/* =====================================================================
 * Responsible-gambling detail — `.pagination-btn` was already remapped
 * to dark surface (#2a2a3d) with `!important`, but that beat the page's
 * `.pagination-btn.active { background: var(--bs-primary) }` (no
 * !important), so the active page indicator vanished — every page
 * button looked identical. Restore the active state with primary
 * color + matching border + white text. Used on the recentBetsTable
 * pagination, plus any other inline pagination-bar list page.
 * ===================================================================== */
[data-theme="dark"] .pagination-btn.active {
  background-color: var(--bs-primary) !important;
  border-color: var(--bs-primary) !important;
  color: #ffffff !important;
}

/* =====================================================================
 * Player detail — bettingActivityTable type/direction inline colors.
 * `player-detail.js` ships:
 *   - the "payout" type badge with inline `style="color: #475569; ..."`
 *     (line 69 type-color map), rendered as a faint slate tag that
 *     vanishes on the dark page background;
 *   - the "Credit" direction cell with inline `style="color: #475569"`
 *     (line 822), same problem.
 * Remap the inline `#475569` token to body color so both render at
 * full contrast in dark mode. Side benefits: any other place in the
 * app that uses #475569 as an inline color (slate-600 token) gets
 * the same fix for free.
 * ===================================================================== */
[data-theme="dark"] [style*="color: #475569"],
[data-theme="dark"] [style*="color:#475569"] {
  color: var(--bs-body-color) !important;
}

/* =====================================================================
 * /config#notification-templates — templateWizardModal Step 2 (Content)
 * editor toolbar. Page CSS hardcodes `.template-editor-toolbar { bg:
 * #f3f2f7; border-bottom: 1px solid #ebe9f1 }` and `.placeholder-btn
 * { bg: white; border: 1px solid #ebe9f1; color: #6e6b7b }` — the
 * "Insert:" row above the textarea and its placeholder chips paint
 * as a white strip with white pills inside the dark modal. Remap to
 * the elevated surface tokens, theme-aware border, and secondary text.
 * (Note: there's a sibling rule earlier for `.notif-template-editor-
 * toolbar` — different class, used inside companies/notificationTypes;
 * this rule is the config-page variant.)
 * ===================================================================== */
[data-theme="dark"] .template-editor-toolbar {
  background-color: #252537 !important;
  border-bottom-color: var(--bs-border-color) !important;
}
[data-theme="dark"] .placeholder-btn {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"] .placeholder-btn:hover {
  border-color: var(--bs-primary) !important;
  color: var(--bs-primary) !important;
  background-color: rgba(var(--bs-primary-rgb), 0.12) !important;
}

/* =====================================================================
 * ApexCharts axis labels / legend / grid — site-wide remap.
 *
 * ApexCharts renders axis tick labels as `<text class="apexcharts-text">`
 * SVG nodes with their fill set via JS config (`labels.style.colors`),
 * usually a hardcoded `#373d3f` / `#6e6b7b` / `#8a8d93` slate token. On
 * the dark page background those become barely-visible faint smudges —
 * e.g. /players/:id Overview tab "Monthly Deposits" + "Stake and Win"
 * charts where x-axis (`03/2026`, `04/2026`) and y-axis (`UGX 35K`...)
 * paint dim, plus the "Stakes" / "Wins" legend chips next to the
 * colored marker dots.
 *
 * SVG `fill` attributes set via JS DO get overridden by CSS `fill:` with
 * `!important` — the cascade applies to SVG presentation attributes,
 * just like `color` on HTML. Same trick documented for the importer's
 * companyTimeline. Use the `[data-theme="dark"].light-style` compound
 * selector (Vuexy ships parallel `.light-style` / `.dark-style` rule
 * trees and never swaps the class on `<html>`, so a no-space compound
 * is required to beat library rules — same gotcha as the daterangepicker
 * + auth login overrides).
 *
 * What this covers:
 *   - X-axis tick labels (`.apexcharts-xaxis text`, `.apexcharts-xaxis-label`)
 *   - Y-axis tick labels (`.apexcharts-yaxis text`, `.apexcharts-yaxis-label`)
 *   - Series labels (axis titles)
 *   - Legend text + the small marker borders
 *   - Grid horizontal/vertical lines (the dashed guide lines behind bars)
 *   - Axis border lines (the solid lines along the bottom/left edges)
 *
 * Datalabel text rendered ON TOP of bars/series (e.g. radial chart center
 * labels, stacked bar value labels) intentionally NOT remapped — those
 * are typically configured per-chart with deliberate light colors that
 * read against the colored series fill. If a specific chart's datalabel
 * still looks wrong, scope an override by chart id.
 * ===================================================================== */
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-text,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxis text,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxis text,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxis-label,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxis-label,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxis-title text,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxis-title text {
  fill: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-legend-text {
  color: var(--bs-secondary-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-grid line,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-gridlines-horizontal line,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-gridlines-vertical line {
  stroke: var(--bs-border-color) !important;
}
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-xaxis line,
[data-theme="dark"].light-style .apexcharts-canvas .apexcharts-yaxis line {
  stroke: var(--bs-border-color) !important;
}

/* =====================================================================
 * /transactions — `.badge-type-payout` is a CSS class (not inline) with
 * `color: #475569` (slate-600) on a faint `rgba(100, 116, 139, 0.08)`
 * bg. The global inline-color remap above only catches inline `style=`
 * attributes, so this class-defined slate text stays invisible on the
 * dark page background. Sibling `.badge-type-deposit` already uses a
 * blue token that reads fine in dark mode — only the payout variant
 * needs the override. Lift the text to secondary color and keep the
 * faint slate tint background (still subtle but visible).
 * ===================================================================== */
[data-theme="dark"] .badge-type-payout {
  color: var(--bs-secondary-color) !important;
  background: rgba(148, 163, 184, 0.16) !important;
}

/* =====================================================================
 * Fraud detail attachModal `#attachFile` — `<input type="file">` with
 * Bootstrap's `.form-control` shell. Bootstrap styles the native file
 * picker button via `::file-selector-button` (modern) and falls back
 * to `::-webkit-file-upload-button`, both pinned to a light bg with
 * dark text — leaves a "Choose Files" pill that paints as a bright
 * white block inside the dark modal, with the filename text after
 * the button rendered against an unrelated background. Remap the
 * button portion to the elevated surface + body color so it matches
 * the rest of the modal, and force the form-control bg/border tokens
 * so the input shell and filename text both read correctly.
 *
 * Affects both attachModals — fraud_companies/detail.ejs (case attach)
 * and fraud_players/detail.ejs (player-fraud attach) — plus any other
 * `<input type="file">` in dark mode (companies document upload, etc.)
 * since the selectors are class- not id-scoped.
 * ===================================================================== */
[data-theme="dark"] .form-control[type="file"] {
  background-color: #2a2a3d !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .form-control[type="file"]::file-selector-button {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .form-control[type="file"]::-webkit-file-upload-button {
  background-color: #252537 !important;
  border-color: var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .form-control[type="file"]:hover::file-selector-button,
[data-theme="dark"] .form-control[type="file"]:hover::-webkit-file-upload-button {
  background-color: #2f2f44 !important;
  color: var(--bs-emphasis-color) !important;
}

/* =====================================================================
 * `<hr>` inside cards + modals — section dividers.
 *
 * core.css ships `hr { color: #e6e6e8; border-top: var(--bs-border-width)
 * solid; }` — the `color` paints `currentColor` on the border-top, so
 * every `<hr>` in the app renders as a near-white line that's visually
 * jarring against the dark card / modal surfaces. Affects `/config`
 * Settings sections (5 dividers), `/companies/:id` Edit modal sections
 * (3 dividers), `/gap` cards, and any future card divider.
 *
 * Scope to `.card hr` + `.modal hr` so we don't disturb `.dropdown-
 * divider` (different class, different selector specificity, has its
 * own dark-mode token) used in the navbar user menu + fraud_companies
 * action dropdowns. Remap to `--bs-border-color` so the line reads as
 * a quiet separator at the card/modal contrast level.
 * ===================================================================== */
[data-theme="dark"] .card hr:not(.dropdown-divider),
[data-theme="dark"] .modal hr:not(.dropdown-divider) {
  color: var(--bs-border-color) !important;
  border-top-color: var(--bs-border-color) !important;
}

/* /config — `.system-info-footer` is the "Last Updated" strip below the
 * settings grid. Page CSS hardcodes `border-top: 1px solid #ebe9f1`
 * (light); without this override the divider line paints near-white on
 * the dark card. */
[data-theme="dark"] .system-info-footer {
  border-top-color: var(--bs-border-color) !important;
}

/* =====================================================================
 * DataTables th/td borders — site-wide.
 *
 * datatables.bootstrap5.css ships `.light-style table.dataTable th,
 * .light-style table.dataTable td { border-color: #e6e6e8 !important }`.
 * The `.light-style` class lives on `<html>` and is never swapped to
 * `.dark-style` in this app, so without an override the table grid
 * paints with a near-white line between every cell on dark backgrounds.
 *
 * The fix uses the compound-selector trick — `[data-theme="dark"]` is
 * also on `<html>`, so `[data-theme="dark"].light-style` (no space)
 * targets the same element and beats the library rule on specificity
 * (0,1,2 + !important vs 0,1,2 + !important — same specificity, but
 * later in cascade wins). Apply to th + td so header borders, body
 * borders, and the row-bottom divider all match the dark theme.
 *
 * Affects every DataTable in the app: /transactions, /players, /audit-log,
 * /user-behavior, /management, /companies, /companies-fraud detail
 * (cases, SMS evidence), /importer (files, failed-tx, gap, detail),
 * /ncems, /players/:id (betting-activity), /players/responsible-gambling,
 * /config (notification templates/channels, tax rates, roles), etc.
 * ===================================================================== */
[data-theme="dark"].light-style table.dataTable th,
[data-theme="dark"].light-style table.dataTable td {
  border-color: var(--bs-border-color) !important;
}

/* /audit-log — `.al-alert-text` (suspicious activity banner alert rows)
 * uses `color: var(--al-text-primary)` which the page CSS pins to
 * `#5e5873` (dark slate) at `:root` in activity.ejs. The page has no
 * `.al-page` wrapper class, so the `[data-theme="dark"] .al-page { --al-text-* }`
 * rebinding earlier in this file doesn't apply. Override the property
 * directly with the body color token for visibility on dark.
 *
 * `.al-timeline::before` is the vertical guide line in the Timeline tab.
 * `background: var(--al-border-color)` resolves to the `:root` `#ebe9f1`
 * fallback for the same reason — paints a bright line on dark. Remap to
 * border-color token so it reads as a quiet rail. */
[data-theme="dark"] .al-alert-text {
  color: var(--bs-body-color) !important;
}
[data-theme="dark"] .al-alert-text strong {
  color: var(--bs-emphasis-color) !important;
}
[data-theme="dark"] .al-timeline::before {
  background: var(--bs-border-color) !important;
}

/* =====================================================================
 * `.badge-role` inline-style color/bg remap — site-wide.
 *
 * `.badge-role` is a base class (only padding/font-size — no color)
 * with the actual color/bg supplied via inline `style="..."` from EJS
 * or JS column renderers. Two recurring combos look bad on dark:
 *
 *   1. INDIGO (admin role + company-account count badges):
 *      `color: #4338ca; background: rgba(79, 70, 229, 0.08)`
 *      — paints near-invisible on dark (#4338ca on #1b1b29 + faint
 *      indigo tint). Used on /profile, /management/detail, player-
 *      detail company-accounts table, anywhere `roleColor='#4338ca'`.
 *
 *   2. BLUE (user role + confirmed badges):
 *      `color: #2563eb; background: rgba(59, 130, 246, 0.08)`
 *      — same problem, just with blue-700.
 *
 * Brighten the text to indigo-300 / blue-300 (readable on dark) and
 * pump the bg tint to ~22% so the chip shape stays visible. Match
 * BOTH whitespace variants (`color: #X` and `color:#X`) like the
 * existing slate-color remap above does.
 *
 * The bg selector uses `rgba(R, G, B` (without closing paren / alpha)
 * so any opacity value matches — covers `0.08`, `0.16`, `0.2`, etc.
 * with one rule pair instead of one per alpha.
 *
 * Affects: /management list + detail role badges, /profile role badge,
 * /companies-fraud + /players-fraud notification-sent badges,
 * player-detail company-account count badges, player-detail timeline
 * type badges, profile/audit-log method badges, and any future inline
 * `style="color:#4338ca"` or `style="color:#2563eb"` usage.
 * ===================================================================== */
[data-theme="dark"] [style*="color: #4338ca"],
[data-theme="dark"] [style*="color:#4338ca"] {
  color: #a5b4fc !important;
}
[data-theme="dark"] [style*="background: rgba(79, 70, 229"],
[data-theme="dark"] [style*="background:rgba(79, 70, 229"],
[data-theme="dark"] [style*="background: rgba(79,70,229"],
[data-theme="dark"] [style*="background:rgba(79,70,229"] {
  background: rgba(99, 102, 241, 0.22) !important;
}
[data-theme="dark"] [style*="color: #2563eb"],
[data-theme="dark"] [style*="color:#2563eb"] {
  color: #93c5fd !important;
}
[data-theme="dark"] [style*="background: rgba(59, 130, 246"],
[data-theme="dark"] [style*="background:rgba(59, 130, 246"],
[data-theme="dark"] [style*="background: rgba(59,130,246"],
[data-theme="dark"] [style*="background:rgba(59,130,246"] {
  background: rgba(96, 165, 250, 0.22) !important;
}
