/* =============================================================
   HubNext — Custom styles (поверх Bootstrap 5)
   Версия: 0.1
   ============================================================= */

/* ── DESIGN TOKENS ──────────────────────────────────────────── */
:root {
    --dk-accent: #eb5d1e;
    --dk-primary: #eb5d1e;
    --dk-accent-hover: #d44f14;
    --dk-accent-dim: rgba(235, 93, 30, 0.1);
    --dk-accent-light: #f07a45;

    --dk-sidebar-bg: #111827;
    --dk-sidebar-text: #9ca3af;
    --dk-sidebar-hover: #1f2937;
    --dk-sidebar-divider: #2c3a52;
    --dk-sidebar-label: #4b5563;
    --dk-sidebar-active: #eb5d1e;

    --dk-border: #e4e4e7;
    --dk-border-light: #f0f0f2;

    --dk-text: #111118;
    --dk-text-muted: #71717a;
    --dk-text-light: #a1a1aa;

    --dk-bg: #fef8f5;
    --dk-bg-row-hover: #fafafa;

    --dk-status-new: #3b82f6;
    --dk-status-inwork: #06b6d4;
    --dk-status-pause: #f59e0b;
    --dk-status-solved: #06b6d4;
    --dk-status-closed: #6b7280;
    --dk-status-problem: #ef4444;
    --dk-status-check: #8b5cf6;

    --dk-white: #ffffff;
    --dk-surface: #ffffff;
    --dk-bg-body: #f5f5f5;

    --dk-danger: #ef4444;
    --dk-danger-dim: rgba(239, 68, 68, 0.1);
    --dk-danger-hover: #dc2626;

    --dk-success: #10b981;
    --dk-success-dim: rgba(16, 185, 129, 0.1);

    --dk-p-critical: #ef4444;
    --dk-p-high: #f59e0b;
    --dk-p-medium: #3b82f6;
    --dk-p-low: #94a3b8;

    --dk-sidebar-text-hover: #d0d0dc;

    --dk-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.08);
    --dk-shadow-md: 0 8px 28px rgba(0, 0, 0, 0.13);
    --dk-shadow-dark: 0 6px 20px rgba(0, 0, 0, 0.4);

    --dk-font: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    --dk-font-mono: "SFMono-Regular", "Consolas", "Liberation Mono", monospace;
    /* Шкала размеров шрифта (rem, база 16px) — см. CLAUDE.md §font-scale */
    --dk-fs-8: 0.5rem; /* 8px */
    --dk-fs-9: 0.5625rem; /* 9px */
    --dk-fs-10: 0.625rem; /* 10px */
    --dk-fs-10-5: 0.65625rem; /* 10.5px */
    --dk-fs-11: 0.6875rem; /* 11px */
    --dk-fs-11-5: 0.71875rem; /* 11.5px */
    --dk-fs-12: 0.75rem; /* 12px */
    --dk-fs-12-5: 0.78125rem; /* 12.5px */
    --dk-fs-13: 0.8125rem; /* 13px */
    --dk-fs-13-5: 0.84375rem; /* 13.5px */
    --dk-fs-14: 0.875rem; /* 14px */
    --dk-fs-15: 0.9375rem; /* 15px */
    --dk-fs-16: 1rem; /* 16px */
    --dk-fs-17: 1.0625rem; /* 17px */
    --dk-fs-18: 1.125rem; /* 18px */
    --dk-fs-19: 1.1875rem; /* 19px */
    --dk-fs-20: 1.25rem; /* 20px */
    --dk-fs-22: 1.375rem; /* 22px */
    --dk-fs-26: 1.625rem; /* 26px */
    --dk-fs-28: 1.75rem; /* 28px */
    --dk-fs-32: 2rem; /* 32px */
    --dk-fs-40: 2.5rem; /* 40px */

    --dk-radius: 6px;
    --dk-radius-lg: 10px;
    --dk-radius-sm: 4px;

    /* Отчёты (Reports) — фирменный цвет модуля, см. CLAUDE.md / DONEXT.md */
    --dk-report: #2563eb;
    --dk-report-hover: #1d4ed8;
    --dk-report-dim: rgba(37, 99, 235, 0.1);
    --dk-sidebar-w: 220px;
}

/* ── ТЁМНАЯ ТЕМА (переключатель в профиле -> "Обо мне", migration 101) ──
   Включается атрибутом data-theme="dark" на <html> (views/v_header.php,
   значение из $_SESSION['theme'], читается из users.theme при логине --
   см. appopen/vohr.php setSession()). Без мигания светлым при загрузке,
   т.к. атрибут ставится сервером ещё до первой отрисовки.

   Стратегия: переопределяем существующие --dk-* переменные -- почти все
   кастомные стили в этом файле их и используют, так что большая часть
   интерфейса адаптируется сама, без точечных правок под каждый компонент.
   --dk-white НЕ трогаем -- он одновременно и "белый фон карточки", и
   "белый текст на цветной кнопке/чипе"; для фонов завели отдельную
   --dk-surface (см. выше и механическую замену background: var(--dk-white)
   -> background: var(--dk-surface) по всему файлу), а --dk-white остаётся
   чистым белым в любой теме -- то, что нужно тексту на цветных кнопках.
   Статусные/приоритетные цвета (--dk-status-*, --dk-p-*, --dk-danger,
   --dk-success, --dk-report, --dk-accent) не переопределяем -- они и так
   насыщенные, читаются на тёмном фоне не хуже, чем на светлом.

   Плюс -- минимальный набор переопределений dli чистых Bootstrap-
   компонентов (форма, dropdown, modal, табы, таблица, карточка) ниже:
   у них своих --dk-* переменных нет, стили едут из bootstrap.min.css,
   а его самого мы не трогаем (CLAUDE.md: вся CSS только в doka.css).

   Известное ограничение (сознательно вне этого прохода): Toast UI Editor
   (текст комментариев/описаний задач), Tabulator (таблицы в "Отчётах") и
   Prism (подсветка кода) -- сторонние стили со своей системой тем, могут
   остаться светлыми внутри тёмной темы до отдельной правки. */
:root[data-theme="dark"] {
    --dk-border: #2c2b33;
    --dk-border-light: #232228;

    --dk-text: #ececf1;
    --dk-text-muted: #9c99a6;
    --dk-text-light: #6c6975;

    --dk-bg: #1a1920;
    --dk-bg-row-hover: #242329;

    --dk-surface: #201f26;
    --dk-bg-body: #121116;

    --dk-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.4);
    --dk-shadow-md: 0 8px 28px rgba(0, 0, 0, 0.55);

    --dk-accent-dim: rgba(235, 93, 30, 0.18);
    --dk-danger-dim: rgba(239, 68, 68, 0.18);
    --dk-success-dim: rgba(16, 185, 129, 0.18);
    --dk-report-dim: rgba(37, 99, 235, 0.2);
}

/* Bootstrap-компоненты без своих --dk-* переменных -- см. комментарий выше */
[data-theme="dark"] .form-control,
[data-theme="dark"] .form-select {
    background-color: var(--dk-surface);
    color: var(--dk-text);
    border-color: var(--dk-border);
}
[data-theme="dark"] .form-control:focus,
[data-theme="dark"] .form-select:focus {
    background-color: var(--dk-surface);
    color: var(--dk-text);
}
[data-theme="dark"] .form-control::placeholder {
    color: var(--dk-text-light);
}
[data-theme="dark"] .form-control:disabled,
[data-theme="dark"] .form-select:disabled {
    background-color: var(--dk-bg);
    color: var(--dk-text-muted);
}
[data-theme="dark"] .form-check-input {
    background-color: var(--dk-surface);
    border-color: var(--dk-border);
}
[data-theme="dark"] .input-group-text {
    background-color: var(--dk-bg);
    color: var(--dk-text-muted);
    border-color: var(--dk-border);
}

[data-theme="dark"] .dropdown-menu {
    background-color: var(--dk-surface);
    border-color: var(--dk-border);
    box-shadow: var(--dk-shadow-md);
}
[data-theme="dark"] .dropdown-item {
    color: var(--dk-text);
}
[data-theme="dark"] .dropdown-item:hover,
[data-theme="dark"] .dropdown-item:focus {
    background-color: var(--dk-bg-row-hover);
    color: var(--dk-text);
}
[data-theme="dark"] .dropdown-divider {
    border-color: var(--dk-border);
}

[data-theme="dark"] .modal-content {
    background-color: var(--dk-surface);
    color: var(--dk-text);
}
[data-theme="dark"] .modal-header,
[data-theme="dark"] .modal-footer {
    border-color: var(--dk-border);
}
[data-theme="dark"] .btn-close {
    filter: invert(1) grayscale(1);
}

[data-theme="dark"] .nav-tabs {
    border-color: var(--dk-border);
}
[data-theme="dark"] .nav-tabs .nav-link {
    color: var(--dk-text-muted);
}
[data-theme="dark"] .nav-tabs .nav-link.active {
    background-color: transparent;
    color: var(--dk-text);
    border-color: var(--dk-border) var(--dk-border) transparent;
}

[data-theme="dark"] .table {
    color: var(--dk-text);
    border-color: var(--dk-border);
}
[data-theme="dark"] .table > :not(caption) > * > * {
    border-bottom-color: var(--dk-border);
    color: var(--dk-text);
}

[data-theme="dark"] .card {
    background-color: var(--dk-surface);
    border-color: var(--dk-border);
    color: var(--dk-text);
}

[data-theme="dark"] hr {
    border-color: var(--dk-border);
    opacity: 0.5;
}

[data-theme="dark"] .form-text {
    color: var(--dk-text-muted);
}

/* Bootstrap текстовые/фоновые утилиты со своим !important -- по умолчанию
   рассчитаны на светлый фон (--bs-secondary-color/--bs-border-color и т.п.
   не меняются нашим data-theme, только --dk-*). Без этого .text-muted
   (176 использований) остаётся тёмно-серым на тёмном фоне -- почти нечитаемо. */
[data-theme="dark"] .text-muted,
[data-theme="dark"] .text-secondary,
[data-theme="dark"] .text-body-secondary {
    color: var(--dk-text-muted) !important;
}
[data-theme="dark"] .bg-white {
    background-color: var(--dk-surface) !important;
}
[data-theme="dark"] .border {
    border-color: var(--dk-border) !important;
}

/* ── RESET / BASE ───────────────────────────────────────────── */
body {
    font-family: var(--dk-font);
    color: var(--dk-text);
    background: var(--dk-bg-body);
}

a {
    color: var(--dk-accent);
    text-decoration: none;
}
a:hover {
    text-decoration: underline;
}

/* ── APP LAYOUT ─────────────────────────────────────────────── */
.dk-app {
    display: flex;
    height: 100vh;
    overflow: hidden;
}

/* ── SIDEBAR ─────────────────────────────────────────────────── */
.dk-sidebar {
    width: var(--dk-sidebar-w);
    min-width: var(--dk-sidebar-w);
    background: var(--dk-sidebar-bg);
    display: flex;
    flex-direction: column;
    overflow-y: auto;
}

.dk-sidebar-logo {
    padding: 18px 16px 14px;
    position: relative;
    display: flex;
    align-items: center;
    gap: 0;
}
.dk-logo-link {
    text-decoration: none;
    color: inherit;
    display: block;
    flex: 1;
}
.dk-logo-link:hover {
    color: inherit;
}

.dk-logo-mark {
    font-size: var(--dk-fs-20);
    font-weight: 800;
    letter-spacing: -0.5px;
    color: var(--dk-white);
    line-height: 1;
}

.dk-logo-mark span {
    color: var(--dk-accent);
}

/* Свёрнутый sidebar -- полное "HubNext" не помещается на 52px, поэтому
   рядом с полной версией (класс .dk-sidebar-text -- скрывается общим
   правилом .dk-collapsed .dk-sidebar-text) держим короткую "HN", которая
   показывается только в свёрнутом режиме. */
.dk-logo-mark-short {
    display: none;
}
.dk-sidebar.dk-collapsed .dk-logo-mark-short {
    display: block;
}

.dk-logo-org {
    font-size: var(--dk-fs-12);
    color: var(--dk-sidebar-label);
    margin-top: 2px;
}

.dk-sidebar-section {
    padding: 8px 8px 4px;
}

.dk-sidebar-section-label {
    font-size: var(--dk-fs-10);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--dk-sidebar-label);
    padding: 0 8px 4px;
}

.dk-nav-item {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 7px 8px;
    border-radius: var(--dk-radius);
    font-size: var(--dk-fs-13-5);
    color: var(--dk-sidebar-text);
    text-decoration: none;
    cursor: pointer;
    transition:
        background 0.1s,
        color 0.1s;
    user-select: none;
}

.dk-nav-item:hover {
    background: var(--dk-sidebar-hover);
    color: var(--dk-sidebar-text-hover);
    text-decoration: none;
}

.dk-nav-item.active {
    background: var(--dk-accent-dim);
    color: var(--dk-sidebar-active);
}

.dk-nav-icon {
    width: 16px;
    text-align: center;
    font-size: var(--dk-fs-14);
    opacity: 0.8;
    flex-shrink: 0;
}

.dk-nav-badge {
    margin-left: auto;
    background: var(--dk-accent);
    color: #fff;
    font-size: var(--dk-fs-11);
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 10px;
    line-height: 1.4;
}

.dk-nav-item.active .dk-nav-badge {
    background: var(--dk-surface);
    color: var(--dk-accent);
}

.dk-sidebar .dk-sidebar-divider {
    height: 1px;
    background: var(--dk-sidebar-divider);
    margin: 8px 16px;
}

/* ── Вложенное подменю в сайдбаре (Проекты/Документы/Теги под "Задачи",
   Продукты/Теги CRM под "Дашборд") -- клик по самому пункту ведёт на его
   страницу, отдельная стрелка справа раскрывает/закрывает подсписок.
   Открыто по умолчанию, если активная страница -- один из вложенных
   пунктов (см. $tasksGroupOpen/$crmGroupOpen в v_header.php). ── */
.dk-nav-group {
    display: flex;
    align-items: center;
    gap: 2px;
}
.dk-nav-group .dk-nav-group-link {
    flex: 1;
    min-width: 0;
}
.dk-nav-group-toggle {
    flex-shrink: 0;
    width: 28px;
    height: 28px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: none;
    border-radius: var(--dk-radius);
    color: var(--dk-sidebar-text);
    cursor: pointer;
}
.dk-nav-group-toggle:hover {
    background: var(--dk-sidebar-hover);
    color: var(--dk-sidebar-text-hover);
}
.dk-nav-group-chevron {
    font-size: var(--dk-fs-12);
    transition: transform 0.15s ease;
}
.dk-nav-group-toggle[aria-expanded="true"] .dk-nav-group-chevron {
    transform: rotate(90deg);
}
.dk-nav-group-wrap {
    position: relative;
}
.dk-nav-subgroup {
    display: flex;
    flex-direction: column;
    margin: 2px 0 2px 14px;
    padding-left: 11px;
    border-left: 1px solid var(--dk-sidebar-divider);
    gap: 0;
}
.dk-nav-subgroup-closed {
    display: none;
}
.dk-nav-subitem {
    font-size: var(--dk-fs-13);
}
/* Заголовок флаута в свёрнутом режиме ("Задачи"/"CRM"/"Сделки") -- в
   обычном (развёрнутом, аккордеон) режиме скрыт: там сам родительский
   пункт уже виден строкой выше, повторять название не нужно. */
.dk-nav-subgroup-label {
    display: none;
}

.dk-sidebar.dk-collapsed .dk-nav-subgroup-label {
    display: block;
    font-size: var(--dk-fs-11);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .3px;
    color: var(--dk-sidebar-label);
    padding: 2px 8px 6px;
    margin-bottom: 4px;
    border-bottom: 1px solid var(--dk-sidebar-divider);
    white-space: nowrap;
    /* Теперь это <a> (кликабельный заголовок флаута -- заходит на ту же
       страницу, что и сам родительский пункт), а не декоративный <div>. */
    text-decoration: none;
    display: block;
    cursor: pointer;
}
a.dk-nav-subgroup-label:hover {
    color: var(--dk-sidebar-text-hover);
}

.dk-sidebar-footer {
    margin-top: auto;
    padding: 12px 8px;
    border-top: 1px solid var(--dk-sidebar-divider);
}

.dk-user-item {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 7px 8px;
    border-radius: var(--dk-radius);
    cursor: pointer;
    transition: background 0.1s;
}

.dk-user-item:hover {
    background: var(--dk-sidebar-hover);
}

/* ── AVATAR ──────────────────────────────────────────────────── */
.dk-avatar {
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: var(--dk-accent);
    color: var(--dk-white);
    font-size: var(--dk-fs-11);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}

.dk-avatar-lg {
    width: 34px;
    height: 34px;
    font-size: var(--dk-fs-13);
}

.dk-user-info {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
}

.dk-user-name {
    font-size: var(--dk-fs-13);
    color: var(--dk-sidebar-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.dk-user-org {
    font-size: var(--dk-fs-11);
    color: var(--dk-sidebar-muted, var(--dk-text-muted));
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ── ORG SWITCHER (футер сайдбара) ──────────────────────────────── */
.dk-user-row {
    display: flex;
    align-items: center;
    gap: 2px;
}
.dk-org-drop {
    position: relative;
    flex-shrink: 0;
}
.dk-org-drop-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    background: none;
    border: none;
    color: var(--dk-sidebar-muted, var(--dk-text-muted));
    cursor: pointer;
    border-radius: 5px;
    transition:
        color 0.15s,
        background 0.15s;
}
.dk-org-drop-btn:hover {
    color: var(--dk-white);
    background: var(--dk-sidebar-hover);
}
.dk-org-chevron {
    font-size: var(--dk-fs-12);
    transition: transform 0.15s;
}
.dk-org-drop.open .dk-org-chevron {
    transform: rotate(180deg);
}
.dk-org-drop-menu {
    display: none;
    position: absolute;
    bottom: calc(100% + 6px);
    right: 0;
    background: var(--dk-sidebar-hover);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 7px;
    padding: 4px;
    min-width: 180px;
    max-height: 260px;
    overflow-y: auto;
    z-index: 200;
    box-shadow: var(--dk-shadow-dark);
}
.dk-org-drop.open .dk-org-drop-menu {
    display: block;
}
.dk-org-drop-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 7px 10px;
    font-size: var(--dk-fs-12);
    color: var(--dk-sidebar-text);
    text-decoration: none;
    border-radius: 5px;
    white-space: nowrap;
    transition:
        background 0.12s,
        color 0.12s;
}
.dk-org-drop-item:hover {
    background: rgba(255, 255, 255, 0.07);
    color: var(--dk-white);
    text-decoration: none;
}
.dk-org-drop-item.active {
    color: var(--dk-accent);
    font-weight: 600;
}

/* В свёрнутом сайдбаре — скрыть */
.dk-collapsed .dk-org-drop {
    display: none;
}

/* ── MAIN AREA ───────────────────────────────────────────────── */
.dk-main {
    flex: 1;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    min-width: 0;
}

/* ── TOPBAR ──────────────────────────────────────────────────── */
.dk-topbar {
    height: 48px;
    border-bottom: 1px solid var(--dk-border);
    display: flex;
    align-items: center;
    padding: 0 20px;
    gap: 12px;
    flex-shrink: 0;
    background: var(--dk-surface);
}

.dk-breadcrumb {
    font-size: var(--dk-fs-13-5);
    color: var(--dk-text-muted);
    display: flex;
    align-items: center;
    gap: 6px;
    flex: 1;
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
}

.dk-breadcrumb a {
    color: var(--dk-text-muted);
    text-decoration: none;
    flex-shrink: 0;
}

.dk-breadcrumb a:hover {
    color: var(--dk-text);
}

.dk-breadcrumb-sep {
    color: var(--dk-border);
    flex-shrink: 0;
}

.dk-breadcrumb-current {
    color: var(--dk-text);
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

.dk-topbar-actions {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 8px;
}

/* ── CONTENT ─────────────────────────────────────────────────── */
.dk-content {
    flex: 1;
    overflow-y: auto;
    overflow-x: hidden;
    min-width: 0;
    padding: 24px;
}

/* ── BUTTONS ─────────────────────────────────────────────────── */
.dk-btn {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 7px 14px;
    font-size: var(--dk-fs-13-5);
    font-weight: 500;
    font-family: var(--dk-font);
    border-radius: var(--dk-radius);
    cursor: pointer;
    border: none;
    transition: background 0.12s;
    text-decoration: none;
    line-height: 1.4;
}

.dk-btn:hover {
    text-decoration: none;
}
.dk-btn:disabled {
    opacity: 0.5;
    cursor: default;
    pointer-events: none;
}

/* Отчёт "План - Факт": контекстный фильтр по подпроекту -- отдельный класс
   вместо Bootstrap .d-flex, у которого display:flex идёт с !important и
   перебивает инлайновый style="display:none", которым его показывает/прячет
   DkGantt.updateSubprojectFilterUI() (js/dk-gantt.js). */
.dk-gantt-subproject-wrap {
    display: flex;
    align-items: center;
    gap: 4px;
}

.dk-btn-primary {
    background: var(--dk-accent);
    color: var(--dk-white);
}

.dk-btn-primary:hover {
    background: var(--dk-accent-hover);
    color: var(--dk-white);
}

.dk-btn-blue {
    background: #3b82f6;
    color: var(--dk-white);
}
.dk-btn-blue:hover {
    background: #2563eb;
    color: var(--dk-white);
}
.dk-btn-ghost {
    background: transparent;
    color: var(--dk-text-muted);
    border: 1px solid var(--dk-border);
}

.dk-btn-ghost:hover {
    background: var(--dk-bg);
    color: var(--dk-text);
}

/* Watch button */
.dk-watch-btn {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: var(--dk-fs-13);
    font-weight: 400;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: color 0.15s;
    white-space: nowrap;
}
.dk-watch-btn i {
    font-size: var(--dk-fs-13);
}
.dk-watch-btn:hover {
    color: var(--dk-text);
}
.dk-watch-btn.dk-watch-active {
    color: var(--dk-accent);
}
.dk-watch-btn.dk-watch-active:hover {
    color: var(--dk-accent);
    opacity: 0.8;
}
.dk-watch-btn:disabled {
    opacity: 0.5;
    cursor: default;
}

/* ── SEARCH ──────────────────────────────────────────────────── */
.dk-search-wrap {
    position: relative;
}

.dk-search-icon {
    position: absolute;
    left: 9px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--dk-text-light);
    font-size: var(--dk-fs-13);
    pointer-events: none;
}

.dk-search-input {
    padding: 6px 10px 6px 30px;
    font-size: var(--dk-fs-13-5);
    font-family: var(--dk-font);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    width: 200px;
    outline: none;
    background: var(--dk-bg-row-hover);
    color: var(--dk-text);
    transition:
        border-color 0.15s,
        width 0.2s;
}

.dk-search-input:focus {
    border-color: var(--dk-accent);
    width: 260px;
    background: var(--dk-surface);
}

/* ── VIEW SWITCHER ───────────────────────────────────────────── */
.dk-view-switcher {
    display: flex;
    align-items: center;
    gap: 3px;
    background: var(--dk-bg);
    border: 1px solid var(--dk-border);
    border-radius: 8px;
    padding: 3px;
}
.dk-view-btn {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    border-radius: 6px;
    color: var(--dk-text-muted);
    text-decoration: none;
    transition: all 0.15s;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    white-space: nowrap;
}
.dk-view-btn i { font-size: var(--dk-fs-15); }
.dk-view-btn:hover {
    color: var(--dk-text);
    background: var(--dk-surface);
    text-decoration: none;
}
.dk-view-btn.active {
    color: var(--dk-white);
    background: var(--dk-accent);
    text-decoration: none;
}
.dk-view-btn.active:hover {
    color: var(--dk-white);
    background: var(--dk-accent);
}

/* ── KANBAN FILTER BAR ───────────────────────────────────────── */
.dk-kanban-filterbar {
    display: flex;
    align-items: center;
    gap: 4px;
    margin-bottom: 16px;
    border-bottom: 1px solid var(--dk-border-light);
    padding-bottom: 0;
}
.dk-kanban-filter-btn {
    font-size: var(--dk-fs-13-5);
    font-weight: 500;
    padding: 7px 14px;
    color: var(--dk-text-muted);
    text-decoration: none;
    background: none;
    border: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    cursor: pointer;
    transition:
        color 0.15s,
        border-color 0.15s;
    white-space: nowrap;
}
.dk-kanban-filter-btn:hover {
    color: var(--dk-text);
}
.dk-kanban-filter-btn.active {
    color: var(--dk-accent);
    border-bottom-color: var(--dk-accent);
}
.dk-kanban-tag-btn {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: var(--dk-fs-13-5);
    font-weight: 500;
    padding: 5px 12px;
    color: var(--dk-text-muted);
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 20px;
    cursor: pointer;
    white-space: nowrap;
    transition:
        border-color 0.15s,
        color 0.15s;
}
.dk-kanban-tag-btn:hover,
.dk-kanban-tag-btn.active {
    color: var(--dk-accent);
    border-color: var(--dk-accent);
}
.dk-kanban-tag-drop {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    z-index: 2000;
    background-color: var(--dk-surface) !important;
    border: 1px solid var(--dk-border);
    border-radius: 10px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
    min-width: 200px;
    max-width: 260px;
    padding: 6px 0;
}
.dk-kanban-tag-drop .dk-tag-search-input {
    width: 100%;
    padding: 6px 12px;
    border: none;
    border-bottom: 1px solid var(--dk-border);
    background: transparent;
    color: var(--dk-text);
    outline: none;
    font-size: var(--dk-fs-13);
    display: block;
}
.dk-tag-drop-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    cursor: pointer;
    font-size: var(--dk-fs-13);
    transition: background 0.1s;
}
.dk-tag-drop-item:hover {
    background: var(--dk-bg-row-hover);
}
.dk-tag-drop-empty {
    padding: 8px 12px;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-12);
}
.dk-tag-drop-divider {
    height: 1px;
    margin: 4px 0;
    background: var(--dk-border);
}
.dk-tag-dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
}

/* ── KANBAN: быстрый поиск + кнопка "Фильтры" + раскрывающаяся панель ─ */
.dk-kanban-search-wrap {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 5px 12px;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 20px;
    color: var(--dk-text-muted);
}
.dk-kanban-search-wrap i {
    font-size: var(--dk-fs-13);
}
.dk-kanban-search-input {
    border: none;
    outline: none;
    background: transparent;
    font-size: var(--dk-fs-13-5);
    color: var(--dk-text);
    width: 180px;
}
.dk-kanban-search-input::placeholder {
    color: var(--dk-text-light);
}

/* ── KANBAN FILTER BAR: мобильная адаптивность (сессия 62) ──────
   Правая группа (поиск/фильтры/закрытые/экспорт) — .ms-auto —
   не переносилась сама по себе и обрезалась справа за пределами
   экрана. Разрешаем перенос внутри группы и убираем ms-auto,
   чтобы группа не толкала себя за пределы видимой области. */
@media (max-width: 767.98px) {
    .dk-kanban-filterbar > .ms-auto {
        margin-left: 0;
        flex-wrap: wrap;
        row-gap: 8px;
        width: 100%;
    }
    .dk-kanban-search-wrap {
        flex: 1 1 140px;
        min-width: 0;
    }
    .dk-kanban-search-input {
        width: 100%;
        min-width: 0;
    }
}
.dk-kanban-filters-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    position: relative;
    border: 1px solid var(--dk-border);
    border-radius: 20px;
    padding: 5px 12px;
    margin-bottom: 0;
}
.dk-kanban-filters-toggle:hover,
.dk-kanban-filters-toggle.active {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
}
.dk-kanban-filters-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 999px;
    background: var(--dk-accent);
    color: var(--dk-white);
    font-size: var(--dk-fs-11);
    font-weight: 600;
    line-height: 1;
}
.dk-kanban-filters-panel {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 12px;
    box-shadow: var(--dk-shadow-sm);
    padding: 16px 20px;
    margin-bottom: 16px;
    animation: dkFiltersPanelIn .15s ease;
}
.dk-kanban-filters-panel-header {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 14px;
    padding-bottom: 10px;
    border-bottom: 1px solid var(--dk-border-light);
}
.dk-kanban-filters-panel-title {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: var(--dk-fs-14);
    font-weight: 600;
    color: var(--dk-text);
}
.dk-kanban-filters-reset-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    padding: 5px 12px;
    border: 1px solid var(--dk-danger);
    border-radius: 20px;
    background: var(--dk-surface);
    color: var(--dk-danger);
    cursor: pointer;
    white-space: nowrap;
    transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.dk-kanban-filters-reset-btn:hover {
    background: var(--dk-danger-dim);
    color: var(--dk-danger-hover);
    border-color: var(--dk-danger-hover);
}
.dk-kanban-filters-panel-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border: none;
    background: transparent;
    color: var(--dk-text-muted);
    border-radius: 6px;
    cursor: pointer;
    transition: background 0.1s, color 0.1s;
}
.dk-kanban-filters-panel-close:hover {
    background: var(--dk-bg-row-hover);
    color: var(--dk-text);
}
@keyframes dkFiltersPanelIn {
    from { opacity: 0; transform: translateY(-6px); }
    to   { opacity: 1; transform: translateY(0); }
}
.dk-kanban-filters-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 16px;
}
.dk-kanban-filter-field {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.dk-kanban-filter-label {
    font-size: var(--dk-fs-12);
    font-weight: 600;
    color: var(--dk-text-muted);
    text-transform: uppercase;
    letter-spacing: .02em;
}
.dk-kanban-filter-field .dk-kanban-tag-btn {
    width: 100%;
    justify-content: space-between;
}
.dk-kanban-filter-field .dk-kanban-tag-drop {
    left: 0;
    right: auto;
    width: 100%;
    max-width: none;
}
.dk-kanban-filters-footer {
    padding: 12px 16px;
    border-top: 1px solid var(--dk-border);
    background: var(--dk-bg-card);
}
.dk-sf-del-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    padding: 0;
    border: none;
    background: none;
    cursor: pointer;
    border-radius: 3px;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11);
    flex-shrink: 0;
    opacity: 0;
    transition: opacity .15s, color .15s;
}
.dk-tag-drop-item:hover .dk-sf-del-btn {
    opacity: 1;
}
.dk-sf-del-btn:hover {
    color: var(--dk-danger, #ef4444);
    opacity: 1;
}
.dk-sf-default-badge {
    flex-shrink: 0;
    padding: 1px 6px;
    border-radius: 8px;
    background: var(--dk-accent-bg, rgba(59, 130, 246, .12));
    color: var(--dk-accent);
    font-size: var(--dk-fs-9);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .02em;
    white-space: nowrap;
}

/* ── KANBAN: быстрые фильтры (⚡) -- чек-лист проектов/подпроектов ──
   Общая разметка, выводится и в компактном дропдауне под молнией
   (.dk-kf-drop), и внутри панели "Фильтры" (.dk-kf-panel-field) -- см.
   views/v_index_kanban.php, сессия "Быстрые фильтры" 2026-09-14. */
.dk-kf-drop {
    max-height: 360px;
    overflow-y: auto;
    min-width: 240px;
    max-width: 320px;
    padding: 10px;
}
.dk-kf-panel-field {
    grid-column: 1 / -1;
}
.dk-kf-list {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}
.dk-kf-group {
    border: 1px solid var(--dk-border);
    border-radius: 8px;
    padding: 8px 10px;
    min-width: 150px;
    background: var(--dk-surface);
}
.dk-kf-row {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: var(--dk-fs-13-5);
    cursor: pointer;
    padding: 2px 0;
    user-select: none;
}
.dk-kf-row input[type="checkbox"] {
    cursor: pointer;
    flex-shrink: 0;
}
.dk-kf-row-project {
    font-weight: 600;
    color: var(--dk-text);
}
.dk-kf-subs {
    margin-left: 20px;
    margin-top: 2px;
    display: flex;
    flex-direction: column;
}
.dk-kf-row-sub {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    font-weight: 400;
}
.dk-kf-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-kf-empty {
    padding: 6px 4px;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-12);
}

.dk-kanban-card-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-bottom: 4px;
}
.dk-kanban-tag-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 7px;
    border-radius: 10px;
    font-size: var(--dk-fs-11);
    font-weight: 500;
    line-height: 1.4;
}

/* ── TAG PICKER ──────────────────────────────────────────────── */
/* На странице задачи тег-пикер встроен в мета-ряд (рядом с "Наблюдать") —
   убираем bootstrap mb-3 и лишний вертикальный отступ, чтобы не ломать flex-ряд */
.dk-task-meta-tags .dk-tag-picker {
    margin-bottom: 0;
}
.dk-tag-badge {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 4px 10px;
    border-radius: 14px;
    font-size: var(--dk-fs-12-5);
    font-weight: 500;
    color: #fff;
}
/* Релиз-тег (миграция 102) -- двойная рамка + иконка ракеты (см. v_tag_picker.php) */
.dk-tag-badge-release {
    border: 3px double rgba(255, 255, 255, 0.85);
    padding: 3px 10px;
}
.dk-tag-badge-link {
    color: #fff;
    text-decoration: none;
}
.dk-tag-badge-link:hover {
    color: #fff;
    text-decoration: none;
}
.dk-tag-badge-del {
    background: none;
    border: none;
    cursor: pointer;
    padding: 0;
    line-height: 1;
    font-size: var(--dk-fs-14);
    opacity: 0.75;
    color: #fff;
}
.dk-tag-badge-del:hover {
    opacity: 1;
}
.dk-tag-add-btn {
    background: none;
    border: 2px solid var(--dk-accent);
    border-radius: 14px;
    padding: 5px 10px;
    cursor: pointer;
    font-size: var(--dk-fs-14);
    font-weight: 600;
    color: var(--dk-accent);
    transition:
        background 0.15s,
        color 0.15s;
}
.dk-tag-add-btn:hover {
    background: var(--dk-accent);
    color: #fff;
}
.dk-tag-add-wrap {
    position: relative;
}
.dk-tag-dropdown {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    z-index: 1050;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 10px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
    min-width: 220px;
    max-width: 280px;
    padding: 6px 0;
}
.dk-tag-search-input {
    width: 100%;
    padding: 6px 12px;
    border: none;
    border-bottom: 1px solid var(--dk-border);
    background: transparent;
    color: var(--dk-text);
    outline: none;
    font-size: var(--dk-fs-13);
}

/* ── TAG PAGES ───────────────────────────────────────────────── */
.dk-tag-hero {
    display: inline-flex;
    align-items: center;
    padding: 8px 18px;
    border-radius: 24px;
    font-size: var(--dk-fs-20);
    font-weight: 600;
}
.dk-tag-stat-chip {
    display: inline-flex;
    align-items: center;
    padding: 6px 14px;
    border-radius: 20px;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    color: var(--dk-text-muted);
    text-decoration: none;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    transition:
        border-color 0.15s,
        color 0.15s;
}
.dk-tag-stat-chip:hover,
.dk-tag-stat-chip.active {
    color: var(--dk-accent);
    border-color: var(--dk-accent);
}
.dk-page-item {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    transition: border-color 0.15s;
}
.dk-page-item:hover {
    border-color: var(--dk-accent);
}
.dk-tag-card {
    background: var(--dk-surface);
    border-radius: 10px;
    padding: 14px 16px;
    border: 1px solid var(--dk-border);
    transition: box-shadow 0.15s;
}
.dk-tag-card:hover {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.dk-tag-pill {
    display: inline-flex;
    align-items: center;
    padding: 4px 10px;
    border-radius: 20px;
    font-size: var(--dk-fs-13-5);
    font-weight: 500;
    text-decoration: none;
}
.dk-tag-stat-link {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    text-decoration: none;
    margin-right: 10px;
}
.dk-tag-stat-link:hover {
    color: var(--dk-accent);
}
.dk-tag-card-stats {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 2px;
}
/* ── PROCESS BAR (майлстоун-бар, миграция 102) ─────────────────
   Прогресс задачи по процессу (Проверка/Мастер/Тестирование/Препрод/
   Приемка/Выпуск), рисуется под мета-баром, над "Детали" (views/v_task.php).
   Тот же компонент переиспользуется на карточке релиз-тега для "бутылочного
   горлышка" (views/v_tag.php). */
.dk-process-bar-header {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: var(--dk-text-muted);
    margin-bottom: 26px;
}
.dk-process-bar {
    position: relative;
    height: 22px;
    margin: 0 16px;
}
.dk-process-bar-track {
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    height: 3px;
    margin-top: -1.5px;
    background: var(--dk-border);
    border-radius: 2px;
}
.dk-process-bar-fill {
    position: absolute;
    left: 0;
    top: 50%;
    height: 3px;
    margin-top: -1.5px;
    width: var(--dk-process-fill, 0%);
    background: var(--dk-accent);
    border-radius: 2px;
    transition: width 0.2s ease;
}
.dk-process-dot {
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 20px;
    height: 20px;
    border-radius: 50%;
    border: 2px solid var(--dk-border);
    background: var(--dk-surface);
    color: var(--dk-text-muted);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-10);
    line-height: 1;
    padding: 0;
    cursor: pointer;
    transition:
        border-color 0.15s,
        background 0.15s,
        color 0.15s,
        transform 0.15s;
}
.dk-process-dot:hover {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
    transform: translate(-50%, -50%) scale(1.15);
}
.dk-process-dot-active {
    border-color: var(--dk-accent);
    background: var(--dk-accent);
    color: #fff;
}
.dk-process-dot-current {
    box-shadow: 0 0 0 5px var(--dk-accent-dim);
}
.dk-process-dot-label {
    position: absolute;
    top: 26px;
    left: 50%;
    transform: translateX(-50%);
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    white-space: nowrap;
    pointer-events: none;
}
.dk-process-dot-active .dk-process-dot-label,
.dk-process-dot-current .dk-process-dot-label {
    color: var(--dk-text);
    font-weight: 500;
}

/* Процесс включён в организации, но ещё не стартовал у этой задачи --
   приглашаем нажать на нужный этап, чтобы запустить его вручную (задача
   была решена до включения процесса, см. TaskProcess::availableToStart()) */
.dk-process-bar-hint {
    font-weight: 400;
    font-style: italic;
    color: var(--dk-text-muted);
    opacity: 0.8;
}
.dk-process-bar-pending .dk-process-bar-track {
    background: transparent;
    border-top: 2px dashed var(--dk-border);
    height: 0;
    margin-top: 0;
}

/* Компактный индикатор бутылочного горлышка на карточке тега в списке
   /tags (2026-09-10, Павел: "графика на карточке все еще нет" -- раньше
   бар был только на странице самого тега) -- просто заливка+подпись, без
   интерактивных точек, места в узкой карточке грида на них нет */
.dk-process-mini-track {
    position: relative;
    height: 4px;
    background: var(--dk-border);
    border-radius: 2px;
    overflow: hidden;
}
.dk-process-mini-fill {
    height: 100%;
    background: var(--dk-accent);
    border-radius: 2px;
    transition: width 0.2s ease;
}
.dk-process-mini-label {
    margin-top: 4px;
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    font-weight: 500;
}
.dk-process-mini-empty {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    font-style: italic;
}

/* Карточка релиз-тега: тот же бар, но без интерактивности (бутылочное
   горлышко -- read-only агрегат, см. views/v_tag.php) */
.dk-process-bar-readonly .dk-process-dot {
    cursor: default;
}
.dk-process-bar-readonly .dk-process-dot:hover {
    border-color: var(--dk-border);
    color: var(--dk-text-muted);
    transform: translate(-50%, -50%);
}
.dk-process-bar-readonly .dk-process-dot-active:hover {
    border-color: var(--dk-accent);
    color: #fff;
}

.dk-color-preset {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    border: 2px solid transparent;
    cursor: pointer;
    transition:
        transform 0.1s,
        border-color 0.1s;
}
.dk-color-preset:hover {
    transform: scale(1.2);
    border-color: #fff;
}
.dk-kanban-tag-filter-wrap {
    position: relative;
}

/* ── KANBAN ──────────────────────────────────────────────────── */
.dk-kanban {
    display: flex;
    gap: 12px;
    overflow-x: auto;
    padding-bottom: 16px;
    align-items: flex-start;
    width: 100%;
}
.dk-kanban-col {
    flex: 1 0 240px;
    min-width: 240px;
    background: var(--dk-bg);
    border-radius: 8px;
    padding: 10px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.dk-kanban-col-header {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 2px 8px;
    border-bottom: 1px solid var(--dk-border-light);
}
.dk-kanban-col-header i {
    font-size: var(--dk-fs-13);
}
.dk-kanban-col-title {
    font-size: var(--dk-fs-12);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--dk-text);
    flex: 1;
}
.dk-kanban-col-count {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    color: var(--dk-text-muted);
    background: var(--dk-border-light);
    border-radius: 10px;
    padding: 1px 7px;
}
.dk-kanban-col-sort-group {
    display: flex;
    align-items: center;
    gap: 2px;
}
.dk-kanban-col-sort-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    padding: 0;
    border: none;
    background: transparent;
    border-radius: 4px;
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: background .15s, color .15s;
    flex: 0 0 auto;
}
.dk-kanban-col-sort-btn i {
    font-size: var(--dk-fs-13);
}
.dk-kanban-col-sort-btn:hover {
    background: var(--dk-border-light);
    color: var(--dk-accent);
}
/* Активное поле сортировки (дата ИЛИ приоритет) -- иконка постоянно в
   акцентном цвете + лёгкая заливка, а не просто на ховере (просьба Павла,
   2026-09-18: "видно жирным" -- у иконки нет начертаний веса, так что вместо
   font-weight используем подсветку акцентом, тот же принцип, что уже есть у
   .dk-kanban-filter-btn.active в этом файле). */
.dk-kanban-col-sort-btn.active {
    color: var(--dk-accent);
    background: var(--dk-accent-dim);
}
.dk-kanban-col-sort-btn.active:hover {
    background: var(--dk-accent-dim);
}
.dk-kanban-cards {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.dk-kanban-empty {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    text-align: center;
    padding: 12px 0;
}
.dk-kanban-load-more {
    width: 100%;
    padding: 7px 10px;
    border: 1px dashed var(--dk-border);
    background: transparent;
    border-radius: 6px;
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: border-color .15s, color .15s;
    text-align: center;
}
.dk-kanban-load-more:hover:not(:disabled) {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
}
.dk-kanban-load-more:disabled {
    opacity: .6;
    cursor: default;
}
.dk-kanban-no-more-filtered {
    width: 100%;
    padding: 7px 10px;
    border: 1px dashed var(--dk-border);
    background: transparent;
    border-radius: 6px;
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    text-align: center;
}
@keyframes dk-spin { to { transform: rotate(360deg); } }

/* Группировка карточек внутри колонки канбана (снять/теги/резолюции/проекты) --
   см. dkKanbanRegroupColumn() в views/v_index_kanban.php. */
.dk-kanban-group {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.dk-kanban-group-header {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 2px;
    cursor: pointer;
    user-select: none;
}
.dk-kanban-group-chevron {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    transition: transform .15s ease;
}
.dk-kanban-group-title {
    font-size: var(--dk-fs-12-5);
    font-weight: 600;
    color: var(--dk-text-muted);
    text-transform: uppercase;
    letter-spacing: .02em;
}
.dk-kanban-group-count {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    background: var(--dk-border-light);
    border-radius: 10px;
    padding: 0 6px;
    line-height: 16px;
}
.dk-kanban-group-body {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.dk-kanban-group.dk-kanban-group-collapsed .dk-kanban-group-chevron {
    transform: rotate(-90deg);
}
.dk-kanban-group.dk-kanban-group-collapsed .dk-kanban-group-body {
    display: none;
}

.dk-kanban-card {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border-light);
    border-radius: 6px;
    padding: 10px 12px;
    display: flex;
    flex-direction: column;
    gap: 6px;
    cursor: pointer;
    transition:
        box-shadow 0.15s,
        border-color 0.15s;
    color: var(--dk-text);
}
.dk-kanban-card:hover {
    border-color: var(--dk-border);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
    color: var(--dk-text);
}
.dk-kanban-card-title {
    font-size: var(--dk-fs-13-5);
    font-weight: 500;
    line-height: 1.35;
}
.dk-kanban-card-code-inline {
    font-size: var(--dk-fs-11);
    font-weight: 400;
    color: var(--dk-text-muted);
    flex-shrink: 0;
}
.dk-kanban-card-meta {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
}
.dk-kanban-card-code {
    font-size: var(--dk-fs-11);
}
.dk-kanban-card-deadline {
    font-size: var(--dk-fs-11-5);
    color: var(--dk-text-muted);
    display: flex;
    align-items: center;
    gap: 4px;
}
.dk-kanban-card-deadline i {
    font-size: var(--dk-fs-10);
}
.dk-kanban-card-exec {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    display: flex;
    align-items: center;
    gap: 4px;
    min-width: 0;
}
.dk-kanban-card-exec i {
    flex-shrink: 0;
    font-size: var(--dk-fs-11);
}
.dk-kanban-card-exec span,
.dk-kanban-card-exec {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Цель, привязанная к задаче (tasks.goal_code -- чистая группировка,
   миграция 095) -- та же визуальная роль, что и .dk-kanban-card-exec. */
.dk-kanban-card-goal {
    font-size: var(--dk-fs-11-5);
    color: var(--dk-text-muted);
    display: flex;
    align-items: center;
    gap: 4px;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-kanban-card-goal i {
    flex-shrink: 0;
    font-size: var(--dk-fs-11);
}

/* Кнопка "+" рядом с формой "Добавить таргет" (views/v_goal.php) -- в этой
   строке соседний dk-sel (dkSelHtml()) имеет min-height:38px, тогда как
   Bootstrap form-select-sm/dk-btn-sm ниже -- без явного min-height кнопка
   выглядела "просевшей" на фоне остальных полей строки. */
.dk-goal-add-btn {
    min-height: 38px;
    justify-content: center;
}

/* ── KANBAN ADMIN ORG BADGE ──────────────────────────────────── */
.dk-kanban-card-org {
    font-size: var(--dk-fs-10);
    font-weight: 600;
    color: var(--dk-color-primary, #4f6ef7);
    background: color-mix(
        in srgb,
        var(--dk-color-primary, #4f6ef7) 10%,
        transparent
    );
    border: 1px solid
        color-mix(in srgb, var(--dk-color-primary, #4f6ef7) 25%, transparent);
    border-radius: 4px;
    padding: 1px 6px;
    display: flex;
    align-items: center;
    gap: 4px;
    margin-bottom: 4px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-kanban-card-org i {
    flex-shrink: 0;
    font-size: var(--dk-fs-10);
}

/* ── KANBAN ADMIN SHIELD ON FILTER TABS ─────────────────────── */
.dk-kanban-admin-shield {
    font-size: var(--dk-fs-10);
    color: #f97316;
    margin-right: 4px;
    flex-shrink: 0;
}

.dk-sel-opt-admin-icon {
    font-size: var(--dk-fs-11);
    color: #f97316;
    margin-left: 4px;
}

.dk-kanban-card-footer {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 2px;
}

/* ── KANBAN CARD: РЕЗОЛЮЦИИ (компактные чипы, см. Resolutions.php) ──
   Все активные резолюции задачи (по одной на человека) -- иконка типа
   резолюции + инициалы автора + подпись; ФИО/дата -- в title (hover). */
.dk-kanban-card-resolutions {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 2px;
}
.dk-kanban-resolution-chip {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 6px;
    border-radius: 9px;
    background: var(--dk-bg);
    font-size: var(--dk-fs-11);
    font-weight: 500;
    color: var(--dk-text-muted);
    cursor: default;
    max-width: 100%;
}
.dk-kanban-resolution-chip i {
    font-size: var(--dk-fs-11);
    flex-shrink: 0;
}
.dk-kanban-resolution-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: var(--dk-bg-row-hover);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-9);
    font-weight: 700;
    flex-shrink: 0;
}

/* ── KANBAN CARD: SPRINT COLOR (left border) ──────────────────── */
.dk-kanban-card-sprint {
    border-left: 3px solid var(--dk-sprint-color, transparent);
    padding-left: 9px;
}

/* ── KANBAN CARD: PRIVATE PROJECT / "закрытый" (доступ) (left border) ──
   Только левая граница -- по просьбе, чтобы не спорить визуально с
   .dk-kanban-card-sprint (у той тоже левая граница, свой цвет per-спринт).
   Если у карточки ОБА признака -- спринт-цвет важнее (:not() ниже).
   Цвет -- var(--dk-danger), тот же что у "закрытой" иконки проекта на
   строке пути (см. _kanban_card.php, $_projColor) -- согласовано с Павлом
   2026-07-16 (приватность проекта = "закрытый", не жизненный цикл). */
.dk-kanban-card-private:not(.dk-kanban-card-sprint) {
    border-left: 3px solid var(--dk-danger);
    padding-left: 9px;
}

/* ── SECTION HEADER ──────────────────────────────────────────── */
.dk-section {
    margin-bottom: 32px;
}

.dk-section-watch {
    background: var(--dk-bg);
    border: 1px solid var(--dk-border-light);
    border-radius: 8px;
    padding: 16px;
}

.dk-section-header {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 12px;
}

.dk-section-title {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--dk-text-muted);
}

.dk-section-count {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-light);
    background: var(--dk-bg);
    padding: 1px 7px;
    border-radius: 10px;
}

/* Горизонтальный скролл на мобильных вместо обрезания/переноса колонок —
   тот же паттерн, что у .dk-admin-tabs (см. комментарий выше по файлу):
   .dk-content скрывает overflow-x, поэтому у широких таблиц (админка:
   пользователи/организации/заявки) должен быть собственный скролл-контейнер. */
.dk-table-responsive {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* ── TASK TABLE ──────────────────────────────────────────────── */
.dk-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--dk-fs-14);
}

.dk-table th {
    text-align: left;
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--dk-text-light);
    padding: 6px 12px;
    border-bottom: 1px solid var(--dk-border);
}

.dk-table td {
    padding: 9px 12px;
    border-bottom: 1px solid var(--dk-border-light);
    vertical-align: middle;
}

.dk-table tbody tr:hover td {
    background: var(--dk-bg-row-hover);
}
.dk-table tbody tr:last-child td {
    border-bottom: none;
}

.dk-code-chip {
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-light);
    font-family: var(--dk-font-mono);
    white-space: nowrap;
}

.dk-cell-muted {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    white-space: nowrap;
}

.dk-cell-overdue {
    color: var(--dk-status-problem) !important;
}

.dk-proj-tag {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    background: var(--dk-bg);
    border-radius: 3px;
    padding: 1px 5px;
}

/* ── STATUS PILLS ────────────────────────────────────────────── */
.dk-status {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    padding: 3px 8px;
    border-radius: 4px;
    white-space: nowrap;
}


.dk-s-new {
    color: var(--dk-status-new);
    background: rgba(59, 130, 246, 0.08);
}
.dk-s-inwork {
    color: var(--dk-status-inwork);
    background: rgba(6, 182, 212, 0.08);
}
.dk-s-pause {
    color: var(--dk-status-pause);
    background: rgba(245, 158, 11, 0.08);
}
.dk-s-solved {
    color: var(--dk-status-solved);
    background: rgba(6, 182, 212, 0.08);
}
.dk-s-closed {
    color: var(--dk-status-closed);
    background: rgba(107, 114, 128, 0.08);
}
.dk-s-problem {
    color: var(--dk-status-problem);
    background: rgba(239, 68, 68, 0.08);
}
.dk-s-check {
    color: var(--dk-status-check);
    background: rgba(139, 92, 246, 0.08);
}
.dk-s-negotiation {
    color: #8b5cf6;
    background: rgba(139, 92, 246, 0.08);
}
.dk-s-success {
    color: #22c55e;
    background: rgba(34, 197, 94, 0.08);
}
.dk-s-rejected {
    color: #ef4444;
    background: rgba(239, 68, 68, 0.08);
}

/* ── AUTH PAGES ──────────────────────────────────────────────── */
.dk-auth-body {
    background: var(--dk-bg);
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 32px 16px;
    overflow-x: hidden;
}

.dk-auth-wrap {
    width: 100%;
    max-width: 400px;
    /* Классический флексбокс-баг: у флекс-айтема min-width по умолчанию
       "auto" (= его intrinsic-ширина по самому широкому содержимому, напр.
       длинный текст <option> в select) -- он отказывается сжиматься уже
       ниже этой ширины и вылезает/обрезается в узких контейнерах (напр.
       iframe/попап OAuth-коннектора в Claude.ai), а не переносится по
       словам. min-width:0 разрешает сжатие до фактической ширины родителя. */
    min-width: 0;
}

/* .dk-cell-muted в остальном проекте -- однострочная ячейка таблицы
   (white-space:nowrap специально). На auth-страницах (login/register/
   onboarding/oauth-authorize) тот же класс переиспользован для абзацев
   произвольной длины ("Проект: ...", "Выберите проект, к которому...") --
   nowrap там заставляет текст вылезать за пределы узкого попапа/iframe
   (напр. OAuth-коннектор в Claude.ai), а не переноситься по словам.
   Скоуп через .dk-auth-body -- глобальное поведение класса не трогаем. */
.dk-auth-body .dk-cell-muted {
    white-space: normal;
    overflow-wrap: break-word;
    word-break: break-word;
}

/* Тот же баг, что и на auth-страницах (см. комментарий выше про
   .dk-auth-body .dk-cell-muted) -- на /admin?tab=mcp класс .dk-cell-muted
   переиспользован для абзаца произвольной длины (описание гранта),
   nowrap заставляет текст вылезать за карточку. Скоуп через #mcp. */
#mcp .dk-cell-muted {
    white-space: normal;
    overflow-wrap: break-word;
    word-break: break-word;
}

.dk-auth-body .dk-card-title {
    overflow-wrap: break-word;
    word-break: break-word;
}

.dk-auth-body select.form-select {
    max-width: 100%;
    text-overflow: ellipsis;
}

.dk-auth-logo {
    text-align: center;
    margin-bottom: 28px;
}

.dk-auth-logo-mark {
    font-size: var(--dk-fs-28);
    font-weight: 800;
    letter-spacing: -1px;
    color: var(--dk-text);
}

.dk-auth-logo-mark span {
    color: var(--dk-accent);
}

.dk-auth-sub {
    margin-top: 6px;
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
}

.dk-lang-switch {
    display: flex;
    gap: 6px;
    align-items: center;
    justify-content: flex-end;
    width: 100%;
    margin-bottom: 8px;
    font-size: var(--dk-fs-13);
}
.dk-lang-switch a {
    color: var(--dk-text-muted);
    text-decoration: none;
    font-weight: 500;
}
.dk-lang-switch a:hover {
    color: var(--dk-accent);
}
.dk-lang-switch a.active {
    color: var(--dk-accent);
    font-weight: 700;
}
.dk-lang-switch span {
    color: var(--dk-border);
}

.dk-migration-banner {
    background: #fff8e1;
    border: 2px solid #f59e0b;
    border-radius: var(--dk-radius);
    padding: 14px 18px;
    font-size: var(--dk-fs-22);
    font-weight: 600;
    color: #92400e;
    line-height: 1.5;
    width: 100%;
    text-align: center;
    margin-bottom: 4px;
    box-sizing: border-box;
}

.dk-card {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 28px 28px 24px;
}

.dk-card-title {
    font-size: var(--dk-fs-17);
    font-weight: 600;
    margin-bottom: 20px;
    color: var(--dk-text);
}

.dk-card-footer {
    margin-top: 14px;
    text-align: center;
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
}

.dk-card-footer a {
    color: var(--dk-accent);
    text-decoration: none;
    font-weight: 500;
}

.dk-card-footer a:hover {
    text-decoration: underline;
}

/* ── FORM ELEMENTS ───────────────────────────────────────────── */
.dk-field {
    margin-bottom: 14px;
}

.dk-label {
    display: block;
    font-size: var(--dk-fs-13-5);
    font-weight: 500;
    color: var(--dk-text-muted);
    margin-bottom: 5px;
}

.dk-section-label-form {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--dk-text-light);
    margin: 18px 0 12px;
    padding-bottom: 8px;
    border-bottom: 1px solid var(--dk-border);
}

.dk-input {
    width: 100%;
    padding: 9px 12px;
    font-size: var(--dk-fs-15);
    font-family: var(--dk-font);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    background: var(--dk-surface);
    color: var(--dk-text);
    outline: none;
    transition: border-color 0.15s;
}

.dk-input:focus {
    border-color: var(--dk-accent);
}
.dk-input::placeholder {
    color: var(--dk-text-light);
}
.dk-input:disabled {
    background: var(--dk-bg);
    color: var(--dk-text-muted);
    cursor: default;
}

.dk-hint {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    margin-top: 4px;
}

/* ── TASK FORM ───────────────────────────────────────────────── */
.dk-task-title-input {
    font-size: var(--dk-fs-26);
    font-weight: 700;
    font-family: var(--dk-font);
    color: var(--dk-text);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    outline: none;
    padding: 10px 14px;
    background: var(--dk-bg);
    letter-spacing: -0.3px;
    transition: border-color 0.15s, background 0.15s;
}
.dk-task-title-input:focus {
    border-color: var(--dk-accent);
    background: var(--dk-surface);
}
.dk-task-title-input::placeholder {
    color: var(--dk-text-muted);
}

/* ── META BAR — горизонтальная строка деталей ────────────────── */
.dk-meta-bar {
    display: flex;
    align-items: flex-start;
    flex-wrap: wrap;
    gap: 4px;
    padding: 12px 0;
    border-top: 1px solid var(--dk-border);
    border-bottom: 1px solid var(--dk-border);
}

/* Колонка: лейбл сверху + чип снизу */
.dk-meta-col {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.dk-meta-col-label {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--dk-text-muted);
    padding: 0 12px;
    line-height: 1;
}

.dk-meta-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 12px;
    min-height: 36px;
    border-radius: 8px;
    background: var(--dk-bg);
    border: 1px solid transparent;
    transition:
        border-color 0.12s,
        background 0.12s;
    cursor: pointer;
}
.dk-meta-chip:hover {
    border-color: var(--dk-border);
    background: var(--dk-surface);
}
.dk-meta-chip:focus-within {
    border-color: var(--dk-accent);
    background: var(--dk-surface);
}

.dk-meta-chip-icon {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    flex-shrink: 0;
}
.dk-priority-icon {
    font-size: var(--dk-fs-11);
    flex-shrink: 0;
}

.dk-meta-chip-select,
.dk-meta-chip-input {
    border: none;
    outline: none;
    background: transparent;
    font-size: var(--dk-fs-14);
    font-family: var(--dk-font);
    font-weight: 500;
    color: var(--dk-text);
    cursor: pointer;
    padding: 0;
    -webkit-appearance: none;
    max-width: 160px;
}
.dk-meta-chip-input[type="date"] {
    max-width: 130px;
}
.dk-meta-chip-select:focus,
.dk-meta-chip-input:focus {
    outline: none;
}

.dk-meta-chip-divider {
    width: 1px;
    align-self: stretch;
    background: var(--dk-border);
    margin: 0 4px;
}

/* Кнопка "Задать старт" -- свёрнутая по умолчанию колонка "Старт" в форме
   создания задачи, разворачивается в обычный .dk-meta-chip по клику
   (см. views/v_task_new.php). */
.dk-meta-set-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 12px;
    min-height: 36px;
    border-radius: 8px;
    background: transparent;
    border: 1px dashed var(--dk-border);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
    font-weight: 500;
    font-family: var(--dk-font);
    cursor: pointer;
    transition: border-color 0.12s, color 0.12s, background 0.12s;
}
.dk-meta-set-btn:hover {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
    background: var(--dk-bg);
}
.dk-meta-set-btn i {
    font-size: var(--dk-fs-12);
}

/* Тег-пикер, встроенный в мета-ряд формы создания задачи (views/v_task_new.php),
   на одной строке с "Старт" -- просьба Павла, 2026-08-29. Колонка тянется,
   чтобы бейджам тегов было куда расти вправо, не ломая высоту ряда. */
.dk-meta-col-tags {
    flex: 1 1 auto;
    min-width: 180px;
}
.dk-tag-picker-inline {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    min-height: 36px;
}

/* Резолюции задачи (подстатус, привязан к статусу — см. Resolutions.php) */
.dk-task-resolutions {
    gap: 6px;
    flex-wrap: wrap;
}
.dk-resolution-chip {
    cursor: default;
}
.dk-resolution-chip-author {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: var(--dk-bg-row-hover);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-9);
    font-weight: 700;
    flex-shrink: 0;
}
.dk-resolution-trigger {
    font: inherit;
    color: var(--dk-text);
}

/* ── CUSTOM SELECT (dk-sel) ──────────────────────────────────── */
.dk-sel {
    position: relative;
    cursor: pointer;
    user-select: none;
}
.dk-sel-trigger {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 160px;
    font-size: var(--dk-fs-15);
    font-weight: 500;
    color: var(--dk-text);
    line-height: 1;
}
.dk-sel-panel {
    display: none;
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    min-width: 210px;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 10px;
    box-shadow: var(--dk-shadow-md);
    z-index: 500;
    overflow: hidden;
}
.dk-sel-panel-sm {
    min-width: 160px;
}
.dk-sel-open .dk-sel-panel {
    display: block;
}
.dk-sel-open {
    border-color: var(--dk-accent) !important;
    background: var(--dk-surface) !important;
}

/* Поле поиска */
.dk-sel-search-wrap {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    border-bottom: 1px solid var(--dk-border);
}
.dk-sel-search-wrap .bi {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
    flex-shrink: 0;
}
.dk-sel-search {
    border: none;
    outline: none;
    font-size: var(--dk-fs-13);
    font-family: var(--dk-font);
    width: 100%;
    color: var(--dk-text);
    background: transparent;
    padding: 0;
}

/* Список вариантов */
.dk-sel-list {
    max-height: 220px;
    overflow-y: auto;
    padding: 4px 0;
}
.dk-sel-opt {
    padding: 8px 14px;
    font-size: var(--dk-fs-14);
    color: var(--dk-text);
    cursor: pointer;
    transition: background 0.1s;
    display: flex;
    align-items: center;
    gap: 8px;
}
.dk-sel-opt:hover {
    background: var(--dk-bg);
}
.dk-sel-opt.dk-sel-opt-active {
    color: var(--dk-accent);
    font-weight: 600;
    background: var(--dk-accent-dim);
}
.dk-sel-opt.dk-sel-opt-active:hover {
    background: var(--dk-accent-dim);
}
/* Двухстрочная опция: имя + email */
.dk-sel-opt-name {
    display: block;
    line-height: 1.3;
}
.dk-sel-opt-sub {
    display: block;
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    line-height: 1.2;
    font-weight: 400;
}

/* Приоритет — цветные точки в списке */
.dk-sel-priority .dk-sel-opt::before {
    content: "";
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
}
.dk-sel-priority .dk-sel-opt[data-value="critical"]::before {
    background: var(--dk-p-critical);
}
.dk-sel-priority .dk-sel-opt[data-value="high"]::before {
    background: var(--dk-p-high);
}
.dk-sel-priority .dk-sel-opt[data-value="medium"]::before {
    background: var(--dk-p-medium);
}
.dk-sel-priority .dk-sel-opt[data-value="low"]::before {
    background: var(--dk-p-low);
}

/* ── EDITOR ──────────────────────────────────────────────────── */
.dk-textarea {
    display: block;
    width: 100%;
    height: 100%;
    min-height: 320px;
    font-size: var(--dk-fs-15);
    font-family: var(--dk-font);
    color: var(--dk-text);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    padding: 14px 16px;
    outline: none;
    resize: none;
    line-height: 1.65;
    transition: border-color 0.15s;
}
.dk-textarea:focus {
    border-color: var(--dk-accent);
}
.dk-textarea::placeholder {
    color: var(--dk-text-light);
}
.dk-textarea-compact {
    min-height: 110px;
}

/* ── ATTACH ZONE — зона загрузки файлов ──────────────────────── */
.dk-attach-zone {
    position: relative;
    border: 1.5px dashed var(--dk-border);
    border-radius: var(--dk-radius);
    padding: 12px 16px;
    transition:
        border-color 0.15s,
        background 0.15s;
}
.dk-attach-zone:hover {
    border-color: var(--dk-accent);
    background: rgba(235, 93, 30, 0.03);
}
.dk-attach-input {
    position: absolute;
    inset: 0;
    opacity: 0;
    cursor: pointer;
    width: 100%;
    height: 100%;
}
.dk-attach-label {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: var(--dk-fs-14);
    font-weight: 500;
    color: var(--dk-text-muted);
    cursor: pointer;
    pointer-events: none;
    margin: 0;
}
.dk-attach-hint {
    font-size: var(--dk-fs-12);
    font-weight: 400;
    color: var(--dk-text-light);
    margin-left: 4px;
}
.dk-attach-list {
    margin-top: 8px;
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.dk-attach-item {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    background: var(--dk-bg);
    border: 1px solid var(--dk-border);
    border-radius: 6px;
    font-size: var(--dk-fs-13);
    color: var(--dk-text);
}
.dk-attach-size {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11);
    margin-left: 4px;
}

/* ── LEGACY (оставляем для других мест) ──────────────────────── */
.dk-form-divider {
    height: 1px;
    background: var(--dk-border);
    margin: 22px 0;
}
.dk-side-title {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.07em;
    color: var(--dk-text-light);
    margin-bottom: 10px;
    margin-top: 20px;
}
.dk-side-title:first-child {
    margin-top: 0;
}

/* ── PRIORITY DOT ────────────────────────────────────────────── */
.dk-priority-dot {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-14);
    line-height: 1;
}

/* ── SORT HEADER ─────────────────────────────────────────────── */
.dk-sort-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 2px 16px 4px;
    gap: 12px;
}
.dk-sort-header-left {
    flex: 1;
    min-width: 0;
}
.dk-sort-header-right {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-shrink: 0;
}
.dk-sort-btn {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
    padding: 2px 5px;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    gap: 3px;
    transition:
        color 0.1s,
        background 0.1s;
}
.dk-sort-btn:hover {
    color: var(--dk-text);
    background: var(--dk-bg-row-hover);
}
.dk-sort-active {
    color: var(--dk-accent) !important;
    font-weight: 600;
}
.dk-sort-icon {
    font-size: var(--dk-fs-11);
    opacity: 0.5;
}
.dk-sort-active .dk-sort-icon {
    opacity: 1;
}

/* ── UTILITIES ───────────────────────────────────────────────── */

/* Иконки в topbar */
.dk-icon-lg {
    font-size: var(--dk-fs-20);
}
.dk-icon-md {
    font-size: var(--dk-fs-16);
}

/* Форма новой задачи — тянется на всю высоту */
.dk-task-form {
    min-height: calc(100vh - 120px);
}

/* Чекбокс-лейбл (login remember me) */
.dk-checkbox-label {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    margin: 0;
    cursor: pointer;
}

/* Широкий auth-wrap (register) */
.dk-auth-wrap-wide {
    max-width: 420px;
}

/* Колонки таблиц — ширины */
.dk-col-id {
    width: 60px;
}
.dk-col-code {
    width: 80px;
}
.dk-col-code-lg {
    width: 130px;
}
.dk-col-status {
    width: 120px;
}
.dk-col-users {
    width: 90px;
}
.dk-col-mode {
    width: 110px;
}
.dk-col-role {
    width: 80px;
}
.dk-col-org {
    width: 160px;
}
.dk-col-date {
    width: 110px;
}
.dk-col-exec {
    width: 150px;
}
.dk-col-proj {
    width: 140px;
}

.dk-row2 {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
}

/* ═══════════════════════════════════════════════════════════════
   SIDEBAR — OFFCANVAS + RESPONSIVE
   Принцип: Bootstrap offcanvas на мобайл (< lg),
   CSS override для постоянного показа на десктопе (≥ lg).
   Адаптивность — через Bootstrap breakpoints (d-lg-none и т.д.).
   Кастомные медиа-запросы только там, где Bootstrap недостаточен.
════════════════════════════════════════════════════════════════ */

/* ── Кнопка закрытия в sidebar (мобайл) ──────────────────────── */
.dk-sidebar-close {
    position: absolute;
    top: 10px;
    right: 10px;
    background: transparent;
    border: none;
    color: var(--dk-sidebar-text);
    font-size: var(--dk-fs-15);
    line-height: 1;
    cursor: pointer;
    padding: 5px 8px;
    border-radius: var(--dk-radius);
    z-index: 1;
    transition:
        background 0.1s,
        color 0.1s;
}
.dk-sidebar-close:hover {
    background: var(--dk-sidebar-hover);
    color: var(--dk-white);
}

/* ── Кнопка в топбаре (гамбургер / collapse toggle) ─────────── */
.dk-topbar-btn {
    position: relative;
    background: transparent;
    border: none;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-16);
    line-height: 1;
    cursor: pointer;
    padding: 6px 8px;
    border-radius: var(--dk-radius);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    transition:
        background 0.12s,
        color 0.12s;
}
.dk-topbar-btn:hover {
    background: var(--dk-bg);
    color: var(--dk-text);
}

/* ── Logout item ─────────────────────────────────────────────── */
.dk-nav-logout {
    color: var(--dk-danger) !important;
}
.dk-nav-logout:hover {
    background: var(--dk-danger-dim) !important;
    color: var(--dk-danger-hover) !important;
}

/* ══════════════════════════════════════════════════════════════
   DESKTOP (≥ lg = 992px)
   Override Bootstrap offcanvas: sidebar всегда виден.
   Collapse до icon-only через класс .dk-collapsed (JS-toggle).
══════════════════════════════════════════════════════════════ */
@media (min-width: 992px) {
    /* Убираем все offcanvas-позиционирование */
    .dk-sidebar {
        position: relative !important;
        top: auto !important;
        left: auto !important;
        bottom: auto !important;
        transform: none !important;
        visibility: visible !important;
        z-index: auto !important;
        border-right: none !important;
        /* Наши размеры и анимация */
        width: var(--dk-sidebar-w) !important;
        min-width: var(--dk-sidebar-w);
        height: 100vh;
        transition:
            width 0.2s ease,
            min-width 0.2s ease;
    }

    /* Backdrop не нужен на десктопе */
    .offcanvas-backdrop {
        display: none !important;
    }

    /* ── Свёрнутый sidebar ── */
    .dk-sidebar.dk-collapsed {
        width: 52px !important;
        min-width: 52px !important;
    }

    /* Текстовые элементы скрываются при collapse */
    .dk-sidebar.dk-collapsed .dk-sidebar-text,
    .dk-sidebar.dk-collapsed .dk-sidebar-section-label {
        display: none;
    }

    /* Секции и элементы — центрируем иконки */
    .dk-sidebar.dk-collapsed .dk-sidebar-section {
        padding: 8px 4px 4px;
    }
    .dk-sidebar.dk-collapsed .dk-sidebar-logo {
        padding: 16px 6px 12px;
        text-align: center;
    }
    .dk-sidebar.dk-collapsed .dk-sidebar-footer {
        padding: 10px 4px;
    }
    .dk-sidebar.dk-collapsed .dk-sidebar-divider {
        margin: 6px 8px;
    }

    .dk-sidebar.dk-collapsed .dk-nav-item,
    .dk-sidebar.dk-collapsed .dk-user-item {
        justify-content: center;
        padding: 8px 6px;
        gap: 0;
    }

    .dk-sidebar.dk-collapsed .dk-nav-icon {
        width: auto;
    }

    /* Свёрнутый sidebar -- иконки без текста: подменю (Проекты/Документы/
       Темы/Теги под "Задачами" и т.п.) показывается флаутом по наведению.
       ГОТЧА (проверено эмпирически, не наступать снова): чистый CSS-hover
       с position:absolute внутри .dk-sidebar НЕ работает -- сайдбар грузится
       с overflow-y:auto (нужен для скролла длинного списка), а спека CSS
       требует: если один overflow-* не visible, ДРУГОЙ тоже принудительно
       становится auto, ДАЖЕ если явно написать overflow-x:visible -- браузер
       всё равно вычисляет его как auto и обрезает флаут по правому краю
       сайдбара. Обхода на чистом CSS нет (кроме overflow-y:visible на самом
       сайдбаре, но тогда пропадёт его собственный вертикальный скролл).
       Поэтому флаут -- position:FIXED (не absolute): такой элемент не
       обрезается overflow родителя вообще, но координаты уже не "left:100%
       от обёртки", а abs-координаты вьюпорта -- их считает JS
       (initNavGroups() в doka.js) через getBoundingClientRect() при
       mouseenter и пишет как inline style. */
    .dk-sidebar.dk-collapsed .dk-nav-group {
        position: relative;
    }
    /* Стрелка "есть подменю" -- маленький кружок поверх угла иконки (не
       скрыта, как раньше, а сама и есть триггер флаута вместе со всей
       строкой -- см. JS: mouseenter и на .dk-nav-group-wrap, и на кнопке). */
    .dk-sidebar.dk-collapsed .dk-nav-group-toggle {
        display: flex;
        position: absolute;
        right: 2px;
        bottom: 2px;
        width: 14px;
        height: 14px;
        padding: 0;
        align-items: center;
        justify-content: center;
        /* Акцентный фон -- на var(--dk-sidebar-hover) бейдж был практически
           не виден (оба тёмно-синие, контраст почти нулевой). */
        background: var(--dk-accent);
        border: 1px solid var(--dk-sidebar-bg);
        border-radius: 50%;
        pointer-events: none;
    }
    .dk-sidebar.dk-collapsed .dk-nav-group-toggle .dk-nav-group-chevron {
        font-size: var(--dk-fs-8);
        color: var(--dk-sidebar-bg);
        transform: none;
    }
    .dk-sidebar.dk-collapsed .dk-nav-subgroup {
        display: none;
        position: fixed;
        margin: 0;
        padding: 6px;
        min-width: 190px;
        background: var(--dk-sidebar-bg);
        border: 1px solid var(--dk-sidebar-divider);
        border-radius: var(--dk-radius);
        box-shadow: var(--dk-shadow-dark);
        z-index: 900;
    }
    .dk-sidebar.dk-collapsed .dk-nav-subgroup.dk-nav-flyout-open {
        display: flex;
        flex-direction: column;
    }
    /* Внутри флаута текст нужен -- это уже не иконка-рельса, а обычное меню.
       Общие collapsed-правила для .dk-nav-item (center+gap:0) и .dk-nav-icon
       (width:auto) рассчитаны на иконку-рельсу -- внутри флаута их нужно
       вернуть к обычному виду строки меню (иконка слева, отступ, текст). */
    .dk-sidebar.dk-collapsed .dk-nav-subgroup .dk-sidebar-text {
        display: inline;
    }
    .dk-sidebar.dk-collapsed .dk-nav-subgroup .dk-nav-item {
        justify-content: flex-start;
        padding: 7px 8px;
        gap: 9px;
    }
    .dk-sidebar.dk-collapsed .dk-nav-subgroup .dk-nav-icon {
        width: 16px;
    }
}

/* ══════════════════════════════════════════════════════════════
   MOBILE (< lg = 992px)
   Sidebar — Bootstrap offcanvas overlay.
   Дополнительные правила только там, где Bootstrap недостаточен.
══════════════════════════════════════════════════════════════ */
@media (max-width: 991.98px) {
    /* Ширина sidebar в offcanvas */
    .dk-sidebar {
        width: var(--dk-sidebar-w) !important;
    }

    /* Контент занимает всю ширину */
    .dk-main {
        width: 100%;
    }

    /* Padding страницы меньше */
    .dk-content {
        padding: 16px;
    }

    /* Чуть уже поисковая строка */
    .dk-search-input {
        width: 120px;
    }
    .dk-search-input:focus {
        width: 160px;
    }
}

/* ── Очень маленький экран: скрыть поиск, оставить кнопку ──── */
@media (max-width: 575.98px) {
    .dk-search-wrap {
        display: none;
    }

    /* Топбар: переключатель вида (Дашборд/Канбан) — только иконки,
       иначе вместе с кнопкой "Новая задача" не помещается (см. отчёт
       о мобильной адаптивности, сессия 62) */
    .dk-topbar {
        padding: 0 10px;
        gap: 6px;
    }
    .dk-view-switcher {
        gap: 2px;
        padding: 2px;
    }
    .dk-view-btn {
        padding: 6px 8px;
    }
    .dk-view-btn span {
        display: none;
    }
    .dk-topbar-actions .dk-btn span {
        display: none;
    }
    .dk-topbar-actions .dk-btn {
        padding: 6px 8px;
    }
    .dk-topbar-actions .dk-btn i {
        margin: 0 !important;
    }
    .dk-topbar-actions {
        gap: 6px;
    }
}

.dk-mt-auto {
    margin-top: auto;
}

/* ── ADMIN — карточки статистики ─────────────────────────────── */
.dk-stat-card {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 20px 24px;
}
.dk-stat-val {
    font-size: var(--dk-fs-32);
    font-weight: 700;
    color: var(--dk-text);
    line-height: 1;
    margin-bottom: 6px;
}
.dk-stat-label {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
}

/* ── LANG DROPDOWN — переключатель языка рядом с логотипом ─────── */

.dk-lang-drop {
    position: relative;
    flex-shrink: 0;
}
.dk-lang-drop-btn {
    display: flex;
    align-items: center;
    gap: 3px;
    background: none;
    border: none;
    padding: 4px 6px;
    font-size: var(--dk-fs-11);
    font-weight: 700;
    letter-spacing: 0.04em;
    color: var(--dk-sidebar-text);
    cursor: pointer;
    border-radius: 5px;
    transition:
        color 0.15s,
        background 0.15s;
    white-space: nowrap;
}
.dk-lang-drop-btn:hover {
    color: var(--dk-white);
    background: rgba(255, 255, 255, 0.08);
}
.dk-lang-chevron {
    font-size: var(--dk-fs-9);
    transition: transform 0.15s;
}
.dk-lang-drop.open .dk-lang-chevron {
    transform: rotate(180deg);
}
.dk-lang-drop-menu {
    display: none;
    position: absolute;
    top: calc(100% + 4px);
    right: 0;
    background: var(--dk-sidebar-hover);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 7px;
    padding: 4px;
    min-width: 130px;
    z-index: 200;
    box-shadow: var(--dk-shadow-dark);
}
.dk-lang-drop.open .dk-lang-drop-menu {
    display: block;
}
.dk-lang-drop-item {
    display: block;
    padding: 7px 10px;
    font-size: var(--dk-fs-12);
    color: var(--dk-sidebar-text);
    text-decoration: none;
    border-radius: 5px;
    transition:
        background 0.12s,
        color 0.12s;
}
.dk-lang-drop-item:hover {
    background: rgba(255, 255, 255, 0.07);
    color: var(--dk-white);
}
.dk-lang-drop-item.active {
    color: var(--dk-accent);
    font-weight: 600;
}

/* В свёрнутом сайдбаре — скрыть */
.dk-collapsed .dk-lang-drop {
    display: none;
}

/* ── CHIP — универсальный бейдж ─────────────────────────────── */
.dk-chip {
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-11);
    font-weight: 500;
    padding: 3px 8px;
    border-radius: 20px;
    white-space: nowrap;
}
.dk-chip-gray {
    background: var(--dk-border-light);
    color: var(--dk-text-muted);
}
.dk-chip-blue {
    background: rgba(59, 130, 246, 0.1);
    color: var(--dk-status-new);
}
.dk-chip-green {
    background: rgba(16, 185, 129, 0.1);
    color: var(--dk-status-inwork);
}
.dk-chip-orange {
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
}
.dk-chip-red {
    background: var(--dk-danger-dim);
    color: var(--dk-danger-hover);
}

/* ── Быстрый фильтр по типу комментария (mr-dev/mr-stable/mr-master,
   миграция 112) -- чипы над списком комментариев задачи, видны только при
   включённом в организации процессе "Разработка". Активный чип -- светло-
   голубая заливка (тот же тон, что у .dk-chip-blue выше); иконка каждого
   чипа красится в свой цвет через --dk-mrtype-color (инлайн из ddata.color). */
.dk-mrtype-filter-row {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    padding: 12px 16px 0;
}
.dk-mrtype-chip {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 4px 10px;
    border-radius: 20px;
    border: 1px solid var(--dk-border);
    background: transparent;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-12);
    cursor: pointer;
}
.dk-mrtype-chip i {
    color: var(--dk-mrtype-color, inherit);
}
.dk-mrtype-chip:hover {
    background: var(--dk-border-light);
}
.dk-mrtype-chip.active {
    background: rgba(59, 130, 246, 0.12);
    border-color: rgba(59, 130, 246, 0.35);
    color: var(--dk-status-new);
}
.dk-mrtype-chip.active i {
    color: var(--dk-status-new);
}
/* Бейдж типа на самом комментарии -- та же разметка/цвет, что у чипа
   фильтра выше (Павел, 2026-09-21: "дай как наверху с цветами"), но не
   кликабельна и чуть компактнее (используется inline рядом с другими
   бейджами меты комментария, не в отдельном ряду). */
.dk-mrtype-chip.dk-mrtype-badge {
    cursor: default;
    padding: 2px 8px;
    font-size: var(--dk-fs-11);
}

/* ── ORG CHIPS (переключатель организаций) ───────────────────── */
.dk-org-chip {
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-12);
    font-weight: 500;
    padding: 5px 12px;
    border-radius: 20px;
    border: 1px solid var(--dk-border);
    color: var(--dk-text-muted);
    background: var(--dk-surface);
    text-decoration: none;
    transition:
        background 0.1s,
        border-color 0.1s,
        color 0.1s;
    cursor: pointer;
}
.dk-org-chip:hover {
    background: var(--dk-accent-dim);
    border-color: var(--dk-accent);
    color: var(--dk-accent);
    text-decoration: none;
}
.dk-org-chip-active {
    background: var(--dk-accent-dim);
    border-color: var(--dk-accent);
    color: var(--dk-accent);
}

/* ── PROJECT CARDS ───────────────────────────────────────────── */
.dk-project-card {
    background: var(--dk-surface);
    border-radius: var(--dk-radius-lg);
    border: 1px solid var(--dk-border);
    padding: 16px;
    transition: box-shadow 0.15s;
}
.dk-project-card:hover {
    box-shadow: var(--dk-shadow-sm);
}
.dk-project-card-head {
    display: flex;
    align-items: center;
    gap: 10px;
    overflow: hidden;
}
.dk-project-card-head .dk-chip {
    flex-shrink: 0;
}
.dk-project-badge {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    border-radius: var(--dk-radius);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-16);
}
.dk-project-meta {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.dk-project-name:hover {
    color: var(--dk-accent);
}
.dk-project-descr {
    font-size: var(--dk-fs-13-5);
    color: var(--dk-text-muted);
    margin: 10px 0 0;
    line-height: 1.5;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* ── EMPTY STATE ─────────────────────────────────────────────── */
.dk-empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 80px 24px;
    text-align: center;
    gap: 12px;
}
.dk-empty-icon {
    font-size: var(--dk-fs-40);
    color: var(--dk-border);
}
.dk-empty-text {
    font-size: var(--dk-fs-14);
    color: var(--dk-text-muted);
    margin: 0;
}

/* ── ADMIN TABS ──────────────────────────────────────────────── */
/* Горизонтальный скролл вместо переноса/обрезания: контейнер .dk-content
   имеет overflow-x:hidden, поэтому без собственного скролла табы просто
   обрезались на мобильных (см. отчёт о мобильной адаптивности, сессия 62).
   Скроллбар скрыт (::-webkit-scrollbar + scrollbar-width) — сам скролл
   свайпом/колесом остаётся доступен. */
.dk-admin-tabs {
    display: flex;
    gap: 4px;
    border-bottom: 1px solid var(--dk-border);
    padding-bottom: 0;
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
}
.dk-admin-tabs::-webkit-scrollbar {
    display: none;
}
.dk-admin-tab {
    display: inline-flex;
    align-items: center;
    padding: 8px 16px;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    color: var(--dk-text-muted);
    text-decoration: none;
    border-radius: var(--dk-radius) var(--dk-radius) 0 0;
    border: 1px solid transparent;
    border-bottom: none;
    margin-bottom: -1px;
    white-space: nowrap;
    flex-shrink: 0;
    transition:
        color 0.12s,
        background 0.12s;
}
.dk-admin-tab:hover {
    color: var(--dk-text);
    background: var(--dk-border-light);
}
.dk-admin-tab.active {
    color: var(--dk-accent);
    background: var(--dk-surface);
    border-color: var(--dk-border);
    font-weight: 600;
}

/* Секции табов проекта (у каждой есть якорь ?tab=...#id, см. правило
   "Якоря на табах" в CLAUDE.md) стоят сразу после шапки проекта + этих
   табов внутри общего скролл-контейнера .dk-content -- при переходе по
   ссылке с якорем (напр. клик по странице в дереве "Разделы":
   ?tab=pages&slug=...#pages) браузер сам скроллит секцию к верху
   контейнера, из-за чего шапка проекта и сами табы уезжают выше экрана
   (просьба Павла 2026-09-10: "как в задачах были табы видны"). Фикс --
   scroll-margin-top на каждую секцию с запасом под высоту шапки+табов
   (шапка ~91px + табы ~37px + отступы = ~184px, измерено вживую), чтобы
   браузер не скроллил дальше этой границы и шапка с табами оставались
   в кадре. */
#pages,
#tasks,
#subprojects,
#sprints,
#activity,
#access {
    scroll-margin-top: 190px;
}

/* ── BUTTON SIZES ────────────────────────────────────────────── */
.dk-btn-xs {
    padding: 3px 8px;
    font-size: var(--dk-fs-12);
}
.dk-btn-danger {
    color: var(--dk-danger);
}
.dk-btn-danger:hover {
    background: var(--dk-danger-dim);
    color: var(--dk-danger-hover);
}

/* ── MODALS ──────────────────────────────────────────────────── */
.dk-modal {
    border-radius: var(--dk-radius-lg);
    border: 1px solid var(--dk-border);
    box-shadow: var(--dk-shadow-md);
}
.dk-modal-header {
    border-bottom: 1px solid var(--dk-border);
    padding: 16px 20px;
    font-size: var(--dk-fs-15);
    font-weight: 600;
}
.dk-modal-footer {
    border-top: 1px solid var(--dk-border);
    padding: 12px 20px;
}
/* Модалка "Дела" (modal-lg, по размеру контента) -- внутренний контейнер
   чуть уже диалога, чтобы поля формы не растягивались во всю ширину. */
.dk-todo-modal-body-inner {
    max-width: 640px;
    margin: 0 auto;
}

/* ── COLOR PICKER ─────────────────────────────────────────────── */
.dk-color-input {
    max-width: 48px;
    padding: 3px;
    cursor: pointer;
}
.dk-color-label {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    font-family: var(--dk-font-mono);
    min-width: 70px;
}

/* ── UTILITIES ───────────────────────────────────────────────── */
.dk-font-mono {
    font-family: var(--dk-font-mono);
    font-size: var(--dk-fs-12);
}

/* ── TASK DETAIL ─────────────────────────────────────────────── */
.dk-task-detail-header {
    margin-bottom: 20px;
}
.dk-task-code-lg {
    display: inline-flex;
    align-items: center;
    font-family: var(--dk-font-mono);
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    background: var(--dk-bg-row-hover);
    border-radius: var(--dk-radius);
    padding: 2px 8px;
    border: 1px solid var(--dk-border-light);
    white-space: nowrap;
    flex-shrink: 0;
}
.dk-task-detail-title {
    font-size: var(--dk-fs-22);
    font-weight: 700;
    line-height: 1.3;
    color: var(--dk-text);
    margin: 0;
    word-break: break-word;
}
.dk-task-meta-row {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 8px;
    align-items: center;
    padding: 12px 0;
    border-top: 1px solid var(--dk-border-light);
    border-bottom: 1px solid var(--dk-border-light);
    margin-bottom: 20px;
}
/* Второй мета-ряд идёт сразу за первым — убираем задвоенную границу и
   схлопываем 20px margin-bottom первого ряда, чтобы не было большого разрыва */
.dk-task-meta-row + .dk-task-meta-row {
    border-top: none;
    margin-top: -20px;
}
.dk-task-meta-item {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: var(--dk-fs-13);
    min-width: 0;
}
.dk-task-meta-label {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    color: var(--dk-text-light);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    white-space: nowrap;
    margin-right: 2px;
}
.dk-task-meta-val {
    color: var(--dk-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 160px;
}
.dk-task-meta-sep {
    width: 1px;
    height: 20px;
    background: var(--dk-border);
    margin: 0 4px;
    flex-shrink: 0;
}

/* Свойства задачи / Процесс -- теперь собственные карточки (.dk-task-section)
   вместо голых строк на фоне страницы, со свёрткой (2026-09-10, по просьбе
   Павла "визуально объединим этот раздел... дадим возможность их свернуть").
   Внутри карточки первая/последняя .dk-task-meta-row не нуждаются в
   собственной верхней/нижней границе -- её роль играют граница карточки и
   разделительная линия заголовка. */
/* .dk-task-section по умолчанию overflow:hidden (чтобы скруглять углы) --
   ломает Bootstrap-дропдауны и поповеры внутри "Свойства"/"Процесс" (статус,
   исполнитель, резолюции, теги, спринт и т.д.): их меню обрезается или
   смещается родительским overflow:hidden -- баг от Павла 2026-09-10 ("баг в
   верстке из-за того что сделали блоками"). Ни одна из этих двух карточек
   не содержит ничего, что нуждалось бы в обрезке по скруглённому углу --
   снимаем overflow только для них, у остальных .dk-task-section (Детали,
   Комментарии и т.д.) поведение не меняется. */
#taskMetaPanel,
#taskProcessPanel {
    overflow: visible;
}
.dk-task-meta-body .dk-task-meta-row:first-child {
    border-top: none;
}
.dk-task-meta-body .dk-task-meta-row:last-child {
    border-bottom: none;
    margin-bottom: 0;
}
.dk-collapse-toggle {
    border: none;
    background: transparent;
}
.dk-collapse-chevron {
    transition: transform 0.15s ease;
}
.dk-collapsible-panel.dk-panel-collapsed .dk-collapse-body {
    display: none;
}
.dk-collapsible-panel.dk-panel-collapsed .dk-collapse-chevron {
    transform: rotate(180deg);
}
/* Inline editable meta field */
.dk-meta-inline {
    position: relative;
    display: inline-flex;
    align-items: center;
}
.dk-meta-inline form {
    display: contents;
}

/* Task description section */
.dk-task-section {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    overflow: hidden;
    margin-bottom: 20px;
}
.dk-task-section-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 16px;
    border-bottom: 1px solid var(--dk-border-light);
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: var(--dk-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.dk-task-section-body {
    padding: 16px;
}
.dk-task-descr-content {
    font-size: var(--dk-fs-14);
    line-height: 1.65;
    color: var(--dk-text);
    word-break: break-word;
}
.dk-task-descr-content h1,
.dk-task-descr-content h2,
.dk-task-descr-content h3 {
    font-size: var(--dk-fs-16);
    font-weight: 600;
    margin: 16px 0 8px;
}
.dk-task-descr-content p {
    margin: 0 0 10px;
}
.dk-task-descr-content p:last-child {
    margin-bottom: 0;
}
.dk-task-descr-content ul,
.dk-task-descr-content ol {
    padding-left: 20px;
    margin: 8px 0;
}

/* Typography самого редактора (WYSIWYG-режим Toast UI, .toastui-editor-contents)
   не была выровнена с финальным рендером (.dk-task-descr-content выше) --
   вендорный css/toastui-editor.min.css задаёт свои дефолты (font-size:13px,
   p{margin:10px 0}), из-за чего во время редактирования текст выглядел мельче
   и с другими отступами, чем после сохранения. Дублируем те же правила под
   .toastui-editor-contents, чтобы редактирование визуально совпадало с
   сохранённым результатом. */
.dk-app .toastui-editor-contents {
    font-size: var(--dk-fs-14);
    line-height: 1.65;
}
.dk-app .toastui-editor-contents p {
    margin: 0 0 10px;
}
.dk-app .toastui-editor-contents h1,
.dk-app .toastui-editor-contents h2,
.dk-app .toastui-editor-contents h3 {
    font-size: var(--dk-fs-16);
    font-weight: 600;
    margin: 16px 0 8px;
}
.dk-app .toastui-editor-contents ul,
.dk-app .toastui-editor-contents ol {
    padding-left: 20px;
    margin: 8px 0;
}

/* Чек-листы Toast UI Editor (task-list) -- редактор рендерит их как
   <li class="task-list-item checked?" data-task data-task-checked?>, БЕЗ
   реального <input type="checkbox"> (см. js/vendor/toastui-editor-all.min.js).
   Визуал (чекбокс через :before) у самого редактора scoped на
   .toastui-editor-contents -- вне этого класса состояние в HTML сохраняется
   (санитайзер его не трогает), но было НЕВИДИМО ни в одном read-only месте,
   где эта же HTML-разметка отображается: описание задачи, комментарии,
   вики-страницы. Правило ниже -- та же визуальная разметка из
   toastui-editor.min.css, накрывает все три read-only обёртки разом. */
.dk-task-descr-content .task-list-item,
.dk-comment-text .task-list-item,
.dk-page-content .task-list-item {
    position: relative;
    list-style: none;
    margin-left: -24px;
    padding-left: 24px;
}
.dk-task-descr-content .task-list-item::before,
.dk-comment-text .task-list-item::before,
.dk-page-content .task-list-item::before {
    content: "";
    position: absolute;
    top: 1px;
    left: 0;
    width: 18px;
    height: 18px;
    border-radius: 2px;
    background: transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiB4PSIuNSIgeT0iLjUiIHJ4PSIyIiBmaWxsPSIjRkZGIiBzdHJva2U9IiNDQ0MiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==") 50% no-repeat;
    background-size: 18px 18px;
}
.dk-task-descr-content .task-list-item.checked::before,
.dk-comment-text .task-list-item.checked::before,
.dk-page-content .task-list-item.checked::before {
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCI+PHBhdGggZD0iTTE2IDBhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDJhMiAyIDAgMCAxLTItMlYyYTIgMiAwIDAgMSAyLTJoMTR6bS0xLjc5MyA1LjI5M2ExIDEgMCAwIDAtMS40MTQgMEw3LjUgMTAuNTg1IDUuMjA3IDguMjkzbC0uMDk0LS4wODNhMSAxIDAgMCAwLTEuMzIgMS40OTdsMyAzIC4wOTQuMDgzYTEgMSAwIDAgMCAxLjMyLS4wODNsNi02IC4wODMtLjA5NGExIDEgMCAwIDAtLjA4My0xLjMyeiIgZmlsbD0iIzRCOTZFNiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+");
}
.dk-task-descr-content blockquote {
    border-left: 3px solid var(--dk-accent);
    margin: 0 0 10px;
    padding: 8px 16px;
    color: var(--dk-text-muted);
}
.dk-task-descr-content blockquote p:last-child {
    margin-bottom: 0;
}
.dk-task-descr-content pre {
    background: var(--dk-surface-2);
    border-radius: 6px;
    padding: 12px 16px;
    overflow-x: auto;
    font-size: var(--dk-fs-13);
}
.dk-task-descr-content code {
    background: var(--dk-surface-2);
    border-radius: 3px;
    padding: 1px 5px;
    font-size: 0.88em;
}
.dk-task-descr-content img {
    max-width: 100%;
    border-radius: var(--dk-radius);
}
.dk-task-descr-content table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 10px;
    font-size: var(--dk-fs-13);
}
.dk-task-descr-content table th,
.dk-task-descr-content table td {
    padding: 8px 12px;
    border: 1px solid var(--dk-border);
}
.dk-task-descr-content table th {
    background: var(--dk-surface-2);
    font-weight: 600;
}
.dk-task-descr-empty {
    color: var(--dk-text-light);
    font-size: var(--dk-fs-13);
    font-style: italic;
}

/* Comments */
.dk-comment-list {
    display: flex;
    flex-direction: column;
    gap: 0;
}
.dk-comment-item {
    display: flex;
    gap: 12px;
    padding: 14px 16px;
    border-bottom: 1px solid var(--dk-border-light);
    align-items: flex-start;
}
.dk-comment-item:last-child {
    border-bottom: none;
}
.dk-comment-highlighted {
    animation: dkCommentHighlight 2.5s ease-out;
}
@keyframes dkCommentHighlight {
    0% {
        background: var(--dk-accent-dim);
    }
    100% {
        background: transparent;
    }
}
.dk-comment-linked {
    box-shadow: inset 0 3px 0 var(--dk-accent), inset 0 -3px 0 var(--dk-accent);
}
.dk-comment-avatar {
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-size: var(--dk-fs-13);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.dk-comment-body {
    flex: 1;
    min-width: 0;
}
.dk-comment-meta {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 6px;
    flex-wrap: wrap;
}
.dk-comment-author {
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: var(--dk-text);
}
.dk-comment-date {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-light);
}
.dk-comment-text {
    font-size: var(--dk-fs-13);
    line-height: 1.6;
    color: var(--dk-text);
    word-break: break-word;
}
.dk-comment-text p {
    margin: 0 0 6px;
}
.dk-comment-text p:last-child {
    margin-bottom: 0;
}
.dk-comment-text ul,
.dk-comment-text ol {
    padding-left: 20px;
    margin: 0 0 6px;
}
.dk-comment-text li {
    margin-bottom: 2px;
}
.dk-comment-text blockquote {
    border-left: 3px solid var(--dk-accent);
    margin: 0 0 6px;
    padding: 4px 12px;
    color: var(--dk-text-muted);
}
.dk-comment-text blockquote p:last-child {
    margin-bottom: 0;
}
.dk-comment-text img {
    max-width: 100%;
    border-radius: var(--dk-radius);
}
.dk-comment-text table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 6px;
    font-size: var(--dk-fs-12-5);
}
.dk-comment-text table th,
.dk-comment-text table td {
    padding: 6px 10px;
    border: 1px solid var(--dk-border);
}
.dk-comment-text table th {
    background: var(--dk-surface-2);
    font-weight: 600;
}

.dk-works-total {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-light);
    padding: 10px 16px;
    border-bottom: 1px solid var(--dk-border-light);
    background: var(--dk-accent-dim);
}
.dk-works-total strong {
    color: var(--dk-text);
}
.dk-estimate-block {
    padding: 16px;
    border-bottom: 1px solid var(--dk-border-light);
}

/* ── Работы: таймер учёта времени (migration 100) ────────────── */
.dk-timer-widget {
    display: flex;
    align-items: center;
    gap: 8px;
}
.dk-timer-live {
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-12);
    font-weight: 600;
    padding: 4px 10px;
    border-radius: 20px;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-variant-numeric: tabular-nums;
}
.dk-timer-running .dk-timer-live {
    background: rgba(239, 68, 68, 0.1);
    color: var(--dk-danger-hover);
}

/* Status dropdown */
.dk-status-dropdown .dropdown-item {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: var(--dk-fs-13-5);
    padding: 6px 14px;
}
.dk-status-dropdown .dropdown-item.active,
.dk-status-dropdown .dropdown-item:active {
    background: var(--dk-bg-row-hover);
    color: var(--dk-text);
}

/* File list */
.dk-file-list {
    display: flex;
    flex-direction: column;
    gap: 0;
}
.dk-file-item-action {
    padding: 8px 16px;
    border-bottom: 2px solid var(--dk-border-light);
}
.dk-file-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 16px;
    border-bottom: 1px solid var(--dk-border-light);
    font-size: var(--dk-fs-13);
}
.dk-file-item:last-child {
    border-bottom: none;
}
.dk-file-icon {
    font-size: var(--dk-fs-20);
    flex-shrink: 0;
    color: var(--dk-text-muted);
}
.dk-file-name {
    flex: 1;
    min-width: 0;
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-file-meta {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-light);
    white-space: nowrap;
}
.dk-file-thumb {
    width: 40px;
    height: 40px;
    object-fit: cover;
    border-radius: 6px;
    flex-shrink: 0;
    cursor: pointer;
    border: 1px solid var(--dk-border);
    transition: opacity 0.15s;
}
.dk-file-thumb:hover {
    opacity: 0.8;
}
#dkImageModal .modal-dialog {
    max-width: min(90vw, 1200px);
}
#dkImageModal {
    background: rgba(0, 0, 0, 0.85);
}

/* ── PROJECT LIST (дашборд) ──────────────────────────────────── */
.dk-project-list {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 4px 0;
}
.dk-project-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 8px;
    border-radius: 6px;
    text-decoration: none;
    color: var(--dk-text);
    transition: background 0.15s;
}
.dk-project-item:hover {
    background: var(--dk-bg-row-hover);
    color: var(--dk-text);
    text-decoration: none;
}
.dk-project-dot {
    flex-shrink: 0;
    width: 10px;
    height: 10px;
    border-radius: 50%;
}
.dk-project-name {
    flex: 1;
    font-size: var(--dk-fs-14);
    font-weight: 500;
    color: var(--dk-text);
    text-decoration: none;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-project-code {
    font-size: var(--dk-fs-11-5);
    color: var(--dk-text-light);
    font-family: var(--dk-font-mono);
    white-space: nowrap;
}
.dk-proj-access-pub {
    font-size: var(--dk-fs-11);
    color: #22c55e;
    flex-shrink: 0;
}
.dk-proj-access-priv {
    font-size: var(--dk-fs-11);
    color: #ef4444;
    flex-shrink: 0;
}

/* Comment form */
.dk-comment-form-wrap {
    padding: 16px;
    border-top: 1px solid var(--dk-border-light);
}

/* Upload zone inside section */
.dk-upload-zone {
    border: 1px dashed var(--dk-border);
    border-radius: var(--dk-radius);
    padding: 12px 16px;
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: background 0.15s;
}
.dk-upload-zone:hover {
    background: var(--dk-bg-row-hover);
}

/* ── ACTIVITY FEED ───────────────────────────────────────────── */
.dk-activity-feed {
    display: flex;
    flex-direction: column;
    gap: 0;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    overflow: hidden;
}
.dk-activity-item {
    display: flex;
    gap: 12px;
    padding: 14px 16px;
    border-bottom: 1px solid var(--dk-border-light);
    align-items: flex-start;
    transition: opacity 0.2s;
}
.dk-activity-item:last-child {
    border-bottom: none;
}
.dk-journal-del-btn {
    display: inline-flex;
    align-items: center;
    background: none;
    border: none;
    padding: 2px 5px;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11);
    cursor: pointer;
    border-radius: 4px;
    line-height: 1;
    opacity: 0.35;
    transition: opacity 0.15s, color 0.15s;
}
.dk-journal-del-btn:hover {
    opacity: 1;
    color: var(--dk-danger);
}
.dk-activity-avatar {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-size: var(--dk-fs-11);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.dk-activity-body {
    flex: 1;
    min-width: 0;
}
.dk-activity-head {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 4px;
}
.dk-activity-user {
    font-weight: 600;
    font-size: var(--dk-fs-13);
    color: var(--dk-text);
}
.dk-activity-action {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
}
.dk-activity-date {
    font-size: var(--dk-fs-11);
    margin-left: auto;
    white-space: nowrap;
}
.dk-activity-diff {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    margin-top: 4px;
}
.dk-diff-old {
    font-size: var(--dk-fs-12);
    padding: 2px 8px;
    border-radius: 4px;
    background: rgba(239, 68, 68, 0.08);
    color: #b91c1c;
    text-decoration: line-through;
    max-width: 200px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-diff-new {
    font-size: var(--dk-fs-12);
    padding: 2px 8px;
    border-radius: 4px;
    background: rgba(16, 185, 129, 0.08);
    color: #065f46;
    max-width: 200px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-activity-comment {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    margin-top: 4px;
}
.dk-activity-link {
    font-size: var(--dk-fs-12);
    color: var(--dk-accent);
    text-decoration: none;
    font-weight: 500;
}
.dk-activity-link:hover {
    text-decoration: underline;
}

/* ── TOPICS ────────────────────────────────────────────────── */
.dk-topic-card {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 14px 16px;
    transition: box-shadow 0.15s, border-color 0.15s;
    min-height: 80px;
}
.dk-topic-card:hover {
    border-color: var(--dk-accent);
    box-shadow: 0 2px 8px rgba(0,0,0,0.06);
}
.dk-topic-filters {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}
.dk-topic-filter-btn {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 6px 14px;
    border-radius: 20px;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    color: var(--dk-text-muted);
    background: var(--dk-bg);
    border: 1px solid var(--dk-border);
    text-decoration: none;
    transition: all 0.15s;
    white-space: nowrap;
}
.dk-topic-filter-btn:hover {
    color: var(--dk-accent);
    border-color: var(--dk-accent);
    background: var(--dk-accent-dim);
}
.dk-topic-filter-btn.active {
    color: var(--dk-white);
    background: var(--dk-accent);
    border-color: var(--dk-accent);
}
.dk-topic-filter-btn.active:hover {
    opacity: 0.9;
    color: var(--dk-white);
}
.dk-activity-task-name {
    color: var(--dk-text-muted);
    font-weight: 400;
    margin-left: 4px;
}
.dk-activity-project {
    display: inline-flex;
    align-items: center;
}
/* ── Topic comment expand ─────────────────────────────────── */
.dk-topic-comment {
    margin-top: 6px;
    background: var(--dk-bg);
    border: 1px solid var(--dk-border-light);
    border-radius: var(--dk-radius);
    padding: 10px 12px;
    font-size: var(--dk-fs-13);
    line-height: 1.5;
    color: var(--dk-text);
}
.dk-topic-collapsible .dk-topic-comment-inner {
    max-height: 200px;
    overflow: hidden;
    position: relative;
}
.dk-topic-collapsible .dk-topic-comment-inner::after {
    content: '';
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    height: 48px;
    background: linear-gradient(transparent, var(--dk-bg));
    pointer-events: none;
}
.dk-topic-collapsible.expanded .dk-topic-comment-inner {
    max-height: none;
}
.dk-topic-collapsible.expanded .dk-topic-comment-inner::after {
    display: none;
}
.dk-topic-expand-btn {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-top: 6px;
    padding: 4px 10px;
    font-size: var(--dk-fs-12);
    font-weight: 500;
    color: var(--dk-accent);
    background: none;
    border: none;
    cursor: pointer;
    border-radius: 4px;
    transition: background 0.15s;
}
.dk-topic-expand-btn:hover {
    background: var(--dk-accent-dim);
}
.dk-topic-collapsible.expanded .dk-topic-expand-btn .dk-topic-expand-label {
    display: none;
}
.dk-topic-collapsible.expanded .dk-topic-expand-btn i {
    transform: rotate(180deg);
}


/* ── PROJECT HEADER ──────────────────────────────────────────── */
.dk-project-header {
    background: var(--dk-surface);
    border-radius: var(--dk-radius-lg);
    padding: 20px 24px;
    border: 1px solid var(--dk-border);
}
.dk-project-header-inner {
    display: flex;
    align-items: flex-start;
    gap: 16px;
}
.dk-project-badge-lg {
    width: 48px;
    height: 48px;
    border-radius: var(--dk-radius);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-22);
    flex-shrink: 0;
}
.dk-project-header-info {
    flex: 1;
    min-width: 0;
}
.dk-project-title {
    font-size: var(--dk-fs-22);
    font-weight: 700;
    color: var(--dk-text);
}

/* ── STATS ROW ───────────────────────────────────────────────── */
.dk-stats-row {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.dk-stat-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    border-radius: 20px;
    background: var(--dk-bg-row-hover);
    border: 1px solid var(--dk-border);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
    text-decoration: none;
    transition:
        background 0.12s,
        border-color 0.12s;
}
.dk-stat-chip:hover {
    background: var(--dk-border-light);
    color: var(--dk-text);
    text-decoration: none;
}
.dk-stat-chip strong {
    font-weight: 700;
    color: var(--dk-stat-color, var(--dk-text));
}
.dk-stat-chip-filled {
    background: var(--dk-stat-color, var(--dk-accent));
    border-color: var(--dk-stat-color, var(--dk-accent));
    color: #fff;
}
.dk-stat-chip-filled strong {
    color: #fff;
}
.dk-stat-chip-filled:hover {
    background: var(--dk-stat-color, var(--dk-accent));
    color: #fff;
    opacity: 0.9;
}
.dk-stat-chip-active {
    background: color-mix(
        in srgb,
        var(--dk-stat-color, var(--dk-accent)) 12%,
        transparent
    );
    border-color: var(--dk-stat-color, var(--dk-accent));
    color: var(--dk-text);
}

/* ── ACCESS PANEL ───────────────────────────────────────────── */
.dk-access-panel {
    max-width: 640px;
}
.dk-access-mode {
    background: var(--dk-bg);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 14px 16px;
}
.dk-access-section-label {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    letter-spacing: 0.06em;
    color: var(--dk-text-muted);
    text-transform: uppercase;
    margin-bottom: 8px;
}
.dk-access-list {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    overflow: hidden;
}
.dk-access-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 14px;
    border-bottom: 1px solid var(--dk-border-light);
}
.dk-access-row:last-child {
    border-bottom: none;
}
.dk-access-avatar {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-size: var(--dk-fs-11);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.dk-access-info {
    flex: 1;
    min-width: 0;
}
.dk-access-name {
    font-size: var(--dk-fs-13);
    font-weight: 500;
    color: var(--dk-text);
}
.dk-access-add-form {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 16px;
}
.dk-btn-sm {
    padding: 3px 8px;
    font-size: var(--dk-fs-12-5);
}

/* ── TASK LIST ───────────────────────────────────────────────── */
.dk-task-list {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    overflow: hidden;
}

/* Планирование релиза (/release/{tag_id}) -- см. views/v_release.php */
.dk-release-capacity-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 12px;
}
.dk-release-capacity-item label {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    margin-bottom: 4px;
}
.dk-release-pick-row {
    display: flex;
    align-items: center;
    gap: 8px;
    border-bottom: 1px solid var(--dk-border-light);
}
.dk-release-pick-row:last-child {
    border-bottom: none;
}
.dk-release-pick-task {
    flex: 1;
    min-width: 0;
}
.dk-release-pick-task .dk-task-row {
    border-bottom: none;
}
.dk-release-add-btn,
.dk-release-remove-btn {
    margin-right: 12px;
    flex-shrink: 0;
}
.dk-release-add-btn {
    color: var(--dk-success);
}
.dk-release-remove-btn {
    color: var(--dk-danger);
}
.dk-release-remove-locked {
    margin-right: 16px;
    flex-shrink: 0;
    color: var(--dk-text-muted);
    opacity: .5;
    font-size: var(--dk-fs-13);
}
.dk-release-list-disabled {
    opacity: .85;
}
.dk-release-summary {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 12px 14px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.dk-release-summary-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 6px;
    font-size: var(--dk-fs-12);
}
.dk-release-summary-label {
    display: flex;
    align-items: center;
    gap: 6px;
    font-weight: 600;
    color: var(--dk-text);
}
.dk-release-summary-nums {
    color: var(--dk-text-muted);
}
.dk-release-over {
    color: var(--dk-danger);
    font-weight: 700;
}
.dk-task-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 14px 18px;
    border-bottom: 1px solid var(--dk-border-light);
    text-decoration: none;
    color: var(--dk-text);
    transition: background 0.1s;
    gap: 14px;
}
.dk-task-row:last-child {
    border-bottom: none;
}
.dk-task-row:hover {
    background: var(--dk-bg-row-hover);
    text-decoration: none;
    color: var(--dk-text);
}
.dk-task-row-left {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
    flex: 1;
}
.dk-task-row-body {
    flex: 1;
    min-width: 0;
}
.dk-task-estimates {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 4px;
}
.dk-task-estimate-chip {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 7px;
    border-radius: 9px;
    background: var(--dk-bg);
    border: 1px solid var(--dk-border-light);
    font-size: var(--dk-fs-10);
    font-weight: 500;
    color: var(--dk-text-muted);
}
.dk-task-row-right {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-shrink: 0;
}
.dk-task-code {
    font-family: var(--dk-font-mono);
    font-size: var(--dk-fs-13-5);
    color: var(--dk-text-muted);
    white-space: nowrap;
    flex-shrink: 0;
}
/* Код задачи -- отдельной строкой над названием (не рядом с иконкой типа). */
.dk-task-row .dk-task-code {
    display: block;
    margin-bottom: 2px;
}
.dk-task-type-icon {
    font-size: var(--dk-fs-16);
    flex-shrink: 0;
}
.dk-task-name {
    display: block;
    font-size: var(--dk-fs-17);
    font-weight: 500;
    color: var(--dk-text);
    text-decoration: none;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-task-name:hover {
    color: var(--dk-accent);
    text-decoration: none;
}
.dk-task-executor {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 200px;
    font-size: var(--dk-fs-13-5);
}
.dk-task-deadline {
    white-space: nowrap;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13-5);
}
.dk-deadline-overdue {
    color: var(--dk-danger) !important;
    font-weight: 500;
}
/* Брэдкрамб Проект -> Подпроект под названием задачи (TaskRow::render, showPath=true) --
   используется там, где задачи показаны вперемешку из разных проектов (дашборд). */
.dk-task-path {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 6px;
    margin-top: 2px;
    font-size: var(--dk-fs-11-5);
    line-height: 1.3;
    overflow: hidden;
}
.dk-task-path-proj {
    display: flex;
    align-items: center;
    gap: 4px;
    min-width: 0;
    overflow: hidden;
}
/* Приоритет задачи -- перенесён на строку пути (карточка канбана), см.
   .dk-kanban-card партиал. Раньше был отдельной строкой внизу карточки. */
.dk-kanban-card-priority {
    flex-shrink: 0;
    font-size: var(--dk-fs-11);
    margin-left: auto;
}
.dk-task-path-item {
    color: var(--dk-text-muted);
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-task-path-item:hover {
    color: var(--dk-accent);
    text-decoration: underline;
}
.dk-task-path-sep {
    font-size: var(--dk-fs-8);
    color: var(--dk-text-light);
    flex-shrink: 0;
}
.dk-task-path-icon {
    font-size: var(--dk-fs-10);
    color: var(--dk-text-light);
    flex-shrink: 0;
    opacity: .7;
}
/* ── PAGES (вики-страницы) ──────────────────────────────────── */

/* Выбор проекта */
.dk-pages-project-card {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 16px;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    text-decoration: none;
    color: var(--dk-text);
    transition:
        border-color 0.15s,
        box-shadow 0.15s;
}
.dk-pages-project-card:hover {
    border-color: var(--dk-accent);
    box-shadow: 0 0 0 3px var(--dk-accent-dim);
    color: var(--dk-text);
}
.dk-pages-project-icon {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-18);
    flex-shrink: 0;
}
.dk-pages-project-name {
    font-weight: 600;
    font-size: var(--dk-fs-14);
}
.dk-pages-project-code {
    font-size: var(--dk-fs-12);
}

/* Лейаут страницы: контент + sidebar */
.dk-page-layout {
    display: grid;
    grid-template-columns: 1fr 240px;
    gap: 24px;
    align-items: start;
}
@media (max-width: 768px) {
    .dk-page-layout {
        grid-template-columns: 1fr;
    }
    .dk-page-sidebar {
        order: -1;
    }
}

/* Основной контент */
.dk-page-header {
    margin-bottom: 20px;
}
.dk-page-title {
    font-size: var(--dk-fs-22);
    font-weight: 700;
    margin-bottom: 4px;
}
.dk-page-meta {
    font-size: var(--dk-fs-12);
}
.dk-page-hidden-badge {
    display: inline-flex;
    align-items: center;
    margin-top: 4px;
    padding: 2px 9px;
    border-radius: 999px;
    background: var(--dk-surface-2);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-12);
    font-weight: 600;
}

/* Prose — типографика содержимого TinyMCE */
.dk-prose {
    font-size: var(--dk-fs-15);
    line-height: 1.7;
    color: var(--dk-text);
}
.dk-prose h1,
.dk-prose h2,
.dk-prose h3 {
    font-weight: 700;
    margin-top: 1.5em;
    margin-bottom: 0.5em;
}
.dk-prose h1 {
    font-size: 1.6em;
}
.dk-prose h2 {
    font-size: 1.3em;
}
.dk-prose h3 {
    font-size: 1.1em;
}
.dk-prose p {
    margin-bottom: 0.9em;
}
.dk-prose ul,
.dk-prose ol {
    padding-left: 1.5em;
    margin-bottom: 0.9em;
}
.dk-prose li {
    margin-bottom: 0.3em;
}
.dk-prose a {
    color: var(--dk-accent);
}
.dk-prose a:hover {
    text-decoration: underline;
}
.dk-prose table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 1em;
    font-size: var(--dk-fs-14);
}
.dk-prose table th,
.dk-prose table td {
    padding: 8px 12px;
    border: 1px solid var(--dk-border);
}
.dk-prose table th {
    background: var(--dk-surface-2);
    font-weight: 600;
}
.dk-prose pre {
    background: var(--dk-surface-2);
    border-radius: 6px;
    padding: 12px 16px;
    overflow-x: auto;
    font-size: var(--dk-fs-13);
}
.dk-prose code {
    background: var(--dk-surface-2);
    border-radius: 3px;
    padding: 1px 5px;
    font-size: 0.88em;
}
.dk-prose blockquote {
    border-left: 3px solid var(--dk-accent);
    margin: 0 0 1em;
    padding: 8px 16px;
    color: var(--dk-text-muted);
}
.dk-prose img {
    max-width: 100%;
    border-radius: var(--dk-radius);
}
.dk-prose hr {
    border: none;
    border-top: 1px solid var(--dk-border);
    margin: 1.5em 0;
}

/* Sidebar дерево -- фон намеренно ОТЛИЧАЕТСЯ от .dk-page-content
   (var(--dk-bg), а не var(--dk-surface)), чтобы панель визуально
   выделялась на фоне белой карточки контента, а не сливалась с ней
   (просьба Павла 2026-09-10). */
.dk-page-sidebar {
    background: var(--dk-bg);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    overflow: hidden;
    position: sticky;
    top: 80px;
}
.dk-page-sidebar-toolbar {
    display: flex;
    justify-content: flex-end;
    padding: 6px 6px 0;
}
.dk-page-sidebar.dk-collapsed .dk-page-sidebar-toolbar {
    justify-content: center;
    padding: 8px 0;
}
.dk-page-sidebar.dk-collapsed .dk-page-sidebar-body {
    display: none;
}
.dk-page-sidebar.dk-collapsed #sidebarToggleIcon {
    transform: rotate(180deg);
}
/* На десктопе свёрнутая панель ужимается почти до кнопки-стрелки, отдавая
   освободившееся место основному контенту. На мобильной раскладке
   (см. @media ниже, .dk-page-layout уже 1 колонка) ширину не трогаем --
   там панель просто схлопывается по высоте. */
@media (min-width: 769px) {
    .dk-page-layout.dk-sidebar-collapsed {
        grid-template-columns: 1fr 40px;
    }
}

/* На мобильной раскладке sidebar идёт первым (order:-1, см. выше) —
   sticky top:80px там не нужен и создаёт пустой отступ перед блоком,
   пока страница не проскроллена (сессия 62, отчёт о мобильной
   адаптивности). Правило обязано идти ПОСЛЕ базового .dk-page-sidebar
   выше по каскаду — иначе более поздняя по тексту файла база с той же
   специфичностью его перебивает независимо от @media. */
@media (max-width: 768px) {
    .dk-page-sidebar {
        position: static;
        top: auto;
    }
}
.dk-page-tree-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 10px 14px;
    font-size: var(--dk-fs-16);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--dk-text-muted);
    border-bottom: 1px solid var(--dk-border);
}
.dk-page-tree-toggle-hidden {
    background: none;
    border: none;
    color: var(--dk-text-muted);
    cursor: pointer;
    padding: 2px 4px;
    border-radius: 4px;
    line-height: 1;
    font-size: var(--dk-fs-14);
    flex-shrink: 0;
}
.dk-page-tree-toggle-hidden:hover {
    background: var(--dk-surface-2);
}
.dk-page-tree-toggle-hidden.active {
    color: var(--dk-accent);
}
.dk-page-tree {
    max-height: calc(100vh - 160px);
    overflow-y: auto;
    padding: 6px 0;
}
.dk-page-tree-item {
    display: flex;
    align-items: center;
    padding: 6px 12px;
    font-size: var(--dk-fs-17);
    color: var(--dk-text);
    text-decoration: none;
    border-radius: 0;
    transition: background 0.1s;
    min-width: 0;
}
.dk-page-tree-item-name {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-page-tree-item:hover {
    background: var(--dk-surface-2);
    color: var(--dk-text);
}
.dk-page-tree-item.active {
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-weight: 600;
}
.dk-page-tree-item-hidden {
    display: none;
}
.dk-page-tree.dk-show-hidden .dk-page-tree-item-hidden {
    display: flex;
    opacity: 0.6;
}
.dk-page-tree-item-hidden-icon {
    margin-left: auto;
    padding-left: 6px;
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    flex-shrink: 0;
}

/* ── Таблицы-страницы (мини-Notion грид, Tabulator) ─────────── */
.dk-table-toolbar {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 12px;
}
.dk-table-grid {
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius) var(--dk-radius) 0 0;
    border-bottom: none;
    overflow: hidden;
}
.dk-table-add-row-btn {
    display: flex;
    align-items: center;
    width: 100%;
    padding: 8px 12px;
    border: 1px solid var(--dk-border);
    border-radius: 0 0 var(--dk-radius) var(--dk-radius);
    background: var(--dk-surface);
    color: var(--dk-text-muted);
    font-family: var(--dk-font);
    font-size: var(--dk-fs-13);
    text-align: left;
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
}
.dk-table-add-row-btn:hover {
    background: var(--dk-bg-row-hover);
    color: var(--dk-accent);
}
.dk-dt-ghost-row {
    cursor: pointer;
}
.dk-dt-ghost-row:hover {
    background: var(--dk-bg-row-hover);
}
.dk-dt-ghost-row .tabulator-row-handle {
    pointer-events: none;
    opacity: .25;
}
.dk-dt-ghost-label {
    display: inline-flex;
    align-items: center;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
}
.dk-dt-ghost-row:hover .dk-dt-ghost-label {
    color: var(--dk-accent);
}
.dk-dt-row-delete {
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: color 0.15s;
}
.dk-dt-row-delete:hover {
    color: var(--dk-danger);
}

/* Tabulator — переопределения под дизайн-систему doka */
.dk-table-grid .tabulator {
    background: var(--dk-surface);
    border: none;
    font-family: var(--dk-font);
    font-size: var(--dk-fs-13);
    color: var(--dk-text);
}
.dk-table-grid .tabulator-header {
    background: var(--dk-surface);
    border-bottom: 1px solid var(--dk-border);
}
.dk-table-grid .tabulator-col {
    background: var(--dk-surface);
    border-right: 1px solid var(--dk-border-light);
}
.dk-table-grid .tabulator-col-title {
    font-weight: 600;
    color: var(--dk-text);
    cursor: pointer;
}
.dk-table-grid .tabulator-col-title:hover {
    color: var(--dk-accent);
}
.dk-table-grid .tabulator-col-sorter {
    padding: 3px;
    border-radius: 4px;
}
.dk-table-grid .tabulator-col-sorter:hover {
    background: var(--dk-accent-dim);
}
.dk-table-grid .tabulator-row {
    background: var(--dk-surface);
    border-bottom: 1px solid var(--dk-border-light);
}
.dk-table-grid .tabulator-row:hover {
    background: var(--dk-bg-row-hover);
}
.dk-table-grid .tabulator-row .tabulator-cell {
    border-right: 1px solid var(--dk-border-light);
}
.dk-table-grid .tabulator-row .tabulator-cell.tabulator-editing {
    border: 1px solid var(--dk-accent);
}
.dk-table-grid .tabulator-calcs-holder {
    background: var(--dk-accent-dim);
    font-weight: 600;
}
.dk-table-grid .tabulator-menu {
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    box-shadow: var(--dk-shadow-sm);
    font-family: var(--dk-font);
    font-size: var(--dk-fs-13);
}
.dk-table-grid .tabulator-menu .tabulator-menu-item {
    padding: 6px 12px;
}
.dk-table-grid .tabulator-menu .tabulator-menu-item:hover {
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
}

/* ── Файловая библиотека в сайдбаре ─────────────────────────── */
.dk-sidebar-section-header {
    display: flex;
    align-items: center;
    font-size: var(--dk-fs-14);
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--dk-text-muted);
    padding: 12px 14px 8px;
}
.dk-sidebar-upload-btn {
    background: none;
    border: none;
    color: var(--dk-text-muted);
    cursor: pointer;
    padding: 2px 4px;
    border-radius: 4px;
    line-height: 1;
    font-size: var(--dk-fs-14);
}
.dk-sidebar-upload-btn:hover {
    background: var(--dk-hover);
    color: var(--dk-accent);
}
.dk-sidebar-dropzone {
    margin: 0 10px 8px;
    border: 1.5px dashed var(--dk-border);
    border-radius: var(--dk-radius);
    padding: 10px 8px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    cursor: pointer;
    transition:
        border-color 0.15s,
        background 0.15s;
}
.dk-sidebar-dropzone:hover,
.dk-sidebar-dropzone.dk-dropzone-over {
    border-color: var(--dk-accent);
    background: var(--dk-accent-dim);
}
.dk-sidebar-dropzone.dk-dropzone-uploading {
    opacity: 0.5;
    pointer-events: none;
}
.dk-dropzone-link {
    color: var(--dk-accent);
    cursor: pointer;
    text-decoration: underline;
}
.dk-sidebar-file-list {
    padding: 0 4px 4px;
}
.dk-sidebar-empty {
    font-size: var(--dk-fs-16);
    color: var(--dk-text-muted);
    text-align: center;
    padding: 6px 0 8px;
    margin: 0;
}
.dk-sidebar-file-item {
    display: flex;
    flex-direction: column;
    gap: 0;
    padding: 6px 8px;
    border-radius: 8px;
    font-size: var(--dk-fs-16);
    transition: background 0.12s;
    cursor: default;
}
.dk-sidebar-file-item:hover {
    background: var(--dk-hover);
}
.dk-sidebar-file-main {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
}
.dk-sidebar-file-icon {
    flex-shrink: 0;
    font-size: var(--dk-fs-22);
}
.dk-sidebar-file-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--dk-text);
    font-size: var(--dk-fs-16);
    font-weight: 500;
}
.dk-sidebar-file-actions {
    display: none;
    gap: 3px;
    margin-top: 6px;
    flex-wrap: wrap;
}
.dk-sidebar-file-item:hover .dk-sidebar-file-actions {
    display: flex;
}
/* .dk-icon-btn — универсальная кнопка-иконка (сессия 46: расширена с
   .dk-sidebar-file-actions на standalone-использование, напр. карточки контактов) */
.dk-icon-btn,
a.dk-icon-btn {
    width: 30px;
    height: 30px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 6px;
    border: 1px solid var(--dk-border);
    background: var(--dk-bg);
    color: var(--dk-text-muted);
    cursor: pointer;
    font-size: var(--dk-fs-14);
    text-decoration: none;
    transition:
        background 0.12s,
        color 0.12s,
        border-color 0.12s;
}
.dk-icon-btn:hover,
a.dk-icon-btn:hover {
    background: var(--dk-hover);
    color: var(--dk-accent);
    border-color: var(--dk-accent);
}
.dk-icon-btn.text-danger:hover {
    color: #dc3545;
    border-color: #dc3545;
    background: #fff5f5;
}
.dk-icon-btn-sm {
    width: 26px;
    height: 26px;
    font-size: var(--dk-fs-12);
}

/* Карточки контактов клиента (сессия 46) */
.dk-contact-cards {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 12px;
}
.dk-contact-card {
    position: relative;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    padding: 14px 16px;
    transition: border-color 0.12s;
}
.dk-contact-card:hover {
    border-color: var(--dk-accent);
}
.dk-contact-card-name {
    font-weight: 500;
    color: var(--dk-text);
    padding-right: 62px;
    word-break: break-word;
}
.dk-contact-card-type {
    margin: 4px 0 6px;
}
.dk-contact-card-line {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-muted);
    margin-top: 3px;
}
.dk-contact-card-link {
    color: var(--dk-text-muted);
    text-decoration: none;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-contact-card-link:hover {
    color: var(--dk-accent);
    text-decoration: underline;
}
.dk-contact-card-comment {
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-light);
    font-style: italic;
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px dashed var(--dk-border);
    word-break: break-word;
}
.dk-contact-card-actions {
    position: absolute;
    top: 10px;
    right: 10px;
    display: flex;
    gap: 4px;
    opacity: 0;
    transition: opacity 0.12s;
}
.dk-contact-card:hover .dk-contact-card-actions {
    opacity: 1;
}
.dk-sidebar-divider {
    height: 1px;
    background: var(--dk-border);
    margin: 10px 10px 6px;
}
.dk-sidebar-progress {
    height: 3px;
    background: var(--dk-border);
    margin: 0 10px 6px;
    border-radius: 2px;
    overflow: hidden;
}
.dk-sidebar-progress-bar {
    height: 100%;
    background: var(--dk-accent);
    border-radius: 2px;
    width: 0%;
    transition: width 0.15s ease;
}
.dk-sidebar-file-thumb {
    width: 36px;
    height: 36px;
    object-fit: cover;
    border-radius: 4px;
    flex-shrink: 0;
    cursor: pointer;
    border: 1px solid var(--dk-border);
}
.dk-sidebar-file-thumb:hover {
    opacity: 0.85;
}
.dk-sidebar-file-info {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 1px;
}
.dk-sidebar-file-size {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
}
/* Бейдж типа документа (сессия 46, файлы клиента) */
.dk-doc-type-badge {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    font-size: var(--dk-fs-10);
    font-weight: 500;
    margin-top: 1px;
}

/* Кнопка удаления файла из превью перед загрузкой задачи (сессия 46) */
.dk-attach-remove {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--dk-text-light);
    cursor: pointer;
    font-size: var(--dk-fs-13);
    line-height: 1;
    border-radius: 3px;
}
.dk-attach-remove:hover {
    background: rgba(220, 53, 69, 0.12);
    color: #dc3545;
}

/* Белый фон для страниц-документов */
.dk-page-content,
.dk-page-layout {
    background: var(--dk-surface);
}
.dk-page-content {
    padding: 28px 32px;
    border-radius: var(--dk-radius);
    border: 1px solid var(--dk-border);
    min-height: 400px;
    min-width: 0;
    overflow-wrap: break-word;
    overflow-x: auto;
}

/* ── Приватные комментарии ───────────────────────────────────── */
.dk-comment-private {
    background: #fffbeb;
    border: 1px solid #fde68a;
    border-radius: var(--dk-radius);
    padding: 10px 12px;
}
.dk-comment-private .dk-comment-avatar {
    background: #f59e0b;
}
/* Фон приватного комментария нарочно светло-жёлтый в ЛЮБОЙ теме (не
   переопределяется в тёмной, см. комментарий у :root[data-theme="dark"]
   выше) -- но .dk-comment-author/-date/-text цвет не задавали, брали общий
   var(--dk-text)/var(--dk-text-light), а те в тёмной теме становятся светлыми
   -- светлый текст на светлом фоне, почти нечитаемо (жалоба Павла, скриншот
   приватного комментария в тёмной теме, 2026-09-16). Фиксируем тёмный текст
   явно, только внутри .dk-comment-private -- в светлой теме ничего не меняет
   (там var(--dk-text) и так тёмный), эффект только в dark. */
[data-theme="dark"] .dk-comment-private .dk-comment-author,
[data-theme="dark"] .dk-comment-private .dk-comment-text {
    color: #451a03;
}
[data-theme="dark"] .dk-comment-private .dk-comment-date {
    color: #92400e;
}

/* Кнопка-предупреждение (warning) */
.dk-btn-warning {
    background: #fef3c7;
    color: #92400e;
    border: 1px solid #fcd34d;
}
.dk-btn-warning:hover {
    background: #fde68a;
    color: #78350f;
}

/* ── Поиск в сайдбаре ───────────────────────────────────────── */
.dk-nav-search {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 14px;
    border-radius: var(--dk-radius-sm);
    border: 1px solid transparent;
    transition:
        border-color 0.15s,
        background 0.15s;
    cursor: text;
}
.dk-nav-search:hover,
.dk-nav-search:focus-within {
    background: var(--dk-sidebar-hover);
    border-color: var(--dk-accent);
}
.dk-nav-search.active {
    color: var(--dk-sidebar-active);
}
.dk-nav-search-icon {
    font-size: var(--dk-fs-15);
    color: var(--dk-sidebar-text);
    flex-shrink: 0;
    cursor: text;
}
.dk-nav-search:focus-within .dk-nav-search-icon {
    color: var(--dk-accent);
}
.dk-nav-search-input {
    background: transparent;
    border: none;
    outline: none;
    color: #e5e7eb;
    font-size: var(--dk-fs-14);
    width: 100%;
    min-width: 0;
}
.dk-nav-search-input::placeholder {
    color: var(--dk-sidebar-text);
}
/* Свёрнутый сайдбар — скрываем инпут, показываем только иконку */
.dk-sidebar-collapsed .dk-nav-search-input {
    display: none;
}
.dk-sidebar-collapsed .dk-nav-search {
    padding: 8px 0;
    justify-content: center;
}

/* ── Результаты поиска ──────────────────────────────────────── */
.dk-search-header {
    margin-bottom: 20px;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-14);
}
.dk-search-section {
    margin-bottom: 24px;
}
.dk-search-section-title {
    display: flex;
    align-items: center;
    font-size: var(--dk-fs-12);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--dk-text-muted);
    margin-bottom: 8px;
    padding-bottom: 6px;
    border-bottom: 1px solid var(--dk-border);
}
.dk-search-list {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.dk-search-item {
    display: flex;
    align-items: center;
    gap: 10px;
}
.dk-search-item a {
    text-decoration: none;
    color: var(--dk-text);
}

.dk-search-item,
.dk-search-item a,
a.dk-search-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 12px;
    border-radius: var(--dk-radius-sm);
    text-decoration: none;
    color: var(--dk-text);
    font-size: var(--dk-fs-14);
    transition: background 0.1s;
}
a.dk-search-item:hover {
    background: var(--dk-surface-2);
    color: var(--dk-text);
}
.dk-search-code {
    font-family: var(--dk-font-mono);
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    flex-shrink: 0;
}
.dk-search-name {
    font-weight: 500;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-search-descr {
    font-size: var(--dk-fs-13);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 300px;
}
.dk-project-badge-sm {
    width: 26px;
    height: 26px;
    border-radius: 6px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-13);
    flex-shrink: 0;
}

/* ─── @mention dropdown ────────────────────────────────────────────────────── */
.dk-mention-dropdown {
    position: fixed;
    z-index: 99999;
    background: var(--dk-surface);
    border: 1px solid #dee2e6;
    border-radius: 8px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
    min-width: 220px;
    max-width: 320px;
    max-height: 260px;
    overflow-y: auto;
    padding: 4px 0;
}
.dk-mention-item {
    display: flex;
    flex-direction: column;
    padding: 7px 14px;
    cursor: pointer;
    gap: 1px;
}
.dk-mention-item:hover,
.dk-mention-item.active {
    background: #fff7ed;
}
.dk-mention-uname {
    font-size: var(--dk-fs-14);
    font-weight: 500;
    color: #1e293b;
}
.dk-mention-pos {
    font-size: var(--dk-fs-12);
    color: #94a3b8;
}

/* ─── @mention chip (внутри TinyMCE и в сохранённом HTML) ─────────────────── */
.dk-mention {
    display: inline-block;
    background: #fff7ed;
    color: #ea580c;
    border-radius: 4px;
    padding: 0 5px;
    font-weight: 500;
    font-size: 0.92em;
    white-space: nowrap;
}

/* ─── @mention ссылка (внутри Toast UI Editor: <a href="mailto:...">@Имя</a>) ──── */
/* span.dk-mention не переживает setHTML()/getHTML() в Toast UI, поэтому новый 
   формат -- обычная ссылка mailto:, стилизуем её так же, как старый чип */
.dk-task-descr-content a[href^="mailto:"],
.dk-comment-text a[href^="mailto:"],
.dk-page-body a[href^="mailto:"],
.toastui-editor-contents a[href^="mailto:"] {
    display: inline-block;
    background: #fff7ed;
    color: #ea580c;
    border-radius: 4px;
    padding: 0 5px;
    font-weight: 500;
    font-size: 0.92em;
    white-space: nowrap;
    text-decoration: none;
}

/* ─── Индикатор дропдауна у кнопки "Заголовки" (H) в тулбаре Toast UI Editor ──
   Кнопка визуально неотличима от обычных (B/I/S), хотя по клику открывает
   попап "Заголовок 1-6 + Абзац" -- Павел не понял, что это меню (2026-08-02).
   Добавлена стрелочка вниз в углу кнопки, чисто визуальный маркер, поведение
   самой кнопки не меняется. Треугольник через border, не unicode-символ и не
   bootstrap-icons codepoint -- проще и не требует подбора глифа. */
.toastui-editor-toolbar-icons.heading {
    position: relative;
}
.toastui-editor-toolbar-icons.heading::after {
    content: "";
    position: absolute;
    right: 3px;
    bottom: 4px;
    width: 0;
    height: 0;
    border-left: 4.5px solid transparent;
    border-right: 4.5px solid transparent;
    border-top: 5px solid #6b7280;
    pointer-events: none;
}

/* ─── Кнопка "HTML" в тулбаре Toast UI Editor (просмотр/правка сырого HTML) ──── */
/* Специфичность .toastui-editor-defaultUI-toolbar button (класс+тег) в
   вендоренном css выше, чем у одного .dk-toast-html-btn (просто класс) --
   width:32px и padding:0 оттуда побеждали наши width:auto/padding:0 8px,
   текст "HTML" не помещался в 32px и вылезал за рамку кнопки. Поднимаем
   специфичность правила до того же уровня, что и у переопределяемого. */
.toastui-editor-defaultUI-toolbar button.dk-toast-html-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: auto;
    min-width: 32px;
    height: 32px;
    padding: 0 8px;
    border: none;
    background: transparent;
    border-radius: 4px;
    color: #4b5563;
    font-size: var(--dk-fs-11);
    font-weight: 600;
    letter-spacing: 0.02em;
    cursor: pointer;
}
.toastui-editor-defaultUI-toolbar button.dk-toast-html-btn:hover {
    background: #f3f4f6;
    color: #1e293b;
}

/* ─── Кнопка "Полный экран" в тулбаре Toast UI Editor ──── */
/* Иконка вместо текста (изначально был текстовый лейбл "Экран"/"Свернуть" --
   Павел заметил, что текст вылезает за пределы кнопки, ширина скачет между
   состояниями). Глиф -- из шрифта bootstrap-icons (уже подключён глобально),
   через CSS content по codepoint -- Toast UI не даёт вставить <i class="bi-..">
   внутрь toolbarItem.text (там только текст, не HTML). */
.dk-toast-fullscreen-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    border: none;
    background: transparent;
    border-radius: 4px;
    color: #4b5563;
    cursor: pointer;
}
.dk-toast-fullscreen-btn::before {
    font-family: 'bootstrap-icons' !important;
    content: "\f14d";
    font-size: var(--dk-fs-15);
    line-height: 1;
}
.dk-toast-fullscreen-btn:hover {
    background: #f3f4f6;
    color: #1e293b;
}
.dk-toast-holder.dk-toast-fullscreen .dk-toast-fullscreen-btn {
    background: var(--dk-accent);
    color: #fff;
}
.dk-toast-holder.dk-toast-fullscreen .dk-toast-fullscreen-btn:hover {
    background: var(--dk-surface);
    color: var(--dk-accent);
    box-shadow: inset 0 0 0 1px var(--dk-accent-dim);
}
.dk-toast-holder.dk-toast-fullscreen .dk-toast-fullscreen-btn::before {
    content: "\f3de";
}
/* holder -- div, в который Toast UI монтирует свою внутреннюю разметку
   (см. js/dk-toast-editor.js init()); класс добавляется/убирается снаружи
   через classList, внутренности Toast UI не трогаем. */
.dk-toast-holder.dk-toast-fullscreen {
    position: fixed;
    inset: 0;
    z-index: 1080;
    background: var(--dk-surface);
    padding: 16px;
    display: flex;
    flex-direction: column;
    box-shadow: 0 0 0 9999px rgba(15, 23, 42, 0.35);
}
.dk-toast-holder.dk-toast-fullscreen .toastui-editor-defaultUI {
    flex: 1;
    display: flex;
    flex-direction: column;
    height: 100% !important;
}
/* Прячем фоновую прокрутку страницы, пока редактор развёрнут на весь экран */
body.dk-toast-fullscreen-open {
    overflow: hidden;
}

/* --- Кнопки "Якорь" / "Ссылка на якорь" в тулбаре Toast UI Editor ---- */
/* Тот же паттерн, что у .dk-toast-fullscreen-btn выше: иконка через CSS
   ::before (bootstrap-icons), текст кнопки -- один пробел (нужна ненулевая
   ширина, сам текст не виден). */
.dk-toast-anchor-insert-btn,
.dk-toast-anchor-link-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    border: none;
    background: transparent;
    border-radius: 4px;
    color: #4b5563;
}
.dk-toast-anchor-insert-btn:hover,
.dk-toast-anchor-link-btn:hover {
    background: #f3f4f6;
    color: #1e293b;
}
.dk-toast-anchor-insert-btn::before {
    font-family: 'bootstrap-icons' !important;
    content: "\f19d";
    font-size: var(--dk-fs-15);
    line-height: 1;
}
.dk-toast-anchor-link-btn::before {
    font-family: 'bootstrap-icons' !important;
    content: "\f549";
    font-size: var(--dk-fs-15);
    line-height: 1;
}

/* Отображение якоря -- и внутри WYSIWYG-редактора (пока набираем), и при
   обычном чтении сохранённого HTML (задача/вики без редактора) -- один и
   тот же <span class="dk-anchor" id="...">, стилизуем в обоих контекстах. */
.dk-anchor {
    background: var(--dk-accent-dim);
    border-radius: 3px;
    padding: 0 3px;
    scroll-margin-top: 80px; /* якорь не прячется под фиксированной шапкой при переходе по #id */
}

/* --- Кнопка "Выделить цветом" в тулбаре Toast UI Editor --- */
.dk-toast-highlight-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    border: none;
    background: transparent;
    border-radius: 4px;
    color: #4b5563;
}
.dk-toast-highlight-btn:hover {
    background: #f3f4f6;
    color: #1e293b;
}
.dk-toast-highlight-btn::before {
    font-family: 'bootstrap-icons' !important;
    content: "\f7f8";
    font-size: var(--dk-fs-15);
    line-height: 1;
}

/* --- Модалка выбора цвета подсветки --- */
.dk-highlight-row-label {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .02em;
    color: var(--dk-text-muted);
    margin: 10px 0 6px;
}
.dk-highlight-row-label:first-child {
    margin-top: 0;
}
.dk-highlight-row {
    display: flex;
    gap: 10px;
}
.dk-highlight-swatch {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    border: 1px solid var(--dk-border);
    cursor: pointer;
    transition: transform .1s ease;
}
.dk-highlight-swatch:hover {
    transform: scale(1.12);
}

/* --- Сами классы подсветки (Павел, 2026-09-19) -- фиксированный набор из 6
   цветов, class-based (не inline style, см. комментарий в dk-toast-editor.js
   про HtmlSanitizer). Работают одинаково и в живом редакторе, и в read-only
   отображении (описание задачи/комментарии/вики) -- НЕ scoped на
   .toastui-editor-contents, в отличие от чек-листов Toast UI (см. фикс
   "чекбоксы терялись в просмотре", тот же день). --- */
.dk-highlight-bg-yellow, .dk-highlight-swatch.dk-highlight-bg-yellow { background: #fef9c3; color: #854d0e; }
.dk-highlight-bg-red,    .dk-highlight-swatch.dk-highlight-bg-red    { background: #fee2e2; color: #991b1b; }
.dk-highlight-bg-green,  .dk-highlight-swatch.dk-highlight-bg-green  { background: #dcfce7; color: #166534; }
.dk-highlight-bg-blue,   .dk-highlight-swatch.dk-highlight-bg-blue   { background: #dbeafe; color: #1e40af; }
.dk-highlight-bg-purple, .dk-highlight-swatch.dk-highlight-bg-purple { background: #f3e8ff; color: #6b21a8; }
.dk-highlight-bg-gray,   .dk-highlight-swatch.dk-highlight-bg-gray   { background: #f1f5f9; color: #334155; }
.dk-highlight-bg-yellow, .dk-highlight-bg-red, .dk-highlight-bg-green,
.dk-highlight-bg-blue, .dk-highlight-bg-purple, .dk-highlight-bg-gray {
    padding: 1px 5px;
    border-radius: 4px;
}
.dk-highlight-text-yellow { color: #b45309; font-weight: 600; }
.dk-highlight-text-red    { color: #dc2626; font-weight: 600; }
.dk-highlight-text-green  { color: #16a34a; font-weight: 600; }
.dk-highlight-text-blue   { color: #2563eb; font-weight: 600; }
.dk-highlight-text-purple { color: #9333ea; font-weight: 600; }
.dk-highlight-text-gray   { color: #475569; font-weight: 600; }
.dk-highlight-swatch.dk-highlight-text-yellow { background: #fde68a; }
.dk-highlight-swatch.dk-highlight-text-red    { background: #fca5a5; }
.dk-highlight-swatch.dk-highlight-text-green  { background: #86efac; }
.dk-highlight-swatch.dk-highlight-text-blue   { background: #93c5fd; }
.dk-highlight-swatch.dk-highlight-text-purple { background: #d8b4fe; }
.dk-highlight-swatch.dk-highlight-text-gray   { background: #cbd5e1; }

.dk-toast-hint {
    margin-top: 6px;
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
}
.dk-html-modal-textarea {
    font-family: var(--dk-font-mono);
    font-size: var(--dk-fs-13);
    min-height: 320px;
    resize: vertical;
    white-space: pre-wrap;
    word-break: break-word;
    overflow-wrap: anywhere;
}
/* Редактор HTML-модалки -- CodeJar (contenteditable) + Prism (подсветка).
   .dk-html-modal-textarea выше остаётся фолбэком, если CodeJar/Prism не
   загрузились (см. js/dk-toast-editor.js openHtmlModal). */
.dk-html-modal-editor {
    display: block;
    font-family: var(--dk-font-mono);
    font-size: var(--dk-fs-13);
    line-height: 1.55;
    min-height: 320px;
    max-height: 60vh;
    resize: vertical;
    overflow: auto;
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    background: var(--dk-bg-row-hover);
    padding: 12px 14px;
    white-space: pre-wrap;
    word-break: break-word;
    overflow-wrap: anywhere;
}
.dk-html-modal-editor:focus {
    outline: none;
    border-color: var(--dk-accent-light);
}
.dk-html-modal-editor .token.tag,
.dk-html-modal-editor .token.attr-name {
    color: var(--dk-accent-hover);
}
.dk-html-modal-editor .token.attr-value,
.dk-html-modal-editor .token.attr-value .token.punctuation {
    color: #2563a8;
}
.dk-html-modal-editor .token.punctuation {
    color: var(--dk-text-muted);
}
.dk-html-modal-editor .token.comment {
    color: var(--dk-text-light);
}
.dk-html-modal-editor .token.entity {
    color: #b8740a;
}

/* ─── Попап изменения размера картинки в Toast UI Editor ──────────────────────
   Клик по картинке в WYSIWYG (см. js/dk-toast-image-resize.js) -- 4 пресета
   размера. Новая вставленная картинка по умолчанию ограничивается 800px
   (высота auto, пропорции сохраняются) -- та же логика, из того же файла. */
.dk-img-resize-popup {
    position: fixed;
    z-index: 99999;
    display: flex;
    gap: 2px;
    background: var(--dk-surface);
    border: 1px solid #dee2e6;
    border-radius: 8px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
    padding: 4px;
}
.dk-img-resize-btn {
    border: none;
    background: transparent;
    color: #4b5563;
    font-size: var(--dk-fs-12);
    font-weight: 500;
    padding: 6px 10px;
    border-radius: 5px;
    cursor: pointer;
    white-space: nowrap;
}
.dk-img-resize-btn:hover {
    background: #f3f4f6;
    color: #1e293b;
}
.dk-img-resize-btn.dk-active {
    background: #fff7ed;
    color: #ea580c;
}

/* ─── Колокольчик уведомлений ──────────────────────────────────────────────── */
.dk-notif-wrap {
    position: relative;
    flex-shrink: 0;
}
.dk-notif-btn {
    position: relative;
}
.dk-notif-badge {
    position: absolute;
    top: 2px;
    right: 2px;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    background: #ef4444;
    color: #fff;
    font-size: var(--dk-fs-10);
    font-weight: 700;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    pointer-events: none;
}
.dk-notif-panel {
    position: absolute;
    top: calc(100% + 8px);
    right: 0;
    width: 340px;
    max-height: 480px;
    background: var(--dk-surface);
    border: 1px solid #e2e8f0;
    border-radius: 12px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
    z-index: 9000;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
.dk-notif-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 16px;
    border-bottom: 1px solid #f1f5f9;
    font-weight: 600;
    font-size: var(--dk-fs-14);
    color: #0f172a;
    flex-shrink: 0;
}
.dk-notif-mark-all {
    background: none;
    border: none;
    font-size: var(--dk-fs-12);
    color: #f97316;
    cursor: pointer;
    padding: 0;
}
.dk-notif-mark-all:hover {
    text-decoration: underline;
}
.dk-notif-list {
    overflow-y: auto;
    flex: 1;
}
.dk-notif-loading,
.dk-notif-empty {
    padding: 28px 16px;
    text-align: center;
    color: #94a3b8;
    font-size: var(--dk-fs-14);
}
.dk-notif-item {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 10px 16px;
    border-bottom: 1px solid #f8fafc;
    text-decoration: none;
    color: #1e293b;
    position: relative;
    transition: background 0.1s;
}
.dk-notif-item:hover {
    background: #f8fafc;
}
.dk-notif-item.unread {
    background: #fff7ed;
}
.dk-notif-item.unread:hover {
    background: #fed7aa22;
}
.dk-notif-icon {
    font-size: var(--dk-fs-16);
    color: #f97316;
    margin-top: 2px;
    flex-shrink: 0;
}
.dk-notif-body {
    flex: 1;
    min-width: 0;
}
.dk-notif-title {
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: #0f172a;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-notif-text {
    font-size: var(--dk-fs-12);
    color: #64748b;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-notif-date {
    font-size: var(--dk-fs-11);
    color: #94a3b8;
    margin-top: 2px;
}
.dk-notif-dot {
    width: 7px;
    height: 7px;
    background: #f97316;
    border-radius: 50%;
    flex-shrink: 0;
    margin-top: 6px;
}
.dk-spin {
    display: inline-block;
    animation: dk-spin 0.8s linear infinite;
}
@keyframes dk-spin {
    to {
        transform: rotate(360deg);
    }
}

/* ─── Избранное — модалка топбара (2026-09-15) ─────────────────────────────── */
.dk-fav-add-row {
    display: flex;
    gap: 8px;
}
.dk-fav-add-row .dk-input {
    flex: 1;
    min-width: 0;
}
.dk-fav-list {
    max-height: 340px;
    overflow-y: auto;
}
.dk-fav-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 4px;
    border-bottom: 1px solid #f1f5f9;
}
.dk-fav-item:last-child {
    border-bottom: none;
}
.dk-fav-item-link {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 8px;
    text-decoration: none;
    color: #1e293b;
}
.dk-fav-item-link:hover .dk-fav-item-title {
    text-decoration: underline;
}
.dk-fav-item-icon {
    font-size: var(--dk-fs-13);
    color: #f59e0b;
    flex-shrink: 0;
}
.dk-fav-item-title {
    font-size: var(--dk-fs-13);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-fav-item-del {
    flex-shrink: 0;
    width: 26px;
    height: 26px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: none;
    border: none;
    border-radius: 6px;
    color: #94a3b8;
    cursor: pointer;
    font-size: var(--dk-fs-12);
}
.dk-fav-item-del:hover {
    background: #fef2f2;
    color: #ef4444;
}

/* ─── "Дела" (Todos) — панель у колокольчика ────────────────────────────────── */
.dk-todo-wrap {
    position: relative;
}
.dk-todo-panel {
    position: absolute;
    top: calc(100% + 8px);
    right: 0;
    width: 380px;
    max-height: 560px;
    background: var(--dk-surface);
    border: 1px solid #e2e8f0;
    border-radius: 12px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
    z-index: 9000;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
.dk-todo-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 16px;
    border-bottom: 1px solid #f1f5f9;
    font-weight: 600;
    font-size: var(--dk-fs-14);
    color: #0f172a;
    flex-shrink: 0;
}
.dk-todo-head-title {
    display: flex;
    align-items: center;
    gap: 8px;
}
.dk-todo-count {
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-size: var(--dk-fs-11);
    font-weight: 700;
    border-radius: 20px;
    padding: 1px 8px;
}
.dk-todo-add-btn {
    width: 26px;
    height: 26px;
    border-radius: 7px;
    border: none;
    background: var(--dk-accent);
    color: #fff;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-16);
    cursor: pointer;
}
.dk-todo-add-btn:hover {
    background: var(--dk-accent-hover);
}
.dk-todo-quickadd {
    padding: 8px 12px;
    border-bottom: 1px solid #f1f5f9;
}
.dk-todo-quickadd input {
    width: 100%;
    border: 1px dashed var(--dk-border);
    border-radius: 8px;
    padding: 7px 10px;
    font-size: var(--dk-fs-13);
    outline: none;
    font-family: var(--dk-font);
}
.dk-todo-quickadd input:focus {
    border-color: var(--dk-accent);
    border-style: solid;
}
.dk-todo-tabs {
    display: flex;
    gap: 4px;
    padding: 8px 12px 4px;
    flex-shrink: 0;
}
.dk-todo-tab {
    border: none;
    background: #f4f4f5;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11-5);
    font-weight: 500;
    padding: 4px 10px;
    border-radius: 20px;
    cursor: pointer;
}
.dk-todo-tab.active {
    background: var(--dk-accent);
    color: #fff;
}
.dk-todo-list {
    overflow-y: auto;
    flex: 1;
    padding: 4px 6px 10px;
}
.dk-todo-loading,
.dk-todo-empty {
    padding: 28px 16px;
    text-align: center;
    color: #94a3b8;
    font-size: var(--dk-fs-13);
}
.dk-todo-item {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    padding: 8px 10px;
    border-radius: 8px;
    cursor: pointer;
}
.dk-todo-item:hover {
    background: var(--dk-bg-row-hover);
}
/* Кнопка быстрого статуса дела (Новый/Делаю/Сделал, dict todos.status,
   миграция 060) -- иконка+цвет приходят с сервера (status_icon/status_color),
   передаются через --dk-todo-status-color. Клик -- цикл на следующий статус
   (см. STATUS_CYCLE в js/doka.js и views/v_client.php). */
.dk-todo-check {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    border: 2px solid var(--dk-todo-status-color, var(--dk-border));
    margin-top: 1px;
    flex-shrink: 0;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--dk-surface);
    font-size: var(--dk-fs-11);
    color: var(--dk-todo-status-color, var(--dk-text-light));
    padding: 0;
    transition: transform 0.1s;
}
.dk-todo-check:hover {
    transform: scale(1.12);
}
.dk-todo-check:disabled {
    cursor: default;
}
.dk-todo-check:disabled:hover {
    transform: none;
}
.dk-todo-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    margin-top: 6px;
    flex-shrink: 0;
}
.dk-todo-body {
    flex: 1;
    min-width: 0;
}
.dk-todo-title {
    font-size: var(--dk-fs-13-5);
    color: var(--dk-text);
    line-height: 1.3;
}
.dk-todo-item.done .dk-todo-title {
    text-decoration: line-through;
    color: var(--dk-text-light);
}
.dk-todo-descr-icon {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    margin-left: 5px;
    vertical-align: 1px;
}
.dk-todo-descr {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    line-height: 1.4;
    margin-top: 2px;
    cursor: pointer;
    /* Превью -- строгий plain text (см. descrBlock() в v_todos.php/v_client.php/
       v_profile.php), одна строка с многоточием -- заголовки/жирный/большие
       буквы из описания больше не рендерятся тут и не ломают высоту строки. */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-todo-item.done .dk-todo-descr {
    color: var(--dk-text-light);
}
/* Свёрнутое описание в общей панели "Дела" -- 1 строка с многоточием, клик
   разворачивает (см. js/doka.js renderList()). На вкладке "Дела" клиента этот
   collapsed-класс не используется -- там описание всегда развёрнуто. */
.dk-todo-descr.collapsed {
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: normal;
}
/* Бейдж списка (TodoLists, миграция 085) в самой карточке дела -- сразу под
   описанием (см. listBadge() в v_todos.php), отдельно от .dk-todo-meta
   (due/who/ref/remind), т.к. это "к какому списку относится", а не срок. */
.dk-todo-list-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-top: 4px;
    padding: 1px 8px;
    border-radius: 10px;
    background: var(--dk-border-light);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11);
}
.dk-todo-item.done .dk-todo-list-chip {
    color: var(--dk-text-light);
}
.dk-todo-meta {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 3px;
    flex-wrap: wrap;
}
.dk-todo-due {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    display: inline-flex;
    align-items: center;
    gap: 3px;
}
.dk-todo-due.overdue {
    color: var(--dk-danger);
    font-weight: 600;
}
.dk-todo-due.today {
    color: var(--dk-accent);
    font-weight: 600;
}
.dk-todo-remind {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    display: inline-flex;
    align-items: center;
    gap: 3px;
}
.dk-todo-who {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.dk-todo-mini-avatar {
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--dk-sidebar-bg);
    color: #fff;
    font-size: var(--dk-fs-8);
    font-weight: 700;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.dk-todo-ref {
    font-size: var(--dk-fs-11);
    color: var(--dk-accent);
    display: inline-flex;
    align-items: center;
    gap: 3px;
    text-decoration: none;
}
.dk-todo-ref:hover {
    text-decoration: underline;
}
.dk-todo-actions {
    display: none;
    gap: 4px;
    margin-left: auto;
    flex-shrink: 0;
}
.dk-todo-item:hover .dk-todo-actions {
    display: flex;
}
.dk-todo-actions button {
    border: none;
    background: none;
    color: var(--dk-text-light);
    cursor: pointer;
    padding: 2px;
    font-size: var(--dk-fs-13);
}
.dk-todo-actions button:hover {
    color: var(--dk-accent);
}
/* Ссылка "Больше" внизу общей панели "Дела" -- показывается, когда в текущем
   табе больше PANEL_LIMIT (10) дел, ведёт на полную страницу /profile?tab=todos
   с пейджингом (см. js/doka.js renderList(), views/v_profile.php). */
.dk-todo-more {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    padding: 10px;
    margin-top: 4px;
    font-size: var(--dk-fs-12-5);
    font-weight: 600;
    color: var(--dk-accent);
    text-decoration: none;
    border-top: 1px solid var(--dk-border);
}
.dk-todo-more:hover {
    text-decoration: underline;
}
.dk-todo-color-row {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
.dk-todo-color {
    width: 24px;
    height: 24px;
    border-radius: 50%;
    border: 2px solid transparent;
    cursor: pointer;
    transition: transform 0.1s, border-color 0.1s;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: var(--dk-fs-12);
}
.dk-todo-color:hover {
    transform: scale(1.15);
}
.dk-todo-color.selected {
    border-color: var(--dk-text);
    box-shadow: 0 0 0 2px #fff inset;
}

/* Пикер быстрого статуса в модалке "Дела" (Новый/Делаю/Сделал) -- сегментный
   ряд пилюль, источник данных Dict::list('todos','status') (views/v_footer.php). */
.dk-todo-status-row {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
.dk-todo-status-opt {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 6px 12px;
    border-radius: 20px;
    border: 1.5px solid var(--dk-border);
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: border-color 0.1s, color 0.1s;
}
.dk-todo-status-opt i {
    color: var(--dk-todo-status-color, inherit);
}
.dk-todo-status-opt:hover {
    border-color: var(--dk-todo-status-color);
}
.dk-todo-status-opt.selected {
    border-color: var(--dk-todo-status-color);
    color: var(--dk-text);
    font-weight: 600;
    box-shadow: inset 0 0 0 1px var(--dk-todo-status-color);
}

/* Списки дел (TodoLists, миграция 085) -- бейджи иконка+название+счётчик над
   списком во вкладке "Мой" на /todos, клик фильтрует; "+" открывает модалку
   создания. Действия (правка/удаление) появляются при наведении, как у
   .dk-sidebar-file-actions (файловая библиотека) -- тот же UX-паттерн. */
.dk-todo-lists-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-bottom: 14px;
}
.dk-todo-list-badge {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 10px 6px 12px;
    border-radius: 20px;
    border: 1.5px solid var(--dk-border);
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-muted);
    background: var(--dk-surface);
    cursor: pointer;
    user-select: none;
    transition: border-color 0.1s, color 0.1s;
}
.dk-todo-list-badge:hover {
    border-color: var(--dk-accent);
    color: var(--dk-text);
}
.dk-todo-list-badge.active {
    border-color: var(--dk-accent);
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-weight: 600;
}
.dk-todo-list-count {
    font-size: var(--dk-fs-11);
    padding: 1px 7px;
    border-radius: 10px;
    background: var(--dk-border-light);
    color: var(--dk-text-muted);
}
.dk-todo-list-badge.active .dk-todo-list-count {
    background: rgba(235, 93, 30, 0.15);
    color: var(--dk-accent);
}
.dk-todo-list-badge-actions {
    display: none;
    align-items: center;
    gap: 2px;
    margin-left: 2px;
}
.dk-todo-list-badge:hover .dk-todo-list-badge-actions {
    display: inline-flex;
}
.dk-todo-list-badge-actions button {
    border: none;
    background: transparent;
    padding: 2px 4px;
    line-height: 1;
    font-size: var(--dk-fs-12);
    color: var(--dk-text-light);
    border-radius: 4px;
    cursor: pointer;
}
.dk-todo-list-badge-actions button:hover {
    color: var(--dk-text);
    background: var(--dk-border-light);
}
.dk-todo-list-add {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 6px 12px;
    border-radius: 20px;
    border: 1.5px dashed var(--dk-border);
    background: transparent;
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: border-color 0.1s, color 0.1s;
}
.dk-todo-list-add:hover {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
}

/* Пикер иконки в модалке создания/правки списка (TodoLists) -- сетка Bootstrap
   Icons из белого списка TodoLists::ALLOWED_ICONS, тот же паттерн, что и
   .dk-todo-color выше (клик -- выбор, .selected -- подсветка рамкой). */
.dk-todo-icon-row {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    max-height: 168px;
    overflow-y: auto;
    padding: 2px;
}
.dk-todo-icon-opt {
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    border: 1.5px solid var(--dk-border);
    font-size: var(--dk-fs-16);
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: border-color 0.1s, color 0.1s, background 0.1s;
}
.dk-todo-icon-opt:hover {
    border-color: var(--dk-accent);
    color: var(--dk-text);
}
.dk-todo-icon-opt.selected {
    border-color: var(--dk-accent);
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
}

/* ─── TinyMCE: убрать синий outline, фирменная рамка при фокусе ─────────────── */
.tox-tinymce {
    border-radius: 6px !important;
    border-color: #dee2e6 !important;
}
.tox-tinymce:focus-within {
    outline: none !important;
    border-color: #f97316 !important;
    box-shadow: 0 0 0 3px rgba(249, 115, 22, 0.15) !important;
}
.tox-tinymce iframe {
    outline: none !important;
}

/* ─── Комментарий: кнопка редактировать + метка изменён + ответить ─────────── */
.dk-cm-edit-btn {
    opacity: 0;
    transition: opacity 0.15s;
}
.dk-comment-item:hover .dk-cm-edit-btn {
    opacity: 1;
}
.dk-cm-reply-btn {
    font-size: var(--dk-fs-12);
    padding: 3px 8px;
    gap: 4px;
    border: 1px solid #cbd5e1;
    border-radius: 5px;
    background: #f8fafc;
    color: #475569;
    margin-top: 4px;
    transition: background 0.15s, color 0.15s;
}
.dk-cm-reply-btn:hover {
    background: #e0f2fe;
    color: #0369a1;
    border-color: #93c5fd;
}
.dk-cm-reply-btn i {
    font-size: var(--dk-fs-13);
}
.dk-comment-edited {
    font-size: var(--dk-fs-11);
    color: #94a3b8;
    margin-left: 4px;
}

/* ─── Клиенты: карточки ────────────────────────────────────────────────────── */
.dk-client-card {
    display: block;
    background: var(--dk-surface);
    border-radius: var(--dk-radius-lg);
    border: 1px solid var(--dk-border);
    padding: 16px;
    transition:
        box-shadow 0.15s,
        border-color 0.15s;
    color: var(--dk-text);
}
.dk-client-card:hover {
    box-shadow: var(--dk-shadow-sm);
    border-color: var(--dk-accent-light);
    color: var(--dk-text);
}
.dk-client-card-head {
    display: flex;
    align-items: center;
    gap: 10px;
    overflow: hidden;
    margin-bottom: 8px;
}
.dk-client-badge {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    border-radius: var(--dk-radius);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-16);
}
.dk-client-badge-logo {
    background: var(--dk-bg-secondary);
    overflow: hidden;
    padding: 2px;
}
.dk-client-badge-img {
    width: 100%;
    height: 100%;
    object-fit: contain;
    border-radius: calc(var(--dk-radius) - 2px);
}
.dk-client-meta {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.dk-client-name {
    font-size: var(--dk-fs-14);
    font-weight: 600;
    color: var(--dk-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-client-code {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
}
.dk-client-category-chip {
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-11);
    font-weight: 500;
}
.dk-client-contacts {
    display: flex;
    flex-direction: column;
    gap: 3px;
    margin-top: 4px;
}
.dk-client-contact-item {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-client-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 6px;
}
.dk-client-tag-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 7px;
    border-radius: 10px;
    font-size: var(--dk-fs-11);
    font-weight: 500;
    line-height: 1.4;
}
.dk-client-footer {
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px solid var(--dk-border);
}

/* ─── Клиенты: тип-радио ────────────────────────────────────────────────────── */
.dk-type-radio {
    cursor: pointer;
    position: relative;
}
.dk-type-radio input[type="radio"] {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
}
.dk-type-radio-label {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 8px 12px;
    border-radius: var(--dk-radius);
    border: 1px solid var(--dk-border);
    background: var(--dk-bg-sidebar);
    font-size: var(--dk-fs-13);
    font-weight: 500;
    color: var(--dk-text-muted);
    transition: all 0.15s;
}
.dk-type-radio input[type="radio"]:checked + .dk-type-radio-label {
    border-color: var(--dk-accent);
    background: var(--dk-accent);
    color: #fff;
}

/* ─── Клиенты: счётчик / фильтры ───────────────────────────────────────────── */
.dk-count-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 22px;
    padding: 0 6px;
    border-radius: 11px;
    background: var(--dk-bg-sidebar);
    border: 1px solid var(--dk-border);
    font-size: var(--dk-fs-12);
    font-weight: 600;
    color: var(--dk-text-muted);
    vertical-align: middle;
}
.dk-filter-bar {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 10px 14px;
}
.dk-filter-select {
    max-width: 200px;
}

/* ─── dk-sel внутри модалки / формы ──────────────────────────── */
.modal .dk-sel-panel {
    z-index: 1100;
    width: 100%;
}
.dk-sel-trigger-wrap .dk-sel-trigger {
    max-width: none;
    color: var(--dk-text);
}
.dk-sel-trigger-wrap .dk-sel-trigger.dk-sel-placeholder {
    color: var(--dk-text-muted);
}

/* ─── Клиент: профиль заголовок ──────────────────────────────────────────── */
.dk-client-profile-header {
    display: flex;
    align-items: center;
    gap: 14px;
}
.dk-client-profile-badge {
    flex-shrink: 0;
    width: 48px;
    height: 48px;
    border-radius: var(--dk-radius-lg);
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-22);
}
.dk-client-profile-title {
    font-size: var(--dk-fs-20);
    font-weight: 700;
    color: var(--dk-text);
    line-height: 1.2;
}
.dk-client-form .dk-card {
    border-radius: var(--dk-radius-lg);
}
.fw-500 {
    font-weight: 500;
}

/* ─── Клиент: логотип ───────────────────────────────────────────────────────── */
.dk-client-logo-wrap {
    position: relative;
    flex-shrink: 0;
    cursor: pointer;
    border-radius: var(--dk-radius-lg);
    overflow: hidden;
    width: 48px;
    height: 48px;
}
.dk-client-logo-wrap:hover .dk-client-logo-overlay {
    opacity: 1;
}
.dk-client-logo-overlay {
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, 0.45);
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: var(--dk-fs-16);
    opacity: 0;
    transition: opacity 0.15s;
    border-radius: var(--dk-radius-lg);
}
.dk-client-logo-img {
    width: 48px;
    height: 48px;
    object-fit: cover;
    border-radius: var(--dk-radius-lg);
    display: block;
}
.dk-logo-uploading {
    opacity: 0.5;
    pointer-events: none;
}

/* ── Payment terms table (client profile) ───────────────────── */
.dk-pt-table {
    font-size: var(--dk-fs-14);
    margin-bottom: 0;
}
.dk-pt-table thead th {
    font-weight: 600;
    font-size: var(--dk-fs-12);
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--dk-text-muted);
    border-bottom: 1px solid var(--dk-border);
    padding: .5rem .5rem;
}
.dk-pt-table tbody td {
    padding: .35rem .5rem;
    vertical-align: middle;
}
.dk-pt-table .form-control-sm,
.dk-pt-table .form-select-sm {
    font-size: var(--dk-fs-13);
}
.dk-pt-del {
    padding: .2rem .35rem;
    line-height: 1;
}

/* ── Funnel bar (deals) ─────────────────────────────────────── */
.dk-funnel-bar {
    display: flex;
    height: 36px;
    border-radius: var(--dk-radius);
    overflow: hidden;
    gap: 2px;
}
.dk-funnel-stage {
    position: relative;
    min-width: 40px;
    cursor: default;
}
.dk-funnel-fill {
    position: absolute;
    inset: 0;
    opacity: 0.18;
}
.dk-funnel-label {
    position: relative;
    display: flex;
    align-items: center;
    height: 100%;
    padding: 0 10px;
    font-size: 0.8rem;
    color: var(--dk-text);
    white-space: nowrap;
    overflow: hidden;
}

/* Bootstrap modal animation fix */
.modal.show .modal-dialog {
    transform: none !important;
}

/* ── DEALS KANBAN ─────────────────────────────────────────────── */
.dk-deals-kanban {
    display: flex;
    gap: 10px;
    overflow-x: auto;
    padding-bottom: 16px;
    align-items: flex-start;
    min-height: 60vh;
}
.dk-deals-col {
    flex: 0 0 230px;
    min-width: 230px;
    background: var(--dk-bg);
    border-radius: 8px;
    border: 1px solid var(--dk-border-light);
    display: flex;
    flex-direction: column;
}
.dk-deals-col-header {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 8px 10px 7px;
    border-radius: 8px 8px 0 0;
    border-bottom: 2px solid var(--dk-border-light);
    cursor: default;
}
.dk-deals-col-title {
    font-size: var(--dk-fs-11);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    flex: 1;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-deals-col-count {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    background: rgba(0,0,0,0.12);
    border-radius: 10px;
    padding: 1px 7px;
    color: inherit;
    opacity: 0.85;
}
.dk-deals-col-cards {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 8px;
    flex: 1;
    min-height: 60px;
}
.dk-deals-col-empty {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    text-align: center;
    padding: 12px 0 4px;
    opacity: 0.6;
}
/* ── DEALS KANBAN CARD ────────────────────────────────────────── */
.dk-deal-card {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border-light);
    border-radius: 6px;
    padding: 8px 10px;
    display: flex;
    flex-direction: column;
    gap: 5px;
    transition: box-shadow 0.15s, border-color 0.15s, opacity 0.15s;
    position: relative;
}
.dk-deal-card:hover {
    border-color: var(--dk-border);
    box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
/* ── DEAL CARD BADGE ──────────────────────────────────────────── */
.dk-deal-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: var(--dk-fs-10);
    font-weight: 600;
    padding: 2px 7px;
    border-radius: 10px;
    color: #fff;
    letter-spacing: 0.02em;
    line-height: 1.4;
    align-self: flex-start;
}
/* ── DEAL CARD BADGE BAR ──────────────────────────────────────── */
.dk-badge-bar {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 4px 0 2px;
    flex-wrap: wrap;
}
.dk-badge-btn {
    width: 26px;
    height: 26px;
    border-radius: 6px;
    border: 1.5px solid transparent;
    background: var(--dk-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    font-size: var(--dk-fs-13);
    transition: background 0.12s, border-color 0.12s;
    color: var(--dk-text-muted);
    padding: 0;
}
.dk-badge-btn:hover {
    background: var(--dk-border-light);
    color: var(--dk-text);
}
.dk-badge-btn.active {
    border-color: var(--badge-color, var(--dk-primary));
    color: var(--badge-color, var(--dk-primary));
    background: color-mix(in srgb, var(--badge-color, var(--dk-primary)) 10%, transparent);
}
.dk-badge-btn-clear {
    color: var(--dk-text-muted);
    margin-left: 2px;
}
/* ── DEAL CARD QACTION TAGS ───────────────────────────────────── */
.dk-deal-qtags {
    display: flex;
    gap: 3px;
    flex-wrap: wrap;
}
.dk-deal-qtag {
    width: 20px;
    height: 20px;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-10);
    color: #fff;
    flex-shrink: 0;
}
/* ── DEAL CARD TITLE ROW ──────────────────────────────────────── */
.dk-deal-card-title-row {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 4px;
}
.dk-deal-card-title {
    font-size: var(--dk-fs-12);
    font-weight: 500;
    line-height: 1.35;
    color: var(--dk-text);
    text-decoration: none;
    flex: 1;
    min-width: 0;
}
.dk-deal-card-title:hover {
    color: var(--dk-primary);
}
.dk-deal-menu-btn {
    width: 22px;
    height: 22px;
    border: none;
    background: transparent;
    color: var(--dk-text-muted);
    cursor: pointer;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-14);
    flex-shrink: 0;
    padding: 0;
    transition: background 0.12s;
}
.dk-deal-menu-btn:hover {
    background: var(--dk-border-light);
    color: var(--dk-text);
}
/* ── DEAL CARD META ───────────────────────────────────────────── */
.dk-deal-card-meta {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-muted);
    display: flex;
    align-items: center;
    gap: 4px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-deal-card-meta i {
    font-size: var(--dk-fs-10);
    flex-shrink: 0;
    opacity: 0.6;
}
.dk-deal-card-amount {
    font-size: var(--dk-fs-11);
    font-weight: 600;
    color: var(--dk-success);
    display: flex;
    align-items: center;
    gap: 4px;
}
/* ── DEAL CARD FOOTER ─────────────────────────────────────────── */
.dk-deal-card-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 4px;
    padding-top: 4px;
    border-top: 1px solid var(--dk-border-light);
    margin-top: 2px;
}
.dk-deal-nav-btn {
    width: 28px;
    height: 24px;
    border: 1px solid var(--dk-border-light);
    background: var(--dk-bg);
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-11);
    cursor: pointer;
    color: var(--dk-text-muted);
    transition: all 0.12s;
    padding: 0;
}
.dk-deal-nav-btn:hover:not(:disabled) {
    background: var(--dk-primary);
    border-color: var(--dk-primary);
    color: #fff;
}
.dk-deal-nav-btn:disabled {
    opacity: 0.3;
    cursor: default;
}
.dk-deal-qaction-btn {
    flex: 1;
    height: 24px;
    border: 1px solid var(--dk-border-light);
    background: var(--dk-bg);
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
    font-size: var(--dk-fs-10);
    font-weight: 600;
    cursor: pointer;
    color: var(--dk-text-muted);
    transition: all 0.12s;
    padding: 0 6px;
}
.dk-deal-qaction-btn:hover {
    background: #f59e0b;
    border-color: #f59e0b;
    color: #fff;
}
/* ── QUICK ACTION MODAL BUTTONS ───────────────────────────────── */
.dk-qa-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 14px;
    border-radius: 6px;
    font-size: var(--dk-fs-13);
    font-weight: 500;
    border: none;
    cursor: pointer;
    color: #fff;
    transition: opacity 0.12s;
}
.dk-qa-btn:hover { opacity: 0.88; }
.dk-qa-btn-active {
    outline: 2px solid var(--dk-text);
    outline-offset: 2px;
}
.dk-qa-btn-self {
    background: var(--dk-primary) !important;
    color: #fff !important;
    border: none !important;
}
.dk-deals-add-btn {
    width: 100%;
    padding: 5px 10px;
    border: 1px dashed var(--dk-border);
    background: transparent;
    border-radius: 5px;
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
    cursor: pointer;
    text-align: left;
    transition: all 0.12s;
}
.dk-deals-add-btn:hover {
    border-color: var(--dk-primary);
    color: var(--dk-primary);
    background: color-mix(in srgb, var(--dk-primary) 5%, transparent);
}
/* ── DEALS KANBAN RESPONSIVE ──────────────────────────────────── */
@media (max-width: 575px) {
    .dk-deals-col { flex: 0 0 200px; min-width: 200px; }
}
/* ── List rows (универсальные строки списка, напр. сделки в карточке) ── */
.dk-list-row {
    border-bottom: 1px solid var(--dk-border-light);
    transition: background .1s;
}
.dk-list-row:last-child { border-bottom: none; }
.dk-list-row:hover { background: var(--dk-bg-hover); }

/* ── LEADS LIST — используют .dk-client-card (см. v_leads.php) —— */

/* ── DEAL STAGE DROPUP ────────────────────────────────────────── */
.dk-stage-wrap {
    position: relative;
    flex: 1;
}
.dk-stage-btn {
    width: 100%;
    height: 24px;
    border: 1px solid var(--dk-border-light);
    background: var(--dk-bg);
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
    font-size: var(--dk-fs-11-5);
    font-weight: 600;
    cursor: pointer;
    color: var(--dk-text-muted);
    transition: all 0.12s;
    padding: 0 6px;
    white-space: nowrap;
    overflow: hidden;
}
.dk-stage-btn:hover {
    background: var(--dk-bg-hover);
    border-color: var(--dk-border);
    color: var(--dk-text);
}
.dk-stage-btn i.dk-stage-icon { font-size: var(--dk-fs-11); }
.dk-stage-btn .dk-stage-arrow {
    font-size: var(--dk-fs-9);
    margin-left: auto;
    opacity: .5;
    flex-shrink: 0;
}
.dk-stage-drop {
    position: absolute;
    bottom: calc(100% + 4px);
    left: 0;
    right: 0;
    min-width: 170px;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 6px;
    box-shadow: 0 4px 16px rgba(0,0,0,0.13);
    z-index: 200;
    padding: 4px;
    display: none;
}
.dk-stage-drop.open { display: block; }
.dk-stage-opt {
    display: flex;
    align-items: center;
    gap: 7px;
    width: 100%;
    padding: 5px 8px;
    border: none;
    background: none;
    border-radius: 4px;
    cursor: pointer;
    font-size: var(--dk-fs-12);
    text-align: left;
    color: var(--dk-text);
    transition: background .1s;
    white-space: nowrap;
}
.dk-stage-opt:hover:not(.current) { background: var(--dk-bg); }
.dk-stage-opt.current {
    font-weight: 700;
    cursor: default;
    background: var(--dk-bg);
}
.dk-stage-opt i { font-size: var(--dk-fs-12); flex-shrink: 0; }
.dk-stage-opt .dk-stage-check {
    margin-left: auto;
    font-size: var(--dk-fs-10);
    opacity: .6;
}

/* ── Deal Search Modal ────────────────────────────────────────── */
.dk-deal-search-dialog { max-width: 820px; }
.dk-deal-search-header {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 16px 20px 12px;
    border-bottom: 1px solid var(--dk-border);
}
.dk-deal-search-header .dk-search-wrap { flex: 1; }
.dk-deal-search-body {
    display: flex;
    min-height: 440px;
    max-height: 60vh;
    overflow: hidden;
}
.dk-deal-search-list {
    width: 340px;
    flex-shrink: 0;
    border-right: 1px solid var(--dk-border);
    overflow-y: auto;
    padding: 8px 0;
}
.dk-deal-search-hint {
    padding: 40px 20px;
    text-align: center;
    color: var(--dk-muted);
    font-size: var(--dk-fs-13);
}
.dk-deal-search-item {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 10px 16px;
    cursor: pointer;
    transition: background .1s;
    border-radius: 0;
    border: none;
    background: none;
    width: 100%;
    text-align: left;
}
.dk-deal-search-item:hover { background: var(--dk-bg); }
.dk-deal-search-item.active { background: var(--dk-accent-pale, #f0f4ff); }
.dk-deal-search-item-icon {
    width: 32px;
    height: 32px;
    border-radius: 6px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    font-size: var(--dk-fs-14);
    color: #fff;
}
.dk-deal-search-item-body { flex: 1; min-width: 0; }
.dk-deal-search-item-title {
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: var(--dk-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-deal-search-item-meta {
    font-size: var(--dk-fs-11);
    color: var(--dk-muted);
    margin-top: 2px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.dk-deal-search-preview {
    flex: 1;
    overflow-y: auto;
    padding: 24px;
}
.dk-deal-search-preview-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100%;
    color: var(--dk-muted);
    font-size: var(--dk-fs-13);
}
.dk-dsrp-title {
    font-size: var(--dk-fs-20);
    font-weight: 700;
    color: var(--dk-text);
    margin-bottom: 12px;
    line-height: 1.3;
}
.dk-dsrp-status {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 3px 10px;
    border-radius: 20px;
    font-size: var(--dk-fs-12);
    font-weight: 600;
    color: #fff;
    margin-bottom: 16px;
}
.dk-dsrp-row {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 7px 0;
    border-bottom: 1px solid var(--dk-border);
    font-size: var(--dk-fs-13);
}
.dk-dsrp-row:last-child { border-bottom: none; }
.dk-dsrp-row-label {
    width: 110px;
    flex-shrink: 0;
    color: var(--dk-muted);
    font-size: var(--dk-fs-12);
    padding-top: 1px;
}
.dk-dsrp-row-value { color: var(--dk-text); }
.dk-dsrp-open-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 20px;
    padding: 8px 18px;
    border-radius: 6px;
    background: var(--dk-accent);
    color: #fff;
    font-size: var(--dk-fs-13);
    font-weight: 600;
    text-decoration: none;
    border: none;
    cursor: pointer;
    transition: opacity .15s;
}
.dk-dsrp-open-btn:hover { opacity: .88; color: #fff; }

/* Кнопка «Поиск» в filter-bar */
.dk-btn-search-global {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 14px;
    border-radius: 6px;
    border: 1px solid var(--dk-border);
    background: var(--dk-surface);
    color: var(--dk-text);
    font-size: var(--dk-fs-13);
    cursor: pointer;
    white-space: nowrap;
    transition: border-color .15s, background .15s;
}
.dk-btn-search-global:hover {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
}


/* -- TASK LIST FILTER BAR ------------------------------------------ */
.dk-tasklist-filterbar {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 10px;
}
.dk-tasklist-search-wrap {
    position: relative;
    display: flex;
    align-items: center;
}
.dk-tasklist-search-wrap > .bi {
    position: absolute;
    left: 10px;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
    pointer-events: none;
}
.dk-tasklist-search-input {
    padding: 7px 12px 7px 33px;
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    background: var(--dk-surface);
    color: var(--dk-text);
    font-size: var(--dk-fs-14);
    width: 230px;
    outline: none;
    transition: border-color 0.15s, box-shadow 0.15s;
}
.dk-tasklist-search-input:focus {
    border-color: var(--dk-accent);
    box-shadow: 0 0 0 3px var(--dk-accent-dim);
}
.dk-tasklist-chips {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
}
.dk-tasklist-chip {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 5px 13px;
    border: 1px solid var(--dk-border);
    border-radius: 20px;
    background: var(--dk-surface);
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
    cursor: pointer;
    transition: all 0.15s;
    white-space: nowrap;
}
.dk-tasklist-chip:hover {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
}
.dk-tasklist-chip.active {
    background: var(--fchip-color, var(--dk-accent));
    border-color: var(--fchip-color, var(--dk-accent));
    color: #fff;
    font-weight: 500;
}
.dk-tasklist-chip:first-child.active {
    background: var(--dk-accent);
    border-color: var(--dk-accent);
}
.dk-tasklist-count {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    margin-left: auto;
}

/* -- Chip num badge + Closed tasks button ------------------------------ */
.dk-tasklist-chip-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: rgba(0,0,0,.09);
    border-radius: 10px;
    padding: 0 6px;
    font-size: var(--dk-fs-11);
    font-weight: 600;
    min-width: 18px;
    line-height: 18px;
}
.dk-tasklist-chip.active .dk-tasklist-chip-num {
    background: rgba(255,255,255,.25);
}
.dk-closed-load-btn {
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    border: 1px dashed var(--dk-border);
    padding: 6px 18px;
    border-radius: var(--dk-radius);
    background: transparent;
    cursor: pointer;
    transition: all 0.15s;
}
.dk-closed-load-btn:hover {
    border-color: var(--dk-accent);
    color: var(--dk-accent);
    background: var(--dk-accent-dim);
}

/* ══════════════════════════════════════════════════════════════
   СПРАВКА (/help) — фирменная подсветка пункта сайдбара, тот же
   паттерн, что у Reports: иконка всегда цветная (не только hover/active).
   ══════════════════════════════════════════════════════════════ */
.dk-nav-help .dk-nav-icon {
    color: var(--dk-accent);
    opacity: 1;
}
.dk-nav-help:hover {
    background: var(--dk-accent-dim);
    color: var(--dk-sidebar-text-hover);
}

/* ══════════════════════════════════════════════════════════════
   ОТЧЁТЫ (Reports) — фирменный синий, маркирует весь модуль
   ══════════════════════════════════════════════════════════════ */
.dk-btn-report {
    background: var(--dk-report);
    color: var(--dk-white);
}
.dk-btn-report:hover {
    background: var(--dk-report-hover);
    color: var(--dk-white);
}

.dk-nav-reports .dk-nav-icon {
    color: var(--dk-report);
    opacity: 1;
}
.dk-nav-reports.active {
    background: var(--dk-report-dim);
    color: var(--dk-report);
}

.dk-report-title i {
    color: var(--dk-report);
}

.dk-report-back {
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-13);
    color: var(--dk-text-muted);
    text-decoration: none;
}
.dk-report-back:hover {
    color: var(--dk-report);
}

.dk-report-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 14px;
}
.dk-report-card {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 16px;
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    background: var(--dk-surface);
    text-decoration: none;
    color: var(--dk-text);
    transition: all 0.15s;
}
.dk-report-card:hover {
    border-color: var(--dk-report);
    box-shadow: var(--dk-shadow-sm);
    color: var(--dk-text);
}
.dk-report-card-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    min-width: 44px;
    border-radius: var(--dk-radius);
    background: var(--dk-report-dim);
    color: var(--dk-report);
    font-size: var(--dk-fs-20);
}
.dk-report-card-body {
    min-width: 0;
    flex-grow: 1;
}
.dk-report-card-title {
    font-weight: 600;
    font-size: var(--dk-fs-14);
}
.dk-report-card-descr {
    font-size: var(--dk-fs-12-5);
    color: var(--dk-text-muted);
    margin-top: 2px;
}
.dk-report-card-arrow {
    color: var(--dk-text-light);
    flex-shrink: 0;
}

.dk-report-table {
    margin-top: 4px;
}

/* ── Оверлей смены статуса на канбане (быстрый дропдаун статуса на карточке) ──
   Показывается на время POST-запроса, чтобы на медленных соединениях не
   казалось, что клик не сработал — см. dkKanbanMoveStatus() в v_index_kanban.php. */
.dk-status-busy-overlay {
    position: fixed;
    inset: 0;
    background: rgba(17, 17, 24, 0.35);
    display: none;
    align-items: center;
    justify-content: center;
    z-index: 1080;
}
.dk-status-busy-overlay.show {
    display: flex;
}
.dk-status-busy-card {
    display: flex;
    align-items: center;
    gap: 12px;
    background: var(--dk-surface);
    border-radius: 12px;
    padding: 18px 26px;
    box-shadow: var(--dk-shadow-md);
    font-size: var(--dk-fs-14);
    font-weight: 500;
    color: var(--dk-text);
}
.dk-status-busy-card i {
    font-size: var(--dk-fs-18);
    color: var(--dk-primary);
}

/* ── Пункт "+ Создать подпроект" внутри дропдауна подпроекта на карточке
   задачи (см. modalQuickSubproject в v_task.php) — визуально отделён от
   обычных .dk-sel-opt верхней границей и акцентным цветом. */
.dk-sel-create {
    padding: 8px 14px;
    font-size: var(--dk-fs-13-5);
    color: var(--dk-primary);
    font-weight: 500;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 8px;
    border-top: 1px solid var(--dk-border-light);
    transition: background 0.1s;
}
.dk-sel-create:hover {
    background: var(--dk-accent-dim);
}

/* ── Связанные (блокирующие) задачи -- см. app/classes/TaskLinks.php ──
   Триггер "Связать задачи" в конце строки 2 мета-бара + список блокеров
   между мета-баром и описанием + результаты поиска в модалке. */
.dk-task-link-trigger {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: var(--dk-fs-13);
    font-weight: 400;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--dk-text-muted);
    cursor: pointer;
    transition: color 0.15s;
    white-space: nowrap;
}
.dk-task-link-trigger i {
    font-size: var(--dk-fs-13);
}
.dk-task-link-trigger:hover {
    color: var(--dk-accent);
}

/* Напомнить (задача) -- бейдж-счётчик уже привязанных напоминаний (Todos,
   ref_type=task, сессия 62+). Подсветка триггера + числовая пилюля, см.
   views/v_task.php (dkTaskRemindTrigger/dkTaskRemindCount). */
.dk-task-remind-trigger.has-reminders {
    color: var(--dk-accent);
}
.dk-task-remind-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 17px;
    height: 17px;
    padding: 0 5px;
    border-radius: 9px;
    background: var(--dk-accent);
    color: #fff;
    font-size: var(--dk-fs-11);
    font-weight: 700;
    line-height: 1;
}

.dk-task-links-block {
    margin: 0 0 16px 0;
    padding: 10px 14px;
    background: var(--dk-bg);
    border: 1px solid var(--dk-border-light);
    border-radius: 10px;
}
.dk-task-links-heading {
    font-size: var(--dk-fs-12);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .02em;
    color: var(--dk-text-muted);
    margin-bottom: 6px;
}
.dk-task-links-list {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.dk-task-link-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 4px;
    border-radius: 6px;
    font-size: var(--dk-fs-13-5);
}
.dk-task-link-row:hover {
    background: var(--dk-surface);
}
.dk-task-link-status {
    font-size: var(--dk-fs-13);
    flex-shrink: 0;
}
.dk-task-link-code {
    color: var(--dk-text-muted);
    font-weight: 600;
    text-decoration: none;
    flex-shrink: 0;
}
.dk-task-link-code:hover {
    color: var(--dk-accent);
}
.dk-task-link-title {
    color: var(--dk-text);
    flex-grow: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-task-link-remove {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border: none;
    background: transparent;
    color: var(--dk-text-light);
    border-radius: 6px;
    cursor: pointer;
    flex-shrink: 0;
    font-size: var(--dk-fs-12);
    transition: background 0.15s, color 0.15s;
}
.dk-task-link-remove:hover {
    background: var(--dk-danger-dim);
    color: var(--dk-danger);
}

/* Строка результата поиска в модалке "Связать задачи" -- переиспользует
   .dk-deal-search-list/.dk-deal-search-hint (уже есть), тут только своя строка */
.dk-task-link-result {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 10px;
    border-radius: 8px;
    cursor: pointer;
    font-size: var(--dk-fs-13-5);
    transition: background 0.1s;
}
.dk-task-link-result:hover {
    background: var(--dk-bg);
}
.dk-task-link-result-code {
    color: var(--dk-text-muted);
    font-weight: 600;
    flex-shrink: 0;
}
.dk-task-link-result-title {
    flex-grow: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--dk-text);
}
.dk-task-link-result-add {
    color: var(--dk-accent);
    flex-shrink: 0;
}

/* ── Связанные ("блокирующие") задачи -- чипы-коды на строке таблицы задач
   (TaskRow) и на карточке канбана (_kanban_card.php). Строка сама -- <a>,
   поэтому чипы кликаются через onclick+stopPropagation, не настоящие <a>
   (см. app/classes/TaskRow.php / views/partials/_kanban_card.php). */
.dk-task-links-inline {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 3px;
}
.dk-task-link-chip {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    font-size: var(--dk-fs-10-5);
    font-weight: 600;
    padding: 1px 6px;
    border-radius: 20px;
    cursor: pointer;
    white-space: nowrap;
    transition: background 0.1s, color 0.1s;
}
.dk-task-link-chip i {
    font-size: var(--dk-fs-10);
}
.dk-task-link-chip-waits {
    color: var(--dk-p-high);
    background: rgba(245, 158, 11, 0.1);
}
.dk-task-link-chip-waits:hover {
    background: rgba(245, 158, 11, 0.2);
}
.dk-task-link-chip-blocks {
    color: var(--dk-text-muted);
    background: var(--dk-bg);
}
.dk-task-link-chip-blocks:hover {
    color: var(--dk-accent);
    background: var(--dk-accent-dim);
}

/* ── GANTT / TIMELINE REPORT (План - Факт) ──────────────────── */
.dk-gantt-wrapper {
    overflow: hidden;
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: 10px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.dk-gantt-container {
    display: flex;
    /* align-items по умолчанию -- stretch: без него оба флекс-ребёнка
       (.dk-gantt-tree-col/.dk-gantt-timeline-col) стягивались по высоте
       контейнера (max-height:75vh), а не по своему контенту. Дерево внутри
       не даёт себе сжаться ниже суммарной высоты строк (у
       .dk-gantt-tree-body нет min-height -- дефолтный auto использует
       контент как пол), поэтому оно всё равно рисовалось на всю высоту
       (5280px), переполняя урезанную stretch-коробку -- а таймлайн, у
       которого .dk-gantt-timeline-body имеет явный min-height:400px,
       наоборот ужимался flex-shrink'ом до реально доступного места
       (~620px), и его строки с барами дорисовывались уже ЗА пределами
       собственного, урезанного бокса. В сумме высоты дерева и таймлайна
       расходились на тысячи пикселей, и красные бары "аварийных" строк
       после прокрутки вниз оказывались физически напротив совсем других
       строк дерева (в т.ч. напротив шапки проекта) -- баг, воспроизведённый
       Павлом 2026-09-19 ("красная линия залезает на название проекта").
       flex-start убирает стретч: обе колонки сами становятся высотой в
       полный контент (совпадают друг с другом), а видимое окно/скролл
       по-прежнему даёт max-height + overflow:auto на самом контейнере. */
    align-items: flex-start;
    position: relative;
    min-height: 480px;
    max-height: 75vh;
    /* Единый скролл-контейнер: вертикаль крутит дерево и таймлайн вместе,
       горизонталь -- только сдвигает шкалу (дерево прилипает слева). */
    overflow: auto;
}
.dk-gantt-tree-col {
    width: 360px;
    min-width: 360px;
    max-width: 360px;
    border-right: 1px solid var(--dk-border);
    display: flex;
    flex-direction: column;
    background: var(--dk-surface);
    z-index: 10;
    flex-shrink: 0;
    /* Дерево = заголовки строк: не уезжает при горизонтальном скролле */
    position: sticky;
    left: 0;
}
.dk-gantt-tree-header {
    height: 56px;
    border-bottom: 1px solid var(--dk-border);
    background: var(--dk-bg-subtle, #f8fafc);
    flex-shrink: 0;
    /* Шапка дерева остаётся видимой при вертикальном скролле */
    position: sticky;
    top: 0;
    z-index: 12;
}
.dk-gantt-tree-body {
    flex-grow: 1;
}
.dk-gantt-timeline-col {
    flex-grow: 1;
    position: relative;
    display: flex;
    flex-direction: column;
    background: var(--dk-surface);
}
.dk-gantt-timeline-header {
    height: 56px;
    border-bottom: 1px solid var(--dk-border);
    background: var(--dk-bg-subtle, #f8fafc);
    flex-shrink: 0;
    position: sticky;
    top: 0;
    z-index: 5;
    user-select: none;
}
.dk-gantt-th-month {
    height: 26px;
    line-height: 26px;
    font-size: var(--dk-fs-11);
    font-weight: 600;
    color: var(--dk-text-muted);
    text-align: center;
    border-right: 1px solid var(--dk-border-light);
    border-bottom: 1px solid var(--dk-border-light);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-gantt-th-day {
    height: 30px;
    font-size: var(--dk-fs-10);
    text-align: center;
    border-right: 1px solid var(--dk-border-light);
    display: flex;
    flex-direction: column;
    justify-content: center;
    color: var(--dk-text-muted);
    flex-shrink: 0;
}
.dk-gantt-th-day .day-num {
    font-weight: 600;
    line-height: 12px;
}
.dk-gantt-th-day .day-name {
    font-size: var(--dk-fs-9);
    opacity: 0.75;
    line-height: 10px;
}
.dk-gantt-th-day.weekend {
    background: rgba(0, 0, 0, 0.025);
    color: var(--dk-text-muted);
}
.dk-gantt-th-day.today {
    background: rgba(59, 130, 246, 0.12);
    color: var(--dk-accent);
    font-weight: bold;
}
.dk-gantt-timeline-body {
    /* min-height:400px убран -- с align-items:flex-start на
       .dk-gantt-container (см. коммент там) это создавало обратный
       перекос: при малом числе строк таймлайн становился ВЫШЕ дерева
       (у .dk-gantt-tree-body такого пола нет). Видимый минимум задаёт
       min-height:480px на .dk-gantt-container. */
    position: relative;
    flex-grow: 1;
}
.dk-gantt-grid-bg {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    pointer-events: none;
    z-index: 1;
}
.dk-gantt-grid-col.weekend {
    position: absolute;
    top: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.015);
    border-right: 1px solid rgba(0, 0, 0, 0.02);
}
.dk-gantt-today-marker {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 2px;
    background: #ef4444;
    z-index: 4;
    pointer-events: none;
}
.dk-gantt-today-marker::after {
    content: '';
    position: absolute;
    top: 0;
    left: -3px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #ef4444;
}

/* Rows (Tree & Timeline) */
.dk-gantt-row {
    height: 48px;
    border-bottom: 1px solid var(--dk-border-light);
    font-size: var(--dk-fs-13);
    color: var(--dk-text);
    box-sizing: border-box;
}
.dk-gantt-bar-row {
    height: 48px;
    border-bottom: 1px solid var(--dk-border-light);
    position: relative;
    box-sizing: border-box;
}
.dk-gantt-row:hover,
.dk-gantt-bar-row:hover {
    background: var(--dk-bg-row-hover, rgba(0, 0, 0, 0.015));
}
.dk-gantt-row-project {
    background: rgba(0, 0, 0, 0.02);
    font-weight: 600;
    padding: 0 12px;
}
.dk-gantt-bar-row-project {
    background: rgba(0, 0, 0, 0.02);
}
.dk-gantt-row-tag {
    background: var(--dk-surface);
    padding: 0 12px 0 28px;
}
.dk-gantt-row-task {
    background: var(--dk-surface);
    padding: 0 12px 0 46px;
}
.dk-gantt-toggle-btn {
    background: none;
    border: none;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11);
    padding: 2px 4px;
    cursor: pointer;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.dk-gantt-toggle-btn:hover {
    color: var(--dk-text);
    background: var(--dk-border-light);
}
.dk-gantt-color-dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin-right: 6px;
    flex-shrink: 0;
}
.dk-gantt-tag-chip {
    display: inline-flex;
    align-items: center;
    font-size: var(--dk-fs-12);
    font-weight: 500;
    color: var(--dk-text);
    padding: 2px 6px;
    border-left: 3px solid #6b7280;
    border-radius: 0 4px 4px 0;
    background: var(--dk-bg-subtle, #f8fafc);
}
.dk-gantt-task-code {
    font-size: var(--dk-fs-12);
    color: var(--dk-accent);
    font-family: var(--bs-font-monospace);
    flex-shrink: 0;
}
.dk-gantt-task-tema {
    font-size: var(--dk-fs-12-5);
}

/* Gantt Bars */
.dk-gantt-bar {
    position: absolute;
    height: 16px;
    border-radius: 4px;
    cursor: pointer;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    padding: 0 6px;
    font-size: var(--dk-fs-10);
    line-height: 16px;
    color: #ffffff;
    font-weight: 500;
    box-sizing: border-box;
    transition: transform 0.1s, box-shadow 0.1s;
    z-index: 2;
}
.dk-gantt-bar:hover {
    transform: scaleY(1.15);
    z-index: 6;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
}
.dk-gantt-bar-label {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-gantt-bar-plan {
    top: 5px;
    background: #3b82f6;
    opacity: 0.85;
}
.dk-gantt-bar-fact {
    top: 25px;
}
.dk-gantt-fact-done {
    background: #10b981;
}
.dk-gantt-fact-inwork {
    background: #06b6d4;
}
.dk-gantt-fact-overdue {
    background: #ef4444;
}
.dk-gantt-fact-pause {
    background: #f59e0b;
}

/* Legend & Tooltip */
.dk-gantt-legend-box {
    width: 14px;
    height: 10px;
    border-radius: 2px;
    display: inline-block;
}
.dk-gantt-bg-plan {
    background: #3b82f6;
}
.dk-gantt-bg-fact-done {
    background: #10b981;
}
.dk-gantt-bg-fact-inwork {
    background: #06b6d4;
}
.dk-gantt-bg-fact-overdue {
    background: #ef4444;
}
.dk-gantt-legend-line-today {
    width: 14px;
    height: 2px;
    background: #ef4444;
    display: inline-block;
}
.dk-gantt-tooltip {
    position: absolute;
    z-index: 3000;
    background: #0f172a;
    color: #f8fafc;
    padding: 10px 14px;
    border-radius: 8px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
    font-size: var(--dk-fs-12);
    pointer-events: none;
    min-width: 220px;
    max-width: 360px;
}
.dk-gantt-tooltip .dk-tt-title {
    font-size: var(--dk-fs-12-5);
    border-bottom: 1px solid rgba(255, 255, 255, 0.1);
    padding-bottom: 4px;
}
.dk-gantt-tooltip .dk-tt-row {
    line-height: 1.5;
}


/* === Печать вики-страницы (кнопка PDF -> window.print(), 2026-08-26) ===
   PDF-библиотеки на сервере нет (см. историю решения 2026-08-26 -- TCPDF/
   tc-lib-pdf/dompdf требуют composer, которого в проекте нет). Вместо
   серверной генерации -- печатаем текущую страницу браузером: прячем весь
   chrome приложения (сайдбар, топбар, боковая панель тегов/файлов, кнопки),
   оставляем только .dk-page-content. Классы .dk-page-* используются только
   в views/v_page.php -- других страниц эти правила не касаются. */
@media print {
    .dk-sidebar,
    .dk-topbar,
    .dk-page-sidebar,
    #btnEditPage,
    #btnSavePage,
    #btnCancelEdit,
    #btnNewSubpage,
    #pageEditArea,
    #dk-flash,
    .offcanvas-backdrop {
        display: none !important;
    }
    .dk-page-layout {
        display: block !important;
    }
    .dk-page-content {
        max-width: 100% !important;
        margin: 0 !important;
        padding: 0 !important;
    }
    .dk-main,
    .dk-content,
    body,
    html {
        overflow: visible !important;
        height: auto !important;
        background: var(--dk-surface) !important;
    }
    .dk-page-body {
        color: #000 !important;
    }
    .dk-page-body table {
        page-break-inside: avoid;
    }
    .dk-page-body h1,
    .dk-page-body h2,
    .dk-page-body h3 {
        page-break-after: avoid;
    }
    .dk-page-body img {
        max-width: 100% !important;
    }
}

/* ─── Отчёт "По людям" (report_key='people_activity') ──────────────── */
.dk-people-picker {
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 16px;
    background: var(--dk-surface);
    margin-bottom: 20px;
}
.dk-people-picker-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
}
.dk-people-picker-title {
    font-weight: 600;
    font-size: var(--dk-fs-15);
}
.dk-people-picker-count {
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: var(--dk-accent);
    background: var(--dk-accent-dim);
    padding: 4px 10px;
    border-radius: 20px;
    white-space: nowrap;
}
.dk-people-picker-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 8px;
    max-height: 340px;
    overflow-y: auto;
    padding: 2px;
}
.dk-people-picker-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 10px;
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    cursor: pointer;
    transition: all 0.15s;
}
.dk-people-picker-item:hover {
    border-color: var(--dk-accent);
    background: var(--dk-accent-dim);
}
.dk-people-picker-checkbox {
    flex: 0 0 auto;
}
.dk-people-picker-checkbox:disabled {
    opacity: 0.4;
}
.dk-people-picker-avatar {
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-size: var(--dk-fs-10);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
}
.dk-people-picker-name {
    font-size: var(--dk-fs-13);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-people-columns {
    display: flex;
    gap: 14px;
    overflow-x: auto;
    padding-bottom: 8px;
    align-items: flex-start;
}
.dk-people-col {
    flex: 1 1 420px;
    width: 420px;
    min-width: 340px;
    max-width: 520px;
    background: var(--dk-bg);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 12px;
    display: flex;
    flex-direction: column;
    gap: 10px;
    max-height: calc(100vh - 260px);
}
.dk-people-col-head {
    display: flex;
    align-items: center;
    gap: 10px;
}
.dk-people-col-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    font-size: var(--dk-fs-12);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
}
.dk-people-col-head-body {
    min-width: 0;
}
.dk-people-col-name {
    font-weight: 600;
    font-size: var(--dk-fs-14);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.dk-people-col-count {
    font-size: var(--dk-fs-12);
    color: var(--dk-text-muted);
}
.dk-people-col-feed {
    overflow-y: auto;
    flex: 1 1 auto;
    min-height: 60px;
}
.dk-empty-state-sm {
    padding: 20px 10px;
}
.dk-empty-state-sm .dk-empty-icon {
    font-size: var(--dk-fs-22);
}

/* ─── Отчёт "По людям" — период + группировка по дням ──────────────── */
.dk-people-daterange input[type="date"] {
    max-width: 160px;
}
.dk-people-col-days {
    display: flex;
    flex-direction: column;
    gap: 14px;
    overflow-y: auto;
    flex: 1 1 auto;
    min-height: 60px;
}
.dk-people-day {
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    overflow: hidden;
    flex-shrink: 0;
}
.dk-people-day-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 8px 12px;
    background: var(--dk-surface);
    border-bottom: 1px solid var(--dk-border-light);
    font-size: var(--dk-fs-12);
}
.dk-people-day-date {
    font-weight: 600;
}
.dk-people-day-total {
    color: var(--dk-text-muted);
    white-space: nowrap;
}

/* ── CRM DASHBOARD — пай-чарт по статусам сделок ─────────────── */
.dk-crm-dash-chart-wrap {
    max-width: 260px;
    margin: 0 auto;
    position: relative;
}


/* ── NOTIFY SETTINGS — /profile, мьют по каналу (сессия 61+) ─── */
.dk-notify-channels {
    display: flex;
    flex-direction: column;
}
.dk-notify-channel-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 8px 0;
}
.dk-notify-channel-row + .dk-notify-channel-row {
    border-top: 1px solid var(--dk-border-light);
}
.dk-notify-channel-title {
    display: flex;
    align-items: center;
    gap: 6px;
    font-weight: 600;
}
.dk-notify-col-header {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 18px;
    padding: 0 0 6px 0;
}
.dk-notify-col-header span {
    width: 52px;
    text-align: center;
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-11);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .3px;
}
.dk-notify-event-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}
.dk-notify-event-name {
    font-size: var(--dk-fs-14);
}
.dk-notify-event-switches {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 18px;
}
.dk-notify-event-switches .form-check {
    width: 52px;
    display: flex;
    justify-content: center;
    margin: 0;
}
.dk-notify-col-muted {
    opacity: .35;
    pointer-events: none;
}

/* ── /help (страница "О системе": питч + фичи + changelog) ─────
   doka.css?v=145 в views/v_help.php. Публичная страница, свой
   лэйаут (не .dk-app/.dk-sidebar), поэтому все классы с префиксом
   .dk-help-*, без пересечений с остальным приложением. */
.dk-help-body {
    background: var(--dk-surface);
    color: var(--dk-text);
    font-family: var(--dk-font);
}

.dk-help-section-inner {
    max-width: 1080px;
    margin: 0 auto;
    padding: 0 24px;
    box-sizing: border-box;
}

.dk-help-nav {
    border-bottom: 1px solid var(--dk-border);
    position: sticky;
    top: 0;
    background: var(--dk-surface);
    z-index: 10;
}
.dk-help-nav-inner {
    max-width: 1080px;
    margin: 0 auto;
    padding: 14px 24px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    box-sizing: border-box;
}
.dk-help-nav-right {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
}
.dk-help-lang-switch {
    margin-bottom: 0;
    width: auto;
}

.dk-help-hero {
    background: var(--dk-bg);
    padding: 72px 0 64px;
}
.dk-help-hero-inner {
    text-align: center;
    max-width: 720px;
}
.dk-help-hero-title {
    font-size: var(--dk-fs-40);
    font-weight: 800;
    letter-spacing: -0.5px;
    margin-bottom: 18px;
    color: var(--dk-text);
}
.dk-help-hero-subtitle {
    font-size: var(--dk-fs-17);
    color: var(--dk-text-muted);
    line-height: 1.6;
    margin-bottom: 32px;
}
.dk-help-hero-cta {
    display: flex;
    gap: 12px;
    justify-content: center;
    flex-wrap: wrap;
}

.dk-help-pains {
    padding: 56px 0;
}
.dk-help-pains-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
}
.dk-help-pain-card {
    padding: 2px 4px 2px 20px;
    border-left: 3px solid var(--dk-accent);
}
.dk-help-pain-title {
    font-weight: 700;
    font-size: var(--dk-fs-16);
    margin-bottom: 6px;
    color: var(--dk-text);
}
.dk-help-pain-desc {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-14);
    line-height: 1.55;
}

.dk-help-features {
    padding: 40px 0 64px;
    background: var(--dk-bg);
}
.dk-help-features-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 18px;
}
.dk-help-feature-card {
    background: var(--dk-surface);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius-lg);
    padding: 22px 20px;
}
.dk-help-feature-icon {
    width: 40px;
    height: 40px;
    border-radius: 10px;
    background: var(--dk-accent-dim);
    color: var(--dk-accent);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--dk-fs-19);
    margin-bottom: 14px;
}
.dk-help-feature-title {
    font-weight: 700;
    font-size: var(--dk-fs-15);
    margin-bottom: 6px;
    color: var(--dk-text);
}
.dk-help-feature-desc {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
    line-height: 1.5;
}

.dk-help-changelog {
    padding: 64px 0 72px;
}
.dk-help-section-title {
    font-size: var(--dk-fs-26);
    font-weight: 800;
    margin-bottom: 8px;
    color: var(--dk-text);
}
.dk-help-changelog-intro {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-14);
    margin-bottom: 32px;
}
.dk-help-changelog-layout {
    display: flex;
    gap: 36px;
    align-items: flex-start;
}
.dk-help-changelog-menu {
    flex: 0 0 260px;
    position: sticky;
    top: 76px;
    max-height: calc(100vh - 100px);
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 2px;
    border-right: 1px solid var(--dk-border);
    padding-right: 16px;
}
.dk-help-changelog-menu a {
    display: flex;
    flex-direction: column;
    gap: 1px;
    padding: 7px 10px;
    border-radius: var(--dk-radius);
    text-decoration: none;
    color: var(--dk-text);
}
.dk-help-changelog-menu a:hover {
    background: var(--dk-bg-row-hover);
}
.dk-help-changelog-menu-date {
    font-size: var(--dk-fs-11);
    color: var(--dk-text-light);
    font-weight: 600;
}
.dk-help-changelog-menu-title {
    font-size: var(--dk-fs-13);
}
.dk-help-changelog-list {
    flex: 1;
    min-width: 0;
}
.dk-help-changelog-item {
    display: flex;
    gap: 20px;
    padding: 18px 0;
    border-bottom: 1px solid var(--dk-border-light);
    scroll-margin-top: 20px;
}
.dk-help-changelog-item:last-child {
    border-bottom: none;
}
.dk-help-changelog-date {
    flex: 0 0 100px;
    font-size: var(--dk-fs-13);
    font-weight: 600;
    color: var(--dk-text-muted);
    padding-top: 2px;
}
.dk-help-changelog-title {
    font-weight: 700;
    font-size: var(--dk-fs-15);
    margin-bottom: 4px;
    color: var(--dk-text);
}
.dk-help-changelog-desc {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-14);
    line-height: 1.55;
}

.dk-help-footer {
    border-top: 1px solid var(--dk-border);
    padding: 28px 0;
}
.dk-help-footer-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 10px;
}
.dk-help-footer-logo {
    font-size: var(--dk-fs-16);
}
.dk-help-footer-note {
    color: var(--dk-text-muted);
    font-size: var(--dk-fs-13);
}

@media (max-width: 991px) {
    .dk-help-hero-title { font-size: var(--dk-fs-28); }
    .dk-help-pains-grid { grid-template-columns: 1fr; }
    .dk-help-features-grid { grid-template-columns: repeat(2, 1fr); }
    .dk-help-changelog-layout { flex-direction: column; }
    .dk-help-changelog-menu {
        position: static;
        flex-direction: row;
        overflow-x: auto;
        overflow-y: visible;
        max-height: none;
        border-right: none;
        border-bottom: 1px solid var(--dk-border);
        padding-right: 0;
        padding-bottom: 12px;
        margin-bottom: 12px;
        width: 100%;
    }
    .dk-help-changelog-menu a {
        flex: 0 0 auto;
        white-space: nowrap;
        flex-direction: row;
        gap: 6px;
    }
}
@media (max-width: 575px) {
    .dk-help-features-grid { grid-template-columns: 1fr; }
}

/* Превью письма (админка -- заявки на вступление, кнопка "Отправить письмо") */
.dk-email-preview {
    background: var(--dk-bg-subtle, #f8fafc);
    border: 1px solid var(--dk-border);
    border-radius: var(--dk-radius);
    padding: 14px 16px;
    font-size: var(--dk-fs-13);
    line-height: 1.6;
    color: var(--dk-text);
    white-space: pre-line;
}
