/* Стили по методологии БЭМ, нотация своя: блок-элемент--модификатор,
   слова внутри имён — snake_case (edit_lang_bar-label, btn--secondary).
   Дефис однозначен: встречается только как разделитель блока и элемента.
   Базовые (element-level) стили — нормализация и типографика. */

/* Палитра. Вся цветовая схема выводится из одной «ручки» --hue (0–359):
   личный тон пользователя или фирменный тон компании переопределяют её
   инлайн-стилем на <html> (см. stores/theme.js и инлайн-скрипт в index.html).
   Токен объявлен дважды: сначала запасной hex под стандартный синий — для
   браузеров без oklch() (старые Android WebView, Samsung Internet), где тон
   не учитывается; затем в @supports — рабочее значение от --hue. Двойное
   объявление в одном блоке не годится: кастомное свойство не проверяется при
   разборе, победило бы последнее, а var() с oklch() стал бы невалидным.
   Тёмная схема — тот же набор под префиксом --dark-, подставляется ниже по
   prefers-color-scheme (color-scheme: light dark = «как в системе») или по
   data-theme на <html> — явному выбору пользователя; light-dark() не
   используется — в браузерах без него не было бы тем вовсе.
   Статусные цвета (зелёный/красный/янтарный) — семантика, от тона не зависят. */
:root {
  color-scheme: light dark;

  --hue: 263; /* стандартный синий (бывший #1d4ed8) */

  /* Акцент: кнопки, ссылки, бренд. */
  --accent: #2055ca;
  --dark-accent: #82aaf7;
  --accent-strong: #143e9c;
  --dark-accent-strong: #a9c8ff;
  --on-accent: #ffffff;
  --dark-on-accent: #0e182b;
  --accent-soft: #dde8fd;
  --dark-accent-soft: #23304a;
  --accent-soft-strong: #cfdffd;
  --dark-accent-soft-strong: #2c3d5d;

  /* Поверхности и текст, слегка подкрашены тоном. */
  --bg: #f5f7fb;
  --dark-bg: #10141b;
  --card: #ffffff;
  --dark-card: #1b1f28;
  --text: #161b24;
  --dark-text: #e5e8ed;
  --muted: #636975;
  --dark-muted: #9da2ab;
  --border: #dee1e7;
  --dark-border: #31353d;
  --neutral-soft: #edeef1;
  --dark-neutral-soft: #2e3036;

  /* Статусы. */
  --green: #007c32;
  --dark-green: #61da92;
  --green-soft: #d9f8e0;
  --dark-green-soft: #1e3a26;
  --red: #cc2827;
  --dark-red: #ff958d;
  --red-soft: #ffe8e6;
  --dark-red-soft: #462623;
  --amber: #a15c00;
  --dark-amber: #f3bd5c;
  --amber-soft: #fff0d0;
  --dark-amber-soft: #422f13;
}

/* Рабочие значения от тона. Hex выше — те же цвета при --hue: 263;
   при правке пары обновлять обе (client/lib/color.js oklch_to_hex) */
@supports (color: oklch(0.5 0.1 200)) {
  :root {
    --accent: oklch(0.49 0.19 var(--hue));
    --dark-accent: oklch(0.74 0.12 var(--hue));
    --accent-strong: oklch(0.4 0.16 var(--hue));
    --dark-accent-strong: oklch(0.83 0.09 var(--hue));
    --dark-on-accent: oklch(0.21 0.04 var(--hue));
    --accent-soft: oklch(0.93 0.03 var(--hue));
    --dark-accent-soft: oklch(0.31 0.05 var(--hue));
    --accent-soft-strong: oklch(0.9 0.045 var(--hue));
    --dark-accent-soft-strong: oklch(0.36 0.06 var(--hue));

    --bg: oklch(0.975 0.006 var(--hue));
    --dark-bg: oklch(0.19 0.015 var(--hue));
    --dark-card: oklch(0.24 0.018 var(--hue));
    --text: oklch(0.22 0.02 var(--hue));
    --dark-text: oklch(0.93 0.008 var(--hue));
    --muted: oklch(0.52 0.02 var(--hue));
    --dark-muted: oklch(0.71 0.015 var(--hue));
    --border: oklch(0.91 0.008 var(--hue));
    --dark-border: oklch(0.33 0.015 var(--hue));
    --neutral-soft: oklch(0.95 0.004 var(--hue));
    --dark-neutral-soft: oklch(0.31 0.01 var(--hue));

    /* Светлые варианты green/amber подобраны под контраст ≥4.5:1
       (WCAG AA для мелкого кегля) и на своих soft-фонах, и на белой карточке */
    --green: oklch(0.51 0.15 150);
    --dark-green: oklch(0.8 0.15 155);
    --green-soft: oklch(0.95 0.045 152);
    --dark-green-soft: oklch(0.32 0.05 152);
    --red: oklch(0.55 0.2 27);
    --dark-red: oklch(0.78 0.13 25);
    --red-soft: oklch(0.95 0.025 25);
    --dark-red-soft: oklch(0.31 0.05 25);
    --amber: oklch(0.54 0.14 70);
    --dark-amber: oklch(0.83 0.13 80);
    --amber-soft: oklch(0.96 0.045 85);
    --dark-amber-soft: oklch(0.32 0.05 75);
  }
}

/* Тёмная схема: системная (если пользователь не выбрал светлую явно)
   и явный выбор. Селекторы специфичнее :root — берут верх над обоими
   наборами выше независимо от порядка; список подмен один и тот же */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme='light']) {
    --accent: var(--dark-accent);
    --accent-strong: var(--dark-accent-strong);
    --on-accent: var(--dark-on-accent);
    --accent-soft: var(--dark-accent-soft);
    --accent-soft-strong: var(--dark-accent-soft-strong);
    --bg: var(--dark-bg);
    --card: var(--dark-card);
    --text: var(--dark-text);
    --muted: var(--dark-muted);
    --border: var(--dark-border);
    --neutral-soft: var(--dark-neutral-soft);
    --green: var(--dark-green);
    --green-soft: var(--dark-green-soft);
    --red: var(--dark-red);
    --red-soft: var(--dark-red-soft);
    --amber: var(--dark-amber);
    --amber-soft: var(--dark-amber-soft);
  }
}

:root[data-theme='dark'] {
  color-scheme: dark;
  --accent: var(--dark-accent);
  --accent-strong: var(--dark-accent-strong);
  --on-accent: var(--dark-on-accent);
  --accent-soft: var(--dark-accent-soft);
  --accent-soft-strong: var(--dark-accent-soft-strong);
  --bg: var(--dark-bg);
  --card: var(--dark-card);
  --text: var(--dark-text);
  --muted: var(--dark-muted);
  --border: var(--dark-border);
  --neutral-soft: var(--dark-neutral-soft);
  --green: var(--dark-green);
  --green-soft: var(--dark-green-soft);
  --red: var(--dark-red);
  --red-soft: var(--dark-red-soft);
  --amber: var(--dark-amber);
  --amber-soft: var(--dark-amber-soft);
}

/* Явная светлая перекрывает системную тёмную: :not() выше её не трогает,
   остаётся только схема элементов управления */
:root[data-theme='light'] {
  color-scheme: light;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  background: var(--bg);
  color: var(--text);
  line-height: 1.5;
}

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

a:hover {
  text-decoration: underline;
}

/* Форм-контролы: у голых select / date / number браузерные дефолты со своими
   шрифтом и паддингами — высоты разъезжаются. Единая база + явная высота:
   селект игнорирует line-height, у даты иконка календаря выше строки.
   42.5px = высота .btn (22.5 строка + 20 паддингов). */
input:where(:not([type='checkbox'], [type='radio'], [type='range'])),
select,
textarea {
  font: inherit;
  font-size: 15px;
  padding: 9px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--card);
  color: var(--text);
}

input:where(:not([type='checkbox'], [type='radio'], [type='range'])),
select {
  height: 42.5px;
}

/* iOS Safari зумит страницу при фокусе в поле мельче 16px — на узких
   экранах кегль контролов 16px (высота: 24 строка + 20 паддингов) */
@media (max-width: 640px) {
  input:where(:not([type='checkbox'], [type='radio'], [type='range'])),
  select,
  textarea {
    font-size: 16px;
  }

  input:where(:not([type='checkbox'], [type='radio'], [type='range'])),
  select {
    height: 46px;
  }
}

h1 {
  font-size: 28px;
  margin: 0 0 12px;
}

h2 {
  font-size: 22px;
  margin: 0 0 12px;
}

h3 {
  margin: 0 0 8px;
}

/* Утилита: приглушённый текст. */
.text--muted {
  color: var(--muted);
}

/* Блок: page (каркас страницы). */
.page {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

.page-main {
  flex: 1;
  width: 100%;
  max-width: 980px;
  margin: 0 auto;
  padding: 28px 20px 48px;
}

.page-footer {
  text-align: center;
  padding: 18px;
  color: var(--muted);
  font-size: 13px;
  border-top: 1px solid var(--border);
  background: var(--card);
}

/* Блок: nav (верхняя панель). Высота — минимум, не фиксация: на узком
   экране пункты переносятся, и жёсткие 60px обрезали бы второй ряд */
.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 8px 24px;
  min-height: 60px;
  row-gap: 4px;
  background: var(--card);
  border-bottom: 1px solid var(--border);
  flex-wrap: wrap;
}

.nav-brand {
  font-weight: 700;
  font-size: 18px;
  color: var(--accent-strong);
}

.nav-brand:hover {
  text-decoration: none;
}

/* Базовая линия, а не центр: пункты разного кегля (ссылки 16px, имя 14px)
   при центрировании визуально «плавают» по вертикали */
.nav-menu {
  display: flex;
  align-items: baseline;
  gap: 6px 18px;
  flex-wrap: wrap;
}

.nav-user {
  color: var(--muted);
  font-size: 14px;
}

/* Кнопка-действие в меню, выглядит как ссылка. */
.nav-link--button {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  color: var(--accent);
  cursor: pointer;
}

.nav-link--button:hover {
  text-decoration: underline;
}

/* Блок: card. */
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 20px;
  margin-bottom: 16px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
}

.card--auth {
  max-width: 420px;
  margin: 32px auto;
}

/* Блок: grid. */
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}

/* Блок: row (горизонтальная раскладка). */
.row {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  align-items: center;
}

/* Блок: btn. */
.btn {
  display: inline-block;
  background: var(--accent);
  color: var(--on-accent);
  border: none;
  padding: 10px 18px;
  border-radius: 8px;
  font: inherit; /* у <button> свои UA-шрифт и line-height — уравнивает высоту с <a> */
  font-size: 15px;
  cursor: pointer;
}

.btn:hover {
  background: var(--accent-strong);
  text-decoration: none; /* ссылки-кнопки (<a class="btn">) не подчёркиваем */
}

.btn:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.btn--secondary {
  background: var(--accent-soft);
  color: var(--accent-strong);
}

.btn--secondary:hover {
  background: var(--accent-soft-strong);
}

.btn--login {
  padding: 8px 16px;
}

/* Компактная кнопка-иконка (↑ ↓ ✕ в редакторе тренинга). */
.btn--small {
  padding: 5px 10px;
  font-size: 13px;
}

.btn--block {
  width: 100%;
}

/* Блок: field (поле формы). */
.field {
  margin-bottom: 14px;
}

.field-label {
  display: block;
  font-size: 14px;
  margin-bottom: 4px;
  color: var(--muted);
}

/* Внешний вид и высоту задаёт базовое правило для форм-контролов. */
.field-control {
  width: 100%;
}

/* Блок: search_box — живой фильтр списков (дашборд, каталог тренингов). */
.search_box {
  width: 100%;
  max-width: 340px;
  margin: 0 0 14px;
}

/* Блок: badge. */
.badge {
  display: inline-block;
  font-size: 12px;
  padding: 3px 10px;
  border-radius: 999px;
  font-weight: 600;
}

.badge--completed {
  background: var(--green-soft);
  color: var(--green);
}

.badge--in_progress {
  background: var(--amber-soft);
  color: var(--amber);
}

.badge--not_started {
  background: var(--neutral-soft);
  color: var(--muted);
}

.badge--failed {
  background: var(--red-soft);
  color: var(--red);
}

/* Блок: confirm_dialog — модалка подтверждения (components/confirm_dialog.vue).
   Нативный <dialog>: центрирование и затемнение даёт браузер. */
.confirm_dialog {
  background: var(--card);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 20px;
  /* Ширины хватает трём кнопкам в один ряд; перенос — запас узких экранов. */
  max-width: min(560px, calc(100vw - 32px));
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
}

.confirm_dialog::backdrop {
  background: rgba(0, 0, 0, 0.45);
}

.confirm_dialog-message {
  margin: 0 0 16px;
}

.confirm_dialog-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  justify-content: flex-end;
}

/* Блок: media_picker — выбор файла медиатеки из редактора текста модуля
   (components/media_picker.vue); рамка и подложка — как у confirm_dialog. */
.media_picker {
  background: var(--card);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 20px;
  width: min(720px, calc(100vw - 32px));
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
}

.media_picker::backdrop {
  background: rgba(0, 0, 0, 0.45);
}

.media_picker-title {
  margin: 0 0 12px;
}

.media_picker-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  gap: 8px;
  max-height: 50vh;
  overflow: auto;
  margin: 12px 0;
}

/* Плитка файла: кнопка, выбранная — акцентной рамкой. */
.media_picker-item {
  font: inherit;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 6px;
  border: 2px solid var(--border);
  border-radius: 8px;
  background: var(--card);
  color: var(--text);
  cursor: pointer;
  text-align: left;
}

.media_picker-item--selected {
  border-color: var(--accent);
}

.media_picker-thumb {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: contain;
  background: var(--neutral-soft);
  border-radius: 4px;
}

.media_picker-thumb--icon {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 28px;
}

.media_picker-name {
  font-size: 12px;
  overflow-wrap: anywhere;
}

/* Блок: media_admin — превью картинок в таблице медиатеки (admin/media). */
.media_admin-thumb {
  display: block;
  width: 72px;
  height: 54px;
  object-fit: contain;
  background: var(--neutral-soft);
  border-radius: 4px;
}

/* Блок: alert. */
.alert {
  padding: 12px 14px;
  border-radius: 8px;
  margin-bottom: 14px;
  font-size: 14px;
}

/* Строка перед color-mix — фолбэк для браузеров без него (те же, что без
   oklch(): rgba от hex-фолбэка токена). */
.alert--error {
  background: var(--red-soft);
  color: var(--red);
  border: 1px solid rgba(204, 40, 39, 0.3);
  border-color: color-mix(in oklab, var(--red) 30%, transparent);
}

.alert--success {
  background: var(--green-soft);
  color: var(--green);
  border: 1px solid rgba(0, 124, 50, 0.3);
  border-color: color-mix(in oklab, var(--green) 30%, transparent);
}

.alert--warn {
  background: var(--amber-soft);
  color: var(--amber);
  border: 1px solid rgba(161, 92, 0, 0.3);
  border-color: color-mix(in oklab, var(--amber) 30%, transparent);
}

/* Блок: status (однострочный отклик под контролами). Строка занята всегда,
   чтобы контролы не прыгали при появлении и исчезновении сообщения */
.status {
  min-height: 1lh;
  margin-top: 10px;
  font-size: 14px;
}

.status--ok {
  color: var(--green);
}

.status--error {
  color: var(--red);
}

/* Блок: table. */
.table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
}

.table-cell,
.table-head_cell {
  text-align: left;
  padding: 8px 10px;
  border-bottom: 1px solid var(--border);
}

.table-head_cell {
  color: var(--muted);
  font-weight: 600;
}

/* Блок: hero. */
.hero {
  text-align: center;
  padding: 36px 0 24px;
}

.hero-title {
  font-size: 38px;
}

.hero-subtitle {
  font-size: 18px;
  max-width: 640px;
  margin: 0 auto 20px;
  color: var(--muted);
}

/* Блок: timer. */
.timer {
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  color: var(--accent-strong);
}

/* Блок: question. */
.question-option {
  display: block;
  padding: 6px 0;
  cursor: pointer;
}

/* Пометка правильного варианта в тесте песочницы (correct отдаёт /start
   только superadmin — см. attempt_payload в server/routes/attempts.js) */
.question-correct_mark {
  margin-left: 6px;
  padding: 1px 8px;
  border: 1px solid rgba(0, 124, 50, 0.3);
  border-color: color-mix(in oklab, var(--green) 30%, transparent);
  border-radius: 999px;
  background: var(--green-soft);
  color: var(--green);
  font-size: 12px;
  white-space: nowrap;
}

/* Блоки: theme_switch (светлая / тёмная / как в системе)
   и lang_switch (язык интерфейса) — одинаковые пилюли в шапке */
.theme_switch,
.lang_switch {
  display: inline-flex;
  gap: 2px;
  padding: 2px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--bg);
  align-self: center; /* пилюля — не текст, по базовой линии её не выровнять */
}

.theme_switch-option,
.lang_switch-option {
  border: none;
  background: none;
  border-radius: 999px;
  padding: 2px 8px;
  font-size: 13px;
  line-height: 1.5;
  cursor: pointer;
  color: var(--muted);
}

.theme_switch-option--active,
.lang_switch-option--active {
  background: var(--accent-soft);
  color: var(--accent-strong);
}

/* Блок: hue_picker (выбор тона оформления). */
.hue_picker {
  display: flex;
  align-items: center;
  gap: 12px;
  max-width: 480px;
}

.hue_picker-slider {
  flex: 1;
  appearance: none;
  height: 12px;
  border-radius: 999px;
  cursor: pointer;
  /* спектр при фиксированной перцептивной яркости oklch; hex — те же
     цвета для браузеров без oklch() (перебивается следующим объявлением) */
  background: linear-gradient(to right, #e7729b, #e18528, #93ab2c, #00bca2, #26a9f1, #ad87ed, #e7739c);
  background: linear-gradient(
    to right,
    oklch(0.7 0.15 0),
    oklch(0.7 0.15 60),
    oklch(0.7 0.15 120),
    oklch(0.7 0.15 180),
    oklch(0.7 0.15 240),
    oklch(0.7 0.15 300),
    oklch(0.7 0.15 359)
  );
}

.hue_picker-slider::-webkit-slider-thumb {
  appearance: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--accent);
  border: 3px solid var(--card);
  box-shadow: 0 0 0 1px var(--border);
}

.hue_picker-slider::-moz-range-thumb {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--accent);
  border: 3px solid var(--card);
  box-shadow: 0 0 0 1px var(--border);
}

.hue_picker-value {
  min-width: 3ch;
  text-align: right;
  font-variant-numeric: tabular-nums;
  color: var(--muted);
}

/* Кнопка сброса всегда занимает место: если убирать её из потока, слайдер
   меняет ширину и «уезжает» из-под курсора при первом же движении ползунка */
.hue_picker-reset--hidden {
  visibility: hidden;
}

/* Образец выбранного тона (для предпросмотра без перекраски страницы). */
.hue_picker-swatch {
  flex: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1px solid var(--border);
}

/* Блок: module_nav (прогресс поэкранного чтения модулей тренинга). */
.module_nav {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: 16px;
}

.module_nav-track {
  flex: 1;
  height: 4px;
  border-radius: 2px;
  background: var(--border);
  overflow: hidden;
}

.module_nav-fill {
  display: block;
  height: 100%;
  background: var(--accent);
  transition: width 0.4s;
}

.module_nav-label {
  font-size: 13px;
  color: var(--muted);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}

/* Блок: training_layout (плеер: оглавление + содержимое этапа). */
.training_layout {
  display: grid;
  grid-template-columns: 220px minmax(0, 1fr);
  gap: 24px;
  align-items: start;
}

/* Блок: training_toc (содержание тренинга: модули и итоговый тест). */
.training_toc {
  position: sticky;
  top: 16px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.training_toc-item {
  border: 0;
  background: none;
  font: inherit;
  font-size: 14px;
  color: var(--text);
  text-align: start;
  padding: 8px 12px;
  border-radius: 8px;
  cursor: pointer;
}

.training_toc-item:hover:not(:disabled):not(.training_toc-item--active) {
  background: var(--neutral-soft);
}

/* Активный пункт выделяется только фоном и цветом: жирный шрифт шире, текст
   переносился иначе, и оглавление меняло высоту при переходе между модулями */
.training_toc-item--active {
  background: var(--accent-soft);
  color: var(--accent-strong);
}

.training_toc-item:disabled {
  color: var(--muted);
  cursor: default;
  opacity: 0.6;
}

/* Тест — отдельная группа: отступ вместо разделительной линии. */
.training_toc-item--test {
  margin-top: 16px;
}

/* Широкий режим (открыт xapi-плеер): оглавление складывается в полосу
   чипов, рамка курса получает всю ширину контейнера. Правила — копия
   мобильного блока ниже, менять синхронно */
.training_layout--wide {
  display: block;
}

.training_layout--wide .training_toc {
  position: static;
  flex-direction: row;
  overflow-x: auto;
  gap: 8px;
  margin-bottom: 16px;
  padding-bottom: 4px;
}

.training_layout--wide .training_toc-item {
  flex: 0 0 auto;
  max-width: 55vw;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  background: var(--neutral-soft);
}

.training_layout--wide .training_toc-item--active {
  background: var(--accent-soft);
}

.training_layout--wide .training_toc-item--test {
  margin-top: 0;
}

/* Узкий экран: оглавление — прокручиваемая полоса чипов над модулем;
   обрезанный край следующего чипа подсказывает прокрутку */
@media (max-width: 900px) {
  .training_layout {
    display: block;
  }

  .training_toc {
    position: static;
    flex-direction: row;
    overflow-x: auto;
    gap: 8px;
    margin-bottom: 16px;
    padding-bottom: 4px;
  }

  .training_toc-item {
    flex: 0 0 auto;
    max-width: 55vw;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    background: var(--neutral-soft);
  }

  /* Фон чипа выше по каскаду перебил бы подсветку активного пункта. */
  .training_toc-item--active {
    background: var(--accent-soft);
  }

  .training_toc-item--test {
    margin-top: 0;
  }
}

/* Блок: module_body (текст модуля). Кап меры ~70 символов: строки на всю
   карточку (940px, 100+ знаков) тяжело читать; интерактивные блоки ниже
   текста остаются на всю ширину */
.module_body {
  max-width: 70ch;
}

/* Картинки медиатеки вписываются в колонку текста (плеер и предпросмотр). */
.module_body img {
  max-width: 100%;
  height: auto;
  border-radius: 8px;
}

/* Блок: media_block (видео/аудио из медиатеки с расшифровкой). */
.media_block {
  margin: 18px 0;
}

.media_block-title {
  font-weight: 600;
  margin-bottom: 8px;
}

/* Видео не шире колонки текста и не выше экрана; тёмный фон под
   letterbox-полями вместо светлого пятна */
.media_block-video {
  display: block;
  width: 100%;
  max-width: 70ch;
  max-height: min(70vh, 640px);
  border-radius: 10px;
  background: #000;
}

.media_block-audio {
  display: block;
  width: 100%;
  max-width: 70ch;
}

.media_block-transcript {
  max-width: 70ch;
  margin-top: 10px;
  font-size: 14px;
}

.media_block-transcript_summary {
  cursor: pointer;
  color: var(--accent);
}

/* Расшифровка — плоский текст из редактора: переносы строк сохраняются. */
.media_block-transcript_text {
  white-space: pre-line;
  margin: 8px 0 0;
}

/* Блок: quiz_block (квиз-самопроверка внутри модуля). */
.quiz_block {
  border-left: 4px solid var(--accent);
  border-radius: 0 10px 10px 0;
  background: var(--neutral-soft);
  padding: 16px 18px;
  margin: 18px 0;
}

.quiz_block-label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 8px;
}

.quiz_block-scenario {
  border-left: 3px solid var(--amber);
  margin: 10px 0 14px;
  padding: 4px 12px;
  font-style: italic;
}

/* Аудио сценария и его расшифровка (сценарий) — как у media_block. */
.quiz_block-audio {
  display: block;
  width: 100%;
  max-width: 70ch;
  margin: 10px 0;
}

.quiz_block-transcript {
  max-width: 70ch;
  margin: 0 0 14px;
  font-size: 14px;
}

.quiz_block-transcript_summary {
  cursor: pointer;
  color: var(--accent);
}

.quiz_block-transcript_text {
  white-space: pre-line;
  margin: 8px 0 0;
}

.quiz_block-question {
  font-weight: 600;
  margin-bottom: 12px;
}

.quiz_block-option {
  display: block;
  width: 100%;
  text-align: left;
  font: inherit;
  font-size: 15px;
  color: var(--text);
  background: var(--card);
  border: 1.5px solid var(--border);
  border-radius: 8px;
  padding: 10px 14px;
  margin: 8px 0;
  cursor: pointer;
  transition: border-color 0.15s;
}

.quiz_block-option:hover:enabled {
  border-color: var(--muted);
}

.quiz_block-option:disabled {
  cursor: default;
}

.quiz_block-option--correct {
  border-color: var(--green);
  background: var(--green-soft);
}

.quiz_block-option--wrong {
  border-color: var(--red);
  background: var(--red-soft);
}

.quiz_block-expl {
  margin-top: 10px;
  padding: 10px 14px;
  border-radius: 8px;
  font-size: 14px;
}

.quiz_block-expl--good {
  background: var(--green-soft);
  color: var(--green);
}

.quiz_block-expl--bad {
  background: var(--red-soft);
  color: var(--red);
}

/* Блок: phishing-hunt (разбор фишингового письма: найди признаки).
   Разметку письма (__head / __body / __link / __fake-btn / [data-spot])
   поставляет содержимое модуля, классы __spot навешивает компонент. */
.phishing_hunt-counter {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 13px;
  color: var(--muted);
  margin: 14px 0 8px;
}

.phishing_hunt-counter b {
  font-size: 16px;
  color: var(--red);
  font-variant-numeric: tabular-nums;
}

.phishing_hunt-mail {
  border: 1px solid var(--border);
  border-radius: 10px;
  overflow: hidden;
  font-size: 15px;
}

.phishing_hunt-head {
  background: var(--neutral-soft);
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
}

.phishing_hunt-head > div {
  margin: 2px 0;
  color: var(--muted);
}

.phishing_hunt-body {
  padding: 16px;
}

/* Ссылка и кнопка внутри письма нарочно «чужого» синего цвета: письмо
   имитирует внешний стиль и не должно перекрашиваться темой платформы */
.phishing_hunt-link {
  color: #1a5dc8;
  text-decoration: underline;
  word-break: break-all;
}

.phishing_hunt-fake_btn {
  display: inline-block;
  background: #1a5dc8;
  color: #ffffff;
  padding: 8px 18px;
  border-radius: 6px;
  font-weight: 600;
  margin: 6px 0;
}

/* Вложение и QR-код учебного письма (сид «Фишинг во всех формах»): плашка
   файла и «картинка» кода без настоящей ссылки; цвета QR фиксированы, как у
   кнопки выше — письмо чужое и темой не перекрашивается */
.phishing_hunt-attachment {
  display: inline-block;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--neutral-soft);
  padding: 6px 10px;
}

.phishing_hunt-qr {
  display: inline-block;
  width: 96px;
  height: 96px;
  vertical-align: middle;
  background-color: #ffffff;
  background-image:
    linear-gradient(#000000, #000000), linear-gradient(#000000, #000000), linear-gradient(#000000, #000000),
    repeating-conic-gradient(#000000 0 25%, transparent 0 50%);
  background-size: 24px 24px, 24px 24px, 24px 24px, 12px 12px;
  background-position: 6px 6px, right 6px top 6px, left 6px bottom 6px, 0 0;
  background-repeat: no-repeat, no-repeat, no-repeat, repeat;
  border: 4px solid #ffffff;
  outline: 1px solid var(--border);
}

.phishing_hunt-spot {
  cursor: pointer;
  border-bottom: 2px dashed transparent;
  border-radius: 3px;
  padding: 0 2px;
  transition: background 0.15s;
}

.phishing_hunt-spot:hover {
  background: var(--amber-soft);
}

.phishing_hunt-spot--found {
  background: var(--red-soft);
  border-bottom: 2px solid var(--red);
}

.phishing_hunt-hint {
  border-left: 3px solid var(--red);
  border-radius: 0 8px 8px 0;
  background: var(--red-soft);
  padding: 8px 12px;
  margin: 8px 0;
  font-size: 14px;
}

/* Блок: hotspot_image (найди нарушения на картинке). Сцена — картинка и
   поверх неё кнопки-места: круг — центр и диаметр в процентах от размеров
   картинки (инлайн-стиль spot_style), держит aspect-ratio; прямоугольник
   (--rect) — угол и стороны без скругления. Слои — z-index из spot_layers
   (меньшее выше большего), сцена изолирует их от остальной страницы.
   У сотрудника места невидимы до находки, а курсор-указатель стоит на всей
   сцене, чтобы они не выдавали себя; в редакторе (.hotspot_editor-stage)
   видны всегда. */
.hotspot_image {
  margin: 18px 0;
}

.hotspot_image-intro {
  margin: 0 0 8px;
}

.hotspot_image-counter {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 13px;
  color: var(--muted);
  margin: 0 0 8px;
}

.hotspot_image-counter b {
  font-size: 16px;
  color: var(--red);
  font-variant-numeric: tabular-nums;
}

.hotspot_image-stage {
  position: relative;
  max-width: 70ch;
  border: 1px solid var(--border);
  border-radius: 10px;
  overflow: hidden;
  isolation: isolate;
  cursor: pointer;
  user-select: none;
}

.hotspot_image-img {
  display: block;
  width: 100%;
  height: auto;
}

.hotspot_image-spot {
  position: absolute;
  aspect-ratio: 1;
  transform: translate(-50%, -50%);
  border: 0;
  border-radius: 50%;
  padding: 0;
  margin: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  cursor: pointer;
}

.hotspot_image-spot--rect {
  aspect-ratio: auto;
  transform: none;
  border-radius: 0;
}

.hotspot_image-spot:focus-visible {
  outline: 3px solid var(--accent);
  outline-offset: 2px;
}

.hotspot_image-spot--found {
  border: 3px solid var(--red);
  background: rgba(204, 40, 39, 0.25);
  background: color-mix(in oklab, var(--red) 25%, transparent);
  cursor: default;
}

.hotspot_image-spot_num {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  min-width: 22px;
  height: 22px;
  padding: 0 6px;
  border-radius: 11px;
  background: var(--red);
  color: #ffffff;
  font-size: 13px;
  font-weight: 700;
  line-height: 22px;
}

/* Ответ на промах — плашка над точкой клика (у верхнего края — под ней);
   элемент постоянный (живая область), виден только с текстом; z-index —
   выше любого слоя мест */
.hotspot_image-miss {
  position: absolute;
  z-index: 1000;
  transform: translate(-50%, calc(-100% - 10px));
  background: var(--card);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 4px 10px;
  font-size: 13px;
  white-space: nowrap;
  pointer-events: none;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
  opacity: 0;
  transition: opacity 0.15s;
}

.hotspot_image-miss--shown {
  opacity: 1;
}

.hotspot_image-miss--below {
  transform: translate(-50%, 10px);
}

.hotspot_image-hint {
  display: flex;
  gap: 10px;
  align-items: baseline;
  border-left: 3px solid var(--red);
  border-radius: 0 8px 8px 0;
  background: var(--red-soft);
  padding: 8px 12px;
  margin: 8px 0;
  font-size: 14px;
}

.hotspot_image-hint_num {
  color: var(--red);
  font-variant-numeric: tabular-nums;
}

/* Редактор hotspot_image: клик по сцене ставит круг, протяжка рисует
   прямоугольник (черновик — пунктир поверх мест), выделенное место и его
   строка подсвечены; touch-action — протяжка пальцем не прокручивает */
.hotspot_editor-stage {
  cursor: crosshair;
  touch-action: none;
}

.hotspot_editor-draft {
  position: absolute;
  z-index: 1000;
  border: 2px dashed var(--accent);
  background: rgba(32, 85, 202, 0.15);
  background: color-mix(in oklab, var(--accent) 15%, transparent);
  pointer-events: none;
}

.hotspot_editor-spot--active {
  box-shadow: 0 0 0 3px var(--accent);
}

.hotspot_editor-shape {
  width: 150px;
}

.hotspot_editor-warn {
  flex-basis: 100%;
  margin: 0;
  font-size: 12px;
  color: var(--amber);
}

.hotspot_editor-spot_row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 8px;
  padding: 6px;
  margin: 4px -6px;
  border-radius: 8px;
}

.hotspot_editor-spot_row--active {
  background: var(--accent-soft);
}

.hotspot_editor-spot_num {
  min-width: 22px;
  height: 22px;
  border-radius: 11px;
  background: var(--red);
  color: #ffffff;
  font-size: 13px;
  font-weight: 700;
  line-height: 22px;
  text-align: center;
  margin-bottom: 10px;
}

.hotspot_editor-num {
  display: flex;
  flex-direction: column;
  width: 96px;
  font-size: 12px;
  color: var(--muted);
}

.hotspot_editor-hint {
  flex: 1;
  min-width: 200px;
}

/* Блок: password_meter (тренажёр стойкости пароля, всё локально). */
.password_meter {
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--card);
  padding: 16px 18px;
  margin: 18px 0;
}

.password_meter-tag {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 8px;
}

.password_meter-label {
  display: block;
  font-weight: 600;
  margin-bottom: 8px;
}

.password_meter-input {
  width: 100%;
  font-family: ui-monospace, 'Cascadia Mono', 'Source Code Pro', Menlo, Consolas, monospace;
}

.password_meter-bar {
  height: 8px;
  border-radius: 4px;
  background: var(--border);
  margin: 12px 0 6px;
  overflow: hidden;
}

.password_meter-fill {
  display: block;
  height: 100%;
  border-radius: 4px;
  transition: width 0.3s, background 0.3s;
}

.password_meter-fill--weak {
  background: var(--red);
}

.password_meter-fill--medium {
  background: var(--amber);
}

.password_meter-fill--good {
  background: var(--green);
}

.password_meter-verdict {
  font-size: 13px;
  color: var(--muted);
}

.password_meter-verdict--weak {
  color: var(--red);
}

.password_meter-verdict--medium {
  color: var(--amber);
}

.password_meter-verdict--good {
  color: var(--green);
}

.password_meter-note {
  font-size: 13px;
  color: var(--muted);
  margin: 10px 0 0;
}

/* Блок: edit_lang_bar (язык полей в редакторе тренинга). Панель липкая:
   страница длинная, а язык нужен в любом месте прокрутки. z-index — над
   позиционированными соседями (у контента страницы своих z-index нет). */
.edit_lang_bar {
  position: sticky;
  top: 8px;
  z-index: 10;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px 10px;
  padding: 8px 16px;
  margin-bottom: 16px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.07);
}

.edit_lang_bar-label {
  font-size: 14px;
  color: var(--muted);
}

.edit_lang_bar-hint {
  font-size: 13px;
  color: var(--muted);
}

/* Блок: editor_item (модуль или вопрос в редакторе тренинга). */
.editor_item {
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 14px;
  margin-bottom: 14px;
}

.editor_item-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 10px;
}

.editor_item-name {
  font-weight: 600;
}

/* Строка варианта ответа: радио «правильный» + текст + удаление. */
.editor_item-option {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}

.editor_item-option_text {
  flex: 1;
}

/* JSON интерактивных блоков — моноширинный. */
.editor_item-json {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 13px;
}

/* Блок: course_player — iframe xAPI-курса на контент-origin. */
.course_player {
  margin-top: 12px;
}

/* Пропорции ~слайд 16:9 + панель управления плеера: без серых полей
   сверху и снизу; кап высоты — чтобы рамка влезала в экран целиком */
.course_player-frame {
  width: 100%;
  aspect-ratio: 16 / 10;
  max-height: min(78vh, 760px);
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--card);
}

/* В полноэкранном режиме пропорции и рамка не нужны. */
.course_player-frame:fullscreen {
  aspect-ratio: auto;
  max-height: none;
  border: 0;
  border-radius: 0;
}

/* Кнопка «Во весь экран» — по виду как соседняя ссылка новой вкладки. */
.course_player-action {
  border: 0;
  padding: 0;
  background: none;
  font: inherit;
  color: var(--accent);
  cursor: pointer;
}

.course_player-action:hover {
  text-decoration: underline;
}

.course_player-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-top: 8px;
  font-size: 13px;
}

/* Блок: rich-text (визуальный редактор текста админки: contenteditable +
   тулбар; см. client/components/rich_text.vue) */
.rich_text-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-bottom: 6px;
}

.rich_text-btn {
  font: inherit;
  font-size: 13px;
  padding: 4px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--neutral-soft);
  color: var(--text);
  cursor: pointer;
}

.rich_text-btn:hover {
  background: var(--accent-soft);
}

/* Область ввода выглядит как textarea. */
.rich_text-area {
  font-size: 15px;
  padding: 9px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--card);
  color: var(--text);
  min-height: 120px;
}

.rich_text-area:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 1px;
}

.rich_text-area--line {
  min-height: auto;
  padding: 4px 8px;
  flex: 1;
}

/* Встроенный в чужую рамку (письмо фишинга) — без своей. */
.rich_text-area--bare {
  border: none;
  border-radius: 6px;
  background: transparent;
  padding: 4px 6px;
}

/* Подсказка пустого поля — как placeholder у input. */
.rich_text-area:empty::before {
  content: attr(data-placeholder);
  color: var(--muted);
  pointer-events: none;
}

/* Блок: blocks-editor (формы интерактивных блоков модуля). */
.blocks_editor-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 8px;
}

/* Карточка блока: чуть утоплена относительно карточки модуля. */
.blocks_editor-card {
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--neutral-soft);
  padding: 12px;
  margin-bottom: 10px;
}

.blocks_editor-card .field-control,
.blocks_editor-card .editor_item-option_text {
  background: var(--card);
}

/* Блок: phishing-editor (конструктор фишингового письма). */
.phishing_editor-mail {
  background: var(--card);
}

/* Строка шапки письма: метка + однострочный редактор. */
.phishing_editor-head_row {
  display: flex;
  align-items: center;
  gap: 6px;
}

/* Пометки-признаки в редактируемом письме — визуально как «найденные»
   у сотрудника: автор видит, что уже размечено */
.phishing_editor-mail [data-spot] {
  background: var(--red-soft);
  border-bottom: 2px dashed var(--red);
  border-radius: 3px;
  padding: 0 2px;
}

.phishing_editor-hint_row {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin: 8px 0;
}

/* Номер подсказки — в тон пометке в письме. */
.phishing_editor-hint_num {
  flex: none;
  min-width: 26px;
  text-align: center;
  font-weight: 600;
  color: var(--red);
  background: var(--red-soft);
  border-radius: 6px;
  padding: 4px 6px;
}

.phishing_editor-hint_warn {
  color: var(--amber);
  font-size: 13px;
  margin: 4px 0 0;
}

/* Блок: module_preview (живой предпросмотр модуля в редакторе). */
.module_preview {
  border: 1px dashed var(--border);
  border-radius: 10px;
  margin-top: 12px;
}

.module_preview-summary {
  cursor: pointer;
  padding: 10px 14px;
  font-weight: 600;
  color: var(--muted);
}

.module_preview-frame {
  border-top: 1px dashed var(--border);
  padding: 14px;
}

/* Заглушка xapi-курса: в предпросмотре ничего не запускается. */
.module_preview-xapi {
  border: 1px dashed var(--border);
  border-radius: 10px;
  padding: 14px;
  margin: 10px 0;
  color: var(--muted);
  font-size: 14px;
}

/* Короткие поля (подсказки фишинга) — без высоты «на абзацы». */
.rich_text-area--compact {
  min-height: 48px;
}

/* Блок: check_option (чекбокс или радио с подписью в одну строку — группы
   в формах панели компании, строки people_picker) */
.check_option {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 14px;
  cursor: pointer;
}

/* Блок: people_picker (выбор людей из списка сотрудников: поиск,
   чекбоксы, выбранные чипсами — состав группы и аудитория потока) */
.people_picker {
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 10px;
}

.people_picker-search {
  width: 100%;
  margin-bottom: 8px;
}

.people_picker-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 8px;
}

.people_picker-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 8px;
  border-radius: 999px;
  background: var(--accent-soft);
  font-size: 13px;
}

.people_picker-chip_remove {
  border: none;
  background: none;
  color: inherit;
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
}

.people_picker-list {
  list-style: none;
  margin: 0;
  padding: 0;
  max-height: 260px;
  overflow-y: auto;
}

.people_picker-item {
  padding: 3px 0;
}

.people_picker-note {
  margin: 8px 0 0;
  font-size: 13px;
}
