/* ═══════════════════════════════════════════════════════════════════════
   Anton 3.0 — система тем
   ═══════════════════════════════════════════════════════════════════════

   Як додати нову тему:
     1. Скопіюй блок ":root[data-theme=\"abstergo-forge\"] { ... }" нижче,
        онов data-theme на нову назву (kebab-case) і значення змінних.
     2. За бажанням додай пару рядків типографічних акцентів (шрифт лого,
        letter-spacing) — приклад одразу під тим самим блоком.
     3. Додай назву+підпис у THEME_LABELS (frontend/static/js/app.js) і в
        THEMES (backend/app/api/routes/settings.py) — це весь список місць,
        де ще треба згадати нову тему. Решта підхопиться сама через змінні.

   Повний контракт змінних (усе опційне — що не перевизначиш, візьметься
   з дефолтної/термінальної теми зверху):
     --bg, --bg-panel, --bg-hover, --bg-active     фони
     --border, --border-bright                     рамки (звичайна / hover-акцентна)
     --text, --text-dim, --text-mute                текст
     --accent, --accent-dim                         головний акцент
     --blue, --amber, --red, --purple               допоміжні кольори статусів
     --font-display                                 шрифт заголовків/лого
     --body-bg                                       фон <body> (може бути градієнт/картинка)
     --sidebar-bg                                     фон бічної панелі (за замовч. = --bg-panel)
     --radius, --radius-lg                           скруглення кутів
     --shadow-glow                                   світіння на рамках панелей
     --focus-glow                                    світіння при фокусі інпута
     --th-color                                       колір заголовків таблиць
     --btn-accent-text                                колір тексту акцентної кнопки
     --corner-emblem-left / -right / -opacity         кутові декоративні SVG
   ═══════════════════════════════════════════════════════════════════════ */

:root {
    /* Усі теми зараз темні — керує нативними попапами (select/datalist/
       скролбар), інакше браузер малює їх власною світлою темою поверх
       наших кольорів (низький контраст). */
    color-scheme: dark;

    /* 2026-07-28: глобальний редизайн — новий напрямок (не термінал),
       узгоджено з користувачем. Глибокий холодний наві замість чистого
       чорного, теплий бірюзовий акцент (не лайм — щоб не зливався з
       "--amber", яка лишається окремим семантичним кольором), справжня
       глибина (--shadow-glow тепер м'яка тінь, а не "0 0 0 transparent"). */
    --bg:        #0a0d12;
    --bg-panel:  #11151c;
    --bg-hover:  #171d26;
    --bg-active: #1d2530;
    --border:    #212832;
    --border-bright: #323d4a;

    --text:      #e9edf3;
    --text-dim:  #99a3b1;
    --text-mute: #5c6572;

    --accent:    #22d3c8;   /* бірюзовий — головний акцент нового напрямку */
    --accent-dim:#167f78;
    --accent-rgb: 34,211,200;   /* той самий колір у R,G,B — для rgba() у glow-ефектах */
    --blue:      #5b9dd9;
    --amber:     #e8a33d;
    --red:       #e0645a;
    --purple:    #9d7bd8;

    /* Manrope — UI-хром (заголовки, кнопки, нав, підписи); JetBrains Mono
       лишається, але тепер ЛИШЕ для даних (таблиці проксі/акаунтів, поля
       пошуку/редагування клітинок) — де вирівнювання символів реально
       важливе, а не просто "ідентичність термінала". */
    --font-sans: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', Consolas, monospace;
    --font-display: var(--font-sans);

    --sidebar-width: 208px;   /* структурна константа, не частина теми */
    /* 2026-07-28: структурний кіберпанк-хром (не тема-скін, а форма) —
       зрізані кути замість заокруглень у навігації/кнопках/панелях-дашборда.
       ДАНІ (.data-table) навмисно лишаються прямокутними без жодних ефектів —
       ефекти тільки в хромі. --cut = великий зріз (панелі), --cut-sm = малий
       (кнопки/пункти нав). Узгоджено з користувачем після демо-макета. */
    --cut: 14px;
    --cut-sm: 9px;
    --body-bg: radial-gradient(1100px 720px at 18% -8%, rgba(34,211,200,0.07), transparent 60%), var(--bg);
    --sidebar-bg: linear-gradient(180deg, rgba(255,255,255,0.025), transparent 240px), var(--bg-panel);
    --radius: 8px;
    --radius-lg: 14px;
    --shadow-glow: 0 1px 2px rgba(0,0,0,0.28), 0 14px 32px -14px rgba(0,0,0,0.5);
    --focus-glow: 0 0 0 3px rgba(34,211,200,0.28);
    --th-color: var(--text-dim);
    --btn-accent-text: #04211d;

    /* 2026-07-29: амбієнтна маска-емблема лишається тільки СПРАВА (зліва
       прибрали — сайдбар вже отримав власні ambient-ефекти нижче, дублювати
       не треба). Флікер раз на кілька секунд, scoped на [data-theme="terminal"]
       — Abstergo Forge/Neon Ghost лишаються статичними, для них свій
       "прикол" буде окремо. */
    --corner-emblem-right: url('/static/img/theme-default/mask-emblem.webp');
    --corner-emblem-opacity: 0.3;

    /* Другий, менший набір кутових деталей (верхні кути — нижні вже зайняті
       --corner-emblem-* вище) — за замовчуванням вимкнено (none/0), теми
       вмикають вибірково. Inline SVG у самому CSS (не файл) — маленькі, суто
       декоративні штрихи, не варті окремого асета. */
    --corner-emblem2-left: none;
    --corner-emblem2-right: none;
    --corner-emblem2-opacity: 0;
}

/* Флікер справа: більшість циклу спокійно, коротка "глюк"-мить раз на ~6с —
   не постійна анімація, а рідкісний акцент */
@keyframes emblem-flicker {
    0%, 88%, 100% { opacity: 0.22; }
    90%  { opacity: 0.5; }
    91%  { opacity: 0.16; }
    93%  { opacity: 0.6; }
    95%  { opacity: 0.24; }
}
:root[data-theme="terminal"] body::after { animation: emblem-flicker 6s linear infinite; }
@media (prefers-reduced-motion: reduce) {
    :root[data-theme="terminal"] body::after,
    :root[data-theme="terminal"] .sidebar::before,
    :root[data-theme="terminal"] .sidebar::after,
    :root[data-theme="terminal"] .sidebar-scan { animation: none; }
    :root[data-theme="terminal"] .sidebar-scan { opacity: 0; }
}

/* ── Тема: Abstergo Forge (антидетект/піратський стиль) ─────────────────── */
:root[data-theme="abstergo-forge"] {
    --bg:        #071a1c;
    --bg-panel:  #0d2226;
    --bg-hover:  #123035;
    --bg-active: #163a40;
    --border:    #6b5a26;
    --border-bright: #c9a227;

    --text:      #e8dcb8;
    --text-dim:  #a8b9ad;
    --text-mute: #5f7a72;

    --accent:    #c9a227;
    --accent-dim:#8a7220;
    --accent-rgb: 201,162,39;   /* була відсутня — глоу-ефекти (кнопки, активний пункт меню) досі
                                   тягнули бірюзовий --accent-rgb з дефолтної теми замість золотого */
    --blue:      #6fb8c9;
    --amber:     #d9b23a;
    --red:       #b3543f;
    --purple:    #8f7fc9;

    --font-display: Georgia, Cambria, 'Times New Roman', serif;
    /* main-bg-texture2.webp сам по собі вийшов надто пласким/каламутним
       (майже без видимої фактури), а оскільки був ВЕРХНІМ непрозорим шаром —
       ще й повністю ховав виньєт-градієнт під собою (звичайне накладання
       шарів фону: непрозорий верхній шар = нижній не видно взагалі). Разом
       це й давало ефект "суцільної бурої плями". Тепер: та сама якісна
       дерев'яна текстура, що на плитках (panel-texture.webp), а виньєтка —
       напівпрозорий шар ЗВЕРХУ (не суцільний колір), тому реально просвічує
       й затемняє тільки краї, лишаючи центр видимим. */
    --body-bg: radial-gradient(ellipse at top, rgba(13,43,43,0) 0%, rgba(3,8,8,.6) 78%),
               url('/static/img/theme-abstergo/panel-texture.webp') center/480px 480px repeat;
    --sidebar-bg: top/cover no-repeat url('/static/img/theme-abstergo/sidebar-bg2.webp'),
                  #0d2226;

    --shadow-glow: 0 0 0 1px rgba(201,162,39,0.12), 0 0 22px rgba(201,162,39,0.08);
    --focus-glow: 0 0 8px rgba(201,162,39,0.25);
    --th-color: var(--accent);
    --btn-accent-text: #071a1c;

    --corner-emblem-opacity: 0.35;
    --corner-emblem-left: url('/static/img/theme-abstergo/corner-compass.webp');
    --corner-emblem-right: url('/static/img/theme-abstergo/corner-skull.webp');

    /* Другий, менший набір — верхні кути. Раніше тут були прості inline SVG
       (ключ/шестерня) — тепер справжні згенеровані арти: штурвал і прапор. */
    --corner-emblem2-opacity: 0.3;
    --corner-emblem2-left: url('/static/img/theme-abstergo/corner-wheel.webp');
    --corner-emblem2-right: url('/static/img/theme-abstergo/corner-flag.webp');
}
/* Дрібні типографічні акценти теми — не все зручно виносити в змінні */
:root[data-theme="abstergo-forge"] .sidebar-logo,
:root[data-theme="abstergo-forge"] .login-logo,
:root[data-theme="abstergo-forge"] .page-title {
    letter-spacing: 1px;
}
:root[data-theme="abstergo-forge"] .sidebar-logo { font-size: 17px; }
:root[data-theme="abstergo-forge"] .data-table th { letter-spacing: 1px; }

/* Аватарка як медальйон — тонкий золотий обідок (контраст із фоном) +
   справжня рамка-медальйон поверх (згенерований арт), замість колишньої
   суто-CSS зірочки в кутку. */
:root[data-theme="abstergo-forge"] .sidebar-user img {
    box-shadow: 0 0 0 2px var(--bg-panel), 0 0 0 3px rgba(201,162,39,.55);
    transition: box-shadow .2s;
}
:root[data-theme="abstergo-forge"] .sidebar-user:hover img {
    box-shadow: 0 0 0 2px var(--bg-panel), 0 0 0 3px rgba(201,162,39,.9);
}
:root[data-theme="abstergo-forge"] .avatar-frame::before {
    content: '';
    position: absolute;
    left: 50%; top: 50%;
    width: 46px; height: 69px;
    transform: translate(-50%, -50%);
    background: center/contain no-repeat url('/static/img/theme-abstergo/profile-frame.webp');
    pointer-events: none;
}

/* Профіль (аватар+ім'я) — власна текстурна панель + мотузка замість плоскої
   лінії-роздільника зверху. */
:root[data-theme="abstergo-forge"] .sidebar-user {
    position: relative;
    background: center/cover no-repeat url('/static/img/theme-abstergo/profile-bg2.webp');
    border-top: none;
}
:root[data-theme="abstergo-forge"] .sidebar-user::after {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0; height: 5px;
    background: center/cover no-repeat url('/static/img/theme-abstergo/divider-rope.webp');
}

/* Кнопки — справжня дерев'яна табличка з мотузкою й заклепками по кутах
   (не CSS-імітація, а 9-slice border-image з одного btn-frame.webp: кути
   лишаються чіткими, край/середина розтягуються під будь-яку ширину
   кнопки). Зрізаний кут (--cut-sm) прибираємо: він відрізав би один із
   чотирьох намальованих заклепаних кутів.
   ВАЖЛИВО: раніше border-image-slice мав "fill" — середину рамки МАЛЮВАЛА
   сама fill-текстура (дерево/прожилки), і світлий текст на ній губився,
   особливо на hover (brightness піднімав яскравість fill ще ближче до
   кольору тексту — саме це показав скрін "тексту майже не видно"). Тепер
   fill прибрано: рамку малює тільки border (кути/краї), а інтер'єр — власний
   керований шар: та сама дерев'яна текстура, але приглушена напівпрозорою
   темною заливкою зверху — контраст тексту гарантований, а не залежить від
   сирого фото. */
:root[data-theme="abstergo-forge"] .btn {
    position: relative;
    clip-path: none;
    border-style: solid;
    border-width: 10px;
    border-image-source: url('/static/img/theme-abstergo/btn-frame.webp');
    border-image-slice: 10%;
    border-image-repeat: round;
    background:
        linear-gradient(rgba(7,20,22,.72), rgba(7,20,22,.72)),
        center/170px 170px repeat url('/static/img/theme-abstergo/panel-texture.webp');
    text-shadow: 0 1px 2px rgba(0,0,0,.7);
}
:root[data-theme="abstergo-forge"] .btn:hover { filter: brightness(1.25); }
:root[data-theme="abstergo-forge"] .btn:active { filter: brightness(0.9); }

/* Акцентна кнопка (гол. дія: "Створити" тощо) — та сама рамка й дерево, але
   тепліша золотиста заливка замість темно-бірюзової: без цього override
   тематизований .btn (специфічніший за базовий .btn-accent) перекривав
   золотий фон акцентної кнопки, і вона губилась серед звичайних. */
:root[data-theme="abstergo-forge"] .btn.btn-accent {
    background:
        linear-gradient(rgba(138,106,10,.6), rgba(138,106,10,.6)),
        center/170px 170px repeat url('/static/img/theme-abstergo/panel-texture.webp');
}

/* Пункти лівого меню — та сама рамка, тонша (список компактний), той самий
   принцип гарантованого контрасту тексту замість "сирого" fill. */
:root[data-theme="abstergo-forge"] .nav-item {
    clip-path: none;
    border-style: solid;
    border-width: 7px;
    border-image-source: url('/static/img/theme-abstergo/btn-frame.webp');
    border-image-slice: 10%;
    border-image-repeat: round;
    background:
        linear-gradient(rgba(7,20,22,.75), rgba(7,20,22,.75)),
        center/150px 150px repeat url('/static/img/theme-abstergo/panel-texture.webp');
    text-shadow: 0 1px 2px rgba(0,0,0,.7);
}
:root[data-theme="abstergo-forge"] .nav-item:hover { filter: brightness(1.25); }
:root[data-theme="abstergo-forge"] .nav-item.active { filter: brightness(1.4) saturate(1.15); }

/* Статус-бейджі — тонша металева рамка-бирка, теж БЕЗ fill: латунна
   fill-текстура badge-frame.webp — тепла/світла, і золотий/зелений текст
   (--accent) на ній практично зникав (золото на золоті). Інтер'єр — плоский
   темний колір панелі; семантика лишається на кольорі ТЕКСТУ (border-image
   перекриває border-color, інакше загубили б розрізнення
   "активний/вимкнений/помилка"). */
:root[data-theme="abstergo-forge"] .badge {
    border-style: solid;
    border-width: 5px;
    border-image-source: url('/static/img/theme-abstergo/badge-frame.webp');
    border-image-slice: 8%;
    border-image-repeat: round;
    background: var(--bg-panel);
    border-radius: 0;
}

/* Поля вводу (текст/число, select, textarea) — та сама рамка-мотузка, БЕЗ
   fill у самій рамці (текст, який набирає юзер, — найгустіший і найважливіший
   для читабельності, тримати сирe фото-фактуру ПРЯМО В border-image під ним
   ризикованіше за все решта). Тонша за кнопки (6px, не 10px) — поле не має
   здаватись важчим за контент. Інтер'єр — той самий прийом, що на кнопках/
   пунктах меню (притемнена текстура окремим керованим шаром, не голий
   border-image fill): плоский суцільний колір тримали навмисно для гарантії
   контрасту, але виявилось що це просто виглядає бідно поряд з деревʼяними
   кнопками — тому теж дерево, тільки темніше, щоб текст не постраждав.
   .proxy-search textarea — окреме, конкретніше правило в базовому CSS
   (той самий блок пошуку, що на Проксі/Окто/Сторонні Окто), тому дублюємо
   селектор тут явно — без нього спеціфічніший базовий override переміг би. */
:root[data-theme="abstergo-forge"] input[type=text],
:root[data-theme="abstergo-forge"] input[type=number],
:root[data-theme="abstergo-forge"] input[type=search],
:root[data-theme="abstergo-forge"] select,
:root[data-theme="abstergo-forge"] textarea,
:root[data-theme="abstergo-forge"] .proxy-search textarea {
    border-style: solid;
    border-width: 6px;
    border-image-source: url('/static/img/theme-abstergo/btn-frame.webp');
    border-image-slice: 10%;
    border-image-repeat: round;
    background:
        linear-gradient(rgba(7,20,22,.78), rgba(7,20,22,.78)),
        center/150px 150px repeat url('/static/img/theme-abstergo/panel-texture.webp');
    border-radius: 0;
}
:root[data-theme="abstergo-forge"] input[type=text]:focus,
:root[data-theme="abstergo-forge"] input[type=number]:focus,
:root[data-theme="abstergo-forge"] input[type=search]:focus,
:root[data-theme="abstergo-forge"] select:focus,
:root[data-theme="abstergo-forge"] textarea:focus,
:root[data-theme="abstergo-forge"] .proxy-search textarea:focus {
    filter: brightness(1.15);
}

/* Картки/панелі — та сама темна деревина, що на кнопках, тільки як фонова
   текстура (не рамка). Навмисно НЕ чіпаємо .data-table — там щільний текст,
   ризик читабельності, а виграш мінімальний. */
:root[data-theme="abstergo-forge"] .tile,
:root[data-theme="abstergo-forge"] .dash-panel {
    background: center/450px 450px repeat url('/static/img/theme-abstergo/panel-texture.webp');
}

/* Картки новин — той самий патерн, що плитки, але мали свій окремий
   .news-card { background: var(--bg-panel) } і лишались плоскими, поки все
   довкола вже деревʼяне. Тут текстура ЗАТЕМНЕНА сильніше (.82, не голий
   patтерн, як у .tile) — статті новин це довгі абзаци суцільного тексту,
   найризикованіше місце для читабельності на сайті. */
:root[data-theme="abstergo-forge"] .news-card {
    background:
        linear-gradient(rgba(7,20,22,.82), rgba(7,20,22,.82)),
        center/420px 420px repeat url('/static/img/theme-abstergo/panel-texture.webp');
}

/* Заголовок сторінки — нічна гавань замість голого тексту. Раніше суцільна
   заливка .6 + низька висота майже повністю ховали сцену (на живому скріні
   лишався ледь помітний темний бар) — тепер вища зона (min-height) показує
   більше банера, а заливка — м'який градієнт (світліше зверху/по центру,
   темніше донизу), контраст для назви тримається, але кораблі й місяць
   реально видно. */
:root[data-theme="abstergo-forge"] .page-head {
    position: relative;
    min-height: 132px;
    padding: 24px 28px;
    background:
        linear-gradient(180deg, rgba(7,20,22,.25) 0%, rgba(7,20,22,.4) 55%, rgba(7,20,22,.72) 100%),
        center 40%/cover no-repeat url('/static/img/theme-abstergo/hero-banner.webp');
    border: 1px solid rgba(201,162,39,.3);
    box-shadow: 0 10px 26px -12px rgba(0,0,0,.6);
}

/* Іконки лівого меню — теми PNG замість емодзі/символів, але ТІЛЬКИ для
   пунктів, яким реально призначено арт (селектор списком, не голий
   ".nav-item .ico") — попередня версія ховала font-size на КОЖНОМУ пункту
   меню, тому дочірні (Акаунти, Vallester, Ролі тощо), яким арту не
   призначили, лишались з порожнім гурком замість емодзі. 22px→30px і
   68%→85% — на скріні з реальної сторінки навіть 22px губились у текстурі
   дерева сайдбару. */
:root[data-theme="abstergo-forge"] [data-key="proxy"] .ico,
:root[data-theme="abstergo-forge"] [data-key="farm"] .ico,
:root[data-theme="abstergo-forge"] [data-key="octo-tools"] .ico,
:root[data-theme="abstergo-forge"] [data-key="octo-external"] .ico,
:root[data-theme="abstergo-forge"] [data-key="stats"] .ico,
:root[data-theme="abstergo-forge"] [data-key="news-admin"] .ico,
:root[data-theme="abstergo-forge"] [data-key="admin"] .ico,
:root[data-theme="abstergo-forge"] [data-key="aod"] .ico {
    font-size: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px; height: 30px;
    background-color: rgba(7,26,28,.6);
    border-radius: 50%;
    background-size: 85%;
    background-repeat: no-repeat;
    background-position: center;
    vertical-align: -9px;
}
:root[data-theme="abstergo-forge"] [data-key="aod"] .ico svg { display: none; }
:root[data-theme="abstergo-forge"] [data-key="proxy"] .ico { background-image: url('/static/img/theme-abstergo/nav-proxy.webp'); }
:root[data-theme="abstergo-forge"] [data-key="farm"] .ico { background-image: url('/static/img/theme-abstergo/nav-farm.webp'); }
:root[data-theme="abstergo-forge"] [data-key="octo-tools"] .ico { background-image: url('/static/img/theme-abstergo/nav-octo.webp'); }
:root[data-theme="abstergo-forge"] [data-key="octo-external"] .ico { background-image: url('/static/img/theme-abstergo/nav-octo-external.webp'); }
:root[data-theme="abstergo-forge"] [data-key="stats"] .ico { background-image: url('/static/img/theme-abstergo/nav-analytics.webp'); }
:root[data-theme="abstergo-forge"] [data-key="news-admin"] .ico { background-image: url('/static/img/theme-abstergo/nav-news.webp'); }
:root[data-theme="abstergo-forge"] [data-key="admin"] .ico { background-image: url('/static/img/theme-abstergo/nav-admin.webp'); }
:root[data-theme="abstergo-forge"] [data-key="aod"] .ico { background-image: url('/static/img/theme-abstergo/nav-aod.webp'); }

/* Радіо — гравюра грамофона замість текстового "♪", коли нічого не грає. */
:root[data-theme="abstergo-forge"] .radio-bar-thumb.empty::after {
    content: '';
    width: 100%; height: 100%;
    background: center/contain no-repeat url('/static/img/theme-abstergo/nav-radio.webp');
}

/* Екран входу — власний нічний пейзаж гавані + два кутові акценти (якір,
   папуга), окремо від корабельних кутів основного застосунку. */
:root[data-theme="abstergo-forge"] .login-screen {
    background: center/cover no-repeat url('/static/img/theme-abstergo/login-bg.webp');
}
:root[data-theme="abstergo-forge"] .login-screen::before,
:root[data-theme="abstergo-forge"] .login-screen::after {
    content: '';
    position: fixed;
    bottom: 10px;
    width: 150px; height: 150px;
    background-size: contain;
    background-repeat: no-repeat;
    opacity: .55;
    pointer-events: none;
}
:root[data-theme="abstergo-forge"] .login-screen::before { left: 10px; background-image: url('/static/img/theme-abstergo/corner-anchor.webp'); }
:root[data-theme="abstergo-forge"] .login-screen::after  { right: 10px; background-image: url('/static/img/theme-abstergo/corner-parrot.webp'); }

/* ── Тема: Neon Ghost (неоновий кіберпанк) ──────────────────────────────── */
:root[data-theme="neon-ghost"] {
    --bg:        #0a0a12;
    --bg-panel:  #12121f;
    --bg-hover:  #191929;
    --bg-active: #1e1e32;
    --border:    #2a2a45;
    --border-bright: #b026ff;

    --text:      #e8e6f5;
    --text-dim:  #9a94b8;
    --text-mute: #5c5578;

    --accent:    #b026ff;   /* неоновий пурпур — головний акцент */
    --accent-dim:#7a1bb0;
    --accent-rgb: 176,38,255;   /* та сама була відсутня, що й у золотій темі (рядок вище) — той самий фікс */
    --blue:      #00e5ff;   /* неоновий блакитний */
    --amber:     #ffd60a;   /* неоновий жовтий */
    --red:       #ff2a4d;   /* неоновий червоний */
    --purple:    #c77dff;

    --font-display: Consolas, 'SF Mono', var(--font-mono);
    --body-bg: center/cover no-repeat url('/static/img/theme-neon-ghost/bg-texture.jpg'),
               radial-gradient(ellipse at top, #1a0d2e 0%, #05050a 70%);
    --sidebar-bg: top/cover no-repeat url('/static/img/theme-neon-ghost/sidebar-bg.jpg'),
                  #12121f;

    --shadow-glow: 0 0 0 1px rgba(176,38,255,0.15), 0 0 24px rgba(176,38,255,0.12);
    --focus-glow: 0 0 10px rgba(0,229,255,0.35);
    --th-color: var(--accent);
    --btn-accent-text: #ffffff;

    --corner-emblem-opacity: 0.35;
    --corner-emblem-left: url('/static/img/theme-neon-ghost/corner-left.webp');
    --corner-emblem-right: url('/static/img/theme-neon-ghost/corner-right.webp');
}
:root[data-theme="neon-ghost"] .sidebar-logo,
:root[data-theme="neon-ghost"] .login-logo,
:root[data-theme="neon-ghost"] .page-title {
    letter-spacing: 1px;
}
:root[data-theme="neon-ghost"] .data-table th { letter-spacing: 1px; }

/* ── Тема: Fluffy (чистий сучасний мінімалізм, Linear/Vercel-подібний) ────
   На відміну від Abstergo Forge/Neon Ghost ця тема ще й ЛОКАЛЬНО скасовує
   структурний зріз кутів (--cut/--cut-sm) — заокруглені кути замість
   зрізаних, під загальний мінімалістичний напрямок. */
:root[data-theme="fluffy"] {
    --bg:        #0c0c0e;
    --bg-panel:  #151518;
    --bg-hover:  #1c1c20;
    --bg-active: #232328;
    --border:    #232327;
    --border-bright: #35353c;

    --text:      #f0f0f2;
    --text-dim:  #9a9aa3;
    --text-mute: #58585f;

    --accent:    #7c6fff;   /* м'який індиго-фіолет — головний акцент */
    --accent-dim:#5347c9;
    --accent-rgb: 124,111,255;
    --blue:      #5b9dd9;
    --amber:     #e0a940;
    --red:       #e0645a;
    --purple:    #9d7bd8;

    --font-display: var(--font-sans);
    --body-bg: var(--bg);
    --sidebar-bg: var(--bg-panel);

    --shadow-glow: 0 1px 2px rgba(0,0,0,0.3), 0 14px 32px -14px rgba(0,0,0,0.55);
    --focus-glow: 0 0 0 3px rgba(124,111,255,0.28);
    --th-color: var(--text-mute);
    --btn-accent-text: #0c0c0e;

    --corner-emblem-left: none;
    --corner-emblem-right: none;
    --corner-emblem-opacity: 0;
}

/* Заокруглення замість зрізів — по одному override на кожен елемент, що
   в базовому хромі використовує clip-path: polygon(...--cut...). */
:root[data-theme="fluffy"] .login-box { clip-path: none; border-radius: var(--radius-lg); }
:root[data-theme="fluffy"] .btn-google,
:root[data-theme="fluffy"] .btn-ghost,
:root[data-theme="fluffy"] .btn,
:root[data-theme="fluffy"] .nav-item,
:root[data-theme="fluffy"] .tile,
:root[data-theme="fluffy"] .dash-detail-toggle {
    clip-path: none;
    border-radius: var(--radius);
}
:root[data-theme="fluffy"] .sidebar-logo .mark,
:root[data-theme="fluffy"] .login-logo .mark {
    clip-path: none;
    border-radius: 6px;
}
:root[data-theme="fluffy"] .dash-kpi,
:root[data-theme="fluffy"] .dash-panel {
    clip-path: none;
    filter: none;
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
}
:root[data-theme="fluffy"] .dash-kpi:hover {
    filter: none;
    border-color: var(--border-bright);
    box-shadow: 0 0 0 1px var(--border-bright), 0 0 16px rgba(var(--accent-rgb),.12);
}
:root[data-theme="fluffy"] .dash-kpi::after { content: none; }
:root[data-theme="fluffy"] .dash-dot { clip-path: none; border-radius: 50%; }
:root[data-theme="fluffy"] .dash-bar-track { clip-path: none; border-radius: 4px; }
:root[data-theme="fluffy"] .dash-rank-track { clip-path: none; border-radius: 3px; }

/* ── Тема "Світла" (2026-08-20, за численними проханнями команди) ────────
   Перша НЕтемна тема в застосунку. Три речі, які тут принципові:

   1. color-scheme: light — інакше браузер малює нативні випадайки, скролбари
      й датапікери темними (у :root стоїть dark), і вони стирчали б чорними
      плямами поверх світлої сторінки.
   2. --accent-dim у темних темах — це ТЕМНІШИЙ акцент, на якому світлий
      текст. Тут навпаки: світлий відтінок акценту, бо ним фарбуються фони
      активних станів (вкладки, виділені клітинки, свої повідомлення в AI),
      а текст на них — темний.
   3. Акцент трохи темніший за бірюзу темних тем: #22d3c8 на білому дає
      контраст ~1.9:1 і читається погано, #0e9d94 — ~3.7:1.
   Декоративні кутові емблеми вимкнені: вони малювались світлим по темному. */
:root[data-theme="light"] {
    color-scheme: light;

    --bg:        #f4f6f9;
    --bg-panel:  #ffffff;
    --bg-hover:  #eef1f5;
    --bg-active: #e3e9f0;
    --border:    #d8dee7;
    --border-bright: #b3bdca;

    --text:      #1a2029;
    --text-dim:  #4d5a68;
    --text-mute: #7c8694;

    --accent:    #0e9d94;
    --accent-dim:#c7ece9;
    --accent-rgb: 14,157,148;
    --blue:      #2f6fb5;
    --amber:     #a86f0c;
    --red:       #c33c31;
    --purple:    #6f4fbf;

    --body-bg: radial-gradient(1100px 720px at 18% -8%, rgba(14,157,148,0.08), transparent 60%), var(--bg);
    --sidebar-bg: linear-gradient(180deg, rgba(14,157,148,0.06), transparent 240px), var(--bg-panel);

    --shadow-glow: 0 1px 2px rgba(16,24,40,0.06), 0 12px 28px -16px rgba(16,24,40,0.28);
    --focus-glow: 0 0 0 3px rgba(14,157,148,0.25);
    --th-color: var(--text-dim);
    --btn-accent-text: #ffffff;

    --corner-emblem-right: none;
    --corner-emblem-opacity: 0;
    --corner-emblem2-left: none;
    --corner-emblem2-right: none;
    --corner-emblem2-opacity: 0;
}
/* Сайдбар у темних темах тримається на світлому напівпрозорому шарі поверх
   темного фону; на світлій темі такий шар невидимий, тому даємо йому рамку,
   щоб колонка меню не зливалась зі сторінкою. */
:root[data-theme="light"] .sidebar { border-right: 1px solid var(--border); }
/* Лог автоматизації та інші "консольні" блоки на темних темах читаються за
   рахунок темної підкладки — тут вона світла, тому текст робимо темнішим. */
:root[data-theme="light"] #fs-log,
:root[data-theme="light"] .agent-log { color: var(--text-dim); }

/* Кутові декоративні емблеми — керуються змінними вище, тому нова тема
   просто підставляє свої --corner-emblem-* й нічого більше не чіпає */
body::before, body::after {
    content: '';
    position: fixed;
    bottom: -24px;
    width: 260px;
    height: 260px;
    background-repeat: no-repeat;
    background-size: contain;
    opacity: var(--corner-emblem-opacity);
    pointer-events: none;
    z-index: -1;
}
/* Лівий емблем прив'язаний до краю ОСНОВНОЇ області (після сайдбару), а не
   до краю viewport — інакше він ховається під непрозорим фоном сайдбару */
body::before { left: calc(var(--sidebar-width) - 24px); background-image: var(--corner-emblem-left); }
body::after  { right: -24px; background-image: var(--corner-emblem-right); }

/* Другий, менший набір — ВЕРХНІ кути (нижні зайняті body::before/::after
   вище). body вже використав обидва свої псевдоелементи, тому цей набір
   сидить на :root (<html>) — той самий трюк, просто інший хост-елемент. */
:root::before, :root::after {
    content: '';
    position: fixed;
    top: -14px;
    width: 130px;
    height: 130px;
    background-repeat: no-repeat;
    background-size: contain;
    opacity: var(--corner-emblem2-opacity);
    pointer-events: none;
    z-index: -1;
}
:root::before { left: calc(var(--sidebar-width) - 10px); background-image: var(--corner-emblem2-left); }
:root::after  { right: -10px; background-image: var(--corner-emblem2-right); }

* { margin: 0; padding: 0; box-sizing: border-box; }

html, body {
    height: 100%;
    overflow: hidden;
}

body {
    background: var(--body-bg);
    color: var(--text);
    font-family: var(--font-sans);
    font-size: 13px;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
}

.hidden { display: none !important; }

/* ── Екрани входу ──────────────────────────────────────────────────────── */

.login-screen, .pending-screen {
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}

.login-box {
    text-align: center;
    padding: 40px;
    border: none;
    border-radius: 0;
    clip-path: polygon(0 0, calc(100% - 22px) 0, 100% 22px, 100% 100%, 22px 100%, 0 calc(100% - 22px));
    background: var(--bg-panel);
    min-width: 320px;
    position: relative;
    filter:
        drop-shadow(1px 0 0 var(--border)) drop-shadow(-1px 0 0 var(--border))
        drop-shadow(0 1px 0 var(--border)) drop-shadow(0 -1px 0 var(--border))
        drop-shadow(0 16px 30px rgba(0,0,0,.4));
}
.login-box::before, .login-box::after {
    content: ''; position: absolute; width: 16px; height: 16px;
    border-color: var(--accent); opacity: .6; pointer-events: none;
}
.login-box::before { top: -1px; left: -1px; border-top: 2px solid; border-left: 2px solid; }
.login-box::after { bottom: -1px; right: -1px; border-bottom: 2px solid; border-right: 2px solid; }

.login-logo {
    font-size: 24px;
    font-weight: 800;
    letter-spacing: 0.2px;
    color: var(--accent);
    margin-bottom: 8px;
    font-family: var(--font-display);
}
.login-logo .v, .sidebar-logo .v {
    color: var(--text-mute);
    font-size: 0.6em;
}

.login-sub, .pending-msg {
    color: var(--text-dim);
    margin-bottom: 24px;
}
.pending-msg { line-height: 1.8; }

.pending-email {
    color: var(--accent);
    margin: 16px 0 24px;
    font-size: 12px;
}

.btn-google {
    display: inline-block;
    background: var(--accent);
    color: var(--btn-accent-text);
    padding: 10px 24px;
    border-radius: 0;
    clip-path: polygon(var(--cut-sm) 0, 100% 0, 100% calc(100% - var(--cut-sm)), calc(100% - var(--cut-sm)) 100%, 0 100%, 0 var(--cut-sm));
    text-decoration: none;
    font-weight: 600;
    font-family: var(--font-sans);
    transition: opacity 0.15s, box-shadow 0.15s;
}
.btn-google:hover { opacity: 0.92; box-shadow: 0 0 0 1px var(--accent), 0 0 22px rgba(var(--accent-rgb),.5); }

.btn-ghost {
    background: transparent;
    border: 1px solid var(--border-bright);
    color: var(--text-dim);
    padding: 8px 20px;
    border-radius: 0;
    clip-path: polygon(var(--cut-sm) 0, 100% 0, 100% calc(100% - var(--cut-sm)), calc(100% - var(--cut-sm)) 100%, 0 100%, 0 var(--cut-sm));
    cursor: pointer;
    font-family: var(--font-sans);
    font-weight: 500;
    font-size: 13px;
    transition: all 0.15s;
}
.btn-ghost:hover { border-color: var(--accent); color: var(--text); box-shadow: 0 0 16px rgba(var(--accent-rgb),.2); }

/* ── Каркас застосунку ─────────────────────────────────────────────────── */

.app { display: flex; height: 100vh; }

.sidebar {
    width: var(--sidebar-width);
    height: 100vh;
    flex-shrink: 0;
    background: var(--sidebar-bg);
    border-right: 1px solid var(--border);
    display: flex;
    flex-direction: column;
    padding: 16px 0;
    box-shadow: var(--shadow-glow);
    overflow-y: auto;
    position: relative;
}
/* Кутові HUD-дужки — тонкий структурний штрих присутності на рамці
   сайдбару, а не декор скрізь */
.sidebar::before, .sidebar::after {
    content: ''; position: absolute; width: 18px; height: 18px;
    border-color: var(--accent); opacity: .5; pointer-events: none;
}
.sidebar::before { top: 10px; right: -1px; border-top: 2px solid; border-right: 2px solid; }
.sidebar::after { bottom: 10px; right: -1px; border-bottom: 2px solid; border-right: 2px solid; }

/* Скан-промінь по правій рамці сайдбару — рідкісний акцент раз на ~8с,
   решту часу невидимий. Окремий елемент, бо ::before/::after сайдбару вже
   зайняті HUD-дужками вище. position:fixed (а не absolute) навмисно — сайдбар
   сам скролиться (overflow-y:auto), і якщо промінь був би absolute всередині
   нього, він рахувався б у скрол-контент сайдбару й під час руху "гортав"
   список навігації. fixed прибирає його з цього розрахунку повністю, а
   left:0 + ширина сайдбару все одно дають той самий візуальний результат,
   бо сайдбар завжди стоїть впритул до лівого краю вьюпорта. Анімації (тут і
   на дужках) scoped на [data-theme="terminal"], як і решта ambient-ефектів —
   узгоджено з користувачем після демо-макета (bf53941+). */
.sidebar-scan {
    position: fixed; left: 0; width: calc(var(--sidebar-width) + 1px); height: 120px; top: -120px;
    background: linear-gradient(180deg, transparent, rgba(var(--accent-rgb),.55) 55%, rgba(var(--accent-rgb),.9) 92%, transparent);
    opacity: 0;
    pointer-events: none;
    mask-image: linear-gradient(90deg, transparent calc(100% - 2px), #000 calc(100% - 2px));
    -webkit-mask-image: linear-gradient(90deg, transparent calc(100% - 2px), #000 calc(100% - 2px));
}
@keyframes bracketPulse {
    0%, 100% { opacity: .35; filter: drop-shadow(0 0 0 rgba(var(--accent-rgb),0)); }
    50%      { opacity: .95; filter: drop-shadow(0 0 5px rgba(var(--accent-rgb),.85)); }
}
@keyframes scanSweep {
    0%, 58%  { top: -120px; opacity: 0; }
    62%      { opacity: 1; }
    86%      { top: 100%; opacity: 1; }
    100%     { top: 100%; opacity: 0; }
}
:root[data-theme="terminal"] .sidebar::before,
:root[data-theme="terminal"] .sidebar::after {
    animation: bracketPulse 4.5s ease-in-out infinite;
}
:root[data-theme="terminal"] .sidebar::after { animation-delay: -2.25s; }
:root[data-theme="terminal"] .sidebar-scan {
    animation: scanSweep 8s cubic-bezier(.3,0,.7,1) infinite;
}

.sidebar-logo {
    padding: 0 16px 20px;
    font-size: 16px;
    font-weight: 800;
    letter-spacing: 0.2px;
    color: var(--accent);
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--font-display);
    cursor: pointer;
    transition: opacity .12s;
}
.sidebar-logo:hover { opacity: .8; }
.sidebar-logo span:not(.v) { color: var(--text); }
.sidebar-logo .mark, .login-logo .mark {
    width: 18px; height: 18px; flex-shrink: 0; display: inline-block;
    background: var(--accent);
    clip-path: polygon(30% 0, 100% 0, 100% 70%, 70% 100%, 0 100%, 0 30%);
}
.login-logo .mark { width: 20px; height: 20px; }

.nav { flex: 1; display: flex; flex-direction: column; gap: 2px; padding: 0 8px; }

.nav-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 10px 8px 8px;
    border-radius: 0;
    /* Зрізаний правий верхній кут замість заокруглення — структурний хром */
    clip-path: polygon(0 0, calc(100% - var(--cut-sm)) 0, 100% var(--cut-sm), 100% 100%, 0 100%);
    border-left: 2px solid transparent;
    color: var(--text-dim);
    cursor: pointer;
    transition: background .12s, color .12s, border-color .12s, box-shadow .12s;
    user-select: none;
    font-size: 14px;
    font-weight: 500;
    text-decoration: none;   /* пункти меню тепер справжні <a href="#..."> */
}
.nav-item:hover { background: var(--bg-hover); color: var(--text); }
.nav-item.active {
    background: var(--bg-active); color: var(--accent); border-left-color: var(--accent); font-weight: 600;
    box-shadow: -8px 0 18px -12px rgba(var(--accent-rgb),.7);
}
.nav-item .ico { width: 16px; text-align: center; opacity: 0.9; }

.nav-group { display: flex; flex-direction: column; }
.nav-parent { justify-content: space-between; }
.nav-caret { margin-left: auto; font-size: 10px; color: var(--text-mute); }
.nav-children {
    display: flex;
    flex-direction: column;
    gap: 1px;
    padding-left: 16px;
    margin-top: 1px;
}
.nav-children.hidden { display: none; }
.nav-child { font-size: 13px; }

.sidebar-user {
    margin: 0 8px;
    padding: 10px;
    border-top: 1px solid var(--border);
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 12px;
}
.sidebar-user img { width: 24px; height: 24px; border-radius: 50%; display: block; }
.sidebar-user .u-info { flex: 1; min-width: 0; }
.sidebar-user .u-name { color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sidebar-user .u-role { color: var(--text-mute); font-size: 11px; }
/* Обгортка навколо аватарки/іконки — сама по собі нічого не малює, просто
   дає темам якір (position:relative) щоб причепити рамку/значок поверх
   фото, не чіпаючи саму <img>. */
.avatar-frame { position: relative; display: inline-flex; flex-shrink: 0; }

.sidebar-settings { margin: 0 8px; padding: 0 0 4px; }
.nav-logout:hover { background: rgba(224,100,90,0.12); color: var(--red); }

.main { flex: 1; overflow: auto; padding: 28px 32px 80px; }

/* ── Заголовок сторінки ────────────────────────────────────────────────── */

.page-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 20px;
}
.page-title { font-size: 20px; font-weight: 700; letter-spacing: -0.2px; color: var(--text); font-family: var(--font-display); }
.page-title .prompt { color: var(--accent); margin-right: 8px; font-weight: 800; }

/* ── Фарм: селекти/чекбокси в клітинках, попап аутентифікатора ─────────── */

.farm-table tr { cursor: pointer; }
.farm-table td, .farm-table th {
    padding: 2px 8px;
    font-size: 12px;
    line-height: 1.5;
}

.cell-select { padding: 4px 8px !important; }
.cell-select select {
    background: transparent;
    border: none;
    color: var(--text);
    font-family: var(--font-mono);
    font-size: 12px;
    width: 100%;
    cursor: pointer;
}
.cell-select select:focus { outline: none; }
.cell-select select option {
    background: var(--bg-panel);
    color: var(--text);
}

.cell-checkbox { text-align: center; }
.cell-checkbox input { width: auto; cursor: pointer; }

.farm-auth-popup {
    position: fixed;
    top: 90px;
    right: 24px;
    background: var(--bg-panel);
    border: 1px solid var(--accent);
    border-radius: var(--radius-lg);
    padding: 16px 20px;
    z-index: 1000;
    min-width: 200px;
    text-align: center;
    box-shadow: 0 4px 20px rgba(0,0,0,0.4), var(--shadow-glow);
}

/* ── Фарм: плаваюча панель AI-чату (вбудований у Таблицю, не окрема
   сторінка) — знизу-справа, лишається відкритою поки фармер працює. ──── */
.farm-ai-panel {
    position: fixed;
    bottom: 20px;
    right: 20px;
    width: 380px;
    height: 520px;
    max-height: calc(100vh - 40px);
    background: var(--bg-panel);
    border: 1px solid var(--accent);
    border-radius: var(--radius-lg);
    z-index: 1000;
    display: flex;
    flex-direction: column;
    box-shadow: 0 4px 24px rgba(0,0,0,0.45), var(--shadow-glow);
}
.farm-ai-header {
    display: flex; align-items: center; gap: 8px;
    padding: 10px 14px; border-bottom: 1px solid var(--border);
    font-weight: 600; font-size: 13px; flex-shrink: 0;
}
.farm-ai-header .spacer { flex: 1; }
.farm-ai-header button { background: none; border: none; color: var(--text-mute); cursor: pointer; font-size: 15px; padding: 2px 4px; }
.farm-ai-header button:hover { color: var(--text); }
.farm-ai-messages { flex: 1; overflow-y: auto; padding: 12px 14px; display: flex; flex-direction: column; gap: 10px; }
.farm-ai-msg { max-width: 88%; padding: 8px 11px; border-radius: 10px; font-size: 13px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; }
.farm-ai-msg.user { align-self: flex-end; background: var(--accent-dim); color: var(--text); }
.farm-ai-msg.assistant { align-self: flex-start; background: var(--bg-active); border: 1px solid var(--border); }
.farm-ai-msg.error { align-self: flex-start; background: none; border: 1px solid var(--red); color: var(--red); }
.farm-ai-quick { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 14px 10px; flex-shrink: 0; }
.farm-ai-quick button { font-size: 11px; padding: 4px 9px; }
.farm-ai-input-row { display: flex; gap: 8px; padding: 10px 14px; border-top: 1px solid var(--border); flex-shrink: 0; }
.farm-ai-input-row input { flex: 1; }

/* Вкладки панелі: Чат / Апеляція */
.farm-ai-tabs { display: flex; gap: 4px; padding: 8px 14px 0; flex-shrink: 0; }
.farm-ai-tabs button {
    flex: 1; background: none; border: 1px solid var(--border); border-radius: var(--radius);
    color: var(--text-mute); cursor: pointer; font-size: 12px; padding: 5px 8px;
    font-family: inherit; transition: color .15s, border-color .15s, background .15s;
}
.farm-ai-tabs button:hover { color: var(--text); }
.farm-ai-tabs button.active { color: var(--accent); border-color: var(--accent); background: var(--accent-dim); }

/* Генератор апеляцій */
.farm-ai-appeal { flex: 1; overflow-y: auto; padding: 12px 14px; }
.farm-ai-appeal .field { margin-bottom: 10px; }
.farm-ai-appeal label { font-size: 11px; }
.farm-ai-appeal input, .farm-ai-appeal select { font-size: 12px; width: 100%; }
.farm-ap-facts { font-size: 11px; color: var(--accent); margin: -4px 0 10px; line-height: 1.4; }
.farm-ap-facts.muted { color: var(--text-mute); }
.farm-ap-presets { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.farm-ap-presets button { font-size: 10px; padding: 3px 7px; }
.farm-ap-gen { width: 100%; margin-top: 2px; }
.farm-ap-result {
    margin-top: 12px; padding: 10px 11px; background: var(--bg-active);
    border: 1px solid var(--border); border-radius: 10px;
    font-size: 12px; line-height: 1.5; white-space: pre-wrap; word-break: break-word;
}
.farm-ap-result-actions { display: flex; gap: 6px; margin-top: 8px; }
.farm-ap-result-actions button { flex: 1; font-size: 11px; padding: 5px 8px; }
.farm-ai-config { padding: 10px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
.farm-auth-code {
    font-size: 28px;
    font-weight: 600;
    letter-spacing: 4px;
    color: var(--accent);
}
.farm-auth-meta { color: var(--text-mute); font-size: 11px; margin-top: 6px; }

/* ── Проксі: пошук і секції таблиць ───────────────────────────────────── */

.proxy-search { margin-bottom: 16px; }
.proxy-search textarea {
    background: var(--bg-active);
    border: 1px solid var(--border-bright);
    color: var(--text);
    padding: 8px 10px;
    border-radius: var(--radius);
    font-family: var(--font-mono);
    font-size: 13px;
    width: 100%;
    resize: vertical;
}
.proxy-search textarea:focus { outline: none; border-color: var(--accent); box-shadow: var(--focus-glow); }

.proxy-table-section { margin-bottom: 28px; }
.proxy-table-title { font-size: 14px; font-weight: 500; color: var(--text); margin-bottom: 4px; }
.proxy-table-meta { font-size: 11px; color: var(--text-mute); margin-bottom: 8px; }

/* ── Таблиці ───────────────────────────────────────────────────────────── */

.data-table {
    /* ДАНІ навмисно лишаються прямокутними без ефектів (жодних зрізаних
       кутів/glow) — контраст із хромом навколо, щоб не заважати швидко
       сканувати рядки очима. */
    width: 100%;
    border-collapse: collapse;
    border: 1px solid var(--border);
    border-radius: 0;
    overflow: hidden;
    box-shadow: var(--shadow-glow);
}
.data-table th {
    background: var(--bg-panel);
    text-align: left;
    padding: 9px 12px;
    font-weight: 600;
    color: var(--th-color);
    font-size: 11px;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    border-bottom: 1px solid var(--border);
}
/* Заголовок-кнопка (напр. ПІП: Gmail/YouTube; Фарм сервісів: Drive/Photo/...) —
   виглядає як звичайний th, але клікабельний (виділяє/знімає всю колонку).
   Непомітний за замовчуванням, підсвічується лише при наведенні. */
.data-table th .th-toggle-btn,
.th-toggle-btn {
    background: none;
    border: none;
    padding: 0;
    margin: 0;
    width: 100%;
    font: inherit;
    color: inherit;
    letter-spacing: inherit;
    text-transform: inherit;
    cursor: pointer;
    transition: color 0.15s;
}
.th-toggle-btn:hover { color: var(--accent); }
.data-table td {
    padding: 8px 12px;
    border-bottom: 1px solid var(--border);
    color: var(--text);
    /* Дані (проксі, ID, суми) лишаються моно — символи вирівнюються,
       легше сканувати око — на відміну від UI-хрому навколо, який тепер
       Manrope. */
    font-family: var(--font-mono);
    font-variant-numeric: tabular-nums;
}
.data-table tr:last-child td { border-bottom: none; }
.data-table tr:hover td { background: var(--bg-hover); }

/* ── Компактні таблиці для великих обсягів (Проксі/ProxyLine/Фарм) ───────
   table-layout:fixed прибирає найдорожчу частину рендеру великих таблиць —
   без нього браузер сканує ВСІ рядки щоб порахувати ширину колонок.
   Ширину таблиці JS виставляє ЯВНО (сума <col>) — навіть із fixed-layout
   Chromium при width:auto все одно частково зважає на вміст клітинок при
   розрахунку "натуральної" ширини, тому пікселі в <col> лишаються тільки
   орієнтовними без явної ширини таблиці.
   overflow:visible (замість успадкованого hidden від .data-table) — інакше
   САМА таблиця стає найближчим scroll-контейнером для position:sticky
   (будь-який overflow відмінний від visible кваліфікується), і заголовок
   "прилипає" до таблиці, яка рухається разом з контентом, а не до .main. */
.data-table.dense {
    table-layout: fixed;
    overflow: visible;
    border-radius: 0;
}
.data-table.dense td, .data-table.dense th {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Закріплений заголовок — лишається видимим при скролі вниз */
.data-table.dense thead th {
    position: sticky;
    top: 0;
    z-index: 2;
}

/* Ручка зміни ширини колонки — тонка смужка на правому краю заголовка */
.col-resize-handle {
    position: absolute;
    top: 0;
    right: 0;
    width: 6px;
    height: 100%;
    cursor: col-resize;
    user-select: none;
    z-index: 3;
}
.col-resize-handle:hover, .col-resize-handle.active { background: var(--accent-dim); }

/* Кнопка "Колонки" (показати/сховати) у Фармі */
.columns-picker {
    position: fixed;
    top: 90px;
    right: 24px;
    background: var(--bg-panel);
    border: 1px solid var(--accent);
    border-radius: var(--radius-lg);
    padding: 16px 20px;
    z-index: 1000;
    min-width: 220px;
    max-height: 70vh;
    overflow-y: auto;
    box-shadow: 0 4px 20px rgba(0,0,0,0.4), var(--shadow-glow);
}

.cell-editable {
    cursor: text;
    border-bottom: 1px dashed var(--accent-dim) !important;
}
.cell-editable:hover { background: var(--bg-active) !important; color: var(--accent); }
.cell-readonly { color: var(--text-dim); }

/* ── Фарм: виділення клітинок тяганням ЛКМ (як у старому Anton 2.0) +
   контекстне меню на ПКМ ──────────────────────────────────────────────── */
.farm-table { user-select: none; }  /* тягання виділяє КЛІТИНКИ, не текст */
/* Підсвітка виділених клітинок. Було прибито лише до .farm-table — у AOD
   Акаунти таблиця має клас .data-table, тому там виділення працювало б, але
   було б НЕВИДИМИМ. Тримаємо обидва селектори явно, а не голий
   td.cell-selected, щоб випадково не зачепити інші таблиці застосунку.
   Специфічність з #id перебиває .cell-editable:hover, який теж !important. */
.farm-table td.cell-selected,
#acc-table-wrap td.cell-selected { background: var(--accent-dim) !important; }
/* Рядок, для якого зараз відкрита бічна панель деталей (accOpenRowPanel). */
#acc-table-wrap tr.acc-row-active td { background: var(--accent-dim) !important; }
/* Лінії між рядками в Акаунтах — проста тонка суцільна, не пунктир-акцент
   (як в .cell-editable глобально). Специфічність з #id перебиває !important
   базового правила, іншим таблицям (Проксі, Фарм) не зашкодить. */
#acc-table-wrap .cell-editable { border-bottom: 1px solid var(--border) !important; }
/* Той самий фікс для Мультизапуску (Кампанії) — той самий пунктир-акцент
   інакше муляє око й тут. */
#multi-tbody .cell-editable { border-bottom: 1px solid var(--border) !important; }
/* Рядок, відмічений галочкою — легка блакитна підсвітка, як виділення
   рядків у Google Таблицях (навмисно фіксований синій, не тема-акцент —
   саме той відтінок мав на увазі власник, показавши приклад із Sheets).
   :has() реагує на .acc-row-check:checked сама, без жодного JS — оновлюється
   однаково від чекбокса, тягання галочок і ПКМ-меню. */
#acc-table-wrap tbody tr:has(.acc-row-check:checked) td { background: rgba(66,133,244,.14) !important; }
/* Кастомний випадаючий список статусу/типу замість нативного <select> —
   власник показав приклад із Google Таблиць, нативний OS-попап на його фоні
   виглядав чужим. Плашка — та сама "зрізаний кут" стилістика, що й .btn,
   сам список — той самий вигляд, що й .farm-ctx-menu (узгоджено з рештою
   застосунку). */
.cell-status-pill {
    display: flex; align-items: center; justify-content: space-between; gap: 6px;
    padding: 4px 8px; border-radius: 5px; cursor: pointer;
    border: 1px solid var(--border-bright); background: var(--bg-active);
    font-size: 12px; width: 100%; box-sizing: border-box;
}
.cell-status-pill:hover { border-color: var(--accent); }
.cell-status-pill-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cell-status-pill-caret { color: var(--text-mute); font-size: 9px; flex-shrink: 0; }
.acc-status-dropdown {
    position: fixed;
    background: var(--bg-panel);
    border: 1px solid var(--accent);
    border-radius: var(--radius-lg);
    padding: 4px;
    z-index: 1100;
    max-height: 60vh;
    overflow-y: auto;
    box-shadow: 0 4px 20px rgba(0,0,0,0.4), var(--shadow-glow);
}
.acc-status-opt {
    padding: 7px 12px; border-radius: 6px; cursor: pointer;
    font-size: 12.5px; color: var(--text); white-space: nowrap;
}
.acc-status-opt:hover { background: var(--bg-hover); color: var(--accent); }
.acc-status-opt.is-active { color: var(--accent); font-weight: 600; }
.acc-status-opt-new {
    margin-top: 3px; padding-top: 9px;
    border-top: 1px solid var(--border);
    color: var(--text-mute);
}
.farm-ctx-menu {
    position: fixed;
    background: var(--bg-panel);
    border: 1px solid var(--accent);
    border-radius: var(--radius-lg);
    padding: 6px;
    z-index: 1100;
    min-width: 230px;
    box-shadow: 0 4px 20px rgba(0,0,0,0.4), var(--shadow-glow);
}
.farm-ctx-menu button {
    display: block; width: 100%; text-align: left;
    background: none; border: none; color: var(--text);
    padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;
}
.farm-ctx-menu button:hover { background: var(--bg-hover); color: var(--accent); }
.farm-ctx-menu button:disabled { color: var(--text-mute); cursor: default; }
.farm-ctx-menu button:disabled:hover { background: none; color: var(--text-mute); }
/* Підпис-роздільник усередині меню (AOD Акаунти: група "надіслати в
   Кампанії") — відділяє дії над Octo від перекидання в дії Кампаній,
   щоб довге меню читалось як два блоки, а не суцільний список. */
.farm-ctx-sep {
    margin: 6px 4px 3px; padding-top: 7px;
    border-top: 1px solid var(--border);
    font-size: 10px; text-transform: uppercase; letter-spacing: .07em;
    font-weight: 600; color: var(--text-mute);
}

/* ── Проксі: Перевірка проксі — фіксовані приглушені червоний/зелений,
   НЕ прив'язані до --accent теми (у деяких темах акцент золотий/пурпурний/
   індиго — жовтогарячий/фіолетовий "успіх" читався б неоднозначно; тут
   потрібен саме впізнаваний, але не їдкий червоний/зелений). ─────────── */
.pc-row-ok   { background: rgba(76, 187, 122, .14); }
.pc-row-fail { background: rgba(214, 92, 92, .14); }
.pc-badge-ok   { color: rgb(94, 199, 138); }
.pc-badge-fail { color: rgb(224, 118, 118); }

/* ── Проксі: Масова зміна — нумерований gutter поруч з textarea (назви й
   проксі), щоб одразу видно чи вистачає проксі на всі акаунти. Ширини/
   line-height/padding-top у gutter і textarea МАЮТЬ збігатись — інакше
   номер поїде відносно свого рядка. align-items:stretch (дефолт flex) сам
   підтягує висоту gutter під textarea, без ручного розрахунку в JS. ───── */
.ot-linenum-wrap {
    display: flex;
    border: 1px solid var(--border-bright);
    border-radius: var(--radius);
    overflow: hidden;
    background: var(--bg-active);
}
.ot-linenum-wrap:focus-within { border-color: var(--accent); box-shadow: var(--focus-glow); }
.ot-linenum-gutter {
    flex: 0 0 auto;
    min-width: 30px;
    padding: 8px 6px 8px 0;
    text-align: right;
    font-family: var(--font-mono);
    font-size: 13px;
    line-height: 20px;
    color: var(--text-mute);
    background: var(--bg-panel);
    border-right: 1px solid var(--border);
    white-space: pre;
    overflow: hidden;
    user-select: none;
}
.ot-linenum-wrap textarea {
    flex: 1 1 auto;
    border: none;
    border-radius: 0;
    background: transparent;
    font-family: var(--font-mono);
    font-size: 13px;
    line-height: 20px;
    padding: 8px 10px;
    white-space: pre;
    overflow-x: auto;
    resize: vertical;
}
.ot-linenum-wrap textarea:focus { outline: none; box-shadow: none; }

.cell-input {
    background: var(--bg-active);
    border: 1px solid var(--accent);
    color: var(--text);
    font-family: var(--font-mono);
    font-size: 13px;
    padding: 4px 8px;
    border-radius: var(--radius);
    width: 100%;
}

/* ── Список (меню таблиць, ролі) ───────────────────────────────────────── */

.list-tiles { display: flex; flex-direction: column; gap: 8px; }
.tile {
    border: none;
    border-radius: 0;
    clip-path: polygon(0 0, calc(100% - var(--cut-sm)) 0, 100% var(--cut-sm), 100% 100%, 0 100%);
    padding: 14px 16px;
    background: var(--bg-panel);
    cursor: pointer;
    transition: filter 0.12s, background 0.12s;
    display: flex;
    align-items: center;
    justify-content: space-between;
    filter: drop-shadow(1px 0 0 var(--border)) drop-shadow(-1px 0 0 var(--border)) drop-shadow(0 1px 0 var(--border)) drop-shadow(0 -1px 0 var(--border)) drop-shadow(0 8px 16px rgba(0,0,0,.3));
}
.tile:hover { background: var(--bg-hover); filter: drop-shadow(1px 0 0 var(--accent-dim)) drop-shadow(-1px 0 0 var(--accent-dim)) drop-shadow(0 1px 0 var(--accent-dim)) drop-shadow(0 -1px 0 var(--accent-dim)) drop-shadow(0 8px 16px rgba(0,0,0,.3)); }
.tile-label { color: var(--text); font-weight: 600; }
.tile-meta { color: var(--text-mute); font-size: 11px; }

/* ── Кнопки та форми ───────────────────────────────────────────────────── */

.btn {
    background: var(--bg-active);
    border: 1px solid var(--border-bright);
    color: var(--text);
    padding: 7px 14px;
    border-radius: 0;
    clip-path: polygon(var(--cut-sm) 0, 100% 0, 100% calc(100% - var(--cut-sm)), calc(100% - var(--cut-sm)) 100%, 0 100%, 0 var(--cut-sm));
    cursor: pointer;
    font-family: var(--font-sans);
    font-weight: 500;
    font-size: 12.5px;
    transition: all 0.12s;
}
.btn:hover { border-color: var(--accent); box-shadow: 0 0 16px rgba(var(--accent-rgb),.22); }
.btn:active { transform: translateY(1px); }
.btn-accent { background: var(--accent); color: var(--btn-accent-text); border-color: var(--accent); font-weight: 700; }
.btn-accent:hover { opacity: 0.92; box-shadow: 0 0 0 1px var(--accent), 0 0 20px rgba(var(--accent-rgb),.5); }
.btn-danger { color: var(--red); border-color: var(--red); background: transparent; }
.btn-danger:hover { background: rgba(224,100,90,0.12); box-shadow: 0 0 16px rgba(224,100,90,.25); }
.btn-danger-solid {
    background: linear-gradient(135deg, #f0776a, var(--red));
    border-color: var(--red);
    color: #fff;
    font-weight: 700;
    font-size: 13px;
    padding: 10px 16px;
    box-shadow: 0 4px 14px rgba(224,100,90,.35);
}
.btn-danger-solid:hover { filter: brightness(1.08); box-shadow: 0 0 0 1px var(--red), 0 6px 22px rgba(224,100,90,.55); }
.btn-danger-solid:active { transform: translateY(1px); filter: brightness(0.96); }
.co-pill-btn { padding: 4px 12px; border-radius: 14px; font-size: 12px; }

/* ── Баєр: папки для групування таблиць ─────────────────────────────── */
.buyer-folder-chip {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 4px 12px; border-radius: 14px; font-size: 12px; cursor: pointer;
    border: 1px solid var(--border-bright); color: var(--text-dim);
    background: var(--bg-active); transition: .15s; white-space: nowrap;
}
.buyer-folder-chip:hover { color: var(--text); }
.buyer-folder-chip.active { border-color: var(--accent); color: var(--accent); background: rgba(34,211,200,0.12); }
.buyer-folder-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; display: inline-block; }
.buyer-folder-badge {
    display: inline-flex; align-items: center; gap: 4px; font-size: 11px;
    padding: 2px 8px; border-radius: 10px; cursor: pointer; white-space: nowrap;
    border: 1px dashed var(--border-bright); color: var(--text-mute); transition: .15s;
}
.buyer-folder-badge:hover { opacity: .8; }
.buyer-folder-menu-item {
    padding: 6px 10px; border-radius: 6px; cursor: pointer; font-size: 13px;
    display: flex; align-items: center; gap: 8px;
}
.buyer-folder-menu-item:hover { background: var(--bg-hover); }
.bdf-color-dot {
    width: 24px; height: 24px; border-radius: 50%; cursor: pointer;
    border: 3px solid transparent; transition: .15s; display: inline-block;
}
.bdf-color-dot.selected { border-color: var(--text); transform: scale(1.15); }
.bdf-color-dot:hover { transform: scale(1.1); }

/* ── Звіт за день (плаваючий особистий лічильник) ───────────────────── */
.report-modal-box {
    position: fixed; top: 40px; right: 40px; z-index: 2000;
    background: var(--bg-panel); border: 1px solid var(--border-bright);
    border-radius: var(--radius-lg); padding: 12px 16px; width: 360px;
    max-width: 95vw; max-height: 96vh; overflow-y: auto;
    box-shadow: 0 20px 60px rgba(0,0,0,0.4); font-family: var(--font-sans);
}
.report-modal-box { cursor: grab; user-select: none; }
.report-modal-box:active { cursor: grabbing; }
.report-modal-box input, .report-modal-box button { cursor: auto; user-select: auto; }
.report-drag-handle { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.report-row { background: var(--bg-active); border: 1px solid var(--border); border-radius: var(--radius); padding: 4px 10px; display: flex; align-items: center; gap: 8px; margin-bottom: 3px; }
.report-label { flex: 1; font-size: 12px; color: var(--text); }
.report-counter {
    width: 34px; text-align: center; font-size: 12px; font-weight: 700;
    color: var(--accent); padding: 2px 3px; background: rgba(34,211,200,0.14);
    border: none; border-radius: var(--radius); font-family: var(--font-sans);
    -moz-appearance: textfield;
}
.report-counter::-webkit-outer-spin-button, .report-counter::-webkit-inner-spin-button {
    -webkit-appearance: none; margin: 0;
}
.report-input-text { background: var(--bg); border: 1px solid var(--border-bright); border-radius: var(--radius); padding: 3px 7px; color: var(--text); font-size: 11px; width: 120px; outline: none; font-family: var(--font-sans); }
.report-btn { background: var(--bg-hover); border: 1px solid var(--border-bright); border-radius: var(--radius); color: var(--text); width: 20px; height: 20px; cursor: pointer; font-size: 12px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.report-btn:hover { border-color: var(--accent); color: var(--accent); }

input[type=text], select, textarea {
    background: var(--bg-active);
    border: 1px solid var(--border-bright);
    color: var(--text);
    padding: 8px 10px;
    border-radius: var(--radius);
    font-family: var(--font-sans);
    font-size: 13px;
    width: 100%;
}
input[type=text]:focus, select:focus, textarea:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: var(--focus-glow);
}

.field { margin-bottom: 14px; }
.field label { display: block; color: var(--text-dim); font-size: 12px; margin-bottom: 6px; }

.checkbox-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; }
.checkbox-row input { width: auto; }
.checkbox-row label { margin: 0; color: var(--text); }

/* ── Групи дозволів у редакторі ролей — заголовок = розділ меню де живе
   функція, чекбокси під ним = конкретні дозволи ─────────────────────── */
.perm-group { margin-bottom: 16px; }
.perm-group:last-child { margin-bottom: 0; }
.perm-group-title {
    font-size: 11px; text-transform: uppercase; letter-spacing: .08em; font-weight: 700;
    color: var(--accent); margin-bottom: 6px; padding-bottom: 4px; border-bottom: 1px solid var(--border);
}

/* ── Статуси/бейджі ────────────────────────────────────────────────────── */

.badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: var(--radius);
    font-size: 11px;
    border: 1px solid;
}
.badge-green { color: var(--accent); border-color: var(--accent-dim); }
.badge-dim   { color: var(--text-mute); border-color: var(--border); }

/* ── Фарм сервісів: перемикач "Рандом" + зелені чекбокси дій ────────────── */
/* Lime-акцент (#4ade80) — усталений в проекті колір "успіху/увімкнено"
   (той самий, що й на кнопці tt-btn-dl тощо); var(--green) НЕ підійшла б —
   вона визначена лише всередині .stats-scope, не глобально. */
.fs-toggle { display:inline-flex; align-items:center; gap:8px; cursor:pointer; user-select:none; }
/* .field label{display:block} (вище) специфічніший за .fs-toggle{display:
   inline-flex} (2 селектори проти 1) і перемагає, коли перемикач лежить
   усередині .field (Закриття акаунтів) — трек і текст ламались у
   вертикальний потік замість рядка, бо inline-елементи ігнорують width/
   height. Ця пара селекторів (2 класи+елемент) специфічніша за ту. */
.field label.fs-toggle { display:inline-flex; margin-bottom:0; }
.fs-toggle input { display:none; }
.fs-toggle-track { width:34px; height:19px; border-radius:10px; background:var(--bg-active); border:1px solid var(--border); position:relative; flex-shrink:0; transition:background .15s, border-color .15s; }
.fs-toggle-track::after { content:''; position:absolute; top:1px; left:1px; width:15px; height:15px; border-radius:50%; background:var(--text-mute); transition:transform .15s, background .15s; }
.fs-toggle input:checked + .fs-toggle-track { background:#4ade80; border-color:#4ade80; }
.fs-toggle input:checked + .fs-toggle-track::after { transform:translateX(15px); background:#0d1117; }
.fs-action-checkbox { width:16px; height:16px; cursor:pointer; accent-color:#4ade80; }
.fs-action-checkbox.fs-action-done { accent-color:var(--text-mute); opacity:.5; cursor:not-allowed; }

/* Міні-статистика — справа вгорі, поруч із заголовком сторінки
   (.page-head має justify-content:space-between). */
.fs-stats-bar { flex-wrap: wrap; gap: 8px; justify-content: flex-end; }

/* Панель налаштувань запуску Фарм сервісів — три ряди, щоб перемикачі не
   зливались в одну довгу стрічку й було видно, що до чого стосується. */
.fs-settings { display:flex; flex-direction:column; gap:8px; margin-bottom:12px;
    padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius);
    background:var(--bg-panel); }
.fs-settings-row { display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.fs-settings-label { font-size:11px; color:var(--text-mute); text-transform:uppercase;
    letter-spacing:.05em; min-width:112px; flex-shrink:0; }

/* Звіт "Фарм сервісів" — матриця: сервіси колонками, профілі рядками.
   Раніше все, що зробилось на профілі, було одним стовпчиком тексту в
   клітинці, і щоб порівняти два профілі між собою, треба було вичитувати
   обидва підряд. */
.fs-matrix { width: 100%; min-width: 620px; }
.fs-matrix th.fs-col {
    text-align: center; font-size: 10px; line-height: 1.25;
    white-space: normal; vertical-align: bottom; min-width: 92px;
}
.fs-col-ico { font-size: 15px; margin-bottom: 2px; }
.fs-matrix th.fs-col-prof { min-width: 170px; }
.fs-prof { word-break: break-word; font-size: 12px; }
.fs-prof-state { width: 28px; text-align: center; }
.fs-cell { text-align: center; font-size: 11px; line-height: 1.3; padding: 5px 6px; }
.fs-cell-ico { display: block; font-size: 12px; }
.fs-cell-txt { display: block; margin-top: 1px; }
.fs-cell-none { color: var(--border); }
.fs-cell-done .fs-cell-txt { color: var(--text); }
.fs-cell-partial .fs-cell-txt, .fs-cell-manual .fs-cell-txt { color: #fbbf24; }
.fs-cell-fail .fs-cell-txt { color: var(--red); }
.fs-cell-skipped .fs-cell-txt { color: var(--text-mute); }
/* Профіль, який упав ще до дій — причина окремим рядком під ним */
.fs-row-err td { font-size: 10px; color: var(--red); padding-top: 0; word-break: break-word; }
/* Підсумок — прямо під своєю ж колонкою, а не окремим блоком збоку */
.fs-matrix tfoot td { border-top: 1px solid var(--accent); background: var(--bg-panel); }
.fs-total-cell { vertical-align: top; }
.fs-total-main { font-size: 12px; font-weight: 600; }
.fs-total-note { font-size: 10px; color: var(--text-mute); margin-top: 2px; line-height: 1.35; }

/* Аналітика фарм → Тренд статусів (перенесено з десктопного Anton 2.0) */
.trend-legend { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 10px; font-size: 12px; }
.trend-legend-item { display: inline-flex; align-items: center; gap: 6px; }
.trend-legend-dot { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
.trend-legend-max { color: var(--text-mute); font-size: 11px; }
/* Зум збільшує ШИРИНУ svg — тому горизонтальний скрол саме тут */
.trend-scroll { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-panel); }
.trend-svg { display: block; }
.trend-plot { fill: var(--bg-active); }
.trend-grid { stroke: var(--border); stroke-width: 1; stroke-dasharray: 2 3; }
.trend-axis { fill: var(--text-mute); font-size: 10px; font-family: var(--font-mono); }
.trend-val { font-size: 10px; font-weight: 600; font-family: var(--font-mono); }
.trend-dot { stroke: var(--bg-panel); stroke-width: 1.5; }
.trend-today { stroke: var(--accent); stroke-width: 1; stroke-dasharray: 4 4; opacity: .6; }
.trend-today-lbl { fill: var(--accent); font-size: 10px; font-family: var(--font-mono); opacity: .8; }
.trend-foot { margin-top: 8px; font-size: 11px; color: var(--text-mute); }

/* Закріплені колонки. Клітинкам ОБОВʼЯЗКОВО потрібен непрозорий фон —
   інакше рядки, що проїжджають під ними, просвічують наскрізь. */
.data-table td.is-frozen, .data-table th.is-frozen {
    position: sticky; z-index: 3; background: var(--bg-panel);
}
/* Заголовок закріпленої колонки — це перетин двох sticky (зверху й зліва),
   тому z-index має бути вищим за звичайну шапку, інакше вона його перекриє. */
.data-table thead th.is-frozen { z-index: 5; }
.data-table td.is-frozen-last, .data-table th.is-frozen-last {
    box-shadow: 2px 0 0 var(--border), 6px 0 10px -6px rgba(0,0,0,.55);
}
/* Виділення клітинок має лишатись видимим і на закріпленій колонці */
.farm-table td.is-frozen.cell-selected { background: var(--accent-dim); }
.farm-freeze { display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--text-mute); }
.farm-freeze select { width:auto; padding:2px 6px; font-size:12px; }
/* AOD Акаунти: закріплення довільної колонки по ПКМ на заголовку */
.acc-th-pin { cursor: context-menu; }

/* Верифікатор витрат: плитки-лічильники (вони ж фільтр по статусу) і
   підсвітка рядків. Кольори — семантичні змінні, тому працюють і на
   світлій темі, а не лише на темних. */
.sv-config { padding:12px 14px; border:1px solid var(--border); border-radius:var(--radius);
    background:var(--bg-panel); margin-bottom:12px; }
.sv-config-note { margin-top:8px; font-size:11px; color:var(--text-mute); line-height:1.5; }
.sv-tiles { display:grid; gap:8px; margin-bottom:12px;
    grid-template-columns:repeat(auto-fit,minmax(120px,1fr)); }
.sv-tile { display:flex; flex-direction:column; gap:2px; padding:8px 10px; cursor:pointer;
    border:1px solid var(--border); border-radius:var(--radius); background:var(--bg-panel);
    font-family:inherit; text-align:left; transition:border-color .15s; }
.sv-tile:hover { border-color:var(--border-bright); }
.sv-tile.active { border-color:var(--accent); background:var(--accent-dim); }
.sv-tile-count { font-size:19px; font-weight:800; font-variant-numeric:tabular-nums; }
.sv-tile-label { font-size:10px; color:var(--text-mute); text-transform:uppercase; letter-spacing:.05em; }
.sv-green .sv-tile-count { color:var(--accent); }
.sv-red .sv-tile-count { color:var(--red); }
.sv-yellow .sv-tile-count, .sv-yellow_ads .sv-tile-count { color:var(--amber); }
.sv-grey .sv-tile-count { color:var(--text-mute); }
/* Ліва смуга кольором статусу — видно навіть коли таблицю прокрутили вбік */
.sv-table td:first-child { border-left:3px solid transparent; }
.sv-row-green td:first-child { border-left-color:var(--accent); }
.sv-row-red td:first-child { border-left-color:var(--red); }
.sv-row-yellow td:first-child, .sv-row-yellow_ads td:first-child { border-left-color:var(--amber); }
.sv-row-grey td:first-child { border-left-color:var(--text-mute); }
.sv-table .sv-num { font-family:var(--font-mono); font-size:11px; white-space:nowrap; }
.sv-table .sv-status { white-space:nowrap; font-size:11px; }
.sv-table .sv-detail { font-size:11px; color:var(--text-mute); }

/* Галочки в пошуку профілів Окто */
.ot-check { display:inline-flex; align-items:center; gap:6px; font-size:12px;
    color:var(--text-mute); cursor:pointer; user-select:none; }
.ot-check input { accent-color:var(--accent); cursor:pointer; }

/* Фільтри над таблицею фарму. Кілька значень в одному фільтрі = "або"
   (fr АБО ua), різні фільтри між собою = "і" (гео І статус). */
.farm-filters { display:flex; flex-direction:column; gap:6px; margin-bottom:10px;
    padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius); background:var(--bg-panel); }
.farm-filter-row { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.farm-search { flex:1; min-width:220px; max-width:520px; resize:vertical;
    font-family:var(--font-mono); font-size:12px; line-height:1.5; padding:5px 8px; }
.farm-filter-label { font-size:11px; color:var(--text-mute); text-transform:uppercase;
    letter-spacing:.05em; min-width:74px; flex-shrink:0; }
.farm-filters .chips { display:flex; flex-wrap:wrap; gap:6px; }
.farm-filters .chip { padding:3px 10px; font-size:12px; }
.chip-count { opacity:.6; font-size:10px; font-weight:600; }
.farm-filter-count { font-size:11px; color:var(--text-mute); }

/* ── Утиліти ───────────────────────────────────────────────────────────── */

.row { display: flex; gap: 8px; align-items: center; }
.spacer { flex: 1; }
.mt { margin-top: 16px; }
.mb { margin-bottom: 16px; }
.empty-state { color: var(--text-mute); text-align: center; padding: 40px; }
/* Тости складаються у стовпчик знизу справа. Позиціонує КОНТЕЙНЕР, а не
   кожен тост: раніше кожен був position:fixed з тими самими координатами,
   тому два повідомлення поспіль лягали одне на одного. */
#toast-stack {
    position: fixed; bottom: 20px; right: 20px; z-index: 1000;
    display: flex; flex-direction: column; gap: 8px; align-items: flex-end;
    pointer-events: none;   /* не перехоплюємо кліки по тому, що під ними */
}
.toast {
    background: var(--bg-active); border: 1px solid var(--accent);
    color: var(--text); padding: 12px 18px; border-radius: var(--radius);
    font-size: 12px; pointer-events: auto;
    animation: toastIn .22s cubic-bezier(.16, 1, .3, 1);
}
.toast.out { animation: toastOut .2s ease-in forwards; }
.toast.err { border-color: var(--red); color: var(--red); }

@keyframes toastIn {
    from { opacity: 0; transform: translateX(16px) scale(.97); }
    to   { opacity: 1; transform: none; }
}
@keyframes toastOut {
    to { opacity: 0; transform: translateX(16px); }
}

/* ── Обкладинка з попапом-збільшенням на наведення (модуль TikTok) ──────── */
.tt-cover-wrap { position: relative; display: inline-block; flex-shrink: 0; align-self: center; }
.tt-cover-thumb {
    display: block; width: 60px; height: 80px;
    object-fit: cover; border-radius: var(--radius);
}
.tt-cover-preview {
    /* Як на десктопі (HoverCover, KeepAspectRatioByExpanding) — фіксований
       помірний box 200x260 + cover, а не крайній 9:16/16:9: тоді кроп на
       типових фото майже непомітний, без чорних смуг contain-режиму. */
    display: none; position: absolute; top: 0; left: 68px;
    width: 200px; height: 260px; object-fit: cover;
    border-radius: var(--radius-lg); border: 2px solid var(--accent);
    box-shadow: 0 10px 30px rgba(0,0,0,0.6);
    z-index: 50; pointer-events: none;
}
.tt-cover-wrap:hover .tt-cover-preview { display: block; }

/* ── Обкладинка з попапом-збільшенням на наведення (модуль YouTube) ─────── */
.yt-cover-wrap { position: relative; display: inline-block; flex-shrink: 0; }
.yt-cover-thumb {
    display: block; width: 120px; height: 68px;
    object-fit: cover; border-radius: var(--radius);
}
.yt-cover-preview {
    /* Той самий помірний box 200x260 + cover, що й у TikTok-вкладці й на
       десктопі — узгоджено для обох модулів, крайні 9:16/16:9 крадуть
       забагато кадру в один бік. */
    display: none; position: absolute; top: 0; left: 128px;
    width: 200px; height: 260px; object-fit: cover;
    border-radius: var(--radius-lg); border: 2px solid var(--accent);
    box-shadow: 0 10px 30px rgba(0,0,0,0.6);
    z-index: 50; pointer-events: none;
}
.yt-cover-wrap:hover .yt-cover-preview { display: block; }

/* ── Рядок відео в списку TikTok — точна відповідність картці з десктопа
   (main.py, _add_video): кольори/розміри взяті буквально з тамтешніх
   inline QSS-стилів кожної кнопки. ────────────────────────────────────── */
.tt-row {
    display: flex; align-items: flex-start; gap: 10px; padding: 10px;
    background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1);
    border-radius: 10px; transition: background .15s, border-color .15s;
}
.tt-row:hover { background: rgba(255,255,255,0.08); border-color: rgba(99,102,241,0.5); }
.tt-num { width: 24px; flex-shrink: 0; text-align: center; align-self: center; color: #6b7280; font-size: 12px; font-weight: 700; }
.tt-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.tt-likes-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.tt-likes { color: #6b7280; font-size: 11px; }
.tt-btn-queue { height: 22px; font-size: 10px; font-weight: 600; padding: 0 8px; background: rgba(59,130,246,0.2); color: #93c5fd; border-color: rgba(59,130,246,0.4); }
.tt-btn-queue:hover:not(:disabled) { background: #2563eb; color: #fff; }
.tt-btn-hash { height: 20px; font-size: 10px; padding: 0 8px; background: rgba(167,139,250,0.15); color: #a78bfa; border-color: rgba(167,139,250,0.35); }
.tt-btn-hash:hover { background: rgba(167,139,250,0.3); color: #fff; }
.tt-field-label { font-size: 9px; letter-spacing: .5px; color: #4ade80; }
.tt-field-btn { text-align: left; font-size: 11px; font-weight: 600; height: 24px; padding: 0 8px; background: rgba(99,102,241,0.15); color: #e2e8f0; border-color: rgba(99,102,241,0.3); }
.tt-field-btn:hover:not(:disabled) { background: rgba(99,102,241,0.4); color: #fff; }
.tt-field-btn.tt-field-sm { height: 22px; font-size: 10px; font-weight: 400; }
.tt-field-btn:disabled { color: var(--text-mute); border-color: var(--border); background: var(--bg-active); }
.tt-actions { display: flex; flex-direction: column; gap: 3px; width: 88px; flex-shrink: 0; align-self: center; }
.tt-btn-open { height: 22px; font-size: 11.5px; font-weight: 600; padding: 0 6px; background: rgba(99,102,241,0.4); color: #c4b5fd; border: none; }
.tt-btn-open:hover { background: rgba(99,102,241,0.7); color: #fff; }
.tt-btn-copy { height: 22px; font-size: 11.5px; padding: 0 6px; background: rgba(255,255,255,0.08); color: #9ca3af; border: none; }
.tt-btn-copy:hover { background: rgba(255,255,255,0.15); color: #fff; }
.tt-btn-dl { height: 22px; font-size: 11.5px; font-weight: 600; padding: 0 6px; background: rgba(34,197,94,0.2); color: #4ade80; border: none; }
.tt-btn-dl:hover:not(:disabled) { background: rgba(34,197,94,0.4); color: #fff; }
.tt-btn-dl:disabled { background: var(--bg-active); color: var(--text-mute); }
.tt-btn-play { height: 22px; font-size: 11.5px; font-weight: 600; padding: 0 6px; background: rgba(251,191,36,0.2); color: #fbbf24; border: none; }
.tt-btn-play:hover { background: rgba(251,191,36,0.4); color: #fff; }

.yt-cover-dur {
    position: absolute; bottom: 4px; right: 4px;
    background: rgba(0,0,0,0.75); color: #fff;
    font-size: 10px; padding: 1px 5px; border-radius: 3px;
    pointer-events: none;
}

/* ── Модуль "Статистика" (звіти по прогріву, перенесено з WEBSITE) ──────── */
.stats-scope {
    --card: var(--bg-panel);
    --muted: var(--text-mute);
    --accent2: var(--purple);
    --green: var(--accent);
    --bg2: var(--bg-panel);
}
.filter-block { display:flex; flex-direction:column; gap:10px; background:var(--card); border:1px solid var(--border); border-radius:12px; padding:16px 20px; margin-bottom:20px; }
.filter-group { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.filter-label { font-size:13px; color:var(--muted); min-width:90px; }
.chips { display:flex; gap:6px; flex-wrap:wrap; }
.chip { padding:4px 14px; border-radius:20px; border:1px solid var(--border); background:transparent; color:var(--muted, var(--text-mute)); font-size:13px; font-weight:500; cursor:pointer; transition:all .15s; font-family:var(--font-sans); }
.chip:hover { border-color:var(--accent); color:var(--text); }
.chip.active { background:var(--accent); border-color:var(--accent); color:var(--btn-accent-text); font-weight:700; }

.date-input { background:var(--card); border:1px solid var(--border); border-radius:8px; color:var(--text); padding:4px 10px; font-size:13px; outline:none; cursor:pointer; font-family:var(--font-sans); }
.date-input:focus { border-color:var(--accent); }
.date-input::-webkit-calendar-picker-indicator { filter:invert(1); opacity:.6; cursor:pointer; }

.mini-card { background:var(--card); border:1px solid var(--border); border-radius:10px; padding:14px 20px; min-width:120px; text-align:center; }
.mini-card-val { font-size:28px; font-weight:800; color:var(--accent); font-variant-numeric:tabular-nums; }
.mini-card-label { font-size:12px; color:var(--muted); margin-top:4px; }

.section-card { background:var(--card); border:1px solid var(--border); border-radius:12px; padding:20px; overflow:auto; }
.section-title { font-size:16px; font-weight:700; margin-bottom:14px; color:var(--text); }

/* Вкладки аналітики. Раніше неактивна вкладка була просто приглушеним
   текстом: background:transparent, border:none — жодної ознаки, що це
   взагалі клікабельна вкладка. На темних текстурних темах (Abstergo) такий
   текст зливався з фоном, і люди скаржились, що вкладок не видно. Активна
   ж малювалась зашитим фіолетовим rgba(139,92,246,.25), який не має нічого
   спільного з акцентом теми (в Abstergo він золотий).
   Тепер це справжні вкладки з підкладкою й рамкою, а кольори — з теми. */
.stats-tab-btn {
    flex:1; min-width:100px; padding:10px 12px; font-size:13px; font-weight:600;
    cursor:pointer; font-family:var(--font-sans); border-radius:8px;
    background:var(--bg-panel); border:1px solid var(--border); color:var(--text-mute);
    transition:color .15s, border-color .15s, background .15s;
}
.stats-tab-btn:hover { color:var(--text); border-color:var(--border-bright); }
.stats-tab-btn.active { background:var(--accent-dim); border-color:var(--accent); color:var(--accent); }

/* "Архів" (4 вкладки: Архів/Блокнот/Посилання/Зразки) — той самий
   .stats-tab-btn, але активний стан м'якший: у темах з насиченим
   --accent-dim (напр. індиго-фіолет) суцільна заливка на всю ширину
   4 однаково розтягнутих кнопок виглядала важко. Напівпрозора підкладка
   + рамка кольору акценту читається як вибрана вкладка, не як залита
   плашка. */
.arch-tab-btn.active {
    background:rgba(var(--accent-rgb, 124,111,255), .16);
    border-color:var(--accent);
    color:var(--accent);
}

.status-badge { display:inline-block; padding:2px 10px; border-radius:20px; font-size:12px; background:rgba(255,255,255,0.1); border:1px solid rgba(255,255,255,0.2); }
.status-badge.status-активний,.status-badge.status-active { background:rgba(16,185,129,0.2); border-color:rgba(16,185,129,0.5); color:#6ee7b7; }
.status-badge.status-неактивний,.status-badge.status-inactive { background:rgba(239,68,68,0.2); border-color:rgba(239,68,68,0.5); color:#fca5a5; }
.status-badge.status-в_роботі { background:rgba(59,130,246,0.2); border-color:rgba(59,130,246,0.5); color:#93c5fd; }
.status-badge.status-очікування { background:rgba(245,158,11,0.2); border-color:rgba(245,158,11,0.5); color:#fcd34d; }
.status-badge.status-прогрів { background:rgba(139,92,246,0.2); border-color:rgba(139,92,246,0.5); color:#c4b5fd; }
.status-badge.status-готово { background:rgba(16,185,129,0.2); border-color:rgba(16,185,129,0.5); color:#6ee7b7; }
.status-badge.status-бан { background:rgba(239,68,68,0.2); border-color:rgba(239,68,68,0.5); color:#fca5a5; }
.status-badge.status-апеляція { background:rgba(245,158,11,0.2); border-color:rgba(245,158,11,0.5); color:#fcd34d; }
.status-badge.status-модерація { background:rgba(59,130,246,0.2); border-color:rgba(59,130,246,0.5); color:#93c5fd; }
.status-badge.status-призупинений { background:rgba(107,114,128,0.2); border-color:rgba(107,114,128,0.5); color:#d1d5db; }
.status-badge.status-рекламодавець { background:rgba(236,72,153,0.2); border-color:rgba(236,72,153,0.5); color:#f9a8d4; }

/* ── Дашборд-компоненти для Аналітики (KPI-плитки/барчарти/донат) ─────────
   Спільний набір для farm-analytics і proxy-analytics view'ів (app.js) —
   заміна голих таблиць на зведення зверху + деталі згорнуті знизу. Все
   через реальні змінні теми (--bg-panel/--accent/...), тому коректно
   перефарбовується під Abstergo Forge / Neon Ghost, а не лише термінал.
   Жирніший/читабельніший шрифт для цифр і заголовків панелей — за проханням
   (числа 700-800, підписи 600 замість типових 400-500 деінде в застосунку). */

.dash-kpi-row { display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:12px; margin-bottom:14px; }
/* Зрізаний кут замість заокруглення — border звичайним чином губиться на
   діагоналі, тому "рамка" тут через стек drop-shadow (він іде по силуету
   ПІСЛЯ clip-path, на відміну від border/box-shadow, які йдуть по
   прямокутнику ДО зрізу). */
.dash-kpi {
    background:var(--bg-panel); border:none; border-radius:0;
    clip-path: polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, 0 100%);
    filter: drop-shadow(1px 0 0 var(--border)) drop-shadow(-1px 0 0 var(--border)) drop-shadow(0 1px 0 var(--border)) drop-shadow(0 -1px 0 var(--border));
    padding:15px 17px; display:flex; flex-direction:column; gap:5px; position:relative;
    transition:filter .15s, transform .15s;
}
.dash-kpi:hover { filter: drop-shadow(1px 0 0 var(--border-bright)) drop-shadow(-1px 0 0 var(--border-bright)) drop-shadow(0 1px 0 var(--border-bright)) drop-shadow(0 -1px 0 var(--border-bright)) drop-shadow(0 0 10px rgba(var(--accent-rgb),.18)); transform:translateY(-1px); }
/* Кутова "дужка-приціл" у зрізаному куті — акцент присутності хрому */
.dash-kpi::after {
    content:''; position:absolute; top:0; right:0; width:var(--cut); height:var(--cut);
    background: linear-gradient(135deg, transparent 49%, var(--accent) 50%, transparent 51%);
    opacity:.45; pointer-events:none;
}
.dash-kpi-label { font-size:10px; text-transform:uppercase; letter-spacing:.08em; font-weight:600; color:var(--text-mute); }
.dash-kpi-value { font-size:29px; font-weight:800; font-variant-numeric:tabular-nums; color:var(--text); line-height:1.1; }
.dash-kpi.is-accent .dash-kpi-value { color:var(--accent); }
.dash-kpi.is-warn .dash-kpi-value { color:var(--red); }
.dash-kpi-sub { font-size:11.5px; font-weight:500; color:var(--text-dim); }
.dash-kpi-sub .up { color:var(--accent); font-weight:700; }
.dash-kpi-sub .warn { color:var(--red); font-weight:700; }

.dash-panel-row { display:grid; grid-template-columns:1.15fr 1fr; gap:12px; margin-bottom:14px; }
@media (max-width:760px) { .dash-panel-row { grid-template-columns:1fr; } }
.dash-panel {
    background:var(--bg-panel); border:none; border-radius:0;
    /* Подвійний зріз (верх-право + низ-ліво) — більші панелі отримують
       виразнішу "рамку" форму, ніж менші KPI-плитки (один зріз) */
    clip-path: polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));
    filter: drop-shadow(1px 0 0 var(--border)) drop-shadow(-1px 0 0 var(--border)) drop-shadow(0 1px 0 var(--border)) drop-shadow(0 -1px 0 var(--border));
    padding:15px 17px 17px;
}
.dash-panel-title { font-size:11px; text-transform:uppercase; letter-spacing:.08em; font-weight:600; color:var(--text-mute); margin:0 0 13px; }

.dash-bar-row { display:grid; grid-template-columns:minmax(90px,160px) 1fr 56px 40px; align-items:center; gap:10px; padding:5px 0; }
.dash-bar-name { display:flex; align-items:center; gap:7px; font-size:12.5px; font-weight:500; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dash-dot { width:8px; height:8px; border-radius:0; clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%); flex-shrink:0; }
.dash-bar-track { background:var(--bg-active); border-radius:0; clip-path:polygon(0 0, calc(100% - 4px) 0, 100% 4px, 100% 100%, 4px 100%, 0 calc(100% - 4px)); height:8px; overflow:hidden; }
/* Легкий "overshoot" замість плавного ease-out — впевненіший, "механічний"
   рух замість м'якого UI-згладжування */
.dash-bar-fill { height:100%; border-radius:0; width:0; transition:width 1s cubic-bezier(.21,.9,.15,1.05); }
.dash-bar-count { font-size:12.5px; font-weight:600; text-align:right; font-variant-numeric:tabular-nums; color:var(--text); }
.dash-bar-pct { font-size:11px; text-align:right; color:var(--text-mute); font-variant-numeric:tabular-nums; }
.dash-panel-copy { flex-shrink:0; width:24px; height:24px; padding:0; border:1px solid var(--border); border-radius:4px; background:transparent; color:var(--text-mute); font-size:13px; line-height:1; cursor:pointer; transition:color .15s,border-color .15s; }
.dash-panel-copy:hover { color:var(--accent); border-color:var(--accent); }

.dash-donut-wrap { display:flex; align-items:center; gap:20px; flex-wrap:wrap; }
.dash-donut {
    width:118px; height:118px; border-radius:50%; flex-shrink:0; position:relative;
    opacity:0; transform:scale(.85) rotate(-8deg);
    transition:opacity .55s ease, transform .55s cubic-bezier(.16,1,.3,1);
}
.dash-donut.in { opacity:1; transform:scale(1) rotate(0deg); }
.dash-donut::after { content:''; position:absolute; inset:18px; background:var(--bg-panel); border-radius:50%; }
.dash-donut-center { position:absolute; inset:18px; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; }
.dash-donut-center b { font-size:17px; font-weight:800; font-variant-numeric:tabular-nums; color:var(--text); }
.dash-donut-center span { font-size:8.5px; font-weight:600; color:var(--text-mute); text-transform:uppercase; letter-spacing:.06em; }
/* Легенда не тягнеться на всю панель: на широкому екрані число відʼїжджало
   від своєї ж назви на пів екрана, і рядок ставало неможливо прочитати
   одним поглядом. Ширина рівно під вміст. */
.dash-legend { display:flex; flex-direction:column; gap:6px; flex:0 1 auto; min-width:170px; max-width:280px; }
.dash-legend-head { display:flex; align-items:center; gap:8px; font-size:9.5px; font-weight:600;
    text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute);
    padding-bottom:4px; border-bottom:1px solid var(--border); }
.dash-legend-head .geo { width:28px; }
.dash-legend-head .cnt { margin-left:auto; }
.dash-legend-head .pct { width:32px; text-align:right; }
.dash-legend-row { display:flex; align-items:center; gap:8px; font-size:12px; }
.dash-legend-row .geo { width:28px; font-weight:600; color:var(--text-dim); text-transform:uppercase; font-size:11px; }
.dash-legend-row .cnt { margin-left:auto; font-weight:600; font-variant-numeric:tabular-nums; color:var(--text); }
.dash-legend-row .pct { width:32px; text-align:right; color:var(--text-mute); font-size:11px; font-variant-numeric:tabular-nums; }

.dash-rank-row { display:grid; grid-template-columns:18px minmax(80px,150px) 1fr 50px; align-items:center; gap:10px; padding:6px 0; border-bottom:1px solid var(--border); }
.dash-rank-row:last-child { border-bottom:none; }
.dash-rank-num { color:var(--text-mute); font-size:11px; font-weight:600; }
.dash-rank-name { font-size:12.5px; font-weight:500; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dash-rank-name.is-other { color:var(--text-mute); font-style:italic; }
.dash-rank-track { background:var(--bg-active); border-radius:0; clip-path:polygon(0 0, calc(100% - 4px) 0, 100% 4px, 100% 100%, 4px 100%, 0 calc(100% - 4px)); height:6px; overflow:hidden; }
.dash-rank-fill { height:100%; border-radius:0; background:var(--accent-dim); width:0; transition:width 1s cubic-bezier(.21,.9,.15,1.05); }
.dash-rank-count { text-align:right; font-size:12.5px; font-weight:600; font-variant-numeric:tabular-nums; color:var(--text); }

.dash-detail-toggle {
    background:none; border:1px dashed var(--border-bright); color:var(--text-mute);
    font-family:var(--font-sans); font-size:11.5px; font-weight:600; padding:8px 12px; border-radius:0;
    clip-path: polygon(var(--cut-sm) 0, 100% 0, 100% calc(100% - var(--cut-sm)), calc(100% - var(--cut-sm)) 100%, 0 100%, 0 var(--cut-sm));
    cursor:pointer; text-align:left; display:flex; align-items:center; gap:6px; transition:color .15s, border-color .15s;
}
.dash-detail-toggle:hover { color:var(--text-dim); border-color:var(--accent); }
.dash-detail-toggle .chev { transition:transform .2s ease; display:inline-block; }
.dash-detail-toggle.open .chev { transform:rotate(90deg); }
.dash-detail-wrap { overflow:hidden; max-height:0; transition:max-height .3s ease; }
/* 600px різало таблиці з великою кількістю рядків (напр. "По фармерах") —
   overflow:hidden ховав хвіст БЕЗ можливості проскролити. Запас з різким
   зростанням числа тут нешкідливий (max-height — це стеля, не реальна
   висота), тому беремо явно з надлишком замість вважати скільки рядків
   реально буде. */
.dash-detail-wrap.open { max-height:20000px; }
.dash-detail-scroll { overflow-x:auto; margin-top:10px; }

@media (prefers-reduced-motion: reduce) {
    .dash-bar-fill, .dash-rank-fill, .dash-donut { transition:none; }
}

/* ── Спільне радіо: персистентний бар знизу (переживає навігацію по SPA,
   бо живе поза #main) ──────────────────────────────────────────────────── */

.radio-yt-target { position:absolute; width:1px; height:1px; opacity:0.01; pointer-events:none; overflow:hidden; }

.radio-bar {
    position:fixed; right:0; bottom:0; height:56px; z-index:500;
    width:33vw; min-width:360px; max-width:560px;
    background:var(--bg-panel); border:1px solid var(--border);
    border-radius:0; box-shadow:0 8px 24px rgba(0,0,0,.4);
    display:flex; align-items:center; gap:14px; padding:0 18px;
    font-family:var(--font-sans);
}
.radio-bar-info { display:flex; align-items:center; gap:10px; cursor:pointer; min-width:0; flex:1; }
.radio-bar-thumb {
    width:34px; height:34px; flex-shrink:0; background-size:cover; background-position:center;
    background-color:var(--bg-active); clip-path: polygon(0 0, calc(100% - 6px) 0, 100% 6px, 100% 100%, 6px 100%, 0 calc(100% - 6px));
}
.radio-bar-thumb.empty::after {
    content:'♪'; display:flex; align-items:center; justify-content:center; width:100%; height:100%;
    color:var(--text-mute); font-size:15px;
}
.radio-bar-text { min-width:0; }
.radio-bar-title { font-size:13px; font-weight:600; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:260px; }
.radio-bar-sub { font-size:11px; color:var(--text-mute); }
.radio-unlock-hint { font-size:11px; color:var(--amber); white-space:nowrap; cursor:pointer; }
.radio-bar-controls { display:flex; align-items:center; gap:6px; flex-shrink:0; }
.radio-ctrl-btn {
    width:28px; height:28px; border-radius:50%; border:1px solid var(--border-bright);
    background:var(--bg-active); color:var(--text); cursor:pointer; font-size:12px;
    display:flex; align-items:center; justify-content:center; transition:.12s;
}
.radio-ctrl-btn:hover { border-color:var(--accent); color:var(--accent); }
.radio-ctrl-btn.liked, .radio-ctrl-btn.liked:hover { border-color:var(--red); color:var(--red); }
.radio-ctrl-btn.radio-like-wide { width:auto; border-radius:12px; padding:0 8px; gap:3px; font-family:var(--font-mono); }
.radio-bar-volume { display:flex; align-items:center; gap:6px; flex-shrink:0; color:var(--text-mute); font-size:13px; }
.radio-bar-volume input[type=range] { width:80px; }
.radio-bar-listeners {
    flex-shrink:0; color:var(--text-mute); font-size:12px; font-family:var(--font-mono);
    white-space:nowrap; padding:2px 8px; border:1px solid var(--border); border-radius:12px;
}
.radio-bar-expand {
    width:34px; height:34px; flex-shrink:0; background:var(--bg-active); border:none;
    color:var(--text-mute); cursor:pointer; padding:0; font-size:15px; transition:.12s;
    clip-path: polygon(0 0, calc(100% - 6px) 0, 100% 6px, 100% 100%, 6px 100%, 0 calc(100% - 6px));
}
.radio-bar-expand:hover { background:var(--bg-hover); color:var(--accent); }

/* Згорнутий стан — уся панель ховається в маленьку іконку в кутку. */
.radio-bar.collapsed {
    right:0; bottom:0;
    width:46px; min-width:46px; max-width:46px; height:46px;
    padding:0; border-radius:8px; gap:0;
    box-shadow:0 4px 16px rgba(0,0,0,.4);
}
.radio-bar.collapsed > *:not(#radio-expand-btn) { display:none !important; }
.radio-bar.collapsed #radio-expand-btn { width:100%; height:100%; }

.radio-panel {
    display:none; position:fixed; right:0; bottom:56px; z-index:499;
    width:33vw; min-width:360px; max-width:560px;
    max-height:min(80vh, 720px); overflow-y:auto;
    background:var(--bg-panel); border:1px solid var(--border);
    border-radius:0;
    box-shadow:0 14px 40px rgba(0,0,0,.5);
    padding:14px 18px;
}
.radio-panel.open { display:block; }
.radio-panel-title { font-size:11px; text-transform:uppercase; letter-spacing:.08em; font-weight:600; color:var(--text-mute); margin-bottom:10px; }
.radio-panel-cols { display:flex; gap:28px; align-items:flex-start; flex-wrap:wrap; }
.radio-panel-col { flex:1 1 320px; min-width:280px; }
.radio-queue-list { display:flex; flex-direction:column; gap:6px; }
.radio-queue-row { display:flex; align-items:center; gap:10px; padding:6px 8px; background:var(--bg-active); }
.radio-queue-thumb { width:36px; height:36px; flex-shrink:0; background-size:cover; background-position:center; background-color:var(--bg-hover); }
.radio-queue-info { min-width:0; flex:1; }
.radio-queue-title { font-size:12.5px; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.radio-queue-added { font-size:11px; color:var(--text-mute); }
.radio-queue-remove {
    width:22px; height:22px; border-radius:50%; border:none; background:transparent;
    color:var(--text-mute); cursor:pointer; font-size:11px; flex-shrink:0;
}
.radio-queue-remove:hover { color:var(--red); }
.radio-like-btn {
    display:flex; align-items:center; gap:4px; flex-shrink:0;
    background:none; border:none; cursor:pointer; padding:2px 6px;
    color:var(--text-mute); font-size:11.5px; font-family:var(--font-mono);
}
.radio-like-btn:hover { color:var(--red); }
.radio-like-btn.liked { color:var(--red); }
.radio-top-row { display:flex; align-items:center; gap:10px; padding:6px 8px; background:var(--bg-active); }
.radio-top-rank { width:16px; flex-shrink:0; text-align:center; font-size:12px; color:var(--text-mute); font-family:var(--font-mono); }
.radio-top-title { min-width:0; flex:1; font-size:12.5px; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.radio-top-likes { flex-shrink:0; font-size:11.5px; color:var(--text-mute); font-family:var(--font-mono); }
.radio-panel-title-row { display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; }
.radio-panel-title-row .radio-panel-title { margin-bottom:0; }
.radio-add-row { display:flex; gap:8px; margin-top:12px; max-width:720px; flex-wrap:wrap; }
.radio-add-row input { flex:1 1 200px; min-width:160px; }
.radio-search-add {
    width:32px; height:32px; border-radius:50%; flex-shrink:0; cursor:pointer;
    background:var(--accent); color:var(--btn-accent-text); border:none;
    font-size:18px; font-weight:700; line-height:1;
}
.radio-search-add:hover { opacity:.85; box-shadow:0 0 12px rgba(var(--accent-rgb),.5); }

/* ── Плашки "Загалом/Залишилось/Час" (модуль Перевірка прогрівів) ───────── */
.warm-stat {
    flex: 1; text-align: center; background: var(--bg-active);
    border: 1px solid var(--border); border-radius: var(--radius);
    padding: 8px 6px;
}
.warm-stat-label { font-size: 10px; color: var(--text-mute); text-transform: uppercase; letter-spacing: .05em; }
.warm-stat-value { font-size: 18px; font-weight: 700; color: var(--accent); margin-top: 2px; }

@media (max-width:760px) {
    .radio-bar-title { max-width:140px; }
    .radio-bar-volume input[type=range] { width:50px; }
}

/* ── Головна сторінка: стрічка новин (клік на лого) + дашборд ───────────── */

/* Дві колонки. Стрічка новин обмежена 720px (див. .news-feed нижче), тому на
   широкому екрані праворуч завжди лишалось порожньо — туди й пішло зведення.
   align-items:start — щоб колонки не розтягувались одна під одну по висоті.
   На вузьких екранах дашборд іде ПІД новинами (одна колонка): на телефоні
   новини важливіші, а панелі однаково не влізли б поруч. */
.home-grid { display:grid; grid-template-columns:minmax(0,720px) minmax(300px,1fr); gap:18px; align-items:start; }
@media (max-width:1180px) { .home-grid { grid-template-columns:1fr; } }
.home-dash { display:flex; flex-direction:column; gap:12px; }
.home-dash:empty { display:none; }
/* KPI в бічній колонці вужчі за ті, що на повноширинних сторінках аналітики
   (там minmax(190px,1fr)) — інакше в дві колонки не складались і кожна
   плитка займала цілий рядок. */
.home-dash .dash-kpi-row { grid-template-columns:repeat(auto-fit,minmax(132px,1fr)); margin-bottom:0; gap:10px; }
.home-dash .dash-kpi-value { font-size:23px; }
.home-dash-note { margin-top:10px; font-size:11px; color:var(--text-mute); }
.home-dash-note.warn { color:var(--red); }
.home-dash-agent { display:flex; align-items:center; gap:9px; font-size:12.5px; font-weight:500; color:var(--text); }
.home-dash-agent-dot { width:9px; height:9px; flex-shrink:0; clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%); background:var(--text-mute); }
.home-dash-agent.is-on .home-dash-agent-dot { background:var(--accent); box-shadow:0 0 8px rgba(var(--accent-rgb),.7); }
.home-dash-agent.is-off .home-dash-agent-dot { background:var(--red); }
.home-dash-runs { display:flex; align-items:baseline; justify-content:space-between; gap:12px; padding:6px 0; border-bottom:1px solid var(--border); }
.home-dash-runs:last-child { border-bottom:none; }
.home-dash-runs-label { font-size:12.5px; font-weight:500; color:var(--text); }
.home-dash-runs-count { font-size:18px; font-weight:800; font-variant-numeric:tabular-nums; color:var(--accent); }
/* Радіо-лічильник — єдиний несерйозний блок дашборду, тому й виглядає
   інакше: число в рядок із підписом, уся плитка клікабельна (веде в радіо). */
.home-dash-radio { display:flex; align-items:baseline; gap:10px; cursor:pointer; transition:filter .15s; }
.home-dash-radio:hover { filter: drop-shadow(0 0 8px rgba(var(--accent-rgb),.35)); }
.home-dash-radio-n { font-size:26px; font-weight:800; font-variant-numeric:tabular-nums; color:var(--accent); line-height:1; flex-shrink:0; }
.home-dash-radio-txt { font-size:11.5px; color:var(--text-dim); line-height:1.35; }

/* ── Історія оновлень (Налаштування) ─────────────────────────────────────
   Переросла з технічного логу в джерело звіту для керівництва, звідси
   фільтри, групування по днях і типи оновлень. */
.cl-bar { display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-bottom:8px; }
.cl-lbl { font-size:11px; color:var(--text-mute); }
.cl-bar input[type="date"] { width:auto; padding:3px 6px; font-size:11.5px; }
.btn.cl-pill { padding:3px 9px; font-size:11px; }
.cl-day {
    display:flex; align-items:baseline; gap:10px;
    margin:12px 0 4px; padding-top:8px; border-top:1px solid var(--border);
}
.cl-day:first-of-type { margin-top:4px; border-top:none; padding-top:0; }
.cl-day-date { font-size:12px; font-weight:700; color:var(--accent); }
.cl-day-count { font-size:10.5px; color:var(--text-mute); }
.cl-item { display:flex; align-items:flex-start; gap:8px; padding:5px 0 5px 10px; }
.cl-item-main { min-width:0; flex:1; }
.cl-item-txt { font-size:13px; line-height:1.4; }
.cl-item-meta { font-size:10.5px; color:var(--text-mute); margin-top:2px; }
.cl-item-cat { width:auto; flex-shrink:0; font-size:10.5px; padding:2px 4px; }
.btn.cl-del { flex-shrink:0; padding:2px 8px; font-size:11px; }
.cl-cut { font-size:11.5px; color:var(--red); margin:6px 0 2px; }
/* Час заливки — моноширинний, щоб рядки вирівнювались вертикально */
.cl-time { font-family:var(--font-mono); color:var(--text-dim); }

/* Аналітика автоматизації -> "Час по днях": рядок-смуга з датою, під ним
   люди цього дня. Без цієї смуги список читався як набір дублів — одне й
   те саме імʼя траплялось через рядок (насправді то були різні дні). */
.sa-day-table tr.sa-day-head td {
    background: var(--bg-active);
    font-weight: 700;
    border-top: 1px solid var(--border-bright, var(--border));
}
.sa-day-table tr.sa-day-head td:first-child { color: var(--accent); }
/* Людські рядки трохи підтягнуті вправо — видно, що вони належать даті вище */
.sa-day-table tr:not(.sa-day-head) td:nth-child(2) { padding-left: 18px; }

.news-feed { display:flex; flex-direction:column; gap:14px; max-width:720px; }
.news-card {
    background:var(--bg-panel); border:none; border-radius:0;
    clip-path: polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));
    filter: drop-shadow(1px 0 0 var(--border)) drop-shadow(-1px 0 0 var(--border)) drop-shadow(0 1px 0 var(--border)) drop-shadow(0 -1px 0 var(--border));
    padding:16px 18px 18px;
}
.news-card-head { margin-bottom:8px; }
.news-card-title { font-size:15px; font-weight:700; color:var(--text); }
.news-card-meta { font-size:11.5px; color:var(--text-mute); margin-top:2px; }
.news-card-body { font-size:13.5px; line-height:1.6; color:var(--text-dim); white-space:pre-wrap; }
.news-card-images {
    display:grid; grid-template-columns:repeat(auto-fill, minmax(140px, 1fr)); gap:8px;
    margin-top:12px;
}
.news-card-images img {
    width:100%; height:140px; object-fit:cover; cursor:zoom-in;
    border:1px solid var(--border); transition:border-color .12s;
}
.news-card-images img:hover { border-color:var(--accent); }

.news-reactions { display:flex; gap:6px; flex-wrap:wrap; margin-top:12px; }
.news-reaction-btn {
    display:inline-flex; align-items:center; gap:5px;
    padding:3px 10px; border-radius:14px; font-size:13px; cursor:pointer;
    border:1px solid var(--border-bright); color:var(--text-dim);
    background:var(--bg-active); transition:.15s;
}
.news-reaction-btn span { font-size:11.5px; color:var(--text-mute); }
.news-reaction-btn:hover { border-color:var(--accent); color:var(--text); }
.news-reaction-btn.active { border-color:var(--accent); background:rgba(34,211,200,0.12); }
.news-reaction-btn.active span { color:var(--accent); }

.news-lightbox {
    display:none; position:fixed; inset:0; z-index:3000;
    background:rgba(4,6,9,.88); align-items:center; justify-content:center; cursor:zoom-out;
}
.news-lightbox.open { display:flex; }
.news-lightbox img { max-width:90vw; max-height:90vh; object-fit:contain; }

/* ── Модерація новин: сітка мініатюр у формі редагування ─────────────────── */

.news-image-grid {
    display:grid; grid-template-columns:repeat(auto-fill, minmax(96px, 1fr)); gap:8px;
    margin-bottom:10px;
}
.news-image-grid:empty { display:none; }
.news-image-thumb { position:relative; }
.news-image-thumb img { width:100%; height:80px; object-fit:cover; border:1px solid var(--border); display:block; }
.news-image-remove {
    position:absolute; top:-6px; right:-6px; width:20px; height:20px; border-radius:50%;
    background:var(--red); color:#fff; border:none; cursor:pointer;
    font-size:11px; line-height:1; display:flex; align-items:center; justify-content:center;
}

/* ══════════════════════════════════════════════════════════════════════════
   Рух в інтерфейсі
   ──────────────────────────────────────────────────────────────────────────
   Принцип: анімація має ПОЯСНЮВАТИ (звідки взявся елемент, що змінилось), а
   не прикрашати. Це інструмент, у якому працюють щодня, тому все коротке —
   180-260мс. Довше починає відчуватись як гальмо саме тоді, коли людина
   робить дію вп'ятдесяте за день.

   Свідомо НЕ анімуємо: рядки таблиць (вони віртуалізовані, там тисячі
   записів — це і просадка швидкодії, і мигтіння при скролі) та панелі логів,
   що оновлюються опитуванням раз на секунду-півтори.
   ══════════════════════════════════════════════════════════════════════════ */

/* Перехід між розділами. Найпомітніша анімація застосунку — трапляється на
   КОЖНІЙ навігації, тому й найстриманіша: лише легкий підйом і поява. */
#main.view-enter { animation: viewEnter .2s cubic-bezier(.16, 1, .3, 1); }
@keyframes viewEnter {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: none; }
}

/* Меню по ПКМ і випадні панелі — з'являються з точки кліку, тому й
   масштабуються від меншого, а не просто проявляються. */
.farm-ctx-menu, .columns-picker {
    animation: popIn .16s cubic-bezier(.16, 1, .3, 1);
    transform-origin: top left;
}
@keyframes popIn {
    from { opacity: 0; transform: scale(.96); }
    to   { opacity: 1; transform: none; }
}

/* Модальні вікна: тло проявляється, картка трохи піднімається. */
#global-confirm-overlay, #sa-log-overlay, #news-lightbox.open {
    animation: overlayIn .18s ease-out;
}
#global-confirm-overlay > div, #sa-log-overlay > div {
    animation: modalIn .22s cubic-bezier(.16, 1, .3, 1);
}
@keyframes overlayIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes modalIn {
    from { opacity: 0; transform: translateY(10px) scale(.98); }
    to   { opacity: 1; transform: none; }
}

/* Кнопки — миттєвий тактильний відгук на натискання. Без переходу назад:
   палець уже відпустив, і "повільне відпускання" читається як лаг. */
.btn:active:not(:disabled) { transform: translateY(1px); }

/* Головний вимикач. Люди з вестибулярними розладами й ті, хто просто
   вимкнув анімації в системі, мають отримати статичний інтерфейс — а не
   "трохи менше руху". Тому гасимо ВСЕ, включно з наявними ефектами тем. */
@media (prefers-reduced-motion: reduce) {
    #main.view-enter,
    .farm-ctx-menu, .columns-picker,
    #global-confirm-overlay, #global-confirm-overlay > div,
    #sa-log-overlay, #sa-log-overlay > div,
    #news-lightbox.open,
    .toast, .toast.out { animation: none !important; }
    .btn:active:not(:disabled) { transform: none; }
}

/* ── Робота з Окто: таблиця результатів масових операцій ──────────────────
   .data-table.dense за замовчуванням ріже клітинки (nowrap + ellipsis) — це
   правильно для широких таблиць даних, але тут у клітинці лежить ТЕКСТ
   ПОМИЛКИ від Octo, і зрізаний він марний: 2026-08-17 команда довго шукала
   причину збою масового створення, хоча відповідь ("вичерпано ліміт
   профілів") була на екрані — просто обрізана на другому слові. */
.data-table.dense.ot-results td.ot-res-cell {
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
    line-height: 1.45;
    padding-top: 5px;
    padding-bottom: 5px;
}
.badge-err {
    color: var(--red); border-color: var(--red);
    white-space: normal; text-align: left;
    /* довгий JSON/URL без пробілів інакше розпирає таблицю вбік */
    word-break: break-word;
}

/* ProxyLine: сума подовження в діалозі (рахується ДО натискання кнопки) */
.pl-quote {
    margin: 10px 0 4px;
    padding: 8px 10px;
    border: 1px solid var(--border);
    border-radius: var(--radius);
    background: var(--bg-hover);
    font-size: 12px;
    color: var(--text-mute);
}
.pl-quote-sum {
    font-size: 13px;
    color: var(--text);
}
.pl-quote-note {
    margin-top: 4px;
    line-height: 1.4;
}
.pl-quote-warn, .pl-quote.pl-quote-warn {
    color: var(--red);
    border-color: var(--red);
}

/* Аналітика проксі: пояснення під плитками (напр. чому економія нульова) */
.pa-note {
    margin: 10px 0;
    padding: 8px 12px;
    border-radius: var(--radius);
    border: 1px solid var(--border);
    background: var(--bg-hover);
    font-size: 12px;
    line-height: 1.5;
    color: var(--text-mute);
}
.pa-note-warn { border-color: var(--amber); color: var(--text-dim); }
.pa-note-bad  { border-color: var(--red);   color: var(--text-dim); }

/* Аналітика проксі: архів по місяцях усередині спільного підсумку */
.pa-arch { margin-top: 14px; border-top: 1px solid var(--border); padding-top: 12px; }
.pa-arch-title { font-size: 12px; color: var(--text-mute); margin-bottom: 6px; }
.pa-arch-sub { font-size: 10px; color: var(--text-mute); }
.pa-arch-note { margin-top: 6px; font-size: 11px; line-height: 1.5; color: var(--text-mute); }

/* Порожній місяць в архіві — рядок-сміття, який варто прибрати */
.pa-arch-empty td { opacity: .55; }
.pa-arch-del { padding: 2px 8px; line-height: 1.4; color: var(--text-mute); }
.pa-arch-del:hover { color: var(--red); border-color: var(--red); box-shadow: none; }

/* Адмін → Здоровʼя */
.hl-dot { font-size: 11px; margin-right: 6px; }
.hl-ok   { color: var(--accent); }
.hl-warn { color: var(--amber); }
.hl-bad  { color: var(--red); }
.hl-idle { color: var(--text-mute); }
.hl-muted { color: var(--text-mute); }
.hl-table th, .hl-table td { vertical-align: top; }
/* Деталі задач бувають довгі — обрізати їх посеред слова гірше, ніж перенести */
.hl-table td { white-space: normal; }
.hl-err-row td {
    padding-top: 0; font-size: 11px; color: var(--red);
    word-break: break-word; white-space: normal;
}
.hl-summary {
    margin-bottom: 14px; padding: 10px 14px;
    border: 1px solid var(--accent); border-radius: var(--radius);
    background: var(--bg-panel); font-size: 13px;
}
.hl-summary-warn { border-color: var(--amber); }
