/* График работ: таблица, Гантт, импорт, недельный план. */
/* ── Schedule inline editor (PM, desktop-first) ─────────────────
   Grid rows = one update <form> each. Horizontal scroll on narrow screens
   keeps the columns aligned instead of collapsing. */
/* 29.09: шапка і рядки графіка — ОДНІ треки. Остання колонка (коментар, «Зберегти»,
   «Видалити») була max-content: у шапці вона порожня, у рядку широка, тож fr-колонки
   рядка стискались і підписи з'їжджали на 71 px (геометричний огляд синтетиків). */
.sch-erow {
    display: grid;
    grid-template-columns: minmax(11rem, 2fr) 8.25rem 8.25rem 8.5rem 4rem 9.5rem;
    gap: 0.5rem;
    align-items: center;
    min-width: 48rem;
    padding: 0.35rem 0.25rem;
    border-bottom: 0.0625rem solid var(--border);
    --sch-act-w: 11.5rem;
}
.sch-erow--add { background: var(--bg-elevated); margin-bottom: 0.25rem; }
.sch-in {
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    padding: 0.4rem 0.5rem;
    background: var(--bg-base);
    color: var(--text-primary);
    border: 0.0625rem solid var(--border);
    /* Радиус в системе равен нулю (DESIGN.md, раздел 4). */
    border-radius: 0;
    width: 100%;
    min-width: 0;
    min-height: var(--tap-target);
}
.sch-erow-act { display: flex; gap: 0.4rem; align-items: center; }
/* ── Agent proposal cards ─────────────────────────────── */
.prop-card { border: 0.0625rem solid var(--border); padding: 0.6rem 0.75rem; margin-bottom: 0.5rem; background: var(--bg-surface); }
.prop-kind { font-family: var(--font-mono); font-size: var(--micro-size); letter-spacing: 0; padding: 0.1rem 0.4rem; border: 0.0625rem solid var(--border); color: var(--text-secondary); }
.prop-task { font-size: var(--fs-xs); }
.gantt-row {
    display: flex;
    align-items: center;
    min-height: 2rem;
    border-bottom: 0.0625rem solid var(--border);
}
.gantt-label {
    /* №208 */
    flex: 0 0 6.25rem;
    font-family: var(--font-mono);
    font-size: var(--micro-size);
    color: var(--text-secondary);
    padding-right: var(--space-sm);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    display: flex;
    align-items: center;
}
@media (min-width: 48em) {
    .gantt-label { flex: 0 0 10rem; font-size: var(--fs-xs); }
}
.gantt-axis-range {
    flex: 1;
    display: flex;
    justify-content: space-between;
    font-family: var(--font-mono);
    font-size: var(--micro-size);
    color: var(--text-muted);
    padding-top: var(--space-xs);
    min-width: 12.5rem;
}
@media (min-width: 48em) {
    .gantt-axis-range { min-width: 18.75rem; }
}
.fm-arrived::after {
    content: ""; position: absolute; inset: 0; pointer-events: none;
    background: color-mix(in srgb, var(--primary) 22%, transparent);
    animation: fm-arrive-flash 1.4s ease-out forwards;
}
/* ══ A20 Weekly report — Swiss modular grid (Müller-Brockmann) ══════════════
   Mobile-first single column, strict baseline rhythm, flush-left mono labels,
   hairline rules, objective — no ornament. Grounded in RWD ch.5 (CSS Grid). */
.wk { max-width: 60rem; }
.wk-head {
    border-top: 0.125rem solid var(--text-primary);
    padding-top: var(--space-sm);
    margin-bottom: var(--space-xl);
}
.wk-kicker {
    font-family: var(--font-mono);
    font-size: var(--fs-xs); font-weight: 700;
    letter-spacing: 0;
    color: var(--primary);
}
.wk-title {
    font-size: clamp(1.5rem, 6vw, 2.25rem); font-weight: 800;
    line-height: 1.04; letter-spacing: -0.01em;
    margin: var(--space-xs) 0 0;
}
.wk-hint {
    font-size: var(--fs-xs); line-height: 1.5;
    color: var(--text-secondary);
    margin: var(--space-sm) 0 0; max-width: 42ch;
}
/* Form: one modular column on mobile; from/to ride a 2-col sub-grid. */
.wk-form { display: grid; grid-template-columns: 1fr; gap: var(--space-lg); }
.wk-pair { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-md); }
.wk-field { display: flex; flex-direction: column; gap: 0.375rem; min-width: 0; }
.wk-label {
    font-family: var(--font-mono);
    font-size: var(--micro-size); font-weight: 700;
    letter-spacing: 0;
    color: var(--text-muted);
}
.wk-select, .wk-input {
    width: 100%; box-sizing: border-box;
    font-family: var(--font-mono); font-size: var(--fs-sm);
    color: var(--text-primary);
    background: var(--bg-surface);
    border: 0.0625rem solid var(--border); border-radius: 0;
    padding: 0.75rem var(--space-md); min-height: 3rem;
    appearance: none; -webkit-appearance: none;
    transition: border-color var(--dur-fast) var(--ease-out);
}
.wk-submit {
    width: 100%; min-height: 3.25rem; margin-top: var(--space-xs);
    font-family: var(--font-mono); font-weight: 700;
    letter-spacing: 0;
}
@media (min-width: 40em) {
    /* ≥40em: site + from + to + action align on ONE modular row (2fr 1fr 1fr auto),
       flushed to a shared baseline. `display:contents` flattens the pair into it. */
    .wk-form { grid-template-columns: 2fr 1fr 1fr auto; align-items: end; }
    .wk-pair { display: contents; }
    .wk-submit { width: auto; margin-top: 0; padding-inline: var(--space-xl); }
}
/* Past reports — aligned Swiss list: fixed badge module, name, mono meta,
   hairline dividers. Stacks name/meta on mobile, single row on wider screens. */
.wk-past { margin-top: var(--space-2xl); }
.wk-past-title {
    font-family: var(--font-mono);
    font-size: var(--fs-xs); font-weight: 700;
    letter-spacing: 0;
    color: var(--text-muted);
    border-bottom: 0.0625rem solid var(--border);
    padding-bottom: var(--space-xs); margin: 0;
}
.wk-item {
    display: grid;
    grid-template-columns: auto 1fr;
    grid-template-areas: "badge site" "badge meta";
    column-gap: var(--space-md); row-gap: 0.125rem;
    align-items: center;
    padding: var(--space-md) 0;
    border-bottom: 0.0625rem solid var(--border);
    text-decoration: none; color: var(--text-primary);
    transition: none;
}
.wk-badge {
    grid-area: badge; align-self: center;
    font-family: var(--font-mono);
    font-size: var(--micro-size); font-weight: 700; letter-spacing: 0;
    color: var(--primary); border: 0.0625rem solid var(--primary);
    padding: 0.25rem 0.5rem;
}
.wk-site { grid-area: site; font-weight: 700; font-size: var(--fs-sm); }
.wk-meta {
    grid-area: meta;
    font-family: var(--font-mono);
    font-size: var(--fs-xs); color: var(--text-muted); letter-spacing: 0;
}
@media (min-width: 40em) {
    .wk-item {
        grid-template-columns: auto 1fr auto;
        grid-template-areas: "badge site meta";
    }
    .wk-meta { text-align: right; }
}
/* ══ Schedule (/schedule) — data-viz micrographics + mobile ════════════════ */
/* Status distribution bar (proportional via flex-grow from the template). */
.sch-statusbar {
    display: flex; height: 0.625rem;
    border: 0.0625rem solid var(--border);
    margin: 0 0 0.5rem;
}
.sch-statusbar .ss { display: block; min-width: 0.125rem; }
.gantt-pct {
    flex: 0 0 2.5rem; text-align: right;
    font-family: var(--font-mono); font-size: var(--micro-size);
    color: var(--text-secondary); font-variant-numeric: tabular-nums;
    padding-left: var(--space-sm);
}
/* ══ Schedule toolbar: add-task row + import trigger ═══════════════════════ */
.sch-toolbar { display: flex; flex-direction: column; align-items: flex-end; margin-bottom: var(--space-md); }
.imp-open {
    display: inline-flex; align-items: center; gap: 0.4rem;
    margin-top: 0.5rem; padding: 0.45rem 0.8rem; min-height: var(--tap-target);
    font-family: var(--font-mono); font-size: var(--fs-xs); letter-spacing: 0;
    color: var(--text-secondary); background: transparent;
    border: 0.0625rem solid var(--border); cursor: pointer;
}
.imp-open:hover,
.imp-open:focus-visible,
.vtabs-i:hover,
.vtabs-i:focus-visible { border-color: var(--primary); color: var(--primary); outline: none; }
/* Add-task = icon button beside the description (not a wide "ДОБАВИТЬ"). */
.sch-add-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem;
    width: 100%; min-width: var(--tap-target); min-height: var(--tap-target);
    padding: 0 0.75rem; cursor: pointer;
    font-family: var(--font-mono); font-size: var(--fs-xs); letter-spacing: 0; white-space: nowrap;
    color: var(--bg); background: var(--primary); border: none;
}
.sch-add-btn:hover, .sch-add-btn:focus-visible { background: var(--accent, var(--primary)); filter: brightness(1.1); outline: none; }
.imp-toggle:checked ~ .imp-backdrop { opacity: 1; visibility: visible; }
.imp-x:hover { color: var(--primary); }
/* ══ Overall-completion tick-ruler gauge (Awwwards micrographic ref) ════════ */
.gauge { margin: 0 0 var(--space-lg); }
.sph[open] { background: color-mix(in srgb, var(--bg-surface) 45%, transparent); }
.sph[open] .gph-bub { background: var(--primary); color: var(--bg); }
@media (max-width: 47.99em) {
    /* ── Mobile: the editor grid stacks (no 48rem horizontal scroll); gantt tightens ── */
    .sch-erow {
        grid-template-columns: 1fr 1fr;
        min-width: 0; gap: 0.4rem;
        padding: 0.6rem 0.5rem;
        background: var(--bg-surface);
        border: 0.0625rem solid var(--border);
        margin-bottom: 0.4rem;
    }
    .sch-erow > :first-child { grid-column: 1 / -1; }
    .sch-erow .sch-erow-act { grid-column: 1 / -1; justify-content: flex-end; }
}
/* ══ Phase-first Gantt (/schedule) — collapsible phase bars + micrographics ══ */
.gantt-pcount { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); font-weight: 400; }
.gph[open] { background: color-mix(in srgb, var(--bg-surface) 55%, transparent); }
.gph-sum {
    display: flex; align-items: center; gap: var(--space-sm);
    min-height: 2.75rem; padding: 0.35rem 0; cursor: pointer;
    list-style: none; user-select: none;
}
/* Grid-bubble + phase name = the row's identity column (aligns with task labels). */
.gph-id { flex: 0 0 8rem; display: flex; align-items: center; gap: 0.5rem; min-width: 0; }
.gph[open] .gph-bub { background: var(--primary); color: var(--bg); }
.gph-track::before {
    /* baseline datum the bar sits on */
    content: ""; position: absolute; left: 0; right: 0; top: 50%;
    border-top: 0.0625rem dotted var(--border);
}
/* Dimension witness-lines — thin vertical caps just past each bar end. */
.gph-bar::before, .gph-bar::after {
    content: ""; position: absolute; top: -0.1875rem; bottom: -0.1875rem;
    width: 0.0625rem; background: var(--primary); opacity: 0.7;
}
.gph-bar::before { left: -0.0625rem; }
.gph-bar::after { right: -0.0625rem; }
.gph-prog::after {
    /* level-datum triangle marking the completion front */
    content: ""; position: absolute; right: -0.25rem; top: -0.3125rem;
    border-left: 0.25rem solid transparent; border-right: 0.25rem solid transparent;
    border-top: 0.3125rem solid var(--primary);
}
.gph-split i { display: block; min-width: 0.0625rem; }
.gph-n::before { content: "×"; opacity: 0.5; }
.gph-body .gantt-row { min-height: 1.75rem; border-bottom: none; }
.gph-body .gantt-label { flex: 0 0 6.9rem; }
@media (max-width: 47.99em) {
    /* Add-task row in 2 lines. Top: [site][start][end] (объект + период).
           Bottom: [task description ................][+ icon]. Explicit rows —
           DOM order can't auto-flow into this shape. */
    /* Ряд «додати задачу» переїхав нижче, до свого блоку: поля тепер
           загорнуті в <label> з підписами, і ці селектори по input[name] мертві. */
    .gantt-label { flex: 0 0 5rem; font-size: var(--micro-size); }
    .gantt-pct { flex: 0 0 2rem; }
    .gantt-axis-range { min-width: 0; }
    .gph-body .gantt-label { flex: 0 0 4.5rem; font-size: var(--micro-size); }
}
/* Відкритий чіп бере весь рядок — форма/панель отримує повну ширину,
   другий чіп зʼїжджає нижче. Закрився — знову дві рівні колонки. */
.tsk-bar--2col > .tsk-supply[open],
.tsk-bar--2col > .tsk-filter:has(details[open]),
.estimate-profile > .estimate-q,
.estimate-profile > .estimate-due,
.sch-erow--add > .sch-field:nth-child(2),
.sch-erow--add > .sch-erow-act,
.tb-filters .tb-q,
.wk-form .tx-tr,
.wk-form .tx-note { grid-column: 1 / -1; }
/* ══ План работ прораба: вкладки phase/week/day + недельный грид + явка ════ */
.vtabs { display: flex; gap: 0.25rem; margin-bottom: var(--space-md); }
.vtabs-i {
    display: inline-flex; align-items: center; min-height: var(--tap-target);
    padding: 0.3rem 0.8rem;
    font-family: var(--font-mono); font-size: var(--fs-xs); letter-spacing: 0;
    color: var(--text-secondary); text-decoration: none;
    border: 0.0625rem solid var(--border);
}
/* Активный таб = тональная заливка (не underline, не акцентная кромка). */
.vtabs-i--on { background: var(--bg-elevated); color: var(--text-primary); border-color: var(--bg-elevated); }
.wk-nav { display: flex; align-items: center; gap: 0.5rem; margin-bottom: var(--space-md); }
.wk-scroll { overflow-x: auto; }
.wk-grid { border-collapse: collapse; width: 100%; min-width: 48rem; }
.wk-grid th, .wk-grid td { border: 0.0625rem solid var(--border); padding: 0.25rem 0.35rem; vertical-align: top; }
.wk-grid thead th {
    font-family: var(--font-mono); font-size: var(--micro-size);
    color: var(--text-muted); text-align: center; font-weight: 400;
}
.wk-taskcol { min-width: 12rem; text-align: left; }
.wk-daylink { color: inherit; text-decoration: none; display: block; }
.wk-daylink b { font-weight: 400; color: var(--text-primary); }
.wk-phrow td {
    background: var(--bg-surface);
    font-family: var(--font-mono); font-size: var(--micro-size);
    color: var(--text-secondary);
}
.wk-task {
    max-width: 16rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: var(--fs-xs);
}
.wk-cell { min-width: 6.5rem; }
/* Выходной (app_settings schedule_day_off) — дим; сегодня — тон primary. */
.wk-off { background: color-mix(in srgb, var(--bg-surface) 55%, transparent); opacity: 0.55; }
.wk-today { background: color-mix(in srgb, var(--primary) 10%, transparent); }
/* Скоуплено под schedule (task-044): без скоупа это flex-правило выигрывало
   и на /weekly-report, где .wk-form обязан быть grid (см. «Form» кластер +
   медиа ≥40em выше). Разметку не трогал: ячейка уже внутри table.wk-grid. */
.wk-grid .wk-form { display: flex; flex-direction: column; gap: 0.2rem; margin: 0; }
.wk-note, .wk-workers {
    padding: 0.15rem 0.25rem;
    font: inherit; font-size: var(--fs-xs);
    color: var(--text-primary); background: transparent;
    border: 0.0625rem solid transparent;
}
.wk-note::placeholder { color: var(--text-muted); opacity: 0.6; }
.wk-foot { display: flex; align-items: center; gap: 0.25rem; }
/* Факт из отчётов под планом дня (daily_facts). Моно-«✓» + текст модели,
   прирост процента жирным. Не редактируется — это свидетельство, не план. */
.wk-fact {
    margin-top: 0.25rem; padding: 0.15rem 0.25rem;
    font-size: var(--fs-xs); line-height: 1.3; color: var(--text-secondary);
    border-top: 0.0625rem dashed var(--border);
}
.wk-fact b, .wk-fact-cell b { font-weight: 600; color: var(--text-primary); font-family: var(--font-mono); }
.wk-fact-cell { font-size: var(--fs-xs); color: var(--text-secondary); max-width: 22rem; }
.wk-save, .wk-del {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 1.5rem; min-height: 1.5rem; padding: 0 0.2rem;
    background: transparent; border: 0.0625rem solid var(--border);
    color: var(--text-secondary); cursor: pointer; font-size: var(--micro-size);
}
.wk-notetext { font-size: var(--fs-xs); }
/* Явка: ожидались / отчитались / не вышли. */
.att { margin-top: var(--space-md); border-top: 0.0625rem solid var(--border); padding-top: var(--space-md); }
.att-h {
    font-family: var(--font-mono); font-size: var(--fs-xs); letter-spacing: 0;
    color: var(--text-secondary); margin-bottom: 0.5rem;
}
.att-cols { display: flex; flex-wrap: wrap; gap: var(--space-md); }
.att-col { flex: 1 1 10rem; display: flex; flex-direction: column; gap: 0.2rem; }
.att-cap { font-family: var(--font-mono); font-size: var(--micro-size); color: var(--text-muted); }
.att-cap--miss { color: var(--secondary); }
/* ── Рядок «додати задачу» в графіку ──────────────────────────────────────
   Було: об'єкт першим на 2fr, назва задачі на 8.5rem, дві дати без підписів і
   кнопка-квадрат на 9.5rem (виміряно 21.09.2026: 1353 px ряд, кнопка 150 px,
   плейсхолдер дати обрізаний до «dd/mm,▤»). Пропорції перевернуті: головне
   поле найвужче, другорядне найширше.
   Стало: назва задачі веде ряд, дати отримують свої підписи, кнопка займає
   рівно стільки, скільки треба словом. Підпис-колонка — той самий мікро-стиль,
   що в шапці таблиці (`.sch-ghead`), щоб ряд читався як її продовження. */
.sch-field { display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; }
@media (max-width: 40em) {
    .bc-row button { grid-column: span 1; }
}
@media (min-width: 68.8125em) {
    .nav-back { order: -1; margin-inline-end: var(--space-xs); }
}
@media (min-width: 48em) {
    .wizard-panel, #cl-form { max-width: 40rem; margin-inline: auto; }
}
input[type="file"]::file-selector-button { background: var(--text-primary); color: var(--bg-base); border: 0; font-family: var(--font-sans); padding: 0.5rem 0.75rem; }
.gantt-rule::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 0.75rem;
  border-top: 0.0625rem solid var(--text-primary);
  background-image:
    repeating-linear-gradient(90deg, var(--text-primary) 0 0.0625rem, transparent 0.0625rem calc(100% / var(--days) * 7)),
    repeating-linear-gradient(90deg, var(--text-muted) 0 0.0625rem, transparent 0.0625rem calc(100% / var(--days)));
  background-size: 100% 100%, 100% 50%; background-repeat: no-repeat; }
.gantt2[style*="--today"] .bar--gantt::after, .gantt2[style*="--today"] .gph-track::after, .gantt2[style*="--today"] .gantt-rule::after {
  content: ""; position: absolute; top: -0.2rem; bottom: -0.2rem; width: 0.125rem; margin-left: -0.0625rem;
  left: calc(var(--today) * 1%); background: var(--hazard-text, var(--primary)); pointer-events: none; }
.gantt2[style*="--today"] .gantt-rule::after { top: 0; bottom: auto; height: 1rem; }
.gph-bar::before, .gph-bar::after { background: var(--primary); opacity: 1; }
/* Кольори за статусом, а не «все чорне» (Ярослава 25.09.2026: «в Ганте график
   в чёрном цвете»): план — сірий, у роботі — помаранчевий, зроблено —
   зелений, прострочено — сигнальний. Виконана частка (bar-prog) темніша за
   свій колір, читається на обох темах. */
.bar--gantt .bar-fill[data-status="pending"] { --bar-color: var(--text-muted); }
.bar--gantt .bar-fill[data-status="in_progress"] { --bar-color: var(--primary); }
.bar--gantt .bar-fill[data-status="completed"] { --bar-color: var(--success); }
.bar--gantt .bar-fill[data-status="delayed"],
.bar--gantt .bar-fill[data-status="overdue"] { --bar-color: var(--hazard-text, var(--secondary)); }
.bar--gantt .bar-prog { background: color-mix(in srgb, var(--bar-color, var(--primary)) 70%, var(--black)); }
@media (min-width: 48em) {
    /* Планшет (48em+): форма додавання в три рідкі колонки, таблиця задач
       зі своїми 48rem мінімуму прокручується всередині .sch-grid, а не тягне
       сторінку. Фіксовані треки таблиці лише з 64em, де вони влазять. */
    /* `.sch-toolbar` у селекторі: форма теж .sch-erow, і правило таблиці
           нижче в цьому ж блоці інакше перебивало її треки (спіймано на 768). */
    .sch-toolbar .sch-erow--add { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem 0.75rem; align-items: end; }
    .sch-erow--add > .sch-field--task,
    .pp-wide { grid-column: 1 / -1; }
    .sch-erow--add > .sch-erow-act { grid-column: auto; align-self: end; justify-content: flex-end; }
}
.imp-hints b { color: var(--text-primary); font-family: var(--font-mono); margin-right: 0.375rem; }
@keyframes imp-slide { 0% { transform: translateX(-100%); } 100% { transform: translateX(250%); } }
/* ══ Форми графіка: mobile-first за Фрейном (RWD гл.3, 5, 10), 25.09.2026 ══
   База — найвужчий екран: дві колонки minmax(0,1fr) (bare `1fr` =
   minmax(auto,1fr), і поле дати на iOS розпирало сітку), поля 100 % ширини з
   min-width:0, підписи зверху. Далі лише `min-width`: від 48em рядок стає
   таблицею з фіксованими треками, підписи-колонки ховаються в шапку. */
.sch-erow--add {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 0.5rem;
    align-items: start;
    min-width: 0;
    padding: 0.5rem 0.25rem 0.6rem;
}
.sch-erow .sch-in { min-width: 0; max-width: 100%; width: 100%; box-sizing: border-box; height: var(--tap-target); min-height: var(--tap-target); }
.sch-erow--add input[type="date"].sch-in { -webkit-appearance: none; appearance: none; }
.sch-toolbar { align-items: stretch; }
@media (min-width: 48em) {
    /* Вісім комірок ряду (задача, дати, статус, %, години, етап, дії) і в
           планшетному кроці: базове правило мало шість треків, шапка переносилась. */
    .sch-erow { grid-template-columns: minmax(9rem, 2fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) minmax(7rem, 1fr) 3.5rem 4rem minmax(6.5rem, 1fr) minmax(7rem, 1fr) minmax(7rem, 1fr) var(--sch-act-w); min-width: 73rem; }
    /* Форма додавання теж .sch-erow, але живе поза таблицею: без її мінімуму. */
    .sch-erow--add { min-width: 0; }
    .sch-toolbar { align-items: flex-end; }
}
@media (min-width: 80em) {
    /* Один ряд на всю ширину лише від 1280: на 1024 поле дати вужче 8.5rem
           обрізало «dd/mm/yyyy». Треки частками (Фрейн), від 1280 до 2560
           таблиця росте разом з екраном без прокрутки. */
    .sch-erow { grid-template-columns: minmax(9rem, 2fr) minmax(8rem, 1fr) minmax(8rem, 1fr) minmax(6.5rem, 1fr) 3.5rem 4rem minmax(6rem, 1.2fr) minmax(6rem, 1fr) minmax(6.5rem, 1fr) var(--sch-act-w); min-width: 0; }
    .sch-toolbar .sch-erow--add { grid-template-columns: minmax(10rem, 2fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) minmax(7rem, 1.2fr) 4.5rem max-content; }
}
@keyframes sch-scroll-hint { from { opacity: 1; } to { opacity: 0; } }
@media (max-width: 47.99em) {
    /* Вузько: підпис лише кожному третьому місяцю, риски лишаються. */
    .gph-mon:not(:nth-child(3n+1)) { font-size: 0; padding: 0; height: 0.4rem; }
}
/* ── Газета фірми /gazette (26.09.2026, зразок: друкований ранковий випуск
   newspaper.karenx.com). Папір і чорнило — токени сторінки: темна тема
   за замовчуванням (як tokens.css), світла через prefers-color-scheme.
   Mobile-first за Френом: одна колонка; текст статей розкладає `columns`
   за ШИРИНОЮ колонки (без брейкпоінтів), сітка — лише min-width кроками. */
@font-face { font-family: 'Playfair Display'; font-style: normal; font-weight: 400 900; font-display: swap; src: url('/fonts/PlayfairDisplay-Var.woff2?v=1') format('woff2'); }
@font-face { font-family: 'UnifrakturMaguntia'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/UnifrakturMaguntia.woff2?v=1') format('woff2'); }
@font-face { font-family: 'PT Serif'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/PTSerif-Regular.woff2?v=1') format('woff2'); }
@font-face { font-family: 'PT Serif'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/PTSerif-Bold.woff2?v=1') format('woff2'); }
@font-face { font-family: 'PT Serif'; font-style: italic; font-weight: 400; font-display: swap; src: url('/fonts/PTSerif-Italic.woff2?v=1') format('woff2'); }
.gph-scale::before { top: 0; border-top: 0.0625rem solid var(--text-muted); }
form[data-autosave].is-failed .sch-in { border-color: var(--late, #b3261e); }
/* 29.09 (Артём, скрин «почему тут 3 разных размера»): у полів графіка були три
   різні джерела висоти. Дата брала primitives `input[type=date]` (0,1,1: sans,
   fs-md, min-height 2.75rem) поверх `.sch-in` (0,1,0), select — рідний вигляд
   браузера, кнопка — `.btn-sm`. Одна висота на ряд: `--tap-target`,
   специфічність (0,2,1) перебиває primitives. */
input[type].sch-in, select.sch-in, input.sch-in {
    height: var(--tap-target); min-height: var(--tap-target); box-sizing: border-box;
    padding: 0 0.5rem; font-family: var(--font-mono); font-size: var(--fs-xs);
    border-width: 0.0625rem; line-height: 1;
}
select.sch-in { -webkit-appearance: none; appearance: none; padding-right: 1.5rem; max-width: none;
    background-image: url("data:image/svg+xml,%3Csvg width='8' height='5' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0l4 5 4-5z' fill='%2378716c'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 0.5rem center; }
.sug-name { font-size: var(--fs-sm); color: var(--text-primary); overflow-wrap: anywhere; }
/* 29.09 рамка етапу (Ярослава: задача не виходить за строки етапу). Етап — перше поле
   форми додавання, об'єкт = фільтр сторінки (селект лише на «усіх об'єктах»).
   Позначки — звичайний текст рядком, без кромок, крапок і бейджів-кольорів. */
.sch-erow--add > .sch-field--phase { grid-column: 1 / -1; }
.sch-erow--add > .sch-field--task { grid-column: 1 / -1; }
.sch-erow--add > .sch-field--site { grid-column: 1 / -1; }
@media (min-width: 48em) {
    .sch-tools { justify-content: flex-end; }
}
@media (min-width: 80em) {
    .sch-toolbar .sch-erow--add.sch-erow--add-site { grid-template-columns: minmax(10rem, 1.6fr) minmax(12rem, 2fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) 4.5rem minmax(8rem, 1fr) max-content; }
    /* Порядок рядка: [об'єкт] етап [початок/кінець етапу] задача початок кінець години кнопка. */
    .sch-toolbar .sch-erow--add.sch-erow--add-site { grid-template-columns: minmax(8rem, 1fr) minmax(10rem, 1.6fr) minmax(12rem, 2fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) 4.5rem max-content; }
    .sch-toolbar .sch-erow--add.sch-erow--newph { grid-template-columns: minmax(10rem, 1.6fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) minmax(12rem, 2fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) 4.5rem max-content; }
    .sch-toolbar .sch-erow--add.sch-erow--add-site.sch-erow--newph { grid-template-columns: minmax(8rem, 1fr) minmax(10rem, 1.6fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) minmax(12rem, 2fr) minmax(8.5rem, 1fr) minmax(8.5rem, 1fr) 4.5rem max-content; }
}
.ph-undo > .chip { min-height: var(--tap-target); box-sizing: border-box; }
.sch-tools .imp-open { width: 100%; justify-content: center; box-sizing: border-box; background: transparent; color: var(--text-primary); border: 0.0625rem solid var(--border); }
.sch-child .sch-in { width: 100%; min-width: 0; box-sizing: border-box; height: var(--tap-target); min-height: var(--tap-target); }
.sch-child input[type="date"].sch-in { -webkit-appearance: none; appearance: none; }
.sch-child-act > .sch-add-btn { flex: 1 1 auto; width: auto; }
@media (min-width: 48em) {
    .sch-child > .sch-child-cap, .sch-child > .sch-frame-hint { flex: 1 0 100%; }
    .sch-child > .sch-field--site { flex: 1 1 10rem; }
    .sch-child > .sch-field { flex: 1 1 8.5rem; }
    .sch-child > .sch-field--hours { flex: 0 0 5rem; }
    .sch-child > .sch-field--task { flex: 2 1 14rem; }
    .sch-child > .sch-child-act { flex: 0 0 auto; }
}
.sch-tools .imp-open:hover, .sch-tools .imp-open:focus-visible { border-color: var(--text-primary); color: var(--text-primary); }
/* p13: у діях рядка з'явився «+ подзадача» — колонка дій ширша на одну кнопку. */
.sch-erow { --sch-act-w: 14.5rem; }
/* ── p14 (30.09): графік — таблиця, в якій одразу пишеш ─────────────────────────
   Етап — група: заголовок з назвою й строками (правляться на місці), підсумок, «⋯».
   Рядки задач — одна сітка колонок з шапкою; останній рядок етапу — «новая задача».
   Від 79em (було 76em) — таблиця, нижче — картки (поля два в ряд, назва на всю ширину). Таблиці треба ~70.5rem
   (сума мінімумів колонок 64.75rem + проміжки 4rem + ручка 1.75rem) плюс поля сторінки ≈ 75.25em, тож перехід
   там, де ламається вміст (Фрейн), а не на 64em: на 64em сторінка виходила на 72.4em, ширша за вікно. */
/* MEP 16.10: колонка часов стала тройкой «дни · план · факт» (+6rem), назва, місце й виконавець віддали по 1rem;
   таблиці тепер ~73.5rem + поля сторінки ≈ 78.25em — перехід на картки з 79em (1280 px = 80em ще таблиця). */
.sch2 { --sch2-cols: minmax(9.25rem, 2.4fr) 9rem 9rem minmax(7.5rem, 1fr) 3.75rem 10.5rem minmax(6rem, 1fr) minmax(7rem, 1.1fr) 5.75rem; display: flex; flex-direction: column; }
.sch2-hrs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.25rem; min-width: 0; }
.sch2-head, .sch2-row { display: grid; grid-template-columns: var(--sch2-cols); gap: 0.5rem; align-items: center; }
.sch2-phhead .dt { flex: 0 0 9.5rem; }
input.sch2-phname:hover, input.sch2-phname:focus { border-color: var(--border); background: var(--bg-base); }
.sch2-row--sub > input[name="task_name"] { margin-inline-start: 1.5rem; width: calc(100% - 1.5rem); }
.sch2-menu > summary { list-style: none; display: inline-flex; align-items: center; justify-content: center; width: var(--tap-target); height: var(--tap-target); border: 0.0625rem solid var(--border); cursor: pointer; font-weight: 700; }
.sch2-move .sch-in { flex: 1 1 auto; min-width: 0; }
.sch2-ask > summary { list-style: none; cursor: pointer; color: var(--invalid); }
.sch2-ask form { display: grid; gap: 0.4rem; margin: 0; }
.sch2-newph .dt { flex: 0 0 9.5rem; }
@media (max-width: 78.99em) {
    .sch2-row--sub > input[name="task_name"] { margin-inline-start: 0; width: 100%; }
    .sch2-phhead .dt, .sch2-newph .dt { flex: 1 1 8.5rem; }
    .sch2-m-title b { font-family: var(--font-display); font-size: var(--fs-md); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1 1 6rem; }
    .sch2-m-title .sph-deadline { flex: 0 0 auto; }
    .sch2-m-move .sch-in { flex: 1 1 auto; min-width: 0; }
    .sch2-m--sub > .sch2-m-sum { padding-inline-start: 1rem; }
    .sch2 input.sch-in, .sch2 select.sch-in { height: 2.75rem; min-height: 2.75rem; font-size: var(--fs-md); }
    .sch2-menu > summary { width: 2.75rem; height: 2.75rem; border: 0; }
    .sch2-unit:has(> .sch-grip--m) .sch2-m-sum { padding-inline-start: 2.5rem; }
}
.sch2-kpi b { font-family: var(--font-display); font-size: var(--fs-lg); color: var(--text-primary); }
.sch-grip:active { cursor: grabbing; }
@media (min-width: 79em) {
    .sch2 .sch2-row, .sch2 .sch2-head { position: relative; padding-inline-start: 1.75rem; }
}
@media (max-width: 78.99em) {
    .sch2-unit--sub:has(> .sch-grip--m) .sch2-m-sum { padding-inline-start: 3.5rem; }
}
@media (min-width: 64em) {
    .sch2-addd > summary { list-style: none; display: inline-flex; align-items: center; gap: 0.4rem; min-height: var(--tap-target); padding: 0 0.5rem; cursor: pointer; color: var(--text-secondary); font-weight: 600; }
    .sch2-addd > summary:hover, .sch2-addd > summary:focus-visible { color: var(--text-primary); }
    .sch2-addd > .sch2-row { border-bottom: 0; }
}
/* MEP п.2 (Ярослава 16.10, 20.10): пункты этапа сворачиваются. Сводка — строка под полосой этапа, без рамок
   и цветных кромок; состояние словом («Свернуть» / «Показать: N»), стрелка лишь повторяет его. Mobile-first. */
.sch2-fold > .sch2-fold-sum { list-style: none; display: flex; align-items: center; gap: 0.4rem; min-height: var(--tap-target); padding: 0 0.25rem; cursor: pointer; color: var(--text-secondary); font-size: var(--fs-xs); font-weight: 600; user-select: none; -webkit-user-select: none; touch-action: manipulation; }
.sch2-fold > .sch2-fold-sum::-webkit-details-marker { display: none; }
.sch2-fold > .sch2-fold-sum::before { content: "▸"; display: inline-block; transition: transform 0.15s ease; }
.sch2-fold[open] > .sch2-fold-sum::before { transform: rotate(90deg); }
.sch2-fold[open] > .sch2-fold-sum .sch2-fold-show,
.sch2-fold:not([open]) > .sch2-fold-sum .sch2-fold-hide { display: none; }
.sch2-fold > .sch2-fold-sum:hover, .sch2-fold > .sch2-fold-sum:focus-visible { color: var(--text-primary); }
.sch-drag-phases .sch2-fold-sum { display: none; }
@media (prefers-reduced-motion: reduce) { .sch2-fold > .sch2-fold-sum::before { transition: none; } }
@media (min-width: 64em) { .sch2-fold > .sch2-fold-sum { min-height: 2rem; } }
