/* ══════════════════════════════════════════════════════════════════════════
   «ГДЕ»: КНОПКА ВМЕСТО ПОСТОЯННОЙ КОЛОНКИ ДЕРЕВА МЕСТ

   Решение заказчика В-75 от 22.09.2026, требование ТР-605. Дата файла —
   22.09.2026.

   ЧТО БЫЛО. Дерево мест стояло третьей колонкой справа (`position: fixed;
   right: 0`), и под неё безусловно резервировалась полоса:
   `body.has-menu{ padding-right: var(--tree-width) }`. Ширина полосы
   ДВУХ разных величин, и это надо знать, читая требование: базовое
   объявление — 264 px, слой плотности В-73 переопределяет токен на 224,
   и слой накрывает все экраны, КРОМЕ трёх полевых (дневной отчёт,
   приёмка, наряды). Значит колонка стоила 264 px на полевых экранах
   и 224 на кабинетных, а число «264» в самом требовании — базовое,
   а не единственное.

   ЧТО СТАЛО. Полоса не резервируется вовсе, дерево показывается
   выпадающей панелью по кнопке «Где: Блок Ж · Подъезд 1 · 3 этаж»
   в верхней полосе. Заодно закрыт известный дефект: `padding-right`
   стоял БЕЗУСЛОВНО, то есть и на экранах, где дерева нет, — там справа
   оставалось мёртвое поле той же ширины. Проверено на `/acts/`
   (дерева нет): `padding-right` стал 0.

   ЧЕГО ЭТА ПРАВКА НЕ ДЕЛАЕТ, И ЭТО НАДО ЗНАТЬ. «Экран получает обратно
   264 px» — верно про СТРАНИЦУ, но не про содержимое всюду. Замер
   22.09.2026, окно 1440: доступная ширина выросла с 1120 до 1384
   на полевых экранах и с 1216 до 1384 на кабинетных, а вот ширина
   самой колонки содержимого выросла только там, где она не ограничена:
   `/schedule/` 1160 → 1384. На нарядах, дневном отчёте и приёмке
   колонка `.page--narrow` держит 880 px и прижата влево намеренно
   (app.css, раздел «РАБОЧЕЕ МЕСТО ЗА СТОЛОМ»), поэтому 264 px
   превращаются там не в содержимое, а в ПУСТОЕ ПОЛЕ справа — ровно то,
   про которое заказчик спрашивал 16.09.2026 «вот это сюда нельзя
   красиво вставить?» и ради которого дерево туда когда-то и поставили.
   Чем наполнить освободившуюся полосу на узких экранах — отдельное
   решение, и его не принимает файл стилей дерева.

   ПОЧЕМУ КНОПКА В ВЕРХНЕЙ ПОЛОСЕ, А НЕ В ШАПКЕ ОБЪЕКТА. Две причины,
   и обе проверены на живых экранах.
   Первая: шапка объекта рисуется ТОЛЬКО когда место выбрано
   (`konteksty._объект_шапки` возвращает None при пустом месте), а дерево
   рисуется и при «всех местах» — на `/schedule/` без `?mesto=` шапки
   объекта нет, а семнадцать веток есть. Кнопка в шапке объекта означала
   бы, что на таких экранах до дерева за столом не добраться вовсе.
   Вторая: `.topbar` — `position: sticky`, а `.object-header` уезжает
   прокруткой. След «вы смотрите на часть данных» обязан оставаться
   на виду, а не уезжать вверх на первом же длинном списке.

   ДУБЛЯ НЕ ОСТАЁТСЯ. Строка `.object-header__place` под именем объекта
   показывает тот же адрес места. За столом её прячем — кнопка стоит
   выше и говорит то же самое; до 1100 px кнопки нет, и строка остаётся
   единственным носителем места вне выездного меню.

   ЦВЕТА ТОЛЬКО ТОКЕНАМИ (ТР-574), И ЗАМЕРЕНЫ ОНИ НА ЖИВОМ ЭКРАНЕ,
   А НЕ ПО base.css. Это не придирка: слой вида «Продукт» (В-67)
   переопределяет палитру, и токен `--line2`, который в base.css
   равен #817c73 (4.11:1 к поверхности), на экране оказывается #94a3b8
   (2.56:1). Посчитав по объявлению, получаешь число, которого
   на экране нет.

   Снято `getComputedStyle` 22.09.2026, светлая тема / тёмная тема:
     значение места на кнопке  17.85 / 14.48
     метка «Где:» и стрелка     5.51 /  7.74
     число у места (ТР-551)     6.16 /  6.95
     знак подмены `--warn`      5.02 / 11.81
   Норма текста 4.5 пройдена везде.

   ЧТО НЕ ПРОЙДЕНО И ЭТО ЧЕСТНО СКАЗАНО: граница кнопки `--line2`
   даёт 2.56:1 к белой шапке в светлой теме при норме 3:1 для границы
   элемента (WCAG 1.4.11). Это НЕ дефект этой кнопки: тем же токеном
   обведены все кнопки и поля системы, и сломала его смена палитры
   В-67, а не ТР-605. Заводить здесь второй, свой цвет границы —
   значит развести один элемент с остальными; чинится токеном
   в палитре, одним местом на систему. В тёмной теме тот же токен
   даёт 4.92:1.

   `base.css` НЕ ТРОНУТ (ТР-573), `app.css` тоже: всё здесь —
   новые классы и перекрытие правил дерева поздним файлом.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── КНОПКИ НЕТ ДО 1100 px ────────────────────────────────────────────────
   На телефоне и планшете дерево живёт разделом выездного меню, как
   и жило. Второй орган управления к тому же дереву — это две навигации
   сразу, и правило каркаса это запрещает. */
.where{ display: none; }

@media (min-width: 1100px){

  /* ── 1. ПОЛОСА СПРАВА НЕ РЕЗЕРВИРУЕТСЯ ─────────────────────────────────
     Перекрывает `body.has-menu{ padding-right: var(--tree-width) }`
     из app.css. Специфичность та же, файл — поздний. Правило стоит
     БЕЗУСЛОВНО, а не под `.has-tree`: колонки нет ни на одном экране,
     и там, где дерева не было никогда, уходит мёртвое поле. */
  body.has-menu{ padding-right: 0; }

  /* ── 2. КНОПКА ─────────────────────────────────────────────────────────
     Вид взят у переключателя объекта из дизайн-системы прототипа
     (`.object__button` в base.css): та же граница, тот же радиус, то же
     поведение на наведении. Повторён вид, а не класс, — прототипный класс
     означает «текущий объект», и занимать его другим смыслом нельзя.

     ЦЕЛЬ НАЖАТИЯ 44 px — по заданию ТР-605, а не по нижней границе WCAG
     (та для точного указателя 24). ПЛАТА НАЗВАНА И ЗАМЕРЕНА: на
     кабинетных экранах верхняя полоса выросла с 41 до 49 px, на трёх
     полевых осталась 49 (там она и была 48 по мере `--target-topbar`).
     Восемь пикселей по вертикали против двухсот двадцати четырёх
     по горизонтали — обмен, ради которого решение и принято. */
  .where{
    flex: 0 1 auto;
    display: inline-flex; align-items: center; gap: var(--p2);
    min-width: 0; max-width: 42vw;
    min-height: 44px; padding: 0 var(--p3);
    background: var(--surface); color: var(--text);
    border: 1px solid var(--line2); border-radius: var(--r1);
    font: 500 var(--t2)/1.2 var(--font);
    text-align: left; cursor: pointer;
  }
  .where:hover{ background: var(--surface2); }
  .where:active{ background: var(--surface3); }
  /* Раскрытое состояние видно и без панели: подложка и цвет границы.
     Два носителя, а не один цвет, — правило то же, что у текущей ветки. */
  .where[aria-expanded="true"]{
    background: var(--surface2); border-color: var(--accent-main);
  }

  /* «Где:» — метка, место — ответ. Разный вес и разный цвет: взгляд
     ищет ответ, а не подпись. Метка спрятана от чтения с экрана
     (`aria-hidden`) намеренно: доступное имя кнопки задано целиком
     через `aria-label`, и метка прозвучала бы дважды. */
  .where__badge{ flex: 0 0 auto; color: var(--text2); font-weight: 400; }

  /* Длинный адрес места обрезается многоточием, а не распирает полосу:
     «Блок Ж · Подъезд 1 · 3 этаж» — ещё не предел, дерево мест
     по ТР-486 неограниченно по глубине. */
  .where__value{
    min-width: 0; overflow: hidden; text-overflow: ellipsis;
    white-space: nowrap;
  }

  /* ЧИСЛО РАБОТ СО СВОБОДНЫМ ОСТАТКОМ у выбранной ветки (ТР-551).
     Ноль и «числа этой роли не считались» дают ПУСТОЙ span — `:empty`
     убирает его вовсе, чтобы на кнопке не висел пустой кружок. */
  .where__count{
    flex: 0 0 auto;
    min-width: 20px; padding: 1px var(--p2);
    border-radius: var(--r-round, 999px);
    background: var(--accent-bg); color: var(--accent-main);
    font-size: var(--t0); font-weight: 600;
    font-variant-numeric: tabular-nums; text-align: center;
  }
  .where__count:empty{ display: none; }

  /* ЗНАК ПОДМЕНЫ МЕСТА. Рисуется только при `data-override` — то есть
     только тогда, когда экран показал НЕ то место, которое запрошено
     в адресе. Полная фраза живёт в панели; знак — след того, что
     её стоит прочесть, и он не уезжает вместе с деревом.
     Контраст `--warn` замером на экране: 5.02:1 в светлой теме,
     11.81:1 в тёмной. */
  .where__override{ display: none; }
  .where[data-override] .where__override{
    flex: 0 0 auto;
    display: inline; color: var(--warn); font-size: var(--t2);
  }
  .where[data-override]{ border-color: var(--warn); }

  .where__arrow{ flex: 0 0 auto; color: var(--text2); font-size: var(--t0); }
  .where[aria-expanded="true"] .where__arrow{ transform: rotate(180deg); }

  /* ── 3. ДУБЛЬ АДРЕСА МЕСТА УБИРАЕТСЯ ───────────────────────────────────
     Только там, где кнопка действительно нарисована (`has-tree`).
     Без этого условия экран с шапкой объекта, но без дерева, потерял бы
     адрес места совсем. */
  body.has-tree .object-header__place{ display: none; }

  /* ── 4. ПАНЕЛЬ ─────────────────────────────────────────────────────────
     Это ТОТ ЖЕ УЗЕЛ `.tree`, что лежит в `<nav class="menu">`, а не его
     копия. Второй экземпляр разметки означал бы два дерева в странице —
     два набора ссылок, две подсветки текущей ветки и первое же
     расхождение между ними. Меняется только геометрия.

     Положение считает layout.js от прямоугольника кнопки (`--where-x`,
     `--where-y`, `--where-height`): кнопка стоит в полосе с переменным составом
     (имя экрана прячется до 1280 px), и привязать панель к постоянной
     координате нельзя. Запасные значения в `var()` — на случай, если
     скрипт не отработал: панель всё равно откроется на видном месте.

     Тень здесь законна и по В-75: карточки с тенью из вида убраны,
     но то, что ЛЕЖИТ ПОВЕРХ листа, — окно, выпадающее меню, подсказка —
     тень сохраняет. */
  /* ОТБОР НАЧИНАЕТСЯ С `body.has-menu`, И ЭТО НЕ УКРАШЕНИЕ.
     Найдено замером на живом экране 22.09.2026, а не рассуждением:
     при `.menu .tree{ display: none }` панель ОСТАВАЛАСЬ видимой
     на всех экранах со вкладками. В app.css стоит страховка
     `body.has-tabs .menu .tree{ display: block }` — ровно на случай,
     если заход спрячет содержимое панели общим правилом. Специфичность
     у неё (0,3,0) выше, поздний файл этого не отменяет, и закрытое
     дерево висело поверх содержимого прямоугольником 288x404.
     `body.has-menu` даёт (0,3,1) и забирает правило обратно. */
  body.has-menu .menu .tree{
    position: fixed;
    top: var(--where-y, 52px); left: var(--where-x, 232px);
    right: auto; bottom: auto;
    width: 288px; max-width: calc(100vw - 2 * var(--p4));
    max-height: var(--where-height, 70vh);
    margin: 0;
    overflow-y: auto; overscroll-behavior: contain;
    background: var(--surface);
    border: 1px solid var(--line); border-radius: var(--r2);
    box-shadow: var(--shadow-float);
    display: none;
  }
  body.has-menu .menu .tree[data-open="1"]{ display: block; }

  /* ЦЕЛЬ НАЖАТИЯ ВЕТКИ В ПАНЕЛИ — 44 px. В колонке ветка стояла 32
     (слой плотности) и была самой низкой целью кабинетного экрана;
     панель — не реестр, места в ней не жаль, а промах по ветке
     переключает МЕСТО, то есть меняет то, что человек вводит. */
  body.has-menu .menu .tree[data-open="1"] .branch{
    min-height: 44px;
    font-size: var(--t2);
  }

  /* Три носителя текущей ветки — подложка, полоса слева и вес шрифта —
     остаются ровно теми же (ТР-550). Здесь их не трогает ни одно
     правило, и это сказано вслух, чтобы следующий заход не «починил»
     подсветку одним цветом. */
}
