/* Общее между компонентами: селекторы разных тем с одним телом. */
.fm-qsheet.is-open .fm-qsheet-panel,
.imp-toggle:checked ~ .imp-sheet,
#fm-board.is-open { transform: translateY(0); }
/* Kill native <input type=search> chrome (скруглённый бокс + синий × = чужеродно
   острому стилю). + селект и поиск в один ряд без переливов. */
.fm-search-field input::-webkit-search-decoration,
.fm-search-field input::-webkit-search-cancel-button,
.fm-search-field input::-webkit-search-results-button,
.fm-search-field input::-webkit-search-results-decoration,
.lf-search-input::-webkit-search-decoration,
.lf-search-input::-webkit-search-cancel-button,
.lf-search-input::-webkit-search-results-button,
.lf-search-input::-webkit-search-results-decoration { -webkit-appearance: none; display: none; }
.fm-board-btn-danger:hover,
.fb-chip.is-err { color: var(--secondary); border-color: var(--secondary); }
/* Keep the status dot on the first text line when the name wraps. */
.fm-board-card-edit,
.tl-task > .dot { margin-top: 0.375rem; }
/* Flash the message you jumped to from a "↳ reply" reference. */
.fm-voice:focus-visible,
.comment:target,
.fm-chip:focus-visible,
.tk-msg:target .tk-bubble,
.pp-fact > summary:focus-visible { outline: 0.125rem solid var(--primary); outline-offset: 0.125rem; }
.nav-link.active .icon,
.fm-qsheet.is-open .fm-qsheet-backdrop,
.fm-sitebar-stat.is-alert .fm-sitebar-stat-icon,
.htmx-request .htmx-indicator,
.htmx-request.htmx-indicator,
.tk-msg:hover .tk-reply,
.tk-reply:focus-visible,
.fm-send.is-sent .fm-send-check,
.lf-tabs.seg-toggle input:checked + label .lf-n,
.dreg-shot:hover .dreg-shot-del,
.dreg-shot:focus-within .dreg-shot-del { opacity: 1; }
.wizard-header,
.rr-queue {
    margin-bottom: var(--space-xl);
}
.wizard-btn:active,
form[data-autosave].is-saving { opacity: 0.8; }
.wizard-photo:hover,
.sc-tool:hover { border-color: var(--primary); color: var(--text-primary); }
/* Project task-completion progress (project overview header). Emerald bar, sharp
   corners, mono label — house style. Separate from the Gantt phase %. */
/* ── Розбір списку (parseIntake): машина читає аркуш ─────────────────────
   Скан-бар індетермінований НАВМИСНО (розбір фото 20-60с, прогрес ніхто не
   знає) — чесний датум лише лічильник секунд. Сегмент рухає ЛИШЕ transform,
   без ширини й градієнтних зупинок, на house-easing (motion.css). */
/* 29.09: друге джерело завантаження «З сервера клієнта» (documents, анкета). Рядки
   списку — кнопки на всю ширину: назва, під нею папка/дата/розмір, праворуч дія. */
.wizard-note-row,
.po-progress,
.ik-wait,
.dsrv {
    margin-top: var(--space-sm);
}
.wizard-actions--stacked .wizard-value-row,
.lf-fold[open] > .lf-fold-sum,
.rq-q:has(+ .rq-q-stage) { margin-bottom: var(--space-sm); }
@media (hover: hover) {
    .gallery-item:hover .gallery-overlay,
    .site-tile:hover .site-tile-edit,
    .pp-bar:hover .pp-hl::after,
    .pp-bar:hover .pp-hr::after {
        opacity: 1;
    }
}
.gal-day .rl-day,
.ac-row:first-child,
.tk-compose-bar .resp-photo,
.estimate-stage-meta + .estimate-stage-assign { margin-top: 0; }
/* Кнопка «Додати фото» над сіткою: у рядок, на вузькому екрані переноситься. */
.gal-upload { display: flex; flex-wrap: wrap; gap: var(--space-sm); align-items: center; margin-bottom: var(--space-md); }
.comment-header,
.rule-header {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.25rem;
}
.comment-user:hover,
.td-site a:hover,
.rq-name a:hover,
.pp-fact > summary:hover .pp-fact-a,
.pp-fact > summary:focus-visible .pp-fact-a { text-decoration: underline; }
.toast.toast-error::after,
.gantt-tasks .bar-fill[data-status="overdue"] { background: var(--secondary); }
/* Комірка сітки .tsk-bar--2col — нижній відступ дає сам грід-контейнер,
   інакше два чіпи тягнуть різну висоту рядка. */
body:has(.ac-chat) .header,
.ac-media:last-child,
.inspector-action,
.tsk-bar--2col > .tsk-filter { margin-bottom: 0; }
.dm-send-btn:active,
.tk-act:active { transform:translateY(0.0625rem); }
.chat-msg:hover .chat-msg-replybtn,
.chat-msg-replybtn:focus-visible,
.fm-tab.active,
.fm-tab:hover,
.util-link:hover svg,
.util-link:focus-visible svg,
.channel-row .ch input[type="checkbox"]:checked + span,
.row-item:hover .row-idx,
.ac-row--me .ac-who,
.ac-tick.is-read,
.chat-orig summary,
.chat-typing span,
.dm-avatar--asst,
.tk-reply:hover,
.fm-bell-btn.is-unread,
.po-site-address:hover,
.tsk-search:focus-within .tsk-search-ic,
.rl-tally--warn .n,
.tsk-bar .btn-primary.mx-fill:hover,
.tsk-bar .btn-primary.mx-fill:focus-visible,
.tsk-bar .btn-primary.mx-fill.is-pressed,
.tsk-supply[open] > summary .lf-fold-lbl,
.fm-board-card-link:hover,
.syn-click.is-srv .syn-kind,
.pp-box[open] > .pp-box-sum { color: var(--primary); }
.chat-attach:hover { color: var(--primary); border-color: var(--primary); }
/* Optimistic-статусы */
/* Выключенный пункт приглушён, но остаётся читаемым — его включают одним
   кликом, а не ищут в архиве. */
.chat-msg--pending,
.cle-row--off .cle-text,
.cle-row--off .cle-flags,
.gantt-tasks .bar-fill[data-status="accepted"],
.site-tile--empty .folder-art,
.syn-row.is-off { opacity: 0.55; }
.chat-msg--pending.is-failed { opacity: 1; border-color: var(--secondary); cursor: pointer; }
.notes-thread .chat-msg-text,
.np-item,
.np-table td,
.table-cards td.doc-name .link,
.pp-table td { overflow-wrap: anywhere; }
/* Автозбереження назви плану: ✓ зеленим, помилка червоною рамкою (28.09). */
/* Автозбереження рядка (data-autosave): ✓ зеленим, помилка — червона рамка (28.09). */
.pr-mark-done,
.btn-inline--ok,
.kpi-mini-val.ok,
.fm-send.is-sent .fm-send-label,
.fm-send.is-delivered .fm-send-label,
.rl-tally--ok .n,
.estimate-folder-item--done .estimate-folder-count,
.doc-folder-card--done .doc-folder-card-count,
.pl-rename.is-saved button[type=submit],
.syn-last.is-ok,
form[data-autosave].is-saved button[type=submit] { color: var(--success); }
.pr-mark-partial { color: var(--warning); }
.pr-mark-miss { color: var(--secondary); }
.pr-src { font-family: var(--font-mono); font-size: var(--micro-size); letter-spacing: 0; color: var(--text-muted); border: 0.0625rem solid var(--border); padding: 0 0.25rem; }
.pr-label { font-size: var(--fs-sm); overflow-wrap: anywhere; }
.pr-note { font-size: var(--fs-xs); color: var(--text-secondary); font-style: italic; width: 100%; }
.pr-ai { font-size: var(--micro-size, 0.75rem); font-weight: 400; color: var(--text-muted); font-family: var(--font-mono); }
.po-progress-bar { height: 0.4rem; background: var(--bg-surface); border: 0.0625rem solid var(--border); margin: 0.25rem 0 0.15rem; }
.tk-send:hover,
.tk-send.is-quick,
.upload-zone.dragover,
.pf-addmore:hover,
.rl-more:hover,
.tb-move:hover { border-color: var(--primary); color: var(--primary); }
.tk-rework-toggle.is-cancel { color: var(--text-muted); border-color: var(--border); }
.tk-send--rework:hover { border-color: var(--warning); color: var(--warning); }
/* Reason required but empty → highlight the field the user must fill. */
.form-control.rework-focus,
.form-control.needs-reason {
    border-color: var(--warning);
    box-shadow: 0 0 0 0.0625rem var(--warning);
}
/* §1 — Response: tappable list cards depress on press-down (not on release),
   so the finger gets instant physical feedback instead of a dead surface.
   Ancestor-:active means a press anywhere inside the card counts. */
.rework-card,
.assignment-card,
.site-card,
.note-card,
.complaint-card-mini,
.fm-qsheet-item {
  transition: transform var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.rework-card:active,
.assignment-card:active,
.site-card:active,
.note-card:active,
.complaint-card-mini:active,
.fm-qsheet-item:active {
  transform: scale(0.985);
}
@media (prefers-reduced-motion: reduce) {
    .rework-card:active,
    .assignment-card:active,
    .site-card:active,
    .note-card:active,
    .complaint-card-mini:active,
    .fm-qsheet-item:active,
    .fm-tab:active,
    .ac-send:active { transform: none; }
}
