/*
 * Общий слой стилей панели tamtyt — поверх собранного styles.css Metronic 9.5.
 *
 * styles.css — сборка пакета без JIT: класса, которого нет в ней и здесь,
 * не существует. Этот файл подключают layouts/partials/head.blade.php (панель
 * и страницы входа) и страницы ошибок; он идёт сразу после styles.css.
 * Справочник для разделов — conventions.md рядом с отчётом UX/UI-ревью.
 *
 * Слои. В styles.css порядок задан так: theme, base, components, utilities;
 * правило без слоя сильнее любого слоя.
 *   1. @layer utilities  — утилиты, которых нет в сборке. Ведут себя как
 *      Tailwind: перебивают компоненты, уступают <style> страницы.
 *   2. @layer components — правки компонентов KTUI и свои компоненты tt-*.
 *      Утилиты на том же элементе их перебивают.
 *   3. Без слоя — то, что обязано перебить и утилиты, и стили вендоров.
 *
 * Правило, нужное больше чем одному экрану, кладём сюда, а не в
 * @push('styles') страницы.
 */

/* ===================================================================
   1. Утилиты, которых нет в сборке
   =================================================================== */
@layer utilities {
 /* Текст только для экранного диктора: подпись поля без видимой подписи,
    «Действия» в шапке таблицы, итог действия в aria-live. */
 .sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border-width: 0;
 }

 .self-start {
  align-self: flex-start;
 }

 /* Поворот значка: шеврон свёрнутого вопроса (survey-builder.js). */
 .rotate-180 {
  rotate: 180deg;
 }

 /* Маркеры списка: preflight снимает их у всех ul. Отступ — ps-5 рядом. */
 .list-disc {
  list-style-type: disc;
 }

 /* Перенос: абзацы в тексте ответа, длинные слова и адреса почты. */
 .whitespace-pre-line {
  white-space: pre-line;
 }

 .break-words {
  overflow-wrap: break-word;
 }

 .wrap-anywhere {
  overflow-wrap: anywhere;
 }

 /* Подписи групп меню в тёмной теме: text-muted-foreground — zinc-500 на
    zinc-950, 4,1:1 при норме 4,5:1; zinc-400 даёт около 8:1. В слое утилит,
    чтобы перебить text-muted-foreground на том же элементе. */
 .dark .kt-menu-heading {
  color: var(--color-zinc-400);
 }
}

/* ===================================================================
   2. Компоненты
   =================================================================== */
@layer components {
 /* Ссылка «Перейти к содержимому» — первая в body (layouts/app). Видна
    только в фокусе: с клавиатуры не нужно проходить всё меню. */
 .tt-skip {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border-width: 0;
 }

 .tt-skip:focus {
  position: fixed;
  top: calc(var(--spacing) * 2);
  inset-inline-start: calc(var(--spacing) * 2);
  z-index: 70;
  width: auto;
  height: auto;
  margin: 0;
  padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3);
  overflow: visible;
  clip-path: none;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background-color: var(--background);
  color: var(--foreground);
  font-size: var(--text-sm);
  font-weight: var(--font-weight-medium);
  outline: 2px solid var(--primary);
  outline-offset: 2px;
 }

 /* <main id="content" tabindex="-1"> получает фокус по этой ссылке —
    рамка вокруг всей страницы не нужна. */
 #content:focus {
  outline: none;
 }

 /* Значок плашки. В kt-alert-light KTUI красит только svg, а значки панели —
    шрифт keenicons (<i class="ki-filled …">): цвет — как у svg, размер 18px
    по центру строки 20px — вровень с первой строкой текста (text-sm).
    line-height у <i> задаёт keenicons без слоя, поэтому выравнивает
    контейнер. */
 .kt-alert .kt-alert-icon:has(> i) {
  display: flex;
  align-items: center;
  height: 1.25rem;
 }

 .kt-alert .kt-alert-icon > i {
  font-size: var(--text-lg);
 }

 .kt-alert-light .kt-alert-icon > i {
  color: var(--muted-foreground);
 }

 .kt-alert-light.kt-alert-primary .kt-alert-icon > i {
  color: var(--primary);
 }

 .kt-alert-light.kt-alert-success .kt-alert-icon > i {
  color: var(--color-green-500);
 }

 .kt-alert-light.kt-alert-info .kt-alert-icon > i {
  color: var(--color-violet-500);
 }

 .kt-alert-light.kt-alert-warning .kt-alert-icon > i {
  color: var(--color-yellow-500);
 }

 .kt-alert-light.kt-alert-destructive .kt-alert-icon > i {
  color: var(--destructive);
 }

 /* Ошибка поля. KTUI прячет .kt-form-message всегда, кроме случая «внутри
    .kt-form-item есть поле с aria-invalid="true"». Сообщение вне обёртки
    сервер вывел, а человек его не видит — показываем: @error выводит его
    только при ошибке. Внутри .kt-form-item работает правило KTUI. */
 .kt-form-message:not(.kt-form-item .kt-form-message) {
  display: block;
  margin-top: 0;
 }

 /* Радио без выбора в группе браузер считает :indeterminate, а KTUI красит
    это состояние как выбранное (рассчитано на флажки): невыбранные варианты
    выглядели залитыми. У радио «частично» не бывает — рисуем как пустое. */
 .kt-radio:indeterminate,
 .kt-radio-mono:indeterminate {
  border-color: var(--input);
  background-color: var(--background);
  color: inherit;
 }

 .kt-radio[aria-invalid="true"]:indeterminate {
  border-color: var(--destructive);
 }

 /* Кольцо фокуса с клавиатуры. В KTUI у ссылок кольцо neutral-200 (около
    1,25:1 на белом), у кнопок, флажков и переключателей — --ring, zinc-400
    (около 2,6:1). Синий --primary (раздел 3) даёт около 5,2:1 при норме 3:1. */
 .kt-link:focus-visible,
 .kt-link:is(.dark *):focus-visible,
 .kt-btn:focus-visible,
 .kt-checkbox:focus-visible,
 .kt-radio:focus-visible,
 .kt-switch:focus-visible {
  --tw-ring-color: var(--primary);
 }

 /* Горизонтальная прокрутка таблицы. Полоса KTUI — цвета --input (zinc-200
    на белом): прокрутку не замечают. Здесь заметнее, и только у таблиц. */
 .kt-scrollable-x-auto:has(> table) {
  --scrollbar-thumb-color: var(--color-zinc-400);
 }

 .dark .kt-scrollable-x-auto:has(> table) {
  --scrollbar-thumb-color: var(--color-zinc-600);
 }

 /* Опасная кнопка в ряду обычных: тот же контур, что у соседей, красный
    текст (заказчик 30.09.2026 про удаление каталога). Один класс вместо
    копий .sv-btn-danger и .ct-btn-danger. */
 .kt-btn.kt-btn-outline.tt-btn-danger,
 .kt-btn.kt-btn-outline.tt-btn-danger i {
  color: var(--destructive);
 }

 .kt-btn.kt-btn-outline.tt-btn-danger:hover,
 .kt-btn.kt-btn-outline.tt-btn-danger:focus-visible {
  border-color: var(--destructive);
  background-color: color-mix(in oklab, var(--destructive) 8%, transparent);
 }

 /* В тёмной теме red-600 на zinc-950 — 4,2:1, red-500 — 5:1. */
 .dark .kt-btn.kt-btn-outline.tt-btn-danger,
 .dark .kt-btn.kt-btn-outline.tt-btn-danger i {
  color: var(--color-red-500);
 }

 /* Шеврон в <summary>: смотрит вверх, пока <details> открыт. */
 details[open] > summary .tt-chevron {
  rotate: 180deg;
 }
}

/* ===================================================================
   3. Без слоя: должно перебить и утилиты, и стили вендоров
   =================================================================== */

/* Основной синий светлой темы. В сборке --primary — blue-500: ссылки 13px
   на белом и белый текст на kt-btn-primary — около 3,8:1 при норме 4,5:1.
   blue-600 — около 5,2:1. В тёмной теме сборка и так берёт blue-600.
   :not(.dark) сильнее :root сборки и тёмную тему не трогает. */
:root:not(.dark) {
 --primary: var(--color-blue-600);
}

/* Кадр превью в конструкторе (#sp_frame) показывает виджет таким, каким его
   увидит посетитель. На сайте клиента акцент виджета — blue-500 литералом
   (resources/js/widget/widget.css), поэтому внутри кадра токен прежний. */
:root:not(.dark) .sp-viewport {
 --primary: var(--color-blue-500);
}

/* Многострочные поля. У .kt-input жёсткая высота 34px, и rows у
   <textarea class="kt-input"> не действовал: поле показывало одну строку
   (заказчик 30.09.2026). rows="4" — 92px, обычные поля остаются 34px. */
textarea.kt-input {
 height: auto;
 padding-block: calc(var(--spacing) * 2);
 resize: vertical;
}

/* Логотип (layouts/partials/logo.blade.php): буквы — фирменный тёмно-синий,
   в тёмной теме — цвет заголовков; точка — своим цветом в самом SVG. */
.tt-logo {
 flex-shrink: 0;
 color: #1E3768;
}

.dark .tt-logo {
 color: var(--mono);
}

/* iOS Safari увеличивает страницу, когда фокус попадает в поле с кеглем
   меньше 16px; у .kt-input и .kt-select — 13px. */
@media (max-width: 767.98px) {
 .kt-input,
 .kt-input input,
 .kt-select,
 .kt-textarea {
  font-size: 16px;
 }
}

/* Подписи осей ApexCharts в тёмной теме. Графики панели красят их
   var(--color-muted-foreground) — zinc-500 на zinc-950, 4,1:1. CSS
   перебивает атрибут fill и действует при смене темы без перезагрузки. */
.dark .apexcharts-xaxis-label,
.dark .apexcharts-yaxis-label {
 fill: var(--color-zinc-400);
}
