/* Люди: расстановка, график, отчёт, карточка человека. */
@media (hover: none) {
    .pp-undo-bar kbd { display: none; }
}
/* ─── p57 Люди: состав, расстановка, ведомость (`pp-`) ──────────────────────
   Раскладка расстановки взята у Bridgit Bench (люди строками, дни столбцами,
   объекты полосами), вид — Building Evolution: моно-подписи, линии вместо
   карточек, приглушённые тона палитры объекта, код на полосе (цвет не
   единственный признак, Купер §35). Mobile-first: база — телефон, сетка дней
   прокручивается внутри своей обёртки (Фрейн, гл. 11 Scroll_Wrapper), страница
   вбок не едет. */
.pp { max-width: 72rem; }
.pp--wide { max-width: none; }
.pp-head { border-top: 0.125rem solid var(--text-primary); padding-top: var(--space-sm); margin-bottom: var(--space-md); }
.pp-kicker { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--primary); }
.pp-kicker a { color: inherit; text-decoration: none; }
.pp-title { font-size: clamp(1.5rem, 6vw, 2.25rem); font-weight: 800; line-height: 1.04; margin: var(--space-xs) 0 0; overflow-wrap: anywhere; }
.pp-sub { margin: var(--space-xs) 0 0; color: var(--text-secondary); font-size: var(--fs-sm); }
.pp-h2 { font-size: var(--fs-md); font-weight: 700; margin: var(--space-xl) 0 var(--space-sm); border-top: 0.0625rem solid var(--border); padding-top: var(--space-sm); }
.pp-h3 { font-size: var(--fs-sm); font-weight: 700; margin: 0 0 var(--space-xs); }
/* Дмитрий 29.10: при прокрутке вкладки пропадали, «не видно, на какой я вкладке». Вкладки липнут под шапкой,
   всё липкое ниже (палитра, строка дней) отступает на их высоту: --pp-top. */
.pp { --pp-tabs-h: 2.8125rem; --pp-top: calc(var(--fm-header-h, 3.75rem) + var(--pp-tabs-h)); }
.pp-tabs { position: sticky; top: var(--fm-header-h, 3.75rem); z-index: 9; background: var(--bg-base); box-sizing: border-box; height: var(--pp-tabs-h); display: flex; gap: var(--space-md); border-bottom: 0.0625rem solid var(--border); margin-bottom: var(--space-md); overflow-x: auto; scrollbar-width: none; }
.pp-tab { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--text-secondary); text-decoration: none; padding: var(--space-sm) 0; min-height: 2.75rem; display: inline-flex; align-items: center; white-space: nowrap; border-bottom: 0.125rem solid transparent; }
.pp-tab.is-on { color: var(--text-primary); border-bottom-color: var(--primary); }
.pp-msg { font-size: var(--fs-sm); margin: 0 0 var(--space-md); }
.pp-msg--err { color: var(--invalid); font-weight: 600; }
.pp-muted { color: var(--text-muted); font-size: var(--fs-xs); }
.pp-hint { color: var(--text-secondary); font-size: var(--fs-xs); line-height: 1.5; margin: 0 0 var(--space-sm); max-width: 60ch; }
.pp-tag,
.pp-pay-side dt,
.pp-facts dt { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-muted); }
.pp-sum { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-secondary); margin: var(--space-sm) 0; }
/* Поля: одна колонка на телефоне, дальше — сколько влезет. */
.pp-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-sm); align-items: end; margin-bottom: var(--space-md); }
.pp-field { display: flex; flex-direction: column; gap: 0.375rem; min-width: 0; }
.pp-label { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-muted); }
.pp-input { width: 100%; min-width: 0; box-sizing: border-box; font-family: var(--font-mono); font-size: var(--fs-md); color: var(--text-primary); background: var(--bg-surface); border: 0.0625rem solid var(--border); border-radius: 0; padding: 0.5rem 0.75rem; min-height: 2.75rem; }
.pp-input:focus { outline: none; border-color: var(--primary); }
.pp-check { display: flex; gap: var(--space-xs); align-items: center; font-size: var(--fs-sm); min-height: 2.75rem; }
.pp-submit,
.pp-go,
.fp-add .btn { min-height: 2.75rem; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-form { grid-template-columns: repeat(auto-fill, minmax(min(100%, 12rem), 1fr)); }
    .pp-input { font-size: var(--fs-sm); }
    .pp-table th { white-space: nowrap; }
}
.pp-box { border-top: 0.0625rem solid var(--border); padding: var(--space-sm) 0; }
.pp-box-sum { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; cursor: pointer; min-height: 2.75rem; display: flex; align-items: center; }
.pp-dl { display: grid; grid-template-columns: minmax(0, auto) minmax(0, 1fr); gap: var(--space-xs) var(--space-md); font-size: var(--fs-sm); margin: var(--space-sm) 0; }
.pp-skip { font-size: var(--fs-xs); color: var(--text-secondary); margin-bottom: var(--space-sm); }
.pp-skip ul { margin: var(--space-xs) 0 0; padding-left: 1rem; }
/* Таблицы: свои колонки прокручиваются внутри обёртки. */
.pp-scroll { overflow-x: auto; max-width: 100%; -webkit-overflow-scrolling: touch; }
.pp-table th { text-align: left; font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); font-weight: 700; padding: 0.4rem 0.25rem; overflow-wrap: anywhere; hyphens: auto; }
.pp-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pp-info { color: var(--text-muted); }
.pp-strong,
.fb-group-left,
.pp-pay .pp-total .pp-name { font-weight: 700; }
.pp-total td { font-weight: 700; border-top: 0.125rem solid var(--text-primary); }
.pp-edit { font-family: var(--font-mono); font-size: var(--fs-xs); }
.pp-pay { min-width: 56rem; }
.pp-nosal { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-secondary); text-decoration: underline; white-space: nowrap; }
.pp-undo-inline { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-sm); margin: 0 0 var(--space-md); }
.pp-undo-inline .pp-msg { margin: 0; }
/* p57 учётка: статус под именем строкой, «не входил» — приглушённо, без цвета тревоги. */
.pp-acc { display: block; font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-secondary); margin: 0.125rem 0 0; }
.pp-acc--no { color: var(--text-muted); }
.pp-acct { margin: 0 0 var(--space-md); }
.pp-acct .pp-acc { font-size: var(--fs-xs); margin: 0 0 var(--space-xs); }
.pp-acct-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-sm); margin: 0 0 var(--space-sm); font-size: var(--fs-sm); }
/* Журнал документов: строка = документ, отмена — простая кнопка-подпись. */
.pp-docs { list-style: none; margin: 0; padding: 0; border-top: 0.0625rem solid var(--border); }
.pp-doc { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 0 var(--space-sm); align-items: baseline; padding: var(--space-xs) 0; border-bottom: 0.0625rem solid var(--border); font-size: var(--fs-sm); }
.pp-doc-date { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-muted); }
.pp-doc-kind { font-weight: 600; }
.pp-doc-sum { grid-column: 1 / -1; color: var(--text-secondary); font-size: var(--fs-xs); overflow-wrap: anywhere; }
.pp-doc-who { grid-column: 1 / 3; color: var(--text-muted); font-size: var(--fs-xs); }
.pp-doc-act { grid-column: 3; grid-row: 1 / span 3; align-self: center; }
.pp-doc.is-undone .pp-doc-kind { text-decoration: line-through; color: var(--text-muted); }
.pp-undo { min-height: 2.75rem; }
/* Месяц и сводка ведомости. */
.pp-month { display: flex; align-items: center; gap: var(--space-sm); flex-wrap: wrap; margin-bottom: var(--space-sm); }
.pp-month-l { font-family: var(--font-mono); font-weight: 700; font-size: var(--fs-md); min-width: 9rem; text-align: center; }
/* Ведомость (/people/report). Порядок экрана = порядок работы бухгалтера: итог «К выплате» →
   что мешает закрыть месяц → сама ведомость → разрезы. Иерархия весом и кеглем, а не рамками
   (Мюллер-Брокманн: ступени кегля различимы с первого взгляда; Купер §39 — шум это лишние линии). */
.pp-paysum { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-sm) var(--space-xl); margin: var(--space-sm) 0 var(--space-xs); }
.pp-pay-main { margin: 0; display: flex; flex-direction: column; }
.pp-pay-l { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-muted); }
.pp-pay-v { font-size: var(--fs-3xl); font-weight: 800; line-height: 1.05; font-variant-numeric: tabular-nums; }
.pp-pay-side { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-lg); margin: 0; }
.pp-pay-side dd { margin: 0; font-size: var(--fs-lg); font-weight: 700; font-variant-numeric: tabular-nums; }
/* Второй уровень: одна строка подписей и чисел, переносится кластером (Every Layout, Cluster). */
.pp-facts { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-lg); margin: var(--space-sm) 0 0; padding-top: var(--space-xs); border-top: 0.0625rem solid var(--border); }
.pp-facts > div { display: flex; gap: var(--space-xs); align-items: baseline; }
.pp-facts dd { margin: 0; font-size: var(--fs-sm); font-weight: 700; font-variant-numeric: tabular-nums; }
/* Проблемы месяца: текст и люди-ссылки рядом с проблемой (Купер §29), без цветных кромок и значков. */
.pp-issues { margin: var(--space-md) 0 0; }
.pp-issues-h { font-size: var(--fs-sm); font-weight: 700; margin: 0 0 var(--space-xs); }
.pp-issues ul { list-style: none; margin: 0; padding: 0; }
.pp-issues li { font-size: var(--fs-sm); padding: var(--space-xs) 0; border-top: 0.0625rem solid var(--border); line-height: 1.5; }
.pp-issue-t { font-weight: 600; margin-right: var(--space-sm); }
.pp-issue-p,
.fb-row.is-req:not(.is-answered) .fb-miss { display: inline; }
.pp-issue-p a, .pp-issue-a { color: var(--text-primary); text-decoration: underline; text-underline-offset: 0.15em; }
.pp-issue-a { font-weight: 700; white-space: nowrap; }
.pp-sr { position: absolute; width: 0.0625rem; height: 0.0625rem; margin: -0.0625rem; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* Таблицы отчёта — по содержимому, без растяжки на окно. Корень дефекта 14.10: общий
   `.pp-table td { overflow-wrap: anywhere }` + `width: 100%` давали столбцу min-content в одну букву,
   и «Изменить» в последней ячейке вставал столбиком, раздувая строку до ~12.5rem, имена рвались по слогам.
   Ведомость прокручивается в своей обёртке (Фрейн, Scroll_Wrapper), имя закреплено слева. */
.pp-rep .pp-table { width: auto; min-width: 0; max-width: none; }
.pp-rep .pp-table th, .pp-rep .pp-table td { white-space: nowrap; overflow-wrap: normal; hyphens: manual; padding-right: var(--space-sm); vertical-align: baseline; }
.pp-rep .pp-table td:first-child { white-space: normal; min-width: 8rem; }
.pp-rep .pp-pay td:first-child,
.tsk-bar .btn,
.pp-keys dt { white-space: nowrap; }
.pp-ledger-wrap { margin-bottom: var(--space-xs); position: relative; }
/* держит .pp-sr внутри обёртки: иначе absolute-подпись уезжала к краю таблицы и растягивала документ */
.pp-pay .pp-name { position: sticky; left: 0; z-index: 1; background: var(--bg-base); text-align: left; font-weight: 400; font-family: inherit; font-size: inherit; color: inherit; padding-right: var(--space-md); }
.pp-pay tbody .pp-name { padding-top: 0.55rem; padding-bottom: 0.55rem; }
.pp-pay tbody tr:not(.pp-total) > * { border-bottom: 0.0625rem solid var(--border); }
.pp-neg { color: var(--invalid); }
.pp-how { margin: 0 0 var(--space-sm); }
.pp-th-sub { font-weight: 400; }
.pp-pay tr[id] { scroll-margin-top: 30vh; }
/* после «Сохранить» строка под шапкой и со строками выше, а не впритык */
/* Строка после «Сохранить»: та же строка, плашка «Сохранено · Отменить» прямо под ней (Купер §3 — отмена вместо подтверждения). */
.pp-pay tr.is-saved > * { background: var(--bg-elevated); }
.pp-how summary { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--text-secondary); cursor: pointer; min-height: 2.75rem; display: inline-flex; align-items: center; }
.pp-how .pp-hint { margin-top: 0; }
/* Разрезы: одна сетка, колонка по содержимому, перенос когда не влезает. */
.pp-cuts { display: flex; flex-wrap: wrap; gap: 0 var(--space-2xl); align-items: start; }
.pp-cuts > section { flex: 0 1 auto; min-width: 0; max-width: 100%; }
/* Объект — текстом, без своего цвета (p57-9): двадцать объектов в одном акценте BE не дают радуги. */
/* Назначение: люди и объекты фишками. */
.pp-assign { border-top: 0.0625rem solid var(--border); padding-top: var(--space-sm); margin-bottom: var(--space-md); }
.pp-chips { display: flex; flex-wrap: wrap; gap: var(--space-xs); margin: var(--space-xs) 0 var(--space-sm); }
.pp-person, .pp-target { font: inherit; font-size: var(--fs-xs); min-height: 2.75rem; padding: 0.25rem 0.625rem; border: 0.0625rem solid var(--border); background: var(--bg-surface); color: var(--text-primary); cursor: grab; touch-action: manipulation; user-select: none; -webkit-user-select: none; max-width: 100%; text-align: left; }
.pp-target { background: color-mix(in oklab, var(--text-primary) 8%, var(--bg-surface)); cursor: pointer; }
.pp-target--leave { background: var(--bg-surface); font-style: italic; }
.pp-target b { font-family: var(--font-mono); }
.pp-person.is-picked, .pp-person.is-lifted { outline: 0.125rem solid var(--primary); outline-offset: 0.0625rem; }
[data-gx].is-armed .pp-target, .pp-target.is-ready { outline: 0.125rem dashed var(--primary); outline-offset: 0.0625rem; }
.pp-target.is-ready { background: color-mix(in oklab, var(--primary) 18%, var(--bg-surface)); }
/* Сетка расстановки (p57-9): имя + дни + «своб.». День — доля остатка, не меньше --dw:
   на 2560 месяц целиком без прокрутки, уже — прокрутка внутри своей обёртки (Фрейн, Scroll_Wrapper).
   Шапка дней липнет сверху, имена слева, «своб.» справа. Объект — текстом на нейтральной полосе,
   состояния — фактурой: косая штриховка = свободен, частая = отсутствие, ⇢ = выезд. */
.pp-bench { --nd: 31; --dw: 2.25rem; --nw: clamp(8.5rem, 22vw, 11rem); --fw: 3.5rem; overflow: auto; max-width: 100%; max-height: calc(100dvh - 8.5rem); border-top: 0.0625rem solid var(--border); -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain; }
.pp-row { display: flex; align-items: stretch; min-height: 2.75rem; border-bottom: 0.0625rem solid var(--border); width: 100%; min-width: min-content; }
.pp-days { display: grid; grid-template-columns: repeat(var(--nd), minmax(var(--dw), 1fr)); flex: 1 1 0; min-width: calc(var(--nd) * var(--dw)); align-items: stretch; position: relative; }
.pp-name { flex: 0 0 auto; width: var(--nw); max-width: var(--nw); position: sticky; left: 0; z-index: 6; background: var(--bg-base); padding: 0.125rem 0.375rem 0.125rem 0; display: flex; flex-direction: column; justify-content: center; min-width: 0; border-right: 0.0625rem solid var(--border); }
.pp-name a { font-size: var(--fs-xs); font-weight: 600; color: var(--text-primary); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-name .pp-muted { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--micro-size); }
.pp-name[data-gx-src] { cursor: grab; touch-action: pan-x pan-y; }
.pp-nm { display: none; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-nm { display: inline; }
    .pp-nm-s { display: none; }
}
.pp-fr { flex: 0 0 var(--fw); width: var(--fw); position: sticky; right: 0; z-index: 6; background: var(--bg-base); border-left: 0.0625rem solid var(--border); display: flex; align-items: center; justify-content: flex-end; padding-right: 0.375rem; font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; font-variant-numeric: tabular-nums; }
.pp-fr[data-zero] { color: var(--text-muted); font-weight: 400; }
.pp-fr abbr { text-decoration: none; font-size: var(--micro-size); color: var(--text-muted); white-space: nowrap; }
.pp-row--head { min-height: 2.5rem; position: sticky; top: 0; z-index: 8; background: var(--bg-base); }
.pp-row--head .pp-name,
.pp-row--cap .pp-name,
.pp-pay thead .pp-name { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); font-weight: 700; }
/* «+ Додати» вже залитий primary (білий текст на оранжі) — заливка тим самим
   кольором росла б непомітно, колір по кольору. Тут пара інвертована: круг
   росте кольором фону, підпис іде в primary — та сама фізика .mx-fill,
   лише інша палітра для кнопки, яка вже залита. Скоуплено на .tsk-bar, бо
   деінде .btn-primary лишається просто оранжевим блоком. */
.pp-row--head .pp-days,
.tsk-bar .btn-primary.mx-fill::before { background: var(--bg-base); }
.pp-dh { grid-row: 1; display: flex; }
.pp-dh a { flex: 1 1 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 2.5rem; font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); text-decoration: none; }
.pp-dh b { font-size: var(--fs-xs); color: var(--text-primary); }
.pp-dh.is-we { background: color-mix(in oklab, var(--text-primary) 5%, transparent); }
.pp-dh.is-today b { color: var(--primary); }
.pp-dh.is-picked { box-shadow: inset 0 -0.125rem 0 var(--primary); }
.pp-dh a:hover, .pp-dh a:focus-visible { background: color-mix(in oklab, var(--primary) 10%, transparent); outline: none; }
.pp-row--cap { min-height: 1.75rem; }
.pp-loadblk + .pp-row--cap,
.pp-row--sum { border-top: 0.0625rem solid var(--text-primary); }
/* Объекты в календаре: полоса окна работ из графика, по дням — людей назначено. Окно есть, людей 0 — дыра (фактура + «0»). */
.pp-row--load { min-height: 2rem; }
.pp-row--load .pp-name { padding-top: 0; padding-bottom: 0; }
.pp-load-code { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-win { grid-row: 1; z-index: 1; align-self: center; height: 1.25rem; background: color-mix(in oklab, var(--text-primary) 10%, var(--bg-surface)); pointer-events: none; }
.pp-win.is-start { clip-path: polygon(var(--cut-sm) 0, 100% 0, 100% 100%, 0 100%, 0 var(--cut-sm)); }
.pp-load { grid-row: 1; z-index: 2; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; font-variant-numeric: tabular-nums; border-left: 0.0625rem solid color-mix(in oklab, var(--border) 50%, transparent); }
.pp-load.is-we,
.pp-roster tr.pp-rrow:hover > td { background: color-mix(in oklab, var(--text-primary) 4%, transparent); }
.pp-load.is-ready { outline: 0.125rem dashed var(--primary); outline-offset: -0.125rem; }
.pp-row--sum .pp-name { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-secondary); }
/* Люди: клетки (gridcell, одна точка Tab) и полосы над ними. */
.pp-cell { grid-row: 1; min-height: 2.75rem; border-left: 0.0625rem solid color-mix(in oklab, var(--border) 50%, transparent); touch-action: pan-x pan-y; -webkit-touch-callout: none; user-select: none; -webkit-user-select: none; }
.pp-cell.is-we { background: color-mix(in oklab, var(--text-primary) 4%, transparent); }
.pp-cell.is-free { background: repeating-linear-gradient(45deg, color-mix(in oklab, var(--text-primary) 13%, transparent) 0 0.0625rem, transparent 0.0625rem 0.4375rem); }
.pp-cell.is-off { background: color-mix(in oklab, var(--border) 45%, transparent); }
.pp-cell:focus-visible, .pp-cell:focus { position: relative; z-index: 5; outline: 0.125rem solid var(--primary); outline-offset: -0.125rem; }
.pp-cell.is-ready { position: relative; z-index: 5; outline: 0.125rem dashed var(--primary); outline-offset: -0.125rem; }
.pp-bar { grid-row: 1; z-index: 2; align-self: center; height: 2rem; margin: 0 0.0625rem; display: flex; align-items: center; min-width: 0; position: relative;
    background: color-mix(in oklab, var(--text-primary) 16%, var(--bg-surface)); color: var(--text-primary);
    font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; cursor: grab;
    touch-action: pan-x pan-y; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; }
.pp-bar.is-start { clip-path: polygon(var(--cut-sm) 0, 100% 0, 100% 100%, 0 100%, 0 var(--cut-sm)); }
.pp-bar-t { overflow: hidden; white-space: nowrap; text-overflow: clip; padding: 0 0.25rem; flex: 1 1 auto; min-width: 0; text-align: left; }
.pp-bar.is-leave { background: repeating-linear-gradient(135deg, color-mix(in oklab, var(--text-primary) 24%, transparent) 0 0.125rem, transparent 0.125rem 0.375rem), var(--bg-surface); font-style: italic; font-weight: 600; }
.pp-bar.is-leave .pp-bar-t { background: var(--bg-surface); flex: 0 1 auto; margin-left: 0.25rem; }
.pp-bar.is-out { pointer-events: none; background: transparent; }
.pp-bar.is-lifted { opacity: 0.35; }
.pp-conf { grid-row: 1; z-index: 4; pointer-events: none; border: 0.125rem solid var(--primary); background: linear-gradient(to top right, transparent calc(50% - 0.0625rem), var(--primary) 50%, transparent calc(50% + 0.0625rem)); }
.pp-vis { grid-row: 1; z-index: 4; pointer-events: none; align-self: end; justify-self: end; font-size: var(--micro-size); line-height: 1; padding: 0 0.125rem 0.125rem 0; color: var(--text-primary); }
.pp-anchor { grid-row: 1; z-index: 4; pointer-events: none; outline: 0.125rem dashed var(--primary); outline-offset: -0.125rem; }
/* Ручки поверх краёв, а не рядом: однодневная полоса не теряет код. */
.pp-hl, .pp-hr { position: absolute; top: 0; bottom: 0; width: 0.625rem; cursor: ew-resize; touch-action: none; z-index: 1; }
.pp-hl { left: 0; }
.pp-hr { right: 0; }
.pp-hl::after, .pp-hr::after { content: ""; position: absolute; top: 25%; bottom: 25%; left: 40%; width: 0.125rem; background: color-mix(in oklab, var(--text-primary) 35%, transparent); }
.pp-ghost { grid-row: 1; z-index: 5; align-self: center; height: 2rem; pointer-events: none; display: flex; align-items: center; padding: 0 0.375rem; overflow: hidden; white-space: nowrap;
    font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-primary);
    border: 0.125rem solid var(--primary); background: color-mix(in oklab, var(--primary) 18%, var(--bg-surface)); }
.pp-ghost.is-bad { border-color: var(--invalid); background: color-mix(in oklab, var(--invalid) 12%, var(--bg-surface)); }
.pp-ghost.is-range { background: color-mix(in oklab, var(--primary) 12%, transparent); }
[data-gx].is-dragging, [data-gx].is-dragging * { cursor: grabbing; user-select: none; -webkit-user-select: none; }
[data-gx].is-busy .pp-bench { cursor: progress; }
.pp-err-bar,
/* Ошибка записи — над окном выбора (z 1240): 21.10 отказ «прошлое расстановкой» прятался под окном, клетки молча пустые. */
.pp-tip.is-bad { border-color: var(--invalid); }
/* Телефон — неделя, широкий — месяц. Обе сетки рисует сервер, показ решает ширина. */
.pp-bench--m, .pp-tb-grp.pp-tb-month { display: none; }
.pp-bench--w { --dw: 2rem; --nw: 5.25rem; --fw: 2.25rem; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-bench--m { display: block; }
    .pp-tb-grp.pp-tb-month { display: flex; }
    .pp-bench--w, .pp-tb-grp.pp-tb-week { display: none; }
    /* Широкий экран: выбор раскрывается под выделенными днями (сервер кладёт его в строку человека на те же колонки). */
    .pp-days > .pp-pick { position: absolute; grid-row: 1; top: 100%; left: 0; right: auto; bottom: auto; z-index: 30; width: 22rem; max-height: 24rem; border: 0.0625rem solid var(--border); border-top: 0.125rem solid var(--text-primary); padding: var(--space-xs) var(--space-sm); }
    .pp-days > .pp-pick.is-end { left: auto; right: 0; }
}
[data-gx-noscript][hidden] { display: none; }
/* Подсказка у пальца: что будет и что перекроем — до отпускания. */
.pp-tip { position: fixed; left: 50%; transform: translateX(-50%); bottom: calc(8rem + env(safe-area-inset-bottom)); z-index: 1250; pointer-events: none; max-width: min(90vw, 28rem); padding: 0.375rem 0.625rem; font-size: var(--fs-xs); background: var(--bg-elevated); color: var(--text-primary); border: 0.0625rem solid var(--border); }
/* Выбор объекта: панель снизу на телефоне, у края на широком экране. */
.pp-pick { position: fixed; left: 0; right: 0; bottom: var(--fm-bottombar-h, 3.5rem); z-index: 95; background: var(--bg-surface); border-top: 0.125rem solid var(--text-primary); padding: var(--space-sm) var(--fm-gutter) var(--space-sm); max-height: 45dvh; overflow-y: auto; overscroll-behavior: contain; }
.pp-pick-hint { font-size: var(--fs-xs); color: var(--text-secondary); margin: 0 0 var(--space-xs); }
.pp-pick-t { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; margin: 0 0 var(--space-xs); }
.pp-pick-list { display: grid; grid-template-columns: minmax(0, 1fr); margin: 0 0 var(--space-xs); }
.pp-opt { display: grid; grid-template-columns: 4.5rem minmax(0, 1fr) auto; gap: var(--space-xs); align-items: center; min-height: 2.75rem; padding: 0 var(--space-xs); border: 0; border-bottom: 0.0625rem solid var(--border); background: transparent; color: var(--text-primary); font: inherit; font-size: var(--fs-xs); text-align: left; cursor: pointer; }
.pp-opt span { color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Вопрос о наложении: действие словами (не код объекта), даты справа. */
.pp-opt.pp-opt--ask { grid-template-columns: minmax(0, 1fr) auto; }
.pp-opt.pp-opt--ask b { font-family: inherit; font-weight: 600; }
.pp-opt em { font-style: normal; font-family: var(--font-mono); color: var(--text-muted); }
.pp-opt:hover, .pp-opt:focus-visible { background: color-mix(in oklab, var(--primary) 12%, transparent); outline: none; }
@media (pointer: fine) {
    .pp-opt { min-height: 2rem; }
}
.pp-pick-x { min-height: 2.75rem; }
.pp kbd, .pp-undo-bar kbd, .pp-pick kbd { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); border: 0.0625rem solid var(--border); padding: 0 0.25rem; font-style: normal; }
.pp-undo-bar { position: fixed; left: 50%; bottom: calc(4.5rem + env(safe-area-inset-bottom)); transform: translateX(-50%); z-index: 66; display: flex; align-items: center; gap: var(--space-sm); padding: 0.25rem 0.25rem 0.25rem 0.75rem; background: var(--bg-elevated); border: 0.0625rem solid var(--border); font-size: var(--fs-sm); max-width: calc(100vw - 2 * var(--fm-gutter)); }
.pp-undo-msg,
.fb-unans-list li,
.pp-acct-row > span { min-width: 0; overflow-wrap: anywhere; }
.pp-undo-x { background: transparent; border: 0; min-width: 2.75rem; min-height: 2.75rem; color: var(--text-muted) !important; font-size: var(--fs-md); cursor: pointer; }
.pp-cell-ed,
.pp-rep .pp-pay tr.pp-total { border-top: 0.125rem solid var(--text-primary); }
/* Пустые слоты фрагментов жестов: `hidden` сильнее display:flex компонента. */
.pp-undo-bar[hidden], .pp-pick[hidden], .pp-tip[hidden] { display: none; }
/* p57 правка раскладки (координатор 14.10): сетка сразу под шапкой и фильтрами в одну
   строку; свободные люди и объекты — колонка справа ≥64em (липкая, своя прокрутка),
   на телефоне свёрнутыми блоками над сеткой. Шапка дней и колонка имён липкие: сетка —
   своя прокручиваемая область в обе стороны, высотой с окно. */
.pp-head--bar { margin-bottom: var(--space-xs); padding-top: var(--space-xs); }
.pp-title--bar { font-size: var(--fs-xl); margin: 0; }
.pp-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); margin-bottom: var(--space-sm); }
.pp-toolbar .pp-month-l { min-width: 0; font-size: var(--fs-sm); padding: 0 var(--space-xs); }
.pp-tb-nav { min-width: 2.75rem; padding: 0; }
.pp-tb-sel { flex: 1 1 9rem; width: auto; min-width: 0; }
.pp-tb-day { flex: 1 1 9rem; width: auto; min-width: 0; }
.pp-toolbar .pp-go { flex: 0 0 auto; }
.pp-help { position: relative; flex: 0 0 auto; }
.pp-help > summary { list-style: none; cursor: pointer; min-width: 2.75rem; min-height: 2.75rem; display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-weight: 700; border: 0.0625rem solid var(--border); }
.pp-help[open] > summary { color: var(--primary); }
.pp-tb-grp { display: flex; align-items: center; gap: var(--space-xs); }
.pp-keys-h { font-weight: 700; margin: 0 0 var(--space-xs); }
.pp-keys dl { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0.25rem var(--space-sm); margin: 0 0 var(--space-sm); align-items: baseline; }
.pp-keys dd { margin: 0; }
.pp-help > .pp-hint { position: absolute; right: 0; top: calc(100% + 0.25rem); z-index: 30; /* выше липкой палитры «Кисть» (z 20), иначе она закрывает верх подсказки */ width: min(80vw, 26rem); max-width: none; padding: var(--space-sm); background: var(--bg-elevated); border: 0.0625rem solid var(--border); color: var(--text-primary); }
.pp-layout { display: flex; flex-direction: column; gap: var(--space-sm); }
.pp-main { min-width: 0; }
.pp-aside { order: 1; min-width: 0; display: flex; flex-direction: column; }
.pp-side { border-top: 0.0625rem solid var(--border); }
.pp-side-sum { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; min-height: 2.75rem; display: flex; align-items: center; gap: var(--space-xs); cursor: pointer; }
.pp-side[open] > .pp-side-sum { color: var(--primary); }
.pp-form--side { grid-template-columns: minmax(0, 1fr); }
.pp-free { margin: 0; padding-bottom: var(--space-xs); }
.pp-side-h { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; margin: var(--space-sm) 0 0; min-height: 1.75rem; display: flex; align-items: center; }
.pp-free-grid { margin: 0 0 var(--space-xs); }
.pp-target-n { font-style: normal; font-family: var(--font-mono); font-weight: 700; float: right; padding-left: var(--space-xs); }
@media (min-width: 110em) {
    /* Сбоку панель встаёт с 110em: на 1280 она съедала месяц (видно 9–27 число, синтетик «дни после 17.10
       не видны»). До 110em панель под сеткой, месяц на всю ширину. */
    .pp-layout--side { display: grid; grid-template-columns: minmax(0, 1fr) minmax(14rem, 18rem); align-items: start; gap: var(--space-md); }
    .pp-aside { order: 0; position: sticky; top: 5.5rem; max-height: calc(100dvh - 6.5rem); overflow-y: auto; overscroll-behavior: contain; }
    /* Справа блоки всегда раскрыты: подпись — заголовок, не переключатель. */
    .pp-aside .pp-side:not(.pp-side--form)::details-content { content-visibility: visible; display: contents; }
    .pp-aside .pp-side:not(.pp-side--form) > .pp-side-sum { pointer-events: none; color: var(--text-muted); list-style: none; }
    .pp-aside .pp-side:not(.pp-side--form) > .pp-side-sum::-webkit-details-marker { display: none; }
    .pp-aside .pp-chips { flex-direction: column; flex-wrap: nowrap; }
    .pp-aside .pp-person, .pp-aside .pp-target { width: 100%; }
}
.pp-toolbar .pp-input { min-height: 2.75rem; height: 2.75rem; padding-top: 0; padding-bottom: 0; }
.pp-tb-today { min-height: 2.75rem; }
.pp-sr { position: absolute; width: 0.0625rem; height: 0.0625rem; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
/* p57-11 Состав на дату: группы по объектам (заголовок группы — строка таблицы), «Не назначены»,
   «Отсутствуют». Телефон: имя и «с … до» строкой, бригада и должность — с 48em. */
.pp-grp-nav { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-md); margin: 0 0 var(--space-sm); font-family: var(--font-mono); font-size: var(--fs-xs); }
.pp-grp-nav a { color: var(--text-secondary); text-decoration: none; min-height: 2.75rem; display: inline-flex; align-items: center; gap: 0.25rem; }
@media (pointer: fine) {
    .pp-grp-nav a { min-height: 1.75rem; }
}
.pp-roster { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
.pp-roster tr { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0 var(--space-sm); align-items: center; padding: 0.25rem 0; border-bottom: 0.0625rem solid var(--border); }
.pp-roster td { padding: 0; min-width: 0; }
.pp-roster .pp-who { grid-column: 1; }
.pp-roster .pp-who a { color: var(--text-primary); font-weight: 600; text-decoration: none; }
.pp-roster td:nth-child(4) { grid-column: 1; font-size: var(--fs-xs); color: var(--text-secondary); }
.pp-roster .pp-act { grid-column: 2; grid-row: 1 / span 2; }
.pp-grp-h { display: block !important; border-bottom: 0 !important; padding-top: var(--space-md) !important; }
.pp-grp-h th { display: flex; align-items: baseline; gap: var(--space-xs); text-align: left; font-family: var(--font-mono); font-size: var(--fs-xs); border-top: 0.125rem solid var(--text-primary); padding: var(--space-xs) 0 0; }
.pp-grp-t { font-weight: 700; color: var(--text-primary); }
.pp-grp-n { font-weight: 700; margin-left: auto; font-variant-numeric: tabular-nums; }
.pp-grp--none .pp-grp-t, .pp-grp--none .pp-grp-n { color: var(--primary); }
.pp-assign-go { min-height: 2.75rem; font-size: var(--fs-xs); }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-roster { display: table; }
    .pp-roster thead { display: table-header-group; }
    .pp-roster thead th { position: sticky; top: 0; z-index: 2; background: var(--bg-base); text-align: left; font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); font-weight: 700; padding: 0.375rem 0.5rem 0.375rem 0; border-bottom: 0.0625rem solid var(--border); }
    .pp-roster thead th.pp-num,
    .pp-roster .pp-act { text-align: right; }
    .pp-roster tr { display: table-row; }
    .pp-roster td, .pp-roster td:nth-child(2), .pp-roster td:nth-child(3), .pp-roster td.pp-num { display: table-cell; padding: 0.3125rem 0.5rem 0.3125rem 0; border-bottom: 0.0625rem solid var(--border); vertical-align: baseline; }
    .pp-roster td:nth-child(4) { font-size: var(--fs-sm); }
    .pp-grp-h { display: table-row !important; }
    .pp-grp-h th { display: table-cell; padding: var(--space-md) 0 var(--space-xs); }
    .pp-grp-h th > * { margin-right: var(--space-xs); }
    .pp-assign-go { min-height: 1.75rem; padding-top: 0; padding-bottom: 0; }
    .pp-roster .pp-acc { display: inline; margin-left: var(--space-xs); }
}
/* p57-10 Карточка: слева «сейчас» строками «значение → действие» (2/3 ширины), справа свёрнутые
   «Где работал», «История изменений» (только чтение, Дмитрий 21.10) и «Уволить…»; внизу месяц по дням.
   Телефон — одна колонка в том же порядке. */
.pp-card-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-lg); }
@media (min-width: 64em) {
    .pp-card-grid { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); align-items: start; }
}
.pp-hist .pp-tl { margin-top: var(--space-xs); }
.pp-h2--first { margin-top: 0; }
.pp-facts { border-top: 0.0625rem solid var(--border); }
.pp-fact { border-bottom: 0.0625rem solid var(--border); }
.pp-fact:not(details), .pp-fact > summary { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0 var(--space-sm); align-items: center; min-height: 2.75rem; padding: 0.25rem 0; }
.pp-fact > summary,
.tsk-supply > summary { list-style: none; cursor: pointer; }
.pp-fact > summary::-webkit-details-marker { display: none; }
.pp-fact-k { grid-column: 1; font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-muted); }
.pp-fact-v { grid-column: 1; min-width: 0; overflow-wrap: anywhere; }
.pp-fact-a { grid-column: 2; grid-row: 1 / span 2; font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--primary); white-space: nowrap; text-decoration: none; padding: 0.5rem 0; }
.pp-form--in { margin: 0; padding: var(--space-xs) 0 var(--space-sm); }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-fact:not(details), .pp-fact > summary { grid-template-columns: 8rem minmax(0, 1fr) auto; min-height: 2.25rem; }
    .pp-fact-k { grid-column: 1; }
    .pp-fact-v { grid-column: 2; }
    .pp-fact-a { grid-column: 3; grid-row: 1; }
}
.pp-dismiss { margin-top: var(--space-lg); }
.pp-danger-btn { color: var(--invalid); border-color: var(--invalid); }
/* История: дата «с» слева, отменённое — словом и зачёркнутым заголовком, план — пометкой. */
.pp-tl { list-style: none; margin: 0; padding: 0; border-top: 0.0625rem solid var(--border); }
.pp-ev { display: grid; grid-template-columns: 5.5rem minmax(0, 1fr); gap: 0 var(--space-sm); padding: var(--space-xs) 0; border-bottom: 0.0625rem solid var(--border); font-size: var(--fs-sm); }
.pp-ev-d { font-family: var(--font-mono); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; padding-top: 0.125rem; }
.pp-ev-b { min-width: 0; }
.pp-ev-t { font-weight: 600; }
.pp-ev-x { color: var(--text-secondary); font-size: var(--fs-xs); overflow-wrap: anywhere; }
.pp-ev-m { color: var(--text-muted); font-size: var(--micro-size); }
.pp-ev-tag { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; border: 0.0625rem solid currentColor; padding: 0 0.25rem; white-space: nowrap; }
.pp-ev.is-future .pp-ev-d, .pp-ev.is-future .pp-ev-tag { color: var(--primary); }
.pp-ev.is-cancelled .pp-ev-t { text-decoration: line-through; text-decoration-thickness: 0.0625rem; }
.pp-ev-tag--x { color: var(--invalid); text-decoration: none; display: inline-block; white-space: normal; max-width: 100%; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-ev { grid-template-columns: 6rem minmax(0, 1fr); }
}
/* Месяц по дням: код объекта на нейтральном, отсутствие — штриховка, выходной — тень. */
.pp-strip-sec { margin-top: var(--space-lg); }
.pp-strip-sec .pp-tb-grp { margin-bottom: var(--space-xs); }
.pp-strip-sec .pp-h3 { margin: 0 var(--space-sm) 0 0; }
.pp-strip { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(2.75rem, 1fr)); border-left: 0.0625rem solid var(--border); border-top: 0.0625rem solid var(--border); }
@media (min-width: 64em) {
    .pp-strip { grid-template-columns: repeat(var(--nd), minmax(0, 1fr)); }
    /* Месяц на ноутбуке: 31 день без прокрутки вбок на 1280, клетка 1.875rem × 2.75rem (высота — цель клика). */
    .pp-bench--m { --dw: 1.875rem; --fw: 4.25rem; }
}
.pp-sd { display: flex; flex-direction: column; align-items: center; gap: 0.125rem; padding: 0.25rem 0.125rem; border-right: 0.0625rem solid var(--border); border-bottom: 0.0625rem solid var(--border); min-width: 0; }
.pp-sd-n { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); }
.pp-sd-c { font-family: var(--font-mono); font-size: var(--micro-size); overflow: hidden; text-overflow: clip; white-space: nowrap; max-width: 100%; }
.pp-sd--site { background: color-mix(in oklab, var(--text-primary) 14%, var(--bg-surface)); }
.pp-sd--leave { background: repeating-linear-gradient(135deg, color-mix(in oklab, var(--text-primary) 22%, transparent) 0 0.125rem, transparent 0.125rem 0.375rem); font-style: italic; }
.pp-sd--we { background: color-mix(in oklab, var(--text-primary) 5%, transparent); }
.pp-sd--free { background: repeating-linear-gradient(45deg, color-mix(in oklab, var(--text-primary) 12%, transparent) 0 0.0625rem, transparent 0.0625rem 0.4375rem); }
.pp-sd--out { color: var(--text-muted); }
.pp-sd.is-today,
.cle-text:focus,
.pp-roster tr.pp-rrow:has(.pp-who-a:focus-visible),
.pp-load-sum:focus-visible { outline: 0.125rem solid var(--primary); outline-offset: -0.125rem; }
.pp-sd.is-today .pp-sd-n { color: var(--primary); }
/* p57 карточка и состав после замера синтетика «управляющий людьми» (15.10.2026).
   «Сейчас» — колонка строк на всю ширину (было flex-wrap отчёта: строки сжимались по
   содержимому и вставали по две). Действие строки — кнопка (Купер §34, §49: делает, а не
   водит), форма раскрывается под строкой одним нажатием. Запланированное — текстом и
   цветом будущего, как «запланировано» в истории. */
.pp-now .pp-facts { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0; }
.pp-now summary .pp-fact-a { color: var(--text-primary); border: 0.0625rem solid var(--text-primary); padding: 0.375rem 0.625rem; min-height: 2.75rem; display: inline-flex; align-items: center; justify-self: end; align-self: center; }
.pp-now .pp-fact--act[open] > summary .pp-fact-a { border-color: var(--border); color: var(--text-muted); }
.pp-next { color: var(--primary); font-weight: 600; white-space: nowrap; }
.pp-flt { list-style: none; margin: 0 0 var(--space-md); padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr)); gap: var(--space-xs); }
.pp-flt-a { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 var(--space-sm); align-items: baseline; padding: var(--space-xs) var(--space-sm); min-height: 2.75rem; border: 0.0625rem solid var(--border); color: var(--text-primary); text-decoration: none; }
.pp-flt-a:hover,
.pp-flt-a:focus-visible,
.cat-link:hover { border-color: var(--text-primary); }
.pp-flt-a.is-on,
.zone-rule.rule-high,
.lf-search:focus-within,
.tsk-search:focus-within,
.pl-page-img:has(input:checked) { border-color: var(--primary); }
.pp-flt-n { grid-row: 1 / span 2; font-family: var(--font-mono); font-size: var(--fs-lg); font-variant-numeric: tabular-nums; }
.pp-flt-t { font-weight: 700; font-size: var(--fs-sm); }
.pp-flt-h { font-size: var(--fs-xs); color: var(--text-secondary); }
.pp-flt-a.is-on .pp-flt-h { color: var(--primary); }
.pp-roster td.pp-num:has(.pp-nosal) { display: block; grid-column: 1; text-align: left; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-roster td.pp-num:has(.pp-nosal) { display: table-cell; text-align: right; }
}
.pp-howto { max-width: none; margin-bottom: var(--space-sm); }
/* «Свободно дней» — подпись в две строки, а не загадочное «своб.». */
.pp-fr abbr { white-space: normal; text-align: right; line-height: 1.1; }
/* Лист «Объект, с, по»: крупные поля, на телефоне столбиком, с 48em — объект во всю ширину и даты рядом. */
.pp-sheet { scroll-margin-top: 5rem; }
.pp-sheet-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-sm); align-items: end; }
.pp-sheet-form .pp-input { min-height: 3rem; font-size: var(--fs-md); width: 100%; min-width: 0; }
.pp-sheet-card { font-size: var(--fs-xs); color: var(--text-secondary); align-self: center; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-sheet-form,
    .fp-doors { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .pp-sheet-form .pp-wide { grid-column: 1 / -1; }
}
.pp-pick-sheet { width: 100%; min-height: 2.75rem; margin-bottom: var(--space-xs); }
/* Имя — вся ячейка (цель ≥ 2.75rem): открывает лист «Объект, с, по». */
.pp-name .pp-name-a { display: flex; flex-direction: column; justify-content: center; min-height: 2.75rem; white-space: normal; }
.pp-name-a > .pp-nm, .pp-name-a > .pp-nm-s { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-name-a > .pp-muted { font-weight: 400; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-name-a > .pp-nm { display: block; }
}
/* Плашка «Отменить» поверх баннера «Установить приложение» (z 1200), на телефоне во всю ширину:
   раньше баннер её закрывал и сжимал текст в столбик (синтетик 15.10). */
.pp-undo-bar { z-index: 1250; left: 0; right: 0; transform: none; max-width: none; }
.pp-undo-msg { flex: 1 1 auto; min-width: 0; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-undo-bar { left: 50%; right: auto; transform: translateX(-50%); max-width: calc(100vw - 2 * var(--fm-gutter)); }
}
.pp-bench--w .pp-row,
.pp-sheet-form .btn { min-height: 3rem; }
/* Неделя на телефоне: подпись «Свободно дней» не наезжает на воскресенье — колонка шире, перенос по слогам. */
/* Расстановка: сетка, которая влезает по ширине, не держит свою прокрутку — страница едет целиком,
   шапка дней липнет под шапкой сайта (синтетик: «строку человека не достать», вложенная прокрутка).
   Неделя телефона влезает всегда, месяц — с 80em (31 × 1.875rem + имя + «свободно»). */
.pp-bench--w { --fw: 3rem; --dw: 1.875rem; overflow: visible; max-height: none; }
.pp-bench--w .pp-fr abbr { hyphens: auto; overflow-wrap: anywhere; }
.pp-roster .pp-who-a,
.pp-nosal { display: inline-flex; align-items: center; min-height: 2.75rem; }
.pp-roster .pp-who-a::after { content: ""; position: absolute; inset: 0; }
.pp-roster .pp-who-a:focus-visible { outline: none; }
.pp-roster .pp-nosal, .pp-roster .pp-assign-go { position: relative; z-index: 1; }
.pp-roster td.pp-num { display: block; grid-column: 1; }
.pp-roster td.pp-num:has(.pp-nosal) { display: block; }
.pp-roster td.pp-num:not(:has(.pp-nosal)) { display: none; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-roster td.pp-num, .pp-roster td.pp-num:not(:has(.pp-nosal)) { display: table-cell; }
}
.pp-bench--w .pp-row--head { top: var(--pp-top); }
@media (min-width: 80em) {
    .pp-bench--m { overflow: visible; max-height: none; }
    .pp-bench--m .pp-row--head { top: var(--pp-top); }
}
.pp-load-more > summary { list-style: none; cursor: pointer; }
.pp-load-more > summary::-webkit-details-marker { display: none; }
.pp-more-sum .pp-name { position: static; width: auto; max-width: none; border-right: 0; font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--text-secondary); min-height: 2.75rem; flex-direction: row; justify-content: flex-start; align-items: center; }
.pp-load-more[open] > .pp-more-sum .pp-name { color: var(--primary); }
.pp-pick-more { font-size: var(--fs-xs); color: var(--text-secondary); margin: 0 0 var(--space-xs); line-height: 1.5; }
.pp-pick-more a, .pp-cell-ed .pp-hint a { color: var(--text-primary); text-decoration: underline; text-underline-offset: 0.15em; display: inline-flex; align-items: center; min-height: 2.75rem; }
/* Карточка: быстрые даты перевода рядом с полем даты. */
.pp-date-row { display: flex; flex-wrap: wrap; gap: var(--space-xs); align-items: stretch; }
.pp-date-row .pp-input { flex: 1 1 10rem; width: auto; min-width: 0; }
.pp-date-q { min-height: 2.75rem; font-size: var(--fs-xs); flex: 0 0 auto; }
.pp-nowork { margin: 0; display: flex; align-items: center; min-height: 2.75rem; color: var(--text-secondary); font-weight: 400; }
/* Увольнение чек-листом: шаги по порядку, текущий — с кнопкой, сделанное — приглушено и с датой. */
.pp-dsm { border-top: 0.125rem solid var(--text-primary); padding: var(--space-xs) 0 var(--space-sm); margin: 0 0 var(--space-sm); }
.pp-dsm-h { font-size: var(--fs-sm); font-weight: 700; margin: 0; }
.pp-dsm-sum { font-size: var(--fs-xs); color: var(--text-secondary); margin: var(--space-xs) 0; line-height: 1.5; }
.pp-dsm-list { list-style: none; margin: 0; padding: 0; }
.pp-dsm-step { border-top: 0.0625rem solid var(--border); padding: var(--space-xs) 0; }
.pp-dsm-t { margin: 0; font-size: var(--fs-sm); font-weight: 600; display: flex; flex-wrap: wrap; gap: 0 var(--space-xs); align-items: baseline; }
.pp-dsm-n,
.syn-click .syn-kind,
.sch2-cnt,
.pp-opt b,
.pp-pal-b b { font-family: var(--font-mono); }
.pp-dsm-st { font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-muted); margin-left: auto; }
.pp-dsm-step.is-active .pp-dsm-st { color: var(--primary); }
.pp-dsm-step.is-done .pp-dsm-t { color: var(--text-secondary); font-weight: 400; }
.pp-dsm-do { margin: 0.125rem 0 0; font-size: var(--fs-xs); color: var(--text-secondary); line-height: 1.5; }
.pp-dsm-step.is-active .pp-dsm-do { color: var(--text-primary); }
.pp-dsm-a { color: var(--text-primary); text-decoration: underline; text-underline-offset: 0.15em; display: inline-block; padding: 0.625rem 0; }
.pp-dsm-form { margin: var(--space-xs) 0 0; }
.pp-dsm-form .btn { min-height: 2.75rem; width: 100%; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-dsm-form .btn { width: auto; }
}
.pp-dsm-scheme { display: inline-flex; align-items: center; min-height: 2.75rem; font-size: var(--fs-xs); color: var(--text-secondary); }
/* Ведомость: закрытие месяца сразу под итогом (на телефоне — на первом экране). */
.pp-close { margin: var(--space-sm) 0 0; padding-top: var(--space-xs); border-top: 0.0625rem solid var(--border); scroll-margin-top: 5rem; }
.pp-close .pp-issues { list-style: none; margin: 0 0 var(--space-xs); padding: 0; }
.pp-close-t { margin: 0 0 var(--space-xs); font-size: var(--fs-sm); }
.pp-close-f { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs) var(--space-sm); margin: var(--space-xs) 0 0; }
.pp-close-f .btn { min-height: 2.75rem; }
.pp-close-f .pp-hint,
.imp-sheet-head .form-title,
.rev-actions .action-item,
.fb-review-row dd,
.np-tools form,
.dsrv-form,
.rq-gaps p,
.fp-add,
.pp-ev-b p,
.po-hidden form { margin: 0; }
.pp-close-ask { border: 0.0625rem solid var(--text-primary); padding: var(--space-sm); }
.pp-close-ask .pp-close-t { flex: 1 1 100%; font-weight: 600; }
.pp-close-f .btn[disabled] { opacity: 0.55; cursor: not-allowed; }
/* Ведомость на телефоне — карточка на человека: имя и «К выплате» в первой строке, остальное подписанными
   значениями ниже, без прокрутки вбок (Фрейн, таблицы на узком экране). С 48em — обычная таблица. */
.pp-rep .pp-pay { display: block; width: 100%; }
.pp-rep .pp-pay thead { display: none; }
.pp-rep .pp-pay tbody { display: block; }
.pp-rep .pp-pay tr { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.125rem var(--space-md); padding: var(--space-xs) 0; border-bottom: 0.0625rem solid var(--border); }
.pp-rep .pp-pay tr > th, .pp-rep .pp-pay tr > td { display: block; padding: 0; border: 0; white-space: normal; }
.pp-rep .pp-pay .pp-name { position: static; flex: 1 1 55%; min-width: 0; font-weight: 600; }
.pp-rep .pp-pay .pp-name a { color: var(--text-primary); }
.pp-row-team { display: block; font-weight: 400; font-size: var(--fs-xs); color: var(--text-muted); }
.pp-rep .pp-pay .pp-bal { order: 1; flex: 0 0 auto; font-size: var(--fs-md); text-align: right; }
.pp-rep .pp-pay td { order: 2; font-size: var(--fs-xs); }
.pp-rep .pp-pay td[data-l]::before { content: attr(data-l) " "; color: var(--text-muted); font-family: var(--font-mono); font-size: var(--micro-size); }
.pp-rep .pp-pay td:empty, .pp-rep .pp-pay td.pp-col-team, .pp-rep .pp-pay td.pp-opt-col:empty { display: none; }
.pp-rep .pp-pay .pp-act-c { order: 3; margin-left: auto; }
.pp-rep .pp-pay .pp-edit { display: inline-flex; align-items: center; min-height: 2.75rem; padding: 0 var(--space-sm); border: 0.0625rem solid var(--border); color: var(--text-primary); text-decoration: none; font-weight: 600; }
.pp-rep .pp-pay tr.pp-editing, .pp-rep .pp-pay tr.pp-editing > td { display: block; }
.pp-rep .pp-ledger-wrap.pp-scroll { overflow: visible; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-rep .pp-ledger-wrap.pp-scroll { overflow: auto; }
    .pp-rep .pp-pay { display: table; width: auto; }
    .pp-rep .pp-pay thead { display: table-header-group; }
    .pp-rep .pp-pay tbody { display: table-row-group; }
    .pp-rep .pp-pay tr { display: table-row; padding: 0; }
    .pp-rep .pp-pay tr > th, .pp-rep .pp-pay tr > td { display: table-cell; padding: 0.55rem var(--space-sm) 0.55rem 0.25rem; white-space: nowrap; }
    .pp-rep .pp-pay tbody tr:not(.pp-total) > * { border-bottom: 0.0625rem solid var(--border); }
    .pp-rep .pp-pay td[data-l]::before { content: none; }
    .pp-rep .pp-pay td.pp-col-team,
    .pp-rep .pp-pay td:empty,
    .pp-rep .pp-pay td.pp-opt-col:empty,
    .pp-rep .pp-pay tr.pp-editing > td { display: table-cell; }
    .pp-rep .pp-pay .pp-name { position: sticky; left: 0; }
    .pp-rep .pp-pay .pp-bal,
    .pp-rep .pp-pay td { font-size: inherit; }
    .pp-row-team { display: none; }
    .pp-rep .pp-pay tr.pp-editing { display: table-row; }
}
/* Телефон: пока открыт лист выбора объекта (низ экрана), прокрутка к строке оставляет её над листом —
   второй тап по дню попадает в клетку, а не в лист. С 48em выбор раскрывается в строке. */
html:has(#gx-pick.pp-pick) { scroll-padding-bottom: calc(45dvh + 4rem + env(safe-area-inset-bottom, 0rem)); }
.pp-more-f > summary { cursor: pointer; min-height: 2.75rem; display: inline-flex; align-items: center; font-size: var(--fs-xs); color: var(--text-secondary); text-decoration: underline; text-underline-offset: 0.15em; }
.pp-more-f[open] > summary { color: var(--text-primary); }
/* Тонкая линия перед первым пунктом каждой группы — раздел читается без
   заголовков, которых в горизонтальной шапке всё равно не поставить. */
.pp-more-f > .pp-field,
.nav.open .nav-link--grouped[data-nav-group]:first-of-type,
.rr-reject-form { margin-top: var(--space-xs); }
/* Лист выбора объекта и плашки — над баннером установки (z 1200): синтетик 15.10 шесть раз жал «La Mer B25»
   в листе, а попадал в баннер, лежавший сверху. */
.pp-pick { z-index: 1240; }
/* Телефон: неделя без колонки «Свободно дней» — клетки дней шире (≈2.4rem вместо 1.9rem); число свободных
   дней есть в строке месяца и в «Свободны». */
.pp-bench--w .pp-fr { display: none; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-bench--w .pp-fr { display: flex; }
}
/* Ведомость на телефоне: в карточке только то, по чему платят; ставка в день и нули — с 48em в таблице. */
.pp-rep .pp-pay td.pp-m-hide { display: none; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-rep .pp-pay td.pp-m-hide { display: table-cell; }
}
.pp-rep .pp-pay tbody tr { padding: var(--space-sm) 0; }
/* «+ Новый объект» в листе и в колонке объектов расстановки. */
.pp-newsite { border-top: 0.0625rem solid var(--border); margin-top: var(--space-sm); }
.pp-newsite-s { cursor: pointer; min-height: 2.75rem; display: flex; align-items: center; font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--text-primary); }
.pp-newsite[open] > .pp-newsite-s { color: var(--primary); }
.pp-newsite-f { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-newsite-f { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) auto; align-items: end; }
}
/* «Принять» у заголовка состава: кнопка-сводка, форма раскрывается на месте. */
.pp-hire { margin: 0 0 var(--space-sm); }
.pp-hire > summary { list-style: none; display: inline-flex; align-items: center; min-height: 2.75rem; cursor: pointer; }
.pp-hire > summary::-webkit-details-marker { display: none; }
.pp-hire-f { margin-top: var(--space-sm); padding-top: var(--space-sm); border-top: 0.0625rem solid var(--border); }
.pp-dup { border: 0.0625rem solid var(--text-primary); padding: var(--space-sm); }
.pp-dup-t { font-weight: 700; margin: 0 0 var(--space-xs); }
.pp-dup ul { margin: 0 0 var(--space-xs); padding-left: 1.25rem; }
.pp-dup a { color: var(--text-primary); display: inline-flex; align-items: center; min-height: 2.75rem; }
/* Палитра-кисть расстановки. Телефон (база): прижата к низу над нижней панелью, лента вбок, цели 2.75rem.
   С 48em — липкая полоса над сеткой под шапкой сайта; шапка дней липнет под ней. */
.pp-pal { --pal-h: 3.25rem; position: fixed; left: 0; right: 0; bottom: calc(3.5rem + env(safe-area-inset-bottom, 0rem)); z-index: 1235;
  display: flex; align-items: center; gap: var(--space-xs); overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin;
  min-height: var(--pal-h); padding: 0.25rem var(--fm-gutter, 1rem); background: var(--bg-base); border-top: 0.125rem solid var(--text-primary); }
.pp-pal-l { flex: 0 0 auto; font-family: var(--font-mono); font-size: var(--micro-size); font-weight: 700; color: var(--text-muted); }
.pp-pal-b { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 0.375rem; min-height: 2.75rem; padding: 0 0.625rem; white-space: nowrap;
  font: inherit; font-size: var(--fs-xs); border: 0.0625rem solid var(--border); background: var(--bg-surface); color: var(--text-primary); cursor: pointer; touch-action: manipulation; }
.pp-pal-b span { color: var(--text-secondary); }
.pp-pal-b--leave b { font-style: italic; font-family: inherit; font-weight: 600; }
.pp-pal-b.is-on { border: 0.125rem solid var(--primary); background: color-mix(in oklab, var(--primary) 18%, var(--bg-surface)); }
.pp-pal-hint { flex: 0 0 auto; font-size: var(--fs-xs); color: var(--text-secondary); white-space: nowrap; }
.is-brushing .pp-cell[data-gx-x] { cursor: copy; }
.is-brushing .pp-pal-hint { color: var(--primary); font-weight: 700; }
html:has(.pp-pal) .pp-undo-bar, html:has(.pp-pal) .pp-pick { bottom: calc(6.75rem + env(safe-area-inset-bottom, 0rem)); }
html:has(.pp-pal) { scroll-padding-bottom: calc(7.5rem + env(safe-area-inset-bottom, 0rem)); }
html:has(.pp-pal):has(#gx-pick.pp-pick) { scroll-padding-bottom: calc(45dvh + 7.5rem); }
/* Телефон: первая строка людей на первом экране — подсказка в «?», объекты свёрнуты в строку. */
.pp-howto { display: none; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-howto { display: block; }
    /* Палитра — одна строка постоянной высоты (лента вбок): шапка дней встаёт ровно под ней. Корень 21.10
       («названия проектов налазят на даты»): на 48–80em палитра в 5 рядов (17rem) липла над сеткой со своей
       прокруткой, а на 80em+ полоса прокрутки ленты делала её выше 2.875rem, на которые сдвигалась шапка. */
    .pp-pal { position: static; bottom: auto; left: auto; right: auto; z-index: 20; margin: 0 0 var(--space-xs); padding: 0;
      height: var(--pp-pal-h); min-height: 0; border-top: 0; border-bottom: 0.0625rem solid var(--border); flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; }
    .pp-pal-b,
    .pp-rep .pp-pay .pp-edit { min-height: 2.25rem; }
    html:has(.pp-pal) body { padding-bottom: 0; }
    html:has(.pp-pal) .pp-undo-bar { bottom: calc(4.5rem + env(safe-area-inset-bottom, 0rem)); }
    html:has(.pp-pal) .pp-pick { bottom: auto; }
    html:has(.pp-pal),
    html:has(#gx-pick.pp-pick),
    html:has(.pp-pal):has(#gx-pick.pp-pick) { scroll-padding-bottom: 0.75rem; }
}
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    /* Высота палитры — одна переменная на палитру и на отступ шапки дней. */
    html:has(.pp-pal) { --pp-pal-h: 3.5rem; }
}
@media (min-width: 80em) {
    /* Сетка месяца без своей прокрутки: палитра липнет под шапкой сайта, шапка дней — под палитрой.
       На 48–80em сетка шире экрана и прокручивается сама, шапка дней липнет к её верху, палитра стоит над ней в потоке. */
    .pp-pal { position: sticky; top: var(--pp-top); }
    .pp-bench--m .pp-row--head { top: calc(var(--pp-top) + var(--pp-pal-h, 0rem)); }
}
.pp-pal-hint--on, .pp-pal-off { display: none; }
.is-brushing .pp-pal-hint--on, .is-brushing .pp-pal-off { display: inline-flex; }
.is-brushing .pp-pal-hint--off { display: none; }
/* Блок объектов расстановки свёрнут в одну строку-итог (summary) на обоих видах. */
.pp-load-all > summary { list-style: none; cursor: pointer; display: block; }
.pp-load-all > summary::-webkit-details-marker { display: none; }
.pp-load-sum .pp-row--sum { border-top: 0.0625rem solid var(--text-primary); }
.pp-load-sum .pp-name { flex-direction: column; align-items: flex-start; }
.pp-load-sum .pp-load-code::after { content: " ▸"; color: var(--text-muted); }
.pp-load-all[open] > .pp-load-sum .pp-load-code::after { content: " ▾"; }
/* T1 (15.10): телефон — «Сегодня» списком; сетка недели вторым видом. С 48em — сетка месяца как раньше. */
.pp-views { display: flex; gap: var(--space-xs); margin: 0 0 var(--space-sm); }
.pp-view { flex: 1 1 0; display: inline-flex; align-items: center; justify-content: center; min-height: 2.75rem; border: 0.0625rem solid var(--border);
  font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; color: var(--text-secondary); text-decoration: none; }
.pp-view.is-on { color: var(--text-primary); border-color: var(--text-primary); background: var(--bg-elevated); }
.pp-today { display: none; }
.pp-bv-today .pp-today { display: block; }
.pp-bv-today .pp-bench--w, .pp-bv-today .pp-tb-grp.pp-tb-week, .pp-bv-today .pp-pal { display: none; }
.pp-today-list { list-style: none; margin: 0; padding: 0; border-top: 0.0625rem solid var(--border); }
.pp-today-i { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0 var(--space-sm); align-items: center; padding: var(--space-xs) 0; border-bottom: 0.0625rem solid var(--border); }
.pp-today-who { grid-column: 1; display: flex; flex-direction: column; min-height: 2.75rem; justify-content: center; color: var(--text-primary); text-decoration: none; min-width: 0; }
.pp-today-who b { font-size: var(--fs-sm); overflow-wrap: anywhere; }
.pp-today-now { grid-column: 1; font-size: var(--fs-sm); }
.pp-today-i.is-free .pp-today-now { color: var(--text-muted); }
.pp-today-ch { grid-column: 2; grid-row: 1 / span 2; min-height: 2.75rem; min-width: 5.5rem; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-views, .pp-bv-today .pp-today { display: none; }
    .pp-bv-today .pp-pal { display: flex; }
}
/* R3 (15.10): выбор клетки или имени — попап поверх сетки, без перехода. Телефон: нижний лист выезжает снизу;
   с 48em — окно по центру. Анимации 180 мс, при prefers-reduced-motion — без движения. Изменённые строки вспыхивают. */
.pp-pop {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1240;
    max-height: 82dvh;
    overflow-y: auto;
    overscroll-behavior: contain;
    background: var(--bg-surface);
    border-top: 0.125rem solid var(--text-primary);
    box-shadow: 0 -0.5rem 2rem rgba(0,0,0,0.45);
    padding: var(--space-sm) var(--fm-gutter, 1rem) calc(var(--space-sm) + env(safe-area-inset-bottom, 0rem));
    animation: pp-sheet-in 180ms var(--ease-out, ease-out);
}
html:has(.pp-pal) .pp-pop, html:has(.fm-bottombar) .pp-pop { bottom: 0; }
@keyframes pp-sheet-in { from { transform: translateY(100%); } to { transform: none; } }
.pp-pop .pp-pick-t { font-size: var(--fs-sm); }
.pp-pop-dates { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-xs); margin: 0 0 var(--space-sm); }
.pp-pop-d { min-height: 2.75rem; font: inherit; font-size: var(--fs-xs); font-weight: 700; border: 0.0625rem solid var(--border); background: var(--bg-base); color: var(--text-primary); cursor: pointer; }
.pp-pop-d.is-on { border: 0.125rem solid var(--primary); background: color-mix(in oklab, var(--primary) 16%, var(--bg-base)); }
.pp-pop-leaves { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xs); margin: 0 0 var(--space-xs); }
.pp-pop-leaves .pp-opt { grid-template-columns: minmax(0, 1fr); border: 0.0625rem solid var(--border); min-height: 2.75rem; justify-items: center; }
.pp-pop .pp-opt { min-height: 2.75rem; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-pop { left: 50%; right: auto; top: 50%; bottom: auto; width: min(30rem, calc(100vw - 2rem)); max-height: 80vh; transform: translate(-50%, -50%);
      border: 0.0625rem solid var(--border); border-top: 0.125rem solid var(--text-primary); padding: var(--space-md); animation: pp-pop-in 160ms var(--ease-out, ease-out); }
    @keyframes pp-pop-in { from { opacity: 0; transform: translate(-50%, -48%) scale(0.97); } to { opacity: 1; transform: translate(-50%, -50%); } }
    .pp-pop-leaves { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    html:has(.pp-pal) .pp-pop { bottom: auto; }
}
.pp-row.is-flash .pp-bar, .pp-row.is-flash .pp-name { animation: pp-flash 900ms ease-out; }
@keyframes pp-flash { 0% { background-color: color-mix(in oklab, var(--primary) 45%, var(--bg-surface)); } 100% { background-color: inherit; } }
@media (prefers-reduced-motion: reduce) {
    /* своё имя не нужно */
    .pp-pop,
    .pp-row.is-flash .pp-bar,
    .pp-row.is-flash .pp-name,
    .dm-chat .chat-msg,
    .tsk-draft-arrive { animation: none; }
}
/* Модель таблицы (Excel, 15.10). Выделение видно всегда: заливка прямоугольника и толстая рамка активной клетки. */
.pp-cell.is-sel { background: color-mix(in oklab, var(--primary) 26%, transparent); box-shadow: inset 0 0 0 0.0625rem color-mix(in oklab, var(--primary) 70%, transparent); position: relative; z-index: 3; }
.pp-cell.is-act { box-shadow: inset 0 0 0 0.1875rem var(--primary); position: relative; z-index: 4; outline: none; }
[data-gx-sheet] .pp-cell[data-gx-x] { cursor: cell; }
[data-gx-sheet] .pp-bar,
.sch-ghost * { pointer-events: none; }
[data-gx-sheet] .pp-bar .pp-hl, [data-gx-sheet] .pp-bar .pp-hr { pointer-events: auto; }
/* Код объекта крупно, заливка — цвет объекта из книги (sites.colour), отсутствия — своим цветом. */
.pp-bar { font-size: var(--fs-xs); }
.pp-bar.pp-c-indigo, .pp-swatch.pp-c-indigo { background: color-mix(in oklab, var(--hue-indigo) 42%, var(--bg-surface)); }
.pp-bar.pp-c-blue, .pp-swatch.pp-c-blue { background: color-mix(in oklab, var(--hue-blue) 42%, var(--bg-surface)); }
.pp-bar.pp-c-sky, .pp-swatch.pp-c-sky { background: color-mix(in oklab, var(--hue-sky) 42%, var(--bg-surface)); }
.pp-bar.pp-c-teal, .pp-swatch.pp-c-teal { background: color-mix(in oklab, var(--hue-teal) 42%, var(--bg-surface)); }
.pp-bar.pp-c-green, .pp-swatch.pp-c-green { background: color-mix(in oklab, var(--hue-green) 42%, var(--bg-surface)); }
.pp-bar.pp-c-lime, .pp-swatch.pp-c-lime { background: color-mix(in oklab, var(--hue-lime) 42%, var(--bg-surface)); }
.pp-bar.pp-c-amber, .pp-swatch.pp-c-amber { background: color-mix(in oklab, var(--hue-amber) 42%, var(--bg-surface)); }
.pp-bar.pp-c-orange, .pp-swatch.pp-c-orange { background: color-mix(in oklab, var(--hue-orange) 42%, var(--bg-surface)); }
.pp-bar.pp-c-red, .pp-swatch.pp-c-red { background: color-mix(in oklab, var(--hue-red) 42%, var(--bg-surface)); }
.pp-bar.pp-c-pink, .pp-swatch.pp-c-pink { background: color-mix(in oklab, var(--hue-pink) 42%, var(--bg-surface)); }
.pp-bar.pp-c-purple, .pp-swatch.pp-c-purple { background: color-mix(in oklab, var(--hue-purple) 42%, var(--bg-surface)); }
.pp-bar.pp-c-brown, .pp-swatch.pp-c-brown { background: color-mix(in oklab, var(--hue-brown) 42%, var(--bg-surface)); }
.pp-bar.pp-c-leave, .pp-swatch.pp-c-leave { background: repeating-linear-gradient(135deg, color-mix(in oklab, var(--hue-slate) 45%, transparent) 0 0.125rem, transparent 0.125rem 0.375rem), color-mix(in oklab, var(--hue-slate) 22%, var(--bg-surface)); }
/* Список выбора: по центру (ПК) и нижним листом (телефон). */
.pp-codes { position: fixed; left: 0; right: 0; bottom: 0; z-index: 1245; max-height: 60dvh; display: flex; flex-direction: column; gap: var(--space-xs);
  padding: var(--space-sm) var(--fm-gutter, 1rem) calc(var(--space-sm) + env(safe-area-inset-bottom, 0rem)); background: var(--bg-surface); border-top: 0.125rem solid var(--text-primary);
  box-shadow: 0 -0.5rem 2rem rgba(0,0,0,0.45); animation: pp-sheet-in 160ms var(--ease-out, ease-out); }
.pp-codes[hidden] { display: none; }
.pp-codes-q { min-height: 2.75rem; font-size: var(--fs-md); }
.pp-codes-list { overflow-y: auto; display: grid; grid-template-columns: minmax(0, 1fr); grid-auto-rows: max-content; }
.pp-code { display: grid; grid-template-columns: minmax(5rem, 40%) minmax(0, 1fr); gap: var(--space-xs); align-items: center; min-height: 2.75rem; padding: 0 var(--space-xs); border: 0; border-bottom: 0.0625rem solid var(--border); background: transparent; color: var(--text-primary); font: inherit; font-size: var(--fs-sm); text-align: left; cursor: pointer; }
/* Длинный код («District One F160») переносился и наезжал на соседнюю строку (29.10): одна строка с многоточием, полное имя в title. */
.pp-code b { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-code span { color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-code[hidden] { display: none; }
.pp-code.is-hl, .pp-code:hover { background: color-mix(in oklab, var(--primary) 18%, transparent); }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    /* Одно место для любого окна выбора — по центру, как .pp-pop (Дмитрий 21.10: «окно прыгает то влево, то вправо»:
       список вставал у активной клетки, а окно протяжки — по центру). */
    .pp-codes { left: 50%; top: 50%; right: auto; bottom: auto; transform: translate(-50%, -50%); width: min(30rem, calc(100vw - 2rem)); max-height: min(30rem, 80vh); border: 0.0625rem solid var(--border); border-top: 0.125rem solid var(--text-primary); padding: var(--space-md); animation: none; }
    .pp-code { min-height: 2rem; }
}
@media (prefers-reduced-motion: reduce) {
    .pp-codes { animation: none; }
}
.pp-pal-more b { font-family: inherit; }
/* Окошко человека в расстановке: нижняя панель fm-qsheet (как у «+»), на широком экране не шире 40rem по центру. */
.pp-qsheet .fm-qsheet-panel { left: max(0rem, calc(50% - 20rem)); right: max(0rem, calc(50% - 20rem)); max-height: 85dvh; overflow-y: auto; overscroll-behavior: contain; }
/* 16.10 Дмитрий: окошко внизу пряталось за плашкой «Отменить» и не прокручивалось.
   Пока окошко открыто, плашку убираем; на широком экране окошко стоит посередине. */
html:has(.fm-qsheet.is-open) .pp-undo-bar { visibility: hidden; }
@media (min-width: 48em), (pointer: fine) and (min-width: 30em) {
    .pp-qsheet .fm-qsheet-panel { top: 50%; bottom: auto; max-height: 80dvh; padding-bottom: var(--space-md); opacity: 0; transform: translateY(-46%); transition: transform var(--dur-normal) var(--ease-out), opacity var(--dur-fast) var(--ease-out); }
    .pp-qsheet.is-open .fm-qsheet-panel { opacity: 1; transform: translateY(-50%); }
    .pp-qsheet .fm-qsheet-panel::before { inset: 0.0625rem; }
}
/* Плашка после группового действия перечисляла всех людей в 4–5 строк: одна строка, полный текст в подсказке. */
.pp-undo-msg { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; }
.pp-quick-act { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-sm); }
.pp-quick-act .btn { min-height: 2.75rem; }
.pp-quick-card { margin-inline-start: auto; color: var(--text-muted); font-size: var(--fs-xs); }
.pp-name-a[data-quick] { cursor: pointer; }
/* Бригады блоками: отступ и заголовок группы (Дмитрий 16.10: цветом сто бригад не различить). */
.pp-row--team { margin-top: 1.5rem; border-bottom: 0.125rem solid var(--text-muted); }
.pp-row--team .pp-name { display: flex; align-items: baseline; gap: var(--space-sm); padding-block: var(--space-xs); }
.pp-team-n { font-size: var(--fs-md, 1rem); letter-spacing: 0.02em; text-transform: uppercase; }

/* Дмитрий 29.10: «Работать в выходные» в списке выбора; без галочки протяжка пропускает выходные. */
.pp-codes-we { display: flex; align-items: center; gap: var(--space-xs); min-height: 2.75rem; font-size: var(--fs-sm); color: var(--text-secondary); cursor: pointer; }
.pp-codes-we input { width: auto; min-width: 0; margin: 0; }
/* «Убрать из графика» в окошке человека и список убранных под сеткой. */
.pp-quick-off { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs) var(--space-sm); margin-top: var(--space-md); padding-top: var(--space-sm); border-top: 0.0625rem solid var(--border); }
.pp-off { margin-top: var(--space-md); font-size: var(--fs-sm); }
.pp-off > summary { cursor: pointer; color: var(--text-secondary); min-height: 2.75rem; display: flex; align-items: center; }
.pp-off-list { list-style: none; margin: 0; padding: 0; }
.pp-off-list li { display: flex; align-items: center; justify-content: space-between; gap: var(--space-sm); padding: var(--space-xs) 0; border-bottom: 0.0625rem solid var(--border); }
.pp-off-list a { color: var(--text-primary); }

/* ТЗ 04.11: образец цвета объекта/бригады в таблицах «Проекты» и «Бригады» — код на цвете палитры. */
.pp-swatch { display: inline-block; padding: 0.125rem var(--space-xs); font-family: var(--font-mono); font-weight: 700; font-size: var(--fs-xs);
  background: color-mix(in oklab, var(--text-primary) 16%, var(--bg-surface)); color: var(--text-primary); white-space: nowrap; }
