/* base.css — общий каркас портала report.sipexpert.kg (палитра + сайдбар).
   Подключается <link> ПЕРЕД инлайновым <style> каждой страницы → пер-страничные оверрайды инлайна побеждают (равная специфичность, инлайн позже в каскаде).
   Извлечено БАЙТ-В-БАЙТ из идентичного кластера: палитра :root — 10 страниц, shell-сайдбар — 7 страниц (dashboard/history/settings/monitoring/ats/ats-users/heatmap).
   ⛔ Десктоп не менять — это чистый вынос дублей. Мобильные @media жить будут в отдельном mobile.css. */
  /* ── ТЕМЫ (SPEC §20). Светлая — как было, БАЙТ-В-БАЙТ те же значения существующих токенов, чтобы
     ничего не поехало. Тёмная и «авто» добавлены сверху. Переключает data-theme на <html> (js/theme.js).
     Новые токены (surface, line, hover, shadow, side-..., ftr-..., on-primary) заведены, чтобы
     расшить захардкоженные цвета: без них тёмная тема даёт белые пятна. */
  :root{--ink:#1C3557;--muted:#5A6A7E;--primary:#1C3557;--accent:#D4312A;--bg:#F2F4F7;--card:#fff;--border:#DDE3EC;
    --good:#2E7D32;--bad:#D4312A;--warn:#ED6C02;--blue:#2f6db0;--slate:#475569;
    --surface:#fff;--surface-2:#F8FAFC;--line:#f1f5f9;--hover:#eef2ff;--on-primary:#fff;
    --shadow:rgba(30,41,59,.05);--shadow-2:rgba(0,0,0,.35);
    --side-from:#1C3557;--side-to:#0F1F33;--side-ink:#aab4d0;--ftr-bg:#1C3557;--ftr-ink:#aab8cf;--ftr-link:#c3cfe0;
    --mono:#3730a3;--muted-2:#475569;--border-2:#e2e8f0;--grid:#c9d2e0;--disabled:#c3ccd8;

    --c065f46:#065f46;--c0d9488:#0d9488;--c0f7a4a:#0f7a4a;--c12233b:#12233b;--c1a7a2e:#1a7a2e;--c1a7c4a:#1a7c4a;--c1d6b32:#1d6b32;--c1d8a3a:#1d8a3a;--c1e293b:#1e293b;--c1f6f43:#1f6f43;--c1f7a44:#1f7a44;--c1f8a4c:#1f8a4c;--c274b7a:#274b7a;--c2a1608:#2a1608;--c2e7d54:#2e7d54;--c2f6db0:#2f6db0;--c2f6fed:#2f6fed;--c334155:#334155;--c3b2a08:#3b2a08;--c3b6198:#3b6198;--c3e5169:#3e5169;--c3f3413:#3f3413;--c44566b:#44566b;--c4457a8:#4457a8;--c475569:#475569;--c5b3a9e:#5b3a9e;--c5b4a1d:#5b4a1d;--c5b6774:#5b6774;--c5c6b80:#5c6b80;--c64748b:#64748b;--c7a1c18:#7a1c18;--c7a5b17:#7a5b17;--c7b4bb0:#7b4bb0;--c7d2020:#7d2020;--c8a2f2f:#8a2f2f;--c8a5a09:#8a5a09;--c8a6416:#8a6416;--c92400e:#92400e;--c991b1b:#991b1b;--c9a6b00:#9a6b00;--ca06a12:#a06a12;--ca7f3d0:#a7f3d0;--ca8231a:#a8231a;--caa3333:#aa3333;--cb0342c:#b0342c;--cb26a00:#b26a00;--cb91c1c:#b91c1c;--cbfe3cd:#bfe3cd;--cc0271e:#c0271e;--cc0392b:#c0392b;--cc4cdd9:#c4cdd9;--cc62828:#c62828;--cc7d2fe:#c7d2fe;--cc9d3e0:#c9d3e0;--ccbd3dd:#cbd3dd;--ccbd5e1:#cbd5e1;--ccfd8e3:#cfd8e3;--ccfd9e6:#cfd9e6;--ccfe0f5:#cfe0f5;--cd9c9f2:#d9c9f2;--cdbe3ec:#dbe3ec;--cdbe4f0:#dbe4f0;--cdbe6f3:#dbe6f3;--cdbeafe:#dbeafe;--cdde7f1:#dde7f1;--cdfeaf7:#dfeaf7;--ce2c98f:#e2c98f;--ce2eefb:#e2eefb;--ce3e8f0:#e3e8f0;--ce3e9f1:#e3e9f1;--ce3f0e6:#e3f0e6;--ce3f5e9:#e3f5e9;--ce5484d:#e5484d;--ce6ebf3:#e6ebf3;--ce6edf5:#e6edf5;--ce6f6ec:#e6f6ec;--ce7f0fb:#e7f0fb;--ce7f4e8:#e7f4e8;--ce7f4ea:#e7f4ea;--ce8edf5:#e8edf5;--ce8f5e9:#e8f5e9;--ce9edf3:#e9edf3;--ceaf6ec:#eaf6ec;--ceaf6ef:#eaf6ef;--cecc9c9:#ecc9c9;--ceceef1:#eceef1;--cecfdf5:#ecfdf5;--cedf1f6:#edf1f6;--ceef1f5:#eef1f5;--ceef1f6:#eef1f6;--ceef2f7:#eef2f7;--ceef2fb:#eef2fb;--ceef3fd:#eef3fd;--ceef4fb:#eef4fb;--ceffaf1:#effaf1;--cf0c987:#f0c987;--cf0c9c9:#f0c9c9;--cf0d79a:#f0d79a;--cf0dede:#f0dede;--cf0f3f8:#f0f3f8;--cf0f5fb:#f0f5fb;--cf1f3f7:#f1f3f7;--cf1f5f9:#f1f5f9;--cf2f7fd:#f2f7fd;--cf3e2c4:#f3e2c4;--cf3eafc:#f3eafc;--cf3eefb:#f3eefb;--cf4f6f8:#f4f6f8;--cf4f6f9:#f4f6f9;--cf4f7fb:#f4f7fb;--cf4f8fd:#f4f8fd;--cf4f9ff:#f4f9ff;--cf4faf5:#f4faf5;--cf5f7fa:#f5f7fa;--cf5f8fc:#f5f8fc;--cf6f8fb:#f6f8fb;--cf6f8fc:#f6f8fc;--cf6f9fd:#f6f9fd;--cf7f9fc:#f7f9fc;--cf8fafc:#f8fafc;--cf8fafd:#f8fafd;--cf8fbff:#f8fbff;--cfafbfc:#fafbfc;--cfafbfd:#fafbfd;--cfbdada:#fbdada;--cfbe4e2:#fbe4e2;--cfbe7e6:#fbe7e6;--cfbe9e7:#fbe9e7;--cfbe9e9:#fbe9e9;--cfbfcfe:#fbfcfe;--cfde68a:#fde68a;--cfde8e6:#fde8e6;--cfdeaea:#fdeaea;--cfdecea:#fdecea;--cfdecec:#fdecec;--cfdeede:#fdeede;--cfdeeee:#fdeeee;--cfdf0dd:#fdf0dd;--cfdf0e0:#fdf0e0;--cfdf1d8:#fdf1d8;--cfdf3e0:#fdf3e0;--cfdf4f4:#fdf4f4;--cfdf6e3:#fdf6e3;--cfdf7e7:#fdf7e7;--cfecaca:#fecaca;--cfef2f2:#fef2f2;--cfef3e7:#fef3e7;--cfef6e0:#fef6e0;--cfff1f0:#fff1f0;--cfff3e0:#fff3e0;--cfff6f5:#fff6f5;--cfff8e6:#fff8e6;--cfff8ec:#fff8ec;--cfff8f0:#fff8f0;--cfffbeb:#fffbeb;--cffffff:#ffffff;
    --c0b63b3:#0b63b3;--c1c3d73:#1c3d73;--c1c4e82:#1c4e82;--c1f2733:#1f2733;--c2b5fb3:#2b5fb3;--c2e9e5b:#2e9e5b;--c5a6a7e:#5a6a7e;--c5b6b7b:#5b6b7b;--c6b7480:#6b7480;--c8a6d00:#8a6d00;--cbcd3ea:#bcd3ea;--cc7d8ff:#c7d8ff;--ccdd7e1:#cdd7e1;--cd7deea:#d7deea;--cdbe7f5:#dbe7f5;--cdc4437:#dc4437;--cdde3ec:#dde3ec;--ce2e8f0:#e2e8f0;--ce3e6ea:#e3e6ea;--ce3e9f2:#e3e9f2;--ce6ebf1:#e6ebf1;--ceef2f6:#eef2f6;--ceef4ff:#eef4ff;--cf0d9a0:#f0d9a0;--cf2f8ff:#f2f8ff;--cfdf2f1:#fdf2f1;--cffe9e7:#ffe9e7;--cfffaf0:#fffaf0;
    --cc9d2e0:#c9d2e0;--ce2ebf7:#e2ebf7;--ceceff4:#eceff4;--cf6f9fc:#f6f9fc;--cfdefcf:#fdefcf;--cfff7e6:#fff7e6;
    --glass:rgba(255,255,255,.66);--glass-2:rgba(255,255,255,.96);
    --dlg-edge:transparent;--backdrop:rgba(20,28,44,.42);--tip-bg:#1C3557;--tip-ink:#fff;
    color-scheme:light;}
  :root[data-theme="dark"]{--ink:#E6EDF6;--muted:#9AA7B8;--primary:#5B9BD5;--accent:#E0554E;
    --bg:#0E151E;--card:#18212E;--border:#2B3849;
    --good:#4CAF50;--bad:#EF5350;--warn:#FFA726;--blue:#5B9BD5;--slate:#94A3B8;
    --surface:#18212E;--surface-2:#1E2836;--line:#232F3E;--hover:#223042;--on-primary:#fff;
    --shadow:rgba(0,0,0,.45);--shadow-2:rgba(0,0,0,.6);
    --side-from:#141C27;--side-to:#0B1119;--side-ink:#93A3BC;--ftr-bg:#141C27;--ftr-ink:#93A3BC;--ftr-link:#B9C6D8;
    --mono:#8AB4F8;--muted-2:#94A3B8;--border-2:#2B3849;--grid:#2B3849;--disabled:#445266;
    --c065f46:#8ED9A8;--c0d9488:#9CC4EF;--c0f7a4a:#8ED9A8;--c12233b:#9CC4EF;--c1a7a2e:#8ED9A8;--c1a7c4a:#8ED9A8;--c1d6b32:#8ED9A8;--c1d8a3a:#8ED9A8;--c1e293b:#9CC4EF;--c1f6f43:#8ED9A8;--c1f7a44:#8ED9A8;--c1f8a4c:#8ED9A8;--c274b7a:#9CC4EF;--c2a1608:#EBC475;--c2e7d54:#8ED9A8;--c2f6db0:#9CC4EF;--c2f6fed:#9CC4EF;--c334155:#9CC4EF;--c3b2a08:#EBC475;--c3b6198:#9CC4EF;--c3e5169:#9CC4EF;--c3f3413:#EBC475;--c44566b:#9CC4EF;--c4457a8:#9CC4EF;--c475569:#9CC4EF;--c5b3a9e:#C3AEEB;--c5b4a1d:#EBC475;--c5b6774:#9CC4EF;--c5c6b80:#9CC4EF;--c64748b:#9CC4EF;--c7a1c18:#F2A6A2;--c7a5b17:#EBC475;--c7b4bb0:#C3AEEB;--c7d2020:#F2A6A2;--c8a2f2f:#F2A6A2;--c8a5a09:#EBC475;--c8a6416:#EBC475;--c92400e:#EBC475;--c991b1b:#F2A6A2;--c9a6b00:#EBC475;--ca06a12:#EBC475;--ca7f3d0:#152A20;--ca8231a:#F2A6A2;--caa3333:#F2A6A2;--cb0342c:#F2A6A2;--cb26a00:#EBC475;--cb91c1c:#F2A6A2;--cbfe3cd:#152A20;--cc0271e:#F2A6A2;--cc0392b:#F2A6A2;--cc4cdd9:#17283C;--cc62828:#F2A6A2;--cc7d2fe:#17283C;--cc9d3e0:#17283C;--ccbd3dd:#17283C;--ccbd5e1:#17283C;--ccfd8e3:#17283C;--ccfd9e6:#17283C;--ccfe0f5:#17283C;--cd9c9f2:#221A33;--cdbe3ec:#17283C;--cdbe4f0:#17283C;--cdbe6f3:#17283C;--cdbeafe:#17283C;--cdde7f1:#17283C;--cdfeaf7:#17283C;--ce2c98f:#2B2314;--ce2eefb:#17283C;--ce3e8f0:#17283C;--ce3e9f1:#17283C;--ce3f0e6:#152A20;--ce3f5e9:#152A20;--ce5484d:#F2A6A2;--ce6ebf3:#17283C;--ce6edf5:#17283C;--ce6f6ec:#152A20;--ce7f0fb:#17283C;--ce7f4e8:#152A20;--ce7f4ea:#152A20;--ce8edf5:#17283C;--ce8f5e9:#152A20;--ce9edf3:#17283C;--ceaf6ec:#152A20;--ceaf6ef:#152A20;--cecc9c9:#2E1A1B;--ceceef1:#17283C;--cecfdf5:#152A20;--cedf1f6:#17283C;--ceef1f5:#17283C;--ceef1f6:#17283C;--ceef2f7:#17283C;--ceef2fb:#17283C;--ceef3fd:#17283C;--ceef4fb:#17283C;--ceffaf1:#152A20;--cf0c987:#2B2314;--cf0c9c9:#2E1A1B;--cf0d79a:#2B2314;--cf0dede:#2E1A1B;--cf0f3f8:#17283C;--cf0f5fb:#17283C;--cf1f3f7:#17283C;--cf1f5f9:#17283C;--cf2f7fd:#17283C;--cf3e2c4:#2B2314;--cf3eafc:#221A33;--cf3eefb:#221A33;--cf4f6f8:#17283C;--cf4f6f9:#17283C;--cf4f7fb:#17283C;--cf4f8fd:#17283C;--cf4f9ff:#17283C;--cf4faf5:#152A20;--cf5f7fa:#17283C;--cf5f8fc:#17283C;--cf6f8fb:#17283C;--cf6f8fc:#17283C;--cf6f9fd:#17283C;--cf7f9fc:#17283C;--cf8fafc:#17283C;--cf8fafd:#17283C;--cf8fbff:#17283C;--cfafbfc:#17283C;--cfafbfd:#17283C;--cfbdada:#2E1A1B;--cfbe4e2:#2E1A1B;--cfbe7e6:#2E1A1B;--cfbe9e7:#2E1A1B;--cfbe9e9:#2E1A1B;--cfbfcfe:#17283C;--cfde68a:#2B2314;--cfde8e6:#2E1A1B;--cfdeaea:#2E1A1B;--cfdecea:#2E1A1B;--cfdecec:#2E1A1B;--cfdeede:#2B2314;--cfdeeee:#2E1A1B;--cfdf0dd:#2B2314;--cfdf0e0:#2B2314;--cfdf1d8:#2B2314;--cfdf3e0:#2B2314;--cfdf4f4:#2E1A1B;--cfdf6e3:#2B2314;--cfdf7e7:#2B2314;--cfecaca:#2E1A1B;--cfef2f2:#2E1A1B;--cfef3e7:#2B2314;--cfef6e0:#2B2314;--cfff1f0:#2E1A1B;--cfff3e0:#2B2314;--cfff6f5:#2E1A1B;--cfff8e6:#2B2314;--cfff8ec:#2B2314;--cfff8f0:#2B2314;--cfffbeb:#2B2314;--cffffff:#1E2836;
    --c0b63b3:#9CC4EF;--c1c3d73:#9CC4EF;--c1c4e82:#9CC4EF;--c1f2733:#9CC4EF;--c2b5fb3:#9CC4EF;--c2e9e5b:#8ED9A8;--c5a6a7e:#9CC4EF;--c5b6b7b:#9CC4EF;--c6b7480:#C7D2E0;--c8a6d00:#EBC475;--cbcd3ea:#17283C;--cc7d8ff:#17283C;--ccdd7e1:#17283C;--cd7deea:#17283C;--cdbe7f5:#17283C;--cdc4437:#F2A6A2;--cdde3ec:#17283C;--ce2e8f0:#17283C;--ce3e6ea:#17283C;--ce3e9f2:#17283C;--ce6ebf1:#17283C;--ceef2f6:#17283C;--ceef4ff:#17283C;--cf0d9a0:#2B2314;--cf2f8ff:#17283C;--cfdf2f1:#2E1A1B;--cffe9e7:#2E1A1B;--cfffaf0:#2B2314;
    --cc9d2e0:#17283C;--ce2ebf7:#17283C;--ceceff4:#17283C;--cf6f9fc:#17283C;--cfdefcf:#2B2314;--cfff7e6:#2B2314;
    --glass:rgba(24,33,46,.78);--glass-2:rgba(24,33,46,.96);
    --dlg-edge:#2B3849;--backdrop:rgba(0,0,0,.62);--tip-bg:#2B3849;--tip-ink:#fff;
    color-scheme:dark;}
  /* «Авто» — следуем системе. Тот же набор, что и у [data-theme="dark"]; :not([data-theme]) покрывает
     миг до выполнения theme.js (страница без атрибута не должна вспыхнуть белым на тёмной системе). */
  @media (prefers-color-scheme: dark){
    :root[data-theme="auto"], :root:not([data-theme]){--ink:#E6EDF6;--muted:#9AA7B8;--primary:#5B9BD5;--accent:#E0554E;
      --bg:#0E151E;--card:#18212E;--border:#2B3849;
      --good:#4CAF50;--bad:#EF5350;--warn:#FFA726;--blue:#5B9BD5;--slate:#94A3B8;
      --surface:#18212E;--surface-2:#1E2836;--line:#232F3E;--hover:#223042;--on-primary:#fff;
      --shadow:rgba(0,0,0,.45);--shadow-2:rgba(0,0,0,.6);
      --side-from:#141C27;--side-to:#0B1119;--side-ink:#93A3BC;--ftr-bg:#141C27;--ftr-ink:#93A3BC;--ftr-link:#B9C6D8;
      --mono:#8AB4F8;--muted-2:#94A3B8;--border-2:#2B3849;--grid:#2B3849;--disabled:#445266;
      --c065f46:#8ED9A8;--c0d9488:#9CC4EF;--c0f7a4a:#8ED9A8;--c12233b:#9CC4EF;--c1a7a2e:#8ED9A8;--c1a7c4a:#8ED9A8;--c1d6b32:#8ED9A8;--c1d8a3a:#8ED9A8;--c1e293b:#9CC4EF;--c1f6f43:#8ED9A8;--c1f7a44:#8ED9A8;--c1f8a4c:#8ED9A8;--c274b7a:#9CC4EF;--c2a1608:#EBC475;--c2e7d54:#8ED9A8;--c2f6db0:#9CC4EF;--c2f6fed:#9CC4EF;--c334155:#9CC4EF;--c3b2a08:#EBC475;--c3b6198:#9CC4EF;--c3e5169:#9CC4EF;--c3f3413:#EBC475;--c44566b:#9CC4EF;--c4457a8:#9CC4EF;--c475569:#9CC4EF;--c5b3a9e:#C3AEEB;--c5b4a1d:#EBC475;--c5b6774:#9CC4EF;--c5c6b80:#9CC4EF;--c64748b:#9CC4EF;--c7a1c18:#F2A6A2;--c7a5b17:#EBC475;--c7b4bb0:#C3AEEB;--c7d2020:#F2A6A2;--c8a2f2f:#F2A6A2;--c8a5a09:#EBC475;--c8a6416:#EBC475;--c92400e:#EBC475;--c991b1b:#F2A6A2;--c9a6b00:#EBC475;--ca06a12:#EBC475;--ca7f3d0:#152A20;--ca8231a:#F2A6A2;--caa3333:#F2A6A2;--cb0342c:#F2A6A2;--cb26a00:#EBC475;--cb91c1c:#F2A6A2;--cbfe3cd:#152A20;--cc0271e:#F2A6A2;--cc0392b:#F2A6A2;--cc4cdd9:#17283C;--cc62828:#F2A6A2;--cc7d2fe:#17283C;--cc9d3e0:#17283C;--ccbd3dd:#17283C;--ccbd5e1:#17283C;--ccfd8e3:#17283C;--ccfd9e6:#17283C;--ccfe0f5:#17283C;--cd9c9f2:#221A33;--cdbe3ec:#17283C;--cdbe4f0:#17283C;--cdbe6f3:#17283C;--cdbeafe:#17283C;--cdde7f1:#17283C;--cdfeaf7:#17283C;--ce2c98f:#2B2314;--ce2eefb:#17283C;--ce3e8f0:#17283C;--ce3e9f1:#17283C;--ce3f0e6:#152A20;--ce3f5e9:#152A20;--ce5484d:#F2A6A2;--ce6ebf3:#17283C;--ce6edf5:#17283C;--ce6f6ec:#152A20;--ce7f0fb:#17283C;--ce7f4e8:#152A20;--ce7f4ea:#152A20;--ce8edf5:#17283C;--ce8f5e9:#152A20;--ce9edf3:#17283C;--ceaf6ec:#152A20;--ceaf6ef:#152A20;--cecc9c9:#2E1A1B;--ceceef1:#17283C;--cecfdf5:#152A20;--cedf1f6:#17283C;--ceef1f5:#17283C;--ceef1f6:#17283C;--ceef2f7:#17283C;--ceef2fb:#17283C;--ceef3fd:#17283C;--ceef4fb:#17283C;--ceffaf1:#152A20;--cf0c987:#2B2314;--cf0c9c9:#2E1A1B;--cf0d79a:#2B2314;--cf0dede:#2E1A1B;--cf0f3f8:#17283C;--cf0f5fb:#17283C;--cf1f3f7:#17283C;--cf1f5f9:#17283C;--cf2f7fd:#17283C;--cf3e2c4:#2B2314;--cf3eafc:#221A33;--cf3eefb:#221A33;--cf4f6f8:#17283C;--cf4f6f9:#17283C;--cf4f7fb:#17283C;--cf4f8fd:#17283C;--cf4f9ff:#17283C;--cf4faf5:#152A20;--cf5f7fa:#17283C;--cf5f8fc:#17283C;--cf6f8fb:#17283C;--cf6f8fc:#17283C;--cf6f9fd:#17283C;--cf7f9fc:#17283C;--cf8fafc:#17283C;--cf8fafd:#17283C;--cf8fbff:#17283C;--cfafbfc:#17283C;--cfafbfd:#17283C;--cfbdada:#2E1A1B;--cfbe4e2:#2E1A1B;--cfbe7e6:#2E1A1B;--cfbe9e7:#2E1A1B;--cfbe9e9:#2E1A1B;--cfbfcfe:#17283C;--cfde68a:#2B2314;--cfde8e6:#2E1A1B;--cfdeaea:#2E1A1B;--cfdecea:#2E1A1B;--cfdecec:#2E1A1B;--cfdeede:#2B2314;--cfdeeee:#2E1A1B;--cfdf0dd:#2B2314;--cfdf0e0:#2B2314;--cfdf1d8:#2B2314;--cfdf3e0:#2B2314;--cfdf4f4:#2E1A1B;--cfdf6e3:#2B2314;--cfdf7e7:#2B2314;--cfecaca:#2E1A1B;--cfef2f2:#2E1A1B;--cfef3e7:#2B2314;--cfef6e0:#2B2314;--cfff1f0:#2E1A1B;--cfff3e0:#2B2314;--cfff6f5:#2E1A1B;--cfff8e6:#2B2314;--cfff8ec:#2B2314;--cfff8f0:#2B2314;--cfffbeb:#2B2314;--cffffff:#1E2836;
      --c0b63b3:#9CC4EF;--c1c3d73:#9CC4EF;--c1c4e82:#9CC4EF;--c1f2733:#9CC4EF;--c2b5fb3:#9CC4EF;--c2e9e5b:#8ED9A8;--c5a6a7e:#9CC4EF;--c5b6b7b:#9CC4EF;--c6b7480:#C7D2E0;--c8a6d00:#EBC475;--cbcd3ea:#17283C;--cc7d8ff:#17283C;--ccdd7e1:#17283C;--cd7deea:#17283C;--cdbe7f5:#17283C;--cdc4437:#F2A6A2;--cdde3ec:#17283C;--ce2e8f0:#17283C;--ce3e6ea:#17283C;--ce3e9f2:#17283C;--ce6ebf1:#17283C;--ceef2f6:#17283C;--ceef4ff:#17283C;--cf0d9a0:#2B2314;--cf2f8ff:#17283C;--cfdf2f1:#2E1A1B;--cffe9e7:#2E1A1B;--cfffaf0:#2B2314;
      --cc9d2e0:#17283C;--ce2ebf7:#17283C;--ceceff4:#17283C;--cf6f9fc:#17283C;--cfdefcf:#2B2314;--cfff7e6:#2B2314;
      --glass:rgba(24,33,46,.78);--glass-2:rgba(24,33,46,.96);
      --dlg-edge:#2B3849;--backdrop:rgba(0,0,0,.62);--tip-bg:#2B3849;--tip-ink:#fff;
      color-scheme:dark;}
  }
  .layout{display:flex;min-height:100vh;align-items:stretch;}
  .side{width:92px;flex:0 0 92px;background:linear-gradient(180deg,var(--side-from),var(--side-to));position:sticky;top:0;height:100vh;
    display:flex;flex-direction:column;align-items:center;padding:16px 6px;gap:8px;}
  .side-logo{width:54px;height:54px;border-radius:50%;background:var(--surface);box-shadow:0 3px 10px var(--shadow-2);flex:0 0 auto;}
  .side-logo img{width:54px;height:54px;border-radius:50%;display:block;}
  /* Кнопка «Свернуть» ЛЕЖИТ В РАЗМЕТКЕ каждой страницы (а не дорисовывается скриптом) — иначе её позднее
     появление сдвигало низ меню на каждом переходе. ⛔ Из потока её выносить НЕЛЬЗЯ: при низком окне меню
     прокручивается, и абсолютная кнопка ложится поверх «Настроек» (проверено на высотах 500–1050). */
  .side-nav{margin-top:22px;display:flex;flex-direction:column;gap:6px;width:100%;flex:1 1 auto;}
  .side-bottom{display:flex;flex-direction:column;gap:6px;width:100%;flex:0 0 auto;}
  /* Кнопка «Свернуть» — в разметке каждой страницы, поэтому и стили здесь, а не в инжекте скрипта. */
  .side-toggle{margin-top:8px;width:100%;display:flex;align-items:center;justify-content:center;gap:5px;background:rgba(255,255,255,.06);border:0;border-radius:12px;color:#aab6c8;cursor:pointer;padding:9px 3px;font-size:10px;font-family:inherit;flex:none;white-space:nowrap;}
  .side-toggle:hover{background:rgba(255,255,255,.14);color:#fff;}
  .side-toggle svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;transition:transform .18s ease;flex:none;}
  html.side-collapsed .side-toggle svg{transform:rotate(180deg);}
  html.side-collapsed .side-toggle .st-lbl{display:none;}
  .ni{display:flex;flex-direction:column;align-items:center;gap:5px;padding:11px 4px;border-radius:13px;
    color:var(--side-ink);text-decoration:none;cursor:pointer;font-size:11px;line-height:1.1;text-align:center;}
  .ni svg{width:23px;height:23px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  .ni:hover{color:var(--on-primary);background:rgba(255,255,255,.07);}
  .ni.dim{opacity:.32;cursor:default;} .ni.dim:hover{background:none;color:var(--side-ink);}
  .ni.active{background:var(--accent);color:var(--on-primary);box-shadow:0 5px 14px rgba(212,49,42,.42);}
  .side{overflow-y:auto;scrollbar-width:none;} .side::-webkit-scrollbar{display:none;}
  @media (max-height:820px){ .side{padding:12px 5px;gap:5px;} .side-logo,.side-logo img{width:46px;height:46px;} .side-nav{margin-top:12px;gap:4px;} .side-bottom{gap:4px;} .ni{padding:8px 4px;gap:3px;font-size:10.5px;} .ni svg{width:20px;height:20px;} }
  @media (max-height:660px){ .side-logo,.side-logo img{width:36px;height:36px;} .side-nav{margin-top:8px;gap:2px;} .side-bottom{gap:2px;} .ni{padding:6px 3px;gap:2px;font-size:9.5px;} .ni svg{width:18px;height:18px;} }

  /* ── ПЕРЕХОДЫ МЕЖДУ СТРАНИЦАМИ. Портал многостраничный: клик по меню строит документ заново, и оболочка
     (боковое меню + шапка) перерисовывается, хотя она везде одна и та же — это и читалось как «дёргается».
     Браузер умеет сшивать два документа сам: одинаковые имена перехода = элемент не перерисовывается,
     а переносится, поэтому меню и шапка визуально СТОЯТ НА МЕСТЕ, а меняется только содержимое.
     Chrome/Edge; Safari и Firefox правило игнорируют — навигация остаётся прежней, ничего не ломается. */
  @view-transition{navigation:auto;}
  .side{view-transition-name:app-side;}
  /* ⛔ НИЧЕГО НЕ АНИМИРУЕМ. Смысл перехода — чтобы браузер держал старый кадр, пока новый документ не
     готов рисовать, а не в красивом растворении. По умолчанию же старый и новый снимки РАСТВОРЯЮТСЯ
     друг в друге, и на середине две полупрозрачные копии одной и той же оболочки дают просадку
     непрозрачности — меню и шапка «моргают» на каждом переходе (замер: у ::view-transition-old/new
     анимации opacity 1→0 и 0→1 при полностью совпадающей геометрии). Снимаем анимации — остаётся
     мгновенная и спокойная подмена кадра. */
  ::view-transition-old(root), ::view-transition-new(root),
  ::view-transition-old(app-side), ::view-transition-new(app-side){ animation:none; mix-blend-mode:normal; }
  /* ⛔ Шапке и футеру имя НЕ даём: замер показал, что именованный элемент теряет свою тень
     (у шапки — подсветку под нижней границей, 8116 изменившихся пикселей против 1955 без имени).
     Им имя и не нужно: они на всех страницах одинаковые, поэтому в общем переходе выглядят неподвижными. */
  /* Уважение к системной настройке «меньше движения» — там переход выключаем совсем. */
  @media (prefers-reduced-motion:reduce){ @view-transition{navigation:none;} }

  /* ── ШАПКА + ФУТЕР — ЕДИНЫЙ источник для ВСЕХ страниц портала (Правило №11).
     Раньше эти же правила дублировались БАЙТ-В-БАЙТ инлайном в 12 стр (+ dashboard.css) → «у каждой своё» и риск
     дрейфа. Вынесено сюда; инлайн-дубли удалены. Мобильная доводка шапки/футера — в mobile.css (грузится позже). */
  .main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;}

  /* ── РАБОЧАЯ ОБЛАСТЬ — ЕДИНЫЙ источник ширины и полей (заказ владельца 18.09) ──────────────────
     🔴 ПОВОД: «ширина рабочей области!! Дашборды — почти от края до края, Мониторинг — с отступами…
     всё с отступами, а дашборды прям в ровень. Можем всё привести к одному виду — нужны отступы,
     просто чтобы они не прыгали, а были одинаковыми?»
     ЗАМЕР ПО КОДУ (18.09): ширину задавала КАЖДАЯ страница у себя, и значений набралось ПЯТНАДЦАТЬ —
     от 680 до 1760. При переходе Дашборды → Мониторинг край съезжал на ~270 px с каждой стороны:
     это и читается глазом как «прыгает».
     РЕШЕНИЕ ВЛАДЕЛЬЦА: страницы данных — 1220 (как Мониторинг, так было у большинства отчётов),
     формы и карточки — один узкий размер (`.wrap.narrow`): длинную строку ввода читать тяжело, и
     узкая колонка там не случайность, а типографика.
     ⛔ НЕ ЗАДАВАТЬ ШИРИНУ НА СТРАНИЦЕ. Правило живёт только здесь — иначе через полгода снова будет
     пятнадцать значений. Нужна другая ширина разделу — меняем переменную, а не страницу.
     Тот же приём, что с шапкой и футером выше: один источник вместо инлайн-дублей (Правило №11). */
  :root{--wrap-w:1220px;--wrap-narrow-w:900px;--wrap-pad:20px;}
  .wrap{max-width:var(--wrap-w);margin:0 auto;padding:var(--wrap-pad);width:100%;}
  .wrap.narrow{max-width:var(--wrap-narrow-w);}
  header{position:sticky;top:0;z-index:20;background:var(--card);border-bottom:1px solid var(--border);
    display:flex;align-items:center;gap:14px;padding:12px 20px;box-shadow:0 1px 3px var(--shadow);}
  /* Резерв под виджеты шапки, которые тоже приезжают после отрисовки: «полоса свежести» (freshbar.js,
     замер 243px + разделитель) и кнопки отчёта (reportbar.js, 232px). Резерв снимается, как только виджет
     встал на место. Если браузер не понимает :has(), правило целиком не сработает — вернётся прежнее
     поведение, ничего не сломается. */
  body:has(#freshbar) header::before{content:'';flex:0 0 272px;}
  body:has(header .freshbar) header::before{display:none;}
  #rbMount{min-width:232px;display:inline-flex;justify-content:flex-end;}
  header .sp{flex:1;} .hdr-user{display:flex;flex-direction:column;align-items:flex-end;line-height:1.25;}
  .hdr-dom{font-size:14px;font-weight:700;color:var(--ink);} .hdr-name{font-size:12px;color:var(--muted);}
  /* «Полоса свежести» в шапке: у отчётов её наполняет freshbar.js, у «Мониторинга» — своя логика
     (обновление каждые 3 сек), но вид ОБЩИЙ. Стили здесь, а не в инжекте скрипта. */
  .freshbar{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--c5b6b7b);white-space:nowrap}
  .freshbar .fb-dot{width:7px;height:7px;border-radius:50%;background:#2e9e5b;flex:none}
  .freshbar.fb-stale .fb-dot{background:#d9a300}
  .freshbar .fb-txt{font-variant-numeric:tabular-nums}
  .freshbar .fb-btn{font:inherit;color:var(--c0b63b3);background:none;border:1px solid var(--ccdd7e1);border-radius:6px;padding:2px 9px;cursor:pointer}
  .freshbar .fb-btn:hover{background:var(--ceef4fb)}
  .freshbar .fb-btn:disabled{opacity:.6;cursor:default}
  .freshbar.fb-hdr{margin:0}
  .fb-sep{width:1px;height:20px;background:var(--cd7deea);border-radius:1px;flex:none;align-self:center;margin:0 14px}
  @media(max-width:640px){.freshbar .fb-txt{display:none}
  .fb-sep{margin:0 9px}
  }
  .logout{border:1px solid var(--border);background:var(--surface);border-radius:8px;padding:7px 12px;font-size:13px;cursor:pointer;color:var(--muted);text-decoration:none;}
  .ftr{margin-top:auto;background:var(--ftr-bg);color:var(--ftr-ink);display:flex;align-items:center;justify-content:space-between;
    flex-wrap:wrap;gap:4px 18px;padding:10px 24px;font-size:12.5px;}
  .ftr a{color:var(--ftr-link);text-decoration:none;} .ftr a:hover{color:var(--on-primary);} .ftr .ftr-b{color:var(--on-primary);font-weight:700;} .ftr .ac{color:#E05A54;font-weight:600;} .ftr .sep{opacity:.35;margin:0 3px;}

/* ── .selc — выпадающий список В ФОРМАХ И ОКНАХ (один источник истины, Правило №11).
   Почему отдельно от filters.css: тот канон — для панели фильтров и тянет за собой свои .f/.filters
   с другой геометрией; страницы с собственным .f (например «Пользователи», 93 использования) он бы
   сломал. Общее у них главное — нативный <select> НЕ должен показывать СИСТЕМНУЮ стрелку: именно
   она выдаёт «не наш» элемент (замечание владельца 09.09). Шеврон и кольцо фокуса здесь те же, что
   в filters.css, чтобы формы и фильтры выглядели одной семьёй. ── */
select.selc{width:100%;height:42px;padding:0 34px 0 13px;border:1px solid var(--border);border-radius:10px;
  font-size:14px;font-family:inherit;color:var(--ink);background-color:var(--surface);box-sizing:border-box;cursor:pointer;
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='10'%20height='7'%20viewBox='0%200%2010%207'%3E%3Cpath%20d='M1%201l4%204%204-4'%20fill='none'%20stroke='%235A6A7E'%20stroke-width='1.6'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 13px center;background-size:10px 7px;}
select.selc::-ms-expand{display:none;}
select.selc:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(212,49,42,.12);}
select.selc:disabled{opacity:.5;cursor:not-allowed;}
/* Размеры: высота и радиус разные (шапка карточки / строка формы / поле окна), но шеврон, фокус и
   отсутствие системной стрелки — общие. Иначе рядом стоят три «почти одинаковых» списка. */
select.selc.sm{height:34px;border-radius:8px;font-size:12.5px;padding:0 28px 0 9px;background-position:right 10px center;}
select.selc.md{height:40px;border-radius:9px;font-size:13.5px;padding:0 30px 0 10px;background-position:right 11px center;}

/* ── .inpc — ПОЛЕ ВВОДА: тот же канон, что и `.selc` для списков (Правило №11, один источник истины).
   Заведено 09.09 после третьего замечания владельца «поля не в нашем стиле»: канон для списков был,
   а для полей — нет, и геометрия выдумывалась заново на каждом экране (30/38/40/42 px, радиус 7/9/10).
   Размеры теми же модификаторами: `.sm` — в строке таблицы, `.md` — в форме, без модификатора — 42 px. ── */
input.inpc{width:100%;height:42px;padding:0 13px;border:1px solid var(--border);border-radius:10px;
  font-size:14px;font-family:inherit;color:var(--ink);background-color:var(--surface);box-sizing:border-box;}
input.inpc::placeholder{color:var(--muted);opacity:.75;}
input.inpc:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(212,49,42,.12);}
input.inpc:disabled{opacity:.5;cursor:not-allowed;}
input.inpc.sm{height:34px;border-radius:8px;font-size:13px;padding:0 10px;}
input.inpc.md{height:40px;border-radius:9px;font-size:13.5px;padding:0 12px;}

/* ── Мастер номеров (SPEC_USERS_WIZARD.md). Держим ЗДЕСЬ, а не в отдельном файле: у портала один
   общий лист стилей, и каждый новый файл на фичу — это ещё один источник геометрии, из-за которого
   элементы начинают расходиться (замечание владельца 09.09). ── */
.uwz-ov{position:fixed;inset:0;background:rgba(15,23,42,.55);display:flex;align-items:center;justify-content:center;z-index:9999;padding:16px}
.uwz{background:var(--surface);border-radius:14px;width:min(940px,96vw);max-height:92vh;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.3);overflow:hidden}
/* Первый шаг — четыре строчки настроек: широкое окно от таблицы плана делало его пустым и раздутым
   (замечание владельца 09.09). Ширину даём по содержимому шага, а не одну на весь мастер. */
.uwz.narrow{width:min(560px,96vw)}
input.inpc.uwz-num{width:92px;text-align:center;flex:0 0 auto}   /* канон .inpc тянется на 100% — здесь орган управления, а не поле ввода строки */
.uwz-sub{margin:2px 0 0 2px;padding-left:12px;border-left:2px solid var(--border)}
.uwz-head{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);font-weight:700;font-size:16px;color:var(--ink)}
.uwz-head .x{margin-left:auto;background:none;border:0;font-size:20px;color:var(--muted);cursor:pointer;line-height:1}
.uwz-steps{display:flex;gap:14px;padding:12px 20px;border-bottom:1px solid var(--border);font-size:13px;flex-wrap:wrap}
.uwz-steps .st{color:var(--muted)}
.uwz-steps .st.on{color:var(--accent);font-weight:600}
.uwz-body{padding:18px 20px;overflow:auto}
.uwz-foot{display:flex;gap:10px;justify-content:flex-end;align-items:center;padding:14px 20px;border-top:1px solid var(--border)}
.uwz-foot .sum{margin-right:auto;font-size:13px;color:var(--muted)}
.uwz-foot .sum b{color:var(--ink)}
.uwz-foot .sum.bad b{color:var(--accent)}
.uwz-g{border:1px solid var(--border);border-radius:12px;padding:14px;margin-bottom:12px}
.uwz-g h4{margin:0 0 10px;font-size:14px;color:var(--ink)}
.uwz-row{display:flex;gap:10px;flex-wrap:wrap}
.uwz-row .fl{flex:1 1 150px;min-width:130px}
.uwz-row label{display:block;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:5px}
.uwz-plan{width:100%;border-collapse:collapse;font-size:13px}
.uwz-plan th{text-align:left;color:var(--muted);font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.4px;padding:6px 8px;border-bottom:1px solid var(--border)}
.uwz-plan td{padding:6px 8px;border-bottom:1px solid var(--border)}
.uwz-plan tr.bad td{background:#fdecec;color:#a3312a}
.uwz-row input.bad{border-color:var(--accent);box-shadow:0 0 0 3px rgba(212,49,42,.10)}
.uwz-note{border-radius:10px;padding:10px 12px;margin-bottom:12px;font-size:13px}
.uwz-note.err{background:#fdecec;color:#a3312a}
.uwz-note.ok{background:#eaf7ee;color:#1f7a3d}
/* ── Боковое меню в режиме СОТРУДНИКА — КАНОН. До 09.09 эти правила были в <style> каждой страницы и
   везде разные (где-то с исключением для /history, где-то их не было вовсе). Из-за этого набор и
   ПОРЯДОК пунктов у сотрудника менялся от страницы к странице — меню «дёргалось» на каждом переходе
   (владелец: «полный провал с меню в режиме сотрудника»). У менеджера так не было: его блок одинаков
   на всех страницах, поэтому и не дёргался.

   Правило одно: у сотрудника видны ТОЛЬКО пункты с `user-only`, в том порядке, в каком они лежат в
   разметке; операторский блок на всех страницах теперь одинаков и стоит первым. Класс `role-user`
   ставится синхронно из cookie в <head>, до первой отрисовки. ── */
.user-only{display:none;}
/* Разделитель меню — здесь, а не только в js/sidebar-collapse.js (04.10): тот подключён не везде («Обзвон» без него — разделитель
   нулевой высоты, «АТС» на 15 px выше) и стиль приходит после первого кадра — меню сдвигалось. Значения — как в sidebar-collapse.js. */
.side-sep{height:1px;background:rgba(255,255,255,.11);margin:7px 10px;flex:0 0 auto;border-radius:1px;}
html.side-collapsed .side-sep{margin:7px 12px;}
.role-user .side-nav .ni:not(.user-only){display:none!important;}
.role-user .side-bottom .ni:not([href="/settings"]){display:none!important;}
.role-user .side-sep{display:none!important;}
.role-user .user-only{display:flex!important;}
.role-user .mgr-only{display:none!important;}   /* менеджерские ссылки внутри страницы (напр. «← Диалер») ведут в отказ — сотруднику не показываем */
/* Встроенный режим (вход из Битрикс24 без пароля, SPEC_PORTAL_EMBED §11): узкая сессия видит только «Мой день» и «История» —
   остальные пункты и «Настройки» прячем (класс — shell-early.js по cookie rmode). Вид, не доступ: закрывает шлюз сервера. */
/* встроенный вход из Битрикс24: «Мой день», «Рейтинг» (03.10, рейтинг оператора — коллеги обезличены) и «История» */
/* Встроенный вход (03.10, EMBED_PORTAL_SECURITY §9): меню оператора (role-user), кроме «Настроек» и звонилки в браузере; внизу —
   «Войти как менеджер» (shell-early.js). Вид, не право: страницы закрывает шлюз сервера. */
.role-embed .side-bottom .ni[href="/settings"]{display:none!important;}
html.role-embed .side-nav .ni#navPhone,html.role-embed .side-nav .ni#navChat,html.role-embed .side-nav .ni#navAts{display:none!important;}   /* чат = /phone/?chatonly=1 + пароль линии — во входе из Б24 закрыт (§9): мёртвый пункт хуже отсутствующего */
/* «АТС» сотрудника (04.10) — по памяти прошлого ответа, до первого кадра; сильнее `.side-nav .ni[hidden]`. Стоит В САМОМ КОНЦЕ, после
   «Истории», за своим разделителем — как «АТС» у руководителя за разделителем (владелец 04.10). Разделитель — вместе с пунктом. */
html.nav-ats.role-user:not(.role-embed) .side-nav .ni#navAts[hidden]{display:flex!important;}
.side-nav .side-sep.user-sep{display:none!important;}
html.nav-ats.role-user:not(.role-embed) .side-nav .side-sep.user-sep{display:block!important;}
.role-embed .side-bottom .ni[data-mgr-login]{display:flex!important;}
.side-nav .ni[hidden]{display:none!important;}   /* спрятанное до ответа сервера не должно показываться правилом выше */

/* ── Подсказка «?» у показателя — КАНОН. Была объявлена в ЧЕТЫРЁХ местах (dashboard.css, history.html,
   heatmap.html, settings.html) с разной шириной — 250 против 320 — и новая страница, взявшая классы
   «как общие», получала кружок без всплывающего текста. Держим здесь; страницы со своими копиями
   работают как работали. Ширину ограничиваем экраном: подсказка у правой карточки распирала документ
   (замер 09.09: +65 px прокрутки при окне 900). ── */
.qh{position:relative;display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;
  border-radius:50%;background:var(--ce8edf5);color:var(--muted);font-size:10.5px;font-weight:700;
  cursor:help;margin-left:3px;vertical-align:middle;text-transform:none;}
.qtip{display:none;position:absolute;left:0;top:22px;width:300px;max-width:min(300px,calc(100vw - 24px));
  background:var(--tip-bg);color:var(--tip-ink);font-size:12px;font-weight:400;line-height:1.45;
  padding:9px 11px;border-radius:8px;box-shadow:0 8px 22px rgba(0,0,0,.28);z-index:200;
  text-transform:none;letter-spacing:normal;text-align:left;white-space:pre-line;}
.qh:hover .qtip,.qh:focus .qtip{display:block;}

/* ── Модальное окно (подтверждение/правка) — КАНОН. До 09.09 эти классы были объявлены в <style>
   КАЖДОЙ страницы, и новая страница, взявшая их «как общие», получила окно БЕЗ стилей: поля вывалились
   в конец документа сбоку (поймал владелец). Держим здесь; страницы со своими копиями работают как
   работали — правила те же. ── */
.confirm-backdrop{position:fixed;inset:0;background:rgba(15,31,51,.5);opacity:0;pointer-events:none;
  transition:opacity .15s;z-index:60;display:flex;align-items:center;justify-content:center;padding:20px;}
.confirm-backdrop.show{opacity:1;pointer-events:auto;}
.confirm-box{background:var(--surface);border-radius:14px;padding:22px 24px;max-width:400px;width:100%;
  box-shadow:0 0 0 1px var(--dlg-edge), 0 20px 50px rgba(0,0,0,.32);}
.confirm-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:18px;}

/* Кнопка копирования в конце значения (отчёт мастера). Держим её ВИДИМОЙ, а не на наведении:
   человек должен знать, что копировать можно, не водя мышью по таблице. Ширину занимает всегда,
   поэтому строки не дёргаются при нажатии. */
.cpx{display:inline-flex;align-items:center;gap:6px}
.cpb{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;
     border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--muted);cursor:pointer}
.cpb:hover{color:var(--ink);border-color:var(--muted)}
.cpb.ok{color:#1f7a3d;border-color:#9ad3ad;background:#eaf7ee}

/* ── Коды входа: метка в списке и журнал выдачи. Тоже здесь, а не строкой внутри JS: стили в
   JS-строке не читаются, не подсвечиваются и живут отдельной жизнью от остальных. ── */
.codetag{display:block;width:fit-content;margin:4px auto 0;padding:1px 8px;border-radius:20px;font-size:10.5px;font-weight:600;line-height:1.5;background:#fff3d6;color:#8a5a12;border:1px solid #f0d9a8;white-space:nowrap;font-variant-numeric:normal}
.cjr-ov{position:fixed;inset:0;background:rgba(15,23,42,.55);display:flex;align-items:center;justify-content:center;z-index:9999;padding:16px}
.cjr{background:var(--surface);border-radius:14px;width:min(960px,96vw);max-height:88vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.cjr-h{display:flex;align-items:center;padding:15px 20px;border-bottom:1px solid var(--border);font-weight:700;color:var(--ink)}
.cjr-h .x{margin-left:auto;background:none;border:0;font-size:20px;color:var(--muted);cursor:pointer}
.cjr-b{padding:14px 20px;overflow:auto}
.cjt{width:100%;border-collapse:collapse;font-size:13px}
.cjt th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);font-weight:500;padding:6px 8px;border-bottom:1px solid var(--border)}
.cjt td{padding:6px 8px;border-bottom:1px solid var(--border);vertical-align:top}
.cjt .ok{color:#1f7a3d;font-weight:600}
.cjt .no{color:var(--muted)}
.cjt .warn{color:#a3312a;font-weight:600}
.cjf{display:flex;flex-wrap:wrap;gap:12px 14px;align-items:flex-end;background:var(--card);border:1px solid var(--border);border-radius:14px;padding:14px 16px;margin-bottom:14px}
.cjf .cf{display:flex;flex-direction:column;gap:7px}
.cjf label{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;line-height:1;font-weight:500}
.cjf input[type=date],.cjf input[type=text]{height:40px;padding:0 12px;border:1px solid var(--border);border-radius:10px;font-size:13.5px;background:var(--surface);color:var(--ink);box-sizing:border-box;font-family:inherit}
.cjf input:focus,.cjf select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(212,49,42,.12)}
.cjf .qw{position:relative}
.cjf .qw input{padding-right:30px;min-width:190px}
.cjf .qx{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:none;color:var(--muted);font-size:17px;line-height:1;cursor:pointer}
.cjf .cnt{margin-left:auto;font-size:13px;color:var(--muted);padding-bottom:11px}
.cjt th[data-s]{cursor:pointer;user-select:none}
.cjt th[data-s]:hover{color:var(--ink)}
.cjt th .ar{opacity:.45;font-size:10px;margin-left:3px}
.cjp{display:flex;align-items:center;gap:10px;justify-content:flex-end;margin-top:12px;font-size:13px;color:var(--muted)}
.cjp button{height:32px;padding:0 12px;border:1px solid var(--border);border-radius:9px;background:var(--surface);color:var(--ink);font-size:13px;cursor:pointer;font-family:inherit}
.cjp button:disabled{opacity:.45;cursor:default}


/* ── Поле с крестиком быстрой очистки (канон, как у поиска в «Истории»). Крестик показываем только
   когда есть что стирать: пустая кнопка в каждой строке — шум. ── */
.inpx{position:relative;display:block}
.inpx > input.inpc{padding-right:28px}
.inpx > .inpx-x{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:0;background:none;
  color:var(--muted);font-size:16px;line-height:1;cursor:pointer;padding:2px 4px;display:none}
.inpx.has > .inpx-x{display:block}
.inpx > .inpx-x:hover{color:var(--ink)}
