/* ============================================================
   MMS — main.css (Bootstrap 5.3)
   Подключается ПОСЛЕ темы, которую ставит каркас платформы.
   Всё, что раньше повторяло Bootstrap, удалено — здесь только
   тема MMS, каркас и то, чего в Bootstrap нет.
   Было ~1347 строк. Стало ~240.
   ============================================================ */

/* ─── 1. ТЕМА ────────────────────────────────────────────────
   Тему — Bootstrap, Cosmo или Flatly — и фирменный цвет своей темы
   ставит каркас платформы по настройкам (вкладка «Оформление»).
   Здесь только тема-независимый каркас (компат-алиасы, лейаут,
   формы и т.д.). */

/* ─── Совместимость: старые переменные MMS → токены Bootstrap ──
   Экраны со своим <style> (табель, расписание, чат и др.) ссылаются
   на --border/--bg-gray/--text-muted и т.п. Маппим их на --bs-*,
   чтобы границы/фоны/текст работали в обеих темах без переписывания
   этих шаблонов. Указывают на тема-зависимые токены Bootstrap, поэтому
   тёмная тема поддерживается автоматически. */
:root {
  --border: var(--bs-border-color);
  --bg: var(--bs-body-bg);
  --bg-gray: var(--bs-secondary-bg);
  --bg-white: var(--bs-body-bg);
  --text: var(--bs-body-color);
  --text-muted: var(--bs-secondary-color);
  --text-secondary: var(--bs-secondary-color);
  --dark: var(--bs-emphasis-color);
  --danger: var(--bs-danger);
  --font: var(--bs-body-font-family);
  /* Фирменный акцент — основной цвет темы: у своей темы это фирменный цвет
     из настроек, у Cosmo и Flatly — их палитра. Используется во множестве
     экранов через var(--accent). */
  --accent: var(--bs-primary);
  --accent-hover: var(--bs-link-hover-color);
}
/* Фон шапки и меню задаёт платформа: меню — оттенком фирменного цвета своей
   темы (platforma.E018 не даёт вписать его здесь). */


/* Перекраску компонентов Bootstrap под фирменный цвет (.btn-primary,
   .btn-outline-primary, focus-кольца, .nav-*) делает платформа — только для
   своей темы. Cosmo и Flatly красят компоненты сами. */

/* ─── 2. КАРКАС ─────────────────────────────────────────────
   Шапку, меню, сетку страницы и её ширины рисует платформа
   (platforma/css/platform.css). Здесь их правил нет и быть не должно:
   правило большего веса перебило бы каркас (проверка platforma.E018). */

/* ─── 3. ТАБЛИЦА СПИСКА → КАРТОЧКИ НА ТЕЛЕФОНЕ ──────────────
   Требует data-l="Заголовок" на каждой <td>
   и class="pri" на главной ячейке строки.                    */
.rt { --bs-table-bg: var(--bs-body-bg); font-size: .875rem; margin: 0; }
.rt th { font-weight: 600; font-size: .8125rem; color: var(--bs-secondary-color); white-space: nowrap; }
.rt th a { color: inherit; text-decoration: none; display: inline-flex; align-items: center; gap: .2rem; }
.rt th a:hover { color: var(--bs-primary); }
.rt td { vertical-align: middle; }
.num { font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
.sub td { font-size: .8125rem; color: var(--bs-secondary-color); background: var(--bs-tertiary-bg); border-top: 0; }

@media (max-width: 767.98px) {
  .rt thead { display: none; }
  .rt, .rt tbody, .rt tr, .rt td { display: block; width: 100%; }
  .rt tbody tr {
    border: 1px solid var(--bs-border-color); border-radius: .375rem;
    margin-bottom: .5rem; padding: .6rem .8rem; background: var(--bs-body-bg);
  }
  .rt td { border: 0; padding: .15rem 0; display: flex; justify-content: space-between; gap: 1rem; text-align: right; }
  .rt td::before { content: attr(data-l); color: var(--bs-secondary-color); font-size: .8125rem; text-align: left; flex: none; }
  .rt td.pri {
    font-size: 1rem; font-weight: 600; text-align: left;
    padding-bottom: .35rem; margin-bottom: .35rem;
    border-bottom: 1px solid var(--bs-border-color);
  }
  .rt td.pri::before { display: none; }
  .rt tr.sub { border-style: dashed; margin-top: -.35rem; }
}

/* ─── 4. ДНИ МЕСЯЦА (список заказов) ────────────────────────
   Заменяет .day-pill / .pill-btn / .ord-chip — было ~40 строк. */
.days { display: flex; gap: .2rem; overflow-x: auto; padding-bottom: .25rem; scrollbar-width: thin; }
.day {
  flex: none; min-width: 30px; height: 30px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--bs-border-color); border-radius: .25rem;
  font-size: .8125rem; text-decoration: none;
  color: var(--bs-body-color); background: var(--bs-body-bg);
}
.day:hover { background: var(--bs-secondary-bg); text-decoration: none; }
.day.wk { color: var(--bs-danger-text-emphasis); border-color: var(--bs-danger-border-subtle); }
.day.now { font-weight: 700; box-shadow: inset 0 -2px 0 var(--bs-primary); }
.day.on { background: var(--bs-primary); border-color: var(--bs-primary); color: #fff; font-weight: 600; }

/* ─── 5. ПАРЫ «ПОЛЕ — ЗНАЧЕНИЕ» (деталь) ────────────────────
   Заменяет .od-grid-2 / .od-card / fieldset+legend.          */
dl.kv { display: grid; grid-template-columns: auto 1fr; gap: .35rem 1rem; margin: 0; font-size: .875rem; }
dl.kv dt { color: var(--bs-secondary-color); font-weight: 400; white-space: nowrap; }
dl.kv dd { margin: 0; font-weight: 500; }
@media (min-width: 768px) { dl.kv { grid-template-columns: auto 1fr auto 1fr; column-gap: 1.5rem; } }

/* ─── 6. ДАШБОРД ────────────────────────────────────────────
   .tile-grid был flex с фиксированной .tile{width:100px} —
   на широком экране рвался. Теперь сетка заполняет любую ширину. */
.kpi { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .75rem; }
.kpi .card-body { padding: .85rem 1rem; }
.kpi .v { font-size: 1.6rem; font-weight: 700; line-height: 1.1; font-variant-numeric: tabular-nums; }
.kpi .l { font-size: .75rem; text-transform: uppercase; letter-spacing: .4px; color: var(--bs-secondary-color); font-weight: 600; }

.att { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: .6rem; }
.att a {
  display: flex; align-items: center; gap: .7rem; padding: .6rem .8rem;
  border: 1px solid var(--bs-border-color); border-left-width: 3px; border-radius: .375rem;
  background: var(--bs-body-bg); text-decoration: none; color: var(--bs-body-color);
}
.att a:hover { background: var(--bs-secondary-bg); text-decoration: none; }
.att .n { margin-left: auto; font-weight: 700; font-variant-numeric: tabular-nums; }

.tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: .5rem; }
.tile {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .35rem;
  aspect-ratio: 1; background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color); border-radius: .5rem;
  text-decoration: none; color: var(--bs-body-color);
  font-size: .75rem; text-align: center; padding: .4rem; transition: .15s;
}
.tile:hover { border-color: var(--bs-primary); color: var(--bs-primary); transform: translateY(-2px); box-shadow: var(--bs-box-shadow-sm); text-decoration: none; }
.tile i { font-size: 1.35rem; color: var(--bs-secondary-color); }
.tile:hover i { color: var(--bs-primary); }

/* Вкладка «Модули» оформляется секцией «Настройки Модули: карточка на модуль…»
   ниже (.module-groups / .module-rows). Прежние плиточные правила
   (.tile-grid / .tile-icon / .module-tile:has(input:checked)) удалены —
   они конфликтовали со списком (подсвечивали строку по любому чекбоксу,
   включая роль-чекбоксы). Класс .tile-label стилизуется в .module-rows. */

/* ─── 7. РАСПИСАНИЕ ─────────────────────────────────────────
   --rooms задаётся инлайн из данных: style="--rooms:{{ rooms|length }}"
   Прокрутка ВНУТРИ .calwrap — иначе sticky не работает и колонки обрезаются. */
.calwrap { overflow: auto; max-height: calc(100dvh - var(--hdr) - 190px); min-height: 340px; border: 1px solid var(--bs-border-color); border-radius: .375rem; background: var(--bs-body-bg); }
.cal { display: grid; grid-template-columns: 52px repeat(var(--rooms), minmax(150px, 1fr)); width: max-content; min-width: 100%; background: var(--bs-body-bg); position: relative; }
.cal .ch { position: sticky; top: 0; z-index: 4; background: var(--bs-tertiary-bg); border-bottom: 1px solid var(--bs-border-color); padding: .35rem .5rem; font-size: .75rem; font-weight: 600; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cal .ch:first-child { left: 0; z-index: 5; }
.cal .ct { position: sticky; left: 0; z-index: 3; border-right: 1px solid var(--bs-border-color); font-size: .6875rem; color: var(--bs-secondary-color); text-align: right; padding: .1rem .4rem; height: 34px; font-variant-numeric: tabular-nums; background: var(--bs-body-bg); }
.cal .cc { border-right: 1px solid var(--bs-border-color); border-bottom: 1px solid var(--bs-border-color); height: 34px; position: relative; cursor: pointer; }
.cal .cc:hover { background: var(--bs-secondary-bg); }
.cal .cc.h { border-bottom-style: dashed; }
.ap { position: absolute; left: 2px; right: 2px; border-radius: .25rem; padding: .15rem .35rem; font-size: .6875rem; line-height: 1.25; overflow: hidden; border-left: 3px solid; cursor: pointer; z-index: 1; }
.ap b { display: block; font-size: .75rem; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ap.g { background: var(--bs-success-bg-subtle); border-color: var(--bs-success); color: var(--bs-success-text-emphasis); }
.ap.y { background: var(--bs-warning-bg-subtle); border-color: var(--bs-warning); color: var(--bs-warning-text-emphasis); }
.ap.b { background: var(--bs-info-bg-subtle);    border-color: var(--bs-info);    color: var(--bs-info-text-emphasis); }
.ap.n { background: var(--bs-secondary-bg);      border-color: var(--bs-secondary); color: var(--bs-secondary-color); }
.now { position: absolute; left: 52px; right: 0; height: 2px; background: var(--bs-primary); z-index: 3; pointer-events: none; }
.now::before { content: ''; position: absolute; left: -4px; top: -3px; width: 8px; height: 8px; border-radius: 50%; background: var(--bs-primary); }

/* ─── 8. ЧАТ ────────────────────────────────────────────────
   100dvh, а не vh: на телефоне адресная строка не режет поле ввода. */
.chat { display: grid; grid-template-columns: 280px minmax(0, 1fr); height: calc(100dvh - var(--hdr) - var(--gutter) * 2); border: 1px solid var(--bs-border-color); border-radius: .5rem; overflow: hidden; background: var(--bs-body-bg); }
.chat .list { border-right: 1px solid var(--bs-border-color); overflow: auto; }
.chat .list a { display: flex; gap: .6rem; padding: .6rem .8rem; text-decoration: none; color: var(--bs-body-color); border-bottom: 1px solid var(--bs-border-color); }
.chat .list a:hover { background: var(--bs-secondary-bg); text-decoration: none; }
.chat .list a.on { background: var(--bs-primary-bg-subtle); }
.av { width: 34px; height: 34px; border-radius: 50%; background: var(--bs-secondary-bg); display: flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex: none; color: var(--bs-secondary-color); }
.chat .body { display: flex; flex-direction: column; min-width: 0; }
.chat .msgs { flex: 1; overflow: auto; padding: 1rem; display: flex; flex-direction: column; gap: .5rem; background: var(--bs-tertiary-bg); }
.bub { max-width: min(70%, 520px); padding: .4rem .7rem; border-radius: .75rem; font-size: .875rem; background: var(--bs-body-bg); border: 1px solid var(--bs-border-color); }
.bub .t { font-size: .6875rem; color: var(--bs-secondary-color); margin-top: .15rem; text-align: right; }
.bub.me { align-self: flex-end; background: var(--bs-primary-bg-subtle); border-color: var(--bs-primary-border-subtle); }
.chat .day-sep { align-self: center; font-size: .75rem; color: var(--bs-secondary-color); background: var(--bs-body-bg); border: 1px solid var(--bs-border-color); border-radius: 1rem; padding: .1rem .7rem; }
@media (max-width: 767.98px) { .chat { grid-template-columns: minmax(0, 1fr); } .chat .list { display: none; } }

/* ─── 9. МОБИЛЬНОЕ РАСПИСАНИЕ (директор) ───────────────────
   Цели касания не ниже 44px. */
.mrow { display: flex; gap: .7rem; align-items: center; min-height: 56px; background: var(--bs-body-bg); border: 1px solid var(--bs-border-color); border-radius: .5rem; padding: .6rem .75rem; margin-bottom: .5rem; text-decoration: none; color: var(--bs-body-color); }
.mrow:hover { text-decoration: none; }
.mrow .tm { font-variant-numeric: tabular-nums; font-weight: 700; font-size: 1rem; flex: none; width: 3.1rem; }
.tabbar { display: flex; border-top: 1px solid var(--bs-border-color); background: var(--bs-body-bg); position: sticky; bottom: 0; z-index: 1020; }
.tabbar a { flex: 1; min-height: 52px; padding: .5rem; text-align: center; font-size: .6875rem; text-decoration: none; color: var(--bs-secondary-color); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .15rem; }
.tabbar a.on { color: var(--bs-primary); }
.tabbar i { font-size: 1.15rem; }

/* ─── 10. ПЕЧАТЬ ────────────────────────────────────────────*/
/* Каркас и `.no-print` при печати прячет платформа; здесь — свои классы. */
@media print {
  .tabbar { display: none !important; }
}

/* ─── 11. ФОРМЫ — совместимость виджетов Django ──────────────
   Django рендерит {{ field }} без классов. Внутри .mms-form
   приводим базовые контролы к облику Bootstrap, чтобы не
   прописывать form-control в каждый виджет форм в Python.        */
.mms-form label { font-size: .8125rem; font-weight: 500; margin-bottom: .15rem; color: var(--bs-body-color); }
.mms-form input:not([type=checkbox]):not([type=radio]):not([type=file]):not(.btn),
.mms-form select,
.mms-form textarea {
  display: block; width: 100%;
  padding: .3rem .6rem; font-size: .875rem; line-height: 1.5;
  color: var(--bs-body-color); background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color); border-radius: .375rem;
  transition: border-color .1s, box-shadow .1s;
}
.mms-form input:focus, .mms-form select:focus, .mms-form textarea:focus {
  outline: 0; border-color: var(--bs-primary);
  box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .2);
}
.mms-form input[type=checkbox], .mms-form input[type=radio] {
  width: 1em; height: 1em; margin-right: .4rem; vertical-align: -.125em;
  accent-color: var(--bs-primary);
}
.mms-form .form-field { margin-bottom: .85rem; }
.mms-form .form-field small,
.mms-form .form-field .help-text { display: block; font-size: .75rem; color: var(--bs-secondary-color); margin-top: .15rem; }
.mms-form .errorlist { list-style: none; padding: 0; margin: .2rem 0 0; color: var(--bs-danger); font-size: .8125rem; }

/* ─── Совместимость: каркас старых форм-секций ────────────────
   employee_form, center_form, users/user_form и config/settings
   раскладывают поля через .settings-grid/.settings-field (сетка
   «поле-значение»). В Bootstrap этих классов нет — восстанавливаем
   только раскладку, не трогая критичную разметку этих экранов
   (редактор расписания center_form, таблицы РМ и т.п.).            */
.settings-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: .85rem 1.5rem; align-items: start; }
.settings-field { display: flex; flex-direction: column; min-width: 0; }
.settings-field > label:first-child { font-size: .8125rem; font-weight: 500; margin-bottom: .15rem; }
.settings-field--wide { grid-column: 1 / -1; }
.settings-field .errorlist { list-style: none; padding: 0; margin: .2rem 0 0; color: var(--bs-danger); font-size: .8125rem; }
/* Облик Bootstrap только для контролов — прямых детей .settings-field
   (center_form/config-настройки без .mms-form). Селектор `>` намеренно
   не трогает поля, вложенные в таблицы (редактор расписания, РМ). */
.settings-field > input:not([type=checkbox]):not([type=radio]):not([type=color]):not([type=file]):not(.btn),
.settings-field > select,
.settings-field > textarea {
  display: block; width: 100%;
  padding: .3rem .6rem; font-size: .875rem; line-height: 1.5;
  color: var(--bs-body-color); background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color); border-radius: .375rem;
}
.settings-field > input:focus, .settings-field > select:focus, .settings-field > textarea:focus {
  outline: 0; border-color: var(--bs-primary);
  box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .2);
}

/* ─── Настройки «Общее»: строчная «таблица настроек» (метка слева | контрол справа) ─── */
.settings-rows { max-width: 780px; }
.settings-row { display: grid; grid-template-columns: 240px minmax(0, 1fr); gap: .35rem 1.25rem; align-items: center; padding: .5rem 0; border-bottom: 1px solid var(--bs-border-color); }
.settings-row:last-child { border-bottom: 0; }
.settings-row > .settings-key { font-size: .8125rem; font-weight: 500; margin: 0; color: var(--bs-body-color); }
.settings-row .settings-ctl { min-width: 0; }
.settings-row .settings-ctl input:not([type=checkbox]):not([type=radio]):not([type=color]):not([type=file]):not(.btn),
.settings-row .settings-ctl select,
.settings-row .settings-ctl textarea {
  display: block; width: 100%; padding: .3rem .6rem; font-size: .875rem; line-height: 1.5;
  color: var(--bs-body-color); background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color); border-radius: .375rem;
}
.settings-row .settings-ctl input:focus, .settings-row .settings-ctl select:focus, .settings-row .settings-ctl textarea:focus {
  outline: 0; border-color: var(--bs-primary); box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .2);
}
.settings-row .form-text, .settings-row .settings-ctl small { display: block; font-size: .75rem; color: var(--bs-secondary-color); margin-top: .15rem; }
.settings-row .errorlist { list-style: none; padding: 0; margin: .2rem 0 0; color: var(--bs-danger); font-size: .8125rem; }
.settings-row--check .settings-ctl > label { display: inline-flex; align-items: center; gap: .4rem; font-size: .875rem; margin: 0; }
.settings-row--check input[type=checkbox] { width: 1em; height: 1em; accent-color: var(--bs-primary); }
.settings-rows .settings-subhead { margin: 1.25rem 0 .25rem; font-size: .8125rem; font-weight: 600; text-transform: uppercase; letter-spacing: .4px; color: var(--bs-secondary-color); }
@media (max-width: 575.98px) { .settings-row { grid-template-columns: 1fr; align-items: start; gap: .2rem; } }

/* ─── Настройки «Модули»: карточка на модуль, подмодули — строками внутри ───
   Во всю ширину (не зажимается колонкой .settings-grid), без «рамки в рамке». */
/* Список модулей на странице «Модули» тянется во всю ширину страницы — как
   карточка с пояснением над ним и как заголовок. Прежде здесь стояло
   max-width: 900px, и список обрывался на 376px раньше соседей (замерено при
   окне 1600). Заодно убран grid-column: родитель — обычная <form> с
   display:block, правило не делало ничего и осталось от плиточной раскладки. */
.module-groups { display: flex; flex-direction: column; gap: .75rem; }
.module-groups .dashboard-group { border: 1px solid var(--bs-border-color); border-radius: .5rem; background: var(--bs-body-bg); overflow: hidden; }
.module-groups .dashboard-group-label { padding: .55rem .85rem; }
.module-groups .dashboard-group-label > label { margin: 0; font-weight: 600; }
/* Шапка группы с подмодулями — визуально отделена от строк */
.module-group > .dashboard-group-label { background: var(--bs-tertiary-bg); border-bottom: 1px solid var(--bs-border-color); }

/* Выключенное рабочее место в форме центра. Класс вешался с самого начала, а
   правила к нему не было: строка ничем не отличалась от рабочей, хотя в
   расписании такого места нет. Найдено, когда проверка классов научилась
   читать атрибуты с шаблонными вставками (v3.82). */
.wp-inactive > td { opacity: .55; }
/* Листья раздела — подписи-чипы в одну строку под тумблером. Прежде был столбец
   плиток (.module-rows/.module-tile): раздел с 9 листьями растягивал страницу «Модули»
   в простыню. Чип — только подпись (лист лицензируется вместе с разделом,
   переключателя у него нет). Классы роль-чекбоксов (.module-audience/.module-grant)
   удалены вместе со столбцом — их разметка ушла ещё при переходе на инфо-листья. */
.module-leaves { display: flex; flex-wrap: wrap; gap: .3rem .35rem; padding: .5rem .85rem; border-top: 1px solid var(--bs-border-color); background: var(--bs-body-bg); }
.module-leaves .module-leaf {
  display: inline-flex; align-items: center; gap: .3rem; white-space: nowrap;
  font-size: .8125rem; padding: .1rem .55rem; border-radius: 1rem;
  color: var(--bs-secondary-color); background: var(--bs-tertiary-bg);
  border: 1px solid var(--bs-border-color);
}
.module-leaves .module-leaf i { font-size: .75rem; opacity: .7; }

/* ─── Экран входа (standalone-шаблон registration/login.html, вне base.html) ─── */
.login-wrapper {
  display: flex; align-items: center; justify-content: center;
  min-height: 100vh; padding: 1rem; background: var(--bs-secondary-bg);
}
.login-card {
  width: 100%; max-width: 400px; padding: 2.5rem;
  background: var(--bs-body-bg); border: 1px solid var(--bs-border-color);
  border-radius: .5rem; box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .08);
}
.login-card h1 { font-size: 1.5rem; font-weight: 700; margin: 0 0 .25rem; text-align: center; }
.login-card .subtitle { text-align: center; color: var(--bs-secondary-color); margin: 0 0 2rem; }
.login-card .form-group { margin-bottom: 1rem; }
.login-card .form-group label { display: block; margin-bottom: .25rem; font-size: .8125rem; font-weight: 500; }
.login-card .form-group input {
  display: block; width: 100%; padding: .4rem .7rem; font-size: .95rem;
  color: var(--bs-body-color); background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color); border-radius: .375rem;
}
.login-card .form-group input:focus {
  outline: 0; border-color: var(--bs-primary);
  box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .2);
}
.login-card .btn { width: 100%; padding: .5rem; font-size: 1rem; }

/* Отступы плотных таблиц формы центра.
   Названы по значениям, а не «sm/md»: наборов четыре, порядка между ними нет
   (3px 4px и 2px 8px несравнимы), и семантическое имя врало бы при первом же
   использовании в другом месте.

   Зачем классы. В center_form.html было 240 инлайн-стилей, но уникальных
   наборов среди них всего 53, а повторяющиеся покрывали 217 вхождений: это не
   240 ручных решений, а горстка узоров, размноженная копированием. Одиночные
   наборы (23 штуки) оставлены как есть — там действительно ручная подгонка
   плотных таблиц расписания, и трогать её незачем. */
.pad-2-4 { padding: 2px 4px; }
.pad-3-4 { padding: 3px 4px; }
.pad-3-8 { padding: 3px 8px; }
.pad-2-8 { padding: 2px 8px; }

/* Составные наборы формы центра — вынесены вторым заходом (v3.46).
   Здесь уже не только отступы, поэтому имена по СМЫСЛУ ячейки, а не по
   значениям: набор «отступ + цвет + кегль + выравнивание» описывает роль
   элемента в таблице смен, и назвать его `.pad-2-4-grey-11` значило бы
   закрепить случайные числа вместо назначения.

   Два класса ниже уже existed в разметке как хуки для скрипта (.mirror-interval,
   .shift-dur) и не имели ни одного правила — оформление просто переехало к ним,
   новых имён не понадобилось. */
.col-sublabel {
  font-weight: 400; padding: 2px 4px;
  color: var(--bs-tertiary-color); font-size: 11px;
}
.col-group {
  font-weight: 500; padding: 2px 8px;
  color: var(--bs-secondary-color); text-align: center;
}
.mirror-interval {
  padding: 2px 4px; color: var(--bs-tertiary-color);
  font-size: 11px; text-align: center;
}
.shift-dur {
  padding: 2px 4px; color: var(--bs-secondary-color);
  font-size: 11px; text-align: center;
}
.num-narrow {
  width: 4em; height: 28px; padding: 2px 4px;
  border: 1px solid var(--border); border-radius: 4px;
  font-size: 13px; box-sizing: border-box; text-align: center;
}

/* ─── Расписание: статус записи — цветом левой кромки карточки ───
   Роли темы, а не числа: цвет состояния задаётся ролью набора стилей
   (руководство платформы, §33) и следует за темой и тёмным режимом. */
.appt-card.status-scheduled   { border-left-color: var(--bs-primary); }
.appt-card.status-confirmed   { border-left-color: var(--bs-success); }
.appt-card.status-in_progress { border-left-color: var(--bs-warning); }
.appt-card.status-done        { border-left-color: var(--bs-secondary); }
.appt-card.status-cancelled   { border-left-color: var(--bs-danger); }
.appt-card.status-no_show     { border-left-color: var(--bs-warning); }

/* ─── Классы вместо встроенных стилей ──────────────────────────
   Наборы, которые шаблоны повторяли числом в style="…", названы здесь один
   раз. !important — намеренно: класс заменяет встроенный стиль, а встроенный
   стиль перебивал любые правила; без него замена меняла бы вид там, где рядом
   стоит более частное правило. Замены и остаток — manage.py inline_styles. */
.col-act               { width: 40px !important; }  /* колонка кнопок */
.col-140               { width: 140px !important; }  /* средняя колонка */
.col-min               { width: 1% !important; }  /* колонка по содержимому */
.fs-sm                 { font-size: .8125rem !important; }  /* мелкий текст 13px */
.text-inherit          { color: inherit !important; }  /* цвет родителя */
.inverse               { background: var(--bs-emphasis-color) !important; color: var(--bs-body-bg) !important; }  /* обратные цвета */
.clickable             { cursor: pointer !important; }  /* указатель-рука */
.scroll-list           { max-height: 280px !important; }  /* список с прокруткой */
.label-tiny            { font-size: .6875rem !important; letter-spacing: .4px !important; }  /* подпись заглавными мелко */
.label-tiny-w          { font-size: .6875rem !important; letter-spacing: .5px !important; }  /* то же, разрядка шире */
.cf-label              { color: var(--bs-secondary-color) !important; padding: 3px 10px 3px 0 !important; }  /* форма центра: подпись */
.cf-head               { padding: 4px 8px !important; font-size: 12px !important; color: var(--text-muted) !important; }  /* форма центра: шапка */
.cf-num                { padding: 3px 4px !important; color: var(--bs-secondary-color) !important; font-size: 11px !important; text-align: center !important; }  /* форма центра: число */
.cf-cell               { padding: 3px 4px !important; text-align: center !important; }  /* форма центра: ячейка */
.cf-sum                { padding: 2px 8px !important; text-align: right !important; color: var(--bs-secondary-color) !important; font-size: 11px !important; }  /* форма центра: итог */
.cf-table              { border-collapse: collapse !important; width: auto !important; }  /* форма центра: таблица */
.cf-th                 { font-weight: 500 !important; padding: 2px 8px !important; color: var(--bs-secondary-color) !important; text-align: center !important; border-bottom: 1px solid var(--bs-border-color) !important; }  /* форма центра: заголовок */

/* ─── Страница: templates/chat/chat.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
.chat-layout {
  display: flex;
  gap: 0;
  border: 1px solid var(--border);
  border-radius: 4px;
  min-height: 500px;
  max-height: 70vh;
}
.chat-sidebar {
  width: 280px;
  min-width: 280px;
  border-right: 1px solid var(--border);
  overflow-y: auto;
}
.chat-main {
  flex: 1;
  display: flex;
  flex-direction: column;
}
.conv-item {
  display: block;
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
  text-decoration: none;
  color: var(--text);
  cursor: pointer;
}
.conv-item:hover {
  background: var(--bg-gray);
  text-decoration: none;
}
.conv-item.active {
  background: var(--bg-gray);
  border-left: 3px solid var(--accent);
}
.conv-title {
  font-weight: 700;
  font-size: 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.conv-preview {
  font-size: 13px;
  color: var(--text-muted);
  margin-top: 2px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.unread-badge {
  display: inline-block;
  background: var(--accent);
  color: var(--bs-white);
  font-size: 11px;
  padding: 1px 6px;
  border-radius: 10px;
  min-width: 18px;
  text-align: center;
}
.chat-messages {
  flex: 1;
  overflow-y: auto;
  padding: 16px;
}
.message {
  margin-bottom: 12px;
  max-width: 80%;
}
.message.own {
  margin-left: auto;
}
.message-sender {
  font-size: 12px;
  font-weight: 700;
  color: var(--text-muted);
  margin-bottom: 2px;
}
.message-bubble {
  background: var(--bg-gray);
  padding: 8px 12px;
  border-radius: 8px;
  font-size: 14px;
  line-height: 1.4;
  word-break: break-word;
  /* Переносы строк из текста сообщения показывает стиль. Прежде их подменял
     JS на <br>, ради чего текст приходилось экранировать вручную. */
  white-space: pre-wrap;
}
.message.own .message-bubble {
  background: var(--bs-info-bg-subtle);
}
.message-time {
  font-size: 11px;
  color: var(--text-muted);
  margin-top: 2px;
}
.chat-input {
  border-top: 1px solid var(--border);
  padding: 12px 16px;
  display: flex;
  gap: 8px;
}
.chat-input textarea {
  flex: 1;
  min-height: 38px;
  max-height: 80px;
  resize: none;
  font-family: inherit;
  font-size: 14px;
  line-height: 1.4;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: 4px;
  overflow-y: auto;
}
.chat-empty {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
}

/* ─── Страница: templates/dicts/center_form.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
/* Динамическое показ/скрытие элементов «Смены» и «Оффсеты» по чекбоксу центра.
   Действует и на колонки в таблице РМ, и на строки «Оффсет до/после» в расписании центра. */
form.center-form:not(.has-shifts) .col-shifts { display: none; }
form.center-form:not(.has-offsets) .col-offsets { display: none; }

/* ─── Страница: templates/orders/order_form.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
/* Классы-хуки JS (валидация полей, ячейки итогов, выпадашки автокомплита) —
   на токенах Bootstrap, поддержка тёмной темы. Разметка формы — Bootstrap. */
.field-hint { border-color: var(--bs-danger) !important; box-shadow: 0 0 0 .2rem rgba(var(--bs-danger-rgb), .12) !important; }
.field-error, .field-error:focus { border-color: var(--bs-danger) !important; background-color: var(--bs-danger-bg-subtle) !important; box-shadow: none !important; outline: none; }
.item-total-display { text-align: right; font-variant-numeric: tabular-nums; padding: .35rem .1rem; font-weight: 600; }

/* ─── Страница: templates/schedule/appointment_form.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
/* Хук-классы JS (сетка услуг, подсказки слотов) — токены Bootstrap. */
.services-grid { display: flex; flex-wrap: wrap; gap: .5rem; padding: .5rem 0; }
.services-grid label { display: flex; align-items: center; gap: .25rem; font-weight: 400; font-size: .875rem; padding: .25rem .5rem; border: 1px solid var(--bs-border-color); border-radius: .375rem; cursor: pointer; background: var(--bs-body-bg); transition: background .15s; }
.services-grid label:hover { background: var(--bs-secondary-bg); }
.services-grid input[type="checkbox"] { width: 16px; height: 16px; }
.slot-free { display: inline-block; padding: 2px 6px; margin: 1px; border-radius: 3px; background: var(--bs-success-bg-subtle); color: var(--bs-success-text-emphasis); cursor: pointer; font-size: 12px; }
.slot-free:hover { background: var(--bs-success-bg-subtle); }
.slot-busy { display: inline-block; padding: 2px 6px; margin: 1px; border-radius: 3px; background: var(--bs-danger-bg-subtle); color: var(--bs-danger-text-emphasis); font-size: 12px; text-decoration: line-through; cursor: default; }

/* ─── Страница: templates/schedule/calendar.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
.cal-nav { display:flex; align-items:center; gap:12px; margin-bottom:16px; flex-wrap:wrap; }
.cal-nav .week-label { font-size:18px; font-weight:700; min-width:200px; text-align:center; }
.cal-nav .view-toggle { margin-left:auto; display:flex; gap:4px; }
.center-chips { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:16px; }
.center-chip { display:inline-block; padding:4px 12px; border-radius:16px; font-size:13px; text-decoration:none; border:1px solid var(--border); color:var(--text); background:var(--bg); }
.center-chip:hover { background:var(--bg-gray); text-decoration:none; }
.center-chip.active { color:var(--bs-body-bg); border-color:transparent; }

/* Grid */
.cal-wrap { overflow-x:auto; overflow-y:auto; max-height:calc(100vh - 220px); border:1px solid var(--border); }
.cal-table { width:100%; border-collapse:collapse; table-layout:fixed; font-size:12px; }
.cal-table th { padding:4px; text-align:center; border:1px solid var(--border); background:var(--bg-gray); font-size:12px; white-space:nowrap; }
.cal-table th.time-col { width:52px; text-align:right; padding-right:6px; position:sticky; left:0; z-index:1; background:var(--bg-gray); }
.cal-table th.today { background:var(--bs-warning-bg-subtle); }
.cal-table th.weekend { color:var(--accent); }
.cal-table th.wp-hdr { font-size:11px; font-weight:600; color:var(--text-secondary); }

.cal-table td { padding:1px 2px; border:1px solid var(--border); vertical-align:top; height:26px; cursor:pointer; }
.cal-table td:hover { background:rgba(var(--bs-primary-rgb),0.06); }
.cal-table td.time-col { text-align:right; padding-right:6px; color:var(--text-muted); font-size:11px; vertical-align:middle; cursor:default; position:sticky; left:0; z-index:1; background:var(--bg); }
.cal-table td.off { background:var(--bs-secondary-bg); }
.cal-table td.today { background:var(--bs-warning-bg-subtle); }

.appt-card { display:block; padding:1px 4px; border-radius:3px; color:var(--bs-white); text-decoration:none; font-size:11px; line-height:1.3; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; border-left:3px solid transparent; margin-bottom:1px; }
.appt-card:hover { opacity:0.85; text-decoration:none; color:var(--bs-white); }
.appt-card .appt-time { font-weight:700; margin-right:2px; }
.appt-card.status-cancelled, .appt-card.status-no_show { opacity:0.5; text-decoration:line-through; }
.appt-card.no-lab { background:var(--bs-danger-bg-subtle)!important; border-left-color:var(--bs-danger)!important; color:var(--bs-danger-text-emphasis)!important; }
.appt-card[draggable="true"] { cursor:grab; }
.appt-card[draggable="true"]:active { cursor:grabbing; }
.cal-table td.drag-over { background:rgba(var(--bs-primary-rgb),0.12)!important; outline:2px dashed var(--accent); outline-offset:-2px; }

.cal-legend { display:flex; flex-wrap:wrap; gap:12px; margin-top:10px; font-size:12px; color:var(--text-secondary); }
.legend-item { display:flex; align-items:center; gap:4px; }
.legend-dot { width:10px; height:10px; border-radius:2px; display:inline-block; }
.cal-stats { margin-top:6px; font-size:13px; color:var(--text-muted); }

/* ─── Страница: templates/study/patient_studies.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
/* Зона загрузки файла (класс — хук drag&drop в JS). Токены Bootstrap. */
.file-dropzone { border: 2px dashed var(--bs-info-border-subtle); border-radius: .375rem; padding: 1.5rem; text-align: center; color: var(--bs-info-text-emphasis); cursor: pointer; transition: background .15s; }
.file-dropzone:hover { background: var(--bs-info-bg-subtle); }
.file-dropzone input[type="file"] { display: none; }

/* ─── Страница: templates/timesheet/timesheet_month.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
.ts-nav { display:flex; align-items:center; gap:12px; margin-bottom:16px; flex-wrap:wrap; }
.ts-nav .month-label { font-size:18px; font-weight:700; width:200px; text-align:center; color:var(--text); text-decoration:none; }
.ts-nav .month-label:hover { color:var(--accent); text-decoration:none; }
.ts-nav .btn { min-width:40px; text-align:center; }
.ts-nav .ts-actions { margin-left:auto; display:flex; gap:6px; }
.center-chips { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:16px; }
.center-chip { display:inline-block; padding:4px 12px; border-radius:16px; font-size:13px; text-decoration:none; border:1px solid var(--border); color:var(--text); background:var(--bg); }
.center-chip:hover { text-decoration:none; background:var(--bg-gray); }
.center-chip.active { color:var(--bs-body-bg); border-color:transparent; }

.view-toggle { display:flex; gap:4px; }
.chip-group { display:flex; flex-wrap:wrap; gap:6px; }

.ts-stats { margin-top:10px; font-size:13px; color:var(--text-muted); }

/* Month calendar grid */
.month-grid { width:100%; border-collapse:collapse; table-layout:fixed; }
.month-grid th { padding:6px 4px; font-size:12px; font-weight:700; text-align:center; border-bottom:2px solid var(--border); }
.month-grid th.weekend { color:var(--bs-danger); }
.month-grid td { border:1px solid var(--border); vertical-align:top; padding:4px 6px; height:90px; font-size:12px; }
.month-grid td.empty-cell { background:var(--bg-gray); }
.month-grid td.weekend { background:var(--bs-danger-bg-subtle); }
.month-grid td.today-cell { background:var(--bs-warning-bg-subtle); }
.month-grid td.dayoff-cell { background:var(--bs-secondary-bg); }

.month-grid .day-num { font-weight:700; font-size:14px; margin-bottom:4px; display:flex; justify-content:space-between; align-items:center; }

.day-employees { font-size:11px; line-height:1.4; }
.day-employees .emp-entry { color:var(--text-secondary); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.day-employees .emp-time { color:var(--text-muted); font-size:10px; }

/* Шапку, сайдбар и поля страницы прячет глобальный @media print
   в main.css — здесь только органы управления самой страницы. */
@media print {
  .ts-nav, .center-chips, .ts-stats { display:none !important; }
}

/* ─── Страница: templates/timesheet/timesheet_table.html ───
   Перенесено из блока <style> шаблона: правила этой страницы. */
.ts-nav { display:flex; align-items:center; gap:12px; margin-bottom:16px; flex-wrap:wrap; }
.ts-nav .month-label { font-size:18px; font-weight:700; width:200px; text-align:center; color:var(--text); text-decoration:none; }
.ts-nav .month-label:hover { color:var(--accent); text-decoration:none; }
.ts-nav .btn { min-width:40px; text-align:center; }
.ts-nav .ts-actions { margin-left:auto; display:flex; gap:6px; }
.center-chips { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:16px; }
.center-chip { display:inline-block; padding:4px 12px; border-radius:16px; font-size:13px; text-decoration:none; border:1px solid var(--border); color:var(--text); background:var(--bg); }
.center-chip:hover { text-decoration:none; background:var(--bg-gray); }
.center-chip.active { color:var(--bs-body-bg); border-color:transparent; }

.ts-table { width:100%; border-collapse:collapse; font-size:12px; table-layout:auto; }
.ts-table th { padding:4px 2px; font-size:11px; text-align:center; border-bottom:2px solid var(--border); font-weight:700; white-space:nowrap; position:sticky; top:0; z-index:3; background:var(--bg-gray); }
/* Боковые колонки (Центр, Должность, Сотрудник, См) — sticky по горизонтали; в шапке — угол (top+left) */
.ts-table th.wp-col, .ts-table th.emp-col { text-align:left; position:sticky; background:var(--bg); z-index:4; font-size:12px; padding:4px 6px; white-space:nowrap; width:1px; }
.ts-table th.wp-col { left:0; }
.ts-table th.emp-col { left:auto; }
.ts-table th.weekend { background:var(--bs-danger-bg-subtle); }
.ts-table th.today-col { background:var(--bs-warning-bg-subtle); border:1px solid var(--accent); }
.ts-table th.dayoff-col { background:var(--bs-secondary-bg); }
.ts-table th.dayoff-col .day-num { text-decoration:line-through; color:var(--text-muted); }
/* Статистические колонки справа (ДН, ФКТ, ПЛН, ВСЕГО) — минимальная ширина по содержимому */
.ts-table th.stats-col { width:1px; white-space:nowrap; padding:4px 6px; }

.ts-table td { padding:2px 1px; border:1px solid var(--border); text-align:center; vertical-align:middle; font-size:10px; white-space:nowrap; height:26px; }
.ts-table td.wp-col, .ts-table td.emp-col { text-align:left; padding:2px 6px; font-size:12px; position:sticky; background:var(--bg); z-index:1; width:1px; white-space:nowrap; }
.ts-table td.wp-col { left:0; }
.ts-table td.emp-col { left:auto; }
.ts-table td.weekend { background:var(--bs-danger-bg-subtle); }
.ts-table td.today-col { background:var(--bs-warning-bg-subtle); }
.ts-table td.dayoff-col { background:var(--bs-secondary-bg); }
.ts-table td.has-data { background:var(--bs-success-bg-subtle); }
.ts-table td.has-data.weekend { background:var(--bs-success-bg-subtle); }
.ts-table td.has-data.no-hours.no-hours-on { font-weight:700; }
.ts-table td.stats-col { font-weight:700; background:var(--bg-gray); font-size:11px; width:1px; white-space:nowrap; padding:2px 6px; }

/* Режим работы: Просмотр / План — один сегментированный контрол, активная
   половина залита акцентом. Формат ячеек (Дни/Время/Часы) оформлен так же,
   но заливкой var(--bs-emphasis-color): режим — что делаю, формат — как показано.
   Прежде это были две отдельные кнопки, отличавшиеся только прозрачностью,
   из-за чего пара читалась как «кнопка и её бледный дубль». */
.ts-mode-tabs { display:inline-flex; border:1px solid var(--border); border-radius:6px; overflow:hidden; }
.ts-mode-btn { background:var(--bg); border:none; border-right:1px solid var(--border); padding:4px 14px; font-size:13px; font-weight:500; cursor:pointer; color:var(--text); }
.ts-mode-btn:last-child { border-right:none; }
.ts-mode-btn:hover { background:var(--bg-gray); }
.ts-mode-btn.active { background:var(--bs-primary); color:var(--bs-white); }

/* Полоса режима планирования: состояние экрана видно, даже когда смотришь на
   таблицу, а выход из режима — там же, где работаешь. */
.ts-mode-bar { display:none; align-items:center; gap:8px; margin-bottom:12px; padding:8px 12px; background:var(--bs-primary-bg-subtle); border:1px solid var(--bs-primary-border-subtle); border-radius:6px; font-size:13px; }
.ts-mode-bar.visible { display:flex; }

/* Селектор формата ячеек: Дни / Время / Часы (только в режиме «Просмотр») */
.ts-format-tabs { display:inline-flex; gap:0; border:1px solid var(--border); border-radius:6px; overflow:hidden; }
.ts-format-tabs .ts-format-btn { background:var(--bg); border:none; border-right:1px solid var(--border); padding:4px 12px; font-size:13px; cursor:pointer; color:var(--text); font-weight:500; }
.ts-format-tabs .ts-format-btn:last-child { border-right:none; }
.ts-format-tabs .ts-format-btn:hover { background:var(--bg-gray); }
.ts-format-tabs .ts-format-btn.active { background:var(--bs-emphasis-color); color:var(--bs-body-bg); }

/* Цветные метки времени (ранний/поздний старт/конец) — только цвет, без жирности */
.ts-mark-blue { color:var(--bs-primary); }
.ts-mark-red { color:var(--bs-danger); }
/* Цветная длительность (режим «Часы») — не жирная, только цвет */
.ts-hours-fact.ts-hours-over { color:var(--bs-primary); }
.ts-hours-fact.ts-hours-under { color:var(--bs-danger); }

.ts-table a { color:inherit; text-decoration:none; }
.ts-table a:hover { text-decoration:underline; }
.ts-time { font-size:9px; color:inherit; display:block; line-height:1.1; font-weight:400; }
.ts-table th .ts-time { border-top:1px solid var(--border); margin-top:2px; padding-top:2px; }
/* Режим «Часы»: показываем длительности вместо ✓. Стандартный чёрный для факта и плана. */
.ts-hours-fact { font-size:10px; color:inherit; }
.ts-hours-plan { font-size:10px; color:inherit; }
.ts-table.mode-hours .ts-checkmark { display:none; }
.ts-table:not(.mode-hours) .ts-hours-fact,
.ts-table:not(.mode-hours) .ts-hours-plan { display:none; }

.ts-stats { margin-top:10px; font-size:13px; color:var(--text-muted); }

/* Bulk planning checkboxes — hidden by default, shown in planning mode */
.ts-check { position:absolute; top:1px; right:1px; z-index:3; width:13px; height:13px; cursor:pointer; accent-color:var(--danger, var(--bs-danger)); display:none; }
.ts-table td.has-data { position:relative; }
.ts-clear-bar { display:none; align-items:center; gap:8px; margin-bottom:12px; padding:8px 12px; background:var(--bs-danger-bg-subtle); border:1px solid var(--bs-danger-bg-subtle); border-radius:6px; font-size:13px; }
.ts-clear-bar.visible { display:flex; }
.ts-assign-bar { display:none; align-items:center; gap:8px; margin-bottom:12px; padding:8px 12px; background:var(--bs-secondary-bg); border:1px solid var(--bs-info-border-subtle); border-radius:6px; font-size:13px; }
.ts-assign-bar.visible { display:flex; }
.ts-assign-check { position:absolute; top:1px; left:1px; z-index:3; width:13px; height:13px; cursor:pointer; accent-color:var(--accent); display:none; }
.ts-table td.empty-cell { position:relative; }
/* Planning mode active */
.planning-mode .ts-check, .planning-mode .ts-assign-check { display:block; }
/* Запланированные (без часов) — жёлтый фон, видно что «запланировано, можно снять» */
/* Зелёный (has-hours-worked) / оранжевый (planned-only) — во всех режимах,
   чтобы сразу видеть отработанные и запланированные-но-пустые ячейки. */
.ts-table td.has-data.planned-only { background:var(--bs-warning-bg-subtle); }
.ts-table td.has-data.planned-only.weekend { background:var(--bs-warning-border-subtle); }
.ts-table td.has-data.planned-only.today-col { background:var(--bs-warning-border-subtle); }
/* Просрочено — запланированная ячейка в прошлом без заполненных часов */
.ts-table td.has-data.planned-only.no-hours { background:var(--bs-danger-bg-subtle); }
.ts-table td.has-data.planned-only.no-hours.weekend { background:var(--bs-danger-bg-subtle); }
/* Отработанные (с часами) — остаются зелёными, чекбокса нет — заблокированы */
.ts-table td.has-data.has-started-only { background:var(--bs-success-bg-subtle); }
.ts-table td.has-data.has-started-only.weekend { background:var(--bs-success-bg-subtle); }
.ts-table td.has-data.has-hours-worked { background:var(--bs-success-bg-subtle); }
.ts-table td.has-data.has-hours-worked.weekend { background:var(--bs-success-bg-subtle); }
/* Редактируемые ячейки — светло-зелёный фон + жирная нижняя граница */
.ts-table td.has-data.is-editable { background:var(--bs-success-bg-subtle); border-bottom:3px solid var(--bs-success); }
.ts-table td.has-data.is-editable.weekend { background:var(--bs-success-bg-subtle); }
/* Заблокированные ячейки (несовместимы с текущим режимом/сотрудниками) */
.planning-mode .ts-table td.locked-cell { opacity:0.35; pointer-events:none; }
.planning-mode .ts-table td.locked-cell .ts-check,
.planning-mode .ts-table td.locked-cell .ts-assign-check { cursor:not-allowed; }

@media print {
  .ts-nav, .center-chips, .ts-stats, .ts-mode-bar, .ts-clear-bar, .ts-assign-bar { display:none !important; }
  .print-header { display:block !important; }
  .ts-table td, .ts-table th { font-size:8px; padding:1px; }
}
.print-header { display:none; }
