/* 08-utils.css — часть дизайн-системы портала (см. docs/design_system.md).
 *
 * ⚠ ПОРЯДОК ПОДКЛЮЧЕНИЯ ЗНАЧИМ. Файлы грузятся по номеру в имени, и поздние
 * правила перекрывают ранние. Список <link> — в templates/base.html; менять
 * порядок или вставлять файл в середину нельзя, не проверив каскад.
 *
 * Утилиты. Идут последними, поэтому перекрывают компоненты.
 *
 * ⚠ Утилита оправдана, когда приём ПОВТОРЯЕТСЯ в разных шаблонах. Разовую
 * мелочь (ширина одной колонки, max-width одной страницы) оставляем инлайном —
 * §9 дизайн-системы это прямо разрешает. Плодить .w-80 / .mt-16 не нужно:
 * это тот же хардкод, просто переехавший из шаблона в CSS.
 */

/* Горизонтальная прокрутка широкой таблицы (отчёты, опоздания, звонки) */
.table-scroll { overflow-x: auto; }

/* Итоговая строка таблицы: отбивка сверху + жирные цифры */
.row-total { border-top: 2px solid var(--line); font-weight: 800; }

/* Узкая панель формы — карточки создания/правки в Кадрах */
.panel-narrow { max-width: 640px; }

/* Числовые акценты в таблицах */
.txt-danger { color: var(--danger); }
.txt-danger-b { color: var(--danger); font-weight: 600; }

.nowrap { white-space: nowrap; }

/* Размеры inline-SVG внутри текста. У SVG нет font-size, поэтому размер
   задаётся явно; vertical-align сажает иконку на базовую линию строки. */
.ico-xs { width: 12px; height: 12px; }
.ico-sm { width: 15px; height: 15px; vertical-align: -2px; }
.ico-md { width: 18px; height: 18px; vertical-align: -3px; }
.ico-brand { color: var(--brand); }

/* Селект-фильтр, который не должен растягиваться по самому длинному варианту
   (у <select> нет возможности сжаться ниже контента даже во flex-wrap — без
   ограничения он уводил страницу вбок). Обрезаем длинное название многоточием.
   Повторяется в партиале фильтра по подразделению и его копии в «Не отметившиеся». */
.select-clamp { max-width: 260px; min-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }


/* ============================================================================
   Утилиты раскладки и текста — выжимка из Bootstrap 5.1.3 (см. 00-base.css).
   Оставлены только используемые в шаблонах. Почти все с !important — это
   поведение самого Bootstrap, менять его нельзя: на нём держится вёрстка.
   ⚠ Новые утилиты добавлять ВЫШЕ, в «свой» блок, а не в эту выжимку.
   ============================================================================ */
.align-middle {vertical-align:middle!important}
.d-block {display:block!important}
.d-grid {display:grid!important}
.d-flex {display:flex!important}
.d-inline-flex {display:inline-flex!important}
.d-none {display:none!important}
.w-100 {width:100%!important}
.h-100 {height:100%!important}
.flex-fill {flex:1 1 auto!important}
.flex-grow-1 {flex-grow:1!important}
.flex-wrap {flex-wrap:wrap!important}
.gap-1 {gap:.25rem!important}
.gap-2 {gap:.5rem!important}
.gap-3 {gap:1rem!important}
.justify-content-center {justify-content:center!important}
.justify-content-between {justify-content:space-between!important}
.align-items-start {align-items:flex-start!important}
.align-items-end {align-items:flex-end!important}
.align-items-center {align-items:center!important}
.align-items-baseline {align-items:baseline!important}
.m-0 {margin:0!important}
.my-2 {margin-top:.5rem!important;margin-bottom:.5rem!important}
.my-3 {margin-top:1rem!important;margin-bottom:1rem!important}
.mt-1 {margin-top:.25rem!important}
.mt-2 {margin-top:.5rem!important}
.mt-3 {margin-top:1rem!important}
.mt-4 {margin-top:1.5rem!important}
.mb-0 {margin-bottom:0!important}
.mb-1 {margin-bottom:.25rem!important}
.mb-2 {margin-bottom:.5rem!important}
.mb-3 {margin-bottom:1rem!important}
.mb-4 {margin-bottom:1.5rem!important}
.ms-1 {margin-left:.25rem!important}
.ms-2 {margin-left:.5rem!important}
.ms-3 {margin-left:1rem!important}
.ms-auto {margin-left:auto!important}
.p-0 {padding:0!important}
.p-3 {padding:1rem!important}
.p-4 {padding:1.5rem!important}
.px-3 {padding-right:1rem!important;padding-left:1rem!important}
.py-2 {padding-top:.5rem!important;padding-bottom:.5rem!important}
.py-4 {padding-top:1.5rem!important;padding-bottom:1.5rem!important}
.pt-0 {padding-top:0!important}
.fw-normal {font-weight:400!important}
.fw-bold {font-weight:700!important}
.text-start {text-align:left!important}
.text-end {text-align:right!important}
.text-center {text-align:center!important}
.text-decoration-none {text-decoration:none!important}
.text-nowrap {white-space:nowrap!important}
.text-warning {--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}
.text-danger {--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}
.text-dark {--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}
.text-muted {--bs-text-opacity:1;color:#6c757d!important}

/* --- Наши утилиты, которых в Bootstrap 5.1.3 нет --- */
/* .fw-semibold появился только в Bootstrap 5.2 — у нас 5.1.3, поэтому класс
   в шаблонах ничего не делал. Объявляем сами. */
.fw-semibold { font-weight: 600 !important; }


/* ============================================================================
   Утилиты раскладки и текста — выжимка из Bootstrap 5.1.3 (см. 00-base.css).
   Оставлены только используемые в шаблонах. Почти все с !important — так
   устроен сам Bootstrap, и на этом держится вёрстка; убирать нельзя.
   ⚠ Новые утилиты добавлять ВЫШЕ, в свой блок, а не внутрь выжимки.
   ============================================================================ */
.align-middle {vertical-align:middle!important}
.d-block {display:block!important}
.d-grid {display:grid!important}
.d-flex {display:flex!important}
.d-inline-flex {display:inline-flex!important}
.d-none {display:none!important}
.w-100 {width:100%!important}
.h-100 {height:100%!important}
.flex-fill {flex:1 1 auto!important}
.flex-grow-1 {flex-grow:1!important}
.flex-wrap {flex-wrap:wrap!important}
.gap-1 {gap:.25rem!important}
.gap-2 {gap:.5rem!important}
.gap-3 {gap:1rem!important}
.justify-content-center {justify-content:center!important}
.justify-content-between {justify-content:space-between!important}
.align-items-start {align-items:flex-start!important}
.align-items-end {align-items:flex-end!important}
.align-items-center {align-items:center!important}
.align-items-baseline {align-items:baseline!important}
.m-0 {margin:0!important}
.my-2 {margin-top:.5rem!important;margin-bottom:.5rem!important}
.my-3 {margin-top:1rem!important;margin-bottom:1rem!important}
.mt-1 {margin-top:.25rem!important}
.mt-2 {margin-top:.5rem!important}
.mt-3 {margin-top:1rem!important}
.mt-4 {margin-top:1.5rem!important}
.mb-0 {margin-bottom:0!important}
.mb-1 {margin-bottom:.25rem!important}
.mb-2 {margin-bottom:.5rem!important}
.mb-3 {margin-bottom:1rem!important}
.mb-4 {margin-bottom:1.5rem!important}
.ms-1 {margin-left:.25rem!important}
.ms-2 {margin-left:.5rem!important}
.ms-3 {margin-left:1rem!important}
.ms-auto {margin-left:auto!important}
.p-0 {padding:0!important}
.p-3 {padding:1rem!important}
.p-4 {padding:1.5rem!important}
.px-3 {padding-right:1rem!important;padding-left:1rem!important}
.py-2 {padding-top:.5rem!important;padding-bottom:.5rem!important}
.py-4 {padding-top:1.5rem!important;padding-bottom:1.5rem!important}
.pt-0 {padding-top:0!important}
.fw-normal {font-weight:400!important}
.fw-bold {font-weight:700!important}
.text-start {text-align:left!important}
.text-end {text-align:right!important}
.text-center {text-align:center!important}
.text-decoration-none {text-decoration:none!important}
.text-nowrap {white-space:nowrap!important}
.text-warning {--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}
.text-danger {--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}
.text-dark {--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}
.text-muted {--bs-text-opacity:1;color:#6c757d!important}

/* Текст только для скринридера: визуально скрыт, но озвучивается.
   Нужен там, где состояние передаётся цветом/значком (WCAG 1.4.1). */
.visually-hidden {
    position: absolute !important; width: 1px !important; height: 1px !important;
    padding: 0 !important; margin: -1px !important; overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border: 0 !important;
}

/* Моноширинный текст — коды, идентификаторы (ISBN, имя файла и т.п.), а не
   только числа: тот же шрифт, что и у остальных «технических» значений на
   портале (даты в .thx-date, номер в .cset-row-num), но не завязан на них —
   приём повторяется в разных местах, поэтому вынесен в утилиту. */
.text-mono { font-family: 'IBM Plex Mono', monospace; }
