/* Карта Leaflet и поздние переопределения, вытесненные порядком каскада. */
.leaflet-container {
    background: var(--bg-elevated) !important;
    font-family: var(--font-mono) !important;
    z-index: 1;
    position: relative;
}
.leaflet-popup-content-wrapper {
    background: var(--bg-surface) !important;
    color: var(--text-primary) !important;
    border-radius: 0 !important;
    border: 0.09375rem solid var(--border) !important;
    box-shadow: none !important;
    font-family: var(--font-mono) !important;
    font-size: var(--fs-xs) !important;
}
.leaflet-popup-tip {
    background: var(--bg-surface) !important;
    border: 0.0625rem solid var(--border) !important;
    box-shadow: none !important;
}
.leaflet-popup-close-button {
    color: var(--text-muted) !important;
}
.leaflet-control-zoom a {
    background: var(--bg-surface) !important;
    color: var(--text-primary) !important;
    border-color: var(--border) !important;
    border-radius: 0 !important;
}
.leaflet-control-attribution {
    background: var(--bg-surface) !important;
    color: var(--text-muted) !important;
    font-size: var(--micro-size) !important;
}
.leaflet-control-attribution a {
    color: var(--text-secondary) !important;
}
/* New report landing in «Отправленные» — materialize + brief highlight so the
   foreman SEES where his report went. Class added by reports.html from ?new=<id>. */
.fm-arrived { animation: fm-arrive 0.5s cubic-bezier(0.22, 1, 0.36, 1); position: relative; }
@media (prefers-reduced-motion: reduce) {
    .fm-arrived { animation: none; }
}
.assignment-card {
    --accent-color: var(--text-muted);
    display: block;
    padding: var(--space-md);
    background: var(--bg-surface);
    border: 0.0625rem solid var(--border);
    /* Status/priority is carried by the pill + coloured dot in the card head,
       so the coloured top-rail was a redundant accent edge (no_left_border_accent).
       Removed — uniform 1 px border, no AI-cliché status rail. */
    text-decoration: none;
    color: inherit;
    position: relative;
    transition: border-color var(--dur-fast) var(--ease-out);
}
.assignment-critical,
.tb-card.assignment-critical { --accent-color: var(--secondary); }
.assignment-high { --accent-color: var(--accent); }
.assignment-normal { --accent-color: var(--border); }
.assignment-header {
    display: flex;
    gap: var(--space-sm);
    align-items: baseline;
    margin-bottom: 0.25rem;
}
.assignment-priority {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-family: var(--font-mono);
    font-size: var(--micro-size);
    letter-spacing: 0;
    color: var(--text-muted);
}
.assignment-deadline {
    font-family: var(--font-mono);
    font-size: var(--micro-size);
    color: var(--secondary);
    margin-left: auto;
}
.assignment-title {
    font-family: var(--font-mono);
    font-size: var(--fs-sm);
    font-weight: 700;
    margin-bottom: 0.25rem;
}
.assignment-meta {
    display: flex;
    gap: var(--space-md);
    font-family: var(--font-mono);
    font-size: var(--micro-size);
    color: var(--text-muted);
    letter-spacing: 0;
}
.assignment-desc {
    font-size: var(--fs-xs);
    color: var(--text-secondary);
    margin-top: var(--space-xs);
    line-height: 1.4;
}
.assignment-full-desc {
    margin-top: var(--space-md);
    padding: var(--space-md);
    background: var(--bg-elevated);
    font-size: var(--fs-xs);
    line-height: 1.5;
    border: 0.0625rem solid var(--border);
}
/* Import bottom-sheet — CSS-only (hidden checkbox toggles ~ siblings). */
.imp-backdrop {
    position: fixed; inset: 0; background: rgba(0,0,0,0.6);
    opacity: 0; visibility: hidden; transition: opacity 0.2s ease; z-index: 200;
}
.imp-sheet {
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 201;
    max-width: 34rem; margin: 0 auto;
    background: var(--bg-elevated); border-top: 0.0625rem solid var(--border);
    padding: 0.5rem 1rem calc(1rem + env(safe-area-inset-bottom, 0rem));
    transform: translateY(101%); transition: transform 0.28s cubic-bezier(0.4, 0, 0.2, 1);
    max-height: 88vh; overflow-y: auto;
}
.imp-sheet-grip { width: 2.5rem; height: 0.25rem; background: var(--border); margin: 0.25rem auto 0.75rem; }
.imp-sheet-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem; }
.imp-x { display: inline-flex; align-items: center; justify-content: center; min-width: var(--tap-target); min-height: var(--tap-target);
    cursor: pointer; font-size: var(--fs-lg); line-height: 1; color: var(--text-muted); }
.sph-prog { flex: 0 0 4rem; height: 0.375rem; background: var(--border); position: relative; }
.sph-pct {
    flex: none; min-width: 2.5rem; text-align: right;
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 600;
    color: var(--text-primary); font-variant-numeric: tabular-nums;
}
@media (max-width: 47.99em) {
    .sph-prog { flex-basis: 2.75rem; }
}
/* Timeline track: phase span bar with dimension witness-lines at both ends,
   progress fill, and a level-datum ▽ at the progress front. */
.gph-track { flex: 1; position: relative; height: 0.875rem; min-width: 4rem; }
.gph-bar {
    position: absolute; top: 0; bottom: 0;
    background: color-mix(in srgb, var(--primary) 22%, transparent);
    border: 0.0625rem solid var(--primary);
}
.gph-prog,
.sph-prog > span {
    position: absolute; left: 0; top: 0; bottom: 0;
    background: var(--primary);
}
/* Right-hand micrographics cluster: status split, %, task count. */
.gph-metrics { flex: 0 0 7.5rem; min-width: 0; display: flex; align-items: center; justify-content: flex-end; gap: 0.5rem; }
.gph-split { display: flex; width: 2.25rem; height: 0.4375rem; border: 0.0625rem solid var(--border); }
.gph-pct {
    flex: none; min-width: 2.25rem; text-align: right;
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 600;
    color: var(--text-primary); font-variant-numeric: tabular-nums;
}
.gph-n {
    flex: none; min-width: 1.5rem; text-align: right;
    font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted);
    font-variant-numeric: tabular-nums;
}
/* Expanded task rows — indented under the phase, aligned to the same timeline. */
.gph-body { padding: 0.15rem 0 0.5rem 1.1rem; border-left: 0.0625rem solid var(--border); margin-left: 0.8rem; }
@media (max-width: 47.99em) {
    /* Phase Gantt: two-line summary — identity row on top, track+metrics below —
           so nothing is crushed on a phone. */
    .gph-sum { flex-wrap: wrap; gap: 0.35rem 0.5rem; padding: 0.5rem 0; }
    .gph-id { flex: 1 1 100%; }
    .gph-name { font-size: var(--micro-size); }
    .gph-track { flex: 1 1 auto; order: 2; }
    .gph-metrics { flex: 0 0 7rem; order: 3; gap: 0.4rem; }
    .gph-body { margin-left: 0.5rem; padding-left: 0.6rem; }
}
.fm-actionbar {
    position: fixed;
    left: 0; right: 0;
    bottom: var(--fm-bottombar-h, calc(3.5rem + env(safe-area-inset-bottom, 0rem)));
    z-index: 80;
    background: var(--bg-surface);
    border-top: 0.0625rem solid var(--border);
    box-shadow: 0 0.0625rem 0.25rem rgba(0,0,0,0.3);
}
.rev-bar { position: relative; padding: 0.55rem 0.8rem; }
/* Borderless row. An outlined box next to the phone's rounded screen corner
   always loses that argument — so the control has no outline to chop: the
   primary action is a solid block, the other two are bare text, and the only
   rules left are the hairlines BETWEEN segments (internal, nothing to clip).
   Same move the client's reference makes: filled block or plain label, never
   an outlined box. */
.rev-actions {
    display: flex; gap: 0; align-items: stretch;
    position: relative;
}
/* `display:flex` on the wrappers (a <form> and two <details>) so the button
   inside can take height:100% — without it only the wrapper stretched and the
   three buttons ended up different heights. */
.rev-actions > *, .rev-actions .inspector-action { flex: 1 1 0; min-width: 0; display: flex; }
/* rework/fine open as a sheet ABOVE the bar, not pushing the buttons around */
.rev-sheet {
    position: absolute;
    bottom: calc(100% + 0.4rem);
    left: 0.6rem; right: 0.6rem;
    background: var(--bg-surface);
    border: 0.0625rem solid var(--border);
    box-shadow: 0 0.0625rem 0.25rem rgba(0,0,0,0.3);
    padding: 0.8rem;
    max-height: 62vh; overflow-y: auto;
    z-index: 5;
}
.rev-done { display: flex; align-items: center; justify-content: center; gap: 0.4rem;
    color: var(--success); font-weight: 600; padding: 0.5rem; }
/* ── Справка одной строкой вместо семи плиток ─────────────────────────────
   `.detail-grid` из семи `.detail-item` съедал 207 px первого экрана под
   дату, объект и число рабочих. Это данные для сверки, а не для решения:
   теперь они текут одной строкой, а первый экран занимают фотографии. */
.rep-meta {
    display: flex; align-items: center; gap: 0.2rem 0.85rem; flex-wrap: wrap;
    margin-bottom: var(--space-md);
    font-family: var(--font-mono); font-size: var(--micro-size);
    letter-spacing: 0; color: var(--text-muted);
}
/* Разделяем расстоянием, а не точками. Точка между элементами при переносе
   строки уезжает в начало следующего ряда и висит там одна — CSS не знает,
   где флекс перенёс строку. */
.rep-meta-type { color: var(--text-secondary); font-weight: 700; }
.rep-meta-warn,
.fm-sitebar-stat.is-alert,
.fm-sitebar-stat.is-alert .fm-sitebar-stat-val,
.chat-msg--pending.is-failed .chat-msg-status,
.note-archive:hover,
.kpi-card.accent .kpi-value,
.kpi-mini-val.late,
.rev-actions .btn-fine    .icon,
.pf-rr-status--no { color: var(--secondary); }
/* Цвет — это заливка образца, а не иконка: показывает сам себя. Выбранный
   обведён акцентом, потому что на солнце разницу в яркости рамки не видно. */
/* Вариант заявки рисует общий `.seg-toggle`; своё здесь — только то, что
   три длинных варианта («MEP + Construction») на телефоне не влезают в строку:
   даём переключателю занять всю ширину и поделить её поровну. */
/* Підказки локації: список під полем, як меню «ещё» у шапці (той самий
   фон/тінь/z-index), рядок = назва + сірий підрядок «район, місто». */
/* «Сьогодні»: --today (0..100, без одиниць) успадковується від .gantt2, тож
   кожна доріжка ставить риску точно у своїй ширині; на осі — така сама риска. */
/* 29.09: підказки поля «назва» графіка (сховані імпортовані пункти). Список під полем
   на всю його ширину, рядок = назва + дрібний рядок дат/етапу/годин; активний рядок —
   тоновий крок фону, без кромок і крапок. */
/* p57 «Люди», замер синтетика r2 (15.10.2026). Фрейн: mobile-first, база — телефон, дальше min-width. */
/* Состав: строка человека целиком ведёт в карточку (растянутая ссылка имени), цели ≥ 2.75rem.
   «Оклад не указан» и «Назначить» — свои цели поверх растянутой ссылки. */
.fmb-color,
.geo-wrap,
.gantt2[style*="--today"] .bar--gantt,
.gantt2[style*="--today"] .gph-track,
.gantt2[style*="--today"] .gantt-rule,
.sch-field--task,
.sch2-menu,
.pp-roster tr.pp-rrow { position: relative; }
/* ── Две половины дня: утро ↔ вечер ───────────────────────────────────────
   Сегментированный переключатель в доме уже есть (`.seg-toggle` у задач и
   фильтров), берём ту же метрику: рамка в один волос, Mono прописными,
   активный сегмент плотной заливкой. Порядок в разметке хронологический,
   поэтому положение сегмента подсказывает направление свайпа. */
.rep-pair {
    display: flex;
    border: 0.0625rem solid var(--border);
    margin-bottom: var(--space-md);
}
.rep-pair-i {
    flex: 1 1 0;
    min-height: var(--tap-target);
    /* `manipulation` снимает ожидание двойного тапа: браузер иначе держит
       ~300мс на случай зума, и переключение половины дня «задумывается». */
    touch-action: manipulation;
    -webkit-tap-highlight-color: transparent;
    -webkit-user-select: none;
    user-select: none;
    display: inline-flex; align-items: center; justify-content: center;
    padding: 0 0.75rem;
    font-family: var(--font-mono); font-size: var(--micro-size); letter-spacing: 0;
    color: var(--text-secondary);
    text-decoration: none;
}
/* ── Лента доказательств ──────────────────────────────────────────────────
   Кадр во всю ширину, листается пальцем вбок. Сетка 2×168 px не давала
   разглядеть качество работ: инспектор открывал каждое фото по очереди
   в лайтбоксе. scroll-snap делает это одним движением и без JS.
   `overscroll-behavior-x: contain` — чтобы свайп по ленте не уводил
   браузер на шаг назад по истории. */
.rep-shots {
    display: flex;
    gap: var(--space-sm);
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    margin-bottom: var(--space-lg);
    /* Инерция на старом iOS: без этого лента листается «по одному тычку»,
       а все остальные скроллеры в доме её имеют. */
    -webkit-overflow-scrolling: touch;
    /* Объявляем ось явно. Иначе браузер ждёт первого обработчика, чтобы
       понять намерение, и первые кадры листания теряются. */
    touch-action: pan-x;
    /* Протаскивание по подписи начинало выделение текста прямо посреди
       жеста — на телефоне это выглядит как поломка. */
    -webkit-user-select: none;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
}
.rep-shot {
    flex: 0 0 100%;
    scroll-snap-align: center;
    position: relative;
    margin: 0;
    border: 0.09375rem solid var(--border);
    cursor: pointer;
}
/* Счётчик поверх кадра: «3/7» отвечает на вопрос «сколько ещё листать»,
   ради которого иначе нужен заголовок блока с числом. */
.rep-shot-n {
    position: absolute; left: 0; right: 0; bottom: 0;
    padding: var(--space-xs) var(--space-sm);
    font-family: var(--font-mono); font-size: var(--micro-size);
    letter-spacing: 0;
    color: #f5f2ee;
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.72));
    pointer-events: none;
}
@media (min-width: 48em) {
    /* На широком экране листать незачем — кадры влезают рядом. */
    .rep-shot { flex: 0 0 clamp(18rem, 32%, 24rem); }
}
/* ── Разбор AI ────────────────────────────────────────────────────────────
   Было: оранжевая линия сверху, «AI» и вердикт на разных строках, серый
   ящик с текстом и три строки-flex, у которых колонки не совпадали. Стало:
   шапка одной строкой, вывод обычным текстом, критерии — сетка с общими
   колонками, поэтому метки и комментарии стоят по линейке. */
.ai-head {
    display: flex;
    align-items: center;
    gap: var(--space-sm);
    margin-bottom: var(--space-sm);
}
.ai-head-title { margin: 0; border: 0; padding: 0; }
.ai-story {
    margin: 0 0 var(--space-md);
    padding: 0;
    background: none;
    font-size: var(--fs-sm);
    line-height: 1.5;
    color: var(--text-primary);
}
.ai-checks { display: grid; gap: 0; }
.att-name--dim,
.util-link--quiet,
.dm-input::placeholder,
.kpi-card.zero .kpi-value,
.tl-phase:not(.tl-current):not(.tl-done-segment) .tl-label,
.tsk-search-input::placeholder,
.tsk-search input.tsk-search-input::placeholder,
.ntf-row.is-off .ntf-ev,
.ntf-row.is-off .ntf-who,
.rq-facts dt,
.pp-left td,
.is-undone td,
.pp-fact--act[open] > summary .pp-fact-a { color: var(--text-muted); }
.att-name--miss { color: var(--secondary); }
.fm-guide-video, .fm-hint-video { width: 100%; max-width: 100%; display: block; margin: var(--space-sm) 0; background: var(--bg-elevated); }
.fm-guide-text,
.fb-gate-plaque p { margin: 0 0 var(--space-sm); }
/* Прогрес-бейдж на плитці об'єкта — той самий кут, що site-tile-count, але
   зліва (count лишається справа) і кольором --success при 100%. */
.site-tile-progress {
    position: absolute;
    top: var(--space-sm);
    left: var(--space-sm);
    min-width: 2.25rem;
    height: 1.5rem;
    padding: 0 .4rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--bg-elevated);
    color: var(--text-secondary);
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    font-weight: 700;
    line-height: 1;
    z-index: 1;
}
/* Світла тема, контраст (Ярослава 25.09.2026: «плохо видно»). Заміряно
   скриптом по 7 сторінках: помаранчевий rgb(232 101 10) текстом на сірому давав
   2.6:1, білий на помаранчевій кнопці 3.3:1, зелений 3.9:1, підпис KPI на
   сірій плашці 3.9:1. Темніший помаранчевий rgb(168 69 0) дає 4.7 текстом і 6.0
   білим на ньому; зелений №356140 — 5.7 і 7.2. Темна тема не змінена. */
.site-tile-progress--done,
.chip.chip--on { background: var(--success); color: var(--white); }
@media (prefers-color-scheme: dark) {
    /* Темна карта без ключа: тайли OpenStreetMap світлі, темних безкоштовних не
       буває. Інверсія з поворотом відтінку дає темну підкладку тими ж тайлами —
       той самий прийом, що вже стоїть на фірмовій графіці категорій
       (`--logo-invert`). Мітки і коло радіуса малює Leaflet ПОВЕРХ цього шару
       (`.leaflet-overlay-pane`, `.leaflet-marker-pane`), тож фільтр їх не чіпає. */
    :root:not([data-theme="light"]) .leaflet-tile-pane {
        filter: invert(1) hue-rotate(180deg) brightness(0.92) contrast(0.9);
    }
}
:root[data-theme="dark"] .leaflet-tile-pane {
    filter: invert(1) hue-rotate(180deg) brightness(0.92) contrast(0.9);
}
/* ── Панель правки колонок доски ──────────────────────────────────────────
   Строка на колонку: имя, порядок, сохранить, скрыть. Ряды одинаковой сетки,
   поэтому список читается столбцами, а не лесенкой. */
.bc-rows { display: flex; flex-direction: column; gap: 0.4rem; padding: var(--space-sm) 0; }
.bc-row { display: grid; grid-template-columns: minmax(8rem, 1fr) 5rem auto auto; gap: 0.4rem; align-items: center; }
.bc-row--add { border-top: 0.0625rem solid var(--border); padding-top: 0.5rem; }
@media (max-width: 40em) {
    .bc-row { grid-template-columns: 1fr 4.5rem; }
}
/* Карточка проекта на доске: заголовок ведёт внутрь объекта, под ним процент
   и этап, снизу выбор колонки (22.09.2026). */
.fm-board-card-link { display: block; color: inherit; text-decoration: none; }
.fm-board-card-note { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-secondary); margin-top: 0.15rem; }
@media (min-width: 68.8125em) {
    /* Панель уведомлений на десктопе висела на правом краю ЭКРАНА, а колокольчик
       стоит левее (за ним ещё «назад»/пузырь): панель `position: fixed` и не знает
       о `.fm-bell` с его `position: relative`, к которому визуально относится
       (Артём, 22.09.2026: «нотификейшн уезжает, он с колокольчиком не в одном
       диве?» — в одном, но fixed это родство рвёт). На телефоне fixed во всю
       ширину остаётся: там колокольчик и так у правого края, а панель шире
       бара. На широком экране панель становится выпадашкой ПОД своим
       колокольчиком, правым краем к его правому краю. */
    .fm-bell-panel {
        position: absolute;
        top: calc(100% + 0.25rem);
        right: 0;
        left: auto;
        width: 21.25rem;
        margin-inline-start: 0;
    }
}
.nav-count {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 1.1rem; height: 1.1rem; padding: 0 0.3rem; margin-inline-start: 0.3rem;
    border-radius: 0.55rem; background: var(--secondary); color: var(--white);
    font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; line-height: 1;
}
/* Рейка з поділками (Артём 24.09): на готовності кошторису була зайвою,
   звичайна смуга читалась краще; поділки лишаються лише на осі ганта. */
/* Вісь ганта як рулетка: тижні великими поділками, дні дрібними; --days
   з шаблону. Риска «сьогодні» через увесь блок, --today зі шаблону. */
.gantt-rule { position: relative; padding-top: 1rem; }
/* Гант у мові листа: код етапу квадратною чорною биркою, смуги етапів і задач
   чорно-сірі, помаранч лишається сигналом «затримка/прострочено» і рискою
   «сьогодні». Круглі помаранчеві бульбашки — знято (кутастий інтерфейс). */
.gph-bub { border-radius: 0; border-color: var(--text-primary); color: var(--text-primary); background: transparent; }
/* Смуги етапів: план — світла заливка в кольорі бренду, виконана частка —
   помаранчева (Ярослава 25.09.2026: чорні смуги не читались як прогрес). */
.gph-bar { background: color-mix(in srgb, var(--primary) 16%, var(--bg-surface)); border-color: var(--primary); }
.gph-prog { background: var(--primary); }
.imp-progress-bar span { position: absolute; inset: 0; width: 40%; background: var(--primary); animation: imp-slide 1.1s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) {
    .imp-progress-bar span { animation: none; width: 100%; opacity: 0.5; }
}
.imp-open { width: 100%; justify-content: center; }
@media (min-width: 48em) {
    .imp-open { width: auto; }
}
/* Нова зона на плані: форма в точці дотику замість prompt() (28.09). */
.fp-zone-form {
    position: absolute;
    z-index: 5;
    transform: translate(-50%, 0.75rem);
    width: min(15rem, 90%);
    display: grid;
    gap: var(--space-xs, 0.4rem);
    padding: var(--space-sm, 0.6rem);
    background: var(--bg-surface);
    border: 0.09375rem solid var(--border);
    box-shadow: 0 0.25rem 1rem rgb(0 0 0 / 0.25);
}
.fp-zone-actions { display: flex; gap: var(--space-xs, 0.4rem); }
/* Шкала під етапами (28.09): той самий рядок, що етап, тому колонки
   й «сьогодні» збігаються зі смугами; поділки — початки місяців. */
.gph-axis { cursor: default; min-height: 1.75rem; border-top: 0.0625rem solid var(--border); }
.gph-scale { height: 1.25rem; }
/* ── Сутність на плані (entity.rs, 28.09) ───────────────────────────────
   Mobile-first: одна колонка, поля на всю ширину; від 48em рядки форми
   лягають у лінію. Маркер місця несе лічильник і червоніє при прострочці. */
.fp-badge {
    position: absolute; top: -0.55rem; right: -0.7rem;
    min-width: 1.05rem; height: 1.05rem; padding: 0 0.2rem;
    display: flex; align-items: center; justify-content: center;
    background: var(--bg-surface); color: var(--text-primary);
    border: 0.0625rem solid var(--text-primary);
    font-size: 0.625rem; font-weight: 700; line-height: 1;
}
/* Численність за спеціальностями у формі звіту (28.09): рядок «підпис | − N +»,
   на телефоні підпис і степпер в одному рядку, степпер фіксованої ширини. */
.hc { border: 0; padding: 0; margin: 0 0 var(--space-md); min-width: 0; }
.hc-list { list-style: none; margin: 0; padding: 0; border-top: 0.0625rem solid var(--border); }
.hc-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--space-sm); padding: 0.35rem 0; border-bottom: 0.0625rem solid var(--border); }
.hc-step { display: grid; grid-template-columns: var(--tap-target, 2.75rem) 3.5rem var(--tap-target, 2.75rem); align-items: stretch; }
.hc-btn { min-height: var(--tap-target, 2.75rem); border: 0.0625rem solid var(--border); background: var(--bg-surface); color: var(--text-primary); font-size: var(--fs-lg, 1.25rem); line-height: 1; cursor: pointer; touch-action: manipulation; }
.hc-input { text-align: center; min-width: 0; width: 100%; border-left: 0; border-right: 0; font-variant-numeric: tabular-nums; -moz-appearance: textfield; }
.hc-total { margin: 0.5rem 0 0; font-size: var(--fs-sm); color: var(--text-secondary); }
@media (min-width: 48em) {
    .hc-list { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: var(--space-lg); }
}
.rep-hc { display: block; font-size: var(--fs-xs); color: var(--text-secondary); margin-top: 0.15rem; overflow-wrap: anywhere; }
.sug-list { position: absolute; left: 0; right: 0; top: 100%; z-index: 30; margin: 0.125rem 0 0; padding: 0;
    list-style: none; background: var(--bg-surface); border: 0.0625rem solid var(--border);
    max-height: min(22rem, 60dvh); overflow-y: auto; overscroll-behavior: contain; }
.sug-opt { display: flex; flex-direction: column; gap: 0.125rem; padding: 0.5rem 0.625rem; min-height: var(--tap-target);
    justify-content: center; cursor: pointer; border-bottom: 0.0625rem solid var(--border); }
.sug-more { padding: 0.375rem 0.625rem; }
/* ══ p13 (29.09.2026): один рядок додавання + рядок «+» під батьком ══════════════
   Етап — combobox (список під полем, як підказки назви), «+ Создать этап» — останній
   рядок списку, дати нового етапу — у цьому ж рядку. Рядок «+» (#sch-child) — одна
   форма, яку app.js переносить під об'єкт, етап або пункт. Висоти полів і кнопок —
   одна --tap-target. Без кромок, крапок і заливок-акцентів. */
.sch-field--phase { position: relative; }
/* 30.09: свій набір іконок — вбудовані в шаблони <svg> (≈20 шаблонів, Lucide-стиль) переводимо
   однією правою: CSS-властивість сильніша за атрибут presentation у SVG. Кінці й стики прямі,
   як у static/icons.svg. План (Leaflet) не чіпаємо. */
svg:not(.leaflet-zoom-animated) :is(path, line, polyline, polygon, rect, circle)[stroke],
svg[stroke]:not(.leaflet-zoom-animated) :is(path, line, polyline, polygon) { stroke-linecap: square; stroke-linejoin: miter; }
/* p44-6: двери папки (процессы из folder_processes) и поиск по объектам. Телефон: одна колонка, от 48em две. Прямые углы, рамка 1 px, активная дверь залита. */
.fp-doors { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-sm); margin: 0 0 var(--space-md); }
/* ── p48 (созвон BE 09.10): графік. Mobile-first: база — телефон, далі min-width. ── */
/* p48-1: дата дд.мм.гг з будь-якою мовою браузера (macros.html dt). Текстове поле + значок;
   прозорий нативний пікер лежить на значку: дотик відкриває календар ОС. */
.dt { position: relative; display: flex; align-items: center; min-width: 0; }
