/* ==========================================================================
   dallelha admin — colour themes
   Chosen from the navbar menu built by dallelha-themes.js, which sets
   data-dl-theme on <html> (and the data-bs-theme the theme is drawn for).
   "Normal" is the absence of that attribute.

   Three rules keep this file safe, and dallelha/tests_admin_themes.py
   enforces each of them:

   1. Every selector names data-dl-theme (or the menu's own .dl-theme-*
      classes), so with no theme chosen nothing here applies and Normal is
      exactly what it was.
   2. Colour only. No spacing, no direction, no fonts — which is why this
      works in the Arabic admin where Jazzmin's Bootswatch themes (full LTR
      Bootstrap sheets) do not, and why it needs no twin in admin/rtl/.
   3. Every text/background pair of every theme clears WCAG 4.5:1.

   A theme is one block of --dl-t-* tokens (section 1). Section 2 points
   Bootstrap's and AdminLTE's own variables at those tokens once, for all
   themes; the project's sheets already read those variables, so the sidebar,
   dashboard, record lists, forms and custom pages follow without per-page
   work. Tokens are "r, g, b" triplets because Bootstrap needs both a colour
   and its bare triplet (--bs-body-bg and --bs-body-bg-rgb).
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens — one block per theme
      bg: the page · surface: cards, top bar, inputs · raised: hover, chips
      strong: headings and table text, and what the top bar's icons are a
      65% tint of · highlight: link hover and decoration · danger: required
      marks and field errors · sidebar-*: the sidebar is dark in every theme,
      so it carries its own text and accent
   -------------------------------------------------------------------------- */

[data-dl-theme="neon"] {
  --dl-t-bg: 11, 10, 26;
  --dl-t-surface: 19, 17, 43;
  --dl-t-raised: 30, 26, 69;
  --dl-t-text: 243, 240, 255;
  --dl-t-strong: 255, 255, 255;
  --dl-t-muted: 183, 176, 221;
  --dl-t-border: 46, 42, 92;
  --dl-t-accent: 73, 228, 237;
  --dl-t-on-accent: 8, 16, 22;
  --dl-t-highlight: 255, 95, 220;
  --dl-t-danger: 234, 134, 143;
  --dl-t-sidebar: 14, 12, 34;
  --dl-t-sidebar-text: 230, 226, 255;
  --dl-t-sidebar-accent: 73, 228, 237;
  --dl-t-backdrop:
    radial-gradient(ellipse at top, rgba(var(--dl-t-accent), 0.08), transparent 55%),
    radial-gradient(ellipse at bottom, rgba(var(--dl-t-highlight), 0.07), transparent 55%);
}

[data-dl-theme="cyberpunk"] {
  --dl-t-bg: 12, 13, 19;
  --dl-t-surface: 21, 22, 31;
  --dl-t-raised: 32, 34, 46;
  --dl-t-text: 250, 247, 233;
  --dl-t-strong: 255, 255, 255;
  --dl-t-muted: 185, 182, 166;
  --dl-t-border: 47, 49, 64;
  --dl-t-accent: 242, 232, 92;
  --dl-t-on-accent: 17, 18, 23;
  --dl-t-highlight: 255, 77, 141;
  --dl-t-danger: 234, 134, 143;
  --dl-t-sidebar: 16, 17, 24;
  --dl-t-sidebar-text: 241, 238, 222;
  --dl-t-sidebar-accent: 242, 232, 92;
  --dl-t-backdrop:
    repeating-linear-gradient(135deg, rgba(var(--dl-t-accent), 0.03) 0 2px, transparent 2px 16px);
}

[data-dl-theme="cybersecurity"] {
  --dl-t-bg: 5, 13, 9;
  --dl-t-surface: 10, 22, 16;
  --dl-t-raised: 17, 36, 26;
  --dl-t-text: 228, 243, 233;
  --dl-t-strong: 255, 255, 255;
  --dl-t-muted: 159, 194, 171;
  --dl-t-border: 26, 58, 38;
  --dl-t-accent: 74, 222, 128;
  --dl-t-on-accent: 4, 17, 10;
  --dl-t-highlight: 163, 230, 53;
  --dl-t-danger: 234, 134, 143;
  --dl-t-sidebar: 7, 18, 12;
  --dl-t-sidebar-text: 214, 234, 220;
  --dl-t-sidebar-accent: 74, 222, 128;
  --dl-t-backdrop:
    linear-gradient(rgba(var(--dl-t-accent), 0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(var(--dl-t-accent), 0.05) 1px, transparent 1px);
  --dl-t-backdrop-size: 28px 28px;
}

[data-dl-theme="aurora"] {
  --dl-t-bg: 12, 18, 32;
  --dl-t-surface: 20, 28, 46;
  --dl-t-raised: 29, 39, 64;
  --dl-t-text: 237, 241, 250;
  --dl-t-strong: 255, 255, 255;
  --dl-t-muted: 169, 180, 204;
  --dl-t-border: 40, 52, 80;
  --dl-t-accent: 114, 222, 211;
  --dl-t-on-accent: 12, 23, 26;
  --dl-t-highlight: 179, 157, 250;
  --dl-t-danger: 234, 134, 143;
  --dl-t-sidebar: 15, 22, 38;
  --dl-t-sidebar-text: 227, 233, 246;
  --dl-t-sidebar-accent: 114, 222, 211;
  --dl-t-backdrop:
    radial-gradient(ellipse at top, rgba(var(--dl-t-accent), 0.11), transparent 60%),
    radial-gradient(ellipse at bottom, rgba(var(--dl-t-highlight), 0.09), transparent 60%);
}

[data-dl-theme="midnight"] {
  --dl-t-bg: 10, 17, 30;
  --dl-t-surface: 17, 26, 44;
  --dl-t-raised: 26, 38, 61;
  --dl-t-text: 232, 238, 248;
  --dl-t-strong: 255, 255, 255;
  --dl-t-muted: 163, 177, 201;
  --dl-t-border: 36, 50, 76;
  --dl-t-accent: 146, 184, 255;
  --dl-t-on-accent: 11, 19, 34;
  --dl-t-highlight: 195, 215, 255;
  --dl-t-danger: 234, 134, 143;
  --dl-t-sidebar: 12, 20, 36;
  --dl-t-sidebar-text: 221, 230, 244;
  --dl-t-sidebar-accent: 146, 184, 255;
}

[data-dl-theme="graphite"] {
  --dl-t-bg: 19, 21, 23;
  --dl-t-surface: 27, 30, 34;
  --dl-t-raised: 38, 42, 48;
  --dl-t-text: 238, 240, 243;
  --dl-t-strong: 255, 255, 255;
  --dl-t-muted: 170, 177, 187;
  --dl-t-border: 50, 55, 62;
  --dl-t-accent: 199, 205, 214;
  --dl-t-on-accent: 22, 25, 30;
  --dl-t-highlight: 255, 255, 255;
  --dl-t-danger: 234, 134, 143;
  --dl-t-sidebar: 16, 18, 20;
  --dl-t-sidebar-text: 227, 230, 234;
  --dl-t-sidebar-accent: 226, 230, 236;
}

[data-dl-theme="ocean"] {
  --dl-t-bg: 234, 244, 248;
  --dl-t-surface: 255, 255, 255;
  --dl-t-raised: 220, 235, 241;
  --dl-t-text: 23, 51, 69;
  --dl-t-strong: 10, 31, 43;
  --dl-t-muted: 69, 96, 112;
  --dl-t-border: 201, 221, 230;
  --dl-t-accent: 15, 107, 130;
  --dl-t-on-accent: 255, 255, 255;
  --dl-t-highlight: 10, 74, 92;
  --dl-t-danger: 176, 42, 55;
  --dl-t-sidebar: 14, 51, 69;
  --dl-t-sidebar-text: 228, 242, 247;
  --dl-t-sidebar-accent: 127, 216, 234;
}

[data-dl-theme="sandstone"] {
  --dl-t-bg: 246, 239, 228;
  --dl-t-surface: 255, 253, 249;
  --dl-t-raised: 239, 228, 211;
  --dl-t-text: 70, 55, 42;
  --dl-t-strong: 43, 31, 21;
  --dl-t-muted: 102, 86, 70;
  --dl-t-border: 226, 211, 189;
  --dl-t-accent: 143, 84, 38;
  --dl-t-on-accent: 255, 255, 255;
  --dl-t-highlight: 106, 60, 24;
  --dl-t-danger: 176, 42, 55;
  --dl-t-sidebar: 53, 38, 27;
  --dl-t-sidebar-text: 244, 234, 220;
  --dl-t-sidebar-accent: 240, 185, 138;
}

/* --------------------------------------------------------------------------
   2. Bootstrap and AdminLTE, pointed at the tokens
   -------------------------------------------------------------------------- */

/* The page itself is body.bg-body-tertiary, hence tertiary = bg. */
:root[data-dl-theme] {
  --bs-body-bg: rgb(var(--dl-t-surface));
  --bs-body-bg-rgb: var(--dl-t-surface);
  --bs-secondary-bg: rgb(var(--dl-t-raised));
  --bs-secondary-bg-rgb: var(--dl-t-raised);
  --bs-tertiary-bg: rgb(var(--dl-t-bg));
  --bs-tertiary-bg-rgb: var(--dl-t-bg);
  --bs-body-color: rgb(var(--dl-t-text));
  --bs-body-color-rgb: var(--dl-t-text);
  --bs-emphasis-color: rgb(var(--dl-t-strong));
  --bs-emphasis-color-rgb: var(--dl-t-strong);
  --bs-secondary-color: rgb(var(--dl-t-muted));
  --bs-secondary-color-rgb: var(--dl-t-muted);
  --bs-tertiary-color: rgba(var(--dl-t-muted), 0.75);
  --bs-tertiary-color-rgb: var(--dl-t-muted);
  --bs-border-color: rgb(var(--dl-t-border));
  --bs-border-color-translucent: rgba(var(--dl-t-text), 0.14);
  --bs-primary: rgb(var(--dl-t-accent));
  --bs-primary-rgb: var(--dl-t-accent);
  --bs-primary-text-emphasis: rgb(var(--dl-t-accent));
  --bs-primary-bg-subtle: rgba(var(--dl-t-accent), 0.14);
  --bs-primary-border-subtle: rgba(var(--dl-t-accent), 0.4);
  --bs-link-color: rgb(var(--dl-t-accent));
  --bs-link-color-rgb: var(--dl-t-accent);
  --bs-link-hover-color: rgb(var(--dl-t-highlight));
  --bs-link-hover-color-rgb: var(--dl-t-highlight);
  --bs-code-color: rgb(var(--dl-t-highlight));
  --bs-focus-ring-color: rgba(var(--dl-t-accent), 0.3);
  --bs-form-invalid-color: rgb(var(--dl-t-danger));
  --bs-form-invalid-border-color: rgb(var(--dl-t-danger));
}

/* Bootstrap's red is drawn for a white page: too dim on a dark surface, and
   just short of readable on Sandstone's cream. */
:root[data-dl-theme] :is(.text-red, .text-danger, .invalid-feedback) {
  color: rgb(var(--dl-t-danger)) !important;
}

:root[data-dl-theme] body {
  background-image: var(--dl-t-backdrop, none);
  background-size: var(--dl-t-backdrop-size, auto);
  background-attachment: fixed;
}

/* The sidebar is <aside data-bs-theme="dark">, which re-declares Bootstrap's
   dark variables on the element itself — so it has to be themed there, not
   through what it would have inherited from <html>. */
:root[data-dl-theme] #jazzy-sidebar {
  --bs-secondary-bg: rgb(var(--dl-t-sidebar));
  --bs-secondary-bg-rgb: var(--dl-t-sidebar);
  --bs-body-color: rgb(var(--dl-t-sidebar-text));
  --bs-body-color-rgb: var(--dl-t-sidebar-text);
  --bs-emphasis-color: rgb(var(--dl-t-sidebar-text));
  --bs-emphasis-color-rgb: var(--dl-t-sidebar-text);
  --bs-border-color: rgba(var(--dl-t-sidebar-text), 0.12);
  --lte-sidebar-color: rgba(var(--dl-t-sidebar-text), 0.85);
  --lte-sidebar-hover-color: rgb(var(--dl-t-sidebar-text));
  --lte-sidebar-hover-bg: rgba(var(--dl-t-sidebar-accent), 0.1);
  --lte-sidebar-active-color: rgb(var(--dl-t-sidebar-text));
  --lte-sidebar-menu-active-color: rgb(var(--dl-t-sidebar-accent));
  --lte-sidebar-menu-active-bg: rgba(var(--dl-t-sidebar-accent), 0.16);
  --lte-sidebar-submenu-color: rgba(var(--dl-t-sidebar-text), 0.85);
  --lte-sidebar-submenu-hover-color: rgb(var(--dl-t-sidebar-text));
  --lte-sidebar-submenu-hover-bg: rgba(var(--dl-t-sidebar-accent), 0.1);
  --lte-sidebar-submenu-active-color: rgb(var(--dl-t-sidebar-accent));
  --lte-sidebar-submenu-active-bg: rgba(var(--dl-t-sidebar-accent), 0.16);
  --lte-sidebar-header-color: rgba(var(--dl-t-sidebar-text), 0.85);
}

/* Bootstrap hard-codes its blue into these components instead of reading
   --bs-primary, so each one is re-pointed by hand. */
:root[data-dl-theme] .btn-primary {
  --bs-btn-color: rgb(var(--dl-t-on-accent));
  --bs-btn-bg: rgb(var(--dl-t-accent));
  --bs-btn-border-color: rgb(var(--dl-t-accent));
  --bs-btn-hover-color: rgb(var(--dl-t-on-accent));
  --bs-btn-hover-bg: color-mix(in srgb, rgb(var(--dl-t-accent)) 86%, rgb(var(--dl-t-text)));
  --bs-btn-hover-border-color: var(--bs-btn-hover-bg);
  --bs-btn-focus-shadow-rgb: var(--dl-t-accent);
  --bs-btn-active-color: rgb(var(--dl-t-on-accent));
  --bs-btn-active-bg: color-mix(in srgb, rgb(var(--dl-t-accent)) 74%, rgb(var(--dl-t-text)));
  --bs-btn-active-border-color: var(--bs-btn-active-bg);
  --bs-btn-disabled-color: rgb(var(--dl-t-on-accent));
  --bs-btn-disabled-bg: rgb(var(--dl-t-accent));
  --bs-btn-disabled-border-color: rgb(var(--dl-t-accent));
}

:root[data-dl-theme] .btn-outline-primary {
  --bs-btn-color: rgb(var(--dl-t-accent));
  --bs-btn-border-color: rgb(var(--dl-t-accent));
  --bs-btn-hover-color: rgb(var(--dl-t-on-accent));
  --bs-btn-hover-bg: rgb(var(--dl-t-accent));
  --bs-btn-hover-border-color: rgb(var(--dl-t-accent));
  --bs-btn-focus-shadow-rgb: var(--dl-t-accent);
  --bs-btn-active-color: rgb(var(--dl-t-on-accent));
  --bs-btn-active-bg: rgb(var(--dl-t-accent));
  --bs-btn-active-border-color: rgb(var(--dl-t-accent));
  --bs-btn-disabled-color: rgb(var(--dl-t-accent));
  --bs-btn-disabled-border-color: rgb(var(--dl-t-accent));
}

/* Bootstrap's fixed mid-grey, which has no dark-mode value of its own. */
:root[data-dl-theme] .btn-outline-secondary {
  --bs-btn-color: rgb(var(--dl-t-muted));
  --bs-btn-border-color: rgb(var(--dl-t-muted));
  --bs-btn-hover-color: rgb(var(--dl-t-text));
  --bs-btn-hover-bg: rgb(var(--dl-t-raised));
  --bs-btn-hover-border-color: rgb(var(--dl-t-muted));
  --bs-btn-focus-shadow-rgb: var(--dl-t-muted);
  --bs-btn-active-color: rgb(var(--dl-t-text));
  --bs-btn-active-bg: rgb(var(--dl-t-raised));
  --bs-btn-active-border-color: rgb(var(--dl-t-muted));
  --bs-btn-disabled-color: rgb(var(--dl-t-muted));
  --bs-btn-disabled-border-color: rgb(var(--dl-t-muted));
}

:root[data-dl-theme] .pagination {
  --bs-pagination-active-color: rgb(var(--dl-t-on-accent));
  --bs-pagination-active-bg: rgb(var(--dl-t-accent));
  --bs-pagination-active-border-color: rgb(var(--dl-t-accent));
  --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dl-t-accent), 0.25);
}

:root[data-dl-theme] .dropdown-menu {
  --bs-dropdown-link-active-color: rgb(var(--dl-t-on-accent));
  --bs-dropdown-link-active-bg: rgb(var(--dl-t-accent));
}

:root[data-dl-theme] .nav-pills {
  --bs-nav-pills-link-active-color: rgb(var(--dl-t-on-accent));
  --bs-nav-pills-link-active-bg: rgb(var(--dl-t-accent));
}

:root[data-dl-theme] .list-group {
  --bs-list-group-active-color: rgb(var(--dl-t-on-accent));
  --bs-list-group-active-bg: rgb(var(--dl-t-accent));
  --bs-list-group-active-border-color: rgb(var(--dl-t-accent));
}

:root[data-dl-theme] .progress {
  --bs-progress-bar-color: rgb(var(--dl-t-on-accent));
  --bs-progress-bar-bg: rgb(var(--dl-t-accent));
}

:root[data-dl-theme] :is(.form-control, .form-select, .form-check-input):focus {
  border-color: rgb(var(--dl-t-accent));
  box-shadow: 0 0 0 0.25rem rgba(var(--dl-t-accent), 0.25);
}

:root[data-dl-theme] .form-check-input:checked {
  border-color: rgb(var(--dl-t-accent));
  background-color: rgb(var(--dl-t-accent));
}

/* Text that sits ON the accent. The vendor sheets and the project's own
   pages write white there, which is unreadable on a light accent (Neon's
   cyan, Cyberpunk's yellow). A new page that fills something with
   var(--bs-primary) and writes on it belongs in this list. */
:root[data-dl-theme] :is(
  .text-bg-primary,
  .bg-primary,
  .skip-link,
  .calendar td.selected a,
  .calendar td a:hover,
  .timelist a:hover,
  .selector ul.selector-chooser a:hover,
  .selector select option:checked,
  .select2-container--default .select2-results__option--highlighted[aria-selected],
  .ann-input:checked + .ann-option-box :is(.ann-option-icon, .ann-tick),
  .ann-seg .ann-input:checked + span,
  .ann-seg button.is-on,
  .ann-btn-primary,
  .ann-pin.is-on .ann-pin-tick,
  .ann-row-send,
  .bu-step
) {
  color: rgb(var(--dl-t-on-accent)) !important;
}

:root[data-dl-theme] .select2-container--default .select2-results__option--highlighted[aria-selected] {
  background-color: rgb(var(--dl-t-accent));
}

/* --------------------------------------------------------------------------
   3. Glow — the four themes that have one. Symmetric shadows only, so there
      is no start or end side to get wrong in RTL.
   -------------------------------------------------------------------------- */

:root:is([data-dl-theme="neon"], [data-dl-theme="cyberpunk"], [data-dl-theme="cybersecurity"], [data-dl-theme="aurora"]) :is(.btn-primary, .btn-outline-primary):is(:hover, :focus-visible) {
  box-shadow: 0 0 0 1px rgba(var(--dl-t-accent), 0.6), 0 0 18px rgba(var(--dl-t-accent), 0.45);
}

:root:is([data-dl-theme="neon"], [data-dl-theme="cyberpunk"], [data-dl-theme="cybersecurity"], [data-dl-theme="aurora"]) :is(.form-control, .form-select):focus {
  box-shadow: 0 0 0 0.2rem rgba(var(--dl-t-accent), 0.22), 0 0 16px rgba(var(--dl-t-accent), 0.3);
}

:root:is([data-dl-theme="neon"], [data-dl-theme="cyberpunk"], [data-dl-theme="cybersecurity"], [data-dl-theme="aurora"]) #jazzy-sidebar .nav-link.active {
  box-shadow: inset 0 0 0 1px rgba(var(--dl-t-sidebar-accent), 0.35), 0 0 14px rgba(var(--dl-t-sidebar-accent), 0.2);
}

:root:is([data-dl-theme="neon"], [data-dl-theme="cyberpunk"], [data-dl-theme="cybersecurity"], [data-dl-theme="aurora"]) .card {
  --bs-card-border-color: rgba(var(--dl-t-accent), 0.2);
}

:root:is([data-dl-theme="neon"], [data-dl-theme="cyberpunk"], [data-dl-theme="cybersecurity"], [data-dl-theme="aurora"]) :is(.dl-tile, .dl-jump):is(:hover, :focus-visible) {
  border-color: rgba(var(--dl-t-accent), 0.6);
  box-shadow: 0 0 18px rgba(var(--dl-t-accent), 0.25);
}

:root:is([data-dl-theme="neon"], [data-dl-theme="cyberpunk"], [data-dl-theme="cybersecurity"], [data-dl-theme="aurora"]) .app-header {
  border-image: linear-gradient(90deg, rgba(var(--dl-t-accent), 0.7), rgba(var(--dl-t-highlight), 0.7)) 1;
}

/* --------------------------------------------------------------------------
   4. The navbar menu, and the light/dark button it replaces
   -------------------------------------------------------------------------- */

/* Each theme is drawn for one mode, so light/dark/auto has nothing to switch. */
:root[data-dl-theme] .dl-theme-toggle {
  display: none;
}

.dl-theme-menu .dropdown-item {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

/* A swatch carries its theme's data-dl-theme, so it reads that theme's
   tokens whichever theme the page is in. */
.dl-theme-swatch {
  flex: none;
  width: 1.1rem;
  height: 1.1rem;
  border: 1px solid rgba(128, 128, 128, 0.5);
  border-radius: 50%;
  background: linear-gradient(135deg, rgb(var(--dl-t-surface)) 50%, rgb(var(--dl-t-accent)) 50%);
}

/* Normal's has no theme to read from — and must not inherit the page's. */
.dl-theme-swatch:not([data-dl-theme]) {
  --dl-t-surface: 248, 249, 250;
  --dl-t-accent: 13, 110, 253;
}

/* Tasteful | Full vibe, under the list: one setting for every theme. What
   Full vibe adds is dallelha-themes-vibe.css; this sheet is Tasteful. */
.dl-theme-vibe {
  display: flex;
  gap: 0.25rem;
  padding: 0 0.5rem 0.25rem;
}

.dl-theme-vibe .dropdown-item {
  flex: 1;
  justify-content: center;
  padding-inline: 0.5rem;
  border: 1px solid var(--bs-border-color);
  border-radius: 0.375rem;
  font-size: 0.875rem;
  white-space: nowrap;
}
