/* ─────────────────────────────────────────────────────────────────────────
   ЄДИНА ПАЛІТРА АДМІНКИ (UI-007, 2026-08-21)

   До цього файлу темна тема жила п'ятьма незалежними наборами значень
   у п'яти .cshtml, і кожна правка відтінку означала прохід по всіх п'яти.
   Тепер колір береться ЛИШЕ звідси.

   Правило для нового компонента: не пиши літерал — візьми токен.
   Немає потрібного токена — додай його СЮДИ, а не в представлення.

   Темна гілка описана двома селекторами (html.dark-mode, body.dark-mode),
   бо сторінка входу перемикає тему класом на <html> (Layout = null,
   власний <head>), а решта сторінок — на <body>. Значення однакові;
   змінні успадковуються вниз, тому обидва варіанти працюють однаково.
   ───────────────────────────────────────────────────────────────────────── */

:root {
   /* Поверхні */
   --surface-bg: #f4f6f9;
   --surface: #ffffff;
   --surface-raised: #f1f3f5;

   /* Текст. --surface-muted НЕ #6c757d, як у Bootstrap: на піднятій поверхні
       він дає 4.22 при порозі 4.5 (успадковано з UI-002, не міняти). */
   --surface-text: #212529;
   --surface-muted: #666e75;

   --surface-border: #dee2e6;
   --surface-shadow: rgba(0, 0, 0, .08);

   /* Акцент розділено на заливку і текст: один колір не може бути
       водночас достатньо темним під білий напис і достатньо світлим
       як текст на темному тлі. */
   --accent: #0d6efd;
   --accent-on: #ffffff;
   --accent-text: #0d6efd;

   /* Зелений за тим самим принципом, що й акцент: у світлій темі темний
       відтінок під білим тлом, у темній — світлий. Одним значенням не
       обійтись — #34d399 на білому дає 1.78. */
   --success-text: #198754;
   --success-bg: #d1e7dd;

   /* Червоний текст на поверхні. Значення НЕ нове: рівно ті числа вже жили
       в палітрі під іменем --promo-text (PROMO-001). Тепер канонічним є
       --danger-text, а --promo-text посилається на нього — інакше вийшло б
       два джерела одного кольору, тобто рівно та хвороба, яку лікує UI-008. */
   --danger-text: #b91c1c;
   --danger-bg: #fee2e2;
   --danger-border: #fecaca;

   /* Рамка фокусу. У світлій темі значення ті самі, що були в site.css. */
   --focus-ring-inner: #ffffff;
   --focus-ring-outer: #258cfb;

   /* Тінь навколо сфокусованого поля вводу. Токен, а не літерал:
       інакше в темних правилах лишався б єдиний захардкоджений колір. */
   --focus-shadow: rgba(13, 110, 253, .25);

   /* Декоративне світіння ореолу на сторінці входу. Значення в гілках
       РІЗНІ (.05 проти .1), тому виняток зі Scope на світле правило
       не поширюється — воно лишається як є. */
   --accent-glow: rgba(13, 110, 253, .05);
}

html.dark-mode,
body.dark-mode {
   /* Темно-синя, варіант B. Обрано Власником за рендером 2026-08-21.
       Контраст тексту до тла 12.92 замість колишніх 17.77: поріг AA 4.5
       з великим запасом, але без блиску в темряві. */
   --surface-bg: #161d2b;
   --surface: #1f2937;
   --surface-raised: #273244;
   --surface-text: #dbe2ea;
   --surface-muted: #98a4b3;
   --surface-border: #2f3b4d;
   --surface-shadow: rgba(0, 0, 0, .45);

   --accent: #0d6efd;
   --accent-on: #ffffff;
   --accent-text: #4d9bff;
   --success-text: #34d399;
   --success-bg: rgba(34, 197, 94, .2);
   --danger-text: #fca5a5;
   --danger-bg: rgba(239, 68, 68, .2);
   --danger-border: rgba(239, 68, 68, .35);

   --focus-ring-inner: var(--surface);
   --focus-ring-outer: var(--accent-text);
   --focus-shadow: rgba(77, 155, 255, .28);
   --accent-glow: rgba(13, 110, 253, .1);

   /* Bootstrap 5.3 малює межі й другорядні поверхні власними змінними.
       Прив'язка з UI-002 переїхала сюди БЕЗ ЗМІНИ СКЛАДУ.
       Її не можна просто прибрати: Index.cshtml не має власних --bs-*,
       але читабельність .input-group-text (:684), .border-top (:711),
       .bg-light border (:946) і .form-control border-0 (:965) тримається
       саме на цих шести рядках. Приберемо — Index регресує рівно туди,
       звідки його витягнув UI-002. */
   --bs-border-color: var(--surface-border);
   --bs-border-color-translucent: var(--surface-border);
   --bs-tertiary-bg: var(--surface-raised);
   --bs-secondary-bg: var(--surface-raised);
   --bs-tertiary-color: var(--surface-muted);
   --bs-secondary-color: var(--surface-muted);
}

/* Bootstrap-івський .text-dark прибитий до світлої теми і застосований прямо
   до елемента, тому б'є успадкований колір із body.dark-mode. У розмітці він
   стоїть у півтора десятка місць — від заголовка сторінки до підписів у
   випадних списках. Раніше це лікували локально в Index і Login, а спільний
   навбар лишався без лікування: пункти меню були нечитабельні на всіх
   сторінках, крім списку товарів. */
html.dark-mode .text-dark,
body.dark-mode .text-dark {
   color: var(--surface-text) !important;
}

/* Активний пункт навбару несе .text-dark і .nav-status-btn.active на одному
   елементі. Правило вище має вищу специфічність (0,2,1 проти 0,2,0) і
   перебило б колір напису на акцентній заливці: 3.45 замість 4.50.
   Це повертає його назад — (0,3,1) виграє в обох. */
html.dark-mode .nav-status-btn.active,
body.dark-mode .nav-status-btn.active {
   color: var(--accent-on) !important;
}

/* Scoped-стилі з _Layout.cshtml.css лишились із шаблону проєкту й не мають
   темного варіанту. Фаза 0 показала, що з них реально малюються тільки межі:
   .border-bottom на <nav> і .border-top на <footer>, обидві #e5e5e5.
   Специфічність тут (0,2,1) вища за scoped-селектор (0,2,0), тому перекриття
   спрацьовує без !important. */
html.dark-mode .border-top,
body.dark-mode .border-top,
html.dark-mode .border-bottom,
body.dark-mode .border-bottom {
   border-color: var(--surface-border);
}

/* Outline-кнопки. Bootstrap збирає їх із власних --bs-btn-*, куди зашиті
   #0d6efd і #dc3545 — ті самі суцільні заливкові тони, що не читаються як
   ТЕКСТ на темній поверхні: 3.26 і 3.24 при порозі 4.5. Це та сама хвороба,
   що в .text-primary, і лікується так само — підміною джерела, а не кольору
   на кожній кнопці. Зразок прив'язки --bs-* узято з UI-002.

   Стани наведення й натискання не чіпаємо: там білий напис на суцільній
   заливці, 4.50 і 4.53 — поріг проходять і несуть акцентну ідентичність.
   Вимкнений стан прив'язуємо разом із звичайним, інакше вимкнена кнопка
   лишалась би темнішою за ввімкнену.

   ⚠️ Це діє на ВСІХ сторінках адмінки, включно з «Вихід» у навбарі. */
html.dark-mode .btn-outline-primary,
body.dark-mode .btn-outline-primary {
   --bs-btn-color: var(--accent-text);
   --bs-btn-border-color: var(--accent-text);
   --bs-btn-disabled-color: var(--accent-text);
   --bs-btn-disabled-border-color: var(--accent-text);
}

html.dark-mode .btn-outline-danger,
body.dark-mode .btn-outline-danger {
   --bs-btn-color: var(--danger-text);
   --bs-btn-border-color: var(--danger-text);
   --bs-btn-disabled-color: var(--danger-text);
   --bs-btn-disabled-border-color: var(--danger-text);
}

/* .input-group-text бере колір із --bs-body-color — змінної, якої палітра
   НЕ прив'язує, тож у темній гілці там лишається бутстрапівський #212529.
   У каталозі це лікували локальним правилом .price-range-sep, тому роздільник
   «Від/До» читається, а «%» і «₴» у модалці масової знижки — ні (1.05,
   напис невидимий). Значення те саме, що вже обчислюється в каталозі,
   тож вигляд роздільника не змінюється. */
html.dark-mode .input-group-text,
body.dark-mode .input-group-text {
   color: var(--surface-muted);
}

/* --- Р-13.1, крок 1: острів .list-group ---
   .modal-content палітра прив'язала ще в UI-007 і вона справді темна
   (#1f2937). Але всередині неї .list-group малює власне тло з
   --bs-list-group-bg, куди Bootstrap зашив літерал #fff, а колір — #212529.
   Виходив білий острів усередині темної модалки: 88 зі 102 провалів
   темного каталогу жили саме в ньому.

   ⚠️ Порядок має значення. Правило .text-danger нижче СВІТЛІШАЄ напис;
   на білому острові це погіршило б його з 4.53 до 1.90 (заміряно).
   Тому острів прив'язується ПЕРШИМ, і обидві зміни живуть в одному коміті:
   поодинці друга з них — регресія. */
html.dark-mode .list-group,
body.dark-mode .list-group {
   --bs-list-group-bg: var(--surface);
   --bs-list-group-color: var(--surface-text);
   --bs-list-group-border-color: var(--surface-border);
   --bs-list-group-action-color: var(--surface-text);
}

/* --- Р-13.1, крок 2: .text-danger (Р-10) ---
   Утиліта прибита до світлої теми через !important, тому ані --bs-alert-color,
   ані успадкування від body до неї не доходять — той самий випадок, що
   .text-dark в UI-007 (A1.2) і .text-primary у Р-4.

   Перед коммітом перевірено 132 входження на п'яти сторінках × дві теми,
   з розгорнутими модалками, панелями й дропдаунами: жодного елемента,
   у якого це правило вкрало б власний колір (сигнатура інциденту A1.5).

   Лікує: заголовок алерту масової знижки 2.67 → 6.37, «залишок» на формі
   товару 2.85 → 6.80.

   Прив'язки до теми навмисно НЕМАЄ: --danger-text має власне значення
   в кожній гілці, тож одне правило працює в обох. У світлій воно закриває
   те, що обіцяв Р-12 і чого прив'язка алерту сама не дала — заголовок
   ніс .text-danger, а він б'є --bs-alert-color через !important:
   3.71 → 5.30, «залишок» 4.42 → 6.30, нових провалів 0. */
.text-danger {
   color: var(--danger-text) !important;
}

/* --- Р-13.2: .text-success дзеркалом ---
   Токен --success-text заведено в Р-5, але прив'язано тоді лише до бейджа
   [Авто]. Через це «Економія для покупця» в модалці каталогу й лічильник
   «Отримають знижку» лишались бутстрапівськими #198754 — 3.24 на поверхні.
   Недогляд Р-5, закривається наявним токеном. */
html.dark-mode .text-success,
body.dark-mode .text-success {
   color: var(--success-text) !important;
}

/* Алерти. Bootstrap 5.3 збирає їх із --bs-alert-color / -bg / -border-color,
   куди зашиті світлі «subtle»-відтінки: #f8d7da під червоним, #fcfcfd під
   світлим. У темній темі вони не адаптуються — виходить світлий острів на
   темній сторінці, той самий F-20, тільки в модалці й у смужках помилок.

   Це причина, а не наслідок: кнопка btn-outline-danger усередині алерту
   давала 1.42 не тому, що кнопка неправильна, а тому, що тло під нею світле.
   Виняток для кнопки лишив би рожеву пляму.

   У поданнях уживаються рівно три варіанти: alert-danger (7 місць),
   alert-light (1) і alert-success (1) — прив'язані всі три.
   --danger-* дає рівно ті числа, що вже лежали під іменем --promo-*;
   alert-light — це звичайна поверхня. */
/* --- danger: ОБИДВІ гілки (Р-12) ---
   Модалка масового призначення прийшла з PROMO-002 і на проді ще не була,
   тож 3.39 у світлій темі — це не давній хвіст, а дефект, який поїхав би
   на прод уперше. --danger-* мають значення в обох гілках, тому одне
   неспецифічне правило лікує обидві: #f8d7da → #fee2e2, 3.39 → 5.30.
   theme.css підключений після bootstrap.min.css, тому при рівній
   специфічності (0,1,0) виграє це правило. */
.alert-danger {
   --bs-alert-color: var(--danger-text);
   --bs-alert-bg: var(--danger-bg);
   --bs-alert-border-color: var(--danger-border);
   --bs-alert-link-color: var(--danger-text);
}

/* Кнопка всередині алерту — ТОЧКОВО, без глобальної прив'язки outline-кнопок
   у світлій гілці: там проблема локальна, а радіус був би завеликий. */
.alert-danger .btn-outline-danger {
   --bs-btn-color: var(--danger-text);
   --bs-btn-border-color: var(--danger-text);
   --bs-btn-disabled-color: var(--danger-text);
   --bs-btn-disabled-border-color: var(--danger-text);
}

/* --- success: лише темна гілка (Р-11) ---
   Світле значення --success-bg дорівнює бутстрапівському #d1e7dd, тому
   світла тема не змінюється; у темній rgba(34,197,94,.2) поверх --surface
   дає композит #20483f. Межу беремо з --success-text: окремого токена межі
   в палітрі немає, а вигадувати відтінок заборонено — цей самий прийом уже
   вжито в .badge-promo-auto. */
html.dark-mode .alert-success,
body.dark-mode .alert-success {
   --bs-alert-color: var(--success-text);
   --bs-alert-bg: var(--success-bg);
   --bs-alert-border-color: var(--success-text);
   --bs-alert-link-color: var(--success-text);
}

html.dark-mode .alert-light,
body.dark-mode .alert-light {
   --bs-alert-color: var(--surface-text);
   --bs-alert-bg: var(--surface-raised);
   --bs-alert-border-color: var(--surface-border);
   --bs-alert-link-color: var(--accent-text);
}

/* ─────────────────────────────────────────────────────────────────────────
   Промо-мітки та бейджі (PROMO-001)
   ───────────────────────────────────────────────────────────────────────── */
:root {
   --promo-bg: var(--danger-bg);
   --promo-text: var(--danger-text);
   --promo-border: var(--danger-border);
   --promo-pending-bg: #fef3c7;
   --promo-pending-text: #92400e;
   --promo-expired-bg: #f3f4f6;
   --promo-expired-text: #4b5563;
}

html.dark-mode,
body.dark-mode {
   --promo-bg: var(--danger-bg);
   --promo-text: var(--danger-text);
   --promo-border: var(--danger-border);
   --promo-pending-bg: rgba(245, 158, 11, 0.2);
   --promo-pending-text: #fcd34d;
   --promo-expired-bg: rgba(107, 114, 128, 0.2);
   --promo-expired-text: #9ca3af;
}

.badge-promo-active {
   background-color: var(--promo-bg);
   color: var(--promo-text);
   border: 1px solid var(--promo-border);
   font-weight: 700;
}

.badge-promo-pending {
   background-color: var(--promo-pending-bg);
   color: var(--promo-pending-text);
   font-weight: 600;
}

.badge-promo-expired {
   background-color: var(--promo-expired-bg);
   color: var(--promo-expired-text);
   font-weight: 500;
}