/* Оболочка CRM (Э0) — только раскладка поверх ds-emz.css (порт Emailzavr): grid/flex, отступы и размеры токенами.
   Цветов, теней, радиусов и шрифтов здесь нет. Два места «нет в доноре» (GAP REPORT Э0) — помечены ниже. */

/* Размер текста <html data-size="s|m|l|xl"> — нет в доноре (HOOKS.md §3): ds-emz задаёт шрифт в px (--fs-base: 14px)
   и механизма размеров не имеет. m — значения донора без изменений; s/l/xl — те же токены донора, пересчитанные
   множителем 13/14, 16/14, 18/14, вместе с высотой контролов (--h-*), чтобы текст не вылезал из кнопок и полей. */
html[data-size="s"] { --fs-xs: 11px; --fs-sm: 11px; --fs-base: 13px; --fs-md: 13px; --fs-lg: 15px; --fs-xl: 19px; --fs-h4: 19px;
  --fs-h3: 22px; --fs-h2: 26px; --fs-h1: 32px; --fs-2xl: 26px; --fs-3xl: 32px; --h-xs: 24px; --h-sm: 28px; --h-md: 32px; --h-lg: 46px; }
html[data-size="l"] { --fs-xs: 14px; --fs-sm: 14px; --fs-base: 16px; --fs-md: 16px; --fs-lg: 18px; --fs-xl: 23px; --fs-h4: 23px;
  --fs-h3: 27px; --fs-h2: 32px; --fs-h1: 39px; --fs-2xl: 32px; --fs-3xl: 39px; --h-xs: 30px; --h-sm: 34px; --h-md: 39px; --h-lg: 57px; }
html[data-size="xl"] { --fs-xs: 15px; --fs-sm: 15px; --fs-base: 18px; --fs-md: 18px; --fs-lg: 21px; --fs-xl: 26px; --fs-h4: 26px;
  --fs-h3: 31px; --fs-h2: 36px; --fs-h1: 44px; --fs-2xl: 36px; --fs-3xl: 44px; --h-xs: 33px; --h-sm: 39px; --h-md: 44px; --h-lg: 64px; }

/* Движение выключено <html data-motion="off"> — нет в доноре как настройки: правило донора для
   prefers-reduced-motion (ds-emz.css), включаемое выбором сотрудника, а не только системой. */
html[data-motion="off"] *, html[data-motion="off"] *::before, html[data-motion="off"] *::after {
  animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }

/* Каркас — DSAppLayout каталога (.dsnav-layout) на всё окно: страница не прокручивается, прокручивается только
   область содержимого .sh-page; боковое меню — на всю высоту каркаса. */
.sh-layout { height: 100%; }
.sh-side { display: flex; }
.sh-sidebar { height: 100%; }
.sh-sidebar .nav-item > span:last-child { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Меню, свёрнутое до значков (DSSidebar collapsed каталога, .dsnav-sidebar.is-collapsed донора — ширина 64 px): у раздела с compact
   (карточка обращения, Э3). Подписи пунктов и бренда скрыты, название раздела — в title и aria-label ссылки. */
.sh-sidebar.is-collapsed .dsnav-sidebar__brandtext, .sh-sidebar.is-collapsed .nav-item > span:last-child { display: none; }
.sh-sidebar.is-collapsed .nav-item { justify-content: center; padding: var(--sp-2) 0; width: 40px; }
.sh-page { flex: 1 1 0; min-height: 0; overflow: auto; }   /* основа 0: длинное содержимое не сжимает верхний бар */
.sh-screen { height: 100%; display: flex; flex-direction: column; gap: var(--sp-4); }

/* Верхний бар DSTopBar: свободное место делят крошки и подпись сотрудника; при нехватке сначала ужимается подпись
   (многоточие, у неё нулевой минимум), потом крошки; кнопки не ужимаются. Кнопка «Разделы» — только там, где меню
   спрятано (≤ 720 px); там сотрудник и контур — в листе разделов. */
.sh-lead { flex: 1 1 auto; display: flex; align-items: center; gap: var(--sp-3); overflow: hidden; }
.sh-crumbs { min-width: 0; overflow: hidden; }
.sh-crumbs .dsnav-crumbs__item { min-width: 0; }
.sh-crumbs .dsnav-crumbs__item > span { overflow: hidden; text-overflow: ellipsis; }
.sh-tail { flex: 3 1 auto; justify-content: flex-end; }
.sh-tail > .btn, .sh-status, .sh-navbtn { flex: none; }
.sh-who { flex: 1 1 auto; width: 0; min-width: 0; max-width: max-content; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sh-sheet-who { gap: var(--sp-2); margin-bottom: var(--sp-3); }
@media (min-width: 721px) { .sh-navbtn, .sh-sheet-who { display: none; } }
@media (max-width: 900px) {
  .sh-crumbs .dsnav-crumbs__item:first-child, .sh-crumbs .dsnav-crumbs__item:nth-child(2) > .dsnav-crumbs__sep { display: none; }
  .sh-tail .sh-status { display: none; } }
@media (max-width: 720px) { .sh-side { display: none; } .sh-tail .sh-who { display: none; } }

/* Рамка таблицы на всю ширину и оставшуюся высоту экрана: прокрутка — только внутри .dtbl-scroll. */
.sh-table { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.sh-table__body { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.sh-table .dtbl-scroll { flex: 1 1 auto; min-height: 0; max-height: none; }
.sh-table table.dtbl { table-layout: fixed; }   /* ширины колонок — раскладкой, лишнее — многоточием ячейки донора */
.sh-table .dtbl thead th { overflow: hidden; text-overflow: ellipsis; }
.sh-table__body > :not(.dtbl-scroll) { margin: var(--sp-4); }   /* состояния (пусто, ошибка, нет прав, загрузка) — с отступом от рамки */
.sh-table > .table-pagination[hidden] { display: none; }

/* Вход: карточка формы по центру окна. */
.sh-login-page { height: 100%; display: grid; place-items: center; padding: var(--sp-4); overflow: auto; }
.sh-login { width: 100%; max-width: 400px; }
.sh-login__body { gap: var(--sp-4); }
.sh-login__body .ff__msg:empty { display: none; }

/* Общие состояния — раскладка разметки каталога (Skeleton, Empty, Alert) токенами отступов. */
.sh-sk-card, .sh-sk-table { gap: var(--sp-3); }
.sh-sk-table { padding: var(--sp-2); }
.sh-sk-row { gap: var(--sp-3); }
.sh-sk-lines { gap: var(--sp-2); }
.sh-sk-ava { width: var(--sp-10); height: var(--sp-10); flex: none; }
.sh-empty-text { margin-top: var(--sp-1); }
.sh-alert-col { gap: var(--sp-2); }
.sh-pager { gap: var(--sp-1); }
