/* ═══════════════════════════════════════════════════════════════════════════
 * КАДР — дизайн-система ComicsDB.ru
 * ───────────────────────────────────────────────────────────────────────────
 * Один файл, ноль сборки. Подключается вместо www/assets/css/theme.css
 * и работает поверх Bootstrap 5.3: все --bs-* переменные переопределены
 * ниже, так что готовая разметка (navbar, dropdown, offcanvas, modal)
 * продолжает работать, но выглядит уже по-нашему.
 *
 * Тема переключается тем же атрибутом, что и сейчас: data-bs-theme на <html>.
 * Класс-префикс — cdb-. Литералы цветов допустимы ТОЛЬКО в блоке токенов.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Unbounded */
@font-face { font-family: 'Unbounded'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/unbounded-600-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Unbounded'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/unbounded-600-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: 'Unbounded'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/unbounded-600-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: 'Unbounded'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/unbounded-600-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Unbounded'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/unbounded-700-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Unbounded'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/unbounded-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: 'Unbounded'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/unbounded-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: 'Unbounded'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/unbounded-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Unbounded'; font-style: normal; font-weight: 800; font-display: swap;
  src: url(/assets/fonts/unbounded-800-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Unbounded'; font-style: normal; font-weight: 800; font-display: swap;
  src: url(/assets/fonts/unbounded-800-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: 'Unbounded'; font-style: normal; font-weight: 800; font-display: swap;
  src: url(/assets/fonts/unbounded-800-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: 'Unbounded'; font-style: normal; font-weight: 800; font-display: swap;
  src: url(/assets/fonts/unbounded-800-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }

/* Golos Text */
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/golos-text-400-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/golos-text-400-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: 'Golos Text'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/golos-text-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: 'Golos Text'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/golos-text-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 500; font-display: swap;
  src: url(/assets/fonts/golos-text-500-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 500; font-display: swap;
  src: url(/assets/fonts/golos-text-500-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: 'Golos Text'; font-style: normal; font-weight: 500; font-display: swap;
  src: url(/assets/fonts/golos-text-500-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: 'Golos Text'; font-style: normal; font-weight: 500; font-display: swap;
  src: url(/assets/fonts/golos-text-500-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/golos-text-600-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/golos-text-600-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: 'Golos Text'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/golos-text-600-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: 'Golos Text'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/golos-text-600-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/golos-text-700-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Golos Text'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/golos-text-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: 'Golos Text'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/golos-text-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: 'Golos Text'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(/assets/fonts/golos-text-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }

/* JetBrains Mono */
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-400-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-400-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: 'JetBrains Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-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: 'JetBrains Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-600-cyrillic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-600-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: 'JetBrains Mono'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-600-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: 'JetBrains Mono'; font-style: normal; font-weight: 600; font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-600-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }

/* ── 1. Токены: светлая тема ─────────────────────────────────────────────── */
:root, [data-bs-theme="light"] {
  /* Бренд. Фиолетовый сохранён от прежней темы, шкала пересобрана в OKLCH:
     одинаковый шаг = одинаковая визуальная тяжесть в обеих темах */
  --cdb-violet-50:  #faf5fc;
  --cdb-violet-100: #f2e6f6;
  --cdb-violet-200: #e4cbeb;
  --cdb-violet-300: #cfa3da;
  --cdb-violet-400: #b06ec2;
  --cdb-violet-500: #8f3fa4;
  --cdb-violet-600: #7b2d8e;   /* якорь бренда — прежний primary */
  --cdb-violet-700: #632372;
  --cdb-violet-800: #4b1a57;
  --cdb-violet-900: #2f1038;

  /* Сигнал. Жёлтый с баннера сообщества: только для «новое», победителей
     и одиночных акцентов. Никогда — как фон текстового блока */
  --cdb-signal: #e8e51c;
  --cdb-signal-ink: #2f1038;

  /* Нейтрали с холодно-фиолетовым подмесом: рядом с обложками
     чистый серый выглядит грязным */
  --cdb-ink-0:   #ffffff;
  --cdb-ink-50:  #f7f6f9;
  --cdb-ink-100: #eeecf2;
  --cdb-ink-200: #e0dde6;
  --cdb-ink-300: #c9c4d1;
  --cdb-ink-400: #a29cad;
  --cdb-ink-500: #7c7686;
  --cdb-ink-600: #5d5768;
  --cdb-ink-700: #423d4c;
  --cdb-ink-800: #2b2733;
  --cdb-ink-900: #17141c;

  /* Семантика */
  --cdb-ok:     #157f4a;  --cdb-ok-bg:     #e3f5ea;
  --cdb-warn:   #8a5a00;  --cdb-warn-bg:   #fdf1d8;
  --cdb-alert:  #b3261e;  --cdb-alert-bg:  #fbe6e4;
  --cdb-info:   #1d5f96;  --cdb-info-bg:   #e2eef9;

  /* Роли */
  --cdb-bg:          var(--cdb-ink-50);
  --cdb-bg-sunken:   var(--cdb-ink-100);
  --cdb-surface:     var(--cdb-ink-0);
  --cdb-surface-2:   var(--cdb-ink-50);
  --cdb-text:        var(--cdb-ink-900);
  --cdb-text-soft:   var(--cdb-ink-600);
  --cdb-text-faint:  var(--cdb-ink-500);
  --cdb-on-brand:    #ffffff;
  --cdb-line:        var(--cdb-ink-200);
  --cdb-line-strong: var(--cdb-ink-300);
  --cdb-brand:       var(--cdb-violet-600);
  --cdb-brand-hover: var(--cdb-violet-700);
  --cdb-brand-soft:  var(--cdb-violet-100);
  --cdb-brand-text:  var(--cdb-violet-700);   /* фиолетовый как текст: 6.4:1 на surface */

  /* RGB-тройки для моста Bootstrap (rgba(var(--bs-*-rgb), α)) */
  --cdb-brand-rgb: 123, 45, 142;      /* violet-600 */
  --cdb-secondary-rgb: 93, 87, 104;   /* ink-600 */
  --cdb-light-rgb: 238, 236, 242;     /* ink-100 */
  --cdb-link-rgb: 99, 35, 114;        /* violet-700 */
  --cdb-link-hover-rgb: 143, 63, 164; /* violet-500 */
  --cdb-link:        var(--cdb-violet-700);
  --cdb-link-hover:  var(--cdb-violet-500);
  --cdb-visited:     var(--cdb-violet-500);

  /* Статусы перевода серии — те же четыре, что в коде (continue/freez/finish/unknown) */
  --cdb-status-continue: #157f4a;
  --cdb-status-freez:    #1d5f96;
  --cdb-status-finish:   var(--cdb-violet-600);
  --cdb-status-unknown:  var(--cdb-ink-400);

  /* Типографика */
  --cdb-font-display: "Unbounded", system-ui, sans-serif;
  --cdb-font-ui: "Golos Text", system-ui, -apple-system, sans-serif;
  --cdb-font-mono: "JetBrains Mono", ui-monospace, monospace;

  --cdb-size-hero:  clamp(34px, 4.2vw, 56px);
  --cdb-size-h1:    clamp(26px, 2.6vw, 34px);
  --cdb-size-h2:    22px;
  --cdb-size-h3:    17px;
  --cdb-size-body:  15px;
  --cdb-size-sm:    13px;
  --cdb-size-xs:    11.5px;
  --cdb-kicker-tracking: .14em;

  /* Шаг 4px. Плотность интерфейса — как в базе данных, а не в лендинге */
  --cdb-s1: 4px;  --cdb-s2: 8px;  --cdb-s3: 12px; --cdb-s4: 16px;
  --cdb-s5: 24px; --cdb-s6: 32px; --cdb-s7: 48px; --cdb-s8: 64px;

  /* Радиусы: обложки и данные — почти прямые углы, управление — мягче */
  --cdb-r-xs: 3px; --cdb-r-sm: 6px; --cdb-r-md: 10px; --cdb-r-lg: 16px; --cdb-r-pill: 999px;

  /* Высота: рамка + очень мягкая тень. Тяжёлых теней в системе нет */
  --cdb-e1: 0 1px 2px rgba(23, 20, 28, .06);
  --cdb-e2: 0 2px 8px rgba(23, 20, 28, .08), 0 1px 2px rgba(23, 20, 28, .05);
  --cdb-e3: 0 12px 32px rgba(23, 20, 28, .14);
  --cdb-ring: 0 0 0 3px color-mix(in srgb, var(--cdb-brand) 28%, transparent);

  /* Движение */
  --cdb-fast: 120ms; --cdb-base: 200ms; --cdb-slow: 380ms;
  --cdb-ease: cubic-bezier(.2, .7, .25, 1);

  --cdb-nav-h: 56px;
  --cdb-maxw: 1400px;
}

/* ── 1. Токены: светлая тема ─────────────────────────────────────────────── */
:root, [data-bs-theme="light"] {
  /* Бренд. Фиолетовый сохранён от прежней темы, шкала пересобрана в OKLCH:
     одинаковый шаг = одинаковая визуальная тяжесть в обеих темах */
  --cdb-violet-50:  #faf5fc;
  --cdb-violet-100: #f2e6f6;
  --cdb-violet-200: #e4cbeb;
  --cdb-violet-300: #cfa3da;
  --cdb-violet-400: #b06ec2;
  --cdb-violet-500: #8f3fa4;
  --cdb-violet-600: #7b2d8e;   /* якорь бренда — прежний primary */
  --cdb-violet-700: #632372;
  --cdb-violet-800: #4b1a57;
  --cdb-violet-900: #2f1038;

  /* Сигнал. Жёлтый с баннера сообщества: только для «новое», победителей
     и одиночных акцентов. Никогда — как фон текстового блока */
  --cdb-signal: #e8e51c;
  --cdb-signal-ink: #2f1038;

  /* Нейтрали с холодно-фиолетовым подмесом: рядом с обложками
     чистый серый выглядит грязным */
  --cdb-ink-0:   #ffffff;
  --cdb-ink-50:  #f7f6f9;
  --cdb-ink-100: #eeecf2;
  --cdb-ink-200: #e0dde6;
  --cdb-ink-300: #c9c4d1;
  --cdb-ink-400: #a29cad;
  --cdb-ink-500: #7c7686;
  --cdb-ink-600: #5d5768;
  --cdb-ink-700: #423d4c;
  --cdb-ink-800: #2b2733;
  --cdb-ink-900: #17141c;

  /* Семантика */
  --cdb-ok:     #157f4a;  --cdb-ok-bg:     #e3f5ea;
  --cdb-warn:   #8a5a00;  --cdb-warn-bg:   #fdf1d8;
  --cdb-alert:  #b3261e;  --cdb-alert-bg:  #fbe6e4;
  --cdb-info:   #1d5f96;  --cdb-info-bg:   #e2eef9;

  /* Роли */
  --cdb-bg:          var(--cdb-ink-50);
  --cdb-bg-sunken:   var(--cdb-ink-100);
  --cdb-surface:     var(--cdb-ink-0);
  --cdb-surface-2:   var(--cdb-ink-50);
  --cdb-text:        var(--cdb-ink-900);
  --cdb-text-soft:   var(--cdb-ink-600);
  --cdb-text-faint:  var(--cdb-ink-500);
  --cdb-on-brand:    #ffffff;
  --cdb-line:        var(--cdb-ink-200);
  --cdb-line-strong: var(--cdb-ink-300);
  --cdb-brand:       var(--cdb-violet-600);
  --cdb-brand-hover: var(--cdb-violet-700);
  --cdb-brand-soft:  var(--cdb-violet-100);
  --cdb-brand-text:  var(--cdb-violet-700);   /* фиолетовый как текст: 6.4:1 на surface */

  /* RGB-тройки для моста Bootstrap (rgba(var(--bs-*-rgb), α)) */
  --cdb-brand-rgb: 123, 45, 142;      /* violet-600 */
  --cdb-secondary-rgb: 93, 87, 104;   /* ink-600 */
  --cdb-light-rgb: 238, 236, 242;     /* ink-100 */
  --cdb-link-rgb: 99, 35, 114;        /* violet-700 */
  --cdb-link-hover-rgb: 143, 63, 164; /* violet-500 */
  --cdb-link:        var(--cdb-violet-700);
  --cdb-link-hover:  var(--cdb-violet-500);
  --cdb-visited:     var(--cdb-violet-500);

  /* Статусы перевода серии — те же четыре, что в коде (continue/freez/finish/unknown) */
  --cdb-status-continue: #157f4a;
  --cdb-status-freez:    #1d5f96;
  --cdb-status-finish:   var(--cdb-violet-600);
  --cdb-status-unknown:  var(--cdb-ink-400);

  /* Типографика */
  --cdb-font-display: "Unbounded", system-ui, sans-serif;
  --cdb-font-ui: "Golos Text", system-ui, -apple-system, sans-serif;
  --cdb-font-mono: "JetBrains Mono", ui-monospace, monospace;

  --cdb-size-hero:  clamp(34px, 4.2vw, 56px);
  --cdb-size-h1:    clamp(26px, 2.6vw, 34px);
  --cdb-size-h2:    22px;
  --cdb-size-h3:    17px;
  --cdb-size-body:  15px;
  --cdb-size-sm:    13px;
  --cdb-size-xs:    11.5px;
  --cdb-kicker-tracking: .14em;

  /* Шаг 4px. Плотность интерфейса — как в базе данных, а не в лендинге */
  --cdb-s1: 4px;  --cdb-s2: 8px;  --cdb-s3: 12px; --cdb-s4: 16px;
  --cdb-s5: 24px; --cdb-s6: 32px; --cdb-s7: 48px; --cdb-s8: 64px;

  /* Радиусы: обложки и данные — почти прямые углы, управление — мягче */
  --cdb-r-xs: 3px; --cdb-r-sm: 6px; --cdb-r-md: 10px; --cdb-r-lg: 16px; --cdb-r-pill: 999px;

  /* Высота: рамка + очень мягкая тень. Тяжёлых теней в системе нет */
  --cdb-e1: 0 1px 2px rgba(23, 20, 28, .06);
  --cdb-e2: 0 2px 8px rgba(23, 20, 28, .08), 0 1px 2px rgba(23, 20, 28, .05);
  --cdb-e3: 0 12px 32px rgba(23, 20, 28, .14);
  --cdb-ring: 0 0 0 3px color-mix(in srgb, var(--cdb-brand) 28%, transparent);

  /* Движение */
  --cdb-fast: 120ms; --cdb-base: 200ms; --cdb-slow: 380ms;
  --cdb-ease: cubic-bezier(.2, .7, .25, 1);

  --cdb-nav-h: 56px;
  --cdb-maxw: 1400px;
}

/* ── 2. Токены: тёмная тема. Меняются значения, роли — нет ───────────────── */
[data-bs-theme="dark"] {
  --cdb-violet-50:  #1b1421;
  --cdb-violet-100: #2a1e33;
  --cdb-violet-200: #3b2a47;
  --cdb-violet-300: #5b3f6c;
  --cdb-violet-400: #8b5da0;
  --cdb-violet-500: #b478c9;
  --cdb-violet-600: #c68fd9;
  --cdb-violet-700: #dcb4e9;
  --cdb-violet-800: #ecd6f4;
  --cdb-violet-900: #f8effb;

  --cdb-ink-0:   #17141c;
  --cdb-ink-50:  #100e14;
  --cdb-ink-100: #1e1a24;
  --cdb-ink-200: #2b2633;
  --cdb-ink-300: #3b3547;
  --cdb-ink-400: #5c5568;
  --cdb-ink-500: #8b8397;
  --cdb-ink-600: #aaa2b6;
  --cdb-ink-700: #c9c3d2;
  --cdb-ink-800: #e2dee8;
  --cdb-ink-900: #f5f2f8;

  --cdb-ok:     #5fd695;  --cdb-ok-bg:     #12271c;
  --cdb-warn:   #e8c46a;  --cdb-warn-bg:   #2b2210;
  --cdb-alert:  #f39b95;  --cdb-alert-bg:  #2e1614;
  --cdb-info:   #7fb8e6;  --cdb-info-bg:   #12222e;

  --cdb-bg:          var(--cdb-ink-50);
  --cdb-bg-sunken:   #0a090d;
  --cdb-surface:     var(--cdb-ink-0);
  --cdb-surface-2:   var(--cdb-ink-100);
  /* Роли, ссылающиеся на ink-*, обязаны повторяться здесь: значение
     custom property подставляется на том элементе, где объявлено, —
     переопределения одной только шкалы ink-* недостаточно */
  --cdb-text:        var(--cdb-ink-900);
  --cdb-text-soft:   var(--cdb-ink-600);
  --cdb-text-faint:  var(--cdb-ink-500);
  --cdb-on-brand:    #ffffff;
  --cdb-line:        var(--cdb-ink-200);
  --cdb-line-strong: var(--cdb-ink-300);
  /* Кнопке на тёмном нужен насыщенный фон, надписи — светлый тон */
  --cdb-brand:       #9b4fb0;
  --cdb-brand-hover: #ac60c1;
  --cdb-brand-rgb: 155, 79, 176;
  --cdb-secondary-rgb: 170, 162, 182;
  --cdb-light-rgb: 30, 26, 36;
  --cdb-link-rgb: 198, 143, 217;
  --cdb-link-hover-rgb: 220, 180, 233;
  --cdb-brand-soft:  var(--cdb-violet-100);
  --cdb-brand-text:  var(--cdb-violet-600);
  --cdb-link:        var(--cdb-violet-600);
  --cdb-link-hover:  var(--cdb-violet-700);
  --cdb-visited:     var(--cdb-violet-500);

  --cdb-status-continue: #5fd695;
  --cdb-status-freez:    #7fb8e6;
  --cdb-status-finish:   #c68fd9;
  --cdb-status-unknown:  var(--cdb-ink-400);

  --cdb-e1: 0 1px 2px rgba(0, 0, 0, .5);
  --cdb-e2: 0 2px 8px rgba(0, 0, 0, .55);
  --cdb-e3: 0 12px 32px rgba(0, 0, 0, .6);
}

/* ── 3. Мост в Bootstrap 5.3 ─────────────────────────────────────────────── */
:root, [data-bs-theme="light"], [data-bs-theme="dark"] {
  --bs-body-bg: var(--cdb-bg);
  --bs-body-color: var(--cdb-text);
  --bs-body-font-family: var(--cdb-font-ui);
  --bs-body-font-size: var(--cdb-size-body);
  --bs-body-line-height: 1.5;
  --bs-primary: var(--cdb-brand);
  --bs-link-color: var(--cdb-link);
  --bs-link-hover-color: var(--cdb-link-hover);
  --bs-border-color: var(--cdb-line);
  --bs-border-radius: var(--cdb-r-sm);
  --bs-border-radius-sm: var(--cdb-r-xs);
  --bs-border-radius-lg: var(--cdb-r-md);
  --bs-secondary-color: var(--cdb-text-soft);
  --bs-emphasis-color: var(--cdb-text);
  --bs-primary-rgb: var(--cdb-brand-rgb);
  --bs-secondary-rgb: var(--cdb-secondary-rgb);
  --bs-light-rgb: var(--cdb-light-rgb);
  --bs-link-color-rgb: var(--cdb-link-rgb);
  --bs-link-hover-color-rgb: var(--cdb-link-hover-rgb);
  --bs-success-text-emphasis: var(--cdb-ok);
  --bs-info-text-emphasis: var(--cdb-info);
  --bs-warning-text-emphasis: var(--cdb-warn);
  --bs-danger-text-emphasis: var(--cdb-alert);
  --bs-font-monospace: var(--cdb-font-mono);
  --bs-bg-opacity: 1;
}

/* Компонентные --bs-* Bootstrap объявляет на самих компонентах (.btn-primary
   и т.д.) — переопределение в :root они бы перекрыли. Поэтому мост здесь
   повторяет селекторы Bootstrap с той же специфичностью */
.btn {
  --bs-btn-border-radius: var(--cdb-r-sm);
  --bs-btn-font-weight: 600;
  --bs-btn-focus-box-shadow: var(--cdb-ring);
}
.btn-primary {
  --bs-btn-bg: var(--cdb-brand);
  --bs-btn-color: var(--cdb-on-brand);
  --bs-btn-border-color: var(--cdb-brand);
  --bs-btn-hover-bg: var(--cdb-brand-hover);
  --bs-btn-hover-color: var(--cdb-on-brand);
  --bs-btn-hover-border-color: var(--cdb-brand-hover);
  --bs-btn-active-bg: var(--cdb-brand-hover);
  --bs-btn-active-color: var(--cdb-on-brand);
  --bs-btn-active-border-color: var(--cdb-brand-hover);
  --bs-btn-disabled-bg: var(--cdb-bg-sunken);
  --bs-btn-disabled-color: var(--cdb-text-faint);
  --bs-btn-disabled-border-color: var(--cdb-line);
}
.table {
  --bs-table-bg: var(--cdb-surface);
  --bs-table-color: var(--cdb-text);
  --bs-table-bg-state: var(--cdb-brand-soft);
  --bs-table-color-state: var(--cdb-text);
  --bs-table-hover-bg: var(--cdb-surface-2);
  --bs-table-striped-bg: var(--cdb-surface-2);
}
.dropdown-menu {
  --bs-dropdown-bg: var(--cdb-surface);
  --bs-dropdown-border-color: var(--cdb-line);
  --bs-dropdown-link-color: var(--cdb-text);
  --bs-dropdown-link-hover-bg: var(--cdb-surface-2);
  --bs-dropdown-link-hover-color: var(--cdb-text);
  --bs-dropdown-link-active-bg: var(--cdb-brand);
}
.nav-tabs {
  --bs-nav-tabs-border-color: var(--cdb-line);
  --bs-nav-tabs-link-active-bg: var(--cdb-surface);
  --bs-nav-tabs-link-active-color: var(--cdb-text);
  --bs-nav-tabs-link-active-border-color: var(--cdb-line);
}
.nav-pills { --bs-nav-pills-link-active-bg: var(--cdb-brand); }
.navbar {
  --bs-navbar-color: var(--cdb-text-soft);
  --bs-navbar-hover-color: var(--cdb-text);
  --bs-navbar-active-color: var(--cdb-text);
}
.pagination {
  --bs-pagination-active-bg: var(--cdb-brand);
  --bs-pagination-active-border-color: var(--cdb-brand);
}
.card { --bs-card-cap-bg: var(--cdb-surface-2); }
.offcanvas, .offcanvas-bottom { --bs-offcanvas-height: 40vh; }

/* ── 4. База ─────────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
body {
  margin: 0; background: var(--cdb-bg); color: var(--cdb-text);
  font-family: var(--cdb-font-ui); font-size: var(--cdb-size-body);
  line-height: 1.5; -webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4, h5, h6 { margin: 0 0 var(--cdb-s2); line-height: 1.1; }
h1, h2 { font-family: var(--cdb-font-display); font-weight: 700; letter-spacing: -.02em; }
h3, h4, h5, h6 { font-family: var(--cdb-font-ui); font-weight: 600; letter-spacing: -.01em; }
p { margin: 0 0 var(--cdb-s3); }
img { display: block; max-width: 100%; }
a { color: var(--cdb-link); text-decoration: none; text-underline-offset: 3px; }
a:hover { color: var(--cdb-link-hover); text-decoration: underline; }
:focus { outline: none; }
:focus-visible { outline: 2px solid var(--cdb-brand); outline-offset: 2px; border-radius: var(--cdb-r-xs); }
::selection { background: color-mix(in srgb, var(--cdb-brand) 26%, transparent); }
[x-cloak] { display: none !important; }
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; } }

/* Иконки — FontAwesome 4, тот же набор, что уже подключён на сайте.
   Никаких эмодзи: они цветные и выпадают из монохромной палитры */
.fa { line-height: 1; }
.cdb-btn .fa, .cdb-nav .fa, .cdb-tag .fa, .cdb-chip .fa { font-size: 1em; }

.cdb-hero    { font-family: var(--cdb-font-display); font-weight: 800; font-size: var(--cdb-size-hero); line-height: .98; letter-spacing: -.035em; margin: 0; }
.cdb-kicker  { font-family: var(--cdb-font-ui); font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-text-soft); }
.cdb-mono    { font-family: var(--cdb-font-mono); font-variant-numeric: tabular-nums; }
.cdb-num     { font-family: var(--cdb-font-mono); font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.cdb-muted   { color: var(--cdb-text-soft); }
.cdb-faint   { color: var(--cdb-text-faint); }
.cdb-rule    { height: 1px; background: var(--cdb-line); border: 0; margin: var(--cdb-s5) 0; }
.cdb-rule--strong { height: 2px; background: var(--cdb-text); }

/* ── 5. Кнопки ───────────────────────────────────────────────────────────── */
.cdb-btn {
  position: relative;
  display: inline-flex; align-items: center; justify-content: center; gap: var(--cdb-s2);
  min-height: 36px; padding: 0 var(--cdb-s4);
  font-family: var(--cdb-font-ui); font-size: var(--cdb-size-sm); font-weight: 600;
  color: var(--cdb-text); background: var(--cdb-surface);
  border: 1px solid var(--cdb-line-strong); border-radius: var(--cdb-r-sm);
  cursor: pointer; text-decoration: none; white-space: nowrap;
  transition: background var(--cdb-fast) var(--cdb-ease), border-color var(--cdb-fast) var(--cdb-ease), color var(--cdb-fast) var(--cdb-ease);
}
.cdb-btn:hover { background: var(--cdb-bg-sunken); color: var(--cdb-text); text-decoration: none; }
.cdb-btn:active { background: var(--cdb-ink-200); }
.cdb-btn:disabled, .cdb-btn[aria-disabled="true"] { opacity: .45; pointer-events: none; }
.cdb-btn--primary { background: var(--cdb-brand); border-color: var(--cdb-brand); color: var(--cdb-on-brand); }
.cdb-btn--primary:hover { background: var(--cdb-brand-hover); border-color: var(--cdb-brand-hover); color: var(--cdb-on-brand); }
.cdb-btn--primary:active { background: var(--cdb-violet-800); }
.cdb-btn--ghost { background: transparent; border-color: transparent; color: var(--cdb-brand-text); }
.cdb-btn--ghost:hover { background: var(--cdb-brand-soft); }
/* Включённое состояние кнопки-переключателя («прочитано», активный фильтр).
   Держит рамку и размер: ghost без рамки читался как кнопка другого размера */
.cdb-btn--on { background: var(--cdb-brand-soft); border-color: var(--cdb-brand); color: var(--cdb-brand-text); }
.cdb-btn--on:hover { background: var(--cdb-brand-soft); border-color: var(--cdb-brand-hover); color: var(--cdb-brand-text); }
.cdb-btn--danger { background: transparent; border-color: color-mix(in srgb, var(--cdb-alert) 45%, transparent); color: var(--cdb-alert); }
.cdb-btn--danger:hover { background: var(--cdb-alert-bg); color: var(--cdb-alert); }
.cdb-btn--signal { background: var(--cdb-signal); border-color: var(--cdb-signal); color: var(--cdb-signal-ink); }
/* «Ссылки нет» — не ошибка страницы, а отсутствующие данные и повод сообщить о них.
   Пунктирная рамка в размер соседних кнопок: колонка остаётся однородной,
   а красный остаётся только на иконке */
.cdb-btn--empty { background: transparent; border-style: dashed; border-color: var(--cdb-line-strong); color: var(--cdb-text-soft); }
.cdb-btn--empty .fa { color: var(--cdb-alert); }
.cdb-btn--empty:hover { background: var(--cdb-alert-bg); border-color: color-mix(in srgb, var(--cdb-alert) 45%, transparent); color: var(--cdb-alert); }
.cdb-btn--sm { min-height: 28px; padding: 0 var(--cdb-s3); font-size: var(--cdb-size-xs); }
.cdb-btn--lg { min-height: 46px; padding: 0 var(--cdb-s5); font-size: var(--cdb-size-body); }
.cdb-btn--icon { width: 36px; padding: 0; }
.cdb-btn--sm.cdb-btn--icon { width: 28px; }
.cdb-btn--lg.cdb-btn--icon { width: 46px; }
.cdb-btn--block { width: 100%; }
.cdb-btn__group { display: inline-flex; }
.cdb-btn__group .cdb-btn { border-radius: 0; margin-left: -1px; }
.cdb-btn__group .cdb-btn:first-child { border-radius: var(--cdb-r-sm) 0 0 var(--cdb-r-sm); margin-left: 0; }
.cdb-btn__group .cdb-btn:last-child { border-radius: 0 var(--cdb-r-sm) var(--cdb-r-sm) 0; }

/* ── 6. Метки и чипы ─────────────────────────────────────────────────────── */
.cdb-tag {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 8px; min-height: 22px; font-size: var(--cdb-size-xs); font-weight: 600;
  /* Радиус совпадает с кнопкой: метка и кнопка часто стоят в одной колонке,
     и разные скругления читаются как дефект вёрстки, а не как иерархия */
  border-radius: var(--cdb-r-sm); background: var(--cdb-bg-sunken); color: var(--cdb-text-soft);
  border: 1px solid transparent;
}
.cdb-tag--brand   { background: var(--cdb-brand-soft); color: var(--cdb-brand-text); }
.cdb-tag--signal  { background: var(--cdb-signal); color: var(--cdb-signal-ink); letter-spacing: .06em; text-transform: uppercase; }
.cdb-tag--outline { background: transparent; border-color: var(--cdb-line-strong); color: var(--cdb-text-soft); }
.cdb-tag--ok      { background: var(--cdb-ok-bg); color: var(--cdb-ok); }
.cdb-tag--alert   { background: var(--cdb-alert-bg); color: var(--cdb-alert); }
/* Метка на месте кнопки (нет ссылки на перевод) — та же высота и радиус,
   чтобы колонка действий не «дышала» */
.cdb-tag--slot    { min-height: 28px; padding: 0 10px; justify-content: center; }
.cdb-chips { display: flex; flex-wrap: wrap; gap: var(--cdb-s2); }
.cdb-chip {
  display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px;
  font-size: var(--cdb-size-sm); border-radius: var(--cdb-r-pill);
  background: var(--cdb-surface); border: 1px solid var(--cdb-line); color: var(--cdb-text);
  cursor: pointer; transition: all var(--cdb-fast) var(--cdb-ease);
}
.cdb-chip:hover { border-color: var(--cdb-brand); color: var(--cdb-brand-text); text-decoration: none; }
.cdb-chip[aria-pressed="true"], .cdb-chip[aria-current] { background: var(--cdb-brand); border-color: var(--cdb-brand); color: var(--cdb-on-brand); }
.cdb-chip__n { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-chip[aria-pressed="true"] .cdb-chip__n, .cdb-chip[aria-current] .cdb-chip__n { color: color-mix(in srgb, var(--cdb-on-brand) 75%, transparent); }

/* Точка статуса перевода серии */
.cdb-status { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; background: var(--cdb-status-unknown); }
.cdb-status--continue { background: var(--cdb-status-continue); }
.cdb-status--freez    { background: var(--cdb-status-freez); }
.cdb-status--finish   { background: var(--cdb-status-finish); }

/* ── 7. Обложка — центральный объект системы ─────────────────────────────── */
.cdb-cover { position: relative; display: block; border-radius: var(--cdb-r-sm); overflow: hidden; background: var(--cdb-bg-sunken); }
.cdb-cover img { width: 100%; aspect-ratio: 2 / 3; object-fit: cover; transition: transform var(--cdb-slow) var(--cdb-ease); }
.cdb-cover::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 1px rgba(23, 20, 28, .16); pointer-events: none; }
a.cdb-cover:hover img { transform: scale(1.035); }
.cdb-cover__num {
  position: absolute; left: 0; bottom: 0; padding: 3px 8px;
  font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); font-weight: 600;
  background: var(--cdb-ink-900); color: var(--cdb-ink-0);
  border-radius: 0 var(--cdb-r-xs) 0 0;
}
.cdb-cover__flag {
  position: absolute; top: var(--cdb-s2); right: var(--cdb-s2);
  display: inline-flex; align-items: center; gap: 4px; padding: 2px 7px;
  font-size: var(--cdb-size-xs); font-weight: 600; border-radius: var(--cdb-r-xs);
  background: var(--cdb-signal); color: var(--cdb-signal-ink);
}
.cdb-cover__read { position: absolute; top: var(--cdb-s2); left: var(--cdb-s2); width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; background: var(--cdb-brand); color: var(--cdb-on-brand); font-size: 11px; }
.cdb-cover--read img { opacity: .55; }
.cdb-cover-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(124px, 1fr)); gap: var(--cdb-s4); }
.cdb-tile { display: flex; flex-direction: column; gap: 6px; }
.cdb-tile__title { font-size: var(--cdb-size-sm); font-weight: 600; line-height: 1.25; color: var(--cdb-text); }
.cdb-tile__meta { font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }

/* Горизонтальная лента обложек — «Новое в моих сериях» и любые ряды на телефоне.
   Прокрутка вбок вместо переноса: ряд обязан читаться как «ещё есть правее» */
/* flex: none обязателен: strip часто лежит внутри flex-колонки, а overflow-x:auto
   обнуляет его автоминимум — колонка ужимает ленту в полоску скроллбара */
.cdb-strip { display: flex; flex: none; align-items: stretch; gap: var(--cdb-s3); overflow-x: auto; padding-bottom: 6px; scrollbar-width: thin; scroll-snap-type: x proximity; }
.cdb-strip > * { flex: none; scroll-snap-align: start; }
/* Подписи в ленте разной длины — кнопку прижимаем к низу, иначе ряд «разъезжается» */
.cdb-strip > .cdb-tile { display: flex; flex-direction: column; }
.cdb-strip > .cdb-tile > .cdb-btn, .cdb-strip > .cdb-tile > .cdb-meter { margin-top: auto; }
.cdb-strip::-webkit-scrollbar { height: 6px; }
.cdb-strip::-webkit-scrollbar-thumb { background: var(--cdb-line-strong); border-radius: var(--cdb-r-pill); }
.cdb-strip__more { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; border: 1px dashed var(--cdb-line-strong); border-radius: var(--cdb-r-sm); color: var(--cdb-brand-text); font-size: var(--cdb-size-sm); font-weight: 600; }

/* ── 8. Поверхности ──────────────────────────────────────────────────────── */
.cdb-card {
  background: var(--cdb-surface); border: 1px solid var(--cdb-line);
  border-radius: var(--cdb-r-md); box-shadow: var(--cdb-e1);
}
.cdb-card--flat { box-shadow: none; }
.cdb-card--hover { transition: border-color var(--cdb-fast) var(--cdb-ease), box-shadow var(--cdb-fast) var(--cdb-ease); }
.cdb-card--hover:hover { border-color: var(--cdb-line-strong); box-shadow: var(--cdb-e2); }
.cdb-panel { background: var(--cdb-surface); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); padding: var(--cdb-s4); }
.cdb-panel__head { display: flex; align-items: center; gap: var(--cdb-s2); padding-bottom: var(--cdb-s3); margin-bottom: var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); }
.cdb-panel__title { font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-text-soft); margin: 0; }
.cdb-panel__more { margin-left: auto; font-size: var(--cdb-size-xs); font-weight: 600; }
/* Фиолетовое поле — единственное место, где бренд идёт заливкой */
.cdb-poster { background: var(--cdb-violet-600); color: #fff; border-radius: var(--cdb-r-md); padding: var(--cdb-s5); }
.cdb-poster .cdb-kicker { color: var(--cdb-signal); }
.cdb-poster a { color: #fff; text-decoration: underline; }

/* Строка выпуска — основная единица списков переводов (неделя, серия, поиск).
   Не таблица: на телефоне таблица из шести колонок нечитаема, а строка
   переносит действия под заголовок без переверстки */
.cdb-issue { display: grid; grid-template-columns: 48px minmax(0, 1fr) auto auto; gap: var(--cdb-s3); align-items: center; padding: 7px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); transition: background var(--cdb-fast) var(--cdb-ease); }
.cdb-issue:last-child { border-bottom: 0; }
.cdb-issue:hover { background: var(--cdb-brand-soft); }
.cdb-issue__title { display: block; font-weight: 600; font-size: var(--cdb-size-sm); color: var(--cdb-text); }
.cdb-issue__title:hover { color: var(--cdb-brand-text); }
.cdb-issue__meta { font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-issue__actions { display: flex; gap: 2px; }
.cdb-issue--read .cdb-issue__title, .cdb-issue--read .cdb-issue__meta { color: var(--cdb-text-faint); }
.cdb-issue--read .cdb-cover img { opacity: .5; }
/* Заголовок дня внутри списка: единственная группировка на главной и в неделях */
.cdb-daygroup { margin: 0; padding: var(--cdb-s3) var(--cdb-s3) var(--cdb-s2); font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-text-soft); background: var(--cdb-surface-2); border-bottom: 1px solid var(--cdb-line); }
.cdb-daygroup + .cdb-issue { border-top: 0; }
.cdb-issue + .cdb-daygroup { border-top: 1px solid var(--cdb-line); }
/* Панель инструментов списка: фильтр + счётчик найденного */
.cdb-listbar { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3); background: var(--cdb-surface-2); border-bottom: 1px solid var(--cdb-line); }
.cdb-listbar .cdb-search { flex: 1; min-height: 32px; max-width: 380px; }
.cdb-listbar__count { margin-left: auto; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-sm); color: var(--cdb-text-faint); }

/* Нижняя шторка мобильной навигации (offcanvas-bottom в разметке Bootstrap) */
.cdb-sheet { background: var(--cdb-surface); border-radius: var(--cdb-r-lg) var(--cdb-r-lg) 0 0; box-shadow: 0 -12px 40px rgba(0, 0, 0, .28); padding: 6px 0 calc(var(--cdb-s8) + 18px); }
.cdb-sheet--full { border-radius: 0; padding-top: 0; }
.cdb-sheet__grip { display: block; width: 38px; height: 4px; border-radius: var(--cdb-r-pill); background: var(--cdb-line-strong); margin: 4px auto var(--cdb-s3); }
.cdb-sheet__head { display: flex; align-items: center; gap: var(--cdb-s3); padding: 0 var(--cdb-s5) var(--cdb-s3); }
.cdb-sheet__head h3 { margin: 0; font-size: var(--cdb-size-h3); }
.cdb-sheet__list { list-style: none; margin: 0; padding: 0; }
.cdb-sheet__list a { display: flex; align-items: center; gap: var(--cdb-s3); padding: 13px var(--cdb-s5); font-size: var(--cdb-size-body); color: var(--cdb-text); border-bottom: 1px solid var(--cdb-line); min-height: 48px; }
.cdb-sheet__list a:hover { text-decoration: none; background: var(--cdb-bg-sunken); }
.cdb-sheet__list a.is-active { color: var(--cdb-brand-text); font-weight: 600; }
.cdb-sheet__subtitle { margin: var(--cdb-s5) 0 0; padding: 0 var(--cdb-s5) var(--cdb-s2); font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-text-soft); }

/* Слот баннера: место команды под собственный креатив — рамка, а не заливка,
   чтобы пустой слот не выглядел сломанным блоком */
.cdb-slot { display: grid; place-items: center; text-align: center; border: 1px dashed var(--cdb-line-strong); border-radius: var(--cdb-r-md); color: var(--cdb-text-faint); font-size: var(--cdb-size-sm); padding: var(--cdb-s4); }
.cdb-slot:hover { border-color: var(--cdb-brand); color: var(--cdb-brand-text); text-decoration: none; }

/* ── 9. Данные: факты и таблицы ──────────────────────────────────────────── */
.cdb-facts { display: grid; grid-template-columns: auto 1fr; gap: var(--cdb-s2) var(--cdb-s4); margin: 0; font-size: var(--cdb-size-sm); }
.cdb-facts dt { font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--cdb-text-faint); padding-top: 2px; }
.cdb-facts dd { margin: 0; }

/* Обёртка широкой таблицы (issue-table-wrap в исходной вёрстке): на узком экране
   таблица прокручивается вбок вместо того, чтобы обрезаться по краю карточки.
   Скругления гасим у обёртки, а не у карточки — иначе угол таблицы вылезает.
   overflow-x: auto делает обёртку контейнером прокрутки и по обеим осям, поэтому
   она перехватывает sticky-контекст: смещение th, рассчитанное на липкую шапку
   страницы, увело бы шапку таблицы на 56px внутрь и положило на первую строку */
.cdb-tablewrap { overflow-x: auto; overflow-y: visible; border-radius: inherit; scrollbar-width: thin; }
.cdb-tablewrap .cdb-table th { top: 0; }
.cdb-tablewrap::-webkit-scrollbar { height: 6px; }
.cdb-tablewrap::-webkit-scrollbar-thumb { background: var(--cdb-line-strong); border-radius: var(--cdb-r-pill); }
.cdb-tablewrap > table { min-width: 100%; }

.cdb-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--cdb-size-sm); }
.cdb-table th {
  position: sticky; top: var(--cdb-nav-h); z-index: 2; text-align: left;
  padding: var(--cdb-s2) var(--cdb-s3); font-size: var(--cdb-size-xs); font-weight: 600;
  letter-spacing: .06em; text-transform: uppercase; color: var(--cdb-text-soft);
  background: var(--cdb-surface); border-bottom: 1px solid var(--cdb-line-strong);
}
.cdb-table td { padding: var(--cdb-s2) var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); vertical-align: middle; }
.cdb-table tbody tr { transition: background var(--cdb-fast) var(--cdb-ease); }
.cdb-table tbody tr:hover { background: var(--cdb-brand-soft); }
.cdb-table tbody tr[aria-selected="true"] { background: var(--cdb-brand-soft); }
.cdb-table--dense td, .cdb-table--dense th { padding: 5px var(--cdb-s2); }
/* Таблица внутри карточки: шапка не липнет (карточка сама уезжает за экран),
   стоит на утопленном фоне, а нижняя граница последней строки не дублирует рамку */
.cdb-table--inset th { position: static; background: var(--cdb-surface-2); }
.cdb-table--inset td { padding: 6px var(--cdb-s3); }
.cdb-table--inset tbody tr:last-child td { border-bottom: 0; }
.cdb-table__num { font-family: var(--cdb-font-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Кликабельный заголовок колонки — сортировка */
.cdb-table__sort a { color: inherit; }
.cdb-table__sort a:hover { color: var(--cdb-brand-text); text-decoration: none; }
/* Прочитанная строка гасится, но остаётся читаемой */
.cdb-table tr.is-read td { color: var(--cdb-text-faint); }
.cdb-table tr.is-read a { color: var(--cdb-text-soft); }
/* То же для строк, выключенных не чтением, а состоянием записи (блокировка, скрытие) */
.cdb-table tr.cdb-table--muted td { color: var(--cdb-text-faint); }
.cdb-table tr.cdb-table--muted a { color: var(--cdb-text-soft); }

/* ── 10. Формы ───────────────────────────────────────────────────────────── */
.cdb-field { display: flex; flex-direction: column; gap: 5px; }
.cdb-field > label { font-size: var(--cdb-size-xs); font-weight: 600; color: var(--cdb-text-soft); }
.cdb-input {
  width: 100%; min-height: 36px; padding: 6px var(--cdb-s3);
  font-family: var(--cdb-font-ui); font-size: var(--cdb-size-sm); color: var(--cdb-text);
  background: var(--cdb-surface); border: 1px solid var(--cdb-line-strong);
  border-radius: var(--cdb-r-sm); caret-color: var(--cdb-brand);
  transition: border-color var(--cdb-fast) var(--cdb-ease), box-shadow var(--cdb-fast) var(--cdb-ease);
}
.cdb-input::placeholder { color: var(--cdb-text-faint); }
.cdb-input:hover { border-color: var(--cdb-ink-400); }
.cdb-input:focus-visible { border-color: var(--cdb-brand); box-shadow: var(--cdb-ring); outline: none; }
textarea.cdb-input { min-height: 96px; resize: vertical; }
.cdb-input--sm { min-height: 30px; padding: 4px var(--cdb-s2); font-size: var(--cdb-size-xs); }
/* Выбор файла: нативный input отдаёт браузерные подписи по-английски и не знает
   наших рамок, поэтому его прячем и показываем label в виде кнопки с русским текстом */
.cdb-file { display: inline-flex; align-items: center; gap: var(--cdb-s2); min-height: 36px; padding: 0 var(--cdb-s3); border: 1px solid var(--cdb-line-strong); border-radius: var(--cdb-r-sm); background: var(--cdb-surface); font-size: var(--cdb-size-sm); cursor: pointer; }
.cdb-file:hover { border-color: var(--cdb-ink-400); }
.cdb-file:focus-within { border-color: var(--cdb-brand); box-shadow: var(--cdb-ring); }
.cdb-file input[type="file"] { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.cdb-file__btn { display: inline-flex; align-items: center; gap: 6px; padding: 3px var(--cdb-s2); border-radius: var(--cdb-r-xs); background: var(--cdb-bg-sunken); font-size: var(--cdb-size-xs); font-weight: 600; white-space: nowrap; }
.cdb-file__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--cdb-text-faint); }
.cdb-file__name--set { color: var(--cdb-text); }
.cdb-search { display: flex; align-items: center; gap: var(--cdb-s2); background: var(--cdb-surface); border: 1px solid var(--cdb-line-strong); border-radius: var(--cdb-r-pill); padding: 0 var(--cdb-s2) 0 var(--cdb-s4); min-height: 40px; min-width: 0; max-width: 100%; }
.cdb-search:focus-within { border-color: var(--cdb-brand); box-shadow: var(--cdb-ring); }
.cdb-search input { flex: 1; border: 0; background: transparent; color: var(--cdb-text); font: inherit; min-width: 0; }
.cdb-search input:focus { outline: none; }
.cdb-search select { border: 0; background: transparent; color: var(--cdb-text-soft); font: inherit; font-size: var(--cdb-size-sm); }
.cdb-seg { display: inline-flex; background: var(--cdb-bg-sunken); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-sm); padding: 2px; gap: 2px; }
.cdb-seg__opt {
  display: inline-flex; align-items: center; gap: 6px; padding: 5px var(--cdb-s3);
  font-size: var(--cdb-size-sm); font-weight: 600; color: var(--cdb-text-soft);
  border-radius: calc(var(--cdb-r-sm) - 2px); cursor: pointer; border: 0; background: transparent;
}
.cdb-seg__opt:hover { color: var(--cdb-text); }
.cdb-seg__opt[aria-selected="true"], .cdb-seg__opt.is-active { background: var(--cdb-surface); color: var(--cdb-text); box-shadow: var(--cdb-e1); }

/* ── 11. Прогресс ────────────────────────────────────────────────────────── */
.cdb-bar { display: block; height: 5px; border-radius: var(--cdb-r-pill); background: var(--cdb-ink-200); overflow: hidden; }
.cdb-bar > span { display: block; height: 100%; background: var(--cdb-brand); border-radius: inherit; transition: width var(--cdb-slow) var(--cdb-ease); }
.cdb-bar--signal > span { background: var(--cdb-signal); }
.cdb-meter { display: flex; align-items: center; gap: var(--cdb-s2); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-meter .cdb-bar { flex: 1; min-width: 60px; }

/* Вкладки-пилюли раздела (серия, выпуск): один активный, остальные — ссылки.
   Активное состояние объявлено последним и с той же специфичностью,
   что и базовое правило, — иначе цвет текста не перебивается.
   Пункт бывает и <button> (вкладка переключается запросом, а не переходом):
   такому нужен полный сброс — своё оформление и шрифт кнопка не наследует,
   а в WebKit родная отделка переживает голые background и border */
.cdb-pills { display: flex; flex-wrap: wrap; gap: 4px; list-style: none; margin: 0; padding: 0; }
.cdb-pills > a, .cdb-pills > span, .cdb-pills > button { display: inline-flex; align-items: center; gap: 7px; padding: 8px 14px; border-radius: var(--cdb-r-pill); font-size: var(--cdb-size-sm); font-weight: 600; line-height: inherit; color: var(--cdb-text-soft); }
.cdb-pills > button { appearance: none; -webkit-appearance: none; border: 0; background: none; font-family: var(--cdb-font-ui); cursor: pointer; }
.cdb-pills > a:hover, .cdb-pills > button:hover { background: var(--cdb-bg-sunken); color: var(--cdb-text); text-decoration: none; }
.cdb-pills > a.is-active, .cdb-pills > span.is-active, .cdb-pills > button.is-active { background: var(--cdb-brand); color: var(--cdb-on-brand); }
.cdb-pills .badge { font-family: var(--cdb-font-mono); font-size: 11px; padding: 1px 6px; border-radius: var(--cdb-r-pill); background: var(--cdb-bg-sunken); color: var(--cdb-text-soft); }
.cdb-pills > .is-active .badge { background: rgba(255, 255, 255, .22); color: #fff; }

/* Схлопывающийся блок: <details>/<summary> без JS. Маркер убираем — стрелку
   рисуем сами, иначе в Safari и Chrome она выглядит по-разному */
.cdb-fold > summary { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); background: var(--cdb-surface-2); cursor: pointer; font-weight: 600; font-size: var(--cdb-size-sm); list-style: none; }
.cdb-fold > summary::-webkit-details-marker { display: none; }
.cdb-fold > summary:hover { background: var(--cdb-bg-sunken); }
.cdb-fold > summary .cdb-fold__chev { margin-left: auto; color: var(--cdb-text-faint); transition: transform var(--cdb-base) var(--cdb-ease); }
.cdb-fold[open] > summary { border-bottom: 1px solid var(--cdb-line); }
.cdb-fold[open] > summary .cdb-fold__chev { transform: rotate(180deg); }

/* Статус команды: точка + подпись одним элементом (у серии — своя точка .cdb-status) */
.cdb-state { display: inline-flex; align-items: center; gap: 6px; font-size: var(--cdb-size-sm); font-weight: 600; color: var(--cdb-text-faint); }
.cdb-state::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: currentColor; flex: none; }
.cdb-state--active { color: var(--cdb-ok); }
.cdb-state--passive { color: var(--cdb-warn); }
.cdb-state--dead { color: var(--cdb-text-faint); }

/* Плитки чисел и спарклайн по месяцам — статистика участника и команды */
.cdb-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--cdb-s3); }
.cdb-stat { padding: var(--cdb-s3) var(--cdb-s4); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); }
.cdb-stat b { display: block; font-family: var(--cdb-font-mono); font-size: 22px; font-weight: 600; letter-spacing: -.02em; }
.cdb-stat span { font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-stats--sm { grid-template-columns: repeat(2, 1fr); gap: var(--cdb-s2); }
.cdb-stats--sm .cdb-stat { padding: 9px 11px; border-radius: var(--cdb-r-sm); }
.cdb-stats--sm .cdb-stat b { font-size: 19px; }
.cdb-stats--sm .cdb-stat span { font-size: 11px; }

.cdb-spark { display: flex; align-items: flex-end; gap: 2px; height: 84px; list-style: none; margin: 0; padding: 0; }
.cdb-spark li { flex: 1; display: flex; align-items: flex-end; height: 100%; }
.cdb-spark i { display: block; width: 100%; background: var(--cdb-brand); border-radius: 2px 2px 0 0; }
.cdb-spark--sm { height: 60px; }

/* Список «название — число справа»: команды, соавторы, серии */
.cdb-deflist { list-style: none; margin: 0; padding: 0; }
.cdb-deflist li { display: flex; align-items: baseline; gap: var(--cdb-s3); padding: 6px 0; border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-deflist li:last-child { border-bottom: 0; }
.cdb-deflist li > span:last-child { margin-left: auto; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); white-space: nowrap; }
.cdb-cols3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--cdb-s5); }

/* Россыпь номеров выпусков в строке серии */
.cdb-nums { display: flex; flex-wrap: wrap; gap: 4px; }
.cdb-nums a { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); padding: 1px 5px; border-radius: var(--cdb-r-xs); background: var(--cdb-bg-sunken); }
.cdb-nums a:hover { background: var(--cdb-brand-soft); text-decoration: none; }

/* ── 12. Навигация ───────────────────────────────────────────────────────── */
.cdb-topbar { position: sticky; top: 0; z-index: 20; display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s5); min-height: var(--cdb-nav-h); padding: var(--cdb-s2) var(--cdb-s5); background: color-mix(in srgb, var(--cdb-surface) 88%, transparent); backdrop-filter: saturate(1.4) blur(10px); border-bottom: 1px solid var(--cdb-line); }
.cdb-brand { display: inline-flex; align-items: center; gap: var(--cdb-s2); font-family: var(--cdb-font-display); font-weight: 800; font-size: 18px; letter-spacing: -.03em; color: var(--cdb-text); }
.cdb-brand:hover { color: var(--cdb-text); text-decoration: none; }
.cdb-brand em { font-style: normal; color: var(--cdb-brand-text); }
.cdb-nav { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; }
.cdb-nav a { display: inline-flex; align-items: center; gap: 6px; padding: 7px var(--cdb-s3); font-size: var(--cdb-size-sm); font-weight: 500; color: var(--cdb-text-soft); border-radius: var(--cdb-r-sm); }
.cdb-nav a:hover { background: var(--cdb-bg-sunken); color: var(--cdb-text); text-decoration: none; }
.cdb-nav a[aria-current="page"] { background: var(--cdb-brand-soft); color: var(--cdb-brand-text); font-weight: 600; }
/* Выпадающие группы в топбаре (админка: 13 разделов в 4 группах).
   Раскрытие на клик через details — как и всё остальное, живёт без JS */
.cdb-nav details { position: relative; }
.cdb-nav summary { display: inline-flex; align-items: center; gap: 6px; padding: 7px var(--cdb-s3); font-size: var(--cdb-size-sm); font-weight: 500; color: var(--cdb-text-soft); border-radius: var(--cdb-r-sm); cursor: pointer; list-style: none; white-space: nowrap; }
.cdb-nav summary::-webkit-details-marker { display: none; }
.cdb-nav summary::after { content: "▾"; font-size: 9px; opacity: .6; }
.cdb-nav summary:hover { background: var(--cdb-bg-sunken); color: var(--cdb-text); }
.cdb-nav details[open] > summary, .cdb-nav summary.is-active { background: var(--cdb-brand-soft); color: var(--cdb-brand-text); font-weight: 600; }
.cdb-nav__menu { position: absolute; top: calc(100% + 4px); left: 0; z-index: 60; min-width: 200px; display: flex; flex-direction: column; padding: 5px; background: var(--cdb-surface); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); box-shadow: var(--cdb-e3); }
.cdb-nav__menu a { display: flex; width: 100%; }
/* Панель видна только на узком экране (или внутри макета телефона), но её
   оформление живёт вне медиазапроса — иначе на артборде включается пустой грид */
.cdb-bottomnav {
  display: none; left: 0; right: 0; bottom: 0; z-index: 30;
  grid-template-columns: repeat(4, 1fr);
  background: var(--cdb-surface); border-top: 1px solid var(--cdb-line);
}
.cdb-bottomnav a, .cdb-bottomnav button {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
  min-height: 56px; border: 0; background: transparent; color: var(--cdb-text-faint);
  font-size: 10.5px; font-weight: 600;
}
.cdb-bottomnav a:hover { text-decoration: none; }
.cdb-bottomnav .fa { font-size: 17px; }
.cdb-bottomnav .is-active { color: var(--cdb-brand-text); }
.cdb-bottomnav--5 { grid-template-columns: repeat(5, 1fr); }
@container shell (max-width: 767px) {
  .cdb-table th { position: static; }
}

/* Контейнер страницы. [data-screen-label] — корень артборда в макетах;
   на живом сайте контейнер получает .cdb-page — обёртка в View/template.php
   вокруг топбара и .cdb-shell. На <body> контейнер вешать нельзя:
   container-type делает body содержащим блоком для position:fixed,
   и .cdb-bottomnav прибило бы к низу ДОКУМЕНТА, а не экрана.
   Поэтому .cdb-bottomnav лежит ВНЕ .cdb-page, а его мобильное включение
   продублировано во viewport-@media ниже. Липкому топбару контейнер
   не мешает — sticky работает внутри контейнера как обычно. */
.cdb-page, [data-screen-label] { container-type: inline-size; container-name: page; }

@container page (max-width: 767px) {
  .cdb-bottomnav { display: grid; position: fixed; padding-bottom: env(safe-area-inset-bottom); }
  .cdb-topbar { gap: var(--cdb-s2); padding: 0 var(--cdb-s4); }
  .cdb-topbar .cdb-nav { display: none; }
  .cdb-topbar .cdb-search { flex: 1 1 auto; min-width: 0; max-width: none; }
  .cdb-topbar .cdb-search select { display: none; }
  .cdb-topbar__wide { display: none; }
  .cdb-shell { padding: 0 var(--cdb-s4) 80px; }
}

/* Дубль для живого сайта: .cdb-bottomnav вне .cdb-page (fixed не выживает
   внутри контейнера), поэтому её мобильное включение — от viewport */
@media (max-width: 767px) {
  .cdb-bottomnav { display: grid; position: fixed; padding-bottom: env(safe-area-inset-bottom); }
}


/* ── 12в. Календарь недель ───────────────────────────────────────────────── */
.cdb-picker { display: flex; flex-direction: column; gap: var(--cdb-s2); padding: var(--cdb-s3) var(--cdb-s4); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); }
.cdb-picker__row { display: flex; align-items: center; gap: var(--cdb-s3); flex-wrap: wrap; }
.cdb-picker__label { width: 108px; flex: none; font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-text-faint); }
.cdb-months { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: var(--cdb-s3); }
.cdb-month { padding: var(--cdb-s3); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); }
.cdb-month__name { margin: 0 0 var(--cdb-s2); font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-brand-text); }
.cdb-month__empty { margin: 0; font-size: var(--cdb-size-sm); color: var(--cdb-text-faint); }
.cdb-month__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 3px; }
/* Недели без переводов остаются видимыми: пропуск должен читаться как пропуск */
.cdb-week { display: block; padding: 5px 8px; border-radius: var(--cdb-r-sm); font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-link); }
.cdb-week:hover { background: var(--cdb-brand-soft); text-decoration: none; }
.cdb-week--empty { color: var(--cdb-text-faint); }
.cdb-week--now { background: var(--cdb-brand); color: var(--cdb-on-brand); font-weight: 600; }
.cdb-week--now:hover { background: var(--cdb-brand-hover); color: var(--cdb-on-brand); }

.cdb-daygroup:first-child { border-top: 0; }

/* ── 12г. Обзор перевода («Жертвы обзора») ───────────────────────────────── */
.cdb-review { border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); overflow: hidden; box-shadow: var(--cdb-e1); }
.cdb-review__issue { display: grid; grid-template-columns: 72px minmax(0, 1fr) auto; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); background: var(--cdb-surface-2); border-bottom: 1px solid var(--cdb-line); align-items: start; }
.cdb-review__title { margin: 0 0 4px; font-size: var(--cdb-size-h3); }
.cdb-review__meta { display: flex; flex-wrap: wrap; gap: var(--cdb-s3); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-review__links { display: flex; flex-wrap: wrap; gap: var(--cdb-s3); margin-top: 4px; font-size: var(--cdb-size-xs); }
.cdb-review__actions { display: flex; gap: 4px; align-items: center; }
.cdb-review__body { padding: var(--cdb-s4); }
.cdb-review__head { display: flex; align-items: center; gap: var(--cdb-s3); margin-bottom: var(--cdb-s3); }
.cdb-review__avatar { width: 44px; height: 44px; flex: none; border-radius: var(--cdb-r-sm); background: var(--cdb-bg-sunken); display: grid; place-items: center; font-weight: 700; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-review__author { font-weight: 600; font-size: var(--cdb-size-sm); }
.cdb-review__date { display: block; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
/* Шкала перевёрнутая: 0 агентов — лучшая оценка, 47 — худшая */
.cdb-rating { margin-left: auto; display: inline-flex; align-items: baseline; gap: 6px; padding: 4px 10px; border-radius: var(--cdb-r-sm); font-size: var(--cdb-size-xs); font-weight: 600; background: var(--cdb-bg-sunken); color: var(--cdb-text-soft); white-space: nowrap; }
.cdb-rating strong { font-family: var(--cdb-font-mono); font-size: 19px; }
.cdb-rating--great { background: var(--cdb-ok-bg); color: var(--cdb-ok); }
.cdb-rating--good { background: var(--cdb-info-bg); color: var(--cdb-info); }
.cdb-rating--poor { background: var(--cdb-warn-bg); color: var(--cdb-warn); }
.cdb-rating--bad { background: var(--cdb-alert-bg); color: var(--cdb-alert); }
.cdb-review__facts { display: flex; flex-wrap: wrap; gap: var(--cdb-s2) var(--cdb-s4); padding: 0 0 var(--cdb-s3); margin-bottom: var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-review__facts em { font-style: normal; color: var(--cdb-text-faint); }
.cdb-review__text { font-size: var(--cdb-size-body); line-height: 1.6; }
.cdb-review__text p { margin: 0 0 var(--cdb-s3); }
.cdb-review__text p:last-child { margin: 0; }
.cdb-review__footer { margin-top: var(--cdb-s3); padding-top: var(--cdb-s3); border-top: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); font-weight: 600; }

/* Карточка победителя голосования */
.cdb-winner__cover { max-width: 200px; margin: 0 auto var(--cdb-s3); }
.cdb-winner__head { display: flex; align-items: baseline; gap: var(--cdb-s2); margin-bottom: var(--cdb-s2); }
.cdb-winner__num { margin-left: auto; font-family: var(--cdb-font-mono); font-weight: 600; color: var(--cdb-text-faint); }
.cdb-winner__line { margin: 0 0 4px; font-size: var(--cdb-size-sm); }
.cdb-winner__line em { font-style: normal; color: var(--cdb-text-faint); }

/* Итоги голосования: длина полосы — доля от лидера, подпись — доля от всех */
.cdb-voteresult { display: grid; grid-template-columns: 56px minmax(0, 1fr) 64px; gap: var(--cdb-s3); align-items: center; padding: var(--cdb-s3) 0; border-bottom: 1px solid var(--cdb-line); }
.cdb-voteresult:last-of-type { border-bottom: 0; }
.cdb-voteresult__title { font-weight: 600; font-size: var(--cdb-size-sm); }
.cdb-voteresult__count { text-align: right; }
.cdb-voteresult__count b { display: block; font-family: var(--cdb-font-mono); font-size: 17px; }
.cdb-voteresult__count span { font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-voteoption { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto; gap: var(--cdb-s3); align-items: center; padding: var(--cdb-s3); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); cursor: pointer; }
.cdb-voteoption:hover { border-color: var(--cdb-brand); }
.cdb-voteoption input { width: 18px; height: 18px; accent-color: var(--cdb-brand); }

/* Область графика (на живой странице рисует uPlot) */
.cdb-chart { border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); overflow: hidden; }
.cdb-chart__toolbar { display: flex; align-items: center; gap: var(--cdb-s3); flex-wrap: wrap; padding: var(--cdb-s3) var(--cdb-s4); background: var(--cdb-surface-2); border-bottom: 1px solid var(--cdb-line); }
.cdb-chart__hint { font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-chart__canvas { position: relative; height: 320px; margin: var(--cdb-s4); }
.cdb-chart__grid { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: space-between; }
.cdb-chart__grid span { display: block; height: 1px; background: var(--cdb-line); }
.cdb-chart__area { position: absolute; inset: 0; display: flex; align-items: flex-end; gap: 1px; }
.cdb-chart__area i { flex: 1; background: var(--cdb-brand); opacity: .85; border-radius: 1px 1px 0 0; }
.cdb-chart__axis { display: flex; justify-content: space-between; padding: 0 var(--cdb-s4) var(--cdb-s3); font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }

/* Список-навигатор разделов */
.cdb-linklist { display: flex; flex-direction: column; border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); overflow: hidden; }
.cdb-linklist > a { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); color: var(--cdb-text); }
.cdb-linklist > a:last-child { border-bottom: 0; }
.cdb-linklist > a:hover { background: var(--cdb-brand-soft); text-decoration: none; }
.cdb-linklist strong { display: block; font-size: var(--cdb-size-sm); }
.cdb-linklist small { display: block; font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }

/* ── 12д. Страница ошибки ────────────────────────────────────────────────── */
.cdb-error { display: grid; grid-template-columns: 240px minmax(0, 1fr); gap: var(--cdb-s6); align-items: center; padding: var(--cdb-s7) 0; }
.cdb-error__art { position: relative; display: grid; place-items: center; }
.cdb-error__burst { width: 240px; height: 240px; fill: var(--cdb-signal); }
.cdb-error__code { position: absolute; font-family: var(--cdb-font-display); font-weight: 800; font-size: 58px; letter-spacing: -.04em; color: var(--cdb-violet-800); }
.cdb-error__sound { position: absolute; bottom: 40px; font-family: var(--cdb-font-display); font-weight: 700; font-size: 17px; text-transform: uppercase; letter-spacing: .06em; color: var(--cdb-violet-700); }
.cdb-error__title { font-family: var(--cdb-font-display); font-weight: 800; font-size: clamp(28px, 3.4vw, 40px); letter-spacing: -.03em; margin: 0 0 var(--cdb-s3); }
.cdb-error__bubble { display: inline-block; margin: 0 0 var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); border: 2px solid var(--cdb-text); border-radius: var(--cdb-r-lg); background: var(--cdb-surface); font-size: var(--cdb-size-body); }
.cdb-error__details { font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); }
.cdb-error__actions { display: flex; flex-wrap: wrap; gap: var(--cdb-s2); margin-top: var(--cdb-s4); }
/* Узкий контейнер (макет телефона) медиазапрос не ловит — модификатор ставится вручную */
.cdb-error--stacked { grid-template-columns: minmax(0, 1fr); justify-items: center; text-align: center; gap: var(--cdb-s4); padding: 0; }
.cdb-error--stacked .cdb-error__burst { width: 150px; height: 150px; }
.cdb-error--stacked .cdb-error__code { font-size: 38px; }
.cdb-error--stacked .cdb-error__sound { bottom: 26px; font-size: 13px; }
.cdb-error--stacked .cdb-error__title { font-size: 23px; }
.cdb-error--stacked .cdb-error__bubble { font-size: var(--cdb-size-sm); padding: var(--cdb-s2) var(--cdb-s3); }
.cdb-error--stacked .cdb-error__details { font-size: var(--cdb-size-xs); }
.cdb-error--stacked .cdb-error__actions { flex-direction: column; width: 100%; margin-top: var(--cdb-s3); }

/* Раздел форума в списке: название с описанием и два счётчика справа */
.cdb-secrow { display: grid; grid-template-columns: minmax(0, 1fr) 90px 90px; gap: var(--cdb-s3); align-items: center; padding: var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); }
.cdb-secrow:last-child { border-bottom: 0; }
.cdb-secrow:hover { background: var(--cdb-brand-soft); }
.cdb-secrow h3 { margin: 0 0 3px; font-size: var(--cdb-size-h3); }
.cdb-secrow p { margin: 0; font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); }
.cdb-secrow b { display: block; font-family: var(--cdb-font-mono); font-size: 19px; font-weight: 600; text-align: center; }
.cdb-secrow small { display: block; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); text-align: center; }

/* Комментарий: аватар, ник-кнопка ответа, номер, текст — разметка comment_item.php */
.cdb-comment { display: grid; grid-template-columns: 40px minmax(0, 1fr); gap: var(--cdb-s3); padding: var(--cdb-s3) 0; border-bottom: 1px solid var(--cdb-line); }
.cdb-comment:last-of-type { border-bottom: 0; }
.cdb-comment__avatar { width: 40px; height: 40px; border-radius: var(--cdb-r-sm); object-fit: cover; background: var(--cdb-bg-sunken); display: grid; place-items: center; font-weight: 700; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-comment__meta { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--cdb-s2); margin-bottom: 4px; }
.cdb-comment__author { font-weight: 600; font-size: var(--cdb-size-sm); color: var(--cdb-brand-text); cursor: pointer; }
.cdb-comment__author:hover { text-decoration: underline; }
.cdb-comment__date, .cdb-comment__num { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-comment__rm { margin-left: auto; }
.cdb-comment__text { font-size: var(--cdb-size-sm); line-height: 1.55; }
.cdb-comment__text p { margin: 0 0 var(--cdb-s2); }
.cdb-comment__text p:last-child { margin: 0; }
.cdb-comment__text blockquote { margin: var(--cdb-s2) 0; padding: 6px var(--cdb-s3); border-left: 2px solid var(--cdb-brand); background: var(--cdb-surface-2); color: var(--cdb-text-soft); }

/* Панель BBCode над полем ввода */
.cdb-bbbar { display: flex; flex-wrap: wrap; gap: 2px; padding: 5px; background: var(--cdb-surface-2); border: 1px solid var(--cdb-line-strong); border-bottom: 0; border-radius: var(--cdb-r-sm) var(--cdb-r-sm) 0 0; }
.cdb-bbbar .cdb-btn { border-color: transparent; background: transparent; }
.cdb-bbbar .cdb-btn:hover { background: var(--cdb-surface); border-color: var(--cdb-line); }

/* ── 12е. Каталог: фасеты, буквы, строка серии ───────────────────────────── */
/* Фасет — плитка издательства/сайта: логотип, название, число. Строится
   Template::createFacetList, поэтому разметка одна на четырёх страницах */
.cdb-facets { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 6px; list-style: none; margin: 0; padding: 0; }
.cdb-facet > a { display: flex; align-items: center; gap: var(--cdb-s3); padding: 8px 10px; min-height: 48px; border-radius: var(--cdb-r-sm); border: 1px solid transparent; color: var(--cdb-text); }
.cdb-facet > a:hover { background: var(--cdb-surface); border-color: var(--cdb-line); text-decoration: none; }
.cdb-facet > a[aria-current="page"] { background: var(--cdb-brand-soft); border-color: var(--cdb-brand); color: var(--cdb-brand-text); font-weight: 600; }
.cdb-facet__logo { width: 34px; height: 34px; flex: none; object-fit: contain; border-radius: var(--cdb-r-xs); background: var(--cdb-bg-sunken); display: grid; place-items: center; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); font-weight: 600; color: var(--cdb-text-faint); }
.cdb-facet__name { flex: 1; min-width: 0; font-size: var(--cdb-size-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cdb-facet__value { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
/* Издательства с нулём переводов не скрываем: их наличие — тоже факт о базе */
.cdb-facet--zero > a { opacity: .55; }

.cdb-letters { display: flex; flex-wrap: wrap; gap: 4px; list-style: none; margin: 0; padding: 0; }
.cdb-letters a { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; min-width: 46px; min-height: 46px; padding: 4px; border-radius: var(--cdb-r-sm); border: 1px solid var(--cdb-line); background: var(--cdb-surface); color: var(--cdb-text); font-weight: 700; }
.cdb-letters a:hover { border-color: var(--cdb-brand); color: var(--cdb-brand-text); text-decoration: none; }
.cdb-letters a[aria-current="page"] { background: var(--cdb-brand); border-color: var(--cdb-brand); color: var(--cdb-on-brand); }
.cdb-letters small { font-family: var(--cdb-font-mono); font-size: 10px; font-weight: 400; opacity: .7; }
.cdb-letters--grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
.cdb-letters--grid a { min-height: 56px; font-size: 17px; }

/* Строка серии в списке издательства: номер, обложка, название со статусом, прогресс */
.cdb-srow { display: grid; grid-template-columns: var(--srow-cols, 38px 40px minmax(0, 1fr) 190px auto); gap: var(--cdb-s3); align-items: center; padding: 8px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); }
.cdb-srow:last-of-type { border-bottom: 0; }
.cdb-srow:hover { background: var(--cdb-brand-soft); }
.cdb-srow__num { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); text-align: right; }
.cdb-srow__title { font-weight: 600; font-size: var(--cdb-size-sm); color: var(--cdb-text); }
.cdb-srow__title:hover { color: var(--cdb-brand-text); }
.cdb-srow__volume { font-family: var(--cdb-font-mono); font-weight: 400; color: var(--cdb-text-faint); }
.cdb-srow__pub { display: inline-flex; align-items: center; gap: 6px; font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-srow__logo { width: 16px; height: 16px; border-radius: 2px; object-fit: contain; background: var(--cdb-bg-sunken); }
.cdb-srow--mobile { grid-template-columns: 40px minmax(0, 1fr) auto; padding: 9px 0; }

/* Легенда статусов над списком серий */
.cdb-legend { display: flex; flex-wrap: wrap; gap: var(--cdb-s3); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-legend span { display: inline-flex; align-items: center; gap: 5px; }

/* ── 12ж. «Читай также» и живой поиск серий ──────────────────────────────── */
.cdb-readmore { display: grid; grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); gap: var(--cdb-s4); }
.cdb-readmore__item { position: relative; display: flex; flex-direction: column; gap: 6px; }
.cdb-readmore__title { font-size: var(--cdb-size-sm); font-weight: 600; line-height: 1.25; color: var(--cdb-text); }
.cdb-readmore__meta { font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
/* Крестик удаления — только модератору, поэтому лежит поверх обложки */
.cdb-readmore__rm { position: absolute; top: -6px; right: -6px; width: 24px; height: 24px; display: grid; place-items: center; border: 0; border-radius: 50%; background: var(--cdb-alert); color: var(--cdb-ink-0); font-size: 11px; cursor: pointer; box-shadow: var(--cdb-e2); }

.cdb-livesearch { position: relative; }
.cdb-livesearch__results { margin-top: var(--cdb-s2); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); max-height: 320px; overflow-y: auto; }
.cdb-livesearch__list { list-style: none; margin: 0; padding: 0; }
/* Строка результата: сетка «обложка | текст | действие». Работает и как <li>,
   и как <button> — сброс кнопки зашит здесь же (мастер внесения перевода) */
.cdb-livesearch__item { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; gap: var(--cdb-s3); align-items: center; width: 100%; padding: var(--cdb-s2) var(--cdb-s3); border: 0; border-bottom: 1px solid var(--cdb-line); background: transparent; color: var(--cdb-text); text-align: left; font: inherit; }
button.cdb-livesearch__item { cursor: pointer; }
.cdb-livesearch__item:hover { background: var(--cdb-brand-soft); }
.cdb-livesearch__item:last-child { border-bottom: 0; }
.cdb-livesearch__cover { width: 30px; height: 45px; flex: none; object-fit: cover; border-radius: 2px; background: var(--cdb-bg-sunken); }
.cdb-livesearch__title { flex: 1; min-width: 0; font-size: var(--cdb-size-sm); }
.cdb-livesearch__meta { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-livesearch__pager { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s2) var(--cdb-s3); background: var(--cdb-surface-2); border-top: 1px solid var(--cdb-line); }
.cdb-livesearch__total { margin-left: auto; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-livesearch__empty { margin: 0; padding: var(--cdb-s4); font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); text-align: center; }

/* ── 12з. Чеклист: раскрывающиеся книги ──────────────────────────────────── */
.cdb-books { display: flex; flex-direction: column; gap: var(--cdb-s2); }
.cdb-book > summary { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); background: var(--cdb-surface-2); cursor: pointer; font-weight: 600; font-size: var(--cdb-size-sm); list-style: none; }
.cdb-book > summary::-webkit-details-marker { display: none; }
.cdb-book > summary:hover { background: var(--cdb-bg-sunken); }
.cdb-book__chev { margin-left: auto; color: var(--cdb-text-faint); transition: transform var(--cdb-base) var(--cdb-ease); }
.cdb-book[open] > summary { border-bottom: 1px solid var(--cdb-line); }
.cdb-book[open] .cdb-book__chev { transform: rotate(180deg); }
.cdb-book__count { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); font-weight: 400; color: var(--cdb-text-faint); }
/* Пара «номер тома = выпуск оригинала»: моноширинный левый столбец держит колонку */
.cdb-pairs { list-style: none; margin: 0; padding: var(--cdb-s2) 0; }
.cdb-pairs li { display: grid; grid-template-columns: 76px minmax(0, 1fr); gap: var(--cdb-s3); padding: 5px var(--cdb-s4); font-size: var(--cdb-size-sm); }
.cdb-pairs li:hover { background: var(--cdb-brand-soft); }
.cdb-pairs__key { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); padding-top: 2px; }
.cdb-pairs__pub { color: var(--cdb-text-faint); }

/* ── 12и. Статья ─────────────────────────────────────────────────────────── */
/* Статья и обсуждение рядом: на узком обсуждение уходит под текст */
.cdb-articlelayout { display: grid; grid-template-columns: minmax(0, 1fr) 400px; gap: var(--cdb-s6); align-items: start; }
@container shell (max-width: 1100px) { .cdb-articlelayout { grid-template-columns: minmax(0, 1fr); } }
.cdb-article { font-size: 16px; line-height: 1.62; max-width: 68ch; }
.cdb-article p { margin: 0 0 var(--cdb-s4); }
.cdb-article h3 { font-size: 20px; margin: var(--cdb-s5) 0 var(--cdb-s2); }
.cdb-article ul, .cdb-article ol { margin: 0 0 var(--cdb-s4); padding-left: 22px; }
.cdb-article li { margin-bottom: 6px; }
.cdb-article blockquote { margin: var(--cdb-s4) 0; padding: var(--cdb-s3) var(--cdb-s4); border-left: 3px solid var(--cdb-brand); background: var(--cdb-surface-2); color: var(--cdb-text-soft); }
.cdb-article img { border-radius: var(--cdb-r-sm); margin-bottom: var(--cdb-s4); }
.cdb-article__head { display: flex; align-items: center; gap: var(--cdb-s3); flex-wrap: wrap; margin-bottom: var(--cdb-s5); }
.cdb-article__title { font-family: var(--cdb-font-display); font-weight: 800; font-size: clamp(26px, 3vw, 36px); letter-spacing: -.03em; margin: 0 0 var(--cdb-s3); max-width: 24ch; }
.cdb-article__related { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; font-size: var(--cdb-size-sm); }

/* Строка статьи в списке раздела */
.cdb-arow { display: grid; grid-template-columns: 96px minmax(0, 1fr) 150px 110px 210px 52px; gap: var(--cdb-s3); align-items: center; padding: var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-arow:last-of-type { border-bottom: 0; }
.cdb-arow:hover { background: var(--cdb-brand-soft); }
.cdb-arow__title { font-weight: 600; color: var(--cdb-text); }
.cdb-arow__title:hover { color: var(--cdb-brand-text); }
.cdb-arow__num { font-family: var(--cdb-font-mono); font-variant-numeric: tabular-nums; text-align: center; }
@container shell (max-width: 900px) {
  /* Явные области: трек auto иначе забирает всю ширину, а 1fr схлопывается */
  .cdb-arow { grid-template-columns: minmax(0, 1fr); grid-auto-rows: min-content; row-gap: 5px; }
  .cdb-arow > * { grid-column: 1; }
  .cdb-arow > :nth-child(4) { justify-self: start; }
  .cdb-arow > :nth-child(6) { justify-self: start; }
}

/* ── 12к. F.A.Q. и вопросы ───────────────────────────────────────────────── */
/* Плашка-подсказка: врезка внутри ответа, не самостоятельный блок */
.cdb-callout { display: flex; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); border-left: 3px solid var(--cdb-brand); border-radius: 0 var(--cdb-r-sm) var(--cdb-r-sm) 0; background: var(--cdb-brand-soft); color: var(--cdb-text); font-size: var(--cdb-size-sm); }
/* align-self обязателен: без него иконка растягивается на высоту всей плашки,
   и вращение fa-spin идёт вокруг центра блока, а не вокруг самой иконки */
.cdb-callout > .fa { flex: none; align-self: flex-start; line-height: 1.5; color: var(--cdb-brand-text); padding-top: 2px; }
.cdb-callout > .cdb-spin { flex: none; align-self: flex-start; margin-top: 5px; color: var(--cdb-brand-text); }
.cdb-callout--warn > .cdb-spin { color: var(--cdb-warn); }
.cdb-callout p { margin: 0 0 var(--cdb-s2); }
.cdb-callout p:last-child { margin: 0; }
.cdb-callout--warn { border-left-color: var(--cdb-warn); background: var(--cdb-warn-bg); }
.cdb-callout--warn > .fa { color: var(--cdb-warn); }
.cdb-callout--alert { border-left-color: var(--cdb-alert); background: var(--cdb-alert-bg); }
.cdb-callout--alert > .fa { color: var(--cdb-alert); }
/* Значок кнопки внутри текста: показывает, что именно нажать на странице */
.cdb-keycap { display: inline-flex; align-items: center; justify-content: center; min-width: 22px; height: 22px; padding: 0 5px; border: 1px solid var(--cdb-line-strong); border-bottom-width: 2px; border-radius: var(--cdb-r-xs); background: var(--cdb-surface); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); vertical-align: baseline; }
.cdb-faq__group { margin-left: auto; font-size: var(--cdb-size-xs); font-weight: 600; letter-spacing: var(--cdb-kicker-tracking); text-transform: uppercase; color: var(--cdb-text-faint); }
/* Обе метки шли с margin-left:auto и делили свободное место — раздел зависал
   на разном расстоянии от заголовка. Стрелка прижимается к разделу, а не к краю.
   Селектор с .cdb-fold > summary — иначе он слабее правила самой стрелки */
.cdb-fold > summary .cdb-faq__group + .cdb-fold__chev { margin-left: 0; }
.cdb-faq__link { margin: var(--cdb-s3) 0 0; font-size: var(--cdb-size-xs); }

/* Вопрос администрации и ответ на него */
.cdb-question { border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); box-shadow: var(--cdb-e1); overflow: hidden; }
.cdb-question__head { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); }
.cdb-question__author { font-weight: 600; font-size: var(--cdb-size-sm); }
.cdb-question__date { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-question__body { padding: var(--cdb-s4); font-size: var(--cdb-size-body); line-height: 1.55; }
.cdb-question__body p { margin: 0 0 var(--cdb-s3); }
.cdb-question__body p:last-child { margin: 0; }
/* Ответ администрации — фиолетовая полоса слева: видно, что отвечает сайт */
.cdb-answer { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: var(--cdb-s3); padding: var(--cdb-s4); border-top: 1px solid var(--cdb-line); border-left: 3px solid var(--cdb-brand); background: var(--cdb-surface-2); }
.cdb-answer__mark { width: 32px; height: 32px; display: grid; place-items: center; border-radius: 50%; background: var(--cdb-brand); color: var(--cdb-on-brand); font-size: 13px; }
.cdb-answer__meta { display: flex; align-items: baseline; gap: var(--cdb-s2); margin-bottom: 4px; }
.cdb-answer__text { font-size: var(--cdb-size-sm); line-height: 1.55; }
.cdb-answer__text p { margin: 0 0 var(--cdb-s2); }
.cdb-answer__text p:last-child { margin: 0; }
.cdb-question__pending { padding: var(--cdb-s3) var(--cdb-s4); border-top: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); color: var(--cdb-text-faint); }

/* ── 12л. Раздел «Читаю» ─────────────────────────────────────────────────── */
/* Двойная полоса: зелёное — прочитано, жёлтое — осталось из переведённого */
.cdb-dualbar { display: flex; height: 8px; border-radius: var(--cdb-r-pill); background: var(--cdb-ink-200); overflow: hidden; }
.cdb-dualbar i { display: block; height: 100%; }
.cdb-dualbar__read { background: var(--cdb-ok); }
.cdb-dualbar__left { background: var(--cdb-signal); }
.cdb-rrow { display: grid; grid-template-columns: 40px minmax(0, 1fr) 300px; gap: var(--cdb-s3); align-items: center; padding: 9px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); }
.cdb-rrow:last-of-type { border-bottom: 0; }
.cdb-rrow:hover { background: var(--cdb-brand-soft); }
.cdb-rrow__title { font-weight: 600; font-size: var(--cdb-size-sm); color: var(--cdb-text); }
.cdb-rrow__title:hover { color: var(--cdb-brand-text); }
.cdb-rrow__vol { font-family: var(--cdb-font-mono); font-weight: 400; color: var(--cdb-text-faint); }
@container shell (max-width: 700px) {
  .cdb-rrow { grid-template-columns: 40px minmax(0, 1fr); row-gap: 6px; padding-inline: 0; }
  .cdb-rrow > :last-child { grid-column: 2; }
}

/* ── 12м. Язык графиков ──────────────────────────────────────────────────────
 * Одна лексика на все страницы данных:
 *   .cdb-chart   — большая область (на живой странице рисует uPlot);
 *   .cdb-spark   — столбики по месяцам без осей, внутри панели;
 *   .cdb-rank    — «название · полоса · число»: доля от лидера;
 *   .cdb-stats   — плитки итоговых чисел.
 * Цвет данных всегда один — бренд. Второй ряд (оформление, прошлый период)
 * не берёт новый цвет, а гасится прозрачностью: цветов в системе два, и жёлтый
 * занят сигналом «новое».
 * ────────────────────────────────────────────────────────────────────────── */
.cdb-chart--side .cdb-chart__canvas { height: 180px; margin: var(--cdb-s3); }
.cdb-chart--side .cdb-chart__axis { padding: 0 var(--cdb-s3) var(--cdb-s3); }
.cdb-chart__legend { display: flex; flex-wrap: wrap; gap: var(--cdb-s4); padding: 0 var(--cdb-s4) var(--cdb-s3); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-chart__legend span { display: inline-flex; align-items: center; gap: 6px; }
.cdb-chart__legend i { width: 10px; height: 10px; border-radius: 2px; background: var(--cdb-brand); }
.cdb-chart__legend i.is-second { opacity: .45; }
/* Столбик из двух частей: снизу перевод, сверху оформление той же серией */
.cdb-chart__area i.is-stacked { display: flex; flex-direction: column; justify-content: flex-end; background: none; }
.cdb-chart__area i.is-stacked > b { display: block; width: 100%; background: var(--cdb-brand); opacity: .45; }
.cdb-chart__area i.is-stacked > s { display: block; width: 100%; background: var(--cdb-brand); }
/* Подпись значения над столбиком — только для одиночных выбросов */
.cdb-chart__peak { position: absolute; transform: translate(-50%, -100%); font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-brand-text); white-space: nowrap; }
.cdb-spark--tall { height: 120px; }
.cdb-spark i.is-muted { opacity: .4; }
.cdb-spark__axis { display: flex; justify-content: space-between; margin-top: 4px; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }

.cdb-ranks { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--cdb-s3); }
.cdb-rank__head { display: flex; align-items: baseline; gap: var(--cdb-s3); font-size: var(--cdb-size-sm); margin-bottom: 4px; }
.cdb-rank__num { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); width: 20px; flex: none; text-align: right; }
.cdb-rank__value { margin-left: auto; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); white-space: nowrap; }
.cdb-rank--lead .cdb-rank__value { color: var(--cdb-brand-text); font-weight: 600; }

/* Навигация по годам: та же лексика, что у букв алфавита, но с числом под годом */
.cdb-yearnav { display: flex; flex-wrap: wrap; gap: 4px; list-style: none; margin: 0; padding: 0; }
.cdb-yearnav a { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; min-width: 62px; min-height: 46px; padding: 4px 8px; border-radius: var(--cdb-r-sm); border: 1px solid var(--cdb-line); background: var(--cdb-surface); color: var(--cdb-text); font-family: var(--cdb-font-mono); font-weight: 600; }
.cdb-yearnav a:hover { border-color: var(--cdb-brand); color: var(--cdb-brand-text); text-decoration: none; }
.cdb-yearnav a[aria-current="page"] { background: var(--cdb-brand); border-color: var(--cdb-brand); color: var(--cdb-on-brand); }
.cdb-yearnav small { font-size: 10px; font-weight: 400; opacity: .7; }

/* Карточка человека: аватар, имя, роли, числа */
.cdb-person { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: var(--cdb-s3) var(--cdb-s4); align-items: center; }
.cdb-person__avatar { width: 56px; height: 56px; border-radius: var(--cdb-r-md); background: var(--cdb-bg-sunken); display: grid; place-items: center; font-weight: 700; color: var(--cdb-text-faint); }
.cdb-person__name { font-family: var(--cdb-font-display); font-weight: 800; font-size: 24px; letter-spacing: -.03em; margin: 0; }
.cdb-person__roles { display: flex; flex-wrap: wrap; gap: var(--cdb-s2); margin-top: 6px; }

/* Таймлайн: события в столбец с полосой слева */
.cdb-timeline { list-style: none; margin: 0; padding: 0 0 0 var(--cdb-s5); border-left: 2px solid var(--cdb-line); }
.cdb-timeline > li { position: relative; padding: 0 0 var(--cdb-s5) 0; }
.cdb-timeline > li:last-child { padding-bottom: 0; }
.cdb-timeline > li::before { content: ""; position: absolute; left: calc(-1 * var(--cdb-s5) - 6px); top: 5px; width: 10px; height: 10px; border-radius: 50%; background: var(--cdb-brand); box-shadow: 0 0 0 3px var(--cdb-bg); }
.cdb-timeline__date { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-timeline__title { font-weight: 600; font-size: var(--cdb-size-sm); margin: 2px 0 4px; }
.cdb-timeline__body { font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); }
.cdb-timeline > li.is-quiet::before { background: var(--cdb-ink-300); }
.cdb-timeline > li.is-alert::before { background: var(--cdb-alert); }

/* ── 12н. Глобальные события ─────────────────────────────────────────────────
 * Событие — набор выпусков разных серий, который читается как одно целое.
 * Плитка издательства, список событий, шапка события с прогрессом, сетка обложек.
 * ────────────────────────────────────────────────────────────────────────── */
.cdb-ptiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--cdb-s3); }
.cdb-ptile { display: flex; flex-direction: column; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s4) var(--cdb-s3); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); color: var(--cdb-text); text-align: center; }
.cdb-ptile:hover { border-color: var(--cdb-brand); text-decoration: none; box-shadow: var(--cdb-e2); }
.cdb-ptile__logo { width: 100%; height: 56px; display: grid; place-items: center; color: var(--cdb-text-faint); font-family: var(--cdb-font-mono); font-size: 17px; font-weight: 600; }
.cdb-ptile__logo img { max-height: 56px; object-fit: contain; }
.cdb-ptile__name { font-size: var(--cdb-size-sm); font-weight: 600; line-height: 1.25; }
.cdb-ptile__count { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }

/* Раскладка страницы издательства: оглавление слева, группы событий справа */
.cdb-eventslayout { display: grid; grid-template-columns: 240px minmax(0, 1fr); gap: var(--cdb-s6); align-items: start; }
@container shell (max-width: 900px) { .cdb-eventslayout { grid-template-columns: minmax(0, 1fr); } }
.cdb-eventstoc { position: sticky; top: calc(var(--cdb-nav-h) + var(--cdb-s4)); }
.cdb-eventstoc__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.cdb-eventstoc__list a { display: block; padding: 7px var(--cdb-s3); border-left: 2px solid var(--cdb-line); font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); }
.cdb-eventstoc__list a:hover { border-left-color: var(--cdb-brand); color: var(--cdb-brand-text); background: var(--cdb-brand-soft); text-decoration: none; }
.cdb-eventstoc__list a.is-active { border-left-color: var(--cdb-brand); color: var(--cdb-brand-text); font-weight: 600; }

/* Строка события в группе */
.cdb-erow { display: grid; grid-template-columns: minmax(0, 1fr) 160px 120px; gap: var(--cdb-s3); align-items: center; padding: 9px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-erow:last-of-type { border-bottom: 0; }
.cdb-erow:hover { background: var(--cdb-brand-soft); }
.cdb-erow__years { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); text-align: center; white-space: nowrap; }
.cdb-erow__count { display: flex; align-items: center; justify-content: flex-end; gap: var(--cdb-s2); }
@container shell (max-width: 620px) {
  .cdb-facts { grid-template-columns: minmax(0, 1fr); row-gap: 2px; }
  .cdb-facts dd { margin-bottom: var(--cdb-s2); }
  .cdb-erow { grid-template-columns: minmax(0, 1fr); grid-auto-rows: min-content; row-gap: 4px; padding-inline: 0; }
  .cdb-erow > :nth-child(1) { grid-area: 1 / 1; }
  .cdb-erow__years { grid-area: 2 / 1; text-align: left; }
  .cdb-erow__count { grid-area: 2 / 1; justify-content: flex-end; }
}

/* Шапка события: группа, число выпусков, прогресс перевода, описание */
.cdb-eventhead { border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); padding: var(--cdb-s4); box-shadow: var(--cdb-e1); }
.cdb-eventhead__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s4); font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); }
.cdb-eventhead__text { margin: var(--cdb-s4) 0 0; padding-top: var(--cdb-s4); border-top: 1px solid var(--cdb-line); font-size: var(--cdb-size-body); line-height: 1.55; }
.cdb-eprogress { margin-top: var(--cdb-s4); }
.cdb-eprogress__head { display: flex; align-items: baseline; gap: var(--cdb-s3); margin-bottom: 6px; font-size: var(--cdb-size-sm); }
.cdb-eprogress__percent { margin-left: auto; font-family: var(--cdb-font-mono); font-size: 19px; font-weight: 600; color: var(--cdb-brand-text); }
.cdb-eprogress__bar { display: block; height: 10px; border-radius: var(--cdb-r-pill); background: var(--cdb-ink-200); overflow: hidden; }
.cdb-eprogress__fill { display: block; height: 100%; background: var(--cdb-brand); border-radius: inherit; }

/* Сетка обложек события: непереведённые гасим, но показываем — дыра в событии видна */
.cdb-ecovers { display: grid; grid-template-columns: repeat(auto-fill, minmax(124px, 1fr)); gap: var(--cdb-s4); }
.cdb-ecover { position: relative; display: block; border-radius: var(--cdb-r-sm); overflow: hidden; background: var(--cdb-bg-sunken); }
.cdb-ecover img { width: 100%; aspect-ratio: 2 / 3; object-fit: cover; }
.cdb-ecover::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 1px rgba(23, 20, 28, .16); pointer-events: none; }
.cdb-ecover__mark { position: absolute; bottom: 4px; right: 4px; width: 20px; height: 20px; display: grid; place-items: center; border-radius: 50%; background: var(--cdb-brand); color: var(--cdb-on-brand); font-size: 10px; }
.cdb-ecover--untranslated img { filter: grayscale(1); opacity: .45; }
.cdb-ecover--untranslated::before { content: ""; position: absolute; inset: 0; border: 1px dashed var(--cdb-line-strong); border-radius: inherit; z-index: 1; }

/* Строка выпуска внутри события */
.cdb-eissue { display: grid; grid-template-columns: 40px 28px 40px 110px minmax(0, 1fr) auto; gap: var(--cdb-s3); align-items: center; padding: 7px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-eissue:last-of-type { border-bottom: 0; }
.cdb-eissue:hover { background: var(--cdb-brand-soft); }
.cdb-eissue__num { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); text-align: center; }
.cdb-eissue__date { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); white-space: nowrap; }
.cdb-eissue__flag { display: grid; place-items: center; }
.cdb-eissue--untranslated .cdb-eissue__link { color: var(--cdb-text-faint); }
@container shell (max-width: 700px) {
  .cdb-eissue { grid-template-columns: 40px minmax(0, 1fr); grid-auto-rows: min-content; row-gap: 4px; padding-inline: 0; }
  .cdb-eissue__num, .cdb-eissue__flag { display: none; }
  .cdb-eissue > :nth-child(3) { grid-area: 1 / 1 / span 2 / 2; }
  .cdb-eissue > :nth-child(5) { grid-area: 1 / 2; }
  .cdb-eissue__date { grid-area: 2 / 2; }
  .cdb-eissue > :nth-child(6) { grid-area: 3 / 2; }
}

/* Форма события в админке */
.cdb-eventform { display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: var(--cdb-s4); align-items: start; }
.cdb-eventform > label { font-size: var(--cdb-size-sm); font-weight: 600; color: var(--cdb-text-soft); padding-top: 9px; }
.cdb-eventform__actions { grid-column: 2; display: flex; flex-wrap: wrap; gap: var(--cdb-s2); }
@container shell (max-width: 700px) {
  .cdb-eventform { grid-template-columns: minmax(0, 1fr); gap: var(--cdb-s2); }
  .cdb-eventform > label { padding-top: 0; }
  .cdb-eventform__actions { grid-column: 1; }
}

/* ── 12о. Шаги мастера ───────────────────────────────────────────────────────
 * Навигация мастера: шаги в одну строку, пройденные — ссылки. Возврат на любой
 * пройденный шаг одним нажатием (плюс Alt+1..4 с клавиатуры), 40px высоты,
 * ширину у широких админских таблиц не отнимает.
 * ────────────────────────────────────────────────────────────────────────── */
.cdb-steps { display: flex; flex-wrap: wrap; gap: 2px; list-style: none; margin: 0; padding: 0; counter-reset: step; }
.cdb-steps > li { flex: 1 1 160px; display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3); border-top: 3px solid var(--cdb-line); font-size: var(--cdb-size-sm); color: var(--cdb-text-faint); }
.cdb-steps > li.is-done { border-top-color: var(--cdb-brand); color: var(--cdb-text-soft); }
.cdb-steps > li.is-current { border-top-color: var(--cdb-brand); color: var(--cdb-text); font-weight: 600; background: var(--cdb-brand-soft); }
.cdb-steps__num { width: 24px; height: 24px; flex: none; display: grid; place-items: center; border-radius: 50%; background: var(--cdb-ink-200); color: var(--cdb-text-soft); font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); font-weight: 600; }
.cdb-steps > li.is-done .cdb-steps__num, .cdb-steps > li.is-current .cdb-steps__num { background: var(--cdb-brand); color: var(--cdb-on-brand); }
.cdb-steps__value { display: block; font-weight: 400; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }

/* Компактный вид: шаги в одну строку, пройденные — ссылки для возврата.
   40px высоты вместо 72px у полосы и без потери ширины, как у сайдбара */
.cdb-steps--inline { flex-wrap: nowrap; overflow-x: auto; gap: 0; scrollbar-width: none; border-bottom: 1px solid var(--cdb-line); }
.cdb-steps--inline::-webkit-scrollbar { display: none; }
.cdb-steps--inline > li { flex: 0 0 auto; gap: var(--cdb-s2); padding: 7px var(--cdb-s3); border-top: 0; background: none; }
.cdb-steps--inline > li + li::before { content: "\f105"; font-family: FontAwesome; margin-right: var(--cdb-s3); color: var(--cdb-line-strong); }
.cdb-steps--inline .cdb-steps__num { width: 20px; height: 20px; }
.cdb-steps--inline .cdb-steps__value { display: inline; margin-left: 4px; }
.cdb-steps--inline a { color: inherit; }
.cdb-steps--inline > li.is-current { border-radius: var(--cdb-r-sm); background: var(--cdb-brand-soft); }

/* Списки в тексте: нумерованный с моноширинным числом и обычный с точкой.
   Не .cdb-steps — та полоса показывает состояние мастера, а не порядок в инструкции.
   Маркер абсолютный, а не колонка грида: в grid-контейнере каждый текстовый узел
   становится своей ячейкой, и строка со ссылками рассыпается по одному слову в ряд */
.cdb-numlist { list-style: none; margin: 0; padding: 0; counter-reset: numlist; display: flex; flex-direction: column; gap: var(--cdb-s3); }
.cdb-numlist > li { counter-increment: numlist; position: relative; padding-left: 34px; font-size: var(--cdb-size-body); }
.cdb-numlist > li::before { content: counter(numlist); position: absolute; left: 0; top: 1px; width: 22px; text-align: right; font-family: var(--cdb-font-mono); font-weight: 600; font-size: var(--cdb-size-sm); color: var(--cdb-brand-text); }
.cdb-bullets { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--cdb-s2); }
.cdb-bullets > li { position: relative; padding-left: 18px; font-size: var(--cdb-size-body); }
.cdb-bullets > li::before { content: "•"; position: absolute; left: 2px; color: var(--cdb-brand-text); font-weight: 700; }

/* Подпись горячей клавиши в форме */
.cdb-hotkey { display: inline-flex; align-items: center; gap: 4px; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-hotkey kbd { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 5px; border: 1px solid var(--cdb-line-strong); border-bottom-width: 2px; border-radius: var(--cdb-r-xs); background: var(--cdb-surface); font-family: var(--cdb-font-mono); font-size: 10.5px; color: var(--cdb-text-soft); }

/* ── 12п. Админка ────────────────────────────────────────────────────────────
 * Отдельного регистра нет — те же токены, но плотнее: .cdb-table--dense
 * по умолчанию, крупные числа моноширинно, карточки-счётчики вместо плиток.
 * ────────────────────────────────────────────────────────────────────────── */
/* Карточка-счётчик: число, подпись, пояснение. Ведёт на экран, где с ним работают */
.cdb-counts { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--cdb-s3); }
.cdb-count { display: flex; flex-direction: column; gap: 2px; padding: var(--cdb-s4); border: 1px solid var(--cdb-line); border-left: 3px solid var(--cdb-line-strong); border-radius: var(--cdb-r-md); background: var(--cdb-surface); color: var(--cdb-text); }
.cdb-count:hover { border-color: var(--cdb-brand); border-left-color: var(--cdb-brand); text-decoration: none; box-shadow: var(--cdb-e2); }
.cdb-count__value { font-family: var(--cdb-font-mono); font-size: 30px; font-weight: 600; letter-spacing: -.02em; line-height: 1.05; }
.cdb-count__title { font-size: var(--cdb-size-sm); font-weight: 600; }
.cdb-count__hint { font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
/* Ноль — обычная рамка: подсвечиваем только то, что действительно ждёт разбора */
.cdb-count--warn { border-left-color: var(--cdb-warn); }
.cdb-count--warn .cdb-count__value { color: var(--cdb-warn); }
.cdb-count--alert { border-left-color: var(--cdb-alert); }
.cdb-count--alert .cdb-count__value { color: var(--cdb-alert); }
.cdb-count--ok { border-left-color: var(--cdb-ok); }
.cdb-count--zero { border-left-color: var(--cdb-line-strong); }
.cdb-count--zero .cdb-count__value { color: var(--cdb-text-faint); }
/* Кирби-доты: у Джека Кирби космическая энергия рисовалась россыпью чёрных кругов.
   Проступают при наведении на карточку — единственное украшение в панели, и то по делу:
   отмечает счётчик, за которым стоит жизнь базы, а не очередное число.
   128 точек в четыре слоя: чем дальше слой, тем мельче точки, тише прозрачность
   и медленнее дрейф — так пустота за карточкой получает глубину, как на его разворотах.
   Раскладка сгенерирована один раз и зафиксирована: случайность здесь декоративная,
   а вот прыгающий при каждой сборке узор был бы дефектом */
.cdb-count--kirby { position: relative; overflow: hidden; isolation: isolate; }
.cdb-count--kirby > * { position: relative; z-index: 1; }
.cdb-count--kirby::before, .cdb-count--kirby::after,
.cdb-kirby__mid, .cdb-kirby__far {
  content: ""; position: absolute; inset: -25%; pointer-events: none; z-index: 0;
  opacity: 0; transition: opacity var(--cdb-slow) var(--cdb-ease);
}
/* Ближний слой — крупные точки */
.cdb-count--kirby::after {
  background:
    radial-gradient(circle 7px at 70% 66%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 11px at 26% 18%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 12px at 97% 2%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 83% 19%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 7px at 39% 86%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 7px at 95% 15%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 42% 31%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 91% 26%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 11px at 76% 60%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 17% 93%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 4% 21%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 83% 91%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 5% 97%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 57% 12%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 10% 70%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 71% 2%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 6% 62%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 13px at 91% 20%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 30% 58%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 37% 15%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 13px at 88% 45%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 49% 56%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 11px at 95% 67%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 10% 91%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 44% 92%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 11px at 75% 12%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 11px at 93% 0%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 22% 58%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 11px at 76% 45%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 10px at 34% 24%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 55% 17%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 90% 24%, var(--cdb-brand) 62%, transparent 63%);
}
/* Второй слой */
.cdb-count--kirby::before {
  background:
    radial-gradient(circle 8px at 64% 47%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 7px at 62% 71%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 48% 13%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 85% 44%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 7px at 68% 85%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 29% 45%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 11% 5%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 6% 83%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 95% 79%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 50% 27%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 94% 88%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 8px at 45% 87%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 37% 42%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 74% 26%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 79% 90%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 35% 8%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 4% 11%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 83% 4%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 57% 14%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 76% 45%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 59% 98%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 72% 37%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 62% 67%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 65% 21%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 40% 41%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 89% 69%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 21% 73%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 36% 81%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 51% 81%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 7px at 85% 5%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 9px at 20% 8%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 7px at 93% 86%, var(--cdb-brand) 62%, transparent 63%);
}
/* Третий и четвёртый слои живут на своих узлах: у элемента только два псевдоэлемента */
.cdb-kirby__mid {
  background:
    radial-gradient(circle 4px at 90% 80%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 68% 93%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 30% 98%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 56% 7%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 84% 19%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 1% 86%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 21% 53%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 39% 62%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 41% 12%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 5% 66%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 39% 23%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 36% 50%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 31% 32%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 35% 7%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 35% 81%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 83% 45%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 87% 33%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 37% 1%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 71% 13%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 61% 84%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 48% 37%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 23% 15%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 56% 34%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 67% 59%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 48% 79%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 16% 24%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 5px at 88% 77%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 41% 92%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 6px at 58% 72%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 9% 2%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 13% 50%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 32% 20%, var(--cdb-brand) 62%, transparent 63%);
}
.cdb-kirby__far {
  background:
    radial-gradient(circle 3px at 38% 46%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 78% 11%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 92% 77%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 38% 55%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 13% 51%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 72% 52%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 73% 31%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 1px at 63% 59%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 48% 50%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 1px at 61% 39%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 65% 21%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 42% 42%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 10% 47%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 76% 79%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 13% 67%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 6% 86%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 85% 23%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 1px at 66% 35%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 66% 25%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 69% 12%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 1px at 5% 87%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 46% 50%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 97% 98%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 21% 99%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 4px at 44% 71%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 1px at 82% 13%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 34% 78%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 61% 50%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 2px at 76% 42%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 26% 19%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 31% 6%, var(--cdb-brand) 62%, transparent 63%),
    radial-gradient(circle 3px at 4% 100%, var(--cdb-brand) 62%, transparent 63%);
}
.cdb-count--kirby:hover::after { opacity: .3; animation: cdb-kirby 2.4s var(--cdb-ease) infinite; }
.cdb-count--kirby:hover::before { opacity: .2; animation: cdb-kirby-far 3.6s var(--cdb-ease) infinite; }
.cdb-count--kirby:hover .cdb-kirby__mid { opacity: .14; animation: cdb-kirby 5.2s var(--cdb-ease) infinite reverse; }
.cdb-count--kirby:hover .cdb-kirby__far { opacity: .09; animation: cdb-kirby-far 7.4s var(--cdb-ease) infinite reverse; }
@keyframes cdb-kirby {
  0%, 100% { transform: scale(1) translate(0, 0); }
  50% { transform: scale(1.09) translate(-3px, -4px); }
}
@keyframes cdb-kirby-far {
  0%, 100% { transform: scale(1.04) translate(2px, 3px); }
  50% { transform: scale(1) translate(-2px, -2px); }
}

/* Шапка админского экрана: заголовок и пояснение, зачем экран нужен */
.cdb-pagehead { margin-bottom: var(--cdb-s5); }
.cdb-pagehead h1 { font-family: var(--cdb-font-display); font-weight: 800; font-size: clamp(24px, 2.6vw, 32px); letter-spacing: -.03em; margin: 0 0 var(--cdb-s2); }
.cdb-pagehead__hint { margin: 0; font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); max-width: 84ch; }

/* Строка состояния задачи крона. Треки под самое длинное содержимое шапки:
   «Длилось» вместо «Длительность» — иначе подпись не влезает и липнет к соседней */
.cdb-runrow { display: grid; grid-template-columns: 12px minmax(0, 1fr) 130px 110px 130px; gap: var(--cdb-s3); align-items: center; padding: 7px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-runrow > * { min-width: 0; }
.cdb-runrow:last-of-type { border-bottom: 0; }
.cdb-runrow:hover { background: var(--cdb-brand-soft); }
.cdb-runrow__dot { width: 10px; height: 10px; border-radius: 50%; background: var(--cdb-ok); }
.cdb-runrow__dot--warn { background: var(--cdb-warn); }
.cdb-runrow__dot--alert { background: var(--cdb-alert); }
.cdb-runrow__dot--idle { background: var(--cdb-ink-300); }
@container shell (max-width: 700px) {
  .cdb-runrow { grid-template-columns: 12px minmax(0, 1fr); grid-auto-rows: min-content; row-gap: 4px; padding-inline: 0; }
  .cdb-runrow > :nth-child(1) { grid-area: 1 / 1; }
  .cdb-runrow > :nth-child(2) { grid-area: 1 / 2; }
  .cdb-runrow > :nth-child(3) { grid-area: 2 / 2; }
  .cdb-runrow > :nth-child(4) { grid-area: 3 / 2; }
  .cdb-runrow > :nth-child(5) { grid-area: 2 / 2; justify-self: end; }
}

/* Полоса фильтров над админской таблицей */
.cdb-filterbar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); }
.cdb-filterbar__field { display: flex; flex-direction: column; gap: 4px; flex: 1 1 180px; min-width: 0; }
.cdb-filterbar__field--narrow { flex: 0 1 140px; }
.cdb-filterbar__field > label { font-size: var(--cdb-size-xs); font-weight: 600; color: var(--cdb-text-soft); }
.cdb-filterbar__submit { flex: none; }
/* Чекбокс и счётчик в полосе фильтров: выравниваются по строке контролов,
   а не по подписям — иначе «Найдено» повисает выше кнопки */
.cdb-filterbar__check { display: inline-flex; align-items: center; gap: var(--cdb-s2); flex: none; min-height: 36px; font-size: var(--cdb-size-sm); white-space: nowrap; }
.cdb-filterbar__check input { accent-color: var(--cdb-brand); width: 16px; height: 16px; flex: none; }
.cdb-filterbar__count { display: inline-flex; align-items: center; flex: none; min-height: 36px; font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); white-space: nowrap; }

/* Строка очереди модерации: отметка, тип, содержимое, автор, дата, действия.
   Отметка первой колонкой — как в остальных админских таблицах */
/* Колонка действий фиксированной ширины: при auto её трек меняется от числа кнопок
   в строке, и автор с датой расходятся с подписями шапки */
.cdb-qrow { display: grid; grid-template-columns: 32px 120px minmax(0, 1fr) 150px 110px 136px; gap: var(--cdb-s3); align-items: start; padding: var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-qrow:last-of-type { border-bottom: 0; }
.cdb-qrow:hover { background: var(--cdb-brand-soft); }
/* Каждая ячейка обязана уметь сжиматься: без min-width:0 длинная ссылка
   раздувает свой трек и выталкивает строку за карточку */
.cdb-qrow > * { min-width: 0; }
.cdb-qrow__body { min-width: 0; overflow-wrap: anywhere; }
.cdb-qrow__text { margin: 4px 0 0; color: var(--cdb-text-soft); overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.cdb-qrow__actions { display: flex; gap: 4px; flex-wrap: wrap; justify-content: flex-end; }

/* Плитка баннера: превью в рамке формата, метаданные, срок показа */
.cdb-banner { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: var(--cdb-s4); padding: var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); }
.cdb-banner:last-of-type { border-bottom: 0; }
.cdb-banner__frame { display: grid; place-items: center; border: 1px dashed var(--cdb-line-strong); border-radius: var(--cdb-r-sm); background: var(--cdb-bg-sunken); color: var(--cdb-text-faint); font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); text-align: center; padding: var(--cdb-s2); }
.cdb-banner__body { display: flex; flex-direction: column; gap: var(--cdb-s2); min-width: 0; }
.cdb-banner__actions { display: flex; flex-wrap: wrap; gap: var(--cdb-s2); margin-top: auto; }
@container shell (max-width: 760px) {
  .cdb-banner { grid-template-columns: minmax(0, 1fr); }
}

/* Карточка периода голосования */
.cdb-period { border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); overflow: hidden; }
.cdb-period__head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s2); padding: var(--cdb-s3) var(--cdb-s4); background: var(--cdb-surface-2); border-bottom: 1px solid var(--cdb-line); }
.cdb-period__dates { font-family: var(--cdb-font-mono); font-weight: 600; }
.cdb-period__meta { margin-left: auto; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-period__body { padding: var(--cdb-s3) var(--cdb-s4); }
/* Победитель периода: обложка, выпуск, голоса, кнопка отметки */
.cdb-winner { display: grid; grid-template-columns: 34px minmax(0, 1fr) 90px auto; gap: var(--cdb-s3); align-items: center; padding: 7px 0; border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-winner:last-child { border-bottom: 0; }
.cdb-winner > * { min-width: 0; }
@container shell (max-width: 760px) {
  .cdb-winner { grid-template-columns: 34px minmax(0, 1fr) auto; }
  .cdb-winner > :nth-child(3) { grid-column: 2; }
  .cdb-winner > :nth-child(4) { grid-row: 1 / span 2; grid-column: 3; }
}

/* Строка лога: моноширинный текст записи, переносится, но не растягивает таблицу.
   Длинная запись зажимается тремя строками; обрыв обозначен градиентом, а полный
   текст открывается по клику — CSS-переключатель на скрытом чекбоксе, без JS */
.cdb-logmsg { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); line-height: 1.5; overflow-wrap: anywhere; }
.cdb-logmsg--clamp { position: relative; }
.cdb-logmsg--clamp > input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.cdb-logmsg__text { display: block; max-height: 4.5em; overflow: hidden; }
.cdb-logmsg--clamp > label { display: inline-flex; align-items: center; gap: 5px; margin-top: 2px; font-family: var(--cdb-font-ui); font-size: var(--cdb-size-xs); font-weight: 600; color: var(--cdb-brand-text); cursor: pointer; }
.cdb-logmsg--clamp > label:hover { text-decoration: underline; }
/* Градиент-подсказка: текст уходит под фон карточки, значит продолжение есть */
.cdb-logmsg--clamp > label::before { content: ""; position: absolute; left: 0; right: 0; bottom: 1.4em; height: 1.4em; background: linear-gradient(to bottom, transparent, var(--cdb-surface)); pointer-events: none; }
.cdb-logmsg--clamp > label .cdb-logmsg__less { display: none; }
.cdb-logmsg--clamp > input:checked ~ .cdb-logmsg__text { max-height: none; }
.cdb-logmsg--clamp > input:checked ~ label::before { display: none; }
.cdb-logmsg--clamp > input:checked ~ label .cdb-logmsg__more { display: none; }
.cdb-logmsg--clamp > input:checked ~ label .cdb-logmsg__less { display: inline; }
.cdb-logmsg--clamp > input:checked ~ label .fa { transform: rotate(180deg); }
.cdb-logmsg--clamp > input:focus-visible ~ label { outline: 2px solid var(--cdb-brand); outline-offset: 2px; border-radius: var(--cdb-r-xs); }
/* На цветной строке фон другой — градиент подстраиваем под подложку */
.cdb-table tr.is-alert .cdb-logmsg--clamp > label::before { background: linear-gradient(to bottom, transparent, var(--cdb-alert-bg)); }
.cdb-table tr.is-warn .cdb-logmsg--clamp > label::before { background: linear-gradient(to bottom, transparent, var(--cdb-warn-bg)); }
/* Строка результата в таблице: цветная подложка вместо цветного текста */
.cdb-table tr.is-alert > td { background: var(--cdb-alert-bg); }
.cdb-table tr.is-warn > td { background: var(--cdb-warn-bg); }

/* Карточка обзора в модерации: обложка, метаданные выпуска, текст, статус.
   Рамка слева меняет цвет по решению модератора — Alpine ставит класс на успешный ответ */
.cdb-modreview { border: 1px solid var(--cdb-line); border-left: 3px solid var(--cdb-line-strong); border-radius: var(--cdb-r-md); background: var(--cdb-surface); overflow: hidden; }
.cdb-modreview--yes { border-left-color: var(--cdb-ok); }
.cdb-modreview--no { border-left-color: var(--cdb-alert); }
.cdb-modreview__head { display: grid; grid-template-columns: 72px minmax(0, 1fr) auto; gap: var(--cdb-s4); padding: var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); }
.cdb-modreview__head > * { min-width: 0; }
.cdb-modreview__meta { display: flex; flex-wrap: wrap; gap: var(--cdb-s2) var(--cdb-s4); font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
.cdb-modreview__body { padding: var(--cdb-s4); font-size: var(--cdb-size-sm); line-height: 1.55; color: var(--cdb-text-soft); }
.cdb-modreview__foot { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s2); padding: var(--cdb-s3) var(--cdb-s4); border-top: 1px solid var(--cdb-line); background: var(--cdb-surface-2); }
@container shell (max-width: 760px) {
  .cdb-modreview__head { grid-template-columns: 56px minmax(0, 1fr); }
  .cdb-modreview__head > :nth-child(3) { grid-column: 1 / -1; }
}

/* Пара «Читай также» в модерации: две серии со стрелкой между ними */
.cdb-pair { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s2) var(--cdb-s3); }
.cdb-pair__side { display: inline-flex; align-items: center; gap: var(--cdb-s2); min-width: 0; }
.cdb-pair__arrow { color: var(--cdb-text-faint); }

/* Правка описания на месте: текст и кнопки решения в одной строке таблицы */
.cdb-descrow { display: grid; grid-template-columns: 240px minmax(0, 1fr) 150px; gap: var(--cdb-s4); padding: var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); }
.cdb-descrow:last-of-type { border-bottom: 0; }
.cdb-descrow > * { min-width: 0; }
.cdb-descrow__actions { display: flex; flex-direction: column; gap: var(--cdb-s2); }
@container shell (max-width: 900px) {
  .cdb-descrow { grid-template-columns: minmax(0, 1fr); }
  .cdb-descrow__actions { flex-direction: row; flex-wrap: wrap; }
}

/* Пара похожих ников: расхождение подсвечено, вес работ рядом */
.cdb-nickpair { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s2) var(--cdb-s3); font-size: var(--cdb-size-sm); }
.cdb-nickpair__arrow { color: var(--cdb-text-faint); }
.cdb-nick { font-weight: 600; }
/* Жёлтым — ровно те символы, которыми ники расходятся */
.cdb-nick mark { background: var(--cdb-signal); color: var(--cdb-signal-ink); border-radius: 2px; padding: 0 1px; }
.cdb-nickpair__weights { display: inline-flex; align-items: baseline; gap: 6px; font-family: var(--cdb-font-mono); white-space: nowrap; }
.cdb-nickpair__weights span { font-family: var(--cdb-font-ui); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }

/* Строка участника с раскрывающимися формами переименования и слияния */
.cdb-inlineform { display: flex; flex-wrap: wrap; gap: var(--cdb-s2); margin-top: var(--cdb-s2); }
.cdb-inlineform .cdb-input { flex: 1 1 160px; min-width: 0; }

/* Группа пользователей: заголовок с иконкой прав и счётчиком */
.cdb-grouphead { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--cdb-s2) var(--cdb-s3); margin: 0 0 var(--cdb-s3); font-size: var(--cdb-size-h3); }
.cdb-grouphead__id { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); font-weight: 400; color: var(--cdb-text-faint); }

/* Форма «подпись слева, поле справа»: карточка пользователя, профиль, настройки */
.cdb-formgrid { display: grid; grid-template-columns: 160px minmax(0, 1fr); gap: var(--cdb-s4); align-items: start; }
.cdb-formgrid > label { font-size: var(--cdb-size-sm); font-weight: 600; color: var(--cdb-text-soft); padding-top: 9px; }
/* Чекбокс с описанием: не строка списка, а самостоятельный выбор в рамке */
.cdb-optioncheck { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-sm); background: var(--cdb-surface); cursor: pointer; }
.cdb-optioncheck:hover { border-color: var(--cdb-line-strong); }
.cdb-optioncheck input { margin: 2px 0 0; accent-color: var(--cdb-brand); width: 16px; height: 16px; flex: none; }
.cdb-optioncheck b { display: block; font-size: var(--cdb-size-sm); font-weight: 600; }
.cdb-optioncheck span span { display: block; font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); margin-top: 2px; }
/* Метаданные строкой: подпись капслоком, значение рядом */
.cdb-metaline { display: flex; flex-wrap: wrap; gap: 4px var(--cdb-s4); font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); }
.cdb-metaline b { font-weight: 600; color: var(--cdb-text-faint); font-size: var(--cdb-size-xs); letter-spacing: .06em; text-transform: uppercase; margin-right: 4px; }
@container shell (max-width: 700px) {
  .cdb-formgrid { grid-template-columns: minmax(0, 1fr); }
  .cdb-formgrid > label { padding-top: 0; }
}

/* Строка задачи с ручным запуском: имя команды, описание, кнопка */
.cdb-taskrow { display: grid; grid-template-columns: 200px minmax(0, 1fr) 150px; gap: var(--cdb-s4); align-items: center; padding: var(--cdb-s3) var(--cdb-s4); border-bottom: 1px solid var(--cdb-line); }
.cdb-taskrow:last-of-type { border-bottom: 0; }
.cdb-taskrow > * { min-width: 0; }
.cdb-taskrow__name { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-sm); font-weight: 600; }
.cdb-taskrow__hint { font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
@container shell (max-width: 760px) {
  .cdb-taskrow { grid-template-columns: minmax(0, 1fr) auto; }
  .cdb-taskrow > :nth-child(2) { grid-column: 1 / -1; }
}

/* Строка выпуска в событии: номер порядка, стрелки перестановки, обложка */
.cdb-eventrow { display: grid; grid-template-columns: 48px 44px 40px 120px minmax(0, 1fr) 110px; gap: var(--cdb-s3); align-items: center; padding: 7px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); font-size: var(--cdb-size-sm); }
.cdb-eventrow:last-of-type { border-bottom: 0; }
.cdb-eventrow > * { min-width: 0; }
.cdb-eventrow:hover { background: var(--cdb-brand-soft); }
@container shell (max-width: 900px) {
  .cdb-eventrow { grid-template-columns: 40px 40px minmax(0, 1fr) auto; }
  .cdb-eventrow > :nth-child(4) { grid-column: 3; }
  .cdb-eventrow > :nth-child(5) { grid-column: 3; }
}


/* ── 13. Состояния HTMX / Alpine ─────────────────────────────────────────── */
.cdb-skel { background: linear-gradient(90deg, var(--cdb-ink-100) 25%, var(--cdb-ink-200) 37%, var(--cdb-ink-100) 63%); background-size: 400% 100%; animation: cdb-shimmer 1.4s ease infinite; border-radius: var(--cdb-r-xs); }
@keyframes cdb-shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }
.htmx-request .cdb-hide-busy, .cdb-hide-busy.htmx-request { visibility: hidden; }
.cdb-spin { display: inline-block; width: 13px; height: 13px; border: 2px solid color-mix(in srgb, currentColor 30%, transparent); border-top-color: currentColor; border-radius: 50%; animation: cdb-spin .7s linear infinite; }
@keyframes cdb-spin { to { transform: rotate(360deg); } }
[aria-busy="true"] { opacity: .6; pointer-events: none; }
.cdb-swapping { transition: opacity var(--cdb-base) var(--cdb-ease); }
.cdb-swapping.htmx-swapping { opacity: 0; }
.cdb-toast { display: flex; align-items: center; gap: var(--cdb-s3); padding: var(--cdb-s3) var(--cdb-s4); border-radius: var(--cdb-r-sm); background: var(--cdb-ink-900); color: var(--cdb-ink-0); font-size: var(--cdb-size-sm); box-shadow: var(--cdb-e3); border-left: 3px solid var(--cdb-brand); }
.cdb-toast--ok    { border-left-color: var(--cdb-ok); }
.cdb-toast--alert { border-left-color: var(--cdb-alert); }
/* display: flex перебивает [hidden] браузера, поэтому скрытие подкрепляем явно:
   пустая строка сообщения иначе висит на экране светлой полосой */
.cdb-toast[hidden] { display: none; }
.cdb-empty { padding: var(--cdb-s7) var(--cdb-s5); text-align: center; color: var(--cdb-text-soft); border: 1px dashed var(--cdb-line-strong); border-radius: var(--cdb-r-md); }

/* ── 14. Раскладка ───────────────────────────────────────────────────────── */
/* Оболочка страницы — она же контейнер shell для @container-правил ниже */
.cdb-shell { max-width: var(--cdb-maxw); margin: 0 auto; padding: 0 var(--cdb-s5); container-type: inline-size; container-name: shell; }
.cdb-cols { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: var(--cdb-s6); align-items: start; }
/* Разворот «обложка слева»: ширину колонки экран задаёт через --cover-col */
.cdb-coverlayout { display: grid; grid-template-columns: var(--cover-col, 240px) minmax(0, 1fr); gap: var(--cdb-s5); align-items: start; }
.cdb-section { padding: var(--cdb-s6) 0; border-bottom: 1px solid var(--cdb-line); }
.cdb-section__head { display: flex; align-items: baseline; gap: var(--cdb-s3); margin-bottom: var(--cdb-s4); }
.cdb-section__head h2 { font-size: var(--cdb-size-h2); margin: 0; }
.cdb-stack { display: flex; flex-direction: column; gap: var(--cdb-s5); }
.cdb-row { display: flex; align-items: center; gap: var(--cdb-s3); }
@container page (max-width: 991px) { .cdb-topbar { gap: var(--cdb-s3); } }

/* ── 15. Адаптив ─────────────────────────────────────────────────────────────
 * Идёт последней секцией: правила на ширину должны перебивать базовые,
 * а специфичность у них та же — значит решает порядок.
 * ────────────────────────────────────────────────────────────────────────── */
/*
 * Экран один, вёрстка одна. Правила на ширину объявлены через @container,
 * потому что макеты живут и внутри узких блоков, а не только на узком окне:
 * @media там смотрит на окно и не срабатывает. Контейнеры — .cdb-shell
 * а сам экран — их родитель.
 * ────────────────────────────────────────────────────────────────────────── */

/* Разворот с обложкой: сначала худеет колонка обложки, к 900 складывается */
@container shell (max-width: 1100px) {
  .cdb-coverlayout { grid-template-columns: 180px minmax(0, 1fr); }
}

@container shell (max-width: 900px) {
  .cdb-cols { grid-template-columns: minmax(0, 1fr); gap: var(--cdb-s5); }
  .cdb-cols3 { grid-template-columns: minmax(0, 1fr); }
  .cdb-error { grid-template-columns: minmax(0, 1fr); justify-items: center; text-align: center; }
  .cdb-error__actions { flex-direction: column; width: 100%; }
  .cdb-review__issue { grid-template-columns: 56px minmax(0, 1fr); }
  .cdb-review__actions { grid-column: 2; }
  .cdb-srow { grid-template-columns: 30px 36px minmax(0, 1fr) 130px; }
  .cdb-srow__actions { display: none; }
}

/* Очередь модерации ломается раньше остальных списков: в строке пять колонок
   и четыре кнопки, поэтому порог у неё свой и выше общего */
@container shell (max-width: 1080px) {
  /* Одна колонка и явные области каждому ребёнку: при `1fr auto` трек auto
     раздувался по содержимому, 1fr схлопывался в ноль, и авто-размещённые
     дети печатались поверх соседей. Отметка остаётся слева и тянется на все строки */
  /* Шапка таблицы в один столбец нечитаема — на узком её роль берут подписи в строке */
  .cdb-qrow--head { display: none; }
  /* Подписи у кнопок массовых действий прячем: остаются иконки с title */
  .cdb-hide-narrow { display: none; }
  /* Полоса действий над списком переносится, а счётчик не растягивает её */
  .cdb-listbar { flex-wrap: wrap; row-gap: var(--cdb-s2); }
  .cdb-listbar > .cdb-row { margin-left: 0; }
  .cdb-qrow { grid-template-columns: 32px minmax(0, 1fr); grid-auto-rows: min-content; row-gap: 6px; }
  .cdb-qrow > :nth-child(1) { grid-area: 1 / 1 / span 4 / 2; }
  .cdb-qrow > :nth-child(2) { grid-area: 1 / 2; justify-self: start; }
  .cdb-qrow__body { grid-area: 2 / 2; }
  .cdb-qrow > :nth-child(4) { grid-area: 3 / 2; justify-self: start; }
  .cdb-qrow > :nth-child(5) { grid-area: 3 / 2; justify-self: end; align-self: center; }
  .cdb-qrow__actions { grid-area: 4 / 2; justify-content: flex-start; }
}

@container shell (max-width: 620px) {
  .cdb-facts { grid-template-columns: minmax(0, 1fr); row-gap: 2px; }
  .cdb-facts dd { margin-bottom: var(--cdb-s2); }
  /* Списки: метаданные и действия уходят под название, обложка остаётся слева */
  .cdb-issue, .cdb-srow { grid-template-columns: 40px minmax(0, 1fr); row-gap: 6px; padding-inline: 0; }
  .cdb-issue > .cdb-tag { grid-column: 2; justify-self: start; }
  .cdb-coverlayout { grid-template-columns: minmax(0, 1fr); }
  .cdb-coverlayout > :first-child { max-width: 200px; }
  .cdb-issue__actions, .cdb-srow__actions { display: flex; grid-column: 2; flex-wrap: wrap; }
  .cdb-srow__num { display: none; }
  .cdb-srow .cdb-meter { grid-column: 2; }
  .cdb-facets { grid-template-columns: minmax(0, 1fr); }
  .cdb-months { grid-template-columns: 1fr 1fr; }
  .cdb-letters { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
  .cdb-letters a { min-height: 56px; font-size: 17px; }
  .cdb-stats { grid-template-columns: 1fr 1fr; }
  .cdb-picker__label { width: 100%; }
  .cdb-voteresult, .cdb-voteoption { grid-template-columns: 44px minmax(0, 1fr) auto; }
  .cdb-pairs li { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .cdb-readmore { grid-template-columns: repeat(auto-fill, minmax(86px, 1fr)); gap: var(--cdb-s3); }
  .cdb-chart__canvas { height: 200px; }
  .cdb-error__burst { width: 150px; height: 150px; }
  .cdb-error__code { font-size: 38px; }
  .cdb-error__sound { bottom: 26px; font-size: 13px; }
  /* Ленты чипов и вкладок прокручиваются вбок вместо переноса в четыре ряда */
  .cdb-chips, .cdb-pills { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
  .cdb-chips::-webkit-scrollbar, .cdb-pills::-webkit-scrollbar { display: none; }
  .cdb-chips > *, .cdb-pills > * { flex: none; }
  /* Цели нажатия крупнее */
  .cdb-btn { min-height: 44px; }
  .cdb-btn--sm { min-height: 36px; }
  .cdb-btn--icon { width: 44px; }
  .cdb-btn--sm.cdb-btn--icon { width: 36px; }
  .cdb-btn--lg { min-height: 46px; }
  /* Визуально кнопка остаётся 36px — ряд не пухнет, но невидимая зона нажатия 44px */
  .cdb-btn--sm::after { content: ""; position: absolute; inset: -4px; }
  .cdb-issue__actions, .cdb-srow__actions { gap: var(--cdb-s2); }
  .cdb-input, .cdb-search { min-height: 44px; }
  .cdb-hero { font-size: clamp(24px, 7vw, 30px); }
  .cdb-section__head { flex-wrap: wrap; }
  /* Широкая таблица прокручивается целиком, а не сжимает колонки до переноса
     каждого слова: min-width отменяет усадку внутри .cdb-tablewrap */
  .cdb-tablewrap > table { min-width: 620px; }
  /* Слитная группа кнопок на узком рассыпается в обычные кнопки с переносом:
     иначе она уезжает за край экрана */
  .cdb-btn__group { flex-wrap: wrap; gap: 6px; }
  .cdb-btn__group .cdb-btn { border-radius: var(--cdb-r-sm); margin-left: 0; }
  .cdb-btn__group .cdb-btn:first-child, .cdb-btn__group .cdb-btn:last-child { border-radius: var(--cdb-r-sm); }
  /* Пагинация остаётся слитной: цифры узкие и в строку влезают */
  .cdb-btn__group--pager { flex-wrap: nowrap; gap: 0; }
  .cdb-btn__group--pager .cdb-btn { margin-left: -1px; border-radius: 0; }
  .cdb-btn__group--pager .cdb-btn:first-child { border-radius: var(--cdb-r-sm) 0 0 var(--cdb-r-sm); margin-left: 0; }
  .cdb-btn__group--pager .cdb-btn:last-child { border-radius: 0 var(--cdb-r-sm) var(--cdb-r-sm) 0; }
  .cdb-eventform__actions .cdb-note { align-self: flex-start; }
}

.cdb-note { font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); margin: var(--cdb-s2) 0 0; }


/* ── 15а. Экранные раскладки: Issue и Profile ─────────────────────────────
   Жили в <helmet> артбордов; вынесены сюда, чтобы адаптив не потерялся
   при переносе разметки в шаблоны */
.ik-layout { /* базовая сетка объявлена инлайном на экране */ }
@container shell (max-width: 767px) {
  .ik-layout { grid-template-columns: minmax(0, 1fr); }
  .ik-cover { max-width: 220px; }
}
.pk-row { display: grid; grid-template-columns: 40px minmax(0, 1fr) 300px; gap: var(--cdb-s3); align-items: center; padding: 9px var(--cdb-s3); border-bottom: 1px solid var(--cdb-line); }
.pk-row:last-of-type { border-bottom: 0; }
.pk-row:hover { background: var(--cdb-brand-soft); }
.pk-row > * { min-width: 0; }
.pk-row__title { font-weight: 600; font-size: var(--cdb-size-sm); color: var(--cdb-text); }
.pk-row__title:hover { color: var(--cdb-brand-text); }
.pk-row__vol { font-family: var(--cdb-font-mono); font-weight: 400; color: var(--cdb-text-faint); }
@container shell (max-width: 767px) { .pk-row { grid-template-columns: 36px minmax(0, 1fr); } }

/* ── 15б. Хром страницы: вынесено из повторявшихся инлайновых раскладок ── */
.cdb-root { min-height: 100vh; background: var(--cdb-bg); color: var(--cdb-text); font-family: var(--cdb-font-ui); }
.cdb-search--topbar { margin-left: auto; flex: 1 1 220px; max-width: 340px; min-height: 34px; }
.cdb-main { padding-top: var(--cdb-s5); padding-bottom: var(--cdb-s8); }
.cdb-main--tight { padding-top: var(--cdb-s4); }
.cdb-crumbs { font-size: var(--cdb-size-sm); color: var(--cdb-text-faint); margin-bottom: var(--cdb-s3); }
.cdb-ava { width: 22px; height: 22px; border-radius: 50%; background: var(--cdb-brand-soft); color: var(--cdb-brand-text); display: grid; place-items: center; font-size: 10px; font-weight: 700; }
.cdb-footer { border-top: 1px solid var(--cdb-line); background: var(--cdb-surface); }
.cdb-footer__in { padding-top: var(--cdb-s5); padding-bottom: var(--cdb-s6); display: flex; gap: var(--cdb-s5); flex-wrap: wrap; align-items: center; }
.cdb-footer__note { margin: 0; font-size: var(--cdb-size-sm); color: var(--cdb-text-soft); max-width: 52ch; }
.cdb-footer__links { margin-left: auto; gap: var(--cdb-s4); font-size: var(--cdb-size-sm); }
.cdb-tag--warn { background: var(--cdb-warn-bg); color: var(--cdb-warn); }

/* ── 15в. Общий поиск «везде» (search/all.php, search/list.php) ──────────────
   Классы идут на сайт как есть. Секции категорий разделены большим интервалом
   намеренно: сетка и карточки закрыты в APBlackList, и рекламе остаётся только
   воздух между категориями (блок 100–250px во всю ширину). Не сжимать. */
.search-all { display: flex; flex-direction: column; }
.search-all__block { margin-top: var(--cdb-s7); }
.search-all__block:first-child { margin-top: var(--cdb-s4); }
.search-all__title { margin: 0 0 var(--cdb-s3); font-size: var(--cdb-size-h3); }
.search-all__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(7.5rem, 11rem)); gap: var(--cdb-s3); }
.search-all__grid--text { grid-template-columns: repeat(auto-fill, minmax(13rem, 20rem)); }
.search-all__more { display: inline-block; margin-top: var(--cdb-s3); font-size: var(--cdb-size-sm); font-weight: 600; }
.search-card { display: flex; flex-direction: column; border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface); overflow: hidden; }
.search-card:hover { border-color: var(--cdb-brand); }
/* Заглушка лежит ПОД обложкой всегда: часть ссылок на ComicVine мертва,
   и узнать это можно только загрузкой — не загрузилась, сквозь неё видно иконку */
.search-card__cover { position: relative; display: block; height: 8rem; background: var(--cdb-surface-2); }
.search-card__cover img { position: relative; width: 100%; height: 100%; object-fit: cover; object-position: top; display: block; }
.search-card__cover-empty { position: absolute; inset: 0; display: grid; place-items: center; font-size: 28px; color: var(--cdb-text-faint); }
.search-card__body { display: flex; flex-direction: column; gap: 2px; flex: 1; padding: var(--cdb-s2) var(--cdb-s3) var(--cdb-s3); }
.search-card__title { font-weight: 600; font-size: var(--cdb-size-sm); line-height: 1.3; color: var(--cdb-text); }
.search-card__title:hover { color: var(--cdb-brand-text); }
.search-card__note { font-size: var(--cdb-size-xs); color: var(--cdb-text-soft); }
/* Число прижато к низу: при именах разной длины счётчики стоят на одном уровне */
.search-card__count { margin-top: auto; padding-top: 6px; font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.search-card--text .search-card__body { padding: var(--cdb-s3); }
.search-card--text .search-card__count { padding-top: 8px; }
/* Все результаты: голый список имён, до сотни на странице */
.search-list { columns: 3 14rem; column-gap: var(--cdb-s5); list-style: none; margin: 0 0 var(--cdb-s5); padding: 0; }
.search-list li { break-inside: avoid; padding: 3px 0; font-size: var(--cdb-size-sm); }
@container shell (max-width: 620px) {
  .search-all__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .search-all__grid--text { grid-template-columns: minmax(0, 1fr); }
  .search-card__note { display: none; } /* имя и число важнее */
}

/* ── 16. Витрина дизайн-системы ──────────────────────────────────────────────
   Служебные классы Design System Kadr.dc.html. НА САЙТ НЕ ИДУТ. */
.cdb-demogrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--cdb-s4); }
.cdb-demostack { display: flex; flex-direction: column; gap: var(--cdb-s5); }
.cdb-demorow { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cdb-s3); }
.cdb-demolabel { font-family: var(--cdb-font-mono); font-size: var(--cdb-size-xs); color: var(--cdb-text-faint); }
.cdb-demorow > .cdb-demolabel { flex: none; min-width: 110px; }
.cdb-swatch { display: flex; flex-direction: column; gap: 4px; font-size: var(--cdb-size-xs); }
.cdb-swatch i { display: block; height: 56px; border-radius: var(--cdb-r-sm); border: 1px solid var(--cdb-line); }
.cdb-swatch b { font-weight: 600; }
.cdb-swatch code { font-family: var(--cdb-font-mono); color: var(--cdb-text-faint); }
.cdb-code { margin: 0; padding: var(--cdb-s3) var(--cdb-s4); border: 1px solid var(--cdb-line); border-radius: var(--cdb-r-md); background: var(--cdb-surface-2); font-family: var(--cdb-font-mono); font-size: var(--cdb-size-sm); line-height: 1.55; overflow-x: auto; }
.cdb-code b { font-weight: 600; color: var(--cdb-brand-text); }
