/*
 * Freedom UTM — ОФОРМЛЕНИЕ БАЗОВОЙ КАРТЫ (E132, 31.08.2026).
 *
 * ЧТО ЗДЕСЬ. Стили ровно той разметки, которую собирает `public/js/
 * map-base.js`: движки, полоса вида, блок «Слои», подвал со шкалой времени,
 * угол показаний, подпись измерения. Ни одного правила, относящегося к
 * конкретному кабинету.
 *
 * 🔴 ЗАЧЕМ ОТДЕЛЬНЫМ ФАЙЛОМ. С 30.08.2026 (E120) разметка базовой карты
 * ВСТАВЛЯЕТСЯ, а не копируется. Оформление же оставалось в `app/css/
 * shell.css` — то есть карта, вставленная в публичную страницу, приезжала бы
 * туда БЕЗ СТИЛЕЙ. Подключить к публичной карте весь `shell.css` нельзя: там
 * своя оболочка кабинета (навигация, колонки, формы) и свои `.btn`/`.seg`,
 * которые столкнулись бы с `public/css/map.css`. Поэтому оформление карты
 * переехало СЮДА и подключается там же, где сама карта.
 *
 * ⚠️ ЭТО ПЕРЕЕЗД, А НЕ НОВЫЕ ПРАВИЛА. Каждое правило взято из `shell.css` как
 * есть, вместе с записанными причинами (E84 — контраст над подложками,
 * E103/E107 — два блока вместо пяти кластеров, E111 — часы сцены заметны,
 * E118/E119 — угол показаний и группа инструментов, E123 — подпись наброска,
 * E126 — подвал карты как объявленное место, E127 — календарь и полоса).
 *
 * ⚠️ ТОКЕНЫ ЦВЕТА И ФОРМЫ ЗДЕСЬ НЕ ОБЪЯВЛЯЮТСЯ. Их даёт страница: кабинету —
 * `app/css/shell.css`, публичным экранам — `public/css/tokens.css`. Файл
 * подключается ДО них по этой же причине: страница должна иметь возможность
 * переопределить, а не наоборот.
 *
 * ПОДКЛЮЧЕНИЕ: `static/app/cabinet.html` и `static/public/map.html`.
 */

/* Сцена карты: единственный позиционирующий предок для движков и плавающих
   контролов. `min-width: 0` обязателен — без него grid-элемент не сжимается
   ниже содержимого канвы, и панель выдавливается за край окна.
   (Переехало из `app/css/shell.css` 31.08.2026, E132: правило про карту, а не
   про оболочку кабинета.) */
.map-stage {
  position: relative;
  min-width: 0;
  overflow: hidden;
}

.map-panel__engine {
  position: absolute;
  inset: 0;
}

.map-panel__engine-el {
  width: 100%;
  height: 100%;
}

/* Общий якорь для плавающих панелей поверх карты.
 *
 * 🔴 E222 (19.09.2026): ЯЩИК ПРОЗРАЧЕН ДЛЯ МЫШИ, СОДЕРЖИМОЕ — НЕТ.
 *
 * ЧЕМ ЭТО БЫЛО. У правила стояли только `position` и `z-index`, то есть якорь
 * брал клики всей своей площадью — а площадь у него не своя, а натянутая на
 * угол карты: `.map-overlay--top-right` притянут И за `top`, И за `bottom`
 * (E84, чтобы «Слои» прокручивались, а не обрезались), значит он высотой во
 * всю карту ВСЕГДА, сколько бы кнопок в нём ни лежало. ЗАМЕРЕНО в браузере на
 * кабинете (окно 1280×720, холст 648×332): ящик 294×268 px поверх правой
 * половины карты, из 273 точек середины карты 74 забирал ОН САМ — пустое
 * место, где человек видит карту и только карту.
 *
 * ЧТО ЭТО ЛОМАЛО, СЛОВАМИ: третий клик при рисовании маршрута попадал в
 * пустоту ящика (замер: клик 1 → `DIV.map-overlay`, клик 2 → холст, клик 3 →
 * `DIV.map-overlay`; «Точек в маршруте: 1» вместо 3), «Готово» оставляло форму
 * запертой (E106) и подача срывалась — ровно то, что владелец показывает на
 * демо. И подсказка зоны (E78) не появлялась: с раскрытыми «Слоями» ящик
 * расширяется до `max-width` и накрывает СЕРЕДИНУ карты, наведение до холста
 * не доходит.
 *
 * ПРИЁМ НЕ НОВЫЙ, И ВТОРОГО ЗАВОДИТЬ НЕЛЬЗЯ. Тот же класс дефекта уже решён
 * для пульта УВД (E141, `app/css/atc.css`: `.atc-bottom` + `.atc-bottom > *`),
 * для баннера уведомлений (E154, `app/css/shell.css`: `.notif-banner`) и для
 * значков слоёв (`shell.css`: `.freedom-map-layer-badges`). Правило одно:
 * контейнер прозрачен для мыши, а то, что в нём НАРИСОВАНО, — нет.
 *
 * ⚠️ ЧЕСТНАЯ ОГОВОРКА ПРО ПРОКРУТКУ, та же, что записана у E154. Колесо мыши
 * прокручивает колонку НАД её содержимым (у детей `pointer-events: auto`, а
 * прокрутка уходит по цепочке предков в DOM, а не по попаданию мыши) — но не
 * над пустым местом между блоками и не за полосу прокрутки мышью. Это плата за
 * то, что пустое место возвращено карте, и она названа заранее, а не найдена
 * потом.
 *
 * ⚠️ ПОЧЕМУ `> *`, А НЕ ПЕРЕЧЕНЬ ДЕТЕЙ ПОИМЁННО (в отличие от `.atc-top`, где
 * перечень осознан): состав этой колонки решает ЭКРАН — `map-base.js::mount`
 * кладёт в неё навигатор, баннеры и «Слои» по частям, которые запросил экран,
 * и завтра появится четвёртая часть. Перечень поимённо означал бы, что новая
 * часть молча окажется ненажимаемой. */
.map-overlay {
  position: absolute;
  z-index: 10;
  pointer-events: none;
}

.map-overlay > * { pointer-events: auto; }

/* Стопка баннеров — ТАКОЙ ЖЕ ПУСТОЙ ЯЩИК, только этажом ниже: она ничего не
   рисует, а лишь раскладывает баннеры в колонку (E84). Правило выше вернуло бы
   ей мышь целиком вместе с зазором между чипами.
   ЗАМЕРЕНО 19.09.2026 при обоих показанных баннерах («Загружаю слои карты…» и
   «неполная картина неба» — оба состояния живые): зазор 0,4rem на всю ширину
   колонки забирал 377 точек замера. Отбор из ДВУХ классов взят нарочно — он
   весит больше, чем `.map-overlay > *`, и потому не зависит от того, в каком
   порядке правила окажутся в файле после следующей правки. */
.map-overlay .map-overlay__status-stack { pointer-events: none; }
.map-overlay .map-overlay__status-stack > * { pointer-events: auto; }

/* ═══════════════════════════════════════════════════════════════════════════
   E142 (01.09.2026): ОДИН ИСТОЧНИК ШРИФТА ДЛЯ ВСЕХ НАДПИСЕЙ КАРТЫ.

   🔴 ЧТО БЫЛО. Надписи карты набирались ПЯТЬЮ местами и ЧЕТЫРЬМЯ гарнитурами:
   строка состояния пульта и показания курсора — основным текстовым, подпись
   линейки в ПЛОСКОМ виде — заголовочным (Geologica), та же подпись в ОБЪЁМНОМ
   виде — системным `system-ui` (вообще не нашим), отметка высотомера —
   моноширинным. Одна и та же подпись линейки МЕНЯЛА ГАРНИТУРУ при переключении
   вида карты. Нашёл владелец глазами, а не проверка.

   ⚠️ ЗДЕСЬ — РОЛЬ, А НЕ ГАРНИТУРА. Сама гарнитура объявлена один раз в
   `tokens.css` (`--font-body`). Эта переменная говорит другое: «надписи карты
   набираются основным текстовым шрифтом, а не заголовочным». Решение владельца
   01.09.2026 по снимкам обоих вариантов: заголовочный плотнее и на мелком
   размере поверх спутникового снимка читается хуже, а подпись линейки живёт
   именно там.

   ⛔ ЧИТАТЬ ЭТУ ПЕРЕМЕННУЮ, А НЕ ПИСАТЬ НАЗВАНИЕ ЗАНОВО. Подписи на ПОЛОТНЕ
   карты (Cesium) правилами оформления не покрываются — им нужна строка. Её
   собирает `public/js/map-label-font.js`, ЧИТАЯ эту переменную. Название
   гарнитуры не должно появиться ни в одном другом месте: именно так плоский и
   объёмный вид и разошлись. */
:root {
  --map-label-font: var(--font-body);
}

.map-overlay-chip {
  font-family: var(--map-label-font);
  background: color-mix(in oklch, var(--surface) 90%, transparent);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 0.5rem 0.75rem;
  margin: 0;
}

/* E84 (28.08.2026, отчёт владельца, скриншот прода): баннеры («Загружаю слои
   карты…» / «неполная картина неба» / «снимок недоступен») жили в ОТДЕЛЬНОЙ
   плавающей панели (`.map-overlay--banners`) с ТЕМИ ЖЕ `top`/`right`/
   `z-index`, что и кластер режима карты (`.map-overlay--top-right`) — когда
   баннер появлялся, он ложился ПРЯМО НА кнопки «Схема»/«Спутник»/«Ночь»/…
   вместо того чтобы их подвинуть. Вместо второй панели с координатами,
   которые пришлось бы синхронизировать вручную (и они снова разойдутся на
   следующей правке) — баннеры теперь ПЕРВЫЙ ребёнок ТОЙ ЖЕ колонки: обычный
   (не `position: absolute`) flex-блок, кнопки естественно уезжают вниз, когда
   баннер появляется или растёт, при ЛЮБОЙ его высоте и на ЛЮБОМ размере окна
   — без замера пикселей в JS. */
.map-overlay__status-stack {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  width: 100%;
}

/* ========================================================================== */
/* ПАНЕЛЬ ВИДА КАРТЫ (E107, 30.08.2026, решение владельца).                    */
/*                                                                            */
/* БАЗОВАЯ КАРТА: с этой раскладки будут списывать карту в других кабинетах,   */
/* поэтому классы переиспользуемые, а не «только для кабинета».                */
/*                                                                            */
/* «Как смотреть» — полосой по верхней кромке карты. «Что показывать» —        */
/* блоком «Слои» справа. Разделение по вопросу, а не по удобству.              */
/*                                                                            */
/* 🔴 ПОДЛОЖКА ПОЛУПРОЗРАЧНАЯ, НО СЛЕДУЕТ ТЕМЕ, А НЕ «ВСЕГДА ТЁМНАЯ».         */
/* Владелец просил «прозрачную затемнённую». В ТЁМНОЙ теме это ровно она. В    */
/* СВЕТЛОЙ тёмная подложка под тёмным `--text` дала бы нечитаемый текст — а    */
/* контраст здесь уже стоил отдельной правки (E84: кнопки лежали прямо на      */
/* карте и на светлых подложках сливались с ней). Поэтому подложка — это       */
/* `--surface` с прозрачностью: в тёмной теме затемняет, в светлой осветляет,  */
/* карта просвечивает в обеих, а пара токенов `--text`/`--surface` остаётся    */
/* той же, чью читаемость уже мерили.                                          */
/*                                                                            */
/* ЗАМЕР КОНТРАСТА ПОСЛЕ ПРОЗРАЧНОСТИ — БРАУЗЕРОМ, а не расчётом на бумаге.  */
/* Цвет сводит САМ браузер (заливка канвы + чтение пикселя): регулярка по     */
/* computed-значению НЕ годится — Chrome оставляет там `oklch(...)`, и числа  */
/* 0.95/0.004/250 не байты цвета. Итоговый цвет подложки считается смешением  */
/* с картой под ней, затем WCAG 2.1.                                         */
/*                                                                           */
/*                       над белой картой | над чёрной | над серой            */
/*   тёмная тема               8.8:1      |   16.0:1   |  12.3:1             */
/*   светлая тема             17.0:1      |   11.1:1   |  13.9:1             */
/*                                                                           */
/* ХУДШИЙ СЛУЧАЙ — 8.8:1 при пороге AA 4.5:1. Прозрачность СЪЕЛА ЗАПАС       */
/* (у непрозрачной подложки было 15.3:1), но не порог: запас почти двойной.   */
/*                                                                           */
/* ⚠️ КОНТРОЛЬ МЕТОДА, БЕЗ КОТОРОГО ЧИСЛА ВЫШЕ НИЧЕГО НЕ ЗНАЧАТ: тем же       */
/* приёмом измерена НЕПРОЗРАЧНАЯ пара --text/--surface — вышло 15.3:1 и       */
/* 16.8:1, ровно те числа, что проект записал раньше (E84). Метод            */
/* воспроизводит известный ответ, значит ему можно верить и в новом.          */
/* ⚠️ Мерить надо НЕНАЖАТУЮ кнопку: у нажатой своя сплошная заливка, и        */
/* прозрачность подложки её не касается. Первая попытка мерила нажатую «3D»   */
/* и дала бессмысленные 1.1:1 — ошибка была в выборе образца, не в методе.    */
/* ========================================================================== */
/* ═══════════════════════════════════════════════════════════════════════════
   E145 (01.09.2026): ПОДЛОЖКА ПЛАШКИ ПОВЕРХ КАРТЫ — ОДИН ИСТОЧНИК ЗНАЧЕНИЙ.

   🔴 ЗАЧЕМ. Цвет текста на органах управления картой — ТОКЕН ТЕМЫ
   (`.btn--outline { color: var(--text) }`). У карты своя окраска, к теме
   отношения не имеющая. Значит текст без подложки читается или не читается
   СЛУЧАЙНО — как повезёт с подложкой карты. Замерено 01.09.2026 на кластере
   кнопок пульта, у которого подложки не было вовсе (`background:
   rgba(0,0,0,0)`): контраст к светлой схеме **1.01:1**, к бледной застройке
   1.13:1, к зелёной зоне 1.12:1 — при пороге WCAG AA 4.5:1 для мелкого текста.
   К спутнику 4.72:1 и к ночной 13.80:1, то есть на тёмной карте всё выглядело
   исправным. Владелец увидел это глазами на скриншоте прода `0.92.0`.

   ⚠️ ПОДЛОЖКА ИЗ ТОГО ЖЕ НАБОРА ТОКЕНОВ, ЧТО И ТЕКСТ. Тогда пара «текст на
   подложке» держится в ЛЮБОЙ теме сама, без подбора чисел под каждую.

   ⛔ ЗНАЧЕНИЯ ЗДЕСЬ, А НЕ У КАЖДОГО ЭКРАНА. До этой правки они были вписаны
   прямо в `.map-toolbar`, и у пульта своей плашки просто не завелось. Третья
   копия тех же чисел — то же, чем болели шрифты надписей (E142) и часы карты
   (E111). ⚠️ `.atc-chip` (`app/css/atc.css`) держит СВОИ значения (72 % и
   blur 6) — они выкачены и менять их этой правкой я не стал; свести с этими
   стоит, но отдельным решением, а не заодно. */
:root {
  --map-plate-bg: color-mix(in oklch, var(--surface) 82%, transparent);
  --map-plate-border: 1px solid color-mix(in oklch, var(--line) 60%, transparent);
  --map-plate-blur: blur(10px);
  --map-plate-shadow: 0 2px 10px rgb(0 0 0 / 0.22);
}

/* E146: подсказка инструмента рядом с его кнопками. Пустая — не занимает
   места (`:empty` + `display: none`), иначе в панели зияла бы дырка, пока
   инструмент не выбран. */
.map-toolbar__hint {
  font-family: var(--map-label-font);
  font-size: 0.78rem;
  color: var(--muted);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}

.map-toolbar__hint:empty { display: none; }

.map-toolbar {
  position: absolute;
  top: 0.6rem;
  left: 0.6rem;
  right: 0.6rem;
  z-index: 10;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem 0.75rem;
  padding: 0.4rem 0.55rem;
  border: var(--map-plate-border);
  border-radius: var(--radius);
  background: var(--map-plate-bg);
  backdrop-filter: var(--map-plate-blur);
  -webkit-backdrop-filter: var(--map-plate-blur);
  box-shadow: var(--map-plate-shadow);
}

/* Группы внутри полосы разделены линией, а не пустотой: пустота на узком окне
   схлопывается переносом, и «подложка» с «временем сцены» слипаются в один
   ряд кнопок без границы между вопросами. */
.map-toolbar__group {
  display: flex;
  gap: 0.35rem;
}

.map-toolbar__group + .map-toolbar__group {
  padding-left: 0.75rem;
  border-left: 1px solid color-mix(in oklch, var(--hairline) 80%, transparent);
}

/* Кнопки в полосе компактнее обычных: их тут семь, и они соревнуются с картой
   за внимание, а не с формой заявки. */
.map-toolbar .btn {
  padding: 0.3rem 0.6rem;
  font-size: 0.8rem;
}

@media (max-width: 900px) {
  /* На узком окне разделители мешают переносу: группа, уехавшая на новую
     строку, тянула бы за собой линию слева от края. */
  .map-toolbar__group + .map-toolbar__group {
    padding-left: 0;
    border-left: none;
  }
}

.map-overlay--top-right {
  top: 0.6rem;
  right: 0.6rem;
  /* E84: колонка (баннеры + переключатели режима/подложки/сцены + панель
     «Слои») суммарно ЛЕГКО выше короткого окна — замер координатора живьём
     (1024×650, роль fleet_manager): колонка растянута на 749px при 650px
     видимых, «Слои» обрывались точно на краю экрана БЕЗ прокрутки, потому
     что `.map-panel` (родитель) держит `overflow: hidden` — «за краем»
     означало «недоступно», а не «прокрути». `bottom` вместе с `top` даёт
     колонке РЕАЛЬНУЮ высоту вьюпорта минус отступы, `overflow-y` превращает
     обрезание в прокрутку — работает на любой высоте окна, не только той,
     что попала на скриншот владельца. */
  bottom: 0.6rem;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 0.5rem;
  max-width: min(22rem, calc(100% - 1.2rem));
  overflow-y: auto;
  /* E107: полоса вида карты заняла верхнюю кромку — блок «Слои» начинается
     ПОД ней. Число выведено из её высоты (одна строка кнопок + отступы), а не
     подобрано на глаз; на узком окне полоса переносится и становится выше,
     поэтому запас взят с округлением вверх. */
  top: 3.4rem;
}

/* Плашка времени сцены — нижний угол сцены карты (макет владельца).
   `.map-overlay-chip` уже даёт подложку и рамку; здесь только место.

   ⚠️ УГОЛ ЛЕВЫЙ, А НЕ ПРАВЫЙ, И ЭТО НЕ ВКУС. Справа сверху вниз идёт кластер
   контролов, и раскрытый список «Слои» доходит до низа окна — замер сразу
   после переноса: плашка легла ПОВЕРХ кнопок времени сцены. Развести их можно
   было бы отступом снизу у кластера, но это число пришлось бы держать
   синхронным с высотой плашки (а она растёт до двух строк, когда время сцены
   не настоящее и появляется подпись «не сейчас»). Левый угол разводит их
   ПО ПОСТРОЕНИЮ: там ничего нет с тех пор, как панель подачи стала колонкой. */
.map-overlay--bottom-left {
  left: 0.6rem;
  /* E126: показания стоят НАД подвалом карты, а не на нём. */
  bottom: calc(0.6rem + var(--map-footer-h, 0px));
  font-variant-numeric: tabular-nums;
}

/* E118 (30.08.2026): в углу теперь ДВА чипа — часы и координаты под курсором.
   Колонкой, а не строкой: строка на узком окне уехала бы под правый край, а
   координаты меняются на каждое движение мыши — прыгающая ширина строки
   утаскивала бы часы за собой. */
/* E119 (30.08.2026): инструменты измерения — ТРЕТИЙ вопрос в полосе.
   «Как смотреть» (режим, подложка, время, подсказка) и «чем мерить» — разные
   вещи, и читаться они должны раздельно. Поэтому у группы инструментов своя
   черта слева: гэпа между группами мало, когда полоса переносится на вторую
   строку и соседство групп становится случайным. */
.map-toolbar__group--tools {
  border-left: 1px solid var(--hairline);
  padding-left: 0.6rem;
}

/* E123: подпись измерения на плоской карте — HTML-метка (слой symbol требует
   глифов, которых у растровой подложки нет).
   ⚠️ ЦВЕТА ЗДЕСЬ НЕТ СОЗНАТЕЛЬНО: он приходит от самого инструмента
   (`map-measure.js::COLORS`) и ставится прямо на элемент — тот же цвет, что
   получает объёмный движок. Иначе одна плашка красилась бы из двух мест и они
   разошлись бы. Здесь — только геометрия и шрифт. */
/* 🔴 E142: У ЭТОЙ НАДПИСИ НЕ БЫЛО ОФОРМЛЕНИЯ ВООБЩЕ. Отметка высотомера в
   ПЛОСКОМ виде (`map-tool-surface.js::MapLibreSurface`, класс ставился, правила
   не существовало ни в одном файле) рисовалась голым текстом без подложки:
   на спутниковом снимке её попросту не видно. Найдено 01.09.2026 при сведении
   шрифтов — искали одно, нашли другое. Оформление то же, что у подписи линейки:
   это надписи одного рода, и различать их было бы неправдой. */
.freedom-annotation-label,
.freedom-sketch-label {
  font-family: var(--map-label-font);
  font-size: 0.8rem;
  font-weight: 600;
  border-radius: var(--radius);
  padding: 0.3rem 0.5rem;
  white-space: nowrap;
  pointer-events: none;
  /* ⚠️ ПОДЛОЖКА ЗДЕСЬ — УМОЛЧАНИЕ, А НЕ ПЕРЕХВАТ ЦВЕТА. Подписи линейки цвет
     приходит от инструмента и ставится ПРЯМО НА ЭЛЕМЕНТ (см. абзац выше), а
     значение в атрибуте всегда сильнее правила — значит для неё тут ничего не
     меняется. Отметке высотомера цвет не ставит никто, и без этих двух строк
     она осталась бы тем же невидимым текстом. Значения — те же, что у
     объёмного движка (`map-measure.js::ЦВЕТА`): чёрная плашка 70 %, белый
     текст. Разъезжаться им нельзя, поэтому если меняете — меняйте обе. */
  background: rgba(0, 0, 0, 0.7);
  color: #ffffff;
}

/* ──────────────────────────────────────────────────────────────────────────
   E126 (30.08.2026): ПОДВАЛ КАРТЫ — ОБЪЯВЛЕННОЕ МЕСТО, А НЕ «на глаз».
   
   Под нижней кромкой карты живут виджеты Cesium: шкала времени (замерено
   27 px высотой, 672 px шириной) и циферблат часов (90×136 px, садится ровно
   в ЛЕВЫЙ НИЖНИЙ угол — туда, где у нас часы и координаты). Столкновение уже
   случалось: 28.08.2026, отчёт владельца «временная шкала налезает на панель
   рисования». Тогда виджеты погасили правилом, привязанным к id страницы
   кабинета, — то есть починили один экран, а не задачу.
   
   Теперь высота подвала — переменная, а угол показаний привязан К НЕЙ. Кабинет,
   которому шкала нужна (пульт УВД), объявит её высоту, и показания сами
   поднимутся. Кабинет без шкалы не платит за неё ни пикселем. */
.map-stage {
  --map-footer-h: 0px;
}

/* E127: подвал занят ползунком времени — угол показаний поднимается сам.
   2.25rem = высота полосы с ползунком и её отступами; число одно и живёт
   здесь, а не переписывается в каждом кабинете. */
.map-stage[data-time-scrubber="on"] {
  --map-footer-h: 2.25rem;
}

/* Полоса подвала: во всю ширину карты, поверх неё. */
.map-footer {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.35rem 0.6rem;
  background: color-mix(in oklch, var(--surface) 82%, transparent);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-top: 1px solid var(--hairline);
}

/* Календарь в подвале: тем же материалом, что и остальные поля карты. */
.map-footer__date {
  font-family: var(--font-display);
  font-size: 0.8rem;
  color: var(--text);
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 0.2rem 0.35rem;
}

.map-footer__range {
  flex: 1;
  accent-color: var(--brand);
  cursor: pointer;
}

/* Ползунок уведён с «сейчас» — полоса подсвечена тем же сигнальным токеном,
   что и часы сцены при расхождении (E111). Один смысл — один цвет. */
.map-footer[data-at-now="false"] {
  border-top-color: var(--sig-caution);
}

/* Видимость виджетов Cesium решается НАМЕРЕНИЕМ, а не именем страницы.
   `data-map-timeline="off"` — шкалы нет; `data-time-player="on"` — циферблат
   заменён нашим проигрывателем (E126) и потому спрятан.
   ⚠️ Прежнее правило было привязано к `#map-3d-container`, который есть только
   в `cabinet.html`. Унеси такую разметку в базовую карту — и она молча погасила
   бы шкалу у диспетчера, который по ней кликает. */
.map-stage[data-map-timeline="off"] .cesium-viewer-timelineContainer {
  display: none;
}

.map-stage[data-time-player="on"] .cesium-viewer-animationContainer {
  display: none;
}

/* Проигрыватель времени: пуск/пауза и скорость. Всё, что делал циферблат. */
.map-time-player {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.3rem 0.45rem;
}

.map-time-player__play {
  font-family: var(--font-display);
  font-size: 0.85rem;
  line-height: 1;
  min-width: 2rem;
  padding: 0.3rem 0.4rem;
  color: var(--text);
  background: color-mix(in oklch, var(--action) 14%, transparent);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  cursor: pointer;
}

.map-time-player__play[aria-pressed="true"] {
  background: var(--action);
  color: var(--action-ink);
}

.map-time-player__speed {
  font-family: var(--font-display);
  font-size: 0.8rem;
  color: var(--text);
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 0.25rem 0.3rem;
}

/* Недоступен — в плоском виде часов сцены нет вовсе. Приглушаем и объясняем
   заголовком, а не прячем: исчезнувшая кнопка читается как поломка. */
.map-time-player[data-available="false"] {
  opacity: 0.55;
}

.map-overlay__corner {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  align-items: flex-start;
}

/* Тот же материал и тот же размер, что у часов: два чипа одного угла обязаны
   читаться как одна вещь. Моноширинные цифры — чтобы координаты не дёргались
   по ширине при движении курсора. */
.map-overlay__cursor {
  font-family: var(--font-display);
  font-size: 0.9rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.01em;
  color: var(--text);
  background: color-mix(in oklch, var(--surface) 82%, transparent);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 0.45rem 0.7rem;
  margin: 0;
}

/* Пока курсор не на карте — приглушённо: это подсказка, а не данные. */
.map-overlay__cursor[data-empty="true"] {
  color: var(--muted);
}

/* E107: у блока «Слои» та же подложка, что у полосы вида карты — два блока
   одного экрана обязаны говорить одним языком, иначе читаются как разные
   системы. */

.map-overlay-layers {
  width: 100%;
  background: color-mix(in oklch, var(--surface) 82%, transparent);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid color-mix(in oklch, var(--line) 60%, transparent);
  border-radius: var(--radius);
  padding: 0.85rem 1.1rem;
  box-shadow: 0 2px 10px rgb(0 0 0 / 0.22);
}

.map-overlay-layers__summary {
  font-family: var(--font-display);
  font-weight: 650;
  font-size: 1rem;
  cursor: pointer;
  list-style: none; /* убираем нативный треугольник Chrome/Firefox — см. ::before ниже */
}

.map-overlay-layers__summary::-webkit-details-marker {
  display: none;
}

/* Свой индикатор раскрытия — виден и меняется по `[open]`, нативный
   треугольник по умолчанию слишком мелкий на тёмной поверхности карты. */
.map-overlay-layers__summary::before {
  content: "▸ ";
  color: var(--muted);
}

.map-overlay-layers[open] > .map-overlay-layers__summary::before {
  content: "▾ ";
}

/* E111 (30.08.2026, отчёт владельца): ЧАСЫ СЦЕНЫ ЗАМЕТНЫ.
   Были 0.72rem цветом `--muted` — то есть оформлены как сноска, хотя это
   единственное место, где видно, за какой ЧАС нарисован свет. Владелец:
   «надо это поле сделать более заметным».
   Что изменено и почему именно так:
   · цвет `--muted` → `--text`: приглушённый серый — язык второстепенного;
   · размер 0.72 → 0.9rem и табличные цифры, чтобы час не «прыгал» при смене
     минуты (`font-variant-numeric: tabular-nums`);
   · подложка та же, что у полосы вида карты и «Слоёв» (E107) — три плавающих
     над картой блока одного экрана обязаны выглядеть одной системой. */
.map-overlay__scene-time {
  margin: 0;
  font-family: var(--font-display);
  font-size: 0.9rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.01em;
  color: var(--text);
  text-align: left;
  background: color-mix(in oklch, var(--surface) 82%, transparent);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 0.45rem 0.7rem;
}

/* «не сейчас» — СИГНАЛЬНЫЙ токен «внимание», а не серый и не выдуманный цвет:
   расхождение времени сцены с настоящим это не оттенок, а то, из-за чего
   картинку можно принять за обстановку на выбранный час.
   Хекса здесь нет сознательно — правило цвета из 0.13.0 (только токены), и
   сторож `test_v014_notification_css_uses_tokens_only` его сторожит; он и
   поймал мою первую версию с запасным `#d97706`. */
.map-overlay__scene-time.is-stale {
  color: var(--sig-caution);
  /* Сигнал «час не настоящий» держится НЕ одним цветом: цвет в одиночку
     не виден тому, кто его не различает, а здесь от него зависит, примут ли
     картинку за нынешнюю обстановку. Поэтому ещё и рамка того же токена. */
  border-color: var(--sig-caution);
}

/* Точка-значок «неполная картина неба в этом режиме» — на кнопке 2D/3D,
   решение владельца 28.08.2026 (E82 §3): жёлтый баннер снят, ЭТА точка + уже
   существующая подпись «не в этом режиме карты» в списке слоёв (см.
   `js/cabinet.js::renderLayerList`) — единственные носители того же факта,
   которым раньше был баннер (`formatEngineGapMessage`, докстринг
   `js/cabinet.js`). Цвет — тот же `--sig-caution`, что у самого баннера и у
   `.intent-badge--pending`: одно и то же состояние выглядит одинаково везде. */
.map-mode-gap-dot {
  display: inline-block;
  width: 0.5rem;
  height: 0.5rem;
  border-radius: 50%;
  margin-left: 0.35rem;
  background: var(--sig-caution);
  vertical-align: 0.05rem;
}

/* ──────────────────────────────────────────────────────────────────────────
   E132 (31.08.2026): КНОПКА «СЕЙЧАС» В ПОДВАЛЕ КАРТЫ.

   Она переехала сюда из полосы вида (см. `map-base.js::scrubber`): в полосе
   она стояла среди того, что умеет только объёмный движок кабинета, и
   публичная карта, не берущая ту группу, теряла бы вместе с ней единственный
   возврат к настоящему времени.

   Материал — тот же, что у остальных полей подвала: своя форма кнопки на
   полосе высотой в одну строку выглядела бы приклеенной сбоку.
   ────────────────────────────────────────────────────────────────────────── */
.map-footer__now {
  font-family: var(--font-display);
  font-size: 0.8rem;
  line-height: 1;
  white-space: nowrap;
  color: var(--text);
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 0.3rem 0.55rem;
  cursor: pointer;
}

.map-footer__now:hover {
  border-color: var(--action);
  color: var(--action);
}

/* Пока мы «на сейчас», возвращать некуда — кнопка приглушена, но НЕ спрятана
   и НЕ заблокирована: исчезающий орган управления читается как поломка, а
   нажатие в этом состоянии просто ничего не меняет. Тот же приём, что у
   проигрывателя времени в плоском виде (`[data-available="false"]`). */
.map-footer[data-at-now="true"] .map-footer__now {
  opacity: 0.55;
}


/* ──────────────────────────────────────────────────────────────────────────
   E133 (31.08.2026): ЭКРАННЫЙ НАВИГАТОР ВИДА — для тех, у кого нет мыши.

   Решение владельца: «если человек не использует мышь (например трекпад или
   вообще с телефона сидит)… в Google Earth это глобус в верхней правой части
   экрана». До этого в объёмном виде экранного навигатора не было ВООБЩЕ —
   наклонить и повернуть трёхмерный вид с телефона было нечем.

   🔴 РАЗМЕР КНОПКИ 2.75rem = 44px, И ЭТО НЕ «НА ГЛАЗ». 44 CSS-пикселя —
   минимальная цель для пальца по WCAG 2.5.5 (AAA) и по Apple HIG; ради этого
   виджет и заводится, поэтому кнопка меньше цели обессмыслила бы всю работу.

   Материал — тот же, что у полосы вида и «Слоёв»: три плавающих над картой
   блока одного экрана обязаны выглядеть одной системой (E107).
   ────────────────────────────────────────────────────────────────────────── */
.map-navigator {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  padding: 0.4rem;
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  background: color-mix(in oklch, var(--surface) 82%, transparent);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}

.map-navigator__row {
  display: flex;
  gap: 0.3rem;
  justify-content: center;
}

.map-navigator__btn {
  /* См. шапку: 44px — минимальная цель для пальца. Число живёт ОДНИМ именем
     в `tokens.css`: у него пять читателей, и пять копий разошлись бы. */
  min-width: var(--touch-target);
  min-height: var(--touch-target);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: 1rem;
  line-height: 1;
  color: var(--text);
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  cursor: pointer;
  /* Убирает задержку 300 мс перед откликом на касание и запрет двойного
     тапа-зума на самой кнопке: без этого «приблизить» на телефоне срабатывает
     заметно позже нажатия и виджет ощущается тормозящим. */
  touch-action: manipulation;
  -webkit-user-select: none;
  user-select: none;
}

.map-navigator__btn:hover:not(:disabled) {
  border-color: var(--action);
  color: var(--action);
}

/* Поворот и наклон в плоском виде НЕ ПРЯЧУТСЯ, а гаснут и объясняют причину
   заголовком — тот же приём, что у проигрывателя времени (E126) и у показаний
   высоты (E118): исчезнувшая половина виджета читается как поломка.
   ⚠️ И при этом они по-настоящему выключены (`disabled` ставит модуль), а не
   только пригашены: «заперто только на вид» — это дефект, который проект уже
   ловил в панели подачи (E106). */
.map-navigator__btn:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* Кнопка «север»: стрелка показывает, куда сейчас повёрнут вид. */
.map-navigator__north {
  position: relative;
  flex-direction: column;
  gap: 0;
}

.map-navigator__needle {
  display: block;
  font-size: 1.05rem;
  line-height: 1;
  transform-origin: 50% 50%;
  transition: transform 120ms linear;
}

.map-navigator__letter {
  display: block;
  font-size: 0.62rem;
  line-height: 1;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--muted);
}

/* Вид уведён с севера — подсвечиваем тем же сигнальным токеном, что и часы
   сцены при расхождении с настоящим временем (E111). Один смысл — один цвет:
   «то, что вы видите, не в привычной ориентации». */
.map-navigator[data-at-north="false"] .map-navigator__north {
  border-color: var(--sig-caution);
  color: var(--sig-caution);
}
