/* OpenSwarm RU UI — шрифты, токены, база.
   Дизайн-система — Agent Swarm (SWARM/agent-swarm/DESIGN.md, apps/ui/src/styles/globals.css): цинковые
   поверхности, янтарный primary, Space Grotesk и Space Mono. Токены --color-*, --radius-*, --shadow-*, --ease-*
   повторяют globals.css один в один: при обновлении дизайн-системы значения переносятся оттуда.
   Короткие имена ниже (--bg, --text-3, --accent…) — наши псевдонимы поверх ролей дизайн-системы. */

/* ---------- Шрифты ----------
   В Space Grotesk и Space Mono нет кириллицы. Как в agent-swarm-ru (apps/ui/i18n-ru/fetch-fonts.ts), кириллица
   берётся из Manrope и JetBrains Mono и объявлена под теми же именами семейств через unicode-range. Все — SIL OFL 1.1. */
@font-face { font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap;
  src: url(../fonts/space-grotesk-normal-300-700-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap;
  src: url(../fonts/space-grotesk-normal-300-700-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap;
  src: url(../fonts/manrope-normal-300-700-cyrillic-ext.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
@font-face { font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap;
  src: url(../fonts/manrope-normal-300-700-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(../fonts/space-mono-normal-400-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(../fonts/space-mono-normal-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(../fonts/space-mono-normal-700-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(../fonts/space-mono-normal-700-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 100 800; font-display: swap;
  src: url(../fonts/jetbrains-mono-cyrillic-ext-wght-normal.woff2) format('woff2-variations');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 100 800; font-display: swap;
  src: url(../fonts/jetbrains-mono-cyrillic-wght-normal.woff2) format('woff2-variations');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }

/* ---------- Токены дизайн-системы: светлая тема (Hive light) ---------- */
/* Отличие от SWARM (решение 26.10): основной цвет — один яркий янтарь в обеих темах, с тёмным текстом
   на нём. Ссылки и цветной текст на светлом фоне — --color-primary-text, он темнее: яркий янтарь на белом
   не читается. Кольцо фокуса в светлой теме — тоже тёмное, ради контраста. */
:root, [data-theme="light"] {
  color-scheme: light;
  --color-background: oklch(1 0 0);
  --color-foreground: oklch(0.141 0.005 285.823);
  --color-card: oklch(1 0 0);
  --color-card-foreground: oklch(0.141 0.005 285.823);
  --color-surface: oklch(0.985 0.0015 286);
  --color-popover: oklch(1 0 0);
  --color-popover-foreground: oklch(0.141 0.005 285.823);
  --color-primary: oklch(0.769 0.188 70.08);
  --color-primary-foreground: oklch(0.21 0.006 285.885);
  --color-primary-text: oklch(0.555 0.163 48.998);
  --color-secondary: oklch(0.967 0.001 286.375);
  --color-secondary-foreground: oklch(0.21 0.006 285.885);
  --color-muted: oklch(0.967 0.001 286.375);
  --color-muted-foreground: oklch(0.552 0.016 285.938);
  --color-accent: oklch(0.943 0.003 286.375);
  --color-accent-foreground: oklch(0.21 0.006 285.885);
  --color-destructive: oklch(0.577 0.245 27.325);
  --color-destructive-foreground: oklch(0.985 0 0);
  --color-border: oklch(0.92 0.004 286.32);
  --color-border-subtle: oklch(0.945 0.003 286);
  --color-input: oklch(0.92 0.004 286.32);
  --color-ring: oklch(0.555 0.163 48.998);
  --color-sidebar: oklch(0.985 0 0);
  --color-sidebar-foreground: oklch(0.141 0.005 285.823);
  --color-sidebar-primary: oklch(0.555 0.163 48.998);
  --color-sidebar-primary-foreground: oklch(0.985 0 0);
  --color-sidebar-accent: oklch(0.943 0.003 286.375);
  --color-sidebar-accent-foreground: oklch(0.21 0.006 285.885);
  --color-sidebar-border: oklch(0.945 0.003 286);
  --color-sidebar-ring: oklch(0.555 0.163 48.998);
  --color-status-success: oklch(0.74 0.1 163);
  --color-status-success-strong: oklch(0.5 0.09 163);
  --color-status-success-foreground: oklch(0.21 0.006 285.885);
  --color-status-success-solid: oklch(0.627 0.194 149.2);
  --color-status-active: oklch(0.81 0.11 75);
  --color-status-active-strong: oklch(0.55 0.1 68);
  --color-status-active-foreground: oklch(0.21 0.006 285.885);
  --color-status-active-solid: oklch(0.666 0.179 58.318);
  --color-status-error: oklch(0.72 0.12 25);
  --color-status-error-strong: oklch(0.51 0.14 25);
  --color-status-error-foreground: oklch(0.21 0.006 285.885);
  --color-status-info: oklch(0.74 0.09 235);
  --color-status-info-strong: oklch(0.5 0.09 240);
  --color-status-info-foreground: oklch(0.21 0.006 285.885);
  --color-status-pending: oklch(0.84 0.1 95);
  --color-status-pending-strong: oklch(0.55 0.09 90);
  --color-status-pending-foreground: oklch(0.21 0.006 285.885);
  --color-status-warning: oklch(0.76 0.11 55);
  --color-status-warning-strong: oklch(0.53 0.11 50);
  --color-status-warning-foreground: oklch(0.21 0.006 285.885);
  --color-status-paused: oklch(0.71 0.1 262);
  --color-status-paused-strong: oklch(0.5 0.1 262);
  --color-status-paused-foreground: oklch(0.21 0.006 285.885);
  --color-status-neutral: oklch(0.62 0.014 286);
  --color-status-neutral-strong: oklch(0.48 0.014 286);
  --color-status-neutral-foreground: oklch(0.21 0.006 285.885);
}

/* ---------- Тёмная тема (Hive dark — каноническая, по умолчанию) ---------- */
[data-theme="dark"] {
  color-scheme: dark;
  --color-background: oklch(0.141 0.005 285.823);
  --color-foreground: oklch(0.985 0 0);
  --color-card: oklch(0.21 0.006 285.885);
  --color-card-foreground: oklch(0.985 0 0);
  --color-surface: oklch(0.185 0.006 286);
  --color-popover: oklch(0.21 0.006 285.885);
  --color-popover-foreground: oklch(0.985 0 0);
  --color-primary: oklch(0.769 0.188 70.08);
  --color-primary-foreground: oklch(0.21 0.006 285.885);
  --color-primary-text: oklch(0.769 0.188 70.08);
  --color-secondary: oklch(0.274 0.006 286.033);
  --color-secondary-foreground: oklch(0.985 0 0);
  --color-muted: oklch(0.274 0.006 286.033);
  --color-muted-foreground: oklch(0.705 0.015 286.067);
  --color-accent: oklch(0.274 0.006 286.033);
  --color-accent-foreground: oklch(0.985 0 0);
  --color-destructive: oklch(0.704 0.191 22.216);
  --color-destructive-foreground: oklch(0.985 0 0);
  --color-border: oklch(1 0 0 / 10%);
  --color-border-subtle: oklch(1 0 0 / 8%);
  --color-input: oklch(1 0 0 / 15%);
  --color-ring: oklch(0.769 0.188 70.08);
  --color-sidebar: oklch(0.21 0.006 285.885);
  --color-sidebar-foreground: oklch(0.985 0 0);
  --color-sidebar-primary: oklch(0.769 0.188 70.08);
  --color-sidebar-primary-foreground: oklch(0.985 0 0);
  --color-sidebar-accent: oklch(0.274 0.006 286.033);
  --color-sidebar-accent-foreground: oklch(0.985 0 0);
  --color-sidebar-border: oklch(1 0 0 / 8%);
  --color-sidebar-ring: oklch(0.769 0.188 70.08);
  --color-status-success: oklch(0.78 0.1 163);
  --color-status-success-strong: oklch(0.78 0.1 163);
  --color-status-success-foreground: oklch(0.21 0.006 285.885);
  --color-status-success-solid: oklch(0.723 0.219 149.6);
  --color-status-active: oklch(0.84 0.1 80);
  --color-status-active-strong: oklch(0.84 0.1 80);
  --color-status-active-foreground: oklch(0.21 0.006 285.885);
  --color-status-active-solid: oklch(0.769 0.188 70.08);
  --color-status-error: oklch(0.74 0.11 22);
  --color-status-error-strong: oklch(0.74 0.11 22);
  --color-status-error-foreground: oklch(0.21 0.006 285.885);
  --color-status-info: oklch(0.78 0.09 235);
  --color-status-info-strong: oklch(0.78 0.09 235);
  --color-status-info-foreground: oklch(0.21 0.006 285.885);
  --color-status-pending: oklch(0.86 0.09 95);
  --color-status-pending-strong: oklch(0.86 0.09 95);
  --color-status-pending-foreground: oklch(0.21 0.006 285.885);
  --color-status-warning: oklch(0.79 0.1 55);
  --color-status-warning-strong: oklch(0.79 0.1 55);
  --color-status-warning-foreground: oklch(0.21 0.006 285.885);
  --color-status-paused: oklch(0.74 0.09 260);
  --color-status-paused-strong: oklch(0.74 0.09 260);
  --color-status-paused-foreground: oklch(0.21 0.006 285.885);
  --color-status-neutral: oklch(0.72 0.012 286);
  --color-status-neutral-strong: oklch(0.72 0.012 286);
  --color-status-neutral-foreground: oklch(0.21 0.006 285.885);
}

/* Наше дополнение: приглушённый текст на тонированной подложке (выбранная строка, «Ждёт вас»). У SWARM
   muted-foreground (zinc-500) там даёт 4,1:1 — ниже AA, поэтому в светлой теме берём zinc-600 той же шкалы. */
:root, [data-theme="light"] { --muted-on-tint: oklch(0.442 0.017 285.786); }
[data-theme="dark"] { --muted-on-tint: var(--color-muted-foreground); }
/* То же для янтарного чипа (квота держит задачи): status-pending-strong на его подложке в светлой теме — 4,3:1. */
:root, [data-theme="light"] { --amber-on-tint: oklch(0.47 0.085 90); }
[data-theme="dark"] { --amber-on-tint: var(--color-status-pending-strong); }
/* И для взведённых кнопок «…?» в светлой теме (G6 аудита 02.11): status-active-strong на своей подложке — 4,48:1
   (сегмент на muted — 4,1:1), белый на destructive при наведении — 4,5:1. Чуть темнее и в охвате sRGB — от 4,9:1
   до 5,8:1 во всех состояниях. В тёмной теме — прежние токены, там контраст 6–7:1. */
:root, [data-theme="light"] { --warn-on-tint: oklch(0.5 0.1 68); --danger-solid: oklch(0.53 0.19 27.325); }
[data-theme="dark"] { --warn-on-tint: var(--color-status-active-strong); --danger-solid: var(--color-destructive); }

/* ---------- Форма, тень, движение, шрифты (не зависят от темы) ---------- */
:root {
  --font-sans: 'Space Grotesk', system-ui, sans-serif;
  --font-mono: 'Space Mono', ui-monospace, monospace;
  --radius-sm: 0.375rem; --radius-md: 0.5rem; --radius-lg: 0.625rem; --radius-xl: 0.625rem;
  --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
  --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
  --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
  --ease-swift: cubic-bezier(0.32, 0.72, 0, 1);
  --ease-snappy: cubic-bezier(0.2, 0, 0, 1);
  --nav-w: 232px; --aside-w: 340px; --detail-w: 430px;

  /* ---------- Наши псевдонимы поверх ролей дизайн-системы ---------- */
  --font-ui: var(--font-sans);
  --r-chip: var(--radius-sm); --r-item: var(--radius-md); --r-control: var(--radius-md);
  --r-block: var(--radius-xl); --r-panel: var(--radius-xl);
  --bg: var(--color-background);
  --surface: var(--color-card);
  --surface-2: color-mix(in oklab, var(--color-muted) 50%, var(--color-card)); /* тихая подложка, подсветка строки */
  --surface-3: var(--color-muted);
  --recessed: var(--color-surface);                                          /* утопленный блок: код, журнал */
  --border: var(--color-border);
  --border-2: var(--color-input);
  --line: var(--color-border-subtle);                                        /* разделители строк и списков */
  --text: var(--color-foreground);
  --text-2: var(--color-foreground);
  --text-3: var(--color-muted-foreground);
  --text-4: var(--color-muted-foreground);
  --accent: var(--color-primary);
  --accent-text: var(--color-primary-text);                                  /* основной цвет текстом: ссылки, значки */
  --accent-2: var(--color-primary-text);
  --accent-soft: color-mix(in oklab, var(--color-primary) 12%, transparent);
  --accent-line: color-mix(in oklab, var(--color-primary) 35%, transparent);
  --accent-fg: var(--color-primary-foreground);
  --orange: var(--color-status-warning);
  --orange-2: var(--color-status-warning-strong);
  --orange-soft: color-mix(in oklab, var(--color-status-warning) 14%, transparent);
  --green: var(--color-status-success-strong);
  --green-dot: var(--color-status-success);
  --green-soft: color-mix(in oklab, var(--color-status-success) 14%, transparent);
  --red: var(--color-status-error-strong);
  --red-soft: color-mix(in oklab, var(--color-status-error) 12%, transparent);
  /* «Ждёт вас» — status-pending: жёлтый, отличим от янтарного primary, которым отмечены действия. */
  --amber: var(--color-status-pending-strong);
  --amber-soft: color-mix(in oklab, var(--color-status-pending) 16%, transparent);
  --needs: var(--color-status-pending);
  --needs-fg: var(--color-status-pending-foreground);
  --sh-1: var(--shadow-xs); --sh-2: var(--shadow-sm); --sh-3: var(--shadow-lg);
  --scrim: rgb(0 0 0 / 0.5);
  --code: var(--color-foreground);
  /* Роли агентов — оттенки статусной палитры (−strong: контраст на фоне страницы в обеих темах). */
  --role-worker: var(--color-status-info-strong);
  --role-reviewer: var(--color-status-paused-strong);
  --role-orch: var(--color-status-success-strong);
  --role-ragent: color-mix(in oklab, var(--color-status-info-strong) 50%, var(--color-status-success-strong));
  --role-daemon: var(--color-status-neutral-strong);
  --role-op: var(--color-primary-text);
  /* Внешний агент — агент человека через MCP демона: не оператор и не агент роя. */
  --role-ext: var(--color-status-warning-strong);
}

/* ---------- База ---------- */
*, *::before, *::after { box-sizing: border-box; border-color: var(--color-border); }
html, body { height: 100%; }
:root { font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
body {
  margin: 0; background: var(--color-background); color: var(--color-foreground);
  font-family: var(--font-sans); font-size: 13px; line-height: 1.45; font-variant-numeric: tabular-nums;
}
h1, h2, h3, h4, p { margin: 0; }
h1, h2, h3, h4, .card-t { text-wrap: balance; }
a { color: var(--color-primary-text); text-decoration: none; text-underline-offset: 4px; }
a:hover { text-decoration: underline; }
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; margin: 0; cursor: pointer; text-align: inherit; }
button:disabled { cursor: default; }
input, textarea, select { font: inherit; color: inherit; }
b, strong { font-weight: 600; }
svg { flex: none; }
[hidden] { display: none !important; }
:focus { outline: none; }
/* Кольцо фокуса — ring/60, как focus-visible:ring-2 у примитивов дизайн-системы. */
:focus-visible { outline: 2px solid color-mix(in oklab, var(--color-ring) 60%, transparent); outline-offset: 1px; border-radius: var(--radius-sm); }
/* Светлая тема — кольцо целиком: ring/60 на белом даёт 2,5:1, ниже WCAG 2.2 (1.4.11 — 3:1), а тёмный ring без
   прозрачности — 5:1 на белом и 4,6:1 на muted (G5 аудита 02.11). В тёмной теме ring/60 — 3,4–3,9:1, как в SWARM. */
:root:not([data-theme="dark"]) :focus-visible { outline-color: var(--color-ring); }
::selection { background: color-mix(in oklab, var(--color-primary) 30%, transparent); }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: var(--color-muted-foreground); }
* { scrollbar-color: var(--color-border) transparent; scrollbar-width: thin; }

/* Наведение «с задержкой отпускания» (hover-linger): вход мгновенный, выход — 50 мс и 200 мс плавно. */
.hover-linger, .nav-item, .gt-row, .seg > button, .tabs > button, .icon-btn, .sess-item, .channel, .th-item, .diff-file, .menu-list > * {
  transition-property: color, background-color, border-color, box-shadow;
  transition-duration: 200ms; transition-timing-function: var(--ease-snappy); transition-delay: 50ms;
}
.hover-linger:hover, .nav-item:hover, .gt-row:hover, .seg > button:hover, .tabs > button:hover, .icon-btn:hover,
.sess-item:hover, .channel:hover, .th-item:hover, .diff-file:hover, .menu-list > :hover { transition-duration: 0s; transition-delay: 0s; }
/* Смена темы: один кадр без переходов (lib/theme.js), иначе палитра «перетекает» в каждом элементе. */
.theme-switching, .theme-switching *, .theme-switching *::before, .theme-switching *::after { transition: none !important; }

.mono { font-family: var(--font-mono); font-size: 12px; }
.mono-13 { font-family: var(--font-mono); font-size: 12.5px; }
.t2 { color: var(--color-foreground); } .t3 { color: var(--color-muted-foreground); } .t4 { color: var(--color-muted-foreground); }
.c-accent { color: var(--color-primary-text); } .c-red { color: var(--red); } .c-green { color: var(--green); } .c-amber { color: var(--amber); }
.small { font-size: 12px; } .fs-125 { font-size: 12.5px; }
.b600 { font-weight: 600; }
.ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.pretty { text-wrap: pretty; }
.num { text-align: right; font-variant-numeric: tabular-nums; }
.grow { flex: 1; min-width: 0; }
.row { display: flex; align-items: center; gap: 8px; min-width: 0; }
.col { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.wrap { flex-wrap: wrap; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.strike { text-decoration: line-through; color: var(--color-muted-foreground); }
.pre { white-space: pre-wrap; word-break: break-word; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition: none !important; animation: none !important; scroll-behavior: auto !important; }
}

/* Полоса прокрутки занимает 8 px, когда появляется, и содержимое прыгает вбок. Потоковые списки держат
   место под неё заранее (globals.css SWARM: scrollbar-gutter: stable у вертикальных прокруток). */
.transcript, .feed, .th-msgs, .th-items, .log, .asst-msgs, .sess-list, .channels, .drawer-b { scrollbar-gutter: stable; }
