/* Общее между экранами: примитивы, глобальные переопределения, селекторы разных тем. */
@media (hover: hover) {
    .site-tile--folder:hover .site-tile-img,
    .zone-back:hover { color: var(--primary); }
    .site-tile-edit,
    .gallery-overlay,
    .pp-hl::after,
    .pp-hr::after { opacity: 0; }
}
.sch-in--num,
.pp-table th.pp-num { text-align: right; }
.gantt-axis,
.fm-qsheet-item:last-child,
.rolecard-item:last-child,
.fm-bell-item:last-child {
    border-bottom: none;
}
/* Прежний вид вывода AI (серый ящик с оранжевой чертой сверху) перебит
   правилом в конце файла — держим одно определение, чтобы черта не всплыла
   снова после следующей правки. */
#project-map, #report-map, #daily-map {
    border: 0.09375rem solid var(--border) !important;
    border-radius: 0;
}
.kpi-mini,
.done-stat,
.bc-row .bc-sort { text-align: center; }
.fm-bell-btn:hover,
.geo-suggest li[role="option"]:hover,
.geo-suggest li[aria-selected="true"] { background: var(--bg-surface); color: var(--text-primary); }
.fm-bell-dismiss:hover, .fm-bell-dismiss:focus-visible { color: var(--text-primary); background: var(--bg-base); outline: none; }
.fm-bell-item-link:hover { background: var(--bg-base); text-decoration: none; }
.fm-bell-item-time.sev-warning,
.pp-undo-bar button { color: var(--primary);   font-weight: 700; }
.fm-send-check-b,
[data-fm-swipe="on"] .assignment-card[data-swipe]::before { opacity: 0; }
.rev-actions .action-item .btn-approve .icon,
.rq-tabs a[aria-current="page"] .rq-count,
.fp-door.is-on .fp-door-n { color: inherit; }
.rev-done .icon,
.cle-on input { width: 1.1rem; height: 1.1rem; }
/* Keep the report body clear of the bar + tab bar. */
body:has(.fm-actionbar .rev-bar),
html:has(.pp-pal) body {
    padding-bottom: calc(7rem + env(safe-area-inset-bottom, 0rem));
}
/* Фильтры страницы в том же хосте: сетка не должна прятаться под ним. */
body:has(.fm-actionbar .gal-types) {
    padding-bottom: calc(7rem + env(safe-area-inset-bottom, 0rem));
}
.rl-tally b:last-child,
.seg-toggle a:last-child { border-right:0; }
/* Строка целиком — ссылка, поэтому глобальное a:hover{underline} подчёркивало
   время, имя и объект разом. Подчёркивание тут ничего не сообщает: кликается
   вся строка, а не слово. */
.rl-row:hover, .rl-row:hover * { text-decoration:none; }
.rr-card {
    background: var(--bg-surface);
    border: 0.09375rem solid var(--border);
    /* Ожидающее решение — полная рамка основного цвета, без акцентной кромки. */
    border-color: var(--primary);
    padding: var(--space-md);
    margin-bottom: var(--space-sm);
}
.rr-claim {
    font-size: var(--fs-sm); line-height: 1.5;
    margin: var(--space-sm) 0;
}
.rr-decide {
    display: flex; flex-wrap: wrap; gap: var(--space-sm);
    margin-top: var(--space-sm);
}
.rep-shot--video,
.kpi-link--static,
body.tsk-picking .rl-row--task { cursor: default; }
.cpe-rule.is-off input,
.tb-card.is-dragging { opacity: 0.5; }
.estimate-stage--skipped,
.pl-rename.is-saving .form-input { opacity: 0.7; }
.tb-card.is-saving,
.wizard-photo.is-uploading,
.rl-more.htmx-request { opacity: 0.6; pointer-events: none; }
.btn-ghost, .btn-secondary { color: var(--text-primary); border: 0.0625rem solid var(--text-primary); background: transparent; }
@media (prefers-reduced-motion: no-preference) {
    /* ── Штамп аркуша: основний напис, як на кресленні. Дані справжні. ── */
    /* Рух лише у відповідь на дію: жодних hover-зсувів і тіней. */
    .site-tile, .action-btn, .tb-card { transition: none; }
}
/* Гліфи ✓ ✎ замінені на SVG тієї ж родини (icons.svg). */
.fb-ok .icon, .fb-note-btn .icon, .tb-cnt .icon { width: 1rem; height: 1rem; vertical-align: -0.15rem; }
.form-input, .form-select, .form-textarea, input[type="text"], input[type="number"], input[type="date"], input[type="search"], select, textarea {
    outline-offset: 0;
}
.form-input:focus-visible, .form-select:focus-visible, .form-textarea:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible {
    outline: 0.125rem solid var(--link) !important; outline-offset: -0.0625rem; border-color: var(--link);
}
.cle-del:hover, .tb-move:hover, .fb-mode:hover, .cpe-rule-add:hover, .cpe-add-in-group:hover, .cle-mv:hover, .sc-tool:hover { background: var(--text-primary); color: var(--bg-base); }
/* Свідомі винятки капсу: вивіска об'єкта і назва листа. */
.po-header h1, .fb-title { text-transform: uppercase; }
.fv-mode + .fv-mode,
.fp-seg-a + .fp-seg-a { border-left: 0.0625rem solid var(--text-primary); }
.pl-site a,
.dm-avatar--notes,
.fm-bell-item-time.sev-info,
.tl-phase.tl-done-segment .tl-label,
.tsk-chip:hover,
.ai-checks .ai-text,
.fb-review-row dt,
.po-section-title::before,
.doc-storage-state,
.sch2-row--new > input[name="name"]::placeholder,
.tb-place .tb-place--none,
.pp-target span { color: var(--text-secondary); }
/* Задачі з дедлайном на ганті об'єкта (/schedule): та сама шкала часу. */
.np a,
.gantt-tasks .gantt-label a { color: inherit; text-decoration: none; }
@media print {
    /* Друк: газету друкують на A4, як у зразку. Хром застосунку ховаємо. */
    .header, .nav, .fm-bottombar, .nav-footer, .np-tools, .np-note { display: none !important; }
}
.ss--delay,
.gantt-tasks .bar-fill[data-status="overdue"],
.sph-late { background: var(--late); }
.ss--rest { background: var(--plan); }
.gantt-label[data-status="delayed"],
.wk-task[data-status="delayed"],
.sph-forecast--late,
.kpi-grid:has(+ .sch-statusbar) .kpi-card.accent .kpi-value { color: var(--late); }
.syn-pain,
.tsk-mine-row.is-late .tsk-mine-meta,
.syn-last.is-fail,
.syn-click.is-err .syn-kind { color: var(--late, var(--hazard-text)); }
.syn-fb,
.pp-opt--leave b,
.pp-today-i.is-leave .pp-today-now { font-style: italic; }
.ent-field dd,
.pp-dl dd { margin: 0; overflow-wrap: anywhere; }
.vis-note a { color: var(--text-primary); text-decoration: underline; }
.dreg-by, .doc-by-note { display: block; font-size: var(--micro-size); color: var(--text-muted); }
.fb-ctl > .fb-note-btn,
.dm-site-filter a { flex: 0 0 auto; }
/* Обов'язкові поля: кнопка «чекає на введення», червона рамка й підказка після спроби (app.js).
   29.09 (Артём, скрін проду): сіра напівпрозора плита читалась як зламана кнопка. Тепер —
   звичайна кнопка контуром: той самий розмір і шрифт, текст приглушений, без заливки. */
.is-blocked, button.is-blocked.btn, button.is-blocked.sch-add-btn, button.is-blocked.chip {
    opacity: 1; filter: none; cursor: not-allowed;
    background: transparent; color: var(--text-secondary);
    border: 0.0625rem solid var(--border); box-shadow: none; }
.sch-subs { grid-column: 1 / -1; font-size: var(--fs-xs); color: var(--text-secondary); }
.ph-undo { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 0 0 var(--space-sm); font-size: var(--fs-sm); color: var(--text-secondary); }
.sch-tools > *, .sch-tools .imp-open { flex: 1 1 auto; margin: 0; }
.sch-child { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0.5rem; align-items: end;
    margin: 0.25rem 0 0.5rem; padding: 0.5rem 0.25rem 0.6rem; background: var(--bg-elevated); min-width: 0; }
.sch-child-cap { margin: 0; font-size: var(--fs-sm); color: var(--text-primary); font-weight: 600; overflow-wrap: anywhere; }
.sch-child-act { display: flex; gap: 0.5rem; }
/* Під пунктом рядок стоїть у прокручуваній таблиці: липне до лівого краю видимої частини. */
.sch-child-slot--sub { position: sticky; left: 0; width: min(100%, 60rem); padding-inline-start: 1.5rem; box-sizing: border-box; }
@media (max-width: 47.99em) {
    .sch-child-slot--sub { width: auto; padding-inline-start: 1rem; }
}
@media (min-width: 48em) {
    .sch-tools > *, .sch-tools .imp-open { flex: 0 0 auto; width: auto; }
    .sch-child { display: flex; flex-wrap: wrap; }
}
.sch2-head { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-muted); padding: 0 0 0.35rem; border-bottom: 0.0625rem solid var(--border); }
.sch2-ph,
#btn-add-item,
.cle-add,
.estimate-handover-form { margin-top: var(--space-md); }
.sch2-phbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.75rem; padding: 0.5rem 0; border-bottom: 0.0625rem solid var(--text-primary); }
.sch2-phhead { display: flex; align-items: center; gap: 0.5rem; flex: 1 1 34rem; min-width: 0; margin: 0; }
.sch2-phname { flex: 1 1 12rem; min-width: 0; font-family: var(--font-display); font-weight: 600; font-size: var(--fs-md); }
input.sch2-phname { background: transparent; border-color: transparent; }
.sch2-dash { color: var(--text-muted); }
.sch2-phsum { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem 0.75rem; color: var(--text-secondary); font-size: var(--fs-xs); }
.sch2-rows { display: flex; flex-direction: column; }
.sch2-row { padding: 0.3rem 0; border-bottom: 0.0625rem solid var(--border); margin: 0; }
.sch2-row--new { background: var(--bg-elevated); padding-inline: 0.25rem; }
.sch2-act { display: flex; align-items: center; justify-content: flex-end; gap: 0.25rem; }
.sch2-marks { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 0.25rem 0.75rem; font-size: var(--fs-xs); }
.sch2-marks:not(:has(*)) { display: none; }
.sch2-err { grid-column: 1 / -1; margin: 0; color: var(--invalid); font-size: var(--fs-xs); }
.sch2-msg { color: var(--invalid); border: 0.0625rem solid var(--invalid); padding: 0.5rem 0.75rem; margin: 0 0 0.5rem; }
.sch2-add { height: var(--tap-target); min-height: var(--tap-target); padding: 0 0.9rem; border: 0.0625rem solid var(--text-primary); background: transparent; color: var(--text-primary); font-weight: 600; cursor: pointer; white-space: nowrap; }
.sch2-pop { position: absolute; right: 0; top: calc(100% + 0.25rem); z-index: 30; display: grid; gap: 0.5rem; min-width: 17rem; padding: 0.6rem; background: var(--bg-surface); border: 0.0625rem solid var(--text-primary); }
.sch2-item { display: flex; align-items: center; gap: 0.4rem; color: var(--text-primary); }
.sch2-newph { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; padding: 0.75rem 0; margin-top: var(--space-md); border-top: 0.0625rem solid var(--text-primary); }
.sch2-newph .sch2-err,
.rq-calc-who > .rq-calc-lab:first-child,
.rq-calc-who > form { flex-basis: 100%; }
.sch2-plus,
.fmb-send[disabled] { opacity: 0.6; }
@media (max-width: 78.99em) {
    .sch2-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); padding: 0.6rem 0.5rem; border: 0.0625rem solid var(--border); margin-top: 0.4rem; background: var(--bg-surface); }
    .sch2-row > input[name="task_name"],
    .sch2-row > input[name="name"],
    .sch2-act { grid-column: 1 / -1; }
    .sch2-row--sub { margin-inline-start: 1rem; }
    .sch2-row .sch2-dim,
    .sch2-dash,
    .sch2-phsum .sph-prog,
    .sch2-phsum .sph-hours,
    .sch2-phsum .sph-forecast,
    .sch2-phsum .sph-unassigned,
    .sch2-m-sum::-webkit-details-marker,
    .sch2-row > .sch-grip { display: none; }
    .sch2-phhead { flex-wrap: wrap; }
    .sch2-pop { min-width: min(17rem, calc(100vw - 2rem)); }
}
/* ── p14 телефон (< 64em), Фрейн: одна «трубка» контенту, без коробок і рамок-карток,
   рядки розділені тонкою лінією; задача — рядок у два ряди, поля з підписами лише
   в розкритому рядку. Шрифт полів 1rem: iOS збільшує сторінку на полі дрібніше 16 px. ── */
.sch2-m, .sch2-m-title, .sch2-only-m { display: none; }
@media (max-width: 78.99em) {
    .sch2-head, .sch2-row, .sch2-phbar > form.sch2-phhead, #sch-newph { display: none; }
    .sch2-m { display: block; border-bottom: 0.0625rem solid var(--border); }
    .sch2-only-m { display: block; }
    .sch2-ph { margin-top: var(--space-sm); }
    .sch2-phbar { flex-wrap: nowrap; gap: 0.5rem; padding: 0.55rem 0; }
    .sch2-m-title { display: flex; align-items: center; gap: 0.5rem; flex: 1 1 auto; min-width: 0; }
    .sch2-phsum { flex: 0 0 auto; flex-wrap: nowrap; gap: 0.5rem; }
    .sch2-m-sum { list-style: none; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.15rem 0.5rem; padding: 0.6rem 0; cursor: pointer; }
    .sch2-m-name { font-weight: 600; min-width: 0; overflow-wrap: anywhere; }
    .sch2-m-meta { grid-column: 1 / -1; font-size: var(--fs-xs); color: var(--text-secondary); }
    .sch2-chip { font-size: var(--fs-xs); padding: 0.1rem 0.45rem; border: 0.0625rem solid var(--border); white-space: nowrap; align-self: start; color: var(--text-secondary); }
    .sch2-chip--in_progress { color: var(--text-primary); border-color: var(--text-primary); }
    .sch2-chip--completed { color: var(--success); border-color: var(--success); }
    .sch2-chip--delayed { color: var(--hazard-text, var(--secondary)); border-color: currentColor; }
    .sch2-m-form { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0.5rem 0.6rem; padding: 0 0 0.8rem; margin: 0; }
    .sch2-f { display: grid; gap: 0.2rem; min-width: 0; }
    .sch2-f--wide { grid-column: 1 / -1; }
    .sch2-m-acts { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 1rem; }
    .sch2-m-act { color: var(--text-primary); text-decoration: underline; }
    .sch2-m-move { display: flex; gap: 0.4rem; flex: 1 1 100%; }
    /* 02.11: длинная подпись «Перенести в …» не выталкивает строку за 390 px (scrollWidth 406). */
    .sch2-m-move { min-width: 0; }
    .sch2-m-move > .chip { flex: 0 1 auto; min-width: 0; white-space: normal; }
    .sch2-m-plus { grid-template-columns: minmax(0, 1fr); color: var(--text-secondary); font-weight: 600; }
    .sch2-pop .sch2-m-form, .sch2-edit form { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0.5rem; }
    .sch2-newph + .sch2-m-newph, .sch2-m-newph { margin-top: var(--space-sm); border-top: 0.0625rem solid var(--text-primary); }
}
/* Купер §39–40, §48 (30.09): одна рядок стану над таблицею; опасне — окремо й кольором. */
.sch2-kpi { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 1rem; margin: 0 0 0.35rem; color: var(--text-secondary); }
.sch2-kpi-late { color: var(--hazard-text, var(--secondary)); font-weight: 600; }
.sch2-danger { background: none; border: 0; padding: 0.4rem 0; color: var(--invalid); text-align: left; cursor: pointer; border-top: 0.0625rem solid var(--border); margin-top: 0.25rem; width: 100%; }
.sch2-m-acts .sch2-danger { width: auto; border-top: 0; margin: 0; text-decoration: underline; }
@media (max-width: 63.99em) {
    .sch-tools { display: flex; flex-wrap: wrap; gap: 0.5rem; }
    .sch-tools .imp-open, .sch-tools .sch-assign-form, .sch-tools .sch-assign-form .imp-open { width: auto; flex: 0 0 auto; min-height: 2.25rem; padding: 0.3rem 0.7rem; font-size: var(--fs-xs); }
}
.tb-src a { padding: 0.35rem 0.8rem; border: 0.0625rem solid var(--border); color: var(--text-secondary); text-decoration: none; }
.tb-count { color: var(--text-secondary); font-size: var(--fs-xs); margin: 0 0 0.5rem; }
.tb-place { font-size: var(--fs-xs); margin-top: 0.3rem; }
.tb-place a { display: inline-flex; align-items: center; gap: 0.3rem; color: var(--text-primary); }
.tb-mark { color: var(--hazard-text, var(--secondary)); }
.ntf-hint,
.dl-hint { color: var(--text-secondary); font-size: var(--fs-sm); margin: 0.25rem 0 var(--space-md); max-width: 48rem; }
.ntf-gtitle { font-family: var(--font-display); font-size: var(--fs-md); margin: var(--space-md) 0 0.25rem; }
.ntf-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)) 2.75rem; grid-template-areas: "ev ev ev more" "who who who who"; gap: 0 0.5rem; align-items: center; padding: 0.35rem 0; border-bottom: 0.0625rem solid var(--border); }
.ntf-who { grid-area: who; color: var(--text-secondary); font-size: var(--fs-xs); }
.ntf-more { grid-area: more; position: relative; }
.ntf-tgl { display: inline-flex; flex-direction: column; align-items: flex-start; gap: 0.2rem; min-height: 2.75rem; max-width: 100%; padding: 0.35rem 0; background: none; border: 0; color: var(--text-muted); cursor: pointer; font: inherit; font-size: var(--fs-xs); }
.ntf-tgl-box { width: 2.25rem; height: 1.25rem; border: 0.0625rem solid var(--border); position: relative; flex: 0 0 auto; background: var(--bg-base); }
.ntf-pop { position: absolute; right: 0; top: 100%; z-index: 30; width: min(26rem, calc(100vw - 2rem)); padding: 0.75rem; display: grid; gap: 0.5rem; background: var(--bg-surface); border: 0.0625rem solid var(--text-primary); }
@media (min-width: 64em) {
    .ntf-cols, .ntf-row { display: grid; grid-template-columns: var(--ntf-cols); grid-template-areas: none; gap: 0 0.75rem; }
    .ntf-cols { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-muted); padding-bottom: 0.35rem; border-bottom: 0.0625rem solid var(--text-primary); }
    .ntf-ev, .ntf-who, .ntf-more { grid-area: auto; }
    .ntf-who { font-size: inherit; }
    .ntf-tgl { flex-direction: row; align-items: center; padding: 0; }
    .ntf-tgl-lbl { position: absolute; width: 0.0625rem; height: 0.0625rem; overflow: hidden; clip-path: inset(50%); }
}
/* 01.10: чати з картки об'єкта — назва об'єкта і «Все чаты» над списком. */
.dm-site-filter { display: flex; justify-content: space-between; align-items: baseline; gap: 0.75rem; padding: 0.5rem 0.75rem; border-bottom: 0.0625rem solid var(--border); font-size: var(--fs-sm); }
/* ── Заявки на просчёт (p27): список и карточка. Mobile-first (Френ): база — телефон,
   строка заявки = 2-3 строки текста без фото; таблица-сетка только от 64em. ── */
.rq .visually-hidden,
.rq-lab,
.fp-search .visually-hidden { position: absolute; width: 0.0625rem; height: 0.0625rem; margin: -0.0625rem; padding: 0; overflow: hidden; clip: rect(0 0 0 0); border: 0; white-space: nowrap; }
.rq-search { display: flex; flex-wrap: wrap; gap: var(--space-xs); margin: 0 0 var(--space-sm); }
.rq-search-field { flex: 1 1 8rem; display: block; min-width: 0; }
.rq-assignee-field { flex: 1 1 100%; order: 3; display: block; min-width: 0; }
@media (min-width: 48em) {
    .rq-assignee-field { flex: 0 1 14rem; order: 0; }
}
/* p30-1: состояния = крупные сегменты. Основные три и вторичные два — две сетки; на телефоне 3+2 строками
   (все пять видны сразу, без прокрутки, которую не заметят), от 48em одной полосой 3fr 2fr. Активный = залит. */
.rq-tabs { margin: 0 0 var(--space-md); display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-xs); }
.rq-tabs-main { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.rq-tabs-more { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.rq-tabs a { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.125rem; min-height: max(var(--tap-target), 3.25rem); padding: var(--space-xs) var(--space-sm); box-sizing: border-box; color: var(--text-secondary); text-decoration: none; text-align: center; background: var(--bg-surface); border: 0.0625rem solid var(--border); font-size: var(--fs-md); line-height: 1.2; overflow-wrap: anywhere; }
.rq-tabs-main a { font-weight: 600; color: var(--text-primary); }
@media (min-width: 48em) {
    .rq-tabs { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: var(--space-md); }
    .rq-tabs a { flex-direction: row; gap: var(--space-sm); }
}
.rq-count { font-family: var(--font-mono); font-weight: 400; color: var(--text-muted); margin-left: 0.25em; }
.rq-table { display: block; min-width: 0; }
.rq-row { display: flex; flex-wrap: wrap; gap: 0.15rem 1rem; padding: var(--space-sm) 0; border-top: 0.0625rem solid var(--border); min-width: 0; }
.rq-row--head { display: none; }
.rq-cell { min-width: 0; overflow-wrap: anywhere; font-size: var(--fs-xs); color: var(--text-secondary); }
.rq-name { flex: 1 1 100%; font-size: var(--fs-sm, 1rem); color: var(--text-primary); }
.rq-name a { font-weight: 600; color: var(--text-primary); text-decoration: none; display: inline-block; min-height: 1.5rem; }
.rq-addr { display: block; font-size: var(--fs-xs); color: var(--text-muted); font-weight: 400; }
.rq-late { color: var(--invalid); font-weight: 700; }
.rq-none { color: var(--text-muted); }
.rq-act { display: none; }
.rq-created { display: none; }
.rq-inline { display: flex; gap: var(--space-xs); min-width: 0; flex: 1 1 14rem; }
@media (min-width: 64em) {
    .rq-row { display: grid; grid-template-columns: minmax(0, 2.2fr) minmax(0, 1fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1.2fr) minmax(0, 0.8fr) minmax(0, 2fr); gap: var(--space-sm); align-items: start; }
    .rq-row--head { display: grid; font-size: var(--micro-size); color: var(--text-muted); padding-top: 0.3rem; padding-bottom: 0.3rem; border-top: 0; border-bottom: 0.0625rem solid var(--text-primary); }
    .rq-name { flex: none; }
    .rq-created { display: block; }
    .rq-act { display: flex; flex-direction: column; align-items: flex-start; }
    .rq-inline { flex: none; }
}
/* Карточка заявки: шапка, вкладки-ссылки, действия. */
.rq-card { display: flex; flex-direction: column; gap: var(--space-md); min-width: 0; }
.rq-facts { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-md); margin: var(--space-xs) 0 0; font-size: var(--fs-xs); color: var(--text-secondary); }
.rq-state,
.tl-current .tl-label { font-weight: 700; color: var(--text-primary); }
.rq-card-tabs { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-md); border-bottom: 0.0625rem solid var(--border); }
.rq-card-tabs a { display: inline-flex; align-items: center; min-height: 2.75rem; padding: 0 var(--space-sm); color: var(--text-secondary); text-decoration: none; }
.rq-actions { display: flex; flex-wrap: wrap; gap: var(--space-sm); align-items: flex-start; }
.rq-hint { font-size: var(--fs-xs); color: var(--text-muted); margin: 0; flex: 1 1 100%; }
.rq-folders { list-style: none; margin: 0; padding: 0; }
.rq-folders a { display: flex; justify-content: space-between; gap: var(--space-sm); padding: var(--space-sm) 0; min-height: 2.75rem; align-items: center; color: var(--text-primary); text-decoration: none; }
.doc-actions-row { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--space-sm); }
.doc-actions-row form,
.ntf-ch,
.rq-calc-act form { margin: 0; min-width: 0; }
/* ── p27-10..12: парные показатели над вкладками, пробелы перед назначением ──
   Mobile-first (Фрейн): база = телефон, число несёт смысл текстом и цифрой, без плашек.
   Цвет ошибки (--invalid) только на числе просрочки. */
.rq-pair { display: flex; flex-wrap: wrap; gap: 0 var(--space-md); margin: 0 0 var(--space-xs); font-size: var(--fs-sm); }
.rq-pair a { display: inline-flex; align-items: center; min-height: 2.75rem; color: var(--text-secondary); text-decoration: none; min-width: 0; }
.rq-pair-n { font-family: var(--font-mono); font-weight: 700; margin-left: 0.35em; color: var(--text-primary); }
.rq-pair-n--late { color: var(--invalid); }
.rq-gaps { flex: 1 1 100%; min-width: 0; font-size: var(--fs-xs); }
.rq-gaps-head { color: var(--text-secondary); font-weight: 600; }
.rq-gaps-ok { color: var(--text-muted); }
.rq-gaps-list { margin: var(--space-xs) 0 0; padding-left: 1.25rem; color: var(--text-primary); overflow-wrap: anywhere; }
.rq-take-form { flex-wrap: wrap; }
.proc-sub { display: block; color: var(--text-secondary); font-size: var(--fs-xs); }
.proc-legend, .proc-filter { color: var(--text-secondary); font-size: var(--fs-sm); margin: var(--space-sm) 0 0; }
.proc-late,
.proc-table tr.is-late td:first-child { color: var(--late); font-weight: 700; }
@media (max-width: 47.99em) {
    .proc-table, .proc-table tbody, .proc-table tr, .proc-table td { display: block; width: 100%; }
    .proc-table td { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-md); padding: var(--space-xs) 0; border: 0; min-width: 0; text-align: right; overflow-wrap: anywhere; background: none; }
    .proc-limiting td { background: none; }
}
.bp-wrap { overflow-x: auto; overscroll-behavior-x: contain; min-width: 0; max-width: 100%; background: var(--bg-base); border: 0.0625rem solid var(--border); padding: var(--space-sm); }
.bp { display: block; max-width: none; color: var(--text-primary); font-family: var(--font-sans); }
/* p30-2: анкета первым блоком страницы заявки. Кнопка на всю ширину, состояние анкеты под названием;
   форма раскрывается под кнопкой на месте (не окно), «Закрыть» под формой. */
.rq-q { margin: var(--space-md) 0; min-width: 0; }
.rq-q-name { font-size: var(--fs-lg); font-weight: 700; }
.rq-q-state { font-size: var(--fs-sm); font-weight: 400; overflow-wrap: anywhere; }
.rq-q-panel { min-width: 0; margin-top: var(--space-sm); padding: 0; }
.rq-q-close { margin-top: var(--space-sm); min-height: var(--tap-target); }
.rq-objlink { margin: var(--space-xs) 0 0; font-size: var(--fs-sm); }
/* ─── p30-7: блок «Просчёты» заявки (calc.rs, partials/calc_block.html) ─────────────────────
   Телефон: каждая система карточкой одна под другой (имя + статус, исполнитель, файл, действия).
   С 48em статус справа от имени, с 64em действия справа от исполнителя и файла (08.10: в пять колонок
   имя и исполнитель сжимались до букв на 1024). Состояние несут текст и вес, не цвет кромки. */
.rq-calc { margin-top: var(--space-lg); padding-top: var(--space-md); border-top: 0.0625rem solid var(--border); min-width: 0; }
.rq-calc-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--space-xs) var(--space-md); }
.rq-calc-title { margin: 0; font-family: var(--font-display); font-size: var(--fs-lg); }
.rq-calc-sum { flex: 1 1 12rem; min-width: 0; margin: 0; font-size: var(--fs-sm); color: var(--text-secondary); }
.rq-calc-sum-n { font-size: var(--fs-lg); color: var(--text-primary); font-variant-numeric: tabular-nums; }
.rq-calc-rows { list-style: none; margin: var(--space-md) 0 0; padding: 0; display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-sm); }
.rq-calc-row { display: grid; grid-template-columns: minmax(0, 1fr); grid-template-areas: "name" "badge" "who" "file" "act" "msg";
  gap: var(--space-xs) var(--space-sm); padding: var(--space-md); background: var(--bg-surface); border: 0.0625rem solid var(--border); min-width: 0; }
.rq-calc-row--skipped { opacity: 0.7; }
.rq-calc-row--total { background: var(--bg-elevated); }
.rq-calc-name { grid-area: name; font-weight: 700; overflow-wrap: break-word; hyphens: auto; min-width: 0; }
.rq-calc-badge { grid-area: badge; align-self: start; font-size: var(--fs-xs); font-weight: 600; padding: 0.125rem 0.5rem; border: 0.0625rem solid currentColor; justify-self: start; text-align: left; overflow-wrap: break-word; min-width: 0; max-width: 100%; color: var(--text-secondary); }
.rq-calc-badge a { color: inherit; text-decoration: underline; }
.rq-calc-badge--active { color: var(--text-primary); }
.rq-calc-badge--done { color: var(--success-text, var(--success)); }
.rq-calc-who, .rq-calc-file { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs) var(--space-sm); font-size: var(--fs-sm); min-width: 0; overflow-wrap: anywhere; }
.rq-calc-who { grid-area: who; }
.rq-calc-file { grid-area: file; }
.rq-calc-lab { color: var(--text-muted); font-size: var(--fs-xs); }
.rq-calc-val { min-width: 0; }
.rq-calc-link { color: var(--link, var(--primary)); text-decoration: underline; min-width: 0; overflow-wrap: anywhere; }
.rq-calc-amt { margin-left: auto; font-variant-numeric: tabular-nums; white-space: nowrap; }
.rq-calc-act { grid-area: act; display: flex; flex-wrap: wrap; gap: var(--space-sm); min-width: 0; }
.rq-calc-inline { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); margin: 0; min-width: 0; }
.rq-calc-pick { position: relative; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; min-height: var(--tap-target); }
.rq-calc-fileinput { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; font-size: var(--fs-md); }
.rq-calc-msg { grid-area: msg; margin: 0; font-size: var(--fs-sm); color: var(--text-secondary); min-width: 0; overflow-wrap: anywhere; }
.rq-calc-msg--err { color: var(--danger-text, var(--danger, currentColor)); font-weight: 600; }
.rq-calc-del { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); min-width: 0; }
.rq-calc-del-q,
.site-card .site-name,
.rq-tabs-more a { font-size: var(--fs-sm); }
.rq-calc-amount-edit { flex: 1 1 100%; font-size: var(--fs-xs); color: var(--text-secondary); }
@media (min-width: 48em) {
    .rq-calc-row { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "name badge" "who who" "file file" "act act" "msg msg"; align-items: start; column-gap: var(--space-lg); }
    .rq-calc-badge { justify-self: end; }
    .rq-calc-amt { margin-left: 0; }
}
@media (min-width: 64em) {
    .rq-calc-row { grid-template-areas: "name badge" "who act" "file act" "msg msg"; }
    .rq-calc-act { align-self: center; justify-content: flex-end; }
}
/* ── Анкета: «Не отвечено» (06.10.2026). Состояние текстом и весом, без кромок и точек. ── */
.fb-unans,
.rq-q-missing { margin: 0 0 var(--space-md); min-width: 0; font-size: var(--fs-sm); }
.fb-unans-ok { color: var(--text-secondary); }
.fb-unans-list { margin: 0; padding: 0 0 0 1.5rem; display: grid; gap: 0.25rem; }
.fb-unans-list a, .fb-unans-head a { text-decoration: underline; }
.fb-miss { display: none; font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; margin-left: var(--space-xs); color: var(--hazard-text); }
/* ── p39 (06.10): порядок етапів і пунктів — ручка, жест, «Выше/Ниже» ─────────────────
   Ручка — єдине місце з touch-action:none (скрол решти рядка не чіпаємо); на дотику жест
   починає довге утримання (app.js wireScheduleDrag). Місце вставки — проміжок, не кромка.
   Піднятий рядок — копія в шарі `.sch-ghost` (клон без id), оригінал стискається в нуль. */
.sch-grip { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; padding: 0; border: 0; background: none; color: var(--text-muted); cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; }
.sch-grip--ph { width: 1.75rem; height: 2.5rem; margin-inline-end: -0.25rem; }
.sch-grip--m { display: none; }
.sch2-unit { position: relative; }
.sch2-steps { display: flex; flex-wrap: wrap; gap: 0.4rem; margin: 0; }
@media (min-width: 79em) {
    .sch2-row > .sch-grip { position: absolute; inset-inline-start: 0; top: 1.3rem; width: 1.75rem; height: 2.5rem; transform: translateY(-50%); }
}
@media (max-width: 78.99em) {
    .sch-grip--m { display: inline-flex; position: absolute; z-index: 2; inset-inline-start: 0; top: 0; width: 2.5rem; height: 2.75rem; }
    .sch2-unit--sub > .sch-grip--m { inset-inline-start: 1rem; }
    .sch-grip--ph { width: 2.5rem; height: 2.75rem; }
    /* Смуга етапу на телефоні: ручка забрала 2.5rem і стиснула назву до нуля (виміряно: 54 → 10 px у етапу з довгим
           підсумком), тож підсумок переходить на другий ряд, коли не вміщається. */
    .sch2-phbar { flex-wrap: wrap; row-gap: 0; }
    .sch2-m-title { flex: 1 1 9rem; flex-wrap: wrap; row-gap: 0; }
    .sch2-phsum { flex: 0 1 auto; flex-wrap: wrap; }
}
/* Піднятий рядок: оригінал схлопується в нуль (лишається в DOM, щоб дотик не втратив ціль), копія їде за пальцем. */
.sch-lifted { height: 0 !important; min-height: 0; margin: 0 !important; padding: 0 !important; border: 0 !important; overflow: hidden; opacity: 0; pointer-events: none; }
.sch-gap { flex: 0 0 auto; pointer-events: none; }
.sch-ghost { position: fixed; inset-block-start: 0; z-index: 90; margin: 0; pointer-events: none; background: var(--bg-surface); box-shadow: 0 0.5rem 1.75rem rgb(0 0 0 / 0.22); will-change: transform; }
.sch-ghost details.sch2-menu, .sch-ghost .sch2-marks { display: none; }
.sch-drag-on, .sch-drag-on * { user-select: none; -webkit-user-select: none; cursor: grabbing; }
.sch-drag-phases .sch2-rows, .sch-drag-phases #sch-newph, .sch-drag-phases .sch2-m-newph, .sch-drag-phases .sch2-head { display: none; }
.dl-saved { margin: 0 0 var(--space-sm); font-weight: 600; }
.dl-gtitle { font-family: var(--font-display); font-size: var(--fs-md); margin: var(--space-md) 0 0.5rem; }
.dl-wrap { max-width: 100%; overflow-x: auto; border: 0.0625rem solid var(--border); }
.dl-tbl { border-collapse: collapse; width: 100%; font-size: var(--fs-sm); }
.dl-corner { position: sticky; left: 0; background: var(--bg-surface); }
.dl-in { box-sizing: border-box; width: 100%; min-width: 0; max-width: 5rem; min-height: 2.75rem; padding: 0.25rem 0.5rem; text-align: right; font: inherit; color: inherit; background: var(--bg-base); border: 0.0625rem solid var(--border); }
.fp-door { display: grid; gap: 0.25rem; align-content: end; min-height: 6rem; padding: var(--space-md); border: 0.0625rem solid var(--text-primary); color: var(--text-primary); background: var(--bg-surface); text-decoration: none; }
.fp-door-n { font-size: var(--fs-sm); color: var(--text-secondary); }
.fp-search { display: flex; flex-wrap: wrap; gap: var(--space-xs); align-items: center; margin: 0 0 var(--space-md); }
.fp-search-field { flex: 1 1 10rem; display: block; min-width: 0; }
.fp-all { flex: 0 0 auto; min-height: 2.75rem; display: inline-flex; align-items: center; padding: 0 var(--space-sm); color: var(--text-primary); }
/* p44-6: переключатель процесса на странице объекта (сегменты как .fv-switch) и кнопки «Добавить процесс». */
.fp-switch { display: flex; flex-wrap: wrap; gap: var(--space-xs); align-items: center; margin: 0 0 var(--space-md); }
.fp-seg { display: inline-flex; max-width: 100%; border: 0.0625rem solid var(--text-primary); }
.fp-seg-a { padding: 0.35rem 0.8rem; min-height: 2.75rem; display: inline-flex; align-items: center; color: var(--text-primary); font-weight: 600; text-decoration: none; min-width: 0; }
.dt-cal { position: absolute; inset-block: 0; inset-inline-end: 0; width: var(--tap-target); display: grid; place-items: center; color: var(--text-secondary); }
.dt-pick { position: absolute; inset: 0; width: 100%; height: 100%; min-width: 0; margin: 0; padding: 0; border: 0; opacity: 0; cursor: pointer; }
/* p48-2: стан збереження сторінки. Липне до низу вікна над нижньою панеллю; текстом, без кольорових кромок. */
.sch-save { position: sticky; bottom: calc(3.5rem + env(safe-area-inset-bottom, 0rem) + 0.5rem); z-index: 20; width: fit-content; max-width: 100%; margin: var(--space-sm) 0 0; padding: 0.35rem 0.6rem; font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-secondary); background: var(--bg-surface); border: 0.0625rem solid var(--border); }
@media (min-width: 68.75em) {
    .sch-save { bottom: 0.5rem; }
}
/* p48-4: рядок «новая подзадача» згорнутий за «+» у кожній задачі (на телефоні — свій <details>). */
.sch2-addd { display: none; }
@media (min-width: 64em) {
    .sch2-addd { display: block; border-bottom: 0.0625rem solid var(--border); }
    .sch2-addd > summary::-webkit-details-marker,
    .lift-rail { display: none; }
}
/* Формат дати в /settings → Тексты: на вузькому екрані кнопка переходить нижче. */
.date-fmt-form {flex-wrap:wrap;margin-bottom:var(--space-md)}
/* ── p54 (11.10): тексты людей в графике — перевод и опечатки (web/text_jobs.rs) ─────────
   Перевод на язык читателя — мелкой строкой под оригиналом; «Исправлено: … · Вернуть» и
   «Возможна опечатка: … · Исправить · Оставить» — обычная служебная строка страницы:
   приглушённый текст, кнопки-ссылки, без рамок и цветных меток. */
.tx-tr { display: block; font-size: var(--fs-xs); font-weight: 400; color: var(--text-secondary); overflow-wrap: anywhere; }
.tx-note { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 0.35em; font-size: var(--fs-xs); color: var(--text-secondary); overflow-wrap: anywhere; }
.tx-f { display: inline; margin: 0; }
.tx-act { display: inline-flex; align-items: center; min-height: var(--tap-target); padding: 0 0.25em; border: 0; background: none; color: var(--text-primary); font: inherit; text-decoration: underline; text-underline-offset: 0.15em; cursor: pointer; }
.tx-row { flex: 1 0 100%; display: flex; flex-wrap: wrap; gap: 0 0.75rem; min-width: 0; }
.tx-row:not(:has(*)) { display: none; }
.tx-m { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 0 0.75rem; }
.tx-m:not(:has(*)) { display: none; }
@media (min-width: 48em) {
    .tx-act { min-height: 0; }
}
.pp-ghost.is-conflict,
.site-card.is-hidden { border-style: dashed; }
.seg-toggle a {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    min-height: var(--tap-target);
    padding: 0 1rem;
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    color: var(--text-secondary);
    text-decoration: none;
    border-right: 0.0625rem solid var(--border);
    white-space: nowrap;
}
.sc-hidden {
    font-family: var(--font-mono);
    font-size: var(--micro-size);
    padding: 0.1rem 0.4rem;
    border: 0.0625rem dashed var(--text-secondary);
    color: var(--text-secondary);
    align-self: center;
    white-space: nowrap;
}
.po-hidden {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-sm);
    margin-bottom: var(--space-md);
    padding: var(--space-sm) var(--space-md);
    border: 0.0625rem dashed var(--text-secondary);
    color: var(--text-primary);
    font-size: var(--fs-sm);
}
.po-hide {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-sm);
    margin-top: var(--space-xl, 2rem);
    padding-top: var(--space-sm);
    border-top: 0.0625rem solid var(--border);
}
.po-hide-hint { font-size: var(--fs-xs); color: var(--text-secondary); min-width: 0; }
